From f2b367f421a420ae5b15a4e10c170b2346561ac1 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Mon, 8 Sep 2025 09:09:42 -0500 Subject: [PATCH 001/766] [core-image/tga] implement Option.do_not_expand_grayscale --- core/image/tga/tga.odin | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/image/tga/tga.odin b/core/image/tga/tga.odin index 5fda803c5..c20201d6a 100644 --- a/core/image/tga/tga.odin +++ b/core/image/tga/tga.odin @@ -153,7 +153,7 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a // Intentionally blank case .Uncompressed_Black_White: black_white = true - dest_depth = 24 + dest_depth = 8 if .do_not_expand_grayscale in options else 24 case .Uncompressed_Color_Mapped: color_mapped = true case .Compressed_Color_Mapped: @@ -162,7 +162,7 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a case .Compressed_Black_White: black_white = true rle_encoding = true - dest_depth = 24 + dest_depth = 8 if .do_not_expand_grayscale in options else 24 case: return nil, .Unsupported_Format @@ -181,6 +181,9 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a } switch dest_depth { + case 8: // R8 + src_channels = 1 + dest_channels = 1 case 15: // B5G5R5 src_channels = 2 dest_channels = 3 From 4a8d84c1077a61a7d4967593b46a3aa4b3e8ef28 Mon Sep 17 00:00:00 2001 From: FourteenBrush <74827262+FourteenBrush@users.noreply.github.com> Date: Thu, 2 Oct 2025 00:04:24 +0200 Subject: [PATCH 002/766] Make `linux.IO_Vec.base` a multipointer --- core/sys/linux/types.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index c2948c36e..3883c6de2 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -932,7 +932,7 @@ RUsage :: struct { Struct used for IO operations */ IO_Vec :: struct { - base: rawptr, + base: [^]byte, len: uint, } From 7d9f915ff985786e6068ef62f98be2d00540262a Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:59:22 +0200 Subject: [PATCH 003/766] barriers, rawinput macros --- core/sys/windows/kernel32.odin | 10 ++++++++++ core/sys/windows/types.odin | 15 +++++++++++++++ core/sys/windows/user32.odin | 8 ++++++++ test.odin | 9 +++++++++ 4 files changed, 42 insertions(+) create mode 100644 test.odin diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index ff27cf795..9fb862815 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -213,6 +213,16 @@ foreign kernel32 { ) -> BOOL --- WaitForSingleObject :: proc(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD --- WaitForSingleObjectEx :: proc(hHandle: HANDLE, dwMilliseconds: DWORD, bAlterable: BOOL) -> DWORD --- + EnterSynchronizationBarrier :: proc( + lpBarrier: ^SYNCHRONIZATION_BARRIER, + dwFlags: SYNCHRONIZATION_BARRIER_FLAGS, + ) -> BOOL --- + InitializeSynchronizationBarrier :: proc( + lpBarrier: ^SYNCHRONIZATION_BARRIER, + lTotalThreads: LONG, + lSpinCount: LONG, + ) -> BOOL --- + DeleteSynchronizationBarrier :: proc(lpBarrier: ^SYNCHRONIZATION_BARRIER) -> BOOL --- Sleep :: proc(dwMilliseconds: DWORD) --- GetProcessId :: proc(handle: HANDLE) -> DWORD --- CopyFileW :: proc( diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 904970589..a838fa359 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -2991,6 +2991,21 @@ CRITICAL_SECTION :: struct { SpinCount: ULONG_PTR, } +SYNCHRONIZATION_BARRIER :: struct { + Reserved1: DWORD, + Reserved2: DWORD, + Reserved3: [2]ULONG_PTR, + Reserved4: DWORD, + Reserved5: DWORD, +} + +SYNCHRONIZATION_BARRIER_FLAG :: enum { + SPIN_ONLY = 0, + BLOCK_ONLY = 1, + NO_DELETE = 2, +} +SYNCHRONIZATION_BARRIER_FLAGS :: distinct bit_set[SYNCHRONIZATION_BARRIER_FLAG; DWORD] + REPARSE_MOUNTPOINT_DATA_BUFFER :: struct { ReparseTag: DWORD, ReparseDataLength: DWORD, diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 49ebb49cb..51cbde4ae 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -398,6 +398,14 @@ MAKEINTRESOURCEW :: #force_inline proc "contextless" (#any_int i: int) -> LPWSTR return cast(LPWSTR)uintptr(WORD(i)) } +RAWINPUT_ALIGN :: proc(x: uintptr) -> uintptr { + return (x + size_of(uintptr) - 1) & ~uintptr(size_of(uintptr) - 1) +} + +NEXTRAWINPUTBLOCK :: proc(ptr: ^RAWINPUT) -> ^RAWINPUT { + return cast(^RAWINPUT)RAWINPUT_ALIGN(uintptr(ptr) + uintptr(ptr.header.dwSize)) +} + Monitor_From_Flags :: enum DWORD { MONITOR_DEFAULTTONULL = 0x00000000, // Returns NULL MONITOR_DEFAULTTOPRIMARY = 0x00000001, // Returns a handle to the primary display monitor diff --git a/test.odin b/test.odin new file mode 100644 index 000000000..e0c1d9371 --- /dev/null +++ b/test.odin @@ -0,0 +1,9 @@ +package min_max_test + +import "core:fmt" + +main :: proc() { + a: f32 = max(1) + b: f32 = min(2) + fmt.println(a, b) +} \ No newline at end of file From ada70ca6255562e456064ab71b0f856e5eafd921 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Thu, 16 Oct 2025 16:06:53 +0200 Subject: [PATCH 004/766] remove accidental test file --- test.odin | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 test.odin diff --git a/test.odin b/test.odin deleted file mode 100644 index e0c1d9371..000000000 --- a/test.odin +++ /dev/null @@ -1,9 +0,0 @@ -package min_max_test - -import "core:fmt" - -main :: proc() { - a: f32 = max(1) - b: f32 = min(2) - fmt.println(a, b) -} \ No newline at end of file From f7ea85ccb2b7cb6cf8ec73e737a36397da645c3f Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Thu, 16 Oct 2025 16:08:08 +0200 Subject: [PATCH 005/766] forgot to use tabs, as always --- core/sys/windows/types.odin | 16 ++++++++-------- core/sys/windows/user32.odin | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index a838fa359..61e5d7820 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -2992,17 +2992,17 @@ CRITICAL_SECTION :: struct { } SYNCHRONIZATION_BARRIER :: struct { - Reserved1: DWORD, - Reserved2: DWORD, - Reserved3: [2]ULONG_PTR, - Reserved4: DWORD, - Reserved5: DWORD, + Reserved1: DWORD, + Reserved2: DWORD, + Reserved3: [2]ULONG_PTR, + Reserved4: DWORD, + Reserved5: DWORD, } SYNCHRONIZATION_BARRIER_FLAG :: enum { - SPIN_ONLY = 0, - BLOCK_ONLY = 1, - NO_DELETE = 2, + SPIN_ONLY = 0, + BLOCK_ONLY = 1, + NO_DELETE = 2, } SYNCHRONIZATION_BARRIER_FLAGS :: distinct bit_set[SYNCHRONIZATION_BARRIER_FLAG; DWORD] diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 51cbde4ae..4eb389f6b 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -399,11 +399,11 @@ MAKEINTRESOURCEW :: #force_inline proc "contextless" (#any_int i: int) -> LPWSTR } RAWINPUT_ALIGN :: proc(x: uintptr) -> uintptr { - return (x + size_of(uintptr) - 1) & ~uintptr(size_of(uintptr) - 1) + return (x + size_of(uintptr) - 1) & ~uintptr(size_of(uintptr) - 1) } NEXTRAWINPUTBLOCK :: proc(ptr: ^RAWINPUT) -> ^RAWINPUT { - return cast(^RAWINPUT)RAWINPUT_ALIGN(uintptr(ptr) + uintptr(ptr.header.dwSize)) + return cast(^RAWINPUT)RAWINPUT_ALIGN(uintptr(ptr) + uintptr(ptr.header.dwSize)) } Monitor_From_Flags :: enum DWORD { From 54caa6af008d2f8513bd7fca3aa0a8a5973070b4 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Sat, 18 Oct 2025 16:36:49 +0200 Subject: [PATCH 006/766] empty push to re-run CI From b3ef77e9dd93bd0c10fa543f67bc26fe1050cf75 Mon Sep 17 00:00:00 2001 From: Morgan Date: Mon, 1 Dec 2025 16:24:57 +0100 Subject: [PATCH 007/766] undetected type declaration cycles work-around --- src/types.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/types.cpp b/src/types.cpp index eb20b8edf..0db2fe8aa 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -4278,6 +4278,9 @@ gb_internal i64 *type_set_offsets_of(Slice const &fields, bool is_pack gb_internal bool type_set_offsets(Type *t) { t = base_type(t); if (t->kind == Type_Struct) { + if (t->Struct.are_offsets_being_processed.load()) { + return true + } MUTEX_GUARD(&t->Struct.offset_mutex); if (!t->Struct.are_offsets_set) { t->Struct.are_offsets_being_processed.store(true); From 555081240b9ed90f7ccb321a13d49dee9fb15532 Mon Sep 17 00:00:00 2001 From: Morgan Date: Mon, 1 Dec 2025 16:43:52 +0100 Subject: [PATCH 008/766] missed a semicolon --- src/types.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types.cpp b/src/types.cpp index 0db2fe8aa..18e3b56ac 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -4279,7 +4279,7 @@ gb_internal bool type_set_offsets(Type *t) { t = base_type(t); if (t->kind == Type_Struct) { if (t->Struct.are_offsets_being_processed.load()) { - return true + return true; } MUTEX_GUARD(&t->Struct.offset_mutex); if (!t->Struct.are_offsets_set) { From 7c7cc9cc251f1f4576df6039f45029e5a575ab66 Mon Sep 17 00:00:00 2001 From: dozn <16659513+dozn@users.noreply.github.com> Date: Mon, 1 Dec 2025 20:27:17 -0800 Subject: [PATCH 009/766] Change Return Type of `sdl2.GetWindowFlags` from `u32` to `WindowFlags` `bit_set` --- vendor/sdl2/sdl_video.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/sdl2/sdl_video.odin b/vendor/sdl2/sdl_video.odin index 809735414..8a98d79dc 100644 --- a/vendor/sdl2/sdl_video.odin +++ b/vendor/sdl2/sdl_video.odin @@ -237,7 +237,7 @@ foreign lib { CreateWindowFrom :: proc(data: rawptr) -> ^Window --- GetWindowID :: proc(window: ^Window) -> u32 --- GetWindowFromID :: proc(id: u32) -> ^Window --- - GetWindowFlags :: proc(window: ^Window) -> u32 --- + GetWindowFlags :: proc(window: ^Window) -> WindowFlags --- SetWindowTitle :: proc(window: ^Window, title: cstring) --- GetWindowTitle :: proc(window: ^Window) -> cstring --- SetWindowIcon :: proc(window: ^Window, icon: ^Surface) --- From 4b9e15786d8db44741cd6fd5c89a033e18548d66 Mon Sep 17 00:00:00 2001 From: IllusionMan1212 Date: Fri, 24 Oct 2025 00:49:33 +0200 Subject: [PATCH 010/766] encoding/json: custom json (un)marshalling --- core/encoding/json/marshal.odin | 49 +++++++++++++++---------- core/encoding/json/unmarshal.odin | 61 ++++++++++++++++++------------- 2 files changed, 66 insertions(+), 44 deletions(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index e563c326a..81884b71b 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -62,7 +62,10 @@ Marshal_Options :: struct { mjson_skipped_first_braces_end: bool, } -marshal :: proc(v: any, opt: Marshal_Options = {}, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Marshal_Error) { +User_Marshaller :: #type proc(w: io.Writer, v: any) +User_Marshaller_Map :: map[typeid]User_Marshaller + +marshal :: proc(v: any, opt: Marshal_Options = {}, user_marshallers: User_Marshaller_Map = nil, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Marshal_Error) { b := strings.builder_make(allocator, loc) defer if err != nil { strings.builder_destroy(&b) @@ -72,7 +75,7 @@ marshal :: proc(v: any, opt: Marshal_Options = {}, allocator := context.allocato runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = allocator == context.temp_allocator) opt := opt - marshal_to_builder(&b, v, &opt) or_return + marshal_to_builder(&b, v, &opt, user_marshallers) or_return if len(b.buf) != 0 { data = b.buf[:] @@ -81,16 +84,24 @@ marshal :: proc(v: any, opt: Marshal_Options = {}, allocator := context.allocato return data, nil } -marshal_to_builder :: proc(b: ^strings.Builder, v: any, opt: ^Marshal_Options) -> Marshal_Error { - return marshal_to_writer(strings.to_writer(b), v, opt) +marshal_to_builder :: proc(b: ^strings.Builder, v: any, opt: ^Marshal_Options, user_marshallers: User_Marshaller_Map = nil) -> Marshal_Error { + return marshal_to_writer(strings.to_writer(b), v, opt, user_marshallers) } -marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: Marshal_Error) { +marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_marshallers: User_Marshaller_Map = nil) -> (err: Marshal_Error) { if v == nil { io.write_string(w, "null") or_return return } + if user_marshallers != nil { + marshaller := user_marshallers[v.id] + if marshaller != nil { + marshaller(w, v) + return + } + } + ti := runtime.type_info_base(type_info_of(v.id)) a := any{v.data, ti.id} @@ -208,7 +219,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: for i in 0.. (err: opt_write_iteration(w, opt, i == 0) or_return opt_write_key(w, opt, enum_type.names[index]) or_return data := uintptr(v.data) + uintptr(i*info.elem_size) - marshal_to_writer(w, any{rawptr(data), info.elem.id}, opt) or_return + marshal_to_writer(w, any{rawptr(data), info.elem.id}, opt, user_marshallers) or_return } opt_write_end(w, opt, '}') or_return @@ -237,7 +248,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: for i in 0.. (err: for i in 0.. (err: } } - marshal_to_writer(w, any{value, info.value.id}, opt) or_return + marshal_to_writer(w, any{value, info.value.id}, opt, user_marshallers) or_return } } else { Entry :: struct { @@ -340,7 +351,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: for s, i in sorted { opt_write_iteration(w, opt, i == 0) or_return opt_write_key(w, opt, s.key) or_return - marshal_to_writer(w, s.value, opt) or_return + marshal_to_writer(w, s.value, opt, user_marshallers) or_return } } } @@ -384,7 +395,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: return false } - marshal_struct_fields :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: Marshal_Error) { + marshal_struct_fields :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_marshallers: User_Marshaller_Map) -> (err: Marshal_Error) { ti := runtime.type_info_base(type_info_of(v.id)) info := ti.variant.(runtime.Type_Info_Struct) first_iteration := true @@ -419,7 +430,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: } else { // Marshal the fields of 'using _: T' fields directly into the parent struct if info.usings[i] && name == "_" { - marshal_struct_fields(w, the_value, opt) or_return + marshal_struct_fields(w, the_value, opt, user_marshallers) or_return continue } else { opt_write_key(w, opt, name) or_return @@ -427,13 +438,13 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: } - marshal_to_writer(w, the_value, opt) or_return + marshal_to_writer(w, the_value, opt, user_marshallers) or_return } return } opt_write_start(w, opt, '{') or_return - marshal_struct_fields(w, v, opt) or_return + marshal_struct_fields(w, v, opt, user_marshallers) or_return opt_write_end(w, opt, '}') or_return case runtime.Type_Info_Union: @@ -466,17 +477,17 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: tag -= 1 } id := info.variants[tag].id - return marshal_to_writer(w, any{v.data, id}, opt) + return marshal_to_writer(w, any{v.data, id}, opt, user_marshallers) case runtime.Type_Info_Enum: if !opt.use_enum_names || len(info.names) == 0 { - return marshal_to_writer(w, any{v.data, info.base.id}, opt) + return marshal_to_writer(w, any{v.data, info.base.id}, opt, user_marshallers) } else { name, found := reflect.enum_name_from_value_any(v) if found { - return marshal_to_writer(w, name, opt) + return marshal_to_writer(w, name, opt, user_marshallers) } else { - return marshal_to_writer(w, any{v.data, info.base.id}, opt) + return marshal_to_writer(w, any{v.data, info.base.id}, opt, user_marshallers) } } diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 3cdc6429d..c1a2725a4 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -26,7 +26,10 @@ Unmarshal_Error :: union { Unsupported_Type_Error, } -unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { +User_Unmarshaller :: #type proc(p: ^Parser, v: any) +User_Unmarshaller_Map :: map[typeid]User_Unmarshaller + +unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map, allocator := context.allocator) -> Unmarshal_Error { v := v if v == nil || v.id == nil { return .Invalid_Parameter @@ -53,20 +56,20 @@ unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, alloc if p.spec == .MJSON { #partial switch p.curr_token.kind { case .Ident, .String: - return unmarshal_object(&p, data, .EOF) + return unmarshal_object(&p, data, .EOF, user_unmarshallers) } } - return unmarshal_value(&p, data) + return unmarshal_value(&p, data, user_unmarshallers) } -unmarshal :: proc(data: []byte, ptr: ^$T, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { - return unmarshal_any(data, ptr, spec, allocator) +unmarshal :: proc(data: []byte, ptr: ^$T, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map = nil, allocator := context.allocator) -> Unmarshal_Error { + return unmarshal_any(data, ptr, spec, user_unmarshallers, allocator) } -unmarshal_string :: proc(data: string, ptr: ^$T, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { - return unmarshal_any(transmute([]byte)data, ptr, spec, allocator) +unmarshal_string :: proc(data: string, ptr: ^$T, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map = nil, allocator := context.allocator) -> Unmarshal_Error { + return unmarshal_any(transmute([]byte)data, ptr, spec, user_unmarshallers, allocator) } @@ -267,10 +270,18 @@ unmarshal_string_token :: proc(p: ^Parser, val: any, token: Token, ti: ^reflect. @(private) -unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { +unmarshal_value :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { UNSUPPORTED_TYPE := Unsupported_Type_Error{v.id, p.curr_token} token := p.curr_token + if user_unmarshallers != nil { + unmarshaller := user_unmarshallers[v.id] + if unmarshaller != nil { + unmarshaller(p, v) + return + } + } + v := v ti := reflect.type_info_base(type_info_of(v.id)) if u, ok := ti.variant.(reflect.Type_Info_Union); ok && token.kind != .Null { @@ -287,7 +298,7 @@ unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { for variant, i in u.variants { variant_any := any{v.data, variant.id} variant_p := p^ - if err = unmarshal_value(&variant_p, variant_any); err == nil { + if err = unmarshal_value(&variant_p, variant_any, user_unmarshallers); err == nil { p^ = variant_p raw_tag := i @@ -363,10 +374,10 @@ unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { return UNSUPPORTED_TYPE case .Open_Brace: - return unmarshal_object(p, v, .Close_Brace) + return unmarshal_object(p, v, .Close_Brace, user_unmarshallers) case .Open_Bracket: - return unmarshal_array(p, v) + return unmarshal_array(p, v, user_unmarshallers) case: if p.spec != .JSON { @@ -423,7 +434,7 @@ json_name_from_tag_value :: proc(value: string) -> (json_name, extra: string) { @(private) -unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unmarshal_Error) { +unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { UNSUPPORTED_TYPE := Unsupported_Type_Error{v.id, p.curr_token} if end_token == .Close_Brace { @@ -522,7 +533,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm field_ptr := rawptr(uintptr(v.data) + offset) field := any{field_ptr, type.id} - unmarshal_value(p, field) or_return + unmarshal_value(p, field, user_unmarshallers) or_return if parse_comma(p) { break struct_loop @@ -564,7 +575,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm mem.zero_slice(elem_backing) - if uerr := unmarshal_value(p, map_backing_value); uerr != nil { + if uerr := unmarshal_value(p, map_backing_value, user_unmarshallers); uerr != nil { delete(key, p.allocator) return uerr } @@ -626,7 +637,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm index_ptr := rawptr(uintptr(v.data) + uintptr(index*t.elem_size)) index_any := any{index_ptr, t.elem.id} - unmarshal_value(p, index_any) or_return + unmarshal_value(p, index_any, user_unmarshallers) or_return if parse_comma(p) { break enumerated_array_loop @@ -662,8 +673,8 @@ unmarshal_count_array :: proc(p: ^Parser) -> (length: uintptr) { } @(private) -unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { - assign_array :: proc(p: ^Parser, base: rawptr, elem: ^reflect.Type_Info, length: uintptr) -> Unmarshal_Error { +unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { + assign_array :: proc(p: ^Parser, base: rawptr, elem: ^reflect.Type_Info, length: uintptr, user_unmarshallers: User_Unmarshaller_Map = nil) -> Unmarshal_Error { unmarshal_expect_token(p, .Open_Bracket) for idx: uintptr = 0; p.curr_token.kind != .Close_Bracket; idx += 1 { @@ -672,7 +683,7 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { elem_ptr := rawptr(uintptr(base) + idx*uintptr(elem.size)) elem := any{elem_ptr, elem.id} - unmarshal_value(p, elem) or_return + unmarshal_value(p, elem, user_unmarshallers) or_return if parse_comma(p) { break @@ -698,7 +709,7 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { raw.data = raw_data(data) raw.len = int(length) - return assign_array(p, raw.data, t.elem, length) + return assign_array(p, raw.data, t.elem, length, user_unmarshallers) case reflect.Type_Info_Dynamic_Array: raw := (^mem.Raw_Dynamic_Array)(v.data) @@ -708,7 +719,7 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { raw.cap = int(length) raw.allocator = p.allocator - return assign_array(p, raw.data, t.elem, length) + return assign_array(p, raw.data, t.elem, length, user_unmarshallers) case reflect.Type_Info_Array: // NOTE(bill): Allow lengths which are less than the dst array @@ -716,7 +727,7 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { return UNSUPPORTED_TYPE } - return assign_array(p, v.data, t.elem, length) + return assign_array(p, v.data, t.elem, length, user_unmarshallers) case reflect.Type_Info_Enumerated_Array: // NOTE(bill): Allow lengths which are less than the dst array @@ -724,7 +735,7 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { return UNSUPPORTED_TYPE } - return assign_array(p, v.data, t.elem, length) + return assign_array(p, v.data, t.elem, length, user_unmarshallers) case reflect.Type_Info_Complex: // NOTE(bill): Allow lengths which are less than the dst array @@ -733,9 +744,9 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { } switch ti.id { - case complex32: return assign_array(p, v.data, type_info_of(f16), 2) - case complex64: return assign_array(p, v.data, type_info_of(f32), 2) - case complex128: return assign_array(p, v.data, type_info_of(f64), 2) + case complex32: return assign_array(p, v.data, type_info_of(f16), 2, user_unmarshallers) + case complex64: return assign_array(p, v.data, type_info_of(f32), 2, user_unmarshallers) + case complex128: return assign_array(p, v.data, type_info_of(f64), 2, user_unmarshallers) } return UNSUPPORTED_TYPE From 72d65603eb513d6788a21f02bc211b662c6102e8 Mon Sep 17 00:00:00 2001 From: Hisham Aburaqibah Date: Thu, 6 Nov 2025 09:02:05 +0200 Subject: [PATCH 011/766] encoding/json: error handling for custom (un)marshallers --- core/encoding/json/marshal.odin | 4 ++-- core/encoding/json/unmarshal.odin | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index 81884b71b..58fbbd852 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -62,7 +62,7 @@ Marshal_Options :: struct { mjson_skipped_first_braces_end: bool, } -User_Marshaller :: #type proc(w: io.Writer, v: any) +User_Marshaller :: #type proc(w: io.Writer, v: any) -> Marshal_Error User_Marshaller_Map :: map[typeid]User_Marshaller marshal :: proc(v: any, opt: Marshal_Options = {}, user_marshallers: User_Marshaller_Map = nil, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Marshal_Error) { @@ -97,7 +97,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_mars if user_marshallers != nil { marshaller := user_marshallers[v.id] if marshaller != nil { - marshaller(w, v) + marshaller(w, v) or_return return } } diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index c1a2725a4..564b84842 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -26,7 +26,7 @@ Unmarshal_Error :: union { Unsupported_Type_Error, } -User_Unmarshaller :: #type proc(p: ^Parser, v: any) +User_Unmarshaller :: #type proc(p: ^Parser, v: any) -> Unmarshal_Error User_Unmarshaller_Map :: map[typeid]User_Unmarshaller unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map, allocator := context.allocator) -> Unmarshal_Error { @@ -277,7 +277,7 @@ unmarshal_value :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle if user_unmarshallers != nil { unmarshaller := user_unmarshallers[v.id] if unmarshaller != nil { - unmarshaller(p, v) + unmarshaller(p, v) or_return return } } From 739bffac0c2d9827c84f0a13c7d8c93a3ed5d742 Mon Sep 17 00:00:00 2001 From: RobinsAviary Date: Fri, 5 Dec 2025 15:16:45 -0500 Subject: [PATCH 012/766] Use multi-pointer so you can pass array --- vendor/sdl2/sdl_messagebox.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/sdl2/sdl_messagebox.odin b/vendor/sdl2/sdl_messagebox.odin index edd8422e0..5211affd8 100644 --- a/vendor/sdl2/sdl_messagebox.odin +++ b/vendor/sdl2/sdl_messagebox.odin @@ -66,7 +66,7 @@ MessageBoxData :: struct { message: cstring, /**< UTF-8 message text */ numbuttons: c.int, - buttons: ^MessageBoxButtonData, + buttons: [^]MessageBoxButtonData, colorScheme: ^MessageBoxColorScheme, /**< ::SDL_MessageBoxColorScheme, can be NULL to use system settings */ } From 67cc04b1dafc98090394c07264427720b3662c7d Mon Sep 17 00:00:00 2001 From: Tohei Ichikawa Date: Fri, 5 Dec 2025 17:20:15 -0500 Subject: [PATCH 013/766] Added more NSApplication and NSWindow bindings --- core/sys/darwin/Foundation/NSApplication.odin | 34 +++++++++++++++++++ core/sys/darwin/Foundation/NSWindow.odin | 24 +++++++++++++ 2 files changed, 58 insertions(+) diff --git a/core/sys/darwin/Foundation/NSApplication.odin b/core/sys/darwin/Foundation/NSApplication.odin index 6cb3df979..2295e46b8 100644 --- a/core/sys/darwin/Foundation/NSApplication.odin +++ b/core/sys/darwin/Foundation/NSApplication.odin @@ -92,6 +92,11 @@ Application_activate :: proc "c" (self: ^Application) { msgSend(nil, self, "activate") } +@(objc_type=Application, objc_name="active") +Application_active :: proc "c" (self: ^Application) -> BOOL { + return msgSend(BOOL, self, "isActive") +} + @(objc_type=Application, objc_name="setTitle") Application_setTitle :: proc "c" (self: ^Application, title: ^String) { msgSend(nil, self, "setTitle", title) @@ -107,6 +112,35 @@ Application_setMainMenu :: proc "c" (self: ^Application, menu: ^Menu) { msgSend(nil, self, "setMainMenu:", menu) } +// This property is actually not exposed in AppKit's public API. +// But there is basically no other way to configure the apple menu without using NIB files. +// Therefore, an Odin binding for this non-public API was created. +// Note: SDL also calls this non-public method. +@(objc_type=Application, objc_name="setAppleMenu") +Application_setAppleMenu :: proc "c" (self: ^Application, menu: ^Menu) { + msgSend(nil, self, "setAppleMenu:", menu) +} + +@(objc_type=Application, objc_name="servicesMenu") +Application_servicesMenu :: proc "c" (self: ^Application) -> ^Menu { + return msgSend(^Menu, self, "servicesMenu") +} + +@(objc_type=Application, objc_name="setServicesMenu") +Application_setServicesMenu :: proc "c" (self: ^Application, menu: ^Menu) { + msgSend(nil, self, "setServicesMenu:", menu) +} + +@(objc_type=Application, objc_name="windowsMenu") +Application_windowsMenu :: proc "c" (self: ^Application) -> ^Menu { + return msgSend(^Menu, self, "windowsMenu") +} + +@(objc_type=Application, objc_name="setWindowsMenu") +Application_setWindowsMenu :: proc "c" (self: ^Application, menu: ^Menu) { + msgSend(nil, self, "setWindowsMenu:", menu) +} + @(objc_type=Application, objc_name="mainWindow") Application_mainWindow :: proc "c" (self: ^Application) -> ^Window { return msgSend(^Window, self, "mainWindow") diff --git a/core/sys/darwin/Foundation/NSWindow.odin b/core/sys/darwin/Foundation/NSWindow.odin index 244d25001..8317c7bb1 100644 --- a/core/sys/darwin/Foundation/NSWindow.odin +++ b/core/sys/darwin/Foundation/NSWindow.odin @@ -643,6 +643,14 @@ Layer_setContentsScale :: proc "c" (self: ^Layer, scale: Float) { Layer_frame :: proc "c" (self: ^Layer) -> Rect { return msgSend(Rect, self, "frame") } +@(objc_type=Layer, objc_name="position") +Layer_position :: proc "c" (self: ^Layer) -> Point { + return msgSend(Point, self, "position") +} +@(objc_type=Layer, objc_name="setPosition") +Layer_setPosition :: proc "c" (self: ^Layer, position: Point) { + msgSend(nil, self, "setPosition:", position) +} @(objc_type=Layer, objc_name="addSublayer") Layer_addSublayer :: proc "c" (self: ^Layer, layer: ^Layer) { msgSend(nil, self, "addSublayer:", layer) @@ -784,6 +792,10 @@ Window_setAcceptsMouseMovedEvents :: proc "c" (self: ^Window, ok: BOOL) { Window_setStyleMask :: proc "c" (self: ^Window, style_mask: WindowStyleMask) { msgSend(nil, self, "setStyleMask:", style_mask) } +@(objc_type=Window, objc_name="performClose") +Window_performClose :: proc "c" (self: ^Window, sender: id) { + msgSend(nil, self, "performClose:", sender) +} @(objc_type=Window, objc_name="close") Window_close :: proc "c" (self: ^Window) { msgSend(nil, self, "close") @@ -916,6 +928,18 @@ Window_collectionBehavior :: proc "c" (self: ^Window) -> WindowCollectionBehavio Window_setLevel :: proc "c" (self: ^Window, level: WindowLevel) { msgSend(nil, self, "setLevel:", level) } +@(objc_type = Window, objc_name = "keyWindow") +Window_keyWindow :: proc "c" (self: ^Window) -> BOOL { + return msgSend(BOOL, self, "isKeyWindow") +} +@(objc_type = Window, objc_name = "mainWindow") +Window_mainWindow :: proc "c" (self: ^Window) -> BOOL { + return msgSend(BOOL, self, "isMainWindow") +} +@(objc_type = Window, objc_name = "parentWindow") +Window_parentWindow :: proc "c" (self: ^Window) -> ^Window { + return msgSend(^Window, self, "parentWindow") +} @(objc_type = Window, objc_name = "setReleasedWhenClosed") Window_setReleasedWhenClosed :: proc "c" (self: ^Window, flag: BOOL) { msgSend(nil, self, "setReleasedWhenClosed:", flag) From a87f602cd04be0286591bf8137ff24939e0e9f9f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 11:39:22 +0000 Subject: [PATCH 014/766] Update kb_text_shape to v2.03 --- vendor/kb_text_shape/kb_text_shape_procs.odin | 443 +- vendor/kb_text_shape/kb_text_shape_types.odin | 3188 +-- vendor/kb_text_shape/lib/kb_text_shape.lib | Bin 714902 -> 852874 bytes vendor/kb_text_shape/src/kb_text_shape.h | 22039 ++++++++++------ 4 files changed, 15750 insertions(+), 9920 deletions(-) diff --git a/vendor/kb_text_shape/kb_text_shape_procs.odin b/vendor/kb_text_shape/kb_text_shape_procs.odin index a033402bc..9e6d02212 100644 --- a/vendor/kb_text_shape/kb_text_shape_procs.odin +++ b/vendor/kb_text_shape/kb_text_shape_procs.odin @@ -11,175 +11,314 @@ when ODIN_OS == .Windows { } } -import "core:mem" +import "core:c" + +// +// Context API +// The context can do everything for you. It is pretty convenient! +// +@(default_calling_convention="c", link_prefix="kbts_", require_results) +foreign lib { + SizeOfShapeContext :: proc() -> c.int --- + PlaceShapeContext :: proc(Allocator: allocator_function, AllocatorData: rawptr, Memory: rawptr) -> ^shape_context --- + PlaceShapeContextFixedMemory :: proc(Memory: rawptr, Size: c.int) -> ^shape_context --- + CreateShapeContext :: proc(Allocator: allocator_function, AllocatorData: rawptr) -> ^shape_context --- + DestroyShapeContext :: proc(Context: ^shape_context) --- + ShapePushFontFromMemory :: proc(Context: ^shape_context, Memory: rawptr, Size: c.int, FontIndex: c.int) -> ^font --- + ShapePushFont :: proc(Context: ^shape_context, Font: ^font) -> ^font --- + ShapePopFont :: proc(Context: ^shape_context) -> ^font --- + ShapeBegin :: proc(Context: ^shape_context, ParagraphDirection: direction, Language: language) --- + ShapeEnd :: proc(Context: ^shape_context) --- + ShapePushFeature :: proc(Context: ^shape_context, FeatureTag: u32, Value: c.int) --- + ShapePopFeature :: proc(Context: ^shape_context, FeatureTag: u32) -> b32 --- + ShapeCodepoint :: proc(Context: ^shape_context, Codepoint: rune) --- + ShapeCodepointWithUserId :: proc(Context: ^shape_context, Codepoint: rune, UserId: c.int) --- + ShapeError :: proc(Context: ^shape_context) -> shape_error --- + ShapeBeginManualRuns :: proc(Context: ^shape_context) --- + ShapeNextManualRun :: proc(Context: ^shape_context, Direction: direction, Script: script) --- + ShapeEndManualRuns :: proc(Context: ^shape_context) --- + ShapeManualBreak :: proc(Context: ^shape_context) --- +} + +@(require_results) +ShapeRun :: proc "contextless" (Context: ^shape_context) -> (Run: run, ok: b32) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + ShapeRun :: proc(Context: ^shape_context, Run: ^run) -> b32 --- + } + ok = ShapeRun(Context, &Run) + return +} + +ShapeUtf32 :: proc "c" (Context: ^shape_context, Utf32: []rune) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + ShapeUtf32 :: proc(Context: ^shape_context, Utf32: [^]rune, Length: c.int) --- + } + ShapeUtf32(Context, raw_data(Utf32), c.int(len(Utf32))) +} +ShapeUtf32WithUserId :: proc "c" (Context: ^shape_context, Utf32: []rune, UserId: c.int, UserIdIncrement: c.int) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + ShapeUtf32WithUserId :: proc(Context: ^shape_context, Utf32: [^]rune, Length: c.int, UserId: c.int, UserIdIncrement: c.int) --- + } + ShapeUtf32WithUserId(Context, raw_data(Utf32), c.int(len(Utf32)), UserId, UserIdIncrement) +} + +ShapeUtf8 :: proc(Context: ^shape_context, Utf8: string, UserIdGenerationMode: user_id_generation_mode) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + ShapeUtf8 :: proc(Context: ^shape_context, Utf8: [^]byte, Length: c.int, UserIdGenerationMode: user_id_generation_mode) --- + } + ShapeUtf8(Context, raw_data(Utf8), c.int(len(Utf8)), UserIdGenerationMode) +} +ShapeUtf8WithUserId :: proc(Context: ^shape_context, Utf8: string, UserId: c.int, UserIdGenerationMode: user_id_generation_mode) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + ShapeUtf8WithUserId :: proc(Context: ^shape_context, Utf8: [^]byte, Length: c.int, UserId: c.int, UserIdGenerationMode: user_id_generation_mode) --- + } + ShapeUtf8WithUserId(Context, raw_data(Utf8), c.int(len(Utf8)), UserId, UserIdGenerationMode) +} + @(default_calling_convention="c", link_prefix="kbts_", require_results) foreign lib { - FeatureTagToId :: proc(Tag: feature_tag) -> feature_id --- - FeatureOverride :: proc(Id: feature_id, Alternate: b32, Value: u32) -> feature_override --- - FeatureOverrideFromTag :: proc(Tag: feature_tag, Alternate: b32, Value: u32) -> feature_override --- - GlyphConfigOverrideFeature :: proc(Config: ^glyph_config, Id: feature_id, Alternate: b32, Value: u32) -> b32 --- - GlyphConfigOverrideFeatureFromTag :: proc(Config: ^glyph_config, Tag: feature_tag, Alternate: b32, Value: u32) -> b32 --- - - FontIsValid :: proc(Font: ^font) -> b32 --- - SizeOfShapeState :: proc(Font: ^font) -> un --- - - ResetShapeState :: proc(State: ^shape_state) --- - - ShapeConfig :: proc(Font: ^font, Script: script, Language: language) -> shape_config --- - ShaperIsComplex :: proc(Shaper: shaper) -> b32 --- - ScriptTagToScript :: proc(Tag: script_tag) -> script --- - - Shape :: proc(State: ^shape_state, Config: ^shape_config, - MainDirection, RunDirection: direction, - Glyphs: [^]glyph, GlyphCount: ^u32, GlyphCapacity: u32) -> b32 --- - - Cursor :: proc(Direction: direction) -> cursor --- - BeginBreak :: proc(State: ^break_state, MainDirection: direction, JapaneseLineBreakStyle: japanese_line_break_style) --- - BreakStateIsValid :: proc(State: ^break_state) -> b32 --- - BreakAddCodepoint :: proc(State: ^break_state, Codepoint: rune, PositionIncrement: u32, EndOfText: b32) --- - BreakFlush :: proc(State: ^break_state) --- - Break :: proc(State: ^break_state, Break: ^break_type) -> b32 --- - CodepointToGlyph :: proc(Font: ^font, Codepoint: rune) -> glyph --- - InferScript :: proc(Direction: ^direction, Script: ^script, GlyphScript: script) --- + ShapeCurrentCodepointsIterator :: proc(Context: ^shape_context) -> shape_codepoint_iterator --- + ShapeCodepointIteratorIsValid :: proc(It: ^shape_codepoint_iterator) -> b32 --- + ShapeGetShapeCodepoint :: proc(Context: ^shape_context, CodepointIndex: c.int, Codepoint: ^shape_codepoint) -> b32 --- } - @(require_results) -GlyphConfig :: proc "c" (FeatureOverrides: []feature_override) -> glyph_config { - @(default_calling_convention="c", require_results) +ShapeCodepointIteratorNext :: proc "contextless" (It: ^shape_codepoint_iterator) -> (Codepoint: shape_codepoint, CodepointIndex: c.int, ok: b32) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) foreign lib { - kbts_GlyphConfig :: proc(FeatureOverrides: [^]feature_override, FeatureOverrideCount: u32) -> glyph_config --- + ShapeCodepointIteratorNext :: proc(It: ^shape_codepoint_iterator, Codepoint: ^shape_codepoint, CodepointIndex: ^c.int) -> b32 --- } - return kbts_GlyphConfig(raw_data(FeatureOverrides), u32(len(FeatureOverrides))) - -} - -@(require_results) -EmptyGlyphConfig :: proc(FeatureOverrides: []feature_override) -> glyph_config { - @(default_calling_convention="c", require_results) - foreign lib { - kbts_EmptyGlyphConfig :: proc(FeatureOverrides: [^]feature_override, FeatureOverrideCapacity: u32) -> glyph_config --- - } - return kbts_EmptyGlyphConfig(raw_data(FeatureOverrides), u32(len(FeatureOverrides))) -} - -@(require_results) -PlaceShapeState :: proc "c" (Memory: []byte) -> ^shape_state { - @(default_calling_convention="c", require_results) - foreign lib { - kbts_PlaceShapeState :: proc(Address: rawptr, Size: un) -> ^shape_state --- - } - - return kbts_PlaceShapeState(raw_data(Memory), un(len(Memory))) -} - -@(require_results) -DecodeUtf8 :: proc "contextless" (String: string) -> (Codepoint: rune, SourceCharactersConsumed: u32, Valid: bool) { - decode :: struct { - Codepoint: rune, - - SourceCharactersConsumed: u32, - Valid: b32, - } - - @(default_calling_convention="c", require_results) - foreign lib { - kbts_DecodeUtf8 :: proc(Utf8: [^]byte, Length: un) -> decode --- - } - - Decode := kbts_DecodeUtf8(raw_data(String), un(len(String))) - return Decode.Codepoint, Decode.SourceCharactersConsumed, bool(Decode.Valid) -} - - -@(require_results) -ReadFontHeader :: proc "c" (Font: ^font, Data: []byte) -> un { - @(default_calling_convention="c", require_results) - foreign lib { - kbts_ReadFontHeader :: proc(Font: ^font, Data: rawptr, Size: un) -> un --- - } - - return kbts_ReadFontHeader(Font, raw_data(Data), un(len(Data))) -} -@(require_results) -ReadFontData :: proc "c" (Font: ^font, Scratch: []byte) -> un { - @(default_calling_convention="c", require_results) - foreign lib { - kbts_ReadFontData :: proc(Font: ^font, Scratch: rawptr, ScratchSize: un) -> un --- - } - - return kbts_ReadFontData(Font, raw_data(Scratch), un(len(Scratch))) -} -@(require_results) -PostReadFontInitialize :: proc "c" (Font: ^font, Memory: []byte) -> b32 { - @(default_calling_convention="c", require_results) - foreign lib { - kbts_PostReadFontInitialize :: proc(Font: ^font, Memory: rawptr, MemorySize: un) -> b32 --- - } - - return kbts_PostReadFontInitialize(Font, raw_data(Memory), un(len(Memory))) -} - -@(require_results) -FontFromMemory :: proc(Data: []byte, allocator: mem.Allocator) -> (Result: font, Err: mem.Allocator_Error) { - ClonedData := mem.make_aligned([]byte, len(Data), 16, allocator) or_return - defer if Err != nil { - delete(ClonedData, allocator) - } - copy(ClonedData, Data) - - ScratchSize := ReadFontHeader(&Result, ClonedData) - Scratch := mem.make_aligned([]byte, ScratchSize, 16, allocator) or_return - MemorySize := ReadFontData(&Result, Scratch) - - Memory := Scratch - if MemorySize > ScratchSize { - delete(Scratch, allocator) - Memory = mem.make_aligned([]byte, MemorySize, 16, allocator) or_return - } - defer if Err != nil { - delete(Memory, allocator) - } - - _ = PostReadFontInitialize(&Result, Memory) - return - -} -FreeFont :: proc(Font: ^font, allocator: mem.Allocator) { - free(Font.FileBase, allocator) - free(Font.GlyphLookupMatrix, allocator) - Font^ = {} -} - -@(require_results) -CreateShapeState :: proc(Font: ^font, allocator: mem.Allocator) -> (Result: ^shape_state, Err: mem.Allocator_Error) { - Size := SizeOfShapeState(Font) - Memory := mem.make_aligned([]byte, Size, 16, allocator) or_return - Result = PlaceShapeState(Memory) + ok = ShapeCodepointIteratorNext(It, &Codepoint, &CodepointIndex) return } -FreeShapeState :: proc(State: ^shape_state, allocator: mem.Allocator) { - free(State, allocator) + + + +// +// Direct API +// +@(default_calling_convention="c", link_prefix="kbts_", require_results) +foreign lib { + FontCount :: proc(FileData: rawptr, FileSize: c.int) -> b32 --- + FontFromMemory :: proc(FileData: rawptr, FileSize: c.int, FontIndex: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> font --- + FreeFont :: proc(Font: ^font) --- + FontIsValid :: proc(Font: ^font) -> b32 --- + LoadFont :: proc(Font: ^font, State: ^load_font_state, FontData: rawptr, FontDataSize: c.int, FontIndex: c.int, ScratchSize_: ^c.int, OutputSize_: ^c.int) -> load_font_error --- + PlaceBlob :: proc(Font: ^font, State: ^load_font_state, ScratchMemory: rawptr, OutputMemory: rawptr) -> load_font_error --- + GetFontInfo :: proc(Font: ^font, Info: ^font_info) --- + + // A shape_config is a bag of pre-computed data for a specific shaping setup. + SizeOfShapeConfig :: proc(Font: ^font, Script: script, Language: language) -> b32 --- + PlaceShapeConfig :: proc(Font: ^font, Script: script, Language: language, Memory: rawptr) -> ^shape_config --- + CreateShapeConfig :: proc(Font: ^font, Script: script, Language: language, Allocator: allocator_function, AllocatorData: rawptr) -> ^shape_config --- + DestroyShapeConfig :: proc(Config: ^shape_config) --- + + // A glyph_storage holds and recycles glyph data. + InitializeGlyphStorage :: proc(Storage: ^glyph_storage, Allocator: allocator_function, AllocatorData: rawptr) -> b32 --- + InitializeGlyphStorageFixedMemory :: proc(Storage: ^glyph_storage, Memory: rawptr, MemorySize: c.int) -> b32 --- + PushGlyph :: proc(Storage: ^glyph_storage, Font: ^font, Codepoint: rune, Config: ^glyph_config, UserId: c.int) -> ^glyph --- + ClearActiveGlyphs :: proc(Storage: ^glyph_storage) --- + FreeAllGlyphs :: proc(Storage: ^glyph_storage) --- + CodepointToGlyph :: proc(Font: ^font, Codepoint: rune, Config: ^glyph_config, UserId: c.int) -> glyph --- + CodepointToGlyphId :: proc(Font: ^font, Codepoint: rune) -> c.int --- + ActiveGlyphIterator :: proc(Storage: ^glyph_storage) -> glyph_iterator --- + + // A glyph_config specifies glyph-specific shaping parameters. + // A single glyph_config can be shared by multiple glyphs. + + DestroyGlyphConfig :: proc(Config: ^glyph_config) --- } + @(require_results) -PositionGlyph :: proc(Cursor: ^cursor, Glyph: ^glyph) -> (X, Y: i32) { - @(default_calling_convention="c", require_results) +ShapeDirect :: proc "contextless" (Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Allocator: allocator_function, AllocatorData: rawptr) -> (Output: glyph_iterator, err: shape_error) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) foreign lib { - kbts_PositionGlyph :: proc(Cursor: ^cursor, Glyph: ^glyph, X, Y: ^i32) --- + ShapeDirect :: proc(Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Allocator: allocator_function, AllocatorData: rawptr, Output: ^glyph_iterator) -> shape_error --- } - kbts_PositionGlyph(Cursor, Glyph, &X, &Y) + err = ShapeDirect(Config, Storage, RunDirection, Allocator, AllocatorData, &Output) return } @(require_results) -ShapeDynamic :: proc(State: ^shape_state, Config: ^shape_config, - MainDirection, RunDirection: direction, - Glyphs: ^[dynamic]glyph) -> b32 { - GlyphCount := u32(len(Glyphs^)) - GlyphCapacity := u32(cap(Glyphs^)) - Res := Shape(State, Config, MainDirection, RunDirection, raw_data(Glyphs^), &GlyphCount, GlyphCapacity) - resize(Glyphs, int(GlyphCount)) - return Res +ShapeDirectFixedMemory :: proc "contextless" (Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Memory: rawptr, MemorySize: c.int) -> (Output: glyph_iterator, err: shape_error) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + ShapeDirectFixedMemory :: proc(Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Memory: rawptr, MemorySize: c.int, Output: ^glyph_iterator) -> shape_error --- + } + err = ShapeDirectFixedMemory(Config, Storage, RunDirection, Memory, MemorySize, &Output) + return +} + + +@(require_results) +SizeOfGlyphConfig :: proc "c" (Overrides: []feature_override) -> c.int { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + SizeOfGlyphConfig :: proc(Overrides: [^]feature_override, OverrideCount: c.int) -> c.int --- + } + return SizeOfGlyphConfig(raw_data(Overrides), c.int(len(Overrides))) +} + +@(require_results) +PlaceGlyphConfig :: proc "c" (Overrides: []feature_override, Memory: rawptr) -> ^glyph_config { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + PlaceGlyphConfig :: proc(Overrides: [^]feature_override, OverrideCount: c.int, Memory: rawptr) -> ^glyph_config --- + } + return PlaceGlyphConfig(raw_data(Overrides), c.int(len(Overrides)), Memory) +} + +@(require_results) +CreateGlyphConfig :: proc(Overrides: []feature_override, Allocator: allocator_function, AllocatorData: rawptr) -> ^glyph_config { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + CreateGlyphConfig :: proc(Overrides: [^]feature_override, OverrideCount: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> ^glyph_config --- + } + return CreateGlyphConfig(raw_data(Overrides), c.int(len(Overrides)), Allocator, AllocatorData) +} + +@(default_calling_convention="c", link_prefix="kbts_", require_results) +foreign lib { + GlyphIteratorIsValid :: proc(It: ^glyph_iterator) -> b32 --- +} + +@(require_results) +GlyphIteratorNext :: proc "contextless" (It: ^glyph_iterator) -> (Glyph: ^glyph, ok: b32) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + GlyphIteratorNext :: proc(It: ^glyph_iterator, Glyph: ^^glyph) -> b32 --- + } + ok = GlyphIteratorNext(It, &Glyph) + return +} + + +// +// Segmentation +// +@(default_calling_convention="c", link_prefix="kbts_", require_results) +foreign lib { + BreakBegin :: proc(State: ^break_state, ParagraphDirection: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags) --- + BreakAddCodepoint :: proc(State: ^break_state, Codepoint: rune, PositionIncrement: c.int, EndOfText: c.int) --- + BreakEnd :: proc(State: ^break_state) --- +} + +@(require_results) +Break :: proc "contextless" (State: ^break_state) -> (Break: break_type, ok: b32) { + @(default_calling_convention="c", require_results) + foreign lib { + kbts_Break :: proc(State: ^break_state, Break: ^break_type) -> b32 --- + } + ok = kbts_Break(State, &Break) + return +} + + +BreakEntireString :: proc "c" (Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, + Input: []byte, InputFormat: text_format, + Breaks: []break_type, BreakCount: ^c.int, + BreakFlags: []break_flags, BreakFlagCount: ^c.int) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + BreakEntireString :: proc(Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, + Input: rawptr, InputSizeInBytes: c.int, InputFormat: text_format, + Breaks: [^]break_type, BreakCapacity: c.int, BreakCount: ^c.int, + BreakFlags: [^]break_flags, BreakFlagCapacity: c.int, BreakFlagCount: ^c.int) --- + } + BreakEntireString(Direction, JapaneseLineBreakStyle, ConfigFlags, raw_data(Input), c.int(len(Input)), InputFormat, raw_data(Breaks), c.int(len(Breaks)), BreakCount, raw_data(BreakFlags), c.int(len(BreakFlags)), BreakFlagCount) +} + +BreakEntireStringUtf32 :: proc "c" (Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, + Utf32: []rune, + Breaks: []break_type, BreakCount: ^c.int, + BreakFlags: []break_flags, BreakFlagCount: ^c.int) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + BreakEntireStringUtf32 :: proc(Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, + Utf32: [^]rune, Utf32Count: c.int, + Breaks: [^]break_type, BreakCapacity: c.int, BreakCount: ^c.int, + BreakFlags: [^]break_flags, BreakFlagCapacity: c.int, BreakFlagCount: ^c.int) --- + } + BreakEntireStringUtf32(Direction, JapaneseLineBreakStyle, ConfigFlags, raw_data(Utf32), c.int(len(Utf32)), raw_data(Breaks), c.int(len(Breaks)), BreakCount, raw_data(BreakFlags), c.int(len(BreakFlags)), BreakFlagCount) +} + +BreakEntireStringUtf8 :: proc "c" (Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, + Utf8: string, + Breaks: []break_type, BreakCount: ^c.int, + BreakFlags: []break_flags, BreakFlagCount: ^c.int) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + BreakEntireStringUtf8 :: proc(Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, + Utf8: [^]byte, Utf8Length: c.int, + Breaks: [^]break_type, BreakCapacity: c.int, BreakCount: ^c.int, + BreakFlags: [^]break_flags, BreakFlagCapacity: c.int, BreakFlagCount: ^c.int) --- + } + BreakEntireStringUtf8(Direction, JapaneseLineBreakStyle, ConfigFlags, raw_data(Utf8), c.int(len(Utf8)), raw_data(Breaks), c.int(len(Breaks)), BreakCount, raw_data(BreakFlags), c.int(len(BreakFlags)), BreakFlagCount) +} + + + +@(default_calling_convention="c", link_prefix="kbts_", require_results) +foreign lib { + // Quick test for font support of a sequence of codepoints. + FontCoverageTestBegin :: proc(Test: ^font_coverage_test, Font: ^font) --- + FontCoverageTestCodepoint :: proc(Test: ^font_coverage_test, Codepoint: rune) --- + FontCoverageTestEnd :: proc(Test: ^font_coverage_test) -> b32 --- + + EncodeUtf8 :: proc(Codepoint: rune) -> encode_utf8 --- + ScriptDirection :: proc(Script: script) -> direction --- + ScriptIsComplex :: proc(Script: script) -> b32 --- + ScriptTagToScript :: proc(Tag: script_tag) -> script --- +} + +@(require_results) +DecodeUtf8 :: proc "c" (Utf8: string) -> decode { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + DecodeUtf8 :: proc(Utf8: [^]byte, Length: un) -> decode --- + } + return DecodeUtf8(raw_data(Utf8), un(len(Utf8))) +} + +// This is a quick guess that stops at the first glyph that has a strong script/direction associated to it. +// It is convenient, but only works if you are sure your input text is mono-script and mono-direction. +@(require_results) +GuessTextProperties :: proc "contextless" (Text: []byte, Format: text_format) -> (Direction: direction, Script: script) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + GuessTextProperties :: proc(Text: rawptr, TextSizeInBytes: c.int, Format: text_format, Direction: ^direction, Script: ^script) --- + } + GuessTextProperties(raw_data(Text), c.int(len(Text)), Format, &Direction, &Script) + return +} + +// This is a quick guess that stops at the first glyph that has a strong script/direction associated to it. +// It is convenient, but only works if you are sure your input text is mono-script and mono-direction. +@(require_results) +GuessTextPropertiesUtf32 :: proc "contextless" (Utf32: []rune) -> (Direction: direction, Script: script) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + GuessTextPropertiesUtf32 :: proc(Utf32: [^]rune, Utf32Count: c.int, Direction: ^direction, Script: ^script) --- + } + GuessTextPropertiesUtf32(raw_data(Utf32), c.int(len(Utf32)), &Direction, &Script) + return +} + +// This is a quick guess that stops at the first glyph that has a strong script/direction associated to it. +// It is convenient, but only works if you are sure your input text is mono-script and mono-direction._results) +@(require_results) +GuessTextPropertiesUtf8 :: proc "contextless" (Utf8: string) -> (Direction: direction, Script: script) { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + GuessTextPropertiesUtf8 :: proc(Utf8: cstring, Utf8Length: c.int, Direction: ^direction, Script: ^script) --- + } + GuessTextPropertiesUtf8(cstring(raw_data(Utf8)), c.int(len(Utf8)), &Direction, &Script) + return } \ No newline at end of file diff --git a/vendor/kb_text_shape/kb_text_shape_types.odin b/vendor/kb_text_shape/kb_text_shape_types.odin index 929af64d2..6c4465319 100644 --- a/vendor/kb_text_shape/kb_text_shape_types.odin +++ b/vendor/kb_text_shape/kb_text_shape_types.odin @@ -17,743 +17,693 @@ un :: distinct ( // i64 // ) -joining_feature :: enum u8 { - NONE, - ISOL, - FINA, - FIN2, - FIN3, - MEDI, - MED2, - INIT, -} - -reph_position :: enum u8 { - AFTER_POST, - BEFORE_POST, - BEFORE_SUBJOINED, - AFTER_SUBJOINED, - AFTER_MAIN, -} - -reph_encoding :: enum u8 { - IMPLICIT, - EXPLICIT, - LOGICAL_REPHA, - VISUAL_REPHA, -} - -syllabic_position :: enum u8 { - NONE, - - RA_TO_BECOME_REPH, - - PREBASE_MATRA, - PREBASE_CONSONANT, - - SYLLABLE_BASE, - AFTER_MAIN, - - ABOVEBASE_CONSONANT, - - BEFORE_SUBJOINED, - BELOWBASE_CONSONANT, - AFTER_SUBJOINED, - - BEFORE_POST, - POSTBASE_CONSONANT, - AFTER_POST, - - FINAL_CONSONANT, - SMVD, -} language :: enum u32 { DONT_KNOW = 0, - A_HMAO = ('H' | 'M'<<8 | 'D'<<16 | ' '<<24), - AARI = ('A' | 'R'<<8 | 'I'<<16 | ' '<<24), - ABAZA = ('A' | 'B'<<8 | 'A'<<16 | ' '<<24), - ABKHAZIAN = ('A' | 'B'<<8 | 'K'<<16 | ' '<<24), - ACHI = ('A' | 'C'<<8 | 'R'<<16 | ' '<<24), - ACHOLI = ('A' | 'C'<<8 | 'H'<<16 | ' '<<24), - ADYGHE = ('A' | 'D'<<8 | 'Y'<<16 | ' '<<24), - AFAR = ('A' | 'F'<<8 | 'R'<<16 | ' '<<24), - AFRIKAANS = ('A' | 'F'<<8 | 'K'<<16 | ' '<<24), - AGAW = ('A' | 'G'<<8 | 'W'<<16 | ' '<<24), - AITON = ('A' | 'I'<<8 | 'O'<<16 | ' '<<24), - AKAN = ('A' | 'K'<<8 | 'A'<<16 | ' '<<24), - ALBANIAN = ('S' | 'Q'<<8 | 'I'<<16 | ' '<<24), - ALSATIAN = ('A' | 'L'<<8 | 'S'<<16 | ' '<<24), - ALTAI = ('A' | 'L'<<8 | 'T'<<16 | ' '<<24), - ALUO = ('Y' | 'N'<<8 | 'A'<<16 | ' '<<24), - AMERICAN_PHONETIC = ('A' | 'P'<<8 | 'P'<<16 | 'H'<<24), - AMHARIC = ('A' | 'M'<<8 | 'H'<<16 | ' '<<24), - ANGLO_SAXON = ('A' | 'N'<<8 | 'G'<<16 | ' '<<24), - ARABIC = ('A' | 'R'<<8 | 'A'<<16 | ' '<<24), - ARAGONESE = ('A' | 'R'<<8 | 'G'<<16 | ' '<<24), - ARAKANESE = ('A' | 'R'<<8 | 'K'<<16 | ' '<<24), - ARAKWAL = ('R' | 'K'<<8 | 'W'<<16 | ' '<<24), - ARMENIAN = ('H' | 'Y'<<8 | 'E'<<16 | ' '<<24), - ARMENIAN_EAST = ('H' | 'Y'<<8 | 'E'<<16 | '0'<<24), - AROMANIAN = ('R' | 'U'<<8 | 'P'<<16 | ' '<<24), - ARPITAN = ('F' | 'R'<<8 | 'P'<<16 | ' '<<24), - ASSAMESE = ('A' | 'S'<<8 | 'M'<<16 | ' '<<24), - ASTURIAN = ('A' | 'S'<<8 | 'T'<<16 | ' '<<24), - ATHAPASKAN = ('A' | 'T'<<8 | 'H'<<16 | ' '<<24), - ATSINA = ('A' | 'T'<<8 | 'S'<<16 | ' '<<24), - AVAR = ('A' | 'V'<<8 | 'R'<<16 | ' '<<24), - AVATIME = ('A' | 'V'<<8 | 'N'<<16 | ' '<<24), - AWADHI = ('A' | 'W'<<8 | 'A'<<16 | ' '<<24), - AYMARA = ('A' | 'Y'<<8 | 'M'<<16 | ' '<<24), - AZERBAIDJANI = ('A' | 'Z'<<8 | 'E'<<16 | ' '<<24), - BADAGA = ('B' | 'A'<<8 | 'D'<<16 | ' '<<24), - BAGHELKHANDI = ('B' | 'A'<<8 | 'G'<<16 | ' '<<24), - BAGRI = ('B' | 'G'<<8 | 'Q'<<16 | ' '<<24), - BALANTE = ('B' | 'L'<<8 | 'N'<<16 | ' '<<24), - BALINESE = ('B' | 'A'<<8 | 'N'<<16 | ' '<<24), - BALKAR = ('B' | 'A'<<8 | 'L'<<16 | ' '<<24), - BALTI = ('B' | 'L'<<8 | 'T'<<16 | ' '<<24), - BALUCHI = ('B' | 'L'<<8 | 'I'<<16 | ' '<<24), - BAMBARA = ('B' | 'M'<<8 | 'B'<<16 | ' '<<24), - BAMILEKE = ('B' | 'M'<<8 | 'L'<<16 | ' '<<24), - BANDA = ('B' | 'A'<<8 | 'D'<<16 | '0'<<24), - BANDJALANG = ('B' | 'D'<<8 | 'Y'<<16 | ' '<<24), - BANGLA = ('B' | 'E'<<8 | 'N'<<16 | ' '<<24), - BASHKIR = ('B' | 'S'<<8 | 'H'<<16 | ' '<<24), - BASQUE = ('E' | 'U'<<8 | 'Q'<<16 | ' '<<24), - BATAK = ('B' | 'T'<<8 | 'K'<<16 | ' '<<24), - BATAK_ALAS_KLUET = ('B' | 'T'<<8 | 'Z'<<16 | ' '<<24), - BATAK_ANGKOLA = ('A' | 'K'<<8 | 'B'<<16 | ' '<<24), - BATAK_DAIRI = ('B' | 'T'<<8 | 'D'<<16 | ' '<<24), - BATAK_KARO = ('B' | 'T'<<8 | 'X'<<16 | ' '<<24), - BATAK_MANDAILING = ('B' | 'T'<<8 | 'M'<<16 | ' '<<24), - BATAK_SIMALUNGUN = ('B' | 'T'<<8 | 'S'<<16 | ' '<<24), - BATAK_TOBA = ('B' | 'B'<<8 | 'C'<<16 | ' '<<24), - BAULE = ('B' | 'A'<<8 | 'U'<<16 | ' '<<24), - BAVARIAN = ('B' | 'A'<<8 | 'R'<<16 | ' '<<24), - BELARUSIAN = ('B' | 'E'<<8 | 'L'<<16 | ' '<<24), - BEMBA = ('B' | 'E'<<8 | 'M'<<16 | ' '<<24), - BENCH = ('B' | 'C'<<8 | 'H'<<16 | ' '<<24), - BERBER = ('B' | 'B'<<8 | 'R'<<16 | ' '<<24), - BETI = ('B' | 'T'<<8 | 'I'<<16 | ' '<<24), - BETTE_KURUMA = ('X' | 'U'<<8 | 'B'<<16 | ' '<<24), - BHILI = ('B' | 'H'<<8 | 'I'<<16 | ' '<<24), - BHOJPURI = ('B' | 'H'<<8 | 'O'<<16 | ' '<<24), - BHUTANESE = ('D' | 'Z'<<8 | 'N'<<16 | ' '<<24), - BIBLE_CREE = ('B' | 'C'<<8 | 'R'<<16 | ' '<<24), - BIKOL = ('B' | 'I'<<8 | 'K'<<16 | ' '<<24), - BILEN = ('B' | 'I'<<8 | 'L'<<16 | ' '<<24), - BISHNUPRIYA_MANIPURI = ('B' | 'P'<<8 | 'Y'<<16 | ' '<<24), - BISLAMA = ('B' | 'I'<<8 | 'S'<<16 | ' '<<24), - BLACKFOOT = ('B' | 'K'<<8 | 'F'<<16 | ' '<<24), - BODO = ('B' | 'R'<<8 | 'X'<<16 | ' '<<24), - BOSNIAN = ('B' | 'O'<<8 | 'S'<<16 | ' '<<24), - BOUYEI = ('P' | 'C'<<8 | 'C'<<16 | ' '<<24), - BRAHUI = ('B' | 'R'<<8 | 'H'<<16 | ' '<<24), - BRAJ_BHASHA = ('B' | 'R'<<8 | 'I'<<16 | ' '<<24), - BRETON = ('B' | 'R'<<8 | 'E'<<16 | ' '<<24), - BUGIS = ('B' | 'U'<<8 | 'G'<<16 | ' '<<24), - BULGARIAN = ('B' | 'G'<<8 | 'R'<<16 | ' '<<24), - BUMTHANGKHA = ('K' | 'J'<<8 | 'Z'<<16 | ' '<<24), - BURMESE = ('B' | 'R'<<8 | 'M'<<16 | ' '<<24), - BURUSHASKI = ('B' | 'S'<<8 | 'K'<<16 | ' '<<24), - CAJUN_FRENCH = ('F' | 'R'<<8 | 'C'<<16 | ' '<<24), - CARRIER = ('C' | 'R'<<8 | 'R'<<16 | ' '<<24), - CATALAN = ('C' | 'A'<<8 | 'T'<<16 | ' '<<24), - CAYUGA = ('C' | 'A'<<8 | 'Y'<<16 | ' '<<24), - CEBUANO = ('C' | 'E'<<8 | 'B'<<16 | ' '<<24), - CENTRAL_YUPIK = ('E' | 'S'<<8 | 'U'<<16 | ' '<<24), - CHAHA_GURAGE = ('C' | 'H'<<8 | 'G'<<16 | ' '<<24), - CHAMORRO = ('C' | 'H'<<8 | 'A'<<16 | ' '<<24), - CHATTISGARHI = ('C' | 'H'<<8 | 'H'<<16 | ' '<<24), - CHECHEN = ('C' | 'H'<<8 | 'E'<<16 | ' '<<24), - CHEROKEE = ('C' | 'H'<<8 | 'R'<<16 | ' '<<24), - CHEYENNE = ('C' | 'H'<<8 | 'Y'<<16 | ' '<<24), - CHICHEWA = ('C' | 'H'<<8 | 'I'<<16 | ' '<<24), - CHIGA = ('C' | 'G'<<8 | 'G'<<16 | ' '<<24), - CHIMILA = ('C' | 'B'<<8 | 'G'<<16 | ' '<<24), - CHIN = ('Q' | 'I'<<8 | 'N'<<16 | ' '<<24), - CHINANTEC = ('C' | 'C'<<8 | 'H'<<16 | 'N'<<24), - CHINESE_PHONETIC = ('Z' | 'H'<<8 | 'P'<<16 | ' '<<24), - CHINESE_SIMPLIFIED = ('Z' | 'H'<<8 | 'S'<<16 | ' '<<24), - CHINESE_TRADITIONAL = ('Z' | 'H'<<8 | 'T'<<16 | ' '<<24), - CHINESE_TRADITIONAL_HONG_KONG = ('Z' | 'H'<<8 | 'H'<<16 | ' '<<24), - CHINESE_TRADITIONAL_MACAO = ('Z' | 'H'<<8 | 'T'<<16 | 'M'<<24), - CHIPEWYAN = ('C' | 'H'<<8 | 'P'<<16 | ' '<<24), - CHITTAGONIAN = ('C' | 'T'<<8 | 'G'<<16 | ' '<<24), - CHOCTAW = ('C' | 'H'<<8 | 'O'<<16 | ' '<<24), - CHUKCHI = ('C' | 'H'<<8 | 'K'<<16 | ' '<<24), - CHURCH_SLAVONIC = ('C' | 'S'<<8 | 'L'<<16 | ' '<<24), - CHUUKESE = ('C' | 'H'<<8 | 'K'<<16 | '0'<<24), - CHUVASH = ('C' | 'H'<<8 | 'U'<<16 | ' '<<24), - COMORIAN = ('C' | 'M'<<8 | 'R'<<16 | ' '<<24), - COMOX = ('C' | 'O'<<8 | 'O'<<16 | ' '<<24), - COPTIC = ('C' | 'O'<<8 | 'P'<<16 | ' '<<24), - CORNISH = ('C' | 'O'<<8 | 'R'<<16 | ' '<<24), - CORSICAN = ('C' | 'O'<<8 | 'S'<<16 | ' '<<24), - CREE = ('C' | 'R'<<8 | 'E'<<16 | ' '<<24), - CREOLES = ('C' | 'P'<<8 | 'P'<<16 | ' '<<24), - CRIMEAN_TATAR = ('C' | 'R'<<8 | 'T'<<16 | ' '<<24), - CRIOULO = ('K' | 'E'<<8 | 'A'<<16 | ' '<<24), - CROATIAN = ('H' | 'R'<<8 | 'V'<<16 | ' '<<24), - CYPRIOT_ARABIC = ('A' | 'C'<<8 | 'Y'<<16 | ' '<<24), - CZECH = ('C' | 'S'<<8 | 'Y'<<16 | ' '<<24), - DAGBANI = ('D' | 'A'<<8 | 'G'<<16 | ' '<<24), - DAN = ('D' | 'N'<<8 | 'J'<<16 | ' '<<24), - DANGME = ('D' | 'N'<<8 | 'G'<<16 | ' '<<24), - DANISH = ('D' | 'A'<<8 | 'N'<<16 | ' '<<24), - DARGWA = ('D' | 'A'<<8 | 'R'<<16 | ' '<<24), - DARI = ('D' | 'R'<<8 | 'I'<<16 | ' '<<24), - DAYI = ('D' | 'A'<<8 | 'X'<<16 | ' '<<24), - DEFAULT = ('d' | 'f'<<8 | 'l'<<16 | 't'<<24), // Can be DFLT too... - DEHONG_DAI = ('T' | 'D'<<8 | 'D'<<16 | ' '<<24), - DHANGU = ('D' | 'H'<<8 | 'G'<<16 | ' '<<24), - DHIVEHI = ('D' | 'I'<<8 | 'V'<<16 | ' '<<24), - DHUWAL = ('D' | 'U'<<8 | 'J'<<16 | ' '<<24), - DIMLI = ('D' | 'I'<<8 | 'Q'<<16 | ' '<<24), - DINKA = ('D' | 'N'<<8 | 'K'<<16 | ' '<<24), - DIVEHI = ('D' | 'I'<<8 | 'V'<<16 | ' '<<24), - DJAMBARRPUYNGU = ('D' | 'J'<<8 | 'R'<<16 | '0'<<24), - DOGRI = ('D' | 'G'<<8 | 'O'<<16 | ' '<<24), - DOGRI_MACROLANGUAGE = ('D' | 'G'<<8 | 'R'<<16 | ' '<<24), - DUNGAN = ('D' | 'U'<<8 | 'N'<<16 | ' '<<24), - DUTCH = ('N' | 'L'<<8 | 'D'<<16 | ' '<<24), - DZONGKHA = ('D' | 'Z'<<8 | 'N'<<16 | ' '<<24), - EASTERN_ABENAKI = ('A' | 'A'<<8 | 'Q'<<16 | ' '<<24), - EASTERN_CHAM = ('C' | 'J'<<8 | 'M'<<16 | ' '<<24), - EASTERN_CREE = ('E' | 'C'<<8 | 'R'<<16 | ' '<<24), - EASTERN_MANINKAKAN = ('E' | 'M'<<8 | 'K'<<16 | ' '<<24), - EASTERN_PWO_KAREN = ('K' | 'J'<<8 | 'P'<<16 | ' '<<24), - EBIRA = ('E' | 'B'<<8 | 'I'<<16 | ' '<<24), - EDO = ('E' | 'D'<<8 | 'O'<<16 | ' '<<24), - EFIK = ('E' | 'F'<<8 | 'I'<<16 | ' '<<24), - EMBERA_BAUDO = ('B' | 'D'<<8 | 'C'<<16 | ' '<<24), - EMBERA_CATIO = ('C' | 'T'<<8 | 'O'<<16 | ' '<<24), - EMBERA_CHAMI = ('C' | 'M'<<8 | 'I'<<16 | ' '<<24), - EMBERA_TADO = ('T' | 'D'<<8 | 'C'<<16 | ' '<<24), - ENGLISH = ('E' | 'N'<<8 | 'G'<<16 | ' '<<24), - EPENA = ('S' | 'J'<<8 | 'A'<<16 | ' '<<24), - ERZYA = ('E' | 'R'<<8 | 'Z'<<16 | ' '<<24), - KB_TEXT_SHAPEANTO = ('N' | 'T'<<8 | 'O'<<16 | ' '<<24), - ESTONIAN = ('E' | 'T'<<8 | 'I'<<16 | ' '<<24), - EVEN = ('E' | 'V'<<8 | 'N'<<16 | ' '<<24), - EVENKI = ('E' | 'V'<<8 | 'K'<<16 | ' '<<24), - EWE = ('E' | 'W'<<8 | 'E'<<16 | ' '<<24), - FALAM_CHIN = ('H' | 'A'<<8 | 'L'<<16 | ' '<<24), - FANG = ('F' | 'A'<<8 | 'N'<<16 | '0'<<24), - FANTI = ('F' | 'A'<<8 | 'T'<<16 | ' '<<24), - FAROESE = ('F' | 'O'<<8 | 'S'<<16 | ' '<<24), - FEFE = ('F' | 'M'<<8 | 'P'<<16 | ' '<<24), - FIJIAN = ('F' | 'J'<<8 | 'I'<<16 | ' '<<24), - FILIPINO = ('P' | 'I'<<8 | 'L'<<16 | ' '<<24), - FINNISH = ('F' | 'I'<<8 | 'N'<<16 | ' '<<24), - FLEMISH = ('F' | 'L'<<8 | 'E'<<16 | ' '<<24), - FON = ('F' | 'O'<<8 | 'N'<<16 | ' '<<24), - FOREST_ENETS = ('F' | 'N'<<8 | 'E'<<16 | ' '<<24), - FRENCH = ('F' | 'R'<<8 | 'A'<<16 | ' '<<24), - FRENCH_ANTILLEAN = ('F' | 'A'<<8 | 'N'<<16 | ' '<<24), - FRISIAN = ('F' | 'R'<<8 | 'I'<<16 | ' '<<24), - FRIULIAN = ('F' | 'R'<<8 | 'L'<<16 | ' '<<24), - FULAH = ('F' | 'U'<<8 | 'L'<<16 | ' '<<24), - FUTA = ('F' | 'T'<<8 | 'A'<<16 | ' '<<24), - GA = ('G' | 'A'<<8 | 'D'<<16 | ' '<<24), - GAGAUZ = ('G' | 'A'<<8 | 'G'<<16 | ' '<<24), - GALICIAN = ('G' | 'A'<<8 | 'L'<<16 | ' '<<24), - GANDA = ('L' | 'U'<<8 | 'G'<<16 | ' '<<24), - GARHWALI = ('G' | 'A'<<8 | 'W'<<16 | ' '<<24), - GARO = ('G' | 'R'<<8 | 'O'<<16 | ' '<<24), - GARSHUNI = ('G' | 'A'<<8 | 'R'<<16 | ' '<<24), - GEBA_KAREN = ('K' | 'V'<<8 | 'Q'<<16 | ' '<<24), - GEEZ = ('G' | 'E'<<8 | 'Z'<<16 | ' '<<24), - GEORGIAN = ('K' | 'A'<<8 | 'T'<<16 | ' '<<24), - GEPO = ('Y' | 'G'<<8 | 'P'<<16 | ' '<<24), - GERMAN = ('D' | 'E'<<8 | 'U'<<16 | ' '<<24), - GIKUYU = ('K' | 'I'<<8 | 'K'<<16 | ' '<<24), - GILAKI = ('G' | 'L'<<8 | 'K'<<16 | ' '<<24), - GILBERTESE = ('G' | 'I'<<8 | 'L'<<16 | '0'<<24), - GILYAK = ('G' | 'I'<<8 | 'L'<<16 | ' '<<24), - GITHABUL = ('G' | 'I'<<8 | 'H'<<16 | ' '<<24), - GOGO = ('G' | 'O'<<8 | 'G'<<16 | ' '<<24), - GONDI = ('G' | 'O'<<8 | 'N'<<16 | ' '<<24), - GREEK = ('E' | 'L'<<8 | 'L'<<16 | ' '<<24), - GREENLANDIC = ('G' | 'R'<<8 | 'N'<<16 | ' '<<24), - GUARANI = ('G' | 'U'<<8 | 'A'<<16 | ' '<<24), - GUINEA = ('G' | 'K'<<8 | 'P'<<16 | ' '<<24), - GUJARATI = ('G' | 'U'<<8 | 'J'<<16 | ' '<<24), - GUMATJ = ('G' | 'N'<<8 | 'N'<<16 | ' '<<24), - GUMUZ = ('G' | 'M'<<8 | 'Z'<<16 | ' '<<24), - GUPAPUYNGU = ('G' | 'U'<<8 | 'F'<<16 | ' '<<24), - GUSII = ('G' | 'U'<<8 | 'Z'<<16 | ' '<<24), - HAIDA = ('H' | 'A'<<8 | 'I'<<16 | '0'<<24), - HAITIAN_CREOLE = ('H' | 'A'<<8 | 'I'<<16 | ' '<<24), - HALKOMELEM = ('H' | 'U'<<8 | 'R'<<16 | ' '<<24), - HAMMER_BANNA = ('H' | 'B'<<8 | 'N'<<16 | ' '<<24), - HARARI = ('H' | 'R'<<8 | 'I'<<16 | ' '<<24), - HARAUTI = ('H' | 'A'<<8 | 'R'<<16 | ' '<<24), - HARYANVI = ('B' | 'G'<<8 | 'C'<<16 | ' '<<24), - HAUSA = ('H' | 'A'<<8 | 'U'<<16 | ' '<<24), - HAVASUPAI_WALAPAI_YAVAPAI = ('Y' | 'U'<<8 | 'F'<<16 | ' '<<24), - HAWAIIAN = ('H' | 'A'<<8 | 'W'<<16 | ' '<<24), - HAYA = ('H' | 'A'<<8 | 'Y'<<16 | ' '<<24), - HAZARAGI = ('H' | 'A'<<8 | 'Z'<<16 | ' '<<24), - HEBREW = ('I' | 'W'<<8 | 'R'<<16 | ' '<<24), - HEILTSUK = ('H' | 'E'<<8 | 'I'<<16 | ' '<<24), - HERERO = ('H' | 'E'<<8 | 'R'<<16 | ' '<<24), - HIGH_MARI = ('H' | 'M'<<8 | 'A'<<16 | ' '<<24), - HILIGAYNON = ('H' | 'I'<<8 | 'L'<<16 | ' '<<24), - HINDI = ('H' | 'I'<<8 | 'N'<<16 | ' '<<24), - HINDKO = ('H' | 'N'<<8 | 'D'<<16 | ' '<<24), - HIRI_MOTU = ('H' | 'M'<<8 | 'O'<<16 | ' '<<24), - HMONG = ('H' | 'M'<<8 | 'N'<<16 | ' '<<24), - HMONG_DAW = ('M' | 'W'<<8 | 'W'<<16 | ' '<<24), - HMONG_SHUAT = ('H' | 'M'<<8 | 'Z'<<16 | ' '<<24), - HO = ('H' | 'O'<<8 | ' '<<16 | ' '<<24), - HUNGARIAN = ('H' | 'U'<<8 | 'N'<<16 | ' '<<24), - IBAN = ('I' | 'B'<<8 | 'A'<<16 | ' '<<24), - IBIBIO = ('I' | 'B'<<8 | 'B'<<16 | ' '<<24), - ICELANDIC = ('I' | 'S'<<8 | 'L'<<16 | ' '<<24), - IDO = ('I' | 'D'<<8 | 'O'<<16 | ' '<<24), - IGBO = ('I' | 'B'<<8 | 'O'<<16 | ' '<<24), - IJO = ('I' | 'J'<<8 | 'O'<<16 | ' '<<24), - ILOKANO = ('I' | 'L'<<8 | 'O'<<16 | ' '<<24), - INARI_SAMI = ('I' | 'S'<<8 | 'M'<<16 | ' '<<24), - INDONESIAN = ('I' | 'N'<<8 | 'D'<<16 | ' '<<24), - INGUSH = ('I' | 'N'<<8 | 'G'<<16 | ' '<<24), - INTERLINGUA = ('I' | 'N'<<8 | 'A'<<16 | ' '<<24), - INTERLINGUE = ('I' | 'L'<<8 | 'E'<<16 | ' '<<24), - INUKTITUT = ('I' | 'N'<<8 | 'U'<<16 | ' '<<24), - INUPIAT = ('I' | 'P'<<8 | 'K'<<16 | ' '<<24), - IPA_PHONETIC = ('I' | 'P'<<8 | 'P'<<16 | ' '<<24), - IRISH = ('I' | 'R'<<8 | 'I'<<16 | ' '<<24), - IRISH_TRADITIONAL = ('I' | 'R'<<8 | 'T'<<16 | ' '<<24), - IRULA = ('I' | 'R'<<8 | 'U'<<16 | ' '<<24), - ITALIAN = ('I' | 'T'<<8 | 'A'<<16 | ' '<<24), - JAMAICAN_CREOLE = ('J' | 'A'<<8 | 'M'<<16 | ' '<<24), - JAPANESE = ('J' | 'A'<<8 | 'N'<<16 | ' '<<24), - JAVANESE = ('J' | 'A'<<8 | 'V'<<16 | ' '<<24), - JENNU_KURUMA = ('X' | 'U'<<8 | 'J'<<16 | ' '<<24), - JUDEO_TAT = ('J' | 'D'<<8 | 'T'<<16 | ' '<<24), - JULA = ('J' | 'U'<<8 | 'L'<<16 | ' '<<24), - KABARDIAN = ('K' | 'A'<<8 | 'B'<<16 | ' '<<24), - KABYLE = ('K' | 'A'<<8 | 'B'<<16 | '0'<<24), - KACHCHI = ('K' | 'A'<<8 | 'C'<<16 | ' '<<24), - KADIWEU = ('K' | 'B'<<8 | 'C'<<16 | ' '<<24), - KALENJIN = ('K' | 'A'<<8 | 'L'<<16 | ' '<<24), - KALMYK = ('K' | 'L'<<8 | 'M'<<16 | ' '<<24), - KAMBA = ('K' | 'M'<<8 | 'B'<<16 | ' '<<24), - KANAUJI = ('B' | 'J'<<8 | 'J'<<16 | ' '<<24), - KANNADA = ('K' | 'A'<<8 | 'N'<<16 | ' '<<24), - KANURI = ('K' | 'N'<<8 | 'R'<<16 | ' '<<24), - KAQCHIKEL = ('C' | 'A'<<8 | 'K'<<16 | ' '<<24), - KARACHAY = ('K' | 'A'<<8 | 'R'<<16 | ' '<<24), - KARAIM = ('K' | 'R'<<8 | 'M'<<16 | ' '<<24), - KARAKALPAK = ('K' | 'R'<<8 | 'K'<<16 | ' '<<24), - KARELIAN = ('K' | 'R'<<8 | 'L'<<16 | ' '<<24), - KAREN = ('K' | 'R'<<8 | 'N'<<16 | ' '<<24), - KASHMIRI = ('K' | 'S'<<8 | 'H'<<16 | ' '<<24), - KASHUBIAN = ('C' | 'S'<<8 | 'B'<<16 | ' '<<24), - KATE = ('K' | 'M'<<8 | 'G'<<16 | ' '<<24), - KAZAKH = ('K' | 'A'<<8 | 'Z'<<16 | ' '<<24), - KEBENA = ('K' | 'E'<<8 | 'B'<<16 | ' '<<24), - KEKCHI = ('K' | 'E'<<8 | 'K'<<16 | ' '<<24), - KHAKASS = ('K' | 'H'<<8 | 'A'<<16 | ' '<<24), - KHAMTI_SHAN = ('K' | 'H'<<8 | 'T'<<16 | ' '<<24), - KHAMYANG = ('K' | 'S'<<8 | 'U'<<16 | ' '<<24), - KHANTY_KAZIM = ('K' | 'H'<<8 | 'K'<<16 | ' '<<24), - KHANTY_SHURISHKAR = ('K' | 'H'<<8 | 'S'<<16 | ' '<<24), - KHANTY_VAKHI = ('K' | 'H'<<8 | 'V'<<16 | ' '<<24), - KHASI = ('K' | 'S'<<8 | 'I'<<16 | ' '<<24), - KHENGKHA = ('X' | 'K'<<8 | 'F'<<16 | ' '<<24), - KHINALUG = ('K' | 'J'<<8 | 'J'<<16 | ' '<<24), - KHMER = ('K' | 'H'<<8 | 'M'<<16 | ' '<<24), - KHORASANI_TURKIC = ('K' | 'M'<<8 | 'Z'<<16 | ' '<<24), - KHOWAR = ('K' | 'H'<<8 | 'W'<<16 | ' '<<24), - KHUTSURI_GEORGIAN = ('K' | 'G'<<8 | 'E'<<16 | ' '<<24), - KICHE = ('Q' | 'U'<<8 | 'C'<<16 | ' '<<24), - KIKONGO = ('K' | 'O'<<8 | 'N'<<16 | ' '<<24), - KILDIN_SAMI = ('K' | 'S'<<8 | 'M'<<16 | ' '<<24), - KINYARWANDA = ('R' | 'U'<<8 | 'A'<<16 | ' '<<24), - KIRMANJKI = ('K' | 'I'<<8 | 'U'<<16 | ' '<<24), - KISII = ('K' | 'I'<<8 | 'S'<<16 | ' '<<24), - KITUBA = ('M' | 'K'<<8 | 'W'<<16 | ' '<<24), - KODAGU = ('K' | 'O'<<8 | 'D'<<16 | ' '<<24), - KOKNI = ('K' | 'K'<<8 | 'N'<<16 | ' '<<24), - KOMI = ('K' | 'O'<<8 | 'M'<<16 | ' '<<24), - KOMI_PERMYAK = ('K' | 'O'<<8 | 'P'<<16 | ' '<<24), - KOMI_ZYRIAN = ('K' | 'O'<<8 | 'Z'<<16 | ' '<<24), - KOMO = ('K' | 'M'<<8 | 'O'<<16 | ' '<<24), - KOMSO = ('K' | 'M'<<8 | 'S'<<16 | ' '<<24), - KONGO = ('K' | 'O'<<8 | 'N'<<16 | '0'<<24), - KONKANI = ('K' | 'O'<<8 | 'K'<<16 | ' '<<24), - KOORETE = ('K' | 'R'<<8 | 'T'<<16 | ' '<<24), - KOREAN = ('K' | 'O'<<8 | 'R'<<16 | ' '<<24), - KOREAO_OLD_HANGUL = ('K' | 'O'<<8 | 'H'<<16 | ' '<<24), - KORYAK = ('K' | 'Y'<<8 | 'K'<<16 | ' '<<24), - KOSRAEAN = ('K' | 'O'<<8 | 'S'<<16 | ' '<<24), - KPELLE = ('K' | 'P'<<8 | 'L'<<16 | ' '<<24), - KPELLE_LIBERIA = ('X' | 'P'<<8 | 'E'<<16 | ' '<<24), - KRIO = ('K' | 'R'<<8 | 'I'<<16 | ' '<<24), - KRYMCHAK = ('J' | 'C'<<8 | 'T'<<16 | ' '<<24), - KUANYAMA = ('K' | 'U'<<8 | 'A'<<16 | ' '<<24), - KUBE = ('K' | 'G'<<8 | 'F'<<16 | ' '<<24), - KUI = ('K' | 'U'<<8 | 'I'<<16 | ' '<<24), - KULVI = ('K' | 'U'<<8 | 'K'<<16 | ' '<<24), - KUMAONI = ('K' | 'M'<<8 | 'N'<<16 | ' '<<24), - KUMYK = ('K' | 'U'<<8 | 'M'<<16 | ' '<<24), - KURDISH = ('K' | 'U'<<8 | 'R'<<16 | ' '<<24), - KURUKH = ('K' | 'U'<<8 | 'U'<<16 | ' '<<24), - KUY = ('K' | 'U'<<8 | 'Y'<<16 | ' '<<24), - KWAKWALA = ('K' | 'W'<<8 | 'K'<<16 | ' '<<24), - KYRGYZ = ('K' | 'I'<<8 | 'R'<<16 | ' '<<24), - L_CREE = ('L' | 'C'<<8 | 'R'<<16 | ' '<<24), - LADAKHI = ('L' | 'D'<<8 | 'K'<<16 | ' '<<24), - LADIN = ('L' | 'A'<<8 | 'D'<<16 | ' '<<24), - LADINO = ('J' | 'U'<<8 | 'D'<<16 | ' '<<24), - LAHULI = ('L' | 'A'<<8 | 'H'<<16 | ' '<<24), - LAK = ('L' | 'A'<<8 | 'K'<<16 | ' '<<24), - LAKI = ('L' | 'K'<<8 | 'I'<<16 | ' '<<24), - LAMBANI = ('L' | 'A'<<8 | 'M'<<16 | ' '<<24), - LAMPUNG = ('L' | 'J'<<8 | 'P'<<16 | ' '<<24), - LAO = ('L' | 'A'<<8 | 'O'<<16 | ' '<<24), - LATIN = ('L' | 'A'<<8 | 'T'<<16 | ' '<<24), - LATVIAN = ('L' | 'V'<<8 | 'I'<<16 | ' '<<24), - LAZ = ('L' | 'A'<<8 | 'Z'<<16 | ' '<<24), - LELEMI = ('L' | 'E'<<8 | 'F'<<16 | ' '<<24), - LEZGI = ('L' | 'E'<<8 | 'Z'<<16 | ' '<<24), - LIGURIAN = ('L' | 'I'<<8 | 'J'<<16 | ' '<<24), - LIMBU = ('L' | 'M'<<8 | 'B'<<16 | ' '<<24), - LIMBURGISH = ('L' | 'I'<<8 | 'M'<<16 | ' '<<24), - LINGALA = ('L' | 'I'<<8 | 'N'<<16 | ' '<<24), - LIPO = ('L' | 'P'<<8 | 'O'<<16 | ' '<<24), - LISU = ('L' | 'I'<<8 | 'S'<<16 | ' '<<24), - LITHUANIAN = ('L' | 'T'<<8 | 'H'<<16 | ' '<<24), - LIV = ('L' | 'I'<<8 | 'V'<<16 | ' '<<24), - LOJBAN = ('J' | 'B'<<8 | 'O'<<16 | ' '<<24), - LOMA = ('L' | 'O'<<8 | 'M'<<16 | ' '<<24), - LOMBARD = ('L' | 'M'<<8 | 'O'<<16 | ' '<<24), - LOMWE = ('L' | 'M'<<8 | 'W'<<16 | ' '<<24), - LOW_MARI = ('L' | 'M'<<8 | 'A'<<16 | ' '<<24), - LOW_SAXON = ('N' | 'D'<<8 | 'S'<<16 | ' '<<24), - LOWER_SORBIAN = ('L' | 'S'<<8 | 'B'<<16 | ' '<<24), - LU = ('X' | 'B'<<8 | 'D'<<16 | ' '<<24), - LUBA_KATANGA = ('L' | 'U'<<8 | 'B'<<16 | ' '<<24), - LUBA_LULUA = ('L' | 'U'<<8 | 'A'<<16 | ' '<<24), - LULE_SAMI = ('L' | 'S'<<8 | 'M'<<16 | ' '<<24), - LUO = ('L' | 'U'<<8 | 'O'<<16 | ' '<<24), - LURI = ('L' | 'R'<<8 | 'C'<<16 | ' '<<24), - LUSHOOTSEED = ('L' | 'U'<<8 | 'T'<<16 | ' '<<24), - LUXEMBOURGISH = ('L' | 'T'<<8 | 'Z'<<16 | ' '<<24), - LUYIA = ('L' | 'U'<<8 | 'H'<<16 | ' '<<24), - MACEDONIAN = ('M' | 'K'<<8 | 'D'<<16 | ' '<<24), - MADURA = ('M' | 'A'<<8 | 'D'<<16 | ' '<<24), - MAGAHI = ('M' | 'A'<<8 | 'G'<<16 | ' '<<24), - MAITHILI = ('M' | 'T'<<8 | 'H'<<16 | ' '<<24), - MAJANG = ('M' | 'A'<<8 | 'J'<<16 | ' '<<24), - MAKASAR = ('M' | 'K'<<8 | 'R'<<16 | ' '<<24), - MAKHUWA = ('M' | 'A'<<8 | 'K'<<16 | ' '<<24), - MAKONDE = ('K' | 'D'<<8 | 'E'<<16 | ' '<<24), - MALAGASY = ('M' | 'L'<<8 | 'G'<<16 | ' '<<24), - MALAY = ('M' | 'L'<<8 | 'Y'<<16 | ' '<<24), - MALAYALAM = ('M' | 'A'<<8 | 'L'<<16 | ' '<<24), - MALAYALAM_REFORMED = ('M' | 'L'<<8 | 'R'<<16 | ' '<<24), - MALE = ('M' | 'L'<<8 | 'E'<<16 | ' '<<24), - MALINKE = ('M' | 'L'<<8 | 'N'<<16 | ' '<<24), - MALTESE = ('M' | 'T'<<8 | 'S'<<16 | ' '<<24), - MAM = ('M' | 'A'<<8 | 'M'<<16 | ' '<<24), - MANCHU = ('M' | 'C'<<8 | 'H'<<16 | ' '<<24), - MANDAR = ('M' | 'D'<<8 | 'R'<<16 | ' '<<24), - MANDINKA = ('M' | 'N'<<8 | 'D'<<16 | ' '<<24), - MANINKA = ('M' | 'N'<<8 | 'K'<<16 | ' '<<24), - MANIPURI = ('M' | 'N'<<8 | 'I'<<16 | ' '<<24), - MANO = ('M' | 'E'<<8 | 'V'<<16 | ' '<<24), - MANSI = ('M' | 'A'<<8 | 'N'<<16 | ' '<<24), - MANX = ('M' | 'N'<<8 | 'X'<<16 | ' '<<24), - MAORI = ('M' | 'R'<<8 | 'I'<<16 | ' '<<24), - MAPUDUNGUN = ('M' | 'A'<<8 | 'P'<<16 | ' '<<24), - MARATHI = ('M' | 'A'<<8 | 'R'<<16 | ' '<<24), - MARSHALLESE = ('M' | 'A'<<8 | 'H'<<16 | ' '<<24), - MARWARI = ('M' | 'A'<<8 | 'W'<<16 | ' '<<24), - MAYAN = ('M' | 'Y'<<8 | 'N'<<16 | ' '<<24), - MAZANDERANI = ('M' | 'Z'<<8 | 'N'<<16 | ' '<<24), - MBEMBE_TIGON = ('N' | 'Z'<<8 | 'A'<<16 | ' '<<24), - MBO = ('M' | 'B'<<8 | 'O'<<16 | ' '<<24), - MBUNDU = ('M' | 'B'<<8 | 'N'<<16 | ' '<<24), - MEDUMBA = ('B' | 'Y'<<8 | 'V'<<16 | ' '<<24), - MEEN = ('M' | 'E'<<8 | 'N'<<16 | ' '<<24), - MENDE = ('M' | 'D'<<8 | 'E'<<16 | ' '<<24), - MERU = ('M' | 'E'<<8 | 'R'<<16 | ' '<<24), - MEWATI = ('W' | 'T'<<8 | 'M'<<16 | ' '<<24), - MINANGKABAU = ('M' | 'I'<<8 | 'N'<<16 | ' '<<24), - MINJANGBAL = ('X' | 'J'<<8 | 'B'<<16 | ' '<<24), - MIRANDESE = ('M' | 'W'<<8 | 'L'<<16 | ' '<<24), - MIZO = ('M' | 'I'<<8 | 'Z'<<16 | ' '<<24), - MOHAWK = ('M' | 'O'<<8 | 'H'<<16 | ' '<<24), - MOKSHA = ('M' | 'O'<<8 | 'K'<<16 | ' '<<24), - MOLDAVIAN = ('M' | 'O'<<8 | 'L'<<16 | ' '<<24), - MON = ('M' | 'O'<<8 | 'N'<<16 | ' '<<24), - MONGOLIAN = ('M' | 'N'<<8 | 'G'<<16 | ' '<<24), - MOOSE_CREE = ('M' | 'C'<<8 | 'R'<<16 | ' '<<24), - MORISYEN = ('M' | 'F'<<8 | 'E'<<16 | ' '<<24), - MOROCCAN = ('M' | 'O'<<8 | 'R'<<16 | ' '<<24), - MOSSI = ('M' | 'P'<<8 | 'S'<<16 | ' '<<24), - MUNDARI = ('M' | 'U'<<8 | 'N'<<16 | ' '<<24), - MUSCOGEE = ('M' | 'U'<<8 | 'S'<<16 | ' '<<24), - N_CREE = ('N' | 'C'<<8 | 'R'<<16 | ' '<<24), - NAGA_ASSAMESE = ('N' | 'A'<<8 | 'G'<<16 | ' '<<24), - NAGARI = ('N' | 'G'<<8 | 'R'<<16 | ' '<<24), - NAHUATL = ('N' | 'A'<<8 | 'H'<<16 | ' '<<24), - NANAI = ('N' | 'A'<<8 | 'N'<<16 | ' '<<24), - NASKAPI = ('N' | 'A'<<8 | 'S'<<16 | ' '<<24), - NAURUAN = ('N' | 'A'<<8 | 'U'<<16 | ' '<<24), - NAVAJO = ('N' | 'A'<<8 | 'V'<<16 | ' '<<24), - NDAU = ('N' | 'D'<<8 | 'C'<<16 | ' '<<24), - NDEBELE = ('N' | 'D'<<8 | 'B'<<16 | ' '<<24), - NDONGA = ('N' | 'D'<<8 | 'G'<<16 | ' '<<24), - NEAPOLITAN = ('N' | 'A'<<8 | 'P'<<16 | ' '<<24), - NEPALI = ('N' | 'E'<<8 | 'P'<<16 | ' '<<24), - NEWARI = ('N' | 'E'<<8 | 'W'<<16 | ' '<<24), - NGBAKA = ('N' | 'G'<<8 | 'A'<<16 | ' '<<24), - NIGERIAN_FULFULDE = ('F' | 'U'<<8 | 'V'<<16 | ' '<<24), - NIMADI = ('N' | 'O'<<8 | 'E'<<16 | ' '<<24), - NISI = ('N' | 'I'<<8 | 'S'<<16 | ' '<<24), - NIUEAN = ('N' | 'I'<<8 | 'U'<<16 | ' '<<24), - NKO = ('N' | 'K'<<8 | 'O'<<16 | ' '<<24), - NOGAI = ('N' | 'O'<<8 | 'G'<<16 | ' '<<24), - NORFOLK = ('P' | 'I'<<8 | 'H'<<16 | ' '<<24), - NORTH_SLAVEY = ('S' | 'C'<<8 | 'S'<<16 | ' '<<24), - NORTHERN_EMBERA = ('E' | 'M'<<8 | 'P'<<16 | ' '<<24), - NORTHERN_SAMI = ('N' | 'S'<<8 | 'M'<<16 | ' '<<24), - NORTHERN_SOTHO = ('N' | 'S'<<8 | 'O'<<16 | ' '<<24), - NORTHERN_TAI = ('N' | 'T'<<8 | 'A'<<16 | ' '<<24), - NORWAY_HOUSE_CREE = ('N' | 'H'<<8 | 'C'<<16 | ' '<<24), - NORWEGIAN = ('N' | 'O'<<8 | 'R'<<16 | ' '<<24), - NORWEGIAN_NYNORSK = ('N' | 'Y'<<8 | 'N'<<16 | ' '<<24), - NOVIAL = ('N' | 'O'<<8 | 'V'<<16 | ' '<<24), - NUMANGGANG = ('N' | 'O'<<8 | 'P'<<16 | ' '<<24), - NUNAVIK_INUKTITUT = ('I' | 'N'<<8 | 'U'<<16 | ' '<<24), - NUU_CHAH_NULTH = ('N' | 'U'<<8 | 'K'<<16 | ' '<<24), - NYAMWEZI = ('N' | 'Y'<<8 | 'M'<<16 | ' '<<24), - NYANKOLE = ('N' | 'K'<<8 | 'L'<<16 | ' '<<24), - OCCITAN = ('O' | 'C'<<8 | 'I'<<16 | ' '<<24), - ODIA = ('O' | 'R'<<8 | 'I'<<16 | ' '<<24), - OJI_CREE = ('O' | 'C'<<8 | 'R'<<16 | ' '<<24), - OJIBWAY = ('O' | 'J'<<8 | 'B'<<16 | ' '<<24), - OLD_IRISH = ('S' | 'G'<<8 | 'A'<<16 | ' '<<24), - OLD_JAVANESE = ('K' | 'A'<<8 | 'W'<<16 | ' '<<24), - ONEIDA = ('O' | 'N'<<8 | 'E'<<16 | ' '<<24), - ONONDAGA = ('O' | 'N'<<8 | 'O'<<16 | ' '<<24), - OROMO = ('O' | 'R'<<8 | 'O'<<16 | ' '<<24), - OSSETIAN = ('O' | 'S'<<8 | 'S'<<16 | ' '<<24), - PA_O_KAREN = ('B' | 'L'<<8 | 'K'<<16 | ' '<<24), - PALAUAN = ('P' | 'A'<<8 | 'U'<<16 | ' '<<24), - PALAUNG = ('P' | 'L'<<8 | 'G'<<16 | ' '<<24), - PALESTINIAN_ARAMAIC = ('P' | 'A'<<8 | 'A'<<16 | ' '<<24), - PALI = ('P' | 'A'<<8 | 'L'<<16 | ' '<<24), - PALPA = ('P' | 'A'<<8 | 'P'<<16 | ' '<<24), - PAMPANGAN = ('P' | 'A'<<8 | 'M'<<16 | ' '<<24), - PANGASINAN = ('P' | 'A'<<8 | 'G'<<16 | ' '<<24), - PAPIAMENTU = ('P' | 'A'<<8 | 'P'<<16 | '0'<<24), - PASHTO = ('P' | 'A'<<8 | 'S'<<16 | ' '<<24), - PATTANI_MALAY = ('M' | 'F'<<8 | 'A'<<16 | ' '<<24), - PENNSYLVANIA_GERMAN = ('P' | 'D'<<8 | 'C'<<16 | ' '<<24), - PERSIAN = ('F' | 'A'<<8 | 'R'<<16 | ' '<<24), - PHAKE = ('P' | 'J'<<8 | 'K'<<16 | ' '<<24), - PICARD = ('P' | 'C'<<8 | 'D'<<16 | ' '<<24), - PIEMONTESE = ('P' | 'M'<<8 | 'S'<<16 | ' '<<24), - PILAGA = ('P' | 'L'<<8 | 'G'<<16 | ' '<<24), - PITE_SAMI = ('S' | 'J'<<8 | 'E'<<16 | ' '<<24), - POCOMCHI = ('P' | 'O'<<8 | 'H'<<16 | ' '<<24), - POHNPEIAN = ('P' | 'O'<<8 | 'N'<<16 | ' '<<24), - POLISH = ('P' | 'L'<<8 | 'K'<<16 | ' '<<24), - POLYTONIC_GREEK = ('P' | 'G'<<8 | 'R'<<16 | ' '<<24), - PORTUGUESE = ('P' | 'T'<<8 | 'G'<<16 | ' '<<24), - PROVENCAL = ('P' | 'R'<<8 | 'O'<<16 | ' '<<24), - PUNJABI = ('P' | 'A'<<8 | 'N'<<16 | ' '<<24), - QUECHUA = ('Q' | 'U'<<8 | 'Z'<<16 | ' '<<24), - QUECHUA_BOLIVIA = ('Q' | 'U'<<8 | 'H'<<16 | ' '<<24), - QUECHUA_ECUADOR = ('Q' | 'V'<<8 | 'I'<<16 | ' '<<24), - QUECHUA_PERU = ('Q' | 'W'<<8 | 'H'<<16 | ' '<<24), - R_CREE = ('R' | 'C'<<8 | 'R'<<16 | ' '<<24), - RAJASTHANI = ('R' | 'A'<<8 | 'J'<<16 | ' '<<24), - RAKHINE = ('A' | 'R'<<8 | 'K'<<16 | ' '<<24), - RAROTONGAN = ('R' | 'A'<<8 | 'R'<<16 | ' '<<24), - REJANG = ('R' | 'E'<<8 | 'J'<<16 | ' '<<24), - RIANG = ('R' | 'I'<<8 | 'A'<<16 | ' '<<24), - RIPUARIAN = ('K' | 'S'<<8 | 'H'<<16 | ' '<<24), - RITARUNGO = ('R' | 'I'<<8 | 'T'<<16 | ' '<<24), - ROHINGYA = ('R' | 'H'<<8 | 'G'<<16 | ' '<<24), - ROMANIAN = ('R' | 'O'<<8 | 'M'<<16 | ' '<<24), - ROMANSH = ('R' | 'M'<<8 | 'S'<<16 | ' '<<24), - ROMANY = ('R' | 'O'<<8 | 'Y'<<16 | ' '<<24), - ROTUMAN = ('R' | 'T'<<8 | 'M'<<16 | ' '<<24), - RUNDI = ('R' | 'U'<<8 | 'N'<<16 | ' '<<24), - RUSSIAN = ('R' | 'U'<<8 | 'S'<<16 | ' '<<24), - RUSSIAN_BURIAT = ('R' | 'B'<<8 | 'U'<<16 | ' '<<24), - RUSYN = ('R' | 'S'<<8 | 'Y'<<16 | ' '<<24), - SADRI = ('S' | 'A'<<8 | 'D'<<16 | ' '<<24), - SAKHA = ('Y' | 'A'<<8 | 'K'<<16 | ' '<<24), - SAMOAN = ('S' | 'M'<<8 | 'O'<<16 | ' '<<24), - SAMOGITIAN = ('S' | 'G'<<8 | 'S'<<16 | ' '<<24), - SAN_BLAS_KUNA = ('C' | 'U'<<8 | 'K'<<16 | ' '<<24), - SANGO = ('S' | 'G'<<8 | 'O'<<16 | ' '<<24), - SANSKRIT = ('S' | 'A'<<8 | 'N'<<16 | ' '<<24), - SANTALI = ('S' | 'A'<<8 | 'T'<<16 | ' '<<24), - SARAIKI = ('S' | 'R'<<8 | 'K'<<16 | ' '<<24), - SARDINIAN = ('S' | 'R'<<8 | 'D'<<16 | ' '<<24), - SASAK = ('S' | 'A'<<8 | 'S'<<16 | ' '<<24), - SATERLAND_FRISIAN = ('S' | 'T'<<8 | 'Q'<<16 | ' '<<24), - SAYISI = ('S' | 'A'<<8 | 'Y'<<16 | ' '<<24), - SCOTS = ('S' | 'C'<<8 | 'I'<<16 | ' '<<24), - SCOTTISH_GAELIC = ('G' | 'A'<<8 | 'E'<<16 | ' '<<24), - SEKOTA = ('S' | 'E'<<8 | 'J'<<16 | ' '<<24), - SELKUP = ('S' | 'E'<<8 | 'L'<<16 | ' '<<24), - SENA = ('S' | 'N'<<8 | 'A'<<16 | ' '<<24), - SENECA = ('S' | 'E'<<8 | 'E'<<16 | ' '<<24), - SERBIAN = ('S' | 'R'<<8 | 'B'<<16 | ' '<<24), - SERER = ('S' | 'R'<<8 | 'R'<<16 | ' '<<24), - SGAW_KAREN = ('K' | 'S'<<8 | 'W'<<16 | ' '<<24), - SHAN = ('S' | 'H'<<8 | 'N'<<16 | ' '<<24), - SHONA = ('S' | 'N'<<8 | 'A'<<16 | ' '<<24), - SIBE = ('S' | 'I'<<8 | 'B'<<16 | ' '<<24), - SICILIAN = ('S' | 'C'<<8 | 'N'<<16 | ' '<<24), - SIDAMO = ('S' | 'I'<<8 | 'D'<<16 | ' '<<24), - SILESIAN = ('S' | 'Z'<<8 | 'L'<<16 | ' '<<24), - SILTE_GURAGE = ('S' | 'I'<<8 | 'G'<<16 | ' '<<24), - SINDHI = ('S' | 'N'<<8 | 'D'<<16 | ' '<<24), - SINHALA = ('S' | 'N'<<8 | 'H'<<16 | ' '<<24), - SKOLT_SAMI = ('S' | 'K'<<8 | 'S'<<16 | ' '<<24), - SLAVEY = ('S' | 'L'<<8 | 'A'<<16 | ' '<<24), - SLOVAK = ('S' | 'K'<<8 | 'Y'<<16 | ' '<<24), - SLOVENIAN = ('S' | 'L'<<8 | 'V'<<16 | ' '<<24), - SMALL_FLOWERY_MIAO = ('S' | 'F'<<8 | 'M'<<16 | ' '<<24), - SODO_GURAGE = ('S' | 'O'<<8 | 'G'<<16 | ' '<<24), - SOGA = ('X' | 'O'<<8 | 'G'<<16 | ' '<<24), - SOMALI = ('S' | 'M'<<8 | 'L'<<16 | ' '<<24), - SONGE = ('S' | 'O'<<8 | 'P'<<16 | ' '<<24), - SONINKE = ('S' | 'N'<<8 | 'K'<<16 | ' '<<24), - SOUTH_SLAVEY = ('S' | 'S'<<8 | 'L'<<16 | ' '<<24), - SOUTHERN_KIWAI = ('K' | 'J'<<8 | 'D'<<16 | ' '<<24), - SOUTHERN_SAMI = ('S' | 'S'<<8 | 'M'<<16 | ' '<<24), - SOUTHERN_SOTHO = ('S' | 'O'<<8 | 'T'<<16 | ' '<<24), - SPANISH = ('E' | 'S'<<8 | 'P'<<16 | ' '<<24), - STANDARD_MOROCCAN_TAMAZIGHT = ('Z' | 'G'<<8 | 'H'<<16 | ' '<<24), - STRAITS_SALISH = ('S' | 'T'<<8 | 'R'<<16 | ' '<<24), - SUKUMA = ('S' | 'U'<<8 | 'K'<<16 | ' '<<24), - SUNDANESE = ('S' | 'U'<<8 | 'N'<<16 | ' '<<24), - SURI = ('S' | 'U'<<8 | 'R'<<16 | ' '<<24), - SUTU = ('S' | 'X'<<8 | 'T'<<16 | ' '<<24), - SVAN = ('S' | 'V'<<8 | 'A'<<16 | ' '<<24), - SWADAYA_ARAMAIC = ('S' | 'W'<<8 | 'A'<<16 | ' '<<24), - SWAHILI = ('S' | 'W'<<8 | 'K'<<16 | ' '<<24), - SWATI = ('S' | 'W'<<8 | 'Z'<<16 | ' '<<24), - SWEDISH = ('S' | 'V'<<8 | 'E'<<16 | ' '<<24), - SYLHETI = ('S' | 'Y'<<8 | 'L'<<16 | ' '<<24), - SYRIAC = ('S' | 'Y'<<8 | 'R'<<16 | ' '<<24), - SYRIAC_EASTERN = ('S' | 'Y'<<8 | 'R'<<16 | 'N'<<24), - SYRIAC_ESTRANGELA = ('S' | 'Y'<<8 | 'R'<<16 | 'E'<<24), - SYRIAC_WESTERN = ('S' | 'Y'<<8 | 'R'<<16 | 'J'<<24), - TABASARAN = ('T' | 'A'<<8 | 'B'<<16 | ' '<<24), - TACHELHIT = ('S' | 'H'<<8 | 'I'<<16 | ' '<<24), - TAGALOG = ('T' | 'G'<<8 | 'L'<<16 | ' '<<24), - TAHAGGART_TAMAHAQ = ('T' | 'H'<<8 | 'V'<<16 | ' '<<24), - TAHITIAN = ('T' | 'H'<<8 | 'T'<<16 | ' '<<24), - TAI_LAING = ('T' | 'J'<<8 | 'L'<<16 | ' '<<24), - TAJIKI = ('T' | 'A'<<8 | 'J'<<16 | ' '<<24), - TALYSH = ('T' | 'L'<<8 | 'Y'<<16 | ' '<<24), - TAMASHEK = ('T' | 'M'<<8 | 'H'<<16 | ' '<<24), - TAMASHEQ = ('T' | 'A'<<8 | 'Q'<<16 | ' '<<24), - TAMAZIGHT = ('T' | 'Z'<<8 | 'M'<<16 | ' '<<24), - TAMIL = ('T' | 'A'<<8 | 'M'<<16 | ' '<<24), - TARIFIT = ('R' | 'I'<<8 | 'F'<<16 | ' '<<24), - TATAR = ('T' | 'A'<<8 | 'T'<<16 | ' '<<24), - TAWALLAMMAT_TAMAJAQ = ('T' | 'T'<<8 | 'Q'<<16 | ' '<<24), - TAY = ('T' | 'Y'<<8 | 'Z'<<16 | ' '<<24), - TAYART_TAMAJEQ = ('T' | 'H'<<8 | 'Z'<<16 | ' '<<24), - TELUGU = ('T' | 'E'<<8 | 'L'<<16 | ' '<<24), - TEMNE = ('T' | 'M'<<8 | 'N'<<16 | ' '<<24), - TETUM = ('T' | 'E'<<8 | 'T'<<16 | ' '<<24), - TH_CREE = ('T' | 'C'<<8 | 'R'<<16 | ' '<<24), - THAI = ('T' | 'H'<<8 | 'A'<<16 | ' '<<24), - THAILAND_MON = ('M' | 'O'<<8 | 'N'<<16 | 'T'<<24), - THOMPSON = ('T' | 'H'<<8 | 'P'<<16 | ' '<<24), - TIBETAN = ('T' | 'I'<<8 | 'B'<<16 | ' '<<24), - TIGRE = ('T' | 'G'<<8 | 'R'<<16 | ' '<<24), - TIGRINYA = ('T' | 'G'<<8 | 'Y'<<16 | ' '<<24), - TIV = ('T' | 'I'<<8 | 'V'<<16 | ' '<<24), - TLINGIT = ('T' | 'L'<<8 | 'I'<<16 | ' '<<24), - TOBO = ('T' | 'B'<<8 | 'V'<<16 | ' '<<24), - TODO = ('T' | 'O'<<8 | 'D'<<16 | ' '<<24), - TOK_PISIN = ('T' | 'P'<<8 | 'I'<<16 | ' '<<24), - TOMA = ('T' | 'O'<<8 | 'D'<<16 | '0'<<24), - TONGA = ('T' | 'N'<<8 | 'G'<<16 | ' '<<24), - TONGAN = ('T' | 'G'<<8 | 'N'<<16 | ' '<<24), - TORKI = ('A' | 'Z'<<8 | 'B'<<16 | ' '<<24), - TSHANGLA = ('T' | 'S'<<8 | 'J'<<16 | ' '<<24), - TSONGA = ('T' | 'S'<<8 | 'G'<<16 | ' '<<24), - TSWANA = ('T' | 'N'<<8 | 'A'<<16 | ' '<<24), - TULU = ('T' | 'U'<<8 | 'L'<<16 | ' '<<24), - TUMBUKA = ('T' | 'U'<<8 | 'M'<<16 | ' '<<24), - TUNDRA_ENETS = ('T' | 'N'<<8 | 'E'<<16 | ' '<<24), - TURKISH = ('T' | 'R'<<8 | 'K'<<16 | ' '<<24), - TURKMEN = ('T' | 'K'<<8 | 'M'<<16 | ' '<<24), - TUROYO_ARAMAIC = ('T' | 'U'<<8 | 'A'<<16 | ' '<<24), - TUSCARORA = ('T' | 'U'<<8 | 'S'<<16 | ' '<<24), - TUVALU = ('T' | 'V'<<8 | 'L'<<16 | ' '<<24), - TUVIN = ('T' | 'U'<<8 | 'V'<<16 | ' '<<24), - TWI = ('T' | 'W'<<8 | 'I'<<16 | ' '<<24), - TZOTZIL = ('T' | 'Z'<<8 | 'O'<<16 | ' '<<24), - UDI = ('U' | 'D'<<8 | 'I'<<16 | ' '<<24), - UDMURT = ('U' | 'D'<<8 | 'M'<<16 | ' '<<24), - UKRAINIAN = ('U' | 'K'<<8 | 'R'<<16 | ' '<<24), - UMBUNDU = ('U' | 'M'<<8 | 'B'<<16 | ' '<<24), - UME_SAMI = ('S' | 'J'<<8 | 'U'<<16 | ' '<<24), - UPPER_SAXON = ('S' | 'X'<<8 | 'U'<<16 | ' '<<24), - UPPER_SORBIAN = ('U' | 'S'<<8 | 'B'<<16 | ' '<<24), - URALIC_PHONETIC = ('U' | 'P'<<8 | 'P'<<16 | ' '<<24), - URDU = ('U' | 'R'<<8 | 'D'<<16 | ' '<<24), - UYGHUR = ('U' | 'Y'<<8 | 'G'<<16 | ' '<<24), - UZBEK = ('U' | 'Z'<<8 | 'B'<<16 | ' '<<24), - VENDA = ('V' | 'E'<<8 | 'N'<<16 | ' '<<24), - VENETIAN = ('V' | 'E'<<8 | 'C'<<16 | ' '<<24), - VIETNAMESE = ('V' | 'I'<<8 | 'T'<<16 | ' '<<24), - VLAX_ROMANI = ('R' | 'M'<<8 | 'Y'<<16 | ' '<<24), - VOLAPUK = ('V' | 'O'<<8 | 'L'<<16 | ' '<<24), - VORO = ('V' | 'R'<<8 | 'O'<<16 | ' '<<24), - WA = ('W' | 'A'<<8 | ' '<<16 | ' '<<24), - WACI_GBE = ('W' | 'C'<<8 | 'I'<<16 | ' '<<24), - WAGDI = ('W' | 'A'<<8 | 'G'<<16 | ' '<<24), - WAKHI = ('W' | 'B'<<8 | 'L'<<16 | ' '<<24), - WALLOON = ('W' | 'L'<<8 | 'N'<<16 | ' '<<24), - WARAY_WARAY = ('W' | 'A'<<8 | 'R'<<16 | ' '<<24), - WAYANAD_CHETTI = ('C' | 'T'<<8 | 'T'<<16 | ' '<<24), - WAYUU = ('G' | 'U'<<8 | 'C'<<16 | ' '<<24), - WELSH = ('W' | 'E'<<8 | 'L'<<16 | ' '<<24), - WENDAT = ('W' | 'D'<<8 | 'T'<<16 | ' '<<24), - WEST_CREE = ('W' | 'C'<<8 | 'R'<<16 | ' '<<24), - WESTERN_CHAM = ('C' | 'J'<<8 | 'A'<<16 | ' '<<24), - WESTERN_KAYAH = ('K' | 'Y'<<8 | 'U'<<16 | ' '<<24), - WESTERN_PANJABI = ('P' | 'N'<<8 | 'B'<<16 | ' '<<24), - WESTERN_PWO_KAREN = ('P' | 'W'<<8 | 'O'<<16 | ' '<<24), - WOLOF = ('W' | 'L'<<8 | 'F'<<16 | ' '<<24), - WOODS_CREE = ('D' | 'C'<<8 | 'R'<<16 | ' '<<24), - WUDING_LUQUAN_YI = ('Y' | 'W'<<8 | 'Q'<<16 | ' '<<24), - WYANDOT = ('W' | 'Y'<<8 | 'N'<<16 | ' '<<24), - XHOSA = ('X' | 'H'<<8 | 'S'<<16 | ' '<<24), - Y_CREE = ('Y' | 'C'<<8 | 'R'<<16 | ' '<<24), - YAO = ('Y' | 'A'<<8 | 'O'<<16 | ' '<<24), - YAPESE = ('Y' | 'A'<<8 | 'P'<<16 | ' '<<24), - YI_CLASSIC = ('Y' | 'I'<<8 | 'C'<<16 | ' '<<24), - YI_MODERN = ('Y' | 'I'<<8 | 'M'<<16 | ' '<<24), - YIDDISH = ('J' | 'I'<<8 | 'I'<<16 | ' '<<24), - YORUBA = ('Y' | 'B'<<8 | 'A'<<16 | ' '<<24), - ZAMBOANGA_CHAVACANO = ('C' | 'B'<<8 | 'K'<<16 | ' '<<24), - ZANDE = ('Z' | 'N'<<8 | 'D'<<16 | ' '<<24), - ZARMA = ('D' | 'J'<<8 | 'R'<<16 | ' '<<24), - ZAZAKI = ('Z' | 'Z'<<8 | 'A'<<16 | ' '<<24), - ZEALANDIC = ('Z' | 'E'<<8 | 'A'<<16 | ' '<<24), - ZHUANG = ('Z' | 'H'<<8 | 'A'<<16 | ' '<<24), - ZULU = ('Z' | 'U'<<8 | 'L'<<16 | ' '<<24), + A_HMAO = 'H' | 'M'<<8 | 'D'<<16 | ' '<<24, + AARI = 'A' | 'R'<<8 | 'I'<<16 | ' '<<24, + ABAZA = 'A' | 'B'<<8 | 'A'<<16 | ' '<<24, + ABKHAZIAN = 'A' | 'B'<<8 | 'K'<<16 | ' '<<24, + ACHI = 'A' | 'C'<<8 | 'R'<<16 | ' '<<24, + ACHOLI = 'A' | 'C'<<8 | 'H'<<16 | ' '<<24, + ADYGHE = 'A' | 'D'<<8 | 'Y'<<16 | ' '<<24, + AFAR = 'A' | 'F'<<8 | 'R'<<16 | ' '<<24, + AFRIKAANS = 'A' | 'F'<<8 | 'K'<<16 | ' '<<24, + AGAW = 'A' | 'G'<<8 | 'W'<<16 | ' '<<24, + AITON = 'A' | 'I'<<8 | 'O'<<16 | ' '<<24, + AKAN = 'A' | 'K'<<8 | 'A'<<16 | ' '<<24, + ALBANIAN = 'S' | 'Q'<<8 | 'I'<<16 | ' '<<24, + ALSATIAN = 'A' | 'L'<<8 | 'S'<<16 | ' '<<24, + ALTAI = 'A' | 'L'<<8 | 'T'<<16 | ' '<<24, + ALUO = 'Y' | 'N'<<8 | 'A'<<16 | ' '<<24, + AMERICAN_PHONETIC = 'A' | 'P'<<8 | 'P'<<16 | 'H'<<24, + AMHARIC = 'A' | 'M'<<8 | 'H'<<16 | ' '<<24, + ANGLO_SAXON = 'A' | 'N'<<8 | 'G'<<16 | ' '<<24, + ARABIC = 'A' | 'R'<<8 | 'A'<<16 | ' '<<24, + ARAGONESE = 'A' | 'R'<<8 | 'G'<<16 | ' '<<24, + ARAKANESE = 'A' | 'R'<<8 | 'K'<<16 | ' '<<24, + ARAKWAL = 'R' | 'K'<<8 | 'W'<<16 | ' '<<24, + ARMENIAN = 'H' | 'Y'<<8 | 'E'<<16 | ' '<<24, + ARMENIAN_EAST = 'H' | 'Y'<<8 | 'E'<<16 | '0'<<24, + AROMANIAN = 'R' | 'U'<<8 | 'P'<<16 | ' '<<24, + ARPITAN = 'F' | 'R'<<8 | 'P'<<16 | ' '<<24, + ASSAMESE = 'A' | 'S'<<8 | 'M'<<16 | ' '<<24, + ASTURIAN = 'A' | 'S'<<8 | 'T'<<16 | ' '<<24, + ATHAPASKAN = 'A' | 'T'<<8 | 'H'<<16 | ' '<<24, + ATSINA = 'A' | 'T'<<8 | 'S'<<16 | ' '<<24, + AVAR = 'A' | 'V'<<8 | 'R'<<16 | ' '<<24, + AVATIME = 'A' | 'V'<<8 | 'N'<<16 | ' '<<24, + AWADHI = 'A' | 'W'<<8 | 'A'<<16 | ' '<<24, + AYMARA = 'A' | 'Y'<<8 | 'M'<<16 | ' '<<24, + AZERBAIDJANI = 'A' | 'Z'<<8 | 'E'<<16 | ' '<<24, + BADAGA = 'B' | 'A'<<8 | 'D'<<16 | ' '<<24, + BAGHELKHANDI = 'B' | 'A'<<8 | 'G'<<16 | ' '<<24, + BAGRI = 'B' | 'G'<<8 | 'Q'<<16 | ' '<<24, + BALANTE = 'B' | 'L'<<8 | 'N'<<16 | ' '<<24, + BALINESE = 'B' | 'A'<<8 | 'N'<<16 | ' '<<24, + BALKAR = 'B' | 'A'<<8 | 'L'<<16 | ' '<<24, + BALTI = 'B' | 'L'<<8 | 'T'<<16 | ' '<<24, + BALUCHI = 'B' | 'L'<<8 | 'I'<<16 | ' '<<24, + BAMBARA = 'B' | 'M'<<8 | 'B'<<16 | ' '<<24, + BAMILEKE = 'B' | 'M'<<8 | 'L'<<16 | ' '<<24, + BANDA = 'B' | 'A'<<8 | 'D'<<16 | '0'<<24, + BANDJALANG = 'B' | 'D'<<8 | 'Y'<<16 | ' '<<24, + BANGLA = 'B' | 'E'<<8 | 'N'<<16 | ' '<<24, + BASHKIR = 'B' | 'S'<<8 | 'H'<<16 | ' '<<24, + BASQUE = 'E' | 'U'<<8 | 'Q'<<16 | ' '<<24, + BATAK = 'B' | 'T'<<8 | 'K'<<16 | ' '<<24, + BATAK_ALAS_KLUET = 'B' | 'T'<<8 | 'Z'<<16 | ' '<<24, + BATAK_ANGKOLA = 'A' | 'K'<<8 | 'B'<<16 | ' '<<24, + BATAK_DAIRI = 'B' | 'T'<<8 | 'D'<<16 | ' '<<24, + BATAK_KARO = 'B' | 'T'<<8 | 'X'<<16 | ' '<<24, + BATAK_MANDAILING = 'B' | 'T'<<8 | 'M'<<16 | ' '<<24, + BATAK_SIMALUNGUN = 'B' | 'T'<<8 | 'S'<<16 | ' '<<24, + BATAK_TOBA = 'B' | 'B'<<8 | 'C'<<16 | ' '<<24, + BAULE = 'B' | 'A'<<8 | 'U'<<16 | ' '<<24, + BAVARIAN = 'B' | 'A'<<8 | 'R'<<16 | ' '<<24, + BELARUSIAN = 'B' | 'E'<<8 | 'L'<<16 | ' '<<24, + BEMBA = 'B' | 'E'<<8 | 'M'<<16 | ' '<<24, + BENCH = 'B' | 'C'<<8 | 'H'<<16 | ' '<<24, + BERBER = 'B' | 'B'<<8 | 'R'<<16 | ' '<<24, + BETI = 'B' | 'T'<<8 | 'I'<<16 | ' '<<24, + BETTE_KURUMA = 'X' | 'U'<<8 | 'B'<<16 | ' '<<24, + BHILI = 'B' | 'H'<<8 | 'I'<<16 | ' '<<24, + BHOJPURI = 'B' | 'H'<<8 | 'O'<<16 | ' '<<24, + BHUTANESE = 'D' | 'Z'<<8 | 'N'<<16 | ' '<<24, + BIBLE_CREE = 'B' | 'C'<<8 | 'R'<<16 | ' '<<24, + BIKOL = 'B' | 'I'<<8 | 'K'<<16 | ' '<<24, + BILEN = 'B' | 'I'<<8 | 'L'<<16 | ' '<<24, + BISHNUPRIYA_MANIPURI = 'B' | 'P'<<8 | 'Y'<<16 | ' '<<24, + BISLAMA = 'B' | 'I'<<8 | 'S'<<16 | ' '<<24, + BLACKFOOT = 'B' | 'K'<<8 | 'F'<<16 | ' '<<24, + BODO = 'B' | 'R'<<8 | 'X'<<16 | ' '<<24, + BOSNIAN = 'B' | 'O'<<8 | 'S'<<16 | ' '<<24, + BOUYEI = 'P' | 'C'<<8 | 'C'<<16 | ' '<<24, + BRAHUI = 'B' | 'R'<<8 | 'H'<<16 | ' '<<24, + BRAJ_BHASHA = 'B' | 'R'<<8 | 'I'<<16 | ' '<<24, + BRETON = 'B' | 'R'<<8 | 'E'<<16 | ' '<<24, + BUGIS = 'B' | 'U'<<8 | 'G'<<16 | ' '<<24, + BULGARIAN = 'B' | 'G'<<8 | 'R'<<16 | ' '<<24, + BUMTHANGKHA = 'K' | 'J'<<8 | 'Z'<<16 | ' '<<24, + BURMESE = 'B' | 'R'<<8 | 'M'<<16 | ' '<<24, + BURUSHASKI = 'B' | 'S'<<8 | 'K'<<16 | ' '<<24, + CAJUN_FRENCH = 'F' | 'R'<<8 | 'C'<<16 | ' '<<24, + CARRIER = 'C' | 'R'<<8 | 'R'<<16 | ' '<<24, + CATALAN = 'C' | 'A'<<8 | 'T'<<16 | ' '<<24, + CAYUGA = 'C' | 'A'<<8 | 'Y'<<16 | ' '<<24, + CEBUANO = 'C' | 'E'<<8 | 'B'<<16 | ' '<<24, + CENTRAL_YUPIK = 'E' | 'S'<<8 | 'U'<<16 | ' '<<24, + CHAHA_GURAGE = 'C' | 'H'<<8 | 'G'<<16 | ' '<<24, + CHAMORRO = 'C' | 'H'<<8 | 'A'<<16 | ' '<<24, + CHATTISGARHI = 'C' | 'H'<<8 | 'H'<<16 | ' '<<24, + CHECHEN = 'C' | 'H'<<8 | 'E'<<16 | ' '<<24, + CHEROKEE = 'C' | 'H'<<8 | 'R'<<16 | ' '<<24, + CHEYENNE = 'C' | 'H'<<8 | 'Y'<<16 | ' '<<24, + CHICHEWA = 'C' | 'H'<<8 | 'I'<<16 | ' '<<24, + CHIGA = 'C' | 'G'<<8 | 'G'<<16 | ' '<<24, + CHIMILA = 'C' | 'B'<<8 | 'G'<<16 | ' '<<24, + CHIN = 'Q' | 'I'<<8 | 'N'<<16 | ' '<<24, + CHINANTEC = 'C' | 'C'<<8 | 'H'<<16 | 'N'<<24, + CHINESE_PHONETIC = 'Z' | 'H'<<8 | 'P'<<16 | ' '<<24, + CHINESE_SIMPLIFIED = 'Z' | 'H'<<8 | 'S'<<16 | ' '<<24, + CHINESE_TRADITIONAL = 'Z' | 'H'<<8 | 'T'<<16 | ' '<<24, + CHINESE_TRADITIONAL_HONG_KONG = 'Z' | 'H'<<8 | 'H'<<16 | ' '<<24, + CHINESE_TRADITIONAL_MACAO = 'Z' | 'H'<<8 | 'T'<<16 | 'M'<<24, + CHIPEWYAN = 'C' | 'H'<<8 | 'P'<<16 | ' '<<24, + CHITTAGONIAN = 'C' | 'T'<<8 | 'G'<<16 | ' '<<24, + CHOCTAW = 'C' | 'H'<<8 | 'O'<<16 | ' '<<24, + CHUKCHI = 'C' | 'H'<<8 | 'K'<<16 | ' '<<24, + CHURCH_SLAVONIC = 'C' | 'S'<<8 | 'L'<<16 | ' '<<24, + CHUUKESE = 'C' | 'H'<<8 | 'K'<<16 | '0'<<24, + CHUVASH = 'C' | 'H'<<8 | 'U'<<16 | ' '<<24, + COMORIAN = 'C' | 'M'<<8 | 'R'<<16 | ' '<<24, + COMOX = 'C' | 'O'<<8 | 'O'<<16 | ' '<<24, + COPTIC = 'C' | 'O'<<8 | 'P'<<16 | ' '<<24, + CORNISH = 'C' | 'O'<<8 | 'R'<<16 | ' '<<24, + CORSICAN = 'C' | 'O'<<8 | 'S'<<16 | ' '<<24, + CREE = 'C' | 'R'<<8 | 'E'<<16 | ' '<<24, + CREOLES = 'C' | 'P'<<8 | 'P'<<16 | ' '<<24, + CRIMEAN_TATAR = 'C' | 'R'<<8 | 'T'<<16 | ' '<<24, + CRIOULO = 'K' | 'E'<<8 | 'A'<<16 | ' '<<24, + CROATIAN = 'H' | 'R'<<8 | 'V'<<16 | ' '<<24, + CYPRIOT_ARABIC = 'A' | 'C'<<8 | 'Y'<<16 | ' '<<24, + CZECH = 'C' | 'S'<<8 | 'Y'<<16 | ' '<<24, + DAGBANI = 'D' | 'A'<<8 | 'G'<<16 | ' '<<24, + DAN = 'D' | 'N'<<8 | 'J'<<16 | ' '<<24, + DANGME = 'D' | 'N'<<8 | 'G'<<16 | ' '<<24, + DANISH = 'D' | 'A'<<8 | 'N'<<16 | ' '<<24, + DARGWA = 'D' | 'A'<<8 | 'R'<<16 | ' '<<24, + DARI = 'D' | 'R'<<8 | 'I'<<16 | ' '<<24, + DAYI = 'D' | 'A'<<8 | 'X'<<16 | ' '<<24, + DEFAULT = 'd' | 'f'<<8 | 'l'<<16 | 't'<<24, // Can be DFLT too. + DEHONG_DAI = 'T' | 'D'<<8 | 'D'<<16 | ' '<<24, + DHANGU = 'D' | 'H'<<8 | 'G'<<16 | ' '<<24, + DHIVEHI = 'D' | 'I'<<8 | 'V'<<16 | ' '<<24, + DHUWAL = 'D' | 'U'<<8 | 'J'<<16 | ' '<<24, + DIMLI = 'D' | 'I'<<8 | 'Q'<<16 | ' '<<24, + DINKA = 'D' | 'N'<<8 | 'K'<<16 | ' '<<24, + DIVEHI = 'D' | 'I'<<8 | 'V'<<16 | ' '<<24, + DJAMBARRPUYNGU = 'D' | 'J'<<8 | 'R'<<16 | '0'<<24, + DOGRI = 'D' | 'G'<<8 | 'O'<<16 | ' '<<24, + DOGRI_MACROLANGUAGE = 'D' | 'G'<<8 | 'R'<<16 | ' '<<24, + DUNGAN = 'D' | 'U'<<8 | 'N'<<16 | ' '<<24, + DUTCH = 'N' | 'L'<<8 | 'D'<<16 | ' '<<24, + DZONGKHA = 'D' | 'Z'<<8 | 'N'<<16 | ' '<<24, + EASTERN_ABENAKI = 'A' | 'A'<<8 | 'Q'<<16 | ' '<<24, + EASTERN_CHAM = 'C' | 'J'<<8 | 'M'<<16 | ' '<<24, + EASTERN_CREE = 'E' | 'C'<<8 | 'R'<<16 | ' '<<24, + EASTERN_MANINKAKAN = 'E' | 'M'<<8 | 'K'<<16 | ' '<<24, + EASTERN_PWO_KAREN = 'K' | 'J'<<8 | 'P'<<16 | ' '<<24, + EBIRA = 'E' | 'B'<<8 | 'I'<<16 | ' '<<24, + EDO = 'E' | 'D'<<8 | 'O'<<16 | ' '<<24, + EFIK = 'E' | 'F'<<8 | 'I'<<16 | ' '<<24, + EMBERA_BAUDO = 'B' | 'D'<<8 | 'C'<<16 | ' '<<24, + EMBERA_CATIO = 'C' | 'T'<<8 | 'O'<<16 | ' '<<24, + EMBERA_CHAMI = 'C' | 'M'<<8 | 'I'<<16 | ' '<<24, + EMBERA_TADO = 'T' | 'D'<<8 | 'C'<<16 | ' '<<24, + ENGLISH = 'E' | 'N'<<8 | 'G'<<16 | ' '<<24, + EPENA = 'S' | 'J'<<8 | 'A'<<16 | ' '<<24, + ERZYA = 'E' | 'R'<<8 | 'Z'<<16 | ' '<<24, + KB_TEXT_SHAPEANTO = 'N' | 'T'<<8 | 'O'<<16 | ' '<<24, + ESTONIAN = 'E' | 'T'<<8 | 'I'<<16 | ' '<<24, + EVEN = 'E' | 'V'<<8 | 'N'<<16 | ' '<<24, + EVENKI = 'E' | 'V'<<8 | 'K'<<16 | ' '<<24, + EWE = 'E' | 'W'<<8 | 'E'<<16 | ' '<<24, + FALAM_CHIN = 'H' | 'A'<<8 | 'L'<<16 | ' '<<24, + FANG = 'F' | 'A'<<8 | 'N'<<16 | '0'<<24, + FANTI = 'F' | 'A'<<8 | 'T'<<16 | ' '<<24, + FAROESE = 'F' | 'O'<<8 | 'S'<<16 | ' '<<24, + FEFE = 'F' | 'M'<<8 | 'P'<<16 | ' '<<24, + FIJIAN = 'F' | 'J'<<8 | 'I'<<16 | ' '<<24, + FILIPINO = 'P' | 'I'<<8 | 'L'<<16 | ' '<<24, + FINNISH = 'F' | 'I'<<8 | 'N'<<16 | ' '<<24, + FLEMISH = 'F' | 'L'<<8 | 'E'<<16 | ' '<<24, + FON = 'F' | 'O'<<8 | 'N'<<16 | ' '<<24, + FOREST_ENETS = 'F' | 'N'<<8 | 'E'<<16 | ' '<<24, + FRENCH = 'F' | 'R'<<8 | 'A'<<16 | ' '<<24, + FRENCH_ANTILLEAN = 'F' | 'A'<<8 | 'N'<<16 | ' '<<24, + FRISIAN = 'F' | 'R'<<8 | 'I'<<16 | ' '<<24, + FRIULIAN = 'F' | 'R'<<8 | 'L'<<16 | ' '<<24, + FULAH = 'F' | 'U'<<8 | 'L'<<16 | ' '<<24, + FUTA = 'F' | 'T'<<8 | 'A'<<16 | ' '<<24, + GA = 'G' | 'A'<<8 | 'D'<<16 | ' '<<24, + GAGAUZ = 'G' | 'A'<<8 | 'G'<<16 | ' '<<24, + GALICIAN = 'G' | 'A'<<8 | 'L'<<16 | ' '<<24, + GANDA = 'L' | 'U'<<8 | 'G'<<16 | ' '<<24, + GARHWALI = 'G' | 'A'<<8 | 'W'<<16 | ' '<<24, + GARO = 'G' | 'R'<<8 | 'O'<<16 | ' '<<24, + GARSHUNI = 'G' | 'A'<<8 | 'R'<<16 | ' '<<24, + GEBA_KAREN = 'K' | 'V'<<8 | 'Q'<<16 | ' '<<24, + GEEZ = 'G' | 'E'<<8 | 'Z'<<16 | ' '<<24, + GEORGIAN = 'K' | 'A'<<8 | 'T'<<16 | ' '<<24, + GEPO = 'Y' | 'G'<<8 | 'P'<<16 | ' '<<24, + GERMAN = 'D' | 'E'<<8 | 'U'<<16 | ' '<<24, + GIKUYU = 'K' | 'I'<<8 | 'K'<<16 | ' '<<24, + GILAKI = 'G' | 'L'<<8 | 'K'<<16 | ' '<<24, + GILBERTESE = 'G' | 'I'<<8 | 'L'<<16 | '0'<<24, + GILYAK = 'G' | 'I'<<8 | 'L'<<16 | ' '<<24, + GITHABUL = 'G' | 'I'<<8 | 'H'<<16 | ' '<<24, + GOGO = 'G' | 'O'<<8 | 'G'<<16 | ' '<<24, + GONDI = 'G' | 'O'<<8 | 'N'<<16 | ' '<<24, + GREEK = 'E' | 'L'<<8 | 'L'<<16 | ' '<<24, + GREENLANDIC = 'G' | 'R'<<8 | 'N'<<16 | ' '<<24, + GUARANI = 'G' | 'U'<<8 | 'A'<<16 | ' '<<24, + GUINEA = 'G' | 'K'<<8 | 'P'<<16 | ' '<<24, + GUJARATI = 'G' | 'U'<<8 | 'J'<<16 | ' '<<24, + GUMATJ = 'G' | 'N'<<8 | 'N'<<16 | ' '<<24, + GUMUZ = 'G' | 'M'<<8 | 'Z'<<16 | ' '<<24, + GUPAPUYNGU = 'G' | 'U'<<8 | 'F'<<16 | ' '<<24, + GUSII = 'G' | 'U'<<8 | 'Z'<<16 | ' '<<24, + HAIDA = 'H' | 'A'<<8 | 'I'<<16 | '0'<<24, + HAITIAN_CREOLE = 'H' | 'A'<<8 | 'I'<<16 | ' '<<24, + HALKOMELEM = 'H' | 'U'<<8 | 'R'<<16 | ' '<<24, + HAMMER_BANNA = 'H' | 'B'<<8 | 'N'<<16 | ' '<<24, + HARARI = 'H' | 'R'<<8 | 'I'<<16 | ' '<<24, + HARAUTI = 'H' | 'A'<<8 | 'R'<<16 | ' '<<24, + HARYANVI = 'B' | 'G'<<8 | 'C'<<16 | ' '<<24, + HAUSA = 'H' | 'A'<<8 | 'U'<<16 | ' '<<24, + HAVASUPAI_WALAPAI_YAVAPAI = 'Y' | 'U'<<8 | 'F'<<16 | ' '<<24, + HAWAIIAN = 'H' | 'A'<<8 | 'W'<<16 | ' '<<24, + HAYA = 'H' | 'A'<<8 | 'Y'<<16 | ' '<<24, + HAZARAGI = 'H' | 'A'<<8 | 'Z'<<16 | ' '<<24, + HEBREW = 'I' | 'W'<<8 | 'R'<<16 | ' '<<24, + HEILTSUK = 'H' | 'E'<<8 | 'I'<<16 | ' '<<24, + HERERO = 'H' | 'E'<<8 | 'R'<<16 | ' '<<24, + HIGH_MARI = 'H' | 'M'<<8 | 'A'<<16 | ' '<<24, + HILIGAYNON = 'H' | 'I'<<8 | 'L'<<16 | ' '<<24, + HINDI = 'H' | 'I'<<8 | 'N'<<16 | ' '<<24, + HINDKO = 'H' | 'N'<<8 | 'D'<<16 | ' '<<24, + HIRI_MOTU = 'H' | 'M'<<8 | 'O'<<16 | ' '<<24, + HMONG = 'H' | 'M'<<8 | 'N'<<16 | ' '<<24, + HMONG_DAW = 'M' | 'W'<<8 | 'W'<<16 | ' '<<24, + HMONG_SHUAT = 'H' | 'M'<<8 | 'Z'<<16 | ' '<<24, + HO = 'H' | 'O'<<8 | ' '<<16 | ' '<<24, + HUNGARIAN = 'H' | 'U'<<8 | 'N'<<16 | ' '<<24, + IBAN = 'I' | 'B'<<8 | 'A'<<16 | ' '<<24, + IBIBIO = 'I' | 'B'<<8 | 'B'<<16 | ' '<<24, + ICELANDIC = 'I' | 'S'<<8 | 'L'<<16 | ' '<<24, + IDO = 'I' | 'D'<<8 | 'O'<<16 | ' '<<24, + IGBO = 'I' | 'B'<<8 | 'O'<<16 | ' '<<24, + IJO = 'I' | 'J'<<8 | 'O'<<16 | ' '<<24, + ILOKANO = 'I' | 'L'<<8 | 'O'<<16 | ' '<<24, + INARI_SAMI = 'I' | 'S'<<8 | 'M'<<16 | ' '<<24, + INDONESIAN = 'I' | 'N'<<8 | 'D'<<16 | ' '<<24, + INGUSH = 'I' | 'N'<<8 | 'G'<<16 | ' '<<24, + INTERLINGUA = 'I' | 'N'<<8 | 'A'<<16 | ' '<<24, + INTERLINGUE = 'I' | 'L'<<8 | 'E'<<16 | ' '<<24, + INUKTITUT = 'I' | 'N'<<8 | 'U'<<16 | ' '<<24, + INUPIAT = 'I' | 'P'<<8 | 'K'<<16 | ' '<<24, + IPA_PHONETIC = 'I' | 'P'<<8 | 'P'<<16 | ' '<<24, + IRISH = 'I' | 'R'<<8 | 'I'<<16 | ' '<<24, + IRISH_TRADITIONAL = 'I' | 'R'<<8 | 'T'<<16 | ' '<<24, + IRULA = 'I' | 'R'<<8 | 'U'<<16 | ' '<<24, + ITALIAN = 'I' | 'T'<<8 | 'A'<<16 | ' '<<24, + JAMAICAN_CREOLE = 'J' | 'A'<<8 | 'M'<<16 | ' '<<24, + JAPANESE = 'J' | 'A'<<8 | 'N'<<16 | ' '<<24, + JAVANESE = 'J' | 'A'<<8 | 'V'<<16 | ' '<<24, + JENNU_KURUMA = 'X' | 'U'<<8 | 'J'<<16 | ' '<<24, + JUDEO_TAT = 'J' | 'D'<<8 | 'T'<<16 | ' '<<24, + JULA = 'J' | 'U'<<8 | 'L'<<16 | ' '<<24, + KABARDIAN = 'K' | 'A'<<8 | 'B'<<16 | ' '<<24, + KABYLE = 'K' | 'A'<<8 | 'B'<<16 | '0'<<24, + KACHCHI = 'K' | 'A'<<8 | 'C'<<16 | ' '<<24, + KADIWEU = 'K' | 'B'<<8 | 'C'<<16 | ' '<<24, + KALENJIN = 'K' | 'A'<<8 | 'L'<<16 | ' '<<24, + KALMYK = 'K' | 'L'<<8 | 'M'<<16 | ' '<<24, + KAMBA = 'K' | 'M'<<8 | 'B'<<16 | ' '<<24, + KANAUJI = 'B' | 'J'<<8 | 'J'<<16 | ' '<<24, + KANNADA = 'K' | 'A'<<8 | 'N'<<16 | ' '<<24, + KANURI = 'K' | 'N'<<8 | 'R'<<16 | ' '<<24, + KAQCHIKEL = 'C' | 'A'<<8 | 'K'<<16 | ' '<<24, + KARACHAY = 'K' | 'A'<<8 | 'R'<<16 | ' '<<24, + KARAIM = 'K' | 'R'<<8 | 'M'<<16 | ' '<<24, + KARAKALPAK = 'K' | 'R'<<8 | 'K'<<16 | ' '<<24, + KARELIAN = 'K' | 'R'<<8 | 'L'<<16 | ' '<<24, + KAREN = 'K' | 'R'<<8 | 'N'<<16 | ' '<<24, + KASHMIRI = 'K' | 'S'<<8 | 'H'<<16 | ' '<<24, + KASHUBIAN = 'C' | 'S'<<8 | 'B'<<16 | ' '<<24, + KATE = 'K' | 'M'<<8 | 'G'<<16 | ' '<<24, + KAZAKH = 'K' | 'A'<<8 | 'Z'<<16 | ' '<<24, + KEBENA = 'K' | 'E'<<8 | 'B'<<16 | ' '<<24, + KEKCHI = 'K' | 'E'<<8 | 'K'<<16 | ' '<<24, + KHAKASS = 'K' | 'H'<<8 | 'A'<<16 | ' '<<24, + KHAMTI_SHAN = 'K' | 'H'<<8 | 'T'<<16 | ' '<<24, + KHAMYANG = 'K' | 'S'<<8 | 'U'<<16 | ' '<<24, + KHANTY_KAZIM = 'K' | 'H'<<8 | 'K'<<16 | ' '<<24, + KHANTY_SHURISHKAR = 'K' | 'H'<<8 | 'S'<<16 | ' '<<24, + KHANTY_VAKHI = 'K' | 'H'<<8 | 'V'<<16 | ' '<<24, + KHASI = 'K' | 'S'<<8 | 'I'<<16 | ' '<<24, + KHENGKHA = 'X' | 'K'<<8 | 'F'<<16 | ' '<<24, + KHINALUG = 'K' | 'J'<<8 | 'J'<<16 | ' '<<24, + KHMER = 'K' | 'H'<<8 | 'M'<<16 | ' '<<24, + KHORASANI_TURKIC = 'K' | 'M'<<8 | 'Z'<<16 | ' '<<24, + KHOWAR = 'K' | 'H'<<8 | 'W'<<16 | ' '<<24, + KHUTSURI_GEORGIAN = 'K' | 'G'<<8 | 'E'<<16 | ' '<<24, + KICHE = 'Q' | 'U'<<8 | 'C'<<16 | ' '<<24, + KIKONGO = 'K' | 'O'<<8 | 'N'<<16 | ' '<<24, + KILDIN_SAMI = 'K' | 'S'<<8 | 'M'<<16 | ' '<<24, + KINYARWANDA = 'R' | 'U'<<8 | 'A'<<16 | ' '<<24, + KIRMANJKI = 'K' | 'I'<<8 | 'U'<<16 | ' '<<24, + KISII = 'K' | 'I'<<8 | 'S'<<16 | ' '<<24, + KITUBA = 'M' | 'K'<<8 | 'W'<<16 | ' '<<24, + KODAGU = 'K' | 'O'<<8 | 'D'<<16 | ' '<<24, + KOKNI = 'K' | 'K'<<8 | 'N'<<16 | ' '<<24, + KOMI = 'K' | 'O'<<8 | 'M'<<16 | ' '<<24, + KOMI_PERMYAK = 'K' | 'O'<<8 | 'P'<<16 | ' '<<24, + KOMI_ZYRIAN = 'K' | 'O'<<8 | 'Z'<<16 | ' '<<24, + KOMO = 'K' | 'M'<<8 | 'O'<<16 | ' '<<24, + KOMSO = 'K' | 'M'<<8 | 'S'<<16 | ' '<<24, + KONGO = 'K' | 'O'<<8 | 'N'<<16 | '0'<<24, + KONKANI = 'K' | 'O'<<8 | 'K'<<16 | ' '<<24, + KOORETE = 'K' | 'R'<<8 | 'T'<<16 | ' '<<24, + KOREAN = 'K' | 'O'<<8 | 'R'<<16 | ' '<<24, + KOREAO_OLD_HANGUL = 'K' | 'O'<<8 | 'H'<<16 | ' '<<24, + KORYAK = 'K' | 'Y'<<8 | 'K'<<16 | ' '<<24, + KOSRAEAN = 'K' | 'O'<<8 | 'S'<<16 | ' '<<24, + KPELLE = 'K' | 'P'<<8 | 'L'<<16 | ' '<<24, + KPELLE_LIBERIA = 'X' | 'P'<<8 | 'E'<<16 | ' '<<24, + KRIO = 'K' | 'R'<<8 | 'I'<<16 | ' '<<24, + KRYMCHAK = 'J' | 'C'<<8 | 'T'<<16 | ' '<<24, + KUANYAMA = 'K' | 'U'<<8 | 'A'<<16 | ' '<<24, + KUBE = 'K' | 'G'<<8 | 'F'<<16 | ' '<<24, + KUI = 'K' | 'U'<<8 | 'I'<<16 | ' '<<24, + KULVI = 'K' | 'U'<<8 | 'K'<<16 | ' '<<24, + KUMAONI = 'K' | 'M'<<8 | 'N'<<16 | ' '<<24, + KUMYK = 'K' | 'U'<<8 | 'M'<<16 | ' '<<24, + KURDISH = 'K' | 'U'<<8 | 'R'<<16 | ' '<<24, + KURUKH = 'K' | 'U'<<8 | 'U'<<16 | ' '<<24, + KUY = 'K' | 'U'<<8 | 'Y'<<16 | ' '<<24, + KWAKWALA = 'K' | 'W'<<8 | 'K'<<16 | ' '<<24, + KYRGYZ = 'K' | 'I'<<8 | 'R'<<16 | ' '<<24, + L_CREE = 'L' | 'C'<<8 | 'R'<<16 | ' '<<24, + LADAKHI = 'L' | 'D'<<8 | 'K'<<16 | ' '<<24, + LADIN = 'L' | 'A'<<8 | 'D'<<16 | ' '<<24, + LADINO = 'J' | 'U'<<8 | 'D'<<16 | ' '<<24, + LAHULI = 'L' | 'A'<<8 | 'H'<<16 | ' '<<24, + LAK = 'L' | 'A'<<8 | 'K'<<16 | ' '<<24, + LAKI = 'L' | 'K'<<8 | 'I'<<16 | ' '<<24, + LAMBANI = 'L' | 'A'<<8 | 'M'<<16 | ' '<<24, + LAMPUNG = 'L' | 'J'<<8 | 'P'<<16 | ' '<<24, + LAO = 'L' | 'A'<<8 | 'O'<<16 | ' '<<24, + LATIN = 'L' | 'A'<<8 | 'T'<<16 | ' '<<24, + LATVIAN = 'L' | 'V'<<8 | 'I'<<16 | ' '<<24, + LAZ = 'L' | 'A'<<8 | 'Z'<<16 | ' '<<24, + LELEMI = 'L' | 'E'<<8 | 'F'<<16 | ' '<<24, + LEZGI = 'L' | 'E'<<8 | 'Z'<<16 | ' '<<24, + LIGURIAN = 'L' | 'I'<<8 | 'J'<<16 | ' '<<24, + LIMBU = 'L' | 'M'<<8 | 'B'<<16 | ' '<<24, + LIMBURGISH = 'L' | 'I'<<8 | 'M'<<16 | ' '<<24, + LINGALA = 'L' | 'I'<<8 | 'N'<<16 | ' '<<24, + LIPO = 'L' | 'P'<<8 | 'O'<<16 | ' '<<24, + LISU = 'L' | 'I'<<8 | 'S'<<16 | ' '<<24, + LITHUANIAN = 'L' | 'T'<<8 | 'H'<<16 | ' '<<24, + LIV = 'L' | 'I'<<8 | 'V'<<16 | ' '<<24, + LOJBAN = 'J' | 'B'<<8 | 'O'<<16 | ' '<<24, + LOMA = 'L' | 'O'<<8 | 'M'<<16 | ' '<<24, + LOMBARD = 'L' | 'M'<<8 | 'O'<<16 | ' '<<24, + LOMWE = 'L' | 'M'<<8 | 'W'<<16 | ' '<<24, + LOW_MARI = 'L' | 'M'<<8 | 'A'<<16 | ' '<<24, + LOW_SAXON = 'N' | 'D'<<8 | 'S'<<16 | ' '<<24, + LOWER_SORBIAN = 'L' | 'S'<<8 | 'B'<<16 | ' '<<24, + LU = 'X' | 'B'<<8 | 'D'<<16 | ' '<<24, + LUBA_KATANGA = 'L' | 'U'<<8 | 'B'<<16 | ' '<<24, + LUBA_LULUA = 'L' | 'U'<<8 | 'A'<<16 | ' '<<24, + LULE_SAMI = 'L' | 'S'<<8 | 'M'<<16 | ' '<<24, + LUO = 'L' | 'U'<<8 | 'O'<<16 | ' '<<24, + LURI = 'L' | 'R'<<8 | 'C'<<16 | ' '<<24, + LUSHOOTSEED = 'L' | 'U'<<8 | 'T'<<16 | ' '<<24, + LUXEMBOURGISH = 'L' | 'T'<<8 | 'Z'<<16 | ' '<<24, + LUYIA = 'L' | 'U'<<8 | 'H'<<16 | ' '<<24, + MACEDONIAN = 'M' | 'K'<<8 | 'D'<<16 | ' '<<24, + MADURA = 'M' | 'A'<<8 | 'D'<<16 | ' '<<24, + MAGAHI = 'M' | 'A'<<8 | 'G'<<16 | ' '<<24, + MAITHILI = 'M' | 'T'<<8 | 'H'<<16 | ' '<<24, + MAJANG = 'M' | 'A'<<8 | 'J'<<16 | ' '<<24, + MAKASAR = 'M' | 'K'<<8 | 'R'<<16 | ' '<<24, + MAKHUWA = 'M' | 'A'<<8 | 'K'<<16 | ' '<<24, + MAKONDE = 'K' | 'D'<<8 | 'E'<<16 | ' '<<24, + MALAGASY = 'M' | 'L'<<8 | 'G'<<16 | ' '<<24, + MALAY = 'M' | 'L'<<8 | 'Y'<<16 | ' '<<24, + MALAYALAM = 'M' | 'A'<<8 | 'L'<<16 | ' '<<24, + MALAYALAM_REFORMED = 'M' | 'L'<<8 | 'R'<<16 | ' '<<24, + MALE = 'M' | 'L'<<8 | 'E'<<16 | ' '<<24, + MALINKE = 'M' | 'L'<<8 | 'N'<<16 | ' '<<24, + MALTESE = 'M' | 'T'<<8 | 'S'<<16 | ' '<<24, + MAM = 'M' | 'A'<<8 | 'M'<<16 | ' '<<24, + MANCHU = 'M' | 'C'<<8 | 'H'<<16 | ' '<<24, + MANDAR = 'M' | 'D'<<8 | 'R'<<16 | ' '<<24, + MANDINKA = 'M' | 'N'<<8 | 'D'<<16 | ' '<<24, + MANINKA = 'M' | 'N'<<8 | 'K'<<16 | ' '<<24, + MANIPURI = 'M' | 'N'<<8 | 'I'<<16 | ' '<<24, + MANO = 'M' | 'E'<<8 | 'V'<<16 | ' '<<24, + MANSI = 'M' | 'A'<<8 | 'N'<<16 | ' '<<24, + MANX = 'M' | 'N'<<8 | 'X'<<16 | ' '<<24, + MAORI = 'M' | 'R'<<8 | 'I'<<16 | ' '<<24, + MAPUDUNGUN = 'M' | 'A'<<8 | 'P'<<16 | ' '<<24, + MARATHI = 'M' | 'A'<<8 | 'R'<<16 | ' '<<24, + MARSHALLESE = 'M' | 'A'<<8 | 'H'<<16 | ' '<<24, + MARWARI = 'M' | 'A'<<8 | 'W'<<16 | ' '<<24, + MAYAN = 'M' | 'Y'<<8 | 'N'<<16 | ' '<<24, + MAZANDERANI = 'M' | 'Z'<<8 | 'N'<<16 | ' '<<24, + MBEMBE_TIGON = 'N' | 'Z'<<8 | 'A'<<16 | ' '<<24, + MBO = 'M' | 'B'<<8 | 'O'<<16 | ' '<<24, + MBUNDU = 'M' | 'B'<<8 | 'N'<<16 | ' '<<24, + MEDUMBA = 'B' | 'Y'<<8 | 'V'<<16 | ' '<<24, + MEEN = 'M' | 'E'<<8 | 'N'<<16 | ' '<<24, + MENDE = 'M' | 'D'<<8 | 'E'<<16 | ' '<<24, + MERU = 'M' | 'E'<<8 | 'R'<<16 | ' '<<24, + MEWATI = 'W' | 'T'<<8 | 'M'<<16 | ' '<<24, + MINANGKABAU = 'M' | 'I'<<8 | 'N'<<16 | ' '<<24, + MINJANGBAL = 'X' | 'J'<<8 | 'B'<<16 | ' '<<24, + MIRANDESE = 'M' | 'W'<<8 | 'L'<<16 | ' '<<24, + MIZO = 'M' | 'I'<<8 | 'Z'<<16 | ' '<<24, + MOHAWK = 'M' | 'O'<<8 | 'H'<<16 | ' '<<24, + MOKSHA = 'M' | 'O'<<8 | 'K'<<16 | ' '<<24, + MOLDAVIAN = 'M' | 'O'<<8 | 'L'<<16 | ' '<<24, + MON = 'M' | 'O'<<8 | 'N'<<16 | ' '<<24, + MONGOLIAN = 'M' | 'N'<<8 | 'G'<<16 | ' '<<24, + MOOSE_CREE = 'M' | 'C'<<8 | 'R'<<16 | ' '<<24, + MORISYEN = 'M' | 'F'<<8 | 'E'<<16 | ' '<<24, + MOROCCAN = 'M' | 'O'<<8 | 'R'<<16 | ' '<<24, + MOSSI = 'M' | 'P'<<8 | 'S'<<16 | ' '<<24, + MUNDARI = 'M' | 'U'<<8 | 'N'<<16 | ' '<<24, + MUSCOGEE = 'M' | 'U'<<8 | 'S'<<16 | ' '<<24, + N_CREE = 'N' | 'C'<<8 | 'R'<<16 | ' '<<24, + NAGA_ASSAMESE = 'N' | 'A'<<8 | 'G'<<16 | ' '<<24, + NAGARI = 'N' | 'G'<<8 | 'R'<<16 | ' '<<24, + NAHUATL = 'N' | 'A'<<8 | 'H'<<16 | ' '<<24, + NANAI = 'N' | 'A'<<8 | 'N'<<16 | ' '<<24, + NASKAPI = 'N' | 'A'<<8 | 'S'<<16 | ' '<<24, + NAURUAN = 'N' | 'A'<<8 | 'U'<<16 | ' '<<24, + NAVAJO = 'N' | 'A'<<8 | 'V'<<16 | ' '<<24, + NDAU = 'N' | 'D'<<8 | 'C'<<16 | ' '<<24, + NDEBELE = 'N' | 'D'<<8 | 'B'<<16 | ' '<<24, + NDONGA = 'N' | 'D'<<8 | 'G'<<16 | ' '<<24, + NEAPOLITAN = 'N' | 'A'<<8 | 'P'<<16 | ' '<<24, + NEPALI = 'N' | 'E'<<8 | 'P'<<16 | ' '<<24, + NEWARI = 'N' | 'E'<<8 | 'W'<<16 | ' '<<24, + NGBAKA = 'N' | 'G'<<8 | 'A'<<16 | ' '<<24, + NIGERIAN_FULFULDE = 'F' | 'U'<<8 | 'V'<<16 | ' '<<24, + NIMADI = 'N' | 'O'<<8 | 'E'<<16 | ' '<<24, + NISI = 'N' | 'I'<<8 | 'S'<<16 | ' '<<24, + NIUEAN = 'N' | 'I'<<8 | 'U'<<16 | ' '<<24, + NKO = 'N' | 'K'<<8 | 'O'<<16 | ' '<<24, + NOGAI = 'N' | 'O'<<8 | 'G'<<16 | ' '<<24, + NORFOLK = 'P' | 'I'<<8 | 'H'<<16 | ' '<<24, + NORTH_SLAVEY = 'S' | 'C'<<8 | 'S'<<16 | ' '<<24, + NORTHERN_EMBERA = 'E' | 'M'<<8 | 'P'<<16 | ' '<<24, + NORTHERN_SAMI = 'N' | 'S'<<8 | 'M'<<16 | ' '<<24, + NORTHERN_SOTHO = 'N' | 'S'<<8 | 'O'<<16 | ' '<<24, + NORTHERN_TAI = 'N' | 'T'<<8 | 'A'<<16 | ' '<<24, + NORWAY_HOUSE_CREE = 'N' | 'H'<<8 | 'C'<<16 | ' '<<24, + NORWEGIAN = 'N' | 'O'<<8 | 'R'<<16 | ' '<<24, + NORWEGIAN_NYNORSK = 'N' | 'Y'<<8 | 'N'<<16 | ' '<<24, + NOVIAL = 'N' | 'O'<<8 | 'V'<<16 | ' '<<24, + NUMANGGANG = 'N' | 'O'<<8 | 'P'<<16 | ' '<<24, + NUNAVIK_INUKTITUT = 'I' | 'N'<<8 | 'U'<<16 | ' '<<24, + NUU_CHAH_NULTH = 'N' | 'U'<<8 | 'K'<<16 | ' '<<24, + NYAMWEZI = 'N' | 'Y'<<8 | 'M'<<16 | ' '<<24, + NYANKOLE = 'N' | 'K'<<8 | 'L'<<16 | ' '<<24, + OCCITAN = 'O' | 'C'<<8 | 'I'<<16 | ' '<<24, + ODIA = 'O' | 'R'<<8 | 'I'<<16 | ' '<<24, + OJI_CREE = 'O' | 'C'<<8 | 'R'<<16 | ' '<<24, + OJIBWAY = 'O' | 'J'<<8 | 'B'<<16 | ' '<<24, + OLD_IRISH = 'S' | 'G'<<8 | 'A'<<16 | ' '<<24, + OLD_JAVANESE = 'K' | 'A'<<8 | 'W'<<16 | ' '<<24, + ONEIDA = 'O' | 'N'<<8 | 'E'<<16 | ' '<<24, + ONONDAGA = 'O' | 'N'<<8 | 'O'<<16 | ' '<<24, + OROMO = 'O' | 'R'<<8 | 'O'<<16 | ' '<<24, + OSSETIAN = 'O' | 'S'<<8 | 'S'<<16 | ' '<<24, + PA_O_KAREN = 'B' | 'L'<<8 | 'K'<<16 | ' '<<24, + PALAUAN = 'P' | 'A'<<8 | 'U'<<16 | ' '<<24, + PALAUNG = 'P' | 'L'<<8 | 'G'<<16 | ' '<<24, + PALESTINIAN_ARAMAIC = 'P' | 'A'<<8 | 'A'<<16 | ' '<<24, + PALI = 'P' | 'A'<<8 | 'L'<<16 | ' '<<24, + PALPA = 'P' | 'A'<<8 | 'P'<<16 | ' '<<24, + PAMPANGAN = 'P' | 'A'<<8 | 'M'<<16 | ' '<<24, + PANGASINAN = 'P' | 'A'<<8 | 'G'<<16 | ' '<<24, + PAPIAMENTU = 'P' | 'A'<<8 | 'P'<<16 | '0'<<24, + PASHTO = 'P' | 'A'<<8 | 'S'<<16 | ' '<<24, + PATTANI_MALAY = 'M' | 'F'<<8 | 'A'<<16 | ' '<<24, + PENNSYLVANIA_GERMAN = 'P' | 'D'<<8 | 'C'<<16 | ' '<<24, + PERSIAN = 'F' | 'A'<<8 | 'R'<<16 | ' '<<24, + PHAKE = 'P' | 'J'<<8 | 'K'<<16 | ' '<<24, + PICARD = 'P' | 'C'<<8 | 'D'<<16 | ' '<<24, + PIEMONTESE = 'P' | 'M'<<8 | 'S'<<16 | ' '<<24, + PILAGA = 'P' | 'L'<<8 | 'G'<<16 | ' '<<24, + PITE_SAMI = 'S' | 'J'<<8 | 'E'<<16 | ' '<<24, + POCOMCHI = 'P' | 'O'<<8 | 'H'<<16 | ' '<<24, + POHNPEIAN = 'P' | 'O'<<8 | 'N'<<16 | ' '<<24, + POLISH = 'P' | 'L'<<8 | 'K'<<16 | ' '<<24, + POLYTONIC_GREEK = 'P' | 'G'<<8 | 'R'<<16 | ' '<<24, + PORTUGUESE = 'P' | 'T'<<8 | 'G'<<16 | ' '<<24, + PROVENCAL = 'P' | 'R'<<8 | 'O'<<16 | ' '<<24, + PUNJABI = 'P' | 'A'<<8 | 'N'<<16 | ' '<<24, + QUECHUA = 'Q' | 'U'<<8 | 'Z'<<16 | ' '<<24, + QUECHUA_BOLIVIA = 'Q' | 'U'<<8 | 'H'<<16 | ' '<<24, + QUECHUA_ECUADOR = 'Q' | 'V'<<8 | 'I'<<16 | ' '<<24, + QUECHUA_PERU = 'Q' | 'W'<<8 | 'H'<<16 | ' '<<24, + R_CREE = 'R' | 'C'<<8 | 'R'<<16 | ' '<<24, + RAJASTHANI = 'R' | 'A'<<8 | 'J'<<16 | ' '<<24, + RAKHINE = 'A' | 'R'<<8 | 'K'<<16 | ' '<<24, + RAROTONGAN = 'R' | 'A'<<8 | 'R'<<16 | ' '<<24, + REJANG = 'R' | 'E'<<8 | 'J'<<16 | ' '<<24, + RIANG = 'R' | 'I'<<8 | 'A'<<16 | ' '<<24, + RIPUARIAN = 'K' | 'S'<<8 | 'H'<<16 | ' '<<24, + RITARUNGO = 'R' | 'I'<<8 | 'T'<<16 | ' '<<24, + ROHINGYA = 'R' | 'H'<<8 | 'G'<<16 | ' '<<24, + ROMANIAN = 'R' | 'O'<<8 | 'M'<<16 | ' '<<24, + ROMANSH = 'R' | 'M'<<8 | 'S'<<16 | ' '<<24, + ROMANY = 'R' | 'O'<<8 | 'Y'<<16 | ' '<<24, + ROTUMAN = 'R' | 'T'<<8 | 'M'<<16 | ' '<<24, + RUNDI = 'R' | 'U'<<8 | 'N'<<16 | ' '<<24, + RUSSIAN = 'R' | 'U'<<8 | 'S'<<16 | ' '<<24, + RUSSIAN_BURIAT = 'R' | 'B'<<8 | 'U'<<16 | ' '<<24, + RUSYN = 'R' | 'S'<<8 | 'Y'<<16 | ' '<<24, + SADRI = 'S' | 'A'<<8 | 'D'<<16 | ' '<<24, + SAKHA = 'Y' | 'A'<<8 | 'K'<<16 | ' '<<24, + SAMOAN = 'S' | 'M'<<8 | 'O'<<16 | ' '<<24, + SAMOGITIAN = 'S' | 'G'<<8 | 'S'<<16 | ' '<<24, + SAN_BLAS_KUNA = 'C' | 'U'<<8 | 'K'<<16 | ' '<<24, + SANGO = 'S' | 'G'<<8 | 'O'<<16 | ' '<<24, + SANSKRIT = 'S' | 'A'<<8 | 'N'<<16 | ' '<<24, + SANTALI = 'S' | 'A'<<8 | 'T'<<16 | ' '<<24, + SARAIKI = 'S' | 'R'<<8 | 'K'<<16 | ' '<<24, + SARDINIAN = 'S' | 'R'<<8 | 'D'<<16 | ' '<<24, + SASAK = 'S' | 'A'<<8 | 'S'<<16 | ' '<<24, + SATERLAND_FRISIAN = 'S' | 'T'<<8 | 'Q'<<16 | ' '<<24, + SAYISI = 'S' | 'A'<<8 | 'Y'<<16 | ' '<<24, + SCOTS = 'S' | 'C'<<8 | 'I'<<16 | ' '<<24, + SCOTTISH_GAELIC = 'G' | 'A'<<8 | 'E'<<16 | ' '<<24, + SEKOTA = 'S' | 'E'<<8 | 'J'<<16 | ' '<<24, + SELKUP = 'S' | 'E'<<8 | 'L'<<16 | ' '<<24, + SENA = 'S' | 'N'<<8 | 'A'<<16 | ' '<<24, + SENECA = 'S' | 'E'<<8 | 'E'<<16 | ' '<<24, + SERBIAN = 'S' | 'R'<<8 | 'B'<<16 | ' '<<24, + SERER = 'S' | 'R'<<8 | 'R'<<16 | ' '<<24, + SGAW_KAREN = 'K' | 'S'<<8 | 'W'<<16 | ' '<<24, + SHAN = 'S' | 'H'<<8 | 'N'<<16 | ' '<<24, + SHONA = 'S' | 'N'<<8 | 'A'<<16 | ' '<<24, + SIBE = 'S' | 'I'<<8 | 'B'<<16 | ' '<<24, + SICILIAN = 'S' | 'C'<<8 | 'N'<<16 | ' '<<24, + SIDAMO = 'S' | 'I'<<8 | 'D'<<16 | ' '<<24, + SILESIAN = 'S' | 'Z'<<8 | 'L'<<16 | ' '<<24, + SILTE_GURAGE = 'S' | 'I'<<8 | 'G'<<16 | ' '<<24, + SINDHI = 'S' | 'N'<<8 | 'D'<<16 | ' '<<24, + SINHALA = 'S' | 'N'<<8 | 'H'<<16 | ' '<<24, + SKOLT_SAMI = 'S' | 'K'<<8 | 'S'<<16 | ' '<<24, + SLAVEY = 'S' | 'L'<<8 | 'A'<<16 | ' '<<24, + SLOVAK = 'S' | 'K'<<8 | 'Y'<<16 | ' '<<24, + SLOVENIAN = 'S' | 'L'<<8 | 'V'<<16 | ' '<<24, + SMALL_FLOWERY_MIAO = 'S' | 'F'<<8 | 'M'<<16 | ' '<<24, + SODO_GURAGE = 'S' | 'O'<<8 | 'G'<<16 | ' '<<24, + SOGA = 'X' | 'O'<<8 | 'G'<<16 | ' '<<24, + SOMALI = 'S' | 'M'<<8 | 'L'<<16 | ' '<<24, + SONGE = 'S' | 'O'<<8 | 'P'<<16 | ' '<<24, + SONINKE = 'S' | 'N'<<8 | 'K'<<16 | ' '<<24, + SOUTH_SLAVEY = 'S' | 'S'<<8 | 'L'<<16 | ' '<<24, + SOUTHERN_KIWAI = 'K' | 'J'<<8 | 'D'<<16 | ' '<<24, + SOUTHERN_SAMI = 'S' | 'S'<<8 | 'M'<<16 | ' '<<24, + SOUTHERN_SOTHO = 'S' | 'O'<<8 | 'T'<<16 | ' '<<24, + SPANISH = 'E' | 'S'<<8 | 'P'<<16 | ' '<<24, + STANDARD_MOROCCAN_TAMAZIGHT = 'Z' | 'G'<<8 | 'H'<<16 | ' '<<24, + STRAITS_SALISH = 'S' | 'T'<<8 | 'R'<<16 | ' '<<24, + SUKUMA = 'S' | 'U'<<8 | 'K'<<16 | ' '<<24, + SUNDANESE = 'S' | 'U'<<8 | 'N'<<16 | ' '<<24, + SURI = 'S' | 'U'<<8 | 'R'<<16 | ' '<<24, + SUTU = 'S' | 'X'<<8 | 'T'<<16 | ' '<<24, + SVAN = 'S' | 'V'<<8 | 'A'<<16 | ' '<<24, + SWADAYA_ARAMAIC = 'S' | 'W'<<8 | 'A'<<16 | ' '<<24, + SWAHILI = 'S' | 'W'<<8 | 'K'<<16 | ' '<<24, + SWATI = 'S' | 'W'<<8 | 'Z'<<16 | ' '<<24, + SWEDISH = 'S' | 'V'<<8 | 'E'<<16 | ' '<<24, + SYLHETI = 'S' | 'Y'<<8 | 'L'<<16 | ' '<<24, + SYRIAC = 'S' | 'Y'<<8 | 'R'<<16 | ' '<<24, + SYRIAC_EASTERN = 'S' | 'Y'<<8 | 'R'<<16 | 'N'<<24, + SYRIAC_ESTRANGELA = 'S' | 'Y'<<8 | 'R'<<16 | 'E'<<24, + SYRIAC_WESTERN = 'S' | 'Y'<<8 | 'R'<<16 | 'J'<<24, + TABASARAN = 'T' | 'A'<<8 | 'B'<<16 | ' '<<24, + TACHELHIT = 'S' | 'H'<<8 | 'I'<<16 | ' '<<24, + TAGALOG = 'T' | 'G'<<8 | 'L'<<16 | ' '<<24, + TAHAGGART_TAMAHAQ = 'T' | 'H'<<8 | 'V'<<16 | ' '<<24, + TAHITIAN = 'T' | 'H'<<8 | 'T'<<16 | ' '<<24, + TAI_LAING = 'T' | 'J'<<8 | 'L'<<16 | ' '<<24, + TAJIKI = 'T' | 'A'<<8 | 'J'<<16 | ' '<<24, + TALYSH = 'T' | 'L'<<8 | 'Y'<<16 | ' '<<24, + TAMASHEK = 'T' | 'M'<<8 | 'H'<<16 | ' '<<24, + TAMASHEQ = 'T' | 'A'<<8 | 'Q'<<16 | ' '<<24, + TAMAZIGHT = 'T' | 'Z'<<8 | 'M'<<16 | ' '<<24, + TAMIL = 'T' | 'A'<<8 | 'M'<<16 | ' '<<24, + TARIFIT = 'R' | 'I'<<8 | 'F'<<16 | ' '<<24, + TATAR = 'T' | 'A'<<8 | 'T'<<16 | ' '<<24, + TAWALLAMMAT_TAMAJAQ = 'T' | 'T'<<8 | 'Q'<<16 | ' '<<24, + TAY = 'T' | 'Y'<<8 | 'Z'<<16 | ' '<<24, + TAYART_TAMAJEQ = 'T' | 'H'<<8 | 'Z'<<16 | ' '<<24, + TELUGU = 'T' | 'E'<<8 | 'L'<<16 | ' '<<24, + TEMNE = 'T' | 'M'<<8 | 'N'<<16 | ' '<<24, + TETUM = 'T' | 'E'<<8 | 'T'<<16 | ' '<<24, + TH_CREE = 'T' | 'C'<<8 | 'R'<<16 | ' '<<24, + THAI = 'T' | 'H'<<8 | 'A'<<16 | ' '<<24, + THAILAND_MON = 'M' | 'O'<<8 | 'N'<<16 | 'T'<<24, + THOMPSON = 'T' | 'H'<<8 | 'P'<<16 | ' '<<24, + TIBETAN = 'T' | 'I'<<8 | 'B'<<16 | ' '<<24, + TIGRE = 'T' | 'G'<<8 | 'R'<<16 | ' '<<24, + TIGRINYA = 'T' | 'G'<<8 | 'Y'<<16 | ' '<<24, + TIV = 'T' | 'I'<<8 | 'V'<<16 | ' '<<24, + TLINGIT = 'T' | 'L'<<8 | 'I'<<16 | ' '<<24, + TOBO = 'T' | 'B'<<8 | 'V'<<16 | ' '<<24, + TODO = 'T' | 'O'<<8 | 'D'<<16 | ' '<<24, + TOK_PISIN = 'T' | 'P'<<8 | 'I'<<16 | ' '<<24, + TOMA = 'T' | 'O'<<8 | 'D'<<16 | '0'<<24, + TONGA = 'T' | 'N'<<8 | 'G'<<16 | ' '<<24, + TONGAN = 'T' | 'G'<<8 | 'N'<<16 | ' '<<24, + TORKI = 'A' | 'Z'<<8 | 'B'<<16 | ' '<<24, + TSHANGLA = 'T' | 'S'<<8 | 'J'<<16 | ' '<<24, + TSONGA = 'T' | 'S'<<8 | 'G'<<16 | ' '<<24, + TSWANA = 'T' | 'N'<<8 | 'A'<<16 | ' '<<24, + TULU = 'T' | 'U'<<8 | 'L'<<16 | ' '<<24, + TUMBUKA = 'T' | 'U'<<8 | 'M'<<16 | ' '<<24, + TUNDRA_ENETS = 'T' | 'N'<<8 | 'E'<<16 | ' '<<24, + TURKISH = 'T' | 'R'<<8 | 'K'<<16 | ' '<<24, + TURKMEN = 'T' | 'K'<<8 | 'M'<<16 | ' '<<24, + TUROYO_ARAMAIC = 'T' | 'U'<<8 | 'A'<<16 | ' '<<24, + TUSCARORA = 'T' | 'U'<<8 | 'S'<<16 | ' '<<24, + TUVALU = 'T' | 'V'<<8 | 'L'<<16 | ' '<<24, + TUVIN = 'T' | 'U'<<8 | 'V'<<16 | ' '<<24, + TWI = 'T' | 'W'<<8 | 'I'<<16 | ' '<<24, + TZOTZIL = 'T' | 'Z'<<8 | 'O'<<16 | ' '<<24, + UDI = 'U' | 'D'<<8 | 'I'<<16 | ' '<<24, + UDMURT = 'U' | 'D'<<8 | 'M'<<16 | ' '<<24, + UKRAINIAN = 'U' | 'K'<<8 | 'R'<<16 | ' '<<24, + UMBUNDU = 'U' | 'M'<<8 | 'B'<<16 | ' '<<24, + UME_SAMI = 'S' | 'J'<<8 | 'U'<<16 | ' '<<24, + UPPER_SAXON = 'S' | 'X'<<8 | 'U'<<16 | ' '<<24, + UPPER_SORBIAN = 'U' | 'S'<<8 | 'B'<<16 | ' '<<24, + URALIC_PHONETIC = 'U' | 'P'<<8 | 'P'<<16 | ' '<<24, + URDU = 'U' | 'R'<<8 | 'D'<<16 | ' '<<24, + UYGHUR = 'U' | 'Y'<<8 | 'G'<<16 | ' '<<24, + UZBEK = 'U' | 'Z'<<8 | 'B'<<16 | ' '<<24, + VENDA = 'V' | 'E'<<8 | 'N'<<16 | ' '<<24, + VENETIAN = 'V' | 'E'<<8 | 'C'<<16 | ' '<<24, + VIETNAMESE = 'V' | 'I'<<8 | 'T'<<16 | ' '<<24, + VLAX_ROMANI = 'R' | 'M'<<8 | 'Y'<<16 | ' '<<24, + VOLAPUK = 'V' | 'O'<<8 | 'L'<<16 | ' '<<24, + VORO = 'V' | 'R'<<8 | 'O'<<16 | ' '<<24, + WA = 'W' | 'A'<<8 | ' '<<16 | ' '<<24, + WACI_GBE = 'W' | 'C'<<8 | 'I'<<16 | ' '<<24, + WAGDI = 'W' | 'A'<<8 | 'G'<<16 | ' '<<24, + WAKHI = 'W' | 'B'<<8 | 'L'<<16 | ' '<<24, + WALLOON = 'W' | 'L'<<8 | 'N'<<16 | ' '<<24, + WARAY_WARAY = 'W' | 'A'<<8 | 'R'<<16 | ' '<<24, + WAYANAD_CHETTI = 'C' | 'T'<<8 | 'T'<<16 | ' '<<24, + WAYUU = 'G' | 'U'<<8 | 'C'<<16 | ' '<<24, + WELSH = 'W' | 'E'<<8 | 'L'<<16 | ' '<<24, + WENDAT = 'W' | 'D'<<8 | 'T'<<16 | ' '<<24, + WEST_CREE = 'W' | 'C'<<8 | 'R'<<16 | ' '<<24, + WESTERN_CHAM = 'C' | 'J'<<8 | 'A'<<16 | ' '<<24, + WESTERN_KAYAH = 'K' | 'Y'<<8 | 'U'<<16 | ' '<<24, + WESTERN_PANJABI = 'P' | 'N'<<8 | 'B'<<16 | ' '<<24, + WESTERN_PWO_KAREN = 'P' | 'W'<<8 | 'O'<<16 | ' '<<24, + WOLOF = 'W' | 'L'<<8 | 'F'<<16 | ' '<<24, + WOODS_CREE = 'D' | 'C'<<8 | 'R'<<16 | ' '<<24, + WUDING_LUQUAN_YI = 'Y' | 'W'<<8 | 'Q'<<16 | ' '<<24, + WYANDOT = 'W' | 'Y'<<8 | 'N'<<16 | ' '<<24, + XHOSA = 'X' | 'H'<<8 | 'S'<<16 | ' '<<24, + Y_CREE = 'Y' | 'C'<<8 | 'R'<<16 | ' '<<24, + YAO = 'Y' | 'A'<<8 | 'O'<<16 | ' '<<24, + YAPESE = 'Y' | 'A'<<8 | 'P'<<16 | ' '<<24, + YI_CLASSIC = 'Y' | 'I'<<8 | 'C'<<16 | ' '<<24, + YI_MODERN = 'Y' | 'I'<<8 | 'M'<<16 | ' '<<24, + YIDDISH = 'J' | 'I'<<8 | 'I'<<16 | ' '<<24, + YORUBA = 'Y' | 'B'<<8 | 'A'<<16 | ' '<<24, + ZAMBOANGA_CHAVACANO = 'C' | 'B'<<8 | 'K'<<16 | ' '<<24, + ZANDE = 'Z' | 'N'<<8 | 'D'<<16 | ' '<<24, + ZARMA = 'D' | 'J'<<8 | 'R'<<16 | ' '<<24, + ZAZAKI = 'Z' | 'Z'<<8 | 'A'<<16 | ' '<<24, + ZEALANDIC = 'Z' | 'E'<<8 | 'A'<<16 | ' '<<24, + ZHUANG = 'Z' | 'H'<<8 | 'A'<<16 | ' '<<24, + ZULU = 'Z' | 'U'<<8 | 'L'<<16 | ' '<<24, } break_flags :: distinct bit_set[break_flag; u32] @@ -780,42 +730,173 @@ break_flag :: enum u32 { // (In Unicode, there is no meaningful distinction between a line and a paragraph. // a paragraph is pretty much just a line of text that can wrap.) LINE_HARD = 5, + // Used for manual segmentation in the context. + MANUAL = 6, + + PARAGRAPH_DIRECTION = 7, } -BREAK_FLAGS_DIRECTION :: break_flags{.DIRECTION} -BREAK_FLAGS_SCRIPT :: break_flags{.SCRIPT} -BREAK_FLAGS_GRAPHEME :: break_flags{.GRAPHEME} -BREAK_FLAGS_WORD :: break_flags{.WORD} -BREAK_FLAGS_LINE_SOFT :: break_flags{.LINE_SOFT} -BREAK_FLAGS_LINE_HARD :: break_flags{.LINE_HARD} -BREAK_FLAGS_LINE :: break_flags{.LINE_SOFT, .LINE_HARD} -BREAK_FLAGS_ANY :: break_flags{.DIRECTION, .SCRIPT, .GRAPHEME, .WORD, .LINE_SOFT, .LINE_HARD} +BREAK_FLAG_DIRECTION :: break_flags{.DIRECTION} +BREAK_FLAG_SCRIPT :: break_flags{.SCRIPT} +BREAK_FLAG_GRAPHEME :: break_flags{.GRAPHEME} +BREAK_FLAG_WORD :: break_flags{.WORD} +BREAK_FLAG_LINE_SOFT :: break_flags{.LINE_SOFT} +BREAK_FLAG_LINE_HARD :: break_flags{.LINE_HARD} +BREAK_FLAG_MANUAL :: break_flags{.MANUAL} +BREAK_FLAG_PARAGRAPH_DIRECTION :: break_flags{.PARAGRAPH_DIRECTION} + +BREAK_FLAG_LINE :: break_flags{.LINE_SOFT, .LINE_HARD} +BREAK_FLAG_ANY :: break_flags{.DIRECTION, .SCRIPT, .GRAPHEME, .WORD, .LINE_SOFT, .LINE_HARD} -op_kind :: enum u8 { - END, +// Japanese text contains "kinsoku" characters, around which breaking a line is forbidden. +// Exactly which characters are "kinsoku" or not depends on the context: +// - Strict style has the largest amount of kinsoku characters, which leads to longer lines. +// - Loose style has the smallest amount of kinsoku characters, which leads to smaller lines. +// - Normal style is somewhere in the middle. +// Note that, while the Unicode standard mentions all three of these styles, it does not mention +// any differences between the normal and loose styles. +// As such, normal and loose styles currently behave the same. +japanese_line_break_style :: enum u8 { + // The Unicode standard does not define what strict style is used for. + // Supposedly, it is used for anything that does not fall into the other two categories of text. + STRICT, - // Substitution ops. - PRE_NORMALIZE_DOTTED_CIRCLES, - NORMALIZE, - NORMALIZE_HANGUL, - FLAG_JOINING_LETTERS, - GSUB_FEATURES, - GSUB_FEATURES_WITH_USER, + // Normal style is used for books and documents. + NORMAL, - // Positioning ops. - GPOS_METRICS, - GPOS_FEATURES, + // Loose style is used for newspapers, and (I assume) any other narrow column format. + LOOSE, +} - POST_GPOS_FIXUP, - STCH_POSTPASS, +break_state_flags :: distinct bit_set[break_state_flag; u32] +break_state_flag :: enum u32 { + STARTED = 0, + END = 1, + + _ = 2, + + // Bidirectional flags + SAW_R_AFTER_L = 3, + SAW_AL_AFTER_LR = 4, + LAST_WAS_BRACKET = 5, } +text_format :: enum u32 { + NONE, + + UTF32, + UTF8, +} + +direction :: enum u32 { + DONT_KNOW, + KBTS_DIRECTION_LTR, + KBTS_DIRECTION_RTL, +} + +orientation :: enum u32 { + HORIZONTAL, + VERTICAL, +} + +shaping_table :: enum u8 { + GSUB, + GPOS, +} + +shape_error :: enum u32 { + NONE, + INVALID_FONT, + GAVE_TEXT_BEFORE_CALLING_BEGIN, + OUT_OF_MEMORY, +} + +allocator_op_kind :: enum u32 { + NONE, + ALLOCATE, + FREE, +} + +blob_table_id :: enum u32 { + NONE, + HEAD, + CMAP, + GDEF, + GSUB, + GPOS, + HHEA, + VHEA, + HMTX, + VMTX, + MAXP, + OS2, + NAME, +} + +load_font_error :: enum u32 { + NONE, + NEED_TO_CREATE_BLOB, + INVALID_FONT, + OUT_OF_MEMORY, + COULD_NOT_OPEN_FILE, + READ_ERROR, +} + +version :: enum u32 { + _1_X, + _2_0, + + CURRENT = _2_0, +} + +blob_version :: enum u32 { + INVALID, + INITIAL, + + CURRENT = INITIAL, +} + +font_style_flags :: distinct bit_set[font_style_flag; u32] +font_style_flag :: enum u32 { + REGULAR = 0, + ITALIC = 1, + BOLD = 2, +} + +font_weight :: enum u32 { + UNKNOWN, + + THIN, + EXTRA_LIGHT, + LIGHT, + NORMAL, + MEDIUM, + SEMI_BOLD, + BOLD, + EXTRA_BOLD, + BLACK, +} + +font_width :: enum u32 { + UNKNOWN, + + ULTRA_CONDENSED, + EXTRA_CONDENSED, + CONDENSED, + SEMI_CONDENSED, + NORMAL, + SEMI_EXPANDED, + EXPANDED, + EXTRA_EXPANDED, + ULTRA_EXPANDED, +} + glyph_flags :: distinct bit_set[glyph_flag; u32] glyph_flag :: enum u32 { - // These feature flags must coincide with joining_feature _and_ FEATURE_FLAG! + // These feature flags must coincide with kbts_joining_feature _and_ KBTS_FEATURE_FLAG! ISOL = 0, FINA = 1, FIN2 = 2, @@ -840,66 +921,60 @@ glyph_flag :: enum u32 { CFAR = 19, // These can be anything. - DO_NOT_DECOMPOSE = 21, + DO_NOT_DECOMPOSE = 21, FIRST_IN_MULTIPLE_SUBSTITUTION = 22, - NO_BREAK = 23, - CURSIVE = 24, - GENERATED_BY_GSUB = 25, - USED_IN_GPOS = 26, + NO_BREAK = 23, + CURSIVE = 24, + GENERATED_BY_GSUB = 25, + USED_IN_GPOS = 26, - STCH_ENDPOINT = 27, - STCH_EXTENSION = 28, + STCH_ENDPOINT = 27, + STCH_EXTENSION = 28, - LIGATURE = 29, - MULTIPLE_SUBSTITUTION = 30, + LIGATURE = 29, + MULTIPLE_SUBSTITUTION = 30, } -GLYPH_FEATURE_MASK :: glyph_flags{.ISOL, .FINA, .FIN2, .FIN3, .MEDI, .MED2, .INIT, .LJMO, .VJMO, .TJMO, .RPHF, .BLWF, .HALF, .PSTF, .ABVF, .PREF, .NUMR, .FRAC, .DNOM, .CFAR} - -// In USE, glyphs are mostly not pre-flagged for feature application. -// However, we do want to flag rphf/pref results for reordering, so we want to -// keep all of the flags as usual, and only use these feature flags for filtering. - -USE_GLYPH_FEATURE_MASK :: glyph_flags{ - .ISOL, .FINA, .FIN2, .FIN3, .MEDI, .MED2, .INIT, - .NUMR, .DNOM, .FRAC, -} - -JOINING_FEATURE_MASK :: glyph_flags{.ISOL, .FINA, .FIN2, .FIN3, .MEDI, .MED2, .INIT} - - -// Japanese text contains "kinsoku" characters, around which breaking a line is forbidden. -// Exactly which characters are "kinsoku" or not depends on the context: -// - Strict style has the largest amount of kinsoku characters, which leads to longer lines. -// - Loose style has the smallest amount of kinsoku characters, which leads to smaller lines. -// - Normal style is somewhere in the middle. -// Note that, while the Unicode standard mentions all three of these styles, it does not mention -// any differences between the normal and loose styles. -// As such, normal and loose styles currently behave the same. -japanese_line_break_style :: enum u8 { - // The Unicode standard does not define what strict style is used for. - // Supposedly, it is used for anything that does not fall into the other two categories of text. - STRICT, - - // Normal style is used for books and documents. - NORMAL, - - // Loose style is used for newspapers, and (I assume) any other narrow column format. - LOOSE, -} - - -orientation :: enum u32 { - HORIZONTAL, - VERTICAL, -} - -direction :: enum u32 { +joining_feature :: enum u8 { NONE, - LTR, - RTL, + + // These must correspond with glyph_flags and FEATURE_IDs. + ISOL, + FINA, + FIN2, + FIN3, + MEDI, + MED2, + INIT, } +user_id_generation_mode :: enum u32 { + CODEPOINT_INDEX, + SOURCE_INDEX, +} + +break_config_flags :: distinct bit_set[break_config_flag; u32] +break_config_flag :: enum u32 { + END_OF_TEXT_GENERATES_HARD_LINE_BREAK = 0, +} + +font_info_string_id :: enum u32 { + NONE, + COPYRIGHT, + FAMILY, + SUBFAMILY, + UID, + FULL_NAME, + VERSION, + POSTSCRIPT_NAME, + TRADEMARK, + MANUFACTURER, + DESIGNER, + TYPOGRAPHIC_FAMILY, + TYPOGRAPHIC_SUBFAMILY, +} + + unicode_joining_type :: enum u8 { NONE, LEFT, @@ -920,8 +995,18 @@ unicode_flag :: enum u8 { NON_SPACING_MARK = 6, } +UNICODE_FLAG_MODIFIER_COMBINING_MARK :: unicode_flags{.MODIFIER_COMBINING_MARK} +UNICODE_FLAG_DEFAULT_IGNORABLE :: unicode_flags{.DEFAULT_IGNORABLE} +UNICODE_FLAG_OPEN_BRACKET :: unicode_flags{.OPEN_BRACKET} +UNICODE_FLAG_CLOSE_BRACKET :: unicode_flags{.CLOSE_BRACKET} +UNICODE_FLAG_PART_OF_WORD :: unicode_flags{.PART_OF_WORD} +UNICODE_FLAG_DECIMAL_DIGIT :: unicode_flags{.DECIMAL_DIGIT} +UNICODE_FLAG_NON_SPACING_MARK :: unicode_flags{.NON_SPACING_MARK} +UNICODE_FLAG_MIRRORED :: unicode_flags{.OPEN_BRACKET, .CLOSE_BRACKET} + unicode_bidirectional_class :: enum u8 { NI, + BN, // Formatting characters need to be ignored. L, R, NSM, @@ -1068,177 +1153,180 @@ shaper :: enum u32 { USE, } +MAXIMUM_RECOMPOSITION_PARENTS :: 19 +MAXIMUM_CODEPOINT_SCRIPTS :: 23 + script_tag :: enum u32 { - DONT_KNOW = (' ' | ' '<<8 | ' '<<16 | ' '<<24), - ADLAM = ('a' | 'd'<<8 | 'l'<<16 | 'm'<<24), - AHOM = ('a' | 'h'<<8 | 'o'<<16 | 'm'<<24), - ANATOLIAN_HIEROGLYPHS = ('h' | 'l'<<8 | 'u'<<16 | 'w'<<24), - ARABIC = ('a' | 'r'<<8 | 'a'<<16 | 'b'<<24), - ARMENIAN = ('a' | 'r'<<8 | 'm'<<16 | 'n'<<24), - AVESTAN = ('a' | 'v'<<8 | 's'<<16 | 't'<<24), - BALINESE = ('b' | 'a'<<8 | 'l'<<16 | 'i'<<24), - BAMUM = ('b' | 'a'<<8 | 'm'<<16 | 'u'<<24), - BASSA_VAH = ('b' | 'a'<<8 | 's'<<16 | 's'<<24), - BATAK = ('b' | 'a'<<8 | 't'<<16 | 'k'<<24), - BENGALI = ('b' | 'n'<<8 | 'g'<<16 | '2'<<24), - BHAIKSUKI = ('b' | 'h'<<8 | 'k'<<16 | 's'<<24), - BOPOMOFO = ('b' | 'o'<<8 | 'p'<<16 | 'o'<<24), - BRAHMI = ('b' | 'r'<<8 | 'a'<<16 | 'h'<<24), - BUGINESE = ('b' | 'u'<<8 | 'g'<<16 | 'i'<<24), - BUHID = ('b' | 'u'<<8 | 'h'<<16 | 'd'<<24), - CANADIAN_SYLLABICS = ('c' | 'a'<<8 | 'n'<<16 | 's'<<24), - CARIAN = ('c' | 'a'<<8 | 'r'<<16 | 'i'<<24), - CAUCASIAN_ALBANIAN = ('a' | 'g'<<8 | 'h'<<16 | 'b'<<24), - CHAKMA = ('c' | 'a'<<8 | 'k'<<16 | 'm'<<24), - CHAM = ('c' | 'h'<<8 | 'a'<<16 | 'm'<<24), - CHEROKEE = ('c' | 'h'<<8 | 'e'<<16 | 'r'<<24), - CHORASMIAN = ('c' | 'h'<<8 | 'r'<<16 | 's'<<24), - CJK_IDEOGRAPHIC = ('h' | 'a'<<8 | 'n'<<16 | 'i'<<24), - COPTIC = ('c' | 'o'<<8 | 'p'<<16 | 't'<<24), - CYPRIOT_SYLLABARY = ('c' | 'p'<<8 | 'r'<<16 | 't'<<24), - CYPRO_MINOAN = ('c' | 'p'<<8 | 'm'<<16 | 'n'<<24), - CYRILLIC = ('c' | 'y'<<8 | 'r'<<16 | 'l'<<24), - DEFAULT = ('D' | 'F'<<8 | 'L'<<16 | 'T'<<24), - DEFAULT2 = ('D' | 'F'<<8 | 'L'<<16 | 'T'<<24), - DESERET = ('d' | 's'<<8 | 'r'<<16 | 't'<<24), - DEVANAGARI = ('d' | 'e'<<8 | 'v'<<16 | '2'<<24), - DIVES_AKURU = ('d' | 'i'<<8 | 'a'<<16 | 'k'<<24), - DOGRA = ('d' | 'o'<<8 | 'g'<<16 | 'r'<<24), - DUPLOYAN = ('d' | 'u'<<8 | 'p'<<16 | 'l'<<24), - EGYPTIAN_HIEROGLYPHS = ('e' | 'g'<<8 | 'y'<<16 | 'p'<<24), - ELBASAN = ('e' | 'l'<<8 | 'b'<<16 | 'a'<<24), - ELYMAIC = ('e' | 'l'<<8 | 'y'<<16 | 'm'<<24), - ETHIOPIC = ('e' | 't'<<8 | 'h'<<16 | 'i'<<24), - GARAY = ('g' | 'a'<<8 | 'r'<<16 | 'a'<<24), - GEORGIAN = ('g' | 'e'<<8 | 'o'<<16 | 'r'<<24), - GLAGOLITIC = ('g' | 'l'<<8 | 'a'<<16 | 'g'<<24), - GOTHIC = ('g' | 'o'<<8 | 't'<<16 | 'h'<<24), - GRANTHA = ('g' | 'r'<<8 | 'a'<<16 | 'n'<<24), - GREEK = ('g' | 'r'<<8 | 'e'<<16 | 'k'<<24), - GUJARATI = ('g' | 'j'<<8 | 'r'<<16 | '2'<<24), - GUNJALA_GONDI = ('g' | 'o'<<8 | 'n'<<16 | 'g'<<24), - GURMUKHI = ('g' | 'u'<<8 | 'r'<<16 | '2'<<24), - GURUNG_KHEMA = ('g' | 'u'<<8 | 'k'<<16 | 'h'<<24), - HANGUL = ('h' | 'a'<<8 | 'n'<<16 | 'g'<<24), - HANIFI_ROHINGYA = ('r' | 'o'<<8 | 'h'<<16 | 'g'<<24), - HANUNOO = ('h' | 'a'<<8 | 'n'<<16 | 'o'<<24), - HATRAN = ('h' | 'a'<<8 | 't'<<16 | 'r'<<24), - HEBREW = ('h' | 'e'<<8 | 'b'<<16 | 'r'<<24), - HIRAGANA = ('k' | 'a'<<8 | 'n'<<16 | 'a'<<24), - IMPERIAL_ARAMAIC = ('a' | 'r'<<8 | 'm'<<16 | 'i'<<24), - INSCRIPTIONAL_PAHLAVI = ('p' | 'h'<<8 | 'l'<<16 | 'i'<<24), - INSCRIPTIONAL_PARTHIAN = ('p' | 'r'<<8 | 't'<<16 | 'i'<<24), - JAVANESE = ('j' | 'a'<<8 | 'v'<<16 | 'a'<<24), - KAITHI = ('k' | 't'<<8 | 'h'<<16 | 'i'<<24), - KANNADA = ('k' | 'n'<<8 | 'd'<<16 | '2'<<24), - KATAKANA = ('k' | 'a'<<8 | 'n'<<16 | 'a'<<24), - KAWI = ('k' | 'a'<<8 | 'w'<<16 | 'i'<<24), - KAYAH_LI = ('k' | 'a'<<8 | 'l'<<16 | 'i'<<24), - KHAROSHTHI = ('k' | 'h'<<8 | 'a'<<16 | 'r'<<24), - KHITAN_SMALL_SCRIPT = ('k' | 'i'<<8 | 't'<<16 | 's'<<24), - KHMER = ('k' | 'h'<<8 | 'm'<<16 | 'r'<<24), - KHOJKI = ('k' | 'h'<<8 | 'o'<<16 | 'j'<<24), - KHUDAWADI = ('s' | 'i'<<8 | 'n'<<16 | 'd'<<24), - KIRAT_RAI = ('k' | 'r'<<8 | 'a'<<16 | 'i'<<24), - LAO = ('l' | 'a'<<8 | 'o'<<16 | ' '<<24), - LATIN = ('l' | 'a'<<8 | 't'<<16 | 'n'<<24), - LEPCHA = ('l' | 'e'<<8 | 'p'<<16 | 'c'<<24), - LIMBU = ('l' | 'i'<<8 | 'm'<<16 | 'b'<<24), - LINEAR_A = ('l' | 'i'<<8 | 'n'<<16 | 'a'<<24), - LINEAR_B = ('l' | 'i'<<8 | 'n'<<16 | 'b'<<24), - LISU = ('l' | 'i'<<8 | 's'<<16 | 'u'<<24), - LYCIAN = ('l' | 'y'<<8 | 'c'<<16 | 'i'<<24), - LYDIAN = ('l' | 'y'<<8 | 'd'<<16 | 'i'<<24), - MAHAJANI = ('m' | 'a'<<8 | 'h'<<16 | 'j'<<24), - MAKASAR = ('m' | 'a'<<8 | 'k'<<16 | 'a'<<24), - MALAYALAM = ('m' | 'l'<<8 | 'm'<<16 | '2'<<24), - MANDAIC = ('m' | 'a'<<8 | 'n'<<16 | 'd'<<24), - MANICHAEAN = ('m' | 'a'<<8 | 'n'<<16 | 'i'<<24), - MARCHEN = ('m' | 'a'<<8 | 'r'<<16 | 'c'<<24), - MASARAM_GONDI = ('g' | 'o'<<8 | 'n'<<16 | 'm'<<24), - MEDEFAIDRIN = ('m' | 'e'<<8 | 'd'<<16 | 'f'<<24), - MEETEI_MAYEK = ('m' | 't'<<8 | 'e'<<16 | 'i'<<24), - MENDE_KIKAKUI = ('m' | 'e'<<8 | 'n'<<16 | 'd'<<24), - MEROITIC_CURSIVE = ('m' | 'e'<<8 | 'r'<<16 | 'c'<<24), - MEROITIC_HIEROGLYPHS = ('m' | 'e'<<8 | 'r'<<16 | 'o'<<24), - MIAO = ('p' | 'l'<<8 | 'r'<<16 | 'd'<<24), - MODI = ('m' | 'o'<<8 | 'd'<<16 | 'i'<<24), - MONGOLIAN = ('m' | 'o'<<8 | 'n'<<16 | 'g'<<24), - MRO = ('m' | 'r'<<8 | 'o'<<16 | 'o'<<24), - MULTANI = ('m' | 'u'<<8 | 'l'<<16 | 't'<<24), - MYANMAR = ('m' | 'y'<<8 | 'm'<<16 | '2'<<24), - NABATAEAN = ('n' | 'b'<<8 | 'a'<<16 | 't'<<24), - NAG_MUNDARI = ('n' | 'a'<<8 | 'g'<<16 | 'm'<<24), - NANDINAGARI = ('n' | 'a'<<8 | 'n'<<16 | 'd'<<24), - NEWA = ('n' | 'e'<<8 | 'w'<<16 | 'a'<<24), - NEW_TAI_LUE = ('t' | 'a'<<8 | 'l'<<16 | 'u'<<24), - NKO = ('n' | 'k'<<8 | 'o'<<16 | ' '<<24), - NUSHU = ('n' | 's'<<8 | 'h'<<16 | 'u'<<24), - NYIAKENG_PUACHUE_HMONG = ('h' | 'm'<<8 | 'n'<<16 | 'p'<<24), - OGHAM = ('o' | 'g'<<8 | 'a'<<16 | 'm'<<24), - OL_CHIKI = ('o' | 'l'<<8 | 'c'<<16 | 'k'<<24), - OL_ONAL = ('o' | 'n'<<8 | 'a'<<16 | 'o'<<24), - OLD_ITALIC = ('i' | 't'<<8 | 'a'<<16 | 'l'<<24), - OLD_HUNGARIAN = ('h' | 'u'<<8 | 'n'<<16 | 'g'<<24), - OLD_NORTH_ARABIAN = ('n' | 'a'<<8 | 'r'<<16 | 'b'<<24), - OLD_PERMIC = ('p' | 'e'<<8 | 'r'<<16 | 'm'<<24), - OLD_PERSIAN_CUNEIFORM = ('x' | 'p'<<8 | 'e'<<16 | 'o'<<24), - OLD_SOGDIAN = ('s' | 'o'<<8 | 'g'<<16 | 'o'<<24), - OLD_SOUTH_ARABIAN = ('s' | 'a'<<8 | 'r'<<16 | 'b'<<24), - OLD_TURKIC = ('o' | 'r'<<8 | 'k'<<16 | 'h'<<24), - OLD_UYGHUR = ('o' | 'u'<<8 | 'g'<<16 | 'r'<<24), - ODIA = ('o' | 'r'<<8 | 'y'<<16 | '2'<<24), - OSAGE = ('o' | 's'<<8 | 'g'<<16 | 'e'<<24), - OSMANYA = ('o' | 's'<<8 | 'm'<<16 | 'a'<<24), - PAHAWH_HMONG = ('h' | 'm'<<8 | 'n'<<16 | 'g'<<24), - PALMYRENE = ('p' | 'a'<<8 | 'l'<<16 | 'm'<<24), - PAU_CIN_HAU = ('p' | 'a'<<8 | 'u'<<16 | 'c'<<24), - PHAGS_PA = ('p' | 'h'<<8 | 'a'<<16 | 'g'<<24), - PHOENICIAN = ('p' | 'h'<<8 | 'n'<<16 | 'x'<<24), - PSALTER_PAHLAVI = ('p' | 'h'<<8 | 'l'<<16 | 'p'<<24), - REJANG = ('r' | 'j'<<8 | 'n'<<16 | 'g'<<24), - RUNIC = ('r' | 'u'<<8 | 'n'<<16 | 'r'<<24), - SAMARITAN = ('s' | 'a'<<8 | 'm'<<16 | 'r'<<24), - SAURASHTRA = ('s' | 'a'<<8 | 'u'<<16 | 'r'<<24), - SHARADA = ('s' | 'h'<<8 | 'r'<<16 | 'd'<<24), - SHAVIAN = ('s' | 'h'<<8 | 'a'<<16 | 'w'<<24), - SIDDHAM = ('s' | 'i'<<8 | 'd'<<16 | 'd'<<24), - SIGN_WRITING = ('s' | 'g'<<8 | 'n'<<16 | 'w'<<24), - SOGDIAN = ('s' | 'o'<<8 | 'g'<<16 | 'd'<<24), - SINHALA = ('s' | 'i'<<8 | 'n'<<16 | 'h'<<24), - SORA_SOMPENG = ('s' | 'o'<<8 | 'r'<<16 | 'a'<<24), - SOYOMBO = ('s' | 'o'<<8 | 'y'<<16 | 'o'<<24), - SUMERO_AKKADIAN_CUNEIFORM = ('x' | 's'<<8 | 'u'<<16 | 'x'<<24), - SUNDANESE = ('s' | 'u'<<8 | 'n'<<16 | 'd'<<24), - SUNUWAR = ('s' | 'u'<<8 | 'n'<<16 | 'u'<<24), - SYLOTI_NAGRI = ('s' | 'y'<<8 | 'l'<<16 | 'o'<<24), - SYRIAC = ('s' | 'y'<<8 | 'r'<<16 | 'c'<<24), - TAGALOG = ('t' | 'g'<<8 | 'l'<<16 | 'g'<<24), - TAGBANWA = ('t' | 'a'<<8 | 'g'<<16 | 'b'<<24), - TAI_LE = ('t' | 'a'<<8 | 'l'<<16 | 'e'<<24), - TAI_THAM = ('l' | 'a'<<8 | 'n'<<16 | 'a'<<24), - TAI_VIET = ('t' | 'a'<<8 | 'v'<<16 | 't'<<24), - TAKRI = ('t' | 'a'<<8 | 'k'<<16 | 'r'<<24), - TAMIL = ('t' | 'm'<<8 | 'l'<<16 | '2'<<24), - TANGSA = ('t' | 'n'<<8 | 's'<<16 | 'a'<<24), - TANGUT = ('t' | 'a'<<8 | 'n'<<16 | 'g'<<24), - TELUGU = ('t' | 'e'<<8 | 'l'<<16 | '2'<<24), - THAANA = ('t' | 'h'<<8 | 'a'<<16 | 'a'<<24), - THAI = ('t' | 'h'<<8 | 'a'<<16 | 'i'<<24), - TIBETAN = ('t' | 'i'<<8 | 'b'<<16 | 't'<<24), - TIFINAGH = ('t' | 'f'<<8 | 'n'<<16 | 'g'<<24), - TIRHUTA = ('t' | 'i'<<8 | 'r'<<16 | 'h'<<24), - TODHRI = ('t' | 'o'<<8 | 'd'<<16 | 'r'<<24), - TOTO = ('t' | 'o'<<8 | 't'<<16 | 'o'<<24), - TULU_TIGALARI = ('t' | 'u'<<8 | 't'<<16 | 'g'<<24), - UGARITIC_CUNEIFORM = ('u' | 'g'<<8 | 'a'<<16 | 'r'<<24), - VAI = ('v' | 'a'<<8 | 'i'<<16 | ' '<<24), - VITHKUQI = ('v' | 'i'<<8 | 't'<<16 | 'h'<<24), - WANCHO = ('w' | 'c'<<8 | 'h'<<16 | 'o'<<24), - WARANG_CITI = ('w' | 'a'<<8 | 'r'<<16 | 'a'<<24), - YEZIDI = ('y' | 'e'<<8 | 'z'<<16 | 'i'<<24), - YI = ('y' | 'i'<<8 | ' '<<16 | ' '<<24), - ZANABAZAR_SQUARE = ('z' | 'a'<<8 | 'n'<<16 | 'b'<<24), + DONT_KNOW = ' ' | ' '<<8 | ' '<<16 | ' '<<24, + ADLAM = 'a' | 'd'<<8 | 'l'<<16 | 'm'<<24, + AHOM = 'a' | 'h'<<8 | 'o'<<16 | 'm'<<24, + ANATOLIAN_HIEROGLYPHS = 'h' | 'l'<<8 | 'u'<<16 | 'w'<<24, + ARABIC = 'a' | 'r'<<8 | 'a'<<16 | 'b'<<24, + ARMENIAN = 'a' | 'r'<<8 | 'm'<<16 | 'n'<<24, + AVESTAN = 'a' | 'v'<<8 | 's'<<16 | 't'<<24, + BALINESE = 'b' | 'a'<<8 | 'l'<<16 | 'i'<<24, + BAMUM = 'b' | 'a'<<8 | 'm'<<16 | 'u'<<24, + BASSA_VAH = 'b' | 'a'<<8 | 's'<<16 | 's'<<24, + BATAK = 'b' | 'a'<<8 | 't'<<16 | 'k'<<24, + BENGALI = 'b' | 'n'<<8 | 'g'<<16 | '2'<<24, + BHAIKSUKI = 'b' | 'h'<<8 | 'k'<<16 | 's'<<24, + BOPOMOFO = 'b' | 'o'<<8 | 'p'<<16 | 'o'<<24, + BRAHMI = 'b' | 'r'<<8 | 'a'<<16 | 'h'<<24, + BUGINESE = 'b' | 'u'<<8 | 'g'<<16 | 'i'<<24, + BUHID = 'b' | 'u'<<8 | 'h'<<16 | 'd'<<24, + CANADIAN_SYLLABICS = 'c' | 'a'<<8 | 'n'<<16 | 's'<<24, + CARIAN = 'c' | 'a'<<8 | 'r'<<16 | 'i'<<24, + CAUCASIAN_ALBANIAN = 'a' | 'g'<<8 | 'h'<<16 | 'b'<<24, + CHAKMA = 'c' | 'a'<<8 | 'k'<<16 | 'm'<<24, + CHAM = 'c' | 'h'<<8 | 'a'<<16 | 'm'<<24, + CHEROKEE = 'c' | 'h'<<8 | 'e'<<16 | 'r'<<24, + CHORASMIAN = 'c' | 'h'<<8 | 'r'<<16 | 's'<<24, + CJK_IDEOGRAPHIC = 'h' | 'a'<<8 | 'n'<<16 | 'i'<<24, + COPTIC = 'c' | 'o'<<8 | 'p'<<16 | 't'<<24, + CYPRIOT_SYLLABARY = 'c' | 'p'<<8 | 'r'<<16 | 't'<<24, + CYPRO_MINOAN = 'c' | 'p'<<8 | 'm'<<16 | 'n'<<24, + CYRILLIC = 'c' | 'y'<<8 | 'r'<<16 | 'l'<<24, + DEFAULT = 'D' | 'F'<<8 | 'L'<<16 | 'T'<<24, + DEFAULT2 = 'D' | 'F'<<8 | 'L'<<16 | 'T'<<24, + DESERET = 'd' | 's'<<8 | 'r'<<16 | 't'<<24, + DEVANAGARI = 'd' | 'e'<<8 | 'v'<<16 | '2'<<24, + DIVES_AKURU = 'd' | 'i'<<8 | 'a'<<16 | 'k'<<24, + DOGRA = 'd' | 'o'<<8 | 'g'<<16 | 'r'<<24, + DUPLOYAN = 'd' | 'u'<<8 | 'p'<<16 | 'l'<<24, + EGYPTIAN_HIEROGLYPHS = 'e' | 'g'<<8 | 'y'<<16 | 'p'<<24, + ELBASAN = 'e' | 'l'<<8 | 'b'<<16 | 'a'<<24, + ELYMAIC = 'e' | 'l'<<8 | 'y'<<16 | 'm'<<24, + ETHIOPIC = 'e' | 't'<<8 | 'h'<<16 | 'i'<<24, + GARAY = 'g' | 'a'<<8 | 'r'<<16 | 'a'<<24, + GEORGIAN = 'g' | 'e'<<8 | 'o'<<16 | 'r'<<24, + GLAGOLITIC = 'g' | 'l'<<8 | 'a'<<16 | 'g'<<24, + GOTHIC = 'g' | 'o'<<8 | 't'<<16 | 'h'<<24, + GRANTHA = 'g' | 'r'<<8 | 'a'<<16 | 'n'<<24, + GREEK = 'g' | 'r'<<8 | 'e'<<16 | 'k'<<24, + GUJARATI = 'g' | 'j'<<8 | 'r'<<16 | '2'<<24, + GUNJALA_GONDI = 'g' | 'o'<<8 | 'n'<<16 | 'g'<<24, + GURMUKHI = 'g' | 'u'<<8 | 'r'<<16 | '2'<<24, + GURUNG_KHEMA = 'g' | 'u'<<8 | 'k'<<16 | 'h'<<24, + HANGUL = 'h' | 'a'<<8 | 'n'<<16 | 'g'<<24, + HANIFI_ROHINGYA = 'r' | 'o'<<8 | 'h'<<16 | 'g'<<24, + HANUNOO = 'h' | 'a'<<8 | 'n'<<16 | 'o'<<24, + HATRAN = 'h' | 'a'<<8 | 't'<<16 | 'r'<<24, + HEBREW = 'h' | 'e'<<8 | 'b'<<16 | 'r'<<24, + HIRAGANA = 'k' | 'a'<<8 | 'n'<<16 | 'a'<<24, + IMPERIAL_ARAMAIC = 'a' | 'r'<<8 | 'm'<<16 | 'i'<<24, + INSCRIPTIONAL_PAHLAVI = 'p' | 'h'<<8 | 'l'<<16 | 'i'<<24, + INSCRIPTIONAL_PARTHIAN = 'p' | 'r'<<8 | 't'<<16 | 'i'<<24, + JAVANESE = 'j' | 'a'<<8 | 'v'<<16 | 'a'<<24, + KAITHI = 'k' | 't'<<8 | 'h'<<16 | 'i'<<24, + KANNADA = 'k' | 'n'<<8 | 'd'<<16 | '2'<<24, + KATAKANA = 'k' | 'a'<<8 | 'n'<<16 | 'a'<<24, + KAWI = 'k' | 'a'<<8 | 'w'<<16 | 'i'<<24, + KAYAH_LI = 'k' | 'a'<<8 | 'l'<<16 | 'i'<<24, + KHAROSHTHI = 'k' | 'h'<<8 | 'a'<<16 | 'r'<<24, + KHITAN_SMALL_SCRIPT = 'k' | 'i'<<8 | 't'<<16 | 's'<<24, + KHMER = 'k' | 'h'<<8 | 'm'<<16 | 'r'<<24, + KHOJKI = 'k' | 'h'<<8 | 'o'<<16 | 'j'<<24, + KHUDAWADI = 's' | 'i'<<8 | 'n'<<16 | 'd'<<24, + KIRAT_RAI = 'k' | 'r'<<8 | 'a'<<16 | 'i'<<24, + LAO = 'l' | 'a'<<8 | 'o'<<16 | ' '<<24, + LATIN = 'l' | 'a'<<8 | 't'<<16 | 'n'<<24, + LEPCHA = 'l' | 'e'<<8 | 'p'<<16 | 'c'<<24, + LIMBU = 'l' | 'i'<<8 | 'm'<<16 | 'b'<<24, + LINEAR_A = 'l' | 'i'<<8 | 'n'<<16 | 'a'<<24, + LINEAR_B = 'l' | 'i'<<8 | 'n'<<16 | 'b'<<24, + LISU = 'l' | 'i'<<8 | 's'<<16 | 'u'<<24, + LYCIAN = 'l' | 'y'<<8 | 'c'<<16 | 'i'<<24, + LYDIAN = 'l' | 'y'<<8 | 'd'<<16 | 'i'<<24, + MAHAJANI = 'm' | 'a'<<8 | 'h'<<16 | 'j'<<24, + MAKASAR = 'm' | 'a'<<8 | 'k'<<16 | 'a'<<24, + MALAYALAM = 'm' | 'l'<<8 | 'm'<<16 | '2'<<24, + MANDAIC = 'm' | 'a'<<8 | 'n'<<16 | 'd'<<24, + MANICHAEAN = 'm' | 'a'<<8 | 'n'<<16 | 'i'<<24, + MARCHEN = 'm' | 'a'<<8 | 'r'<<16 | 'c'<<24, + MASARAM_GONDI = 'g' | 'o'<<8 | 'n'<<16 | 'm'<<24, + MEDEFAIDRIN = 'm' | 'e'<<8 | 'd'<<16 | 'f'<<24, + MEETEI_MAYEK = 'm' | 't'<<8 | 'e'<<16 | 'i'<<24, + MENDE_KIKAKUI = 'm' | 'e'<<8 | 'n'<<16 | 'd'<<24, + MEROITIC_CURSIVE = 'm' | 'e'<<8 | 'r'<<16 | 'c'<<24, + MEROITIC_HIEROGLYPHS = 'm' | 'e'<<8 | 'r'<<16 | 'o'<<24, + MIAO = 'p' | 'l'<<8 | 'r'<<16 | 'd'<<24, + MODI = 'm' | 'o'<<8 | 'd'<<16 | 'i'<<24, + MONGOLIAN = 'm' | 'o'<<8 | 'n'<<16 | 'g'<<24, + MRO = 'm' | 'r'<<8 | 'o'<<16 | 'o'<<24, + MULTANI = 'm' | 'u'<<8 | 'l'<<16 | 't'<<24, + MYANMAR = 'm' | 'y'<<8 | 'm'<<16 | '2'<<24, + NABATAEAN = 'n' | 'b'<<8 | 'a'<<16 | 't'<<24, + NAG_MUNDARI = 'n' | 'a'<<8 | 'g'<<16 | 'm'<<24, + NANDINAGARI = 'n' | 'a'<<8 | 'n'<<16 | 'd'<<24, + NEWA = 'n' | 'e'<<8 | 'w'<<16 | 'a'<<24, + NEW_TAI_LUE = 't' | 'a'<<8 | 'l'<<16 | 'u'<<24, + NKO = 'n' | 'k'<<8 | 'o'<<16 | ' '<<24, + NUSHU = 'n' | 's'<<8 | 'h'<<16 | 'u'<<24, + NYIAKENG_PUACHUE_HMONG = 'h' | 'm'<<8 | 'n'<<16 | 'p'<<24, + OGHAM = 'o' | 'g'<<8 | 'a'<<16 | 'm'<<24, + OL_CHIKI = 'o' | 'l'<<8 | 'c'<<16 | 'k'<<24, + OL_ONAL = 'o' | 'n'<<8 | 'a'<<16 | 'o'<<24, + OLD_ITALIC = 'i' | 't'<<8 | 'a'<<16 | 'l'<<24, + OLD_HUNGARIAN = 'h' | 'u'<<8 | 'n'<<16 | 'g'<<24, + OLD_NORTH_ARABIAN = 'n' | 'a'<<8 | 'r'<<16 | 'b'<<24, + OLD_PERMIC = 'p' | 'e'<<8 | 'r'<<16 | 'm'<<24, + OLD_PERSIAN_CUNEIFORM = 'x' | 'p'<<8 | 'e'<<16 | 'o'<<24, + OLD_SOGDIAN = 's' | 'o'<<8 | 'g'<<16 | 'o'<<24, + OLD_SOUTH_ARABIAN = 's' | 'a'<<8 | 'r'<<16 | 'b'<<24, + OLD_TURKIC = 'o' | 'r'<<8 | 'k'<<16 | 'h'<<24, + OLD_UYGHUR = 'o' | 'u'<<8 | 'g'<<16 | 'r'<<24, + ODIA = 'o' | 'r'<<8 | 'y'<<16 | '2'<<24, + OSAGE = 'o' | 's'<<8 | 'g'<<16 | 'e'<<24, + OSMANYA = 'o' | 's'<<8 | 'm'<<16 | 'a'<<24, + PAHAWH_HMONG = 'h' | 'm'<<8 | 'n'<<16 | 'g'<<24, + PALMYRENE = 'p' | 'a'<<8 | 'l'<<16 | 'm'<<24, + PAU_CIN_HAU = 'p' | 'a'<<8 | 'u'<<16 | 'c'<<24, + PHAGS_PA = 'p' | 'h'<<8 | 'a'<<16 | 'g'<<24, + PHOENICIAN = 'p' | 'h'<<8 | 'n'<<16 | 'x'<<24, + PSALTER_PAHLAVI = 'p' | 'h'<<8 | 'l'<<16 | 'p'<<24, + REJANG = 'r' | 'j'<<8 | 'n'<<16 | 'g'<<24, + RUNIC = 'r' | 'u'<<8 | 'n'<<16 | 'r'<<24, + SAMARITAN = 's' | 'a'<<8 | 'm'<<16 | 'r'<<24, + SAURASHTRA = 's' | 'a'<<8 | 'u'<<16 | 'r'<<24, + SHARADA = 's' | 'h'<<8 | 'r'<<16 | 'd'<<24, + SHAVIAN = 's' | 'h'<<8 | 'a'<<16 | 'w'<<24, + SIDDHAM = 's' | 'i'<<8 | 'd'<<16 | 'd'<<24, + SIGN_WRITING = 's' | 'g'<<8 | 'n'<<16 | 'w'<<24, + SOGDIAN = 's' | 'o'<<8 | 'g'<<16 | 'd'<<24, + SINHALA = 's' | 'i'<<8 | 'n'<<16 | 'h'<<24, + SORA_SOMPENG = 's' | 'o'<<8 | 'r'<<16 | 'a'<<24, + SOYOMBO = 's' | 'o'<<8 | 'y'<<16 | 'o'<<24, + SUMERO_AKKADIAN_CUNEIFORM = 'x' | 's'<<8 | 'u'<<16 | 'x'<<24, + SUNDANESE = 's' | 'u'<<8 | 'n'<<16 | 'd'<<24, + SUNUWAR = 's' | 'u'<<8 | 'n'<<16 | 'u'<<24, + SYLOTI_NAGRI = 's' | 'y'<<8 | 'l'<<16 | 'o'<<24, + SYRIAC = 's' | 'y'<<8 | 'r'<<16 | 'c'<<24, + TAGALOG = 't' | 'g'<<8 | 'l'<<16 | 'g'<<24, + TAGBANWA = 't' | 'a'<<8 | 'g'<<16 | 'b'<<24, + TAI_LE = 't' | 'a'<<8 | 'l'<<16 | 'e'<<24, + TAI_THAM = 'l' | 'a'<<8 | 'n'<<16 | 'a'<<24, + TAI_VIET = 't' | 'a'<<8 | 'v'<<16 | 't'<<24, + TAKRI = 't' | 'a'<<8 | 'k'<<16 | 'r'<<24, + TAMIL = 't' | 'm'<<8 | 'l'<<16 | '2'<<24, + TANGSA = 't' | 'n'<<8 | 's'<<16 | 'a'<<24, + TANGUT = 't' | 'a'<<8 | 'n'<<16 | 'g'<<24, + TELUGU = 't' | 'e'<<8 | 'l'<<16 | '2'<<24, + THAANA = 't' | 'h'<<8 | 'a'<<16 | 'a'<<24, + THAI = 't' | 'h'<<8 | 'a'<<16 | 'i'<<24, + TIBETAN = 't' | 'i'<<8 | 'b'<<16 | 't'<<24, + TIFINAGH = 't' | 'f'<<8 | 'n'<<16 | 'g'<<24, + TIRHUTA = 't' | 'i'<<8 | 'r'<<16 | 'h'<<24, + TODHRI = 't' | 'o'<<8 | 'd'<<16 | 'r'<<24, + TOTO = 't' | 'o'<<8 | 't'<<16 | 'o'<<24, + TULU_TIGALARI = 't' | 'u'<<8 | 't'<<16 | 'g'<<24, + UGARITIC_CUNEIFORM = 'u' | 'g'<<8 | 'a'<<16 | 'r'<<24, + VAI = 'v' | 'a'<<8 | 'i'<<16 | ' '<<24, + VITHKUQI = 'v' | 'i'<<8 | 't'<<16 | 'h'<<24, + WANCHO = 'w' | 'c'<<8 | 'h'<<16 | 'o'<<24, + WARANG_CITI = 'w' | 'a'<<8 | 'r'<<16 | 'a'<<24, + YEZIDI = 'y' | 'e'<<8 | 'z'<<16 | 'i'<<24, + YI = 'y' | 'i'<<8 | ' '<<16 | ' '<<24, + ZANABAZAR_SQUARE = 'z' | 'a'<<8 | 'n'<<16 | 'b'<<24, } script :: enum u32 { @@ -1415,324 +1503,446 @@ script :: enum u32 { } feature_tag :: enum u32 { - UNREGISTERED = 0, - isol = ('i' | 's'<<8 | 'o'<<16 | 'l'<<24), /* Isolated Forms */ - fina = ('f' | 'i'<<8 | 'n'<<16 | 'a'<<24), /* Terminal Forms */ - fin2 = ('f' | 'i'<<8 | 'n'<<16 | '2'<<24), /* Terminal Forms #2 */ - fin3 = ('f' | 'i'<<8 | 'n'<<16 | '3'<<24), /* Terminal Forms #3 */ - medi = ('m' | 'e'<<8 | 'd'<<16 | 'i'<<24), /* Medial Forms */ - med2 = ('m' | 'e'<<8 | 'd'<<16 | '2'<<24), /* Medial Forms #2 */ - init = ('i' | 'n'<<8 | 'i'<<16 | 't'<<24), /* Initial Forms */ - ljmo = ('l' | 'j'<<8 | 'm'<<16 | 'o'<<24), /* Leading Jamo Forms */ - vjmo = ('v' | 'j'<<8 | 'm'<<16 | 'o'<<24), /* Vowel Jamo Forms */ - tjmo = ('t' | 'j'<<8 | 'm'<<16 | 'o'<<24), /* Trailing Jamo Forms */ - rphf = ('r' | 'p'<<8 | 'h'<<16 | 'f'<<24), /* Reph Form */ - blwf = ('b' | 'l'<<8 | 'w'<<16 | 'f'<<24), /* Below-base Forms */ - half = ('h' | 'a'<<8 | 'l'<<16 | 'f'<<24), /* Half Forms */ - pstf = ('p' | 's'<<8 | 't'<<16 | 'f'<<24), /* Post-base Forms */ - abvf = ('a' | 'b'<<8 | 'v'<<16 | 'f'<<24), /* Above-base Forms */ - pref = ('p' | 'r'<<8 | 'e'<<16 | 'f'<<24), /* Pre-base Forms */ - numr = ('n' | 'u'<<8 | 'm'<<16 | 'r'<<24), /* Numerators */ - frac = ('f' | 'r'<<8 | 'a'<<16 | 'c'<<24), /* Fractions */ - dnom = ('d' | 'n'<<8 | 'o'<<16 | 'm'<<24), /* Denominators */ - cfar = ('c' | 'f'<<8 | 'a'<<16 | 'r'<<24), /* Conjunct Form After Ro */ - aalt = ('a' | 'a'<<8 | 'l'<<16 | 't'<<24), /* Access All Alternates */ - abvm = ('a' | 'b'<<8 | 'v'<<16 | 'm'<<24), /* Above-base Mark Positioning */ - abvs = ('a' | 'b'<<8 | 'v'<<16 | 's'<<24), /* Above-base Substitutions */ - afrc = ('a' | 'f'<<8 | 'r'<<16 | 'c'<<24), /* Alternative Fractions */ - akhn = ('a' | 'k'<<8 | 'h'<<16 | 'n'<<24), /* Akhand */ - apkn = ('a' | 'p'<<8 | 'k'<<16 | 'n'<<24), /* Kerning for Alternate Proportional Widths */ - blwm = ('b' | 'l'<<8 | 'w'<<16 | 'm'<<24), /* Below-base Mark Positioning */ - blws = ('b' | 'l'<<8 | 'w'<<16 | 's'<<24), /* Below-base Substitutions */ - calt = ('c' | 'a'<<8 | 'l'<<16 | 't'<<24), /* Contextual Alternates */ - Case = ('c' | 'a'<<8 | 's'<<16 | 'e'<<24), /* Case-sensitive Forms */ - ccmp = ('c' | 'c'<<8 | 'm'<<16 | 'p'<<24), /* Glyph Composition / Decomposition */ - chws = ('c' | 'h'<<8 | 'w'<<16 | 's'<<24), /* Contextual Half-width Spacing */ - cjct = ('c' | 'j'<<8 | 'c'<<16 | 't'<<24), /* Conjunct Forms */ - clig = ('c' | 'l'<<8 | 'i'<<16 | 'g'<<24), /* Contextual Ligatures */ - cpct = ('c' | 'p'<<8 | 'c'<<16 | 't'<<24), /* Centered CJK Punctuation */ - cpsp = ('c' | 'p'<<8 | 's'<<16 | 'p'<<24), /* Capital Spacing */ - cswh = ('c' | 's'<<8 | 'w'<<16 | 'h'<<24), /* Contextual Swash */ - curs = ('c' | 'u'<<8 | 'r'<<16 | 's'<<24), /* Cursive Positioning */ - cv01 = ('c' | 'v'<<8 | '0'<<16 | '1'<<24), /* 'cv99' Character Variant 1 – Character Variant 99 */ - c2pc = ('c' | '2'<<8 | 'p'<<16 | 'c'<<24), /* Petite Capitals From Capitals */ - c2sc = ('c' | '2'<<8 | 's'<<16 | 'c'<<24), /* Small Capitals From Capitals */ - dist = ('d' | 'i'<<8 | 's'<<16 | 't'<<24), /* Distances */ - dlig = ('d' | 'l'<<8 | 'i'<<16 | 'g'<<24), /* Discretionary Ligatures */ - dtls = ('d' | 't'<<8 | 'l'<<16 | 's'<<24), /* Dotless Forms */ - expt = ('e' | 'x'<<8 | 'p'<<16 | 't'<<24), /* Expert Forms */ - falt = ('f' | 'a'<<8 | 'l'<<16 | 't'<<24), /* Final Glyph on Line Alternates */ - flac = ('f' | 'l'<<8 | 'a'<<16 | 'c'<<24), /* Flattened Accent Forms */ - fwid = ('f' | 'w'<<8 | 'i'<<16 | 'd'<<24), /* Full Widths */ - haln = ('h' | 'a'<<8 | 'l'<<16 | 'n'<<24), /* Halant Forms */ - halt = ('h' | 'a'<<8 | 'l'<<16 | 't'<<24), /* Alternate Half Widths */ - hist = ('h' | 'i'<<8 | 's'<<16 | 't'<<24), /* Historical Forms */ - hkna = ('h' | 'k'<<8 | 'n'<<16 | 'a'<<24), /* Horizontal Kana Alternates */ - hlig = ('h' | 'l'<<8 | 'i'<<16 | 'g'<<24), /* Historical Ligatures */ - hngl = ('h' | 'n'<<8 | 'g'<<16 | 'l'<<24), /* Hangul */ - hojo = ('h' | 'o'<<8 | 'j'<<16 | 'o'<<24), /* Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms) */ - hwid = ('h' | 'w'<<8 | 'i'<<16 | 'd'<<24), /* Half Widths */ - ital = ('i' | 't'<<8 | 'a'<<16 | 'l'<<24), /* Italics */ - jalt = ('j' | 'a'<<8 | 'l'<<16 | 't'<<24), /* Justification Alternates */ - jp78 = ('j' | 'p'<<8 | '7'<<16 | '8'<<24), /* JIS78 Forms */ - jp83 = ('j' | 'p'<<8 | '8'<<16 | '3'<<24), /* JIS83 Forms */ - jp90 = ('j' | 'p'<<8 | '9'<<16 | '0'<<24), /* JIS90 Forms */ - jp04 = ('j' | 'p'<<8 | '0'<<16 | '4'<<24), /* JIS2004 Forms */ - kern = ('k' | 'e'<<8 | 'r'<<16 | 'n'<<24), /* Kerning */ - lfbd = ('l' | 'f'<<8 | 'b'<<16 | 'd'<<24), /* Left Bounds */ - liga = ('l' | 'i'<<8 | 'g'<<16 | 'a'<<24), /* Standard Ligatures */ - lnum = ('l' | 'n'<<8 | 'u'<<16 | 'm'<<24), /* Lining Figures */ - locl = ('l' | 'o'<<8 | 'c'<<16 | 'l'<<24), /* Localized Forms */ - ltra = ('l' | 't'<<8 | 'r'<<16 | 'a'<<24), /* Left-to-right Alternates */ - ltrm = ('l' | 't'<<8 | 'r'<<16 | 'm'<<24), /* Left-to-right Mirrored Forms */ - mark = ('m' | 'a'<<8 | 'r'<<16 | 'k'<<24), /* Mark Positioning */ - mgrk = ('m' | 'g'<<8 | 'r'<<16 | 'k'<<24), /* Mathematical Greek */ - mkmk = ('m' | 'k'<<8 | 'm'<<16 | 'k'<<24), /* Mark to Mark Positioning */ - mset = ('m' | 's'<<8 | 'e'<<16 | 't'<<24), /* Mark Positioning via Substitution */ - nalt = ('n' | 'a'<<8 | 'l'<<16 | 't'<<24), /* Alternate Annotation Forms */ - nlck = ('n' | 'l'<<8 | 'c'<<16 | 'k'<<24), /* NLC Kanji Forms */ - nukt = ('n' | 'u'<<8 | 'k'<<16 | 't'<<24), /* Nukta Forms */ - onum = ('o' | 'n'<<8 | 'u'<<16 | 'm'<<24), /* Oldstyle Figures */ - opbd = ('o' | 'p'<<8 | 'b'<<16 | 'd'<<24), /* Optical Bounds */ - ordn = ('o' | 'r'<<8 | 'd'<<16 | 'n'<<24), /* Ordinals */ - ornm = ('o' | 'r'<<8 | 'n'<<16 | 'm'<<24), /* Ornaments */ - palt = ('p' | 'a'<<8 | 'l'<<16 | 't'<<24), /* Proportional Alternate Widths */ - pcap = ('p' | 'c'<<8 | 'a'<<16 | 'p'<<24), /* Petite Capitals */ - pkna = ('p' | 'k'<<8 | 'n'<<16 | 'a'<<24), /* Proportional Kana */ - pnum = ('p' | 'n'<<8 | 'u'<<16 | 'm'<<24), /* Proportional Figures */ - pres = ('p' | 'r'<<8 | 'e'<<16 | 's'<<24), /* Pre-base Substitutions */ - psts = ('p' | 's'<<8 | 't'<<16 | 's'<<24), /* Post-base Substitutions */ - pwid = ('p' | 'w'<<8 | 'i'<<16 | 'd'<<24), /* Proportional Widths */ - qwid = ('q' | 'w'<<8 | 'i'<<16 | 'd'<<24), /* Quarter Widths */ - rand = ('r' | 'a'<<8 | 'n'<<16 | 'd'<<24), /* Randomize */ - rclt = ('r' | 'c'<<8 | 'l'<<16 | 't'<<24), /* Required Contextual Alternates */ - rkrf = ('r' | 'k'<<8 | 'r'<<16 | 'f'<<24), /* Rakar Forms */ - rlig = ('r' | 'l'<<8 | 'i'<<16 | 'g'<<24), /* Required Ligatures */ - rtbd = ('r' | 't'<<8 | 'b'<<16 | 'd'<<24), /* Right Bounds */ - rtla = ('r' | 't'<<8 | 'l'<<16 | 'a'<<24), /* Right-to-left Alternates */ - rtlm = ('r' | 't'<<8 | 'l'<<16 | 'm'<<24), /* Right-to-left Mirrored Forms */ - ruby = ('r' | 'u'<<8 | 'b'<<16 | 'y'<<24), /* Ruby Notation Forms */ - rvrn = ('r' | 'v'<<8 | 'r'<<16 | 'n'<<24), /* Required Variation Alternates */ - salt = ('s' | 'a'<<8 | 'l'<<16 | 't'<<24), /* Stylistic Alternates */ - sinf = ('s' | 'i'<<8 | 'n'<<16 | 'f'<<24), /* Scientific Inferiors */ - size = ('s' | 'i'<<8 | 'z'<<16 | 'e'<<24), /* Optical size */ - smcp = ('s' | 'm'<<8 | 'c'<<16 | 'p'<<24), /* Small Capitals */ - smpl = ('s' | 'm'<<8 | 'p'<<16 | 'l'<<24), /* Simplified Forms */ - ss01 = ('s' | 's'<<8 | '0'<<16 | '1'<<24), /* 'ss20' Stylistic Set 1 – Stylistic Set 20 */ - ssty = ('s' | 's'<<8 | 't'<<16 | 'y'<<24), /* Math Script-style Alternates */ - stch = ('s' | 't'<<8 | 'c'<<16 | 'h'<<24), /* Stretching Glyph Decomposition */ - subs = ('s' | 'u'<<8 | 'b'<<16 | 's'<<24), /* Subscript */ - sups = ('s' | 'u'<<8 | 'p'<<16 | 's'<<24), /* Superscript */ - swsh = ('s' | 'w'<<8 | 's'<<16 | 'h'<<24), /* Swash */ - test = ('t' | 'e'<<8 | 's'<<16 | 't'<<24), /* Test features, only for development */ - titl = ('t' | 'i'<<8 | 't'<<16 | 'l'<<24), /* Titling */ - tnam = ('t' | 'n'<<8 | 'a'<<16 | 'm'<<24), /* Traditional Name Forms */ - tnum = ('t' | 'n'<<8 | 'u'<<16 | 'm'<<24), /* Tabular Figures */ - trad = ('t' | 'r'<<8 | 'a'<<16 | 'd'<<24), /* Traditional Forms */ - twid = ('t' | 'w'<<8 | 'i'<<16 | 'd'<<24), /* Third Widths */ - unic = ('u' | 'n'<<8 | 'i'<<16 | 'c'<<24), /* Unicase */ - valt = ('v' | 'a'<<8 | 'l'<<16 | 't'<<24), /* Alternate Vertical Metrics */ - vapk = ('v' | 'a'<<8 | 'p'<<16 | 'k'<<24), /* Kerning for Alternate Proportional Vertical Metrics */ - vatu = ('v' | 'a'<<8 | 't'<<16 | 'u'<<24), /* Vattu Variants */ - vchw = ('v' | 'c'<<8 | 'h'<<16 | 'w'<<24), /* Vertical Contextual Half-width Spacing */ - vert = ('v' | 'e'<<8 | 'r'<<16 | 't'<<24), /* Vertical Alternates */ - vhal = ('v' | 'h'<<8 | 'a'<<16 | 'l'<<24), /* Alternate Vertical Half Metrics */ - vkna = ('v' | 'k'<<8 | 'n'<<16 | 'a'<<24), /* Vertical Kana Alternates */ - vkrn = ('v' | 'k'<<8 | 'r'<<16 | 'n'<<24), /* Vertical Kerning */ - vpal = ('v' | 'p'<<8 | 'a'<<16 | 'l'<<24), /* Proportional Alternate Vertical Metrics */ - vrt2 = ('v' | 'r'<<8 | 't'<<16 | '2'<<24), /* Vertical Alternates and Rotation */ - vrtr = ('v' | 'r'<<8 | 't'<<16 | 'r'<<24), /* Vertical Alternates for Rotation */ - zero = ('z' | 'e'<<8 | 'r'<<16 | 'o'<<24), /* Slashed Zero */ + UNREGISTERED = 0, // Features that aren't pre-defined in the OpenType spec + isol = 'i' | 's'<<8 | 'o'<<16 | 'l'<<24, // Isolated Forms + fina = 'f' | 'i'<<8 | 'n'<<16 | 'a'<<24, // Terminal Forms + fin2 = 'f' | 'i'<<8 | 'n'<<16 | '2'<<24, // Terminal Forms #2 + fin3 = 'f' | 'i'<<8 | 'n'<<16 | '3'<<24, // Terminal Forms #3 + medi = 'm' | 'e'<<8 | 'd'<<16 | 'i'<<24, // Medial Forms + med2 = 'm' | 'e'<<8 | 'd'<<16 | '2'<<24, // Medial Forms #2 + init = 'i' | 'n'<<8 | 'i'<<16 | 't'<<24, // Initial Forms + ljmo = 'l' | 'j'<<8 | 'm'<<16 | 'o'<<24, // Leading Jamo Forms + vjmo = 'v' | 'j'<<8 | 'm'<<16 | 'o'<<24, // Vowel Jamo Forms + tjmo = 't' | 'j'<<8 | 'm'<<16 | 'o'<<24, // Trailing Jamo Forms + rphf = 'r' | 'p'<<8 | 'h'<<16 | 'f'<<24, // Reph Form + blwf = 'b' | 'l'<<8 | 'w'<<16 | 'f'<<24, // Below-base Forms + half = 'h' | 'a'<<8 | 'l'<<16 | 'f'<<24, // Half Forms + pstf = 'p' | 's'<<8 | 't'<<16 | 'f'<<24, // Post-base Forms + abvf = 'a' | 'b'<<8 | 'v'<<16 | 'f'<<24, // Above-base Forms + pref = 'p' | 'r'<<8 | 'e'<<16 | 'f'<<24, // Pre-base Forms + numr = 'n' | 'u'<<8 | 'm'<<16 | 'r'<<24, // Numerators + frac = 'f' | 'r'<<8 | 'a'<<16 | 'c'<<24, // Fractions + dnom = 'd' | 'n'<<8 | 'o'<<16 | 'm'<<24, // Denominators + cfar = 'c' | 'f'<<8 | 'a'<<16 | 'r'<<24, // Conjunct Form After Ro + aalt = 'a' | 'a'<<8 | 'l'<<16 | 't'<<24, // Access All Alternates + abvm = 'a' | 'b'<<8 | 'v'<<16 | 'm'<<24, // Above-base Mark Positioning + abvs = 'a' | 'b'<<8 | 'v'<<16 | 's'<<24, // Above-base Substitutions + afrc = 'a' | 'f'<<8 | 'r'<<16 | 'c'<<24, // Alternative Fractions + akhn = 'a' | 'k'<<8 | 'h'<<16 | 'n'<<24, // Akhand + apkn = 'a' | 'p'<<8 | 'k'<<16 | 'n'<<24, // Kerning for Alternate Proportional Widths + blwm = 'b' | 'l'<<8 | 'w'<<16 | 'm'<<24, // Below-base Mark Positioning + blws = 'b' | 'l'<<8 | 'w'<<16 | 's'<<24, // Below-base Substitutions + calt = 'c' | 'a'<<8 | 'l'<<16 | 't'<<24, // Contextual Alternates + Case = 'c' | 'a'<<8 | 's'<<16 | 'e'<<24, // Case-sensitive Forms + ccmp = 'c' | 'c'<<8 | 'm'<<16 | 'p'<<24, // Glyph Composition / Decomposition + chws = 'c' | 'h'<<8 | 'w'<<16 | 's'<<24, // Contextual Half-width Spacing + cjct = 'c' | 'j'<<8 | 'c'<<16 | 't'<<24, // Conjunct Forms + clig = 'c' | 'l'<<8 | 'i'<<16 | 'g'<<24, // Contextual Ligatures + cpct = 'c' | 'p'<<8 | 'c'<<16 | 't'<<24, // Centered CJK Punctuation + cpsp = 'c' | 'p'<<8 | 's'<<16 | 'p'<<24, // Capital Spacing + cswh = 'c' | 's'<<8 | 'w'<<16 | 'h'<<24, // Contextual Swash + curs = 'c' | 'u'<<8 | 'r'<<16 | 's'<<24, // Cursive Positioning + cv01 = 'c' | 'v'<<8 | '0'<<16 | '1'<<24, // Character Variant 1 + cv02 = 'c' | 'v'<<8 | '0'<<16 | '2'<<24, // Character Variant 2 + cv03 = 'c' | 'v'<<8 | '0'<<16 | '3'<<24, // Character Variant 3 + cv04 = 'c' | 'v'<<8 | '0'<<16 | '4'<<24, // Character Variant 4 + cv05 = 'c' | 'v'<<8 | '0'<<16 | '5'<<24, // Character Variant 5 + cv06 = 'c' | 'v'<<8 | '0'<<16 | '6'<<24, // Character Variant 6 + cv07 = 'c' | 'v'<<8 | '0'<<16 | '7'<<24, // Character Variant 7 + cv08 = 'c' | 'v'<<8 | '0'<<16 | '8'<<24, // Character Variant 8 + cv09 = 'c' | 'v'<<8 | '0'<<16 | '9'<<24, // Character Variant 9 + cv10 = 'c' | 'v'<<8 | '1'<<16 | '0'<<24, // Character Variant 10 + cv11 = 'c' | 'v'<<8 | '1'<<16 | '1'<<24, // Character Variant 11 + cv12 = 'c' | 'v'<<8 | '1'<<16 | '2'<<24, // Character Variant 12 + cv13 = 'c' | 'v'<<8 | '1'<<16 | '3'<<24, // Character Variant 13 + cv14 = 'c' | 'v'<<8 | '1'<<16 | '4'<<24, // Character Variant 14 + cv15 = 'c' | 'v'<<8 | '1'<<16 | '5'<<24, // Character Variant 15 + cv16 = 'c' | 'v'<<8 | '1'<<16 | '6'<<24, // Character Variant 16 + cv17 = 'c' | 'v'<<8 | '1'<<16 | '7'<<24, // Character Variant 17 + cv18 = 'c' | 'v'<<8 | '1'<<16 | '8'<<24, // Character Variant 18 + cv19 = 'c' | 'v'<<8 | '1'<<16 | '9'<<24, // Character Variant 19 + cv20 = 'c' | 'v'<<8 | '2'<<16 | '0'<<24, // Character Variant 20 + cv21 = 'c' | 'v'<<8 | '2'<<16 | '1'<<24, // Character Variant 21 + cv22 = 'c' | 'v'<<8 | '2'<<16 | '2'<<24, // Character Variant 22 + cv23 = 'c' | 'v'<<8 | '2'<<16 | '3'<<24, // Character Variant 23 + cv24 = 'c' | 'v'<<8 | '2'<<16 | '4'<<24, // Character Variant 24 + cv25 = 'c' | 'v'<<8 | '2'<<16 | '5'<<24, // Character Variant 25 + cv26 = 'c' | 'v'<<8 | '2'<<16 | '6'<<24, // Character Variant 26 + cv27 = 'c' | 'v'<<8 | '2'<<16 | '7'<<24, // Character Variant 27 + cv28 = 'c' | 'v'<<8 | '2'<<16 | '8'<<24, // Character Variant 28 + cv29 = 'c' | 'v'<<8 | '2'<<16 | '9'<<24, // Character Variant 29 + cv30 = 'c' | 'v'<<8 | '3'<<16 | '0'<<24, // Character Variant 30 + cv31 = 'c' | 'v'<<8 | '3'<<16 | '1'<<24, // Character Variant 31 + cv32 = 'c' | 'v'<<8 | '3'<<16 | '2'<<24, // Character Variant 32 + cv33 = 'c' | 'v'<<8 | '3'<<16 | '3'<<24, // Character Variant 33 + cv34 = 'c' | 'v'<<8 | '3'<<16 | '4'<<24, // Character Variant 34 + cv35 = 'c' | 'v'<<8 | '3'<<16 | '5'<<24, // Character Variant 35 + cv36 = 'c' | 'v'<<8 | '3'<<16 | '6'<<24, // Character Variant 36 + cv37 = 'c' | 'v'<<8 | '3'<<16 | '7'<<24, // Character Variant 37 + cv38 = 'c' | 'v'<<8 | '3'<<16 | '8'<<24, // Character Variant 38 + cv39 = 'c' | 'v'<<8 | '3'<<16 | '9'<<24, // Character Variant 39 + cv40 = 'c' | 'v'<<8 | '4'<<16 | '0'<<24, // Character Variant 40 + cv41 = 'c' | 'v'<<8 | '4'<<16 | '1'<<24, // Character Variant 41 + cv42 = 'c' | 'v'<<8 | '4'<<16 | '2'<<24, // Character Variant 42 + cv43 = 'c' | 'v'<<8 | '4'<<16 | '3'<<24, // Character Variant 43 + cv44 = 'c' | 'v'<<8 | '4'<<16 | '4'<<24, // Character Variant 44 + cv45 = 'c' | 'v'<<8 | '4'<<16 | '5'<<24, // Character Variant 45 + cv46 = 'c' | 'v'<<8 | '4'<<16 | '6'<<24, // Character Variant 46 + cv47 = 'c' | 'v'<<8 | '4'<<16 | '7'<<24, // Character Variant 47 + cv48 = 'c' | 'v'<<8 | '4'<<16 | '8'<<24, // Character Variant 48 + cv49 = 'c' | 'v'<<8 | '4'<<16 | '9'<<24, // Character Variant 49 + cv50 = 'c' | 'v'<<8 | '5'<<16 | '0'<<24, // Character Variant 50 + cv51 = 'c' | 'v'<<8 | '5'<<16 | '1'<<24, // Character Variant 51 + cv52 = 'c' | 'v'<<8 | '5'<<16 | '2'<<24, // Character Variant 52 + cv53 = 'c' | 'v'<<8 | '5'<<16 | '3'<<24, // Character Variant 53 + cv54 = 'c' | 'v'<<8 | '5'<<16 | '4'<<24, // Character Variant 54 + cv55 = 'c' | 'v'<<8 | '5'<<16 | '5'<<24, // Character Variant 55 + cv56 = 'c' | 'v'<<8 | '5'<<16 | '6'<<24, // Character Variant 56 + cv57 = 'c' | 'v'<<8 | '5'<<16 | '7'<<24, // Character Variant 57 + cv58 = 'c' | 'v'<<8 | '5'<<16 | '8'<<24, // Character Variant 58 + cv59 = 'c' | 'v'<<8 | '5'<<16 | '9'<<24, // Character Variant 59 + cv60 = 'c' | 'v'<<8 | '6'<<16 | '0'<<24, // Character Variant 60 + cv61 = 'c' | 'v'<<8 | '6'<<16 | '1'<<24, // Character Variant 61 + cv62 = 'c' | 'v'<<8 | '6'<<16 | '2'<<24, // Character Variant 62 + cv63 = 'c' | 'v'<<8 | '6'<<16 | '3'<<24, // Character Variant 63 + cv64 = 'c' | 'v'<<8 | '6'<<16 | '4'<<24, // Character Variant 64 + cv65 = 'c' | 'v'<<8 | '6'<<16 | '5'<<24, // Character Variant 65 + cv66 = 'c' | 'v'<<8 | '6'<<16 | '6'<<24, // Character Variant 66 + cv67 = 'c' | 'v'<<8 | '6'<<16 | '7'<<24, // Character Variant 67 + cv68 = 'c' | 'v'<<8 | '6'<<16 | '8'<<24, // Character Variant 68 + cv69 = 'c' | 'v'<<8 | '6'<<16 | '9'<<24, // Character Variant 69 + cv70 = 'c' | 'v'<<8 | '7'<<16 | '0'<<24, // Character Variant 70 + cv71 = 'c' | 'v'<<8 | '7'<<16 | '1'<<24, // Character Variant 71 + cv72 = 'c' | 'v'<<8 | '7'<<16 | '2'<<24, // Character Variant 72 + cv73 = 'c' | 'v'<<8 | '7'<<16 | '3'<<24, // Character Variant 73 + cv74 = 'c' | 'v'<<8 | '7'<<16 | '4'<<24, // Character Variant 74 + cv75 = 'c' | 'v'<<8 | '7'<<16 | '5'<<24, // Character Variant 75 + cv76 = 'c' | 'v'<<8 | '7'<<16 | '6'<<24, // Character Variant 76 + cv77 = 'c' | 'v'<<8 | '7'<<16 | '7'<<24, // Character Variant 77 + cv78 = 'c' | 'v'<<8 | '7'<<16 | '8'<<24, // Character Variant 78 + cv79 = 'c' | 'v'<<8 | '7'<<16 | '9'<<24, // Character Variant 79 + cv80 = 'c' | 'v'<<8 | '8'<<16 | '0'<<24, // Character Variant 80 + cv81 = 'c' | 'v'<<8 | '8'<<16 | '1'<<24, // Character Variant 81 + cv82 = 'c' | 'v'<<8 | '8'<<16 | '2'<<24, // Character Variant 82 + cv83 = 'c' | 'v'<<8 | '8'<<16 | '3'<<24, // Character Variant 83 + cv84 = 'c' | 'v'<<8 | '8'<<16 | '4'<<24, // Character Variant 84 + cv85 = 'c' | 'v'<<8 | '8'<<16 | '5'<<24, // Character Variant 85 + cv86 = 'c' | 'v'<<8 | '8'<<16 | '6'<<24, // Character Variant 86 + cv87 = 'c' | 'v'<<8 | '8'<<16 | '7'<<24, // Character Variant 87 + cv88 = 'c' | 'v'<<8 | '8'<<16 | '8'<<24, // Character Variant 88 + cv89 = 'c' | 'v'<<8 | '8'<<16 | '9'<<24, // Character Variant 89 + cv90 = 'c' | 'v'<<8 | '9'<<16 | '0'<<24, // Character Variant 90 + cv91 = 'c' | 'v'<<8 | '9'<<16 | '1'<<24, // Character Variant 91 + cv92 = 'c' | 'v'<<8 | '9'<<16 | '2'<<24, // Character Variant 92 + cv93 = 'c' | 'v'<<8 | '9'<<16 | '3'<<24, // Character Variant 93 + cv94 = 'c' | 'v'<<8 | '9'<<16 | '4'<<24, // Character Variant 94 + cv95 = 'c' | 'v'<<8 | '9'<<16 | '5'<<24, // Character Variant 95 + cv96 = 'c' | 'v'<<8 | '9'<<16 | '6'<<24, // Character Variant 96 + cv97 = 'c' | 'v'<<8 | '9'<<16 | '7'<<24, // Character Variant 97 + cv98 = 'c' | 'v'<<8 | '9'<<16 | '8'<<24, // Character Variant 98 + cv99 = 'c' | 'v'<<8 | '9'<<16 | '9'<<24, // Character Variant 99 + c2pc = 'c' | '2'<<8 | 'p'<<16 | 'c'<<24, // Petite Capitals From Capitals + c2sc = 'c' | '2'<<8 | 's'<<16 | 'c'<<24, // Small Capitals From Capitals + dist = 'd' | 'i'<<8 | 's'<<16 | 't'<<24, // Distances + dlig = 'd' | 'l'<<8 | 'i'<<16 | 'g'<<24, // Discretionary Ligatures + dtls = 'd' | 't'<<8 | 'l'<<16 | 's'<<24, // Dotless Forms + expt = 'e' | 'x'<<8 | 'p'<<16 | 't'<<24, // Expert Forms + falt = 'f' | 'a'<<8 | 'l'<<16 | 't'<<24, // Final Glyph on Line Alternates + flac = 'f' | 'l'<<8 | 'a'<<16 | 'c'<<24, // Flattened Accent Forms + fwid = 'f' | 'w'<<8 | 'i'<<16 | 'd'<<24, // Full Widths + haln = 'h' | 'a'<<8 | 'l'<<16 | 'n'<<24, // Halant Forms + halt = 'h' | 'a'<<8 | 'l'<<16 | 't'<<24, // Alternate Half Widths + hist = 'h' | 'i'<<8 | 's'<<16 | 't'<<24, // Historical Forms + hkna = 'h' | 'k'<<8 | 'n'<<16 | 'a'<<24, // Horizontal Kana Alternates + hlig = 'h' | 'l'<<8 | 'i'<<16 | 'g'<<24, // Historical Ligatures + hngl = 'h' | 'n'<<8 | 'g'<<16 | 'l'<<24, // Hangul + hojo = 'h' | 'o'<<8 | 'j'<<16 | 'o'<<24, // Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms) + hwid = 'h' | 'w'<<8 | 'i'<<16 | 'd'<<24, // Half Widths + ital = 'i' | 't'<<8 | 'a'<<16 | 'l'<<24, // Italics + jalt = 'j' | 'a'<<8 | 'l'<<16 | 't'<<24, // Justification Alternates + jp78 = 'j' | 'p'<<8 | '7'<<16 | '8'<<24, // JIS78 Forms + jp83 = 'j' | 'p'<<8 | '8'<<16 | '3'<<24, // JIS83 Forms + jp90 = 'j' | 'p'<<8 | '9'<<16 | '0'<<24, // JIS90 Forms + jp04 = 'j' | 'p'<<8 | '0'<<16 | '4'<<24, // JIS2004 Forms + kern = 'k' | 'e'<<8 | 'r'<<16 | 'n'<<24, // Kerning + lfbd = 'l' | 'f'<<8 | 'b'<<16 | 'd'<<24, // Left Bounds + liga = 'l' | 'i'<<8 | 'g'<<16 | 'a'<<24, // Standard Ligatures + lnum = 'l' | 'n'<<8 | 'u'<<16 | 'm'<<24, // Lining Figures + locl = 'l' | 'o'<<8 | 'c'<<16 | 'l'<<24, // Localized Forms + ltra = 'l' | 't'<<8 | 'r'<<16 | 'a'<<24, // Left-to-right Alternates + ltrm = 'l' | 't'<<8 | 'r'<<16 | 'm'<<24, // Left-to-right Mirrored Forms + mark = 'm' | 'a'<<8 | 'r'<<16 | 'k'<<24, // Mark Positioning + mgrk = 'm' | 'g'<<8 | 'r'<<16 | 'k'<<24, // Mathematical Greek + mkmk = 'm' | 'k'<<8 | 'm'<<16 | 'k'<<24, // Mark to Mark Positioning + mset = 'm' | 's'<<8 | 'e'<<16 | 't'<<24, // Mark Positioning via Substitution + nalt = 'n' | 'a'<<8 | 'l'<<16 | 't'<<24, // Alternate Annotation Forms + nlck = 'n' | 'l'<<8 | 'c'<<16 | 'k'<<24, // NLC Kanji Forms + nukt = 'n' | 'u'<<8 | 'k'<<16 | 't'<<24, // Nukta Forms + onum = 'o' | 'n'<<8 | 'u'<<16 | 'm'<<24, // Oldstyle Figures + opbd = 'o' | 'p'<<8 | 'b'<<16 | 'd'<<24, // Optical Bounds + ordn = 'o' | 'r'<<8 | 'd'<<16 | 'n'<<24, // Ordinals + ornm = 'o' | 'r'<<8 | 'n'<<16 | 'm'<<24, // Ornaments + palt = 'p' | 'a'<<8 | 'l'<<16 | 't'<<24, // Proportional Alternate Widths + pcap = 'p' | 'c'<<8 | 'a'<<16 | 'p'<<24, // Petite Capitals + pkna = 'p' | 'k'<<8 | 'n'<<16 | 'a'<<24, // Proportional Kana + pnum = 'p' | 'n'<<8 | 'u'<<16 | 'm'<<24, // Proportional Figures + pres = 'p' | 'r'<<8 | 'e'<<16 | 's'<<24, // Pre-base Substitutions + psts = 'p' | 's'<<8 | 't'<<16 | 's'<<24, // Post-base Substitutions + pwid = 'p' | 'w'<<8 | 'i'<<16 | 'd'<<24, // Proportional Widths + qwid = 'q' | 'w'<<8 | 'i'<<16 | 'd'<<24, // Quarter Widths + rand = 'r' | 'a'<<8 | 'n'<<16 | 'd'<<24, // Randomize + rclt = 'r' | 'c'<<8 | 'l'<<16 | 't'<<24, // Required Contextual Alternates + rkrf = 'r' | 'k'<<8 | 'r'<<16 | 'f'<<24, // Rakar Forms + rlig = 'r' | 'l'<<8 | 'i'<<16 | 'g'<<24, // Required Ligatures + rtbd = 'r' | 't'<<8 | 'b'<<16 | 'd'<<24, // Right Bounds + rtla = 'r' | 't'<<8 | 'l'<<16 | 'a'<<24, // Right-to-left Alternates + rtlm = 'r' | 't'<<8 | 'l'<<16 | 'm'<<24, // Right-to-left Mirrored Forms + ruby = 'r' | 'u'<<8 | 'b'<<16 | 'y'<<24, // Ruby Notation Forms + rvrn = 'r' | 'v'<<8 | 'r'<<16 | 'n'<<24, // Required Variation Alternates + salt = 's' | 'a'<<8 | 'l'<<16 | 't'<<24, // Stylistic Alternates + sinf = 's' | 'i'<<8 | 'n'<<16 | 'f'<<24, // Scientific Inferiors + size = 's' | 'i'<<8 | 'z'<<16 | 'e'<<24, // Optical size + smcp = 's' | 'm'<<8 | 'c'<<16 | 'p'<<24, // Small Capitals + smpl = 's' | 'm'<<8 | 'p'<<16 | 'l'<<24, // Simplified Forms + ss01 = 's' | 's'<<8 | '0'<<16 | '1'<<24, // Stylistic Set 1 + ss02 = 's' | 's'<<8 | '0'<<16 | '2'<<24, // Stylistic Set 2 + ss03 = 's' | 's'<<8 | '0'<<16 | '3'<<24, // Stylistic Set 3 + ss04 = 's' | 's'<<8 | '0'<<16 | '4'<<24, // Stylistic Set 4 + ss05 = 's' | 's'<<8 | '0'<<16 | '5'<<24, // Stylistic Set 5 + ss06 = 's' | 's'<<8 | '0'<<16 | '6'<<24, // Stylistic Set 6 + ss07 = 's' | 's'<<8 | '0'<<16 | '7'<<24, // Stylistic Set 7 + ss08 = 's' | 's'<<8 | '0'<<16 | '8'<<24, // Stylistic Set 8 + ss09 = 's' | 's'<<8 | '0'<<16 | '9'<<24, // Stylistic Set 9 + ss10 = 's' | 's'<<8 | '1'<<16 | '0'<<24, // Stylistic Set 10 + ss11 = 's' | 's'<<8 | '1'<<16 | '1'<<24, // Stylistic Set 11 + ss12 = 's' | 's'<<8 | '1'<<16 | '2'<<24, // Stylistic Set 12 + ss13 = 's' | 's'<<8 | '1'<<16 | '3'<<24, // Stylistic Set 13 + ss14 = 's' | 's'<<8 | '1'<<16 | '4'<<24, // Stylistic Set 14 + ss15 = 's' | 's'<<8 | '1'<<16 | '5'<<24, // Stylistic Set 15 + ss16 = 's' | 's'<<8 | '1'<<16 | '6'<<24, // Stylistic Set 16 + ss17 = 's' | 's'<<8 | '1'<<16 | '7'<<24, // Stylistic Set 17 + ss18 = 's' | 's'<<8 | '1'<<16 | '8'<<24, // Stylistic Set 18 + ss19 = 's' | 's'<<8 | '1'<<16 | '9'<<24, // Stylistic Set 19 + ss20 = 's' | 's'<<8 | '2'<<16 | '0'<<24, // Stylistic Set 20 + ssty = 's' | 's'<<8 | 't'<<16 | 'y'<<24, // Math Script-style Alternates + stch = 's' | 't'<<8 | 'c'<<16 | 'h'<<24, // Stretching Glyph Decomposition + subs = 's' | 'u'<<8 | 'b'<<16 | 's'<<24, // Subscript + sups = 's' | 'u'<<8 | 'p'<<16 | 's'<<24, // Superscript + swsh = 's' | 'w'<<8 | 's'<<16 | 'h'<<24, // Swash + test = 't' | 'e'<<8 | 's'<<16 | 't'<<24, // Test features, only for development + titl = 't' | 'i'<<8 | 't'<<16 | 'l'<<24, // Titling + tnam = 't' | 'n'<<8 | 'a'<<16 | 'm'<<24, // Traditional Name Forms + tnum = 't' | 'n'<<8 | 'u'<<16 | 'm'<<24, // Tabular Figures + trad = 't' | 'r'<<8 | 'a'<<16 | 'd'<<24, // Traditional Forms + twid = 't' | 'w'<<8 | 'i'<<16 | 'd'<<24, // Third Widths + unic = 'u' | 'n'<<8 | 'i'<<16 | 'c'<<24, // Unicase + valt = 'v' | 'a'<<8 | 'l'<<16 | 't'<<24, // Alternate Vertical Metrics + vapk = 'v' | 'a'<<8 | 'p'<<16 | 'k'<<24, // Kerning for Alternate Proportional Vertical Metrics + vatu = 'v' | 'a'<<8 | 't'<<16 | 'u'<<24, // Vattu Variants + vchw = 'v' | 'c'<<8 | 'h'<<16 | 'w'<<24, // Vertical Contextual Half-width Spacing + vert = 'v' | 'e'<<8 | 'r'<<16 | 't'<<24, // Vertical Alternates + vhal = 'v' | 'h'<<8 | 'a'<<16 | 'l'<<24, // Alternate Vertical Half Metrics + vkna = 'v' | 'k'<<8 | 'n'<<16 | 'a'<<24, // Vertical Kana Alternates + vkrn = 'v' | 'k'<<8 | 'r'<<16 | 'n'<<24, // Vertical Kerning + vpal = 'v' | 'p'<<8 | 'a'<<16 | 'l'<<24, // Proportional Alternate Vertical Metrics + vrt2 = 'v' | 'r'<<8 | 't'<<16 | '2'<<24, // Vertical Alternates and Rotation + vrtr = 'v' | 'r'<<8 | 't'<<16 | 'r'<<24, // Vertical Alternates for Rotation + zero = 'z' | 'e'<<8 | 'r'<<16 | 'o'<<24, // Slashed Zero } -feature_id :: enum u32 { - UNREGISTERED = 0, - isol, /* Isolated Forms */ - fina, /* Terminal Forms */ - fin2, /* Terminal Forms #2 */ - fin3, /* Terminal Forms #3 */ - medi, /* Medial Forms */ - med2, /* Medial Forms #2 */ - init, /* Initial Forms */ - ljmo, /* Leading Jamo Forms */ - vjmo, /* Vowel Jamo Forms */ - tjmo, /* Trailing Jamo Forms */ - rphf, /* Reph Form */ - blwf, /* Below-base Forms */ - half, /* Half Forms */ - pstf, /* Post-base Forms */ - abvf, /* Above-base Forms */ - pref, /* Pre-base Forms */ - numr, /* Numerators */ - frac, /* Fractions */ - dnom, /* Denominators */ - cfar, /* Conjunct Form After Ro */ - aalt, /* Access All Alternates */ - abvm, /* Above-base Mark Positioning */ - abvs, /* Above-base Substitutions */ - afrc, /* Alternative Fractions */ - akhn, /* Akhand */ - apkn, /* Kerning for Alternate Proportional Widths */ - blwm, /* Below-base Mark Positioning */ - blws, /* Below-base Substitutions */ - calt, /* Contextual Alternates */ - Case, /* Case-sensitive Forms */ - ccmp, /* Glyph Composition / Decomposition */ - chws, /* Contextual Half-width Spacing */ - cjct, /* Conjunct Forms */ - clig, /* Contextual Ligatures */ - cpct, /* Centered CJK Punctuation */ - cpsp, /* Capital Spacing */ - cswh, /* Contextual Swash */ - curs, /* Cursive Positioning */ - cv01, /* 'cv99' Character Variant 1 – Character Variant 99 */ - c2pc, /* Petite Capitals From Capitals */ - c2sc, /* Small Capitals From Capitals */ - dist, /* Distances */ - dlig, /* Discretionary Ligatures */ - dtls, /* Dotless Forms */ - expt, /* Expert Forms */ - falt, /* Final Glyph on Line Alternates */ - flac, /* Flattened Accent Forms */ - fwid, /* Full Widths */ - haln, /* Halant Forms */ - halt, /* Alternate Half Widths */ - hist, /* Historical Forms */ - hkna, /* Horizontal Kana Alternates */ - hlig, /* Historical Ligatures */ - hngl, /* Hangul */ - hojo, /* Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms) */ - hwid, /* Half Widths */ - ital, /* Italics */ - jalt, /* Justification Alternates */ - jp78, /* JIS78 Forms */ - jp83, /* JIS83 Forms */ - jp90, /* JIS90 Forms */ - jp04, /* JIS2004 Forms */ - kern, /* Kerning */ - lfbd, /* Left Bounds */ - liga, /* Standard Ligatures */ - lnum, /* Lining Figures */ - locl, /* Localized Forms */ - ltra, /* Left-to-right Alternates */ - ltrm, /* Left-to-right Mirrored Forms */ - mark, /* Mark Positioning */ - mgrk, /* Mathematical Greek */ - mkmk, /* Mark to Mark Positioning */ - mset, /* Mark Positioning via Substitution */ - nalt, /* Alternate Annotation Forms */ - nlck, /* NLC Kanji Forms */ - nukt, /* Nukta Forms */ - onum, /* Oldstyle Figures */ - opbd, /* Optical Bounds */ - ordn, /* Ordinals */ - ornm, /* Ornaments */ - palt, /* Proportional Alternate Widths */ - pcap, /* Petite Capitals */ - pkna, /* Proportional Kana */ - pnum, /* Proportional Figures */ - pres, /* Pre-base Substitutions */ - psts, /* Post-base Substitutions */ - pwid, /* Proportional Widths */ - qwid, /* Quarter Widths */ - rand, /* Randomize */ - rclt, /* Required Contextual Alternates */ - rkrf, /* Rakar Forms */ - rlig, /* Required Ligatures */ - rtbd, /* Right Bounds */ - rtla, /* Right-to-left Alternates */ - rtlm, /* Right-to-left Mirrored Forms */ - ruby, /* Ruby Notation Forms */ - rvrn, /* Required Variation Alternates */ - salt, /* Stylistic Alternates */ - sinf, /* Scientific Inferiors */ - size, /* Optical size */ - smcp, /* Small Capitals */ - smpl, /* Simplified Forms */ - ss01, /* 'ss20' Stylistic Set 1 – Stylistic Set 20 */ - ssty, /* Math Script-style Alternates */ - stch, /* Stretching Glyph Decomposition */ - subs, /* Subscript */ - sups, /* Superscript */ - swsh, /* Swash */ - test, /* Test features, only for development */ - titl, /* Titling */ - tnam, /* Traditional Name Forms */ - tnum, /* Tabular Figures */ - trad, /* Traditional Forms */ - twid, /* Third Widths */ - unic, /* Unicase */ - valt, /* Alternate Vertical Metrics */ - vapk, /* Kerning for Alternate Proportional Vertical Metrics */ - vatu, /* Vattu Variants */ - vchw, /* Vertical Contextual Half-width Spacing */ - vert, /* Vertical Alternates */ - vhal, /* Alternate Vertical Half Metrics */ - vkna, /* Vertical Kana Alternates */ - vkrn, /* Vertical Kerning */ - vpal, /* Proportional Alternate Vertical Metrics */ - vrt2, /* Vertical Alternates and Rotation */ - vrtr, /* Vertical Alternates for Rotation */ - zero, /* Slashed Zero */ -} - - -shaping_table :: enum u8 { - GSUB, - GPOS, -} - -lookup_info :: struct { - MaximumBacktrackWithoutSkippingGlyphs: u32, - MaximumLookaheadWithoutSkippingGlyphs: u32, - MaximumSubstitutionOutputSize: u32, - MaximumInputSequenceLength: u32, - MaximumLookupStackSize: u32, -} - -gdef :: struct {} -cmap_14 :: struct {} -gsub_gpos :: struct {} -maxp :: struct {} -hea :: struct {} -iterate_features :: struct {} +_gdef :: struct {} +_cmap_14 :: struct {} +_gsub_gpos :: struct {} +_maxp :: struct {} +_hea :: struct {} shaper_properties :: struct {} -feature :: struct {} -head :: struct {} +_feature :: struct {} +_head :: struct {} +_langsys :: struct {} +shape_config :: struct {} +glyph_config :: struct {} +shape_context :: struct {} + +allocator_op_allocate :: struct { + Pointer: rawptr, + Size: u32, +} + +allocator_op_free :: struct { + Pointer: rawptr, +} + +allocator_op :: struct { + Kind: allocator_op_kind, + + using op: struct #raw_union { + Allocate: allocator_op_allocate, + Free: allocator_op_free, + }, +} + +allocator_function :: #type proc "c" (Data: rawptr, Op: ^allocator_op) lookup_subtable_info :: struct { - MinimumBacktrackPlusOne: u32, - MinimumFollowupPlusOne: u32, + MinimumBacktrackPlusOne: u16, + MinimumFollowupPlusOne: u16, } -font :: struct { - FileBase: [^]byte, - FileSize: un, - Head: ^head, - Cmap: ^u16, - Gdef: ^gdef, - Cmap14: ^cmap_14, - ShapingTables: [shaping_table]^gsub_gpos, - Fvar: rawptr, - Maxp: ^maxp, +blob_table :: struct { + OffsetFromStartOfFile: u32, + Length: u32, +} - Hea: [orientation]^hea, - Mtx: [orientation]^u16, +load_font_state :: struct { + FontData: rawptr, + FontDataSize: u32, - LookupInfo: lookup_info, + Tables: [blob_table_id]blob_table, + LookupCount: u32, + LookupSubtableCount: u32, + GlyphCount: u32, + ScratchSize: u32, - GlyphCount: u32, - LookupCount: u32, - SubtableCount: u32, + GlyphLookupMatrixSizeInBytes: u32, + GlyphLookupSubtableMatrixSizeInBytes: u32, + TotalSize: u32, +} - GlyphLookupMatrix: [^]u32, // [LookupCount * GlyphCount] bitmap - GlyphLookupSubtableMatrix: [^]u32, // [LookupSubtableCount * GlyphCount] bitmap - LookupSubtableIndexOffsets: [^]u32, // [LookupCount] - SubtableInfos: [^]lookup_subtable_info, // [LookupSubtableCount] +blob_header :: struct { + Magic: u32, + Version: u32, + + LookupCount: u32, + LookupSubtableCount: u32, + GlyphCount: u32, GposLookupIndexOffset: u32, - Error: c.int, + GlyphLookupMatrixOffsetFromStartOfFile: u32, + GlyphLookupSubtableMatrixOffsetFromStartOfFile: u32, + LookupSubtableIndexOffsetsOffsetFromStartOfFile: u32, + SubtableInfosOffsetFromStartOfFile: u32, + + Tables: [blob_table_id]blob_table, +} + +font :: struct { + Allocator: allocator_function, + AllocatorData: rawptr, + + Blob: ^blob_header, + Cmap: ^u16, + Cmap14: ^_cmap_14, + + ShapingTables: [shaping_table]^_gsub_gpos, + + UserData: rawptr, + + Error: load_font_error, +} + +font_info :: struct { + Strings: [font_info_string_id]cstring, + StringLengths: [font_info_string_id]u16, + + StyleFlags: font_style_flags, + Weight: font_weight, + Width: font_width, +} + +feature_override :: struct { + Tag: feature_tag, + Value: c.int, +} + +break_type :: struct { + // The break code mostly works in relative positions, but we convert to absolute positions for the user. + // That way, breaks can be trivially stored and compared and such and it just works. + Position: c.int, + Flags: break_flags, + Direction: direction, // Only valid if (DIRECTION in Flags). + ParagraphDirection: direction, // Only valid if (PARAGRAPH_DIRECTION in Flags). + Script: script, // Only valid if (SCRIPT in Flags). +} + +bracket :: struct { + Codepoint: rune, + Position: u32, + Direction: u8, + Script: u8, +} + +// In the worst case, a single call to BreakAddCodepoint would generate 4 breaks. +// We buffer breaks to reorder them before returning them to the user. +// This potentially requires infinite memory, which we don't have, so you may want to tweak this constant, +// although, really, if the defaults don't work, then you have likely found very strange/adversarial text. +break_state :: struct { + Breaks: [8]break_type `fmt:"v,BreakCount"`, + BreakCount: u32, + + ParagraphDirection: direction, + UserParagraphDirection: direction, + + CurrentPosition: u32, + ParagraphStartPosition: u32, + + LastScriptBreakPosition: u32, + LastDirectionBreakPosition: u32, + LastScriptBreakScript: u8, + LastDirectionBreakDirection: u8, + + ScriptPositionOffset: i16, + ScriptCount: u32, + ScriptSet: [MAXIMUM_CODEPOINT_SCRIPTS]u8 `fmt:"v,ScriptCount"`, + + Brackets: [64]bracket `fmt:"v,BracketCount"`, + BracketCount: u32, + Flags: break_state_flags, + + FlagState: u32, // u8(break_flags)x4 + PositionOffset2: i16, + PositionOffset3: i16, + + WordBreakHistory: u32, // u8x4 + WordBreaks: u16, // u4x4 + WordUnbreaks: u16, // u4x4 + WordBreak2PositionOffset: i16, + + LineBreaks: u64, // u16x4 + // Instead of staying synchronized with LineBreaks/LineUnbreaks, + // this advances every character always. + // (This is only needed because ZWJ can create an unbreak while simultaneously being ignored.) + LineUnbreaksAsync: u64, // u16x4 + LineUnbreaks: u64, // u16x4 + LineBreakHistory: u32, // u8(line_break_class)x4 + LineBreak2PositionOffset: i16, + LineBreak3PositionOffset: i16, + + LastDirection: u8, + BidirectionalClass2: u8, + BidirectionalClass1: u8, + Bidirectional1PositionOffset: i16, + Bidirectional2PositionOffset: i16, + + JapaneseLineBreakStyle: japanese_line_break_style, + ConfigFlags: break_config_flags, + GraphemeBreakState: u8, + LastLineBreakClass: u8, + LastWordBreakClass: u8, + LastWordBreakClassIncludingIgnored: u8, +} + +decode :: struct { + Codepoint: rune, + + SourceCharactersConsumed: c.int, + Valid: b32, +} + +encode_utf8 :: struct { + Encoded: [4]u8 `fmt:"q,EncodedLength"`, + EncodedLength: c.int, + Valid: b32, } glyph_classes :: struct { @@ -1740,35 +1950,46 @@ glyph_classes :: struct { MarkAttachmentClass: u16, } -glyph_config :: struct { - EnabledFeatures: feature_set, - DisabledFeatures: feature_set, - FeatureOverrideCount: u32, - FeatureOverrideCapacity: u32, - RequiredFeatureOverrideCapacity: u32, - FeatureOverrides: [^]feature_override `fmt:"v,FeatureOverrideCount"`, -} - glyph :: struct { + Prev: ^glyph, + Next: ^glyph, + Codepoint: rune, Id: u16, // Glyph index. This is what you want to use to query outline data. Uid: u16, - Classes: glyph_classes, - Decomposition: u64, + // This field is kept and returned as-is throughout the shaping process. + // When you are using the context API, it contains a codepoint index always! + // To get the original user ID with the context API, you need to get the corresponding shape_codepoint + // with ShapeGetShapeCodepoint(Context, Glyph^.UserIdOrCodepointIndex, ...); + UserIdOrCodepointIndex: c.int, - Config: ^glyph_config, - - Flags: glyph_flags, - - // These fields are the glyph's final positioning data. - // For normal usage, you should not have to use these directly yourself. - // In case you are curious or have a specific need, see kbts_PositionGlyph() to see how these are used. + // Used by GPOS OffsetX: i32, OffsetY: i32, AdvanceX: i32, AdvanceY: i32, + // Earlier on, we used to assume that, if a glyph had no advance, or had the MARK glyph class, then + // it could be handled as a mark in layout operations. This is inaccurate. + // Unicode makes a distinction between attached marks and standalone marks. For our purposes, attached + // marks are marks that have found a valid base character to attach to. In practice, this means that the + // font contains a valid display position/configuration for it in the current context. + // In contrast, standalone marks are marks that aren't attached to anything. Fonts may still have glyphs + // for them, in which case we want to display those just like regular glyphs that take up horizontal space + // on the line. When fonts don't have glyphs for them, they simply stay around as zero-width glyphs. + // Standalone marks have notably different behavior compared to attached marks, and so, once we start + // applying positioning features, it becomes worthwhile to track exactly which glyph has attached to which. + AttachGlyph: ^glyph, // Set by GPOS attachments. + + Config: ^glyph_config, + + Decomposition: u64, + + Classes: glyph_classes, + + Flags: glyph_flags, + ParentInfo: u32, // This is set by GSUB and used by GPOS. @@ -1784,315 +2005,102 @@ glyph :: struct { // must keep track of associations of marks to particular ligature-glyph components. LigatureUid: u16, LigatureComponentIndexPlusOne: u16, - - // Earlier on, we used to assume that, if a glyph had no advance, or had the MARK glyph class, then - // it could be handled as a mark in layout operations. This is inaccurate. - // Unicode makes a distinction between attached marks and standalone marks. For our purposes, attached - // marks are marks that have found a valid base character to attach to. In practice, this means that the - // font contains a valid display position/configuration for it in the current context. - // In contrast, standalone marks are marks that aren't attached to anything. Fonts may still have glyphs - // for them, in which case we want to display those just like regular glyphs that take up horizontal space - // on the line. When fonts don't have glyphs for them, they simply stay around as zero-width glyphs. - // Standalone marks have notably different behavior compared to attached marks, and so, once we start - // applying positioning features, it becomes worthwhile to track exactly which glyph has attached to which. - AttachGlyphIndexPlusOne: u16, // Set by GPOS attachments. + LigatureComponentCount: u16, // Set in GSUB and used in GPOS, for STCH. JoiningFeature: joining_feature, // Unicode properties filled in by CodepointToGlyph. JoiningType: unicode_joining_type, - using ScriptBitField: bit_field u8 { - Script: script | 8, - }, - UnicodeFlags: unicode_flags, + UnicodeFlags: u8, SyllabicClass: u8, SyllabicPosition: u8, UseClass: u8, CombiningClass: u8, - MarkOrdering: u8, // Only used temporarily in NORMALIZE for Arabic mark reordering. + MarkOrdering: u8, // Only used temporarily in NORMALIZE for Arabic mark reordering. } -glyph_array :: struct { - Glyphs: [^]glyph `fmt:"v,Count"`, - Count: u32, - TotalCount: u32, - Capacity: u32, - RequiredCapacity: u32, -} +shape_codepoint :: struct { + Font: ^font, // Only set when (.GRAPHEME in BreakFlags) + Config: ^glyph_config, -op_state_normalize :: struct { - CodepointsToDecomposeCount: un, - AboveBaseGlyphCount: un, -} - - -skip_flags :: distinct bit_set[skip_flag; u32] -skip_flag :: enum u32 { - ZWNJ = 0, - ZWJ = 1, -} - -op_state_gsub :: struct { - LookupFeatures: feature_set, - LookupIndex: un, - GlyphFilter: glyph_flags, - SkipFlags: skip_flags, -} - -op_state_normalize_hangul :: struct { - LvtGlyphs: [4]glyph `fmt:"v,LvtGlyphCount"`, - LvtGlyphCount: un, -} - -op_state_op_specific :: struct #raw_union { - Normalize: op_state_normalize, - Gsub: op_state_gsub, - NormalizeHangul: op_state_normalize_hangul, -} - -lookup_indices :: struct { - FeatureTag: feature_tag, - FeatureId: feature_id, - SkipFlags: skip_flags, - GlyphFilter: glyph_flags, - Count: u32, - Indices: [^]u16 `fmt:"v,Count"`, -} - -feature_set :: struct { - Flags: [(uint(len(feature_id)) + 63) / 64]u64, -} - -feature_override :: struct { - Id: feature_id, - Tag: feature_tag, - EnabledOrAlternatePlusOne: u32, -} - -op :: struct { - Kind: op_kind, - Features: feature_set, -} - -// This needs to be updated when we change the op lists! -MAX_SIMULTANEOUS_FEATURES :: 16 -op_state :: struct { - WrittenCount: un, - GlyphIndex: un, - FrameCount: u32, - ResumePoint: u32, - - FeatureCount: u32, - FeatureLookupIndices: [MAX_SIMULTANEOUS_FEATURES]lookup_indices `fmt:"v,FeatureCount"`, - - UnregisteredFeatureCount: u32, - UnregisteredFeatureTags: [MAX_SIMULTANEOUS_FEATURES]feature_tag `fmt:"v,UnregisteredFeatureCount"`, - - OpSpecific: op_state_op_specific, - - // Ops are free to use the following as they please: - // LeftoverMemory: [LeftoverMemorySize]u8, -} - -op_list :: struct { // TODO(bill): is this actually a slice? e.g. `op_list :: []op_kind` - Ops: [^]op_kind, - Length: un, -} - -indic_script_properties :: struct { - ViramaCodepoint: rune, - BlwfPostOnly: bool, // b8 - RephPosition: reph_position, - RephEncoding: reph_encoding, - RightSideMatraPosition: syllabic_position, - AboveBaseMatraPosition: syllabic_position, - BelowBaseMatraPosition: syllabic_position, -} - -langsys :: struct {} - -shape_config :: struct { - Font: ^font, - Script: script, - Language: language, - Langsys: [shaping_table]^langsys, - OpLists: [4]op_list, - - Features: ^feature_set, - - Shaper: shaper, - ShaperProperties: ^shaper_properties, - - IndicScriptProperties: indic_script_properties, - Blwf: ^feature, - Pref: ^feature, - Pstf: ^feature, - Locl: ^feature, - Rphf: ^feature, - Half: ^feature, - Vatu: ^feature, - - // Indic - Virama: glyph, - - DottedCircle: glyph, - Whitespace: glyph, - - // Thai - Nikhahit: glyph, - SaraAa: glyph, -} - -shape_state :: struct { - Op: op, - Config: ^shape_config, - MainDirection: direction, - RunDirection: direction, - - UserFeatures: feature_set, - - GlyphArray: glyph_array, - ClusterGlyphArray: glyph_array, - - DottedCircleInsertIndex: u32, - - GlyphCountStartingFromCurrentCluster: u32, - - At: u32, - ResumePoint: u32, - OpGlyphOffset: u32, - ClusterGlyphCount: u32, - Ip: u32, - NextGlyphUid: u32, - - RequiredGlyphCapacity: u32, - - RealCluster: c.int, - ClusterAtStartOfWord: c.int, - WordBreak: c.int, - - // This must always be the last member! - OpState: op_state, -} - -cursor :: struct { - Direction: direction, - LastAdvanceX: i32, - X: i32, - Y: i32, -} - -break_type :: struct { - // The break code mostly works in relative positions, but we convert to absolute positions for the user. - // That way, breaks can be trivially stored and compared and such and it just works. - Position: u32, - Flags: break_flags, - Direction: direction, // Only valid if (Flags & BREAK_FLAG_DIRECTION). - Script: script, // Only valid if (Flags & BREAK_FLAG_SCRIPT). -} - -bracket :: struct { Codepoint: rune, - using DirectionBitField: bit_field u8 { - Direction: direction | 8, - }, - using ScriptBitField: bit_field u8 { - Script: script | 8, - }, + UserId: c.int, + + BreakFlags: break_flags, + Script: script, // Only set when (BreakFlags & KBTS_BREAK_FLAG_SCRIPT) != 0. + Direction: direction, // Only set when (BreakFlags & KBTS_BREAK_FLAG_DIRECTION) != 0. + ParagraphDirection: direction, // Only set when (BreakFlags & KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION) != 0. } -break_state_flags :: distinct bit_set[break_state_flag; u32] -break_state_flag :: enum u32 { - STARTED = 0, - END = 1, - RAN_OUT_OF_REORDER_BUFFER_SPACE = 2, +shape_codepoint_iterator :: struct { + Codepoint: ^shape_codepoint, + Context: ^shape_context, - // Bidirectional flags - SAW_R_AFTER_L = 3, - SAW_AL_AFTER_LR = 4, - LAST_WAS_BRACKET = 5, + EndBlockIndex: u32, + OnePastLastCodepointIndex: u32, + BlockIndex: u32, + CodepointIndex: u32, + CurrentBlockCodepointCount: u32, + FlatCodepointIndex: u32, } -// In the worst case, a single call to BreakAddCodepoint would generate 4 breaks. -// We buffer breaks to reorder them before returning them to the user. -// This potentially requires infinite memory, which we don't have, so you may want to tweak this constant, -// although, really, if the defaults don't work, then you have likely found very strange/adversarial text. -BREAK_REORDER_BUFFER_FLUSH_THRESHOLD :: 4 -BREAK_REORDER_BUFFER_SIZE :: BREAK_REORDER_BUFFER_FLUSH_THRESHOLD * 2 -break_state :: struct { - Breaks: [BREAK_REORDER_BUFFER_SIZE]break_type `fmt:"v,Breaks"`, - BreakCount: u32, - MainDirection: direction, +glyph_iterator :: struct { + GlyphStorage: ^glyph_storage, + CurrentGlyph: ^glyph, - LastFlushedBreakPosition: u32, - CurrentPosition: u32, - - LastScripts: [2]u8, - - Brackets: [64]bracket `fmt:"v,BracketCount"`, - BracketCount: u32, - Flags: break_state_flags, - - FlagState: bit_field u32 { - _0: u32 | 8, // break_flags - _1: u32 | 8, // break_flags - _2: u32 | 8, // break_flags - _3: u32 | 8, // break_flags - }, - PositionOffset2: i16, - PositionOffset3: i16, - - WordBreakHistory: bit_field u32 { - _0: u32 | 8, - _1: u32 | 8, - _2: u32 | 8, - _3: u32 | 8, - }, - WordBreaks, - WordUnbreaks: bit_field u16 { - _0: u16 | 4, - _1: u16 | 4, - _2: u16 | 4, - _3: u16 | 4, - }, - WordBreak2PositionOffset: i16, - - LineBreaks: bit_field u64 { - _0: u64 | 16, - _1: u64 | 16, - _2: u64 | 16, - _3: u64 | 16, - }, - // Instead of staying synchronized with LineBreaks/LineUnbreaks, - // this advances every character always. - // (This is only needed because ZWJ can create an unbreak while simultaneously being ignored.) - LineUnbreaksAsync, - LineUnbreaks: bit_field u64 { - _0: u64 | 16, - _1: u64 | 16, - _2: u64 | 16, - _3: u64 | 16, - }, - LineBreakHistory: bit_field u32 { - _0: u32 | 8, // break_flags - _1: u32 | 8, // break_flags - _2: u32 | 8, // break_flags - _3: u32 | 8, // break_flags - }, - LineBreak2PositionOffset: i16, - LineBreak3PositionOffset: i16, - - using LastDirectionBitField: bit_field u8 { - LastDirection: direction | 8, - }, - BidirectionalClass2: unicode_bidirectional_class, - BidirectionalClass1: unicode_bidirectional_class, - - JapaneseLineBreakStyle: japanese_line_break_style, - GraphemeBreakState: u8, - LastLineBreakClass: line_break_class, - LastWordBreakClass: word_break_class, - LastWordBreakClassIncludingIgnored: word_break_class, + LastAdvanceX: c.int, + X: c.int, + Y: c.int, } + +arena_block_header :: struct { + Prev: ^arena_block_header, + Next: ^arena_block_header, +} + +arena :: struct { + Allocator: allocator_function, + AllocatorData: rawptr, + + BlockSentinel: arena_block_header, + FreeBlockSentinel: arena_block_header, + + Error: c.int, +} + +glyph_storage :: struct { + Arena: arena, + + GlyphSentinel: glyph, + FreeGlyphSentinel: glyph, + + Error: c.int, +} + +glyph_parent :: struct { + Decomposition: u64, + Codepoint: rune, +} + +font_coverage_test :: struct { + Font: ^font, + BaseCodepoint: rune, + + CurrentBaseError: c.int, + Error: c.int, + + BaseParents: [MAXIMUM_RECOMPOSITION_PARENTS]glyph_parent `fmt:"v,BaseParentCount"`, + BaseParentCount: u32, +} + +run :: struct { + Font: ^font, + Script: script, + ParagraphDirection: direction, + Direction: direction, + Flags: break_flags, + + Glyphs: glyph_iterator, +} \ No newline at end of file diff --git a/vendor/kb_text_shape/lib/kb_text_shape.lib b/vendor/kb_text_shape/lib/kb_text_shape.lib index 1c3b94779ba2baaa1216b84525fbdae75b28103c..000ae09b2f50c6e9b3745a77f0026c67263de59f 100644 GIT binary patch literal 852874 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

uS;o`g(W`R`bnvxDx-xtM34)3}enDS> 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≦p8t<| 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

&z2koOT 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 literal 714902 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

iO@92pdanH>~ZK|Oy3;pvP|8BG~Q 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

0JVC+g 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 ARsaA1 delta 97500 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 C`l%KG diff --git a/vendor/box2d/lib/box2d_wasm_simd.o b/vendor/box2d/lib/box2d_wasm_simd.o index 8b70dcedd9538a1edd9ff603d5c74cd71cfe8b8d..d7150082e676e195ec3e3e88e11b0380a35b14ee 100755 GIT binary patch delta 109829 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 Gwg3P>sz1#D delta 105753 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
%YLaT;-Gc?pzTtKjm4ldE^?+HK7Rrx?g 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 f32 { return Atan2(s, c) } -// Convert an angle in the range [-2*pi, 2*pi] into the range [-pi, pi] +// Convert any angle into the range [-pi, pi] @(require_results) UnwindAngle :: proc "c" (radians: f32) -> f32 { - if radians < -PI { - return radians + 2.0 * PI - } else if radians > PI { - return radians - 2.0 * PI - } - return radians -} - -// Convert any into the range [-pi, pi] (slow) -@(require_results) -UnwindLargeAngle :: proc "c" (radians: f32) -> f32 { - radians := radians - - for radians > PI { - radians -= 2. * PI - } - - for radians < -PI { - radians += 2. * PI - } - - return radians + return math.remainder(radians, 2. * PI) } // Rotate a vector @@ -563,6 +542,17 @@ AABB_Union :: proc "c" (a, b: AABB) -> (c: AABB) { return } +// Do a and b overlap +@(require_results) +AABB_Overlaps :: proc "c" (a, b: AABB) -> bool { + return !( + b.lowerBound.x > a.upperBound.x || + b.lowerBound.y > a.upperBound.y || + a.lowerBound.x > b.upperBound.x || + a.lowerBound.y > b.upperBound.y \ + ) +} + // Compute the bounding box of an array of circles @(require_results) MakeAABB :: proc "c" (points: []Vec2, radius: f32) -> AABB { @@ -625,3 +615,15 @@ IsValidPlane :: proc "c" (plane: Plane) -> bool { IsNormalized(plane.normal) or_return return true } + +// One-dimensional mass-spring-damper simulation. Returns the new velocity given the position and time step. +// You can then compute the new position using: +// position += timeStep * newVelocity +// This drives towards a zero position. By using implicit integration we get a stable solution +// that doesn't require transcendental functions. +@(require_results) +b2SpringDamper :: proc "c" (hertz, dampingRatio, position, velocity, timeStep: f32) -> f32 { + omega := 2. * PI * hertz + omegaH := omega * timeStep + return (velocity - omega * omegaH * position) / (1. + 2. * dampingRatio * omegaH + omegaH * omegaH) +} diff --git a/vendor/box2d/types.odin b/vendor/box2d/types.odin index 1ad7f379c..9e12aa1a1 100644 --- a/vendor/box2d/types.odin +++ b/vendor/box2d/types.odin @@ -50,6 +50,7 @@ FrictionCallback :: #type proc "c" (frictionA: f32, userMaterialIdA: i32, fricti RestitutionCallback :: #type proc "c" (restitutionA: f32, userMaterialIdA: i32, restitutionB: f32, userMaterialIdB: i32) -> f32 // Result from b2World_RayCastClosest +// If there is initial overlap the fraction and normal will be zero while the point is an arbitrary point in the overlap region. // @ingroup world RayResult :: struct { shapeId: ShapeId, @@ -87,12 +88,6 @@ WorldDef :: struct { // decreasing the damping ratio. maxContactPushSpeed: f32, - // Joint stiffness. Cycles per second. - jointHertz: f32, - - // Joint bounciness. Non-dimensional. - jointDampingRatio: f32, - // Maximum linear speed. Usually meters per second. maximumLinearSpeed: f32, @@ -660,6 +655,10 @@ PrismaticJointDef :: struct { // The constrained angle between the bodies: bodyB_angle - bodyA_angle referenceAngle: f32, + // The target translation for the joint in meters. The spring-damper will drive + // to this translation. + targetTranslation: f32, + // Enable a linear spring along the prismatic joint axis enableSpring: bool, @@ -743,10 +742,10 @@ RevoluteJointDef :: struct { // A flag to enable joint limits enableLimit: bool, - // The lower angle for the joint limit in radians. Minimum of -0.95*pi radians. + // The lower angle for the joint limit in radians. Minimum of -0.99*pi radians. lowerAngle: f32, - // The upper angle for the joint limit in radians. Maximum of 0.95*pi radians. + // The upper angle for the joint limit in radians. Maximum of 0.99*pi radians. upperAngle: f32, // A flag to enable the joint motor @@ -988,6 +987,7 @@ ContactEndTouchEvent :: struct { } // A hit touch event is generated when two shapes collide with a speed faster than the hit speed threshold. +// This may be reported for speculative contacts that have a confirmed impulse. ContactHitEvent :: struct { // Id of the first shape shapeIdA: ShapeId, @@ -995,7 +995,9 @@ ContactHitEvent :: struct { // Id of the second shape shapeIdB: ShapeId, - // Point where the shapes hit + // Point where the shapes hit at the beginning of the time step. + // This is a mid-point between the two surfaces. It could be at speculative + // point where the two shapes were not touching at the beginning of the time step. point: Vec2, // Normal vector pointing from shape A to shape B @@ -1103,17 +1105,18 @@ PreSolveFcn :: #type proc "c" (shapeIdA, shapeIdB: ShapeId, manifold: ^Manifold, // @ingroup world OverlapResultFcn :: #type proc "c" (shapeId: ShapeId, ctx: rawptr) -> bool -// Prototype callback for ray casts. +// Prototype callback for ray and shape casts. // Called for each shape found in the query. You control how the ray cast // proceeds by returning a f32: // return -1: ignore this shape and continue // return 0: terminate the ray cast // return fraction: clip the ray to this point // return 1: don't clip the ray and continue +// A cast with initial overlap will return a zero fraction and a zero normal. // @param shapeId the shape hit by the ray // @param point the point of initial intersection -// @param normal the normal vector at the point of intersection -// @param fraction the fraction along the ray at the point of intersection +// @param normal the normal vector at the point of intersection, zero for a shape cast with initial overlap +// @param fraction the fraction along the ray at the point of intersection, zero for a shape cast with initial overlap // @param context the user context // @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue // @see b2World_CastRay diff --git a/vendor/box2d/wasm.Makefile b/vendor/box2d/wasm.Makefile index 74f4e4eff..80dd2ba14 100644 --- a/vendor/box2d/wasm.Makefile +++ b/vendor/box2d/wasm.Makefile @@ -7,7 +7,7 @@ # CC = $(shell brew --prefix llvm)/bin/clang # LD = $(shell brew --prefix llvm)/bin/wasm-ld -VERSION = 3.1.0 +VERSION = 3.1.1 SRCS = $(wildcard box2d-$(VERSION)/src/*.c) OBJS_SIMD = $(SRCS:.c=_simd.o) OBJS = $(SRCS:.c=.o) diff --git a/vendor/libc/include/math.h b/vendor/libc/include/math.h index fba520e4a..dd9e8e9ba 100644 --- a/vendor/libc/include/math.h +++ b/vendor/libc/include/math.h @@ -43,6 +43,8 @@ double tan(double); double atan2(double, double); double modf(double, double*); +float remainderf(float x, float y); + bool __isnanf(float); bool __isnand(double); #define isnan(x) \ diff --git a/vendor/libc/math.odin b/vendor/libc/math.odin index 93df1fea6..26d8a917a 100644 --- a/vendor/libc/math.odin +++ b/vendor/libc/math.odin @@ -204,3 +204,8 @@ modf :: proc "c" (num: f64, iptr: ^f64) -> f64 { iptr^ = integral return fractional } + +@(require, linkage="strong", link_name="remainderf") +remainderf :: proc "c" (x, y: f32) -> f32 { + return math.remainder(x, y) +} From 3fc42f04661abf9258eaad38c109c08aa3a15921 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 9 Dec 2025 16:15:07 +0100 Subject: [PATCH 029/766] vendor/box2d: update MacOS binaries to 3.1.1 --- vendor/box2d/lib/box2d_darwin_amd64_avx2.a | Bin 383512 -> 387984 bytes vendor/box2d/lib/box2d_darwin_amd64_sse2.a | Bin 383512 -> 387984 bytes vendor/box2d/lib/box2d_darwin_arm64.a | Bin 319496 -> 324272 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/vendor/box2d/lib/box2d_darwin_amd64_avx2.a b/vendor/box2d/lib/box2d_darwin_amd64_avx2.a index f98e919a4bde9297b478e7f5fc684260cfbe655f..43a2313039e3ac630395c9f67f6c43f728e8bdda 100644 GIT binary patch delta 137675 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�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 O;{!#v-+RKki46eT%3n?Z diff --git a/vendor/box2d/lib/box2d_darwin_amd64_sse2.a b/vendor/box2d/lib/box2d_darwin_amd64_sse2.a index 3df91e8520a8765aac64f21931e5389f061f6958..c9afbb6731be46bff6a7567fab0384554f535b2c 100644 GIT binary patch delta 137643 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

$ZeX_fBt7QWn$x}&AAzK;~x>yQKc0Kdk0{uofO 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 Q!#R1jKmYcU%dAV-0OHj){r~^~ delta 133296 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

``~Sc5gGcibiD<_d$JpuT4>5^PW@{Fm%-zb# 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 z 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 Date: Tue, 9 Dec 2025 15:37:00 +0100 Subject: [PATCH 030/766] vendor/box2d: update Windows binaries to 3.1.1 --- vendor/box2d/lib/box2d_windows_amd64_avx2.lib | Bin 819724 -> 1000940 bytes vendor/box2d/lib/box2d_windows_amd64_sse2.lib | Bin 828566 -> 1000416 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/vendor/box2d/lib/box2d_windows_amd64_avx2.lib b/vendor/box2d/lib/box2d_windows_amd64_avx2.lib index 7b8626b8035dc871b18de397c9f736ee9c5ecc99..e8a92b0653401160bea1324aa735aeb9ede2a94e 100644 GIT binary patch delta 418626 zcmeBaF?!Q&J3)%w%+$!zz|3-@qC~xsfrYsO2qbVZFfdCnFswD9C$6WbWmxR0r>k!< z9Z*l-;Kp!3J+A`J#lQx_-!vH5$iVEHR~Sgd^#~2=F%0a~#C@k2*a_l#Ohp{-Rt$8* z_4Kq1i(U1cwr?1yf;$)(II-cWyBIiO_~I=FPE=fvE(K>p^5gm#cu2+9Co%Bg$MqNrc-^ls;KZdH7W$WJ~ktUi6G1CPganVHNSlV@i-aFwMM6lLa>q{Zh9ILWC60CSBn6?(`!)F(!HgqXnT*r3Hn9q9*40_g$Q6=U zl%87Rn3tY2Ju#3~bn>rxywfcLSam1!>0OvU!=IIpKRC4np(vGM`oSPp(aHUDxHtdN z+s(+FSd>2f|4LS+>8m%g@=WJl#VP_aVsfWG|MZ%5to+lrtzZ?LZo86IVfyXmtSZwv zR8-6U=dTCB# zQE+NOViDM^=^o|mdXo*>gQuTqX6IHc&CAS7XGk*g%FoOziFZ#e@yX0fMOHugqLujM z3s$PUKKaRsIgS;X#f}U~M$`XwGD%E+WfddkoS#=*Qk0mPR}zA1R`BG;c5%kw>2u53 zr9@CPL+lEk94Ie5{c;n#&}M(@3+ym2z#?|?#~Sg?7i!v>Ht%s=%`*APEP>6vUg2EG z9bp4A6Ie%BnSp`9WGw^3wiG6YFZ-AnetczOaNuHQXcA*)urOw3c+tkp@GgOcp=&2A z!v;1shL{32hFK5T7&N}IFXE@cz&S2%v!SKeGlYyawlVR6XPKH|-IT@s8 zaxvuDaWh<6%gyk~g@>Upj)!5=bsh%UEAG4u8%lW@+P3pDuzclXXyM^!FcITtXfWbu zkeEC_w9;CFL6Cuwfsug=ObRjxFfcNRf!P8Kd<+~6j0^${VhkKm7KA6mAi%)Fz&+VN zOjQ{qBFZ2H)(2vP%;I2>2I~QtB+bCMd3xAZrpXSGT$6nwIhchQgeLn&PMmxpl4bI} zNV7>%ER#i|swVeD$uM&=$WLA!RXfX~XDyeZbt<%-{Ip%48YywIzqROQqmDLK>f~g8 zw46LS&B0@{c7G2M1r0AsK{LJJ1e^Huqc0f^Ci`fMO}Bf+D7smH(hC+)88&&prqAT4 z>6gIlBU&nx-DgN{E}LMK4(|KPig=x1x;H z)SUP%P+3AyX=+XiL}fi8r6rXGsl@~pW#*<95mc0zl#`0Cs2<&`#rZj9sYUU{sU_%2 zv8yDgDkHG~!&Zb*^^gEAPR%RMC+LHs)Uy1X(vnn2&=In^peVCAH?br$8K3fcL?q|t zmk|!c-2BpFBJI!3FUc>$XE(@dsQ+^lOETiqO7oIIH6Fp}&P~kAOv@*nB8fSo0%M6Qk04(2|-d& zN@j6MVqP+laRXDWS5F{QC+8Otv^qIIuOu<)?rHKPig=xBW?(B}5bgiA6<;FtczvEwLyyFEKtb zCnrBSu>>`nTVN}06BCn?px)ItfE3O!($E|_88Cfg6sx$Dp`nq9sR>9jfh(o$3*#{( zi%b(vMusf5=?ku~NimuDO)pr(q!hJS7P zIM*8n1_sM81_sse=?X$@a$L@g3=Edx3=B09(-oevLin>H7#QwGLikaP3=F>`85lyN zr*F8*Cdc)Zk%3`$Gy_9J?DPaoKn+XF0!>Ks1S~f=p28MqSHWw!Y1A~1$1A|BW^nz!sN=!lV(?6VM zQ3eUu#WOHuCV-8bF0hb^g{e3JqMw_AfuRb@2HD#RVRKnAFfjBcFfbfXm@bgWqr`SG zfq~&y!gPh3Y)Wh_i3|*miD1LnK>EEC5oU!!*jyR1^V7|uiF*ti%N z7_LCrV0HHr85o?BAm#}$FfjNefz9Lk&(6RQlf=Lfoi+V}Ae$W5R%Ql1%kscs z$_6s?NFG=%*c~UKY>+>$K-gTC3=9l+@)#II^QSN9WLIL7&u3t8%?I1XHI0FR!9SmY z;VG04Qu{uifkC4HEYAiq$EW~oKG+wYZRhVQnEKT(=i8Fgz%PgzKw91_t$_=>pc=N^FKj3=G9Z zVDs4c7#J98i@^HX_AxLpbVJyJlQ>~5c~V8kZJmCw$=@V1?SA*O%&24)U9HWda2hB*_!wn0+X0c6hc3DXm{ zbEq+$Ll(RQ;c$T*cXI**!@CJ!w{S@_Ffja>z`!6p5yDqwU|^7)$iQF+;X{n~m1yB4IF0f~W%}HdZK`pMimaAHwEJ28GNd28PB-5X(Sat?o$- z4C^3#HaP|ch8<9~ZVU_z*CsJA$V>*SWn0V0z@Ro6Y(7^30|Ue5DGUtGQz4mChk=11 zd@5KDoIsnQY*1qAfU-eqCP3Ms2-pK^vW*xR7*0ajpn&-eVRJ2DU|c=Zj0_Bd)4}$0f&3&mgMqaDr`{ z!N9P81|)HxoWa2G9-;><_j3jVgV9Wg86Y>>%mkYOmUEfOz)(9AqOW}>1H)Q~I+21vUpa$Gfx3=9tz zFfha{g2-QIWMEjdh=HMU2}C}ak%3|B5(Wm2WsrP#g^Pi~Y8e9q-$ro06HI1hVDQ_- zz_4*UB=bjrGe4Is0|SHNZUzRs-C!qjtz=+e@Yv13@NqXdc}_pDfQf~Tbq@oB+#ZMm zkOqxC3=FPN{!UQ7+QY!Wu@{oQ!11(~fx&GrM7=!&14F=G28Mnp9~2xj_cAb;?t{qB zW@KQn-^ajkYd_c@(?7(rvapFAU|=vf08s!+%vJ{&7($Ww@dp?fs-S#O9o=$(f#EWg z4^n^k00YAhC?8ajGaY1LXgUZs4`M;jK?a6p$O0PCIbV5=1~TQprhar zBarv@EkV8}TJww%j?fq|jy z7z4vPhypH9COLGBf#C^M9%R&rer4#H7U5ex8A0@_Dc=Y#YxrFdT%6-#^d5@cKO1CPvQ5fj8CJL@zKfC|-bw z*n>s9FEB8KUjVzBu@o#)dx3$W6RKu8SY-1B28R7mk-L)vZ+bIwOrCpFn@##61B3cS zh-t2q7v5B73%tm{5DOKl28*;`WMG(l5n}#Eu*lAf3=Bu1Y950{-d|*3_ze+ZlDq^7 zP1Q>b42GA$`k4HoV&Rt<7?Ll6?PF?$iuGP%V3-LN+YS{we2IbKJXG&nsMyy_3=E8y z!Fn0xCl}rkneKmpNtjLhG6RD-R5%nNoOqdmA@?%acE)am@Z`%34D+F?_acN(US?pp z3Kjm05dMFefr0x9#1PHN3-3X#G`zyVV0#7Pl4yi*`V|I-;wzBIop^usz@UB=VvOtLjgLg8uV29_!g`f~A@(Z7lWmZ!j=e-hlWs{00L<@{Q>Y4s1$njW-w= zX5N@yu$ohu^#%jOVW{xK8w?CTp~}T?GB7CLganu4O$LV0n-F7)Z!$2{-vn8VUP z1H)RV`01Mr4A-IJUvDxnu-<~GSH8u-pnnUZ-uD&*L+q{T0&6&xS#L2gwBLdlzw{OZ z!_Hd}9~{2Lz;ON+#FcMvF)*;+h8lC5fkFTF^aU5$mDqf5Gcc6ip5CyEQm)2E&IC!>u1OFt|SinF4Wt>O%&G#)l9+^B*!WtOm;|v7LO#z;F{P z{{0~X1M?$@S&EMs7)&2Q%(8#Pz~KD|Vt3{v28PZ@5ObD4Vqn<(2xNy6+r>u=3=g5= z{~s|ha6g8q*L=*t;Q1J$KK(HRL-AvX`4b;AFf4rxF@ODI28P{_LFPc*dh;;@!&j&t z;U^3X@=ri=N^G`I7#Mt?K+MX1!oX1e1Y*|ICkzZLpFqso{DgsFKUh7)th-Mb7=A+a zh(BduP<{&0!&U85oRTg5As% z_!44n>PrTO!j}+p`=Mg9UotQ(hpIaY6}$P8f#K;(u$fHEuONDbUokMqzk;~k7AofY zih&{U6~w%Js95zY28Q-mAiZ*2E({C|OJ6ZCynF?56Z>lh2I1ErIVCp3*9;7fucs@3 z3d`3F4B22|h?dUR3=C&qL$thp&A{;eHN*NzF}a{eFJfdH&iV64Ff~`8?blT zYTqz0Ond{;zy1va!|pc_D{sDGV0Z}?XMfAUAp91rp2_en#9Y_63=Dw~F}D1-3=GY0 zA!aOm%fPVqEyRq|Zy6YFL&bl-Wnf@^2Tm?b%I_d%SifUnaEFMorM_cesC@@9WA-}+ zhUHN4qwg3P?n1?Xzhhuve-ANR^*sZF>3fL!;P(s+@lf&F_Y4fZQ1R9885p*|2iwVZ z^*sZ_Tc|kq2L=Z54-j)qKQJ)3et?*h{DFZX{{z^cY`q^C7#4njWU~mwsVj*!u2_ zv9W{3KfX=hpv6p6&nfU-drmw$&i6l6gqRGf!_ zfuSAB1{pdT$_9xqfwDpBH$d6E3=9nWplpzu(@5;=P&P=-V<;PB<_9Pn4(k4*a0!rIJX@{TF4`eW@F}eJl&LhF5#uNgjQ+`fA^N~%BspRM6 zRZo@J7VtALO!+xoAd^Xn)i*fIIcWMqaaJYP6$}gvS(6o>DY<~A;8Jvr^$hh4W0G?d zvr~1GN;7j(bc<4RQWJ|)brZ`fVsK7tKxc)gJN9z9OrPq_B07DRH;cgZwY{w3(>L_8 ziogls=?_-1u}wbzOif@1D+7Z^ugw9EgU?w#n0G#y%=+Adkzupl^AJXbC^iNL7KSng z28P>=AeIdy1A{9Qh_!){fgzA-@}?JA0uNXi7(9~WSv(FtX7^y8$FN!F@9R>JX z+8G!aK!PWaJpL(mfzhM&L`k_%vO9}MuaAm?=fMZ;KFm!Fldr$65h#KCdolw9!%xP^ z2j5Hke+1hq;F)~DxBG)f_f3SwdvRIp;MwXZ!QXNP!(#rH1Ctd$h>0+;FfhDe08K&k z`luNAbRYNVzC8KuJ6onNY?F1~OEbDn_INL=8pd(-L-@&~KlBe4Nge$q0LrusM}O#_ zDB?N#OVCZ>HS5t|0?v~sz88~fggYEGZ2JQoZW4^303H%vc>h7H9@Ps!k-Pv(z8;-1 zDjXi2B`ONx9*u86LvtS8pqhZe!}y3tr;AE~XSac8_YY81c?ftUAM)sxIpA^dF{=mj zJZK~ZgHnexQtC+XY;};}Z@B@9B-J`Z^5Abd0*absXG9Y5=)UH|+{Q3@&PVNffulbJ zLsSBe{uXc$0H?DAk8T&01doF+6j~0Hq#b>6>`>^@Uy&z{zKT3_^i#wIc+~w806Y2U zr0I6%_KXJ8y}UUTCZBl8tLebVz`zKy9^`FMU>*G} z*rEbT?MHvs_oyf^GB6zdS-(ZaVDhBTI*bXE_kUIfWveHjHK$j&aq!gp^v+QMc?L&_ zfhOy2fy3!KyzCQ)mv|sALrS~|Mh1rEte|j8U}Rv>0f$`%BLjmGm~{pbip_64e7gnU zDbv%Zm*;@z!H2BA%w3?Q36cm*0ENT_P{5QpftZN2SYp)c#OT=_pwQ`}65+_dy$O~s zVjL%5{i4IPf_3`AOB}-W;U3Lz3_QDUdUpTt=>Fu<{SuNoy3d1hj)G73F^}%69^D-O zK}mzbqdP{$!J|7z#lxe!L?ytZ`G`UMVbCm?F}SV(jTW1MSx0{fFdhA&@5oWEcJ!Bk z6AOsVQw}PO7?1wYcj74LKl)3+k>%)*dVMFJa^?+;hm8CBSuqu}0=r4gFmLmtV zVjWnH{u1Oo`b)rzZtK|~;jNB6;G25u>7T^ixELg^J422O@_+VRzs#$jcm{08#Mi z?$lrbCDI?qoml?=|Nq~yyAc#Hp1m_4FfcH5I&n;(SupI)0yMw z4*_;i7#U38dy>gH!M)(<4?(Abqdx@tL22&j55X=7EzmxJfq~)Z55Xn~Ezl1tenIje z+N1f1Li}Mb1_p*caC+)?I{1LygPHO0aYxWB7sK?ADvZ+8{qD1R~RLM9!P>5Y&@~p3_=~ZCOAYIu9Qb4*u%!3bD!OZT9J3vnHIQU8-&H7MT0RQ$w zKE2?I!YA_p13LplnzQ8;4p5pYHEI6ISflT3*~7uX!oX0Y+Uxk=Bl&{I!AI=g%u_fR zCJTI%O#-zkSr|O{_Z&Rj?a0&1;&AW*%V7^vEa`Rp-+G`z*V(d#;|FL(gR;jAk6sZ6 zkAsg`K-PSi-0)3W3}OwaDl20>`a|R3;iIo&4;-Gn@SAA8h2uU(P~qGC(x>~hYxgk^ zh;JObuX%JgUtnWk0G0L%|0f?{V_^8-{DF;u!PWS`M`!a5kW}jdkM3qrggbVh=bw7e zr?W=IgR%P!8>mFc>vmvbU^w!)P^r6uiGhI;%-X=jz`z7%f!Z6)M}NBIH7hWKlvOG< zM=*nxRVp=4U-d(`Lz+ky~2O9%JohrY)3#dJI%(45rNA?K| z59V%AH33Sc4F8W=gB8_0fO#Gg8ou3U!NK6T1Jpxx?7o5=9v-a+N(4N*CxZj4`^5jr zCqO~dechuw{WREA;{%?Ztstj(bngaP<23xUW-k2OXMbUvZ2MD+LmSjgP3~SWIsT`H z^c@xkhBSyr`S%=PKID;n!Xx{qiwE=Wiph(9Dl#KPbZ>5MFlqSF(Y z871p0!J0tLI010+46dnub_eoU26B{IfQoH{=3h*;?7Knz>(^Y}w=Vu>zGZ!@PQs&` z)1~_`G#NnC0DEUV54e!_NcQLO=w?6qM}Y0<9|1oFkAn}{kNy#4VLbXrz|G<4A3+~R z1&~C7^3gwnE{qV7g#YdwM}L%q>OTueK@D2mQN=jjkcCls`aEVvIbKL`BYDXV>Ki>% zm`7q%1j0O;-zb1RaueZ^8Wo5~_Cr1L>*9arU(Z9z+^}UXaoz5H{nFqnCpP3ot=jg+r1qzVL2~??M9)L(P9(L)DY0VI|HV!>(}eA9e^0a}0G1^XOfpBJuP8e~-pD<}cV87>vJp^s@eD zV_@*6HvsQnB!$fI{YsB8uq0SbChLxmYC z(J#OPYPbl1#M;4ZkSWFoJUU%B9Q`fWuQ2^S8)Fiqz;q{eMpH(C=@smZ%lJ2d^nlcX zR2*QLF2Knxq6I4U!G`Vvwbnp(fnpqN?g?b|Hz4X6KTL1nV3gudK$a_j%2hz*ERf|q zpmG7z8`v17G&_*xX2819n07CiZqLam%E&N1l#@}5(O`N5C!;E(1B6PLeuk4#gRua@ z3xH4!(;c}OH5eyM&*EZ~l3D<&N;f*{;F{ zYM;6)c(fky;CDIb0jc3VI@>iM5*jdx&UOQkCjM=%1|9Y7-$32N~=M2Jy2)tX<2GfqU&i{>QJI?eVE_p zM(2D`JH)fw)xx8*9n`Gy>~?kV=xhfy8$7#RJzi^hKoan7P{RzOMuq_@236)zz1XxKo*ohv!{R*rM4BeNH{(z)g5DzThIbVa7fx&V+NCSW0GEjlV z+5OL>`yME7Pw(Sll&S~Wx(l>s4XT+%(xcb+09ZHFO~|q?k^&yRz86rWp#>2rWxGf! zfD*a^OdjMAkKSmD|HpiLLBj(A3`Y)D2)gipu!cCPCuh1kFQW?Mj_E$Uj8cpzz*PMW zR%j96(+w#*(j5OE^XZ0^Cm!99at7pF{_X9c;^N=~0Z0Dr=Rkq_0u)HykP?XdAgG{X zXJCMqP@r{8kOsB}0|Ntu1sVo;2(EnR!^P^iftLS*nc&A=>SCI$wG z7^rKxh>@Y5frX(ME;yZufngC?;Uy-RCBK*$80LY+1ejrB7R(F`jbJf9xL6r814A=d ztOqW(g_(h2B3SGcTq^VJsK^}sCE%kX0qsji zg8R~uAu1|IAH^IxJpBtlqX|<8({wEXMzsV5b_NFi?FT)2!NXP_nI}N?m`CGb22lOV zeAA=18#FEr$q>EWCtyk2qqiFr3@~v}x&^acji31RZU$va$L=>SmWy{x-ypzfQxDEa z-RHnc{vWko4a(3pn;o;mcq}}-`M|;+z1<*HzMX2mooO6kq3&i-@OyN38?Z7k^oleb zd<3cHd^#6{M0`3ITY$=q$v)s*)9t{@z;N&p3s|d9=VB1or*knV-s-z2=RnjXpsE3J zeL5FsfQ_kvC@DZy0^<5~F0KG8fpko|LA{iNkJw>0fw(@Mi$UF#?#Vq6QyP#>sqb72 z;`?+i?f@Gz2cl*IvYO7tAg)j6;u#<%&08Q!K=o0t$bo~8m|&KHM0`3IZve?BZwB?n zJzBrjsd{$*0TqfK-Q6EReIMrY&6fX5Sizb+n(L1ncr?FbEPd47%)!dQ(0ZWG#IyTP z_XmD?29NG;29QzApc#75NFapUd{DpxCe(af1FZXsM=w|sVrXwSQhTHu-dgbJ1v>zy z29)DoFc^Y*SH0Zaa z$oQxz7+*qa#d&m}_UH{!Q9u#`jXZ+#QJPEVVo=-8vpZWO?f-Gl?qY+q&fON%8ATW+ z>mda;Xsy8taHbDnU|@i-Kr1OBtPHpqs8tLR0~PEL);hTCK{yLE$_?qXyap{R2Aj;x z$iM&*1C{F#mS;U&FbB>8m6;G}(BfhU>ndFKH=Jd_#K73u)fmvsm7#JpiS>Ko# z82*DcvtVT@mZDVU=%>gK6@{aZA`TtiengaU6|SLHxYw_ago zU?>*z>~1|VeYXswGUJKq_hlG+7%Qgd$TF%h-k3g7meGtcV*3eMMr$U<8{1hF7`Yjt z6N9P@3=C;tx9c)6FvNmc;S8{`j4U_{G=T^i-vCXNx`D&$00RTVMsP@inih~@a&txo z1{bg?pll0j6@837r`2Ms@O1nWoxwOg4O80uLVCb2Rw zfJ$2yh9yuz76wH&1_p>iV>X!4OW9yfh+$`72n1W#eaNT#;K3Jc){Z4)2P>pjK6n^35)4rUG6dZWz-imZlu{e4w(nrPS=&OhuU{Q;suVM}! zeIRn-=nqX3m7_m2OjJOF@)task4PK_H8cdkqxd4=mWRO6Uy(PC!l%U|FCKjq@#yHU zm@`K|gn*pR0GD(Ap?{En`hmle44_F((5wq60YYZ1OyRRw*^WFGpaAS;IRFYu&=5th z$N`UTMvq>W3x}ugQeu>=2en%egW|@J@oF8=cy$D5yjlr7UVXs3yM+UkbDC=|==?9? z^*H#_AkEt6f(!qY1E47mad;~l*-Jmd!Lut+ue}ht2=@75&>{@Tq_#(=PrV9e0DJ;_ z{1777N6_pG*o>pEA`Tt>B>?dbI3hnqf`Xah=&8ulM}I{;Jo+i}&CyE{hmO9AyK(eX z+!1g@AAJ;g_UJD`Pta@+Y<-H~|6=zca5BQCF&3;b7ENO;SfdYEWAhscpH3GQ3m0(VY;p8cq>GA; zM<JG~&P^0ZRN5M}I}efF_~=KpNCq{hn?Y?Z5Afi3 z2or}#ca4fb^kK*Uo)*#I0EQ$}fulddVL35GMdT>$>!&w{~6SV1G2hAfO&hCeZsFhK@wg~PxNv(9Sp zK&k;~d@~*#o{(OYM>nHO_o41fj?EA3Jr2HN^XTQd;L*);!H0kK0gp~bc&Wh(9?tG% zIp6`EVw)bP#we$cT56a>N(}>0sqq3-YN$a<4UdD5SiPC2a6Fj4T8&Z823qoVJ8^il zGM4aobUSi*v@(@Ir%AINc_P4;WgmzDjh%yrzag`h-HtpS(KbTdN+wton?Lx!;xj{X+#2Mwfx#sjNC}`huzKilC8i9(6_?P`rGc%5Db=^p8{7CF_+zL-X0kkw$ZvJF9t6 zV*%`#&PonQoPg$;Aw$%l8s_LPflMAyCQ~?iDbfX+ZWJJu$1j0Gj-#g{K@+{7Von@A z1(yF5p$I8#UPYWZ`bj<_kmcwN*HhyqXlV^7zwMmfqt0k14vIaG#^az`5tRK6 zJeYqr?ElWT{iZr&9HSj%r3A=X&4A&}`NG2ZHvjgE9+{^=R)Xwu@ab+*;Q-A~F~0voK5tFDaOwtj%c6#PDM|OEOpnxMl!u!B671q;UB*UC z7bBLEXfQG`_<+p>EsTH!5U5EW$TZzTpV3$p6hKG~73P}_yT7w-Z_sBHX4Ha&1E`LG zgu`zJ1_nQ{S;CC4HlrKF_j?T(HDtlQMs4bx0Htk(hMnKprZX8b<}w;gFEC_OVbqvD z)sWGNkzx7`Lq-k82iqBq7{wVGBc@9lGfFcCOgA-VG+{KDo@LA^#i%j8)tIq>kzx8b zV@5m12h&YW7$-AwOh0MDD9y+){izA#bVh^ewWf^fj2hdQnli?LjA1cnOlJ(4o@35v zF7oBb!3zDuWgLz>E?>UP@LHaKn={w+?dFV1(sz8i{WFgKDE}XB(NLerP~v>_mq7NN zqrU`_A58yZ&gjerW!qXXRx@%;-)X_9YJA6W2gB0;4FAI&8tPLRO6m|=j&6!{{sS`6 zaR?l5q#)is`CWjEam4rn_4) z8Zk0Vud-s4W_+-HniV56tWggtARqw`Ism{O9Pq#33kN%x7#JWem_ir!TJWmYzz#L{sL$K9nwoMWrKAMg4q}tAl-$->L zVjz|aoRtG-O@Xuaz*$#7EOSF1(CAGsxPb}Rny@f1M0h}?V8Y$4G1EQm z7-fB0SQr>w&?H^5Ti38KFj$}ocelPl*x}O4a=`K616G8Ae^{n(vSaKs0F9}GYhIV` zULH_62eH|u`+#Tnx$ag_(Fa3$(@yq-#2(9ixbW zM{+A@=*Re5_dgd9de(if^*~*`NB0Sj?pDy)k4N(Xo1-7!pX8SZ4bn4Ae{0X!z<6YO zo&#e*J!r)i)Mw0FcQAvx$mf{1Hh|V~Z1n(>puuJ4tv8q$7?`($rnZ^4W`NnC;SA=j zpv9ETTMsZYFm&%tVPs%n-g^e5Ywr{=83QI&z~mc{uDzhq3+BBwV73brLmUJ1ULGa} zhVHo~AkA~{fRxT%0w#07qzRb(1JW?}2$<{vlc0tr^IRDadus%Cx>6axc;DL8L~cKn0H zSs3CO7#I$KWiuHV7%afDpi1a4SgaW?Hj#mW;TTwKE?jIi=-dFX7-(ZSMDJ11-e0iT z#d^5H`=C|fU_sE(6GS0sx#143qu+s1H(hGU>;PEg`t{}f#C^QtQ#ⅈ;ohIamxd0RgcD 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

su^B=(30E0;_@A1x;_D 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

T} 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 Y5Mym+%jV8;r2pUAUP+d>55Ca4RkuX4 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 delta 277874 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

SIt31L9-QVMvZ(qd})MOa;3ibhJ3=NB|ZF(6)P! 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 diff --git a/vendor/box2d/lib/box2d_windows_amd64_sse2.lib b/vendor/box2d/lib/box2d_windows_amd64_sse2.lib index f1442615ff946dc08841ab1d254d2107f8b26c20..2a0c94cc0d1b0dab22ae837b8df6da79b3e5919f 100644 GIT binary patch delta 416817 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

uGPCkHyMnqjdF`1(G^C17dREiw!Y2S6I+ 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 delta 283340 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

~ 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 H=AQ)sJ~WTt From effdacd13bb22fd767b614b493759b53fcc17881 Mon Sep 17 00:00:00 2001 From: jimhub Date: Tue, 9 Dec 2025 09:28:32 -0700 Subject: [PATCH 031/766] Fix function signature for memmove to prevent errors when compiling C++ while targeting wasm (#5996) --- vendor/libc/include/string.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/libc/include/string.h b/vendor/libc/include/string.h index 7e5e2b252..6d947858f 100644 --- a/vendor/libc/include/string.h +++ b/vendor/libc/include/string.h @@ -8,7 +8,7 @@ extern "C" { void *memcpy(void *, const void *, size_t); void *memset(void *, int, size_t); -void *memmove(void *, void *, size_t); +void *memmove(void *, const void *, size_t); int memcmp(const void *, const void *, size_t); void *memchr(const void *, int, size_t); From 7c4b8a9afc93bbed70a9b5d816ddcbe4fe736870 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 9 Dec 2025 18:57:49 +0100 Subject: [PATCH 032/766] vendor/wgpu: handle nil better in wgpu.js --- vendor/wgpu/wgpu.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/vendor/wgpu/wgpu.js b/vendor/wgpu/wgpu.js index 6104417df..df3be2e2d 100644 --- a/vendor/wgpu/wgpu.js +++ b/vendor/wgpu/wgpu.js @@ -3265,6 +3265,10 @@ class WebGPUObjectManager { * @returns {number} */ create(object) { + if (object === null) { + return 0; + } + this.objects[this.idx] = { references: 1, object }; this.idx += 1; return this.idx; @@ -3280,6 +3284,10 @@ class WebGPUObjectManager { /** @param {number} idx */ release(idx) { + if (idx === 0) { + return; + } + this.objects[idx-1].references -= 1; if (this.objects[idx-1].references == 0) { delete this.objects[idx-1]; @@ -3288,6 +3296,10 @@ class WebGPUObjectManager { /** @param {number} idx */ reference(idx) { + if (idx === 0) { + return; + } + this.objects[idx-1].references += 1; } From 45b4fb156520c1b85a37b9e51cc262303c362da1 Mon Sep 17 00:00:00 2001 From: WisonYe Date: Wed, 10 Dec 2025 07:19:13 +1300 Subject: [PATCH 033/766] Freebsd: Fixed 'write' syscall to cause 'ESPIPE' on the pipe fd. (#5575) --- core/sys/freebsd/syscalls.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/freebsd/syscalls.odin b/core/sys/freebsd/syscalls.odin index 452914eea..3d62a975e 100644 --- a/core/sys/freebsd/syscalls.odin +++ b/core/sys/freebsd/syscalls.odin @@ -62,7 +62,7 @@ read :: proc "contextless" (fd: Fd, buf: []u8) -> (int, Errno) { // // The write() function appeared in Version 1 AT&T UNIX. write :: proc "contextless" (fd: Fd, buf: []u8) -> (int, Errno) { - result, ok := intrinsics.syscall_bsd(SYS_pwrite, + result, ok := intrinsics.syscall_bsd(SYS_write, cast(uintptr)fd, cast(uintptr)raw_data(buf), cast(uintptr)len(buf)) From 973d368c4c7c3ab3b67a99587901c4cb6523cd26 Mon Sep 17 00:00:00 2001 From: Reshen Date: Tue, 9 Dec 2025 11:43:55 -0800 Subject: [PATCH 034/766] Fixing code example, trace_ctx variable was renamed `trace_ctx` should actually be `global_trace_ctx`, as declared on line 10 --- core/debug/trace/doc.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/debug/trace/doc.odin b/core/debug/trace/doc.odin index e5fd3f7c2..f9bb82fb5 100644 --- a/core/debug/trace/doc.odin +++ b/core/debug/trace/doc.odin @@ -19,7 +19,7 @@ Example: } runtime.print_byte('\n') - ctx := &trace_ctx + ctx := &global_trace_ctx if !trace.in_resolve(ctx) { buf: [64]trace.Frame runtime.print_string("Debug Trace:\n") @@ -48,4 +48,4 @@ Example: } */ -package debug_trace \ No newline at end of file +package debug_trace From a72bdbb43d7ef02bad1cec4368e4f4641c48055d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 10 Dec 2025 12:05:53 +0000 Subject: [PATCH 035/766] Use a single `case` rather than `fallthrough` --- core/terminal/internal.odin | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/core/terminal/internal.odin b/core/terminal/internal.odin index 9404ff833..47ed1818f 100644 --- a/core/terminal/internal.odin +++ b/core/terminal/internal.odin @@ -50,17 +50,8 @@ get_environment_color :: proc() -> Color_Depth { // // Only a small sampling of some common values are checked here. switch term { - case "ansi": fallthrough - case "konsole": fallthrough - case "putty": fallthrough - case "rxvt": fallthrough - case "rxvt-color": fallthrough - case "screen": fallthrough - case "st": fallthrough - case "tmux": fallthrough - case "vte": fallthrough - case "xterm": fallthrough - case "xterm-color": + case "ansi", "konsole", "putty", "rxvt", "rxvt-color", "screen", + "st", "tmux", "vte", "xterm", "xterm-color": return .Three_Bit } } From b18b0fdcb3f5f55ba298aa8245a95cf1626f2f75 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 10 Dec 2025 12:54:17 +0000 Subject: [PATCH 036/766] Remove `fallthrough` to prefer a single `case` --- core/image/jpeg/jpeg.odin | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/core/image/jpeg/jpeg.odin b/core/image/jpeg/jpeg.odin index 241066273..3e0fae4c0 100644 --- a/core/image/jpeg/jpeg.odin +++ b/core/image/jpeg/jpeg.odin @@ -648,27 +648,17 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a color_components[id].v_sampling_factor = cast(int)vertical_sampling color_components[id].h_sampling_factor = cast(int)horizontal_sampling } - case .SOF2: // Progressive DCT - fallthrough - case .SOF3: // Lossless (sequential) - fallthrough - case .SOF5: // Differential sequential DCT - fallthrough - case .SOF6: // Differential progressive DCT - fallthrough - case .SOF7: // Differential lossless (sequential) - fallthrough - case .SOF9: // Extended sequential DCT, Arithmetic coding - fallthrough - case .SOF10: // Progressive DCT, Arithmetic coding - fallthrough - case .SOF11: // Lossless (sequential), Arithmetic coding - fallthrough - case .SOF13: // Differential sequential DCT, Arithmetic coding - fallthrough - case .SOF14: // Differential progressive DCT, Arithmetic coding - fallthrough - case .SOF15: // Differential lossless (sequential), Arithmetic coding + case .SOF2, // Progressive DCT + .SOF3, // Lossless (sequential) + .SOF5, // Differential sequential DCT + .SOF6, // Differential progressive DCT + .SOF7, // Differential lossless (sequential) + .SOF9:, // Extended sequential DCT, Arithmetic coding + .SOF10, // Progressive DCT, Arithmetic coding + .SOF11, // Lossless (sequential), Arithmetic coding + .SOF13, // Differential sequential DCT, Arithmetic coding + .SOF14, // Differential progressive DCT, Arithmetic coding + .SOF15: // Differential lossless (sequential), Arithmetic coding if img.metadata != nil { info := img.metadata.(^image.JPEG_Info) info.frame_type = marker From 8610acb48f2fd0c9d280c9a7973caf8db4143cf9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 10 Dec 2025 12:56:34 +0000 Subject: [PATCH 037/766] Fix typo --- core/image/jpeg/jpeg.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/image/jpeg/jpeg.odin b/core/image/jpeg/jpeg.odin index 3e0fae4c0..7261e5dd5 100644 --- a/core/image/jpeg/jpeg.odin +++ b/core/image/jpeg/jpeg.odin @@ -653,7 +653,7 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a .SOF5, // Differential sequential DCT .SOF6, // Differential progressive DCT .SOF7, // Differential lossless (sequential) - .SOF9:, // Extended sequential DCT, Arithmetic coding + .SOF9, // Extended sequential DCT, Arithmetic coding .SOF10, // Progressive DCT, Arithmetic coding .SOF11, // Lossless (sequential), Arithmetic coding .SOF13, // Differential sequential DCT, Arithmetic coding From 83fb7ba9523bc67b9f3d72ba961abd3a55dffda0 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 10 Dec 2025 17:54:12 +0100 Subject: [PATCH 038/766] Make custom JSON (un)marshalers more like core:fmt's --- core/encoding/json/marshal.odin | 120 +++++++++++++++++++------ core/encoding/json/unmarshal.odin | 141 ++++++++++++++++++++++-------- 2 files changed, 200 insertions(+), 61 deletions(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index 58fbbd852..93d0b523e 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -62,10 +62,79 @@ Marshal_Options :: struct { mjson_skipped_first_braces_end: bool, } -User_Marshaller :: #type proc(w: io.Writer, v: any) -> Marshal_Error -User_Marshaller_Map :: map[typeid]User_Marshaller +User_Marshaler :: #type proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> Marshal_Error -marshal :: proc(v: any, opt: Marshal_Options = {}, user_marshallers: User_Marshaller_Map = nil, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Marshal_Error) { +Register_User_Marshaler_Error :: enum { + None, + No_User_Marshaler, + Marshaler_Previously_Found, +} + +// Example User Marshaler: +// Custom Marshaler for `int` +// Some_Marshaler :: proc(w: io.Writer, v: any, opt: ^json.Marshal_Options) -> json.Marshal_Error { +// io.write_string(w, fmt.tprintf("%b", v)) +// return json.Marshal_Data_Error.None +// } +// +// main :: proc() { +// // Ensure the json._user_marshaler map is initialized +// json.set_user_marshalers(new(map[typeid]json.User_Marshaler)) +// reg_err := json.register_user_marshaler(type_info_of(int).id, Some_Marshaler) +// assert(reg_err == .None) +// +// +// // Use the custom marshaler +// SomeType :: struct { +// value: int, +// } +// +// x := SomeType{42} +// data, marshal_err := json.marshal(x) +// assert(marshal_err == nil) +// defer delete(data) +// +// fmt.println("Custom output:", string(data)) // Custom output: {"value":101010} +// } + +// NOTE(Jeroen): This is a pointer to prevent accidental additions +// it is prefixed with `_` rather than marked with a private attribute so that users can access it if necessary +_user_marshalers: ^map[typeid]User_Marshaler + +// Sets user-defined marshalers for custom json marshaling of specific types +// +// Inputs: +// - m: A pointer to a map of typeids to User_Marshaler procs. +// +// NOTE: Must be called before using register_user_marshaler. +// +set_user_marshalers :: proc(m: ^map[typeid]User_Marshaler) { + assert(_user_marshalers == nil, "set_user_marshalers must not be called more than once.") + _user_marshalers = m +} + +// Registers a user-defined marshaler for a specific typeid +// +// Inputs: +// - id: The typeid of the custom type. +// - formatter: The User_Marshaler function for the custom type. +// +// Returns: A Register_User_Marshaler_Error value indicating the success or failure of the operation. +// +// WARNING: set_user_marshalers must be called before using this procedure. +// +register_user_marshaler :: proc(id: typeid, marshaler: User_Marshaler) -> Register_User_Marshaler_Error { + if _user_marshalers == nil { + return .No_User_Marshaler + } + if prev, found := _user_marshalers[id]; found && prev != nil { + return .Marshaler_Previously_Found + } + _user_marshalers[id] = marshaler + return .None +} + +marshal :: proc(v: any, opt: Marshal_Options = {}, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Marshal_Error) { b := strings.builder_make(allocator, loc) defer if err != nil { strings.builder_destroy(&b) @@ -75,7 +144,7 @@ marshal :: proc(v: any, opt: Marshal_Options = {}, user_marshallers: User_Marsha runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = allocator == context.temp_allocator) opt := opt - marshal_to_builder(&b, v, &opt, user_marshallers) or_return + marshal_to_builder(&b, v, &opt) or_return if len(b.buf) != 0 { data = b.buf[:] @@ -84,21 +153,20 @@ marshal :: proc(v: any, opt: Marshal_Options = {}, user_marshallers: User_Marsha return data, nil } -marshal_to_builder :: proc(b: ^strings.Builder, v: any, opt: ^Marshal_Options, user_marshallers: User_Marshaller_Map = nil) -> Marshal_Error { - return marshal_to_writer(strings.to_writer(b), v, opt, user_marshallers) +marshal_to_builder :: proc(b: ^strings.Builder, v: any, opt: ^Marshal_Options) -> Marshal_Error { + return marshal_to_writer(strings.to_writer(b), v, opt) } -marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_marshallers: User_Marshaller_Map = nil) -> (err: Marshal_Error) { +marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: Marshal_Error) { if v == nil { io.write_string(w, "null") or_return return } - if user_marshallers != nil { - marshaller := user_marshallers[v.id] - if marshaller != nil { - marshaller(w, v) or_return - return + if _user_marshalers != nil { + marshaler := _user_marshalers[v.id] + if marshaler != nil { + return marshaler(w, v, opt) } } @@ -219,7 +287,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_mars for i in 0.. (err: Marshal_Error) { + marshal_struct_fields :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: Marshal_Error) { ti := runtime.type_info_base(type_info_of(v.id)) info := ti.variant.(runtime.Type_Info_Struct) first_iteration := true @@ -430,7 +498,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_mars } else { // Marshal the fields of 'using _: T' fields directly into the parent struct if info.usings[i] && name == "_" { - marshal_struct_fields(w, the_value, opt, user_marshallers) or_return + marshal_struct_fields(w, the_value, opt) or_return continue } else { opt_write_key(w, opt, name) or_return @@ -438,13 +506,13 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_mars } - marshal_to_writer(w, the_value, opt, user_marshallers) or_return + marshal_to_writer(w, the_value, opt) or_return } return } opt_write_start(w, opt, '{') or_return - marshal_struct_fields(w, v, opt, user_marshallers) or_return + marshal_struct_fields(w, v, opt) or_return opt_write_end(w, opt, '}') or_return case runtime.Type_Info_Union: @@ -477,17 +545,17 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_mars tag -= 1 } id := info.variants[tag].id - return marshal_to_writer(w, any{v.data, id}, opt, user_marshallers) + return marshal_to_writer(w, any{v.data, id}, opt) case runtime.Type_Info_Enum: if !opt.use_enum_names || len(info.names) == 0 { - return marshal_to_writer(w, any{v.data, info.base.id}, opt, user_marshallers) + return marshal_to_writer(w, any{v.data, info.base.id}, opt) } else { name, found := reflect.enum_name_from_value_any(v) if found { - return marshal_to_writer(w, name, opt, user_marshallers) + return marshal_to_writer(w, name, opt) } else { - return marshal_to_writer(w, any{v.data, info.base.id}, opt, user_marshallers) + return marshal_to_writer(w, any{v.data, info.base.id}, opt) } } diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 564b84842..25209439f 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -26,10 +26,81 @@ Unmarshal_Error :: union { Unsupported_Type_Error, } -User_Unmarshaller :: #type proc(p: ^Parser, v: any) -> Unmarshal_Error -User_Unmarshaller_Map :: map[typeid]User_Unmarshaller +User_Unmarshaler :: #type proc(p: ^Parser, v: any) -> Unmarshal_Error -unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map, allocator := context.allocator) -> Unmarshal_Error { +Register_User_Unmarshaler_Error :: enum { + None, + No_User_Unmarshaler, + Unmarshaler_Previously_Found, +} + +// Example User Unmarshaler: +// Custom Unmarshaler for `int` +// Some_Unmarshaler :: proc(p: ^json.Parser, v: any) -> json.Unmarshal_Error { +// token := p.curr_token.text +// i, ok := strconv.parse_i64_of_base(token, 2) +// if !ok { +// return .Invalid_Data +// +// } +// (^int)(v.data)^ = int(i) +// return .None +// } +// +// _main :: proc() { +// // Ensure the json._user_unmarshaler map is initialized +// json.set_user_unmarshalers(new(map[typeid]json.User_Unmarshaler)) +// reg_err := json.register_user_unmarshaler(type_info_of(int).id, Some_Unmarshaler) +// assert(reg_err == .None) +// +// data := `{"value":101010}` +// SomeType :: struct { +// value: int, +// } +// y: SomeType +// +// unmarshal_err := json.unmarshal(transmute([]byte)data, &y) +// fmt.println(y, unmarshal_err) +// } + +// NOTE(Jeroen): This is a pointer to prevent accidental additions +// it is prefixed with `_` rather than marked with a private attribute so that users can access it if necessary +_user_unmarshalers: ^map[typeid]User_Unmarshaler + +// Sets user-defined unmarshalers for custom json unmarshaling of specific types +// +// Inputs: +// - m: A pointer to a map of typeids to User_Unmarshaler procs. +// +// NOTE: Must be called before using register_user_unmarshaler. +// +set_user_unmarshalers :: proc(m: ^map[typeid]User_Unmarshaler) { + assert(_user_unmarshalers == nil, "set_user_unmarshalers must not be called more than once.") + _user_unmarshalers = m +} + +// Registers a user-defined unmarshaler for a specific typeid +// +// Inputs: +// - id: The typeid of the custom type. +// - unmarshaler: The User_Unmarshaler function for the custom type. +// +// Returns: A Register_User_Unmarshaler_Error value indicating the success or failure of the operation. +// +// WARNING: set_user_unmarshalers must be called before using this procedure. +// +register_user_unmarshaler :: proc(id: typeid, unmarshaler: User_Unmarshaler) -> Register_User_Unmarshaler_Error { + if _user_unmarshalers == nil { + return .No_User_Unmarshaler + } + if prev, found := _user_unmarshalers[id]; found && prev != nil { + return .Unmarshaler_Previously_Found + } + _user_unmarshalers[id] = unmarshaler + return .None +} + +unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { v := v if v == nil || v.id == nil { return .Invalid_Parameter @@ -40,8 +111,10 @@ unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, user_ return .Non_Pointer_Parameter } PARSE_INTEGERS :: true - - if !is_valid(data, spec, PARSE_INTEGERS) { + + // If we have custom unmarshalers, we skip validation in case the custom data is not quite up to spec. + have_custom := _user_unmarshalers != nil && len(_user_unmarshalers) > 0 + if !have_custom && !is_valid(data, spec, PARSE_INTEGERS) { return .Invalid_Data } p := make_parser(data, spec, PARSE_INTEGERS, allocator) @@ -56,20 +129,20 @@ unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, user_ if p.spec == .MJSON { #partial switch p.curr_token.kind { case .Ident, .String: - return unmarshal_object(&p, data, .EOF, user_unmarshallers) + return unmarshal_object(&p, data, .EOF) } } - return unmarshal_value(&p, data, user_unmarshallers) + return unmarshal_value(&p, data) } -unmarshal :: proc(data: []byte, ptr: ^$T, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map = nil, allocator := context.allocator) -> Unmarshal_Error { - return unmarshal_any(data, ptr, spec, user_unmarshallers, allocator) +unmarshal :: proc(data: []byte, ptr: ^$T, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { + return unmarshal_any(data, ptr, spec, allocator) } -unmarshal_string :: proc(data: string, ptr: ^$T, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map = nil, allocator := context.allocator) -> Unmarshal_Error { - return unmarshal_any(transmute([]byte)data, ptr, spec, user_unmarshallers, allocator) +unmarshal_string :: proc(data: string, ptr: ^$T, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { + return unmarshal_any(transmute([]byte)data, ptr, spec, allocator) } @@ -268,17 +341,15 @@ unmarshal_string_token :: proc(p: ^Parser, val: any, token: Token, ti: ^reflect. return false, nil } - @(private) -unmarshal_value :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { +unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { UNSUPPORTED_TYPE := Unsupported_Type_Error{v.id, p.curr_token} token := p.curr_token - if user_unmarshallers != nil { - unmarshaller := user_unmarshallers[v.id] - if unmarshaller != nil { - unmarshaller(p, v) or_return - return + if _user_unmarshalers != nil { + unmarshaler := _user_unmarshalers[v.id] + if unmarshaler != nil { + return unmarshaler(p, v) } } @@ -298,7 +369,7 @@ unmarshal_value :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle for variant, i in u.variants { variant_any := any{v.data, variant.id} variant_p := p^ - if err = unmarshal_value(&variant_p, variant_any, user_unmarshallers); err == nil { + if err = unmarshal_value(&variant_p, variant_any); err == nil { p^ = variant_p raw_tag := i @@ -374,10 +445,10 @@ unmarshal_value :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle return UNSUPPORTED_TYPE case .Open_Brace: - return unmarshal_object(p, v, .Close_Brace, user_unmarshallers) + return unmarshal_object(p, v, .Close_Brace) case .Open_Bracket: - return unmarshal_array(p, v, user_unmarshallers) + return unmarshal_array(p, v) case: if p.spec != .JSON { @@ -434,7 +505,7 @@ json_name_from_tag_value :: proc(value: string) -> (json_name, extra: string) { @(private) -unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { +unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unmarshal_Error) { UNSUPPORTED_TYPE := Unsupported_Type_Error{v.id, p.curr_token} if end_token == .Close_Brace { @@ -533,7 +604,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind, user_unmarsh field_ptr := rawptr(uintptr(v.data) + offset) field := any{field_ptr, type.id} - unmarshal_value(p, field, user_unmarshallers) or_return + unmarshal_value(p, field) or_return if parse_comma(p) { break struct_loop @@ -575,7 +646,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind, user_unmarsh mem.zero_slice(elem_backing) - if uerr := unmarshal_value(p, map_backing_value, user_unmarshallers); uerr != nil { + if uerr := unmarshal_value(p, map_backing_value); uerr != nil { delete(key, p.allocator) return uerr } @@ -637,7 +708,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind, user_unmarsh index_ptr := rawptr(uintptr(v.data) + uintptr(index*t.elem_size)) index_any := any{index_ptr, t.elem.id} - unmarshal_value(p, index_any, user_unmarshallers) or_return + unmarshal_value(p, index_any) or_return if parse_comma(p) { break enumerated_array_loop @@ -673,8 +744,8 @@ unmarshal_count_array :: proc(p: ^Parser) -> (length: uintptr) { } @(private) -unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { - assign_array :: proc(p: ^Parser, base: rawptr, elem: ^reflect.Type_Info, length: uintptr, user_unmarshallers: User_Unmarshaller_Map = nil) -> Unmarshal_Error { +unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { + assign_array :: proc(p: ^Parser, base: rawptr, elem: ^reflect.Type_Info, length: uintptr) -> Unmarshal_Error { unmarshal_expect_token(p, .Open_Bracket) for idx: uintptr = 0; p.curr_token.kind != .Close_Bracket; idx += 1 { @@ -683,7 +754,7 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle elem_ptr := rawptr(uintptr(base) + idx*uintptr(elem.size)) elem := any{elem_ptr, elem.id} - unmarshal_value(p, elem, user_unmarshallers) or_return + unmarshal_value(p, elem) or_return if parse_comma(p) { break @@ -709,7 +780,7 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle raw.data = raw_data(data) raw.len = int(length) - return assign_array(p, raw.data, t.elem, length, user_unmarshallers) + return assign_array(p, raw.data, t.elem, length) case reflect.Type_Info_Dynamic_Array: raw := (^mem.Raw_Dynamic_Array)(v.data) @@ -719,7 +790,7 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle raw.cap = int(length) raw.allocator = p.allocator - return assign_array(p, raw.data, t.elem, length, user_unmarshallers) + return assign_array(p, raw.data, t.elem, length) case reflect.Type_Info_Array: // NOTE(bill): Allow lengths which are less than the dst array @@ -727,7 +798,7 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle return UNSUPPORTED_TYPE } - return assign_array(p, v.data, t.elem, length, user_unmarshallers) + return assign_array(p, v.data, t.elem, length) case reflect.Type_Info_Enumerated_Array: // NOTE(bill): Allow lengths which are less than the dst array @@ -735,7 +806,7 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle return UNSUPPORTED_TYPE } - return assign_array(p, v.data, t.elem, length, user_unmarshallers) + return assign_array(p, v.data, t.elem, length) case reflect.Type_Info_Complex: // NOTE(bill): Allow lengths which are less than the dst array @@ -744,9 +815,9 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle } switch ti.id { - case complex32: return assign_array(p, v.data, type_info_of(f16), 2, user_unmarshallers) - case complex64: return assign_array(p, v.data, type_info_of(f32), 2, user_unmarshallers) - case complex128: return assign_array(p, v.data, type_info_of(f64), 2, user_unmarshallers) + case complex32: return assign_array(p, v.data, type_info_of(f16), 2) + case complex64: return assign_array(p, v.data, type_info_of(f32), 2) + case complex128: return assign_array(p, v.data, type_info_of(f64), 2) } return UNSUPPORTED_TYPE From f9dc92ef40b2a788ff4f5748a3d052d6889cbd1d Mon Sep 17 00:00:00 2001 From: Tetralux Date: Wed, 10 Dec 2025 22:40:32 +0000 Subject: [PATCH 039/766] [compress/lz4] Ensure libc is linked on Windows --- vendor/compress/lz4/lz4.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/compress/lz4/lz4.odin b/vendor/compress/lz4/lz4.odin index 35acaeb5a..19476c8c4 100644 --- a/vendor/compress/lz4/lz4.odin +++ b/vendor/compress/lz4/lz4.odin @@ -3,7 +3,7 @@ package vendor_compress_lz4 when ODIN_OS == .Windows { @(extra_linker_flags="/NODEFAULTLIB:libcmt") - foreign import lib "lib/liblz4_static.lib" + foreign import lib { "lib/liblz4_static.lib", "system:ucrt.lib" } } import "core:c" From dbd542f321cbe938bdcc6f9ad395450cbe676f4f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 11 Dec 2025 11:11:53 +0000 Subject: [PATCH 040/766] Update radlink.exe to v0.9.24 --- bin/radlink.exe | Bin 1288296 -> 991936 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/radlink.exe b/bin/radlink.exe index bb2fd206ed5f1a91db374482935720ccaaa3fed7..8fb74fcd7612588297ba31ade61af11739db97c5 100644 GIT binary patch literal 991936 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�jMH`)+7nUjmwsc>Ej`&Y%gf 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 z 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 z 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 Vt@Zzi2eQVDE9Y%h}hr% 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

o=L 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 P;qJuE%y&e}7$5)uV?X8! literal 1288296 zcmeZ`s$gJbU|?WjKm`t{T&%nb1_lN``CWVrTR6`u?qKves~D1zS*%b{l%HOdn5&SS zn3tDdqL7rTP*j?ykeR38;vcM#o1c=Zr^3Jx;L5;|(#FjY_tHEaX7~pNB?fLLJ_ZIQ z0S1N$X0Y&;3@!!+0Wi}6740ftewp5vB>O9;_B(2!an$ z(Qs3c;Ti)2L)a}r29SRk7(^HrFflMNY!G7j5y8N~&>+l^p~1kwARxk^!OOrf=Y}AI z4A?wWLg0!Z16UcKAcF@#7OFashWH>C z#}G#bhA$w_2dKInRCVBRDJm{XW?+ECEdwO2FyvuVmztBG%m9vSP@FUHF)%O`VW@Kg zSvMT8W4L3OW2j?DSa@i#NAsHu&(3Qu-BK={F)A+ISuCA7DmvXo9GxX95-#0IJT9Fn zDhl0!0^N=xF5QBzjJF&aFS&MJb~QZh+j-ve;CltfgNFrNdsnAFE}fTL3~wDgB;nB+qT=Dgc&qUcNKL1R3PhP?cO?tscgEw6hW{N89v5)zo!`1H zeYfG^gNH?27@srV@BHCn_~YOK36D+}l?WHcAFLqhP8SsxkP=D9Za0BW7Znqi?n(|v z#^c?N5{`_=9r?Fia54OK@Q{E@@2sNFc{YxQhaC?d7IEx$6X|qO;c;XN;IiLLh1-9lOIMIzv<(JUV?;5?s0+c^nxpbUVs8G9KXHwnpUw z0|SGL;n9Of1zdW2t-ks%bu>Kac<>;|2ANJ56%9wm1FnoGTsn^#zB_nKqE|$(@eoAS zMaP2&L5^1FbWt&IWIW`^c+17`+QDN2-99QIj2{h8L!7D7>7pWoBrU=CvC~H-1SAd8 ztew~va4;m?By1sG2`8eWF_Qm4~Jg##=Pl9FIN1qynIG)TKar;CaJ zI1tWzbcd)!K*Fk9M}_gKqv1=aKTJAZR74<(!15A|S37l7Ao3tXEIM6OY+Sp`Y+O1^ zR4l+Ae&K3(#PQ$}f$kg?78k~+j)reR$-tHIgDWFcN&+g}`Ofj+QAro(5EThm##bJl zXI%`h9y}`0&7#8i!qM<3NE=Af0hE3~G7@0n&VwLb%rz&SS`#qjgN!y?Qz zDk=~$36NN4i3$r?Lehn~MnwY@*@k~WE_3NFQ3-KneCBHS85C3?Sr@ph1YAPWh1o^L z1QdgY$3Su8qT<2$0UE_1DG`{I1WXw07ae$PIx>C(+b;t01qV!60wyfUT%#i3!g$~C z@4=%2Ag_UwCv%Mo4^&Ws@kOVLiU%|;f}APi%6J|e4+5Ph7%#xxQlnx6laPQ3gI#X{ z4|7n`VsT-7=xBHr60R;P25?CUxCGb-3a|hNy9yo;CNN=;yI52pF$D4iG|&YYFM^UL zC>jKy(Et$vhrb9sgazOsECTYA1Y80w=rv&BE6|M|^foXl)S!2Og|PrEjKM+A0~1CG zdKqXagFOigdKai5$cv~!&jAZzaQZ|JdkdHhYS<%!R{$QoBA|4mgDc!sU;zwv540055xI;r3oCiVm z4=BZRz(W24yjB7wZVPxIqlLZ-Tmmih;Yk~mV?7u@IvSn?mBpZhV}J;Ks4zIYYQTaS zHS{H5!YH8+D_aB@Upg9|1{Hsxk`x~LFFSoe1rA68oNHZRVT=*_Ixrd3&_@I^$o*&~ zjtQ<9kbwm?Y7E%GgwbPwgYmvc=LJxUK!EWetkB_MybltAv=JB&cKWEWfTY0wFn|X) zT098ACD7slp42gOfes=bp!ESb9zdW-)$k)Id4X#k<{A|Tc&s`yUIQg*u#1^%RCFLNm4pNrC~3<;w1VpyXvze+ z&Eeod0Y}Dju7+Ph^$f&O2M-A_UNwAu@URHT$b*MKt%w{I7LbVK!D9lj>Jwh@NPv7{ z!}tLaaw^O9SNgm@0* zcoT^Gz>bH8Cdlz3AlG~axeFGVhXfFT1krx*5U6$GYWUIB@S0C|h)RNMrxB>-1&d3t z%^*jDni(wMx(*r?u;vd`%rSjRZW z_{042E#U46TKhhso2ky>=?qa3@$9?~YStHubW3`4o@YGFc-gV@wyWW3 zpUx8=2VW>an)RDOO?F4aYmNtxi7>u)Vf@^A)5Y-S!GjW@=5c@vabdi~_{s3X!2<%W-TneDojxiCy(>Vicf+sU{v0lhCtbSZC0rP9I`VJ( zV0iA}F#(s}X`oiPtKqGKM@3w_-FaL(T~s7o7!NVNa_qbeNrne5k3byp$noGINl*@P>~@#&>HOE}0&V7=aP2(qYWUvq z;Bg7(UKV{;P|F@v^h1+cw;QN&FTi-1@wKDjeNdmqmGO^@;nRahMY`QoJUhRFItU0^ z36N}OiV6opOP4f?D||uHC5? zAe}m{-MKa{ojEEFNO~k(7@_JVT^S#^GJbF|Jbv)FfJ?WEiX-D6SHowZGyy7=pfVB= zQP<9=pk%-tqaxzM_!;7p8wU>vICg#k`va_vIY!0Dh4HiDje`dypswff=sX57R1(xX zV0;DXwg|W~-gPm2d+?|TbBKxuOjH6S+Nq-gmXT!kQL%7gyl8kH?7S2e4zNqW0mkeD zDt*CH5ch#Z!9@V5{Bkus4vHohP`|~M@vkeS4+JU|Kz#s+tOQ&_k~v021~YD%V^kDi zqG)l-9HOEEiYZV(&yn$~tKln90%Q(Rv4M(8I5K_(g*yvGO470OtP67vsN-_h)euzB z34js+k1OLHSHp*(Bngt$ab<+cO28$+UUGm(5~x4*!_n{R*VY1Y82- z1s_<*3%D@;G&~DRCNU~DFhL0y#-E)&DjXmQkS8>t!49r|z%F7A0i};ipq{t{;|EA) z21!VQoT>m1XaRUYi-05?;1Xyt01sz@ZXOlJpO7LE+yjt7!~j$n(1ymF@ z2H=4$;KFzl|07v*+z=B!;RGWb78c@j# z69tz?AW@L}VTFzWsD}XyeFmz4QQZ)x>p~d#TIjniVjp5k~4WA5+I+z107@q zQh8*9D>4LN;Vpou8bI-&0ux7z2Sjqmk{4vq2^`^ab!FSk$35Q>3HxkC~tuS6XbYi9~Bu$9SN?$B*AqpvyX}f$k76jnn@BG zD2xYC>JzZzJUTysViVM&>^4zxVZ3Mf_25wvu<;dQb-CMxJz#VcOb&QUkcN`DC z5pd~9V>^ybwl|V-rm*c^s5(i&Obog<*bi1gqxH7(QF+9-W#?z6; z+j;QdOMwnQK9|mqE`|>e9+W)zLZZWs-^K7{ho3-4o?z#RgD(U++=Rf|g*#t@n*Wk6 zAPYn~@M%Li;6?1D?_)7ic6;}3ut7s)0G31 z={j9`x?NNPI$c2}Y)Gf8NVkhhM5n7nw~Il$)bB#)ZXY(-*kLIHapaJ^=kN>Cm zTl&Cug{TzxcI$zHD}!HvfnUHwfM3%`C4gVkMa99Rxkkl;p`@LEn~RD$n8R4g3gVb` zxTq-jbUyUyeC4>o!MF40iw{r#|MzS@>fq5Gqhj$|nP1+8fuR%RGgM_KVaooW_Gtdi zRC1^Dhez{o#?osq<^TWx@6mju0wvHv-beV~qwx(WU|sk%AtCC*uek*rq%QoL&?yyu z%_S-aKyxennsZb(Kp0b07C;z1Dia`#7L^82L}=Ei6!2@7s3d?w-hh#T;WK}}=4bwV zM*&y)_`2~kf5EqnpZE)IgIKpWrt!bOm&TuOn%pM9kjDS- za~l8qV`=>PKhpS%uJfev7kv;(<9~ge|Jb9uY5f1*KumgnH;q64H%J9X8h_Dei8TJ# z_tEvTgY-&*^rrC_{Ps)ZFZgEZ$ggq3glp-c9D$qD;m#|~cSKX&r5BfrK4{$rQk@{61TnRgRJ z+(>iffB!knkw5<$NEZjlS>GhmT=-vOF%#-s{?~{2HLmb$ym90gy~3{_~IuFE|Z~rGjgIpfEj?#{cicC;oz$AfLYl`TP=ybqSQ1 zu7VW5wM^sx_bQG5J;?7L()f$6!To+LjsG85e;WV$i)sA%pFpyp82JQBM%U2w!TooP zUqeNO|JdVej{L`NTuDe^?e<+5)T?$G!?2o9{5;4}?N7OO$`4tikj{L_yfeOKQAm`xo70Cavs6g`-DBXkggS|sS zP=lNS3gF+4{KtNSEcgox;2)p(3*LhQ7@UO=0elucfYB1E3%^K+ii0b^$RUuUex&jL z`;o@~{(KsL{>?Q0qRa3kdKxMIZ-8W=!OQ>pa2kKXeMs1Vi~tqhH$L$fyhe4*Pf!vC zxfYy6uS0Xpi8Ms9%m4ZyzlM*B0KZ0xiUI$zhXMS@PQK57K|%BvRCm3y1f^gV zl{6RrtcPii{5dCF_>Y}4cjP~I5|psO{``bo6~JmO{`bEi`2buLqE!QFuKY=VKpFWu zD6nopUHKbi)p1Z}xd4hvNKFNb<@ewM)rCL*09X?0R7d{T2VD3yTtEf-u_Koul@>p^ zE-koi>B@iXKn18)ISe8WfaB8?()bIm_@(i`zmUdXaL_UhT;cJ*Kk=Er zp7S$*eV_op2B=Y{QKM4e!mj~othw-Oz?yFwum+t5tcj-qYxHTrnt>XyhM@+esp!#o z1k`jq3~Erq+tb6QJt+MYzK(jZxLv^@zf0Y=-CqwUE8a3grMJxNm2eY8C}+Ma~8 z1TlscM%$D81%stM>CxSy0@^qM>g<7b-zC3gCghH2(KsDFYfdIpOV1l=0)nHyq3i3~4U>^?Ou4FhN*bR31QCYg8^kSxZz7 zKv{ECHb7ZZR6yHIKze&rCP2knR2o1mkZ}bN#uk+XCI$wd&K{K&j0_B*Vd)vnpyB5| zDifF)7+mr(?hyYSb$CV)ua0-xS$mWDmxFk$fFclqtn-J@~> z6q3yc6+D^`{qbmi+u+;z%cJ=hvkx=@^0!@90tIyoILOoZ^FR>{4z4^07SQPC4~8`U zJO>UC^9Gp717dyvGX+4*6JVwYi1`A{1Pw+OTmUm=K%x&Ad|MBAbV8iM-?HQ1|NlOn z7eFhmAiRo{%=pQUX>RVI{z%lclm8$?8WsulO<4*$(ZNnn;*TFRY`W6)hP@3uH z^yv=d@ac{e@ae9U@a;U}YWS9aTZu|MDA9mo6gS_*%rBs#_1T#}KSxWznO`7AO93RWWdNFTFmUD}h2^ftOl>~l`Bm5%AKtkX-8qsH0jOUL3Iu+Qi~J%N_%)}f1TZl$@Qa=RDFaD3aC`vGX25f^Up`W}@AkW&7CygPD1DX`v0#Q-#L4;rS-2W8%( zuOg74E*JjS;L(p;;HXdl>jJqo|5+M;&N;BH1t38e{(mPL_(O>MzO=buaC z|HqpMX4m_u6o9O`2y)sfhy{-PMV~;~>osUV`~*m?D@-kD$o@U3sK`G9SNjF57Bsri z15QVfvFZFd;HkYd{+!oo{Pk;896(Ou&pizp7OaOU%?$wu6fEp=|A12v*i)|j{|rt5ivcrY{{Yj9HlW+%q1Uv8~I7vd%W-cr# z)H-aDevp8g z_ZpP2_CP$w|L+$lrq07X#||2I`zV>_!v7lNIZ%S(|93WxA4}4a1ewPUQu#8CKOYq5 z{Qu5@OanzRsFHwq7;NGvu!$fE9~B44*i}7<4I zD5HWCA*j><1;jy6K!76g{Q+?H`3%ZK;8Fvc;%}t!*T+DT;cJlRz=6pFvgIo{=0Hwf z0-hjFp0#DfS7l6_{sEqn|3~U=L zbvyvsfi3yAfXk#b&|Dsga`^C zSm1**2{=PtN(0Zc!86pQH2(Y^@REi!{#>M>f&^afamY+(JI};KB%;x*Yl6U;D&g0G|)bPf;;Q$|1gce=n6Q*A$jFY8mRpMs_Q_t5y)U@B!Zj|jx|UA_b1Z$AsRvH9z4Ty z2A;XWYFzmL{f7q^D3?41Sp!lH&LwX^=FWk{t1Dfefq~E0R=evND zG^o-7v0Oj{td1ZPK~V%s(pSKl1Y{;W*Ma7E-aiK=nkOLlgAM!wHt-49Ku~}l0_CL> zAT^-EvFIbhs52nk_CP_xcee zIKUMuxPXTyq>G@O0*Z8SLITe|?}4-*z?G*X|NHxC{P~w*s=$-{w?Jmifz&K8?}6r2 zuEJD-li4efsx9zj_63xRKuZch1Mc8*_7X=L|La3({74Z2b`3b9A;s&dH1O>AKTu{1 zfz->dK)wUbE*E_TMfN3dx_Olbnji(G#jl_cxCT-K4ot9Fkb?D68fN$)On`vk!)B3gZA|0;2bv0k)fPyf0bF{JTWG+_ABf-6 z`18Tp6qGIyg$6YF{{`i8oFxXVFa{ThI7<-CB#IQ>b?~SVcuWq_`-5b;Py7Yo;Z8(@7~FBk(Op5wh^Pff40xOb)Wdua8nOhB zOM%A8iavt6E0@9DmD8Y(2%>8b4uuD4{P}la3(>%fydHy8Av*Ek0t7VB176n#YJGs3 zl&?V@`G0dDcLNGGhfRNN%U`=O2ct0*`y#0I5Rs$-!=Z zm&TtD$~>S{Rs>q>`x-Q`2pJ&+O?-k_F8uEinG77mkU|BtpXWDt>IOE-4i2g#;L$%& zBwqlRD4=@xA8d3x|6dxYGv>no{yJ#L0qhO1k&r|K_6RgLfQNFx%{}l0z`vuQpahLS zgU9m0!35R`NxI;GLJaDFLi;_~H0TIAd-9k$Vo*{8D|medBnJ)@ zQ2Ie1H$(2>fX3%QwHQPnczmt}GV%rK^dWGI)#%EC@-1;7|sK8(0vMiooR&$X{2$f{+9P?&>2_ zKRCY~09gxJNDcBgG{0nLbjq8Tjm0kmP} z{rNQh*Pz)ruqB}K2b6SPg9^C!pk*nb1OqB-Ac^7*xU~TFC1~>jq}F{0it&4p@PQ@{ zPlU41cTaz5oATM&J4W-?#HRc!R4jXqCdYIp9@8pe>W2g&-Vu29o*4W9-e6hp3to4_;KRHJyt2rn^QK4hLGaF0pUzJn z|4+e}(zGmL0PUx}=FxfDr&|-W#0#{H=`(*mXq%>o0C?gOWF~m}6J(2T>w%IU(C${(y}EwKXaS%5GgOSWA2L3#*sfD&joENDxtmjb^)l>xuT6&HSuCyxBbE`avy+(-jW&hfuL z4eMk-1T}AUp)21W8#ubnOpnZYRy*l~4YrtCaKd13qFnk0N4?(+k zUZ(NC2er`NfOqVGCJXtCuEF=39D^<4{pbqXpsR7-h5y)n(4zQ%x1pPk{vqvn0-47f z3bMwL--6*GXcOGeH2(L`A=`1m4n^DcyW{7`uK}v!t$1#7!3+d@2Gu<-peZOv z{-P^T7de6oJ{SIi=acz0emU}s{&V3M`vltJtN=Fuqk${`v2PWi3ga25R(bHrmA~K( zcnk4cm@6GYP92KzBrJL3iYT4O)o#541n{LKhK zckoa?1j==wWeHY_e?wjPHDXi*K$~Yli!H2pj&p$$9=Ht*T95!-f9F9746EDWI-srx>2T#g_8y#sPl5vWttH6!;00JOK-mtqb01U|g5B^Cv;rEm zNfYh{kWHYGCGg<_pq=~t8kf`ftrV|+1^H9K1-!5O*jG^V%!=m|7r(|UkQJbo%Rf+G z=>1b@K6B&;b$p>w20sx1;Zo2Nnu52J!9{}$Xrr_XXj8K*c(D@rbOBI?5&h)~&$y1D z1y`V*<&Ztt{i+61jN`}YHsHm^g|rYnCwsQ(X6OYcD`^duq}G1va{gNH^O z`ExIVYxD;2u@YjpLFEC@EpQSA^{D^-0J#rTc;$!bRLMjF1w8x*1Rx`MOiw{?RE5)Ndj{G7Y()bJR zfp%|#2EmZCxGT8B4UJ_`vA|z+9UhX$T|kRb3tae*g{TOGLUx`X`^yh5tbVaUQyyfC zJ!l^;sPck^E~v(N1};j_Jdc#?UHCyO!tz1GGLHOKd{;mR7hDH<8lo>B)M>F`cmPi> z&{%;x541r$=QhYSiZ=_=_zSL2=0A2D6mqvfP6K7k8{qH)4RJw_k${*C_bz%l#Baq{ zqN4CQjX&uf=qLls07G^RIK<(O0d4xe1KN0SBaOe{5NJ;VC_TMD0o~#nDFABifg4#G zd%&}@;6@{;6$aku3Tc;VOaV_|gOeDf?WO@)DF|*fLfUs4kdZKOqY=~w^k_T+Y7-vj zmv>;GWBU+$(-7QhB(r^J?+7YeNopVVfVI%PeP{}@29%;l+lPa+eb{V|RM?KT4~b|W zCfb2=8>D>(>adKq52?{U_T;fQV@-m->g+!5A3 zykG_QIa(75-lhOGaPmjnhbji3Hr`NgAA-g+GeA3fAcs;FfSZRGKl9fMzz#<_1lpwv z+p-GYqzd1%3YIdUbrW&|+J03D_hnPrY!Y~*>K({AJK&9~py|YXP)(8Z7_?FKGH7Qie50zb0%*4?XrpQO;`BRQ{Hm|3K3P7d;QYRDfY_%yW>E6!}#CxR-1xi0<^afoDflzvvmz*gn*QDf$YaW5Ws%Y9RYV&w$1! z3!M1{d^ACxOwlqxr~sXX2{i>Yc>q$R4ORr&ZVIysv;_;Q2(-@}wiy_-^%lP6^Z{sW zMpeWFT(^M^^~-q$-Y*H7RsfAuf+o)H!VW|G3);o`2fV!t9E#xS+?*xg?lE|)7;K3= zXf^&n(8xAuH`V(k;H~DL_zRwZhH}nq1g9EMcNw&|)6*D~!eBf6K$T}cXbS*jyXjT% z`UDUkywxZl8WE1*;|D>5F!gI7`yl!M9sR^#@B(B$_$)NtOGY4LK^r6g@qPod>p^>B zUHIRF772lRprCf0BY)9nP?mWOnlS_&5XgHAqP7RJ7Z0}Q@C)czM({)?WFGVxcrzy` zQKdmPB<6sYi$OQ)I`Zd&78-!I3f3=y?m`6}?3fGPpaR-^2@XCN@FqM^QgQ+9#|I55 zfQI(KLtjXHbwQify;Fn|un1m#K4&>!eXP5AOO&{n@CkV$a< zT+m!EXeS?NI0IzE4-f$wt;q*Xbmp^u1(^iuFN3yUSulV$yMo7tzk$?&;xZq)I)p#p z^dv~F3%>=!F;EV<21-8Qd2{fhpOdKW0nd3uCc;7P2~lwXB`KuUeV_rod{Bvtwu|W> zWRE&X_2D$onh$;phIim}3E3x~58k#58gZ)!v0V7ygBA)v_Gf`D{S4k92bz}xt)&5< znD!gwR8W;L1roRX|3IDxjU8Z1L^~SH#&k&C4GMm zDQZBmxBy&G{sXNsSOT%gh5tRs5&5S;*wKnE&hK*Q{ilnc&|E}%_lu;nTLKk*lw2Or@IvMnE!dmQ=yodoai z1#NkK56-J!;W-1c7yz{9G8a^@g4PAq!|jBWf@%D@;Jv?~-R7WV58j)f`xU$!85#~# zAUoyw^M8Ru2UKpQ@#lcHW!HeB;NN{vngDG*UjyEaoyHH|Zwo#I5mY+m=YZFFy-(w> z2eDlE--A+D{wvU7rQo24tWLO^#-DoyymJ*)dV*3pI7|EmC27!-H`T{_pyI=V0kkf} zf&sh|095q<`v_7C+ECr20*Pplq$7X+J5b^RjblKg4w48!S>zvRjlv74bUrlB_(9r0 zi%a^_k?g%<87jj~*D`;=F3n&x7G8$+l5Gap< z7eBf1zXnZF{@Vjz$OkTC!P5(@6Lr8;rZ*NF1~_4b+AOse^2I1Xlsb8?V7D zlQ5Snfx;fVEC{^N$B`dWFhlkaf-*xsXco?e{~zcy7)Zhb2O>BrLJD2*ouO;e30*)Xo-3%#2fF|qupnoEt7(u6{z0ozSJ3h;Zd4gEm5gw}^r_BZKBOz_U2@AQoa{4{Q%T zr0NGvXhV06Lo)6A-=FvkVACl4|30Ph*Mkr2q{s(6O4$!1l4s#;Ns&N zxcC4ym}`b3T!8{g6cE$EZhiM8e0GzMwmP!5I-$cp%CSlwt#v`5?sx(zf(Hkdg=L|9ntn znMP|s5(T)O1(}}%7nGn?K#(#6+%kfkj&8wlEsg*Et2F+9&}~)F65|3WU4Tvam&Ol1 zffsb#1;mXO44~rwGE@cVL~!u@9(WxFEFXXt%Rm~K;K)TZ=s*F9Tws9eT1bHbSyT;L z-iB0CfCCI{1f-+@ZEyI8C@CO;0!kDR-Qa~7h_V!vQ{Lk&DX^}_hRnQy!U>do--G5A zuYjrq;z|l|(+`rhC@3kw4J$|nB(J1^bqhfL&j*(jZfcN3fnHL8YYA|%$PZeH*+X_`sLm zfjf8@nF3UOpp+D_o*c;Ykdnes1(GPh`5dXF0F5_*g6S(Li-TI{pnDXMOA2tC3uj4z zsOs*33>fT%1^84Dg3SsXg#|dngY%CgKdFTUIF~}Q76pX`QU)Ziuz(c-h{8fr36d_* z3k%p#4Y)mk*{pze_#r;RT3EnFh;D(>1*ozDn>0vU7O<=i$}i*<7KnUAL1BR?f=Mnf z5LGr}oi34u1-PI=X;!c(KoSLdVFAklI13AKp^K-mfYo+GqOgD!qM*!z*|Kl}o#q5O z%m&gv#!+T~^F5hm1~{`qau@|=22wsmDKlL7^FhPekRbrjz+OIhrUOTR1Xdh?!Xh8k z)6ZwUFAMFlf@Z-Xqk_;b3AoCDdK%Ql1h+Im{mu{2mEJ9oVNZzPz=uOwFhERskp|iq z3hJ?fi)wIV1Eljp8h<{hkp@x+>N$Z9G6Jp51r4f~fR9*%bo{~Xb#NOJ)=hB*ZB%ms z4UxI>Lwckjb5Q##E}%o_K%IwwXF(&B;EpMl-U{S|J81s`G?WTzjH2{VV5I;?IpPAE z6Ly8}6$anp1MXCybWRYt3%v;W2Rga327DvYd(f>+`CxB?O+fCJz;YLQ;QT6Z#f2yVPPG5Mhir+If(vBK6H=`HcWvOP@u$u z(sO~8yP!M;D_>kdJwnhJCU`3K@QL$9PFS#P=X!QC$I3^MOcW_$*oK3-16zCQr(7+3Hw>z|40rzV!f|?(o z9VVdkgy?>QTO~gsdz>v8K>EScDrf8~67X;lINg1QkNZOk z7|@19lE+$*MtBe4oObnCN5;?3lbDa?N-Qu z8Z;z9-DnF2uyW9b9nfeiXo?7XpBK>%KzJM+Pmn?ZG!V80GSLGX=W+pWb;|z-nn?gn zfEIyIDuvV`ph5P3pz_lNauB2oXsYkC=lz05Ov!(cr-Z@sL6>_z3@Hb-R!=%9MgrK|j))jr!=z(?AH_o6yL z_M#d<_o9MMuYc{C20pJGydM=L0N#%ZI?5Mx@H=8ZDrn^p*8Qj;hwx+WM+GgVLEVoE zG84QX6=Vy1KdJ+0KPt!!k7n3@R0E9tsQSl<*^kNzRfV!26}0dLZ1e^AepJvtRM0+B z(9$aK)&kHq0pP6#pqm3+_%$F)vcOvlK=%u{@M}O8Zh^NJK)0bnmUn@-7JycKc{CmY zEdj&59~EuAm<1~X!_mt6Jt_(i#ugO;2xE;31B9_e?%^Z~n5XKah3lK(+$^i(Y zMP&ns@w0x9$^r;ui^>ER$h`*O)A+mhsGML0-D@yM zs4QRwUu?j^-(;@Lz~IQg?cnztM}OuWIP$1A;=s|rw^=6$3NU~;yvqdz7>@n}otY1^ z?H_2h5{U8l^+B-c2hdWq&I?>EDjQfC7&=^3;z4&MfMVd~EzqPh@_oHW4wfbzK60=$ z>-5pJNtchV&ANT$pls69BL`)(-X1wi6t*=5TE}>BH}O!=w42gGckBA0CazK@AFz=3ngmZOqWMW1#Q`1ro=R zq}qrG77!W00TPJd0kIPVKxBpph;)zukrgt&tq1s9KL7jw-=lL1cs-v_=MBhZ1&~a9 z^dD&D%#nkYd8a`Jojm&WUyq6bD8xZQUjSl!ecz)Z0Al>hZ&3k-|Ixo`Cy)Njy8zN~ z>FC>EkeCSoC5moKpYB8spYBWnpYBKrk8Vc=kM2wjkM2SP(84j$IzpfBLJObHL#~D= zUHG?!sKg`PuYB}h{T%Rms-t!FkUQp%*457eug*GJ2f7-8k%8ezV_iNEKZq3J0g*Ah zU?COmBMa;DbvQs|2`|GD#kzbJzN4i{w~l_zI(77E(v_o6v+f+dn)K}G)vR|QeI|TI zZIiAY-JA98sA|rkqf2uy9WBkd4T}FG2V-+?9XS}A`{-zB&b6agbKf0FwzW9Tc(ks* z2fVft6!C{a(cGdUz|6pK?zA91u5J$y7)RJx$iF=eOh#h=jhv_ zPa;QiUmreNTmS0lROmXUqqYCeAKm)CMFo@tj{Yw=u<>YJ!2_^atg;}pWdFT5I`#db zqi>5Y@ErYH^g-lk?dwlR|K(2sA2WRP?LWxTF-QM`&gfzW`{6Lis8U^u$;--n}TQOx@L`Vz?5th+$cvHyM?ZGC_A=ux;;e_#JU`t@H6c=qw=-hVHS zJgSXieZ&niQzK)0CW^oLVy~sNB6!zd30~lMfRg#i#|#o-TV3^SPB$$M-GbqgYdxRT`z{hr~l@F zm--w{{rBp~LDlznk333cxB)H+KwW{OXa9XZdiMRTqj!rgvmbq0^jY#~>gzj4|K&pq z3XpbCRymsb@B7i-_mD0X$cP6=TmM}-`u6?(qeqc+9zS{&dM(S*zyE$7z5D(+EWR#m zJi7MZF+?)@`~Kk3ukb*uef{w0KhWZcqksRksDKjn(WU=x9DVv8vO4nU|AHr=2z#>e z=-Yosz=nW|^`lGQUpRUdo^Ia0J_`;PP$T8&)PHMKKso8?-hXe8Zhimt=>LLmAS1qQ zJbLzD3nXEHYC+Hel1FXdA2@PQwdexRk%P8HA4HBg+P*%0l=mNG3HMP@u?!09qqhGJ z9JPJF1-w4xh+}=hw~a>}>p;fx{)61Aa+LM`iz5eXi>~ql;U1|E&Qp z{01kClbiw!N0M|IE`TEL&ygfoh8IT;>b}2v^dD#`-ce9+gRmzMbad;#+u(Qv#r%;+z6>Wo@p9wn*Y~fF?)}#TzGdO)(tkI> zYCy^8$Rl2un$q`|!Px>@X+loUIXd_KiKBPn$?WUvJ4Z$TLGBqn+WWo-d^ZG&{F$Ry z|7`&u*>!a5`)5bD7F}UKdbj9{4V>P<3B2~-Nl;82gqd+;& z;0Xmi)xHE91PWZRL7?giT<(B8e)R9ZLr4F<2Ni~hl9Kn|$D_UPFC9G!Pqn$PuODp% zjY}{wfEs8~qRZGpNko?6(NWuf|BpOkW%zY;?)&H9@)hi2RZxzG1l+TufAjwxc@)a< z>PV6-!>yxB-+w*&uO4!E*3qs1AeU?%o%-+X(SP-8z-bAqwf{hcLyStokw>Krhd|0t9sLU~lpv!=;6Me(%ii|~jy^5Azz!;LC6E4neHbhS zju+p5J&?L!>-+mhufofRr>~D5RsGijPBBLg+P=SwRO&o^{pM)zzlTTHzP|#h3ZMz) z?d#i+YKW16;pp3c7mog`hg>#u^y~XmunOqo#-n@xodaimaBlwk{s2K9*75#Vo zNRlnXi=(3N-yN;1&rwM@I``ieNUd=8-zjjwfl?MIt$jF>RLbz+=-l_;j_UrK0^Y)M zgdydQ^41v9o_ox5;&Yd!2>F=P8@lZ%W&c7*Y}T(g6eT_ z#DD?=?8U$D&mVn@RM6Z4m&xGJ2dROiNKlCb3Uq|R($|lUUj4TRQaSdbnE`2{fWvy} zzcWW`^S>P3`u^h4yYNEi?dvB;_kx-NptMx`@5s@;?~g&EtgZlDI~@lnV6aR7zCUvG zE>fBE2OP+tKmzA;a0P`@=G1}8oT>jHEp>3rgUTF41qVunpwt5jLa-6w%r^JmgQLCg z&%hG$%Z=db6C6aKZ~!YtZyP-ZI|UTXNB{nV^m4%>V4uJJcjD;R_aQ0?N5M_5e+8d5 z9tCAaaEO||{{X6-uJIf>$XoPHb#;lt@_F86k<}0;pnt2WsE`0M(o4AyIqO_FoIQ6L-}1-(^G#CP|jz0HoRD zX#4&bxDo($J&riq{yPfpdVOV*e9@OT)a&#`dxgq=d6gXnRS*P~j z5^z)Uh@G==YMdwF8t2N!qrCq<9dYD+f9c3U*`iB4M-J*1eG)n1sQdcL z(WC$NfcHFtlf;*Q{0xwIYyI~h)TVuK#L@Qs5pcwUy?Pbe1U?%2?-{6acyQ#AEW?YV zci%q+4~Kx8a9jVqL}{g*02L#U)-0&;0?v(7Va?jL;7*SZsFjk-Z~@d*IdSyu`-9*d z2o85p*9nxSj<&u(395IYU8k?FPa`sLEOe>)(c1hsM_b>YLs9qn=+b{rk8XW`1}RB= zef{bv@4pjA4w}9{g(7_E=+S>Y;K7QcU;mvu3Th=nyQ$#x0BH?-Z!ifVN~oU1hK( z;NSq|6L9hI7o`#U7OB*j0_npgI705<0>th;me{auuH?Om`MP#Oi5 ziZ_l98j!+z4GXlL}> z(cbsadcUsV#70mf9HnuIT#WpE{S2H)Kp}GUFRW?r`wvu}Kqk;3qaSqz_ck6~3LSWZ zrj)B7he2cb?Q76D#1wG!!mkB&Hrf)vR@6ukzwVL*-IqqhGJgNr6mz#chN3Q}at zaQvw4`-9-T2+l~L5*6&Tzwgf=jgFMQzH+qpA7mXUxX}krbAR9WKtdNW%u@RL&(W#> zz8yXL{uGk-uSg>(NB90af3&v#_|dQL!7TxJI=l?-E`VE{wf_zsImr9|0HjE$E4TrQ zXi&&NdfP|;q6}%)LK^{~5CZ!ITmk9+`v9sp;GLouph$)!I&flHi`K7x2(DJZS*Z2j zi=#*1pM^!}&yC>n4je3?@Bx=5ttf-MZ=vG_=>2NQ^}gWb3{FSbij~}dkQ-o+%A%zh z*4ICd?giZ&2OUdcjrs;ERzP)z>A%aM2IvjYxWi{~K>>ChXpj$FY3}`Z2i#`_RRf@4 zIg%vGaN|f)D#ME-j;ik=jZ|=agE|-Bg1jz&jSATHQ~%uo7ysZ?^2n9p0cg|&)Ve{` z3gD^;G<$Kh^&e=c9MsTy1TJi1p`GNj(8KSKZpGTK1*aZc=#mytn+~<9dgy5CKga+b zC`X({X`H+|I``idaJwJ9=4$~r{*Lbb2kDl8Bl#{O4ZQ$2J|Kl1xEutH_#ltOodZV` zD73(d2z1Kt(OPh+108UOwqn2|EJ%I0zwePto!r+)!RCO157MOtwF=(;dwBFNbgUIp zdi?{HUPr;h)jyBUExOKg^eCvOBK!I|yu-5x(gp(+HsAm|`tQQgx9_0?2LB8Gg9d=l zgK`F>sR?#@D3)F^$N+F?{Qb8EGI0c|qjbP+v2^8^b-$S}N;4;7W-z9KE z_DB+F;6(TR#iOCnGy$qyP9EI~Z?~AfJ_#OF0jFS4{sITx-uEYtUWKbEeSH)>wm_psnvO z9Nh|UPHue-NiyJ=1SNft%Rs?-8q`NQ3GSnO+<3GV+VTNMCU_uU7iA#-61WZl^)`=& zg7OH+!>a%GfQRId&i(iQsOx(dNVn$zcsL(iaza}KvmNf9#Bu{i^$Qr zuP+>Rg~e%Y{hK2PdBKCMIiMa1X#VFTKLaQ-e}MYOAC7{?s^DP@>W+i`Wcu$dG%biS zfYd-n^Fih55l7a4hd|xo51^(HXvXQ^(SP-jPWVyTe~*sV=Kq2=m1P-j9Ieg&aCGVW zL*PON9P}W&KqqV;{rdjP(WOP#*pHqq`X+gF>1)U+DL62mLK{@z<{r2X`TG9p(WUVA z$kNwOj=KJXjA4N4&P$*fl1uF1PM{>H6L|UPKhU;zaFZY037rb+6N2(CX!ZfzrvteI z%mB^2fdjJj{pX{5;SSpS`rT34e`~-!$)mad?i>Y;^@9ry@L0!IXw-sD2Mx&~#?wF( zMr;2aKMJZ)LFock^E?EN+Cv6uz?o_-r27XSc0CN9J^{PwDQMaqlp4UJ^L3zB2xw{! z9By!je|`V<=-Q&IJfQ3&a#Z*A)uZ5C1M($kR0LcRfEt_N<^pKO5gfKt|A9vSA$#nP z{x5h7DtFFqJX#9t22Xwe>gZdzsaIeB0+*klAwf_cd2{5DFT*!b`{v%!rSHFi62pxn zhhiC?ff_Uaj<&vka&+y#+n|Qfxg$=g4F5o}bN*=UzyF{n%CRGdSQ$WF(2GaU{_6n` z;2xEI{}7yd*}&5b@b}{|3^XdhzCQ9K*_Y8C67LRee%db+4uL4 zmcD-i8bf$_wD$d>qoMErf!0d#gQ|8Ag9paog)z863@3hx9u61-ECmwb1Brliff=67 z2OV7aw@m@BQ}OtJioaF%K4e)HXt9b%H)J)23+PlO&>|VIQqZy)kM17uc}qUsumu{R zRQ%H5E@%lyjfw~8oPU>&5ETp1`Ag6>Fa|CiJ}MeMoiQp3KHWVkpk*RQf0V!2v-SV~ zqdznt>vfL)0G)ISTEGV=@cS02eJ~V0(8abi1fjfER!i z9Q~CaDF8aZ^vJ=Vc?XXiu2ed}1R@_XAN?U9bo7Tnk-*U(0$vJ7e+W1k9DVptGwERt z$FXA_NgG2s{=GPQ@%@vekF^X%X9SWS)-wF#ZGXehko2*X;r;ETkEt9*r$vswIQH!B z(To4y9KHDOb<)C6j`s(WHr6r}osdXcSj+J5BusHGL(yr;q=mH{1qb}V)Je;vhb0`x zZgeDVOkp^7dotL<*GGRAyq%o%F_+=rTV%ropoT3hWq5xnX=5%!(J2v#_S&R{DGbLR zUjl1?114V~>x4N2Nhhi^CWEZB1pE4(9a#U{q=#VpH-<92e*yOWS(yDBOBvq30y(ef ztVq)5R0hSLQ;(iJ_KNYy<3OJGTuBc@8UEc(TA0f4?-qze4+;!7+@1^$3ZxK;VGw(h z^f;73@r6Os!VrdIZ!16sVKWrwB&eaj;2>ET!y$SlX<-V7$fcx(ISj`x$$_gun&yqIAG8COb50@Lqo?i#M@3!U98^@klCVfn0`1d5~V=RbV7z>YSWS87Y+L+2v zbXp{-IF~{3fasCrOrCShN1P3LPH-LF`0q*5##oMjkCTuzBgfBeh-S&8hqW99Pte2W zV-ADZ(<6@~6(1HPJ&fTv_N4;k?0@e-vHkBch>b0_UMGEYWdOz2=3EZNS96j+hA@b{ zO?nu@aqO;K(!y87Wb8u^*7od19Hg(1qdHe@l=N zAcI07;lltk4mo_@LX3kZp3tKwj(z%nyl4Kmqpm-|uXvMLEPmefT@*Lz!I_S&r??TeTT!w#FlNxgw-hW8i=*v)aP6F&c z6y1;zx&%o=-yj9ff6JuA7zVLpNsDb66mJ)R%Z=L=VB;=>$*Ump{WplA0+@!1Bz>-B zP`q>|DY1k>SJz@zzy$6=z{3!rO-u(uQ*S1LWg+ERFN>|ICF!&HucjG!9w-&>59LhO^#mI5fP zg6f{pmI5SKA=iYXEd_8X{{&P;!|HnE@PU_M;KVc9QW$M1fZO7uEd^*>e6*!-^k)IA zrSS0m$)i6D;H?Ev1Hn@OU$cN;o&jw?QwBSDuhJfs00?7?iUWkPM#TWaSfZi;Va!nx zfH0=0FhCeRDj(Ru+FMi}fEb|tOcx-GEh-1t7#KXd_o)0}2k&2+qw<0sw4rH@$^&+g z#1@qcV1A3r4Typ%Djz_M&JYzB&(2F8&A$YEI(<|kd^%lJ0z5ihR1)}`zREB#e7}+O zsn(1kK98^55Ick+y;@k zkCPVO^~iaVwDGP-?v134S3Pnrg2>#HNt@p~I6v)3`ux|!`E^Iq+ZH#Uao(7Iy`Z0oDf?lOCrkSlnO)D~o4JTKw0;`ZQzG;#dWX#}L7E z=A^~78kTPulNS3bSUiCWvVe@Tyu+BZ*cBnj3KqP=n6%gyA;<<6Jj0l@*c2hio;3Nc zhVvulqyOrcg9hW0HeZEtK~oS(pZ_X29{|a=gXW8pHh)!cJ`Co9X3oGaf5Dja`7BHk zXy6tUSk^ZflRh7XiGl`a!J-!!lRoc-iGns9f<;d-CVk!t69pY=4mxRm1_J|wPj7@k z!ya%FV({U2x#7|6qvGMw{IUTw7G~kmeBc9U&ll*l?aq51%|G~kxL}pjYqem2b6mPBI^LdG#}y7?I;1|g3^UYx1#`*3raN}-HsekF35i#-Hc$Ki%NkD|F#qrb63Ov z{PLg)6NaS3e;)NdDiTQ#|9RAxs7Qk87VwGtVCEk1A^o1szZo6(g0?=n@Vn%wxVUmW zb>-jo6ck%EN5J9PqLKjGUfb=WQjoOqpGSU-#UD^20@)7cr$G21$AS4d5I)H5NelmZ z{ zDC)uLQ!M`Ybgu!QT9+jF&m$k~o+aRf1Lnur{7EWI^+^fA>V>rT?fP>-YsATsMk z(!x@Qq(dMw>r~RhREMOiATsN2(n4Q{r1u~)>w8k8twYk!Bt~0@tb<96x(-QaKxEdH zBu8D3q{m5tx*l1VlM3g0U-c8#0*CFRs(!#$ExrdS# zes##X3?g$+CoR0{kaHhI=DtsAJnNA214QP2NMhXTkaGk?=AKD%T`3~&)WiAh-K5QTJ)9rh1vrl zgY$uoq{&wuoDX&+O+M=2e5E64@>vJxQyoc@pE@|-xSP~`)xjC0@~DIJpSwxTAi29q z%4E^+0y6_clJZ>- z=Qj|gYry+_lNK-aaK7IGPPcQwbIeJL*LpaAxC<890-mBsT0GYSe@$Y2P z#lIf;2a`UUdi)Dfkx2UJ>+vr}MKWn(uE)R2pd|6{e$qo;2hjQ^CI*J2g{}_&ekUcC zdc2QO5eJn`?`u@Vk_uBJ-m_l4%FmEA(bS{pv_R5FSC69e0!fLk4)5oHb6HZMX~aL# zBCrxwu#!U8h=01NAc2dv9-x89Le+?WrZFIaLfeRcwtgTM$mcijCOu^Jcz-U5k=Nt> zzod<&4n-$LK(%+#d6A@vsUDy)aaV_bKaw`4di=YY)adH)?|;%oSBLkXL7oAP3I?Wn zyg!f>=f-I7Uyp&tL9Cnf&%$iJI(G1cSWououvkN0nq5=A}Ue@L1r z>HzAqPvmtdIwt~-k2NX^EDQ`u8%sSv<3_n2|1N>U@GLmAt|bMQdb~dg4wU~%7fn5i zPD(%mLLw>96r?uL)#KmOBt~72_ivLJWj)@1gIFO6Ht<{$*doa!!M`5)AHXJF00;LU zupQ@;z`-N|_TS&6kEI~(A5%e|3AFY2_dY4m)#3dCh>zjnzfct9Ah1ROu>apCf!uHj z5{QyXAe~Q=7)3#5ft>X}X=AR(zl&hUy@j|39@2riAhV!h^6;NWKIArNnA`t)pcw~;*q55tA3AP0awBZ27| z5n??AU~m10CI_gqLCHY?nl_-h1Duj2lRmmSy#EG^I7mVPS#%Q|RZqY^ zy$ww?kc14414s&jre{bRoyh6{$`qj3Spq3cKuPrs*i{!G2}l4ONjH-~PX7UOx~<2* zw_rtRP6sESkGY^k25}`UARu`V><@5}0nTOMG>+ftC~gL2FG)x$gGUU=y=Rje|9a#@ z!tyf2)e_*$eGlyFKi~}e1nl;6NuVVB7VM|{;9!Sk4M@_5W)S480S|R>2?b70u)G0^ z_lw|QzXUcHmNg)$1(HEPK0wbJ&8*GKz<9PYzLL07hp*p6e(*UWAHzcuki0AcD`~(Ug5?hqJp_*hu!kVU(y642xgP(n zfig+`78M0h9RN)PA5%U4-2i9sA4v=UdgNaKdtgvygpc5Y`r%)X{G;HK?J~3^0tb=+ zxX8Z`_5nN-53ZbW2JGrs9G+Mp?oIXhHz-p732@GR2rf!4!V*3xGv5K{ z&^zEX-vg;cL23IZILVxYm7SR0pnsYN)d1%}<@CQR5D!Rz)683N0dyB!0Ktn*NKOT3 z50GyLu*3)DzgN&23v>((xK=&|O+BE#$u~$E5&-36P-O?M)!^X`X=0oO7kY!JA~*qV zN<0E5r%MnINPrX44R9v-2~KSvVQFaaWCc(qb_Nt1&?~>d@o))}oCLsrIt}*5ZE${o z+%p39(Jz=^ASnwTKLc0?fQryF;2QT1sO1AX-2>DF26Y;qL8}I6eE_P}Zi6!jyflS) zV=!b8kT*_%hVb%VfW6V8k^u4ssD{1*Nm&Bm&dwZ26$i@Bkiu!uWeP}V1KOH{w2SVb zCZ55S5g-kS>q(A(J@T)^@&G8U+ymFVkivA}ssN9obCO9Hc^yEVHE{D;64ogLC7Clx zfxHg?PJ>IJE8skP6YT2W;1b`l60}wa zZy|0INxBH`J%ZZ4Uz0wHdVu<;jIp3*`b1F2TO?^AFUVaWAM`+)oS=k$0qlX>5XXst z{qYZ6;G9hg%=P$p73{W;piVoe16}Iz{&LbqU61$olMecNy#JB(krmv*1ohq}Km(Pa zm3hb<+(#Kd2(3&_i}9j^bwSvC6XFr!Le2A@$YmJqc28ygNAMnfK&DP zq>rX>b3uz89sV5wyWvUF!&--b$030sk+d+$bL z(#Kd(RD7v!gnp&tKUg1ldJN&>7A zv?Lgm>OO{ov?qo-yoV>+jkTb`u*Oi2_b-wbhJs4ekEM{2xKhx-(#BMe_bl0-pawH|ac8N=`!iq%pOpkr?>~V^Q1%Cnd4BNe4pAv^=9l2H0$tAwnkj&D zK+^9?JVWQJq>sJ|NykBC*7>B1 zstQRLKxEd9q>a1^pcztLg{+rJ4_OtGj)6$<45>!WCFIi`lQ!Pf$hiR`a~~uvysD9N zFlpmejog<>k8>3)PBSJwuGO#r%|GU9SUg}%dR(eu@s=^^^IHYy+su%o9+Nh|)o{MR z3_7astRZ49lpiwH37yAe0`u}gbBlNnegsYHfX3fFdObK`bAulIE+;&iT~s_AU=xF| z!yr97PeZ2gnt!k(W(Pa3^0&{isB-0V6+6YG;FsBeS zE2t6S$qMFGvVqhUf=-9@08It@bj|?}9P+o!`1k*R(xty1HK&t4e)YIA1spF)pXxkJ zLsVpwKECxRzN7%>FLp@S$C5*mMSE@N?KT|kaa4lF&32S z8eIyd)ilHpU0oQEJX_hr(=w+cBok_6u>olIKh}S(N!VoWKyH6Le|eDM_GlW(?=fby4^Mev9lg08Lm~xxd0+_ZzMTi z)o{MXoRs)aqdr81E6MP#M$Tt&!oQp}@hixY&T}=K-!p?axhInZk1FIm0g<_Xk{15e z$iJ8Lc&di;2j-+?T@8yfj9_DYR8*55t7=&MWK25Dt6}km@yOv^i{l_KK)Nj;r@R53 zUkM#gOkS$t{E#_mVyeQwV@Zd5HJpzyCvB|N`1b^C!yRz^r>Jm1wpW67n;iXjB8gE| z;otqFjinm@P9=R*RRGQE*lPT{mn5jF@b73+<6n*Zr%8#i8t-FNWRI4yfs3kOfkaV@f3jsD zfkah{f4UhUmh)Q;=i|&tjG_wf|AX8DniyeK0F7jS^wj{hZ6~^F{QH%(@vlbywIoAZ zjep0IKqCK-+WtER+M4t>>7uAc(OHS3s_*Y7F^Xz{+F_~+;6ZhbqH~f*L;w9d+WPN* zQlqKH`)^5!yc*yI;|gGtdBIfTKaKnl72c$Yu^Rslfdl0vI0TO+O)S;;ckZa{`v*sL z-(O6+D60Xg=)u0003DZd6130rThc8IOqvKXAJo3n$bSnq z_bk{02f#7&A_=7ESQ0pBB)}5Kj*7m2aa8yH^(01Bjel=JzPk{yPSW zK$vSlQ78b3O-SN}1)S}BXhISI$1FHJ{(~I+4VtLHu?$XR&~Sr9_(yPBLkV24D~=rf z`tR(~+Wfze5D-Y(=&JGWH#kU-Bu)IQk^cm&>=-1f(H#rQ3?Ns6!u2gA+$A7!ECLH& zNUA63SY%g%9S)jw0jE)LN{|Fc?;-H{P@n}mAXh_NECF`$f3S<8i2&kOa8dwgL{M^t zq)1Sr1-TWTTp_^!*08~=u zr>Jm&4Lbt~AOUc;x(jypU+~!u;Ip)C{~ZGR5t=N}U9YO}{y&=QF+v(tcu9bh!CSC} zM7bW8ej%=hq}_v{3|8->!g;h6H1`flj1otW{`-^k@UKSx5pYl+1bYzbSg>v9KqVc$ z)9}&1{|+DhoBtS;9*+J6&5(lv0g{R#h4CwJIRM%y0V6nT^HQo_$0(b*1 zyg)5ijiS>M;C%e+C@2wt!uSy^DS*mX^rQfF?sb|cWKh9>1e6r=LsU4x&OHT7!l0_{ z2PE-=jy(gp8>AYV9?)G(uf%(_4s^mjXrFZJzXM0V{yPnEE~JR~4NeH4{hr{2Fu-Lm zs3qp3!VivTP{$5b0Ya-wPzn4KoXHM=n>Z(6Sq+pJ1}^P_&o=_i+Z_G-?+Dl#ryvC; zB=Pq!%HAwsqq@4qHZ6a{fW zC(-=|x0yl5m7M~&b8aVnRMh}2;#Pl@C1$UGVnreWKqEP+!9nz=~f%exvx`I1u zpr+=3a2h=fcHwKV%TFF%`|oqo#8eGXmrl`E@Z4L49| zz^Wop)BN_)zn~H0TyRGfr0a3gLRnDQYy<_q2)G`&19s4nqrLwQfK`La+CxbnOEo~# zLXD*w|Gp(9vTD4)pY$fJ_FB37kz*^ws$H7Syi(_d4mK zr~-H?BPgPh7W#tR!srV!AFKm36QGd~Dtr}172tXxX$&NCJZYk=LeUw?qjjKr5Lg)) zk{nqT{(+_o6u>hW3hzO)3<{u#zR0Qo949|9K_X|8 zCW}8gk%zuXbK7%aCCxp2g8E!OwvSC1@K~0P+uMD zzN27=oe=#75-fVyB9PCqyd`3dguxo zQ(5Q=R_m(p?{pH_-vUXExf=gK( zXs`k7XHYgh4jSzHcLL;vq>o^?f{l=XB#0!4wuin7?>{7ctknQ*?cP|b0Xl+YVXekL z(4nz!lRn0R91jYXmypaUlC&{Y0km#+VXDHvyGb8YVLrJGO`u1=f7ytkJbl&vn4gt*q{9@s6+AfAX3!qU0zWFI^ z1wZ7%C+O`_OTfFY968>&bSzP6US4@#PSP=piUWcJFe22A}R6 z6_2Ao>ml<9M}OAO0k1GW`m?@A#R0O-Yl;d38v}z&cZrJ2OVB2Uvy$qM2`N`N`wy+Hge|Nem{ zYyNw7o=N)jSEJ_O(Z5$(z&Cg$eX7$ibx|=p`nUK3XsjQ^G4kwoW$^6w?%3|F-{NW{MFbn9ea`I^tNBpJHT?^r)7j=J?T{Nq>(1%zBa}n97iJ z5JYC3JX)A^_2|c}qe+di3`uW5WY(7?#as^1G*T`{*2$wk>wQ!Tk{ERvlFlYI>N0?K zm!xteJxW@b%8_*`DNq%pD^Qgo>q*kVqZ~OWk{rkOVsRC`Uyv33TYhk0i&V9Jv>g zK8A9DCN~e><;Xplq_~zN_b)iiYgC+)6#sJM9s`{$0jgvt&Sl6s2=YXJjtYB{;#G#6 z*GUg!CH~naE#YTKx_Fl%=W7z%Jh35GJfKb%yU%kbVu#VYBdEeEJ-xoFB!bW-G~;`{4Kg1j96 zZh>7Dq9T`cQJ16Wlt_{xE62YFNsXnTP?=cD@$bYDN5y|PjyOvGdzf^vl;Pj0qYK|( zIyw{7oGE1h7nvNOSy=FyPZCLmt_<&URO}$Wmq=Qe%K<7|Q#t-!O1db@QFK=1=*55k zlLA9Q=gkD>GQ2-|bmG60M>XGHhd56%3G6({qaWWtfjCI=sN%mHAUEdUND`Fg`1cfY zeuhNS!%~KS=fD!6H7gwd&Vbx`6BMfdj)PqL=;+RWCyy?C|KzCP`xi%NzQ1(zBgnO} z9H8m~>=sGr*&GnZ3LL%p??2dwXOF)8cL02L(50h>??EdJ7~bDLs`>sx63E2|Anp=@ zxKsq zY@frDEhuB1Oaf&rNJ4?)RQy1p3To=nBk6)%EeVNxNm$Yax%vjE_{{$ScDsv;0NBk>!6AJV z;&KUaCO&_(6PgOZY3(gqI-p;&1-bb)IGa6#qybQegW(?}WWj~j4Oki&pmYk!Oz;zr zKn2!$a0)#Qj&GRj=$t|s|8nHNg65-#e>w7>9hC$xAmjkeGJ|pvr0@sTT%g=^3hY)y zT*F-piD~K0IJR*_10N%l7%FL0ZOtU2i^e} zPgg)mAm0U4%gTb9Q{dJSxY3phUG>q}IGU`YU) zaKSAt(Aj9`K`CW`+W{aa+)q0Amm~lA(aQQ7l>$UUfTY&b-~c@j&Ts!gss}L5f~>!n z1S-mog2NQvdIc3=r@#({#QXrJSXhM$YF~vwD^z$R03;ZrA_q>fry*@YZ~}h~@)_0A zYv#WX(DwGm_s79av)e};Ip3dxHn>0Pa)1W#AYB7kTVSFp$G?L|CI8)n)%u8f>)cVx ze-A*X?fpBNbWoM!-z#v7;3T*X5PW|l>7yvaXFy~?}2WYev)RTLg^idVu zcY7$x@$UfmI6qKp{nAlI&@%X1hW9VP&DD>tp#DtK#a!^gub>7lXhAHfdvU~(@%_Q1 zi?!hX7AOQk1wN?ra^xuIzb8qJp$woAC2+0+Rb8jSN%i(o$@iy@TK@ZiM5p>QDID$acbc%{p(n4LB9iV|T zhW96r929*25u!yPDX^5`-`S%Z!OQ(YA#}77wsZVoD8s*ZV7Ec_L4zu>mH{-a)7$h3tc(>fgHmCUg^bAbWY@GW&RxSeutwA|6Mu? zQvUKiXiq!GzspGzb-@P@gUq`M&WX?(YRha?dZdQPmbP1 z#4yxhM;k#)<3UF>g9g2!2O=XK$q7Dv6YNG<==w5%rok9}K{kWWb_OjWV|f1z?4~o2 zaC`$g*z@0QPyzD(($UU;pk;LoplKR#r3+1>s4kKOAF2BQe8ApGFgry>2z& z`$_=h+kc0X8dE{NvyZi)L;yPO`F_$zP*M;{f}XVuIyv|OI51CxPG^4q7UXDH>I4;P zCqX$Fv|S^X0W>yU$^ahADFykXF_z;!C_Q}vw?NNIByG&)`1b%Dt%C=3#B8+JD=VqDhaF%46hwf?z_)#0gE2}SI_RlT%(fU*?HHq`6!1+^Kk{p zu=)Q}K8WGomR``|Mx7xl7CxP?eYm?C ze~hIZAR*AGM2Cxtf=}l|pUzi~8ytK)e}ayP?_Bl&zi0DNhu2E{@(eDWAJEmj$bc&F z_MoR0A?J?Dewtk6`Oc>VwXS`@<&TYgB;!gYfJ7bSg$JBB%iI)*^Q zIK#8^G$??7Fn~`PgdBYZzV`uiCKhNe1$0)H3;(tyDxgEOe7g6jfDYH*aM?+8(e_vj2!NpS4EMN-1<)#3Pm6dD;RD9JhulB_xJg5tsxZ>r`z3W*Ar z&dZ>3Dgk_xLwu=Hud74rH-68fuxRQ0`kD__P3MbtRvlkKhRzq?FRVx?)dGd8hf7C} ziUaski;fr-1DB2z&}9}i;Kcvp``Z8iU(N;j{M%81Qe%g2M_Ec;9ljl9EKMV*_cY`G z|F2U(bCAtPGQe>RElOTqtboKbUaM<@{{MfiO3;?2;*fNJV#8s6c}VV&wetbxp5GuJ z@VBl4l@SLFPx`bU=3nH~e%P_|0JI?TX+I4TIqlea3cVzf;c)za*zx-za8Z;5jx*2B zgW#el#PQ%ONyp|#9Il*~9h-l!*EoaX&6D#Yv^0X*4c=_Vd%eu3VpW!gSd<$q+kbz%=HPefq zfnU&3fM0{x56tA`7xYx%7j!f@)(9$a82G~v@C!OR@C!Ny@C!O7@C!N?@C!OtALf^L zVCZ(@aOrlE`OKg1#N*K|l;**ocgmwvu+xzvjsKb>Pa1#0g?DNEb%7#jj{JES_>W!q z!hh_d6Te`fM5m($zo4UzOQ)j^b_=SGHFhyDFbF_hahM-;9%op%N8=mNk)QmUTT~8! zjsopG$FIS<)RUiqUlVjLqXus$nC+wDz_00}k^mAd;1B->QV*_(G`B#CQOzyj8;(KZ zpc4uC1-Gc|Vqjo6)}nHXfq_BcSPM9(GkEmYs5p3Z{(LbBd|srBih|=#1#q4J)9})Z zxsnVF-7YE`-99Qdpj@W_3V=f%onoDC9Gz|&pZW8BRCLn#ula#O;vy&{!bH;e^Dgoq zyZD9w*aatk!7vGaK|h^NKO26*G6#OavH*U;vIKs?vI2g=vZ`Zkpb&64)&_|O4XBqJ zkAOlTKJIYZ1Wj{Gg9 z>~l}eFZy@*ST%rQ1e0+M{FhYQb2^0pPBOJkTAi&5k;3>eb*`pEwYW-?LE^hSb zouZP#$iU#pF95zovJxbXun=@J7r$nU$^j+@22h-M^!9++uAM(#{P_C+zf1QNFyE!S zN970;1A|NFg@Z3RI$KmgdkVoEfzB2c(7~2qjznjR$`()^3NB|mTU0<<(gnl;DO&@R z0Vx9=mg&+xN96?A)Ef{}LFa0^bly1l0;GHnDE)N1Ie2s)^tkxaV^=5?cqpC%9fJy5 zXabVbyy&sZ7z#W)Pk1U`@HqIA$wTp?OXnPwC7`nO;A;sG8`S#pVLa&3dCKG9D;5vN zQyx3{p}<4&qQ`DVDDdE4f3v$q0fleQl91ugI(?=!4rF#kZ zx?`8lhY&R-uANUE555&}?R@5V@SOz6Z&$#6y9tr6ap}By@FmEQ3fIp2jtAdMbnj8Q z0kY&LNI{PZC^dEd1S#oJ0hQ_?wnS%-3aGeq>26WE12zrpq8^ng;IKRhQ4K0qTp%v% zQRx8%+rifs{M-6K;{4k#T3+UFp2^6-(AlE$1*~lj_$W}9&Mhi`!2BGQ5SPvxl?azk z7nK+nP}9ey(?=!6qjL?o@bu~3qVfWCdT#F?6$d5;27Y-4kK|V#2cNR?Zv*FO9u|H9 zHhuv=a2iHVQv3ogrh)tdKBkHM0wJb_`~q`K8$mI`FBoUw$S)YC;K(oNC*a60$abtn zMT41v!NKD=WStSHR_ka{(PU;|Kr$P2#TqENf?NSgu0EYVA$i=@@Z<}R&;S2-w}4&P z>0%n#-J;?G3SAe|(C!u$4+t}|yG6wZ!i?>1Q309P>0+AL-J%i#5l!uGQHg*sGrL<< zVj#?1Xkh+3*?|I9c=P>6Pe!nPX}%H7Z) z?}kJ{HzY>*x19v1%15j&9aF?6g5som3M7klOc4XsSfG3e&Sf1_#3n=K!5OV%iWoR4 zbo7W#1&jAU@?1xc*fb~~ob5V##HK^};GEadBL>P3pnMI=BQ701Vl$!g;7r)jBQ^`l z2jxSM{A?&6tgoX-3?$ysA_l4_KlTEx~tc%a99gv2&zD>*oN{~!3wpU?K0Ki^LPR(OBrulE%A%wNyw(dp&@s4sDco{fJPLG^djW**Q9)_WjXtlQ6lKm40d?;7xB z!5+PkqB)H}-*#mKKLe;)av;rxzu5U|{HIQCWplw;3MrZ2sfO-y{Sos5&2ecD_UIFGAV}P#xXS+7LWw^Ab{k zyx@8dYJ)&3$bSc*H6=B2UMND+``Df02(eq4)1xOrVT8 z>3rnb`QgPYVMYdz<{yIm&7k2K&(32W%?JK^H2>h`Z`WXFU}!ka^4bbv9xMTPcE0dD z_<$8wE&Fu7da=-xlfk3c^{;2=JCEiceEiKX*%%l+d)@wdbRPG(_}-&8pV6cF2U{_Z ztKr+%{;>6foo_vxpZ+mCkj9^XoL`d}0_!N>A# z=^J0hx1jIQ|3AMx1GugDn19;|aJ$Y!^Sp=UeGh);-=J^?HL`pdLFoY0s&(?JWL+lkZA{g4M~6HP_t&ZoGA#I{1pCa|*cq2x1F#LMoZg9&n5G z;7d?z160d^ni3qHJ>aGsh%L|wsZ}~5)!e}spavYMZ0&9Vx8Fc&KIXYcbDnJa7VI?32NJT++52R@Z8o2C)R5h?xEVyarqml#S zgTet+)pYlOTW264P~#X>&w$vVRxGGs?etNp0r5e~LG_Hs4rsfR-$U`J#|~(_lhK2J z{R@wSZ!P$@fjf%)+fG=X_2`A%Va?yH3@UVB`OPQ!qvyeA1lwPZ`~og!fsXtFK4yuI z`~o3ng^v6JbIhP^uy{}#EF9DZ^9QxT*zvT%Pzz}Ruv6+=R6s-e;G_p?hk?3spmx}S zm*937NY1g-#SGLCV*&MJI$g{_Ein!#8`KozfwDnuF_57k^`OR>2vi)@8k2ysLCrB4 zC_5J#ME_27AcBg&=@}@q!)w0oDd1$?F$G-7bwkp9#}qzLdkWgT>X^a@YE5-d0e4|K zrtpDcu6qi&G1oDL57eUSo&wGW9aH!~?Wyi5;O14w6h2UEs(XqGC>L~0;RCgaK=;lv zFfepX;RCg#x~G6UA01QpK<%jRDd16xjwyVgR#f*C6;N*In8F95x*;jJV+tR*DHWm; z(lLb(+>{DYiRqZa2X0D*s6=#3;R9tVmyR{y>bpBcC8J{sAE+tS9io!bF@+D*n(7Ww zN$8lu2g->ZbNImRsSuTljwyWL_Ed;UNyijEPl!*H;H<{Wgx!>YLdY6s>m~NUIo>doi4_ptm*>lD7qMfa;gV}3CgHG5GE*}f(-0*F$QJR5Qr!! zmqtLCpiCMAVPfV{P;fMT0@dZ9RxT)?f<~oSLDf09BmviNpqTp1U*7}nE`XY-;QkOS z<@j_y@;La48`OF4yy$W9rRNS<9pa;S&_nZ-N9RT4*gFW1y;DfBht%yq@39l9^!*8m zy%Uz_VJVcqdDEBw|I;RTB;OpA@fY%hj`4TG@;pB{{$9@g{Qtji>l6N#+n`nqWDL-w z^#FehsC0uiv5xy#KKJBz{sS9212^h^ym(}XIcn&^_}5eO4}S~j>J|??BZiA~y@L)pg2ulg{R8k|254vwluy8xfaY^w zynh7h8h~v9r9;p#rAPBo2hZjspgsrE_#v~a;S>IC2k-~LLt9P;2L|wT;a~s3^WZyJDdcE*jKA50 zk%0l!k^qh3c=XNzmjx*0txxg~&x6kimQSGeggLl9VGeFjn1kCB=Abf)UohT)Uoc#O zU(jEGUy%5=1gJOxm&~9t2p;aR@~Pw@JbgQMx|qWXC=eS~LV?(@A_~NYl~EuztdIh+ zVWkv^4J)QVY|L`%04U6wUV<7EprLwDCtU+F*zN*q?LS}vO)_dgM&w;U)emTp-lOq| z1je21@cPWR^Pp$v1;a}(jX^b&JVRJ`ut(z?@ZD$d36Sd^o##9{FTQAa!_C02!8+3b zF&9z`W>ar2BnC7W0?I?4od;etJpcdSrx$5P4kXi5Z>JQ4k2 zwD}QG8`2jvNnyqc8r?qU(|O#Z^Rj2>IT!wID<^<%qH2B1-?9lj)CieZfQ*K)xk88f z9r?Gd19jMa7!UHdo?v8P@N7Q%57N11b!a%t;>a(+<_HaU=wf8vqn$5A{JQrx-7u4hg&C_bQbkwLQc=YpwR}6HJ{!Zl?Z5J@#|GF@N7O( z2=)$AdgT{jQ33V4RKR26pgY62>co@DhB)-;A92qR)b_fAqHMX0qVtrI6j@f zUXxmLZHJ%rK-CH z+&MY;Qli60rMmNAhl@&0M~X`A!50D`F&CA(Zb;X?!$+mQ^I%5{r0Ksz1ys^Q6}6}| zfy#&$NEfI_rI`UVU(x{`iCv=7%D}(?SK0tgZ7c zb^5@jg8F+MOH@D|J&00J=J#wq@}Q$d1=Qc`=urW6^w9II;|2%EouCZu`Ts0`EC0X$ z|B-TzPj87zghRtw4xipV;9j3kXAN|X3^@Bh1{^^-=-O>!a?l1-a1JW*Man%0Bf-ng zK+~Kc16yxn%`Lw`xg`^13_Q2&^JqK*Dn*f(ZXn$k&JUd;6!bLU7j#sB&fVjf;6I!; z!DGk2JG*9-g%}BVbb^*3uxe+4RwFPThK@hN*OMuDbe`*Gbn4|{Xngqp|9|;TKG)8J zjt5`LS{`%}^kebpyx#o4zC?N#D7R}Ka_Ky(d9_#^+JuyF?L6>0(WUcf^IwNz^Vhx} zy>Swq2Vjzpo!2}%fBANPcu{Y{$>78I-J|oPN9Qfa9U!A#STis%H2-xdl5p&N;n@7( z09f+Z3l-30S?6(3nb&*_BnJ`qXg;C<4w<-@MkbsL81wU>F&~f4%P!rK94_5~JTBdy z0-$0vp}SBd4ZOa=r!z!F0yLfG zW9{ya2M_Rco^oV7;bM5pMe&eJcd&$u;VoCji=YWc7pGnuuEyiSZU!q39v5_BJnqtY z$nccnFT+#a&N7`YDh`f}haDL&J2oC>oa*)$+o9Sz^RDt>n~eBbSC z!Fb$}@xNo^@jmCuWsV1r3%W9XckTS*Xn4j|@sFe7neJd4#;cBv z*y4HcsF(}LJ#SnM|F|lCVfIl`a5enn!uYW9V3Mlbw}S^+K~6d2X!r(f$QxJ2Yp#sX z92<{0Y<4){c<>mfBjY)UC60=3KvprHcV&F;*myiJDo)Mu;Bh{%BmTG=esNSh_Jb_%j!_YCVY~}=#EIXRpJO_L*++#1?0{!yA1b0cpz~0ti;9jT<1tWpfP>*0 zyZK=ZXBeJwVXje$fCNN4@6|6@9TK9#b_!ks7pj6T2qt%Pzmd>ZH zhF`&v^0M)uljX1f2M@9^zI0{01`cabT4?-M*zS1n7&kmEfYvk^z6Aw>h%4iJ$HwDI ziF0!u4;~kAW&F-~73`&_jYoMbp8h>}R2-28z&3%BAh>LEd9`l|)T(=Mt5%-B=Z(cG zN5c zTp7POHXiwtguVvGbj);WJQ517+jJW0n`L+;lv6jK!7l zonz+@N5(%cpdf$Rc=YMa+s_Uj<#u8G+WFGO@S|hr8CSzM-8CvUj*R~yG5Vuskvzy+ zN5=P#j9*<0e}V%qHEhihN5*Rh4~n}m{&eho~fQbZk6$F}9`E@!&yG zN5+dT%%I%WdGPy17tWI)?H3yl`q!<w6}L!9r*dDGGG zqI0haW8*Q?PgZ-uL4FV9`T$3$|311J-gE`m$h$9H*K#~~ke@k3g~he=7RddKA6+?5 zfkXdNbT7j!G&7j#SD7jz5Y7j$#r7j!e=7j#qL7jzTg z7i9A|4xWAj`3TWu1g%frp~TF;q~1Nhd&zOCaK48h_HEH2$1}Y5e)TH{$p~(;=b{ z;`kXp^XE&Z@fSS)n#TX-W*UFN?H6hMUmm9M7d&~9#-DU2jsM?`H2(a>+cvv1RTAs#VZ~|l~YZutIf(vic_`mS> zLO3_yrtv3TPU9~)@FI=B;3P=r!8HEYhd`R%rSbnek;Y$eFf@(--@!CT{<;H>j2D_8 z@q0A?VkuUAc?;A%Z9K3sJxuK7CeW}4;{`_u7o>o{3ABjUqu1$=Be;9O6-3*&)<2LxR*9a%uU%mW}jj*JH!4;~P7gz#K49XUX9P|-|B9uUtJ zDhbvO3Mvf13!WYvv`8_gxte zIUYR3?V5RLW2N~#&;JK~EKii)^I<&c(Rsl~^8_e3iiKW+`nn#S7eGAzCQvsV6bA6| zMHl{UJc6#7Cn4q?bUb*F+conb$UGPRZ9amGxTTnIOEF`W@@PK9;$eBAw8y3Mz`+;% zE`|p(4}elGXyTvO@L=XiPzZr$y9EqSz}KhmG+65tmAErtkG;1~21;1^^(oCcfk2Iojd@bY#+M}^)dP>$(zB6;ch>-yN4;(zJS-3Mx7ULPN&Gpw!+Bh~-345_{Y60g(K3ZWA?FCHqYv>q zW}X5il}>*Sm&{-mh{PqwgCL1ZV2N-Zm&{-ekOU;L@2Jl{YEi^2P;H;J}L!aDjtTj6g~dBFh_yVt8@05S+^IFfcH9c3$uV z6*sQn;s!AuiCo?|LdqLQczNRsEpI$KFZiOAH=ab5H;#Lp3{(qv?)zD3J`a>oz%@5$*2Z&p`>EHhpzPqWFL~XjLm*dpH2+fIZ;}NS36R?S zp~v29TMw*#r~WFzhw-R?uMUUjo=Q`ZD!;Z9iN1_S;N_W5x1}%t`k$VR?>!G5m-p%X z>&d_VwNG~;hcEy7kG_oWJP#g|_wD@Z(H$w^$-n-l5948vgNNmP`PaYp?7ZR2zy7dC zccp|U|N5VxF~Nh! z@r}ohl{uCCjM1O(`S7p*0kYedfBkP?!{;E%lkq!b^6(hQrq8~H|9tt^fA-*Ce* zC*wCy{`I$g3_pV?4@Qv04-b&t{Of;v7~b~;QHn@ZvqXtdh|y9_;#41RNtqY(U*VyLC=E+K=y*#9vq&AKRgc}kOukGlktN` z=Pi)_=HDE}Vy}}untyW?#ey3E@cih}&FIO${-DRf1M;4r&@uesaqxgNn92CTqq~v= z6jlhw9tTz09tV$uRQ&c}{0_}Y?B&}%JAZ(xiRRxd#ate(w@Y4$wlrPVV z@-+P5dGG)?$VC2aC5%j-{OjQs!4xw4@~=l$2wK|-vU{0N=K+s{FBE+Y4}kmxo+f)K z>tT4%lYjj=&?1?GFBCisPoQ-m7T|VIDE0aBBk=m%quVLKqth{fU%&~p;miTK zeir~OdWL3;JR!FEK_-aCcqszJa)jcEJQ%Sqcc##V+Sm! zK?D^H55U_W;QSsE7LI5WOhIlF_%JedJ9p8H_7 zd+vvq382*vpveixJ)i}xjyu34ygdLi>BVzdP6m%|cMVVe^~XGz-8rDC^|(i;JBLTN zy8%>O07+cHqubpADlUN}F5%Jb?f?~6KoVDQ(N6d9VSIet-2)tOz0L|AmLK@rL9-_w zy>1VDy8StPy2Ay0y4@u_y8RVk?JJLNVNd?`*L)aHc^o_h%0kyYI>R}9y1hXK(m7wo zi=GD$f->iMpH6=PpYC7*U;g#id>IdU9y|mRzV6c*F5%PdEaA(){+K7@2~S8?KJL@$ zuHeypSiz_Bpl{~|-_BE@k#EbxWfPEE1fZY+HLy;~fLa6|pgeX&1Jojj0qsl&H33~1 z7!dJ?i1}Txu=m^vD~~;QzzT4mZb46Q;S6p!cSmw~cHZ{92r4!OJUjn+9z4eG%XrVD zyHLWj^SkH4<2*jykqW+@cR+=uFXJCy#xJm9&x3#cEg!?jV2bgy2mg9-ndia3{+Ea0 zeK5tp{)5NCWAZ+X=RNq>fATQ=2cmo!&-w7Lzu|fCu)Gid`dglcpFxx_f5DgWlt=UNKR%t;JX-(rw}2+cLCyq~i8ii=x8e1l z6aO|DNl#GCV))tP;9+i$&U+wVdHz4_Yk8~mp=akWU(H)Sj5j@+|FaZxzs~XO`~_kb zCA%8l2Cdg|;@@Ti(*MK5@Vm#s;~>xea^l}sA_*#GKY-%k;4zTkCnx@GHIkqb5kn=j zCn$6c|AES5u-(mvSwNOA0gXN!e5vSR_z@h0;O%0v9)_np`PW|r^}xU-;srzs1-ZwA z|C9%)#ev9Aj2@sC2aNC8dD)}+mq59#XY+4P{-!se6$d+ZS~|U|E^bQqF=q7GVHGru z(|S+XdM{%a$seAKhdsYP@Z>+?%Xrws@Q@GVt(V0hEsejygA(nXAkI!$`uF8uf7-M8 zw<3QNXmz7!^KVD~CeQ*<&*tBWMLwWLv_TsGd)60z;0+{opzisBcWEB{bq74YKk_g< zrkRlBeMzU&d1q<1TUElV&Vgk$^slJ5hgN%lttoDhGO6ckV<=~N>E1u9xxBV;eH7c;i?{n7d*fj zU}Ach7$jMo@Bk--6Nfz;e}m@t%Y}S;Sy_1b8GJf#f!1=&d=6Tga_i+qP_rCVnMXQx zyGZ`&=JYuDP{D)qpvR6ySKk~h*=Tj#!|(*S-aTmO(Rs+@;2{YQ!&4rHhdg$u-k%|t zDzj<62mksD9-S9G4!%?d?rkiAHy3S@MbT z@H2RJo}OU%4Yj@I$S*PHvjZao!)I6ie3{Q6GUc-Xh|2k_0HS<88+>--&o>bRku_oh zpcJ1XrU2rFh#920^1uI_=Ez_0?Q5DN|CeuRuKWeJ{n8xyuiQ@Kzj6;G{Rbrd9W4DF zBz*@geL0Q)%C$5{{`XJQ_zS*(y1HLL>YnJc4vFjsMC8Xi6(M=m&BY?=Me&29V26f?akp4YV!Hk-y*rSeEq- zNEVa?9r+6mfK?nwv<=x7)+O*Em4J*VseD$5_zM*hlh*Pv;5G?~gqBPx&&Q z1~md9^?MVjOoP?$pxxS@@b;}Q|N6_2`W>`i22#I+_F#bP_W)20YVg^SKi?xEjsN`# z5X+$e6e_4;2d?KYfs(!txSl@&Q*sa-aED+`flDCs6hNkUfcCRO%nN`iMveG6Ah<()z!0?41YFG@0@d_HRr9Y~Ja)l)ogO=2O>t1g@9x6CjnlXDmgmJ+ zpiw?()$e)mp@1i}>UZoeU~x1y@Z~)13vK~GJ0qaOdk(&o^)bBpQu6=*|DN3*4xYvy z7N9c}4!%(IG&}*y$3C5)<>sV4SXPN0~ZwsaBILIjlaG`MFEs zzr-8^aJ2E~>ll3I&o40$0M)ua1`40~^HU5UO^6$ycni4!X+qop$D7LyP!r-WY7^ow zC~V1WLV)AtWg7pLSD?!J2q+>EO^7ETgCC^vUwP>H|8N?A{*g5P{IhBN`QR3WkL4}? zR$WjF0#r^59sm`BF@hIBO(7S-2Oyq{;0KTod^mQ3s1S~mAS#CACMX?-aJ&RrcoLMX z9)3-8g-j}+1h-W|?a}ifS#Trg7dZX>0#*4S=iG<2b3tjN;4@ef+#>z~lKq#)f8}o) z|9epN{|b~eUqM?jSFWbb36L4kr5Y!6j1howfix0Ot3zm0!-KyL)Ji!G)`rr=ps;CCqM`t5TY%aV zF5vcr54b%M0&Y*lfZG$0648ZU15!wWTNt1g1-OL)S}E<(cm!0oB1Rez8GVdH41f4^UVw}&_%L4cVLS%v zW-@+yxfnEq0qr-m?*g?%;EfL-{`J>9n*S;CH>rRWHUD$uZvq|urURRC{6*Zb1^*OxuYxa zf%n-hk%qpECwz=u3=eoRUh@3@0MbtJ*wJwzwOcw^Z!uWCqlU*W8;zjd6Av?-hM21W zZVq1dG(7CF!$R`C+sb=uZh)1#7~b&MRhZ&2eG%_ZKd{;m!waBh7N~g%>HFXE*wGYq zq4v!GB1NzkM+uKzrz@ZNojLHd0<0rY0Lk#1Ivq~RW zZHVCm4AW~E8+E=bu9X36apdsWwc}rorScN*ePA7eNQM_VELpOBbGkf8<*s{Ia$h!2 zn0_0q%Ej=9hjEDE2Z-U|!H8Rg2P5JRdo=z7m2Tw%KE14EfA|3$Rp66v z=ZUzNjF4z#Davr^Ji&j$*n0ZYrpqxD;fgA4yQM$gVqu$Bw|HXpwKo(CU*8!iW*aX9V<4ORFu-t^%- z=EHf-gY%q^;W@Pn5_4{WTL$j@`7*aaHD<~!a0?*k7PtlAa|=8^R3ZZ& z5~`6g0M)c9G7g}6H$)}?)b;{bhxBgMH6P~ig!VF9%^?FsL!ns*9wIsfA0o=dK177t z$a{rjhzQg^M;RZ|!7@ISasnJ3*iCBW(*HF{#_CH0 zH^9>l2cfMykS`9udnp7u{Ss21fC>qFGf+{PFX|4VdHo?YYq%M>knrghmHo;GT6(FQ z3X!p`1<|1Kn`VMWwQ$FEiCYiCmVd`Lmf}XRbJp7PaZ_Y z1-9{I7eP=qy8s$0W<77r&j9Y`f(Mszj3@6h21h*Rc=7>1P@j->6-eF@yn5J?AGC50 z)V{fL7SwZn30A>71FGU6xN~?gjsFT{-~m3K3@RQ#W6Jd)h0vbbZE${u76i~Dfd9Q{ z4pa#!%Oj5`gN7w}(1Zt6Yf|`){Mg~D6 z#E=cXdsIM8Ko?MR1T-V-0y-NE)J_B+763Yv#szd(4d{>>7k&*$0~6d01f7Kd?goMu znt;23pq8me;}K9(6|_JS-u?g$H#hzQ*-{<|y0BKmv-!6`xgTWkSrXI}+y$Fm_GLWf z37=i|)jRTY0f*$a}7>~|C4y1X2&OiZ=U9h9lKci_|MDS%j3@EKtiB!8-v*s~`P!a11FvJiN$zzCPUGPj zgs|}_$vy5R!Q>7(g9cvTf?WbmG5bJK3yS)!py|HGA043MHkv@^=;6x>V3+!I3L++T zeL4dtJ z8>mQh!)cPn4IigQ*&JP{#BF-at4+A84 z8bn+I5jQ~uXoU=D;YTreCJeMl%8~y)XhQ5Dc%BP9A$9<^X69fTe?92z-u%mH{Keoo zwh$EsP`@11cRvNz0G?_CAMy*DlslE?$e({JjUO^~cMqf#v~cAzSSe_Z2DF<9vb+a0 zor754^BklUw3F}-SSiSrUv9t`4f$vu@I3f{&6n|rPv=k2b`i@9{7s-{DR|gZ?EnA& zzMT(U4KF$JOUwihm$~xi3xei9Bf;~Zh2Z&5Pw?Q1%0lY<6!yYAo<&1c~Gcc0eS8HGtjyt&_Kiy zknA7iRux5ci0$ z}^Yw8C9>?22NfFd)04HJ4SQKb=Qs+;@OW^hZzXaqI zHqi8yi3*6UQ2_^uiwZa~rKlKyx?nsPL1f59@U&yhMbNY(C`?@V--A|y6(FYMz$=iB zfz~G-0d>EwgZ%Uf?59s@{009(gD>Y{>&HN0f-xlr9^y&kfBz^^?ZM-Q^=xUVe)eQM=+g<#fj*4ikGFwx5Xk?Yo%cL7|9Lk415G^e_v~Q? zO-20h_(Si@%ESJ>EayEsPx)w`@~}KqCg|IF929=7pwszZx`WDr z?mkdnbmkXe;RlWRf~R0z_(6*ZK_TbNpC7`n0Ghds;RoeLy)^#(GEk1JQvl^LH;|a> zdKG?#m(M|CRPgdW%@uSYwhMp$b&#@qAmS-Fmecr)!4u9dDh8m80GfAx0b0R!B#r;e zn>7C7ub|BJB8|UZ52XAsLOD1$9!}#g_yAM>C5^xM8%X&FkkUgirH4S~g4X2zfGPZw z#$Ws$r0@qw;X#zkp_fL96Io_^%xB(7XV;&Xb3X@jgRFe)cgpF_j+)=*SjHSNLRy?pfuI;1C#>z^W{L* z0w{_2f$9b~15gY97r(?TaB;<-Z}gczzY3iFoItrR$pBP(@tg;dA?Lw4Hs(Ay$L5>| zEo;S^FG0oal{>idB_!v$^1sKLFCn=WTfRI3T7l>B|DZ?nAqP-gx4J{}rCb_+eHbW1 zfII~9I%o;cLpBe_^N1Y!nLpnhG)C-y;WK}JIB0-4{=;Yf`gtEfOJ4cwr#*nseHS2f z+W}BJSM#@L=RJ?!KBU@LOZ!Gj*41|)dU1JvdK4|;&EX7gw~0;(>N=DtzpW5Def@cnO~a}+^CDxg-# z9u?3i3y8G^a-ggWe?8{N88^0!GksrS% zWYwQ1sOhp1)IWo^U_2l#7!Q8eA0CbWK7t#8-k`v8<B@Q?6YPULY(kL@<>;|_e zK-UfNH-WAX=nejV@D-aUq-Eg=2~*#0aHZi3Y0dcc@*MZ=yzHxa*wgYde_Ie}P^a?* zI4_5@Fff4kz{ATgM}CPJ-~{W)pU(iQO+3KX2Y{`Q02h)v7eVqRdtCw7CEzteufVw(v`hoC_~S$x|CO_#6nzU+)4T@D zzE0yWxCE+cKq>kvWW{j-bmb9v{WECkGyj#l;7auXsMGQ}jX(bvsIUbUYxyU@S=bO% zrM834L~Py%>I^XOw}5Vo@a=8`wQ@ZhkAae(59n;KPoNPuP`?GXBojR122EJ72-Sc^ zu?8g8!HEwvOb1SUpr#5q@qr8lCq7UL@@PB)N>Y%-2fiTlW%s@R|2=!Bff738%tKGj zJHEZ^K-zpXAAwE;bnt;3c*yvIgTbqpN5!N0po0(SrmPz;-aY4FfJXJp<4g<;zK}`` z)UrVFk7wr(I(o_D>i_@z0xay1YLq|Ug&kCAfND|x{1A3fVHX2#(W=(Vf+jUiynF~s zK+Rduc@)La z+7((|g041!D@U%}K&BH{Wr9~wLySF~23l^7wF>spyybcDF`F;r4Np+CT?Qq+rqAG$ zLvQo9$buWL$6O8nL)+_){1WrP`OB3*UksGJB%nxByR@+YLe z{E4f+bmhPD5MO=i%75hsNS;uA>B9g1Ehq=V+OPZt;05LH()h2u@ce%qbb(14e?BOC z=Klgk(_s*C#@F&Uf2#&4qq+S9Hw!?;O6$ts;0*)!(m>51M^J;vkw5>SPp^%nXY+B; z%^_&n6;#gfgNS%=VUrFH4A6~j`8n)A!R=OdP7oEtE(w~^W7kaMe-BztR)8pLAce_E zP`mXEs5AlfJqi$I4P>DsXfgX;knA0hPZ4DexOMtG4b%z1wv_Bz8vm869`M-&&}O>N z{Q3Eym1HkLCo(`5lJV!qgJvJ^fNDhWGBVJtQ~Sh8RP0Ly^D9 z3N$d-{KJvI={baz$lt^WF1n)(JiDtb5DVWt41XXkdNaHQS@7n`c+tB%gz12HcMQ`B zk6spGPs4+VMQ|R5H#~O3*1vfeUiSF@*oX1Hhv9V(!{gu`^PbH=SRm`{9J`sEyM37c zc))gzt(kJt*F^cl5tM-T>g8z!Eqd(baYFL?!I#XiMdvS+!Rl4-!*`UO01adxd;!`( z=F!OpSyK)T%R}%@5(hmx{WxAO1GPOGe}F1W{`TXb0WjFTJwCm>g4aNUX&*sXDYtE6 zV0c-{#K2(q|K$SE4hYcNr}dzNe)zXBfmV`VeCf!)jfcybe_MzEba&cA(5arD2On^F zavt#HJmJZC0X!YxV|c)k|Agbg1H351{0AYiFAI--&^|R#6nl1F^gQ@d!PD@fPbZ&a z+DATNgch9Zr)W(QT!5f{(;*oF8uj2|3H;+%0F-?Hs_xLi0AVUJmzL14<2)qhm5(&gU8%Lcr^Y87tXDg;NC3S_QfYcpztDUxyen4QhF>mIpooJ46-)u6n|?Wcx~E2 z$Hs?{?TbGl8xT;pFTMp8qR{P&FWEd8FL)k&$n0teitvLM_!uUD)~8(nM<8hbB6#Og z$py&%#S4)Aix6*X{fnRt z=1kz-2R=;T-3LBQ4?u~}g$c2PF-#B~yEs;yctB(^SDZk1Fj|1*9r+8e?_ksd$>P|- z2%ldC?Pviv{hoR30x!iba#-SF_zBeRyYI0Byr%o!m0VCs3|dWo(U*Vy1@L;Zi)s7? zx4;^2d+Y+QBX5ej;9+<;u?xJK{DJ8N zAH!cDkux4Uz>Cv&aJcyxJ^kU)_2xp7kE8<$AwfM!&e|D9`)D( zUa4-Q5#(X`0#c!X%6j<9703)GsFDYtj04(i{z?H0*q6>jE6jST`)Z7dfKXgs*m9-j~(s{|MdUZ zaj^=?D@eQX(LE5z;n8`5pW+>zpo#(QtQ$~i1U`QROM7@XXbuqE9ySA&>)nnTp2m&} zp52}np2nUAkoK`L6KJghJc)s#^WXzBPtf^>;3lyz;~^i$3v_P?Z$NGce*+aqNDbk` zKK$!%LK?!LQF~8tLwFC!i_Je0`I}5Z?ZNIU1JCX#3(xMr3=hLwp52ZKkhB5bz;W5T z+XdA44PiRr(`&-yYxvpIIIzOg*s%bVEE#`;+PsE`U%rDF$->_RzE1@`Z0NoOT`J}YYu19U?*QGS06Mpa!2{AT+_s#7;bk|dJ$w7*MOb?lwA9HF z-kyatWe+|O05@z8K9q1g_<+Na^8o0$T+RzFod@|(9z4kF*d55?*zL&UXe{Vx?8sqw z!o~0qO1t(Vr1v8032IEimKlK7zkx1}Irvh+*YKcEC!YuCh%3-&F8G8d$TkPiY8X%h z=q0EX3%airlwLunz$-vK@etIyJ;n%bl!MM*_3U=^@a*=C@HBRGfV8F+K}7((rv+(E zU+_Hm0-I|Nc^-VF;A?ou)7Ue>r&A2lHiK>!J>UaAOG*~BV}yS_dMCmeP4-9-wX z-BlW%-GLq+hQBZ-= zHw4n=_3f2m@-+?wr$&%L;8RmPU~cj1WdWV>a}&|R_26HB9=(No3w&o8XfrKUTez_C zsc^?Ir1mXn+Zd=VOXV%OKHYo3SL=E9)+2At_3e$ozcu$A2dG}p7ySmIdH+FZRyIz4 zhL`^sLD$OPFua7cHP;fcHP;fcHP;ejYpx}DYi>WpIML}4ns+{gW?jw!-^Rb}wK2$&>d?}Fm*c=t`9JP-Mc#zNJC8)hs^AbGBm+}(a z-U@k%XfV@zJIDW{p3O%bd@SGd!`jP3VK)cTCf#D(n{>g8sGys4eHbse8s0|47b*L5 zZ-SyMod9wTG}#IoUq)UFa1u0sa}GAS1KM0&@B*wAG%R`mBzY9PI~;x(CZx&i$zS)x zvpZ1O$M6xT1q*5paQhg7me_i9UiSr`^L5;Z5p){KEpX%Yu4i|kGN{?=$zONbv)fS` zbRg09N1*j`hKC_dV-NnitDfC~#vYKy?K#hGM{N&i1Nxe$;W1Cfd!CH{AkAS9{<_ni z-GR=aCbtKF-Eq%uM{9U%#E0<{(lS}_A}df6*aKWe9r8E`ZvuCoL)6Kh{OeEn8>d+A z_4t0#-#El_s}E@7>=Vz<3;xDAmS_EqV=Rw)8XoZJyy5x%Dd@BU#uJ`~hrEq*Ebn?7 zmsnl}4Mcz>;0^b~-o`POZ@rCcET4LG{_yzz7*gROxeR>n64YggV@eKscKUJnbbbI$ zu2OGHacq2?Bg%R3p!x%LKB8ymCHROhxWxc&;bwsb%;3YkKAOm*xQr(Ubz8R?w7&;7 z=xYk{2llousEGn;>oS8{xZt*K8;AvM>mmkyLEZ}>c8)V2j3r*;`U^a~pN zJK@>OA_m^14DLNa_CNa=e(>A}8~ycVJm+b6&GY*+&}uis%N~Y@Uy6dP1P=g%#?4(i zPx7AxjsAkV2%r{n2xu_)k%9;3A&(vK!C=M{;3LXt&`bv9lb5-mhB~aNd<}F?a;J}q zf=@56@B#SfZ^s-4hLKxv&pcG{(`0gK9)u1E?*NbOYMwx}us|(g&(4#c2Vcs18lHq4)CL+D28}!VcAkPX zSx+YfaFCObP9X(NUBC|tL^!~Me?7Ei51W_Rm{Ps0m7 z{OeI0&q(!4L2aqp+`1gv)dm3Ky*a07x2HE!mX=oZ`A9QvGx$Q3Q13K3c zJ~|C*yZa(1F314&C8{>xv7c`WUe6K=TF}w~+AmIrt?4KETO>eMdGhBS^!$Dkv^D)C zXpOo@CunyZuh?JE*fV&UI%s4MnGe~Re)SJrfd^>y6z>%z0nl1I-pNP;pcNmylaK_! z%hUsr1i;JG1CRv3%hcZ^1mGLfe` z0(HefD~do1nm~MzLqUAdN+(je0L>RY1EG1ZKxo!Gzxlu` zen12NAAa*Ocy?Y!Sr0|l`Gqe0`6ecy*?<}o0nj#F6Y$hPh{=F;XHbqWgpU6&fvnX6 zA72Pryo~SMp(Wt;Tmy9W5NKT!>>R^W{H+<-Cjvk@3vm(=czq_8i2zXSBF)F6%m?UT znGZ<00N$@|BLW&z4-o-R6~u^uCv;py2B@>s44w}_+pdl@9{}p@IPvF$dOL2Qz7OOy zBBl?Y`SW8`DnSWz3ixVJ5Ni%(Z@UYBehX}y`T+EL;G?*pL2`J{=Q-$_F=6Q7{Y{T< z7Zq+$I|0<4x#nSb%!lzBWO~4pzwQo5sWP;ebP1$X8rDq$-Czvq`FQfzT?MH#hIWun zgVbq5dPts~*E|e=!@57;;N73|APvqQhQB})0mncZtRbBxa5n?F0|eg11np)Vh7170 z<^bU5n)`z85dVJ7$GAqN*2maKr4)Q-;d4-f#qfZSG2|LnU&aqU##6xeyuvz17k!M^ zsLTa54~^%5FIDvfja$OHNZ_M^J&gCLtOd2HjJK#P1+BLN9lH0y13bLv!*~g)Kg7TO z@Jk<7c!3Hk9+!TD6pw2mH1Adj&ARs+xOnvGm2KV%R-t-7z`p*KDwaHm%1<^ zcIfMV;bQ<5^giIpQylZ95??@Bp#XEf6uLv710;`khyJ(EeBd)-(Rb)$DF!|G>z*Ue znS#rq+sJdKH$XFAosbRp(D_nN{&Ww^Kfsy}ftow8`O+)M^QGX? zrnAWNrQmtb&TGD)uJkb<#(O@D=OBfoCx6{(X5qZk=7xI)T#Ot6bQ(wjt9`IRHP)`kM))eAbPyiuMnLa|EG6i`KG}r_# zNztZEZxNa@1s`~bH0KMQGKCyd1zKYGfq{Vmyo4IGs+sab3qYM1l(|%-_6&GE4%&DV zYv(F4?=lpp74Y(CG=!G=?z|xXv_qfF@&d4Pzu5_ z;p%C4(zWvhc;O*vtPgbE8fb0dDbPv&G+1~DTAcJ+0^9tYGT2Pe_ zUgGzrlY!yow15Bq8{U4Y2pgMP2Va?Z$m8NGNB(UhLhk(Ad|)dRAEB&Fyx_}uVh3n! z%7gKQ2Xt%-G-mKSRf+PT?J!I*AyYdR>Mw z5CsZAa9#%4k1`MiT?mV9@)p!Fg-#`V?tl$Mf!Ec6<|P$<43QQ|g0BJq50Qi96hN!; zKubY`{(`~~Hj9fGhywW;wAc_f5aj_HZGkRo#6J)PPGS!bXEuU$!pDWs=6ewXQD6&i zAP#N>YeTgV$3PU!LfAkQSSQ>yq_18T?qwKJSIgn!NBBe{9p(`a{c7Rv=%R}Zv!#tYbD0p<9d-3@>tTa-HL%+Xt z@SImMcO@uigSV28o>u|7l8(mbRq(z9H6_6Vf&8G6HY7geyoxg~;0hq;Rh&i=01pIq zAqjv70y~iezypCENCM!2KzAeo@Ic@*gaG`!icd&lpz$@3^WGteL5A3_u)YF|4bAf^ z)-5BL+=uyj6`=EVUbyf5{~vNa*kN${5iwqF0UE>xkC%h??SWRlY=LhDT?5|=x&(YI z7f5yvd@JY_$nYZgC|B^XtP6jA3*^uX{`x(TGcP~~Vt|sCXXkYf&_2*vkbR&{pu=7~ zdaE2fS`R?>f&PZ<1GR(h1LX%TBXI}sjjC4w?UO1uaP8g>+Cu2r{Lg{E$r5z!aj)P1 zgD=^9yVrxZwR`rqgWBGn-P1v*2l#gPgSN!`^s-zBwG=cjd0L+0Z>s^fa1MbFBdKEs zZCW^)HUY6;ndvisz87dXHwd(YFABU$Smy+I3B(D=5{MJv{qZR$K%;{6-}(vOuAIi7 zkG7Z0$MPh9s~KoV+8$8zth*ny+0(c6WJ!W&<8e@!fT!kufez>hc=-SS>q5`o>7bBw z+zYyc+*k9fXYYEDG9S%XKD{X_0Y04%eLG*gC|L*IjH%<%d@#VH^A+eS^2Bu<4A9_y znFVexw}XP-qxpaX+$t9p$m%(eeV&~^U;Moat`%PfurM$<@e8o%gZ4~1fR1!^(T8lB z1dqOk=!4g0$LNDfJXMb;pj>+heA9Ire?EczlAtpt-h=kr61QIxd>X-F(8gWthXJHH z^5;``zvM;FgOAvJ7%zEt{_yQQ1&S}|e#uLa{gR%Ymr?dh&IT`EcjeC)24#b2@P5f+ za5l&WFQroX0ZNoLKfp_=Tz-Jp<>dST&pm+8`#?QkfNuLG4}&Tv(25t-{gS^>_DlW% z<-XRYKiKw5`t_<9cs3uwv0su$1ym4(sDMia(AqLb{(Kh|aO#QC{|Oq?3DM^SQ8D_G zp!AiZ585?}b*LM(bO&;(0OkrGN5};~7eVWPKzBqG90niW4_aDt7PN@xJZQ(|3CN8K zh%MUS^*zTx2QebfXhk074hIi%d+^uY^yqfy26aI|%iu5h@UK4%zV{7uiUnkS&mE8M zaM&>S1&?lbY0#QbkYdn!7|19$Xnl`IcQ|-`k0*cKNsn%KZOE{>XD4WVk1yjrU+~EJ z3Gj-c(;nU7&OVSO^@lvV-L0YH=AdH>k%qS+*Uy5+YrwZ-g1bnN;cYRG&Kn+`pFQA% z+@KAie#SNWe?7im^D_3)|LOs{nCH1i=S4r`6n$PlV;6l^(87bx1D@YO3x7NqKYAJ- z@G{QPm-RFD(H8~v&p=CjKqEH3j0Zg#Px=|h={GH^ryTz zJUVZHc6@_s7tja{sIdYbfdS12f=6ILbrSg4NYET2_yh&$-gQW22HwODD)+#f*g<>O z!JF7YwV+4i5m2>=IsyZ`kMJ{pKI3Qpe6BS9k`rnC*H0QAX#DyAKLZ2*6wsZi4h%ls zjvPMSUL1x8Tn#UQ&KRD4z>$B_As5XHC5(qXx;YIGcvy4sPe0Ing8_X1kw>=^hX?-& zpKd0PPA3je{u4f(Odg$#9w5FW$KeT}y@uUf9{eXgIz2c%y1h8SOb*ohSz+~g^BW7q zd0Xqi)!j9Z#$TZEApWL#pmo@t$2>aE`?j9+=;fU>myf}R-{qs@eo#>P^1J@@ZT-gI zQV!nE_XOr&kIv6NnvZ=fe|z#f-}ma}QTOTm1gc9yR&X$QGT!mD{8DtsqZhQKrSp?- z=MPuIlP_N00_Sc}RnYuTfWJu?({vN2J_?w0_KIYST0F=HBPavKB z_x+I%;}6g^riQ0oJMa1Oum9o++7a>@bn72vx9s<)zWnR&dNN)HP2_`*oqLeRpYu44 zKmQKs~KDWrk#^2mRk#{cD28vhm8VK!fGLXUAy1s&lGQhFJ5W7D0_ z{PnR69?eGuJpZ2pt>65AlD{Ax?Kvo;1Aqjx0TwYZq0Z=*4 ztAZo|?qoc^4Yvex4E`e|0dOay5upXX+MpLn43t+v&h11J1La%Lp?IxeF~~9ajypgJ z^2Mj691Ihnr_Vsr{tpI;n53ewt@~;>TFQ~ZDdK~fB!9wU&D6&9X|FqxC>($IA;^3=Ew= zHD5L!1hwW~+d${%I$c3&jiuX}#iRK!3&L*4&I68(A3(M{HXZ<3-+b_oW9tR}*2@3? z|GV@yfP`FH5AnAaf=+M%IivX}OYO#&QJ`xmnh!I%8s2^_2`*f~6YPldQ#cQM{6EaU z&-s6^$Ajjd_T`?Q$vk~Nj356$1fLc6`rZx>1_p-L*LQ#lTgUH*K~%{}m(Cli3>*v$ ztRUj`F7RQZuQ%@i9pm|W%?{9(z}HJX{-1u$?$~@_XtRa~|2AhvkN<~XoA!EKa5a3}@RPG#%hm8Lto-8NcEGvUXDx$Eua1Xf^U(`X z<-Hyk8h&yWJ#^gl|NsC0HhQI@APF0-Qfa6K0>~CHc{CqpdTr$K|1j8+OCU>Bzz0Gx zfX(Nb9qvNG_i(iCZkd|50GAVkN<~3vi#ea!S2}K{L`Gjy_l7O!J}7n4#F)SoqNDn zjQxM;`0cO)f9osI>3-clDjwaOHl_S6-EU;lTqfhR&-E_#5pdvpuBblz+{*#MfBXuagZ?{RaZu4~I}pUxPS z4E_#pCI*I$3Xb0nv+%dtgV@@R-wreJw;D5nyJjzqKo&W9^op*W4z}nJh~js-c+5p5 zg2D0IVU7|}8z=s$2hxtas6;Rs9C*OW!V`f(Ho*-;sY%>e0qIULVP;!y=YKpU~ugG?AUl39u_{ z4de~h-_yY1^#g9VWAiUYm(FX=*BIcI^SgZLb^8yt7-A{NdQdHk#bV#idoS4485mrV zEOzC0x!3KZVq*ExvGbz~zthRi501@0nfRN0_!t;K>m4jC&+$8*bL{*u!KK&pzf*$^ zmjQpPCLaTXW3R)1h*Cv9(C(6xj?F(99Xk({UVkaT$G~9Y%ikKz0W!ly#lxqY!?W=x zD6jH2fdqGQF@Tbm?ZumX3?K;x0S1qKXU{-DkFU zxAB@x7GUu0y!VGghKFBSi&Q{uw_ShFCAJ8bpIHrB;(YLxlt<=ucVOh_>z+m9{|AbdB4~s|RL9j~8gZwR^`_DkGD!Jv@ z{ENBtqFYA~Sgq&(6CVFhxEfx1eHN`g_A-|ynfNumr49W5&BnHU&g3PJXP9FzbO z2?4crLG6q!U^T9Ww?Uc>FS#1NeHkVSPoj(-%?CL^<(7v}w?Vf9N2iO5$x9iSJpVR? zJPDS)d@lmBz(vIawH$<0)ch^W7#J7~4}kIj2dI;C(6RCN|NsA)`P+LL7#KQEc=YmC zUFKu>#4o^eFpXd1Vj6$=^)!CH6J=~^{CbDVvp@029dzsk9Sy<=(aBUEf+X*OkY|F( zGnShm$!j3wnIZBFI{v;jte~3h8#q77JMN1BRdkyFd^$huT)k@5D)1iFgD(_&SsWZS zkGWXasF?6KpJ4+9zen#D@CfW{#R(prpFowX1^+f4Mvwo;I=H%hR6;!dAFw>Z-^|0# z0IC=rN^Uv+Kjzr{kEQgYYv(=3=4TF$2j8*rZ{zLg6JY4z^Z0-4^$w6B9vMl_+>HK)`C5Ol57a*Nl;D&-@^Dm}ad7oZL z7CiV&r12T(&^E?%ojxiiu7)RHo)u(ZfJuXEeo#+C9unR{|Br#n29T*Nh9AEjhD(d{`c=@5@_lu5-2SEKDH( z`Tzfa^Ro{i!}+)Ip6n4|aP08-2P*DCdSA~4HzItx4SZX_dGxaSTmm;OKDf4C0(;+u z-{XSgw`0uwEkWE23@)7)d>BD;{4KWx7#JKI>=^i4{_!&~c=q}+I`#(r|8|g>zr|I6 zfdLeV+XWaH8Y~(3TUHBzRWLdB2K@u8P=>0Q3RBSuQNirk8}t{ff)T2s7^Wf}qJqV- z`OqKV&I@2gXJtXT12q1B@THdkvFin*6XsF$U|rSqib!G@CtjvZW}g~q+kjGoOu zxjZ{B7GLt|yx_qM>GSb-fXZi|&PzU^NC2(G)I8wf3ozYNAnMM{w7yYFBPO5u|Jc4TMJlu2P23Ds+Kz(!Awv+-{Hsv5(TXS?QmoU zF+sOkcQ~?un5#hrvLh>q37T*2aAX59L01iQII@GQj^;x@Jeq&~FP;7J3?rl}LR37U ze)7x5e4sAq?OjZN{{QE9xz-t?65`a$GZm!DxAPk8S(L*+%Jxm-OJ>ZfIl+r zo@DauJlXn~@_WGzWdN%*y^6b1& ze8{u&JE-{zO5dKE$36ZZ^y&QJ(fr__NAnLR{#ISkBvI$Nmv*3oAill4$jQL44^%9> z8vX}`8)((sYeR7IN2GtB&i9}~&BBR)8;gbK|Dzr3|Ic~;KMt)9L8%#Becpi8aOY8K zIM!wDpd!+h!Snyo*IPV0zk;Gnlz$s?SMz8i%LfG17_FGKaSt8I5M8`v3%ge@ASa8*F}ZV1Df!`spdt^OwcL*5aoWo zI_jRyN0~gjAz6d*oaHfo=MUenF`jeL{O8#D#j*Jh3oIQKDY%@>;tUM!x$!Qk8apTDn)9n=H@F{d8z>3rp(c?cAX;G)^Y@T70+e@FhQ z2Rtpm@i%v{F)+Av9Q4#Y>)*?w=h=LK2~?J^2bJZFCw(jr@;9fkfkp#AI(EMG=}u88 z@ce%qTzrGt-lm6w`54kBIPq_5u>qI0jG#{9|MQ;B{~60)`t;g{wevB&o69W%pw0tG2qXn6Y`R@kOnL+UyI3A7<8bVCU<7ppntw3C(i6PF*>nZ8uJDi} zI8>W|C>9C(c7F2wehGB3Rr4z?#O@tA|Vh1<;EDx0~@MS#u zn%TGWENB!XgMV8PUq^^aV(ZB|p8qG0xu_&*J9eIU4QdM}=|a5isCmM%`9})4!P$KC zzf0#K$DN>Z&=a&|?BFY9#!I~-lYEm;IBH&SY&c=ynRziiEiDbSRQTX4dyj*^lw24u z`6OTR&AbH?2cMqs&ffFjZzV^@&#sKO-FszbyK3HYY&c}l;iHn^(&56B;L;Jo6Ytpk zGo{GYGxH+2>)r`E6$WISste;GpX5WnnI}NTffgqmd}Z%>@THO~<3(4-lkUAdovxZE z92*W8fGW}iw+3&#!4DBKK@#$3goqg+i!pf~d?eu0dClYCI~$)~e-=mnZ6*c|9p%hE zo#!2!5C17$Vgt%)pmDZ<4i}Zg)=L%a;2?hurgXpGf)y>`0kp7o(>YUG1TbXU!f;DXK7@De!CK_x|o5431~xsMf;buNI%GJQHfz7%C;U^wQ= zU;vr}=(Rm@3^XwXshh#g)R$M7KxO_37k-};j+!SSW#P1s|Npym{&VfT*ZhyA#-jNj z`wn(cr^Dyi_Zz)7Y|Y1+o1g#j>2-$|&J!nt3g^F|!Wq#VXg>C*^;?OkW9J7*37#{V zgW>-E7YP%Ha9`fQ#j!(ucl` zM>`L>XdVJ7t9aQ69zcc+L%DRmL$4xTL5=$9j0_C?+gQKW!|Q8siTrXmxXp0Uv-#lz z&t4u)(5`9F)LHZ62cF+=8-4?=0dO&T0HS=1Kxf!oOyf@g?Gn4>_ldvYlJsW~k;b0^ z+PZKOByVP);B-?|9>q3x^4wjJHFHh4|u|BOR%3oRi&+W19&=Yf)5{qXY*kW zP$uv=#;D-YdDi3qQT}c0EeA@}J^mjDhQkN?M84wQa?l@Xu;hD%TW|3~H@ zdh-9jPjAqFPV_1$3v5ppT(|NAocS zPs`7xcYG~x@wYtt`Tze*-Jk#ecOG)>{Nechf(zrp=AX<(u^!z%Di%Jyj*Otu0}K9b zoS^0$HbF*gf=t*1nL!z``Ou%z#g2@}T{VA#3klFb87O79w1OMsH&nsH<5OHz5{|j3 zBq}&I{$^lcU@XdV>AZRHrG#VW0mp+cxORbB>OPu>ntw2YTT3F0AY(Wf7)phFdRb>2 z0^Opzjfb(rM1eIrw|Ic{-KMHF5wHSiL zK*O}pV2$s){M%SfY9Kk-)$kicVd?Fc?0-N-Ym7>UW9J2*-atmz-iZGmohMv7kNb39 za_zk7*!+W~NTb`J^W*o6jmJP!kBa9!dOcWNd)@!|^aioG_D25sehf5aT5{qwt8453 z5=EEJlOBwx3{Qd*VMc=mLy4rv{{#OII$EAD{pito;WZan;x#j9%pKAw)%*Y|e=}h)Yat#DFt;H_*?#g8h9^Em|gg{{Qz|qnx8QD*8TUi z{Nuy#{2ba_c)3a8MOZHfgJbh^W*^3<9{-PmOIjDr|KP;N@ARYjKTC~C^M6?FbNu@a zmtGro$L8bAj?K^i`1ZQ9cyxkH5$NS$@L~Mx(R`G}Me~32@jtEqK{d}0i0r2x4u=2d zJsAIjZ0LLsjt}rKImj2#6vyAf0~+f`p5W&1`T6hve-}m<6&H+YZvK}0;6aw79-ZKZ zdIs3MmnXoNQ$p6?cYbgF&%)nR1X=)T`Tzfa{%tNQ5gy%;Fb0kKMuJAnEnf3L=f}bF zpy_td{viH+Cpv#RUH!+F=kL?G#~s^x*X*67CFq&QCkEp%^z zF6Dx^|2q$Y&eLgj{r~^}>p6~{-yILWmvA+F0_wO^8;od#tzBAI}Jc>Lf3UKzM?x7i7F^)aNOz~2fwZx*CG5v&^&2?>VZ zK+zD%!oUDF?4>+214G&b7tMbq>m57)J8HgnYy{_K7t4Px{67DDTc5b_yZrO%{OAI@ zWbKtBsMe95;L^?L(#hn}e2B%P`5=o+ufw0_AM7rj2g;v;%3sjhsOBFE{7s+(4?yi{ z%@dwrK4?tZvGagy=RwEjhY!4Zb+}wKPx$qkaDs1lLMorrK&#FLL8OnMK$;W3Ad3)) z^br#9Y(AvmYk9Hst}ke!8#IKug1y8GRLZj(UP^F~;9h zfu}<4V?inMU;03j3_QI!YJTBw5dxPH4-oAU%MbiMAE1Sc%LiyXL=e#qVFNS4?T`!C4RAZ;zYo9jf8SnrXeoTY1=I|A#tdpi{6Ff`Ys*x^$Kay*-KW>o#et6jTK0n5 zBi3l`5fgUD=3~r`&CmY$_PRk!*oGERd*rJJxLgGp^53410kv6T@FKbevsnW139KOI zZ(+x*HossALwGUi30^yh$alxV4H8gE%K&YUfL7JLgtbQ!Kp6#edLF*^Mgl0k5A*hh zAZTC!RJ}l2a|FvPaKQpOV1*ZaO=t<&u@IJkn{7!=zzQ$+H=-qAJ6rSwtngx1 zBT52>q+Q?6r~EAfn924pmShVF67afF{+2#aR}UNoj+$TjTd)87|NrHBaPmcIPlJXA zURr^gj-Vw0pkP+L`u{&X%q6b={|{c8(Ri4Ffq~^^!#z-=B1R?SCGRKDtnHH$E66HV z*VY4d#@JS{mI!-*UGZAf@U0=l;MZIr=4+N?t_%#Ce_a^gcD?{D@dwRJf|mG$mh^fw z9s#ZJjYd9&6SclW+27XurXr1Bvj%jxvSx`&fN$q<(DJa()1Ue4S|A(QJoxL5fzA*( z_`<}a^;;!J8vlFNog4TVR6#4oN=$4)RB0+$#RDFXUe^3W;6)87APTfnt&`jFI3s8* ze?MqB#7hOxoLnzUDQJ!k+@Nw{Vqn+_UUA01>zQ$p2JAv74hGO@xeEis{}Ub;UwX8D zEcw>k0a9oCkC}m?UNZAwCTPI0cLT@)pp}H49~=+<<9;obdGI0&1A|NNhX4Ew3~&h^ z$N$H=TU0<7KkgI)jXY?6Z2l=$p4)lSqgRx(0J1>mR2sj=g-`sE7eVKD9Q0@e-AeZZ zbjA8jkibbKfrp>?V-A1fk2#aZukrd5f8?7_{4uXS@kieL#2<0@6My7`Py7*&Kk-MN z_{1LpQgi5~F=!mI^MvE~8!r4F2OTpnoMd8PIQWXM`4{g_(8Mjj&#CN-FI^Z9IX3?j z=I@!s09j>V3+fOjU-Ic?RRKBDkzXL@!Vjo3FN4lBIpEm{+P3inv@ZVyNZ`>{4t+C@kgHi#2<0)6My8>Py7)NKk-N2_333TfY=e~ za^c4({s@o`kOxku@oOAvJ;~n+I-efAu?@8T!JH8^YAv>34Al7c`Q?**-KUpze;yyh zCue>Eo(pOG`8PlT0&>zJ&&Ed#3=Cj5UIGc6LK1lNi9hBLG$=tq2ntG2kY4=6A8{2L zl#gIR+5AhKzxNz?`JcvNkdr{80xz$Fb~_$t1TS>xw01nkZm=K3ez}*4rtxclY<=(_6!|&@d<>uY>ts%W;`kECAs$fIdhq8x0twy%`TrAt{)p$F_#@wa;*WUqi9hn5N3W<+ z0UyIlF|a$pZfb33U|@JD#mK;*`74cI(WfI8>dC;rG+Q0Lr&q|=Dgpr8SD^dLzJY(FAsKIYRaXujuza$uy$ zDX67u74?h4}(|9P2Ujr4LQK*(#vwd@%sgjURL#NJ_f&D zkqe;qZnu?(<&mgo;Kj^J4h9#-_sz#SJem*x@N7Q*!>98hD6SrUWv!71@4b8G*?GnD;2SB& z%qyVP#hoWKFO&+tUcoQV(0RfURIV|!o-7G;HGDgv^PorONzk06$HAAX*%wnlsY3ID z6aV%QSEe-QP7!_2=A-|bey8_@o8pUwlF;9cjfCrfo&|Cefj79fIx8Dxe9$TS6yUS7~DR?uR84bRSl zFE*V1|NnKiM`wwOMrVx*c%>sqL+k$v;S$Bh|Dd5Mh-QB0W3NR$lFx&N7D48M1~3>P zQlJxbJbHOuLCvh*5EZbw5vTwE?{-nq(EQNr|KIWlzt0JewbD-UZObiV1 zafiX`2p2CKHZ>MThHVR z9-8O)TR`nGpI#n8pWaADU(1`m{O&hBHBWms|K{LtsslNy`JX~jg=h0`g<=-NZ?7#t zGuqA19>DKw4p0*wgZJNu1-i!xAM1zMc0x zo1gvg>a{WS?v*iu_m_RTZ47-oZHz!Cl6qQxD}C>4`MFf;wT36-ClAJt9-ZfXzz49x zq7o`W2vlM{kb`nC|pZG4N>p22T_&pg0Ca zo(Cv8L5Tv?e+DHA3s9n%eG--^EIMmc9FDuFfHj~e3J)J>qPPwo*gfu|0@_{=P84u+ z4M0~m^oFQ_&2>HrP81f{5`~LL;}MV_;^Pj#%+}*zKpM|LY2P-!IRUP3LHpc5Eve4y zj-BT`dU@NO85sVHc3$EKZO}QeosZ$a=#`70OYe?(^os7?4w{=j_+Rwn1&|P{Qi%YA zN9V`?qMR4_8UBlUU*HG3I>Dp!;4aX%jQ^rP&hay}9w-5AVVb%fvLmiVr2urW_R0UE zmm!kD$6HiD`_{oFbT>rWqq9W?)PgzQqT<8I0E#^ZP^plR#{d4nXa0H@&^hQ3U51w& zcY+oU{}-(}$IoE+t@VHd|I}k(#s5VQp5teD&1Couq%93}$V39f(=93iFb2qG(4s*Q z{a@4r1MqQqB@}-Ki;AO>ZdX= z2rzgYZ&3klM`CDT0JA}dyMa<1$hn{}d~wPHv^wm#XYxIdUX!~ZDM#>@InW92ou6K; z_5=;sxTsiobRIOkuvtNM9|6c-+X%4fX8e-dUY2Vf;uU( zyxTwnd8$9Qf);4Q>%Zfys>K4(xZrgw5@7IX{K?3`zycasX7S*6I_1&HtDXc323`#i z1)4bZ=w$im@&A~Ib%{yeB1=z_H=SGgtm?2VMA`4mmdb(B*Gk1ZtUY3t+^dB9OloWHJA?045wNLQ9kQ zw*@fcko7Ee;ola(fXI04omJ5dM}#(D1ap1A|BNPaggjP(*t)|K#OwUGwk% zf5S_N@d_9IZ7c$=y&kQuy#Ws#8-9X3dCHaF>4Y2qHWnq<-hfuu-iQZ|4ZlDVmtFat zF1T7;nD)f4%9Sd;ta!%~AlNd7!jN0Vu1pN)~{M zG0-+R(@XgR3?ALAyFpZ^i%Nn=H|zO0P`+{jZ9HT>4P_UA_A-EGv=}^kYg7_EI)A>{ z;R4F?tP?>xyIHG16x4t|sHO~$Zq_a+8_9sqpD$`4dSmki7`j>Giv$=_J-T^RBS1BO zH_Jhf-VV@iTu?=4;L*7O%V;1Q5= zu(r;FzMVf_d`RbDa6ZOj!{F1Yx+YhE!Kc%9Z7wKKT~rJ_x*2@BEj+v3IXt=}3_O@4 zG;Qyj`PVzH!9so@jg4_x!p1?;w^!9)Y zPte8=kho9huNRkG85lrA#9#+OPu28jJy~Mn@&6p!ru! z372QDkIMh%U;3qw3{U!4zVP99dguwB+k%$sKVMvP2F37EP*{{&jtnDKjeTrh8$wn@DPKyKZy=6m(CIu50pTYK9?Y=l^36iPEpWt=~#=LE$$6ypC&&$_%7%^yvHrO6(x17cZPZDSZhf2XwCipOUak z0=ym@TtamIe4*;dz+iaNquI7QOMroaf9fI6&JX-8`k)15-K-5+0t_#eK?eo&@=nPD zHJ$j5^MlI1{h+YuYylhW(am}x5>))PfX(;lW<3ezLPDYiy!!#v{DCFH7aQzB0nC~S zG6kCMJi0YJx?MSZx)Th1m=iQ!oONShXs%K5U;w2j(5>`!IiQnQ-Wq;;EeGyTL4z37 zdg-j-@aT*X0JmaF{Czv$fg%jN^rGA5gU9j1psfiL8fxSj89=-2OTVH7!OIs)4xmJR z6cnnfJUiKaJHNhO1nJxdxEj9Q1u9-3rH@DF%NJkm85j(|If4rvP!xbhFTf4B7pF5p zr)b48__p5WZ(-zMVAus}GJ{T>F#PWdTAKtqsjag`A%AVcc9G>0L0^YD{+ZdZqFg5?s=Wl(;!oUDk3JPgQu)jg=LeS=CuU-*Bk6s=L&=#rY zmyC{}@M7@ccRuLT%Ol~{%fbZeRYmx=9`NYg1KyP5)42sa-0jo32RxDwiht0tA$6`G z=Ogk%gOybYhX<%8KUDM?v^l#wMkT^S^QMR8Ay0nilM@=OZ9(#fJuDA{vB(@hW1CNj%|pqK?sB6)(g0)U5EAPxtw#sF2a z9*+A!DcaNWrYFDCO`lHaHnlc0P!qbBhaKd7&{;zuYcvmnc%WrTu7*!QOKv;wxf*_h zq%aSk&N<-I_&~kcAK;WRM}>otf#J0@*t-b-dUTt4fEI~e0pSeq*U<1nU2R&Nfmh^dmZmfU#y3O-AiwZah{~z;V%u(_1?W|GZ@a@b| z5%B2FW$@{I20DzT^=*l{Pj@YcPj{{WhN)RLpnQA8v-5yQ>;IDVKAmcwoj+bLhmNm+ zmWqKq?$PZg;L&=ZBp$S81{9|rmOUz=L>!|-3n zxATNYcaDk$IKB9EL*mz?8xlGEEqVX`|K~Wx-;xGuo4SDVFOng+HGlAO^@b>e?TTd z^Ot}}^C4!43c~~N@fzRG7oGsSX#u6}m(PFw|Gx{={zVkd5mw-I_L;xl z;4^=HfdGh501;rWgU4})08o-cxQyimC^H*)bUJc)wB9a>0Ec_b4sfua1jQ(5^~g(5 z0buwIRABPA%>MQNKcxQYJcpbjJ72!IWeK+37nDo&eu0ihWCv{^Q2zD*KiI^Vo5A_} zmPhj=c=W;S@atuf@N7Q73|44(5;Pv)c@Pv2o{R?_`M0@n{Pkfx;mW_whvT0o<3W#u z4_G}J54!Si3*q?h%XkW;(3kO)BmXuQ4j;w~o(CVXf+DN=Ad83PsnV^Tx0)X@gElyT z5=@DKC*x^f#+!yG!5JD}A9!{i0HqgC#seT@IDHrofQoF(Q>D**x@%MnJUiV5JbHuS zP5YNGUR!{?3u@|mbb?NWd?6LX!Enq)7L+OTCBS*Wvol@+6xg7A=-KJ6;oF&R;M-Yl z0UD|C@a%MV@N9m^2q{SUoxgeXim-Y7KZJlUiV-wQSop* z#?Aotmv3jehi7Mb0LYo3)auu1^8&QjvAYLSQMaBfVe{#<1`Wm^2kqftF#HB8T|t#N zs1E@;gAQ9Ned+lFv;^KoCBUcG1axC0v;*VO`O>HJ(~I@yps+g(Za9EW;OtN2VDRX? zhuq%x?Jni;?XDF-?oYjZQDzPbk|W^$1?X6|7fYkyT`4u+?py}Y@T_m^+tLI48muoT z@-grWvX&(ZfT(&1)d8UTIll@;5-~9Z>oJ zls*AA>0F`!18CwMG=dc1(Ru5|TPM(%QjZF#Dd^Go6S*gF(4*TI-gh$e>2~$->GlmE z*#7tFboKD*3=Qz;^o8}8%9T7i9SsZ*fLAAg+SH9lK;y6|GZ_5bkolpo@LJM-7aFbjD6Kj_;XDB;n3NWv3jQ?aFQ zccg%Ccc6xEx6Elr{_V!i$C&uHfAj5(5#sRdED;j$?T%FNZnj}&@b0Z)<|ys;==|;7 zYs37yJvu(_utzte;Ykl`CjRLMcYvC0{LTkK6E5)b06aV4+b!wY?Z9Dp(ns@#2fy

pFcTn`_{8=j!U4vl=ei#R-b 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

K{mqgJ&?e`D4>|q2UHBFJyJPqbJUcIX9(>5^ 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%0A5Lcc>eC5QULf%Qw5#ENN6@A6 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%0DvBj}$;YKN5D-61b7T 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

11(Pv`sBvL2nU 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

R-&L{zo&LWAIVIT>N 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

(P9W#RD|C+UzF5 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
i%tguI^F4i3EFcXC z7ZnTsZJeNXjR&ZagDU8w!iZIr39BeGsN8Kn^rv)zBja&b&7Tn0IDS72nl0mRX$4&^ z+j&D3)FtPi;-cbl%tggh!Lbpv5`eKN%cb+?!Iu(_od+BbzTnygYLEJ89%}x<2%e=E zVFVe&!N5=|e?n8jLLB(s{G-A%g@1L*q}-#9S#i|F#3i zTv$9o3)4Y;4n)KLjZ0^WiV3Jb&a5_mxaIn|93pbqGIs>r04%5 zpuvN9kO*k#?FFp)d7pn9tFSnvM0PcN3szTp=cU;%X#MEedD*8okkPmEhU5R!;Qqcx z=Ly%&<3632Tsv<%HveEL((N|r{P_K1<1x^br{Xz}UJn-6UiUvfy+JIly^(*u9|O&t zf}0g3hhMY0w*D_MZ~+}bc*+pco&pyai1tZ?1w)CX$NvNW4?0?&Fa7AzdEqq|xZMT1 z7V(5fvx`awhl}P5P~`@0kAMnaM#H%hsDx?@x-Ub=!t*S;NL` z*!+v7$kws>7o^GH$nSIL`whol6Q<^4%+1gKfEu`9V|+TVzmU-Y)uF#U7{7w1l^r!d z8GdtYKJ>@6^-_t1D`-vO%S{R(bzjsO82+D!*ah-Rf~(=B*9@S;4+BAMJqy@;4*xb6 zl>pF`HpqYc`%ZuZ`P)I}61UD1%@3FjFQLU3s9|T}+v~vy3SCfpfx)H2MU=tg{~^l@ zrH?!quXdi$yzrVEUjBBT_|Pw3lJ}Y^pu?0XaMqkiLm7l{%yP( z!W;~a{I2JF9T@ptj)6k@|53+Y@Bg5Q(NZ38r4C9P6|WN^6kpnej!;IA=A%r_2mh70 zZvvZD%Hz1f;I%X~{w#lhCI-(7aWJ^@yB>!a?9$;1nlE-JIRvs*bdwO+*6R?-*K5J{ zAW|MULBZ?S;g$YCuCgYuULsC)lSEf?R(IPx!pM`87tWNTlN0_|KEA&{|WG*e=vx10e1ckXj_q> zYX^(C3;#A3K}OdO7jZ@~lL^FR0yCLGOlB~X1;k_lGg(1QRxpzd#AE|A*+EQp(1oFv z7fKg-GG2fA_|O0U&;Vb5^Z$SF3~u8Q1_lO}mrjx#ifj*o*IcIM0(!sdbci{N|J zKu0u!R-ArtH9YwuzzDl}AUB>llLoK6TFi&7AsLUoI9)b8LLX@WHotHUsDi&ST6BzSfsZKlpTusDLUb4v*#|0*B9>aR~Nk zexm@M!hE5!h>77vK4{$X#EXihObjpLLF^kZV$>KIz$!W=UR+^eU}!l|Qv5=mn}NZj zmp6o)f#Jn@CI*HVS|G(IUKF=5fmY83y)ffoV0cl>0a{C2!sF4)%Ld|0sxdIUumQ2G zK?EN}k9GnR!wV%2u*s}145u(Ly!Zi<{tng+S`KzZA^Px6(D=`b-y94KXU?4QXnv#d z;x{`3gE8ppRgJ@7{&|q5ZR`vT-6ufHU0;eXV}h&gMhIVMW@31GdNNoJ?5~$v3qc&P z8TklxB}r__UR<5b#Ng5WE4}cFu8+?#tbvixZg@0XFqFu7bf0)p#0YX&iIA)D0mt3|CgYPH-OT?*Sypf`yx5GSRs^Kh4WgFA zqnrDMP$Uz>i@lQ|;qp`&WU9oAv&x8Yc_Fa;`~U76FLttlEeLgJ`BuvMVs``+gYl(} zj4$k%7#O+_zn1L2@nSkeg>^%XiULC^>x<sFi+B)s)|I!MNWZoUqzW(><6)go(%%>VH16&yxO5=BMgO1~|bd)F!@zFlS zzui&9qc>2(gZTpgc1JdkUY-V@UY=7Pogylp))z}8y1jUOtPd7(bvtn|AM~+4P{iTU zd`RQ18dSayn*rc_cO4vrt9X5&0Gu&#+O+Mn%k6vCrkR#4^g0fhtfJZN{7>K_Y%rDV1I`G;!jX$4Na|s)R zNArpQpZV)q@5*p6cyzKpli^?haY3|4C+m9|4u)f_J7qW+7-3G>37RQ=A;$tL+`#1u zXbZUjsF08V6%q=b-9J6MKXl*n=zjU4gcB6}rDDy$8A}Cyx{n!O^5{P6(S7{CXx4g-n5 z5CS$0f6?B@1PME6x%(JgPM3f})i)AjTVw7s~~}5ec$D=*1>!Fo*rc zQUL~r*Kfdq1kw9qwKN06i#`Ep8g$PPIFr82s9|Dw`M4LHr$D>q)uFkFu~gP0 z+0n*>`Cy|3IN$K?gyb6!iBjebjE9X596sZd>}UfzSe8S?x0i>*qxpb@5AzAI05~7{ z_OhJxwLVcI=h*GZ<6(WVh}*H-k%Rf5hxLUbHqYjR8m}LEb{{-!d;lDtpi`JbJ-Xk3 zstAv6))!nH3?93U7TwpKsm;LPVSTu?#G^S?g2AKLSK_~DRWUn*N4KklN2ja6f6+Zf z>>ni{{cG$z%Rl&p9Rlvjepa*!V5NO|xhw?#> zoyG{OJosG>dUUd;f}GGDqvGKKTGG$z2jVs#QHVY40Cy+CMK6kwU8DtZ1=vM=5H{RJ zWyQp~2yE3EQ0Rasn+~6Wuo)Z}KrJ$mI0$?6@?MqXVDR{_x~+(v;mjG2Uf!dU91Jfz zxIwXg_{<>&1~3MvSM6{A|9doZsJ!3;71qrhOrVaRLIWo%|#`K zaR9%0WG5y5oNSk z^G?v=0(@n>%{za9ChbdDHZVdj@y!8N28QmNJH;6o82*bcD`aPAJy62Zefq2>cxl}WiU0rqgFNQ@!Ewh076yhF z+M*zz`F{8>`Vr*h?zy1t(H^~1Z-DB*?$fTu2mXuR2g$S^D6#QqPEoO7@aXM*0G0(S z^65SSI(Nvxr~9x+Z|@6`1ZcmFN3ZV(khlUUH1>fE=x#j$lI#T)MV+l6Yd{VG3p(xq z1)oRr0S=GOR?y`1izyR0sSQJygKX(ENiD)a48S zDRJ=Vb^X9UPet7w0}Gm1(Y)U?~;r4p!)GdhjdfS@RF3GSS9g3=T6HOL##I z4+CRRv8fP$_(dE$XkC?rM|V8Oi!=!PMcqD7;e%v$uWWJ^sF7wHQ^n5kTF9fD8FZWt z+keqL^FZb0VGa-L`$aFo27}A#!zg;qA$kqa^futo3(6lJ-HeAJnAa1etXK3IC?y>5 zus+2<^#IiGy{v1K*cm*uPk8i-YJ*u9jKM0Vfy*zjIlZEtAemlPE)b=C%0v5*hxLha z#xtNiCYlQp>}7qI2r>pH$G+2%fq~(yCb$f2exu>j%jybJ*L~2VSM+cqJA><@-3LLg=@m@}OCR!RKG5K4eV|OrqgV6_NT`=J6ht9A8m`9}ECbi0;L$6(03_7Q zstBUsdXPK=4v*$H8gMh-CxE;SH^bDYmo)~Yx%;9=FYB!YkVh|gY9H{hz5w>9gDAqI zCZZsZ?wbSiC@8)W)xCi60ppYWi(I-7x*Feh=|1h)_#v+(HOH~>qkC#zsY~~z?hnQ% z9ebS_UAa&2FLG@Bl$n)@`&4I)3QPCTP9GJH&JY!z(g2TU-g*`ehX1M`?EmxI z9$;f+DABM@U}It^QM4@pQBtfMe*XF2{6nE!#bYNU0|+uOcRNQ}zr*PP({~f7f%F z;$q{I{EQbo4n9)w;D+2}1zI7bpmf;kaA|lq>pW%-hUOC-$60%sIT%38i91=lnK?k~ zgcM3FnolSkXDwmoU;s6*I$4XDIT&^@Ffdyv@A9%p433 zowA_o{^8U8>V?Q2CI;W`bPnHcbIdsqTLs%>TPxezW*kf8cLg1-fX?a}9 zI@Haz`(XDq$Lx^{j{gt2T3;wSmQ{mpdBqbuVs7P7&kIHcDj4Gfb@BGU-e}^;`sl9OE=^GD=NRi46My&&sI8ga0lI0V z`He@TB{;-`n=2()N`1Q>6?7F?CrdW}U@CX;=yo&!760ZQ$pI{_mr4XZm;)_5x;-^s z+yfnvqwrep8-qZJq(`@-256wD^(3guVf5&B5cn_JGXq>=c!1I)xcwu%160*O`=vhJ zCp}s(@wfDXQd2i*Cpv!%XxnL{71%MA%~cXCrN!M&2*;#(bUPXNbO%{@Bzy4q_Byfn zFdua477=W{RA=Ma8!6zK%;4J_CE%6pBf#R(eb|TjrjPb*{%stfb7dqPwNI9Ec>F)$ z+Iq6|b?eCzq5r2qw^y}Zsy_iLszHM`;Bb5W`Nfx=U}v83`2Ps%R*&wRFZS(XV({n= zhUDzl%#07b{stNAnG90ed_V!xyn~3=LaQRjrO1zDp7hZ z{9@%!CWht;1BN<|7xQ*9G5q&10JjUkMu8d}ojaKrJUS~BJi4PfUetg&5gISJw}AuL zqm%a~9|r?+`=R@1%O%iIjwG~gBMffa@OC@HQ$ZP8lSUn4r~$bw#0chDpNsOt6Xbl&lzau3KW zKR~)#K;;ssPw(;nfP;kzd+B#jYLM{g_5bg|e4@cpp_Ip=!_ebDcw2etdyn1>Mo{nU zh1@!j5jQ}J9r?o#`1Do?cy^x$ZH_na={}yuU(evtebuM?!3)P-Obo^cKKSx)v@2ot z=>G6p$g}&3C#Y9{@4x7QRCWf>?(ZJmr(eXb02z4xMJSj)hQC09#g#{=phx#XX!=(0 z=)URE&G|wYWJ0qts28pfjVAYfIjFY|m-A@01lM_R8r-%#_0nN2$T6p0o>nZWe*FLc|KXRLm!t5px}hJkhBGLXEvG|EN=1a29G%jg3_f&_o~)i06bzO^y1!DCJ=}HMWP!s>excd$x^Nt?Aw?aUbwk2!v;7& zeK3$2@3*3kdB|^L0wsLd@Cm3aHa_`6aywkr8E_vJ(o8@azt_I#+5Cf}Na@=__7ah_ z30;gxu=2CgkZ5R9ydGL8{|4)>D^nm1+8~+ba@I3gE zsl?o)o6*CXMX)p)bjhrTwTmD}sgFmuqX390P-^SZ?I;0aN|fq(G#^v|?d3S@+5A8r zYDvj#n0{%{jth|VJJ03^?5~?aTsZFL;qu@=;lY2>!}_4~f#w_kK_LzC8H7amFFeen z`=>|uC(rH^pO?gen@wj><}bPr`t*u!YyA4(v-t-?cLgEWMG_wJr1h7ZCFzRaf_ z|35rD!Ka(4+l#}6f4dit3;(ttKA%p8P7jVWmrf5JmyQ6w!#>?i{M$haws~>+bTXuM zdT_XOcyJx&-_DiR$#Hl>H|X#PC(sO(7h5Mtp970ahX)%-AIw}NBSG3+__sMRrFC++ zbT}{}?BC|a15xMF;lTsa4YCz#A(*?(i^Hdrp~Hg%#OnrgIz2cJL+yuJ4d!lhVgZ}Z za@eDr%cGOyF#k5L4vfnh?k?aUwS49xsZk3ngDLae5NA{>+*A$9)J{p7L>MuCf0nqPkJ^#l=p0Yso<%7(o_2)s6uS~0h(UmZv&lF z4pPk^!NA`RDks77R5<##KGNan z-}=OaqyO@|K+6%2{>z^PnxsGaFMk$jq2bYg`HMj7u8#h#?*z;Lt)B>%|64y3EdRHD zAxPe%@gT@G9*u`UlxO1$2nBIsa|P(kv|bN+&*p~@e7kRY9(>K}-aTiQ12`Goa{T`o zpzgS+|gs&F|U#QUEz+gA|k% zg4g4La~gkskicjD{3wOb{P{@+Y5et^Y5etp0%`p9kqT-2^@#?ci!vNO^XCTzfRrVG zloh1$*LymE)CGXlC4kfwcr+daneEYd2t;`{zJO3*7Zp$O?e*aIY<~Cwl15oTX|w|# z<{;<$a5aFkx(_Fa%J<=#0O5fsPzr9jM}<{Hc=sU>a3B5iD$nl2 znDv!U_f7t7mppeeLV*we`ct0GKLq&OK7o!g_vFtzn8u%Q0GjH`1zu)@gc0uh#u~`X z!N62HonMgAhZ%I)sDMZF!w){%P|vWJ*!o!WKKsPZz~7$0z`($-$q4c=G$HY8IxgVX zbld<5s{{O+ju-ef9Ur9eYdU@?y#fjqSda)q*OT#s!sDO-C@j8!!-5U8go*J3C>TKJ zH}GpS@@qQ^z|7ZnT)?jlF<;y90Kc~51%7SE2mIQOA4;$CuloVA;q@F)4uq|5^z6Rq z)64s<^6P)+?v}<4AA}ivm``{zpYZHH?D+p-+60fzz>l4QKhrt`|8@laKMdl3=?wgH z*rPM>J4nEzGw^d~;BOEUoc}yJ13z^J{z~f%{CC)+Qvih1Is-U50=N!CXijaBC>+Fl;Lyc1bD7+x6UF@ZW`b3tsCJVav*q!NTdYG3>> zflGkIKp58Mly&|Hn)EpRVtEbdgr?IkrZ+(7?nVe*4;n)5KK-KD3TlP|sEc#P_~gr- zU;qDy_icH1i-3lu{(s;<$k_aYu~gopn|Fl>2ZKkiZ09F-1`q4gB|I-?S1>bpbjnT; z0r>>dTLQVyqnr1v2nWN98jy51?@5rhX4Rb{pvlh+h?p%SXc$0sEm$lBB4!8?Q)C3G za{!4otIB{l(CM=?Ab)!FimvPc?O5hr)Xv86GPZ)50o<2vIawm+(QLa1v~0SB^@V5$ zyaDXdD_RcGQP2*W*gT@~ayLj9bPWc3Btj*qojf^;8NFTn!aW+Hru$&`DUZu1K=Ib) zq5|ogH`}^^>;;XhdGtDRfX0`ZJvyQ7dDe~Z*-`tmTpr!Gnoq!kR@|f4))W+LmR2R) z9^G6oT*^VgY7Oo+gF+RQt3l(d9H8k`@R|z+kKRfSPzS^Me2KnCuj#iBph#zKJ_RyV zp!pYLsep&2F~~IT7vIW2rWt!Qg9qtLZ$OOgE>W?7neEff%KIK}paRxC428I`_%b6K=fLO1U zJX$Z6u!94mlL^!jVD{|f@NGQ_78CI7WCV`}XdFJ{(R|RrAXE#G^BU!=p1pz@xK30yK8u7zUb?>}EaskDbBz_I}W?Y3qSf_8p)_A+K4jkMsK+ z_eegm3v~8kC+mWL>;F;D=3^1y=mOL48B6DZMsiUn!@Fz1%SIF&<3M9GSo+8ROPCov5dC9NKMA96 zdK*;@qzrj+vxS-A#h!j<2IJcv-MraJMW@msn^|wUn zMUQS?o4@P~FPg#Ts_Op*O(!*jhSAP|`n5SA;a=9jzo7hppe3Pv2o0K_0H>={J@9lD zTnbB9f*#$hFaJP>Z0>p>k`cHJ@Br(ZgwQ9AqHiZweZ8zJ|3KV>N;kjJ_%FH+VV_UL9U1)F!!qg&J%tOO))d;y}Q zl-c;eVb5I!g&`5o*gI}`cAo%^Dg9S9Z02Bq%nf!QJPgi))+fqg<&jS}t0LG=9C_WN zo0SnPf3f?7hw&khec-~b*NM><)M+W__DDX&zn#U=QTYI9nLw}O{N^8$y^ascm_S1` zXL=p?H~)|<y@B(ae}UBUyMxOR&`?~nZ6RnC9H{6#)9VPeL&T$- z$tU@sM>mHP$SPHa1_sbfILHi-ZYKV1Cq23w1Q;0@x>&&Vr)M|l82^({<(_HEhYp|d z=w@=^-v&1#t@#1VVa|ywm_ZZu-!CabS+F%d9^E(piv|X33tGc?|#(>EP7Zmj3g>$?A# z>w8Al*LT8T#L& z)0N++*Y`ij2#?NCc8^Y1ai3mSeve+)bdOF~d5_*uc8^|=eXi;ry}tDxy{_dRov!*X z>gF;sbpL3mea=+M?a}SKzj+}jl>RoVSL1+ zvlX->&!fAwfQ5m<)%b}|XNpRIXZH=4jue#ykM2((y27XXr%Oj_gG)zh2WT9dm0y72 zwSbGI>aTC?45dQ+0<3}W*g+>eRe&a3h@G6aCt_|><=xTfbWV(X!rQsT?h`rm#(1U_tx7btRAi3N{;w;e+O;O^GpMgz92XFgBorIpeCFJ$Pfp|=4VW$ zTp$?_kJfLcte{P7kcA;Gov9l0Aoh3;#mw zAp?U)@(&Nt0WP5F0LO2~8B6p*6CI+h2TBAzx_e(RGcde3p2N)WQXSL~>2^_Z04?&0 zZ2eymm6jzZ_(;Bv^tBDJAJuscSj1~e}m z@Ism&oPt~|Qaefnx?@`)qO4$1P!j6y1*Zw)GcOiyVrKAYJOWBH;7QJy__*j;a2*0# zg9M5a0nlW%1a#$Cfk(Hif$=wwPSB;rw;Vc3FF16RzHsO${ov413YtYJ0Vf@POVa~i z*dc|w_#04Wd;v;0t~WphzXizW#-MUp&!gMb0$hxH^tytN!%%p!CmCR|K z#?3$em6{xPeWL`LGG#yR`UaGyKx&VkxFe}DwPfCZm{1yw-PEd|}jJ-ed?JiCh}JiDtEJi8x5 z!lWD8#x4->=&X?N=}b_7tOEeA{sV=L2RMVJ9`Nn{=+cpT!L$2=OGoMpkM3J89jPED zB8Wh_YtCnA7=3<)6h=PXz7F7XtU&h|`?h{76$7O|DNvehJ;T7j;Mn~Kd`qea=p?h< zph;j*YTX24bh`$4G@t+P(_IU`!BYbiRG{!x@U;F`rsLb|#`q%S69WS%SiM{H6j+=*FuTI-eLAK#8&VA4s)~kM;LbX^@tZ3N+=f(_0Tz z8mGB*DuWb8fviM}9Z+@#l?jk|G(P#lBA1!rwL$lf*E)DrgCg7b> zv{=*NnCk_GW3De4j=6qdIOh5T)boWTbAe{t8y{hnj{ZxeIK+~$@5?bTfV|NC1Kfl- z0B=Hk0Jjz(o=D;bd!nKC2Url2Fnz&-NS+Yz?5>u8CQ8!V5~^?~*Sr8Z`8haiQrO-~ z%?9T?YPGkPO(vqAH06Q@7IJ$_0W1hAouYOifT4I^+&i_SiE}vw)vpfK~P$I|E1#BmrKV1~LnT9l&cO8!9!JJi33D za(Q$!LVIZql?Du;L}F0F-5sg(B7^~4d^FTsFqH6h$D4R`pML?GdFhN$flSaeA5j3! z`#{Fz8!9zGi#kjBUx1E~^yqb#0L|S*gGP6uERfwG46z>+t04P5K{i_a7cH}8XK1Jw zVCZyFF(~CRzI4o8fYGBfoZ~f%M|U^}s0(fIVwnRoL$?p8p19%B$^KvTmK|uA{Wi!o z7A2e>-RvMM;}5@h)dyY}2eJ$_mfh>91L{*lxo1Ew23g@_Snhf)7=0Xm+@a>c=U!Vcyyn8v9yhup}P$< zD6oR5l(+c=Qzw{n%pDZg;MozRIW3rbu!l#Q4dL*ZW{(;kr);r@$1TW4J*b5s|3ate zx_|x`{cBCwB3(3#5sVSv`fdUQH*fMyUnxsEvr zfC_+a#=|K3LHu0?p!EUPr}&#dcbld)|FkM*WW&FziZT zgYcR_yj~}+H0u*Z*LHn?i3Tt-FhE5Q>`LQ=sFLSV+)cF&@v&IIOycK>3 zf%U8LZ$Fr(eJHK@2WPqP%eH_2|L>3jhxrNqriy?6|2Lobf4JB2f(>UmJO93e%`XfN z_d3qEk%aQX5BECmhx5!2gH)e6gNV;|Mg|5@eDXIHgW?Y!o6#U1JT?>IArHB?6cMAK z#m6xB8iMq|V^tSPk2r`8jag9;8=Nxun?T$BVd4B2DKtT6(8I)^B8i^|v7zRi1+k&# zfR0;5#4zZfYM7fq8%|&*fzIxRiMN7uLrrQ1vB4%474Cw@Zc!mbWl=mtcTpmg@825$ zj?q9U-yR;D_D~VsU9gzcg^Eb`1|Y|x*lR9W6c%%Vvr+Sp|E0?O+b{My?eFyhO|6x2 zHvg0?V*$lh^H0fMrw9D*hnioQgR(p52QxUWA9TF7=V76+EnPmcWC4m8*ZRFtx~ zbU8A4c7v96GI;a`GI{X3Ui9eZ=wj?(^7wzKi^;L;gbSGI(gj*n|L(9yHYgX=kfnw%YhP$*PJ@8EAE$Yf@N9`lz#N- zKIrlPWEZ22LCJSVtAifBf&W3a`e+|=>|zn{_|?C7i|w4(|X5 zHu$Qo!)HLputRaO$F#n*^!nrZ~8p972PU$FK}Qw_i2B0qq+1=w{VE1slUU06JW) zyVU?PXXx4e!=w9?PxnvIyr0f72T<-j37S~YfK0nPfb*sCN$^Pji^x!LSiWQdk3jv0 z%=n$cJ>yrSf^WvJ(?ul$)c6j7O!al9s1$f~wr+sW^;v-D`dm~pKvRV!AQx1)bfz|d zhM+oJI#Xx3bfnG!P4_JTPxsY;u6^)PNpR_0x&t(m_jfG=gGcfW(43?fcmPV-qxF9& zXX}9y*5=dyUz) z)C7MqKY$s0hD|RxIE~M|Fq#e?1_A{)(sUchsEIHWO84ysP5ilZq}cs`z3mL%_^LiZ zjrdv_42dtUfs8NE)H5i~x(LTv;bC~3`Cy4N3wTIsw%)GL0>zmsB+h(60WAril;wvh zEb)L%vVvpnr5{?X)l9_|YyB`IO80_e4K!m`_wV&q==o2eey)K>_bt%0r=v&fr4k!Z zb!86Hl;P1`qmls5L!c26g%{jcK?lB6G9P0G&(GN(b2nf-?ydux`UEM^cr6Oj2GIe^ zfyW`44pKR~8lME`MB|e$ZU=&66VxSjfSj3h2EKQ$7~JauP2fV@WDjza706AdAj2VU z^6Yf};MrOI;)Uilh>M^Tv35kd2(%=pvqVJ!<{&R*2O&;!0`-ew^QmZS77ajQli}O_ z5q$o!XZH(_?oZ$u(KZGK2GB^IAZQ_wpl|De(sJViFTux5w02ZYgJ(aNT?UWJmFTq|s7yJ=1`g>+B!9g&deM9tbn}$nf3VyQ&*p#sORqK5 z8!(g@HrMMYm1=u*#_PORh3Ww{N5HWI@-$){lJUtGApuCy(4C{=0orCB0Piq&&Cf;wHGBCG%u0@)tjE#Si$F#|yZ z90-9|Ac0`edZ02j&85>0H1voP3dS#VuYjk2Yx2O;zt_OQaK*)<-k`()91L3EU{Jvl z4B&QKjS6Hs-p?N%3IU)~iXuRvkN^&Vct`NgFKG0>@MOa$@PQ|wZiPoT>+Hj@ z^38!4e00bLUeFqrx3K!?A;J16M@8YqNk6b7UMirKZ+~1mb5uYpP;yj!T{?19U@K6- z^-+$BgJbh^@Cp=AShdjD3x^xGKOmIB-ipTNWA;uEWaI{Br1qVZkut&F$WA_Q)?t?G9GMN~ffBY|D z`Oo~CxtaSvq=OF{$K=2)zZJlR9Oy8&vEu)gZi9j8-L<=M^d$iGjl z+e2i+!IwPW4lbvjz5 zmhh&0 z5|sduKR^x9_`|Th+aAqtEIhh7LCeH7LEUo=P|c?31Fp`GITcY?I_FTE)81kDzB zG#{}5Ee5uDY4rR*^qfVHZbqN(i!S{8Zn<=Oh-_eVJou7lf=kN@P}mB3G*@vjln8o) z!uIrwkLh6N!gg4n0gbVu#s{AVXvcU32SX`~D5Xl5yJ$(keKV}2y9D?pZ36EYU4p5TrX6kg**#H_MMin#Iz<3y>7IbDD zjD`+hobl*o4Gm>O*~boX$7&Z0chERZyL3(j`4F_88@fIXvpofxi~8-)>64Yq}8U2zGBEt9* zG#=ROt)cMpJ?Nx#Zw;oGpwWGg&TI{bj%KFVUO-=4iLw|B44AF z12n;w|MdTVAO3yLmcHF5T&$1PWO{VFOL%m1>;P>rNONjsaV!b*=xzojB%f|)4p7;7 z@D&fJu(-N774r6Y=|;*R|LPWXVfbAk4i0y%q5EOE#!3pcNcRO=H%1%g-syUG#QtJ}%hZO2q z1eWwy`w*P|ye%D@fBxt10bP8Dp65OJTiVG8C}9kzfdZ26!7n_zV|5%iGCG1!5B2PH=J4n~>)Gl2;>D~vj0~OZpyRaNI4nF2 zO4yn!bd*5*2*BG0+ysi)JUZP3HZp=*j1gT2Jvw8-jWZ8WQw`KOGXO1bIMYyRspZid zsN>UpkiRt^v@)RE6I>m6b~;FOGj=k8>KDgm4{!wo@xqzrL<8{7X{cTUuwKx81|CRy z9h*=5hg4@97#;aNPIPjC&VIH4g_~Qc*f&NF{?;5u28LsfDxif87BABo85nH*N*%#6 zpc?F$qY4M;P#Rbw2bCD`B<{!o+Dq!9q5&DBdf{jfioTaJpo*%}grW49jVFH#Xg!sU z4}S~jrbe3({ua=Q4mKGjIW}1(F*Z3RCN?D{DmLXMA~se0t)Npvjysxw7EZjp!oa|A z+|h)Gfq~)W2?!f>bo|Rb;AHA3&|r~M$_GwojsoC`r`N2YE;U1^qX~Gx=(wW^=(xa_ zJ#h6I2=$;PF0Zfd0Nqmc`rL6xP%oe1b?R|P6VQT!*D*fbjslKd3^vB45{?ZOj7Ft` zp1lrC#~n>ThsT2YNv|z!%ph_mrFu{~ZjeQtjsmY`bs}sO%Edi)F$y$+h9p4eFdiyq zKkjJ4$pAY07Tlr+mv4}>B12(Ye89U50zA4|TQ)(v(ykx)_XUDZ8rxq1s_TEH)MxRx zfQE>ge+Ad;^0yoYiN10yk!XI!RALDt_?lmVChdMP^0yuXbr;UEGBCUZ&5<_$ir{Zq z0aE`fszj>!S7OQI=3mMDt)P=yj4!=d%gn&=aso(4IST{BOVB`E^RN7RzY^W%SE(gC zK&Ea65$iyf@HGEoEzNoXI%WHHe6y#9fbpdl9np*ouY2sCe}HK4?yTz~I}PqQc||zI7T@Ybv}r zRKg6pfWpJ2+w}qH&`5ibJ5ZY!{2(E)Z&_U!* zQ#1en*R~)H-N76#-Oe69-N6n>-b6D?7-p7d_a%@~U*7-!-)zrN6W#5saqtDx3dWK^ z4^TwkCKzI%ZaX+~Uq(P87d6BVJ6hj|h8U>M^ZnpqeCEZw8fFI2CZzz+?r00-11e+U zLFXM`0xe}^0GA&e;F_xoTtakvnt*2Hi$HxJiRPc2CBn_sCcGs{4X={F9eU3{^+3yk zl2GK1i%0ilP`?@!A1?gcIYA@t{2sl*0gmAF13bEaz2@`jZUzm^c=T2WcwT(r(d+F2 zi5-<(u3dSyho?E19Fq^j0aMm-KU!iG^^t0+a1W^+j^^@W?am>+&@#2fuA|Ab>{qAfG z(3BSF0BWdrI(lqigpV5qN_ceNgbf^k7nOK)bGdXo8-QAw-N7a1{4NJTjt7;6 zwjj4if!rbr4scz^hL_2X-wuM@(sH0g4%EZu_UPs1a0lI~>+Rr~eBqe05914#AZCWw z5-{0cZgANbhk}_II-Nbhi!?zaW}q<>PX~|WOD|UhGlQ2;3V?bc65vg7pcD`QDuO+_ zZ+1I^M*PLP94&PmRqlVgA$_3v!O!Lcyq%5)ucb;Q8Y(T*OV}DJE!|6bjyoEFVg$UV z1H59jw=#e=7Cb0$-Xrb5={a)O>{a-_&}1~Cw>7&pYCW5k8WfB zec6_u_yt{55`0@PmGb!X_Ja+G?t(6LOza}0i1t9g?&wPwE;tE z8K`%R=%g!_E@w8Dbm+;u7$iTn=!XEsK4;6DXCu@8^=4@H) z(R}K^$NxhOHi8VL-$4z|0#F%KqEgWr>;cMl86M3?0>JIhW^fh$@@Oz4!x`gCFZY7z z?m!J#&B)Hb>lJ%vpoa0Km-7M{8P1&9#Q1WeKSXUOh~C7AT6MoH28p8fOHlHaN4M3B z{oq1`gxN%7ZrzwN*@M~-bxRT?wkBAQ$g)2dj|eKP;1ktyAWQ_g{YXg@^9w@r9gw` z6cqyo-`+Bmitc7Es3Gejg;`u$hnZRQJrL3-u zjIV{j6_scADbR7XCNF$mf~!39(x%s5ppk&rE*{;196r4h6Id7+e7YkYe0n_&5^7pfK`LaR60K!JuPwx?@x_K>e8l&}3%?C=r1sJ6i)a zz$37nff|RuUs4PNo!i^%^uVW=m(PKX0W{|40UC{mkNG(=zGgB$30fP+zwIP+#IK7b z@NmN?#siO7dszfo*g@w+J#=Ja0MREwG{*dbygrt(SkM?L{EQsP{@vac9*}h~3&67m ztjf!w5!pHcybgxZqx+^$cOi#Qw}of-`4c92lBYR6Ib04~Ph0NNY|}i2yM(7@C)MFoSyqJ}MfZB%pB2 zMa2cQ%|3?#v|^6cyxLwfX3r`0~9=ZJvd&xjRY?e(>M(3kK>*< z>TtA3>vXijJ#};jHfIE*G2+%)7vyQm=Z;)D0xi;9Is>i9nLpZo3w5#rF?l5E(Jctt zvcbRo^oxc9W`>=h3tQ5x528&WLE34c`WjN8ghS7jN18)A-~(QI1)4qb=+$xZu)fOQ z0_uN(Cz7`FAq~JHCX#|7Q$jD;3YbCDNV_1GA1bv5&n0<)=aQVdVcSlS=8~j5yT!p1 zNj}}jUYy8BaW`~AsreX_kM-A=<)9H&0+ULh^a4Ah3N)|OY{^iHm{kG~eYqMR08J|y zpF~V7N$P_Oa?mgjXmSa(W*2lH1EUN7_DeV?l*B!{1s(afpL!vTgS65)BJV(?Hc z=DgBvEsS(V<9VgOR@mm1f-&6z&ab4-m6Dd;iJMz$KK~!obGzwbxe-*Al%h;5l`w&p zZg_&{lJr0WM6Sjsp<_g@pa!5bhw&v)6Ho)xI8%5btqYk);s^EP!9(^a^GIJA85s70 zx=cR3rdKT47&?nR96E|sz+IH)gG?{iGcqt(7Ax@gfNtD#1aAg7n%4XysvML$4ti)G zMV?YRhkHtCHE4bYJf*}A8m|IPDZK*K;vmK%2%{t!)Mf|+5lSFJ7<7AI>pXBP`Sgo? z(8N(5XbNd7GXulxlr+cYpIV4{CD2`#ul*r?BS#KUPY5y)$M10-G_PdbS#0p~I%pdS zSQ}(w={Tx#tP@Kua*PZNFG1`0(_F02mKcMqRW4BnQQ9R^AWFA{7epD9RyTWVaJ()B z%^tnZZ}!$;e4WXet?@dg*;|9@b(}|Mv4%rOu|;RKL1(dvLr1aCYcJ5O1E_Zb8@mV) znSe3(Q@~Lo1s%F@Vh30c`-=_N}sQbsi-O~!wU#Md;Vo;C0SeJ$FDe&+MQlAV`Uy*CRA3^g$P6iEf z;~M+s-|lF&3zSdNtPhpwr#1gjE>THq{-IqWk=Fb}w}dCH`G-NNG(DY&%2nW?& z&2KC~;h5I^12!Dqk31aS1Kthv12!NI+7d+4fVhDMsG)SfO^!gFGGgO&%lPs3t+?K>EK~<{_PBD%|DDwCDR<6E0`cdB0$|U-`UVsy^D$i z|MoyD@SwRz_s!n?2QIzooi4rQC!2qzlxIRF1)F~bmqUlp9ks7PhR`iQBRYJJ+E+?A z9j&kMw}Q5bzgWh`!0-~ZKOEFBTM4QfU?b>Hz$56OfHc1JLK`%04!XtX#ZwRqw2QO( zSAMxaWCVRD$j~hyVm-(X@CbVT3vNyZhS!OZ?)M8RJ4S}rA+Qm2$Ce{#L+J0U85v%i zpbnv*u)bcZVSMSe#ETE0A#^d+ez;@Tl^1I)85vxS-?khmWj8wTGKiUh!Nnrmg1^-j z)V1)|Fh0=fqGICN{S|bJhJ_=zL;;Q9vw-Y32C>*cEN;hMCti>elh@LYEoVyDcW8r- zYezCm zl-afGC`isx`xr>l5j>=fG~Of0C?vCAmTi@12!U}lE;wz9#Vap4AK#LaSpyj(`_bFdc`!|J| zAj?7=I zzt-%24H|uSvB>t}Zw1Z6xmad<@b`gsih>5LT`cmzi$Ko3$U6N0zianj(2zVxNlCd! zx0?j0i)!H0?akrYeI*UFcGkcr*@5GQTLNge`is^B{Cx)*7#KkA>UQSf-|nMgfZ8`< z1CJt<2zhpky~s^QawyAxNY}!b`Kjao58weY zCdZZ|{4Jnd1#+`v_ubaF{C(3PHbaLkFarow6N0)lUz3pRO+=cWh;U@SV|}+~_iO)V z{{ODVZ(p}~cC&%TTF|BgKt>CK{AiiMQOe=M$o>*s4|Rh2=iTR_69Vd={{MgJ25QFe z|99*<;?WHqA2Ch^^}u65=kI}r?z0^{yNf-br%-`c*d7LruYtS_?iWJ4grHM=LDfBI z;2CKIoPWC!s1$SQb~FLq^-}%|e4VN{=%Qx>P{?$+s2EzfK_hhLLC}B!C=Njb@!)ZG z(3p^cN9#$S?sK4c1dX`AsEPv(H&sf5#=c&Qf(G`XgYwWJ`Ls?$r~qixr$oiUqxB?g z^d4!%9=atPyzT|m_5yD^Pyi3#BL>ewLnW>MOY}Ut%Q-w+zm=$hd;;^p z{}1`}dNR6LU#qzYYAYK!f>uf)HvEI^gvF2+X863CQFf!a~&CF~%|o$x%twl56SohK;3J5OK*o+l`v;XFaXi|?+4<_UE7 zf$|#d=Lz_?J6okSzi>};Y(0W|vS9vRh-<);1*Z-}IJhPYWYH!IctMi|JBmTg&`xJ7 zlog!zI^GN9Hs9p?)W?NaDIA6H}0DAkz^jQwPkiK}j)2B?45FLoe%EHEiRl%%Yfa44VHS zbvzX`cR<|U6XM2FA;}OljEa4ozAb2-{;{o)b^4%_MnLmTpmhR7uG8Nw4jEt701a?r zj;~IKtkbVlWrMBL?-KO*fAD1xY?*!p6X*yT@G5=O89O)FD*c0?yBk0ws~*fJnjeA} z>ia<#>gR$6b-|;ms<2U2Ru}_xf-PtmH5Nn!fC$7w{Tk3X>QoK}hSymj7Bgs}enP`9 zEyQ^07tnC4FX{kkD`K6#A!wa`3nK#qNE2i<^(3ldtfQ%|fuK;rw@km`mqLk6!!P9$ zy@p@fB?=9{bW4O9ei`t$f(~&34Y0oC19{L}gXJaIr`{TjFaLlB2|z3KKSLNyFF`}g zSXSs?291JXtk6HZ6}(;-zCu42Tos_K(2qhY_pucD7%TL%Ot7z`M_HlI-_itj4|uUO zsB45&(8DSdu*vAF^m(wD-X-7xU8LU;Y}s;&zjglK|Npz3K^dRLhP~7sZMA*@bhUmF z39I!lih!nRiCe9|RD_w~r7*~F&^f@MRWk-2-B{L22W~-xJ!r)bRoCi2F@h`tLsYw< z<f35!3o)!~^__e{J!klUf3X8-j4a+U&T-JJ)vs^{#m*32tN&OWJ`+ICwfZsQposv) zTKxzmQR@q$F~;7_L87Sr5|n8) z&{}NW!q~eRE2w!%$FcVk(3+4M6~tP7he~L>jCyPJb?v~RK%KSv3wDC5JSwi$ z_uGlGR)0Bo5j%-%^^*i~uhr+@cF>W3+lgM01I!me=W~Eo>z_G;wqD;*2r}+238FE^ z-Shu5F?ckit?4FWy?${yG%~Rdya#}W^ScLfy*?Mpdi{=nAa8<)+(D!7&|&v|Vrawe ztgfKO1AN$>ChPTiwJ98T&tU}TWKcgJyjUA)+})HP+qir8Uy$d~;@CxnzK*$x zv~|qE43KelScxbSH5s^GfJa z<{Hr0dLC%t{SdaL%xjq#7-+JT8FZA;U|Pz&!w!9Jl(`e{QfBLa$Ya`uXk*%(R9n^j z{4Wz^RWt0aUUJtRU$aH`A$azeYU`TI2$~OC=(K?mw1xotnI53kDd1IzgJWIu+yE*J z8iE$n45xL?5x=F&W9>t|@LYtCZ9zpmMiiJW!KfBu6{iXC0ojAdQ( z2XlI@YnD5X7^I|RU9+7zQoV#SQc2pn=1J3tU)P*x3|d7+;=1OkW=IaDze1E1+Bs@#j&pW;1tk^3c+>Fiwr?s^Fgq#`QjPe>zYNG z;iH)}UDxb;1{9)*bX_JWh02jKDOHRlL2xLO6hlq z+FTHgF}4~G5+yLUx?K-cbdfN&dh0!?^-agIRkGJLv-Fd;uKA8Os75AlUGpD3q>34_ zz>50onzg~J|H)X_%=U+s;JRj_##qn(VFjOwvK2&QjInaR!W@6=j8TE?HNw5NSs)48 z$-q9u`j!E-&TN3!HY=d4ZB}~81R7mMUE3VVh&IT&Kp)g}fe*4;pdY9PTGFgR+1h47 zG1wSu_r>nc0u}}a(4lxuAV%{~rVs! zy3M~*_GTqC*v{zCb^Imhl;KVv6$MAIw?QMROISdSu+sY;-RK7?qaR@aK4a14UqW%jpgl28M2qPH!E^io*zx<|7XAhrw$zi3o24Qp0);A+6K2xFd&&z^!aMB+&hR$C3~$IDCP?~b0v!<6x*N0*9FhU~Ti1bBza}?=vOMTo z@Z>TBB6dM^)~G1Fxc?mNjG}H&6HuxIC0C@BDSDgxs9^XT>z=wh@{Eh*`q3@RF0FO`<-7}#)@M|pJmet=x>=qmua5EgXI zmPc>s2T+y=-R7v_%*fDspw7sn+f|^!LZws_n(0eLJbJr91)A|C#~lfr3=A*WGXDQR z-V8Dwe9o^7gbm8O5buDlDRPJfyZRky9kxfWuY^aZ?+=h|AY0)FK7((S>~xiQvBn80 z&HGC92K?`w42nfqK~uV{^-_gwgQZHTMDwqdT46}B0xD20c1{MBCa+tG2zT(YNiV)U z1x5AC;Q#;spMiuaQz~-Ah z2w^$)I)Ru699s^8Hu4*vY`M+f>IKpcVr&324)C|yGJ+Bxf9rhEowtrFJa@oONVZWZ z=knm+cfgZ>@qr?ahM!uFT_;PKHZnT)I;}vF<8*81oYSg*T)^3U$B+z1Dm$PvH1m4$)?v!e7g_6 zUbhnz6|bd12N^NE7HNLPR>BW5lnZn~1ncW1p53Q>tU=-V5_Ed5qt)%wEElT-rKu3l zT>z<)2dNhW9X=}P*!+XHgumfsGWh7xL$BF4F}`MY?79d#SWv^U`vm9=L`Bf18%faN zup(gPf{qQZk{!Ptdhf_T_26q}P=dF*Sjw`2@wJfAf!BPXL@?!mtJMYmsRxY?dUVHt z&H}Gdf!?uW&}_v3I&{=UC81QvrIQI<>^KR4>wkmj!<{ZF3NJu=K3Wcxz9u@=|9b>V z^{@B9=D8r7r9g*|zA(Oz*{-FK_mS%8?{BiQs8b00E+@6}!G)4Lf|H2U=F=DlZS z=&8J*bMTsM{l-{Pj9t>OJ^#BYo|J> ziRId<*0~u}!gX#26^JgK$sR5p$to{rGcho@SSBm*_bdf%D|3WxD?5m|{KXZVPS5af zL!aU9a`9#G=sw-ytny;}Pmo{vTVDM8|G%MHg@eBtw2h5_o3~2qN&Xgl&;~5fxm{8) z#z|0h`;xJw9F*X*K!gT}5Cb3J1v;`8R2A}ZGBCUZH3LDMN_GZ@m!Mm)8>%g}Ji1SV zj?BCMLZ6L+;dRlA9p50b2gEo#wCITszfYE&**q zgBrr>(S7yx&KDeCA^J5j^_PL>?p+x`2mFK1>H2=7)0F{yflSMvzyJTg3}<9u=yC?# za$sSjT%v8GT_R_rTOw#E@+|0v7-I;7<)s#c!T3@U!ccfA0bww`hSfhwfWesRwUXfp1jH#N4Px;3^p(%LLS`WDfpiB;qQW0_gTP9Gld@rlN0BOUGg| z>h2f**1*4@VW!hB+CM=etm4oA|1Tea_5c%X#Y3`}-907-P+^Ch!MmL~UW)wzA8__k z^AGqAEl`~c-Y?Y+?jU(|-vre%e6V_6{G~T2;(jod@VR|I5jSF8Pv?runf58i$S?e&JV z(Xs9U^sPY;R4VRQd+-b0ao7Wu`2A|9Zj&EWK^U$<3o3B`5l>htR)fQe2K&{v|HKwh zs5zFHdJlRz$&y>(Py(%E8zTGF?98aJ^aOeiBKVe=?wg?P)PXvnO97+7J&PB4??44z zi3+R}#o4^OgoS~Du~eYjTc`CT^j5Q*kWq!^BMQ-nVdw2Z#vPH(HGr7=```cnFWTON z&6UG2mkV_8dM!({w*lx}X|Rdl^IvIoC(YU$plBc6=SJc_H&BOAAryYT9{gsSSKjOl z9>zyNJz~(!G_Vu)Tzd06n}4C-P6ImUuo?As8b|G`priG!^0$KS^m)+^I$CcRsHFkA zod)G>J;?1epp#gQFTJ=7x}65pR6{viuihVWw%!hqshdFr;&z&x7ym)03Bb8md;c9<&X%B_k&1C|4c`|?K`nuDZw;R#^Iy=# zH5&+?pLe!|4|Eh8_$n6`92eIVbs?`aIa(40K0ohlX%OP(8h7OL^Ui|W@6hw;P;RbC z{0wod7}C*jypGIYL08x8dks1~4{~)4=pg@Q@YOY-GZ8@NML(xx0VJ>ZbmS)$?q>c&m` z4$6@w^{{$}7m_C#`CCDTAzgVx__`Yx(0NJ@h)Zwuc|h@6;s`!E&l+-c-f5&eZ}?rV zzmWd{vc8nX=)h}Tm=oYtswC_ny>9etQXp+E=%L5WN5GfDLF!jf3 zUk91b-_igoGNBz&xcNCA-61L#9<7&3ynVX8I6$}OICXoQxO6#N!UunlZU(}BX^yu8 z|8}mH1JLvMUV?7SVU2yj%CHl3DI4fY7w~y}-k<~TAeA?~Ev?|u3p!TsrbqYn7v|R> z?(E0r&g$-91IXEY-X_hz{)61d?{a}yCwg@Aw;U*u1r4KcdGzvbywA$u(aG`VJJsOZcbt)L-vJdW)hM^`BrIiM*ax}< zr{zGYf(PvK9hUB6$an9sg2pjAoeeyo$*DI)B>{BxPWNdKewX8*r~+Nl;G&Z7Vj;Mi z;%})1cOkn$qiLY?!hE`gUAm(UK-cep0t|NXjz{-3_{BRO-9J6LCxb5D@#x+RqC79Y z^kF{faq*SM#dkiPE-D_NGeZ+#x9|9LAM@!9QL%98j8QRwT)z{dq5w(|i@q@txP0eE z9;oY0`^6^&H}v^K9Rgl=QdI(R6|QwBcsBH%`0w%mK!XhrS*mqR=r^ z15g>_0WL#8m({#rKLyI0;6}@8r0j_(DJO$2qf-QzcBT5D!3@;SI&9n$?S@mAvrG)H zS3~dS(JFClJy{Y8D!he3ck^h1X4yUXw|gt3b#lBm1oOJQ6*@RxtKzz)rwy#gBiUQQ zqmu(v=E4S+!Q$QC3Y{FFt9rowQ%D^GZnMJg>Tz&{wp6LO|Bnq+15oL%o&}9m-~ZQ$ zy8n+4v|@wQ{eL%Eao*KK)Y=roTadLWk{}vdhjoK4CI^)|FY=FL8Npczimi&R}L>=xk*GE$V1x;bmZWar-%_ z2!S2QmwSwf0bES(1>NT3*?rBS>->u)_m~*E4|{a?f_-Ov=EZ9sP#bEF3dsAQ^EW-w zZ}I`%2}ki=J_kQDFnBZ{(Kzfeh}NzAIRWahzaF~lRxH4^EYa&$Y-Et;lzmj7>sFXR zlPdhJH{k15Aol}+7OqSI722SME1-K|Av4U~hg|r#ds~4fn(?h%k%X*VNptDMzjS3Q ziAz^JkCU>LLi#v3f{9qV0x8=;T?71Ug$!Pj80IIW23?ptlDK^3>QPd{eECtFVUD(Z z1svv(@m|Q(17!UQ=*V{H0y6$q(3Q>}WUXJ3hq$8zwtfYaYLOPOh(Q*xpe9iC6)fT; zu3%Yxgb95G3#IE<_*+5ubAi^d@NZ{KYyP2HQVCziQj^yF!XT~r2WNRSp`|R265ypQ z#-ODvY0Y@ovRJuNdo9Zmailzex|Ri8_<+~4$fY&oSx=v?pd}Y+)<5}M)-p0M>;@f- z-s`kBt@UuP`&vi-DThET$buFS%Y85Zl!Ixlhe0b_KnGd6!Iratu1;?`$=_-PUDgr< zTGrx(w5$butqCXpcF4LGuC(S~S|uz-CtovdWbAccfg$@JBzxdB(+0+tlcfTnr7c__ zt1Km7o?~EO0IhBL#lXPe+U+P{3|iU}09x9@KjonD0mRCdn+y!_l`X$qdOablTf!l$ zTkODVP@KS|IhfP|uWs@7fvj!`DM@R+R1yzbQ{n_7EI>p6XmyL9@yXX-pfxKuKr37> zLszz(2Cr;61U6}ptM;Li?XOq58XtJQ*|Yl;mSruD+LuaLU$6G;J_%XY^4ihW>O!fO z)rnFyke@ud`Cd$(30k}3q7uNr{klgtU)PNnjWZb-tZpFIq=2Gt$^lT^!PcZ0fO=BU z3klA^`aDQ$Q-obQnII(!+TxURe?h%^5*DW<9ss4{*L$FIDoATnrtiVht_82_xa0%6 zUNKO>r!!E(r*k5x5AD-A5!4v==yc?8=?qkG=?GNu=?v6x=?pX==F9^suTKG8?e-Sr z70Z>NGl@~JcKZN262UT4pws{~p^bL0nUHi0 zuQ1sST4Bnz?iCc?i! z$$`H`6g*}RT4Qpbk%0lW#>5dcArD$(q6A~$U1M?q+z34VLJl;+0h+h~4NfM4?gav^ zF-dE#wt_7(x%NT`bml_g3;ypA`=^2|fRF8g)|i0SbvRn;f!3JVy>@f#)B~^UfE&W< z*?s->&KJ?pMJAyb`ay>eJ9e`p)|fbUvP0IGfDd2*T^9x3lH+K7qy%(ZlX8h6_$D!> zG|)|A!l0YP_*+5uv4D>|o&#!sf{r@|jT3-wl>;w+cHvCc0IyR6UoKbe*s1T(k!{hL zt>M^d*O_hN(2?!)Iu)_XgdMcVg!^@H^ADy{7E8Sn@Xd3e)&OV}54yMm*SW^3ll-lq0T@s$B!32lbBW>0T<~HK;*Jka+XFs; zfw|jR0W^ezb5$0!{82zz*8yD<%Ty}xItt`rPDsm&p~MGtj05OE1gMWeSJWZ-8grz#RA($AbZ zgF2UvVm5R#{Tpa9{VRAiQVDUB>7e~0pffaRb*Ej-PEaK{diDdI&VH!WfsTAp_v{BH z&~it@ciK6FYAjIo^}>*qf#D@lciL@6zSGWW9qPP0#+`PnvCq3h?z9WRI`4kvMaxR$ zvmY`*>r}zZR=`v5i$U`<{4M^>qc`2LFfc%Gy1Vz4iB31&@w6h()E_A!_oh3YuSm5J z1t&r@gb;rsM9fDf2A^aSPlRaxg5*#-o(RE>Y%k4Dgs^SKejT zgShLi8#>0HA>q+kpa2@tQ!suDYDIYT25_WxW^jNex6eT*jn{)3n9v3=VpeK8=+3}y zXA{uMUT z!2ag&=q!)```M#8L4d)dH$VX7-Qu+%50oTgtP}9{=&k|HkNvXt&@$jm*+In96nL*s(q<%LJL-HU6TU~LMZ>-4xhdTqrHfTrf{Jd&@%ZqpMu z&BX9p1}e|W29{@YH9pXN71S`7Lc2;YN5ujZnow7R*BKz+HHdMa-n0O^ojdX3+AC0V zkG~}Z)P04fRg@J0wvZJ8$hYo+FLT4VbLuem3$vY6I?v+oPRN>pryv^A&j!~-kh}VQs;egXC zP{hC%4wx*%vTz`KAKJo!O>aQWGJFdMK+9(+Jn!P;W!SobPC<|EgNMOqRCqL7GL&k1 zbcTRV`aKC+bELrFYJA|BlL4dg$>UBsVxXz)OD|+sf`$)3a~vMvjC~2$UXL;#KGawnIQmbc!3fKcu|moPxnX9qFZ05t`njhF5k6>xjdG4AjgaM;uC{=vf-dFTIPjJ)%| zF@uGHp?N2WWa6KC02Fqhu{;n4-@4lC!~r@ErJJeKQD+0=VRSKr4UC6DYC(sSz~~(u z3=9mQz2v>Did$G2Fx^p(=?)r)1$476D9o`Z2k@B-kQ*4gZ+c*x{7?n&c=Z$jHGcH4 z%zrq;=089!X@wWg%OJBKQ$Q_0%=4hDAongZZf1quyXexz2)cL?)Kav}R^ab(Wny4( z>~#Qdk@e)?cL1?P7Jl=hvkL#VlODYyCqU<~^KWAbgI>Fs4zd$`0yKEXCupAH2dEbX zVl03#N|HdU@xV*+lt3(D@Lt#`@Qlmp7iFN$5;>q&_!H2U*CfY=A6lTzLcshdm<>830Hh0Y`Qiyw)mSfIY`Me8!0^%tqEVs5!Li|oa*3g1!w>Be zCC7#zx+TJn4L=O{TLnNf8lau7;Nz`9QxE?@egfUJ_!YuXc=-mxV0!r&bht)mwg!0m zq1d1kGWYQE3`iK`rp06z@a{EdOBd^7HQ29N>;}z>!OJEA2a8OJ5^!~_+*z#fTJFEI z0;oWO4&ZxqbGURc!Z`myTR{ad_Dk}&fHoI+bW_D-=pBnL9nO}npc&&$e?fEXpv>L8 z8$>ekxAsD=RsdY2>Uga8d2)Mhkd$W=nW>7K6v-3_Q9sIXt>QdUS(Y zLBBkEy*WJopYZJT{@~dg{KBIT2^6t;bh-&_WCRW9M06eW=#13?l}8?+@+bgytk7_| zThVeJDDp=4oKk7eX_+9jBj@@7w%?S0pQj~w&*{&U`eObT(AaSE&)|9k{uarfEkNy=9?)bKs728HGlIWm2dL@rGpae_V{wCVJuW3R*h75BkQ<4%^cfOcjba}j-D;MnjZqJ+({ z;fG@>v%~fXhmIQ2haSy`n7WH~v_EMVdwe^{Q<~~(e6sahU7QPeQ3bU6gVsi(&~DlP z1Fu;en@{|A>2y|jt>oD2z}V@m;KP_H0Bd7)a~xw-fO32oH9%&8&cP_*aAiL0VtuY= z8K`aJ(Oa$H(tQYYP@sZO?`BYo&ZqmlXZJae-p~gx4t+$Pu{v532Hjig=W2YQ^;?~L zx436FAG`$!X>+jrKlGZp`PBbT@z)Z)PK=%GAUA=!h9LKV`iMS^8r|Z}zy5<9aun3M z+zr}ST9O0WQ(Bh>+E40g{2$`B&?m0^+j&$xdVL=>r#@it?M+c(a@@fNs=C34C~dn8 z9$wRdZ75ZSY4hnm5B3sh3&h_K|Npx(|8=ph_9$KPTCth`|7#hLI-l(h+@Er6XilWhHo5 zWhHo5r6cmLN=FWl-b$2Rm0USgKGS>P?@9FDOK94p(G)a@Nc(9Mg4-&8m_Qr?o-t9j zhH!ArnBdt~dFsE%|3eKnf()hKL5;@(P!Fj@rJ^&~1Jt0*@Mt~~0GfI|)9eYVcwaKM zK;}MvHZw4s!9GuNs}VX+a<(3#_9%$Pm?v2e5=HG_VBC}V8eE8wa4HSo6i`!y3B547XgpgBdwfWf!745gytJqs#A zOASCr4jO=tQ&a=jK)v1y9=(w29aNuzHnW?&@O=f{{Jh?$LM< zR7ZQjYb^O!C|euPTm^N*v2JZV(;BD&9@XRw)HwY8l4797;WKA?ogVn~^0v*#y|>Yk zf7=26Z6~24YoMDA(e5>jTnL$?a0Jm9^_X3;c<58@VNPFULWgk zC9I$p39}2MIVhJR4?{H{QE-fRj05LcP6F=V2~$xBoeUP$*t#>vG%-4o1l@;{7- zdlRqBW@YFs_HgJZR&n9q&gjv6km)7pz(tpCZw1%Zll&dfyAuzjX&(hI`WJNM-+sVD z`zU19KV;ba9RD_4!{+NihcAMM&A}tfpwV*BTKQ%W19b8bsNI!iNXG^{=0;OmuLqMyr?)_wOQ*9{8mK&KHUEb(QY}EW3lq2XfY__ae65r^0|AWW{@LppH-XLH^b_(6s{Ho)R9tjvSty z4ieprolKxTD~`<`8Z6&$bb>-2v1T5o*8r?n2~96(%%GbQG)J|8(UITdL?;($o|D#V z;~ly{75M1dcsi|(kNwLAIgHLl#Q{DtxZTsLH~(aB`Ge-4DdmOyEmOgxd%@-U{4Ez4 z7#OtALWTydK?4hXpkkd9JP`^T8uSEh*aA&KS)b!?*$&nV9T|KG9vR#U9~nFi8X1I4 zu$+F;1R5CxEtGHmnO`0P85!IFGJQ3OSO&5TJTh1b8pvA;nrzKLj10akU|@J10UH@y z!H9M?-M%~qhS!#;1B1t`&zI^NUwSPCGOrahFergKFt~{kBvYP)yioob=rCrBYzzKY z&Gq$I={I50&zCA9UQv zc<=@53dT}q*RHc5Imi75pqfwnC`bj;_@Nx={EZNkG#Be*C2XMTt(2L6`@gi#nh-Pe z0mO9I?z64m>JmVMe(19`qAuWxT1S)tL>1@&BB*?ajv0D%bELU+D#Ccp3``)?AVY|b z{||zO5SM^@CU}MrLsU#&%=&^DLtMdF5^?Y))3<|+r2($pM_a$ud7=#=g58ERgeV0b zLIk-AGK84s(rF1|H8U_l2N50r9{>#^?sT!p_Tg_m3t9_pneD;fcNjEE*qzPcVv!3z zllkn6396{;-LpNqT_wPMHlJ>94$tl@X)c{PDh58u4jeCX4lyx!BwuJfP*>^M&F8`o zUiu8H9QmQHWPdFKYP*a7XGd`$Bh-OD%#R%Z9|w;+PKBl*(9mKvWN2{(V@V+-46=|% z7EN3%vLs5>{~vs<1~U6ND1@<%R62kD|Nr%R$l#+CsPVz>@!ttL_y~$Ns2jQ=!;jEF zng$vY@KJH_Fh28Q(Q%aFM=Tc?8ee(|O1a=Q(a>IzNAnv6P<0Gmgcc~_0bLQpzuky` zd!Us|x1)(iH|LAzG2k(G9QPJ-s(?l~2(CSUbpX_59t8ImO2$AImA4$=-_GBC5PJUG z3()y*ys?wuql?}S;Pc;{LFd20mX#y+UPHT=u>JSor9<5}Vc`ck^R3XJ`QLw!Zg4R2 zyLs4inzD%>O|1+BFepm=jJdmyq5Q9{qNDsdu$>rL-#cge%JG^ zpp(wL!3O|}qAemXQGq%S!)+Mr$HSE9wtl?Z(Exd6xT95C^9ziX;f~Oi;gyh;;g#T( z;RMDw)xxPf#yRl!7N)NtG{!ks0hHHhKgJ2F+|mdx4d;it20YMdr3P^tu7OTMOT&>y zJHZRWJA*wy=RtuMLS`Fyc0YEEiH`&I8Ng$m3o{_&moq^$_OZ^QH0W4oYzjneD2T=w z>$C@n5*X|JzZX<=kucV&R1az$({Zd5>pJh=O3*2IE*6zO{H?3N^{736A7p~Jki*5I z4qT0%d*LYuTI&7Yr@Pp}#nPU?1=7%S1J|Shkec)wsHLJ30Io@ucEf7YU}#GOT$=_U z2Gd+DDxnL{k84u?o?lWhwj*IedKjhQP zo7Y8n9XG-8QOh34_^2X?#uy(huf!N*a|jI%3wI0wk3jaWQ855rve5YE0_gs`Zr0|H z(3XAc0q`QsR?y75tML=h?jIiApM1K1`nH}d)q$?b1WjscxEdcYz63p*(D)?eGKP&c zkdY=9&}dET{}NV@)^8=Je7nDc8myk+W~;ADM~aF+Xj_p1==eYjkVXf`=4VW$Tp$?_ zkJfLctjAnbJQzW?M1a~+0Uo_BDh41U3OqVnH!w3W@P{Ap=x((DIla?GB?F|f1Y}T! zOJ{0BnoDPDhf8Pb44017Icfa$tqYhL7(l1Z1%S?vOK|C2x`Ua4;f3pR1_qDh8z2{Y zIet6NSfUKtCdJu$poF#g^#9jpprJqq59{Nl8m+f0G(4>Dmnpw~=G*$M#M`6we~EbO zfl5}F4z<^OFm)yFE*&at9^JhwK&F2$hprO`2dD9w7hRy$?~O-5!3`RH1r;OFv4=rM zO@x_Hx^FjVgvO;K#qR&>ZD;Vt*X8%rh%d%!NPK}#y#YC8K;p}#Beeq*XI+HjtacYX z&U~=MnFTx~HCu02Xo2EP6%uE@Am2&09;jqXbLmuj%@0#p;*sXksp1BUHODfvSi1r` zW(I4l^}~!P-3yL2P~xup_j)U+3>Wn1W&#~H;{h53696riZ>SVtDB<$x76cbholKyy zkzXPHzDnL0XD=Zz;+5XhvKbT;WaXJ(@nHq=dIzDbDalJBSbz z-k9eQQt2Me=_O!i(D5Ek)ek>Ejvpl+GMiy3*4 zjz$xxD+W2J(5F{7tp@uMg^{51g?=)YLhixz26sroXB3if4<=|+AmkoQ&>4rl4lGB?hoF3Q4>Nvz7^Tw)*K8a>(~!c7hIu0&Ramxd+o8v?;LY#SiE` zn9fM2UO?}`Tn|2}6!{*^xtRB0dO(jTWX9B=4_b z%h#ZB86q#gbOe7#oTskBG&(hcYUIMwzjnt&D}5w}ON7PJxxGKF>eMGt5t60v&}7lT$JA?;B- z?1X=hVz~o>J&M~vOOdeeQRKG+&F+KGl9~x_|AEd22cOspy)3f<+^8Mhxk&uZMUI__ zRY#yLn}coV;-6XIDPsIP7oB$yzjIN12mN*~rY}ZWIz-=lEQ=aJnT00zSfD-(&eQ2ej4+evjp|awdk? z@Ov!pz$ITSt%Pl)1TVj8M!Cnb12oOv8KWWq+TtStn$-rM=@08B|~?MD!eu@31rNEFA}l-o@}c@x~8z;lmfB)GIA z;cUv9D5gPmk7dOoF{h7IwK_x$N`!m;WAZ34M{RWi%nL2YoV;7|E&wQ4Kdw(WT zcTa9jhpa)G3!*XBAbk$O9QSU1V?oXuhlmJJ=LvC$A<`NL#WZYd9LllSJ&5jH><9<@ zXXvhRAoc#gRY>!XL-WqXtD&S!yDtv~M=%k~9Kd5*M6GimG0a0&4!STW_0Gk_5K_Y2 zI0R>yqb+p+hdE@d6|%O3s&_7~4hFk}u6Hh)2V<;upmePRmF`?TyNm&}?17j&7mr=0 z_PU3FWk`7db=?E??_As*2#WX7I~PaqT*QCpqPzzBor}C0gXhl0w|<~hjP1@vWpB*( zTsIl(7>GGPg4$~t&i^;YdFSG5(6l_!cP^gwg)C*b3ep8x$^hAg=hLe@H5&VZhGn4P zSJ<74ps`pF((YX3h26O*L#;a(1;9hUp!E#5knUWx15NC{WaMv=hcQ4Kb3q$w%RxjI zh|mBLV&E;jr@^znr(ZCEM$SQdaX~v^T|vX)p!E#!>k_#%NGBYtfR1^P$K0m^I@t#0ga>TbE#8K%B*=hWw^#%gz_&U8 zG-{;)ULEk=3w(S7;ne|W&OlZLfNrq;!B~oP(_#$Br|_E={lG^yKsI%bo&iC`nXk;1tCduaNMiN;sL7YM$e9*)7cSE17(mBKfX|*a z2C=|r&vHBVIztbZkalc2i*m38XgZTK&80I2d_Dz^b0v7Y54v`pg`B1fI#}X7_+W`W zxDS>{A^Kp6^LP%H0Bz*Ney{}S6j<0%65xX+Bw;+1gC(Fdyu=(V;kXHPiWhXUgk#HD z(8&_Vv7RhZDN%xPvINLkpraDNPErK15GPBxGJ}t&-RWXc?Ze-?9K0j8+JnDuF8pMP zTJV67*PeKlu z@Web|LcqnsQ=){`g;D>tEa(&n2^U6v6qh0$F#$W;cEW4sX8!-K#&}M*<=+UMBaVk0 zK>8MkRJot&@`<3~Q_b|?6hTj)6x zR;?(L#rV#d0N)8H;L(ZqF2t}T(BuYx3vqWL#z=uwm*Tq%vGO5kHVCwTxjMk38*;N@ zZ-|P4N9#$S?sK5{0^M@>BB~BFMNmoayAW?nf;>RRU5H7NkYg(_??PPRk9D#aJZsur zqT&F*qY-rGFsS8;bohq{;x5Fm;$WANdKcm;39vT!U5H%%py^%YyAWAG^Gxu&5P$iB z>82EGxfOh(8_;fP*bUF(7bUI4-bT$UCfR2=Ci~yfN;mG0A>8Rk+ z;i%%%>8Rn->1g26;b@WO(&=dB(&^~o(&31-TMOI3CZ|tlq<~LnpoB{&_^vpg&PLF7 zaG%bZ6)fOu-p)|LO(6GJP|rPrC}AW))i44d9?a>}87Sb>83_xN!@k`V+leC#aM?GS z4hW}9isJ-NUcnVF6x&H+I-uCTLGMS`)&q3~;02kWLwN*TK?jxG|40v_GWpc5WDEkTTC1}4{TK}Ybd zERO#VyIS9<*#K(la)2&e7XaN~+5E-=bc3maWA{OyP8Sso-_`>q%$}VBjvE<4$JQ&j zbRT%p-NC>By}Q(-n-O$@y+@~DH~8!n1m6QJK!^|WXFiHQ9lCybbl)VxpR(Be>Cgf8 z=YIxtZ*D~KCirX@g8tm!5BDeNyym`MaBm;`Wts|}-8WtM_kD8ge&Nym5p=N)TepYE zgo7`6KnI3$d33XRG*@silt}w@yQl;>@^3%q(Jl7Evl!`$W07ud&;gIk%|HK@aQ{DU z{kLYafBY}ObkPBVE&`pm6QhE>mIHE5 zh)1`lgio&{hfgP{`^D+e$@TI)$lb|}Pk0#^ntvphnSwTl8viG7#!hFAio%PVhTx&% z381;4ouI0j(W95ep|rT$)5N2<0VM3gzunu)qgUjx@qbIJQnBMq%%HPYT{^v3I=uuO zwlg|(9e*9t>7%0H2s(TUJaB390Mv^seFQp+6XpoxlPE|1ICFpw!O{TbNre|7hM*-L z9^E|$J3!5jZblE#0nMP;0(GrHw-rLd0@AGxg&pq=1IHK!Udc=Q%(bhCN% zh8i4v!Q$EdX9XjF%S#3Zh8HZ;7#LnY!K!RO69WUo3dRzy7n>(CFudFkQoeN(1H((u z;l3UirtSxw59-izyoBpTc0U8dOVDEQ7r7G{7+!)V;T)S^u<^GP{Qv(S;>I)xi;2G_ z=KufyFP*^$Q#*3Nf)ph{9XU|XPGT?sN9+Uau4aL_n*D|7WCn)UJTIiCFfhDkeW5-L z)GsMH4x4}EZ3Yj}GV-^A#^<{Ex)1tvmx4lP1!D=XZ|k>84$trRnol}(@-_kf_(*Ji8APlt6iWm*b+{UZfA!yOMw!8k7j3we;(c5 z4r!f&|6!+xW`M>Q3P892LC+wI1(m^&_3I@n67)|q7bX*tX6iv{0GwtTL1}06ufDsa2hPlyq`8K(##xC5kjb(@dl*< zaGLQ2r2&FzhPfM-W>|Y@kY;9R6P0Gx_JPyPrhagm**}qHX{KNj-ZbMm6_#e0shegv z(8qm2M->16|NnozNB2t)>kDOqj-c||=z!yK2OS>Jq31Ei|2=w5ggh*Fa9(N@P8{dqK)y6sUpjI-3h(J8Wn4 z=-dj@Vtn#Ngc=ir1E_3`Q9*9%G=nzxcr=5pVkl+X!NA18aM+`}5v0rG;tSB-=8Yh; zJX#NU@Vgv53?8G!XnTnHbbCtpg4-UB5}zFT1sGp~&JXt>tLYJ^2~Ihn)iupTHa$Sq zRvK#4BMj2?0Lg&nGk0Dmt?6-71G(w(iC=(m1LG%tK_-;Ohe!8BNZ4E|6) z=0l*m24C2M<^@2PBN;%}iyUEhJ~AG{%^f3O(TD*)HqOF>OTg7tPhs6`0w zA0&dB1=Q{zJWvKlD(K26EZr1PaSFOTGWI_D{NY|jj!k~oD<3H%+es70kj0X661_PN^4oo4UUr-K; zdvIE*1jRkUv|Ej76V#KSc3SC>Cn~M11a$;>UaSIj zC0So=olJEs@TG0d*Y~XQ+^HZr(t`O5^2CeBMug$C_2M%3OX^Y&Q&mbd>PyW&n=@ zgU*xp0Izf7@aW7C@aQa%@aU{ia14Wu{W^5L^60+lxDPS*3)-4H5L!spTY zt&-E@`@QB<4xPaopb=00UeNd|bky_ZYluPMAz>^=m9Tm6?>BtCfq%Q<>($+X8sM>D zxH^ZH<1jlx3ilblZs*@-___%)CJY+?g}6HiJ|^q|8WYwhWlZ>uBsdX(Ztn%z4=Nhq z_9MJp!r_r@_>%4a|Nq^FFaQ4oU1a3U0UEHfdO=%1xs_X26#Bv zrRykoIQL&Emq+)t7gC@$0DJef7aJ!rFo4%ik~W-+e5-GFjY(m>NQ{As`o)XfByHyis$(*RPl7SzNX*tTc_Kef_8-4pz2Kn*nY z2ucHI`>2!#kn0Xg>KdZ^edMq2`N<0oX7m9A%GUQh@FK0}SHerE=QptHd-i|^<~^fA)oR~=>wB_#!E-<5{kX>SDPBi7ArEhw2?Y&2fzu2> zb<+&Scs5nn!UVB_Lz%j3VJw|VtESJgB3IK`NA@B0G)7op8`~$p&Em=m4h-tHS#+F8 z3ycFS$bo@vbe}F^VaY;+uuyO$EiAS$Q!y;aUx%X03=Ruw&iQ!Bk`@xHmrgzV60x@6KYVQgBWQY=aQy;my@K1ZdqLF~wc8{SjNnKmv<@W}RIc;9hyyhVSYM=1 z#Z|w63Jr?Zp%`4lJ74@2K3|+awAU8M5Yy+m42pYjTjVMz?g^%qe)!sgiJ;yOwbP2u ze?|tQ11|}s6+=j$#|YBrvBufwp*XFuT)~@GF2egf=16@WVg?|w>}D9qa^(Z4$RN~i zT@H$Sa9UXjihF`-B^ln=Nu@P>@zI+GtqXtK_dkS@atmx}Z>@);g5^qNG*D^1m4wUT=qO8pGOJ1?3rxaKP49 zCBIEF^A|WEsM#jjCPG?3i2Xti2y87?I)uZ-pHvTrb;6{D1K&?V;eb4Di#!)NI$F?~~N&m)hf1?r@QhOg903-e;|r-e(Px*L=h0+Hu= zi617!HQRgU%xGGmPFg7WOs%vqDT+W^05#`8X`vT+zLy$l0lDs=WX=!SoY6Xn`fD6H zK7!L471o!i9m7AbybG4rKzlCWYaEGbvg0aoM#~%Ols7Ezsg(wlj^IxN`#|#@pz;PZ z$2*z^;LD~5etikUTWX~NxkLEVz%0x<{As|h9hwH7wo@q$ z;H)FCoy8-8d`6Tb|8~waiVmo>xDO6D^qEF{3)n$tETWwf1wEh=Bm+7nYH}}WQ%jrg zAx|ywZ)Z%yIM~Ren~3wXu!ar!laDg@z+pqe>G4b?y;m zF50n+vxDm;`E$`?cfq01gLZ@|o-+|JLm>!qiWo=&ls>AnNDGC@caTG&i?M@g10&K2 zV#xW&k$*b_IQ1MpbA~AKE(VZkhp~nu*7QXF!pk$a!68ZAytY|_w6Ju)jU1NP^BU3R z4*7ZOz%6iCP&04c{qhfV`4!Q};@aLK5E59^1Xc6auAAUcpl05>{+YB;Fu#c$3N*=E zY0W~Sp(4(-=AT+6 z%tqi->du@w(*QB;iWU2-Rro*2GbOd24q79qnkXsh4{B~zPu~W z#BhdxAE!sR(976w3=C&Hx;bCA#DXqsVe$YSmwpg*PG2|Y%NlesP`>p66}6zl5J3lh zdv^cu=;nIi9{cbA1ds0XFS?fe`wtT0e&G=N?|=7kP$6mnyIu)wj|{q*-JCB)(8X}s zb3X=ZPt+cmJvU;o+p{GG(?4s_#ctD0%x=z?CFo+f?6HU0lcoi;#{#Q8 zE-D(X#+Q6L1tC{y1WNdHPK4ZCG7)ieNuYvDN1%#NXP|~lXP`lvOJ|^kOJ|^mOGhBm zttFuAJq$nx&Va9EVD#zq6maRBm;t_>1m~D3=zR6&b9gRZR%d2l@aXmw@Mt|*ss}pv z)z$dqaR(hS2G9+N2SDed8()GRfS#kG@FMsMBSZ6v|1YP3?mTP;S^ob(Czx*j!NlKE z!^FVg(`zdDh=rju+ryzFTcu0T1J#_(0zj6<6Nh=!E3|LY=f7nj0_AQO>7>$!8)%` zqAKom)@eOZ$=U3!!Sek^r?bumMvznQgKj?71?y8Nv1$0FT%yEwY>UofgU)OdhmLHY zmuEo2-PIf*j)O%$`0~Q@FDi@v{rBPD=WOX>eXJ(equU*H3)&8b1_p*Sr&bonk|>Yv z?ga2b_KqALmW~3YNcSKscNQzWmczIQ*`NP1kS{DTsC-bF@`*Eo(j7%)Qf0!S-38$k4fj!=eN+U#_Z zk)iw8>rUi7HXhxT93I^_k2(4R+|S8qaXkId**;c z0waJx8y{ei(2XU4n!OeN6H^LwaX<@!4sXkrlO%)=(>ZYHpmsygG8R1+ zXwm6t(&6Z{f${K}GhL3BHVP#gHp(S(Hrgd3Ho7HTHU_0K&7K+@uf>`@HCSE?G<#|= zzUFH7)KGZM((I|h1lH%%eaDlC`@jF6Ab9=vJWVQG|9z&R(o)N#H&Dl?`yhX7JoscZ zPjI#4+36tB&DhBVsz@B0J-{^y#0zJd6Ac(Zo`LE$0P9so)9cuL;y##@j8w*glxs{52W8~m(&0%COnoA*H?Fd?m&5c?zp1~FX&wR z)Z>mOpu_lH$M|$R3OIH#*cg{eI5t!;8kGuq_Bt>fcQoMwS>EX=@Y>SG3?gSzst1+h zhRMn5MA#^li=+0nirJ4lns72OFl=B1g*4>+Ysh{(@Le*Yjv7Zu7&)|9k{+7!i=1a#C3DCifHXwozbZa)J zBj{r8yCA1^pMKH9%D@0_8#Mon;BP^>nfpQW&t(4AEes3{kej(Pk#FWUK)RW`9(ptP zdXVv}K*UmzZT!tYSxYNG4X4ZOpjK70w}t@3B>P(YH*-r@W51bO8+J3d9`2jDZ&xrd zK(FO)W@2DysJ39>Z!H703qcofr**nMFuv5``UrH}Hu&CcZ4e85?>5^p*9W?jMSP?yD|c&X$h74l7pNFXabmV+BdFx^|s?&FpG)(y`ZJ z{|ZnS*|p_lDND^|qw8~WhIIeFA;wZjg+WCC5Q z?dNKIp!Hjwd$+h}Hy;zgN3ZXL=F|razP%|bOpZH1nIG)n7l#|=}yP_ObM--f*# zd>gj!2M^;jFLb$3F2gQ%@a(Sk@a%pJzU3#@F$Q$a&l%%OFF_>{Qv0SW(9)y(X1Ava zC{GoEx-1f)^H+tNt4(-IlHljBwj3x4Mec2QbWa9%AG@77T==(hdbD0D<@e|f4sZnD zm*LU<>ouQGcQdG?>Csyq;CbO%ca}d0F+g_gH2qzye(b$T@HX84|0nw$SqPJw}^rR zT-UMTWwPV9gCMuG94L_k^@_PYdU+kLurPr1cqU%}T?zHV<~}3CYYCXF5kmIGuLq0_ zo#4BknvW<%L(T#9bnr;N^zy+2Mh4J0DC9nAkIoVm1<>FU>_+KsM}yV_m113vmO73q z_rKkcKG6K&XY&ExPDg{+Ql%0Nm6quxYz>u`?xj4(9l@7Z?EpoK52)4FTN%I_%LwYo zpZ7?<@Iq|X|NoGL&~l(u#iMyQD5)@%vO0Djc+KSjO%@kl^iEj(@BjbKV1w7p-JmXT zJ0t;su2nhi(dq19d;pv{I$cx}z-gk>S;7aB>_B_ie7d7KJi3kf_hnmt;umyLN$_pG zRLbMi+Yh>Q#IyUvYZagFe$b^Yp54DZy1PM15t<@BFTV6;KIL)orRT*LKAkZt9>-l& z96){ng^5Kc=zjL@>zz3&8XlklIFDW*m4p}JuNfhyv$C#WEU5vVXj@w5(Ou1f=wJ0F zgNBW0e?4@Uv!#yviu$%?sYIosGuQ*v#m(?&J`xZQN?*;M zpo;h9$x_H2&j&#?_WPh06*DlLIkSoJ<VcR4F`u)kJl ze#urM0+Qwj6^vXUmTdD+#?n5IWM>7BPIge~1qu;(0o3iR(8>P#1;pJ*?JV&5%b?bk ziW#(Z<)Y%yQ0c?q(Oc=^(S5U|pxK_GF59QO(82f{s3HN~d1>Oxznu@1@(h|&R16q= zd&^KND#_oB46O%B4O~FC6N73hHIPQ1UT+1DUP$%c>7t?lHt0p9#Q*>Qk6D|SE`F`n z4C+lOK-79FxOB67G#*RoODmR!x_bJ7wK(|?U*Qiv0;@uH+ zz;J7z2LIFphtF^ZY8?K4Nik64@R>8cP7i!~c_*D?VZa<=b7XwYWPFmS`CzDhx}iDHikf4c=l_FZ z@ur96Mo_?(3Ly1gURHyL0f`#xEKyN-k-i@?)+q*RUV_J(P{um{FfuUgRbT)Qcq*J_ zVdyOOaOfyj;omOk(R`5Ui<9h(>#82GmzO4B}?*8C%?T!4T3ArI}N z$RnTU@Q!?f4C@Aud@_LgTA%?>&_G}_h_QfyfdP~~l0ZZ#h(H?oTnMfePQQo-4Q}Ru zTI&m$85mwCr8OfDefBajFue8ym-fAm;8kXjJ|w@#dC<_OQD?EiOHh9UtP3*sc>+~6 z_OVZ8(AeiJ&@G(SS4;HMntv&msH8Rj(k_umYyPEM!jsng%b>Kj*;|9-bvbC*^mSpg zw+7?uY|d9bdd2wroD^|-N#>VJ#)r|f4irZPxnDkYsaIz z6O?@6ZE<06FM-YRzk|YS4aa5=h5xS=K^&0JJi9v}Y6a6=I=NuHW=7Dk0WHh~xeqiB zfoqJ0f4igAE>ONmvpxih^dI0z{{fElAK*y;VNfa!9FvTE}WAO055 zt+Z*)KSKChKocuz%|9|qD$<&NWR;|)HUG#du}W+HQBtCj*8HQqL@cfOM-_kTd&m$B zs5b|mq<{_OT!)B*hjPG6XSy8)(wZ%DO8GsS4={OjVh-jkh3Ehe=F9{SWPo*KAn5?L z7GGb64CkDI4d)cVhI7)v!#SYkE6qQQOC{4Bn=60-Uo!_x?i0cADRSnjR~45ls*H$j)|8tKR&Rz2y&@ zf2Ncd^0$B%-ZuXXF4yO8xxm1{pnVoHv||lw|A5*^C7j^7EZESFCmRF9OVAX8^*R2Q z?Vvi~XH{NmjF9pq)Wgtd&EK?a6UPp9$Yk-GGK-X^Z?|RAJ>8$~=h%cFe;k9M+ z&w>(}=AXqSyv;vLOO9EeFV!`^^jZpJUMpx|N8-4%fdB&o!*OR5P*`tb1j!sv0L?eP zg%0gJV`5-%vBWo8t7TUSi+s=(wU-SvI~@WT==&;TRH9mEu(Pc-+mxX z`&gP|>!DJf?t_jS84tbyHS3vOyUv2-9QT8+^#xVkj;)9IryPKd|H!4ebk>BJq`6oh zD`87>u|8VL%)k9#T4zm&8TtTFx@-5@)^BwQp!NWI#U<)ukttEaiaG$Kg1zQ)=~P6j zxO7p_mwo4&Kwm3pJWG) z7dt*NGI%6kXgyF@>DkTa!oS@GbZ01ZzJed>O7_<>pwS@l|LiCZWQ01i-YERs)%R92COXMw@G$gK8in#Jaz=>-++b>6hPH6sB?xi`oh26h<|&a73jWkk8aKv#*j6n-VPll zpinF3=x|Xnv~UAQ!?_osA)p?rn*?Z_2s*|C>bMwqw4U_oJ_ibY&}h#KvyY%IPo*@d z-}PD)SutcdD6P{FsvG2~5)}uJ)|0T2BYv0jpurPRx77l&L)~pw=K{bclE5A^7N! zx5F`KALvL-H~5Cx5*4WBp!yZGt^=q2;DMv=LW5>d$bf^9-{k|?{?1AVkQ*L$gH{Tb zD0;O1FXi^=wN*R>8Xl^4@JPPq(S07|pchhS85v&7d$j)d=;akU#KO>h&4b_dyenu@ z3p8$a`h_S119s?Hzt>z*q8Vnq}4}tC>hlL2p zPRO`aSh!<|NAnw`Q7Okgpi;8+K&1?%Me@Qi%~APC+IN%@Dw$F#P&+5RgdIe=6CR@~ zYNzrTRRP{HDl709RRImhs0vSX{ZMbUnY3RJnJHNS9Ab8J0=d!Q;B>KgDs zRa+RuX}AWeWYGqyctHbIJBmRK#!hD|l+h}1G1eLE;n^Lnv4PREJKF#>3?367clZo+ ztm&FpH8G-tRy~7YSokdFw%~ zV>*siA=-_g`M~Bk2CkqRx52|xE*6zO{H?1P7#LhE?fLr_f~(O&4i}3$X!$+W@85sN z?)N_3#SS19;AvNnZcusdqY?nANw0xgDk=e>viwEfYgkPh3~h;kYtsODS5wf%qEZ5~ z)C4+Sg|P-G%>}e}60%sLnSsfN`P2WS*7~KLr~_QySO>V$Wd8pLl|T`oY9dD^0aOZs z#xe~+^CaN$Ol;#?{M!%t^z!c7&BCw~)bvZ!K8Q4qau70(Lc;h~;~vQPRwjtX7~k5z z5@USJw_DJ+n*&sOgGT&(x+TB^UOt_SKAnyNKAnydKAnvLEDQ`josFPjF^^714wp_x z1(yy-6`xK=4VO+w1D6g*&}f&Vl}o3ihf9Ye%F4cjKAoJ91%iRa5}b!X>pGf`fQBZ|cytT$Z)XBEjXgRALF;Zo`nnlCnh*T* z=wwW5y;LHaW+_l2@Z$6VxG5pvsDSBbJnYda2pW0-&!0(vrUy7eK@}EsBE9hqXe`X9 zTM4}4a)}CPRe&pKk?t?w)+ePxFNzQb|6ak!@Y=|=^?!-0W3R)%<{wIBHX!pr<1@z` z4H#XG4;*&{uYv@vee&rHQBimiz8bV9%AW&t&v%P88)&+P-J_H7r2!iQgCqZT85Pf7 z9~CA?{%r?cyFYb*@aW`fKF74{FL7a(-bEeKtpzz>!$(Spzw4gz3)jTeY+QE6acV0a+Tz;L`prGj#5zLqaj+SCx{_Tf#LGkiZm63s=+egI!>_l0xniv%m{-y}f z<%2#d7GQB!sJIP(lLJKD0WAI&R7+aNsJQSqX+Xq1z~Wb-;y(OM0ub>4usGAE1FoAC(BOIA~x5Bp$=x^Z+8B02c3snv=rcbOIutk!F3fs1l?$hrekHM63WL zmI@Lp;cr?15vu@+1%kwC_?vn_Vm;t!1PNQESwjL;r z_vq$#+zD!1@^2UP>2+lC>16M9T9M}1da%UMwe`P8C;tx6>KsRY*W)hTKR^Y9b(*DM ziP?))d*B6x@lr+xSK~{s6&?AvgKp#mWvU&Z(S_HnJGek=m|Oot^&4MmKJnl2`*+9P zi3|)3dqKI#rTc{A9#H0T?ae-)=4gGFziBBb3Y&jhfs)l}NA0sOLBnooj@Ebhn@d4b zAT^DQ3=BIU$?pcp*Qd45zRUoLf%0D(C=r2@Sg!|Hn)OYH{E3&KDfAs_;6!(Wzsa7F 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
Ojl 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

4^ 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

h8VA<}ooUv3yW}-!*k}#t{=I4ehSIwp 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�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

1WW! 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 Bl#u`c From 23c6d5dccbe4eb25efd82645a19e66de201c2de4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 11 Dec 2025 14:49:55 +0000 Subject: [PATCH 041/766] Add `"contextless"` where possible in `core:slice` --- core/slice/slice.odin | 73 ++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 0d0cadefa..8e46e213c 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -41,7 +41,7 @@ to_bytes :: proc "contextless" (s: []$T) -> []byte { Turns a byte slice into a type. */ @(require_results) -to_type :: proc(buf: []u8, $T: typeid) -> (T, bool) #optional_ok { +to_type :: proc "contextless" (buf: []u8, $T: typeid) -> (T, bool) #optional_ok { if len(buf) < size_of(T) { return {}, false } @@ -105,7 +105,7 @@ swap :: proc(array: $T/[]$E, a, b: int) { } } -swap_between :: proc(a, b: $T/[]$E) { +swap_between :: proc "contextless" (a, b: $T/[]$E) #no_bounds_check { n := builtin.min(len(a), len(b)) if n >= 0 { ptr_swap_overlapping(&a[0], &b[0], size_of(E)*n) @@ -122,7 +122,7 @@ reverse :: proc(array: $T/[]$E) { @(require_results) -contains :: proc(array: $T/[]$E, value: E) -> bool where intrinsics.type_is_comparable(E) { +contains :: proc "contextless" (array: $T/[]$E, value: E) -> bool where intrinsics.type_is_comparable(E) { _, found := linear_search(array, value) return found } @@ -156,7 +156,7 @@ Example: assert(index == 1 && found == true) */ @(require_results) -linear_search :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool) +linear_search :: proc "contextless" (array: $A/[]$T, key: T) -> (index: int, found: bool) where intrinsics.type_is_comparable(T) { for x, i in array { if x == key { @@ -219,7 +219,7 @@ Example: assert(index == 1 && found == true) */ @(require_results) -linear_search_reverse :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool) +linear_search_reverse :: proc "contextless" (array: $A/[]$T, key: T) -> (index: int, found: bool) where intrinsics.type_is_comparable(T) { #reverse for x, i in array { if x == key { @@ -327,7 +327,7 @@ binary_search_by :: proc(array: $A/[]$T, key: $K, f: proc(T, K) -> Ordering) -> } @(require_results) -equal :: proc(a, b: $T/[]$E) -> bool where intrinsics.type_is_comparable(E) #no_bounds_check { +equal :: proc "contextless" (a, b: $T/[]$E) -> bool where intrinsics.type_is_comparable(E) #no_bounds_check { if len(a) != len(b) { return false } @@ -355,7 +355,7 @@ equal :: proc(a, b: $T/[]$E) -> bool where intrinsics.type_is_comparable(E) #no_ } @(require_results) -simple_equal :: proc(a, b: $T/[]$E) -> bool where intrinsics.type_is_simple_compare(E) { +simple_equal :: proc "contextless" (a, b: $T/[]$E) -> bool where intrinsics.type_is_simple_compare(E) { if len(a) != len(b) { return false } @@ -370,7 +370,7 @@ simple_equal :: proc(a, b: $T/[]$E) -> bool where intrinsics.type_is_simple_comp slice.prefix_length([]u8{1, 2, 3, 4}, []u8{2, 3, 4}) -> 0 */ @(require_results) -prefix_length :: proc(a, b: $T/[]$E) -> (n: int) where intrinsics.type_is_comparable(E) { +prefix_length :: proc "contextless" (a, b: $T/[]$E) -> (n: int) where intrinsics.type_is_comparable(E) { _len := builtin.min(len(a), len(b)) #no_bounds_check for n < _len && a[n] == b[n] { @@ -380,7 +380,7 @@ prefix_length :: proc(a, b: $T/[]$E) -> (n: int) where intrinsics.type_is_compar } @(require_results) -has_prefix :: proc(array: $T/[]$E, needle: T) -> bool where intrinsics.type_is_comparable(E) { +has_prefix :: proc "contextless" (array: $T/[]$E, needle: T) -> bool where intrinsics.type_is_comparable(E) { n := len(needle) if len(array) >= n { return equal(array[:n], needle) @@ -398,7 +398,7 @@ has_prefix :: proc(array: $T/[]$E, needle: T) -> bool where intrinsics.type_is_c slice.suffix_length([]u8{3, 4, 5}, []u8{3, 5}) -> 1 */ @(require_results) -suffix_length :: proc(a, b: $T/[]$E) -> (n: int) where intrinsics.type_is_comparable(E) { +suffix_length :: proc "contextless" (a, b: $T/[]$E) -> (n: int) where intrinsics.type_is_comparable(E) { len_a, len_b := len(a), len(b) _len := builtin.min(len_a, len_b) @@ -409,7 +409,7 @@ suffix_length :: proc(a, b: $T/[]$E) -> (n: int) where intrinsics.type_is_compar } @(require_results) -has_suffix :: proc(array: $T/[]$E, needle: T) -> bool where intrinsics.type_is_comparable(E) { +has_suffix :: proc "contextless" (array: $T/[]$E, needle: T) -> bool where intrinsics.type_is_comparable(E) { array := array m, n := len(array), len(needle) if m >= n { @@ -418,13 +418,13 @@ has_suffix :: proc(array: $T/[]$E, needle: T) -> bool where intrinsics.type_is_c return false } -zero :: proc(array: $T/[]$E) #no_bounds_check { +zero :: proc "contextless" (array: $T/[]$E) #no_bounds_check { if len(array) > 0 { intrinsics.mem_zero(raw_data(array), size_of(E)*len(array)) } } -fill :: proc(array: $T/[]$E, value: E) #no_bounds_check { +fill :: proc "contextless" (array: $T/[]$E, value: E) #no_bounds_check { if len(array) <= 0 { return } @@ -434,7 +434,7 @@ fill :: proc(array: $T/[]$E, value: E) #no_bounds_check { } } -rotate_left :: proc(array: $T/[]$E, mid: int) { +rotate_left :: proc "contextless" (array: $T/[]$E, mid: int) { n := len(array) m := mid %% n k := n - m @@ -443,11 +443,11 @@ rotate_left :: proc(array: $T/[]$E, mid: int) { p := cast(^E)raw_data(array) ptr_rotate(m, ptr_add(p, m), k) } -rotate_right :: proc(array: $T/[]$E, k: int) { +rotate_right :: proc "contextless" (array: $T/[]$E, k: int) { rotate_left(array, -k) } -swap_with_slice :: proc(a, b: $T/[]$E, loc := #caller_location) { +swap_with_slice :: proc "contextless" (a, b: $T/[]$E, loc := #caller_location) { assert(len(a) == len(b), "miss matching slice lengths", loc) ptr_swap_non_overlapping(raw_data(a), raw_data(b), len(a)*size_of(E)) @@ -480,6 +480,7 @@ clone :: proc(a: $T/[]$E, allocator := context.allocator, loc := #caller_locatio // copies slice into a new dynamic array +@(require_results) clone_to_dynamic :: proc(a: $T/[]$E, allocator := context.allocator, loc := #caller_location) -> ([dynamic]E, runtime.Allocator_Error) #optional_allocator_error { d, err := make([dynamic]E, len(a), allocator, loc) copy(d[:], a) @@ -502,11 +503,11 @@ into_dynamic :: proc(a: $T/[]$E) -> [dynamic]E { @(require_results) -length :: proc(a: $T/[]$E) -> int { +length :: proc "contextless" (a: $T/[]$E) -> int { return len(a) } @(require_results) -is_empty :: proc(a: $T/[]$E) -> bool { +is_empty :: proc "contextless" (a: $T/[]$E) -> bool { return len(a) == 0 } @@ -560,16 +561,16 @@ last_ptr :: proc(array: $T/[]$E) -> ^E { } @(require_results) -get :: proc(array: $T/[]$E, index: int) -> (value: E, ok: bool) { - if uint(index) < len(array) { +get :: proc "contextless" (array: $T/[]$E, index: int) -> (value: E, ok: bool) { + #bounds_check if uint(index) < len(array) { value = array[index] ok = true } return } @(require_results) -get_ptr :: proc(array: $T/[]$E, index: int) -> (value: ^E, ok: bool) { - if uint(index) < len(array) { +get_ptr :: proc "contextless" (array: $T/[]$E, index: int) -> (value: ^E, ok: bool) { + #no_bounds_check if uint(index) < len(array) { value = &array[index] ok = true } @@ -577,7 +578,7 @@ get_ptr :: proc(array: $T/[]$E, index: int) -> (value: ^E, ok: bool) { } @(require_results) -as_ptr :: proc(array: $T/[]$E) -> [^]E { +as_ptr :: proc "contextless" (array: $T/[]$E) -> [^]E { return raw_data(array) } @@ -672,7 +673,7 @@ repeat :: proc(s: $S/[]$U, count: int, allocator := context.allocator) -> (b: S, // 'unique' replaces consecutive runs of equal elements with a single copy. // The procedures modifies the slice in-place and returns the modified slice. @(require_results) -unique :: proc(s: $S/[]$T) -> S where intrinsics.type_is_comparable(T) #no_bounds_check { +unique :: proc "contextless" (s: $S/[]$T) -> S where intrinsics.type_is_comparable(T) #no_bounds_check { if len(s) < 2 { return s } @@ -711,7 +712,7 @@ unique_proc :: proc(s: $S/[]$T, eq: proc(T, T) -> bool) -> S #no_bounds_check { @(require_results) -min :: proc(s: $S/[]$T) -> (res: T, ok: bool) where intrinsics.type_is_ordered(T) #optional_ok { +min :: proc "contextless" (s: $S/[]$T) -> (res: T, ok: bool) where intrinsics.type_is_ordered(T) #optional_ok { if len(s) != 0 { res = s[0] ok = true @@ -722,7 +723,7 @@ min :: proc(s: $S/[]$T) -> (res: T, ok: bool) where intrinsics.type_is_ordered(T return } @(require_results) -max :: proc(s: $S/[]$T) -> (res: T, ok: bool) where intrinsics.type_is_ordered(T) #optional_ok { +max :: proc "contextless" (s: $S/[]$T) -> (res: T, ok: bool) where intrinsics.type_is_ordered(T) #optional_ok { if len(s) != 0 { res = s[0] ok = true @@ -734,7 +735,7 @@ max :: proc(s: $S/[]$T) -> (res: T, ok: bool) where intrinsics.type_is_ordered(T } @(require_results) -min_max :: proc(s: $S/[]$T) -> (min, max: T, ok: bool) where intrinsics.type_is_ordered(T) { +min_max :: proc "contextless" (s: $S/[]$T) -> (min, max: T, ok: bool) where intrinsics.type_is_ordered(T) { if len(s) != 0 { min, max = s[0], s[0] ok = true @@ -748,7 +749,7 @@ min_max :: proc(s: $S/[]$T) -> (min, max: T, ok: bool) where intrinsics.type_is_ // Find the index of the (first) minimum element in a slice. @(require_results) -min_index :: proc(s: $S/[]$T) -> (min_index: int, ok: bool) where intrinsics.type_is_ordered(T) #optional_ok { +min_index :: proc "contextless" (s: $S/[]$T) -> (min_index: int, ok: bool) where intrinsics.type_is_ordered(T) #optional_ok { if len(s) == 0 { return -1, false } @@ -765,7 +766,7 @@ min_index :: proc(s: $S/[]$T) -> (min_index: int, ok: bool) where intrinsics.typ // Find the index of the (first) maximum element in a slice. @(require_results) -max_index :: proc(s: $S/[]$T) -> (max_index: int, ok: bool) where intrinsics.type_is_ordered(T) #optional_ok { +max_index :: proc "contextless" (s: $S/[]$T) -> (max_index: int, ok: bool) where intrinsics.type_is_ordered(T) #optional_ok { if len(s) == 0 { return -1, false } @@ -781,7 +782,7 @@ max_index :: proc(s: $S/[]$T) -> (max_index: int, ok: bool) where intrinsics.typ } @(require_results) -any_of :: proc(s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparable(T) { +any_of :: proc "contextless" (s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparable(T) { for v in s { if v == value { return true @@ -791,7 +792,7 @@ any_of :: proc(s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparable } @(require_results) -none_of :: proc(s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparable(T) { +none_of :: proc "contextless" (s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparable(T) { for v in s { if v == value { return false @@ -801,7 +802,7 @@ none_of :: proc(s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparabl } @(require_results) -all_of :: proc(s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparable(T) { +all_of :: proc "contextless" (s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparable(T) { if len(s) == 0 { return false } @@ -849,7 +850,7 @@ all_of_proc :: proc(s: $S/[]$T, f: proc(T) -> bool) -> bool { @(require_results) -count :: proc(s: $S/[]$T, value: T) -> (n: int) where intrinsics.type_is_comparable(T) { +count :: proc "contextless" (s: $S/[]$T, value: T) -> (n: int) where intrinsics.type_is_comparable(T) { for v in s { if v == value { n += 1 @@ -870,7 +871,7 @@ count_proc :: proc(s: $S/[]$T, f: proc(T) -> bool) -> (n: int) { @(require_results) -dot_product :: proc(a, b: $S/[]$T) -> (r: T, ok: bool) +dot_product :: proc "contextless" (a, b: $S/[]$T) -> (r: T, ok: bool) where intrinsics.type_is_numeric(T) { if len(a) != len(b) { return @@ -884,7 +885,7 @@ dot_product :: proc(a, b: $S/[]$T) -> (r: T, ok: bool) // Convert a pointer to an enumerated array to a slice of the element type @(require_results) -enumerated_array :: proc(ptr: ^$T) -> []intrinsics.type_elem_type(T) +enumerated_array :: proc "contextless" (ptr: ^$T) -> []intrinsics.type_elem_type(T) where intrinsics.type_is_enumerated_array(T) { return ([^]intrinsics.type_elem_type(T))(ptr)[:len(T)] } @@ -893,7 +894,7 @@ enumerated_array :: proc(ptr: ^$T) -> []intrinsics.type_elem_type(T) // e.g.: // bs := slice.enum_slice_to_bitset(my_flag_slice, rl.ConfigFlags) @(require_results) -enum_slice_to_bitset :: proc(enums: []$E, $T: typeid/bit_set[E]) -> (bits: T) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E { +enum_slice_to_bitset :: proc "contextless" (enums: []$E, $T: typeid/bit_set[E]) -> (bits: T) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E { for v in enums { bits += {v} } From ab9a05ed2d2e0eb76ef53709f91c54534aee543a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 11 Dec 2025 14:54:03 +0000 Subject: [PATCH 042/766] Remove `contextless` from `slice.swap_with_slice` --- core/slice/slice.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 8e46e213c..4e3289321 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -447,7 +447,7 @@ rotate_right :: proc "contextless" (array: $T/[]$E, k: int) { rotate_left(array, -k) } -swap_with_slice :: proc "contextless" (a, b: $T/[]$E, loc := #caller_location) { +swap_with_slice :: proc(a, b: $T/[]$E, loc := #caller_location) { assert(len(a) == len(b), "miss matching slice lengths", loc) ptr_swap_non_overlapping(raw_data(a), raw_data(b), len(a)*size_of(E)) From 9bd2186c8a976bc11756630507c7498bcd743158 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 12 Dec 2025 00:35:40 +0000 Subject: [PATCH 043/766] `core:container/xar` --- core/container/xar/xar.odin | 128 ++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 core/container/xar/xar.odin diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin new file mode 100644 index 000000000..48bc97edb --- /dev/null +++ b/core/container/xar/xar.odin @@ -0,0 +1,128 @@ +package container_xar + +@(require) import "core:mem" +@(require) import "base:intrinsics" +@(require) import "base:runtime" + +PLATFORM_BITS :: 8*size_of(uint) +_LOG2_PLATFORM_BITS :: intrinsics.constant_log2(PLATFORM_BITS) + +MAX_SHIFT :: PLATFORM_BITS>>1 + +Xar :: struct($T: typeid, $SHIFT: uint) where 0 < SHIFT, SHIFT <= MAX_SHIFT { + chunks: [(1 << (_LOG2_PLATFORM_BITS - intrinsics.constant_log2(SHIFT))) + 1][^]T, + len: int, + allocator: mem.Allocator, +} + +init :: proc(x: ^$X/Xar($T, $SHIFT), allocator := context.allocator) { + x^ = {allocator = allocator} +} + +destroy :: proc(x: ^$X/Xar($T, $SHIFT)) { + #reverse for c, i in x.chunks { + if c != nil { + n := 1 << (SHIFT + uint(i if i > 0 else 1) - 1) + size_in_bytes := n * size_of(T) + mem.free_with_size(c, size_in_bytes, x.allocator) + } + } + x^ = {} +} + +clear :: proc(x: $X/Xar($T, $SHIFT)) { + x.len = 0 +} + +@(require_results) +meta_get :: #force_inline proc($SHIFT: uint, index: uint) -> (chunk_idx, elem_idx, chunk_cap: uint) { + elem_idx = index + chunk_cap = uint(1) << SHIFT + chunk_idx = 0 + + index_shift := index >> SHIFT + if index_shift > 0 { + N :: 8*size_of(uint)-1 + CLZ :: intrinsics.count_leading_zeros + chunk_idx = N-CLZ(index_shift) // MSB(index_shift) + + chunk_cap = 1 << (chunk_idx + SHIFT) + elem_idx -= chunk_cap + chunk_idx += 1 + } + + return +} + +@(require_results) +get :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: T) #no_bounds_check { + runtime.bounds_check_error_loc(loc, index, x.len) + chunk_idx, elem_idx, _ := meta_get(SHIFT, uint(index)) + return x.chunks[chunk_idx][elem_idx] +} + +@(require_results) +get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: ^T) #no_bounds_check { + runtime.bounds_check_error_loc(loc, index, x.len) + chunk_idx, elem_idx, _ := meta_get(SHIFT, uint(index)) + return &x.chunks[chunk_idx][elem_idx] +} + +set :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, value: T, loc := #caller_location) #no_bounds_check { + runtime.bounds_check_error_loc(loc, index, x.len) + chunk_idx, elem_idx, _ := meta_get(SHIFT, uint(index)) + x.chunks[chunk_idx][elem_idx] = value +} + +append :: proc{push_back_elem, push_back_elems} +push_back :: proc{push_back_elem, push_back_elems} + +push_back_elem :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { + chunk_idx, elem_idx, chunk_cap := meta_get(SHIFT, uint(x.len)) + if x.chunks[chunk_idx] == nil { + x.chunks[chunk_idx] = make([^]T, chunk_cap, x.allocator) or_return + } + x.chunks[chunk_idx][elem_idx] = value + x.len += 1 + n = 1 + return +} + +push_back_elems :: proc(x: ^$X/Xar($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { + for value in values { + n += push_back_elem(x, value, loc) or_return + } + return +} + +pop :: proc(x: ^$X/Xar($T, $SHIFT), loc := #caller_location) -> (val: T) { + assert(x.len > 0, loc=loc) + index := uint(x.len-1) + chunk_idx, elem_idx, _ := meta_get(SHIFT, index) + x.len -= 1 + return x.chunks[chunk_idx][elem_idx] +} + +@(require_results) +pop_safe :: proc(x: ^$X/Xar($T, $SHIFT)) -> (val: T, ok: bool) { + if x.len == 0 { + return + } + index := uint(x.len-1) + chunk_idx, elem_idx, _ := meta_get(SHIFT, index) + x.len -= 1 + + val = x.chunks[chunk_idx][elem_idx] + ok = true + return +} + +unordered_remove :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) { + runtime.bounds_check_error_loc(loc, index, x.len) + n := x.len-1 + if index != n { + end := get(x, n) + set(x, index, end) + } + x.len -= 1 +} \ No newline at end of file From 1e88cd6697b2a0db6e4039bfbaa36905a45f86f2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 12 Dec 2025 00:39:16 +0000 Subject: [PATCH 044/766] Add `container/xar` to `examples/all` --- examples/all/all_main.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index cda04278e..7895b4640 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -24,6 +24,7 @@ package all @(require) import "core:container/intrusive/list" @(require) import "core:container/rbtree" @(require) import "core:container/topological_sort" +@(require) import "core:container/xar" @(require) import "core:crypto" @(require) import "core:crypto/aead" From a2d361f17d75808d21bc2948ce2883dc243dc27d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 12 Dec 2025 00:40:03 +0000 Subject: [PATCH 045/766] Add basic docs --- core/container/xar/xar.odin | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index 48bc97edb..746c77f77 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -1,3 +1,20 @@ +/* + Exponential Array (Xar). + + A fixed inline array of multi-pointers to exponentially growing chunks. + + Xar(T, SHIFT) + + + Size of chunks: + len(chunks[0]) == 1<<(SHIFT+0) + len(chunks[1]) == 1<<(SHIFT+0) + len(chunks[2]) == 1<<(SHIFT+1) + len(chunks[3]) == 1<<(SHIFT+2) + + + For more information: https://azmr.uk/dyn/#exponential-arrayxar +*/ package container_xar @(require) import "core:mem" From 23ddb8dd3f7fb1ed1cd6b1cd11aacdc9cdaccd7d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 12 Dec 2025 01:00:11 +0000 Subject: [PATCH 046/766] Add `push_back_elem_and_get_ptr` --- core/container/xar/xar.odin | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index 746c77f77..29a8c3e00 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -112,6 +112,22 @@ push_back_elems :: proc(x: ^$X/Xar($T, $SHIFT), values: ..T, loc := #caller_loca return } +append_and_get_ptr :: push_back_elem_and_get_ptr + +@(require_results) +push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: mem.Allocator_Error) { + chunk_idx, elem_idx, chunk_cap := meta_get(SHIFT, uint(x.len)) + if x.chunks[chunk_idx] == nil { + x.chunks[chunk_idx] = make([^]T, chunk_cap, x.allocator) or_return + } + x.chunks[chunk_idx][elem_idx] = value + x.len += 1 + n = 1 + ptr = &x.chunks[chunk_idx][elem_idx] + return +} + + pop :: proc(x: ^$X/Xar($T, $SHIFT), loc := #caller_location) -> (val: T) { assert(x.len > 0, loc=loc) index := uint(x.len-1) From d43b00bb10f070a66fff6578cb6abd296e50acaa Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 12 Dec 2025 01:44:31 +0000 Subject: [PATCH 047/766] Add basic docs --- core/container/xar/xar.odin | 87 ++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 20 deletions(-) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index 29a8c3e00..e10033d3e 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -1,17 +1,8 @@ /* Exponential Array (Xar). - A fixed inline array of multi-pointers to exponentially growing chunks. - - Xar(T, SHIFT) - - - Size of chunks: - len(chunks[0]) == 1<<(SHIFT+0) - len(chunks[1]) == 1<<(SHIFT+0) - len(chunks[2]) == 1<<(SHIFT+1) - len(chunks[3]) == 1<<(SHIFT+2) - + A fixed inline array of multi-pointers to exponentially growing chunks, + allowing for stable memory addresses for elements. For more information: https://azmr.uk/dyn/#exponential-arrayxar */ @@ -26,6 +17,18 @@ _LOG2_PLATFORM_BITS :: intrinsics.constant_log2(PLATFORM_BITS) MAX_SHIFT :: PLATFORM_BITS>>1 +/* + An Exponential Array (Xar) is a fixed inline array of multi-pointers to exponentially growing chunks, + allowing for stable memory addresses for elements. + + The chunk length uses as many chunks as much as addressable memory the machine provides. + + Size of chunks: + len(chunks[0]) == 1<<(SHIFT+0) + len(chunks[1]) == 1<<(SHIFT+0) + len(chunks[2]) == 1<<(SHIFT+1) + len(chunks[3]) == 1<<(SHIFT+2) +*/ Xar :: struct($T: typeid, $SHIFT: uint) where 0 < SHIFT, SHIFT <= MAX_SHIFT { chunks: [(1 << (_LOG2_PLATFORM_BITS - intrinsics.constant_log2(SHIFT))) + 1][^]T, len: int, @@ -47,12 +50,30 @@ destroy :: proc(x: ^$X/Xar($T, $SHIFT)) { x^ = {} } +// Resets the array's length to zero. clear :: proc(x: $X/Xar($T, $SHIFT)) { x.len = 0 } +// Returns the length of the exponential-array @(require_results) -meta_get :: #force_inline proc($SHIFT: uint, index: uint) -> (chunk_idx, elem_idx, chunk_cap: uint) { +len :: proc(x: $X/Xar($T, $SHIFT)) -> int { + return x.len +} + +// Returns the number of allocated elements +@(require_results) +cap :: proc(x: $X/Xar($T, $SHIFT)) -> int { + #reverse for c, i in x.chunks { + if c != nil { + return 1 << (SHIFT + uint(i if i > 0 else 1)) + } + } + return 0 +} + +@(require_results) +_meta_get :: #force_inline proc($SHIFT: uint, index: uint) -> (chunk_idx, elem_idx, chunk_cap: uint) { elem_idx = index chunk_cap = uint(1) << SHIFT chunk_idx = 0 @@ -71,31 +92,40 @@ meta_get :: #force_inline proc($SHIFT: uint, index: uint) -> (chunk_idx, elem_id return } +// Gets the element at the index @(require_results) get :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: T) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) - chunk_idx, elem_idx, _ := meta_get(SHIFT, uint(index)) + chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) return x.chunks[chunk_idx][elem_idx] } +// Gets the pointer of the element at the index @(require_results) get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: ^T) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) - chunk_idx, elem_idx, _ := meta_get(SHIFT, uint(index)) + chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) return &x.chunks[chunk_idx][elem_idx] } +// Sets the value at the index set :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, value: T, loc := #caller_location) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) - chunk_idx, elem_idx, _ := meta_get(SHIFT, uint(index)) + chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) x.chunks[chunk_idx][elem_idx] = value } append :: proc{push_back_elem, push_back_elems} push_back :: proc{push_back_elem, push_back_elems} +// `push_back_elem` pushes back (appends) an element to an exponential array push_back_elem :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { - chunk_idx, elem_idx, chunk_cap := meta_get(SHIFT, uint(x.len)) + if x.allocator.procedure == nil { + // to minic `[dynamic]T` behaviour + x.allocator = context.allocator + } + + chunk_idx, elem_idx, chunk_cap := _meta_get(SHIFT, uint(x.len)) if x.chunks[chunk_idx] == nil { x.chunks[chunk_idx] = make([^]T, chunk_cap, x.allocator) or_return } @@ -105,6 +135,7 @@ push_back_elem :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location return } +// `push_back_elems` pushes back (appends) multiple elements to an exponential array push_back_elems :: proc(x: ^$X/Xar($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { for value in values { n += push_back_elem(x, value, loc) or_return @@ -114,9 +145,15 @@ push_back_elems :: proc(x: ^$X/Xar($T, $SHIFT), values: ..T, loc := #caller_loca append_and_get_ptr :: push_back_elem_and_get_ptr +// `push_back_elem` pushes back (appends) an element to an exponential array and returns its pointer @(require_results) push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: mem.Allocator_Error) { - chunk_idx, elem_idx, chunk_cap := meta_get(SHIFT, uint(x.len)) + if x.allocator.procedure == nil { + // to minic `[dynamic]T` behaviour + x.allocator = context.allocator + } + + chunk_idx, elem_idx, chunk_cap := _meta_get(SHIFT, uint(x.len)) if x.chunks[chunk_idx] == nil { x.chunks[chunk_idx] = make([^]T, chunk_cap, x.allocator) or_return } @@ -127,22 +164,26 @@ push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #cal return } - +// `pop` will remove and return the end value of an exponential array `x` and reduces the length of the array by 1. +// +// Note: If the exponential array has no elements (`xar.len(x) == 0`), this procedure will panic. pop :: proc(x: ^$X/Xar($T, $SHIFT), loc := #caller_location) -> (val: T) { assert(x.len > 0, loc=loc) index := uint(x.len-1) - chunk_idx, elem_idx, _ := meta_get(SHIFT, index) + chunk_idx, elem_idx, _ := _meta_get(SHIFT, index) x.len -= 1 return x.chunks[chunk_idx][elem_idx] } +// `pop_safe` trys to remove and return the end value of dynamic array `x` and reduces the length of the array by 1. +// If the operation is not possible, it will return false. @(require_results) pop_safe :: proc(x: ^$X/Xar($T, $SHIFT)) -> (val: T, ok: bool) { if x.len == 0 { return } index := uint(x.len-1) - chunk_idx, elem_idx, _ := meta_get(SHIFT, index) + chunk_idx, elem_idx, _ := _meta_get(SHIFT, index) x.len -= 1 val = x.chunks[chunk_idx][elem_idx] @@ -150,6 +191,12 @@ pop_safe :: proc(x: ^$X/Xar($T, $SHIFT)) -> (val: T, ok: bool) { return } +// `unordered_remove` removed the element at the specified `index`. It does so by replacing the current end value +// with the old value, and reducing the length of the exponential array by 1. +// +// Note: This is an O(1) operation. +// Note: This is currently no procedure that is the equivalent of an "ordered_remove" +// Note: If the index is out of bounds, this procedure will panic. unordered_remove :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) { runtime.bounds_check_error_loc(loc, index, x.len) n := x.len-1 From 7b635c031f8e795bd36d70d9559909f3ad6f8c8a Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Thu, 11 Dec 2025 23:13:38 -0500 Subject: [PATCH 048/766] [tz_unix] added additional search paths to match musl --- core/time/timezone/tz_unix.odin | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/time/timezone/tz_unix.odin b/core/time/timezone/tz_unix.odin index 990e78d41..d940e47be 100644 --- a/core/time/timezone/tz_unix.odin +++ b/core/time/timezone/tz_unix.odin @@ -81,9 +81,15 @@ _region_load :: proc(_reg_str: string, allocator := context.allocator) -> (out_r } defer if _reg_str == "local" { delete(reg_str, allocator) } - db_path := "/usr/share/zoneinfo" - region_path := filepath.join({db_path, reg_str}, allocator) - defer delete(region_path, allocator) + db_paths := []string{"/usr/share/zoneinfo", "/share/zoneinfo", "/etc/zoneinfo"} + for db_path in db_paths { + region_path := filepath.join({db_path, reg_str}, allocator) + defer delete(region_path, allocator) - return load_tzif_file(region_path, reg_str, allocator) + if tz_reg, ok := load_tzif_file(region_path, reg_str, allocator); ok { + return tz_reg, true + } + } + + return nil, false } From a66b84372abf588b7737fe721d7557df56fed17e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 12 Dec 2025 14:41:01 +0000 Subject: [PATCH 049/766] Improve docs and add `Iterator` --- core/container/xar/xar.odin | 326 +++++++++++++++++++++++++++++++++--- 1 file changed, 301 insertions(+), 25 deletions(-) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index e10033d3e..616a05e06 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -1,10 +1,28 @@ /* Exponential Array (Xar). - A fixed inline array of multi-pointers to exponentially growing chunks, - allowing for stable memory addresses for elements. + A dynamically growing array using exponentially-sized chunks, providing stable + memory addresses for all elements. Unlike `[dynamic]T`, elements are never + moved once allocated, making it safe to hold pointers to elements. For more information: https://azmr.uk/dyn/#exponential-arrayxar + + Example: + + import "core:container/xar" + + example :: proc() { + x: xar.Xar(int, 4) + defer xar.destroy(&x) + + xar.push_back(&x, 10) + xar.push_back(&x, 20) + xar.push_back(&x, 30) + + ptr := xar.get_ptr(&x, 1) // ptr remains valid after more push_backs + xar.push_back(&x, 40) + fmt.println(ptr^) // prints 20 + } */ package container_xar @@ -18,16 +36,39 @@ _LOG2_PLATFORM_BITS :: intrinsics.constant_log2(PLATFORM_BITS) MAX_SHIFT :: PLATFORM_BITS>>1 /* - An Exponential Array (Xar) is a fixed inline array of multi-pointers to exponentially growing chunks, - allowing for stable memory addresses for elements. + An Exponential Array with stable element addresses. - The chunk length uses as many chunks as much as addressable memory the machine provides. + Unlike `[dynamic]T` which reallocates and moves elements when growing, `Xar` + allocates separate chunks of exponentially increasing size. This guarantees + that pointers to elements remain valid for the lifetime of the container. - Size of chunks: - len(chunks[0]) == 1<<(SHIFT+0) - len(chunks[1]) == 1<<(SHIFT+0) - len(chunks[2]) == 1<<(SHIFT+1) - len(chunks[3]) == 1<<(SHIFT+2) + Fields: + - `chunks`: Fixed array of multi-pointers to allocated chunks + - `len`: Number of elements currently stored + - `allocator`: Allocator used for chunk allocations + + Type Parameters: + - `T`: The element type + - `SHIFT`: Controls initial chunk size (1 << SHIFT). Must be in range (0, MAX_SHIFT]. + Larger values mean fewer, bigger chunks. Recommended: 4-8. + + Chunk sizes grow as: + - `chunks[0]`: 1 << SHIFT elements + - `chunks[1]`: 1 << SHIFT elements + - `chunks[2]`: 1 << (SHIFT + 1) elements + - `chunks[3]`: 1 << (SHIFT + 2) elements + - `chunks[4]`: 1 << (SHIFT + 3) elements + - ...and so on + + Example: + + import "core:container/xar" + + example :: proc() { + // Xar with initial chunk size of 16 (1 << 4) + x: xar.Xar(My_Struct, 4) + defer xar.destroy(&x) + } */ Xar :: struct($T: typeid, $SHIFT: uint) where 0 < SHIFT, SHIFT <= MAX_SHIFT { chunks: [(1 << (_LOG2_PLATFORM_BITS - intrinsics.constant_log2(SHIFT))) + 1][^]T, @@ -35,10 +76,24 @@ Xar :: struct($T: typeid, $SHIFT: uint) where 0 < SHIFT, SHIFT <= MAX_SHIFT { allocator: mem.Allocator, } + +/* +Initializes an exponential array with the given allocator. + +**Inputs** +- `x`: Pointer to the exponential array to initialize +- `allocator`: Allocator to use for chunk allocations (defaults to context.allocator) +*/ init :: proc(x: ^$X/Xar($T, $SHIFT), allocator := context.allocator) { x^ = {allocator = allocator} } +/* +Frees all allocated chunks and resets the exponential array. + +**Inputs** +- `x`: Pointer to the exponential array to destroy +*/ destroy :: proc(x: ^$X/Xar($T, $SHIFT)) { #reverse for c, i in x.chunks { if c != nil { @@ -50,8 +105,11 @@ destroy :: proc(x: ^$X/Xar($T, $SHIFT)) { x^ = {} } -// Resets the array's length to zero. -clear :: proc(x: $X/Xar($T, $SHIFT)) { +/* +Resets the array's length to zero without freeing memory. +Allocated chunks are retained for reuse. +*/ +clear :: proc(x: ^$X/Xar($T, $SHIFT)) { x.len = 0 } @@ -72,6 +130,7 @@ cap :: proc(x: $X/Xar($T, $SHIFT)) -> int { return 0 } +// Internal: computes chunk index, element index within chunk, and chunk capacity for a given index. @(require_results) _meta_get :: #force_inline proc($SHIFT: uint, index: uint) -> (chunk_idx, elem_idx, chunk_cap: uint) { elem_idx = index @@ -91,8 +150,16 @@ _meta_get :: #force_inline proc($SHIFT: uint, index: uint) -> (chunk_idx, elem_i return } +/* +Get a copy of the element at the specified index. -// Gets the element at the index +**Inputs** +- `x`: Pointer to the exponential array +- `index`: Position of the element (0-indexed) + +**Returns** +- a copy of the element +*/ @(require_results) get :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: T) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) @@ -100,7 +167,38 @@ get :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location return x.chunks[chunk_idx][elem_idx] } -// Gets the pointer of the element at the index +/* +Get a pointer to the element at the specified index. + +The returned pointer remains valid even after additional elements are added, +as long as the element is not removed and the array is not destroyed. + +**Inputs** +- `x`: Pointer to the exponential array +- `index`: Position of the element (0-indexed) + +**Returns** +- a stable pointer to the element + +Example: + + import "core:container/xar" + + get_ptr_example :: proc() { + x: xar.Xar(int, 4) + defer xar.destroy(&x) + + xar.push_back(&x, 100) + ptr := xar.get_ptr(&x, 0) + + // Pointer remains valid after growing + for i in 0..<1000 { + xar.push_back(&x, i) + } + + fmt.println(ptr^) // Still prints 100 + } +*/ @(require_results) get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: ^T) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) @@ -108,7 +206,14 @@ get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_loca return &x.chunks[chunk_idx][elem_idx] } -// Sets the value at the index +/* +Set the element at the specified index to the given value. + +**Inputs** +- `x`: Pointer to the exponential array +- `index`: Position of the element (0-indexed) +- `value`: The value to set +*/ set :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, value: T, loc := #caller_location) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) @@ -118,7 +223,33 @@ set :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, value: T, loc := #calle append :: proc{push_back_elem, push_back_elems} push_back :: proc{push_back_elem, push_back_elems} -// `push_back_elem` pushes back (appends) an element to an exponential array +/* +Append an element to the end of the exponential array. +Allocates a new chunk if necessary. Existing elements aren't moved, and their pointers remain stable. + +**Inputs** +- `x`: Pointer to the exponential array +- `value`: The element to append + +**Returns** +- number of elements added (always 1 on success) +- allocation error if chunk allocation failed + +Example: + + import "core:container/xar" + + push_back_example :: proc() { + x: xar.Xar(string, 4) + defer xar.destroy(&x) + + xar.push_back(&x, "hello") + xar.push_back(&x, "world") + + fmt.println(xar.get(&x, 0)) // hello + fmt.println(xar.get(&x, 1)) // world + } +*/ push_back_elem :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { if x.allocator.procedure == nil { // to minic `[dynamic]T` behaviour @@ -135,7 +266,17 @@ push_back_elem :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location return } -// `push_back_elems` pushes back (appends) multiple elements to an exponential array +/* +Append multiple elements to the end of the exponential array. + +**Inputs** +- `x`: Pointer to the exponential array +- `values`: The elements to append + +**Returns** +- number of elements successfully added +- allocation error if chunk allocation failed (partial append possible) +*/ push_back_elems :: proc(x: ^$X/Xar($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { for value in values { n += push_back_elem(x, value, loc) or_return @@ -144,8 +285,31 @@ push_back_elems :: proc(x: ^$X/Xar($T, $SHIFT), values: ..T, loc := #caller_loca } append_and_get_ptr :: push_back_elem_and_get_ptr +/* +Append an element and return a stable pointer to it. +This is useful when you need to initialize a complex struct in-place or +retain a reference to the newly added element. -// `push_back_elem` pushes back (appends) an element to an exponential array and returns its pointer +**Inputs** +- `x`: Pointer to the exponential array +- `value`: The element to append + +**Returns** +- a stable pointer to the newly added element +- allocation error if chunk allocation failed + +Example: + + import "core:container/xar" + + push_back_and_get_ptr_example :: proc() { + x: xar.Xar(My_Struct, 4) + defer xar.destroy(&x) + + ptr := xar.push_back_elem_and_get_ptr(&x, My_Struct{}) or_else panic("alloc failed") + ptr.field = 42 // Initialize in-place + } +*/ @(require_results) push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: mem.Allocator_Error) { if x.allocator.procedure == nil { @@ -191,12 +355,35 @@ pop_safe :: proc(x: ^$X/Xar($T, $SHIFT)) -> (val: T, ok: bool) { return } -// `unordered_remove` removed the element at the specified `index`. It does so by replacing the current end value -// with the old value, and reducing the length of the exponential array by 1. -// -// Note: This is an O(1) operation. -// Note: This is currently no procedure that is the equivalent of an "ordered_remove" -// Note: If the index is out of bounds, this procedure will panic. +/* + `unordered_remove` removed the element at the specified `index`. It does so by replacing the current end value + with the old value, and reducing the length of the exponential array by 1. + + Note: This is an O(1) operation. + Note: This is currently no procedure that is the equivalent of an "ordered_remove" + Note: If the index is out of bounds, this procedure will panic. + + Note: Pointers to the last element become invalid (it gets moved). Pointers to other elements remain valid. + + Example: + + import "core:encoding/xar" + + unordered_remove_example :: proc() { + x: xar.Xar(int, 4) + defer xar.destroy(&x) + + xar.push_back(&x, 10) + xar.push_back(&x, 20) + xar.push_back(&x, 30) + + xar.unordered_remove(&x, 0) // Removes 10, replaces with 30 + + // Array now contains [30, 20] + fmt.println(xar.get(&x, 0)) // 30 + fmt.println(xar.get(&x, 1)) // 20 + } +*/ unordered_remove :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) { runtime.bounds_check_error_loc(loc, index, x.len) n := x.len-1 @@ -205,4 +392,93 @@ unordered_remove :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #ca set(x, index, end) } x.len -= 1 -} \ No newline at end of file +} + + +/* +Iterator state for traversing a `Xar`. + +Fields: +- `xar`: Pointer to the exponential array being iterated +- `idx`: Current iteration index +*/ +Iterator :: struct($T: typeid, $SHIFT: uint) { + xar: ^Xar(T, SHIFT), + idx: int, +} + +/* +Create an iterator for traversing the exponential array. + +**Inputs** +- `xar`: Pointer to the exponential array + +**Returns** +- an iterator positioned at the start + +Example: + + import "lib:xar" + + iteration_example :: proc() { + x: xar.Xar(int, 4) + defer xar.destroy(&x) + + xar.push_back(&x, 10) + xar.push_back(&x, 20) + xar.push_back(&x, 30) + + it := xar.iterator(&x) + for val in xar.iterate_by_ptr(&it) { + fmt.println(val^) + } + } + +Output: + + 10 + 20 + 30 +*/ +iterator :: proc(xar: ^$X/Xar($T, $SHIFT)) -> Iterator(T, SHIFT) { + return {xar = auto_cast xar, idx = 0} +} + +/* +Advance the iterator and returns the next element. + +**Inputs** +- `it`: Pointer to the iterator + +**Returns** +- current element +- `true` if an element was returned, `false` if iteration is complete +*/ +iterate_by_val :: proc(it: ^Iterator($T, $SHIFT)) -> (val: T, ok: bool) { + if it.idx >= it.xar.len { + return + } + val = get(it.xar, it.idx) + it.idx += 1 + return val, true +} + + +/* +Advance the iterator and returns a pointer to the next element. + +**Inputs** +- `it`: Pointer to the iterator + +**Returns** +- pointer to the current element +- `true` if an element was returned, `false` if iteration is complete +*/ +iterate_by_ptr :: proc(it: ^Iterator($T, $SHIFT)) -> (val: ^T, ok: bool) { + if it.idx >= it.xar.len { + return + } + val = get_ptr(it.xar, it.idx) + it.idx += 1 + return val, true +} From a325ab469fb1367da3f2d37cb7fc15fafd5a1122 Mon Sep 17 00:00:00 2001 From: Felix Salcher Date: Sat, 13 Dec 2025 17:27:32 +0100 Subject: [PATCH 050/766] add timerfd_* syscall wrappers --- core/sys/linux/sys.odin | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index 04305ece1..faeda6f43 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -2992,15 +2992,36 @@ epoll_pwait :: proc(epfd: Fd, events: [^]EPoll_Event, count: i32, timeout: i32, // TODO(flysand): signalfd -// TODO(flysand): timerfd_create +/* + Create Linux file descriptor based timer. + Available since Linux 2.6.25 +*/ +timerfd_create :: proc "contextless" (clock_id: Clock_Id, flags: Open_Flags) -> (Fd, Errno) { + ret := syscall(SYS_timerfd_create, clock_id, transmute(u32)flags) + return errno_unwrap2(ret, Fd) +} // TODO(flysand): eventfd // TODO(flysand): fallocate -// TODO(flysand): timerfd_settime +/* + Arm/disarm the state of the Linux file descriptor based timer. + Available since Linux 2.6.25 +*/ +timerfd_settime :: proc "contextless" (fd: Fd, flags: ITimer_Flags, new_value: ^ITimer_Spec, old_value: ^ITimer_Spec) -> Errno { + ret := syscall(SYS_timerfd_settime, fd, transmute(u32)flags, new_value, old_value) + return Errno(-ret) +} -// TODO(flysand): timerfd_gettime +/* + Get the state of the Linux file descriptor based timer. + Available since Linux 2.6.25 +*/ +timerfd_gettime :: proc "contextless" (fd: Fd, curr_value: ^ITimer_Spec) -> Errno { + ret := syscall(SYS_timerfd_gettime, fd, curr_value) + return Errno(-ret) +} // TODO(flysand): accept4 From fc51998e35d540af2575a102d4ec2e122b4fd928 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 14 Dec 2025 08:20:35 +0000 Subject: [PATCH 051/766] Update kb_text_shape to v2.05 --- vendor/kb_text_shape/lib/kb_text_shape.lib | Bin 852874 -> 853396 bytes vendor/kb_text_shape/src/kb_text_shape.h | 38 +++++++++++++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/vendor/kb_text_shape/lib/kb_text_shape.lib b/vendor/kb_text_shape/lib/kb_text_shape.lib index 000ae09b2f50c6e9b3745a77f0026c67263de59f..6a48e9f876c93957ded931e040cca4e14003a531 100644 GIT binary patch delta 14527 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 2) && - (Second->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) && - kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Rphf, 0, FirstGlyphs[0], 2)) + (Second->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT)) { - OnePastRephIndex = 2; + kbts_glyph Scratch[2]; + Scratch[0] = *FirstGlyphs[0]; + Scratch[1] = *FirstGlyphs[1]; + + if(kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Rphf, 0, Scratch, 2)) + { + OnePastRephIndex = 2; + } } break; case KBTS__REPH_ENCODING_EXPLICIT: if((ScanGlyphIndex >= 3) && (Second->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) && - (Third->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ) && - kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Rphf, 0, FirstGlyphs[0], 3)) + (Third->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ)) { - OnePastRephIndex = 3; + kbts_glyph Scratch[3]; + Scratch[0] = *FirstGlyphs[0]; + Scratch[1] = *FirstGlyphs[1]; + Scratch[2] = *FirstGlyphs[2]; + + if(kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Rphf, 0, Scratch, 3)) + { + OnePastRephIndex = 3; + } } break; } @@ -24068,6 +24084,7 @@ static void kbts__EndCluster(kbts__shape_scratchpad *Scratchpad, kbts_shape_conf kbts_glyph *First = Storage->GlyphSentinel.Next; kbts_glyph *Second = First->Next; if((First->SyllabicPosition == KBTS__SYLLABIC_POSITION_RA_TO_BECOME_REPH) && + kbts__GlyphIsValid(Storage, Second) && (Second->SyllabicPosition != KBTS__SYLLABIC_POSITION_RA_TO_BECOME_REPH)) { kbts__reph_position RephPosition = Config->IndicScriptProperties.RephPosition; @@ -25005,6 +25022,9 @@ KBTS_EXPORT kbts_shape_context *kbts_PlaceShapeContext(kbts_allocator_function * KBTS_MEMSET(Result, 0, sizeof(*Result)); + Result->PermanentArena.Allocator = Allocator; + Result->PermanentArena.AllocatorData = AllocatorData; + Result->FontArena.Allocator = Allocator; Result->FontArena.AllocatorData = AllocatorData; @@ -25014,6 +25034,9 @@ KBTS_EXPORT kbts_shape_context *kbts_PlaceShapeContext(kbts_allocator_function * Result->ScratchArena.Allocator = Allocator; Result->ScratchArena.AllocatorData = AllocatorData; + Result->GlyphStorage.Arena.Allocator = Allocator; + Result->GlyphStorage.Arena.AllocatorData = AllocatorData; + KBTS__DLLIST_SENTINEL_INIT(&Result->FeatureOverrideSentinel); KBTS__DLLIST_SENTINEL_INIT(&Result->FreeFeatureOverrideSentinel); } @@ -25055,6 +25078,7 @@ KBTS_EXPORT void kbts_DestroyShapeContext(kbts_shape_context *Context) { if(Context) { + kbts__FreeArena(&Context->PermanentArena); kbts__FreeArena(&Context->ConfigArena); kbts__FreeArena(&Context->ScratchArena); kbts__FreeArena(&Context->FontArena); From 56876e32da90606671354216ed2fb273b158cc50 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Dec 2025 09:42:08 +0000 Subject: [PATCH 052/766] Present constant array arithmetic error correctly --- src/check_expr.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 470290d49..5fae9ffc2 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4390,6 +4390,10 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ return; } + if (c->proc_name == "main") { + gb_printf_err("HERE! 1 %s\n", type_to_string(x->type)); + } + if (op.kind == Token_Quo && is_type_integer(x->type)) { op.kind = Token_QuoEq; // NOTE(bill): Hack to get division of integers } @@ -4451,7 +4455,7 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ break; } } - } else { + } else if (!is_type_array_like(x->type)) { x->value = exact_binary_operator_value(op.kind, a, b); } From ae314a4c6bd24c450deece492de96d9cae6287f7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Dec 2025 09:43:29 +0000 Subject: [PATCH 053/766] Propagate array arithmetic fix --- src/check_expr.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 5fae9ffc2..83af90280 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4455,7 +4455,10 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ break; } } - } else if (!is_type_array_like(x->type)) { + } else if (is_type_array_like(x->type)) { + x->mode = Addressing_Value; + return; + } else { x->value = exact_binary_operator_value(op.kind, a, b); } From 7d46684030d216f6862c6df0afc3d8371c533b88 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Dec 2025 09:52:54 +0000 Subject: [PATCH 054/766] Correct UAF bugs caused by doing `defer shrink` --- core/odin/parser/file_tags.odin | 35 +++++++++++++++++---------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/core/odin/parser/file_tags.odin b/core/odin/parser/file_tags.odin index 24aea3b9e..669fa5263 100644 --- a/core/odin/parser/file_tags.odin +++ b/core/odin/parser/file_tags.odin @@ -65,12 +65,6 @@ get_build_arch_from_string :: proc(str: string) -> runtime.Odin_Arch_Type { @require_results parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags: File_Tags) { - context.allocator = allocator - - if file.docs == nil && file.tags == nil { - return - } - next_char :: proc(src: string, i: ^int) -> (ch: u8) { if i^ < len(src) { ch = src[i^] @@ -102,15 +96,6 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags } } - build_kinds: [dynamic]Build_Kind - defer shrink(&build_kinds) - - build_project_name_strings: [dynamic]string - defer shrink(&build_project_name_strings) - - build_project_names: [dynamic][]string - defer shrink(&build_project_names) - parse_tag :: proc(text: string, tags: ^File_Tags, build_kinds: ^[dynamic]Build_Kind, build_project_name_strings: ^[dynamic]string, build_project_names: ^[dynamic][]string) { @@ -143,7 +128,7 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags for { skip_whitespace(text, &i) name_start := i - + switch next_char(text, &i) { case 0, '\r', '\n': i -= 1 @@ -155,7 +140,7 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags case: i -= 1 } - + scan_value(text, &i) append(build_project_name_strings, text[name_start:i]) } @@ -220,6 +205,18 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags } } + context.allocator = allocator + + if file.docs == nil && file.tags == nil { + return + } + + build_kinds: [dynamic]Build_Kind + build_project_names: [dynamic][]string + + build_project_name_strings: [dynamic]string + + if file.docs != nil { for comment in file.docs.list { if len(comment.text) < 3 || comment.text[:2] != "//" { @@ -241,6 +238,10 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags parse_tag(text, &tags, &build_kinds, &build_project_name_strings, &build_project_names) } + shrink(&build_kinds) + shrink(&build_project_names) + delete(build_project_name_strings) + tags.build = build_kinds[:] tags.build_project_name = build_project_names[:] From aed11c46192a3634afb43bdcc7514464f99a77b9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Dec 2025 10:19:59 +0000 Subject: [PATCH 055/766] Remove debug string --- src/check_expr.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 83af90280..4a3b38656 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4390,10 +4390,6 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ return; } - if (c->proc_name == "main") { - gb_printf_err("HERE! 1 %s\n", type_to_string(x->type)); - } - if (op.kind == Token_Quo && is_type_integer(x->type)) { op.kind = Token_QuoEq; // NOTE(bill): Hack to get division of integers } From c5a54a0e525b27f67b893253d50751d952d1cb86 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Dec 2025 10:41:50 +0000 Subject: [PATCH 056/766] Do naive compound literal comparison for $ parameters to parapoly procedures --- src/check_expr.cpp | 19 +++++++++++++++++++ src/exact_value.cpp | 19 ++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 4a3b38656..2fe6c0251 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -12103,6 +12103,25 @@ gb_internal bool is_exact_value_zero(ExactValue const &v) { +gb_internal bool compare_exact_values_compound_lit(TokenKind op, ExactValue x, ExactValue y, bool *do_break_) { + ast_node(x_cl, CompoundLit, x.value_compound); + ast_node(y_cl, CompoundLit, y.value_compound); + + if (x_cl->elems.count != y_cl->elems.count) { + if (do_break_) *do_break_ = true; + } + + bool test = op == Token_CmpEq; + + for (isize i = 0; i < x_cl->elems.count; i++) { + Ast *lhs = x_cl->elems[i]; + Ast *rhs = y_cl->elems[i]; + if (compare_exact_values(op, lhs->tav.value, rhs->tav.value) != test) { + return !test; + } + } + return test; +} diff --git a/src/exact_value.cpp b/src/exact_value.cpp index e7077bd5b..f266b8b24 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -947,6 +947,8 @@ gb_internal gb_inline i32 cmp_f64(f64 a, f64 b) { return (a > b) - (a < b); } +gb_internal bool compare_exact_values_compound_lit(TokenKind op, ExactValue x, ExactValue y, bool *do_break_); + gb_internal bool compare_exact_values(TokenKind op, ExactValue x, ExactValue y) { match_exact_values(&x, &y); @@ -1055,9 +1057,24 @@ gb_internal bool compare_exact_values(TokenKind op, ExactValue x, ExactValue y) case Token_NotEq: return x.value_typeid != y.value_typeid; } break; + + case ExactValue_Compound: + if (op != Token_CmpEq && op != Token_NotEq) { + break; + } + + if (x.kind != y.kind) { + break; + } + bool do_break = false; + bool res = compare_exact_values_compound_lit(op, x, y, &do_break); + if (do_break) { + break; + } + return res; } - GB_PANIC("Invalid comparison"); + GB_PANIC("Invalid comparison: %d", x.kind); return false; } From cbe164c596b693bd347c8f3e3182a4f1320b1fad Mon Sep 17 00:00:00 2001 From: blob1807 <12388588+blob1807@users.noreply.github.com> Date: Mon, 15 Dec 2025 20:50:45 +1000 Subject: [PATCH 057/766] `print_i64` fix getting an OOB index fixes https://github.com/odin-lang/Odin/issues/6018 --- base/runtime/print.odin | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/base/runtime/print.odin b/base/runtime/print.odin index 90119c699..4ef142037 100644 --- a/base/runtime/print.odin +++ b/base/runtime/print.odin @@ -184,10 +184,11 @@ print_rune :: #force_no_inline proc "contextless" (r: rune) -> int #no_bounds_ch print_u64 :: #force_no_inline proc "contextless" (x: u64) #no_bounds_check { + b :: u64(10) + u := x + a: [129]byte i := len(a) - b := u64(10) - u := x for u >= b { i -= 1; a[i] = _INTEGER_DIGITS_VAR[u % b] u /= b @@ -199,11 +200,9 @@ print_u64 :: #force_no_inline proc "contextless" (x: u64) #no_bounds_check { print_i64 :: #force_no_inline proc "contextless" (x: i64) #no_bounds_check { - b :: i64(10) - - u := x - neg := u < 0 - u = abs(u) + b :: u64(10) + u := u64(abs(x)) + neg := x < 0 a: [129]byte i := len(a) From 750d99019cb7cbe67326ea151b184c8e97232ecc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Dec 2025 11:21:54 +0000 Subject: [PATCH 058/766] Add `strings.builder_replace` and `strings.builder_replace_all` --- core/strings/builder.odin | 87 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/core/strings/builder.odin b/core/strings/builder.odin index a6d0b24b3..da9b6df27 100644 --- a/core/strings/builder.odin +++ b/core/strings/builder.odin @@ -835,3 +835,90 @@ Returns: write_int :: proc(b: ^Builder, i: int, base: int = 10) -> (n: int) { return write_i64(b, i64(i), base) } + + +/* +Replaces all instances of `old` in the string in a Builder `b` with the `new` string + +*Allocates Using The Allocator On The Builder* + +Inputs: +- b: The input `Builder` +- old: The substring to be replaced +- new: The replacement string + +Returns: +- replaced: The number of replacements +- err: if any allocation errors occurred +*/ +builder_replace_all :: proc(b: ^Builder, old, new: string) -> (replaced: int, err: mem.Allocator_Error) { + return builder_replace(b, old, new, -1) +} + +/* +Replaces n instances of `old` in the string in a Builder `b` with the `new` string + +*Allocates Using The Allocator On The Builder* + +Inputs: +- b: The input `Builder` +- old: The substring to be replaced +- new: The replacement string +- n: The number of instances to replace (if `n < 0`, no limit on the number of replacements) + +Returns: +- replaced: The number of replacements +- err: if any allocation errors occurred +*/ +builder_replace :: proc(b: ^Builder, old, new: string, n: int, loc := #caller_location) -> (replaced: int, err: mem.Allocator_Error) { + if old == new || n == 0 { + return + } + + if m := count(to_string(b^), old); m == 0 { + return + } + + if len(old) == 0 { + for i := 0; i <= len(b.buf); i += len(new)+1 { + if n > 0 && replaced == n { + break + } + + resize(&b.buf, len(b.buf)+len(new), loc) or_return + copy(b.buf[i+len(new):], b.buf[i:]) + copy(b.buf[i:], new) + replaced += 1 + } + } else { + for i := 0; i < len(b.buf); /**/ { + if n > 0 && replaced == n { + break + } + + j := index(string(b.buf[i:]), old) + if j < 0 { + break + } + + if len(new) >= len(old) { + resize(&b.buf, len(b.buf) + len(new)-len(old)) or_return + } + + cur := b.buf[i+j:] + src := cur[len(old):] + dst := cur[len(new):] + copy(dst, src) + copy(cur, new) + + i += j+len(new) + + replaced += 1 + + if len(new) < len(old) { + resize(&b.buf, len(b.buf) + len(new)-len(old)) or_return + } + } + } + return +} \ No newline at end of file From 83dd218cbd1a5b70e9fe567f17eeba7168d5bd79 Mon Sep 17 00:00:00 2001 From: Sylphrena Date: Mon, 15 Dec 2025 17:02:42 +0100 Subject: [PATCH 059/766] Fix minor issues withing `curl` bindings --- vendor/curl/curl.odin | 4 ++-- vendor/curl/curl_multi.odin | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vendor/curl/curl.odin b/vendor/curl/curl.odin index 073927dc6..ce10c443f 100644 --- a/vendor/curl/curl.odin +++ b/vendor/curl/curl.odin @@ -2502,7 +2502,7 @@ foreign lib { * Appends a string to a linked list. If no list exists, it will be created * first. Returns the new list, after appending. */ - slist_append :: proc(list: ^slist, data: [^]byte) -> ^slist --- + slist_append :: proc(list: ^slist, data: cstring) -> ^slist --- /* * NAME curl_slist_free_all() @@ -2932,4 +2932,4 @@ foreign lib { userptr: rawptr) -> code --- -} \ No newline at end of file +} diff --git a/vendor/curl/curl_multi.odin b/vendor/curl/curl_multi.odin index 860c8dbc1..624078684 100644 --- a/vendor/curl/curl_multi.odin +++ b/vendor/curl/curl_multi.odin @@ -410,7 +410,7 @@ foreign lib { * * Returns: NULL on failure, otherwise a CURL **array pointer */ - multi_get_handles :: proc(multi_handle: ^CURLM) -> ^^CURL --- + multi_get_handles :: proc(multi_handle: ^CURLM) -> [^]^CURL --- /* * Name: curl_multi_get_offt() @@ -482,4 +482,4 @@ foreign lib { ufds: [^]waitfd, size: c.uint, fd_count: ^c.uint) -> Mcode --- -} \ No newline at end of file +} From 9d6deb9dbf453c9847abe160cbfb89c5b50f0ba5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Dec 2025 17:05:55 +0000 Subject: [PATCH 060/766] Use `"strong"` linkage on Windows for some glfw procedures --- vendor/glfw/bindings/bindings.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/glfw/bindings/bindings.odin b/vendor/glfw/bindings/bindings.odin index abf6c2150..3f2f08237 100644 --- a/vendor/glfw/bindings/bindings.odin +++ b/vendor/glfw/bindings/bindings.odin @@ -212,9 +212,9 @@ foreign glfw { // Functions added in 3.4, Linux links against system glfw so we define these as weak to be able // to check at runtime if they are available. - @(linkage="weak") + @(linkage="strong" when ODIN_OS == .Windows else "weak") GetPlatform :: proc() -> c.int --- - @(linkage="weak") + @(linkage="strong" when ODIN_OS == .Windows else "weak") PlatformSupported :: proc(platform: c.int) -> b32 --- } From 916ec44ad17e0661e05b12bbc085250fd70d9b82 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Mon, 15 Dec 2025 12:36:54 -0500 Subject: [PATCH 061/766] [tz_unix] add lookup for TZDIR environment variable --- core/time/timezone/tz_unix.odin | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/time/timezone/tz_unix.odin b/core/time/timezone/tz_unix.odin index d940e47be..542e5c4f2 100644 --- a/core/time/timezone/tz_unix.odin +++ b/core/time/timezone/tz_unix.odin @@ -81,6 +81,18 @@ _region_load :: proc(_reg_str: string, allocator := context.allocator) -> (out_r } defer if _reg_str == "local" { delete(reg_str, allocator) } + tzdir_str, tzdir_ok := os.lookup_env("TZDIR", allocator) + defer if tzdir_ok { delete(tzdir_str, allocator) } + + if tzdir_ok { + region_path := filepath.join({tzdir_str, reg_str}, allocator) + defer delete(region_path, allocator) + + if tz_reg, ok := load_tzif_file(region_path, reg_str, allocator); ok { + return tz_reg, true + } + } + db_paths := []string{"/usr/share/zoneinfo", "/share/zoneinfo", "/etc/zoneinfo"} for db_path in db_paths { region_path := filepath.join({db_path, reg_str}, allocator) From 548e4f337306f4032a30b3d1f21b7bfeb1f89cc1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 16 Dec 2025 14:42:40 +0000 Subject: [PATCH 062/766] Add `translate_by_grapheme: bool` field --- core/text/edit/text_edit.odin | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/core/text/edit/text_edit.odin b/core/text/edit/text_edit.odin index 8713f6eff..58e184309 100644 --- a/core/text/edit/text_edit.odin +++ b/core/text/edit/text_edit.odin @@ -24,6 +24,7 @@ State :: struct { up_index, down_index: int, // multi-lines + translate_by_grapheme: bool, // translates by codepoint by default // undo undo: [dynamic]^Undo_State, @@ -302,14 +303,32 @@ translate_position :: proc(s: ^State, t: Translation) -> int { case .End: pos = len(buf) case .Left: - pos -= 1 - for pos >= 0 && is_continuation_byte(buf[pos]) { + if s.translate_by_grapheme { + // TODO(bill): determine if there is a faster way to determine the last grapheme + // rather than iterate across the entire string (which may be very slow) + it := utf8.decode_grapheme_iterator_make(string(buf[:pos])) + g: utf8.Grapheme + for { + _, g = utf8.decode_grapheme_iterate(&it) or_break + } + pos -= max(g.width, 1) + } else { pos -= 1 + for pos >= 0 && is_continuation_byte(buf[pos]) { + pos -= 1 + } } case .Right: - pos += 1 - for pos < len(buf) && is_continuation_byte(buf[pos]) { + if s.translate_by_grapheme { + it := utf8.decode_grapheme_iterator_make(string(buf[pos:])) + + _, g, _ := utf8.decode_grapheme_iterate(&it) + pos += max(g.width, 1) + } else { pos += 1 + for pos < len(buf) && is_continuation_byte(buf[pos]) { + pos += 1 + } } case .Up: pos = s.up_index From a0bcc73663e49611d8ebc88656c1dc6430f73300 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 16 Dec 2025 15:09:21 +0000 Subject: [PATCH 063/766] Only call `get_args()` if `args` is actually used by using an indirect value --- core/os/os2/process.odin | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/os/os2/process.odin b/core/os/os2/process.odin index def561e28..201d4f6e7 100644 --- a/core/os/os2/process.odin +++ b/core/os/os2/process.odin @@ -15,6 +15,9 @@ Arguments to the current process. */ args := get_args() +@(private="file") +internal_args_to_free: []string + @(private="file") get_args :: proc "contextless" () -> []string { context = runtime.default_context() @@ -22,13 +25,16 @@ get_args :: proc "contextless" () -> []string { for rt_arg, i in runtime.args__ { result[i] = string(rt_arg) } + internal_args_to_free = result return result } @(fini, private="file") delete_args :: proc "contextless" () { - context = runtime.default_context() - delete(args, heap_allocator()) + if internal_args_to_free != nil { + context = runtime.default_context() + delete(internal_args_to_free, heap_allocator()) + } } /* From e0e38afe603b14c23b9931a89b4244470907a8ff Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 17 Dec 2025 10:27:28 +0000 Subject: [PATCH 064/766] With `-use-single-module` make some procedures use internal linkage rather than weak linkage --- src/llvm_backend.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 71bca42ab..c38150e31 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -15,6 +15,8 @@ #define LLVM_WEAK_MONOMORPHIZATION (USE_SEPARATE_MODULES && build_context.internal_weak_monomorphization) #endif +#define LLVM_SET_INTERNAL_WEAK_LINKAGE(value) LLVMSetLinkage(value, USE_SEPARATE_MODULES ? LLVMWeakAnyLinkage : LLVMInternalLinkage); + #include "llvm_backend.hpp" #include "llvm_abi.cpp" @@ -170,7 +172,7 @@ gb_internal void lb_correct_entity_linkage(lbGenerator *gen) { if (ec.e->kind == Entity_Variable) { other_global = LLVMGetNamedGlobal(ec.other_module->mod, ec.cname); if (other_global) { - LLVMSetLinkage(other_global, LLVMWeakAnyLinkage); + LLVM_SET_INTERNAL_WEAK_LINKAGE(other_global); if (!ec.e->Variable.is_export && !ec.e->Variable.is_foreign) { LLVMSetVisibility(other_global, LLVMHiddenVisibility); } @@ -178,7 +180,7 @@ gb_internal void lb_correct_entity_linkage(lbGenerator *gen) { } else if (ec.e->kind == Entity_Procedure) { other_global = LLVMGetNamedFunction(ec.other_module->mod, ec.cname); if (other_global) { - LLVMSetLinkage(other_global, LLVMWeakAnyLinkage); + LLVM_SET_INTERNAL_WEAK_LINKAGE(other_global); if (!ec.e->Procedure.is_export && !ec.e->Procedure.is_foreign) { LLVMSetVisibility(other_global, LLVMHiddenVisibility); } @@ -2092,7 +2094,7 @@ gb_internal void lb_create_startup_runtime_generate_body(lbModule *m, lbProcedur lbProcedure *dummy = lb_create_dummy_procedure(m, make_string_c(name), dummy_type); dummy->is_startup = true; LLVMSetVisibility(dummy->value, LLVMHiddenVisibility); - LLVMSetLinkage(dummy->value, LLVMWeakAnyLinkage); + LLVM_SET_INTERNAL_WEAK_LINKAGE(p->value); lb_begin_procedure_body(dummy); lb_init_global_var(m, dummy, e, init_expr, var); @@ -2127,7 +2129,7 @@ gb_internal lbProcedure *lb_create_startup_runtime(lbModule *main_module, lbProc // Make sure shared libraries call their own runtime startup on Linux. LLVMSetVisibility(p->value, LLVMHiddenVisibility); - LLVMSetLinkage(p->value, LLVMWeakAnyLinkage); + LLVM_SET_INTERNAL_WEAK_LINKAGE(p->value); p->global_variables = &global_variables; p->objc_names = objc_names; @@ -2147,7 +2149,7 @@ gb_internal lbProcedure *lb_create_cleanup_runtime(lbModule *main_module) { // C // Make sure shared libraries call their own runtime cleanup on Linux. LLVMSetVisibility(p->value, LLVMHiddenVisibility); - LLVMSetLinkage(p->value, LLVMWeakAnyLinkage); + LLVM_SET_INTERNAL_WEAK_LINKAGE(p->value); lb_begin_procedure_body(p); @@ -3418,7 +3420,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { LLVMSetLinkage(g.value, LLVMDLLExportLinkage); LLVMSetDLLStorageClass(g.value, LLVMDLLExportStorageClass); } else if (!is_foreign) { - LLVMSetLinkage(g.value, USE_SEPARATE_MODULES ? LLVMWeakAnyLinkage : LLVMInternalLinkage); + LLVM_SET_INTERNAL_WEAK_LINKAGE(g.value); } lb_set_linkage_from_entity_flags(m, g.value, e->flags); LLVMSetAlignment(g.value, cast(u32)type_align_of(e->type)); From 32f459e152144f8f44f5bd9c8892b30996da011c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 17 Dec 2025 10:36:42 +0000 Subject: [PATCH 065/766] Change target triple of `freestanding_amd64_win64` to `x86_64-pc-windows-msvc` to fix a bug with LLVM's code generation --- src/build_settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 757df95f7..7160f3721 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -835,7 +835,7 @@ gb_global TargetMetrics target_freestanding_amd64_win64 = { TargetOs_freestanding, TargetArch_amd64, 8, 8, AMD64_MAX_ALIGNMENT, 32, - str_lit("x86_64-pc-none-msvc"), + str_lit("x86_64-pc-windows-msvc"), TargetABI_Win64, }; From 51438ed0c0e6022fe3f000735c0b8feeb146f360 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 17 Dec 2025 10:46:43 +0000 Subject: [PATCH 066/766] Redefine `RUNTIME_LINKAGE` when `-no-entry-point` is set in certain circumstances. --- base/runtime/internal.odin | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index 0e674aca8..ac317fc21 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -7,10 +7,11 @@ import "base:intrinsics" IS_WASM :: ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 @(private) -RUNTIME_LINKAGE :: "strong" when ( - ODIN_USE_SEPARATE_MODULES || - ODIN_BUILD_MODE == .Dynamic || - !ODIN_NO_CRT) else "internal" +RUNTIME_LINKAGE :: "strong" when ODIN_USE_SEPARATE_MODULES else + "internal" when ODIN_NO_ENTRY_POINT && (ODIN_BUILD_MODE == .Static || ODIN_BUILD_MODE == .Dynamic || ODIN_BUILD_MODE == .Object) else + "strong" when ODIN_BUILD_MODE == .Dynamic else + "strong " when !ODIN_NO_CRT else + "internal" RUNTIME_REQUIRE :: false // !ODIN_TILDE @(private) From 3567c64d7a9f8935df5073ec4087649ac9d4a970 Mon Sep 17 00:00:00 2001 From: Laytan Date: Wed, 17 Dec 2025 22:56:08 +0100 Subject: [PATCH 067/766] Fix spacing in RUNTIME_LINKAGE declaration --- base/runtime/internal.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index ac317fc21..8956ae303 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -10,7 +10,7 @@ IS_WASM :: ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 RUNTIME_LINKAGE :: "strong" when ODIN_USE_SEPARATE_MODULES else "internal" when ODIN_NO_ENTRY_POINT && (ODIN_BUILD_MODE == .Static || ODIN_BUILD_MODE == .Dynamic || ODIN_BUILD_MODE == .Object) else "strong" when ODIN_BUILD_MODE == .Dynamic else - "strong " when !ODIN_NO_CRT else + "strong" when !ODIN_NO_CRT else "internal" RUNTIME_REQUIRE :: false // !ODIN_TILDE From a5809d0185dfeb2473f2a3947459b889c4dd5098 Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Thu, 18 Dec 2025 15:04:22 +0100 Subject: [PATCH 068/766] Fix #packed #all_or_none --- src/parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser.cpp b/src/parser.cpp index 06703d643..de5655ce1 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2803,7 +2803,7 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { } is_packed = true; } else if (tag.string == "all_or_none") { - if (is_packed) { + if (is_all_or_none) { syntax_error(tag, "Duplicate struct tag '#%.*s'", LIT(tag.string)); } is_all_or_none = true; From c06fc7da98237f00e1a2905bd5c7039f34199edf Mon Sep 17 00:00:00 2001 From: Xotchkass <78706300+Xotchkass@users.noreply.github.com> Date: Thu, 18 Dec 2025 20:14:31 +0200 Subject: [PATCH 069/766] [core:io/utils] fix buffer size in write_* procs --- core/io/util.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/io/util.odin b/core/io/util.odin index 86a89cfb1..a82a80be0 100644 --- a/core/io/util.odin +++ b/core/io/util.odin @@ -21,12 +21,12 @@ write_ptr_at :: proc(w: Writer_At, p: rawptr, byte_size: int, offset: i64, n_wri } write_u64 :: proc(w: Writer, i: u64, base: int = 10, n_written: ^int = nil) -> (n: int, err: Error) { - buf: [32]byte + buf: [64]byte s := strconv.write_bits(buf[:], i, base, false, 64, strconv.digits, nil) return write_string(w, s, n_written) } write_i64 :: proc(w: Writer, i: i64, base: int = 10, n_written: ^int = nil) -> (n: int, err: Error) { - buf: [32]byte + buf: [65]byte s := strconv.write_bits(buf[:], u64(i), base, true, 64, strconv.digits, nil) return write_string(w, s, n_written) } @@ -39,12 +39,12 @@ write_int :: proc(w: Writer, i: int, base: int = 10, n_written: ^int = nil) -> ( } write_u128 :: proc(w: Writer, i: u128, base: int = 10, n_written: ^int = nil) -> (n: int, err: Error) { - buf: [39]byte + buf: [128]byte s := strconv.write_bits_128(buf[:], i, base, false, 128, strconv.digits, nil) return write_string(w, s, n_written) } write_i128 :: proc(w: Writer, i: i128, base: int = 10, n_written: ^int = nil) -> (n: int, err: Error) { - buf: [40]byte + buf: [129]byte s := strconv.write_bits_128(buf[:], u128(i), base, true, 128, strconv.digits, nil) return write_string(w, s, n_written) } From b97e1fff9e578da0cce277920029b242c639c942 Mon Sep 17 00:00:00 2001 From: Lucas Perlind Date: Fri, 19 Dec 2025 13:34:45 +1100 Subject: [PATCH 070/766] More bindings for darwin --- core/sys/darwin/Foundation/NSApplication.odin | 19 +++++-------- core/sys/darwin/Foundation/NSCursor.odin | 26 ++++++++++++++++++ core/sys/darwin/Foundation/NSEvent.odin | 5 ++++ core/sys/darwin/Foundation/NSObject.odin | 8 +++++- core/sys/darwin/Foundation/NSRunLoop.odin | 27 +++++++++++++++++++ core/sys/darwin/Foundation/NSTimer.odin | 15 +++++++++++ core/sys/darwin/Foundation/NSWindow.odin | 8 ++++++ vendor/darwin/QuartzCore/QuartzCore.odin | 22 +++++++++++++++ 8 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 core/sys/darwin/Foundation/NSCursor.odin create mode 100644 core/sys/darwin/Foundation/NSRunLoop.odin create mode 100644 core/sys/darwin/Foundation/NSTimer.odin diff --git a/core/sys/darwin/Foundation/NSApplication.odin b/core/sys/darwin/Foundation/NSApplication.odin index 2295e46b8..cdda7b3e4 100644 --- a/core/sys/darwin/Foundation/NSApplication.odin +++ b/core/sys/darwin/Foundation/NSApplication.odin @@ -1,21 +1,9 @@ package objc_Foundation -foreign import "system:Foundation.framework" - import "base:intrinsics" import "base:runtime" import "core:strings" -RunLoopMode :: ^String - -@(link_prefix="NS") -foreign Foundation { - RunLoopCommonModes: RunLoopMode - DefaultRunLoopMode: RunLoopMode - EventTrackingRunLoopMode: RunLoopMode - ModalPanelRunLoopMode: RunLoopMode -} - ActivationPolicy :: enum UInteger { Regular = 0, Accessory = 1, @@ -206,6 +194,13 @@ Application_updateWindows :: proc "c" (self: ^Application) { msgSend(nil, self, "updateWindows") } +@(objc_type=Application, objc_name="sendAction") +Application_sendAction :: proc "c" (self: ^Application, action: SEL, to: id, from: id) { + msgSend(nil, self, "sendAction:to:from:", action, to, from) +} + + + @(objc_class="NSRunningApplication") RunningApplication :: struct {using _: Object} diff --git a/core/sys/darwin/Foundation/NSCursor.odin b/core/sys/darwin/Foundation/NSCursor.odin new file mode 100644 index 000000000..ad2decdca --- /dev/null +++ b/core/sys/darwin/Foundation/NSCursor.odin @@ -0,0 +1,26 @@ +package objc_Foundation + +@(objc_class="NSCursor") +Cursor :: struct {using _: Object} + +@(objc_type=Cursor, objc_name="set") +Cursor_set :: proc(self: ^Cursor) { + msgSend(EventType, self, "set") +} +@(objc_type=Cursor, objc_name="currentCursor", objc_is_class_method=true) +Cursor_currentCursor :: proc "c" () -> ^Cursor { + return msgSend(^Cursor, Cursor, "currentCursor") +} +@(objc_type=Cursor, objc_name="IBeamCursor", objc_is_class_method=true) +Cursor_IBeamCursor :: proc "c" () -> ^Cursor { + return msgSend(^Cursor, Cursor, "IBeamCursor") +} +@(objc_type=Cursor, objc_name="arrowCursor", objc_is_class_method=true) +Cursor_arrowCursor :: proc "c" () -> ^Cursor { + return msgSend(^Cursor, Cursor, "arrowCursor") +} +@(objc_type=Cursor, objc_name="pointingHandCursor", objc_is_class_method=true) +Cursor_pointingHandCursor :: proc "c" () -> ^Cursor { + return msgSend(^Cursor, Cursor, "pointingHandCursor") +} + diff --git a/core/sys/darwin/Foundation/NSEvent.odin b/core/sys/darwin/Foundation/NSEvent.odin index 3bd0c1879..952a1726c 100644 --- a/core/sys/darwin/Foundation/NSEvent.odin +++ b/core/sys/darwin/Foundation/NSEvent.odin @@ -334,6 +334,11 @@ Event_locationInWindow :: proc "c" (self: ^Event) -> Point { return msgSend(Point, self, "locationInWindow") } +@(objc_type=Event, objc_name="mouseLocation", objc_is_class_method=true) +Event_mouseLocation :: proc "c" () -> Point { + return msgSend(Point, Event, "mouseLocation") +} + @(objc_type=Event, objc_name="deltaX") Event_deltaX :: proc "c" (self: ^Event) -> Float { diff --git a/core/sys/darwin/Foundation/NSObject.odin b/core/sys/darwin/Foundation/NSObject.odin index 31ece47a1..7a423e757 100644 --- a/core/sys/darwin/Foundation/NSObject.odin +++ b/core/sys/darwin/Foundation/NSObject.odin @@ -81,6 +81,12 @@ debugDescription :: proc "c" (self: ^Object) -> ^String { return nil } + +@(objc_type=Object, objc_name="performSelectorOnMainThread") +performSelectorOnMainThread :: proc "c" (self: ^Object, aSelector: SEL, arg: id, wait: BOOL) { + msgSend(^String, self, "performSelectorOnMainThread:withObject:waitUntilDone:", aSelector, arg, wait) +} + bridgingCast :: proc "c" ($T: typeid, obj: ^Object) where intrinsics.type_is_pointer(T), intrinsics.type_is_subtype_of(T, ^Object) { return (T)(obj) } @@ -88,4 +94,4 @@ bridgingCast :: proc "c" ($T: typeid, obj: ^Object) where intrinsics.type_is_poi @(objc_class="NSCoder") Coder :: struct {using _: Object} -// TODO(bill): Implement all the methods for this massive type \ No newline at end of file +// TODO(bill): Implement all the methods for this massive type diff --git a/core/sys/darwin/Foundation/NSRunLoop.odin b/core/sys/darwin/Foundation/NSRunLoop.odin new file mode 100644 index 000000000..a9c47bd0e --- /dev/null +++ b/core/sys/darwin/Foundation/NSRunLoop.odin @@ -0,0 +1,27 @@ +package objc_Foundation + +foreign import "system:Foundation.framework" + +RunLoopMode :: ^String + +@(link_prefix="NS") +foreign Foundation { + RunLoopCommonModes: RunLoopMode + DefaultRunLoopMode: RunLoopMode + EventTrackingRunLoopMode: RunLoopMode + ModalPanelRunLoopMode: RunLoopMode +} + +@(objc_class="NSRunLoop") +RunLoop :: struct { using _: Object } + +@(objc_type=RunLoop, objc_name="mainRunLoop", objc_is_class_method=true) +RunLoop_mainRunLoop :: proc() -> ^RunLoop { + return msgSend(^RunLoop, RunLoop, "mainRunLoop") +} + +@(objc_type=RunLoop, objc_name="addTimerForMode") +RunLoop_addTimerForMode :: proc(self: ^RunLoop, timer: ^Timer, forMode: RunLoopMode) { + msgSend(nil, self, "addTimer:forMode:", timer, forMode) +} + diff --git a/core/sys/darwin/Foundation/NSTimer.odin b/core/sys/darwin/Foundation/NSTimer.odin new file mode 100644 index 000000000..2edcf34c3 --- /dev/null +++ b/core/sys/darwin/Foundation/NSTimer.odin @@ -0,0 +1,15 @@ +package objc_Foundation + +@(objc_class="NSTimer") +Timer :: struct { using _: Object } + +@(objc_type=Timer, objc_name="scheduledTimerWithTimeIntervalRepeatsBlock", objc_is_class_method=true) +Timer_scheduledTimerWithTimeIntervalRepeatsBlock :: proc(interval: TimeInterval, repeats: BOOL, block: ^Block) -> ^Timer { + return msgSend(^Timer, Timer, "scheduledTimerWithTimeInterval:repeats:block:") +} + +@(objc_type=Timer, objc_name="scheduledTimerWithTimeIntervalTargetSelectorUserInfoRepeat", objc_is_class_method=true) +Timer_scheduledTimerWithTimeIntervalTargetSelectorUserInfoRepeat :: proc(interval: TimeInterval, aTarget: id, aSelector: SEL, userInfo: id, repeats: BOOL) -> ^Timer { + return msgSend(^Timer, Timer, "scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:", interval, aTarget, aSelector, userInfo, repeats) +} + diff --git a/core/sys/darwin/Foundation/NSWindow.odin b/core/sys/darwin/Foundation/NSWindow.odin index 8317c7bb1..f39faca0a 100644 --- a/core/sys/darwin/Foundation/NSWindow.odin +++ b/core/sys/darwin/Foundation/NSWindow.odin @@ -699,6 +699,14 @@ View_convertPointFromView :: proc "c" (self: ^View, point: Point, view: ^View) - View_addSubview :: proc "c" (self: ^View, view: ^View) { msgSend(nil, self, "addSubview:", view) } +@(objc_type=View, objc_name="isFlipped") +View_isFlipped :: proc "c" (self: ^View) -> BOOL { + return msgSend(BOOL, self, "isFlipped") +} +@(objc_type=View, objc_name="setIsFlipped") +View_setIsFlipped :: proc "c" (self: ^View, flipped: BOOL) { + msgSend(nil, self, "setIsFlipped:", flipped) +} @(objc_class="NSWindow") Window :: struct {using _: Responder} diff --git a/vendor/darwin/QuartzCore/QuartzCore.odin b/vendor/darwin/QuartzCore/QuartzCore.odin index 0e54b3d30..64e8e66d3 100644 --- a/vendor/darwin/QuartzCore/QuartzCore.odin +++ b/vendor/darwin/QuartzCore/QuartzCore.odin @@ -47,6 +47,10 @@ MetalLayer_pixelFormat :: proc "c" (self: ^MetalLayer) -> MTL.PixelFormat { MetalLayer_setPixelFormat :: proc "c" (self: ^MetalLayer, pixelFormat: MTL.PixelFormat) { msgSend(nil, self, "setPixelFormat:", pixelFormat) } +@(objc_type=MetalLayer, objc_name="setColorSpace") +MetalLayer_setColorSpace :: proc "c" (self: ^MetalLayer, colorspace: NS.id) { + msgSend(nil, self, "setColorspace:", colorspace) +} @(objc_type=MetalLayer, objc_name="framebufferOnly") MetalLayer_framebufferOnly :: proc "c" (self: ^MetalLayer) -> NS.BOOL { @@ -126,3 +130,21 @@ MetalDrawable_addPresentedHandler :: proc "c" (self: ^MetalDrawable, block: Draw msgSend(nil, self, "addPresentedHandler:", block) } +@(objc_class="CATransaction") +Transaction :: struct { using _: NS.Object } + +@(objc_type=Transaction, objc_name="begin", objc_is_class_method=true) +transaction_begin :: proc() { + msgSend(nil, Transaction, "begin") +} + +@(objc_type=Transaction, objc_name="commit", objc_is_class_method=true) +transaction_commit :: proc() { + msgSend(nil, Transaction, "commit") +} + +@(objc_type=Transaction, objc_name="flush", objc_is_class_method=true) +transaction_flush :: proc() { + msgSend(nil, Transaction, "flush") +} + From 205bead9d22c9166c1b55bbb13bc7c745affb4f1 Mon Sep 17 00:00:00 2001 From: Sylphrena Date: Fri, 19 Dec 2025 15:54:56 +0100 Subject: [PATCH 071/766] Add @builtin to missing builtin procedure group procs --- base/runtime/core_builtin.odin | 13 ++++++++++--- base/runtime/core_builtin_soa.odin | 5 +++-- base/runtime/internal.odin | 6 +++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 9f3fcbf9a..6fecbaad9 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -267,7 +267,10 @@ non_zero_resize :: proc{ // Shrinks the capacity of a dynamic array or map down to the current length, or the given capacity. @builtin -shrink :: proc{shrink_dynamic_array, shrink_map} +shrink :: proc{ + shrink_dynamic_array, + shrink_map, +} // `free` will try to free the passed pointer, with the given `allocator` if the allocator supports this operation. @builtin @@ -794,7 +797,11 @@ inject_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, ar } // `inject_at` injects something into a dynamic array at a specified index and moves the previous elements after that index "across" -@builtin inject_at :: proc{inject_at_elem, inject_at_elems, inject_at_elem_string} +@builtin inject_at :: proc{ + inject_at_elem, + inject_at_elems, + inject_at_elem_string, +} @@ -861,7 +868,6 @@ assign_at :: proc{ - // `clear_dynamic_array` will set the length of a passed dynamic array to `0` // // Note: Prefer the procedure group `clear`. @@ -1000,6 +1006,7 @@ non_zero_resize_dynamic_array :: proc(array: ^$T/[dynamic]$E, #any_int length: i // If `len(array) < new_cap`, then `len(array)` will be left unchanged. // // Note: Prefer the procedure group `shrink` +@builtin shrink_dynamic_array :: proc(array: ^$T/[dynamic]$E, #any_int new_cap := -1, loc := #caller_location) -> (did_shrink: bool, err: Allocator_Error) { return _shrink_dynamic_array((^Raw_Dynamic_Array)(array), size_of(E), align_of(E), new_cap, loc) } diff --git a/base/runtime/core_builtin_soa.odin b/base/runtime/core_builtin_soa.odin index 0ccc8fd9b..5078b85d0 100644 --- a/base/runtime/core_builtin_soa.odin +++ b/base/runtime/core_builtin_soa.odin @@ -615,7 +615,7 @@ inject_at_elems_soa :: proc(array: ^$T/#soa[dynamic]$E, #any_int index: int, #no // `inject_at_soa` injects something into a dynamic SOA array at a specified index and moves the previous elements after that index "across" @builtin inject_at_soa :: proc{inject_at_elem_soa, inject_at_elems_soa} - +@builtin delete_soa_slice :: proc(array: $T/#soa[]$E, allocator := context.allocator, loc := #caller_location) -> Allocator_Error { field_count :: len(E) when intrinsics.type_is_array(E) else intrinsics.type_struct_field_count(E) when field_count != 0 { @@ -626,6 +626,7 @@ delete_soa_slice :: proc(array: $T/#soa[]$E, allocator := context.allocator, loc return nil } +@builtin delete_soa_dynamic_array :: proc(array: $T/#soa[dynamic]$E, loc := #caller_location) -> Allocator_Error { field_count :: len(E) when intrinsics.type_is_array(E) else intrinsics.type_struct_field_count(E) when field_count != 0 { @@ -644,7 +645,7 @@ delete_soa :: proc{ delete_soa_dynamic_array, } - +@builtin clear_soa_dynamic_array :: proc(array: ^$T/#soa[dynamic]$E) { field_count :: len(E) when intrinsics.type_is_array(E) else intrinsics.type_struct_field_count(E) when field_count != 0 { diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index 8956ae303..cf96098b8 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -148,6 +148,7 @@ mem_alloc_non_zeroed :: #force_no_inline proc(size: int, alignment: int = DEFAUL return allocator.procedure(allocator.data, .Alloc_Non_Zeroed, size, alignment, nil, 0, loc) } +@builtin mem_free :: #force_no_inline proc(ptr: rawptr, allocator := context.allocator, loc := #caller_location) -> Allocator_Error { if ptr == nil || allocator.procedure == nil { return nil @@ -172,7 +173,7 @@ mem_free_bytes :: #force_no_inline proc(bytes: []byte, allocator := context.allo return err } - +@builtin mem_free_all :: #force_no_inline proc(allocator := context.allocator, loc := #caller_location) -> (err: Allocator_Error) { if allocator.procedure != nil { _, err = allocator.procedure(allocator.data, .Free_All, 0, 0, nil, 0, loc) @@ -341,7 +342,7 @@ memory_compare :: proc "contextless" (x, y: rawptr, n: int) -> int #no_bounds_ch case y == nil: return +1 } a, b := cast([^]byte)x, cast([^]byte)y - + n := uint(n) i := uint(0) m := uint(0) @@ -1409,4 +1410,3 @@ when .Address in ODIN_SANITIZER_FLAGS { __asan_unpoison_memory_region :: proc "system" (address: rawptr, size: uint) --- } } - From 70affd7e4484a8054865bea88f4e4c526652d994 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 19 Dec 2025 16:23:48 +0000 Subject: [PATCH 072/766] Disable global variable initialization into separate functions to circumvent an LLVM bug --- src/llvm_backend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index c38150e31..1cde65640 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2085,7 +2085,7 @@ gb_internal void lb_create_startup_runtime_generate_body(lbModule *m, lbProcedur continue; } - if (type_size_of(e->type) > 8) { + if (false && type_size_of(e->type) > 8) { String ename = lb_get_entity_name(m, e); gbString name = gb_string_make(permanent_allocator(), ""); name = gb_string_appendc(name, "__$startup$"); From 30e2875396ff16a77852ce7752dfc4fd7f829b09 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Sat, 20 Dec 2025 00:54:57 -0500 Subject: [PATCH 073/766] Fix automatic objc_msgSend on static methods not resolving aliased types. --- src/llvm_backend_utility.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 33ad2ee8d..9ddbd1f9c 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -2868,9 +2868,13 @@ gb_internal lbValue lb_handle_objc_auto_send(lbProcedure *p, Ast *expr, Sliceexpr->tav.mode == Addressing_Type && se->expr->tav.type->kind == Type_Named); objc_class = entity_from_expr(se->expr); - GB_ASSERT(objc_class); GB_ASSERT(objc_class->kind == Entity_TypeName); + + if (objc_class->TypeName.is_type_alias) { + objc_class = objc_class->type->Named.type_name; + } + GB_ASSERT(objc_class->TypeName.objc_class_name != ""); } From ca1bb09e97555c6324a1c86720ee9b666a73de71 Mon Sep 17 00:00:00 2001 From: laytan Date: Sat, 20 Dec 2025 18:31:48 +0100 Subject: [PATCH 074/766] os/os2: fix stale errors on windows when reading from console --- core/os/os2/file_windows.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/os/os2/file_windows.odin b/core/os/os2/file_windows.odin index 0d2f28642..22574ab2f 100644 --- a/core/os/os2/file_windows.odin +++ b/core/os/os2/file_windows.odin @@ -378,6 +378,7 @@ _read_internal :: proc(f: ^File_Impl, p: []byte) -> (n: i64, err: Error) { if cerr != nil { return i64(total_read), cerr } + ok = true } else { ok = win32.ReadFile(handle, &p[total_read], to_read, &single_read_length, nil) } From 45a3cfa24578f539ee61fff9f32355b8964a69b4 Mon Sep 17 00:00:00 2001 From: laytan Date: Sat, 20 Dec 2025 19:33:17 +0100 Subject: [PATCH 075/766] os/os2: better fix for the stale errors --- core/os/os2/file_windows.odin | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/core/os/os2/file_windows.odin b/core/os/os2/file_windows.odin index 22574ab2f..7c075b7b1 100644 --- a/core/os/os2/file_windows.odin +++ b/core/os/os2/file_windows.odin @@ -364,34 +364,30 @@ _read_internal :: proc(f: ^File_Impl, p: []byte) -> (n: i64, err: Error) { handle := _handle(&f.file) - single_read_length: win32.DWORD total_read: int sync.shared_guard(&f.rw_mutex) // multiple readers if sync.guard(&f.p_mutex) { to_read := min(win32.DWORD(length), MAX_RW) - ok: win32.BOOL - if f.kind == .Console { - n, cerr := read_console(handle, p[total_read:][:to_read]) - total_read += n - if cerr != nil { - return i64(total_read), cerr + switch f.kind { + case .Console: + total_read, err = read_console(handle, p[total_read:][:to_read]) + case .Pipe, .File: + single_read_length: win32.DWORD + ok := win32.ReadFile(handle, &p[total_read], to_read, &single_read_length, nil) + if ok { + total_read += int(single_read_length) + } else { + err = _get_platform_error() } - ok = true - } else { - ok = win32.ReadFile(handle, &p[total_read], to_read, &single_read_length, nil) } + } - if single_read_length > 0 && ok { - total_read += int(single_read_length) - } else if single_read_length == 0 && ok { - // ok and 0 bytes means EOF: - // https://learn.microsoft.com/en-us/windows/win32/fileio/testing-for-the-end-of-a-file - err = .EOF - } else { - err = _get_platform_error() - } + if total_read == 0 && err == nil { + // ok and 0 bytes means EOF: + // https://learn.microsoft.com/en-us/windows/win32/fileio/testing-for-the-end-of-a-file + err = .EOF } return i64(total_read), err From 67177db0a8e20e262c05e138ea10b7162da1a30f Mon Sep 17 00:00:00 2001 From: laytan Date: Sat, 20 Dec 2025 20:09:19 +0100 Subject: [PATCH 076/766] os/os2: use ReadFile for Console reads too, at least for now --- core/os/os2/file_windows.odin | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/os/os2/file_windows.odin b/core/os/os2/file_windows.odin index 7c075b7b1..9a969f07e 100644 --- a/core/os/os2/file_windows.odin +++ b/core/os/os2/file_windows.odin @@ -372,7 +372,10 @@ _read_internal :: proc(f: ^File_Impl, p: []byte) -> (n: i64, err: Error) { to_read := min(win32.DWORD(length), MAX_RW) switch f.kind { case .Console: - total_read, err = read_console(handle, p[total_read:][:to_read]) + // NOTE(laytan): at least for now, just use ReadFile, it seems to work fine, + // but, there may be issues with certain situations that we need to get reproductions for. + // total_read, err = read_console(handle, p[total_read:][:to_read]) + fallthrough case .Pipe, .File: single_read_length: win32.DWORD ok := win32.ReadFile(handle, &p[total_read], to_read, &single_read_length, nil) From eda6e64639fcbbc0849a413d9cc22f7d8d9107f9 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Sat, 20 Dec 2025 16:55:06 -0500 Subject: [PATCH 077/766] Fix nfds_t alias for Linux --- core/sys/posix/poll.odin | 2 +- tests/core/sys/posix/structs/structs.c | 1 + tests/core/sys/posix/structs/structs.odin | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/sys/posix/poll.odin b/core/sys/posix/poll.odin index a9e582b51..bb400c5a9 100644 --- a/core/sys/posix/poll.odin +++ b/core/sys/posix/poll.odin @@ -25,7 +25,7 @@ foreign lib { poll :: proc(fds: [^]pollfd, nfds: nfds_t, timeout: c.int) -> c.int --- } -when ODIN_OS == .Haiku { +when ODIN_OS == .Haiku || ODIN_OS == .Linux { nfds_t :: c.ulong } else { nfds_t :: c.uint diff --git a/tests/core/sys/posix/structs/structs.c b/tests/core/sys/posix/structs/structs.c index ac771057e..6bb7df29e 100644 --- a/tests/core/sys/posix/structs/structs.c +++ b/tests/core/sys/posix/structs/structs.c @@ -74,6 +74,7 @@ int main(int argc, char *argv[]) printf("ai_canonname %zu\n", offsetof(struct addrinfo, ai_canonname)); printf("pollfd %zu %zu\n", sizeof(struct pollfd), _Alignof(struct pollfd)); + printf("nfds_t %zu %zu\n", sizeof(nfds_t), _Alignof(nfds_t)); printf("passwd %zu %zu\n", sizeof(struct passwd), _Alignof(struct passwd)); diff --git a/tests/core/sys/posix/structs/structs.odin b/tests/core/sys/posix/structs/structs.odin index 55369e386..64833c437 100644 --- a/tests/core/sys/posix/structs/structs.odin +++ b/tests/core/sys/posix/structs/structs.odin @@ -41,6 +41,8 @@ main :: proc() { fmt.println("ai_canonname", offset_of(posix.addrinfo, ai_canonname)) fmt.println("pollfd", size_of(posix.pollfd), align_of(posix.pollfd)) + fmt.println("nfds_t", size_of(posix.nfds_t), align_of(posix.nfds_t)) + fmt.println("passwd", size_of(posix.passwd), align_of(posix.passwd)) when ODIN_OS != .Haiku { From d139c72fc24fdb574861ac22fc11b91de944b2a4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 21 Dec 2025 11:53:44 +0000 Subject: [PATCH 078/766] Make `using` as a statement an opt-in with `#+feature using-stmt` --- core/compress/zlib/zlib.odin | 2 +- core/image/netpbm/netpbm.odin | 34 ++++++++++++++++----------------- core/image/png/png.odin | 2 +- examples/demo/demo.odin | 1 + src/build_settings.cpp | 5 +++++ src/check_stmt.cpp | 8 +++++--- src/check_type.cpp | 11 +++++++---- src/parser.cpp | 2 ++ vendor/fontstash/fontstash.odin | 2 +- 9 files changed, 39 insertions(+), 28 deletions(-) diff --git a/core/compress/zlib/zlib.odin b/core/compress/zlib/zlib.odin index b9189c1f1..e484a4958 100644 --- a/core/compress/zlib/zlib.odin +++ b/core/compress/zlib/zlib.odin @@ -1,4 +1,4 @@ -#+vet !using-param +#+feature using-stmt package compress_zlib /* diff --git a/core/image/netpbm/netpbm.odin b/core/image/netpbm/netpbm.odin index 25e0228b5..6a30d135a 100644 --- a/core/image/netpbm/netpbm.odin +++ b/core/image/netpbm/netpbm.odin @@ -1,4 +1,3 @@ -#+vet !using-stmt package netpbm import "core:bytes" @@ -73,8 +72,7 @@ save_to_buffer :: proc(img: ^Image, custom_info: Info = {}, allocator := context } } - // using info so we can just talk about the header - using info + header := &info.header // validation if header.format in (PBM + PGM + Formats{.Pf}) && img.channels != 1 \ @@ -664,14 +662,14 @@ autoselect_pbm_format_from_image :: proc(img: ^Image, prefer_binary := true, for ASCII :: Formats{.P1, .P2, .P3} */ - using res.header + h := &res.header - width = img.width - height = img.height - channels = img.channels - depth = img.depth - maxval = 255 if img.depth == 8 else 65535 - little_endian = true if ODIN_ENDIAN == .Little else false + h.width = img.width + h.height = img.height + h.channels = img.channels + h.depth = img.depth + h.maxval = 255 if img.depth == 8 else 65535 + h.little_endian = ODIN_ENDIAN == .Little // Assume we'll find a suitable format ok = true @@ -680,37 +678,37 @@ autoselect_pbm_format_from_image :: proc(img: ^Image, prefer_binary := true, for case 1: // Must be Portable Float Map if img.depth == 32 { - format = .Pf + h.format = .Pf return } if force_black_and_white { // Portable Bit Map - format = .P4 if prefer_binary else .P1 - maxval = 1 + h.format = .P4 if prefer_binary else .P1 + h.maxval = 1 return } else { // Portable Gray Map - format = .P5 if prefer_binary else .P2 + h.format = .P5 if prefer_binary else .P2 return } case 3: // Must be Portable Float Map if img.depth == 32 { - format = .PF + h.format = .PF return } // Portable Pixel Map - format = .P6 if prefer_binary else .P3 + h.format = .P6 if prefer_binary else .P3 return case: // Portable Arbitrary Map if img.depth == 8 || img.depth == 16 { - format = .P7 - scale = pfm_scale + h.format = .P7 + h.scale = pfm_scale return } } diff --git a/core/image/png/png.odin b/core/image/png/png.odin index 1a7240bad..0170d3168 100644 --- a/core/image/png/png.odin +++ b/core/image/png/png.odin @@ -1,4 +1,4 @@ -#+vet !using-stmt +#+feature using-stmt package png /* diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index 1ea06d096..d4f0d9d4b 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -1,5 +1,6 @@ #+vet !using-stmt !using-param #+feature dynamic-literals +#+feature using-stmt package main import "core:fmt" diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 7160f3721..12631c403 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -360,6 +360,8 @@ enum OptInFeatureFlags : u64 { OptInFeatureFlag_IntegerDivisionByZero_Self = 1u<<4, OptInFeatureFlag_IntegerDivisionByZero_AllBits = 1u<<5, + OptInFeatureFlag_UsingStmt = 1u<<6, + OptInFeatureFlag_IntegerDivisionByZero_ALL = OptInFeatureFlag_IntegerDivisionByZero_Trap| OptInFeatureFlag_IntegerDivisionByZero_Zero| @@ -384,6 +386,9 @@ u64 get_feature_flag_from_name(String const &name) { if (name == "integer-division-by-zero:all-bits") { return OptInFeatureFlag_IntegerDivisionByZero_AllBits; } + if (name == "using-stmt") { + return OptInFeatureFlag_UsingStmt; + } if (name == "global-context") { diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 835f0162a..26860db4f 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -2943,10 +2943,12 @@ gb_internal void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) error(us->token, "Empty 'using' list"); return; } - if (check_vet_flags(node) & VetFlag_UsingStmt) { + + u64 feature_flags = check_feature_flags(ctx, node); + if ((feature_flags & OptInFeatureFlag_UsingStmt) == 0) { ERROR_BLOCK(); - error(node, "'using' as a statement is not allowed when '-vet' or '-vet-using' is applied"); - error_line("\t'using' is considered bad practice to use as a statement outside of immediate refactoring\n"); + error(node, "'using' has been disallowed as it is considered bad practice to use as a statement outside of immediate refactoring"); + error_line("\tIt you do require it for refactoring purposes or legacy code, it can be enabled on a per-file basis with '#+feature using-stmt'\n"); } for (Ast *expr : us->list) { diff --git a/src/check_type.cpp b/src/check_type.cpp index af07efd8f..2452cc6d0 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1830,11 +1830,14 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para Type *specialization = nullptr; bool is_using = (p->flags&FieldFlag_using) != 0; - if ((check_vet_flags(param) & VetFlag_UsingParam) && is_using) { - ERROR_BLOCK(); - error(param, "'using' on a procedure parameter is not allowed when '-vet' or '-vet-using-param' is applied"); - error_line("\t'using' is considered bad practice to use as a statement/procedure parameter outside of immediate refactoring\n"); + + u64 feature_flags = check_feature_flags(ctx, param); + + if (is_using && (feature_flags & OptInFeatureFlag_UsingStmt) == 0) { + ERROR_BLOCK(); + error(param, "'using' has been disallowed as it is considered bad practice to use as a statement/procedure parameter outside of immediate refactoring"); + error_line("\tIt you do require it for refactoring purposes or legacy code, it can be enabled on a per-file basis with '#+feature using-stmt'\n"); } if (type_expr == nullptr) { diff --git a/src/parser.cpp b/src/parser.cpp index 06703d643..e27e184d0 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6449,6 +6449,8 @@ gb_internal u64 parse_feature_tag(Token token_for_pos, String s) { syntax_error(token_for_pos, "Invalid feature flag name: %.*s", LIT(p)); error_line("\tExpected one of the following\n"); error_line("\tdynamic-literals\n"); + error_line("\tglobal-context\n"); + error_line("\tusing-stmt\n"); error_line("\tinteger-division-by-zero:trap\n"); error_line("\tinteger-division-by-zero:zero\n"); error_line("\tinteger-division-by-zero:self\n"); diff --git a/vendor/fontstash/fontstash.odin b/vendor/fontstash/fontstash.odin index 772e379f0..33e7b68de 100644 --- a/vendor/fontstash/fontstash.odin +++ b/vendor/fontstash/fontstash.odin @@ -1,5 +1,5 @@ // An Odin-native source port of [[ Fontstash ; https://github.com/memononen/fontstash ]]. -#+vet !using-param +#+feature using-stmt package fontstash import "base:runtime" From 8b745c3909a3482aebe27998d8b870286e448e35 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 21 Dec 2025 13:14:38 +0000 Subject: [PATCH 079/766] Remove `using` use in thread_other.odin --- core/thread/thread_other.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/thread/thread_other.odin b/core/thread/thread_other.odin index dde2a8e48..878119cbd 100644 --- a/core/thread/thread_other.odin +++ b/core/thread/thread_other.odin @@ -37,7 +37,7 @@ _destroy :: proc(thread: ^Thread) { unimplemented("core:thread procedure not supported on target") } -_terminate :: proc(using thread : ^Thread, exit_code: int) { +_terminate :: proc(thread : ^Thread, exit_code: int) { unimplemented("core:thread procedure not supported on target") } From ca20a9c8e78df9e0d483589ec58300d05d92b425 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 21 Dec 2025 15:21:26 +0000 Subject: [PATCH 080/766] Pre`reserve` the memory needed for `strings.builder_replace` --- core/strings/builder.odin | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/core/strings/builder.odin b/core/strings/builder.odin index da9b6df27..ce636a2a1 100644 --- a/core/strings/builder.odin +++ b/core/strings/builder.odin @@ -880,6 +880,20 @@ builder_replace :: proc(b: ^Builder, old, new: string, n: int, loc := #caller_lo } if len(old) == 0 { + // NOTE(bill): reserve the necessary memory + found := 0 + for i := 0; i <= len(b.buf); i += len(new)+1 { + if n > 0 && found == n { + break + } + found += 1 + } + if found == 0 { + return + } + reserve(&b.buf, len(b.buf) + len(new)*found) or_return + + for i := 0; i <= len(b.buf); i += len(new)+1 { if n > 0 && replaced == n { break @@ -891,6 +905,27 @@ builder_replace :: proc(b: ^Builder, old, new: string, n: int, loc := #caller_lo replaced += 1 } } else { + if len(new) > len(old) { + // NOTE(bill): reserve the necessary memory + found := 0 + for i := 0; i < len(b.buf); /**/ { + if n > 0 && found == n { + break + } + + j := index(string(b.buf[i:]), old) + if j < 0 { + break + } + i += j+len(old) + found += 1 + } + if found == 0 { + return + } + reserve(&b.buf, len(b.buf) + (len(new)-len(old))*found) or_return + } + for i := 0; i < len(b.buf); /**/ { if n > 0 && replaced == n { break @@ -901,7 +936,7 @@ builder_replace :: proc(b: ^Builder, old, new: string, n: int, loc := #caller_lo break } - if len(new) >= len(old) { + if len(new) > len(old) { resize(&b.buf, len(b.buf) + len(new)-len(old)) or_return } From 06076e02c0acd0559eeefb32a1a420e4d7243aa7 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 21 Dec 2025 17:02:41 +0100 Subject: [PATCH 081/766] js: improve warning about conflicting memory strategies --- core/sys/wasm/js/odin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 43a6b002a..ef203e24d 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -2107,7 +2107,7 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory if (exports.memory) { if (wasmMemoryInterface.memory) { - console.warn("WASM module exports memory, but `runWasm` was given an interface with existing memory too"); + console.warn('WASM module exports memory, but `runWasm` was given an interface with existing memory too. Did you mean to use `-extra-linker-flags:"--import-memory"` to tell the compiler not to export memory?'); } wasmMemoryInterface.setMemory(exports.memory); } From 998da2c2da72853cff9ceeb86d07ad20bb81a8c6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 21 Dec 2025 17:09:22 +0000 Subject: [PATCH 082/766] Add `reflect.default_map_hash_by_ptr` --- core/reflect/reflect.odin | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index 5fbff08c2..378c50ff0 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -2003,4 +2003,14 @@ equal :: proc(a, b: any, including_indirect_array_recursion := false, recursion_ runtime.print_typeid(a.id) runtime.print_string("\n") return true +} + + +@(require_results) +default_map_hash_by_ptr :: proc(ptr: ^$T, seed: uintptr = runtime.INITIAL_HASH_SEED) -> uintptr where intrinsics.type_is_comparable(T) { + assert(ptr != nil) + + info := intrinsics.type_map_info(map[T]struct{}) + + return info.key_hasher(ptr, seed) } \ No newline at end of file From cb2f3aca8b63ca59f63cf794c767096860990f6e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 21 Dec 2025 17:13:59 +0000 Subject: [PATCH 083/766] Change seed logic --- core/reflect/reflect.odin | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index 378c50ff0..b39c6ac6b 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -2007,10 +2007,12 @@ equal :: proc(a, b: any, including_indirect_array_recursion := false, recursion_ @(require_results) -default_map_hash_by_ptr :: proc(ptr: ^$T, seed: uintptr = runtime.INITIAL_HASH_SEED) -> uintptr where intrinsics.type_is_comparable(T) { +default_map_hash_by_ptr :: proc(ptr: ^$T, seed: uintptr = 0) -> uintptr where intrinsics.type_is_comparable(T) { assert(ptr != nil) - info := intrinsics.type_map_info(map[T]struct{}) - return info.key_hasher(ptr, seed) + h := u64(seed) + runtime.INITIAL_HASH_SEED + actual_seed := uintptr(h) | uintptr(uintptr(h) == 0) + + return info.key_hasher(ptr, actual_seed) } \ No newline at end of file From 8ca7fc481fad1a335b5ca46b9f997396df9be1aa Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Sun, 21 Dec 2025 18:59:21 +0100 Subject: [PATCH 084/766] Fix misleading error messages for init, fini and test attributes These look like copy-pasta from the private attribute. --- src/checker.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 4d5482933..33121b453 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3581,7 +3581,7 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) { return true; } else if (name == "test") { if (value != nullptr) { - error(value, "'%.*s' expects no parameter, or a string literal containing \"file\" or \"package\"", LIT(name)); + error(value, "Expected no value for '%.*s'", LIT(name)); } ac->test = true; return true; @@ -3629,13 +3629,13 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) { return true; } else if (name == "init") { if (value != nullptr) { - error(value, "'%.*s' expects no parameter, or a string literal containing \"file\" or \"package\"", LIT(name)); + error(value, "Expected no value for '%.*s'", LIT(name)); } ac->init = true; return true; } else if (name == "fini") { if (value != nullptr) { - error(value, "'%.*s' expects no parameter, or a string literal containing \"file\" or \"package\"", LIT(name)); + error(value, "Expected no value for '%.*s'", LIT(name)); } ac->fini = true; return true; From 9cace192776656d2237c25e402fd321f05ae1aeb Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 21 Dec 2025 18:01:50 +0100 Subject: [PATCH 085/766] net(docs): recv of 0 bytes with no error is a graceful close --- core/net/errors.odin | 8 ++++--- core/net/socket.odin | 19 +++++++++++++++-- tests/core/net/test_core_net.odin | 35 +++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 5 deletions(-) diff --git a/core/net/errors.odin b/core/net/errors.odin index 4853327b0..de53640fc 100644 --- a/core/net/errors.odin +++ b/core/net/errors.odin @@ -149,7 +149,8 @@ TCP_Recv_Error :: enum i32 { Invalid_Argument, // The socket is not connected. Not_Connected, - // Connection was closed/broken/shutdown while receiving data. + // Connection was closed due to an error or shutdown. + // NOTE: a graceful close is indicated by a `0, nil` (0 bytes received and no error) return. Connection_Closed, // Timed out before being able to receive any data. Timeout, @@ -170,7 +171,8 @@ UDP_Recv_Error :: enum i32 { Insufficient_Resources, // Invalid socket or buffer given. Invalid_Argument, - // "Connection" was refused by remote, or closed/broken/shutdown while receiving data. + // "Connection" was refused, or closed due to an error. + // NOTE: a graceful close is indicated by a `0, nil` (0 bytes received and no error) return. Connection_Refused, // Timed out before being able to receive any data. Timeout, @@ -193,7 +195,7 @@ TCP_Send_Error :: enum i32 { Insufficient_Resources, // Invalid socket or buffer given. Invalid_Argument, - // Connection was closed/broken/shutdown while receiving data. + // Connection was closed/broken/shutdown while sending data. Connection_Closed, // The socket is not connected. Not_Connected, diff --git a/core/net/socket.odin b/core/net/socket.odin index 7e96ba2b2..edb47cd0b 100644 --- a/core/net/socket.odin +++ b/core/net/socket.odin @@ -193,21 +193,36 @@ close :: proc(socket: Any_Socket) { _close(socket) } +/* + Receive data into a buffer from a TCP socket. + + If no error occurs, `recv_tcp` returns the number of bytes received and `buf` will contain this data received. + If the connection has been gracefully closed, the return value is `0, nil` (0 bytes read and no error). +*/ recv_tcp :: proc(socket: TCP_Socket, buf: []byte) -> (bytes_read: int, err: TCP_Recv_Error) { return _recv_tcp(socket, buf) } +/* + Receive data into a buffer from a UDP socket. + + If no error occurs, `recv_udp` returns the number of bytes received and `buf` will contain this data received. + If the "connection" has been gracefully closed, the return value is `0, nil` (0 bytes read and no error). +*/ recv_udp :: proc(socket: UDP_Socket, buf: []byte) -> (bytes_read: int, remote_endpoint: Endpoint, err: UDP_Recv_Error) { return _recv_udp(socket, buf) } /* - Receive data from into a buffer from any socket. + Receive data into a buffer from any socket. Note: `remote_endpoint` parameter is non-nil only if the socket type is UDP. On TCP sockets it will always return `nil`. - Errors that can be returned: `TCP_Recv_Error`, or `UDP_Recv_Error` + Errors that can be returned: `TCP_Recv_Error`, or `UDP_Recv_Error`. + + If no error occurs, `recv_any` returns the number of bytes received and `buf` will contain this data received. + If the connection has been gracefully closed, the return value is `0, nil, nil` (0 bytes read and no error). */ recv_any :: proc(socket: Any_Socket, buf: []byte) -> ( bytes_read: int, diff --git a/tests/core/net/test_core_net.odin b/tests/core/net/test_core_net.odin index ec45744f3..9b3973a60 100644 --- a/tests/core/net/test_core_net.odin +++ b/tests/core/net/test_core_net.odin @@ -624,6 +624,41 @@ test_nonblocking_option :: proc(t: ^testing.T) { } } +// Test that when the server closes it's connection, the client's next receive is `0, nil` to indicate a correct close. +@(test) +test_connection_close :: proc(t: ^testing.T) { + server, listen_err := net.listen_tcp({address=net.IP4_Address{127, 0, 0, 1}, port=0}) + testing.expect_value(t, listen_err, nil) + defer net.close(server) + + server_ep, bound_endpoint_err := net.bound_endpoint(server) + testing.expect_value(t, bound_endpoint_err, nil) + + client, dial_err := net.dial_tcp(server_ep) + testing.expect_value(t, dial_err, nil) + defer net.close(client) + + server_client, _, accept_err := net.accept_tcp(server) + testing.expect_value(t, accept_err, nil) + + send_buf: [512]byte = 1 + sent, send_err := net.send(server_client, send_buf[:]) + testing.expect_value(t, sent, 512) + testing.expect_value(t, send_err, nil) + net.close(server_client) + + recv_buf: [512]byte = --- + received, recv_err := net.recv(client, recv_buf[:]) + testing.expect_value(t, received, 512) + testing.expect_value(t, recv_err, nil) + + testing.expect_value(t, recv_buf, send_buf) + + received, recv_err = net.recv(client, recv_buf[:]) + testing.expect_value(t, received, 0) + testing.expect_value(t, recv_err, nil) +} + @(private) address_to_binstr :: proc(address: net.Address) -> (binstr: string) { switch t in address { From 8ce30dbb72ebb8162b1e36f29bb7a71abc8ad6de Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Mon, 22 Dec 2025 16:56:10 +0100 Subject: [PATCH 086/766] sys/wasm/js: fix vet error --- core/sys/wasm/js/dom.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/wasm/js/dom.odin b/core/sys/wasm/js/dom.odin index 902dfc941..a4f8d7687 100644 --- a/core/sys/wasm/js/dom.odin +++ b/core/sys/wasm/js/dom.odin @@ -15,7 +15,7 @@ foreign dom_lib { get_element_value_string_length :: proc(id: string) -> int --- set_element_key_string :: proc(id: string, key: string, value: string) --- - get_element_key_string_length :: proc(id: string, key: string, ) -> int --- + get_element_key_string_length :: proc(id: string, key: string) -> int --- device_pixel_ratio :: proc() -> f64 --- From b53ee3dba3f21bf5a22b9cf211ae49ff92b3e08b Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Mon, 22 Dec 2025 16:57:58 +0100 Subject: [PATCH 087/766] container/xar: fix undeclared `n` assignment --- core/container/xar/xar.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index 616a05e06..71fc13a27 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -323,7 +323,6 @@ push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #cal } x.chunks[chunk_idx][elem_idx] = value x.len += 1 - n = 1 ptr = &x.chunks[chunk_idx][elem_idx] return } From c9fff456cd19bf92c72a96bdbc98062c3530dc57 Mon Sep 17 00:00:00 2001 From: blob1807 <12388588+blob1807@users.noreply.github.com> Date: Tue, 23 Dec 2025 02:44:36 +1000 Subject: [PATCH 088/766] [`core:testing`] Use Windows API for SIG handling --- core/testing/signal_handler_libc.odin | 21 +- core/testing/signal_handler_windows.odin | 240 ++++++++++++++++++++++- 2 files changed, 246 insertions(+), 15 deletions(-) diff --git a/core/testing/signal_handler_libc.odin b/core/testing/signal_handler_libc.odin index a1441f29d..74608bb48 100644 --- a/core/testing/signal_handler_libc.odin +++ b/core/testing/signal_handler_libc.odin @@ -1,5 +1,5 @@ #+private -#+build windows, linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd, haiku package testing /* @@ -8,6 +8,7 @@ package testing List of contributors: Feoramund: Total rewrite. + blob1807: Windows Win32 API rewrite. */ import "base:intrinsics" @@ -24,18 +25,12 @@ import "core:terminal/ansi" @(private="file") stop_test_passed: libc.sig_atomic_t @(private="file") stop_test_alert: libc.sig_atomic_t -when ODIN_ARCH == .i386 && ODIN_OS == .Windows { - // Thread-local storage is problematic on Windows i386 - @(private="file") - local_test_index: libc.sig_atomic_t - @(private="file") - local_test_index_set: bool -} else { - @(private="file", thread_local) - local_test_index: libc.sig_atomic_t - @(private="file", thread_local) - local_test_index_set: bool -} + +@(private="file", thread_local) +local_test_index: libc.sig_atomic_t +@(private="file", thread_local) +local_test_index_set: bool + // Windows does not appear to have a SIGTRAP, so this is defined here, instead // of in the libc package, just so there's no confusion about it being diff --git a/core/testing/signal_handler_windows.odin b/core/testing/signal_handler_windows.odin index 74ebe2998..cde0cad9d 100644 --- a/core/testing/signal_handler_windows.odin +++ b/core/testing/signal_handler_windows.odin @@ -1,6 +1,242 @@ #+private +#+build windows package testing -__setup_signal_handler :: proc() {} +/* + (c) Copyright 2024 Feoramund . + Made available under Odin's license. + + List of contributors: + Feoramund: Total rewrite. + blob1807: Windows Win32 API rewrite. + +*/ + +import "base:runtime" +import "base:intrinsics" + +import "core:os" +import "core:sync" +import "core:c/libc" +import "core:terminal/ansi" + +import win32 "core:sys/windows" + + +@(private="file") stop_runner_flag: int + +@(private="file") stop_test_gate: sync.Mutex +@(private="file") stop_test_index: int +@(private="file") stop_test_signal: Exception_Code +@(private="file") stop_test_passed: bool +@(private="file") stop_test_alert: int + + +when ODIN_ARCH == .i386 { + // Thread-local storage is problematic on Windows i386 + @(private="file") + local_test_index: int + @(private="file") + local_test_index_set: bool +} else { + @(private="file", thread_local) + local_test_index: int + @(private="file", thread_local) + local_test_index_set: bool +} + + +@(private="file") +Exception_Code :: enum win32.DWORD { + Datatype_Misalignment = win32.EXCEPTION_DATATYPE_MISALIGNMENT, + Breakpoint = win32.EXCEPTION_BREAKPOINT, + Single_Step = win32.EXCEPTION_SINGLE_STEP, + Access_Violation = win32.EXCEPTION_ACCESS_VIOLATION, + In_Page_Error = win32.EXCEPTION_IN_PAGE_ERROR, + Illegal_Instruction = win32.EXCEPTION_ILLEGAL_INSTRUCTION, + Noncontinuable_Exception = win32.EXCEPTION_NONCONTINUABLE_EXCEPTION, + Invaild_Disposition = win32.EXCEPTION_INVALID_DISPOSITION, + Array_Bounds_Exceeded = win32.EXCEPTION_ARRAY_BOUNDS_EXCEEDED, + FLT_Denormal_Operand = win32.EXCEPTION_FLT_DENORMAL_OPERAND, + FLT_Divide_By_Zero = win32.EXCEPTION_FLT_DIVIDE_BY_ZERO, + FLT_Inexact_Result = win32.EXCEPTION_FLT_INEXACT_RESULT, + FLT_Invalid_Operation = win32.EXCEPTION_FLT_INVALID_OPERATION, + FLT_Overflow = win32.EXCEPTION_FLT_OVERFLOW, + FLT_Stack_Check = win32.EXCEPTION_FLT_STACK_CHECK, + FLT_Underflow = win32.EXCEPTION_FLT_UNDERFLOW, + INT_Divide_By_Zero = win32.EXCEPTION_INT_DIVIDE_BY_ZERO, + INT_Overflow = win32.EXCEPTION_INT_OVERFLOW, + PRIV_Instruction = win32.EXCEPTION_PRIV_INSTRUCTION, + Stack_Overflow = win32.EXCEPTION_STACK_OVERFLOW, +} + + +@(private="file") +stop_runner_callback :: proc "system" (ctrl_type: win32.DWORD) -> win32.BOOL { + if ctrl_type == win32.CTRL_C_EVENT { + prev := intrinsics.atomic_add(&stop_runner_flag, 1) + + // If the flag was already set (if this is the second signal sent for example), + // consider this a forced (not graceful) exit. + if prev > 0 { + os.exit(1) + } + // Say we've hanndled the signal. + return true + } + + // This will also get called for other events which we don't handle for. + // Instead we pass it on to the next handler. + return false +} + +@(private) +stop_test_callback :: proc "system" (info: ^win32.EXCEPTION_POINTERS) -> win32.LONG { + if !local_test_index_set { + // We're a thread created by a test thread. + // + // There's nothing we can do to inform the test runner about who + // signalled, so hopefully the test will handle their own sub-threads. + return win32.EXCEPTION_CONTINUE_SEARCH + } + + context = runtime.default_context() + code := Exception_Code(info.ExceptionRecord.ExceptionCode) + + if local_test_index == -1 { + // We're the test runner, and we ourselves have caught a signal from + // which there is no recovery. + // + // The most we can do now is make sure the user's cursor is visible, + // nuke the entire processs, and hope a useful core dump survives. + if !global_ansi_disabled { + show_cursor := ansi.CSI + ansi.DECTCEM_SHOW + os.write_string(os.stdout, show_cursor) + os.flush(os.stdout) + } + + // This is an attempt at being compliant by avoiding printf. + expbuf: [8]byte + expstr: string + { + expnum := cast(int)code + i := len(expbuf) - 2 + for expnum > 0 { + m := expnum % 10 + expnum /= 10 + expbuf[i] = cast(u8)('0' + m) + i -= 1 + } + expstr = cast(string)expbuf[1 + i:len(expbuf) - 1] + } + + advisory_a := ` +The test runner's main thread has caught an unrecoverable error (signal ` + advisory_b := `) and will now forcibly terminate. +This is a dire bug and should be reported to the Odin developers. +` + os.write_string(os.stderr, advisory_a) + os.write_string(os.stderr, expstr) + os.write_string(os.stderr, advisory_b) + os.flush(os.stderr) + + win32.TerminateProcess(win32.GetCurrentProcess(), 1) + } + + if sync.mutex_guard(&stop_test_gate) { + intrinsics.atomic_store(&stop_test_index, local_test_index) + intrinsics.atomic_store(&stop_test_signal, code) + passed: bool + check_passing: { + if location := local_test_assertion_raised.location; location != {} { + for i in 0.. bool { + return intrinsics.atomic_load(&stop_runner_flag) == 1 +} + +@(private="file") +unlock_stop_test_gate :: proc(_: int, _: Stop_Reason, ok: bool) { + if ok { + sync.mutex_unlock(&stop_test_gate) + } +} + +@(deferred_out=unlock_stop_test_gate) +_should_stop_test :: proc() -> (test_index: int, reason: Stop_Reason, ok: bool) { + if intrinsics.atomic_load(&stop_test_alert) == 1 { + intrinsics.atomic_store(&stop_test_alert, 0) + + test_index = intrinsics.atomic_load(&stop_test_index) + if intrinsics.atomic_load(&stop_test_passed) { + reason = .Successful_Stop + } else { + #partial switch intrinsics.atomic_load(&stop_test_signal) { + case .Illegal_Instruction: reason = .Illegal_Instruction + case .Access_Violation: reason = .Segmentation_Fault + case .Breakpoint, .Single_Step: reason = .Unhandled_Trap + + case .FLT_Denormal_Operand ..= .INT_Overflow: + reason = .Arithmetic_Error + } + } + ok = true + } + + return +} -_test_thread_cancel :: proc "contextless" () {} From 7062f89bcd1d98275e4a1977207b1c7993c90f41 Mon Sep 17 00:00:00 2001 From: Wrath Date: Mon, 22 Dec 2025 16:10:51 -0500 Subject: [PATCH 089/766] core:math/rand small documentation fix --- core/math/rand/rand.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/math/rand/rand.odin b/core/math/rand/rand.odin index 41b066255..2ed2c9e70 100644 --- a/core/math/rand/rand.odin +++ b/core/math/rand/rand.odin @@ -260,7 +260,7 @@ Example: Possible Output: 6 - 500 + 13 */ @(require_results) @@ -301,7 +301,7 @@ Example: Possible Output: 6 - 500 + 13 */ @(require_results) @@ -342,7 +342,7 @@ Example: Possible Output: 6 - 500 + 13 */ @(require_results) From cb98a83f77ca7a3eb0f43c013cdce1f8ee65deb5 Mon Sep 17 00:00:00 2001 From: Dusty Miller Date: Mon, 22 Dec 2025 20:16:24 -0600 Subject: [PATCH 090/766] Update letter.odin Fix MAX_RUNE to include planes up to 16. --- core/unicode/letter.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index a1024dd6c..5191dd900 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -2,7 +2,7 @@ package unicode import "base:runtime" -MAX_RUNE :: '\U00010fff' // Maximum valid unicode code point +MAX_RUNE :: '\U0010ffff' // Maximum valid unicode code point REPLACEMENT_CHAR :: '\ufffd' // Represented an invalid code point MAX_ASCII :: '\u007f' // Maximum ASCII value MAX_LATIN1 :: '\u00ff' // Maximum Latin-1 value From 56194732a8b73412970cc4a6dd41c7792db77832 Mon Sep 17 00:00:00 2001 From: blob1807 <12388588+blob1807@users.noreply.github.com> Date: Tue, 23 Dec 2025 16:45:51 +1000 Subject: [PATCH 091/766] Remove unneeded `Exception_Code` enum --- core/testing/signal_handler_windows.odin | 49 ++++++------------------ 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/core/testing/signal_handler_windows.odin b/core/testing/signal_handler_windows.odin index cde0cad9d..2942b5bd2 100644 --- a/core/testing/signal_handler_windows.odin +++ b/core/testing/signal_handler_windows.odin @@ -9,7 +9,6 @@ package testing List of contributors: Feoramund: Total rewrite. blob1807: Windows Win32 API rewrite. - */ import "base:runtime" @@ -27,7 +26,7 @@ import win32 "core:sys/windows" @(private="file") stop_test_gate: sync.Mutex @(private="file") stop_test_index: int -@(private="file") stop_test_signal: Exception_Code +@(private="file") stop_test_signal: win32.DWORD @(private="file") stop_test_passed: bool @(private="file") stop_test_alert: int @@ -46,31 +45,6 @@ when ODIN_ARCH == .i386 { } -@(private="file") -Exception_Code :: enum win32.DWORD { - Datatype_Misalignment = win32.EXCEPTION_DATATYPE_MISALIGNMENT, - Breakpoint = win32.EXCEPTION_BREAKPOINT, - Single_Step = win32.EXCEPTION_SINGLE_STEP, - Access_Violation = win32.EXCEPTION_ACCESS_VIOLATION, - In_Page_Error = win32.EXCEPTION_IN_PAGE_ERROR, - Illegal_Instruction = win32.EXCEPTION_ILLEGAL_INSTRUCTION, - Noncontinuable_Exception = win32.EXCEPTION_NONCONTINUABLE_EXCEPTION, - Invaild_Disposition = win32.EXCEPTION_INVALID_DISPOSITION, - Array_Bounds_Exceeded = win32.EXCEPTION_ARRAY_BOUNDS_EXCEEDED, - FLT_Denormal_Operand = win32.EXCEPTION_FLT_DENORMAL_OPERAND, - FLT_Divide_By_Zero = win32.EXCEPTION_FLT_DIVIDE_BY_ZERO, - FLT_Inexact_Result = win32.EXCEPTION_FLT_INEXACT_RESULT, - FLT_Invalid_Operation = win32.EXCEPTION_FLT_INVALID_OPERATION, - FLT_Overflow = win32.EXCEPTION_FLT_OVERFLOW, - FLT_Stack_Check = win32.EXCEPTION_FLT_STACK_CHECK, - FLT_Underflow = win32.EXCEPTION_FLT_UNDERFLOW, - INT_Divide_By_Zero = win32.EXCEPTION_INT_DIVIDE_BY_ZERO, - INT_Overflow = win32.EXCEPTION_INT_OVERFLOW, - PRIV_Instruction = win32.EXCEPTION_PRIV_INSTRUCTION, - Stack_Overflow = win32.EXCEPTION_STACK_OVERFLOW, -} - - @(private="file") stop_runner_callback :: proc "system" (ctrl_type: win32.DWORD) -> win32.BOOL { if ctrl_type == win32.CTRL_C_EVENT { @@ -101,7 +75,7 @@ stop_test_callback :: proc "system" (info: ^win32.EXCEPTION_POINTERS) -> win32.L } context = runtime.default_context() - code := Exception_Code(info.ExceptionRecord.ExceptionCode) + code := info.ExceptionRecord.ExceptionCode if local_test_index == -1 { // We're the test runner, and we ourselves have caught a signal from @@ -166,11 +140,11 @@ This is a dire bug and should be reported to the Odin developers. } signal := local_test_expected_failures.signal switch signal { - case libc.SIGILL: passed = code == .Illegal_Instruction - case libc.SIGSEGV: passed = code == .Access_Violation + case libc.SIGILL: passed = code == win32.EXCEPTION_ILLEGAL_INSTRUCTION + case libc.SIGSEGV: passed = code == win32.EXCEPTION_ACCESS_VIOLATION case libc.SIGFPE: - #partial switch code { - case .FLT_Denormal_Operand ..= .INT_Overflow: + switch code { + case win32.EXCEPTION_FLT_DENORMAL_OPERAND ..= win32.EXCEPTION_INT_OVERFLOW: passed = true } } @@ -225,12 +199,13 @@ _should_stop_test :: proc() -> (test_index: int, reason: Stop_Reason, ok: bool) if intrinsics.atomic_load(&stop_test_passed) { reason = .Successful_Stop } else { - #partial switch intrinsics.atomic_load(&stop_test_signal) { - case .Illegal_Instruction: reason = .Illegal_Instruction - case .Access_Violation: reason = .Segmentation_Fault - case .Breakpoint, .Single_Step: reason = .Unhandled_Trap + switch intrinsics.atomic_load(&stop_test_signal) { + case win32.EXCEPTION_ILLEGAL_INSTRUCTION: reason = .Illegal_Instruction + case win32.EXCEPTION_ACCESS_VIOLATION: reason = .Segmentation_Fault + case win32.EXCEPTION_BREAKPOINT: reason = .Unhandled_Trap + case win32.EXCEPTION_SINGLE_STEP: reason = .Unhandled_Trap - case .FLT_Denormal_Operand ..= .INT_Overflow: + case win32.EXCEPTION_FLT_DENORMAL_OPERAND ..= win32.EXCEPTION_INT_OVERFLOW: reason = .Arithmetic_Error } } From 4eeb509fe8f1750be784786d4ac6470d6591fd6e Mon Sep 17 00:00:00 2001 From: blob1807 <12388588+blob1807@users.noreply.github.com> Date: Tue, 23 Dec 2025 19:17:43 +1000 Subject: [PATCH 092/766] Fix an OOB & format exception code as hex Fix an OOB caused when the test runner catches the exception & format exception codes as upper case hex. --- core/testing/signal_handler_windows.odin | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/core/testing/signal_handler_windows.odin b/core/testing/signal_handler_windows.odin index 2942b5bd2..8843dde92 100644 --- a/core/testing/signal_handler_windows.odin +++ b/core/testing/signal_handler_windows.odin @@ -17,6 +17,7 @@ import "base:intrinsics" import "core:os" import "core:sync" import "core:c/libc" +import "core:strconv" import "core:terminal/ansi" import win32 "core:sys/windows" @@ -89,23 +90,16 @@ stop_test_callback :: proc "system" (info: ^win32.EXCEPTION_POINTERS) -> win32.L os.flush(os.stdout) } - // This is an attempt at being compliant by avoiding printf. expbuf: [8]byte - expstr: string - { - expnum := cast(int)code - i := len(expbuf) - 2 - for expnum > 0 { - m := expnum % 10 - expnum /= 10 - expbuf[i] = cast(u8)('0' + m) - i -= 1 + expstr := strconv.write_uint(expbuf[:], cast(u64)code, 16) + for &c in expbuf { + if 'a' <= c && c <= 'f' { + c -= 32 } - expstr = cast(string)expbuf[1 + i:len(expbuf) - 1] } advisory_a := ` -The test runner's main thread has caught an unrecoverable error (signal ` +The test runner's main thread has caught an unrecoverable error (exception 0x` advisory_b := `) and will now forcibly terminate. This is a dire bug and should be reported to the Odin developers. ` @@ -155,7 +149,7 @@ This is a dire bug and should be reported to the Odin developers. } // Pass on the exeption to the next handler. As we don't wont to recover from it. - // This will allow debuggers handle it properly. + // This also allows debuggers handle it properly. return win32.EXCEPTION_CONTINUE_SEARCH } From ab74b8283d48ca96ea800298ae0f227a9cc0eb99 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Tue, 23 Dec 2025 09:35:09 -0500 Subject: [PATCH 093/766] Address issue identifying of CDATA The XML library wasn't identifying CDATA and skipping over it. This was found when CDATA contained a <. This patch addresses that issue. --- core/encoding/xml/xml_reader.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/encoding/xml/xml_reader.odin b/core/encoding/xml/xml_reader.odin index 0e773fd8a..99d73670b 100644 --- a/core/encoding/xml/xml_reader.odin +++ b/core/encoding/xml/xml_reader.odin @@ -308,6 +308,7 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha case .Open_Bracket: // This could be a CDATA tag part of a tag's body. Unread the ` (id: Element_ID) { cur := doc.element_count doc.element_count += 1 return cur -} \ No newline at end of file +} From 13faedaf4ce3a24ed92917d44244f226ff3fed57 Mon Sep 17 00:00:00 2001 From: blob1807 <12388588+blob1807@users.noreply.github.com> Date: Wed, 24 Dec 2025 00:39:21 +1000 Subject: [PATCH 094/766] Try to ensure the runner's handler gets called first --- core/testing/signal_handler_windows.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/testing/signal_handler_windows.odin b/core/testing/signal_handler_windows.odin index 8843dde92..ef4a9d75d 100644 --- a/core/testing/signal_handler_windows.odin +++ b/core/testing/signal_handler_windows.odin @@ -165,7 +165,7 @@ _setup_signal_handler :: proc() { // - Asserts and panics; // - Arithmetic errors; and // - Segmentation faults (illegal memory access). - win32.AddVectoredExceptionHandler(0, stop_test_callback) + win32.AddVectoredExceptionHandler(1, stop_test_callback) } _setup_task_signal_handler :: proc(test_index: int) { From 569da5a1cf346056fd09fdabea567d2dd1ee8534 Mon Sep 17 00:00:00 2001 From: blob1807 <12388588+blob1807@users.noreply.github.com> Date: Wed, 24 Dec 2025 01:08:52 +1000 Subject: [PATCH 095/766] Revert "Try to ensure the runner's handler gets called first" This reverts commit 13faedaf4ce3a24ed92917d44244f226ff3fed57. As it's causing issues with ASAN, which adds it's own `ExceptionHandler` as the first. Making ours first messes with it. Causing an Access Violation when trying to setup `context` in our handler. --- core/testing/signal_handler_windows.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/testing/signal_handler_windows.odin b/core/testing/signal_handler_windows.odin index ef4a9d75d..8843dde92 100644 --- a/core/testing/signal_handler_windows.odin +++ b/core/testing/signal_handler_windows.odin @@ -165,7 +165,7 @@ _setup_signal_handler :: proc() { // - Asserts and panics; // - Arithmetic errors; and // - Segmentation faults (illegal memory access). - win32.AddVectoredExceptionHandler(1, stop_test_callback) + win32.AddVectoredExceptionHandler(0, stop_test_callback) } _setup_task_signal_handler :: proc(test_index: int) { From 2e6554b8c85c904eb1eb010f0312641be800823f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 26 Dec 2025 11:49:46 +0000 Subject: [PATCH 096/766] Disallow importing directories with an `.odin` extension/suffix --- src/parser.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index de5655ce1..b2ff55396 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5818,6 +5818,11 @@ gb_internal AstPackage *try_add_import_path(Parser *p, String path, String const return nullptr; } + if (string_ends_with(path, str_lit(".odin"))) { + error(pos, "'import' declarations cannot import directories with a .odin extension/suffix"); + return nullptr; + } + isize files_with_ext = 0; isize files_to_reserve = 1; // always reserve 1 for (FileInfo fi : list) { From 7e39239907885447b73c8c03648a85554552f1bc Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Fri, 26 Dec 2025 23:02:35 +0100 Subject: [PATCH 097/766] WebGL: Add GetActiveAttrib binding --- core/sys/wasm/js/odin.js | 21 +++++++++++++++++ vendor/wasm/WebGL/webgl.odin | 44 +++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index ef203e24d..ca4af18b8 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -625,6 +625,26 @@ class WebGLInterface { this.ctx.generateMipmap(target); }, + GetActiveAttrib: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { + let info = this.ctx.getActiveAttrib(program, index); + + if (size_ptr) { + this.mem.storeInt(size_ptr, info.size); + } + + if (type_ptr) { + this.mem.storeI32(type_ptr, info.type); + } + + if name_buf_ptr && name_buf_len > 0 { + let n = Math.min(name_buf_len, info.name.length); + let name = info.name.substring(0, n); + this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); + this.mem.storeInt(name_len_ptr, n); + } else if name_len_ptr { + this.mem.storeInt(name_len_ptr, info.name.length); + } + }, GetAttribLocation: (program, name_ptr, name_len) => { let name = this.mem.loadString(name_ptr, name_len); @@ -1840,6 +1860,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { return false; }, + // Writes a struct of type `Gamepad_State`, see `core/sys/wasm/js/events.odin` get_gamepad_state: (gamepad_id, ep) => { let index = gamepad_id; let gps = navigator.getGamepads(); diff --git a/vendor/wasm/WebGL/webgl.odin b/vendor/wasm/WebGL/webgl.odin index 5616f3660..1c3bda2e6 100644 --- a/vendor/wasm/WebGL/webgl.odin +++ b/vendor/wasm/WebGL/webgl.odin @@ -3,6 +3,7 @@ package webgl foreign import "webgl" import glm "core:math/linalg/glsl" +import "base:runtime" Enum :: distinct u32 @@ -25,6 +26,12 @@ ContextAttribute :: enum u32 { } ContextAttributes :: distinct bit_set[ContextAttribute; u32] +ActiveInfo :: struct { + size: int, + type: Enum, + name: string, +} + DEFAULT_CONTEXT_ATTRIBUTES :: ContextAttributes{} @(default_calling_convention="contextless") @@ -260,7 +267,6 @@ UniformMatrix4fv :: proc "contextless" (location: i32, m: glm.mat4) { value := transmute([4*4]f32)m _UniformMatrix4fv(location, &value[0]) } - GetShaderiv :: proc "contextless" (shader: Shader, pname: Enum) -> (p: i32) { foreign webgl { @(link_name="GetShaderiv") @@ -270,6 +276,42 @@ GetShaderiv :: proc "contextless" (shader: Shader, pname: Enum) -> (p: i32) { return } +GetActiveAttribBuf :: proc "contextless" (program: Program, index: u32, name_buf: []byte) -> (info: ActiveInfo) { + foreign webgl { + @(link_name="GetActiveAttrib") + _GetActiveAttrib :: proc "contextless" (shader: Program, index: u32, size: ^int, type: ^Enum, name_buf: []byte, name_len: ^int) --- + } + name_len: int + _GetActiveAttrib(program, index, &info.size, &info.type, name_buf, &name_len) + info.name = string(name_buf[:name_len]) + return +} + +GetActiveAttribAlloc :: proc(program: Program, index: u32, allocator: runtime.Allocator, loc := #caller_location) -> (info: ActiveInfo) { + foreign webgl { + @(link_name="GetActiveAttrib") + _GetActiveAttrib :: proc "contextless" (shader: Program, index: u32, size: ^int, type: ^Enum, name_buf: []byte, name_len: ^int) --- + } + + name_len: int + + // Passing {} to the buf but giving it a name_len ptr will write the needed len into that int + _GetActiveAttrib(program, index, &info.size, &info.type, {}, &name_len) + + if name_len > 0 { + name_buf := make([]byte, name_len, allocator, loc) + _GetActiveAttrib(program, index, &info.size, &info.type, name_buf, &name_len) + assert(name_len == len(name_buf)) + info.name = string(name_buf[:name_len]) + } + + return +} + +GetActiveAttrib :: proc { + GetActiveAttribBuf, + GetActiveAttribAlloc, +} GetProgramInfoLog :: proc "contextless" (program: Program, buf: []byte) -> string { foreign webgl { From 7dee25bdcc069bbb0ceb5d4a1ac1a9e3009bfb83 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Fri, 26 Dec 2025 23:34:45 +0100 Subject: [PATCH 098/766] More allocator-aware webgl bindings and added more missing bindings. --- core/sys/wasm/js/odin.js | 21 ++++++++++++++++++++ vendor/wasm/WebGL/webgl.odin | 37 +++++++++++++++++++++++++++++++++++ vendor/wasm/WebGL/webgl2.odin | 25 ++++++++++++++++++++++- 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index ca4af18b8..b0a01f66c 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -646,6 +646,27 @@ class WebGLInterface { } }, + GetActiveUniform: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { + let info = this.ctx.getActiveUniform(program, index); + + if (size_ptr) { + this.mem.storeInt(size_ptr, info.size); + } + + if (type_ptr) { + this.mem.storeI32(type_ptr, info.type); + } + + if name_buf_ptr && name_buf_len > 0 { + let n = Math.min(name_buf_len, info.name.length); + let name = info.name.substring(0, n); + this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); + this.mem.storeInt(name_len_ptr, n); + } else if name_len_ptr { + this.mem.storeInt(name_len_ptr, info.name.length); + } + }, + GetAttribLocation: (program, name_ptr, name_len) => { let name = this.mem.loadString(name_ptr, name_len); return this.ctx.getAttribLocation(this.programs[program], name); diff --git a/vendor/wasm/WebGL/webgl.odin b/vendor/wasm/WebGL/webgl.odin index 1c3bda2e6..601071c3a 100644 --- a/vendor/wasm/WebGL/webgl.odin +++ b/vendor/wasm/WebGL/webgl.odin @@ -313,6 +313,43 @@ GetActiveAttrib :: proc { GetActiveAttribAlloc, } +GetActiveUniformBuf :: proc "contextless" (program: Program, index: u32, name_buf: []byte) -> (info: ActiveInfo) { + foreign webgl { + @(link_name="GetActiveUniform") + _GetActiveUniform :: proc "contextless" (shader: Program, index: u32, size: ^int, type: ^Enum, name_buf: []byte, name_len: ^int) --- + } + name_len: int + _GetActiveUniform(program, index, &info.size, &info.type, name_buf, &name_len) + info.name = string(name_buf[:name_len]) + return +} + +GetActiveUniformAlloc :: proc(program: Program, index: u32, allocator: runtime.Allocator, loc := #caller_location) -> (info: ActiveInfo) { + foreign webgl { + @(link_name="GetActiveUniform") + _GetActiveUniform :: proc "contextless" (shader: Program, index: u32, size: ^int, type: ^Enum, name_buf: []byte, name_len: ^int) --- + } + + name_len: int + + // Passing {} to the buf but giving it a name_len ptr will write the needed len into that int + _GetActiveUniform(program, index, &info.size, &info.type, {}, &name_len) + + if name_len > 0 { + name_buf := make([]byte, name_len, allocator, loc) + _GetActiveUniform(program, index, &info.size, &info.type, name_buf, &name_len) + assert(name_len == len(name_buf)) + info.name = string(name_buf[:name_len]) + } + + return +} + +GetActiveUniform :: proc { + GetActiveUniformBuf, + GetActiveUniformAlloc, +} + GetProgramInfoLog :: proc "contextless" (program: Program, buf: []byte) -> string { foreign webgl { @(link_name="GetProgramInfoLog") diff --git a/vendor/wasm/WebGL/webgl2.odin b/vendor/wasm/WebGL/webgl2.odin index 66a739303..3494559a5 100644 --- a/vendor/wasm/WebGL/webgl2.odin +++ b/vendor/wasm/WebGL/webgl2.odin @@ -3,6 +3,7 @@ package webgl foreign import "webgl2" import "base:intrinsics" +import "base:runtime" import glm "core:math/linalg/glsl" Query :: distinct u32 @@ -109,7 +110,7 @@ foreign webgl2 { BindVertexArray :: proc(vertexArray: VertexArrayObject) --- } -GetActiveUniformBlockName :: proc(program: Program, uniformBlockIndex: i32, buf: []byte) -> string { +GetActiveUniformBlockNameBuf :: proc(program: Program, uniformBlockIndex: i32, buf: []byte) -> string { foreign webgl2 { _GetActiveUniformBlockName :: proc "contextless" (program: Program, uniformBlockIndex: i32, buf: []byte, length: ^int) --- } @@ -118,6 +119,28 @@ GetActiveUniformBlockName :: proc(program: Program, uniformBlockIndex: i32, buf: return string(buf[:n]) } +GetActiveUniformBlockNameAlloc :: proc(program: Program, uniformBlockIndex: i32, allocator: runtime.Allocator, loc := #caller_location) -> string { + foreign webgl2 { + _GetActiveUniformBlockName :: proc "contextless" (program: Program, uniformBlockIndex: i32, buf: []byte, length: ^int) --- + } + n: int + _GetActiveUniformBlockName(program, uniformBlockIndex, {}, &n) + + if n > 0 { + buf := make([]byte, n, allocator, loc) + _GetActiveUniformBlockName(program, uniformBlockIndex, buf, &n) + assert(n == len(buf)) + return string(buf[:n]) + } + + return "" +} + +GetActiveUniformBlockName :: proc { + GetActiveUniformBlockNameBuf, + GetActiveUniformBlockNameAlloc, +} + Uniform1uiv :: proc "contextless" (location: i32, v: u32) { Uniform1ui(location, v) From 159eab133b4b6dc9df6896d003134c1f0ccfde92 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Sat, 27 Dec 2025 01:41:59 +0100 Subject: [PATCH 099/766] More webgl bindings and fixes --- core/sys/wasm/js/odin.js | 29 ++++++++++++++++++++++------- vendor/wasm/WebGL/webgl2.odin | 15 ++++++++++++++- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index b0a01f66c..0c617dd8e 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -626,7 +626,7 @@ class WebGLInterface { }, GetActiveAttrib: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { - let info = this.ctx.getActiveAttrib(program, index); + const info = this.ctx.getActiveAttrib(this.programs[program], index); if (size_ptr) { this.mem.storeInt(size_ptr, info.size); @@ -636,18 +636,18 @@ class WebGLInterface { this.mem.storeI32(type_ptr, info.type); } - if name_buf_ptr && name_buf_len > 0 { + if (name_buf_ptr && name_buf_len > 0) { let n = Math.min(name_buf_len, info.name.length); let name = info.name.substring(0, n); this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); this.mem.storeInt(name_len_ptr, n); - } else if name_len_ptr { + } else if (name_len_ptr) { this.mem.storeInt(name_len_ptr, info.name.length); } }, GetActiveUniform: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { - let info = this.ctx.getActiveUniform(program, index); + let info = this.ctx.getActiveUniform(this.programs[program], index); if (size_ptr) { this.mem.storeInt(size_ptr, info.size); @@ -657,12 +657,12 @@ class WebGLInterface { this.mem.storeI32(type_ptr, info.type); } - if name_buf_ptr && name_buf_len > 0 { + if (name_buf_ptr && name_buf_len > 0) { let n = Math.min(name_buf_len, info.name.length); let name = info.name.substring(0, n); this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); this.mem.storeInt(name_len_ptr, n); - } else if name_len_ptr { + } else if (name_len_ptr) { this.mem.storeInt(name_len_ptr, info.name.length); } }, @@ -1301,7 +1301,6 @@ class WebGLInterface { this.assertWebGL2(); return this.ctx.getUniformBlockIndex(this.programs[program], this.mem.loadString(uniformBlockName_ptr, uniformBlockName_len)); }, - // any getActiveUniformBlockParameter(WebGLProgram program, GLuint uniformBlockIndex, GLenum pname); GetActiveUniformBlockName: (program, uniformBlockIndex, buf_ptr, buf_len, length_ptr) => { this.assertWebGL2(); let name = this.ctx.getActiveUniformBlockName(this.programs[program], uniformBlockIndex); @@ -1311,6 +1310,22 @@ class WebGLInterface { this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(name)) this.mem.storeInt(length_ptr, n); }, + GetActiveUniforms: (program, uniformIndices_ptr, uniformIndices_len, pname, res_ptr) => { + thid.assertWebGL2(); + let indices = this.mem.loadU32Array(uniformIndices_ptr, uniformIndices_len); + this.ctx.getActiveUniforms(this.programs[program], indices, pname) + this.mem.loadI32Array(res_ptr, indices.length).set(indices) + }, + GetActiveUniformBlockParameter: (program, uniformBlockIndex, pname, params_ptr) => { + this.assertWebGL2(); + let res = this.ctx.getActiveUniformBlockParameter(this.programs[program], uniformBlockIndex, pname); + + if (e instanceof Uint32Array) { // for pname GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES + this.mem.loadU32Array(params_ptr, res.length).set(res) + } else { + this.mem.storeI32(params_ptr, res) + } + }, UniformBlockBinding: (program, uniformBlockIndex, uniformBlockBinding) => { this.assertWebGL2(); this.ctx.uniformBlockBinding(this.programs[program], uniformBlockIndex, uniformBlockBinding); diff --git a/vendor/wasm/WebGL/webgl2.odin b/vendor/wasm/WebGL/webgl2.odin index 3494559a5..1e36fd0fd 100644 --- a/vendor/wasm/WebGL/webgl2.odin +++ b/vendor/wasm/WebGL/webgl2.odin @@ -104,6 +104,12 @@ foreign webgl2 { GetUniformBlockIndex :: proc(program: Program, uniformBlockName: string) -> i32 --- UniformBlockBinding :: proc(program: Program, uniformBlockIndex: i32, uniformBlockBinding: i32) --- + // if `pname` is `UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES` then an array will be written at + // `params`, in that case the length `params` need to have is given first querying using `pname` + // `UNIFORM_BLOCK_ACTIVE_UNIFORMS`. + GetActiveUniformBlockParameter :: proc(program: Program, uniformBlockIndex: i32, pname: Enum, params: [^]i32) --- + GetActiveUniforms :: proc(program: Program, uniformIndices: []u32, pname: Enum, res: [^]i32) --- + CreateVertexArray :: proc() -> VertexArrayObject --- DeleteVertexArray :: proc(vertexArray: VertexArrayObject) --- IsVertexArray :: proc(vertexArray: VertexArrayObject) -> bool --- @@ -112,6 +118,7 @@ foreign webgl2 { GetActiveUniformBlockNameBuf :: proc(program: Program, uniformBlockIndex: i32, buf: []byte) -> string { foreign webgl2 { + @(link_name="GetActiveUniformBlockName") _GetActiveUniformBlockName :: proc "contextless" (program: Program, uniformBlockIndex: i32, buf: []byte, length: ^int) --- } n: int @@ -121,6 +128,7 @@ GetActiveUniformBlockNameBuf :: proc(program: Program, uniformBlockIndex: i32, b GetActiveUniformBlockNameAlloc :: proc(program: Program, uniformBlockIndex: i32, allocator: runtime.Allocator, loc := #caller_location) -> string { foreign webgl2 { + @(link_name="GetActiveUniformBlockName") _GetActiveUniformBlockName :: proc "contextless" (program: Program, uniformBlockIndex: i32, buf: []byte, length: ^int) --- } n: int @@ -141,7 +149,6 @@ GetActiveUniformBlockName :: proc { GetActiveUniformBlockNameAlloc, } - Uniform1uiv :: proc "contextless" (location: i32, v: u32) { Uniform1ui(location, v) } @@ -157,6 +164,7 @@ Uniform4uiv :: proc "contextless" (location: i32, v: glm.uvec4) { UniformMatrix3x2fv :: proc "contextless" (location: i32, m: glm.mat3x2) { foreign webgl2 { + @(link_name="UniformMatrix3x2fv") _UniformMatrix3x2fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) @@ -164,6 +172,7 @@ UniformMatrix3x2fv :: proc "contextless" (location: i32, m: glm.mat3x2) { } UniformMatrix4x2fv :: proc "contextless" (location: i32, m: glm.mat4x2) { foreign webgl2 { + @(link_name="UniformMatrix4x2fv") _UniformMatrix4x2fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) @@ -171,6 +180,7 @@ UniformMatrix4x2fv :: proc "contextless" (location: i32, m: glm.mat4x2) { } UniformMatrix2x3fv :: proc "contextless" (location: i32, m: glm.mat2x3) { foreign webgl2 { + @(link_name="UniformMatrix2x3fv") _UniformMatrix2x3fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) @@ -178,6 +188,7 @@ UniformMatrix2x3fv :: proc "contextless" (location: i32, m: glm.mat2x3) { } UniformMatrix4x3fv :: proc "contextless" (location: i32, m: glm.mat4x3) { foreign webgl2 { + @(link_name="UniformMatrix4x3fv") _UniformMatrix4x3fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) @@ -185,6 +196,7 @@ UniformMatrix4x3fv :: proc "contextless" (location: i32, m: glm.mat4x3) { } UniformMatrix2x4fv :: proc "contextless" (location: i32, m: glm.mat2x4) { foreign webgl2 { + @(link_name="UniformMatrix2x4fv") _UniformMatrix2x4fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) @@ -192,6 +204,7 @@ UniformMatrix2x4fv :: proc "contextless" (location: i32, m: glm.mat2x4) { } UniformMatrix3x4fv :: proc "contextless" (location: i32, m: glm.mat3x4) { foreign webgl2 { + @(link_name="UniformMatrix3x4fv") _UniformMatrix3x4fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) From d802a4e9fa412e1234a5970b8545994293946409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Sat, 27 Dec 2025 04:30:37 +0100 Subject: [PATCH 100/766] encoding/base32: Fix padding validation for malformed input Fix a bug where padding characters in the middle of input were not detected when there was no trailing padding. The "verify no padding in middle" check was inside `if padding_count > 0`, so inputs like "MZ===YTBMZXW6YTB" would incorrectly pass validation. Test case added for this edge case. --- core/encoding/base32/base32.odin | 14 +++++++------- tests/core/encoding/base32/base32.odin | 14 +++++++++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 34de2ff53..d272b32b8 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -153,15 +153,15 @@ decode :: proc( padding_count += 1 } + // Verify no padding in the middle + for i := 0; i < data_len - padding_count; i += 1 { + if data[i] == byte(PADDING) { + return nil, .Malformed_Input + } + } + // Check for proper padding and length combinations if padding_count > 0 { - // Verify no padding in the middle - for i := 0; i < data_len - padding_count; i += 1 { - if data[i] == byte(PADDING) { - return nil, .Malformed_Input - } - } - content_len := data_len - padding_count mod8 := content_len % 8 required_padding: int diff --git a/tests/core/encoding/base32/base32.odin b/tests/core/encoding/base32/base32.odin index f757e99e5..2abb244ca 100644 --- a/tests/core/encoding/base32/base32.odin +++ b/tests/core/encoding/base32/base32.odin @@ -1,4 +1,3 @@ -#+test package test_encoding_base32 import "core:testing" @@ -83,7 +82,16 @@ test_base32_decode_invalid :: proc(t: ^testing.T) { // Section 3.2 - Padding requirements { - // Padding must only be at end + // Padding in middle without trailing padding + input := "MZ===YTBMZXW6YTB" // '===' in middle, no trailing padding + output, err := base32.decode(input) + if output != nil { + defer delete(output) + } + testing.expect_value(t, err, Error.Malformed_Input) + } + { + // Padding must only be at end (with trailing padding) input := "MZ=Q====" output, err := base32.decode(input) if output != nil { @@ -228,4 +236,4 @@ test_base32_custom_alphabet :: proc(t: ^testing.T) { } testing.expect_value(t, err, Error.Invalid_Character) } -} \ No newline at end of file +} From 40eab9991efbd090d2b473f5f121859c544f5d6b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 27 Dec 2025 11:35:13 +0000 Subject: [PATCH 101/766] Split some procedures up --- core/fmt/fmt.odin | 661 ++++++++++++++++++++++++---------------------- 1 file changed, 345 insertions(+), 316 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index c958c2d2e..27168d6c2 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2142,6 +2142,108 @@ __handle_raw_union_tag :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime. return false } +@(private) +fmt_soa_struct_internal :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime.Type_Info_Struct, type_name: string, hash: bool, indent: int) { + is_empty := info.field_count == 0 + + fi.indent += 1 + defer fi.indent -= 1 + + base_type_name: string + if v, ok := info.soa_base_type.variant.(runtime.Type_Info_Named); ok { + base_type_name = v.name + } + + actual_field_count := info.field_count + + n := uintptr(info.soa_len) + + if info.soa_kind == .Slice { + actual_field_count = info.field_count-1 // len + + n = uintptr((^int)(uintptr(v.data) + info.offsets[actual_field_count])^) + + } else if info.soa_kind == .Dynamic { + actual_field_count = info.field_count-3 // len, cap, allocator + + n = uintptr((^int)(uintptr(v.data) + info.offsets[actual_field_count])^) + } + + if hash && n > 0 { + io.write_byte(fi.writer, '\n', &fi.n) + } + + for index in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } + + field_count := -1 + + if !hash && field_count > 0 { io.write_string(fi.writer, ", ", &fi.n) } + + if hash { + fi.indent -= 1 + fmt_write_indent(fi) + fi.indent += 1 + } + io.write_string(fi.writer, base_type_name, &fi.n) + io.write_byte(fi.writer, '{', &fi.n) + if hash && !is_empty { io.write_byte(fi.writer, '\n', &fi.n) } + defer { + if hash && !is_empty { + fi.indent -= 1 + fmt_write_indent(fi) + fi.indent += 1 + } + io.write_byte(fi.writer, '}', &fi.n) + if hash { io.write_string(fi.writer, ",\n", &fi.n) } + } + fi.record_level += 1 + defer fi.record_level -= 1 + + for i in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } + if hash { + fmt_write_indent(fi) + } + + io.write_string(fi.writer, name, &fi.n) + io.write_string(fi.writer, " = ", &fi.n) + + if info.soa_kind == .Fixed { + t := info.types[i].variant.(runtime.Type_Info_Array).elem + t_size := uintptr(t.size) + if reflect.is_any(t) { + io.write_string(fi.writer, "any{}", &fi.n) + } else { + data := rawptr(uintptr(v.data) + info.offsets[i] + index*t_size) + fmt_arg(fi, any{data, t.id}, verb) + } + } else { + t := info.types[i].variant.(runtime.Type_Info_Multi_Pointer).elem + t_size := uintptr(t.size) + if reflect.is_any(t) { + io.write_string(fi.writer, "any{}", &fi.n) + } else { + field_ptr := (^^byte)(uintptr(v.data) + info.offsets[i])^ + data := rawptr(uintptr(field_ptr) + index*t_size) + fmt_arg(fi, any{data, t.id}, verb) + } + } + + if hash { io.write_string(fi.writer, ",\n", &fi.n) } + } + } + + if hash && n > 0 { + for _ in 0.. 0 { - io.write_byte(fi.writer, '\n', &fi.n) - } - - for index in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } - - field_count := -1 - - if !hash && field_count > 0 { io.write_string(fi.writer, ", ", &fi.n) } - - if hash { - fi.indent -= 1 - fmt_write_indent(fi) - fi.indent += 1 - } - io.write_string(fi.writer, base_type_name, &fi.n) - io.write_byte(fi.writer, '{', &fi.n) - if hash && !is_empty { io.write_byte(fi.writer, '\n', &fi.n) } - defer { - if hash && !is_empty { - fi.indent -= 1 - fmt_write_indent(fi) - fi.indent += 1 - } - io.write_byte(fi.writer, '}', &fi.n) - if hash { io.write_string(fi.writer, ",\n", &fi.n) } - } - fi.record_level += 1 - defer fi.record_level -= 1 - - for i in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } - if hash { - fmt_write_indent(fi) - } - - io.write_string(fi.writer, name, &fi.n) - io.write_string(fi.writer, " = ", &fi.n) - - if info.soa_kind == .Fixed { - t := info.types[i].variant.(runtime.Type_Info_Array).elem - t_size := uintptr(t.size) - if reflect.is_any(t) { - io.write_string(fi.writer, "any{}", &fi.n) - } else { - data := rawptr(uintptr(v.data) + info.offsets[i] + index*t_size) - fmt_arg(fi, any{data, t.id}, verb) - } - } else { - t := info.types[i].variant.(runtime.Type_Info_Multi_Pointer).elem - t_size := uintptr(t.size) - if reflect.is_any(t) { - io.write_string(fi.writer, "any{}", &fi.n) - } else { - field_ptr := (^^byte)(uintptr(v.data) + info.offsets[i])^ - data := rawptr(uintptr(field_ptr) + index*t_size) - fmt_arg(fi, any{data, t.id}, verb) - } - } - - if hash { io.write_string(fi.writer, ",\n", &fi.n) } - } - } - - if hash && n > 0 { - for _ in 0..", &fi.n) + return + } + if fi.indirection_level < 1 { + fi.indirection_level += 1 + defer fi.indirection_level -= 1 + io.write_byte(fi.writer, '&') + fmt_value(fi, a, verb) + return + } + + case runtime.Type_Info_Struct, + runtime.Type_Info_Union, + runtime.Type_Info_Bit_Field: + if ptr == nil { + io.write_string(fi.writer, "", &fi.n) + return + } + if fi.indirection_level < 1 { + fi.indirection_level += 1 + defer fi.indirection_level -= 1 + io.write_byte(fi.writer, '&', &fi.n) + fmt_value(fi, a, verb) + return + } + } + } + } + fmt_pointer(fi, ptr, verb) + } +} + +@(private) +fmt_multi_pointer :: proc(fi: ^Info, v: any, info: runtime.Type_Info_Multi_Pointer, verb: rune) { + ptr := (^rawptr)(v.data)^ + if ptr == nil { + io.write_string(fi.writer, "", &fi.n) + return + } + if verb != 'p' && info.elem != nil { + a := any{ptr, info.elem.id} + + elem := runtime.type_info_base(info.elem) + if elem != nil { + if n, ok := fi.optional_len.?; ok { + fi.optional_len = nil + fmt_array(fi, ptr, n, elem.size, elem, verb) + return + } else if fi.use_nul_termination { + fi.use_nul_termination = false + fmt_array_nul_terminated(fi, ptr, -1, elem.size, elem, verb) + return + } + + #partial switch &e in elem.variant { + case runtime.Type_Info_Integer: + switch verb { + case 's', 'q': + switch elem.id { + case u8: + fmt_cstring(fi, cstring(ptr), verb) + return + case u16, u32, rune: + n := search_nul_termination(ptr, elem.size, -1) + fmt_array(fi, ptr, n, elem.size, elem, verb) + return + } + } + + case runtime.Type_Info_Array, + runtime.Type_Info_Slice, + runtime.Type_Info_Dynamic_Array, + runtime.Type_Info_Map: + if fi.indirection_level < 1 { + fi.indirection_level += 1 + defer fi.indirection_level -= 1 + io.write_byte(fi.writer, '&', &fi.n) + fmt_value(fi, a, verb) + return + } + + case runtime.Type_Info_Struct, + runtime.Type_Info_Union: + if fi.indirection_level < 1 { + fi.indirection_level += 1 + defer fi.indirection_level -= 1 + io.write_byte(fi.writer, '&', &fi.n) + fmt_value(fi, a, verb) + return + } + } + } + } + fmt_pointer(fi, ptr, verb) +} + +fmt_enumerated_array :: proc(fi: ^Info, v: any, info: runtime.Type_Info_Enumerated_Array, verb: rune) { + fi.record_level += 1 + defer fi.record_level -= 1 + + if fi.hash { + io.write_byte(fi.writer, '[' if verb != 'w' else '{', &fi.n) + io.write_byte(fi.writer, '\n', &fi.n) + defer { + fmt_write_indent(fi) + io.write_byte(fi.writer, ']' if verb != 'w' else '}', &fi.n) + } + indent := fi.indent + fi.indent += 1 + defer fi.indent = indent + + for i in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } + + idx, ok := stored_enum_value_to_string(info.index, info.min_value, i) + if ok { + io.write_byte(fi.writer, '.', &fi.n) + io.write_string(fi.writer, idx, &fi.n) + } else { + io.write_i64(fi.writer, i64(info.min_value)+i64(i), 10, &fi.n) + } + io.write_string(fi.writer, " = ", &fi.n) + + data := uintptr(v.data) + uintptr(i*info.elem_size) + fmt_arg(fi, any{rawptr(data), info.elem.id}, verb) + } + } +} + +fmt_map :: proc(fi: ^Info, v: any, info: runtime.Type_Info_Map, verb: rune) { + switch verb { + case: + fmt_bad_verb(fi, verb) + case 'v', 'w': + if verb == 'v' { + io.write_string(fi.writer, "map", &fi.n) + } + io.write_byte(fi.writer, '[' if verb != 'w' else '{', &fi.n) + defer io.write_byte(fi.writer, ']' if verb != 'w' else '}', &fi.n) + + + hash := fi.hash; defer fi.hash = hash + indent := fi.indent; defer fi.indent -= 1 + do_trailing_comma := hash + + fi.indent += 1 + if hash { + io.write_byte(fi.writer, '\n', &fi.n) + } + defer { + if hash { + for _ in 0.. 0 { io.write_string(fi.writer, ", ") } + if hash { + fmt_write_indent(fi) + } + j += 1 + + key := runtime.map_cell_index_dynamic(ks, info.map_info.ks, bucket_index) + value := runtime.map_cell_index_dynamic(vs, info.map_info.vs, bucket_index) + + fmt_arg(&Info{writer = fi.writer}, any{rawptr(key), info.key.id}, verb) + if hash { + io.write_string(fi.writer, " = ", &fi.n) + } else { + io.write_string(fi.writer, "=", &fi.n) + } + fmt_arg(fi, any{rawptr(value), info.value.id}, verb) + + if do_trailing_comma { io.write_string(fi.writer, ",\n", &fi.n) } + } + } + } + +} // Formats a value based on its type and formatting verb // @@ -2872,184 +3106,35 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) { type_info := type_info_of(v.id) switch &info in type_info.variant { - case runtime.Type_Info_Any: // Ignore - case runtime.Type_Info_Parameters: // Ignore + case runtime.Type_Info_Any: + // Ignore + case runtime.Type_Info_Parameters: + // Ignore case runtime.Type_Info_Named: fmt_named(fi, v, verb, info) - case runtime.Type_Info_Boolean: fmt_arg(fi, v, verb) - case runtime.Type_Info_Integer: fmt_arg(fi, v, verb) - case runtime.Type_Info_Rune: fmt_arg(fi, v, verb) - case runtime.Type_Info_Float: fmt_arg(fi, v, verb) - case runtime.Type_Info_Complex: fmt_arg(fi, v, verb) - case runtime.Type_Info_Quaternion: fmt_arg(fi, v, verb) - case runtime.Type_Info_String: fmt_arg(fi, v, verb) + case runtime.Type_Info_Boolean, + runtime.Type_Info_Integer, + runtime.Type_Info_Rune, + runtime.Type_Info_Float, + runtime.Type_Info_Complex, + runtime.Type_Info_Quaternion, + runtime.Type_Info_String: + fmt_arg(fi, v, verb) case runtime.Type_Info_Pointer: - if v.id == typeid_of(^runtime.Type_Info) { - reflect.write_type(fi.writer, (^^runtime.Type_Info)(v.data)^, &fi.n) - } else { - ptr := (^rawptr)(v.data)^ - if verb != 'p' && info.elem != nil { - a := any{ptr, info.elem.id} - - elem := runtime.type_info_base(info.elem) - if elem != nil { - #partial switch &e in elem.variant { - case runtime.Type_Info_Array, - runtime.Type_Info_Slice, - runtime.Type_Info_Dynamic_Array, - runtime.Type_Info_Map: - if ptr == nil { - io.write_string(fi.writer, "", &fi.n) - return - } - if fi.indirection_level < 1 { - fi.indirection_level += 1 - defer fi.indirection_level -= 1 - io.write_byte(fi.writer, '&') - fmt_value(fi, a, verb) - return - } - - case runtime.Type_Info_Struct, - runtime.Type_Info_Union, - runtime.Type_Info_Bit_Field: - if ptr == nil { - io.write_string(fi.writer, "", &fi.n) - return - } - if fi.indirection_level < 1 { - fi.indirection_level += 1 - defer fi.indirection_level -= 1 - io.write_byte(fi.writer, '&', &fi.n) - fmt_value(fi, a, verb) - return - } - } - } - } - fmt_pointer(fi, ptr, verb) - } + fmt_pointer_from_value(fi, v, info, verb) case runtime.Type_Info_Soa_Pointer: ptr := (^runtime.Raw_Soa_Pointer)(v.data)^ fmt_soa_pointer(fi, ptr, verb) case runtime.Type_Info_Multi_Pointer: - ptr := (^rawptr)(v.data)^ - if ptr == nil { - io.write_string(fi.writer, "", &fi.n) - return - } - if verb != 'p' && info.elem != nil { - a := any{ptr, info.elem.id} - - elem := runtime.type_info_base(info.elem) - if elem != nil { - if n, ok := fi.optional_len.?; ok { - fi.optional_len = nil - fmt_array(fi, ptr, n, elem.size, elem, verb) - return - } else if fi.use_nul_termination { - fi.use_nul_termination = false - fmt_array_nul_terminated(fi, ptr, -1, elem.size, elem, verb) - return - } - - #partial switch &e in elem.variant { - case runtime.Type_Info_Integer: - switch verb { - case 's', 'q': - switch elem.id { - case u8: - fmt_cstring(fi, cstring(ptr), verb) - return - case u16, u32, rune: - n := search_nul_termination(ptr, elem.size, -1) - fmt_array(fi, ptr, n, elem.size, elem, verb) - return - } - } - - case runtime.Type_Info_Array, - runtime.Type_Info_Slice, - runtime.Type_Info_Dynamic_Array, - runtime.Type_Info_Map: - if fi.indirection_level < 1 { - fi.indirection_level += 1 - defer fi.indirection_level -= 1 - io.write_byte(fi.writer, '&', &fi.n) - fmt_value(fi, a, verb) - return - } - - case runtime.Type_Info_Struct, - runtime.Type_Info_Union: - if fi.indirection_level < 1 { - fi.indirection_level += 1 - defer fi.indirection_level -= 1 - io.write_byte(fi.writer, '&', &fi.n) - fmt_value(fi, a, verb) - return - } - } - } - } - fmt_pointer(fi, ptr, verb) + fmt_multi_pointer(fi, v, info, verb) case runtime.Type_Info_Enumerated_Array: - fi.record_level += 1 - defer fi.record_level -= 1 - - if fi.hash { - io.write_byte(fi.writer, '[' if verb != 'w' else '{', &fi.n) - io.write_byte(fi.writer, '\n', &fi.n) - defer { - fmt_write_indent(fi) - io.write_byte(fi.writer, ']' if verb != 'w' else '}', &fi.n) - } - indent := fi.indent - fi.indent += 1 - defer fi.indent = indent - - for i in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } - - idx, ok := stored_enum_value_to_string(info.index, info.min_value, i) - if ok { - io.write_byte(fi.writer, '.', &fi.n) - io.write_string(fi.writer, idx, &fi.n) - } else { - io.write_i64(fi.writer, i64(info.min_value)+i64(i), 10, &fi.n) - } - io.write_string(fi.writer, " = ", &fi.n) - - data := uintptr(v.data) + uintptr(i*info.elem_size) - fmt_arg(fi, any{rawptr(data), info.elem.id}, verb) - } - } + fmt_enumerated_array(fi, v, info, verb) case runtime.Type_Info_Array: n := info.count @@ -3104,63 +3189,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) { case runtime.Type_Info_Map: - switch verb { - case: - fmt_bad_verb(fi, verb) - case 'v', 'w': - if verb == 'v' { - io.write_string(fi.writer, "map", &fi.n) - } - io.write_byte(fi.writer, '[' if verb != 'w' else '{', &fi.n) - defer io.write_byte(fi.writer, ']' if verb != 'w' else '}', &fi.n) - - - hash := fi.hash; defer fi.hash = hash - indent := fi.indent; defer fi.indent -= 1 - do_trailing_comma := hash - - fi.indent += 1 - if hash { - io.write_byte(fi.writer, '\n', &fi.n) - } - defer { - if hash { - for _ in 0.. 0 { io.write_string(fi.writer, ", ") } - if hash { - fmt_write_indent(fi) - } - j += 1 - - key := runtime.map_cell_index_dynamic(ks, info.map_info.ks, bucket_index) - value := runtime.map_cell_index_dynamic(vs, info.map_info.vs, bucket_index) - - fmt_arg(&Info{writer = fi.writer}, any{rawptr(key), info.key.id}, verb) - if hash { - io.write_string(fi.writer, " = ", &fi.n) - } else { - io.write_string(fi.writer, "=", &fi.n) - } - fmt_arg(fi, any{rawptr(value), info.value.id}, verb) - - if do_trailing_comma { io.write_string(fi.writer, ",\n", &fi.n) } - } - } - } + fmt_map(fi, v, info, verb) case runtime.Type_Info_Struct: fmt_struct(fi, v, verb, info, "") From de761cbdd39ed4ba036fc42c4b572abdd9da88d3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 27 Dec 2025 11:53:01 +0000 Subject: [PATCH 102/766] Remove temporary tuple fix alloca instructions if they are never used --- src/llvm_backend_opt.cpp | 10 +++++++++- src/llvm_backend_proc.cpp | 9 --------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp index 4971b1f10..4131f32bf 100644 --- a/src/llvm_backend_opt.cpp +++ b/src/llvm_backend_opt.cpp @@ -309,7 +309,15 @@ gb_internal void lb_run_remove_dead_instruction_pass(lbProcedure *p) { // NOTE(bill): Explicit instructions are set here because some instructions could have side effects switch (LLVMGetInstructionOpcode(curr_instr)) { - // case LLVMAlloca: + case LLVMAlloca: + if (map_get(&p->tuple_fix_map, curr_instr) != nullptr) { + // NOTE(bill, 2025-12-27): Remove temporary tuple fix alloca instructions + // if they are never used + removal_count += 1; + LLVMInstructionEraseFromParent(curr_instr); + was_dead_instructions = true; + } + break; case LLVMLoad: if (LLVMGetVolatile(curr_instr)) { break; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 27167aefd..216d600da 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1212,15 +1212,6 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c } tuple_fix_values[ret_count-1] = result; - #if 0 - for (isize j = 0; j < ret_count; j++) { - tuple_geps[j] = lb_emit_struct_ep(p, result_ptr, cast(i32)j); - } - for (isize j = 0; j < ret_count; j++) { - lb_emit_store(p, tuple_geps[j], tuple_fix_values[j]); - } - #endif - result = lb_emit_load(p, result_ptr); lbTupleFix tf = {tuple_fix_values}; From 4e40b808c4ab5f29fe6c50c9dccbf4acd99c8c45 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 27 Dec 2025 12:42:52 +0000 Subject: [PATCH 103/766] Split of the built-in custom formatters to improve code generation --- core/fmt/fmt.odin | 314 ++++++++++++++++++++++++---------------------- 1 file changed, 162 insertions(+), 152 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 27168d6c2..059413787 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2447,6 +2447,166 @@ fmt_array :: proc(fi: ^Info, data: rawptr, n: int, elem_size: int, elem: ^reflec fmt_write_array(fi, data, n, elem_size, elem.id, verb) } } + + +@(private) +fmt_named_buitlin_custom_formatters :: proc(fi: ^Info, v: any, verb: rune, info: runtime.Type_Info_Named) -> bool { + switch a in v { + case runtime.Source_Code_Location: + io.write_string(fi.writer, a.file_path, &fi.n) + + when ODIN_ERROR_POS_STYLE == .Default { + io.write_byte(fi.writer, '(', &fi.n) + io.write_int(fi.writer, int(a.line), 10, &fi.n) + if a.column != 0 { + io.write_byte(fi.writer, ':', &fi.n) + io.write_int(fi.writer, int(a.column), 10, &fi.n) + } + io.write_byte(fi.writer, ')', &fi.n) + } else when ODIN_ERROR_POS_STYLE == .Unix { + io.write_byte(fi.writer, ':', &fi.n) + io.write_int(fi.writer, int(a.line), 10, &fi.n) + if a.column != 0 { + io.write_byte(fi.writer, ':', &fi.n) + io.write_int(fi.writer, int(a.column), 10, &fi.n) + } + io.write_byte(fi.writer, ':', &fi.n) + } else { + #panic("Unhandled ODIN_ERROR_POS_STYLE") + } + return true + + case time.Duration: + ffrac :: proc(buf: []byte, v: u64, prec: int) -> (nw: int, nv: u64) { + v := v + w := len(buf) + print := false + for _ in 0.. int { + v := v + w := len(buf) + if v == 0 { + w -= 1 + buf[w] = '0' + } else { + for v > 0 { + w -= 1 + buf[w] = byte(v%10) + '0' + v /= 10 + } + } + return w + } + + buf: [32]byte + w := len(buf) + u := u64(a) + neg := a < 0 + if neg { + u = -u + } + + if u < u64(time.Second) { + prec: int + w -= 1 + buf[w] = 's' + w -= 1 + switch { + case u == 0: + io.write_string(fi.writer, "0s", &fi.n) + return true + case u < u64(time.Microsecond): + prec = 0 + buf[w] = 'n' + case u < u64(time.Millisecond): + prec = 3 + // U+00B5 'µ' micro sign == 0xC2 0xB5 + w -= 1 // Need room for two bytes + copy(buf[w:], "µ") + case: + prec = 6 + buf[w] = 'm' + } + w, u = ffrac(buf[:w], u, prec) + w = fint(buf[:w], u) + } else { + w -= 1 + buf[w] = 's' + w, u = ffrac(buf[:w], u, 9) + w = fint(buf[:w], u%60) + u /= 60 + if u > 0 { + w -= 1 + buf[w] = 'm' + w = fint(buf[:w], u%60) + u /= 60 + if u > 0 { + w -= 1 + buf[w] = 'h' + w = fint(buf[:w], u) + } + } + } + + if neg { + w -= 1 + buf[w] = '-' + } + io.write_string(fi.writer, string(buf[w:]), &fi.n) + return true + + case time.Time: + write_padded_number :: proc(fi: ^Info, i: i64, width: int) { + n := width-1 + for x := i; x >= 10; x /= 10 { + n -= 1 + } + for _ in 0..= 10; x /= 10 { - n -= 1 - } - for _ in 0.. (nw: int, nv: u64) { - v := v - w := len(buf) - print := false - for _ in 0.. int { - v := v - w := len(buf) - if v == 0 { - w -= 1 - buf[w] = '0' - } else { - for v > 0 { - w -= 1 - buf[w] = byte(v%10) + '0' - v /= 10 - } - } - return w - } - - buf: [32]byte - w := len(buf) - u := u64(a) - neg := a < 0 - if neg { - u = -u - } - - if u < u64(time.Second) { - prec: int - w -= 1 - buf[w] = 's' - w -= 1 - switch { - case u == 0: - io.write_string(fi.writer, "0s", &fi.n) - return - case u < u64(time.Microsecond): - prec = 0 - buf[w] = 'n' - case u < u64(time.Millisecond): - prec = 3 - // U+00B5 'µ' micro sign == 0xC2 0xB5 - w -= 1 // Need room for two bytes - copy(buf[w:], "µ") - case: - prec = 6 - buf[w] = 'm' - } - w, u = ffrac(buf[:w], u, prec) - w = fint(buf[:w], u) - } else { - w -= 1 - buf[w] = 's' - w, u = ffrac(buf[:w], u, 9) - w = fint(buf[:w], u%60) - u /= 60 - if u > 0 { - w -= 1 - buf[w] = 'm' - w = fint(buf[:w], u%60) - u /= 60 - if u > 0 { - w -= 1 - buf[w] = 'h' - w = fint(buf[:w], u) - } - } - } - - if neg { - w -= 1 - buf[w] = '-' - } - io.write_string(fi.writer, string(buf[w:]), &fi.n) - return - - case time.Time: - t := a - y, mon, d := time.date(t) - h, min, s := time.clock(t) - ns := (t._nsec - (t._nsec/1e9 + time.UNIX_TO_ABSOLUTE)*1e9) % 1e9 - write_padded_number(fi, i64(y), 4) - io.write_byte(fi.writer, '-', &fi.n) - write_padded_number(fi, i64(mon), 2) - io.write_byte(fi.writer, '-', &fi.n) - write_padded_number(fi, i64(d), 2) - io.write_byte(fi.writer, ' ', &fi.n) - - write_padded_number(fi, i64(h), 2) - io.write_byte(fi.writer, ':', &fi.n) - write_padded_number(fi, i64(min), 2) - io.write_byte(fi.writer, ':', &fi.n) - write_padded_number(fi, i64(s), 2) - io.write_byte(fi.writer, '.', &fi.n) - write_padded_number(fi, (ns), 9) - io.write_string(fi.writer, " +0000 UTC", &fi.n) - return - } + if verb != 'w' && fmt_named_buitlin_custom_formatters(fi, v, verb, info) { + return } #partial switch &b in info.base.variant { From 14a60adefe005d09066f420b1a24f11e365d9cec Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 27 Dec 2025 12:48:25 +0000 Subject: [PATCH 104/766] LLVM IR: Improve type switch case names for better debuggability when generating LLVM IR --- src/llvm_backend_stmt.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 3dbcea4fb..a8cc459c3 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1962,7 +1962,7 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss num_cases += cc->list.count; if (cc->list.count == 0) { GB_ASSERT(default_block == nullptr); - default_block = lb_create_block(p, "typeswitch.default.body"); + default_block = lb_create_block(p, "typeswitch.case.default"); else_block = default_block; } } @@ -2042,7 +2042,16 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss continue; } - lbBlock *body = lb_create_block(p, "typeswitch.body"); + char const *body_name = "typeswitch.case"; + + if (!are_types_identical(case_entity->type, parent_base_type)) { + gbString canonical_name = temp_canonical_string(case_entity->type); + gbString bn = gb_string_make(heap_allocator(), "typeswitch.case."); + bn = gb_string_append_length(bn, canonical_name, gb_string_length(canonical_name)); + body_name = cast(char const *)bn; + } + + lbBlock *body = lb_create_block(p, body_name); if (p->debug_info != nullptr) { LLVMSetCurrentDebugLocation2(p->builder, lb_debug_location_from_ast(p, clause)); } From 33352ed6cb15904021ff60c6e44fcb374a660400 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Sat, 27 Dec 2025 17:04:30 +0100 Subject: [PATCH 105/766] Add user32 scroll bar related bindings, and FrameRect --- core/sys/windows/user32.odin | 59 ++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 76826f80b..11c01db25 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -279,6 +279,7 @@ foreign user32 { SetLayeredWindowAttributes :: proc(hWnd: HWND, crKey: COLORREF, bAlpha: BYTE, dwFlags: DWORD) -> BOOL --- FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> int --- + FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> int --- EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- @@ -321,6 +322,11 @@ foreign user32 { SetClipboardData :: proc(uFormat: UINT, hMem: HANDLE) -> HANDLE --- IsClipboardFormatAvailable :: proc(format: UINT) -> BOOL --- EmptyClipboard :: proc() -> BOOL --- + + SetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO, redraw: BOOL) -> c_int --- + GetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO) -> BOOL --- + ShowScrollBar :: proc(hwnd: HWND, nBar: c_int, bShow: BOOL) -> BOOL --- + EnableScrollBar :: proc(hwnd: HWND, wSBflags: UINT, wArrows: UINT) -> BOOL --- } CreateWindowW :: #force_inline proc "system" ( @@ -874,3 +880,56 @@ LPNONCLIENTMETRICSW :: ^NONCLIENTMETRICSW LWA_COLORKEY :: 0x1 LWA_ALPHA :: 0x2 + +SCROLLINFO :: struct { + cbSize: UINT, + fMask: UINT, + nMin: c_int, + nMax: c_int, + nPage: UINT, + nPos: c_int, + nTrackPos: c_int, +} +LPSCROLLINFO :: ^SCROLLINFO + +// Scroll Bar Constants +SB_MIN :: 0 +SB_HORZ :: 0 +SB_VERT :: 1 +SB_CTL :: 2 +SB_BOTH :: 3 + +// Scroll Bar Commands +SB_LINEUP :: 0 +SB_LINELEFT :: 0 +SB_LINEDOWN :: 1 +SB_LINERIGHT :: 1 +SB_PAGEUP :: 2 +SB_PAGELEFT :: 2 +SB_PAGEDOWN :: 3 +SB_PAGERIGHT :: 3 +SB_THUMBPOSITION :: 4 +SB_THUMBTRACK :: 5 +SB_TOP :: 6 +SB_LEFT :: 6 +SB_BOTTOM :: 7 +SB_RIGHT :: 7 +SB_ENDSCROLL :: 8 + +// Constants for SCROLLINFO.fMask +SIF_RANGE :: 0x0001 +SIF_PAGE :: 0x0002 +SIF_POS :: 0x0004 +SIF_DISABLENOSCROLL :: 0x0008 +SIF_TRACKPOS :: 0x0010 +SIF_ALL :: (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS) + +// EnableScrollBar() flags +ESB_ENABLE_BOTH :: 0x0000 +ESB_DISABLE_BOTH :: 0x0003 +ESB_DISABLE_LEFT :: 0x0001 +ESB_DISABLE_RIGHT :: 0x0002 +ESB_DISABLE_UP :: 0x0001 +ESB_DISABLE_DOWN :: 0x0002 +ESB_DISABLE_LTUP :: ESB_DISABLE_LEFT +ESB_DISABLE_RTDN :: ESB_DISABLE_RIGHT From 39fa1b72015d25e738c6228b438e965cff7eef72 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 28 Dec 2025 11:52:31 +0000 Subject: [PATCH 106/766] LLVM IR: Improve basic block names for trivial switch statements for debuggability --- src/llvm_backend_stmt.cpp | 41 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index a8cc459c3..90b9c0204 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1720,7 +1720,46 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope * Ast *clause = body->stmts[i]; ast_node(cc, CaseClause, clause); - body_blocks[i] = lb_create_block(p, cc->list.count == 0 ? "switch.default.body" : "switch.case.body"); + char const *block_name = cc->list.count == 0 ? "switch.default.body" : "switch.case.body"; + + if (is_trivial && cc->list.count >= 1) { + gbString bn = gb_string_make(heap_allocator(), "switch.case."); + + Ast *first = cc->list[0]; + if (first->tav.mode == Addressing_Type) { + bn = gb_string_appendc(bn, "type."); + } else if (is_type_rune(first->tav.type)) { + bn = gb_string_appendc(bn, "rune."); + } else { + bn = gb_string_appendc(bn, "value."); + } + + for_array(i, cc->list) { + if (i > 0) { + bn = gb_string_appendc(bn, ".."); + } + + Ast *expr = cc->list[i]; + if (expr->tav.mode == Addressing_Type) { + bn = write_type_to_string(bn, expr->tav.type, false); + } else { + ExactValue value = expr->tav.value; + if (is_type_rune(expr->tav.type) && value.kind == ExactValue_Integer) { + + Rune r = cast(Rune)exact_value_to_i64(value); + u8 rune_temp[6] = {}; + isize size = gb_utf8_encode_rune(rune_temp, r); + bn = gb_string_append_length(bn, rune_temp, size); + } else { + bn = write_exact_value_to_string(bn, value, 1024); + } + } + } + + block_name = cast(char const *)bn; + } + + body_blocks[i] = lb_create_block(p, block_name); if (cc->list.count == 0) { default_block = body_blocks[i]; } From f1e29fadabc9168206938a8ff3c58d7cfc0b8cbb Mon Sep 17 00:00:00 2001 From: DarathDev Date: Sun, 28 Dec 2025 14:46:45 -0700 Subject: [PATCH 107/766] Add missing 'caller_location' to several procedures in 'slice' package --- core/slice/map.odin | 16 ++++++++-------- core/slice/permute.odin | 3 ++- core/slice/slice.odin | 32 ++++++++++++++++---------------- core/slice/sort.odin | 16 ++++++++-------- 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/core/slice/map.odin b/core/slice/map.odin index c68488d26..fafbb55ee 100644 --- a/core/slice/map.odin +++ b/core/slice/map.odin @@ -6,8 +6,8 @@ import "base:runtime" _ :: intrinsics _ :: runtime -map_keys :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (keys: []K, err: runtime.Allocator_Error) { - keys = make(type_of(keys), len(m), allocator) or_return +map_keys :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (keys: []K, err: runtime.Allocator_Error) { + keys = make(type_of(keys), len(m), allocator, loc) or_return i := 0 for key in m { keys[i] = key @@ -15,8 +15,8 @@ map_keys :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (keys: []K, } return } -map_values :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (values: []V, err: runtime.Allocator_Error) { - values = make(type_of(values), len(m), allocator) or_return +map_values :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (values: []V, err: runtime.Allocator_Error) { + values = make(type_of(values), len(m), allocator, loc) or_return i := 0 for _, value in m { values[i] = value @@ -37,8 +37,8 @@ Map_Entry_Info :: struct($Key, $Value: typeid) { } -map_entries :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (entries: []Map_Entry(K, V), err: runtime.Allocator_Error) { - entries = make(type_of(entries), len(m), allocator) or_return +map_entries :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (entries: []Map_Entry(K, V), err: runtime.Allocator_Error) { + entries = make(type_of(entries), len(m), allocator, loc) or_return i := 0 for key, value in m { entries[i].key = key @@ -48,13 +48,13 @@ map_entries :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (entries return } -map_entry_infos :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (entries: []Map_Entry_Info(K, V), err: runtime.Allocator_Error) #no_bounds_check { +map_entry_infos :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (entries: []Map_Entry_Info(K, V), err: runtime.Allocator_Error) #no_bounds_check { m := m rm := (^runtime.Raw_Map)(&m) info := runtime.type_info_base(type_info_of(M)).variant.(runtime.Type_Info_Map) if info.map_info != nil { - entries = make(type_of(entries), len(m), allocator) or_return + entries = make(type_of(entries), len(m), allocator, loc) or_return map_cap := uintptr(cap(m)) ks, vs, hs, _, _ := runtime.map_kvh_data_dynamic(rm^, info.map_info) diff --git a/core/slice/permute.odin b/core/slice/permute.odin index 42b6d4129..280989e47 100644 --- a/core/slice/permute.odin +++ b/core/slice/permute.odin @@ -29,12 +29,13 @@ Returns: make_permutation_iterator :: proc( slice: []$T, allocator := context.allocator, + loc := #caller_location, ) -> ( iter: Permutation_Iterator(T), error: runtime.Allocator_Error, ) #optional_allocator_error { iter.slice = slice - iter.counters = make([]int, len(iter.slice), allocator) or_return + iter.counters = make([]int, len(iter.slice), allocator, loc) or_return return } diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 4e3289321..58d35b9f0 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -454,7 +454,7 @@ swap_with_slice :: proc(a, b: $T/[]$E, loc := #caller_location) { } @(require_results) -concatenate :: proc(a: []$T/[]$E, allocator := context.allocator) -> (res: T, err: runtime.Allocator_Error) #optional_allocator_error { +concatenate :: proc(a: []$T/[]$E, allocator := context.allocator, loc := #caller_location) -> (res: T, err: runtime.Allocator_Error) #optional_allocator_error { if len(a) == 0 { return } @@ -462,7 +462,7 @@ concatenate :: proc(a: []$T/[]$E, allocator := context.allocator) -> (res: T, er for s in a { n += len(s) } - res = make(T, n, allocator) or_return + res = make(T, n, allocator, loc) or_return i := 0 for s in a { i += copy(res[i:], s) @@ -584,8 +584,8 @@ as_ptr :: proc "contextless" (array: $T/[]$E) -> [^]E { @(require_results) -mapper :: proc(s: $S/[]$U, f: proc(U) -> $V, allocator := context.allocator) -> (r: []V, err: runtime.Allocator_Error) #optional_allocator_error { - r = make([]V, len(s), allocator) or_return +mapper :: proc(s: $S/[]$U, f: proc(U) -> $V, allocator := context.allocator, loc := #caller_location) -> (r: []V, err: runtime.Allocator_Error) #optional_allocator_error { + r = make([]V, len(s), allocator, loc) or_return for v, i in s { r[i] = f(v) } @@ -611,33 +611,33 @@ reduce_reverse :: proc(s: $S/[]$U, initializer: $V, f: proc(V, U) -> V) -> V { } @(require_results) -filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error { - r := make([dynamic]U, 0, 0, allocator) or_return +filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator, loc := #caller_location) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error { + r := make([dynamic]U, 0, 0, allocator, loc) or_return for v in s { if f(v) { - append(&r, v) + append(&r, v, loc) } } return r[:], nil } @(require_results) -filter_reverse :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error { - r := make([dynamic]U, 0, 0, allocator) or_return +filter_reverse :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator, loc := #caller_location) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error { + r := make([dynamic]U, 0, 0, allocator, loc) or_return for i := len(s)-1; i >= 0; i -= 1 { #no_bounds_check v := s[i] if f(v) { - append(&r, v) + append(&r, v, loc) } } return r[:], nil } @(require_results) -scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := context.allocator) -> (res: []V, err: runtime.Allocator_Error) #optional_allocator_error { +scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := context.allocator, loc := #caller_location) -> (res: []V, err: runtime.Allocator_Error) #optional_allocator_error { if len(s) == 0 { return } - res = make([]V, len(s), allocator) or_return + res = make([]V, len(s), allocator, loc) or_return p := as_ptr(s) q := as_ptr(res) r := initializer @@ -654,14 +654,14 @@ scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := c @(require_results) -repeat :: proc(s: $S/[]$U, count: int, allocator := context.allocator) -> (b: S, err: runtime.Allocator_Error) #optional_allocator_error { +repeat :: proc(s: $S/[]$U, count: int, allocator := context.allocator, loc := #caller_location) -> (b: S, err: runtime.Allocator_Error) #optional_allocator_error { if count < 0 { panic("slice: negative repeat count") } else if count > 0 && (len(s)*count)/count != len(s) { panic("slice: repeat count will cause an overflow") } - b = make(S, len(s)*count, allocator) or_return + b = make(S, len(s)*count, allocator, loc) or_return i := copy(b, s) for i < len(b) { // 2^N trick to reduce the need to copy copy(b[i:], b[:i]) @@ -918,8 +918,8 @@ bitset_to_enum_slice_with_buffer :: proc(buf: []$E, bs: $T) -> (slice: []E) wher // e.g.: // sl := slice.bitset_to_enum_slice(bs) @(require_results) -bitset_to_enum_slice_with_make :: proc(bs: $T, $E: typeid, allocator := context.allocator) -> (slice: []E) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E { - buf := make([]E, card(bs), allocator) +bitset_to_enum_slice_with_make :: proc(bs: $T, $E: typeid, allocator := context.allocator, loc := #caller_location) -> (slice: []E) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E { + buf := make([]E, card(bs), allocator, loc) return bitset_to_enum_slice(buf, bs) } diff --git a/core/slice/sort.odin b/core/slice/sort.odin index a9f8c1067..d438cfc1b 100644 --- a/core/slice/sort.odin +++ b/core/slice/sort.odin @@ -54,9 +54,9 @@ sort :: proc(data: $T/[]$E) where ORD(E) { sort_by_indices :: proc{ sort_by_indices_allocate, _sort_by_indices} -sort_by_indices_allocate :: proc(data: $T/[]$E, indices: []int, allocator := context.allocator) -> (sorted: T) { +sort_by_indices_allocate :: proc(data: $T/[]$E, indices: []int, allocator := context.allocator, loc := #caller_location) -> (sorted: T) { assert(len(data) == len(indices)) - sorted = make(T, len(data), allocator) + sorted = make(T, len(data), allocator, loc) for v, i in indices { sorted[i] = data[v] } @@ -100,8 +100,8 @@ sort_from_permutation_indices :: proc(data: $T/[]$E, indices: []int) { // sort sorts a slice and returns a slice of the original indices // This sort is not guaranteed to be stable -sort_with_indices :: proc(data: $T/[]$E, allocator := context.allocator) -> (indices: []int) where ORD(E) { - indices = make([]int, len(data), allocator) +sort_with_indices :: proc(data: $T/[]$E, allocator := context.allocator, loc := #caller_location) -> (indices: []int) where ORD(E) { + indices = make([]int, len(data), allocator, loc) when size_of(E) != 0 { if n := len(data); n > 1 { for _, idx in indices { @@ -173,8 +173,8 @@ sort_by_with_data :: proc(data: $T/[]$E, less: proc(i, j: E, user_data: rawptr) // sort_by sorts a slice with a given procedure to test whether two values are ordered "i < j" // This sort is not guaranteed to be stable -sort_by_with_indices :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool, allocator := context.allocator) -> (indices : []int) { - indices = make([]int, len(data), allocator) +sort_by_with_indices :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool, allocator := context.allocator, loc := #caller_location) -> (indices : []int) { + indices = make([]int, len(data), allocator, loc) when size_of(E) != 0 { if n := len(data); n > 1 { for _, idx in indices { @@ -205,8 +205,8 @@ sort_by_with_indices :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool, allocat return indices } -sort_by_with_indices_with_data :: proc(data: $T/[]$E, less: proc(i, j: E, user_data: rawptr) -> bool, user_data: rawptr, allocator := context.allocator) -> (indices : []int) { - indices = make([]int, len(data), allocator) +sort_by_with_indices_with_data :: proc(data: $T/[]$E, less: proc(i, j: E, user_data: rawptr) -> bool, user_data: rawptr, allocator := context.allocator, loc := #caller_location) -> (indices : []int) { + indices = make([]int, len(data), allocator, loc) when size_of(E) != 0 { if n := len(data); n > 1 { for _, idx in indices { From 6441fc09e0c540260cfad3f3a271811fe8423fc4 Mon Sep 17 00:00:00 2001 From: Sylphrena Date: Mon, 29 Dec 2025 15:27:58 +0100 Subject: [PATCH 108/766] Fix standard json parsing / unmarshalling issue for pure arrays --- core/encoding/json/parser.odin | 14 +++++++------- core/encoding/json/validator.odin | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/encoding/json/parser.odin b/core/encoding/json/parser.odin index d6c3df7c6..cd6518955 100644 --- a/core/encoding/json/parser.odin +++ b/core/encoding/json/parser.odin @@ -38,7 +38,7 @@ parse_string :: proc(data: string, spec := DEFAULT_SPECIFICATION, parse_integers switch p.spec { case .JSON: - return parse_object(&p, loc) + return parse_value(&p, loc) case .JSON5: return parse_value(&p, loc) case .SJSON: @@ -84,7 +84,7 @@ expect_token :: proc(p: ^Parser, kind: Token_Kind) -> Error { parse_colon :: proc(p: ^Parser) -> (err: Error) { - colon_err := expect_token(p, .Colon) + colon_err := expect_token(p, .Colon) if colon_err == nil { return nil } @@ -133,13 +133,13 @@ parse_value :: proc(p: ^Parser, loc := #caller_location) -> (value: Value, err: f, _ := strconv.parse_f64(token.text) value = Float(f) return - + case .Ident: if p.spec == .MJSON { advance_token(p) return clone_string(token.text, p.allocator, loc) } - + case .String: advance_token(p) return unquote_string(token, p.spec, p.allocator, loc) @@ -192,7 +192,7 @@ parse_array :: proc(p: ^Parser, loc := #caller_location) -> (value: Value, err: for p.curr_token.kind != .Close_Bracket { elem := parse_value(p, loc) or_return append(&array, elem, loc) - + if parse_comma(p) { break } @@ -278,7 +278,7 @@ parse_object_body :: proc(p: ^Parser, end_token: Token_Kind, loc := #caller_loca if parse_comma(p) { break } - } + } return obj, .None } @@ -481,4 +481,4 @@ unquote_string :: proc(token: Token, spec: Specification, allocator := context.a } return string(b[:w]), nil -} \ No newline at end of file +} diff --git a/core/encoding/json/validator.odin b/core/encoding/json/validator.odin index a6873319d..e90270335 100644 --- a/core/encoding/json/validator.odin +++ b/core/encoding/json/validator.odin @@ -5,10 +5,10 @@ import "core:mem" // NOTE(bill): is_valid will not check for duplicate keys is_valid :: proc(data: []byte, spec := DEFAULT_SPECIFICATION, parse_integers := false) -> bool { p := make_parser(data, spec, parse_integers, mem.nil_allocator()) - + switch p.spec { case .JSON: - return validate_object(&p) + return validate_value(&p) case .JSON5: return validate_value(&p) case .MJSON: @@ -52,7 +52,7 @@ validate_object :: proc(p: ^Parser) -> bool { if err := expect_token(p, .Open_Brace); err != .None { return false } - + validate_object_body(p, .Close_Brace) or_return if err := expect_token(p, .Close_Brace); err != .None { @@ -102,7 +102,7 @@ validate_value :: proc(p: ^Parser) -> bool { case .Open_Bracket: return validate_array(p) - + case .Ident: if p.spec == .MJSON { advance_token(p) From 3f9aefda202f9677987d72c0be52417772315edc Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 29 Dec 2025 17:34:01 +0100 Subject: [PATCH 109/766] Added CheckFramebufferStatus to WebGL bindings --- core/sys/wasm/js/odin.js | 3 +++ vendor/wasm/WebGL/webgl.odin | 1 + 2 files changed, 4 insertions(+) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 0c617dd8e..e90ccc124 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -616,6 +616,9 @@ class WebGLInterface { FramebufferTexture2D: (target, attachment, textarget, texture, level) => { this.ctx.framebufferTexture2D(target, attachment, textarget, this.textures[texture], level); }, + CheckFramebufferStatus: (target) => { + return this.ctx.checkFramebufferStatus(target) + }, FrontFace: (mode) => { this.ctx.frontFace(mode); }, diff --git a/vendor/wasm/WebGL/webgl.odin b/vendor/wasm/WebGL/webgl.odin index 601071c3a..d607ec743 100644 --- a/vendor/wasm/WebGL/webgl.odin +++ b/vendor/wasm/WebGL/webgl.odin @@ -113,6 +113,7 @@ foreign webgl { Flush :: proc() --- FramebufferRenderbuffer :: proc(target, attachment, renderbufertarget: Enum, renderbuffer: Renderbuffer) --- FramebufferTexture2D :: proc(target, attachment, textarget: Enum, texture: Texture, level: i32) --- + CheckFramebufferStatus :: proc(target: Enum) -> Enum --- FrontFace :: proc(mode: Enum) --- GenerateMipmap :: proc(target: Enum) --- From fb52238e369dc5c1712d2eca2c787473af59bca3 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 29 Dec 2025 17:42:19 +0100 Subject: [PATCH 110/766] Fix bugs in odin.js:GetActiveUniformBlockName --- core/sys/wasm/js/odin.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index e90ccc124..063fd990c 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -1304,17 +1304,21 @@ class WebGLInterface { this.assertWebGL2(); return this.ctx.getUniformBlockIndex(this.programs[program], this.mem.loadString(uniformBlockName_ptr, uniformBlockName_len)); }, - GetActiveUniformBlockName: (program, uniformBlockIndex, buf_ptr, buf_len, length_ptr) => { + GetActiveUniformBlockName: (program, uniformBlockIndex, name_buf_ptr, name_buf_len, name_length_ptr) => { this.assertWebGL2(); let name = this.ctx.getActiveUniformBlockName(this.programs[program], uniformBlockIndex); - let n = Math.min(buf_len, name.length); - name = name.substring(0, n); - this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(name)) - this.mem.storeInt(length_ptr, n); + if (name_buf_ptr && name_buf_len > 0) { + let n = Math.min(name_buf_len, name.length); + name = name.substring(0, n); + this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); + this.mem.storeInt(name_length_ptr, n); + } else if (name_length_ptr) { + this.mem.storeInt(name_length_ptr, name.length); + } }, GetActiveUniforms: (program, uniformIndices_ptr, uniformIndices_len, pname, res_ptr) => { - thid.assertWebGL2(); + this.assertWebGL2(); let indices = this.mem.loadU32Array(uniformIndices_ptr, uniformIndices_len); this.ctx.getActiveUniforms(this.programs[program], indices, pname) this.mem.loadI32Array(res_ptr, indices.length).set(indices) @@ -1323,7 +1327,7 @@ class WebGLInterface { this.assertWebGL2(); let res = this.ctx.getActiveUniformBlockParameter(this.programs[program], uniformBlockIndex, pname); - if (e instanceof Uint32Array) { // for pname GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES + if (res instanceof Uint32Array) { // for pname GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES this.mem.loadU32Array(params_ptr, res.length).set(res) } else { this.mem.storeI32(params_ptr, res) From 23984dc11019674aa00f08c533547d3c690425ac Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Mon, 29 Dec 2025 18:57:42 +0100 Subject: [PATCH 111/766] Fix NetBSD CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc5e4f592..e6219f370 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ jobs: name: NetBSD Build, Check, and Test runs-on: ubuntu-latest env: - PKGSRC_BRANCH: 2025Q2 + PKGSRC_BRANCH: 2025Q4 steps: - uses: actions/checkout@v4 - name: Build, Check, and Test From 47f20c0ffb1d9e48e437c92e3312b4a14d3b8443 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 29 Dec 2025 20:57:25 +0100 Subject: [PATCH 112/766] Added 'set_document_title' to be able to rename the tab --- core/sys/wasm/js/dom.odin | 2 ++ core/sys/wasm/js/odin.js | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/core/sys/wasm/js/dom.odin b/core/sys/wasm/js/dom.odin index a4f8d7687..6dd9dbf45 100644 --- a/core/sys/wasm/js/dom.odin +++ b/core/sys/wasm/js/dom.odin @@ -22,6 +22,8 @@ foreign dom_lib { window_set_scroll :: proc(x, y: f64) --- set_element_style :: proc(id: string, key: string, value: string) --- + + set_document_title :: proc(title: string) --- } get_element_value_string :: proc "contextless" (id: string, buf: []byte) -> string { diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 063fd990c..19ac3093e 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -2050,6 +2050,11 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { } }, + set_document_title: (title_ptr, title_len) => { + let title = wasmMemoryInterface.loadString(title_ptr, title_len); + document.title = title; + }, + get_element_key_f64: (id_ptr, id_len, key_ptr, key_len) => { let id = wasmMemoryInterface.loadString(id_ptr, id_len); let key = wasmMemoryInterface.loadString(key_ptr, key_len); From ba68d75c6ff163c8c09793c9f42bab8229b6f490 Mon Sep 17 00:00:00 2001 From: dozn Date: Mon, 29 Dec 2025 12:23:54 -0800 Subject: [PATCH 113/766] Add JSON5/SJSON Comments When Marshalling Allows user-facing JSON5/SJSON to have comments explaining field usage. `json.Marshal_Options.pretty` must be enabled since we only use single-line comments (not to mention it wouldn't be terribly useful without `pretty` set anyways). We don't escape anything, so `\n` will display as "\n", but you're still able to enter in a proper newline character and it'll be displayed on multiple lines. --- core/encoding/json/marshal.odin | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index e563c326a..bed2018e3 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -413,6 +413,12 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: } opt_write_iteration(w, opt, first_iteration) or_return + + if opt.pretty { + comment := reflect.struct_tag_get(reflect.Struct_Tag(info.tags[i]), "jsoncomment") + opt_write_comment(w, opt, &comment) or_return + } + first_iteration = false if json_name != "" { opt_write_key(w, opt, json_name) or_return @@ -533,6 +539,26 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: return } +// Newlines are split into multiple comment lines +opt_write_comment :: proc(w: io.Writer, opt: ^Marshal_Options, comment: ^string) -> (err: io.Error) { + if comment^ == "" { + return nil + } + + switch opt.spec { + case .JSON5, .MJSON: + for line in strings.split_iterator(comment, "\n") { + io.write_string(w, "// ") or_return + io.write_string(w, line) or_return + io.write_rune(w, '\n') or_return + opt_write_indentation(w, opt) or_return + } + case .JSON: return nil + } + + return nil +} + // write key as quoted string or with optional quotes in mjson opt_write_key :: proc(w: io.Writer, opt: ^Marshal_Options, name: string) -> (err: io.Error) { switch opt.spec { From ef33e551825258b51f095d3e52945b57fc795c4e Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Mon, 29 Dec 2025 15:31:12 -0500 Subject: [PATCH 114/766] Fix auto objc_msgSend incorrectly treating certain class methods as instance methods. --- src/check_expr.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 2fe6c0251..3b32d734a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8172,13 +8172,7 @@ gb_internal void check_objc_call_expr(CheckerContext *c, Operand *operand, Ast * Type *return_type = proc.result_count == 0 ? nullptr : proc.results->Tuple.variables[0]->type; bool is_return_instancetype = return_type != nullptr && return_type == t_objc_instancetype; - if (params.count == 0 || !is_type_objc_ptr_to_object(params[0]->type)) { - if (!proc_entity->Procedure.is_objc_class_method) { - // Not a class method, invalid call - error(call, "Invalid Objective-C call: The Objective-C method is not a class method but this first parameter is not an Objective-C object pointer."); - return; - } - + if (proc_entity->Procedure.is_objc_class_method) { if (is_return_instancetype) { if (ce->proc->kind == Ast_SelectorExpr) { ast_node(se, SelectorExpr, ce->proc); @@ -8194,7 +8188,8 @@ gb_internal void check_objc_call_expr(CheckerContext *c, Operand *operand, Ast * self_type = t_objc_Class; params_start = 0; - } else if (ce->args.count > 0) { + } else { + GB_ASSERT(ce->args.count > 0); GB_ASSERT(is_type_objc_ptr_to_object(params[0]->type)); if (ce->args[0]->tav.objc_super_target) { From 0bf4ffe46943f8f8bfe2f4f077c92be1512d117a Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Mon, 29 Dec 2025 18:39:31 +0100 Subject: [PATCH 115/766] Fix handling of #force_inline --- src/parser.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index b2ff55396..823021e04 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2183,7 +2183,7 @@ gb_internal Ast *parse_force_inlining_operand(AstFile *f, Token token) { return expr; } if (e->kind != Ast_ProcLit && e->kind != Ast_CallExpr) { - syntax_error(expr, "%.*s must be followed by a procedure literal or call, got %.*s", LIT(token.string), LIT(ast_strings[expr->kind])); + syntax_error(expr, "%.*s must be followed by a procedure literal or call, got %.*s", LIT(token.string), LIT(ast_strings[e->kind])); return ast_bad_expr(f, token, f->curr_token); } ProcInlining pi = ProcInlining_none; @@ -2197,17 +2197,17 @@ gb_internal Ast *parse_force_inlining_operand(AstFile *f, Token token) { if (pi != ProcInlining_none) { if (e->kind == Ast_ProcLit) { - if (expr->ProcLit.inlining != ProcInlining_none && - expr->ProcLit.inlining != pi) { + if (e->ProcLit.inlining != ProcInlining_none && + e->ProcLit.inlining != pi) { syntax_error(expr, "Cannot apply both '#force_inline' and '#force_no_inline' to a procedure literal"); } - expr->ProcLit.inlining = pi; + e->ProcLit.inlining = pi; } else if (e->kind == Ast_CallExpr) { - if (expr->CallExpr.inlining != ProcInlining_none && - expr->CallExpr.inlining != pi) { + if (e->CallExpr.inlining != ProcInlining_none && + e->CallExpr.inlining != pi) { syntax_error(expr, "Cannot apply both '#force_inline' and '#force_no_inline' to a procedure call"); } - expr->CallExpr.inlining = pi; + e->CallExpr.inlining = pi; } } From affaefc13ace1ac95b97c043314da13d4587eb44 Mon Sep 17 00:00:00 2001 From: dozn Date: Tue, 30 Dec 2025 04:42:06 -0800 Subject: [PATCH 116/766] Moved `first_iteration` up a couple lines so it makes sense readability-wise. --- core/encoding/json/marshal.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index bed2018e3..acf12331a 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -413,13 +413,13 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: } opt_write_iteration(w, opt, first_iteration) or_return + first_iteration = false if opt.pretty { comment := reflect.struct_tag_get(reflect.Struct_Tag(info.tags[i]), "jsoncomment") opt_write_comment(w, opt, &comment) or_return } - first_iteration = false if json_name != "" { opt_write_key(w, opt, json_name) or_return } else { From f1c6c52c215c8087a4fb82b68dcf03741cb8821b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 30 Dec 2025 12:58:37 +0000 Subject: [PATCH 117/766] Fix `@(static, rodata)` for slices --- src/llvm_backend_stmt.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 90b9c0204..b3b5f4251 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1745,7 +1745,6 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope * } else { ExactValue value = expr->tav.value; if (is_type_rune(expr->tav.type) && value.kind == ExactValue_Integer) { - Rune r = cast(Rune)exact_value_to_i64(value); u8 rune_temp[6] = {}; isize size = gb_utf8_encode_rune(rune_temp, r); @@ -2170,14 +2169,7 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss gb_internal void lb_build_static_variables(lbProcedure *p, AstValueDecl *vd) { for_array(i, vd->names) { lbValue value = {}; - if (vd->values.count > 0) { - GB_ASSERT(vd->names.count == vd->values.count); - Ast *ast_value = vd->values[i]; - GB_ASSERT(ast_value->tav.mode == Addressing_Constant || - ast_value->tav.mode == Addressing_Invalid); - value = lb_const_value(p->module, ast_value->tav.type, ast_value->tav.value, LB_CONST_CONTEXT_DEFAULT_NO_LOCAL); - } Ast *ident = vd->names[i]; GB_ASSERT(!is_blank_ident(ident)); @@ -2185,6 +2177,19 @@ gb_internal void lb_build_static_variables(lbProcedure *p, AstValueDecl *vd) { GB_ASSERT(e->flags & EntityFlag_Static); String name = e->token.string; + if (vd->values.count > 0) { + GB_ASSERT(vd->names.count == vd->values.count); + Ast *ast_value = vd->values[i]; + GB_ASSERT(ast_value->tav.mode == Addressing_Constant || + ast_value->tav.mode == Addressing_Invalid); + + auto cc = LB_CONST_CONTEXT_DEFAULT_NO_LOCAL; + if (e->Variable.is_rodata) { + cc.is_rodata = true; + } + value = lb_const_value(p->module, ast_value->tav.type, ast_value->tav.value, cc); + } + String mangled_name = {}; { gbString str = gb_string_make_length(permanent_allocator(), p->name.text, p->name.len); From 93d7e2a4526bc1075f6eef26b3e1ba6345450f05 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 30 Dec 2025 13:08:30 +0000 Subject: [PATCH 118/766] Add `globaldynamic` `thread_local` model (same as the current `default`) --- src/checker.cpp | 2 ++ src/llvm_backend_general.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/checker.cpp b/src/checker.cpp index 33121b453..13d02c512 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4027,6 +4027,7 @@ gb_internal DECL_ATTRIBUTE_PROC(var_decl_attribute) { } else if (ev.kind == ExactValue_String) { String model = ev.value_string; if (model == "default" || + model == "globaldynamic" || model == "localdynamic" || model == "initialexec" || model == "localexec") { @@ -4035,6 +4036,7 @@ gb_internal DECL_ATTRIBUTE_PROC(var_decl_attribute) { ERROR_BLOCK(); error(elem, "Invalid thread local model '%.*s'. Valid models:", LIT(model)); error_line("\tdefault\n"); + error_line("\tglobaldynamic\n"); error_line("\tlocaldynamic\n"); error_line("\tinitialexec\n"); error_line("\tlocalexec\n"); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 4ebb40d96..c0e57143d 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -2628,6 +2628,8 @@ gb_internal bool lb_apply_thread_local_model(LLVMValueRef value, String model) { LLVMThreadLocalMode mode = LLVMGeneralDynamicTLSModel; if (model == "default") { mode = LLVMGeneralDynamicTLSModel; + } else if (model == "globaldynamic") { + mode = LLVMGeneralDynamicTLSModel; } else if (model == "localdynamic") { mode = LLVMLocalDynamicTLSModel; } else if (model == "initialexec") { From 589dbbddd20f444786e1d71258faf2f692450c49 Mon Sep 17 00:00:00 2001 From: dozn Date: Tue, 30 Dec 2025 17:02:06 -0800 Subject: [PATCH 119/766] [encoding/json] Fix Escapes When Marshalling Fixes https://github.com/odin-lang/Odin/issues/6060 and https://github.com/odin-lang/Odin/issues/6075 The boolean "true" was setting `html_safe` instead of `for_json`. Chalk one up for the "use enums instead of booleans" crowd. --- core/encoding/json/marshal.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index acf12331a..c4e348aa8 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -122,9 +122,9 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: case runtime.Type_Info_Rune: r := a.(rune) - io.write_byte(w, '"') or_return - io.write_escaped_rune(w, r, '"', true) or_return - io.write_byte(w, '"') or_return + io.write_byte(w, '"') or_return + io.write_escaped_rune(w, r, '"', for_json = true) or_return + io.write_byte(w, '"') or_return case runtime.Type_Info_Float: switch f in a { From e4bf5476c3cc218b1265b2cb90c3b4fe3c9d3df8 Mon Sep 17 00:00:00 2001 From: ske Date: Tue, 30 Dec 2025 22:08:40 -0300 Subject: [PATCH 120/766] Fix literal endianness (fix #6068) --- src/llvm_backend_const.cpp | 23 ++++++-- tests/issues/run.bat | 1 + tests/issues/run.sh | 1 + tests/issues/test_issue_6068.odin | 92 +++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 tests/issues/test_issue_6068.odin diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 22e124792..9c407be00 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -498,6 +498,13 @@ gb_internal LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, Bi if (big_int_is_zero(a)) { return LLVMConstNull(lb_type(m, original_type)); } + + BigInt val = {}; + big_int_init(&val, a); + + if (big_int_is_neg(&val)) { + mp_incr(&val); + } size_t sz = cast(size_t)type_size_of(original_type); u64 rop64[4] = {}; // 2 u64 is the maximum we will ever need, so doubling it will be fine :P @@ -509,7 +516,7 @@ gb_internal LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, Bi size_t nails = 0; mp_endian endian = MP_LITTLE_ENDIAN; - max_count = mp_pack_count(a, nails, size); + max_count = mp_pack_count(&val, nails, size); if (sz < max_count) { debug_print_big_int(a); gb_printf_err("%s -> %tu\n", type_to_string(original_type), sz); @@ -520,7 +527,7 @@ gb_internal LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, Bi mp_err err = mp_pack(rop, sz, &written, MP_LSB_FIRST, size, endian, nails, - a); + &val); GB_ASSERT(err == MP_OKAY); if (!is_type_endian_little(original_type)) { @@ -531,12 +538,18 @@ gb_internal LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, Bi } } + if (big_int_is_neg(a)) { + // sizeof intead of sz for sign extend to work properly + for (size_t i = 0; i < sizeof rop64; i++) { + rop[i] = ~rop[i]; + } + } + + big_int_dealloc(&val); + GB_ASSERT(!is_type_array(original_type)); LLVMValueRef value = LLVMConstIntOfArbitraryPrecision(lb_type(m, original_type), cast(unsigned)((sz+7)/8), cast(u64 *)rop); - if (big_int_is_neg(a)) { - value = LLVMConstNeg(value); - } return value; } diff --git a/tests/issues/run.bat b/tests/issues/run.bat index bbd7cbc90..0ceaf554c 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -26,6 +26,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin build ..\test_issue_5097-2.odin %COMMON% || exit /b ..\..\..\odin build ..\test_issue_5265.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_5699.odin %COMMON% || exit /b +..\..\..\odin test ..\test_issue_6068.odin %COMMON% || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index a9a4bb88d..ce02ba20a 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -33,6 +33,7 @@ $ODIN build ../test_issue_5097.odin $COMMON $ODIN build ../test_issue_5097-2.odin $COMMON $ODIN build ../test_issue_5265.odin $COMMON $ODIN test ../test_issue_5699.odin $COMMON +$ODIN test ../test_issue_6068.odin $COMMON set +x diff --git a/tests/issues/test_issue_6068.odin b/tests/issues/test_issue_6068.odin new file mode 100644 index 000000000..011c95442 --- /dev/null +++ b/tests/issues/test_issue_6068.odin @@ -0,0 +1,92 @@ +// Tests issue #6068 https://github.com/odin-lang/Odin/issues/6068 +package test_issues + +import "core:testing" + +@test +test_issue_6068 :: proc(t: ^testing.T) { + { + check_be : i128be = -1 + check_le : i128le = -1 + value := -1 + reverse := i128be(value) + + // test variable + testing.expect(t, i128be(value) == check_be) + testing.expect(t, i128be(-1) == check_be) + testing.expect(t, cast(i128be)value == check_be) + testing.expect(t, cast(i128be)-1 == check_be) + testing.expect(t, i128be(int(-1)) == check_be) + testing.expect(t, cast(i128be)int(-1) == check_be) + testing.expect(t, i128le(value) == check_le) + testing.expect(t, i128le(-1) == check_le) + testing.expect(t, cast(i128le)value == check_le) + testing.expect(t, cast(i128le)-1 == check_le) + testing.expect(t, i128le(int(-1)) == check_le) + testing.expect(t, cast(i128le)int(-1) == check_le) + testing.expect(t, i128le(reverse) == check_le) + testing.expect(t, cast(i128le)reverse == check_le) + + // test literal + testing.expect(t, i128be(value) == -1) + testing.expect(t, i128be(-1) == -1) + testing.expect(t, cast(i128be)value == -1) + testing.expect(t, cast(i128be)-1 == -1) + testing.expect(t, i128be(int(-1)) == -1) + testing.expect(t, cast(i128be)int(-1) == -1) + testing.expect(t, i128le(value) == -1) + testing.expect(t, i128le(-1) == -1) + testing.expect(t, cast(i128le)value == -1) + testing.expect(t, cast(i128le)-1 == -1) + testing.expect(t, i128le(int(-1)) == -1) + testing.expect(t, cast(i128le)int(-1) == -1) + testing.expect(t, i128le(reverse) == -1) + testing.expect(t, cast(i128le)reverse == -1) + } + + // NOTE(ske): [llvm_backend_const.cpp:lb_big_int_to_llvm] + // floats behaved wonky when I tested because I forgot to sign extend whole + // rop so I added more tests here to be safe + { + check_be : f64be = -1.234 + check_le : f64le = -1.234 + value : f64 = -1.234 + reverse := f64be(value) + + // test variable + testing.expect(t, f64be(value) == check_be) + testing.expect(t, f64be(-1.234) == check_be) + testing.expect(t, cast(f64be)value == check_be) + testing.expect(t, cast(f64be)-1.234 == check_be) + testing.expect(t, f64be(int(-1.234)) == check_be) + testing.expect(t, cast(f64be)int(-1.234) == check_be) + testing.expect(t, f64le(value) == check_le) + testing.expect(t, f64le(-1.234) == check_le) + testing.expect(t, cast(f64le)value == check_le) + testing.expect(t, cast(f64le)-1.234 == check_le) + testing.expect(t, f64le(int(-1.234)) == check_le) + testing.expect(t, cast(f64le)int(-1.234) == check_le) + testing.expect(t, f64le(reverse) == check_le) + testing.expect(t, cast(f64le)reverse == check_le) + + // test literal + testing.expect(t, f64be(value) == -1.234) + testing.expect(t, f64be(-1.234) == -1.234) + testing.expect(t, cast(f64be)value == -1.234) + testing.expect(t, cast(f64be)-1.234 == -1.234) + testing.expect(t, f64be(int(-1.234)) == -1.234) + testing.expect(t, cast(f64be)int(-1.234) == -1.234) + testing.expect(t, f64le(value) == -1.234) + testing.expect(t, f64le(-1.234) == -1.234) + testing.expect(t, cast(f64le)value == -1.234) + testing.expect(t, cast(f64le)-1.234 == -1.234) + testing.expect(t, f64le(int(-1.234)) == -1.234) + testing.expect(t, cast(f64le)int(-1.234) == -1.234) + testing.expect(t, f64le(reverse) == -1.234) + testing.expect(t, cast(f64le)reverse == -1.234) + } + + testing.expect(t, i64be(-1) + i64be(1) == 0) + testing.expect(t, i64le(-1) + i64le(i64be(1)) == 0) + testing.expect(t, i64be(-7) * i64be(7) == -49) +} From 2700fa86d647ed27f4f7f008ef7d15299bfd6671 Mon Sep 17 00:00:00 2001 From: ske Date: Tue, 30 Dec 2025 22:24:10 -0300 Subject: [PATCH 121/766] fix typo --- src/llvm_backend_const.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 9c407be00..8ce2137ab 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -539,7 +539,7 @@ gb_internal LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, Bi } if (big_int_is_neg(a)) { - // sizeof intead of sz for sign extend to work properly + // sizeof instead of sz for sign extend to work properly for (size_t i = 0; i < sizeof rop64; i++) { rop[i] = ~rop[i]; } From 8fea2b783c8f35dc6cd5963a2ed30cb176cc9889 Mon Sep 17 00:00:00 2001 From: dozn Date: Tue, 30 Dec 2025 18:10:07 -0800 Subject: [PATCH 122/766] [encoding/json] Allow Unmarshalling to `rune` Fixes https://github.com/odin-lang/Odin/issues/6061 --- core/encoding/json/types.odin | 1 + core/encoding/json/unmarshal.odin | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/core/encoding/json/types.odin b/core/encoding/json/types.odin index 1da17a0db..77cc7db85 100644 --- a/core/encoding/json/types.odin +++ b/core/encoding/json/types.odin @@ -76,6 +76,7 @@ Error :: enum { Invalid_Number, String_Not_Terminated, Invalid_String, + Invalid_Rune, // Parsing Errors diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 3cdc6429d..58365b684 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -225,6 +225,15 @@ unmarshal_string_token :: proc(p: ^Parser, val: any, token: Token, ti: ^reflect. } ok = true return + case rune: + for rne, i in str { + if i > 0 { + dst = {} + return false, .Invalid_Rune + } + dst = rne + } + return true, nil } #partial switch variant in ti.variant { From 6f396ac49b159e5741579d3b5bb50318e8e75851 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 31 Dec 2025 15:01:03 +0000 Subject: [PATCH 123/766] Rename `xar.Xar` to `xar.Array` --- core/container/xar/xar.odin | 50 ++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index 71fc13a27..8ed5bc3e4 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -12,7 +12,7 @@ import "core:container/xar" example :: proc() { - x: xar.Xar(int, 4) + x: xar.Array(int, 4) defer xar.destroy(&x) xar.push_back(&x, 10) @@ -38,7 +38,7 @@ MAX_SHIFT :: PLATFORM_BITS>>1 /* An Exponential Array with stable element addresses. - Unlike `[dynamic]T` which reallocates and moves elements when growing, `Xar` + Unlike `[dynamic]T` which reallocates and moves elements when growing, `Array` allocates separate chunks of exponentially increasing size. This guarantees that pointers to elements remain valid for the lifetime of the container. @@ -66,11 +66,11 @@ MAX_SHIFT :: PLATFORM_BITS>>1 example :: proc() { // Xar with initial chunk size of 16 (1 << 4) - x: xar.Xar(My_Struct, 4) + x: xar.Array(My_Struct, 4) defer xar.destroy(&x) } */ -Xar :: struct($T: typeid, $SHIFT: uint) where 0 < SHIFT, SHIFT <= MAX_SHIFT { +Array :: struct($T: typeid, $SHIFT: uint) where 0 < SHIFT, SHIFT <= MAX_SHIFT { chunks: [(1 << (_LOG2_PLATFORM_BITS - intrinsics.constant_log2(SHIFT))) + 1][^]T, len: int, allocator: mem.Allocator, @@ -84,7 +84,7 @@ Initializes an exponential array with the given allocator. - `x`: Pointer to the exponential array to initialize - `allocator`: Allocator to use for chunk allocations (defaults to context.allocator) */ -init :: proc(x: ^$X/Xar($T, $SHIFT), allocator := context.allocator) { +init :: proc(x: ^$X/Array($T, $SHIFT), allocator := context.allocator) { x^ = {allocator = allocator} } @@ -94,7 +94,7 @@ Frees all allocated chunks and resets the exponential array. **Inputs** - `x`: Pointer to the exponential array to destroy */ -destroy :: proc(x: ^$X/Xar($T, $SHIFT)) { +destroy :: proc(x: ^$X/Array($T, $SHIFT)) { #reverse for c, i in x.chunks { if c != nil { n := 1 << (SHIFT + uint(i if i > 0 else 1) - 1) @@ -109,19 +109,19 @@ destroy :: proc(x: ^$X/Xar($T, $SHIFT)) { Resets the array's length to zero without freeing memory. Allocated chunks are retained for reuse. */ -clear :: proc(x: ^$X/Xar($T, $SHIFT)) { +clear :: proc(x: ^$X/Array($T, $SHIFT)) { x.len = 0 } // Returns the length of the exponential-array @(require_results) -len :: proc(x: $X/Xar($T, $SHIFT)) -> int { +len :: proc(x: $X/Array($T, $SHIFT)) -> int { return x.len } // Returns the number of allocated elements @(require_results) -cap :: proc(x: $X/Xar($T, $SHIFT)) -> int { +cap :: proc(x: $X/Array($T, $SHIFT)) -> int { #reverse for c, i in x.chunks { if c != nil { return 1 << (SHIFT + uint(i if i > 0 else 1)) @@ -161,7 +161,7 @@ Get a copy of the element at the specified index. - a copy of the element */ @(require_results) -get :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: T) #no_bounds_check { +get :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: T) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) return x.chunks[chunk_idx][elem_idx] @@ -185,7 +185,7 @@ Example: import "core:container/xar" get_ptr_example :: proc() { - x: xar.Xar(int, 4) + x: xar.Array(int, 4) defer xar.destroy(&x) xar.push_back(&x, 100) @@ -200,7 +200,7 @@ Example: } */ @(require_results) -get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: ^T) #no_bounds_check { +get_ptr :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: ^T) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) return &x.chunks[chunk_idx][elem_idx] @@ -214,7 +214,7 @@ Set the element at the specified index to the given value. - `index`: Position of the element (0-indexed) - `value`: The value to set */ -set :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, value: T, loc := #caller_location) #no_bounds_check { +set :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, value: T, loc := #caller_location) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) x.chunks[chunk_idx][elem_idx] = value @@ -240,7 +240,7 @@ Example: import "core:container/xar" push_back_example :: proc() { - x: xar.Xar(string, 4) + x: xar.Array(string, 4) defer xar.destroy(&x) xar.push_back(&x, "hello") @@ -250,7 +250,7 @@ Example: fmt.println(xar.get(&x, 1)) // world } */ -push_back_elem :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { +push_back_elem :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { if x.allocator.procedure == nil { // to minic `[dynamic]T` behaviour x.allocator = context.allocator @@ -277,7 +277,7 @@ Append multiple elements to the end of the exponential array. - number of elements successfully added - allocation error if chunk allocation failed (partial append possible) */ -push_back_elems :: proc(x: ^$X/Xar($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { +push_back_elems :: proc(x: ^$X/Array($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { for value in values { n += push_back_elem(x, value, loc) or_return } @@ -303,7 +303,7 @@ Example: import "core:container/xar" push_back_and_get_ptr_example :: proc() { - x: xar.Xar(My_Struct, 4) + x: xar.Array(My_Struct, 4) defer xar.destroy(&x) ptr := xar.push_back_elem_and_get_ptr(&x, My_Struct{}) or_else panic("alloc failed") @@ -311,7 +311,7 @@ Example: } */ @(require_results) -push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: mem.Allocator_Error) { +push_back_elem_and_get_ptr :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: mem.Allocator_Error) { if x.allocator.procedure == nil { // to minic `[dynamic]T` behaviour x.allocator = context.allocator @@ -330,7 +330,7 @@ push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #cal // `pop` will remove and return the end value of an exponential array `x` and reduces the length of the array by 1. // // Note: If the exponential array has no elements (`xar.len(x) == 0`), this procedure will panic. -pop :: proc(x: ^$X/Xar($T, $SHIFT), loc := #caller_location) -> (val: T) { +pop :: proc(x: ^$X/Array($T, $SHIFT), loc := #caller_location) -> (val: T) { assert(x.len > 0, loc=loc) index := uint(x.len-1) chunk_idx, elem_idx, _ := _meta_get(SHIFT, index) @@ -341,7 +341,7 @@ pop :: proc(x: ^$X/Xar($T, $SHIFT), loc := #caller_location) -> (val: T) { // `pop_safe` trys to remove and return the end value of dynamic array `x` and reduces the length of the array by 1. // If the operation is not possible, it will return false. @(require_results) -pop_safe :: proc(x: ^$X/Xar($T, $SHIFT)) -> (val: T, ok: bool) { +pop_safe :: proc(x: ^$X/Array($T, $SHIFT)) -> (val: T, ok: bool) { if x.len == 0 { return } @@ -369,7 +369,7 @@ pop_safe :: proc(x: ^$X/Xar($T, $SHIFT)) -> (val: T, ok: bool) { import "core:encoding/xar" unordered_remove_example :: proc() { - x: xar.Xar(int, 4) + x: xar.Array(int, 4) defer xar.destroy(&x) xar.push_back(&x, 10) @@ -383,7 +383,7 @@ pop_safe :: proc(x: ^$X/Xar($T, $SHIFT)) -> (val: T, ok: bool) { fmt.println(xar.get(&x, 1)) // 20 } */ -unordered_remove :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) { +unordered_remove :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) { runtime.bounds_check_error_loc(loc, index, x.len) n := x.len-1 if index != n { @@ -402,7 +402,7 @@ Fields: - `idx`: Current iteration index */ Iterator :: struct($T: typeid, $SHIFT: uint) { - xar: ^Xar(T, SHIFT), + xar: ^Array(T, SHIFT), idx: int, } @@ -420,7 +420,7 @@ Example: import "lib:xar" iteration_example :: proc() { - x: xar.Xar(int, 4) + x: xar.Array(int, 4) defer xar.destroy(&x) xar.push_back(&x, 10) @@ -439,7 +439,7 @@ Output: 20 30 */ -iterator :: proc(xar: ^$X/Xar($T, $SHIFT)) -> Iterator(T, SHIFT) { +iterator :: proc(xar: ^$X/Array($T, $SHIFT)) -> Iterator(T, SHIFT) { return {xar = auto_cast xar, idx = 0} } From c6ca64cd4aa860e070130da661bb37b187ff5fa4 Mon Sep 17 00:00:00 2001 From: Neirokan Date: Thu, 1 Jan 2026 10:52:18 +0300 Subject: [PATCH 124/766] fix map_to_ip6 offset --- core/net/addr.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/net/addr.odin b/core/net/addr.odin index fad0eddc4..6e2881ac8 100644 --- a/core/net/addr.odin +++ b/core/net/addr.odin @@ -495,8 +495,8 @@ map_to_ip6 :: proc(addr: Address) -> Address { addr4 := addr.(IP4_Address) addr4_u16 := transmute([2]u16be) addr4 addr6: IP6_Address - addr6[4] = 0xffff - copy(addr6[5:], addr4_u16[:]) + addr6[5] = 0xffff + copy(addr6[6:], addr4_u16[:]) return addr6 } From 94146e4fe77c180bc74183cc7b29748698fc435e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 1 Jan 2026 13:40:43 +0000 Subject: [PATCH 125/766] fix printing dozenal numbers `0z` from `0o` --- core/fmt/fmt.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 059413787..6a67843bb 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -1086,7 +1086,7 @@ _fmt_int :: proc(fi: ^Info, u: u64, base: int, is_signed: bool, bit_size: int, d case 12: io.write_byte(fi.writer, '0', &fi.n) - io.write_byte(fi.writer, 'o', &fi.n) + io.write_byte(fi.writer, 'z', &fi.n) start = 2 case 16: @@ -1171,7 +1171,7 @@ _fmt_int_128 :: proc(fi: ^Info, u: u128, base: int, is_signed: bool, bit_size: i case 12: io.write_byte(fi.writer, '0', &fi.n) - io.write_byte(fi.writer, 'o', &fi.n) + io.write_byte(fi.writer, 'z', &fi.n) start = 2 case 16: From 70697fa00fdda2dc651d41b60f5f6dbed46998a1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 1 Jan 2026 13:41:56 +0000 Subject: [PATCH 126/766] When using `fmt_write_padding`, remove the need to restore `fi.zero` since it is not used. --- core/fmt/fmt.odin | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 6a67843bb..0d20071e6 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -1100,10 +1100,7 @@ _fmt_int :: proc(fi: ^Info, u: u64, base: int, is_signed: bool, bit_size: int, d if fi.prec_set { prec = fi.prec if prec == 0 && u == 0 { - prev_zero := fi.zero - fi.zero = false fmt_write_padding(fi, fi.width) - fi.zero = prev_zero return } } else if fi.zero && fi.width_set { @@ -1185,10 +1182,7 @@ _fmt_int_128 :: proc(fi: ^Info, u: u128, base: int, is_signed: bool, bit_size: i if fi.prec_set { prec = fi.prec if prec == 0 && u == 0 { - prev_zero := fi.zero - fi.zero = false fmt_write_padding(fi, fi.width) - fi.zero = prev_zero return } } else if fi.zero && fi.width_set { From b446b91251af00d4d648b5e178bc4f4e7a735bb9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 1 Jan 2026 13:42:40 +0000 Subject: [PATCH 127/766] Add `@(rodata)` to global constants --- core/fmt/fmt.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 0d20071e6..a87529174 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -1225,8 +1225,8 @@ _fmt_int_128 :: proc(fi: ^Info, u: u128, base: int, is_signed: bool, bit_size: i _pad(fi, s) } // Units of measurements: -__MEMORY_LOWER := " b kib mib gib tib pib eib" -__MEMORY_UPPER := " B KiB MiB GiB TiB PiB EiB" +@(rodata) __MEMORY_LOWER := " b kib mib gib tib pib eib" +@(rodata) __MEMORY_UPPER := " B KiB MiB GiB TiB PiB EiB" // Formats an integer value as bytes with the best representation. // // Inputs: @@ -1284,8 +1284,8 @@ _fmt_memory :: proc(fi: ^Info, u: u64, is_signed: bool, bit_size: int, units: st _pad(fi, str) } // Hex Values: -__DIGITS_LOWER := "0123456789abcdefx" -__DIGITS_UPPER := "0123456789ABCDEFX" +@(rodata) __DIGITS_LOWER := "0123456789abcdefx" +@(rodata) __DIGITS_UPPER := "0123456789ABCDEFX" // Formats a rune value according to the specified formatting verb. // // Inputs: From b9a170b117d6db89eb824c3faf5edc874b3f7ec4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 09:46:50 +0000 Subject: [PATCH 128/766] Fix `GetSystemMetricsForDpi` signature --- core/sys/windows/user32.odin | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 11c01db25..94d03d6b4 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -2,7 +2,6 @@ package sys_windows import "base:intrinsics" -import "core:c" foreign import user32 "system:User32.lib" @(default_calling_convention="system") @@ -33,7 +32,7 @@ foreign user32 { RegisterClassExW :: proc(^WNDCLASSEXW) -> ATOM --- UnregisterClassW :: proc(lpClassName: LPCWSTR, hInstance: HINSTANCE) -> BOOL --- - RegisterHotKey :: proc(hnwd: HWND, id: c.int, fsModifiers: UINT, vk: UINT) -> BOOL --- + RegisterHotKey :: proc(hnwd: HWND, id: c_int, fsModifiers: UINT, vk: UINT) -> BOOL --- CreateWindowExW :: proc( dwExStyle: DWORD, @@ -295,7 +294,7 @@ foreign user32 { SetWindowPlacement :: proc(hwnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- SetWindowRgn :: proc(hWnd: HWND, hRgn: HRGN, bRedraw: BOOL) -> int --- CreateRectRgnIndirect :: proc(lprect: ^RECT) -> HRGN --- - GetSystemMetricsForDpi :: proc(nIndex: int, dpi: UINT) -> int --- + GetSystemMetricsForDpi :: proc(nIndex: c_int, dpi: UINT) -> int --- GetCursorInfo :: proc(pci: PCURSORINFO) -> BOOL --- From 45aa89cf0235a72412dece20b6e5b12556591d49 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 09:47:45 +0000 Subject: [PATCH 129/766] Replace uses of `c.int` with `c_int` for consistency --- core/sys/windows/hidpi.odin | 3 +-- core/sys/windows/types.odin | 2 +- core/sys/windows/wgl.odin | 20 +++++++++----------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/core/sys/windows/hidpi.odin b/core/sys/windows/hidpi.odin index 5e9787527..6f1e888cc 100644 --- a/core/sys/windows/hidpi.odin +++ b/core/sys/windows/hidpi.odin @@ -1,6 +1,5 @@ #+build windows package sys_windows -import "core:c" HIDD_CONFIGURATION :: struct { cookie: PVOID, @@ -152,7 +151,7 @@ PHIDP_LINK_COLLECTION_NODE :: ^HIDP_LINK_COLLECTION_NODE HIDP_PREPARSED_DATA :: rawptr PHIDP_PREPARSED_DATA :: ^HIDP_PREPARSED_DATA -HIDP_REPORT_TYPE :: enum c.int { +HIDP_REPORT_TYPE :: enum c_int { Input, Output, Feature, diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 904970589..d4afe971e 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -2234,7 +2234,7 @@ SHELLEXECUTEINFOW :: struct { lpFile: LPCWSTR, // in, either this value or lpIDList must be specified lpParameters: LPCWSTR, // in, optional lpDirectory: LPCWSTR, // in, optional - nShow: c.int, // in, required + nShow: c_int, // in, required hInstApp: HINSTANCE, // out when SEE_MASK_NOCLOSEPROCESS is specified lpIDList: rawptr, // in, valid when SEE_MASK_IDLIST is specified, PCIDLIST_ABSOLUTE, for use with SEE_MASK_IDLIST & SEE_MASK_INVOKEIDLIST lpClass: LPCWSTR, // in, valid when SEE_MASK_CLASSNAME is specified diff --git a/core/sys/windows/wgl.odin b/core/sys/windows/wgl.odin index f50f06939..436a96329 100644 --- a/core/sys/windows/wgl.odin +++ b/core/sys/windows/wgl.odin @@ -1,8 +1,6 @@ #+build windows package sys_windows -import "core:c" - foreign import "system:Opengl32.lib" CONTEXT_MAJOR_VERSION_ARB :: 0x2091 @@ -54,9 +52,9 @@ GLYPHMETRICSFLOAT :: struct { gmfCellIncY: f32, } -CreateContextAttribsARBType :: #type proc "c" (hdc: HDC, hShareContext: rawptr, attribList: [^]c.int) -> HGLRC -ChoosePixelFormatARBType :: #type proc "c" (hdc: HDC, attribIList: [^]c.int, attribFList: [^]f32, maxFormats: DWORD, formats: [^]c.int, numFormats: [^]DWORD) -> BOOL -SwapIntervalEXTType :: #type proc "c" (interval: c.int) -> bool +CreateContextAttribsARBType :: #type proc "c" (hdc: HDC, hShareContext: rawptr, attribList: [^]c_int) -> HGLRC +ChoosePixelFormatARBType :: #type proc "c" (hdc: HDC, attribIList: [^]c_int, attribFList: [^]f32, maxFormats: DWORD, formats: [^]c_int, numFormats: [^]DWORD) -> BOOL +SwapIntervalEXTType :: #type proc "c" (interval: c_int) -> bool GetExtensionsStringARBType :: #type proc "c" (HDC) -> cstring // Procedures @@ -73,18 +71,18 @@ foreign Opengl32 { wglGetProcAddress :: proc(c_str: cstring) -> rawptr --- wglDeleteContext :: proc(HGLRC: HGLRC) -> BOOL --- wglCopyContext :: proc(src, dst: HGLRC, mask: UINT) -> BOOL --- - wglCreateLayerContext :: proc(hdc: HDC, layer_plane: c.int) -> HGLRC --- - wglDescribeLayerPlane :: proc(hdc: HDC, pixel_format, layer_plane: c.int, bytes: UINT, pd: LPLAYERPLANEDESCRIPTOR) -> BOOL --- + wglCreateLayerContext :: proc(hdc: HDC, layer_plane: c_int) -> HGLRC --- + wglDescribeLayerPlane :: proc(hdc: HDC, pixel_format, layer_plane: c_int, bytes: UINT, pd: LPLAYERPLANEDESCRIPTOR) -> BOOL --- wglGetCurrentContext :: proc() -> HGLRC --- wglGetCurrentDC :: proc() -> HDC --- - wglGetLayerPaletteEntries :: proc(hdc: HDC, layer_plane, start, entries: c.int, cr: ^COLORREF) -> c.int --- - wglRealizeLayerPalette :: proc(hdc: HDC, layer_plane: c.int, realize: BOOL) -> BOOL --- - wglSetLayerPaletteEntries :: proc(hdc: HDC, layer_plane, start, entries: c.int, cr: ^COLORREF) -> c.int --- + wglGetLayerPaletteEntries :: proc(hdc: HDC, layer_plane, start, entries: c_int, cr: ^COLORREF) -> c_int --- + wglRealizeLayerPalette :: proc(hdc: HDC, layer_plane: c_int, realize: BOOL) -> BOOL --- + wglSetLayerPaletteEntries :: proc(hdc: HDC, layer_plane, start, entries: c_int, cr: ^COLORREF) -> c_int --- wglShareLists :: proc(HGLRC1, HGLRC2: HGLRC) -> BOOL --- wglSwapLayerBuffers :: proc(hdc: HDC, planes: DWORD) -> BOOL --- wglUseFontBitmapsA :: proc(hdc: HDC, first, count, list_base: DWORD) -> BOOL --- wglUseFontBitmapsW :: proc(hdc: HDC, first, count, list_base: DWORD) -> BOOL --- - wglUseFontOutlines :: proc(hdc: HDC, first, count, list_base: DWORD, deviation, extrusion: f32, format: c.int, gmf: LPGLYPHMETRICSFLOAT) -> BOOL --- + wglUseFontOutlines :: proc(hdc: HDC, first, count, list_base: DWORD, deviation, extrusion: f32, format: c_int, gmf: LPGLYPHMETRICSFLOAT) -> BOOL --- } // Used by vendor:OpenGL From 37458a4bebed996b1fca222ac348eeffdcad7d41 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 09:53:50 +0000 Subject: [PATCH 130/766] Fix some return types in core:sys/windows --- core/sys/windows/gdi32.odin | 2 +- core/sys/windows/user32.odin | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 141429483..1a23b4c8f 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -52,7 +52,7 @@ foreign gdi32 { CreateSolidBrush :: proc(color: COLORREF) -> HBRUSH --- - GetObjectW :: proc(h: HANDLE, c: INT, pv: LPVOID) -> int --- + GetObjectW :: proc(h: HANDLE, c: INT, pv: LPVOID) -> c_int --- CreateCompatibleBitmap :: proc(hdc: HDC, cx, cy: INT) -> HBITMAP --- BitBlt :: proc(hdc: HDC, x, y, cx, cy: INT, hdcSrc: HDC, x1, y1: INT, rop: DWORD) -> BOOL --- GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> INT --- diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 94d03d6b4..e42f1adce 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -277,8 +277,8 @@ foreign user32 { SetLayeredWindowAttributes :: proc(hWnd: HWND, crKey: COLORREF, bAlpha: BYTE, dwFlags: DWORD) -> BOOL --- - FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> int --- - FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> int --- + FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- + FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_inct --- EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- @@ -292,9 +292,9 @@ foreign user32 { GetWindowInfo :: proc(hwnd: HWND, pwi: PWINDOWINFO) -> BOOL --- GetWindowPlacement :: proc(hWnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- SetWindowPlacement :: proc(hwnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- - SetWindowRgn :: proc(hWnd: HWND, hRgn: HRGN, bRedraw: BOOL) -> int --- + SetWindowRgn :: proc(hWnd: HWND, hRgn: HRGN, bRedraw: BOOL) -> c_int --- CreateRectRgnIndirect :: proc(lprect: ^RECT) -> HRGN --- - GetSystemMetricsForDpi :: proc(nIndex: c_int, dpi: UINT) -> int --- + GetSystemMetricsForDpi :: proc(nIndex: c_int, dpi: UINT) -> c_int --- GetCursorInfo :: proc(pci: PCURSORINFO) -> BOOL --- From 747ecc69115d35ab99be3b27e27f751288f12a77 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 09:55:56 +0000 Subject: [PATCH 131/766] Fix typo --- core/sys/windows/user32.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index e42f1adce..cd73f80e6 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -278,7 +278,7 @@ foreign user32 { SetLayeredWindowAttributes :: proc(hWnd: HWND, crKey: COLORREF, bAlpha: BYTE, dwFlags: DWORD) -> BOOL --- FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- - FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_inct --- + FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- From 111ed21e7e5f7ca4cb4358073ab060d138fc782f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:02:23 +0000 Subject: [PATCH 132/766] Change usage of `i32` to `c_int` where appropriate --- core/sys/windows/advapi32.odin | 4 +- core/sys/windows/comctl32.odin | 66 ++++++++++++++++----------------- core/sys/windows/icu.odin | 3 ++ core/sys/windows/ip_helper.odin | 14 +++---- core/sys/windows/types.odin | 2 +- core/sys/windows/user32.odin | 20 +++++----- core/sys/windows/util.odin | 16 ++++---- core/sys/windows/ux_theme.odin | 11 ++++-- 8 files changed, 72 insertions(+), 64 deletions(-) diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin index 22cb27863..cf12a078f 100644 --- a/core/sys/windows/advapi32.odin +++ b/core/sys/windows/advapi32.odin @@ -228,7 +228,7 @@ foreign advapi32 { } PTOKEN_INFORMATION_CLASS :: ^TOKEN_INFORMATION_CLASS -TOKEN_INFORMATION_CLASS :: enum i32 { +TOKEN_INFORMATION_CLASS :: enum c_int { TokenUser = 1, TokenGroups, TokenPrivileges, @@ -282,7 +282,7 @@ TOKEN_INFORMATION_CLASS :: enum i32 { } PSID_NAME_USE :: ^SID_NAME_USE -SID_NAME_USE :: enum i32 { +SID_NAME_USE :: enum c_int { SidTypeUser = 1, SidTypeGroup, SidTypeDomain, diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index c7a166634..c2b4362d9 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -157,14 +157,14 @@ ILP_DOWNLEVEL :: 1 IMAGELISTDRAWPARAMS :: struct { cbSize: DWORD, himl: HIMAGELIST, - i: i32, + i: c_int, hdcDst: HDC, - x: i32, - y: i32, - cx: i32, - cy: i32, - xBitmap: i32, - yBitmap: i32, + x: c_int, + y: c_int, + cx: c_int, + cy: c_int, + xBitmap: c_int, + yBitmap: c_int, rgbBk: COLORREF, rgbFg: COLORREF, fStyle: UINT, @@ -178,62 +178,62 @@ LPIMAGELISTDRAWPARAMS :: ^IMAGELISTDRAWPARAMS IMAGEINFO :: struct { hbmImage: HBITMAP, hbmMask: HBITMAP, - Unused1: i32, - Unused2: i32, + Unused1: c_int, + Unused2: c_int, rcImage: RECT, } LPIMAGEINFO :: ^IMAGEINFO @(default_calling_convention="system") foreign Comctl32 { - ImageList_Create :: proc(cx, cy: i32, flags: UINT, cInitial, cGrow: i32) -> HIMAGELIST --- + ImageList_Create :: proc(cx, cy: c_int, flags: UINT, cInitial, cGrow: c_int) -> HIMAGELIST --- ImageList_Destroy :: proc(himl: HIMAGELIST) -> BOOL --- - ImageList_GetImageCount :: proc(himl: HIMAGELIST) -> i32 --- + ImageList_GetImageCount :: proc(himl: HIMAGELIST) -> c_int --- ImageList_SetImageCount :: proc(himl: HIMAGELIST, uNewCount: UINT) -> BOOL --- - ImageList_Add :: proc(himl: HIMAGELIST, hbmImage, hbmMask: HBITMAP) -> i32 --- - ImageList_ReplaceIcon :: proc(himl: HIMAGELIST, i: i32, hicon: HICON) -> i32 --- + ImageList_Add :: proc(himl: HIMAGELIST, hbmImage, hbmMask: HBITMAP) -> c_int --- + ImageList_ReplaceIcon :: proc(himl: HIMAGELIST, i: c_int, hicon: HICON) -> c_int --- ImageList_SetBkColor :: proc(himl: HIMAGELIST, clrBk: COLORREF) -> COLORREF --- ImageList_GetBkColor :: proc(himl: HIMAGELIST) -> COLORREF --- - ImageList_SetOverlayImage :: proc(himl: HIMAGELIST, iImage: i32, iOverlay: i32) -> BOOL --- - ImageList_Draw :: proc(himl: HIMAGELIST, i: i32, hdcDst: HDC, x, y: i32, fStyle: UINT) -> BOOL --- - ImageList_Replace :: proc(himl: HIMAGELIST, i: i32, hbmImage, hbmMask: HBITMAP) -> BOOL --- - ImageList_AddMasked :: proc(himl: HIMAGELIST, hbmImage: HBITMAP, crMask: COLORREF) -> i32 --- - ImageList_DrawEx :: proc(himl: HIMAGELIST, i: i32, hdcDst: HDC, x, y, dx, dy: i32, rgbBk, rgbFg: COLORREF, fStyle: UINT) -> BOOL --- + ImageList_SetOverlayImage :: proc(himl: HIMAGELIST, iImage: c_int, iOverlay: c_int) -> BOOL --- + ImageList_Draw :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y: c_int, fStyle: UINT) -> BOOL --- + ImageList_Replace :: proc(himl: HIMAGELIST, i: c_int, hbmImage, hbmMask: HBITMAP) -> BOOL --- + ImageList_AddMasked :: proc(himl: HIMAGELIST, hbmImage: HBITMAP, crMask: COLORREF) -> c_int --- + ImageList_DrawEx :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y, dx, dy: c_int, rgbBk, rgbFg: COLORREF, fStyle: UINT) -> BOOL --- ImageList_DrawIndirect :: proc(pimldp: ^IMAGELISTDRAWPARAMS) -> BOOL --- - ImageList_Remove :: proc(himl: HIMAGELIST, i: i32) -> BOOL --- - ImageList_GetIcon :: proc(himl: HIMAGELIST, i: i32, flags: UINT) -> HICON --- - ImageList_LoadImageW :: proc(hi: HINSTANCE, lpbmp: LPCWSTR, cx, cgrow: i32, crMask: COLORREF, uType, uFlags: UINT) -> HIMAGELIST --- - ImageList_Copy :: proc(himlDst: HIMAGELIST, iDst: i32, himlSrc: HIMAGELIST, iSrc: i32, uFlags: UINT) -> BOOL --- - ImageList_BeginDrag :: proc(himlTrack: HIMAGELIST, iTrack, dxHotspot, dyHotspot: i32) -> BOOL --- + ImageList_Remove :: proc(himl: HIMAGELIST, i: c_int) -> BOOL --- + ImageList_GetIcon :: proc(himl: HIMAGELIST, i: c_int, flags: UINT) -> HICON --- + ImageList_LoadImageW :: proc(hi: HINSTANCE, lpbmp: LPCWSTR, cx, cgrow: c_int, crMask: COLORREF, uType, uFlags: UINT) -> HIMAGELIST --- + ImageList_Copy :: proc(himlDst: HIMAGELIST, iDst: c_int, himlSrc: HIMAGELIST, iSrc: c_int, uFlags: UINT) -> BOOL --- + ImageList_BeginDrag :: proc(himlTrack: HIMAGELIST, iTrack, dxHotspot, dyHotspot: c_int) -> BOOL --- ImageList_EndDrag :: proc() --- - ImageList_DragEnter :: proc(hwndLock: HWND, x, y: i32) -> BOOL --- + ImageList_DragEnter :: proc(hwndLock: HWND, x, y: c_int) -> BOOL --- ImageList_DragLeave :: proc(hwndLock: HWND) -> BOOL --- - ImageList_DragMove :: proc(x, y: i32) -> BOOL --- - ImageList_SetDragCursorImage :: proc(himlDrag: HIMAGELIST, iDrag, dxHotspot, dyHotspot: i32) -> BOOL --- + ImageList_DragMove :: proc(x, y: c_int) -> BOOL --- + ImageList_SetDragCursorImage :: proc(himlDrag: HIMAGELIST, iDrag, dxHotspot, dyHotspot: c_int) -> BOOL --- ImageList_DragShowNolock :: proc(fShow: BOOL) -> BOOL --- ImageList_GetDragImage :: proc(ppt, pptHotspot: ^POINT) -> HIMAGELIST --- ImageList_Read :: proc(pstm: ^IStream) -> HIMAGELIST --- ImageList_Write :: proc(himl: HIMAGELIST, pstm: ^IStream) -> BOOL --- ImageList_ReadEx :: proc(dwFlags: DWORD, pstm: ^IStream, riid: REFIID, ppv: PVOID) -> HRESULT --- ImageList_WriteEx :: proc(himl: HIMAGELIST, dwFlags: DWORD, pstm: ^IStream) -> HRESULT --- - ImageList_GetIconSize :: proc(himl: HIMAGELIST, cx, cy: ^i32) -> BOOL --- - ImageList_SetIconSize :: proc(himl: HIMAGELIST, cx, cy: i32) -> BOOL --- - ImageList_GetImageInfo :: proc(himl: HIMAGELIST, i: i32, pImageInfo: ^IMAGEINFO) -> BOOL --- - ImageList_Merge :: proc(himl1: HIMAGELIST, i1: i32, himl2: HIMAGELIST, i2: i32, dx, dy: i32) -> HIMAGELIST --- + ImageList_GetIconSize :: proc(himl: HIMAGELIST, cx, cy: ^c_int) -> BOOL --- + ImageList_SetIconSize :: proc(himl: HIMAGELIST, cx, cy: c_int) -> BOOL --- + ImageList_GetImageInfo :: proc(himl: HIMAGELIST, i: c_int, pImageInfo: ^IMAGEINFO) -> BOOL --- + ImageList_Merge :: proc(himl1: HIMAGELIST, i1: c_int, himl2: HIMAGELIST, i2: c_int, dx, dy: c_int) -> HIMAGELIST --- ImageList_Duplicate :: proc(himl: HIMAGELIST) -> HIMAGELIST --- HIMAGELIST_QueryInterface :: proc(himl: HIMAGELIST, riid: REFIID, ppv: rawptr) -> HRESULT --- } -ImageList_AddIcon :: #force_inline proc "system" (himl: HIMAGELIST, hicon: HICON) -> i32 { +ImageList_AddIcon :: #force_inline proc "system" (himl: HIMAGELIST, hicon: HICON) -> c_int { return ImageList_ReplaceIcon(himl, -1, hicon) } ImageList_RemoveAll :: #force_inline proc "system" (himl: HIMAGELIST) -> BOOL { return ImageList_Remove(himl, -1) } -ImageList_ExtractIcon :: #force_inline proc "system" (hi: HINSTANCE, himl: HIMAGELIST, i: i32) -> HICON { +ImageList_ExtractIcon :: #force_inline proc "system" (hi: HINSTANCE, himl: HIMAGELIST, i: c_int) -> HICON { return ImageList_GetIcon(himl, i, 0) } -ImageList_LoadBitmap :: #force_inline proc "system" (hi: HINSTANCE, lpbmp: LPCWSTR, cx, cGrow: i32, crMask: COLORREF) -> HIMAGELIST { +ImageList_LoadBitmap :: #force_inline proc "system" (hi: HINSTANCE, lpbmp: LPCWSTR, cx, cGrow: c_int, crMask: COLORREF) -> HIMAGELIST { return ImageList_LoadImageW(hi, lpbmp, cx, cGrow, crMask, IMAGE_BITMAP, 0) } diff --git a/core/sys/windows/icu.odin b/core/sys/windows/icu.odin index 6ed8c9b40..b481a05a9 100644 --- a/core/sys/windows/icu.odin +++ b/core/sys/windows/icu.odin @@ -12,3 +12,6 @@ foreign icu { ucal_getWindowsTimeZoneID :: proc(id: wstring, len: i32, winid: wstring, winidCapacity: i32, status: ^UError) -> i32 --- ucal_getDefaultTimeZone :: proc(result: wstring, cap: i32, status: ^UError) -> i32 --- } + + +// NOTE(bill): all of these types actually do use `i32` and not `c_int` diff --git a/core/sys/windows/ip_helper.odin b/core/sys/windows/ip_helper.odin index d2e75d531..da23a064f 100644 --- a/core/sys/windows/ip_helper.odin +++ b/core/sys/windows/ip_helper.odin @@ -141,7 +141,7 @@ IP_ADAPTER_DNS_SERVER_ADDRESS_XP :: struct { Address: SOCKET_ADDRESS, } -IF_OPER_STATUS :: enum i32 { +IF_OPER_STATUS :: enum c_int { Up = 1, Down = 2, Testing = 3, @@ -160,17 +160,17 @@ NET_LUID_LH :: struct #raw_union { SOCKET_ADDRESS :: struct { lpSockaddr: ^SOCKADDR, - iSockaddrLength: i32, + iSockaddrLength: INT, } -NET_IF_CONNECTION_TYPE :: enum i32 { +NET_IF_CONNECTION_TYPE :: enum c_int { NET_IF_CONNECTION_DEDICATED = 1, NET_IF_CONNECTION_PASSIVE = 2, NET_IF_CONNECTION_DEMAND = 3, NET_IF_CONNECTION_MAXIMUM = 4, } -TUNNEL_TYPE :: enum i32 { +TUNNEL_TYPE :: enum c_int { TUNNEL_TYPE_NONE = 0, TUNNEL_TYPE_OTHER = 1, TUNNEL_TYPE_DIRECT = 2, @@ -179,7 +179,7 @@ TUNNEL_TYPE :: enum i32 { TUNNEL_TYPE_TEREDO = 14, TUNNEL_TYPE_IPHTTPS = 15, } -NL_PREFIX_ORIGIN :: enum i32 { +NL_PREFIX_ORIGIN :: enum c_int { IpPrefixOriginOther = 0, IpPrefixOriginManual = 1, IpPrefixOriginWellKnown = 2, @@ -188,7 +188,7 @@ NL_PREFIX_ORIGIN :: enum i32 { IpPrefixOriginUnchanged = 16, } -NL_SUFFIX_ORIGIN :: enum i32 { +NL_SUFFIX_ORIGIN :: enum c_int { NlsoOther = 0, NlsoManual = 1, NlsoWellKnown = 2, @@ -204,7 +204,7 @@ NL_SUFFIX_ORIGIN :: enum i32 { IpSuffixOriginUnchanged = 16, } -NL_DAD_STATE :: enum i32 { +NL_DAD_STATE :: enum c_int { NldsInvalid = 0, NldsTentative = 1, NldsDuplicate = 2, diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index d4afe971e..75e9fc695 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -274,7 +274,7 @@ PROTECTED_SACL_SECURITY_INFORMATION :: 0x40000000 UNPROTECTED_DACL_SECURITY_INFORMATION :: 0x20000000 UNPROTECTED_SACL_SECURITY_INFORMATION :: 0x10000000 -GET_FILEEX_INFO_LEVELS :: distinct i32 +GET_FILEEX_INFO_LEVELS :: distinct c_int GetFileExInfoStandard: GET_FILEEX_INFO_LEVELS : 0 GetFileExMaxInfoLevel: GET_FILEEX_INFO_LEVELS : 1 diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index cd73f80e6..287ed59e7 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -859,21 +859,21 @@ FKF_CLICKON :: 0x40 NONCLIENTMETRICSW :: struct { cbSize: UINT, - iBorderWidth: i32, - iScrollWidth: i32, - iScrollHeight: i32, - iCaptionWidth: i32, - iCaptionHeight: i32, + iBorderWidth: c_int, + iScrollWidth: c_int, + iScrollHeight: c_int, + iCaptionWidth: c_int, + iCaptionHeight: c_int, lfCaptionFont: LOGFONTW, - iSmCaptionWidth: i32, - iSmCaptionHeight: i32, + iSmCaptionWidth: c_int, + iSmCaptionHeight: c_int, lfSmCaptionFont: LOGFONTW, - iMenuWidth: i32, - iMenuHeight: i32, + iMenuWidth: c_int, + iMenuHeight: c_int, lfMenuFont: LOGFONTW, lfStatusFont: LOGFONTW, lfMessageFont: LOGFONTW, - iPaddedBorderWidth: i32, + iPaddedBorderWidth: c_int, } LPNONCLIENTMETRICSW :: ^NONCLIENTMETRICSW diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 125038ac4..4729d5c72 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -82,14 +82,14 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ b := transmute([]byte)s cstr := raw_data(b) - n := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, i32(len(s)), nil, 0) + n := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(len(s)), nil, 0) if n == 0 { return nil } text := make([]u16, n+1, allocator) - n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, i32(len(s)), raw_data(text), n) + n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(len(s)), raw_data(text), n) if n1 == 0 { delete(text, allocator) return nil @@ -103,14 +103,14 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ } utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { - n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), i32(len(s)), nil, 0) + n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), nil, 0) if n1 == 0 { return nil } else if int(n1) > len(buf) { return nil } - n1 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), i32(len(s)), raw_data(buf[:]), n1) + n1 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), raw_data(buf[:]), n1) if n1 == 0 { return nil } else if int(n1) > len(buf) { @@ -143,7 +143,7 @@ wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allo return } - n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, i32(N) if N > 0 else -1, nil, 0, nil, nil) + n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, c_int(N) if N > 0 else -1, nil, 0, nil, nil) if n == 0 { return } @@ -155,7 +155,7 @@ wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allo // will not be null terminated. text := make([]byte, n) or_return - n1 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, i32(N), raw_data(text), n, nil, nil) + n1 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, c_int(N), raw_data(text), n, nil, nil) if n1 == 0 { delete(text, allocator) return @@ -171,14 +171,14 @@ wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allo } wstring_to_utf8_buf :: proc(buf: []u8, s: wstring, N := -1) -> (res: string) { - n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, i32(N), nil, 0, nil, nil) + n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, c_int(N), nil, 0, nil, nil) if n == 0 { return } else if int(n) > len(buf) { return } - n2 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, i32(N), raw_data(buf), n, nil, nil) + n2 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, c_int(N), raw_data(buf), n, nil, nil) if n2 == 0 { return } else if int(n2) > len(buf) { diff --git a/core/sys/windows/ux_theme.odin b/core/sys/windows/ux_theme.odin index 679d9998f..47a0049b2 100644 --- a/core/sys/windows/ux_theme.odin +++ b/core/sys/windows/ux_theme.odin @@ -3,11 +3,16 @@ package sys_windows foreign import uxtheme "system:UxTheme.lib" -MARGINS :: distinct [4]i32 +MARGINS :: struct { + cxLeftWidth: c_int, + cxRightWidth: c_int, + cyTopHeight: c_int, + cyBottomHeight: c_int, +} PMARGINS :: ^MARGINS @(default_calling_convention="system") foreign uxtheme { - IsThemeActive :: proc() -> BOOL --- - SetWindowTheme :: proc(hWnd: HWND, pszSubAppName, pszSubIdList: LPCWSTR) -> HRESULT --- + IsThemeActive :: proc() -> BOOL --- + SetWindowTheme :: proc(hWnd: HWND, pszSubAppName, pszSubIdList: LPCWSTR) -> HRESULT --- } From 25daf520001d4fbf14d610fa8e0bfb4fd8bdc3b6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:13:31 +0000 Subject: [PATCH 133/766] Add support to `raw_union_tag` for integers --- core/fmt/fmt.odin | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index a87529174..72fe6fdf0 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2131,6 +2131,34 @@ __handle_raw_union_tag :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime. } } } + case reflect.Type_Info_Integer: + tag_value := reflect.as_i64(tag) or_break + + for tag, index in info.tags[:info.field_count] { + rut_list := reflect.struct_tag_lookup(reflect.Struct_Tag(tag), "raw_union_tag") or_continue + + for rut in strings.split_iterator(&rut_list, ",") { + head_tag, match, tail_name := strings.partition(string(rut), "=") + if head_tag != tag_name || match != "=" { + continue + } + + // just ignore the `A.` prefix for `A.B` stuff entirely + if _, _, try_tail_name := strings.partition(string(rut), "."); try_tail_name != "" { + tail_name = try_tail_name + } + + tail_value := strconv.parse_i64(tail_name) or_continue + + if tail_value == tag_value { + io.write_string(fi.writer, "#raw_union(.", &fi.n) + io.write_i64(fi.writer, tag_value, 10, &fi.n) + io.write_string(fi.writer, ") ", &fi.n) + fmt_arg(fi, any{v.data, info.types[index].id}, the_verb) + return true + } + } + } } return false From 49687069ef79aa297ad9bd575241aafe2bf1dea0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:14:24 +0000 Subject: [PATCH 134/766] Minor formatting improvements --- core/sys/windows/advapi32.odin | 52 +++++++-------- core/sys/windows/comctl32.odin | 114 ++++++++++++++++----------------- 2 files changed, 83 insertions(+), 83 deletions(-) diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin index cf12a078f..d4b86b875 100644 --- a/core/sys/windows/advapi32.odin +++ b/core/sys/windows/advapi32.odin @@ -303,35 +303,35 @@ TOKEN_USER :: struct { PSID_AND_ATTRIBUTES :: ^SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES :: struct { - Sid: rawptr, + Sid: rawptr, Attributes: ULONG, } PTOKEN_TYPE :: ^TOKEN_TYPE TOKEN_TYPE :: enum { - TokenPrimary = 1, + TokenPrimary = 1, TokenImpersonation = 2, } PTOKEN_STATISTICS :: ^TOKEN_STATISTICS TOKEN_STATISTICS :: struct { - TokenId: LUID, - AuthenticationId: LUID, - ExpirationTime: LARGE_INTEGER, - TokenType: TOKEN_TYPE, + TokenId: LUID, + AuthenticationId: LUID, + ExpirationTime: LARGE_INTEGER, + TokenType: TOKEN_TYPE, ImpersonationLevel: SECURITY_IMPERSONATION_LEVEL, - DynamicCharged: DWORD, - DynamicAvailable: DWORD, - GroupCount: DWORD, - PrivilegeCount: DWORD, - ModifiedId: LUID, + DynamicCharged: DWORD, + DynamicAvailable: DWORD, + GroupCount: DWORD, + PrivilegeCount: DWORD, + ModifiedId: LUID, } TOKEN_SOURCE_LENGTH :: 8 PTOKEN_SOURCE :: ^TOKEN_SOURCE TOKEN_SOURCE :: struct { - SourceName: [TOKEN_SOURCE_LENGTH]CHAR, + SourceName: [TOKEN_SOURCE_LENGTH]CHAR, SourceIdentifier: LUID, } @@ -339,7 +339,7 @@ TOKEN_SOURCE :: struct { PTOKEN_PRIVILEGES :: ^TOKEN_PRIVILEGES TOKEN_PRIVILEGES :: struct { PrivilegeCount: DWORD, - Privileges: [0]LUID_AND_ATTRIBUTES, + Privileges: [0]LUID_AND_ATTRIBUTES, } PTOKEN_PRIMARY_GROUP :: ^TOKEN_PRIMARY_GROUP @@ -354,16 +354,16 @@ TOKEN_OWNER :: struct { PTOKEN_GROUPS_AND_PRIVILEGES :: ^TOKEN_GROUPS_AND_PRIVILEGES TOKEN_GROUPS_AND_PRIVILEGES :: struct { - SidCount: DWORD, - SidLength: DWORD, - Sids: PSID_AND_ATTRIBUTES, - RestrictedSidCount: DWORD, + SidCount: DWORD, + SidLength: DWORD, + Sids: PSID_AND_ATTRIBUTES, + RestrictedSidCount: DWORD, RestrictedSidLength: DWORD, - RestrictedSids: PSID_AND_ATTRIBUTES, - PrivilegeCount: DWORD, - PrivilegeLength: DWORD, - Privileges: PLUID_AND_ATTRIBUTES, - AuthenticationId: LUID, + RestrictedSids: PSID_AND_ATTRIBUTES, + PrivilegeCount: DWORD, + PrivilegeLength: DWORD, + Privileges: PLUID_AND_ATTRIBUTES, + AuthenticationId: LUID, } PTOKEN_DEFAULT_DACL :: ^TOKEN_DEFAULT_DACL @@ -374,8 +374,8 @@ TOKEN_DEFAULT_DACL :: struct { PACL :: ^ACL ACL :: struct { AclRevision: BYTE, - Sbz1: BYTE, - AclSize: WORD, - AceCount: WORD, - Sbz2: WORD, + Sbz1: BYTE, + AclSize: WORD, + AceCount: WORD, + Sbz2: WORD, } diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index c2b4362d9..3418c7649 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -5,9 +5,9 @@ foreign import "system:Comctl32.lib" @(default_calling_convention="system") foreign Comctl32 { - InitCommonControlsEx :: proc(picce: ^INITCOMMONCONTROLSEX) -> BOOL --- + InitCommonControlsEx :: proc(picce: ^INITCOMMONCONTROLSEX) -> BOOL --- LoadIconWithScaleDown :: proc(hinst: HINSTANCE, pszName: PCWSTR, cx: c_int, cy: c_int, phico: ^HICON) -> HRESULT --- - SetWindowSubclass :: proc(hwnd: HWND, pfnSubclass: SUBCLASSPROC, uIdSubclass: UINT_PTR, dwRefData: DWORD_PTR) --- + SetWindowSubclass :: proc(hwnd: HWND, pfnSubclass: SUBCLASSPROC, uIdSubclass: UINT_PTR, dwRefData: DWORD_PTR) --- } ICC_LISTVIEW_CLASSES :: 0x00000001 @@ -155,73 +155,73 @@ ILP_NORMAL :: 0 ILP_DOWNLEVEL :: 1 IMAGELISTDRAWPARAMS :: struct { - cbSize: DWORD, - himl: HIMAGELIST, - i: c_int, - hdcDst: HDC, - x: c_int, - y: c_int, - cx: c_int, - cy: c_int, - xBitmap: c_int, - yBitmap: c_int, - rgbBk: COLORREF, - rgbFg: COLORREF, - fStyle: UINT, - dwRop: DWORD, - fState: DWORD, - Frame: DWORD, + cbSize: DWORD, + himl: HIMAGELIST, + i: c_int, + hdcDst: HDC, + x: c_int, + y: c_int, + cx: c_int, + cy: c_int, + xBitmap: c_int, + yBitmap: c_int, + rgbBk: COLORREF, + rgbFg: COLORREF, + fStyle: UINT, + dwRop: DWORD, + fState: DWORD, + Frame: DWORD, crEffect: COLORREF, } LPIMAGELISTDRAWPARAMS :: ^IMAGELISTDRAWPARAMS IMAGEINFO :: struct { hbmImage: HBITMAP, - hbmMask: HBITMAP, - Unused1: c_int, - Unused2: c_int, - rcImage: RECT, + hbmMask: HBITMAP, + Unused1: c_int, + Unused2: c_int, + rcImage: RECT, } LPIMAGEINFO :: ^IMAGEINFO @(default_calling_convention="system") foreign Comctl32 { - ImageList_Create :: proc(cx, cy: c_int, flags: UINT, cInitial, cGrow: c_int) -> HIMAGELIST --- - ImageList_Destroy :: proc(himl: HIMAGELIST) -> BOOL --- - ImageList_GetImageCount :: proc(himl: HIMAGELIST) -> c_int --- - ImageList_SetImageCount :: proc(himl: HIMAGELIST, uNewCount: UINT) -> BOOL --- - ImageList_Add :: proc(himl: HIMAGELIST, hbmImage, hbmMask: HBITMAP) -> c_int --- - ImageList_ReplaceIcon :: proc(himl: HIMAGELIST, i: c_int, hicon: HICON) -> c_int --- - ImageList_SetBkColor :: proc(himl: HIMAGELIST, clrBk: COLORREF) -> COLORREF --- - ImageList_GetBkColor :: proc(himl: HIMAGELIST) -> COLORREF --- - ImageList_SetOverlayImage :: proc(himl: HIMAGELIST, iImage: c_int, iOverlay: c_int) -> BOOL --- - ImageList_Draw :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y: c_int, fStyle: UINT) -> BOOL --- - ImageList_Replace :: proc(himl: HIMAGELIST, i: c_int, hbmImage, hbmMask: HBITMAP) -> BOOL --- - ImageList_AddMasked :: proc(himl: HIMAGELIST, hbmImage: HBITMAP, crMask: COLORREF) -> c_int --- - ImageList_DrawEx :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y, dx, dy: c_int, rgbBk, rgbFg: COLORREF, fStyle: UINT) -> BOOL --- - ImageList_DrawIndirect :: proc(pimldp: ^IMAGELISTDRAWPARAMS) -> BOOL --- - ImageList_Remove :: proc(himl: HIMAGELIST, i: c_int) -> BOOL --- - ImageList_GetIcon :: proc(himl: HIMAGELIST, i: c_int, flags: UINT) -> HICON --- - ImageList_LoadImageW :: proc(hi: HINSTANCE, lpbmp: LPCWSTR, cx, cgrow: c_int, crMask: COLORREF, uType, uFlags: UINT) -> HIMAGELIST --- - ImageList_Copy :: proc(himlDst: HIMAGELIST, iDst: c_int, himlSrc: HIMAGELIST, iSrc: c_int, uFlags: UINT) -> BOOL --- - ImageList_BeginDrag :: proc(himlTrack: HIMAGELIST, iTrack, dxHotspot, dyHotspot: c_int) -> BOOL --- - ImageList_EndDrag :: proc() --- - ImageList_DragEnter :: proc(hwndLock: HWND, x, y: c_int) -> BOOL --- - ImageList_DragLeave :: proc(hwndLock: HWND) -> BOOL --- - ImageList_DragMove :: proc(x, y: c_int) -> BOOL --- + ImageList_Create :: proc(cx, cy: c_int, flags: UINT, cInitial, cGrow: c_int) -> HIMAGELIST --- + ImageList_Destroy :: proc(himl: HIMAGELIST) -> BOOL --- + ImageList_GetImageCount :: proc(himl: HIMAGELIST) -> c_int --- + ImageList_SetImageCount :: proc(himl: HIMAGELIST, uNewCount: UINT) -> BOOL --- + ImageList_Add :: proc(himl: HIMAGELIST, hbmImage, hbmMask: HBITMAP) -> c_int --- + ImageList_ReplaceIcon :: proc(himl: HIMAGELIST, i: c_int, hicon: HICON) -> c_int --- + ImageList_SetBkColor :: proc(himl: HIMAGELIST, clrBk: COLORREF) -> COLORREF --- + ImageList_GetBkColor :: proc(himl: HIMAGELIST) -> COLORREF --- + ImageList_SetOverlayImage :: proc(himl: HIMAGELIST, iImage: c_int, iOverlay: c_int) -> BOOL --- + ImageList_Draw :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y: c_int, fStyle: UINT) -> BOOL --- + ImageList_Replace :: proc(himl: HIMAGELIST, i: c_int, hbmImage, hbmMask: HBITMAP) -> BOOL --- + ImageList_AddMasked :: proc(himl: HIMAGELIST, hbmImage: HBITMAP, crMask: COLORREF) -> c_int --- + ImageList_DrawEx :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y, dx, dy: c_int, rgbBk, rgbFg: COLORREF, fStyle: UINT) -> BOOL --- + ImageList_DrawIndirect :: proc(pimldp: ^IMAGELISTDRAWPARAMS) -> BOOL --- + ImageList_Remove :: proc(himl: HIMAGELIST, i: c_int) -> BOOL --- + ImageList_GetIcon :: proc(himl: HIMAGELIST, i: c_int, flags: UINT) -> HICON --- + ImageList_LoadImageW :: proc(hi: HINSTANCE, lpbmp: LPCWSTR, cx, cgrow: c_int, crMask: COLORREF, uType, uFlags: UINT) -> HIMAGELIST --- + ImageList_Copy :: proc(himlDst: HIMAGELIST, iDst: c_int, himlSrc: HIMAGELIST, iSrc: c_int, uFlags: UINT) -> BOOL --- + ImageList_BeginDrag :: proc(himlTrack: HIMAGELIST, iTrack, dxHotspot, dyHotspot: c_int) -> BOOL --- + ImageList_EndDrag :: proc() --- + ImageList_DragEnter :: proc(hwndLock: HWND, x, y: c_int) -> BOOL --- + ImageList_DragLeave :: proc(hwndLock: HWND) -> BOOL --- + ImageList_DragMove :: proc(x, y: c_int) -> BOOL --- ImageList_SetDragCursorImage :: proc(himlDrag: HIMAGELIST, iDrag, dxHotspot, dyHotspot: c_int) -> BOOL --- - ImageList_DragShowNolock :: proc(fShow: BOOL) -> BOOL --- - ImageList_GetDragImage :: proc(ppt, pptHotspot: ^POINT) -> HIMAGELIST --- - ImageList_Read :: proc(pstm: ^IStream) -> HIMAGELIST --- - ImageList_Write :: proc(himl: HIMAGELIST, pstm: ^IStream) -> BOOL --- - ImageList_ReadEx :: proc(dwFlags: DWORD, pstm: ^IStream, riid: REFIID, ppv: PVOID) -> HRESULT --- - ImageList_WriteEx :: proc(himl: HIMAGELIST, dwFlags: DWORD, pstm: ^IStream) -> HRESULT --- - ImageList_GetIconSize :: proc(himl: HIMAGELIST, cx, cy: ^c_int) -> BOOL --- - ImageList_SetIconSize :: proc(himl: HIMAGELIST, cx, cy: c_int) -> BOOL --- - ImageList_GetImageInfo :: proc(himl: HIMAGELIST, i: c_int, pImageInfo: ^IMAGEINFO) -> BOOL --- - ImageList_Merge :: proc(himl1: HIMAGELIST, i1: c_int, himl2: HIMAGELIST, i2: c_int, dx, dy: c_int) -> HIMAGELIST --- - ImageList_Duplicate :: proc(himl: HIMAGELIST) -> HIMAGELIST --- - HIMAGELIST_QueryInterface :: proc(himl: HIMAGELIST, riid: REFIID, ppv: rawptr) -> HRESULT --- + ImageList_DragShowNolock :: proc(fShow: BOOL) -> BOOL --- + ImageList_GetDragImage :: proc(ppt, pptHotspot: ^POINT) -> HIMAGELIST --- + ImageList_Read :: proc(pstm: ^IStream) -> HIMAGELIST --- + ImageList_Write :: proc(himl: HIMAGELIST, pstm: ^IStream) -> BOOL --- + ImageList_ReadEx :: proc(dwFlags: DWORD, pstm: ^IStream, riid: REFIID, ppv: PVOID) -> HRESULT --- + ImageList_WriteEx :: proc(himl: HIMAGELIST, dwFlags: DWORD, pstm: ^IStream) -> HRESULT --- + ImageList_GetIconSize :: proc(himl: HIMAGELIST, cx, cy: ^c_int) -> BOOL --- + ImageList_SetIconSize :: proc(himl: HIMAGELIST, cx, cy: c_int) -> BOOL --- + ImageList_GetImageInfo :: proc(himl: HIMAGELIST, i: c_int, pImageInfo: ^IMAGEINFO) -> BOOL --- + ImageList_Merge :: proc(himl1: HIMAGELIST, i1: c_int, himl2: HIMAGELIST, i2: c_int, dx, dy: c_int) -> HIMAGELIST --- + ImageList_Duplicate :: proc(himl: HIMAGELIST) -> HIMAGELIST --- + HIMAGELIST_QueryInterface :: proc(himl: HIMAGELIST, riid: REFIID, ppv: rawptr) -> HRESULT --- } ImageList_AddIcon :: #force_inline proc "system" (himl: HIMAGELIST, hicon: HICON) -> c_int { From c49a645d34483ef29eb2f9d583154169146e7317 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:14:39 +0000 Subject: [PATCH 135/766] Add `raw_union_tag` support to `MINIDUMP_CALLBACK_INPUT` --- core/sys/windows/dbghelp.odin | 57 +++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/core/sys/windows/dbghelp.odin b/core/sys/windows/dbghelp.odin index e32b4c874..4904c5fb4 100644 --- a/core/sys/windows/dbghelp.odin +++ b/core/sys/windows/dbghelp.odin @@ -55,23 +55,54 @@ MINIDUMP_CALLBACK_INFORMATION :: struct { CallbackParam: PVOID, } +MINIDUMP_CALLBACK_TYPE :: enum ULONG { + ModuleCallback, + ThreadCallback, + ThreadExCallback, + IncludeThreadCallback, + IncludeModuleCallback, + MemoryCallback, + CancelCallback, + WriteKernelMinidumpCallback, + KernelMinidumpStatusCallback, + RemoveMemoryCallback, + IncludeVmRegionCallback, + IoStartCallback, + IoWriteAllCallback, + IoFinishCallback, + ReadMemoryFailureCallback, + SecondaryFlagsCallback, + IsProcessSnapshotCallback, + VmStartCallback, + VmQueryCallback, + VmPreReadCallback, + VmPostReadCallback, +} + +MINIDUMP_SECONDARY_FLAG :: enum ULONG { + WithoutPowerInfo = 0, +} +MINIDUMP_SECONDARY_FLAGS :: distinct bit_set[MINIDUMP_SECONDARY_FLAG; ULONG] +MiniSecondaryWithoutPowerInfo :: MINIDUMP_SECONDARY_FLAGS{.WithoutPowerInfo} +MiniSecondaryValidFlags :: MINIDUMP_SECONDARY_FLAGS{.WithoutPowerInfo} + MINIDUMP_CALLBACK_INPUT :: struct { ProcessId: ULONG, ProcessHandle: HANDLE, - CallbackType: ULONG, + CallbackType: MINIDUMP_CALLBACK_TYPE, using _: struct #raw_union { - Status: HRESULT, - Thread: MINIDUMP_THREAD_CALLBACK, - ThreadEx: MINIDUMP_THREAD_EX_CALLBACK, - Module: MINIDUMP_MODULE_CALLBACK, - IncludeThread: MINIDUMP_INCLUDE_THREAD_CALLBACK, - IncludeModule: MINIDUMP_INCLUDE_MODULE_CALLBACK, - Io: MINIDUMP_IO_CALLBACK, - ReadMemoryFailure: MINIDUMP_READ_MEMORY_FAILURE_CALLBACK, - SecondaryFlags: ULONG, - VmQuery: MINIDUMP_VM_QUERY_CALLBACK, - VmPreRead: MINIDUMP_VM_PRE_READ_CALLBACK, - VmPostRead: MINIDUMP_VM_POST_READ_CALLBACK, + Status: HRESULT `raw_union_tag:"KernelMinidumpStatusCallback"`, + Thread: MINIDUMP_THREAD_CALLBACK `raw_union_tag:"ThreadCallback"`, + ThreadEx: MINIDUMP_THREAD_EX_CALLBACK `raw_union_tag:"ThreadExCallback"`, + Module: MINIDUMP_MODULE_CALLBACK `raw_union_tag:"ModuleCallback"`, + IncludeThread: MINIDUMP_INCLUDE_THREAD_CALLBACK `raw_union_tag:"IncludeThreadCallback"`, + IncludeModule: MINIDUMP_INCLUDE_MODULE_CALLBACK `raw_union_tag:"IncludeModuleCallback"`, + Io: MINIDUMP_IO_CALLBACK `raw_union_tag:"IoStartCallback,IoWriteAllCallback,IoFinishCallback"`, + ReadMemoryFailure: MINIDUMP_READ_MEMORY_FAILURE_CALLBACK `raw_union_tag:"ReadMemoryFailureCallback"`, + SecondaryFlags: MINIDUMP_SECONDARY_FLAGS `raw_union_tag:"SecondaryFlagsCallback"`, + VmQuery: MINIDUMP_VM_QUERY_CALLBACK `raw_union_tag:"VmQueryCallback"`, + VmPreRead: MINIDUMP_VM_PRE_READ_CALLBACK `raw_union_tag:"VmPreReadCallback"`, + VmPostRead: MINIDUMP_VM_POST_READ_CALLBACK `raw_union_tag:"VmPostReadCallback"`, }, } From bfe75d5c2cfce94b989431ddb2b186a0d877ffe9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:19:23 +0000 Subject: [PATCH 136/766] Add boolean support for `raw_union_tag` --- core/fmt/fmt.odin | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 72fe6fdf0..04211b8a9 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2159,6 +2159,35 @@ __handle_raw_union_tag :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime. } } } + + case reflect.Type_Info_Boolean: + tag_value := reflect.as_bool(tag) or_break + + for tag, index in info.tags[:info.field_count] { + rut_list := reflect.struct_tag_lookup(reflect.Struct_Tag(tag), "raw_union_tag") or_continue + + for rut in strings.split_iterator(&rut_list, ",") { + head_tag, match, tail_name := strings.partition(string(rut), "=") + if head_tag != tag_name || match != "=" { + continue + } + + // just ignore the `A.` prefix for `A.B` stuff entirely + if _, _, try_tail_name := strings.partition(string(rut), "."); try_tail_name != "" { + tail_name = try_tail_name + } + + tail_value := strconv.parse_bool(tail_name) or_continue + + if tail_value == tag_value { + io.write_string(fi.writer, "#raw_union(.", &fi.n) + io.write_string(fi.writer, "true" if tag_value else "false", &fi.n) + io.write_string(fi.writer, ") ", &fi.n) + fmt_arg(fi, any{v.data, info.types[index].id}, the_verb) + return true + } + } + } } return false From b86627ba3725b5cdf4b7ac0a4cb7f17f2eab08fb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:39:46 +0000 Subject: [PATCH 137/766] Improve formatting and `#raw_union` logic in `core:sys/windows` --- core/sys/windows/dnsapi.odin | 4 +- core/sys/windows/dwmapi.odin | 8 +- core/sys/windows/gdi32.odin | 106 +-- core/sys/windows/hidpi.odin | 272 ++++---- core/sys/windows/hidusage.odin | 1076 +++++++++++++++---------------- core/sys/windows/icu.odin | 2 +- core/sys/windows/ip_helper.odin | 4 +- core/sys/windows/kernel32.odin | 661 ++++++++++--------- 8 files changed, 1065 insertions(+), 1068 deletions(-) diff --git a/core/sys/windows/dnsapi.odin b/core/sys/windows/dnsapi.odin index 728813696..73e565118 100644 --- a/core/sys/windows/dnsapi.odin +++ b/core/sys/windows/dnsapi.odin @@ -5,6 +5,6 @@ foreign import "system:Dnsapi.lib" @(default_calling_convention="system") foreign Dnsapi { - DnsQuery_UTF8 :: proc(name: cstring, type: u16, options: DNS_QUERY_OPTIONS, extra: PVOID, results: ^^DNS_RECORD, reserved: PVOID) -> DNS_STATUS --- - DnsRecordListFree :: proc(list: ^DNS_RECORD, options: DWORD) --- + DnsQuery_UTF8 :: proc(name: cstring, type: u16, options: DNS_QUERY_OPTIONS, extra: PVOID, results: ^^DNS_RECORD, reserved: PVOID) -> DNS_STATUS --- + DnsRecordListFree :: proc(list: ^DNS_RECORD, options: DWORD) --- } diff --git a/core/sys/windows/dwmapi.odin b/core/sys/windows/dwmapi.odin index e86730660..0980c2e94 100644 --- a/core/sys/windows/dwmapi.odin +++ b/core/sys/windows/dwmapi.odin @@ -47,9 +47,9 @@ DWM_WINDOW_CORNER_PREFERENCE :: enum c_int { @(default_calling_convention="system") foreign dwmapi { - DwmFlush :: proc() -> HRESULT --- - DwmIsCompositionEnabled :: proc(pfEnabled: ^BOOL) -> HRESULT --- + DwmFlush :: proc() -> HRESULT --- + DwmIsCompositionEnabled :: proc(pfEnabled: ^BOOL) -> HRESULT --- DwmExtendFrameIntoClientArea :: proc(hWnd: HWND, pMarInset: PMARGINS) -> HRESULT --- - DwmGetWindowAttribute :: proc(hWnd: HWND, dwAttribute: DWORD, pvAttribute: PVOID, cbAttribute: DWORD) -> HRESULT --- - DwmSetWindowAttribute :: proc(hWnd: HWND, dwAttribute: DWORD, pvAttribute: LPCVOID, cbAttribute: DWORD) -> HRESULT --- + DwmGetWindowAttribute :: proc(hWnd: HWND, dwAttribute: DWORD, pvAttribute: PVOID, cbAttribute: DWORD) -> HRESULT --- + DwmSetWindowAttribute :: proc(hWnd: HWND, dwAttribute: DWORD, pvAttribute: LPCVOID, cbAttribute: DWORD) -> HRESULT --- } diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 1a23b4c8f..756ec5011 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -7,85 +7,88 @@ foreign import gdi32 "system:Gdi32.lib" @(default_calling_convention="system") foreign gdi32 { - GetDeviceCaps :: proc(hdc: HDC, index: INT) -> INT --- + GetDeviceCaps :: proc(hdc: HDC, index: INT) -> INT --- GetStockObject :: proc(i: INT) -> HGDIOBJ --- - SelectObject :: proc(hdc: HDC, h: HGDIOBJ) -> HGDIOBJ --- - DeleteObject :: proc(ho: HGDIOBJ) -> BOOL --- - SetBkColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- - SetBkMode :: proc(hdc: HDC, mode: BKMODE) -> INT --- + SelectObject :: proc(hdc: HDC, h: HGDIOBJ) -> HGDIOBJ --- + DeleteObject :: proc(ho: HGDIOBJ) -> BOOL --- + SetBkColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- + SetBkMode :: proc(hdc: HDC, mode: BKMODE) -> INT --- CreateCompatibleDC :: proc(hdc: HDC) -> HDC --- - DeleteDC :: proc(hdc: HDC) -> BOOL --- - CancelDC :: proc(hdc: HDC) -> BOOL --- - SaveDC :: proc(hdc: HDC) -> INT --- - RestoreDC :: proc(hdc: HDC, nSavedDC: INT) -> BOOL --- + DeleteDC :: proc(hdc: HDC) -> BOOL --- + CancelDC :: proc(hdc: HDC) -> BOOL --- + SaveDC :: proc(hdc: HDC) -> INT --- + RestoreDC :: proc(hdc: HDC, nSavedDC: INT) -> BOOL --- CreateDIBPatternBrush :: proc(h: HGLOBAL, iUsage: UINT) -> HBRUSH --- - CreateDIBitmap :: proc(hdc: HDC, pbmih: ^BITMAPINFOHEADER, flInit: DWORD, pjBits: VOID, pbmi: ^BITMAPINFO, iUsage: UINT) -> HBITMAP --- - CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: ^^VOID, hSection: HANDLE, offset: DWORD) -> HBITMAP --- - StretchDIBits :: proc(hdc: HDC, xDest, yDest, DestWidth, DestHeight, xSrc, ySrc, SrcWidth, SrcHeight: INT, lpBits: VOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT --- - StretchBlt :: proc(hdcDest: HDC, xDest, yDest, wDest, hDest: INT, hdcSrc: HDC, xSrc, ySrc, wSrc, hSrc: INT, rop: DWORD) -> BOOL --- + CreateDIBitmap :: proc(hdc: HDC, pbmih: ^BITMAPINFOHEADER, flInit: DWORD, pjBits: VOID, pbmi: ^BITMAPINFO, iUsage: UINT) -> HBITMAP --- + CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: ^^VOID, hSection: HANDLE, offset: DWORD) -> HBITMAP --- + StretchDIBits :: proc(hdc: HDC, xDest, yDest, DestWidth, DestHeight, xSrc, ySrc, SrcWidth, SrcHeight: INT, lpBits: VOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT --- + StretchBlt :: proc(hdcDest: HDC, xDest, yDest, wDest, hDest: INT, hdcSrc: HDC, xSrc, ySrc, wSrc, hSrc: INT, rop: DWORD) -> BOOL --- - SetPixelFormat :: proc(hdc: HDC, format: INT, ppfd: ^PIXELFORMATDESCRIPTOR) -> BOOL --- - ChoosePixelFormat :: proc(hdc: HDC, ppfd: ^PIXELFORMATDESCRIPTOR) -> INT --- + SetPixelFormat :: proc(hdc: HDC, format: INT, ppfd: ^PIXELFORMATDESCRIPTOR) -> BOOL --- + ChoosePixelFormat :: proc(hdc: HDC, ppfd: ^PIXELFORMATDESCRIPTOR) -> INT --- DescribePixelFormat :: proc(hdc: HDC, iPixelFormat: INT, nBytes: UINT, ppfd: ^PIXELFORMATDESCRIPTOR) -> INT --- - SwapBuffers :: proc(hdc: HDC) -> BOOL --- + SwapBuffers :: proc(hdc: HDC) -> BOOL --- SetDCBrushColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- GetDCBrushColor :: proc(hdc: HDC) -> COLORREF --- - PatBlt :: proc(hdc: HDC, x, y, w, h: INT, rop: DWORD) -> BOOL --- - Rectangle :: proc(hdc: HDC, left, top, right, bottom: INT) -> BOOL --- + PatBlt :: proc(hdc: HDC, x, y, w, h: INT, rop: DWORD) -> BOOL --- + Rectangle :: proc(hdc: HDC, left, top, right, bottom: INT) -> BOOL --- - CreateFontW :: proc(cHeight, cWidth, cEscapement, cOrientation, cWeight: INT, bItalic, bUnderline, bStrikeOut, iCharSet, iOutPrecision: DWORD, iClipPrecision, iQuality, iPitchAndFamily: DWORD, pszFaceName: LPCWSTR) -> HFONT --- - CreateFontIndirectW :: proc(lplf: ^LOGFONTW) -> HFONT --- + CreateFontW :: proc(cHeight, cWidth, cEscapement, cOrientation, cWeight: INT, bItalic, bUnderline, bStrikeOut, iCharSet, iOutPrecision: DWORD, iClipPrecision, iQuality, iPitchAndFamily: DWORD, pszFaceName: LPCWSTR) -> HFONT --- + CreateFontIndirectW :: proc(lplf: ^LOGFONTW) -> HFONT --- CreateFontIndirectExW :: proc(unnamedParam1: ^ENUMLOGFONTEXDVW) -> HFONT --- - AddFontResourceW :: proc(unnamedParam1: LPCWSTR) -> INT --- - AddFontResourceExW :: proc(name: LPCWSTR, fl: DWORD, res: PVOID) -> INT --- - AddFontMemResourceEx :: proc(pFileView: PVOID, cjSize: DWORD, pvResrved: PVOID, pNumFonts: ^DWORD) -> HANDLE --- - EnumFontsW :: proc(hdc: HDC, lpLogfont: LPCWSTR, lpProc: FONTENUMPROCW, lParam: LPARAM) -> INT --- - EnumFontFamiliesW :: proc(hdc: HDC, lpLogfont: LPCWSTR, lpProc: FONTENUMPROCW, lParam: LPARAM) -> INT --- - EnumFontFamiliesExW :: proc(hdc: HDC, lpLogfont: LPLOGFONTW, lpProc: FONTENUMPROCW, lParam: LPARAM, dwFlags: DWORD) -> INT --- + AddFontResourceW :: proc(unnamedParam1: LPCWSTR) -> INT --- + AddFontResourceExW :: proc(name: LPCWSTR, fl: DWORD, res: PVOID) -> INT --- + AddFontMemResourceEx :: proc(pFileView: PVOID, cjSize: DWORD, pvResrved: PVOID, pNumFonts: ^DWORD) -> HANDLE --- + EnumFontsW :: proc(hdc: HDC, lpLogfont: LPCWSTR, lpProc: FONTENUMPROCW, lParam: LPARAM) -> INT --- + EnumFontFamiliesW :: proc(hdc: HDC, lpLogfont: LPCWSTR, lpProc: FONTENUMPROCW, lParam: LPARAM) -> INT --- + EnumFontFamiliesExW :: proc(hdc: HDC, lpLogfont: LPLOGFONTW, lpProc: FONTENUMPROCW, lParam: LPARAM, dwFlags: DWORD) -> INT --- - TextOutW :: proc(hdc: HDC, x, y: INT, lpString: LPCWSTR, c: INT) -> BOOL --- + TextOutW :: proc(hdc: HDC, x, y: INT, lpString: LPCWSTR, c: INT) -> BOOL --- GetTextExtentPoint32W :: proc(hdc: HDC, lpString: LPCWSTR, c: INT, psizl: LPSIZE) -> BOOL --- - GetTextMetricsW :: proc(hdc: HDC, lptm: LPTEXTMETRICW) -> BOOL --- + GetTextMetricsW :: proc(hdc: HDC, lptm: LPTEXTMETRICW) -> BOOL --- CreateSolidBrush :: proc(color: COLORREF) -> HBRUSH --- - GetObjectW :: proc(h: HANDLE, c: INT, pv: LPVOID) -> c_int --- + GetObjectW :: proc(h: HANDLE, c: INT, pv: LPVOID) -> c_int --- CreateCompatibleBitmap :: proc(hdc: HDC, cx, cy: INT) -> HBITMAP --- - BitBlt :: proc(hdc: HDC, x, y, cx, cy: INT, hdcSrc: HDC, x1, y1: INT, rop: DWORD) -> BOOL --- - GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> INT --- - SetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start: UINT, cLines: UINT, lpBits: VOID, lpbmi: ^BITMAPINFO, ColorUse: UINT) -> INT --- - SetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- - GetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- + BitBlt :: proc(hdc: HDC, x, y, cx, cy: INT, hdcSrc: HDC, x1, y1: INT, rop: DWORD) -> BOOL --- + GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> INT --- + SetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start: UINT, cLines: UINT, lpBits: VOID, lpbmi: ^BITMAPINFO, ColorUse: UINT) -> INT --- + SetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- + GetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- - CreatePen :: proc(iStyle, cWidth: INT, color: COLORREF) -> HPEN --- - ExtCreatePen :: proc(iPenStyle, cWidth: DWORD, plbrush: ^LOGBRUSH, cStyle: DWORD, pstyle: ^DWORD) -> HPEN --- + CreatePen :: proc(iStyle, cWidth: INT, color: COLORREF) -> HPEN --- + ExtCreatePen :: proc(iPenStyle, cWidth: DWORD, plbrush: ^LOGBRUSH, cStyle: DWORD, pstyle: ^DWORD) -> HPEN --- SetDCPenColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- GetDCPenColor :: proc(hdc: HDC) -> COLORREF --- - CreatePalette :: proc(plpal: ^LOGPALETTE) -> HPALETTE --- - SelectPalette :: proc(hdc: HDC, hPal: HPALETTE, bForceBkgd: BOOL) -> HPALETTE --- + CreatePalette :: proc(plpal: ^LOGPALETTE) -> HPALETTE --- + SelectPalette :: proc(hdc: HDC, hPal: HPALETTE, bForceBkgd: BOOL) -> HPALETTE --- RealizePalette :: proc(hdc: HDC) -> UINT --- SetTextColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- - RoundRect :: proc(hdc: HDC, left: INT, top: INT, right: INT, bottom: INT, width: INT, height: INT) -> BOOL --- - SetPixel :: proc(hdc: HDC, x: INT, y: INT, color: COLORREF) -> COLORREF --- + RoundRect :: proc(hdc: HDC, left: INT, top: INT, right: INT, bottom: INT, width: INT, height: INT) -> BOOL --- + SetPixel :: proc(hdc: HDC, x: INT, y: INT, color: COLORREF) -> COLORREF --- GdiTransparentBlt :: proc(hdcDest: HDC, xoriginDest, yoriginDest, wDest, hDest: INT, hdcSrc: HDC, xoriginSrc, yoriginSrc, wSrc, hSrc: INT, crTransparent: UINT) -> BOOL --- - GdiGradientFill :: proc(hdc: HDC, pVertex: PTRIVERTEX, nVertex: ULONG, pMesh: PVOID, nCount: ULONG, ulMode: ULONG) -> BOOL --- - GdiAlphaBlend :: proc(hdcDest: HDC, xoriginDest, yoriginDest, wDest, hDest: INT, hdcSrc: HDC, xoriginSrc, yoriginSrc, wSrc, hSrc: INT, ftn: BLENDFUNCTION) -> BOOL --- + GdiGradientFill :: proc(hdc: HDC, pVertex: PTRIVERTEX, nVertex: ULONG, pMesh: PVOID, nCount: ULONG, ulMode: ULONG) -> BOOL --- + GdiAlphaBlend :: proc(hdcDest: HDC, xoriginDest, yoriginDest, wDest, hDest: INT, hdcSrc: HDC, xoriginSrc, yoriginSrc, wSrc, hSrc: INT, ftn: BLENDFUNCTION) -> BOOL --- } +@(require_results) RGB :: #force_inline proc "contextless" (#any_int r, g, b: int) -> COLORREF { return COLORREF(DWORD(BYTE(r)) | (DWORD(BYTE(g)) << 8) | (DWORD(BYTE(b)) << 16)) } +@(require_results) PALETTERGB :: #force_inline proc "contextless" (#any_int r, g, b: int) -> COLORREF { return 0x02000000 | RGB(r, g, b) } +@(require_results) PALETTEINDEX :: #force_inline proc "contextless" (#any_int i: int) -> COLORREF { return COLORREF(DWORD(0x01000000) | DWORD(WORD(i))) } @@ -154,17 +157,21 @@ ICONINFOEXW :: struct { } PICONINFOEXW :: ^ICONINFOEXW -AC_SRC_OVER :: 0x00 +AC_SRC_OVER :: 0x00 AC_SRC_ALPHA :: 0x01 TransparentBlt :: GdiTransparentBlt -GradientFill :: GdiGradientFill -AlphaBlend :: GdiAlphaBlend +GradientFill :: GdiGradientFill +AlphaBlend :: GdiAlphaBlend COLOR16 :: USHORT TRIVERTEX :: struct { - x, y: LONG, - Red, Green, Blue, Alpha: COLOR16, + x: LONG, + y: LONG, + Red: COLOR16, + Green: COLOR16, + Blue: COLOR16, + Alpha: COLOR16, } PTRIVERTEX :: ^TRIVERTEX @@ -179,7 +186,10 @@ GRADIENT_RECT :: struct { PGRADIENT_RECT :: ^GRADIENT_RECT BLENDFUNCTION :: struct { - BlendOp, BlendFlags, SourceConstantAlpha, AlphaFormat: BYTE, + BlendOp: BYTE, + BlendFlags: BYTE, + SourceConstantAlpha: BYTE, + AlphaFormat: BYTE, } GRADIENT_FILL_RECT_H : ULONG : 0x00000000 diff --git a/core/sys/windows/hidpi.odin b/core/sys/windows/hidpi.odin index 6f1e888cc..2cf2b2f34 100644 --- a/core/sys/windows/hidpi.odin +++ b/core/sys/windows/hidpi.odin @@ -2,149 +2,149 @@ package sys_windows HIDD_CONFIGURATION :: struct { - cookie: PVOID, - size: ULONG, + cookie: PVOID, + size: ULONG, RingBufferSize: ULONG, } PHIDD_CONFIGURATION :: ^HIDD_CONFIGURATION HIDD_ATTRIBUTES :: struct { - Size: ULONG, - VendorID: USHORT, - ProductID: USHORT, + Size: ULONG, + VendorID: USHORT, + ProductID: USHORT, VersionNumber: USHORT, } PHIDD_ATTRIBUTES :: ^HIDD_ATTRIBUTES HIDP_CAPS :: struct { - Usage: USAGE, - UsagePage: USAGE, - InputReportByteLength: USHORT, - OutputReportByteLength: USHORT, - FeatureReportByteLength: USHORT, - Reserved: [17]USHORT, + Usage: USAGE, + UsagePage: USAGE, + InputReportByteLength: USHORT, + OutputReportByteLength: USHORT, + FeatureReportByteLength: USHORT, + Reserved: [17]USHORT, NumberLinkCollectionNodes: USHORT, - NumberInputButtonCaps: USHORT, - NumberInputValueCaps: USHORT, - NumberInputDataIndices: USHORT, - NumberOutputButtonCaps: USHORT, - NumberOutputValueCaps: USHORT, - NumberOutputDataIndices: USHORT, - NumberFeatureButtonCaps: USHORT, - NumberFeatureValueCaps: USHORT, - NumberFeatureDataIndices: USHORT, + NumberInputButtonCaps: USHORT, + NumberInputValueCaps: USHORT, + NumberInputDataIndices: USHORT, + NumberOutputButtonCaps: USHORT, + NumberOutputValueCaps: USHORT, + NumberOutputDataIndices: USHORT, + NumberFeatureButtonCaps: USHORT, + NumberFeatureValueCaps: USHORT, + NumberFeatureDataIndices: USHORT, } PHIDP_CAPS :: ^HIDP_CAPS HIDP_BUTTON_CAPS :: struct { - UsagePage: USAGE, - ReportID: UCHAR, - IsAlias: BOOLEAN, - BitField: USHORT, - LinkCollection: USHORT, - LinkUsage: USAGE, - LinkUsagePage: USAGE, - IsRange: BOOLEAN, - IsStringRange: BOOLEAN, + UsagePage: USAGE, + ReportID: UCHAR, + IsAlias: BOOLEAN, + BitField: USHORT, + LinkCollection: USHORT, + LinkUsage: USAGE, + LinkUsagePage: USAGE, + IsRange: BOOLEAN, + IsStringRange: BOOLEAN, IsDesignatorRange: BOOLEAN, - IsAbsolute: BOOLEAN, - ReportCount: USHORT, - Reserved2: USHORT, - Reserved: [9]ULONG, + IsAbsolute: BOOLEAN, + ReportCount: USHORT, + Reserved2: USHORT, + Reserved: [9]ULONG, using _: struct #raw_union { Range: struct { - UsageMin: USAGE, - UsageMax: USAGE, - StringMin: USHORT, - StringMax: USHORT, + UsageMin: USAGE, + UsageMax: USAGE, + StringMin: USHORT, + StringMax: USHORT, DesignatorMin: USHORT, DesignatorMax: USHORT, - DataIndexMin: USHORT, - DataIndexMax: USHORT, - }, + DataIndexMin: USHORT, + DataIndexMax: USHORT, + } `raw_union_tag:"IsRange=true"`, NotRange: struct { - Usage: USAGE, - Reserved1: USAGE, - StringIndex: USHORT, - Reserved2: USHORT, + Usage: USAGE, + Reserved1: USAGE, + StringIndex: USHORT, + Reserved2: USHORT, DesignatorIndex: USHORT, - Reserved3: USHORT, - DataIndex: USHORT, - Reserved4: USHORT, - }, + Reserved3: USHORT, + DataIndex: USHORT, + Reserved4: USHORT, + } `raw_union_tag:"IsRange=false"`, }, } PHIDP_BUTTON_CAPS :: ^HIDP_BUTTON_CAPS HIDP_VALUE_CAPS :: struct { - UsagePage: USAGE, - ReportID: UCHAR, - IsAlias: BOOLEAN, - BitField: USHORT, - LinkCollection: USHORT, - LinkUsage: USAGE, - LinkUsagePage: USAGE, - IsRange: BOOLEAN, - IsStringRange: BOOLEAN, + UsagePage: USAGE, + ReportID: UCHAR, + IsAlias: BOOLEAN, + BitField: USHORT, + LinkCollection: USHORT, + LinkUsage: USAGE, + LinkUsagePage: USAGE, + IsRange: BOOLEAN, + IsStringRange: BOOLEAN, IsDesignatorRange: BOOLEAN, - IsAbsolute: BOOLEAN, - HasNull: BOOLEAN, - Reserved: UCHAR, - BitSize: USHORT, - ReportCount: USHORT, - Reserved2: [5]USHORT, - UnitsExp: ULONG, - Units: ULONG, - LogicalMin: LONG, - LogicalMax: LONG, - PhysicalMin: LONG, - PhysicalMax: LONG, + IsAbsolute: BOOLEAN, + HasNull: BOOLEAN, + Reserved: UCHAR, + BitSize: USHORT, + ReportCount: USHORT, + Reserved2: [5]USHORT, + UnitsExp: ULONG, + Units: ULONG, + LogicalMin: LONG, + LogicalMax: LONG, + PhysicalMin: LONG, + PhysicalMax: LONG, using _: struct #raw_union { Range: struct { - UsageMin: USAGE, - UsageMax: USAGE, - StringMin: USHORT, - StringMax: USHORT, + UsageMin: USAGE, + UsageMax: USAGE, + StringMin: USHORT, + StringMax: USHORT, DesignatorMin: USHORT, DesignatorMax: USHORT, - DataIndexMin: USHORT, - DataIndexMax: USHORT, - }, + DataIndexMin: USHORT, + DataIndexMax: USHORT, + } `raw_union_tag:"IsRange=true"`, NotRange: struct { - Usage: USAGE, - Reserved1: USAGE, - StringIndex: USHORT, - Reserved2: USHORT, + Usage: USAGE, + Reserved1: USAGE, + StringIndex: USHORT, + Reserved2: USHORT, DesignatorIndex: USHORT, - Reserved3: USHORT, - DataIndex: USHORT, - Reserved4: USHORT, - }, + Reserved3: USHORT, + DataIndex: USHORT, + Reserved4: USHORT, + } `raw_union_tag:"IsRange=false"`, }, } PHIDP_VALUE_CAPS :: ^HIDP_VALUE_CAPS HIDP_DATA :: struct { DataIndex: USHORT, - Reserved: USHORT, + Reserved: USHORT, using _ : struct #raw_union { RawValue: ULONG, - On: BOOLEAN, + On: BOOLEAN, }, } PHIDP_DATA :: ^HIDP_DATA HIDP_LINK_COLLECTION_NODE :: struct { - LinkUsage: USAGE, - LinkUsagePage: USAGE, - Parent: USHORT, + LinkUsage: USAGE, + LinkUsagePage: USAGE, + Parent: USHORT, NumberOfChildren: USHORT, - NextSibling: USHORT, - FirstChild: USHORT, - CollectionType: [8]ULONG, - IsAlias: [1]ULONG, - Reserved: [23]ULONG, - UserContext: PVOID, + NextSibling: USHORT, + FirstChild: USHORT, + CollectionType: [8]ULONG, + IsAlias: [1]ULONG, + Reserved: [23]ULONG, + UserContext: PVOID, } PHIDP_LINK_COLLECTION_NODE :: ^HIDP_LINK_COLLECTION_NODE @@ -157,56 +157,56 @@ HIDP_REPORT_TYPE :: enum c_int { Feature, } -HIDP_STATUS_SUCCESS : NTSTATUS : 0x110000 -HIDP_STATUS_NULL : NTSTATUS : -2146369535 //0x80110001 -HIDP_STATUS_INVALID_PREPARSED_DATA : NTSTATUS : -1072627711 //0xC0110001 -HIDP_STATUS_INVALID_REPORT_TYPE : NTSTATUS : -1072627710 //0xC0110002 -HIDP_STATUS_INVALID_REPORT_LENGTH : NTSTATUS : -1072627709 //0xC0110003 -HIDP_STATUS_USAGE_NOT_FOUND : NTSTATUS : -1072627708 //0xC0110004 -HIDP_STATUS_VALUE_OUT_OF_RANGE : NTSTATUS : -1072627707 //0xC0110005 -HIDP_STATUS_BAD_LOG_PHY_VALUES : NTSTATUS : -1072627706 //0xC0100006 -HIDP_STATUS_BUFFER_TOO_SMALL : NTSTATUS : -1072627705 //0xC0110007 -HIDP_STATUS_INTERNAL_ERROR : NTSTATUS : -1072627704 //0xC0110008 -HIDP_STATUS_I8042_TRANS_UNKNOWN : NTSTATUS : -1072627703 //0xC0110009 -HIDP_STATUS_INCOMPATIBLE_REPORT_ID : NTSTATUS : -1072627702 //0xC011000A -HIDP_STATUS_NOT_VALUE_ARRAY : NTSTATUS : -1072627701 //0xC011000B -HIDP_STATUS_IS_VALUE_ARRAY : NTSTATUS : -1072627700 //0xC011000C -HIDP_STATUS_DATA_INDEX_NOT_FOUND : NTSTATUS : -1072627699 //0xC011000D +HIDP_STATUS_SUCCESS : NTSTATUS : 0x110000 +HIDP_STATUS_NULL : NTSTATUS : -2146369535 //0x80110001 +HIDP_STATUS_INVALID_PREPARSED_DATA : NTSTATUS : -1072627711 //0xC0110001 +HIDP_STATUS_INVALID_REPORT_TYPE : NTSTATUS : -1072627710 //0xC0110002 +HIDP_STATUS_INVALID_REPORT_LENGTH : NTSTATUS : -1072627709 //0xC0110003 +HIDP_STATUS_USAGE_NOT_FOUND : NTSTATUS : -1072627708 //0xC0110004 +HIDP_STATUS_VALUE_OUT_OF_RANGE : NTSTATUS : -1072627707 //0xC0110005 +HIDP_STATUS_BAD_LOG_PHY_VALUES : NTSTATUS : -1072627706 //0xC0100006 +HIDP_STATUS_BUFFER_TOO_SMALL : NTSTATUS : -1072627705 //0xC0110007 +HIDP_STATUS_INTERNAL_ERROR : NTSTATUS : -1072627704 //0xC0110008 +HIDP_STATUS_I8042_TRANS_UNKNOWN : NTSTATUS : -1072627703 //0xC0110009 +HIDP_STATUS_INCOMPATIBLE_REPORT_ID : NTSTATUS : -1072627702 //0xC011000A +HIDP_STATUS_NOT_VALUE_ARRAY : NTSTATUS : -1072627701 //0xC011000B +HIDP_STATUS_IS_VALUE_ARRAY : NTSTATUS : -1072627700 //0xC011000C +HIDP_STATUS_DATA_INDEX_NOT_FOUND : NTSTATUS : -1072627699 //0xC011000D HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE : NTSTATUS : -1072627698 //0xC011000E -HIDP_STATUS_BUTTON_NOT_PRESSED : NTSTATUS : -1072627697 //0xC011000F -HIDP_STATUS_REPORT_DOES_NOT_EXIST : NTSTATUS : -1072627696 //0xC0110010 -HIDP_STATUS_NOT_IMPLEMENTED : NTSTATUS : -1072627680 //0xC0110020 -HIDP_STATUS_NOT_BUTTON_ARRAY : NTSTATUS : -1072627679 //0xC0110021 +HIDP_STATUS_BUTTON_NOT_PRESSED : NTSTATUS : -1072627697 //0xC011000F +HIDP_STATUS_REPORT_DOES_NOT_EXIST : NTSTATUS : -1072627696 //0xC0110010 +HIDP_STATUS_NOT_IMPLEMENTED : NTSTATUS : -1072627680 //0xC0110020 +HIDP_STATUS_NOT_BUTTON_ARRAY : NTSTATUS : -1072627679 //0xC0110021 HIDP_STATUS_I8242_TRANS_UNKNOWN :: HIDP_STATUS_I8042_TRANS_UNKNOWN foreign import hid "system:hid.lib" @(default_calling_convention="system") foreign hid { - HidP_GetCaps :: proc(PreparsedData: PHIDP_PREPARSED_DATA, Capabilities: PHIDP_CAPS) -> NTSTATUS --- - HidP_GetButtonCaps :: proc(ReportType: HIDP_REPORT_TYPE, ButtonCaps: PHIDP_BUTTON_CAPS, ButtonCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS --- - HidP_GetValueCaps :: proc(ReportType: HIDP_REPORT_TYPE, ValueCaps: PHIDP_VALUE_CAPS, ValueCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS --- - HidP_GetUsages :: proc(ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, UsageList: PUSAGE, UsageLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- - HidP_GetUsageValue :: proc(ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- - HidP_GetData :: proc(ReportType: HIDP_REPORT_TYPE, DataList: PHIDP_DATA, DataLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- + HidP_GetCaps :: proc(PreparsedData: PHIDP_PREPARSED_DATA, Capabilities: PHIDP_CAPS) -> NTSTATUS --- + HidP_GetButtonCaps :: proc(ReportType: HIDP_REPORT_TYPE, ButtonCaps: PHIDP_BUTTON_CAPS, ButtonCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS --- + HidP_GetValueCaps :: proc(ReportType: HIDP_REPORT_TYPE, ValueCaps: PHIDP_VALUE_CAPS, ValueCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS --- + HidP_GetUsages :: proc(ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, UsageList: PUSAGE, UsageLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- + HidP_GetUsageValue :: proc(ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- + HidP_GetData :: proc(ReportType: HIDP_REPORT_TYPE, DataList: PHIDP_DATA, DataLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- HidP_GetLinkCollectionNodes :: proc(LinkCollectionNodes: PHIDP_LINK_COLLECTION_NODE, LinkCollectionNodesLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS --- - HidD_GetAttributes :: proc(HidDeviceObject: HANDLE, Attributes: PHIDD_ATTRIBUTES) -> BOOLEAN --- - HidD_GetHidGuid :: proc(HidGuid: LPGUID) --- - HidD_GetPreparsedData :: proc(HidDeviceObject: HANDLE, PreparsedData: ^PHIDP_PREPARSED_DATA) -> BOOLEAN --- - HidD_FreePreparsedData :: proc(PreparsedData: PHIDP_PREPARSED_DATA) -> BOOLEAN --- - HidD_FlushQueue :: proc(HidDeviceObject: HANDLE) -> BOOLEAN --- - HidD_GetConfiguration :: proc(HidDeviceObject: HANDLE, Configuration: PHIDD_CONFIGURATION, ConfigurationLength: ULONG) -> BOOLEAN --- - HidD_SetConfiguration :: proc(HidDeviceObject: HANDLE, Configuration: PHIDD_CONFIGURATION, ConfigurationLength: ULONG) -> BOOLEAN --- - HidD_GetFeature :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- - HidD_SetFeature :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- - HidD_GetInputReport :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- - HidD_SetOutputReport :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- - HidD_GetNumInputBuffers :: proc(HidDeviceObject: HANDLE, NumberBuffers: PULONG) -> BOOLEAN --- - HidD_SetNumInputBuffers :: proc(HidDeviceObject: HANDLE, NumberBuffers: ULONG) -> BOOLEAN --- + HidD_GetAttributes :: proc(HidDeviceObject: HANDLE, Attributes: PHIDD_ATTRIBUTES) -> BOOLEAN --- + HidD_GetHidGuid :: proc(HidGuid: LPGUID) --- + HidD_GetPreparsedData :: proc(HidDeviceObject: HANDLE, PreparsedData: ^PHIDP_PREPARSED_DATA) -> BOOLEAN --- + HidD_FreePreparsedData :: proc(PreparsedData: PHIDP_PREPARSED_DATA) -> BOOLEAN --- + HidD_FlushQueue :: proc(HidDeviceObject: HANDLE) -> BOOLEAN --- + HidD_GetConfiguration :: proc(HidDeviceObject: HANDLE, Configuration: PHIDD_CONFIGURATION, ConfigurationLength: ULONG) -> BOOLEAN --- + HidD_SetConfiguration :: proc(HidDeviceObject: HANDLE, Configuration: PHIDD_CONFIGURATION, ConfigurationLength: ULONG) -> BOOLEAN --- + HidD_GetFeature :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- + HidD_SetFeature :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- + HidD_GetInputReport :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- + HidD_SetOutputReport :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- + HidD_GetNumInputBuffers :: proc(HidDeviceObject: HANDLE, NumberBuffers: PULONG) -> BOOLEAN --- + HidD_SetNumInputBuffers :: proc(HidDeviceObject: HANDLE, NumberBuffers: ULONG) -> BOOLEAN --- HidD_GetPhysicalDescriptor :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- HidD_GetManufacturerString :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- - HidD_GetProductString :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- - HidD_GetIndexedString :: proc(HidDeviceObject: HANDLE, StringIndex: ULONG, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- + HidD_GetProductString :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- + HidD_GetIndexedString :: proc(HidDeviceObject: HANDLE, StringIndex: ULONG, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- HidD_GetSerialNumberString :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- - HidD_GetMsGenreDescriptor :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- + HidD_GetMsGenreDescriptor :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- } diff --git a/core/sys/windows/hidusage.odin b/core/sys/windows/hidusage.odin index eb2a85f2e..5f87bea2d 100644 --- a/core/sys/windows/hidusage.odin +++ b/core/sys/windows/hidusage.odin @@ -4,260 +4,260 @@ package sys_windows USAGE :: distinct USHORT PUSAGE :: ^USAGE -HID_USAGE_PAGE_UNDEFINED :: 0x00 -HID_USAGE_PAGE_GENERIC :: 0x01 -HID_USAGE_PAGE_SIMULATION :: 0x02 -HID_USAGE_PAGE_VR :: 0x03 -HID_USAGE_PAGE_SPORT :: 0x04 -HID_USAGE_PAGE_GAME :: 0x05 -HID_USAGE_PAGE_GENERIC_DEVICE :: 0x06 -HID_USAGE_PAGE_KEYBOARD :: 0x07 -HID_USAGE_PAGE_LED :: 0x08 -HID_USAGE_PAGE_BUTTON :: 0x09 -HID_USAGE_PAGE_ORDINAL :: 0x0A -HID_USAGE_PAGE_TELEPHONY :: 0x0B -HID_USAGE_PAGE_CONSUMER :: 0x0C -HID_USAGE_PAGE_DIGITIZER :: 0x0D -HID_USAGE_PAGE_HAPTICS :: 0x0E -HID_USAGE_PAGE_PID :: 0x0F -HID_USAGE_PAGE_UNICODE :: 0x10 -HID_USAGE_PAGE_ALPHANUMERIC :: 0x14 -HID_USAGE_PAGE_SENSOR :: 0x20 -HID_USAGE_PAGE_LIGHTING_ILLUMINATION :: 0x59 -HID_USAGE_PAGE_BARCODE_SCANNER :: 0x8C -HID_USAGE_PAGE_WEIGHING_DEVICE :: 0x8D -HID_USAGE_PAGE_MAGNETIC_STRIPE_READER :: 0x8E -HID_USAGE_PAGE_CAMERA_CONTROL :: 0x90 -HID_USAGE_PAGE_ARCADE :: 0x91 +HID_USAGE_PAGE_UNDEFINED :: 0x00 +HID_USAGE_PAGE_GENERIC :: 0x01 +HID_USAGE_PAGE_SIMULATION :: 0x02 +HID_USAGE_PAGE_VR :: 0x03 +HID_USAGE_PAGE_SPORT :: 0x04 +HID_USAGE_PAGE_GAME :: 0x05 +HID_USAGE_PAGE_GENERIC_DEVICE :: 0x06 +HID_USAGE_PAGE_KEYBOARD :: 0x07 +HID_USAGE_PAGE_LED :: 0x08 +HID_USAGE_PAGE_BUTTON :: 0x09 +HID_USAGE_PAGE_ORDINAL :: 0x0A +HID_USAGE_PAGE_TELEPHONY :: 0x0B +HID_USAGE_PAGE_CONSUMER :: 0x0C +HID_USAGE_PAGE_DIGITIZER :: 0x0D +HID_USAGE_PAGE_HAPTICS :: 0x0E +HID_USAGE_PAGE_PID :: 0x0F +HID_USAGE_PAGE_UNICODE :: 0x10 +HID_USAGE_PAGE_ALPHANUMERIC :: 0x14 +HID_USAGE_PAGE_SENSOR :: 0x20 +HID_USAGE_PAGE_LIGHTING_ILLUMINATION :: 0x59 +HID_USAGE_PAGE_BARCODE_SCANNER :: 0x8C +HID_USAGE_PAGE_WEIGHING_DEVICE :: 0x8D +HID_USAGE_PAGE_MAGNETIC_STRIPE_READER :: 0x8E +HID_USAGE_PAGE_CAMERA_CONTROL :: 0x90 +HID_USAGE_PAGE_ARCADE :: 0x91 HID_USAGE_PAGE_MICROSOFT_BLUETOOTH_HANDSFREE :: 0xFFF3 -HID_USAGE_PAGE_VENDOR_DEFINED_BEGIN :: 0xFF00 -HID_USAGE_PAGE_VENDOR_DEFINED_END :: 0xFFFF +HID_USAGE_PAGE_VENDOR_DEFINED_BEGIN :: 0xFF00 +HID_USAGE_PAGE_VENDOR_DEFINED_END :: 0xFFFF -HID_USAGE_GENERIC_POINTER :: 0x01 -HID_USAGE_GENERIC_MOUSE :: 0x02 -HID_USAGE_GENERIC_JOYSTICK :: 0x04 -HID_USAGE_GENERIC_GAMEPAD :: 0x05 -HID_USAGE_GENERIC_KEYBOARD :: 0x06 -HID_USAGE_GENERIC_KEYPAD :: 0x07 -HID_USAGE_GENERIC_MULTI_AXIS_CONTROLLER :: 0x08 -HID_USAGE_GENERIC_TABLET_PC_SYSTEM_CTL :: 0x09 +HID_USAGE_GENERIC_POINTER :: 0x01 +HID_USAGE_GENERIC_MOUSE :: 0x02 +HID_USAGE_GENERIC_JOYSTICK :: 0x04 +HID_USAGE_GENERIC_GAMEPAD :: 0x05 +HID_USAGE_GENERIC_KEYBOARD :: 0x06 +HID_USAGE_GENERIC_KEYPAD :: 0x07 +HID_USAGE_GENERIC_MULTI_AXIS_CONTROLLER :: 0x08 +HID_USAGE_GENERIC_TABLET_PC_SYSTEM_CTL :: 0x09 HID_USAGE_GENERIC_PORTABLE_DEVICE_CONTROL :: 0x0D -HID_USAGE_GENERIC_INTERACTIVE_CONTROL :: 0x0E -HID_USAGE_GENERIC_SYSTEM_CTL :: 0x80 +HID_USAGE_GENERIC_INTERACTIVE_CONTROL :: 0x0E +HID_USAGE_GENERIC_SYSTEM_CTL :: 0x80 -HID_USAGE_GENERIC_X :: 0x30 -HID_USAGE_GENERIC_Y :: 0x31 -HID_USAGE_GENERIC_Z :: 0x32 -HID_USAGE_GENERIC_RX :: 0x33 -HID_USAGE_GENERIC_RY :: 0x34 -HID_USAGE_GENERIC_RZ :: 0x35 -HID_USAGE_GENERIC_SLIDER :: 0x36 -HID_USAGE_GENERIC_DIAL :: 0x37 -HID_USAGE_GENERIC_WHEEL :: 0x38 -HID_USAGE_GENERIC_HATSWITCH :: 0x39 -HID_USAGE_GENERIC_COUNTED_BUFFER :: 0x3A -HID_USAGE_GENERIC_BYTE_COUNT :: 0x3B -HID_USAGE_GENERIC_MOTION_WAKEUP :: 0x3C -HID_USAGE_GENERIC_START :: 0x3D -HID_USAGE_GENERIC_SELECT :: 0x3E -HID_USAGE_GENERIC_VX :: 0x40 -HID_USAGE_GENERIC_VY :: 0x41 -HID_USAGE_GENERIC_VZ :: 0x42 -HID_USAGE_GENERIC_VBRX :: 0x43 -HID_USAGE_GENERIC_VBRY :: 0x44 -HID_USAGE_GENERIC_VBRZ :: 0x45 -HID_USAGE_GENERIC_VNO :: 0x46 -HID_USAGE_GENERIC_FEATURE_NOTIFICATION :: 0x47 -HID_USAGE_GENERIC_RESOLUTION_MULTIPLIER :: 0x48 -HID_USAGE_GENERIC_SYSCTL_POWER :: 0x81 -HID_USAGE_GENERIC_SYSCTL_SLEEP :: 0x82 -HID_USAGE_GENERIC_SYSCTL_WAKE :: 0x83 -HID_USAGE_GENERIC_SYSCTL_CONTEXT_MENU :: 0x84 -HID_USAGE_GENERIC_SYSCTL_MAIN_MENU :: 0x85 -HID_USAGE_GENERIC_SYSCTL_APP_MENU :: 0x86 -HID_USAGE_GENERIC_SYSCTL_HELP_MENU :: 0x87 -HID_USAGE_GENERIC_SYSCTL_MENU_EXIT :: 0x88 -HID_USAGE_GENERIC_SYSCTL_MENU_SELECT :: 0x89 -HID_USAGE_GENERIC_SYSCTL_MENU_RIGHT :: 0x8A -HID_USAGE_GENERIC_SYSCTL_MENU_LEFT :: 0x8B -HID_USAGE_GENERIC_SYSCTL_MENU_UP :: 0x8C -HID_USAGE_GENERIC_SYSCTL_MENU_DOWN :: 0x8D -HID_USAGE_GENERIC_SYSCTL_COLD_RESTART :: 0x8E -HID_USAGE_GENERIC_SYSCTL_WARM_RESTART :: 0x8F -HID_USAGE_GENERIC_DPAD_UP :: 0x90 -HID_USAGE_GENERIC_DPAD_DOWN :: 0x91 -HID_USAGE_GENERIC_DPAD_RIGHT :: 0x92 -HID_USAGE_GENERIC_DPAD_LEFT :: 0x93 -HID_USAGE_GENERIC_SYSCTL_FN :: 0x97 -HID_USAGE_GENERIC_SYSCTL_FN_LOCK :: 0x98 -HID_USAGE_GENERIC_SYSCTL_FN_LOCK_INDICATOR :: 0x99 -HID_USAGE_GENERIC_SYSCTL_DISMISS_NOTIFICATION :: 0x9A -HID_USAGE_GENERIC_SYSCTL_DOCK :: 0xA0 -HID_USAGE_GENERIC_SYSCTL_UNDOCK :: 0xA1 -HID_USAGE_GENERIC_SYSCTL_SETUP :: 0xA2 -HID_USAGE_GENERIC_SYSCTL_SYS_BREAK :: 0xA3 -HID_USAGE_GENERIC_SYSCTL_SYS_DBG_BREAK :: 0xA4 -HID_USAGE_GENERIC_SYSCTL_APP_BREAK :: 0xA5 -HID_USAGE_GENERIC_SYSCTL_APP_DBG_BREAK :: 0xA6 -HID_USAGE_GENERIC_SYSCTL_MUTE :: 0xA7 -HID_USAGE_GENERIC_SYSCTL_HIBERNATE :: 0xA8 -HID_USAGE_GENERIC_SYSCTL_DISP_INVERT :: 0xB0 -HID_USAGE_GENERIC_SYSCTL_DISP_INTERNAL :: 0xB1 -HID_USAGE_GENERIC_SYSCTL_DISP_EXTERNAL :: 0xB2 -HID_USAGE_GENERIC_SYSCTL_DISP_BOTH :: 0xB3 -HID_USAGE_GENERIC_SYSCTL_DISP_DUAL :: 0xB4 -HID_USAGE_GENERIC_SYSCTL_DISP_TOGGLE :: 0xB5 -HID_USAGE_GENERIC_SYSCTL_DISP_SWAP :: 0xB6 -HID_USAGE_GENERIC_SYSCTL_DISP_AUTOSCALE :: 0xB7 -HID_USAGE_GENERIC_SYSTEM_DISPLAY_ROTATION_LOCK_BUTTON :: 0xC9 +HID_USAGE_GENERIC_X :: 0x30 +HID_USAGE_GENERIC_Y :: 0x31 +HID_USAGE_GENERIC_Z :: 0x32 +HID_USAGE_GENERIC_RX :: 0x33 +HID_USAGE_GENERIC_RY :: 0x34 +HID_USAGE_GENERIC_RZ :: 0x35 +HID_USAGE_GENERIC_SLIDER :: 0x36 +HID_USAGE_GENERIC_DIAL :: 0x37 +HID_USAGE_GENERIC_WHEEL :: 0x38 +HID_USAGE_GENERIC_HATSWITCH :: 0x39 +HID_USAGE_GENERIC_COUNTED_BUFFER :: 0x3A +HID_USAGE_GENERIC_BYTE_COUNT :: 0x3B +HID_USAGE_GENERIC_MOTION_WAKEUP :: 0x3C +HID_USAGE_GENERIC_START :: 0x3D +HID_USAGE_GENERIC_SELECT :: 0x3E +HID_USAGE_GENERIC_VX :: 0x40 +HID_USAGE_GENERIC_VY :: 0x41 +HID_USAGE_GENERIC_VZ :: 0x42 +HID_USAGE_GENERIC_VBRX :: 0x43 +HID_USAGE_GENERIC_VBRY :: 0x44 +HID_USAGE_GENERIC_VBRZ :: 0x45 +HID_USAGE_GENERIC_VNO :: 0x46 +HID_USAGE_GENERIC_FEATURE_NOTIFICATION :: 0x47 +HID_USAGE_GENERIC_RESOLUTION_MULTIPLIER :: 0x48 +HID_USAGE_GENERIC_SYSCTL_POWER :: 0x81 +HID_USAGE_GENERIC_SYSCTL_SLEEP :: 0x82 +HID_USAGE_GENERIC_SYSCTL_WAKE :: 0x83 +HID_USAGE_GENERIC_SYSCTL_CONTEXT_MENU :: 0x84 +HID_USAGE_GENERIC_SYSCTL_MAIN_MENU :: 0x85 +HID_USAGE_GENERIC_SYSCTL_APP_MENU :: 0x86 +HID_USAGE_GENERIC_SYSCTL_HELP_MENU :: 0x87 +HID_USAGE_GENERIC_SYSCTL_MENU_EXIT :: 0x88 +HID_USAGE_GENERIC_SYSCTL_MENU_SELECT :: 0x89 +HID_USAGE_GENERIC_SYSCTL_MENU_RIGHT :: 0x8A +HID_USAGE_GENERIC_SYSCTL_MENU_LEFT :: 0x8B +HID_USAGE_GENERIC_SYSCTL_MENU_UP :: 0x8C +HID_USAGE_GENERIC_SYSCTL_MENU_DOWN :: 0x8D +HID_USAGE_GENERIC_SYSCTL_COLD_RESTART :: 0x8E +HID_USAGE_GENERIC_SYSCTL_WARM_RESTART :: 0x8F +HID_USAGE_GENERIC_DPAD_UP :: 0x90 +HID_USAGE_GENERIC_DPAD_DOWN :: 0x91 +HID_USAGE_GENERIC_DPAD_RIGHT :: 0x92 +HID_USAGE_GENERIC_DPAD_LEFT :: 0x93 +HID_USAGE_GENERIC_SYSCTL_FN :: 0x97 +HID_USAGE_GENERIC_SYSCTL_FN_LOCK :: 0x98 +HID_USAGE_GENERIC_SYSCTL_FN_LOCK_INDICATOR :: 0x99 +HID_USAGE_GENERIC_SYSCTL_DISMISS_NOTIFICATION :: 0x9A +HID_USAGE_GENERIC_SYSCTL_DOCK :: 0xA0 +HID_USAGE_GENERIC_SYSCTL_UNDOCK :: 0xA1 +HID_USAGE_GENERIC_SYSCTL_SETUP :: 0xA2 +HID_USAGE_GENERIC_SYSCTL_SYS_BREAK :: 0xA3 +HID_USAGE_GENERIC_SYSCTL_SYS_DBG_BREAK :: 0xA4 +HID_USAGE_GENERIC_SYSCTL_APP_BREAK :: 0xA5 +HID_USAGE_GENERIC_SYSCTL_APP_DBG_BREAK :: 0xA6 +HID_USAGE_GENERIC_SYSCTL_MUTE :: 0xA7 +HID_USAGE_GENERIC_SYSCTL_HIBERNATE :: 0xA8 +HID_USAGE_GENERIC_SYSCTL_DISP_INVERT :: 0xB0 +HID_USAGE_GENERIC_SYSCTL_DISP_INTERNAL :: 0xB1 +HID_USAGE_GENERIC_SYSCTL_DISP_EXTERNAL :: 0xB2 +HID_USAGE_GENERIC_SYSCTL_DISP_BOTH :: 0xB3 +HID_USAGE_GENERIC_SYSCTL_DISP_DUAL :: 0xB4 +HID_USAGE_GENERIC_SYSCTL_DISP_TOGGLE :: 0xB5 +HID_USAGE_GENERIC_SYSCTL_DISP_SWAP :: 0xB6 +HID_USAGE_GENERIC_SYSCTL_DISP_AUTOSCALE :: 0xB7 +HID_USAGE_GENERIC_SYSTEM_DISPLAY_ROTATION_LOCK_BUTTON :: 0xC9 HID_USAGE_GENERIC_SYSTEM_DISPLAY_ROTATION_LOCK_SLIDER_SWITCH :: 0xCA -HID_USAGE_GENERIC_CONTROL_ENABLE :: 0xCB +HID_USAGE_GENERIC_CONTROL_ENABLE :: 0xCB -HID_USAGE_SIMULATION_FLIGHT_SIMULATION_DEVICE :: 0x01 -HID_USAGE_SIMULATION_AUTOMOBILE_SIMULATION_DEVICE :: 0x02 -HID_USAGE_SIMULATION_TANK_SIMULATION_DEVICE :: 0x03 -HID_USAGE_SIMULATION_SPACESHIP_SIMULATION_DEVICE :: 0x04 -HID_USAGE_SIMULATION_SUBMARINE_SIMULATION_DEVICE :: 0x05 -HID_USAGE_SIMULATION_SAILING_SIMULATION_DEVICE :: 0x06 -HID_USAGE_SIMULATION_MOTORCYCLE_SIMULATION_DEVICE :: 0x07 -HID_USAGE_SIMULATION_SPORTS_SIMULATION_DEVICE :: 0x08 -HID_USAGE_SIMULATION_AIRPLANE_SIMULATION_DEVICE :: 0x09 -HID_USAGE_SIMULATION_HELICOPTER_SIMULATION_DEVICE :: 0x0A +HID_USAGE_SIMULATION_FLIGHT_SIMULATION_DEVICE :: 0x01 +HID_USAGE_SIMULATION_AUTOMOBILE_SIMULATION_DEVICE :: 0x02 +HID_USAGE_SIMULATION_TANK_SIMULATION_DEVICE :: 0x03 +HID_USAGE_SIMULATION_SPACESHIP_SIMULATION_DEVICE :: 0x04 +HID_USAGE_SIMULATION_SUBMARINE_SIMULATION_DEVICE :: 0x05 +HID_USAGE_SIMULATION_SAILING_SIMULATION_DEVICE :: 0x06 +HID_USAGE_SIMULATION_MOTORCYCLE_SIMULATION_DEVICE :: 0x07 +HID_USAGE_SIMULATION_SPORTS_SIMULATION_DEVICE :: 0x08 +HID_USAGE_SIMULATION_AIRPLANE_SIMULATION_DEVICE :: 0x09 +HID_USAGE_SIMULATION_HELICOPTER_SIMULATION_DEVICE :: 0x0A HID_USAGE_SIMULATION_MAGIC_CARPET_SIMULATION_DEVICE :: 0x0B -HID_USAGE_SIMULATION_BICYCLE_SIMULATION_DEVICE :: 0x0C -HID_USAGE_SIMULATION_FLIGHT_CONTROL_STICK :: 0x20 -HID_USAGE_SIMULATION_FLIGHT_STICK :: 0x21 -HID_USAGE_SIMULATION_CYCLIC_CONTROL :: 0x22 -HID_USAGE_SIMULATION_CYCLIC_TRIM :: 0x23 -HID_USAGE_SIMULATION_FLIGHT_YOKE :: 0x24 -HID_USAGE_SIMULATION_TRACK_CONTROL :: 0x25 +HID_USAGE_SIMULATION_BICYCLE_SIMULATION_DEVICE :: 0x0C +HID_USAGE_SIMULATION_FLIGHT_CONTROL_STICK :: 0x20 +HID_USAGE_SIMULATION_FLIGHT_STICK :: 0x21 +HID_USAGE_SIMULATION_CYCLIC_CONTROL :: 0x22 +HID_USAGE_SIMULATION_CYCLIC_TRIM :: 0x23 +HID_USAGE_SIMULATION_FLIGHT_YOKE :: 0x24 +HID_USAGE_SIMULATION_TRACK_CONTROL :: 0x25 -HID_USAGE_SIMULATION_AILERON :: 0xB0 -HID_USAGE_SIMULATION_AILERON_TRIM :: 0xB1 -HID_USAGE_SIMULATION_ANTI_TORQUE_CONTROL :: 0xB2 -HID_USAGE_SIMULATION_AUTOPIOLOT_ENABLE :: 0xB3 -HID_USAGE_SIMULATION_CHAFF_RELEASE :: 0xB4 -HID_USAGE_SIMULATION_COLLECTIVE_CONTROL :: 0xB5 -HID_USAGE_SIMULATION_DIVE_BRAKE :: 0xB6 +HID_USAGE_SIMULATION_AILERON :: 0xB0 +HID_USAGE_SIMULATION_AILERON_TRIM :: 0xB1 +HID_USAGE_SIMULATION_ANTI_TORQUE_CONTROL :: 0xB2 +HID_USAGE_SIMULATION_AUTOPIOLOT_ENABLE :: 0xB3 +HID_USAGE_SIMULATION_CHAFF_RELEASE :: 0xB4 +HID_USAGE_SIMULATION_COLLECTIVE_CONTROL :: 0xB5 +HID_USAGE_SIMULATION_DIVE_BRAKE :: 0xB6 HID_USAGE_SIMULATION_ELECTRONIC_COUNTERMEASURES :: 0xB7 -HID_USAGE_SIMULATION_ELEVATOR :: 0xB8 -HID_USAGE_SIMULATION_ELEVATOR_TRIM :: 0xB9 -HID_USAGE_SIMULATION_RUDDER :: 0xBA -HID_USAGE_SIMULATION_THROTTLE :: 0xBB -HID_USAGE_SIMULATION_FLIGHT_COMMUNICATIONS :: 0xBC -HID_USAGE_SIMULATION_FLARE_RELEASE :: 0xBD -HID_USAGE_SIMULATION_LANDING_GEAR :: 0xBE -HID_USAGE_SIMULATION_TOE_BRAKE :: 0xBF -HID_USAGE_SIMULATION_TRIGGER :: 0xC0 -HID_USAGE_SIMULATION_WEAPONS_ARM :: 0xC1 -HID_USAGE_SIMULATION_WEAPONS_SELECT :: 0xC2 -HID_USAGE_SIMULATION_WING_FLAPS :: 0xC3 -HID_USAGE_SIMULATION_ACCELLERATOR :: 0xC4 -HID_USAGE_SIMULATION_BRAKE :: 0xC5 -HID_USAGE_SIMULATION_CLUTCH :: 0xC6 -HID_USAGE_SIMULATION_SHIFTER :: 0xC7 -HID_USAGE_SIMULATION_STEERING :: 0xC8 -HID_USAGE_SIMULATION_TURRET_DIRECTION :: 0xC9 -HID_USAGE_SIMULATION_BARREL_ELEVATION :: 0xCA -HID_USAGE_SIMULATION_DIVE_PLANE :: 0xCB -HID_USAGE_SIMULATION_BALLAST :: 0xCC -HID_USAGE_SIMULATION_BICYCLE_CRANK :: 0xCD -HID_USAGE_SIMULATION_HANDLE_BARS :: 0xCE -HID_USAGE_SIMULATION_FRONT_BRAKE :: 0xCF -HID_USAGE_SIMULATION_REAR_BRAKE :: 0xD0 +HID_USAGE_SIMULATION_ELEVATOR :: 0xB8 +HID_USAGE_SIMULATION_ELEVATOR_TRIM :: 0xB9 +HID_USAGE_SIMULATION_RUDDER :: 0xBA +HID_USAGE_SIMULATION_THROTTLE :: 0xBB +HID_USAGE_SIMULATION_FLIGHT_COMMUNICATIONS :: 0xBC +HID_USAGE_SIMULATION_FLARE_RELEASE :: 0xBD +HID_USAGE_SIMULATION_LANDING_GEAR :: 0xBE +HID_USAGE_SIMULATION_TOE_BRAKE :: 0xBF +HID_USAGE_SIMULATION_TRIGGER :: 0xC0 +HID_USAGE_SIMULATION_WEAPONS_ARM :: 0xC1 +HID_USAGE_SIMULATION_WEAPONS_SELECT :: 0xC2 +HID_USAGE_SIMULATION_WING_FLAPS :: 0xC3 +HID_USAGE_SIMULATION_ACCELLERATOR :: 0xC4 +HID_USAGE_SIMULATION_BRAKE :: 0xC5 +HID_USAGE_SIMULATION_CLUTCH :: 0xC6 +HID_USAGE_SIMULATION_SHIFTER :: 0xC7 +HID_USAGE_SIMULATION_STEERING :: 0xC8 +HID_USAGE_SIMULATION_TURRET_DIRECTION :: 0xC9 +HID_USAGE_SIMULATION_BARREL_ELEVATION :: 0xCA +HID_USAGE_SIMULATION_DIVE_PLANE :: 0xCB +HID_USAGE_SIMULATION_BALLAST :: 0xCC +HID_USAGE_SIMULATION_BICYCLE_CRANK :: 0xCD +HID_USAGE_SIMULATION_HANDLE_BARS :: 0xCE +HID_USAGE_SIMULATION_FRONT_BRAKE :: 0xCF +HID_USAGE_SIMULATION_REAR_BRAKE :: 0xD0 -HID_USAGE_VR_BELT :: 0x01 -HID_USAGE_VR_BODY_SUIT :: 0x02 -HID_USAGE_VR_FLEXOR :: 0x03 -HID_USAGE_VR_GLOVE :: 0x04 -HID_USAGE_VR_HEAD_TRACKER :: 0x05 +HID_USAGE_VR_BELT :: 0x01 +HID_USAGE_VR_BODY_SUIT :: 0x02 +HID_USAGE_VR_FLEXOR :: 0x03 +HID_USAGE_VR_GLOVE :: 0x04 +HID_USAGE_VR_HEAD_TRACKER :: 0x05 HID_USAGE_VR_HEAD_MOUNTED_DISPLAY :: 0x06 -HID_USAGE_VR_HAND_TRACKER :: 0x07 -HID_USAGE_VR_OCULOMETER :: 0x08 -HID_USAGE_VR_VEST :: 0x09 -HID_USAGE_VR_ANIMATRONIC_DEVICE :: 0x0A +HID_USAGE_VR_HAND_TRACKER :: 0x07 +HID_USAGE_VR_OCULOMETER :: 0x08 +HID_USAGE_VR_VEST :: 0x09 +HID_USAGE_VR_ANIMATRONIC_DEVICE :: 0x0A -HID_USAGE_VR_STEREO_ENABLE :: 0x20 +HID_USAGE_VR_STEREO_ENABLE :: 0x20 HID_USAGE_VR_DISPLAY_ENABLE :: 0x21 -HID_USAGE_SPORT_BASEBALL_BAT :: 0x01 -HID_USAGE_SPORT_GOLF_CLUB :: 0x02 +HID_USAGE_SPORT_BASEBALL_BAT :: 0x01 +HID_USAGE_SPORT_GOLF_CLUB :: 0x02 HID_USAGE_SPORT_ROWING_MACHINE :: 0x03 -HID_USAGE_SPORT_TREADMILL :: 0x04 -HID_USAGE_SPORT_STICK_TYPE :: 0x38 +HID_USAGE_SPORT_TREADMILL :: 0x04 +HID_USAGE_SPORT_STICK_TYPE :: 0x38 -HID_USAGE_SPORT_OAR :: 0x30 -HID_USAGE_SPORT_SLOPE :: 0x31 -HID_USAGE_SPORT_RATE :: 0x32 -HID_USAGE_SPORT_STICK_SPEED :: 0x33 +HID_USAGE_SPORT_OAR :: 0x30 +HID_USAGE_SPORT_SLOPE :: 0x31 +HID_USAGE_SPORT_RATE :: 0x32 +HID_USAGE_SPORT_STICK_SPEED :: 0x33 HID_USAGE_SPORT_STICK_FACE_ANGLE :: 0x34 -HID_USAGE_SPORT_HEEL_TOE :: 0x35 -HID_USAGE_SPORT_FOLLOW_THROUGH :: 0x36 -HID_USAGE_SPORT_TEMPO :: 0x37 -HID_USAGE_SPORT_HEIGHT :: 0x39 -HID_USAGE_SPORT_PUTTER :: 0x50 -HID_USAGE_SPORT_1_IRON :: 0x51 -HID_USAGE_SPORT_2_IRON :: 0x52 -HID_USAGE_SPORT_3_IRON :: 0x53 -HID_USAGE_SPORT_4_IRON :: 0x54 -HID_USAGE_SPORT_5_IRON :: 0x55 -HID_USAGE_SPORT_6_IRON :: 0x56 -HID_USAGE_SPORT_7_IRON :: 0x57 -HID_USAGE_SPORT_8_IRON :: 0x58 -HID_USAGE_SPORT_9_IRON :: 0x59 -HID_USAGE_SPORT_10_IRON :: 0x5A -HID_USAGE_SPORT_11_IRON :: 0x5B -HID_USAGE_SPORT_SAND_WEDGE :: 0x5C -HID_USAGE_SPORT_LOFT_WEDGE :: 0x5D -HID_USAGE_SPORT_POWER_WEDGE :: 0x5E -HID_USAGE_SPORT_1_WOOD :: 0x5F -HID_USAGE_SPORT_3_WOOD :: 0x60 -HID_USAGE_SPORT_5_WOOD :: 0x61 -HID_USAGE_SPORT_7_WOOD :: 0x62 -HID_USAGE_SPORT_9_WOOD :: 0x63 +HID_USAGE_SPORT_HEEL_TOE :: 0x35 +HID_USAGE_SPORT_FOLLOW_THROUGH :: 0x36 +HID_USAGE_SPORT_TEMPO :: 0x37 +HID_USAGE_SPORT_HEIGHT :: 0x39 +HID_USAGE_SPORT_PUTTER :: 0x50 +HID_USAGE_SPORT_1_IRON :: 0x51 +HID_USAGE_SPORT_2_IRON :: 0x52 +HID_USAGE_SPORT_3_IRON :: 0x53 +HID_USAGE_SPORT_4_IRON :: 0x54 +HID_USAGE_SPORT_5_IRON :: 0x55 +HID_USAGE_SPORT_6_IRON :: 0x56 +HID_USAGE_SPORT_7_IRON :: 0x57 +HID_USAGE_SPORT_8_IRON :: 0x58 +HID_USAGE_SPORT_9_IRON :: 0x59 +HID_USAGE_SPORT_10_IRON :: 0x5A +HID_USAGE_SPORT_11_IRON :: 0x5B +HID_USAGE_SPORT_SAND_WEDGE :: 0x5C +HID_USAGE_SPORT_LOFT_WEDGE :: 0x5D +HID_USAGE_SPORT_POWER_WEDGE :: 0x5E +HID_USAGE_SPORT_1_WOOD :: 0x5F +HID_USAGE_SPORT_3_WOOD :: 0x60 +HID_USAGE_SPORT_5_WOOD :: 0x61 +HID_USAGE_SPORT_7_WOOD :: 0x62 +HID_USAGE_SPORT_9_WOOD :: 0x63 HID_USAGE_GAME_3D_GAME_CONTROLLER :: 0x01 -HID_USAGE_GAME_PINBALL_DEVICE :: 0x02 -HID_USAGE_GAME_GUN_DEVICE :: 0x03 -HID_USAGE_GAME_POINT_OF_VIEW :: 0x20 -HID_USAGE_GAME_GUN_SELECTOR :: 0x32 -HID_USAGE_GAME_GAMEPAD_FIRE_JUMP :: 0x37 -HID_USAGE_GAME_GAMEPAD_TRIGGER :: 0x39 +HID_USAGE_GAME_PINBALL_DEVICE :: 0x02 +HID_USAGE_GAME_GUN_DEVICE :: 0x03 +HID_USAGE_GAME_POINT_OF_VIEW :: 0x20 +HID_USAGE_GAME_GUN_SELECTOR :: 0x32 +HID_USAGE_GAME_GAMEPAD_FIRE_JUMP :: 0x37 +HID_USAGE_GAME_GAMEPAD_TRIGGER :: 0x39 -HID_USAGE_GAME_TURN_RIGHT_LEFT :: 0x21 +HID_USAGE_GAME_TURN_RIGHT_LEFT :: 0x21 HID_USAGE_GAME_PITCH_FORWARD_BACK :: 0x22 -HID_USAGE_GAME_ROLL_RIGHT_LEFT :: 0x23 -HID_USAGE_GAME_MOVE_RIGHT_LEFT :: 0x24 -HID_USAGE_GAME_MOVE_FORWARD_BACK :: 0x25 -HID_USAGE_GAME_MOVE_UP_DOWN :: 0x26 -HID_USAGE_GAME_LEAN_RIGHT_LEFT :: 0x27 -HID_USAGE_GAME_LEAN_FORWARD_BACK :: 0x28 -HID_USAGE_GAME_POV_HEIGHT :: 0x29 -HID_USAGE_GAME_FLIPPER :: 0x2A -HID_USAGE_GAME_SECONDARY_FLIPPER :: 0x2B -HID_USAGE_GAME_BUMP :: 0x2C -HID_USAGE_GAME_NEW_GAME :: 0x2D -HID_USAGE_GAME_SHOOT_BALL :: 0x2E -HID_USAGE_GAME_PLAYER :: 0x2F -HID_USAGE_GAME_GUN_BOLT :: 0x30 -HID_USAGE_GAME_GUN_CLIP :: 0x31 -HID_USAGE_GAME_GUN_SINGLE_SHOT :: 0x33 -HID_USAGE_GAME_GUN_BURST :: 0x34 -HID_USAGE_GAME_GUN_AUTOMATIC :: 0x35 -HID_USAGE_GAME_GUN_SAFETY :: 0x36 +HID_USAGE_GAME_ROLL_RIGHT_LEFT :: 0x23 +HID_USAGE_GAME_MOVE_RIGHT_LEFT :: 0x24 +HID_USAGE_GAME_MOVE_FORWARD_BACK :: 0x25 +HID_USAGE_GAME_MOVE_UP_DOWN :: 0x26 +HID_USAGE_GAME_LEAN_RIGHT_LEFT :: 0x27 +HID_USAGE_GAME_LEAN_FORWARD_BACK :: 0x28 +HID_USAGE_GAME_POV_HEIGHT :: 0x29 +HID_USAGE_GAME_FLIPPER :: 0x2A +HID_USAGE_GAME_SECONDARY_FLIPPER :: 0x2B +HID_USAGE_GAME_BUMP :: 0x2C +HID_USAGE_GAME_NEW_GAME :: 0x2D +HID_USAGE_GAME_SHOOT_BALL :: 0x2E +HID_USAGE_GAME_PLAYER :: 0x2F +HID_USAGE_GAME_GUN_BOLT :: 0x30 +HID_USAGE_GAME_GUN_CLIP :: 0x31 +HID_USAGE_GAME_GUN_SINGLE_SHOT :: 0x33 +HID_USAGE_GAME_GUN_BURST :: 0x34 +HID_USAGE_GAME_GUN_AUTOMATIC :: 0x35 +HID_USAGE_GAME_GUN_SAFETY :: 0x36 -HID_USAGE_GENERIC_DEVICE_BATTERY_STRENGTH :: 0x20 -HID_USAGE_GENERIC_DEVICE_WIRELESS_CHANNEL :: 0x21 -HID_USAGE_GENERIC_DEVICE_WIRELESS_ID :: 0x22 -HID_USAGE_GENERIC_DEVICE_DISCOVER_WIRELESS_CONTROL :: 0x23 +HID_USAGE_GENERIC_DEVICE_BATTERY_STRENGTH :: 0x20 +HID_USAGE_GENERIC_DEVICE_WIRELESS_CHANNEL :: 0x21 +HID_USAGE_GENERIC_DEVICE_WIRELESS_ID :: 0x22 +HID_USAGE_GENERIC_DEVICE_DISCOVER_WIRELESS_CONTROL :: 0x23 HID_USAGE_GENERIC_DEVICE_SECURITY_CODE_CHAR_ENTERED :: 0x24 -HID_USAGE_GENERIC_DEVICE_SECURITY_CODE_CHAR_ERASED :: 0x25 -HID_USAGE_GENERIC_DEVICE_SECURITY_CODE_CLEARED :: 0x26 +HID_USAGE_GENERIC_DEVICE_SECURITY_CODE_CHAR_ERASED :: 0x25 +HID_USAGE_GENERIC_DEVICE_SECURITY_CODE_CLEARED :: 0x26 // Error "keys" -HID_USAGE_KEYBOARD_NOEVENT :: 0x00 -HID_USAGE_KEYBOARD_ROLLOVER :: 0x01 -HID_USAGE_KEYBOARD_POSTFAIL :: 0x02 +HID_USAGE_KEYBOARD_NOEVENT :: 0x00 +HID_USAGE_KEYBOARD_ROLLOVER :: 0x01 +HID_USAGE_KEYBOARD_POSTFAIL :: 0x02 HID_USAGE_KEYBOARD_UNDEFINED :: 0x03 // Letters @@ -265,32 +265,32 @@ HID_USAGE_KEYBOARD_aA :: 0x04 HID_USAGE_KEYBOARD_zZ :: 0x1D // Numbers -HID_USAGE_KEYBOARD_ONE :: 0x1E +HID_USAGE_KEYBOARD_ONE :: 0x1E HID_USAGE_KEYBOARD_ZERO :: 0x27 // Modifier Keys -HID_USAGE_KEYBOARD_LCTRL :: 0xE0 -HID_USAGE_KEYBOARD_LSHFT :: 0xE1 -HID_USAGE_KEYBOARD_LALT :: 0xE2 -HID_USAGE_KEYBOARD_LGUI :: 0xE3 -HID_USAGE_KEYBOARD_RCTRL :: 0xE4 -HID_USAGE_KEYBOARD_RSHFT :: 0xE5 -HID_USAGE_KEYBOARD_RALT :: 0xE6 -HID_USAGE_KEYBOARD_RGUI :: 0xE7 +HID_USAGE_KEYBOARD_LCTRL :: 0xE0 +HID_USAGE_KEYBOARD_LSHFT :: 0xE1 +HID_USAGE_KEYBOARD_LALT :: 0xE2 +HID_USAGE_KEYBOARD_LGUI :: 0xE3 +HID_USAGE_KEYBOARD_RCTRL :: 0xE4 +HID_USAGE_KEYBOARD_RSHFT :: 0xE5 +HID_USAGE_KEYBOARD_RALT :: 0xE6 +HID_USAGE_KEYBOARD_RGUI :: 0xE7 HID_USAGE_KEYBOARD_SCROLL_LOCK :: 0x47 -HID_USAGE_KEYBOARD_NUM_LOCK :: 0x53 -HID_USAGE_KEYBOARD_CAPS_LOCK :: 0x39 +HID_USAGE_KEYBOARD_NUM_LOCK :: 0x53 +HID_USAGE_KEYBOARD_CAPS_LOCK :: 0x39 // Function keys -HID_USAGE_KEYBOARD_F1 :: 0x3A -HID_USAGE_KEYBOARD_F2 :: 0x3B -HID_USAGE_KEYBOARD_F3 :: 0x3C -HID_USAGE_KEYBOARD_F4 :: 0x3D -HID_USAGE_KEYBOARD_F5 :: 0x3E -HID_USAGE_KEYBOARD_F6 :: 0x3F -HID_USAGE_KEYBOARD_F7 :: 0x40 -HID_USAGE_KEYBOARD_F8 :: 0x41 -HID_USAGE_KEYBOARD_F9 :: 0x42 +HID_USAGE_KEYBOARD_F1 :: 0x3A +HID_USAGE_KEYBOARD_F2 :: 0x3B +HID_USAGE_KEYBOARD_F3 :: 0x3C +HID_USAGE_KEYBOARD_F4 :: 0x3D +HID_USAGE_KEYBOARD_F5 :: 0x3E +HID_USAGE_KEYBOARD_F6 :: 0x3F +HID_USAGE_KEYBOARD_F7 :: 0x40 +HID_USAGE_KEYBOARD_F8 :: 0x41 +HID_USAGE_KEYBOARD_F9 :: 0x42 HID_USAGE_KEYBOARD_F10 :: 0x43 HID_USAGE_KEYBOARD_F11 :: 0x44 HID_USAGE_KEYBOARD_F12 :: 0x45 @@ -315,103 +315,103 @@ HID_USAGE_KEYBOARD_PRINT_SCREEN :: 0x46 HID_USAGE_KEYBOARD_DELETE_FORWARD :: 0x4C // Numeric Keypad -HID_USAGE_KEYBOARD_KEYPAD_1_AND_END :: 0x59 +HID_USAGE_KEYBOARD_KEYPAD_1_AND_END :: 0x59 HID_USAGE_KEYBOARD_KEYPAD_0_AND_INSERT :: 0x62 -HID_USAGE_LED_NUM_LOCK :: 0x01 -HID_USAGE_LED_CAPS_LOCK :: 0x02 -HID_USAGE_LED_SCROLL_LOCK :: 0x03 -HID_USAGE_LED_COMPOSE :: 0x04 -HID_USAGE_LED_KANA :: 0x05 -HID_USAGE_LED_POWER :: 0x06 -HID_USAGE_LED_SHIFT :: 0x07 -HID_USAGE_LED_DO_NOT_DISTURB :: 0x08 -HID_USAGE_LED_MUTE :: 0x09 -HID_USAGE_LED_TONE_ENABLE :: 0x0A -HID_USAGE_LED_HIGH_CUT_FILTER :: 0x0B -HID_USAGE_LED_LOW_CUT_FILTER :: 0x0C -HID_USAGE_LED_EQUALIZER_ENABLE :: 0x0D -HID_USAGE_LED_SOUND_FIELD_ON :: 0x0E -HID_USAGE_LED_SURROUND_FIELD_ON :: 0x0F -HID_USAGE_LED_REPEAT :: 0x10 -HID_USAGE_LED_STEREO :: 0x11 +HID_USAGE_LED_NUM_LOCK :: 0x01 +HID_USAGE_LED_CAPS_LOCK :: 0x02 +HID_USAGE_LED_SCROLL_LOCK :: 0x03 +HID_USAGE_LED_COMPOSE :: 0x04 +HID_USAGE_LED_KANA :: 0x05 +HID_USAGE_LED_POWER :: 0x06 +HID_USAGE_LED_SHIFT :: 0x07 +HID_USAGE_LED_DO_NOT_DISTURB :: 0x08 +HID_USAGE_LED_MUTE :: 0x09 +HID_USAGE_LED_TONE_ENABLE :: 0x0A +HID_USAGE_LED_HIGH_CUT_FILTER :: 0x0B +HID_USAGE_LED_LOW_CUT_FILTER :: 0x0C +HID_USAGE_LED_EQUALIZER_ENABLE :: 0x0D +HID_USAGE_LED_SOUND_FIELD_ON :: 0x0E +HID_USAGE_LED_SURROUND_FIELD_ON :: 0x0F +HID_USAGE_LED_REPEAT :: 0x10 +HID_USAGE_LED_STEREO :: 0x11 HID_USAGE_LED_SAMPLING_RATE_DETECT :: 0x12 -HID_USAGE_LED_SPINNING :: 0x13 -HID_USAGE_LED_CAV :: 0x14 -HID_USAGE_LED_CLV :: 0x15 +HID_USAGE_LED_SPINNING :: 0x13 +HID_USAGE_LED_CAV :: 0x14 +HID_USAGE_LED_CLV :: 0x15 HID_USAGE_LED_RECORDING_FORMAT_DET :: 0x16 -HID_USAGE_LED_OFF_HOOK :: 0x17 -HID_USAGE_LED_RING :: 0x18 -HID_USAGE_LED_MESSAGE_WAITING :: 0x19 -HID_USAGE_LED_DATA_MODE :: 0x1A -HID_USAGE_LED_BATTERY_OPERATION :: 0x1B -HID_USAGE_LED_BATTERY_OK :: 0x1C -HID_USAGE_LED_BATTERY_LOW :: 0x1D -HID_USAGE_LED_SPEAKER :: 0x1E -HID_USAGE_LED_HEAD_SET :: 0x1F -HID_USAGE_LED_HOLD :: 0x20 -HID_USAGE_LED_MICROPHONE :: 0x21 -HID_USAGE_LED_COVERAGE :: 0x22 -HID_USAGE_LED_NIGHT_MODE :: 0x23 -HID_USAGE_LED_SEND_CALLS :: 0x24 -HID_USAGE_LED_CALL_PICKUP :: 0x25 -HID_USAGE_LED_CONFERENCE :: 0x26 -HID_USAGE_LED_STAND_BY :: 0x27 -HID_USAGE_LED_CAMERA_ON :: 0x28 -HID_USAGE_LED_CAMERA_OFF :: 0x29 -HID_USAGE_LED_ON_LINE :: 0x2A -HID_USAGE_LED_OFF_LINE :: 0x2B -HID_USAGE_LED_BUSY :: 0x2C -HID_USAGE_LED_READY :: 0x2D -HID_USAGE_LED_PAPER_OUT :: 0x2E -HID_USAGE_LED_PAPER_JAM :: 0x2F -HID_USAGE_LED_REMOTE :: 0x30 -HID_USAGE_LED_FORWARD :: 0x31 -HID_USAGE_LED_REVERSE :: 0x32 -HID_USAGE_LED_STOP :: 0x33 -HID_USAGE_LED_REWIND :: 0x34 -HID_USAGE_LED_FAST_FORWARD :: 0x35 -HID_USAGE_LED_PLAY :: 0x36 -HID_USAGE_LED_PAUSE :: 0x37 -HID_USAGE_LED_RECORD :: 0x38 -HID_USAGE_LED_ERROR :: 0x39 -HID_USAGE_LED_SELECTED_INDICATOR :: 0x3A -HID_USAGE_LED_IN_USE_INDICATOR :: 0x3B +HID_USAGE_LED_OFF_HOOK :: 0x17 +HID_USAGE_LED_RING :: 0x18 +HID_USAGE_LED_MESSAGE_WAITING :: 0x19 +HID_USAGE_LED_DATA_MODE :: 0x1A +HID_USAGE_LED_BATTERY_OPERATION :: 0x1B +HID_USAGE_LED_BATTERY_OK :: 0x1C +HID_USAGE_LED_BATTERY_LOW :: 0x1D +HID_USAGE_LED_SPEAKER :: 0x1E +HID_USAGE_LED_HEAD_SET :: 0x1F +HID_USAGE_LED_HOLD :: 0x20 +HID_USAGE_LED_MICROPHONE :: 0x21 +HID_USAGE_LED_COVERAGE :: 0x22 +HID_USAGE_LED_NIGHT_MODE :: 0x23 +HID_USAGE_LED_SEND_CALLS :: 0x24 +HID_USAGE_LED_CALL_PICKUP :: 0x25 +HID_USAGE_LED_CONFERENCE :: 0x26 +HID_USAGE_LED_STAND_BY :: 0x27 +HID_USAGE_LED_CAMERA_ON :: 0x28 +HID_USAGE_LED_CAMERA_OFF :: 0x29 +HID_USAGE_LED_ON_LINE :: 0x2A +HID_USAGE_LED_OFF_LINE :: 0x2B +HID_USAGE_LED_BUSY :: 0x2C +HID_USAGE_LED_READY :: 0x2D +HID_USAGE_LED_PAPER_OUT :: 0x2E +HID_USAGE_LED_PAPER_JAM :: 0x2F +HID_USAGE_LED_REMOTE :: 0x30 +HID_USAGE_LED_FORWARD :: 0x31 +HID_USAGE_LED_REVERSE :: 0x32 +HID_USAGE_LED_STOP :: 0x33 +HID_USAGE_LED_REWIND :: 0x34 +HID_USAGE_LED_FAST_FORWARD :: 0x35 +HID_USAGE_LED_PLAY :: 0x36 +HID_USAGE_LED_PAUSE :: 0x37 +HID_USAGE_LED_RECORD :: 0x38 +HID_USAGE_LED_ERROR :: 0x39 +HID_USAGE_LED_SELECTED_INDICATOR :: 0x3A +HID_USAGE_LED_IN_USE_INDICATOR :: 0x3B HID_USAGE_LED_MULTI_MODE_INDICATOR :: 0x3C -HID_USAGE_LED_INDICATOR_ON :: 0x3D -HID_USAGE_LED_INDICATOR_FLASH :: 0x3E +HID_USAGE_LED_INDICATOR_ON :: 0x3D +HID_USAGE_LED_INDICATOR_FLASH :: 0x3E HID_USAGE_LED_INDICATOR_SLOW_BLINK :: 0x3F HID_USAGE_LED_INDICATOR_FAST_BLINK :: 0x40 -HID_USAGE_LED_INDICATOR_OFF :: 0x41 -HID_USAGE_LED_FLASH_ON_TIME :: 0x42 -HID_USAGE_LED_SLOW_BLINK_ON_TIME :: 0x43 -HID_USAGE_LED_SLOW_BLINK_OFF_TIME :: 0x44 -HID_USAGE_LED_FAST_BLINK_ON_TIME :: 0x45 -HID_USAGE_LED_FAST_BLINK_OFF_TIME :: 0x46 -HID_USAGE_LED_INDICATOR_COLOR :: 0x47 -HID_USAGE_LED_RED :: 0x48 -HID_USAGE_LED_GREEN :: 0x49 -HID_USAGE_LED_AMBER :: 0x4A -HID_USAGE_LED_GENERIC_INDICATOR :: 0x4B -HID_USAGE_LED_SYSTEM_SUSPEND :: 0x4C -HID_USAGE_LED_EXTERNAL_POWER :: 0x4D +HID_USAGE_LED_INDICATOR_OFF :: 0x41 +HID_USAGE_LED_FLASH_ON_TIME :: 0x42 +HID_USAGE_LED_SLOW_BLINK_ON_TIME :: 0x43 +HID_USAGE_LED_SLOW_BLINK_OFF_TIME :: 0x44 +HID_USAGE_LED_FAST_BLINK_ON_TIME :: 0x45 +HID_USAGE_LED_FAST_BLINK_OFF_TIME :: 0x46 +HID_USAGE_LED_INDICATOR_COLOR :: 0x47 +HID_USAGE_LED_RED :: 0x48 +HID_USAGE_LED_GREEN :: 0x49 +HID_USAGE_LED_AMBER :: 0x4A +HID_USAGE_LED_GENERIC_INDICATOR :: 0x4B +HID_USAGE_LED_SYSTEM_SUSPEND :: 0x4C +HID_USAGE_LED_EXTERNAL_POWER :: 0x4D -HID_USAGE_TELEPHONY_PHONE :: 0x01 -HID_USAGE_TELEPHONY_ANSWERING_MACHINE :: 0x02 -HID_USAGE_TELEPHONY_MESSAGE_CONTROLS :: 0x03 -HID_USAGE_TELEPHONY_HANDSET :: 0x04 -HID_USAGE_TELEPHONY_HEADSET :: 0x05 -HID_USAGE_TELEPHONY_KEYPAD :: 0x06 +HID_USAGE_TELEPHONY_PHONE :: 0x01 +HID_USAGE_TELEPHONY_ANSWERING_MACHINE :: 0x02 +HID_USAGE_TELEPHONY_MESSAGE_CONTROLS :: 0x03 +HID_USAGE_TELEPHONY_HANDSET :: 0x04 +HID_USAGE_TELEPHONY_HEADSET :: 0x05 +HID_USAGE_TELEPHONY_KEYPAD :: 0x06 HID_USAGE_TELEPHONY_PROGRAMMABLE_BUTTON :: 0x07 -HID_USAGE_TELEPHONY_REDIAL :: 0x24 -HID_USAGE_TELEPHONY_TRANSFER :: 0x25 -HID_USAGE_TELEPHONY_DROP :: 0x26 -HID_USAGE_TELEPHONY_LINE :: 0x2A -HID_USAGE_TELEPHONY_RING_ENABLE :: 0x2D -HID_USAGE_TELEPHONY_SEND :: 0x31 -HID_USAGE_TELEPHONY_KEYPAD_0 :: 0xB0 -HID_USAGE_TELEPHONY_KEYPAD_D :: 0xBF -HID_USAGE_TELEPHONY_HOST_AVAILABLE :: 0xF1 +HID_USAGE_TELEPHONY_REDIAL :: 0x24 +HID_USAGE_TELEPHONY_TRANSFER :: 0x25 +HID_USAGE_TELEPHONY_DROP :: 0x26 +HID_USAGE_TELEPHONY_LINE :: 0x2A +HID_USAGE_TELEPHONY_RING_ENABLE :: 0x2D +HID_USAGE_TELEPHONY_SEND :: 0x31 +HID_USAGE_TELEPHONY_KEYPAD_0 :: 0xB0 +HID_USAGE_TELEPHONY_KEYPAD_D :: 0xBF +HID_USAGE_TELEPHONY_HOST_AVAILABLE :: 0xF1 HID_USAGE_CONSUMERCTRL :: 0x01 @@ -420,271 +420,271 @@ HID_USAGE_CONSUMER_CHANNEL_INCREMENT :: 0x9C HID_USAGE_CONSUMER_CHANNEL_DECREMENT :: 0x9D // transport control -HID_USAGE_CONSUMER_PLAY :: 0xB0 -HID_USAGE_CONSUMER_PAUSE :: 0xB1 -HID_USAGE_CONSUMER_RECORD :: 0xB2 -HID_USAGE_CONSUMER_FAST_FORWARD :: 0xB3 -HID_USAGE_CONSUMER_REWIND :: 0xB4 +HID_USAGE_CONSUMER_PLAY :: 0xB0 +HID_USAGE_CONSUMER_PAUSE :: 0xB1 +HID_USAGE_CONSUMER_RECORD :: 0xB2 +HID_USAGE_CONSUMER_FAST_FORWARD :: 0xB3 +HID_USAGE_CONSUMER_REWIND :: 0xB4 HID_USAGE_CONSUMER_SCAN_NEXT_TRACK :: 0xB5 HID_USAGE_CONSUMER_SCAN_PREV_TRACK :: 0xB6 -HID_USAGE_CONSUMER_STOP :: 0xB7 -HID_USAGE_CONSUMER_PLAY_PAUSE :: 0xCD +HID_USAGE_CONSUMER_STOP :: 0xB7 +HID_USAGE_CONSUMER_PLAY_PAUSE :: 0xCD // GameDVR -HID_USAGE_CONSUMER_GAMEDVR_OPEN_GAMEBAR :: 0xD0 -HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_RECORD :: 0xD1 -HID_USAGE_CONSUMER_GAMEDVR_RECORD_CLIP :: 0xD2 -HID_USAGE_CONSUMER_GAMEDVR_SCREENSHOT :: 0xD3 -HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_INDICATOR :: 0xD4 +HID_USAGE_CONSUMER_GAMEDVR_OPEN_GAMEBAR :: 0xD0 +HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_RECORD :: 0xD1 +HID_USAGE_CONSUMER_GAMEDVR_RECORD_CLIP :: 0xD2 +HID_USAGE_CONSUMER_GAMEDVR_SCREENSHOT :: 0xD3 +HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_INDICATOR :: 0xD4 HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_MICROPHONE :: 0xD5 -HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_CAMERA :: 0xD6 -HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_BROADCAST :: 0xD7 +HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_CAMERA :: 0xD6 +HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_BROADCAST :: 0xD7 // audio -HID_USAGE_CONSUMER_VOLUME :: 0xE0 -HID_USAGE_CONSUMER_BALANCE :: 0xE1 -HID_USAGE_CONSUMER_MUTE :: 0xE2 -HID_USAGE_CONSUMER_BASS :: 0xE3 -HID_USAGE_CONSUMER_TREBLE :: 0xE4 -HID_USAGE_CONSUMER_BASS_BOOST :: 0xE5 -HID_USAGE_CONSUMER_SURROUND_MODE :: 0xE6 -HID_USAGE_CONSUMER_LOUDNESS :: 0xE7 -HID_USAGE_CONSUMER_MPX :: 0xE8 +HID_USAGE_CONSUMER_VOLUME :: 0xE0 +HID_USAGE_CONSUMER_BALANCE :: 0xE1 +HID_USAGE_CONSUMER_MUTE :: 0xE2 +HID_USAGE_CONSUMER_BASS :: 0xE3 +HID_USAGE_CONSUMER_TREBLE :: 0xE4 +HID_USAGE_CONSUMER_BASS_BOOST :: 0xE5 +HID_USAGE_CONSUMER_SURROUND_MODE :: 0xE6 +HID_USAGE_CONSUMER_LOUDNESS :: 0xE7 +HID_USAGE_CONSUMER_MPX :: 0xE8 HID_USAGE_CONSUMER_VOLUME_INCREMENT :: 0xE9 HID_USAGE_CONSUMER_VOLUME_DECREMENT :: 0xEA // supplementary audio -HID_USAGE_CONSUMER_BASS_INCREMENT :: 0x152 -HID_USAGE_CONSUMER_BASS_DECREMENT :: 0x153 +HID_USAGE_CONSUMER_BASS_INCREMENT :: 0x152 +HID_USAGE_CONSUMER_BASS_DECREMENT :: 0x153 HID_USAGE_CONSUMER_TREBLE_INCREMENT :: 0x154 HID_USAGE_CONSUMER_TREBLE_DECREMENT :: 0x155 // Application Launch HID_USAGE_CONSUMER_AL_CONFIGURATION :: 0x183 -HID_USAGE_CONSUMER_AL_EMAIL :: 0x18A -HID_USAGE_CONSUMER_AL_CALCULATOR :: 0x192 -HID_USAGE_CONSUMER_AL_BROWSER :: 0x194 -HID_USAGE_CONSUMER_AL_SEARCH :: 0x1C6 +HID_USAGE_CONSUMER_AL_EMAIL :: 0x18A +HID_USAGE_CONSUMER_AL_CALCULATOR :: 0x192 +HID_USAGE_CONSUMER_AL_BROWSER :: 0x194 +HID_USAGE_CONSUMER_AL_SEARCH :: 0x1C6 // Application Control -HID_USAGE_CONSUMER_AC_SEARCH :: 0x221 -HID_USAGE_CONSUMER_AC_GOTO :: 0x222 -HID_USAGE_CONSUMER_AC_HOME :: 0x223 -HID_USAGE_CONSUMER_AC_BACK :: 0x224 -HID_USAGE_CONSUMER_AC_FORWARD :: 0x225 -HID_USAGE_CONSUMER_AC_STOP :: 0x226 -HID_USAGE_CONSUMER_AC_REFRESH :: 0x227 -HID_USAGE_CONSUMER_AC_PREVIOUS :: 0x228 -HID_USAGE_CONSUMER_AC_NEXT :: 0x229 +HID_USAGE_CONSUMER_AC_SEARCH :: 0x221 +HID_USAGE_CONSUMER_AC_GOTO :: 0x222 +HID_USAGE_CONSUMER_AC_HOME :: 0x223 +HID_USAGE_CONSUMER_AC_BACK :: 0x224 +HID_USAGE_CONSUMER_AC_FORWARD :: 0x225 +HID_USAGE_CONSUMER_AC_STOP :: 0x226 +HID_USAGE_CONSUMER_AC_REFRESH :: 0x227 +HID_USAGE_CONSUMER_AC_PREVIOUS :: 0x228 +HID_USAGE_CONSUMER_AC_NEXT :: 0x229 HID_USAGE_CONSUMER_AC_BOOKMARKS :: 0x22A -HID_USAGE_CONSUMER_AC_PAN :: 0x238 +HID_USAGE_CONSUMER_AC_PAN :: 0x238 // Keyboard Extended Attributes (defined on consumer page in HUTRR42) -HID_USAGE_CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION :: 0x2C0 -HID_USAGE_CONSUMER_KEYBOARD_FORM_FACTOR :: 0x2C1 -HID_USAGE_CONSUMER_KEYBOARD_KEY_TYPE :: 0x2C2 -HID_USAGE_CONSUMER_KEYBOARD_PHYSICAL_LAYOUT :: 0x2C3 -HID_USAGE_CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT :: 0x2C4 -HID_USAGE_CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX :: 0x2C5 +HID_USAGE_CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION :: 0x2C0 +HID_USAGE_CONSUMER_KEYBOARD_FORM_FACTOR :: 0x2C1 +HID_USAGE_CONSUMER_KEYBOARD_KEY_TYPE :: 0x2C2 +HID_USAGE_CONSUMER_KEYBOARD_PHYSICAL_LAYOUT :: 0x2C3 +HID_USAGE_CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT :: 0x2C4 +HID_USAGE_CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX :: 0x2C5 HID_USAGE_CONSUMER_IMPLEMENTED_KEYBOARD_INPUT_ASSIST_CONTROLS :: 0x2C6 -HID_USAGE_DIGITIZER_DIGITIZER :: 0x01 -HID_USAGE_DIGITIZER_PEN :: 0x02 -HID_USAGE_DIGITIZER_LIGHT_PEN :: 0x03 -HID_USAGE_DIGITIZER_TOUCH_SCREEN :: 0x04 -HID_USAGE_DIGITIZER_TOUCH_PAD :: 0x05 -HID_USAGE_DIGITIZER_WHITE_BOARD :: 0x06 -HID_USAGE_DIGITIZER_COORD_MEASURING :: 0x07 -HID_USAGE_DIGITIZER_3D_DIGITIZER :: 0x08 -HID_USAGE_DIGITIZER_STEREO_PLOTTER :: 0x09 -HID_USAGE_DIGITIZER_ARTICULATED_ARM :: 0x0A -HID_USAGE_DIGITIZER_ARMATURE :: 0x0B -HID_USAGE_DIGITIZER_MULTI_POINT :: 0x0C -HID_USAGE_DIGITIZER_FREE_SPACE_WAND :: 0x0D -HID_USAGE_DIGITIZER_HEAT_MAP :: 0x0F -HID_USAGE_DIGITIZER_STYLUS :: 0x20 -HID_USAGE_DIGITIZER_PUCK :: 0x21 -HID_USAGE_DIGITIZER_FINGER :: 0x22 +HID_USAGE_DIGITIZER_DIGITIZER :: 0x01 +HID_USAGE_DIGITIZER_PEN :: 0x02 +HID_USAGE_DIGITIZER_LIGHT_PEN :: 0x03 +HID_USAGE_DIGITIZER_TOUCH_SCREEN :: 0x04 +HID_USAGE_DIGITIZER_TOUCH_PAD :: 0x05 +HID_USAGE_DIGITIZER_WHITE_BOARD :: 0x06 +HID_USAGE_DIGITIZER_COORD_MEASURING :: 0x07 +HID_USAGE_DIGITIZER_3D_DIGITIZER :: 0x08 +HID_USAGE_DIGITIZER_STEREO_PLOTTER :: 0x09 +HID_USAGE_DIGITIZER_ARTICULATED_ARM :: 0x0A +HID_USAGE_DIGITIZER_ARMATURE :: 0x0B +HID_USAGE_DIGITIZER_MULTI_POINT :: 0x0C +HID_USAGE_DIGITIZER_FREE_SPACE_WAND :: 0x0D +HID_USAGE_DIGITIZER_HEAT_MAP :: 0x0F +HID_USAGE_DIGITIZER_STYLUS :: 0x20 +HID_USAGE_DIGITIZER_PUCK :: 0x21 +HID_USAGE_DIGITIZER_FINGER :: 0x22 HID_USAGE_DIGITIZER_TABLET_FUNC_KEYS :: 0x39 HID_USAGE_DIGITIZER_PROG_CHANGE_KEYS :: 0x3A -HID_USAGE_DIGITIZER_TIP_PRESSURE :: 0x30 -HID_USAGE_DIGITIZER_BARREL_PRESSURE :: 0x31 -HID_USAGE_DIGITIZER_IN_RANGE :: 0x32 -HID_USAGE_DIGITIZER_TOUCH :: 0x33 -HID_USAGE_DIGITIZER_UNTOUCH :: 0x34 -HID_USAGE_DIGITIZER_TAP :: 0x35 -HID_USAGE_DIGITIZER_QUALITY :: 0x36 -HID_USAGE_DIGITIZER_DATA_VALID :: 0x37 -HID_USAGE_DIGITIZER_TRANSDUCER_INDEX :: 0x38 -HID_USAGE_DIGITIZER_BATTERY_STRENGTH :: 0x3B -HID_USAGE_DIGITIZER_INVERT :: 0x3C -HID_USAGE_DIGITIZER_X_TILT :: 0x3D -HID_USAGE_DIGITIZER_Y_TILT :: 0x3E -HID_USAGE_DIGITIZER_AZIMUTH :: 0x3F -HID_USAGE_DIGITIZER_ALTITUDE :: 0x40 -HID_USAGE_DIGITIZER_TWIST :: 0x41 -HID_USAGE_DIGITIZER_TIP_SWITCH :: 0x42 -HID_USAGE_DIGITIZER_SECONDARY_TIP_SWITCH :: 0x43 -HID_USAGE_DIGITIZER_BARREL_SWITCH :: 0x44 -HID_USAGE_DIGITIZER_ERASER :: 0x45 -HID_USAGE_DIGITIZER_TABLET_PICK :: 0x46 -HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL :: 0x5B +HID_USAGE_DIGITIZER_TIP_PRESSURE :: 0x30 +HID_USAGE_DIGITIZER_BARREL_PRESSURE :: 0x31 +HID_USAGE_DIGITIZER_IN_RANGE :: 0x32 +HID_USAGE_DIGITIZER_TOUCH :: 0x33 +HID_USAGE_DIGITIZER_UNTOUCH :: 0x34 +HID_USAGE_DIGITIZER_TAP :: 0x35 +HID_USAGE_DIGITIZER_QUALITY :: 0x36 +HID_USAGE_DIGITIZER_DATA_VALID :: 0x37 +HID_USAGE_DIGITIZER_TRANSDUCER_INDEX :: 0x38 +HID_USAGE_DIGITIZER_BATTERY_STRENGTH :: 0x3B +HID_USAGE_DIGITIZER_INVERT :: 0x3C +HID_USAGE_DIGITIZER_X_TILT :: 0x3D +HID_USAGE_DIGITIZER_Y_TILT :: 0x3E +HID_USAGE_DIGITIZER_AZIMUTH :: 0x3F +HID_USAGE_DIGITIZER_ALTITUDE :: 0x40 +HID_USAGE_DIGITIZER_TWIST :: 0x41 +HID_USAGE_DIGITIZER_TIP_SWITCH :: 0x42 +HID_USAGE_DIGITIZER_SECONDARY_TIP_SWITCH :: 0x43 +HID_USAGE_DIGITIZER_BARREL_SWITCH :: 0x44 +HID_USAGE_DIGITIZER_ERASER :: 0x45 +HID_USAGE_DIGITIZER_TABLET_PICK :: 0x46 +HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL :: 0x5B HID_USAGE_DIGITIZER_HEAT_MAP_PROTOCOL_VENDOR_ID :: 0x6A -HID_USAGE_DIGITIZER_HEAT_MAP_PROTOCOL_VERSION :: 0x6B -HID_USAGE_DIGITIZER_HEAT_MAP_FRAME_DATA :: 0x6C -HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL_PART2 :: 0x6E -HID_USAGE_DIGITIZER_TRANSDUCER_VENDOR :: 0x91 -HID_USAGE_DIGITIZER_TRANSDUCER_PRODUCT :: 0x92 -HID_USAGE_DIGITIZER_TRANSDUCER_CONNECTED :: 0xA2 +HID_USAGE_DIGITIZER_HEAT_MAP_PROTOCOL_VERSION :: 0x6B +HID_USAGE_DIGITIZER_HEAT_MAP_FRAME_DATA :: 0x6C +HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL_PART2 :: 0x6E +HID_USAGE_DIGITIZER_TRANSDUCER_VENDOR :: 0x91 +HID_USAGE_DIGITIZER_TRANSDUCER_PRODUCT :: 0x92 +HID_USAGE_DIGITIZER_TRANSDUCER_CONNECTED :: 0xA2 HID_USAGE_HAPTICS_SIMPLE_CONTROLLER :: 0x01 HID_USAGE_HAPTICS_WAVEFORM_LIST :: 0x10 HID_USAGE_HAPTICS_DURATION_LIST :: 0x11 -HID_USAGE_HAPTICS_AUTO_TRIGGER :: 0x20 -HID_USAGE_HAPTICS_MANUAL_TRIGGER :: 0x21 +HID_USAGE_HAPTICS_AUTO_TRIGGER :: 0x20 +HID_USAGE_HAPTICS_MANUAL_TRIGGER :: 0x21 HID_USAGE_HAPTICS_AUTO_ASSOCIATED_CONTROL :: 0x22 -HID_USAGE_HAPTICS_INTENSITY :: 0x23 -HID_USAGE_HAPTICS_REPEAT_COUNT :: 0x24 -HID_USAGE_HAPTICS_RETRIGGER_PERIOD :: 0x25 -HID_USAGE_HAPTICS_WAVEFORM_VENDOR_PAGE :: 0x26 -HID_USAGE_HAPTICS_WAVEFORM_VENDOR_ID :: 0x27 -HID_USAGE_HAPTICS_WAVEFORM_CUTOFF_TIME :: 0x28 +HID_USAGE_HAPTICS_INTENSITY :: 0x23 +HID_USAGE_HAPTICS_REPEAT_COUNT :: 0x24 +HID_USAGE_HAPTICS_RETRIGGER_PERIOD :: 0x25 +HID_USAGE_HAPTICS_WAVEFORM_VENDOR_PAGE :: 0x26 +HID_USAGE_HAPTICS_WAVEFORM_VENDOR_ID :: 0x27 +HID_USAGE_HAPTICS_WAVEFORM_CUTOFF_TIME :: 0x28 // Waveform types -HID_USAGE_HAPTICS_WAVEFORM_BEGIN :: 0x1000 -HID_USAGE_HAPTICS_WAVEFORM_STOP :: 0x1001 -HID_USAGE_HAPTICS_WAVEFORM_NULL :: 0x1002 -HID_USAGE_HAPTICS_WAVEFORM_CLICK :: 0x1003 -HID_USAGE_HAPTICS_WAVEFORM_BUZZ :: 0x1004 -HID_USAGE_HAPTICS_WAVEFORM_RUMBLE :: 0x1005 -HID_USAGE_HAPTICS_WAVEFORM_PRESS :: 0x1006 +HID_USAGE_HAPTICS_WAVEFORM_BEGIN :: 0x1000 +HID_USAGE_HAPTICS_WAVEFORM_STOP :: 0x1001 +HID_USAGE_HAPTICS_WAVEFORM_NULL :: 0x1002 +HID_USAGE_HAPTICS_WAVEFORM_CLICK :: 0x1003 +HID_USAGE_HAPTICS_WAVEFORM_BUZZ :: 0x1004 +HID_USAGE_HAPTICS_WAVEFORM_RUMBLE :: 0x1005 +HID_USAGE_HAPTICS_WAVEFORM_PRESS :: 0x1006 HID_USAGE_HAPTICS_WAVEFORM_RELEASE :: 0x1007 -HID_USAGE_HAPTICS_WAVEFORM_END :: 0x1FFF +HID_USAGE_HAPTICS_WAVEFORM_END :: 0x1FFF HID_USAGE_HAPTICS_WAVEFORM_VENDOR_BEGIN :: 0x2000 -HID_USAGE_HAPTICS_WAVEFORM_VENDOR_END :: 0x2FFF +HID_USAGE_HAPTICS_WAVEFORM_VENDOR_END :: 0x2FFF -HID_USAGE_ALPHANUMERIC_ALPHANUMERIC_DISPLAY :: 0x01 -HID_USAGE_ALPHANUMERIC_BITMAPPED_DISPLAY :: 0x02 +HID_USAGE_ALPHANUMERIC_ALPHANUMERIC_DISPLAY :: 0x01 +HID_USAGE_ALPHANUMERIC_BITMAPPED_DISPLAY :: 0x02 HID_USAGE_ALPHANUMERIC_DISPLAY_ATTRIBUTES_REPORT :: 0x20 -HID_USAGE_ALPHANUMERIC_DISPLAY_CONTROL_REPORT :: 0x24 -HID_USAGE_ALPHANUMERIC_CHARACTER_REPORT :: 0x2B -HID_USAGE_ALPHANUMERIC_DISPLAY_STATUS :: 0x2D -HID_USAGE_ALPHANUMERIC_CURSOR_POSITION_REPORT :: 0x32 -HID_USAGE_ALPHANUMERIC_FONT_REPORT :: 0x3B -HID_USAGE_ALPHANUMERIC_FONT_DATA :: 0x3C -HID_USAGE_ALPHANUMERIC_CHARACTER_ATTRIBUTE :: 0x48 -HID_USAGE_ALPHANUMERIC_PALETTE_REPORT :: 0x85 -HID_USAGE_ALPHANUMERIC_PALETTE_DATA :: 0x88 -HID_USAGE_ALPHANUMERIC_BLIT_REPORT :: 0x8A -HID_USAGE_ALPHANUMERIC_BLIT_DATA :: 0x8F -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON :: 0x90 +HID_USAGE_ALPHANUMERIC_DISPLAY_CONTROL_REPORT :: 0x24 +HID_USAGE_ALPHANUMERIC_CHARACTER_REPORT :: 0x2B +HID_USAGE_ALPHANUMERIC_DISPLAY_STATUS :: 0x2D +HID_USAGE_ALPHANUMERIC_CURSOR_POSITION_REPORT :: 0x32 +HID_USAGE_ALPHANUMERIC_FONT_REPORT :: 0x3B +HID_USAGE_ALPHANUMERIC_FONT_DATA :: 0x3C +HID_USAGE_ALPHANUMERIC_CHARACTER_ATTRIBUTE :: 0x48 +HID_USAGE_ALPHANUMERIC_PALETTE_REPORT :: 0x85 +HID_USAGE_ALPHANUMERIC_PALETTE_DATA :: 0x88 +HID_USAGE_ALPHANUMERIC_BLIT_REPORT :: 0x8A +HID_USAGE_ALPHANUMERIC_BLIT_DATA :: 0x8F +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON :: 0x90 -HID_USAGE_ALPHANUMERIC_ASCII_CHARACTER_SET :: 0x21 -HID_USAGE_ALPHANUMERIC_DATA_READ_BACK :: 0x22 -HID_USAGE_ALPHANUMERIC_FONT_READ_BACK :: 0x23 -HID_USAGE_ALPHANUMERIC_CLEAR_DISPLAY :: 0x25 -HID_USAGE_ALPHANUMERIC_DISPLAY_ENABLE :: 0x26 -HID_USAGE_ALPHANUMERIC_SCREEN_SAVER_DELAY :: 0x27 -HID_USAGE_ALPHANUMERIC_SCREEN_SAVER_ENABLE :: 0x28 -HID_USAGE_ALPHANUMERIC_VERTICAL_SCROLL :: 0x29 -HID_USAGE_ALPHANUMERIC_HORIZONTAL_SCROLL :: 0x2A -HID_USAGE_ALPHANUMERIC_DISPLAY_DATA :: 0x2C -HID_USAGE_ALPHANUMERIC_STATUS_NOT_READY :: 0x2E -HID_USAGE_ALPHANUMERIC_STATUS_READY :: 0x2F +HID_USAGE_ALPHANUMERIC_ASCII_CHARACTER_SET :: 0x21 +HID_USAGE_ALPHANUMERIC_DATA_READ_BACK :: 0x22 +HID_USAGE_ALPHANUMERIC_FONT_READ_BACK :: 0x23 +HID_USAGE_ALPHANUMERIC_CLEAR_DISPLAY :: 0x25 +HID_USAGE_ALPHANUMERIC_DISPLAY_ENABLE :: 0x26 +HID_USAGE_ALPHANUMERIC_SCREEN_SAVER_DELAY :: 0x27 +HID_USAGE_ALPHANUMERIC_SCREEN_SAVER_ENABLE :: 0x28 +HID_USAGE_ALPHANUMERIC_VERTICAL_SCROLL :: 0x29 +HID_USAGE_ALPHANUMERIC_HORIZONTAL_SCROLL :: 0x2A +HID_USAGE_ALPHANUMERIC_DISPLAY_DATA :: 0x2C +HID_USAGE_ALPHANUMERIC_STATUS_NOT_READY :: 0x2E +HID_USAGE_ALPHANUMERIC_STATUS_READY :: 0x2F HID_USAGE_ALPHANUMERIC_ERR_NOT_A_LOADABLE_CHARACTER :: 0x30 HID_USAGE_ALPHANUMERIC_ERR_FONT_DATA_CANNOT_BE_READ :: 0x31 -HID_USAGE_ALPHANUMERIC_ROW :: 0x33 -HID_USAGE_ALPHANUMERIC_COLUMN :: 0x34 -HID_USAGE_ALPHANUMERIC_ROWS :: 0x35 -HID_USAGE_ALPHANUMERIC_COLUMNS :: 0x36 -HID_USAGE_ALPHANUMERIC_CURSOR_PIXEL_POSITIONING :: 0x37 -HID_USAGE_ALPHANUMERIC_CURSOR_MODE :: 0x38 -HID_USAGE_ALPHANUMERIC_CURSOR_ENABLE :: 0x39 -HID_USAGE_ALPHANUMERIC_CURSOR_BLINK :: 0x3A -HID_USAGE_ALPHANUMERIC_CHAR_WIDTH :: 0x3D -HID_USAGE_ALPHANUMERIC_CHAR_HEIGHT :: 0x3E -HID_USAGE_ALPHANUMERIC_CHAR_SPACING_HORIZONTAL :: 0x3F -HID_USAGE_ALPHANUMERIC_CHAR_SPACING_VERTICAL :: 0x40 -HID_USAGE_ALPHANUMERIC_UNICODE_CHAR_SET :: 0x41 -HID_USAGE_ALPHANUMERIC_FONT_7_SEGMENT :: 0x42 -HID_USAGE_ALPHANUMERIC_7_SEGMENT_DIRECT_MAP :: 0x43 -HID_USAGE_ALPHANUMERIC_FONT_14_SEGMENT :: 0x44 -HID_USAGE_ALPHANUMERIC_14_SEGMENT_DIRECT_MAP :: 0x45 -HID_USAGE_ALPHANUMERIC_DISPLAY_BRIGHTNESS :: 0x46 -HID_USAGE_ALPHANUMERIC_DISPLAY_CONTRAST :: 0x47 -HID_USAGE_ALPHANUMERIC_ATTRIBUTE_READBACK :: 0x49 -HID_USAGE_ALPHANUMERIC_ATTRIBUTE_DATA :: 0x4A -HID_USAGE_ALPHANUMERIC_CHAR_ATTR_ENHANCE :: 0x4B -HID_USAGE_ALPHANUMERIC_CHAR_ATTR_UNDERLINE :: 0x4C -HID_USAGE_ALPHANUMERIC_CHAR_ATTR_BLINK :: 0x4D -HID_USAGE_ALPHANUMERIC_BITMAP_SIZE_X :: 0x80 -HID_USAGE_ALPHANUMERIC_BITMAP_SIZE_Y :: 0x81 -HID_USAGE_ALPHANUMERIC_BIT_DEPTH_FORMAT :: 0x83 -HID_USAGE_ALPHANUMERIC_DISPLAY_ORIENTATION :: 0x84 -HID_USAGE_ALPHANUMERIC_PALETTE_DATA_SIZE :: 0x86 -HID_USAGE_ALPHANUMERIC_PALETTE_DATA_OFFSET :: 0x87 -HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_X1 :: 0x8B -HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_Y1 :: 0x8C -HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_X2 :: 0x8D -HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_Y2 :: 0x8E -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_ID :: 0x91 -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_SIDE :: 0x92 -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_OFFSET1 :: 0x93 -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_OFFSET2 :: 0x94 -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_REPORT :: 0x95 +HID_USAGE_ALPHANUMERIC_ROW :: 0x33 +HID_USAGE_ALPHANUMERIC_COLUMN :: 0x34 +HID_USAGE_ALPHANUMERIC_ROWS :: 0x35 +HID_USAGE_ALPHANUMERIC_COLUMNS :: 0x36 +HID_USAGE_ALPHANUMERIC_CURSOR_PIXEL_POSITIONING :: 0x37 +HID_USAGE_ALPHANUMERIC_CURSOR_MODE :: 0x38 +HID_USAGE_ALPHANUMERIC_CURSOR_ENABLE :: 0x39 +HID_USAGE_ALPHANUMERIC_CURSOR_BLINK :: 0x3A +HID_USAGE_ALPHANUMERIC_CHAR_WIDTH :: 0x3D +HID_USAGE_ALPHANUMERIC_CHAR_HEIGHT :: 0x3E +HID_USAGE_ALPHANUMERIC_CHAR_SPACING_HORIZONTAL :: 0x3F +HID_USAGE_ALPHANUMERIC_CHAR_SPACING_VERTICAL :: 0x40 +HID_USAGE_ALPHANUMERIC_UNICODE_CHAR_SET :: 0x41 +HID_USAGE_ALPHANUMERIC_FONT_7_SEGMENT :: 0x42 +HID_USAGE_ALPHANUMERIC_7_SEGMENT_DIRECT_MAP :: 0x43 +HID_USAGE_ALPHANUMERIC_FONT_14_SEGMENT :: 0x44 +HID_USAGE_ALPHANUMERIC_14_SEGMENT_DIRECT_MAP :: 0x45 +HID_USAGE_ALPHANUMERIC_DISPLAY_BRIGHTNESS :: 0x46 +HID_USAGE_ALPHANUMERIC_DISPLAY_CONTRAST :: 0x47 +HID_USAGE_ALPHANUMERIC_ATTRIBUTE_READBACK :: 0x49 +HID_USAGE_ALPHANUMERIC_ATTRIBUTE_DATA :: 0x4A +HID_USAGE_ALPHANUMERIC_CHAR_ATTR_ENHANCE :: 0x4B +HID_USAGE_ALPHANUMERIC_CHAR_ATTR_UNDERLINE :: 0x4C +HID_USAGE_ALPHANUMERIC_CHAR_ATTR_BLINK :: 0x4D +HID_USAGE_ALPHANUMERIC_BITMAP_SIZE_X :: 0x80 +HID_USAGE_ALPHANUMERIC_BITMAP_SIZE_Y :: 0x81 +HID_USAGE_ALPHANUMERIC_BIT_DEPTH_FORMAT :: 0x83 +HID_USAGE_ALPHANUMERIC_DISPLAY_ORIENTATION :: 0x84 +HID_USAGE_ALPHANUMERIC_PALETTE_DATA_SIZE :: 0x86 +HID_USAGE_ALPHANUMERIC_PALETTE_DATA_OFFSET :: 0x87 +HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_X1 :: 0x8B +HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_Y1 :: 0x8C +HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_X2 :: 0x8D +HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_Y2 :: 0x8E +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_ID :: 0x91 +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_SIDE :: 0x92 +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_OFFSET1 :: 0x93 +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_OFFSET2 :: 0x94 +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_REPORT :: 0x95 -HID_USAGE_LAMPARRAY :: 0x01 -HID_USAGE_LAMPARRAY_ATTRBIUTES_REPORT :: 0x02 -HID_USAGE_LAMPARRAY_LAMP_COUNT :: 0x03 -HID_USAGE_LAMPARRAY_BOUNDING_BOX_WIDTH_IN_MICROMETERS :: 0x04 -HID_USAGE_LAMPARRAY_BOUNDING_BOX_HEIGHT_IN_MICROMETERS :: 0x05 -HID_USAGE_LAMPARRAY_BOUNDING_BOX_DEPTH_IN_MICROMETERS :: 0x06 -HID_USAGE_LAMPARRAY_KIND :: 0x07 +HID_USAGE_LAMPARRAY :: 0x01 +HID_USAGE_LAMPARRAY_ATTRBIUTES_REPORT :: 0x02 +HID_USAGE_LAMPARRAY_LAMP_COUNT :: 0x03 +HID_USAGE_LAMPARRAY_BOUNDING_BOX_WIDTH_IN_MICROMETERS :: 0x04 +HID_USAGE_LAMPARRAY_BOUNDING_BOX_HEIGHT_IN_MICROMETERS :: 0x05 +HID_USAGE_LAMPARRAY_BOUNDING_BOX_DEPTH_IN_MICROMETERS :: 0x06 +HID_USAGE_LAMPARRAY_KIND :: 0x07 HID_USAGE_LAMPARRAY_MIN_UPDATE_INTERVAL_IN_MICROSECONDS :: 0x08 // 0x09 - 0x1F Reserved -HID_USAGE_LAMPARRAY_LAMP_ATTRIBUTES_REQUEST_REPORT :: 0x20 -HID_USAGE_LAMPARRAY_LAMP_ID :: 0x21 +HID_USAGE_LAMPARRAY_LAMP_ATTRIBUTES_REQUEST_REPORT :: 0x20 +HID_USAGE_LAMPARRAY_LAMP_ID :: 0x21 HID_USAGE_LAMPARRAY_LAMP_ATTRIBUTES_RESPONSE_REPORT :: 0x22 -HID_USAGE_LAMPARRAY_POSITION_X_IN_MICROMETERS :: 0x23 -HID_USAGE_LAMPARRAY_POSITION_Y_IN_MICROMETERS :: 0x24 -HID_USAGE_LAMPARRAY_POSITION_Z_IN_MICROMETERS :: 0x25 -HID_USAGE_LAMPARRAY_LAMP_PURPOSES :: 0x26 -HID_USAGE_LAMPARRAY_UPDATE_LATENCY_IN_MICROSECONDS :: 0x27 -HID_USAGE_LAMPARRAY_RED_LEVEL_COUNT :: 0x28 -HID_USAGE_LAMPARRAY_GREEN_LEVEL_COUNT :: 0x29 -HID_USAGE_LAMPARRAY_BLUE_LEVEL_COUNT :: 0x2A -HID_USAGE_LAMPARRAY_INTENSITY_LEVEL_COUNT :: 0x2B -HID_USAGE_LAMPARRAY_IS_PROGRAMMABLE :: 0x2C -HID_USAGE_LAMPARRAY_INPUT_BINDING :: 0x2D +HID_USAGE_LAMPARRAY_POSITION_X_IN_MICROMETERS :: 0x23 +HID_USAGE_LAMPARRAY_POSITION_Y_IN_MICROMETERS :: 0x24 +HID_USAGE_LAMPARRAY_POSITION_Z_IN_MICROMETERS :: 0x25 +HID_USAGE_LAMPARRAY_LAMP_PURPOSES :: 0x26 +HID_USAGE_LAMPARRAY_UPDATE_LATENCY_IN_MICROSECONDS :: 0x27 +HID_USAGE_LAMPARRAY_RED_LEVEL_COUNT :: 0x28 +HID_USAGE_LAMPARRAY_GREEN_LEVEL_COUNT :: 0x29 +HID_USAGE_LAMPARRAY_BLUE_LEVEL_COUNT :: 0x2A +HID_USAGE_LAMPARRAY_INTENSITY_LEVEL_COUNT :: 0x2B +HID_USAGE_LAMPARRAY_IS_PROGRAMMABLE :: 0x2C +HID_USAGE_LAMPARRAY_INPUT_BINDING :: 0x2D // 0x2E - 0x4F Reserved -HID_USAGE_LAMPARRAY_LAMP_MULTI_UPDATE_REPORT :: 0x50 -HID_USAGE_LAMPARRAY_LAMP_RED_UPDATE_CHANNEL :: 0x51 -HID_USAGE_LAMPARRAY_LAMP_GREEN_UPDATE_CHANNEL :: 0x52 -HID_USAGE_LAMPARRAY_LAMP_BLUE_UPDATE_CHANNEL :: 0x53 +HID_USAGE_LAMPARRAY_LAMP_MULTI_UPDATE_REPORT :: 0x50 +HID_USAGE_LAMPARRAY_LAMP_RED_UPDATE_CHANNEL :: 0x51 +HID_USAGE_LAMPARRAY_LAMP_GREEN_UPDATE_CHANNEL :: 0x52 +HID_USAGE_LAMPARRAY_LAMP_BLUE_UPDATE_CHANNEL :: 0x53 HID_USAGE_LAMPARRAY_LAMP_INTENSITY_UPDATE_CHANNEL :: 0x54 -HID_USAGE_LAMPARRAY_LAMP_UPDATE_FLAGS :: 0x55 +HID_USAGE_LAMPARRAY_LAMP_UPDATE_FLAGS :: 0x55 // 0x55 - 0x5F Reserved HID_USAGE_LAMPARRAY_LAMP_RANGE_UPDATE_REPORT :: 0x60 -HID_USAGE_LAMPARRAY_LAMP_ID_START :: 0x61 -HID_USAGE_LAMPARRAY_LAMP_ID_END :: 0x62 +HID_USAGE_LAMPARRAY_LAMP_ID_START :: 0x61 +HID_USAGE_LAMPARRAY_LAMP_ID_END :: 0x62 // 0x63 - 0x6F Reserved -HID_USAGE_LAMPARRAY_CONTROL_REPORT :: 0x70 +HID_USAGE_LAMPARRAY_CONTROL_REPORT :: 0x70 HID_USAGE_LAMPARRAY_AUTONOMOUS_MODE :: 0x71 HID_USAGE_CAMERA_AUTO_FOCUS :: 0x20 -HID_USAGE_CAMERA_SHUTTER :: 0x21 +HID_USAGE_CAMERA_SHUTTER :: 0x21 HID_USAGE_MS_BTH_HF_DIALNUMBER :: 0x21 HID_USAGE_MS_BTH_HF_DIALMEMORY :: 0x22 diff --git a/core/sys/windows/icu.odin b/core/sys/windows/icu.odin index b481a05a9..7be9ce4c6 100644 --- a/core/sys/windows/icu.odin +++ b/core/sys/windows/icu.odin @@ -10,7 +10,7 @@ UError :: enum i32 { @(default_calling_convention="system") foreign icu { ucal_getWindowsTimeZoneID :: proc(id: wstring, len: i32, winid: wstring, winidCapacity: i32, status: ^UError) -> i32 --- - ucal_getDefaultTimeZone :: proc(result: wstring, cap: i32, status: ^UError) -> i32 --- + ucal_getDefaultTimeZone :: proc(result: wstring, cap: i32, status: ^UError) -> i32 --- } diff --git a/core/sys/windows/ip_helper.odin b/core/sys/windows/ip_helper.odin index da23a064f..74ffa95b9 100644 --- a/core/sys/windows/ip_helper.odin +++ b/core/sys/windows/ip_helper.odin @@ -223,7 +223,7 @@ foreign iphlpapi { The GetAdaptersAddresses function retrieves the addresses associated with the adapters on the local computer. See: https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses */ - @(link_name="GetAdaptersAddresses") get_adapters_addresses :: proc( + GetAdaptersAddresses :: proc( family: Address_Family, flags: GAA_Flags, _reserved: rawptr, @@ -232,3 +232,5 @@ foreign iphlpapi { ) -> ULONG --- } + +get_adapters_addresses :: GetAdaptersAddresses \ No newline at end of file diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index e5163bac7..0ad11121e 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -60,15 +60,15 @@ foreign kernel32 { // https://learn.microsoft.com/en-us/windows/console/getnumberofconsoleinputevents GetNumberOfConsoleInputEvents :: proc(hConsoleInput: HANDLE, lpcNumberOfEvents: LPDWORD) -> BOOL --- - GetConsoleMode :: proc(hConsoleHandle: HANDLE, lpMode: LPDWORD) -> BOOL --- - SetConsoleMode :: proc(hConsoleHandle: HANDLE, dwMode: DWORD) -> BOOL --- + GetConsoleMode :: proc(hConsoleHandle: HANDLE, lpMode: LPDWORD) -> BOOL --- + SetConsoleMode :: proc(hConsoleHandle: HANDLE, dwMode: DWORD) -> BOOL --- SetConsoleCursorPosition :: proc(hConsoleHandle: HANDLE, dwCursorPosition: COORD) -> BOOL --- - SetConsoleTextAttribute :: proc(hConsoleOutput: HANDLE, wAttributes: WORD) -> BOOL --- - GetConsoleCP :: proc() -> CODEPAGE --- - SetConsoleCP :: proc(wCodePageID: CODEPAGE) -> BOOL --- - GetConsoleOutputCP :: proc() -> CODEPAGE --- - SetConsoleOutputCP :: proc(wCodePageID: CODEPAGE) -> BOOL --- - FlushConsoleInputBuffer :: proc(hConsoleInput: HANDLE) -> BOOL --- + SetConsoleTextAttribute :: proc(hConsoleOutput: HANDLE, wAttributes: WORD) -> BOOL --- + GetConsoleCP :: proc() -> CODEPAGE --- + SetConsoleCP :: proc(wCodePageID: CODEPAGE) -> BOOL --- + GetConsoleOutputCP :: proc() -> CODEPAGE --- + SetConsoleOutputCP :: proc(wCodePageID: CODEPAGE) -> BOOL --- + FlushConsoleInputBuffer :: proc(hConsoleInput: HANDLE) -> BOOL --- GetFileInformationByHandle :: proc(hFile: HANDLE, lpFileInformation: LPBY_HANDLE_FILE_INFORMATION) -> BOOL --- @@ -82,11 +82,11 @@ foreign kernel32 { dwBufferSize: DWORD) -> BOOL --- - AddVectoredExceptionHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID --- - AddVectoredContinueHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID --- + AddVectoredExceptionHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID --- + AddVectoredContinueHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID --- RemoveVectoredExceptionHandler :: proc(Handle: LPVOID) -> DWORD --- - RemoveVectoredContinueHandler :: proc(Handle: LPVOID) -> DWORD --- - RaiseException :: proc(dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! --- + RemoveVectoredContinueHandler :: proc(Handle: LPVOID) -> DWORD --- + RaiseException :: proc(dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! --- SetUnhandledExceptionFilter :: proc(lpTopLevelExceptionFilter: LPTOP_LEVEL_EXCEPTION_FILTER) -> LPTOP_LEVEL_EXCEPTION_FILTER --- @@ -103,31 +103,31 @@ foreign kernel32 { lpFileInformation: LPVOID, dwBufferSize: DWORD) -> BOOL --- - InitializeCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- + InitializeCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- InitializeCriticalSectionAndSpinCount :: proc(CriticalSection: ^CRITICAL_SECTION, dwSpinCount: DWORD) -> BOOL --- - EnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- - TryEnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) -> BOOLEAN --- - LeaveCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- - DeleteCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- + EnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- + TryEnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) -> BOOLEAN --- + LeaveCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- + DeleteCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- - RemoveDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL --- - SetFileAttributesW :: proc(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL --- - SetLastError :: proc(dwErrCode: DWORD) --- - GetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL --- - SetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL --- - ClearCommError :: proc(hFile: HANDLE, lpErrors: ^Com_Error, lpStat: ^COMSTAT) -> BOOL --- - GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL --- - SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL --- - SetCommMask :: proc(handle: HANDLE, dwEvtMap: DWORD) -> BOOL --- - GetCommMask :: proc(handle: HANDLE, lpEvtMask: LPDWORD) -> BOOL --- - WaitCommEvent :: proc(handle: HANDLE, lpEvtMask: LPDWORD, lpOverlapped: LPOVERLAPPED) -> BOOL --- - GetCommandLineW :: proc() -> LPCWSTR --- - GetTempPathW :: proc(nBufferLength: DWORD, lpBuffer: LPCWSTR) -> DWORD --- - GetTempFileNameW :: proc(lpPathName: LPCWSTR, lpPrefixString: LPCWSTR, uUnique: c_int, lpTempFileName: LPWSTR) -> c_uint --- - GetCurrentProcess :: proc() -> HANDLE --- + RemoveDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL --- + SetFileAttributesW :: proc(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL --- + SetLastError :: proc(dwErrCode: DWORD) --- + GetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL --- + SetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL --- + ClearCommError :: proc(hFile: HANDLE, lpErrors: ^Com_Error, lpStat: ^COMSTAT) -> BOOL --- + GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL --- + SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL --- + SetCommMask :: proc(handle: HANDLE, dwEvtMap: DWORD) -> BOOL --- + GetCommMask :: proc(handle: HANDLE, lpEvtMask: LPDWORD) -> BOOL --- + WaitCommEvent :: proc(handle: HANDLE, lpEvtMask: LPDWORD, lpOverlapped: LPOVERLAPPED) -> BOOL --- + GetCommandLineW :: proc() -> LPCWSTR --- + GetTempPathW :: proc(nBufferLength: DWORD, lpBuffer: LPCWSTR) -> DWORD --- + GetTempFileNameW :: proc(lpPathName: LPCWSTR, lpPrefixString: LPCWSTR, uUnique: c_int, lpTempFileName: LPWSTR) -> c_uint --- + GetCurrentProcess :: proc() -> HANDLE --- GetCurrentProcessId :: proc() -> DWORD --- - GetCurrentThread :: proc() -> HANDLE --- - GetCurrentThreadId :: proc() -> DWORD --- + GetCurrentThread :: proc() -> HANDLE --- + GetCurrentThreadId :: proc() -> DWORD --- GetProcessTimes :: proc( hProcess: HANDLE, lpCreationTime: LPFILETIME, @@ -136,7 +136,7 @@ foreign kernel32 { lpUserTime: LPFILETIME, ) -> BOOL --- GetStdHandle :: proc(which: DWORD) -> HANDLE --- - ExitProcess :: proc(uExitCode: c_uint) -> ! --- + ExitProcess :: proc(uExitCode: c_uint) -> ! --- DeviceIoControl :: proc( hDevice: HANDLE, dwIoControlCode: DWORD, @@ -164,15 +164,15 @@ foreign kernel32 { dwCreationFlags: DWORD, lpThreadId: LPDWORD, ) -> HANDLE --- - SwitchToThread :: proc() -> BOOL --- - ResumeThread :: proc(thread: HANDLE) -> DWORD --- - GetThreadPriority :: proc(thread: HANDLE) -> c_int --- - SetThreadPriority :: proc(thread: HANDLE, priority: c_int) -> BOOL --- + SwitchToThread :: proc() -> BOOL --- + ResumeThread :: proc(thread: HANDLE) -> DWORD --- + GetThreadPriority :: proc(thread: HANDLE) -> c_int --- + SetThreadPriority :: proc(thread: HANDLE, priority: c_int) -> BOOL --- GetThreadDescription :: proc(hThread: HANDLE, ppszThreadDescription: ^PCWSTR) -> HRESULT --- SetThreadDescription :: proc(hThread: HANDLE, lpThreadDescription: PCWSTR) -> HRESULT --- - GetExitCodeThread :: proc(thread: HANDLE, exit_code: ^DWORD) -> BOOL --- - TerminateThread :: proc(thread: HANDLE, exit_code: DWORD) -> BOOL --- - SuspendThread :: proc(hThread: HANDLE) -> DWORD --- + GetExitCodeThread :: proc(thread: HANDLE, exit_code: ^DWORD) -> BOOL --- + TerminateThread :: proc(thread: HANDLE, exit_code: DWORD) -> BOOL --- + SuspendThread :: proc(hThread: HANDLE) -> DWORD --- GetProcessAffinityMask :: proc( hProcess: HANDLE, @@ -237,17 +237,17 @@ foreign kernel32 { nsize: DWORD, args: rawptr, ) -> DWORD --- - TlsAlloc :: proc() -> DWORD --- - TlsFree :: proc(dwTlsIndex: DWORD) -> BOOL --- - TlsGetValue :: proc(dwTlsIndex: DWORD) -> LPVOID --- - TlsSetValue :: proc(dwTlsIndex: DWORD, lpTlsvalue: LPVOID) -> BOOL --- - GetLastError :: proc() -> DWORD --- + TlsAlloc :: proc() -> DWORD --- + TlsFree :: proc(dwTlsIndex: DWORD) -> BOOL --- + TlsGetValue :: proc(dwTlsIndex: DWORD) -> LPVOID --- + TlsSetValue :: proc(dwTlsIndex: DWORD, lpTlsvalue: LPVOID) -> BOOL --- + GetLastError :: proc() -> DWORD --- QueryPerformanceFrequency :: proc(lpFrequency: ^LARGE_INTEGER) -> BOOL --- - QueryPerformanceCounter :: proc(lpPerformanceCount: ^LARGE_INTEGER) -> BOOL --- - GetExitCodeProcess :: proc(hProcess: HANDLE, lpExitCode: LPDWORD) -> BOOL --- - TerminateProcess :: proc(hProcess: HANDLE, uExitCode: UINT) -> BOOL --- - OpenProcess :: proc(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwProcessId: DWORD) -> HANDLE --- - OpenThread :: proc(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwThreadId: DWORD) -> HANDLE --- + QueryPerformanceCounter :: proc(lpPerformanceCount: ^LARGE_INTEGER) -> BOOL --- + GetExitCodeProcess :: proc(hProcess: HANDLE, lpExitCode: LPDWORD) -> BOOL --- + TerminateProcess :: proc(hProcess: HANDLE, uExitCode: UINT) -> BOOL --- + OpenProcess :: proc(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwProcessId: DWORD) -> HANDLE --- + OpenThread :: proc(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwThreadId: DWORD) -> HANDLE --- GetThreadContext :: proc( hThread: HANDLE, lpContext: LPCONTEXT, @@ -366,14 +366,14 @@ foreign kernel32 { ) -> BOOL --- CompareFileTime :: proc(lpFileTime1: LPFILETIME, lpFileTime2: LPFILETIME) -> LONG --- - FindFirstFileW :: proc(fileName: LPCWSTR, findFileData: LPWIN32_FIND_DATAW) -> HANDLE --- - FindNextFileW :: proc(findFile: HANDLE, findFileData: LPWIN32_FIND_DATAW) -> BOOL --- - FindClose :: proc(findFile: HANDLE) -> BOOL --- - GetModuleHandleW :: proc(lpModuleName: LPCWSTR) -> HMODULE --- - GetModuleHandleA :: proc(lpModuleName: LPCSTR) -> HMODULE --- - GetSystemTimeAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) --- - GetSystemTimePreciseAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) --- - FileTimeToSystemTime :: proc(lpFileTime: ^FILETIME, lpSystemTime: ^SYSTEMTIME) -> BOOL --- + FindFirstFileW :: proc(fileName: LPCWSTR, findFileData: LPWIN32_FIND_DATAW) -> HANDLE --- + FindNextFileW :: proc(findFile: HANDLE, findFileData: LPWIN32_FIND_DATAW) -> BOOL --- + FindClose :: proc(findFile: HANDLE) -> BOOL --- + GetModuleHandleW :: proc(lpModuleName: LPCWSTR) -> HMODULE --- + GetModuleHandleA :: proc(lpModuleName: LPCSTR) -> HMODULE --- + GetSystemTimeAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) --- + GetSystemTimePreciseAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) --- + FileTimeToSystemTime :: proc(lpFileTime: ^FILETIME, lpSystemTime: ^SYSTEMTIME) -> BOOL --- SystemTimeToTzSpecificLocalTime :: proc( lpTimeZoneInformation: ^TIME_ZONE_INFORMATION, lpUniversalTime: ^SYSTEMTIME, @@ -428,7 +428,7 @@ foreign kernel32 { lpTotalBytesAvail: ^u32, lpBytesLeftThisMessage: ^u32, ) -> BOOL --- - CancelIo :: proc(handle: HANDLE) -> BOOL --- + CancelIo :: proc(handle: HANDLE) -> BOOL --- CancelIoEx :: proc(hFile: HANDLE, lpOverlapped: LPOVERLAPPED) -> BOOL --- GetOverlappedResult :: proc( hFile: HANDLE, @@ -437,19 +437,19 @@ foreign kernel32 { bWait: BOOL, ) -> BOOL --- GetProcessHeap :: proc() -> HANDLE --- - HeapAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T) -> LPVOID --- - HeapReAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID, dwBytes: SIZE_T) -> LPVOID --- - HeapFree :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL --- + HeapAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T) -> LPVOID --- + HeapReAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID, dwBytes: SIZE_T) -> LPVOID --- + HeapFree :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL --- - LocalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID --- + LocalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID --- LocalReAlloc :: proc(mem: LPVOID, bytes: SIZE_T, flags: UINT) -> LPVOID --- - LocalFree :: proc(mem: LPVOID) -> LPVOID --- + LocalFree :: proc(mem: LPVOID) -> LPVOID --- - GlobalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID --- + GlobalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID --- GlobalReAlloc :: proc(mem: LPVOID, bytes: SIZE_T, flags: UINT) -> LPVOID --- - GlobalFree :: proc(mem: LPVOID) -> LPVOID --- + GlobalFree :: proc(mem: LPVOID) -> LPVOID --- - GlobalLock :: proc(hMem: HGLOBAL) -> LPVOID --- + GlobalLock :: proc(hMem: HGLOBAL) -> LPVOID --- GlobalUnlock :: proc(hMem: HGLOBAL) -> BOOL --- ReadDirectoryChangesW :: proc( @@ -467,16 +467,16 @@ foreign kernel32 { bWatchSubtree: BOOL, dwNotifyFilter: DWORD, ) -> HANDLE --- - FindNextChangeNotification :: proc(hChangeHandle: HANDLE) -> BOOL --- + FindNextChangeNotification :: proc(hChangeHandle: HANDLE) -> BOOL --- FindCloseChangeNotification :: proc(hChangeHandle: HANDLE) -> BOOL --- InitializeSRWLock :: proc(SRWLock: ^SRWLOCK) --- AcquireSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) --- TryAcquireSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) -> BOOLEAN --- ReleaseSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) --- - AcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) --- - TryAcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) -> BOOLEAN --- - ReleaseSRWLockShared :: proc(SRWLock: ^SRWLOCK) --- + AcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) --- + TryAcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) -> BOOLEAN --- + ReleaseSRWLockShared :: proc(SRWLock: ^SRWLOCK) --- InitializeConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) --- WakeConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) --- @@ -485,42 +485,42 @@ foreign kernel32 { SleepConditionVariableSRW :: proc(ConditionVariable: ^CONDITION_VARIABLE, SRWLock: ^SRWLOCK, dwMilliseconds: DWORD, Flags: LONG) -> BOOL --- - GetFileType :: proc(file_handle: HANDLE) -> DWORD --- - SetFilePointer :: proc(file_handle: HANDLE, distance_to_move: LONG, distance_to_move_high: ^LONG, move_method: DWORD) -> DWORD --- - GetFileSizeEx :: proc(file_handle: HANDLE, file_size: ^LARGE_INTEGER) -> BOOL --- - GetFileAttributesW :: proc(lpFileName: LPCWSTR) -> DWORD --- - GetFileAttributesExW :: proc(lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID) -> BOOL --- - GetSystemInfo :: proc(system_info: ^SYSTEM_INFO) --- - GetVersionExW :: proc(osvi: ^OSVERSIONINFOEXW) --- - GetSystemDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT --- - GetWindowsDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT --- - GetSystemDefaultLangID :: proc() -> LANGID --- - GetSystemDefaultLCID :: proc() -> LCID --- + GetFileType :: proc(file_handle: HANDLE) -> DWORD --- + SetFilePointer :: proc(file_handle: HANDLE, distance_to_move: LONG, distance_to_move_high: ^LONG, move_method: DWORD) -> DWORD --- + GetFileSizeEx :: proc(file_handle: HANDLE, file_size: ^LARGE_INTEGER) -> BOOL --- + GetFileAttributesW :: proc(lpFileName: LPCWSTR) -> DWORD --- + GetFileAttributesExW :: proc(lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID) -> BOOL --- + GetSystemInfo :: proc(system_info: ^SYSTEM_INFO) --- + GetVersionExW :: proc(osvi: ^OSVERSIONINFOEXW) --- + GetSystemDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT --- + GetWindowsDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT --- + GetSystemDefaultLangID :: proc() -> LANGID --- + GetSystemDefaultLCID :: proc() -> LCID --- GetSystemDefaultLocaleName :: proc(lpLocaleName: LPWSTR, cchLocaleName: INT) -> INT --- - LCIDToLocaleName :: proc(Locale: LCID, lpName: LPWSTR, cchName: INT, dwFlags: DWORD) -> INT --- - LocaleNameToLCID :: proc(lpName: LPCWSTR, dwFlags: DWORD) -> LCID --- - SetDllDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL --- - AddDllDirectory :: proc(NewDirectory: PCWSTR) -> rawptr --- - RemoveDllDirectory :: proc(Cookie: rawptr) -> BOOL --- - LoadLibraryW :: proc(c_str: LPCWSTR) -> HMODULE --- - LoadLibraryExW :: proc(c_str: LPCWSTR, hFile: HANDLE, dwFlags: LoadLibraryEx_Flags) -> HMODULE --- - FreeLibrary :: proc(h: HMODULE) -> BOOL --- - FreeLibraryAndExitThread :: proc(hLibModule: HMODULE, dwExitCode: DWORD) -> VOID --- - GetProcAddress :: proc(h: HMODULE, c_str: LPCSTR) -> rawptr --- + LCIDToLocaleName :: proc(Locale: LCID, lpName: LPWSTR, cchName: INT, dwFlags: DWORD) -> INT --- + LocaleNameToLCID :: proc(lpName: LPCWSTR, dwFlags: DWORD) -> LCID --- + SetDllDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL --- + AddDllDirectory :: proc(NewDirectory: PCWSTR) -> rawptr --- + RemoveDllDirectory :: proc(Cookie: rawptr) -> BOOL --- + LoadLibraryW :: proc(c_str: LPCWSTR) -> HMODULE --- + LoadLibraryExW :: proc(c_str: LPCWSTR, hFile: HANDLE, dwFlags: LoadLibraryEx_Flags) -> HMODULE --- + FreeLibrary :: proc(h: HMODULE) -> BOOL --- + FreeLibraryAndExitThread :: proc(hLibModule: HMODULE, dwExitCode: DWORD) -> VOID --- + GetProcAddress :: proc(h: HMODULE, c_str: LPCSTR) -> rawptr --- - LoadResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> HGLOBAL --- - FreeResource :: proc(hResData: HGLOBAL) -> BOOL --- - LockResource :: proc(hResData: HGLOBAL) -> LPVOID --- - SizeofResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> DWORD --- - FindResourceW :: proc(hModule: HMODULE, lpName: LPCWSTR, lpType: LPCWSTR) -> HRSRC --- - FindResourceExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, wLanguage: LANGID) -> HRSRC --- - EnumResourceNamesW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR) -> BOOL --- - EnumResourceNamesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- - EnumResourceTypesExW :: proc(hModule: HMODULE, lpEnumFunc: ENUMRESTYPEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- - EnumResourceLanguagesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, lpEnumFunc: ENUMRESLANGPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- - LookupIconIdFromDirectory :: proc(presbits: PBYTE, fIcon: BOOL) -> INT --- + LoadResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> HGLOBAL --- + FreeResource :: proc(hResData: HGLOBAL) -> BOOL --- + LockResource :: proc(hResData: HGLOBAL) -> LPVOID --- + SizeofResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> DWORD --- + FindResourceW :: proc(hModule: HMODULE, lpName: LPCWSTR, lpType: LPCWSTR) -> HRSRC --- + FindResourceExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, wLanguage: LANGID) -> HRSRC --- + EnumResourceNamesW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR) -> BOOL --- + EnumResourceNamesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- + EnumResourceTypesExW :: proc(hModule: HMODULE, lpEnumFunc: ENUMRESTYPEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- + EnumResourceLanguagesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, lpEnumFunc: ENUMRESLANGPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- + LookupIconIdFromDirectory :: proc(presbits: PBYTE, fIcon: BOOL) -> INT --- LookupIconIdFromDirectoryEx :: proc(presbits: PBYTE, fIcon: BOOL, cxDesired: INT, cyDesired: INT, Flags: UINT) -> INT --- - CreateIconFromResourceEx :: proc(presbits: PBYTE, dwResSize: DWORD, fIcon: BOOL, dwVer: DWORD, cxDesired: INT, cyDesired: INT, Flags: UINT) -> HICON --- + CreateIconFromResourceEx :: proc(presbits: PBYTE, dwResSize: DWORD, fIcon: BOOL, dwVer: DWORD, cxDesired: INT, cyDesired: INT, Flags: UINT) -> HICON --- GetFullPathNameW :: proc(filename: LPCWSTR, buffer_length: DWORD, buffer: LPCWSTR, file_part: ^LPCWSTR) -> DWORD --- GetLongPathNameW :: proc(short, long: LPCWSTR, len: DWORD) -> DWORD --- @@ -533,21 +533,21 @@ foreign kernel32 { CreatePipe :: proc(hReadPipe, hWritePipe: ^HANDLE, lpPipeAttributes: LPSECURITY_ATTRIBUTES, nSize: DWORD) -> BOOL --- - ConnectNamedPipe :: proc(hNamedPipe: HANDLE, lpOverlapped: LPOVERLAPPED) -> BOOL --- + ConnectNamedPipe :: proc(hNamedPipe: HANDLE, lpOverlapped: LPOVERLAPPED) -> BOOL --- DisconnectNamedPipe :: proc(hNamedPipe: HANDLE) -> BOOL --- - WaitNamedPipeW :: proc(lpNamedPipeName: LPCWSTR, nTimeOut: DWORD) -> BOOL --- + WaitNamedPipeW :: proc(lpNamedPipeName: LPCWSTR, nTimeOut: DWORD) -> BOOL --- - AllocConsole :: proc() -> BOOL --- - AttachConsole :: proc(dwProcessId: DWORD) -> BOOL --- - SetConsoleCtrlHandler :: proc(HandlerRoutine: PHANDLER_ROUTINE, Add: BOOL) -> BOOL --- - GenerateConsoleCtrlEvent :: proc(dwCtrlEvent: DWORD, dwProcessGroupId: DWORD) -> BOOL --- - FreeConsole :: proc() -> BOOL --- - GetConsoleWindow :: proc() -> HWND --- + AllocConsole :: proc() -> BOOL --- + AttachConsole :: proc(dwProcessId: DWORD) -> BOOL --- + SetConsoleCtrlHandler :: proc(HandlerRoutine: PHANDLER_ROUTINE, Add: BOOL) -> BOOL --- + GenerateConsoleCtrlEvent :: proc(dwCtrlEvent: DWORD, dwProcessGroupId: DWORD) -> BOOL --- + FreeConsole :: proc() -> BOOL --- + GetConsoleWindow :: proc() -> HWND --- GetConsoleScreenBufferInfo :: proc(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: PCONSOLE_SCREEN_BUFFER_INFO) -> BOOL --- SetConsoleScreenBufferSize :: proc(hConsoleOutput: HANDLE, dwSize: COORD) -> BOOL --- - SetConsoleWindowInfo :: proc(hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: ^SMALL_RECT) -> BOOL --- - GetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- - SetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- + SetConsoleWindowInfo :: proc(hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: ^SMALL_RECT) -> BOOL --- + GetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- + SetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- GetDiskFreeSpaceExW :: proc( lpDirectoryName: LPCWSTR, @@ -561,15 +561,15 @@ foreign kernel32 { // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setfilecompletionnotificationmodes) SetFileCompletionNotificationModes :: proc(FileHandle: HANDLE, Flags: u8) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-createiocompletionport) - CreateIoCompletionPort :: proc(FileHandle: HANDLE, ExistingCompletionPort: HANDLE, CompletionKey: ULONG_PTR, NumberOfConcurrentThreads: DWORD) -> HANDLE --- + CreateIoCompletionPort :: proc(FileHandle: HANDLE, ExistingCompletionPort: HANDLE, CompletionKey: ULONG_PTR, NumberOfConcurrentThreads: DWORD) -> HANDLE --- //[MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus) - GetQueuedCompletionStatus :: proc(CompletionPort: HANDLE, lpNumberOfBytesTransferred: ^DWORD, lpCompletionKey: PULONG_PTR, lpOverlapped: ^^OVERLAPPED, dwMilliseconds: DWORD) -> BOOL --- + GetQueuedCompletionStatus :: proc(CompletionPort: HANDLE, lpNumberOfBytesTransferred: ^DWORD, lpCompletionKey: PULONG_PTR, lpOverlapped: ^^OVERLAPPED, dwMilliseconds: DWORD) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatusex) - GetQueuedCompletionStatusEx :: proc(CompletionPort: HANDLE, lpCompletionPortEntries: ^OVERLAPPED_ENTRY, ulCount: c_ulong, ulNumEntriesRemoved: ^c_ulong, dwMilliseconds: DWORD, fAlertable: BOOL) -> BOOL --- + GetQueuedCompletionStatusEx :: proc(CompletionPort: HANDLE, lpCompletionPortEntries: ^OVERLAPPED_ENTRY, ulCount: c_ulong, ulNumEntriesRemoved: ^c_ulong, dwMilliseconds: DWORD, fAlertable: BOOL) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-postqueuedcompletionstatus) - PostQueuedCompletionStatus :: proc(CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: c_ulong, lpOverlapped: ^OVERLAPPED) -> BOOL --- + PostQueuedCompletionStatus :: proc(CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: c_ulong, lpOverlapped: ^OVERLAPPED) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation) - GetHandleInformation :: proc(hObject: HANDLE, lpdwFlags: ^DWORD) -> BOOL --- + GetHandleInformation :: proc(hObject: HANDLE, lpdwFlags: ^DWORD) -> BOOL --- RtlCaptureStackBackTrace :: proc(FramesToSkip: ULONG, FramesToCapture: ULONG, BackTrace: [^]PVOID, BackTraceHash: PULONG) -> USHORT --- RtlNtStatusToDosError :: proc(status: NTSTATUS) -> ULONG --- @@ -625,44 +625,44 @@ THREAD_PRIORITY_IDLE :: THREAD_BASE_PRIORITY_IDLE THREAD_MODE_BACKGROUND_BEGIN :: 0x00010000 THREAD_MODE_BACKGROUND_END :: 0x00020000 -PROCESS_ALL_ACCESS :: 0x000F0000 | SYNCHRONIZE | 0xFFFF -PROCESS_CREATE_PROCESS :: 0x0080 -PROCESS_CREATE_THREAD :: 0x0002 -PROCESS_DUP_HANDLE :: 0x0040 -PROCESS_QUERY_INFORMATION :: 0x0400 +PROCESS_ALL_ACCESS :: 0x000F0000 | SYNCHRONIZE | 0xFFFF +PROCESS_CREATE_PROCESS :: 0x0080 +PROCESS_CREATE_THREAD :: 0x0002 +PROCESS_DUP_HANDLE :: 0x0040 +PROCESS_QUERY_INFORMATION :: 0x0400 PROCESS_QUERY_LIMITED_INFORMATION :: 0x1000 -PROCESS_SET_INFORMATION :: 0x0200 -PROCESS_SET_QUOTA :: 0x0100 -PROCESS_SUSPEND_RESUME :: 0x0800 -PROCESS_TERMINATE :: 0x0001 -PROCESS_VM_OPERATION :: 0x0008 -PROCESS_VM_READ :: 0x0010 -PROCESS_VM_WRITE :: 0x0020 +PROCESS_SET_INFORMATION :: 0x0200 +PROCESS_SET_QUOTA :: 0x0100 +PROCESS_SUSPEND_RESUME :: 0x0800 +PROCESS_TERMINATE :: 0x0001 +PROCESS_VM_OPERATION :: 0x0008 +PROCESS_VM_READ :: 0x0010 +PROCESS_VM_WRITE :: 0x0020 THREAD_ALL_ACCESS :: \ - THREAD_DIRECT_IMPERSONATION | - THREAD_GET_CONTEXT | - THREAD_IMPERSONATE | - THREAD_QUERY_INFORMATION | + THREAD_DIRECT_IMPERSONATION | + THREAD_GET_CONTEXT | + THREAD_IMPERSONATE | + THREAD_QUERY_INFORMATION | THREAD_QUERY_LIMITED_INFORMATION | - THREAD_SET_CONTEXT | - THREAD_SET_INFORMATION | - THREAD_SET_LIMITED_INFORMATION | - THREAD_SET_THREAD_TOKEN | - THREAD_SUSPEND_RESUME | - THREAD_TERMINATE | + THREAD_SET_CONTEXT | + THREAD_SET_INFORMATION | + THREAD_SET_LIMITED_INFORMATION | + THREAD_SET_THREAD_TOKEN | + THREAD_SUSPEND_RESUME | + THREAD_TERMINATE | SYNCHRONIZE -THREAD_DIRECT_IMPERSONATION :: 0x0200 -THREAD_GET_CONTEXT :: 0x0008 -THREAD_IMPERSONATE :: 0x0100 -THREAD_QUERY_INFORMATION :: 0x0040 +THREAD_DIRECT_IMPERSONATION :: 0x0200 +THREAD_GET_CONTEXT :: 0x0008 +THREAD_IMPERSONATE :: 0x0100 +THREAD_QUERY_INFORMATION :: 0x0040 THREAD_QUERY_LIMITED_INFORMATION :: 0x0800 -THREAD_SET_CONTEXT :: 0x0010 -THREAD_SET_INFORMATION :: 0x0020 -THREAD_SET_LIMITED_INFORMATION :: 0x0400 -THREAD_SET_THREAD_TOKEN :: 0x0080 -THREAD_SUSPEND_RESUME :: 0x0002 -THREAD_TERMINATE :: 0x0001 +THREAD_SET_CONTEXT :: 0x0010 +THREAD_SET_INFORMATION :: 0x0020 +THREAD_SET_LIMITED_INFORMATION :: 0x0400 +THREAD_SET_THREAD_TOKEN :: 0x0080 +THREAD_SUSPEND_RESUME :: 0x0002 +THREAD_TERMINATE :: 0x0001 COPY_FILE_FAIL_IF_EXISTS :: 0x00000001 COPY_FILE_RESTARTABLE :: 0x00000002 @@ -701,7 +701,7 @@ FILE_MAP_TARGETS_INVALID :: DWORD(0x40000000) FILE_MAP_LARGE_PAGES :: DWORD(0x20000000) LOCKFILE_FAIL_IMMEDIATELY :: DWORD (0x00000001) -LOCKFILE_EXCLUSIVE_LOCK :: DWORD(0x00000002) +LOCKFILE_EXCLUSIVE_LOCK :: DWORD(0x00000002) // Flags for `SetFileCompletionNotificationModes`. FILE_SKIP_COMPLETION_PORT_ON_SUCCESS :: 0x1 @@ -720,16 +720,16 @@ PAGE_NOCACHE :: 0x200 PAGE_WRITECOMBINE :: 0x400 MEMORY_BASIC_INFORMATION :: struct { - BaseAddress: PVOID, - AllocationBase: PVOID, + BaseAddress: PVOID, + AllocationBase: PVOID, AllocationProtect: DWORD, - PartitionId: WORD, - RegionSize: SIZE_T, - State: DWORD, - Protect: DWORD, - Type: DWORD, + PartitionId: WORD, + RegionSize: SIZE_T, + State: DWORD, + Protect: DWORD, + Type: DWORD, } -PMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION +PMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION LPMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION MEM_COMMIT :: 0x1000 @@ -747,97 +747,97 @@ MEM_4MB_PAGES :: 0x80000000 @(default_calling_convention="system") foreign kernel32 { VirtualAlloc :: proc( - lpAddress: LPVOID, - dwSize: SIZE_T, + lpAddress: LPVOID, + dwSize: SIZE_T, flAllocationType: DWORD, - flProtect: DWORD, + flProtect: DWORD, ) -> LPVOID --- VirtualProtect :: proc( - lpAddress: LPVOID, - dwSize: SIZE_T, - flNewProtect: DWORD, + lpAddress: LPVOID, + dwSize: SIZE_T, + flNewProtect: DWORD, lpflOldProtect: PDWORD, ) -> BOOL --- VirtualFree :: proc( - lpAddress: LPVOID, - dwSize: SIZE_T, + lpAddress: LPVOID, + dwSize: SIZE_T, dwFreeType: DWORD, ) -> BOOL --- VirtualQuery :: proc( lpAddress: LPCVOID, - lpBuffer: PMEMORY_BASIC_INFORMATION, - dwLength: SIZE_T, + lpBuffer: PMEMORY_BASIC_INFORMATION, + dwLength: SIZE_T, ) -> SIZE_T --- VirtualAllocEx :: proc( - hProcess: HANDLE, - lpAddress: LPVOID, - dwSize: SIZE_T, + hProcess: HANDLE, + lpAddress: LPVOID, + dwSize: SIZE_T, flAllocationType: DWORD, - flProtect: DWORD, + flProtect: DWORD, ) -> LPVOID --- VirtualFreeEx :: proc( - hProcess: HANDLE, - lpAddress: LPVOID, - dwSize: SIZE_T, + hProcess: HANDLE, + lpAddress: LPVOID, + dwSize: SIZE_T, dwFreeType: DWORD, ) -> BOOL --- VirtualProtectEx :: proc( - hProcess: HANDLE, - lpAddress: LPVOID, - dwSize: SIZE_T, - flNewProtect: DWORD, + hProcess: HANDLE, + lpAddress: LPVOID, + dwSize: SIZE_T, + flNewProtect: DWORD, lpflOldProtect: PDWORD, ) -> BOOL --- VirtualQueryEx :: proc( - hProcess: HANDLE, + hProcess: HANDLE, lpAddress: LPCVOID, - lpBuffer: PMEMORY_BASIC_INFORMATION, - dwLength: SIZE_T, + lpBuffer: PMEMORY_BASIC_INFORMATION, + dwLength: SIZE_T, ) -> SIZE_T --- ReadProcessMemory :: proc( - hProcess: HANDLE, - lpBaseAddress: LPCVOID, - lpBuffer: LPVOID, - nSize: SIZE_T, + hProcess: HANDLE, + lpBaseAddress: LPCVOID, + lpBuffer: LPVOID, + nSize: SIZE_T, lpNumberOfBytesRead: ^SIZE_T, ) -> BOOL --- WriteProcessMemory :: proc( - hProcess: HANDLE, - lpBaseAddress: LPVOID, - lpBuffer: LPCVOID, - nSize: SIZE_T, + hProcess: HANDLE, + lpBaseAddress: LPVOID, + lpBuffer: LPCVOID, + nSize: SIZE_T, lpNumberOfBytesWritten: ^SIZE_T, ) -> BOOL --- CreateFileMappingW :: proc( - hFile: HANDLE, + hFile: HANDLE, lpFileMappingAttributes: LPSECURITY_ATTRIBUTES, - flProtect: DWORD, - dwMaximumSizeHigh: DWORD, - dwMaximumSizeLow: DWORD, - lpName: LPCWSTR, + flProtect: DWORD, + dwMaximumSizeHigh: DWORD, + dwMaximumSizeLow: DWORD, + lpName: LPCWSTR, ) -> HANDLE --- OpenFileMappingW :: proc( dwDesiredAccess: DWORD, - bInheritHandle: BOOL, - lpName: LPCWSTR, + bInheritHandle: BOOL, + lpName: LPCWSTR, ) -> HANDLE --- MapViewOfFile :: proc( - hFileMappingObject: HANDLE, - dwDesiredAccess: DWORD, - dwFileOffsetHigh: DWORD, - dwFileOffsetLow: DWORD, + hFileMappingObject: HANDLE, + dwDesiredAccess: DWORD, + dwFileOffsetHigh: DWORD, + dwFileOffsetLow: DWORD, dwNumberOfBytesToMap: SIZE_T, ) -> LPVOID --- MapViewOfFileEx :: proc( - hFileMappingObject: HANDLE, - dwDesiredAccess: DWORD, - dwFileOffsetHigh: DWORD, - dwFileOffsetLow: DWORD, + hFileMappingObject: HANDLE, + dwDesiredAccess: DWORD, + dwFileOffsetHigh: DWORD, + dwFileOffsetLow: DWORD, dwNumberOfBytesToMap: SIZE_T, - lpBaseAddress: LPVOID, + lpBaseAddress: LPVOID, ) -> LPVOID --- FlushViewOfFile :: proc( - lpBaseAddress: LPCVOID, + lpBaseAddress: LPCVOID, dwNumberOfBytesToFlush: SIZE_T, ) -> BOOL --- UnmapViewOfFile :: proc( @@ -845,36 +845,36 @@ foreign kernel32 { ) -> BOOL --- GetLargePageMinimum :: proc() -> SIZE_T --- GetProcessWorkingSetSizeEx :: proc( - hProcess: HANDLE, + hProcess: HANDLE, lpMinimumWorkingSetSize: PSIZE_T, lpMaximumWorkingSetSize: PSIZE_T, - Flags: PDWORD, + Flags: PDWORD, ) -> BOOL --- SetProcessWorkingSetSizeEx :: proc( - hProcess: HANDLE, + hProcess: HANDLE, dwMinimumWorkingSetSize: SIZE_T, dwMaximumWorkingSetSize: SIZE_T, - Flags: DWORD, + Flags: DWORD, ) -> BOOL --- VirtualLock :: proc( lpAddress: LPVOID, - dwSize: SIZE_T, + dwSize: SIZE_T, ) -> BOOL --- VirtualUnlock :: proc( lpAddress: LPVOID, - dwSize: SIZE_T, + dwSize: SIZE_T, ) -> BOOL --- GetWriteWatch :: proc( - dwFlags: DWORD, - lpBaseAddress: PVOID, - dwRegionSize: SIZE_T, - lpAddresses: ^PVOID, - lpdwCount: ^ULONG_PTR, + dwFlags: DWORD, + lpBaseAddress: PVOID, + dwRegionSize: SIZE_T, + lpAddresses: ^PVOID, + lpdwCount: ^ULONG_PTR, lpdwGranularity: LPDWORD, ) -> UINT --- ResetWriteWatch :: proc( lpBaseAddress: LPVOID, - dwRegionSize: SIZE_T, + dwRegionSize: SIZE_T, ) -> UINT --- } @@ -907,27 +907,27 @@ foreign kernel32 { GetSystemFileCacheSize :: proc( lpMinimumFileCacheSize: PSIZE_T, lpMaximumFileCacheSize: PSIZE_T, - lpFlags: PDWORD, + lpFlags: PDWORD, ) -> BOOL --- SetSystemFileCacheSize :: proc( MinimumFileCacheSize: SIZE_T, MaximumFileCacheSize: SIZE_T, - Flags: DWORD, + Flags: DWORD, ) -> BOOL --- CreateFileMappingNumaW :: proc( - hFile: HANDLE, + hFile: HANDLE, lpFileMappingAttributes: LPSECURITY_ATTRIBUTES, - flProtect: DWORD, - dwMaximumSizeHigh: DWORD, - dwMaximumSizeLow: DWORD, - lpName: LPCWSTR, - nndPreferred: DWORD, + flProtect: DWORD, + dwMaximumSizeHigh: DWORD, + dwMaximumSizeLow: DWORD, + lpName: LPCWSTR, + nndPreferred: DWORD, ) -> HANDLE --- } WIN32_MEMORY_RANGE_ENTRY :: struct { VirtualAddress: PVOID, - NumberOfBytes: SIZE_T, + NumberOfBytes: SIZE_T, } PWIN32_MEMORY_RANGE_ENTRY :: ^WIN32_MEMORY_RANGE_ENTRY @@ -935,56 +935,56 @@ PWIN32_MEMORY_RANGE_ENTRY :: ^WIN32_MEMORY_RANGE_ENTRY @(default_calling_convention="system") foreign kernel32 { PrefetchVirtualMemory :: proc( - hProcess: HANDLE, - NumberOfEntries: ULONG_PTR, + hProcess: HANDLE, + NumberOfEntries: ULONG_PTR, VirtualAddresses: PWIN32_MEMORY_RANGE_ENTRY, - Flags: ULONG, + Flags: ULONG, ) -> BOOL --- CreateFileMappingFromApp :: proc( - hFile: HANDLE, + hFile: HANDLE, SecurityAttributes: PSECURITY_ATTRIBUTES, - PageProtection: ULONG, - MaximumSize: ULONG64, - Name: PCWSTR, + PageProtection: ULONG, + MaximumSize: ULONG64, + Name: PCWSTR, ) -> HANDLE --- MapViewOfFileFromApp :: proc( hFileMappingObject: HANDLE, - DesiredAccess: ULONG, - FileOffset: ULONG64, + DesiredAccess: ULONG, + FileOffset: ULONG64, NumberOfBytesToMap: SIZE_T, ) -> PVOID --- UnmapViewOfFileEx :: proc( BaseAddress: PVOID, - UnmapFlags: ULONG, + UnmapFlags: ULONG, ) -> BOOL --- AllocateUserPhysicalPages :: proc( - hProcess: HANDLE, + hProcess: HANDLE, NumberOfPages: PULONG_PTR, - PageArray: PULONG_PTR, + PageArray: PULONG_PTR, ) -> BOOL --- FreeUserPhysicalPages :: proc( - hProcess: HANDLE, + hProcess: HANDLE, NumberOfPages: PULONG_PTR, - PageArray: PULONG_PTR, + PageArray: PULONG_PTR, ) -> BOOL --- MapUserPhysicalPages :: proc( VirtualAddress: PVOID, - NumberOfPages: ULONG_PTR, - PageArray: PULONG_PTR, + NumberOfPages: ULONG_PTR, + PageArray: PULONG_PTR, ) -> BOOL --- AllocateUserPhysicalPagesNuma :: proc( - hProcess: HANDLE, + hProcess: HANDLE, NumberOfPages: PULONG_PTR, - PageArray: PULONG_PTR, - nndPreferred: DWORD, + PageArray: PULONG_PTR, + nndPreferred: DWORD, ) -> BOOL --- VirtualAllocExNuma :: proc( - hProcess: HANDLE, - lpAddress: LPVOID, - dwSize: SIZE_T, + hProcess: HANDLE, + lpAddress: LPVOID, + dwSize: SIZE_T, flAllocationType: DWORD, - flProtect: DWORD, - nndPreferred: DWORD, + flProtect: DWORD, + nndPreferred: DWORD, ) -> LPVOID --- } @@ -992,28 +992,20 @@ MEHC_PATROL_SCRUBBER_PRESENT :: ULONG(0x1) @(default_calling_convention="system") foreign kernel32 { - GetMemoryErrorHandlingCapabilities :: proc( - Capabilities: PULONG, - ) -> BOOL --- + GetMemoryErrorHandlingCapabilities :: proc(Capabilities: PULONG) -> BOOL --- } @(default_calling_convention="system") foreign kernel32 { - GlobalMemoryStatusEx :: proc( - lpBuffer: ^MEMORYSTATUSEX, - ) -> BOOL --- + GlobalMemoryStatusEx :: proc(lpBuffer: ^MEMORYSTATUSEX) -> BOOL --- } PBAD_MEMORY_CALLBACK_ROUTINE :: #type proc "system" () @(default_calling_convention="system") foreign kernel32 { - RegisterBadMemoryNotification :: proc( - Callback: PBAD_MEMORY_CALLBACK_ROUTINE, - ) -> PVOID --- - UnregisterBadMemoryNotification :: proc( - RegistrationHandle: PVOID, - ) -> BOOL --- + RegisterBadMemoryNotification :: proc(Callback: PBAD_MEMORY_CALLBACK_ROUTINE) -> PVOID --- + UnregisterBadMemoryNotification :: proc(RegistrationHandle: PVOID) -> BOOL --- } OFFER_PRIORITY :: enum c_int { @@ -1031,33 +1023,33 @@ VmOfferPriorityNormal :: OFFER_PRIORITY.VmOfferPriorityNormal foreign kernel32 { OfferVirtualMemory :: proc( VirtualAddress: PVOID, - Size: SIZE_T, - Priority: OFFER_PRIORITY, + Size: SIZE_T, + Priority: OFFER_PRIORITY, ) -> DWORD --- ReclaimVirtualMemory :: proc( VirtualAddress: PVOID, - Size: SIZE_T, + Size: SIZE_T, ) -> DWORD --- DiscardVirtualMemory :: proc( VirtualAddress: PVOID, - Size: SIZE_T, + Size: SIZE_T, ) -> DWORD --- VirtualAllocFromApp :: proc( - BaseAddress: PVOID, - Size: SIZE_T, + BaseAddress: PVOID, + Size: SIZE_T, AllocationType: ULONG, - Protection: ULONG, + Protection: ULONG, ) -> PVOID --- VirtualProtectFromApp :: proc( - Address: PVOID, - Size: SIZE_T, + Address: PVOID, + Size: SIZE_T, NewProtection: ULONG, OldProtection: PULONG, ) -> BOOL --- OpenFileMappingFromApp :: proc( DesiredAccess: ULONG, InheritHandle: BOOL, - Name: PCWSTR, + Name: PCWSTR, ) -> HANDLE --- } @@ -1067,54 +1059,48 @@ WIN32_MEMORY_INFORMATION_CLASS :: enum c_int { MemoryRegionInfo :: WIN32_MEMORY_INFORMATION_CLASS.MemoryRegionInfo WIN32_MEMORY_REGION_INFORMATION :: struct { - AllocationBase: PVOID, + AllocationBase: PVOID, AllocationProtect: ULONG, - u: WIN32_MEMORY_REGION_INFORMATION_u, + using DUMMYUNIONNAME: struct #raw_union { + _: [1]u32, + Flags: ULONG, + using DUMMYSTRUCTNAME: bit_field ULONG { + Private: ULONG | 1, + MappedDataFile: ULONG | 1, + MappedImage: ULONG | 1, + MappedPageFile: ULONG | 1, + MappedPhysical: ULONG | 1, + DirectMapped: ULONG | 1, + Reserved: ULONG | 26, + }, + }, RegionSize: SIZE_T, CommitSize: SIZE_T, } -WIN32_MEMORY_REGION_INFORMATION_u :: struct #raw_union { - u: [1]u32, - Flags: ULONG, - s: WIN32_MEMORY_REGION_INFORMATION_u_s, -} -WIN32_MEMORY_REGION_INFORMATION_u_s :: struct { - Bitfield: ULONG, -} -WIN32_MEMORY_REGION_INFORMATION_u_s_Bitfield :: distinct ULONG -/*bit_field #align(align_of(ULONG)) { - Private : 1-0, - MappedDataFile : 2-1, - MappedImage : 3-2, - MappedPageFile : 4-3, - MappedPhysical : 5-4, - DirectMapped : 6-5, - Reserved : 32-6, -}*/ @(default_calling_convention="system") foreign one_core { QueryVirtualMemoryInformation :: proc( - Process: HANDLE, - VirtualAddress: PVOID, + Process: HANDLE, + VirtualAddress: PVOID, MemoryInformationClass: WIN32_MEMORY_INFORMATION_CLASS, - MemoryInformation: PVOID, - MemoryInformationSize: SIZE_T, - ReturnSize: PSIZE_T, + MemoryInformation: PVOID, + MemoryInformationSize: SIZE_T, + ReturnSize: PSIZE_T, ) -> BOOL --- MapViewOfFileNuma2 :: proc( FileMappingHandle: HANDLE, - ProcessHandle: HANDLE, - Offset: ULONG64, - BaseAddress: PVOID, - ViewSize: SIZE_T, - AllocationType: ULONG, - PageProtection: ULONG, - PreferredNode: ULONG, + ProcessHandle: HANDLE, + Offset: ULONG64, + BaseAddress: PVOID, + ViewSize: SIZE_T, + AllocationType: ULONG, + PageProtection: ULONG, + PreferredNode: ULONG, ) -> PVOID --- GetCommPorts :: proc( - lpPortNumbers: PULONG, - uPortNumbersCount: ULONG, + lpPortNumbers: PULONG, + uPortNumbersCount: ULONG, puPortNumbersFound: PULONG, ) -> ULONG --- } @@ -1124,12 +1110,12 @@ NUMA_NO_PREFERRED_NODE :: 0xffffffff MapViewOfFile2 :: #force_inline proc "system" ( FileMappingHandle: HANDLE, - ProcessHandle: HANDLE, - Offset: ULONG64, - BaseAddress: PVOID, - ViewSize: SIZE_T, - AllocationType: ULONG, - PageProtection: ULONG, + ProcessHandle: HANDLE, + Offset: ULONG64, + BaseAddress: PVOID, + ViewSize: SIZE_T, + AllocationType: ULONG, + PageProtection: ULONG, ) -> PVOID { return MapViewOfFileNuma2( FileMappingHandle, @@ -1147,8 +1133,8 @@ MapViewOfFile2 :: #force_inline proc "system" ( foreign kernel32 { UnmapViewOfFile2 :: proc( ProcessHandle: HANDLE, - BaseAddress: PVOID, - UnmapFlags: ULONG, + BaseAddress: PVOID, + UnmapFlags: ULONG, ) -> BOOL --- } @@ -1159,7 +1145,7 @@ foreign kernel32 { OSMinorVersion: DWORD, SpMajorVersion: DWORD, SpMinorVersion: DWORD, - product_type: ^Windows_Product_Type, + product_type: ^Windows_Product_Type, ) -> BOOL --- } @@ -1173,10 +1159,10 @@ LPFIBER_START_ROUTINE :: #type proc "system" (lpFiberParameter: LPVOID) @(default_calling_convention = "system") foreign kernel32 { - CreateFiber :: proc(dwStackSize: SIZE_T, lpStartAddress: LPFIBER_START_ROUTINE, lpParameter: LPVOID) -> LPVOID --- - DeleteFiber :: proc(lpFiber: LPVOID) --- + CreateFiber :: proc(dwStackSize: SIZE_T, lpStartAddress: LPFIBER_START_ROUTINE, lpParameter: LPVOID) -> LPVOID --- + DeleteFiber :: proc(lpFiber: LPVOID) --- ConvertThreadToFiber :: proc(lpParameter: LPVOID) -> LPVOID --- - SwitchToFiber :: proc(lpFiber: LPVOID) --- + SwitchToFiber :: proc(lpFiber: LPVOID) --- } LOGICAL_PROCESSOR_RELATIONSHIP :: enum c_int { @@ -1199,11 +1185,11 @@ PROCESSOR_CACHE_TYPE :: enum c_int { } CACHE_DESCRIPTOR :: struct { - Level: BYTE, + Level: BYTE, Associativity: BYTE, - LineSize: WORD, - Size: DWORD, - Type: PROCESSOR_CACHE_TYPE, + LineSize: WORD, + Size: DWORD, + Type: PROCESSOR_CACHE_TYPE, } ProcessorCore :: struct { @@ -1212,17 +1198,16 @@ ProcessorCore :: struct { NumaNode :: struct { NodeNumber: DWORD, } -DUMMYUNIONNAME_u :: struct #raw_union { - Core: ProcessorCore, - Node: NumaNode, - Cache: CACHE_DESCRIPTOR, - Reserved: [2]ULONGLONG, -} SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: struct { ProcessorMask: ULONG_PTR, - Relationship: LOGICAL_PROCESSOR_RELATIONSHIP, - using DummyUnion: DUMMYUNIONNAME_u, + Relationship: LOGICAL_PROCESSOR_RELATIONSHIP, + using DUMMYUNIONNAME: struct #raw_union { + ProcessorCore: ProcessorCore `raw_union_tag:"Relationship=RelationProcessorCore"`, + NumaNode: NumaNode `raw_union_tag:"Relationship=RelationNumaNode"`, + Cache: CACHE_DESCRIPTOR `raw_union_tag:"Relationship=RelationCache"`, + Reserved: [2]ULONGLONG, + }, } SYSTEM_POWER_STATUS :: struct { @@ -1294,6 +1279,6 @@ ACTCTX_FLAG_HMODULE_VALID :: 0x080 @(default_calling_convention="system") foreign kernel32 { - CreateActCtxW :: proc(pActCtx: ^ACTCTXW) -> HANDLE --- + CreateActCtxW :: proc(pActCtx: ^ACTCTXW) -> HANDLE --- ActivateActCtx :: proc(hActCtx: HANDLE, lpCookie: ^ULONG_PTR) -> BOOL --- } From 006681ec2240d46b977f04ab7d7c8e280ad2cb67 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 11:18:48 +0000 Subject: [PATCH 138/766] Improve formatting; fix types; add struct field tags --- core/sys/windows/key_codes.odin | 8 +- core/sys/windows/netapi32.odin | 30 +- core/sys/windows/ole32.odin | 32 +- core/sys/windows/shcore.odin | 10 +- core/sys/windows/shell32.odin | 26 +- core/sys/windows/tlhelp.odin | 102 +- core/sys/windows/types.odin | 2413 ++++++++++++++++--------------- 7 files changed, 1315 insertions(+), 1306 deletions(-) diff --git a/core/sys/windows/key_codes.odin b/core/sys/windows/key_codes.odin index 0991ca4b3..a2910ecd1 100644 --- a/core/sys/windows/key_codes.odin +++ b/core/sys/windows/key_codes.odin @@ -3,11 +3,11 @@ package sys_windows // https://docs.microsoft.com/en-us/windows/win32/inputdev/about-keyboard-input KF_EXTENDED :: 0x0100 -KF_DLGMODE :: 0x0800 +KF_DLGMODE :: 0x0800 KF_MENUMODE :: 0x1000 -KF_ALTDOWN :: 0x2000 -KF_REPEAT :: 0x4000 -KF_UP :: 0x8000 +KF_ALTDOWN :: 0x2000 +KF_REPEAT :: 0x4000 +KF_UP :: 0x8000 // https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes // Virtual Keys, Standard Set diff --git a/core/sys/windows/netapi32.odin b/core/sys/windows/netapi32.odin index 9442193ca..759c5847a 100644 --- a/core/sys/windows/netapi32.odin +++ b/core/sys/windows/netapi32.odin @@ -7,32 +7,32 @@ foreign import netapi32 "system:Netapi32.lib" foreign netapi32 { NetUserAdd :: proc( servername: wstring, - level: DWORD, - user_info: ^USER_INFO_1, // Perhaps make this a #raw_union with USER_INFO1..4 when we need the other levels. - parm_err: ^DWORD, + level: DWORD, + user_info: ^USER_INFO_1, // Perhaps make this a #raw_union with USER_INFO1..4 when we need the other levels. + parm_err: ^DWORD, ) -> NET_API_STATUS --- NetUserDel :: proc( servername: wstring, - username: wstring, + username: wstring, ) -> NET_API_STATUS --- NetUserGetInfo :: proc( servername: wstring, - username: wstring, - level: DWORD, - user_info: ^USER_INFO_1, + username: wstring, + level: DWORD, + user_info: ^USER_INFO_1, ) -> NET_API_STATUS --- NetLocalGroupAddMembers :: proc( - servername: wstring, - groupname: wstring, - level: DWORD, + servername: wstring, + groupname: wstring, + level: DWORD, group_members_info: ^LOCALGROUP_MEMBERS_INFO_0, // Actually a variably sized array of these. - totalentries: DWORD, + totalentries: DWORD, ) -> NET_API_STATUS --- NetLocalGroupDelMembers :: proc( - servername: wstring, - groupname: wstring, - level: DWORD, + servername: wstring, + groupname: wstring, + level: DWORD, group_members_info: ^LOCALGROUP_MEMBERS_INFO_0, // Actually a variably sized array of these. - totalentries: DWORD, + totalentries: DWORD, ) -> NET_API_STATUS --- } \ No newline at end of file diff --git a/core/sys/windows/ole32.odin b/core/sys/windows/ole32.odin index 32cb6fd60..12cf40b81 100644 --- a/core/sys/windows/ole32.odin +++ b/core/sys/windows/ole32.odin @@ -41,32 +41,32 @@ LPUNKNOWN :: ^IUnknown @(default_calling_convention="system") foreign Ole32 { - CoInitialize :: proc(reserved: rawptr = nil) -> HRESULT --- + CoInitialize :: proc(reserved: rawptr = nil) -> HRESULT --- CoInitializeEx :: proc(reserved: rawptr = nil, co_init: COINIT = .APARTMENTTHREADED) -> HRESULT --- CoUninitialize :: proc() --- CoCreateInstance :: proc( - rclsid: REFCLSID, - pUnkOuter: LPUNKNOWN, + rclsid: REFCLSID, + pUnkOuter: LPUNKNOWN, dwClsContext: DWORD, - riid: REFIID, - ppv: ^LPVOID, + riid: REFIID, + ppv: ^LPVOID, ) -> HRESULT --- - CoTaskMemAlloc :: proc(cb: SIZE_T) -> rawptr --- + CoTaskMemAlloc :: proc(cb: SIZE_T) -> rawptr --- CoTaskMemRealloc :: proc(pv: rawptr, cb: SIZE_T) -> rawptr --- - CoTaskMemFree :: proc(pv: rawptr) --- + CoTaskMemFree :: proc(pv: rawptr) --- - CLSIDFromProgID :: proc(lpszProgID: LPCOLESTR, lpclsid: LPCLSID) -> HRESULT --- + CLSIDFromProgID :: proc(lpszProgID: LPCOLESTR, lpclsid: LPCLSID) -> HRESULT --- CLSIDFromProgIDEx :: proc(lpszProgID: LPCOLESTR, lpclsid: LPCLSID) -> HRESULT --- - CLSIDFromString :: proc(lpsz: LPOLESTR, pclsid: LPCLSID) -> HRESULT --- - IIDFromString :: proc(lpsz: LPOLESTR, lpiid: LPIID) -> HRESULT --- - ProgIDFromCLSID :: proc(clsid: REFCLSID, lplpszProgID: ^LPOLESTR) -> HRESULT --- - StringFromCLSID :: proc(rclsid: REFCLSID, lplpsz: ^LPOLESTR) -> HRESULT --- - StringFromGUID2 :: proc(rclsid: REFCLSID, lplpsz: LPOLESTR, cchMax: INT) -> INT --- - StringFromIID :: proc(rclsid: REFIID, lplpsz: ^LPOLESTR) -> HRESULT --- + CLSIDFromString :: proc(lpsz: LPOLESTR, pclsid: LPCLSID) -> HRESULT --- + IIDFromString :: proc(lpsz: LPOLESTR, lpiid: LPIID) -> HRESULT --- + ProgIDFromCLSID :: proc(clsid: REFCLSID, lplpszProgID: ^LPOLESTR) -> HRESULT --- + StringFromCLSID :: proc(rclsid: REFCLSID, lplpsz: ^LPOLESTR) -> HRESULT --- + StringFromGUID2 :: proc(rclsid: REFCLSID, lplpsz: LPOLESTR, cchMax: INT) -> INT --- + StringFromIID :: proc(rclsid: REFIID, lplpsz: ^LPOLESTR) -> HRESULT --- - PropVariantClear :: proc(pvar: ^PROPVARIANT) -> HRESULT --- - PropVariantCopy :: proc(pvarDest: ^PROPVARIANT, pvarSrc: ^PROPVARIANT) -> HRESULT --- + PropVariantClear :: proc(pvar: ^PROPVARIANT) -> HRESULT --- + PropVariantCopy :: proc(pvarDest: ^PROPVARIANT, pvarSrc: ^PROPVARIANT) -> HRESULT --- FreePropVariantArray :: proc(cVariants: ULONG, rgvars: ^PROPVARIANT) -> HRESULT --- } diff --git a/core/sys/windows/shcore.odin b/core/sys/windows/shcore.odin index 08a76ebe6..c7d784fe8 100644 --- a/core/sys/windows/shcore.odin +++ b/core/sys/windows/shcore.odin @@ -8,18 +8,18 @@ foreign import shcore "system:Shcore.lib" foreign shcore { GetProcessDpiAwareness :: proc(hprocess: HANDLE, value: ^PROCESS_DPI_AWARENESS) -> HRESULT --- SetProcessDpiAwareness :: proc(value: PROCESS_DPI_AWARENESS) -> HRESULT --- - GetDpiForMonitor :: proc(hmonitor: HMONITOR, dpiType: MONITOR_DPI_TYPE, dpiX: ^UINT, dpiY: ^UINT) -> HRESULT --- + GetDpiForMonitor :: proc(hmonitor: HMONITOR, dpiType: MONITOR_DPI_TYPE, dpiX: ^UINT, dpiY: ^UINT) -> HRESULT --- } PROCESS_DPI_AWARENESS :: enum DWORD { - PROCESS_DPI_UNAWARE = 0, - PROCESS_SYSTEM_DPI_AWARE = 1, + PROCESS_DPI_UNAWARE = 0, + PROCESS_SYSTEM_DPI_AWARE = 1, PROCESS_PER_MONITOR_DPI_AWARE = 2, } MONITOR_DPI_TYPE :: enum DWORD { MDT_EFFECTIVE_DPI = 0, - MDT_ANGULAR_DPI = 1, - MDT_RAW_DPI = 2, + MDT_ANGULAR_DPI = 1, + MDT_RAW_DPI = 2, MDT_DEFAULT, } diff --git a/core/sys/windows/shell32.odin b/core/sys/windows/shell32.odin index 54cee718c..c7d83f9f6 100644 --- a/core/sys/windows/shell32.odin +++ b/core/sys/windows/shell32.odin @@ -22,29 +22,29 @@ foreign shell32 { ) -> c_int --- SHFileOperationW :: proc(lpFileOp: LPSHFILEOPSTRUCTW) -> c_int --- SHGetFolderPathW :: proc(hwnd: HWND, csidl: c_int, hToken: HANDLE, dwFlags: DWORD, pszPath: LPWSTR) -> HRESULT --- - SHAppBarMessage :: proc(dwMessage: DWORD, pData: PAPPBARDATA) -> UINT_PTR --- + SHAppBarMessage :: proc(dwMessage: DWORD, pData: PAPPBARDATA) -> UINT_PTR --- Shell_NotifyIconW :: proc(dwMessage: DWORD, lpData: ^NOTIFYICONDATAW) -> BOOL --- - SHChangeNotify :: proc(wEventId: LONG, uFlags: UINT, dwItem1: LPCVOID, dwItem2: LPCVOID) --- + SHChangeNotify :: proc(wEventId: LONG, uFlags: UINT, dwItem1: LPCVOID, dwItem2: LPCVOID) --- SHGetKnownFolderIDList :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, ppidl: rawptr) -> HRESULT --- - SHSetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, pszPath: PCWSTR ) -> HRESULT --- - SHGetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, ppszPath: ^LPWSTR) -> HRESULT --- + SHSetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, pszPath: PCWSTR ) -> HRESULT --- + SHGetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, ppszPath: ^LPWSTR) -> HRESULT --- - ExtractIconExW :: proc(pszFile: LPCWSTR, nIconIndex: INT, phiconLarge: ^HICON, phiconSmall: ^HICON, nIcons: UINT) -> UINT --- + ExtractIconExW :: proc(pszFile: LPCWSTR, nIconIndex: INT, phiconLarge: ^HICON, phiconSmall: ^HICON, nIcons: UINT) -> UINT --- DragAcceptFiles :: proc(hWnd: HWND, fAccept: BOOL) --- - DragQueryPoint :: proc(hDrop: HDROP, ppt: ^POINT) -> BOOL --- - DragQueryFileW :: proc(hDrop: HDROP, iFile: UINT, lpszFile: LPWSTR, cch: UINT) -> UINT --- - DragFinish :: proc(hDrop: HDROP) --- // @New + DragQueryPoint :: proc(hDrop: HDROP, ppt: ^POINT) -> BOOL --- + DragQueryFileW :: proc(hDrop: HDROP, iFile: UINT, lpszFile: LPWSTR, cch: UINT) -> UINT --- + DragFinish :: proc(hDrop: HDROP) --- // @New } APPBARDATA :: struct { - cbSize: DWORD, - hWnd: HWND, + cbSize: DWORD, + hWnd: HWND, uCallbackMessage: UINT, - uEdge: UINT, - rc: RECT, - lParam: LPARAM, + uEdge: UINT, + rc: RECT, + lParam: LPARAM, } PAPPBARDATA :: ^APPBARDATA diff --git a/core/sys/windows/tlhelp.odin b/core/sys/windows/tlhelp.odin index 006c9c330..b23b4b06a 100644 --- a/core/sys/windows/tlhelp.odin +++ b/core/sys/windows/tlhelp.odin @@ -5,22 +5,22 @@ foreign import kernel32 "system:Kernel32.lib" @(default_calling_convention="system") foreign kernel32 { - CreateToolhelp32Snapshot :: proc (dwFlags: DWORD, th32ProcessID: DWORD) -> HANDLE --- - Process32FirstW :: proc (hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL --- - Process32NextW :: proc (hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL --- - Thread32First :: proc (hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL --- - Thread32Next :: proc (hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL --- - Module32FirstW :: proc (hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL --- - Module32NextW :: proc (hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL --- - Heap32ListFirst :: proc (hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL --- - Heap32ListNext :: proc (hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL --- - Heap32First :: proc (lphe: LPHEAPENTRY32, th32ProcessID: DWORD, th32HeapID: ULONG_PTR) -> BOOL --- - Heap32Next :: proc (lphe: LPHEAPENTRY32) -> BOOL --- - Toolhelp32ReadProcessMemory :: proc ( - th32ProcessID: DWORD, - lpBaseAddress: LPCVOID, - lpBuffer: LPVOID, - cbRead: SIZE_T, + CreateToolhelp32Snapshot :: proc(dwFlags: DWORD, th32ProcessID: DWORD) -> HANDLE --- + Process32FirstW :: proc(hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL --- + Process32NextW :: proc(hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL --- + Thread32First :: proc(hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL --- + Thread32Next :: proc(hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL --- + Module32FirstW :: proc(hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL --- + Module32NextW :: proc(hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL --- + Heap32ListFirst :: proc(hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL --- + Heap32ListNext :: proc(hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL --- + Heap32First :: proc(lphe: LPHEAPENTRY32, th32ProcessID: DWORD, th32HeapID: ULONG_PTR) -> BOOL --- + Heap32Next :: proc(lphe: LPHEAPENTRY32) -> BOOL --- + Toolhelp32ReadProcessMemory :: proc( + th32ProcessID: DWORD, + lpBaseAddress: LPCVOID, + lpBuffer: LPVOID, + cbRead: SIZE_T, lpNumberOfBytesRead: ^SIZE_T, ) -> BOOL --- } @@ -36,66 +36,66 @@ TH32CS_SNAPMODULE32 :: 0x00000010 TH32CS_SNAPALL :: TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE PROCESSENTRY32W :: struct { - dwSize: DWORD, - cntUsage: DWORD, - th32ProcessID: DWORD, - th32DefaultHeapID: ULONG_PTR, - th32ModuleID: DWORD, - cntThreads: DWORD, + dwSize: DWORD, + cntUsage: DWORD, + th32ProcessID: DWORD, + th32DefaultHeapID: ULONG_PTR, + th32ModuleID: DWORD, + cntThreads: DWORD, th32ParentProcessID: DWORD, - pcPriClassBase: LONG, - dwFlags: DWORD, - szExeFile: [MAX_PATH]WCHAR, + pcPriClassBase: LONG, + dwFlags: DWORD, + szExeFile: [MAX_PATH]WCHAR, } LPPROCESSENTRY32W :: ^PROCESSENTRY32W THREADENTRY32 :: struct { - dwSize: DWORD, - cntUsage: DWORD, - th32ThreadID: DWORD, + dwSize: DWORD, + cntUsage: DWORD, + th32ThreadID: DWORD, th32OwnerProcessID: DWORD, - tpBasePri: LONG, - tpDeltaPri: LONG, - dwFlags: DWORD, + tpBasePri: LONG, + tpDeltaPri: LONG, + dwFlags: DWORD, } LPTHREADENTRY32 :: ^THREADENTRY32 MODULEENTRY32W :: struct { - dwSize: DWORD, - th32ModuleID: DWORD, + dwSize: DWORD, + th32ModuleID: DWORD, th32ProcessID: DWORD, - GlblcntUsage: DWORD, - ProccntUsage: DWORD, - modBaseAddr: ^BYTE, - modBaseSize: DWORD, - hModule: HMODULE, - szModule: [MAX_MODULE_NAME32 + 1]WCHAR, - szExePath: [MAX_PATH]WCHAR, + GlblcntUsage: DWORD, + ProccntUsage: DWORD, + modBaseAddr: ^BYTE, + modBaseSize: DWORD, + hModule: HMODULE, + szModule: [MAX_MODULE_NAME32 + 1]WCHAR, + szExePath: [MAX_PATH]WCHAR, } LPMODULEENTRY32W :: ^MODULEENTRY32W HEAPLIST32 :: struct { - dwSize: SIZE_T, + dwSize: SIZE_T, th32ProcessID: DWORD, - th32HeapID: ULONG_PTR, - dwFlags: DWORD, + th32HeapID: ULONG_PTR, + dwFlags: DWORD, } LPHEAPLIST32 :: ^HEAPLIST32 HEAPENTRY32 :: struct { - dwSize: SIZE_T, - hHandle: HANDLE, - dwAddress: ULONG_PTR, - dwBlockSize: SIZE_T, - dwFlags: DWORD, - dwLockCount: DWORD, - dwResvd: DWORD, + dwSize: SIZE_T, + hHandle: HANDLE, + dwAddress: ULONG_PTR, + dwBlockSize: SIZE_T, + dwFlags: DWORD, + dwLockCount: DWORD, + dwResvd: DWORD, th32ProcessID: DWORD, - th32HeapID: ULONG_PTR, + th32HeapID: ULONG_PTR, } LPHEAPENTRY32 :: ^HEAPENTRY32 diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 75e9fc695..21bb2c5c1 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -15,75 +15,75 @@ c_ushort :: c.ushort size_t :: c.size_t wchar_t :: c.wchar_t -DWORD :: c_ulong -DWORDLONG :: c.ulonglong -QWORD :: c.ulonglong -HANDLE :: distinct LPVOID -PHANDLE :: ^HANDLE -HINSTANCE :: HANDLE -HMODULE :: distinct HINSTANCE -HRESULT :: distinct LONG -HWND :: distinct HANDLE -HDC :: distinct HANDLE -HMONITOR :: distinct HANDLE -HICON :: distinct HANDLE -HCURSOR :: distinct HANDLE -HMENU :: distinct HANDLE -HBRUSH :: distinct HANDLE -HPEN :: distinct HANDLE -HGDIOBJ :: distinct HANDLE -HBITMAP :: distinct HANDLE -HPALETTE :: distinct HANDLE -HGLOBAL :: distinct HANDLE -HHOOK :: distinct HANDLE -HWINEVENTHOOK :: distinct HANDLE -HKEY :: distinct HANDLE -HDESK :: distinct HANDLE -HFONT :: distinct HANDLE -HRGN :: distinct HANDLE -HRSRC :: distinct HANDLE -HWINSTA :: distinct HANDLE -HACCEL :: distinct HANDLE -BOOL :: distinct b32 -BYTE :: distinct u8 -BOOLEAN :: distinct b8 -GROUP :: distinct c_uint -LARGE_INTEGER :: distinct c_longlong -ULARGE_INTEGER :: distinct c_ulonglong +DWORD :: c_ulong +DWORDLONG :: c.ulonglong +QWORD :: c.ulonglong +HANDLE :: distinct LPVOID +PHANDLE :: ^HANDLE +HINSTANCE :: HANDLE +HMODULE :: distinct HINSTANCE +HRESULT :: distinct LONG +HWND :: distinct HANDLE +HDC :: distinct HANDLE +HMONITOR :: distinct HANDLE +HICON :: distinct HANDLE +HCURSOR :: distinct HANDLE +HMENU :: distinct HANDLE +HBRUSH :: distinct HANDLE +HPEN :: distinct HANDLE +HGDIOBJ :: distinct HANDLE +HBITMAP :: distinct HANDLE +HPALETTE :: distinct HANDLE +HGLOBAL :: distinct HANDLE +HHOOK :: distinct HANDLE +HWINEVENTHOOK :: distinct HANDLE +HKEY :: distinct HANDLE +HDESK :: distinct HANDLE +HFONT :: distinct HANDLE +HRGN :: distinct HANDLE +HRSRC :: distinct HANDLE +HWINSTA :: distinct HANDLE +HACCEL :: distinct HANDLE +BOOL :: distinct b32 +BYTE :: distinct u8 +BOOLEAN :: distinct b8 +GROUP :: distinct c_uint +LARGE_INTEGER :: distinct c_longlong +ULARGE_INTEGER :: distinct c_ulonglong PULARGE_INTEGER :: ^ULARGE_INTEGER -LONG :: c_long -UINT :: c_uint -INT :: c_int -SHORT :: c_short -USHORT :: c_ushort -WCHAR :: wchar_t -SIZE_T :: uint -PSIZE_T :: ^SIZE_T -WORD :: u16 -CHAR :: c_char -ULONG_PTR :: uint -PULONG_PTR :: ^ULONG_PTR -LPULONG_PTR :: ^ULONG_PTR -DWORD_PTR :: ULONG_PTR -LONG_PTR :: int -INT_PTR :: int -UINT_PTR :: uintptr -ULONG :: c_ulong -ULONGLONG :: c_ulonglong -LONGLONG :: c_longlong -UCHAR :: BYTE -NTSTATUS :: c.long -COLORREF :: DWORD -LPCOLORREF :: ^COLORREF -LPARAM :: LONG_PTR -WPARAM :: UINT_PTR -LRESULT :: LONG_PTR -LPRECT :: ^RECT -LPPOINT :: ^POINT -LSTATUS :: LONG -PHKEY :: ^HKEY -PUSHORT :: ^USHORT -PCHAR :: ^CHAR +LONG :: c_long +UINT :: c_uint +INT :: c_int +SHORT :: c_short +USHORT :: c_ushort +WCHAR :: wchar_t +SIZE_T :: uint +PSIZE_T :: ^SIZE_T +WORD :: u16 +CHAR :: c_char +ULONG_PTR :: uint +PULONG_PTR :: ^ULONG_PTR +LPULONG_PTR :: ^ULONG_PTR +DWORD_PTR :: ULONG_PTR +LONG_PTR :: int +INT_PTR :: int +UINT_PTR :: uintptr +ULONG :: c_ulong +ULONGLONG :: c_ulonglong +LONGLONG :: c_longlong +UCHAR :: BYTE +NTSTATUS :: c.long +COLORREF :: DWORD +LPCOLORREF :: ^COLORREF +LPARAM :: LONG_PTR +WPARAM :: UINT_PTR +LRESULT :: LONG_PTR +LPRECT :: ^RECT +LPPOINT :: ^POINT +LSTATUS :: LONG +PHKEY :: ^HKEY +PUSHORT :: ^USHORT +PCHAR :: ^CHAR UINT8 :: u8 UINT16 :: u16 @@ -101,68 +101,71 @@ LONG32 :: i32 ULONG64 :: u64 LONG64 :: i64 -DWORD64 :: u64 +DWORD64 :: u64 PDWORD64 :: ^DWORD64 PDWORD_PTR :: ^DWORD_PTR -ATOM :: distinct WORD +ATOM :: distinct WORD wstring :: cstring16 PWSTR :: cstring16 -PBYTE :: ^BYTE -LPBYTE :: ^BYTE -PBOOL :: ^BOOL -LPBOOL :: ^BOOL -LPCSTR :: cstring -LPCWSTR :: wstring -LPCTSTR :: wstring -LPDWORD :: ^DWORD -PCSTR :: cstring -PCWSTR :: wstring -PDWORD :: ^DWORD -LPHANDLE :: ^HANDLE -LPOVERLAPPED :: ^OVERLAPPED +PBYTE :: ^BYTE +LPBYTE :: ^BYTE +PBOOL :: ^BOOL +LPBOOL :: ^BOOL +LPCSTR :: cstring +LPCWSTR :: wstring +LPCTSTR :: wstring +LPDWORD :: ^DWORD +PCSTR :: cstring +PCWSTR :: wstring +PDWORD :: ^DWORD +LPHANDLE :: ^HANDLE +LPOVERLAPPED :: ^OVERLAPPED LPPROCESS_INFORMATION :: ^PROCESS_INFORMATION -PSECURITY_ATTRIBUTES :: ^SECURITY_ATTRIBUTES +PSECURITY_ATTRIBUTES :: ^SECURITY_ATTRIBUTES LPSECURITY_ATTRIBUTES :: ^SECURITY_ATTRIBUTES -LPSTARTUPINFOW :: ^STARTUPINFOW -LPTRACKMOUSEEVENT :: ^TRACKMOUSEEVENT -VOID :: rawptr -PVOID :: rawptr -LPVOID :: rawptr -PINT :: ^INT -LPINT :: ^INT -PUINT :: ^UINT -LPUINT :: ^UINT -LPWCH :: ^WCHAR -LPWORD :: ^WORD -PULONG :: ^ULONG -LPWIN32_FIND_DATAW :: ^WIN32_FIND_DATAW -LPWSADATA :: ^WSADATA -LPWSAPROTOCOL_INFO :: ^WSAPROTOCOL_INFO -LPSTR :: ^CHAR -LPWSTR :: ^WCHAR -OLECHAR :: WCHAR -BSTR :: ^OLECHAR -LPOLESTR :: cstring16 -LPCOLESTR :: LPCSTR +LPSTARTUPINFOW :: ^STARTUPINFOW +LPTRACKMOUSEEVENT :: ^TRACKMOUSEEVENT +VOID :: rawptr +PVOID :: rawptr +LPVOID :: rawptr +PINT :: ^INT +LPINT :: ^INT +PUINT :: ^UINT +LPUINT :: ^UINT +LPWCH :: ^WCHAR +LPWORD :: ^WORD +PULONG :: ^ULONG +LPWIN32_FIND_DATAW :: ^WIN32_FIND_DATAW +LPWSADATA :: ^WSADATA +LPWSAPROTOCOL_INFO :: ^WSAPROTOCOL_INFO +LPSTR :: ^CHAR +LPWSTR :: ^WCHAR +OLECHAR :: WCHAR +BSTR :: ^OLECHAR + +LPOLESTR :: cstring16 +LPCOLESTR :: LPCSTR LPFILETIME :: ^FILETIME -LPWSABUF :: ^WSABUF +LPWSABUF :: ^WSABUF + LPWSAOVERLAPPED :: distinct rawptr LPWSAOVERLAPPED_COMPLETION_ROUTINE :: distinct rawptr -LPCVOID :: rawptr -SCODE :: LONG -PSCODE :: ^SCODE -PACCESS_TOKEN :: PVOID +LPCVOID :: rawptr +SCODE :: LONG +PSCODE :: ^SCODE + +PACCESS_TOKEN :: PVOID PSECURITY_DESCRIPTOR :: PVOID -PSID :: PVOID -PCLAIMS_BLOB :: PVOID +PSID :: PVOID +PCLAIMS_BLOB :: PVOID PCONDITION_VARIABLE :: ^CONDITION_VARIABLE -PLARGE_INTEGER :: ^LARGE_INTEGER -PSRWLOCK :: ^SRWLOCK +PLARGE_INTEGER :: ^LARGE_INTEGER +PSRWLOCK :: ^SRWLOCK CREATE_WAITABLE_TIMER_MANUAL_RESET :: 0x00000001 CREATE_WAITABLE_TIMER_HIGH_RESOLUTION :: 0x00000002 @@ -183,28 +186,28 @@ LPSIZE :: ^SIZE MAXLONG :: 0x7fffffff -FILE_ATTRIBUTE_READONLY: DWORD : 0x00000001 -FILE_ATTRIBUTE_HIDDEN: DWORD : 0x00000002 -FILE_ATTRIBUTE_SYSTEM: DWORD : 0x00000004 -FILE_ATTRIBUTE_DIRECTORY: DWORD : 0x00000010 -FILE_ATTRIBUTE_ARCHIVE: DWORD : 0x00000020 -FILE_ATTRIBUTE_DEVICE: DWORD : 0x00000040 -FILE_ATTRIBUTE_NORMAL: DWORD : 0x00000080 -FILE_ATTRIBUTE_TEMPORARY: DWORD : 0x00000100 -FILE_ATTRIBUTE_SPARSE_FILE: DWORD : 0x00000200 -FILE_ATTRIBUTE_REPARSE_Point: DWORD : 0x00000400 -FILE_ATTRIBUTE_REPARSE_POINT: DWORD : 0x00000400 -FILE_ATTRIBUTE_COMPRESSED: DWORD : 0x00000800 -FILE_ATTRIBUTE_OFFLINE: DWORD : 0x00001000 -FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: DWORD : 0x00002000 -FILE_ATTRIBUTE_ENCRYPTED: DWORD : 0x00004000 +FILE_ATTRIBUTE_READONLY : DWORD : 0x00000001 +FILE_ATTRIBUTE_HIDDEN : DWORD : 0x00000002 +FILE_ATTRIBUTE_SYSTEM : DWORD : 0x00000004 +FILE_ATTRIBUTE_DIRECTORY : DWORD : 0x00000010 +FILE_ATTRIBUTE_ARCHIVE : DWORD : 0x00000020 +FILE_ATTRIBUTE_DEVICE : DWORD : 0x00000040 +FILE_ATTRIBUTE_NORMAL : DWORD : 0x00000080 +FILE_ATTRIBUTE_TEMPORARY : DWORD : 0x00000100 +FILE_ATTRIBUTE_SPARSE_FILE : DWORD : 0x00000200 +FILE_ATTRIBUTE_REPARSE_Point : DWORD : 0x00000400 +FILE_ATTRIBUTE_REPARSE_POINT : DWORD : 0x00000400 +FILE_ATTRIBUTE_COMPRESSED : DWORD : 0x00000800 +FILE_ATTRIBUTE_OFFLINE : DWORD : 0x00001000 +FILE_ATTRIBUTE_NOT_CONTENT_INDEXED : DWORD : 0x00002000 +FILE_ATTRIBUTE_ENCRYPTED : DWORD : 0x00004000 -FILE_SHARE_READ: DWORD : 0x00000001 -FILE_SHARE_WRITE: DWORD : 0x00000002 -FILE_SHARE_DELETE: DWORD : 0x00000004 -FILE_GENERIC_ALL: DWORD : 0x10000000 -FILE_GENERIC_EXECUTE: DWORD : 0x20000000 -FILE_GENERIC_READ: DWORD : 0x80000000 +FILE_SHARE_READ : DWORD : 0x00000001 +FILE_SHARE_WRITE : DWORD : 0x00000002 +FILE_SHARE_DELETE : DWORD : 0x00000004 +FILE_GENERIC_ALL : DWORD : 0x10000000 +FILE_GENERIC_EXECUTE : DWORD : 0x20000000 +FILE_GENERIC_READ : DWORD : 0x80000000 FILE_ALL_ACCESS :: STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF FILE_ACTION_ADDED :: 0x00000001 @@ -222,11 +225,11 @@ FILE_NOTIFY_CHANGE_LAST_ACCESS :: 0x00000020 FILE_NOTIFY_CHANGE_CREATION :: 0x00000040 FILE_NOTIFY_CHANGE_SECURITY :: 0x00000100 -CREATE_NEW: DWORD : 1 -CREATE_ALWAYS: DWORD : 2 -OPEN_ALWAYS: DWORD : 4 -OPEN_EXISTING: DWORD : 3 -TRUNCATE_EXISTING: DWORD : 5 +CREATE_NEW : DWORD : 1 +CREATE_ALWAYS : DWORD : 2 +OPEN_ALWAYS : DWORD : 4 +OPEN_EXISTING : DWORD : 3 +TRUNCATE_EXISTING : DWORD : 5 FILE_READ_DATA : DWORD : 0x00000001 FILE_LIST_DIRECTORY : DWORD : 0x00000001 @@ -248,11 +251,12 @@ GENERIC_WRITE : DWORD : 0x40000000 GENERIC_EXECUTE : DWORD : 0x20000000 GENERIC_ALL : DWORD : 0x10000000 -FILE_GENERIC_WRITE: DWORD : STANDARD_RIGHTS_WRITE | - FILE_WRITE_DATA | +FILE_GENERIC_WRITE : DWORD : \ + STANDARD_RIGHTS_WRITE | + FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | - FILE_WRITE_EA | - FILE_APPEND_DATA | + FILE_WRITE_EA | + FILE_APPEND_DATA | SYNCHRONIZE SECURITY_SQOS_PRESENT: DWORD : 0x00100000 @@ -297,13 +301,13 @@ POWER_REQUEST_CONTEXT_DETAILED_STRING :: DIAGNOSTIC_REASON_DETAILED_STRING REASON_CONTEXT :: struct { Version: ULONG, - Flags: DWORD, + Flags: DWORD, Reason: struct #raw_union { Detailed: struct { LocalizedReasonModule: HMODULE, - LocalizedReasonId: ULONG, - ReasonStringCount: ULONG, - ReasonStrings: ^LPWSTR, + LocalizedReasonId: ULONG, + ReasonStringCount: ULONG, + ReasonStrings: [^]LPWSTR `fmt:"v,ReasonStringCount"`, }, SimpleReasonString: LPWSTR, }, @@ -324,9 +328,9 @@ RRF_RT_ANY :: 0x0000ffff RRF_NOEXPAND :: 0x10000000 RRF_ZEROONFAILURE :: 0x20000000 -ACCESS_MASK :: DWORD +ACCESS_MASK :: DWORD PACCESS_MASK :: ^ACCESS_MASK -REGSAM :: ACCESS_MASK +REGSAM :: ACCESS_MASK // Reserved Key Handles. HKEY_CLASSES_ROOT :: HKEY(uintptr(0x80000000)) @@ -368,12 +372,13 @@ KEY_WOW64_RES :: 0x0300 KEY_READ :: (STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY) & (~SYNCHRONIZE) KEY_WRITE :: (STANDARD_RIGHTS_WRITE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY) & (~SYNCHRONIZE) KEY_EXECUTE :: (KEY_READ) & (~SYNCHRONIZE) -KEY_ALL_ACCESS :: (STANDARD_RIGHTS_ALL | - KEY_QUERY_VALUE | - KEY_SET_VALUE | - KEY_CREATE_SUB_KEY | +KEY_ALL_ACCESS :: ( + STANDARD_RIGHTS_ALL | + KEY_QUERY_VALUE | + KEY_SET_VALUE | + KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS | - KEY_NOTIFY | + KEY_NOTIFY | KEY_CREATE_LINK) & (~SYNCHRONIZE) // Open/Create Options @@ -385,17 +390,19 @@ REG_OPTION_BACKUP_RESTORE :: 0x00000004 REG_OPTION_OPEN_LINK :: 0x00000008 REG_OPTION_DONT_VIRTUALIZE :: 0x00000010 -REG_LEGAL_OPTION :: REG_OPTION_RESERVED | - REG_OPTION_NON_VOLATILE | - REG_OPTION_VOLATILE | - REG_OPTION_CREATE_LINK | +REG_LEGAL_OPTION :: \ + REG_OPTION_RESERVED | + REG_OPTION_NON_VOLATILE | + REG_OPTION_VOLATILE | + REG_OPTION_CREATE_LINK | REG_OPTION_BACKUP_RESTORE | - REG_OPTION_OPEN_LINK | + REG_OPTION_OPEN_LINK | REG_OPTION_DONT_VIRTUALIZE -REG_OPEN_LEGAL_OPTION :: REG_OPTION_RESERVED | +REG_OPEN_LEGAL_OPTION :: \ + REG_OPTION_RESERVED | REG_OPTION_BACKUP_RESTORE | - REG_OPTION_OPEN_LINK | + REG_OPTION_OPEN_LINK | REG_OPTION_DONT_VIRTUALIZE // Key creation/open disposition @@ -437,10 +444,11 @@ REG_NOTIFY_CHANGE_LAST_SET :: 0x00000004 REG_NOTIFY_CHANGE_SECURITY :: 0x00000008 REG_NOTIFY_THREAD_AGNOSTIC :: 0x10000000 -REG_LEGAL_CHANGE_FILTER :: REG_NOTIFY_CHANGE_NAME | +REG_LEGAL_CHANGE_FILTER :: \ + REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_ATTRIBUTES | - REG_NOTIFY_CHANGE_LAST_SET | - REG_NOTIFY_CHANGE_SECURITY | + REG_NOTIFY_CHANGE_LAST_SET | + REG_NOTIFY_CHANGE_SECURITY | REG_NOTIFY_THREAD_AGNOSTIC // Predefined Value Types. @@ -461,9 +469,9 @@ REG_QWORD_LITTLE_ENDIAN :: 11 BSMINFO :: struct { cbSize: UINT, - hdesk: HDESK, - hwnd: HWND, - luid: LUID, + hdesk: HDESK, + hwnd: HWND, + luid: LUID, } PBSMINFO :: ^BSMINFO @@ -545,37 +553,37 @@ COLOR_BTNHILIGHT :: COLOR_BTNHIGHLIGHT // Common Control Notification Code Ranges NM_FIRST :: 0 -NM_LAST :: ~DWORD(99 - 1) -LVN_FIRST :: ~DWORD(100 - 1) -LVN_LAST :: ~DWORD(199 - 1) -HDN_FIRST :: ~DWORD(300 - 1) -HDN_LAST :: ~DWORD(399 - 1) -TVN_FIRST :: ~DWORD(400 - 1) -TVN_LAST :: ~DWORD(499 - 1) -TTN_FIRST :: ~DWORD(520 - 1) -TTN_LAST :: ~DWORD(549 - 1) -TCN_FIRST :: ~DWORD(550 - 1) -TCN_LAST :: ~DWORD(580 - 1) -CDN_FIRST :: ~DWORD(601 - 1) -CDN_LAST :: ~DWORD(699 - 1) -TBN_FIRST :: ~DWORD(700 - 1) -TBN_LAST :: ~DWORD(720 - 1) -UDN_FIRST :: ~DWORD(721 - 1) -UDN_LAST :: ~DWORD(740 - 1) -MCN_FIRST :: ~DWORD(750 - 1) -MCN_LAST :: ~DWORD(759 - 1) -DTN_FIRST :: ~DWORD(760 - 1) -DTN_LAST :: ~DWORD(799 - 1) -CBEN_FIRST :: ~DWORD(800 - 1) -CBEN_LAST :: ~DWORD(830 - 1) -RBN_FIRST :: ~DWORD(831 - 1) -RBN_LAST :: ~DWORD(859 - 1) -IPN_FIRST :: ~DWORD(860 - 1) -IPN_LAST :: ~DWORD(879 - 1) -SBN_FIRST :: ~DWORD(880 - 1) -SBN_LAST :: ~DWORD(899 - 1) -PGN_FIRST :: ~DWORD(900 - 1) -PGN_LAST :: ~DWORD(950 - 1) +NM_LAST :: ~DWORD( 99 - 1) +LVN_FIRST :: ~DWORD( 100 - 1) +LVN_LAST :: ~DWORD( 199 - 1) +HDN_FIRST :: ~DWORD( 300 - 1) +HDN_LAST :: ~DWORD( 399 - 1) +TVN_FIRST :: ~DWORD( 400 - 1) +TVN_LAST :: ~DWORD( 499 - 1) +TTN_FIRST :: ~DWORD( 520 - 1) +TTN_LAST :: ~DWORD( 549 - 1) +TCN_FIRST :: ~DWORD( 550 - 1) +TCN_LAST :: ~DWORD( 580 - 1) +CDN_FIRST :: ~DWORD( 601 - 1) +CDN_LAST :: ~DWORD( 699 - 1) +TBN_FIRST :: ~DWORD( 700 - 1) +TBN_LAST :: ~DWORD( 720 - 1) +UDN_FIRST :: ~DWORD( 721 - 1) +UDN_LAST :: ~DWORD( 740 - 1) +MCN_FIRST :: ~DWORD( 750 - 1) +MCN_LAST :: ~DWORD( 759 - 1) +DTN_FIRST :: ~DWORD( 760 - 1) +DTN_LAST :: ~DWORD( 799 - 1) +CBEN_FIRST :: ~DWORD( 800 - 1) +CBEN_LAST :: ~DWORD( 830 - 1) +RBN_FIRST :: ~DWORD( 831 - 1) +RBN_LAST :: ~DWORD( 859 - 1) +IPN_FIRST :: ~DWORD( 860 - 1) +IPN_LAST :: ~DWORD( 879 - 1) +SBN_FIRST :: ~DWORD( 880 - 1) +SBN_LAST :: ~DWORD( 899 - 1) +PGN_FIRST :: ~DWORD( 900 - 1) +PGN_LAST :: ~DWORD( 950 - 1) WMN_FIRST :: ~DWORD(1000 - 1) WMN_LAST :: ~DWORD(1200 - 1) BCN_FIRST :: ~DWORD(1250 - 1) @@ -1255,61 +1263,61 @@ HOOKPROC :: #type proc "system" (code: c_int, wParam: WPARAM, lParam: LPARAM) -> WINEVENTPROC :: #type proc "system" ( hWinEventHook: HWINEVENTHOOK, - event: DWORD, - hwnd: HWND, - idObject, idChild: LONG, + event: DWORD, + hwnd: HWND, + idObject, idChild: LONG, idEventThread, dwmsEventTime: DWORD, ) CWPRETSTRUCT :: struct { lResult: LRESULT, - lParam: LPARAM, - wParam: WPARAM, + lParam: LPARAM, + wParam: WPARAM, message: UINT, - hwnd: HWND, + hwnd: HWND, } MSLLHOOKSTRUCT :: struct { - pt: POINT, - mouseData: DWORD, - flags: DWORD, - time: DWORD, + pt: POINT, + mouseData: DWORD, + flags: DWORD, + time: DWORD, dwExtraInfo: ULONG_PTR, } KBDLLHOOKSTRUCT :: struct { - vkCode: DWORD, - scanCode: DWORD, - flags: DWORD, - time: DWORD, + vkCode: DWORD, + scanCode: DWORD, + flags: DWORD, + time: DWORD, dwExtraInfo: ULONG_PTR, } MOUSEINPUT :: struct { - dx: LONG, - dy: LONG, - mouseData: DWORD, - dwFlags: DWORD, - time: DWORD, + dx: LONG, + dy: LONG, + mouseData: DWORD, + dwFlags: DWORD, + time: DWORD, dwExtraInfo: ULONG_PTR, } KEYBDINPUT :: struct { - wVk: WORD, - wScan: WORD, - dwFlags: DWORD, - time: DWORD, + wVk: WORD, + wScan: WORD, + dwFlags: DWORD, + time: DWORD, dwExtraInfo: ULONG_PTR, } HARDWAREINPUT :: struct { - uMsg: DWORD, + uMsg: DWORD, wParamL: WORD, wParamH: WORD, } INPUT_TYPE :: enum DWORD { - MOUSE = 0, + MOUSE = 0, KEYBOARD = 1, HARDWARE = 2, } @@ -1317,128 +1325,128 @@ INPUT_TYPE :: enum DWORD { INPUT :: struct { type: INPUT_TYPE, using _: struct #raw_union { - mi: MOUSEINPUT, - ki: KEYBDINPUT, - hi: HARDWAREINPUT, + mi: MOUSEINPUT `raw_union_tag:"type=MOUSE"`, + ki: KEYBDINPUT `raw_union_tag:"type=KEYBOARD"`, + hi: HARDWAREINPUT `raw_union_tag:"type=HARDWARE"`, }, } -MOUSEEVENTF_MOVE :: 0x0001 -MOUSEEVENTF_LEFTDOWN :: 0x0002 -MOUSEEVENTF_LEFTUP :: 0x0004 -MOUSEEVENTF_RIGHTDOWN :: 0x0008 -MOUSEEVENTF_RIGHTUP :: 0x0010 -MOUSEEVENTF_MIDDLEDOWN :: 0x0020 -MOUSEEVENTF_MIDDLEUP :: 0x0040 -MOUSEEVENTF_XDOWN :: 0x0080 -MOUSEEVENTF_XUP :: 0x0100 -MOUSEEVENTF_WHEEL :: 0x0800 -MOUSEEVENTF_HWHEEL :: 0x1000 +MOUSEEVENTF_MOVE :: 0x0001 +MOUSEEVENTF_LEFTDOWN :: 0x0002 +MOUSEEVENTF_LEFTUP :: 0x0004 +MOUSEEVENTF_RIGHTDOWN :: 0x0008 +MOUSEEVENTF_RIGHTUP :: 0x0010 +MOUSEEVENTF_MIDDLEDOWN :: 0x0020 +MOUSEEVENTF_MIDDLEUP :: 0x0040 +MOUSEEVENTF_XDOWN :: 0x0080 +MOUSEEVENTF_XUP :: 0x0100 +MOUSEEVENTF_WHEEL :: 0x0800 +MOUSEEVENTF_HWHEEL :: 0x1000 MOUSEEVENTF_MOVE_NOCOALESCE :: 0x2000 -MOUSEEVENTF_VIRTUALDESK :: 0x4000 -MOUSEEVENTF_ABSOLUTE :: 0x8000 +MOUSEEVENTF_VIRTUALDESK :: 0x4000 +MOUSEEVENTF_ABSOLUTE :: 0x8000 WNDCLASSA :: struct { - style: UINT, - lpfnWndProc: WNDPROC, - cbClsExtra: c_int, - cbWndExtra: c_int, - hInstance: HINSTANCE, - hIcon: HICON, - hCursor: HCURSOR, + style: UINT, + lpfnWndProc: WNDPROC, + cbClsExtra: c_int, + cbWndExtra: c_int, + hInstance: HINSTANCE, + hIcon: HICON, + hCursor: HCURSOR, hbrBackground: HBRUSH, - lpszMenuName: LPCSTR, + lpszMenuName: LPCSTR, lpszClassName: LPCSTR, } WNDCLASSW :: struct { - style: UINT, - lpfnWndProc: WNDPROC, - cbClsExtra: c_int, - cbWndExtra: c_int, - hInstance: HINSTANCE, - hIcon: HICON, - hCursor: HCURSOR, + style: UINT, + lpfnWndProc: WNDPROC, + cbClsExtra: c_int, + cbWndExtra: c_int, + hInstance: HINSTANCE, + hIcon: HICON, + hCursor: HCURSOR, hbrBackground: HBRUSH, - lpszMenuName: LPCWSTR, + lpszMenuName: LPCWSTR, lpszClassName: LPCWSTR, } WNDCLASSEXA :: struct { - cbSize: UINT, - style: UINT, - lpfnWndProc: WNDPROC, - cbClsExtra: c_int, - cbWndExtra: c_int, - hInstance: HINSTANCE, - hIcon: HICON, - hCursor: HCURSOR, + cbSize: UINT, + style: UINT, + lpfnWndProc: WNDPROC, + cbClsExtra: c_int, + cbWndExtra: c_int, + hInstance: HINSTANCE, + hIcon: HICON, + hCursor: HCURSOR, hbrBackground: HBRUSH, - lpszMenuName: LPCSTR, + lpszMenuName: LPCSTR, lpszClassName: LPCSTR, - hIconSm: HICON, + hIconSm: HICON, } WNDCLASSEXW :: struct { - cbSize: UINT, - style: UINT, - lpfnWndProc: WNDPROC, - cbClsExtra: c_int, - cbWndExtra: c_int, - hInstance: HINSTANCE, - hIcon: HICON, - hCursor: HCURSOR, + cbSize: UINT, + style: UINT, + lpfnWndProc: WNDPROC, + cbClsExtra: c_int, + cbWndExtra: c_int, + hInstance: HINSTANCE, + hIcon: HICON, + hCursor: HCURSOR, hbrBackground: HBRUSH, - lpszMenuName: LPCWSTR, + lpszMenuName: LPCWSTR, lpszClassName: LPCWSTR, - hIconSm: HICON, + hIconSm: HICON, } MSG :: struct { - hwnd: HWND, + hwnd: HWND, message: UINT, - wParam: WPARAM, - lParam: LPARAM, - time: DWORD, - pt: POINT, + wParam: WPARAM, + lParam: LPARAM, + time: DWORD, + pt: POINT, } LPMSG :: ^MSG NOTIFYICONDATAW :: struct { - cbSize: DWORD, - hWnd: HWND, - uID: UINT, - uFlags: UINT, + cbSize: DWORD, + hWnd: HWND, + uID: UINT, + uFlags: UINT, uCallbackMessage: UINT, - hIcon: HICON, - szTip: [128]WCHAR, - dwState: DWORD, - dwStateMask: DWORD, - szInfo: [256]WCHAR, + hIcon: HICON, + szTip: [128]WCHAR, + dwState: DWORD, + dwStateMask: DWORD, + szInfo: [256]WCHAR, using _: struct #raw_union { uTimeout: UINT, uVersion: UINT, }, - szInfoTitle: [64]WCHAR, - dwInfoFlags: DWORD, - guidItem: GUID, + szInfoTitle: [64]WCHAR, + dwInfoFlags: DWORD, + guidItem: GUID, hBalloonIcon: HICON, } -NIF_MESSAGE :: 0x00000001 -NIF_ICON :: 0x00000002 -NIF_TIP :: 0x00000004 -NIF_STATE :: 0x00000008 -NIF_INFO :: 0x00000010 -NIF_GUID :: 0x00000020 +NIF_MESSAGE :: 0x00000001 +NIF_ICON :: 0x00000002 +NIF_TIP :: 0x00000004 +NIF_STATE :: 0x00000008 +NIF_INFO :: 0x00000010 +NIF_GUID :: 0x00000020 NIF_REALTIME :: 0x00000040 -NIF_SHOWTIP :: 0x00000080 +NIF_SHOWTIP :: 0x00000080 -NIM_ADD :: 0x00000000 -NIM_MODIFY :: 0x00000001 -NIM_DELETE :: 0x00000002 -NIM_SETFOCUS :: 0x00000003 +NIM_ADD :: 0x00000000 +NIM_MODIFY :: 0x00000001 +NIM_DELETE :: 0x00000002 +NIM_SETFOCUS :: 0x00000003 NIM_SETVERSION :: 0x00000004 // Menu flags for Add/Check/EnableMenuItem() @@ -1448,37 +1456,37 @@ MF_APPEND :: 0x00000100 MF_DELETE :: 0x00000200 MF_REMOVE :: 0x00001000 -MF_BYCOMMAND :: 0x00000000 +MF_BYCOMMAND :: 0x00000000 MF_BYPOSITION :: 0x00000400 MF_SEPARATOR :: 0x00000800 -MF_ENABLED :: 0x00000000 -MF_GRAYED :: 0x00000001 +MF_ENABLED :: 0x00000000 +MF_GRAYED :: 0x00000001 MF_DISABLED :: 0x00000002 -MF_UNCHECKED :: 0x00000000 -MF_CHECKED :: 0x00000008 +MF_UNCHECKED :: 0x00000000 +MF_CHECKED :: 0x00000008 MF_USECHECKBITMAPS :: 0x00000200 -MF_STRING :: 0x00000000 -MF_BITMAP :: 0x00000004 +MF_STRING :: 0x00000000 +MF_BITMAP :: 0x00000004 MF_OWNERDRAW :: 0x00000100 -MF_POPUP :: 0x00000010 +MF_POPUP :: 0x00000010 MF_MENUBARBREAK :: 0x00000020 -MF_MENUBREAK :: 0x00000040 +MF_MENUBREAK :: 0x00000040 MF_UNHILITE :: 0x00000000 -MF_HILITE :: 0x00000080 +MF_HILITE :: 0x00000080 -MF_DEFAULT :: 0x00001000 -MF_SYSMENU :: 0x00002000 -MF_HELP :: 0x00004000 +MF_DEFAULT :: 0x00001000 +MF_SYSMENU :: 0x00002000 +MF_HELP :: 0x00004000 MF_RIGHTJUSTIFY :: 0x00004000 MF_MOUSESELECT :: 0x00008000 -MF_END :: 0x00000080 // Obsolete -- only used by old RES files +MF_END :: 0x00000080 // Obsolete -- only used by old RES files // Menu flags for Add/Check/EnableMenuItem() MFS_GRAYED :: 0x00000003 @@ -1491,27 +1499,27 @@ MFS_UNHILITE :: MF_UNHILITE MFS_DEFAULT :: MF_DEFAULT // Flags for TrackPopupMenu -TPM_LEFTBUTTON :: 0x0000 -TPM_RIGHTBUTTON :: 0x0002 -TPM_LEFTALIGN :: 0x0000 -TPM_CENTERALIGN :: 0x0004 -TPM_RIGHTALIGN :: 0x0008 -TPM_TOPALIGN :: 0x0000 +TPM_LEFTBUTTON :: 0x0000 +TPM_RIGHTBUTTON :: 0x0002 +TPM_LEFTALIGN :: 0x0000 +TPM_CENTERALIGN :: 0x0004 +TPM_RIGHTALIGN :: 0x0008 +TPM_TOPALIGN :: 0x0000 TPM_VCENTERALIGN :: 0x0010 -TPM_BOTTOMALIGN :: 0x0020 +TPM_BOTTOMALIGN :: 0x0020 -TPM_HORIZONTAL :: 0x0000 /* Horz alignment matters more */ -TPM_VERTICAL :: 0x0040 /* Vert alignment matters more */ -TPM_NONOTIFY :: 0x0080 /* Don't send any notification msgs */ -TPM_RETURNCMD :: 0x0100 -TPM_RECURSE :: 0x0001 +TPM_HORIZONTAL :: 0x0000 /* Horz alignment matters more */ +TPM_VERTICAL :: 0x0040 /* Vert alignment matters more */ +TPM_NONOTIFY :: 0x0080 /* Don't send any notification msgs */ +TPM_RETURNCMD :: 0x0100 +TPM_RECURSE :: 0x0001 TPM_HORPOSANIMATION :: 0x0400 TPM_HORNEGANIMATION :: 0x0800 TPM_VERPOSANIMATION :: 0x1000 TPM_VERNEGANIMATION :: 0x2000 -TPM_NOANIMATION :: 0x4000 -TPM_LAYOUTRTL :: 0x8000 -TPM_WORKAREA :: 0x10000 +TPM_NOANIMATION :: 0x4000 +TPM_LAYOUTRTL :: 0x8000 +TPM_WORKAREA :: 0x10000 // WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes HTERROR :: -2 @@ -1545,42 +1553,42 @@ HTCLOSE :: 20 HTHELP :: 21 TEXTMETRICW :: struct { - tmHeight: LONG, - tmAscent: LONG, - tmDescent: LONG, - tmInternalLeading: LONG, - tmExternalLeading: LONG, - tmAveCharWidth: LONG, - tmMaxCharWidth: LONG, - tmWeight: LONG, - tmOverhang: LONG, + tmHeight: LONG, + tmAscent: LONG, + tmDescent: LONG, + tmInternalLeading: LONG, + tmExternalLeading: LONG, + tmAveCharWidth: LONG, + tmMaxCharWidth: LONG, + tmWeight: LONG, + tmOverhang: LONG, tmDigitizedAspectX: LONG, tmDigitizedAspectY: LONG, - tmFirstChar: WCHAR, - tmLastChar: WCHAR, - tmDefaultChar: WCHAR, - tmBreakChar: WCHAR, - tmItalic: BYTE, - tmUnderlined: BYTE, - tmStruckOut: BYTE, - tmPitchAndFamily: BYTE, - tmCharSet: BYTE, + tmFirstChar: WCHAR, + tmLastChar: WCHAR, + tmDefaultChar: WCHAR, + tmBreakChar: WCHAR, + tmItalic: BYTE, + tmUnderlined: BYTE, + tmStruckOut: BYTE, + tmPitchAndFamily: BYTE, + tmCharSet: BYTE, } LPTEXTMETRICW :: ^TEXTMETRICW PAINTSTRUCT :: struct { - hdc: HDC, - fErase: BOOL, - rcPaint: RECT, - fRestore: BOOL, - fIncUpdate: BOOL, + hdc: HDC, + fErase: BOOL, + rcPaint: RECT, + fRestore: BOOL, + fIncUpdate: BOOL, rgbReserved: [32]BYTE, } TRACKMOUSEEVENT :: struct { - cbSize: DWORD, - dwFlags: DWORD, - hwndTrack: HWND, + cbSize: DWORD, + dwFlags: DWORD, + hwndTrack: HWND, dwHoverTime: DWORD, } @@ -1640,16 +1648,16 @@ MAX_LINKID_TEXT :: 48 L_MAX_URL_LENGTH :: 2048 + 32 + len("://") LITEM :: struct { - mask: UINT, - iLink: c_int, - state: UINT, + mask: UINT, + iLink: c_int, + state: UINT, stateMask: UINT, - szID: [MAX_LINKID_TEXT]WCHAR, - szUrl: [L_MAX_URL_LENGTH]WCHAR, + szID: [MAX_LINKID_TEXT]WCHAR, + szUrl: [L_MAX_URL_LENGTH]WCHAR, } NMLINK :: struct { - hdr: NMHDR, + hdr: NMHDR, item: LITEM, } @@ -1660,12 +1668,12 @@ NMHDR :: struct { } NMCUSTOMDRAW :: struct { - hdr: NMHDR, + hdr: NMHDR, dwDrawStage: DWORD, - hdc: HDC, - rc: RECT, - dwItemSpec: DWORD_PTR, - uItemState: UINT, + hdc: HDC, + rc: RECT, + dwItemSpec: DWORD_PTR, + uItemState: UINT, lItemlParam: LPARAM, } @@ -1701,14 +1709,14 @@ NM_TVSTATEIMAGECHANGING :: NM_OUTOFMEMORY-23 // uses NMTVSTATEIMAGECHANGING stru PCZZWSTR :: cstring16 SHFILEOPSTRUCTW :: struct { - hwnd: HWND, - wFunc: UINT, - pFrom: PCZZWSTR, - pTo: PCZZWSTR, - fFlags: FILEOP_FLAGS, + hwnd: HWND, + wFunc: UINT, + pFrom: PCZZWSTR, + pTo: PCZZWSTR, + fFlags: FILEOP_FLAGS, fAnyOperationsAborted: BOOL, - hNameMappings: LPVOID, - lpszProgressTitle: PCWSTR, // only used if FOF_SIMPLEPROGRESS + hNameMappings: LPVOID, + lpszProgressTitle: PCWSTR, // only used if FOF_SIMPLEPROGRESS } LPSHFILEOPSTRUCTW :: ^SHFILEOPSTRUCTW @@ -1741,7 +1749,7 @@ FOF_NO_UI :: (FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FILEOP_FLAGS :: WORD DEVMODEW :: struct { - dmDeviceName: [32]wchar_t, + dmDeviceName: [32]wchar_t, dmSpecVersion: WORD, dmDriverVersion: WORD, dmSize: WORD, @@ -1887,7 +1895,7 @@ WS_MINIMIZE : UINT : 0x2000_0000 WS_MINIMIZEBOX : UINT : 0x0002_0000 WS_OVERLAPPED : UINT : 0x0000_0000 WS_OVERLAPPEDWINDOW : UINT : WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX -WS_POPUP : UINT : 0x8000_0000 +WS_POPUP : UINT : 0x8000_0000 WS_POPUPWINDOW : UINT : WS_POPUP | WS_BORDER | WS_SYSMENU WS_SIZEBOX : UINT : 0x0004_0000 WS_SYSMENU : UINT : 0x0008_0000 @@ -2227,24 +2235,24 @@ SEE_MASK_FLAG_LOG_USAGE :: 0x04000000 SEE_MASK_FLAG_HINST_IS_SITE :: 0x08000000 SHELLEXECUTEINFOW :: struct { - cbSize: DWORD, // in, required, sizeof of this structure - fMask: ULONG, // in, SEE_MASK_XXX values - hwnd: HWND, // in, optional - lpVerb: LPCWSTR, // in, optional when unspecified the default verb is choosen - lpFile: LPCWSTR, // in, either this value or lpIDList must be specified - lpParameters: LPCWSTR, // in, optional - lpDirectory: LPCWSTR, // in, optional - nShow: c_int, // in, required - hInstApp: HINSTANCE, // out when SEE_MASK_NOCLOSEPROCESS is specified - lpIDList: rawptr, // in, valid when SEE_MASK_IDLIST is specified, PCIDLIST_ABSOLUTE, for use with SEE_MASK_IDLIST & SEE_MASK_INVOKEIDLIST - lpClass: LPCWSTR, // in, valid when SEE_MASK_CLASSNAME is specified - hkeyClass: HKEY, // in, valid when SEE_MASK_CLASSKEY is specified - dwHotKey: DWORD, // in, valid when SEE_MASK_HOTKEY is specified - DUMMYUNIONNAME: struct #raw_union { - hIcon: HANDLE, // not used - hMonitor: HANDLE, // in, valid when SEE_MASK_HMONITOR specified + cbSize: DWORD, // in, required, sizeof of this structure + fMask: ULONG, // in, SEE_MASK_XXX values + hwnd: HWND, // in, optional + lpVerb: LPCWSTR, // in, optional when unspecified the default verb is choosen + lpFile: LPCWSTR, // in, either this value or lpIDList must be specified + lpParameters: LPCWSTR, // in, optional + lpDirectory: LPCWSTR, // in, optional + nShow: c_int, // in, required + hInstApp: HINSTANCE, // out when SEE_MASK_NOCLOSEPROCESS is specified + lpIDList: rawptr, // in, valid when SEE_MASK_IDLIST is specified, PCIDLIST_ABSOLUTE, for use with SEE_MASK_IDLIST & SEE_MASK_INVOKEIDLIST + lpClass: LPCWSTR, // in, valid when SEE_MASK_CLASSNAME is specified + hkeyClass: HKEY, // in, valid when SEE_MASK_CLASSKEY is specified + dwHotKey: DWORD, // in, valid when SEE_MASK_HOTKEY is specified + using DUMMYUNIONNAME: struct #raw_union { + hIcon: HANDLE, // not used + hMonitor: HANDLE, // in, valid when SEE_MASK_HMONITOR specified }, - hProcess: HANDLE, // out, valid when SEE_MASK_NOCLOSEPROCESS specified + hProcess: HANDLE, // out, valid when SEE_MASK_NOCLOSEPROCESS specified } LPSHELLEXECUTEINFOW :: ^SHELLEXECUTEINFOW @@ -2291,9 +2299,9 @@ WA_CLICKACTIVE :: 2 // Struct pointed to by WM_GETMINMAXINFO lParam MINMAXINFO :: struct { - ptReserved: POINT, - ptMaxSize: POINT, - ptMaxPosition: POINT, + ptReserved: POINT, + ptMaxSize: POINT, + ptMaxPosition: POINT, ptMinTrackSize: POINT, ptMaxTrackSize: POINT, } @@ -2514,53 +2522,53 @@ STOCK_LAST :: 19 CLR_INVALID :: 0xFFFFFFFF RGBQUAD :: struct { - rgbBlue: BYTE, - rgbGreen: BYTE, - rgbRed: BYTE, + rgbBlue: BYTE, + rgbGreen: BYTE, + rgbRed: BYTE, rgbReserved: BYTE, } PIXELFORMATDESCRIPTOR :: struct { - nSize: WORD, - nVersion: WORD, - dwFlags: DWORD, - iPixelType: BYTE, - cColorBits: BYTE, - cRedBits: BYTE, - cRedShift: BYTE, - cGreenBits: BYTE, - cGreenShift: BYTE, - cBlueBits: BYTE, - cBlueShift: BYTE, - cAlphaBits: BYTE, - cAlphaShift: BYTE, - cAccumBits: BYTE, - cAccumRedBits: BYTE, + nSize: WORD, + nVersion: WORD, + dwFlags: DWORD, + iPixelType: BYTE, + cColorBits: BYTE, + cRedBits: BYTE, + cRedShift: BYTE, + cGreenBits: BYTE, + cGreenShift: BYTE, + cBlueBits: BYTE, + cBlueShift: BYTE, + cAlphaBits: BYTE, + cAlphaShift: BYTE, + cAccumBits: BYTE, + cAccumRedBits: BYTE, cAccumGreenBits: BYTE, - cAccumBlueBits: BYTE, + cAccumBlueBits: BYTE, cAccumAlphaBits: BYTE, - cDepthBits: BYTE, - cStencilBits: BYTE, - cAuxBuffers: BYTE, - iLayerType: BYTE, - bReserved: BYTE, - dwLayerMask: DWORD, - dwVisibleMask: DWORD, - dwDamageMask: DWORD, + cDepthBits: BYTE, + cStencilBits: BYTE, + cAuxBuffers: BYTE, + iLayerType: BYTE, + bReserved: BYTE, + dwLayerMask: DWORD, + dwVisibleMask: DWORD, + dwDamageMask: DWORD, } BITMAPINFOHEADER :: struct { - biSize: DWORD, - biWidth: LONG, - biHeight: LONG, - biPlanes: WORD, - biBitCount: WORD, - biCompression: DWORD, - biSizeImage: DWORD, + biSize: DWORD, + biWidth: LONG, + biHeight: LONG, + biPlanes: WORD, + biBitCount: WORD, + biCompression: DWORD, + biSizeImage: DWORD, biXPelsPerMeter: LONG, biYPelsPerMeter: LONG, - biClrUsed: DWORD, - biClrImportant: DWORD, + biClrUsed: DWORD, + biClrImportant: DWORD, } BITMAPINFO :: struct { @@ -2668,64 +2676,64 @@ CONDITION_VARIABLE_INIT :: CONDITION_VARIABLE{} SRWLOCK_INIT :: SRWLOCK{} // Flags in STARTUPINFOW.dwFlags. -STARTF_USESHOWWINDOW: DWORD : 0x00000001 -STARTF_USESIZE: DWORD : 0x00000002 -STARTF_USEPOSITION: DWORD : 0x00000004 -STARTF_USECOUNTCHARS: DWORD : 0x00000008 -STARTF_USEFILLATTRIBUTE: DWORD : 0x00000010 -STARTF_RUNFULLSCREEN: DWORD : 0x00000020 // ignored for non-x86 platforms -STARTF_FORCEONFEEDBACK: DWORD : 0x00000040 -STARTF_FORCEOFFFEEDBACK: DWORD : 0x00000080 -STARTF_USESTDHANDLES: DWORD : 0x00000100 +STARTF_USESHOWWINDOW : DWORD : 0x00000001 +STARTF_USESIZE : DWORD : 0x00000002 +STARTF_USEPOSITION : DWORD : 0x00000004 +STARTF_USECOUNTCHARS : DWORD : 0x00000008 +STARTF_USEFILLATTRIBUTE : DWORD : 0x00000010 +STARTF_RUNFULLSCREEN : DWORD : 0x00000020 // ignored for non-x86 platforms +STARTF_FORCEONFEEDBACK : DWORD : 0x00000040 +STARTF_FORCEOFFFEEDBACK : DWORD : 0x00000080 +STARTF_USESTDHANDLES : DWORD : 0x00000100 // WINVER >= 0x400 -STARTF_USEHOTKEY: DWORD : 0x00000200 -STARTF_TITLEISLINKNAME: DWORD : 0x00000800 -STARTF_TITLEISAPPID: DWORD : 0x00001000 -STARTF_PREVENTPINNING: DWORD : 0x00002000 +STARTF_USEHOTKEY : DWORD : 0x00000200 +STARTF_TITLEISLINKNAME : DWORD : 0x00000800 +STARTF_TITLEISAPPID : DWORD : 0x00001000 +STARTF_PREVENTPINNING : DWORD : 0x00002000 // WINVER >= 0x600 -STARTF_UNTRUSTEDSOURCE: DWORD : 0x00008000 +STARTF_UNTRUSTEDSOURCE : DWORD : 0x00008000 VOLUME_NAME_DOS: DWORD : 0x0 -MOVEFILE_COPY_ALLOWED: DWORD: 0x2 -MOVEFILE_CREATE_HARDLINK: DWORD: 0x10 -MOVEFILE_DELAY_UNTIL_REBOOT: DWORD: 0x4 -MOVEFILE_FAIL_IF_NOT_TRACKABLE: DWORD: 0x20 -MOVEFILE_REPLACE_EXISTING: DWORD : 0x1 -MOVEFILE_WRITE_THROUGH: DWORD: 0x8 +MOVEFILE_COPY_ALLOWED : DWORD : 0x2 +MOVEFILE_CREATE_HARDLINK : DWORD : 0x10 +MOVEFILE_DELAY_UNTIL_REBOOT : DWORD : 0x4 +MOVEFILE_FAIL_IF_NOT_TRACKABLE : DWORD : 0x20 +MOVEFILE_REPLACE_EXISTING : DWORD : 0x1 +MOVEFILE_WRITE_THROUGH : DWORD : 0x8 -FILE_BEGIN: DWORD : 0 -FILE_CURRENT: DWORD : 1 -FILE_END: DWORD : 2 +FILE_BEGIN : DWORD : 0 +FILE_CURRENT : DWORD : 1 +FILE_END : DWORD : 2 -WAIT_OBJECT_0: DWORD : 0x00000000 -WAIT_TIMEOUT: DWORD : 258 -WAIT_FAILED: DWORD : 0xFFFFFFFF +WAIT_OBJECT_0 : DWORD : 0x00000000 +WAIT_TIMEOUT : DWORD : 258 +WAIT_FAILED : DWORD : 0xFFFFFFFF -FILE_FLAG_WRITE_THROUGH: DWORD : 0x80000000 -FILE_FLAG_OVERLAPPED: DWORD : 0x40000000 -FILE_FLAG_NO_BUFFERING: DWORD : 0x20000000 -FILE_FLAG_RANDOM_ACCESS: DWORD : 0x10000000 -FILE_FLAG_SEQUENTIAL_SCAN: DWORD : 0x08000000 -FILE_FLAG_DELETE_ON_CLOSE: DWORD : 0x04000000 -FILE_FLAG_BACKUP_SEMANTICS: DWORD : 0x02000000 -FILE_FLAG_POSIX_SEMANTICS: DWORD : 0x01000000 -FILE_FLAG_SESSION_AWARE: DWORD : 0x00800000 -FILE_FLAG_OPEN_REPARSE_POINT: DWORD : 0x00200000 -FILE_FLAG_OPEN_NO_RECALL: DWORD : 0x00100000 -FILE_FLAG_FIRST_PIPE_INSTANCE: DWORD : 0x00080000 +FILE_FLAG_WRITE_THROUGH : DWORD : 0x80000000 +FILE_FLAG_OVERLAPPED : DWORD : 0x40000000 +FILE_FLAG_NO_BUFFERING : DWORD : 0x20000000 +FILE_FLAG_RANDOM_ACCESS : DWORD : 0x10000000 +FILE_FLAG_SEQUENTIAL_SCAN : DWORD : 0x08000000 +FILE_FLAG_DELETE_ON_CLOSE : DWORD : 0x04000000 +FILE_FLAG_BACKUP_SEMANTICS : DWORD : 0x02000000 +FILE_FLAG_POSIX_SEMANTICS : DWORD : 0x01000000 +FILE_FLAG_SESSION_AWARE : DWORD : 0x00800000 +FILE_FLAG_OPEN_REPARSE_POINT : DWORD : 0x00200000 +FILE_FLAG_OPEN_NO_RECALL : DWORD : 0x00100000 +FILE_FLAG_FIRST_PIPE_INSTANCE : DWORD : 0x00080000 -PIPE_ACCESS_INBOUND: DWORD : 0x00000001 -PIPE_ACCESS_OUTBOUND: DWORD : 0x00000002 -PIPE_ACCESS_DUPLEX: DWORD : 0x00000003 -PIPE_WAIT: DWORD : 0x00000000 -PIPE_TYPE_BYTE: DWORD : 0x00000000 -PIPE_TYPE_MESSAGE: DWORD : 0x00000004 -PIPE_REJECT_REMOTE_CLIENTS: DWORD : 0x00000008 -PIPE_READMODE_BYTE: DWORD : 0x00000000 -PIPE_READMODE_MESSAGE: DWORD : 0x00000002 -PIPE_ACCEPT_REMOTE_CLIENTS: DWORD : 0x00000000 +PIPE_ACCESS_INBOUND : DWORD : 0x00000001 +PIPE_ACCESS_OUTBOUND : DWORD : 0x00000002 +PIPE_ACCESS_DUPLEX : DWORD : 0x00000003 +PIPE_WAIT : DWORD : 0x00000000 +PIPE_TYPE_BYTE : DWORD : 0x00000000 +PIPE_TYPE_MESSAGE : DWORD : 0x00000004 +PIPE_REJECT_REMOTE_CLIENTS : DWORD : 0x00000008 +PIPE_READMODE_BYTE : DWORD : 0x00000000 +PIPE_READMODE_MESSAGE : DWORD : 0x00000002 +PIPE_ACCEPT_REMOTE_CLIENTS : DWORD : 0x00000000 FD_SETSIZE :: 64 @@ -2739,10 +2747,10 @@ HANDLE_FLAG_INHERIT: DWORD : 0x00000001 HANDLE_FLAG_PROTECT_FROM_CLOSE :: 0x00000002 GENERIC_MAPPING :: struct { - GenericRead: ACCESS_MASK, - GenericWrite: ACCESS_MASK, + GenericRead: ACCESS_MASK, + GenericWrite: ACCESS_MASK, GenericExecute: ACCESS_MASK, - GenericAll: ACCESS_MASK, + GenericAll: ACCESS_MASK, } PGENERIC_MAPPING :: ^GENERIC_MAPPING @@ -2758,14 +2766,14 @@ ANYSIZE_ARRAY :: 1 PLUID_AND_ATTRIBUTES :: ^LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES :: struct { - Luid: LUID, + Luid: LUID, Attributes: DWORD, } PRIVILEGE_SET :: struct { PrivilegeCount: DWORD, - Control: DWORD, - Privilege: [ANYSIZE_ARRAY]LUID_AND_ATTRIBUTES, + Control: DWORD, + Privilege: [ANYSIZE_ARRAY]LUID_AND_ATTRIBUTES `fmt:"v,PrivilegeCount"`, } PPRIVILEGE_SET :: ^PRIVILEGE_SET @@ -2780,7 +2788,8 @@ TOKEN_ADJUST_GROUPS :: 0x0040 TOKEN_ADJUST_DEFAULT :: 0x0080 TOKEN_ADJUST_SESSIONID :: 0x0100 -TOKEN_ALL_ACCESS_P :: STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY |\ +TOKEN_ALL_ACCESS_P :: \ + STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT TOKEN_ALL_ACCESS :: TOKEN_ALL_ACCESS_P | TOKEN_ADJUST_SESSIONID @@ -2803,8 +2812,8 @@ CP_UTF8 :: 65001 // UTF-8 translation LCID :: DWORD LANGID :: WORD -LANG_NEUTRAL :: 0x00 -LANG_INVARIANT :: 0x7f +LANG_NEUTRAL :: 0x00 +LANG_INVARIANT :: 0x7f SUBLANG_NEUTRAL :: 0x00 // language neutral SUBLANG_DEFAULT :: 0x01 // user default @@ -2815,7 +2824,7 @@ WC_ERR_INVALID_CHARS :: 128 MAX_PATH :: 0x00000104 MAX_PATH_WIDE :: 0x8000 -INVALID_FILE_ATTRIBUTES :: DWORD(0xffff_ffff) +INVALID_FILE_ATTRIBUTES :: DWORD(0xffff_ffff) FILE_TYPE_DISK :: 0x0001 FILE_TYPE_CHAR :: 0x0002 @@ -2826,33 +2835,33 @@ POINT :: struct {x, y: LONG} PWINDOWPOS :: ^WINDOWPOS WINDOWPOS :: struct { - hwnd: HWND, + hwnd: HWND, hwndInsertAfter: HWND, - x: c_int, - y: c_int, - cx: c_int, - cy: c_int, + x: c_int, + y: c_int, + cx: c_int, + cy: c_int, flags: UINT, } when size_of(uintptr) == 4 { WSADATA :: struct { - wVersion: WORD, - wHighVersion: WORD, - szDescription: [WSADESCRIPTION_LEN + 1]u8, + wVersion: WORD, + wHighVersion: WORD, + szDescription: [WSADESCRIPTION_LEN + 1]u8, szSystemStatus: [WSASYS_STATUS_LEN + 1]u8, - iMaxSockets: u16, - iMaxUdpDg: u16, - lpVendorInfo: ^u8, + iMaxSockets: u16, + iMaxUdpDg: u16, + lpVendorInfo: [^]u8, } } else when size_of(uintptr) == 8 { WSADATA :: struct { - wVersion: WORD, - wHighVersion: WORD, - iMaxSockets: u16, - iMaxUdpDg: u16, - lpVendorInfo: ^u8, - szDescription: [WSADESCRIPTION_LEN + 1]u8, + wVersion: WORD, + wHighVersion: WORD, + iMaxSockets: u16, + iMaxUdpDg: u16, + lpVendorInfo: ^u8, + szDescription: [WSADESCRIPTION_LEN + 1]u8, szSystemStatus: [WSASYS_STATUS_LEN + 1]u8, } } else { @@ -2861,71 +2870,71 @@ when size_of(uintptr) == 4 { WSABUF :: struct { len: ULONG, - buf: ^CHAR, + buf: [^]CHAR `fmt"q,len"`, } WSAPROTOCOL_INFO :: struct { - dwServiceFlags1: DWORD, - dwServiceFlags2: DWORD, - dwServiceFlags3: DWORD, - dwServiceFlags4: DWORD, - dwProviderFlags: DWORD, - ProviderId: GUID, - dwCatalogEntryId: DWORD, - ProtocolChain: WSAPROTOCOLCHAIN, - iVersion: c_int, - iAddressFamily: c_int, - iMaxSockAddr: c_int, - iMinSockAddr: c_int, - iSocketType: c_int, - iProtocol: c_int, + dwServiceFlags1: DWORD, + dwServiceFlags2: DWORD, + dwServiceFlags3: DWORD, + dwServiceFlags4: DWORD, + dwProviderFlags: DWORD, + ProviderId: GUID, + dwCatalogEntryId: DWORD, + ProtocolChain: WSAPROTOCOLCHAIN, + iVersion: c_int, + iAddressFamily: c_int, + iMaxSockAddr: c_int, + iMinSockAddr: c_int, + iSocketType: c_int, + iProtocol: c_int, iProtocolMaxOffset: c_int, - iNetworkByteOrder: c_int, - iSecurityScheme: c_int, - dwMessageSize: DWORD, + iNetworkByteOrder: c_int, + iSecurityScheme: c_int, + dwMessageSize: DWORD, dwProviderReserved: DWORD, - szProtocol: [WSAPROTOCOL_LEN + 1]u16, + szProtocol: [WSAPROTOCOL_LEN + 1]u16, } WIN32_FILE_ATTRIBUTE_DATA :: struct { dwFileAttributes: DWORD, - ftCreationTime: FILETIME, + ftCreationTime: FILETIME, ftLastAccessTime: FILETIME, - ftLastWriteTime: FILETIME, - nFileSizeHigh: DWORD, - nFileSizeLow: DWORD, + ftLastWriteTime: FILETIME, + nFileSizeHigh: DWORD, + nFileSizeLow: DWORD, } FILE_INFO_BY_HANDLE_CLASS :: enum c_int { - FileBasicInfo = 0, - FileStandardInfo = 1, - FileNameInfo = 2, - FileRenameInfo = 3, - FileDispositionInfo = 4, - FileAllocationInfo = 5, - FileEndOfFileInfo = 6, - FileStreamInfo = 7, - FileCompressionInfo = 8, - FileAttributeTagInfo = 9, - FileIdBothDirectoryInfo = 10, // 0xA + FileBasicInfo = 0, + FileStandardInfo = 1, + FileNameInfo = 2, + FileRenameInfo = 3, + FileDispositionInfo = 4, + FileAllocationInfo = 5, + FileEndOfFileInfo = 6, + FileStreamInfo = 7, + FileCompressionInfo = 8, + FileAttributeTagInfo = 9, + FileIdBothDirectoryInfo = 10, // 0xA FileIdBothDirectoryRestartInfo = 11, // 0xB - FileIoPriorityHintInfo = 12, // 0xC - FileRemoteProtocolInfo = 13, // 0xD - FileFullDirectoryInfo = 14, // 0xE - FileFullDirectoryRestartInfo = 15, // 0xF - FileStorageInfo = 16, // 0x10 - FileAlignmentInfo = 17, // 0x11 - FileIdInfo = 18, // 0x12 - FileIdExtdDirectoryInfo = 19, // 0x13 + FileIoPriorityHintInfo = 12, // 0xC + FileRemoteProtocolInfo = 13, // 0xD + FileFullDirectoryInfo = 14, // 0xE + FileFullDirectoryRestartInfo = 15, // 0xF + FileStorageInfo = 16, // 0x10 + FileAlignmentInfo = 17, // 0x11 + FileIdInfo = 18, // 0x12 + FileIdExtdDirectoryInfo = 19, // 0x13 FileIdExtdDirectoryRestartInfo = 20, // 0x14 MaximumFileInfoByHandlesClass, } FILE_BASIC_INFO :: struct { - CreationTime: LARGE_INTEGER, + CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, - LastWriteTime: LARGE_INTEGER, - ChangeTime: LARGE_INTEGER, + LastWriteTime: LARGE_INTEGER, + ChangeTime: LARGE_INTEGER, FileAttributes: DWORD, } @@ -2941,39 +2950,39 @@ FILE_NOTIFY_INFORMATION :: struct { } REPARSE_DATA_BUFFER :: struct { - ReparseTag: c_uint, + ReparseTag: c_uint, ReparseDataLength: c_ushort, - Reserved: c_ushort, - rest: [0]byte, + Reserved: c_ushort, + rest: [0]byte, } SYMBOLIC_LINK_REPARSE_BUFFER :: struct { SubstituteNameOffset: c_ushort, SubstituteNameLength: c_ushort, - PrintNameOffset: c_ushort, - PrintNameLength: c_ushort, - Flags: c_ulong, - PathBuffer: WCHAR, + PrintNameOffset: c_ushort, + PrintNameLength: c_ushort, + Flags: c_ulong, + PathBuffer: WCHAR, } MOUNT_POINT_REPARSE_BUFFER :: struct { SubstituteNameOffset: c_ushort, SubstituteNameLength: c_ushort, - PrintNameOffset: c_ushort, - PrintNameLength: c_ushort, - PathBuffer: WCHAR, + PrintNameOffset: c_ushort, + PrintNameLength: c_ushort, + PathBuffer: WCHAR, } LPPROGRESS_ROUTINE :: #type proc "system" ( - TotalFileSize: LARGE_INTEGER, - TotalBytesTransferred: LARGE_INTEGER, - StreamSize: LARGE_INTEGER, + TotalFileSize: LARGE_INTEGER, + TotalBytesTransferred: LARGE_INTEGER, + StreamSize: LARGE_INTEGER, StreamBytesTransferred: LARGE_INTEGER, - dwStreamNumber: DWORD, - dwCallbackReason: DWORD, - hSourceFile: HANDLE, - hDestinationFile: HANDLE, - lpData: LPVOID, + dwStreamNumber: DWORD, + dwCallbackReason: DWORD, + hSourceFile: HANDLE, + hDestinationFile: HANDLE, + lpData: LPVOID, ) -> DWORD CONDITION_VARIABLE :: struct { @@ -2984,21 +2993,21 @@ SRWLOCK :: struct { } CRITICAL_SECTION :: struct { CriticalSectionDebug: LPVOID, - LockCount: LONG, - RecursionCount: LONG, - OwningThread: HANDLE, - LockSemaphore: HANDLE, - SpinCount: ULONG_PTR, + LockCount: LONG, + RecursionCount: LONG, + OwningThread: HANDLE, + LockSemaphore: HANDLE, + SpinCount: ULONG_PTR, } REPARSE_MOUNTPOINT_DATA_BUFFER :: struct { - ReparseTag: DWORD, - ReparseDataLength: DWORD, - Reserved: WORD, - ReparseTargetLength: WORD, + ReparseTag: DWORD, + ReparseDataLength: DWORD, + Reserved: WORD, + ReparseTargetLength: WORD, ReparseTargetMaximumLength: WORD, - Reserved1: WORD, - ReparseTarget: WCHAR, + Reserved1: WORD, + ReparseTarget: WCHAR, } GUID :: struct { @@ -3021,12 +3030,12 @@ LPGUID :: ^GUID LPCGUID :: ^GUID REFIID :: ^GUID -REFGUID :: GUID -IID :: GUID -LPIID :: ^IID -CLSID :: GUID +REFGUID :: GUID +IID :: GUID +LPIID :: ^IID +CLSID :: GUID REFCLSID :: ^CLSID -LPCLSID :: ^CLSID +LPCLSID :: ^CLSID CLSCTX_INPROC_SERVER :: 0x1 CLSCTX_INPROC_HANDLER :: 0x2 @@ -3059,46 +3068,46 @@ CLSCTX_PS_DLL :: 0x80000000 CLSCTX_ALL :: CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER WSAPROTOCOLCHAIN :: struct { - ChainLen: c_int, - ChainEntries: [MAX_PROTOCOL_CHAIN]DWORD, + ChainLen: c_int, + ChainEntries: [MAX_PROTOCOL_CHAIN]DWORD `fmt:"v,ChainLen"`, } SECURITY_ATTRIBUTES :: struct { - nLength: DWORD, + nLength: DWORD, lpSecurityDescriptor: LPVOID, - bInheritHandle: BOOL, + bInheritHandle: BOOL, } PROCESS_INFORMATION :: struct { - hProcess: HANDLE, - hThread: HANDLE, + hProcess: HANDLE, + hThread: HANDLE, dwProcessId: DWORD, - dwThreadId: DWORD, + dwThreadId: DWORD, } STARTUPINFOW :: struct { - cb: DWORD, - lpReserved: LPWSTR, - lpDesktop: LPWSTR, - lpTitle: LPWSTR, - dwX: DWORD, - dwY: DWORD, - dwXSize: DWORD, - dwYSize: DWORD, - dwXCountChars: DWORD, - dwYCountChars: DWORD, + cb: DWORD, + lpReserved: LPWSTR, + lpDesktop: LPWSTR, + lpTitle: LPWSTR, + dwX: DWORD, + dwY: DWORD, + dwXSize: DWORD, + dwYSize: DWORD, + dwXCountChars: DWORD, + dwYCountChars: DWORD, dwFillAttribute: DWORD, - dwFlags: DWORD, - wShowWindow: WORD, - cbReserved2: WORD, - lpReserved2: LPBYTE, - hStdInput: HANDLE, - hStdOutput: HANDLE, - hStdError: HANDLE, + dwFlags: DWORD, + wShowWindow: WORD, + cbReserved2: WORD, + lpReserved2: LPBYTE, + hStdInput: HANDLE, + hStdOutput: HANDLE, + hStdError: HANDLE, } FILETIME :: struct { - dwLowDateTime: DWORD, + dwLowDateTime: DWORD, dwHighDateTime: DWORD, } @@ -3124,11 +3133,11 @@ UNICODE_STRING :: struct { } OVERLAPPED :: struct { - Internal: ^c_ulong, + Internal: ^c_ulong, InternalHigh: ^c_ulong, - Offset: DWORD, - OffsetHigh: DWORD, - hEvent: HANDLE, + Offset: DWORD, + OffsetHigh: DWORD, + hEvent: HANDLE, } OVERLAPPED_ENTRY :: struct { @@ -3139,9 +3148,9 @@ OVERLAPPED_ENTRY :: struct { } LPOVERLAPPED_COMPLETION_ROUTINE :: #type proc "system" ( - dwErrorCode: DWORD, + dwErrorCode: DWORD, dwNumberOfBytesTransfered: DWORD, - lpOverlapped: LPOVERLAPPED, + lpOverlapped: LPOVERLAPPED, ) ADDRESS_MODE :: enum c_int { @@ -3164,7 +3173,7 @@ fd_set :: struct { } timeval :: struct { - tv_sec: c_long, + tv_sec: c_long, tv_usec: c_long, } @@ -3199,145 +3208,145 @@ STATUS_PRIVILEGED_INSTRUCTION :: 0xC0000096 EXCEPTION_RECORD :: struct { - ExceptionCode: DWORD, - ExceptionFlags: DWORD, - ExceptionRecord: ^EXCEPTION_RECORD, - ExceptionAddress: LPVOID, - NumberParameters: DWORD, - ExceptionInformation: [EXCEPTION_MAXIMUM_PARAMETERS]LPVOID, + ExceptionCode: DWORD, + ExceptionFlags: DWORD, + ExceptionRecord: ^EXCEPTION_RECORD, + ExceptionAddress: LPVOID, + NumberParameters: DWORD, + ExceptionInformation: [EXCEPTION_MAXIMUM_PARAMETERS]LPVOID `fmt:"v,NumberParameters"`, } CONTEXT :: struct { - P1Home: DWORD64, - P2Home: DWORD64, - P3Home: DWORD64, - P4Home: DWORD64, - P5Home: DWORD64, - P6Home: DWORD64, + P1Home: DWORD64, + P2Home: DWORD64, + P3Home: DWORD64, + P4Home: DWORD64, + P5Home: DWORD64, + P6Home: DWORD64, ContextFlags: DWORD, - MxCsr: DWORD, - SegCs: WORD, - SegDs: WORD, - SegEs: WORD, - SegFs: WORD, - SegGs: WORD, - SegSs: WORD, - EFlags: DWORD, - Dr0: DWORD64, - Dr1: DWORD64, - Dr2: DWORD64, - Dr3: DWORD64, - Dr6: DWORD64, - Dr7: DWORD64, - Rax: DWORD64, - Rcx: DWORD64, - Rdx: DWORD64, - Rbx: DWORD64, - Rsp: DWORD64, - Rbp: DWORD64, - Rsi: DWORD64, - Rdi: DWORD64, - R8: DWORD64, - R9: DWORD64, - R10: DWORD64, - R11: DWORD64, - R12: DWORD64, - R13: DWORD64, - R14: DWORD64, - R15: DWORD64, - Rip: DWORD64, - _: struct #raw_union { + MxCsr: DWORD, + SegCs: WORD, + SegDs: WORD, + SegEs: WORD, + SegFs: WORD, + SegGs: WORD, + SegSs: WORD, + EFlags: DWORD, + Dr0: DWORD64, + Dr1: DWORD64, + Dr2: DWORD64, + Dr3: DWORD64, + Dr6: DWORD64, + Dr7: DWORD64, + Rax: DWORD64, + Rcx: DWORD64, + Rdx: DWORD64, + Rbx: DWORD64, + Rsp: DWORD64, + Rbp: DWORD64, + Rsi: DWORD64, + Rdi: DWORD64, + R8: DWORD64, + R9: DWORD64, + R10: DWORD64, + R11: DWORD64, + R12: DWORD64, + R13: DWORD64, + R14: DWORD64, + R15: DWORD64, + Rip: DWORD64, + using _: struct #raw_union { FltSave: XMM_SAVE_AREA32, - Q: [16]NEON128, - D: [32]ULONGLONG, - _: struct { + Q: [16]NEON128, + D: [32]ULONGLONG, + using _: struct { Header: [2]M128A, Legacy: [8]M128A, - Xmm0: M128A, - Xmm1: M128A, - Xmm2: M128A, - Xmm3: M128A, - Xmm4: M128A, - Xmm5: M128A, - Xmm6: M128A, - Xmm7: M128A, - Xmm8: M128A, - Xmm9: M128A, - Xmm10: M128A, - Xmm11: M128A, - Xmm12: M128A, - Xmm13: M128A, - Xmm14: M128A, - Xmm15: M128A, + Xmm0: M128A, + Xmm1: M128A, + Xmm2: M128A, + Xmm3: M128A, + Xmm4: M128A, + Xmm5: M128A, + Xmm6: M128A, + Xmm7: M128A, + Xmm8: M128A, + Xmm9: M128A, + Xmm10: M128A, + Xmm11: M128A, + Xmm12: M128A, + Xmm13: M128A, + Xmm14: M128A, + Xmm15: M128A, }, S: [32]DWORD, }, - VectorRegister: [26]M128A, - VectorControl: DWORD64, - DebugControl: DWORD64, - LastBranchToRip: DWORD64, - LastBranchFromRip: DWORD64, - LastExceptionToRip: DWORD64, + VectorRegister: [26]M128A, + VectorControl: DWORD64, + DebugControl: DWORD64, + LastBranchToRip: DWORD64, + LastBranchFromRip: DWORD64, + LastExceptionToRip: DWORD64, LastExceptionFromRip: DWORD64, } -PCONTEXT :: ^CONTEXT +PCONTEXT :: ^CONTEXT LPCONTEXT :: ^CONTEXT when size_of(uintptr) == 32 { XSAVE_FORMAT :: struct #align(16) { - ControlWord: WORD, - StatusWord: WORD, - TagWord: BYTE, - Reserved1: BYTE, - ErrorOpcode: WORD, - ErrorOffset: DWORD, - ErrorSelector: WORD, - Reserved2: WORD, - DataOffset: DWORD, - DataSelector: WORD, - Reserved3: WORD, - MxCsr: DWORD, - MxCsr_Mask: DWORD, + ControlWord: WORD, + StatusWord: WORD, + TagWord: BYTE, + Reserved1: BYTE, + ErrorOpcode: WORD, + ErrorOffset: DWORD, + ErrorSelector: WORD, + Reserved2: WORD, + DataOffset: DWORD, + DataSelector: WORD, + Reserved3: WORD, + MxCsr: DWORD, + MxCsr_Mask: DWORD, FloatRegisters: [8]M128A, // 32-bit specific - XmmRegisters: [8]M128A, - Reserved4: [192]BYTE, - StackControl: [7]DWORD, - Cr0NpxState: DWORD, + XmmRegisters: [8]M128A, + Reserved4: [192]BYTE, + StackControl: [7]DWORD, + Cr0NpxState: DWORD, } } else { XSAVE_FORMAT :: struct #align(16) { - ControlWord: WORD, - StatusWord: WORD, - TagWord: BYTE, - Reserved1: BYTE, - ErrorOpcode: WORD, - ErrorOffset: DWORD, - ErrorSelector: WORD, - Reserved2: WORD, - DataOffset: DWORD, - DataSelector: WORD, - Reserved3: WORD, - MxCsr: DWORD, - MxCsr_Mask: DWORD, + ControlWord: WORD, + StatusWord: WORD, + TagWord: BYTE, + Reserved1: BYTE, + ErrorOpcode: WORD, + ErrorOffset: DWORD, + ErrorSelector: WORD, + Reserved2: WORD, + DataOffset: DWORD, + DataSelector: WORD, + Reserved3: WORD, + MxCsr: DWORD, + MxCsr_Mask: DWORD, FloatRegisters: [8]M128A, // 64-bit specific - XmmRegisters: [16]M128A, - Reserved4: [96]BYTE, + XmmRegisters: [16]M128A, + Reserved4: [96]BYTE, } } XMM_SAVE_AREA32 :: XSAVE_FORMAT M128A :: struct { - Low: ULONGLONG, + Low: ULONGLONG, High: LONGLONG, } NEON128 :: struct { - Low: ULONGLONG, + Low: ULONGLONG, High: LONGLONG, } @@ -3386,17 +3395,17 @@ FILE_ATTRIBUTE_TAG_INFO :: struct { } // getaddrinfo flags https://learn.microsoft.com/en-us/windows/win32/api/ws2def/ns-ws2def-addrinfoa -AI_PASSIVE :: 0x01 -AI_CANONNAME :: 0x02 -AI_NUMERICHOST :: 0x04 -AI_ALL :: 0x0100 -AI_ADDRCONFIG :: 0x0400 -AI_V4MAPPED :: 0x0800 -AI_NON_AUTHORITATIVE :: 0x04000 -AI_SECURE :: 0x08000 +AI_PASSIVE :: 0x01 +AI_CANONNAME :: 0x02 +AI_NUMERICHOST :: 0x04 +AI_ALL :: 0x0100 +AI_ADDRCONFIG :: 0x0400 +AI_V4MAPPED :: 0x0800 +AI_NON_AUTHORITATIVE :: 0x04000 +AI_SECURE :: 0x08000 AI_RETURN_PREFERRED_NAMES :: 0x010000 -AI_FQDN :: 0x00020000 -AI_FILESERVER :: 0x00040000 +AI_FQDN :: 0x00020000 +AI_FILESERVER :: 0x00040000 PADDRINFOEXW :: ^ADDRINFOEXW LPADDRINFOEXW :: ^ADDRINFOEXW @@ -3415,9 +3424,9 @@ ADDRINFOEXW :: struct { } LPLOOKUPSERVICE_COMPLETION_ROUTINE :: #type proc "system" ( - dwErrorCode: DWORD, + dwErrorCode: DWORD, dwNumberOfBytesTransfered: DWORD, - lpOverlapped: LPOVERLAPPED, + lpOverlapped: LPOVERLAPPED, ) @@ -3427,18 +3436,18 @@ SYSTEM_INFO :: struct { dwOemID: DWORD, using _: struct #raw_union { wProcessorArchitecture: WORD, - wReserved: WORD, // reserved + wReserved: WORD, // reserved }, }, - dwPageSize: DWORD, + dwPageSize: DWORD, lpMinimumApplicationAddress: LPVOID, lpMaximumApplicationAddress: LPVOID, - dwActiveProcessorMask: DWORD_PTR, - dwNumberOfProcessors: DWORD, - dwProcessorType: DWORD, - dwAllocationGranularity: DWORD, - wProcessorLevel: WORD, - wProcessorRevision: WORD, + dwActiveProcessorMask: DWORD_PTR, + dwNumberOfProcessors: DWORD, + dwProcessorType: DWORD, + dwAllocationGranularity: DWORD, + wProcessorLevel: WORD, + wProcessorRevision: WORD, } // https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_osversioninfoexw @@ -3475,12 +3484,12 @@ LoadLibraryEx_Flags :: distinct bit_set[LoadLibraryEx_Flag] // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-quota_limits // Used in LogonUserExW PQUOTA_LIMITS :: struct { - PagedPoolLimit: SIZE_T, - NonPagedPoolLimit: SIZE_T, + PagedPoolLimit: SIZE_T, + NonPagedPoolLimit: SIZE_T, MinimumWorkingSetSize: SIZE_T, MaximumWorkingSetSize: SIZE_T, - PagefileLimit: SIZE_T, - TimeLimit: LARGE_INTEGER, + PagefileLimit: SIZE_T, + TimeLimit: LARGE_INTEGER, } Logon32_Type :: enum DWORD { @@ -3505,14 +3514,14 @@ Logon32_Provider :: enum DWORD { // Used in LoadUserProfileW PROFILEINFOW :: struct { - dwSize: DWORD, - dwFlags: DWORD, - lpUserName: LPWSTR, + dwSize: DWORD, + dwFlags: DWORD, + lpUserName: LPWSTR, lpProfilePath: LPWSTR, lpDefaultPath: LPWSTR, - lpServerName: LPWSTR, - lpPolicyPath: LPWSTR, - hProfile: HANDLE, + lpServerName: LPWSTR, + lpPolicyPath: LPWSTR, + hProfile: HANDLE, } SECURITY_MAX_SID_SIZE :: 68 @@ -3569,14 +3578,14 @@ USER_INFO_FLAG :: enum DWORD { USER_INFO_FLAGS :: distinct bit_set[USER_INFO_FLAG] USER_INFO_1 :: struct #packed { - name: LPWSTR, - password: LPWSTR, // Max password length is defined in LM20_PWLEN. + name: LPWSTR, + password: LPWSTR, // Max password length is defined in LM20_PWLEN. password_age: DWORD, - priv: USER_PRIV, - home_dir: LPWSTR, - comment: LPWSTR, - flags: USER_INFO_FLAGS, - script_path: LPWSTR, + priv: USER_PRIV, + home_dir: LPWSTR, + comment: LPWSTR, + flags: USER_INFO_FLAGS, + script_path: LPWSTR, } // #assert(size_of(USER_INFO_1) == 50) @@ -3585,320 +3594,320 @@ LOCALGROUP_MEMBERS_INFO_0 :: struct #packed { } NET_API_STATUS :: enum DWORD { - Success = 0, - ERROR_ACCESS_DENIED = 5, - MemberInAlias = 1378, - NetNotStarted = 2102, - UnknownServer = 2103, - ShareMem = 2104, - NoNetworkResource = 2105, - RemoteOnly = 2106, - DevNotRedirected = 2107, - ServerNotStarted = 2114, - ItemNotFound = 2115, - UnknownDevDir = 2116, - RedirectedPath = 2117, - DuplicateShare = 2118, - NoRoom = 2119, - TooManyItems = 2121, - InvalidMaxUsers = 2122, - BufTooSmall = 2123, - RemoteErr = 2127, - LanmanIniError = 2131, - NetworkError = 2136, - WkstaInconsistentState = 2137, - WkstaNotStarted = 2138, - BrowserNotStarted = 2139, - InternalError = 2140, - BadTransactConfig = 2141, - InvalidAPI = 2142, - BadEventName = 2143, - DupNameReboot = 2144, - CfgCompNotFound = 2146, - CfgParamNotFound = 2147, - LineTooLong = 2149, - QNotFound = 2150, - JobNotFound = 2151, - DestNotFound = 2152, - DestExists = 2153, - QExists = 2154, - QNoRoom = 2155, - JobNoRoom = 2156, - DestNoRoom = 2157, - DestIdle = 2158, - DestInvalidOp = 2159, - ProcNoRespond = 2160, - SpoolerNotLoaded = 2161, - DestInvalidState = 2162, - QInvalidState = 2163, - JobInvalidState = 2164, - SpoolNoMemory = 2165, - DriverNotFound = 2166, - DataTypeInvalid = 2167, - ProcNotFound = 2168, - ServiceTableLocked = 2180, - ServiceTableFull = 2181, - ServiceInstalled = 2182, - ServiceEntryLocked = 2183, - ServiceNotInstalled = 2184, - BadServiceName = 2185, - ServiceCtlTimeout = 2186, - ServiceCtlBusy = 2187, - BadServiceProgName = 2188, - ServiceNotCtrl = 2189, - ServiceKillProc = 2190, - ServiceCtlNotValid = 2191, - NotInDispatchTbl = 2192, - BadControlRecv = 2193, - ServiceNotStarting = 2194, - AlreadyLoggedOn = 2200, - NotLoggedOn = 2201, - BadUsername = 2202, - BadPassword = 2203, - UnableToAddName_W = 2204, - UnableToAddName_F = 2205, - UnableToDelName_W = 2206, - UnableToDelName_F = 2207, - LogonsPaused = 2209, - LogonServerConflict = 2210, - LogonNoUserPath = 2211, - LogonScriptError = 2212, - StandaloneLogon = 2214, - LogonServerNotFound = 2215, - LogonDomainExists = 2216, - NonValidatedLogon = 2217, - ACFNotFound = 2219, - GroupNotFound = 2220, - UserNotFound = 2221, - ResourceNotFound = 2222, - GroupExists = 2223, - UserExists = 2224, - ResourceExists = 2225, - NotPrimary = 2226, - ACFNotLoaded = 2227, - ACFNoRoom = 2228, - ACFFileIOFail = 2229, - ACFTooManyLists = 2230, - UserLogon = 2231, - ACFNoParent = 2232, - CanNotGrowSegment = 2233, - SpeGroupOp = 2234, - NotInCache = 2235, - UserInGroup = 2236, - UserNotInGroup = 2237, - AccountUndefined = 2238, - AccountExpired = 2239, - InvalidWorkstation = 2240, - InvalidLogonHours = 2241, - PasswordExpired = 2242, - PasswordCantChange = 2243, - PasswordHistConflict = 2244, - PasswordTooShort = 2245, - PasswordTooRecent = 2246, - InvalidDatabase = 2247, - DatabaseUpToDate = 2248, - SyncRequired = 2249, - UseNotFound = 2250, - BadAsgType = 2251, - DeviceIsShared = 2252, - SameAsComputerName = 2253, - NoComputerName = 2270, - MsgAlreadyStarted = 2271, - MsgInitFailed = 2272, - NameNotFound = 2273, - AlreadyForwarded = 2274, - AddForwarded = 2275, - AlreadyExists = 2276, - TooManyNames = 2277, - DelComputerName = 2278, - LocalForward = 2279, - GrpMsgProcessor = 2280, - PausedRemote = 2281, - BadReceive = 2282, - NameInUse = 2283, - MsgNotStarted = 2284, - NotLocalName = 2285, - NoForwardName = 2286, - RemoteFull = 2287, - NameNotForwarded = 2288, - TruncatedBroadcast = 2289, - InvalidDevice = 2294, - WriteFault = 2295, - DuplicateName = 2297, - DeleteLater = 2298, - IncompleteDel = 2299, - MultipleNets = 2300, - NetNameNotFound = 2310, - DeviceNotShared = 2311, - ClientNameNotFound = 2312, - FileIdNotFound = 2314, - ExecFailure = 2315, - TmpFile = 2316, - TooMuchData = 2317, - DeviceShareConflict = 2318, - BrowserTableIncomplete = 2319, - NotLocalDomain = 2320, - IsDfsShare = 2321, - DevInvalidOpCode = 2331, - DevNotFound = 2332, - DevNotOpen = 2333, - BadQueueDevString = 2334, - BadQueuePriority = 2335, - NoCommDevs = 2337, - QueueNotFound = 2338, - BadDevString = 2340, - BadDev = 2341, - InUseBySpooler = 2342, - CommDevInUse = 2343, - InvalidComputer = 2351, - MaxLenExceeded = 2354, - BadComponent = 2356, - CantType = 2357, - TooManyEntries = 2362, - ProfileFileTooBig = 2370, - ProfileOffset = 2371, - ProfileCleanup = 2372, - ProfileUnknownCmd = 2373, - ProfileLoadErr = 2374, - ProfileSaveErr = 2375, - LogOverflow = 2377, - LogFileChanged = 2378, - LogFileCorrupt = 2379, - SourceIsDir = 2380, - BadSource = 2381, - BadDest = 2382, - DifferentServers = 2383, - RunSrvPaused = 2385, - ErrCommRunSrv = 2389, - ErrorExecingGhost = 2391, - ShareNotFound = 2392, - InvalidLana = 2400, - OpenFiles = 2401, - ActiveConns = 2402, - BadPasswordCore = 2403, - DevInUse = 2404, - LocalDrive = 2405, - AlertExists = 2430, - TooManyAlerts = 2431, - NoSuchAlert = 2432, - BadRecipient = 2433, - AcctLimitExceeded = 2434, - InvalidLogSeek = 2440, - BadUasConfig = 2450, - InvalidUASOp = 2451, - LastAdmin = 2452, - DCNotFound = 2453, - LogonTrackingError = 2454, - NetlogonNotStarted = 2455, - CanNotGrowUASFile = 2456, - TimeDiffAtDC = 2457, - PasswordMismatch = 2458, - NoSuchServer = 2460, - NoSuchSession = 2461, - NoSuchConnection = 2462, - TooManyServers = 2463, - TooManySessions = 2464, - TooManyConnections = 2465, - TooManyFiles = 2466, - NoAlternateServers = 2467, - TryDownLevel = 2470, - UPSDriverNotStarted = 2480, - UPSInvalidConfig = 2481, - UPSInvalidCommPort = 2482, - UPSSignalAsserted = 2483, - UPSShutdownFailed = 2484, - BadDosRetCode = 2500, - ProgNeedsExtraMem = 2501, - BadDosFunction = 2502, - RemoteBootFailed = 2503, - BadFileCheckSum = 2504, - NoRplBootSystem = 2505, - RplLoadrNetBiosErr = 2506, - RplLoadrDiskErr = 2507, - ImageParamErr = 2508, - TooManyImageParams = 2509, - NonDosFloppyUsed = 2510, - RplBootRestart = 2511, - RplSrvrCallFailed = 2512, - CantConnectRplSrvr = 2513, - CantOpenImageFile = 2514, - CallingRplSrvr = 2515, - StartingRplBoot = 2516, - RplBootServiceTerm = 2517, - RplBootStartFailed = 2518, - RPL_CONNECTED = 2519, - BrowserConfiguredToNotRun = 2550, - RplNoAdaptersStarted = 2610, - RplBadRegistry = 2611, - RplBadDatabase = 2612, - RplRplfilesShare = 2613, - RplNotRplServer = 2614, - RplCannotEnum = 2615, - RplWkstaInfoCorrupted = 2616, - RplWkstaNotFound = 2617, - RplWkstaNameUnavailable = 2618, - RplProfileInfoCorrupted = 2619, - RplProfileNotFound = 2620, - RplProfileNameUnavailable = 2621, - RplProfileNotEmpty = 2622, - RplConfigInfoCorrupted = 2623, - RplConfigNotFound = 2624, - RplAdapterInfoCorrupted = 2625, - RplInternal = 2626, - RplVendorInfoCorrupted = 2627, - RplBootInfoCorrupted = 2628, - RplWkstaNeedsUserAcct = 2629, - RplNeedsRPLUSERAcct = 2630, - RplBootNotFound = 2631, - RplIncompatibleProfile = 2632, - RplAdapterNameUnavailable = 2633, - RplConfigNotEmpty = 2634, - RplBootInUse = 2635, - RplBackupDatabase = 2636, - RplAdapterNotFound = 2637, - RplVendorNotFound = 2638, - RplVendorNameUnavailable = 2639, - RplBootNameUnavailable = 2640, - RplConfigNameUnavailable = 2641, - DfsInternalCorruption = 2660, - DfsVolumeDataCorrupt = 2661, - DfsNoSuchVolume = 2662, - DfsVolumeAlreadyExists = 2663, - DfsAlreadyShared = 2664, - DfsNoSuchShare = 2665, - DfsNotALeafVolume = 2666, - DfsLeafVolume = 2667, - DfsVolumeHasMultipleServers = 2668, - DfsCantCreateJunctionPoint = 2669, - DfsServerNotDfsAware = 2670, - DfsBadRenamePath = 2671, - DfsVolumeIsOffline = 2672, - DfsNoSuchServer = 2673, - DfsCyclicalName = 2674, - DfsNotSupportedInServerDfs = 2675, - DfsDuplicateService = 2676, + Success = 0, + ERROR_ACCESS_DENIED = 5, + MemberInAlias = 1378, + NetNotStarted = 2102, + UnknownServer = 2103, + ShareMem = 2104, + NoNetworkResource = 2105, + RemoteOnly = 2106, + DevNotRedirected = 2107, + ServerNotStarted = 2114, + ItemNotFound = 2115, + UnknownDevDir = 2116, + RedirectedPath = 2117, + DuplicateShare = 2118, + NoRoom = 2119, + TooManyItems = 2121, + InvalidMaxUsers = 2122, + BufTooSmall = 2123, + RemoteErr = 2127, + LanmanIniError = 2131, + NetworkError = 2136, + WkstaInconsistentState = 2137, + WkstaNotStarted = 2138, + BrowserNotStarted = 2139, + InternalError = 2140, + BadTransactConfig = 2141, + InvalidAPI = 2142, + BadEventName = 2143, + DupNameReboot = 2144, + CfgCompNotFound = 2146, + CfgParamNotFound = 2147, + LineTooLong = 2149, + QNotFound = 2150, + JobNotFound = 2151, + DestNotFound = 2152, + DestExists = 2153, + QExists = 2154, + QNoRoom = 2155, + JobNoRoom = 2156, + DestNoRoom = 2157, + DestIdle = 2158, + DestInvalidOp = 2159, + ProcNoRespond = 2160, + SpoolerNotLoaded = 2161, + DestInvalidState = 2162, + QInvalidState = 2163, + JobInvalidState = 2164, + SpoolNoMemory = 2165, + DriverNotFound = 2166, + DataTypeInvalid = 2167, + ProcNotFound = 2168, + ServiceTableLocked = 2180, + ServiceTableFull = 2181, + ServiceInstalled = 2182, + ServiceEntryLocked = 2183, + ServiceNotInstalled = 2184, + BadServiceName = 2185, + ServiceCtlTimeout = 2186, + ServiceCtlBusy = 2187, + BadServiceProgName = 2188, + ServiceNotCtrl = 2189, + ServiceKillProc = 2190, + ServiceCtlNotValid = 2191, + NotInDispatchTbl = 2192, + BadControlRecv = 2193, + ServiceNotStarting = 2194, + AlreadyLoggedOn = 2200, + NotLoggedOn = 2201, + BadUsername = 2202, + BadPassword = 2203, + UnableToAddName_W = 2204, + UnableToAddName_F = 2205, + UnableToDelName_W = 2206, + UnableToDelName_F = 2207, + LogonsPaused = 2209, + LogonServerConflict = 2210, + LogonNoUserPath = 2211, + LogonScriptError = 2212, + StandaloneLogon = 2214, + LogonServerNotFound = 2215, + LogonDomainExists = 2216, + NonValidatedLogon = 2217, + ACFNotFound = 2219, + GroupNotFound = 2220, + UserNotFound = 2221, + ResourceNotFound = 2222, + GroupExists = 2223, + UserExists = 2224, + ResourceExists = 2225, + NotPrimary = 2226, + ACFNotLoaded = 2227, + ACFNoRoom = 2228, + ACFFileIOFail = 2229, + ACFTooManyLists = 2230, + UserLogon = 2231, + ACFNoParent = 2232, + CanNotGrowSegment = 2233, + SpeGroupOp = 2234, + NotInCache = 2235, + UserInGroup = 2236, + UserNotInGroup = 2237, + AccountUndefined = 2238, + AccountExpired = 2239, + InvalidWorkstation = 2240, + InvalidLogonHours = 2241, + PasswordExpired = 2242, + PasswordCantChange = 2243, + PasswordHistConflict = 2244, + PasswordTooShort = 2245, + PasswordTooRecent = 2246, + InvalidDatabase = 2247, + DatabaseUpToDate = 2248, + SyncRequired = 2249, + UseNotFound = 2250, + BadAsgType = 2251, + DeviceIsShared = 2252, + SameAsComputerName = 2253, + NoComputerName = 2270, + MsgAlreadyStarted = 2271, + MsgInitFailed = 2272, + NameNotFound = 2273, + AlreadyForwarded = 2274, + AddForwarded = 2275, + AlreadyExists = 2276, + TooManyNames = 2277, + DelComputerName = 2278, + LocalForward = 2279, + GrpMsgProcessor = 2280, + PausedRemote = 2281, + BadReceive = 2282, + NameInUse = 2283, + MsgNotStarted = 2284, + NotLocalName = 2285, + NoForwardName = 2286, + RemoteFull = 2287, + NameNotForwarded = 2288, + TruncatedBroadcast = 2289, + InvalidDevice = 2294, + WriteFault = 2295, + DuplicateName = 2297, + DeleteLater = 2298, + IncompleteDel = 2299, + MultipleNets = 2300, + NetNameNotFound = 2310, + DeviceNotShared = 2311, + ClientNameNotFound = 2312, + FileIdNotFound = 2314, + ExecFailure = 2315, + TmpFile = 2316, + TooMuchData = 2317, + DeviceShareConflict = 2318, + BrowserTableIncomplete = 2319, + NotLocalDomain = 2320, + IsDfsShare = 2321, + DevInvalidOpCode = 2331, + DevNotFound = 2332, + DevNotOpen = 2333, + BadQueueDevString = 2334, + BadQueuePriority = 2335, + NoCommDevs = 2337, + QueueNotFound = 2338, + BadDevString = 2340, + BadDev = 2341, + InUseBySpooler = 2342, + CommDevInUse = 2343, + InvalidComputer = 2351, + MaxLenExceeded = 2354, + BadComponent = 2356, + CantType = 2357, + TooManyEntries = 2362, + ProfileFileTooBig = 2370, + ProfileOffset = 2371, + ProfileCleanup = 2372, + ProfileUnknownCmd = 2373, + ProfileLoadErr = 2374, + ProfileSaveErr = 2375, + LogOverflow = 2377, + LogFileChanged = 2378, + LogFileCorrupt = 2379, + SourceIsDir = 2380, + BadSource = 2381, + BadDest = 2382, + DifferentServers = 2383, + RunSrvPaused = 2385, + ErrCommRunSrv = 2389, + ErrorExecingGhost = 2391, + ShareNotFound = 2392, + InvalidLana = 2400, + OpenFiles = 2401, + ActiveConns = 2402, + BadPasswordCore = 2403, + DevInUse = 2404, + LocalDrive = 2405, + AlertExists = 2430, + TooManyAlerts = 2431, + NoSuchAlert = 2432, + BadRecipient = 2433, + AcctLimitExceeded = 2434, + InvalidLogSeek = 2440, + BadUasConfig = 2450, + InvalidUASOp = 2451, + LastAdmin = 2452, + DCNotFound = 2453, + LogonTrackingError = 2454, + NetlogonNotStarted = 2455, + CanNotGrowUASFile = 2456, + TimeDiffAtDC = 2457, + PasswordMismatch = 2458, + NoSuchServer = 2460, + NoSuchSession = 2461, + NoSuchConnection = 2462, + TooManyServers = 2463, + TooManySessions = 2464, + TooManyConnections = 2465, + TooManyFiles = 2466, + NoAlternateServers = 2467, + TryDownLevel = 2470, + UPSDriverNotStarted = 2480, + UPSInvalidConfig = 2481, + UPSInvalidCommPort = 2482, + UPSSignalAsserted = 2483, + UPSShutdownFailed = 2484, + BadDosRetCode = 2500, + ProgNeedsExtraMem = 2501, + BadDosFunction = 2502, + RemoteBootFailed = 2503, + BadFileCheckSum = 2504, + NoRplBootSystem = 2505, + RplLoadrNetBiosErr = 2506, + RplLoadrDiskErr = 2507, + ImageParamErr = 2508, + TooManyImageParams = 2509, + NonDosFloppyUsed = 2510, + RplBootRestart = 2511, + RplSrvrCallFailed = 2512, + CantConnectRplSrvr = 2513, + CantOpenImageFile = 2514, + CallingRplSrvr = 2515, + StartingRplBoot = 2516, + RplBootServiceTerm = 2517, + RplBootStartFailed = 2518, + RPL_CONNECTED = 2519, + BrowserConfiguredToNotRun = 2550, + RplNoAdaptersStarted = 2610, + RplBadRegistry = 2611, + RplBadDatabase = 2612, + RplRplfilesShare = 2613, + RplNotRplServer = 2614, + RplCannotEnum = 2615, + RplWkstaInfoCorrupted = 2616, + RplWkstaNotFound = 2617, + RplWkstaNameUnavailable = 2618, + RplProfileInfoCorrupted = 2619, + RplProfileNotFound = 2620, + RplProfileNameUnavailable = 2621, + RplProfileNotEmpty = 2622, + RplConfigInfoCorrupted = 2623, + RplConfigNotFound = 2624, + RplAdapterInfoCorrupted = 2625, + RplInternal = 2626, + RplVendorInfoCorrupted = 2627, + RplBootInfoCorrupted = 2628, + RplWkstaNeedsUserAcct = 2629, + RplNeedsRPLUSERAcct = 2630, + RplBootNotFound = 2631, + RplIncompatibleProfile = 2632, + RplAdapterNameUnavailable = 2633, + RplConfigNotEmpty = 2634, + RplBootInUse = 2635, + RplBackupDatabase = 2636, + RplAdapterNotFound = 2637, + RplVendorNotFound = 2638, + RplVendorNameUnavailable = 2639, + RplBootNameUnavailable = 2640, + RplConfigNameUnavailable = 2641, + DfsInternalCorruption = 2660, + DfsVolumeDataCorrupt = 2661, + DfsNoSuchVolume = 2662, + DfsVolumeAlreadyExists = 2663, + DfsAlreadyShared = 2664, + DfsNoSuchShare = 2665, + DfsNotALeafVolume = 2666, + DfsLeafVolume = 2667, + DfsVolumeHasMultipleServers = 2668, + DfsCantCreateJunctionPoint = 2669, + DfsServerNotDfsAware = 2670, + DfsBadRenamePath = 2671, + DfsVolumeIsOffline = 2672, + DfsNoSuchServer = 2673, + DfsCyclicalName = 2674, + DfsNotSupportedInServerDfs = 2675, + DfsDuplicateService = 2676, DfsCantRemoveLastServerShare = 2677, - DfsVolumeIsInterDfs = 2678, - DfsInconsistent = 2679, - DfsServerUpgraded = 2680, - DfsDataIsIdentical = 2681, - DfsCantRemoveDfsRoot = 2682, - DfsChildOrParentInDfs = 2683, - DfsInternalError = 2690, - SetupAlreadyJoined = 2691, - SetupNotJoined = 2692, - SetupDomainController = 2693, - DefaultJoinRequired = 2694, - InvalidWorkgroupName = 2695, + DfsVolumeIsInterDfs = 2678, + DfsInconsistent = 2679, + DfsServerUpgraded = 2680, + DfsDataIsIdentical = 2681, + DfsCantRemoveDfsRoot = 2682, + DfsChildOrParentInDfs = 2683, + DfsInternalError = 2690, + SetupAlreadyJoined = 2691, + SetupNotJoined = 2692, + SetupDomainController = 2693, + DefaultJoinRequired = 2694, + InvalidWorkgroupName = 2695, NameUsesIncompatibleCodePage = 2696, - ComputerAccountNotFound = 2697, - PersonalSku = 2698, - SetupCheckDNSConfig = 2699, - PasswordMustChange = 2701, - AccountLockedOut = 2702, - PasswordTooLong = 2703, - PasswordNotComplexEnough = 2704, - PasswordFilterError = 2705, + ComputerAccountNotFound = 2697, + PersonalSku = 2698, + SetupCheckDNSConfig = 2699, + PasswordMustChange = 2701, + AccountLockedOut = 2702, + PasswordTooLong = 2703, + PasswordNotComplexEnough = 2704, + PasswordFilterError = 2705, } @@ -4053,12 +4062,12 @@ IMAGE_DEBUG_DIRECTORY :: struct { IMAGE_DEBUG_TYPE_CODEVIEW :: 2 -SICHINTF :: DWORD -SHCONTF :: DWORD -SFGAOF :: ULONG +SICHINTF :: DWORD +SHCONTF :: DWORD +SFGAOF :: ULONG FILEOPENDIALOGOPTIONS :: DWORD -REFPROPERTYKEY :: ^PROPERTYKEY -REFPROPVARIANT :: ^PROPVARIANT +REFPROPERTYKEY :: ^PROPERTYKEY +REFPROPVARIANT :: ^PROPVARIANT SIGDN :: enum c_int { NORMALDISPLAY = 0, @@ -4083,57 +4092,57 @@ SIATTRIBFLAGS :: enum c_int { FDAP :: enum c_int { BOTTOM = 0, - TOP = 1, + TOP = 1, } FDE_SHAREVIOLATION_RESPONSE :: enum c_int { DEFAULT = 0, - ACCEPT = 1, - REFUSE = 2, + ACCEPT = 1, + REFUSE = 2, } GETPROPERTYSTOREFLAGS :: enum c_int { - DEFAULT = 0, - HANDLERPROPERTIESONLY = 0x1, - READWRITE = 0x2, - TEMPORARY = 0x4, - FASTPROPERTIESONLY = 0x8, - OPENSLOWITEM = 0x10, - DELAYCREATION = 0x20, - BESTEFFORT = 0x40, - NO_OPLOCK = 0x80, - PREFERQUERYPROPERTIES = 0x100, - EXTRINSICPROPERTIES = 0x200, - EXTRINSICPROPERTIESONLY = 0x400, - VOLATILEPROPERTIES = 0x800, - VOLATILEPROPERTIESONLY = 0x1000, - MASK_VALID = 0x1fff, + DEFAULT = 0, + HANDLERPROPERTIESONLY = 0x1, + READWRITE = 0x2, + TEMPORARY = 0x4, + FASTPROPERTIESONLY = 0x8, + OPENSLOWITEM = 0x10, + DELAYCREATION = 0x20, + BESTEFFORT = 0x40, + NO_OPLOCK = 0x80, + PREFERQUERYPROPERTIES = 0x100, + EXTRINSICPROPERTIES = 0x200, + EXTRINSICPROPERTIESONLY = 0x400, + VOLATILEPROPERTIES = 0x800, + VOLATILEPROPERTIESONLY = 0x1000, + MASK_VALID = 0x1fff, } PROPERTYKEY :: struct { fmtid: GUID, - pid: DWORD, + pid: DWORD, } BIND_OPTS :: struct { - cbStruct: DWORD, - grfFlags: DWORD, - grfMode: DWORD, + cbStruct: DWORD, + grfFlags: DWORD, + grfMode: DWORD, dwTickCountDeadline: DWORD, } STATSTG :: struct { - pwcsName: LPOLESTR, - type: DWORD, - cbSize: ULARGE_INTEGER, - mtime: FILETIME, - ctime: FILETIME, - atime: FILETIME, - grfMode: DWORD, + pwcsName: LPOLESTR, + type: DWORD, + cbSize: ULARGE_INTEGER, + mtime: FILETIME, + ctime: FILETIME, + atime: FILETIME, + grfMode: DWORD, grfLocksSupported: DWORD, - clsid: CLSID, - grfStateBits: DWORD, - reserved: DWORD, + clsid: CLSID, + grfStateBits: DWORD, + reserved: DWORD, } COMDLG_FILTERSPEC :: struct { @@ -4142,15 +4151,15 @@ COMDLG_FILTERSPEC :: struct { DECIMAL :: struct { wReserved: USHORT, - _: struct #raw_union { - _: struct { + using _: struct #raw_union { + using _: struct { scale, sign: BYTE, }, signscale: USHORT, }, Hi32: ULONG, - _: struct #raw_union { - _: struct { + using _: struct #raw_union { + using _: struct { Lo32, Mid32: ULONG, }, Lo64: ULONGLONG, @@ -4223,14 +4232,14 @@ LWSTDAPI :: HRESULT CLSID_FileOpenDialog := &GUID{0xDC1C5A9C, 0xE88A, 0x4DDE, {0xA5, 0xA1, 0x60, 0xF8, 0x2A, 0x20, 0xAE, 0xF7}} CLSID_FileSaveDialog := &GUID{0xC0B4E2F3, 0xBA21, 0x4773, {0x8D, 0xBA, 0x33, 0x5E, 0xC9, 0x46, 0xEB, 0x8B}} -CLSID_TaskbarList := &GUID{0x56FDF344, 0xFD6D, 0x11d0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}} +CLSID_TaskbarList := &GUID{0x56FDF344, 0xFD6D, 0x11d0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}} -IID_IFileDialog := &GUID{0x42F85136, 0xDB7E, 0x439C, {0x85, 0xF1, 0xE4, 0x07, 0x5D, 0x13, 0x5F, 0xC8}} -IID_IFileSaveDialog := &GUID{0x84BCCD23, 0x5FDE, 0x4CDB, {0xAE, 0xA4, 0xAF, 0x64, 0xB8, 0x3D, 0x78, 0xAB}} -IID_IFileOpenDialog := &GUID{0xD57C7288, 0xD4AD, 0x4768, {0xBE, 0x02, 0x9D, 0x96, 0x95, 0x32, 0xD9, 0x60}} -IID_ITaskbarList := &GUID{0x56FDF342, 0xFD6D, 0x11d0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}} -IID_ITaskbarList2 := &GUID{0x602D4995, 0xB13A, 0x429b, {0xA6, 0x6E, 0x19, 0x35, 0xE4, 0x4F, 0x43, 0x17}} -IID_ITaskbarList3 := &GUID{0xea1afb91, 0x9e28, 0x4b86, {0x90, 0xe9, 0x9e, 0x9f, 0x8a, 0x5e, 0xef, 0xaf}} +IID_IFileDialog := &GUID{0x42F85136, 0xDB7E, 0x439C, {0x85, 0xF1, 0xE4, 0x07, 0x5D, 0x13, 0x5F, 0xC8}} +IID_IFileSaveDialog := &GUID{0x84BCCD23, 0x5FDE, 0x4CDB, {0xAE, 0xA4, 0xAF, 0x64, 0xB8, 0x3D, 0x78, 0xAB}} +IID_IFileOpenDialog := &GUID{0xD57C7288, 0xD4AD, 0x4768, {0xBE, 0x02, 0x9D, 0x96, 0x95, 0x32, 0xD9, 0x60}} +IID_ITaskbarList := &GUID{0x56FDF342, 0xFD6D, 0x11d0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}} +IID_ITaskbarList2 := &GUID{0x602D4995, 0xB13A, 0x429b, {0xA6, 0x6E, 0x19, 0x35, 0xE4, 0x4F, 0x43, 0x17}} +IID_ITaskbarList3 := &GUID{0xea1afb91, 0x9e28, 0x4b86, {0x90, 0xe9, 0x9e, 0x9f, 0x8a, 0x5e, 0xef, 0xaf}} IModalWindow :: struct #raw_union { #subtype IUnknown: IUnknown, @@ -4726,24 +4735,24 @@ Windows_Product_Type :: enum DWORD { WEB_SERVER_CORE = 0x0000001D, // Web Server (core installation) } -ENABLE_ECHO_INPUT : DWORD : 0x0004 -ENABLE_INSERT_MODE : DWORD : 0x0020 -ENABLE_LINE_INPUT : DWORD : 0x0002 -ENABLE_MOUSE_INPUT : DWORD : 0x0010 -ENABLE_PROCESSED_INPUT : DWORD : 0x0001 -ENABLE_QUICK_EDIT_MODE : DWORD : 0x0040 -ENABLE_WINDOW_INPUT : DWORD : 0x0008 -ENABLE_VIRTUAL_TERMINAL_INPUT : DWORD : 0x0200 -ENABLE_PROCESSED_OUTPUT : DWORD : 0x0001 -ENABLE_WRAP_AT_EOL_OUTPUT : DWORD : 0x0002 +ENABLE_ECHO_INPUT : DWORD : 0x0004 +ENABLE_INSERT_MODE : DWORD : 0x0020 +ENABLE_LINE_INPUT : DWORD : 0x0002 +ENABLE_MOUSE_INPUT : DWORD : 0x0010 +ENABLE_PROCESSED_INPUT : DWORD : 0x0001 +ENABLE_QUICK_EDIT_MODE : DWORD : 0x0040 +ENABLE_WINDOW_INPUT : DWORD : 0x0008 +ENABLE_VIRTUAL_TERMINAL_INPUT : DWORD : 0x0200 +ENABLE_PROCESSED_OUTPUT : DWORD : 0x0001 +ENABLE_WRAP_AT_EOL_OUTPUT : DWORD : 0x0002 ENABLE_VIRTUAL_TERMINAL_PROCESSING : DWORD : 0x0004 -DISABLE_NEWLINE_AUTO_RETURN : DWORD : 0x0008 -ENABLE_LVB_GRID_WORLDWIDE : DWORD : 0x0010 +DISABLE_NEWLINE_AUTO_RETURN : DWORD : 0x0008 +ENABLE_LVB_GRID_WORLDWIDE : DWORD : 0x0010 -CTRL_C_EVENT : DWORD : 0 -CTRL_BREAK_EVENT : DWORD : 1 -CTRL_CLOSE_EVENT : DWORD : 2 -CTRL_LOGOFF_EVENT : DWORD : 5 +CTRL_C_EVENT : DWORD : 0 +CTRL_BREAK_EVENT : DWORD : 1 +CTRL_CLOSE_EVENT : DWORD : 2 +CTRL_LOGOFF_EVENT : DWORD : 5 CTRL_SHUTDOWN_EVENT : DWORD : 6 COORD :: struct { @@ -4752,45 +4761,45 @@ COORD :: struct { } SMALL_RECT :: struct { - Left: SHORT, - Top: SHORT, - Right: SHORT, + Left: SHORT, + Top: SHORT, + Right: SHORT, Bottom: SHORT, } CONSOLE_SCREEN_BUFFER_INFO :: struct { - dwSize: COORD, - dwCursorPosition: COORD, - wAttributes: WORD, - srWindow: SMALL_RECT, + dwSize: COORD, + dwCursorPosition: COORD, + wAttributes: WORD, + srWindow: SMALL_RECT, dwMaximumWindowSize: COORD, } CONSOLE_CURSOR_INFO :: struct { - dwSize: DWORD, + dwSize: DWORD, bVisible: BOOL, } PCONSOLE_SCREEN_BUFFER_INFO :: ^CONSOLE_SCREEN_BUFFER_INFO -PCONSOLE_CURSOR_INFO :: ^CONSOLE_CURSOR_INFO +PCONSOLE_CURSOR_INFO :: ^CONSOLE_CURSOR_INFO Event_Type :: enum WORD { - KEY_EVENT = 0x0001, - MOUSE_EVENT = 0x0002, + KEY_EVENT = 0x0001, + MOUSE_EVENT = 0x0002, WINDOW_BUFFER_SIZE_EVENT = 0x0004, - MENU_EVENT = 0x0008, - FOCUS_EVENT = 0x0010, + MENU_EVENT = 0x0008, + FOCUS_EVENT = 0x0010, } INPUT_RECORD :: struct { EventType: Event_Type, Event: struct #raw_union { - KeyEvent: KEY_EVENT_RECORD, - MouseEvent: MOUSE_EVENT_RECORD, - WindowBufferSizeEvent: WINDOW_BUFFER_SIZE_RECORD, - MenuEvent: MENU_EVENT_RECORD, - FocusEvent: FOCUS_EVENT_RECORD, + KeyEvent: KEY_EVENT_RECORD `raw_union_tag:"EventType=KEY_EVENT"`, + MouseEvent: MOUSE_EVENT_RECORD `raw_union_tag:"EventType=MOUSE_EVENT"`, + WindowBufferSizeEvent: WINDOW_BUFFER_SIZE_RECORD `raw_union_tag:"EventType=WINDOW_BUFFER_SIZE_EVENT"`, + MenuEvent: MENU_EVENT_RECORD `raw_union_tag:"EventType=MENU_EVENT"`, + FocusEvent: FOCUS_EVENT_RECORD `raw_union_tag:"EventType=FOCUS_EVENT"`, }, } @@ -4820,10 +4829,10 @@ KEY_EVENT_RECORD :: struct { } MOUSE_EVENT_RECORD :: struct { - dwMousePosition: COORD, - dwButtonState: DWORD, + dwMousePosition: COORD, + dwButtonState: DWORD, dwControlKeyState: DWORD, - dwEventFlags: DWORD, + dwEventFlags: DWORD, } WINDOW_BUFFER_SIZE_RECORD :: struct { @@ -4949,16 +4958,16 @@ SO_SNDBUF : c_int : 0x1001 SO_ERROR : c_int : 0x1007 SO_BROADCAST : c_int : 0x0020 -TCP_NODELAY: c_int : 0x0001 -IP_TTL: c_int : 4 -IPV6_V6ONLY: c_int : 27 -IP_MULTICAST_LOOP: c_int : 11 -IPV6_MULTICAST_LOOP: c_int : 11 -IP_MULTICAST_TTL: c_int : 10 -IP_ADD_MEMBERSHIP: c_int : 12 +TCP_NODELAY : c_int : 0x0001 +IP_TTL : c_int : 4 +IPV6_V6ONLY : c_int : 27 +IP_MULTICAST_LOOP : c_int : 11 +IPV6_MULTICAST_LOOP : c_int : 11 +IP_MULTICAST_TTL : c_int : 10 +IP_ADD_MEMBERSHIP : c_int : 12 -IPV6_ADD_MEMBERSHIP: c_int : 12 -IPV6_DROP_MEMBERSHIP: c_int : 13 +IPV6_ADD_MEMBERSHIP : c_int : 12 +IPV6_DROP_MEMBERSHIP : c_int : 13 MAX_PROTOCOL_CHAIN: DWORD : 7 @@ -4972,8 +4981,8 @@ MSG_OOB : c_int : 1 // `send`/`recv` should process out-of-band data. MSG_PEEK : c_int : 2 // `recv` should not remove the data from the buffer. Only valid for non-overlapped operations. -SOCKET :: distinct uintptr // TODO -socklen_t :: c_int +SOCKET :: distinct uintptr // TODO +socklen_t :: c_int ADDRESS_FAMILY :: USHORT ip_mreq :: struct { @@ -4999,7 +5008,7 @@ ADDRINFOA :: struct { ai_socktype: c_int, ai_protocol: c_int, ai_addrlen: size_t, - ai_canonname: ^c_char, + ai_canonname: [^]c_char `fmt:"q,ai_addrlen"`, ai_addr: ^SOCKADDR, ai_next: ^ADDRINFOA, } @@ -5032,18 +5041,18 @@ in6_addr :: struct { } -DNS_STATUS :: distinct DWORD // zero is success -DNS_INFO_NO_RECORDS :: 9501 +DNS_STATUS :: distinct DWORD // zero is success +DNS_INFO_NO_RECORDS :: 9501 DNS_QUERY_NO_RECURSION :: 0x00000004 DNS_RECORD :: struct { // aka DNS_RECORDA - pNext: ^DNS_RECORD, - pName: cstring, - wType: WORD, + pNext: ^DNS_RECORD, + pName: cstring, + wType: WORD, wDataLength: USHORT, - Flags: DWORD, - dwTtl: DWORD, - _: DWORD, + Flags: DWORD, + dwTtl: DWORD, + _: DWORD, Data: struct #raw_union #align(4) { CNAME: DNS_PTR_DATAA, A: u32be, // Ipv4 Address @@ -5064,8 +5073,8 @@ DNS_PTR_DATAA :: cstring DNS_MX_DATAA :: struct { pNameExchange: cstring, // the hostname - wPreference: WORD, // lower values preferred - _: WORD, // padding. + wPreference: WORD, // lower values preferred + _: WORD, // padding. } DNS_SRV_DATAA :: struct { pNameTarget: cstring, @@ -5110,8 +5119,8 @@ ENUMRESTYPEPROCW :: #type proc (hModule: HMODULE, lpType: LPCWSTR, lParam: LONG_ ENUMRESLANGPROCW :: #type proc (hModule: HMODULE, lpType: LPCWSTR, lpName: LPWSTR, wIDLanguage: LANGID, lParam: LONG_PTR)-> BOOL DTR_Control :: enum byte { - Disable = 0, - Enable = 1, + Disable = 0, + Enable = 1, Handshake = 2, } RTS_Control :: enum byte { @@ -5128,9 +5137,9 @@ Parity :: enum byte { Space = 4, } Stop_Bits :: enum byte { - One = 0, + One = 0, One_And_A_Half = 1, - Two = 2, + Two = 2, } DCB :: struct { @@ -5166,34 +5175,34 @@ DCB :: struct { } COMMTIMEOUTS :: struct { - ReadIntervalTimeout: DWORD, - ReadTotalTimeoutMultiplier: DWORD, - ReadTotalTimeoutConstant: DWORD, + ReadIntervalTimeout: DWORD, + ReadTotalTimeoutMultiplier: DWORD, + ReadTotalTimeoutConstant: DWORD, WriteTotalTimeoutMultiplier: DWORD, - WriteTotalTimeoutConstant: DWORD, + WriteTotalTimeoutConstant: DWORD, } -Com_Stat_Bits :: enum { - fCtsHold, - fDsrHold, - fRlsdHold, - fXoffHold, - fXoffSent, - fEof, - fTxim, -} COMSTAT :: struct { - bits: bit_set[Com_Stat_Bits; DWORD], - cbInQue: DWORD, + using _: bit_field DWORD { + fCtsHold: BOOL | 1, + fDsrHold: BOOL | 1, + fRlsdHol: BOOL | 1, + fXoffHol: BOOL | 1, + fXoffSen: BOOL | 1, + fEof: BOOL | 1, + fTxim: BOOL | 1, + fReserved: DWORD | 25, + }, + cbInQue: DWORD, cbOutQue: DWORD, } -Com_Error_Bits :: enum { +Com_Error_Bits :: enum DWORD { RXOVER, OVERRUN, RXPARITY, FRAME, BREAK, } -Com_Error :: bit_set[Com_Error_Bits; DWORD] +Com_Error :: distinct bit_set[Com_Error_Bits; DWORD] From 274e7e7e5848ec63d6c817151591b02281e2aa66 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 11:25:53 +0000 Subject: [PATCH 139/766] Improve the formatting of user32.odin --- core/sys/windows/user32.odin | 637 ++++++++++++++++++----------------- 1 file changed, 322 insertions(+), 315 deletions(-) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 287ed59e7..cd3efdeb7 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -6,7 +6,7 @@ foreign import user32 "system:User32.lib" @(default_calling_convention="system") foreign user32 { - GetClassInfoW :: proc(hInstance: HINSTANCE, lpClassName: LPCWSTR, lpWndClass: ^WNDCLASSW) -> BOOL --- + GetClassInfoW :: proc(hInstance: HINSTANCE, lpClassName: LPCWSTR, lpWndClass: ^WNDCLASSW) -> BOOL --- GetClassInfoExW :: proc(hInstance: HINSTANCE, lpszClass: LPCWSTR, lpwcx: ^WNDCLASSEXW) -> BOOL --- GetClassLongW :: proc(hWnd: HWND, nIndex: INT) -> DWORD --- @@ -19,67 +19,67 @@ foreign user32 { GetParent :: proc(hWnd: HWND) -> HWND --- SetWinEventHook :: proc( - eventMin, eventMax: DWORD, - hmodWinEventProc: HMODULE, - pfnWinEvenProc: WINEVENTPROC, + eventMin, eventMax: DWORD, + hmodWinEventProc: HMODULE, + pfnWinEvenProc: WINEVENTPROC, idProcess, idThread: DWORD, - dwFlags: WinEventFlags, + dwFlags: WinEventFlags, ) -> HWINEVENTHOOK --- IsChild :: proc(hWndParent, hWnd: HWND) -> BOOL --- - RegisterClassW :: proc(lpWndClass: ^WNDCLASSW) -> ATOM --- + RegisterClassW :: proc(lpWndClass: ^WNDCLASSW) -> ATOM --- RegisterClassExW :: proc(^WNDCLASSEXW) -> ATOM --- UnregisterClassW :: proc(lpClassName: LPCWSTR, hInstance: HINSTANCE) -> BOOL --- RegisterHotKey :: proc(hnwd: HWND, id: c_int, fsModifiers: UINT, vk: UINT) -> BOOL --- CreateWindowExW :: proc( - dwExStyle: DWORD, - lpClassName: LPCWSTR, - lpWindowName: LPCWSTR, - dwStyle: DWORD, + dwExStyle: DWORD, + lpClassName: LPCWSTR, + lpWindowName: LPCWSTR, + dwStyle: DWORD, X, Y, nWidth, nHeight: INT, - hWndParent: HWND, - hMenu: HMENU, - hInstance: HINSTANCE, - lpParam: LPVOID, + hWndParent: HWND, + hMenu: HMENU, + hInstance: HINSTANCE, + lpParam: LPVOID, ) -> HWND --- GetWindowThreadProcessId :: proc(hwnd: HWND, lpdwProcessId: LPDWORD) -> DWORD --- DestroyWindow :: proc(hWnd: HWND) -> BOOL --- - ShowWindow :: proc(hWnd: HWND, nCmdShow: INT) -> BOOL --- - IsWindow :: proc(hWnd: HWND) -> BOOL --- - IsWindowVisible :: proc(hwnd: HWND) -> BOOL --- - IsWindowEnabled :: proc(hwnd: HWND) -> BOOL --- - IsIconic :: proc(hwnd: HWND) -> BOOL --- - IsZoomed :: proc(hwnd: HWND) -> BOOL --- - BringWindowToTop :: proc(hWnd: HWND) -> BOOL --- - GetTopWindow :: proc(hWnd: HWND) -> HWND --- + ShowWindow :: proc(hWnd: HWND, nCmdShow: INT) -> BOOL --- + IsWindow :: proc(hWnd: HWND) -> BOOL --- + IsWindowVisible :: proc(hwnd: HWND) -> BOOL --- + IsWindowEnabled :: proc(hwnd: HWND) -> BOOL --- + IsIconic :: proc(hwnd: HWND) -> BOOL --- + IsZoomed :: proc(hwnd: HWND) -> BOOL --- + BringWindowToTop :: proc(hWnd: HWND) -> BOOL --- + GetTopWindow :: proc(hWnd: HWND) -> HWND --- SetForegroundWindow :: proc(hWnd: HWND) -> BOOL --- GetForegroundWindow :: proc() -> HWND --- - GetDesktopWindow :: proc() -> HWND --- - UpdateWindow :: proc(hWnd: HWND) -> BOOL --- - SetActiveWindow :: proc(hWnd: HWND) -> HWND --- - GetActiveWindow :: proc() -> HWND --- - SetFocus :: proc(hWnd: HWND) -> HWND --- - GetFocus :: proc() -> HWND --- - RedrawWindow :: proc(hwnd: HWND, lprcUpdate: LPRECT, hrgnUpdate: HRGN, flags: RedrawWindowFlags) -> BOOL --- - SetParent :: proc(hWndChild: HWND, hWndNewParent: HWND) -> HWND --- - SetPropW :: proc(hWnd: HWND, lpString: LPCWSTR, hData: HANDLE) -> BOOL --- - GetPropW :: proc(hWnd: HWND, lpString: LPCWSTR) -> HANDLE --- - RemovePropW :: proc(hWnd: HWND, lpString: LPCWSTR) -> HANDLE --- - EnumPropsW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW) -> INT --- - EnumPropsExW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW, lParam: LPARAM) -> INT --- - GetMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT) -> INT --- + GetDesktopWindow :: proc() -> HWND --- + UpdateWindow :: proc(hWnd: HWND) -> BOOL --- + SetActiveWindow :: proc(hWnd: HWND) -> HWND --- + GetActiveWindow :: proc() -> HWND --- + SetFocus :: proc(hWnd: HWND) -> HWND --- + GetFocus :: proc() -> HWND --- + RedrawWindow :: proc(hwnd: HWND, lprcUpdate: LPRECT, hrgnUpdate: HRGN, flags: RedrawWindowFlags) -> BOOL --- + SetParent :: proc(hWndChild: HWND, hWndNewParent: HWND) -> HWND --- + SetPropW :: proc(hWnd: HWND, lpString: LPCWSTR, hData: HANDLE) -> BOOL --- + GetPropW :: proc(hWnd: HWND, lpString: LPCWSTR) -> HANDLE --- + RemovePropW :: proc(hWnd: HWND, lpString: LPCWSTR) -> HANDLE --- + EnumPropsW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW) -> INT --- + EnumPropsExW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW, lParam: LPARAM) -> INT --- + GetMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT) -> INT --- TranslateMessage :: proc(lpMsg: ^MSG) -> BOOL --- DispatchMessageW :: proc(lpMsg: ^MSG) -> LRESULT --- - WaitMessage :: proc() -> BOOL --- - MsgWaitForMultipleObjects :: proc(nCount: DWORD, pHandles: ^HANDLE, fWaitAll: BOOL, dwMilliseconds: DWORD, dwWakeMask: DWORD) -> DWORD --- + WaitMessage :: proc() -> BOOL --- + MsgWaitForMultipleObjects :: proc(nCount: DWORD, pHandles: [^]HANDLE, fWaitAll: BOOL, dwMilliseconds: DWORD, dwWakeMask: DWORD) -> DWORD --- PeekMessageA :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT, wRemoveMsg: UINT) -> BOOL --- PeekMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT, wRemoveMsg: UINT) -> BOOL --- @@ -99,97 +99,97 @@ foreign user32 { DefWindowProcA :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- DefWindowProcW :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- - FindWindowA :: proc(lpClassName: LPCSTR, lpWindowName: LPCSTR) -> HWND --- - FindWindowW :: proc(lpClassName: LPCWSTR, lpWindowName: LPCWSTR) -> HWND --- + FindWindowA :: proc(lpClassName: LPCSTR, lpWindowName: LPCSTR) -> HWND --- + FindWindowW :: proc(lpClassName: LPCWSTR, lpWindowName: LPCWSTR) -> HWND --- FindWindowExA :: proc(hWndParent: HWND, hWndChildAfter: HWND, lpszClass: LPCSTR, lpszWindow: LPCSTR) -> HWND --- FindWindowExW :: proc(hWndParent: HWND, hWndChildAfter: HWND, lpszClass: LPCWSTR, lpszWindow: LPCWSTR) -> HWND --- - LoadIconA :: proc(hInstance: HINSTANCE, lpIconName: LPCSTR) -> HICON --- - LoadIconW :: proc(hInstance: HINSTANCE, lpIconName: LPCWSTR) -> HICON --- + LoadIconA :: proc(hInstance: HINSTANCE, lpIconName: LPCSTR) -> HICON --- + LoadIconW :: proc(hInstance: HINSTANCE, lpIconName: LPCWSTR) -> HICON --- GetIconInfoExW :: proc(hIcon: HICON, piconinfo: PICONINFOEXW) -> BOOL --- - LoadCursorA :: proc(hInstance: HINSTANCE, lpCursorName: LPCSTR) -> HCURSOR --- - LoadCursorW :: proc(hInstance: HINSTANCE, lpCursorName: LPCWSTR) -> HCURSOR --- - LoadImageW :: proc(hInst: HINSTANCE, name: LPCWSTR, type: UINT, cx, cy: INT, fuLoad: UINT) -> HANDLE --- + LoadCursorA :: proc(hInstance: HINSTANCE, lpCursorName: LPCSTR) -> HCURSOR --- + LoadCursorW :: proc(hInstance: HINSTANCE, lpCursorName: LPCWSTR) -> HCURSOR --- + LoadImageW :: proc(hInst: HINSTANCE, name: LPCWSTR, type: UINT, cx, cy: INT, fuLoad: UINT) -> HANDLE --- - CreateIcon :: proc(hInstance: HINSTANCE, nWidth, nHeight: INT, cPlanes: BYTE, cBitsPixel: BYTE, lpbANDbits: PBYTE, lpbXORbits: PBYTE) -> HICON --- + CreateIcon :: proc(hInstance: HINSTANCE, nWidth, nHeight: INT, cPlanes: BYTE, cBitsPixel: BYTE, lpbANDbits: PBYTE, lpbXORbits: PBYTE) -> HICON --- CreateIconFromResource :: proc(presbits: PBYTE, dwResSize: DWORD, fIcon: BOOL, dwVer: DWORD) -> HICON --- - DestroyIcon :: proc(hIcon: HICON) -> BOOL --- - DrawIcon :: proc(hDC: HDC, X, Y: INT, hIcon: HICON) -> BOOL --- + DestroyIcon :: proc(hIcon: HICON) -> BOOL --- + DrawIcon :: proc(hDC: HDC, X, Y: INT, hIcon: HICON) -> BOOL --- - CreateCursor :: proc(hInst: HINSTANCE, xHotSpot, yHotSpot, nWidth, nHeight: INT, pvANDPlane: PVOID, pvXORPlane: PVOID) -> HCURSOR --- + CreateCursor :: proc(hInst: HINSTANCE, xHotSpot, yHotSpot, nWidth, nHeight: INT, pvANDPlane: PVOID, pvXORPlane: PVOID) -> HCURSOR --- DestroyCursor :: proc(hCursor: HCURSOR) -> BOOL --- - GetWindowRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL --- - GetClientRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL --- - ClientToScreen :: proc(hWnd: HWND, lpPoint: LPPOINT) -> BOOL --- - ScreenToClient :: proc(hWnd: HWND, lpPoint: LPPOINT) -> BOOL --- - SetWindowPos :: proc(hWnd: HWND, hWndInsertAfter: HWND, X, Y, cx, cy: INT, uFlags: UINT) -> BOOL --- - MoveWindow :: proc(hWnd: HWND, X, Y, hWidth, hHeight: INT, bRepaint: BOOL) -> BOOL --- - GetSystemMetrics :: proc(nIndex: INT) -> INT --- - AdjustWindowRect :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL) -> BOOL --- - AdjustWindowRectEx :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL, dwExStyle: DWORD) -> BOOL --- + GetWindowRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL --- + GetClientRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL --- + ClientToScreen :: proc(hWnd: HWND, lpPoint: LPPOINT) -> BOOL --- + ScreenToClient :: proc(hWnd: HWND, lpPoint: LPPOINT) -> BOOL --- + SetWindowPos :: proc(hWnd: HWND, hWndInsertAfter: HWND, X, Y, cx, cy: INT, uFlags: UINT) -> BOOL --- + MoveWindow :: proc(hWnd: HWND, X, Y, hWidth, hHeight: INT, bRepaint: BOOL) -> BOOL --- + GetSystemMetrics :: proc(nIndex: INT) -> INT --- + AdjustWindowRect :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL) -> BOOL --- + AdjustWindowRectEx :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL, dwExStyle: DWORD) -> BOOL --- AdjustWindowRectExForDpi :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL, dwExStyle: DWORD, dpi: UINT) -> BOOL --- SystemParametersInfoW :: proc(uiAction, uiParam: UINT, pvParam: PVOID, fWinIni: UINT) -> BOOL --- - GetMonitorInfoW :: proc(hMonitor: HMONITOR, lpmi: LPMONITORINFO) -> BOOL --- + GetMonitorInfoW :: proc(hMonitor: HMONITOR, lpmi: LPMONITORINFO) -> BOOL --- GetWindowDC :: proc(hWnd: HWND) -> HDC --- - GetDC :: proc(hWnd: HWND) -> HDC --- - GetDCEx :: proc(hWnd: HWND, hrgnClip: HRGN, flags: DWORD) -> HDC --- - ReleaseDC :: proc(hWnd: HWND, hDC: HDC) -> INT --- + GetDC :: proc(hWnd: HWND) -> HDC --- + GetDCEx :: proc(hWnd: HWND, hrgnClip: HRGN, flags: DWORD) -> HDC --- + ReleaseDC :: proc(hWnd: HWND, hDC: HDC) -> INT --- GetDlgCtrlID :: proc(hWnd: HWND) -> INT --- - GetDlgItem :: proc(hDlg: HWND, nIDDlgItem: INT) -> HWND --- + GetDlgItem :: proc(hDlg: HWND, nIDDlgItem: INT) -> HWND --- - CreateMenu :: proc() -> HMENU --- - CreatePopupMenu :: proc() -> HMENU --- - DeleteMenu :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT) -> BOOL --- - DestroyMenu :: proc(hMenu: HMENU) -> BOOL --- - InsertMenuW :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL --- - AppendMenuW :: proc(hMenu: HMENU, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL --- - GetMenu :: proc(hWnd: HWND) -> HMENU --- - SetMenu :: proc(hWnd: HWND, hMenu: HMENU) -> BOOL --- - TrackPopupMenu :: proc(hMenu: HMENU, uFlags: UINT, x, y: INT, nReserved: INT, hWnd: HWND, prcRect: ^RECT) -> INT --- + CreateMenu :: proc() -> HMENU --- + CreatePopupMenu :: proc() -> HMENU --- + DeleteMenu :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT) -> BOOL --- + DestroyMenu :: proc(hMenu: HMENU) -> BOOL --- + InsertMenuW :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL --- + AppendMenuW :: proc(hMenu: HMENU, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL --- + GetMenu :: proc(hWnd: HWND) -> HMENU --- + SetMenu :: proc(hWnd: HWND, hMenu: HMENU) -> BOOL --- + TrackPopupMenu :: proc(hMenu: HMENU, uFlags: UINT, x, y: INT, nReserved: INT, hWnd: HWND, prcRect: ^RECT) -> INT --- RegisterWindowMessageW :: proc(lpString: LPCWSTR) -> UINT --- CreateAcceleratorTableW :: proc(paccel: LPACCEL, cAccel: INT) -> HACCEL --- DestroyAcceleratorTable :: proc(hAccel: HACCEL) -> BOOL --- - LoadAcceleratorsW :: proc(hInstance: HINSTANCE, lpTableName: LPCWSTR) -> HACCEL --- - TranslateAcceleratorW :: proc(hWnd: HWND, hAccTable: HACCEL, lpMsg: LPMSG) -> INT --- - CopyAcceleratorTableW :: proc(hAccelSrc: HACCEL, lpAccelDst: LPACCEL, cAccelEntries: INT) -> INT --- + LoadAcceleratorsW :: proc(hInstance: HINSTANCE, lpTableName: LPCWSTR) -> HACCEL --- + TranslateAcceleratorW :: proc(hWnd: HWND, hAccTable: HACCEL, lpMsg: LPMSG) -> INT --- + CopyAcceleratorTableW :: proc(hAccelSrc: HACCEL, lpAccelDst: LPACCEL, cAccelEntries: INT) -> INT --- - InsertMenuItemW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmi: LPMENUITEMINFOW) -> BOOL --- - GetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL --- - SetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPositon: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL --- + InsertMenuItemW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmi: LPMENUITEMINFOW) -> BOOL --- + GetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL --- + SetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPositon: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL --- GetMenuDefaultItem :: proc(hMenu: HMENU, fByPos: UINT, gmdiFlags: UINT) -> UINT --- SetMenuDefaultItem :: proc(hMenu: HMENU, uItem: UINT, fByPos: UINT) -> BOOL --- - GetMenuItemRect :: proc(hWnd: HWND, hMenu: HMENU, uItem: UINT, lprcItem: LPRECT) -> c_int --- + GetMenuItemRect :: proc(hWnd: HWND, hMenu: HMENU, uItem: UINT, lprcItem: LPRECT) -> c_int --- - GetUpdateRect :: proc(hWnd: HWND, lpRect: LPRECT, bErase: BOOL) -> BOOL --- - ValidateRect :: proc(hWnd: HWND, lpRect: ^RECT) -> BOOL --- + GetUpdateRect :: proc(hWnd: HWND, lpRect: LPRECT, bErase: BOOL) -> BOOL --- + ValidateRect :: proc(hWnd: HWND, lpRect: ^RECT) -> BOOL --- InvalidateRect :: proc(hWnd: HWND, lpRect: ^RECT, bErase: BOOL) -> BOOL --- BeginPaint :: proc(hWnd: HWND, lpPaint: ^PAINTSTRUCT) -> HDC --- - EndPaint :: proc(hWnd: HWND, lpPaint: ^PAINTSTRUCT) -> BOOL --- + EndPaint :: proc(hWnd: HWND, lpPaint: ^PAINTSTRUCT) -> BOOL --- - GetCapture :: proc() -> HWND --- - SetCapture :: proc(hWnd: HWND) -> HWND --- - ReleaseCapture :: proc() -> BOOL --- + GetCapture :: proc() -> HWND --- + SetCapture :: proc(hWnd: HWND) -> HWND --- + ReleaseCapture :: proc() -> BOOL --- TrackMouseEvent :: proc(lpEventTrack: LPTRACKMOUSEEVENT) -> BOOL --- - GetKeyState :: proc(nVirtKey: INT) -> SHORT --- + GetKeyState :: proc(nVirtKey: INT) -> SHORT --- GetAsyncKeyState :: proc(vKey: INT) -> SHORT --- GetKeyboardState :: proc(lpKeyState: PBYTE) -> BOOL --- MapVirtualKeyW :: proc(uCode: UINT, uMapType: UINT) -> UINT --- - ToUnicode :: proc(nVirtKey: UINT, wScanCode: UINT, lpKeyState: ^BYTE, pwszBuff: LPWSTR, cchBuff: INT, wFlags: UINT) -> INT --- + ToUnicode :: proc(nVirtKey: UINT, wScanCode: UINT, lpKeyState: ^BYTE, pwszBuff: LPWSTR, cchBuff: INT, wFlags: UINT) -> INT --- - SetWindowsHookExW :: proc(idHook: INT, lpfn: HOOKPROC, hmod: HINSTANCE, dwThreadId: DWORD) -> HHOOK --- + SetWindowsHookExW :: proc(idHook: INT, lpfn: HOOKPROC, hmod: HINSTANCE, dwThreadId: DWORD) -> HHOOK --- UnhookWindowsHookEx :: proc(hhk: HHOOK) -> BOOL --- - CallNextHookEx :: proc(hhk: HHOOK, nCode: INT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- + CallNextHookEx :: proc(hhk: HHOOK, nCode: INT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- - SetTimer :: proc(hWnd: HWND, nIDEvent: UINT_PTR, uElapse: UINT, lpTimerFunc: TIMERPROC) -> UINT_PTR --- + SetTimer :: proc(hWnd: HWND, nIDEvent: UINT_PTR, uElapse: UINT, lpTimerFunc: TIMERPROC) -> UINT_PTR --- KillTimer :: proc(hWnd: HWND, uIDEvent: UINT_PTR) -> BOOL --- // MessageBoxA :: proc(hWnd: HWND, lpText: LPCSTR, lpCaption: LPCSTR, uType: UINT) -> INT --- @@ -197,149 +197,149 @@ foreign user32 { // MessageBoxExA :: proc(hWnd: HWND, lpText: LPCSTR, lpCaption: LPCSTR, uType: UINT, wLanguageId: WORD) -> INT --- MessageBoxExW :: proc(hWnd: HWND, lpText: LPCWSTR, lpCaption: LPCWSTR, uType: UINT, wLanguageId: WORD) -> INT --- - ClipCursor :: proc(lpRect: LPRECT) -> BOOL --- + ClipCursor :: proc(lpRect: LPRECT) -> BOOL --- GetCursorPos :: proc(lpPoint: LPPOINT) -> BOOL --- SetCursorPos :: proc(X, Y: INT) -> BOOL --- - SetCursor :: proc(hCursor: HCURSOR) -> HCURSOR --- + SetCursor :: proc(hCursor: HCURSOR) -> HCURSOR --- when !intrinsics.is_package_imported("raylib") { ShowCursor :: proc(bShow: BOOL) -> INT --- } - EnumDisplayDevicesW :: proc (lpDevice: LPCWSTR, iDevNum: DWORD, lpDisplayDevice: PDISPLAY_DEVICEW, dwFlags: DWORD) -> BOOL --- + EnumDisplayDevicesW :: proc(lpDevice: LPCWSTR, iDevNum: DWORD, lpDisplayDevice: PDISPLAY_DEVICEW, dwFlags: DWORD) -> BOOL --- EnumDisplaySettingsW :: proc(lpszDeviceName: LPCWSTR, iModeNum: DWORD, lpDevMode: ^DEVMODEW) -> BOOL --- - MonitorFromPoint :: proc(pt: POINT, dwFlags: Monitor_From_Flags) -> HMONITOR --- - MonitorFromRect :: proc(lprc: LPRECT, dwFlags: Monitor_From_Flags) -> HMONITOR --- - MonitorFromWindow :: proc(hwnd: HWND, dwFlags: Monitor_From_Flags) -> HMONITOR --- + MonitorFromPoint :: proc(pt: POINT, dwFlags: Monitor_From_Flags) -> HMONITOR --- + MonitorFromRect :: proc(lprc: LPRECT, dwFlags: Monitor_From_Flags) -> HMONITOR --- + MonitorFromWindow :: proc(hwnd: HWND, dwFlags: Monitor_From_Flags) -> HMONITOR --- EnumDisplayMonitors :: proc(hdc: HDC, lprcClip: LPRECT, lpfnEnum: Monitor_Enum_Proc, dwData: LPARAM) -> BOOL --- - EnumWindows :: proc(lpEnumFunc: Window_Enum_Proc, lParam: LPARAM) -> BOOL --- + EnumWindows :: proc(lpEnumFunc: Window_Enum_Proc, lParam: LPARAM) -> BOOL --- EnumChildWindows :: proc(hWndParent: HWND, lpEnumFunc: Window_Enum_Proc, lParam: LPARAM) -> BOOL --- - IsProcessDPIAware :: proc() -> BOOL --- + IsProcessDPIAware :: proc() -> BOOL --- SetProcessDPIAware :: proc() -> BOOL --- - SetThreadDpiAwarenessContext :: proc(dpiContext: DPI_AWARENESS_CONTEXT) -> DPI_AWARENESS_CONTEXT --- - GetThreadDpiAwarenessContext :: proc() -> DPI_AWARENESS_CONTEXT --- - GetWindowDpiAwarenessContext :: proc(hwnd: HWND) -> DPI_AWARENESS_CONTEXT --- + SetThreadDpiAwarenessContext :: proc(dpiContext: DPI_AWARENESS_CONTEXT) -> DPI_AWARENESS_CONTEXT --- + GetThreadDpiAwarenessContext :: proc() -> DPI_AWARENESS_CONTEXT --- + GetWindowDpiAwarenessContext :: proc(hwnd: HWND) -> DPI_AWARENESS_CONTEXT --- GetDpiFromDpiAwarenessContext :: proc(value: DPI_AWARENESS_CONTEXT) -> UINT --- - GetDpiForWindow :: proc(hwnd: HWND) -> UINT --- + GetDpiForWindow :: proc(hwnd: HWND) -> UINT --- SetProcessDpiAwarenessContext :: proc(value: DPI_AWARENESS_CONTEXT) -> BOOL --- BroadcastSystemMessageW :: proc( - flags: DWORD, + flags: DWORD, lpInfo: LPDWORD, - Msg: UINT, + Msg: UINT, wParam: WPARAM, lParam: LPARAM, ) -> c_long --- BroadcastSystemMessageExW :: proc( - flags: DWORD, - lpInfo: LPDWORD, - Msg: UINT, - wParam: WPARAM, - lParam: LPARAM, + flags: DWORD, + lpInfo: LPDWORD, + Msg: UINT, + wParam: WPARAM, + lParam: LPARAM, pbsmInfo: PBSMINFO, ) -> c_long --- SendMessageTimeoutW :: proc( - hWnd: HWND, - Msg: UINT, - wParam: WPARAM, - lParam: LPARAM, - fuFlags: UINT, - uTimeout: UINT, + hWnd: HWND, + Msg: UINT, + wParam: WPARAM, + lParam: LPARAM, + fuFlags: UINT, + uTimeout: UINT, lpdwResult: PDWORD_PTR, ) -> LRESULT --- - GetSysColor :: proc(nIndex: INT) -> DWORD --- + GetSysColor :: proc(nIndex: INT) -> DWORD --- GetSysColorBrush :: proc(nIndex: INT) -> HBRUSH --- - SetSysColors :: proc(cElements: INT, lpaElements: ^INT, lpaRgbValues: ^COLORREF) -> BOOL --- - MessageBeep :: proc(uType: UINT) -> BOOL --- + SetSysColors :: proc(cElements: INT, lpaElements: [^]INT, lpaRgbValues: ^COLORREF) -> BOOL --- + MessageBeep :: proc(uType: UINT) -> BOOL --- - IsDialogMessageW :: proc(hDlg: HWND, lpMsg: LPMSG) -> BOOL --- + IsDialogMessageW :: proc(hDlg: HWND, lpMsg: LPMSG) -> BOOL --- GetWindowTextLengthW :: proc(hWnd: HWND) -> INT --- - GetWindowTextW :: proc(hWnd: HWND, lpString: LPWSTR, nMaxCount: INT) -> INT --- - SetWindowTextW :: proc(hWnd: HWND, lpString: LPCWSTR) -> BOOL --- - CallWindowProcW :: proc(lpPrevWndFunc: WNDPROC, hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- - EnableWindow :: proc(hWnd: HWND, bEnable: BOOL) -> BOOL --- + GetWindowTextW :: proc(hWnd: HWND, lpString: LPWSTR, nMaxCount: INT) -> INT --- + SetWindowTextW :: proc(hWnd: HWND, lpString: LPCWSTR) -> BOOL --- + CallWindowProcW :: proc(lpPrevWndFunc: WNDPROC, hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- + EnableWindow :: proc(hWnd: HWND, bEnable: BOOL) -> BOOL --- - DefRawInputProc :: proc(paRawInput: ^PRAWINPUT, nInput: INT, cbSizeHeader: UINT) -> LRESULT --- - GetRawInputBuffer :: proc(pRawInput: PRAWINPUT, pcbSize: PUINT, cbSizeHeader: UINT) -> UINT --- - GetRawInputData :: proc(hRawInput: HRAWINPUT, uiCommand: UINT, pData: LPVOID, pcbSize: PUINT, cbSizeHeader: UINT) -> UINT --- - GetRawInputDeviceInfoW :: proc(hDevice: HANDLE, uiCommand: UINT, pData: LPVOID, pcbSize: PUINT) -> UINT --- - GetRawInputDeviceList :: proc(pRawInputDeviceList: PRAWINPUTDEVICELIST, puiNumDevices: PUINT, cbSize: UINT) -> UINT --- + DefRawInputProc :: proc(paRawInput: ^PRAWINPUT, nInput: INT, cbSizeHeader: UINT) -> LRESULT --- + GetRawInputBuffer :: proc(pRawInput: PRAWINPUT, pcbSize: PUINT, cbSizeHeader: UINT) -> UINT --- + GetRawInputData :: proc(hRawInput: HRAWINPUT, uiCommand: UINT, pData: LPVOID, pcbSize: PUINT, cbSizeHeader: UINT) -> UINT --- + GetRawInputDeviceInfoW :: proc(hDevice: HANDLE, uiCommand: UINT, pData: LPVOID, pcbSize: PUINT) -> UINT --- + GetRawInputDeviceList :: proc(pRawInputDeviceList: PRAWINPUTDEVICELIST, puiNumDevices: PUINT, cbSize: UINT) -> UINT --- GetRegisteredRawInputDevices :: proc(pRawInputDevices: PRAWINPUTDEVICE, puiNumDevices: PUINT, cbSize: UINT) -> UINT --- - RegisterRawInputDevices :: proc(pRawInputDevices: PCRAWINPUTDEVICE, uiNumDevices: UINT, cbSize: UINT) -> BOOL --- + RegisterRawInputDevices :: proc(pRawInputDevices: PCRAWINPUTDEVICE, uiNumDevices: UINT, cbSize: UINT) -> BOOL --- SendInput :: proc(cInputs: UINT, pInputs: [^]INPUT, cbSize: INT) -> UINT --- SetLayeredWindowAttributes :: proc(hWnd: HWND, crKey: COLORREF, bAlpha: BYTE, dwFlags: DWORD) -> BOOL --- - FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- - FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- - EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- - OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- - InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- + FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- + FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- + EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- + OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- + InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- IntersectRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL --- - SubtractRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL --- - UnionRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL --- - IsRectEmpty :: proc(lprc: ^RECT) -> BOOL --- - SetRectEmpty :: proc(lprc: ^RECT) -> BOOL --- - CopyRect :: proc(lprcDst, lprcSrc: ^RECT) -> BOOL --- + SubtractRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL --- + UnionRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL --- + IsRectEmpty :: proc(lprc: ^RECT) -> BOOL --- + SetRectEmpty :: proc(lprc: ^RECT) -> BOOL --- + CopyRect :: proc(lprcDst, lprcSrc: ^RECT) -> BOOL --- - GetWindowInfo :: proc(hwnd: HWND, pwi: PWINDOWINFO) -> BOOL --- - GetWindowPlacement :: proc(hWnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- - SetWindowPlacement :: proc(hwnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- - SetWindowRgn :: proc(hWnd: HWND, hRgn: HRGN, bRedraw: BOOL) -> c_int --- - CreateRectRgnIndirect :: proc(lprect: ^RECT) -> HRGN --- + GetWindowInfo :: proc(hwnd: HWND, pwi: PWINDOWINFO) -> BOOL --- + GetWindowPlacement :: proc(hWnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- + SetWindowPlacement :: proc(hwnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- + SetWindowRgn :: proc(hWnd: HWND, hRgn: HRGN, bRedraw: BOOL) -> c_int --- + CreateRectRgnIndirect :: proc(lprect: ^RECT) -> HRGN --- GetSystemMetricsForDpi :: proc(nIndex: c_int, dpi: UINT) -> c_int --- GetCursorInfo :: proc(pci: PCURSORINFO) -> BOOL --- - GetSystemMenu :: proc(hWnd: HWND, bRevert: BOOL) -> HMENU --- - EnableMenuItem :: proc(hMenu: HMENU, uIDEnableItem: UINT, uEnable: UINT) -> BOOL --- + GetSystemMenu :: proc(hWnd: HWND, bRevert: BOOL) -> HMENU --- + EnableMenuItem :: proc(hMenu: HMENU, uIDEnableItem: UINT, uEnable: UINT) -> BOOL --- MenuItemFromPoint :: proc(hWnd: HWND, hMenu: HMENU, ptScreen: POINT) -> INT --- - DrawTextW :: proc(hdc: HDC, lpchText: LPCWSTR, cchText: INT, lprc: LPRECT, format: DrawTextFormat) -> INT --- + DrawTextW :: proc(hdc: HDC, lpchText: LPCWSTR, cchText: INT, lprc: LPRECT, format: DrawTextFormat) -> INT --- DrawTextExW :: proc(hdc: HDC, lpchText: LPCWSTR, cchText: INT, lprc: LPRECT, format: DrawTextFormat, lpdtp: PDRAWTEXTPARAMS) -> INT --- - GetLocaleInfoEx :: proc(lpLocaleName: LPCWSTR, LCType: LCTYPE, lpLCData: LPWSTR, cchData: INT) -> INT --- + GetLocaleInfoEx :: proc(lpLocaleName: LPCWSTR, LCType: LCTYPE, lpLCData: LPWSTR, cchData: INT) -> INT --- IsValidLocaleName :: proc(lpLocaleName: LPCWSTR) -> BOOL --- ResolveLocaleName :: proc(lpNameToResolve: LPCWSTR, lpLocaleName: LPWSTR, cchLocaleName: INT) -> INT --- - IsValidCodePage :: proc(CodePage: UINT) -> BOOL --- - GetACP :: proc() -> CODEPAGE --- - GetCPInfoExW :: proc(CodePage: CODEPAGE, dwFlags: DWORD, lpCPInfoEx: LPCPINFOEXW) -> BOOL --- + IsValidCodePage :: proc(CodePage: UINT) -> BOOL --- + GetACP :: proc() -> CODEPAGE --- + GetCPInfoExW :: proc(CodePage: CODEPAGE, dwFlags: DWORD, lpCPInfoEx: LPCPINFOEXW) -> BOOL --- - GetProcessWindowStation :: proc() -> HWINSTA --- + GetProcessWindowStation :: proc() -> HWINSTA --- GetUserObjectInformationW :: proc(hObj: HANDLE, nIndex: GetUserObjectInformationFlags, pvInfo: PVOID, nLength: DWORD, lpnLengthNeeded: LPDWORD) -> BOOL --- - OpenClipboard :: proc(hWndNewOwner: HWND) -> BOOL --- - CloseClipboard :: proc() -> BOOL --- - GetClipboardData :: proc(uFormat: UINT) -> HANDLE --- - SetClipboardData :: proc(uFormat: UINT, hMem: HANDLE) -> HANDLE --- + OpenClipboard :: proc(hWndNewOwner: HWND) -> BOOL --- + CloseClipboard :: proc() -> BOOL --- + GetClipboardData :: proc(uFormat: UINT) -> HANDLE --- + SetClipboardData :: proc(uFormat: UINT, hMem: HANDLE) -> HANDLE --- IsClipboardFormatAvailable :: proc(format: UINT) -> BOOL --- - EmptyClipboard :: proc() -> BOOL --- + EmptyClipboard :: proc() -> BOOL --- - SetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO, redraw: BOOL) -> c_int --- - GetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO) -> BOOL --- - ShowScrollBar :: proc(hwnd: HWND, nBar: c_int, bShow: BOOL) -> BOOL --- + SetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO, redraw: BOOL) -> c_int --- + GetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO) -> BOOL --- + ShowScrollBar :: proc(hwnd: HWND, nBar: c_int, bShow: BOOL) -> BOOL --- EnableScrollBar :: proc(hwnd: HWND, wSBflags: UINT, wArrows: UINT) -> BOOL --- } CreateWindowW :: #force_inline proc "system" ( - lpClassName: LPCTSTR, + lpClassName: LPCTSTR, lpWindowName: LPCTSTR, - dwStyle: DWORD, - X: INT, - Y: INT, - nWidth: INT, - nHeight: INT, - hWndParent: HWND, - hMenu: HMENU, - hInstance: HINSTANCE, - lpParam: LPVOID, + dwStyle: DWORD, + X: INT, + Y: INT, + nWidth: INT, + nHeight: INT, + hWndParent: HWND, + hMenu: HMENU, + hInstance: HINSTANCE, + lpParam: LPVOID, ) -> HWND { return CreateWindowExW( 0, @@ -374,31 +374,38 @@ when ODIN_ARCH == .amd64 { SetWindowLongPtrW :: SetWindowLongW } +@(require_results) GET_SC_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> INT { return INT(wParam) & 0xFFF0 } +@(require_results) GET_WHEEL_DELTA_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> c_short { return cast(c_short)HIWORD(cast(DWORD)wParam) } +@(require_results) GET_KEYSTATE_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> WORD { return LOWORD(cast(DWORD)wParam) } +@(require_results) GET_NCHITTEST_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> c_short { return cast(c_short)LOWORD(cast(DWORD)wParam) } +@(require_results) GET_XBUTTON_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> WORD { return HIWORD(cast(DWORD)wParam) } // Retrieves the input code from wParam in WM_INPUT message. +@(require_results) GET_RAWINPUT_CODE_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> RAWINPUT_CODE { return RAWINPUT_CODE(wParam & 0xFF) } +@(require_results) MAKEINTRESOURCEW :: #force_inline proc "contextless" (#any_int i: int) -> LPWSTR { return cast(LPWSTR)uintptr(WORD(i)) } @@ -410,7 +417,7 @@ Monitor_From_Flags :: enum DWORD { } Monitor_Enum_Proc :: #type proc "system" (HMONITOR, HDC, LPRECT, LPARAM) -> BOOL -Window_Enum_Proc :: #type proc "system" (HWND, LPARAM) -> BOOL +Window_Enum_Proc :: #type proc "system" (HWND, LPARAM) -> BOOL USER_DEFAULT_SCREEN_DPI :: 96 DPI_AWARENESS_CONTEXT :: distinct HANDLE @@ -420,7 +427,7 @@ DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE :: DPI_AWARENESS_CONTEXT(~uintptr(2)) DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 :: DPI_AWARENESS_CONTEXT(~uintptr(3)) // -4 DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED :: DPI_AWARENESS_CONTEXT(~uintptr(4)) // -5 -RAWINPUT_CODE :: enum { +RAWINPUT_CODE :: enum DWORD { // The input is in the regular message flow, // the app is required to call DefWindowProc // so that the system can perform clean ups. @@ -431,16 +438,16 @@ RAWINPUT_CODE :: enum { } RAWINPUTHEADER :: struct { - dwType: DWORD, - dwSize: DWORD, + dwType: DWORD, + dwSize: DWORD, hDevice: HANDLE, - wParam: WPARAM, + wParam: WPARAM, } RAWHID :: struct { dwSizeHid: DWORD, - dwCount: DWORD, - bRawData: [1]BYTE, + dwCount: DWORD, + bRawData: [1]BYTE, } RAWMOUSE :: struct { @@ -452,27 +459,27 @@ RAWMOUSE :: struct { usButtonData: USHORT, }, }, - ulRawButtons: ULONG, - lLastX: LONG, - lLastY: LONG, + ulRawButtons: ULONG, + lLastX: LONG, + lLastY: LONG, ulExtraInformation: ULONG, } RAWKEYBOARD :: struct { - MakeCode: USHORT, - Flags: USHORT, - Rserved: USHORT, - VKey: USHORT, - Message: UINT, + MakeCode: USHORT, + Flags: USHORT, + Rserved: USHORT, + VKey: USHORT, + Message: UINT, ExtraInformation: ULONG, } RAWINPUT :: struct { header: RAWINPUTHEADER, data: struct #raw_union { - mouse: RAWMOUSE, + mouse: RAWMOUSE, keyboard: RAWKEYBOARD, - hid: RAWHID, + hid: RAWHID, }, } @@ -481,42 +488,42 @@ HRAWINPUT :: distinct LPARAM RAWINPUTDEVICE :: struct { usUsagePage: USHORT, - usUsage: USHORT, - dwFlags: DWORD, - hwndTarget: HWND, + usUsage: USHORT, + dwFlags: DWORD, + hwndTarget: HWND, } -PRAWINPUTDEVICE :: ^RAWINPUTDEVICE +PRAWINPUTDEVICE :: ^RAWINPUTDEVICE PCRAWINPUTDEVICE :: PRAWINPUTDEVICE RAWINPUTDEVICELIST :: struct { hDevice: HANDLE, - dwType: DWORD, + dwType: DWORD, } PRAWINPUTDEVICELIST :: ^RAWINPUTDEVICELIST RID_DEVICE_INFO_HID :: struct { - dwVendorId: DWORD, - dwProductId: DWORD, + dwVendorId: DWORD, + dwProductId: DWORD, dwVersionNumber: DWORD, - usUsagePage: USHORT, - usUsage: USHORT, + usUsagePage: USHORT, + usUsage: USHORT, } RID_DEVICE_INFO_KEYBOARD :: struct { - dwType: DWORD, - dwSubType: DWORD, - dwKeyboardMode: DWORD, + dwType: DWORD, + dwSubType: DWORD, + dwKeyboardMode: DWORD, dwNumberOfFunctionKeys: DWORD, - dwNumberOfIndicators: DWORD, - dwNumberOfKeysTotal: DWORD, + dwNumberOfIndicators: DWORD, + dwNumberOfKeysTotal: DWORD, } RID_DEVICE_INFO_MOUSE :: struct { - dwId: DWORD, - dwNumberOfButtons: DWORD, - dwSampleRate: DWORD, + dwId: DWORD, + dwNumberOfButtons: DWORD, + dwSampleRate: DWORD, fHasHorizontalWheel: BOOL, } @@ -524,103 +531,103 @@ RID_DEVICE_INFO :: struct { cbSize: DWORD, dwType: DWORD, using DUMMYUNIONNAME: struct #raw_union { - mouse: RID_DEVICE_INFO_MOUSE, - keyboard: RID_DEVICE_INFO_KEYBOARD, - hid: RID_DEVICE_INFO_HID, + mouse: RID_DEVICE_INFO_MOUSE `raw_union_tag:"dwType=0"`, + keyboard: RID_DEVICE_INFO_KEYBOARD `raw_union_tag:"dwType=1"`, + hid: RID_DEVICE_INFO_HID `raw_union_tag:"dwType=2"`, }, } -RIDEV_REMOVE :: 0x00000001 -RIDEV_EXCLUDE :: 0x00000010 -RIDEV_PAGEONLY :: 0x00000020 -RIDEV_NOLEGACY :: 0x00000030 -RIDEV_INPUTSINK :: 0x00000100 +RIDEV_REMOVE :: 0x00000001 +RIDEV_EXCLUDE :: 0x00000010 +RIDEV_PAGEONLY :: 0x00000020 +RIDEV_NOLEGACY :: 0x00000030 +RIDEV_INPUTSINK :: 0x00000100 RIDEV_CAPTUREMOUSE :: 0x00000200 -RIDEV_NOHOTKEYS :: 0x00000200 -RIDEV_APPKEYS :: 0x00000400 -RIDEV_EXINPUTSINK :: 0x00001000 -RIDEV_DEVNOTIFY :: 0x00002000 +RIDEV_NOHOTKEYS :: 0x00000200 +RIDEV_APPKEYS :: 0x00000400 +RIDEV_EXINPUTSINK :: 0x00001000 +RIDEV_DEVNOTIFY :: 0x00002000 RID_HEADER :: 0x10000005 -RID_INPUT :: 0x10000003 +RID_INPUT :: 0x10000003 RIDI_PREPARSEDDATA :: 0x20000005 -RIDI_DEVICENAME :: 0x20000007 -RIDI_DEVICEINFO :: 0x2000000b +RIDI_DEVICENAME :: 0x20000007 +RIDI_DEVICEINFO :: 0x2000000b -RIM_TYPEMOUSE :: 0 +RIM_TYPEMOUSE :: 0 RIM_TYPEKEYBOARD :: 1 -RIM_TYPEHID :: 2 +RIM_TYPEHID :: 2 -RI_KEY_MAKE :: 0 -RI_KEY_BREAK :: 1 -RI_KEY_E0 :: 2 -RI_KEY_E1 :: 4 +RI_KEY_MAKE :: 0 +RI_KEY_BREAK :: 1 +RI_KEY_E0 :: 2 +RI_KEY_E1 :: 4 RI_KEY_TERMSRV_SET_LED :: 8 -RI_KEY_TERMSRV_SHADOW :: 0x10 +RI_KEY_TERMSRV_SHADOW :: 0x10 -MOUSE_MOVE_RELATIVE :: 0x00 -MOUSE_MOVE_ABSOLUTE :: 0x01 -MOUSE_VIRTUAL_DESKTOP :: 0x02 +MOUSE_MOVE_RELATIVE :: 0x00 +MOUSE_MOVE_ABSOLUTE :: 0x01 +MOUSE_VIRTUAL_DESKTOP :: 0x02 MOUSE_ATTRIBUTES_CHANGED :: 0x04 -MOUSE_MOVE_NOCOALESCE :: 0x08 +MOUSE_MOVE_NOCOALESCE :: 0x08 -RI_MOUSE_BUTTON_1_DOWN :: 0x0001 -RI_MOUSE_LEFT_BUTTON_DOWN :: RI_MOUSE_BUTTON_1_DOWN -RI_MOUSE_BUTTON_1_UP :: 0x0002 -RI_MOUSE_LEFT_BUTTON_UP :: RI_MOUSE_BUTTON_1_UP -RI_MOUSE_BUTTON_2_DOWN :: 0x0004 -RI_MOUSE_RIGHT_BUTTON_DOWN :: RI_MOUSE_BUTTON_2_DOWN -RI_MOUSE_BUTTON_2_UP :: 0x0008 -RI_MOUSE_RIGHT_BUTTON_UP :: RI_MOUSE_BUTTON_2_UP -RI_MOUSE_BUTTON_3_DOWN :: 0x0010 +RI_MOUSE_BUTTON_1_DOWN :: 0x0001 +RI_MOUSE_LEFT_BUTTON_DOWN :: RI_MOUSE_BUTTON_1_DOWN +RI_MOUSE_BUTTON_1_UP :: 0x0002 +RI_MOUSE_LEFT_BUTTON_UP :: RI_MOUSE_BUTTON_1_UP +RI_MOUSE_BUTTON_2_DOWN :: 0x0004 +RI_MOUSE_RIGHT_BUTTON_DOWN :: RI_MOUSE_BUTTON_2_DOWN +RI_MOUSE_BUTTON_2_UP :: 0x0008 +RI_MOUSE_RIGHT_BUTTON_UP :: RI_MOUSE_BUTTON_2_UP +RI_MOUSE_BUTTON_3_DOWN :: 0x0010 RI_MOUSE_MIDDLE_BUTTON_DOWN :: RI_MOUSE_BUTTON_3_DOWN -RI_MOUSE_BUTTON_3_UP :: 0x0020 -RI_MOUSE_MIDDLE_BUTTON_UP :: RI_MOUSE_BUTTON_3_UP -RI_MOUSE_BUTTON_4_DOWN :: 0x0040 -RI_MOUSE_BUTTON_4_UP :: 0x0080 -RI_MOUSE_BUTTON_5_DOWN :: 0x0100 -RI_MOUSE_BUTTON_5_UP :: 0x0200 -RI_MOUSE_WHEEL :: 0x0400 -RI_MOUSE_HWHEEL :: 0x0800 +RI_MOUSE_BUTTON_3_UP :: 0x0020 +RI_MOUSE_MIDDLE_BUTTON_UP :: RI_MOUSE_BUTTON_3_UP +RI_MOUSE_BUTTON_4_DOWN :: 0x0040 +RI_MOUSE_BUTTON_4_UP :: 0x0080 +RI_MOUSE_BUTTON_5_DOWN :: 0x0100 +RI_MOUSE_BUTTON_5_UP :: 0x0200 +RI_MOUSE_WHEEL :: 0x0400 +RI_MOUSE_HWHEEL :: 0x0800 WINDOWPLACEMENT :: struct { - length: UINT, - flags: UINT, - showCmd: UINT, - ptMinPosition: POINT, - ptMaxPosition: POINT, + length: UINT, + flags: UINT, + showCmd: UINT, + ptMinPosition: POINT, + ptMaxPosition: POINT, rcNormalPosition: RECT, } WINDOWINFO :: struct { - cbSize: DWORD, - rcWindow: RECT, - rcClient: RECT, - dwStyle: DWORD, - dwExStyle: DWORD, - dwWindowStatus: DWORD, + cbSize: DWORD, + rcWindow: RECT, + rcClient: RECT, + dwStyle: DWORD, + dwExStyle: DWORD, + dwWindowStatus: DWORD, cxWindowBorders: UINT, cyWindowBorders: UINT, - atomWindowType: ATOM, + atomWindowType: ATOM, wCreatorVersion: WORD, } PWINDOWINFO :: ^WINDOWINFO CURSORINFO :: struct { - cbSize: DWORD, - flags: DWORD, - hCursor: HCURSOR, + cbSize: DWORD, + flags: DWORD, + hCursor: HCURSOR, ptScreenPos: POINT, } PCURSORINFO :: ^CURSORINFO DRAWTEXTPARAMS :: struct { - cbSize: UINT, - iTabLength: INT, - iLeftMargin: INT, - iRightMargin: INT, + cbSize: UINT, + iTabLength: INT, + iLeftMargin: INT, + iRightMargin: INT, uiLengthDrawn: UINT, } PDRAWTEXTPARAMS :: ^DRAWTEXTPARAMS @@ -678,12 +685,12 @@ GetUserObjectInformationFlags :: enum INT { } USEROBJECTFLAGS :: struct { - fInherit: BOOL, + fInherit: BOOL, fReserved: BOOL, - dwFlags: DWORD, + dwFlags: DWORD, } -PROPENUMPROCW :: #type proc(unnamedParam1: HWND, unnamedParam2: LPCWSTR, unnamedParam3: HANDLE) -> BOOL +PROPENUMPROCW :: #type proc(unnamedParam1: HWND, unnamedParam2: LPCWSTR, unnamedParam3: HANDLE) -> BOOL PROPENUMPROCEXW :: #type proc(unnamedParam1: HWND, unnamedParam2: LPCWSTR, unnamedParam3: HANDLE, unnamedParam4: ULONG_PTR) -> BOOL RT_CURSOR :: LPWSTR(uintptr(0x00000001)) @@ -718,8 +725,8 @@ MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID :: LPWSTR(uintptr(0x00000010) ACCEL :: struct { /* Also called the flags field */ fVirt: BYTE, - key: WORD, - cmd: WORD, + key: WORD, + cmd: WORD, } LPACCEL :: ^ACCEL @@ -735,32 +742,32 @@ MIIM_BITMAP :: 0x00000080 MIIM_FTYPE :: 0x00000100 MENUITEMINFOW :: struct { - cbSize: UINT, - fMask: UINT, - fType: UINT, // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0) - fState: UINT, // used if MIIM_STATE - wID: UINT, // used if MIIM_ID - hSubMenu: HMENU, // used if MIIM_SUBMENU - hbmpChecked: HBITMAP, // used if MIIM_CHECKMARKS + cbSize: UINT, + fMask: UINT, + fType: UINT, // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0) + fState: UINT, // used if MIIM_STATE + wID: UINT, // used if MIIM_ID + hSubMenu: HMENU, // used if MIIM_SUBMENU + hbmpChecked: HBITMAP, // used if MIIM_CHECKMARKS hbmpUnchecked: HBITMAP, // used if MIIM_CHECKMARKS - dwItemData: ULONG_PTR, // used if MIIM_DATA - dwTypeData: LPWSTR, // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) - cch: UINT, // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) - hbmpItem: HBITMAP, // used if MIIM_BITMAP + dwItemData: ULONG_PTR, // used if MIIM_DATA + dwTypeData: LPWSTR, // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) + cch: UINT, // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) + hbmpItem: HBITMAP, // used if MIIM_BITMAP } LPMENUITEMINFOW :: ^MENUITEMINFOW DISPLAY_DEVICEW :: struct { - cb: DWORD, - DeviceName: [32]WCHAR, + cb: DWORD, + DeviceName: [32]WCHAR, DeviceString: [128]WCHAR, - StateFlags: DWORD, - DeviceID: [128]WCHAR, - DeviceKey: [128]WCHAR, + StateFlags: DWORD, + DeviceID: [128]WCHAR, + DeviceKey: [128]WCHAR, } PDISPLAY_DEVICEW :: ^DISPLAY_DEVICEW // OUTOFCONTEXT is the zero value, use {} -WinEventFlags :: bit_set[WinEventFlag; DWORD] +WinEventFlags :: distinct bit_set[WinEventFlag; DWORD] WinEventFlag :: enum DWORD { SKIPOWNTHREAD = 0, @@ -797,7 +804,7 @@ CF_PRIVATEFIRST :: 0x0200 CF_PRIVATELAST :: 0x02FF STICKYKEYS :: struct { - cbSize: UINT, + cbSize: UINT, dwFlags: DWORD, } LPSTICKYKEYS :: ^STICKYKEYS @@ -827,7 +834,7 @@ SKF_LALTLATCHED :: 0x10000000 SKF_RALTLATCHED :: 0x20000000 TOGGLEKEYS :: struct { - cbSize: UINT, + cbSize: UINT, dwFlags: DWORD, } LPTOGGLEKEYS :: ^TOGGLEKEYS @@ -840,10 +847,10 @@ TKF_HOTKEYSOUND :: 0x10 TKF_INDICATOR :: 0x20 FILTERKEYS :: struct { - cbSize: UINT, - dwFlags: DWORD, - iWaitMSec: DWORD, - iDelayMSec: DWORD, + cbSize: UINT, + dwFlags: DWORD, + iWaitMSec: DWORD, + iDelayMSec: DWORD, iRepeatMSec: DWORD, iBounceMSec: DWORD, } @@ -858,21 +865,21 @@ FKF_INDICATOR :: 0x20 FKF_CLICKON :: 0x40 NONCLIENTMETRICSW :: struct { - cbSize: UINT, - iBorderWidth: c_int, - iScrollWidth: c_int, - iScrollHeight: c_int, - iCaptionWidth: c_int, - iCaptionHeight: c_int, - lfCaptionFont: LOGFONTW, - iSmCaptionWidth: c_int, - iSmCaptionHeight: c_int, - lfSmCaptionFont: LOGFONTW, - iMenuWidth: c_int, - iMenuHeight: c_int, - lfMenuFont: LOGFONTW, - lfStatusFont: LOGFONTW, - lfMessageFont: LOGFONTW, + cbSize: UINT, + iBorderWidth: c_int, + iScrollWidth: c_int, + iScrollHeight: c_int, + iCaptionWidth: c_int, + iCaptionHeight: c_int, + lfCaptionFont: LOGFONTW, + iSmCaptionWidth: c_int, + iSmCaptionHeight: c_int, + lfSmCaptionFont: LOGFONTW, + iMenuWidth: c_int, + iMenuHeight: c_int, + lfMenuFont: LOGFONTW, + lfStatusFont: LOGFONTW, + lfMessageFont: LOGFONTW, iPaddedBorderWidth: c_int, } LPNONCLIENTMETRICSW :: ^NONCLIENTMETRICSW @@ -881,12 +888,12 @@ LWA_COLORKEY :: 0x1 LWA_ALPHA :: 0x2 SCROLLINFO :: struct { - cbSize: UINT, - fMask: UINT, - nMin: c_int, - nMax: c_int, - nPage: UINT, - nPos: c_int, + cbSize: UINT, + fMask: UINT, + nMin: c_int, + nMax: c_int, + nPage: UINT, + nPos: c_int, nTrackPos: c_int, } LPSCROLLINFO :: ^SCROLLINFO From e154489f013c66627975a6ba0d8d4c67b8ea33f9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 11:32:39 +0000 Subject: [PATCH 140/766] More formatting improvements --- core/sys/windows/userenv.odin | 21 ++--- core/sys/windows/util.odin | 34 ++++++-- core/sys/windows/ux_theme.odin | 2 +- core/sys/windows/wgl.odin | 2 +- core/sys/windows/winmm.odin | 53 +++++++------ core/sys/windows/winnls.odin | 14 ++-- core/sys/windows/winver.odin | 10 +-- core/sys/windows/wow64_apiset.odin | 96 +++++++++++------------ core/sys/windows/ws2_32.odin | 122 ++++++++++++++--------------- core/sys/windows/xinput.odin | 14 ++-- 10 files changed, 198 insertions(+), 170 deletions(-) diff --git a/core/sys/windows/userenv.odin b/core/sys/windows/userenv.odin index 2a2209d2c..1ed731407 100644 --- a/core/sys/windows/userenv.odin +++ b/core/sys/windows/userenv.odin @@ -5,19 +5,22 @@ foreign import userenv "system:Userenv.lib" @(default_calling_convention="system") foreign userenv { - GetUserProfileDirectoryW :: proc(hToken: HANDLE, - lpProfileDir: LPWSTR, - lpcchSize: ^DWORD) -> BOOL --- + GetUserProfileDirectoryW :: proc( + hToken: HANDLE, + lpProfileDir: LPWSTR, + lpcchSize: ^DWORD, + ) -> BOOL --- + LoadUserProfileW :: proc( - hToken: HANDLE, + hToken: HANDLE, lpProfileInfo: ^PROFILEINFOW, ) -> BOOL --- // https://docs.microsoft.com/en-us/windows/win32/api/userenv/nf-userenv-createprofile // The caller must have administrator privileges to call this function. CreateProfile :: proc( - pszUserSid: LPCWSTR, - pszUserName: LPCWSTR, + pszUserSid: LPCWSTR, + pszUserName: LPCWSTR, pszProfilePath: wstring, cchProfilePath: DWORD, ) -> u32 --- @@ -25,15 +28,15 @@ foreign userenv { // https://docs.microsoft.com/en-us/windows/win32/api/userenv/nf-userenv-deleteprofilew // The caller must have administrative privileges to delete a user's profile. DeleteProfileW :: proc( - lpSidString: LPCWSTR, - lpProfilePath: LPCWSTR, + lpSidString: LPCWSTR, + lpProfilePath: LPCWSTR, lpComputerName: LPCWSTR, ) -> BOOL --- // https://docs.microsoft.com/en-us/windows/win32/api/sddl/nf-sddl-convertsidtostringsida // To turn a SID into a string SID to use with CreateProfile & DeleteProfileW. ConvertSidToStringSidW :: proc( - Sid: ^SID, + Sid: ^SID, StringSid: ^LPCWSTR, ) -> BOOL --- } diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 4729d5c72..8cabdeb04 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -7,74 +7,89 @@ import "base:intrinsics" L :: intrinsics.constant_utf16_cstring // https://learn.microsoft.com/en-us/windows/win32/winmsg/makeword +@(require_results) MAKEWORD :: #force_inline proc "contextless" (#any_int a, b: int) -> WORD { return WORD(BYTE(DWORD_PTR(a) & 0xff)) | (WORD(BYTE(DWORD_PTR(b) & 0xff)) << 8) } // https://learn.microsoft.com/en-us/windows/win32/winmsg/makelong +@(require_results) MAKELONG :: #force_inline proc "contextless" (#any_int a, b: int) -> LONG { return LONG(WORD(DWORD_PTR(a) & 0xffff)) | (LONG(WORD(DWORD_PTR(b) & 0xffff)) << 16) } // https://learn.microsoft.com/en-us/windows/win32/winmsg/loword +@(require_results) LOWORD :: #force_inline proc "contextless" (#any_int x: int) -> WORD { return WORD(x & 0xffff) } // https://learn.microsoft.com/en-us/windows/win32/winmsg/hiword +@(require_results) HIWORD :: #force_inline proc "contextless" (#any_int x: int) -> WORD { return WORD(x >> 16) } // https://learn.microsoft.com/en-us/windows/win32/winmsg/lobyte +@(require_results) LOBYTE :: #force_inline proc "contextless" (w: WORD) -> BYTE { return BYTE((DWORD_PTR(w)) & 0xff) } // https://learn.microsoft.com/en-us/windows/win32/winmsg/hibyte +@(require_results) HIBYTE :: #force_inline proc "contextless" (w: WORD) -> BYTE { return BYTE(((DWORD_PTR(w)) >> 8) & 0xff) } // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-makewparam +@(require_results) MAKEWPARAM :: #force_inline proc "contextless" (#any_int l, h: int) -> WPARAM { return WPARAM(MAKELONG(l, h)) } // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-makelparam +@(require_results) MAKELPARAM :: #force_inline proc "contextless" (#any_int l, h: int) -> LPARAM { return LPARAM(MAKELONG(l, h)) } // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-makelresult +@(require_results) MAKELRESULT :: #force_inline proc "contextless" (#any_int l, h: int) -> LRESULT { return LRESULT(MAKELONG(l, h)) } // https://learn.microsoft.com/en-us/windows/win32/api/windowsx/nf-windowsx-get_x_lparam +@(require_results) GET_X_LPARAM :: #force_inline proc "contextless" (lp: LPARAM) -> c_int { return cast(c_int)cast(c_short)LOWORD(cast(DWORD)lp) } // https://learn.microsoft.com/en-us/windows/win32/api/windowsx/nf-windowsx-get_y_lparam +@(require_results) GET_Y_LPARAM :: #force_inline proc "contextless" (lp: LPARAM) -> c_int { return cast(c_int)cast(c_short)HIWORD(cast(DWORD)lp) } // https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-makelcid +@(require_results) MAKELCID :: #force_inline proc "contextless" (lgid, srtid: WORD) -> LCID { return (DWORD(WORD(srtid)) << 16) | DWORD(WORD(lgid)) } // https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-makelangid +@(require_results) MAKELANGID :: #force_inline proc "contextless" (p, s: WORD) -> DWORD { return DWORD(WORD(s)) << 10 | DWORD(WORD(p)) } +@(require_results) LANGIDFROMLCID :: #force_inline proc "contextless" (lcid: LCID) -> LANGID { return LANGID(lcid) } +@(require_results) utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> []u16 { if len(s) < 1 { return nil @@ -102,6 +117,7 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ return text[:n] } +@(require_results) utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), nil, 0) if n1 == 0 { @@ -120,6 +136,7 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { } utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf} +@(require_results) utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> wstring { if res := utf8_to_utf16(s, allocator); len(res) > 0 { return wstring(raw_data(res)) @@ -127,6 +144,7 @@ utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> return nil } +@(require_results) utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { if res := utf8_to_utf16(buf, s); len(res) > 0 { return wstring(raw_data(res)) @@ -136,6 +154,7 @@ utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf} +@(require_results) wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allocator) -> (res: string, err: runtime.Allocator_Error) { context.allocator = allocator @@ -170,6 +189,7 @@ wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allo return string(text[:n]), nil } +@(require_results) wstring_to_utf8_buf :: proc(buf: []u8, s: wstring, N := -1) -> (res: string) { n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, c_int(N), nil, 0, nil, nil) if n == 0 { @@ -211,6 +231,7 @@ Returns: - res: A cloned and converted string - err: An optional allocator error if one occured, `nil` otherwise */ +@(require_results) utf16_to_utf8_alloc :: proc(s: []u16, allocator := context.temp_allocator) -> (res: string, err: runtime.Allocator_Error) { if len(s) == 0 { return "", nil @@ -232,6 +253,7 @@ Inputs: Returns: - res: A converted string, backed byu `buf` */ +@(require_results) utf16_to_utf8_buf :: proc(buf: []u8, s: []u16) -> (res: string) { if len(s) == 0 { return @@ -244,8 +266,9 @@ utf16_to_utf8 :: proc{utf16_to_utf8_alloc, utf16_to_utf8_buf} // AdvAPI32, NetAPI32 and UserENV helpers. -allowed_username :: proc(username: string) -> bool { - contains_any :: proc(s, chars: string) -> bool { +@(require_results) +allowed_username :: proc "contextless" (username: string) -> bool { + contains_any :: proc "contextless" (s, chars: string) -> bool { if chars == "" { return false } @@ -287,8 +310,8 @@ allowed_username :: proc(username: string) -> bool { } // Returns .Success on success. +@(require_results) _add_user :: proc(servername: string, username: string, password: string) -> (ok: NET_API_STATUS) { - servername_w: wstring username_w: []u16 password_w: []u16 @@ -339,8 +362,8 @@ _add_user :: proc(servername: string, username: string, password: string) -> (ok return } +@(require_results) get_computer_name_and_account_sid :: proc(username: string) -> (computer_name: string, sid := SID{}, ok: bool) { - username_w := utf8_to_utf16(username, context.temp_allocator) cbsid: DWORD computer_name_size: DWORD @@ -381,8 +404,8 @@ get_computer_name_and_account_sid :: proc(username: string) -> (computer_name: s return } +@(require_results) get_sid :: proc(username: string, sid: ^SID) -> (ok: bool) { - username_w := utf8_to_utf16(username, context.temp_allocator) cbsid: DWORD computer_name_size: DWORD @@ -451,6 +474,7 @@ add_del_from_group :: proc(sid: ^SID, group: string) -> (ok: NET_API_STATUS) { return } +@(require_results) add_user_profile :: proc(username: string) -> (ok: bool, profile_path: string) { username_w := utf8_to_utf16(username, context.temp_allocator) diff --git a/core/sys/windows/ux_theme.odin b/core/sys/windows/ux_theme.odin index 47a0049b2..4ce126c73 100644 --- a/core/sys/windows/ux_theme.odin +++ b/core/sys/windows/ux_theme.odin @@ -13,6 +13,6 @@ PMARGINS :: ^MARGINS @(default_calling_convention="system") foreign uxtheme { - IsThemeActive :: proc() -> BOOL --- + IsThemeActive :: proc() -> BOOL --- SetWindowTheme :: proc(hWnd: HWND, pszSubAppName, pszSubIdList: LPCWSTR) -> HRESULT --- } diff --git a/core/sys/windows/wgl.odin b/core/sys/windows/wgl.odin index 436a96329..532a987eb 100644 --- a/core/sys/windows/wgl.odin +++ b/core/sys/windows/wgl.odin @@ -91,7 +91,7 @@ gl_set_proc_address :: proc(p: rawptr, name: cstring) { func := wglGetProcAddress(name) switch uintptr(func) { case 0, 1, 2, 3, ~uintptr(0): - module := LoadLibraryW(L("opengl32.dll")) + module := LoadLibraryW("opengl32.dll") func = GetProcAddress(module, name) } (^rawptr)(p)^ = func diff --git a/core/sys/windows/winmm.odin b/core/sys/windows/winmm.odin index b85548b85..d1848cb7b 100644 --- a/core/sys/windows/winmm.odin +++ b/core/sys/windows/winmm.odin @@ -12,28 +12,28 @@ foreign winmm { timeEndPeriod :: proc(uPeriod: UINT) -> MMRESULT --- timeGetTime :: proc() -> DWORD --- - waveOutGetNumDevs :: proc() -> UINT --- - waveOutGetDevCapsW :: proc(uDeviceID: UINT_PTR, pwoc: LPWAVEOUTCAPSW, cbwoc: UINT) -> MMRESULT --- - waveOutGetVolume :: proc(hwo: HWAVEOUT, pdwVolume: LPDWORD) -> MMRESULT --- - waveOutSetVolume :: proc(hwo: HWAVEOUT, dwVolume: DWORD) -> MMRESULT --- - waveOutGetErrorTextW :: proc(mmrError: MMRESULT, pszText: LPWSTR, cchText: UINT) -> MMRESULT --- - waveOutOpen :: proc(phwo: LPHWAVEOUT, uDeviceID: UINT, pwfx: LPCWAVEFORMATEX, dwCallback: DWORD_PTR, dwInstance: DWORD_PTR, fdwOpen: DWORD) -> MMRESULT --- - waveOutClose :: proc(hwo: HWAVEOUT) -> MMRESULT --- - waveOutPrepareHeader :: proc(hwo: HWAVEOUT, pwh: LPWAVEHDR, cbwh: UINT) -> MMRESULT --- + waveOutGetNumDevs :: proc() -> UINT --- + waveOutGetDevCapsW :: proc(uDeviceID: UINT_PTR, pwoc: LPWAVEOUTCAPSW, cbwoc: UINT) -> MMRESULT --- + waveOutGetVolume :: proc(hwo: HWAVEOUT, pdwVolume: LPDWORD) -> MMRESULT --- + waveOutSetVolume :: proc(hwo: HWAVEOUT, dwVolume: DWORD) -> MMRESULT --- + waveOutGetErrorTextW :: proc(mmrError: MMRESULT, pszText: LPWSTR, cchText: UINT) -> MMRESULT --- + waveOutOpen :: proc(phwo: LPHWAVEOUT, uDeviceID: UINT, pwfx: LPCWAVEFORMATEX, dwCallback: DWORD_PTR, dwInstance: DWORD_PTR, fdwOpen: DWORD) -> MMRESULT --- + waveOutClose :: proc(hwo: HWAVEOUT) -> MMRESULT --- + waveOutPrepareHeader :: proc(hwo: HWAVEOUT, pwh: LPWAVEHDR, cbwh: UINT) -> MMRESULT --- waveOutUnprepareHeader :: proc(hwo: HWAVEOUT, pwh: LPWAVEHDR, cbwh: UINT) -> MMRESULT --- - waveOutWrite :: proc(hwo: HWAVEOUT, pwh: LPWAVEHDR, cbwh: UINT) -> MMRESULT --- - waveOutPause :: proc(hwo: HWAVEOUT) -> MMRESULT --- - waveOutRestart :: proc(hwo: HWAVEOUT) -> MMRESULT --- - waveOutReset :: proc(hwo: HWAVEOUT) -> MMRESULT --- - waveOutBreakLoop :: proc(hwo: HWAVEOUT) -> MMRESULT --- - waveOutGetPosition :: proc(hwo: HWAVEOUT, pmmt: LPMMTIME, cbmmt: UINT) -> MMRESULT --- - waveOutGetPitch :: proc(hwo: HWAVEOUT, pdwPitch: LPDWORD) -> MMRESULT --- - waveOutSetPitch :: proc(hwo: HWAVEOUT, pdwPitch: DWORD) -> MMRESULT --- + waveOutWrite :: proc(hwo: HWAVEOUT, pwh: LPWAVEHDR, cbwh: UINT) -> MMRESULT --- + waveOutPause :: proc(hwo: HWAVEOUT) -> MMRESULT --- + waveOutRestart :: proc(hwo: HWAVEOUT) -> MMRESULT --- + waveOutReset :: proc(hwo: HWAVEOUT) -> MMRESULT --- + waveOutBreakLoop :: proc(hwo: HWAVEOUT) -> MMRESULT --- + waveOutGetPosition :: proc(hwo: HWAVEOUT, pmmt: LPMMTIME, cbmmt: UINT) -> MMRESULT --- + waveOutGetPitch :: proc(hwo: HWAVEOUT, pdwPitch: LPDWORD) -> MMRESULT --- + waveOutSetPitch :: proc(hwo: HWAVEOUT, pdwPitch: DWORD) -> MMRESULT --- waveOutGetPlaybackRate :: proc(hwo: HWAVEOUT, pdwRate: LPDWORD) -> MMRESULT --- waveOutSetPlaybackRate :: proc(hwo: HWAVEOUT, pdwRate: DWORD) -> MMRESULT --- - waveOutGetID :: proc(hwo: HWAVEOUT, puDeviceID: LPUINT) -> MMRESULT --- + waveOutGetID :: proc(hwo: HWAVEOUT, puDeviceID: LPUINT) -> MMRESULT --- - waveInGetNumDevs :: proc() -> UINT --- + waveInGetNumDevs :: proc() -> UINT --- waveInGetDevCapsW :: proc(uDeviceID: UINT_PTR, pwic: LPWAVEINCAPSW, cbwic: UINT) -> MMRESULT --- PlaySoundW :: proc(pszSound: LPCWSTR, hmod: HMODULE, fdwSound: DWORD) -> BOOL --- @@ -272,10 +272,10 @@ LPHWAVEOUT :: ^HWAVEOUT MMTIME :: struct { wType: MMTIME_TYPE, u: struct #raw_union { - ms: DWORD, - sample: DWORD, - cb: DWORD, - ticks: DWORD, + ms: DWORD `raw_union_tag:"wType=TIME_MS"`, + sample: DWORD `raw_union_tag:"wType=TIME_SAMPLES"`, + cb: DWORD `raw_union_tag:"wType=TIME_BYTES"`, + ticks: DWORD `raw_union_tag:"wType=TIME_TICKS"`, smpte: struct { hour: BYTE, min: BYTE, @@ -284,10 +284,10 @@ MMTIME :: struct { fps: BYTE, dummy: BYTE, pad: [2]BYTE, - }, + } `raw_union_tag:"wType=TIME_SMPTE"`, midi: struct { songptrpos: DWORD, - }, + } `raw_union_tag:"wType=TIME_MIDI"`, }, } LPMMTIME :: ^MMTIME @@ -307,12 +307,13 @@ MMTIME_TYPE :: enum UINT { TIME_TICKS = 0x0020, } -MAXPNAMELEN :: 32 +MAXPNAMELEN :: 32 MAXERRORLENGTH :: 256 -MMVERSION :: UINT +MMVERSION :: UINT // Input is four characters string // Output is little-endian u32 representation +@(require_results) MAKEFOURCC :: #force_inline proc "contextless" (s: [4]byte) -> DWORD { return (DWORD(s[0])) | (DWORD(s[1]) << 8) | (DWORD(s[2]) << 16) | (DWORD(s[3]) << 24 ) } diff --git a/core/sys/windows/winnls.odin b/core/sys/windows/winnls.odin index ffb2638d5..9c2c219ef 100644 --- a/core/sys/windows/winnls.odin +++ b/core/sys/windows/winnls.odin @@ -5,8 +5,8 @@ LCTYPE :: distinct DWORD LOCALE_NAME_MAX_LENGTH :: 85 LOCALE_NAME_USER_DEFAULT :: 0 -LOCALE_NAME_INVARIANT : wstring = L("") -LOCALE_NAME_SYSTEM_DEFAULT : wstring = L("!x-sys-default-locale") +LOCALE_NAME_INVARIANT : wstring = "" +LOCALE_NAME_SYSTEM_DEFAULT : wstring = "!x-sys-default-locale" // String Length Maximums. // 5 ranges, 2 bytes ea., 0 term. @@ -16,16 +16,16 @@ MAX_DEFAULTCHAR :: 2 CPINFOEXW :: struct{ // Maximum length, in bytes, of a character in the code page. - MaxCharSize: UINT, + MaxCharSize: UINT, // The default is usually the "?" character for the code page. - DefaultChar: [MAX_DEFAULTCHAR]BYTE, + DefaultChar: [MAX_DEFAULTCHAR]BYTE, // A fixed-length array of lead byte ranges, for which the number of lead byte ranges is variable. - LeadByte: [MAX_LEADBYTES]BYTE, + LeadByte: [MAX_LEADBYTES]BYTE, // The default is usually the "?" character or the katakana middle dot character. UnicodeDefaultChar: WCHAR, // Code page value. This value reflects the code page passed to the GetCPInfoEx function. - CodePage: CODEPAGE, + CodePage: CODEPAGE, // Full name of the code page. - CodePageName: [MAX_PATH]WCHAR, + CodePageName: [MAX_PATH]WCHAR, } LPCPINFOEXW :: ^CPINFOEXW diff --git a/core/sys/windows/winver.odin b/core/sys/windows/winver.odin index 47751dab7..878080102 100644 --- a/core/sys/windows/winver.odin +++ b/core/sys/windows/winver.odin @@ -5,14 +5,14 @@ foreign import version "system:version.lib" @(default_calling_convention = "system") foreign version { - GetFileVersionInfoSizeW :: proc(lpwstrFilename: LPCWSTR, lpdwHandle: LPDWORD) -> DWORD --- - GetFileVersionInfoW :: proc(lptstrFilename: LPCWSTR, dwHandle: DWORD, dwLen: DWORD, lpData: LPVOID) -> BOOL --- + GetFileVersionInfoSizeW :: proc(lpwstrFilename: LPCWSTR, lpdwHandle: LPDWORD) -> DWORD --- + GetFileVersionInfoW :: proc(lptstrFilename: LPCWSTR, dwHandle: DWORD, dwLen: DWORD, lpData: LPVOID) -> BOOL --- GetFileVersionInfoSizeExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, lpdwHandle: LPDWORD) -> DWORD --- - GetFileVersionInfoExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, dwHandle, dwLen: DWORD, lpData: LPVOID) -> DWORD --- + GetFileVersionInfoExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, dwHandle, dwLen: DWORD, lpData: LPVOID) -> DWORD --- - VerLanguageNameW :: proc(wLang: DWORD, szLang: LPWSTR, cchLang: DWORD) -> DWORD --- - VerQueryValueW :: proc(pBlock: LPCVOID, lpSubBlock: LPCWSTR, lplpBuffer: ^LPVOID, puLen: PUINT) -> BOOL --- + VerLanguageNameW :: proc(wLang: DWORD, szLang: LPWSTR, cchLang: DWORD) -> DWORD --- + VerQueryValueW :: proc(pBlock: LPCVOID, lpSubBlock: LPCWSTR, lplpBuffer: ^LPVOID, puLen: PUINT) -> BOOL --- } FILE_VER_GET :: enum DWORD {LOCALISED, NEUTRAL, PREFETCHED} diff --git a/core/sys/windows/wow64_apiset.odin b/core/sys/windows/wow64_apiset.odin index 3d29b786e..cce0ab2cc 100644 --- a/core/sys/windows/wow64_apiset.odin +++ b/core/sys/windows/wow64_apiset.odin @@ -5,30 +5,30 @@ foreign import kernel32 "system:Kernel32.lib" @(default_calling_convention="system") foreign kernel32 { - GetSystemWow64Directory2W :: proc (lpBuffer: LPWSTR, uSize: UINT, ImageFileMachineTyp: WORD) -> UINT --- - GetSystemWow64DirectoryW :: proc (lpBuffer: LPWSTR, uSize: UINT) -> UINT --- - IsWow64GuestMachineSupported :: proc (WowGuestMachine: USHORT, MachineIsSupported: ^BOOL) -> HRESULT --- - IsWow64Process :: proc (hProcess: HANDLE, Wow64Process: PBOOL) -> BOOL --- - IsWow64Process2 :: proc (hProcess: HANDLE, pProcessMachine: ^USHORT, pNativeMachine: ^USHORT) -> BOOL --- - Wow64EnableWow64FsRedirection :: proc (Wow64FsEnableRedirection: BOOLEAN) -> BOOLEAN --- - Wow64DisableWow64FsRedirection :: proc (OldValue: ^PVOID) -> BOOL --- - Wow64RevertWow64FsRedirection :: proc (OlValue: PVOID) -> BOOL --- - Wow64GetThreadContext :: proc (hThread: HANDLE, lpContext: PWOW64_CONTEXT) -> BOOL --- - Wow64SetThreadContext :: proc(hThread: HANDLE, lpContext: ^WOW64_CONTEXT) -> BOOL --- + GetSystemWow64Directory2W :: proc(lpBuffer: LPWSTR, uSize: UINT, ImageFileMachineTyp: WORD) -> UINT --- + GetSystemWow64DirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT --- + IsWow64GuestMachineSupported :: proc(WowGuestMachine: USHORT, MachineIsSupported: ^BOOL) -> HRESULT --- + IsWow64Process :: proc(hProcess: HANDLE, Wow64Process: PBOOL) -> BOOL --- + IsWow64Process2 :: proc(hProcess: HANDLE, pProcessMachine: ^USHORT, pNativeMachine: ^USHORT) -> BOOL --- + Wow64EnableWow64FsRedirection :: proc(Wow64FsEnableRedirection: BOOLEAN) -> BOOLEAN --- + Wow64DisableWow64FsRedirection :: proc(OldValue: ^PVOID) -> BOOL --- + Wow64RevertWow64FsRedirection :: proc(OlValue: PVOID) -> BOOL --- + Wow64GetThreadContext :: proc(hThread: HANDLE, lpContext: PWOW64_CONTEXT) -> BOOL --- + Wow64SetThreadContext :: proc(hThread: HANDLE, lpContext: ^WOW64_CONTEXT) -> BOOL --- Wow64SetThreadDefaultGuestMachine :: proc(Machine: USHORT) -> USHORT --- - Wow64SuspendThread :: proc (hThread: HANDLE) -> DWORD --- + Wow64SuspendThread :: proc(hThread: HANDLE) -> DWORD --- } WOW64_CONTEXT_i386 :: 0x00010000 -WOW64_CONTEXT_CONTROL :: (WOW64_CONTEXT_i386 | 0x00000001) -WOW64_CONTEXT_INTEGER :: (WOW64_CONTEXT_i386 | 0x00000002) +WOW64_CONTEXT_CONTROL :: (WOW64_CONTEXT_i386 | 0x00000001) +WOW64_CONTEXT_INTEGER :: (WOW64_CONTEXT_i386 | 0x00000002) WOW64_CONTEXT_SEGMENTS :: (WOW64_CONTEXT_i386 | 0x00000004) -WOW64_CONTEXT_FLOATING_POINT :: (WOW64_CONTEXT_i386 | 0x00000008) -WOW64_CONTEXT_DEBUG_REGISTERS :: (WOW64_CONTEXT_i386 | 0x00000010) +WOW64_CONTEXT_FLOATING_POINT :: (WOW64_CONTEXT_i386 | 0x00000008) +WOW64_CONTEXT_DEBUG_REGISTERS :: (WOW64_CONTEXT_i386 | 0x00000010) WOW64_CONTEXT_EXTENDED_REGISTERS :: (WOW64_CONTEXT_i386 | 0x00000020) -WOW64_CONTEXT_FULL :: (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS) +WOW64_CONTEXT_FULL :: (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS) WOW64_CONTEXT_ALL :: ( WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | @@ -41,45 +41,45 @@ WOW64_SIZE_OF_80387_REGISTERS :: 80 WOW64_MAXIMUM_SUPPORTED_EXTENSION :: 512 WOW64_CONTEXT :: struct { - ContextFlags: DWORD, - Dr0: DWORD, - Dr1: DWORD, - Dr2: DWORD, - Dr3: DWORD, - Dr6: DWORD, - Dr7: DWORD, - FloatSave: WOW64_FLOATING_SAVE_AREA, - SegGs: DWORD, - SegFs: DWORD, - SegEs: DWORD, - SegDs: DWORD, - Edi: DWORD, - Esi: DWORD, - Ebx: DWORD, - Edx: DWORD, - Ecx: DWORD, - Eax: DWORD, - Ebp: DWORD, - Eip: DWORD, - SegCs: DWORD, - EFlags: DWORD, - Esp: DWORD, - SegSs: DWORD, + ContextFlags: DWORD, + Dr0: DWORD, + Dr1: DWORD, + Dr2: DWORD, + Dr3: DWORD, + Dr6: DWORD, + Dr7: DWORD, + FloatSave: WOW64_FLOATING_SAVE_AREA, + SegGs: DWORD, + SegFs: DWORD, + SegEs: DWORD, + SegDs: DWORD, + Edi: DWORD, + Esi: DWORD, + Ebx: DWORD, + Edx: DWORD, + Ecx: DWORD, + Eax: DWORD, + Ebp: DWORD, + Eip: DWORD, + SegCs: DWORD, + EFlags: DWORD, + Esp: DWORD, + SegSs: DWORD, ExtendedRegisters: [WOW64_MAXIMUM_SUPPORTED_EXTENSION]BYTE, } PWOW64_CONTEXT :: ^WOW64_CONTEXT WOW64_FLOATING_SAVE_AREA :: struct { - ControlWord: DWORD, - StatusWord: DWORD, - TagWord: DWORD, - ErrorOffset: DWORD, + ControlWord: DWORD, + StatusWord: DWORD, + TagWord: DWORD, + ErrorOffset: DWORD, ErrorSelector: DWORD, - DataOffset: DWORD, - DataSelector: DWORD, - RegisterArea: [WOW64_SIZE_OF_80387_REGISTERS]BYTE, - Cr0NpxState: DWORD, + DataOffset: DWORD, + DataSelector: DWORD, + RegisterArea: [WOW64_SIZE_OF_80387_REGISTERS]BYTE, + Cr0NpxState: DWORD, } PWOW64_FLOATING_SAVE_AREA :: ^WOW64_FLOATING_SAVE_AREA \ No newline at end of file diff --git a/core/sys/windows/ws2_32.odin b/core/sys/windows/ws2_32.odin index ed2ad5e24..2c8dbe3b0 100644 --- a/core/sys/windows/ws2_32.odin +++ b/core/sys/windows/ws2_32.odin @@ -109,62 +109,62 @@ foreign ws2_32 { WSAPoll :: proc(fdArray: ^WSA_POLLFD, fds: c_ulong, timeout: c_int) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaduplicatesocketw) WSADuplicateSocketW :: proc( - s: SOCKET, - dwProcessId: DWORD, + s: SOCKET, + dwProcessId: DWORD, lpProtocolInfo: LPWSAPROTOCOL_INFO, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasend) WSASend :: proc( - s: SOCKET, - lpBuffers: LPWSABUF, - dwBufferCount: DWORD, + s: SOCKET, + lpBuffers: LPWSABUF, + dwBufferCount: DWORD, lpNumberOfBytesSent: LPDWORD, - dwFlags: DWORD, - lpOverlapped: LPWSAOVERLAPPED, + dwFlags: DWORD, + lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasendto) WSASendTo :: proc( - s: SOCKET, - lpBuffers: LPWSABUF, - dwBufferCount: DWORD, + s: SOCKET, + lpBuffers: LPWSABUF, + dwBufferCount: DWORD, lpNumberOfBytesSent: LPDWORD, - dwFlags: DWORD, - lpTo: ^SOCKADDR_STORAGE_LH, - iToLen: c_int, - lpOverlapped: LPWSAOVERLAPPED, + dwFlags: DWORD, + lpTo: ^SOCKADDR_STORAGE_LH, + iToLen: c_int, + lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsarecv) WSARecv :: proc( - s: SOCKET, - lpBuffers: LPWSABUF, - dwBufferCount: DWORD, + s: SOCKET, + lpBuffers: LPWSABUF, + dwBufferCount: DWORD, lpNumberOfBytesRecvd: LPDWORD, - lpFlags: LPDWORD, - lpOverlapped: LPWSAOVERLAPPED, - lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, + lpFlags: LPDWORD, + lpOverlapped: LPWSAOVERLAPPED, + lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsarecvfrom) WSARecvFrom :: proc( - s: SOCKET, - lpBuffers: LPWSABUF, - dwBufferCount: DWORD, + s: SOCKET, + lpBuffers: LPWSABUF, + dwBufferCount: DWORD, lpNumberOfBytesRecvd: LPDWORD, - lpFlags: LPDWORD, - lpFrom: ^SOCKADDR_STORAGE_LH, - lpFromlen: ^c_int, - lpOverlapped: LPWSAOVERLAPPED, - lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, + lpFlags: LPDWORD, + lpFrom: ^SOCKADDR_STORAGE_LH, + lpFromlen: ^c_int, + lpOverlapped: LPWSAOVERLAPPED, + lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketw) WSASocketW :: proc( - af: c_int, - kind: c_int, - protocol: c_int, + af: c_int, + kind: c_int, + protocol: c_int, lpProtocolInfo: LPWSAPROTOCOL_INFO, - g: GROUP, - dwFlags: DWORD, + g: GROUP, + dwFlags: DWORD, ) -> SOCKET --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaioctl) WSAIoctl :: proc(s: SOCKET, dwIoControlCode: DWORD, lpvInBuffer: rawptr, cbInBuffer: DWORD, lpvOutBuffer: rawptr, cbOutBuffer: DWORD, lpcbBytesReturned: ^DWORD, lpOverlapped: ^OVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE) -> c_int --- @@ -182,8 +182,8 @@ foreign ws2_32 { WSAGetOverlappedResult :: proc(s: SOCKET, lpOverlapped: ^OVERLAPPED, lpcbTransfer: ^DWORD, fWait: BOOL, lpdwFlags: ^DWORD) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket) socket :: proc( - af: c_int, - type: c_int, + af: c_int, + type: c_int, protocol: c_int, ) -> SOCKET --- @@ -197,20 +197,20 @@ foreign ws2_32 { send :: proc(socket: SOCKET, buf: rawptr, len: c_int, flags: c_int) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-recvfrom) recvfrom :: proc( - socket: SOCKET, - buf: rawptr, - len: c_int, - flags: c_int, - addr: ^SOCKADDR_STORAGE_LH, + socket: SOCKET, + buf: rawptr, + len: c_int, + flags: c_int, + addr: ^SOCKADDR_STORAGE_LH, addrlen: ^c_int, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-sendto) sendto :: proc( - socket: SOCKET, - buf: rawptr, - len: c_int, - flags: c_int, - addr: ^SOCKADDR_STORAGE_LH, + socket: SOCKET, + buf: rawptr, + len: c_int, + flags: c_int, + addr: ^SOCKADDR_STORAGE_LH, addrlen: c_int, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-shutdown) @@ -220,11 +220,11 @@ foreign ws2_32 { // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt) setsockopt :: proc( - s: SOCKET, - level: c_int, + s: SOCKET, + level: c_int, optname: c_int, - optval: rawptr, - optlen: c_int, + optval: rawptr, + optlen: c_int, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockname) getsockname :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int --- @@ -238,10 +238,10 @@ foreign ws2_32 { connect :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, len: c_int) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-getaddrinfo) getaddrinfo :: proc( - node: cstring, + node: cstring, service: cstring, - hints: ^ADDRINFOA, - res: ^^ADDRINFOA, + hints: ^ADDRINFOA, + res: ^^ADDRINFOA, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-freeaddrinfo) freeaddrinfo :: proc(res: ^ADDRINFOA) --- @@ -261,19 +261,19 @@ foreign ws2_32 { lpHandle: LPHANDLE) -> INT --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-select) select :: proc( - nfds: c_int, - readfds: ^fd_set, - writefds: ^fd_set, - exceptfds: ^fd_set, - timeout: ^timeval, + nfds: c_int, + readfds: [^]fd_set, + writefds: [^]fd_set, + exceptfds: [^]fd_set, + timeout: ^timeval, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt) getsockopt :: proc( - s: SOCKET, - level: c_int, + s: SOCKET, + level: c_int, optname: c_int, - optval: ^c_char, - optlen: ^c_int, + optval: [^]c_char, + optlen: ^c_int, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-ntohl) ntohl :: proc(netlong: c_ulong) -> c_ulong --- diff --git a/core/sys/windows/xinput.odin b/core/sys/windows/xinput.odin index 0089f88cb..c0c758c41 100644 --- a/core/sys/windows/xinput.odin +++ b/core/sys/windows/xinput.odin @@ -199,12 +199,12 @@ XINPUT_KEYSTROKE :: struct { // XInput APIs @(default_calling_convention = "system") foreign xinput { - XInputGetState :: proc(user: XUSER, pState: ^XINPUT_STATE) -> System_Error --- - XInputSetState :: proc(user: XUSER, pVibration: ^XINPUT_VIBRATION) -> System_Error --- - XInputGetCapabilities :: proc(user: XUSER, dwFlags: XINPUT_FLAG, pCapabilities: ^XINPUT_CAPABILITIES) -> System_Error --- - XInputEnable :: proc(enable: BOOL) --- - XInputGetAudioDeviceIds :: proc(user: XUSER, pRenderDeviceId: LPWSTR, pRenderCount: ^UINT, pCaptureDeviceId: LPWSTR, pCaptureCount: ^UINT) -> System_Error --- - XInputGetBatteryInformation :: proc(user: XUSER, devType: BATTERY_DEVTYPE, pBatteryInformation: ^XINPUT_BATTERY_INFORMATION) -> System_Error --- - XInputGetKeystroke :: proc(user: XUSER, dwReserved: DWORD, pKeystroke: ^XINPUT_KEYSTROKE) -> System_Error --- + XInputGetState :: proc(user: XUSER, pState: ^XINPUT_STATE) -> System_Error --- + XInputSetState :: proc(user: XUSER, pVibration: ^XINPUT_VIBRATION) -> System_Error --- + XInputGetCapabilities :: proc(user: XUSER, dwFlags: XINPUT_FLAG, pCapabilities: ^XINPUT_CAPABILITIES) -> System_Error --- + XInputEnable :: proc(enable: BOOL) --- + XInputGetAudioDeviceIds :: proc(user: XUSER, pRenderDeviceId: LPWSTR, pRenderCount: ^UINT, pCaptureDeviceId: LPWSTR, pCaptureCount: ^UINT) -> System_Error --- + XInputGetBatteryInformation :: proc(user: XUSER, devType: BATTERY_DEVTYPE, pBatteryInformation: ^XINPUT_BATTERY_INFORMATION) -> System_Error --- + XInputGetKeystroke :: proc(user: XUSER, dwReserved: DWORD, pKeystroke: ^XINPUT_KEYSTROKE) -> System_Error --- XInputGetDSoundAudioDeviceGuids :: proc(user: XUSER, pDSoundRenderGuid: ^GUID, pDSoundCaptureGuid: ^GUID) -> System_Error --- } From 57c7ae1bd9eb2160afc0cf6d85c3e16781e9a439 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 11:35:44 +0000 Subject: [PATCH 141/766] Minor fixes to formatting and types --- core/sys/windows/comctl32.odin | 8 ++++---- core/sys/windows/xinput.odin | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index 3418c7649..28fab53be 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -1609,9 +1609,9 @@ LPTV_ITEMEXW :: LPTVITEMEXW TVINSERTSTRUCTW :: struct { hParent: HTREEITEM, hInsertAfter: HTREEITEM, - _: struct #raw_union { - itemex: TVITEMEXW, - item: TV_ITEMW, + using _: struct #raw_union { + itemex: TVITEMEXW, + item: TV_ITEMW, }, } TV_INSERTSTRUCTW :: TVINSERTSTRUCTW @@ -1703,7 +1703,7 @@ TreeView_Expand :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM, co } TreeView_GetItemRect :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM, prc: ^RECT, code: UINT) -> BOOL { alias: struct #raw_union { - rc: ^RECT, + rc: ^RECT, hitem: ^HTREEITEM, } diff --git a/core/sys/windows/xinput.odin b/core/sys/windows/xinput.odin index c0c758c41..f8fd45bc9 100644 --- a/core/sys/windows/xinput.odin +++ b/core/sys/windows/xinput.odin @@ -57,9 +57,9 @@ XINPUT_GAMEPAD_BUTTON_BIT :: enum WORD { XINPUT_GAMEPAD_BUTTON :: distinct bit_set[XINPUT_GAMEPAD_BUTTON_BIT;WORD] // Gamepad thresholds -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE: SHORT : 7849 -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE: SHORT : 8689 -XINPUT_GAMEPAD_TRIGGER_THRESHOLD: SHORT : 30 +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE : SHORT : 7849 +XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE : SHORT : 8689 +XINPUT_GAMEPAD_TRIGGER_THRESHOLD : SHORT : 30 // Flags to pass to XInputGetCapabilities // Corresponds to log2(XINPUT_FLAG_...) From 65b147d4d39c4431ad7ee7e7f856eadc225b195a Mon Sep 17 00:00:00 2001 From: Piotr Doan Date: Fri, 2 Jan 2026 18:58:09 +0100 Subject: [PATCH 142/766] Prefer LPCSTR/LPCWSTR types in DirectX bindings - Replaces [^]u16 parameter types because they are not directly compatible with result of `win32.utf8_to_wstring()` - Replaces some string/wstring types for consistency, similarly as other packages do to match original C declarations and documentation --- vendor/directx/d3d11/d3d11.odin | 55 +++++++-------- vendor/directx/d3d12/d3d12.odin | 67 ++++++++++--------- vendor/directx/d3d_compiler/d3d_compiler.odin | 46 +++++++------ 3 files changed, 87 insertions(+), 81 deletions(-) diff --git a/vendor/directx/d3d11/d3d11.odin b/vendor/directx/d3d11/d3d11.odin index 835655bbf..517146c8a 100644 --- a/vendor/directx/d3d11/d3d11.odin +++ b/vendor/directx/d3d11/d3d11.odin @@ -20,6 +20,7 @@ BOOL :: dxgi.BOOL UINT :: dxgi.UINT INT :: dxgi.INT +LPCSTR :: windows.LPCSTR LPCWSTR :: windows.LPCWSTR RECT :: dxgi.RECT @@ -950,7 +951,7 @@ INPUT_CLASSIFICATION :: enum i32 { } INPUT_ELEMENT_DESC :: struct { - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, Format: dxgi.FORMAT, InputSlot: u32, @@ -972,7 +973,7 @@ CULL_MODE :: enum i32 { SO_DECLARATION_ENTRY :: struct { Stream: u32, - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, StartComponent: u8, ComponentCount: u8, @@ -2172,8 +2173,8 @@ IClassLinkage :: struct #raw_union { } IClassLinkage_VTable :: struct { using id3d11devicechild_vtable: IDeviceChild_VTable, - GetClassInstance: proc "system" (this: ^IClassLinkage, pClassInstanceName: cstring, InstanceIndex: u32, ppInstance: ^^IClassInstance) -> HRESULT, - CreateClassInstance: proc "system" (this: ^IClassLinkage, pClassTypeName: cstring, ConstantBufferOffset: u32, ConstantVectorOffset: u32, TextureOffset: u32, SamplerOffset: u32, ppInstance: ^^IClassInstance) -> HRESULT, + GetClassInstance: proc "system" (this: ^IClassLinkage, pClassInstanceName: LPCSTR, InstanceIndex: u32, ppInstance: ^^IClassInstance) -> HRESULT, + CreateClassInstance: proc "system" (this: ^IClassLinkage, pClassTypeName: LPCSTR, ConstantBufferOffset: u32, ConstantVectorOffset: u32, TextureOffset: u32, SamplerOffset: u32, ppInstance: ^^IClassInstance) -> HRESULT, } @@ -3407,7 +3408,7 @@ SHADER_VERSION_TYPE :: enum i32 { } SIGNATURE_PARAMETER_DESC :: struct { - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, Register: u32, SystemValueType: NAME, @@ -3421,7 +3422,7 @@ SIGNATURE_PARAMETER_DESC :: struct { } SHADER_BUFFER_DESC :: struct { - Name: cstring, + Name: LPCSTR, Type: CBUFFER_TYPE, Variables: u32, Size: u32, @@ -3429,7 +3430,7 @@ SHADER_BUFFER_DESC :: struct { } SHADER_VARIABLE_DESC :: struct { - Name: cstring, + Name: LPCSTR, StartOffset: u32, Size: u32, uFlags: SHADER_VARIABLE_FLAGS, @@ -3448,12 +3449,12 @@ SHADER_TYPE_DESC :: struct { Elements: u32, Members: u32, Offset: u32, - Name: cstring, + Name: LPCSTR, } SHADER_DESC :: struct { Version: u32, - Creator: cstring, + Creator: LPCSTR, Flags: u32, ConstantBuffers: u32, @@ -3496,7 +3497,7 @@ SHADER_DESC :: struct { } SHADER_INPUT_BIND_DESC :: struct { - Name: cstring, + Name: LPCSTR, Type: SHADER_INPUT_TYPE, BindPoint: u32, BindCount: u32, @@ -3508,14 +3509,14 @@ SHADER_INPUT_BIND_DESC :: struct { } LIBRARY_DESC :: struct { - Creator: cstring, + Creator: LPCSTR, Flags: u32, FunctionCount: u32, } FUNCTION_DESC :: struct { Version: u32, - Creator: cstring, + Creator: LPCSTR, Flags: u32, ConstantBuffers: u32, @@ -3545,7 +3546,7 @@ FUNCTION_DESC :: struct { MinFeatureLevel: FEATURE_LEVEL, RequiredFeatureFlags: SHADER_REQUIRES_FLAGS, - Name: cstring, + Name: LPCSTR, FunctionParameterCount: i32, HasReturn: BOOL, Has10Level9VertexShader: BOOL, @@ -3553,8 +3554,8 @@ FUNCTION_DESC :: struct { } PARAMETER_DESC :: struct { - Name: cstring, - SemanticName: cstring, + Name: LPCSTR, + SemanticName: LPCSTR, Type: SHADER_VARIABLE_TYPE, Class: SHADER_VARIABLE_CLASS, Rows: u32, @@ -3576,8 +3577,8 @@ IShaderReflectionType :: struct { IShaderReflectionType_VTable :: struct { GetDesc: proc "system" (this: ^IShaderReflectionType, pDesc: ^SHADER_TYPE_DESC) -> HRESULT, GetMemberTypeByIndex: proc "system" (this: ^IShaderReflectionType, Index: u32) -> ^IShaderReflectionType, - GetMemberTypeByName: proc "system" (this: ^IShaderReflectionType, Name: cstring) -> ^IShaderReflectionType, - GetMemberTypeName: proc "system" (this: ^IShaderReflectionType, Index: u32) -> cstring, + GetMemberTypeByName: proc "system" (this: ^IShaderReflectionType, Name: LPCSTR) -> ^IShaderReflectionType, + GetMemberTypeName: proc "system" (this: ^IShaderReflectionType, Index: u32) -> LPCSTR, IsEqual: proc "system" (this: ^IShaderReflectionType, pType: ^IShaderReflectionType) -> HRESULT, GetSubType: proc "system" (this: ^IShaderReflectionType) -> ^IShaderReflectionType, GetBaseClass: proc "system" (this: ^IShaderReflectionType) -> ^IShaderReflectionType, @@ -3607,7 +3608,7 @@ IShaderReflectionConstantBuffer :: struct { IShaderReflectionConstantBuffer_VTable :: struct { GetDesc: proc "system" (this: ^IShaderReflectionConstantBuffer, pDesc: ^SHADER_BUFFER_DESC) -> HRESULT, GetVariableByIndex: proc "system" (this: ^IShaderReflectionConstantBuffer, Index: u32) -> ^IShaderReflectionVariable, - GetVariableByName: proc "system" (this: ^IShaderReflectionConstantBuffer, Name: cstring) -> ^IShaderReflectionVariable, + GetVariableByName: proc "system" (this: ^IShaderReflectionConstantBuffer, Name: LPCSTR) -> ^IShaderReflectionVariable, } @@ -3621,13 +3622,13 @@ IShaderReflection_VTable :: struct { using iunknown_vtable: IUnknown_VTable, GetDesc: proc "system" (this: ^IShaderReflection, pDesc: ^SHADER_DESC) -> HRESULT, GetConstantBufferByIndex: proc "system" (this: ^IShaderReflection, Index: u32) -> ^IShaderReflectionConstantBuffer, - GetConstantBufferByName: proc "system" (this: ^IShaderReflection, Name: cstring) -> ^IShaderReflectionConstantBuffer, + GetConstantBufferByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR) -> ^IShaderReflectionConstantBuffer, GetResourceBindingDesc: proc "system" (this: ^IShaderReflection, ResourceIndex: u32, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetInputParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, GetOutputParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, GetPatchConstantParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, - GetVariableByName: proc "system" (this: ^IShaderReflection, Name: cstring) -> ^IShaderReflectionVariable, - GetResourceBindingDescByName: proc "system" (this: ^IShaderReflection, Name: cstring, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, + GetVariableByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR) -> ^IShaderReflectionVariable, + GetResourceBindingDescByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetMovInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, GetMovcInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, GetConversionInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, @@ -3661,10 +3662,10 @@ IFunctionReflection :: struct { IFunctionReflection_VTable :: struct { GetDesc: proc "system" (this: ^IFunctionReflection, pDesc: ^FUNCTION_DESC) -> HRESULT, GetConstantBufferByIndex: proc "system" (this: ^IFunctionReflection, BufferIndex: u32) -> ^IShaderReflectionConstantBuffer, - GetConstantBufferByName: proc "system" (this: ^IFunctionReflection, Name: cstring) -> ^IShaderReflectionConstantBuffer, + GetConstantBufferByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR) -> ^IShaderReflectionConstantBuffer, GetResourceBindingDesc: proc "system" (this: ^IFunctionReflection, ResourceIndex: u32, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, - GetVariableByName: proc "system" (this: ^IFunctionReflection, Name: cstring) -> ^IShaderReflectionVariable, - GetResourceBindingDescByName: proc "system" (this: ^IFunctionReflection, Name: cstring, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, + GetVariableByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR) -> ^IShaderReflectionVariable, + GetResourceBindingDescByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetFunctionParameter: proc "system" (this: ^IFunctionReflection, ParameterIndex: i32) -> ^IFunctionParameterReflection, } @@ -3691,7 +3692,7 @@ IFunctionLinkingGraph_VTable :: struct { CreateModuleInstance: proc "system" (this: ^IFunctionLinkingGraph, ppModuleInstance: ^^IModuleInstance, ppErrorBuffer: ^^IBlob) -> HRESULT, SetInputSignature: proc "system" (this: ^IFunctionLinkingGraph, pInputParameters: [^]PARAMETER_DESC, cInputParameters: u32, ppInputNode: ^^ILinkingNode) -> HRESULT, SetOutputSignature: proc "system" (this: ^IFunctionLinkingGraph, pOutputParameters: [^]PARAMETER_DESC, cOutputParameters: u32, ppOutputNode: ^^ILinkingNode) -> HRESULT, - CallFunction: proc "system" (this: ^IFunctionLinkingGraph, pModuleInstanceNamespace: cstring, pModuleWithFunctionPrototype: ^IModule, pFunctionName: cstring, ppCallNode: ^^ILinkingNode) -> HRESULT, + CallFunction: proc "system" (this: ^IFunctionLinkingGraph, pModuleInstanceNamespace: LPCSTR, pModuleWithFunctionPrototype: ^IModule, pFunctionName: LPCSTR, ppCallNode: ^^ILinkingNode) -> HRESULT, PassValue: proc "system" (this: ^IFunctionLinkingGraph, pSrcNode: ^ILinkingNode, SrcParameterIndex: i32, pDstNode: ^ILinkingNode, DstParameterIndex: i32) -> HRESULT, PassValueWithSwizzle: proc "system" (this: ^IFunctionLinkingGraph, pSrcNode: ^ILinkingNode, SrcParameterIndex: i32, pSrcSwizzle: ^u8, pDstNode: ^ILinkingNode, DstParameterIndex: i32, pDstSwizzle: ^u8) -> HRESULT, GetLastError: proc "system" (this: ^IFunctionLinkingGraph, ppErrorBuffer: ^^IBlob) -> HRESULT, @@ -3814,8 +3815,8 @@ IInfoQueue_VTable :: struct { PushRetrievalFilter: proc "system" (this: ^IInfoQueue, pFilter: ^INFO_QUEUE_FILTER) -> HRESULT, PopRetrievalFilter: proc "system" (this: ^IInfoQueue), GetRetrievalFilterStackSize: proc "system" (this: ^IInfoQueue) -> u64, - AddMessage: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: cstring) -> HRESULT, - AddApplicationMessage: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, pDescription: cstring) -> HRESULT, + AddMessage: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: LPCSTR) -> HRESULT, + AddApplicationMessage: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, pDescription: LPCSTR) -> HRESULT, SetBreakOnCategory: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, bEnable: BOOL) -> HRESULT, SetBreakOnSeverity: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, bEnable: BOOL) -> HRESULT, SetBreakOnID: proc "system" (this: ^IInfoQueue, ID: MESSAGE_ID, bEnable: BOOL) -> HRESULT, diff --git a/vendor/directx/d3d12/d3d12.odin b/vendor/directx/d3d12/d3d12.odin index a0e020d1a..efa323733 100644 --- a/vendor/directx/d3d12/d3d12.odin +++ b/vendor/directx/d3d12/d3d12.odin @@ -23,6 +23,7 @@ BOOL :: dxgi.BOOL RECT :: dxgi.RECT +LPCSTR :: win32.LPCSTR LPCWSTR :: win32.LPCWSTR IModuleInstance :: d3d_compiler.ID3D11ModuleInstance @@ -467,7 +468,7 @@ INPUT_CLASSIFICATION :: enum i32 { } INPUT_ELEMENT_DESC :: struct { - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, Format: dxgi.FORMAT, InputSlot: u32, @@ -489,7 +490,7 @@ CULL_MODE :: enum i32 { SO_DECLARATION_ENTRY :: struct { Stream: u32, - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, StartComponent: u8, ComponentCount: u8, @@ -3153,13 +3154,13 @@ EXISTING_COLLECTION_DESC :: struct { SUBOBJECT_TO_EXPORTS_ASSOCIATION :: struct { pSubobjectToAssociate: ^STATE_SUBOBJECT, NumExports: u32, - pExports: [^]cstring16 `fmt:"v,NumExports"`, + pExports: [^]LPCWSTR `fmt:"v,NumExports"`, } DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION :: struct { - SubobjectToAssociate: cstring16, + SubobjectToAssociate: LPCWSTR, NumExports: u32, - pExports: [^]cstring16 `fmt:"v,NumExports"`, + pExports: [^]LPCWSTR `fmt:"v,NumExports"`, } HIT_GROUP_TYPE :: enum i32 { @@ -3168,11 +3169,11 @@ HIT_GROUP_TYPE :: enum i32 { } HIT_GROUP_DESC :: struct { - HitGroupExport: cstring16, + HitGroupExport: LPCWSTR, Type: HIT_GROUP_TYPE, - AnyHitShaderImport: cstring16, - ClosestHitShaderImport: cstring16, - IntersectionShaderImport: cstring16, + AnyHitShaderImport: LPCWSTR, + ClosestHitShaderImport: LPCWSTR, + IntersectionShaderImport: LPCWSTR, } RAYTRACING_SHADER_CONFIG :: struct { @@ -5222,8 +5223,8 @@ IInfoQueue_VTable :: struct { PushRetrievalFilter: proc "system" (this: ^IInfoQueue, pFilter: ^INFO_QUEUE_FILTER) -> HRESULT, PopRetrievalFilter: proc "system" (this: ^IInfoQueue), GetRetrievalFilterStackSize: proc "system" (this: ^IInfoQueue) -> u32, - AddMessage: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: cstring) -> HRESULT, - AddApplicationMessage: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, pDescription: cstring) -> HRESULT, + AddMessage: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: LPCSTR) -> HRESULT, + AddApplicationMessage: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, pDescription: LPCSTR) -> HRESULT, SetBreakOnCategory: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, bEnable: BOOL) -> HRESULT, SetBreakOnSeverity: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, bEnable: BOOL) -> HRESULT, SetBreakOnID: proc "system" (this: ^IInfoQueue, ID: MESSAGE_ID, bEnable: BOOL) -> HRESULT, @@ -5239,7 +5240,7 @@ MESSAGE_CALLBACK_FLAG :: enum { IGNORE_FILTERS = 0, } -PFN_MESSAGE_CALLBACK :: #type proc "c" (Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: cstring, pContext: rawptr) +PFN_MESSAGE_CALLBACK :: #type proc "c" (Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: LPCSTR, pContext: rawptr) IInfoQueue1_UUID_STRING :: "2852dd88-b484-4c0c-b6b1-67168500e600" IInfoQueue1_UUID := &IID{0x2852dd88, 0xb484, 0x4c0c, {0xb6, 0xb1, 0x67, 0x16, 0x85, 0x00, 0xe6, 0x00}} @@ -5262,7 +5263,7 @@ ISDKConfiguration :: struct #raw_union { } ISDKConfiguration_VTable :: struct { using iunknown_vtable: IUnknown_VTable, - SetSDKVersion: proc "system" (this: ^ISDKConfiguration, SDKVersion: u32, SDKPath: cstring) -> HRESULT, + SetSDKVersion: proc "system" (this: ^ISDKConfiguration, SDKVersion: u32, SDKPath: LPCSTR) -> HRESULT, } @@ -5361,7 +5362,7 @@ shver_get_minor :: proc "contextless" (version: u32) -> u8 { } SIGNATURE_PARAMETER_DESC :: struct { - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, Register: u32, SystemValueType: NAME, @@ -5375,7 +5376,7 @@ SIGNATURE_PARAMETER_DESC :: struct { } SHADER_BUFFER_DESC :: struct { - Name: cstring, + Name: LPCSTR, Type: CBUFFER_TYPE, Variables: u32, Size: u32, @@ -5383,7 +5384,7 @@ SHADER_BUFFER_DESC :: struct { } SHADER_VARIABLE_DESC :: struct { - Name: cstring, + Name: LPCSTR, StartOffset: u32, Size: u32, uFlags: u32, @@ -5402,12 +5403,12 @@ SHADER_TYPE_DESC :: struct { Elements: u32, Members: u32, Offset: u32, - Name: cstring, + Name: LPCSTR, } SHADER_DESC :: struct { Version: u32, - Creator: cstring, + Creator: LPCSTR, Flags: u32, ConstantBuffers: u32, @@ -5450,7 +5451,7 @@ SHADER_DESC :: struct { } SHADER_INPUT_BIND_DESC :: struct { - Name: cstring, + Name: LPCSTR, Type: SHADER_INPUT_TYPE, BindPoint: u32, BindCount: u32, @@ -5497,14 +5498,14 @@ SHADER_REQUIRES :: enum u64 { } LIBRARY_DESC :: struct { - Creator: cstring, + Creator: LPCSTR, Flags: u32, FunctionCount: u32, } FUNCTION_DESC :: struct { Version: u32, - Creator: cstring, + Creator: LPCSTR, Flags: u32, ConstantBuffers: u32, @@ -5534,7 +5535,7 @@ FUNCTION_DESC :: struct { MinFeatureLevel: FEATURE_LEVEL, RequiredFeatureFlags: u64, - Name: cstring, + Name: LPCSTR, FunctionParameterCount: i32, HasReturn: BOOL, Has10Level9VertexShader: BOOL, @@ -5542,8 +5543,8 @@ FUNCTION_DESC :: struct { } PARAMETER_DESC :: struct { - Name: cstring, - SemanticName: cstring, + Name: LPCSTR, + SemanticName: LPCSTR, Type: SHADER_VARIABLE_TYPE, Class: SHADER_VARIABLE_CLASS, Rows: u32, @@ -5565,8 +5566,8 @@ IShaderReflectionType :: struct { IShaderReflectionType_VTable :: struct { GetDesc: proc "system" (this: ^IShaderReflectionType, pDesc: ^SHADER_TYPE_DESC) -> HRESULT, GetMemberTypeByIndex: proc "system" (this: ^IShaderReflectionType, Index: u32) -> ^IShaderReflectionType, - GetMemberTypeByName: proc "system" (this: ^IShaderReflectionType, Name: cstring) -> ^IShaderReflectionType, - GetMemberTypeName: proc "system" (this: ^IShaderReflectionType, Index: u32) -> cstring, + GetMemberTypeByName: proc "system" (this: ^IShaderReflectionType, Name: LPCSTR) -> ^IShaderReflectionType, + GetMemberTypeName: proc "system" (this: ^IShaderReflectionType, Index: u32) -> LPCSTR, IsEqual: proc "system" (this: ^IShaderReflectionType, pType: ^IShaderReflectionType) -> HRESULT, GetSubType: proc "system" (this: ^IShaderReflectionType) -> ^IShaderReflectionType, GetBaseClass: proc "system" (this: ^IShaderReflectionType) -> ^IShaderReflectionType, @@ -5596,7 +5597,7 @@ IShaderReflectionConstantBuffer :: struct { IShaderReflectionConstantBuffer_VTable :: struct { GetDesc: proc "system" (this: ^IShaderReflectionConstantBuffer, pDesc: ^SHADER_BUFFER_DESC) -> HRESULT, GetVariableByIndex: proc "system" (this: ^IShaderReflectionConstantBuffer, Index: u32) -> ^IShaderReflectionVariable, - GetVariableByName: proc "system" (this: ^IShaderReflectionConstantBuffer, Name: cstring) -> ^IShaderReflectionVariable, + GetVariableByName: proc "system" (this: ^IShaderReflectionConstantBuffer, Name: LPCSTR) -> ^IShaderReflectionVariable, } IShaderReflection_UUID_STRING :: "5A58797D-A72C-478D-8BA2-EFC6B0EFE88E" @@ -5609,13 +5610,13 @@ IShaderReflection_VTable :: struct { using iunknown_vtable: IUnknown_VTable, GetDesc: proc "system" (this: ^IShaderReflection, pDesc: ^SHADER_DESC) -> HRESULT, GetConstantBufferByIndex: proc "system" (this: ^IShaderReflection, Index: u32) -> ^IShaderReflectionConstantBuffer, - GetConstantBufferByName: proc "system" (this: ^IShaderReflection, Name: cstring) -> ^IShaderReflectionConstantBuffer, + GetConstantBufferByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR) -> ^IShaderReflectionConstantBuffer, GetResourceBindingDesc: proc "system" (this: ^IShaderReflection, ResourceIndex: u32, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetInputParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, GetOutputParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, GetPatchConstantParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, - GetVariableByName: proc "system" (this: ^IShaderReflection, Name: cstring) -> ^IShaderReflectionVariable, - GetResourceBindingDescByName: proc "system" (this: ^IShaderReflection, Name: cstring, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, + GetVariableByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR) -> ^IShaderReflectionVariable, + GetResourceBindingDescByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetMovInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, GetMovcInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, GetConversionInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, @@ -5648,10 +5649,10 @@ IFunctionReflection :: struct { IFunctionReflection_VTable :: struct { GetDesc: proc "system" (this: ^IFunctionReflection, pDesc: ^FUNCTION_DESC) -> HRESULT, GetConstantBufferByIndex: proc "system" (this: ^IFunctionReflection, BufferIndex: u32) -> ^IShaderReflectionConstantBuffer, - GetConstantBufferByName: proc "system" (this: ^IFunctionReflection, Name: cstring) -> ^IShaderReflectionConstantBuffer, + GetConstantBufferByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR) -> ^IShaderReflectionConstantBuffer, GetResourceBindingDesc: proc "system" (this: ^IFunctionReflection, ResourceIndex: u32, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, - GetVariableByName: proc "system" (this: ^IFunctionReflection, Name: cstring) -> ^IShaderReflectionVariable, - GetResourceBindingDescByName: proc "system" (this: ^IFunctionReflection, Name: cstring, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, + GetVariableByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR) -> ^IShaderReflectionVariable, + GetResourceBindingDescByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetFunctionParameter: proc "system" (this: ^IFunctionReflection, ParameterIndex: i32) -> ^IFunctionParameterReflection, } diff --git a/vendor/directx/d3d_compiler/d3d_compiler.odin b/vendor/directx/d3d_compiler/d3d_compiler.odin index 6f9f3fe89..17a835f23 100644 --- a/vendor/directx/d3d_compiler/d3d_compiler.odin +++ b/vendor/directx/d3d_compiler/d3d_compiler.odin @@ -2,6 +2,7 @@ package directx_d3d_compiler foreign import d3dcompiler "d3dcompiler_47.lib" +import win32 "core:sys/windows" D3DCOMPILER_DLL_A :: "d3dcompiler_47.dll" COMPILER_VERSION :: 47 @@ -16,19 +17,22 @@ HRESULT :: dxgi.HRESULT IUnknown :: dxgi.IUnknown IUnknown_VTable :: dxgi.IUnknown_VTable +LPCSTR :: win32.LPCSTR +LPCWSTR :: win32.LPCWSTR + @(default_calling_convention="system", link_prefix="D3D") foreign d3dcompiler { - ReadFileToBlob :: proc(pFileName: [^]u16, ppContents: ^^ID3DBlob) -> HRESULT --- - WriteBlobToFile :: proc(pBlob: ^ID3DBlob, pFileName: [^]u16, bOverwrite: BOOL) -> HRESULT --- - Compile :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: cstring, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: cstring, pTarget: cstring, Flags1: u32, Flags2: u32, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- - Compile2 :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: cstring, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: cstring, pTarget: cstring, Flags1: u32, Flags2: u32, SecondaryDataFlags: u32, pSecondaryData: rawptr, SecondaryDataSize: SIZE_T, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- - CompileFromFile :: proc(pFileName: [^]u16, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: cstring, pTarget: cstring, Flags1: u32, Flags2: u32, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- - Preprocess :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: cstring, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, ppCodeText: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- + ReadFileToBlob :: proc(pFileName: LPCWSTR, ppContents: ^^ID3DBlob) -> HRESULT --- + WriteBlobToFile :: proc(pBlob: ^ID3DBlob, pFileName: LPCWSTR, bOverwrite: BOOL) -> HRESULT --- + Compile :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: LPCSTR, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: LPCSTR, pTarget: LPCSTR, Flags1: u32, Flags2: u32, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- + Compile2 :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: LPCSTR, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: LPCSTR, pTarget: LPCSTR, Flags1: u32, Flags2: u32, SecondaryDataFlags: u32, pSecondaryData: rawptr, SecondaryDataSize: SIZE_T, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- + CompileFromFile :: proc(pFileName: LPCWSTR, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: LPCSTR, pTarget: LPCSTR, Flags1: u32, Flags2: u32, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- + Preprocess :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: LPCSTR, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, ppCodeText: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- GetDebugInfo :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, ppDebugInfo: ^^ID3DBlob) -> HRESULT --- Reflect :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pInterface: ^IID, ppReflector: ^rawptr) -> HRESULT --- ReflectLibrary :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, riid: ^IID, ppReflector: ^rawptr) -> HRESULT --- - Disassemble :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: cstring, ppDisassembly: ^^ID3DBlob) -> HRESULT --- - DisassembleRegion :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: cstring, StartByteOffset: SIZE_T, NumInsts: SIZE_T, pFinishByteOffset: ^SIZE_T, ppDisassembly: ^^ID3DBlob) -> HRESULT --- + Disassemble :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: LPCSTR, ppDisassembly: ^^ID3DBlob) -> HRESULT --- + DisassembleRegion :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: LPCSTR, StartByteOffset: SIZE_T, NumInsts: SIZE_T, pFinishByteOffset: ^SIZE_T, ppDisassembly: ^^ID3DBlob) -> HRESULT --- CreateLinker :: proc(ppLinker: ^^ID3D11Linker) -> HRESULT --- LoadModule :: proc(pSrcData: rawptr, cbSrcDataSize: SIZE_T, ppModule: ^^ID3D11Module) -> HRESULT --- GetTraceInstructionOffsets :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, StartInstIndex: SIZE_T, NumInsts: SIZE_T, pOffsets: ^SIZE_T, pTotalInsts: ^SIZE_T) -> HRESULT --- @@ -113,8 +117,8 @@ GET_INST_OFFSETS_INCLUDE_NON_EXECUTABLE :: 0x00000001 COMPRESS_SHADER_KEEP_ALL_PARTS :: 0x00000001 SHADER_MACRO :: struct { - Name: cstring, - Definition: cstring, + Name: LPCSTR, + Definition: LPCSTR, } ID3D10Blob_UUID_STRING :: "8BA5FB08-5195-40E2-AC58-0D989C3A0102" @@ -146,7 +150,7 @@ ID3DInclude :: struct { vtable: ^ID3DInclude_VTable, } ID3DInclude_VTable :: struct { - Open: proc "system" (this: ^ID3DInclude, IncludeType: INCLUDE_TYPE, pFileName: cstring, pParentData: rawptr, ppData: ^rawptr, pBytes: ^u32) -> HRESULT, + Open: proc "system" (this: ^ID3DInclude, IncludeType: INCLUDE_TYPE, pFileName: LPCSTR, pParentData: rawptr, ppData: ^rawptr, pBytes: ^u32) -> HRESULT, Close: proc "system" (this: ^ID3DInclude, pData: rawptr) -> HRESULT, } @@ -160,7 +164,7 @@ ID3D11Module :: struct #raw_union { } ID3D11Module_VTable :: struct { using iunknown_vtable: IUnknown_VTable, - CreateInstance: proc "system" (this: ^ID3D11Module, pNamespace: cstring, ppModuleInstance: ^^ID3D11ModuleInstance) -> HRESULT, + CreateInstance: proc "system" (this: ^ID3D11Module, pNamespace: LPCSTR, ppModuleInstance: ^^ID3D11ModuleInstance) -> HRESULT, } @@ -171,15 +175,15 @@ ID3D11ModuleInstance :: struct #raw_union { ID3D11ModuleInstance_VTable :: struct { using iunknown_vtable: IUnknown_VTable, BindConstantBuffer: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, cbDstOffset: u32) -> HRESULT, - BindConstantBufferByName: proc "system" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, cbDstOffset: u32) -> HRESULT, + BindConstantBufferByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, cbDstOffset: u32) -> HRESULT, BindResource: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, - BindResourceByName: proc "system" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, uCount: u32) -> HRESULT, + BindResourceByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, BindSampler: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, - BindSamplerByName: proc "system" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, uCount: u32) -> HRESULT, + BindSamplerByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, BindUnorderedAccessView: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, - BindUnorderedAccessViewByName: proc "system" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, uCount: u32) -> HRESULT, + BindUnorderedAccessViewByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, BindResourceAsUnorderedAccessView: proc "system" (this: ^ID3D11ModuleInstance, uSrcSrvSlot: u32, uDstUavSlot: u32, uCount: u32) -> HRESULT, - BindResourceAsUnorderedAccessViewByName: proc "system" (this: ^ID3D11ModuleInstance, pSrvName: cstring, uDstUavSlot: u32, uCount: u32) -> HRESULT, + BindResourceAsUnorderedAccessViewByName: proc "system" (this: ^ID3D11ModuleInstance, pSrvName: LPCSTR, uDstUavSlot: u32, uCount: u32) -> HRESULT, } @@ -189,15 +193,15 @@ ID3D11Linker :: struct #raw_union { } ID3D11Linker_VTable :: struct { using iunknown_vtable: IUnknown_VTable, - Link: proc "system" (this: ^ID3D11Linker, pEntry: ^ID3D11ModuleInstance, pEntryName: cstring, pTargetName: cstring, uFlags: u32, ppShaderBlob: ^^ID3DBlob, ppErrorBuffer: ^^ID3DBlob) -> HRESULT, + Link: proc "system" (this: ^ID3D11Linker, pEntry: ^ID3D11ModuleInstance, pEntryName: LPCSTR, pTargetName: LPCSTR, uFlags: u32, ppShaderBlob: ^^ID3DBlob, ppErrorBuffer: ^^ID3DBlob) -> HRESULT, UseLibrary: proc "system" (this: ^ID3D11Linker, pLibraryMI: ^ID3D11ModuleInstance) -> HRESULT, AddClipPlaneFromCBuffer: proc "system" (this: ^ID3D11Linker, uCBufferSlot: u32, uCBufferEntry: u32) -> HRESULT, } -pD3DCompile :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: cstring, a3: ^SHADER_MACRO, a4: ^ID3DInclude, a5: cstring, a6: cstring, a7: u32, a8: u32, a9: ^^ID3DBlob, a10: ^^ID3DBlob) -> HRESULT -pD3DPreprocess :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: cstring, a3: ^SHADER_MACRO, a4: ^ID3DInclude, a5: ^^ID3DBlob, a6: ^^ID3DBlob) -> HRESULT -pD3DDisassemble :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: u32, a3: cstring, a4: ^^ID3DBlob) -> HRESULT +pD3DCompile :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: LPCSTR, a3: ^SHADER_MACRO, a4: ^ID3DInclude, a5: LPCSTR, a6: LPCSTR, a7: u32, a8: u32, a9: ^^ID3DBlob, a10: ^^ID3DBlob) -> HRESULT +pD3DPreprocess :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: LPCSTR, a3: ^SHADER_MACRO, a4: ^ID3DInclude, a5: ^^ID3DBlob, a6: ^^ID3DBlob) -> HRESULT +pD3DDisassemble :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: u32, a3: LPCSTR, a4: ^^ID3DBlob) -> HRESULT D3DCOMPILER_STRIP_FLAGS :: distinct bit_set[D3DCOMPILER_STRIP_FLAG; u32] D3DCOMPILER_STRIP_FLAG :: enum u32 { From ed52393c7c4b13781574416da8dbb47398b0abf3 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 2 Jan 2026 13:48:23 -0500 Subject: [PATCH 143/766] [vendor/sdl3] update to sdl 3.4.0 [vendor/sdl3] updated lib files [vendor/sdl3] typo [vendor/sdl3] typo [vendor/sdl3] spacing [vendor/sdl3] whitespace [vendor/sdl3] whitespace --- vendor/sdl3/SDL3.dll | Bin 2462720 -> 2788352 bytes vendor/sdl3/SDL3.lib | Bin 269054 -> 283572 bytes vendor/sdl3/include/SDL.h | 3 +- vendor/sdl3/include/SDL_assert.h | 47 +- vendor/sdl3/include/SDL_atomic.h | 18 + vendor/sdl3/include/SDL_audio.h | 179 +++++++- vendor/sdl3/include/SDL_begin_code.h | 75 +++- vendor/sdl3/include/SDL_camera.h | 28 +- vendor/sdl3/include/SDL_clipboard.h | 36 +- vendor/sdl3/include/SDL_cpuinfo.h | 21 + vendor/sdl3/include/SDL_dialog.h | 10 +- vendor/sdl3/include/SDL_dlopennote.h | 234 ++++++++++ vendor/sdl3/include/SDL_endian.h | 8 +- vendor/sdl3/include/SDL_events.h | 91 +++- vendor/sdl3/include/SDL_filesystem.h | 37 +- vendor/sdl3/include/SDL_gamepad.h | 171 +++++++- vendor/sdl3/include/SDL_gpu.h | 475 +++++++++++++++++--- vendor/sdl3/include/SDL_haptic.h | 72 +-- vendor/sdl3/include/SDL_hidapi.h | 19 + vendor/sdl3/include/SDL_hints.h | 405 +++++++++++++++-- vendor/sdl3/include/SDL_init.h | 2 +- vendor/sdl3/include/SDL_intrin.h | 7 +- vendor/sdl3/include/SDL_iostream.h | 149 ++++--- vendor/sdl3/include/SDL_joystick.h | 187 +++++++- vendor/sdl3/include/SDL_keyboard.h | 3 +- vendor/sdl3/include/SDL_keycode.h | 8 +- vendor/sdl3/include/SDL_log.h | 4 +- vendor/sdl3/include/SDL_main.h | 48 +- vendor/sdl3/include/SDL_mouse.h | 144 +++++- vendor/sdl3/include/SDL_mutex.h | 8 +- vendor/sdl3/include/SDL_pen.h | 95 +++- vendor/sdl3/include/SDL_pixels.h | 12 +- vendor/sdl3/include/SDL_platform_defines.h | 27 +- vendor/sdl3/include/SDL_power.h | 4 +- vendor/sdl3/include/SDL_process.h | 11 + vendor/sdl3/include/SDL_properties.h | 31 +- vendor/sdl3/include/SDL_rect.h | 17 +- vendor/sdl3/include/SDL_render.h | 481 ++++++++++++++++++--- vendor/sdl3/include/SDL_revision.h | 39 +- vendor/sdl3/include/SDL_scancode.h | 2 +- vendor/sdl3/include/SDL_sensor.h | 3 +- vendor/sdl3/include/SDL_stdinc.h | 73 +++- vendor/sdl3/include/SDL_storage.h | 4 + vendor/sdl3/include/SDL_surface.h | 300 +++++++++++-- vendor/sdl3/include/SDL_system.h | 4 +- vendor/sdl3/include/SDL_test_common.h | 4 + vendor/sdl3/include/SDL_test_compare.h | 1 + vendor/sdl3/include/SDL_test_log.h | 8 + vendor/sdl3/include/SDL_thread.h | 3 +- vendor/sdl3/include/SDL_timer.h | 12 +- vendor/sdl3/include/SDL_version.h | 13 +- vendor/sdl3/include/SDL_video.h | 253 +++++++++-- vendor/sdl3/include/SDL_vulkan.h | 6 +- vendor/sdl3/sdl3_atomic.odin | 3 +- vendor/sdl3/sdl3_audio.odin | 11 +- vendor/sdl3/sdl3_camera.odin | 10 +- vendor/sdl3/sdl3_cpuinfo.odin | 3 +- vendor/sdl3/sdl3_events.odin | 65 ++- vendor/sdl3/sdl3_gpu.odin | 57 ++- vendor/sdl3/sdl3_hidapi.odin | 4 +- vendor/sdl3/sdl3_hints.odin | 20 +- vendor/sdl3/sdl3_iostream.odin | 1 + vendor/sdl3/sdl3_mouse.odin | 11 +- vendor/sdl3/sdl3_pen.odin | 29 +- vendor/sdl3/sdl3_pixels.odin | 6 +- vendor/sdl3/sdl3_process.odin | 4 +- vendor/sdl3/sdl3_render.odin | 102 ++++- vendor/sdl3/sdl3_surface.odin | 22 +- vendor/sdl3/sdl3_video.odin | 26 +- 69 files changed, 3659 insertions(+), 607 deletions(-) create mode 100644 vendor/sdl3/include/SDL_dlopennote.h diff --git a/vendor/sdl3/SDL3.dll b/vendor/sdl3/SDL3.dll index 63f5b22ecbe711493313acd305ed1b8dd36b59dd..510825b26ac432445d6b5bc39d54d4bd115132ed 100644 GIT binary patch literal 2788352 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 z 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

QB!lU(ni61Ea8-UuE7RGNuU13nOLIdop`H&)! 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 z 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

    UG0WC@uVt7%zfE9F5 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≠jlop!GhG>Y95XYeBg|p%bhf+e&8CT` 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

    ?XB#vBwqizb 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

    ed4|GR&HPVas(8MMgx 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 z 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

    !=sm1 z6y%U@*BhM^Kx@b$;vFDY_j);jdA*?;X`LOQePJMOT4%>0a7E=S0pfZzFIWKDH}*me zw4=J$_kvF^Xs9jpibt=n#EXfLQYZj)jTtySNrBT7XoDmls7u;?`o%O*dD;vbVu1PA z!2>iT*XjELGHNHQj)+5AcG#PS*#Wu1`Q+FzZ90weTlixPi>;_I=^e?OE`` z62Xahp@ZNgypTt5GF}KFI36!p5uAV*KR{bpA*NNlcn#-tf{uxPaT~!uz|6q#;`ATT z@mjtL&>#TS$PzEEfrco0eINMry8iI!4SfO*7qGjUk2pZW1=5!)Q2{RyQ1~ypnwOEG zn|G-rs0=yvzx&6FTdd&ow+@u@bf5n(>ch(j>MiH)I>F4q0N&93;^OcB|GRmMK{_Dg z9s`hS;xarBJR=4 zssVDM^@$Sh=1KvEQq~s=(?O%-^TEnmZ-Z{VIsKwx8b~XA=o?Z_8^C+L-MrlnJPgf0 z|Ch2D-+s;aVkNk@a-*BK#DRwaG`J>ieCfpsu;A$zE5MO?`h@|gb=Q2v05p&VE~~>q z$qzKq0xp|hu>Ak`A5>0(I&MfdDZ*_!@S5#~JqxISYX0%RM8u=@Kq=P?Cs6W+8e(zy z#r}U_LmWWG8p6Gx;>rQEU)y$d84p8=RyXfyd#L-nkH2Pn@ex$Ocz{gx0GZ1A;tkl% zKVDn@7hTBB$k2VGn|CHu2df8I3uwo|1h5ufh?boYEuhh5J#J8Zfd_Fw>r)Nl4`XwW zNB1w|+ugj5P;*(j55H!65f66>=zhmit`|ulV_OfDaCv0j2PHNS<{KWcK@@O12Ha

    -v&li22ibW)^P^| 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%0Dv^|gw;YFDxAbts`AO_Xd zs>KSRJLMFjRf}VFKq)#mvBXxjSRpwhF)uGQr`T3CMIo&ywa`{I1+}`GD|WOb26)72LZy$L2v{^(+Q+3&r42KfL0z144`{6Q&Q6sOLIzK z5evQ)3H{hXk{_R(lbV=U3TnzQgjz5#1cR`l8937h8=5(R z%8Fn^GlpPeBZ!!>5k$<`h`|ji<^~mWGX{-dfbD^n3vNNKfuXK`&XHgjAmYW@!_m*r z)dw^HgHn#T`3Lzrf|@-r_28;fH5pPMI>V0PgdSfA_KQMEMp0^F3P=O=oXzsYV)z}R zpb8RPq(bhBOiWHrEhqtB7MWj=npe!gkPhvag7oK==Eg&U2Gn9>U_fSr;w~Ly$9?+0hdb)3?Q@tl>Y$6 zH-v~!fYJ|Ov;{;QZjd>IKfw}0CqVfJptJ&1eFKaZgQ^pU&@gi@K*c|ZK*R$?A@l|) zEdZ5gFoTFEKxqeK2p?w72Pi+m1R{O`N>4C_@D-#WG=nsRJ^*z`156xhP=N$Q{sENU zAPM0wkb}?%+s9^{sIM4Jtyu(&8W9(3lct{pCMP>}#?(127kFd(TfN-bnyNGUGCsvjYa zsvjW^Y8){zgcs%Kr7Pr><|d^Ufg19tszLXCL;DSoW|cy2VnIP>UOIyt==|8!yyQxS zB9OO0g-l6)zCunu=+a*X23+zPnduo|k2r(x?@dfeQ7A|(0#&^VkR#p|(m?%=VuqyB zG=`kiJO-$H;vpTMVg_(Iod~*Q8d6UC<(DX==H-{BXDFm3mLw`<<|%-WEeBfyuAi~X zD`*s@LTm(ItqTrUkO44#pl}A+4+<}2aS$IQ&UIbc=Cm!ZE%$Y0TSFda+m9a#Y&$zT zY;ShXwY__5y={-)F5CL7J+=k>=WJ7~@7um9du(gj_t@5L+h1c5`(@?IwSYuv_PzXeS$$V)tN5y4{AN47*=-S#}-|tL##P zYV8;p8tekzHQ4!>ciMfr)N8k=WU}4LbJOfPk`~*AJYH(Id-ig>;7Kd&R zEhoO&9ryljw`?|x{jWMM`_TJ*_Qe^3_L3}O_VrmZ_Fw***snO|ZGZNRkG*AIviK}N;~3=Iv=3=9XH8yFhg85jc4abo&tp8JxSPV+QDWJTWmQz}sk(#1VQj`eq z&|*`UnU|ao${{7G2&Dn3so9_!9N9c<>KGUpK->3B7#JovFfeRzSeN(Pfq_B5k%1w? zk%3`?BLl-0M+SyPpy5PtJPa7Y$i&RT%Er#Y$;HjX%f~MuC?qT*Dkd%=DJ3ltEZ0`_p-9Kv9+^zaCCBZadmU|@bvQb@%8f$2n-4i2@MO6h>VJk ziH(a-fDDhNXJlq&=j7()7Zes1mz0*3S5#J2*VNY4H#9aix3spkcXW1j_w@GlPnbAq z@|3C5rq7r;YxbPE^X4yDxM=Z`rOTGDSh;HTnzifJZ`inL^OmjKw(r=vYxkbL`}Q9= zc-L?y_wGM<_~`MIr_Y|hc=_t}o44=Y zfB5+6^OvvRzW@07>-V3(|Naj&0JV#JGb_MtTn$Ytg;MBw;gEJYN?isT#$|x@rw}y_ zr1XWB_n>k++%e2m0d$t0LUKlFUbcb;s6xq2%&P>I&>=;odC7?-sVNG+!3vHp0nWY( zNuYz@7QyPB{4@pCQbc`+PzSOFGGe2V=LF(7=47Vl zf!qYL8?FxAA_t9Yq*j!q<`riq<)kWPq$Z|-h5$ir1o*-FkRB$uKLhC%q$VPH3KDWq zouKhFP`?MEF1fV0BtKUnIX^WmEi*YYHLs)?6m)P`pliqUH;M{K7#HUz=Hx&<`To{&IgU{K@_N#f+GS{oW$1isOvLxQW;?G#U&53 z7cCVs_y)MTLt_|A>5WKNU{66)j(e!5iT2+0J~QM*}Rg( zbSnje3XoZd^Z-dxKAygw;IT4Lodq%iQJ)m2re=d;0yH`fnjb37Ndc!(&`6mAC{-dV z7tHzvED!RI0`y`CQ~^*o50pQ^uG9dr5*5M|%TmEQKo&x45oCMQGV@X(_U0EsA|^8> zHLnD8OHEO+0xmWbv*MHC=5L85hRe&Np5jO9I z6z(XJ#YM?rpMcwgpx!%}2OZOn2lb$#0x$|RxX;A!AH+St;J^TC-!ieValq(5Yo>g1 zGi-KQzJKkV<%bd;rR-gMLhktjk0tjcVk~1Wi~FqIDf8>LkvsL#!$pi!l1{H z!jJ<#wHD+e1_sBn;M5Y|+z{}9vvWpbQDSmQYEfo!NoH~}XkOZ}EGV@swFs9IQ2q^f z40a6g^i9tNg&l;W02`Vv$t(kvaNy8VNX<(D*DxTP%M*(e3o;oP0vL)I@);Bu92rU( zQW!EBpw$J)T8T|O$&ghD3J|Llic^a~H`=1Qs~9wq3{#229O&&+XvSbO z2R6IOz`#)D0y;k#WMX<^ZYpHWT1rk1Xw6k(ZmK8fo*&30H-kGW9~z1b2yunL($u0# z&%Bbnc@=fo?7BqQc{$eR9cb>?SH|AC4e#zuOO;9+p~jSosq&nzxUEsFQc z2h~=|pm9z}CIQu(zVV@XMfg;JOl4r0%6xB+{?i(_KHDSVlO|^BT}laCDKgE}f4SSe z-fd>$&rZIZSlLf1aar@-b-!hw$I52UALbUL)Q&C<$Ii#qD38nZ;^{$IZah4hPV zD*_&X2C_gV`?AgdsKcS|x2HIxY2ofZ=&BnA2Id<}WhY&^>(`_F;K2WP^?ac9X(06r z9ze#i6&^xp2PnM(N-sd83()wUzP^yDEZF^U;1wsCMXALK;hA|U`Q^n5VVT7xiSUIl zAWK2_;=uG-Dc~w{!735vJLf}^B>W~!m!~peJAuC`oOHl@fUQic)+XNE+E5{6`k46qvF_4zUs zGo+)K3HBBS0jlOewt6`XSti^2H-zdBI;4O;sH znVu{zDax-@Krx5`p&v9ifgumK$V!2MLA4kJAzn#l$Y;o9NMcB2C}v1S%J)G?^(jbY zP=070qPS&X$YUsh)~Kj8Yfwp!dumBoYEf}!J}7gQXXd5GgKljtgA0L-V}PvBh=H#2 zfv$QAPA!RnGGlx}ckVeSmZYZV7iFdv$5g8t7)2msT^I)s1EvH<*E0AqBr@bOK8!m)_Kn864sG#MCzQ%fLG?wp@n0A1AtFH;#982pjfT`A})Bqrq-fogJ) znIP;6T05msP?VpX3K`Hz&d<$F%u7+o0aeq9Md_uWu5>Ym&IqKuV8{^9V1nW*(7J6z zUIED)Ro@8I=g4DP9UrI~rDpn3{a%`rHq=9MIt7I`F==795!fr~j-Y`31~pQxH#1WB#~HF!H`&10b+uT z2eC~JjnWtri*j{~GjqXf8S+xWS%D#^xPl=ku^4o$48xo#nLAxC?)ffVnD9eOVcqx7 zkG338+*Rz}yURH4q}%Imv%nutb+_j@w|;!W9xEJw;<$fF;?~xQ?khK_E0r0{7Vapj zxw`gBhWkFIxznZ^-ApJ3r(sYF7d7Ptdq7LylGI$cqWs)|#3ImmpkHDxBoCxyCg$X) zr-RdRE;vW0W29Y>$3QWhSeELRnUf0A3u+>RghA^sL2Dy0#6h>dy5yvThYM0tQ^3g= zqygMt0WHP^uN-yG&rQimN7T~LeiB^XJ+%bcbbT~eK-OpEWF{3Q7J*kIqU*=z3RF!2 zi6t4}(Tg0=ylFmYeJ6Z^6w)UEbyo`#OCZyn43JD*3|Y&lqkzoO zLC%C^gj5vZ_C09XUc8H^qmRFPybE;o5GVi@Ad#Vv0$xjod`B##9SyZRJ~$)49Hia_ z9Cx5l#Uh`dlagA5PyxCx7u4T|SfN*vSpsSJqlrTn)qvKUxcKNHsZUPKOHKu4K+w83 zm&&}v+{|PJ#{f?S(0!?;MXBI5ejt|wyZ9K#yF~gq`g%IYI|hKR>jMdc{S6Wh@QerV zng9zT5vb`RF;4+BN?Vi(8rTD^i&20^vYtXfPHJLtszO?31*mCKl$x7gmZ|_6r$@J0 zAvLcovnW3gR4yu%B^G6ZDo{OzP*Cy*Yk;lu0tEr29}P-(P>30);bZsxV&xQ42#Zr_D>u0XrzAGB2?pQ%}LMSfL~% zvsj@VJkyY0l95_eo>`o#kX)2loB`@6Du5U9mgGa~7=^t2ay@u?3+*OB2a6aO7y^P^ zgM&kZz~h|}A)Y>rBM zH8aIlwNwE#Y7bf(3L301v{fwtuNpA2RV{#yTp`SL^9%|OVNlQr@$d{*@C;T62=aGw zbn=N*a8z&#byvht9~cT6k;AYZLtTh#kgunoV~D38XhIudpO1fdysxXTe^4YSToB^n zo<2VDu6`k|LGezG&fe}ppoR9}`~mU5i>C{wG?F}$emDOhS3LTWq>=Rd_=DE*#)Fpa zxx0evNL2R)M+S$u`o@QNxca&xR3Y5&?HcLp7=Vxg>4ua)5cfO#cm_E6I|jMLhX%Mf zhCovWLVu8}pNnfye28O^yK6{re2{CfYX}1aMmR%KB4`CLQgmw~`2%VWY*+ze3{H6; z|6owkMUr>%3=Z&djEwgW@^tlsCt6H*q+}L@df=eM1|Bs5ISHEDQgmR+Ed`n^u$b@Y z;^OLpMLfvW*FOv%0f_K{xeFqTDemGL>>c7C5bx{nf;E0%`kh0Af_dw>_!VTL18G$P^_7La(t5o)f7r;CfL zA5u6%#a$x;{Da}ah$#;VMojS_SI{&Lmh=xbH^4K()dxJ)1NSQ^r6a-xs?OIn#L*`{ z%+oa-l$1TApiaS5=jrF^3zx=pkFR3{Uil!`;1K^HsOiZ04dxF2&|p_c!GYbKV0j-` z$1re?#BiURzjJ7Cyt|{PAJ`5Y@~~`#>3(M)|6td6@EYOZ5U>#-XJD%H@C=C$afM_? zNIN4QQf@%~;pyxg5abVOwO=XErpb1SoEV5SSa%GF5o<0QdA1=RHP*$t$!~{ zEiO(?VJJ!kx7)z&VvrN?mk;Gow?K9>flAz>)PhvVhLB=VTQol<6;vQ+r&dB50HvS{ z>un7xR4X9PM~XLZ*U0!#(Dj)hYmvl5Tq8o_U0pmO6*qqOfNrL=1+UTv5AA{)9FQ3q zTUBVuj|dNBbK{*I{aidjwIFnPJlG8&0>6ErRguYwc`2DGi6yDvtuMu?IpEa`@o-^? z)oAvD_XQC)AMPJ$Xd$OhNV1KGCmTqCj<5$^9$GMiEJexBzTg4}mgo@rA>y#agf8yu z9|E2l#~(iE>7!Jk!d5k1p%O$?6s6{X=t>9;^&z@FPN5+o{(jJei#U#NZXgoy5*a1U2k(4cQ#eo<~>4g*74PG&&? zWN8sNWQhz9xD&vAgY?v*_zF;B1?_AEaVkL^$d;$f{5)ILVrb|fyVuJ9H?CFbOSgA*KqDGHE?#K>oGcX~L6 zz>USyj)cZtib4jc{3um`IuoOugPRA9DoB}zCEQ{D#!L$+@s4gDB1NdCXW)_xaA?iheaOZO@#Yk=At+si@qRNU&nv|%z723AFKDU zm=hf0>gXHq;ppe$;|lHaxFDy0n0X=oq0Szl00Ac~Jn>tSUz(gzkeC9>t7(~e>8V8^ zR)wu<8mNFvQvfZ>D=sZcwN*_+?hj$u0}e6FaDlr6mbKC17iLbdt6#8x5Y$Kb@>Owa zUU5FyjiA))|K4@qm!ZX0r&)Fm1$<^Hx)W*Yfe{phR z4kV61E=7)g1p&aCaRk9zgP- zDhU*t3=GlG?OU-BF1GZEt^UU0e@GQp467T`(cJ}&e4_oOfZZOH^bhh6YS{<%3Yfx7 zPssgeXq^VC0)~X3?E^4}h+8-K#6wWR|{sD-cgeDw> zJz(=djbb$W!Q!y&gKj^(Qb98(z(3d%+(1N#LwCJHR+m631MKkxsqab^;Jd-Gw|`K~ zgI6Lr?1OA_Md~sl)Hyr)x&}GML&v9J4#Oo6vj~^GV?aO<(r^({c%jI@r2yVg>h z?hYA42H6A(p8$U!pZH+VsJS1sZ;%J>UxVZ`GE-9H^Gb6IAls!G(uz{^k~2UeNvTD} z3=BD-mCf-vsi4VKke5K_dAmkBg9Z)#13*~_;xg~l%B1|nB6z>6=9Ww)i0?5%U3=9gO zd$w5_7!*MFWV1uXL4E;Y(449f0|NtSlGTKPfx(mkbgwZ3gE<2O1Lz1DOX!9#UIqpR zY0%jT(DRr;lfJs(`}!EbXHJ3Y1JHSVptG*585kJU85kH67(jQ|Gcf2eFfizYEMs6` z08Lnd&JhBsQ(<6WP=%gd20HIYi-CawbSD8Q9b>aE9(;xr14A|RzWN%_9pwxR3|64K z%o!LMKzE7QFfcH{&UkWUU|;}kiUVz&0oCrH0XWcxE6{ua=xiU*B$*cj0|RIx8q@~_ zt&9V;Df~h6FANL}feZ``plK9PjDc!J(Ahy@3=9mQNm$UiL7)i+(0NY8gkMlx>29+?kH{>XeYFbAO@lr6wQQ2Rhx1ep)YF35ZXFbAO@ zloh~2e))N!!Qe!YlUSU=z~ER=kdp~r8W)gX4nHplY7c0yD}$S%F@u|-34@!VDTAA# z8H1alIfI*_1%sQRC4-xh0fU>7A%mNd5rdnNF@u{C#A~h7`(o~wE{vz)0+V-;llY)fsl;+(&EItl;U6{ z3m8CUL2_npVh)-p0|R8CS#o7)UM9FKfboM%lfXhy^FhTv*yT_@JY7Kfpduexz81_u zI#_;s=AQ*plT6?4-H|gaHsf!T{g=l+@tz%#!2`28Q6A)KpL*9-f#D z4e5~0D&0O3O`e9-g z4h#$+esF4H5hxhJN*tXPz|9;-X9Z9h0+L7Zv7@sB*wv2C3PGu9MX8{=8>A7WK0iM@ zH?b%i?8D&vv=UGn0m*?dh!2iKXdee82Ewj+DWI+mxUB>##K5QAnIh5wI5&8wRzjAq zrh?Te_@8)E}o&Fb~8fW4|Fb-PkeBItE)>q zcvcu>AwoXL)yFZ!Gt3oL1vYueLK%n=SmYrKFTnG`$nJOb4fO#{*M>U=1;mGYhIquo zY=pT3JVF}}@eR0d7>ukRB8w~z8c9M`4N(sgM^z0Gho}YjMx7l4K+9l}#bK_A2Rjfp z@`c5J&Y?k|0pc*vU{5FTd15g4L(KQ|3vmSv@PdMYfx#CPzo7gEqR~5-pmu@_Xl@9! zgu%tt%`wy`Bp$jB31SO$zY}O94>+ZO4#LPQ1}zy@D9^~uNmVFH1@(B#QbF^;sh|;n z#AMJyUU2^!dg3G42^yO4gBn5AMQVydeja!=Am~tQr1Qu8@}bMj6hH$7Y5B>e#SGy6 zxZqsHzyLadOQEp_+2W#pF>7vz`dLB~Td#6e}C zb7@g=evv{(eu)A|E&SlkoXk}4Az_($pi@4J!R;xK1%9A`4yXm7m8xJjDyU|Hctb&I z9?CI&p?P_Uxv43j0agY^W+u=zWFY0BaE|x$j}P{A_jB}t&c=ZD%)$2If@c#HGE)>( zQ*;!HQj1f;`{WSo9wGAZqu;>Fk|AfffmMSofu>W?%D{Mkzjz_M?JD85mH-Q&Y386ktvUPgE+Tq{UtLGJOT$f#tv*EL>{yk6eJHmzYa8j3s(V=FNdGLiCsVVWEzkG zD0)E_fELSU=0l9rgF0RhX&)h8$Aj{JYHof}CG6nT%wh%5NF5|x_2A~_f)(kd6{UjP z5xJ@0{qq>|Nr{O17R6mq{Yb$KN*@UQprx|8naO(Ky|EBgDEeXY5OYA@W=PJ@11*|h z$OLVc1MP!?p1%v4SqB#aIts-Zptx5^N<~_ti*%fxr=Mp?Jg86%a&vTc)qwUa`df42 zl=u?dXZ?F+EWWL<*y_ywEjqV-oHl6Izns;6%<;mk%YXZo*SoFVlGEzJoOyi0BVTiS zp;Xt2DV9ej#ko}%UcKQhnS0q|-*hJ>1r9!EgT_b3a(-oQ%~3NfW2_JF{%;iHGk5m} z=dD|Gi=O(eTGDuL-}Wi@o7|S)2w$qEup|G)WTRz%X}3KVRNgP0$IAI#cJ>U3tuv!t zTVz((lsvin2Wee4=(rYz{L&%?z0?YDynq4*n|wi0Y8q_CJj(idJq8BQ*c^&J=(eat z(6lC47i4H680UTl_tX;ay!`S!H}DE~koh3<0!ou|GLsdGGr)(^<|V?<&dkq)ZD<22 zgYT~f)n^bBAOpy7e}MLQrh$zHs|PhyL0c7y6(E8NrATHcfi}vgLN>~QRWmSv8ha@U zpxv3pc$Gqix{5(n0#PO-pPzwnJE-!4?g~&qb_~Q%ASZ!#-ayV$b^)J2oL^KK4&Mw4 z$#?Lv>Ua;wfDq8K{Rq&>svzAA3gRgEwgYJW<8D#~#e;Q8IsV$hj-pj~x((0H^`z^NWmQ7V9jZy*^1ETSXz<~5yxjc zLOmgW6(p8|HiSSd0goS*WhSS>n_bYjRwydXO#*M2f%!iOEC7oQP_qWHF9Y1BL`mWd z3=IGNgU4tf`XSqgKr>+wzLi37X%eI{1wZZH*&K4?iLS+^B>)2egz@K{clo6d3T+6hN&2NYMe_ z=?BfT46x0+*rkg>`yD~s7Zs8b2d69KfKE;aZDCEVNX{uO&MZp>?~4Sh12r^2ZJk`` zNfeIBg{7IG?c~r?_)#ne?RST!lN9Lj%oWg$=|Qlj9n7I1&oeMExaK7$<$xTUm|Rkt zSdtH#BLhhx`vV%;sVUHC1vT|y@dF(P&VdG1ex3qolQPIa3|*k$gS3x9(pbU{WG}qF z0U4u^1uymTP)ihroXleI*bU4bu=W*v5g+(q7eqdW$s-jLVD}*Q2SY1dhytX2!=<1S zCKc*+hM>~CJdpE2JFB2dLC!`}UtE%308`Dt5CqzY1=0XftN?C#f;2-S2((WS9M4c` z&>9r*5KJ&M9zo>`$O0H2k^e!W3=E)Q7?ANuMuH_kgCL*-Ou>CPs9hil==sZ_Or(&J znUYwL2@6=T%kuK`V8XDl2k8Qz|BZ-HNCgAa2;G(ko)HBlRd}p{bVAD+P(gsupHvBU zR!+J}S{lqcSh)b+?_gC>Mw`rK1X zJo8dgD^gS7M#Ah5C<4tB6{n^^4+sH^yA`FTqDg?ogHucVN^`+hK&}ZXhPWd*wZy-) zq@c6}VX?DsyiY!;XB6*}TIQFZk_wuX2aN;xf=)S!4@fLZ%>xzS&JaFSQ9Sf~n@Xr^ z2GIE=?x`gpLo$<71MFr+b*GUPEN zGn9bOFv?>91e&^n1A23LkKFbgEgz~IZ^3Fd_|1cTQ^I5C7Ucrds!_%Vbs zfYv=g_&yA-3@%`uo(#?mpb_2x20w-X1_K6X22=3CzsP*h)TkRnB10xa4nrzK3WEYe z3HWTKbcR%h5(WkE*$q_;sSFAX`3z|c3Je|$o(wJw3gGh_$`~>klEHGI(?d$Yr-Y<2 zBtpe<7%~}(89?!e&HP00iBkCt$>1|aK<0zakjMp}22lwP8_>BB)UyxfA9CEU#sG^E zNIdv~LkOEm#ZZ@n;uRE@pl|_&DCh(gP*_%iLnM_U7rdSZVj2Sje)Gy1G8sUpY$z}k zF{CmSGL$laQWGe&K{kYe<3pbz08E3@R6aOWf#is@oq@rHA(a6Um!#OI&!E8&4376q z22hOpF_eN&L;;;C1Ih_`4Ef+xl*Rya70Ay4;5g41sz`vS0e1>jRi zKqrlW!YBpo7RXGD2l)J^0ET!5cW~+loqtmR&y@_&^PNy#p#b(b=oAx3N{0CX6at`A z%0P4XQDE1APAo%qojy3naQZ4`$N}eFkO?4>M1~YJ zSAk?87;^4aJUDbg>f*sA8Yn-5V!ebx9~z#-*~Y*Ci3b;kcyQVR`7sq7OR)3+ak~Q2 z=`8vTZVbq36u`bH0EZ1Ig&?PJPlkN(i5;L*ct9}(oBf6O1w@i=K12u1e?E9a6MX($ za%zrezAI=lgMon|8=OA!z~?cco?vV@?P1{JChK8S+0haug9cvrtr&sQoG61-OoSB6}k`@G#3eSIg-4Or&DM!c>QFEtB)siXDp^XXkUhNDCoi- z(EVKnIf*5p=`WC3APgHvf^~sF=PV*)DTzw(nn#dY5Ek9+&jMdm!N9=4egTz#@l-B~ zdPw+~fmQP0e$?US4=D1A2T}RV z3Q9W2`k9o`_^POUW`>4lWc3`(9UaJgX^Bb(B~V6#V!jLhEXe#LtUj#B{G(|6Gn}aM z3%F7F0ZkU{$ogBFQTYumsQgAWz5t&P53+t?G`=VrUjdE(4V^E8YMy``DqlhmmCwwS z&xdS3I~t!0jUURu%a5!+4vn9N#&1F6x1;g9(D-xE_zTeZZy9*`!2@Z~_OnxOAUy>bSK1^QrP%hX$kX{g$L*vV%@tx54EDCw7$nF<&w_r!+OQ7-9(D)i? zd^0q@1sdN0jjy&H)xP)pQ29)!QTfbhe2ed>@&ZMnoXGBH*n-OUk!IyamS<(m=R@WT zL-`5N_>qV5E1-N;D1QQ!uMXvJfbtEY{1Z^VF_ixT%6EqHIaWjJdv_>b0m^4&g1E;4 z$`^+6;qHO*VeVmMMpF;v!_0-UjvP= zhsHNU<6EHdEz$T^Xnb2Vz8xCh9*ysW#&1C5Gk!%4A0{+DGa8=-jn9h4XG7yN{6saM z5slA;#%D(3v!L;W;8w*8ea;HKOK$F5Q=IZ zBO0Fxjn9n6XG7!jqVf6A_#9|_0W>~CG^%@;(D=+~e3n>L^}l|h@_(c8|Df^zqVfNs z@u#wUUYF3;ry~{EJL+VEzJV{=SRGe*oq0fXY9H@-IO7ub_OG{9iQwe<&Yj zJ_9$zz7J6StY~~LC|_U=q(0+8;|oFg22gonG`<3q4|9(qln*mc3Cf4r&*){rjvOAA zjQM;ZegM>bYbZYh%C~~@Vd3ctl0p%w{`4gc06excMl%ERapMdhyp!^q5emaydunyuLRwhVz zSU~w~P<{lI?*`?={F?~n!`%nv!`!z3#)s-(2<6X!@)tq*JD~iw!{1s3>%)FIQeg)LLRZu?6J*%O7n0wYh`4v#})w0m_HDXCsskbI)cdAC~^MLisbG_HBdmVd-x#lz#v!zYofXnZF;(hxzXS zln-<7K`0;Q-a}A6%)N)9d{}rKf%0MgKMLi;>^}zO!@}!0ln?XY2`K*o)V(L6e1;8> z_&WvVD?s_D(fDVfd#^*-k^Pus0(fE95e10^(AR1o? zjW3GE7enKVqwyus_>yRRDKtK#10*~hVBrbnCqVh!oe+6g`j84arh*)QT4;PLD8B=$ zUn&$;y;K+)KLU*(iOSbP<4aYd$}=gP&_#9+n;|Nn3ymMdrlNU?jBv3X}hj)}G0Q_UB;oOVId6XyYsOX#8e0J|o)r%MU&w9+dW~ z0P1*%AnSjW{vTU{t1z;9A++%iCba(BIyCn(vY?vJ$c)NgdNN-zK#5HXSX!?n2|=K;tiD`j6T^;DGdhVD{Pb zUl2ofUq4!WGJb`$Phjd98P>3Z&h3Hmnb7!b3U#cY{c_K`H}VCVc_M5A5Ox+ zz|g>$&xfqP5slx1#&1RAw=w4PA)DWhCf|X^?}4gc0j+OWp}ALZ`85S(_Xwf!h0*vT zXnavLz8D%`0*%keaMu{wJ|;9iGaCN`ntOi>GBCgo>0w}CU=+Nk!32sZC}u+Av!e0Y z(D?ra?`gfrUP|S?RXF=n$ zqVa=LON#P!L3d6=FU-n;oU0O%lwYA>Y-XTE56=W0#a&#CrXav2Kmo4C5p<<$ zdQN^h0|Sb9P=0c@f^%YCN+np_)6XjubYz>Wf*a_hrQnjxWZ1Q;*yIC1N0ouhb9Gb* z&QDHGEkbhxC@4VkPKhNYIjN86(S&3D!}aoiNoFRn^;tqnuDSfMII?^ zJp6+^6@qgzb5l{2GX$5UrsjYaDW?`I1eX*gmXsDNxRmBIIOZl+<>x8*l;$O(XaL*o zpND1&10>u*;=w4&5#p{nnI#yykn}<1jZk$%~{biz=5g+B=4IEx(rRdSiv`P7oc9MEo1q<992`?>ij;PMhk9`0`E#9Z*< zQ|RG@W}ZuGPG(tZQECzBCf|^vQqUbyAajt@uOX`Q!TBO2vm`MuEiorY0V7($^1g}1 z#n26hRtk=JDMk6YsVS(*4Xn;1F(+RkJh7-)!3eLv!ZMRfiZUw{0*dm{vkllB-~6JI z#2f|h{M@9(5-je8hl_7!N**YuD>&sqPWneGA3*UHmRgjOm{+3U4nM{XY(8ASb5Uk) zaekgc5aM8SP{9Fa6oJ3ejgQDL(Bfq#r0a-h$ z{Xw7;9zhPo;r^h+veZ0e)6x9rnwykbq~Kqan3tXkavXa404>og2W>z`N+{UW1?5*J z<|qV|78QW^6oQn1{NbIMm!6WJtKgBESX6>mK!fDr;RFtc#Nu3}fJBiGE&$yXP^1u+ znV*viTD^|u52u_`-P}}=H&DaJxhOF&DJK!M;|#?-$HLM?P!Wml-=NeK1!!JDQ6J>2 z0J?t`bT%bi99|Y76*i!A+n{OFJuw$lnT6z+7J&|U$itZq;pU(wM(|m6j*u!0t^_F> zpz>~|#hLke;GBS(_n`9NkSj`5@XSjC?W@F6K7r1}gW3a1@<>*Iq7fXPL9UKIzEuiX zYg*8{PEayItQHN43~)tScM4i(Y76B@fHq$1nMBw!Fl5K4BCHCjEJy`yt^nPmn3P{( zY-Rv1@BQ;q83KZh83KY$7y^PJ2fjhhW(p_*m1n^vsfoFuvn~ycGBP0Balvi|5g<2# zHX{@YZ7w|&%%7Km>0-dl5vK@T>j2>(!o?dcdfgW_nE$CbZ6!DUx%yiII22gp> zR#1lj_3of>h1(BZpzG}K>*VR@8t>%~UY!eGdW%IJ*a4{fF(C#(w~#6%mMCO`wiSU+ znnjgK$t+IJ&&vblwiE@(K{TKphwxjF85p4Zgdv;JbzmkU>jPU4+Ar(l>H^)Fk5^q@ z3Un_zUNb>AaDvZeF9z>?O-&(Sbf|N%u8}VIcnUv99|i_4RXw8=D+MqBxljSL5Zb7M z0oG;(omJz{!oU#60_tfqFyyf^Ff3+cV6b3kVEE6@z>v?!z`)DTz+fT3z;IHKfnl`} z1A~DG14Fh51A~z$1H%(h1_nJb28K>C1_n<_28OlL3=G#47#NPJFfb_TFfg3ZWngHV z0kRo_KQJ>e!0ZFr!OD%WQZ2$)MvqK<5*HqEJD#7<^JOJY9f_gUrO7%&JuAPELrsFw$pkeqMe& z;=EuC`J(hBBxz8-K~49dyT($B;7VNmK(}tWFt~VvuipZn1L)`P2ig(^aR8KbOi4*i zQGoakmdd~v)`WSwfaA`jLPsG0iJg>Fnp%>dUy=bn>IQl{FPL2n-kPVNTC4-ULy!`L))C?453eP#l$-GuPM#qy{vaI;461rY6}q?x&>7B7nI$gy3c+s12B6xP!2-(n zL*)k)6Bv3NgF-=KayGbq^Y0J?1H*BUOR%}q%_q{u(;af; zA;^iy7^DY;QO!>TpFV)RsTVF^SejZ?sQ@|-2y{SkD(J%4w0xv{XF=!3V90{bnL=y} zPs=RI1ve9+xempC4D;bz6o%M{&2c7#2 zVu0y~^1*2VETfIMkWo5I2R3!_Gr+%c*n$`2#6xz=w}{x_}ENP@7W$ zR9=GIV%EFdk%8ftbF#=>7qi~w2a`qS9>JEbpzRBAnT$;y)C_{`*n!tOkje(sCUP!K z0`2q7EP>QQ8k$xL@HB>0*Mx@#=o%PVfa(cQI|ek|;vEku^WtIV#|MS_f{sLV3Uc&@ zRSbU6@&eot2ib+zufvoNPb^Dy$}CDjO54Q>Df!4p-azvmD2#$rlk@XZ6hecY6q3Q) z>(la!6rhd;Yk{|mK&p}Q2g-RD5IGQeCPcy5d+}Ar#a_#n70Mmioc;7u`|iUVJ)2Vh z|NmS*^PS*=kIXOMAM}|v$Kp=t7nTc)FRJeGJ2c62?ydL!LUv#8{JV7bP5b33PJ5?G z73$d@uf5=1E9^eG$YqsUkI91mpL@gpmregWyU}&6>o(WjOVzHGpEId?RC~;|X906)6f8Nnn{L*3N4}C>7 ztMl8>S7xRZW>53${Tcaq#&sti&<1}PX5aw%2o=Y%JO&Rxg2n)$S3#pHpnw<0!oUsE zeilT)umFsKgC-;o)fUGh1U4Ism!K-hr}FvSz+nP2ftulROhpRRLq_4MKy@iUl#1ZbbwK6G3aE_bkH5-nR)3tpgv-92B`B4Iw+1j%7s4P*~gn*M)2#SRGdT zixSHfASoQ=F|ayRe|dPiC_oOZLGlz>oohu&Y946Z0BRHXEHMRD1EUIv`;qKRO)Sc( zQ~;mIjbs}%Um~ePgbS)#uzjfR3NA?mjrKd|=cQ$)mllCj9^8dk)H{LiURChSOUuXM zA5`=G%TkNda`MX+z}Xp73n;iC{zTOWNe7^Fg5a)!`ZFjsIW@B^HANvgCowZOHAS~H z4_xXw`kS4Cjg z7K0AnOG;G$)c~amNtGq3#Ym+z{J>~bdrR{36>{?P(&3eu4!Zv2)YOz>NY#MFpU@%V zV)zl$(25j%dL<~GAv*z-?7(J#2vm2Vn*;Noj)Df*bEzp1cOe@GxiA*h9Gw11tw8e# zsyu zgDhYr&~VAg1b6yi;ZjnRm{**ZS_Bo%8bge-rV=JUV4i|$K zWC{iqX`mqxu>W8Lw2KYtuaj;bxJ>~vD>^vsgfT%&j`?^m+>w^o?)&*AQK@N-F?CNd6mJL6`+eON%gv(LP!xfmJ&gSFhULl zHK;Iv)u>dq4|F&z=)5-QnR4L4_kdtyWcP#5x=kfI^1$b`aJ`UmWMFvYge_fx=EE2m z93b6u1qKBsMg|5(5MW?n=Tt zY@nn3LFed_st;5ULeDcouXlny{Q{uZ?=pCJ_$atLD}?5hfUk=H^8hnl0T%OoeOw)b;z83QA&x%rpqtP={oL_c1ace$1A~vhqf5MtEA)yM z*N_kb+CZ(BV8Y5!%TGw*5f8pu9cphdXzc=)d<#97wIm->KzO>uyZHOLgDxU<1>MaN z7DJ^X!LA?0c-R~z)+wMd7E1>8;y3a8y#x!U%DjKH2=!8gzQ2YG_}^U!6T zpaqQqjxGvr`9%ugKx1IwdLd(N`isxW^cNp!p6svyONBE|^ITk=LHCe?wJNxz!q!<~ zQ||{_F5u_lAMfnr7#!>gE)o1(Q5QOTggK+c8a8tXtj~xK4)+Xk23?d2YBzw^Yr?B8 z$m$ja`07Ij2Kc-NRLU#AQr9^@PXRQK3JOP@@XOg9a`h?CS2Q;GUY7TAYct#0;bzF~3-xT2fj7 zp5MvMPf10HgD%5RfLzg#oS2iD1nIXUn$=HkaKWvo8gk$0xM%Zl$1F$`G0d zA3040jn06VtHFzMP`?>u3urzWpSr}9l%mvPP|zdFM^J^YfG`te6xc=#^S}zBU0cw_ zLkb`PQ2mafIRz;{glA?dfEHyyS8l??5g`s~w)vIjC1;ev*NNj)=L}k6l9`NBcrc*Z z7YdFZ;9PH536`|t) z|D%d?L#274Gy@YOcqT(aQd~^<|Ns9&f&%;^|No2f^6_x9fiyEQFtYsr&+6>&=jZAi z0=mK->_8XKU=$%p)u<4jnP~-ToPd_4Lk{i-4SkeAF6#o{D*^6bLDc!?g9ddK0&+@= z72t*`XcU)#*5Rl^#z~OPMOKe&Ke85N^@uwcAXy%A2U|%#s2Pu}4*87uB*MSxaYL$p+2Z})@8IgHH=KmiCE#1BYJfgeQ$XtHa zGB9v5@G~&T%Kir{hVdB~{xiG=i=Yx0ZbSB8v!V(!+<=P1=C@$d51``E`7VZIDpH^; z#Ti~e#XBSjO{(i2=H3(>)2RzRPO|mJe#mPmP1ts}K zR^YxKXb~Fd{sFK$3^kZj7vN=VpcQlJdHJAgOF(V`VR*Z-AhD=86+Be|8+Jmr5`Iw} z4*NjUh44GAK;}ZQrvrRE$=wKiLo*T|)aOBrH@O>u1{Dx|(8w03PG8Ms|*7@6P=U- z(EUyzwuMegK@n)P1c+m#lTuJx0Ad;Hq?cx1CR|2Oe_s8K`cW{0}~Jp!sg}%20GX`LQySvAOV2z9!lsy z!w&8{V=Tdwn^~M}Xq5yF2!uhK`T7bgHz`znUyl@RD&?m$!!65|qr74(;nx3EmW@rQn0h}Rb0Fj5Ag)PL435FOf zyv$P#Ou^x0X#}P~gt@tap$@!Z2<^zBcEm734V2x;%7&1vh43xDgqCE6CEUQN1fd^) z`bsi~gdR%zf`^tRQbx?k%qy`{40iE>Ec1gOE*=lMBiAW3Bm{f`sgtWuu$8T$4m|yt zBtyb8*#ttv!xJ<(hiEB-!p{&?j2S_TF}j3bBDRc5QurleOKtG{2@XF4)Pf8xf5O5i z)yyCn6gD6XF3$pjO_BNt_5*beXtTG$pVr` zFnkJE0FGzW3Jd1`lvE>d`J0wzXb5sU2!qQL$beQ@W>HCLVh(7;I<+7%1I>%JL=#xKVF+eaS|u9P;qWBX0BF4hHvw9#pj6;Sb-0UJSa_r*8l`~3zyKZ^ zV4i`Fu}e^>i;HUz*g>c@0XRoifa*Oks}fWfLbDN^f|;Le0Wsgu653#Z7;m6s0a@U0 zW&++U3fXCbTK+&&4LIO+6HTE7k)Z*(4J!1K98y?A!_yE_^uWRs+Q35gw~-DkrF_y3xFf`Puu+mO6)v2`7O*BT7$FT4*FaS5BprK;`4<9#Y$OZ^d zN(2|k24sf=D90gON}}(f?I47Hs83*RTMDrLWQOLu&}&2tNZeSg{TXL0I_t8XMp&3=IunofY(~g<8BNL0Xr{nF%8~ znL&y>c=|C%$v8>IptNEF?|m@9+cU8IV`^w%25~ur#O8i&P!6a7^|Fj~!0bv8+eAkf zE^Yx~gT)O&Sq`}j0@X{<&e_2G*9b>>0bchBzF!(zec>oHv=iZ#ux=u#NCjtCD{U~l zw7^O?(Fhi~hUmV96dmxW!l;g+MFU&`Y9UBjzK14XjQBS+#a@0w_m3$UfnpO!SdiE= z#~vK8f{>gel|3Kw&QTrFTvmrGHBKtM}GlZrHi*G zN1bK{dVVrALiGSVJ%AddgU|W!@Q0PBW=7C>K&zjEhlu+PjIh@SVD|?Uo#diqD|0i; zRO+SEfor?aAfb{Ko@t4umQ)B&Y*ozAYXL$NCX~Vwp4i(n(EJWgpN5tONmK|=XgO*K zAHf@jBUZ5Rg^jNm8DJk@35Il_@w5=2vyy{sfCc71So^^+3H$sRY~ziBku&^2Nl+3( zAGn74lEk4-N{cunor1)al$=yUt0Yq>(+ISb2t3$~7|J1I1Qb4}52>LE&JP$G5(q!g zo`Dp!8UDc$h=$W5FiEAS<8ISM(ySxI`>{HiE4_z_OAI zQUJozPg){m{d1Z@S{fuIAf%3Ca!G1(wt}O(moBJe0hQoJI!TCi;j|1C$czNu$^e#R z2nGt4z9u+Oz*)%vz9It_9>yky;B|q`sitV{zb9@WM7k^u_>gW2B#JS10B$% zbBQ^bX{icc`IX?<1ci(lD5aP~QwsVt5u~e)w;O2)>nI~4$`l+?u=s(sH;j$Y>Qj(= z5SKWPxIQ5)e3FtO(PU*!^(dHQ>^)C#H9~-c$kfb2Pl2O zTiGbRH&FWkT;CwgbPe&s13sUPZL}KEU$ZcWC%T%1UvfHr0bztAyI?z&q(fM6ZM5`3=TU-vVPeBB^X?@gvg_1i1H=X0@l7a zMV$|G&P++o&R1~sHn0G%`5WTJE$SIH;KYHL97Jlr8ks>hE?ZbwpoK>z=~u?NT~WdVv--BrZn)r4!hEaU${a#c(aq4Y{aC^58jI1KeVV<%dLL$VMO|qcoHS z$~w-KN%=+T3SoN2&_mEcr__QxNv})+I=uoEG_={1{NfzMAc9gI|t$9(i1vqR# z1T1_^OrZ<&pw%#>G&L~LaY;=B-91wT?(QiBB_^j9DMXlq0tlK4z~_P_4fSbsSTzF+ z4|w|wCAA=j2W&J*9g}@g&;TZ$=smow;(Y^!NSPE z43w8>R^meD7DxyM!k&f|sGv#)3B&vkTfb(IW{kQY1LS|2`W5X^O1i8-0=L7!jdYm* zlPno019X{*0{Dt; zg)n1KVL@3?;IBB~1wCy2Y6j?vB+yB~(24=B0KVfI+++f$bi_fu;M9)jkHX8p6twaW zbXhp)UJzr2kkB9}e_HzvR;xi8Sa7eX4kCPv4IuGvkc8HLaCdjLG_X_%N=?qs z%z^dQz(pkNr01bhL}F=HffEk6vVgU!VEF;oA2C8N4?t}Mr0r7RyN3dtLCI!F1`45N z&am)+k8eRrNksVo4v#QTC(KqitO_OljoLY)5%3KShscm!t_DTJ7SF5v+8Q4JFlO+X0*r8!Ays6a{#SaC8C$3TJe z4f5H9ph5)}K8eutmW@+jBB0PQFo1>6NDU8@6zu6`q=tuKB4nHpk~$FSLpQ`&!AK9w zrW(@o4Xn8V83IML!3Jdxg5{R9G}L`HsNn-zA_FRDpgk6pf@P>w$GB=9)Q&7HJmB-$ zuxUDIfI!LR)-=^@rDEh;ua3L3TVq6`k? zC62MR9$+pZVe|p61#dS4=3die=>9MC{o(GZd6}if3ciUIpsPL=+=~+PQZf^Z6%38S zKyHV|162m~A<=?8RVJC^I?xAAs}Iunh~C|I-X0<+zbyGD?q2$2~J2yulW886EKOBAh3fp~K zpm5S5`o1la`w_4Jg0upWn-$;|8Dt*}q>Tb^TR}sU^qDY(3D9N=_8T`ankBIE)yx=L zzM4VWC7`eYVI2=I7u^U@YC&m!kl*V>pB;q+0IZEQ;Nv#1@PLi~TR>Mqg2DoXbwKxK zD}Xnnfvz`nhTKA*S_BFq`uD9!XuiWj7@9ob=>;+1hvUOu25ACDG3w2yx5;X~gsDOlKmX!P(&#g%?Q zWdeAXWF*uoppb!JSoj#3Le>Wx7#O0IC^{ZNjsZpr`Jf#L`oY2aer6`1nKsY}SV=y3 z(UOxtxVeJTxP@Fig=m67hQ8ss1yWMr%`MPs60XGzw&4|AI3k*yF!#gPR~e(7KjM*? zo2U?+oL>YTs~$Gdi@k7wg$JyDFhMze4pbi|mK2xfr7HMlW|t}iXXK-GT8DY?z{dkq zET99s7SN6CpvETX{t}PO63}W^*ObhX%=|nB=aP)loQzV$G3!)61_2{)fLC@S@(#|N zfVJ90kAG9}sv4;0!2ZiG%EZ#1#@QUAa{Y;vp^2?A;aZ>}fqfJoYiJQEUIU0NG*rGK}4gDB=$N19Pv;BJ$y{j5&%;8VDyZr zToeq7kUG51{noI3mLX>H2qYm_XAPKFTl392reTaESm557_!tL-hG$ zkJ3!9%tQsydH!fkMU)mlyll{>;)RLe7(}%7K@Ntw7k0jl5&C(Io_=1TpryjDkVX!q z0>hlFqAZ2NhMH+V1OoFfY(1M%GFtz}Gr-jyTr^QQUW}UQAj=$KB{bS7F=PlCZ}$zl z%n@b)w50;i#E6z0Vk#fLeG#(i5ghI4tNRe`xg=8qa6i@11QtTz;>keAGq)fyxdb$i zpPUUUvB9YnwiFcVE%=IVNZA5&CEAz{q*a2~o3O$NG^%Kogl9|#;Z4*dj=`gRu(h4Y z=^N+zPS1kW^hAXKcU?;ZBXE<9s__nqT3CRf#XBVQ@CFDpVqpfL$2&AxV4o|&8t<^! zHA{uglb{~2WuW8btQ%l#U>J%K*Q8IGpk@J-v;pxtJpDp~32#V1SF1on0_t(N0nl(l zX}ZH3Z;*h%NE)Ez0q?)U!vl24H6-bSNl4IpAn1JRP(VAEo;bDd=Jir^@9g{($q?9L=A(MX$EpUa0 zo2j7z@;2V#S)gE~4@;ckVLl?mBN114z>8JFiG=h%G^DW#&+V{&3B02NZH>Ye;9OG< zi(g|4NdL;hzyfvsr>~=nvtvkc7<#Z2tbXwIafe0dNIc;J7Cy;lM&OZTqeRpT)pUIQ-5nJo z0!(!s6#{Zfi$UoErPd_BGXkk25d(#glmM;&3(JKq3Z3kx$dh2YYH)FK6Nqtz+D0#pp4bb(1;^@rMG zMa^4i1BsBz8SiKjw0RCIywDeoLTfOT8Vf#Lgt8(AR^GtsZ!y?~Rl_`m7AlY+!y774Z^H~g4;5&jVINHd4-6ps!Jx7jgweyt z6#f28c=&+V9D^qQ0)qT;EEOfW$2Z^s1??7s4t#?xs6q`W%$|0?`=ZWoQg;S3|oS1~}4}kv6FFLA#P1vU?Yne^4_Z71pv~%Yg9u z4W)p>3?I}TBlyCHhRb`QeG$mu9om2x&e+D+GQ_D3z6Dm8rX9XsFXoq%<#aKpCI93 zG63O0LJbcKLQ<-9L|`E8uYt9n4bjib_DxIyH=l#uJi{Pi0jaYBf-z^~sn$M(6fZE( zk#Lp*TnltW5T%KOnm%AB1fT>5e7+eL9u}sk6V9OWHW}2NKpqPO=N1J}s|S>WhE=vf z&o9PU(g&XKpm8-#|8fKt9!Ah}lnf0Z&m#im1L%aSWg9C{|EB`Gy)Os1)Xv2n37mfl3D~lbTGdtGd(jeF-IX7v>+)s zv81#pPa!!!ucRnHCkL`Y7aHFr9`b|gbI33O+#9eV0r<=Yv_S+{fa*{1$^hgkPMG&# z<3*_!FcFA{5&jL&%v5mBNh~hTOh#My2p%jkfL`7QPsT}x#yTklAjexJ8G`P91Wz(p zB^jFNq!g4EfR~5C`u~vVL~j0p^uhfA@iX4&g@yxM3nG<50|cXs4-N|OnZ(E?Jk0m- z^&2Ca*0A%W>HCLVh&O`f$})YkRv?h5WC_CmU_?!t|6rX_5ezR zC?+N?!3;p_d?Z4X8lGV`aMD6se*?SE$j~4e7B(PS$IsE(-%r8aS=YqCz%>{YD9}=Z z%p<7C2^6Z<3b;}Ya;<>Kaj^7bXaGG2-Y^wqN577rYeWbwS6jn+n(zV?zOxeC&qj($ zu%qGbg>@qh(Z&P)++D!2NLkVzpd1gaBrB~FaV;o=`QH>)pBp5hj>q_gdAfKy!t*<* zaD;9jKuOnTq@F5(Cqz&eT56M?#nD!y>Lx&B_QKFm5C^`K;Z?i4T-NnVFo}$0B!=JK1HMv)TP__^Ea$MH8Do3 zPyI6UN>cMu^1+J+u-vr-tvShPGr`dU2TnU0p1_%Mm zA8`Mgj12$6?t?KjMcpu_1CQUJR8UJeGcOywOCB=)2-!u0wNZ&yeu9!SdJ~91C0<;T zSX2VK7^cE130{oD;|I2W9&JMx!o9)enI*{?;1(Y0ZKc%7zmRqax|d+t50blK$&sG* zb4F%fiIrloi%&f0Bz|XqzmOn*A0OAC_|Rb2c&E^i5P!dTA4exwpI|FnLml{dh(QW; zKY}r|9tSmUK@{3D~@^kYQ{7g)#*1CbN4Taa)Cg8&~VSxt;T6o|=28-|}7U*aY z%mB0&AJT9$mcq}_0JLlrR{FuxR|<3+y;%y{eenJP0iZ!3w1zOWlpAhsKFmTA7Cy#i z&~X5i)pQ01I{u-Nj^MfgErh_i4%DMe$uG|X1FoN9lnurj2NCWgx zbr>xUSP=thXh2C=eloCxwm;2{P)@jjhL2l*g@u`d3utpkKxT4&KzVIix)F#>0m&pVU%)B>ggms32v>mGal|b8z%d4kFW7!v154Bc zhjjv60u;hhi;7E&A+ssq?MjI$psEwan`EbINbQL14N&|c`2w7G5%SQ;gDXHCP(=48 z+<&n19HIA)LYo5yIsw7h3U=7eE7DiLf*g-!fj!MqYD@!dZQAkcq%1H&qH%b$DxGcznh6{{>r5D8b4=klXXq|vy zL$m~g5-cQV1AOTPtc8| zfu#>KGssDgX69)3*ANH~c=-XDmjaazR!N4YNL>n0p94Hyg+BGMMP z-i24Q&`g9qmmpO&NM#480D*@Gti5au6M>W#9W`TNwfDQ@a0h;KBg$F2X@Pr3wh8(06ky7vl zNuqHbH~{e`6=)8D1u9wwN;HAqb&isQ;A<$sfr4K5pp-Ar_Px0&YKkEgKA>WnVSP2e>ca&3?3Kf%Js&@d5vt|_8Cg5*C?B7)2T z;$Aa0+(xvp1sQsJvNT0oZvsw8IhiG?BXiXWM);(m_cx336) z51(XnZ0Tn-e2k2YpzHS0&QA?=^mB4la0&AFb5(E*a&~laRq*nU1f96;P3zJdR&ggn z$6yf6Drmb0t^i((WAwCO@o#Kk09`j?2{R}BGmRTcv1H;|WH9p{Ehjl^*?p_nfeeDK@(0k^= zsm}nzy@4h{j&7is0560yL*H};9*}{q49qal1NBb8ZUPOVV$MRqc1I$-Kza`Zn)fi{ z2JC0pvOjnu2j*X-@&t9iOJHJNQlf%OQDS<29#Xag#}>%n^luK*eslwAKm#LujG*fz zk#+-e**)Z zAXi5pSVbNXVvJq_`HKw@4= zMru*wh;1*y(+7Hg12cTEw2wgjiecG2g0GK*hY$2#DOiq&=AWR%%&bxc-~6OZ$WnEb zY(#p$7?e37ZD~M?hjQnH{IR}0;JYeN3Y6}{XKJxP*8(2VB zW2fa8(c=(&SdxL%pYW0tGEqiCQH*|Z840TwFw%tJK6C z*tkYOQNA7x51~ZyEi^0!BvHUBXKdkvvf5|xgbxYBuh8U#o@q$$tAK(DmVaRVbBodR zqXP;T7{&;n(e#5id`t<2PuKtzKs3r=gx1udryo=3tQMj@gH}Edv+zM(!wnxMgJmyx z`xibPhSGZkm(L|d`Jus1ddc~@3g9zM0+4p+nnJt2=(}McO;>gOMC@BR zwG%!dv6xAOD4}&PC~V!_N*t?{ZcH)8{p^yYQTUKhB36! z4{EiNG%J9bFd%&dSP7DZG&~1VS80_9-Q9r5bkOzua4pa&B$Q2u@VGaHcPo(R%wX|v zVrmYaFEcWN_#5874UY1S)D7?tcMVbqaE51&M9_(5L-6boXo#VN5NbIB?sy@}5m@*n zLeDWWGEOstg$;<-2~Nx`NzGPpu1v}=N>>QeGX#gxu-l&rPe$NnZHPcZ4(0P zfKrywvO1>bITMJ0fwxT%0fTftC@lXNB&R{w8G}*>sQ!iIp8z9M0|N!O{G#Mkg`m>h zq?}Z&!9x0y0@z+ENGBOb(t(t<@NyJV5|iI{!!h&?Tjq$Z{6&Nh+I&4Uy#yFp8W>BSgv{vSO57+}vo0VWm(_!7#n%|A)-^Z_0Tgq5!W zmX-#P+gwo#6_nBz`LGsHV+B;0f>uU@0t-BV2I3$ulLjdm9Ek*Tr8}g+g_XDP{DTM| zZ~=oHJ{Z{tLDz}EvVIk9v()9s68Hdcm#uz&oBrP#Bl<+nkbNj z0wpoR#{heKE+E**97};a^im9&;R7#!4Y8NMSnFsKcaK1G6G?RuJ=-pzBm+w?1_qFG zCyXpCQDzi%AQwHwLofY_H_}6{rBTaINIeQ~Wk3oIysZpqcLlBmby@?_3J19qf?@8p zOoE=TjnWzix3@qSQw=)z!p|Q-Iqe4I-h$NB6d&;XQAtr|cB+CKcq9VcSca|JBso{2 z#tS4Ou+OGYwef?Q50q!Afd{3RPe`{AaRpn@7)mw^bKU{H8~=hH&+i!#CI0uR@) z0HtVHc)-r@z&MXBxF9F9#4WQp1JdtC%)jY?2k^{{!29+f16T0z-XstUlnAVnKu4%U z+CE93Qy)PmJwnq1{B$})bMR?vuml3;z_TQz^un8q4Ux`hg!v~W6_P(;<4mBq1!0}w zlGMc95p#VGeE!f7TF)388loJy0Sb@QoZ!@=%+z9q;F6-mlG0)Ym(qMt%LNjt(80H1 zIU0$W|1q|J6a$79M1)U-4`%Sd%Sg}(LeL$OkTXxAsULjkDJc0H8bJ?fOftm2Q5BXE zAYE!$PN2(fE{surSbl<~A45yr;e!+?B(_vQMFqSc1kV4kFo3Krg@pkTwFTsA1ekW{ zBoACaw8BT3^ntf)(bp!Ul#gl9exW()1`VAM1>elPO!z@HpfEt`6T;I4v9lS_R@>k^ zkP%yR2wuLVB|`T-p`Q;N0xE97H`5HuY7~|~lA!DO4UJ$TpxVa3Kqn+MIU^Uejz6=c zQX#@j*VrNqlt#dT0h`z$IgOy?7w9=ouq2OKY9!IQK@ao22`s;)qUV>4qSE3L-^60j zy{@Uj<%tCf0YUzQ^N28T$qg@;V5eQd0vbA91S?xeSi}x0SfCg^ybMi~P*%k0gn+{< z7ZP5`quStgmEbCx>;*mpl#FmS)4`khL4z#NumMr%;bUY>FnmIaGSkyjixiA?GxK!8 z)63K-kRi1ayv+)2!3)_3mL^YG~vKaKs0@zGAMVe zfG=6Yk^y1i1v~%Wz{CP&1VJYxGd;BkbPK6MK(IdOaCa~p(M^P1*9;0aaHR(uRDcH? zq?HURi^#ee0DU$E5{!5|jL@LKQINyRdF+$e;DK_)fC4OhVCSi!OkRWb?}p@;7Ud=8 zrskE5==F!DX^?(HvMJhlX9%b{03KU_9=VK?NJwrOLG#w&Yds^945(UzV_5o0vVe?# z8layiG#WnOhIEQ0wEu;EzC=iQW?paxXpwI~un|TfLvs276+?(388V^_D<{xe*3>L$ za827{q#9Uyfz2Nnn4{&V&|oJ86J5uO%wh#YBVDJ`l9K#9>SZs~;DLkyj^KfW9o}*n zb%7=sv)UNJ1MiQ*)@K@_-WY-oYn|3nK9YILPAFJqxw zL4pVw)EOf9*cL3mz~&81(ATG;g$Fg$2c*QrQJg}82ybypbh8#ZDoXG&G^GBd8T39H zBj`Pg;7S?Pz6FIxSY}dDB6y1y{Mz{49pL{~SsQVE{?11nDq zlhD?8ho$D_=fXDR!-5ACGPKM|@J=7>J}daR1vCuc3gEjU!36|78(_3gVf$kYjM46E z3d>9`Daxz>Z_abeOwTA$fSh1Trz0ug9wF1Gu>219pZVbOAI{W{eQXjQ9Jt~Y=3f(2 z$UO~41}3QGeT1t&{KP2*$mSk1T`YThNNy_)cwLBE;=@}=@T3lAz`_UCel##c+uswB znh!oUez-Rr!J&beA2l=wt=BRzFhRdhDk3v6-!~K7!$2FvM+qU)r;nj+Ya>Xn3s;{E zZGI3kriQl`K&vI8bs;R{BtoT827llqub4B0u=J8_UL7a7@U}2! zEJ71IQhUe1+!(U53uU#0fq_nxtDmE%FYE+UXMewtAb%ep*C1L~>9C-JWCvJsrPeW~ z@Bo0N57_)mSsjz<-9B7$< zqr`-iCit2Nu$g?A0noY@UgkpkP}rLYX#FTyd>a}Vf=>c6G>6de@F)#ROiu+jpP(a> z)GQ<*eueo1qv`;q3VZYI|D;VQDSm-L1GGo$H3s6lZnDt@J_8v z%1)PNX>)kS8&VBOHVCgQ1Eee0Vz@l$w!O01%8fq4j z09YQHkwHqp=D`Xo1_p+L#FUhrR3j*D$N;_o17t^HayCdkxI|!JU;y9l2Ul+bRd37y zyXX<57KBUlvh(uG^FZe0r67Whp&}{2!r06JOy}pNG87aWGZYk?FccJ{lomi}P5&^LxW`O)-1of9Ols19VAQyq;%@`OMpi>(Ps-+5f`6UWz`K5W_q@Y@Cm8hDc z!=PGhl?0+ec7k@Jf%+LBTS06*Th_qgshYyTkd~O7YL%E&Q3*X24#KZULg6PRR#qU( z7w6}}f{>lgnvkkf1Je^0XHRLjS-NK zKm{yDgA3t4GSd&-o$zFja!C(P^FcK`q#+N!V?3n*>@O?GVps4sFhkfjFf!s2yJMjJ zAW+Pb7#rxh5zL1yZYSL22DfD(p${p?Ks5)fEd#1|O;PH9=!^n9V8H={nFuLuYC)U= zau%!x1{Jl)cWZ;vFe3io?g9H9-du)m(L)XkQtDG^i2-p8mT;k~{a6A6)}DZkDw5oC zBtF>i7EaVo1mJcc8Dp4`hyn$a3ABQSL>efqfG|QHma0JVhETPT6b4ZPO897-S&-U4 zup!Uk65h}*Gv1mJTkj8%{wXb=31(Zmrax%DhmJde(i1F=fYOT*yg)=$T#!@)Qi+_h zV8tkU$^wn~fYKvEKZpk%_X3YukZ2y%MF{giEQDKO<7VI|&(13*VO?4PR2W5cb4um0{{$R}6kkDXP z$OH+>_#p#c_2`{J1_lP`f`8DCBZZRue1)9EqV!ZN1=V7ZZ+s)(2zYtVnq^|1`X?ii~$Yjf@tvAFNndwz(AajaH>P`3CKuO0~1RV6H_w~ z3F5=%%Rn@U@0?$nlai-iqEL`nRGg{+_C{J!elE4KU;vv79$HV#$;nSnEJ;-;E=WvH zRVc|SOG!;jEX^rlr~uDDfx?3X zmqG`;!8$;Z1P)If)nZ6cgGGEH?tz40Sz=~RVp0xh5(G3K0-Dy!%quQQ%u7y<&rD&^ zLYgSR3@T@TKQ~Wzu%TGfA4ERh&C|yft9-npkB@(Nd~k@Xqi=keXHZC}BV>v)z|jRM zoYFG$QWSEbt_Ce?O-U`wOioqMP%YJDU|>jtOrL?%zn6bxaEPa~cf7xkOMHZre}uoE zYdm7YGZ^GnkUt2i15Jhcgu1x8K-~>j?-=Cl=;8{o13GOAG82SR%*CP(*-Q-ePCky# z-aekeA+X6 zJGf{KaCC|H^>hX$2XK6$iz8_R%ftO2;t}K@65<1&t45C(ba^C$K=#AU3HNYy^+AL& z$fvmFkqkk%53~j=-r3bJ#5Ks(1=T!w`HnULh++>U?g+S70 zYF=@Ek%E)2r?HWNf@5+r$dMrXQN-OVq0^Y)Z~_NEd?8$Xu&ZCNe^9(zXt1ZhA4t1F z1p|XqVsds;eqO4Ae_kp`%saCqald>sYI=#4^BszPR7W=UpZPG(hVib8p2NrnO_;d%ObhQxb< zlB=7ev#SQE+=My_X~{6iW(EeBcz8x?Y7WS45U0a7P=NOqfKCRTaV>c>YL9EJ*~{qL3+mSbQXc zHhyO2rKExuTre;&z{EjGT>+aoq!|d8fvL|(EJ0QdHwW$&s1BHVNIi(q0?Gpt3=9mQ zbut2s3=B)40rOy*26(-WYO#ifFZp~`{eV`A)MJUm^L!#rK$jVxST)dD8KsFCqy-Q+AqFa7Z zZXz^gVO8gzTH>5okeHO2lUb4pDax>_b4)HQ%`5_!n^@&T^Aceyu*wIgmIM@m++PB2 z$AcV>LtS19_=s?~)YKGEugf_^=0hB!Kh zggS=!2L=24feplJ4kUV9)6!Ctp}~j}f5_n-kXV$Mn_7}u1kG1i%?mC`EP@#XaXv#h zLncEWLkdGaLpeh+gC2uBLn1>iSS+1EkHM26kD-8}l%a${kHL|lh#{FFks*a4l_8j+ zgdvk5nE|}y2x=09BHlbVh8%`WhIEDuh7v615pNE}#iZKH$1u}CYOM^c_gGG?D3VDk`fQCpB+c%v@~a6KvEZ!nwwvSOC^f`f*iv={Q^Qkiz_3N@+&}XFmU?< zqxMB>cf<6>JNpL(x%xPUxW-374FdOrK`pfO)DmdpKp`2eECYopHg%9@6{>P<>dF#x zN>fplF+_lCfZ)`U;F83WRCp*cAlg~bmSb{$QBi76Vo7R>LS<@+jzURMr9wt#NeQSv zPK1qqq-7QrLkfi8RESg=d@Czz@W;gH#S~-~q{1s10~1q7C1YS@;R>!~43t&1BGjN* zSv5sjRjU*-UH}TGqSW+E@R?_zK4ej1xdOO@t&m!lng?p6!u?;GM?fVgR3Z4l|NEd6 z&hX&>dl-G-3FkA_$W7-3_a6s!6d4!{8!Go(c`Wi>H8VElt=V*j2TZw(Kc7U%KSbj{ zLgRly<9|itKStv}LF0cy<15I72pjiZ5S(>^VZq4-d8UeJd?hr#G8$h6jjxKvS3~2g zqwzJ+_?l>ZEi}G18sC>8m7$oSm?4oNodHxJxPdb%X!Iu;+?G&)$6j(yVsWtoD7N8k zw#3qs{FKxZP;G{xFE_Qg7_<_+99#equP-mZBr~lNmIZNH2kt+>+yP2GDCI+lN06(d z3j?@pU|?VXwWUC6l&isggLqW~lL&Bo3d8_OAde$~$48*0rk;CZZf0J(9ypKcc?Knx zgNign)&%9*%w%v44NvcQ^h4U<;3hv@Co%dUeFD<;fgD?qm;$#8!j#83IVtC;+KWI`xbGFfB*`gCW%wsm1 z-|(6ep};R?z}V+K?!NU##i7604guReq2e>HQJ)q$S@5~Z}1k`+p zy+{T@#UWiDgmS3AlvPW?u4Z6B)GPT(C5f4N3Q&!Z@f(!Jl%4|Aw3N)^Au0fz7NFRS^M;}+v03y7+gj%1I zn3rA(s@F0>qfQJA@gU8heF~{1p~b010Y#w3bx~?csHYE9Widl(Q4UJ~A334tGZZkS zGQhX5Alg^?1*v%o>6vAzc?zLHK6)T)5{uHobq$Ce?Bb(WP?VpXT3oCLsj2nA(pbcc zOHwlP;`70yG@yDDU0-oYN`7exOaaJn(D*2(`N_E{Ihl~rPN*UV1_sy6l8n?M@Tgco zkbgjYK#;$)YjAM9bC9cJh-05K*I>d-w+Rjjb#Xcgduq32@;ObaXwFde}&XM&}9WM(HV(lsfdX4^bZaR0!v;Td?$Ao?n!mnU@})0v>e(_gb;4 zD=tY%Eh-|MzM<+$^5c;b2q;{kX$WR7IQrv@^Gl18QyGF&OCa6^jY5Nl$1?NtK%R|Z zh+)uUh+*(!2xaiW?mvhvFoST11Jqqm3!&;D%@t^BKr_D}GX*`prxrnmCm2Ffi*hsb z5=&B{T4808duoYmMP`X}ehN$mVo`WvW{F#VQE+BndQPf;QdVkmiADxgucks#D(G^U z)D(qqN6(OWH%Cu+{RGj?z~B<$n4cuT!2C%-0Bm?F0|WCX1<*hY149M_0~5$kW(*8$ zLg2v}1_rAJh(3^;%orG0o1o&1;GS)Ry#)gUJ4`~!%q?VU~fgu63{s~FL43I+Tm={QR1(d&o5i$-2@;kElQAWs^ z7`pfcMg|5Rs5u}%!pynD2pKAagf0Wa3#j=&7$HMv=;p99K~faDxHuC718A5HU0j`s zfk6jqFS0w$nHU&AsT18^dnU*b9=f<26Jl5oWDd-ozD$rXLsws%9OUj452+s*R{G#~c`FW|ii3RbwsU;ctDGV@f8hC8b5RGrdP@GZ}U!IX!k{Vx-pP5&}5SgEr z2C8g=lJis3(iq$!loN#V%}g%JFV0UZQP2p|RPgW#_E8AVNK8pBQgF`CEy&DCEmANv z&@*K440iVe<$ciDC}T#=sn8g4!--3aGqX?#k2_pBc9}z>y<*6GV zM4nK23Q8}a@&X*D(78Pr8=Z!SJ-P%Dd{B9M23nrZU;qUg0|Rn-x`c^=p$00BZXC#7 z5N>4vS6mFB`2$cn^#4Do#)6d5pt7|OT_cna(hI`HiMa(isYM2$j9*e(lxhGPVFtA| zONtpldO>DvKr5eNp!^Cx%P|IfvXk>UW zp_b1u_2FpcGfX@kt$c=wm!p->F!6S@@)>4tKU(<=6Q71wKEuT4qLt4u@zL@blu8&F zKxJhNgb5}=`3;m7nVA{DW6fYeXu1bQJ*~>;TS}pcO5(e6vbjR+&$Q_0g52;%nE{-a zK&9&n76t|xRtAOu5LRYj0Oi*l7D(PQVT6?9pf(HxE2RD7!U9rbXb2JmtqA~?LZJ2m zsAURjhk*R`2kI{n8ySP_24Pl4NI8H_4kXV9E{q{=1m!>U{4S0~9;6S1L3vpLi##Zd zVe*ZqtHIHepze(YA#f3T5mDnLX6oyL2p1gFRd$e#k=7 zL>)T=Lly@EBXU0(v~B^pT?k`?$`tfAB8(4`1GO1pd{FuU@j>lIV%m_Pwz>oZ12?P< zIjsv+B10mW3EbZXu^m7x2L^@)dwB*HW-e%3(u{$D1Ede+28h}QdypC!7Ghvvlwe@s zfc5L8koxtozC5ydt_%#_hZqJA0nE%A1_stc zP%$*xGdIk+QP*|8SFmR#EgTiOc zQFU_=28AdH8{<$13qOz=5Vl}o-~zc5T`pxXrs z1DG0Ec>u}N_0ABQ0X$9zQUh`es+tCC(72uwH1EOGBij$p|4=m``$6FW>eGT~!hUN& z@tY9?11~5(KyHEg2|3SViyKhfgWLg%J2w_c*#U}IxEM4&K=tltU|;}YaQuSG2y}IB zEs(MmIJghy0t^EL!2i5=Z@{|Em|AWLK=0fUih|vrTu(A#m{-Cr4 zQU}rxZ>vDt4VjAURn30j3v5 zgXCcC2M`-M%%N=uP#Xg5D2Vx>wgU)*g+Sp8ZkNE!L#9D>2*{rxF;M#fM1#^NQrLn0 z0J9V1R*)J{J%g+UBnGh?d;0+-4>Q9Jsr`Ub??Lkda$3V?Cdkd8d<+hY(Rz;o6t18$ z1HC*%E<0i6^k}^Y&J&>W1jMjM4kJ*S0+rvO@WfWXAghIiCn!IF(;=DdpV4{`(q|#Q z-aCL&@1e&DxSYW;&xEWt30l^`+S+Qh(Ec@aP6||qgXW~b<}pFr3QdsqF(|$TpyLLh zI@}FS9+VeB@}T|$HhEB+1SAiNdu;Ncv`4u9e?XIPNUIrY;lSXCJdT1K$Dlk4jz1#O z11PSL)r!@jh6A#>pm;-8JFNziK0xhbP@ysy(hjJ-4@$qF^aZIyL2V6?>mal!0|O%r zgZjFlH7p>tkiKq%JxmUr)@NW~1DOl9mtc{}Y zps_R1$l--)jtnr&z`(%Az`%~AAJYDT=5cKP2ib$m|Je^tIKVK-h1mR$OD}_ij2j$7 z+y$N|2iXS;C)hkWNX(ppffMF#P~QY(A50yH2E~&lwA=#8aY5T*Aia=yhm7}t%m9Tg zNDoLZtQAu3f!Lt2SWvqURK~F(=?8}`12}DgLKI{?XcU$Ulm|iO9Z0@su7drE=_~Ah zW*FLn6u`_EU|`?^(#A5({K#P>Ogr9rY_s9%|_EL)hOvxQ-h zdRUnU3NM&mkh*p5iMB8dQfI-yzzqrms5rs9)>|`^`T`eNFHP+h=#cb z#DWqZy|8i#SsilNg7m_|6y`UOT2TD}8cPJZ5mdf_)PejAE0;iKgW58n zumt5Z5TB5G(&C5#KHme1qf4Mt2U@Pn==oZM>;ust3`$oZH^RaM<{yw4C`^KO_&LHb zNFS`Mhx!*B_8_$|{ZMiE7-eYaRXZ34>4$|WvN}*d9u!u{Vj#P1x!Ubv7^D{@w$43q zFARgk%oQNzJID=f%!qOg<`0mWp!k4=H>f-V>4TL6AU4QcY~=tb&OquwAoZ{~2GJn( zgE^i-egU}=M8o`n9M9-s3<`JTFb1Uu7zWiRuyx6x{uU@a(AUvTVPIhR25P{9EQQX+ z&4#i;6lnbiXzdS(jgF9MnFBJl*d(yzd09nV$$N=JpHn2g>f$$j`SQ(xyU}ONP zV_<=Zt!iLL5@P`C``^HUBF21xf#E-B9X!|#kflRB2SDzDu$dn)GCY|8Vly)EKVV{b zG6A&u5VT(Y03&D}2_tx|5Ar$yP@KjyFfbPhK*}Hx8#b2@V#C&hrZX_Ge1fi{2ZbnT zUA>V4q+bPMgXBQz6|}}4M1#^YXbc7v@?oM7vys>68!<3&!Q|PXcEjXBdO&F!L?f$P zCWUGa$R3zFP%?*^2NQ#t2g++O_ki3EYNLS6hRK8KKA1fqd3f6cI-d>7qaZUua>(l7 z?IEZ-aGQt^5+-1E(C`Aa>5%OMk4r(-f%wYQ-296 zkUK!@$QzIx0$y_sUDphfhn?lK1u6#WoFI$m=BK3QFsxq9#K6qJ0=0WrZCBn}E6(E3Tx z9aLaJX!#3rFKGQFuEp)3we6sA0GWYoAJ{yoL7*}l>v~Nd9P2ef`;PFerw17ecMk&t zbeTO!lz|~W-YwM68MF*PK3+$`)5X}u&=9hH)6mKavbhO4T8U8)-lgx8Seaj1LX`Od znH8xykW|CK;GeneAm{&;E*oshCvb7eieH@BYqQ_K(Q$>&`n3Jkm;4&ettszIPW9`U zdhnBRTbo@}Y=o`X-gzDyzu4~C=BodjCw{@vPh$7I=KHQVa<%Jdz;VZtYg*~~?(>?? zhHmlnJh#2W#l$Vc+kI!}2X&Vw*9XfAPVm*mD*5#MiC*=fOzf?!`|rM-L{I+---W8T zC;tk3a*ru7ay_T_&Y4?$i$Ba(X?=RwLj1puT-;^hi>1 zUui-ilK5Qc{aji}X^AQw)vt zQjm_70`D(FlTU^mt`uKbnpz6qegTSDqj=Ba;?h*7#FFF;9R+j|NP2*g5Lrk90PP_J z?KlPRAcQ6oBS<2Fr4jd{#Da{>n zaLJ;O1m39+I$93o@Ax2BKNr`aco)wgSLYB=!i{%vbqa+X-3f8IE9evy*NSik1_<9J z!rc>kv<~RfGX@3*u)Fk9azJ?!?9K>xPxsUkm(--vbkDq!)FRMfw1!Z1@laF15dd>t zv5o@BSZtbL=Ht=_H4fn@kP9Ff>@HmTJV6#h{b6Qh<(gNT>zI;QP?B2YROucN3fcS& zIavs=IbcbsBfx$l;7@Sz0F8Oj(IgN)XvbwBEUkf!#O-cl7efsFkdy@4*g`10AofAj z!%`mfC^5JLAi)QTS7O`&Gsh*hI2m*}UVf2BYGQ#xbWuqeIH6I?Jm_j|1*o}1hZ7F> zDMS|+Av=%?=0SF*Ks`;edC+)pgq&WS58dWUdOSeQ@yUc7phU7e+=xi`kR%T+93T-) zvOPih`6a=b>3NBuT|5j7AsML(1sRpanaPPc3MrYz1v!b8pdH_tc?yYn3eejiK|AkD z^NLFg3i69U2S^p=mw-?E0@cZ|bEiS)UX?@6>Onp)6WM*i<%tE(8Ht&Bpu!VTco@Nw z3S8bTzsRFJ54^`4pMJP{Lo2Jm($u0#c)^ES9>CQ>?S=DAz(*PSCRSwTmgc&F4$SjO zEJ@8vt|U^wF<8GdXj^13=+J9J$o_G(dabxTu^>Jf~HN9muF?aGf8k;GCET zx_1+PICyS;QK~{oMq(c5yjp14QViNG4bp@bJ^_h2sU;<;pjbnczp%st%5Rw^CCIfc z)HrZSfShhZARA7=Hh|hCP<62V_+XdnK?T8zkO(a1kmVj^d$C!FEDt$H0@`YVx+@-f zpb4@%6my^okma$OQwH%IvN}|AAPPc}vU_A`m;!k3FZg74h<+Fe37^n{l*E!$XgGs& zVP0Ym(cuJfr$T7~=u{Qt#u7X|;58qXXRNGzK^0(bVu3<&Nn$$acot~jfl~y;#Sr)U z_@>qqCqDqitNxnjHYKcOk0(7qy`1q_ug<{CQ>hg?C(0Rwmhkk%A0EPr7 zw7ducm0m?bsfj7zPEj%TK!t|5k&8k!G|DmK2@)Q-%tH$eJW-8oPC!v=acW)($WamQ zo=8P1R08A`P(6qU8U1ephOBWT|uNFQj-17sJ74RZ@%e49p<&k>x>r&^}4f7zIci#0O!}I5CJ19(_Y|EJz+M2V#K7 zh+LSNq5CpHLX3<~49rZBb5p^5CKoUt#0FtT1{VRCpFn(E7-Sd7ZJ_ZuP`Ctz1RH?P zy#R@UFv#s7y&y4Jusc9J$UZxeUJwsF2@PUEk7tF6gT}HzXL&fVL-xmk&Z=;U@bm#~ zj0gE!gPnoF$@#!NMIHu*06^5d~+rj-?EeMov#W_$EwLIuhU**x2*1`Dqu6 zrW;!zXcH3y1A}zW15i}4J20)_ZTSFVGAra7w1F7%44f+%JSD(`%?!d#2~G+=9H3!9 z2GBIM5(5K+k&*|eLP{&kWTho7ER&TUw=A3>BIMK6!`-sPM<7O-L6t!yjo}%`frLH= z&0`8JB2LRB8U%va7A|f(J%2;{gqpm?T~lZLd9+Q?@R&r%J4wCzLvl`^oEJ!nF|n=| z=rVB1?NiWTQ*NE$UZ9X5(I}z!aE{xohO|im#>XUzdkmk=nVew-3Ni*^k)i|bB?;|j z8SRxB%tZ&c3gF9S;IA@ZFIvD}tiYZ-fv*t8sDLpF6WBotF0j2sQdZ`` zUX{RJa)Irc0DBokWddKZ0#xO*1on~z>}3w@xexd%7O+E20E;-!1E0+ciT5@eHpmz) zh|5zcpa35#l=x)g06w7vBxCTTv4H`Wq!hSW7#PGrVJkO7LQ>FYLJy~!`!N=0B~=5a z03KGk0Jf(ALahM;t$_-xAs(!u5v*YijI2@t2N+!g>dIitI>CXyA3++{nPdK0_fO(IG9*=at8c*K7Ou*7fBzIj9J;IL%ZLIL*e~sgktl z#D%F3FJ3)4wf5rEgHwG4IMSLMBQBW+hFrSy;MI$LFFrjurN-g1`JjW5=WGo{7S8hbloOzR_afO*ghm1$DL7++Bv3sY^oKfRw*?Q37mBXgy&P9qQ-@?+; z%p4Wg@v=3s2g&(dVQXKx;jM79kwdd-L9@kzX6p;hyv&Sm53)Eim@!DR9pe9!;QWDI zx@{r9Lt;}x@4+?)5sxjcOLrE|-1MudYPR=c@9N^&3L>{y7Tz#pIl{8=ff|SF_C!Um zgCc&6qCtrstWKf~O0dFJxaH984LoZSxK=fAtu@$kXaUy&mc|1SJhq0mp1uMdIn4@3 z54AlNO*kkL!YCS*=+PP;z#4hOU`>*jTtyKE`q zDsdgHaXV@rt~zuq?fSDxZeh>d%vCv7O?bHT#?+H%m+sx^%h{opQlVFtm{XQo6x_6k zPjcRAnJ9_KnK758BPDN7VbFALd#)62_B~A9Jj~2owLoj)!<`qN9-PX$bLZZRtrwT> z-Fenm@Ee23E0CE>r`}ba=zFpC;#6NwmxX+i^SozD&yA705duQ(PoDMVtYKte0OcFdxn0H_4Kha_%A|=f+IBcwv>fhnYGALdU@x9g$n%VW|E&Pu zmj*s#9w)g&2W8JKlu0vS1uJWoKErH#!r8Wm+4f9DPe}oLH3xg8M|(j5dsP8*Sw(w+ zLc8P{LB2N=_#PVY=Na%n{=oMkfX`Uqi0nN@nH!3-hZ5z|3_7j%G+SSAw%o#Ov!~gn zh1vSd2a&P__Ua6F^NjYQ40iK|_JRrR1qtkB8ti31Sj#Hf%NyF`Iob;)+KXniSI%hE zdG~?u-2=X_2l(C?FejZ@DDz~Y%o#9wCsF2oLVHyq|UqR3uTz+9!#Ue?eqdC{5g#{;$}3VhEWuzeHY`*eWs z;ROEo0sLPW7#Io_7#Ktt7#Pep@J@ekvrizv)zM`sGmmN_1Jg6{?YS(M3Vxn@%q__1 zwbM-KbHkpzJNs-1$Y`jjTQz51`o$z z50KfQQnc$~g6*4{TYa^M?@spXIvx$GQ+e1Rb!;;us2zu>W52K>>e#B$I#y%I)v=%m zhhVbnSWuhRNN$D*dL7GmG~fZFYXI9*$E7N#76`a8bS-dLagJev?CC@fu$2uC;MrDC zc@RZjJvu`{;5b{NfyRNez5*O6hZ|Imuq>R#;UmzI!tA8OW5~n1L9xJ0fZ+p!FiZC> z0T*EwMum%F)1DnmJ@tzFRjyvI-rKXeO#vptEr)Ij2ne@4nyDaip{;er8t&6=Jr|J6 zcBNYzc;+lkynBIH%D_=UL=1eal`u=vOa*~6Y>GTb5)OZAY+RancS7wgi5v;Dex4aV zk+p%XC+AMR=qtdLdDv-2V=3DVvy>JyHfbi48wOJxr5L2UI)j)wRuETAGc86hrWMeN z=?aYEc#%~~ge50Gf= zkx*gaXli_@8Tw2GqCBCdd#UHCj)RO13KAxAK{<;#4<21$Mq!rq@Z zVPaso!^FVg!Og&s!cD{eJW|JWp!)M7jF3JoEUb{}|NlWNd>BBTc|>4B6@Z)$>cD{d z#vmb3c!DsjKM!Jq#9^2Z$^hwuGQku~KPWw+4_3g;0Ly_@gU(~3PX8ZN7l1I-SWs6S z+~)?RX;7gL>i;hQtq+BsR|N7aNG(VVx&IFu4}iH7v~~rg2DIh}bj~G=jlAvz0~!9A`p8#1o&XX=Eoq)*+q-Hu8m3ut}knQouRulQ5(0uOg%Q>cWigmf~G(}@LT zR|B# zFLGd<>B)1f5!8@>c91t?q0EOyxmS*IryTh_8u{NWlsVQYch6Do#{roe4`mNE%H3e# zd2xXMzybaV3HlGcEtXGITQF1QN{?ZiY%)*wTGiUgCazNqe(D^s;TGH|Y#^wiaO83$ z!*Ci0NjPE5$Ou|t2};`zVjSQB5+iJ5BCY{KkYN!H)<6l?AcxkFfY#6iR*8TGjI1&N za;?sYcAUpGhNqGYmy8*g1G{~^WO$C9oZ7l&}O%f7^ZVK24x2)xv!LxVg*^8|^FP`-k=tyODauG7* z5#FG?B-K3AxGQsLX7Hd}@|3OVdmRfwOGP z53LSmqYtU1H#asoinGNztDfau*Y~blkAGcGlY@;kPYREf(FZ9#lu;F?SqdIW8yFqW zEU;!?pLwByD^@a2^7i$ZS#dX68avD+I;2XnADEWBxOeB&twRs?-8%K+!o3q}94%W8 zI^0@N%)I`g^Y>?A*TmSqr;3@meOD7Vc2ro#%f`eWD^tNM4;_us-@L(am$~IkPA11( zg9(-|UL45&ac1Jl+Pe#vUYuHcaPQKc7kvdfvYH!jIF_@=9aesQ_Ds&Yp1dZ92x%S_ zek>hcAyFZKQPhlO<%UEFKSxnD zj(d_h91)E!(Gjzxr)#d(U$K3s$*wKt+c}*M`U-UAIXn0WaOF1z)JTgx5=~GPOGy-K zi&V&9RB#GyG5zvI#nr@7<3K|5g;MEh2gMQ^#Zn%MwM9#0Fp9&*RycB-FT6d})_RdO zVgYO9j@CpmiKqvyyw18$ob(N5Zu+%|YqB+HJV_*RL!x3Gqu2pQv5dqStW9DSiOvFi z(robp>vNrTTjuT^mc|9I@;DJf2>7N zl0iX$1Jthom2ny5wKZla2%Lb8A9X;+j}%vP_y};MHaX}>vmClPL4ey?z}eYGnkl1c zL!>ZE)6E6}A!nY$EIAx2IGxIK9XPrbI~p0xSgx}vF=^#AJxG*h%573$P`P#J(w!YX zk+qI{&n^XxnEMKJr8fmQNHZlh1-J;eINjPHaF3lWQGu;lLLiwzV4>C_sj8|;O0yJ1 zF0(Xdm~o^Rut`r_$g|IogV|W(Oo9ZnNrK^*BVSZZ9Tn#A9+F&hux)8zb3V_Z13YYo z8OIuU&3IBKu;m^|IrXYr%jeyip1h`j0BNyDyml5G&4v<38YGy_ZU`JX*mjWj3B!$m zg1a&)4x(meyUnJXY%((6rRf;Z%5(ncI-fkyh?tjyiQ?hnjoitbwI|OOk|;g#A?DeI zLnlr>nRV~PsT<2!JSB~6#CLAmx!r2##!Wjl8N=Fn&L7oV`$n%br%SJAU5?j+tBQw< zHH#NdKHXg9UA%bqY@suw{|}M4U9I#5|lTJ5^|b zAv1I=%Ak~WOYTX?Sd`B^!@@a6kg=%C>bA0`}>(74cXkQp?Fm2p9(LqLN|a)RTM9yOK& z8BGE`YCMNBm<)R)WEeP_7>}?CPG$p*a=9tXbF=)s@$kfPCMUZ#n@<}LOz2mgP~*lU z#K3ZpVP~@+-;)PCJ%Y_F42}j4?-opEwmi{+%rjty4uMUue(}VC?~(#&z86yTAxO}E zxQlMzS8m}DIK6W&YCtgqqCuF@xEO4_45Su>VfMkqL3|hnnF|_U8f@ceDxgh+ptUT} zFax<0B!)bW2HFDw@*hYJb}=w0UxU_7fy6*;*d8qq8+0cHOdPZ(3C3oD8G>aE4oIp8 zq!4NS4wTCP8cPGogYF>$iGkQ43}S;YOdhn30>lT&fx;cc24R@|8$4rmAU!b0bU~{th}U!MOYcSMyRKUyXA|oTL!fbcJ+4h99Hb$AYLA{#2jl#j2CxjUp!Q~g| zu)+!HOiYlYQ5YB+6#ZFQ;5D1G91lkWEbp}0NFgt{vQhxwoDRxSC&2e{f%cjkp^YJW zC9o`z=vtt{WwU_i)ItHSMFw0;8n{+2;97lv%V2>6Gnd5zn^VhEcuy5A%vhn(X{6C2 z*r22#@F=U{m?VQzI>U-Nj0=j{8ZK;01=JU1H7+?jD@;)Uzcva&I< zcUc-c)Hqs993NasU~cL-C?Sw?!6en84KfD$20HHOBQ5ZR=NJR;i3ORb8oXvn$H?9l zkCltL$--z16Pg;TX;DR zu_s?(2YK@VVw5sRTHp!)F$NK^58*4o9+)X~X!IP^0Q;_Y@y6{&#+x~rF6KH+2$En9 z2762javzp3%c0v13M&lQR)RexJ?Avfr3T)64t%c|_`eagkVa2(}n-!^J12**|*@{vr8{7-Mgd4!7Aw^&}DQ3v|`{8 zj~d5O$()Fes12>r2U=q!iW)DlHgJRrUb}F4vdBf2g$~WUha`FqwxvE`jlRGd^P+X3 zI9u!oR@ef9N4FJv94&GpBnmdL#vW*mlPGGu$Xa;A;LRcZ9%kfaVH4S;#TLor9F!?= z6mN@BC~=fAV|l(IQGvaL!AxYW1NTb?HU>e%od(+tw`|(U$;8NJa^}XpLoc4Gakxlq z@F6S3)c=M%7Pf6vLCd@473)Zi~%%cS=V6V(DL(W zuJj=@&{{Gl2T@kRseA@gS{ONI#NXMb=>Z<)bYU?N1WgGhvYi8sit?W;`F%7u8h!a0 z>X4|L1IYY+EC%PD8Uzh~9L=5WU<$J0(i0aJFJFGspGR|}o4^a$gav&$1QP2CZ-;&0 znf~6!?ka;IXtf&y3$p?*s6IknyY|WLd#YJ-k684UDeV^ue|&L?@bvMJfwcXE*iq+k z4P+2)KTdWc=Wz$1?FTwHzzAR4Z^dZa5AVb;DQ&+akX4X_Y8^ZznS)58$6aaN{=+tQ z3u^z#bS>oYT6BQ<)B+o%CY}_|#vQ2aE+lR2wgcL>n*o}sg{}Qd2e180 zt(Ak>P=eV=qj@0@hcQD(fM_DGt*xh^uK-sLXbn7zX+SgY=?1o>1h$k3Y|c_VX&cyd z+UCuew?vKO$QH){X7d{xOmY?2(j3?_4W>9Iv*m9{v|u)CU{-_g8WL_%y1hZ5NP(@` zfi2Bo3S%Out+Jq**IDKYaNT^fCklGPz8NR}{^1n8`LJMsteq#wpQ~qE0KPco$BMeR!7Pf`J=DQ_1Y+ zgAxa=9vO18C9^1SJbozABRJ#xu2c6U9M3e@zUvj-QLA(7p2Wf3%b))36@0PAvOU4T zP2pM6t@>n^gp->;>h}otyj=BcpMl$l^Gp8!J|w{y+nn^TS8z*#O!GbiH-qoFvwj_t zaD3fn^PW4IrRLnPALechO$r@N2PGIenig<@ZEez#=n-sC;MkP_a*_f^^Fay5)AJVo z=@nd1C%O8*gk#;SM{jxsUzqNAd{3gW>-o07y@Gpcz54G-9JD&F^Qu>HiDJ*YdlCol z9$WRdSFk~0$1{jQ(fDr zn!71<=lO%|=U;Di7p!d(#4HYoixuvG1Yg|0&v5|c0fm1cF2|w!p!*Ra3qLPBJtV(@ zN%w-2CS<(baXI&b3tT%Va4$1}47uOcYiZJc;-oj{5M-RaWRC*Z#tq!N8@Qkbd_AOb z;*j1OCoQM}&$*W{aPPUmy$Wgoo7JC2y)R8VPhhK2Uovp*e!#tY0XxKigcZ&j9}elC zIV1-$pm8JLq6^#)3b<=v23YqrS+q3ket{YA)`9D>0^j-v?8-<1FoV%4}>5O$h>5UA#G<%$qIV z9BK_sH9j1yKW}Jod^8Lac$D0xD9_FI^F|?fegvxUZ;O2Zl-YRHK0s{>Q;m-S>yH@) z2adBa+b!lyXXsH|;F!RqD6h=&vqvI?furf*VllmmT+0<$)*RqUQWX0az+Q5ItB`?x z%>k~(oQwvu6j&B>HXF=x;MvS_vEYct1E&vXjU?Qm(dQd8<%sr{Lz*+1bWSiuEnxLL zaVW!yA)zhm zFvm}cLwp|$m&iUyZc~sq26-AB5l5u59zwNVk;;D9BVhxI9%kv3hkS1uWIhV;FE5lz z7UW;d$(V4^_Qdg~nuhbx`Kv9BVxI;08*Q&R+pam5HOJK!eHIIB(q!q}LjJD;hQAi@ zZ(x+pSqL_X(c{E%ripNq_6mysS-^kL{ztR@1-9G+t@c<=QkE-Y6#AEts%$84-Wy8k9Tal(Il$sGqrI|&%?H&aiHk>$cc|I9nS3-{)Y&hXsUWX>#lg;P zO=C?@0`t!q<;9*DIo}(R&poQ}; zmQ2crpiCOH1aRho#YIp>B ze@ZY)e=<}uLn|d%)b(Hv5K-4xnqeddDJ7mVVwMsQIp@GiiKm`(IMjODYkU;=f6l1n z__*;ij#8r2YX+>8=aynM=3F50ox}-N8TsNO*IFOxBP544-Ll+pVVMM zx{*n}iBpA1Uf7Gp?ij}>L$?Y2lD`<`jlVJ5v2lJf^q2tCv#Uw{3{?B>N$O{yIclGh z`k#gJCqBym57gc&r2gMm;l#Uu53&9`IjH#?wCZzOVaKed>9*=cTyyo_t$Z%rl zQR6t6aY&&@P2e!pr01K|RgIJco0T*kY42O4u3-c+X-7wmP6OPe&3g5Vlr)64aCC3z z*wN8Fe*<=tJ~(OV9a0JtQ#LHpdv2s<2sY_XM~%)2xJl0XD~yy4g>HECUOBOA&FPg_ zu$%Prl9qXp^8Dq>R!sUI4ry6|O={?@(Gd`a`R=m*#zV?hLVr5?e{k%*z`f=Ns!7d) zzBN4=kCI)4<&|gskeJB!$*gO4g6y9R zo%o(4ACWn6oWp8DzhFLtyz)H;JGVWIH9Zx~KO!UqK5kTK>hE+El;>9YaYI7l!SQ(^u(ERiP zlY`J;Pv5M+)JUuLkot-yExX6YznZi_1w6Fyzx9QC)s$27e{`-|!F8j7cmIl0(5UMG z?`cU$7dBdc$rz*oQq?3dGs#Qy{kTzZApOV#1_uEigYAxz;fXUZwlGNe3N&48ag;EO zU=Uzw?#xShX3*ux;l{%US`aXM_OzLzvn72w8ZNRZO882&2sX1aI2z3O^ekUKiJaGq?#x)xCz57+;H*b%)*mM7H(i{ z?B`{x$#Hl9ZClKEHKBLcg0s+20VQY&9ZmAPKO2)GU7?j!g8JZF<^qjxj zb7ub&?tK$@PQK`ScZ2sN$bHa=eX!VEA=w%!Vx5`fr3H{8cEe}Rxsx^Lg2ECdVprCN zJx7YzWcka9Gp}Pt>=X7fq=?<{BXaJH$oUwCy{yYphemAUs>Wk1^OZtQ709~iiA+gI zIJi;4j`_zM$rVx=J|8rlmhxP8eB#8&$tEhp{>hl($~;sJH3<#}4HW{I9p0j95HxkW zA`{r`!Yi;f-6S!s$ni_*9sMiM3&?x3 z{faQUaC}lDtTFmBfQJ`aufClCXMVf@XMUaVmj|lg=LI$}|~0ztSZj%#NNvFy@M$f9V?->z^b$|2uJ^eB%iXxOF*bEBr19v!DW1jc82{R>FD4mdfK09^6t^^CG z6LTNTPF=Ak!K9Hx$Kgpblajo&z|S*6C5Hvuf3V!wIeeA%uwbo$-9huy4XKT$Kb7YT zGJ}>DUHH(^_Gvk%8;<}3%Rz_Ji=|G@S2NJ4e`1`}0O}dslDix5&*5MPBPcUw)U-JN zWM(yc+Ft`z|5;h~)O<||Lk9){7UsA8Wg7L%5~e9guaJ=G;a%6*<#_PM1CZN$c-KMP zzQQZB2Uc`w1uH2lN%V2tbN`VhxkXpP_XHC++s_CA`wx=74_LT)envRhe=t;9(9hai zcw3t?#WYFl-W2Kni3Ygy(HTkD0D`sgjtu_ z(q~J6rOdX8&88QOCLDI*o_Z)z+A;zvAqkd{N#xT2^#kLiSQc~sV&-vY(SB01nMYoV z<*?u}Sf@C&hrR(RP8#{KzIF1CA*Vpo%BjEDcU@)Hs=bk~zZK?55c#_PlI6smpP@*q@(}HW?MHYFfG|4Lq_*l3vIoPQ!X{^cdVE);o)*)yh zBY0-w=d(r~hd{yRDhCQS=?#tv$K+0?PdmWt#>2zFa!{dZ*c9_jcn#bK_5h&OSKCm@fE&&Cb1vHClEKhg^&A1-RpJ{Gj zm?PAl`vE#`*9(5WP^uZm*L8BojwP zF9q=uHZ}Nvl7!~fwP9TIQxsv@U|j@=x53QfNpfDmiR1SYCY;Y`(q=p?cu?Q+zD~2o z9Y+J1z$ueIoi%#GD94gEXL3y%=NFi#_sv?J4E6NBO)C#HmBKw;KQ*|K^__}5_XCip zt3aNvP!GRa?#bI)~+dI3|SIolKv`AOcMmMQbnZf-?!@sVM)@bnn;Q5(%~Ta=ZJc#b_rd`V)=dG-MGKh2HZZe^uw}7rcVJc)IpM^6 zqLDA+AfH5l#0tqfOuRh-3f!g&>{bb^)(H*=*=i^C^Zrtim;T~u7bf>hWj=Iy=PBk+$i zTQuI!05pdhA&9#E^9BP0Lkc4ULkANB!wt}xW}FNR1vt(#1MO)AO=^So%7W|yt!oF- zAPf=*(V(--K{N=1=1xE~2!rH7_Jhta2k}9;3PeCLNFKDd4s@0|NCjOdR(cJ+yAEcRqfdP4+FX$XIs4)1xF0eY#fFx89>ppC#9KLha0)oQ~WT0zF zL1sd=z$wuBK9D#wGXt`>!SWz+(7I`mpTPo90y=HXpaJ6J3Iwz;0ht9-4q8VAV>2>1 zgZ;_{k^rrJ1f7`%T0afrgU(EYvOyFh17wf2B!~l3&&0q0I{ynK#0XN)1PNDA*n%)f z9AqbK$rgx@zNs3tr`iL$ryAr}ke@;7Kw`*iK|y;!VQwdMrdkR3ycb4>xoCTiV%QLK z=2Hgoo+CBzdPzKIs%7Bb`%LVaYHLNBdkkNk6=XS@utY$}laGZ*S-@H73Ul+}iOX0I z$YgzrSDMw)ZQIb;0o`>h60z&01H+KtTU^-yKbbAzgfi;hVj)ntV>t_khgBkgr4@YS z+S5P*)o_szuOyZQJY5R}UYuhPn8&!lX4+wc^Pd?6Bp4Vv8U#4l6g0r|i4#ei8%Ehf zyn81nQzK;EUxK9eY9q^CMtd~DE0Y$QZ@1iKV7_Z7C)30n2aZ(5jz&f^ma}Y33^EB# z1&K1Z9=uWGXfbkBn8th9gcrIin5D76Ou<7XP&6@CnuYDQfk1$nqd)`ifwsm6J9r(p zCrX&*H%-WtW->^)BsT4t*_UJA)ZAHKWomV5y*!!O6yPJ=(gdC(UUW+#49tmV-x1%dNy3!9pGyPvS7 z1hAzAupO56NEKk0ZZpYXwtQfe`jz#o*>tz*-=1wtRD99EbM64oy@U$pMLdrZ4jZjt zl$_Eix#r*oHfPBV2ishWz;;A5Kjd9v)X~iAEPLaiY>vb;2L1-#qiSrG9~j_^$XJdj zoz3k7olWOr^6b*NeK$^kcgCK*=qtdH$-IfZ<^p@&2X=9d7AH~Sb`^?-m=-Br{W z+{tskRgZt2&WW>cd-Zxi8=ae}jom1A*139M*dnIBa-16uqXrU3) zEYQ)Pj>cv>E~&9MOjC|*6-3%XdXdfXvYC!^dh89;io;)h1vuJ{UJ$-K`3lRz37}&@ z9WR_nI4s1Lln{Hvw8v2*CUryNg98V6khiPmMsS#HFv{U+GgMe-bYlb0+|tB*4|uO{ zPvm4a+@NH_u zrGv9v2dxe21oexc=bM4{nYnl^6i8#}TK&eW&xdmehm zS=)3U_!(y(HAB9^&Nyp07?e2?y7$yg!r+dXE_4M-hvVf!4%ik`35(cpQ>es*gO4k_ zpb~D94)?=tA=4xmCNwT?I0%})K%N`~%>kQa8rY^8psp~1%+>ZvCxl3XCN9wTqBxpB=Bs284%RbY`B1l zTj2#{Ee_)(t}+L%B?s8gLKgohtW02E;=olf0Y!QN`%x6>Y5|0F07!QxbS006)(uC^ z2~08zppgbLuHJ#G<^mfeyc?D@$^K!~JisW8FyI6Gk_GJ92m=nvPdFsEf)Uhvg_hvZ z^X2A#C=$xiW|`Z1>5`YFB(pE59NvLve8m8C_ar9+!`# zlsZApRM_|mNDO&=1vK6QN}nLx2I|bZ3h21aJhb+40@Aq6)Y10w&~G2ZTDlAjRB0bm zd)#IcdF^EIx%dM$Zu0;%ZsQi(<{qvd?lwAd!-L~I7&?#KjE>z5-mx2QW(8mG7-3P+ zZXgDfGvtpkNLKu<%{Q$`8W416eFj#OgFobYnKOb#$eN2S2zkiSm zbg2%*==vB222lHe(E1qAxoDvA8}`w&(ijMxl~w~CLz<7)PESD^Lz*_)P9OU1^wBXS zs;~V~xGXm9nV3tO_%pLGx6wf)oQDe2dk_gUcRzaP73^#Z(&mXlXZ_J`{SObbLa$kf zgEHbeVdOPH*Y|wl*NWXF8@)o{#?0pHe?j9&FQDT{ztHNZ3+#xssUJt{r=edzLB^0k z6Sl7s)HFi*o(nZ3R1 zo3%jWNua$)AXVqGuxKAs)0-ooK=z&i?d4%$V1U^V zS{DKuYZ%OHML>Q6`KM0clZkx1w$kng3u2rMeHcOh319@>2Z`{{=-3GZ{2Y6HV<+K3 z{(kNut`Q-jL9TB8LB5XAML?l`!Jz>G{y`zGF5nGz{sFE*jv=1@pnH)(@qjMx7~~ET zW&BxO@#1r94PoEIiAgDC5eQu7< zA^t&Ojy|ETDEfk2{ajpwKnLo(G9asm`5MJMO#1>HeOyCAT%i`a1bK$J26_60xCZ$- z`nU!K`9qxI=O5zcAL{1gyjA2{XsjFU--$(*>fPfq?DR;_B<`>I*glWR6dMa&}N^atXv#28PhQ92Akz zf)pfsG#T7eOM**_(h`$XeNxL(b70ySf>TR^Qu9($i$W5M(o^Bafy7~s1l#H9l3A3R zTw?6vl3JFToN5^#oLUl)S&^C(oROH4S_C(bfI8>=yyB9?yb?FK29ReM7#MR%;e7H5wi81HI zf?^F#hS0pkq?}Yxz$AlHA|f<1L01EU5(qei{POd33qawfo1dmzQl75>J?p+$A+abG z?7QO9f`a^_l2p*lIXM2}Aq7CZi)WClbBM7^e27PotD{S>qZ_E40NVy}3dq5r^jMx) z;GB_|nFr-Vy%3OCl$e`Zl3E0EE;K)2rnF!eA3b<5rWmJK>ZO1aCfMIXwB zE8oNdh3MSG0)=9H=0GDHRMX4;b2NW@FL=*!&3Vb3m3#M| ze%7`sUuXC4txXPn*%sYBza~7qJ^SXAA0Ib(Z8ED}AkKGdBTxK-qo2g?d(HP( z(SYNQCD*jl^WEn)oekaM>3OdCQP-1(Til-Q&zxVbJb#M=628zhn3I~90!~Gsph2Wj zczij*6+rWcON6_pTViraeo-Yfh*FGG3=Q>CazJtTi zyy4{uia4lxE34qt65qs%%-qskH&DsylUS0PmkdiM(BLHAe~3f~Eh(Y3G|rL|Vgmv9 zf+7s=U`WgbB^H;Y7G+jJ3sg{fl9{Ja1Q&%D#b67lV19B=WcNmxtKu+xL`OThOP!;M2pZ={$9uJIs_Q;1GVOwQJYG!Icz18MF>BtBS7LF!FN zlNeObqM8?wn3Gz9-hhDT3wUJ;_AGMz;@1ahNW&rqVk@e>P?N#tg3=|la@K>iRrDZ5 zK2#8_2rV5z^@CCu!pk_^jch(PgOTO2*&h$SVH%Q7p-w_|AXEWCbIKq-K~{(2o_L4? zt`o4Uh{V_M`N=z%^!GVh#>-psvK%=mHrG#YCGAt7z~w!rw;{}fgkKoAp9(3IP@RcpEVQb`R$@Wi zN60*QW`$U$5RKbJrvLx{{nuh}4smpnVPIgW205DP|9>V11_lrxbWRXxY!oz*0y@hH zG`0sB*Gbs z@dgaOnaM@@#rbI^3K~J03LZYeJ_?Zhr{J8QTacNPTBKlTpl8UiI*@^Zm4ShO0Ruz5 zGXn#IJp)67HOPE<1_qFm8yFavHz3&j6QJw~3>^FmU~EPX{sm49pktT#8yFa#Y+&Gc zvVetwfrWvA5wtWAgcmR{gf3tOt6>K58yFZ?A?s;i2KLBbby?`8+cNa$Gc6sS5< z!yIvE8^dZw22c#Lfa4HkTmc#J!3d5IP+TzVhr~;RH8iY=jt_9yF@Wz5M2?FMpm1kk z_}>7DAEpKdhR_WR4F4B^#Du|d&eOoaAl<+Ok1Od$28JhKJ|hDt?w&L-GK4Nb$b9rzgW1dsOdvC%Y)F~`r6(o^{stzH zevT*Lw8F^1-vBlb%4cDKqzzDd1F2_b;BR1ts)zWG5#;U$Mut@&`;pwp(7?#>9~>@> za5o{;K-`V2h6NN}DCRIRFoXC==CCv{Gl29U%wa}S19BhCy`Z!X;=}v{8bD$oGZ+|Ffx`*pcaRv!98i3M!itsQNdqL`LBo>a3HE#i zN~|CZF254t`70b$;4uCF4_c!M%U__mh!x;`14`=*3>!fDK=)XJ#hAcpA0~DjEC$JQ zFtKxBG01!dOzav`-UOX-12z(Te=Nj236MJ&7#K9bVi3I!P%+5Wf|z;FJvl!$EsY@v zLPh4Mr4^@^FqCAZLI;erOEO?1!l4YSL1ipE10w?>?_yOM#;}@&fe3YxnCi$W3s}Hq z0eCzG93&uu)Up7oegYGgavGKnLFG0moq_m}^z&o`6UP%!zF}ej=TA`D2Gt2H;5-G% z|LmZ=4Z;gJ7#NsAc?ncjFfu%W@!sm_b`Jpt0cG#1aM7V$`uzg``Ra&`^ncKqyExYWo@5&Q32V)q^&v zQRR^(klV|c`k;+($hbSqFg+ywa0LX+fi%AHm;+Nlz?@QS>QLMRRZt3^*H8d;Q5Evb zQj5}Z^2vSGGZDX12M<}VQaaijo;jY@+e6*@ld9uOMu;_4I%p2$NJ z_wf&p5AY91%)5cY4L;5dHMamV)*oM1T$u+ta|q;r6m_70gINq66J=&nW`~qkd<@|7 zlYxOjkO5Mr@qwC5(6$FZ13Rd}1TH&4mz#pj1~tGy?HU1an}UG>R0cCMFoPOw3=vGA zh8r7LPf2A#svc~HrSo zNDn+03ObXLm4O}Xy8O}-utacJJfvIB0J0ZSM#9|b&cFgTLk?si0|Nty4{|p$A9TJ9 z=uAzJI7lAESA?qfU|^x9828g*J^$OtDGq}+MwhP1u9ghmq2U>;= z;)Bj51-Ti-7iM5$0Nr7)$iNIf#{+505T7x4x|UP^A_Z8keD^p4v>FAVjw=q z4iFn;4~P%51EgPvfepNO0<`xZE8TE{vvurh$$BLPZTOk`kya0;OtD9KqZROZVI$i@|9el9oYykUEe& z$WO@m24o+I50eM^6~qS_0a6cgHz?d-@*qBPzJmD^majm04JHPnL21{60o0-anF#K* zF}O1@gUcF_TL|SRP~HT&AC%ufc@4w{rEidFFg_@K!}2O9&w$i`{2{@>0?$VvJ}7U3 z+yqL`pnL>!8^{eHF;G4OrDKp@kQhiFlvY9h28o0CpmYl2gX{qDLHPj`elR{L9fJ5E zGeCJ6l=eY+8I;~ZY>*yM9srpSasw!Dg4_TKQ;-;l53&=)2H6ARgX{#E3FCw81o;Id z29gKyL3swo2e|>3e?a*dWG_fBD7--K0Oey)J_6-YkiS6r2V@_J5Ap{n|A5Q_Xycpw8S1IVwS^a3&mWCu)49-22nb_X!9gUb_89D>w>@vz@*p1QP?L8EEGSt`3x5p#3Je7$_}3`&i%> z1jr5OZ3vLvps><2O3{OipMcs4tYCYgVF`{~P#XkfFH{UXtp*YU*$Wjj0);oItOeN% zHnSKq!4DB&r0}vmSwm^JP{Db%~c~F>w%5jiBkUWSF%2P0T zP#Xp$4{`%Y9>hnM2ZbrJJctjHhuH@TUu1a@A0!Vm4-}@z@*qA)9%er%e39ire2_fI zd{CVNO0yuf$n^|J3?vT{1Nk4O4rC`t43uVIVjzEm#6WQl69ef1iGj*sm>4MBKw_Y> z2qp%y2P6hs>j@JBg&#-^be=p+3}hcjOoxGi0VW0tN01mO0l>sSVFwZeEogv=fx-(U z2AVd9iGkb-5(AAdg6d3=J3xK|)rlZCgWL$J13_$1Sq=&x7#~!Rfa*jTA5@Qk)>Xjx zpn3ze#sbC%)f)^94Gu6qsNMjry@2sSbq8o228<7?8$fF^V0=)W0$QH|<3s8L0Y?}g zRF;GK&M-cx{^*&jU=QPi%Ka15SJ=V$ptSol!_XGS2h|z7ntI`Ukl(q|v*G$dX=S~- zl?_ZiC@p2XwZZwIaMX0z0@n|U%k8eIaQ&(b3=B%$SKxfmS@H`C#P-9?Q)ggcP}ZHg z7sdz0d%e(qI3Ki_ZVS^yxPC1L1_s_^9D88uwHX)~HgBH-=Y!J7S=MuK{kjYc3^vC7 z_Mr9G$?fdSkOfblIE7#Kil7sLmp zO)Ie5!{A{9o&dNo4W2f@_YyQrh4XD07#Ol2oPeiAI|c@ZHD~>8KyC*O(16SY`3=;U z0r5fk2&4vvVd9{H8j#&E3=?+(w-G@7WC(_dgC;0IZi8W%IA|^fGuIO>%wg)h7$EIr5Fg}MZ;=0ws+)uS51PvX ziGku?hk=y=#P?-jU;wEBVVD?boiQvfVdnUQ&o^L?wii39e!Q%?F9Cw|2B3vFcyk*PP4v*_F1_p*%GbQ1184jAK((|>3nGc#r z2@Sn!C&$1KZa0DahKxaJ6PXWUgT#9PxanYGcYjZFE4_pWzhWI#O8Unps^BA zoPh4(ft8;{(7X()hhg~+qz>c<&}th{UknuYptu8B2}%o~z8I)u0P0tP%mXd00EI1x z4@yg*p;1uygZg5i^a2_X1;sz8EC;Cpr5(^bBS?G;11mTUf!2S4#6a%&&cMt7y9?+S z0}BI44m4j}!@$4*vKz$y$-o3w1LA|kVdjAD?g5ztYA1lqsRKEhfq?;J4oI$^fq?-u z(F)QBVuRcRO1F*Bx&p)p<)0={J;=bo5XQg??u$1wFff4BfW*TY*uY^9x_1a94)QO^ z8jzbn_JPa>*#UD?D+2=q$W5TO3dl`uAjMEOf#lj57#KkFtss3M_C*F3aQO&2hZ%j~s*3?K)(I+SLGA>FeK!LG14!JTfgP-;hk=0sBnHBuI0MBCXxs@DFTD&53?MT> zYIqnp!0P*;WdNw22g!rVWKbCl)6>tuzyNXsNDpW{3}ns(1_lO@K2Z7F3@yt+cb|aN zg5+RgpmQ}rW`Wf5FtCB`n+&xNl;1&mVD13TF@y3es67DF2T}{uHx;T66jva9jZk~1 zF)%QI0|Q7LWF{j| z0G4h*d$U0429z&B>1H9w;m~vgl3T>Uz_1vaCqQhN+d=dEpz;;O2c_kuP`AU}wv2&+ z0i*^b4ol0+85kHq;-I(&Spymm0p(NBd?rW^S!^W(0|Q756oxQ$tDs__GzS_t0i{jQ z8U&Djkb00j$R8lTg8TvUE6D9IzpjDi5m0*{w^S>DvR92c=(-K3IO(%fP?@l0(iT`xqD)K;j@XVd1hLDO^Co4~kz{9y!3kzyQ(% zQUgj?AUh7C<&i_sbOy^KhoRvD%Ogjid{{a>%D}(?G6SR!mPd{;Fff3`LH2?22*?bO zK3F;f&6|VNfZPWYJHf!f01^Ya7bbQRDh7&QSb99gz`y{~4^j`3howhQS_7p=Q2K(U z$J5aC2OYavm*AEXCO78FaXtAPZ$^&K;oc00Lw2=k@5>j9+oGcF)%QI zF2fdM2AQU{CU*9;5{ApIaS zVPbEfVjw$UVs9B37(n`w)xCp?fz-j$_1_lO@ z97qflCZM$Woq>S?B#xY(f1su3p9~D(ad=SJg7o}iU|<001Eo`#IlsZ_ih%(+J^x`~ zU;v4O)WOp8UvPS3U;vp3bMHR}1_qEgNIl4Huy6q_tpkM#2!q5yX$%%FpaFX1Iu^7U z8PrFC*~0`1M9|)3Mg|6$JOpRUg^M&=xFDw&(5*4Z z=|vVTT;v!T7(i-3;xK#U85tNr;vjQD_Q1kLfsug$BnJ|M`A3nFfdM3r94<;|;i8Nd zE}*^gAblYJ!pu=+WMBY^BZrF`BLf3S9Hb5wF6xX73?TDCX2RSHT7w1>2dM|S4dz}= zMg|60*#j%5K!+iK#E~(modaq&YJ>6(0|NtSYzmY&LFo{r9wx7YBoB%Uki8&zn0>lX z`#^4h*{8?IzyK0Q#xV2rk<0_x4Kg339#pS^>MT&b2CAoE^&05nTu{3lG?omi*9<`! z09^jCFo5KY7#SFh86kaD5F6H3HDQGGrC{}(DI;co&Ww?P0VEDfQ|62e3?MNO2IVzS zngYcYsNS()WMBZ92~q>{3rNfo>K9O36(o<|R<(k<0i*}kR<&kiU;ya@#V@Q5v|(gm z0I3DZ!NhDCA#GKVT3DT82el7Wr-1ap++hzD2enmU`ao)7`ao+GLBR$pGeG)4Wjo0I zpv%iZa-g~wCg#M*0KU`=WF{6we^DVBzAz$iM*715yJMa|NBh#mK+_@;A&} zH%0~qkT}RLn7iDe?gqIFBoFhu2O|RmNDibHW~L`20|Q7LWDm?tFD&Z385tNr;vjXf zH0s01zyQ(@ayv{6bYT!k4CEJ>m>(kp14uuzI)A7bNF6MFgVvsc%mkSM(gRWh^HU(y zPoOvg`3V+=L5vIxAblVVG9P3ftQ-$UE5}37%BxUD1_qECkT@*=hcPlRfW$%Og3N>Y z0kl>YBnJ`$g&n94j{wz+j0_CO3LUPUu9Fo5)d(kaZG7)AyLkT`OA70bxL z01^kOgOyitj0_AQ^Fe09+#AoxzyJ~lsRy|Y7A^^B;R4EYuy9F43zsCca7kulU;wEB ziNovx-KPx_2bl}92No`=j11trwn1Vr|D-W8Fo497!zCRpTr$wYC6keX0i+M)Uzj;r zj0_AQapZ8xW@KOhiG$R^!X<~1fdOPb$V`}fa~T;JK;j_vAh*H7B@ZcFKxGkfddWu% zmjbkKDP&||0I30q!|W+yWMBY^gUkil0}Gd8Mg|6u97qi2pAtp}29P*%xRj!WOBq_Y zlru6gfb@a<3p1yJk%0jujvOwPj0_AQagaJ#xKuGRFo4VlnF(`mH6sH9NF1adEMg|6uI7l5VTsjyT7(nKO%!IkO6LeoZ zBLf3SJ;-q|_jZBuH?-`5l~dh}3=AM~WDKe^K=pnPR4u692jxvrIs~bQ$@e13gW>{Y zFGwC{Umw&ykQ-q3^)oUsfW(n8%skM7e^43**$1*4WIjkesNM(F>7aTaRFA{z{fVG- z!T`Br7F6#~0%?ZU`yjc=j0_B*d&WWfKx|l<0lLEqx$QR%Ee%X(WMBZP0g1!HbOs{> z14tZwOkgG>0|Q77v%l#zh}Bn~ro86yJ&NDPFL z&7A^Wzqy=|fdOPTNFB`F6;N|QbHFfjS28j%fW%?uu3}_h0EvMxHgi`)%>}80nY#vR zE@&1_qEg%-nU13=AMK5XNTidZ@V|b+B~2fsug$6(|jY(i|6u8K7b61$NE|(#?nXMg|6uILzE*j0_AQF%U*J7nV+sGcquM%m%50nR^0i zE^<0O$;iL}5{H?4ijjcijINd-s_WPShx8@Q}~!pOh?@)yW%kUT8TpF-mtIqg4VWMBY^!{YooBLf3S z41_^uf}#XD?Z04TU;vp9QU^2lCDdHxwEv2cfdM2AGxs$k0|Q75gptjKrTsUI3=AN% zLF!=UzJ;2Loc7-_GBAL|VdjGFPX~#CFg9~RcXWZw1*wCX3p#HZR97LVebC{EAaR(v zpBWh#Kw=<_&D<|g_kz^H(*9RQ1_qEnKz4%UVQC+fu0d%Zl$Jql3m6|ne}%4N`o_q> z0MZXi=b$-xm|9rA0nsqE-x(PgK=}+*c7ybR%mJATs|!FhOfBf{c~IQ}YL9^Qfy@D^ zg|%-$G)yh%t}{@Z2sCB^(g!jJq!u;?0-|ARLFZY6#!W!u_8@&Ab3kfg^8g?kruH`@ z0|RKz05nem(g!jJq!u>s0-|AR|1dHzfaYmHb9^9uAag)!VRMEc8m9IyBLf3yjuABX z3DO5L2c#A@mkOd`YX5=S77Ppwp!s!>K9D&ewXpem5DioNpOJw9G`A009{|z^G6$p< zv?c)*k02VR7PP?!v<3~dCIO@mWDY2ufz~~Mt_TLDGtinhP}u_N_cAdtFo48iWgs(X z7a;5~nl4u+xg7$7dF&kt%#v4iY^uEzqY z%zhQ9{jfQGRV4dCa%xNr3?MO(J`fwGPaT>kVEQzW^nv6wnHU&AVjz7WHfS#f zC_QRH-2_^b1#%Ni4TuKC6-bRXR1L^Jkb01QSX)4ciGcwm4+=||m@ZTdR1d<$^q^uO zXMxf!C|~PC(=8~Ufb@XWz~l^&YqAGiG970EvP8 z3Sz_J$OKCqnKCgjfW%>adNU>l29OxYd{7??pWgTc8 zB64{G%hw>j45|;brV$h$ zAblYFKx$!WJRGV9w8j@y-+ySczmuVU0r?vw4>K=?iGcwmhwSfEs9KP}LGmzv z!|VdlFn^~pF))DK1ac!tAIKdrf2TwJ4e}by-x*8{3?OlszcWFS(6j@R%VJ_+$cFkG z#D=*u2dWR|Z;(Eazd>qY{?3J}LH2hZ)Gr`^gXCf6w=J@;68x=5Lr? zAR6ZHLM8?Vkefhm1nC301J=$cVq#zbr3X;hfYgD~3@kr@XpkA8I;fb5fdP~sLHQG; z2V_1hAC^G#A!r{2EFYFKF))C{VdZHV69WUt43IdioGE8wU;wS_1<8T@j9kvZ;-vx_ zFQB#zXiNrF)>JYvFo48C`a$9#H-pL)P#A;C5m>oX1ub`Ab#gUQ{DI_Zm>3vpq45V| z!^)jHsGYdVoq8<(1s$XT5{LP>k%@r;WDZCi7EVo2eaPiiGZO;?NE}vPwJ8}^6540Zv6xJYpAp1aSVP#bxG(Cdi5o8CfTGobol{s!p-`5UAb=I@zM|AG7s zvIFMtSx|A1zd>q{{XLtBfdM3s?C&{D3=AM~n7?6mfoPb&=Q1%cfZPOfBS<~S9WZ~- zgZdlfHCXvIpNWA1Bo6a8=%6Q1dH}5l1j#LAVqjPV^*4wO^Y>z?KA68j`au2$sfGD_ z3Dkcee}n9R`Fkl;9OQ418f1SjV`5+c$s_xFITHf|NF3&Gm|Y+m=I<3u3=AMQf!qjE z4{`^r{94JxzyL}Qps)d{1I?3w%BxjScYxLufYgBcfS^43Sa%0|UqnAos)4^?oJ>29P)`T^~R) z3nX`tiGkq|Gz>v(Sh_w8)dx%0AblYFKx$#>`Uo`LfZ`cs2P|D5g^GjHHAoF|x<1Cl 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

    vlbe}WT9S$uGzPk+mS`s7 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
    DhkEwypGRa$fno((Bn@rC9~n9=tz)iuL-E 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

    =+zoqTChD00l06Rc7U95TBm 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�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 Cnbkhj-4Gae8#e? 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

    *V6p-vZ-0RH{XLTR1eVx2xJ8K48WK!?R7fEq3l zoh~X7FXpg;8#tnCBtXkVLLh1qUbM1-ZUS)T*a_ON+a013;MsjZm4ShS!EqO8Qp@A} z4Oi)tj*SmNMZF{QMeB=oEZrAhvpZT}a^&~91PYz*5S0i_8OO#44B(rKf`z(6R1!Qv z<{WTrd;l@$0;V}4-61L&j?5RVFV=H9T3_lu<;d@I>NCH9D!&A%L4W%*zksg8MPUYh zjVmBu@`s<~-{#KVed05}V2+By!H4YJpfP#SUilY}%pkAo9N-VX4UtXjbXMWlxWd29 zor6F8WcLXa)xuEKX`Rk$p!G@dkd-l@^a@!I1MB+0R{DSP>Hf&SEik0z5`W841_lP> z|DfP@=)V8r2WaNLa}Brwid3j7@P{AhtWhy^+#w1*H=6k~f4z%};tTg5|Nb}sV5;MG zu&7Z{s%7cE|C;Up;no9naxT3N|3Q(b2sZo0IUWWEkK`A&FN( z-QmU3FZ>MMM_(UG(Rc_l>3^t*&!d}r6XT0Sb_NCy)Wi0m2phL|^l;^*|O9nrJD#Y&d#+P1X|KtZ9N^y*x8En-#s9CVZHZQq<{X>p1 ze!Wvw5~X6F`C|@&@|ym^BDT-`0x>EY{2GT3gO==n=8w4unff~PnO`78MdLGn{E5%} z0<2waLJXhzV=jN@k3IOAKl0FL{)oe%@pf2!1IkYlq2T@O;2Zi1e7irS9e3Tp(9FN> z7qo5J8@j=x`{q6kWd?>9LM)&TTcxN&%YXjX5>OWF<$We7!tfHb0LgI&Xa_B*0tWRJ zr~d1Py?gZXG&I!kZssm!=`P{j;`sldWA{N1>qAA)K=$zwwu21w z>8#xkI%cM`_P9@H?RlTh+Uq`@wfB8GYoDjNbk@Evnbq4))`&yBQ=H z7>>Da;(4)~3G7rphnD}PparGLAoB%4yTCvq{2sl$8wEgvV3%Jco&XKBfR6kJjXx@Q zb{A`Sc2^sK3Y2)qIB1)MA2Q~{$S>$9z%S^iz%S@%z%S_Nz%S?+z%S^Sz%S@nz%K}1 zZrcH_|2rE&gJaOt3(c>fsTT00U_!SPzXtedf&h>1PoRkh2aoQb;9WlkX)gSEjNqL< z3NHK_r(F4?54?D%#m>O5@ga>r@3$kr#z9c~`~!dV{}*X`>6j~>w$`w7?lFhv8E2-?IsE!GY)|FoEUuOk2nSz!U_1yuXCW24b&p404@GO zo^nCWe+m5i89^S{F9mi!Xx&BkPp~%-emH>U2Q7%BF#NDc7t;@Eo$N1uX@dO>_e7O0 z@t#P-@CE3!$6T-{AVpJyCFqn1kM5r(zPt3m6IiET+%N^%a2nKPlYdcd%+BzMKaw?B z0CXC>&H>y13=9l)qB}s;Yraj4FRZq+F?<8x8!V6G$2U6^S8+PD&0Y<>u z^EW}4N}hc2cN=7Y8P@98{e`F+z*;~~6#$i|5@C@0gdB`-J9d8n&u+ck4_cIM5gEeY zG8MD|;{P$n<{ymwJ)lhZ|6J=g{=QYL!fDN<`-r^|Nr+){t2p-m3+F7gHA{F?7sFQ{w+TP@(MP` z9U>qLn7{u&{9^Lgf1qo=zSYn5>8?>pcx?n54+bxIgVd)WGqNG-;PvV62FQr8QOy-l zm}P+06X&QDcr+hza0K0<0S*NO;nDmC)E|I#1yIKFTzVbYV4VX8(73f?J2S{%0icmU z-3}KO)fa2QC1<6eM=!4up9sT?z01Kfrxl06!|xS`!Tk;J?wOWLFryT}My+LnOwxjG z6IK2OJ||N_>VS$(hl`2|$P#b}LOUVupxJpyC&VEbl+HXH|2wdF^hPrAZ({_VjnJ8+ zk^m|MGWfR@G9G-!!TrIfGe^b2;oC6*&?(W(X^x!^9H86iJ(>?QJ9ap5Iea^&P*TXh zjTzk76HtA~E5ZP36bk4H9|t!U4?bk)4?oEbZ6|{F;YA;KA@>t9VFlI&YCwVvhO`l# z88O?4?|(p)do&+r0;yDU_;$>pM4Epa$PK*w+ngC4I~+h))iXie#qZGat&*#o*`xU| zi({vQj8A8ZN&)yx9MG8|7LI#CjccFI8WjWnUC%g*GrO5Rdjo_(JHa$~L3$7z%-Dg4V@w1NnK4;T9{RKe% z0jx4YAjk0Udd69t+Rg0I8!iU2ZY~d~JK!(U=`Pak4zf&u0o5`Uh-D&JjRbW*#K1D3 zM*G?BmyY~CZ__&S#XweplDmNq=;jNb?i>{dpY9aU4)Gk71pZymxQYe4nLFJz__sT= zcr+hoOY3yk;otR)8zQWSBy7aL>lqKEYnf5Z&M&~sFX(RK(R{=M+D?b%08n`VX)p3` zXN0W&0iFCm%jvPQ*$JU&~N_9$lodp8ra$HE}7QptjE9IT{^AP*?@n$ zyKGvgvl0Kcg9vL6^Fvf=Kvii$Rq25I2I@eAi$wnY?vkKkFwl`-{DRIV{QKRd)A;is zx2g$xTk!99mqn7d;ot8r50c-&$PXG#6ZCdKva#C{?1z#XkZ(ZEqZ1!MvsvykX`Rj> zXMnn81IHIAtAp!%g@&D=<}-r_=%Sw=9^E$~cbV~T3u1KXKIGW^fW5(vnZFfO znm7L!DKYK7?$OITkzIu0#gYAN4Benv*cYHO9puZR@BjZJx0Yco+`}!GD#Kl@!Oe~m zt{2|l|NnPwJy3eZxtHaDOD_upzknN)BflUE2mf|AAhc^;q%ebKZO}y=&ge^7kYW$u#133 zh%{bGuS3xSnu*o`-R}IdNfxx83ew)#6##D9-0bz*_#z5)qg3kw`2Gse#)@9iJs|VC zPakveWqc7~2U#2i9ZKA3jTC8U=^1hx2k5Ho7l)34*GcW11}Z89*^v9!$DIp6&5z?K z^O0$m{!08)4s^KrluCf7s#{N%h`;F3fpkibx%o1@<^YYv-TDivlmtXSF^Mq1XDUUt zAX|&?f&^jHl?+;-lmR)u0Fgo==@3SO+>dhKDQF(nH~A;HD1GJ8{qsduC8+iHfqxsb z4SNYk%K`q@QZ~>sUuQk$?NK*Wg7PE})i#f+N4iO@57Q z{2GvJC!!C$D6;{DfzAQY8FGk)CkG6{t45e?8cK;U!wAU?#LANzh#AbpneomV;SR?Q zu%#y!5Hnb88cI|_%V%);VgpFG3%||>$Pqly4*H9q24HWnf=1mzVQ1mW%HOgNbi?Tb ze$b*TTaRARr<4Q5Dfna~e0k9dgcP?U_y$F| zR4+mbGzrNL8FP411{G#=vG8SsF7Il1$mqBM=I2nD0>=$}sLQUb5i+2uNl+L=X7tXz zP(Vn5<|RR9!K7FbQqTqca3{Vpgm{b%v~l3TOPCWcLxtI0EPUA!E6W`>fYxw<78GrQ zDFEFY30heWH*p3+2DHKq*@?9XDbR^e$WBZ`NC`j=kb)cNj*t>`L|sLugOCCpNX3S< z9!wA+1=`;L^Vlx~Muvu3ABNKShFV{Sl1Tn--dg; z`hw*xsGaA`$FFgRf15Wy$ae6&UwR5ZX7pg!H_TzlRALo?4$aB<=-?6?P1u!9yy`+&|!6yP;s6k%}f zJ_2%`NB8wK?t@?xAnx1dEDE}m2Yh(S3I1))BHSQS?EB5n{E-L2mPUX(Mccf^!Rj7z zq;Vhg=sq_CE*}C49|pj7AxK6BBP-}Q?l=zzNOFS-q2OXNJdFN0UeodvIuW4^}^zEB5L zv4G|o!4*yK9PrsBkmYdMkn?#V_eyH|a4_ika4;DAa4=Z-a4^{Va4wy-;8RPkzdK^oquUtnWVkVy!8(sq#YD7<`aMLiAzq!ny>=^af-- zH@y9gXk^|5P0I22od&myzyo#N953RTKn)1ciaP$5ji8atZQ%mFUW^_70u8@Tlt~sqoGDciL>;gg^P-E>1pUb!fT*rel=*`duQu``mK;2Q~{__4jq>BfZV|D z0lpht2owO_F)9V1PF@N4_{Id#{Gmtl8w1b^bdW1GOH>p*x^ID6E2r~?7`iz?>&Fg) z){lMWk2Ia|SD4|&?>*oD^J`o??py%cDhqCKLECK}-KU|uVP8yBU_@Cc)&}O6sDSRD zN8NM{8n1z#76lFi@Yo6{pcK+Tcgd)MmT2F)fpLar8pPxL|?c;NOfWMUgUV+`tJfv)_484tD#WJM#$3g~#v z^+#Y6OG{zv$oRq5f*lOraSIwik^qURLk6-yOf8S@(>wnEX8>)%RbvN<=z<7?V=gM1 zpjG@jCdXV<^i5w>K@FFHF0cY03}brt-+yp#u>hK0VF$pF<$iIf6)s@Mg2G9$of+(U zki$XC%Rnwuap`ridhz-p#IGpMS#}49b71)gwm%0nsiEKqS|1tU(_L8L*?j}FKGMOX z`_~JjJaD_&quZIo)7p)LzlD>Df#D#0Vb^sR{%t2f?TRQ((4r)7&}sjU2T@jxJHTa_ z91p%kuIkm`GR%$#Um`Ch=Yh*`Iv#w9+}`-40ken8@!(73M#>Gi42vUp1sA*_vJWo9 z=6Ddad+#DDaXlxJ(#ahQsmTODRYz z4&1x9fynTHHgX+&$%WM1QG(0xIv#w`;qBDN2FREGrszax0j7~J~n zFq!U)j@<_jzTiM!@C8`{#=q@^V>fus7koMsv^b0f)Dt=ZTJQy1=>=c-b%GyhwHMeg zA2dM4sWXRXryGY0|8{Sky`bfXX)fAl!E3)ji@w0>eyD(2NZY;j95=9nWI>fXcuCl~ z7k8mjpgm>K=D{hbkP&FZspI#XP~pu`VG~5ZWC2vj46@J*rm|Cok-@Q>4KlCg$mj-2 zPW=0w? zL7N*UAU&YwgaJ}>0-@8wwcC&71)nBpftNGrMo!+OPr?i!J^cHfW#IOJmu^8CArQMj zd+|UHh&aH%-&qQByduas-*3R&3JDKzlLwa@kW7WRqYWHWn1@_~W`i8STiaj@dg0?4 zufGd3ywsb6Qu!mdCr*Rp?dGG)!`l70dpD1R{S(S7=bg*@merV>lIL^)JK9wMOt zZXqZ{AKobrGDG`d8mOE3YA5)>+{FirAAn0{$kHjef1SbpnT_H&WdACIz6E<#3)Gwn*ue>MruBtVCD2JAVjj&qL2XZl5}p_D z92git+X)!U)WCkyIJ}ch0d&{Tp)~D-JHP#BU`T5{So&lKKg58NTVS8T4=X};fAcqC zhL>@((A^LBe=fY2>$}1G{i>e{GrZ`V4fCG~%zxFWK?WLsL0WGQy0io`N8bD< z0DLL;OVFKdy`m!Dgh6NjeRS-;@ghPB6rcPpprIQ6?JeMYEM54wpL2m8)alZF*rj_9 zc-b?kbJe{Be0Zow_gR3xx z;1h#NeL$k1vv$CCbe5=ifGhy%2AK{r0Aw@{Gi<;I5|wf^|7Pc(a^N+S(E-qeasZ+Q zU+e&#P16ySm`T zBOwNcPIsAO?h=gftAXZmF*0|qY zT|p;CgfMt?dux=4z4)g3A9O|*=r$#UT`vR_pp9$DU@&Op{^c5Vq`^Q?{C9g6K<-Q8 zbm?>ydAY{}dQlRzJqGq4y!~weS|Sg=FX`utNt?byu6ODz<~Zgo!N}jL4V{DdAqc8v zoK-w}y)8PNRbRXSowL~MZS&&33+VLQ5Qb7v+v`Ok_!!tyIgegmx39tsFFtmI=I=pn zMLx#~)P^p%1a%z1DosEtk7HHY?X1xJg1z|%TbVFO(U{%?X1ARJzR-@ zyT8H<7RbU-7SQEgpjMX2Uk1=EQqCeCy}TDdIzCSaC8*OK&O$FF++m*B2l2#ukb|Swf--a*udD)3_5Wal!gpI{VeF@2mkhS2OkRXZ$Hj`!nzx@oTH4b6HFT& zI0im04XO{~U1Xgu{M(Q7ZwGbc(9C?9%nx2c1?rg@pS180D&e;95P+O$?Q*I+K%w~; zb14t#jGj`#=92>52M_l;{RbrhW(W@ymLLqSAHmtmxBG%)^G~i)C&va00q~w-jnCjZ z#vuCTwGK80$8HBEkM7f*&K8c{4s4yyHZKy~K`FB&HSIXq6QHw^L7R7?4?Ffc{Wk0jCdWc^FyX$iM9e$PhMA#@{`Ifq{Xc z#1pi7jjf^DgrUUFp<_4b3ZLW6pnX&z*%xaPK@oh~qq7-QTfBJd%)sElzwJ865JLyB z4-o~NM=$SMO;}O`mu~CYvAPE|Nd;Zc242qv?on437~gj3{_N5H@BIbQI60xj^q0h-1*Y{9_L4ZcSUw9pB@{>t(HF`v%;pkxg?>@T{ZUVx!Q z(5Khk!2>kgclyN|c?O2ppjC1XHi{)S-6uNSRhwTLlt_c7X2qI+@|9}%^twAj70c@~ zFuWEA*>=^5fdNS(4Rk+K_xTrgP)F2vc(mT;Zvib7ac%upTI6C;E>P;>Vo@4W>fzDN zzLO8sUa<5~DlzeZ9%$BlAjQY}N0A5rws;B0-Y^zWLFX>P2s#a>13aj3{)M9p14Bo= z#A}s?+7N~kxrTaG`x4lJXgfhGRXkWhx77Jq|KNB2*svd*T}yQu_JeX9L#cAZen_iE z$)md+l0Od^fvgk)`Dd#O=oBRo>o*SrL-SrxKr@u;fNfH9ZT(iK=+V3v6pG**wtO{S zsK|qAG{_BGXJ33%`2Qb#D;7j!9W06o=~33!GMhOk@%qU26W!x4$!I&kK{{fF3cx9lMndxvIIEsZ*OU|V`N|e zHCyX=)7(0Hz+6ZE?FXIsw@+yVtuIJ(u|8GH>&U8e^XGw2pN8Ba4w{yKk*NrogaWN%J`8e?Px2+-$d#NB2z^3x|*r4^S7;!Lc`x z2|N=1LdFSHn)0`R3JITXAJCDMrycpX1q!@iVq{?G1l@GwDAeh!=E%R@Q7o;~SqoMm zgAbi6ZIBW55b9U)))`po0P93O6D1y_M0Vwyos3?H4Kj>=R-aw`o&JG}lmjt3n zfm%S!FEkuL3sS)iBZv-=Fw+Y`gfMb@>6bm&AP($~@abj*)rZctO24!B2=|NbOeLC4v3D~rJ)C+6WX;5Ky*r`juD8?NYpa{ z(K&erW+1v?vXKRdF1cW01)?j|&22z*%?wLBhU2acx2+r)j=Q#~+Bh*BckL*%bzwN} z+H>B{jp4ZK1bqh&hU2bNra5{s9Cw|;=Iq08+;vW!iyy;r*9HGv0~n6GE@^WQVmR)) zLfkWi;kfIXjb334$6Yss_(U)qcir;eH;Uo7>yEAdF$~9D_Y?=lF&uY2U=y6caNP9> ze`pfJan}>C!%`TIyPmlmk;ZV`^}>;;42I*bR}RKxF&uZjaWXE4;kfIay9s#=$6X)% zNh)AC?)pS6wTR)k>x;Pb5{BchZx&{jF&uaO@G-lB;kfG;zq~4jm}tj=S>At!-mC?kW)5(7|xrRYbSBi{ZGd1W#KJ z!*N%cKOKDx$6XcvbWdP7?yADmKZ)VEtA^gBDGbM5b&{q|V>s?=uzbc0hU2a#|7Xu) zIPPkZIe!kraaWt?i{>#LcXg;(wt%7g&~aB6*;R`ej=OqXU%Q0ixU0|7jmsF0y9RV_ zUBPhNHKcjxDu&~(5tH|>VL0v@v-99OhU2aY-;Zu!IPRL_dukKIao3F9=e95$cg=CS zyp7?wYr&)II~b0;mdv@ci{ZFyMd8Ce498t-5})m3I1b(opY!?v!|_(oElN{99AY@$ z3aamKd_BT&ycJZjTmL@Ba2(u(`v3m~Lz*>DOPSdJLmvMRcr^b=t$DxUgh%5MP*#XN z?2&wkf167S6I|d7Mt*VO-+u5oiwXmS13c?EG(hr=BPd<*%w%>1@dZ3soIrdLaaJb~ zUxJU#8N`<{W_Jeh6((@FfcPqUTrMEKh76A@h_92z=L+H*$P2oG_$IL;ZXmvexr952 zZ*xY*9mIDKlJfxZUDD+}KzxtW3Z5XokG+y7h#zoR*$c!EiBRFOE;@8Zu^lt#?8&LXh zQMCzZ0Oy-PNWKYd0OuP}rkFC#F{lBYZ-OEDCb$8dZ$LR^Nt=5}132G=Lh?;$132G+ zvd@D`5|VEs8^HMnl+msnjEQOh=bLCqzKL!C z=NnM&d!m*a(*Vvlv5qWKK$%xWw>hZ+oNtmL`6jsmoNqumT7{=Sr2(98QX%;!wE>)OK-t{n|Ln8|aK1^0 znGN8q11c3lns;V3fU{0EBv0-hauCzBdd(% ztd9KK4jyj!WnUt|zwHo+QTiP$w8`GHn}dJbAyC)Sk>BOu;WK9%DpeTxTc&BlMv)+6 zp_Yycr2>%Z-O^DByz0D!bqDB>FIYVZu57{XcT|D4$C)-5!1v?8=C43KO9P+on~wb3 zZ#eRAKf%BK*Nd4yK+8qX^Kbj`VjpM~@b(v=!2s#B*4w3Gp1s}{FEWf67(7AaPw__J z{k*ojNJN82G$N&E*GBz*%egFR-WEdyNFczZ&ptIvVyH7iI zG=us&FYcRznmVPR1#B@WO&UrX!)51^azwx0k`fr8H_oy!i<2ksrZ z@Ne_ya_K&Vlty6bW9tWK`d|hvF@+>8Jn6%Yov8F-=-d6#v-^byXbb#LN2?8>wM~${ zN-q4{&VgHGYP1svdnbPhD14?a*AZf+Y~2DCsFbZs*zHG|B}f!N6A zxPcSR#vr(j2mY};ZeVfY-*?WV`|>{U;7a%TG#BP`FYd8|UFF7P)p`q@wf2CP#r|OD zZwC#UdGv~&?EoJ}_@^8?p5qAK;QqQ2LW5@^z}HPr1sMd9%Y%+YfQDz!zof`O00~a^YFn-jlpgZWCbk; z0B;|_Qsx{^n_yqg!Qfub!H`_e!BA7q!7#O)gJD)V2g8PP4u-AekTq?1%OmXR?J%S` zItRKz2T~MmSA`WK=RLYFzc|4LiPue_LIhM9fGVcRsA`r#)j-NLn4&yXMfFfcn?P%U znPG}NQ58i&6@eCOfQut|Dso_hrA{8Sw4%laP6vq8nFC3kka7iXz<*Gz@PjVa1(hqz z9^G)6r*Ik2q24S=GN)O=ma;i+;6k%>BPa!cvjjMSvSLf1w#;CM;ZC4BZQuktrwW=t zK}o5`r5kkjFEpY3VuB>4a+IV5O;Ujn8eE`(6VVwaMh1x3Yd2TplL(2;2nk&j^JgI> zL{M}zGC>n4D4;-jwE(>Q4`%|M@Su`|;b|oY!|zHC28JpQ297EY27xLL2AwJn2G=S? z`jiL-?bQU|V{YIH+xz}P$P+Y4@S)pXq4@`6sgqAPzh^UKKC4u|VLxcLjG_i{*9f!5rhA{LYtI+P&U#S?Tr>(v)CnZeoRG^FN+DN06F zR031P1XJLIsvsDq0Fvp>g9^+Sa;R$bnL$lJP|^g~hF3wADJWpXnL)K$9JAGYP$dhm zQ9$h}kTD+J;Nbhn1aT*5-8*Rg`c;q|Nc#=A1Sp#@d33{N_Q7SKtx>ql61WUB1Homw zm_Uw%w^QMcEMfvXlErF1sF_+)!cR#P71Xrh-*$ip(L}uptL?gAfy9X#NS_!%_Pa5G zPwhYOgB^Ub`MwjN3+`Q*PlLjt;Xf$$-B=tqupIco?$LeKg@4}(&+c<+F3hK2Bts;T zTcaM`=lQp}A+<*9UqIR$;Ccoe=DJW_;MS-gw$>;pqq)C;wl)|ctqri&PyfKKfi!VE zy3a$JIBp!MO&lJmmEepI*0&3)57xx-!_ve7S$gR?)KX{@2dudktT~R+rTe$z!S^hV z&CmJL9QpH(Ll$7MS~-H&faWNmI@zG?|C>LH?#f(CuQ~@(tiwPKFXrk8baZ7nSDh44~Br=U>Dt zGccga*_wm)C#(k<_0j}XMzn)wMwuJ;gDB9hTF?&Ngk$X>>luqoUevmP3Z(-c+U=m} z(h{NWevm@rOCH}pdUUoQU|?W44mJVgTAxm^B9HEVkhn+pd{D;=RQ@pE^y&WX(+RpB z8N__-!FlK(vIDLBacwU|duhw$Yas*$G2AcK&-B#t%eHFA(7<}$} zx;$v+%T2`*ycPzV3Rj2Zjypk@`+9bt1N#wD#J^|& zY3>Di6SOk|n>XViD&!#AQB*)ZVFOVi0Xrq$MFr|aP(*`0Aq7z(gkc8U6F+1bpr_2k zz1SH8S||?ABDZ8wyvW~j3DgFyS773A1t)-BP)veO*FS=;g1x8;&cPHggF4}`ntBGR zqLolZjvGMZ8OUQG{l6I)91noHQ(TVV?$kAqlR(8_>2I(@iWyz3wu90Oe+%eRCXg(= zO9k$q`ohhIG-cr(VH3Cns3r!T-UzC_K}Ji#Wk9tz@`w=wTn1W4!%chk3+7O6G>4w~ z1*&zNnXK9`gBF*-PkAq?2De)i+Mw-L$Bm4y)f_i6zgBeI$n;vqaU<>F_u@WS&Y2msUqibUR22!>9zHA#s)Ynt{~Z=)uxbaL zZdsxaUN@|9pFjG5BfrK4$i6N9@RKj>nEwC&?82{uG+xvVF_Xor{VK@AIJGjvw1PWu z;K&MqXl1o(2c4dY+tw3|P+P&3G+3)BL@S$B`*pmw_9C=`VipuYx4tnjbTfliQ6_kH zXM@lA0xe4p0H0yw%CF&kp|c&FZ?-$Lq;-OQ#lOv&&9ggNpaX21XE*FrFn)Q487&+P zb6YqV7PW9NEN|gpSkuD6u(5@MVOt9a!|oOi22hECv_6%D@k};Q0)0{Q1DxzJo%6-Ejjy$cxZ?;toz7_(wj4??Iby&^9ADS?&7*3Ojc;aB~yq;OC9I zV6C9FO8nai4}NBT0k6yhjef$LldAJOE1a5`PKzH53i_+O& zp%KW36oGADLGeIn*fRlcD0-Rh1~wFP*i#Q|E}>!1AGaah5JX9}>=Vd6?wsIeIi6w9 zeNdg?4h$$ofhv9j56Hc>Xk+3*pFqh1Z~1_K{0Vg86C^2^3xi|i0BEUu_vIHJU%=dR zn;60M{aJ8w5k^&`0#gG{3b3K2cS2yDFoXVo26NAC0_A7;_|r*LMYo`e;MF;Nkm$f? z1_lR6b&fU^wCpnj>gZ?{Z2Sql-3UA~(*!pc8oO|FGvG3ydKr0i)DJELEhpf5OdxK7 z78Ia?QBWUF4&n~PaML$XTNE@N3f{=sE4sHBTy4AbLaS|*5y=T3K-;jZo$VRt7pp^mQ(Z@rDSA5XYS$YY>`55pos~x!3X#8lmRn zdzkZHg9fS)5;xw1*H3|yH`t}e--DXuI0vfydpH=fdpH=ndN>#+^>8q(>)~KH-owH0 zxQBz`bq{2m3R1ceDBp-p&*=i-bO%d@6(7M|)b#9(swM=c1|>bqp(@gcDMCrlKl#DN z!))V%D#A?9A3oqp&(}cF0Up|fjP^sCr?4~)8Z3e*#MK|bwm}E|K|_V0>%pALwH%RtLjxINAg$Fe(a02QpT1g{HmDDDJ*rU0DaEhb<~@blloQWVw% z-+++Dm*6A8%CIDO2ZRJhf>%Mv;Y{!hU^SqOf|lT)zd=jz*WTbw@ci-&4*eVqG5s72 z)%_d{&HWq<^ZPj%cJy;FT>I(2gIZMuDg~h^poiObs*#LKMwGRkRkS2$};Sipo(HbwCxtb0EC2kOzuk zNR5Kl?+SSfc5pePi`8b(d>bSOVs;R9;AW$B5QX6q(CP+m=}%DVL7oMH%iM>{Kyxfy z=I9$-9mLgdz)cAzt7gy)9O4?V;9PLVZc*kd03+LTm&daRW9?=_M#t*Qj`a&c<{2#4o`9iC?f8oPf8xbEI`PgHG1x z-{#KM(fkNBOx6urfDhV*5f^(nZNkn;91Qy=aWEX7#KCZ45(mTCNgNE9CUG!apTxm% zXA)9=?q=lQ9-!a?T6C1wda0B%4RqLUZa_<1O64G3(50t#0j1KbY&!ZeRor zrg6VWb3FJA#1>C;;r@{3cG0lbhL7F2(i*lL^_lx5YPpdV6 zMq?p2BOGf{0Zl=RK>U|44Dlc6Y-0Xx{vsf^9el{aeWLN_riBa)rFkCRJ>YGb{M#Hw z`L`8{@o&onxwlZtg@0Qm$kB-^F8tdv)ll5)D2{Niqa>1h9YIcnxz`coM3{RWRYC3r z9iv{c4?Ij_nzIjdEan-|LjIF4gc$fW-hqzXV)XZXOJ_cwt-xH8e|w; z!!eI;NGkcvANP=716lI33xC|n&-^hrKJ&-D0&xz1=8yaJnLq9m$aA7wz@tQh~# zeRkoGJoQ=*bfS>$UU2ZJzT642>@UB@R~LSbGcNoZM?Smo3pV>Og0@J3nB4)4pws0A z7l%OT&7ebVKl2Ojj)Cx3gHELejl(2>#$f`$2M9w>6gKc^JOau-kX7)Y`WAd%rGfG7 z<1Q*50^r2tq7ng;hyW-47?l9ffhQivTvU9-dV>YPX$y1`n}8rF;kl>;fHc}BFff3X zyQnC@l?#ECcb|Xp47}g3#42rqN4JYgKw||TNO_5Q^Ka%7RgYd5l>o<$tYBSW!=V}N z{Qtu*)_`@Eo&X)10=m$u`G^7N#z`NQ2+&?@frd)qO{H87l_Cp$dILpESbTZ|grO30 zUZ9c(puNqV*+`W!S?p1}dxdv49eD&n{sG$Ry2y7c8#b7x}lH*bTa-D2@A~{UQoeJ#79;5TtP>OX zw+H@7bF{u(%GP~3tuyiu|NcYJ<2%z_EG0|%K&NJd4{O&skk-kV=3*K7uaxIAf8?pp z{5l8IIvxMme;~vULe>8QiT^@~!_@!rXnw_5I?1EA9lS{k zasK;phkpzQ{@WjSU;5AZcAH$A#JJsJ;! zO2!u}w*C6wdZ3QO_<#p!x#(e!Zf=j>U7^DBcAuI5*aC9KWA_)1w^I-FHJx@%Ox$Js&(6VQHh$bBw3DzNjg z4P1@Cd33)7Z=HAS{^r>I&#~8!@kPlF&~|6gjlujapw10w+N4wCn1cl4i&QaBI15;h3-$FrM}{zQ|G!*d-PVMyr}*Mx)k_-i8sXktq1B98mb){OI7%{ zIXhY(E0w|AgbbcVebJ=G&hX-_8asoB_3>g}kTVP*MwRXcMYaK`1VlT$6%pRB`xYSX zX$P4Cb=gud^fA8ql6f=(cKzyI!fX zGrTYbnFw>&42Y4Xo531Dd$kbmYN!-sC{g0ycB;R`3Mv`1%Pt{~dJmWy)G%22dFETw`NsJy0sz8vvRk16v46 z#PKgd_oaYl*-yWSjD*~*biU;P|I|ZBNbe??2bx>M_o+qz;l?{BJyznMr zhEM!h&Xa!?0Y6Wkf7=DnK*I}A^AWLa8JZIz6g)qICIU{rSR28{VC5`S0y-rEwAEi1 zbZ1C6H^@uTFAd)P`wwP;8oChekoDvapbg)ypzyi5^5_5m|4Y3cn}2eYxcYR5s8l%e z?{{JXl_($v=!*C>{=6HG{QH?eHwQF;ngjgNw?Snrh(80|EQme{Vt0U=46hwP+w3a% z_d9~k;NR~EGlG9VBS=*PsG)&u0;s_OI*r+pKe7YV9s$(=({>Ai_OC1Oho1u9PG-R$ zeh7TRjRAPys0nB(l%8id1Aq7-{_tDKGVsMwR*nrjART!F{_s<;23ScTuqb?ZYepl?w*2Gj?3N4}*{4a8Xfs;q?%_3)cZsM1kYOprO)~0d(?M z>mks#3CNkx#~e)=`CCB8%6W7%@`Fxd15N84*bLgE4;dsVVQa2bU@BGh==S6QUBk%) zDmAn(gN8o5!2+Q35MM}v1(;#(E{Sah-Jz!H(G5`pT4(U$+a-i1(At6*Pr(8RO&ZPB z3QVO+FioJT_ZJ7jY9OY7X3Ae|xWvE!YT|*f^n`d1l3o-#0}VX7Z?;}4F#?s>;?2Jp zOLbl_f;K6_E;1+qT@3jibPj&^>0{0&;H$EtU&gU8FdTC<0p&b!LVO9jToRfRArvJ1 zKxGl=DjPS@=8#{G#e%&7tUJ!0IdkUwqwYfoUogMc{md`GTd@heQy5a|#<9+n6J~hv z=M)?0CJfe;O~MQ>@{fZ!ItLCsU;#J&95=FbxTtvUvS46f=x|Z-^5{N&%tgh6@tBK> zHv?#Et^#PC%ZnLo;1~sOdWklz4aJwD(KuJkWzDqQg)D1F^^u+ za;VbvkHNNqvIYM(cZCjTd;V?yTKwC>L5ID%Yw&M#2Oahr4m#}BpTJ?SD$8Mqy=q-x zV*s6<7XY$Z_Q}8h9!NLS#eXhm35u7J6i^ju()^Q&ztsR@p4eJphU4xE;Plvi`bGL9a5#d( z7sIos*MOCR$|8`fY#>TOv4)|v0iqNX9U!HG5T&5BfU4ALDF?&C#T*Q07IQFsU(CT^ zxCDYhY^5a}3=5ZVFsxm|!LV})2gA`N91L%ka4-ljg^c+$R~j&ta)Dc4FAIME|BuKi zpxgq!FHoalCwTpxPxr+V!56Pjf=;Zx;L&_U<7NDx|Nmb|K?FRzPl3g}|DYUb1j@S& zl>!Vt-4{!}8Y+btj=88fFq9~Edy2H4tdMGa$jrddP|N=RWb?^C{}1i}`SsF+4i^;% z^bG2-%K&sIOZTZ4o}lU*mPf(u5%_sX3Xa{N)j*(yK+f6!|F;|{6~%g_zehKp3#iJu z4rzVB4>x~Vn~UOl(0Q(RJUgQWJUg=`K&3!}N4MqkSvH z17!k62SAG?K#M9MxBP&d1v+x&gNOC!Vr>`DecL`N3NJF-K_}B523-cD;G=!agZZ5C zr57xH{NP-o;KIM{a6`QW1E^hBP$J~f4ZiQim4DlT7aLan`~R8;#00fsm_SLdJ4U6V z^#EuX1hfH;e5;+J<} zV6cvtsdomqT|i^&zTL+?I$cy0y03y_0Pzoi&p#{Sg~&2}0iBBS;s0S! zK<)78ZUG;q2D%i9*`w0{v>vCxqxBoi>-p!gn=8$s#ukO%nwhu5ow8D9SLMn7K% ze!kpkkUXD1y1elvk6zyOAUPvnkQ}6x104e>13Cs!V<#JEjji>;60V&F5LPMk21ZaP z0OA60c!9&;qx7%3f?BD?vlS;Je#)N`clg zx*qIwFF5Y*0&ZXiNPuS9Kz+GRXAf966_m=63UTE4sw@Bx=7SE-I9bYKbo({aW=5-c zjS|q!9iU=a0F+f7I$~5DJ-W}k_Bt}Xu#*NIL8JjLCBcm^)XP}TK+j_VpWowR<*Z#| z(on6*;L_o&U83aCecBb&jeoHcw7j$X^b0`=&|oOIoqG6%38)b7KK;^oxBQAcdzrIz@7D_Tax}76H`Blxs`bCi09SqIx&>a;-1ztZ;Cp$8hVP)Ae#b!rI-u@^hGQJ`;A1cg6p|1O zZvTVh$D>zty%;p5@y4zYW_a%40i|xHQqsITq`i{`oORRY{L%; z&~*0!$c&r93ri6OhGWiJATz*S5Rf%+%)gx}t<#Z-f149iha<}|M``e^6t+(rRJ-QDySo|*)bNqk6%%o4z_||;0P%-?k`H?{ zA7p)@R?pAS5if%z12z5(|MrWmmrAr6UokQ=Fo4`BUn1D}i%*wKBe!`dZ~o@7!!j>>;DoK$72i(jg{bB0m_UP zC9azoUn~+~VA%Wr12`M_fYP`D=-k9Nd|&}<{_Q?02K?I(rYRpyYyQDnss%cpjrkZe zBgjCuw1Y1>I`~0F7|jO-%Q43UMvy9|63!RDL0xor z83s_x2(;AU^b1XH28M2LnZ}nOT_qZz&V(pvyiEt8Bn@;(y$pgc2EK0jIJ6Yg;09%5 z81EJM2vSf32kvG>bi&RXhmJQofX@oO`N9l*mzk$d_YdoXB}(9f)J2qTv8a+15QK8@IhrDRzCO*c7T!N4$utsYdeIx zXAl`n#~q-K+iMks%o&J`jpGhb75$nEBm=p?8Di$2->5;5^B2@AL=OT{*(K1(0HwwN zP(=g@o|ioVYz)ntI2bl=;$V0SrMWh9FsN+iVDQ<@!H~9@gJBC6+<+to$q5kB0d`uj z11NQ~d3L|>>Hg)@{gJ<^nh~7t*?oIGI6b;O1w49L(-(mbDUDG{@abiBUL*|a%Na2G z@VguU6&M-ETvRj|Kvi@3=KKjAo z+i}oRSI_S2X`rqc|Mt@_z8(h~#OmAYmIQWyXZLmfZKZ7d+j80Yryg!NZ0Blxl7HJ_ z2c_fu+fJl)`hd3A_zAq&%MCHtx7RJpLFu03Mn?W^hd~B|TKO;LBV>yl8lK&E;NN!i zzzZgahUdo}xIQ>;WO6w0j>)t8x&zmDhXe1JK^yWRCn2XHG*&q@Je7Cc2$DPsH`t9E z)Gnz3U36HYk^zcy&>V&X=$OP@r%s2XtqRfis+baj!x#f%ZWmMQ`?C+WcI+6_96FM!Lj z@!=n428PB*Aky*RLpB%g69*r$Ir49FU;~xe0gn9JA~?HGLzEqS$i{sFB*)Hu!LhfI z;lcm^j^7S5m2kRbo&b#@yk>XFJaK`Yf#KU>CWtgBC;~w82Vn9CK=Qp!P`!*L98j%n z5S^d-1ypxW1x+rxfX1x_WG@{D9c_9Y)cW5%6+BRS(6if1fIs>GY!n+*J}Q8=JDz}4 zRiF7IkMKvIU?*`Qr|K=8rrL8C3@?nHuwJ$Zlaz0mp9_K?~m;H*mh-JkG!X*SGiBXqO9>H0~2T|_Vxq1V8#xRLEwvxK&w@@ope+_1&S~J zaMt8S;3!1CJ7AkL2Y>W|gAbUvPk=`RAclcc0Z0>M+8GpkAOk_+z#o0Ur~4#|oW+YM za2GK~B?8p!2WNZO-2kBY1-FMCj1Ty9pYrGp)CCz1nkwjYQL*3;KLDzQ!SxEb8h+vb z61ACy8|niee%AvYy`mugiyIzn3=P#<3?-6~2~bcX zYdKIN@}i#uTx3VQ=5(-n5AiCvoC2kU2vE5VP7Wwp-lO@A2dFgl>AvODeUZQAJOj8i z1sA4Fj{MsK7(oTpJr-ex?o*(2AJZ?)aPR@>{ufrq=7-D&U$TM<)>kZ`!jr`jl41`& zU}}EIgvb;iIcA6yxOi%Q!~{v_j-axWf%^g^wZ8)87*J3ufKoJnIIF{av@8NEAkh;& z=pKzjp52!rg&wFhgk&p=7rsZq#heGc(gXR|v7thWp#(IIC*a$C0@Q$D@abjcngwov zXfVQC4-TN+-OWc3nnCqt^BWKB`ftrd*Ux}WfA1EZK32Gu`2pn^`!3f&0dd%Sh18CFgafcJ2qUFULaB;J(mJiy*@fSdC z;#>o5(+4+kjP`??BK`uP)(yCs1G>$H-}Q!P_ca$#6Gv!2Xt2ok_Y7f%y`V`-&)!&8 z&))JR{%zijKHbOow=siNZsUh9LIO8(`~_az0FAvgALH=ojb`%bt!MOTe#=-2s!l^e zM82MZKKzrRClU^|I;6Cn{ z#=wxmaNIEq!pnp3iXgl)2(Jpls{`>4A9qaRWH4g@Yh(dwgz)kh7(l!tRt71ChDnS_@1>JY9(NL+Q=+S+!MA)O3 zw`Hm@!;9rw;F}bhk7yijs5D^UZw2+d8!8R|mDccY^VDznDNqu`zwMw3zYTjS{|-Gp z28OgwCh&Nh#^II&C6Ye9tUXgfb=d{a?h`K}5vFxt^yy`tIaQe9;42o-?i2qHy|6(@ z8lOz-3-?adVs$Vbjm2G)C~Z&IwJVDK~{KznxqNF-#`m}KvNhcDix6RE5^57__wh;HvITs zqU^-Kjm3_C+v!U$JiD)~V07$0$M15s^`s~0xVWhYUrgM`!0`XD$N%Hazd347f-U#> zf6T-BL(MMG@=pa&a!ddv#|TIv*?dI9F&=X32PkGB8007kP(uf@O2_Cfyb2hv=$ zFN2nI@JF8n3-UuR%Z@wonLm=(rCpfewTWXdi;(q+GQ%`S=1XbXr$FN*F50&cx(DoOI)NXQGtR%b2Duqf5Y$WnPi3frr!q=K{vU4sEmCs}w1x;YNCO^h21UKa zPEdP+e|w3FfzfUL?Z?uTL6-ormU8oNzn6CKHAlw!9H&>7Yqz1}+3M@yB#V_g5Qw;U*u*ueN&|HX8WKI>z};*hx$ z3lO*a^a}@w{?Y>;y}T+Dg&AJttAWc6NcRdnG6vd12@Z6y<3ROWXN-yfIR5yzIchla zZ@bCE(h;I!(&3_F=+XVN`;beAi;CI77XlqFDn{Lh4!+<32Xcptim_w&frCFd9Ki#+ z9WE-Spo&%eg*P*(C0L@;a=SzryxrlvV{d@si!YGLJ6_NjU5pB(KY19G>MX#An#1P> zK=&$4*Ypr#>Q{R^Z2Yz!W(4xmFxI-NnI zCt!JS7h?yg)w$~*!xDyaQ3(iz3~Pf1u>wG|%)Q{0 z3zA`g$T)P=K-NSuSbOyet1 zqAW26Ri>&S0<<8ggwvx}v}}Sf!)qmvUQu5VL(-#HR0PBj@aPqN+%L@Vn%$#U^iaPr z!;7Z}|NZCR<_sAj?r^sUrEYLLvfQF8tdL9eBay(|z&V1;+y~ zm{k}LykY@0V;sL-aO^(V{DJZRfzHM!3=9mQhA)F-!vn?=mhKa;gB-1!!MR1A+Y1RFS>Le@a#VIa`i3-2CECDLOVdtgNshx1#&i1sn8A$1_lPWa2;5f z(QyYCSk$xo6lkWxrTf6k6ljqLN}mmt3Jjn$T4LE9sM2}~v_6)(j)_O0`4@PtEK4a9 zk3#b=CXhI5DHD%F^Dkx)o2`_Ur=j^5TNxA22gvk|0i=KgioUHOCMG&^Y_sBjw}G(dwRkf%GGMP9sT0Zoj6MiNq4K%FDrX&?nRwLl7DR17vS z9(M7>cHH3w z1IICkR}5*#LECkYIlO0Z>F{{-qQwJL_j7>niJDO>%bpQ0|&Me^XTLX?_=nQy_N&%=)sp#f- z@v8$g7SRu?GQjy1+^qQk-W_m1>)-$G8?6WGY(bOYQVlgK3Jj&fF5R#Tk*|WrGC)U{ zd32-b2Wwsg)m(oVRC86d-mVn%=xztiM0<3f?-qFRY3INH2VcuKdL=*lFL3(+z9tD=KEdXr_k*_Nb|3cW<$c>N%r zwp)(;+b%bpVgU^_Haui<0Lk#XoCeKqIYQ3^1Rt2o?{b2F+eMG=bNt&5@qmuNKH<>t zl*0vbC96mG^%p6d89;@jHS4>ga}tjE);X7uJHJFB+x*bQ}q2r#<{uT1SKoXnQX5 zjlF6xDOckIXs+jmNjYu+og~eQT-QO2W_8@a%D?}t2WYBi{YjXtI#_nQH|X$0 zXt;<#g+SLHgL*qq;lFD^=4=OD-3#(BD1cr;g?J#h)?S3Fyu6ly0dj%3XRn_q_~Q7> zzWh$dK`9yetoUxwXle5i1<+iKW6aAn@%#*+dq0)qYafJ3?&-ffdZ|UDil4s89ll?KqW!rBj~!yQ_ZLT{6FNlf$`-e&?rYYqtPW- z&}wk7s+VbspU)_3!I;(0!z;u=?{)JGlORQ3DqV>Hv#?!VkQ~DE?)FDjVed zCs26?x+fjEKA#OTFHZwz-WsTRF>nzk4D%c`Kt(FFevU2#-T$fv%JQK0g%8NMcsMr} z#0`LRw}DIttyr~HL#?jQbo;0TAgW|_aFx6ZQY9ZM5!tnp2~;H?D&g7%shkg$vb3Ho z;RDsgrQD4_LDe(r`Z#cUFaX_WnIR0iE<}NYfggN1(s36R74T|!uWkSSgX?QhWi8vx z#sFF)qz}4?v^NBFNFexrd&eC-pp?_;T<~I711RcwN`ZmfAQs08>SwVh5XGMNNXG4BLXU7-zU68t# z$D^0myG@wk#Xl8LReHL^S>OdTcu4}NuH^)+neXM*0x8H<1}VT@*B);N^#eeS4`{86 zrM`U&@jSS`1y#3<{0ELXykR)*@E#O?#~eO`YTS1(gd9ONE)TfIRVx!_c;P4xN*-u6 zE_!_{fKlJZs6gh=K=mnj(MtiSz6EW9`)RomvDILF#6tO1E~?zyB{mBXG^XWlQTp<};L5fX%ky zFI8%&Q88jDb!ezjG5%0$399pB__u|Cmh+u^APTa|Nqw8l~T!5h%b~(7j{89E0!RM+#~k-#YZ#n=p|cEPFQ{SQ$iM#_O3UE< z3tq4^O3UEaQjm`A-e@g@$53G|@F9wzhR2HwP$9II!Oo=&44~2H1dm={K}Zw9qx-U_ z^#LD#rvsqs4Y_#$Z5hPBoE#2r7=X)v(B0FJ_CT%zs68M6Z4U^%I1A1`(DuNGtytRw z7Czl4LG1wr1_to$$4VRxhuAz|^#}j9L#{0cAVnm<%R&BaCw8cMPEz^)u=}9)p^Gn= z4}lsC3I|^>XCL6xKGAT{p~FW-*|YoPi=rxUJpyS$!22T*_ws|L#cv`8nOQ#;fX+3D zWS#m#h~b6AROms?(Dl&Jo}S=J28J`By&a(T2M@vahZ2_d2Osh6kL-F-e_R&UUT|qd zZ*6>%0Tm12@&H?VLmQ<3pFB)I3x@tj@?ib&{(lC@J~>$X;!Pc>|1S&U9&Ld2|7AhC zV6DM3XB?YCE*a^%WZf|Mp-m{_Wlz9-Ynt;5(!*Ff%Z8IBUKDokI~Pk4@dGTb z^Wp)R)`j0`{Q*3*3qB&DdS6>-aH=N=a0L`fTkxAE_o@u8r+XZ4o^sXLCfs> zf8ztko%KPrai_BhxUcSP(c$a>I%b;z)NtSzbPnVfbWY?KbS~_4FKDRNWhmhQw`jmT zErt@d<^wF9?gc*GhoOCOk6uwlaRvrhm%NwP8Wdl0(x6ZRHz%O&1s_oV`L(;n1ki0$ z-ygd2Z$G#L#MM6Kc+AOx@#0J7Q;y#s9DK>?qJ7A*!%N@s;tS92Q!dPh91p(WbnS35 zc0omSTVaT9h0)9B0&pw9?GI2_AAA8A z$Rd816Ws@!PcSu9X`;17K&c3{UkY@GbwhIp1PExu2b2g3KwWRpctckOs0jq#l>~Mfc)Z~UxCxXW1+D!1K&=>l(0&=v z{-~04{%t-g3ZR9qb|6B&`6p9p8fa1^5iu5V4b%eC1Fd`Y0m-=u! z7AVp{lXeA3BaLi;P5U5(;Zm?OPeekU*&hcklg_=^#s^Y)?u8ydh^|qAj&^|WOoZHN z%(4>SXh+;(*w_bTv;(n%2iksd6#YE(W^|k$eZ!^umZSCIT18j>ZH%CEBp%gYe&oUp>X%mX{y)%sklpkD!R8+< zMYmi!h5v(VL=LRw-Oc?Xpz5ymWQl!)B}0i-Z@AQpGvEvD!F%^*UgS@O?A_m94cWVo zD1HuaVtipJ$;M!O64V*~36|(S4lM&9E{BkywJM-Xa6$78-4`4i9`ZClVlDyCnn-}A zPPjpPsbySxoswURIfCa9Uh_GECkpw`(+P-5cev_-Q!Z!%-U2j=3YzzW%+o+pFEsxl#y7z&1Gfv|FsN% zUlb!~CIVIV?2GlF>oB*u^MV{50J=~j!qLLbuO#&UiRK^d<+h-CT^Z=^i8oK6yC=vx z2l3b(1_u7^?wq?pOZ3vT4?FHTP|v`ScJKjPnxplRQq~=y_4S~;V!$~Ke7xY{8DK5k zY1)Tj>Oi+QM4%{!osc+f1_J~59vsja;N7P^y04|VFoVMQ?2GCd3=A&aryVyif`mW^ zwuAQmrou#-K%y{X{6TYN%<=4w8$fr+fQ$jDwVZ)8GV2H)nY|7gnSEj4#m@kWJn#m& z1W7@j~{wR zJ^1`I1y9gc@t-eF-vbX1a64{bg`|(`@FW6G9lvKHr4D$0EddQ0)u>2-H!C`Tb}9B& zF?saHs3`0M?TJI22gSdQAF_SKqx>h-gkg`V*l0utMO=5*2)tKSDM!`E>t$@%t_tLqnYwgHQK^5*^S& z>ryqx=6`yn3Lf2juDxzIK-Og(cTvgkWnf?eH6L@>8D1RI1)Vmzjo+g;&e6q!o4*Bg zqbcaJNzm*@!$Z*43(xK|FW!S<5#*x{pzO}<*$tj+0Lfg1%0LGWkYsj4Wk40-ftRdE zG7I4{pn{4GNv0hx11hK3J-e@i>?nkY`ZKy%_&M>n`~yve@Nc^ay7^WGG>CHmJcGjm zxuw(*EaP$l$IK3RTF0^BAqVK@QkPSpWX!+qB-EmgnG6g&j6@k2(k$ILN)2}~aDkaz zrD~v~&p~r9plKZ>_giHpitT7~cUu*3J%>#P$hVymifR>`3-wRqK;?nE-&!so_?~5bdpte;bE|pB{e;Xn>x7TbypgVeS^t^_QT%Jf7WW9Qmgne4#iE zRH^u=Wc)ka?V?fvI(Wge`+5r_Or8-e?*fvC%6WF5acR*2Yko2nRKVw`WVrM?L$ilt zOD+Rg?!;8kmV#}r44~}P;ikvG-JNMCq$ED*xEEFu?*)~?;2joej@Cy@S-OwD7D=-{ zSPF_EsZ!2{dLf2dX8!F*p~W;beq<(ti)j{^c@P6Y1-tdZQUS;2e^RBw-`s^9N_e}E zzUBm*j4%Y0`#?GA`Xo?#-R=*XPlK9!1S$j@HG>MTg$i>yZUAj;0%@KF72<);r$JRV zPlA=&9^Kb{tv`5lpZ4WYa3|G*SQyrQ$V4#&7bez zVaE$EK}i6l2C}5`#goYh$pbGzGsK6HWRJmQL8$|B6%hP>yH%hV+~&^L;ih-YO`8!^ zp<%xv0oGR77_Ad(see5mfJf)E44s22kbHe?J##e<-zQ40kV+O_<%>JyG5tFNkhE@ z1AhzXRO{w?69)cP(4L25?hXtu;#EN_jX(ovkV#sH*ux&({QTS84f(f)8@cdrbJuUE z3;~V)`x}59s!$Tp5&GGqH}r!`hwB%}Xo^dR?^mB*-YNh7|4%#a`hl50?YQf={|v`m zf4uH+{q&+o9Wtg8?$OJ8AX=E=#qB?=44~D*pcRDsP#MB%1x5JUi_&}#4 zyJxQ-vtuX2i$m}K|8J;fWazD6t`*n*?vZ@nllh!auQPl1wHM3Y|NqZ?{52Ek>P>K~ z9n{$Fu2FFSE#!u*vxd&^z|*%!cPGR*CrdUk^*-H~ zd_h;vZwp}jc8H(9^(Uky!0_#m0)GqWND`Os1CGrvm`ds#L3tn%Ou9QZzhEv=bZq`1 z4!K9p1$45lXZJBX_HaCvYx0O@(e z1UEA3VB2Yv3K5e=^ra@XI?exPX@5 z_<-h}uf2Hi7qscqMMc>o`G*VhaTn{uWgOk7wa<6@s3`mN^4Ni{6zp{Y?UX(D!i536 zbj+|jL`Aum$Eugb%7gi%_KoJ>%=K#^$q;##1iFaAz%lNy(Sg?wVU7i@|An1D3R&L+ zO6dmRF&)qDkKh*iFOTk*D;!Ex9J>S9K|_SE|A6v*iF&s)dnb54k$;;r<8f!u#&w1j z0wu!GTX0(}e}RsFVlg`KS{0N^!56_E2KV*P*0R4)1q~7KbUQPH_w_D^Zo)=(ax>`Q zVrcyXb`|)%%U?d-U7%zNI;JunYeYo7+we?bojAt*8peyJs z_scITZ21{rVFET5Gyns-5%7f`*y8j2+itx03|jJzvN{-4DmsA26Ahr5<;HRF0S7+)Mpf-H65_ULq0@aQ!8(U~m)@*;BO z2QIjvHbE$;eJK5V&|wWP7R!GB@6mV|bUFxlS+Vg+{_sm_6FT`n^9wlt_{<;4_L)Bd zbf_h0`=|Gx&-{^oET8!!PJHGU1Sw(mXg&-&r`V0-Gk*kV_ZhoK^KllB<`;~md!ViY zm01`L0=WmWULXv*2(17-;PBGb=)bG+w--FJ-~aOqFuV4;DT0F30kqoIfM3%^#o$F_ z?63bG-M$hpELuQStFM4Z_lFlcAa<{hih~F9hZpi7PPeawN3UqfHW3Do<^#+i;TLV- zkSmP^>2}=C2s_{Y#e2}|5zv5!s|5eH8jk-j);$JQPA7c2KfJgMlI!Kw0h!Z%Ft=RA4~89kUkgGRLOC4gK8nw8>j*$PTX-L4X#*?$MnHa`uY zUe;2uajpU$;G--+q6#lO8`u~?XL?0|ocAIcWKp-TL_-b7f1MH`AJD01qFw(%d#6vo z@M{7!(~f!cicZ-o0y?$wg$+c+6KviKJqXXES2O~uL#7FIdZ1`3RQcUja8Q&;c=UQO zg2qd>iZHx50TpCE25QhB_UVmLDe&x$*6{4kh8-UU??Hp&4|zNn8i@*y-9J5(UwCwb zHuf3ce&H$&O3rQ;KHVZOJd)isS`XCO`*fcGm6qLZ2F(^srSjGpETvN29vs~PJl3ab zIjn!y@L2zP&1U_phQ<149iQj_10Kx>6nw1@)?9ea?9qM0xAjtq66i=0e$Z@k_o){P z!FvZv#eG4g#5K?E^Dpv2D`{G9^S5+^7J*a?Fm-!#lm>SPOIV*O<>+>nv2^As(eHNV z(f+A@FpWR&JZQqU+gXM``hfN!&=Ifvaj+xxKl4YP_{^{KllhlRx3h=~|Mv49-C!$X zJQx^WgUvWNQ~S`xAH5_ysD{-Zpg?s44_^j&bjmx zt=~%6JiGlAUUPVKy9;=9^L+4Veaqjn1XOIbo-CDj=>@f3FMD+JdPqq#fP#F%XI6&p z(=TosF)+N=_OL!%%I^U=nr}N~bCWp8Oi&LHbeZ>O8wQZ#H%1`a{5e275xWmI+iYa; z=oJAKjST#)3IG59hcsv*7u?0D7`*6-29==x0xy~&422g}V8;0uMPRx_1v&=+YUnk1 zbn~v3lxFbgzU;UWG>i4(?wyyX|DcYv#^GI{ zy)WPvUa!~97nhT#h~>-Ne*b3 z^Wa0~7q3A2I^6|8vf-c@urR)D8KYuQ=L(7khwj&)Wbe`a8M2?#quZUs_)<5I#tS72 zaL5RF^yaesKkU(4#^KTF!uP{EM#Z4!CMXSicy#BeIDpcY1*m%i+N`B<7-Ru*`3q{v zfZ7i(C)pT`Z+mpV=>FXeUYw&W3T|Kux*DGZ9Yg}EAI`pza{=X+=KoSPxA^5jOVb#- zFN5l>YXS@mX{`rJAgT|8Yp1g>3Y?$Y1?KHVQYS`U=Udi3(@uM=T-5%rFh!4b6Ov-wB@xJ-zNk3Q_#{qF^1 z2?N86GvF3w5BLmEP=Cz&BY!jaI-t%qDxgLx?3x^YdC&?z28Lab{`dJ8##Nw%3$m(& z^%w)gYi^J3El^XwdGv}tSqrMK&%cPN11Wm}N-Sv}y}W1FiZHy$0Ig+Vez8jjl=ZsL zzIagyQUhv5lsI{4-}UHqX7XtM;ZSVq)9Va6LRh`ZOh!G@8) z{S5;HL$CAC<{wq%g&w`4lNmrWcl_I0m{u@xGIaMebue)%n*oz=+r3E4kFQ-A+&p_-h2)k;b2*b-d2>Tp}UBm>c3_W^z z3qph$USxk~WoS82BGvGl(W963?jlgAh?;>Y&{_u2nh&syXz*f?4C@&X1(MMLtp;iS zQCX_aza8w~oz4=Vl_H>%U)>-q(2^)o@3|rjFaLvP0Knnw(JRWi1Z0wrio=WgGSI5D zsh~jS-`)!f&KGmi!NoR@N3ZC?B_a$jk1~RS8bygFSP6eC=xieX?I==uP^k_~U7OS3 z2G0N)oP()EAr+*Aztsy}=K;uX!TFo;#{*g_Jf8t1=vA{?}Cm&1a}9Od>I%(LsA)_k*cWX zAB-h(Y0Y~z4jlf|I-d0==l9xl14}!>xd-RHmFBV~d*$#^Lc96B;yynx}ngGsX zAu7mS-7-}M29L%gpxhcC9SfS9ZT`=}(Ep!dl4uI}f8%uUcf$XSrIZUFKA3*Hhocu0sgfbvqWkBY&I zvSLu-!|ZB&5_BCM$lIXKzX7PUQ2>=Y3NKPrz##%M88LVdIX}1Y4M?=1k{>kKTEcC7 zz@za9NCb3#5~yhN=oQ^I6Y7i?J;g{4xDR*0*CIj=c&v=o0Uph7I6RUaHGH~nf)4ip zuTSojQSs?M;L+`9V0^p#a&v_MV<|_she-2J?pjd~Nbk(k`a;b!k8T+ikLDvBhnp>+ z2fkQ(u<*CGf=0nXZS~9i@(iBc-Ug1%He8IQDUQuGTmp=xF|OS%Tq2-#Wv{qP>_BU@ z^gx6hX!kW}V+~)Om1DCD7t5d5Mvli_xHywFsCAnhbo+31))YxSq#Z zxIhb79seKnY(AvmYVEC2(*k!NJa!@H*}pIcE%$3ZP|6BAvHmcqAq?6Z6qv@q0NPIr zxvj99%cJ{N<4XoM1_u5X1JI6+mrVRE*FYWfmy9K~pmmHD%|BWATS2$7yb$I7{(ol_ z8w10O(`tYJgIW@f;QkNq6kbq|=OllNAtM7rcd&p*H>0HhXy>h>1kmuK+kX0qe} znI9D3(RvBRe9*m6A};*fyhTCRl)MP~@E^s@Ac&cdc|Z=n1Ub&9+gpHm0~ewh$OtiT z62!m~<8E((vld5gFh1=(YX2M1-N6|3#Q8D9}r} z{~rd8;x+%~DtZO#cVJF`K;}Qd`av!4I8IPF%D(3Y`T2Hx*gTpjIL1`WFjO>MP}c(Xt2BsN?qNYy^oQ>4Ul(MuFWA>QOus&7u>c!I*1_sdalMsi%k7hjVu#NG>NgQ$>y`uX-?S@|7 z@Ge1y7oQ%oGQ61E0`h2#3Xa>X;Nv~8@maWkO45=1^IZzzpWpF>{KJUFKcYC?4D!#< zX6%0T=oNjp5L9mRws#6Lyifx9=WH{X{#lX+(s=sCAJBLfDZBe_+nZr$Sm3I9N>Jz-?9?aTmi552HjQHebA$M=MM%328I$l z%bi~s7#K>;K<5V-fNq7*egQhXLKu969PAWEpYF4eqvb#)p8{y~#kCw{0VsoUfHGK# zo#hTt3jtz|1EhQN;=yycQ4T0ZfvOC+QNPMSMu9Ule`_qb;~1lo0P3z}fJP|_Kw}dX z9?eGr9OGWDYlL>YKtTb<(C~nzZ;$Sepn)4>{%wpc2TF8wv{(EsW%l@g3|tu9ST4oj z(Jc-dkZ8>W^<_&Gzy%UV^KZ7IXE-h*DN(Ti-9!Q!o&b-PAM3Z{ADpp3=ek`2DCk?+O47*OWoZ;1viKkTegiE!!u>u8y$!QW>D zs*XBAXKI7ad+h!T@|Od+el9a;t}z#2;%^0=X6Is=VlKkpdLJ~)%wpbs7c^~O(H&yW z;@Qpj;(;pzLwATdN4JkT5C8rf))#9ztZ&r_Sl@ijW_`1U!}?Y|%Lc~ROhyM<4wTrt zbi0^Kbi0_#I9gvQWwAa{lA?V}`;?>hfi(WS)BMpVL1$t@PqYFJV}qICG3%R-%r{<} zci(+&3|>e8v;43d$ZM}9ntw2tO2P!^`GD5h9%ywj=O|(6jxm=3Tk2yjV|}oe!}uR-M{cmUP|lq>>X%&iA4^QlpZ z;NN}}G|b}|=NJlf%)s@6*- zY{x+fl;K4{5>gp?SrihLpw%m&a{qD^$iMt8;4PrZ-Ws4f!vNH|xA5sTISXnDc^rJm z>dAcWg{C{G>H&}31RG!S?B!vz4A!VKb_E?8dcw1l)3?`?15{!7_Bts1Kjg$O;KJ~L zUy#v>U%-dq1HYiBfJgH|1?ymqn#&%^hdhq690TQC&`t~1ZfA{7_7^kjKw$tXvp~yS zOH>RXfdo#i9=)PnbHE{?+#<;EV&836h8LN2pbQtI;sCk75_xvu%o*cLFDsRhGMTIK z0Z>ya8ALdO&nN|*jn{gqL`(Z(iH!Ee5^wjnIgFb;^- zda1+=)R?pe5lWz?|K^V1*+HnJGDutmM7#h=Ne77( zd|yTP2}kHDRiN=FkSw(R1Ggu@Ro{!61f)3qFAR#)5_M2~GDm{qvqZW(TIPj&EdxXM zb}HVzl@B3~-63);9^HH|_B%2#IClHU zakzH-$nm)F??2$!eNY=R(Zqbv(fVYqh>P{XnlxAIgY}8VCta)$@XtN?+Sk?kU`>#V z^}%{yh}gV?uPs4&UkGmSF((EF2d?9OQ^&;5J!irP;H4aMDj z(VYUSX-c`l+ChE+pQNh^mOcF<7bXiz-Edi9sH}eqXon4W_e<*mewS0AiW_o_8ptXz z2BrTO>`?!r_LmevUImqJkoDBvKVQ_xg2GjH0Ry;MP$CTOk1$(Wlt_DYgDc?D4==o{ z7(h#Vz-QWli;x$VRUlpX)+<5s*G=R9FJxoEvoc{$44`?W60UBJ7ggXY{l|+>l^|n4 z845aj2%aYchZpF?WN^>wMXVD81HS-+NB3cVL1xh6ag@$DXgvz(JUVeuX29qlg68i) z{X@uoy)P!kz_Z!u7oq~-oGuH>>5`$KELI}u(JlQV7VN0Q@Q{xMg?umXw>m+F7Zb0s zGQ6;<1P2Fb&=>4pM0kP^{<-DR%bPh}gyF>!(9C}8ffAJl3x*PT@TpwywAegS6C2!?`3 z_X)`O1HG`|6* zj~9ockmA#o4;-K7p!oC*2FItiM>i}?ycPHb9H2q=`Yt43iosUF14gtM>>^&CT0w>v z%dfC9ya+0X#xzpsfa(t)6^>xof__j!2MxM>cIkc%YG*QaO1{vF0)>xl@?R@zs9g(S6^)(?-vy`>1EP7-$7WE@%PE{{z0D*+}gdKFmKnnqM=P-uCIvQK^8N z+wG!K;MFOk37XDf>NN1_hI_eA(6gK8&Wq!=Yz!X%4|`bOuXztz^1R)ajlr`U)V4E# zo;Vv98-4giLn-K>fPb&|!4eaw{D7=ygY_4>KN{bDkr4q->gQg(mjXp4Xws%c)1%u1 zbZp}VQ2ICy4%1T3?sG5BI59B1=Je?H7kF`z3)HT=@j?=04Y&)BrK14O&!F=LUNA)< zrQcR=aQck}rQgl~aQY1dpYql#8V9m56l`OO3MfrCS6DEBZjA62co7G+a#;z;p`gU9 z5DmJ1{KZmGf!lrKMK6j(uW0WiP`=|;s}f{*aquE5!;72}XetMvwt42v%iEw@0ueyq z`egera8f}Ve^Ufay1twZBGJ^hL)C+hkVUI+=b$Qwm(RCe1c5c(E@3;)3{FO^2THji zeK2rg3tp*l0$eb^+>S8hrL_x61^#k2Dj)3r??17*eA;s5K zPH=oFgW~I^A2`0mL2O%4m+Qt0v0`Y+3W|9bafYS*MJ5JcIQ!zd!-UiVG9KL%K!X}S-3N_N zT3VGDfyYq}NqAbHsQK_h7-V5DuTP;M!;A3qpk;30svdQ954b($(S6qX1HbbJkLE)> zKFP;C4?bXe@l}|g;l+hQ(2CvHM-ia|ZO^Gg9D|k~4N>E3Q3z6esd9khOA!=Dn!e!p z5(VX@?g)z)nT4RBfn}av(ae5uY%!G!GQ603j+NnsMPFtmQF$hY1AT5M69-ukv8%A@<3$H50I9?XrPy4+f$)&sN< z>)=Bc4`vSz(3CG5Xxn%Pn@4wu3TO91GqWA2J5>ZHtG1jBo1GK*KN4E(0t|E&UU9q5I7F;M>d-U?& z2TPQw7`&JWS{TFpqc>OwwC-3q5~K{=%jWm!KHnkn!Vxq`a^o1A4rmz30OTHv7rFTi z46V0Icp)V<*j2HIyU&6eWDw5F*-R+q3&_3THBylAV7%i?3R6L`3m#um4F}iqvasw9!FcXPbxc7_C;KzD@5i@rQW zIn*63@uCii@6jt--vf>`i4sAE7n@JBGQ5b(L!@*_u6rqsr9M~=x*8Ruy`2bB30b5E zYNPpdzjQVJ25KJ$xOA4N1iWx`28~OA+A;hsZJ-u=XN*cjcZ^Cv^J~V6Vo;h-01cXC zcqE?&C3_9fatH;FUYm|yZ$^*q?;gn)J$iK}bo0CR)-k?F0iTUh!s^=n{k4#9GWg{5 zgAbTMV|hFI`58Q#-?Df#zhm)ee$UeUnz8aEXn}(QD9$xNv7Z4NPD}vBa)f915ns@n z2-nV122cmXF%GoZ3EZ{^g#dbdCxZrsjK95b2>_+-(=Xg(-7(hm3!0Q7c<1AqFLFGNDOAvXl}VzmZe>a0o0NQ zt$sc6;u>fU9X$OP4O*pF`V!Px0jb;tnE>`tQF!s_BY5Kj7s!_iFQ(l5|Nliis9)a8 zn=wI(;l*Tc@ChSpK+%2pFP5_Z z{cn8o#XEaY?12k8w{DKslO-0Q@HO!0z5xn83*-M2URXmmez13QznB1;oA`gcn`fU# zugt#IlckS98NvdT4ZwFlHW;yi_B}KoQ9y(c$UN|PfkF4p7yiB=>v&gukYWIJ<~+JD zcmICz>jZc~i;PEejfw{Y==5}nEYL8|VUW3?LewDs@FvFY(=Qf+4r>7&fz6u!K?$^a5lFur7b@| zg>RSGgThP!y1?%Ai%UTu6+b|$fIutXL7flbV+;&0Zh<2)o)I+Rc-b)3qz1j@Bl2R&4Y5lILH-{s-yeoi~pcB&@HR*9+cj0!^U5%ElOPA<1d>S zL1m&r_xTq|ph<9W9x1g3^}Bg1L4N#ml$GJd@(fVCl&F9P9lPPD{r`97c+m@%0Y?S2 z(Afn#dKz?;Wsm{Lm7pxm-vS!McHF=SU0!$Mh1q{rhVJt(=7ZeV$qb4o0axP#y#cJC zwRe*LSs7jzdn7x!v>qtY^XNXY3)I(p!2~j|)7b)~S^}Z^^*>PCkNd@C6$XaawxBjw zvPVMe$&$cbpoyXvXY@h6NoNO;E<1#-tx#QaLCY|@y)9lm0jcXg{o;;38^eq3>Dc`1 z0a|l<`o${&kRz>1Lqh~q%)>D#eiTAMYd%9A z!#o<_9AIEzFn;R-x}NQ(L&qAG4-5jlT8P{(o`q)wlnkbO36h9BKhqrl)fR z8D69vVP$y93R(l!xkUvuv*yt&x(OuTecGpUj|ymN?8TuFQ22xLE`Q4&P<7bL+utI> z@ZwY;_<#cz1CL%21ILCRilv;O?R}2h8DF!z8vO@tng@w`^m;LR@VlNezSMG{L>-hJ z4Sci@PO#A_k+QKW5o`WcUo7a@!NT$X5dStuMvwmoTMm>y@<=}9(2>Jp&|qm*D&A1Z zXj>}i(R`5U#WG(|^TdIF>ao|%4o0B$qg$Flz5%V3x#bU%D|K*f`ClsT(S7=b){#w$b zS9EGKXf*ZQi?d*dyYg@Q=F0E#9h3qCwqM`?VCqYf+DG)>*Hm z7+hPvdGNa)^yp;mc`e1@*!>^0tdaw?k--Lh;yomaK`U~>k>5Q>1vD+%ecYq*2q-~8 z+8FVmoue+DJ}L^qq43Q~uH8Rw9(Gh_yB0EC;&3%81TYg7qrT)M#X`_qx(F63oB^W zvRC(Ry$FL(=Mt3_44`}4ZP(@sGI(}h_3Xa?;(j1(aVikdHyP z2KcBXfIOJ+;wUGmZ3^){sP=3<0BNJTSXL<1M}fwEUL=7{@|N)EEEaeX3gUEDOSp7a zE4=pd=oP(DC&KXJeE?*)(`-ZAjM{7rp#B(W2`(cjM>(AM|Nmt_0|Nv2EV>sT!RO+G0Tk zCOr4z3|R2|iz8Z~9k{P^K$jReFqCkC+9_vW`~!~}yE1rm^Im=-#Q<`;2k3IXvV9_aw&XYt;C+d9(QRvL37xVQ}m|2#R`x<_G+a2Vb)60-e|g zO0h3;JlPmtmp6b`xcBlZWeYNtaQgJ}Hr0tRycTMxW@qr|W$ip6#Ng9?(g$>ZNi{1- zB)(1r)b>cI6JY?GVYugPPk=VloqNIP4N8je(_)&BfG!91XnX_8Hx0Hz&!rd`O5{6zR3OU`L5re; zK^LBZR!V?|S6@t&{`=pf@d!vcym<&3KZC4)Yp}iWOp1Y_`(}y83wA3|h?=tG%O0k5Y7iFV(7@!|2e{|&a4AY)6MJi2)+o`KpaCriXZi{d0o zxIMa|i{f6hzPJKP5}>jdWL*e`byuapZU-5RVjXP!sYXR26trwS0J3a+1E|s6{R_OI z_@X1Y2jtP)YrxFF@WR>)bfzbm?a|u`5^6bFBHZv(r+zV(4< z0Jq3}dRZsez$!FPcTh~7_UUC+&lh0;%Yy>S;Dy6q&{dM&9AF`zURIubm=-mNi~vmL zTOLe?2O=W@lX(D_`Sb^DngUGb6kO&8L`DN9vjZ-(41s*)U@rA(Eh#1u$cu!6j87lAz`= z^#rKn+zToqL1hJ~?p1j4^BX9X=BR)&y=Ql{fM<8Lf@k+*Q0oXZ-xi~SzWOg2N;S|(f~|8CsDln$&$ZPV)C4F|g^jmKp|0mb9ffvid0V2>eY*8_i9Bdoix`OD zYW~SsD&FhJ`1%ZZkoxse;{&e`f+y`?@9IAMdK(TwgL;IfxXi`rFeDFS~GA}9g0Uf&mK926+A3ktjQ~TU87EKWA#U5ACY}^lpQa6`g zhc_O*qR!=@`0^HcQRD>jVyWIIegRgyauJ44{DRIR-K^H-A`G3*GTqKBoz4Q?%$?30 z9y<(-4Zy&oli8#D@M|Xc&?9O%fV>3t4|qPT@r?s$XNKk$70`NW{%yayZ@##5_uK#O z(=V>7Gk~`8fg%yKxoDdbXfOkO9RjG)4W7Dq@etHEXgyHs?a=bS#2(Zn@=*b;%V%U@ zcyW}8p8+%-Y0!Q8#ZDJcZB-%*?!!RZ=^!ZuP^0xOWV)l2-J_dT@&RbrVU7yOQIK>} zEaAwnQTzdM`aC?nfZgBx#(-adk$)R##2j?#8K{(3*u)4)b(cXY5wanxRf>^;0kmZq ze1{iwIT`ri2k^AIj|z0^xWNMKP-W100mcWwrWs#?nAVD98tBLuRE_SYV2$D)-K;V9 zrNC$6;kE^It`692egS5%;h<{>Uo1HVYI6O6jHz^k)&+tc_~MK)DC9v-L{|L_+&aWm zJ{0$x=g3QN29J|H=Zn!sC1a#2Bi)mm{P{s#sG5_JA{TtL5 zF^~tT1$E;15qSSekz@mV*{(cqTirSUbAZYI}5hdU*7TG&u5a zci>3tbO~euNr6N_!$jR49{k%~0$D&3O#hF2f)+hiYt+m`&jLt+0UFPR^glp{WQT*} z$-x*jWby)ZZF+_axGebiLi{Eusj`9AG-tRPp9F3C1U2v>nHk*tHh2*%2i~>UeeT6h zKL${TzZBf3I`?9iAE;j~+k6|;7`_eJz>Y|d@bwqLAo=doFHYNlQe{aAC^rkbs2I4m zd@JRFWD;sfbs247Znfw@B^JLDhB-FC&8z0e012#2)c>gf?p7H zEK%#Fl5*q!{M*=C4wU5CSe0@b-!}g5VD$ENw2eYZxQ$M!DX5qStr-XT*a9rOmGK2= zhraOv{_q3*;U~eC2)d|PfUNc+zw*qRoc6&;^nC$>5B)8oL-@VE2 zdK0veT=e4q|NPr7dv>35>3;Fz`nUi8!S|CpHvj!!V(QrI`scXo2hb8im(JWT%|95+ zWE>m*YnO;QHvHEuH39# z8(%NnZ4bdGDx7tG z{NkBD$btMVlfV^?ALEOy7NA|#e$3rBUaSI}_TsoJ==ueQ&e$j2{u;)&TTj;MgXVic zlaall4?t_T9d{^zv@`n~y!d7TF|P?UrR=Zq|FHGVnyVhk7r{qZ_#1#W-5q?y+Uc(G zqDB%_=7RcLxu@cpP^(0QKx4XL}TYCMGLDV=ADzdvFGghYS?P z9tNGi!Y|lw0@ue1FHEn1DgfDg*T98T ziB%fx`~Z(`XASVeqE6O>*Q6L;^hki*=PmJ~8O%8Sq8d!gE`jJQJ@3)WyQ5T!;l*dr zuzD}=9}pXKUxG(B?*g!zlO+N#maSuD@Ho!eeN77F9|rI$9mp63)IFl$ri82+SjX)W z86@|BCav4vgIXYvC8uwVFCAlL0h#2{%PV{0|Nj>jJfL$KSbtsxdFDWgIw)Qc{yA~n z0W`SE@Z#crkRhy>Aj(Rgf?e^l+aG2A9_pS}BL;>S0ee6iWEX-p+%6FVnF~4y>&5Xc zAPI8fV4T^JN<0H`aEVB7ZWSJjhi`9JC{-JOW$Y_!y z=#unq*lC^5FMj*KGXS((a_-wd|62}}XnAzAfd+a&VxZ|+jcyM3z!m65Ws|hd7!`{b z_c{Ll_vxJjJ`MuXV$YWF>@EiN?jW<@@bJU5f7?$-_&9j_#c%(c|NZB0X@|@s9RGI1 zRr-=+by*oo176E}bUS-^ zu!6=PJ*+Pja~^91$uPb)gD@DnLGuB7-+=w61ZseE=BS|ht3<^FM7qB7x+dg{q%C65AVb~8k2qbMn zH@5@-wrej~L0P0X8noVlu@t;31}RZNaw5b{5jJ0-!l-2aoPs-4{VkMuQjAMG(y#QL9T*;DaC( z9E`rf7Y!^m1{J8Kavr^+pE5xmT;AqDL53G{D?yWoF)HB0JL3+6THgULPU(?HiC8-S;Yz&3jDyIywbJ`Xy1fA%x5uN?Td-Q#z?|DpyorP*BrI@1(9 zD+)Ck;&{;h4DfpW?prSoUj*v|FLzJ?FQ4d!u0Gs}?q8(-0XUKz`M13QU2%Hzg`6I! zt$6xH8OSiu;Ts1^6uY}Y160NbT2I!AdUS)1+h(vdFEIceKXzQg`e4nc7dN~>y)<4y zFF}SEGAke_g48lVBK6Ke(Cc=w{v3$$0_^+J#CZivK5{+73(84`=9pwb+y8dRJ+bmX(V zaPb0_dM^t>SKj|)DoyC_22EnNo-7Fi*`WA>1!4oJBnI06I@ak0KiGzsHsIE0H$?6v ze+y_R1W{!O5Hk^d7w6=chS z62t!xMIiSrfoQ$>4|M!1W2q8U185rLG)zM&&x=}5ke^?!`UkQCYy(JhIz%(*Oj(Tl zvHb)8_FMehe}WEj1f8w0I$eapv-{+W!$zPK%il7a0o+gMZKBjDP!O{_W>qWT=2UPs(6L*&sz>U`3#-zQFq|;CbtCv#nE}6lkLw zNMoInPcN%>o)p82ZQfuLlprk!P}JiUW5mIY{; z>EF|!c7r!4Yb{F=VL0wA1Bx6EP(xJ64AfEp%_o+4di3(9r+^mZf!5tgg4WzH|A6#< zyU)Lv310s20krz5^+1ULXwAg8Gyng0I?Ehm(|OJD;w6LwYVH^`SIdA;=d~y`1l7DA zy`t72b3yhkG6gq$OW2P)%Ya&xAf=_;-QE%}BA^C9t6+HE1u-D?JKR6I2>)zL2Kh$< z?jI+R`H*1-kbkBp!~ElE#Kz!(rf zTK|{!fI1{Dpew4nYg8=2!2q$4VHzvL3+q4J4BaPQnEd8u039pj0CJGn@n!)~OP-;@ z{&=$vgth;*$njKN2kW#iRKpW9b=Cwg3;OKt`ECDF=eV z`5#=08~^v{z6sq9&0)C{WM6PjWo57ghiHk0 zM>nk4E8%(Z;67MAsK|q=2O0X}<`h^F52{WT^IEL*@^M)+I* zfaaD#3C_Xj8)!-K{0Wd`2ig&0d=ixGJYGaUK_olSwsBAZ6?990PQ3&T+kqBoI=J-K zGD7zsI<$N%HS9k9qU13vgQNBFQq}I$FFGDV)?tAbZuF#rW_nM&Xwd}~pAP)nzB%%{ ze0OO157uS(7?fg}z`BBvbmc*H`N4GkcjR~Z@7Nu)j>Y5u(bn6g9ia7{4xog%n;TS2 z#i$g3gZM?wWRUYqR6IcAyZoSLAs6`I#DMs?*u&uEfM6CltU&~{{OG>2%IPv$nCwnn>_>>Uid9wg>;Ty zesN-8_}?7@sb}0-2tFc^UfL-ix&$IgB0%u%{wuafYx6bUjjvU_vshY z4MD3acY~&m&}3o_AdWT#A1ep0Gd;Rb|DOPEa{LDkbb(fg?Dk+}VCW5JdEs{xl=N7? zpO9kc2A6J@pwrR>!Hv8I&_OAnWm#`tD}%-g1w6VTLY<8unb&+C-OV6|MuOu(g@NB4Jr z=y`V@-QA$(f=9QHA;*jRoNS=OH+#zjtij4_9)e37sG1iCI6+b04VvP6u?5UN{bCK6 z29-;o+TvxcBTDHDDt{682Zca(=7LhVgRAiqP#KZIAASIw4_x`T|8(Tv{=$WS`zMcX z5c3GXAZQI>iMIuFi95(01)w{4V=UN8oIxpoSqC)Bd;oOz$K@AkA6OY&dtFo*`M00& z=oLMkEW+?2=mRM1&+%`+@#4BR=vb)JuSMX-h=L|R4rqh6dxDSlx%NUCtQ<5F-|Nqm z=F({nDos7oIvG8h4>F~-zAZ5TEsjY@>(or^bmRbCL|BpL(wPWSTFC-pv30of@o$4< z{SJ5j*9KrUj^Jw^TMm?nbhz_DE?7fS1o9CF=oE;f;AJK`Dgoee@)B@^9CXEc46Gjq z&J4)ouZaC52K?J^d3Jx~-~O}va`$=9?iVkn%lrdvJuBe?4S&zlWMg(R@)GD(C1 zeC+p8@B&b1W9j!rP%we~-JPT20Scf1k7meO-yl07`4zPOSqZeR`9)4FXieyi7gIo| zzioqV>HsN(;%-s4V^R#p2U;)HiFtJMvL2ISXtrc1;Q}?k53*Pvs`-do0D}?(c>ODA zeKzRa?beee{Gjcey`mGH7#Lo}tOhyHTLP3rpyD?j85mx;K*T{K@U16HcweZngVs4# z3wU%^b9i)nYk<`AzTkt1YIt;3D>!sigAdvDv_UIPtKK(x^z|s0xiT(e>*7s}P z{y*x`e2k;{FKf{i$L?z$y}VoFMHpUen9T~>JPlfs@6ny35&;Tq(1k{zhz75Uk3Z~@ zeAKhsL8qWu}BS6!mXU#BH#-9Z!%JaC1_tZbrC!#b`CC96xm{bnl?d~1zsA4) z?29}xkiYoBXCHQ7>puIUR`TEf<^vC#fAI6S-vW(J_KNOW|LwoWjP9N$i$K_}^*UD2 zNr5j)x9nh30I@!lgzR94uu9cICr5y08k`t~!AtP8Kv})@0Do&20|UcuPLPv8Me`0m zs0Ia)hUXr=qLJS~>zdBL_^AnLs9)Xrb^H2UqZKvtfG;y3IHP8N4G)a2(yC(2@g>H4_f?q`o$UW%0XFGsF4De%xLCS zL(PLa4ivxO`pN)w4du@lIZ~iS%q}Vp-KRk{RKSbsAK+~~S{|V5XF&CpLU)LY!~Xye zegOu4LG~BgVDpZH;uqARG>AV8n#B}ke<1{xhyk@(KwGw;cY^S5XLQ{4A9Vay^ACk0 z(DjaoO6}5`E7=%IwbPm_xfn`SK)Wp2`L{c=q;)d+wjL=RR;M;n#B!Yjt zBhPEUG>~qCG)L=0C0fP@KsuPAs##zvK@3KZZXXqJTf;D|lkqTql_4ONmr6iZGo^Jh zL1NCM`-n$pgoH9+ym%q?|Nnpf z?Vu6X?Ioadn6C40Klj2^2vTva2dyO74i*aHhX}PJgzBL}pnX#O5LGdPAXO!zJ3ti? zD3IazNIHNjeP&RMK=12#2vJ(Wzs;E+bVH{Qe>)4PGu11)dhToD1Q5<2s8Yrd1l4rtg3vWTP}dkkTq6Q<4StoK0w6DzUPINtnGYmdqJ%1XR}0dFK@NrP z>)q#GlnDO&-~2f-huEJ3uusx-#%eH*`TTAAIBus2~E};OP*5c!FaD zC&Q!&PKMeDPKJyKPKNYwPKFvNo*2%_5EcQ!ATbyl8@((XQTKvs4N!grx3>+z3&wB0 zxGe@R=FY!}I|VL=3_N;8H;00Yxfn}9h8N!_urj<@WDMHLz-qk<)E5OG7t;;uHGumH z`~vO@phXG_FKWQ5K$8cMBV`b3K(-^7Ptf`_8e#wG7xzwr?Nynm1^t6hkeaM>lKePALYDe>A z208RxKP$tFN+U#h-7Wnh%Lut5fQP?A_fO;7FJeU*KpVl#*de=0**v;EI9{uO8uAw1 z=RpOe!;7fT-~v({R6sg(`>0s_4*(rQ^WqR_?_T$f7hK>Q8E_Tg2={*yL2`d7cvE31 z$o;2+!R{|M7i4(B2Xg;TLnQZeznBGDY~FgH1mZRp@L8m8P`mp;10^U2{v-JhbUsn7 z2&A~TfE4!*FM2*<_(lWNOZ{>T)X)3z!Ukkw>wnNu+q?w^f($RJ`#=)l88J{XkA5Ks z!hb@@{+oInoRC2Ndldxs-()jEh8KE$tPC%18X)`!o~my>St9nL80>%>FLr}Rc%U6y zk6zx_`hpBEzV(6|V)G4xL+)12U{Y5#S&2XgX>!bQ0K7wC#dRTJI(|;@#Dn@ zA-Ij_!TxPIPzq|go(KeoP$9@h9*~XO^^uG9 z>tVQkUJ&~}8woPJ=mXhj3AYcl3*KAe#f?LtBH+dg1<+=9l+p&NJ~8P22^qpyc+v6o z|9?=sMFASg3NNO8`~ScDM(cr6;qLP48{R5^&ZK=oI#A2=9gK;GKk$;$8|Ne3K^hzhZr|HZ$9 z$WD1-uLBD}xO*V!sr%*&V}5Y{;Q_U{ps7RP1)mO5)PnXNf;NcKUR?eHOCKk-kqm*@2TH$(_~7Z|^b6NR@c5eL3-*|^p&-MHdmW(uk2ct2%|{^V zHw!dO0(W5!vf<#pl^`dUL9=*oh)M)3Px1?ZHd}($iGs(kUKqh0sDW$-tYCrCVD~C? z-+U2l0&dUgg7O5swvl@S3f~e5q`K1pw#*>N80u{3$xILfK?xjby#c6GtpGZ47BV8} z)BV%c_=)k`7fV5_cY96wLZ!gB^!)SaX8#|+0lN05o`d;C^KaIow;su7J$iY1LG8d7 z(>{S_Nx&oE?;=KrikXFZdTI38yKo$$f%ngeW_Yp41PW-UlD?BEG1hv7rH-H@ALAw!HYhmrE* zBOavqO+5gPUr_zC%NrcO$)I}gUmGa@Yr<*+aG$O_+U3PGO>ja5^C95|BO&nt?YQ53 z!HY0A31Tic$lPTha|6-Lbp{PQqeKQ`{=EC<3nOIrZru-eFBinz&3d5uACS2}HPGB! z@Zy;Ue)odX`z3Cq@CZeizsd_79>E~<-?g$byqJk@e!`13oaVc9vwmF%8W4AFJpdXJ z7yZ0Wiou$zgc~#f${OyGmHv>cWJ&#`7g+Wpb z6HpS`2XI1r!Jz?(dV|()pe}?3|NH}>`Ec;m0VF<*ZhJJ_My!)!U?}Bz5eeEw+sW#+ zPKseCg98J@3yu8V`fLLhy8!GuS zkguHE!OIU)b)r;!$7-;XFO+cYm8|4V8SkDEdP=A^Jrj7rJO)*zx;6=<+Z$ zdm*~doY?^x>jt?GGGL9S4s_ld|MpA#+fTl5WCC@W)j_Ln5Jz+%>E{3sW8>D(2-dHG zsvpVxhm4@H`CBW0g9b#VfRelhxc#O9wf`VU{)ZN-{)S4vB4qy~nKu!n{=mQHAB_Cd zpr%32JAs;42$KK7f@!;aR0@_q`f(t24P0;NEg8vOULbWw4Dv}as?zW4>Y*aXxD zgB|7zE(c)o*HFnbO_Jy?OUrOb|9y>wjmV&B55B|j$i&1jJnKO_T6xJt7MRy3nbusd{#W8|< z`-gYr^ML~OM5+9aYY^l4Tbvmg7+j2l<;o>v?u?cQP=%e8|AS0MAddJN>}}XHat( z`P)u|F1T_`ez^;z>;vdxEb9}c5<9kWfLwTizXfz0^o|AW3=A(pGvqsrL_y*wN|kqL za>0T_jK5v||Ns9x6&V~D_!nQ~ZkOE0x;BQ^@4{R-HKDqgg2IyYylP@myfNBB$sjMz5q(F-(z}Fo^ z@3U;KbYb%7{#nWaUfTid2fW}19ir8J9yG;%5!Rs;2a>p=ZqMNm?JR8IWcW`j1@z7SPJDaB!? zBembb=U>@Qbq3#u;&uSE>=nP{8hkjlzPuijc3a%9sEDgLVrAFq8;@=m>@qNVqvfLsrBfPV0iY*P|0Q9|}Df2h!Sf z<=_6%m4EvW7yj*!Ji0$R7`=U=%M3b4BS)pcqgQsKmlUW*>}K|`{!pUk+kMuRfBP{< z{_WQt`M00>A0W|kpp+N1cjqt%s7Ad0n%QA16OBPL&<_0Dj)La=u+2gvg7Xaj zHde!BNc9^yd=y?R1)aUqY%9AAw0Lsr;TNs)IO2nU8|$Z~NczF$8>n>w8KeL&0`utR z?EVg#u!m0Y&ro7ucwyWD>hz&Z{6A1+V0a-77Uw?Z?7#@p!tr8OCrIHB@P4k=lO-H4 zI>7=TKsPOSUk9Do0xAr_4I@w*ihpUz2r25oz61rmLOAT!W8=5J-5-5H>+*kr@4f#C z+UjEIP%7Z@|Df@u7x9UpjS??F%XdKQe{X|&I=!N~4k8RMLU=&y4_s6nK&x|Gwt!?h zL30zJllegF24U-Mz^xn5UO0gCbc61??iJN=5Mkioe&gU{fft-0;ZBHACCSJd z_<2B=IGXcsKf!&|(!5mGvzxE^n1Dy}HIIXjm|he@@dC=J)6oySbtIQ(aSu?n<+3u-)nYYuqrFvz9dC7|Oe-%(@4|z^D%Tg8+1BzbUO2RbXE(1&P{Xh>Gc-y>^|?)>&)ZP8_e+{@E>S6 z$6Ldr`>ao|vx-M=umY%%0Uvq^?mB=^>3OO3@Be>r)Pf06{RLTz*~^=-Sc>6=_M@Nw zJ-T^)Km6fdUD3pZy=E09vOD zI>+XP9V;l+J9B_UK_}XP<^oT=(13^vfSlx`qVPWqG?(X*?CioX=&aCspboVD4b-b( zc%cV6#l6$n!z0-_044#N`gtJ=k%;g}c20mvfR=>3`11&~#?v{&BiXqCMdC3;qN2Il zg`tk!qq*9Hp+vp8Isn3nU?`Dlu1O?%6t1B2vc|q&RCSU*m|K&%} ze(LViFW7$m|8M-ZILB z8o$d+5c`;e3QUa_h@aM(p#!BgK=d&OJ*d2g35cK8>0t(?jX?A<2MfmT^DpGyfj5bi z2zhjKcyxMOfMyD$5ZUiXex@5rvKfL_gKx16pr(bY__Stl^Hq8f3RGo&T zVvkPfT1wgM`BDu3r-9ZyzPKO(P50pQ>JSP4#dZnk&=4ragNqS30V@BH#)m+KgMml# zM$r0C@ELaenk6a<9^IXwCLq7YCy(ARMvq>RAdiEOm|t7~t!HjMP@?V8%TorP#b!BS ze95CTYlba#UM>j7D7(;L9(aqtm~OK$<=3pd32wL9L~i2?Zq_EO6t}F zrA*yFI%~dy4vhTD;nKMoY+mPTh+*I<8TbJgNQ;HQ?t&30=N)|qC3XH*(ETK!1=gVb zGobsIL5I75?s^8Tw>`#sc&-!!=s3%y8z9x7BiXm8fMmLRz~_to4>M>zP^kpxS+pLg z6zM+wV)GiXa-kPh*Z==-Jy5~feYyL@i&_B&hMlZz3=E*j1P~2sx`8)`zA)PM=RfEK zIgsrw2TJ(BIT(C)Q^&J$hLtHPkq=F_eh9@Nf5VWO3o&b{uq4 zbob>K;cN^H4*!mWI&9X?E;VNyjQ)emCxx^LpzFTD3NM4sHLK%5Qdm&)2&^!Hp-vsX z-xF2+IZhwm8x+~i_6&8F#s@&{7*Il0v2f`=0cIGub{_{bG(12TkDoo}qN2d?;s!U!)?=W1 z)vVcT&N}`(=E}eAp9^$N@d8j9b^xs>uK+d53P4A@f)iFV=*lthp?$E#1L~hZ&KrQO z7xU=;1nC#6`~Wou;Oj^{UKn2k$G<3OsMo`z`x>ZS^?w2=sz66&KNSIGbu0^hK=H=` z+m-3jE$cH|iUBlhcDqE4U*3g*!O|LZxiwQSOvD4z5DzN z*)9M78{Y;cHa0c}hMgb+WP`?wBbz}z5Lha!Q89R-bpFr(?(;8hzXm5)UXSDx9^I^0 zXGt-D+iG*b2L(d!!h|)x&YU^pYJ9-OvJq6=)M+?&ADG|+DQcW7ML0^?KRfXYhH!8= zg2omPNVr&o)z#dACRK2#g4#n3wh6O9LxEB+;_h%Wv>YfAd|~?Z4`{`3DLc4>rvd4w zfO>!+*Mrv!D7@JC?f-w{lgC&UXMu(SFN5!`1Gnc?z(?bX8Q24WM=gxOV5e0IJYfk3$reKJw_5 zJ#7ox&S<;DRtkJRutzuZfAFdJ9?h>gJgo26zVqnjoex%jvP9~IEXbzgtX(r98>Nr4 zmOxpMk*^fdRbU5V8~*sVH~t{^-cR9klBiRKjR}{r?|4Yy?V)YgT|e&Y-j6 z8BM?)=T+i@3@=>sSs7k@5CnCcUv2_5LpyU+4AQJOgNoczzBKFIph1jMR)?*OudSe4 z`QUq|PyY|d;NSM5Zwi@zRh3?8f(Ktr^h&7jk=O1V9bgBhUsO6vq0nAQn44zyC2 zHLdl3iIQvUw-VVG2R+yrcK-j*z~Ey2(UITjoCotkkIrULQT|#4G*t;%~HMY~cgij#8@Val9GC02u-eED#rbZcS%1$oLn+0)zt#RDOcimt_ce zbQVZ>bXI_x290k(`ayeWA?J%Y^6&p?o#n#cYXh2E?2O>>=@kJT@xb8G?d0LZeATI; zCV-8>t5+tV#2<9RW2piEcJ5vO!Pom8Ow&HJ>koLm_)w|D4yK0x|I@5bl<;+*e{uO0 zD}(KSc?O0WN&fB5Olj6XO1T=UIT`p{K<76db7p6JEtJ-2&ARrxJGTpXEaO_*ac2%j zM$jfDw*UYCA9Lnpc)|M{q_RW?WOHd)nsqfx9Y>mVHB+tEYmQnr5Ub7sWdBaky~aMB z+d!AqzK~c4F00kM!6)(l0XI-UJMlq5 z>)8$4gn1H5V_@)^6c>vpffER4MbmZUv(Yh+2w(Lb9WXvhoquV>e z2YLq(=sF^h9WMO)x2S*)sB>a8;RGpgV=Uoh*~thxLm+Z3*!jAk>zRC16hNoEfGQ-A z94MJ<_~VUC^;u z*Famy0xI~o-FRUOK2#XzYVk_dN$yqTT(VE}5ldi2$gDbx^_)w4doEs61<^WMSZMIRsWT zMFliQ;u&yr&EgyU;om@~q?_>TovTtTmH*5y(4qpmtBqgpSd~<%#Akj1Zx;UWOP~1# zoH<@AAf&@Dy%ze+FEB*~wCfomtpD*dzksZgy&!`Nzh(>g6qPbISN`w=uQ^@#H4cAv z;g3DYum6Exa}T&NUdGBF{{J;QzsB#+{INgy^*@!f^J{$m%pdy+bS5}xm$HkMb*Zjv z%YXis`QY=E^_*F%#7af@^{P3l_)2;B^@@3_*dW!`eo&w9wSa5O|NRkc3=BKMKzp=Y zf4qnR4<40pH2wz(mqvXC4VtlZpa0A+Sk3X7U$B_RrNi2{a~U{ga; z>)Lsr?qi@;LfuzE?Oz#H(8R-y7cA@`8oUY?X}AP=CnF;NBbDc%%Boj3UsHr(KWN+$ ze%_1du|NMkh&k^ituqk1k{@DzT4x{+N`I>}Mg=@xt`G(pBv9~3zS;e$`}B*Z%m4pd z%iidbV(5NR6Xem&d$UK1!KJsD(GxnJzwjKW*97We@wZF_l`P4;t3av`YajIJv|ZgJ z#qj@t@g<++1E4JL(aY2S;`};32A59LmL4gF*8(2hw(UJq46U~-SS?NFmjra5dy#(^ z+}Gsvm~os1bkq+>lDX4lK4==tq5B+YNG;&St7G7*l@HXB4(PrN?nehWw7xCjdm(@9 z|Nrh2-B(|zfu}7&bsBi|9kj&-!#8b098zm{M$b8gU*$``6BZLQj&Nx z8=NFS{TD}daFTe%CCKoi71U8PUkFW3>>UhgA!h;s)N<$i=bQ7WgM(_ zUji|NUxe6z?)?Ohgcq|qZex6{?*Tc|#D#y`c^Cd|pwS3Wg83g%;KIM{!wVIVde#nM z1_tQ(xkCroaEA`C(GDG8gI}y=VPJ6N-*(KW8#Fu!UJcuwqv8PSmw>w@h=LIk{b2t? z`pcj;(9IV$&yhU)e-_xYpyh!fYGBX)q0-3qfrfD)^J$=NBDi*a!HjHi8^mHz`{cGN*y0wD#quDFPcb7bMzl}B*-+V| zmv^_S2*ZnS39Jk+7GhNh>NY|y1}Rhmx$(w}O3-`;$Run#>Y(ib@9zn2sUR!{j3Mw%KKu+}rNqu7i`RTQ+3;*`>po3u` zWkmwifj2;RGQc(pbi;=*A?-5M@g~sOO_1>1{1nMqW)NqA!n0ci9G)g1XPu8{Wq45q zwi^;MyPu$!8JXO zHY}F-cL0|UunNQb2~s$pn+|q2DEgHl?mojN$nYW^ z3_jZsT%iPj#^2%doUp){iPKxv3aFK<+v6vKDIMTde% zx2$a&c(UY0ENHKBH?JN@O(B?l+T%E@G{_jx$yISsq3#$J1&`(<8ZTwR0=)lPAv2~g zZ8h1T3z?u!g5JNdlYxnW;RSy%D+6dJH;4ne`wP_J1T~F8qf#$|9{vCSVl4-FGKclW z6_EOP2GDLS*&VG?494F;2d%a^g3?y!9&lR?JU;7Su^H6bhF;(fDe^(xsR^JKrh~<1 z&>3`~DecoQgew34f1wLKWT_iGyaJlXl<~0sQ6%nad;os>$IQ3?|9f<920N}BJlFzK zXAe>b8!PkZ1|2cj3>wwp-#!`CU;ZDE;L+O-9Vi29Z9RZ87Ua9CU!;RiOW6XRzXA0wz~O^_(*`8LfD$C6{sb*6 z`03Go)56gKbbAUXXtf9Hi#6$>mDI;Qx-WoQe|g|rxIq~LmJM9^x1aRwzTkN9p@8v8 z{_TfcxKDT{J1DdssFU*PKG1#9v)f6-#hRl;2XuyL^8pr5>kBpSJ(Ha{K+CT^x-WQk zI|+c~`N5a19$@jXK2`JH=)hs{;!jw92hI9{mp#DTCj&ac3*ta-umcZxfR~=UIC~E? zppE1}_Rgw>0T@h^Yf{TfP;WanN@)(cKY73(S;K@OgyR|2)RT(9P-5{pkfC)L*8cb9wfIWEuGTL7g&>US1|y5r!9M zQ$cNB&{^XAE$6@`Fhk1${+7cG3=B37B^r*9eUiPRKV?A2JDh&8_Bp6TDd7j7L-&F| zjg{dgXjKk>IQaN@@O^F9L4I)n`5aUefH(mlA^}7cym)gAb+ZI$UJ{g_LGzKIAy?Eh zpXMC~sRo&A+`z1*Gjo2`I_;`lvX7Ms>t@|Nq}|yVTC3 z+n)mzQEH%b*knW)UdX)wFWD(o0n7A?nt=p4p@N`mRbRwx1*L=%_G4^}8yH_R865x( z(18NZvpX7Na1N9{TThnobvueQzhH0v!Ca2E+7dMWQKJGH1#W($06I81`R9wQ+He0` z|MPd8WME*hw(V(KcFy0=Kt1O=TLSKo{F~n+k&j zdu1RuoHyGTGn88H1RWyxBIzJFY)Z5o`32ZKx_MvKOEK^ZGJJC67w{9{4?pmUU(iFq zqmzZ(_<$q7Ae(2W8{%M1)Hwr4$pRrkegpUaBtV(i!K3@8@&6awAA<^&!=U?ie+z(4 zn~?i0z~IyC!T93t9#DD&dAB4DG$CW)((BF$%1N%qCqYGV1E@>{kMMM#_%HhYjQ|7a zcB|$e|4a0JdVRo~TR=(k#D7udcLEHp2TJ(6YgA&oL0ifWK3DMI{t2q9M2~~@oqG{~ z0Aw5Z1|#sP1fauVP@5aj{TnZ~R)727&3nHNwEd*@WL*d-#~FYeXkq*xG))Vi5BBJ0 z-B<@IlTFw`Cpd_Ebo+6<_`V-x&$$=x_p>r|^Ukc3Vu0M^VSTgaJZQEBJnv%Q(al>{ zC&lpMBuMpf*0egwV*4YWM1q5*M+=|wNeZ(-s}S%lgU~L zlETytS^xdQ9il%Sq=ZluXe=q3TI1g*qXEjm`{4LrLwHHBZ zd#9*?S~f4PSp5C(13q1mzl9ql-#JGGR4jlJLWECeiHgIEi=ZN?dka{-@c~cf@1XkJ zfIs|z<37;pFwgG$pdwJg$NC?C^CWP)Dn}&&JUr;Qml1R?WGCp5fql$2yybk3{ELqk zb9nqe>|uSc=(R`pYY*#t#bW&O4E)=eZFoy~Y`98bvTs2}D5$7C#>@aZi%SAjQlEVh zd>0g*jHU9ft=}qmK|>7+j@{>8>0&?Ue)>j)5lf&wBhn{$k-hP}yH916tUq@j`hoNcs5}t3ld8H`cubRdgP`qG3=6 z6hV}WfSY=tS?Pz5Siv{P8NAK~?Kg)i^F~*;3#!cMwVOw;r~p)%3Pc$n$RLl_|NlE( zR7_rjI`-eiA^v5CC=h~M*92am2HF{KeUHCs31~4RtY50X1NPe}P&KJ}Me7 zJom6Ncy^zE;kXA>N|mTMfI0!7Bf`2NQSQ^Jx~~eH12P=r9b+JK_Yfv5KN{bD(OeEX zd6ahxNM-BE5>fbiwocHP-v7fMttU%Ap>3`N)hEqwG+t~M2X9X=Wd*hQ4|{YwaDW-0 z^bc7N+-8%8Qqt`dEN8>12B!W|E&Aeiv)<4Qhrc%4LL3V zyeo%az(K?Vi4U>|hQaw+9jcKFau@?B$9F@Qtb@vTaM7*+Id7z=?A!nD(=Wb?fszfV zT~R9L(aRer28txe@dXO;FU12uiwft1PVM90?qJgC?!v#_*{svOfPcHQ6=?3m!1!&a zJNWi&3;yk2JvzasPo`OC+Y}psOIyVK6dv8+F)04+=Rj9ei<|(ZkBD3U|EK*wmS$aS zQ*<9RbYzicoo!dF1JcUB{isJTkAp`ycwy&feu0n^9Ni*dZ4+;Tv>gShExO^+yc?9g z89cgkR18WaLB<*$0gc9a^os6SDa7Eof$>E_E%-n~P~KyJDB*)Cxe8U{3sC|pLZC`s zABLK83aUg4qy)4}6}%J#eZM^@e8Kf6V!VkTbYkDl7fPj|1lA1-L{J;Y$fFyw{;c&t ziL6JrX9j4Xh#zz&JE%1b8qNTvh0Vo?c({UC3GdNKsYZe`KxZ1k#=;IOhJ-!`%=YU`F@68r2g&!K_G63+q<_Z04Rlre3vIByvmw!b zyTsC?yBXYmZan}>g5DXRwQv6~fc7FlMvlN9*}&+~u^TiKh9u_E%Uch(AEfGKgAXeM zw0@27>Hhh`Kn--{dZ z_Rjc!0n(LsHGT_fCIzfuEOB!%`k&@voo!NVgOYziy)n?JmIME`^Pb(;T|mc%d3K+9 zvGLyj|Ik%>Y1YmrMOPpudUQf+FL0&1f~h11YOFjsE3YHRk zsQG5aru^~@&|w9TR=9h&@i2ni8~6a(y=E}?uHY!Kff`{|Y~;}m9&W&L+7#EPfyZO`xBqqR{t8_?2%1F%tsRVV;ott&_#3Fa^XPWx zaP2Gl!l@L)dg(#<07*?k?JeN?MoB)u3*>52P-SQ2|~369KM=!BrNdegrMsVk!V-&}K+RIZz^C zeA1({19U*KM<=Av1lN7w`t5o?NGU5vF=%|?K#2&bt=kN~H;VO35m>DB4YUS^nSbkr z5NI{iNmrwjpaV@oqimr2{?eK&bQt+tmx87bwg;HG8ed9tvA$F+`pv$8_At=A%Q0M?w*aNj1)NsI|umP+PQ~-iZ z1hvUudQNxO7_uhW3EHKF?> z6_CaR9AMkb62P5SpYD$?-Tz)}%L26kzLkQejTdo&C$u)d5ny=X=K{KP-J|(P0(dXj zVaG;0P*fI6c=Yl%afvXz&_z?Q3sic6hF(Dt3E7%83v|~KxMy7|ZG7?tHz%m)um{|^ z29H?4j0TNLbOLcd-Tc*ff!02y|R)ZhNMTYtOkf7;L$5<4q~u-^vb${!n*tP3%B#E z3~9~vI*cBj?i~EB(-{~TEc0DT<@vXVn{}UUy;LIF{8OP=U#$)+I`lw z^-_rmsQuv5eafZ#Q1ef=TGeiM5B|j`ipBmPYW~UM!tZ*l`6sJm_Xk&g*YmF3KmQ+e zw7yhxfq$F34rm2nfD8Y2eZiR2+`Es92PN8q|=bfob5&?Y$R+uG3}U z-|lY0FX%1;x>er3`vmxAh8Oi~K>fsaPzeU!=2^uEx|O)$|Nqu+73?0#=h8YwJX~A< zSMYgsgB5uup9cx?Z+ABXnIqGE0=yORg*n6=Pyq)v#|XUB+}#RAkq|@?Xfg+^h!>*B z0;UMGUggDG&@tGZ?Vx-PRs_m*{M+4a(m)LWP$A`MnP*Tc4eBmBfzEO3<(GtH0>AxhnsvTSu@|I$=h^LMz`y;TM=#F} z59Zta+Zj7qZh`glZ|8gw4>F>=A8bUY%S{fC?&)B*WzH>*k^pcQxZI{_5C3*|JFo*m z>vugZ^DH0^TnIVxLkZ--RtK;Hw}HokPV52?2s46A?`#K^Kpw3JO2Nb9xvZeMjhB6( z13#_v?TU?kyWK22y8A(jT==)2P5Xb;xtryLcdv+NC(A{sgmbsc36@TmiyUdz`F2HT zUvN}_`dhp+Go=_h*w!{1k6vDNb`j8UheGtrSbLDuPrOKF0iO<~ zcNVm-AJnmqhAu(^C2zF-Y6{5fvvN|u{RelOy1_vW@5j}5gSU}(cY_LQ>w~2l;H&o_ z7a1jA@HqI0^#$W9$arjmM<@6$BZv-<WzKpq5lS~2>5;<6Ck}h`@_t|yfs9U^XN3$KAssyZ^0qBz{}?o61lgnjnq*LL(tG{Xnm-brTfrpc1P=jj{N=yojO_IvWz*5EO3=BjG!a< zIUTJJc3*Jh_rK`W8N$c{@_QG^?@Zva2q~CvAF_xry!c~7V)$0^&w?fV7qCFX-=76D{G)BKg+C%az}?f71P*rW?y-Wp2UOakxQ7Fa zdo*C~+0TsWp3~OY+=D(|^wKl=2RNO6eDNv~d||4nAPP0)SfF%ZXi-6V$_VN~k80;Rsyq}mv7+&yN1r?~g93U;-?VwHos3hj|=v)B~pw9JRA?Rc( z=L?OcplUgv!=t+&l%GKX$n!!NEVv#l(A^J8XAtqVHG(;RM0Ik|uPnN`h=2;B*p>?Aza{U0V{y|7601+Ata_IraQJJ*9MG>`6nP*(>cZVV9z3v{1< zp#tI})+d6-&%iYRy#8p82ahRiNrFU!B)>eUT4HFu4cgxbuF(FU234!?kZTXv{6Y84 z7tRpGk^f;>aS<EDoN%HVxg55-WI0q>sCU zPJdwF-{w@%;m*Kl`14agh6#^yl$KAm}!oSTa0VK`R3cB~Bll{L_!pprN zCCvOSHyIfij=O_S@Pt_A3@Z4 z^olyMi!gZh`mwyIgec%X&JJ?U%k!W<;to(Sc=U?u!W4zT6@l8JFIOQel7K1Fhb!U% zU2_3i$P2fQ8K#H}qKM--JIIdL$#4}P*`N-3aRBUMj^pei3=9mf9pNhO!&DpttKe_F z32wxI$Jn|%e0UfbdU<+5ZO2Z2k8ZH&{|1n#W4D_GXt@S>YXmsuK&6kns91p1A9qo) z0lDV5i;4?48M>%=fGXePE-F5t>er*&L%^e(@qd6p>w$`Nm~o)>_Zqt(C!d3D11$~! zIr+GYiVDa$kK-;XIw12<^sE1Oc7fXeACfd6Zf)EFN++PA4t&8gE4ViWs*Vysb4VGW zQAp5WV*ttqGw}YP0D(}C-i(DFkga|moe>{ErvP*oyzuC(c;M0f%cnEphEHe41)t7> z6F!|42aFGVcT@olwzzbENb7Vh2b1Y8-9J1!UH^M@y7GH;x_U*CF<-q8Oq;@Lo}`S@GFN7{D#*8B9jrhD{;mcKa0 z0+9eM;dSBPo|^8_>-yb=e|v7ZPp>b(N4IaiEC2Q*j{MuNg66ChUWkFZ2HmCqL2H4o zgEyam4m!Hx2)eT+iyyQZrS^Nv0shvbOyI4(zTM{?`L{!)qrv;a`CC_krA~r2yDNYU z_vqzS5S0QAE?s?54qjc!-`WPAIWBw6z(UQ|m#212M3(y@VBXX)7qNf-ZnM0$Tdf>#wo{ zl$|_!J3)mr_-OjsV3wd`1HXXx1b#u!3H$=i3-|>c7w`*sZ{Qd7+`up3e1Koj@c_So z_XU1I&kOtl&JXwn9Ut%ucz@s*^!(t_{DQG`Ex!OWG*tKn8Tkdg1^5L$1whA%@C!OB z@C$ew@C$kxcyv2Ecyu~CfG+awj^*!k^zi9E3=ZVhsh|al?gHR$A?N_MG}qR*{4JmY zB+a$;34hBg1_p*>E-DTTyFja9Ks{>)P*59y%0rEpFTwfJH{ZkBvXsZ8yB!>Gos6%A zeOteQ>JPAhXJ;E&92N?Y@p_sB1#w}}>FD9n%_>y}TA~4Vp+~1JPni_M>qL)kSAK9t z2YVUWw=OCg#s@rlegC`iZ->n4xbkm5`r_*(&}{yB(CNE^>@V0o7#Lp5fJXIm=YUen z`4_2kSQ%b(`E=KQf6e02UHTt%Jy{@F&X@m%#~jE400)RbJ^1Vd&~7bI((vhC176|b z)4c>dMg{6j1TFpss|hMTn1s^<+W4 zy)$P(3Jkz^2!o2WZcl|5TC+hx=&kWW5yEhIApvHbejxy&!Luq5y&w`azv9__0JNVM z)SPgHoZskZeWFx-=YQ}4ju%U1LGA`0P}M8?<%clCi|M;q8M<9mKszrq4(|ZzgU-Gn z&4)U8cHi*m{snShDCp4j08n$*+Zbe%0;moE6=XUfgB3iw8NmY@pxOXjE&LDAXgyFN z54vB@Agz-fWYfVH0%@JhpoJcw)nLs>9O5A>(ZM$=I>1{SQ2P=6O;Do)w7jqJjRO+{ zgD3dh0N9;+;1kW}F))DcIpJ@a3eJ*qR0=?49_Y47&>*=Z|Mm-xp!-C&9{u|tT>7$s zxnjru{`cr)_Gmp&8spK;4)%ueTTt~T0n*-m9`2XU92K43P(Fy4Oh6-V1|FSyFRmVE z1t%2H%@PMMgV)$?x(r%l$KwjB4_}l{1vTfG5lb8)&W{$ryO|ntK5*lk0I(x&fx^B3 z6!zJWVAo(`VCZyFL4-P}6#{oD#EA|dCpx?^g}TqdqgPZB;yxi{_gw|wA$r22lljG| zeXI-{7(E(~fNTYiSi_j0^aW{egVSawq|G-m0o2-Sy;P#)(aq%1ed>Qe1hlsIINkt~ z19j~^x*>Cb-Hj1o)dxxxLB#_fcnKG{E#Yyz0VIW@*b~wS0j(Z^*adBs2tX}3)(`;p zGEyG!Xntei(|yvTn|D_js3&l;M9QO^(WjU7@OS9G3s9_r#%)2@Of(;{0QVw5K7(M8 z{!NS?y}ZW0LJTkdS%SAP2zeZ5O%H=C4+M|oTO5ADeB{^v)&rG7-4{H1dF#Fkg9fZD zUixx?ZgW1yY7!>J!06G-Y8nPAKzNt^5e6MH1iELHx9g8EgG;Xy98_5?qC3&MhrUb=YN0&=w$dxeUEP5w!{U$i^V(Y4o1mo&p}dqC0;JGk7*01SMTiW&-s> z7(fL-_!3m8t+nX3hOjY!at+)WpmDVmU(lSU&xUj|BRDw0;|<{ObU=is@qdrzLmIBe zCyzO}FhYfoJ4on&OElg`!BPx9kQOwkG}Q2HJ|NIp1KGU*Dv05YaZvkRqV+(fBshH- ze->tVu@2Or1D%fP0WEUDVe7a9aygQyc?>A6L8B-Gu2ll0wHT{bP`~OEDCs~oMZh%) zgEZNpYnlv61zrLk&4(mFff|5tAty)&54sL;1b%mv0reC3TQ-8j09r19j>dv`?%O9} zh8GvX?O3Gx1nfD?lm#t3V2LTf0q*AWAY;0)8UwBpK(#8U=-34bFQ}glK>g*GxzJ^1 z-p!E3YKOx>)i&7m9*}f(@WcQAjyvT+yFEddGBAP)pzhNzqQLfn-3qn@9I0SegRBEJ zf#5DRX#T-eS^{;yLq`RyTXoFAl@TfmQ#%1P&;!eZJPhm&rK)Hu0xZx3z*=@1f%ZX7 zV`PJ-X3)Wt4)KRu4^&PDC!;eTg&AI?gWCCsWCTgc5E4{=@^3%r(amcW2rhq1*}-+X z#o@Hh5S1wKqH)k-pa`E{)`D;U{~vQviD7_tQ5lhnX3*ubF&25tx0XYs>AsSQ&F8+XUnm+Q$w2<@yYfr%H5=zrA)L|ao zryD9<8A`-n{0660aP~Up;0lS)!wnTK3?*FPk-(R~K#>FvxeFkrsOv91yFc)62k&ou z90uyrmrB2|k_R({AXNv_R0(K*Md4deVR-I^>Q?aFQK_!0@kv+X1JGTL_dEapZ$9v^ z`3GZ}2&7?d{iAd{^kDTHrE5Wh9|oXCF>L+f;WIAXhrrkM@cw=y%<$4r1!eI4%$YMT z-HhE_F4hN&*}(1g!^Q_(tPk=}haJZcsb4VL&)_@9!C~&x%L~%!(ftx~m9x=p2c!QE zM&CS=CxC`$e0mE!Kqn4OnFuP*T0zA(_=q;}Ku(>5XRjMacfg<4OC?gE18;aiC*6oR zbXYk2JN}x-p~Jx8-?7&$9TNWzdvy1L^g@nq<8iTW1Q}j)1ngtb(l+px3@qDPc7P7p zI_{z(z{t$RcHBipgoTHL)1~_$=oltb$HoJvI2agqTn%D*>G=J@!B_m5rxx@uFt}(R zbZqLmc~?D%vGI{ps|aOr*k%RS&i*WRPM9prCVvIZ5pU;&uf zU;|;MflY!d1sMh!d+3m1WMJrqxWT7$kBR{gXb|Xs>jC~g&}tOWM$-(C<9opeqO4IV z0C76Es95kYFie2XzZt)Ev|I%Wa{fNhEbTrI&{#F-{6D8|7BNfbKcxvy-7aD*tp`f% zn_n=ND1+`z_U-0=QTy-ze>eVZE@B)m{M$}=fR;3#dl9kY|Nqzepo6JAy01fIK}n== z%m4qcC7P`nkVPH&ryhKxir+bbH$d90-J3!udZ2rSo$^n}7mjN{h8jpZt4|HG$QqK__z2Nk(5bDwR2DFS0 zv`q2zFHrn~OJh*jD|mFj@aXmu056pB>E?9&ALxM+gF5gM1zO$1s!gzNur_#%fkuy7 zL8C`L(Bi&xj|wREjsH7Z?t+9q=$>ZKidxW;Ja8<4PRaqTtn=wLbujz(->KV2j0JS~ z_DayfxGxz?44Qv3^0$H(mw}?H+o$Egix+=TBL#eP=HYGs|GxxvdO^yXf5`B+gQi;@ z`M0&OF`VXPaP01ByK{<@!ISyi|A(LhI#m>2n}KPS*Lq-D85Tu*T__@3fq2tCEg5POP~Vfraf1_lle4n__R4kiu`4rUGx4i*j$4pt5h z4mJ)B4tC7-^&Z`n16p$BE%Cx1e3HAj!V5PDL*s=lgkkW)1k5=7LI*^5ZU?&!G#vvP8n*ydT+oyb z?vH^6tRVXpK=(~|gVwEsdN-mw!Wq~bphYaaO7Z9wRgV*6@H`GGzrZ(kS8N4!WlO_A z^B-|yV4+lqkh4dxXxA%Hm3IC`5JU(x!tp&8qRJjDw3Eq!p#6R881{9_ zfe)!?{vQCDY=)e|4fOrEzI4 zmc}f8R$x5~#eo)s2Bm~n6rX50|cO@iv^ya82cyz`l zcyyL#cy!hlcy#~lKJ_A+4>}XF3o;7*;e}@_s78TI_6C4EbLTud!Ik_AJJ3K%XEUhE z<=^I}=h0c`(Q=@~c@yI?R;k~Tpb;Y8-7kb0UQAPGW$17YXgN?K{-SFKI0bWgG~22f zfsV0dIp!R|;L&~hm~-g=7d_zXo!s;~n2k^JZ*$Y{aAx!X4U;f{N_&q^X9th&Fbj{) zV2=Nyk#SNC-6uM|1w0NuWPb6v1vCQbECH&cT0lqLfYU&4D8qkIk2om?TLuO}=#HtI zpq+WWyj~!O-IZizcv;H~x?9Fo&tu;Q(Ae<*|NI`kJO@Cgdh|N-dsrVVXZGkm=F$A% z!;8N`d<;I_-W)!?u6iEY4~$Rx^p>b7cy?d=FM2B$#g<}-Ej%Dw%0ae>Lu@g?Y4$>d z*#=OvYd~gS|1VmGYPLAU>>JO88D2<(%-#(;5odd-fln{*YjM!D6sY~<*?s=S-ZoYS z{_U=Mtp`esJ$wD!T)GdWHCOK9ER}AkJjPJM%fH?6AOChi?F;`8y=Db>${E88Jem)B zcs9RaEWP59>|S8}4b&0?tM~gz95))Vc?SXFH*FcN6TwJs-IQ~E6+Ip!@&!gK}fq(m{ zG)HDnm;Z;-oH}_NJpUg6E&Y7@8kCJehYLBnq&ao6IC}m+0P>3C|HCfUH;Se?SQwY^ zHrE$$m9igmwqX1Z+U@6S(0a1O#k1GlqWdCby`zIg!Ie@C2a96M61KEv3!@Sl{_PxT z%|9(mS^v8yyygR$!j{(j)2M{`zq^Y^^8pW!=2wiRCp?nfU0M&+)kFO}wF&HJ(82`B z1xDT1(yU7jisOB{kAW8$!tMv@J_PcMeVf`1!x%Yl*zP!qJX8#?q8PzV|NIpM+z+Be*Cpu_?sp9zyU zfXc6MVP$BjW`t%pFPO9@RJzjzGywma3#8Zg`~Ux-;x#tGqq{W2qr0}iqc_z7wD=o3 zu?4Cx5KHkKJRr>&qm!V6viP@uvhWTp@wVs&6%M7&9^I^WbwT4M2TEl;dU-!?7hrht zM-)_e#i$@3{{w2qfM&GYeP%4j34q)Gi2a9V+}-D8D7p7 zMj2xU)prfHTWvw@8NnC(gculJyqpgj7h41p!mMCH`}JI{PZV>fxmog@^6F(dRU!{M zA{2Zu%c-;pX)czWC4AuHK{*_)4-~yOK5*Ehm*o(w6$7%5l=;UikAxXsh|j}0{|Ff$ z0++m?-kWbV=yn^>Wi8M(SPr3K9=&T+GC)TjG`^Vuo+$eWI)kbg6km=zK2i4B42l!i;f$Ey@1IJrIYfeA|{64+CAm%P^1_lLC#}0gi3YbXvFB-5}fT8)v zfBu$yW(J1l8kG`67+gS;qY3=mLsVk;w}Vd4=$xan0pyup*}3}!7<{@0VzuG=;hV@BniOOVrz5S?L&BxoMI|Q9rPDzQWJ*F>XMhZ7rWCYqxJbFccZw1fdzS)X2i@UxYw8-uQk|DjJ4PbZjBAaqzCES#)5L1>R zo03@$iiscm+k>TiK$pvTOZavld%;}%|Gx|Wc5f+Wq~m1YB8^7@*!~;L+_60h%fQ z;?a7tMC3nftR-jxNn}K~cfgCcv;O~oZT+9s6D%fsELe&GBzz4dtO9Ovww^3ueGvw7 zNw>EE$OP6G9$?<-7Y<;0j|wQwfx7?T4A6K4l&RyO)g65No;5od)H%Otd=j*D*4?8! zAi~4?FlavDgh%%wkJd}z9i*Tk=vL6Wkj}se(2`qGQ;389^RBRvVt8?X4#=OULEY)- zmr9^68fY9CR+K^d1K_n7#h_UcE z_>kpATO}wgL5rkHY(dIFjgsCF6@&kxU)BkL=IjlcfBY|zYCTXQ)_vN8`J_iT&-oXI zpo=~aTgRvv6ukn~{f1yeYE-~IW!Neak8ak&AV{fu9E;y+#m8d_=0CA!-xO>)07YTbRY6O_=3Zy`%;>V^1-xDXBN+cuULG#Po=pi zU-UfqQXtJm`DB_)r?5}=tu&WTZ#Mq@7xsfD!5R;NddH6Z`wy^!7-=q@&P=up3JeVU zKr0Cy`S%~et_$QBme$`jlV#OT==(L+zDDU=+o=X;ll5J9Yv)J*9GYM zG?!jS7DxVVhjuYA@H6=KdNO%je&pDF!c+OO$K_XP*4NS;I|KjmyB>Gp-*&;V`G-W! zIZ!<-;NQz4?b&_Wv-_~e!57?)I}d=avuu9A?{V>Enxpbb$L>pM+$SKiOli#z1Yo=e zJZan~KvP3$%?}hHf@z)JJf7XB`CYGj9DKp*sC>}l;6v8NhYSV`433Qt7MxKDWX zvdjeyr!+sXff>uDeBATkYi8~fj?Ism9Jx>PZ#(434eE{YyB-HEZItM676H}k94N`{ zj7K-?MDX0!ff8{1ww{E&n0FrEm8K zpYC5i-4DC}x^&-dy;R+jXI!5vKr;?ynO( zx>;|UN-?-!;cT@f6Vf zm$8(?v7tsqgrRgHsG$pP+<`8BgWk)BdO9~~JrHcG0Vq9#mI5`u0WIe0Wo0#$VsPoc z=4y1(v-=0=?62;Z{PGMA76t!HxE(AEO4(dHI2`{Ua{PDDqxpb@W5Z9DqDMZxvgb{t z7{CYgi#zgfV*s61;`oo{v?KpEmeU;^^l*;mN0}r~c zgLsv%L;n9U$A8R@{M(ovJJ|jm_G~^Z(eRt4=prbF4VwQkma;X}iZGO}2YC^`&j;I` zQXty|KwI=VLc>5)6R;Q#@aWzM8U*y|e(BPkSYZ6N+tUSdt~)3y9J<{ET)O}IbeB1F zwt$zz@o#gpaM6Cizs=2(`GEEb$8OhzP9GJ}T@NNNPJoXC^Wy*=WCUJ1*BvGSF4{Ce zi@3noVk`U?74n1j*ZEs-gPI)OS3#2zecQne;4lf7-dskX?l=XPZm5Nj_4bbZ+qqwC z{|dR*Owhq1gQbMqvHO%`_tDD_T)2NY{y*f|e3;4A`by1J(8@m0$Vm5HP=2rg9iYxI zq5CwblYIF>!*8x)UC@EBy}X+8pq2gCx_cTqw#zbjbRYG&{K&QSxCg)MA&>8uJe9Bc zbbs*S{^Z(v+_U?t3rG)WdF<4KFAV1W|NsB6qxGGdm7v7t;L=^AV$glpaSy0~a&7(3 z-`5QG%wO;X6r?}w(e0+;(H$lM_tthEixXw7+I=R?h1r9p;WtaM9{;w(jyw24 z%_|Ym%5Mfw{{07gy#!PlJ}@wNUVhN)#p3z>g2&|tzRDkbxIcg#<_S8d_v{Og*&ug$ zG#_Vjw7y@{Yy7smM#Ti=98fR7qx-H;ud1osxBuYrJCANR12p$YyavV8yCQfD?q&$1&?0d*_VYG{$FoBP$3Em z8qjhJPXo}JcF|Lpgc<%{_UPud1o2x>mP8$6RR-DX)61#{66$93=oMY^Op*b-{J)Y9 z+>Px4*>j#1WDhTc0ccShDCujs00lHlc0;B_<*#qA))i@=IOe(bJM0j;p|0M&F2 zwwn5&z9>(Fts;nleuw)p#{dS8rN4wjQXH_UIOs)(5pCnHnkr z7)tp5AM|KG#NlXtqUH_sOjP5O9=)uq^rRS|?U9Cx{|qIppcDGQiVsMDc6PslDh93B z4D)Dyqu^?E()gQ$h3RQMDTY!zmu}X*dQuGC$3S+1jvZW%Fwdh~(7~c8pp^5w6R0)h zP|6GMTh}~(&Fr|5(ZRy>!xKsHG=#x1)(Sl-2F6l7&|&th!g^8+yBJs)Ae9_HsFLGK zYYq6w-wGO~0Qm*tya&fv*FKSCV03LcSyJrL&AS6U2y~La1vJO#VQIQSSBinZ6?BpV zbg`L(MS(?$dUs^O|I;sK-v!0FXbVVB_X)?1jG%(-#nl<0+{K#*67A&82UDgAAPPK5 z)qF%D?(i{IbC9jCdqFj|g-5ro2S~p4e~AHfQXFiJOm{rU8WXTJCtQtBg3JfaO%#Ew z=rk1uY3c^Gg25(tn*P!Op9QB72TD$7K;sR~x~aNS42=A(ptJHDY(sQG8Ls6hD1(67 z>&CY&Wo>n(80xG*4pD#{APF0f^yp@l1lz#F?g2W(mGOUo!2iP@z4aW{vK+cn3^n&a zm6L);H}5BqyCv^Qn~;$ZZ~Am>$jbhGBVLi#{r;L}H6Jo^Yrj;!Gj(b89lAmiWe zXu-eT%R>7gIJtn*i$#O&QY}#UWxIj~id-{Ob&0^63m<^8knAp`v>z;V8Qh9*$8Lgc)AUWk3r@pYA*08<#7(9bG^( z&5-e0&(7=@o}I-Hd^?kGfSPxnz1}lCx`Q1Y|DW;g%)a1i^wzht_=Im~^#PaOihuu4 zxODCTxAHn6H=4W<`ve+1*j60)B8C-oNr7{i@i)+3B4yBEhvjzAK8aGxG|TOaK$l4v zq*-nUO&OJ{r&(?X4Vsk7d2|OSfW{pZT=};hdohC()PU!2S<1k`;LuSV>9`d<%gx{N zj2U!aDEKB4=RlD8*O1KDfSE7v!oMv#6l|O$|F+97I=LXmfsXZY=qL_>8#kR9RCE;w zLavB@!3Z%p)T38dO%qhZm^e6DlzbK9Z^?rwwBT>mVghTi+kW(uawG;h%G4 zLvElOlT>#+E@9r5VCZhZ2E_!Q8s6V73v zEmiXW|NjTwJpUMc;}(Al=<-%q{%z+RI<}~QTBo2!GPrTjxkUv`_f7$egZ=j+_Y-)i ztp(JOd!}>&NDF3$L@c)M#tuK`NIs7~7(D0Y3 z)Wf6u@-gQyM#rs;FZh3goX;wuA;sWfeH^^tz|vL-#Oq{b){tT-mGmK|r*E}q3xk0>6 z(LZWZ45d;Youfn)&zt{}=bJfri0;fc>imvf34t z26{z2L8E{C+kLLGcywP+b3FKx%dz1h_ zaOB^A1k|WL%eEKPjd0;#f5Nl-e3}dM*%t-<;4lpJ03E8g4U#oMT0DALLqV?P-{y0I z-I0I)85jQbCt;eb`$2bc>YAuYF*xyW^Z6>!da^{a`6Xisf8)=83=9k+gefX+I<1{yQUoea9=8@yT74K5e~5(FQGv;%ZCFzEJ; z^Dmr1f}k}Zjyt&ED)m5upxH79i{dc;7Ld1Ja4~|jTo``~sIl(TU7P?4&QdmTKxw|H zz6zSmvS9G&{!k+A+U+L*3S!5DFXcSCuY&>=w9RArg#Z5=sx28xqCm&~xJiIR?h}6` zYuRaG2AA%$uHYMhuYcm#Ig#d~eG)WOuhRGbKUlGXNB4D*Qt#8Cd6aYD=m3>xpZIkS zq-lfp{+xaBy%)5?s7A%ZwdF17pt=aqbv6M$-6^08w`r?V3|(VUXWm?Z6AngK2i}68-6;DC0@_&MqvGMwE$Cy(1)0Z1v_@ay;i=6NC8#dpwUhK7Hg1| zy!Vu)82%shNWSRN&3j5&iUE8b_(6~|&;$oRSj{ewcqi*>u+mOm5bcqC(xbEH#1D^d z7ZneWPWEH&fsFr;S(m6d@HaXC|Np<6wN+V)q4@=)NAib?cxZo^H4|h|x6KEO_`p&Z zk8XDl&gC3nMAOG{J zfFzpVF;*@EhZIDgr7W+q6hobjNB3`!Zq}blpdNw-=mxLE?AC- z{g`7Q?2K{Qi%L=qHOIjXCk4>^DhFESsB1KZC;q+}#5={6ODhe)bV1R}5}6kQwg3NjAJYYuiu^60?n?6y#uCdHFTp*1-doea z^JFgF$H2{ekM67gMb}LS&E7!nn)d8Q-fj0d{xGP!47&5f091T}!qEXVlLXox51M!Z zC7%DHvC~2Axw;&1{Jp3L-3i@#pd{9#+rtAicM$@bIg0@0!h{!2Z$MXLzlfgs|9|)4 z*PR~CuNg~pJeq$qmV&OHf8h+(s|X%CJn_Q#Ias+4SUGq|0hC&GAA?23Afk>)0}aps z>vj_G={~9Y-=2ZN+EIYNRfUm(;S;}rlg3Wa2+1dY0bZeF!VHePKtuAM_#+QG?*6Y2 zQlWDoP5EG&qc&rjBlDp&N9)7QOk`vr(1M<#?S(A5+mRTgknU~?Q< z5K17$v4E2UTnXGDHkhjNI@gv1rDdR1E*v{R6=#}@^@URQG)GHEu9Emq`~qGQ{Nb0< z`1MXz@t5*~EL2G2*E>|jRO0lBUqICNs4!?#TLZ`|k*6HHPkiFnIhdw>BF$0zRGOpp z=`tCxmQVbVhrm8@(LRvos_n>?=4yQy<&p^gZHIh%MUTmWin@ayy&?{d4KZTtxeQvUXXFj+1~{{0S2 z-!Gyo0ELSq|9+oKJRk)u=+dB0I#`+yB+Z7dzdXg2f4>Jjuugyj%Ym!J%aMPZ%O$p! z10|q=^Goaur52ed7#SHD9JNn2zGP@%V1PKVOcAV*9V*Gc-+@c}1hN8@aDgT-Q2$8d zMLV>`4n91vo7X}PG{Fa2ya=AWlRUu6@Zw6%um2vMtW!Z!z2J2mtQXBe%0SzQkFy>$ zhjfcyN8%R;N$7au|QE0=fVG z2bCTM-QF@UOd3ILLa;?M!Mo_YJq2Fy$AKy$km0N#7O1liT9CNgqnp(QK=3JHc1t%eGSEgmW_ZgYTaaZxeo_K;KXR;L(K!+aoekpwIzrz&y^{Vg?Dk5{VbF>X5xW_5c5iD=_KVwZHy@T?QdQ?tAfE1=Is8@p~b66x3ZQaebj${p&w?*iz*P zX#K^17KRR1M;Y);IQxqVHU|P~>1>cyZ@1^aM7I!!JNXwBQO1 zX%(eMH}6SPDF)*MpyE*gbl*}Z$nXC_{L)W{!Sx$rJq~E~+715gzxcO*d~xU`$Ze&{ zF8tdM^KZWn+NGVZ3UYTT;@%VRR48PtINClLh;Kpn2eW#bN-?yatP=vqH#GkKpKLu@ z|JkG4K>#ug08@SjH2#BIJuB#J3=|z6-K;N7aG4KER-jej9!f8dC^0Z}H-OH-K+z7e zZzX>Hto+*?lpwqC4}<+v2~vLv%|EAFFV%nM2d#8C$S;T(-UONN2~v;M|J@EUsICFc zr@_uU_vn`8HvzSDezsn!6NQa`cy!MO#~;|fU7)=fkW)lMqCjKk;8m`mwE*1Uj0&1a zk3S4L)}#BfNB4PtL57BE1%?uSgyhRLO0aYeI>PDY-y?{jba0$NM<5$^fVO)u@VCmS zFfhDyKLJ+-l?OHXgy4$8L5en={QnyJf^s~P=orw*R8ZeW1Yij(~D&z}#R3k8W>||DwY z&_XQGl`T2{MgR7IjZA@v6s<-*W93c;a|Ld1ul@fAwGal<-onx{Kmth zm$y}1is8763aAIe@S@@$xTIkRA8qAv*rS^_Ok9fLh2u_Eh6Y<}anR^-E9h)dP`Mre z3Ihk^^Up*z#X<8Zyhb2BwM^g=D$Ju>R7hNk!Ewh6&_b_n-oIi}3@fM{kWv1pl_vpr)n*xXJ!sG?WF@s^*_^z=FMm{l$JJ28Isye}_H(9|z4IUv98n zD+cPXc7bXM@CjW39^JevL1u5+0b0w$3zB~k@%R6K@GP81^AY$&2{<=F&o?vh=)T$b zOPG;?p(Ld7mn0JdLusUE;|ow*p@hw|`3FmBrDJm?3u|eStMSQQpmWt7cj$noutZsV z1QI8v=g+|L@WKgRxA}r_%>~&VkaG|NnhK zi>wZLbYK22s@wzKObb%oec`|8l5PQp7v~unkc|O388p8AV)`~v;lg@A6jYxcC<%Fy zwizt294g@K(aU-~jgR3NYpwW^wleBw->a|j`u%k4CvP~u-(ryw=ToMMR3h<2dU<5lGelVhJb+j3O+v|z@xb`g2AKv*KW|_9N5VQpe3;ZpbGQ+i>7U?3~3WytY!eE$5KOA(9D*P ziURolp8ujDT>=cCb0X>_zyq8AMXkF)r44v;K%+~5;q@_4_e5?RD?{^daH}icB2o+xTM-Qou>V2*Ws>$kX`=3bY5>j3LiRstiZOsZ znhFsD?SGQm4H|el{~`z?1m6Fo0a0ZS7NThXlS62*V<>2=$xe^PH=qGkSL3&y-8XzX zbNOE=Hh+tv7vonDPMk% z-car|m(E;n$L_lzn%$=}SKg;HSKOnU(Wi5X3TS-DwfiY(Ln){daP6&S{vQzF(GAwg z4j!uT0P%c!UBx|mMMHLhLV*!vM}>n&x39QIZ)kl-EaYUgjMf7ciWaf;B{HtPwXA8D zvFxQnJ3#x8(mGwacYwAfrFFWpgLQ#6m^|Lx`M3LWzv$ryWjFrT zub`n6)@OpCOU*r!Pk4aGpn2~Jg2&2OUQ7*S1&yGBXZBBlCN7hCcL_={fHsGM7lriN zctY+R`SHR^4y4pq+@<>isO`b=LXsD>#pD5h_yL!W6cq=4L3YrAUFD9TMzo;204RqT z@C&*txOAF>0^Xz3pTncqSKXsCUciNayDvLvX9G9rHW`gH7w{3`8t&i)r7oT68vKIp z5+HeYkY_=>Mf7PMy*bRQPP zk{1l^Aek5y2XMm$a&r}^d<1voqBjaNyzu+T0=`dF5mZXf#RslsOF`;D;$U@C8^E1RJCLD~5Ouqd)UAV=mkUw%ZG$kw z3qy#ySxD;k!PL1z)I9^)%L!3eg`^H74z^boqK<8+FvE+7)!-q9C?s`!JE8vgS`TVb z+b-n;ZIA<9J3fa`is8Q~A0MbW1wBzo5~lb?{jdKoK7+P$cJqpWO*_fo0vbgG6@|U5 zjv%34(W;}UD_)pDZdePlr*fwHMb_kGJ46@#(>EWNrI-ad3PO=WO%U_JcH;++kPG?h8MfMLFFT8qXW{w0cib^Li}Nm&Uv7<3gFvlJ0Tu15q##zFnJDB5tfB|e(JGTd9lE&hHKnCcD z#IOPj7ZnTssR#Za=xhVsFXGV+QUYEG!tK!;<^ql)1CVHMSOS<6;n7?z!BAoZngBBn zh3+c*Wd+$)R>TML*SQx`Fo~Z~iAbOSt#>(B3DeWIM%v-_k+^TQ7w-3MQ673X8{(0=ICo1)^-dZ|RM`;f=M z2TUHl9vCXSVJdS}99qAXsC6InIQW1Wo61C($`Ta^&u$Kv?o&R!t)Pkd?(06CprWMv z2xxK%R3>$nsAzy%1PcEHGFlJtcSwOJ9Knh`x_ucyqc2<@){YMREuif*pd(dVzm;fo zpXLug*?sVnBfkL4u{3_YgH@uX!v7CipDTI=+H1Qp^Z);spmWAwxNm1==>F}|2{zDj zE-1vxjJmgiXh#bf70_x;kM3TO(>%McJAzISNiF*S|Nn8{-V_x^>wiVJy1~Kc(!CTE zp54D)Tc4B|LdIJiyL}m6EC+YO!3KbiEdgJ0x9#|g1;r3Ua#fdbA#>04Wym=$#6323#>jTA&-er>*rsoq8I7 zUMolifAj%Rals#b@-u(j!O#4WtZ|zJ8D2b$V`ccvuk*vD`*`#@ls9XeZ-GRE;8+@}k8`yOM9?-o* z2rjr}gL6;6_~Hs$o(CSE1kGZCDnQVA0iZenJmqk_5mXU?r9cCb@G1w?p7Ln6eZvYG z1!`de&0Mn@uz^|?b>RDXe7adR*+30EkK_}eYL~^+gZY3*FK^CXNe16;mjfIxqP~JA zuK%!t^weJftrK7cHLyV2p5j4{>gJsR6@WXJw+}<41w*6?L!=@ys9AAwVo`|1=sDM)d<~}!ONdP zSp(D-Z#@axTLuaZq;W5gZr&@*kjRB;3;+#w1%QrCmj<=B0zefm^pHC6Wl$c?M+~At zLyn8lG)90mMnEznXa^{gjiBrf*Vu)oQ30$GZleOSjZC0+C)h@CmjPsR^BW8B(PN-J z0-)0z(yTA=w}NK+A;*xpSRdeT-3QVJIyKcrCBmau^u#J*2GH;?c=Qy~k(vxv0di(< zhzh68LQdh3C9 zpau?DwG61m>jB<1C%S93FvE+lpu5q#Prs0L0;vIyN?Cyo2hEs)wy{FW1@Jl&(4m3g zEd*GO4+OU-C6Kq)^sZ4^09r)X_$C2-NW?E!<8S=iKe}}PcRcu9z_a^?3->>l&aEpz zo&WCVF5T~5+~fdt=}UQE7+i$(I6=vqq`L()Ow)AuKNUN+rtYJN07%q zfNEZC*osrIHjnNT|3&AO2{3emwRGQT{_!7lchtETA00sJOJ06rWMF7LQ1TX1KZ43E z-v;Qu=z2vy2FLDy9?btCdze83@SsB{L3^1&R|SCh%{BixnD|?}K-F3|&p+r!Ur_v5 zfOkv(7d3=9n!g2fwW9}EjgN|fPp@kOcq83Ps!tN zQ3K!o<)Z@L2JLY0p#b*@N9*(aEucYYk6zLI6;KW5KpJ{|8$7HJ^0$5jrNLg&D466% zkR)im5$KK){%yVuEhkGfJwQ8jdtDnEekzx8HdHWHmk1wYh~eMn!RYb-fJgU*mXoDV zUNawK0#8izhPHV0_AUUAd><|Vt^D9`1>GCv+I`lgGet$grX~YZr zcvgn)sUY=GZLY=#{)nsfg&p&p9jf2+nuEr-FcYqG&{4ZJpQ6vUxh(~zzf~)%% z?;$IuN-Z!AwE?Ry+0Z=~lrS9sA9Jz(%-^I3O1a(VUa;ANq8fB$#JLy0>_EpyfF?qq z`)5Jv8d2#Y52k>|Yn$JAcr@Fx{Fh{4C@u8p<&~Z<%lVtGd6=huplAI2al=0~1-SSV8!KasXD@6L+Qc&V&{4ekt zvO$DxxiG_vzyfd|e&#=r)uEt!sOAYXyy(sWC3IA)ug?RS?g%km8&t*w`1GV2{K*>i}44*#y|Rt>N75g@zr4C_d+B=KKt|+ z?6c2*!5+^+^VuAb)#VVYum1)4ti+?2cNxg)joFw!>jhh#4l&&e=Ck<_vlYNrJ3%Dn zJ-T_@Ay#)lqy=GCgQtDKeXlT(?LYHC9*52Zf%YeP^zxR19AJRO0Wn|)Jo^LoJ3MIL z{Q-OK{t{5o9t2B5gO+D0=)8D@4IbS`fln6LjWGj_&Iam}c z^0&MOWphy57(5XT8n?X-8ovgO6gu#4yXL^Z?JVdfhJqJ?pcUc0J>ZdTuxM|K3MjLA zbpHV5vVa$$OJiO5w?oFheY(%P@NeG&Rsp&%!-ao)jY@zc|8~$3Jm+7q6hoW|YR-eM zIsi=rg6`Eg=F!W0VxuJJUXAN7 zj2ATq-8bP3x^JR17&JucV$I6%613jd(^?L6g#>tJ#Iuv_wJ_)~EJ#dwm!YAzd;NWpI%n3 zWx@=vwS9V7B|!`&pI%lC5JS?Zm(?7^5b)_`bptWjeR^3#mkERRQl8ues(Ky&AN1(u zz4TL(;lmUDrcXfyQ>g&|wh$FX zpYG$JoeZ77|Nn1(%~*K_)Ts-AoMaAiIv9i7`wHL@al<9T3@>bMu`uv&yU}u>MCOG- z_OJiOm%2~49N56f?{cbxH~$AXI2ED~cgQCHkOUoh4W5Jqn*sbOlClh)Te57ZuQ=4urehLi`CMLHUQR1`|t)2wS$ zR7&LjA8!85QgafN+hRZ?#fEX`d zXZ`w*mOp*Ed08Jzg0B4lZ(x(m6<~Owa+(E_Q=kzAI(-~`Rf|WOOQ(y97yq^nP{=v{ zzu0=91a#-<<(a|^FW#Mk>Vl7rgVU3NPdDrAN1#Ffo4%k1Cg@&QsJS37E5HrAVA~J6 zF+J6%o45OsB!lsRv`!Zl575n=63`d}B_0psOK=?*yM0s?T2F$;e8FkMx+8~&fuTeh ztPXT;Ca8b)Vi~v&1g}!+c2QC2Yy>HS^avrr1Sehiw=wy2pYrLx=-PUqMAi{>ny-Lk z;}6huM+qM|t-j_2m-(-mj4wIzZ}VhqJy~J`8emcc?Iz)a>?ZN-KJ`*D@&A9v9iVL_ zAf7Oo2iiXZ;<18xpp7FS-uDFfoIP6l0aYvtjv=sPD)_e-vG{iX@aVqf(f#s;!(vtj z(2+MBphX*?t??&(x<9!M^BL+Z@0uN1|iv9opA85xYQ^RlWqWjP` z$uSksM%e?7{M!!jurxek;@@@xB;&~Ma>9jw+d;56N5dl){%t2fV*J}KdUl`V-*$+H z2{dBq(D01Ih2P~ABw$`VkNf}Mv-`S7_gPShf%~A%m;e64BLbQtK7kfgarktf^5}L^ z;o#Re;nRJ<^WX~w$L7n-+)hx zz5J^6LMc1QK+e|}zFz_>0b9obb1jl}(BJ^~|2aUr3=}{;^zL8(MWd2H3;95;wNf>o z?(;sqtRC})8Fn#%bN2{63qImQB791GJ4I=mZf6zIHe(4;L-2xy1|w4k9V8$3i(oDCWx@nC#m zqzmdkobc$r@n3XaBFN3BJ-R=<;5Gya&rt!J()z7b8RCbQc_@CE3Yvij`(bwy$PdRn zy0@rUVDSTJ^oZT#ziLRL0Jst05bV+T1~Nx})1#Ny71WR5xD1*^2CedHJy0UxxC1i8 zeBs4|AXbLg*8JfIc7a4d2~Pn;7=Q=|5CJ(*4a6$o7ilfKO+N zN(5*+13Vrk!M~5a1cheaZzc>8U>2+mvG$Y0`QUNzF^dQDJ>TwQpaQ=8`U`hX zJ_gTD6BXay5)}^qecUh7+`x_$N}IsH&zsTX|KS%QV3E=fp#3=k9-VR?{||%vOZ@w+ z9UA_}m-2x2<@`VF(HY0_`ZegjRIvII)?>^JuP-|^{MRXAcWC)vvgq|OkizC;0v`Vl zdv=<6HXq}7-Rs->zl7PbQ{S`u$jdkXP>K*xutLY@n{D&ngBxw2>!(YNJbHQcKL|4X z7kwBFTC2$#^d8bgl=SEojhh4N@1OWD`Zo?Nr}tix;WfKQH>)a05oi+oJZNPn^1@(e zaQw%BFCkNie+e4$1jV=msB;+xj&lXjRGfnGe~->s1CQ=oowXi5-9I~P9ejFy9bAnM z^n#YPgnIlJJ@`(N!KJ&@!I$})XX8ImQY=>U>~-V!v_4kO<*@@c83#VE*7pxDgNOD5 z56~&Kuem|>%xQ2o`{2>~tyB=yN&(sR6f}Gi9~XNVWR*|%F^}F*kDZ`$^1o=vJ5Xz{ zl-C0?oIH~5`zcAsy(U1IFpecq@0nB%T^@TQS%0xg$H*}8vj z(0R?-@JqM*kR!j#A;%8J{|7z)9|WCnYJIxsX7_QYV=NX7P(KuLfM$hd!LEx1PxZoG z1qvq^2FDkCJzRhz^o%VRP+RMlNB75_pu*O%H_-FHXkwHA147;aEYp3%u{Y4`zo=`J z07LhM*4yBNLNjIwGrYKb5Yl*r@8t@JKiqoBqnGz@E~tQFO`Zjc^6MVGpzRj?E(bvk zLkCZO*At*|b`8*pMxf!dkE;d2Co!`6fJ&_xl>|srG{d9$2xKK8sLT}h=oPg98Q06Z zH&cM&WyC=ihL@lY0_c2=V2|cE2B4!Ln<7A~_9}(J10TE~<)DG?m%n2{<=bgc!^7dl zK0i>-0}VKjA;I?P%h@t%e#CgC@dhS zo)|>G^Z+}lM#TZ#sx&|;(LnK~5DK}I(4!S{lnjf>j=6C%GN|^y3pn#S&TnrkN z(KP~5{H~uMv%^qZ~*m@JV5Q;_`}CRJsk$Hzy?NS zvp_xst$i>+ua80Jv49q2h+51LX6XL;;^uP}P+yk6Wf~};yCLi@1_p)(3kJvmuaJ8< zK--CWyomf zH}9S_(E7xE;6?*j3KU657!+RuprJPf{%xPYM{=AjsRpe?X+2O<++e{_k_XBO1}~O8 zU}5k9ojomTG+mgX`$YGT7mV*%7#v!@m1sDE4hjX0;_8E>&cC?vhJ^txW(^TL0`kfE z7i<6h|KANx_0A7Lj9MDa0KHwJ%IS zd03&rlEI_J7UT6?$9Pai6E#?WH4$8L&Uc7z^j&0DMGT!j%!VE9C5Go<#-x{DY z2V~w2h{HWW<~`YiX5Qgx5c6gunP(3&Zx=!(l6le|y`miu^M0lXFua(u2Q&_G0JO;M zaJM4|mVbYW-ir?sy!uJ?lTH9#i$`75y_694WaVw{SpQ44wz?2CXp! zCoD*?-I)sU<`&RG!PWz%avr_B52k|3|J~pKLDK}v51{J&#EZ}K|NQsqKE8?3qx&4F zR1^lMX^`ot$-Og11-4ZC2PD0g%6jyQ#z5S6HW^f`#z4-zjDH!o8ypg#`plqI7Bqqv z*zL#y%KQe7ouJ_w@Qv_b=lk?Jvb@*_KDngC4%EhJ{a>QePz^a{y9AWAI-OZMK`WII zdb&X(VADX=5X{!YU=dK=4;KN&6a<3~7wx{-?ZNRf=niP<5I8tW zIVu;RSI&U0M1R?R+M`!=*JMb@Mm=U>@aS|^c+n^Xs+{leif3xnex zP(kU@E4mn@y!%M^X^-w7FU%gXKqja}*GvW}1@)7a;9@VPg2X_b0Y11GD89Q-`*iLvurkkE;v2A&%7{I0r?Ho0LzL?ik51PwovwfQ1zoos zckKYRS@;EAj~sX1kO4Z@K+yGy$8lEykn%MC;u{=k{B;LF&gXwF$dJZg@5;cx>jj6$ zan~83&D@=?Z;TIkbh<9^IPMCXJ7ahe0o~rZ5_H#KZ|DS&166oIle+vZQ$e>@H`FpR zfX_HBk#cSQ25|tWKmNV-8^6nU*Vg|o{4W0;yU)3{e&cTeE$wT5$p|@33p9?R0lu*Z zG^Os->&gI*`)N~z8D1P@hgf06%E0hah!J#&(@CFR*BPL|0H3}S@n7_70H}T~6$bgn z@tGh4IGiJ1{s*s8@KH&CuF(OVW&@gPJO@_J-*Ooy?`nLY`}%*;Wngh|0b)HxnBgVp zf<4dxK!iu9E5l1ry=Q#Dr`LA|sBLE8(aWnhMHqA{tp@1yW(EcZ@TI<>di=lWA3sn7 z-j(5X%74*}00D-b-@vCA{P-_w6adPqH~xzT1_(foo&rrBgIWTeAu1X^y`XhJmtn0Y zkM0vb-N*lnvO*jt;&I#+QattY9-1V~@KTb6fuTFLqWc^uM8g;v7{DP43M4QCl<>fz z3Oa7Wr`MGO9I73Yg&AICL+@a}!^{AQvj*@AJO=)j67W3kW`C$NSAiL!96sHk<{hZJ z%;3>|00JT&>Y>!^v%t_z^2ILb^+<{JZI`CiA+7}#w953(x`~UyH=n_8x zhMiwQrgZ=KFPaC6UC@9+ub%*De;hbee0qI3An~;WTo!d-?sQSn02vFi=)b5V*oFM9 zeW1zb(R^mYl1MtOVAvgWA}N`;hHU=*?w^Bff{+BjG+dOLQuoH+qVLAXas0% zWTG&`i{&hkoFT!)!0@^he5x5JTZA@%!nfkT=zU*sn1FMI_G4)HR=j)(ilJ^Fl?t@* z-2qn4-?A4b56u-5z~bPbRh=lz@Nx-Q-nGG_(-piTI>4jXbpvSNzyrLk!$k$ut@P-2 zo#4@Z9kl+%0_1RHfyLK8A82B}>w^?u-N!*IWx6lJ9Ha44>+k>n zuH7ywpe4+QCI~Y)cKdR?U<6e!&HtE6jXk_utzWNo<3oQ7wiF${#k(0ZSc~?=AZvd zcs;CrR3b{){)=XUw1E~o!i5V!!a)#W0S}NckB7By14z^cEb5~Y0TyQaFRBd{D1Zq_ zfdzaUV08&?}QgKAqBULQDFy?A#ENqQn&`g=D-`aH69QQx2cps7@O@Pc-z z<9Wf3=Y~1`p9jcur$JpUNcZJsj||FoY0&y^4bXkJ;F$)GZqEOrR$k!D3))^1-v?fX zt?|;#@7I5DXBd6^0c?C0d_U#SZ?`~3d3N8Bz63U^-vexvt4FuL0I1fq0E<5K1dED; z?m-2mmYcqy)B+nxIt=m?8)&OUC-lB~h|3Ry)=7an>%V$I0SZ(8a<=cU|1XxU2lYN; zR1Cla0t!eyN>F@&+pi9grnjr{ffpS&!J%9#1G*Ehmv>^fFvE)_8(2Vx`*cG(*`T>S z(E0EsDgiHU_5S(aeZr$xbmd7w2G8RMK#Bc@E69j$@TCQ%iV$OxK*q#w06C-tGCd79 z>%Zt-a75hrFM7oTxga@*omCzo!5i zPnu){>S_L9DdvDgdh}rr<{KWpqG4U2o|E^V7Yi-HgR&wXy`o+)v0kuP=~-}M26a-Q z{zE;a96tXAI{M#HD zZIntrv>YfEg@_3|w7m7`J`CDJ`~SdeR&agc`Tu|i^9PVMEeA>$`ggmWudAlP9JTmHfsDniw% zHe3wMHe3u`He3ukHe3u0%#6&;%nZ!f00Rzjm|7+R@(ld)3?FQ`7`EAPFlNc7(jC>y`tuzu1PPiMSuXqi{FB*44&QRKvDTXl$F7= z*`A?X9X784*Krmvi`=1goCVTyg)=_gcRV|z!84GcX)llNo1UG)9iYAV ztQS`cGkA77&+zCKHCrak&Al9Y`-kUo=Ov&+qFs$ocKWFJIPU0S z1)b^Zyu+iHb-`+|jtI}=&PPCMJdZn{0nJc!`l#f1b~@ki=w|NpQK@k3^#0<}ecJQ5 z^Ak`{&GWeP8<6V%0ST=KD&@gL=}DmV)?3{`mBSnr&KuPay>KnEnAevvK5#L(URfRTa0b^$AcP>GT)1Be1? zY)}DBUZ85+vx0?TSAsGN!%k3N>4h!0-~gp({ua;yEuapJ!i(~1M$iS0`~nR8f^8zo zEDZbt9s>M=eJWt4g95)`n+cfdVc^lr`qPhrfnTuCMHw_s#O%?_Dq#n@h16NVqnCBA zAebrP(aSo?5zH*`=w+Sm0cKWs^s?5tgP7pU$~<~m;}pR>Q1{uRm-PYI9Pn+F9=)ti z)?hi%E-Q~-R+kq){(}#e>2%ic=w%gE0ZBR=cz`Zw>Sf)g3g$+5^s-tjfSCy%y{rj_ zU}lC#FY8tv5VIMaTzXlrYk_&7<%}M^tTRD(;C42H77KdxvU)>!;0@ostho?JfVY8n zZU!w_esN14w8DvXc9$f>E*1qdG0+@oXY&Kl@%jF<89`!YAh8!tV2*?sm}3g&fM#F1 zPruLraX1_lq(E&2X%Hte%+LtL;RA6zBSXVL97Yhw4=VFz79+zhzc3?1kj!%sC&0ka z0K~a93mkbb7M)~-q`sL-f}peL92gj0th>s>aNG^NFT$hy^l`Ts@T!5%-9JFCod{ld zUje%P_Qh8*&?5W_AxLWoDdimowWSL{Wl@O=B-J997LfCqpj%(N89lmxfis;)_s#zS z9-xA>H$=t4LmNB_e;Ryzg9~WuFQ~3!J`Or@2&F6oWiV*|!qGnIKIPl}p!?Pfvt5h~ z-KV=hyx;{hT)Ka}SiBP~^y0-W2;;|#jbMgL_lFnhAl41fULO@*;{(Q*96Mc9cpP^~ zGcquMm>Ms{Kk_mdA8-UM<^bgqP-)Df@}kg(fuZ|6NQJ|*m#74Qb~Q(UWK|rGxv1#yg8~5Dt%^Z} zsYmyb&~T65j1G^+H=qNlJvt*^fTolS9vENp=}frMecz`uvyP_%C|XMgTIGG?#+`G@J4fv@rp+ zJL88v=wwRJU?_h}BUp~N^s4~Fiwk%E|M%kEi1s zNTD~!i|=>-gHG<`Z}|)wkL?Y%@aW}@2Cd+~(0ZVP3v@g?csq>*Xb)bmXd=i>kbSKl z-M?S#0%-;}&iPw5vx83GaaRDIw|V_a&fl9um3M6fYpJ=nZZi$ zp(_;yDRlrTO$9lr8+=I_D6J>(3$P|E6J~G(m#?m%>!le%TYVG$Pv8KJtDvd`)tgY2 zpe^t-KW=G;QzJO1C^rSs&M;qVTSG>FIL$9`v3AQ8z{Yj z`knC-kPS`>KE1qGmw;*=MwebErvDROfX?_pcz+{klS2+j??kX(Zt#@2PcQ3+C7`uA z8yFZI|6fN6u9G13HX!whYzz#>-@x$)I(`#09^>HC3*LL_0ogh1(JN}TRG8s7I7mUG zeV_;vKr(C%$guZzzy7}z0bAY+sRO|3`NI!*^oCyG7jzXk?g~2Nk%3>(^@2yIs|3HG z>jQp4*AM)Ht{^e+#;yrqo!wvqz`c5x?n5BkCV&b#4~RJE6n;=3F#bmt1}Cs)o2@}^P5_-^AAZ2M*Uy1p&~=Arx1WJeFYAfL zpq^Oh4v_5u4oIH02WeyiX;f!rVDJE~|MBhh%Q)_$0y-TYG{iM`u`p3ee5jW&7*@%lps)b%$MG9o>xo11cOl-3okr{VG7lGB|(|KC9beVFs{Cy&<4= ztc?Eykd1QyIV&4v+yszupoP7l;?K9Y4>aL|WX%6X!VI0D&MC+kuz4U0k&SW%8KnR+ z%9RClEN&af1W>4hg0<6i1=uSUj-73w$nx#&1Gg<<7W(wE&RqodzYl0O9_)Y6_CJtg zu-c{$vTc*ium3NvGlOjd83&Gga8mT>blm{A5Y&F?z6W0)2{O;8m(_NWFoQ?(VdG04 z%?Ct$x&?iEd5$^$5Apy7Hh)JBGXn!?AuvV{UrR}(ri2>Z| zG`?hf(((Tl&(1c`J~L47L%938M=viENLMXL*CHm+EWs0xUemILpt09GX-MaJfX=+@ zKK(qmu>^_k@Dd6V~*W- zJbL$nA`!Blq?_HP`Q{WA}B?u&^d*1_HF~`6y^Y<*-NdahB%aj73-fA8Y={ zQnL?I0)S?h62Mo^uylfp3b0kpKN*WAIQ~EG*!-WFzo!7)=dMwS@a(>`A9Qd4zdWcR z#Q(4cy zqbdYl7aVtO0eSzpYX_*ufzBV8`c2YbMoCo`?F*BAJ8xgJiT@^ zgR(?5Eg946?e?VnQ&3Txb?z5hq?G{Q53@lqf1 zn1e^JXc0*4^b6xNEDYV?sjt_n;L2;!5@CiHZ!LcPe+{Y37A+QLcySlRXWh^0z|a8B z%Am8DEI@apc5hK}0Mlz!KpW#hXEOzW>(?zR5ny_b3TRgWQjy+$+@tXbs0kI1JYWsV zxsd%5q2Z2@aj)JrDj)v-|L@WGMgW{oq3tQwhjT#r@ChiPfX=g&`YgZz+H?fIgwDYg zv}ud=6lfjcaTgUGP$#wf6G$njO9+~yF)_XbQf=e7qXTq1U1y4lhexk(2WXzg2c+7y z`y+@Q0!b1nDls6{86cq?aFKr8MWqC!4kTRT)49|EwE8yh881Wkxfkg!3=AHiL%Kpc zJi1%XgGv(6@m8)4FLFULy`eL@&%I!B0aXF6KO7+od=`KC|G#@KXs;z`37molWIL`; zZ!gH;AVPs$c zrFWOkr9Pk?$el|;v2nb016+LT9!3U+v-!6Mg~w8WAK0`SkTP@ z&}PkyxuEqNX21R$A9xAAPb|3|QkVCGbbv-`vM*G;U;^LYbpcesiFtH`y@3?_#s^*( zc|i4LpQz|G5k%s-bk+!_pzuosGm!Y5F@iZrT#xQnP#}49x(F6{B=>{e(m5UEmR?83 zPKevG4_0_EAM)v)qXJ4qp54(Fp54U`p52cj4SaYS1hwxydNUS6Pt)`0EKu<1-Ux2N zcUFAx=}dUxYW&2fv*3YGXT=Sl?w{R_psv18XKK1jXR3Z@D7#CiE4MAU%dc+BpvE9n zB5>T5A5@?ocS`_KujP)r@`KhD9Cu3qQLp)qyYhoJLL7HX08!w%T+p&^Pyyl5Su5_+ znJRqTRUWjV>$s~jDDAyaH~976vHQ$%S8Y(-wjMa{YV5$lz`#HCV5hITXE!(mUMT(L zg7h~(J_6S}FBA`gmT-ak1f`&P3#Wy`3@>bFurTZf<>r^5*;bEkKLL;4&~#AcVc^s2 z%kI$~=HT0X43u9qKqni3HZlJXsOY`{Z==hAOgV1y>;KDt-~~H=0xsRhJwZbujQ;~b z2mPh{^tx$y^onwWR#G_lcophEkbYd&L% zDo7G4VF0SZLB3K1mwo>h2s6C+X#DH{Yi-beO(8*s7sAt778kO&QfT+j+ywS3Z}@eQaH@qr{opYE5g-48svKe==>bx#BZfMfTG7mW4{ z44%z(1`ORd!26gk@(D7$h?&O1@G^^)fuZ$wsf0(b=#+(^HZbp3kemZZ&JWz;-J=3( z$L|6)bU-IMN`SiF;FRdteg4G?&?Qvekd7fQE2wR9z@xJbq^2{%z$4j@rJJogjKibT zcezie>ui@!*Tp`auKRsDU5|H$u0QU&nUR5!p)+>7OK0uwAJq#b-72c=(h#J44v$b-6y(T*LS+J zbh`kS*4}pMtiA8kThHOs z>3Z3>`*^48@fRm;AgcwOKrP{Bdr(*V-*jPyQfp9a&!^XSI;fLw0c|}Rc=U#z2bKDu zolBsTXh0*Cp!G!mCxDu7ptE`GKm}&^x#R817l8VMuFFA7E&m_zxcCAT7~QVx z{~x&cqSJN#3tp((+dwrT=!9q|kfS|%MQuQ989QTCEI=Lr=Uv&wF$;V!9o& z6Ybn__YAPx<#vP8HM2*rs0+mHvLLsEU04BfQm?2FC}*@=LqZT#wRnJB5eRj~Hqa_W zQe6RUjyug4W_VF+@azA})u0Ar_qpTkplkznSKBU_yS{*0D<@vG9%f;1>2~9A?LN~T z#?tL4@M3ZnCxb^PQw%;^}oMaBreu&B`vlB{ff zeU^W_>()+J<>Rixpgz-!6wp{pr@MkjZ@7SGH@E`_X%;s4ePZksbh9atzbn8xA@3%>&fPW&xSs9UcKTr_;T_vAYixdLI1i zPk1o;CqRt@YXBPuH)J}bjAHyB05)e2c=#l|0%A@($YvCy`a#Merh%CtPk;?{u~-gj z?((;QNdZ^>ZZ>`aUwM8(*XN)31zhz%@e8`L^9%ZZhs2CHB<~AA^1i@v*XPQhtq<(S zU7s5=fVwu2AnKhC8WKM4`XAIb0oes{r5HO%iMUU%>vNCJcF;I6sv|*~ppFDFK^no1 z{N^UZRN~p~y4|BUT*I^5ufnG@^|MQ7>hDh1=N`vhUxT6wq&UFCvD>WxY&;@PKpG5u zy8S^l;r|IBb79j!kkS*>76uiHpzU3tipHby2&l{k?WuQ+fi02;wQrI3$AX3eL6=ZN z&hGU%_=we``=+b$H_z@D9=$eP9=+Q^<+4XNAE@cX33i%*Pp6qjw>PLc?><==dj54M zXrXLp21-A`<`QOITLt3ksBo_ zt-<>pn%^;&KK1DC1vMQ(H`Rd>Ip~HuP!@XO`IU>|g^9th|J^4#+YczQFuYjK4jPRw z0pDE>Qqny|1*D^MiVBG5(h1p`_L?7bi!n%|8zSKWN;|D5OU%06LtML0_;d@pbRPn( z0t0nLYC!$;pbT)B>Vw1d;tXMi7dhI${&ydKSqZLV&c2BK`u{(u&dCJzwJhs3_*>!` z85mxOse$&gl$bQv2QY)K3-Z_Ko(^&;I2=Ir6xdiuKkgLBSW$?vN}zha`#$pcLbtz$ zPcQ4+3E=UU?#mv{2gH231$}yXj)TWvK7ee$4H_Q+4FW>0G6XL&wdnQ--w=M>Ma2Y^ zjX=!^P%L|N`)BxcGdlhc@bKyG0pD#1+M8_9eVTv0e}ND4NuN%LD5#_1*)0ZkGAMI_ zu8}{+(fpfJAyVMOt}t9A1}5lGcX)$7f@zlV0_Kjea)kn_cLg1 z{yWWI|3SO#p!Xd>?{@}mfdMDZGiS~;AN~h$cyD-$cW`)h>7K52#e)n zNQ&iRD2e4_U|>ZCjI6AzOiaikB(a%USXr4_SzvAl(V+YV-JjPz6Wq<|{s~&~BmtVb zk~ad4S)YHA4jNbKKK90c9_){`X&Aq$Ug(2W@9Uwi}iEg+X=AfzKa zy1gq<4XJRj$POq09j#gbDj)WN^-Tt)!xx(v7#JKZR)eZ1(2XLKLA3@*%`C8*Zg4XA z_Z8&9(=Wb(=+1QzujGLCsDPI8cY_W-0dE!ng&YKf{ExIA$paFIp55SWPu>}~*!=XiCtFoDL2 zJbN2JgFzn5hdevM5|H?4exu>hJrS&@y9=Zq6hOkD9X+588l4a!&^da$K;uOoy}Uu7 z-5I7`EDSps9T*^I9)K){V%Yj7XxeB#p#+{X2St*D255pT`Y@=*FaRxW1=Tp9<7_j) zp7QAK24y$?_1*=b!94>H=7SLRP?I5)2h@MfJ3uBgl(2!r=WuresQ3ciU(@_X!w2FY z&&ET4K&9`=|Ns9tzhLBV*~q{Ey4}&tN#F$(8ZQ$&Ss1#VSR6YU zx}A8KK@0~D$8IMMZ6^+GCdW<(7BC0I;sGze(l`tjfXFg{*&s=f9v*Ec9&NA*AWcvv zk}kMBNE=j|qZ_1~rJIS_iN~?i0jAoeTgtUl0+ehFx}!Llr5rmWIKZud?kX0?&I*=p zFP`oo7UqkNodGSaIJazg~4M`Wl|vs%IZ^ofZ41L+ZkUgzF=zy z4Hba4mc%d!GVBCxnR`*R2$DCVKqC#|2ORjfop1ig*m#gp0kqrzbgBesM|byW(DrQN zwro#W2^zUQ@#4iZE(Y*I2hb&1FSMS5E{K41iyc50dqVbcLuaC)>Bab@M`s79!1w6v zxB*I%ogEL9SQw5qyij6cU_90UF3CX|qSx`?O3bNphY6!9c!RfE&dKZz3v{+`3*+!H2V1$ zk3lOMy3fDp<_DFbB`Ox6&OS=f33dR;esKFH#4!xi)4vGq>3ej83sT?ihtT0CU(hm^ zUmmTu!Mzew20?}w4Q(t8FF_-G4b=e*{H=Ew85kONgUUAs{#MY{C?3t#77U&xX=McUp2H9LbgoeWm2{vzj-l`Q1zq2Jbh?5X?*I7(UHQSQc|q;D z0MBGM4v*f@^{&QmK^;s7k51SB9=)OO9lPCl_Ji8zov!RI-RC`yyUqvkT#XO-bmp%2 z>C6QQEeAC+J8QRl9CzIfXHlV7SU8~Jy2;1 zj>t8WK=+j?{rd0I4e>Ro)eZ_D%vO60sGj%i=J)CKjR$Ws1Q%-#E}$8dN>h*IJ_GPw zR6XYmKr;)iCrd=3S3^K#d^*>FWkBP*y}T`xgc)A9HP`an?f^AEc7aAG`CWfF@~^Ms z=sy2Kbkn#0j{E{_{DRGU!1a-Dyk{qm3h3sEPR0$4Fa5w%AK*1Gpmmi7-A*i>&7d^R zzut+Xm&IYG_MwYEJd#hm@Ockf^#fK2TKEQ_h3HZ(d}9fa(Z_+$a$R{8yH_ML^=`xl-{xQf12MIcqV`J z>Hg%?>%{@;{B&Ofwa_5_p%>RH7#SS-1>9snYk9hVfJzvJ7l)oOGJvkYV>deR611(y zv$IT~FTc z^9#U56+oI;K$?6y-8DY*3%aYo)ER(`fGczWDdd4F^Z+Szfhi0CDHMR&lK@gE;?aCS z0jf9yq&NkpxWJ?NeS=5yD@OiSA5hcS`dqD*M=!{k0xoA6Kw3WY3xd2M;B%J6B$NhNC#vlHTKm0!|anyqPPMvGOYY~m# z`nG-p6^WqMpHF9+0Ke-R6;NJuHU970`h>p^G?>>tMFrGx2dzhKQ33UyJerRSxODfZ zfD(^S_Z0A%f89Ocg92SZXW1KkcHtN30S}?N@N0&sD1i7=R6q+%n*XwtvN?9kY`wgKWXxVOJ9gi9pc^B*&%Y?FWMqIk-KQJkaCAqz z@Nb&~jyd1fwu>RE9OKtG?~#1?vlD+L3j@fOA0Va=1Iugf-3S2NkWL<~6@Y ziAn;$1~_GCfQ}GoK2iV~9f^nc`a$IbqCa5(@9uwmk+g^rl#@MrMHe)I##Os-yr^Ff z>hXb^DQiJOr(fiO_g&080gCa~+a;2q`y(%d)}V)e2Cavh4H|v`RiQ6ETL1I6#Dm8f z{RKc{9}Z~Uk$eGRYp~n;nD4n+QZ4O@aTpNytSSz;RV-70v?^~L8A;F&`E0)2~gL^qq`rJ zazRETbbv*A=Y!&9AE;V|?icXr_6A=I1b0^U2hb|6){`aB(I<~iZTOJMCCl}o6jB$` z{nexUF1Y;k=xzsPCy#C)i2{&?LQp3{g*$U33P5S+aE0}Dkk*>>9^K$s!xzmjKo!?| zkmgRXsUE%aLAh`rXo?HB6P|kX&Ib*V?E`7V7~cUowliD8qxrCc2WX7vp+~pBf=6e5 zfJf(gNb7MusM!c|s2;xnt9b)x^qtYA*NqL-mr($fUkd*NK=BSf1_&M~`3m4GKtQ4L zf@?eID9(Hi&|a6;lO-H4er^K^=z~rI0^hmk0ctEl52!l>T89GO|D%9N+8)jI1`Oai zIk~T(6?UMpJWx0D<@_2J2I!~-XxTVuH#MjQ*$o-Aa0TsH|04uyUiw2@te|v;(H8aB zaOrlB=?(|2nF7zr#i$s7Hg`7k@(8q^Dy_EVVyNmUDY0c`sOl(H1?86Gpa1`FIZzS; zI+y;t0K*IM8pviOn8Oa+GJ@2qfz(F7`Tu_xi0jeIYYy7WvrFRFf5>`NXagDC?vepX z%}194ySKX?w6MmbdpbBtf|{BIuoMg8ICykV2P?2XRBQm1@ab*`m&+h|50CDC5XaT{ z0Qgw1|Dr#HK%ofH1R8Sdbz=1Bgj&M*e*&bncOE)`^cpmPglA-Ewjd~gOH?eteMID~ zT#)vA_mR+GkKPp#|G_I1W`Ihb&H@SJ+a8@2FF*_BVB?h^eL6F4_;eOr@aUWi%5*;6 z+d(~EpU#RCKHa~-LudiMt=~%6e7nmyUh{h-gU7dgy0;t$sWt|!xVr(`!V5a)P0;lQ zzo6?2enHnCp51K!0|Gpg-9b(B8Q^xgBWT|$=!k$99=)MA9J}3lT)WS9x_$sPsE)gK zfZFCBov|}KI%9Wu9Cw`nYM8rp<}UC!?z#ljGWY4sUE|W3y9Hdbf#z~RMX~{i05#1) zG_+~%(HVQhqjxIEc_4d1Gfy4IT@QfsYp>|)8qhNT5EaleESJvQGakL62V6RHFTjk2 zYzPLA1u;T~li_p95goz|FN(!}{eQ^>I^=vO0|x_xBe>ZNo>)Hrf?WVK33(DUju-$w z*Y4blEAK%`mcQi!XiCjRCBUWI_lINmNzjOPw~Izf1Rl)&nIrNNr;S$HpJv#<7B9;}1yd7$gE}9`iXi{s6a+ zSslC2zUJNuDn?(kIPz~h;nMB;0^G!Rdf`<=yY}P=!}){=!`Y#jJ5IUEEVXCRRC$!@aPS7 z0L4TAs5KV=T7r_%8KaWJFX$Qox`Hi*Km0&vjEVxkfR9Q7XnsnCU(h!JT;p^z{+|G; zEY81R`1t=nWHi)q2Pll8p}Ud~l;V3q&Hq;{{tLa4^%=%{F&Q@8D5+d z`St&GghzK9DA+-pZ`fSAJp^8}yL9(~X2`mIf4sQ;>i>Vo?rhT-DJ=O*udg%V^(YX%P@atR` zqRhhJ(6KH;nT6q48+bs%qjMdo*0Ed%>N(b_dGyW$cOAQtrzAW&wf`Rn)v(t4K&omU zdUX4FfKs|bCs-Tm0!7eZ1aiy0`3UOqMd1Cg(EAENr~DLnbgu-B4SII}^aZaV@ag{e zqT&tc?$uiO!hsp@1Q=c@m$5Ls-T&P<1T_O69s+SwNd*dSg@)I$cyU zx?4GvSwQDmM&UDmB&Z+fq5@GE0h0L4FX*EZ@)=|-xQ?Fy$`voQ!C9h?1Ke_m6L19$ z$K-&Hak~aG$ilPx9Edgml@}Tw2j8=T224P8!;4C01_mF{*)PYzLs~Cyfd?eqKnD4A z*9mxZ{{U$OooxW3Ej+rx1{!$v$|!&h^XxtcGmnV@wEmEpfdPDc-Er`_v7l6P?8X28 zpZNutJ-d&49DKmaujeB1ph}>W?=!!EGYg3Kq>8B|*SFUl)U;q=@L@jg(tYZ6h(~uE z2k2Vq?m7XmC9he1Eb|P&M?k$;44OVx2f4@rbN~csObO~`h!;WL1655gW`Po9_j#Z0 z!=O`5KzsXMn7{b{-=kNQq4Vp1kM1%DkJfMet;v5uyCEQ58PHe}DEouDG?0Nw4@lPq zJVZ31yM&A3TnQHgLpc|NZz&hUxl%3$@iGV>BnHBB%OK}ugUTNXP=`YS)Svcfd;@9p zfHS3U_XD49Cj-zf9nk#23`o}(GT`U(Mu6c(e-R7AOVCCJ&`yAY7aQ0Z7`nqPS}&Ct zH~(TR0S)d=eJjB5A_Jss5~v~!x9L6wIyr*}boZ0&4h=;HhS$bB6hM?tH%w9%bZ#$5 zvjIr6Hb^sQVag5(kTTXCpjE4&0Y=B2phD86+gSp9j%+XoXbu_F^Y`gB(E#OVP44O-Y%U6KqGr;m391IMgC20FZ?ZfGB7v z0p=daF0)P-m53Mn*m0W#O1rORUd)Cm0owzbRRr4u$|+Fyx^z3cfFs1C`#LO@fm+6( zbqui45m4O)377P@g^8bKG^YIGnLp2XU zcYA|QYCio!_zI{;4p~%o8&vjp`+0bDhZlh7iYGuSU66=mH~$N9@UfwO9v;aTJi4b` z19c1kPX;AD(8vOacHF|~)42}RmGkLb2bm9mc(2<<#lR6fdg)=^2C92O*ZxB4Q&8&* zR9q;4253ReB2e4H1Ej&D6Rgz5VjZY*D-iNQvXZBJbJU7x#HtOHdtCDtCj z(?F%YE9l%`@YcE0FT9>YTB2-FPk~Bx3z!|CD0JxnYj)}010Hq<6)vDIiEHcsIyTSl zSccb3#xf>nf=hC6%LLh4(2l}Ru&Is>e;7;TJi4cV z)1gOipMw(UOh5-vePH>6g`xF8iH}D&B$fI=WI?7GUjk(y@L;R}gG;ZIf+N2mBWSZL z==w+jegOxNfTIGxfQJD{1hSGI6nMU^-%6E0)`3zbC^H6lboYSAB|!&lw1ZlUy(KCE zU}uSW^oFxI?nnR^Qs-W*`VMwZ7|4Ebh3DIS4(1AvZqTkIaY&yLGCuFl;>a)HC%`Z0 zF9I5p1`P(QfJ6-V1^rDxA`bk5?k*sa0DeLLkPYCS;-KsgiWiT@BcK!j8}y2eK8!lQ z+Ip$f*`s?hD35}2rix3qlLV{?3<6(;%meDKc7vy3k2`>iOONAV9w^WtUDW8q9^I3` zbw_iR216;RWcPa}0GioVh<@pl0~%%l+W=|$gRB5IYlApmtOqAquyMy7BtY{NFcU#d zXE64G%-6PFssx=b_>NbA;pNY4&?wx=ouIv|t(P3T5AypRbmaE~&0t12b~?mtU__d9 z1J!?M?QaGC@B^ORKS5FL37X`(<;XASDB#ik5=4U|92D7(4j^v8i_>Qq8Thw>E)YBb z9`6-o?{=2xbmsw8+AU(BN{`Q@dm705jW5BSv+~B5|5Ogj)BwfX#C0MBY!;1wV#%Y)C123)#fEP&FId-3WaSFmV0<9#j zgRs@Q&%W3UVM=$Od$9t-6aXz^j)Aa=K4AfLzlf{#!4gZ*v@PhIz7Q1+a4rV*q)k9& zuL7uTpwQ`}Vgu@cTYwJI0&S!KjZ01dH@=#WK<^d-C2)`KBOaX*5}~{371aa z|NQH_L5jg+4KFTC{r11x_q(g{H_+9>oxY1by3e_Ey3Pl+*<3n(mpg)wXm;r=-R#p@ zI=!=YHE2cg?th@m+I^QFcLpzC_UH|jcj+uW%pZOLG;na*r?d1nzkus>m(J419^K9y z9-Xe+T{=tmyL6Twcj+wE_ULxD08JNn)~fRhy6S@(Ne29azV@Kf)TO%{G;rtA4Vlvf z?MULpX3uB$;W+|PxvrHmJnGpFfhDK{SP|?9ag^I^ymh!fqHQovX%j@PzieL5<}IpWb8%5W@r1h7ACYAcH{J8pH;T)pUYplR%zu0WAXnWqr_5l#nPo z_X4!#3FL!5(26U_V#98C9;ik9>rc3J-|$F2>B0Qb5#|LppYGs@*W5nc!4*Eei$NU` zu*<-~2X>Q7H>UG0ft}Y4@f4DaVpI&!U382A)S4_+GdcjhIRG+I2HHFVnkaxp>0wY{ zy=DQ$9IPLc-R;kV7U-Z_u9VZUH=nur>7Uok%}@V<9DC5En;&#TVK7JY!+&6hgEmy; zs5n4Ypn>KgKxx>(v-=z<#=G4?I~NsR=zv|u-;(qnG;GlZYJ_@NIt!F?dmaaK7#J8B zHZZ<)g(YxMnF`sj0`9bgf|4(|zv37UTFwGGCILKFm%J2|J^8~AfNo6q<G((DekrpzDqQ0Ri2vH$0MiL9@)w2WECp1-0@$I(<)chF)m? z!B~#GS>yz4vj}uEaEM9*$Sn@wX20<_(DF1;+6CRHJOSiwu&f1WrAqHqQ2FH1S=s>7 zVBpdXUdt8%8WH#C4TTT2?&z#h$p9IX0~#L(E!HaOtWl`}t*L{QW1tS1XL1{8ybj#< z1T8)HU{zxQ^>K3{J4s5H9Cuv+>QZ|4iX7{#T?4Yv!lRe9B^5MG4m$I`H*`T~?FOH2 zL6954qvN3ED~|ssfhITLW8*gY!VE9M|Ns2|60~m*ZmDkvcD&TdtOB|~gVzFN$LD`P|Gxy~9Ps&-b3yHDkM7zIN9!Y{ zN{-e?OQpaAx|h3K!9m!4-iLqvffxIh@iM%&ceFmzy%i+v$nSo{(fX)k_gQ|o6RqD$ zlwCl>j>o}cTIXL(T*k}b$$ZC?`ET>F|E14;y7z*5eW1$AcLvxuU>|sRbk7BKVIY;4 zCumFYIhStc7tBBY|L<-ESKz&&4*UYX1}@#bpq`;icPl8w_`?qzX9jH^>2zg)2GeK$ zdRG>Y08n)Xs-83;dJc56&jeKq3fhOj6A8f);OgVW z>R+G`<8PS_s;odZc7sg>nFlf+Gz_&_^PPrsOU1~hoPMHbRD^Z^}K>!PAydlnlb5uat)&QLU5kr8`^j@PP z5DKb4VaLFGK-QJNID6^;|K{DG*$Rg4AN(zaObiUoyFs%R4E!xApa~DnEh?b#knRio znvh*dF8rD;;1y1w+$c2`Syc0Z0i{Fz^X_sIv)sfWG|FO-cL8D8sygl@uw1VBPEAfZz* zp}$6q46ivodVL#SEYf3SaN!qlFaXu8C7@2YPp|6%et`-F&>;;VzDI9p1HV9l07yXw zM8HSIfnPww7}Wjm26;P;Kd%`S8lU+EWHUd2I>!Q{p%7X%*F=DUKl&sn=lg&N@U`tO zAXWl+*fM3&h0!UfGXMTY*{F*K* z4*Z&~4Is4%Ao&7*P2Uatnz;w~HA^q>Yt}w+;n#Hiz_01L;02Q&sHY6>mNz#j!Om>! zo&aWo&TMO50A_j^@C$Zt04;0}xC~0^CDPqsFLi@G*gY9EwdK;?%%IG|@LICF8RYBk zZjhh5CxgUXx|=~NKx^U-fV;c=(FZ_#a6sXe#-Dcz+!+SX4Jq(PpG@P=I|!aGQsIvV z1>y;?j0U*3C+MPLz#n}QEUg1i(~zZH$C^Pyp$so?|NZ~p=)lXj@O$Er`Zu27B~IlY z-IKw!a_gm%Y>(#Mpt_i$BoVZ#x4RkCDEJ>x;L+U;RsveS;o#9d86@lhS>6Gb@ab*_ zX#?dc&@pA*AP!=AhvY|o2AC%B(hjh(;11Q{GmTd4ObiUA+|YI6#~f0SN1x7|0nLW! zg9sH6AqgV*K=U8W#s?0AuUbD0?p_}TA4_-`eC+9A$d&|9@9fN(|0kP&a+U`{w)>pV z`})7Tr>SNlbjA{*5UL3@69F>}G-!Hw2WT1n;T@a|3=D_CTTl=0U)D!OsvEhM3;$`$bjf_u@b(}EOP(aGf5?Q(*{qtl7w@EIS_zB1lCD@g`l<^x{cEC)S0nY_AP4nn2RfDaRj7Jh6Os#<_0I22m!2`5> z{XJ;JyElLXv|i^2cuxD=i*4RK3@ryrB|!s5ULdu-ytiKnGrY(HnYs#0MLZxTcn`WqFRO?q zmlm{aNsA6ycO_}#j1@)y~l2z%Y&72i< z)~LjQHVZ0(4m|4iW_j^XmjSeHA_6pzFY=<`G7H0J4}P5kuQ@tvR4PC-uAtEd*N)?^ zJ)rBdUc@g0rKlGte0Uf*Np!HS(pmVYce0s|Sz$26{ z-Nzxlxo*bpFbU97DafiQxOG=S)@@K=V0Z~Sp~$nF4-|r+HXx|VLbz%lNLeRHnIkx5 z`hX4*3IUxY3EEE&YEVKp5lKRpBY}I@vp{-6L3%))3UD1K0BTPJc=U!&@a*Q}7j#nq zwKx*^1^o;_5(WH%ZVvn!z770>egRl@nBZJMOS9H%)&|2;nTN_yzHZXz~d_l4} zq&NW0SAu4hJQ|OH$|G=7ITn6Y54a2km0w8vw;aI}NFLokUo?Xbm+fZnzUBj7v2gzX z1P&&!%VohXzw-#R)E86*!f&v8c|Z=7iDFa?Ky7sRT34_&aH9F8XbD=Yfk{AA6tSz< zObn$2b_fRb<29h|caQF$4b=$@{4MiAYic@kR06>1%AP#r*vD?lR)#@}9C z*v7>GxoYohr?W!0i;735v&svvbzBT97)!W4y3f9Nw+@tLKY-?S0z5ziEXSQaKvCK4 z$MT{`i-DojSpzh$B=X|vd018yIPMG{)-XPB+!=bN$@xy_h!?`5AkUYmD6||X(K_aw zz|c^g$WRjG(d{h&N^=uHnrt&T$~r*vtmj`m5dn{2a)Qsg*N6wrIU*^9wlaEo_dXB? zO+0GEN54#xWnehwoCvygtN92>2RKYUn%_itG*>Awc=S3cl=}E|3%Y_9DuKsyT~sW( zokTzrHlTqs*Io}s&`2e?)9lji#L*qZ;`o0Os4#>do?QpAF5=}^8PG7LNAr;gl-Pi_ zmq6=p5St7fU_%Mrw|0RFTF?R;h8LT6f~p|M`UKE6d6#Z(8BhQ3hEG zvSK-S(6*!w)0i8`#$0$2hcG4sJSgGPeH3Jz2H2&b8S$0_CFaN7LH%h4NAMM;F5S)? z-N7u~-U2TSRKZ8A7=S8#K964BjwoS<7r%X37+$kMrny0lNbn7~;Ja|~-472N&w&od zIClR4os|HpU0u6xcFzHyqu|l~(WTQ%z^B(sqSHylrPGO{vx?^!6GLYd3#fMJKK-I! zoq@slWcOvz;D`fwR0|XbF1?=MgyPYC4s^oR0$ag**Xp1=yXV0-iwQ z1LfoZ0grCJ7a?t+d9`z(UQ^sl_U+(n>lNY-p8|h!9cesczX{lOhEIWAcMQT!CO5L!k~lKKxG){b`E&?0ZqRN z9^I7!9^D^7emn2c%?|T0J9yy8qZ?Z5cyxmVJi5<2_6ERxiV$Lgd7gcj6Da&Z+Ca-@ zJ-XS!2LGS%0K6~*p@aSZ1n?fGZuVW^tFF7xyYxD}h6{rF%AH`(oQI2nO>*h=VgU_W z{ht83D$Apr9ds%w1B3A;@WIIE;li%QC&B7ndmWkKf{x&WGceSG6}t3#F}d_QvBDK2 znZO1SY^Y0OC=vJQX5V!VvpeO_fqVvO|A3n365xsB0H~qhC4%5>>yr_8u$@FKt1~7OE{k8*CZ)1)Jx9n$azwdeEmEeAGW;zcHw^Lf>zEXA@{W5m+H? zzcHxT>lSOhRASeCs_`LcmvQ4y=r-eD;GGomjlUopDH?x4w;BHe4KkFlgKOT`T#$_v z%>3I<@vrCab_Z=V23ZZ7qXq9X25mBiOmld4@^yEEol>mxX2WEc`<4d4hF}nRhHM9w{KToHRij7CNH)zBWlFdQu072%#w>gB| z0NpPq!ocua0<<>J12hH?@}OrY=uRjH(B^DVtp}}4x@*9Lx&e+T`x%kSQ&1!+IEKJh z*?i^~2$JyWz6cs4UAI(_0lelX(n-d%`-W%oOXzlJSK|Yp`6Cbd^xEWt+IBw7e?1RA zX9jnyKJyDWY4C3YZ45mK7JwKKq;l{9$7lXXCk5^g2cL0xc3=O@A9)dE2t?7g6Wkv` ztV0K%aqxpUp53Qj6j_6|<3budpvec{?&F}Wed5K;iM$NPmpnW31e*V{)I|2W{yF%9 z>HmT56TKp>AP03bcd~Z=yW&eb{6S$H|Z?5 z0Wa0^=ysL??a1qN_vtJT@n}At;L-e&v2=&^)mjyg=Hootue#5Ij@6Ck=yd<$(OWOk z?fj?H{Xu8>3$VH;pw>AkW22ti530$)9R#Gq`p-bu(}K>uk_ZN!rwD3{XFxZ{dVua$ zT>{?f>)ZVkw3ivQ1K1U^4H;AgC4T@-#3^|6ij;XAe8l`BzzV!jKUu=3`vj;B#O=|1 zB*QV@F(wYw{G9^cuWNjuyGI3-dwg4;eC8L>J#bTifj|5bziSJ4H6m!7`siXo29M4) z;I$8sc0&Sa84GCg6V$7YaOqy70va9#^;82~y0?J$8H4s#gSL-v0gvT-bQTL3-v({6 z25m6k1KwN>+28(!g@M5*`GRL}jS3Se!76z6mZ-3JG#~im+gqZ-0qS9aEOP0sW%4-q zf(dk3YiElJD9L;D%7CL2RHA5f&jH(-Ho>#`7fUIdYj@m_*Rr0?znDtdUHG@h{dq0m z+5C$U#Mu`A?=`ba_g%;C!~7b@`PU!h*Er{qe8Lg3g&EX#;a`9FGk+wbPx1jD=0l(P zV~&0XE%oEqI0D|z?0DP}H2%r(nLp+%NWzolvm<{b!)N};!=NO3;IkvYfCCSR%fIac zSOlcgkw4Ob<=_Jj?h6MWfl@j|EldWSs4t?(Y&*ey5wvz1+&y*d4CE=1aOGcr*E9LF zQ#XsEW2d9QXD5CE7e$uW+>XZ`K@0G}nGv++Py`+Ze_qQW!rsGx_326A|SJBpyP1r#1S;P7B| z?Us8j4Gs=A7yj*Xuld2D!RErhP5w2rYxjNf!@>Y5EI=c{h_qosm$0xw4+{t6umG)L zhNle|a9Duy2McoAU_wqCjNr7vNPc*DAcaQ&sKkY*4IjFMM+ka&L?DL;XyhIg9-!6N zpw4*nQ5I+s=-7N5l$iw`V?3LW33xUiOz>zv#sND2-J^L8xXfYXZ=L-c)DejRb(l+3 z6hP$@Xw=ff`W}C;7q~IJM+ID9LCZnVN@`G{;@ca^0S%5aM zynX~umh7(l+j(MOC6ychHXdbANp%*qLK&r`0xjx020HbC#S*oUa{d7dc_;ozA4?X; zjW+@SK_at0Th{2GT~0ssFfG~7M@ z9|o1A&ODyYhb2HE*>efB$Wx;RG_nOcguwxHKyiRicaBN~sNgi@umM0KxyF^GiX-5 z`3R_o2CBWl?lnLja!Uj)gNKb|ftu9EoI%ZS$cR;d1Y}$b>MYROXoL8}wwa)@E)LKM zagZTNZvn`y*`V2Ia0v}+9Wnj~UvJWSpi%-ntf+edGPnRSi)A3EF}i?m-*xGBQK}h~sRbvA(aX%;6 z#E;;vqrZSh_hldG8X(ZX!2|}-3=QazY-La@7}V`X8rGHu8Bhl?0M!1044H#w4;(<_ zngPsy9F99d^=hY&ibuB}s0HrA><4Or`yfnX{2u^00aF1XCip){06cJh@{BOU3mLEt zuLD7ze3Ad^|NrhV(AMH^7nK0VouDbEZa?q>Bv9K2JmIhK;-nTA1H!l)U^f>a1VH9{ zbRPz-Z~%q4XLq!OXLqrJXZK^!L?|e}klOE%`wAh4aYMJ#f{qO9^-)oHagi6ay^{g7 z-U8Ih0Bu|0*Mu|%!K?8#Tfl89egO{ykT|G`*H8;dnZA%QR&dI61*J^z{Y9?E|3OI| zdS-_Y>;K1mI;$N(8#d8EAy_0_Yrwv%(B7ir5(#US0(!CAh;BCxF~j$_Hv)gSJkef06SFRQ$u; z0yf{L7kpC*G=G7Xoq)!=o8Ey`P6zLw=sy3#8JxAwzu5f&B|CXnk4 zT)O{3N(azkl;F{I#~q-#lK+tH5#7GmTMvLLb_NfAj}so9zSq4vd%#wCSh`;K;CDUd z)!72J&Zj%{I;e*I2eLKIvzy7M*Z00__i^x8jRI(x3G9rB)&mue9^Jn8eY%f%c3*kX zS;NcV(d~O3RK^4(v>vEX0T~1`L+O7rC>)x1gGi2|^y6SIs0H*o+7)!)TIltL-8!Ig zqf&p5UeSV+!qBq{j|GA^iZ6!?Y=sEyg9|Ky2>gW$Ob%pWIMxg@j1go#Xx_us_@r<5 zA&~1qRSz^dDu6~bL8k|GGBYsnYiXpR6z#* z@NbCwV%VYk-3>tIfcCpj*$!Pj0^4UEF5uDI4NCPd_z!};k>LZ`X#N+pz)QegfM2i~ zBz>$IGGf#W9x8fyA0)fYox`Fzgb{REOb3`g)(jp`f}73b(c2AL)%#*Ic-mZ)2Ws|0 zkZu8Yo?{Tx_ywCms$O<6F@TOy^B3UP03AaG+H@3o9NY{0%rD@s;KIM{!DoJ`2tCg+2In4uX!#;C|@QT>G4%M9>qmIm)HGfW@V| zg5x!ZOLwt?OLw(O^KOuL8A=tJcbkACTinHRGw9ZtQa%^U-8PI245h3N+ZbOnI~aXy z*bVYMLn&v&Zji?rN|Ycmd0^K%a8bkv84%^)1`eGLaOgDb1_dNTDZfL@w-PSUd=of{ znSgYH4mdRacH9+o5Q4o&XX*RS(*G`;%wy1!zokmVhRJyagaP$bIG) zEKvb%LjaxboT36LF+qWfNFXmkOZ7au%LP2TulsbDgE#m|gU*X=uDuRw=?Ijl_;d?; zb|3fr{>%lmtNs;>OZOr0h^XWLNuYacUOs~O%Dx{QnO+NUQ*~P!UuMfw~2tRbt>})u6%~v?&IcdU;(yqRJ3amV+=+ zJ&-7`5eq}(q37Q_%bS0N@VA3zrd_ z>$L(5FHaeQt$Pd?y$TZD0ug-*7u^pMod*$p4;Nht677J9euRro28k9yL_fntYeAwh z5YfMI(R7fg8$|R!Tr?0QY5);sgnQW%smSdT>}wig{$2T5}gJSMYwk%NVEYWiZHhuB$@>gMVMO( z5)FZfBFv2kiP}L#%bNulJi9?r?+FssFkoQ_*uljBTFO_mgNtF(4lafjJGdD3?cid# zvV)7^6=;dyPA&$qom>n$JGmH~c5*R9?Brs|+sVbyvXhHp)=n;l4Li9Qj_u@PxU-Xs z;nPko1_nkZW)@a9VRjB-VPQ@#VTu4Z4=*3TfS?ds|MZtf_stjG_dty#&;n4T9_Dq_ z1&^R*m(Ug(sC^IVk3oj!K?B5yO9pOvboYbW);`_!0-&b2AgIU>5b%IrO#&)=TW^=j zf;zaymwdY0K}8Wr$plb?WdkF$e4hu2x`xl%XEY)e;Ooy~PrxQQh7GzTM(47J*O2aOQy2F5ST_pe1d`T~xs1Q6NLW zTU$Xj7ig6PXawE`bfo}nfrK!)e`>p5nBm2Z-~a!=1Uc2S8?-LYx0?-g&N}4kP58t| zHAv;U-~a!=jy%Q;s*EIjdclj~pzR<~Aq!U=2U6S!Qmg|H3sAVh!ve0-2c$9_q>>4= z-lqg*-$!>1_zvR$M?@1E6hDypt#FUVH=qs@yubVrG{pp3$8H27)Ifw3Xhl0{X+r3E zeuftbx-1N@lXrv0NnT6s29>+7g?EGczOQ+}celP~-3?lX20F?Qv~5eFJ6r;?*9GM4 z0MIHg$Wd1X2ZR}3EdKTX|7)?<7!{L}`Jj~r@i8wRd;}#m{;3B*odJ;3Aop1mgI34G zd;oPnj{A~*x)*}hCwAZJKJ|jh5p+Q^XlL~e2MFuKi##x^`^Sr=5XOfWH4w&&7sd{Z zpj(bzx(~d_fUFx22JNNpt4ZF|2u!bUmvU^V zQAuJb<#VI+Mqk89gkwgC<@}&A|!#fJbLLh--YQvmG)M+YXwE1tl09 zYaKwdgASk>Uk?wk4bXB2Mmc~_cmXXkae(jjLTvZF;Q`w2`yYHZq|*}cc3%g_xcIo( z=$Fk}klnr>-Pc{aJy<-u{RBXpXbM16NEJSvd%*n?&@Nw)UqQQkEj&Q&Q&8Ce+Vkbw z4O*zF@B-A~0qu?b1B#z|Q2e|D_2RvG9QT42H6w2|?R96I>9`+M+(4EnJpgUo1s&vO z0ov|VqGAADx5V-P0C-Iic%y9hiEd|>nUGlU6M$$u(ak(l`;cSz)r&u%8*W{?4> zUiV{llh(p^AE^*te}1TAZ?%^L&|sX>f-4RVTKnPU;qDq&E|NF9W>0_ z4ca%=4Y}+-z%f2P8WA_37(y+N5P9l`2juEJ(4o+v{gYo7K=um;fU;%;D5m3I8mO~? z)>{^UJ2-vWToH2wr_+9=m4accYt zS{Mu7A0i>?iB;KiLFzb3P~}!3Ujy+DWe+ z!A#KDzEAgVP$+^7*8v5MXZQ6Nplj|NEy^uQq`*$@4R?3}+IWW4yy%)sE-9R}VF z-+lf?3M-gv10D%J|6(inAXs?7`+-B%1Ee0-B0K-W5TeDx5nNt@LQWncVuMhV%K|YL zp(Yv>s@Cg4%`^TMP3T<7E@^Px&*;C zf3SHD7UfAL6-cHYg{ZDWQhgqqsj(1sVMyvg^9&GEk<9yQ3U=i?@Bv~F-&};7=h6ud zE(eS4pm8zi%H?(gP}uc`E&#NnS;kZuMCEe|y(YQ|672WNi(YQ|6HJ|wf zT{j$e-2z!($M_#SOxE2GQr3EszXf!s97JvFfs!iF>Zb+U1QgJ4zL#;EVhFN3ro~NmVyTg9W1tk#t|L( zryc_xSJQnAGHiIP9i)z-VLxcdm7yf2yB`!P-P1wg;L_a=8r^g0?gw4J?9|J`*y*~! zsh5Qd96%u3m=A)?cVs>Q4yhE-70ib`dP5gDG9T=8T?2Mh1QX~UGO+2O0(lN(jKA>+ zsE!1;xWOj{fDQ_P7Kxzp5IoNo??+Nk)KfeI`P-Od^w-IpCZ z!6)f=I~#a*GJ-Pji>>Ft^^7BU23HT{OwbH2BwxLl0g+UJ3THqv*NaAoFfYiVNPX=X z6$9|500nS;0d^m#u>(HzJfOjf!K3?@NB2kmmX)9^2wM5i-!c!vlwk1at&%8>@#z-q z_7Zrp@#p{lpmqMByMBCB969j?%I72G?2>pe}V@1lxxt)_G@{NjN?vb zP#YXHA>!KW_z$K4BnWCjK!P7xZ)aQqsGDH`YRg!F+Jd0zX9e&gL}>WK`k$bttAb%m^i!bjLtTuG5`G}3fi7oT-VMC56@1`Bvl=9V3qYQRtfqaLFU!IJ3YXI_o=#$9=xzpWJG2E&3YRF^g0`WS zfLeaPWyj*16BVXy{xGa9%x$7qnGu%I#>=g z)8Ns$8#JQvLIh+%H>)fIbVDL&0IstcG-LYWBtIj=F3?qopjG{Qz#IuNF%V}xn4?e* z<}3nnKwFAIGE+eu(AF6crvt490G!Jcjiv-`t~ zgHYCu7t^7v7cYGE7#WN&c^q$10aYL%*E{Zb3@R;qeNf*f61Pgyye{!fo(ei} z19oZ8|3e-JAF;gn)dI>)7eEVU#X+ksK*oals?a3{#s^+odnUJnGH$o}FxcG(OG8uI1datOQtS|#;?=#2;9^EHi%nJmyE z_pB9Wc+nmRI?e=C9+g7%OM~_EZUf1l3YHJ@iM z=rnoWd8>sP9HEYe>|{N&MwsE{24>Ki?S2Bjy>1ea(TD&GxW{gRRP-=2K(-ru^zu$z zCCuR3@?V5_R z28P$}`$0ENymkPoU&z2vVgynh08=gN(JOjr4R~tu_8MV^7xP3}7$6x2bPC~q(2b?9 zS@(l3llJKL4S3;i0qVtg^oqJo6kzb_KK>%kg@wVh+fT!@cN%E@i*K)6!i!T`pr$Q< z%MDNr9Crnc4m0@n_JO#^U6+80RM5t2&`l_yMz*W*f#a?-Kyw8kbHE;!fO|L}Sm&q+GZ_B|b%SmkcRc{AY>vBL0a@1V z_Q#_)bOopjz}D%yrqgu;*dp)_YZaevPTyXZV~+nPf@)Tfz5E?QjG*n+pp~=D|5=I- zfEM*tfDH2OZ3FesLA#j1>Ag2ZB?2Uw0+IwVKqCMQ$6ZuFd+f74}>N$f|gDpVO!s*e=TfIh@;dO;acP%W5oPY7+ z$N&GJ;gd|zIe4DkVF{pM1h10>3Ah@c^y~&l54i8o_&*>5Bn*ubaJB<)Q40WV;d+r{ z2HGhOPVb=n-+kgmmop2)YtS5z<7#1s?h7xxHh@kqffQk&v$P?#!xqTF)7`!ipwV1V zNdg*b1l1>?CC1=&7p*5t;EPLL!K;`(x_vW1RTDxOGzQK98p;a*i9^d5@TDT4iX%Gq zut)b1*g3JFiqWI9;Dbl^N6_Uzp!c1R{i|%*nPJ30RPm3oxb88-F@JejcfrIgG*hA=W~PRBQ!vS!vBB@a6*HOIqhC0%S81PK*L2Tr9u<#XQTt`W433>{4xn@-(0ZVvyt@q)k}jRO`H*%! zANa85{XC$t8-CZn9^Jm_KE1B_puPa8_X26&X@7IgXDm?#NkSz+)h^gcYT(Jy43Lw4 zul@P|wL$ZL#uCtM?b#jyh8GfoEDXC@7^*rz$Bo=J1|>)qkh2O_fzK}Z=>Q6*CE(#$ zkl~(Bvz)U*WMYvTdA=N74N4{ET0Ta}>kV-ENsEl4At z;Pd}|x_`QYuK;lAX6l{@3K-Db-sc^lOI_+T7+ktPfX@Iw)FHs|!dHNW;pInW1_syG zZ>16*y`nOpN~D+fDM-=)BzXl?$#l*E?@rkT>Q;ceM4*@jHSb@{sRFg;Zh%i_na<3> z(CrU8D7G7P)L=U(=XJAp`d;V^y>i?YRKPMEcLm)_%iz*k`oQD3>l09s;?n8*!xq$F zFX6KVjTM)$+kzVDrGoztf)4V0_z!eWsqckO*DIaej(b2QXSeGW$L&*cwpn5|ufRbH+ z2I%7ZYoMlg_xTs!Oc@z`Km+={qQQ_v@WqaWp_?6bcmEgA?tW(nMxS11k8alspn7VR zFvI@?j@@T3zUXwl(CvEV{{ax|%8RdB5J$K`9O1zLI@<>92=FySNRFro1&w@`LLA`X z(JLwiaX_&hXz7V_1jJ{mAfGLO8u}ho^EFpTFqG2~LE?LN~T&eH8K@Ivw_2dE2c0V?u6eY$H6 zy4kVCul+IS3`Wq(5r#&4P=tdF=?-Uc;dgn^?JwZkedfi5CvbznDON*DnBm22UKWOz z`kWLSLTmS#>blu_8>n+gjdc&vJbw{V`5s%}pdqA}}$fMvR zkU$x>zJ zT>!HZdYRU~6~YWJ8dv`O|Jvi5y9`r_O}Fa;Zb==^C9@QID!Z63zoKm`zJ zSmwng@Pg}ZP_+VWG=``|ywEA)Vt66G_UHfZ6P@j#sCm)V^8bJ9ff5nW7KDiI5S4(= z5S0kfvf_Z(oFK7)Zcsy|8*)dczDGBsYxfD4?n9j=DjLR@KqsHT_5kRE3uW!4!VE9c zR{Z?`@+>&>oqo~z4mVd?1|F0`S3PIDg2|m57OXq{SfglY5kdu2LD?r>psvj=@`Tw;y z=nhbyUeJO1Au0)=Yy?VR$ZD%VYPW*a%7gB@^XYX5-R1rzWCTu?p`20-J{FKlOO*Zg26lhR4`lU}POdLa4x_+q>dLMhU3SIsGC5 zM0ainRWqPLKLgO1BJ_?)P*n-WApgVG3pKw{fNlcv1l_0f!=u|9)FSym0g@lQ4L~PN zffl`k41x}xf_5Q!{7=XL8wMJmgxq)G(d_~D0EBYL{*)*G>sgFdKA7 zaWG3cc1Cc3hQ1ZLt5_U6D_FX{c)EjFm_fIH@VK^~EKzgp=5k~{?bylT*v$o^Jvbb@ zy;zvfJ9c`ofLW&;J3V;7Q2?4rs8LbyXg;C=2|eg}8=$3M;MR5bO$Vd@FEl_+l2r;5qdI&^-a06d|eT6=rp~twJmT^{~E!)Jn0jFucwJ7ahGJDh{BfMUb{E=-$I_Hx8d(Z_w=;;9Xu0 z-EKUPdjniRo0mX+Q*ck?xQj{(_`tSq$RHx9HC3q%F5hP_7G`+Sw&>@7P(KZ1uupG{ zN`Ys0w1#JQwgG4;FD^drut&GA0caQ!atJr%)DqAPj;rwj(Ap*ia7k9s{Q|Tb3ABa_ zTG)X0cKLKxD|BD==;du(EX?qFN;ey55E2wQoz5DdW2&8XKzqduAO|{FfDUwcS@<6` z-sWB5+j_E8x7&%O6Fd@+e)Pq|e9+Ms&J~c;0Qg&+|ATJQVB;5T22XGDx1KDq>pqCI zzRjTVC;0peg~p%Y^DiVCe}d1y5P%$7S;7ICZ+p!Hnc;cO;=;e}V7D9S{0mSo!i9f5 zo5u`K=7XNeCp;i$V1T>5d#JIgaS}11<8R%1uDRt zZcwuybOQX5c&8HiJdFyFmjPs1hI%$L?<)y}QAE^=^KUH1rB; zpH6eo9n!}+n*XsBJ#n$z4C>a`1v++r^X&cyTfWil!_EQH1HXV8ytu%pvxJ=ktXaSs ztPOMlHTXE^7fg993_hKkLA8rZCs+<*KltVWJoZCWfi_I>%R4YYZ-GX0X$IJ(9^Kub zQ7MqC5Fr2(0UJ@Bfm=TZXz$$LVo-$-UiXYpB>>vZQtaTk1Jng`>D&ye={$P7LEiW2EROK$ z+zcw!d^$ISN;RL(&7e}vrE@c=SbGuR%L`gatN=Q$&cUa1GpLaB>D&w|JG3Sdm>;M0Kz|9!&?nRClrCCs%L z!B7giqQ$RLfZ@eW22jNVUql7klGque0^WECUM8pju5moN{VZI%-8{O(T)=q?l(jv& z{S3NqcyxyaKyJkYg%oIDu)*Va8z`7T19`nX%&jN*Tl*Lo7#e?bF;sQ%gAe&`{0+X& zTMN`#-0=f60$LK|(aSrxT7cn&2iQR|DyWOQ8h?Xs@h;T>>G<~f|9|kF+ocPH8D6}Y z0~%pNR}YqN1<9YlDi02JP>l}vIjGJ8l}7@hVUT^ay*Vl;JsRJDnq$x*GFRjO{NV?D zI&0H?I%~@vyT5~mSC2!kH+)g>4OBjXk6r-{U3{De9w=s-FU;_w^glDh%SKS;)eXAm zBmF;U^w2lmqxB?sl;apgDL+W57f5LsSSh1NZ|Hx}T_f%sKE1x>ov!~u0-y`CjSqCX zGJ70%g$$G(cU1#p&r6jNd@P z&foG1G@0*u9DEOJXgR2Qbba3KdcM>3bGPg1PS@Anu9rJqzkBq$J_jAH>fq7sn(oqB z`~JA=Z$|JHb$$k*Dh_hRC5WZr(=7<16&(Lh0*Mo&F@L$8B3aYANMJi5UafmMN0 z6VhV#Zjg(`X8-*EI@F`P`2r{$S`U=4c1H-jX6v2}%Ff-s{4Z1s|Nn zw?A}Owd-||BNbkhyyXOqw1aN<23h9O{Q+`mbA?AYIM_iQ0!Zy!o9@x=TMo+L(BV^1 z;|SD?^yoeYI@ptefdRC#B|Z+^7X_scr2C2kpqs2w?kn#20vg(?)nMqp0dCT~C>3CM zQT&&g;pHhN28M>cE}(EL;dx=e!@zK?70k1odxsgcDY6qxA8Q4-rNC$XgKsTX6NL=F zfVMk&fOgc@gEpUat^qITG`{51tNTRg>wi$w2Q<71DyRA7L6tlMLpSXHVgpb;Im5BL zr**-5E(TBLv;QB$HeG_IoO;1cf4g=T2IEVu2l!hUL9I~8-NhgosEdxZg4=p8AA`oX zwz+XwwC)5uy8}!^W#Pv1c=Yz}0re=Jx512E1=1+s#sgK#FW3rF@NzOEXkzQ!i@sRU z7IilfP>JIJyMfr@h51+TF3&Il&+c=d`2}25Kqn3PsJQra`x-zl7=~Ut3=(%y@c#hS`9_-N_2eJT^Of5hJ zq%G&#>&Vy{0@@yV4RmYpi_@TxN4k9&bXc56H}dVnAibdLi$OH18K5hOLH7e6e9!s< zbf2^@=$c=|t;3-G8U$}0&P2a;IKZPj4s>mc2k7qOgRfaVn(GW0N_fFt|7$Nm(@C$D zKu)m$WpL0cbPz`a>LrlxUV!RAACOZJHx7q>{QnL-qo~%3GxK3&1@! z$1rH23tbcK3(CAskb8$;dUm7SJA9^CfZ>JsFJ^|9psoRUnB;{9{N7=6(0&`xIJqn+ z3x4>?%<%F)1L#s>8_2!GpriFm6+OE9K(i&UEj_yXKtt}Y4d8bV%Y)9|2N|%XM1bMN zdXNF&#bDiipjPN>c8~5pQ2P(mP4Vb;765N^0*!_nl<0YMGk}UB2aj&&01(3icGGYG z=vrV0kdOvwM<=KQ^4bE_y#bB=!}Sz^6nLO21q~m+<^@TBb%Kf!mu_bRu&=>|`dRS( zSfDirpgIe(-6tD*TtqeK(mC*&D^R$@FsM9J0F8c0fRY8c<_m!ywhp=b8Px3oHFm-M zHE=7$r~9RE>;F=ApWfY|RYor=--Fh{CFwXAee+B{Vf@yk`5-IkHZ@SI*CYF9M&}k4 zkO3adzb)5*XT9opL0ueBkb87B6i#6{cm1-I2sGnXJ6$hv@p$#_B%1MU~uyHWMI6b;IgTe=tm>~TPYjESV zL>$~KhOSeK0F_gaRx9Yn-6th}-IGBc?>^UhsZQIYdo`$E;L&~5#af|+=l?;E<^uxO zr)oaF7VtgoiJ$6P@?V8 z8_t2a#r8=9=oVZ47RWFOa&O6_)7+!mTLT<|puyY}P~$qHvqUAwr~5o;o;U(DF?`%b zB>_CF+*zXH;R9Z%0BY$-zz>Kqo+`}n;@+g6|BVj3>|ta89T&;QFX+wzy6F~lvmy)u3)cNvub&$!m}1eV~pO zL#Y_Vv27q;_th7Byg>0?(gg}OaC(~tk^l!CX#Crw*`5K^8TB>*?Y}$^TC3aZ#0WXe zy%TIaXgOqnhxKkyk}gpO83R(;qXNnvpfiU-1roT4R^-v$3~Fb4ShlEu7HzX6YB#;V^POyfCJ>YD}SRx5MV!?5T1GxQm{e^oyC~``|9Qg&WJsH$pcH|fI5CEOeq2LHQX~B_S5On#mfWHAq z0yK>2YJA}T1kg33kct9SUV1bh0j>6SjEC)hk39^%uh*mXQYpJXE2l&dvu2@fO1%83}|;QxK0A4T5v9@0I@)l-R=s;w_UpZH9We*Il#9T#;7=S z#;8F0Dc$ZmoiQrlW5uDp6pwCy)VYIr1yBzWbVztWJou{Cc2JAD^<)W&o7lh=z-unZ zhEQhyZ5O-yL8D>dor~bBS_MD@yPn;r!B@2&^6b6@zOB{2;st2^1gLEV9hwCv`j@|- zpbVga=U)P#gJnM5m!MZ`gM;l-DX8VLDhs?XGa&lqhY!pQ4OJNoB}Uy-z&(fVL!j$o zc|h6QBl(0U^GQ(CMZ>fEG^lmx*?sB7I?$L|^O1n)!wppq3?)^d=2=2FWbbCLJLFo_ z?i-*@Xx%3|V^kdY*Pr)DKIzGP5_&W||N6ro$rn7BFFH0_fmX+sYJhC809`i+YHnzF zc7rw?DtLCEe(@NzVz9eL1svefhe6U%bv`N@udg|FbCDkO;H3db=k=b19_Q}S9R%tw z;=OFprTd@C#=A?$TL$-la45vd3}P z*Pu3`$8p!spfPFCb)q7Uy>5)4bqB8J9eZ6NtjnI=J}MeMy}s)~$-OreRJr^I4_wQG z2d*b|3p2bp+x_#uN8=HYD-dNaNTY#AZ|HuIyER~g)uCW>I_H4Tf%WKyTpt-w0G^Xn z^XT?n59%UwflntB@aQaE4<29X1zD2O{qz6J6i@@DJGR`TyL7)xx9f37{`LPr9a2z* z?~`0x?`ZwMQ~|VaTgfvSwB-_X#Yy)$@U5I0#=Hz5Ew4Qs`Q86JTK{n5cmLtq`nJx( zrTe*W_gCcptZ(-b@P5s6FFqMTba^u0_hkOy+5C>N^pQ(!2(4+AUXsFJodljfs_3Zu$Eh~JxA9!@e?)T};4fkz*3*NHO zkS4(J;`AG429L%gAU)s(%F(fhJ-dB5AOkpCz$f`Sb{BAf_S1q=73kiy&OP8wzOLOB zJm7Tw+|~G7^MRS2rPp0LYj1H?af2Zuc(<@$pH5Sns*I!pb*DYqD8;5v|j zW*`HTee*#v8++WP+x5Kl$5L5G>kp;UzR94$G9Ui+$3Sy<4F=#8cmA~lzxzQ)>jRGb z?gw03|JND1bUy%fin_n2O#r7)&~Y9wf}pBBng4n+-+-h~pYGgnpYGInkM7!Xkk7k) z>mg~g_IXD4g;KueW6aG5nVX;eX@2LbsZQOc z`6Ts;aY~Le&P<;w@Rg2(YsqpA_^#?T* zy+J9}wVOu;BSkuPyQr{$(xhj1D5#u-4di)r`+|cKo)$q%79oiMk}%*27B&4qQYM51 zb>}1?qpQtt0z4q865PQDujlaS{sro#$a?hheo6-IgMkcjfeKzwt1OBOnbB?_Iy;)PCPvAT30Lz}^Z+=%Vjecl7&UkAr-Hy$6* zN$jrOe4tBX9ig|zI)dioTvWhE`4_xk1Yb(Z-x3F2{6htYfUNEA0p}&iE@}r*KN+;f z4YZ588@!3y0^}CY?(_c-fGSaN;&B1hz-}xvT|g}wkV=>C3y$4vux;BO-Ju?!t<)!8 z1pEZ`Rrp)hGB7Z7gQovXQ9@1~8gdfQkQ0E090w%iO1VH&Z497&_#Z(ob?H9l(me%y zkTiJDIB4#*dkT1aKFATC-RHZ1fKELCyZHYB(7^&==R#eJaO@3;V`Eelv=4c7heGd} zT@0BNfF6DTYKlSkx^$x@3Dg;9pYA)JozdWNj4<#)2no>g&eiz8C+IwcPaet5Dxh7s z$DJiW4J_BrY7X$luBxD7pgZJnhDWc-VUO+?9<7&3@_Z~?4uev7Q8*|A`Sv=m@a=S7 z;MxmbRp{DT4Y|b{bQB9@g&J?0FvE+8mY@G$g4XkZ7SI@gM{%#caMl4&E`c(gM|W5T zBrm?s@#tpq0H1y6(^;1RDFXc<`!_%xVuMc5r7fUo?c**gptX0P_0gcg0ub#3DosIM zVFS>94-2q~p#CsqNzmn1VTKpynt%R(9q7@y=QYR^ATN0ILQY`?WqJ*tUcU^G0JxF? zwfR8h0%%_ydsad2hc$)Js=oX98Tbe8e%MFb z85p|HgLe})&j1hGgLV^kuK+Vay9t{?gJYoGg#3ctph^1|2C<+uE};8iL0;F>SixkFm`isvNCge^CI}5 z>t2pEfTm-Rj*I}OXHcJ10enZvEmz|MFDiJz+dNC4_m>J*2!l3vcyyn@aet{t17v;@ zaf&o3r$8{M{nX1l@3;hmNAe}lZjp-~{}%)>GcZ78LF*koz{|vLd3IlTA;0(Qe~<3d z;Hll0pL|&u(C&M^|KkhjzSjbFZUztLQ~w`=B8cHI_&5UCg|VP9w8O~vx`H>uV!QkG z|NsB>hbQQ=b2AvTb2C`7b2Hepb2GTIb2E6eb29|8b2Egqb2G%Ub2B8fbHm;1(argC z$75y$zZ0?aM*+0b2X-QuNB1jG3FqJgTKaa;qnp#S`{#>ukC_=-4)C{vE(h8PI+g$w z{2njFeOW*^KY|wU2J#EAgYVJ4$}h;!?Jv;jAplzSZVD>AK^p@>YIHrj`CN@pg6@0i zzWk!<3CPS6@bxI*E2um`^ZNmyKm;9CbQsjKTjm3@0CcHa>w%Kn9-s?o&%M~V`zvVM z;2F^J8wXT9u-Jjd4`i0dqnFk1A81tdCTN6S0W>YgYs(C}0nDeD737&0_a8Ddc(fky z=wya;CJmwwcRTTPdkHi@uy20I?s4!Tn+NxaZYPfB2mBrfAF_ZsEJz$CRnQt9kAn|o zJh)GIbRYCM_(IOZ_@Kwmoll?0ym;cDxoe6yEK5VTuR; zdZ>DNk&bHdkN642nEOn(cT=D4bUUa9J?*RYnvT-e7Zlj{s*0@WY>K@ z4MaQfPjykT1$A6JyFVOrQL*9o>HhV?>DzyJSt zL$-=~LPS3Ofr=Qsxc-@e0b~^}n|0te>%eW+f!nMDw^;{lGw28^hVJt(4t@sP+y%2o z%w>3SLy>`@ zI}Ch2UZ?AV7dt^*KMwxz1N`A9JwO|;+ysm+fp!A8bfo_1biLrynR>;gGxZKAyi?Nn z>wQ!T()jCL8`AjeeJ6mXNg z&@P?VQJWY+s&;~gH9CD%d{AVe+CcO6pf*MYXv@lR7nK^2F)f!$xLIz?O*?cW~e|* zt01RS7i)NSR~z_tCtHA))5SX?S`%l^fYzsab|3HnU9fe*aR)dX&By=^SMyH+jmN+j zVnVZ|10?Y_zcKLX{^Z*I!x5C1U%n^}W@KpG3tBw@-fj=tE;K1pfZ@g6yUd`w)4;df z#~ub{hKOAq;IgDdMFTv11j-f)FI+u91q5j0D}M_gXi%(|RSC3%ymKpP<*Y}itAIzZ zsKsi229I7=PBzf-*IU6$2s&LQKpn7N))Fz$!7t}MI$c3q>D4$H7(6;#LDQ)oy{w=U zhder4K`kziUREg)upGF3)yvu=3)(U7s^HP-3feKB3)bjr;L+&{+A-e;TJzrN3feJ$ zm;mPdKPr@YiBFCf!E7g58l_`3QC`#{qtZQt)QO1M=z^0J4jP2 zX!(vuFY8ueFb_0~=+Vt8eozABT=4FAZ6+4*;T*l9nXC9gC;ahm`|(1IiG{&|f7^AB zUf$CU!VLV|ZoF9hl9_>j+hvbl-iu(7A1@}pWCm?FKJL*g$_LYW<3%+W3rO^^N3W;^ zMD#@l7wG7?^Dh$Qz+v`6qvh*=5AgP6{+5ZL$m#Xt@aVqqVu2iJ-j2Ve79`d!=F#hC z@gfJ>Da&MJVAus}AcJa$?Gg}$pd(X2{C05&A5_^}cu3Nt7H@cH!m#kh1I0O^2Sy6G3=*?rBW+bsfgY2o^vp!%7w zH=Oasl5JoA?_yCf69XL$Uw)necA~)97g=Bq_(XxTFJd8_FtDR|R@D2!9+gd?az04?WrsNrXL;eCsl;kCW-|JUaGLDStX-N#?NH~@;9QZ)}y zm)E2FD!6>}>^=v&NchZwum6ofG3Ro>`!}eUXwYc~>Y%_6^60Kn@qpCz;A#(K2GV*1 zP|GgB_&{ffica?}P%Q>JkqdIV9VciWQo*tNC1`fsz_I%SXsA~ObV(nmc!kwS$6ZuF z%e@(1T<-n~+EnV%>F&@O?*np40{_$lo#o(_eFdHQ;8sTlXdnZ5I3N8!OGqGvI70fa z1s>g*6|SJ|a}PjwT7srR-j;AS?*wI8#!}7~>%~C{CcDC;+sy!U7sG)Pc8~5Ipm9FX z%ppjXYwLkhB~Y7)zdM}A_#|js+|+~r555)xU!d3u+Ku`D;A<8TuiH(h6O=x>!HbDI zeN-YkLsUXQo=*T7AOJm@tlNX5(?=!dHG8)+sF@Sv1G)+=n8Tyj+X6Hh9Ponc8)$Jd zq^N|fl{o#P4D3+v3Q)e;RR9X8|0O2fVKyG!r(L?;EMAz2GeGy(gWH6lZYYOGH#=xZ z-2;5#u#1Yri-Xyq+~u4BQepsIM+O?5F}`%%Ma2e`&^@}(f|it7yeKOKDZK`2+Es&! z>2B`|&{Ssk70`kUkV^2nmkl#Pc_Ie9np?rM8+J)THLMzPj5&M;bSRDyh)@R+G9W?_ zRME2S0JR|wLtD?Fwgaq%4NA3#!8INz!GY2nWPLL@=?6g95qfmr>gIYeUxb07`$Ox2 zQq>n*mU1wF+MT_;hpL1bUbtRoW&ouj=$HrSZ~Y4z|C)czyRt7yk9$EH0h?5J2}jW3o1k$Z{`Dt%SvWmr_%MSs zfcI5`G=O$imMXzDfDYJ%>2Tp+f55qyg#oO`6EvlD_Qg>L&{}qP0nix|s-P91UmRE% zKxdugfTjRzKxI{o3QAysb})cXfdk#>0nW;xX|^4pwjICgQBcaV0UgxT?F>4eNvGQx zG|*|#S)!uSnWJLTnWJLSSxbXE==-=UB`8+2w8vQ8beli#De8(j8+wm5-e54;Xq;6=o?um3%cH-n@= zY15;3H)xs2K2V~X;L$Da(arrLbp6-=9=-J(;Bnp89^JtXpmhTlkZne-mr6K5iY9;* zbx#G=5TL;;u-F~2*y$H8pbEX$+u}tucpaRuN3S=>3w;St`N93-c^@ddoPIIi9+Z+| zRKUkGftNc%$|q1Mso>Gw32y6j|AOw|@UWZ+n#e5W_Bh@MVu0P=dK7+y+?5J|@-5PCt;3)B1wgDML1qAP4xIX7Tuc5T+V*S0jgq_4%3`V1I(@TI8$f!Ra3~cCHWx zo`Zsn!Gb0RKn)V#?g!nFGvj<)|AVfK4Djgw#P2#s1+>e+qx_^h zpb=D`UO$cA9_+8h4r#F3D-}3j_gGRD6Yg8N@yT5(r7uW;7xzYu+p5NfJ z3%@`Mc&@AYFH0$#W4F!r*V4^@nM&Cm`M2AYzvgfL%UH_p#J|nP?lrSx_rLDrj{F)2 z_}9bkRXp#Je4_if2Q%cfT97!XCEWnI5(jj5B;#j(L1ys%lAz?*-2&du{+VCUn}uJ1 zg%Q-JQz+r`03YjRbqc)r)kQ_&Grxe3ipppH$YY=RBhP*27ld55rlJ8667=Q)iGd>D zMMVe16!B<2EaBVwq{J39yyl|9!oPkG`07sn=mQ?f$32)^z*}xV^MmfQ6l4Y|@=@X7 zk3RXCKN6JM1ie{67b`jbKj!iOn5Xqu{+_r0{{MI3*KkoW09|k40Ga>-1u`fVtbwcr z?S`EA3%bS)G{yoN9|oOs1iNt7Av8D~G%vXm^?o6bUe|Pw?unqH%cs{jAKD62@ac6e zhZdSI4s8Lq0wrH?o@Zw8=|14mD{5W>yHKa}6{x-hFXQHK0rzjZogF-SL!a}9AK({s z{mw7wD$XzH`rM<_^?A3mPp9kuZs&kbSLSZle11V!_D)y%Zr5~=PG5GYZTy0+>Yc92 z{DQ9L$6eJyRr+yPPE5YUXi}@SA{_l47v2@KZ<>+<}uyjo?v4)h*+%K3{ zfz(Y0`3O`tPgw$LTf3%%n%1HDpoU2i=+s~ysC_R&Hh`3KzlaG1RX5@ahGkO=57b2r#w=CBztB;)~;(K)R-YuX6)= zYWp&fZvGelgTORsM56nuXD9f&gcr9Kef{s594g?^{ll|6SHi>ka;X4#7W)FI&(|Z! z%kWyu(Xx!EP6f0O!l(N%bfs~TATNVwva5gx^KTF47ypkrT9@(EJOC{W1>J`UvNm8H z#2GNY!g3HFvUaf&iZyAd{M~*>fJ-nJCBQvKJ3%E1iakI)%b}^=TcA6kgrJKHZmlo&Gof;N))yoxbD&+Jn)4MS+{alllDrhoJE6 z^-(bZ^^6+WK&LY@@C&wrN{yF&j0_BE{CUm-{Lu$K^9#0umQJSe=Xr~O3uwV!&~Z&5 zc?qaIsJ;Zr%RuGtFfcH@^kf9p9y(yn%+5TWt)QCrGrvwNNH?>yKxgY4P*1^Gq_Y*Y zs-)XlqOuP;KM@a^_7|urrT?M~*A>q1#&r)T&l&wqPrj@o26PU@8^0 z^w0q{pl&!eA7Jw6c5nc-_wR!zFpx|+@!|jf*To*762AL4Xj0RqJ6Ol1JKCbV*v6&X z8PrKAG2)j8w@EDpO4U6qJq$_}T`VIkN~J9eY)ZvkECX~(1zeaNK#3k^%~g=In}4zH z0JXb8htTr79`Wb~9YLt@BJ2ZbT>rjDceDd&(`l>PzyJT6_kvOqBdBQuigQqVyaLo7 zFDT^zWgKD9=vudL1*lNwe6h3_v^^)a0(9C1$X(zK@d2Q;bU1CodpT|f6M1fi3v%2H zM~H}TO!(7 z9RsTCLCYw+L5IbGjw1jcJZS;yjKM`@Xm;pL~QVYuZ@Z!O31_sc8!GRZSPyhe71$DqnBD&AM`0)hB^J;#_ zSRw)<_(230h+u90$5?6z8pFE)SEmHJisT@iD-1f2NazF16r?o=;CUYpP_%*?GYX)3 z4Q2QS(LXY9>1G12SDgi_em%N>g6drATp;4u?JeQk>n!8Qzdl$7yl&JPdKkcYGU2ii;O5F85H&f(GgrUH7_r)T%eZZ6;M53ps{oh{%MC#0{ggftG2 zZfEdJ1|7Aq1-t|VbOZhE5{%ki&NI1y2UNp*w0ZiPX=fcZR~&J|DY+a?;xR{AffJ$Aig^E zq&ZM60RR8%~=Z-R!LK?4OI-H;(_SR?j@Kqjc~;G6-f zRn0xRxxontG*Asv-C3hz0y@tV#D0-h16Bzh*oB^t9ss^$1YDK}fX_#V-ly@?H_XVe zUZ?RV3+R>%xyGNM5wH?55I;<;gagDc6D#Eb*P4fSfQp~P#s?6!l1JkkQ0)jhLO(NH zfPp_8bmV;}sA*z+0F>|xJi46>K>gi-<1Q*8ps5Scp&TF@Bna7h4&Kgb0y4sCHfXR3)G$(pYiE6ZJ}M<1-JKwJf^wLG<4(|Ni^i8;*w6Y3T0IStfceNF7&5jOnBf5$jt7stalZHl zQrI1w03UWUo%8koapwY1V1tr8B8$QF-}LDA1h)-XUv##D@-MhY>CrnG)b<4J^Y3+J zeDU4~98DF+n?X$tkYUG~IYCJlVP>z>e~;t~p2-J1dRbg`K`krhLms^>2Vw37=PyuG zzyRdl-ie?_B*^L)#S6avZ`ciL;6d&nt?=lb3~C#`*fsa-e~2}VpezfmNE&v7EiQ5W z%&*f7F~qw9l)%8{F-Q>9paji-*02SCEHYl#aCp{;^4F(TwLk&hW6~L_KgMXTT z8kUEEwypJw@?HD#pMP5mQ-&5dLw8S;gBEOI3zI;o=;0kq0xe*&N%Zgz7KL)L!#g+} z6r>LC5NJ@42D2qV;$>nW(o77LE+-ghaWiOXaWhD0aWk-KaWn8}aWe>MaWj}{aWlwi zaWklBaWmLxaWgP*ax#K%1muJR1~7}Alaqs!lM^Hl=0gbvHn8)-?EwK$dq)Bk=nmjT zL$5r#Z~C?#D21Nc9RXTP0@~)_5P!Jau>e%~1$bEhC=-7%AGD|ew3xU1`wQkjpv9V{ zEU)Xkzk75CCpdyia_$#8Q$c0QaSu?PbmGN3X3(O--~><;?a_j-|6!vE*T9#Nf~EvY zK>JSQ-_BV(rzXzK1fC^sr}mZ<2wxB)il{EL95um3@| zmZ$`PQUbEOA)Y-0Z{I-=nE)Nc<_Kz9obu@Y^`c-h=w9HG>J>~StRCH`UvsSBC`t0@ z^%gKb&{?8l1G3Nsd3f+!89^e%opo#8<;sOjHQG;%0P=a&l zc2?ZA&o{!_zsCQ4dTsSDfBD~iA2JmRx^qI_fx#pBuxD?-!EZSRkM65Jy(|r0 zy*vj&i_Rv4mKK30!ApYv9|j+{`1gHXo?f3UcJ`Oph2b4m3c^W)=dCqS5 zEeGmsz6byt!3?S%`2QaVjqEl5XD&Lsf$=r3NB33GWUw3q19(;iGzHL|qk^U33ocJU z=^N6X2UXe%;10P0=un;RPmZ7yZeDtH--PzRJi3KJ)5u4sef|IcxKF3CM{hI-$kyi| zg}t#7Q2C`8@}LxF0Lm%gNe=LI2l6~FDDFTQ%{}my<)Ao!<4ld*7ii5}iytck1L)5Ab1zO9FfugmgD+MAZGe1g zCcyAgiIst2R|69R^cIMXs-W2#P$uVZ;Q{TQ>SdKP11;Ow2cDIi7BsJL_Qmh7oD3eFp!q-kmSv!oKj3ku7f=3kf@5tmSm^u<74RN%{+4DC zzjq3FFl#610;U(get=Y#@O^6m3o@3l9CPPjY^dj8D2edsHG*}pvWbb5>2k8Ta4X6yTblf2TYA}F?pFqoL7~NPHcIm-HUVL(a zta23s4g44!V_aMP zc@8+_K;_8aThOI3UyMN~svmyA^PHK%qn9@nWU2w!)DlCFUfx(R{|_kYAeTV59suoo zo(@{4e5`#3BLf5D&POev&;Z%+!p#F3QSc=Q1gC}smwKMyFgnUL9T3H&A_k=G$jt=RILU@A6&UIL^)H9 z)Gp9uI7meVNI7Ui9K`VkDevVyb5WS#Mf_J#`0}@amKu5V^4_>8%mA7+b2#R%$M^zL zUh&?(2)YKL9WHA<(f2FW7!_GVEjk zEz;<02OW&{e>&)Ff&bG%&BL9A+@Np*<@B8{2&NzpOtjlywJ%1UOP~zac*N~aBcZt67%Bz7Enx`coFWz!q6R}q5xS^+`UBP}K*EE*$FqXbSG%U4m^(lDn=amw;cubZb73Rjxnfb3Paj|&|%Vs zY7T~y@`h?ohLXr`XP(vrC0U>bj)n36)&q4aAj`lvIC=|sbn_U#D3oJi_Mc04kKh8bAdyK@FbW7s0E9U#Q4{7AU!C zfJY&(gU$>CM}ZJ%5YV&xJZMbsg#kMQ!)s=b?xWz*Nl@!Y^zLzC2FLC*FHCPTGjy_f z^vZrYF3iw+pv3T)8w;ajcN~jn=QhxIvZF=54&+KY$L>1N(hpwkE`EmNZXBTDkCz`o z_U-%zDknN)R1|!AS&tqUX7B``Dry(Y&+y{fZ_xb3HLz11|4#?yc*mXKY7VM?DqQ{H z4qkzyKu9%%Nn|A}cA=Bxd zZUWtqDdJ8y5s%|;5uo{N$N$qoO|Nb-s3OPz;SNw$E}&Tp7nKm>OHesb2g;$-Ma81q zMFlkUYtWgaqS0BSqTu*{I_St0s4_=Lz3S1+diN;k0wO!`2|KJWjzS7S1xO4pJSNQW z;tOZP@^3b z8ZO-~Dj~h@j8NZox~N3V1YOOYqvCM!NB56jXU0w!m6(~@hm0>>{Ly^_8hD^!a_K&e zBcwn_QhM}?{yi$p&<%~;pLduUy2D^`1+o}w63Nlv((M-D(JOiY$?!RMKxvlErF#iD z47+PoVju_XbAu1q=Wkuk06J&!z%e&hMvq?6rJ#80KJy~gV+5`nETpa=LdvE40%%Z|5wv*pIA};0q-rK81!*4wU)6l^hw&vB&~7wvT7rg< zGm z1>Xlw2GB9h9^Kv&|1W@=VxTg#^<)X_i^ImCW;^(})^d;LY6FInY;dmi=+%t?=f4^i z4}N)&ZUb+d&M_$gzjzb_FH|2Cx{20Tu%V6sS=E3MY|< zY8Hl4K9BCpVE_D|4r)3zRJ$;gXf;&(FqHCp^aex91DI3@L=ckWVS=sgElw6 zuoVSWA*WxMg6QLIpsEe*5K!|L)PS-8wSrLF&#?Ui&_=YQfn)a%P_y`Y ztY9he@aT2`P5hU>1Mh1BHH!^i+!q1a23i|fqU_Ndz|jebs?G|Q|5HI7Ch)1<-G@Co zy#+ivW5MV3BM&)&C%3_^Yy<%^7eBttqk9IZ zN#6L&r-^}~)B)5+^yth{N$Aez`G3?S`KrgkN6asZL2hk5P$B~w^vve*=yVo%G2fJh z!6P}C2cpB};t$YxSb|S?u!L{xr4mh#Zf6D8?sMRAQP=L{(8F!IuYuaE8jjs(Kx1Ey z|1Z5(_UIMOc*hUgqzdlAHvR)Ug#Cs6VP=NctS>kYgZecwpheW+D!oPpbbq7+xTP2a z8`y*f0kjumeA0szbU4~E21bug4+)P>4~^pv2A~=F;|?bO|NsAg%)x>2n1d7JaR<=q zDTZSXk&MS2au^}&X`xYh(_uTKM=x*WZefNOEpI^G5@*oaQKfP()Rx1R_}T0R&HwS* zg47tS0BtGy;nB+*2I2-nw1C%$$i4Wy45q~rqJ;~j=I?Tt7Gn@s4x$BgGkU4qivw^i zVh}CYcL_7RI0e@t0MhdMHP~SRpdw4|MK4^-=UrfjEdgnn4%hM(#N7eW5&_W?1=n%| zqNNa|CIznL6o}gj(E^&MDwTVo4%f04qQwrR#t^P$Ifxqs(E^(7E0ufkWhu=2T@WqY zAT|G%!MxuB;>ts`6hIty5UwR1qUFX;VTKo{;aUag0+BmkwA1sz;($%bmfC|CBbz`fGlc;=mHfw5M4@eT|ah$gW3|LO9!s&7l`W% z(FMwQ5M6JUz{24cL>Dti*|(*zaJT~EibHgP#w;MZw!w96f#^EBLzv;k0l2PpAYBh% zf`XzMJUrQYpj7Tf16)@hMAvkXt}eK)2_RjoA-cfBm|$IAa9sruU5OxFA#hz;AYG*p zU7(5|;zAL)E-#2KZICWGxGoovE_;YBP%{*w>)v8mXsAGReccW^FMA0rG~__KI3c<~ z!>15kE8x2R?Er`TevqzBa9w{uR$m5HP@T=7wS5p>MQ~krAi6q1x@zFME`fB-h3Eox zKp?to;JP+JbOnQSxxsa<0qIJI=mPbWA-dS$x_ThGWI?(F;JVsCx(p$@K!d&zT^AO? zLL&{L>-jceh8MRM!$Kngr0e%{a4ds{1tGd-!F4%6bZrFbS_0Q)1=4jCq6<7i3y$R! zxGpJ(u4<63Jh(0qkgk4+F6e-4soV=axUMhT!6EMo(q#eH^$z6CNQf@bray=ae=LOg z>l{QEKS&o7T-OPZE@g-=(1;#H*CDvB6%buFw+b`7II{>A8jC=>-aZ3|252-8qN@k4 zs|liOF-X@mxUL$IuI&(ApxPaxD-5nH2BIq$q$>fg%MYZh5uyupo-Ra}0$i6KM3*^8 zmlj-?21u7TL>KsYNpQ%&S^x_T4u~#BkghKaVg6zQ=@NzL0`13!*tG?&>(MrF$e-RK z%Zp?>;MjJ@i&&ObYf%@SPyJo<3r9pJ92kBY_*OdU$ zbr_-xym=fPhDmT;4iH_HAYD0dT~;7ny%1fXqsSq4>A-bKL3BBTbeX|*iGXy4Lv(>o zWr67WHW%ivFI&JN&kNGU0N3>nlvETUxpBO~b$uhK{WA|18Ye)yUOxhd z2I$xqh^{WUt`!hn3qiW3z;!JG>Dmg>wE-IPsxLy|x|$%mvNwYIM6exTFGJ=*+MovD zD~S*-Z?yeiCRE-3Wq@`6mj-12mjUwrFGMG#@eQcMaC4#imhoFqI2eF8iTSqv_w4=v-Ves_3fU{x z{nsb?fp6=99pL?9ohd2`@NHsOUYJY-#S7?`cm5VVR?qp+-F)PaPx1lJgKwC8d*hir{~z(}jc4)fE$49D2b#bF`4ZHK_3IT`3Q9*l zoscPHpYACtpk}IP^ADC%HkWR{AFpLSn}0Bsvb*qa_x|%*z!P+}D7!2FHt&D0nO(Zi z@@pLC*Er?aeGqgIO!5gZ1F~u7vlD+Li{NK|K_*aKJMl;Q2(o}SpFuaNedZVRV&T^~ z_nAME@iV`m69-5Yf21d9EhlI%VWcA{Q9229JMwfof%Xqd__qEp(FZN^+wVJRvKpzH@KWPGi!@b`im*08({ zo0)`WXwZH~P)`n=j78kLd8WVC_HBK_-*<+Afx##F!0Tt=binS;znv!>mO0(|xA9ov z$ef@pqM-cEzaF%V8kF(Cxf7J{z$Y@FBRyM!R@Q4HXG?I#mjGq_&rbXTJ`yaS`H{0E zG_d|3_56Pb( zliAHj6rx`iKH_9J;{ZO27BoPc;nCd)8g%pN{^ZlW5HuhL+U41LpoFDc;x+4T76mi0 z7v~=Q{|}mv1og4IPy6(?fcFxBmV#^2!k^f(%SgDw~@<=P7>`auV3zV3Dt*vZ7pz%cXs zU(onJ#6XX3Hwnk?>!9rfkWq9#@K9ejq&)0&QPJpz1Q2APZwmMZ0FPeQf_0!lbkKp? zKE15FS3?KULEH9vd2`kYGrTx{AC&%UK+8IFR1#ValuChCo=gOXP>D)}G3a0=SU`F} z!>N>a7s$0Bg&ZBApgaZ|uZ{3P1UWcKfU9!Q%2JNtaK})O#y6m-gb&UC^67s0;^jTi zt-D$28I%;W6hx9NXBE$PM~S--W#-K6qE&hI+uWVFoQOZgGQlzpo<|uZH@xeW|xnO13&D3CH-Dk$mYJ6 zpp{=Ux_g=uqM@sl8+J#6g6uQDK)C>@Mdq)-ukr6Qe`LLg3#f8+;g58e_{<+!E>mj6 zueTet9HvUMRNaMNuNkx;rb@O{nqO}-XhlqwP^o|mzg{=cNTmJ9O<=xPV7*HwzO3!wV-_ z76#CA5GiKR_C9w3e!*stIBLMY`~$idYMVQUMYAI)+<7~|^s#0KP_V-ml!fzn^mc=e zD}C`6G%emM>bBy`e~{TnLAnLpd7#n6FW3xH^>Q5(14F~^93lftk6&*$XiZR+YN;|P zut2MVsw7Lr`Smt~mIYPumGXcB3$!q(imAlPksmdn5N`&Z5Xn977fb9cvj zy_o+`2Guk#yFq1Dx4T2PKhE8fKRlX`A$Chb^)o{CgSNVObh|tFbU*j$E;s1**Xa(o zaOrlp0l5J*g`#DtQL5%+Szu7AU>RUhD(zzFU{ea+h{;?a0NPmv-H3S&;w@iLYx%`u z9tMWjJg}V#p?nMs{M!zI;uy5}!Kb^P1H2=|m-(;p|K`7}zTM}+o(21!-}Q$_cQeSx zrP5&EUjT7I8>G6A8DHu?|Np|vNem1OAbYGFcYs>+|1azWO+)(j`g4Gdap`rG`9B%d ztpFS7+v_g@6PNox88k}pTETIL1Oo#D7M&sxo#=Lc<`nJ#YSsb_OE@>fnlNsL zo8jCHrjgtXizB!h+M^H{BnB?*Ve9`veKrI5ROGD}>^J}aZ>ZM;U6#|!yJ!idqYv5d z@iM!Qnc-MFxUk;o&;<#ws4@umOMK?@NE_<`pa-h((aKOMBP5p3T7>7WISwpV)?7)myH^zt$dL-KSv3l6K#E;dv9Z46j5FwC>g6MfD{xPr))q#i2yVqnCG3fx&9xr|8*g3|0{&?;)N`P@!>@XnBmg>;e{5I_2b2Z z1+e|E(>NFyY#CS?7)pY=&%Wq@^IW>my|9Aw%s{(bv*BEI&>q+rI9CF+>6I7GISIvNXn{mz8f=~*aWiw)&g{xlt(xE{#y-<{kLHEf!dgm zNn_|jP4KBWuv=SvyMMZL3xRj!ZUQBEpYBIK-7mYdHC$USl{h+fA3|zU8iAIyg+>~c zC^V$1?L_4 z*Zc8!B%kzQ{@H!jvC&2awCb;vwL2`}HFI~E$NymPiT>SwBL5G}1Uo?c5a@LOZa)Fg z!T2{ieN+rU_IIECe*k=lKKPt^@G1J>WA#H+6hPL3meh2!L6;}FbRU2?732YsMz9{x zNk5>n6m)di4`hdUfE*G)Q-}1rGd9$@GVr%FGN1+)B$OQa*VplMpY0Cw@JK%H!~6s0 zmb3p4fP-WvY)z5&A=sKCaNvLfhKykG=w;Ph2&#NeL(-VZd{E^BNgM`@uj1L!XG z0MG7d1JCYk3(xLi2hZ-u;AID(BZFQlTn23;0k3y~kH13qPr=U7^8~G?-UZ4vo}f!2 ze>!&OX}svT^#8x-@iwI7D(?6{3@N=j{+|X;u#lth!RZPnKxq{v*@Myvr~?NvKis4HEXd|=Hy(Hrap}I%?ZyGUAIYWr zLbn?WIO%{61_C8659o*==zx9)@X>}App{-1f52kJr5ln+!ArfMZUB|T3qYaG%gn&w z)605nE+n);9a+zA(6OvrK;hqwbH)10Ef*n6sz6@GvR@4)yuqau_%a1ZcuQPF4{tG$ zuffNzfy)P2;9?1HP~qUx?a$JE)&+FlBj}DU(6UHK;n3|432%1}P|*POYxflJc?Br3 z76uDwchrD(M-FIrL_o8HR?{H|ba$8t=uRHc!b6wt1Kkko!DRt*Fhj4qK(#sm8prND z@JPMUeYTsB)u6^bIF5<4+M}11a~>#$KS1)+liBDodgZ1YL*`W-S!e5(0%rQu*1%SNJ1W9 zp@w=_h7w_H61zdWju=X~cOF1!5(n$?=>%KU?H*z2W>HcMwoVzzI+t!Y3($Vw(=YC^ zKsu8<85kH|vw`i>L9z>>a4S?Hr~p8+5TRfSSV2i~x0^+$dqlT;jHR1RNj}(Wc~q-y zAXZ;y23cL=1hrNJ)mo?`(0y?&2TEj7t%OQW1e;LGVszj&N4J|zr#tj08RR8*;02J) zM-<@q)S|{8GP0ouDD5os8lP z4F9Ks7Bc*w3R(o=(%mZnx)Qtfe+ftTR1PKvhS&VvQ$d4C+F+ie_C=TORvsn>hVEX_ zILQC0pvlbcsUVToOC^2~?X4$ETt4v&u!@2*U+e!*po0fAKutuKBWe73r@+S@JOeFf zzv0+@gx}>LSb@T4{%5z-`13A&=6`nS|5OP^2FT_si1S=JmV#XGVzCr7=un~z9&>Q9 zSPB}8DCPJ+71U>Z&GvsP$a5|oU`0^bk{B0@rJ(Vzl3_|G)c0_hlE*Ng2oghX#O*Jmrk%-Ji2?qn;2S8mS|YdH31C> za{5@WwE&GwiTidR?Y{iNhl7Ek6D;M^36^lNSPI%HQ!4J+U1q?)tu+Lk2);S;Pd(yd z{h&nG6Lfucx35Mi7bK`bsTJb44U8RN)yG;v1~7p1J9gXky8mAJ>;M1%rJT+GIZIeJ zGrndry50Pr%aMP|agSDzxyP*Lf_m{Kvfz$=%k2`5|5HJWtw50oYAkkurCqG{f;#ji z@;gC&{O12$prA!o=F$OH;9|8E)VnW{-wEpQg9iK2jC1J#D*%O40;oTo16kJzTG9zV zlN+@82R8c(Sw9W#KPk9&pXk2j(f!jARQg*vf(|*B1f8DW%e&(zKlsE3&X^QXt+gW(|Z8$az@rL+OlBfw%|k7|Bzp4(hAKs6gE!3vvr1#4TzF(;as(s)4SX*#(heK#>CRb}UFgPA(1hv}^BMCoj zKnOR!1g)Yk5omtNUBcb?^8=HLN(r;kfy2j{I3=N`fEX}SKu!T;2k>4$$noF?pu=($ zx_|j}`f~Vo|Mcl}1>Jk=(HZLjzTB@g!lV16Pp>OO_j$+OK&Jm;0o~{ShY9%fx(4iO z>;{cI{13Bet_@(|Z#@E_zyIERjlUG>&Wk6eXyL% zW5);365s#-`8}E+e0cG4D-VN*_5+XJ7!`%r+%K}8Gc$CDI(T&70PW?=^yxnBYJ31> zvjJ$I#&Xz+ork9}Gk}g6>=iwGke>m(F8RfJuo&oqfSqu$+0#HvTMmQvQozO9r!g}? zomIr)(S7>GvuDfjC~L2VOIQPHxLlaq#Ib0Uh`N+G@~Uq5=&7$oLf~s1!i6b=|kRy;%N-Yjk^a zfJknSZg&lEP6myE#e4jJ0G$uq1zK1K-bV0(`zdH)4`e}1BB-qG<@J~%%g%G~Nivtk;N(f)$#Re3IKBVGic@DpA*pzt$Z7=ZZA)(jq<&ISA}pmTUUnyWb&_**W5+C|OP z0u1~u#~@4z2L6`a5T*hHe+zisadWi>1Ahx>If@5p{|kT1EQkUN2L6_Q2-AUqzXfzF zvPW~Z2LpdgB}6oUp`^&8xjF*0Wv010fuSVDqq#bRp(GYG-4Fq4f*TnBhn)|Sd>qt2 z<#Ck<>196Q)63Eg%F!X<<8Mkt{~vGu&slR5bh@H}NB3b+I*SHh*`y3o4?3|BJX@&% z5xn;ZIt>gThy~?$l>IUvJ$fT+_H%-cxCE`20$=8O?uF>z|NlLj5A%35zh^9c4LU6X zbw|p}mPe3rW2kxX@d(i9u}AVJkM5tI-8VdXS<1R|8f&`G{tqwk0Bx=Tho1GE@1W(x z{4LW#ZtfNJSSri_QUc1E!k_sCqB*)xeC8Jj2A%KC{XaazqgPZHNeSru?q~^!5)j*4 z0HQ_^U5y4rjml?!0dEC}ny*U`R)O?JTR_x+PSf%>0IBJOI1ZAFyW!Vnz*gWP{0lzM z8&dH&xEeq4=ms6H0y;_;JUeRuVwpI0-vH4Tj=erA;4@bKZUyCX{ua=YY@q3M6OfGH zi)T<_&~+ssVXy|F7w4hEZ$aVIefEXD7-;|f*%#k0gAVWooxK7&bj5%LeCUb^Q?27J z(5w*n+!cWrm-cZofTyTI=dK*x$H`!Psn<*B#qNEu?fl4xu3UWya#x8q@J0!CNQxCRFa)|!N~+ZO~3$tnn1)p@M!`jkaJ|bAUq4mF)}uA z>t7^-*4cyap1r+`pW#JPDag3fFSH(j>Ml_D7l5|+fZA!$tvB&;hj)Rx`;db4(0!14 z$Z;>(;C;F0JUZJz>nL6v$2jza*Cz^eWltYy$r@;{^1FJ6E-&_hpdLpYE_ zPtIk4R>_@x!L|{!=o512$$!wPL7;l=?2GriK%vIp@&+t){>6Ogp(l5s{Csv$ACbT1 z42X|%2+G&ZAe|*>hoFEKc7UeDTsoJ4H%#pW9U$@_ygeED&<~F3pbmvcujv2xpiNAN zUx+UT9r_WXV&l`f9CXUX&SgEI!ze&2c)DFwY{2Jmbhd-0gg`mDm(|<`bX*LZM=z@{ zXjfk+_%IwL#9=twO+oVD!*F!0z)a9#I2$cMOxR&K!m?l<$hjW9tgc`ku)}cDA;;!` zdS)KItT#8K9EOu657Oucn*ZF^ z0OlK?{68JkH3Fx6C=)cz3E5-_I_^)$8+6Xd4StOa{2C|zhkJPRvIZ^}W;ossn!g8a zig(<35Oe}BXyDMNmo;<=NDg#%5=hRY``YpL7Lb7q4fYn|AED=;A@*b5^yoH!;lCAh$j7k~J&)tpX6A*c=lHEH28p!v#B&|)eDkM5g}po7*r zLH&DBQG5_|(6Gb=%M6xMPRjxg{+7MqLev4gbL-_UQ0RkdUXNa{#uw$c5k*Nm0|P^6 z21{oF$N%7n?h~Et-BBzMXY}$iE)r&V5mEqh zQjLlSq&f#JG4rrK!QYY%YOZw$R6tKw^eFJ?^eXV^4k&;LRCsiHRd^hCfSk41-3DS1zn8~`1Ja#IQ9lG{+|rqMbQm$XX}9yL61)N3J)m1v!dWN zyGQ44(2A%3;90ol-Jp?44v)^=An(>WdUQ8~B)d7lAq!@Ebc4bQybcPSGQfvE?z;&J zWr+N7hYHZ_`TuT^Q6AmLK}{_132UG*f+TLpdF!CzHc$`1!K3?T_bcQ7-KRh&6}Wc) zc=6sIw5kep@@}a#s2#sR7<4}ZGefUCXi^+hi^aspg3ezrQKyIR`mL0syZZ%bT#gmI_~V740|Ntiu{2~A z+%d=Q^FEy^M>PHiC-jCfx*DJCKH<{~S`_yKGUL^K{(o=)NJIhF-31?T>G=PcWAi^I z{+^=$|Nlc>GZozbg&fdz972J@2G$)0>+?v4NVFcP^9LOm+;jsJmY@ZNCHCFWwWPfe zB|hCJy3hZg461xV2MqV}hRqjd=)U?QKNqCs+zay?%nTsc6@Z6?Un_$T>WG>z%<#fD z7e$7%bIYP&>o`vX%inNaO-Kk0v-Y40MPz zc-A@seuLE~pYES8{`>+RKjYcC4m8}@E!Ox8R58>?m1s2n0v{MF(fA9rva>`0#0L+T z{9;ik6DtjM+zT2dd7a~Ek;hr$-hJ1l`)%hO@B%!`JeiV2k6vC$(3Dm4kqB@%J{ENB zzJ3lfL*pyZfJ}*A<0}S+{|qH+&9Asi6dQkm2T&wEdU+4e69yf$gQV+cHZz0cUeIXD zZqSGf)RtWype)|G2fVxqSF-a#?tf_f z37YUPMZd4h4|HFbf=99+hfnuK=w)3kmrA5z7i@K--_G?~(Y573i6TrM-(_6j8u^9U zRb~c{PIn2=LQU{>T&Y(fjaX=KcBg<3EI>p8XoX1UT+sYg4(N8wUe+UXKz(i(6$Qxj z=MjdorGHCDmT<|F+F9aqrGjzIZv>qtoJnjyP9fsEq9=+ij zU^hAbp9XCKDT3`Oh1e5=YLDw&VTKnTMv!Kz_y7O@!E+ss|HA~j!!^47IUN6oX>_}B zxON}?e*m;OCBHeKplgPB zsS`Z)2M@ZUIl>GtN(~`is`&T+KX_&a;w1yDUII^2p8)#;;e6;4XYgq&ojEFy6KQ-@ z6u>5cedf{2dTchx9bFK2FrvCcszI3H#ajc2J3fF;vW+(Yg+x|AsC6l-JV%(}B`+g5 zhE@4nK$qztf;o36Y3CaEL_C7H072KHPoch5Izn zNkwiPkP}ltLw|k(FOuvy!1sxP&Pmxwyy9W9}@BKE0}9vxFI5+k13hN6sQXy{i9af?T~G;%dv8pp)BDU|CUVmN3H$Rj8{q z{`~(Bp3L*;1W%BHla)9)O@wJcO2v{;NQQCg_G2-=)a?&mJ>US!HZJgV9t9uDlJDTt%j!G>#n<9O z{0uMj^%xjlnj;REIRmL*B|<%#-yqJHf!yZ@s@y?43mm|$>K9)=|NrmNyBkzl?*kqB z*3I8~vV{46aDhkjaTf5ceQ!OwH-lPhpeY;4Za#2Jt*!#(5seF=O6NQ16qx6rQ(#(8 zmK1|di31e}B`F@grq`znGr-2ny20nmfa4Q!&D!g}t*dQy{f)0;vUBt-%>UPWp$$=+f!Pk4h4xT~WKZUEm z^9gz>;EUIw`vonxgPH^2vt~dHP+Q8wayw|=3M>X<%Kr8N#HB>^V9uVcx*)ai> z)H^#sy-o0f4hQIY^*23wc>^X2GrW*q4jS44Uy@U*@M3QwXm$m3w6*a>@Wx>q5Cz`8 zb0`Tk$if>8()4T@SQEIuS9s9@*JK7#-OI}kqQIJZA)53+nl?f-fe(99co7WOBnVR7 z%X?`8xS^&H{W1cgsj*a;;YAHZ6X+bhQiT_Ca7`(tVCT(+Yf^@2x-&tT;e|UylL4qX zqVVEn0?beQL8^OsGe8vBdG8XzeliEyBm~g}K5<6j#TK|GDTqzRa7{ZQnn2<&?k)uf z1o+Gug%|a3O@B+k&imI7^HU2%)7uhZh8HU!n!u;dD7^53Yq|i@bP}$~AEHSCgAmR*CYke^t)e};e{PU6ZqsAg%=OvVF7Uuq`H?k9z=ly;%Ndn zAg+NlaY8hK&z@0uu^O&vCrEWKuNH^`YuW(Ov=OA~$`WuuWI%$v46X_6u3p}+eXxM2 zhG^;mX_^nw1U`R8;e{hyQ$EOwUfu(6O>PiP|BHngUSvTufyXfvUhu#*Jt_tVc{f~> zAVkwAkS0^GCiodN3NNn2!NTGaL|-sm-_3Y%So{Lb2>o3Q@)r2|J&4cd!1dh%Y3SvZ z22tSPSP0R#3S{3=h(6GA8;HIXxV|okeUE!#A(9EvHwmP#7orb5a@cyHRN;jVTwf7H z-)gu%Lx{d2kUK*m`aol35c|Hw!u%Hma$qlSFB1M`oQCeVEgvK^;tpm zS;O@mgy=H@>3a&QA3DL;P(bW!f$I~3=wpWK>xAfg1iGYeEkqx5jg%% z_rSs>5TfrFNM9*LA7~U4VxI_H-z|u~$#8v=5PeM`eYOyNpv~hDeRpDD;gST=7Y*0< zFcusxSs;C^5PhH#WQe{caD847eadisDNrSxR}88y#iU(%ext_&k~{!B>o~6q7O8k1aaq|Xqf*_LG)F_ z^)W*99qIwK=OFsP!&+ebj==RTg6MOG>pK|(4i}L4i?<8F{sWEaLG0^+>uZAO- z2+`M6D9rF;D?}e?Y!{+01g3%`Zj?)*2}96 z*S8U(Zxu-2)%oCX0j(m2*jEDA*9Fn{xfABUN{Bu!kUQr>^np5x5PddqeOwTC?uP4g zgy>@e=}U#^15K+#^s&J8Jt_c)XER(MCq&<^0%3+1x)6P^6KfP+oQZ^m%PxpMZ@9jT zQQ&a7)g{dE;_E!H|3Jf<5c{Se^nn7Tmsc3BZze?FCXl|p5Ph&yYZP9@!1Yan=)2tk z3ztNQzAliyR){{>xitzeRN(ruAo>==^=U%%C4uz$LiB-_sX^TNCIaR^Cy2gmxW12( zVE=){Ux-5Vfk$1z@xBGFPYI&W7_M(8L?1}}#of8!Z~+YiL+q=8>tllG``r%nUn4}{ zuTEix7fT`fKs(bQ`dr}pZh-=_m-jGSpC?3LRK767i(H7l3V8bDf$Ou%2giFiT%RCB z-y)EGrVxFwGi(%ITnUGTOB2MtV7R`U5#VqEiNE+e2kbx4dM=1N=fL$PLG($(^(}U~fFJvM5Kzk1%_U(b|dj*Q{US4aszJm~bAn_MZ zXM@89v;-8QuLZ8}6ht30Twf#;l% zkYjliz{m2yx=WDtNuZHB0Z?aLA{@Lwq!GI79DLpYcw^No@SZ5p`V-M^23zomG`lTm zfVz~`rThPDW>@3?p2;7dkgxgXn=N!i|W4OX8>K??a^5(@Y$7LfbX*-zd#rZ=o}x&2|+IW0+54$ zpyvd+@C!z8cvyeu?*p}$_%*kHhtWNHvpM)R_keG{1s@nx;KHw&0y%O>^{bWu1LV9Q zM}7gDe;{jI{^2_>h~)}1_`IN=E6fZo;63Ny^McMm&I@9@0g}A{+Ca_y*^xi;3fTSs zkGt>-#xlST4hsF_(R@?_bZ}6Y3%^E+iUD}1YyrOp#EtwK5O;$Q6>@=ddH@a1K-T*kK#!j=z71aR_X?C2B+$|V zha-3z3UpS-XV2uHh~!WYP7WVDpvl3f`v7WkaAE|@_<-V30G=F>69Q%uaBcmD7Ww=F zqJ}T{89X{`1;8=v(fpr9 z`CD^9OH-`x*BW^CI)DzUXSoN{`U8|ESK)N(b zcWi}6cWFVlZ$@`$glF?V7XF?%@P;i14v%hE2ao0he|&pmRG2&tzF_j~Em2|d_7-r#m&lrMH~Pqtn&Hr&pvEG-7EKg6$b+9UabWA{N1=Fk8a{`I~U{Ob>X=8t6ZNIv1jFCe1m znS9cN*|z|co?IC|^GABI@C$|>_{=ZhdITf}PEWokKJ!O{&WgJBnLqN_XMRDD09civ z>k-$MOC?+&G0?&Np(pqSTn~WKW;df_r-MMZBa36Fg9yyge_qSL9sTdM0Nl~gQ=nk3 zc8x%BHvf9p46xI2xZ44At_HfhWj^x@fSgI9yB!q34mW@}+yvxsR@ZL+*ODN2gHC+n zd(8)OHsZi1avg1fC9rMCbhHE5(E$)ghkzUnN+K*sq0NL8+R(F|$aQ!G7Kg`>;qdOz zi00!gpfj61o8LA#@(Vg7bTfK39~W@!bSMB_dDrd80y@R1+c(3p)1kz(`9*_AbFK#? zf9ntMiB6$ApqU$%(|o#19ek~?@%J8OVPNp>_2mEugnKv36lh*?=ikl}0?jM#{M%TR zKxO}N$L<6CD0$@oD6jCZKj_N8{%}LB1t?d5vWrKzYXZN32%~562~f@emBZ+{1ymB_ zPj%>7r8_j@|8dX%haC9@8M|2w9XlNbx?K!ez7q&mM|9?*$|u=xmZfVy@`G8NiYr<#H(R7NS!Uxn?5M&4OeH4+39ezPCP%VZx_o9a* zzaSILaj-%L@Z&Roq>mv|+I8d?BwS@;@gb-XI0&jYJ(~|m zfSlYD`2YWZ(3xyCDiJ>2IV#}OHbJMVK#uB)iw4cod31Mz2J2panZn5cY88X#>lDJm z!B=!TK%2lGpcB|Of@VfRcLIa12XyIXc+KXx1GF-yJBX*-kK+Z48E8TfRFc5f{qF{K z4#CHz6?EsZlq!Q(Rwa0Jp9Zbp&Un$1!T`DvfVi<1uX|kB|s|(@0oEjfNuH(T|(4+#KAExJ`Qxh7TBfm1Iy082)71#2BfI_ zIOHO*_&D(F7>t)LlCP>0;lv%4P@KcG|Qz;lGXAu0wh+Sh^)HZ$mk zoYZOEI{~znk;A%m3TP*z)Uj6ZRN%4JG|(hpCs?)}`gSV!1J3IJvfA;A1 zHs}u4ap`upaOw88@#wAwU93`K03I)}G$>W~u=Fq}Rdlg*0G}4-0Xi)VYy)$JfDdR* zvID3KR(chbaa&K8@cMQi_3S?Xf{BlT;k6)==gz)(F91C?tVF{2B>23r=6|d%-N*S| zPZ(c)Ex*`vffBEGZau#zltY6H{@M|eI1IrR_ zhM1+?43C#U_#iP528n^nS`Y@6x8M~p(D5jb<~ISx{~fzu{6FQ<{jvEM2Y);0hA2?g z(aWnJ`Q?B2l*St?KpF1h|3|w)D?VPXV_;y|4O&qBatVmV%)r3#614SdH!Fw*itXK? zZ7(lD`>=O|ZX|te1iqcAF7DHy>tyEdiEE2gwK_%Wy)L8o3%D zFuv4%_Qf|z&}o{W(!SK#qnFp;Ux?wwAtz=AkK=8il?0&fCTN#nj7kD%i%JG~F{(%N zk%0KaySW({7`oSi*1fd8Efq7q2N2|GQtb9w^z_eY(4)53J-ssR(34 z0c7LNyvyK~s53me`#|=97AlKaX0nv>TRL)-a(P%*X7IOw=GH)Ga$E(O`S$|okWt8P z!ubFH|95lzp9UF>|Ign74p{5z4E~n6AV+!2fR_A37W(?D|*-QEfy zxl+(EsRBN|kZ~J-5m(~_;6XajpdRRGMnM-9(0GVDc#SrA1P3(G=MNdl1D!+d4jLix zQ2{lu{58N@EkH(EfYpNbSoxcPMIFEbHvgxACn`FtGdw!yfjqo{@#V6A|NryLGu&Oq z&G38~H^awe+zh{$aWk+k=Vstv&dngUoSVU5IXA?Jdp7=*riAc9^K$NwEI{0sTYSr z7#O7|A(A*779Ai zY$lxR)_v}UH=JhyIxV0E&ea6ntC$PtN`a0$lY?`)oBy$tsyEbfF_h{+k~Wr+Ck61* z6ud~fGekweqti!)BRCYaVm=f+65aeJ!6zAV zI-v1e*Y1z5t#A2TzJZTA+yg#+)D?6(=~Gb2p4#j$ z92M|PG5`7>KGx4mQazK;d+@J6|Kk5j(0V7(m{X~MNAr;cuya92C&fk|1`UTtcyxbt zZT(-T+Wp&ow;OV*x+~}` z21vUEe0?EkObb-VLC!^L0iUP}I>-xjW;=M0tFuN$1GMr_;r|54wBy?n4p24bv=TaP zfa=WVHy%FSU7!hAP=nII_yA;ezY_~+C2F@5=;R+8$8JXj-)>I{&}N<&;BC&$M?4@6 zIFM5$KqtpTb|xlxbb}kVp4~5@3(~;n6oHqj2cG%=zqy`+fxmAv=mea49tQrtm7qq? z@ix#BD^T+97Vh@u@abFwUKIX6OapR9DfTtl^3XNe;?OnO{E*eyCG4Qd9){OkJ3vJ^ zXkOzW=)ibzV-FOR{wyxt?A^g2e+6_q3xGn(12lgD2~TIxfky_Y=N`S7@fUP&oeBeg ziy3GyfH#L@_fh`!?mVy)YdvOoFu!nYw1b{{7Oe4_xjWbZw369dz_Hhr5p=W{Xl9iG zwD8xZ`$0G8s3OolO^=yin<1y6fo>N&2RfY!-^oSY!5pAd!47mo9Evz0>BVQz!c=#j zZg1F;OOE{OkD$BE0OT?akjvb8Ji5>QKXBYd1?;k!VCTRugCy(>0nl+xxLuP99uI;X zv|BMT$yjr1o_ef$!&=1 z7ePS+iK?Q^MA&>5Jpa4734LWiP=H3^_Ah#Vp&j&S1Od%bf zO}QwI66O$Lh8Ocdqr=^h@4wGVZNK~mX^dB6Vu?-qmF4LO6`19VcDH;YR*b9Wf1+5#t^P8SuAZZ`qY z&Mrtk0w2_707<19-Oixgrtl)*7if(x>%u%xs8581x=ju=)In$4_VV@y2{XI^ZKVQ* zwoh-2N`fcKy%p6OplK&q=MlO-n6&UdbsQGn&G7K91kLXwhqngQ&*1O|l^xLV1~m{N z;SI{JXF>VI8J6Kdhsil3&NxF3NKoMnDY#u!93ZEgSwIf6GXN!S4N%fmcwzAK|Nm~B zQH`(~cT_`9vIEB|C?|jpwL^9XPOG>6pk_p;{{Tnyf*eppXF?)6I144Bmjnniys!ry zqs6p=5l=)nT5*E<;;^&QJpL~Lg(IZyf#o-7Q{NF%1v$WPVE^db{R4FU`Znm?cg zr-M2t-JmPaV?YIOf`idF(CNRR?jY!_6jlcdWAMG_@?PM3&q3myAu0wQy}Y7c5Z7yX zbYBKv`Iw`k;M;xtg{(O<1H#zSouKA<0%#9ch6DdL@Coe&-~kW#t@N<{m+ zKm`(m^+Em?&=#P^pP-#t{QaQQE%;l`F)%QI&gBsk<8J{?l0nbv2?dFTiIr%A_+?`J zt*03n7{Js2CEVb}0Q{|>_LbufW>60c)cS%*z5`2^6x)IZ#`s(JfUeoz0q%uugc-o! zvJAou6D!#dRW}8!4r~_au6u|f$6nupxV0X1I_^)<+Jh1)kbBI;O4^|ATLj{liIwWV z4sir`hhO_R?f@NC@!AD+UXYPtiCN=I=(e|)+$ECGbAv!TL~PPQ=b4x?GrTMZU9%3_ zWWn&7&v6GkD2cNspGq5g*pbO%Gv zcL8rC0t*;`s`YS<*W#dRv_uj^0=z{8q!QGA`X8?0(+M`Y+t~tiqFpZ7d_|b~phM_9 zy3cn9bG(pag>3i$&2hhG0~@XmGaO0Tckp3#km?&|6_WG~uyjc-=qx*Di*9Ed&{=kw zU`u6@EVY4JDhW|;2enWc$wHWtZ{VZqN~Do2gGqsI^JzH%KE;k3bc&s`P3v3!sRuwA z4}5{F1*miE0N+fDJa-Ms0MPWGqauOaNib;G3F^c#_<}BrjRM_p3p&=$2ehyIC4b8y zP~0`|1dSmwxO8`dj%h35=$>c;+8fK?JrOiWs14?U&#Y?%9UIr(2^x_5KNYlath*H? z(t4nzta&d;FGET0XMO?EbH_nD=ntjw=bhk>KKYqH?%-#B!PXU^266LVuw7~Vd95G~ z{Lu$W#6I&2@b2d3XZXw?ci}U?;M6@J+d)&Ryc3UuMNfR@7wiRzf>ic`RSNdrVPar_ z3=1;A2Emk}!(!lb?Ldc|fr>fMS!kfv17viN0ji`VwqY-5%#)!c!~^Okm+oHBk^P_( z?Q)nvC)$BSL9}}+C=?t)C)$C8wWorFyTJpC%;2F*m+n^3ng5U@_Ktx^QW+ZdR)X3u zrNaE%dO_#^8y^6TFHJpQeXv9me6GAl>uu06aG+Kr7$Z>}QC`o|M z67f@c(YYIZUb9iR9}j57O805-j`FFXwT=7&%>06GD*OW80{nu0Cj0`<3jBg@F8l)C z2K<74AuiT?LEB3BTRmNBV&~>EaN%32?<~5P^EA;{TxrE}dYfd3MKw!q1cW4k!>~RG@(f z4npvuX5e519|Pmj>&yY_J8C#?WP}7YSXHmrUr1Pk@?`>Kkx2$9w}L80%meX2`4e*f z9Pab*R;)rf4{xSEGx~XWpmn-9&clO9p`3>Y5(3rP2H+tZ1(X#{2=`z=56{N~puN|I>>a#9U$Io$z2dB&0{{-{<{naZI%V0?Xn^CvRnv#FCRjS6+vjf z5(s^)Oqk)Y@qxo>6K3z`W>~zNn_=~CZidafxfwtMkh^ztGo0Sd&2V`)H^c4S+zgL* zb2Gf&&CT$6H#Y;Qxq{MgVFWi^G;Z;M8!WXc5DQG9^xb4AA4G%v>(R^l=O!OR^G|M2 z%Z&AJsW1bg@drL10ek{fFYoU%VTKpytUv=YpyA1q5RYC_{&G;{oOrQ)Cn$%Oa)ax1 z=n+=EqJKf7(A}qB%!J8;S`2X6=TO;duq?PCRKf}#T7W14IquAvGobMjM;4DxM;?z( zM+uKkM+J{gM;(t&M-z|kgU1;`r=1*k6oF705XuHb!93y9eaEBm4X91~nO`6aG(?&N z8Z4FK*Ej=O$mgK|T6_qa*%SaR9gDpDnLqNVBfn&;gMJHlO(g1s(Y{ zu7cKEf}Ho6Kk^J%mm|M`g9&7PQp80^evR`m8ApDNBM_B>fh>;v8kZniBS3c@3OIn4 z;T!`w$&p{MFU69BR3YLfqjv)VoS3?OD$$<3p zYn+9KA%DaLkd>go5%|n67|6q~aUCQDT2^-fqVzt9e;1}j1!NXTxdF&tm|l=0Zh-U) z@M~O$sW1U)y!4qr;wFgk18Tx+5a;}7{)ih;&7iegkq<$pedZU86oKmg22uv{aRg|6 zMG_ZjfGP#Blfb?JC6~y%AgiFZIDmX{ z5oR3761Z`2FG2Jl1G|STFTsP%;xj+UHxU;>E&w?aG=`sK@)_za3*TO8kS*W%HI8_6 z9|SQS1Ym9hc@^wCP^zi~jq6t#pnJ@PUn2*!&=VA=5cd+{J%}j~M;Saa{I}_A46s#5iT@MPHH(~zFFX$|C+!<09IfKh0P!AP$aSE(|IuX28 zy89;Rm>*-0ZYKwi&PK4%aVJpQhry#8d=L(3US8j$Gr+;4`;bTHWbjcopv`%Q!N+@m zPW0%W1S*m*fF|EhLrPAM&dK1DpV4$c3RI+C>8>8oFnssN?o*(Z5pH5HK8S#p5rAjO zc#s?T9^L++dA3f_&fZSY33|yH0^LVJtv3hoFm3XI7hj8b7(k7)URmiv&|dwMyZ3=l zAY^dvW$AR>1?rvkvbchVSoqf;^+>+p+{@Ac6#(7Q*~`-9*?rlA*-Pb+4&%Iz) z1D$nMqT=AueFN0ovH(Supz$Tp(K+F>85le}=PdyBHM-BgkProhYmJJBN9%2H+XK{} zf*u0y(fr24vDfjwPxr;x1a*{g+DmAK+-;l^yr=l+639%1R4ajYy_=GDCO|zKJ_vfy!hxaxIGF=+5(`Q zBH_|~$fNsa<1b&Y0C)aYP=;~oo(S4y2)ae%kZbFuI&+WiPS8A7_aWcpQ)v?#Z5lym z(3SW({y*UH|A43U!J0SShZ=1rf`(X1ltF@rJgqO)y!GgA25SSKJk0@WybFNxoWx;| z8Qm<6pk#t9=$U)~i>UD>SI~5tBj{4L?h}p&f66#^A5`JDVJva>NNxl^|Yzee>W?3777R%@6sTe{%7+ zf?8ovWxpBuTjzpiseZEYgID@EHa-9u>Dc%KWE?+u-HA&#_?$AAZcsq;_vM0Da?S>Y zns4`M=zO1JH)rd~5jMS3hGEYb{}efz~B6Xr9{NB`v5q2 zbQu^JSXci4|Nmd94n*t&gDnGt0YgbP64!yDB*vD3p@5+z)RuvvfuY0?WHK8l&`Rwc zn;-EzHoszbZ2rYkZiuAIfT2VU96BEuz@ekSP$C9qBruflf*An}B`n>)UbBMt0J(I} z21UF}_bJ!b+x&e~K?lEfZw3XLPxrO7369_k#)Tju^Z^vD0{pEPK|_uQ!9D?ru#^Zx zpU$!!LO0RzK?|11ChfB(Ovy!B)WA6Nwg#G2AX2oD@B>?K+* z-3P(mV&DgRf`Ow%+_4wbG5-z<$Umh<5MiDYO|U+w%_Z`n=={I{icSTF62aa^28In# zD_Ob^y@qrltdEz7I{rThS}EyjeVV_A4YZiJ>(BrHp2-KhS=zAVF2`<`W^`ef?ru;} zy0)I=@ACyuxPcE!^X)$5*v*0AJsGew8NlA-Dv<*@lYt-POa|@}f&Yg*n-8!!T3@U= z@{;KfXpIMGSwVM+3MA8eBp-6@W@$Qn=8Q*oBWN(#_~d7Pfez4Gn9uwI6F>v59-Um> z9s;c=D>&2m^A7SyA9&53#-GQ)AAJBiwB^Ln?IF^7vVs>X54z-<=WrT-o&yU+5orI5 z6A!#41S$>BobhOWqtX0JpZMV8+{@ds*gmDsy<8h9Lc z05xwIJdQgEfaln|K^OFOdPwjKuytnWcyv}6@C!P~c(nd6Ve58R>2$I!e`zcQ=FWbrRUX$S=?g z@+`j~=pyqY3b3{($V6!U20Ii6RLMd2kAe3Qe)8!)~+xe4EVVgQQ$ph*Fc{k#bKlRxtd zKH!Tf3sk$1uZ961Pl&$151aX{FTR6I5Nzff5H=sSj0d!+Bm{cwA#_7& z?;7xKN{{YJ2cPawyFha*9-XlTJ3vcP9J_D08vXa_ehIo3)a8P!@qrfwAZK*C3V3vb zPKo4i5nusbcln>cRi1@`p_k<@C^vZSf#0Q&{K4bkGbRt{bqh)!y>9#-*2l`3J-d&9 z?^$RJf!?zK*)RE;8?=h&Pb;W<^P`s~+M~0UgZY3@@(0g@&zL%089ZSIdG@;Tdm-^{73nrIde~;JP+7hAx8heT00__zIV)@K3CK@2Az&=u$$AObXW z5+w4OUoc4KGrwSzglngTW2XZPs51iEQs&s}$n4tb!Qt9j!Q^IxWMH-_z-$BA5d~TV=;Q+O z2xtkh7id>-PzcC3F(AMCfV>pp*y&;5*y&*6*z3sQ*y#ZBpMztsBd24hgNtLQhYiU5 zC=C$lqyw|X0A>rw=~1BTjh#|Jwq$?^(6!J`IUrj~9D6-MyYiwc9D5zPK_WGt&4(Nu zJ3Tx+nqM_Ib~^Ytg0@=qI`TMndW1N3Is`a&Iz%}3I`TSpI>b0O9~1!XE`{u@F#Y%c zf46IePj_yD_2C+Um!OFeP;&}2hvUYQ039-qY}~W%K|v0d127R%;3ns?YKvGY=K8_DrB`GX!%}T>|vMg)4tuuJi4!WcAs_pAL`I@ zp!A0E|4uv9)rX+-%RmjKPW1Y!@eQbehgTVn-7g{6gLMCVaqBy%o&*(+{4I+?4citK z&~hJ0rO~1S-ks2W3|xVLT6ge(@#sDet}rq>oo%{Xz-tpbT~rdfTfl1*J6%*FK&wnZ zt93zv63`7_8VC{wtuW|x0SyMUsDL)9gOpfww}AI7z*Y}}mbrk$H9B)Z_m)H;ifYjI zZ;*coti^%X-=JE-pkXJtjRM-@(!CSZX5<%ew*c?pFHz^;HZg&Tfx#l&19WilM9?}X z*oFij6@?e(3qa%bB@Uq0O!nLV|3O0+4#ycl?I8Yb{vI739Q*<pRr;m6AU+4bUL)wzt19_YSrDIxU#}4~ z?OVlP$_ugD0@M%!U1L+CV(?<&8&Jf9s-lvl^NwNIRmHz4xQfySH%1R>|mi|;K2k&e!*stOF@2w+1Xv9f~*1RU+{Q` zLBmdPqY@l96CrWqBms#VWsly8p!sU#_*gy<6d%xW5rb&Z{U4x)nZt{7uR&e{jmVV* z9|xskWG{hz0*NMp|G^3^2TBExgQ{!>&^Q7(CZZ36;}Oh1)(mnI$Ri-zK~V;>2b9;F zj~F0Yh*;M9LU*IX7W`I#Ze=p?=_UJ(Y@?l;|^Izw5sKX;$k zKJ3!{`?Yv4kF-nokM571zAV}wT)N+D-*D_c(|wrvK&LN5r>lr#Z#ZLjE64(u&Qy+0 zR{?AA_(UC-qU5HrI|&}^e;@_CJC?dW;o7 z=h%IP`Gd#*KG2~I4WP~`zurO6E~C%< z0u7)(Du^pqD&o=I3zBpNFU5YL_4WV%*FvabVa%Y7F+ZST0jfSuzhJ6iW^e%27QLw+ z@P*!xO@Gk51)@M#ib9s5<4Bg^?z3a}4Svm11E20g#+UdtYZV-f{&!9VrOwa%0vkYX zbLsW||CwK42guc~Mo&DGPdaR4^f>sC#i3&>D22In`Z9QQ`U-e7{sa}wxGx7g;|Yx| z7f@`y@T~^5G9k&T*ZaTmC67*54)C%rJ0{R_h+p8r1Q`&!H~61V_Y0TKP!`|b0uI=H zSD$m&yYtK+YH=8rwYuW=mW z0+{VF7x^`Ae&&z7_nBW%5;PU$_UALdU?r%X?8pLlM8pM<+dOZa*CP z_1XB_Kz{zr9|1PxbtS*X(HD%9m>E9v>wEwOBHN446Tv)iP`mwk@dU!X0g`n4@#5-4 zP`3k|j9ozO0-Xyk9VsdrF5QPgi(6h?`}O~S3%H!?1}7^YNJ-+rKlPYPw=XC+!V;3h zc1Fkl$32^makyIl@MqVDjko=kWZ0 zz_Ztl!wY)qhexl21HZ9iF%CN*VxD(C^9u%mHZesU0iDaT2h>O4 zk92$hI@;v~RLv8R8qiok#1)X5Gf*`zKx%G4)w}_z0qKeWsrI-7Rr3L)=EZ0JNY5`I z1t4w&h~@Fdv-t%he{0J|txC=z6l=NnJ!>owE$ zZdUNiq9-X^ELvt@8^gyen zJbFdVqd_NpAAeD94Kg`K1+>5iVJ4`!#yXzS{mQfZCu9v7XglT27ws<0pxR&DqgV7u zH2BoF*3EnjFBG^zhwi_2XxI%}6vj{jx;w8YR+!-hJ48a=qq`a09&bHR%IDF``(O

    bf5lz0n}>49BBbN?+j=R2r`riIa;gvje;j=Rr5!m?ncmb zl5h7?#XIBP@?V8 z3D)D$IS*u>Z|naOX5UV8k6spi55_i-TRb3!dNLma`3QNi4K!p3Spp4ie}cvfJ-Sc5 zsE^@fXgyHM`eIuWCqws%7yBbQK}W8a@O67gw4SVE?+%b@y;RS&6Er=z3)Gqd)t4Tb z2N+JxviA7?(WA2&ymK9S3a#5kMdRQD7Dw)b2OqF-yQml(e89nd2*f^d@F9yM_lcLM zbQq8Zc|kz}UTtD z9(3`=B+w>LUUU`R+>Jj$fn1udg*T30kq;+xYiASY;W1ZzID8Fq6Oi6{v&jE%1UB*##iw zpgZzJJbIlae0se_UTy-l6(KwGJz7ulw}1|Z0L|eBfDSi^cp;t-x~Pf2rQzTI|7rYr zAu0hLz0N9W{CPeq5k9@%3jEQRVBrF8LPmndo+3G4{5NJ`fUDPmtJlD#zCH~tOhJL? zl?souQaO;bWkB%-imK220s=65UrYwwYzEq?37&{BfGr|~q<7E>V4yV|^IotseC8Kq z{>(4n%<^Iagy#%e_2ta*q7lmF0CgH+Js!x0M(}Z4u$of?G?LpZniMX~(Eag6wmvg> z9Hm#Z5F~KUr~AQ+aHv=(60P z@VEG~FfjOZE(c|f7hge#5p=eLPi*g<4?5{1w`5?)Y%nS^!M*n?V-!MQO(+%3?3E4X8$iK}M z?BJK6BTTx#g139OY-M0zaBca|-wJYUZ?F!iW26sirFFJ|M|mM8fVN`3@YH?>8S||N zuZ?-(0owB~8}v$?!K3wdNrX?YuG=edhBWYge~)f&ju+t|b=EIHHLW*?4`@68wHJ#g zf&1j5F5NCF1)kkkJi5>S7lw|0@p^X0eC6=?f6SxxcIjT9Zpg5?Z|mCZCoM&H(N zC7h1@+t^+@f@Y6f{+H&1&NHd-1w}1r=esBPLZpYG!VE8LSeO}Jg7#~AbhB=F33B0q zlIzBAJ$hvqy%c9io8Z!Y3~ISR%YjmDP<-ALW?%sALkB0a?(;7y{dpKXx?Ns#c>F&K zS_X9H^|bC1l>%5)bAhisSfkPbN?ee*_JGEG_hpac?Vvs?s7LG3eg1fR4yYDjXs|!t z4w}RVEu=i&z5p(^1kM5-6bg~u0u}Sm!P&J$5OTdUSp4*hVk2rum2lsA&qmdmZI|HE{h8UQYua z1cZ$Ky||_f>NXtq=oS4F2oClSFN_UALLi@M1_^^ovqgr?ASxQPMe>|S_l*}5RX|pP z?h5P%4>m%sNJpE`hSUe3fw$I^ps`QU#o_{>!pmeOAH$3D4B&Nr;Pwn?fX(2AFWe!M zArATRVwC~tin14vfByg9eI8`5B-mciU^wi4UP#jsOhPxsS@?j?9D+1zU+l01w{GM- zdPTnmfLk})R`4;r2!z>g0ScaTp)1;r;}a8R%q-G0rqnGqxs@RNgKKd2x8 zjbF=x+A|p*-6udznuHfy_OmlI)Tksd@Nc`#?{Xg!LTI6p0d@k!jrc>u3ak?9SpF7c z&=4hPy$o0cwD?7lkpZ;er+|UKMGV4hVBl}zW@KQ%2$@*0SrA*XhKvnZ0oZ5*=ndA$ zp~K&@1>7`bU`Sx#ZvhQzK|+bYWex)jC~g@JS-w7mQDOcDIANbbDD8%*4R;p``|YixB9*rT+&(YcD*kPu09}1l`zl>UF&> zi$s`MX&&61x?~SjGs?s!fb?GiwSF-5+aok;Idkfby;C7-KSbFm7uLz0yUAq0R;(3w$f5iAn}722C*}grn`1e2l>|3_#|kRUW9M= ze2_6#;eX8d0YktqH!0!8no z629(3po{}GN&&)yW+R9kKPYXmGn5#$UMhjgLsav(g1rIO57xm|!q@l+v~srb7Xt$W zcWJh3cR$D*#+O`MPu9iyc29@+f`}DJiXdOWS0D+4#@L`MkQ}?UT)S_+)&#FQ(rE&D zMV^s?0cyBw_k56zAVr`VPgbzZDOckI;Pe4mZ-*8apxG}-c!E8Fb^RDheutz@uoiGS zcVH-~V@0eTE5cY@g!~g&P|JUrE$p;*}b(%mW&bp5r4Ba2PZ-7o~5h@YrKGFE_0W)YzE(2&2 zb#m+5lBn*p2YU}X?`t=I67-@)p9sUngj zTd8pO(cKJc3__})rHi(pm5U{;yFt6?Ud)yOwJ1PU=SN>~)%oMa3k_xl>(8aqpb@2W zFLr(5VBpud;L$7k0i@vki%bn>28fjWN0`)Kh?JiO$graxy`pn`gc-WeznH55>+P(D z2=r($Gx#REad`BK?u3X`K}2{wdPR>zL^41YTnC+j6$k2$f-B7@;HE^4iUMdBO#`&V z$pF;&mh|mD25PCCezCY1ysAn9G>Z708`LO_Q3(KFjti+CLDxz_ujhgYfU8^Zcn#>h zKhVk*aErnPG@tm6gFP?gXW@FBKbpLp<2`UJh)b;2UeGQR$ zF&iq}EBX^60_xzkDKIna1x<%~bf4?K3huudg6nj3k6uwlPjE&2XaOI?i`pMdpyp3^ zj!FioSLqlJX#pK>*asQ7Q1IyGz3BzI{}+eC*8iov9^GxAT-|Na`oDy)`#31YK#GS_ zRfm@Ur64nEy@eTG2;elMLQFa5g zD-&#!Hpr%B-?4kkwe<;q-&|G(2GBV_eN$LL(RS{IhZJ-?(7u=-9RBX|puSUyzKivP zdR7#G-3L5+dBwej8M-gL@W5d@xB&yY^tMDL;zjXpc7|P`zKKur2XHU?#X`_U zP~f#_{4F7%nqdRuaR(ky{l5#e0u9uYt}|d}@C8l7iC*ynNBoODa?A{!&H^6YE-DF~ z&NAJ{JFQ(hlUZCkvpL|KG;~1yhvUu$5XuBZwf;wGHz5ZosHFgoBXEGCx0|%UK@Tp} z3>Zo(5j+Qml59wuDFxDIif#Q5iyCNb2Z2>X>N8Nw0AdSh4KB3JWC&IOGh7D2Q(yqc zYXSo}UIQ3Pp@;M^86W6$Ryghq>e4f~bS7K4bY|Ol9C!8rb@+}qw}2)kLH#N4g-{@W zA8!UtX+l__;{YHmQ27pFoq_7`=-doiM(@$x2EK}+vl)Ej3zXM-poHC{a|WoR?$H}; z;n6t{tf>3k3pvo%0FY4kxfexE3=H7$pO>&g$-xs6XFH^sK{DW-G%uv#(w?`f0zVl zRt&Vn08|PUvV*%aph5?95pe{l&_d1CFXY6T8Neoij`F&A{{MfM?hlRsL7M|g1sxmz zfmZ&Payafd#=@ZVS`KuU*V-NI3?9kB0^O%TbCD+w{*?K4kiUf4CmA$sW8eYtuZA+H zj6LSjD=Ov=5fM`cmCMdD9=)QygA!O3sBE@{3f)y=2F*T$R?c1e z1>UOc(FqOFNs#>-Fgw{ZRc|Nq50SkC430FC4yez8^=p{g4ashy3GxCI;I z(cJ;&fhuUwjwR5!F3>^v?hbH-cXop*h=Q45#ZU#%6anKwO$Vn9&?qh_6d`BawVo`| z2Dc4hF)G^~Ea2LG*0uY{i#;u%3$>fUo%YrPFYW$;@3>B2EG=yPUt)@q4%8d}gD)3W zZu}3vTv)pCe`Hu>Xo+y+f6%qUCER;KWyfn42mWpE9r@S40hcnK$w!-yGB-c{eXlDR;z2!$- z_yKL_*rc@uQHU7-R<4Af(9^9LInC_vr2h4di;Xo-DC?u|0$nRPTE9ikdosVyFAZi!Bn& z3?9~pLGxmw3LwGrFA@boAq>&hefh8(5UI@7lEfhi;Ygd038kC(cKN& z5@!4#WC72MFi?-Kb2muH!*VyMG%t~bjh}XdxSJSXD1piXh-B$Yk8W^90_vEvLg(PX zm$O2QYu^nT_J!Qg+T9JBD1(Uqj|7W@1-iRIZ6b*HbBH)dpt~D%T14x~67Cm`Ld*=E zyFpw~Qh<&ILB@ZeL+dwR=xTtQZJ<%?EPHUAYft9`?M_pOetGa669aT=5fme*Ux21R zJi1u}r6d@PPlB9ok~YD^`f!OLXjGxQ0X!bodZ6^pYZ;LDKta-avV_y4vk@fon%$$5 zRZL0(91-9%DwtlpR|kbSWLxG-rATH5_NQy%W@`wB|0a7Rd!AQ343%-08g{Fo-C0A zl`{(b@(do`kq$4?K{rr!p9YQgzX$nA!K3+z2Ba8;xF0n4By=3yhGqlx13*jbPX7-E z9mfH47}UR@{WdSs85tN3z7S}Bz>hEpS>7FVa2gg#sQ+H5gY`?`)Xxr<=fEldoB?FN z2u}IqV0jj-@{s*Eu=Hzuz!S9n^_NHYN6=1YrcNeMFOS)=lL4FsU#wLD$EPZ&ezXSX zztxlZ7+$!&W@3PxN(wHQq2(j2(pbRRr?27J&IBmA}AX@q+sAnuU_xo68uJnj((xn~l(3Xpp^y4yihF^Hf?xCHDR z$oda(M;$W%4@xC$$C>{B|6dPrPqz|0d`?(`!>4m1AHxe3blZ@_r`=kZ;RO@A3aEQP zyS)gw2U~l`0F;z}dUk*C0j;5V334YmHGeAsrDjlKV|MIh1f{S9kVQy(DQpemdJymsY+l`z8#Z-|69zW{iZK6p_uXu^>DGkC2o z=#B+8&=u;SBi>z9KpQLAK$b(epluxB^bX;Ic5pC5nh(gULAq;HB0vj#LA#cGy6<>) zMss*}7K1As2hZ-Cp1sarJiC8*b~@ki=>Fu}>;1vE*ZGZSZ}5v3_x^#)Ff)(?m^#1~ zGaq9IPn$9y1Jz|NDxk}aOPG%_K=W?^s9glI%_06U=wPf2HvtBaZqPkkE-D6}`6Ca0 z=GQp@F$*FHIJ2=)p@5OgRBM3C8|+XrOJ$r6Z+4crWH=m&uO3p&BK`G`aOVc7n- ze*Vk^o_W^>4J|YmFf%m2U@VaX5&X?R7)wP!)jp^#p>Y^I=Ls&$!A)&w z-2ln~1j~nRd2spxl@BM(AnCskl>VQA(hn%PK^rzG>E8mB{?S!{k|k34P=LF9K%{?g z&IG0Wo8VPXpFBYOyDpW0Q~rNw%D)YwA*&T$+?4~n7L?khAg;aL%g6Ad>?z2#uN{z6 z`y)^g#zG|2J-T~A#TF=Kuy#8}bb^x>Yqw(zy!a03gr;NzP?rUI${c!W0=mxvbRH2n z>wzj=Ux<68J$gmEOu?b&4RX)3Cy2O(Ht|YCJbHQkKyEsTB>Z2vhkVTKo;NRl4S zyTOAi5c|*XgV_%f#A-h{J%Ktj;Owjbin<@*10_KxDR%O*OXp)%<^ekRw)H@XH2AFTYoIGqAlq0$Q?sBL^Z5S& zse2*?Q--qQ@MW& zZ8Zja(yg11;l;y85Kqp5Y!8LpT@nxXrMyQkubrtd!;78R)q#=*Xn=sfwGq^_f%mug zTM8K&7(ge;KyDlX?(49 zMFlkP_nBX?M#bPoB_C)coxkN0c!7tD3g{>vkS!o35HmH-fl_xMRNX4jN@;$9E#UpL z{2IqzcqD>{74|?)*EztialDiLg&|m22Xr%D3)H@tW1a3SFC-8W;37Wec&9tZ3nr*2 zX#Um1qx*EHJI@P0CXmxgtU*bjH$=q)w1nZ*CGb`cZI51Feo#4P^^l1Hbf!)L=m?zz z&{^=HMZ?gmX5tSU9eDk41LNzvp!18nPoqn}1hqcknG@7LMs1&>v`*O|?I2J&$?gbh z<2KksatXT>I01ojiHjjP0kL-SF}zst0Fr=E5-xmbACyb}83{AIsKlxasg=sw?dSt9 z=K>II6GYBK_yDbZ$(01V3{<|XG61_QyMvG61=|DcVV^IP*91(fz00|NuJMSoiY>>^NoB>{2K&2~P97bW)* zVFfA!P?m09Hxy=g5rnP+^I_kSQWd4SootXgz4n2CI9kl-a#e-Ow5*~2T3tq{n09(lj@gaKr zi-SWO9RGS?-(lB5T8kOAbrmlH&p z8KCZi%)Q-wk&7^Yl`h2pAoJOfj6gO&4`lw!I|%=GH-pB9S`U^>ztpxwMZ;04Uq(A1r78%pdy^ zd`Md)Yo?U|!;2ZvtkA&>)(1}Juq}o-{0Ht2g8f%50{7pJRUnt~RyOl7yb!_RKLs@Z zfz3y4-x`4WJfJoGu+}ZS9{67Zs|P?{Wp{*}CkYAX&%$7LfLgi+5O;iR0<`=M)+|0+|)9Z1;v-`twhZCTf^60*G+~Ev}<-=W7i6BYVmI5V|elG267Pq8e9bz0r9^6flsqa7yKd>b)UJHV4 z0OdCghz&0r_!wTa+yJEma4`-tEB-Jj2w6eryPyurfXzp3uipSSV=>0dz^T6$VjHL> zvTHfmKh+@H#E@)5v>HH>$&<#P=LV@|1i`5dEWiP-nGoYcNP0l+BYpuUmu^9i?pr?H zH~9q{L304Et(Qt19U*I%Ak)z$MvjfYz!PXnj*Y*-GiZ_^5zrKxfMeq?@EjUDc-zQp zZg7S0n#GZS+of)27XJ0%!^im73xfiP19ZY)@*xlA6Q0cA5oFI!4##fr<|4;V#tooT zeLyK6fMSid`59n|Q$ZruIosg6IKw}XgA9!?kf=10>s$@ZS z!GQe(Dvu-(Q)><$-M>JG?0{k%e1yTx7p?r@R3_!oD|%=tINqD<_!wTuT?3^u@QrEB z)iR7Fpp)>Gbc7jRuwG+gcnQAKuJwPZl<@(NUeNl~P8St}ZfD5NLf|_=Y&@EGgPa4| zy;Y(TP$Ki<*9K7OUSjLheHOG-0yLd{`h_cKrIV{i^KQ`mFhhv|T=K=~zyJTg*7oS$ z3~B_t*bCMSJ{?{haURfd&{cTd=l)LvuQBf~Q3-&A4d@b2kM0`q+877WXw(_-c~c(U ztZx}4z(Xq{prI9yXP|B`>rIGQ=^Ie>3$32d!0rS43Ccqr(Az&>9J7R0*lTsc750mx ze?e27A3UtvLDw3VlzDXbgYK9FO&sU+@6vHnLiUr5_BvnsQ0_g!2{wNP#}WGzaeL;f;|F0Rn@cmC%?u| zevMBcYnSnWy#-3%kCnmRT2jr&@WLK!^2;?046uo~5@C;C-W96C3@?-+a-g<#^X?Kx zaGy1DH>mCPnLlzfXlp@Ebh#TyMGu%Cw|fSJ-aH4= zA8!U-s_~gWZZl|q1Gtoo`2Z?Mr9bn>?FQ|BNaN1~uS|f*{rJo;Xb)OE1RnMToz?=L zUx-l&0M%0lpt=dvE`sHL==>h2KEWFv)41W`aajo*9#g77``<2sViF@fW~c}=yby-S zA%#a8e_l6e&JW~bkgxcoL3{i^gST8q9Q({4*$wi~Xa2}$kY7Qe71<35jmTzDXnf|6 z>xP6@Tr(uJBDx`=8PN<0&A4VzID>+R2c#Gh_=5Z>;lTi@t8s=$_Yt2?4~1Y*kVNon z7ToaY72P8SI$!=Lzh=b=a7i7Z0ZAz@@?$~k#!8iZy1Dr^uJLP}2j$K#&~jLf5)}tf zV1pV05%HkuwJFdIEj}s=KHY~sK)Do@xnFpvFf%m&_+KgvX|Xj3&?pNUHCN)d31k# zv7Hkfy`TZ9FACu3-CDuN@FL&>D0)E&Cjor3C+Lihf;jkq0%$;LtrF;dChY1wn)iVw z;2BCmSBt$cUI8w~*L(E3s2F>6&Vg)#>h*z~*`ole?F>CS_dr7_M8ycSCg|Ps|NmY1 zxA~|T@NfI!!oST$#n7SQIV1lzuzVlL_!m(wptBi5RE+tz-SFrJi#aIWe{t9eB>clc z={IN$2DDGS#0`|u13*pFI1ORwek#y?oRBfA7YD;Zu~{PR(tQGSj5t4N6zbdy?v?*R zV_V-Hlzx<60tGZUnFsSYU1+4*MtPeD)7NjW5@Zv1G3Xj(Rr9z-qfdZ(GuUiMYSgA%u0d_&{b&#k8 zIGuosdGyx$nKM}S+k>uC25q_TzU9$bYXEkzPiLxyZ}Ni|^Vq@e29<-i<-qQqQ^v>e z!W`_Xm!Q!y_^uF8K{#JQnBj#KMA8sEkA1row3MM;6|6S_r1$q(CWewvH0||fKE(hNQ0k8 zg4o~h!U);DFX*rbvMJw(5wx-2;{bREeWVNH5zuD*BQQD8^(!7HU~*?ba%W(2pw0ds z7hrOrUH=YOU~-`IKINX8BferxhcmR_Fodn?U1SSVMF2LgjOb&EjfWsS@ z9B4bg#|M}kXkWj>7tponjG*emLNI zP%~Kj2k5u}h-og|Z@>l#I>LGnVdi?LGoNLg4%h z%?+R<1a3eh8ghidRx@S>{%wanx?_<}5J<&xf&louAD>Pa6^UTbfqc*mwkFo@1P2Y&>Xdm?QEu|6W;Ph8GrC)p<78MKFN2aPe~F@`0`{MmFUo%W2Tu z-2aj&a4!v1PdFhQQ9ldZgmwTq;`S+Qj_|SG4r)ZMttU~~zqYPckvQ1nuwzEoQo1V(8M{qXHVs1RY7Z^3VVO z|4Ttf4>N;;SoA1JZ!a$&NZ(43KG3F5m+q6zf0@CjgiHj@Z-ADkdvv#hx(FWNGYx*Y zc25Hh-nw+p0iUbp+Ip!p8swF*&-?Nq^UE`MCLj3h#4o^O z!LNU_ToJ@{v0&lXzfmsAuYamsfM5SmIrslVuFQw6uhv|C&E^PBXRw$6^|1|HTi@1c zJ2wAhDP`?u=>{K&&Q!|Azn#VVH4FbX7RlBF6$REuYjZsQAM~_7TXPlU9$v@pHqa*1 z&UR4hb!^xN>hdy_ggG|=Fxo}lp7*ELD!h}sDQi)y1g_2R0V;0a1NlW z1TB0($KrLmsAz!B%u{&rMw5Zzb(u#m?_^L}op*wX;dO>*cN-|2!RCd4HV=c2D+M2r z^ci}nFZ6u5&!7<`&@qNSDhXh#K~Y4Uy-zlPws67{5hUe#pyf1Bv&EzNO$MmL9Nygm zp6~JP4UjnQq7nf*)5Etn0@QI103BclD%C-KY7dY*92|FoMlL~T$b)E~&JYy?P~Ql` ziBVB_aTIjHXY-K^(27t`NDX``AG}a2<7MV?#Pl7gzX!T9+C?P+T**RiyaW3iw0OY> zbk79n%=*v#f-x!@FZe(;ZSxTeSnm(ip2mJ&DQF9?2kgAk&bgq>?9u&+U$e9ToMQMj zYZH9BKYAwLaM;fHLY)CzK7p#;6mf9*q?*si@Z!KRP|@(xgq48-UMPX8T@6WLh8K$= zlH#B}4z1t7`SOA+Snta`(D=_WCWe>4SQr?Ze>3s-yk!AZx!`3wI{uE=V?G}P=*TRUQYDaB0EjJ7D&_)O0DBFz z-Kc*hsAT`~vX2FHcGO|;X^H1v{M-T&tzZH5cmy_rq7Hi6>Sum|ol`)&0QbU9UG+)+ z;d$^mlTT-@hiBt|P_wOA$+Op;-_!ay=;YO-;FDL`|8p~VXg>f=RDx8z<^b*GX)<7D z=;gWX(djDD%j5e6RGTF~^gQ^4$)__lz_alWNM*6IXRnJ2zo+#Pgkih>ferJ4Mh<8v z{+So12B0Rz3y*GB3D5yV;5F3Km_gg0-}1NgGJ`$BW_*cX&*k0^pY9tTov{wREZ}ol zeY>x^^m_g2bXDm7<3{xg`l?xNW@#lv-z+B=)5CV(8^#v$6iks$4)NDiK$MYQ##okJDoTjJDmg| zr>8oJICgsRcs3uBXg<#7+xm^a1=K#{*LzwOS{lr+f4NK$oM0V$BUyUASbLrRzZP=r zzPSr@DB(`f01@~;Mn~p@zP%umm>ii;I(9~}I5J;!?DXPjJ`S>t$Fb8(z_C-{#!33SzPsk7H*P z*ksV9^8EU5_}f66LiqJByY^PHIQDw7g6=4D?2TkD(*~VV+Zik1+MCJl(pk&m*nQun zb1$eY>vUys?X6^V?S9%B%F`Lj@mkrnH<7I~RG`zB$FciLC+N7W*PXo}rHon#z4y;yvD9R#|;(#^*~KIQ24WdH?fw=WCG-`&0(j-6g2-M%0>iB1WZ z&IA^ZPFD?&ZdZ-Y01lVV44!UR0iW(%hnJuf3o@hElbv7xvSV)`qhoI*n{Tg^PMN7I zI1X9BA<*l{1PWZ&PLTgWAsZy(*cl|@*y$zX*cqkZ*cqha*cqkq+SsvE3Mt~59Xo?K z96O_U96N&qTsyr$5ijA`871S|>80S<>80Y@>80V=$>7nw6|}s=w>N;rqubTM^Zzl& z=7TK!8c+E(Zuwe&*3R#3hHLDiq8g}?%D=9-BrPHC+Juw z(7{kX-L9ZQ9n{SS9e?7Y0;*G7R1#nXeP@kIfKO+R3h4N22hZ+vpu43(2k9AfhNx(O z7Q=$ZJSVLJ7b~DF3N0xh$B$*{fR1$qXLnHB^6ZO99oX?y;9{3wqqKluqc*{#cPS`< zL3`UFo8Z9bRDmi_0npf;1ZV^x0d(poc=&rGq=vi+>O}|ehkxVOKUU5MI^>guU;h|? z8|cU!et|}iPeE00f$=5CG47xW)8R$9F1Wy8WuL{z0BTl*Ujo-C3jEOUK-VhZ7@K8DE)XeAupz#7w_a72mHZP`r1fP7v23Gf(U%(%<&iXTd1V4Bf zNYDqgk}U>w(TaO(nHYU#EUpx z(9tEJIC3$Bv7)pX7+&+gaE4218iKvdt2qO-ljAhM#>E%gK>q6u0qrI|{bD6}iwmep z(hT+ksLjxQ`o$*$1_pwE|GMFq~1_npa9tQ@O?qiVA z@8dck1vQXCy#$Z$J&+Yc-CH1|C(TC+V8;c4+A|uC;F1$`h^C4M$P&V_8 zLytiNEj(!z5N3G6fK?f6kIN+yuz}WTpio3v!t(O?UM2?6`F}!?u{&f-Ji41fITN&$ zbLBMDgFf|2LHC7$+p(aQihQZ83+RMTEDOM1nk@uvjXMq+WCyL;LA5<{J!EJa6g=Sd z!2+Q1GzD0oIBa8lQT7cSE}-$9&Aec5l%(=8yx`vp3m5Q;@i_QcIB0yQh+mlD#oIk- zDnPR?1|HqJA**2imw?YnIsKwk2b5t>zj*uS|Nn;Fpi^QPAe&%%KywA%r(d{C2hB;G z{y!PCipuz;1OK*fEeH5rK7x7^+>o_MFAQ`*aF2P6c8kF*ZwrvPHSZrowWPqB- z0~+%0j#04y&w?u;-K-AwKG^@@q7h|$tL!Vn|2z=?r-1yw2Ry9_+Mx)ZP(bxRAISf^ z(NuUe?*^S`%1{alqW!Ua3@=V$DCs`^B6J$ayWptj7jS?aRSfc~K4=_K0dxo#DEGbK zTMJ&h1v2ZjFzEay46{JWKpTE0gKYKah8%bW>TQ9FaR-m?6QH`l^LN{z!45E55QF+WWE`k>R+^dhR63|E^vIe zB=Ir4klzJM%>|HR9C;CN6OS;%i@!V3RDkxVz{WGrzgRaDG@cm)>SYN?gNiDH&-?rXG(24#o zDxll-z+>KrKnC%A=8s{mf~a!=RZW5}Dn2h9KY`Lzj0)84VDE$X?<3j+3Lf3B5ar>= z7j>V&;Q%TRcXNWnp(c@!;e|NVm*CxjpjDILC1J?pNTuAu3@<+HfCL7rGLP1`;Ncr1 z0kDDEiJ9|1;KT8sAPs8m~;g?9qMBC-5=65CZ$|r6ziBwTera;ljU1kk{`61c^c z#-Ha0T9Dw;S=;Z?TiXvlLQv3k`e%MY-`O7BvGt%dE8x)^I^VPV+>76!lBhR!{%3vx z*K&US8^sR%daQC2_!z2~N=!fV3zX(N@@t&@?7}bLn(o4{aqTm|KyAD$zs3z0evRj! zUHBs}fQTC);=yPB$P=$Yi=6Ok;@3F%!qp6Pn4ZQ9M}CbXFDxLO2afz2hhJzzI5!;m zH4eRygK#c@))auub>{(G2$cLjx~kBZ8R(?XB{01deyJCGafK8PVM zDh41^_(3iJc?{y$92Jchy-?jv;8|k-A8T!-WG)T7nDW89T&KZL74=S#14Wy83PKi z2zFH0LlPY*X@Wvo&=uqnXo3W#0Db{)aEd((PH3PM4?0X!5VSAJkv|3$lRhdMFCxHB zC<*+`FF<+xaYGDaft+sc!mj}?Q8Zu$j0UX8(SQ^}{2Gu_iC+U!N`WRPK?Ro!=n~rm z(8U^{qSmv!Si-ZrTEVxwSOavg>;cd2$KdWMxcvobpMzS85 z{B+;)?EVNYqrq!+e!jT*8eTq&F@wwJ>rs3RFN!vSi(r0c(7}d~O<$nF#M>;w3@^eU za-W&t#q;SGlMu$7Zv+?56F|mjLzJEXP4`)YH>ZG$=NJxQh8O&sm>6EJ1IaYk2QZXM zcr@2XFqDE81x@7y)qfkA7+&@>f%hGFgHB3!=I}V~3hIbb8aN!RL zXw5m``HmNk6G8R;WY9oPH~2_LkJd}za(W7g^qt_r?|LhZKQ9>MvS^OZW{{DfQoi9c zzkqKGzs85p`~s;R{2DKzdmKOWM?3(@_k8A$ILIFjHVZQQ=mI@aoIm>ZXa2ZPpZVhs zf94k~1x+8if@c3*LDPJtH$L;nz5dJ}_vkafU@oZWOa;v$=7Lgf>IKjuAkdaO(228Y zEU!TqUEg%%*LdL3?OO1eUm$nJXMVxdC7<~PV;6ubK2UB2?Fa{H0c}gGV0q2MuW{9p zUjuZ2e8feMZr=(}(cI1zE2_isqfVmq$zS{Cy>N9`Dsn7fo$3OGOoc_!o1M-V6NX~W3 zaTgU(ha0q$X3~El21q{7@Bp1?>;h`dCHVBZE`SXKK?aOK%X~q@f1ov6peuhodVLQZ zcTsTw%?N--{6T|Cpn)P#ix4#E4_Z|Lni)`dQ7{9vdO!mb-7fqZQ@~9G7k&*`lF(>T z0Yxe(Pl5srlqW%n2$Ty!SqXBz4I(GPGa(K&7xiASlH-fe0@SSb%{- z%10#wL?I27L2iC`u|f zxB=vPM-G0CQ=mcTC{%k?K*tZh=;{Ce9~A$f7zN)5 z4k~_kAa3MFTJH>MBSX$$?p+Z9I)I?@4QNQprF$#Lfu7wTLCc4HyMKJ*7uX7_?ZD%R zH(gu5m1^>9ocqKd$9tYtnBfz@&Oy*65uf>=9Y_O>Q}C2>z1YUZ!0@tz1-6Gp{29Ci z5BVzu$~>Z>d<-u(tO1wc2`r#)J)#7c{4d1tVhTjg1!M+jSRORveBmkF7~UFi34Shw zkKsioM5!dG8Eriu)LFX$rS3^qhYG?_5nOT_Og&s&6bfR1u zf1W=m!McM=aL@z~QV9+!nq23A&W8t;;1fJSN1ugGcwsaLUV_hKW?%pp(4brgZk>a& zA*iSUHM19h#^0uNgL;Og3sC2CJ-S;##W%R5`@}E6@QGj0wd1u4Xu^f#Gk+v&kpuX; zbJq@#2oFdk0V>kd4ZegKGQsKr@*Hd=$%P-fW&~bpw}Lj#e&UZbHRlyz0F|zwA`D#1 zB!I>kK~+ouBLl-H{y0-rUICC#mZ&H|WY&NSm^A*VZ!VxJ3N#DIuW`%;WC$qrzKGQW ztx*?j1*I6!y7IkRAijX_1pe^bpZNtsr?~KIeEiHWV8%y<`4!jOtE1u;uzg9ZOXBYm6)D94t3#ymgK!w4X&o2CNpFzYQ zP?h8O?HFSTn+w0jiP!8d{2J%^HGY71M?|>sIDR|E1eQ7gmO2Kh^uVtD?8+Z=23|V3 z^2Zzn<)Rps3{d0o4~QM2k^o|Vg%#%>y}a{&3NgUT^ImriP`T~l)9ZQx)CmDqdpkb! zM_%yg_1yp~oFGLAsH?;;n0w$ee0$mRC<1>Hc2Sm88N zBOu}rNa+no2!m{{eejt-;wwnzD2Vt9k_Ij9DSh)|{X}pD23d090xI%A3CM+C1Cp#< z_%&b&O`}HzlmuP)HCj|ai4s&yf>P;g6OiqorC`0Tpj03jqGI9G>pH=uvqZ(f2XsNI zi;4zhc<>XyV2O&t3+`^PopZp=DR89;%9NlY5mdN&c1J6Cb{A`Sc2^rX@@o`-@a%pJ znn8gyPGRE*5gb094icdCIiOx<7t)dVE)XnQvq`SkjLBH$XRn_~eQPgwmOv`&)0q41hGL&DIw=(rbErx4j!X)&4+Bf z{md`mz|rkm4(=N{fKu&Y$N%8e4D!151O6U=(DCp5`mgxg8bP)@@(YxLCY(wj-RaV1 zkS#eXCawSLjQQn3RVV{^w}OU8H^Tj|zk%FeV*i;x;=AMjo?21Xa~ln^NKfeJ{^?q~;aqI2ZesD1#doiBiD=L4?%8o?V}`8A>!xbkZx zPjKbe$Zmk9OQe}SNTUrro(US$1#j9Y@aVn;UK9%MFY#;q_U!%uy2f|eJ$Oy|_$#== zUE&K`|GgAk;r274c9~Xu7h-s!43R5lMCvldBaE3-0SHBG6cI_aCr3WIzUN2PtBKED(1FRlD9C@CicrwP}z+ zPahQ^WDqp5_+r}>c-;%S-w1TwFnIjC^(16*DR`TKVhgCs^#P3yH$!V# z4}RAh-Qd0wq&oyX5x+DUWCv)9544+G?^soEDX4SpqGH0YcdW{-)Fq8S4>V#U;G$vy z>e=ZXtTHUs2MKb3PZ6NB89y77PpwuO+a_^!*042tfg* z0h%)IjRCD*iWY!$pC5y!5h3k!@Sf7{7I3W$X|hH}@c49Jgw!seS`4(|095ukaQOB* zukbwX3~CpG#_>IPK7(57pZNs>IQTW5LR#GX5f7nF?2n)M<32kccLufW861y0gMyI( zR7X4V3udnYwY))%*Wx+g9s#Hi0P7++@@w4q%pY+JBn@d1SI_Y1^#XMV1dEq^cI6j@ zw1Km?fK))*z|lKE?BqRQ*#ltq5!hXJu%%iay{s0Wgh1IAGOg}|m{y0^yqzv89-h6< z9k5CkUY&wAkrN@iA>ukAyCvc#LU&7ag66qBKsO+L=8u~QY7T&s4CiNl zL4gghU2G1Z*>(6_=8LsA!66FT&-3a7IAT_NfX=^K0E!sM4jSbBHtRkKF}%=3l7u#* zn=1quYR)xRh%nTgfJ`L9CZtizUj>iuji6)&I*6+KoJaSq7d-zt7%ZIy_*?&iVy~MW z)U*d(1`N8+Oz3rfW0%*FjvmG>z{o<`U=(tdb zByadP5JqxVGj0e^3Wg$*0$K2DpPc6=d%Vy`%sCe|F&)fVo1zcZNrI zFUY6HmmGJ34i)xDKJ3wY(&M;m2Z-m|ebJ@UcLKlbRB->l`=;^#&d>{;dqF&pPS+Qp z1Lj||GcfpcE&-2Y86WWJT%!V7a{}toff~x7-6bkze2`8cC?H+=!=HF`x}JE=13r)5 zryIOZs(UVIN!31(ot;}jPIc*i=hFSG`4>y6P`6E^OLs{li%WM+Bgacn0%`umR4U59 z-Nw;{e|w1|lMDa$8b_9wY@k#3eleDc@^7=@aN*xp!oldmzpaLY>E#;+28Qld@EYM> z-wx0{&!D}J-Qa$kZ})Lf*jaR6hxDC6MZQOOE2!HK64&SiEtkEf#lX-F4g-%~-;VAd z{|`Zo^X)zdG3~eq#59l=3p@t(q8Q}U-3y9km+lV`;xCk_ITG5 zF5RI$F5SKzF4pHtd3?H;f((Bd!U{ST*~R*P374z&y%JVe>-(jwpt6&}#rir(>>5by zdMVTY11{F*K?3JM0_Q;j#+RCZF!4`0)EPR1zZJZO92#B6`PU!zNj~7%eT;woVNjc1 z1vH5!;9|hyk$l0i8zlXiUqHu*U;m9q@`=y<0wRW>#ZQKytGs-SSc*jW^-mP>^Xp$J z66e>yQ6%Kj{rB zx>q1|ryaY$6*D__e|NP0Tf$-euY{%h{%ZkO>#rpoj@|cMtiP2qJ9gji1m{^->$4?X zF4iEQbw30tx>~~F+WpAI`dTToYxiTH?zy0_a_m0JzrGce5`B^nfV>7~e|F{bsvVLR*=t~_yu&NK&w+jq*y>61uc!2cUHI281)1v7>j1ip+cWu!Pxn%gk)F&~Ud)9mGzZ;~3t1-#4pi_; zQlD<{h0Bio>yLRP-}hv`15KhH$rrkhfkb_h4}eOo6rb*1Q2z!rlIg;~ek~~Df`;Dt z*KdU~LE|GgJ(G`mB%k~2#2?AR0U~`kSU{8rCy0#UWckb=1KL>Rx&Sm#zvMH2%uVpP zK4?y0&1(tJ(EJ*H4bc6vr7QR~u6Z1H1-Df}F~_0=B7KxtK#>lb(iL>Q@tHs70f_6O z0G=bf16}Qx`T#sW;oJJ3zXcR3{Cd}_*!WvO%`$$ydm!c^P}h-Pz?;Xj`}~WuT;OTl zXwV96@KTP?`~uuB*m=OBp)2_HLG$6hYswTsOA}>0AlGL5^!nZa%>#ILUw^UY>;L~R z_c4I7G{63*G8xdA&H`|5{>&eF9Xf&&x&q{=1)#GXq(BOmG@oGl%pVE51sJpj(ib$r z;kpFLbWouOvH{d<(f~~ucy?d^1fKR)cp>%b|Nqzi{Cdx-m`XfA{THSZN008kpjryN zIRw-uXoIW(cjocvKL43tAR5$-2?phLZgA&X;e{$_Fts=I21xPCD5>dEE<%+N}<`8aboQuTSl z!`k%)f6q_QA==G9|CiK5Jq7X~%vY}6=RmE67?lj)Zm|DCR1!S9uT#@+k#(Sj!yiDq zZ%P|L17)Ck8+0iis2&IHh61&e!DDNnpz99Z0CnaI&;S@Hd2RX3FA%!}G(5WpGy;17 zDi4i%Ehf;Y$Q%_=v&w;g8)y=(7~EUh0UE4W0UE5B0UE66fDTc_qudz|ZXbhsP0;hK zzylL6#Lj`6<)HP2!B4@>auHiTh8OFnfScu@h9anK9*=T}mC$n`h8Ml)Dm=QUgBqHk zok^0-)f@~p!l3hsYj}@2c`)(|F!KvKX}sp<4?l3s$%6sJ0VUuHMbP5I^N{tOpruSN z)#_kNBEkI!1JJM=q!Yof@zJCE=8M#`a0f4X0(Nk+4Ijgcf0IED1`XzS8+6Vqs5uYQ3U1Cr&I1hqg`WdBszIYs2K=DqE1E7U3j7+s zT=+E(fp%!_U*r0yK*LO75Y!RL3NpM}7$@rhsK zCurcJ_Y~MApap-Y9)excZOO;*LJe#oC|w(XwuplQ&H<4dK?|T;9t$zN_&)*UV02}m zBpl$;4es=TE`s&p*E?P%R0^85cMbqmKy0O;(T0f6{DRd!9^IEe^GEIm&1iz_9>L-O z(CHDN!B|jif~MX+^9ybU4M)95kOSpg@HLiOWkJmIFL-M}Wgn$ZiLP1qg#22R<(YS{{Lp38{h)z|@@t2M4HJ+8qxbfT^(nt$zgj6Dgy?hB-l* z!|9n2_`(Cw(Fh9hFJJdFF*H}pFqMGh!cgVT_k&iaf(KI|8#r%3kC^9g0o_9eDw}+= zKwZOr(6-SRAEKEVU|s4?@KN;O{ifa)9{esRJUaWq1z-317aroEz_|Q>`V4T@2G-ni zpj7C^`DoaE&Jf2Pez6y1WcT?OSF1poo4-X3G|$_8{)K8Kgf9l>Lv9iWl?R8B!Ydhc zzBV`+zX&@452wlZ!O14X9JK$x50oB|!U;C&1u71M9tttMIE${L^)~<11JGgDj&?@S zx@{ki?&+W|tw-ynQaR9uGH~MP68T4;!C+k)Z-Q^0P$bSUY$vI7*@9 z(cKQ}8GyzYxFKieUuZc{D$#nogtz%OW9f>H`5-;7*`aztQSfsEbOrQ_XF?1<-G^Ur z>;**|QlNkm5)>naPd6fb%#Opur}!Q?d`!$h_h0tn2_K^eLJTj~qN_lv-?YK?8$Y;y zE7~6e&MN_?p!?r@Kz;<3 z37}HLAo?(v39sPzw;e*1qP)9a^E14x1eKf6;DnT);PwKf{sXz`#q*E#vD zLrHGJJxmN9y`m|QQZm&9Me@%OxzgLf`1%JXbME^s|m=8uMf!^4~!~jXZ3f+f1x^H%$@aPqFxh2HlxC4AspW`Ob zX>*`qL{MWATJIy=@6o*zJPZap)$D&s=8I3spe?fCRdJx3F|{vvSYIy|2aRQFpL+2$ ziJ9TW1!NT`Jhe}NHg;=zH2!2bHOsnO0dytCL67g>eY6kxFdy`RjEN)p$^%0LG{4*# zqap#?n*q9153~=*p<57iV%0`)hU>oR0Xl#UbY))ar4k#IDc2NN>4O4jGAOS8CU%<|n0d16koN@@tDG&_K&xrF5V-JFJ9%uq{Rya5X zM}ul5@R461+rc$IV`&iV)VC5Y&{7{s(AjS4@Uz{(VyyrE|9>qEJLnu#F`f7iURw#f z%q69ag8}&_7my8yVd*8@5j5Q0{3gJo`oHoJ8+ji zAH$2#c1RY3EaUZPJ`w<0~)x00n9$_c}tEI2c+El-hq|W-3tyl@#|IK+)wb;MslMr`uTq)NH%M4l1Kg zzxXnPgW+|6OE-$-es%_i*VZoGXTeF$)%ZX+Xfx=G8!4b7_XGHl2hixHOSgvrXd}A= z*u*ZdiRWH06>)%9yA*)W=4^p%wFR%HSW(Hr06wLx0KDRS8$=FtNSVQlJ>Nl-!XYY# zAot3bb1;B}4M8qd`UdK`oPKd?I>=Wg3h=>2&2RtzgHn5p3Z&SN2NnFWhe0{b1Z0Y3 zIR`^`h>8iwkiTECtL=_asW3VKt~H?Ap*aLpp9_HMPYF=YQvkIb6QD<}fG1(0^(gpI zP*A0WeAbG>i+N&@%^RQ<%r4#Tph6@$oC8$tc({O$Jnalo32_DG9#!yF)BG*6pgF2~ z8OG8qP(4)uQVCwL1gfA4KtA#SO{BK329*l@EuTSU7wF0s(AoQ-Iw`=Vo6V!UA2c`) ztCJi+W`OFX5b(*TYXm{@eeOlePf$R-1l5||e61%-Y`}>Nb|Ir)<4^F(u=0&R!3V>N zH~xgy{XZec!tMr*sJ`af4O#{Qs{3y`@~^+qe3-fU@gI-m(;ocmPl1-l2fdJe11iB^ zfVxMX-99QIU@yR2+6fxk0RL8t9RfKmWxQ!yyq101{E1UgGpKx_v`aI?k2r87mv0CZY|2Dtrl zI);M*Wc26n|Np-{#=yYfNKSl!NBCcJffn8}fa2pI|N0vq-KStNa@d1^{RvQvWW4Bp z1&a~zqOnMj3yr^_`XWXp0+i$f@Vi_v22`4y21n9$kQXL^);)KheIfA*6i=W^2Q&!) z+Sv+f3}7rR1LrVo`O5t#e4%RP&WJfZ}!6iJ97_Iq2mvT__IV{(e5Lpf~^I$|N z=-3fZlF7@+6coq@=$1j)I8Dv;fjt z#=5S|AvoMI#4*&P`Ar76GxQJ~Y~U*7=8N^4!NCR^&VAzv4z{&Qd<-ul&hFPcZIJ2^ll(2MpkxU>|GY%QrLzWf6;lZ4B%~4*1J~{|pzfA0 zs0DEv+;n@P2ud)a@NQOp1w)BBsC{@c7?eCptU)G#8(RUOU7{Ag-Dg3)F7P(G6409S z^Prkr;eU7qxT_T`#mDd>t^(54^69QoNdSc(Xo&#mgc@+s*A0y?L_z?yPvGm(#6Szo zMLzRKHi9PWKJyDUeqdx^0Nt|J2s(-aLjqhtgYq-@JQV}ba7A|~XdwH=^gA33kX{%l zH-gr2bk?XiyqGZS|NrhEpdbTf#KzsAp(;=x2{d~K+Usk&Jb;g(R0p)Up;vVBaUq88 zb1!7(fo^NM2AcW;Il`k?bQVN{c^(tPYu@9{AW_gY6#N>;`1L`9o|8cG=Rq1?FfuSW z@=rhTB7G_N%nsOz8WX@OUL1sqf|S9`J^y0$Qc%fw`o-ga|Nn!BazO{mJAg)VKqrtJ zpdYB>(|soxbX^!^Dq<$6-{#T%)3Y;M!n3pZg-7p3(E2Y|e$C(+uKb$O9ceE7dC@W8 zEe{GHc5;L(fAkYq{^;8t*7r(eJi0p}s{>D#2y{ELID#(sapZ99bQX9m;nUj!&N|?9 zI0bwn!i%^`|NnP8hZw&F4WlN5cNa$Icywkbv>qt+11+2r4ehaTR^?cr&PD4hqoE{DR&!pq=FbFYkcn7BwMP-19dWfu<*AwfsWqR|6T^#?xAzwvm?LGnb%w(>L7?X4O*Mm;s^52ftlZbe&*LY z@R>jU2WZodBY)(P7Yn~Kfi|SZfHX#ew(dArfaF~GBU!b$_(4*F&IK>3p{hW8bDe8I z8$@_{pt9a2FF^}Yn}0Bt)PeW+#2kO2^A(i-Kr6yn@17N6;MYG`p2V;Jz1umYOs@F{ zQ>h#%C7(p?8+Z`7_<)P^)!&|Bap0j4M_HMXLbol_6%s}(u=QOU~c6X zbglrog0+nk=Em0oP;D+CNl?_e^6Nix;n(m{2>_3ACx9j?3qbpcK#^4jTH)?o0SeY5 zubKJ754iH{-vXt7up~Dq83co!a2d3M2NY+gKJ!OFfitZZc>J(!(0G zzNi^gT72dg>;}z3e&!dP4cb}xnO|@+Xx%kMx^6h0V=S%&v%0M**Mp9I zuB`%SX!s`d76woc65PaVJz2sJs;nWWti3pS3)Hc1RskD(+M{WpXj07tEc7a0s#hp)}qDtpL8h@U%4uAB4PG`_frN>_!K@taT7VdNg z-BWt(#h;G|^(J8T4xjlWkH2{G5tMFAK$r8?fL4ToE(&u2jVC~Y8R9tjeGnk`aX{Sn znLn}#;ojDL`8Kl4X4gVM$eHK>|SXPItifz|^RQqZ6UsRWt! zA_VHr*G%2aoz4o~&LXV`Dio1afy{fM2UXSStOA+C0M*1WHrUOe^nu)d1T}^nA!CIB z&6fW?yI=Zte*g^_ek{oVH48wKp~kmCtAaqy4wvpV;DQq|{{-q6fNCS3?z7!I^L)FH zfot9F>!8ziEkMWd8i0Bd8r_gy1-SEI$-uy1eY}+0jwL#$a7HAk7>~;_Vc0Xv;Mxpy)_fP)yE-C@tw>*+hbRPn{x0K5^&)Fon6Ys0@||EeHgZA5_CXr@&$+q2_DQLDiI#ZCp?&aR3ct<{$gTi zJ8I)U?~3!=*cz$I<#wjb^t$k4ty7fTQ*48d*o{ zW2F+-r%FY-Tc8CDq$UAhCFRlW8~_@|(RS%9-~e$t19&{Ty}^eIgQD7_(@_G%hwANg z6nL!%WxI4A^XY~d;;WIbvp=v+zs-FOSd&o?2B7dnEc+#I`KI(C0>>HgGx6Ed(?FJ9u% z_!2zXVA1%Jf#E+xi9z#E?$=_Czro{d%8kFljb`b_-{A2#(5{|G$AlPOyv+s8y}xt> z?V5{V0PTIKQ3>evTKOX72B;YYIgU++k%6I80yKbV;L=&Z;?jN8_&{elPxrM>caHAU zp!}uKnJ@4nP!qJQfxqP`0|Ud0Bceb4dvu4W7=SM9IsO`SUY5IrPxk@vATMaRtMNBz zM3BE9R7OEgb8CDJ_CQGEYp@4=ntyZiw}LA4UN^?ha)p`v>%VFr^6b8F@rO(IiB5Nw zPIrx7S4N-YV?NA>JUYV-X8LrxTWBA;_`{KZ{XtM}=sxbre8QvC-{EyUvJpO=?gkfs zFdyi2SMf+b=E-~jbYz=H_wm=3(9jZqhE_Wyv`U3~-55cdW`Ybq_<*U?T>+$=3p4<% z16~>nYGb0@VN`;AhY_gUfMHN}G63)S0k^k3C0?e zK*!!+D)Dc&Vki}Bu3}**73g;4v2@}n<>+=4uyo=9tNnIFh~eeKY=~OrZbt?F^-e6H za*2ugfX56U<^w*=jt0J+%-xO(kSn-+x>5Ns??Ki>Aj%ie>EH_B9xt?@QSeC?^6CER zlbpn1{MM!0i^sG3hfB93k5BifZZ8(!?l->O@eF=Fe8ZFZwkPu~*VdDD z=03?OpjD|yA={;2Fm2#w@J)8-@nrtv+U>{V$$aDgF-PlX5VGrgTj=e4_j9@9Bw!8)kK_`S3fO*I-|iz&`! z^8vnw9BGr80(=M)rFsE}p8z=2K$B=8j*tT`n%_8hbpP~Ce%Z|lK2+!yB-``%r+^mb zw|KEIFhH_Df6F7#wk&WFz~2Izi){YM&EE<-eak0V2z1`QoQq`;OR0oQcRY`aWfVs# zpG&vDfQzLU4}Z%^@M>r;7UORo-Qg0x-T%Ofx}SL@dviE;A9m?><^g3bm(CvWaj`C) zpaWJxM*?^HsHk`(zwlsw<;naCH2=`Y2%eAom^Q(u`Go6x`e-F_22*hA@e!>Ehj*Y_g>z<140ZhW~MVSykrHf z!tQ?L2=aw9<4lmhK=}#cukM4M%r9Ll>Qw5AAzQci$7rI`Y`_lInu@YLCx`QXK<83Ci^=fOL)O80tJt5 zcL|Wypo&ieG6<>S(w!~^|=Zn$1dn z>DkL8Hq$rxv-Tkm=9l0)ts7zs*azJwx?NNhK;d>0WE}GeND<|ed=SJ1WkXO6$Lym5 znu=5LWIo};{1F;TKFJSUTQBkVfx3?qz~vP4zusNJC%KBl^Z#+ri|;{K0(d09=mu8@9-u`w`39CnJaq~ae7lc(f@X2gz9?G7 z&ES#juHei3)r0xP|6|t0JT(tDFoLFSKy^H*?*cFL;t=OmfbN$>)E6jKg-drJkE`*2 zm+mMQ@LYkXgk$$%pJXM^?iViIPCTIdD3h}|T)V$Jg7fAF59W`a%wJqv57gQDCO=FA z$3J+$?kZ^3@6t+8?hNPgWPSsRe^2I5j{lFjT7Rgyhqs4#Kt&0+-YSuJn`S4xK(?Lmp(V+JVl3rb|+*{=IUH>3&x&AKF?^kDQ+DRAsQ z42w&+oMZP9uox&pT^VP3B)`-?c~z_t53A}xZVx%EI@6sXp#@ag`^FAs`O z25|np1{$?zS_w+eApd*;`N#49F-K5w0@4Rd&mPP#L0lK>4>iX@o&*Ob*q{||X2e*g_|7J%}+p;3t@5ls{RZ8<6lj(h%tCrrOM@^Aa8{ne-Yl;i&sKA_uZ?m9OAkmqmr zy890g&+lGr#|I>3-nIzuu9>Rr{$&@(IsmM$q+6-A)ody&@gp^y=7s-0}Z;&=~7= zUIqroURUOs&5xK}dQF%dyRSMP{KwS%h`B@obYWBrXqya}0a^*y{EM-q#xwbdZ?8zx z>s_whOgkDI8X6q=w|O!0uRr(wA&3PLbLl?Czy6%#!I$hV%x4`BKIHiR(6RdjSoy(M z?9A5>zLYrlNWg^~qzbGLF6YR6nScGcgO4O!xKDk52vU66h5M9iCzogQAr?}tQ&hGae=e1~4NIG~oM-k-r5zZItYy z;^5IM)BJi%H?vFk1sDEp&Y+FZCl0<4fcYJq;9g05f4CEr!N5`L(tXSE;A?gl=KC(z zH(mJMZ-S!T@%sa)B{_ax;U$Q$gpL4W6>B#SX z(uIHhHOKFdK#B6IqxD5ce)o$9A8|NxUj~yG4nE@GzSt@3(R`R?)RE^Lhhs=O{yz(j zYs?sTZGFq%p8&cA0+du;AggX=nqM-)b5S9OV|OMf7oil{F_28u4H{4Y71{qVitMxr z-ADhQ1!W#h4p8QC17{v^VSNpytOlJX1obo0?q^(>54&0)apiYE;>vv5)%uJpzxx?*at8Yrl(HSUFFJM# zfePVaXV(97SbPa84Ud6KLvRqjtN^jWH80um2=5=k;xm#BZ+vQlO2Ai){4JmrR-pJy zg~z9BHy5}J1J}6x>(7JhP%lQXmh5L{z_d(ZACQ$qi3$sDBCRIZPlpfkZX#kR?URr?I;Pe2g9YKvRcuS1v z%F(CSq$6ztqIz^^0i_5$)ng#6dh7uu4p8-Y9MmlZl{vn>CT*{`xbkmvW9mNd*ewT+ zb65UtevFR%>ra4cJ{SINmk+*{fVO)ayU&B_$L|k7Rpbs(oe4?_%(q;uZ@BQg-*Dt# z532CafsKJ`0c~+O1S;4MzF>z`lLue1gB7?iA9A%m=*sU78dW<5swiPvz*Q)u(mVyN zM-M*caOA!XCT|>k%)x!ru~W{o`54Qn+egD4)T4kjyRfAhQ2h%^JgCVARQ0l;RK1|Q z@N(%NNCVcf8&qUR^1%8@Gr#}regW0+d%y=q4)?Y5FgWz` zFmUwqFi1?~VffX_!?1e_4+8@uD-$a#D>Ewuus|p{$p{;O2hHyZxODiaD4>lW^KXMJ z?Qq-=Do%X511(&%f4K5*d+5`B(+4!SwFf-2>d3#%iPeUQzvZqJ1A`4q3Fxr+9bb7F zUK|c)Vt5&51}+2tgFC}_B|rx)=vHMyI>Q=2&hRiecK5VCIK#u>$$a+z!|o~$$8KkV z?kFBm9~QJsj``5RA572=iS~KOura(B>?{F_*zUui%}yGSSbbv3z|iXsZd5TJ>b`#P z2U91+7oc7+q*DSqBOlzd0&S#k29>&hp{1@0II7n>c3Xg2S5lz*Sk9GyTa=_@caVU0 zcgxWYPm~!vl&?GTZ_ASKxcmxyJ)WcX3D<5X9v|i7{M$qz9cD-V_1C{Y0)-!FqPhFi z!FTM;AH2I;?t=7Reg`)9@-q-6>v{PF)RfbX{M$qrz~!$G=ma=~A)qB)pl-?q&+eAD zU?X0E^ zx%c<~|3s8K8j#8bT&*CNI|lzxcgCowfNGQsLo8(vXqXgH_N-!t4u}+intq_N#|ktL zlI)_Q0dmai)vn#3jmuu32&w`_RTiieih@PeUr_G%RKDN=iDx+%{%t%=u)qWrQV2O2 z7yfNBAUSZM14`TwIgk!;A;Z7E2V8!Ce+Y_F(CitwAcDp#xCv?ff#3au3rrzcmm@?u zD8WJ6j4s{affpC%17LY*yU~Sz{T#6Aj^7`HjE6@TbfiW5G(4w(ZPh*t_0i==V7{aF zdG1e+mtTOQRMzqG14r%;phD3AElLeWgKIRnAbUf=W$0+?A}KRMrw@@r4N{28Tz&>l zR@!Hw)0pICPEdKP1G>f?RJ?V^AeFfXfBpa89R+Udf#&7FjlCEZ4V1>-X)KLBo(|9? zd#8_zf#d%ZE>OpTir%-{3=F-_ux8(7Y|XyCpb{4}0CNS_*?x^^_VF~nUh3M-2rh11 z`L}sVxbkl+0+qj2pmqU|r}72w?v}5h(ic|r@^8}tm9F3t8Li|66};ZvEoVW>5d|-J zAlik08w(StKm-+_uFOZEgVoG0Kw_Xm()uO8`%C5<);IaxZ-V2%QTwD1XjLn;FqCn; z`~WPjeg5)mkaOiOKL+z1wa>Y5AHMt+Bqn?LsSEc}S8gW}*G@*y=7TIgpdcIdA1Fdb z<4=YP=@Z)O0w>e|C%_31*65;IdIc398L;M>3$(22jsdllcp6`R1~uD|iV*&7TU0<9 zsQD2y^P$cd6%C|*BetT%rUN=Z?$~_*tuR@jPOvaJ1S?D~!3vXih{D9C{q-uxZhNx( zkf1XN`PW|nx2L{8Lg`{aT1|40W;RCW5mbnP3KoQBSljU6D|Sd3E(_^b5b88u0gu-} zv>^2u%{`lsv%o@n7<&=wHHvzNSFlDMuC5^{>OjdCPt+0U5`s)XjeO)thxPe~SqwtU zp@Xm3|DQlgt+28PJj{XOWl*7#fW1($X@B_vRH&ejL8+iLOF&~#3V8d18lVPAj55K# zAm~0k@Ho^pP+CYk6u}yu+RTNmAVY5Ndjt@B*EJy9I!?Sq-zIK zCF=s};CXeoJO)*EpdLO#4%A(gVe;s1`3;p5fXMN0>j5871DYgo|AvZFJP~l7v*0vaq2xEiWn15`yl_ z5OKN7kH9Mk;GM@IXyE_zpc;S@Pq+T(@81Mk6#xm=mudh0|99+lfXrisN`mLHHu*v4 zu?)^a=CLHsV$Ne}AL^`8(YW{n?;Mr~WDd&!GKZxgjiv1Xj_60sC6GBRZrC_72dwSD z3LQrVB}RwW>mB*G(_s=T4M#@=T=)BQyQmltp2bRo_DIse1OLR&W2Iewl*auj4KyO0 z2ARuZ0?lO^zUuiDCm*3cmxK76_*ouk(L~7Spve+1noZe4eU8!X zrcr7~?%OyrUxD^%AR!@xD+~LY?0_1S^-CVC9k%v|IvBwmH0B?aIG>WKD3T!N<}eF$c>0;2PCY`#dNY zKx zXPkl;TKV?cxW8WI$iE#tAx2i;1aoQw%cPhrw0VxbW8%oa{>t}9NPQAW!47IigN6!l zc1S>0gSv5uc^UYu3aBNA)B^=gGcdutNmfS$(=IIDl!JN`qZb0w4H~LPxD>;;ve53A z45;CWZ_Oym^dD+hV`U5k5bR4vut3*JJ_8jlpfaTd zvoGn` z2Ot5Iz9_g4JKXH}e;(p#(9VNHpdf)S%b+l{Kyz`R`8Q}3y_EU~Ix!#DF+p>t@i25O z;9)qugoi<4B@cthY#xS~^@R7srEKJ3=-AD}@O(cHgUb;fh96sb80MTJtPiw*4*U5q zE-DH8K#N|qKY&h$0Ur!=%BTAx~DIYh>u`#cQYQyNR|gARtd`2P{) zu#QX;4u)~u2^xzBZ%_dp41LfQCeGm4eaPeB3$Eq|@=pBQcp$shpeLJbKX~vJdm8g~7yj*_ zt-~jF$p2wrNOMsJ9oyw`@CB=5^CNjoea@g|OFJI?XJ7#9zRJJ;T-w1$OldCMr$Bna zqk7O2WDdS!1`E4(a(gx(W`cMd>bCEqgV$}*gVk-0|Ihh!v+fZYj6nz5sow%Rbpv!z zk&N?8JrEnbQy-Ky5_!;f>X(2|;DAoHJ8GZp^ifGbT5sVb;n6GOvGd1&1_oGtf!MEa z$p^_FuH8pLI}%)aZI~Pn{%3Lo?F-g)Y<|JW-(m_nClAc31RXUGx=E~MFLWq1!J}8k z`Sk`D{_V^j-J-d|px`_JO7YDP_}5?i z{s_FX4z!OScFxTW(B^&6Q8o~TD5tPMm&v&@A43dxqn~J#=AwKv&GF!4)-+e{8{mus z;e#^Ptu&WTX^-Z^Oi&l^78+_U<{WY^4i_9$VeI(-JidhC3aWW^pnLJb$@}Fw=r(-B znPnx2W28Wt5qydijx)=U@}2`y{)3%gwv!7j|Cum>&MyP!KXpj{>jURHP)_6ovwkr0 zw}6hZ_e?$l&V8GpY56@rwr~bzz2*n<(A*~@;L5*EL|_-FigsbX?qYq(h2Q;>3-ehQ z>r*cL?x$Rs@3~mta^ZKsmFA*+G0pMdBTz27=y>ooGfaRf&6WFdnhW@tC|EWs891wd z@(q};>u6)OKU)T~*@x-Wrh566SA z*qa~7!;&1U8~-*Ih+-H1^+#dnpMhFUF5H)#`L~I1^RK@KQ_Te4#{n+*xi29lRFE4^ z^9;Nj+y~kX;I0p8F79o2{0(DCUtfi!dw z4V(y8Pyvf{Ako3Ukk*YJq;$OiZ{2{VaUiJ|bW|j09w))2+eO8}x7Wn&^*UGn?Q9<1 zqFr2|Py;n_Kpg>C69=4Tn;(GM_^$lhWCR=`jT%r<+kM@UfBi*pLI<^JzCQvpyKjNE z6}*NVJp@`VcgwN+x})_CN67g(m%!%_L6m~G6FdTKCjjdN?+-ZDebv?age$-M2}l0* zmtFYR--DV9Z67&)e++g3Sn(kj>jN(Q?g!G8Z>E7-MULDz9S^=>hH#nE9Jz0#L5?qC zg8Fe8=kWLAA&%ki$9wEU-H(p{&!*u?uApO+QlOJIh`jpp|8Ll_Ntqmu-Gz`73j>f2 zPr^R7<|F|=I4Q!Xmj_aaAns3rtxxBMjIX&sI!nDWOb35M3KMxqVFDUD0I^E)K?O;P zC3N)W^?n!r?Z+KK17j}A2M@epPIEl?0MxKL%)jkInv3#55FgY%IRsm{F%atipH6e- z#_6Kg+x-1z|3QbVg4WzSzI^!)bTM#@iUH{GYRnUw(k3iF%fsMwg@@tMH6Dg#H+dKi zUEpE(beHhh66lO3T;od~&2I$wx4EbkID!Y6T(FKZl|e?CI253xOfNoyN0}~s#4*a0 z0ZSSD+e%at@E$*mIldHxG``deIt}(J^e|Y+=+bZ4=u!}f0h-SP9l-?~UE1Nwzn$Bo zo7I*Dlu=LmbhB!+h%f=UvRs0Ujj9d(p;FY zfm-Oyh~X%R(j5$p&>^Mk{M%3QuRpOv{s#j?n(_(oSW}t{_eIdi6Jwf-@&%9vaJ7Om z&U7iwwNn^0&IEPeTxOX2x|s)~`~EV)-1nMk(7EsbS&wekXt)bK2bT*$MQ9nQ?FAic zQUbBNohK?f zyN^0TPJmSck2k@ZV=9p2lmCEs`9OAg7=R|eL9-NPupF}oI@T263mR+M;>f>U*rS`3 zlTn^|ht&HIW$oT2%FyvM;;+@Qu8q|?B^jfV@A(!W0hw~Co$${QdyabOZAsr}%-6m_6ah?|#A+a=J38wRYLj`hp|BJE-giXF*m_ zrULgkl&^xbWSR>%JQG139KnFq!Ip#8!OQ=PVGH4o|6+qQgung6>fr1D2E@UR|Igq{ z6|SvM`1=i@<4ggdjz$3}eZRa29c+STK-h?Hj0#!?gj7}VyayWeEx?lZKm$df+s$Fe zmoI{jH^B#cLFeT|cG*Gl-$YQh1LZ#+5Cc?WwL|kC*nO{I`LFXY*1*pCiyYV@9H30d z1vv(W`MituNf&STINF1 zaT97fj^uFdb_8`8Q_#!X97xxoQ$__|=7M%Cu%MN>pe4l)46yTcTvP%;o5*y*V^FZ8 zx*WT~XLY%#6d=w>+y!g(z|Yos1x?i~;I+h{;U{*FZc*+ZpqK;=KXE&Dp8%y_(7=B4 zLwis;3mV&(5%B0{efwRE!G(XD2qX9!CCJ(7pwB#SX6Lk5KD`<8Oa>0mW_ZiT@()UN8GudIe0Oi1J&|w(&pvFU*P2iI(m|+KIrzziq zjy>Ht_>wtI`EJ_5$INNmH`5$DpjQskGow|3J$(x2estU5-4Z^7dJGCg8DXS$rQAbs|Y&a!~$xw1-Nv}sDN_l zOHR~w8{)ujXrBo@u7Gw&2KdzO4Cv|=@ZeK|PcMr{+635n-JpSJN9cjwF1<2Lj@{QB z5B>)CmSn)IS3q@N^DD-ZB+z*X#^Bo(SR7s-;NK29ulZn_@-@(46KE38k^2(=wi9W} zSJMtYVou|}nC93i;MshDi7qM~|DR67*JmVClGTFN?!V2I$e>4v>K*57510 z5gyG)1Q5r6PvCvP!?6At4@1~X9tOELJPdk|c^J|^5I4328eak*{T&RtHqxW{O#)2|o23aw)uHLlrAaiKs^}@0ppr3?9u#5**_kW20Z5 z`_9PV(YZzibb%Y_yadp_U=bdjH7Wt1yBR%vI%`xMz-NJfk_WASGR@=t{GWeY3)>43 zUWV?TwhJP>3?9tqz$bxsI}5lVP69_g91?U2lMcMP@#uz}$P2pc4RmL?y5_Q9g=%EcZ3U0pTv)pBxXqV|M|crhF4* zjwAG(H%ENuE5Nq>IP$N*05J@-<{y-iLFWzp1epWb{PC0^E_>=aHRs0et8I zSR?pg=Bp6xGLQorCwv?%?$}&&>6^(6AW+!uM{MBIq(E8C`51uuPiipvF{i{4PMXg7F+=%2MHJf zq<}#S7f6tRc6ES*#2acBBxs<=y3sUvIk*tP`-gKhcz1GuZtX*hCGu16N)ANu&V{g} zz4JT`2{}0olu3LLa4&f0d-JXFi+n>sWAS+DvS`&Sr?!RV>PtG z03E&406w-4ygSR4e_Il0A7GZWBe*W$-{u6mNCLF~*5mRkkM5RZpduQi6m&2j50h7S z%QLV@cM$YoK9C$}=^*&fzIRYL5y+u^AUW_!t{%Otnrxr{dvv$_fU4l|RK5Tiy7jpH z3cRisbPo$;(6<|M6EkRs80g4%MA-=L%D7s8aD^QCeiG@RchIam`0_`{{fp4qb{GEj zH<3KYwCAXK#ZM>8NQ$4?%tI}HUNViO`1#E^)Z)jJaU{i0G{firpnA~p@(aju{K%yos3ruL zbK0i}mvo>iGw&zlutF73m8kHWg5<`3+R>dGwkp z{r~hIauh#Ii9G0(eve*Oj{l#KD@YN9A+Rd+*}qT!VGT9Nnf)L$Ad@wq^Kju6Ci4vt z6Wp(W-a^a#03-rx-Md&nbm4b@$ov9)ia)fGc>)|=j*!#(WgMaBmB0=#k%#iZ$M@fc z9B?ZK-M;Ineb$BhuH)r5pt@ex@$wT_?mMoX5}@`GtRnO1mDTz834A^TUrCnIr$UBG9RCAY(vH4HeKCz@I^Z1_>?Lbu#k&+iXDLc^WLmzYW~^LT+xj zfE0N2vhMr~4$d23b=^Ur_6Dfi3tmVKyWjxax?ny43K~dYL2l*646Gm4Kl$B%LIdlh ziPH6e~7poR2UpI|B-?QqWH8c_aA7}0Cf1HEB6m@;JbEO zAO{-A0#ImyFW89!C9y1N@TCu4-7Wv1euB2rKuSSDW&#Sbdr&!O>kQPg@_+?#cMvF` zIw7qqkS=*>DwW~iX2Rsr%i8(}oWM>%&A=IE-BVOR+qhh?1l!zgnAv`n*{S6;jJoAFBd9w(vkZbQt*I9wa+?oUjT;^WXwVS@-yyh9=)ble}DQ9 z85d)LB{tBtXYlhoz)hzrX;=V&!w-~CA+1wT*udJe9=)a=Aj2TdTBIP7g9Z_(iE9H2 zqr~6fbOme2f$*_F33z;_yRKwNFA% zO27!e^YHKk-^YQ-&}X4L(S= zvqnV+>0$%WFc{)uDy+j`bHK?7)UjF3N3fKh4J)NHV5PJvw3G&Sv_N;H82I$^?)>=) zJ{Y$4C#3kn91QbRz6L54z+G){2MBUe9(c6ISNRxd*Oh6i?fn*2R&=>bBNTCjQ5o+K6D$2+gL@R9A3#?TH*)v+;Q8S1t z`OA;EUqQ}FV1dOHG{1mCs{aQfq?&(>h7|6QO8t%qsmSl6A%#1ntiK^bO8?sk4Jl}; z4ZHRaoDE?mG~|STl-vj^ZXKY-t%gfCq)_axQ2~$fzdVgv;x<2G2A$cAaqR z1dCZ|R_Mt#8KCkO)EM3hEoLD@NGqU26rcn1vm`(z7pTybf>f$A_`s`mr5c>=9^LDxTk8gihUAzVQB0D_t( zphh5gvVl<<^FL9#?+(_BQU1s zzNcDDf%+Su-dPoB0Nn{z4rWP0%0c7-bVxY}FB!Xo(7JCZ1L#;vzZdVoF@@Igz*_o& z2OYpg7Ni6ll*J#Y^9LR^kaxWN1YEp<%0qbR1}gs~JbFz(zWwwcT9LYPKLEF-(Jym5 zi!{mvG3b;l_d}$z)s_31Yo`Lddkv~+?XV9yo&WLwKX{6!h@(3TbV0@*vz+1?)xYgcfKQ zH{^sLa1_0i`1k+6Pj`)q!v;p5?i3XdkM0_k0LbE(Zphja_==Om%Rccia53;QEM?_o z5a;G)xc-BOp;m~Ofq{{giItU=nH2(9AQYTr1g(7mVbuLq5}>sz3XUP5^)Qa%p#4=5 zj{89aTaMkJQMQ}fKYY4RfsgWmp5rs08?=svciF2?|DE`^wJ>rh@q*6r`Jf0|$O1pd z2ebq#6SS5xM#TfR#R}UhDCG4|0iYD0HlZ7u-i3KUn|Iy7cbsBL?_!`Oz@P!v9SjT% zpcPPY;1y6jjj#7P@^ABG1Q%K0HNPM(5uNqGQ(((EGe$pery8vh_XKcRK#5coreJ$ zREO-Sn*ob+0T2V!j{q&Zg6ybke!b1Ho7t6rn=_*e|F#ncUkLDTgUsK869Kr14qfjJ z-gyAt{NuvE{x~@Hv26ZfKI>==-uvSMN;BXD!F&z6_s8+zBMukPF%2N<5@f?1%c%AA z4gCM-AkhE|fAF~iKR|1`!TZ^oUoHZ%yPYf?yOH(+qZUV?j+!G2>K#?ky};n&h+m!o zw*R-89nblCw?Ksus5F`YV*Fw(@q%psZG3&e5q!;ZAShKHfTT+1(~j2X9r@kQJ2GE( zw7%}h?|$8t`H-viaaVr#;|CvdaGyH(ki(JtgkvYCXY)app=rSX^C+GGt-k*RDlwq< zODzMjDUBOY-xwZ0k6H1=4?C#90L9NbX#7MX;)j15v~=WOe;QI)LdtniPaAYwdl9Vx!ayIV$j)!3DI_ z8dNpFw^D$%uSKBL4j#QG9chU3%3$>aBMYcS06WhQw14!f<3Z&8qh_E{d{8V`fub8! zKkS3CNcR1KvO%#!A1D3j%7h!N*y z_@qF5|HvUUEF9Du0__fP?SARl{lTOAmq+(Y$8C%+6z;M!v>Ygv_vjT>RTN_I=;hTb z;AMDm@;D=WOF(>F>|vj7U(jWQfh>*6@?gHEJ9P}*z5Y=r*jGTF5>1N zjOCFopt;%;3=EK!tf1i-(Aq&z`2-nz0d;l2rH4!RBao=$!8hy>nFBCQpjD>)>rZrs zsJMWeteqh$4zCqK=7N;C@NZk90y4AHMa2Om2r{wLMa9Lj`;D!=v?fsW?n|$2qX_#-jiKJ@{R2w0^5g^y!2QhfMJ4bpdsF&wKQSro8yS zosFU8K#3v9ZJ>bg=nYZv=x|XnaOK~226P~kYxmI(7ZnYU?z7!4DlQ!^DhmHEyYO%O z;L&_sz@zycW9bH;ZivA?-H?!VP zlNhL%jKHA&vVcctj*3DUtefo7{6@j0yGEtLqx+>xcZf;>=!$sIyn#pZEyrH>|II%b z%RobPOTcr{E})qiP)7y4S{dYw*WRGG1+`wlu?aro10(`c1QP*8F+6%fnh+AN91p%_ z|NanEOM%YK?EVJY{88Z8_zl!=2leLz9RHtpwLZk(TFT16;Mn|Mp1=J$3#i*J`u-NA z+iq3j0NQ`j6ypHuwx9a{(4*Vc0#sIXy9&(w{?ns7RKk&e{Q-~U6OPt5>t#HcPrGQJ zZh!ACD5Ql2Qv46B z4OC%X18F(v-^`1hkHW_E24!ueexW zb>Vlv>d3$T-}mQWrQN>{zGru2{%if0-~BJ>*b3NLc#yUP^J(j|{O)H#dp$wti@joJ zzGi)u-~H;rM;wmamkvJS;JywbE;@FGgTjKpHTnPl|1V`E$qf&Z;(n_HDDFWip24x3 zsrv$Gg*Z6!55AIc;ok-e5m1OZGM}+N0Xp4``LFd4e)k`)%!i?en1P)SB0wH-DrfJ5_Iv!dvOMa39j9c);%amGC|Yt8E`Aw>n}8(9QoIuJ@}se;B&|T6J!_y zlsp?BFfcIu=l_TVda?q81FKO8%&z+PGOvRj-yuXyyD;7Fhzy@f0u{H`BS z5~zwe14DO?N&#fB4|Gloti8>@tq$Trmu|W4^PuJ@qepKUIF~x|um9u9zwNZ+!PgSs zA3AnJJm%7U>HBlgp+sQcgZe_umt3u{yYjn(j=wwS%D?_7NHJt9a`!LC?+*^XM;w0l z%hCG3BftB9P)2a!Uw;;w5g=(AT!k^8f_0a{&7fP5Hqd?=lY z=;6xV9=(;I&_m7M&qNs*4nE^>?h~%PPK+MO7d@FT!b)OS zewRZYy)u(ut92iD)js6Nzy1)YamRcTrof|Drn{8QqgQ74Yi7s)2V6nTI!#dq2A}Th zo(CT>f#SW}8XRx@+q@Y;aR6#hc*7FFDUb;0_(50ZvyKNJa(sW-ja=3qd?^7QE(I(5 z{t&q&W=53Jr@*o3$b8v_`;<#3wEWY67IkY(U17~wkQSQRO z?J~3^hj`4T`xdAq$1&^yD#_1+g9=ofp8~T$#rZ=}vjm(+4#Lio_~mH*(~;l(CnyiO z@UOp$TBxH8dK`Sr;mCda;A0N%`yk?Gr<^DAcSy2#0ww!u(20KCt`_7Mk349>=!slB z@_>VpXD1>UxdgyvyGQqNNA54+VjWtzdmMbg#4pd#Y3RXx0_4EbuP^WMGca@?cI^J) zsD02;``66w6Wzy+Pidc;X?#fgko5`v)+21N2KawS6_9rxS_M3TQ~_sDtAJXh@}Ga( z6!3&G=qv(IMPLZ32tbFvp72P%xRVhyvIQDHzUkSkGaaVZasU7S|NlGk`=4h%@!AYl zAAnluCtR#gd-m$|gEb;4^HC{ixm3#Gk$ljjH>Z`srTcozCD&drMpu59Q?9Ki`CESR zF);WfUxZW_E({FawXp7~FE}NE@{2F5!T?o4s4aJ_6$V%t&I$uI`vz*cyL7rTcrw3o zY<|gD+WIn&50;?@M?g9DMuB=lw?N&SOT3_P`U$FAK-DUuesN`R={~`~trk?lz#6)+ z4T_MaKREM%^AmFWAAB|zo(kp|mPso|(A)xe)(Tn!LApzj6YIb=3{p>^GnB!T`F-0}JZdfhY7nfYPEejmOV_ zhfXn1=1<@>weh7C&tUR(4>yvp!TlwdZZ>ez;NRv4ub-f!*BJE^q(Kg@pK$dwI_+Ry zU-nWSG?(A)YJoq(Z%`@1Ph&(#|!;#+|v_$6|?rsSmuG|>i5>Pz` z&Rf=?ytRcBlFEF#;UyPluF}Mjt2}!}rbFTglD}S?qUSBoUJ>+?9VLf}G(mEhW3Lma zz&Zr#2PkraD>_H+FCNJ!Q7gKKOr1s^%om$qFqVFM`4e<38+Z`uJUh4>v+4x24wG>N z4qDI`Diz&_T=@NdcKfI#d3nd1~{?!Fo#Mwc3Xiu{LmT?#DrCO z;LZ;f`bgk|iC(co`bn;xT&)KxdAoU3xhU*Q`AwYdo zLG7gO!yetILD3-r9&<(9&kTtVk6xJ$59U}2x^~!nR0>eLY@ieetyC{M^1Fk2HICdU z-8MwTC3M%Q@E}JV3pnCDx_wjxKnWEbdnZ7#C&B2^>7ydR-^vGy!gkQW0iL`h=hAD! z0L~zepuyh~l?v_eojxiB+Q(hGzrU7+#9u-8M{vx304vn~;nMv9E&6znvl0g={lT+R z0VMhga7JH(W3L;d3%~0J(5j2RYb>DQJ=l4pNcjhnbzlR2kSd$JE~8_oQ0uo!K2Y#? z`=}Ijho~gH=I(Y;;c@J~4$2wKA6%FZfm##HH$0o)G4i*TfI`w1G-W)LLb8V$lzWjv z5MBbgc5{J?9Y`M)#3a9y>ey*TT3}{^0`mjtx(qylsQ@ooVpI~)i;Dp)z33Njl zfpUcfkuX_Qx{pCqKo|AC7WN9|*v0_U}&b1#osXNXDxL|Xd?$UYZsNSWizm-p8`3`o*WZrc??FU)T)I!W@cWghfJz-`)m`EE{idrms3Jer>&OVJzg<9W9$D) z4o6VO{oHE~$L=HDr(L_xGyia9KIj4}Tfn8r1<&SJjHQP_v&#V<-7zW=9^E-A86M3? z6kv1Bafc_Usq!)?sq-?tQ0HaXtij75q{hqeQIqgo^AasyhBG?63`=x*8S3?T8Rlv8 zG91@-lp};AN1r zC#(-N3ku3O3ND>4DiWY7iUTw|4qYwm(fr1tdkc88u50%T&@MAjC()z(Cg@N-7yfN~ zR6tX>y>9<~k{^MlM5RGOpxI|o%NI2B>;jrM1qwi4vm_x$zX|v#9|!FthI#!ucpooh z6Y-~m@7Nugze0Ak%cMb0(v$PN`~tFWUHdfRj4VgcI;2OQ-7POc+uuN~84(r8_FlO( z$l-UgY2dT-c#xc-eHP7TkiIG4*oWwqO}qRkjr)@abVq-hBX^NVTBngm^C2c!Sa|fB z=I;6Q-?8}(BY*1`P#N@B19agkbOsr;pd1{KEeAY$1DQPdT`#(7KZI#+Il$kt{NMlo zj{lFm1k?Q6aK%hI@i9}Q!NB0!{T|W&cj4d81gc%(CnjWp_T)r?w&U=?4oraT$N{MW z9hSfYIxOKGC@4|SmjGQ14Bm+YJ4gX~2mbnC(UpJw zSx0Ei09s-OK5D839Olqd)Lr@4-*p6U24ogd0dMgKN4NHAL^^;7oP|UZD1yNPpa|AJ z4~s15rVv@sjn8S0+#hg6-iBSU$h!uLJO_1>BCiD+d0-lMglY{9}2I#bOIDR!)1@VmcYmQk_30lL~t`y@1!Wk8_}HVAeq zid-7vSd=su?!%D70A$lHKTUJtJ_@-?+oh8UIV(Z((0@=g>{KNw8g@aW0ZikHhI$$7 zC7VyLjn`{6_?i!-9P86t$>hWD`qNeWVatIMX2<_Wz$KrIDyVDVfEd4XT0n&Xyn7Z$eX^JMgnvvK6snN% zK~Q=1A9Pxr7bpmeAZgzba!id&=MwPIw9sQkK$#;+0(MY|3#cH1pmw4XW=!l{F}@fJ-#cxY}tjtNRsb70O%q3R>n@;M@S-6b%YF zkT$Tw?+?2nI*8d4Eu#X`2Q3l7SqNGzf{Q@#YFqGrXwZg0$o4;YUUSqw2ix11=6Lxb zShJ({nKW1KgOKbd1Ixr7y{5;ve){jy4GBAZxe%1ZTdP2s&_s!(OsEIVgkYNVOvr*W z6FP!2;X$-aI9(BxT%i4P{%uZDzP%1ikPzs;rhNjup&pWo;q`;|iSDD9!9ggScKHEV zZ5lUd-Hwxl_KEJ}5Gk3o%Ma4HFQhqg2Z^LPb_V^U#crIFo2p!t*x+j)=XGC zD|ZW|oyCz0ZfAXfwX?dN1waXpb*4vmw8ZzHKFJ4MtzXxxxoY2a1g)N0f7Z1(8?yT0 z3cR(&@ABHGS0(thx?}eNSMAr1{Ob>cmp{PUV?Mnq-lc5*y(%uC`MsmAt#A2Tx)m50 zJi8BgFdy*fYymIObL8J{qvF%cducPYNCG(ol$S7?WQ2+%NW%(#t_xCiPE3ge(M_Xf z8LV6~Q32I|n?C*bVTLSEbZmah$lv+{l!goB85pp~gC3!H@aW|U_JE#s^x7O(e0cQo zc*9hc@_F_0IKp^{_<1ddh#waffe9}B+ZjO-0xG+}Cs@(0J;uM@M}-4=Q4~1Eqcq4q zKu!wvQGr}6<%sQaa!`8!RJtK`MQWTG zdi0vgZ~XM%gV{$#02Ypr*gOG>%|)_!XW?$I zSwI!bLECG8pp7zEb;Q5T3w&ahcX!Jfs1*M88r9or@c2P$uQ6hYnSY>|;gG=*?C zr$_>Hjxs1#s$c^GNPQQODp{A#HQ<%{u=X456lKgqAbMH<)`2T zh_yv`Ce4xi1#+v-qt}!N>|@BmglUf4FVh^kvqaK5HBmAns3p+a1j>sw5?E5j2}IlD zBxo@&uC@mYI4>T=(e_{g=S3C|L|){VU|{fNJ_#CzhR<(<8edWnFP;G1@c}wE8*yrZ@wGtM*~gz1Z3ZXLg@(>^^|9NXefIIvD1|$-vMJ8VozJ z3ere(fHcxHa-oA^@Wz2pcd-QMpbF5a*Y}^@KS1GS-hBepO5k6Ab_Zw?5_qNR6<6zr zp1nL_u<8jscp!RpmPSB!XkZ$A_T`hx8FE7I?NFj%NkZl;W=t>zpdQHVvf?9Nt za0NBOp)I<3qG+ibH1vubY5EwE1`c&kW>C!W`=9XWl?i4(584|9>TJGt!Wvl~y)xcl zZ6FPuki*89&x4kG@Po$Edu5zq2DoSKpBr?_UN@WT>)(`fX@hy0uAm!T7%$$IZx#aoh{%(5jI2zD*sn}`VZ~+g8H-I zVY>U!<^gic!3ETP_2_PS50!&99YDQfa1Rw!0-y}jfi_|=LpH;J4|64Yn64Y*M$pJ9 z>S!HkgAyo!(K0^bkS=f|5K!a`1*!mIf0`?Il}MUvXDx#dGje`q0ku)yf!6TC zdcxS^N}WJ{Wj^oQYZLa`5Nkg5?X^KIR6)z{KsQ)nmZ_!%vahixQ|~bv&r;MbLm7mbM}&fIv}+aq1~J_kr4qpe_}bwjyZA4Wv;9(pKca z)mDU!5yIPxphhNYd-1PFuj!@5p!OnYY69F|OcEfFZ}dUcUH4i3_2+gFeAM{K7st?kV1h*>@8AldTV1gT%#Iziayt{LVX5W890DqJA+Zc9b;09-Dtt((2Q;Pyo)Cpry&pjBC4yP` z9H{ce(LO@1a+%M$w)}@KrIm4Z?Y`mK^53=B8Pq^J4BqiG1H3f(B)H`XDq5YW-rfXl zR=EjY6u;o57B93pIh`BYoUB{`X--x^nv)5z=A>iyK}YQ)GhMn5ICdX)F+Sv|ebhz! z5PbE)ff}V=8;0)loi!>vj@l<2yMJ`{fa`ci?E~QEM)%9tO3uAJ4Bf9feN=e5e`ue8 zDsX`+aO^$+TCfJXM8MVhAvnvqbRTfx_d5uh&{lEjKI#Zsn)c9z-|wia^=ptI3uI-X zME4<(%xlQvK~S_Ybh@a>^tv06vZ$8~sGLPAz#tuNw8@ST6%MqS z4(Mzlq^7|?>kC?H!huqXGLts#3pD_#5rbv=7v2YNJy6Nt4T_c!74UV5GT?=93a;Hp zxU;|#!SRy6oq7lRrzXF+E~5lS}luw=sm zO*THD1O!hr^6)gn0!}kNDm<78Mg~iQ(ZH5qRPZGj1w?`o=7J^|P$Sm>lvV`5<1sG$ z>$5?(w?bO8pgup3XYx^>UL8;p0Uu-Q!<-FHBH#v*1h{>KD8}W$eCdJ-p~X*b{r zTA2qb=0#K}81zI8b~<*JGC&g)3n=-3?%z~+&D-sxBGVlLI^ozwMFO_Z1ub?al)m7_5-fe;DV88f z459!tl__9JWir@OnFhX8rh-UiYuS-fnE)u2fsRfnl635b6hi#lkmkifYn)X)KrJX) zALeAxydbzG;L5+9MFlB^fd*YYdRaHm0tG7k)-B{76sYR==w+Qai}ZFjwyAPx34^s^ zeI9bL2r)C}uAM9@NQp)RlxS4IiAJG2L`4R~l|U+oF3&_NhXinxLjwG*Ye4D56}(`X z*y?NWrIS`x28QnAp!5MMd%zXe^ z3BupH9h4{xAghh>w`r(RIZ?gXC}YMbHemZlVf9lHs18EzNhBZj=w$(y9x@)x&Jv)s zWZ}ZUodLF@08xT~&O$-C?+@EZb;vZV#mit{X+T21!bQabcQ--Qqp0 zAy;t%IIB2F6H0);)c}-AyFdpC6RP4g!0Ub?i<`PXcJ_eBLL6ZWd$kWh8``h6Ky9hc zDd1)~T%GoZPKZvF3eTl`4_F!V0qDHDtMx-iaGM;oB-`(xi6(Cwq50otPQ$|L!p5Az96@Xj#Ec~*142S9l= zAAz4@1v;K+g1r+j!!%c323dDrhJFuThMUg342!%7ui0Jh&CBrDkC$P3051b?5HEwi zFE4{~2w{Cbp}Y*Nk-Q8Wqj(u?V|W=D!+9C1;|S}U9nZ^Pl)}ppmB!1EpTWy;DUp{! zG@GzK(Ar`UCa}JE4mjnZtS|lvT3-wr$ObPjc7`o41}(ST0zTaew5%Akav0p@1}znS z?TNC!7<|kKNCcz^I(Bdtbe+S&cj)J7@vlD%UIYMIUi{1P;CuGQuaMQnHY)#5cS4qG zx^zMoL3ie;uz*(=bAwjB{Fdi$w*swtIqcCZTRsuo17`j)1GMU;`N0g(gvx2y>SA}u z>f&&e)y0j4c=|)*qeD(Vy$8IN%?oU3-2fVvm?t`=(e8R>E}84irqu`2Q#FP=m{NOhg9RxyM|=BKY3h!4;|I!-zEY%6$WAgsPh16 zJwUX`UVemFTMSxS3|?8x0t*MooChOl4D~Ydl49_oRG{uVcu6tnBp380#haijvA{HV zB^K7`C?-BSf;2#jz28Fjueo%Cmp95fc7s+=fm-5DpbOHAq&$>C7twiiw?M9@C1r>b~_1pfG@Oz$wh%iRzWQvP%4*U0>zJy@&S)tR@r_~J?2~-do7%os0EJ7syd1SXUUsSJS~3(`ldf=#}m3`vkkJ7I9{} z_BmJX6Od?>16_=M3O2^(%IziM(#hq~dzlb;q#VgW=1Lp{tHv zxDSJyF&@3L=XxNW0NKk=UAT|BayyB*cDnw7z~Eg8Xc;C4 z-Y7xjG8Ir61}eK8J4^p`Ln;qQ(29eCRtmm67)#Ld_irP<1iAoT9t@oi=w@<6S{{sO z#d|7WKw2IQOQ7In44x_g4=h0nBOXX$^ca*{VJR3kYl@zPp$&FWs^njP7L=I5H7sZZ zAF|FD$I4*PSQHC*c`#^Y5L6EdOM`t>Soqh=s1RNo3{L7GZ^~dSErDeaP%|B|umo0G zdGyMz?*vt`kafY1mmfNEzXYu=>C^(1VBI+?@KOx4E&;N>#1(m6FjBGN(Hn@ZHZp}4 zVqlu|LW~7xA?64w#L(9TuTTVMX7GAo$Q2%r-Pcjq14FMQ*FMpG3|zZ-$wF5H!xsZP z!enGFKj6LqS_CnpanFG_N4#0TG3g zBmep<;BkELf(1xJ36$L+H7qgZ62t_MPWTMK0Ian1e+YtTqNM@BpcU zw3j`hofW7mXj7SgTaW}K?oN1KehCgY&+eA%pt{VJe;W@YbR!pJhy!|H9dud^5_8Nl zD$v8)WczLUND%!T_LsFCa1$)ke0;9eAzl{7#Lf$0_O zyQPt`3}j#ewA9M6+e8IaqDggMBca0xzRnh$n)$)|s6YYS{R_Fn_?{iIMoA8Q|DYH4 z-XfxX1&U>GkMRR6Zc&OeS?*sRm*0US54;f-dL|Nl`xm@f2I?pNa^$WOaqP4~3vzJ# zbt`BUFxDWaV+~^fT?Guz0WK;Apm;!(Uz{GjvTlu#@=M0C`y!}EApu$<-0j5S%D*j1 z(nA^4m8_D2wb`KQ9eH6e3lk(;;B2{p;@U^~ga@<_;(7U{V>jp;1jqmu|N66#ya76> z47KU@;2_4PE^yI?-gI;9h90nV3sj1|hA!lQAFy=G(fYO{zx!>NULI^MH_#TcSL}#w zUBooqxL-JGpMgvg$zFa8D*?G*gBxn#Rlo+_;FcO>i7>9f&eePlAEL^Wa0KG^Fv#ZV?q~w7uXff0w>IL15)?325anXrQVPbUanB z>4iG*FqK@!Owce@Tfj`vFx5GvCYeunxddnzKWIed`_Jwhpmi*G*8NU{H6OssHIUc+ zo_=kNV~Ls$KX$T-nHN^T+$8PXa z;IFmdHT>THxvi-g?7mxLrqWxPiCblQJ#_(T_1M2Hu2^R@mVf7rPGLZ_11@ zE(WUHK~v-&y{5di=nH{=gA(^X&_ZBX;>H$>gcbsO_KHknJ`Edg!?6(9vsVNjdoZQU z;8=vNW^00pf)@h+M_$e*BMM&5=F!90-12m9^tx< zgHAL~K8Re}Ld(~w6_D~3+YlXc`HFvt4pOp#$LYYuD>%y$(IrN-BQcf?5ZNDw6s?eA zSPp5N4z#&qXE}PA$_{G1XMq+7I^)c(#Caz)o~SruV@kAjAv^B9;d)d}#t& z9t>)8E&?qN22GAem4I8F%nQJ+&gKqqs}nRiN@$USQm+g{_vud17HiP*;2Y3I3Gn5? zAEC>GL1)f!bc2qv#I+7j0{c3=WANp{$3P1aKnn;V>+l4yE)N#zb!Oyuz0rD`zt0c4 zJoqrEA*0~at6Ez8=|5;FQ3KT1hAhW(2Q9sd0&S?slJEd63hn?kWPF(GL1Xlwkt_S| z>yTl^BcQy5)G&4JcEVU0%mOYo?|@W-OHJqy21?frRLD(EgYaD>p-jTM8J#jBw&m21U$O; zfHwv*gO_Y7fY!4>7I;8bZGzTXX@FM)EAY2&1?8d_#HNR2LKG#{I!U0|l`~f|c zATJ{4=>C9b5xEGKRKkO8wWbWdR3g#q#>nsbq4gVop9XYI@G(#-0k0od0QCn!lf*~) z*MrkXkrXItsC0nBU)F~?9W<21iLrP(g^_}1pCIU-v@D%3JEBhoLx}MJiv^ED?^C1$N z0yv>*@VDlG5?VcR%Yp}OLfa2r7L1h8VB<~TPOnd|>Xp1t|G|r!+`(rb+rUy>Jv7Df zJ9b}$B)He0f&rAGKy5itx|G8hh6NWx(1roDqlJAK_6o=>$WRk_T@5oa!?3WVLjGth zKM4tCcP?=WWiu$Dgb}wcm|FD~juHv8-Xc&U!RxJQte`>SGu_~NOT(vEb#D%&-co?2 z7ZU0(^X_Zd>o1pXz~8pk)SV z#qdZR!gl0-;nD4)VgYVvBadT4$FD)FggKz;kq6dpl7Lro3ZPb%0AiJ}?Eef<-HzO< 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

    gnF2n21Kh{v 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 z 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%0DS9HMztuF*g-1 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�*Tu&GcbU}K=BGX{ezyK15l}j;5W`X2_ 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�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

    uF9;opT;!AmOFt|(vxtRehkIYBb11ZyG8AMHF z7(_v5^?^_DVqj1Nm61=R890teF(i0#FwF7dVCVsv2g+1l3?T9SUK|X2Kysk^Yz8|6Lk9<%I0LE~pfekg?16+C3xiY%mNP7cSQvz0 z`?tXNg0O+^=`w)K;|MSafbMqL!~@AADSQkL%Q+ZomUA#fOoD_5G9R-36HD7wkeNY{ z(F9!9GlIsEVRx@&Ffklhz`^i*0S9~@9+}Um%gvxWgPB3OgM~q?f|Y?kgN=ckQ3P@> zbp{_p#uq*Yk0<;L&Q}B&td9sXD3=H^NPy335o2hW!ohHJ3J1d-s5_DQkbDXnhekTb zSVw?Cr-PY61=aoOc7v^4B=;xG~r{A+$8z{KIUlzIc*too;D|VjYz@-4hFu7 z91J;=A>o3|XB6OI5CFARAtyV5*2@Ga#<4KOU4h(DbfAiZA)%gwVF^?(GM~|ugTWLu zu8O>u9MrxJVl`m&U}NwA?a2nM!!lwk0LNJg(pjyb^S(j-ZqOXf0S*R>gB%PzQy}j9 zfXtWUV32#l!XTc)!@w274Zb_Y-~b0h*Z~g6o@)jM24p_C94P{y_IyDRw2!fbpFtcn zb{oRWz+%F~;INm2A#*PWLkZL_WInjuEds9v4p3BKV*s6%DFqs@FyUcP*uudOxP^mZ z15_U}AKWhsfv@$1^j}K27#?irVBp!o!SDjA2bm8Z!!LsEt>}Lj%YjP?-c8 zBT3-`i``hm!O#N|2hS(5U=>5r&%l6U9{4P7SpG5LW7u$-gW>9F)G`aizjc~};Ro0r z2CzIbA6XBi|0c{J5+cMPVj>7RPZHF3F5zb2ErQ+G!^M#BhJ#_k8xDq$X^^l(<}-rM zxC5;rgq+C%KaCtxU-L2ugYHiVg4Wlda5mv$FnG+tF!eD9!yJ%#Ah9FdVE(Mf91I&k zVhjuzd}KY4aR43$(G+e5Q4=okdV26Vy-zq9q)Ip#q*B;nchP+Sx643%xjP&Tu6H<4 z`nn*#*BuT9mFW3^O2p1IZ)vk@bM{Wf0o~mJ3XfcB~0E!vQ%?hSzeO3?3l; zpmmmCSQvy#SmEP~Ai1A%oD3l#c?JfsT4X-5ez5tFatbn@UBb@r0d$6~EGNSXkbaPx zQ`i_}WH}j3WjPtPfW#OWF!PRg63e^7z9CnDuK+;g2Z`vI2kfP zatsV$b;x{Vz2LsQ5x92-iNg?1h6ntd3^D?o3_C#j!EWRN-@gG8(-GigI06y}g^2(s z12P|3A7m|lD|9V>3qye-Cqu6yCxgH&NE$%lgY!A$?nD74P6h`MhOVDL=0nUBWnhft zV2CUc0i6*Hnw?5u2aS(`((x5Bh7anT47D1Z3^^csKw?Kk!TjwSoD2;hF$M+}8r0=XL&9H%Di3iaT??t zC`mR3$uC?Ce4w)mLO2)>{N-SH@s|U7rYLA!40H!2Cz?2@Y(^JjKvBae0=hR%kwJt} zf&qHk66CCV(79}&HHazl3=OKB4Chrj8RpD|o-3BY4d%0`b24lJiGl91P~~Jm<|FF? z*DWC;kh_v0ec}Z0{5a??&CeVRS3YwvFwBF*T>vs4l=q=+LkDF}hA3rD$h}lhUo>I3>DyhAOjj7 zv|fUZfdNe&BWS!6dj12X-W3O*&r#6J$!5O{L>f+{3FNX-*AhJXiv!($o-T7Wtpzc8CL&i{~86;Aq7$ia@86+6RAZs+iWr+mChZ;@> z`C3i}j)f3EAoC$}i;@iDArcJYCgO;-?;t-s5o2hm<7C)h$I0LV)r-Ohng2wL;Xnf? z!>a~_8WcX%9EW;NhAs67HOPEM8FmJl5Jd(VMkxl-2f_ygL1V!Oc^D3s$TQ5Z;AUtB z?Lo}oVG#bJz`$Z6$KcS+$uOsxli>u^O~`!kT3i$8THFg92S9glE2^-`J4x2BQoMgA6p^g7+&<0?$Q2>YOK>3<4gU4BZ}_3~NB z1Bk!DgOlM5NQ{92gAXzTqz0@9bhinTxsY{X;tY^8B!$3j2yos1goELOD<^}98z*ER z2xyKJx>gk=rsc-TV6hkyKInWDeW3U)5o2hWz{xOk0wS#=^TB=d6kY}a6CMVEA|A+{ z^&!wZ*Fb0Qg4%m2p!OaogFqf9LslLq!w#t3$b4{r6EtsnfPn#=Kc0Z@oaScWFcD%1 zn8wL)V;U#J2arC{oGPfFaD@}R762qJJ)M)`4@eGl&f+vq24p_6UT|MK1=QDu>;Xew z!+T%~C&TqAh;js(51wl(;e^~#5B3k}yeu{bhRK`^Dw8=GdX_-PRYTap{D8@v3^PDt z3=9~2WIf<^_$Kg}0laS8u#}TQWEm&J6Oew;dioGS1|Ad8{pdmrC~~0wGqPGx8Ux*r zw4Rf}V*@9A{g4APAEYLPjp4yeP6ne{(7pjkEQKA+x0%Js5V91KEApM~J`dm(ii*q>{=797UurU;*2r$Tj`VUti;;-g%GOPf}fz&_YU;y!>=5aFY zfr*9iGl2MB^EnxAfW#OWF!(5X7#P6zfyBV(g2DsY4Iq0!>xA}lGVtu4Wj+Sc6kY~V6CUuM z5=eca&A^MYpG}iN;3OwQ?@3OEHz0Gs^_CU`M~VhmY{^MZhCd*21_lg1vOcicj2(>N z-d+K8z1^2KMuX#=4EK+7GI%UkWB~7ROKE2m4e4X#FzICkiGMoI$q)gOV_*QQL*^sv zh2$yFom)H%;5$1(;r@i1;lM{uhKCy4^jha z^WNiR2)fS+KO5r#G9PrF6lf2V2^T}bV@`%uk2&FIIic`DW~Fd3Jh;orkbaMo0oH#) z;e*tG#uJ}$GVnczw)H?_B`jdR>~l_rf)$YX1j!@wKOpI01hoelgBd`p8^P^WlQ4!4 z*EkuDU*}}l0n!gHQzO89pBtPEM_^)4f*3%2;hUTcH$Y+x3>bWn86Y)aJ)pJ@vbkWl zvNHtS=47b3jVQ;E`HY~kSxB7)t@qd&8lG}8OnJu15V8{DHxxd|OcNFchqIgvL1&?1 z0_x9Vh%un3VU*@pl`aut5Kj?g5C+|Os>}r`Cqv11s2Y%12@9Ct`kj+u%PL4XgXEF<$a)~>fQK>2Gx}hh z0}ig=L1*?0aWS+BaY4&91_lKrJ|k$aF=&qb0%&Cd1B2ppHiqdX;taxH1Qjw+xLKliy@qq z3qJOQ!iR>(2UaeICG1>?zL^Opn7@;qi{S>;K9D>zA6XBhE|04&=xkg%7-bqds?vxub}I z%V-lf23|%N$XuWiFN4t&76#oTpnIjb7?h!R_i#9|d;qNrWfbRB6*u8x5LD(d;`qS! z0Mhb=&i8@#m1=M?aArvfNq3=AlIkiHZ)h6Q?D3|IBIpktY!FhCUp-wkD=$DqKd z2D#G-de%1l9`6(`h6GD4hB=m83_Y+jgwezp`B@qGO+*;@8HE@)Ky@9+?hrNxgE%gR zm^dzmJD@XJKyyAwd`SJp#lUX@xibu$zd(20W^plm$>L(jSO)CH{>3Q$z!VNm>{&LI0l zgF)Z3Y$-9R>wgE(QZvE`}>myOH^fuUHvgm9Q|}F=1n10qt7>-4O>m z9|hDdspny+HxXly`@+W{^@N{6_=o@le~BOiONuxHLm(Fee;^lw#(I!{K=CGqBE|@w z%M)f0m;}D11w5C>C0Z&_3o(;9J8$y8sLzYu33Kc#m*{*Kaj6b1|H4=3=-5HWRc?i;IEb2sZ<0 zoffhjV=xCpFlg=!G)HH`%K$z@0leQ%6}*>`=KbHvZscM(0up0jz~H0k0oA$a=78e>dIo(47sK@oE{rqi zL1G4(Tnq{uL2=FiR)fqJK+?wu-p|g*AZEhLAQl9_4K4v3H%Mp6H}rBb?C<4*pCymV z2dzI6U|^^aWMIe;VnCK-?BZtV`l7&~0J`G?ao-qt4=-eWfg*#bi2{QtqZ9+=c2x!j z@cOAQ@(dhLMjOxEYt`gf801n|z;|Q^%;aLop2@|)vl-+sP?^fYfGWm-!e{j5VDL@h zXD|xkW8j>-j{0LE#`5gT)~(h7hn>3@CiYI39+$F9HlTg8603Sz0F(<79ep31`IxmKIAo+Xl8=X$4e1m5Hb;l+%X2469J7& zhCt_?=5jIU&gEio0M9#t)-tg(2%v~DpztAMIl2r&COQm4j9TEa9PnM3CJqcTj24hR z0~bK2V?q0HDRvAWCUY^AP2pl-*$OSoj@X0wv!-w{$biHc7%=!KdO+zig^l6BeJ+NF z_hEH20}3BfKf=#GhP0PKThqF-Sh+V(0+d1(`QM6=OhA1GzU%pFuuEk3rr< zmq8x+E*(%h7hz!#VN_?}G~ftOlwo6#`J%|c^+bt*<%kNyg9}^?|1NMbd;!@7%7ZCt zV1Cg>E(V5eQ2$?1W&rUoUgTnsfr*uFLE&$fW$!M`$aAWWIl=>1_o4fLF4^M zc7yL^1+CQq)wjEO71S;kt<&g9@W41M&^*ka|#rVZtvihPA)B7#v`Fk@$?&ybRS}L>LO5 zh%%(4fX)RFgY8`h-wnceii_ct2_J)Z3O@s1hyVlMB=G621>m+*2@iw7PcDYKpIp%W zIiU6@x)=kB8p!x6G%sC(?!g0v*%u*(4Uf4P6rXT0yn(tCl@HqQi>3yYra^a0eCJ}| z{=o&`i}(PE54I1KZ$bCfJb;|cfnLuoVCH7H&&&<4=TP~m^&GMsxNT^n%Am+7g?v^; z0{AXraNAIpK{iE(K{iC1LDocyL6%VhGS&oce+hxwUx+#kboT2P$UQm@Z@3t^-*Pd0 z*a3-aWIlL~0DOLf1nPaQ;6536Jq09gKIAmFvwtK5Hk^B z5Zfg50e<%ns15%FvJQ8FI5&f$1UEwi$UM-Qv$Jo(Tv#yLJ-m1MvB; zpuBQKfPq1do54hmn?YeWG;YzwK>G>52r_U%*C}_&aWhPo<7RLGt7l+9=OdfPc#4DJ z)DeD$Lnh)3+>F8uEFYL2fX_j>!p9(#0y-Z;h=D?=56)~l8UFBd!^Z}Z`QW;UIxh`@E96oT~i1TLxTf1!*K_029doGccSp2VfMkEn?c=y zn_&;^ym=%(BWP~r6W<5$>1PMn0w8m(ybN3^dclUBS%2HiLzsz=xY*uMaoF9*{YpGwpUT zfzLeWuV7aFxB!x8V8Gxb>t{6PWH1JuOWY*%0dhJKPXMUh2);Mr2?qn{ z4zdfr+zcLm+zcA~AmM_{N1U(5i+R2p=$sx#5e7a`%?oOK+X*q)&0t}$=wM|qs$gT# z&0uHH_#(id@I;V7;t1$&4N$ot$*>@lo53rLo1q12A2J`j_v8@!1MvNJATwE+7+6!d z88!rSGZ=?(Gu!~_0p$bmJ+M4rvA_^+h8G}l1_m@fsLhY67c#cV1-cg%a^C`I?=I** zX*+I)8ar+Vi~W!=5J2XG+>pV-AfU(1z+lV`-`|142dODxV_1;S&2Xp?nm@q(Qgkr} z6g7;x+^V`M{0wR)yr4T{K_^N={0+i@xgPoM$o=%8^c12zVO9V`qID_9xWX0R~`OyOpj zJB6F!0mxnj4hDr2%nVW;>7<^>?jJ3QBwO_ay3a^09 ziDF?8ImG(_e5W(?-Zw_@8Z3J=49ZQKlRc5pLP9E5}w3Lg}n zp!Fr2xf$%YawFE4Ao0QT#h*AouwP(30Is{h`!!e?^gCD?G%MH`R5I8ZA^U&}TDTc{Teuli4nf?A%m??g7D3B6@Jc@h z25?z%gbRFbZb2L4%A;#Fi?eQzZ3<7Jo8Isp zXeBp;$6-j=AoIa(KNEh~In0o@UkD$A!9s3^hK1Y=B~U%ce8{*FKZBSFAA?vCxSw(W zbPgh8s~AJ;4+e&Y7mN&5H<%boPB1g%?_gobTEWVYI)jZNs)L=uy@G?mGJ}(Wi&2yT zQb)2eDE#DR2>Hp4GER&v23~vSggO?$YQVq%o|6XMCHw$74sOE5u;C>)gY_$J27@Dt z43N5vg@G%D6@2~xNZjESH-imGj)4KJ4#9`Ci;?w%>-7*`$o_fAzIDhMl%V_HO}H2o zK5{es`NYjI0c;-V%n!(2Y^dT4DC!vHI2hzQm>5JWkj{w()twd03<9t<6_a=%c@MPb zT7ZWkPk@Kv2iOkKVh{wM5ws@)w%=tkJHzA@VFvC);9OR~1gd91X(~jBVM9I-Lq-7) zgUwNBpZSRhm_NCIhamtY21>_Yco;zZ0|h(`DIhTh1`IyP43HYI9?;x7lDUj4I2cxd z`i3TGeM8XvT@nvNZZZ$U9;mqskoh3HQ@9u|2=g#RiSWSBjYsB#&+@B4Jr@_8_n~bE z0d^jS73@3=G2lCrSQr>8*cccx*cnj88Bq9)6&wr|ptbfD@N<13drm-ixSMc6*0op* zv|3m2F&Jg=GiaM=F{m`lFe)&B+h347VH3C^ZAj3ZwE+)9r6CWrjRi_eYzz;O#2B@B zRkeiYeL*iY8hNii{czptDaEjky?% zcknT2t>9-+oFTv<+5x&}RG6W_oQI*^f`_32WIiapRS1FklP!4|=77XNXK^8^0k;!D z`=3$-8Tdi-#Fx0CX`PK>g9{Hsq$>}@6R199KBF=>gYpb62I(h?4ALbE4ALp`;PFyW zA6wB$fWheo8-vXWb_TN@91OZEI2lwrxWVTp3uo{$aG1z3TrlKeXgA_vkU0Sf2V_1t zeK86`<~zW5?{Y)NNRLP`6v*)~?2_kUr~v5$`R|JWnEza!hoJ`~#=wBWN2;F+z;z6C z{q+Z39)_EGJPb#mdQkYFJW#^M@Ii-%AwZW0F&Br#X9S%;*}($dH^y~|EkRM9g+U&C zpRWMJ0!bbQGbtVhnUl~pNfoRNpQU&h1f+QwB0yr`Hk%-dI!1YR2KfqR2Ehy#2Hr)W z6Sf%`7=ySNf=oCVgj2W}Fz#b4;b1s$m79U%8aK)uBeEEyIvay}1rvi9^qg#1`F`OF zH-qU_)bbr!jM0Rr)dVzd)hxp(f|kD+Ww{t+OGFuDQ$!eKLxdS*O@u&qojrhrGx$Ds zNSy^*&sW65kXFRQpmPcu4jD{feoGM#g9S*8fdPZ>fTRa}uPLK2Xs*sc5wsTc1QUbg z4rT_C6)fPhJXk^`7#xau7{ZEq7#cw48FMfg&tPSc?_gsPg^o3Yl3=A2dzMc>R=zauLc?Je#KBFqHs_GSP2I&$m261fVng*AthOzP^l(Uo# zL;@Ji_)N_zSQ$X``SQk6k5KNuHsB6mRA6IJn8Cv!-NDPi#Ryuj#KIt3!N7EX8B%s| zFvP6jWC)qT#bDdP4L(0rCj-&4;L*@!WhS(WG3_%^j3|<+c z4C;)~c}~#z&;}v_irO3u+9&uKq$)%hgs$i^a2(NNSm4dW@Xd#ZVFuK#D11=9PvK+` z5anTz6y<@m&p=`(9AJL7C=bI2s6LQ9G9Ob93xmU7ZibG(+>rGZ3=AlIMte2}dlNPW zZrGYe(3n;V2Lo#eJ43=DZie}XxEW&3Lc$Z751#7*ty@FC>jku5v6_d$zlMil3RK?% zBtCfD!bA`@UIDK!A$@Ni2E`C=21OGt21O&Jv&~WGhyxTSu`o;SkOwu$Qj z#|1V6MFlPfg)bZo(nmNM#7ejr1XDos+ky-NpLiIOKJhT@fVvf#<eL5D+54AjT-n z!2f`^05l7xsLRHn`$d33=87N##}Ofh1}#2@cUpW5KcM=N`HXU0400yI4A8S1E{Gfu zDiBN%2w>dK!?3-Che14qAH8pvz<7X%;lLFh2C)!OJ05lZmvI#j!zxgI4&g=Lmz2P` zg@<7aE;-OXj7yvk*g^Mjt8p=?ec@qHyu!;MaYO`i9+HU=gFplyLsbMH!-4alv_!!oNA^=Y!UFr0_B*hVU>bnsB40ZP5OJB-lwzpz&c228l0h48l+N z8ThV%&Jg5fF!1JMsPN`vxC3(+5}(n7ox$UY5ChjDwgZrn3}~O{3l~E}1|P$-3_b># zi_m#bP?{+b0E_*|;A1cVi8C-@@KN-E#sQyz?zDj1JGvl>kKs}@A7oz(NbU;@1OF8^ z2G%3IVDSYpd<->Eb3y8m`N(=9bsTt&3FvfHa2=-zI^zU1#{oKfCYF!kQam5S6{uMU zkoYKi4?y>+!}MMeU@%DLV{l64V-UCmiGO51BY6J>Hv_K`c>hHLczyX7(0UWl8gdQ> zhHO5D%xpdeAFy6F28J)7^(LGQ3?Zm;;PW6BF&8j__AuD+G1zo4G3Zq=Gst9s?wRLe z5PBlOz!d_ye`!MjAH%x>K87h^GZ`3=`OrO*4?rdpz<|L=)&n^wT?V=3gqRo4;ALp2;bY*e=VP$A3@tlTRKR@8 z20n%Wm{dBj~Qx6|4-xjG_$Sk&Xjw28!V# z4B;o383K2(FnG^kV{q+YXRxo}U@*_%WYE7N!XR5B!yuFbx@$^`L7;+s{4jI!(uvW#*Jf*+tIDyR!N zSq9?{Ztxv5;^6*)DnmmHAH&lYJ_esF5VMf^j7Gu?MjdPnS{3XJ${8FC@+ndb@*$E8 z@+J}t@{B^Lb%>8BgU<;L2A3V24AwKa7|c4j85Apc7^E_I8N@;q8N^H!Aop&8%XtO{ za5~)tNu!_@iQxTUUqI(ci7*r_;A3E2$j9&n>LwIEsQ!kkGg!jMuzv|c9WtMBk}$)h z6-*30Gng6LI#?JQDp(n+GuRm9A4z|ZL|c=i2s%G~2P4CRS$qt0XY(lkJP$+s4rT^}6)X%|Gguju8ykh#PQ!UqHk1fXZ3dNMrN%*VjG zm5)K<8pOTGd`3BT@LD$U527Gl;5k`Eb2bL^Cz1>TB~svXngW*cF&Hi5V+eujN8y9= zqX`?shHHEbPp_eA=0F!-l{&Ku@n;D_B?XT`=~ zRl>%=Wx@`!H-Ryoiy^&)iyv0|p<(JkZ~yq3IGNX2J&M&;H8Ca099jB#+F;rpJMkpCOQwA0;oMiZL)C z^TBP%5G@8lMitO~9uL6xd4S5#5={mU6AgwBEc^_fto#fSw?O%Y0fo<~%5AFpgqK0F z1a!v*H-nf77X!C3TM-keT*~8O$SYxINC&Nv2KD1Wb8bdF4-`RXHk)vO+pMf1tPBen z_!<5)@I(4{pm}X%J~$j$7&ZvN1{3;`fH1_lg1ie6A3rv!4|Mu03o!#Y`h_#Gf9e2`l~ z>+JOS8I<+;84_$DZasj)2hHWOF`$Tn^p&tN98l+H;LzZQtVsZs6Ucm!ze-pbSV8CB z8}TzZ86m>m0Ey3N#LQp>iYF%qq`44CpZ|g`KLe8h`UhuAUBw>Ff1_SXE<+& zFdK#M!NTAH9^2$&m|)4z@X3-NvhIqN4Sa?aLkg(8Lz80wm4h4%SmnTW@-qCi;%E48 z#n12n>@Lt6N;ES->PpxcCRp<`th45akCh_x!Rs_ZcO`#dNdWDJ0nfLUNHKgc=4bFS z;b-u;r^ujK$ih%~M4Ex)i3nIM#e|KV<$LBv!%+=6|r~XE*`13nY)sN7ln=#>QY)!pmTo!UMif5Zr$?VPlx! z%Fl4Zl^;6Sz<|OBuWdHsf4~dc_b$Q3An}EPLF5V}1Aht=16K&>&TI~b1#bKd&)xVL zT<(M79@Ga1bubti7*ast%?!TJ096eGiXKML8E8$s55Q|KKyy%_yAe{@83Y3P8R7!@ z8CHPIWoKhx2lb^&*ccelKNIK<1_MUWm`{ixgMx_wgF+E_R0uRfoB%%a zWf98ACU~6+Bj{{c6E+4e(0ON|wi~!iVSwCcUc}GvxriTnP6%in90LOb=$>;VaYj{c zRaFxa203NPO{lX`&@ll}->8)F;MxCvK>VXHkT76pSg@3zVe?XcNZT50E*qG?Zz(@R!()(p z7%=!4dP-Or9<1bN__`A67N|KOKKCkqh7(Y8(D^8O!2KXdJ?F5ApP_gY)GW~0HZmVc zUBXs=hLWuabtrr!bqluhGi=$8P=~^Yx>aBgKZC{|q;M!<2lIXR@H2EgfrJA{9+{7< zhmntofv<=Q8m?Rn6ZY{ltlY=XZ~>|pg%7ne;5a`+^>J9f0mUC11Bw_}9ScLj5q^f& zBMA2+^BHA%7-WxdF^GlmFo>COGl&_1*JyxNv_bkqpmOmbKf~68{P1;@1t@%oy(nT( zdl^piGf139*o(}ExAQ=A+n_aF94rhRkTWtMVGzQ{AaIqR!RsnN!-c1y@B`I1sA7zu zaZ(d023|%9$i7HWTgQYSbVnA%?InB+4mbE2%5U&9h&+Rufi4DeYYH2K!XthLyGQ)c zbtMcad~nKBb-%Dcu0O?UOFerlN{hqKfs9fP= z;0gity?7Wt+~H@izst`s1FWBef#C@o1H%tSPDCs z@BWORA>lc6?$m^h0mP4Z#?Md!5@TS%;DgKnsR8Q&Eloi(7d&rN!o?s8y06NF1AI3$ zByJ@bcp1eYaSPhJ=>)#@8giBtD6XOBXI^;6&mi=kpWy@8ZqPYOkZ?p12f6(U3&ZF4 z{0w>@_!%T#fYJj4Dj%fg2^WLHJAMY|cl?lZus~uV9AJLfJAQ@`s6LQ9G9OtFH0^aik9`k$xF;CzhKSRnteufud|1dBh^BH+Scf_zV@R+bb?ubG1 z#|8!g1_nj}28CCkaA06S;e*P3sQCuW0t_9@0&w$D_(=Xr;1FO~!-459RB;9d6h4xB z9&iaTD05@#M-^vaK;a|VzkpYO;R7$GepGP=1{6MMOatoA1)Ks5UpNu|MByX3(}72T zVFC{#+)(&P;dX&ffI)*FVIB$}$=wVh0t_A^nC?auXJA0#Be|zQOn_m%7^Z$yaRvqy zK9c8Y#Tgh-_(0hA zCR_|GO$-d+vOo#CW)U<;1G*dL3j+iH6GjHE6j0g6$)FG|zz`ZO!0-iX4>F(8mz%-& z2@8W`2`7VP3I~H>2s?ugbj*X1j}6rR`T*W_et^jUydE@!oq-EFvyn}G03MFGRT`4Fvv4%fydfKE(jd}t&fA3 zn<>z86O>=TV*yMI6FvzrT>m7%5b+)w21tDH`dTHH2jDZGlzAAGzc4UJUSVVqDPdyZ zPvKzTf{w*c_$L53fnAn}aM2hRn9_O*fX2xyGt3B(Qj zDWEnas1MD`5a1!mu+T%0!R9kWKQbSDK1>nE1@K;#1SSK>dI?qr-Y0C}HDVXM1sNiI z1Q}|edXf3y{n3lKKX6_Et!v?7ka)t%AaaC_L7;@4fhUE7fg^;Ifd#Z)K0uJ6DnO87 z2hS1Q}}U5M>JrA4}P?pa*@Im(B2)_?o1Q~p`BEk=ak0tyz ztP*6ny9yD0D10p8C$L74p=}K!{80FK!tcNyK?dHvi10(GW2tO1) zo;>{Fq96m;B}Dk4@HKcCG`=u0C_iChkUql9AXdV{zzfE&nz=6lCCdgvh@rd_4KL;jtjYt;dM`i^2zoANKO{z&k+(ulI=j zi^9hfehxnc8KQn7!ViUyC;SW;gcw>Ggy3xh6h4mdo4_Q*@Q_IeUN52W(ZbJxMTp@9 zix9jXLgC{HKLrjUhAIvrMBRhT#}j@AqCyP2M1|n>4GJHvz6qEn$S`>tqP{`qGx9Pq z@CI>SP*mY#Q2D~ZAoGNgLF5P%g8=x>TNVb65LN~j6K>E(9|k2wA%;7@Ky@@91H%^v z28Jh$3=Bs=a{$Z?3@I!O3?Zxx3>a!bhYkqA^)iC))!D@QK~bKMLH-FVgTxg!29YD| z3<4z_3_K~E3>+a`VEZO$3NgIX6k_oC4YltHD+9w7HU@?x>0h!Op%gn&r1RBv`U{F-zVNm+Q%pm)Og+Zc(l|eX# z4cZpxU`Xf^Vp!58#NhA`;$~z%c+J%$)(gy_HZbTM$uF!7;!oHZ_>ZtNaDmoxg>W)B z^awHR?-62Xf$B%$gTo8AUmYe0G4xJA#1}Fjn*O2T#mOM?1bh15Fjt7de4Y>k!+(hT zQTS+O(t?A6437^Y$|Mv%*sZwZcEU;_hHWbmaf`wSr7b*hdSR0ggZgIT;uKXa0|N>l zPdp0j6=De4i-<=QK90Eiuuq5~e?KDbQ25~Rz#VrV4hb>X9!A6+3LhLExZ^D0f)K;= z3y3&F;iJXbgyRAXmyZj;`|~J#Ej|XVFANMyPZ$}bjxaHZl`u01rLZvYf$I-0h6yJG z7&e^{fYu)jsCJ4N**k8EIIfGjQ4BKxB!0QVXK3dpcxG%sU`~VU5D0~88 z|KWiEgU~}n*rV{lZp2*=J3JL&nD-PB_Q-tj8gUa2_!y$1FdKt#33MD2)E0Opz+m)B zfI)&;i9wNpfq?;u4;~ko#P)&Z08@gZ3KxS4sBeCSje#GeKLm89JtsrKYXOF5uLT%F zp!!kx1mdOOtpLN$w}^N_;e-8*J6;mL3NSqXiij5!K3cp?U=U=u%z!AzQ1}Xb3<`Ma zr~)=YhG}eq@Hz^G4{{@(a;!l>kl~hqAW?M_s#*pHWIlM0SP>WK1`7j4P&*hp&chGB zgA6jpvOrXj;i;$~!yOh#JRZYkH{ve8FE|J?XgLxWm#AtP7*O~);*Y^gkipdp5q~IrJaKlxSCGNq z4-sc5d;)P+5Gu&9HxvwEJ0{J18TG3 z?x&!tWne(zgWQOxPI4#`WSCbZ2(6R&7#Q&MPf*n|Fre_k{z2p!^nOr7yCB2Kc0@R$ z@WF1xU5+j25oA#B6@=F>D15NJxWh4Fx*$W-bmGDhRV@Pp3Lor7-1SSt0zrm*3y2Fx zRJ9BYD15MgaEBwqIza}{b%=08;e*|XI~)zR3o>lqjtEB-J~$uXZmV86B*^gX5TaZ_ z;e+hOQ^r3yBgkNWmbh{ORV}EEgrpZwTlKhe#oYd69_lMB!uUS24s1G3dsD_LV~V z_b7ZU{i+EmLJVxFLh$)g6h49QoRB8Oa5D`No+x~&KA%74!))Z0!?*x5H8R_}Xz(g&6#& z3BlXm7m)b`$_a%TLJYYx5b=P*2Zsmla$><^AqMp&h;jmjPaqx))(J6$twY2E3Lk7Q z?y~K}b|D6@9mK^0s#*pH6h4l4P&g>Wka`di4=8**@z8KWh~fVUL_DDI3B<#NQ$h@~ zrxEdh!Uu;3?sy2eCd6?48X_K$`H-^=co+nXz`Nri=OBRg&RpSUU_HXc;BZHXA?>aZ z!yO?=zYUqsc#M_dSO_-*dlKmM0O%f%C#(z~^n@7>=?gPR2rEI(GX$T{zylWhs4vW* z0TT!9fivM^0Evkh2s7A##6f2v>kBg=^Fd~T)PVIdFrb(ZK7(%&$~rOw(3&3bx-(Sq z0LU6vPS81%$Scec>XT5+fvDHuWsonCVUSOeW{@|LVvuJPL0!WH+RMZ!3E9t&boV%8 zkQhVI4`Bwc7a|N6C&U;GR!A^tR7f)@X2>weGFmf$PZGVrd4RouEdhMrgE|L;`VCPA z=^f$>LNg>8I6I^mF8ByD?DiLCFcE=-Ju;sWbU(xjCI*ce%nWiJEDWL*tPE_MU}r1x zF?=u)W>7U1W|#uf3tCs4!Vl)FSqL+%0f{j%VDORkfX_ASU}cc4U}F%-U}xY4-RlCr zA%%efJYKVcnL%y_3xmWL0S195pfi`n7#hNa8P7iJI;h4=v^ zkIYBW!@$G9u!D(#VFfb-!wk^9Mgj~BPXrklLeR`+;3BLBw081}1OvwraR$yPVTN7N z!VD9@ZeU?xxFW&8fFaI+qK*-I-Y(Y#4g+@3`Y3Q4jGsZ`i2#G(5kbV+`ia5}u8G17 zU%+NFFc_flL3`Nv85o`jFfbeuWMC)(om(Z0qJ|NC&wwZcZvl^iq9g}{Ie4%!QnZ#LplZgt}`ByjC1^H*Kvj!`xb7_&(tRBtD}VD}z}H3xlQ!2lx&k@Y%}X z^Gk&WR4k{EbRY6uU5 zun9MVa1c266oB2A!o{$lTA1N-wJ<}AI3$gs@kqH zmY$*rXrCqz15XAs1IH0Q29^|Fh6Qtl8E(uKX0VY0g*5{TAADx65R(Dq>_}JFq~Q;obsah5)EO6h0^pQrH<7)(bO~tQUsf=?4mPG%5O7(jbU zk;OshRe;=xCeEnF!k`A*D+(HS2Cp#&?R#cqU=(0y5J+KV5C~ym5HMka+!HCq${^Lj z#2{F~3|WsZ&dMN;%vWM&P|9FnU{Qjd568zK6T-_NW5UBA6NGd=95WLGa{-fqA}CLN z0iEl`%D@G_vx%8OV2vCG7 z!p)GdRG8uRQeg%LS%?|Pd`5Rp2KO&)3|1z*3|vWU7r-m`L3Jr;zrquK2G%2d3=YeL z85oueGgv_NqwvAu&cblup)iB$BUn8GiXU__1{5`nMSKiJUsxD&pRh7yT;X9zKEllq z7sAEB0XlynfysbTo|Qp<5qMAT0q_~JpgehnodG;wkph{oXt*fMFzb>q!v&DLK<>z3 zVmRA<8M+?}Ge{^v;t-h+-e1Qk44O~90CO4m zjEE;f3hGOx_k_}JD3^NSFkWBLeH}To%1S?!NI_BL>jEli%*212BemO z0fUch7I^)>2^#~)1GWT3aW)2V(3)OQ`z?f-K|x=H!B$^{;SSUsWIiJwJ9ym+p9vcS zd7)N zFy?VEY7}!Es7(i(Ye1=O3{G71@@csnY&9?zekp1LGxEUtI zi!hu{6k(82QDRU8rNDjhg9%6-Xh~zf2m>-7*&Id@E(Q@$*|G`s?ghq;TnrnZursU* zVPoJ=f%l&Z6hUW$m2fZ!LifBZ@D*WL>nj4SBN-Tw`QWnxf?#{USt0Rxg@qxZT7+Ri zjR?aVko!RAtsDWJNy^8-fG!6*L*@$Tj9*speMBhw7#L8@VGQG72tzvq3$llbg@LPt znSnKhiJ_rSgyBY?2!o9YBwZl$86DUe97-4%Oj4K`bWE5SSeO_X80}aY>`Isz*i4uq z=@oRQTnZZluL&yy?*r}v@SbMSxLXJ_Lqm@U!{Z(ihCOPKJc!H(_lZJ~^nvex1GRaX z84R367($#x7`{ODA@d>ngcx`?aee@omG)c=_B$9D3|BBRD9vDE5Qg4Mmf$SHFxy## zK}TH)lI}8C!TdMQA`CVlF$M+QG+p!1s@L>Lf!Ch%N8 zieAu|B$8Q-p!*^jwHd&tz$6G5fb+r^b%p{95r!=mA`Au^N(_q9Yz)#*G#G?IXT61J zfyHesMHn1FatsV;e9#$r>I@7|G#D64G#MB|v{20gwQ4hEG^vLB=` zNFEReomn0rVgMdT$^f0&#m}%|fe1s*LJ@`ps9t0~BNr>=%*PKL2iQPk4xl#76VMq( zkhWQW1tZP`xO8G_?%NL>PRRA=D!C8M)aQxJ@`1prtOft;EhC1m1_n%J5*B z2!qjb5e615i2qRdX!cxKF2bO=0$~p_A6)*V2r%%6@H6mlf}Kgn$53!xghAzo2ty9o zd{7?g&o zEn#Qy4FT0}oZxdb!F_Y+xk3WpMHn=`iy+34kollI1v+o>mk2}6FA@0t<^o83u-}Tf z5p7%W9tr^lE@)q{;kyV!_74#T4{b;oBJ&ybc~bRFWEfPF6&OW8sSNpyr9cjbz%OA8 zf{ft|Tn9M7Hz|SBT}ceXgJU8LVaG)n7J$qI;Tt!D35~i!f{fiG%J#I4;6~ z%tzJ-9t+>W&LF*lgF!e0bT*S513#k_+E!3`Xlj7|Pa(FdTuJjm!tPaW8?> zTLEhVOMoKiO#dTd418C_8CXn27#wzpFihSd!l0lFidWG2GvW*kN5mKyFyt6e)Pl#T zF0n)IcZQ7tei36>uvLUXVVej;1;{*5oPzsm5V3jNL>M|i;tUL6H3&ZFENw9chAX1r zGu=_l0G)k_WG15&2ZK}wCxZ~^tiA&*1@N=_QluChHib?@I;1z;fgc^ z1G?RyG9OKhF_M!ZGDVU>l2HiMhXkFW06D(~bl)N9OhFR~hJckK3>R05FsuN%3FQ6^ z4lw`mN)d(wATdx|d8G&gG9OtFxcoN}W01H6F841$?nmbe0N?qQBEcYKBF-T733RGG z{{`?_e;_+T#25-bh%lIb6k$-&2c-efxwy!D(0NO!Y9QzI2s4PL2r-D72r`IX5_|wo z=OF?N3z$V2I9Ws)N}y(;@yssZPl4t54X6KMuPMiJ0itB|?^r)PfaQ)dh%(#&$ulru@EI6H!D3+j;CMkblhK)t!5QgX zQ}B3x3Ma#ZhawD?k3<+sK=(s|=6;@VGYEms76qM8h%OI08{rEl_zcShH$@m!Z;3EW zfS%on!UvVZpmQh>i!iJ`A_ARHVPKem#Aj6GR#i0NXAo6}&icZ3R|haKfbUI#-UlU{ z!pR^8Ix`FTJ}7=>27V>(51gR7)_{k>;0XhR`V~e7r6WuXvMC%4qR=)r!&?ys{_5^eW0tfgkM9_Jr4o;#B z=}w~1xhw_-R6b~)4|LBOCv4y4Wkn`gVPrl2HPiG3>GPz3m{r zL@tKJ53lW9(4MFol5Wfl_iG%0llTiC+pnLHk>7I?Dph1-3LxU*%{4-=e<2F8q zZBN)4GQO}eBwyiUh&#f|5Lvq z)xz8lntwnOgNE+{c~OQZ@`&(7;e*teurN%}7iHL>4@*~|b{(1+R9%9eC_}RzsyY-g zm^x)qhI(Z*b;x2+br%dp89o`p)G;t1^TA^pMH~-cH+q2EfM3|aXUlBR6lLJm5@q;c z0?F6Ne8xN$hCJvT2ROV_*cb{7L>W#Sz`}|Fh0mzOt*T@q$snOD{0Y4J1i2jIVq)N8 z6lVbEYL}MWOSx3=AlIki8k8bA&h;8uCOLcIAme&zpwKE1-%opsE3nSwiw-!vs-=_6eep zatUN_2@9A%Wr8Tf1T%>HLGs9aWIf=vTM+LDaK9#i4RRLI6MhCR=saFRk0`_O9#Mun zV6#ByB=a*clz{G9=3zjQ<7WY%n*%B6Y^40c~w7%Z=_GMF4;W6&?*WzY)YVNf;UX5dKzjZ{O|8iCFOpDxO9Xgb2K z4aj_uT`BAg0lcCN1-#IF2ofvd0Q1-IiZbjlhmJplurYx67kNb)&Va-i7%=!CGeBy< zdKefm&COt9FyIqq2;&ol&XX{p@FDjh31Hrb#LddUox;MvZNdyWcMjyn5GIBPb3_>; z=ZZ2USU}Bqx@hoaYs>xDNr*& zYLNNJ`WQiJG6mf4gRHGE;b2fm7G7XkJN!jX@)W zgF&`Ln1LfjgdyRWC_}_?QHBYYN(|t+6%$?t5hHNDRKT6U6#yP%xWdE0dW4%{!%tC$ zS3gA=j#xs%8kx^1&dwmd2;8PE;7i~IpSi3EI-C9q7X!-?A%=vlq6~AkiZU=*LG+^V z!C?wHL-4{OQ3j^NqVTy66h4x=2Y*Bvg#IGbq41H^T{t4jz;qO$4uy}T?!iA%2BH55 zbtrr!bq5ZMGQ2}_9||8y-G#rR4F8bahr&lvci^Zf!#gDRq41H^UHC7`@DIs-D11;F zGvQ!pSS`xXwnh}b1__zZxSEe)^${V4`6a>((?dY#rb~hQZs1Ye3# zgh(-PGD)WT8-)+@7wEop(B0b-VhqX>Vhk0{(6dWZ zIKX@-2{8s88;D+zJTjjFSr6!bZP1xuN4OcdKz9O!a58)l5@S#h7K4NXG;BcpIAJk{ z3Xqu~u`etPAbzE=7{d&Z7y|Z`;`?uKf#c~#lR542|jNf#XiuwJJ3F- zBiszQ)qu{JMKuT23U;;V&I{~~dCy42QB517O3k!pA2{!`|D2_}x7!m}<7+M6y7)0z~ zbqgn$|3*-ZK?WxFgp~orXBQGFMkj!P2;bf3`BFi9CBEuk) zBF!KJnu`IgtpN3DO{5qm$cr(Ykr!i_0yP_%4;c%VWMB*wb`6{%!r;~+%3xC=#$c2o z&Ys!14Ds|7(}xehNc+9Sxqs912xdL z1Tr6_<_R~$1Zy#d4c1}|Ym5{b6!rMPccp1&urR26;bM>n-=QMNAQU3Nz-qz|R`!*bn1SWx7u#olBAio?DWKggaW0++r#vtPW2^SPT=q%0(W(HQ! zUD{S+40%>!3@%W03`l%NF?I&AL*R3=p*H|S+dfyg83J_07*^|wG1P$cf&6)d2h4x2 zE5@IhvP)PVJX+BHb#g6DH!>wXfTYvaCfGcf3gF@)=g zG5i6U39`F{3(W7=5o6$Sg!mUEkIYBb!>GZ_pmF3NgGR{#291>c3>qf;7&I7nK}L2# z;}D=W(IWN_tl*pJ7#I{4*%%Z-=dOhaF>sg&FdT>#W6+2bV<-XJ1)6UIm03b);tVK! zaGssSl%NP&-wtZun(#0rB#1E-C5SPc0Gq>r!e^A`W{@^9V~}Rlf!ucuAMJv!VJXpK zI8Z6ZaHmp?;RtB11T+?zqRYTxq5~HDTq(vN;sgl`kQ!t@iat>If%+7sVhr0##TXLo zp!G!wJDA^ECdQBeHV0Jxp^Gt~sbOF+KsP6ajbTHM7{iksF$M7=uEQ7{ddwI~Y*;AoqjrVNMidxS1#hZ~GoV;)BQj zQ@BCvS;6N~gUb#R4u%EEVhrb##TZYe=&rO;Xs}k!`(bF$e0Jz-5|bJz8J#+sM+XzWIc?W%nY22 zYKZngi3Y=kVlf7R5-|oI7f4(q^BF;XHAYR)Tw4OT{SczgAdoJ`5SA{+U;|PQy2G+W zje*xhgMk5E4m6isq6QXcFwsEK#|S!)ei7#f@aQDAhSW` zP>3LyADb=4ummIq>epn6F(C6%^q|d^CnSk6R3?eR=gN`!jG#Ur=)Q^~?gU0zP6pW& zD+XB;O9oj+6Udq%P(GI9V31?XMC^9}l_4N^Wf(C$=n-RJ>=k3MaaCeav|wSdC`o59 zFv&m>htwa+pz&AY?L;L5Q&r(#Hb1A!Gu>hh<_6Hp|5r4uJJDpzs+TIT##E#2L&(L_z02Jpi>T z!0EPxok3x`7(>i-XgXqGK;bhgg6`!~XHZO0V^9oHWl%H$-QTRh06vxd00RT~{uM?K z(E2mjDaYVFDB$$*C6M96Y%zv^bHo?|+#u-*nGc@tOkxAwAOxAq2CXFp&3A&%J}%*5 zxG-OgL1Td!Ll0ChGM`b5gF%c@8B`a8Mp_c!^BN`E3USCNz{;Z|GZ;2Z5@Yb1EXGja4hbVvJ`)22ni}vrH|W{X;C?RT?uG(J zF)mjzXTd|@kz%CSU`*yRuh<~Qa0DdAz<|LAnE_G*)&p8sfMhOs{OA+76auFw@Y=KzK?VU60S19h zJP#D*Ss3I~_!(G3_!uVa7h_ml`lXt z8(e-Kf~}xqV1TS)2i=>?4PK`OT0=Ksw;02X-C_(^p!$*djG~+jq9&3IqKrZed>?oo za20SSfX-qD&o!m!Gl+-iF^HS!GKe#3f#+z!_1`C?F;&nw_7_P8G0>We5^;uvi((An zm&6!cydY@;nGc=|OW|V>HQ`|pEdsB$3;?f%3t|P8Nde$BLtl6qxJq~!SWUPYK3o-J zkh&(uFa>HBG9SFIo3WpPwSdI{9KI=i3>+bo7#tppG0cA~#&8Cz2bm9bJLsfq$o+Mo z@J|tANO&m5p!rCQfx#Q(X3#h|x)=kB8gRZ#f!>!3N_!@p3<(d!7~VY)WAFf*!GOXC zmvv6CRVvVSFX-&{H)0Hr-iR?&fb@XscF-732sc~LDbDal zQ=Fjzq+WrILE(!IgXj}u296LTu(+R=I71Ie4%8<2qQk)O#28H+lpb`@#2C={p!pay zyFh#AknD!s)h5IsW+KQSHVNEMJHS)Goxmu^!ys28$RL*@z#tdG&md>Q#~?Qe(gI)< z=K`k%aT8t!@gVTHB4n-{6gMF}3<{j$4Cb8T3;}+Sa75vQ)ReF>6ex-_lqrfs+OeRt zfXoM}0qsBeE5=~(7gkS!{KCc{fF#BU+TUyBP z@CW$=w4W1nekTW-I0FhF(xwE@^As?G)>)?TGKiRPGl&#H*O-}DF(@z^LH64g@FZ}< z+XNO27e0tFbbS?L=m6WtfW`;43DDGl((M&XhArR47*78bV>sfk#K5S+&7fjp!JxvZ zhq&vxKqNsJWKW6+L&^_chUgc33_&;e89Yx2FgWZGWH4VL#Gp4rm_fBegh8f4lz}5d zjDaCYoS`&GoZ$`BEy#R`9aan~j0QOD;A4n>!OswMLx92agdl^%4j~5f6~YX9Gej6v zJ46{|D#RE#GQ=4^xQa8Rx`{Ic1c1Vq0hJGSD{21@C#2Kc46K7Bf zgSY{O4|O{>eFE>r8O+}!^da*ZOZqF z@SCtQ@C$Jl2#Rtrh?a0Nh^DYJh?=l5h#Cn#IAJXT8Zlt_qbk9WttP?HP$>m6g5jK+ z1j9`vz96WbZ^FUA6~tBm(!;{Qz#yzH!C<5=!7v@FheKV0!Ao6&VFQ#OtS-S2ha?Z; z$0NyeO0h9Wnea166^T6%DG*Konajw)z%W%^f}vVNg5gM|6qp8&8wW83fZMPpoD951 zYyq4gKPoXW!1OTdNHFy3NHF}WlmgR?OpFZRwOycdBusWOh%)YAU<&|yjR9l_hy|mW zm{=H?#TeL_5*Q0WVoZ$83`}ASY>WjAV6`AIPF_X^-X?^7ckLt?-q=Yn2vtdeX>c3g z3A92Ap$DW-Qihp|S24A-iq!1V4|35NA?5)5yuA#wOBPJ-bB5?@k)gF)aD zc%B3_{!{=OPXoDuiGhLPY_tT!r)UWV%W5ew4dQ3TNHD}f&0>_{fvklN;bD+5;bM?6 zLfYdj$;BX9!p|U?!p9&P!pk6O!owgrN%R4DA6W?}gJcQ^gJcLhgQN)?gQSt@15U7d z9tO!2ZU#vcF8H|@Ft@Drkzjb_D*+CB89xaICO-)V5Df}X5X}ir#~c{x7$hI$C&6&S z52E*;p9F)XIv0Z^qbg|p@&V`saPTe^1Ev5_TnI3N#saw*q)bE@q&A`6$IPe-x{FMi zL6uPgGHwVj?HCxq`O66p4H^?n;b-7C;RD_OSO8x8kiyL%62i$KV#2{75+qO{2|Ay} zh{@nfg%sGIkCP=Bm{KGd_-mxVG$T7B1G^Ig10>I)-j@jqCy-w)vLqOeXGt))*FfT1 z5Ztd3WDqwIU=S}t^lL!sL2*1WLxRCAQ-UD@s{Tl(1j8L9z9cx0vw`*<6u{gipC-YO zmWE^pc+8m%G>-r-2SDz)l`6sTIaPu|7iuo}yz(N}06{EjvvMUEuI5TGG(y!13b8Q= znFuflZ32(0z{>!RJPC%4c@hkBVCt}#^(s$-;d>s!EJ@J#stGTHSP-Hg2=j+%kpx3l zkp#m|sCkS6tPBE-VhoVg^xhF(RxOxfmI^Kxr5>XJ*0E5`+7#J99#TaT=FfjzrU}muFU}4azU}aFq0IiD> zXOIaIV~{ZsWstc9cV7V`=#HccCI-n2W(E-xK~SF(W%nY)PKepy@)=adgWQ5lgX{(I zK{V*h!3s78-V9a-cFuN4+Ddw0jSSa#VF5MzzAN2g|u%JoLGF`C0Qj!y z5^e_B6fOqY5KabJ6Aswj><1*}Ss8duav69TGr;%Og6uY62A#hF!BI8UFwO z|6dZ+4m9Cm5S+vn0FvkER{)D&v6ld=dp8TTFM)x96IAvGF@fuGkR5YpN-}(#DamlL zMvB34mLvnV{F^vak|ArRB%+KJ=3o#u;b9OC0@vr@(Lq68MsU6a*&WfZz#u5h$iSV% zzyRVm^eZq-Sq!lsoB6VfBpK8fAx^ znjB`3W!#67wjY4XOVB+tMNC-h0Mj*+46bVsc42eR)-{q0rwOR}3zA=p-<;Alk_^ot zb+B?DG&Wbl$N*{2a>CoQpm+$|CCPAgmn6eKs9Hf#JQ*S4$!@PCL+D;f2Ju=*eG49^ zEfHssNfBd^2@z$GF%e;qVH9EzeZYV<4v+4YWRTw{$zTA}FT%+n@(6wAi-AEqKZ3~VPP8N8rofa(%e6D0;oMk&ZV2? z27?(245z`VkAdOL0cbkacQkefk1WEzva$rL7e z#y%!QZ3gEIL+@2IkW}MjkjUU=5Mh*oo?QVN9f$bw0H}NhmSPB3mSXq-RRf+IO@W?!6~t2@2(B|Y83clO;BI)SBE|4cMT&v5 z4w}co>71QG#DopBb{X1-=0d)|{sYXuesw8^YwA+)@<9?yK8BU2v$Uibu4_rb^RXak z4B!YigG>q+gNz9$ynh8VI})^}&_s$s5#}yXdN2`V0G-Pr{6O#m?0g@{dQz~gc-z5gcyX4QRf~&X(IxZHo)!W ze^}eg57-$P7(sJ%DVz-AAsh_iChQF2M#2S*;IfyA0X&}xKYxn}(w_pIod6225>5u` z6j1rc&LC|h5&&*1Fm{2~?_2=gHw?00fQ5lU5p-VAmsSRak~Rj3ly(MzkPZe8lTHSQ z1Sy8u2~rGy(jjdoWWJ;>Zzzi2g0cIJk%N(eV-YNkqV{!Cv!obSXGy`!a7j51P#OlW zsRH*c1DFgzZZrV(^FilYrGU=L-~^=|P`Dp}#ixF;6oW;v6u3+R(VR$qFPNIz5-Ela zB~lCybr2d{-f%K9aDv*bVD-EVTt%Q=_Y4dRq9APyhfF0<(S(9QeZPoIC58qpat}T! zgVloCFCYfU6alDNAU+Ipe8yClgGC)oJ?yGU91cnx>y+wbg?pA=wfAf(8bE|p^KG)p_`RKpqrIJp_`S#pqrJ! zp_`Q+L;LyX$5YWTQkkG@*P|(B5(9pxmFrkN)VL=Zo!-gJKh66pU3>SJ> z86NboGJNP^Wnk!KWf16PWl-p4WiaSvWpL!x z1SYUDC`@2wFqpu~;4p!eAz%V4L&5}BhJp#K3=I=l8753%WmqtQm0`mKR)zx;SQ#!% zU}bnPftBII1Xc!yiL49)6ImG)CbBXZOk`znn8?ZyFp-rZVInI-!9-SuhKZ~U6DG1U zESSj3uwf!A!-0vc3>PM{GCY{b%J5+#D+9wMRtAAdtPBd1SQ!i^u`)PJVr2-J#LAE` ziIt&X5-UT)BvytAlUNxROk!o&Fo~7nz$8|N3zJwG9!z3o_%Ml;fnhQ$gTQ1~28GG2 z3G4pUee0;aGsBurstD44>^&@hFSVZszvh6Pht88%E| zWjHW}mEpn^R)z;tSQ$P{VP#;L%E}-xm6btZDl3D*R8|IusjLhEQ&|}jrm`{=Ol4(g zn99m9VJa)bf~l+w8>X@{9GJ?=aA7Jd!-J`;3?HVlGB8YIWe}Lg%AhcfmBC;dD}%!{ zR)&CStPBa$SQ!eYu`)DFV`Z2yjg?`+G**TU(^we}Ok-uZFpZVr!8BHe57Sr~7^br_ z2ux>XP?*ljU@)DP!C^WpL%?)ahJxv=3=Pv+8753;Wmqtsm0`nlR)z!9Ss5-&XJvRW zot5FkbXEq28LSKfGguiEX0S3C%wT13n8C^rFoTsLVFoKh!3RjwGCY{U%J5+ZD+9w!RtABYtPBb>Ss4swvNAZ#WMv4L$;yy0la--h zCM!e3Ojd>oGg%oH%w%QQFq4(xz)V(#3o}_69?WEA_%M@|fngRagTO3S28CIy34+~fs7#6ZJ2rOh}P*}*yV6c#t!C@gQL%>2-hJ=Nz z3 zmBC;MD}%!lR)&BjtPBZDSQ!eIurf3(VP%-Ggq2~z5>|!{OIR5WEMaB1u!NQ2!4g)6 z4@+1X7?!d!2rOk~P*}>!V6c>x!C@&YL%>p2hJ>Z83Pez!ZKEdf@Q1> z4a-;=CM;uRSg?$hVZ$<3h6Br387?dXom0cg@L?G%1H*Dw27%?Q3<}Fx84Q-QGB_+} zWe8Z#%8;;}m7!ocD?`I_R)z`7Ss4~AXJy#1oR#6ga#n^5%UKy7EN5l-u$+~F0dy|q z3RVV%6|4*fD_9vER+vi zD_I#ftYl?4u#%PG!b(<#2P;__KCEPAU|7YXWL%}*$hK6;l3=`I|GAvlf%CKP_E5m_xtPB^{u`)bZ$I9?w9V-LFdR7L3 z^{fmE>sc8L*0VA=tY>8iSkKCku%4BnU_C2C!+KVR3F}!I7OZDw*sz|J;lO%Uh70Ri z86K=>W%#h3m4RUcD}%rWRtAL)tPBPlSQ#8PurdT}U}Z?yz{*gtft8_Q11rOX4Xg|c zHn1{m*uctgU;`_|g$=9>3>#S)1U9lVEZD@#uwfG`!+}k#3>P-BGCbJC%J5+mD+9x3 zRtAC1tPBd9Ss4sAvobhrW@QN2%*v3knU$enGb=;GW>$s?n^_qaY-VNHu$h(Nz-Cs4 z3!7OP9&Bc1_^_Fkfnf_PgTNM628AuG3 ztPBgburh4e!pd-93oF9~ke;oq3=Uga849+tGA!82%5Y&TE5nDatPBj>SQ!kqu`(oV zV`Z4Ijg?`+HdclW+gKScY-443u#J`B!!}k1hV85j0^3;`6t=T67;I-{aM;eu5U`z< zAz?c!L&0`dhKB8|3=_7qGA!86%CKQOE5m{9tPB^nvobu`&dTs%J1Yaj4ps(%9jpur zJ6IVEcCa!y>|kXG*ulz>u!EJMUT z*vZOpU?(fXg`KPn4|cLLeAvm#z_5#zL0}gvgTgLW27_I!3=X?k83J~(G9>I`WhmIi z%FwWjm0`jzR)z(;SQ$3#Vr4k6i?yIyI2`M>|$kL*v-lyu$z@ZVK*y-!EROt zhuy3U0lQfl5_YpP6zpbYXxPolFkv?$W{G91{=%5Y&fE5n1`tPCG^vobL3 zVPz25!^)trhn2x#4=aPi9#)2cJ**4~dsrC?_OLQE>|te?u!ogl!5&tI4SQG_4(wrN zxUh$n;lUnOh7WsK85s7mGCbJJ%J5+?D+9wmRtAB6tPBeKSQ!lVu`)R9V`T`~$I6hf zkCmZdA1gz{K30Ya`&bzk>|kMjhglgM4zn@@9A;%mILyjWaF~^$;V>)1gu|>13l6g~ zY&guyaNsa2!-d1F3=a;oGJH4;+Rw?#AaI10LE#81gTWD228Sc83;{=284`}LG87zP zWoS6U$}r&wE5m{#tPC5DureGt!pd;r2rI*bBdiP`j<7N?9A#w?ILgYPaFmt7;3zAD z!%yZmEplrR)!BpSs56P zu`&o8V`We{#>!xDjFrLR7%M}-F;<3zW2_7X$5jloL%|7FhK3WY3=>YUGAua3%CO-CE5m^ktPB@UurfS2!OHOA1SNmd4dldKF1 zCs`Q`PO>sMoMdGPILXS8aFUgw;3O+U!%0?#2`5<@7Mx^d*l?1S;lN2&h6^WI86KQu zW%zKCm4V?DD}%r(RtAMrtPBRHSQ#8nu`&dlVr57;#mZ1{ij|?^6f47oQ>+XJPO&mv zIK|5F;1nyvhf}N!45wKc1WvOuD4b?xFgVT1;BcCiA>cGCL&9lRhJw?q3=OAQ877=& zWms^Um0`naR)zzoSs5;zW@UJAnw8iaE6s3 z;S4K7!5LPDhBK@T6V9+QEI7l;u;C0V!+|rb3>VI@GCVlL%JAU~D+9w>RtABytPBcg zSs4t@vNAZFWn~CB%gT^&mX)F4EGt99SyqM#XIU8*oMmO$aF&(fz*$y?3ujpw9-L)m z_;8k$f#Do0gTOgf28DC13|863{BG6bAsWk@*3%205Qm7(DrE5n3ytPBgzu`+Bp z$I5Wv94o_xbF2&x&apClILFGsaGsSx;5;jX!g*E(gY&Em4(C}J0?xBCB%EhuC^*l` z&~ToWVZwP61D9DDE?j11cyO7O;lpKC28JuF3<6hJ85FLtG8kN8WpKE{$`Ejcl_B8@ zD?`B*R)&TvtPB&bure&T!pgAW3M<2bE36C`uCOvZxWdZt;R-7Q!&O!Wfvc=I9z3A2)N41kZ_fiq2MYjL&H^8h6z_$85Ue+W!P|)mEpiuR)z~#Ss5N&Wo7tq zm6d_v8Y_dqHC6_NYpe_g*H{@GuCX!%Tw`TOxW>v*aE+Cr;TkK$glnt}3$C#;Y`DhC zaNrs%!-Z?C3=gicGJLqk%D`})l|kS-D}%yyRtAIXtPBpyQmEplH zR)!C^SQ!{@voZ+WW@S*g&B|bKo0Y-gHY-EGZB~Ya+pG))w^xXsF-KU0ap zZKe`K(o7|W#+gbClV&P0ESagquxq9g!_ApW4BuudF>uXNVo;x@#9%T@iNSf65<}uF zC5F;jN(}w8lo*!IQerqbONrs;EG33_vy>QEXDcyC&Q@a3o2|s)Ia`S#WwsJS>ue>4 z<+GI-4$oF%csg5&fn$ymgUTEw2J1OW3?Xxr81m*QG4#z*Vpu;%iQ&*3C5B6Llo+1R zQDXQzM~Ojbt`dX6TqOq2xk?NfbCnqC=PEHQoU6pJXRZ>%*||y#FXt*T{Ftl6z&lTg zL1ms2gXKIW29J443{mrx7_#RnG1SddV(6cz#IR(Z62q2xN(@KmDKT7~r^N7Zo)W|7 zc}fh-^OYDx<|{E6%vWLvn6Jc;Ghd0JeZCUI{P{`@hvzFXT%E7P@MXRd1N#Cc2K5C> z3?>Vd82lC}F=Q=JVyIo9#4vGz62poGN(}oJC^1}Fpv3TEffB>d1xgIO3zZm@7b-EB zFH~X(S*XO2u~3PjYoQXuiiJuHdlxD(TwJKc@NA(H1JfcU2FXQA44R9S7_1j5F$6AB zVn|-3#L&D*iDAYfC5DxYlo<9bQewEfNQvR&A|(c%#Yzn7itR?V$fWn#9+Tdi6L}_5<|ucC5GA+N(|FiC^4*Cp~P@(g%ZP)6-o?W zS12)Xu2f=>TdBmLzfy_8ex(wF|4Jo>l$A;h#VeHRJlo;|?DKRvyQev38N{M03DkX*ktCSe7uTo-o zxk`!Q-zp^riPcIBrmK}0B33Igl&)4{n7&$xVZ~}ChP|tm7_O~WVtBb)iQ(UBB?jR& zN(?${lo)*1C^2NLQDSIVqr@3%(!fTZnbk-^{ zIImS=h+3<}kh@lip=GTS!-BO+413oqG2C3M#PDIQ5(DQtB?hH+N(|2Hlo+DcDKXTn zQ(~CEPKja9Iwgjy>y#Ltu2W+8vrdUYWW5rD#(E_NoApWzKI@ej;?^rMRIgWJn7Cev zVdZ)yhU4p%7_O~XVtBn?iGg*45`)wRB?h|Pjlo*OPC^2+zP-0lRL5bnm1|^24 z8Af(xlxJ1e4`SB??xqtyp2i>^&6EKCTvti6M52 z5<}G%C5DMxlo*z6QDQi{MTz1579|FTtx61XTa_4Wwkk0MZdGE)->SsWzEz1~##SYU z^;?w~j&4pI80@zxF$8T>V#wO2#L%)$iDB_JC5GMGlo&2< zQ(}0tO^JbXyAp%;b|nUv?Me)>+m#rqwkt98Z&zYixm}6j=yoNB$J><{{%==eklCTc zpua%hRPjE43l>#F)ZGp#ISpZ62s*kN(?V{C^0bYRAP|Wsl=eOQ;ET5 zrxJtTP9=uaok|QPJCzt3b}BJU-l@c}e5Vq_)}2ZWM|UbQ+}x?e@N=gU1Me;+2IXB! z3{Jb07!r3WF_iC8Vwko|iDA_)C5FShlo)RBQet?wONoJDw-STMZY2iY-AW9OyOkKC zb}KQI?p9)$x?721-EJj@qq~(D9`06R_`h3;L1~W?gUuc#hM+x43~76m80z;ZF-+Z~ z#IRwH62rkgN(@)_C^5X=qr~uQj}im_UL^*Ny-EzWdzBdc_9`)??^R-`+N;Dcb*~b` z+Pz8)XZ9*FJl?Cs@P4ln!~eZX41)WV7}WPEF<9ekBH({Ynfb`;{2{_A4=@?pI={-><|leZLaJy8TKFNA@c*Jl?Ow z@Oi%y1MdMP2F(LX49*9X7~&2nF_a!qVrV^}#4zW862sa9N(_4sC^1|;pv3U{fD!}y zK_v$1gGvkr2bCB+4=ORl9#mq;IH<%>a!`q(`=AoT@`FkY#||nnygI1Fz;62q<|N(?8DC^0-ZqQvmyh!O+OQ6&bYqe=`WN0k^njw&%k993e-I;zCb zcvOjD-ccon14oq@ZX8u&cy&~Xf$^9UgTOH*2Hj&y3@*o%7^06UF;pB=V(2@j#IW?3 z62snON(@(yDKWf0ro_N>T!}&YxDtcGaU}+~<4O$i$CVfgjw>-VA6H`NJFdjA__z|o zuH#A!*N!VOygRPMzvo2Tv+7 zTsf)4@a&`#!`G8a3>>GF7!*$_F<6~aVhA~<#E^bUiJ|V462qiZN(}2xDKQ*7rNnUU zloG>-Q%Ve+rpQAIIYBxdRmF0^0X4egK{IIF~P=ad*~&M7g> zJg3C4;+zu0_H#-Mr_L!c+&`zp@a~)v!=H0X44mhc7{t#jF({l@VlX|g#Nd8ji6Q>H z5<}^EC5Ha-_0Vz_ugiQ&NoC5A5-lo;49Dlv#$ zRANxSsKnrKQHde)q7p;aMJ0x+i%JY#7nK+mUsPgPeNl;F_eCX!6Bm^ju3l7Pcz98X z;lo8G28K&Y47`_=7-TLfF=$*;VsN~q#NcyDi6P>W5<}J{C5GBdN(>V&DKTukq{MLP zk`lx7OG*rXFDWqyTvlRGzO2Mxa9N2VJ#4z=W62sanN(?)$C^4M8qQr3HiW0+%D@qK1uP8Ba zUR7d{y{g2ZdsT_S>8cV#>{TU(+^b3qHCL4wCSFxyn15A?Vart|hLcy77@l5LV)$}Z ziGk^w5`)4uB?hx=N(`ablo*PxDKT_jQ(~BXO^IR2H6?~^*OVBJT~lJXc1?-l;WZ_O zkJpqK{$EpK;JvQIAbnklLG!v2gZXtO2G{FK3<1}b7*eh)F;rexVwikgiDBV&C5H9a zl^FJ3S7JDQU5Vl5btQ)9*OeGPT~}gYx}n4%dP9jp=Y|r4;|(Q-_!~+L#W$1~Cf!hC zSaCy%VebtkhRZjU7(U!kV&K22#GrXoiNWrs5<}=sC5DunN(@yul^ABy{FO)-5Flk6TI%F}IW$%5Et!bly^8n0rf!VZ$vYhGVys z7_Qz@Vt9H>iQ(%lB?h+JN(>UWl^AqyD>2yIR$}nEt;7&_TZy6cwh}|{Z6$_fx0M+7 z-d19`d|Qd(`E4ZzhC50Oe0P)>WbY_3=-*LdaJ!?#5OGI|A@7b7L)RT8hS_(N7}nlV zVmN+BiQ(2AC5Eqelo%N9Dlv%MRbtS%tHfY(SBb&-t`bAQT_uKuyGjg&ca<1A?BQ(}<3uf$+|Ux^{^z7j*teI(!H2s}_?kb9uSVDvzV!S#U>L(~H$hN=fj43i%yF|2r?#IWmu62sL8N(`SLC^2w8 zRAP{MsKj9LP>I3op%O#FLnVf)he{079x5@cd#J>4;Gq)3nTJXYPaY~Ue1E9KAo56w zLH&^ugVQ4=hS*0+3>A-*7^Xf_Vp#u3iQ(KMC5GpZlo%u@XbT zVGo7REfd%sS-oTQzeG%r%DVhPn8&E zJyl{@^Hhmp`%@)`Gf$Nm9zRuL`2SRiLHwB#gWfYG2CrvI3`x(F7^jDDKR{Gro`~~nG%E8b0r3y=SmFD&y^UWpDQtxKUZStd9K7T@3|7gj^|1Y z7oRIJyn3$0@b|eAgUAad2JIJ03=S`p7(!ksF=V|^V(5IK#IWFn62s;fN(@I|C^6iB zp~Ud%g%ShLOC<({mr4x!FO?YVUMey8zEon!d#S|G_)>{s#!DrJjW3lLPP|lNc=%F@ z;loQM2F_PX3<|H57))L%F?hUEVu*gF#8C4}iJ|wE62q)lN(}2?DKQ*lo;CHC^1ZZqr|ZKjS|D5H%bhb-zYJ>e51th z_l*(*?^`7XrMF59#&4Av+}>VHVz~EKiQ&^* zB?h*4N(>V3lo+($DKS{RQ(_2ur^Jx|PKlxAof5;WcS;N!-zhPidZ)zjw6^z z_4i5)-tUzdlHMyZRKHhZSomIvVf%X}hLi7=7#_V>V)*c0iGlTl5`)wSB?jFON(`2#V%YmpiQ)1`C5Cq&l^FhhRAS)yq{JZo zNr^%0lM;jFCnW}tPf83SpOhG4J}EJzeo|t{|D?pw_(_Rj(kCT`*`JgcmVQ!V*z`$> zVfQB`hNGX97%qHLVz~85iQ(}lC5AVjlo)<|Qet5Hti&MrS&2dFvl4^KXC(&1&q@sT zpOqNgKPxc=d{$zJ`mDr|@>z)?=d%(+>1QQ|y3a}s9iNpLCVf_7nEP3YVcBOTh7F&U z7AOop!`LN!QhJ$gXb3|hQu#Q3^iYr7^Z(wV%YFS ziQ&Q*C5G2ulo&X_Dluq%Rbnvzs>I;(Rf!?&s}e)#GvO zk*`V&SH3DSJpQW0@a3x#1H(5Z2A*$93=-dz7*xI~F&KPPVzBw9#NhT#i6QWt5<~1a zC5H5GN(@Eclo;y1DKT_?Q(~C*O^IRAHzkJk-;@}3d{bgL^i7H3)HfxDE8mnD?tfEa zc=1h%;qx~ohX3D`7&yKwF$jNGVvzf;#Gv_IiNW-{5`)8cB?h1GN(`ajl^Ei`D>3AK zS7IppuEbFPU5TOdyAs3H?@A2wzAG`T`L4vU=erWa@$X6u7r!ep-2JY^@bbG7!{_fx z4FA3>F>wA+Vi5hI#Gw8|i9!E|5`)DLB?i|YN(_EKlo%p@C^01cP-4jap~O)0Ly4jL zhZ4iIA4&`he<(4m`Ju$H|3#9;JOiNW@#5`)K2C5GUiN(>1jMkA5jJ zy!)lZ@avZn1M6=k&?;62CI)5(76w)ZHU@SE4hBvJE(UG}9tK_pJ_ddU0R}+^AqHUv z5e88PF$Qr42?j|9DF$f<83tJfIR<$K1qMY1B?e^%6$VuXH3oGC4F*jHEe34{9R^(n zJqCRS0|r9|BL-sz69!WTGX`@83kFLDD+X%@8wOhjI|h3O2L?w5CkAH*7Y0`bHwJeG z4+c*LF9vT09|m6rKL&q>0ER$@AckOu5Qb2OFotl32!=?8D28Z;7=~DeIEHwJ1cpS0 zB!*;$6oyoWG=_AB42DdGEQV}`9EMzmJcfLR0)|3{B8Fmy5{6QSGKO-73WiFCDu!x? z8irbiI)-|N28Kq4CWdB)7KT=aHimYF4u(#KE{1M~9)@0qK8AjV2@De%CNWHAn8GlX zVH(49h8YYq8D=reW|+e;mth{me1-)K3mFzMEM{23u#{mL!*Yfd3@aH{F|1}-!?2cN z9m9Ht4GbF@HZg2w*ut=tVH?ACh8+w$8Fn%3X4u29mth~neue`K2N@1A9A-GeaFpQ~ z!*PZa3?~^*F`Q;N!*G`29K(5r3k(+-E-_qYxWaIi;Tpqrh8qkw8E!G$X1K#}m*F16 zeTD}N4;daYJZ5;p@RZ>h!*hlg3@;g8F}!AY!|;~j9m9Ku4-6j}J~4b|_`>j&;Tywu zh93++8GbSRX86PKm*F47e+C9dMn)z^W=0l9Rz@~Pc18|HPDU<9ZblwPUPeAfentUC zK}I1)VMY-~QAROFaYhM7Nk%C~X+{}FSw=ZVc}4|BMMfn?WkwZ7RYo;Nbw&+FO-3z7 zZAKkNT}C}deMSRDLq;P;V@4B3Q${mJb4CkBOGYb3YepMJTShxZdqxLFM@A<`XGRxB zS4KBRcSa9JPew0BZ$=+RUq(Mhf5rgDK*k`(V8#%}P{uIEaK;G6NX96}XvP@ESjITU zc*X?AM8+h>WX2T6RK_&MbjA$EOvWt6Y{neMT*f@ce8vLCLdGJ-V#X52QpPgIa>feA zO2#V2YQ`GITE;rYdd3FEM#d(_X2urAR>n5QcE%3IPR1_AZpI$QUdBGge#Qxm6B#El zPG+3KIF)f4<8;Ouj58T$G0tY3!#J059^-t*1&j+B7cnkoT*A1NaT()s#ubb!8CNl` zW?aL#mT?{9dd3Zm8yPn-Zf4xVxRr4m<95a!j5`^3G45vE!?>4mALD+;1B?e54>2BQ zJi>UC@fhQA#uJPu8BZ~uW<0}qmhl|pdBzKj7a1=xUS_<)c$M)Q<8{Uxj5ir?G2Ujp z!+4kR9^-w+2aFFHA2B{=e8TvY@fqWD#utn)8DBBJW_-i=mhm0qd&Uop9~nO}erEi_ z_?7V+<9Eg%j6WHFG5%)!!}yo+ALD;U1|~)(CMISk7A96EHYRo^4kk_}E+%d!9wuHU zJ|=!90VY8vAtqra5hhV4F(z>)2_{Js0H#2uAf{lZ5T;P3Fs5*(2&PD;D5hwp z7^YaJIHq`}1g1o$B&KAh6sA45mz`ET(Lx9Hv~RJf?i60;WQyBBo-d5~fn7 zGNy8-3Z_b?DyC|t8m3yNI;MK22Bt=)CZ=Yl7N%CFHl}u_4yI0~E~aj#9;RNVKBj)A z2}~22CNWKBn!+@dX&TdXrWs5#nPxG~W}3q^muVi;e5M6V3z-%%EoNH6w3KNX({iR2 zOe>jIF|B4=!?c!Z9n*TI4NM!EHZg5x+QPJzX&cjarX5T>nRYSlX4=EFmuVl2B({ZK~OedL6F`Z^Q!*rJE9MgHG3rrW8E-_tZy25mo=^E2@rW;H* znQk%NX1c?4m+2nUeWnLY51Ae@J!X2s^pxot({rX5OfQ*UF}-Gb!}ONv9n*WJ4@@7K zJ~4e}`oi>;=^N8`rXNf{nSL?-X8ObQm+2qVeXKer5q?L1rOlVP+9#QD!k_ab^i-NoFZ#X=WK_S!OwAd1eJ>MP?;tWo8v- zRc1A2b!H7_O=c}-ZDt*2U1mLIeP#n@LuMmpV`dX(Q)V+}b7l)>OJ*x(Yi1i}TV^|E zdu9h_M`kBxXJ!{>S7tY6cV-V}Pi8M>Z)P86UuHjMf93$@K;|IkVCE3!Q06e^aOMc+ zNaiT!XyzE^Smrq9c;*D=MCK&sWabp+ROU41bmk1^Oy(@+Y~~#1T;@FHeC7h?Lgpgo zV&)R&Qsy$|a^?!=O6Dr&YUUc|TIM?Ddgcb^M&>5wX66>=R^~S5cIFP|PUbG=Zss25 zUgkdLe&z|x6PYJ5PiCINJe7GG^K|AJ%rlv1G0$e6!#tOH9`k(W12ERKEiyI`55zY<`c{(nNKmFWdFBhu7nv_HUuM3-e3khc z^L6GM%r}{DG2dps!+e+d9`k+X2h0zdA2B~>e!~2e`5E(b<`>K_nO`x#W`4u`miZm? zd*%q1r|jX zB^G5C6&6(%H5PRi4HiunEf#GS9Tr^{Jr;cy0~SLTBNk&86BbhzGZu3e3l>WjD;8@O z8x~s@I~IEu2Np*bCl+TG7Zz6*Hx_pm4;D`rFBWeW9~NI0KNf$M0G2?OAeLa35SCDu zFqUwZ2$o2eD3)lJ7?xO;IF@*p1eQdWB$i~B6qZz$G?sLh43y75|&byGL~|d3YJQiDwb-N8kSm?I+l8t29`#aCYENF7M50)HkNjl4wg=q zE|zYV9+qB~K9+u#2`m#?Cb3LrnZh!aWg5$LmKiKFS!S`!W|_k>mt`Kye3k_)3t1Mi zEM{54vXo^R%W{?#EGt=7v8-lU!?KoT9m{%_4J;d3HnD7G*}}4wWgE+OmK`iRS$44m zyZ9LErR3x=1iSdeJ0=&FW)`J7C+4OWCAt+Q=B6SGy9b0i=jY}o=A}55rlqA8p~(f8 zCl(}UBxdG?q*j!a7D2V9q&Sx3=Vm5*=9NIyr=+-+rRJ4{Czd2XK zQA-x*!~#$;;+tPu3{{(xn3)@%nU|7Z?v`KV9uNx2EfAY>QWNt^3qpJ#nbtWcHL(ai z&4UGfU+Wr)ANg=MJ_@Sv~WWRcqA5-WF{l{(4x*c zC%-rqrHlcK1gGW|!=0XAoC?jA5bgQ71&Kwej(I7d5*xL21_cAUTtI$iUJ0~p#3mnV zYy>wKycpgychtE$96FqLfTf z`HZ3_AhRMh2aAYfUW#*mPJU5wL1HqBWhik2u?H%IO-n%~ylQdIFQ{}62!#{{A^8v* z>O-&$G<$~RLm6;6XadQE)(s$opaG9CyeKuX1ePWOOH)gsZiWbhQU;_VfS3su1$)oA zvJ_j6n%|xL{FYUU6D#5ptY?1(E|$yb2S-X)?S)g5vI$Vmt$1j$IqR-@$|s6wR70}}x^(4n~p zDu$XnV1kfjjcf-r(V+;zQVLWTBvO%8KtzyJuuCea=?_VXP?aD7Y<&Tj%;LnPoYdgt zqSVy9;KVYRyEBUmKwTq9lL*x2hnRyQ?3tGWF5My0`Q>>z`H3l@9EDnxyP(RT__HXn z+&v%^-0)3J2`I|U%`C|*gH~QHI3!W6g($+V6(NeMr?em^GdZy&6*=5o-F@QSQ%jsn zi;7b7K#j<>Oh`8nRl+5+xB!+FpfaF>*D)of2v!_Jg)yTBBoUli;#g8rl$lgok_zh` zLfRCrdDtSu6{SA}>wCdOk$PSbAxKF8?{~R^noW)c1-^-ydFZy4f_m5`si?)UYaUb> zEycsdp{)rtU7+qX#Ql)QxLamU4m5CsVD%lE7{t?VnV_yPxb+1U$Vn{DfCL>lS-It8 z7C=pc@=J>|AgwrXcNHNBHUy0eGqbcf1KL`3%PB3+fP@k>xx2e~2bUHXq=H&;pgtwE z@^$x#hZO40`FSO&6_7gH-6tNJ712apD@s!HiZk=`f=deu@{3BKeHKWXf=4*mbr3N` zIzu)bkpPi`0HOgsl|e*7?PpI=B$p*Z#!uXR;(hWHQ+zU$iV~rXE_a`J-^A=xsEsf; z1f>=uB}GU;x%WtCFE2I6H?aV2H$oCQ+EO7MG>9(u#7syZ9@Q{E*q9((xF{1=b-{!nW@4xe$VsdO z4aY&uhejLJ&Y;v}aIY^Nn$Lsa;emJm_`O;ND!BdTA(%{fT?jUnO z0+FeSka0AKK(S|@Z+;#k^}3{{C6?wON=md66e^9>uLKzb(c_b!4soShXEHllwX>c0#9sEL%^+$yb|!RCz^V< z{339Pj42Fnfq~o%G2AV`2)X7?ErFVkoUfoln7ITh5en`+V09+k+2~z1_tX+3p|HfF zOyuGeixk2n_&_Mg3{ZO$(sYD**DWVMu>|T?c;SOJU%`!pcN|d@AxIddSOT?Fz{5Xi zZNdqn0_G-YJ?~ghkdqqh7F?N|l%G=!3SzhXB1E$xwFI9!CM z3d9fvHO)dXOoD2`W-C+*Jqkdn0nMu*A#5ffSGG_uf`qUt%}K1p9w8@R5e2#0%orEudRGH$7fpy@Pp(W3lZL{5UJMCXI@1k9%p6(A85A3=l>W@o}WdZ{I# znRq8i^Au)?r$45jJpGZ|GoJpaUVxPn$OSjDm}g#QNoHaWNE2lA-aWMhChwF8UEP2z z1}-jP?t!VqQAWa~aTJnpX_TNu7DdYU=vIQtNo-;$p$jt$q!_t11{3#4g!dp}LWnqo ziGbn^-6oJ2R+~U&8@ghU7&1s=>&B%fo~ieBWwHA0Fo3^zc8v6}^vgBEN!bV6lu z8Gu&q!CVuZid=-jL_uW%x-}p%tcF910d(aMQLGx^naMk~5>(=V;tHl6DioZYn3oKj zV|7n0@lLHoQw5&scFRvj6b9a@m0&@TLKJ&p5-52HCJ1*7&i1xXetJMrW`0p7bbj1D zwZu2EI2$yK0-m}>ZJhZgRzQjj$dnx1cyw`4`hkxTrIz@n=H?ew!kYRBU766SUy!Bw zDJVVwm#Qcs02aaUK3Eh*ryr=iOw55cxUuxf{7Q2jb8_;N!5uZYV?d(d@fC107Fig% ztB5QPZ}XxELRyKa^%fol$WoA?b*w;i%lt}nVW}2}FsPJ7HUp*{Qqy9S@klH|7WTwx9U2Wi=T7o3wmR|%;)>t%wk`!Dx zC$R+N1UMhEh63GR0qDgas7DR*4O}0%hh3DK0_kwWg9$XZl2}v;O`8bSnYoEYmBFbw zso=ga@?ZyO1Ut337(7sgP!FEQhIF9O1ffnvYIQ(GDnUgYOmUFA6B5%A&Q49t!P2%0 zLKQ|Sen9T&dC58X#hH2O;O;m)yg;U-NnvQk zWi7HehNjRw*jgv|)Dn;_U;#8`If*5iWvQ4Y3?yTKRwRLRBD?`wX9!;PfilzpQ4N}x zLtR`0wiu)ZBn8%nY7$%+%~cRB$fLIq8=x6EpeVH%eH03(0!;V&rj{h;K$nZUf@>-G z2oS^+umT@YR|(a*kkp9W7=)+~PE1R6EJ}r}*@F8SO9+J|7Nw`c8$=MzVZoJoki}DQ zone`&<;Vl_5QV61YKR!3_<-?2^)V=O!B)A#4NWaVE(Ku9p*aUBF9oHRWg>U9gFSs+ z9CI?$5zBJiQ%iyq^HP%XA?s5>Txe|%vfMirUN*uS0U%*y%VFXuVz9-lVTn1=l}8|h z!HdO^yLFI`9>_#QI}##>&PO#JwCD^Zf|9c#8vXL~0`iMWKqF4b1qfD2EZQ-H5TX;) zERYBm1K>qLaApo@#1b3=Zuv#1?Goq&D`>eEateeBgGy%PdIl;S3|e{?l$x8EnTOO? zf%Fie?ncBGWa)upPC-VZZ$5lHA3Dj3k+GrT=tTrf7_{&WIVnI42bTeuhJ%F>%j7^2 z4^aOP41`jscaTytWX(^Iqc1EMLj*!HQlX1;+*3~%)QS>t9fX{f zp;-w%P|$=?iZ7@fMu0)Z!G1*w0yJT4MqzplstH`gAP*qJ#9?b#LEZwdNkU`}$UrJlJQAQ!*q5+AZ1srg96(v@}S64v|1@R%Oz}BKG zg-C(SLzY2akL8|P5?Y*Eg*N3ut);qGJeE4O-EQTKqyK&?XF_qL9_sNJ$qW9+ZmIyuu7h^kxG@ z6K1%8L_G7ru7zh8s9H#Yi0Un935?RNfG7{iEJ2SpsDU~8NszfG*n(X5octtc9fB$W z>A*qy#_$PIumd16L8ZB%rDG_oT|lcLf_y;@38=zi$FK+_CS;K|NL5&bsiBb@Tq>s| zGb|O-IPyp=230lS0Rnh?09g=J^uaVD(z!=sF_;7Kr$=HjwCxX53F}M3_^@OP!*Y zNrF`5P!Z7D7SK3FYEo%BqU86?1BrtQYj9ca2sN}AGF=W{eG!mRSqvH%fS7|K16>aS zl|fE3p2e^v192Qw2}}^WoDwPuT3!dKU10*CA`3-hNElQq1l0b7xDsXuHVm}T%gHwYnH>*Z<_402M+%GsUX}}24U$Gtjy!!0(&C?#1zWoZ z;)XjyyZ~h*v?gbR0~@l)1ZsS8Hq0B49O;vvoQ+s}3*wAtDO#fi|3diex^3%goi<0u8%cXtt)58;s zAS*0<6AM5~+Ay~d_$C&>#yB8M$QXxjB5YkGk}T9$LGDg4MHQL3nN`Rc8!~|9lvq@h znOX$hZ3!FB1bY-kK~QQ=YGQFJnu3zV9O&XmP!|@e3nU0#9Em3Co?3$FWrJ&fG$&hCsmMx1dmm zr6Uvz!!vVo2-*l&gwINlq7cxcB+x!0h^q@y^T7UuG^(+QA>|?eg48_7a4lRRD91u8 zYq%J4nFZ2RzhSU%@v4XeohWp z4U`AUcHnI8UX))7S)dqDl$u+bQ<7PbQwi=7LR2CIq1g;ct~3|L-qPX>Br8gbGZ1U( zL-R60!?N(UO#nm|-31U)*oIOZnjqUaF(o0ZD50SR+hiD6npy^RyTI5&&Nlihi5I#6XK&nG%u?orGh+XbbVbtvt2tjOH;SjQjctwa|-RXvq zhAfJPjEW+Of)_hM!w_8jgDNJZ9rXyMA(+(_R1(sZ1eGq}HXCTaIn2cT#1v?$g|a9n zC^a{~EEOC`h@JTmLC^#~Z2JP#6p&ibU>Fh?TCkvtLed55mU~z%fJ_1Hae@T_m=7Cv zfEt~bn2T8G8k7p+V%h{6$p-Jxg=tDjEduppkehFiu~?+drJ&G(gcGtZ#OBkGd<tP(Y zBxo5hv_b|O4%yBI@9}2jmqQxZ5OI+9BIH~doSK>qt;vE@^I#MgA__2aqxZ%*zqNB0dV$$&J4i?VH+?& z0^l_O;P{8{8Gs1~%mSsxUc7!a*ub&?I29)`%fYR0SB8K@0?~{6;_JX0;&qgtQ=k?0i~!Xt^}u+I6>BZL3^8!ftcXb5>VL;&UDDJ1s4RBC$RW}E_;V` z?@`v5fQ&(GQVqtvv>7A?U%m|EKzfHD9%wN$YKklY*Mdk3oP$$Kz|9wQZ@349g4TbO zr>1}#5yhT)ZaJCh8Ia+H;8f5_9^m;2@HkFl9(1(?R04d04t!`IA{d;USqvKyf{K)+ z<|Sw51i{wX!@>o5^>aWX=%AhwSXlwl2nxi~qEs{sU}Y)X7|0?Mu!m80Sb+?I$oaTJ z#+(r%&~^iw8K9Lqpw+7>&<*tn^^lB-7RHcL$+5H~KRFe&gAQgIL>xI0gUV~TY-U~w zWLGuPN~7S^63{SKW@1ie6?7CQ7_s^ftKVQH3Xk%_IaMhqC5#X!|pD#d>0&7Dx38Vuo3@!;!rkU*QqL`dYPKu3^~gi4E3v6u~-CqOPV zAdW$v+JqZ{G_{EkL!PIEi(;RTM3OGftilZ3;Ecoq$jWuNO3;iXYDhyf3`#ixaWi=A z4^?q7bX?pcKOeFgFF3U%!q5<0A0osu@=J44K-DKiGnfk+kb-f`k#^k$XXKZIdIBz) zi8=Y{pkf+YlEeB*AO%ocouKQMKtiCwOoTqT$zWmdBtFDIxCE$|fJJ?9Cg^|wEapRk z0InUvh0I=o78^h$GSl-CbD)E0;Jvg+!l*}}1cQ~L9vl)}l2}v%DjUEpWr$W3A#9;h zl3D;7Iu8wTgA7dtm!uXTaq+=iH9Rxmk52+3>DM~F# z&VZ&Gs4mc!`;dIlP6CKPX;Lou%sJ>%J*1P9Kx-~Ar5y88VDlF6p-iX^pt)txffArG zcce8%2w8Ap3tO**5QbL(m3hgK$OAhqBsC`o+BbxI)G-;fk`f}FnVX6j!-0epXf!D# zAGS#qt_(Jm165R137U*TOo)X*1h7tkq01r9fkEX^rolprD#H^qOHfl!sB^GMNIpF3 zL-UeQPhSK(6hjo^TF9vmNV9<;0nAB1h$yVhiO`BX@dr_ZmS-V?5Whp+0h-f8@f1W2 zG{TS+fuaRA78IJ7i)#)oG_MFc2n!pO4b3aY-C+wYNCBM~2X{1DaR> zovj0oa;O^61T^v)BT!*b5H9 zmqJ<$Tx+Fo-TB1#nM+W-^eQE}$|Eb|fLh?4rz)RA|u)mPE`b!MM;iJA@0Lv4L?> zWZ`o*5Lx)74TKA+8X;`7i6w|2#LwViYJ}sU=^reLXrqHQAm)}}Tx8cEW|ttc@aZK8 z7uBtZ2_}dv#I1=*kQ9`doR45YR@o$imT;%0#3zEb1%X`)6Gn*WFZll1yx#-mzbyo1X#|f(280YDsEd8Q3NWGrlyhI57<3F=F9dtxA#0ABf(7cujVnGsUW^oQ^&lXfc9yI-B7U#k8WhNvuLlqQ& zmUThdh!K&@;?jZw=-feOaRrj~CHWAy=H$Rx`H_-rf-T5R%`Jvbwn3OC5Mfv*1?5(V`MIS< zxur$M@z9c>ARjVcS&&~2kuNOHFM?FlU>3AEDoV^t0h0LY zX)w`Lgs;G!h8PN3s02}5oSc}G1WCjYCR7+)wjdWMure7G&tOA}^N@<<;zFn=Kn$o6 zAa_7if(jw1U`bJOVsR=gbc-R};u1(94B}=Wn9wLFE-6ZZj&l~56y+pCcXET-(5L~i zp;-~cEQgzshh|$IlFfNYrsm}!wC5o?ry!{ak{gOkii(mEZYxTK6uiYHMM$bkpoMjD zNl{6DHZ%&r97r~TFp=1$C~P>Vv;gXXa-<-JReJF1tt20j&r0$U*`=hY6uOZM%z^}b zX(lY4mm)GwDLf06f_fXNd1c5kURsi70Se7zXduJ*(2#<1;UQO+2+7tE`^r#~M_Dl< z36vEh`>H&-7&(eSTxhhHCl|vas64qC9_?T@)I}gR)HUVF#VBzN<|9mkyAmW0i?QH@g1j^qBrI$eISy1``l!p0Z0|&$($Ds5hDE$vgi*Z8a=Ro;oP}%@0?f|8upmYyZ z9%lY3E{OgeQ2H2@z6PbAK`U8|^;(^#F0i_L~v;&k5gVF_1x&=y4g3|M#^adz>1WI3k(hs2Y4=ByY3$afL zN}E7wFDM-brBk4E5tMF#(vzU{Dk!}RN}qw!PoVTCD9ytMu}=X?n?PwVC>;Z(v!HYX zl%4>k7eVO>iV$;7LHSRh^gk#q!4HwwfYNqQIt)tZLFs8wdIOa1fyVnCDE|YLW)gsy zrvRm$pmY$FPJ_}_P`V9DPl3{lp!6CjeGE!Jg3_;`G>ag_9yKU!2c-j`bR3kl_g3@Q8^bRP!0!mMS(oIl04N8YVX)`D-1*O@b^e1_U`8S~S5h%S5O3#4OE1>R~ z1C7@TD4hbOeW0`rl-7XKGEkZiO8fV0Gf?^llzsuFe?e&;35YrgD6Ijdt)R3Ilum%sB~ZEzO3#AQ z>!9=@D18n}zkt$Tpfr;t#6CVKEd`~GptKj1PJ_~QP!e-MM%dk0FNgVKkf^foBH07_4Q(sfWe z4@$>DX%8rE2Bp=Yv>23Tfzr=JA@*K@(tDuv3MgF$rBk4E2$Z&i(ne5P3rfpCX#ptx zM+9R23n<+M^=}oF&VbSpP}&Dd+d*j!C@lx2UqIuD3Ch=kmZN4++6ziYLFo)AT?eJ- zKdfbQhGafznw}ItohrKxr!|tp}x*ptJy# z{sXn|1(d!7rT0PURZw~klx~62Sx`CvO4~tcEhsGkrKdpS16HooK+DZ(P^}$qoDLLs5s305C&&o&>{ZukS!wd zo-U3I4KOk2{P{ExA9R*YNh(O0Uw%reBLhPQV{mFoX@N^7=!{hGz@29vWG2Hi#gV}Q zCJQylgdrQmhc4EKiAjOP9E*$dlQR=bQemQ&AW@JH5EoQI z7W{-WFqDDhKno$U$eDoTK>8B%QZhjkYM?*~XJ9agi6iv5<>!@zGccrpWc>0=GSezO zeO(zC%0YZo(;;&T3`H;*nAuQqPhVeSBXB6NFu13dfcy{Lmk)|C(0T?(1_mrLjtu+^ zVW~ynJu={PIUE@n!d!!bJ^lT_rX6K;D@sj;%{rZB0?%aSCxfP@Kyxw-&zX^CrNS8) zPBK6)4}fo~4rgG{V01~%Ni9hQIVzl?pV2KdF9m#67Q<99+by%G80=!#if{&oWneMC z)C#arI71xBPLNjkZ34w$buA!q==v}40awKg4EI?e`zDZWuLY}1EG~iUVr1CK0J(Oi=K-RxnIq0J|EpNSVQd6}E*<%G&SIoe0fDy9l7`np3k%8eOBPanuu6zXT zJ_u*XVfIK(EC8)~O=c(nvq3S#z;FfRO6VLJNCgAKCuUGK&jCxDvxS4UJ7**oh2(>+ zb*d~$We|k91lhf=6%0?1W7Cm=;TLNd=-Nfltss!AD0;vXxfKTg~!2(*G0pc<+gn(iW#DuPXWMBwI z69Ku&n+-hk1X9P~4w46_AMhL>gEq))XUGZP$Z2gNNZdC+r8Ebeq(CK5I0M5}geWBK zgflQ0GeXKg&wNm6QupOkzzbv&VC$XR)H3d2)Th9Qwrq45!IU21iC0 z*d;Mgp?HwrA#9LYpeqDHGcyeDpf-XobYx)21*ro0HwDCpCl|Zk_s372D1fnH&HkPLj@y95ln#<3uJjbcrOsVbXI3@1YZOS zTK=7%lgc0lG8@W)#Gn@>cA;Y73

    ttCm248IlhQMG%XDAsD0+Da}EwC=O>}I07yi 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 z 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 literal 269054 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

      cUH)*8Wxu+aQM$A*>@cbz&RqTD!yL2578n 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 Xa(=;L$J7WOa9?Z}!j6)Bq@D!;dh3`U diff --git a/vendor/sdl3/include/SDL.h b/vendor/sdl3/include/SDL.h index ed1b32483..04a05d257 100644 --- a/vendor/sdl3/include/SDL.h +++ b/vendor/sdl3/include/SDL.h @@ -20,7 +20,7 @@ */ /** - * Main include header for the SDL library, version 3.2.16 + * Main include header for the SDL library, version 3.4.0 * * It is almost always best to include just this one header instead of * picking out individual headers included here. There are exceptions to @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include diff --git a/vendor/sdl3/include/SDL_assert.h b/vendor/sdl3/include/SDL_assert.h index 6c90acc02..f0c4637b9 100644 --- a/vendor/sdl3/include/SDL_assert.h +++ b/vendor/sdl3/include/SDL_assert.h @@ -126,20 +126,17 @@ extern "C" { */ #define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner -#elif defined(_MSC_VER) && _MSC_VER >= 1310 +#elif defined(__MINGW32__) || (defined(_MSC_VER) && _MSC_VER >= 1310) /* Don't include intrin.h here because it contains C++ code */ extern void __cdecl __debugbreak(void); #define SDL_TriggerBreakpoint() __debugbreak() #elif defined(_MSC_VER) && defined(_M_IX86) #define SDL_TriggerBreakpoint() { _asm { int 0x03 } } -#elif defined(ANDROID) - #include - #define SDL_TriggerBreakpoint() assert(0) #elif SDL_HAS_BUILTIN(__builtin_debugtrap) #define SDL_TriggerBreakpoint() __builtin_debugtrap() #elif SDL_HAS_BUILTIN(__builtin_trap) #define SDL_TriggerBreakpoint() __builtin_trap() -#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) +#elif (defined(__GNUC__) || defined(__clang__) || defined(__TINYC__)) && (defined(__i386__) || defined(__x86_64__)) #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) #elif (defined(__GNUC__) || defined(__clang__)) && defined(__riscv) #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "ebreak\n\t" ) @@ -179,12 +176,48 @@ extern "C" { # define SDL_FUNCTION "???" #endif +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + /** * A macro that reports the current file being compiled. * + * This macro is only defined if it isn't already defined, so to override it + * (perhaps with something that doesn't provide path information at all, so + * build machine information doesn't leak into public binaries), apps can + * define this macro before including SDL.h or SDL_assert.h. + * * \since This macro is available since SDL 3.2.0. */ +#define SDL_FILE __FILE_NAME__ + +#elif !defined(SDL_FILE) +#ifdef __FILE_NAME__ +#define SDL_FILE __FILE_NAME__ +#else #define SDL_FILE __FILE__ +#endif +#endif + +#ifdef SDL_WIKI_DOCUMENTATION_SECTION + +/** + * A macro that reports the current file being compiled, for use in + * assertions. + * + * This macro is only defined if it isn't already defined, so to override it + * (perhaps with something that doesn't provide path information at all, so + * build machine information doesn't leak into public binaries), apps can + * define this macro before including SDL_assert.h. For example, defining this + * to `""` will make sure no source path information is included in asserts. + * + * \since This macro is available since SDL 3.4.0. + */ +#define SDL_ASSERT_FILE SDL_FILE + +#elif !defined(SDL_ASSERT_FILE) +#define SDL_ASSERT_FILE SDL_FILE +#endif + /** * A macro that reports the current line number of the file being compiled. @@ -362,8 +395,8 @@ extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData * #define SDL_enabled_assert(condition) \ do { \ while ( !(condition) ) { \ - static struct SDL_AssertData sdl_assert_data = { 0, 0, #condition, 0, 0, 0, 0 }; \ - const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \ + static struct SDL_AssertData sdl_assert_data = { false, 0, #condition, NULL, 0, NULL, NULL }; \ + const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_ASSERT_FILE, SDL_LINE); \ if (sdl_assert_state == SDL_ASSERTION_RETRY) { \ continue; /* go again. */ \ } else if (sdl_assert_state == SDL_ASSERTION_BREAK) { \ diff --git a/vendor/sdl3/include/SDL_atomic.h b/vendor/sdl3/include/SDL_atomic.h index 78b5e0fa5..bfcf81ee0 100644 --- a/vendor/sdl3/include/SDL_atomic.h +++ b/vendor/sdl3/include/SDL_atomic.h @@ -596,6 +596,24 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_SetAtomicU32(SDL_AtomicU32 *a, Uint32 v); */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAtomicU32(SDL_AtomicU32 *a); +/** + * Add to an atomic variable. + * + * This function also acts as a full memory barrier. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to an SDL_AtomicU32 variable to be modified. + * \param v the desired value to add or subtract. + * \returns the previous value of the atomic variable. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC Uint32 SDLCALL SDL_AddAtomicU32(SDL_AtomicU32 *a, int v); + /** * Set a pointer to a new value if it is currently an old value. * diff --git a/vendor/sdl3/include/SDL_audio.h b/vendor/sdl3/include/SDL_audio.h index c6acf885f..4c362e738 100644 --- a/vendor/sdl3/include/SDL_audio.h +++ b/vendor/sdl3/include/SDL_audio.h @@ -577,6 +577,15 @@ extern SDL_DECLSPEC SDL_AudioDeviceID * SDLCALL SDL_GetAudioRecordingDevices(int /** * Get the human-readable name of a specific audio device. * + * **WARNING**: this function will work with SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK + * and SDL_AUDIO_DEVICE_DEFAULT_RECORDING, returning the current default + * physical devices' names. However, as the default device may change at any + * time, it is likely better to show a generic name to the user, like "System + * default audio device" or perhaps "default [currently %s]". Do not store + * this name to disk to reidentify the device in a later run of the program, + * as the default might change in general, and the string will be the name of + * a specific device and not the abstract system default. + * * \param devid the instance ID of the device to query. * \returns the name of the audio device, or NULL on failure; call * SDL_GetError() for more information. @@ -942,7 +951,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID devid); * Binding a stream to a device will set its output format for playback * devices, and its input format for recording devices, so they match the * device's settings. The caller is welcome to change the other end of the - * stream's format at any time with SDL_SetAudioStreamFormat(). + * stream's format at any time with SDL_SetAudioStreamFormat(). If the other + * end of the stream's format has never been set (the audio stream was created + * with a NULL audio spec), this function will set it to match the device + * end's format. * * \param devid an audio device to bind a stream to. * \param streams an array of audio streams to bind. @@ -1021,7 +1033,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnbindAudioStream(SDL_AudioStream *stream); /** * Query an audio stream for its currently-bound device. * - * This reports the audio device that an audio stream is currently bound to. + * This reports the logical audio device that an audio stream is currently + * bound to. * * If not bound, or invalid, this returns zero, which is not a valid device * ID. @@ -1063,6 +1076,17 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_Au /** * Get the properties associated with an audio stream. * + * The application can hang any data it wants here, but the following + * properties are understood by SDL: + * + * - `SDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN`: if true (the default), the + * stream be automatically cleaned up when the audio subsystem quits. If set + * to false, the streams will persist beyond that. This property is ignored + * for streams created through SDL_OpenAudioDeviceStream(), and will always + * be cleaned up. Streams that are not cleaned up will still be unbound from + * devices when the audio subsystem quits. This property was added in SDL + * 3.4.0. + * * \param stream the SDL_AudioStream to query. * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. @@ -1073,6 +1097,9 @@ extern SDL_DECLSPEC SDL_AudioStream * SDLCALL SDL_CreateAudioStream(const SDL_Au */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetAudioStreamProperties(SDL_AudioStream *stream); +#define SDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN "SDL.audiostream.auto_cleanup" + + /** * Query the current format of an audio stream. * @@ -1149,14 +1176,14 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetAudioStreamFrequencyRatio(SDL_AudioStre * * The frequency ratio is used to adjust the rate at which input data is * consumed. Changing this effectively modifies the speed and pitch of the - * audio. A value greater than 1.0 will play the audio faster, and at a higher - * pitch. A value less than 1.0 will play the audio slower, and at a lower - * pitch. + * audio. A value greater than 1.0f will play the audio faster, and at a + * higher pitch. A value less than 1.0f will play the audio slower, and at a + * lower pitch. 1.0f means play at normal speed. * * This is applied during SDL_GetAudioStreamData, and can be continuously * changed to create various effects. * - * \param stream the stream the frequency ratio is being changed. + * \param stream the stream on which the frequency ratio is being changed. * \param ratio the frequency ratio. 1.0 is normal speed. Must be between 0.01 * and 100. * \returns true on success or false on failure; call SDL_GetError() for more @@ -1318,7 +1345,7 @@ extern SDL_DECLSPEC int * SDLCALL SDL_GetAudioStreamOutputChannelMap(SDL_AudioSt * \threadsafety It is safe to call this function from any thread, as it holds * a stream-specific mutex while running. Don't change the * stream's format to have a different number of channels from a - * a different thread at the same time, though! + * different thread at the same time, though! * * \since This function is available since SDL 3.2.0. * @@ -1332,7 +1359,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamInputChannelMap(SDL_AudioStre * Channel maps are optional; most things do not need them, instead passing * data in the [order that SDL expects](CategoryAudio#channel-layouts). * - * The output channel map reorders data that leaving a stream via + * The output channel map reorders data that is leaving a stream via * SDL_GetAudioStreamData. * * Each item in the array represents an input channel, and its value is the @@ -1414,6 +1441,136 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetAudioStreamOutputChannelMap(SDL_AudioStr */ extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamData(SDL_AudioStream *stream, const void *buf, int len); +/** + * A callback that fires for completed SDL_PutAudioStreamDataNoCopy() data. + * + * When using SDL_PutAudioStreamDataNoCopy() to provide data to an + * SDL_AudioStream, it's not safe to dispose of the data until the stream has + * completely consumed it. Often times it's difficult to know exactly when + * this has happened. + * + * This callback fires once when the stream no longer needs the buffer, + * allowing the app to easily free or reuse it. + * + * \param userdata an opaque pointer provided by the app for their personal + * use. + * \param buf the pointer provided to SDL_PutAudioStreamDataNoCopy(). + * \param buflen the size of buffer, in bytes, provided to + * SDL_PutAudioStreamDataNoCopy(). + * + * \threadsafety This callbacks may run from any thread, so if you need to + * protect shared data, you should use SDL_LockAudioStream to + * serialize access; this lock will be held before your callback + * is called, so your callback does not need to manage the lock + * explicitly. + * + * \since This datatype is available since SDL 3.4.0. + * + * \sa SDL_SetAudioStreamGetCallback + * \sa SDL_SetAudioStreamPutCallback + */ +typedef void (SDLCALL *SDL_AudioStreamDataCompleteCallback)(void *userdata, const void *buf, int buflen); + +/** + * Add external data to an audio stream without copying it. + * + * Unlike SDL_PutAudioStreamData(), this function does not make a copy of the + * provided data, instead storing the provided pointer. This means that the + * put operation does not need to allocate and copy the data, but the original + * data must remain available until the stream is done with it, either by + * being read from the stream in its entirety, or a call to + * SDL_ClearAudioStream() or SDL_DestroyAudioStream(). + * + * The data must match the format/channels/samplerate specified in the latest + * call to SDL_SetAudioStreamFormat, or the format specified when creating the + * stream if it hasn't been changed. + * + * An optional callback may be provided, which is called when the stream no + * longer needs the data. Once this callback fires, the stream will not access + * the data again. This callback will fire for any reason the data is no + * longer needed, including clearing or destroying the stream. + * + * Note that there is still an allocation to store tracking information, so + * this function is more efficient for larger blocks of data. If you're + * planning to put a few samples at a time, it will be more efficient to use + * SDL_PutAudioStreamData(), which allocates and buffers in blocks. + * + * \param stream the stream the audio data is being added to. + * \param buf a pointer to the audio data to add. + * \param len the number of bytes to add to the stream. + * \param callback the callback function to call when the data is no longer + * needed by the stream. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread, but if the + * stream has a callback set, the caller might need to manage + * extra locking. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_ClearAudioStream + * \sa SDL_FlushAudioStream + * \sa SDL_GetAudioStreamData + * \sa SDL_GetAudioStreamQueued + */ +extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamDataNoCopy(SDL_AudioStream *stream, const void *buf, int len, SDL_AudioStreamDataCompleteCallback callback, void *userdata); + +/** + * Add data to the stream with each channel in a separate array. + * + * This data must match the format/channels/samplerate specified in the latest + * call to SDL_SetAudioStreamFormat, or the format specified when creating the + * stream if it hasn't been changed. + * + * The data will be interleaved and queued. Note that SDL_AudioStream only + * operates on interleaved data, so this is simply a convenience function for + * easily queueing data from sources that provide separate arrays. There is no + * equivalent function to retrieve planar data. + * + * The arrays in `channel_buffers` are ordered as they are to be interleaved; + * the first array will be the first sample in the interleaved data. Any + * individual array may be NULL; in this case, silence will be interleaved for + * that channel. + * + * `num_channels` specifies how many arrays are in `channel_buffers`. This can + * be used as a safety to prevent overflow, in case the stream format has + * changed elsewhere. If more channels are specified than the current input + * spec, they are ignored. If less channels are specified, the missing arrays + * are treated as if they are NULL (silence is written to those channels). If + * the count is -1, SDL will assume the array count matches the current input + * spec. + * + * Note that `num_samples` is the number of _samples per array_. This can also + * be thought of as the number of _sample frames_ to be queued. A value of 1 + * with stereo arrays will queue two samples to the stream. This is different + * than SDL_PutAudioStreamData, which wants the size of a single array in + * bytes. + * + * \param stream the stream the audio data is being added to. + * \param channel_buffers a pointer to an array of arrays, one array per + * channel. + * \param num_channels the number of arrays in `channel_buffers` or -1. + * \param num_samples the number of _samples_ per array to write to the + * stream. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread, but if the + * stream has a callback set, the caller might need to manage + * extra locking. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_ClearAudioStream + * \sa SDL_FlushAudioStream + * \sa SDL_GetAudioStreamData + * \sa SDL_GetAudioStreamQueued + */ +extern SDL_DECLSPEC bool SDLCALL SDL_PutAudioStreamPlanarData(SDL_AudioStream *stream, const void * const *channel_buffers, int num_channels, int num_samples); + /** * Get converted/resampled data from the stream. * @@ -1583,8 +1740,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PauseAudioStreamDevice(SDL_AudioStream *str * previously been paused. Once unpaused, any bound audio streams will begin * to progress again, and audio can be generated. * - * Remember, SDL_OpenAudioDeviceStream opens device in a paused state, so this - * function call is required for audio playback to begin on such device. + * SDL_OpenAudioDeviceStream opens audio devices in a paused state, so this + * function call is required for audio playback to begin on such devices. * * \param stream the audio stream associated with the audio device to resume. * \returns true on success or false on failure; call SDL_GetError() for more @@ -1841,7 +1998,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyAudioStream(SDL_AudioStream *stream) * Also unlike other functions, the audio device begins paused. This is to map * more closely to SDL2-style behavior, since there is no extra step here to * bind a stream to begin audio flowing. The audio device should be resumed - * with `SDL_ResumeAudioStreamDevice(stream);` + * with SDL_ResumeAudioStreamDevice(). * * This function works with both playback and recording devices. * diff --git a/vendor/sdl3/include/SDL_begin_code.h b/vendor/sdl3/include/SDL_begin_code.h index a6b47cf4b..675cd7f09 100644 --- a/vendor/sdl3/include/SDL_begin_code.h +++ b/vendor/sdl3/include/SDL_begin_code.h @@ -261,9 +261,9 @@ * * On compilers without restrict support, this is defined to nothing. * - * \since This macro is available since SDL 3.2.0. + * \since This macro is available since SDL 3.4.0. */ -#define SDL_RESTRICT __restrict__ +#define SDL_RESTRICT __restrict /** * Check if the compiler supports a given builtin functionality. @@ -281,9 +281,61 @@ */ #define SDL_HAS_BUILTIN(x) __has_builtin(x) +/** + * A macro to specify data alignment. + * + * This informs the compiler that a given datatype or variable must be aligned + * to a specific byte count. + * + * For example: + * + * ```c + * // make sure this is struct is aligned to 16 bytes for SIMD access. + * typedef struct { + * float x, y, z, w; + * } SDL_ALIGNED(16) MySIMDAlignedData; + * + * // make sure this one field in a struct is aligned to 16 bytes for SIMD access. + * typedef struct { + * SomeStuff stuff; + * float SDL_ALIGNED(16) position[4]; + * SomeOtherStuff other_stuff; + * } MyStruct; + * + * // make sure this variable is aligned to 32 bytes. + * int SDL_ALIGNED(32) myval = 0; + * ``` + * + * Alignment is only guaranteed for things the compiler places: local + * variables on the stack and global/static variables. To dynamically allocate + * something that respects this alignment, use SDL_aligned_alloc() or some + * other mechanism. + * + * On compilers without alignment support, this macro is defined to an invalid + * symbol, to make it clear that the current compiler is likely to generate + * incorrect code when it sees this macro. + * + * \param x the byte count to align to, so the data's address will be a + * multiple of this value. + * + * \since This macro is available since SDL 3.4.0. + */ +#define SDL_ALIGNED(x) __attribute__((aligned(x))) + /* end of wiki documentation section. */ #endif +/* `restrict` is from C99, but __restrict works with both Visual Studio and GCC. */ +#ifndef SDL_RESTRICT +# if defined(restrict) || ((defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L))) +# define SDL_RESTRICT restrict +# elif defined(_MSC_VER) || defined(__GNUC__) || defined(__clang__) +# define SDL_RESTRICT __restrict +# else +# define SDL_RESTRICT +# endif +#endif + #ifndef SDL_HAS_BUILTIN #ifdef __has_builtin #define SDL_HAS_BUILTIN(x) __has_builtin(x) @@ -379,7 +431,7 @@ #endif /* SDL_INLINE not defined */ #ifndef SDL_FORCE_INLINE -#ifdef _MSC_VER +#if defined(_MSC_VER) && (_MSC_VER >= 1200) #define SDL_FORCE_INLINE __forceinline #elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) ) #define SDL_FORCE_INLINE __attribute__((always_inline)) static __inline__ @@ -389,7 +441,7 @@ #endif /* SDL_FORCE_INLINE not defined */ #ifndef SDL_NORETURN -#ifdef __GNUC__ +#if defined(__GNUC__) #define SDL_NORETURN __attribute__((noreturn)) #elif defined(_MSC_VER) #define SDL_NORETURN __declspec(noreturn) @@ -484,3 +536,18 @@ #define SDL_ALLOC_SIZE2(p1, p2) #endif #endif /* SDL_ALLOC_SIZE2 not defined */ + +#ifndef SDL_ALIGNED +#if defined(__clang__) || defined(__GNUC__) +#define SDL_ALIGNED(x) __attribute__((aligned(x))) +#elif defined(_MSC_VER) +#define SDL_ALIGNED(x) __declspec(align(x)) +#elif defined(__cplusplus) && (__cplusplus >= 201103L) +#define SDL_ALIGNED(x) alignas(x) +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +#define SDL_ALIGNED(x) _Alignas(x) +#else +#define SDL_ALIGNED(x) PLEASE_DEFINE_SDL_ALIGNED +#endif +#endif /* SDL_ALIGNED not defined */ + diff --git a/vendor/sdl3/include/SDL_camera.h b/vendor/sdl3/include/SDL_camera.h index 5f3911fdf..59ce73fe8 100644 --- a/vendor/sdl3/include/SDL_camera.h +++ b/vendor/sdl3/include/SDL_camera.h @@ -119,7 +119,7 @@ typedef struct SDL_CameraSpec int width; /**< Frame width */ int height; /**< Frame height */ int framerate_numerator; /**< Frame rate numerator ((num / denom) == FPS, (denom / num) == duration in seconds) */ - int framerate_denominator; /**< Frame rate demoninator ((num / denom) == FPS, (denom / num) == duration in seconds) */ + int framerate_denominator; /**< Frame rate denominator ((num / denom) == FPS, (denom / num) == duration in seconds) */ } SDL_CameraSpec; /** @@ -136,6 +136,20 @@ typedef enum SDL_CameraPosition SDL_CAMERA_POSITION_BACK_FACING } SDL_CameraPosition; +/** + * The current state of a request for camera access. + * + * \since This enum is available since SDL 3.4.0. + * + * \sa SDL_GetCameraPermissionState + */ +typedef enum SDL_CameraPermissionState +{ + SDL_CAMERA_PERMISSION_STATE_DENIED = -1, + SDL_CAMERA_PERMISSION_STATE_PENDING, + SDL_CAMERA_PERMISSION_STATE_APPROVED, +} SDL_CameraPermissionState; + /** * Use this function to get the number of built-in camera drivers. @@ -346,8 +360,9 @@ extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id * on others the approval might be implicit and not alert the user at all. * * This function can be used to check the status of that approval. It will - * return 0 if still waiting for user response, 1 if the camera is approved - * for use, and -1 if the user denied access. + * return SDL_CAMERA_PERMISSION_STATE_PENDING if waiting for user response, + * SDL_CAMERA_PERMISSION_STATE_APPROVED if the camera is approved for use, and + * SDL_CAMERA_PERMISSION_STATE_DENIED if the user denied access. * * Instead of polling with this function, you can wait for a * SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event @@ -358,8 +373,9 @@ extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id * SDL_CloseCamera() to dispose of it. * * \param camera the opened camera device to query. - * \returns -1 if user denied access to the camera, 1 if user approved access, - * 0 if no decision has been made yet. + * \returns an SDL_CameraPermissionState value indicating if access is + * granted, or `SDL_CAMERA_PERMISSION_STATE_PENDING` if the decision + * is still pending. * * \threadsafety It is safe to call this function from any thread. * @@ -368,7 +384,7 @@ extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id * \sa SDL_OpenCamera * \sa SDL_CloseCamera */ -extern SDL_DECLSPEC int SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera); +extern SDL_DECLSPEC SDL_CameraPermissionState SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera); /** * Get the instance ID of an opened camera. diff --git a/vendor/sdl3/include/SDL_clipboard.h b/vendor/sdl3/include/SDL_clipboard.h index 0d3cbb499..7480eb284 100644 --- a/vendor/sdl3/include/SDL_clipboard.h +++ b/vendor/sdl3/include/SDL_clipboard.h @@ -106,7 +106,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardText(const char *text); /** * Get UTF-8 text from the clipboard. * - * This functions returns an empty string if there was not enough memory left + * This function returns an empty string if there is not enough memory left * for a copy of the clipboard's content. * * \returns the clipboard text on success or an empty string on failure; call @@ -155,7 +155,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetPrimarySelectionText(const char *text); /** * Get UTF-8 text from the primary selection. * - * This functions returns an empty string if there was not enough memory left + * This function returns an empty string if there is not enough memory left * for a copy of the primary selection's content. * * \returns the primary selection text on success or an empty string on @@ -194,15 +194,14 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasPrimarySelectionText(void); * clipboard is cleared or new data is set. The clipboard is automatically * cleared in SDL_Quit(). * - * \param userdata a pointer to provided user data. + * \param userdata a pointer to the provided user data. * \param mime_type the requested mime-type. * \param size a pointer filled in with the length of the returned data. * \returns a pointer to the data for the provided mime-type. Returning NULL - * or setting length to 0 will cause no data to be sent to the - * "receiver". It is up to the receiver to handle this. Essentially - * returning no data is more or less undefined behavior and may cause - * breakage in receiving applications. The returned data will not be - * freed so it needs to be retained and dealt with internally. + * or setting the length to 0 will cause zero length data to be sent + * to the "receiver", which should be able to handle this. The + * returned data will not be freed, so it needs to be retained and + * dealt with internally. * * \since This function is available since SDL 3.2.0. * @@ -211,10 +210,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasPrimarySelectionText(void); typedef const void *(SDLCALL *SDL_ClipboardDataCallback)(void *userdata, const char *mime_type, size_t *size); /** - * Callback function that will be called when the clipboard is cleared, or new - * data is set. + * Callback function that will be called when the clipboard is cleared, or + * when new data is set. * - * \param userdata a pointer to provided user data. + * \param userdata a pointer to the provided user data. * * \since This function is available since SDL 3.2.0. * @@ -231,7 +230,7 @@ typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata); * respond with the data for the requested mime-type. * * The size of text data does not include any terminator, and the text does - * not need to be null terminated (e.g. you can directly copy a portion of a + * not need to be null-terminated (e.g., you can directly copy a portion of a * document). * * \param callback a function pointer to the function that provides the @@ -239,7 +238,8 @@ typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata); * \param cleanup a function pointer to the function that cleans up the * clipboard data. * \param userdata an opaque pointer that will be forwarded to the callbacks. - * \param mime_types a list of mime-types that are being offered. + * \param mime_types a list of mime-types that are being offered. SDL copies + * the given list. * \param num_mime_types the number of mime-types in the mime_types list. * \returns true on success or false on failure; call SDL_GetError() for more * information. @@ -269,10 +269,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardData(SDL_ClipboardDataCallback extern SDL_DECLSPEC bool SDLCALL SDL_ClearClipboardData(void); /** - * Get the data from clipboard for a given mime type. + * Get the data from the clipboard for a given mime type. * * The size of text data does not include the terminator, but the text is - * guaranteed to be null terminated. + * guaranteed to be null-terminated. * * \param mime_type the mime type to read from the clipboard. * \param size a pointer filled in with the length of the returned data. @@ -292,8 +292,8 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetClipboardData(const char *mime_type, s /** * Query whether there is data in the clipboard for the provided mime type. * - * \param mime_type the mime type to check for data for. - * \returns true if there exists data in clipboard for the provided mime type, + * \param mime_type the mime type to check for data. + * \returns true if data exists in the clipboard for the provided mime type, * false if it does not. * * \threadsafety This function should only be called on the main thread. @@ -310,7 +310,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasClipboardData(const char *mime_type); * * \param num_mime_types a pointer filled with the number of mime types, may * be NULL. - * \returns a null terminated array of strings with mime types, or NULL on + * \returns a null-terminated array of strings with mime types, or NULL on * failure; call SDL_GetError() for more information. This should be * freed with SDL_free() when it is no longer needed. * diff --git a/vendor/sdl3/include/SDL_cpuinfo.h b/vendor/sdl3/include/SDL_cpuinfo.h index 1745bd934..b1e125b55 100644 --- a/vendor/sdl3/include/SDL_cpuinfo.h +++ b/vendor/sdl3/include/SDL_cpuinfo.h @@ -344,6 +344,27 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetSystemRAM(void); */ extern SDL_DECLSPEC size_t SDLCALL SDL_GetSIMDAlignment(void); +/** + * Report the size of a page of memory. + * + * Different platforms might have different memory page sizes. In current + * times, 4 kilobytes is not unusual, but newer systems are moving to larger + * page sizes, and esoteric platforms might have any unexpected size. + * + * Note that this function can return 0, which means SDL can't determine the + * page size on this platform. It will _not_ set an error string to be + * retrieved with SDL_GetError() in this case! In this case, defaulting to + * 4096 is often a reasonable option. + * + * \returns the size of a single page of memory, in bytes, or 0 if SDL can't + * determine this information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC int SDLCALL SDL_GetSystemPageSize(void); + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/vendor/sdl3/include/SDL_dialog.h b/vendor/sdl3/include/SDL_dialog.h index ddb9e24d5..395b7e8c9 100644 --- a/vendor/sdl3/include/SDL_dialog.h +++ b/vendor/sdl3/include/SDL_dialog.h @@ -139,10 +139,12 @@ typedef void (SDLCALL *SDL_DialogFileCallback)(void *userdata, const char * cons * it will be invoked. * \param window the window that the dialog should be modal for, may be NULL. * Not all platforms support this option. - * \param filters a list of filters, may be NULL. Not all platforms support - * this option, and platforms that do support it may allow the - * user to ignore the filters. If non-NULL, it must remain - * valid at least until the callback is invoked. + * \param filters a list of filters, may be NULL. See the + * [`SDL_DialogFileFilter`](SDL_DialogFileFilter#code-examples) + * documentation for examples]. Not all platforms support this + * option, and platforms that do support it may allow the user + * to ignore the filters. If non-NULL, it must remain valid at + * least until the callback is invoked. * \param nfilters the number of filters. Ignored if filters is NULL. * \param default_location the default folder or file to start the dialog at, * may be NULL. Not all platforms support this option. diff --git a/vendor/sdl3/include/SDL_dlopennote.h b/vendor/sdl3/include/SDL_dlopennote.h new file mode 100644 index 000000000..e866d2a20 --- /dev/null +++ b/vendor/sdl3/include/SDL_dlopennote.h @@ -0,0 +1,234 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/* WIKI CATEGORY: DlopenNotes */ + +/** + * # CategoryDlopenNotes + * + * This header allows you to annotate your code so external tools know about + * dynamic shared library dependencies. + * + * If you determine that your toolchain doesn't support dlopen notes, you can + * disable this feature by defining `SDL_DISABLE_DLOPEN_NOTES`. You can use + * this CMake snippet to check for support: + * + * ```cmake + * include(CheckCSourceCompiles) + * find_package(SDL3 REQUIRED CONFIG COMPONENTS Headers) + * list(APPEND CMAKE_REQUIRED_LIBRARIES SDL3::Headers) + * check_c_source_compiles([==[ + * #include + * SDL_ELF_NOTE_DLOPEN("sdl-video", + * "Support for video through SDL", + * SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + * "libSDL-1.2.so.0", "libSDL-2.0.so.0", "libSDL3.so.0" + * ) + * int main(int argc, char *argv[]) { + * return argc + argv[0][1]; + * } + * ]==] COMPILER_SUPPORTS_SDL_ELF_NOTE_DLOPEN) + * if(NOT COMPILER_SUPPORTS_SDL_ELF_NOTE_DLOPEN) + * add_compile_definitions(-DSDL_DISABLE_DLOPEN_NOTE) + * endif() + * ``` + */ + +#ifndef SDL_dlopennote_h +#define SDL_dlopennote_h + +/** + * Use this macro with SDL_ELF_NOTE_DLOPEN() to note that a dynamic shared + * library dependency is optional. + * + * Optional functionality uses the dependency, the binary will work and the + * dependency is only needed for full-featured installations. + * + * \since This macro is available since SDL 3.4.0. + * + * \sa SDL_ELF_NOTE_DLOPEN + * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED + * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED + */ +#define SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED "suggested" + +/** + * Use this macro with SDL_ELF_NOTE_DLOPEN() to note that a dynamic shared + * library dependency is recommended. + * + * Important functionality needs the dependency, the binary will work but in + * most cases the dependency should be provided. + * + * \since This macro is available since SDL 3.4.0. + * + * \sa SDL_ELF_NOTE_DLOPEN + * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED + * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED + */ +#define SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED "recommended" + +/** + * Use this macro with SDL_ELF_NOTE_DLOPEN() to note that a dynamic shared + * library dependency is required. + * + * Core functionality needs the dependency, the binary will not work if it + * cannot be found. + * + * \since This macro is available since SDL 3.4.0. + * + * \sa SDL_ELF_NOTE_DLOPEN + * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED + * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED + */ +#define SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED "required" + + +#if !defined(SDL_PLATFORM_UNIX) || defined(SDL_PLATFORM_ANDROID) +/* The dlopen note functionality isn't used on this platform */ +#ifndef SDL_DISABLE_DLOPEN_NOTES +#define SDL_DISABLE_DLOPEN_NOTES +#endif +#elif defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1)) +/* gcc < 3.1 too old */ +#ifndef SDL_DISABLE_DLOPEN_NOTES +#define SDL_DISABLE_DLOPEN_NOTES +#endif +#endif /* SDL_PLATFORM_UNIX || SDL_PLATFORM_ANDROID */ + +#if defined(__ELF__) && !defined(SDL_DISABLE_DLOPEN_NOTES) + +#include + +#define SDL_ELF_NOTE_DLOPEN_VENDOR "FDO" +#define SDL_ELF_NOTE_DLOPEN_TYPE 0x407c0c0aU + +#define SDL_ELF_NOTE_INTERNAL2(json, variable_name) \ + __attribute__((aligned(4), used, section(".note.dlopen"))) \ + static const struct { \ + struct { \ + Uint32 n_namesz; \ + Uint32 n_descsz; \ + Uint32 n_type; \ + } nhdr; \ + char name[4]; \ + __attribute__((aligned(4))) char dlopen_json[sizeof(json)]; \ + } variable_name = { \ + { \ + sizeof(SDL_ELF_NOTE_DLOPEN_VENDOR), \ + sizeof(json), \ + SDL_ELF_NOTE_DLOPEN_TYPE \ + }, \ + SDL_ELF_NOTE_DLOPEN_VENDOR, \ + json \ + } + +#define SDL_ELF_NOTE_INTERNAL(json, variable_name) \ + SDL_ELF_NOTE_INTERNAL2(json, variable_name) + +#define SDL_DLNOTE_JSON_ARRAY1(N1) "[\"" N1 "\"]" +#define SDL_DLNOTE_JSON_ARRAY2(N1,N2) "[\"" N1 "\",\"" N2 "\"]" +#define SDL_DLNOTE_JSON_ARRAY3(N1,N2,N3) "[\"" N1 "\",\"" N2 "\",\"" N3 "\"]" +#define SDL_DLNOTE_JSON_ARRAY4(N1,N2,N3,N4) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\"]" +#define SDL_DLNOTE_JSON_ARRAY5(N1,N2,N3,N4,N5) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\"]" +#define SDL_DLNOTE_JSON_ARRAY6(N1,N2,N3,N4,N5,N6) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\",\"" N6 "\"]" +#define SDL_DLNOTE_JSON_ARRAY7(N1,N2,N3,N4,N5,N6,N7) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\",\"" N6 "\",\"" N7 "\"]" +#define SDL_DLNOTE_JSON_ARRAY8(N1,N2,N3,N4,N5,N6,N7,N8) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\",\"" N6 "\",\"" N7 "\",\"" N8 "\"]" +#define SDL_DLNOTE_JSON_ARRAY_GET(N1,N2,N3,N4,N5,N6,N7,N8,NAME,...) NAME +#define SDL_DLNOTE_JSON_ARRAY(...) \ + SDL_DLNOTE_JSON_ARRAY_GET( \ + __VA_ARGS__, \ + SDL_DLNOTE_JSON_ARRAY8, \ + SDL_DLNOTE_JSON_ARRAY7, \ + SDL_DLNOTE_JSON_ARRAY6, \ + SDL_DLNOTE_JSON_ARRAY5, \ + SDL_DLNOTE_JSON_ARRAY4, \ + SDL_DLNOTE_JSON_ARRAY3, \ + SDL_DLNOTE_JSON_ARRAY2, \ + SDL_DLNOTE_JSON_ARRAY1 \ + )(__VA_ARGS__) + +/* Create "unique" variable name using __LINE__, + * so creating multiple elf notes on the same line is not supported + */ +#define SDL_DLNOTE_JOIN2(A,B) A##B +#define SDL_DLNOTE_JOIN(A,B) SDL_DLNOTE_JOIN2(A,B) +#define SDL_DLNOTE_UNIQUE_NAME SDL_DLNOTE_JOIN(s_SDL_dlopen_note_, __LINE__) + +/** + * Add a note that your application has dynamic shared library dependencies. + * + * You can do this by adding the following to the global scope: + * + * ```c + * SDL_ELF_NOTE_DLOPEN( + * "png", + * "Support for loading PNG images using libpng (required for APNG)", + * SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + * "libpng12.so.0" + * ) + * ``` + * + * A trailing semicolon is not needed. + * + * Or if you support multiple versions of a library, you can list them: + * + * ```c + * // Our app supports SDL1, SDL2, and SDL3 by dynamically loading them + * SDL_ELF_NOTE_DLOPEN( + * "SDL", + * "Create windows through SDL video backend", + * SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED + * "libSDL-1.2.so.0", "libSDL2-2.0.so.0", "libSDL3.so.0" + * ) + * ``` + * + * This macro is not available for compilers that do not support variadic + * macro's. + * + * \since This macro is available since SDL 3.4.0. + * + * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED + * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED + * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED + */ +#define SDL_ELF_NOTE_DLOPEN(feature, description, priority, ...) \ + SDL_ELF_NOTE_INTERNAL( \ + "[{\"feature\":\"" feature \ + "\",\"description\":\"" description \ + "\",\"priority\":\"" priority \ + "\",\"soname\":" SDL_DLNOTE_JSON_ARRAY(__VA_ARGS__) "}]", \ + SDL_DLNOTE_UNIQUE_NAME); + +#elif defined(__GNUC__) && __GNUC__ < 3 + +#define SDL_ELF_NOTE_DLOPEN(args...) + +#elif defined(_MSC_VER) && _MSC_VER < 1400 + +/* Variadic macros are not supported */ + +#else + +#define SDL_ELF_NOTE_DLOPEN(...) + +#endif + +#endif /* SDL_dlopennote_h */ diff --git a/vendor/sdl3/include/SDL_endian.h b/vendor/sdl3/include/SDL_endian.h index a34e9d4b0..6b1b4cbcf 100644 --- a/vendor/sdl3/include/SDL_endian.h +++ b/vendor/sdl3/include/SDL_endian.h @@ -46,7 +46,7 @@ #if defined(_MSC_VER) && (_MSC_VER >= 1400) /* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version, so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */ -#ifdef __clang__ +#if defined(__clang__) && !SDL_HAS_BUILTIN(_m_prefetch) #ifndef __PRFCHWINTRIN_H #define __PRFCHWINTRIN_H static __inline__ void __attribute__((__always_inline__, __nodebug__)) @@ -128,7 +128,7 @@ _m_prefetch(void *__P) * \sa SDL_BIG_ENDIAN */ #define SDL_BYTEORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN -#elif defined(SDL_PLATFORM_LINUX) +#elif defined(SDL_PLATFORM_LINUX) || defined(__GLIBC__) #include #define SDL_BYTEORDER __BYTE_ORDER #elif defined(SDL_PLATFORM_SOLARIS) @@ -252,7 +252,7 @@ SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) #elif defined(__x86_64__) SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { - __asm__("xchgb %b0,%h0": "=Q"(x):"0"(x)); + __asm__("xchgb %b0,%h0": "=abcd"(x):"0"(x)); return x; } #elif (defined(__powerpc__) || defined(__ppc__)) @@ -486,7 +486,7 @@ SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { return x_but_byteswapped; } * * \since This function is available since SDL 3.2.0. */ -SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } +SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x) { return x_but_byteswapped; } /** * Swap a 16-bit value from littleendian to native byte order. diff --git a/vendor/sdl3/include/SDL_events.h b/vendor/sdl3/include/SDL_events.h index d267f051f..4c06e45b1 100644 --- a/vendor/sdl3/include/SDL_events.h +++ b/vendor/sdl3/include/SDL_events.h @@ -30,7 +30,7 @@ * coming and going, the system changing in some way, etc. * * An app generally takes a moment, perhaps at the start of a new frame, to - * examine any events that have occured since the last time and process or + * examine any events that have occurred since the last time and process or * ignore them. This is generally done by calling SDL_PollEvent() in a loop * until it returns false (or, if using the main callbacks, events are * provided one at a time in calls to SDL_AppEvent() before the next call to @@ -127,15 +127,17 @@ typedef enum SDL_EventType SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED, /**< Display has changed desktop mode */ SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED, /**< Display has changed current mode */ SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED, /**< Display has changed content scale */ + SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGED, /**< Display has changed usable bounds */ SDL_EVENT_DISPLAY_FIRST = SDL_EVENT_DISPLAY_ORIENTATION, - SDL_EVENT_DISPLAY_LAST = SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED, + SDL_EVENT_DISPLAY_LAST = SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGED, /* Window events */ /* 0x200 was SDL_WINDOWEVENT, reserve the number for sdl2-compat */ /* 0x201 was SDL_SYSWMEVENT, reserve the number for sdl2-compat */ SDL_EVENT_WINDOW_SHOWN = 0x202, /**< Window has been shown */ SDL_EVENT_WINDOW_HIDDEN, /**< Window has been hidden */ - SDL_EVENT_WINDOW_EXPOSED, /**< Window has been exposed and should be redrawn, and can be redrawn directly from event watchers for this event */ + SDL_EVENT_WINDOW_EXPOSED, /**< Window has been exposed and should be redrawn, and can be redrawn directly from event watchers for this event. + data1 is 1 for live-resize expose events, 0 otherwise. */ SDL_EVENT_WINDOW_MOVED, /**< Window has been moved to data1, data2 */ SDL_EVENT_WINDOW_RESIZED, /**< Window has been resized to data1xdata2 */ SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED,/**< The pixel size of the window has changed to data1xdata2 */ @@ -174,6 +176,8 @@ typedef enum SDL_EventType SDL_EVENT_KEYBOARD_ADDED, /**< A new keyboard has been inserted into the system */ SDL_EVENT_KEYBOARD_REMOVED, /**< A keyboard has been removed */ SDL_EVENT_TEXT_EDITING_CANDIDATES, /**< Keyboard text editing candidates */ + SDL_EVENT_SCREEN_KEYBOARD_SHOWN, /**< The on-screen keyboard has been shown */ + SDL_EVENT_SCREEN_KEYBOARD_HIDDEN, /**< The on-screen keyboard has been hidden */ /* Mouse events */ SDL_EVENT_MOUSE_MOTION = 0x400, /**< Mouse moved */ @@ -214,10 +218,15 @@ typedef enum SDL_EventType SDL_EVENT_FINGER_MOTION, SDL_EVENT_FINGER_CANCELED, + /* Pinch events */ + SDL_EVENT_PINCH_BEGIN = 0x710, /**< Pinch gesture started */ + SDL_EVENT_PINCH_UPDATE, /**< Pinch gesture updated */ + SDL_EVENT_PINCH_END, /**< Pinch gesture ended */ + /* 0x800, 0x801, and 0x802 were the Gesture events from SDL2. Do not reuse these values! sdl2-compat needs them! */ /* Clipboard events */ - SDL_EVENT_CLIPBOARD_UPDATE = 0x900, /**< The clipboard or primary selection changed */ + SDL_EVENT_CLIPBOARD_UPDATE = 0x900, /**< The clipboard changed */ /* Drag and drop events */ SDL_EVENT_DROP_FILE = 0x1000, /**< The system requests a file open */ @@ -298,7 +307,7 @@ typedef struct SDL_CommonEvent */ typedef struct SDL_DisplayEvent { - SDL_EventType type; /**< SDL_DISPLAYEVENT_* */ + SDL_EventType type; /**< SDL_EVENT_DISPLAY_* */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_DisplayID displayID;/**< The associated display */ @@ -704,6 +713,10 @@ typedef struct SDL_GamepadSensorEvent /** * Audio device event structure (event.adevice.*) * + * Note that SDL will send a SDL_EVENT_AUDIO_DEVICE_ADDED event for every + * device it discovers during initialization. After that, this event will only + * arrive when a device is hotplugged during the program's run. + * * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_AudioDeviceEvent @@ -781,7 +794,19 @@ typedef struct SDL_TouchFingerEvent } SDL_TouchFingerEvent; /** - * Pressure-sensitive pen proximity event structure (event.pmotion.*) + * Pinch event structure (event.pinch.*) + */ +typedef struct SDL_PinchFingerEvent +{ + SDL_EventType type; /**< ::SDL_EVENT_PINCH_BEGIN or ::SDL_EVENT_PINCH_UPDATE or ::SDL_EVENT_PINCH_END */ + Uint32 reserved; + Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ + float scale; /**< The scale change since the last SDL_EVENT_PINCH_UPDATE. Scale < 1 is "zoom out". Scale > 1 is "zoom in". */ + SDL_WindowID windowID; /**< The window underneath the finger, if any */ +} SDL_PinchFingerEvent; + +/** + * Pressure-sensitive pen proximity event structure (event.pproximity.*) * * When a pen becomes visible to the system (it is close enough to a tablet, * etc), SDL will send an SDL_EVENT_PEN_PROXIMITY_IN event with the new pen's @@ -793,6 +818,9 @@ typedef struct SDL_TouchFingerEvent * is there." The pen touching and lifting off from the tablet while not * leaving the area are handled by SDL_EVENT_PEN_DOWN and SDL_EVENT_PEN_UP. * + * Not all platforms have a window associated with the pen during proximity + * events. Some wait until motion/button/etc events to offer this info. + * * \since This struct is available since SDL 3.2.0. */ typedef struct SDL_PenProximityEvent @@ -967,7 +995,7 @@ typedef struct SDL_QuitEvent */ typedef struct SDL_UserEvent { - Uint32 type; /**< SDL_EVENT_USER through SDL_EVENT_LAST-1, Uint32 because these are not in the SDL_EventType enumeration */ + Uint32 type; /**< SDL_EVENT_USER through SDL_EVENT_LAST, Uint32 because these are not in the SDL_EventType enumeration */ Uint32 reserved; Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ SDL_WindowID windowID; /**< The associated window if any */ @@ -1017,6 +1045,7 @@ typedef union SDL_Event SDL_QuitEvent quit; /**< Quit request event data */ SDL_UserEvent user; /**< Custom event data */ SDL_TouchFingerEvent tfinger; /**< Touch finger event data */ + SDL_PinchFingerEvent pinch; /**< Pinch event data */ SDL_PenProximityEvent pproximity; /**< Pen proximity event data */ SDL_PenTouchEvent ptouch; /**< Pen tip touching event data */ SDL_PenMotionEvent pmotion; /**< Pen motion event data */ @@ -1043,7 +1072,7 @@ typedef union SDL_Event } SDL_Event; /* Make sure we haven't broken binary compatibility */ -SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NULL)->padding)); +SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof((SDL_static_cast(SDL_Event *, NULL))->padding)); /* Function prototypes */ @@ -1255,6 +1284,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType) * } * ``` * + * Note that Windows (and possibly other platforms) has a quirk about how it + * handles events while dragging/resizing a window, which can cause this + * function to block for significant amounts of time. Technical explanations + * and solutions are discussed on the wiki: + * + * https://wiki.libsdl.org/SDL3/AppFreezeDuringDrag + * * \param event the SDL_Event structure to be filled with the next event from * the queue, or NULL. * \returns true if this got an event or false if there are none available. @@ -1391,7 +1427,10 @@ typedef bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); * allows selective filtering of dynamically arriving events. * * **WARNING**: Be very careful of what you do in the event filter function, - * as it may run in a different thread! + * as it may run in a different thread! The exception is handling of + * SDL_EVENT_WINDOW_EXPOSED, which is guaranteed to be sent from the OS on the + * main thread and you are expected to redraw your window in response to this + * event. * * On platforms that support it, if the quit event is generated by an * interrupt signal (e.g. pressing Ctrl-C), it will be delivered to the @@ -1404,7 +1443,7 @@ typedef bool (SDLCALL *SDL_EventFilter)(void *userdata, SDL_Event *event); * the event filter, but events pushed onto the queue with SDL_PeepEvents() do * not. * - * \param filter an SDL_EventFilter function to call when an event happens. + * \param filter a function to call when an event happens. * \param userdata a pointer that is passed to `filter`. * * \threadsafety It is safe to call this function from any thread. @@ -1567,6 +1606,38 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); */ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowFromEvent(const SDL_Event *event); +/** + * Generate an English description of an event. + * + * This will fill `buf` with a null-terminated string that might look + * something like this: + * + * ``` + * SDL_EVENT_MOUSE_MOTION (timestamp=1140256324 windowid=2 which=0 state=0 x=492.99 y=139.09 xrel=52 yrel=6) + * ``` + * + * The exact format of the string is not guaranteed; it is intended for + * logging purposes, to be read by a human, and not parsed by a computer. + * + * The returned value follows the same rules as SDL_snprintf(): `buf` will + * always be NULL-terminated (unless `buflen` is zero), and will be truncated + * if `buflen` is too small. The return code is the number of bytes needed for + * the complete string, not counting the NULL-terminator, whether the string + * was truncated or not. Unlike SDL_snprintf(), though, this function never + * returns -1. + * + * \param event an event to describe. May be NULL. + * \param buf the buffer to fill with the description string. May be NULL. + * \param buflen the maximum bytes that can be written to `buf`. + * \returns number of bytes needed for the full string, not counting the + * null-terminator byte. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC int SDLCALL SDL_GetEventDescription(const SDL_Event *event, char *buf, int buflen); + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/vendor/sdl3/include/SDL_filesystem.h b/vendor/sdl3/include/SDL_filesystem.h index af3ca27e0..67f6d7ac8 100644 --- a/vendor/sdl3/include/SDL_filesystem.h +++ b/vendor/sdl3/include/SDL_filesystem.h @@ -77,6 +77,9 @@ extern "C" { * - `parent`: the containing directory of the bundle. For example: * `/Applications/SDLApp/` * + * **Android Specific Functionality**: This function returns "./", which + * allows filesystem operations to use internal storage and the asset system. + * * **Nintendo 3DS Specific Functionality**: This function returns "romfs" * directory of the application as it is uncommon to store resources outside * the executable. As such it is not a writable directory. @@ -89,6 +92,8 @@ extern "C" { * doesn't implement this functionality, call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetPrefPath @@ -134,6 +139,12 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetBasePath(void); * - ...only use letters, numbers, and spaces. Avoid punctuation like "Game * Name 2: Bad Guy's Revenge!" ... "Game Name 2" is sufficient. * + * Due to historical mistakes, `org` is allowed to be NULL or "". In such + * cases, SDL will omit the org subdirectory, including on platforms where it + * shouldn't, and including on platforms where this would make your app fail + * certification for an app store. New apps should definitely specify a real + * string for `org`. + * * The returned path is guaranteed to end with a path separator ('\\' on * Windows, '/' on most other platforms). * @@ -144,6 +155,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetBasePath(void); * etc.). This should be freed with SDL_free() when it is no longer * needed. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetBasePath @@ -216,6 +229,8 @@ typedef enum SDL_Folder * \returns either a null-terminated C string containing the full path to the * folder, or NULL if an error happened. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetUserFolder(SDL_Folder folder); @@ -283,6 +298,8 @@ typedef Uint32 SDL_GlobFlags; * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_CreateDirectory(const char *path); @@ -346,6 +363,8 @@ typedef SDL_EnumerationResult (SDLCALL *SDL_EnumerateDirectoryCallback)(void *us * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata); @@ -360,6 +379,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateDirectory(const char *path, SDL_En * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RemovePath(const char *path); @@ -367,7 +388,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RemovePath(const char *path); /** * Rename a file or directory. * - * If the file at `newpath` already exists, it will replaced. + * If the file at `newpath` already exists, it will be replaced. * * Note that this will not copy files across filesystems/drives/volumes, as * that is a much more complicated (and possibly time-consuming) operation. @@ -383,6 +404,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RemovePath(const char *path); * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RenamePath(const char *oldpath, const char *newpath); @@ -423,6 +446,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenamePath(const char *oldpath, const char * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread, but this + * operation is not atomic, so the app might need to protect + * access to specific paths from other threads if appropriate. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_CopyFile(const char *oldpath, const char *newpath); @@ -436,6 +463,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CopyFile(const char *oldpath, const char *n * \returns true on success or false if the file doesn't exist, or another * failure; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo *info); @@ -444,10 +473,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo * Enumerate a directory tree, filtered by pattern, and return a list. * * Files are filtered out if they don't match the string in `pattern`, which - * may contain wildcard characters '\*' (match everything) and '?' (match one + * may contain wildcard characters `*` (match everything) and `?` (match one * character). If pattern is NULL, no filtering is done and all results are * returned. Subdirectories are permitted, and are specified with a path - * separator of '/'. Wildcard characters '\*' and '?' never match a path + * separator of `/`. Wildcard characters `*` and `?` never match a path * separator. * * `flags` may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching @@ -490,6 +519,8 @@ extern SDL_DECLSPEC char ** SDLCALL SDL_GlobDirectory(const char *path, const ch * platform-dependent notation. NULL if there's a problem. This * should be freed with SDL_free() when it is no longer needed. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char * SDLCALL SDL_GetCurrentDirectory(void); diff --git a/vendor/sdl3/include/SDL_gamepad.h b/vendor/sdl3/include/SDL_gamepad.h index 99f8b6593..0102f1544 100644 --- a/vendor/sdl3/include/SDL_gamepad.h +++ b/vendor/sdl3/include/SDL_gamepad.h @@ -48,6 +48,9 @@ * SDL_INIT_GAMEPAD flag. This causes SDL to scan the system for gamepads, and * load appropriate drivers. * + * If you're using SDL gamepad support in a Steam game, you must call + * SteamAPI_InitEx() before calling SDL_Init(). + * * If you would like to receive gamepad updates while the application is in * the background, you should set the following hint before calling * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS @@ -118,6 +121,7 @@ typedef enum SDL_GamepadType SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT, SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT, SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR, + SDL_GAMEPAD_TYPE_GAMECUBE, SDL_GAMEPAD_TYPE_COUNT } SDL_GamepadType; @@ -127,8 +131,9 @@ typedef enum SDL_GamepadType * For controllers that use a diamond pattern for the face buttons, the * south/east/west/north buttons below correspond to the locations in the * diamond pattern. For Xbox controllers, this would be A/B/X/Y, for Nintendo - * Switch controllers, this would be B/A/Y/X, for PlayStation controllers this - * would be Cross/Circle/Square/Triangle. + * Switch controllers, this would be B/A/Y/X, for GameCube controllers this + * would be A/X/B/Y, for PlayStation controllers this would be + * Cross/Circle/Square/Triangle. * * For controllers that don't use a diamond pattern for the face buttons, the * south/east/west/north buttons indicate the buttons labeled A, B, C, D, or @@ -163,14 +168,14 @@ typedef enum SDL_GamepadButton SDL_GAMEPAD_BUTTON_DPAD_LEFT, SDL_GAMEPAD_BUTTON_DPAD_RIGHT, SDL_GAMEPAD_BUTTON_MISC1, /**< Additional button (e.g. Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button, Google Stadia capture button) */ - SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1, /**< Upper or primary paddle, under your right hand (e.g. Xbox Elite paddle P1) */ - SDL_GAMEPAD_BUTTON_LEFT_PADDLE1, /**< Upper or primary paddle, under your left hand (e.g. Xbox Elite paddle P3) */ - SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2, /**< Lower or secondary paddle, under your right hand (e.g. Xbox Elite paddle P2) */ - SDL_GAMEPAD_BUTTON_LEFT_PADDLE2, /**< Lower or secondary paddle, under your left hand (e.g. Xbox Elite paddle P4) */ + SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1, /**< Upper or primary paddle, under your right hand (e.g. Xbox Elite paddle P1, DualSense Edge RB button, Right Joy-Con SR button) */ + SDL_GAMEPAD_BUTTON_LEFT_PADDLE1, /**< Upper or primary paddle, under your left hand (e.g. Xbox Elite paddle P3, DualSense Edge LB button, Left Joy-Con SL button) */ + SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2, /**< Lower or secondary paddle, under your right hand (e.g. Xbox Elite paddle P2, DualSense Edge right Fn button, Right Joy-Con SL button) */ + SDL_GAMEPAD_BUTTON_LEFT_PADDLE2, /**< Lower or secondary paddle, under your left hand (e.g. Xbox Elite paddle P4, DualSense Edge left Fn button, Left Joy-Con SR button) */ SDL_GAMEPAD_BUTTON_TOUCHPAD, /**< PS4/PS5 touchpad button */ SDL_GAMEPAD_BUTTON_MISC2, /**< Additional button */ - SDL_GAMEPAD_BUTTON_MISC3, /**< Additional button */ - SDL_GAMEPAD_BUTTON_MISC4, /**< Additional button */ + SDL_GAMEPAD_BUTTON_MISC3, /**< Additional button (e.g. Nintendo GameCube left trigger click) */ + SDL_GAMEPAD_BUTTON_MISC4, /**< Additional button (e.g. Nintendo GameCube right trigger click) */ SDL_GAMEPAD_BUTTON_MISC5, /**< Additional button */ SDL_GAMEPAD_BUTTON_MISC6, /**< Additional button */ SDL_GAMEPAD_BUTTON_COUNT @@ -422,6 +427,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromFile(const char *file) * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_ReloadGamepadMappings(void); @@ -436,6 +443,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReloadGamepadMappings(void); * single allocation that should be freed with SDL_free() when it is * no longer needed. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC char ** SDLCALL SDL_GetGamepadMappings(int *count); @@ -448,6 +457,8 @@ extern SDL_DECLSPEC char ** SDLCALL SDL_GetGamepadMappings(int *count); * information. This should be freed with SDL_free() when it is no * longer needed. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID @@ -465,6 +476,8 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForGUID(SDL_GUID guid); * available; call SDL_GetError() for more information. This should * be freed with SDL_free() when it is no longer needed. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping @@ -485,6 +498,8 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMapping(SDL_Gamepad *gamepad); * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_AddGamepadMapping @@ -497,6 +512,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadMapping(SDL_JoystickID instance_i * * \returns true if a gamepad is connected, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepads @@ -512,6 +529,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasGamepad(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_HasGamepad @@ -526,6 +545,8 @@ extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetGamepads(int *count); * \returns true if the given joystick is supported by the gamepad interface, * false if it isn't or it's an invalid index. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoysticks @@ -542,6 +563,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id); * \returns the name of the selected gamepad. If no name can be found, this * function returns NULL; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadName @@ -558,6 +581,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadNameForID(SDL_JoystickID * \returns the path of the selected gamepad. If no path can be found, this * function returns NULL; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPath @@ -573,6 +598,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPathForID(SDL_JoystickID * \param instance_id the joystick instance ID. * \returns the player index of a gamepad, or -1 if it's not available. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex @@ -589,6 +616,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndexForID(SDL_JoystickID in * \returns the GUID of the selected gamepad. If called on an invalid index, * this function returns a zero GUID. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GUIDToString @@ -606,6 +635,8 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetGamepadGUIDForID(SDL_JoystickID inst * \returns the USB vendor ID of the selected gamepad. If called on an invalid * index, this function returns zero. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadVendor @@ -623,6 +654,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendorForID(SDL_JoystickID inst * \returns the USB product ID of the selected gamepad. If called on an * invalid index, this function returns zero. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProduct @@ -640,6 +673,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductForID(SDL_JoystickID ins * \returns the product version of the selected gamepad. If called on an * invalid index, this function returns zero. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductVersion @@ -655,6 +690,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersionForID(SDL_Joystic * \param instance_id the joystick instance ID. * \returns the gamepad type. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadType @@ -671,6 +708,8 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeForID(SDL_Joystick * \param instance_id the joystick instance ID. * \returns the gamepad type. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeForID @@ -688,6 +727,8 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadTypeForID(SDL_Joys * \returns the mapping string. Returns NULL if no mapping is available. This * should be freed with SDL_free() when it is no longer needed. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepads @@ -702,6 +743,8 @@ extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForID(SDL_JoystickID ins * \returns a gamepad identifier or NULL if an error occurred; call * SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseGamepad @@ -717,6 +760,8 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_OpenGamepad(SDL_JoystickID instanc * \returns an SDL_Gamepad on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromID(SDL_JoystickID instance_id); @@ -727,6 +772,8 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromID(SDL_JoystickID in * \param player_index the player index, which different from the instance ID. * \returns the SDL_Gamepad associated with a player index. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex @@ -757,6 +804,8 @@ extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromPlayerIndex(int play * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGamepadProperties(SDL_Gamepad *gamepad); @@ -775,6 +824,8 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGamepadProperties(SDL_Gamepa * \returns the instance ID of the specified gamepad on success or 0 on * failure; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad); @@ -787,6 +838,8 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad * \returns the implementation dependent name for the gamepad, or NULL if * there is no name or the identifier passed is invalid. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadNameForID @@ -801,6 +854,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadName(SDL_Gamepad *gamepad * \returns the implementation dependent path for the gamepad, or NULL if * there is no path or the identifier passed is invalid. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPathForID @@ -814,6 +869,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPath(SDL_Gamepad *gamepad * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not * available. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeForID @@ -827,6 +884,8 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadType(SDL_Gamepad *game * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not * available. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRealGamepadTypeForID @@ -841,6 +900,8 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadType(SDL_Gamepad * * \param gamepad the gamepad object to query. * \returns the player index for gamepad, or -1 if it's not available. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadPlayerIndex @@ -856,6 +917,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndex(SDL_Gamepad *gamepad); * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadPlayerIndex @@ -870,6 +933,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadPlayerIndex(SDL_Gamepad *gamepad, * \param gamepad the gamepad object to query. * \returns the USB vendor ID, or zero if unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadVendorForID @@ -884,6 +949,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendor(SDL_Gamepad *gamepad); * \param gamepad the gamepad object to query. * \returns the USB product ID, or zero if unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductForID @@ -898,6 +965,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProduct(SDL_Gamepad *gamepad); * \param gamepad the gamepad object to query. * \returns the USB product version, or zero if unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadProductVersionForID @@ -912,6 +981,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersion(SDL_Gamepad *gam * \param gamepad the gamepad object to query. * \returns the gamepad firmware version, or zero if unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *gamepad); @@ -924,6 +995,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *ga * \param gamepad the gamepad object to query. * \returns the serial number, or NULL if unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamepad); @@ -937,6 +1010,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamep * \param gamepad the gamepad object to query. * \returns the gamepad handle, or 0 if unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetGamepadSteamHandle(SDL_Gamepad *gamepad); @@ -949,6 +1024,8 @@ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetGamepadSteamHandle(SDL_Gamepad *gamepa * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError() * for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetGamepadConnectionState(SDL_Gamepad *gamepad); @@ -969,6 +1046,8 @@ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetGamepadConnection * battery. * \returns the current battery state. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetGamepadPowerInfo(SDL_Gamepad *gamepad, int *percent); @@ -981,6 +1060,8 @@ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetGamepadPowerInfo(SDL_Gamepad * * \returns true if the gamepad has been opened and is currently connected, or * false if not. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); @@ -1001,6 +1082,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); * \returns an SDL_Joystick object, or NULL on failure; call SDL_GetError() * for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetGamepadJoystick(SDL_Gamepad *gamepad); @@ -1013,6 +1096,8 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetGamepadJoystick(SDL_Gamepad *g * * \param enabled whether to process gamepad events or not. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadEventsEnabled @@ -1028,6 +1113,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGamepadEventsEnabled(bool enabled); * * \returns true if gamepad events are being processed, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadEventsEnabled @@ -1044,6 +1131,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadEventsEnabled(void); * single allocation that should be freed with SDL_free() when it is * no longer needed. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gamepad *gamepad, int *count); @@ -1055,6 +1144,8 @@ extern SDL_DECLSPEC SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gam * enabled. Under such circumstances, it will not be necessary to call this * function. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateGamepads(void); @@ -1071,6 +1162,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_UpdateGamepads(void); * \returns the SDL_GamepadType enum corresponding to the input string, or * `SDL_GAMEPAD_TYPE_UNKNOWN` if no match was found. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForType @@ -1085,6 +1178,8 @@ extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeFromString(const c * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTypeFromString @@ -1107,6 +1202,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForType(SDL_Gamepad * \returns the SDL_GamepadAxis enum corresponding to the input string, or * `SDL_GAMEPAD_AXIS_INVALID` if no match was found. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForAxis @@ -1121,6 +1218,8 @@ extern SDL_DECLSPEC SDL_GamepadAxis SDLCALL SDL_GetGamepadAxisFromString(const c * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAxisFromString @@ -1137,6 +1236,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForAxis(SDL_Gamepad * \param axis an axis enum value (an SDL_GamepadAxis value). * \returns true if the gamepad has this axis, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasButton @@ -1156,10 +1257,14 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_Ga * return a negative value. Note that this differs from the value reported by * the lower-level SDL_GetJoystickAxis(), which normally uses the full range. * + * Note that for invalid gamepads or axes, this will return 0. Zero is also a + * valid value in normal operation; usually it means a centered axis. + * * \param gamepad a gamepad. * \param axis an axis index (one of the SDL_GamepadAxis values). - * \returns axis state (including 0) on success or 0 (also) on failure; call - * SDL_GetError() for more information. + * \returns axis state. + * + * \threadsafety It is safe to call this function from any thread. * * \since This function is available since SDL 3.2.0. * @@ -1176,10 +1281,12 @@ extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetGamepadAxis(SDL_Gamepad *gamepad, SDL_ * You do not normally need to call this function unless you are parsing * SDL_Gamepad mappings in your own code. * - * \param str string representing a SDL_Gamepad axis. + * \param str string representing a SDL_Gamepad button. * \returns the SDL_GamepadButton enum corresponding to the input string, or * `SDL_GAMEPAD_BUTTON_INVALID` if no match was found. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadStringForButton @@ -1194,6 +1301,8 @@ extern SDL_DECLSPEC SDL_GamepadButton SDLCALL SDL_GetGamepadButtonFromString(con * specified. The string returned is of the format used by * SDL_Gamepad mapping strings. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonFromString @@ -1210,6 +1319,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForButton(SDL_Gamep * \param button a button enum value (an SDL_GamepadButton value). * \returns true if the gamepad has this button, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasAxis @@ -1223,6 +1334,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_ * \param button a button index (one of the SDL_GamepadButton values). * \returns true if the button is pressed, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasButton @@ -1237,6 +1350,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_ * \param button a button index (one of the SDL_GamepadButton values). * \returns the SDL_GamepadButtonLabel enum corresponding to the button label. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonLabel @@ -1250,6 +1365,8 @@ extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabelForT * \param button a button index (one of the SDL_GamepadButton values). * \returns the SDL_GamepadButtonLabel enum corresponding to the button label. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadButtonLabelForType @@ -1262,6 +1379,8 @@ extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabel(SDL * \param gamepad a gamepad. * \returns number of touchpads. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumGamepadTouchpadFingers @@ -1276,6 +1395,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpads(SDL_Gamepad *gamepad) * \param touchpad a touchpad. * \returns number of supported simultaneous fingers. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadTouchpadFinger @@ -1299,6 +1420,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpadFingers(SDL_Gamepad *ga * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumGamepadTouchpadFingers @@ -1312,6 +1435,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadTouchpadFinger(SDL_Gamepad *gamep * \param type the type of sensor to query. * \returns true if the sensor exists, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadSensorData @@ -1329,6 +1454,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasSensor(SDL_Gamepad *gamepad, SDL_ * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GamepadHasSensor @@ -1343,6 +1470,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadSensorEnabled(SDL_Gamepad *gamepa * \param type the type of sensor to query. * \returns true if the sensor is enabled, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SetGamepadSensorEnabled @@ -1356,6 +1485,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GamepadSensorEnabled(SDL_Gamepad *gamepad, * \param type the type of sensor to query. * \returns the data rate, or 0.0f if the data rate is not available. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *gamepad, SDL_SensorType type); @@ -1364,7 +1495,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *game * Get the current state of a gamepad sensor. * * The number of values and interpretation of the data is sensor dependent. - * See SDL_sensor.h for the details for each type of sensor. + * See the remarks in SDL_SensorType for details for each type of sensor. * * \param gamepad the gamepad to query. * \param type the type of sensor to query. @@ -1373,6 +1504,8 @@ extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *game * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamepad, SDL_SensorType type, float *data, int num_values); @@ -1395,6 +1528,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamepad, * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); @@ -1421,6 +1556,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_RumbleGamepad @@ -1443,6 +1580,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepadTriggers(SDL_Gamepad *gamepad, * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uint8 red, Uint8 green, Uint8 blue); @@ -1456,6 +1595,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uint8 r * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, const void *data, int size); @@ -1466,6 +1607,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, con * \param gamepad a gamepad identifier previously returned by * SDL_OpenGamepad(). * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenGamepad @@ -1480,6 +1623,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseGamepad(SDL_Gamepad *gamepad); * \param button a button on the gamepad. * \returns the sfSymbolsName or NULL if the name can't be found. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAppleSFSymbolsNameForAxis @@ -1493,6 +1638,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForButt * \param axis an axis on the gamepad. * \returns the sfSymbolsName or NULL if the name can't be found. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetGamepadAppleSFSymbolsNameForButton diff --git a/vendor/sdl3/include/SDL_gpu.h b/vendor/sdl3/include/SDL_gpu.h index b61661909..d35104a7d 100644 --- a/vendor/sdl3/include/SDL_gpu.h +++ b/vendor/sdl3/include/SDL_gpu.h @@ -206,14 +206,20 @@ * underlying graphics API. While it's possible that we have done something * inefficiently, it's very unlikely especially if you are relatively * inexperienced with GPU rendering. Please see the performance tips above and - * make sure you are following them. Additionally, tools like RenderDoc can be - * very helpful for diagnosing incorrect behavior and performance issues. + * make sure you are following them. Additionally, tools like + * [RenderDoc](https://renderdoc.org/) + * can be very helpful for diagnosing incorrect behavior and performance + * issues. * * ## System Requirements * - * **Vulkan:** Supported on Windows, Linux, Nintendo Switch, and certain - * Android devices. Requires Vulkan 1.0 with the following extensions and - * device features: + * ### Vulkan + * + * SDL driver name: "vulkan" (for use in SDL_CreateGPUDevice() and + * SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING) + * + * Supported on Windows, Linux, Nintendo Switch, and certain Android devices. + * Requires Vulkan 1.0 with the following extensions and device features: * * - `VK_KHR_swapchain` * - `VK_KHR_maintenance1` @@ -222,13 +228,37 @@ * - `depthClamp` * - `shaderClipDistance` * - `drawIndirectFirstInstance` + * - `sampleRateShading` * - * **D3D12:** Supported on Windows 10 or newer, Xbox One (GDK), and Xbox - * Series X|S (GDK). Requires a GPU that supports DirectX 12 Feature Level - * 11_1. + * You can remove some of these requirements to increase compatibility with + * Android devices by using these properties when creating the GPU device with + * SDL_CreateGPUDeviceWithProperties(): * - * **Metal:** Supported on macOS 10.14+ and iOS/tvOS 13.0+. Hardware - * requirements vary by operating system: + * - SDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN + * - SDL_PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN + * - SDL_PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN + * - SDL_PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN + * + * ### D3D12 + * + * SDL driver name: "direct3d12" + * + * Supported on Windows 10 or newer, Xbox One (GDK), and Xbox Series X|S + * (GDK). Requires a GPU that supports DirectX 12 Feature Level 11_0 and + * Resource Binding Tier 2 or above. + * + * You can remove the Tier 2 resource binding requirement to support Intel + * Haswell and Broadwell GPUs by using this property when creating the GPU + * device with SDL_CreateGPUDeviceWithProperties(): + * + * - SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN + * + * ### Metal + * + * SDL driver name: "metal" + * + * Supported on macOS 10.14+ and iOS/tvOS 13.0+. Hardware requirements vary by + * operating system: * * - macOS requires an Apple Silicon or * [Intel Mac2 family](https://developer.apple.com/documentation/metal/mtlfeatureset/mtlfeatureset_macos_gpufamily2_v1?language=objc) @@ -236,6 +266,26 @@ * - iOS/tvOS requires an A9 GPU or newer * - iOS Simulator and tvOS Simulator are unsupported * + * ## Coordinate System + * + * The GPU API uses a left-handed coordinate system, following the convention + * of D3D12 and Metal. Specifically: + * + * - **Normalized Device Coordinates:** The lower-left corner has an x,y + * coordinate of `(-1.0, -1.0)`. The upper-right corner is `(1.0, 1.0)`. Z + * values range from `[0.0, 1.0]` where 0 is the near plane. + * - **Viewport Coordinates:** The top-left corner has an x,y coordinate of + * `(0, 0)` and extends to the bottom-right corner at `(viewportWidth, + * viewportHeight)`. +Y is down. + * - **Texture Coordinates:** The top-left corner has an x,y coordinate of + * `(0, 0)` and extends to the bottom-right corner at `(1.0, 1.0)`. +Y is + * down. + * + * If the backend driver differs from this convention (e.g. Vulkan, which has + * an NDC that assumes +Y is down), SDL will automatically convert the + * coordinate system behind the scenes, so you don't need to perform any + * coordinate flipping logic in your shaders. + * * ## Uniform Data * * Uniforms are for passing data to shaders. The uniform data will be constant @@ -301,6 +351,39 @@ * unreferenced data in a bound resource without cycling, but overwriting a * section of data that has already been referenced will produce unexpected * results. + * + * ## Debugging + * + * At some point of your GPU journey, you will probably encounter issues that + * are not traceable with regular debugger - for example, your code compiles + * but you get an empty screen, or your shader fails in runtime. + * + * For debugging such cases, there are tools that allow visually inspecting + * the whole GPU frame, every drawcall, every bound resource, memory buffers, + * etc. They are the following, per platform: + * + * * For Windows/Linux, use + * [RenderDoc](https://renderdoc.org/) + * * For MacOS (Metal), use Xcode built-in debugger (Open XCode, go to Debug > + * Debug Executable..., select your application, set "GPU Frame Capture" to + * "Metal" in scheme "Options" window, run your app, and click the small + * Metal icon on the bottom to capture a frame) + * + * Aside from that, you may want to enable additional debug layers to receive + * more detailed error messages, based on your GPU backend: + * + * * For D3D12, the debug layer is an optional feature that can be installed + * via "Windows Settings -> System -> Optional features" and adding the + * "Graphics Tools" optional feature. + * * For Vulkan, you will need to install Vulkan SDK on Windows, and on Linux, + * you usually have some sort of `vulkan-validation-layers` system package + * that should be installed. + * * For Metal, it should be enough just to run the application from XCode to + * receive detailed errors or warnings in the output. + * + * Don't hesitate to use tools as RenderDoc when encountering runtime issues + * or unexpected output on screen, quick GPU frame inspection can usually help + * you fix the majority of such problems. */ #ifndef SDL_gpu_h_ @@ -1091,7 +1174,7 @@ typedef enum SDL_GPUCompareOp SDL_GPU_COMPAREOP_LESS_OR_EQUAL, /**< The comparison evaluates reference <= test. */ SDL_GPU_COMPAREOP_GREATER, /**< The comparison evaluates reference > test. */ SDL_GPU_COMPAREOP_NOT_EQUAL, /**< The comparison evaluates reference != test. */ - SDL_GPU_COMPAREOP_GREATER_OR_EQUAL, /**< The comparison evalutes reference >= test. */ + SDL_GPU_COMPAREOP_GREATER_OR_EQUAL, /**< The comparison evaluates reference >= test. */ SDL_GPU_COMPAREOP_ALWAYS /**< The comparison always evaluates true. */ } SDL_GPUCompareOp; @@ -1310,6 +1393,17 @@ typedef struct SDL_GPUViewport * A structure specifying parameters related to transferring data to or from a * texture. * + * If either of `pixels_per_row` or `rows_per_layer` is zero, then width and + * height of passed SDL_GPUTextureRegion to SDL_UploadToGPUTexture or + * SDL_DownloadFromGPUTexture are used as default values respectively and data + * is considered to be tightly packed. + * + * **WARNING**: Direct3D 12 requires texture data row pitch to be 256 byte + * aligned, and offsets to be aligned to 512 bytes. If they are not, SDL will + * make a temporary copy of the data that is properly aligned, but this adds + * overhead to the transfer process. Apps can avoid this by aligning their + * data appropriately, or using a different GPU backend than Direct3D 12. + * * \since This struct is available since SDL 3.2.0. * * \sa SDL_UploadToGPUTexture @@ -1391,7 +1485,7 @@ typedef struct SDL_GPUTextureRegion */ typedef struct SDL_GPUBlitRegion { - SDL_GPUTexture *texture; /**< The texture. */ + SDL_GPUTexture *texture; /**< The texture. */ Uint32 mip_level; /**< The mip level index of the region. */ Uint32 layer_or_depth_plane; /**< The layer index or depth plane of the region. This value is treated as a layer index on 2D array and cube textures, and as a depth plane on 3D textures. */ Uint32 x; /**< The left offset of the region. */ @@ -1520,8 +1614,8 @@ typedef struct SDL_GPUSamplerCreateInfo SDL_GPUCompareOp compare_op; /**< The comparison operator to apply to fetched data before filtering. */ float min_lod; /**< Clamps the minimum of the computed LOD value. */ float max_lod; /**< Clamps the maximum of the computed LOD value. */ - bool enable_anisotropy; /**< true to enable anisotropic filtering. */ - bool enable_compare; /**< true to enable comparison against a reference value during lookups. */ + bool enable_anisotropy; /**< true to enable anisotropic filtering. */ + bool enable_compare; /**< true to enable comparison against a reference value during lookups. */ Uint8 padding1; Uint8 padding2; @@ -1549,7 +1643,7 @@ typedef struct SDL_GPUSamplerCreateInfo typedef struct SDL_GPUVertexBufferDescription { Uint32 slot; /**< The binding slot of the vertex buffer. */ - Uint32 pitch; /**< The byte pitch between consecutive elements of the vertex buffer. */ + Uint32 pitch; /**< The size of a single element + the offset between elements. */ SDL_GPUVertexInputRate input_rate; /**< Whether attribute addressing is a function of the vertex index or instance index. */ Uint32 instance_step_rate; /**< Reserved for future use. Must be set to 0. */ } SDL_GPUVertexBufferDescription; @@ -1613,6 +1707,9 @@ typedef struct SDL_GPUStencilOpState * \since This struct is available since SDL 3.2.0. * * \sa SDL_GPUColorTargetDescription + * \sa SDL_GPUBlendFactor + * \sa SDL_GPUBlendOp + * \sa SDL_GPUColorComponentFlags */ typedef struct SDL_GPUColorTargetBlendState { @@ -1623,8 +1720,8 @@ typedef struct SDL_GPUColorTargetBlendState SDL_GPUBlendFactor dst_alpha_blendfactor; /**< The value to be multiplied by the destination alpha. */ SDL_GPUBlendOp alpha_blend_op; /**< The blend operation for the alpha component. */ SDL_GPUColorComponentFlags color_write_mask; /**< A bitmask specifying which of the RGBA components are enabled for writing. Writes to all channels if enable_color_write_mask is false. */ - bool enable_blend; /**< Whether blending is enabled for the color target. */ - bool enable_color_write_mask; /**< Whether the color write mask is enabled. */ + bool enable_blend; /**< Whether blending is enabled for the color target. */ + bool enable_color_write_mask; /**< Whether the color write mask is enabled. */ Uint8 padding1; Uint8 padding2; } SDL_GPUColorTargetBlendState; @@ -1636,6 +1733,8 @@ typedef struct SDL_GPUColorTargetBlendState * \since This struct is available since SDL 3.2.0. * * \sa SDL_CreateGPUShader + * \sa SDL_GPUShaderFormat + * \sa SDL_GPUShaderStage */ typedef struct SDL_GPUShaderCreateInfo { @@ -1741,8 +1840,8 @@ typedef struct SDL_GPURasterizerState float depth_bias_constant_factor; /**< A scalar factor controlling the depth value added to each fragment. */ float depth_bias_clamp; /**< The maximum depth bias of a fragment. */ float depth_bias_slope_factor; /**< A scalar factor applied to a fragment's slope in depth calculations. */ - bool enable_depth_bias; /**< true to bias fragment depth values. */ - bool enable_depth_clip; /**< true to enable depth clip, false to enable depth clamp. */ + bool enable_depth_bias; /**< true to bias fragment depth values. */ + bool enable_depth_clip; /**< true to enable depth clip, false to enable depth clamp. */ Uint8 padding1; Uint8 padding2; } SDL_GPURasterizerState; @@ -1759,8 +1858,8 @@ typedef struct SDL_GPUMultisampleState { SDL_GPUSampleCount sample_count; /**< The number of samples to be used in rasterization. */ Uint32 sample_mask; /**< Reserved for future use. Must be set to 0. */ - bool enable_mask; /**< Reserved for future use. Must be set to false. */ - Uint8 padding1; + bool enable_mask; /**< Reserved for future use. Must be set to false. */ + bool enable_alpha_to_coverage; /**< true enables the alpha-to-coverage feature. */ Uint8 padding2; Uint8 padding3; } SDL_GPUMultisampleState; @@ -1780,9 +1879,9 @@ typedef struct SDL_GPUDepthStencilState SDL_GPUStencilOpState front_stencil_state; /**< The stencil op state for front-facing triangles. */ Uint8 compare_mask; /**< Selects the bits of the stencil values participating in the stencil test. */ Uint8 write_mask; /**< Selects the bits of the stencil values updated by the stencil test. */ - bool enable_depth_test; /**< true enables the depth test. */ - bool enable_depth_write; /**< true enables depth writes. Depth writes are always disabled when enable_depth_test is false. */ - bool enable_stencil_test; /**< true enables the stencil test. */ + bool enable_depth_test; /**< true enables the depth test. */ + bool enable_depth_write; /**< true enables depth writes. Depth writes are always disabled when enable_depth_test is false. */ + bool enable_stencil_test; /**< true enables the stencil test. */ Uint8 padding1; Uint8 padding2; Uint8 padding3; @@ -1817,7 +1916,7 @@ typedef struct SDL_GPUGraphicsPipelineTargetInfo const SDL_GPUColorTargetDescription *color_target_descriptions; /**< A pointer to an array of color target descriptions. */ Uint32 num_color_targets; /**< The number of color target descriptions in the above array. */ SDL_GPUTextureFormat depth_stencil_format; /**< The pixel format of the depth-stencil target. Ignored if has_depth_stencil_target is false. */ - bool has_depth_stencil_target; /**< true specifies that the pipeline uses a depth-stencil target. */ + bool has_depth_stencil_target; /**< true specifies that the pipeline uses a depth-stencil target. */ Uint8 padding1; Uint8 padding2; Uint8 padding3; @@ -1912,6 +2011,7 @@ typedef struct SDL_GPUComputePipelineCreateInfo * \since This struct is available since SDL 3.2.0. * * \sa SDL_BeginGPURenderPass + * \sa SDL_FColor */ typedef struct SDL_GPUColorTargetInfo { @@ -1924,8 +2024,8 @@ typedef struct SDL_GPUColorTargetInfo SDL_GPUTexture *resolve_texture; /**< The texture that will receive the results of a multisample resolve operation. Ignored if a RESOLVE* store_op is not used. */ Uint32 resolve_mip_level; /**< The mip level of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used. */ Uint32 resolve_layer; /**< The layer index of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used. */ - bool cycle; /**< true cycles the texture if the texture is bound and load_op is not LOAD */ - bool cycle_resolve_texture; /**< true cycles the resolve texture if the resolve texture is bound. Ignored if a RESOLVE* store_op is not used. */ + bool cycle; /**< true cycles the texture if the texture is bound and load_op is not LOAD */ + bool cycle_resolve_texture; /**< true cycles the resolve texture if the resolve texture is bound. Ignored if a RESOLVE* store_op is not used. */ Uint8 padding1; Uint8 padding2; } SDL_GPUColorTargetInfo; @@ -1970,6 +2070,9 @@ typedef struct SDL_GPUColorTargetInfo * * Note that depth/stencil targets do not support multisample resolves. * + * Due to ABI limitations, depth textures with more than 255 layers are not + * supported. + * * \since This struct is available since SDL 3.2.0. * * \sa SDL_BeginGPURenderPass @@ -1982,10 +2085,10 @@ typedef struct SDL_GPUDepthStencilTargetInfo SDL_GPUStoreOp store_op; /**< What is done with the depth results of the render pass. */ SDL_GPULoadOp stencil_load_op; /**< What is done with the stencil contents at the beginning of the render pass. */ SDL_GPUStoreOp stencil_store_op; /**< What is done with the stencil results of the render pass. */ - bool cycle; /**< true cycles the texture if the texture is bound and any load ops are not LOAD */ + bool cycle; /**< true cycles the texture if the texture is bound and any load ops are not LOAD */ Uint8 clear_stencil; /**< The value to clear the stencil component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */ - Uint8 padding1; - Uint8 padding2; + Uint8 mip_level; /**< The mip level to use as the depth stencil target. */ + Uint8 layer; /**< The layer index to use as the depth stencil target. */ } SDL_GPUDepthStencilTargetInfo; /** @@ -2002,7 +2105,7 @@ typedef struct SDL_GPUBlitInfo { SDL_FColor clear_color; /**< The color to clear the destination region to before the blit. Ignored if load_op is not SDL_GPU_LOADOP_CLEAR. */ SDL_FlipMode flip_mode; /**< The flip mode for the source region. */ SDL_GPUFilter filter; /**< The filter mode used when blitting. */ - bool cycle; /**< true cycles the destination texture if it is already bound. */ + bool cycle; /**< true cycles the destination texture if it is already bound. */ Uint8 padding1; Uint8 padding2; Uint8 padding3; @@ -2031,6 +2134,8 @@ typedef struct SDL_GPUBufferBinding * * \sa SDL_BindGPUVertexSamplers * \sa SDL_BindGPUFragmentSamplers + * \sa SDL_GPUTexture + * \sa SDL_GPUSampler */ typedef struct SDL_GPUTextureSamplerBinding { @@ -2111,6 +2216,13 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsProperties( /** * Creates a GPU context. * + * The GPU driver name can be one of the following: + * + * - "vulkan": [Vulkan](CategoryGPU#vulkan) + * - "direct3d12": [D3D12](CategoryGPU#d3d12) + * - "metal": [Metal](CategoryGPU#metal) + * - NULL: let SDL pick the optimal driver + * * \param format_flags a bitflag indicating which shader formats the app is * able to provide. * \param debug_mode enable debug mode properties and validations. @@ -2121,6 +2233,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsProperties( * * \since This function is available since SDL 3.2.0. * + * \sa SDL_CreateGPUDeviceWithProperties * \sa SDL_GetGPUShaderFormats * \sa SDL_GetGPUDeviceDriver * \sa SDL_DestroyGPUDevice @@ -2140,8 +2253,31 @@ extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDevice( * properties and validations, defaults to true. * - `SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN`: enable to prefer * energy efficiency over maximum GPU performance, defaults to false. + * - `SDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN`: enable to automatically log + * useful debug information on device creation, defaults to true. * - `SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING`: the name of the GPU driver to * use, if a specific one is desired. + * - `SDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN`: Enable Vulkan + * device feature shaderClipDistance. If disabled, clip distances are not + * supported in shader code: gl_ClipDistance[] built-ins of GLSL, + * SV_ClipDistance0/1 semantics of HLSL and [[clip_distance]] attribute of + * Metal. Disabling optional features allows the application to run on some + * older Android devices. Defaults to true. + * - `SDL_PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN`: Enable + * Vulkan device feature depthClamp. If disabled, there is no depth clamp + * support and enable_depth_clip in SDL_GPURasterizerState must always be + * set to true. Disabling optional features allows the application to run on + * some older Android devices. Defaults to true. + * - `SDL_PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN`: + * Enable Vulkan device feature drawIndirectFirstInstance. If disabled, the + * argument first_instance of SDL_GPUIndirectDrawCommand must be set to + * zero. Disabling optional features allows the application to run on some + * older Android devices. Defaults to true. + * - `SDL_PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN`: Enable Vulkan + * device feature samplerAnisotropy. If disabled, enable_anisotropy of + * SDL_GPUSamplerCreateInfo must be set to false. Disabling optional + * features allows the application to run on some older Android devices. + * Defaults to true. * * These are the current shader format properties: * @@ -2158,10 +2294,32 @@ extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDevice( * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN`: The app is able to * provide Metal shader libraries if applicable. * - * With the D3D12 renderer: + * With the D3D12 backend: * * - `SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING`: the prefix to * use for all vertex semantics, default is "TEXCOORD". + * - `SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN`: By + * default, Resourcing Binding Tier 2 is required for D3D12 support. + * However, an application can set this property to true to enable Tier 1 + * support, if (and only if) the application uses 8 or fewer storage + * resources across all shader stages. As of writing, this property is + * useful for targeting Intel Haswell and Broadwell GPUs; other hardware + * either supports Tier 2 Resource Binding or does not support D3D12 in any + * capacity. Defaults to false. + * + * With the Vulkan backend: + * + * - `SDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN`: + * By default, Vulkan device enumeration includes drivers of all types, + * including software renderers (for example, the Lavapipe Mesa driver). + * This can be useful if your application _requires_ SDL_GPU, but if you can + * provide your own fallback renderer (for example, an OpenGL renderer) this + * property can be set to true. Defaults to false. + * - `SDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER`: a pointer to an + * SDL_GPUVulkanOptions structure to be processed during device creation. + * This allows configuring a variety of Vulkan-specific options such as + * increasing the API version and opting into extensions aside from the + * minimal set SDL requires. * * \param props the properties to use. * \returns a GPU context on success or NULL on failure; call SDL_GetError() @@ -2177,16 +2335,52 @@ extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDevice( extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDeviceWithProperties( SDL_PropertiesID props); -#define SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN "SDL.gpu.device.create.debugmode" -#define SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN "SDL.gpu.device.create.preferlowpower" -#define SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING "SDL.gpu.device.create.name" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN "SDL.gpu.device.create.shaders.private" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN "SDL.gpu.device.create.shaders.spirv" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN "SDL.gpu.device.create.shaders.dxbc" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN "SDL.gpu.device.create.shaders.dxil" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN "SDL.gpu.device.create.shaders.msl" -#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN "SDL.gpu.device.create.shaders.metallib" -#define SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING "SDL.gpu.device.create.d3d12.semantic" +#define SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN "SDL.gpu.device.create.debugmode" +#define SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN "SDL.gpu.device.create.preferlowpower" +#define SDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN "SDL.gpu.device.create.verbose" +#define SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING "SDL.gpu.device.create.name" +#define SDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN "SDL.gpu.device.create.feature.clip_distance" +#define SDL_PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN "SDL.gpu.device.create.feature.depth_clamping" +#define SDL_PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN "SDL.gpu.device.create.feature.indirect_draw_first_instance" +#define SDL_PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN "SDL.gpu.device.create.feature.anisotropy" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN "SDL.gpu.device.create.shaders.private" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN "SDL.gpu.device.create.shaders.spirv" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN "SDL.gpu.device.create.shaders.dxbc" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN "SDL.gpu.device.create.shaders.dxil" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN "SDL.gpu.device.create.shaders.msl" +#define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN "SDL.gpu.device.create.shaders.metallib" +#define SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN "SDL.gpu.device.create.d3d12.allowtier1resourcebinding" +#define SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING "SDL.gpu.device.create.d3d12.semantic" +#define SDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN "SDL.gpu.device.create.vulkan.requirehardwareacceleration" +#define SDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER "SDL.gpu.device.create.vulkan.options" + + +/** + * A structure specifying additional options when using Vulkan. + * + * When no such structure is provided, SDL will use Vulkan API version 1.0 and + * a minimal set of features. The requested API version influences how the + * feature_list is processed by SDL. When requesting API version 1.0, the + * feature_list is ignored. Only the vulkan_10_physical_device_features and + * the extension lists are used. When requesting API version 1.1, the + * feature_list is scanned for feature structures introduced in Vulkan 1.1. + * When requesting Vulkan 1.2 or higher, the feature_list is additionally + * scanned for compound feature structs such as + * VkPhysicalDeviceVulkan11Features. The device and instance extension lists, + * as well as vulkan_10_physical_device_features, are always processed. + * + * \since This struct is available since SDL 3.4.0. + */ +typedef struct SDL_GPUVulkanOptions +{ + Uint32 vulkan_api_version; /**< The Vulkan API version to request for the instance. Use Vulkan's VK_MAKE_VERSION or VK_MAKE_API_VERSION. */ + void *feature_list; /**< Pointer to the first element of a chain of Vulkan feature structs. (Requires API version 1.1 or higher.)*/ + void *vulkan_10_physical_device_features; /**< Pointer to a VkPhysicalDeviceFeatures struct to enable additional Vulkan 1.0 features. */ + Uint32 device_extension_count; /**< Number of additional device extensions to require. */ + const char **device_extension_names; /**< Pointer to a list of additional device extensions to require. */ + Uint32 instance_extension_count; /**< Number of additional instance extensions to require. */ + const char **instance_extension_names; /**< Pointer to a list of additional instance extensions to require. */ +} SDL_GPUVulkanOptions; /** * Destroys a GPU context previously returned by SDL_CreateGPUDevice. @@ -2250,6 +2444,116 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDeviceDriver(SDL_GPUDevice *d */ extern SDL_DECLSPEC SDL_GPUShaderFormat SDLCALL SDL_GetGPUShaderFormats(SDL_GPUDevice *device); +/** + * Get the properties associated with a GPU device. + * + * All properties are optional and may differ between GPU backends and SDL + * versions. + * + * The following properties are provided by SDL: + * + * `SDL_PROP_GPU_DEVICE_NAME_STRING`: Contains the name of the underlying + * device as reported by the system driver. This string has no standardized + * format, is highly inconsistent between hardware devices and drivers, and is + * able to change at any time. Do not attempt to parse this string as it is + * bound to fail at some point in the future when system drivers are updated, + * new hardware devices are introduced, or when SDL adds new GPU backends or + * modifies existing ones. + * + * Strings that have been found in the wild include: + * + * - GTX 970 + * - GeForce GTX 970 + * - NVIDIA GeForce GTX 970 + * - Microsoft Direct3D12 (NVIDIA GeForce GTX 970) + * - NVIDIA Graphics Device + * - GeForce GPU + * - P106-100 + * - AMD 15D8:C9 + * - AMD Custom GPU 0405 + * - AMD Radeon (TM) Graphics + * - ASUS Radeon RX 470 Series + * - Intel(R) Arc(tm) A380 Graphics (DG2) + * - Virtio-GPU Venus (NVIDIA TITAN V) + * - SwiftShader Device (LLVM 16.0.0) + * - llvmpipe (LLVM 15.0.4, 256 bits) + * - Microsoft Basic Render Driver + * - unknown device + * + * The above list shows that the same device can have different formats, the + * vendor name may or may not appear in the string, the included vendor name + * may not be the vendor of the chipset on the device, some manufacturers + * include pseudo-legal marks while others don't, some devices may not use a + * marketing name in the string, the device string may be wrapped by the name + * of a translation interface, the device may be emulated in software, or the + * string may contain generic text that does not identify the device at all. + * + * `SDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING`: Contains the self-reported name + * of the underlying system driver. + * + * Strings that have been found in the wild include: + * + * - Intel Corporation + * - Intel open-source Mesa driver + * - Qualcomm Technologies Inc. Adreno Vulkan Driver + * - MoltenVK + * - Mali-G715 + * - venus + * + * `SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING`: Contains the self-reported + * version of the underlying system driver. This is a relatively short version + * string in an unspecified format. If SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING + * is available then that property should be preferred over this one as it may + * contain additional information that is useful for identifying the exact + * driver version used. + * + * Strings that have been found in the wild include: + * + * - 53.0.0 + * - 0.405.2463 + * - 32.0.15.6614 + * + * `SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING`: Contains the detailed version + * information of the underlying system driver as reported by the driver. This + * is an arbitrary string with no standardized format and it may contain + * newlines. This property should be preferred over + * SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING if it is available as it usually + * contains the same information but in a format that is easier to read. + * + * Strings that have been found in the wild include: + * + * - 101.6559 + * - 1.2.11 + * - Mesa 21.2.2 (LLVM 12.0.1) + * - Mesa 22.2.0-devel (git-f226222 2022-04-14 impish-oibaf-ppa) + * - v1.r53p0-00eac0.824c4f31403fb1fbf8ee1042422c2129 + * + * This string has also been observed to be a multiline string (which has a + * trailing newline): + * + * ``` + * Driver Build: 85da404, I46ff5fc46f, 1606794520 + * Date: 11/30/20 + * Compiler Version: EV031.31.04.01 + * Driver Branch: promo490_3_Google + * ``` + * + * \param device a GPU context to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGPUDeviceProperties(SDL_GPUDevice *device); + +#define SDL_PROP_GPU_DEVICE_NAME_STRING "SDL.gpu.device.name" +#define SDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING "SDL.gpu.device.driver_name" +#define SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING "SDL.gpu.device.driver_version" +#define SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING "SDL.gpu.device.driver_info" + + /* State Creation */ /** @@ -2440,7 +2744,8 @@ extern SDL_DECLSPEC SDL_GPUShader * SDLCALL SDL_CreateGPUShader( * Creates a texture object to be used in graphics or compute workflows. * * The contents of this texture are undefined until data is written to the - * texture. + * texture, either via SDL_UploadToGPUTexture or by performing a render or + * compute pass with this texture as a target. * * Note that certain combinations of usage flags are invalid. For example, a * texture cannot have both the SAMPLER and GRAPHICS_STORAGE_READ flags. @@ -2482,6 +2787,8 @@ extern SDL_DECLSPEC SDL_GPUShader * SDLCALL SDL_CreateGPUShader( * * \sa SDL_UploadToGPUTexture * \sa SDL_DownloadFromGPUTexture + * \sa SDL_BeginGPURenderPass + * \sa SDL_BeginGPUComputePass * \sa SDL_BindGPUVertexSamplers * \sa SDL_BindGPUVertexStorageTextures * \sa SDL_BindGPUFragmentSamplers @@ -2638,6 +2945,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetGPUTextureName( * * Useful for debugging. * + * On Direct3D 12, using SDL_InsertGPUDebugLabel requires + * WinPixEventRuntime.dll to be in your PATH or in the same directory as your + * executable. See + * [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) + * for instructions on how to obtain it. + * * \param command_buffer a command buffer. * \param text a UTF-8 string constant to insert as the label. * @@ -2648,7 +2961,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel( const char *text); /** - * Begins a debug group with an arbitary name. + * Begins a debug group with an arbitrary name. * * Used for denoting groups of calls when viewing the command buffer * callstream in a graphics debugging tool. @@ -2656,6 +2969,11 @@ extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel( * Each call to SDL_PushGPUDebugGroup must have a corresponding call to * SDL_PopGPUDebugGroup. * + * On Direct3D 12, using SDL_PushGPUDebugGroup requires WinPixEventRuntime.dll + * to be in your PATH or in the same directory as your executable. See + * [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) + * for instructions on how to obtain it. + * * On some backends (e.g. Metal), pushing a debug group during a * render/blit/compute pass will create a group that is scoped to the native * pass rather than the command buffer. For best results, if you push a debug @@ -2675,6 +2993,11 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUDebugGroup( /** * Ends the most-recently pushed debug group. * + * On Direct3D 12, using SDL_PopGPUDebugGroup requires WinPixEventRuntime.dll + * to be in your PATH or in the same directory as your executable. See + * [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) + * for instructions on how to obtain it. + * * \param command_buffer a command buffer. * * \since This function is available since SDL 3.2.0. @@ -2816,12 +3139,15 @@ extern SDL_DECLSPEC SDL_GPUCommandBuffer * SDLCALL SDL_AcquireGPUCommandBuffer( /** * Pushes data to a vertex uniform slot on the command buffer. * - * Subsequent draw calls will use this uniform data. + * Subsequent draw calls in this command buffer will use this uniform data. * * The data being pushed must respect std140 layout conventions. In practical * terms this means you must ensure that vec3 and vec4 fields are 16-byte * aligned. * + * For detailed information about accessing uniform data from a shader, please + * refer to SDL_CreateGPUShader. + * * \param command_buffer a command buffer. * \param slot_index the vertex uniform slot to push data to. * \param data client data to write. @@ -2838,7 +3164,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUVertexUniformData( /** * Pushes data to a fragment uniform slot on the command buffer. * - * Subsequent draw calls will use this uniform data. + * Subsequent draw calls in this command buffer will use this uniform data. * * The data being pushed must respect std140 layout conventions. In practical * terms this means you must ensure that vec3 and vec4 fields are 16-byte @@ -2860,7 +3186,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUFragmentUniformData( /** * Pushes data to a uniform slot on the command buffer. * - * Subsequent draw calls will use this uniform data. + * Subsequent draw calls in this command buffer will use this uniform data. * * The data being pushed must respect std140 layout conventions. In practical * terms this means you must ensure that vec3 and vec4 fields are 16-byte @@ -2892,6 +3218,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_PushGPUComputeUniformData( * is called. You cannot begin another render pass, or begin a compute pass or * copy pass until you have ended the render pass. * + * Using SDL_GPU_LOADOP_LOAD before any contents have been written to the + * texture subresource will result in undefined behavior. SDL_GPU_LOADOP_CLEAR + * will set the contents of the texture subresource to a single value before + * any rendering is performed. It's fine to do an empty render pass using + * SDL_GPU_STOREOP_STORE to clear a texture, but in general it's better to + * think of clearing not as an independent operation but as something that's + * done as the beginning of a render pass. + * * \param command_buffer a command buffer. * \param color_target_infos an array of texture subresources with * corresponding clear values and load/store ops. @@ -3338,7 +3672,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputePipeline( * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. * * Be sure your shader is set up according to the requirements documented in - * SDL_CreateGPUShader(). + * SDL_CreateGPUComputePipeline(). * * \param compute_pass a compute pass handle. * \param first_slot the compute sampler slot to begin binding from. @@ -3349,7 +3683,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputePipeline( * * \since This function is available since SDL 3.2.0. * - * \sa SDL_CreateGPUShader + * \sa SDL_CreateGPUComputePipeline */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeSamplers( SDL_GPUComputePass *compute_pass, @@ -3364,7 +3698,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeSamplers( * SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ. * * Be sure your shader is set up according to the requirements documented in - * SDL_CreateGPUShader(). + * SDL_CreateGPUComputePipeline(). * * \param compute_pass a compute pass handle. * \param first_slot the compute storage texture slot to begin binding from. @@ -3373,7 +3707,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeSamplers( * * \since This function is available since SDL 3.2.0. * - * \sa SDL_CreateGPUShader + * \sa SDL_CreateGPUComputePipeline */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageTextures( SDL_GPUComputePass *compute_pass, @@ -3388,7 +3722,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageTextures( * SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ. * * Be sure your shader is set up according to the requirements documented in - * SDL_CreateGPUShader(). + * SDL_CreateGPUComputePipeline(). * * \param compute_pass a compute pass handle. * \param first_slot the compute storage buffer slot to begin binding from. @@ -3397,7 +3731,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageTextures( * * \since This function is available since SDL 3.2.0. * - * \sa SDL_CreateGPUShader + * \sa SDL_CreateGPUComputePipeline */ extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageBuffers( SDL_GPUComputePass *compute_pass, @@ -3514,6 +3848,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnmapGPUTransferBuffer( * \returns a copy pass handle. * * \since This function is available since SDL 3.2.0. + * + * \sa SDL_EndGPUCopyPass */ extern SDL_DECLSPEC SDL_GPUCopyPass * SDLCALL SDL_BeginGPUCopyPass( SDL_GPUCommandBuffer *command_buffer); @@ -3567,6 +3903,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUBuffer( * This copy occurs on the GPU timeline. You may assume the copy has finished * in subsequent commands. * + * This function does not support copying between depth and color textures. + * For those, copy the texture to a buffer and then to the destination + * texture. + * * \param copy_pass a copy pass handle. * \param source a source texture region. * \param destination a destination texture region. @@ -3775,7 +4115,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ReleaseWindowFromGPUDevice( * supported via SDL_WindowSupportsGPUPresentMode / * SDL_WindowSupportsGPUSwapchainComposition prior to calling this function. * - * SDL_GPU_PRESENTMODE_VSYNC with SDL_GPU_SWAPCHAINCOMPOSITION_SDR are always + * SDL_GPU_PRESENTMODE_VSYNC with SDL_GPU_SWAPCHAINCOMPOSITION_SDR is always * supported. * * \param device a GPU context. @@ -3849,7 +4189,9 @@ extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUSwapchainTextureForma * buffer used to acquire it. * * This function will fill the swapchain texture handle with NULL if too many - * frames are in flight. This is not an error. + * frames are in flight. This is not an error. This NULL pointer should not be + * passed back into SDL. Instead, it should be considered as an indication to + * wait until the swapchain is available. * * If you use this function, it is possible to create a situation where many * command buffers are allocated while the rendering context waits for the GPU @@ -4171,6 +4513,29 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_CalculateGPUTextureFormatSize( Uint32 height, Uint32 depth_or_layer_count); +/** + * Get the SDL pixel format corresponding to a GPU texture format. + * + * \param format a texture format. + * \returns the corresponding pixel format, or SDL_PIXELFORMAT_UNKNOWN if + * there is no corresponding pixel format. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetPixelFormatFromGPUTextureFormat(SDL_GPUTextureFormat format); + +/** + * Get the GPU texture format corresponding to an SDL pixel format. + * + * \param format a pixel format. + * \returns the corresponding GPU texture format, or + * SDL_GPU_TEXTUREFORMAT_INVALID if there is no corresponding GPU + * texture format. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUTextureFormatFromPixelFormat(SDL_PixelFormat format); + #ifdef SDL_PLATFORM_GDK /** diff --git a/vendor/sdl3/include/SDL_haptic.h b/vendor/sdl3/include/SDL_haptic.h index a45335b28..9a20396d3 100644 --- a/vendor/sdl3/include/SDL_haptic.h +++ b/vendor/sdl3/include/SDL_haptic.h @@ -70,7 +70,7 @@ * { * SDL_Haptic *haptic; * SDL_HapticEffect effect; - * int effect_id; + * SDL_HapticEffectID effect_id; * * // Open the device * haptic = SDL_OpenHapticFromJoystick(joystick); @@ -149,6 +149,19 @@ extern "C" { */ typedef struct SDL_Haptic SDL_Haptic; +/* + * Misc defines. + */ + +/** + * Used to play a device an infinite number of times. + * + * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_RunHapticEffect + */ +#define SDL_HAPTIC_INFINITY 4294967295U + /** * \name Haptic features @@ -162,6 +175,11 @@ typedef struct SDL_Haptic SDL_Haptic; */ /* @{ */ +/** + * Type of haptic effect. + */ +typedef Uint16 SDL_HapticEffectType; + /** * Constant effect supported. * @@ -383,6 +401,11 @@ typedef struct SDL_Haptic SDL_Haptic; */ /* @{ */ +/** + * Type of coordinates used for haptic direction. + */ +typedef Uint8 SDL_HapticDirectionType; + /** * Uses polar coordinates for the direction. * @@ -426,18 +449,15 @@ typedef struct SDL_Haptic SDL_Haptic; /* @} *//* Haptic features */ -/* - * Misc defines. - */ /** - * Used to play a device an infinite number of times. + * ID for haptic effects. * - * \since This macro is available since SDL 3.2.0. + * This is -1 if the ID is invalid. * - * \sa SDL_RunHapticEffect + * \sa SDL_CreateHapticEffect */ -#define SDL_HAPTIC_INFINITY 4294967295U +typedef int SDL_HapticEffectID; /** @@ -545,8 +565,8 @@ typedef struct SDL_Haptic SDL_Haptic; */ typedef struct SDL_HapticDirection { - Uint8 type; /**< The type of encoding. */ - Sint32 dir[3]; /**< The encoded direction. */ + SDL_HapticDirectionType type; /**< The type of encoding. */ + Sint32 dir[3]; /**< The encoded direction. */ } SDL_HapticDirection; @@ -566,7 +586,7 @@ typedef struct SDL_HapticDirection typedef struct SDL_HapticConstant { /* Header */ - Uint16 type; /**< SDL_HAPTIC_CONSTANT */ + SDL_HapticEffectType type; /**< SDL_HAPTIC_CONSTANT */ SDL_HapticDirection direction; /**< Direction of the effect. */ /* Replay */ @@ -652,9 +672,9 @@ typedef struct SDL_HapticConstant typedef struct SDL_HapticPeriodic { /* Header */ - Uint16 type; /**< SDL_HAPTIC_SINE, SDL_HAPTIC_SQUARE - SDL_HAPTIC_TRIANGLE, SDL_HAPTIC_SAWTOOTHUP or - SDL_HAPTIC_SAWTOOTHDOWN */ + SDL_HapticEffectType type; /**< SDL_HAPTIC_SINE, SDL_HAPTIC_SQUARE + SDL_HAPTIC_TRIANGLE, SDL_HAPTIC_SAWTOOTHUP or + SDL_HAPTIC_SAWTOOTHDOWN */ SDL_HapticDirection direction; /**< Direction of the effect. */ /* Replay */ @@ -708,8 +728,8 @@ typedef struct SDL_HapticPeriodic typedef struct SDL_HapticCondition { /* Header */ - Uint16 type; /**< SDL_HAPTIC_SPRING, SDL_HAPTIC_DAMPER, - SDL_HAPTIC_INERTIA or SDL_HAPTIC_FRICTION */ + SDL_HapticEffectType type; /**< SDL_HAPTIC_SPRING, SDL_HAPTIC_DAMPER, + SDL_HAPTIC_INERTIA or SDL_HAPTIC_FRICTION */ SDL_HapticDirection direction; /**< Direction of the effect. */ /* Replay */ @@ -747,7 +767,7 @@ typedef struct SDL_HapticCondition typedef struct SDL_HapticRamp { /* Header */ - Uint16 type; /**< SDL_HAPTIC_RAMP */ + SDL_HapticEffectType type; /**< SDL_HAPTIC_RAMP */ SDL_HapticDirection direction; /**< Direction of the effect. */ /* Replay */ @@ -786,7 +806,7 @@ typedef struct SDL_HapticRamp typedef struct SDL_HapticLeftRight { /* Header */ - Uint16 type; /**< SDL_HAPTIC_LEFTRIGHT */ + SDL_HapticEffectType type; /**< SDL_HAPTIC_LEFTRIGHT */ /* Replay */ Uint32 length; /**< Duration of the effect in milliseconds. */ @@ -816,7 +836,7 @@ typedef struct SDL_HapticLeftRight typedef struct SDL_HapticCustom { /* Header */ - Uint16 type; /**< SDL_HAPTIC_CUSTOM */ + SDL_HapticEffectType type; /**< SDL_HAPTIC_CUSTOM */ SDL_HapticDirection direction; /**< Direction of the effect. */ /* Replay */ @@ -915,7 +935,7 @@ typedef struct SDL_HapticCustom typedef union SDL_HapticEffect { /* Common for all force feedback effects */ - Uint16 type; /**< Effect type. */ + SDL_HapticEffectType type; /**< Effect type. */ SDL_HapticConstant constant; /**< Constant effect. */ SDL_HapticPeriodic periodic; /**< Periodic effect. */ SDL_HapticCondition condition; /**< Condition effect. */ @@ -1193,7 +1213,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HapticEffectSupported(SDL_Haptic *haptic, c * \sa SDL_RunHapticEffect * \sa SDL_UpdateHapticEffect */ -extern SDL_DECLSPEC int SDLCALL SDL_CreateHapticEffect(SDL_Haptic *haptic, const SDL_HapticEffect *effect); +extern SDL_DECLSPEC SDL_HapticEffectID SDLCALL SDL_CreateHapticEffect(SDL_Haptic *haptic, const SDL_HapticEffect *effect); /** * Update the properties of an effect. @@ -1215,7 +1235,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_CreateHapticEffect(SDL_Haptic *haptic, const * \sa SDL_CreateHapticEffect * \sa SDL_RunHapticEffect */ -extern SDL_DECLSPEC bool SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, int effect, const SDL_HapticEffect *data); +extern SDL_DECLSPEC bool SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, SDL_HapticEffectID effect, const SDL_HapticEffect *data); /** * Run the haptic effect on its associated haptic device. @@ -1239,7 +1259,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_UpdateHapticEffect(SDL_Haptic *haptic, int * \sa SDL_StopHapticEffect * \sa SDL_StopHapticEffects */ -extern SDL_DECLSPEC bool SDLCALL SDL_RunHapticEffect(SDL_Haptic *haptic, int effect, Uint32 iterations); +extern SDL_DECLSPEC bool SDLCALL SDL_RunHapticEffect(SDL_Haptic *haptic, SDL_HapticEffectID effect, Uint32 iterations); /** * Stop the haptic effect on its associated haptic device. @@ -1254,7 +1274,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RunHapticEffect(SDL_Haptic *haptic, int eff * \sa SDL_RunHapticEffect * \sa SDL_StopHapticEffects */ -extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, int effect); +extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, SDL_HapticEffectID effect); /** * Destroy a haptic effect on the device. @@ -1269,7 +1289,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_StopHapticEffect(SDL_Haptic *haptic, int ef * * \sa SDL_CreateHapticEffect */ -extern SDL_DECLSPEC void SDLCALL SDL_DestroyHapticEffect(SDL_Haptic *haptic, int effect); +extern SDL_DECLSPEC void SDLCALL SDL_DestroyHapticEffect(SDL_Haptic *haptic, SDL_HapticEffectID effect); /** * Get the status of the current effect on the specified haptic device. @@ -1285,7 +1305,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroyHapticEffect(SDL_Haptic *haptic, int * * \sa SDL_GetHapticFeatures */ -extern SDL_DECLSPEC bool SDLCALL SDL_GetHapticEffectStatus(SDL_Haptic *haptic, int effect); +extern SDL_DECLSPEC bool SDLCALL SDL_GetHapticEffectStatus(SDL_Haptic *haptic, SDL_HapticEffectID effect); /** * Set the global gain of the specified haptic device. diff --git a/vendor/sdl3/include/SDL_hidapi.h b/vendor/sdl3/include/SDL_hidapi.h index 131b03723..67e29c2a1 100644 --- a/vendor/sdl3/include/SDL_hidapi.h +++ b/vendor/sdl3/include/SDL_hidapi.h @@ -55,6 +55,7 @@ #include #include +#include #include /* Set up for C function definitions, even when using C++ */ @@ -283,6 +284,24 @@ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_ */ extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path); +/** + * Get the properties associated with an SDL_hid_device. + * + * The following read-only properties are provided by SDL: + * + * - `SDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER`: the libusb_device_handle + * associated with the device, if it was opened using libusb. + * + * \param dev a device handle returned from SDL_hid_open(). + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_hid_get_properties(SDL_hid_device *dev); + +#define SDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER "SDL.hidapi.libusb.device.handle" + /** * Write an Output report to a HID device. * diff --git a/vendor/sdl3/include/SDL_hints.h b/vendor/sdl3/include/SDL_hints.h index a08153571..474e97f04 100644 --- a/vendor/sdl3/include/SDL_hints.h +++ b/vendor/sdl3/include/SDL_hints.h @@ -391,12 +391,46 @@ extern "C" { * concept, so it applies to a physical audio device in this case, and not an * SDL_AudioStream, nor an SDL logical audio device. * + * For Windows WASAPI audio, the following roles are supported, and map to + * `AUDIO_STREAM_CATEGORY`: + * + * - "Other" (default) + * - "Communications" - Real-time communications, such as VOIP or chat + * - "Game" - Game audio + * - "GameChat" - Game chat audio, similar to "Communications" except that + * this will not attenuate other audio streams + * - "Movie" - Music or sound with dialog + * - "Media" - Music or sound without dialog + * + * If your application applies its own echo cancellation, gain control, and + * noise reduction it should also set SDL_HINT_AUDIO_DEVICE_RAW_STREAM. + * * This hint should be set before an audio device is opened. * * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_AUDIO_DEVICE_STREAM_ROLE "SDL_AUDIO_DEVICE_STREAM_ROLE" +/** + * Specify whether this audio device should do audio processing. + * + * Some operating systems perform echo cancellation, gain control, and noise + * reduction as needed. If your application already handles these, you can set + * this hint to prevent the OS from doing additional audio processing. + * + * This corresponds to the WASAPI audio option `AUDCLNT_STREAMOPTIONS_RAW`. + * + * The variable can be set to the following values: + * + * - "0": audio processing can be done by the OS. (default) + * - "1": audio processing is done by the application. + * + * This hint should be set before an audio device is opened. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_AUDIO_DEVICE_RAW_STREAM "SDL_AUDIO_DEVICE_RAW_STREAM" + /** * Specify the input file when recording audio using the disk audio driver. * @@ -595,7 +629,7 @@ extern "C" { * A variable that limits what CPU features are available. * * By default, SDL marks all features the current CPU supports as available. - * This hint allows to limit these to a subset. + * This hint allows the enabled features to be limited to a subset. * * When the hint is unset, or empty, SDL will enable all detected CPU * features. @@ -685,6 +719,21 @@ extern "C" { */ #define SDL_HINT_DISPLAY_USABLE_BOUNDS "SDL_DISPLAY_USABLE_BOUNDS" +/** + * Set the level of checking for invalid parameters passed to SDL functions. + * + * The variable can be set to the following values: + * + * - "1": Enable fast parameter error checking, e.g. quick NULL checks, etc. + * - "2": Enable full parameter error checking, e.g. validating objects are + * the correct type, etc. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_INVALID_PARAM_CHECKS "SDL_INVALID_PARAM_CHECKS" + /** * Disable giving back control to the browser automatically when running with * asyncify. @@ -711,8 +760,6 @@ extern "C" { * * This hint only applies to the emscripten platform. * - * The default value is "#canvas" - * * This hint should be set before creating a window. * * \since This hint is available since SDL 3.2.0. @@ -726,7 +773,7 @@ extern "C" { * * The variable can be one of: * - * - "#window": the javascript window object (default) + * - "#window": the javascript window object * - "#document": the javascript document object * - "#screen": the javascript window.screen object * - "#canvas": the WebGL canvas element @@ -1037,6 +1084,21 @@ extern "C" { */ #define SDL_HINT_HIDAPI_LIBUSB "SDL_HIDAPI_LIBUSB" + +/** + * A variable to control whether HIDAPI uses libusb for GameCube adapters. + * + * The variable can be set to the following values: + * + * - "0": HIDAPI will not use libusb for GameCube adapters. + * - "1": HIDAPI will use libusb for GameCube adapters if available. (default) + * + * This hint should be set before SDL is initialized. + * + * \since This hint is available since SDL 3.2.0. + */ +#define SDL_HINT_HIDAPI_LIBUSB_GAMECUBE "SDL_HIDAPI_LIBUSB_GAMECUBE" + /** * A variable to control whether HIDAPI uses libusb only for whitelisted * devices. @@ -1143,8 +1205,8 @@ extern "C" { #define SDL_HINT_IME_IMPLEMENTED_UI "SDL_IME_IMPLEMENTED_UI" /** - * A variable controlling whether the home indicator bar on iPhone X should be - * hidden. + * A variable controlling whether the home indicator bar on iPhone X and later + * should be hidden. * * The variable can be set to the following values: * @@ -1723,6 +1785,69 @@ extern "C" { */ #define SDL_HINT_JOYSTICK_HIDAPI_STEAM_HORI "SDL_JOYSTICK_HIDAPI_STEAM_HORI" +/** + * A variable controlling whether the HIDAPI driver for some Logitech wheels + * should be used. + * + * This variable can be set to the following values: + * + * - "0": HIDAPI driver is not used + * - "1": HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_LG4FF "SDL_JOYSTICK_HIDAPI_LG4FF" + +/** + * A variable controlling whether the HIDAPI driver for 8BitDo controllers + * should be used. + * + * This variable can be set to the following values: + * + * "0" - HIDAPI driver is not used. "1" - HIDAPI driver is used. + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_8BITDO "SDL_JOYSTICK_HIDAPI_8BITDO" + +/** + * A variable controlling whether the HIDAPI driver for SInput controllers + * should be used. + * + * More info - https://github.com/HandHeldLegend/SInput-HID + * + * This variable can be set to the following values: + * + * "0" - HIDAPI driver is not used. "1" - HIDAPI driver is used. + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_SINPUT "SDL_JOYSTICK_HIDAPI_SINPUT" + +/** + * A variable controlling whether the HIDAPI driver for ZUIKI controllers + * should be used. + * + * This variable can be set to the following values: + * + * "0" - HIDAPI driver is not used. "1" - HIDAPI driver is used. + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_ZUIKI "SDL_JOYSTICK_HIDAPI_ZUIKI" + +/** + * A variable controlling whether the HIDAPI driver for Flydigi controllers + * should be used. + * + * This variable can be set to the following values: + * + * "0" - HIDAPI driver is not used. "1" - HIDAPI driver is used. + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_FLYDIGI "SDL_JOYSTICK_HIDAPI_FLYDIGI" + /** * A variable controlling whether the HIDAPI driver for Nintendo Switch * controllers should be used. @@ -1774,6 +1899,23 @@ extern "C" { */ #define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED "SDL_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED" +/** + * A variable controlling whether the HIDAPI driver for Nintendo Switch 2 + * controllers should be used. + * + * The variable can be set to the following values: + * + * - "0": HIDAPI driver is not used. + * - "1": HIDAPI driver is used. + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. + * + * This hint should be set before initializing joysticks and gamepads. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH2 "SDL_JOYSTICK_HIDAPI_SWITCH2" + /** * A variable controlling whether Nintendo Switch Joy-Con controllers will be * in vertical mode when using the HIDAPI driver. @@ -1926,6 +2068,41 @@ extern "C" { */ #define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED "SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED" +/** + * A variable controlling whether the new HIDAPI driver for wired Xbox One + * (GIP) controllers should be used. + * + * The variable can be set to the following values: + * + * - "0": HIDAPI driver is not used. + * - "1": HIDAPI driver is used. + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE. + * + * This hint should be set before initializing joysticks and gamepads. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_GIP "SDL_JOYSTICK_HIDAPI_GIP" + +/** + * A variable controlling whether the new HIDAPI driver for wired Xbox One + * (GIP) controllers should reset the controller if it can't get the metadata + * from the controller. + * + * The variable can be set to the following values: + * + * - "0": Assume this is a generic controller. + * - "1": Reset the controller to get metadata. + * + * By default the controller is not reset. + * + * This hint should be set before initializing joysticks and gamepads. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_GIP_RESET_FOR_METADATA "SDL_JOYSTICK_HIDAPI_GIP_RESET_FOR_METADATA" + /** * A variable controlling whether IOKit should be used for controller * handling. @@ -2126,8 +2303,8 @@ extern "C" { * * The variable can be set to the following values: * - * - "0": WGI is not used. - * - "1": WGI is used. (default) + * - "0": WGI is not used. (default) + * - "1": WGI is used. * * This hint should be set before SDL is initialized. * @@ -2228,9 +2405,9 @@ extern "C" { * pressing the 1 key would yield the keycode SDLK_1, or '1', instead of * SDLK_AMPERSAND, or '&' * - "latin_letters": For keyboards using non-Latin letters, such as Russian - * or Thai, the letter keys generate keycodes as though it had an en_US - * layout. e.g. pressing the key associated with SDL_SCANCODE_A on a Russian - * keyboard would yield 'a' instead of a Cyrillic letter. + * or Thai, the letter keys generate keycodes as though it had an English + * QWERTY layout. e.g. pressing the key associated with SDL_SCANCODE_A on a + * Russian keyboard would yield 'a' instead of a Cyrillic letter. * * The default value for this hint is "french_numbers,latin_letters" * @@ -2289,6 +2466,27 @@ extern "C" { */ #define SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER "SDL_KMSDRM_REQUIRE_DRM_MASTER" +/** + * A variable that controls whether KMSDRM will use "atomic" functionality. + * + * The KMSDRM backend can use atomic commits, if both DRM_CLIENT_CAP_ATOMIC + * and DRM_CLIENT_CAP_UNIVERSAL_PLANES is supported by the system. As of SDL + * 3.4.0, it will favor this functionality, but in case this doesn't work well + * on a given system or other surprises, this hint can be used to disable it. + * + * This hint can not enable the functionality if it isn't available. + * + * The variable can be set to the following values: + * + * - "0": SDL will not use the KMSDRM "atomic" functionality. + * - "1": SDL will allow usage of the KMSDRM "atomic" functionality. (default) + * + * This hint should be set before SDL is initialized. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_KMSDRM_ATOMIC "SDL_KMSDRM_ATOMIC" + /** * A variable controlling the default SDL log levels. * @@ -2309,6 +2507,11 @@ extern "C" { * * `app=info,assert=warn,test=verbose,*=error` * + * If the `DEBUG_INVOCATION` environment variable is set to "1", the default + * log levels are equivalent to: + * + * `assert=warn,test=verbose,*=debug` + * * This hint can be set anytime. * * \since This hint is available since SDL 3.2.0. @@ -2410,6 +2613,21 @@ extern "C" { */ #define SDL_HINT_MAC_SCROLL_MOMENTUM "SDL_MAC_SCROLL_MOMENTUM" +/** + * A variable controlling whether holding down a key will repeat the pressed + * key or open the accents menu on macOS. + * + * The variable can be set to the following values: + * + * - "0": Holding a key will open the accents menu for that key. + * - "1": Holding a key will repeat the pressed key. (default) + * + * This hint needs to be set before SDL_Init(). + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_MAC_PRESS_AND_HOLD "SDL_MAC_PRESS_AND_HOLD" + /** * Request SDL_AppIterate() be called at a specific rate. * @@ -2430,6 +2648,10 @@ extern "C" { * This defaults to 0, and specifying NULL for the hint's value will restore * the default. * + * This doesn't have to be an integer value. For example, "59.94" won't be + * rounded to an integer rate; the digits after the decimal are actually + * respected. + * * This hint can be set anytime. * * \since This hint is available since SDL 3.2.0. @@ -2485,6 +2707,24 @@ extern "C" { */ #define SDL_HINT_MOUSE_DEFAULT_SYSTEM_CURSOR "SDL_MOUSE_DEFAULT_SYSTEM_CURSOR" +/** + * A variable setting whether we should scale cursors by the current display + * scale. + * + * The variable can be set to the following values: + * + * - "0": Cursors will not change size based on the display content scale. + * (default) + * - "1": Cursors will automatically match the display content scale (e.g. a + * 2x sized cursor will be used when the window is on a monitor with 200% + * scale). This is currently implemented on Windows and Wayland. + * + * This hint needs to be set before creating cursors. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_MOUSE_DPI_SCALE_CURSORS "SDL_MOUSE_DPI_SCALE_CURSORS" + /** * A variable controlling whether warping a hidden mouse cursor will activate * relative mouse mode. @@ -2493,7 +2733,7 @@ extern "C" { * the window center occur within a short time period, SDL will emulate mouse * warps using relative mouse mode. This can provide smoother and more * reliable mouse motion for some older games, which continuously calculate - * the distance travelled by the mouse pointer and warp it back to the center + * the distance traveled by the mouse pointer and warp it back to the center * of the window, rather than using relative mouse motion. * * Note that relative mouse mode may have different mouse acceleration @@ -2859,6 +3099,24 @@ extern "C" { */ #define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_RENDER_DIRECT3D11_DEBUG" +/** + * A variable controlling whether to use the Direct3D 11 WARP software + * rasterizer. + * + * For more information, see: + * https://learn.microsoft.com/en-us/windows/win32/direct3darticles/directx-warp + * + * The variable can be set to the following values: + * + * - "0": Disable WARP rasterizer. (default) + * - "1": Enable WARP rasterizer. + * + * This hint should be set before creating a renderer. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_RENDER_DIRECT3D11_WARP "SDL_RENDER_DIRECT3D11_WARP" + /** * A variable controlling whether to enable Vulkan Validation Layers. * @@ -3041,6 +3299,37 @@ extern "C" { */ #define SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED "SDL_ROG_GAMEPAD_MICE_EXCLUDED" +/** + * Variable controlling the width of the PS2's framebuffer in pixels + * + * By default, this variable is "640" + */ +#define SDL_HINT_PS2_GS_WIDTH "SDL_PS2_GS_WIDTH" + +/** + * Variable controlling the height of the PS2's framebuffer in pixels + * + * By default, this variable is "448" + */ +#define SDL_HINT_PS2_GS_HEIGHT "SDL_PS2_GS_HEIGHT" + +/** + * Variable controlling whether the signal is interlaced or progressive + * + * - "0": Image is interlaced. (default) + * - "1": Image is progressive + */ +#define SDL_HINT_PS2_GS_PROGRESSIVE "SDL_PS2_GS_PROGRESSIVE" + +/** + * Variable controlling the video mode of the console + * + * - "": Console-native. (default) + * - "NTSC": 60hz region + * - "PAL": 50hz region + */ +#define SDL_HINT_PS2_GS_MODE "SDL_PS2_GS_MODE" + /** * A variable controlling which Dispmanx layer to use on a Raspberry PI. * @@ -3267,10 +3556,12 @@ extern "C" { * prioritized in the list of displays, as exposed by calling * SDL_GetDisplays(), with the first listed becoming the primary display. The * naming convention can vary depending on the environment, but it is usually - * a connector name (e.g. 'DP-1', 'DP-2', 'HDMI-A-1',etc...). + * a connector name (e.g. 'DP-1', 'DP-2', 'HDMI-A-1', etc...). * - * On Wayland and X11 desktops, the connector names associated with displays - * can typically be found by using the `xrandr` utility. + * On Wayland desktops, the connector names associated with displays can be + * found in the `name` property of the info output from `wayland-info -i + * wl_output`. On X11 desktops, the `xrandr` utility can be used to retrieve + * the connector names associated with displays. * * This hint is currently supported on the following drivers: * @@ -3407,6 +3698,43 @@ extern "C" { */ #define SDL_HINT_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY "SDL_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY" +/** + * A variable indicating whether the metal layer drawable size should be + * updated for the SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event on macOS. + * + * The variable can be set to the following values: + * + * - "0": the metal layer drawable size will not be updated on the + * SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event. + * - "1": the metal layer drawable size will be updated on the + * SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event. (default) + * + * This hint should be set before SDL_Metal_CreateView called. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_VIDEO_METAL_AUTO_RESIZE_DRAWABLE "SDL_VIDEO_METAL_AUTO_RESIZE_DRAWABLE" + +/** + * A variable controlling whether SDL will attempt to automatically set the + * destination display to a mode most closely matching that of the previous + * display if an exclusive fullscreen window is moved onto it. + * + * The variable can be set to the following values: + * + * - "0": SDL will not attempt to automatically set a matching mode on the + * destination display. If an exclusive fullscreen window is moved to a new + * display, the window will become fullscreen desktop. + * - "1": SDL will attempt to automatically set a mode on the destination + * display that most closely matches the mode of the display that the + * exclusive fullscreen window was previously on. (default) + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_VIDEO_MATCH_EXCLUSIVE_MODE_ON_MOVE "SDL_VIDEO_MATCH_EXCLUSIVE_MODE_ON_MOVE" + /** * A variable controlling whether fullscreen windows are minimized when they * lose focus. @@ -3414,8 +3742,10 @@ extern "C" { * The variable can be set to the following values: * * - "0": Fullscreen windows will not be minimized when they lose focus. - * (default) * - "1": Fullscreen windows are minimized when they lose focus. + * - "auto": Fullscreen windows are minimized when they lose focus if they use + * exclusive fullscreen modes, so the desktop video mode is restored. + * (default) * * This hint can be set anytime. * @@ -4061,15 +4391,14 @@ extern "C" { * * The variable can be set to the following values: * - * - "0": GameInput is not used for raw keyboard and mouse events. + * - "0": GameInput is not used for raw keyboard and mouse events. (default) * - "1": GameInput is used for raw keyboard and mouse events, if available. - * (default) * * This hint should be set before SDL is initialized. * * \since This hint is available since SDL 3.2.0. */ -#define SDL_HINT_WINDOWS_GAMEINPUT "SDL_WINDOWS_GAMEINPUT" +#define SDL_HINT_WINDOWS_GAMEINPUT "SDL_WINDOWS_GAMEINPUT" /** * A variable controlling whether raw keyboard events are used on Windows. @@ -4085,6 +4414,28 @@ extern "C" { */ #define SDL_HINT_WINDOWS_RAW_KEYBOARD "SDL_WINDOWS_RAW_KEYBOARD" +/** + * A variable controlling whether or not the RIDEV_NOHOTKEYS flag is set when + * enabling Windows raw keyboard events. + * + * This blocks any hotkeys that have been registered by applications from + * having any effect beyond generating raw WM_INPUT events. + * + * This flag does not affect system-hotkeys like ALT-TAB or CTRL-ALT-DEL, but + * does affect the Windows Logo key since it is a userland hotkey registered + * by explorer.exe. + * + * The variable can be set to the following values: + * + * - "0": Hotkeys are not excluded. (default) + * - "1": Hotkeys are excluded. + * + * This hint can be set anytime. + * + * \since This hint is available since SDL 3.4.0. + */ +#define SDL_HINT_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS "SDL_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS" + /** * A variable controlling whether SDL uses Kernel Semaphores on Windows. * @@ -4114,7 +4465,7 @@ extern "C" { * * \since This hint is available since SDL 3.2.0. */ -#define SDL_HINT_WINDOWS_INTRESOURCE_ICON "SDL_WINDOWS_INTRESOURCE_ICON" +#define SDL_HINT_WINDOWS_INTRESOURCE_ICON "SDL_WINDOWS_INTRESOURCE_ICON" /** * A variable to specify custom icon resource id from RC file on Windows @@ -4287,7 +4638,6 @@ extern "C" { */ #define SDL_HINT_PEN_TOUCH_EVENTS "SDL_PEN_TOUCH_EVENTS" - /** * An enumeration of hint priorities. * @@ -4386,19 +4736,14 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetHints(void); * \param name the hint to query. * \returns the string value of a hint or NULL if the hint isn't set. * - * \threadsafety It is safe to call this function from any thread, however the - * return value only remains valid until the hint is changed; if - * another thread might do so, the app should supply locks - * and/or make a copy of the string. Note that using a hint - * callback instead is always thread-safe, as SDL holds a lock - * on the thread subsystem during the callback. + * \threadsafety It is safe to call this function from any thread. * * \since This function is available since SDL 3.2.0. * * \sa SDL_SetHint * \sa SDL_SetHintWithPriority */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetHint(const char *name); +extern SDL_DECLSPEC const char *SDLCALL SDL_GetHint(const char *name); /** * Get the boolean value of a hint variable. @@ -4474,8 +4819,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_AddHintCallback(const char *name, SDL_HintC * \sa SDL_AddHintCallback */ extern SDL_DECLSPEC void SDLCALL SDL_RemoveHintCallback(const char *name, - SDL_HintCallback callback, - void *userdata); + SDL_HintCallback callback, + void *userdata); /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/vendor/sdl3/include/SDL_init.h b/vendor/sdl3/include/SDL_init.h index 27ebe4b0e..557f2b995 100644 --- a/vendor/sdl3/include/SDL_init.h +++ b/vendor/sdl3/include/SDL_init.h @@ -101,7 +101,7 @@ typedef Uint32 SDL_InitFlags; * to run. * * See - * [Main callbacks in SDL3](https://wiki.libsdl.org/SDL3/README/main-functions#main-callbacks-in-sdl3) + * [Main callbacks in SDL3](https://wiki.libsdl.org/SDL3/README-main-functions#main-callbacks-in-sdl3) * for complete details. * * \since This enum is available since SDL 3.2.0. diff --git a/vendor/sdl3/include/SDL_intrin.h b/vendor/sdl3/include/SDL_intrin.h index bac6d7ad4..802c1953b 100644 --- a/vendor/sdl3/include/SDL_intrin.h +++ b/vendor/sdl3/include/SDL_intrin.h @@ -268,6 +268,7 @@ _m_prefetch(void *__P) #endif /* compiler version */ #ifdef SDL_WIKI_DOCUMENTATION_SECTION + /** * A macro to decide if the compiler supports `__attribute__((target))`. * @@ -280,12 +281,14 @@ _m_prefetch(void *__P) * \sa SDL_TARGETING */ #define SDL_HAS_TARGET_ATTRIBS - +#elif defined(__loongarch64) && defined(__GNUC__) && (__GNUC__ >= 15) +/* LoongArch requires GCC 15+ for target attribute support */ +# define SDL_HAS_TARGET_ATTRIBS #elif defined(__clang__) && defined(__has_attribute) # if __has_attribute(target) # define SDL_HAS_TARGET_ATTRIBS # endif -#elif defined(__GNUC__) && (__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) /* gcc >= 4.9 */ +#elif defined(__GNUC__) && !defined(__loongarch64) && (__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) /* gcc >= 4.9 */ # define SDL_HAS_TARGET_ATTRIBS #elif defined(__ICC) && __ICC >= 1600 # define SDL_HAS_TARGET_ATTRIBS diff --git a/vendor/sdl3/include/SDL_iostream.h b/vendor/sdl3/include/SDL_iostream.h index 4ca16093e..dfe6f6a9c 100644 --- a/vendor/sdl3/include/SDL_iostream.h +++ b/vendor/sdl3/include/SDL_iostream.h @@ -111,7 +111,7 @@ typedef struct SDL_IOStreamInterface /** * Read up to `size` bytes from the data stream to the area pointed - * at by `ptr`. + * at by `ptr`. `size` will always be > 0. * * On an incomplete read, you should set `*status` to a value from the * SDL_IOStatus enum. You do not have to explicitly set this on @@ -123,7 +123,7 @@ typedef struct SDL_IOStreamInterface /** * Write exactly `size` bytes from the area pointed at by `ptr` - * to data stream. + * to data stream. `size` will always be > 0. * * On an incomplete write, you should set `*status` to a value from the * SDL_IOStatus enum. You do not have to explicitly set this on @@ -203,6 +203,8 @@ typedef struct SDL_IOStream SDL_IOStream; * - "w": Create an empty file for writing. If a file with the same name * already exists its content is erased and the file is treated as a new * empty file. + * - "wx": Create an empty file for writing. If a file with the same name + * already exists, the call fails. * - "a": Append to a file. Writing operations append data at the end of the * file. The file is created if it does not exist. * - "r+": Open a file for update both reading and writing. The file must @@ -210,6 +212,8 @@ typedef struct SDL_IOStream SDL_IOStream; * - "w+": Create an empty file for both reading and writing. If a file with * the same name already exists its content is erased and the file is * treated as a new empty file. + * - "w+x": Create an empty file for both reading and writing. If a file with + * the same name already exists, the call fails. * - "a+": Open a file for reading and appending. All writing operations are * performed at the end of the file, protecting the previous content to be * overwritten. You can reposition (fseek, rewind) the internal pointer to @@ -260,7 +264,7 @@ typedef struct SDL_IOStream SDL_IOStream; * \returns a pointer to the SDL_IOStream structure that is created or NULL on * failure; call SDL_GetError() for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety It is safe to call this function from any thread. * * \since This function is available since SDL 3.2.0. * @@ -286,8 +290,7 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromFile(const char *file, cons * certain size, for both read and write access. * * This memory buffer is not copied by the SDL_IOStream; the pointer you - * provide must remain valid until you close the stream. Closing the stream - * will not free the original buffer. + * provide must remain valid until you close the stream. * * If you need to make sure the SDL_IOStream never writes to the memory * buffer, you should use SDL_IOFromConstMem() with a read-only buffer of @@ -300,6 +303,13 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromFile(const char *file, cons * - `SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER`: this will be the `size` parameter * that was passed to this function. * + * Additionally, the following properties are recognized: + * + * - `SDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER`: if this property is set to + * a non-NULL value it will be interpreted as a function of SDL_free_func + * type and called with the passed `mem` pointer when closing the stream. By + * default it is unset, i.e., the memory will not be freed. + * * \param mem a pointer to a buffer to feed an SDL_IOStream stream. * \param size the buffer size, in bytes. * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call @@ -321,6 +331,7 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromMem(void *mem, size_t size) #define SDL_PROP_IOSTREAM_MEMORY_POINTER "SDL.iostream.memory.base" #define SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER "SDL.iostream.memory.size" +#define SDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER "SDL.iostream.memory.free" /** * Use this function to prepare a read-only memory buffer for use with @@ -333,8 +344,7 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromMem(void *mem, size_t size) * without writing to the memory buffer. * * This memory buffer is not copied by the SDL_IOStream; the pointer you - * provide must remain valid until you close the stream. Closing the stream - * will not free the original buffer. + * provide must remain valid until you close the stream. * * If you need to write to a memory buffer, you should use SDL_IOFromMem() * with a writable buffer of memory instead. @@ -346,6 +356,13 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_IOFromMem(void *mem, size_t size) * - `SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER`: this will be the `size` parameter * that was passed to this function. * + * Additionally, the following properties are recognized: + * + * - `SDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER`: if this property is set to + * a non-NULL value it will be interpreted as a function of SDL_free_func + * type and called with the passed `mem` pointer when closing the stream. By + * default it is unset, i.e., the memory will not be freed. + * * \param mem a pointer to a read-only buffer to feed an SDL_IOStream stream. * \param size the buffer size, in bytes. * \returns a pointer to a new SDL_IOStream structure or NULL on failure; call @@ -452,7 +469,7 @@ extern SDL_DECLSPEC SDL_IOStream * SDLCALL SDL_OpenIO(const SDL_IOStreamInterfac * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. * @@ -467,7 +484,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CloseIO(SDL_IOStream *context); * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -487,7 +504,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetIOProperties(SDL_IOStream *c * \param context the SDL_IOStream to query. * \returns an SDL_IOStatus enum with the current state. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -501,7 +518,7 @@ extern SDL_DECLSPEC SDL_IOStatus SDLCALL SDL_GetIOStatus(SDL_IOStream *context); * negative error code on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -528,7 +545,7 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetIOSize(SDL_IOStream *context); * \returns the final offset in the data stream after the seek or -1 on * failure; call SDL_GetError() for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. * @@ -548,7 +565,7 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_SeekIO(SDL_IOStream *context, Sint64 offs * \returns the current offset in the stream, or -1 if the information can not * be determined. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. * @@ -567,13 +584,17 @@ extern SDL_DECLSPEC Sint64 SDLCALL SDL_TellIO(SDL_IOStream *context); * the stream is not at EOF, SDL_GetIOStatus() will return a different error * value and SDL_GetError() will offer a human-readable message. * + * A request for zero bytes on a valid stream will return zero immediately + * without accessing the stream, so the stream status (EOF, err, etc) will not + * change. + * * \param context a pointer to an SDL_IOStream structure. * \param ptr a pointer to a buffer to read data into. * \param size the number of bytes to read from the data source. * \returns the number of bytes read, or 0 on end of file or other failure; * call SDL_GetError() for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. * @@ -596,13 +617,17 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_ReadIO(SDL_IOStream *context, void *ptr, * recoverable, such as a non-blocking write that can simply be retried later, * or a fatal error. * + * A request for zero bytes on a valid stream will return zero immediately + * without accessing the stream, so the stream status (EOF, err, etc) will not + * change. + * * \param context a pointer to an SDL_IOStream structure. * \param ptr a pointer to a buffer containing data to write. * \param size the number of bytes to write. * \returns the number of bytes written, which will be less than `size` on * failure; call SDL_GetError() for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. * @@ -626,7 +651,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_WriteIO(SDL_IOStream *context, const void * \returns the number of bytes written or 0 on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. * @@ -646,7 +671,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_IOprintf(SDL_IOStream *context, SDL_PRINT * \returns the number of bytes written or 0 on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. * @@ -666,7 +691,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_IOvprintf(SDL_IOStream *context, SDL_PRIN * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. * @@ -692,7 +717,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FlushIO(SDL_IOStream *context); * \returns the data or NULL on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. * @@ -715,7 +740,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile_IO(SDL_IOStream *src, size_t *da * \returns the data or NULL on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety It is safe to call this function from any thread. * * \since This function is available since SDL 3.2.0. * @@ -736,7 +761,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_LoadFile(const char *file, size_t *datasi * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. * @@ -755,7 +780,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SaveFile_IO(SDL_IOStream *src, const void * * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety It is safe to call this function from any thread. * * \since This function is available since SDL 3.2.0. * @@ -784,7 +809,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SaveFile(const char *file, const void *data * \returns true on success or false on failure or EOF; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -803,7 +828,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU8(SDL_IOStream *src, Uint8 *value); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -823,10 +848,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS8(SDL_IOStream *src, Sint8 *value); * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -846,10 +871,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU16LE(SDL_IOStream *src, Uint16 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -869,10 +894,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS16LE(SDL_IOStream *src, Sint16 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -892,10 +917,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU16BE(SDL_IOStream *src, Uint16 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -915,10 +940,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS16BE(SDL_IOStream *src, Sint16 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -938,10 +963,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU32LE(SDL_IOStream *src, Uint32 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -961,10 +986,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS32LE(SDL_IOStream *src, Sint32 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -984,10 +1009,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU32BE(SDL_IOStream *src, Uint32 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1007,10 +1032,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS32BE(SDL_IOStream *src, Sint32 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1030,10 +1055,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU64LE(SDL_IOStream *src, Uint64 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1053,10 +1078,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS64LE(SDL_IOStream *src, Sint64 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1076,10 +1101,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadU64BE(SDL_IOStream *src, Uint64 *value) * * \param src the stream from which to read data. * \param value a pointer filled in with the data read. - * \returns true on successful write or false on failure; call SDL_GetError() + * \returns true on successful read or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1101,7 +1126,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadS64BE(SDL_IOStream *src, Sint64 *value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1115,7 +1140,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU8(SDL_IOStream *dst, Uint8 value); * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1134,7 +1159,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS8(SDL_IOStream *dst, Sint8 value); * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1153,7 +1178,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU16LE(SDL_IOStream *dst, Uint16 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1171,7 +1196,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS16LE(SDL_IOStream *dst, Sint16 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1189,7 +1214,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU16BE(SDL_IOStream *dst, Uint16 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1208,7 +1233,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS16BE(SDL_IOStream *dst, Sint16 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1227,7 +1252,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU32LE(SDL_IOStream *dst, Uint32 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1245,7 +1270,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS32LE(SDL_IOStream *dst, Sint32 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1263,7 +1288,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU32BE(SDL_IOStream *dst, Uint32 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1282,7 +1307,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS32BE(SDL_IOStream *dst, Sint32 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1301,7 +1326,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU64LE(SDL_IOStream *dst, Uint64 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1319,7 +1344,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteS64LE(SDL_IOStream *dst, Sint64 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ @@ -1337,7 +1362,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteU64BE(SDL_IOStream *dst, Uint64 value) * \returns true on successful write or false on failure; call SDL_GetError() * for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety Do not use the same SDL_IOStream from two threads at once. * * \since This function is available since SDL 3.2.0. */ diff --git a/vendor/sdl3/include/SDL_joystick.h b/vendor/sdl3/include/SDL_joystick.h index d15668b66..af04f0979 100644 --- a/vendor/sdl3/include/SDL_joystick.h +++ b/vendor/sdl3/include/SDL_joystick.h @@ -29,8 +29,8 @@ * instead. * * The term "instance_id" is the current instantiation of a joystick device in - * the system, if the joystick is removed and then re-inserted then it will - * get a new instance_id, instance_id's are monotonically increasing + * the system. If the joystick is removed and then re-inserted then it will + * get a new instance_id. instance_id's are monotonically increasing * identifiers of a joystick plugged in. * * The term "player_index" is the number assigned to a player on a specific @@ -48,6 +48,14 @@ * If you would like to receive joystick updates while the application is in * the background, you should set the following hint before calling * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + * + * SDL can provide virtual joysticks as well: the app defines an imaginary + * controller with SDL_AttachVirtualJoystick(), and then can provide inputs + * for it via SDL_SetJoystickVirtualAxis(), SDL_SetJoystickVirtualButton(), + * etc. As this data is supplied, it will look like a normal joystick to SDL, + * just not backed by a hardware driver. This has been used to make unusual + * devices, like VR headset controllers, look like normal joysticks, or + * provide recording/playback of game inputs, etc. */ #ifndef SDL_joystick_h_ @@ -107,6 +115,10 @@ typedef Uint32 SDL_JoystickID; * This is by no means a complete list of everything that can be plugged into * a computer. * + * You may refer to + * [XInput Controller Types](https://learn.microsoft.com/en-us/windows/win32/xinput/xinput-and-controller-subtypes) + * table for a general understanding of each joystick type. + * * \since This enum is available since SDL 3.2.0. */ typedef enum SDL_JoystickType @@ -170,6 +182,8 @@ typedef enum SDL_JoystickConnectionState * joysticks while processing to guarantee that the joystick list won't change * and joystick and gamepad events will not be delivered. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_LockJoysticks(void) SDL_ACQUIRE(SDL_joystick_lock); @@ -177,6 +191,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockJoysticks(void) SDL_ACQUIRE(SDL_joystic /** * Unlocking for atomic access to the joystick API. * + * \threadsafety This should be called from the same thread that called + * SDL_LockJoysticks(). + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnlockJoysticks(void) SDL_RELEASE(SDL_joystick_lock); @@ -186,6 +203,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockJoysticks(void) SDL_RELEASE(SDL_joyst * * \returns true if a joystick is connected, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoysticks @@ -201,6 +220,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasJoystick(void); * call SDL_GetError() for more information. This should be freed * with SDL_free() when it is no longer needed. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_HasJoystick @@ -217,6 +238,8 @@ extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetJoysticks(int *count); * \returns the name of the selected joystick. If no name can be found, this * function returns NULL; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickName @@ -233,6 +256,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickNameForID(SDL_JoystickID * \returns the path of the selected joystick. If no path can be found, this * function returns NULL; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPath @@ -248,6 +273,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPathForID(SDL_JoystickID * \param instance_id the joystick instance ID. * \returns the player index of a joystick, or -1 if it's not available. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex @@ -264,6 +291,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickPlayerIndexForID(SDL_JoystickID i * \returns the GUID of the selected joystick. If called with an invalid * instance_id, this function returns a zero GUID. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUID @@ -281,6 +310,8 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetJoystickGUIDForID(SDL_JoystickID ins * \returns the USB vendor ID of the selected joystick. If called with an * invalid instance_id, this function returns 0. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickVendor @@ -298,6 +329,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickVendorForID(SDL_JoystickID ins * \returns the USB product ID of the selected joystick. If called with an * invalid instance_id, this function returns 0. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProduct @@ -315,6 +348,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductForID(SDL_JoystickID in * \returns the product version of the selected joystick. If called with an * invalid instance_id, this function returns 0. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductVersion @@ -332,6 +367,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductVersionForID(SDL_Joysti * invalid instance_id, this function returns * `SDL_JOYSTICK_TYPE_UNKNOWN`. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickType @@ -349,6 +386,8 @@ extern SDL_DECLSPEC SDL_JoystickType SDLCALL SDL_GetJoystickTypeForID(SDL_Joysti * \returns a joystick identifier or NULL on failure; call SDL_GetError() for * more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseJoystick @@ -362,6 +401,8 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_OpenJoystick(SDL_JoystickID insta * \returns an SDL_Joystick on success or NULL on failure or if it hasn't been * opened yet; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromID(SDL_JoystickID instance_id); @@ -373,6 +414,8 @@ extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetJoystickFromID(SDL_JoystickID * \returns an SDL_Joystick on success or NULL on failure; call SDL_GetError() * for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex @@ -465,13 +508,33 @@ SDL_COMPILE_TIME_ASSERT(SDL_VirtualJoystickDesc_SIZE, /** * Attach a new virtual joystick. * + * Apps can create virtual joysticks, that exist without hardware directly + * backing them, and have program-supplied inputs. Once attached, a virtual + * joystick looks like any other joystick that SDL can access. These can be + * used to make other things look like joysticks, or provide pre-recorded + * input, etc. + * + * Once attached, the app can send joystick inputs to the new virtual joystick + * using SDL_SetJoystickVirtualAxis(), etc. + * + * When no longer needed, the virtual joystick can be removed by calling + * SDL_DetachVirtualJoystick(). + * * \param desc joystick description, initialized using SDL_INIT_INTERFACE(). * \returns the joystick instance ID, or 0 on failure; call SDL_GetError() for * more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_DetachVirtualJoystick + * \sa SDL_SetJoystickVirtualAxis + * \sa SDL_SetJoystickVirtualButton + * \sa SDL_SetJoystickVirtualBall + * \sa SDL_SetJoystickVirtualHat + * \sa SDL_SetJoystickVirtualTouchpad + * \sa SDL_SetJoystickVirtualSensorData */ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_AttachVirtualJoystick(const SDL_VirtualJoystickDesc *desc); @@ -483,6 +546,8 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_AttachVirtualJoystick(const SDL_V * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_AttachVirtualJoystick @@ -495,6 +560,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_DetachVirtualJoystick(SDL_JoystickID instan * \param instance_id the joystick instance ID. * \returns true if the joystick is virtual, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instance_id); @@ -518,7 +585,15 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsJoystickVirtual(SDL_JoystickID instance_i * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetJoystickVirtualButton + * \sa SDL_SetJoystickVirtualBall + * \sa SDL_SetJoystickVirtualHat + * \sa SDL_SetJoystickVirtualTouchpad + * \sa SDL_SetJoystickVirtualSensorData */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value); @@ -538,7 +613,15 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualAxis(SDL_Joystick *joysti * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetJoystickVirtualAxis + * \sa SDL_SetJoystickVirtualButton + * \sa SDL_SetJoystickVirtualHat + * \sa SDL_SetJoystickVirtualTouchpad + * \sa SDL_SetJoystickVirtualSensorData */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *joystick, int ball, Sint16 xrel, Sint16 yrel); @@ -557,7 +640,15 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualBall(SDL_Joystick *joysti * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetJoystickVirtualAxis + * \sa SDL_SetJoystickVirtualBall + * \sa SDL_SetJoystickVirtualHat + * \sa SDL_SetJoystickVirtualTouchpad + * \sa SDL_SetJoystickVirtualSensorData */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick *joystick, int button, bool down); @@ -576,7 +667,15 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualButton(SDL_Joystick *joys * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetJoystickVirtualAxis + * \sa SDL_SetJoystickVirtualButton + * \sa SDL_SetJoystickVirtualBall + * \sa SDL_SetJoystickVirtualTouchpad + * \sa SDL_SetJoystickVirtualSensorData */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value); @@ -602,7 +701,15 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualHat(SDL_Joystick *joystic * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetJoystickVirtualAxis + * \sa SDL_SetJoystickVirtualButton + * \sa SDL_SetJoystickVirtualBall + * \sa SDL_SetJoystickVirtualHat + * \sa SDL_SetJoystickVirtualSensorData */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick *joystick, int touchpad, int finger, bool down, float x, float y, float pressure); @@ -624,7 +731,15 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickVirtualTouchpad(SDL_Joystick *jo * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. + * + * \sa SDL_SetJoystickVirtualAxis + * \sa SDL_SetJoystickVirtualButton + * \sa SDL_SetJoystickVirtualBall + * \sa SDL_SetJoystickVirtualHat + * \sa SDL_SetJoystickVirtualTouchpad */ extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joystick *joystick, SDL_SensorType type, Uint64 sensor_timestamp, const float *data, int num_values); @@ -648,6 +763,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickVirtualSensorData(SDL_Joystick * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetJoystickProperties(SDL_Joystick *joystick); @@ -665,6 +782,8 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetJoystickProperties(SDL_Joyst * \returns the name of the selected joystick. If no name can be found, this * function returns NULL; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickNameForID @@ -678,6 +797,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickName(SDL_Joystick *joyst * \returns the path of the selected joystick. If no path can be found, this * function returns NULL; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPathForID @@ -693,6 +814,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickPath(SDL_Joystick *joyst * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the player index, or -1 if it's not available. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SetJoystickPlayerIndex @@ -708,6 +831,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetJoystickPlayerIndex(SDL_Joystick *joystic * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickPlayerIndex @@ -724,6 +849,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickPlayerIndex(SDL_Joystick *joysti * this function returns a zero GUID; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID @@ -739,6 +866,8 @@ extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetJoystickGUID(SDL_Joystick *joystick) * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the USB vendor ID of the selected joystick, or 0 if unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickVendorForID @@ -753,6 +882,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickVendor(SDL_Joystick *joystick) * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the USB product ID of the selected joystick, or 0 if unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductForID @@ -767,6 +898,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProduct(SDL_Joystick *joystick * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the product version of the selected joystick, or 0 if unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickProductVersionForID @@ -782,6 +915,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickProductVersion(SDL_Joystick *j * \returns the firmware version of the selected joystick, or 0 if * unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickFirmwareVersion(SDL_Joystick *joystick); @@ -795,6 +930,8 @@ extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetJoystickFirmwareVersion(SDL_Joystick * * \returns the serial number of the selected joystick, or NULL if * unavailable. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joystick); @@ -805,6 +942,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetJoystickSerial(SDL_Joystick *joy * \param joystick the SDL_Joystick obtained from SDL_OpenJoystick(). * \returns the SDL_JoystickType of the selected joystick. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickTypeForID @@ -824,6 +963,8 @@ extern SDL_DECLSPEC SDL_JoystickType SDLCALL SDL_GetJoystickType(SDL_Joystick *j * \param crc16 a pointer filled in with a CRC used to distinguish different * products with the same VID/PID, or 0 if not available. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickGUIDForID @@ -837,6 +978,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetJoystickGUIDInfo(SDL_GUID guid, Uint16 * * \returns true if the joystick has been opened, false if it has not; call * SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystick); @@ -848,6 +991,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_JoystickConnected(SDL_Joystick *joystick); * \returns the instance ID of the specified joystick on success or 0 on * failure; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetJoystickID(SDL_Joystick *joystick); @@ -863,6 +1008,8 @@ extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetJoystickID(SDL_Joystick *joyst * \returns the number of axis controls/number of axes on success or -1 on * failure; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickAxis @@ -884,6 +1031,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickAxes(SDL_Joystick *joystick); * \returns the number of trackballs on success or -1 on failure; call * SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickBall @@ -900,6 +1049,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickBalls(SDL_Joystick *joystick); * \returns the number of POV hats on success or -1 on failure; call * SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickHat @@ -916,6 +1067,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickHats(SDL_Joystick *joystick); * \returns the number of buttons on success or -1 on failure; call * SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetJoystickButton @@ -934,6 +1087,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumJoystickButtons(SDL_Joystick *joystick * * \param enabled whether to process joystick events or not. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_JoystickEventsEnabled @@ -950,6 +1105,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetJoystickEventsEnabled(bool enabled); * * \returns true if joystick events are being processed, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SetJoystickEventsEnabled @@ -962,6 +1119,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_JoystickEventsEnabled(void); * This is called automatically by the event loop if any joystick events are * enabled. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UpdateJoysticks(void); @@ -984,6 +1143,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_UpdateJoysticks(void); * \returns a 16-bit signed integer representing the current position of the * axis or 0 on failure; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickAxes @@ -1002,6 +1163,8 @@ extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetJoystickAxis(SDL_Joystick *joystick, i * \param state upon return, the initial value is supplied here. * \returns true if this axis has any initial value, or false if not. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystick *joystick, int axis, Sint16 *state); @@ -1021,6 +1184,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickAxisInitialState(SDL_Joystick *j * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickBalls @@ -1036,6 +1201,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickBall(SDL_Joystick *joystick, int * \param hat the hat index to get the state from; indices start at index 0. * \returns the current hat position. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickHats @@ -1060,6 +1227,8 @@ extern SDL_DECLSPEC Uint8 SDLCALL SDL_GetJoystickHat(SDL_Joystick *joystick, int * index 0. * \returns true if the button is pressed, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetNumJoystickButtons @@ -1083,6 +1252,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetJoystickButton(SDL_Joystick *joystick, i * \param duration_ms the duration of the rumble effect, in milliseconds. * \returns true, or false if rumble isn't supported on this joystick. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); @@ -1110,6 +1281,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleJoystick(SDL_Joystick *joystick, Uint * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_RumbleJoystick @@ -1132,6 +1305,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RumbleJoystickTriggers(SDL_Joystick *joysti * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue); @@ -1145,6 +1320,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetJoystickLED(SDL_Joystick *joystick, Uint * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickEffect(SDL_Joystick *joystick, const void *data, int size); @@ -1154,6 +1331,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SendJoystickEffect(SDL_Joystick *joystick, * * \param joystick the joystick device to close. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_OpenJoystick @@ -1168,6 +1347,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseJoystick(SDL_Joystick *joystick); * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError() * for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetJoystickConnectionState(SDL_Joystick *joystick); @@ -1189,6 +1370,8 @@ extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetJoystickConnectio * \returns the current battery state or `SDL_POWERSTATE_ERROR` on failure; * call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetJoystickPowerInfo(SDL_Joystick *joystick, int *percent); diff --git a/vendor/sdl3/include/SDL_keyboard.h b/vendor/sdl3/include/SDL_keyboard.h index afa77b6c2..eb984de58 100644 --- a/vendor/sdl3/include/SDL_keyboard.h +++ b/vendor/sdl3/include/SDL_keyboard.h @@ -174,8 +174,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetKeyboard(void); /** * Get the current key modifier state for the keyboard. * - * \returns an OR'd combination of the modifier keys for the keyboard. See - * SDL_Keymod for details. + * \returns an OR'd combination of the modifier keys for the keyboard. * * \threadsafety It is safe to call this function from any thread. * diff --git a/vendor/sdl3/include/SDL_keycode.h b/vendor/sdl3/include/SDL_keycode.h index 61b68e794..c43660eef 100644 --- a/vendor/sdl3/include/SDL_keycode.h +++ b/vendor/sdl3/include/SDL_keycode.h @@ -45,12 +45,16 @@ * `SDLK_*` constant for those keys that do not generate characters. * * A special exception is the number keys at the top of the keyboard which map - * to SDLK_0...SDLK_9 on AZERTY layouts. + * by default to SDLK_0...SDLK_9 on AZERTY layouts. * * Keys with the `SDLK_EXTENDED_MASK` bit set do not map to a scancode or - * unicode code point. + * Unicode code point. + * + * Many common keycodes are listed below, but this list is not exhaustive. * * \since This datatype is available since SDL 3.2.0. + * + * \sa SDL_HINT_KEYCODE_OPTIONS */ typedef Uint32 SDL_Keycode; diff --git a/vendor/sdl3/include/SDL_log.h b/vendor/sdl3/include/SDL_log.h index 3fd7ec2ed..aceaabe77 100644 --- a/vendor/sdl3/include/SDL_log.h +++ b/vendor/sdl3/include/SDL_log.h @@ -206,6 +206,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_ResetLogPriorities(void); * SDL_LOG_PRIORITY_WARN and higher have a prefix showing their priority, e.g. * "WARNING: ". * + * This function makes a copy of its string argument, **prefix**, so it is not + * necessary to keep the value of **prefix** alive after the call returns. + * * \param priority the SDL_LogPriority to modify. * \param prefix the prefix to use for that log priority, or NULL to use no * prefix. @@ -263,7 +266,6 @@ extern SDL_DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fm * \sa SDL_LogInfo * \sa SDL_LogMessage * \sa SDL_LogMessageV - * \sa SDL_LogTrace * \sa SDL_LogVerbose * \sa SDL_LogWarn */ diff --git a/vendor/sdl3/include/SDL_main.h b/vendor/sdl3/include/SDL_main.h index 905d78e96..ff497a4c3 100644 --- a/vendor/sdl3/include/SDL_main.h +++ b/vendor/sdl3/include/SDL_main.h @@ -47,7 +47,7 @@ * * For more information, see: * - * https://wiki.libsdl.org/SDL3/README/main-functions + * https://wiki.libsdl.org/SDL3/README-main-functions */ #ifndef SDL_main_h_ @@ -68,7 +68,7 @@ * proper entry point for the platform, and all the other magic details * needed, like manually calling SDL_SetMainReady. * - * Please see [README/main-functions](README/main-functions), (or + * Please see [README-main-functions](README-main-functions), (or * docs/README-main-functions.md in the source tree) for a more detailed * explanation. * @@ -85,7 +85,7 @@ * SDL_AppQuit. The app should not provide a `main` function in this case, and * doing so will likely cause the build to fail. * - * Please see [README/main-functions](README/main-functions), (or + * Please see [README-main-functions](README-main-functions), (or * docs/README-main-functions.md in the source tree) for a more detailed * explanation. * @@ -110,7 +110,8 @@ * Even if available, an app can define SDL_MAIN_HANDLED and provide their * own, if they know what they're doing. * - * This macro is used internally by SDL, and apps probably shouldn't rely on it. + * This macro is used internally by SDL, and apps probably shouldn't rely on + * it. * * \since This macro is available since SDL 3.2.0. */ @@ -125,10 +126,11 @@ * This macro is defined by `SDL_main.h`, which is not automatically included * by `SDL.h`. * - * Even if required, an app can define SDL_MAIN_HANDLED and provide their - * own, if they know what they're doing. + * Even if required, an app can define SDL_MAIN_HANDLED and provide their own, + * if they know what they're doing. * - * This macro is used internally by SDL, and apps probably shouldn't rely on it. + * This macro is used internally by SDL, and apps probably shouldn't rely on + * it. * * \since This macro is available since SDL 3.2.0. */ @@ -165,12 +167,10 @@ */ #define SDL_MAIN_NEEDED - #elif defined(SDL_PLATFORM_IOS) - /* On iOS SDL provides a main function that creates an application delegate - and starts the iOS application run loop. + #elif defined(SDL_PLATFORM_IOS) || defined(SDL_PLATFORM_TVOS) + /* On iOS and tvOS SDL provides a main function that creates an application delegate and starts the application run loop. - To use it, just #include SDL_main.h in the source file that contains your - main() function. + To use it, just #include in the source file that contains your main() function. See src/video/uikit/SDL_uikitappdelegate.m for more details. */ @@ -347,10 +347,10 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppInit(void **appstate, int a * Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a * standard "main" function, you should not supply this. * - * This function is called repeatedly by SDL after SDL_AppInit returns 0. The - * function should operate as a single iteration the program's primary loop; - * it should update whatever state it needs and draw a new frame of video, - * usually. + * This function is called repeatedly by SDL after SDL_AppInit returns + * SDL_APP_CONTINUE. The function should operate as a single iteration the + * program's primary loop; it should update whatever state it needs and draw a + * new frame of video, usually. * * On some platforms, this function will be called at the refresh rate of the * display (which might change during the life of your app!). There are no @@ -449,8 +449,8 @@ extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, SDL_E * * This function is called once by SDL before terminating the program. * - * This function will be called no matter what, even if SDL_AppInit requests - * termination. + * This function will be called in all cases, even if SDL_AppInit requests + * termination at startup. * * This function should not go into an infinite mainloop; it should * deinitialize any resources necessary, perform whatever shutdown activities, @@ -512,7 +512,7 @@ typedef int (SDLCALL *SDL_main_func)(int argc, char *argv[]); * SDL_MAIN_USE_CALLBACKS. * * Program startup is a surprisingly complex topic. Please see - * [README/main-functions](README/main-functions), (or + * [README-main-functions](README-main-functions), (or * docs/README-main-functions.md in the source tree) for a more detailed * explanation. * @@ -553,6 +553,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetMainReady(void); * using SDL_main (like when using SDL_MAIN_HANDLED). When using this, you do * *not* need SDL_SetMainReady(). * + * If `argv` is NULL, SDL will provide command line arguments, either by + * querying the OS for them if possible, or supplying a filler array if not. + * * \param argc the argc parameter from the application's main() function, or 0 * if the platform's main-equivalent has no argc. * \param argv the argv parameter from the application's main() function, or @@ -615,11 +618,12 @@ extern SDL_DECLSPEC int SDLCALL SDL_EnterAppMainCallbacks(int argc, char *argv[] * Most applications do not need to, and should not, call this directly; SDL * will call it when initializing the video subsystem. * + * If `name` is NULL, SDL currently uses `(CS_BYTEALIGNCLIENT | CS_OWNDC)` for + * the style, regardless of what is specified here. + * * \param name the window class name, in UTF-8 encoding. If NULL, SDL * currently uses "SDL_app" but this isn't guaranteed. - * \param style the value to use in WNDCLASSEX::style. If `name` is NULL, SDL - * currently uses `(CS_BYTEALIGNCLIENT | CS_OWNDC)` regardless of - * what is specified here. + * \param style the value to use in WNDCLASSEX::style. * \param hInst the HINSTANCE to use in WNDCLASSEX::hInstance. If zero, SDL * will use `GetModuleHandle(NULL)` instead. * \returns true on success or false on failure; call SDL_GetError() for more diff --git a/vendor/sdl3/include/SDL_mouse.h b/vendor/sdl3/include/SDL_mouse.h index 864135d2b..d502005a7 100644 --- a/vendor/sdl3/include/SDL_mouse.h +++ b/vendor/sdl3/include/SDL_mouse.h @@ -130,6 +130,17 @@ typedef enum SDL_MouseWheelDirection SDL_MOUSEWHEEL_FLIPPED /**< The scroll direction is flipped / natural */ } SDL_MouseWheelDirection; +/** + * Animated cursor frame info. + * + * \since This struct is available since SDL 3.4.0. + */ +typedef struct SDL_CursorFrameInfo +{ + SDL_Surface *surface; /**< The surface data for this frame */ + Uint32 duration; /**< The frame duration in milliseconds (a duration of 0 is infinite) */ +} SDL_CursorFrameInfo; + /** * A bitmask of pressed mouse buttons, as reported by SDL_GetMouseState, etc. * @@ -160,6 +171,44 @@ typedef Uint32 SDL_MouseButtonFlags; #define SDL_BUTTON_X1MASK SDL_BUTTON_MASK(SDL_BUTTON_X1) #define SDL_BUTTON_X2MASK SDL_BUTTON_MASK(SDL_BUTTON_X2) +/** + * A callback used to transform mouse motion delta from raw values. + * + * This is called during SDL's handling of platform mouse events to scale the + * values of the resulting motion delta. + * + * \param userdata what was passed as `userdata` to + * SDL_SetRelativeMouseTransform(). + * \param timestamp the associated time at which this mouse motion event was + * received. + * \param window the associated window to which this mouse motion event was + * addressed. + * \param mouseID the associated mouse from which this mouse motion event was + * emitted. + * \param x pointer to a variable that will be treated as the resulting x-axis + * motion. + * \param y pointer to a variable that will be treated as the resulting y-axis + * motion. + * + * \threadsafety This callback is called by SDL's internal mouse input + * processing procedure, which may be a thread separate from the + * main event loop that is run at realtime priority. Stalling + * this thread with too much work in the callback can therefore + * potentially freeze the entire system. Care should be taken + * with proper synchronization practices when adding other side + * effects beyond mutation of the x and y values. + * + * \since This datatype is available since SDL 3.4.0. + * + * \sa SDL_SetRelativeMouseTransform + */ +typedef void (SDLCALL *SDL_MouseMotionTransformCallback)( + void *userdata, + Uint64 timestamp, + SDL_Window *window, + SDL_MouseID mouseID, + float *x, float *y +); /* Function prototypes */ @@ -380,6 +429,24 @@ extern SDL_DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window *window, */ extern SDL_DECLSPEC bool SDLCALL SDL_WarpMouseGlobal(float x, float y); +/** + * Set a user-defined function by which to transform relative mouse inputs. + * + * This overrides the relative system scale and relative speed scale hints. + * Should be called prior to enabling relative mouse mode, fails otherwise. + * + * \param callback a callback used to transform relative mouse motion, or NULL + * for default behavior. + * \param userdata a pointer that will be passed to `callback`. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetRelativeMouseTransform(SDL_MouseMotionTransformCallback callback, void *userdata); + /** * Set relative mouse mode for a window. * @@ -509,6 +576,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CaptureMouse(bool enabled); * * \since This function is available since SDL 3.2.0. * + * \sa SDL_CreateAnimatedCursor * \sa SDL_CreateColorCursor * \sa SDL_CreateSystemCursor * \sa SDL_DestroyCursor @@ -522,15 +590,17 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor(const Uint8 *data, /** * Create a color cursor. * - * If this function is passed a surface with alternate representations, the - * surface will be interpreted as the content to be used for 100% display - * scale, and the alternate representations will be used for high DPI - * situations. For example, if the original surface is 32x32, then on a 2x - * macOS display or 200% display scale on Windows, a 64x64 version of the - * image will be used, if available. If a matching version of the image isn't - * available, the closest larger size image will be downscaled to the - * appropriate size and be used instead, if available. Otherwise, the closest - * smaller image will be upscaled and be used instead. + * If this function is passed a surface with alternate representations added + * with SDL_AddSurfaceAlternateImage(), the surface will be interpreted as the + * content to be used for 100% display scale, and the alternate + * representations will be used for high DPI situations if + * SDL_HINT_MOUSE_DPI_SCALE_CURSORS is enabled. For example, if the original + * surface is 32x32, then on a 2x macOS display or 200% display scale on + * Windows, a 64x64 version of the image will be used, if available. If a + * matching version of the image isn't available, the closest larger size + * image will be downscaled to the appropriate size and be used instead, if + * available. Otherwise, the closest smaller image will be upscaled and be + * used instead. * * \param surface an SDL_Surface structure representing the cursor image. * \param hot_x the x position of the cursor hot spot. @@ -542,6 +612,8 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor(const Uint8 *data, * * \since This function is available since SDL 3.2.0. * + * \sa SDL_AddSurfaceAlternateImage + * \sa SDL_CreateAnimatedCursor * \sa SDL_CreateCursor * \sa SDL_CreateSystemCursor * \sa SDL_DestroyCursor @@ -551,6 +623,57 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateColorCursor(SDL_Surface *surf int hot_x, int hot_y); +/** + * Create an animated color cursor. + * + * Animated cursors are composed of a sequential array of frames, specified as + * surfaces and durations in an array of SDL_CursorFrameInfo structs. The hot + * spot coordinates are universal to all frames, and all frames must have the + * same dimensions. + * + * Frame durations are specified in milliseconds. A duration of 0 implies an + * infinite frame time, and the animation will stop on that frame. To create a + * one-shot animation, set the duration of the last frame in the sequence to + * 0. + * + * If this function is passed surfaces with alternate representations added + * with SDL_AddSurfaceAlternateImage(), the surfaces will be interpreted as + * the content to be used for 100% display scale, and the alternate + * representations will be used for high DPI situations. For example, if the + * original surfaces are 32x32, then on a 2x macOS display or 200% display + * scale on Windows, a 64x64 version of the image will be used, if available. + * If a matching version of the image isn't available, the closest larger size + * image will be downscaled to the appropriate size and be used instead, if + * available. Otherwise, the closest smaller image will be upscaled and be + * used instead. + * + * If the underlying platform does not support animated cursors, this function + * will fall back to creating a static color cursor using the first frame in + * the sequence. + * + * \param frames an array of cursor images composing the animation. + * \param frame_count the number of frames in the sequence. + * \param hot_x the x position of the cursor hot spot. + * \param hot_y the y position of the cursor hot spot. + * \returns the new cursor on success or NULL on failure; call SDL_GetError() + * for more information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_AddSurfaceAlternateImage + * \sa SDL_CreateCursor + * \sa SDL_CreateColorCursor + * \sa SDL_CreateSystemCursor + * \sa SDL_DestroyCursor + * \sa SDL_SetCursor + */ +extern SDL_DECLSPEC SDL_Cursor *SDLCALL SDL_CreateAnimatedCursor(SDL_CursorFrameInfo *frames, + int frame_count, + int hot_x, + int hot_y); + /** * Create a system cursor. * @@ -608,7 +731,7 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void); * You do not have to call SDL_DestroyCursor() on the return value, but it is * safe to do so. * - * \returns the default cursor on success or NULL on failuree; call + * \returns the default cursor on success or NULL on failure; call * SDL_GetError() for more information. * * \threadsafety This function should only be called on the main thread. @@ -629,6 +752,7 @@ extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetDefaultCursor(void); * * \since This function is available since SDL 3.2.0. * + * \sa SDL_CreateAnimatedCursor * \sa SDL_CreateColorCursor * \sa SDL_CreateCursor * \sa SDL_CreateSystemCursor diff --git a/vendor/sdl3/include/SDL_mutex.h b/vendor/sdl3/include/SDL_mutex.h index c88ec1531..024ce0b37 100644 --- a/vendor/sdl3/include/SDL_mutex.h +++ b/vendor/sdl3/include/SDL_mutex.h @@ -360,7 +360,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockMutex(SDL_Mutex *mutex) SDL_ACQUIRE(mut * \sa SDL_LockMutex * \sa SDL_UnlockMutex */ -extern SDL_DECLSPEC bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ACQUIRE(0, mutex); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ACQUIRE(true, mutex); /** * Unlock the mutex. @@ -559,7 +559,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForWriting(SDL_RWLock *rwlock) SD * \sa SDL_TryLockRWLockForWriting * \sa SDL_UnlockRWLock */ -extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE_SHARED(0, rwlock); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE_SHARED(true, rwlock); /** * Try to lock a read/write lock _for writing_ without blocking. @@ -589,7 +589,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwlock) * \sa SDL_TryLockRWLockForReading * \sa SDL_UnlockRWLock */ -extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE(0, rwlock); +extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE(true, rwlock); /** * Unlock the read/write lock. @@ -942,7 +942,7 @@ typedef enum SDL_InitStatus * Here is an example of using this: * * ```c - * static SDL_AtomicInitState init; + * static SDL_InitState init; * * bool InitSystem(void) * { diff --git a/vendor/sdl3/include/SDL_pen.h b/vendor/sdl3/include/SDL_pen.h index 5182eeb0c..97c22e506 100644 --- a/vendor/sdl3/include/SDL_pen.h +++ b/vendor/sdl3/include/SDL_pen.h @@ -28,12 +28,37 @@ * handling, e.g., for input and drawing tablets or suitably equipped mobile / * tablet devices. * - * To get started with pens, simply handle SDL_EVENT_PEN_* events. When a pen - * starts providing input, SDL will assign it a unique SDL_PenID, which will - * remain for the life of the process, as long as the pen stays connected. + * To get started with pens, simply handle pen events: + * + * - SDL_EVENT_PEN_PROXIMITY_IN, SDL_EVENT_PEN_PROXIMITY_OUT + * (SDL_PenProximityEvent) + * - SDL_EVENT_PEN_DOWN, SDL_EVENT_PEN_UP (SDL_PenTouchEvent) + * - SDL_EVENT_PEN_MOTION (SDL_PenMotionEvent) + * - SDL_EVENT_PEN_BUTTON_DOWN, SDL_EVENT_PEN_BUTTON_UP (SDL_PenButtonEvent) + * - SDL_EVENT_PEN_AXIS (SDL_PenAxisEvent) * * Pens may provide more than simple touch input; they might have other axes, * such as pressure, tilt, rotation, etc. + * + * When a pen starts providing input, SDL will assign it a unique SDL_PenID, + * which will remain for the life of the process, as long as the pen stays + * connected. A pen leaving proximity (being taken far enough away from the + * digitizer tablet that it no longer reponds) and then coming back should + * fire proximity events, but the SDL_PenID should remain consistent. + * Unplugging the digitizer and reconnecting may cause future input to have a + * new SDL_PenID, as SDL may not know that this is the same hardware. + * + * Please note that various platforms vary wildly in how (and how well) they + * support pen input. If your pen supports some piece of functionality but SDL + * doesn't seem to, it might actually be the operating system's fault. For + * example, some platforms can manage multiple devices at the same time, but + * others will make any connected pens look like a single logical device, much + * how all USB mice connected to a computer will move the same system cursor. + * cursor. Other platforms might not support pen buttons, or the distance + * axis, etc. Very few platforms can even report _what_ functionality the pen + * supports in the first place, so best practices is to either build UI to let + * the user configure their pens, or be prepared to handle new functionality + * for a pen the first time an event is reported. */ #ifndef SDL_pen_h_ @@ -43,6 +68,7 @@ #include #include +#include /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus extern "C" { @@ -55,7 +81,12 @@ extern "C" { * * These show up in pen events when SDL sees input from them. They remain * consistent as long as SDL can recognize a tool to be the same pen; but if a - * pen physically leaves the area and returns, it might get a new ID. + * pen's digitizer table is physically detached from the computer, it might + * get a new ID when reconnected, as SDL won't know it's the same device. + * + * These IDs are only stable within a single run of a program; the next time a + * program is run, the pen's ID will likely be different, even if the hardware + * hasn't been disconnected, etc. * * \since This datatype is available since SDL 3.2.0. */ @@ -75,7 +106,6 @@ typedef Uint32 SDL_PenID; */ #define SDL_PEN_TOUCHID ((SDL_TouchID)-2) - /** * Pen input flags, as reported by various pen events' `pen_state` field. * @@ -83,13 +113,14 @@ typedef Uint32 SDL_PenID; */ typedef Uint32 SDL_PenInputFlags; -#define SDL_PEN_INPUT_DOWN (1u << 0) /**< pen is pressed down */ -#define SDL_PEN_INPUT_BUTTON_1 (1u << 1) /**< button 1 is pressed */ -#define SDL_PEN_INPUT_BUTTON_2 (1u << 2) /**< button 2 is pressed */ -#define SDL_PEN_INPUT_BUTTON_3 (1u << 3) /**< button 3 is pressed */ -#define SDL_PEN_INPUT_BUTTON_4 (1u << 4) /**< button 4 is pressed */ -#define SDL_PEN_INPUT_BUTTON_5 (1u << 5) /**< button 5 is pressed */ -#define SDL_PEN_INPUT_ERASER_TIP (1u << 30) /**< eraser tip is used */ +#define SDL_PEN_INPUT_DOWN (1u << 0) /**< pen is pressed down */ +#define SDL_PEN_INPUT_BUTTON_1 (1u << 1) /**< button 1 is pressed */ +#define SDL_PEN_INPUT_BUTTON_2 (1u << 2) /**< button 2 is pressed */ +#define SDL_PEN_INPUT_BUTTON_3 (1u << 3) /**< button 3 is pressed */ +#define SDL_PEN_INPUT_BUTTON_4 (1u << 4) /**< button 4 is pressed */ +#define SDL_PEN_INPUT_BUTTON_5 (1u << 5) /**< button 5 is pressed */ +#define SDL_PEN_INPUT_ERASER_TIP (1u << 30) /**< eraser tip is used */ +#define SDL_PEN_INPUT_IN_PROXIMITY (1u << 31) /**< pen is in proximity (since SDL 3.4.0) */ /** * Pen axis indices. @@ -118,10 +149,50 @@ typedef enum SDL_PenAxis SDL_PEN_AXIS_COUNT /**< Total known pen axis types in this version of SDL. This number may grow in future releases! */ } SDL_PenAxis; +/** + * An enum that describes the type of a pen device. + * + * A "direct" device is a pen that touches a graphic display (like an Apple + * Pencil on an iPad's screen). "Indirect" devices touch an external tablet + * surface that is connected to the machine but is not a display (like a + * lower-end Wacom tablet connected over USB). + * + * Apps may use this information to decide if they should draw a cursor; if + * the pen is touching the screen directly, a cursor doesn't make sense and + * can be in the way, but becomes necessary for indirect devices to know where + * on the display they are interacting. + * + * \since This enum is available since SDL 3.4.0. + */ +typedef enum SDL_PenDeviceType +{ + SDL_PEN_DEVICE_TYPE_INVALID = -1, /**< Not a valid pen device. */ + SDL_PEN_DEVICE_TYPE_UNKNOWN, /**< Don't know specifics of this pen. */ + SDL_PEN_DEVICE_TYPE_DIRECT, /**< Pen touches display. */ + SDL_PEN_DEVICE_TYPE_INDIRECT /**< Pen touches something that isn't the display. */ +} SDL_PenDeviceType; + +/** + * Get the device type of the given pen. + * + * Many platforms do not supply this information, so an app must always be + * prepared to get an SDL_PEN_DEVICE_TYPE_UNKNOWN result. + * + * \param instance_id the pen instance ID. + * \returns the device type of the given pen, or SDL_PEN_DEVICE_TYPE_INVALID + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC SDL_PenDeviceType SDLCALL SDL_GetPenDeviceType(SDL_PenID instance_id); + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } #endif +#include #endif /* SDL_pen_h_ */ diff --git a/vendor/sdl3/include/SDL_pixels.h b/vendor/sdl3/include/SDL_pixels.h index 39596c1c9..54ef954ed 100644 --- a/vendor/sdl3/include/SDL_pixels.h +++ b/vendor/sdl3/include/SDL_pixels.h @@ -451,7 +451,7 @@ typedef enum SDL_PackedLayout * expressions with side-effects here. * * \param format an SDL_PixelFormat to check. - * \returns true if the format is 10-bit, false otherwise. + * \returns true if the format is a floating point, false otherwise. * * \threadsafety It is safe to call this macro from any thread. * @@ -1096,7 +1096,7 @@ typedef enum SDL_Colorspace SDL_CHROMA_LOCATION_LEFT), */ SDL_COLORSPACE_RGB_DEFAULT = SDL_COLORSPACE_SRGB, /**< The default colorspace for RGB surfaces if no colorspace is specified */ - SDL_COLORSPACE_YUV_DEFAULT = SDL_COLORSPACE_JPEG /**< The default colorspace for YUV surfaces if no colorspace is specified */ + SDL_COLORSPACE_YUV_DEFAULT = SDL_COLORSPACE_BT601_LIMITED /**< The default colorspace for YUV surfaces if no colorspace is specified */ } SDL_Colorspace; /** @@ -1379,7 +1379,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormatDetails *for * (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, * 0xff, 0xff] not [0xf8, 0xfc, 0xf8]). * - * \param pixel a pixel value. + * \param pixelvalue a pixel value. * \param format a pointer to SDL_PixelFormatDetails describing the pixel * format. * \param palette an optional palette for indexed formats, may be NULL. @@ -1397,7 +1397,7 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormatDetails *for * \sa SDL_MapRGB * \sa SDL_MapRGBA */ -extern SDL_DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, const SDL_PixelFormatDetails *format, const SDL_Palette *palette, Uint8 *r, Uint8 *g, Uint8 *b); +extern SDL_DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixelvalue, const SDL_PixelFormatDetails *format, const SDL_Palette *palette, Uint8 *r, Uint8 *g, Uint8 *b); /** * Get RGBA values from a pixel in the specified format. @@ -1410,7 +1410,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, const SDL_PixelFormatD * If the surface has no alpha component, the alpha will be returned as 0xff * (100% opaque). * - * \param pixel a pixel value. + * \param pixelvalue a pixel value. * \param format a pointer to SDL_PixelFormatDetails describing the pixel * format. * \param palette an optional palette for indexed formats, may be NULL. @@ -1429,7 +1429,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, const SDL_PixelFormatD * \sa SDL_MapRGB * \sa SDL_MapRGBA */ -extern SDL_DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, const SDL_PixelFormatDetails *format, const SDL_Palette *palette, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); +extern SDL_DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixelvalue, const SDL_PixelFormatDetails *format, const SDL_Palette *palette, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); /* Ends C function definitions when using C++ */ diff --git a/vendor/sdl3/include/SDL_platform_defines.h b/vendor/sdl3/include/SDL_platform_defines.h index 6b240a8be..7de110e03 100644 --- a/vendor/sdl3/include/SDL_platform_defines.h +++ b/vendor/sdl3/include/SDL_platform_defines.h @@ -190,7 +190,7 @@ #if TARGET_OS_VISION /** - * A preprocessor macro that is only defined if compiling for VisionOS. + * A preprocessor macro that is only defined if compiling for visionOS. * * \since This macro is available since SDL 3.2.0. * @@ -202,7 +202,7 @@ #if TARGET_OS_IPHONE /** - * A preprocessor macro that is only defined if compiling for iOS. + * A preprocessor macro that is only defined if compiling for iOS or visionOS. * * \since This macro is available since SDL 3.2.0. * @@ -317,7 +317,7 @@ #define SDL_PLATFORM_CYGWIN 1 #endif -#if defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN) +#if (defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN)) && !defined(__NGAGE__) /** * A preprocessor macro that is only defined if compiling for Windows. @@ -473,4 +473,25 @@ #define SDL_PLATFORM_3DS 1 #endif +#ifdef __NGAGE__ + +/** + * A preprocessor macro that is only defined if compiling for the Nokia + * N-Gage. + * + * \since This macro is available since SDL 3.4.0. + */ +#define SDL_PLATFORM_NGAGE 1 +#endif + +#ifdef __GNU__ + +/** + * A preprocessor macro that is only defined if compiling for GNU/Hurd. + * + * \since This macro is available since SDL 3.4.0. + */ +#define SDL_PLATFORM_HURD 1 +#endif + #endif /* SDL_platform_defines_h_ */ diff --git a/vendor/sdl3/include/SDL_power.h b/vendor/sdl3/include/SDL_power.h index 694fb0924..bc2d9d53e 100644 --- a/vendor/sdl3/include/SDL_power.h +++ b/vendor/sdl3/include/SDL_power.h @@ -88,8 +88,8 @@ typedef enum SDL_PowerState * can't determine a value or there is no battery. * \param percent a pointer filled in with the percentage of battery life * left, between 0 and 100, or NULL to ignore. This will be - * filled in with -1 we can't determine a value or there is no - * battery. + * filled in with -1 when we can't determine a value or there + * is no battery. * \returns the current battery state or `SDL_POWERSTATE_ERROR` on failure; * call SDL_GetError() for more information. * diff --git a/vendor/sdl3/include/SDL_process.h b/vendor/sdl3/include/SDL_process.h index 511b2f9c5..57e3afd94 100644 --- a/vendor/sdl3/include/SDL_process.h +++ b/vendor/sdl3/include/SDL_process.h @@ -166,6 +166,9 @@ typedef enum SDL_ProcessIO * - `SDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER`: an SDL_Environment * pointer. If this property is set, it will be the entire environment for * the process, otherwise the current environment is used. + * - `SDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING`: a UTF-8 encoded + * string representing the working directory for the process, defaults to + * the current working directory. * - `SDL_PROP_PROCESS_CREATE_STDIN_NUMBER`: an SDL_ProcessIO value describing * where standard input for the process comes from, defaults to * `SDL_PROCESS_STDIO_NULL`. @@ -192,6 +195,12 @@ typedef enum SDL_ProcessIO * run in the background. In this case the default input and output is * `SDL_PROCESS_STDIO_NULL` and the exitcode of the process is not * available, and will always be 0. + * - `SDL_PROP_PROCESS_CREATE_CMDLINE_STRING`: a string containing the program + * to run and any parameters. This string is passed directly to + * `CreateProcess` on Windows, and does nothing on other platforms. This + * property is only important if you want to start programs that does + * non-standard command-line processing, and in most cases using + * `SDL_PROP_PROCESS_CREATE_ARGS_POINTER` is sufficient. * * On POSIX platforms, wait() and waitpid(-1, ...) should not be called, and * SIGCHLD should not be ignored or handled because those would prevent SDL @@ -219,6 +228,7 @@ extern SDL_DECLSPEC SDL_Process * SDLCALL SDL_CreateProcessWithProperties(SDL_Pr #define SDL_PROP_PROCESS_CREATE_ARGS_POINTER "SDL.process.create.args" #define SDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER "SDL.process.create.environment" +#define SDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING "SDL.process.create.working_directory" #define SDL_PROP_PROCESS_CREATE_STDIN_NUMBER "SDL.process.create.stdin_option" #define SDL_PROP_PROCESS_CREATE_STDIN_POINTER "SDL.process.create.stdin_source" #define SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER "SDL.process.create.stdout_option" @@ -227,6 +237,7 @@ extern SDL_DECLSPEC SDL_Process * SDLCALL SDL_CreateProcessWithProperties(SDL_Pr #define SDL_PROP_PROCESS_CREATE_STDERR_POINTER "SDL.process.create.stderr_source" #define SDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN "SDL.process.create.stderr_to_stdout" #define SDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN "SDL.process.create.background" +#define SDL_PROP_PROCESS_CREATE_CMDLINE_STRING "SDL.process.create.cmdline" /** * Get the properties associated with a process. diff --git a/vendor/sdl3/include/SDL_properties.h b/vendor/sdl3/include/SDL_properties.h index 1f47d5f4a..8e87dfce4 100644 --- a/vendor/sdl3/include/SDL_properties.h +++ b/vendor/sdl3/include/SDL_properties.h @@ -59,7 +59,7 @@ extern "C" { #endif /** - * SDL properties ID + * An ID that represents a properties set. * * \since This datatype is available since SDL 3.2.0. */ @@ -80,6 +80,31 @@ typedef enum SDL_PropertyType SDL_PROPERTY_TYPE_BOOLEAN } SDL_PropertyType; +/** + * A generic property for naming things. + * + * This property is intended to be added to any SDL_PropertiesID that needs a + * generic name associated with the property set. It is not guaranteed that + * any property set will include this key, but it is convenient to have a + * standard key that any piece of code could reasonably agree to use. + * + * For example, the properties associated with an SDL_Texture might have a + * name string of "player sprites", or an SDL_AudioStream might have + * "background music", etc. This might also be useful for an SDL_IOStream to + * list the path to its asset. + * + * There is no format for the value set with this key; it is expected to be + * human-readable and informational in nature, possibly for logging or + * debugging purposes. + * + * SDL does not currently set this property on any objects it creates, but + * this may change in later versions; it is currently expected that apps and + * external libraries will take advantage of it, when appropriate. + * + * \since This macro is available since SDL 3.4.0. + */ +#define SDL_PROP_NAME_STRING "SDL.name" + /** * Get the global SDL properties. * @@ -119,7 +144,9 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_CreateProperties(void); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety It is safe to call this function from any thread. + * \threadsafety It is safe to call this function from any thread. This + * function acquires simultaneous mutex locks on both the source + * and destination property sets. * * \since This function is available since SDL 3.2.0. */ diff --git a/vendor/sdl3/include/SDL_rect.h b/vendor/sdl3/include/SDL_rect.h index eb2d34a69..56eb6ffe6 100644 --- a/vendor/sdl3/include/SDL_rect.h +++ b/vendor/sdl3/include/SDL_rect.h @@ -88,8 +88,11 @@ typedef struct SDL_Rect /** - * A rectangle, with the origin at the upper left (using floating point - * values). + * A rectangle stored using floating point values. + * + * The origin of the coordinate space is in the top-left, with increasing + * values moving down and right. The properties `x` and `y` represent the + * coordinates of the top-left corner of the rectangle. * * \since This struct is available since SDL 3.2.0. * @@ -125,10 +128,10 @@ typedef struct SDL_FRect */ SDL_FORCE_INLINE void SDL_RectToFRect(const SDL_Rect *rect, SDL_FRect *frect) { - frect->x = (float)rect->x; - frect->y = (float)rect->y; - frect->w = (float)rect->w; - frect->h = (float)rect->h; + frect->x = SDL_static_cast(float, rect->x); + frect->y = SDL_static_cast(float, rect->y); + frect->w = SDL_static_cast(float, rect->w); + frect->h = SDL_static_cast(float, rect->h); } /** @@ -324,7 +327,7 @@ SDL_FORCE_INLINE bool SDL_PointInRectFloat(const SDL_FPoint *p, const SDL_FRect } /** - * Determine whether a floating point rectangle can contain any point. + * Determine whether a floating point rectangle takes no space. * * A rectangle is considered "empty" for this function if `r` is NULL, or if * `r`'s width and/or height are < 0.0f. diff --git a/vendor/sdl3/include/SDL_render.h b/vendor/sdl3/include/SDL_render.h index c9d184cc0..3d5139f59 100644 --- a/vendor/sdl3/include/SDL_render.h +++ b/vendor/sdl3/include/SDL_render.h @@ -39,9 +39,9 @@ * may also be stretched with linear interpolation. * * This API is designed to accelerate simple 2D operations. You may want more - * functionality such as polygons and particle effects and in that case you - * should use SDL's OpenGL/Direct3D support, the SDL3 GPU API, or one of the - * many good 3D engines. + * functionality such as 3D polygons and particle effects, and in that case + * you should use SDL's OpenGL/Direct3D support, the SDL3 GPU API, or one of + * the many good 3D engines. * * These functions must be called from the main thread. See this bug for * details: https://github.com/libsdl-org/SDL/issues/986 @@ -59,6 +59,7 @@ #include #include #include +#include #include /* Set up for C function definitions, even when using C++ */ @@ -73,6 +74,13 @@ extern "C" { */ #define SDL_SOFTWARE_RENDERER "software" +/** + * The name of the GPU renderer. + * + * \since This macro is available since SDL 3.4.0. + */ +#define SDL_GPU_RENDERER "gpu" + /** * Vertex structure. * @@ -97,6 +105,25 @@ typedef enum SDL_TextureAccess SDL_TEXTUREACCESS_TARGET /**< Texture can be used as a render target */ } SDL_TextureAccess; +/** + * The addressing mode for a texture when used in SDL_RenderGeometry(). + * + * This affects how texture coordinates are interpreted outside of [0, 1] + * + * Texture wrapping is always supported for power of two texture sizes, and is + * supported for other texture sizes if + * SDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN is set to true. + * + * \since This enum is available since SDL 3.4.0. + */ +typedef enum SDL_TextureAddressMode +{ + SDL_TEXTURE_ADDRESS_INVALID = -1, + SDL_TEXTURE_ADDRESS_AUTO, /**< Wrapping is enabled if texture coordinates are outside [0, 1], this is the default */ + SDL_TEXTURE_ADDRESS_CLAMP, /**< Texture coordinates are clamped to the [0, 1] range */ + SDL_TEXTURE_ADDRESS_WRAP /**< The texture is repeated (tiled) */ +} SDL_TextureAddressMode; + /** * How the logical size is mapped to the output. * @@ -106,7 +133,7 @@ typedef enum SDL_RendererLogicalPresentation { SDL_LOGICAL_PRESENTATION_DISABLED, /**< There is no logical size in effect */ SDL_LOGICAL_PRESENTATION_STRETCH, /**< The rendered content is stretched to the output resolution */ - SDL_LOGICAL_PRESENTATION_LETTERBOX, /**< The rendered content is fit to the largest dimension and the other dimension is letterboxed with black bars */ + SDL_LOGICAL_PRESENTATION_LETTERBOX, /**< The rendered content is fit to the largest dimension and the other dimension is letterboxed with the clear color */ SDL_LOGICAL_PRESENTATION_OVERSCAN, /**< The rendered content is fit to the smallest dimension and the other dimension extends beyond the output bounds */ SDL_LOGICAL_PRESENTATION_INTEGER_SCALE /**< The rendered content is scaled up by integer multiples to fit the output resolution */ } SDL_RendererLogicalPresentation; @@ -267,6 +294,17 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window *window * present synchronized with the refresh rate. This property can take any * value that is supported by SDL_SetRenderVSync() for the renderer. * + * With the SDL GPU renderer (since SDL 3.4.0): + * + * - `SDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER`: the device to use with the + * renderer, optional. + * - `SDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN`: the app is able to + * provide SPIR-V shaders to SDL_GPURenderState, optional. + * - `SDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN`: the app is able to + * provide DXIL shaders to SDL_GPURenderState, optional. + * - `SDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN`: the app is able to + * provide MSL shaders to SDL_GPURenderState, optional. + * * With the vulkan renderer: * * - `SDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER`: the VkInstance to use @@ -303,6 +341,10 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRendererWithProperties(SDL_ #define SDL_PROP_RENDERER_CREATE_SURFACE_POINTER "SDL.renderer.create.surface" #define SDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER "SDL.renderer.create.output_colorspace" #define SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER "SDL.renderer.create.present_vsync" +#define SDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER "SDL.renderer.create.gpu.device" +#define SDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN "SDL.renderer.create.gpu.shaders_spirv" +#define SDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN "SDL.renderer.create.gpu.shaders_dxil" +#define SDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN "SDL.renderer.create.gpu.shaders_msl" #define SDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER "SDL.renderer.create.vulkan.instance" #define SDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER "SDL.renderer.create.vulkan.surface" #define SDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER "SDL.renderer.create.vulkan.physical_device" @@ -310,6 +352,53 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRendererWithProperties(SDL_ #define SDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER "SDL.renderer.create.vulkan.graphics_queue_family_index" #define SDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER "SDL.renderer.create.vulkan.present_queue_family_index" +/** + * Create a 2D GPU rendering context. + * + * The GPU device to use is passed in as a parameter. If this is NULL, then a + * device will be created normally and can be retrieved using + * SDL_GetGPURendererDevice(). + * + * The window to use is passed in as a parameter. If this is NULL, then this + * will become an offscreen renderer. In that case, you should call + * SDL_SetRenderTarget() to setup rendering to a texture, and then call + * SDL_RenderPresent() normally to complete drawing a frame. + * + * \param device the GPU device to use with the renderer, or NULL to create a + * device. + * \param window the window where rendering is displayed, or NULL to create an + * offscreen renderer. + * \returns a valid rendering context or NULL if there was an error; call + * SDL_GetError() for more information. + * + * \threadsafety If this function is called with a valid GPU device, it should + * be called on the thread that created the device. If this + * function is called with a valid window, it should be called + * on the thread that created the window. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_CreateRendererWithProperties + * \sa SDL_GetGPURendererDevice + * \sa SDL_CreateGPUShader + * \sa SDL_CreateGPURenderState + * \sa SDL_SetGPURenderState + */ +extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateGPURenderer(SDL_GPUDevice *device, SDL_Window *window); + +/** + * Return the GPU device used by a renderer. + * + * \param renderer the rendering context. + * \returns the GPU device used by the renderer, or NULL if the renderer is + * not a GPU renderer; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_GetGPURendererDevice(SDL_Renderer *renderer); + /** * Create a 2D software rendering context for a surface. * @@ -323,7 +412,7 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRendererWithProperties(SDL_ * \returns a valid rendering context or NULL if there was an error; call * SDL_GetError() for more information. * - * \threadsafety This function should only be called on the main thread. + * \threadsafety It is safe to call this function from any thread. * * \since This function is available since SDL 3.2.0. * @@ -389,6 +478,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetRendererName(SDL_Renderer *rende * - `SDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER`: a (const SDL_PixelFormat *) * array of pixel formats, terminated with SDL_PIXELFORMAT_UNKNOWN, * representing the available texture formats for this renderer. + * - `SDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN`: true if the renderer + * supports SDL_TEXTURE_ADDRESS_WRAP on non-power-of-two textures. * - `SDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER`: an SDL_Colorspace value * describing the colorspace for output to the display, defaults to * SDL_COLORSPACE_SRGB. @@ -465,6 +556,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetRendererProperties(SDL_Rende #define SDL_PROP_RENDERER_VSYNC_NUMBER "SDL.renderer.vsync" #define SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER "SDL.renderer.max_texture_size" #define SDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER "SDL.renderer.texture_formats" +#define SDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN "SDL.renderer.texture_wrapping" #define SDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER "SDL.renderer.output_colorspace" #define SDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN "SDL.renderer.HDR_enabled" #define SDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT "SDL.renderer.SDR_white_point" @@ -601,6 +693,9 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Rende * pixels, required * - `SDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER`: the height of the texture in * pixels, required + * - `SDL_PROP_TEXTURE_CREATE_PALETTE_POINTER`: an SDL_Palette to use with + * palettized texture formats. This can be set later with + * SDL_SetTexturePalette() * - `SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT`: for HDR10 and floating * point textures, this defines the value of 100% diffuse white, with higher * values being displayed in the High Dynamic Range headroom. This defaults @@ -673,9 +768,24 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Rende * * With the vulkan renderer: * - * - `SDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER`: the VkImage with layout - * VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL associated with the texture, if - * you want to wrap an existing texture. + * - `SDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER`: the VkImage associated + * with the texture, if you want to wrap an existing texture. + * - `SDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER`: the VkImageLayout for the + * VkImage, defaults to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL. + * + * With the GPU renderer: + * + * - `SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER`: the SDL_GPUTexture + * associated with the texture, if you want to wrap an existing texture. + * - `SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_NUMBER`: the SDL_GPUTexture + * associated with the UV plane of an NV12 texture, if you want to wrap an + * existing texture. + * - `SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_NUMBER`: the SDL_GPUTexture + * associated with the U plane of a YUV texture, if you want to wrap an + * existing texture. + * - `SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_NUMBER`: the SDL_GPUTexture + * associated with the V plane of a YUV texture, if you want to wrap an + * existing texture. * * \param renderer the rendering context. * \param props the properties to use. @@ -695,29 +805,35 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Rende */ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureWithProperties(SDL_Renderer *renderer, SDL_PropertiesID props); -#define SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER "SDL.texture.create.colorspace" -#define SDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER "SDL.texture.create.format" -#define SDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER "SDL.texture.create.access" -#define SDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER "SDL.texture.create.width" -#define SDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER "SDL.texture.create.height" -#define SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT "SDL.texture.create.SDR_white_point" -#define SDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT "SDL.texture.create.HDR_headroom" -#define SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER "SDL.texture.create.d3d11.texture" -#define SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER "SDL.texture.create.d3d11.texture_u" -#define SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER "SDL.texture.create.d3d11.texture_v" -#define SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER "SDL.texture.create.d3d12.texture" -#define SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER "SDL.texture.create.d3d12.texture_u" -#define SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER "SDL.texture.create.d3d12.texture_v" -#define SDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER "SDL.texture.create.metal.pixelbuffer" -#define SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER "SDL.texture.create.opengl.texture" -#define SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER "SDL.texture.create.opengl.texture_uv" -#define SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER "SDL.texture.create.opengl.texture_u" -#define SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER "SDL.texture.create.opengl.texture_v" -#define SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER "SDL.texture.create.opengles2.texture" -#define SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER "SDL.texture.create.opengles2.texture_uv" -#define SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER "SDL.texture.create.opengles2.texture_u" -#define SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER "SDL.texture.create.opengles2.texture_v" -#define SDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER "SDL.texture.create.vulkan.texture" +#define SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER "SDL.texture.create.colorspace" +#define SDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER "SDL.texture.create.format" +#define SDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER "SDL.texture.create.access" +#define SDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER "SDL.texture.create.width" +#define SDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER "SDL.texture.create.height" +#define SDL_PROP_TEXTURE_CREATE_PALETTE_POINTER "SDL.texture.create.palette" +#define SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT "SDL.texture.create.SDR_white_point" +#define SDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT "SDL.texture.create.HDR_headroom" +#define SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER "SDL.texture.create.d3d11.texture" +#define SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER "SDL.texture.create.d3d11.texture_u" +#define SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER "SDL.texture.create.d3d11.texture_v" +#define SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER "SDL.texture.create.d3d12.texture" +#define SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER "SDL.texture.create.d3d12.texture_u" +#define SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER "SDL.texture.create.d3d12.texture_v" +#define SDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER "SDL.texture.create.metal.pixelbuffer" +#define SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER "SDL.texture.create.opengl.texture" +#define SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER "SDL.texture.create.opengl.texture_uv" +#define SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER "SDL.texture.create.opengl.texture_u" +#define SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER "SDL.texture.create.opengl.texture_v" +#define SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER "SDL.texture.create.opengles2.texture" +#define SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER "SDL.texture.create.opengles2.texture_uv" +#define SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER "SDL.texture.create.opengles2.texture_u" +#define SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER "SDL.texture.create.opengles2.texture_v" +#define SDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER "SDL.texture.create.vulkan.texture" +#define SDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER "SDL.texture.create.vulkan.layout" +#define SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER "SDL.texture.create.gpu.texture" +#define SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_POINTER "SDL.texture.create.gpu.texture_uv" +#define SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_POINTER "SDL.texture.create.gpu.texture_u" +#define SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_POINTER "SDL.texture.create.gpu.texture_v" /** * Get the properties associated with a texture. @@ -797,6 +913,17 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureWithProperties(SDL_Re * - `SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER`: the GLenum for the * texture target (`GL_TEXTURE_2D`, `GL_TEXTURE_EXTERNAL_OES`, etc) * + * With the gpu renderer: + * + * - `SDL_PROP_TEXTURE_GPU_TEXTURE_POINTER`: the SDL_GPUTexture associated + * with the texture + * - `SDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER`: the SDL_GPUTexture associated + * with the UV plane of an NV12 texture + * - `SDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER`: the SDL_GPUTexture associated + * with the U plane of a YUV texture + * - `SDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER`: the SDL_GPUTexture associated + * with the V plane of a YUV texture + * * \param texture the texture to query. * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. @@ -833,6 +960,10 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetTextureProperties(SDL_Textur #define SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER "SDL.texture.opengles2.texture_v" #define SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER "SDL.texture.opengles2.target" #define SDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER "SDL.texture.vulkan.texture" +#define SDL_PROP_TEXTURE_GPU_TEXTURE_POINTER "SDL.texture.gpu.texture" +#define SDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER "SDL.texture.gpu.texture_uv" +#define SDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER "SDL.texture.gpu.texture_u" +#define SDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER "SDL.texture.gpu.texture_v" /** * Get the renderer that created an SDL_Texture. @@ -864,6 +995,43 @@ extern SDL_DECLSPEC SDL_Renderer * SDLCALL SDL_GetRendererFromTexture(SDL_Textur */ extern SDL_DECLSPEC bool SDLCALL SDL_GetTextureSize(SDL_Texture *texture, float *w, float *h); +/** + * Set the palette used by a texture. + * + * Setting the palette keeps an internal reference to the palette, which can + * be safely destroyed afterwards. + * + * A single palette can be shared with many textures. + * + * \param texture the texture to update. + * \param palette the SDL_Palette structure to use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_CreatePalette + * \sa SDL_GetTexturePalette + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetTexturePalette(SDL_Texture *texture, SDL_Palette *palette); + +/** + * Get the palette used by a texture. + * + * \param texture the texture to query. + * \returns a pointer to the palette used by the texture, or NULL if there is + * no palette used. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_SetTexturePalette + */ +extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_GetTexturePalette(SDL_Texture *texture); + /** * Set an additional color value multiplied into render copy operations. * @@ -1386,14 +1554,6 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *rend * specific dimensions but to make fonts look sharp, the app turns off logical * presentation while drawing text, for example. * - * For the renderer's window, letterboxing is drawn into the framebuffer if - * logical presentation is enabled during SDL_RenderPresent; be sure to - * reenable it before presenting if you were toggling it, otherwise the - * letterbox areas might have artifacts from previous frames (or artifacts - * from external overlays, etc). Letterboxing is never drawn into texture - * render targets; be sure to call SDL_RenderClear() before drawing into the - * texture so the letterboxing areas are cleared, if appropriate. - * * You can convert coordinates in an event into rendering coordinates using * SDL_ConvertEventToRenderCoordinates(). * @@ -1418,15 +1578,16 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderLogicalPresentation(SDL_Renderer * * Get device independent resolution and presentation mode for rendering. * * This function gets the width and height of the logical rendering output, or - * the output size in pixels if a logical resolution is not enabled. + * 0 if a logical resolution is not enabled. * * Each render target has its own logical presentation state. This function * gets the state for the current render target. * * \param renderer the rendering context. - * \param w an int to be filled with the width. - * \param h an int to be filled with the height. - * \param mode the presentation mode used. + * \param w an int filled with the logical presentation width. + * \param h an int filled with the logical presentation height. + * \param mode a variable filled with the logical presentation mode being + * used. * \returns true on success or false on failure; call SDL_GetError() for more * information. * @@ -1545,8 +1706,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderCoordinatesToWindow(SDL_Renderer *ren * * \param renderer the rendering context. * \param event the event to modify. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. + * \returns true if the event is converted or doesn't need conversion, or + * false on failure; call SDL_GetError() for more information. * * \threadsafety This function should only be called on the main thread. * @@ -2231,9 +2392,48 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderTextureTiled(SDL_Renderer *renderer, * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderTexture + * \sa SDL_RenderTexture9GridTiled */ extern SDL_DECLSPEC bool SDLCALL SDL_RenderTexture9Grid(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float left_width, float right_width, float top_height, float bottom_height, float scale, const SDL_FRect *dstrect); +/** + * Perform a scaled copy using the 9-grid algorithm to the current rendering + * target at subpixel precision. + * + * The pixels in the texture are split into a 3x3 grid, using the different + * corner sizes for each corner, and the sides and center making up the + * remaining pixels. The corners are then scaled using `scale` and fit into + * the corners of the destination rectangle. The sides and center are then + * tiled into place to cover the remaining destination rectangle. + * + * \param renderer the renderer which should copy parts of a texture. + * \param texture the source texture. + * \param srcrect the SDL_Rect structure representing the rectangle to be used + * for the 9-grid, or NULL to use the entire texture. + * \param left_width the width, in pixels, of the left corners in `srcrect`. + * \param right_width the width, in pixels, of the right corners in `srcrect`. + * \param top_height the height, in pixels, of the top corners in `srcrect`. + * \param bottom_height the height, in pixels, of the bottom corners in + * `srcrect`. + * \param scale the scale used to transform the corner of `srcrect` into the + * corner of `dstrect`, or 0.0f for an unscaled copy. + * \param dstrect a pointer to the destination rectangle, or NULL for the + * entire rendering target. + * \param tileScale the scale used to transform the borders and center of + * `srcrect` into the borders and middle of `dstrect`, or + * 1.0f for an unscaled copy. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_RenderTexture + * \sa SDL_RenderTexture9Grid + */ +extern SDL_DECLSPEC bool SDLCALL SDL_RenderTexture9GridTiled(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float left_width, float right_width, float top_height, float bottom_height, float scale, const SDL_FRect *dstrect, float tileScale); + /** * Render a list of triangles, optionally using a texture and indices into the * vertex array Color and alpha modulation is done per vertex @@ -2255,6 +2455,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderTexture9Grid(SDL_Renderer *renderer, * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderGeometryRaw + * \sa SDL_SetRenderTextureAddressMode */ extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, SDL_Texture *texture, @@ -2287,6 +2488,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, * \since This function is available since SDL 3.2.0. * * \sa SDL_RenderGeometry + * \sa SDL_SetRenderTextureAddressMode */ extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, SDL_Texture *texture, @@ -2296,6 +2498,44 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, int num_vertices, const void *indices, int num_indices, int size_indices); +/** + * Set the texture addressing mode used in SDL_RenderGeometry(). + * + * \param renderer the rendering context. + * \param u_mode the SDL_TextureAddressMode to use for horizontal texture + * coordinates in SDL_RenderGeometry(). + * \param v_mode the SDL_TextureAddressMode to use for vertical texture + * coordinates in SDL_RenderGeometry(). + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_RenderGeometry + * \sa SDL_RenderGeometryRaw + * \sa SDL_GetRenderTextureAddressMode + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderTextureAddressMode(SDL_Renderer *renderer, SDL_TextureAddressMode u_mode, SDL_TextureAddressMode v_mode); + +/** + * Get the texture addressing mode used in SDL_RenderGeometry(). + * + * \param renderer the rendering context. + * \param u_mode a pointer filled in with the SDL_TextureAddressMode to use + * for horizontal texture coordinates in SDL_RenderGeometry(), + * may be NULL. + * \param v_mode a pointer filled in with the SDL_TextureAddressMode to use + * for vertical texture coordinates in SDL_RenderGeometry(), may + * be NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_SetRenderTextureAddressMode + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderTextureAddressMode(SDL_Renderer *renderer, SDL_TextureAddressMode *u_mode, SDL_TextureAddressMode *v_mode); + /** * Read pixels from the current rendering target. * @@ -2347,8 +2587,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RenderReadPixels(SDL_Renderer *ren * should not be done; you are only required to change back the rendering * target to default via `SDL_SetRenderTarget(renderer, NULL)` afterwards, as * textures by themselves do not have a concept of backbuffers. Calling - * SDL_RenderPresent while rendering to a texture will still update the screen - * with any current drawing that has been done _to the window itself_. + * SDL_RenderPresent while rendering to a texture will fail. * * \param renderer the rendering context. * \returns true on success or false on failure; call SDL_GetError() for more @@ -2577,8 +2816,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRenderVSync(SDL_Renderer *renderer, int * Among these limitations: * * - It accepts UTF-8 strings, but will only renders ASCII characters. - * - It has a single, tiny size (8x8 pixels). One can use logical presentation - * or scaling to adjust it, but it will be blurry. + * - It has a single, tiny size (8x8 pixels). You can use logical presentation + * or SDL_SetRenderScale() to adjust it. * - It uses a simple, hardcoded bitmap font. It does not allow different font * selections and it does not support truetype, for proper scaling. * - It does no word-wrapping and does not treat newline characters as a line @@ -2612,7 +2851,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderDebugText(SDL_Renderer *renderer, flo * Draw debug text to an SDL_Renderer. * * This function will render a printf()-style format string to a renderer. - * Note that this is a convinence function for debugging, with severe + * Note that this is a convenience function for debugging, with severe * limitations, and is not intended to be used for production apps and games. * * For the full list of limitations and other useful information, see @@ -2636,6 +2875,148 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderDebugText(SDL_Renderer *renderer, flo */ extern SDL_DECLSPEC bool SDLCALL SDL_RenderDebugTextFormat(SDL_Renderer *renderer, float x, float y, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(4); +/** + * Set default scale mode for new textures for given renderer. + * + * When a renderer is created, scale_mode defaults to SDL_SCALEMODE_LINEAR. + * + * \param renderer the renderer to update. + * \param scale_mode the scale mode to change to for new textures. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_GetDefaultTextureScaleMode + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetDefaultTextureScaleMode(SDL_Renderer *renderer, SDL_ScaleMode scale_mode); + +/** + * Get default texture scale mode of the given renderer. + * + * \param renderer the renderer to get data from. + * \param scale_mode a SDL_ScaleMode filled with current default scale mode. + * See SDL_SetDefaultTextureScaleMode() for the meaning of + * the value. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_SetDefaultTextureScaleMode + */ +extern SDL_DECLSPEC bool SDLCALL SDL_GetDefaultTextureScaleMode(SDL_Renderer *renderer, SDL_ScaleMode *scale_mode); + +/** + * A structure specifying the parameters of a GPU render state. + * + * \since This struct is available since SDL 3.4.0. + * + * \sa SDL_CreateGPURenderState + */ +typedef struct SDL_GPURenderStateCreateInfo +{ + SDL_GPUShader *fragment_shader; /**< The fragment shader to use when this render state is active */ + + Sint32 num_sampler_bindings; /**< The number of additional fragment samplers to bind when this render state is active */ + const SDL_GPUTextureSamplerBinding *sampler_bindings; /**< Additional fragment samplers to bind when this render state is active */ + + Sint32 num_storage_textures; /**< The number of storage textures to bind when this render state is active */ + SDL_GPUTexture *const *storage_textures; /**< Storage textures to bind when this render state is active */ + + Sint32 num_storage_buffers; /**< The number of storage buffers to bind when this render state is active */ + SDL_GPUBuffer *const *storage_buffers; /**< Storage buffers to bind when this render state is active */ + + SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ +} SDL_GPURenderStateCreateInfo; + +/** + * A custom GPU render state. + * + * \since This struct is available since SDL 3.4.0. + * + * \sa SDL_CreateGPURenderState + * \sa SDL_SetGPURenderStateFragmentUniforms + * \sa SDL_SetGPURenderState + * \sa SDL_DestroyGPURenderState + */ +typedef struct SDL_GPURenderState SDL_GPURenderState; + +/** + * Create custom GPU render state. + * + * \param renderer the renderer to use. + * \param createinfo a struct describing the GPU render state to create. + * \returns a custom GPU render state or NULL on failure; call SDL_GetError() + * for more information. + * + * \threadsafety This function should be called on the thread that created the + * renderer. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_SetGPURenderStateFragmentUniforms + * \sa SDL_SetGPURenderState + * \sa SDL_DestroyGPURenderState + */ +extern SDL_DECLSPEC SDL_GPURenderState * SDLCALL SDL_CreateGPURenderState(SDL_Renderer *renderer, SDL_GPURenderStateCreateInfo *createinfo); + +/** + * Set fragment shader uniform variables in a custom GPU render state. + * + * The data is copied and will be pushed using + * SDL_PushGPUFragmentUniformData() during draw call execution. + * + * \param state the state to modify. + * \param slot_index the fragment uniform slot to push data to. + * \param data client data to write. + * \param length the length of the data to write. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should be called on the thread that created the + * renderer. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetGPURenderStateFragmentUniforms(SDL_GPURenderState *state, Uint32 slot_index, const void *data, Uint32 length); + +/** + * Set custom GPU render state. + * + * This function sets custom GPU render state for subsequent draw calls. This + * allows using custom shaders with the GPU renderer. + * + * \param renderer the renderer to use. + * \param state the state to to use, or NULL to clear custom GPU render state. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should be called on the thread that created the + * renderer. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetGPURenderState(SDL_Renderer *renderer, SDL_GPURenderState *state); + +/** + * Destroy custom GPU render state. + * + * \param state the state to destroy. + * + * \threadsafety This function should be called on the thread that created the + * renderer. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_CreateGPURenderState + */ +extern SDL_DECLSPEC void SDLCALL SDL_DestroyGPURenderState(SDL_GPURenderState *state); + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/vendor/sdl3/include/SDL_revision.h b/vendor/sdl3/include/SDL_revision.h index 9fb9937d9..d4e850ece 100644 --- a/vendor/sdl3/include/SDL_revision.h +++ b/vendor/sdl3/include/SDL_revision.h @@ -1,22 +1,22 @@ /* - Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. */ /* WIKI CATEGORY: Version */ @@ -44,13 +44,16 @@ * clue in debugging forensics and not something the app will parse in any * way. * - * \since This macro is available since SDL 3.0.0. + * SDL_revision.h must be included in your program explicitly if you want + * access to the SDL_REVISION constant. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_REVISION "Some arbitrary string decided at SDL build time" #elif defined(SDL_VENDOR_INFO) -#define SDL_REVISION "release-3.2.16-0-gc9a6709bd (" SDL_VENDOR_INFO ")" +#define SDL_REVISION SDL_VENDOR_INFO #else -#define SDL_REVISION "release-3.2.16-0-gc9a6709bd" +#define SDL_REVISION "" #endif #endif /* SDL_revision_h_ */ diff --git a/vendor/sdl3/include/SDL_scancode.h b/vendor/sdl3/include/SDL_scancode.h index 9650a6cfe..6e9be47e6 100644 --- a/vendor/sdl3/include/SDL_scancode.h +++ b/vendor/sdl3/include/SDL_scancode.h @@ -208,7 +208,7 @@ typedef enum SDL_Scancode SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO * keyboards have over ANSI ones, - * located between left shift and Y. + * located between left shift and Z. * Produces GRAVE ACCENT and TILDE in a * US or UK Mac layout, REVERSE SOLIDUS * (backslash) and VERTICAL LINE in a diff --git a/vendor/sdl3/include/SDL_sensor.h b/vendor/sdl3/include/SDL_sensor.h index b220f0538..43366f135 100644 --- a/vendor/sdl3/include/SDL_sensor.h +++ b/vendor/sdl3/include/SDL_sensor.h @@ -138,7 +138,8 @@ typedef enum SDL_SensorType SDL_SENSOR_ACCEL_L, /**< Accelerometer for left Joy-Con controller and Wii nunchuk */ SDL_SENSOR_GYRO_L, /**< Gyroscope for left Joy-Con controller */ SDL_SENSOR_ACCEL_R, /**< Accelerometer for right Joy-Con controller */ - SDL_SENSOR_GYRO_R /**< Gyroscope for right Joy-Con controller */ + SDL_SENSOR_GYRO_R, /**< Gyroscope for right Joy-Con controller */ + SDL_SENSOR_COUNT } SDL_SensorType; diff --git a/vendor/sdl3/include/SDL_stdinc.h b/vendor/sdl3/include/SDL_stdinc.h index 7df253fec..f15ab727b 100644 --- a/vendor/sdl3/include/SDL_stdinc.h +++ b/vendor/sdl3/include/SDL_stdinc.h @@ -49,10 +49,37 @@ #include #include -#include #include #include +/* Most everything except Visual Studio 2008 and earlier has stdint.h now */ +#if defined(_MSC_VER) && (_MSC_VER < 1600) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _INTPTR_T_DEFINED +#ifdef _WIN64 +typedef __int64 intptr_t; +#else +typedef int intptr_t; +#endif +#endif +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif +#endif +#else +#include +#endif + #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ defined(SDL_INCLUDE_INTTYPES_H) #include @@ -492,7 +519,7 @@ typedef uint64_t Uint64; * and SDL_SECONDS_TO_NS(), and between Windows FILETIME values with * SDL_TimeToWindows() and SDL_TimeFromWindows(). * - * \since This macro is available since SDL 3.2.0. + * \since This datatype is available since SDL 3.2.0. * * \sa SDL_MAX_SINT64 * \sa SDL_MIN_SINT64 @@ -1164,7 +1191,7 @@ typedef struct SDL_alignment_test void *b; } SDL_alignment_test; SDL_COMPILE_TIME_ASSERT(struct_alignment, sizeof(SDL_alignment_test) == (2 * sizeof(void *))); -SDL_COMPILE_TIME_ASSERT(two_s_complement, (int)~(int)0 == (int)(-1)); +SDL_COMPILE_TIME_ASSERT(two_s_complement, SDL_static_cast(int, ~SDL_static_cast(int, 0)) == SDL_static_cast(int, -1)); #endif /* DOXYGEN_SHOULD_IGNORE_THIS */ /** \endcond */ @@ -2119,7 +2146,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_abs(int x); * * \param x the first value to compare. * \param y the second value to compare. - * \returns the lesser of `x` and `y`. + * \returns the greater of `x` and `y`. * * \threadsafety It is safe to call this macro from any thread. * @@ -2640,7 +2667,7 @@ extern SDL_DECLSPEC void * SDLCALL SDL_memset4(void *dst, Uint32 val, size_t dwo * \since This macro is available since SDL 3.2.0. * * \sa SDL_zero - * \sa SDL_zeroa + * \sa SDL_zerop */ #define SDL_zeroa(x) SDL_memset((x), 0, sizeof((x))) @@ -3426,7 +3453,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strnlen(const char *str, size_t bytes * Convert an integer into a string. * * This requires a radix to specified for string format. Specifying 10 - * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 * to 36. * * Note that this function will overflow a buffer if `str` is not large enough @@ -3454,7 +3481,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_itoa(int value, char *str, int radix); * Convert an unsigned integer into a string. * * This requires a radix to specified for string format. Specifying 10 - * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 * to 36. * * Note that this function will overflow a buffer if `str` is not large enough @@ -3482,7 +3509,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_uitoa(unsigned int value, char *str, int * Convert a long integer into a string. * * This requires a radix to specified for string format. Specifying 10 - * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 * to 36. * * Note that this function will overflow a buffer if `str` is not large enough @@ -3510,7 +3537,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_ltoa(long value, char *str, int radix); * Convert an unsigned long integer into a string. * * This requires a radix to specified for string format. Specifying 10 - * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 * to 36. * * Note that this function will overflow a buffer if `str` is not large enough @@ -3540,7 +3567,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *str, int * Convert a long long integer into a string. * * This requires a radix to specified for string format. Specifying 10 - * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 * to 36. * * Note that this function will overflow a buffer if `str` is not large enough @@ -3568,7 +3595,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_lltoa(long long value, char *str, int rad * Convert an unsigned long long integer into a string. * * This requires a radix to specified for string format. Specifying 10 - * produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2 + * produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 * to 36. * * Note that this function will overflow a buffer if `str` is not large enough @@ -3923,7 +3950,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); /** - * Searches a string for the first occurence of any character contained in a + * Searches a string for the first occurrence of any character contained in a * breakset, and returns a pointer from the string to that character. * * \param str The null-terminated string to be searched. Must not be NULL, and @@ -3931,7 +3958,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *st * \param breakset A null-terminated string containing the list of characters * to look for. Must not be NULL, and must not overlap with * `str`. - * \returns A pointer to the location, in str, of the first occurence of a + * \returns A pointer to the location, in str, of the first occurrence of a * character present in the breakset, or NULL if none is found. * * \threadsafety It is safe to call this function from any thread. @@ -4722,7 +4749,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_atan2f(float y, float x); /** * Compute the ceiling of `x`. * - * The ceiling of `x` is the smallest integer `y` such that `y > x`, i.e `x` + * The ceiling of `x` is the smallest integer `y` such that `y >= x`, i.e `x` * rounded up to the nearest integer. * * Domain: `-INF <= x <= INF` @@ -4750,7 +4777,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_ceil(double x); /** * Compute the ceiling of `x`. * - * The ceiling of `x` is the smallest integer `y` such that `y > x`, i.e `x` + * The ceiling of `x` is the smallest integer `y` such that `y >= x`, i.e `x` * rounded up to the nearest integer. * * Domain: `-INF <= x <= INF` @@ -4992,7 +5019,7 @@ extern SDL_DECLSPEC float SDLCALL SDL_fabsf(float x); /** * Compute the floor of `x`. * - * The floor of `x` is the largest integer `y` such that `y > x`, i.e `x` + * The floor of `x` is the largest integer `y` such that `y <= x`, i.e `x` * rounded down to the nearest integer. * * Domain: `-INF <= x <= INF` @@ -5020,7 +5047,7 @@ extern SDL_DECLSPEC double SDLCALL SDL_floor(double x); /** * Compute the floor of `x`. * - * The floor of `x` is the largest integer `y` such that `y > x`, i.e `x` + * The floor of `x` is the largest integer `y` such that `y <= x`, i.e `x` * rounded down to the nearest integer. * * Domain: `-INF <= x <= INF` @@ -5821,7 +5848,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); * This function converts text between encodings, reading from and writing to * a buffer. * - * It returns the number of succesful conversions on success. On error, + * It returns the number of successful conversions on success. On error, * SDL_ICONV_E2BIG is returned when the output buffer is too small, or * SDL_ICONV_EILSEQ is returned when an invalid input sequence is encountered, * or SDL_ICONV_EINVAL is returned when an incomplete input sequence is @@ -5921,7 +5948,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * * \since This macro is available since SDL 3.2.0. */ -#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs2(S) SDL_reinterpret_cast(Uint16 *, SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1)) /** * Convert a UTF-8 string to UCS-4. @@ -5935,7 +5962,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * * \since This macro is available since SDL 3.2.0. */ -#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs4(S) SDL_reinterpret_cast(Uint32 *, SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1)) /** * Convert a wchar_t string to UTF-8. @@ -5949,7 +5976,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * * \since This macro is available since SDL 3.2.0. */ -#define SDL_iconv_wchar_utf8(S) SDL_iconv_string("UTF-8", "WCHAR_T", (char *)S, (SDL_wcslen(S)+1)*sizeof(wchar_t)) +#define SDL_iconv_wchar_utf8(S) SDL_iconv_string("UTF-8", "WCHAR_T", SDL_reinterpret_cast(const char *, S), (SDL_wcslen(S)+1)*sizeof(wchar_t)) /* force builds using Clang's static analysis tools to use literal C runtime @@ -5974,6 +6001,10 @@ size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t size); size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size); #endif +#if !defined(HAVE_STRTOK_R) && !defined(strtok_r) +char *strtok_r(char *str, const char *delim, char **saveptr); +#endif + #ifndef _WIN32 /* strdup is not ANSI but POSIX, and its prototype might be hidden... */ /* not for windows: might conflict with string.h where strdup may have diff --git a/vendor/sdl3/include/SDL_storage.h b/vendor/sdl3/include/SDL_storage.h index 6837ebaac..1b20b34ad 100644 --- a/vendor/sdl3/include/SDL_storage.h +++ b/vendor/sdl3/include/SDL_storage.h @@ -334,6 +334,10 @@ typedef struct SDL_Storage SDL_Storage; /** * Opens up a read-only container for the application's filesystem. * + * By default, SDL_OpenTitleStorage uses the generic storage implementation. + * When the path override is not provided, the generic implementation will use + * the output of SDL_GetBasePath as the base path. + * * \param override a path to override the backend's default title root. * \param props a property list that may contain backend-specific information. * \returns a title storage container on success or NULL on failure; call diff --git a/vendor/sdl3/include/SDL_surface.h b/vendor/sdl3/include/SDL_surface.h index 15fce042f..717aeb89a 100644 --- a/vendor/sdl3/include/SDL_surface.h +++ b/vendor/sdl3/include/SDL_surface.h @@ -29,12 +29,16 @@ * provides a reasonable toolbox for transforming the data, including copying * between surfaces, filling rectangles in the image data, etc. * - * There is also a simple .bmp loader, SDL_LoadBMP(). SDL itself does not - * provide loaders for various other file formats, but there are several - * excellent external libraries that do, including its own satellite library, - * SDL_image: + * There is also a simple .bmp loader, SDL_LoadBMP(), and a simple .png + * loader, SDL_LoadPNG(). SDL itself does not provide loaders for other file + * formats, but there are several excellent external libraries that do, + * including its own satellite library, + * [SDL_image](https://wiki.libsdl.org/SDL3_image) + * . * - * https://github.com/libsdl-org/SDL_image + * In general these functions are thread-safe in that they can be called on + * different threads with different surfaces. You should not try to modify any + * surface from two threads simultaneously. */ #ifndef SDL_surface_h_ @@ -83,8 +87,9 @@ typedef Uint32 SDL_SurfaceFlags; typedef enum SDL_ScaleMode { SDL_SCALEMODE_INVALID = -1, - SDL_SCALEMODE_NEAREST, /**< nearest pixel sampling */ - SDL_SCALEMODE_LINEAR /**< linear filtering */ + SDL_SCALEMODE_NEAREST, /**< nearest pixel sampling */ + SDL_SCALEMODE_LINEAR, /**< linear filtering */ + SDL_SCALEMODE_PIXELART /**< nearest pixel sampling with improved scaling for pixel art, available since SDL 3.4.0 */ } SDL_ScaleMode; /** @@ -94,9 +99,10 @@ typedef enum SDL_ScaleMode */ typedef enum SDL_FlipMode { - SDL_FLIP_NONE, /**< Do not flip */ - SDL_FLIP_HORIZONTAL, /**< flip horizontally */ - SDL_FLIP_VERTICAL /**< flip vertically */ + SDL_FLIP_NONE, /**< Do not flip */ + SDL_FLIP_HORIZONTAL, /**< flip horizontally */ + SDL_FLIP_VERTICAL, /**< flip vertically */ + SDL_FLIP_HORIZONTAL_AND_VERTICAL = (SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL) /**< flip horizontally and vertically (not a diagonal flip) */ } SDL_FlipMode; #ifndef SDL_INTERNAL @@ -235,6 +241,12 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroySurface(SDL_Surface *surface); * left edge of the image, if this surface is being used as a cursor. * - `SDL_PROP_SURFACE_HOTSPOT_Y_NUMBER`: the hotspot pixel offset from the * top edge of the image, if this surface is being used as a cursor. + * - `SDL_PROP_SURFACE_ROTATION_FLOAT`: the number of degrees a surface's data + * is meant to be rotated clockwise to make the image right-side up. Default + * 0. This is used by the camera API, if a mobile device is oriented + * differently than what its camera provides (i.e. - the camera always + * provides portrait images but the phone is being held in landscape + * orientation). Since SDL 3.4.0. * * \param surface the SDL_Surface structure to query. * \returns a valid property ID on success or 0 on failure; call @@ -251,6 +263,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSurfaceProperties(SDL_Surfac #define SDL_PROP_SURFACE_TONEMAP_OPERATOR_STRING "SDL.surface.tonemap" #define SDL_PROP_SURFACE_HOTSPOT_X_NUMBER "SDL.surface.hotspot.x" #define SDL_PROP_SURFACE_HOTSPOT_Y_NUMBER "SDL.surface.hotspot.y" +#define SDL_PROP_SURFACE_ROTATION_FLOAT "SDL.surface.rotation" /** * Set the colorspace used by a surface. @@ -264,7 +277,8 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetSurfaceProperties(SDL_Surfac * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -283,7 +297,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorspace(SDL_Surface *surface, * \returns the colorspace used by the surface, or SDL_COLORSPACE_UNKNOWN if * the surface is NULL. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -313,7 +328,8 @@ extern SDL_DECLSPEC SDL_Colorspace SDLCALL SDL_GetSurfaceColorspace(SDL_Surface * the surface didn't have an index format); call SDL_GetError() for * more information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -324,6 +340,9 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_CreateSurfacePalette(SDL_Surface * /** * Set the palette used by a surface. * + * Setting the palette keeps an internal reference to the palette, which can + * be safely destroyed afterwards. + * * A single palette can be shared with many surfaces. * * \param surface the SDL_Surface structure to update. @@ -331,7 +350,8 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_CreateSurfacePalette(SDL_Surface * * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -372,7 +392,8 @@ extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_GetSurfacePalette(SDL_Surface *sur * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -415,7 +436,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasAlternateImages(SDL_Surface *surf * failure; call SDL_GetError() for more information. This should be * freed with SDL_free() when it is no longer needed. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -433,7 +455,8 @@ extern SDL_DECLSPEC SDL_Surface ** SDLCALL SDL_GetSurfaceImages(SDL_Surface *sur * * \param surface the SDL_Surface structure to update. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -459,9 +482,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_RemoveSurfaceAlternateImages(SDL_Surface *s * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. The locking referred to by - * this function is making the pixels available for direct - * access, not thread-safe locking. + * \threadsafety This function can be called on different threads with + * different surfaces. The locking referred to by this function + * is making the pixels available for direct access, not + * thread-safe locking. * * \since This function is available since SDL 3.2.0. * @@ -485,6 +509,46 @@ extern SDL_DECLSPEC bool SDLCALL SDL_LockSurface(SDL_Surface *surface); */ extern SDL_DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); +/** + * Load a BMP or PNG image from a seekable SDL data stream. + * + * The new surface should be freed with SDL_DestroySurface(). Not doing so + * will result in a memory leak. + * + * \param src the data stream for the surface. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. + * \returns a pointer to a new SDL_Surface structure or NULL on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_DestroySurface + * \sa SDL_LoadSurface + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadSurface_IO(SDL_IOStream *src, bool closeio); + +/** + * Load a BMP or PNG image from a file. + * + * The new surface should be freed with SDL_DestroySurface(). Not doing so + * will result in a memory leak. + * + * \param file the file to load. + * \returns a pointer to a new SDL_Surface structure or NULL on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_DestroySurface + * \sa SDL_LoadSurface_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadSurface(const char *file); + /** * Load a BMP image from a seekable SDL data stream. * @@ -543,7 +607,8 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP(const char *file); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -553,7 +618,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP(const char *file); extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); /** - * Save a surface to a file. + * Save a surface to a file in BMP format. * * Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the * BMP directly. Other RGB formats with 8-bit or higher get converted to a @@ -566,7 +631,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IOStre * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -575,6 +641,94 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP_IO(SDL_Surface *surface, SDL_IOStre */ extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP(SDL_Surface *surface, const char *file); +/** + * Load a PNG image from a seekable SDL data stream. + * + * This is intended as a convenience function for loading images from trusted + * sources. If you want to load arbitrary images you should use libpng or + * another image loading library designed with security in mind. + * + * The new surface should be freed with SDL_DestroySurface(). Not doing so + * will result in a memory leak. + * + * \param src the data stream for the surface. + * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even + * in the case of an error. + * \returns a pointer to a new SDL_Surface structure or NULL on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_DestroySurface + * \sa SDL_LoadPNG + * \sa SDL_SavePNG_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadPNG_IO(SDL_IOStream *src, bool closeio); + +/** + * Load a PNG image from a file. + * + * This is intended as a convenience function for loading images from trusted + * sources. If you want to load arbitrary images you should use libpng or + * another image loading library designed with security in mind. + * + * The new surface should be freed with SDL_DestroySurface(). Not doing so + * will result in a memory leak. + * + * \param file the PNG file to load. + * \returns a pointer to a new SDL_Surface structure or NULL on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_DestroySurface + * \sa SDL_LoadPNG_IO + * \sa SDL_SavePNG + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_LoadPNG(const char *file); + +/** + * Save a surface to a seekable SDL data stream in PNG format. + * + * \param surface the SDL_Surface structure containing the image to be saved. + * \param dst a data stream to save to. + * \param closeio if true, calls SDL_CloseIO() on `dst` before returning, even + * in the case of an error. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function can be called on different threads with + * different surfaces. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_LoadPNG_IO + * \sa SDL_SavePNG + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SavePNG_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); + +/** + * Save a surface to a file in PNG format. + * + * \param surface the SDL_Surface structure containing the image to be saved. + * \param file a file to save to. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function can be called on different threads with + * different surfaces. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_LoadPNG + * \sa SDL_SavePNG_IO + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SavePNG(SDL_Surface *surface, const char *file); + /** * Set the RLE acceleration hint for a surface. * @@ -586,7 +740,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SaveBMP(SDL_Surface *surface, const char *f * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -628,7 +783,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SurfaceHasRLE(SDL_Surface *surface); * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -693,7 +849,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceColorKey(SDL_Surface *surface, Ui * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -713,7 +870,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceColorMod(SDL_Surface *surface, Ui * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -735,7 +893,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceColorMod(SDL_Surface *surface, Ui * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -773,7 +932,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface *surface, Ui * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -812,7 +972,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface *surface, S * \returns true if the rectangle intersects the surface, otherwise false and * blits will be completely clipped. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -833,7 +994,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetSurfaceClipRect(SDL_Surface *surface, co * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -849,12 +1011,42 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetSurfaceClipRect(SDL_Surface *surface, SD * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_FlipMode flip); +/** + * Return a copy of a surface rotated clockwise a number of degrees. + * + * The angle of rotation can be negative for counter-clockwise rotation. + * + * When the rotation isn't a multiple of 90 degrees, the resulting surface is + * larger than the original, with the background filled in with the colorkey, + * if available, or RGBA 255/255/255/0 if not. + * + * If `surface` has the SDL_PROP_SURFACE_ROTATION_FLOAT property set on it, + * the new copy will have the adjusted value set: if the rotation property is + * 90 and `angle` was 30, the new surface will have a property value of 60 + * (that is: to be upright vs gravity, this surface needs to rotate 60 more + * degrees). However, note that further rotations on the new surface in this + * example will produce unexpected results, since the image will have resized + * and padded to accommodate the not-90 degree angle. + * + * \param surface the surface to rotate. + * \param angle the rotation angle, in degrees. + * \returns a rotated copy of the surface or NULL on failure; call + * SDL_GetError() for more information. + * + * \threadsafety This function can be called on different threads with + * different surfaces. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_RotateSurface(SDL_Surface *surface, float angle); + /** * Creates a new surface identical to the existing surface. * @@ -867,7 +1059,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FlipSurface(SDL_Surface *surface, SDL_FlipM * \returns a copy of the surface or NULL on failure; call SDL_GetError() for * more information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -888,7 +1081,8 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_DuplicateSurface(SDL_Surface *surf * \returns a copy of the surface or NULL on failure; call SDL_GetError() for * more information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -915,7 +1109,8 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ScaleSurface(SDL_Surface *surface, * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -943,7 +1138,8 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface(SDL_Surface *surfac * \returns the new SDL_Surface structure that is created or NULL on failure; * call SDL_GetError() for more information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -1046,7 +1242,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplyAlpha(int width, int height, SDL * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. */ @@ -1058,7 +1255,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *surfac * This function handles all surface formats, and ignores any clip rectangle. * * If the surface is YUV, the color is assumed to be in the sRGB colorspace, - * otherwise the color is assumed to be in the colorspace of the suface. + * otherwise the color is assumed to be in the colorspace of the surface. * * \param surface the SDL_Surface to clear. * \param r the red component of the pixel, normally in the range 0-1. @@ -1068,7 +1265,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_PremultiplySurfaceAlpha(SDL_Surface *surfac * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. */ @@ -1093,7 +1291,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ClearSurface(SDL_Surface *surface, float r, * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -1120,7 +1319,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_FillSurfaceRect(SDL_Surface *dst, const SDL * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -1411,7 +1611,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_BlitSurface9Grid(SDL_Surface *src, const SD * \param b the blue component of the pixel in the range 0-255. * \returns a pixel value. * - * \threadsafety It is safe to call this function from any thread. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -1444,7 +1645,8 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapSurfaceRGB(SDL_Surface *surface, Uint8 * \param a the alpha component of the pixel in the range 0-255. * \returns a pixel value. * - * \threadsafety It is safe to call this function from any thread. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. * @@ -1475,7 +1677,8 @@ extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapSurfaceRGBA(SDL_Surface *surface, Uint * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. */ @@ -1501,7 +1704,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixel(SDL_Surface *surface, int * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. */ @@ -1526,7 +1730,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ReadSurfacePixelFloat(SDL_Surface *surface, * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. */ @@ -1548,7 +1753,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WriteSurfacePixel(SDL_Surface *surface, int * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \threadsafety This function is not thread safe. + * \threadsafety This function can be called on different threads with + * different surfaces. * * \since This function is available since SDL 3.2.0. */ diff --git a/vendor/sdl3/include/SDL_system.h b/vendor/sdl3/include/SDL_system.h index 294089ff4..625db182e 100644 --- a/vendor/sdl3/include/SDL_system.h +++ b/vendor/sdl3/include/SDL_system.h @@ -247,14 +247,14 @@ typedef void (SDLCALL *SDL_iOSAnimationCallback)(void *userdata); * * For more information see: * - * https://wiki.libsdl.org/SDL3/README/ios + * https://wiki.libsdl.org/SDL3/README-ios * * Note that if you use the "main callbacks" instead of a standard C `main` * function, you don't have to use this API, as SDL will manage this for you. * * Details on main callbacks are here: * - * https://wiki.libsdl.org/SDL3/README/main-functions + * https://wiki.libsdl.org/SDL3/README-main-functions * * \param window the window for which the animation callback should be set. * \param interval the number of frames after which **callback** will be diff --git a/vendor/sdl3/include/SDL_test_common.h b/vendor/sdl3/include/SDL_test_common.h index 91efe8ac3..81cea7788 100644 --- a/vendor/sdl3/include/SDL_test_common.h +++ b/vendor/sdl3/include/SDL_test_common.h @@ -153,6 +153,10 @@ typedef struct SDL_Rect confine; bool hide_cursor; + /* Misc. */ + int quit_after_ms_interval; + SDL_TimerID quit_after_ms_timer; + /* Options info */ SDLTest_ArgumentParser common_argparser; SDLTest_ArgumentParser video_argparser; diff --git a/vendor/sdl3/include/SDL_test_compare.h b/vendor/sdl3/include/SDL_test_compare.h index 7ff247793..1903549c5 100644 --- a/vendor/sdl3/include/SDL_test_compare.h +++ b/vendor/sdl3/include/SDL_test_compare.h @@ -52,6 +52,7 @@ extern "C" { * \returns 0 if comparison succeeded, >0 (=number of pixels for which the comparison failed) if comparison failed, -1 if any of the surfaces were NULL, -2 if the surface sizes differ. */ int SDLCALL SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error); +int SDLCALL SDLTest_CompareSurfacesIgnoreTransparentPixels(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error); /** * Compares 2 memory blocks for equality diff --git a/vendor/sdl3/include/SDL_test_log.h b/vendor/sdl3/include/SDL_test_log.h index 0d48044a0..718baa5b7 100644 --- a/vendor/sdl3/include/SDL_test_log.h +++ b/vendor/sdl3/include/SDL_test_log.h @@ -42,6 +42,14 @@ extern "C" { #endif +/** + * Prints given message with a timestamp in the TEST category and given priority. + * + * \param priority Priority of the message + * \param fmt Message to be logged + */ +void SDLCALL SDLTest_LogMessage(SDL_LogPriority priority, SDL_PRINTF_FORMAT_STRING const char *fmt, ...); + /** * Prints given message with a timestamp in the TEST category and INFO priority. * diff --git a/vendor/sdl3/include/SDL_thread.h b/vendor/sdl3/include/SDL_thread.h index e981b5429..bde1bbcd7 100644 --- a/vendor/sdl3/include/SDL_thread.h +++ b/vendor/sdl3/include/SDL_thread.h @@ -37,7 +37,8 @@ * will report failure without doing anything. * * If you're going to work with threads, you almost certainly need to have a - * good understanding of [CategoryMutex](CategoryMutex) as well. + * good understanding of thread safety measures: locking and synchronization + * mechanisms are handled by the functions in SDL_mutex.h. */ #include diff --git a/vendor/sdl3/include/SDL_timer.h b/vendor/sdl3/include/SDL_timer.h index cf94881d5..490d13562 100644 --- a/vendor/sdl3/include/SDL_timer.h +++ b/vendor/sdl3/include/SDL_timer.h @@ -34,7 +34,7 @@ * This category covers measuring time elapsed (SDL_GetTicks(), * SDL_GetPerformanceCounter()), putting a thread to sleep for a certain * amount of time (SDL_Delay(), SDL_DelayNS(), SDL_DelayPrecise()), and firing - * a callback function after a certain amount of time has elasped + * a callback function after a certain amount of time has elapsed * (SDL_AddTimer(), etc). * * There are also useful macros to convert between time units, like @@ -185,14 +185,18 @@ extern "C" { #define SDL_NS_TO_US(NS) ((NS) / SDL_NS_PER_US) /** - * Get the number of milliseconds since SDL library initialization. + * Get the number of milliseconds that have elapsed since the SDL library + * initialization. * - * \returns an unsigned 64-bit value representing the number of milliseconds - * since the SDL library initialized. + * \returns an unsigned 64‑bit integer that represents the number of + * milliseconds that have elapsed since the SDL library was + * initialized (typically via a call to SDL_Init). * * \threadsafety It is safe to call this function from any thread. * * \since This function is available since SDL 3.2.0. + * + * \sa SDL_GetTicksNS */ extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetTicks(void); diff --git a/vendor/sdl3/include/SDL_version.h b/vendor/sdl3/include/SDL_version.h index 435b3f95f..3aa1605b6 100644 --- a/vendor/sdl3/include/SDL_version.h +++ b/vendor/sdl3/include/SDL_version.h @@ -53,7 +53,7 @@ extern "C" { * * \since This macro is available since SDL 3.2.0. */ -#define SDL_MINOR_VERSION 2 +#define SDL_MINOR_VERSION 4 /** * The current micro (or patchlevel) version of the SDL headers. @@ -62,7 +62,7 @@ extern "C" { * * \since This macro is available since SDL 3.2.0. */ -#define SDL_MICRO_VERSION 16 +#define SDL_MICRO_VERSION 0 /** * This macro turns the version numbers into a numeric value. @@ -148,13 +148,14 @@ extern "C" { extern SDL_DECLSPEC int SDLCALL SDL_GetVersion(void); /** - * Get the code revision of SDL that is linked against your program. + * Get the code revision of the SDL library that is linked against your + * program. * - * This value is the revision of the code you are linked with and may be + * This value is the revision of the code you are linking against and may be * different from the code you are compiling with, which is found in the - * constant SDL_REVISION. + * constant SDL_REVISION if you explicitly include SDL_revision.h * - * The revision is arbitrary string (a hash value) uniquely identifying the + * The revision is an arbitrary string (a hash value) uniquely identifying the * exact revision of the SDL library in use, and is only useful in comparing * against other revisions. It is NOT an incrementing number. * diff --git a/vendor/sdl3/include/SDL_video.h b/vendor/sdl3/include/SDL_video.h index 877b9adde..31dac5f7a 100644 --- a/vendor/sdl3/include/SDL_video.h +++ b/vendor/sdl3/include/SDL_video.h @@ -97,6 +97,8 @@ typedef Uint32 SDL_WindowID; * uninitialized will either return the user provided value, if one was set * prior to initialization, or NULL. See docs/README-wayland.md for more * information. + * + * \since This macro is available since SDL 3.2.0. */ #define SDL_PROP_GLOBAL_VIDEO_WAYLAND_WL_DISPLAY_POINTER "SDL.video.wayland.wl_display" @@ -180,6 +182,12 @@ typedef struct SDL_Window SDL_Window; * changed on existing windows by the app, and some of it might be altered by * the user or system outside of the app's control. * + * When creating windows with `SDL_WINDOW_RESIZABLE`, SDL will constrain + * resizable windows to the dimensions recommended by the compositor to fit it + * within the usable desktop space, although some compositors will do this + * automatically without intervention as well. Use `SDL_SetWindowResizable` + * after creation instead if you wish to create a window with a specific size. + * * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GetWindowFlags @@ -207,6 +215,7 @@ typedef Uint64 SDL_WindowFlags; #define SDL_WINDOW_TOOLTIP SDL_UINT64_C(0x0000000000040000) /**< window should be treated as a tooltip and does not get mouse or keyboard focus, requires a parent window */ #define SDL_WINDOW_POPUP_MENU SDL_UINT64_C(0x0000000000080000) /**< window should be treated as a popup menu, requires a parent window */ #define SDL_WINDOW_KEYBOARD_GRABBED SDL_UINT64_C(0x0000000000100000) /**< window has grabbed keyboard input */ +#define SDL_WINDOW_FILL_DOCUMENT SDL_UINT64_C(0x0000000000200000) /**< window is in fill-document mode (Emscripten only), since SDL 3.4.0 */ #define SDL_WINDOW_VULKAN SDL_UINT64_C(0x0000000010000000) /**< window usable for Vulkan surface */ #define SDL_WINDOW_METAL SDL_UINT64_C(0x0000000020000000) /**< window usable for Metal view */ #define SDL_WINDOW_TRANSPARENT SDL_UINT64_C(0x0000000040000000) /**< window with transparent buffer */ @@ -220,6 +229,8 @@ typedef Uint64 SDL_WindowFlags; * SDL_WINDOWPOS_UNDEFINED or SDL_WINDOWPOS_UNDEFINED_DISPLAY. * * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SetWindowPosition */ #define SDL_WINDOWPOS_UNDEFINED_MASK 0x1FFF0000u @@ -232,6 +243,8 @@ typedef Uint64 SDL_WindowFlags; * \param X the SDL_DisplayID of the display to use. * * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SetWindowPosition */ #define SDL_WINDOWPOS_UNDEFINED_DISPLAY(X) (SDL_WINDOWPOS_UNDEFINED_MASK|(X)) @@ -241,6 +254,8 @@ typedef Uint64 SDL_WindowFlags; * This always uses the primary display. * * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SetWindowPosition */ #define SDL_WINDOWPOS_UNDEFINED SDL_WINDOWPOS_UNDEFINED_DISPLAY(0) @@ -250,6 +265,8 @@ typedef Uint64 SDL_WindowFlags; * \param X the window position value. * * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SetWindowPosition */ #define SDL_WINDOWPOS_ISUNDEFINED(X) (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK) @@ -260,6 +277,8 @@ typedef Uint64 SDL_WindowFlags; * SDL_WINDOWPOS_CENTERED or SDL_WINDOWPOS_CENTERED_DISPLAY. * * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SetWindowPosition */ #define SDL_WINDOWPOS_CENTERED_MASK 0x2FFF0000u @@ -272,6 +291,8 @@ typedef Uint64 SDL_WindowFlags; * \param X the SDL_DisplayID of the display to use. * * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SetWindowPosition */ #define SDL_WINDOWPOS_CENTERED_DISPLAY(X) (SDL_WINDOWPOS_CENTERED_MASK|(X)) @@ -281,6 +302,8 @@ typedef Uint64 SDL_WindowFlags; * This always uses the primary display. * * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_SetWindowPosition */ #define SDL_WINDOWPOS_CENTERED SDL_WINDOWPOS_CENTERED_DISPLAY(0) @@ -290,6 +313,8 @@ typedef Uint64 SDL_WindowFlags; * \param X the window position value. * * \since This macro is available since SDL 3.2.0. + * + * \sa SDL_GetWindowPosition */ #define SDL_WINDOWPOS_ISCENTERED(X) \ (((X)&0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK) @@ -307,12 +332,30 @@ typedef enum SDL_FlashOperation SDL_FLASH_UNTIL_FOCUSED /**< Flash the window until it gets focus */ } SDL_FlashOperation; +/** + * Window progress state + * + * \since This enum is available since SDL 3.2.8. + */ +typedef enum SDL_ProgressState +{ + SDL_PROGRESS_STATE_INVALID = -1, /**< An invalid progress state indicating an error; check SDL_GetError() */ + SDL_PROGRESS_STATE_NONE, /**< No progress bar is shown */ + SDL_PROGRESS_STATE_INDETERMINATE, /**< The progress bar is shown in a indeterminate state */ + SDL_PROGRESS_STATE_NORMAL, /**< The progress bar is shown in a normal state */ + SDL_PROGRESS_STATE_PAUSED, /**< The progress bar is shown in a paused state */ + SDL_PROGRESS_STATE_ERROR /**< The progress bar is shown in a state indicating the application had an error */ +} SDL_ProgressState; + /** * An opaque handle to an OpenGL context. * * \since This datatype is available since SDL 3.2.0. * * \sa SDL_GL_CreateContext + * \sa SDL_GL_SetAttribute + * \sa SDL_GL_MakeCurrent + * \sa SDL_GL_DestroyContext */ typedef struct SDL_GLContextState *SDL_GLContext; @@ -448,7 +491,7 @@ typedef enum SDL_GLAttr SDL_GL_CONTEXT_FLAGS, /**< some combination of 0 or more of elements of the SDL_GLContextFlag enumeration; defaults to 0. */ SDL_GL_CONTEXT_PROFILE_MASK, /**< type of GL context (Core, Compatibility, ES). See SDL_GLProfile; default value depends on platform. */ SDL_GL_SHARE_WITH_CURRENT_CONTEXT, /**< OpenGL context sharing; defaults to 0. */ - SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, /**< requests sRGB capable visual; defaults to 0. */ + SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, /**< requests sRGB-capable visual if 1. Defaults to -1 ("don't care"). This is a request; GL drivers might not comply! */ SDL_GL_CONTEXT_RELEASE_BEHAVIOR, /**< sets context the release behavior. See SDL_GLContextReleaseFlag; defaults to FLUSH. */ SDL_GL_CONTEXT_RESET_NOTIFICATION, /**< set context reset notification. See SDL_GLContextResetNotification; defaults to NO_NOTIFICATION. */ SDL_GL_CONTEXT_NO_ERROR, @@ -530,7 +573,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void); * to be proper names. * * \param index the index of a video driver. - * \returns the name of the video driver with the given **index**. + * \returns the name of the video driver with the given **index**, or NULL if + * index is out of bounds. * * \threadsafety This function should only be called on the main thread. * @@ -617,6 +661,16 @@ extern SDL_DECLSPEC SDL_DisplayID SDLCALL SDL_GetPrimaryDisplay(void); * responsible for any coordinate transformations needed to conform to the * requested display orientation. * + * On Wayland: + * + * - `SDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER`: the wl_output associated + * with the display + * + * On Windows: + * + * - `SDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER`: the monitor handle + * (HMONITOR) associated with the display + * * \param displayID the instance ID of the display to query. * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. @@ -629,6 +683,8 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetDisplayProperties(SDL_Displa #define SDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN "SDL.display.HDR_enabled" #define SDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER "SDL.display.KMSDRM.panel_orientation" +#define SDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER "SDL.display.wayland.wl_output" +#define SDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER "SDL.display.windows.hmonitor" /** * Get the name of a display in UTF-8 encoding. @@ -1049,8 +1105,6 @@ extern SDL_DECLSPEC SDL_Window ** SDLCALL SDL_GetWindows(int *count); * * - `SDL_WINDOW_FULLSCREEN`: fullscreen window at desktop resolution * - `SDL_WINDOW_OPENGL`: window usable with an OpenGL context - * - `SDL_WINDOW_OCCLUDED`: window partially or completely obscured by another - * window * - `SDL_WINDOW_HIDDEN`: window is not visible * - `SDL_WINDOW_BORDERLESS`: no window decoration * - `SDL_WINDOW_RESIZABLE`: window can be resized @@ -1078,7 +1132,8 @@ extern SDL_DECLSPEC SDL_Window ** SDLCALL SDL_GetWindows(int *count); * - `SDL_WINDOW_TRANSPARENT`: window with transparent buffer * - `SDL_WINDOW_NOT_FOCUSABLE`: window should not be focusable * - * The SDL_Window is implicitly shown if SDL_WINDOW_HIDDEN is not set. + * The SDL_Window will be shown if SDL_WINDOW_HIDDEN is not set. If hidden at + * creation time, SDL_ShowWindow() can be used to show it later. * * On Apple's macOS, you **must** set the NSHighResolutionCapable Info.plist * property to YES, otherwise you will not receive a High-DPI OpenGL canvas. @@ -1167,6 +1222,16 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, int * Popup windows implicitly do not have a border/decorations and do not appear * on the taskbar/dock or in lists of windows such as alt-tab menus. * + * By default, popup window positions will automatically be constrained to + * keep the entire window within display bounds. This can be overridden with + * the `SDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN` property. + * + * By default, popup menus will automatically grab keyboard focus from the + * parent when shown. This behavior can be overridden by setting the + * `SDL_WINDOW_NOT_FOCUSABLE` flag, setting the + * `SDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN` property to false, or toggling + * it after creation via the `SDL_SetWindowFocusable()` function. + * * If a parent window is hidden or destroyed, any child popup windows will be * recursively hidden or destroyed as well. Child popup windows not explicitly * hidden will be restored when the parent is shown. @@ -1207,6 +1272,10 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * be always on top * - `SDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN`: true if the window has no * window decoration + * - `SDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN`: true if the "tooltip" + * and "menu" window types should be automatically constrained to be + * entirely within display bounds (default), false if no constraints on the + * position are desired. * - `SDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN`: true if the * window will be used with an externally managed graphics context. * - `SDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN`: true if the window should @@ -1263,12 +1332,18 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * - `SDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER`: the `(__unsafe_unretained)` * NSView associated with the window, defaults to `[window contentView]` * + * These are additional supported properties on iOS, tvOS, and visionOS: + * + * - `SDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER`: the `(__unsafe_unretained)` + * UIWindowScene associated with the window, defaults to the active window + * scene. + * * These are additional supported properties on Wayland: * * - `SDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN` - true if * the application wants to use the Wayland surface for a custom role and * does not want it attached to an XDG toplevel window. See - * [README/wayland](README/wayland) for more information on using custom + * [README-wayland](README-wayland) for more information on using custom * surfaces. * - `SDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN` - true if the * application wants an associated `wl_egl_window` object to be created and @@ -1276,7 +1351,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * property or `SDL_WINDOW_OPENGL` flag set. * - `SDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER` - the wl_surface * associated with the window, if you want to wrap an existing window. See - * [README/wayland](README/wayland) for more information. + * [README-wayland](README-wayland) for more information. * * These are additional supported properties on Windows: * @@ -1292,8 +1367,22 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreatePopupWindow(SDL_Window *paren * * The window is implicitly shown if the "hidden" property is not set. * - * Windows with the "tooltip" and "menu" properties are popup windows and have - * the behaviors and guidelines outlined in SDL_CreatePopupWindow(). + * These are additional supported properties with Emscripten: + * + * - `SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING`: the id given to the + * canvas element. This should start with a '#' sign + * - `SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING`: override the + * binding element for keyboard inputs for this canvas. The variable can be + * one of: + * - "#window": the javascript window object (default) + * - "#document": the javascript document object + * - "#screen": the javascript window.screen object + * - "#canvas": the WebGL canvas element + * - "#none": Don't bind anything at all + * - any other string without a leading # sign applies to the element on the + * page with that ID. Windows with the "tooltip" and "menu" properties are + * popup windows and have the behaviors and guidelines outlined in + * SDL_CreatePopupWindow(). * * If this window is being created to be used with an SDL_Renderer, you should * not add a graphics API specific property @@ -1321,6 +1410,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindowWithProperties(SDL_Prop #define SDL_PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN "SDL.window.create.always_on_top" #define SDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN "SDL.window.create.borderless" +#define SDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN "SDL.window.create.constrain_popup" #define SDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN "SDL.window.create.focusable" #define SDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN "SDL.window.create.external_graphics_context" #define SDL_PROP_WINDOW_CREATE_FLAGS_NUMBER "SDL.window.create.flags" @@ -1347,12 +1437,15 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_CreateWindowWithProperties(SDL_Prop #define SDL_PROP_WINDOW_CREATE_Y_NUMBER "SDL.window.create.y" #define SDL_PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER "SDL.window.create.cocoa.window" #define SDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER "SDL.window.create.cocoa.view" +#define SDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER "SDL.window.create.uikit.windowscene" #define SDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN "SDL.window.create.wayland.surface_role_custom" #define SDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN "SDL.window.create.wayland.create_egl_window" #define SDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER "SDL.window.create.wayland.wl_surface" #define SDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER "SDL.window.create.win32.hwnd" #define SDL_PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER "SDL.window.create.win32.pixel_format_hwnd" #define SDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER "SDL.window.create.x11.window" +#define SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING "SDL.window.create.emscripten.canvas_id" +#define SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING "SDL.window.create.emscripten.keyboard_element" /** * Get the numeric ID of a window. @@ -1460,12 +1553,12 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * - `SDL_PROP_WINDOW_COCOA_WINDOW_POINTER`: the `(__unsafe_unretained)` * NSWindow associated with the window * - `SDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER`: the NSInteger tag - * assocated with metal views on the window + * associated with metal views on the window * * On OpenVR: * - * - `SDL_PROP_WINDOW_OPENVR_OVERLAY_ID`: the OpenVR Overlay Handle ID for the - * associated overlay window. + * - `SDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER`: the OpenVR Overlay Handle ID + * for the associated overlay window. * * On Vivante: * @@ -1517,6 +1610,13 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window) * - `SDL_PROP_WINDOW_X11_WINDOW_NUMBER`: the X11 Window associated with the * window * + * On Emscripten: + * + * - `SDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING`: the id the canvas element + * will have + * - `SDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING`: the keyboard + * element that associates keyboard events to this window + * * \param window the window to query. * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. @@ -1543,7 +1643,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window #define SDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER "SDL.window.kmsdrm.gbm_dev" #define SDL_PROP_WINDOW_COCOA_WINDOW_POINTER "SDL.window.cocoa.window" #define SDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER "SDL.window.cocoa.metal_view_tag" -#define SDL_PROP_WINDOW_OPENVR_OVERLAY_ID "SDL.window.openvr.overlay_id" +#define SDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER "SDL.window.openvr.overlay_id" #define SDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER "SDL.window.vivante.display" #define SDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER "SDL.window.vivante.window" #define SDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER "SDL.window.vivante.surface" @@ -1562,6 +1662,8 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window #define SDL_PROP_WINDOW_X11_DISPLAY_POINTER "SDL.window.x11.display" #define SDL_PROP_WINDOW_X11_SCREEN_NUMBER "SDL.window.x11.screen" #define SDL_PROP_WINDOW_X11_WINDOW_NUMBER "SDL.window.x11.window" +#define SDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING "SDL.window.emscripten.canvas_id" +#define SDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING "SDL.window.emscripten.keyboard_element" /** * Get the window flags. @@ -1579,6 +1681,7 @@ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetWindowProperties(SDL_Window * \sa SDL_MinimizeWindow * \sa SDL_SetWindowFullscreen * \sa SDL_SetWindowMouseGrab + * \sa SDL_SetWindowFillDocument * \sa SDL_ShowWindow */ extern SDL_DECLSPEC SDL_WindowFlags SDLCALL SDL_GetWindowFlags(SDL_Window *window); @@ -1619,15 +1722,16 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetWindowTitle(SDL_Window *window); /** * Set the icon for a window. * - * If this function is passed a surface with alternate representations, the - * surface will be interpreted as the content to be used for 100% display - * scale, and the alternate representations will be used for high DPI - * situations. For example, if the original surface is 32x32, then on a 2x - * macOS display or 200% display scale on Windows, a 64x64 version of the - * image will be used, if available. If a matching version of the image isn't - * available, the closest larger size image will be downscaled to the - * appropriate size and be used instead, if available. Otherwise, the closest - * smaller image will be upscaled and be used instead. + * If this function is passed a surface with alternate representations added + * using SDL_AddSurfaceAlternateImage(), the surface will be interpreted as + * the content to be used for 100% display scale, and the alternate + * representations will be used for high DPI situations. For example, if the + * original surface is 32x32, then on a 2x macOS display or 200% display scale + * on Windows, a 64x64 version of the image will be used, if available. If a + * matching version of the image isn't available, the closest larger size + * image will be downscaled to the appropriate size and be used instead, if + * available. Otherwise, the closest smaller image will be upscaled and be + * used instead. * * \param window the window to change. * \param icon an SDL_Surface structure containing the icon for the window. @@ -1637,6 +1741,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetWindowTitle(SDL_Window *window); * \threadsafety This function should only be called on the main thread. * * \since This function is available since SDL 3.2.0. + * + * \sa SDL_AddSurfaceAlternateImage */ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowIcon(SDL_Window *window, SDL_Surface *icon); @@ -1763,6 +1869,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowSize(SDL_Window *window, int w, in * \sa SDL_GetRenderOutputSize * \sa SDL_GetWindowSizeInPixels * \sa SDL_SetWindowSize + * \sa SDL_EVENT_WINDOW_RESIZED */ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSize(SDL_Window *window, int *w, int *h); @@ -1774,7 +1881,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSize(SDL_Window *window, int *w, i * notches, TV overscan, etc. This function provides the area of the window * which is safe to have interactable content. You should continue rendering * into the rest of the window, but it should not contain visually important - * or interactible content. + * or interactable content. * * \param window the window to query. * \param rect a pointer filled in with the client area that is safe for @@ -1830,7 +1937,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowSafeArea(SDL_Window *window, SDL_R extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowAspectRatio(SDL_Window *window, float min_aspect, float max_aspect); /** - * Get the size of a window's client area. + * Get the aspect ratio of a window's client area. * * \param window the window to query the width and height from. * \param min_aspect a pointer filled in with the minimum aspect ratio of the @@ -2044,6 +2151,37 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowResizable(SDL_Window *window, bool */ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowAlwaysOnTop(SDL_Window *window, bool on_top); +/** + * Set the window to fill the current document space (Emscripten only). + * + * This will add or remove the window's `SDL_WINDOW_FILL_DOCUMENT` flag. + * + * Currently this flag only applies to the Emscripten target. + * + * When enabled, the canvas element fills the entire document. Resize events + * will be generated as the browser window is resized, as that will adjust the + * canvas size as well. The canvas will cover anything else on the page, + * including any controls provided by Emscripten in its generated HTML file + * (in fact, any elements on the page that aren't the canvas will be moved + * into a hidden `div` element). + * + * Often times this is desirable for a browser-based game, but it means + * several things that we expect of an SDL window on other platforms might not + * work as expected, such as minimum window sizes and aspect ratios. + * + * \param window the window of which to change the fill-document state. + * \param fill true to set the window to fill the document, false to disable. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + * + * \sa SDL_GetWindowFlags + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowFillDocument(SDL_Window *window, bool fill); + /** * Show a window. * @@ -2457,7 +2595,6 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowKeyboardGrab(SDL_Window *window, b * * \sa SDL_GetWindowMouseRect * \sa SDL_SetWindowMouseRect - * \sa SDL_SetWindowMouseGrab * \sa SDL_SetWindowKeyboardGrab */ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowMouseGrab(SDL_Window *window, bool grabbed); @@ -2802,6 +2939,62 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowShape(SDL_Window *window, SDL_Surf */ extern SDL_DECLSPEC bool SDLCALL SDL_FlashWindow(SDL_Window *window, SDL_FlashOperation operation); +/** + * Sets the state of the progress bar for the given window’s taskbar icon. + * + * \param window the window whose progress state is to be modified. + * \param state the progress state. `SDL_PROGRESS_STATE_NONE` stops displaying + * the progress bar. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowProgressState(SDL_Window *window, SDL_ProgressState state); + +/** + * Get the state of the progress bar for the given window’s taskbar icon. + * + * \param window the window to get the current progress state from. + * \returns the progress state, or `SDL_PROGRESS_STATE_INVALID` on failure; + * call SDL_GetError() for more information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC SDL_ProgressState SDLCALL SDL_GetWindowProgressState(SDL_Window *window); + +/** + * Sets the value of the progress bar for the given window’s taskbar icon. + * + * \param window the window whose progress value is to be modified. + * \param value the progress value in the range of [0.0f - 1.0f]. If the value + * is outside the valid range, it gets clamped. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowProgressValue(SDL_Window *window, float value); + +/** + * Get the value of the progress bar for the given window’s taskbar icon. + * + * \param window the window to get the current progress value from. + * \returns the progress value in the range of [0.0f - 1.0f], or -1.0f on + * failure; call SDL_GetError() for more information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL 3.4.0. + */ +extern SDL_DECLSPEC float SDLCALL SDL_GetWindowProgressValue(SDL_Window *window); + /** * Destroy a window. * @@ -3037,8 +3230,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GL_ResetAttributes(void); * SDL_GL_GetAttribute() to check the values after creating the OpenGL * context, since the values obtained can differ from the requested ones. * - * \param attr an SDL_GLAttr enum value specifying the OpenGL attribute to - * set. + * \param attr an enum value specifying the OpenGL attribute to set. * \param value the desired value for the attribute. * \returns true on success or false on failure; call SDL_GetError() for more * information. @@ -3047,6 +3239,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_GL_ResetAttributes(void); * * \since This function is available since SDL 3.2.0. * + * \sa SDL_GL_CreateContext * \sa SDL_GL_GetAttribute * \sa SDL_GL_ResetAttributes */ @@ -3073,6 +3266,12 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GL_GetAttribute(SDL_GLAttr attr, int *value /** * Create an OpenGL context for an OpenGL window, and make it current. * + * The OpenGL context will be created with the current states set through + * SDL_GL_SetAttribute(). + * + * The SDL_Window specified must have been created with the SDL_WINDOW_OPENGL + * flag, or context creation will fail. + * * Windows users new to OpenGL should note that, for historical reasons, GL * functions added after OpenGL version 1.1 are not available by default. * Those functions must be loaded at run-time, either with an OpenGL diff --git a/vendor/sdl3/include/SDL_vulkan.h b/vendor/sdl3/include/SDL_vulkan.h index 710afbe63..e91e14842 100644 --- a/vendor/sdl3/include/SDL_vulkan.h +++ b/vendor/sdl3/include/SDL_vulkan.h @@ -51,14 +51,14 @@ extern "C" { #endif -/* Avoid including vulkan.h, don't define VkInstance if it's already included */ -#ifdef VULKAN_H_ +/* Avoid including vulkan_core.h, don't define VkInstance if it's already included */ +#ifdef VULKAN_CORE_H_ #define NO_SDL_VULKAN_TYPEDEFS #endif #ifndef NO_SDL_VULKAN_TYPEDEFS #define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; -#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) || (defined(__riscv) && __riscv_xlen == 64) #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object; #else #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object; diff --git a/vendor/sdl3/sdl3_atomic.odin b/vendor/sdl3/sdl3_atomic.odin index 178a44a5b..fefe8c861 100644 --- a/vendor/sdl3/sdl3_atomic.odin +++ b/vendor/sdl3/sdl3_atomic.odin @@ -36,7 +36,8 @@ foreign lib { CompareAndSwapAtomicU32 :: proc(a: ^AtomicU32, oldval, newval: Uint32) -> bool --- SetAtomicU32 :: proc(a: ^AtomicU32, v: Uint32) -> Uint32 --- GetAtomicU32 :: proc(a: ^AtomicU32) -> Uint32 --- + AddAtomicU32 :: proc(a: ^AtomicU32) -> Uint32 --- CompareAndSwapAtomicPointer :: proc(a: ^rawptr, oldval, newval: rawptr) -> bool --- SetAtomicPointer :: proc(a: ^rawptr, v: rawptr) -> rawptr --- GetAtomicPointer :: proc(a: ^rawptr) -> rawptr --- -} \ No newline at end of file +} diff --git a/vendor/sdl3/sdl3_audio.odin b/vendor/sdl3/sdl3_audio.odin index 045f4780e..277aefde7 100644 --- a/vendor/sdl3/sdl3_audio.odin +++ b/vendor/sdl3/sdl3_audio.odin @@ -67,8 +67,11 @@ AUDIO_FRAMESIZE :: proc "c" (x: AudioSpec) -> c.int { AudioStream :: struct {} -AudioStreamCallback :: #type proc "c" (userdata: rawptr, stream: ^AudioStream, additional_amount, total_amount: c.int) -AudioPostmixCallback :: #type proc "c" (userdata: rawptr, spec: ^AudioSpec, buffer: [^]f32, buflen: c.int) +AudioStreamCallback :: #type proc "c" (userdata: rawptr, stream: ^AudioStream, additional_amount, total_amount: c.int) +AudioStreamDataCompleteCallback :: #type proc "c" (userdata: rawptr, buf: rawptr, buflen: c.int) +AudioPostmixCallback :: #type proc "c" (userdata: rawptr, spec: ^AudioSpec, buffer: [^]f32, buflen: c.int) + +AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN :: "SDL.audiostream.auto_cleanup" @(default_calling_convention="c", link_prefix="SDL_") foreign lib { @@ -107,6 +110,8 @@ foreign lib { SetAudioStreamInputChannelMap :: proc(stream: ^AudioStream, chmap: [^]c.int, count: c.int) -> bool --- SetAudioStreamOutputChannelMap :: proc(stream: ^AudioStream, chmap: [^]c.int, count: c.int) -> bool --- PutAudioStreamData :: proc(stream: ^AudioStream, buf: rawptr, len: c.int) -> bool --- + PutAudioStreamDataNoCopy :: proc(stream: ^AudioStream, buf: rawptr, len: c.int, callback: AudioStreamDataCompleteCallback, userdata: rawptr) -> bool --- + PutAudioStreamPlanarData :: proc(stream: ^AudioStream, channel_buffers: [^]rawptr, num_channels, num_samples: c.int) -> bool --- GetAudioStreamData :: proc(stream: ^AudioStream, buf: rawptr, len: c.int) -> c.int --- GetAudioStreamAvailable :: proc(stream: ^AudioStream) -> c.int --- GetAudioStreamQueued :: proc(stream: ^AudioStream) -> c.int --- @@ -128,4 +133,4 @@ foreign lib { ConvertAudioSamples :: proc(src_spec: ^AudioSpec, src_data: [^]Uint8, src_len: c.int, dst_spec: ^AudioSpec, dst_data: ^[^]Uint8, dst_len: ^c.int) -> bool --- GetAudioFormatName :: proc(format: AudioFormat) -> cstring --- GetSilenceValueForFormat :: proc(format: AudioFormat) -> c.int --- -} \ No newline at end of file +} diff --git a/vendor/sdl3/sdl3_camera.odin b/vendor/sdl3/sdl3_camera.odin index 7d46bd2bd..a6a895245 100644 --- a/vendor/sdl3/sdl3_camera.odin +++ b/vendor/sdl3/sdl3_camera.odin @@ -21,6 +21,12 @@ CameraPosition :: enum c.int { BACK_FACING, } +CameraPermissionState :: enum c.int { + DENIED = -1, + PENDING, + APPROVED, +} + @(default_calling_convention="c", link_prefix="SDL_") foreign lib { GetNumCameraDrivers :: proc() -> c.int --- @@ -31,11 +37,11 @@ foreign lib { GetCameraName :: proc(instance_id: CameraID) -> cstring --- GetCameraPosition :: proc(instance_id: CameraID) -> CameraPosition --- OpenCamera :: proc(instance_id: CameraID, spec: ^CameraSpec) -> ^Camera --- - GetCameraPermissionState :: proc(camera: ^Camera) -> c.int --- + GetCameraPermissionState :: proc(camera: ^Camera) -> CameraPermissionState --- GetCameraID :: proc(camera: ^Camera) -> CameraID --- GetCameraProperties :: proc(camera: ^Camera) -> PropertiesID --- GetCameraFormat :: proc(camera: ^Camera, spec: ^CameraSpec) -> bool --- AcquireCameraFrame :: proc(camera: ^Camera, timestampNS: ^Uint64) -> ^Surface --- ReleaseCameraFrame :: proc(camera: ^Camera, frame: ^Surface) --- CloseCamera :: proc(camera: ^Camera) --- -} \ No newline at end of file +} diff --git a/vendor/sdl3/sdl3_cpuinfo.odin b/vendor/sdl3/sdl3_cpuinfo.odin index 959286c71..a97a5a324 100644 --- a/vendor/sdl3/sdl3_cpuinfo.odin +++ b/vendor/sdl3/sdl3_cpuinfo.odin @@ -24,4 +24,5 @@ foreign lib { HasLASX :: proc() -> bool --- GetSystemRAM :: proc() -> c.int --- GetSIMDAlignment :: proc() -> uint --- -} \ No newline at end of file + GetSystemPageSize :: proc() -> c.int --- +} diff --git a/vendor/sdl3/sdl3_events.odin b/vendor/sdl3/sdl3_events.odin index 999fe58b7..7e871156e 100644 --- a/vendor/sdl3/sdl3_events.odin +++ b/vendor/sdl3/sdl3_events.odin @@ -46,9 +46,10 @@ EventType :: enum Uint32 { DISPLAY_MOVED, /**< Display has changed position */ DISPLAY_DESKTOP_MODE_CHANGED, /**< Display has changed desktop mode */ DISPLAY_CURRENT_MODE_CHANGED, /**< Display has changed current mode */ - DISPLAY_CONTENT_SCALE_CHANGED, /**< Display has changed content scale */ + DISPLAY_CONTENT_SCALE_CHANGED, /**< Display has changed usable bounds */ + DISPLAY_USABLE_BOUNDS_CHANGED, DISPLAY_FIRST = DISPLAY_ORIENTATION, - DISPLAY_LAST = DISPLAY_CONTENT_SCALE_CHANGED, + DISPLAY_LAST = DISPLAY_USABLE_BOUNDS_CHANGED, /* Window events */ /* 0x200 was SDL_WINDOWEVENT, reserve the number for sdl2-compat */ @@ -94,6 +95,8 @@ EventType :: enum Uint32 { KEYBOARD_ADDED, /**< A new keyboard has been inserted into the system */ KEYBOARD_REMOVED, /**< A keyboard has been removed */ TEXT_EDITING_CANDIDATES, /**< Keyboard text editing candidates */ + SCREEN_KEYBOARD_SHOWN, /**< The on-screen keyboard has been shown */ + SCREEN_KEYBOARD_HIDDEN, /**< The on-screen keyboard has been hidden */ /* Mouse events */ MOUSE_MOTION = 0x400, /**< Mouse moved */ @@ -134,10 +137,15 @@ EventType :: enum Uint32 { FINGER_MOTION, FINGER_CANCELED, + /* Pinch events */ + PINCH_BEGIN = 0x710, /**< Pinch gesture started */ + PINCH_UPDATE, /**< Pinch gesture updated */ + PINCH_END, /**< Pinch gesture ended */ + /* 0x800, 0x801, and 0x802 were the Gesture events from SDL2. Do not reuse these values! sdl2-compat needs them! */ /* Clipboard events */ - CLIPBOARD_UPDATE = 0x900, /**< The clipboard or primary selection changed */ + CLIPBOARD_UPDATE = 0x900, /**< The clipboard changed */ /* Drag and drop events */ DROP_FILE = 0x1000, /**< The system requests a file open */ @@ -431,6 +439,12 @@ TouchFingerEvent :: struct { windowID: WindowID, /**< The window underneath the finger, if any */ } +PinchFingerEvent :: struct { + using commonEvent: CommonEvent, + scale: f32, /**< The scale change since the last SDL_EVENT_PINCH_UPDATE. Scale < 1 is "zoom out". Scale > 1 is "zoom in". */ + windowID: WindowID, /**< The window underneath the finger, if any */ +} + PenProximityEvent :: struct { using commonEvent: CommonEvent, /**< SDL_EVENT_PEN_PROXIMITY_IN or SDL_EVENT_PEN_PROXIMITY_OUT */ windowID: WindowID, /**< The window with pen focus, if any */ @@ -508,7 +522,7 @@ QuitEvent :: struct { } UserEvent :: struct { - using commonEvent: CommonEvent, /**< SDL_EVENT_USER through SDL_EVENT_LAST-1, Uint32 because these are not in the SDL_EventType enumeration */ + using commonEvent: CommonEvent, /**< SDL_EVENT_USER through SDL_EVENT_LAST, Uint32 because these are not in the SDL_EventType enumeration */ windowID: WindowID, /**< The associated window if any */ code: Sint32, /**< User defined event code */ data1: rawptr, /**< User defined data pointer */ @@ -579,6 +593,8 @@ Event :: struct #raw_union { user: UserEvent `raw_union_tag:"type=USER"`, /**< Touch finger event data */ tfinger: TouchFingerEvent `raw_union_tag:"type=FINGER_DOWN,FINGER_UP,FINGER_MOTION,FINGER_CANCELED"`, + /**< Pinch event data */ + pinch: PinchFingerEvent `raw_union_tag:"type=PINCH_BEGIN,PINCH_UPDATE,PINCH_END"`, /**< Pen proximity event data */ pproximity: PenProximityEvent `raw_union_tag:"type=PEN_PROXIMITY_IN,PEN_PROXIMITY_OUT"`, /**< Pen tip touching event data */ @@ -626,23 +642,24 @@ EventFilter :: proc "c" (userdata: rawptr, event: ^Event) -> bool @(default_calling_convention="c", link_prefix="SDL_", require_results) foreign lib { - PumpEvents :: proc() --- - PeepEvents :: proc(events: [^]Event, numevents: c.int, action: EventAction, minType, maxType: EventType) -> int --- - HasEvent :: proc(type: EventType) -> bool --- - HasEvents :: proc(minType, maxType: EventType) -> bool --- - FlushEvent :: proc(type: EventType) --- - FlushEvents :: proc(minType, maxType: EventType) --- - PollEvent :: proc(event: ^Event) -> bool --- - WaitEvent :: proc(event: ^Event) -> bool --- - WaitEventTimeout :: proc(event: ^Event, timeoutMS: Sint32) -> bool --- - PushEvent :: proc(event: ^Event) -> bool --- - SetEventFilter :: proc(filter: EventFilter, userdata: rawptr) --- - GetEventFilter :: proc(filter: ^EventFilter, userdata: ^rawptr) -> bool --- - AddEventWatch :: proc(filter: EventFilter, userdata: rawptr) -> bool --- - RemoveEventWatch :: proc(filter: EventFilter, userdata: rawptr) --- - FilterEvents :: proc(filter: EventFilter, userdata: rawptr) --- - SetEventEnabled :: proc(type: EventType, enabled: bool) --- - EventEnabled :: proc(type: EventType) -> bool --- - RegisterEvents :: proc(numevents: c.int) -> Uint32 --- - GetWindowFromEvent :: proc(#by_ptr event: Event) -> ^Window --- -} \ No newline at end of file + PumpEvents :: proc() --- + PeepEvents :: proc(events: [^]Event, numevents: c.int, action: EventAction, minType, maxType: EventType) -> int --- + HasEvent :: proc(type: EventType) -> bool --- + HasEvents :: proc(minType, maxType: EventType) -> bool --- + FlushEvent :: proc(type: EventType) --- + FlushEvents :: proc(minType, maxType: EventType) --- + PollEvent :: proc(event: ^Event) -> bool --- + WaitEvent :: proc(event: ^Event) -> bool --- + WaitEventTimeout :: proc(event: ^Event, timeoutMS: Sint32) -> bool --- + PushEvent :: proc(event: ^Event) -> bool --- + SetEventFilter :: proc(filter: EventFilter, userdata: rawptr) --- + GetEventFilter :: proc(filter: ^EventFilter, userdata: ^rawptr) -> bool --- + AddEventWatch :: proc(filter: EventFilter, userdata: rawptr) -> bool --- + RemoveEventWatch :: proc(filter: EventFilter, userdata: rawptr) --- + FilterEvents :: proc(filter: EventFilter, userdata: rawptr) --- + SetEventEnabled :: proc(type: EventType, enabled: bool) --- + EventEnabled :: proc(type: EventType) -> bool --- + RegisterEvents :: proc(numevents: c.int) -> Uint32 --- + GetWindowFromEvent :: proc(#by_ptr event: Event) -> ^Window --- + GetEventDescription :: proc(#by_ptr event: Event, buf: [^]u8, buflen: c.int) -> c.int --- +} diff --git a/vendor/sdl3/sdl3_gpu.odin b/vendor/sdl3/sdl3_gpu.odin index def222739..85f05db83 100644 --- a/vendor/sdl3/sdl3_gpu.odin +++ b/vendor/sdl3/sdl3_gpu.odin @@ -624,10 +624,10 @@ GPURasterizerState :: struct { GPUMultisampleState :: struct { - sample_count: GPUSampleCount, /**< The number of samples to be used in rasterization. */ - sample_mask: Uint32, /**< Reserved for future use. Must be set to 0. */ - enable_mask: bool, /**< Reserved for future use. Must be set to false. */ - _: Uint8, + sample_count: GPUSampleCount, /**< The number of samples to be used in rasterization. */ + sample_mask: Uint32, /**< Reserved for future use. Must be set to 0. */ + enable_mask: bool, /**< Reserved for future use. Must be set to false. */ + enable_alpha_to_coverage: bool, /**< true enables the alpha-to-coverage feature. */ _: Uint8, _: Uint8, } @@ -718,8 +718,8 @@ GPUDepthStencilTargetInfo :: struct { stencil_store_op: GPUStoreOp, /**< What is done with the stencil results of the render pass. */ cycle: bool, /**< true cycles the texture if the texture is bound and any load ops are not LOAD */ clear_stencil: Uint8, /**< The value to clear the stencil component to at the beginning of the render pass. Ignored if GPU_LOADOP_CLEAR is not used. */ - _: Uint8, - _: Uint8, + mip_level: Uint8, /**< The mip level to use as the depth stencil target. */ + layer: Uint8, /**< The layer index to use as the depth stencil target. */ } @@ -765,16 +765,34 @@ GPUStorageTextureReadWriteBinding :: struct { } -PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN :: "SDL.gpu.device.create.debugmode" -PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN :: "SDL.gpu.device.create.preferlowpower" -PROP_GPU_DEVICE_CREATE_NAME_STRING :: "SDL.gpu.device.create.name" -PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN :: "SDL.gpu.device.create.shaders.private" -PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN :: "SDL.gpu.device.create.shaders.spirv" -PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN :: "SDL.gpu.device.create.shaders.dxbc" -PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN :: "SDL.gpu.device.create.shaders.dxil" -PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN :: "SDL.gpu.device.create.shaders.msl" -PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN :: "SDL.gpu.device.create.shaders.metallib" -PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING :: "SDL.gpu.device.create.d3d12.semantic" +PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN :: "SDL.gpu.device.create.debugmode" +PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN :: "SDL.gpu.device.create.preferlowpower" +PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN :: "SDL.gpu.device.create.verbose" +PROP_GPU_DEVICE_CREATE_NAME_STRING :: "SDL.gpu.device.create.name" +PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN :: "SDL.gpu.device.create.feature.clip_distance" +PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN :: "SDL.gpu.device.create.feature.depth_clamping" +PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN :: "SDL.gpu.device.create.feature.indirect_draw_first_instance" +PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN :: "SDL.gpu.device.create.feature.anisotropy" +PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN :: "SDL.gpu.device.create.shaders.private" +PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN :: "SDL.gpu.device.create.shaders.spirv" +PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN :: "SDL.gpu.device.create.shaders.dxbc" +PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN :: "SDL.gpu.device.create.shaders.dxil" +PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN :: "SDL.gpu.device.create.shaders.msl" +PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN :: "SDL.gpu.device.create.shaders.metallib" +PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN :: "SDL.gpu.device.create.d3d12.allowtier1resourcebinding" +PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING :: "SDL.gpu.device.create.d3d12.semantic" +PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN :: "SDL.gpu.device.create.vulkan.requirehardwareacceleration" +PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER :: "SDL.gpu.device.create.vulkan.options" + +GPUVulkanOptions :: struct { + vulkan_api_version: Uint32, /**< The Vulkan API version to request for the instance. Use Vulkan's VK_MAKE_VERSION or VK_MAKE_API_VERSION. */ + feature_list: rawptr, /**< Pointer to the first element of a chain of Vulkan feature structs. (Requires API version 1.1 or higher.)*/ + vulkan_10_physical_device_features: rawptr, /**< Pointer to a VkPhysicalDeviceFeatures struct to enable additional Vulkan 1.0 features. */ + device_extension_count: Uint32, /**< Number of additional device extensions to require. */ + device_extension_names: [^]cstring, /**< Pointer to a list of additional device extensions to require. */ + instance_extension_count: Uint32, /**< Number of additional instance extensions to require. */ + instance_extension_names: [^]cstring, /**< Pointer to a list of additional instance extensions to require. */ +} PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING :: "SDL.gpu.computepipeline.create.name" PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING :: "SDL.gpu.graphicspipeline.create.name" @@ -790,6 +808,11 @@ PROP_GPU_TEXTURE_CREATE_NAME_STRING :: "SDL.gpu.texture.create.na PROP_GPU_BUFFER_CREATE_NAME_STRING :: "SDL.gpu.buffer.create.name" PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING :: "SDL.gpu.transferbuffer.create.name" +PROP_GPU_DEVICE_NAME_STRING :: "SDL.gpu.device.name" +PROP_GPU_DEVICE_DRIVER_NAME_STRING :: "SDL.gpu.device.driver_name" +PROP_GPU_DEVICE_DRIVER_VERSION_STRING :: "SDL.gpu.device.driver_version" +PROP_GPU_DEVICE_DRIVER_INFO_STRING :: "SDL.gpu.device.driver_info" + @(default_calling_convention="c", link_prefix="SDL_", require_results) foreign lib { GPUSupportsShaderFormats :: proc(format_flags: GPUShaderFormat, name: cstring) -> bool --- @@ -884,6 +907,8 @@ foreign lib { GPUTextureSupportsFormat :: proc(device: ^GPUDevice, format: GPUTextureFormat, type: GPUTextureType, usage: GPUTextureUsageFlags) -> bool --- GPUTextureSupportsSampleCount :: proc(device: ^GPUDevice, format: GPUTextureFormat, sample_count: GPUSampleCount) -> bool --- CalculateGPUTextureFormatSize :: proc(format: GPUTextureFormat, width, height: Uint32, depth_or_layer_count: Uint32) -> Uint32 --- + GetPixelFormatFromGPUTextureFormat :: proc(format: GPUTextureFormat) -> PixelFormat --- + GetGPUTextureFormatFromPixelFormat :: proc(format: PixelFormat) -> GPUTextureFormat --- } diff --git a/vendor/sdl3/sdl3_hidapi.odin b/vendor/sdl3/sdl3_hidapi.odin index 6817bffa2..71286cb3d 100644 --- a/vendor/sdl3/sdl3_hidapi.odin +++ b/vendor/sdl3/sdl3_hidapi.odin @@ -75,6 +75,7 @@ hid_device_info :: struct { next: ^hid_device_info, } +PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER :: "SDL.hidapi.libusb.device.handle" @(default_calling_convention="c", link_prefix="SDL_", require_results) foreign lib { @@ -85,6 +86,7 @@ foreign lib { hid_free_enumeration :: proc(devs: ^hid_device_info) --- hid_open :: proc(vendor_id, product_id: c.ushort, serial_number: [^]c.wchar_t) -> ^hid_device --- hid_open_path :: proc(path: cstring) -> ^hid_device --- + hid_get_properties :: proc(dev: ^hid_device) -> PropertiesID --- hid_write :: proc(dev: ^hid_device, data: [^]byte, length: uint) -> c.int --- hid_read_timeout :: proc(dev: ^hid_device, data: [^]byte, length: uint, milliseconds: c.int) -> c.int --- hid_read :: proc(dev: ^hid_device, data: [^]byte, length: uint) -> c.int --- @@ -100,4 +102,4 @@ foreign lib { hid_get_device_info :: proc(dev: ^hid_device) -> ^hid_device_info --- hid_get_report_descriptor :: proc(dev: ^hid_device, buf: [^]byte, buf_size: uint) -> c.int --- hid_ble_scan :: proc(active: bool) --- -} \ No newline at end of file +} diff --git a/vendor/sdl3/sdl3_hints.odin b/vendor/sdl3/sdl3_hints.odin index 987010c57..8ef09295e 100644 --- a/vendor/sdl3/sdl3_hints.odin +++ b/vendor/sdl3/sdl3_hints.odin @@ -95,9 +95,15 @@ HINT_JOYSTICK_HIDAPI_STEAM :: "SDL_JOYSTICK_HIDAPI_STEAM" HINT_JOYSTICK_HIDAPI_STEAM_HOME_LED :: "SDL_JOYSTICK_HIDAPI_STEAM_HOME_LED" HINT_JOYSTICK_HIDAPI_STEAMDECK :: "SDL_JOYSTICK_HIDAPI_STEAMDECK" HINT_JOYSTICK_HIDAPI_STEAM_HORI :: "SDL_JOYSTICK_HIDAPI_STEAM_HORI" +HINT_JOYSTICK_HIDAPI_LG4FF :: "SDL_JOYSTICK_HIDAPI_LG4FF" +HINT_JOYSTICK_HIDAPI_8BITDO :: "SDL_JOYSTICK_HIDAPI_8BITDO" +HINT_JOYSTICK_HIDAPI_SINPUT :: "SDL_JOYSTICK_HIDAPI_SINPUT" +HINT_JOYSTICK_HIDAPI_ZUIKI :: "SDL_JOYSTICK_HIDAPI_ZUIKI" +HINT_JOYSTICK_HIDAPI_FLYDIGI :: "SDL_JOYSTICK_HIDAPI_FLYDIGI" HINT_JOYSTICK_HIDAPI_SWITCH :: "SDL_JOYSTICK_HIDAPI_SWITCH" HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED :: "SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED" HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED :: "SDL_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED" +HINT_JOYSTICK_HIDAPI_SWITCH2 :: "SDL_JOYSTICK_HIDAPI_SWITCH2" HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS :: "SDL_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS" HINT_JOYSTICK_HIDAPI_WII :: "SDL_JOYSTICK_HIDAPI_WII" HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED :: "SDL_JOYSTICK_HIDAPI_WII_PLAYER_LED" @@ -107,6 +113,8 @@ HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED :: "SDL_JOYSTICK_HIDAPI_XBOX_360_PL HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS :: "SDL_JOYSTICK_HIDAPI_XBOX_360_WIRELESS" HINT_JOYSTICK_HIDAPI_XBOX_ONE :: "SDL_JOYSTICK_HIDAPI_XBOX_ONE" HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED :: "SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED" +HINT_JOYSTICK_HIDAPI_GIP :: "SDL_JOYSTICK_HIDAPI_GIP" +HINT_JOYSTICK_HIDAPI_GIP_RESET_FOR_METADATA :: "SDL_JOYSTICK_HIDAPI_GIP_RESET_FOR_METADATA" HINT_JOYSTICK_IOKIT :: "SDL_JOYSTICK_IOKIT" HINT_JOYSTICK_LINUX_CLASSIC :: "SDL_JOYSTICK_LINUX_CLASSIC" HINT_JOYSTICK_LINUX_DEADZONES :: "SDL_JOYSTICK_LINUX_DEADZONES" @@ -127,17 +135,20 @@ HINT_JOYSTICK_HAPTIC_AXES :: "SDL_JOYSTICK_HAPTIC_AXES" HINT_KEYCODE_OPTIONS :: "SDL_KEYCODE_OPTIONS" HINT_KMSDRM_DEVICE_INDEX :: "SDL_KMSDRM_DEVICE_INDEX" HINT_KMSDRM_REQUIRE_DRM_MASTER :: "SDL_KMSDRM_REQUIRE_DRM_MASTER" +HINT_KMSDRM_ATOMIC :: "SDL_KMSDRM_ATOMIC" HINT_LOGGING :: "SDL_LOGGING" HINT_MAC_BACKGROUND_APP :: "SDL_MAC_BACKGROUND_APP" HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK :: "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK" HINT_MAC_OPENGL_ASYNC_DISPATCH :: "SDL_MAC_OPENGL_ASYNC_DISPATCH" HINT_MAC_OPTION_AS_ALT :: "SDL_MAC_OPTION_AS_ALT" HINT_MAC_SCROLL_MOMENTUM :: "SDL_MAC_SCROLL_MOMENTUM" +HINT_MAC_PRESS_AND_HOLD :: "SDL_MAC_PRESS_AND_HOLD" HINT_MAIN_CALLBACK_RATE :: "SDL_MAIN_CALLBACK_RATE" HINT_MOUSE_AUTO_CAPTURE :: "SDL_MOUSE_AUTO_CAPTURE" HINT_MOUSE_DOUBLE_CLICK_RADIUS :: "SDL_MOUSE_DOUBLE_CLICK_RADIUS" HINT_MOUSE_DOUBLE_CLICK_TIME :: "SDL_MOUSE_DOUBLE_CLICK_TIME" HINT_MOUSE_DEFAULT_SYSTEM_CURSOR :: "SDL_MOUSE_DEFAULT_SYSTEM_CURSOR" +HINT_MOUSE_DPI_SCALE_CURSORS :: "SDL_MOUSE_DPI_SCALE_CURSORS" HINT_MOUSE_EMULATE_WARP_WITH_RELATIVE :: "SDL_MOUSE_EMULATE_WARP_WITH_RELATIVE" HINT_MOUSE_FOCUS_CLICKTHROUGH :: "SDL_MOUSE_FOCUS_CLICKTHROUGH" HINT_MOUSE_NORMAL_SPEED_SCALE :: "SDL_MOUSE_NORMAL_SPEED_SCALE" @@ -159,6 +170,7 @@ HINT_PREFERRED_LOCALES :: "SDL_PREFERRED_LOCALES" HINT_QUIT_ON_LAST_WINDOW_CLOSE :: "SDL_QUIT_ON_LAST_WINDOW_CLOSE" HINT_RENDER_DIRECT3D_THREADSAFE :: "SDL_RENDER_DIRECT3D_THREADSAFE" HINT_RENDER_DIRECT3D11_DEBUG :: "SDL_RENDER_DIRECT3D11_DEBUG" +HINT_RENDER_DIRECT3D11_WARP :: "SDL_RENDER_DIRECT3D11_WARP" HINT_RENDER_VULKAN_DEBUG :: "SDL_RENDER_VULKAN_DEBUG" HINT_RENDER_GPU_DEBUG :: "SDL_RENDER_GPU_DEBUG" HINT_RENDER_GPU_LOW_POWER :: "SDL_RENDER_GPU_LOW_POWER" @@ -169,6 +181,10 @@ HINT_RENDER_VSYNC :: "SDL_RENDER_VSYNC" HINT_RETURN_KEY_HIDES_IME :: "SDL_RETURN_KEY_HIDES_IME" HINT_ROG_GAMEPAD_MICE :: "SDL_ROG_GAMEPAD_MICE" HINT_ROG_GAMEPAD_MICE_EXCLUDED :: "SDL_ROG_GAMEPAD_MICE_EXCLUDED" +HINT_PS2_GS_WIDTH :: "SDL_PS2_GS_WIDTH" +HINT_PS2_GS_HEIGHT :: "SDL_PS2_GS_HEIGHT" +HINT_PS2_GS_PROGRESSIVE :: "SDL_PS2_GS_PROGRESSIVE" +HINT_PS2_GS_MODE :: "SDL_PS2_GS_MODE" HINT_RPI_VIDEO_LAYER :: "SDL_RPI_VIDEO_LAYER" HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME :: "SDL_SCREENSAVER_INHIBIT_ACTIVITY_NAME" HINT_SHUTDOWN_DBUS_ON_QUIT :: "SDL_SHUTDOWN_DBUS_ON_QUIT" @@ -189,6 +205,8 @@ HINT_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK :: "SDL_VIDEO_EGL_ALLOW_GETDISPLAY_ HINT_VIDEO_FORCE_EGL :: "SDL_VIDEO_FORCE_EGL" HINT_VIDEO_MAC_FULLSCREEN_SPACES :: "SDL_VIDEO_MAC_FULLSCREEN_SPACES" HINT_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY :: "SDL_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY" +HINT_VIDEO_METAL_AUTO_RESIZE_DRAWABLE :: "SDL_VIDEO_METAL_AUTO_RESIZE_DRAWABLE" +HINT_VIDEO_MATCH_EXCLUSIVE_MODE_ON_MOVE :: "SDL_VIDEO_MATCH_EXCLUSIVE_MODE_ON_MOVE" HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS :: "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS" HINT_VIDEO_OFFSCREEN_SAVE_FRAMES :: "SDL_VIDEO_OFFSCREEN_SAVE_FRAMES" HINT_VIDEO_SYNC_WINDOW_OPERATIONS :: "SDL_VIDEO_SYNC_WINDOW_OPERATIONS" @@ -263,4 +281,4 @@ foreign lib { ResetHints :: proc() --- AddHintCallback :: proc(name: cstring, callback: HintCallback, userdata: rawptr) -> bool --- RemoveHintCallback :: proc(name: cstring, callback: HintCallback, userdata: rawptr) --- -} \ No newline at end of file +} diff --git a/vendor/sdl3/sdl3_iostream.odin b/vendor/sdl3/sdl3_iostream.odin index 2f89c2ba6..f57dc947d 100644 --- a/vendor/sdl3/sdl3_iostream.odin +++ b/vendor/sdl3/sdl3_iostream.odin @@ -44,6 +44,7 @@ PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER :: "SDL.iostream.file_descriptor" PROP_IOSTREAM_ANDROID_AASSET_POINTER :: "SDL.iostream.android.aasset" PROP_IOSTREAM_MEMORY_POINTER :: "SDL.iostream.memory.base" PROP_IOSTREAM_MEMORY_SIZE_NUMBER :: "SDL.iostream.memory.size" +PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER :: "SDL.iostream.memory.free" PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER :: "SDL.iostream.dynamic.memory" PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER :: "SDL.iostream.dynamic.chunksize" diff --git a/vendor/sdl3/sdl3_mouse.odin b/vendor/sdl3/sdl3_mouse.odin index 3bc3aa57f..2a087a34c 100644 --- a/vendor/sdl3/sdl3_mouse.odin +++ b/vendor/sdl3/sdl3_mouse.odin @@ -34,6 +34,11 @@ MouseWheelDirection :: enum c.int { FLIPPED, /**< The scroll direction is flipped / natural */ } +CursorFrameInfo :: struct { + surface: ^Surface, + duration: Uint32, +} + MouseButtonFlags :: distinct bit_set[MouseButtonFlag; Uint32] MouseButtonFlag :: enum Uint32 { LEFT = 1 - 1, @@ -55,6 +60,8 @@ BUTTON_RMASK :: MouseButtonFlags{.RIGHT} BUTTON_X1MASK :: MouseButtonFlags{.X1} BUTTON_X2MASK :: MouseButtonFlags{.X2} +MouseMotionTransformCallback :: #type proc "c" (userdata: rawptr, timestamp: Uint64, window: ^Window, mouseID: MouseID, x, y: ^f32) + @(default_calling_convention="c", link_prefix="SDL_", require_results) foreign lib { HasMouse :: proc() -> bool --- @@ -66,11 +73,13 @@ foreign lib { GetRelativeMouseState :: proc(x, y: ^f32) -> MouseButtonFlags --- WarpMouseInWindow :: proc(window: ^Window, x, y: f32) --- WarpMouseGlobal :: proc(x, y: f32) -> bool --- + SetRelativeMouseTransform :: proc(callback: MouseMotionTransformCallback, userdata: rawptr) -> bool --- SetWindowRelativeMouseMode :: proc(window: ^Window, enabled: bool) -> bool --- GetWindowRelativeMouseMode :: proc(window: ^Window) -> bool --- CaptureMouse :: proc(enabled: bool) -> bool --- CreateCursor :: proc(data: [^]byte, mask: [^]Uint8, w, h, hot_x, hot_y: c.int) -> ^Cursor --- CreateColorCursor :: proc(surface: ^Surface, hot_x, hot_y: c.int) -> ^Cursor --- + CreateAnimatedCursor :: proc(frames: [^]CursorFrameInfo, frame_count, hot_x, hot_y: c.int) -> ^Cursor --- CreateSystemCursor :: proc(id: SystemCursor) -> ^Cursor --- SetCursor :: proc(cursor: ^Cursor) -> bool --- GetCursor :: proc() -> ^Cursor --- @@ -79,4 +88,4 @@ foreign lib { ShowCursor :: proc() -> bool --- HideCursor :: proc() -> bool --- CursorVisible :: proc() -> bool --- -} \ No newline at end of file +} diff --git a/vendor/sdl3/sdl3_pen.odin b/vendor/sdl3/sdl3_pen.odin index 81e820e6b..c28e7338b 100644 --- a/vendor/sdl3/sdl3_pen.odin +++ b/vendor/sdl3/sdl3_pen.odin @@ -10,13 +10,14 @@ PEN_TOUCHID :: TouchID(1<<64 - 2) PenInputFlags :: distinct bit_set[PenInputFlag; Uint32] PenInputFlag :: enum Uint32 { - DOWN = 0, /**< pen is pressed down */ - BUTTON_1 = 1, /**< button 1 is pressed */ - BUTTON_2 = 2, /**< button 2 is pressed */ - BUTTON_3 = 3, /**< button 3 is pressed */ - BUTTON_4 = 4, /**< button 4 is pressed */ - BUTTON_5 = 5, /**< button 5 is pressed */ - ERASER_TIP = 30, /**< eraser tip is used */ + DOWN = 0, /**< pen is pressed down */ + BUTTON_1 = 1, /**< button 1 is pressed */ + BUTTON_2 = 2, /**< button 2 is pressed */ + BUTTON_3 = 3, /**< button 3 is pressed */ + BUTTON_4 = 4, /**< button 4 is pressed */ + BUTTON_5 = 5, /**< button 5 is pressed */ + ERASER_TIP = 30, /**< eraser tip is used */ + IN_PROXIMITY = 31, /**< pen is in proximity (since SDL 3.4.0) */ } PenAxis :: enum c.int { @@ -27,4 +28,16 @@ PenAxis :: enum c.int { ROTATION, /**< Pen barrel rotation. Bidirectional: -180 to 179.9 (clockwise, 0 is facing up, -180.0 is facing down). */ SLIDER, /**< Pen finger wheel or slider (e.g., Airbrush Pen). Unidirectional: 0 to 1.0 */ TANGENTIAL_PRESSURE, /**< Pressure from squeezing the pen ("barrel pressure"). */ -} \ No newline at end of file +} + +PenDeviceType :: enum c.int { + INVALID = -1, /**< Not a valid pen device. */ + UNKNOWN, /**< Don't know specifics of this pen. */ + DIRECT, /**< Pen touches display. */ + INDIRECT /**< Pen touches something that isn't the display. */ +} + +@(default_calling_convention="c", link_prefix="SDL_", require_results) +foreign lib { + GetPenDeviceType :: proc(instance_id: PenID) --- +} diff --git a/vendor/sdl3/sdl3_pixels.odin b/vendor/sdl3/sdl3_pixels.odin index a636d13ff..e3a1c1537 100644 --- a/vendor/sdl3/sdl3_pixels.odin +++ b/vendor/sdl3/sdl3_pixels.odin @@ -518,7 +518,7 @@ Colorspace :: enum c.int { SDL_CHROMA_LOCATION_LEFT), */ RGB_DEFAULT = SRGB, /**< The default colorspace for RGB surfaces if no colorspace is specified */ - YUV_DEFAULT = JPEG, /**< The default colorspace for YUV surfaces if no colorspace is specified */ + YUV_DEFAULT = BT601_LIMITED, /**< The default colorspace for YUV surfaces if no colorspace is specified */ } Color :: distinct [4]Uint8 @@ -561,6 +561,6 @@ foreign lib { DestroyPalette :: proc(palette: ^Palette) --- MapRGB :: proc(format: ^PixelFormatDetails, palette: ^Palette, r, g, b: Uint8) -> Uint32 --- MapRGBA :: proc(format: ^PixelFormatDetails, palette: ^Palette, r, g, b, a: Uint8) -> Uint32 --- - GetRGB :: proc(pixel: Uint32, format: ^PixelFormatDetails, palette: ^Palette, r, g, b: ^Uint8) --- - GetRGBA :: proc(pixel: Uint32, format: ^PixelFormatDetails, palette: ^Palette, r, g, b, a: ^Uint8) --- + GetRGB :: proc(pixelvalue: Uint32, format: ^PixelFormatDetails, palette: ^Palette, r, g, b: ^Uint8) --- + GetRGBA :: proc(pixelvalue: Uint32, format: ^PixelFormatDetails, palette: ^Palette, r, g, b, a: ^Uint8) --- } diff --git a/vendor/sdl3/sdl3_process.odin b/vendor/sdl3/sdl3_process.odin index d3ba6f2ba..71686a444 100644 --- a/vendor/sdl3/sdl3_process.odin +++ b/vendor/sdl3/sdl3_process.odin @@ -13,6 +13,7 @@ ProcessIO :: enum c.int { PROP_PROCESS_CREATE_ARGS_POINTER :: "SDL.process.create.args" PROP_PROCESS_CREATE_ENVIRONMENT_POINTER :: "SDL.process.create.environment" +PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING :: "SDL.process.create.working_directory" PROP_PROCESS_CREATE_STDIN_NUMBER :: "SDL.process.create.stdin_option" PROP_PROCESS_CREATE_STDIN_POINTER :: "SDL.process.create.stdin_source" PROP_PROCESS_CREATE_STDOUT_NUMBER :: "SDL.process.create.stdout_option" @@ -21,6 +22,7 @@ PROP_PROCESS_CREATE_STDERR_NUMBER :: "SDL.process.create.stderr_op PROP_PROCESS_CREATE_STDERR_POINTER :: "SDL.process.create.stderr_source" PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN :: "SDL.process.create.stderr_to_stdout" PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN :: "SDL.process.create.background" +PROP_PROCESS_CREATE_CMDLINE_STRING :: "SDL.process.create.cmdline" PROP_PROCESS_PID_NUMBER :: "SDL.process.pid" PROP_PROCESS_STDIN_POINTER :: "SDL.process.stdin" @@ -39,4 +41,4 @@ foreign lib { KillProcess :: proc(process: ^Process, force: bool) -> bool --- WaitProcess :: proc(process: ^Process, block: bool, exitcode: ^c.int) -> bool --- DestroyProcess :: proc(process: ^Process) --- -} \ No newline at end of file +} diff --git a/vendor/sdl3/sdl3_render.odin b/vendor/sdl3/sdl3_render.odin index 5af4bb055..191dbecfe 100644 --- a/vendor/sdl3/sdl3_render.odin +++ b/vendor/sdl3/sdl3_render.odin @@ -4,6 +4,7 @@ import "core:c" SOFTWARE_RENDERER :: "software" +GPU_RENDER :: "gpu" Vertex :: struct { position: FPoint, /**< Vertex position, in SDL_Renderer coordinates */ @@ -17,6 +18,13 @@ TextureAccess :: enum c.int { TARGET, /**< Texture can be used as a render target */ } +TextureAddressMode :: enum c.int { + TEXTURE_ADDRESS_INVALID = -1, + TEXTURE_ADDRESS_AUTO, /**< Wrapping is enabled if texture coordinates are outside [0, 1], this is the default */ + TEXTURE_ADDRESS_CLAMP, /**< Texture coordinates are clamped to the [0, 1] range */ + TEXTURE_ADDRESS_WRAP /**< The texture is repeated (tiled) */ +} + RendererLogicalPresentation :: enum c.int { DISABLED, /**< There is no logical size in effect */ STRETCH, /**< The rendered content is stretched to the output resolution */ @@ -40,6 +48,10 @@ PROP_RENDERER_CREATE_WINDOW_POINTER :: "SDL.renderer PROP_RENDERER_CREATE_SURFACE_POINTER :: "SDL.renderer.create.surface" PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER :: "SDL.renderer.create.output_colorspace" PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER :: "SDL.renderer.create.present_vsync" +PROP_RENDERER_CREATE_GPU_DEVICE_POINTER :: "SDL.renderer.create.gpu.device" +PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN :: "SDL.renderer.create.gpu.shaders_spirv" +PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN :: "SDL.renderer.create.gpu.shaders_dxil" +PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN :: "SDL.renderer.create.gpu.shaders_msl" PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER :: "SDL.renderer.create.vulkan.instance" PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER :: "SDL.renderer.create.vulkan.surface" PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER :: "SDL.renderer.create.vulkan.physical_device" @@ -53,6 +65,7 @@ PROP_RENDERER_SURFACE_POINTER :: "SDL.renderer.surface PROP_RENDERER_VSYNC_NUMBER :: "SDL.renderer.vsync" PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER :: "SDL.renderer.max_texture_size" PROP_RENDERER_TEXTURE_FORMATS_POINTER :: "SDL.renderer.texture_formats" +PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN :: "SDL.renderer.texture_wrapping" PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER :: "SDL.renderer.output_colorspace" PROP_RENDERER_HDR_ENABLED_BOOLEAN :: "SDL.renderer.HDR_enabled" PROP_RENDERER_SDR_WHITE_POINT_FLOAT :: "SDL.renderer.SDR_white_point" @@ -72,29 +85,35 @@ PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER :: "SDL.renderer.vulkan. PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER :: "SDL.renderer.vulkan.swapchain_image_count" PROP_RENDERER_GPU_DEVICE_POINTER :: "SDL.renderer.gpu.device" -PROP_TEXTURE_CREATE_COLORSPACE_NUMBER :: "SDL.texture.create.colorspace" -PROP_TEXTURE_CREATE_FORMAT_NUMBER :: "SDL.texture.create.format" -PROP_TEXTURE_CREATE_ACCESS_NUMBER :: "SDL.texture.create.access" -PROP_TEXTURE_CREATE_WIDTH_NUMBER :: "SDL.texture.create.width" -PROP_TEXTURE_CREATE_HEIGHT_NUMBER :: "SDL.texture.create.height" -PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT :: "SDL.texture.create.SDR_white_point" -PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT :: "SDL.texture.create.HDR_headroom" -PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER :: "SDL.texture.create.d3d11.texture" -PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER :: "SDL.texture.create.d3d11.texture_u" -PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER :: "SDL.texture.create.d3d11.texture_v" -PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER :: "SDL.texture.create.d3d12.texture" -PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER :: "SDL.texture.create.d3d12.texture_u" -PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER :: "SDL.texture.create.d3d12.texture_v" -PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER :: "SDL.texture.create.metal.pixelbuffer" -PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER :: "SDL.texture.create.opengl.texture" -PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER :: "SDL.texture.create.opengl.texture_uv" -PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER :: "SDL.texture.create.opengl.texture_u" -PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER :: "SDL.texture.create.opengl.texture_v" -PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER :: "SDL.texture.create.opengles2.texture" -PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER :: "SDL.texture.create.opengles2.texture_uv" -PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER :: "SDL.texture.create.opengles2.texture_u" -PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER :: "SDL.texture.create.opengles2.texture_v" -PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER :: "SDL.texture.create.vulkan.texture" +PROP_TEXTURE_CREATE_COLORSPACE_NUMBER :: "SDL.texture.create.colorspace" +PROP_TEXTURE_CREATE_FORMAT_NUMBER :: "SDL.texture.create.format" +PROP_TEXTURE_CREATE_ACCESS_NUMBER :: "SDL.texture.create.access" +PROP_TEXTURE_CREATE_WIDTH_NUMBER :: "SDL.texture.create.width" +PROP_TEXTURE_CREATE_HEIGHT_NUMBER :: "SDL.texture.create.height" +PROP_TEXTURE_CREATE_PALETTE_POINTER :: "SDL.texture.create.palette" +PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT :: "SDL.texture.create.SDR_white_point" +PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT :: "SDL.texture.create.HDR_headroom" +PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER :: "SDL.texture.create.d3d11.texture" +PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER :: "SDL.texture.create.d3d11.texture_u" +PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER :: "SDL.texture.create.d3d11.texture_v" +PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER :: "SDL.texture.create.d3d12.texture" +PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER :: "SDL.texture.create.d3d12.texture_u" +PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER :: "SDL.texture.create.d3d12.texture_v" +PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER :: "SDL.texture.create.metal.pixelbuffer" +PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER :: "SDL.texture.create.opengl.texture" +PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER :: "SDL.texture.create.opengl.texture_uv" +PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER :: "SDL.texture.create.opengl.texture_u" +PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER :: "SDL.texture.create.opengl.texture_v" +PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER :: "SDL.texture.create.opengles2.texture" +PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER :: "SDL.texture.create.opengles2.texture_uv" +PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER :: "SDL.texture.create.opengles2.texture_u" +PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER :: "SDL.texture.create.opengles2.texture_v" +PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER :: "SDL.texture.create.vulkan.texture" +PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER :: "SDL.texture.create.vulkan.layout" +PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER :: "SDL.texture.create.gpu.texture" +PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_POINTER :: "SDL.texture.create.gpu.texture_uv" +PROP_TEXTURE_CREATE_GPU_TEXTURE_U_POINTER :: "SDL.texture.create.gpu.texture_u" +PROP_TEXTURE_CREATE_GPU_TEXTURE_V_POINTER :: "SDL.texture.create.gpu.texture_v" PROP_TEXTURE_COLORSPACE_NUMBER :: "SDL.texture.colorspace" PROP_TEXTURE_FORMAT_NUMBER :: "SDL.texture.format" @@ -122,6 +141,10 @@ PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER :: "SDL.texture.opengles2.textur PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER :: "SDL.texture.opengles2.texture_v" PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER :: "SDL.texture.opengles2.target" PROP_TEXTURE_VULKAN_TEXTURE_NUMBER :: "SDL.texture.vulkan.texture" +PROP_TEXTURE_GPU_TEXTURE_POINTER :: "SDL.texture.gpu.texture" +PROP_TEXTURE_GPU_TEXTURE_UV_POINTER :: "SDL.texture.gpu.texture_uv" +PROP_TEXTURE_GPU_TEXTURE_U_POINTER :: "SDL.texture.gpu.texture_u" +PROP_TEXTURE_GPU_TEXTURE_V_POINTER :: "SDL.texture.gpu.texture_v" RENDERER_VSYNC_DISABLED :: 0 RENDERER_VSYNC_ADAPTIVE :: -1 @@ -134,6 +157,8 @@ foreign lib { GetRenderDriver :: proc(index: c.int) -> cstring --- CreateRenderer :: proc(window: ^Window, name: cstring) -> ^Renderer --- CreateRendererWithProperties :: proc(props: PropertiesID) -> ^Renderer --- + CreateGPURenderer :: proc(device: ^GPUDevice, window: ^Window) -> ^Renderer --- + GetGPURendererDevice :: proc(device: ^Renderer) -> ^GPUDevice --- CreateSoftwareRenderer :: proc(surface: ^Surface) -> ^Renderer --- GetRenderer :: proc(window: ^Window) -> ^Renderer --- GetRenderWindow :: proc(renderer: ^Renderer) -> ^Window --- @@ -158,6 +183,8 @@ foreign lib { GetRenderOutputSize :: proc(renderer: ^Renderer, w, h: ^c.int) -> bool --- GetCurrentRenderOutputSize :: proc(renderer: ^Renderer, w, h: ^c.int) -> bool --- GetTextureSize :: proc(texture: ^Texture, w, h: ^f32) -> bool --- + SetTexturePalette :: proc(texture: ^Texture, palette: ^Palette) -> bool --- + GetTexturePalette :: proc(texture: ^Texture) -> ^Palette --- SetTextureColorMod :: proc(texture: ^Texture, r, g, b: Uint8) -> bool --- SetTextureColorModFloat :: proc(texture: ^Texture, r, g, b: f32) -> bool --- GetTextureColorMod :: proc(texture: ^Texture, r, g, b: ^Uint8) -> bool --- @@ -212,8 +239,11 @@ foreign lib { RenderTextureAffine :: proc(renderer: ^Renderer, texture: ^Texture, srcrect: Maybe(^FRect), origin, right, down: Maybe(^FPoint)) -> bool --- RenderTextureTiled :: proc(renderer: ^Renderer, texture: ^Texture, srcrect: Maybe(^FRect), scale: f32, dstrect: Maybe(^FRect)) -> bool --- RenderTexture9Grid :: proc(renderer: ^Renderer, texture: ^Texture, srcrect: Maybe(^FRect), left_width, right_width, top_height, bottom_height: f32, scale: f32, dstrect: Maybe(^FRect)) -> bool --- + RenderTexture9GridTiled :: proc(renderer: ^Renderer, texture: ^Texture, srcrect: Maybe(^FRect), left_width, right_width, top_height, bottom_height: f32, scale: f32, dstrect: Maybe(^FRect), tileScale: f32) -> bool --- RenderGeometry :: proc(renderer: ^Renderer, texture: ^Texture, vertices: [^]Vertex, num_vertices: c.int, indices: [^]c.int, num_indices: c.int) -> bool --- RenderGeometryRaw :: proc(renderer: ^Renderer, texture: ^Texture, xy: [^]f32, xy_stride: c.int, color: [^]FColor, color_stride: c.int, uv: [^]f32, uv_stride: c.int, num_vertices: c.int, indices: rawptr, num_indices: c.int, size_indices: c.int) -> bool --- + SetRenderTextureAddressMode :: proc(renderer: ^Renderer, u_mode, v_mode: TextureAddressMode) -> bool --- + GetRenderTextureAddressMode :: proc(renderer: ^Renderer, u_mode, v_mode: ^TextureAddressMode) -> bool --- RenderPresent :: proc(renderer: ^Renderer) -> bool --- DestroyTexture :: proc(texture: ^Texture) --- DestroyRenderer :: proc(renderer: ^Renderer) --- @@ -223,4 +253,28 @@ foreign lib { GetRenderVSync :: proc(renderer: ^Renderer, vsync: ^c.int) -> bool --- RenderDebugText :: proc(renderer: ^Renderer, x, y: f32, str: cstring) -> bool --- RenderDebugTextFormat :: proc(renderer: ^Renderer, x, y: f32, fmt: cstring, #c_vararg args: ..any) -> bool --- -} \ No newline at end of file + SetDefaultTextureAddressMode :: proc(renderer: ^Renderer, scale_mode: ScaleMode) -> bool --- + GetDefaultTextureAddressMode :: proc(renderer: ^Renderer, scale_mode: ^ScaleMode) -> bool --- +} + + +GPURenderStateCreateInfo :: struct { + fragment_shader: ^GPUShader, /**< The fragment shader to use when this render state is active */ + num_sampler_bindings: Sint32, /**< The number of additional fragment samplers to bind when this render state is active */ + sampler_bindings: [^]GPUTextureSamplerBinding, /**< Additional fragment samplers to bind when this render state is active */ + num_storage_textures: Sint32, /**< The number of storage textures to bind when this render state is active */ + storage_textures: [^]^GPUTexture, /**< Storage textures to bind when this render state is active */ + num_storage_buffers: Sint32, /**< The number of storage buffers to bind when this render state is active */ + storage_buffers: [^]^GPUBuffer, /**< Storage buffers to bind when this render state is active */ + props: PropertiesID, /**< A properties ID for extensions. Should be 0 if no extensions are needed. */ +} + +GPURenderState :: struct {} + +@(default_calling_convention="c", link_prefix="SDL_", require_results) +foreign lib { + CreateGPURenderState :: proc(renderer: ^Renderer, createinfo: ^GPURenderStateCreateInfo) -> ^GPURenderState --- + SetGPURenderStateFragmentUniforms :: proc(state: ^GPURenderState, slot_index: Uint32, data: rawptr, length: Uint32) -> bool --- + SetGPURenderState :: proc(renderer: ^Renderer, state: ^GPURenderState) -> bool --- + DestroyGPURenderState :: proc(renderer: ^Renderer) --- +} diff --git a/vendor/sdl3/sdl3_surface.odin b/vendor/sdl3/sdl3_surface.odin index 526940147..9aaf54cec 100644 --- a/vendor/sdl3/sdl3_surface.odin +++ b/vendor/sdl3/sdl3_surface.odin @@ -23,14 +23,16 @@ MUSTLOCK :: proc "c" (S: ^Surface) -> bool { ScaleMode :: enum c.int { INVALID = -1, - NEAREST, /**< nearest pixel sampling */ - LINEAR, /**< linear filtering */ + NEAREST, /**< nearest pixel sampling */ + LINEAR, /**< linear filtering */ + PIXELART, /**< nearest pixel sampling with improved scaling for pixel art, available since SDL 3.4.0 */ } FlipMode :: enum c.int { - NONE, /**< Do not flip */ - HORIZONTAL, /**< flip horizontally */ - VERTICAL, /**< flip vertically */ + NONE, /**< Do not flip */ + HORIZONTAL, /**< flip horizontally */ + VERTICAL, /**< flip vertically */ + HORIZONTAL_AND_VERTICAL = HORIZONTAL | VERTICAL, /**< flip horizontally and vertically (not a diagonal flip) */ } Surface :: struct { @@ -51,6 +53,7 @@ PROP_SURFACE_HDR_HEADROOM_FLOAT :: "SDL.surface.HDR_headroom" PROP_SURFACE_TONEMAP_OPERATOR_STRING :: "SDL.surface.tonemap" PROP_SURFACE_HOTSPOT_X_NUMBER :: "SDL.surface.hotspot.x" PROP_SURFACE_HOTSPOT_Y_NUMBER :: "SDL.surface.hotspot.y" +PROP_SURFACE_ROTATION_FLOAT :: "SDL.surface.rotation" @(default_calling_convention="c", link_prefix="SDL_") foreign lib { @@ -69,10 +72,16 @@ foreign lib { RemoveSurfaceAlternateImages :: proc(surface: ^Surface) --- LockSurface :: proc(surface: ^Surface) -> bool --- UnlockSurface :: proc(surface: ^Surface) --- + LoadSurface_IO :: proc(src: ^IOStream, closeio: bool) -> ^Surface --- + LoadSurface :: proc(file: cstring) -> ^Surface --- LoadBMP_IO :: proc(src: ^IOStream, closeio: bool) -> ^Surface --- LoadBMP :: proc(file: cstring) -> ^Surface --- SaveBMP_IO :: proc(surface: ^Surface, dst: ^IOStream, closeio: bool) -> bool --- SaveBMP :: proc(surface: ^Surface, file: cstring) -> bool --- + LoadPNG_IO :: proc(src: ^IOStream, closeio: bool) -> ^Surface --- + LoadPNG :: proc(file: cstring) -> ^Surface --- + SavePNG_IO :: proc(surface: ^Surface, dst: ^IOStream, closeio: bool) -> bool --- + SavePNG :: proc(surface: ^Surface, file: cstring) -> bool --- SetSurfaceRLE :: proc(surface: ^Surface, enabled: bool) -> bool --- SurfaceHasRLE :: proc(surface: ^Surface) -> bool --- SetSurfaceColorKey :: proc(surface: ^Surface, enabled: bool, key: Uint32) -> bool --- @@ -87,6 +96,7 @@ foreign lib { SetSurfaceClipRect :: proc(surface: ^Surface, rect: Maybe(^Rect)) -> bool --- GetSurfaceClipRect :: proc(surface: ^Surface, rect: ^Rect) -> bool --- FlipSurface :: proc(surface: ^Surface, flip: FlipMode) -> bool --- + RotateSurface :: proc(surface: ^Surface, angle: f32) -> ^Surface --- DuplicateSurface :: proc(surface: ^Surface) -> ^Surface --- ScaleSurface :: proc(surface: ^Surface, width, height: c.int, scaleMode: ScaleMode) -> ^Surface --- ConvertSurface :: proc(surface: ^Surface, format: PixelFormat) -> ^Surface --- @@ -112,4 +122,4 @@ foreign lib { ReadSurfacePixelFloat :: proc(surface: ^Surface, x, y: c.int, r, g, b, a: ^f32) -> bool --- WriteSurfacePixel :: proc(surface: ^Surface, x, y: c.int, r, g, b, a: Uint8) -> bool --- WriteSurfacePixelFloat :: proc(surface: ^Surface, x, y: c.int, r, g, b, a: f32) -> bool --- -} \ No newline at end of file +} diff --git a/vendor/sdl3/sdl3_video.odin b/vendor/sdl3/sdl3_video.odin index 6761bee56..687f3d9a7 100644 --- a/vendor/sdl3/sdl3_video.odin +++ b/vendor/sdl3/sdl3_video.odin @@ -61,6 +61,7 @@ WindowFlag :: enum Uint64 { TOOLTIP = 18, POPUP_MENU = 19, KEYBOARD_GRABBED = 20, + FILL_DOCUMENT = 21, VULKAN = 28, METAL = 29, @@ -133,6 +134,15 @@ FlashOperation :: enum c.int { UNTIL_FOCUSED, /**< Flash the window until it gets focus */ } +ProgressState :: enum c.int { + PROGRESS_STATE_INVALID = -1, /**< An invalid progress state indicating an error; check SDL_GetError() */ + PROGRESS_STATE_NONE, /**< No progress bar is shown */ + PROGRESS_STATE_INDETERMINATE, /**< The progress bar is shown in a indeterminate state */ + PROGRESS_STATE_NORMAL, /**< The progress bar is shown in a normal state */ + PROGRESS_STATE_PAUSED, /**< The progress bar is shown in a paused state */ + PROGRESS_STATE_ERROR /**< The progress bar is shown in a state indicating the application had an error */ +} + GLContextState :: struct {} GLContext :: ^GLContextState EGLDisplay :: distinct rawptr @@ -167,7 +177,7 @@ GLAttr :: enum c.int { CONTEXT_FLAGS, /**< some combination of 0 or more of elements of the SDL_GLContextFlag enumeration; defaults to 0. */ CONTEXT_PROFILE_MASK, /**< type of GL context (Core, Compatibility, ES). See SDL_GLProfile; default value depends on platform. */ SHARE_WITH_CURRENT_CONTEXT, /**< OpenGL context sharing; defaults to 0. */ - FRAMEBUFFER_SRGB_CAPABLE, /**< requests sRGB capable visual; defaults to 0. */ + FRAMEBUFFER_SRGB_CAPABLE, /**< requests sRGB-capable visual if 1. Defaults to -1 ("don't care"). This is a request; GL drivers might not comply! */ CONTEXT_RELEASE_BEHAVIOR, /**< sets context the release behavior. See SDL_GLContextReleaseFlag; defaults to FLUSH. */ CONTEXT_RESET_NOTIFICATION, /**< set context reset notification. See SDL_GLContextResetNotification; defaults to NO_NOTIFICATION. */ CONTEXT_NO_ERROR, @@ -275,12 +285,15 @@ PROP_WINDOW_CREATE_X_NUMBER :: "SDL.window.create.x" PROP_WINDOW_CREATE_Y_NUMBER :: "SDL.window.create.y" PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER :: "SDL.window.create.cocoa.window" PROP_WINDOW_CREATE_COCOA_VIEW_POINTER :: "SDL.window.create.cocoa.view" +PROP_WINDOW_CREATE_WINDOWSCENE_POINTER :: "SDL.window.create.uikit.windowscene" PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN :: "SDL.window.create.wayland.surface_role_custom" PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN :: "SDL.window.create.wayland.create_egl_window" PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER :: "SDL.window.create.wayland.wl_surface" PROP_WINDOW_CREATE_WIN32_HWND_POINTER :: "SDL.window.create.win32.hwnd" PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER :: "SDL.window.create.win32.pixel_format_hwnd" PROP_WINDOW_CREATE_X11_WINDOW_NUMBER :: "SDL.window.create.x11.window" +PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING :: "SDL.window.create.emscripten.canvas_id" +PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING :: "SDL.window.create.emscripten.keyboard_element" PROP_WINDOW_SHAPE_POINTER :: "SDL.window.shape" PROP_WINDOW_HDR_ENABLED_BOOLEAN :: "SDL.window.HDR_enabled" @@ -298,7 +311,7 @@ PROP_WINDOW_KMSDRM_DRM_FD_NUMBER :: "SDL.window.kmsdrm.drm_ PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER :: "SDL.window.kmsdrm.gbm_dev" PROP_WINDOW_COCOA_WINDOW_POINTER :: "SDL.window.cocoa.window" PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER :: "SDL.window.cocoa.metal_view_tag" -PROP_WINDOW_OPENVR_OVERLAY_ID :: "SDL.window.openvr.overlay_id" +PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER :: "SDL.window.openvr.overlay_id" PROP_WINDOW_VIVANTE_DISPLAY_POINTER :: "SDL.window.vivante.display" PROP_WINDOW_VIVANTE_WINDOW_POINTER :: "SDL.window.vivante.window" PROP_WINDOW_VIVANTE_SURFACE_POINTER :: "SDL.window.vivante.surface" @@ -317,6 +330,8 @@ PROP_WINDOW_WAYLAND_XDG_POSITIONER_POINTER :: "SDL.window.wayland.xdg PROP_WINDOW_X11_DISPLAY_POINTER :: "SDL.window.x11.display" PROP_WINDOW_X11_SCREEN_NUMBER :: "SDL.window.x11.screen" PROP_WINDOW_X11_WINDOW_NUMBER :: "SDL.window.x11.window" +PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING :: "SDL.window.emscripten.canvas_id" +PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING :: "SDL.window.emscripten.keyboard_element" WINDOW_SURFACE_VSYNC_DISABLED :: 0 WINDOW_SURFACE_VSYNC_ADAPTIVE :: -1 @@ -377,6 +392,7 @@ foreign lib { SetWindowBordered :: proc(window: ^Window, bordered: bool) -> bool --- SetWindowResizable :: proc(window: ^Window, resizable: bool) -> bool --- SetWindowAlwaysOnTop :: proc(window: ^Window, on_top: bool) -> bool --- + SetWindowFillDocument :: proc(window: ^Window, fill: bool) -> bool --- ShowWindow :: proc(window: ^Window) -> bool --- HideWindow :: proc(window: ^Window) -> bool --- RaiseWindow :: proc(window: ^Window) -> bool --- @@ -427,6 +443,10 @@ foreign lib { SetWindowHitTest :: proc(window: ^Window, callback: HitTest, callback_data: rawptr) -> bool --- SetWindowShape :: proc(window: ^Window, shape: ^Surface) -> bool --- FlashWindow :: proc(window: ^Window, operation: FlashOperation) -> bool --- + SetWindowProgressState :: proc(window: ^Window, state: ProgressState) -> bool --- + GetWindowProgressState :: proc(window: ^Window) -> ProgressState --- + SetWindowProgrssValue :: proc(window: ^Window, value: f32) -> bool --- + GetWindowProgrssValue :: proc(window: ^Window) -> f32 --- DestroyWindow :: proc(window: ^Window) --- ScreenSaverEnabled :: proc() -> bool --- EnableScreenSaver :: proc() -> bool --- @@ -461,4 +481,4 @@ foreign lib { // Used by vendor:OpenGL gl_set_proc_address :: proc(p: rawptr, name: cstring) { (^FunctionPointer)(p)^ = GL_GetProcAddress(name) -} \ No newline at end of file +} From b34cf987c3e3aeaccfb83b580497dd652f911e89 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 2 Jan 2026 14:43:50 -0500 Subject: [PATCH 144/766] [vendor/sdl3] satify vet --- vendor/sdl3/sdl3_pen.odin | 2 +- vendor/sdl3/sdl3_render.odin | 2 +- vendor/sdl3/sdl3_video.odin | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/sdl3/sdl3_pen.odin b/vendor/sdl3/sdl3_pen.odin index c28e7338b..d96848fed 100644 --- a/vendor/sdl3/sdl3_pen.odin +++ b/vendor/sdl3/sdl3_pen.odin @@ -34,7 +34,7 @@ PenDeviceType :: enum c.int { INVALID = -1, /**< Not a valid pen device. */ UNKNOWN, /**< Don't know specifics of this pen. */ DIRECT, /**< Pen touches display. */ - INDIRECT /**< Pen touches something that isn't the display. */ + INDIRECT, /**< Pen touches something that isn't the display. */ } @(default_calling_convention="c", link_prefix="SDL_", require_results) diff --git a/vendor/sdl3/sdl3_render.odin b/vendor/sdl3/sdl3_render.odin index 191dbecfe..68e333c64 100644 --- a/vendor/sdl3/sdl3_render.odin +++ b/vendor/sdl3/sdl3_render.odin @@ -22,7 +22,7 @@ TextureAddressMode :: enum c.int { TEXTURE_ADDRESS_INVALID = -1, TEXTURE_ADDRESS_AUTO, /**< Wrapping is enabled if texture coordinates are outside [0, 1], this is the default */ TEXTURE_ADDRESS_CLAMP, /**< Texture coordinates are clamped to the [0, 1] range */ - TEXTURE_ADDRESS_WRAP /**< The texture is repeated (tiled) */ + TEXTURE_ADDRESS_WRAP, /**< The texture is repeated (tiled) */ } RendererLogicalPresentation :: enum c.int { diff --git a/vendor/sdl3/sdl3_video.odin b/vendor/sdl3/sdl3_video.odin index 687f3d9a7..4dc1cc107 100644 --- a/vendor/sdl3/sdl3_video.odin +++ b/vendor/sdl3/sdl3_video.odin @@ -140,7 +140,7 @@ ProgressState :: enum c.int { PROGRESS_STATE_INDETERMINATE, /**< The progress bar is shown in a indeterminate state */ PROGRESS_STATE_NORMAL, /**< The progress bar is shown in a normal state */ PROGRESS_STATE_PAUSED, /**< The progress bar is shown in a paused state */ - PROGRESS_STATE_ERROR /**< The progress bar is shown in a state indicating the application had an error */ + PROGRESS_STATE_ERROR, /**< The progress bar is shown in a state indicating the application had an error */ } GLContextState :: struct {} From 4237a4494431ea6393aa6c6c6dec5cb26aec4f50 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 2 Jan 2026 17:07:43 -0500 Subject: [PATCH 145/766] [vendor/sdl3] another pass over the headers --- vendor/sdl3/sdl3_haptic.odin | 15 ++++++++------- vendor/sdl3/sdl3_properties.odin | 4 +++- vendor/sdl3/sdl3_render.odin | 8 ++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/vendor/sdl3/sdl3_haptic.odin b/vendor/sdl3/sdl3_haptic.odin index d5efadcf3..adf055ee6 100644 --- a/vendor/sdl3/sdl3_haptic.odin +++ b/vendor/sdl3/sdl3_haptic.odin @@ -5,6 +5,7 @@ import "core:c" Haptic :: struct {} HapticType :: Uint16 +HapticEffectId :: c.int HAPTIC_CONSTANT :: 1<<0 HAPTIC_SINE :: 1<<1 @@ -215,12 +216,12 @@ foreign lib { GetHapticFeatures :: proc(haptic: ^Haptic) -> Uint32 --- GetNumHapticAxes :: proc(haptic: ^Haptic) -> c.int --- HapticEffectSupported :: proc(haptic: ^Haptic, #by_ptr effect: HapticEffect) -> bool --- - CreateHapticEffect :: proc(haptic: ^Haptic, #by_ptr effect: HapticEffect) -> c.int --- - UpdateHapticEffect :: proc(haptic: ^Haptic, effect: c.int, #by_ptr data: HapticEffect) -> bool --- - RunHapticEffect :: proc(haptic: ^Haptic, effect: c.int, iterations: Uint32) -> bool --- - StopHapticEffect :: proc(haptic: ^Haptic, effect: c.int) -> bool --- - DestroyHapticEffect :: proc(haptic: ^Haptic, effect: c.int) --- - GetHapticEffectStatus :: proc(haptic: ^Haptic, effect: c.int) -> bool --- + CreateHapticEffect :: proc(haptic: ^Haptic, #by_ptr effect: HapticEffect) -> HapticEffectId --- + UpdateHapticEffect :: proc(haptic: ^Haptic, effect: HapticEffectId, #by_ptr data: HapticEffect) -> bool --- + RunHapticEffect :: proc(haptic: ^Haptic, effect: HapticEffectId, iterations: Uint32) -> bool --- + StopHapticEffect :: proc(haptic: ^Haptic, effect: HapticEffectId) -> bool --- + DestroyHapticEffect :: proc(haptic: ^Haptic, effect: HapticEffectId) --- + GetHapticEffectStatus :: proc(haptic: ^Haptic, effect: HapticEffectId) -> bool --- SetHapticGain :: proc(haptic: ^Haptic, gain: c.int) -> bool --- SetHapticAutocenter :: proc(haptic: ^Haptic, autocenter: c.int) -> bool --- PauseHaptic :: proc(haptic: ^Haptic) -> bool --- @@ -230,4 +231,4 @@ foreign lib { InitHapticRumble :: proc(haptic: ^Haptic) -> bool --- PlayHapticRumble :: proc(haptic: ^Haptic, strength: f32, length: Uint32) -> bool --- StopHapticRumble :: proc(haptic: ^Haptic) -> bool --- -} \ No newline at end of file +} diff --git a/vendor/sdl3/sdl3_properties.odin b/vendor/sdl3/sdl3_properties.odin index 73372c290..01bdff59b 100644 --- a/vendor/sdl3/sdl3_properties.odin +++ b/vendor/sdl3/sdl3_properties.odin @@ -4,6 +4,8 @@ import "core:c" PropertiesID :: distinct Uint32 +PROP_NAME_STRING :: "SDL.name" + PropertyType :: enum c.int { INVALID, POINTER, @@ -41,4 +43,4 @@ foreign lib { ClearProperty :: proc(props: PropertiesID, name: cstring) -> bool --- EnumerateProperties :: proc(props: PropertiesID, callback: EnumeratePropertiesCallback, userdata: rawptr) -> bool --- DestroyProperties :: proc(props: PropertiesID) --- -} \ No newline at end of file +} diff --git a/vendor/sdl3/sdl3_render.odin b/vendor/sdl3/sdl3_render.odin index 68e333c64..9b2d4efd4 100644 --- a/vendor/sdl3/sdl3_render.odin +++ b/vendor/sdl3/sdl3_render.odin @@ -19,10 +19,10 @@ TextureAccess :: enum c.int { } TextureAddressMode :: enum c.int { - TEXTURE_ADDRESS_INVALID = -1, - TEXTURE_ADDRESS_AUTO, /**< Wrapping is enabled if texture coordinates are outside [0, 1], this is the default */ - TEXTURE_ADDRESS_CLAMP, /**< Texture coordinates are clamped to the [0, 1] range */ - TEXTURE_ADDRESS_WRAP, /**< The texture is repeated (tiled) */ + INVALID = -1, + AUTO, /**< Wrapping is enabled if texture coordinates are outside [0, 1], this is the default */ + CLAMP, /**< Texture coordinates are clamped to the [0, 1] range */ + WRAP, /**< The texture is repeated (tiled) */ } RendererLogicalPresentation :: enum c.int { From c867143a581cace6adec1ac3097ba2936e8ddda6 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 2 Jan 2026 17:38:21 -0500 Subject: [PATCH 146/766] [vendor/sdl3] typo --- vendor/sdl3/sdl3_video.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/sdl3/sdl3_video.odin b/vendor/sdl3/sdl3_video.odin index 4dc1cc107..4a0b6840b 100644 --- a/vendor/sdl3/sdl3_video.odin +++ b/vendor/sdl3/sdl3_video.odin @@ -445,8 +445,8 @@ foreign lib { FlashWindow :: proc(window: ^Window, operation: FlashOperation) -> bool --- SetWindowProgressState :: proc(window: ^Window, state: ProgressState) -> bool --- GetWindowProgressState :: proc(window: ^Window) -> ProgressState --- - SetWindowProgrssValue :: proc(window: ^Window, value: f32) -> bool --- - GetWindowProgrssValue :: proc(window: ^Window) -> f32 --- + SetWindowProgressValue :: proc(window: ^Window, value: f32) -> bool --- + GetWindowProgressValue :: proc(window: ^Window) -> f32 --- DestroyWindow :: proc(window: ^Window) --- ScreenSaverEnabled :: proc() -> bool --- EnableScreenSaver :: proc() -> bool --- From 08dd0cb0af79c8712be6139b28f075d5810ce77f Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 2 Jan 2026 17:41:20 -0500 Subject: [PATCH 147/766] [vendor/sdl3] shortened enum naming --- vendor/sdl3/sdl3_video.odin | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vendor/sdl3/sdl3_video.odin b/vendor/sdl3/sdl3_video.odin index 4a0b6840b..e4547d991 100644 --- a/vendor/sdl3/sdl3_video.odin +++ b/vendor/sdl3/sdl3_video.odin @@ -135,12 +135,12 @@ FlashOperation :: enum c.int { } ProgressState :: enum c.int { - PROGRESS_STATE_INVALID = -1, /**< An invalid progress state indicating an error; check SDL_GetError() */ - PROGRESS_STATE_NONE, /**< No progress bar is shown */ - PROGRESS_STATE_INDETERMINATE, /**< The progress bar is shown in a indeterminate state */ - PROGRESS_STATE_NORMAL, /**< The progress bar is shown in a normal state */ - PROGRESS_STATE_PAUSED, /**< The progress bar is shown in a paused state */ - PROGRESS_STATE_ERROR, /**< The progress bar is shown in a state indicating the application had an error */ + INVALID = -1, /**< An invalid progress state indicating an error; check SDL_GetError() */ + NONE, /**< No progress bar is shown */ + INDETERMINATE, /**< The progress bar is shown in a indeterminate state */ + NORMAL, /**< The progress bar is shown in a normal state */ + PAUSED, /**< The progress bar is shown in a paused state */ + ERROR, /**< The progress bar is shown in a state indicating the application had an error */ } GLContextState :: struct {} From 7fa05f16bfc55a3380c758bdedaf3da351774713 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 3 Jan 2026 20:14:15 +0000 Subject: [PATCH 148/766] Minor change from `make_checker_context` to `init_checker_context` --- src/checker.cpp | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 13d02c512..ab3ba50dd 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1530,17 +1530,16 @@ gb_internal void destroy_checker_info(CheckerInfo *i) { map_destroy(&i->load_directory_map); } -gb_internal CheckerContext make_checker_context(Checker *c) { - CheckerContext ctx = {}; - ctx.checker = c; - ctx.info = &c->info; - ctx.scope = builtin_pkg->scope; - ctx.pkg = builtin_pkg; +gb_internal void init_checker_context(CheckerContext *ctx, Checker *c) { + ctx->checker = c; + ctx->info = &c->info; + ctx->scope = builtin_pkg->scope; + ctx->pkg = builtin_pkg; - ctx.type_path = new_checker_type_path(heap_allocator()); - ctx.type_level = 0; - return ctx; + ctx->type_path = new_checker_type_path(heap_allocator()); + ctx->type_level = 0; } + gb_internal void destroy_checker_context(CheckerContext *ctx) { destroy_checker_type_path(ctx->type_path, heap_allocator()); } @@ -1605,7 +1604,7 @@ gb_internal void init_checker(Checker *c) { mpsc_init(&c->global_untyped_queue, a); // , 1<<20); mpsc_init(&c->soa_types_to_complete, a); // , 1<<20); - c->builtin_ctx = make_checker_context(c); + init_checker_context(&c->builtin_ctx, c); } gb_internal void destroy_checker(Checker *c) { @@ -4964,7 +4963,7 @@ gb_internal void check_collect_entities(CheckerContext *c, Slice const &n gb_internal CheckerContext *create_checker_context(Checker *c) { CheckerContext *ctx = gb_alloc_item(permanent_allocator(), CheckerContext); - *ctx = make_checker_context(c); + init_checker_context(ctx, c); return ctx; } @@ -5409,7 +5408,8 @@ gb_internal DECL_ATTRIBUTE_PROC(foreign_import_decl_attribute) { } gb_internal void check_foreign_import_fullpaths(Checker *c) { - CheckerContext ctx = make_checker_context(c); + CheckerContext ctx = {}; + init_checker_context(&ctx, c); UntypedExprInfoMap untyped = {}; defer (map_destroy(&untyped)); @@ -5792,7 +5792,7 @@ gb_internal void check_collect_entities_all(Checker *c) { for (isize i = 0; i < thread_count; i++) { auto *wd = &collect_entity_worker_data[i]; wd->c = c; - wd->ctx = make_checker_context(c); + init_checker_context(&wd->ctx, c); map_init(&wd->untyped); } @@ -5833,7 +5833,7 @@ gb_internal void check_export_entities(Checker *c) { for (isize i = 0; i < thread_count; i++) { auto *wd = &collect_entity_worker_data[i]; map_clear(&wd->untyped); - wd->ctx = make_checker_context(c); + init_checker_context(&wd->ctx, c); } for (auto const &entry : c->info.packages) { @@ -5900,7 +5900,8 @@ gb_internal void check_import_entities(Checker *c) { } TIME_SECTION("check_import_entities - collect file decls"); - CheckerContext ctx = make_checker_context(c); + CheckerContext ctx = {}; + init_checker_context(&ctx, c); UntypedExprInfoMap untyped = {}; defer (map_destroy(&untyped)); @@ -6249,7 +6250,8 @@ gb_internal bool check_proc_info(Checker *c, ProcInfo *pi, UntypedExprInfoMap *u } } - CheckerContext ctx = make_checker_context(c); + CheckerContext ctx = {}; + init_checker_context(&ctx, c); defer (destroy_checker_context(&ctx)); reset_checker_context(&ctx, pi->file, untyped); ctx.decl = pi->decl; From 377a76bb15c14fb1d37ddd0facf4d925cec9f8c9 Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Sun, 4 Jan 2026 20:04:57 -0800 Subject: [PATCH 149/766] Update lz4.odin: foreign import for linux --- vendor/compress/lz4/lz4.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vendor/compress/lz4/lz4.odin b/vendor/compress/lz4/lz4.odin index 19476c8c4..f3b0fcb0d 100644 --- a/vendor/compress/lz4/lz4.odin +++ b/vendor/compress/lz4/lz4.odin @@ -4,6 +4,8 @@ package vendor_compress_lz4 when ODIN_OS == .Windows { @(extra_linker_flags="/NODEFAULTLIB:libcmt") foreign import lib { "lib/liblz4_static.lib", "system:ucrt.lib" } +} else { + foreign import lib "system:lz4" } import "core:c" From 5fae3527c14bb7e37812c129a2850212407c36e2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 5 Jan 2026 11:44:52 +0000 Subject: [PATCH 150/766] Implement `LPWSAOVERLAPPED_COMPLETION_ROUTINE` correctly --- core/sys/windows/types.odin | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 21bb2c5c1..b43268c1e 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -151,8 +151,21 @@ LPCOLESTR :: LPCSTR LPFILETIME :: ^FILETIME LPWSABUF :: ^WSABUF -LPWSAOVERLAPPED :: distinct rawptr -LPWSAOVERLAPPED_COMPLETION_ROUTINE :: distinct rawptr +WSAOVERLAPPED :: struct { + Internal: DWORD, + InternalHigh: DWORD, + Offset: DWORD, + OffsetHigh: DWORD, + hEvent: WSAEVENT, +} + +LPWSAOVERLAPPED :: ^WSAOVERLAPPED +LPWSAOVERLAPPED_COMPLETION_ROUTINE :: #type proc "system" ( + dwError: DWORD, + cbTransferred: DWORD, + lpOverlapped: LPWSAOVERLAPPED, + dwFlags: DWORD, +) LPCVOID :: rawptr SCODE :: LONG From 393fec2f668ce2c1c7f2e885ab3e479d34e1e896 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 5 Jan 2026 11:48:19 +0000 Subject: [PATCH 151/766] Move `WSAEVENT` to types.odin --- core/sys/windows/types.odin | 2 ++ core/sys/windows/ws2_32.odin | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index b43268c1e..e1a14fb94 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -151,6 +151,8 @@ LPCOLESTR :: LPCSTR LPFILETIME :: ^FILETIME LPWSABUF :: ^WSABUF +WSAEVENT :: HANDLE + WSAOVERLAPPED :: struct { Internal: DWORD, InternalHigh: DWORD, diff --git a/core/sys/windows/ws2_32.odin b/core/sys/windows/ws2_32.odin index 2c8dbe3b0..ad9089c6e 100644 --- a/core/sys/windows/ws2_32.odin +++ b/core/sys/windows/ws2_32.odin @@ -35,7 +35,6 @@ WSANETWORKEVENTS :: struct { iErrorCode: [FD_MAX_EVENTS]c_int, } -WSAEVENT :: HANDLE WSAID_ACCEPTEX :: GUID{0xb5367df1, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} WSAID_GETACCEPTEXSOCKADDRS :: GUID{0xb5367df2, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} From 91c1950b9f198ab844b83dabb0f381810965a3ce Mon Sep 17 00:00:00 2001 From: ske Date: Wed, 7 Jan 2026 02:19:41 -0300 Subject: [PATCH 152/766] Fix constant conversion checks (#6104) --- src/check_expr.cpp | 23 ++++++----------------- tests/issues/test_issue_6068.odin | 16 ++++++++-------- 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 3b32d734a..2b2ae09cc 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3526,28 +3526,17 @@ gb_internal bool check_cast_internal(CheckerContext *c, Operand *x, Type *type) Type *elem = core_array_type(bt); if (core_type(bt)->kind == Type_Basic) { - if (check_representable_as_constant(c, x->value, type, &x->value)) { - return true; - } - goto check_castable; - } else if (!are_types_identical(elem, bt) && - elem->kind == Type_Basic && - check_representable_as_constant(c, x->value, elem, &x->value)) { - if (check_representable_as_constant(c, x->value, type, &x->value)) { - return true; - } - goto check_castable; + return check_representable_as_constant(c, x->value, type, &x->value) || + (is_type_pointer(type) && check_is_castable_to(c, x, type)); + } else if (!are_types_identical(elem, bt) && elem->kind == Type_Basic) { + return check_representable_as_constant(c, x->value, elem, &x->value) || + (is_type_pointer(elem) && check_is_castable_to(c, x, elem)); } else if (check_is_castable_to(c, x, type)) { x->value = {}; x->mode = Addressing_Value; return true; } - - return false; - } - -check_castable: - if (check_is_castable_to(c, x, type)) { + } else if (check_is_castable_to(c, x, type)) { if (x->mode != Addressing_Constant) { x->mode = Addressing_Value; } else if (is_type_slice(type) && is_type_string(x->type)) { diff --git a/tests/issues/test_issue_6068.odin b/tests/issues/test_issue_6068.odin index 011c95442..88a21ee27 100644 --- a/tests/issues/test_issue_6068.odin +++ b/tests/issues/test_issue_6068.odin @@ -58,14 +58,14 @@ test_issue_6068 :: proc(t: ^testing.T) { testing.expect(t, f64be(-1.234) == check_be) testing.expect(t, cast(f64be)value == check_be) testing.expect(t, cast(f64be)-1.234 == check_be) - testing.expect(t, f64be(int(-1.234)) == check_be) - testing.expect(t, cast(f64be)int(-1.234) == check_be) + testing.expect(t, f64be(f64(-1.234)) == check_be) + testing.expect(t, cast(f64be)f64(-1.234) == check_be) testing.expect(t, f64le(value) == check_le) testing.expect(t, f64le(-1.234) == check_le) testing.expect(t, cast(f64le)value == check_le) testing.expect(t, cast(f64le)-1.234 == check_le) - testing.expect(t, f64le(int(-1.234)) == check_le) - testing.expect(t, cast(f64le)int(-1.234) == check_le) + testing.expect(t, f64le(f64(-1.234)) == check_le) + testing.expect(t, cast(f64le)f64(-1.234) == check_le) testing.expect(t, f64le(reverse) == check_le) testing.expect(t, cast(f64le)reverse == check_le) @@ -74,14 +74,14 @@ test_issue_6068 :: proc(t: ^testing.T) { testing.expect(t, f64be(-1.234) == -1.234) testing.expect(t, cast(f64be)value == -1.234) testing.expect(t, cast(f64be)-1.234 == -1.234) - testing.expect(t, f64be(int(-1.234)) == -1.234) - testing.expect(t, cast(f64be)int(-1.234) == -1.234) + testing.expect(t, f64be(f64(-1.234)) == -1.234) + testing.expect(t, cast(f64be)f64(-1.234) == -1.234) testing.expect(t, f64le(value) == -1.234) testing.expect(t, f64le(-1.234) == -1.234) testing.expect(t, cast(f64le)value == -1.234) testing.expect(t, cast(f64le)-1.234 == -1.234) - testing.expect(t, f64le(int(-1.234)) == -1.234) - testing.expect(t, cast(f64le)int(-1.234) == -1.234) + testing.expect(t, f64le(f64(-1.234)) == -1.234) + testing.expect(t, cast(f64le)f64(-1.234) == -1.234) testing.expect(t, f64le(reverse) == -1.234) testing.expect(t, cast(f64le)reverse == -1.234) } From dc37ff50368f30742f422ea15d6373df67bcb13e Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Wed, 7 Jan 2026 18:44:30 -0500 Subject: [PATCH 153/766] Comments before first emlement not being captured The xml library was not correctly detect that a comment occured before the first element. This addresses the issue, but the comment incorrectly includes --. --- core/encoding/xml/xml_reader.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/encoding/xml/xml_reader.odin b/core/encoding/xml/xml_reader.odin index 99d73670b..5e056177e 100644 --- a/core/encoding/xml/xml_reader.odin +++ b/core/encoding/xml/xml_reader.odin @@ -294,7 +294,7 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha comment := scan_comment(t) or_return if .Intern_Comments in opts.flags { - if len(doc.elements) == 0 { + if doc.element_count == 0 { append(&doc.comments, comment) } else { el := new_element(doc) From 14d63710586ef6ca0096c170cb758ce5ae1fe6c1 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Wed, 7 Jan 2026 19:24:02 -0500 Subject: [PATCH 154/766] Comment includiing -- at end Comments are incorrectly including -- a the end. This was due to the comment slice being returned 2 charachters too long. --- core/encoding/xml/tokenizer.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/encoding/xml/tokenizer.odin b/core/encoding/xml/tokenizer.odin index 71fa0bdf5..d07f41580 100644 --- a/core/encoding/xml/tokenizer.odin +++ b/core/encoding/xml/tokenizer.odin @@ -264,7 +264,7 @@ scan_comment :: proc(t: ^Tokenizer) -> (comment: string, err: Error) { expect(t, .Dash) expect(t, .Gt) - return string(t.src[offset : t.offset - 1]), .None + return string(t.src[offset : t.offset - 3]), .None } // Skip CDATA From d4a21b7573f01a7d28bcdca805f0d6b0360932a8 Mon Sep 17 00:00:00 2001 From: Viktor Date: Thu, 8 Jan 2026 12:01:43 +0000 Subject: [PATCH 155/766] Fix TGA header detection --- core/image/general.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/image/general.odin b/core/image/general.odin index 1662cf14e..779f5d0b1 100644 --- a/core/image/general.odin +++ b/core/image/general.odin @@ -86,7 +86,7 @@ which_bytes :: proc(data: []byte) -> Which_File_Type { return v } get16le :: #force_inline proc(s: ^string) -> u16 { - v := u16(s[0]) | u16(s[1])<<16 + v := u16(s[0]) | u16(s[1])<<8 s^ = s[2:] return v } From 559b75cc817355801e37b218a7639e8de78e6846 Mon Sep 17 00:00:00 2001 From: bogdanov Date: Thu, 8 Jan 2026 18:56:59 +0300 Subject: [PATCH 156/766] Show `-target` flag usage examples in the help --- src/main.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 9a5df8aea..326c4c457 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2971,6 +2971,10 @@ gb_internal int print_show_help(String const arg0, String command, String option if (check) { if (print_flag("-target:")) { print_usage_line(2, "Sets the target for the executable to be built in."); + print_usage_line(2, "Examples:"); + print_usage_line(3, "-target:linux_amd64"); + print_usage_line(3, "-target:windows_amd64"); + print_usage_line(3, "-target:\"?\" for a list"); } if (print_flag("-terse-errors")) { From fb479b3aaec5a9a715bcff7d65498ba18020f4f0 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Thu, 8 Jan 2026 11:34:50 -0500 Subject: [PATCH 157/766] Corrected CRC's CRC's were correct in relation to changes to address comments containing -- at the end. --- tests/core/encoding/xml/test_core_xml.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/core/encoding/xml/test_core_xml.odin b/tests/core/encoding/xml/test_core_xml.odin index 409a8c9c0..23d583e98 100644 --- a/tests/core/encoding/xml/test_core_xml.odin +++ b/tests/core/encoding/xml/test_core_xml.odin @@ -114,7 +114,7 @@ xml_test_entities :: proc(t: ^testing.T) { }, expected_doctype = "html", }, - crc32 = 0x48f41216, + crc32 = 0x98791215, }) } @@ -128,7 +128,7 @@ xml_test_entities_unbox :: proc(t: ^testing.T) { }, expected_doctype = "html", }, - crc32 = 0xd0567818, + crc32 = 0x5fd5ab4e, }) } @@ -142,7 +142,7 @@ xml_test_entities_unbox_decode :: proc(t: ^testing.T) { }, expected_doctype = "html", }, - crc32 = 0x68d2571e, + crc32 = 0x3c0973e2, }) } @@ -298,4 +298,4 @@ doc_to_string :: proc(doc: ^xml.Document) -> (result: string) { print(strings.to_writer(&buf), doc) return strings.clone(strings.to_string(buf)) -} \ No newline at end of file +} From 48fe0e239429e36574825168a5c18774e12ada3d Mon Sep 17 00:00:00 2001 From: konodin Date: Thu, 8 Jan 2026 22:35:40 +0100 Subject: [PATCH 158/766] Fix `EINVAL` binding to IPv6 on FreeBSD --- core/net/socket_freebsd.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/net/socket_freebsd.odin b/core/net/socket_freebsd.odin index 504229e73..fa20742cb 100644 --- a/core/net/socket_freebsd.odin +++ b/core/net/socket_freebsd.odin @@ -391,7 +391,7 @@ _endpoint_to_sockaddr :: proc(ep: Endpoint) -> (sockaddr: freebsd.Socket_Address } case IP6_Address: (cast(^freebsd.Socket_Address_Internet6)(&sockaddr))^ = { - len = size_of(freebsd.Socket_Address_Internet), + len = size_of(freebsd.Socket_Address_Internet6), family = .INET6, port = cast(freebsd.in_port_t)ep.port, addr = transmute(freebsd.IP6_Address)addr, From 9b5090352e9c9e64708769e70660d3bc6df3f28a Mon Sep 17 00:00:00 2001 From: konodin Date: Thu, 8 Jan 2026 23:07:01 +0100 Subject: [PATCH 159/766] Link Curl the same for all UNIX oses --- vendor/curl/curl.odin | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/vendor/curl/curl.odin b/vendor/curl/curl.odin index ce10c443f..41ecbcb75 100644 --- a/vendor/curl/curl.odin +++ b/vendor/curl/curl.odin @@ -14,15 +14,6 @@ when ODIN_OS == .Windows { "system:Ws2_32.lib", "system:iphlpapi.lib", } -} else when ODIN_OS == .Linux { - @(export) - foreign import lib { - "system:curl", - "system:mbedtls", - "system:mbedx509", - "system:mbedcrypto", - "system:z", - } } else when ODIN_OS == .Darwin { @(export) foreign import lib { @@ -32,6 +23,15 @@ when ODIN_OS == .Windows { "system:z", "system:SystemConfiguration.framework", } +} else { + @(export) + foreign import lib { + "system:curl", + "system:mbedtls", + "system:mbedx509", + "system:mbedcrypto", + "system:z", + } } off_t :: i64 From bf7c92bf0909aaf49a8590570085e1c6a1787d00 Mon Sep 17 00:00:00 2001 From: Tohei Ichikawa Date: Sat, 10 Jan 2026 03:02:25 -0500 Subject: [PATCH 160/766] Fix assertion error when imported proc groups are passed as proc arguments --- src/check_expr.cpp | 6 +++++- tests/internal/test_imported_proc_groups.odin | 10 ++++++++++ .../internal/test_imported_proc_groups/proc_group.odin | 4 ++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/internal/test_imported_proc_groups.odin create mode 100644 tests/internal/test_imported_proc_groups/proc_group.odin diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 2b2ae09cc..60fae74c6 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1133,7 +1133,11 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ x.mode = Addressing_Value; x.type = t; if (check_is_assignable_to(c, &x, type)) { - add_entity_use(c, operand->expr, e); + if (operand->expr->kind == Ast_SelectorExpr) { + add_entity_use(c, operand->expr->SelectorExpr.selector, e); + } else { + add_entity_use(c, operand->expr, e); + } good = true; break; } diff --git a/tests/internal/test_imported_proc_groups.odin b/tests/internal/test_imported_proc_groups.odin new file mode 100644 index 000000000..3f5b01fb3 --- /dev/null +++ b/tests/internal/test_imported_proc_groups.odin @@ -0,0 +1,10 @@ +package test_internal + +import "core:testing" +import "test_imported_proc_groups" + +@test +test_ :: proc(t: ^testing.T) { + use_proc :: proc(proc()) { } + use_proc(test_imported_proc_groups.proc_group) +} diff --git a/tests/internal/test_imported_proc_groups/proc_group.odin b/tests/internal/test_imported_proc_groups/proc_group.odin new file mode 100644 index 000000000..59519ab9c --- /dev/null +++ b/tests/internal/test_imported_proc_groups/proc_group.odin @@ -0,0 +1,4 @@ +package test_imported_proc_groups + +proc_group :: proc{empty_proc} +empty_proc :: proc() { } From c8f2603d3eb6f47ab772f83ecd0a5758d18e7b59 Mon Sep 17 00:00:00 2001 From: Tohei Ichikawa Date: Sat, 10 Jan 2026 03:35:33 -0500 Subject: [PATCH 161/766] Fix test name, add PR link, use tabs --- tests/internal/test_imported_proc_groups.odin | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/internal/test_imported_proc_groups.odin b/tests/internal/test_imported_proc_groups.odin index 3f5b01fb3..e91af4bf5 100644 --- a/tests/internal/test_imported_proc_groups.odin +++ b/tests/internal/test_imported_proc_groups.odin @@ -3,8 +3,9 @@ package test_internal import "core:testing" import "test_imported_proc_groups" +// https://github.com/odin-lang/Odin/pull/6119 @test -test_ :: proc(t: ^testing.T) { - use_proc :: proc(proc()) { } - use_proc(test_imported_proc_groups.proc_group) +test_use_imported_proc_group_as_argument :: proc(t: ^testing.T) { + use_proc :: proc(proc()) { } + use_proc(test_imported_proc_groups.proc_group) } From 3e31055ca7dbfa42998f7f6b42c45d15b967622e Mon Sep 17 00:00:00 2001 From: ske Date: Sat, 10 Jan 2026 10:46:53 -0300 Subject: [PATCH 162/766] Fix regression in #6118 --- src/check_expr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 2b2ae09cc..98185b0d3 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3528,7 +3528,7 @@ gb_internal bool check_cast_internal(CheckerContext *c, Operand *x, Type *type) if (core_type(bt)->kind == Type_Basic) { return check_representable_as_constant(c, x->value, type, &x->value) || (is_type_pointer(type) && check_is_castable_to(c, x, type)); - } else if (!are_types_identical(elem, bt) && elem->kind == Type_Basic) { + } else if (!are_types_identical(elem, bt) && elem->kind == Type_Basic && x->type->kind == Type_Basic) { return check_representable_as_constant(c, x->value, elem, &x->value) || (is_type_pointer(elem) && check_is_castable_to(c, x, elem)); } else if (check_is_castable_to(c, x, type)) { From 5938c783a69e826cd8c113521a3950a6bacdb9aa Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 11 Jan 2026 18:54:46 +0000 Subject: [PATCH 163/766] Fix `#type` not being handled as in normal expressions --- src/check_expr.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 3b32d734a..c4f235b51 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -11565,6 +11565,15 @@ gb_internal ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast return kind; case_end; + case_ast_node(ht, HelperType, node); + Type *type = check_type(c, ht->type); + if (type != nullptr && type != t_invalid) { + o->mode = Addressing_Type; + o->type = type; + } + return kind; + case_end; + case_ast_node(i, Implicit, node); switch (i->kind) { case Token_context: From a6ec199a52ae83603921fcf948fdf45e327fd17d Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:04:51 +0100 Subject: [PATCH 164/766] ci: don't check BSD or ARM targets on Linux amd64 because they have their own run --- .github/workflows/ci.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e6219f370..0d2f3f1ca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -156,18 +156,14 @@ jobs: - name: Check benchmarks run: ./odin check tests/benchmark -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -no-entry-point + - name: Odin check examples/all for Linux i386 if: matrix.os == 'ubuntu-latest' run: ./odin check examples/all -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -target:linux_i386 - - name: Odin check examples/all for Linux arm64 - if: matrix.os == 'ubuntu-latest' - run: ./odin check examples/all -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -target:linux_arm64 - - name: Odin check examples/all for FreeBSD amd64 - if: matrix.os == 'ubuntu-latest' - run: ./odin check examples/all -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -target:freebsd_amd64 - name: Odin check examples/all for OpenBSD amd64 if: matrix.os == 'ubuntu-latest' run: ./odin check examples/all -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -target:openbsd_amd64 + - name: Odin check examples/all for js_wasm32 if: matrix.os == 'ubuntu-latest' run: ./odin check examples/all -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -no-entry-point -target:js_wasm32 @@ -178,12 +174,6 @@ jobs: - name: Odin check examples/all/sdl3 for Linux i386 if: matrix.os == 'ubuntu-latest' run: ./odin check examples/all/sdl3 -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -no-entry-point -target:linux_i386 - - name: Odin check examples/all/sdl3 for Linux arm64 - if: matrix.os == 'ubuntu-latest' - run: ./odin check examples/all/sdl3 -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -no-entry-point -target:linux_arm64 - - name: Odin check examples/all/sdl3 for FreeBSD amd64 - if: matrix.os == 'ubuntu-latest' - run: ./odin check examples/all/sdl3 -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -no-entry-point -target:freebsd_amd64 - name: Odin check examples/all/sdl3 for OpenBSD amd64 if: matrix.os == 'ubuntu-latest' run: ./odin check examples/all/sdl3 -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -no-entry-point -target:openbsd_amd64 From c10771305d91b966f7520b830c398abffe4e9e1d Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:07:03 +0100 Subject: [PATCH 165/766] net: implement OpenBSD and NetBSD support & add stubs for other targets & cleanup --- core/flags/constants.odin | 3 +- core/flags/errors.odin | 8 + core/flags/errors_bsd.odin | 9 - core/flags/errors_nonbsd.odin | 12 -- core/flags/internal_rtti.odin | 14 +- core/flags/internal_rtti_nonbsd.odin | 32 --- core/net/addr.odin | 51 +++-- core/net/common.odin | 10 +- core/net/dns.odin | 182 +++++++++--------- core/net/dns_os.odin | 24 +++ core/net/dns_others.odin | 12 ++ core/net/dns_unix.odin | 13 +- core/net/dns_windows.odin | 22 ++- core/net/errors.odin | 10 + core/net/errors_others.odin | 9 +- .../{errors_darwin.odin => errors_posix.odin} | 2 +- core/net/errors_windows.odin | 4 +- core/net/interface_others.odin | 11 ++ ...rface_darwin.odin => interface_posix.odin} | 59 +++--- core/net/socket.odin | 30 ++- core/net/socket_freebsd.odin | 58 +++--- core/net/socket_linux.odin | 47 +++-- core/net/socket_others.odin | 105 ++++++++++ .../{socket_darwin.odin => socket_posix.odin} | 47 +++-- core/net/socket_windows.odin | 73 +++---- tests/core/net/test_core_net.odin | 2 - 26 files changed, 519 insertions(+), 330 deletions(-) delete mode 100644 core/flags/errors_bsd.odin delete mode 100644 core/flags/errors_nonbsd.odin delete mode 100644 core/flags/internal_rtti_nonbsd.odin create mode 100644 core/net/dns_os.odin create mode 100644 core/net/dns_others.odin rename core/net/{errors_darwin.odin => errors_posix.odin} (99%) create mode 100644 core/net/interface_others.odin rename core/net/{interface_darwin.odin => interface_posix.odin} (79%) create mode 100644 core/net/socket_others.odin rename core/net/{socket_darwin.odin => socket_posix.odin} (90%) diff --git a/core/flags/constants.odin b/core/flags/constants.odin index dc2663e2a..154ed3cec 100644 --- a/core/flags/constants.odin +++ b/core/flags/constants.odin @@ -11,8 +11,7 @@ NO_CORE_NAMED_TYPES :: #config(ODIN_CORE_FLAGS_NO_CORE_NAMED_TYPES, false) IMPORTING_TIME :: #config(ODIN_CORE_FLAGS_USE_TIME, time.IS_SUPPORTED) // Override support for parsing `net` types. -// TODO: Update this when the BSDs are supported. -IMPORTING_NET :: #config(ODIN_CORE_FLAGS_USE_NET, ODIN_OS == .Windows || ODIN_OS == .Linux || ODIN_OS == .Darwin || ODIN_OS == .FreeBSD) +IMPORTING_NET :: #config(ODIN_CORE_FLAGS_USE_NET, ODIN_OS == .Windows || ODIN_OS == .Linux || ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD) TAG_ARGS :: "args" SUBTAG_NAME :: "name" diff --git a/core/flags/errors.odin b/core/flags/errors.odin index 3d34a95d3..e9b2e18c8 100644 --- a/core/flags/errors.odin +++ b/core/flags/errors.odin @@ -1,5 +1,7 @@ package flags +import "base:runtime" +import "core:net" import "core:os" Parse_Error_Reason :: enum { @@ -24,6 +26,12 @@ Parse_Error :: struct { message: string, } +Unified_Parse_Error_Reason :: union #shared_nil { + Parse_Error_Reason, + runtime.Allocator_Error, + net.Parse_Endpoint_Error, +} + // Raised during parsing. // Provides more granular information than what just a string could hold. Open_File_Error :: struct { diff --git a/core/flags/errors_bsd.odin b/core/flags/errors_bsd.odin deleted file mode 100644 index 4d98d2ee4..000000000 --- a/core/flags/errors_bsd.odin +++ /dev/null @@ -1,9 +0,0 @@ -#+build netbsd, openbsd -package flags - -import "base:runtime" - -Unified_Parse_Error_Reason :: union #shared_nil { - Parse_Error_Reason, - runtime.Allocator_Error, -} diff --git a/core/flags/errors_nonbsd.odin b/core/flags/errors_nonbsd.odin deleted file mode 100644 index 28912b57f..000000000 --- a/core/flags/errors_nonbsd.odin +++ /dev/null @@ -1,12 +0,0 @@ -#+build !netbsd -#+build !openbsd -package flags - -import "base:runtime" -import "core:net" - -Unified_Parse_Error_Reason :: union #shared_nil { - Parse_Error_Reason, - runtime.Allocator_Error, - net.Parse_Endpoint_Error, -} diff --git a/core/flags/internal_rtti.odin b/core/flags/internal_rtti.odin index a1b050597..b3880afa0 100644 --- a/core/flags/internal_rtti.odin +++ b/core/flags/internal_rtti.odin @@ -5,6 +5,7 @@ import "base:intrinsics" import "base:runtime" import "core:fmt" import "core:mem" +import "core:net" import "core:os" import "core:reflect" import "core:strconv" @@ -310,7 +311,18 @@ parse_and_set_pointer_by_named_type :: proc(ptr: rawptr, str: string, data_type: } when IMPORTING_NET { - if try_net_parse_workaround(data_type, str, ptr, out_error) { + if data_type == net.Host_Or_Endpoint { + addr, net_error := net.parse_hostname_or_endpoint(str) + if net_error != nil { + // We pass along `net.Error` here. + out_error^ = Parse_Error { + net_error, + "Invalid Host/Endpoint.", + } + return + } + + (cast(^net.Host_Or_Endpoint)ptr)^ = addr return } } diff --git a/core/flags/internal_rtti_nonbsd.odin b/core/flags/internal_rtti_nonbsd.odin deleted file mode 100644 index e1286186b..000000000 --- a/core/flags/internal_rtti_nonbsd.odin +++ /dev/null @@ -1,32 +0,0 @@ -#+private -#+build !netbsd -#+build !openbsd -package flags - -import "core:net" - -// This proc exists purely as a workaround for import restrictions. -// Returns true if caller should return early. -try_net_parse_workaround :: #force_inline proc ( - data_type: typeid, - str: string, - ptr: rawptr, - out_error: ^Error, -) -> bool { - if data_type == net.Host_Or_Endpoint { - addr, net_error := net.parse_hostname_or_endpoint(str) - if net_error != nil { - // We pass along `net.Error` here. - out_error^ = Parse_Error { - net_error, - "Invalid Host/Endpoint.", - } - return true - } - - (cast(^net.Host_Or_Endpoint)ptr)^ = addr - return true - } - - return false -} diff --git a/core/net/addr.odin b/core/net/addr.odin index 6e2881ac8..a3fa02cce 100644 --- a/core/net/addr.odin +++ b/core/net/addr.odin @@ -1,4 +1,3 @@ -#+build windows, linux, darwin, freebsd package net /* @@ -22,7 +21,6 @@ package net import "core:strconv" import "core:strings" -import "core:fmt" /* Expects an IPv4 address with no leading or trailing whitespace: @@ -473,13 +471,20 @@ join_port :: proc(address_or_host: string, port: int, allocator := context.alloc addr := parse_address(addr_or_host) if addr == nil { // hostname - fmt.sbprintf(&b, "%v:%v", addr_or_host, port) + strings.write_string(&b, addr_or_host) + strings.write_string(&b, ":") + strings.write_int(&b, port) } else { switch _ in addr { case IP4_Address: - fmt.sbprintf(&b, "%v:%v", address_to_string(addr), port) + strings.write_string(&b, address_to_string(addr)) + strings.write_string(&b, ":") + strings.write_int(&b, port) case IP6_Address: - fmt.sbprintf(&b, "[%v]:%v", address_to_string(addr), port) + strings.write_string(&b, "[") + strings.write_string(&b, address_to_string(addr)) + strings.write_string(&b, "]:") + strings.write_int(&b, port) } } return strings.to_string(b) @@ -509,7 +514,13 @@ address_to_string :: proc(addr: Address, allocator := context.temp_allocator) -> b := strings.builder_make(allocator) switch v in addr { case IP4_Address: - fmt.sbprintf(&b, "%v.%v.%v.%v", v[0], v[1], v[2], v[3]) + strings.write_uint(&b, uint(v[0])) + strings.write_byte(&b, '.') + strings.write_uint(&b, uint(v[1])) + strings.write_byte(&b, '.') + strings.write_uint(&b, uint(v[2])) + strings.write_byte(&b, '.') + strings.write_uint(&b, uint(v[3])) case IP6_Address: // First find the longest run of zeroes. Zero_Run :: struct { @@ -563,25 +574,33 @@ address_to_string :: proc(addr: Address, allocator := context.temp_allocator) -> for val, i in v { if best.start == i || best.end == i { // For the left and right side of the best zero run, print a `:`. - fmt.sbprint(&b, ":") + strings.write_string(&b, ":") } else if i < best.start { /* If we haven't made it to the best run yet, print the digit. Make sure we only print a `:` after the digit if it's not immediately followed by the run's own leftmost `:`. */ - fmt.sbprintf(&b, "%x", val) + + buf: [32]byte + str := strconv.write_bits(buf[:], u64(val), 16, false, size_of(val), strconv.digits, {}) + strings.write_string(&b, str) + if i < best.start - 1 { - fmt.sbprintf(&b, ":") + strings.write_string(&b, ":") } } else if i > best.end { /* If there are any digits after the zero run, print them. But don't print the `:` at the end of the IP number. */ - fmt.sbprintf(&b, "%x", val) + + buf: [32]byte + str := strconv.write_bits(buf[:], u64(val), 16, false, size_of(val), strconv.digits, {}) + strings.write_string(&b, str) + if i != 7 { - fmt.sbprintf(&b, ":") + strings.write_string(&b, ":") } } } @@ -598,8 +617,14 @@ endpoint_to_string :: proc(ep: Endpoint, allocator := context.temp_allocator) -> s := address_to_string(ep.address, context.temp_allocator) b := strings.builder_make(allocator) switch a in ep.address { - case IP4_Address: fmt.sbprintf(&b, "%v:%v", s, ep.port) - case IP6_Address: fmt.sbprintf(&b, "[%v]:%v", s, ep.port) + case IP4_Address: + strings.write_string(&b, s) + strings.write_int(&b, ep.port) + case IP6_Address: + strings.write_string(&b, "[") + strings.write_string(&b, s) + strings.write_string(&b, "]:") + strings.write_int(&b, ep.port) } return strings.to_string(b) } diff --git a/core/net/common.odin b/core/net/common.odin index 70523050f..2758a7359 100644 --- a/core/net/common.odin +++ b/core/net/common.odin @@ -1,4 +1,3 @@ -#+build windows, linux, darwin, freebsd package net /* @@ -91,6 +90,7 @@ Parse_Endpoint_Error :: enum u32 { Resolve_Error :: enum u32 { None = 0, Unable_To_Resolve = 1, + Allocation_Failure, } DNS_Error :: enum u32 { @@ -144,11 +144,11 @@ Address :: union {IP4_Address, IP6_Address} IP4_Loopback :: IP4_Address{127, 0, 0, 1} IP6_Loopback :: IP6_Address{0, 0, 0, 0, 0, 0, 0, 1} -IP4_Any := IP4_Address{} -IP6_Any := IP6_Address{} +IP4_Any :: IP4_Address{} +IP6_Any :: IP6_Address{} -IP4_mDNS_Broadcast := Endpoint{address=IP4_Address{224, 0, 0, 251}, port=5353} -IP6_mDNS_Broadcast := Endpoint{address=IP6_Address{65282, 0, 0, 0, 0, 0, 0, 251}, port = 5353} +IP4_mDNS_Broadcast :: Endpoint{address=IP4_Address{224, 0, 0, 251}, port=5353} +IP6_mDNS_Broadcast :: Endpoint{address=IP6_Address{65282, 0, 0, 0, 0, 0, 0, 251}, port = 5353} Endpoint :: struct { address: Address, diff --git a/core/net/dns.odin b/core/net/dns.odin index 540991fe7..983f82681 100644 --- a/core/net/dns.odin +++ b/core/net/dns.odin @@ -1,4 +1,3 @@ -#+build windows, linux, darwin, freebsd package net /* @@ -22,13 +21,18 @@ package net Haesbaert: Security fixes */ -@(require) import "base:runtime" +@(require) +import "base:runtime" + +import "core:bufio" +import "core:io" +import "core:math/rand" import "core:mem" import "core:strings" import "core:time" -import "core:os" -import "core:math/rand" -@(require) import "core:sync" + +@(require) +import "core:sync" dns_config_initialized: sync.Once when ODIN_OS == .Windows { @@ -42,20 +46,12 @@ when ODIN_OS == .Windows { hosts_file = "/etc/hosts", } } else { - #panic("Please add a configuration for this OS.") + DEFAULT_DNS_CONFIGURATION :: DNS_Configuration{} } -/* - Replaces environment placeholders in `dns_configuration`. Only necessary on Windows. - Is automatically called, once, by `get_dns_records_*`. -*/ -@(private) init_dns_configuration :: proc() { when ODIN_OS == .Windows { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - val := os.replace_environment_placeholders(dns_configuration.hosts_file, context.temp_allocator) - copy(dns_configuration.hosts_file_buf[:], val) - dns_configuration.hosts_file = string(dns_configuration.hosts_file_buf[:len(val)]) + _init_dns_configuration() } } @@ -178,9 +174,7 @@ resolve_ip6 :: proc(hostname_and_maybe_port: string) -> (ep6: Endpoint, err: Net See `destroy_records`. */ get_dns_records_from_os :: proc(hostname: string, type: DNS_Record_Type, allocator := context.allocator) -> (records: []DNS_Record, err: DNS_Error) { - when ODIN_OS == .Windows { - sync.once_do(&dns_config_initialized, init_dns_configuration) - } + init_dns_configuration() return _get_dns_records_os(hostname, type, allocator) } @@ -196,51 +190,14 @@ get_dns_records_from_os :: proc(hostname: string, type: DNS_Record_Type, allocat See `destroy_records`. */ get_dns_records_from_nameservers :: proc(hostname: string, type: DNS_Record_Type, name_servers: []Endpoint, host_overrides: []DNS_Record, allocator := context.allocator) -> (records: []DNS_Record, err: DNS_Error) { - when ODIN_OS == .Windows { - sync.once_do(&dns_config_initialized, init_dns_configuration) - } + init_dns_configuration() context.allocator = allocator - if type != .SRV { - // NOTE(tetra): 'hostname' can contain underscores when querying SRV records - ok := validate_hostname(hostname) - if !ok { - return nil, .Invalid_Hostname_Error - } - } + id := u16be(rand.uint32()) + dns_packet_buf: [DNS_PACKET_MIN_LEN]byte = --- + dns_packet := make_dns_packet(dns_packet_buf[:], id, hostname, type) or_return - hdr := DNS_Header{ - id = u16be(rand.uint32()), - is_response = false, - opcode = 0, - is_authoritative = false, - is_truncated = false, - is_recursion_desired = true, - is_recursion_available = false, - response_code = DNS_Response_Code.No_Error, - } - - id, bits := pack_dns_header(hdr) - dns_hdr := [6]u16be{} - dns_hdr[0] = id - dns_hdr[1] = bits - dns_hdr[2] = 1 - - dns_query := [2]u16be{ u16be(type), 1 } - - output := [(size_of(u16be) * 6) + NAME_MAX + (size_of(u16be) * 2)]u8{} - b := strings.builder_from_slice(output[:]) - - strings.write_bytes(&b, mem.slice_data_cast([]u8, dns_hdr[:])) - ok := encode_hostname(&b, hostname) - if !ok { - return nil, .Invalid_Hostname_Error - } - strings.write_bytes(&b, mem.slice_data_cast([]u8, dns_query[:])) - - dns_packet := output[:strings.builder_len(b)] - - dns_response_buf := [4096]u8{} + dns_response_buf: [4096]u8 = --- dns_response: []u8 for name_server in name_servers { conn, sock_err := make_unbound_udp_socket(family_from_endpoint(name_server)) @@ -283,6 +240,42 @@ get_dns_records_from_nameservers :: proc(hostname: string, type: DNS_Record_Type return } +DNS_PACKET_MIN_LEN :: (size_of(u16be) * 6) + NAME_MAX + (size_of(u16be) * 2) + +make_dns_packet :: proc(buf: []byte, id: u16be, hostname: string, type: DNS_Record_Type) -> (packet: []byte, err: DNS_Error) { + assert(len(buf) >= DNS_PACKET_MIN_LEN) + + hdr := DNS_Header{ + id = id, + is_response = false, + opcode = 0, + is_authoritative = false, + is_truncated = false, + is_recursion_desired = true, + is_recursion_available = false, + response_code = DNS_Response_Code.No_Error, + } + + _, bits := pack_dns_header(hdr) + dns_hdr := [6]u16be{} + dns_hdr[0] = id + dns_hdr[1] = bits + dns_hdr[2] = 1 + + dns_query := [2]u16be{ u16be(type), 1 } + + b := strings.builder_from_slice(buf[:]) + + strings.write_bytes(&b, mem.slice_data_cast([]u8, dns_hdr[:])) + ok := encode_hostname(&b, hostname) + if !ok { + return nil, .Invalid_Hostname_Error + } + strings.write_bytes(&b, mem.slice_data_cast([]u8, dns_query[:])) + + return buf[:strings.builder_len(b)], nil +} + // `records` slice is also destroyed. destroy_dns_records :: proc(records: []DNS_Record, allocator := context.allocator) { context.allocator = allocator @@ -364,13 +357,8 @@ unpack_dns_header :: proc(id: u16be, bits: u16be) -> (hdr: DNS_Header) { return hdr } -load_resolv_conf :: proc(resolv_conf_path: string, allocator := context.allocator) -> (name_servers: []Endpoint, ok: bool) { - context.allocator = allocator - - res := os.read_entire_file_from_filename(resolv_conf_path) or_return - defer delete(res) - resolv_str := string(res) - +parse_resolv_conf :: proc(resolv_str: string, allocator := context.allocator) -> (name_servers: []Endpoint) { + resolv_str := resolv_str id_str := "nameserver" id_len := len(id_str) @@ -401,41 +389,51 @@ load_resolv_conf :: proc(resolv_conf_path: string, allocator := context.allocato append(&_name_servers, endpoint) } - return _name_servers[:], true + return _name_servers[:] } -load_hosts :: proc(hosts_file_path: string, allocator := context.allocator) -> (hosts: []DNS_Host_Entry, ok: bool) { - context.allocator = allocator +parse_hosts :: proc(stream: io.Stream, allocator := context.allocator) -> (hosts: []DNS_Host_Entry, ok: bool) { + s := bufio.scanner_init(&{}, stream, allocator) + defer bufio.scanner_destroy(s) - res := os.read_entire_file_from_filename(hosts_file_path, allocator) or_return - defer delete(res) + resize(&s.buf, 256) - _hosts := make([dynamic]DNS_Host_Entry, 0, allocator) - hosts_str := string(res) - for line in strings.split_lines_iterator(&hosts_str) { - if len(line) == 0 || line[0] == '#' { - continue + _hosts: [dynamic]DNS_Host_Entry + _hosts.allocator = allocator + defer if !ok { + for host in _hosts { + delete(host.name, allocator) } + delete(_hosts) + } - splits := strings.fields(line) - defer delete(splits) + for bufio.scanner_scan(s) { + line := bufio.scanner_text(s) - (len(splits) >= 2) or_continue + line, _, _ = strings.partition(line, "#") + (len(line) > 0) or_continue + + ip_str := strings.fields_iterator(&line) or_continue - ip_str := splits[0] addr := parse_address(ip_str) - if addr == nil { - continue - } + (addr != nil) or_continue - for hostname in splits[1:] { - if len(hostname) != 0 { - append(&_hosts, DNS_Host_Entry{hostname, addr}) - } + for hostname in strings.fields_iterator(&line) { + (len(hostname) > 0) or_continue + + clone, alloc_err := strings.clone(hostname, allocator) + if alloc_err != nil { return } + + _, alloc_err = append(&_hosts, DNS_Host_Entry{clone, addr}) + if alloc_err != nil { return } } } - return _hosts[:], true + if bufio.scanner_error(s) != nil { return } + + hosts = _hosts[:] + ok = true + return } // www.google.com -> 3www6google3com0 @@ -594,7 +592,7 @@ decode_hostname :: proc(packet: []u8, start_idx: int, allocator := context.alloc // Uses RFC 952 & RFC 1123 validate_hostname :: proc(hostname: string) -> (ok: bool) { - if len(hostname) > 255 || len(hostname) == 0 { + if len(hostname) > NAME_MAX || len(hostname) == 0 { return } @@ -604,7 +602,7 @@ validate_hostname :: proc(hostname: string) -> (ok: bool) { _hostname := hostname for label in strings.split_iterator(&_hostname, ".") { - if len(label) > 63 || len(label) == 0 { + if len(label) > LABEL_MAX || len(label) == 0 { return } @@ -868,4 +866,4 @@ parse_response :: proc(response: []u8, filter: DNS_Record_Type = nil, allocator xid = hdr.id return _records[:], xid, true -} \ No newline at end of file +} diff --git a/core/net/dns_os.odin b/core/net/dns_os.odin new file mode 100644 index 000000000..19db0097a --- /dev/null +++ b/core/net/dns_os.odin @@ -0,0 +1,24 @@ +#+build darwin, freebsd, openbsd, netbsd, linux, windows, wasi +#+private +package net + +import "core:os" + +load_resolv_conf :: proc(resolv_conf_path: string, allocator := context.allocator) -> (name_servers: []Endpoint, ok: bool) { + context.allocator = allocator + + res := os.read_entire_file_from_filename(resolv_conf_path) or_return + defer delete(res) + resolv_str := string(res) + + return parse_resolv_conf(resolv_str), true +} + +load_hosts :: proc(hosts_file_path: string, allocator := context.allocator) -> (hosts: []DNS_Host_Entry, ok: bool) { + hosts_file, err := os.open(hosts_file_path) + if err != nil { return } + defer os.close(hosts_file) + + return parse_hosts(os.stream_from_handle(hosts_file), allocator) +} + diff --git a/core/net/dns_others.odin b/core/net/dns_others.odin new file mode 100644 index 000000000..842e833aa --- /dev/null +++ b/core/net/dns_others.odin @@ -0,0 +1,12 @@ +#+build !windows +#+build !linux +#+build !darwin +#+build !freebsd +#+build !netbsd +#+build !openbsd +package net + +@(private) +_get_dns_records_os :: proc(hostname: string, type: DNS_Record_Type, allocator := context.allocator) -> (records: []DNS_Record, err: DNS_Error) { + return +} diff --git a/core/net/dns_unix.odin b/core/net/dns_unix.odin index fbc1909cd..be95b8341 100644 --- a/core/net/dns_unix.odin +++ b/core/net/dns_unix.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, freebsd +#+build linux, darwin, freebsd, openbsd, netbsd package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. @@ -42,14 +42,19 @@ _get_dns_records_os :: proc(hostname: string, type: DNS_Record_Type, allocator : } hosts, hosts_ok := load_hosts(dns_configuration.hosts_file) - defer delete(hosts) if !hosts_ok { return nil, .Invalid_Hosts_Config_Error } + defer { + for h in hosts { + delete(h.name) + } + delete(hosts) + } host_overrides := make([dynamic]DNS_Record) for host in hosts { - if strings.compare(host.name, hostname) != 0 { + if host.name != hostname { continue } @@ -79,4 +84,4 @@ _get_dns_records_os :: proc(hostname: string, type: DNS_Record_Type, allocator : } return get_dns_records_from_nameservers(hostname, type, name_servers, host_overrides[:]) -} \ No newline at end of file +} diff --git a/core/net/dns_windows.odin b/core/net/dns_windows.odin index b1e7da97d..393df5fa7 100644 --- a/core/net/dns_windows.odin +++ b/core/net/dns_windows.odin @@ -20,11 +20,29 @@ package net Feoramund: FreeBSD platform code */ -import "core:strings" +import "base:runtime" + import "core:mem" +import "core:os" +import "core:strings" +import "core:sync" import win "core:sys/windows" +/* + Replaces environment placeholders in `dns_configuration`. Only necessary on Windows. + Is automatically called, once, by `get_dns_records_*`. +*/ +@(private) +_init_dns_configuration :: proc() { + sync.once_do(&dns_config_initialized, proc() { + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() + val := os.replace_environment_placeholders(dns_configuration.hosts_file, context.temp_allocator) + copy(dns_configuration.hosts_file_buf[:], val) + dns_configuration.hosts_file = string(dns_configuration.hosts_file_buf[:len(val)]) + }) +} + @(private) _get_dns_records_os :: proc(hostname: string, type: DNS_Record_Type, allocator := context.allocator) -> (records: []DNS_Record, err: DNS_Error) { context.allocator = allocator @@ -171,4 +189,4 @@ _get_dns_records_os :: proc(hostname: string, type: DNS_Record_Type, allocator : records = recs[:] return -} \ No newline at end of file +} diff --git a/core/net/errors.odin b/core/net/errors.odin index de53640fc..28153375c 100644 --- a/core/net/errors.odin +++ b/core/net/errors.odin @@ -139,6 +139,11 @@ Accept_Error :: enum i32 { Unknown, } +Recv_Error :: union #shared_nil { + TCP_Recv_Error, + UDP_Recv_Error, +} + TCP_Recv_Error :: enum i32 { None, // No network connection, or the network stack is not initialized. @@ -187,6 +192,11 @@ UDP_Recv_Error :: enum i32 { Unknown, } +Send_Error :: union #shared_nil { + TCP_Send_Error, + UDP_Send_Error, +} + TCP_Send_Error :: enum i32 { None, // No network connection, or the network stack is not initialized. diff --git a/core/net/errors_others.odin b/core/net/errors_others.odin index b80ead79c..3a752d58e 100644 --- a/core/net/errors_others.odin +++ b/core/net/errors_others.odin @@ -2,6 +2,8 @@ #+build !linux #+build !freebsd #+build !windows +#+build !netbsd +#+build !openbsd package net @(private="file", thread_local) @@ -18,10 +20,3 @@ _last_platform_error_string :: proc() -> string { _set_last_platform_error :: proc(err: i32) { _last_error = err } - -Parse_Endpoint_Error :: enum u32 { - None = 0, - Bad_Port = 1, - Bad_Address, - Bad_Hostname, -} \ No newline at end of file diff --git a/core/net/errors_darwin.odin b/core/net/errors_posix.odin similarity index 99% rename from core/net/errors_darwin.odin rename to core/net/errors_posix.odin index a35e96bc0..b59cbc30b 100644 --- a/core/net/errors_darwin.odin +++ b/core/net/errors_posix.odin @@ -1,4 +1,4 @@ -#+build darwin +#+build darwin, netbsd, openbsd package net /* diff --git a/core/net/errors_windows.odin b/core/net/errors_windows.odin index 83c45ee7f..6d3724c82 100644 --- a/core/net/errors_windows.odin +++ b/core/net/errors_windows.odin @@ -63,7 +63,7 @@ _dial_error :: proc() -> Dial_Error { return .Already_Connecting case .WSAEADDRNOTAVAIL, .WSAEAFNOSUPPORT, .WSAEFAULT, .WSAENOTSOCK, .WSAEINPROGRESS, .WSAEINVAL: return .Invalid_Argument - case .WSAECONNREFUSED: + case .WSAECONNREFUSED, .CONNECTION_REFUSED: return .Refused case .WSAEISCONN: return .Already_Connected @@ -122,7 +122,7 @@ _accept_error :: proc() -> Accept_Error { return .Aborted case .WSAEFAULT, .WSAEINPROGRESS, .WSAENOTSOCK: return .Invalid_Argument - case .WSAEINTR: + case .WSAEINTR, .OPERATION_ABORTED: return .Interrupted case .WSAEINVAL: return .Not_Listening diff --git a/core/net/interface_others.odin b/core/net/interface_others.odin new file mode 100644 index 000000000..9a8a141df --- /dev/null +++ b/core/net/interface_others.odin @@ -0,0 +1,11 @@ +#+build !darwin +#+build !linux +#+build !freebsd +#+build !windows +#+build !netbsd +#+build !openbsd +package net + +_enumerate_interfaces :: proc(allocator := context.allocator) -> (interfaces: []Network_Interface, err: Interfaces_Error) { + return +} diff --git a/core/net/interface_darwin.odin b/core/net/interface_posix.odin similarity index 79% rename from core/net/interface_darwin.odin rename to core/net/interface_posix.odin index f18cff995..202951b29 100644 --- a/core/net/interface_darwin.odin +++ b/core/net/interface_posix.odin @@ -1,4 +1,4 @@ -#+build darwin +#+build darwin, openbsd, netbsd package net /* @@ -117,32 +117,47 @@ IF_Flag :: enum u32 { BROADCAST, DEBUG, LOOPBACK, - POINTTOPOINT, - NOTRAILERS, - RUNNING, - NOARP, - PROMISC, - ALLMULTI, - OACTIVE, - SIMPLEX, - LINK0, - LINK1, - LINK2, - MULTICAST, + // NOTE: different order on other BSDs but we don't even need these. + // POINTTOPOINT, + // NOTRAILERS, + // RUNNING, + // NOARP, + // PROMISC, + // ALLMULTI, + // OACTIVE, + // SIMPLEX, + // LINK0, + // LINK1, + // LINK2, + // MULTICAST, } @(private) IF_Flags :: bit_set[IF_Flag; u32] -@(private) -ifaddrs :: struct { - next: ^ifaddrs, - name: cstring, - flags: IF_Flags, - addr: ^posix.sockaddr, - netmask: ^posix.sockaddr, - dstaddr: ^posix.sockaddr, - data: rawptr, +when ODIN_OS == .Darwin || ODIN_OS == .OpenBSD { + @(private) + ifaddrs :: struct { + next: ^ifaddrs, + name: cstring, + flags: IF_Flags, + addr: ^posix.sockaddr, + netmask: ^posix.sockaddr, + dstaddr: ^posix.sockaddr, + data: rawptr, + } +} else when ODIN_OS == .NetBSD { + @(private) + ifaddrs :: struct { + next: ^ifaddrs, + name: cstring, + flags: IF_Flags, + addr: ^posix.sockaddr, + netmask: ^posix.sockaddr, + dstaddr: ^posix.sockaddr, + data: rawptr, + addrflags: u32, + } } @(private) diff --git a/core/net/socket.odin b/core/net/socket.odin index edb47cd0b..e2f96e2f3 100644 --- a/core/net/socket.odin +++ b/core/net/socket.odin @@ -1,4 +1,3 @@ -#+build windows, linux, darwin, freebsd package net /* @@ -20,6 +19,35 @@ package net Feoramund: FreeBSD platform code */ +Socket_Option :: enum i32 { + Broadcast = i32(_SOCKET_OPTION_BROADCAST), + Reuse_Address = i32(_SOCKET_OPTION_REUSE_ADDRESS), + Keep_Alive = i32(_SOCKET_OPTION_KEEP_ALIVE), + Out_Of_Bounds_Data_Inline = i32(_SOCKET_OPTION_OUT_OF_BOUNDS_DATA_INLINE), + Linger = i32(_SOCKET_OPTION_LINGER), + Receive_Buffer_Size = i32(_SOCKET_OPTION_RECEIVE_BUFFER_SIZE), + Send_Buffer_Size = i32(_SOCKET_OPTION_SEND_BUFFER_SIZE), + Receive_Timeout = i32(_SOCKET_OPTION_RECEIVE_TIMEOUT), + Send_Timeout = i32(_SOCKET_OPTION_SEND_TIMEOUT), + + TCP_Nodelay = i32(_SOCKET_OPTION_TCP_NODELAY), + + Use_Loopback = i32(_SOCKET_OPTION_USE_LOOPBACK), + Reuse_Port = i32(_SOCKET_OPTION_REUSE_PORT), + No_SIGPIPE_From_EPIPE = i32(_SOCKET_OPTION_NO_SIGPIPE_FROM_EPIPE), + Reuse_Port_Load_Balancing = i32(_SOCKET_OPTION_REUSE_PORT_LOAD_BALANCING), + + Exclusive_Addr_Use = i32(_SOCKET_OPTION_EXCLUSIVE_ADDR_USE), + Conditional_Accept = i32(_SOCKET_OPTION_CONDITIONAL_ACCEPT), + Dont_Linger = i32(_SOCKET_OPTION_DONT_LINGER), +} + +Shutdown_Manner :: enum i32 { + Receive = i32(_SHUTDOWN_MANNER_RECEIVE), + Send = i32(_SHUTDOWN_MANNER_SEND), + Both = i32(_SHUTDOWN_MANNER_BOTH), +} + any_socket_to_socket :: proc "contextless" (socket: Any_Socket) -> Socket { switch s in socket { case TCP_Socket: return Socket(s) diff --git a/core/net/socket_freebsd.odin b/core/net/socket_freebsd.odin index fa20742cb..bd600fd99 100644 --- a/core/net/socket_freebsd.odin +++ b/core/net/socket_freebsd.odin @@ -20,45 +20,35 @@ package net Feoramund: FreeBSD platform code */ -import "core:c" import "core:sys/freebsd" import "core:time" Fd :: freebsd.Fd -Socket_Option :: enum c.int { - // TODO: Test and implement more socket options. - // DEBUG - Reuse_Address = cast(c.int)freebsd.Socket_Option.REUSEADDR, - Keep_Alive = cast(c.int)freebsd.Socket_Option.KEEPALIVE, - // DONTROUTE - Broadcast = cast(c.int)freebsd.Socket_Option.BROADCAST, - Use_Loopback = cast(c.int)freebsd.Socket_Option.USELOOPBACK, - Linger = cast(c.int)freebsd.Socket_Option.LINGER, - Out_Of_Bounds_Data_Inline = cast(c.int)freebsd.Socket_Option.OOBINLINE, - Reuse_Port = cast(c.int)freebsd.Socket_Option.REUSEPORT, - // TIMESTAMP - No_SIGPIPE_From_EPIPE = cast(c.int)freebsd.Socket_Option.NOSIGPIPE, - // ACCEPTFILTER - // BINTIME - // NO_OFFLOAD - // NO_DDP - Reuse_Port_Load_Balancing = cast(c.int)freebsd.Socket_Option.REUSEPORT_LB, - // RERROR +_SOCKET_OPTION_BROADCAST :: freebsd.Socket_Option.BROADCAST +_SOCKET_OPTION_REUSE_ADDRESS :: freebsd.Socket_Option.REUSEADDR +_SOCKET_OPTION_KEEP_ALIVE :: freebsd.Socket_Option.KEEPALIVE +_SOCKET_OPTION_OUT_OF_BOUNDS_DATA_INLINE :: freebsd.Socket_Option.OOBINLINE +_SOCKET_OPTION_LINGER :: freebsd.Socket_Option.LINGER +_SOCKET_OPTION_RECEIVE_BUFFER_SIZE :: freebsd.Socket_Option.RCVBUF +_SOCKET_OPTION_SEND_BUFFER_SIZE :: freebsd.Socket_Option.SNDBUF +_SOCKET_OPTION_RECEIVE_TIMEOUT :: freebsd.Socket_Option.RCVTIMEO +_SOCKET_OPTION_SEND_TIMEOUT :: freebsd.Socket_Option.SNDTIMEO - Send_Buffer_Size = cast(c.int)freebsd.Socket_Option.SNDBUF, - Receive_Buffer_Size = cast(c.int)freebsd.Socket_Option.RCVBUF, - // SNDLOWAT - // RCVLOWAT - Send_Timeout = cast(c.int)freebsd.Socket_Option.SNDTIMEO, - Receive_Timeout = cast(c.int)freebsd.Socket_Option.RCVTIMEO, -} +_SOCKET_OPTION_TCP_NODELAY :: -1 -Shutdown_Manner :: enum c.int { - Receive = cast(c.int)freebsd.Shutdown_Method.RD, - Send = cast(c.int)freebsd.Shutdown_Method.WR, - Both = cast(c.int)freebsd.Shutdown_Method.RDWR, -} +_SOCKET_OPTION_USE_LOOPBACK :: freebsd.Socket_Option.USELOOPBACK +_SOCKET_OPTION_REUSE_PORT :: freebsd.Socket_Option.REUSEPORT +_SOCKET_OPTION_NO_SIGPIPE_FROM_EPIPE :: freebsd.Socket_Option.NOSIGPIPE +_SOCKET_OPTION_REUSE_PORT_LOAD_BALANCING :: freebsd.Socket_Option.REUSEPORT_LB + +_SOCKET_OPTION_EXCLUSIVE_ADDR_USE :: -1 +_SOCKET_OPTION_CONDITIONAL_ACCEPT :: -1 +_SOCKET_OPTION_DONT_LINGER :: -1 + +_SHUTDOWN_MANNER_RECEIVE :: freebsd.Shutdown_Method.RD +_SHUTDOWN_MANNER_SEND :: freebsd.Shutdown_Method.WR +_SHUTDOWN_MANNER_BOTH :: freebsd.Shutdown_Method.RDWR @(private) _create_socket :: proc(family: Address_Family, protocol: Socket_Protocol) -> (socket: Any_Socket, err: Create_Socket_Error) { @@ -272,7 +262,7 @@ _set_option :: proc(socket: Any_Socket, option: Socket_Option, value: any, loc : ptr: rawptr len: freebsd.socklen_t - switch option { + #partial switch option { case .Reuse_Address, .Keep_Alive, @@ -344,7 +334,7 @@ _set_option :: proc(socket: Any_Socket, option: Socket_Option, value: any, loc : ptr = &int_value len = size_of(int_value) case: - unimplemented("set_option() option not yet implemented", loc) + return .Invalid_Option } real_socket := any_socket_to_socket(socket) diff --git a/core/net/socket_linux.odin b/core/net/socket_linux.odin index 9719ff61b..8348ce114 100644 --- a/core/net/socket_linux.odin +++ b/core/net/socket_linux.odin @@ -21,28 +21,33 @@ package net Feoramund: FreeBSD platform code */ -import "core:c" import "core:time" import "core:sys/linux" -Socket_Option :: enum c.int { - Reuse_Address = c.int(linux.Socket_Option.REUSEADDR), - Keep_Alive = c.int(linux.Socket_Option.KEEPALIVE), - Out_Of_Bounds_Data_Inline = c.int(linux.Socket_Option.OOBINLINE), - TCP_Nodelay = c.int(linux.Socket_TCP_Option.NODELAY), - Linger = c.int(linux.Socket_Option.LINGER), - Receive_Buffer_Size = c.int(linux.Socket_Option.RCVBUF), - Send_Buffer_Size = c.int(linux.Socket_Option.SNDBUF), - Receive_Timeout = c.int(linux.Socket_Option.RCVTIMEO), - Send_Timeout = c.int(linux.Socket_Option.SNDTIMEO), - Broadcast = c.int(linux.Socket_Option.BROADCAST), -} +_SOCKET_OPTION_BROADCAST :: linux.Socket_Option.BROADCAST +_SOCKET_OPTION_REUSE_ADDRESS :: linux.Socket_Option.REUSEADDR +_SOCKET_OPTION_KEEP_ALIVE :: linux.Socket_Option.KEEPALIVE +_SOCKET_OPTION_OUT_OF_BOUNDS_DATA_INLINE :: linux.Socket_Option.OOBINLINE +_SOCKET_OPTION_LINGER :: linux.Socket_Option.LINGER +_SOCKET_OPTION_RECEIVE_BUFFER_SIZE :: linux.Socket_Option.RCVBUF +_SOCKET_OPTION_SEND_BUFFER_SIZE :: linux.Socket_Option.SNDBUF +_SOCKET_OPTION_RECEIVE_TIMEOUT :: linux.Socket_Option.RCVTIMEO +_SOCKET_OPTION_SEND_TIMEOUT :: linux.Socket_Option.SNDTIMEO -Shutdown_Manner :: enum c.int { - Receive = c.int(linux.Shutdown_How.RD), - Send = c.int(linux.Shutdown_How.WR), - Both = c.int(linux.Shutdown_How.RDWR), -} +_SOCKET_OPTION_TCP_NODELAY :: linux.Socket_TCP_Option.NODELAY + +_SOCKET_OPTION_USE_LOOPBACK :: -1 +_SOCKET_OPTION_REUSE_PORT :: -1 +_SOCKET_OPTION_NO_SIGPIPE_FROM_EPIPE :: -1 +_SOCKET_OPTION_REUSE_PORT_LOAD_BALANCING :: -1 + +_SOCKET_OPTION_EXCLUSIVE_ADDR_USE :: -1 +_SOCKET_OPTION_CONDITIONAL_ACCEPT :: -1 +_SOCKET_OPTION_DONT_LINGER :: -1 + +_SHUTDOWN_MANNER_RECEIVE :: linux.Shutdown_How.RD +_SHUTDOWN_MANNER_SEND :: linux.Shutdown_How.WR +_SHUTDOWN_MANNER_BOTH :: linux.Shutdown_How.RDWR // Wrappers and unwrappers for system-native types @@ -347,7 +352,7 @@ _set_option :: proc(sock: Any_Socket, option: Socket_Option, value: any, loc := int_value: i32 timeval_value: linux.Time_Val errno: linux.Errno - switch option { + #partial switch option { case .Reuse_Address, .Keep_Alive, @@ -400,10 +405,14 @@ _set_option :: proc(sock: Any_Socket, option: Socket_Option, value: any, loc := panic("set_option() value must be an integer here", loc) } errno = linux.setsockopt(os_sock, level, int(option), &int_value) + case: + return .Invalid_Socket } + if errno != .NONE { return _socket_option_error(errno) } + return nil } diff --git a/core/net/socket_others.odin b/core/net/socket_others.odin new file mode 100644 index 000000000..61cf7240e --- /dev/null +++ b/core/net/socket_others.odin @@ -0,0 +1,105 @@ +#+build !darwin +#+build !linux +#+build !freebsd +#+build !windows +#+build !netbsd +#+build !openbsd +#+private +package net + +_SOCKET_OPTION_BROADCAST :: -1 +_SOCKET_OPTION_REUSE_ADDRESS :: -1 +_SOCKET_OPTION_KEEP_ALIVE :: -1 +_SOCKET_OPTION_OUT_OF_BOUNDS_DATA_INLINE :: -1 +_SOCKET_OPTION_LINGER :: -1 +_SOCKET_OPTION_RECEIVE_BUFFER_SIZE :: -1 +_SOCKET_OPTION_SEND_BUFFER_SIZE :: -1 +_SOCKET_OPTION_RECEIVE_TIMEOUT :: -1 +_SOCKET_OPTION_SEND_TIMEOUT :: -1 + +_SOCKET_OPTION_TCP_NODELAY :: -1 + +_SOCKET_OPTION_USE_LOOPBACK :: -1 +_SOCKET_OPTION_REUSE_PORT :: -1 +_SOCKET_OPTION_NO_SIGPIPE_FROM_EPIPE :: -1 +_SOCKET_OPTION_REUSE_PORT_LOAD_BALANCING :: -1 + +_SOCKET_OPTION_EXCLUSIVE_ADDR_USE :: -1 +_SOCKET_OPTION_CONDITIONAL_ACCEPT :: -1 +_SOCKET_OPTION_DONT_LINGER :: -1 + +_SHUTDOWN_MANNER_RECEIVE :: -1 +_SHUTDOWN_MANNER_SEND :: -1 +_SHUTDOWN_MANNER_BOTH :: -1 + +_dial_tcp_from_endpoint :: proc(endpoint: Endpoint, options := DEFAULT_TCP_OPTIONS) -> (sock: TCP_Socket, err: Network_Error) { + err = Create_Socket_Error.Network_Unreachable + return +} + +_create_socket :: proc(family: Address_Family, protocol: Socket_Protocol) -> (sock: Any_Socket, err: Create_Socket_Error) { + err = .Network_Unreachable + return +} + +_bind :: proc(skt: Any_Socket, ep: Endpoint) -> (err: Bind_Error) { + err = .Network_Unreachable + return +} + +_listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (skt: TCP_Socket, err: Network_Error) { + err = Create_Socket_Error.Network_Unreachable + return +} + +_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Socket_Info_Error) { + err = .Network_Unreachable + return +} + +_peer_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Socket_Info_Error) { + err = .Network_Unreachable + return +} + +_accept_tcp :: proc(sock: TCP_Socket, options := DEFAULT_TCP_OPTIONS) -> (client: TCP_Socket, source: Endpoint, err: Accept_Error) { + err = .Network_Unreachable + return +} + +_close :: proc(skt: Any_Socket) { +} + +_recv_tcp :: proc(skt: TCP_Socket, buf: []byte) -> (bytes_read: int, err: TCP_Recv_Error) { + err = .Network_Unreachable + return +} + +_recv_udp :: proc(skt: UDP_Socket, buf: []byte) -> (bytes_read: int, remote_endpoint: Endpoint, err: UDP_Recv_Error) { + err = .Network_Unreachable + return +} + +_send_tcp :: proc(skt: TCP_Socket, buf: []byte) -> (bytes_written: int, err: TCP_Send_Error) { + err = .Network_Unreachable + return +} + +_send_udp :: proc(skt: UDP_Socket, buf: []byte, to: Endpoint) -> (bytes_written: int, err: UDP_Send_Error) { + err = .Network_Unreachable + return +} + +_shutdown :: proc(skt: Any_Socket, manner: Shutdown_Manner) -> (err: Shutdown_Error) { + err = .Network_Unreachable + return +} + +_set_option :: proc(s: Any_Socket, option: Socket_Option, value: any, loc := #caller_location) -> Socket_Option_Error { + return .Network_Unreachable +} + +_set_blocking :: proc(socket: Any_Socket, should_block: bool) -> (err: Set_Blocking_Error) { + err = .Network_Unreachable + return +} diff --git a/core/net/socket_darwin.odin b/core/net/socket_posix.odin similarity index 90% rename from core/net/socket_darwin.odin rename to core/net/socket_posix.odin index 8e01eb4a8..243b2e06f 100644 --- a/core/net/socket_darwin.odin +++ b/core/net/socket_posix.odin @@ -1,4 +1,4 @@ -#+build darwin +#+build darwin, netbsd, openbsd package net /* @@ -20,28 +20,33 @@ package net Feoramund: FreeBSD platform code */ -import "core:c" import "core:sys/posix" import "core:time" -Socket_Option :: enum c.int { - Broadcast = c.int(posix.Sock_Option.BROADCAST), - Reuse_Address = c.int(posix.Sock_Option.REUSEADDR), - Keep_Alive = c.int(posix.Sock_Option.KEEPALIVE), - Out_Of_Bounds_Data_Inline = c.int(posix.Sock_Option.OOBINLINE), - TCP_Nodelay = c.int(posix.TCP_NODELAY), - Linger = c.int(posix.Sock_Option.LINGER), - Receive_Buffer_Size = c.int(posix.Sock_Option.RCVBUF), - Send_Buffer_Size = c.int(posix.Sock_Option.SNDBUF), - Receive_Timeout = c.int(posix.Sock_Option.RCVTIMEO), - Send_Timeout = c.int(posix.Sock_Option.SNDTIMEO), -} +_SOCKET_OPTION_BROADCAST :: posix.Sock_Option.BROADCAST +_SOCKET_OPTION_REUSE_ADDRESS :: posix.Sock_Option.REUSEADDR +_SOCKET_OPTION_KEEP_ALIVE :: posix.Sock_Option.KEEPALIVE +_SOCKET_OPTION_OUT_OF_BOUNDS_DATA_INLINE :: posix.Sock_Option.OOBINLINE +_SOCKET_OPTION_LINGER :: posix.Sock_Option.LINGER +_SOCKET_OPTION_RECEIVE_BUFFER_SIZE :: posix.Sock_Option.RCVBUF +_SOCKET_OPTION_SEND_BUFFER_SIZE :: posix.Sock_Option.SNDBUF +_SOCKET_OPTION_RECEIVE_TIMEOUT :: posix.Sock_Option.RCVTIMEO +_SOCKET_OPTION_SEND_TIMEOUT :: posix.Sock_Option.SNDTIMEO -Shutdown_Manner :: enum c.int { - Receive = c.int(posix.SHUT_RD), - Send = c.int(posix.SHUT_WR), - Both = c.int(posix.SHUT_RDWR), -} +_SOCKET_OPTION_TCP_NODELAY :: posix.TCP_NODELAY + +_SOCKET_OPTION_USE_LOOPBACK :: -1 +_SOCKET_OPTION_REUSE_PORT :: -1 +_SOCKET_OPTION_NO_SIGPIPE_FROM_EPIPE :: -1 +_SOCKET_OPTION_REUSE_PORT_LOAD_BALANCING :: -1 + +_SOCKET_OPTION_EXCLUSIVE_ADDR_USE :: -1 +_SOCKET_OPTION_CONDITIONAL_ACCEPT :: -1 +_SOCKET_OPTION_DONT_LINGER :: -1 + +_SHUTDOWN_MANNER_RECEIVE :: posix.SHUT_RD +_SHUTDOWN_MANNER_SEND :: posix.SHUT_WR +_SHUTDOWN_MANNER_BOTH :: posix.SHUT_RDWR @(private) _create_socket :: proc(family: Address_Family, protocol: Socket_Protocol) -> (socket: Any_Socket, err: Create_Socket_Error) { @@ -273,7 +278,7 @@ _set_option :: proc(s: Any_Socket, option: Socket_Option, value: any, loc := #ca ptr: rawptr len: posix.socklen_t - switch option { + #partial switch option { case .Broadcast, .Reuse_Address, @@ -327,6 +332,8 @@ _set_option :: proc(s: Any_Socket, option: Socket_Option, value: any, loc := #ca } ptr = &int_value len = size_of(int_value) + case: + return .Invalid_Option } skt := any_socket_to_socket(s) diff --git a/core/net/socket_windows.odin b/core/net/socket_windows.odin index 6dd2f0458..4eea0ea65 100644 --- a/core/net/socket_windows.odin +++ b/core/net/socket_windows.odin @@ -24,59 +24,30 @@ import "core:c" import win "core:sys/windows" import "core:time" -Socket_Option :: enum c.int { - // bool: Whether the address that this socket is bound to can be reused by other sockets. - // This allows you to bypass the cooldown period if a program dies while the socket is bound. - Reuse_Address = win.SO_REUSEADDR, +_SOCKET_OPTION_BROADCAST :: win.SO_BROADCAST +_SOCKET_OPTION_REUSE_ADDRESS :: win.SO_REUSEADDR +_SOCKET_OPTION_KEEP_ALIVE :: win.SO_KEEPALIVE +_SOCKET_OPTION_OUT_OF_BOUNDS_DATA_INLINE :: win.SO_OOBINLINE +_SOCKET_OPTION_LINGER :: win.SO_LINGER +_SOCKET_OPTION_RECEIVE_BUFFER_SIZE :: win.SO_RCVBUF +_SOCKET_OPTION_SEND_BUFFER_SIZE :: win.SO_SNDBUF +_SOCKET_OPTION_RECEIVE_TIMEOUT :: win.SO_RCVTIMEO +_SOCKET_OPTION_SEND_TIMEOUT :: win.SO_SNDTIMEO - // bool: Whether other programs will be inhibited from binding the same endpoint as this socket. - Exclusive_Addr_Use = win.SO_EXCLUSIVEADDRUSE, +_SOCKET_OPTION_TCP_NODELAY :: win.TCP_NODELAY - // bool: When true, keepalive packets will be automatically be sent for this connection. TODO: verify this understanding - Keep_Alive = win.SO_KEEPALIVE, +_SOCKET_OPTION_USE_LOOPBACK :: -1 +_SOCKET_OPTION_REUSE_PORT :: -1 +_SOCKET_OPTION_NO_SIGPIPE_FROM_EPIPE :: -1 +_SOCKET_OPTION_REUSE_PORT_LOAD_BALANCING :: -1 - // bool: When true, client connections will immediately be sent a TCP/IP RST response, rather than being accepted. - Conditional_Accept = win.SO_CONDITIONAL_ACCEPT, +_SOCKET_OPTION_EXCLUSIVE_ADDR_USE :: win.SO_EXCLUSIVEADDRUSE +_SOCKET_OPTION_CONDITIONAL_ACCEPT :: win.SO_CONDITIONAL_ACCEPT +_SOCKET_OPTION_DONT_LINGER :: win.SO_DONTLINGER - // bool: If true, when the socket is closed, but data is still waiting to be sent, discard that data. - Dont_Linger = win.SO_DONTLINGER, - - // bool: When true, 'out-of-band' data sent over the socket will be read by a normal net.recv() call, the same as normal 'in-band' data. - Out_Of_Bounds_Data_Inline = win.SO_OOBINLINE, - - // bool: When true, disables send-coalescing, therefore reducing latency. - TCP_Nodelay = win.TCP_NODELAY, - - // win.LINGER: Customizes how long (if at all) the socket will remain open when there - // is some remaining data waiting to be sent, and net.close() is called. - Linger = win.SO_LINGER, - - // win.DWORD: The size, in bytes, of the OS-managed receive-buffer for this socket. - Receive_Buffer_Size = win.SO_RCVBUF, - - // win.DWORD: The size, in bytes, of the OS-managed send-buffer for this socket. - Send_Buffer_Size = win.SO_SNDBUF, - - // win.DWORD: For blocking sockets, the time in milliseconds to wait for incoming data to be received, before giving up and returning .Timeout. - // For non-blocking sockets, ignored. - // Use a value of zero to potentially wait forever. - Receive_Timeout = win.SO_RCVTIMEO, - - // win.DWORD: For blocking sockets, the time in milliseconds to wait for outgoing data to be sent, before giving up and returning .Timeout. - // For non-blocking sockets, ignored. - // Use a value of zero to potentially wait forever. - Send_Timeout = win.SO_SNDTIMEO, - - // bool: Allow sending to, receiving from, and binding to, a broadcast address. - Broadcast = win.SO_BROADCAST, -} - - -Shutdown_Manner :: enum c.int { - Receive = win.SD_RECEIVE, - Send = win.SD_SEND, - Both = win.SD_BOTH, -} +_SHUTDOWN_MANNER_RECEIVE :: win.SD_RECEIVE +_SHUTDOWN_MANNER_SEND :: win.SD_SEND +_SHUTDOWN_MANNER_BOTH :: win.SD_BOTH @(init, private) ensure_winsock_initialized :: proc "contextless" () { @@ -322,7 +293,7 @@ _set_option :: proc(s: Any_Socket, option: Socket_Option, value: any, loc := #ca ptr: rawptr len: c.int - switch option { + #partial switch option { case .Reuse_Address, .Exclusive_Addr_Use, @@ -383,6 +354,8 @@ _set_option :: proc(s: Any_Socket, option: Socket_Option, value: any, loc := #ca } ptr = &int_value len = size_of(int_value) + case: + return .Invalid_Option } socket := any_socket_to_socket(s) diff --git a/tests/core/net/test_core_net.odin b/tests/core/net/test_core_net.odin index 9b3973a60..55fe6671d 100644 --- a/tests/core/net/test_core_net.odin +++ b/tests/core/net/test_core_net.odin @@ -10,8 +10,6 @@ A test suite for `core:net` */ -#+build !netbsd -#+build !openbsd #+feature dynamic-literals package test_core_net From d1fa640549c36c650f81b24f616db039aaf49ea4 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:07:54 +0100 Subject: [PATCH 166/766] runtime: use `alloc_non_zeroed` in `new_clone`; zeroing is not needed --- base/runtime/core_builtin.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 6fecbaad9..42bf13478 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -360,7 +360,7 @@ new_aligned :: proc($T: typeid, alignment: int, allocator := context.allocator, @(builtin, require_results) new_clone :: proc(data: $T, allocator := context.allocator, loc := #caller_location) -> (t: ^T, err: Allocator_Error) #optional_allocator_error { - t = (^T)(raw_data(mem_alloc_bytes(size_of(T), align_of(T), allocator, loc) or_return)) + t = (^T)(raw_data(mem_alloc_non_zeroed(size_of(T), align_of(T), allocator, loc) or_return)) if t != nil { t^ = data } From ec040c1fcb373b5230215b618af08714d452350f Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:08:42 +0100 Subject: [PATCH 167/766] rbtree: fix pointer usages --- core/container/rbtree/rbtree.odin | 8 ++--- tests/core/container/test_core_rbtree.odin | 34 ++++++++-------------- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/core/container/rbtree/rbtree.odin b/core/container/rbtree/rbtree.odin index 35ce21413..e892188d7 100644 --- a/core/container/rbtree/rbtree.odin +++ b/core/container/rbtree/rbtree.odin @@ -91,7 +91,7 @@ destroy :: proc(t: ^$T/Tree($Key, $Value), call_on_remove: bool = true) { } } -len :: proc "contextless" (t: ^$T/Tree($Key, $Value)) -> (node_count: int) { +len :: proc "contextless" (t: $T/Tree($Key, $Value)) -> (node_count: int) { return t._size } @@ -108,7 +108,7 @@ last :: proc "contextless" (t: ^$T/Tree($Key, $Value)) -> ^Node(Key, Value) { } // find finds the key in the tree, and returns the corresponding node, or nil iff the value is not present. -find :: proc(t: ^$T/Tree($Key, $Value), key: Key) -> (node: ^Node(Key, Value)) { +find :: proc(t: $T/Tree($Key, $Value), key: Key) -> (node: ^Node(Key, Value)) { node = t._root for node != nil { switch t._cmp_fn(key, node.key) { @@ -121,7 +121,7 @@ find :: proc(t: ^$T/Tree($Key, $Value), key: Key) -> (node: ^Node(Key, Value)) { } // find_value finds the key in the tree, and returns the corresponding value, or nil iff the value is not present. -find_value :: proc(t: ^$T/Tree($Key, $Value), key: Key) -> (value: Value, ok: bool) #optional_ok { +find_value :: proc(t: $T/Tree($Key, $Value), key: Key) -> (value: Value, ok: bool) #optional_ok { if n := find(t, key); n != nil { return n.value, true } @@ -166,7 +166,7 @@ remove :: proc { // removal was successful. While the node's key + value will be left intact, // the node itself will be freed via the tree's node allocator. remove_key :: proc(t: ^$T/Tree($Key, $Value), key: Key, call_on_remove := true) -> bool { - n := find(t, key) + n := find(t^, key) if n == nil { return false // Key not found, nothing to do } diff --git a/tests/core/container/test_core_rbtree.odin b/tests/core/container/test_core_rbtree.odin index d220b7ed6..78d710b7f 100644 --- a/tests/core/container/test_core_rbtree.odin +++ b/tests/core/container/test_core_rbtree.odin @@ -4,22 +4,15 @@ import rb "core:container/rbtree" import "core:math/rand" import "core:testing" import "base:intrinsics" -import "core:mem" import "core:slice" import "core:log" test_rbtree_integer :: proc(t: ^testing.T, $Key: typeid, $Value: typeid) { - track: mem.Tracking_Allocator - mem.tracking_allocator_init(&track, context.allocator) - track.bad_free_callback = mem.tracking_allocator_bad_free_callback_add_to_array - defer mem.tracking_allocator_destroy(&track) - context.allocator = mem.tracking_allocator(&track) - log.infof("Testing Red-Black Tree($Key=%v,$Value=%v) using random seed %v.", type_info_of(Key), type_info_of(Value), t.seed) tree: rb.Tree(Key, Value) rb.init(&tree) - testing.expect(t, rb.len(&tree) == 0, "empty: len should be 0") + testing.expect(t, rb.len(tree) == 0, "empty: len should be 0") testing.expect(t, rb.first(&tree) == nil, "empty: first should be nil") testing.expect(t, rb.last(&tree) == nil, "empty: last should be nil") iter := rb.iterator(&tree, .Forward) @@ -48,7 +41,7 @@ test_rbtree_integer :: proc(t: ^testing.T, $Key: typeid, $Value: typeid) { } entry_count := len(inserted_map) - testing.expect(t, rb.len(&tree) == entry_count, "insert: len after") + testing.expect(t, rb.len(tree) == entry_count, "insert: len after") validate_rbtree(t, &tree) first := rb.first(&tree) @@ -58,8 +51,8 @@ test_rbtree_integer :: proc(t: ^testing.T, $Key: typeid, $Value: typeid) { // Ensure that all entries can be found. for k, v in inserted_map { - testing.expect(t, v == rb.find(&tree, k), "Find(): Node") - testing.expect(t, k == v.key, "Find(): Node key") + testing.expect(t, v == rb.find(tree, k), "Find(): Node") + testing.expect(t, k == v.key, "Find(): Node key") } // Test the forward/backward iterators. @@ -97,17 +90,17 @@ test_rbtree_integer :: proc(t: ^testing.T, $Key: typeid, $Value: typeid) { (^int)(user_data)^ -= 1 } for k, i in inserted_keys { - node := rb.find(&tree, k) + node := rb.find(tree, k) testing.expect(t, node != nil, "remove: find (pre)") ok := rb.remove(&tree, k) testing.expect(t, ok, "remove: succeeds") - testing.expect(t, entry_count - (i + 1) == rb.len(&tree), "remove: len (post)") + testing.expect(t, entry_count - (i + 1) == rb.len(tree), "remove: len (post)") validate_rbtree(t, &tree) - testing.expect(t, nil == rb.find(&tree, k), "remove: find (post") + testing.expect(t, nil == rb.find(tree, k), "remove: find (post") } - testing.expect(t, rb.len(&tree) == 0, "remove: len should be 0") + testing.expect(t, rb.len(tree) == 0, "remove: len should be 0") testing.expectf(t, callback_count == 0, "remove: on_remove should've been called %v times, it was %v", entry_count, callback_count) testing.expect(t, rb.first(&tree) == nil, "remove: first should be nil") testing.expect(t, rb.last(&tree) == nil, "remove: last should be nil") @@ -129,28 +122,25 @@ test_rbtree_integer :: proc(t: ^testing.T, $Key: typeid, $Value: typeid) { ok = rb.iterator_remove(&iter) testing.expect(t, !ok, "iterator/remove: redundant removes should fail") - testing.expect(t, rb.find(&tree, k) == nil, "iterator/remove: node should be gone") + testing.expect(t, rb.find(tree, k) == nil, "iterator/remove: node should be gone") testing.expect(t, rb.iterator_get(&iter) == nil, "iterator/remove: get should return nil") // Ensure that iterator_next still works. node, ok = rb.iterator_next(&iter) - testing.expect(t, ok == (rb.len(&tree) > 0), "iterator/remove: next should return false") + testing.expect(t, ok == (rb.len(tree) > 0), "iterator/remove: next should return false") testing.expect(t, node == rb.first(&tree), "iterator/remove: next should return first") validate_rbtree(t, &tree) } - testing.expect(t, rb.len(&tree) == entry_count - 1, "iterator/remove: len should drop by 1") + testing.expect(t, rb.len(tree) == entry_count - 1, "iterator/remove: len should drop by 1") rb.destroy(&tree) - testing.expect(t, rb.len(&tree) == 0, "destroy: len should be 0") + testing.expect(t, rb.len(tree) == 0, "destroy: len should be 0") testing.expectf(t, callback_count == 0, "remove: on_remove should've been called %v times, it was %v", entry_count, callback_count) // print_tree_node(tree._root) delete(inserted_map) delete(inserted_keys) - testing.expectf(t, len(track.allocation_map) == 0, "Expected 0 leaks, have %v", len(track.allocation_map)) - testing.expectf(t, len(track.bad_free_array) == 0, "Expected 0 bad frees, have %v", len(track.bad_free_array)) - return } @(test) From 08c4503875eb77f35cbb1222744ddfcda6fd3090 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:08:59 +0100 Subject: [PATCH 168/766] xar: fix example --- core/container/xar/xar.odin | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index 8ed5bc3e4..07fdf5a15 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -417,9 +417,10 @@ Create an iterator for traversing the exponential array. Example: - import "lib:xar" + import "core:container/xar" + import "core:fmt" - iteration_example :: proc() { + iterator_example :: proc() { x: xar.Array(int, 4) defer xar.destroy(&x) From f6b8e086283a63d49327f5b5eecaa3b32434030a Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:09:11 +0100 Subject: [PATCH 169/766] simd: fix typos --- core/simd/simd.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/simd/simd.odin b/core/simd/simd.odin index 14bf03f43..e2373d3e2 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -2207,7 +2207,7 @@ swizzle :: builtin.swizzle /* Extract the set of most-significant bits of a SIMD vector. -This procedure checks the the most-significant bit (MSB) for each lane of vector +This procedure checks the most-significant bit (MSB) for each lane of vector and returns the numbers of lanes with the most-significant bit set. This procedure can be used in conjuction with `lanes_eq` (and other similar procedures) to count the number of matched lanes by computing the cardinality of the resulting @@ -2253,7 +2253,7 @@ extract_msbs :: intrinsics.simd_extract_msbs /* Extract the set of least-significant bits of a SIMD vector. -This procedure checks the the least-significant bit (LSB) for each lane of vector +This procedure checks the least-significant bit (LSB) for each lane of vector and returns the numbers of lanes with the least-significant bit set. This procedure can be used in conjuction with `lanes_eq` (and other similar procedures) to count the number of matched lanes by computing the cardinality of the resulting From 6c663b7a71ddd1288b92cd47eb6876e96cb3ab34 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:09:40 +0100 Subject: [PATCH 170/766] slice: fix examples --- core/slice/sort.odin | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/core/slice/sort.odin b/core/slice/sort.odin index d438cfc1b..9f91a0f73 100644 --- a/core/slice/sort.odin +++ b/core/slice/sort.odin @@ -300,7 +300,9 @@ Example: import "core:slice" import "core:fmt" - main :: proc() { + stable_sort_by_example :: proc() { + Example :: struct { n: int, s: string } + arr := []Example { {2, "name"}, {3, "Bill"}, @@ -312,10 +314,9 @@ Example: }) for e in arr do fmt.printf("%s ", e.s) + fmt.println() } - Example :: struct { n: int, s: string } - Output: My name is Bill */ @@ -335,7 +336,9 @@ Example: import "core:slice" import "core:fmt" - main :: proc() { + stable_sort_by_cmp_example :: proc() { + Example :: struct { n: int, s: string } + arr := []Example { {2, "name"}, {3, "Bill"}, @@ -347,9 +350,9 @@ Example: }) for e in arr do fmt.printf("%s ", e.s) + fmt.println() } - Example :: struct { n: int, s: string } Output: My name is Bill */ From b9946aa67e01e6ec5716c15f608569dfda4ff521 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:10:02 +0100 Subject: [PATCH 171/766] chan: fix example and deadlock on closed channel --- core/sync/chan/chan.odin | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/sync/chan/chan.odin b/core/sync/chan/chan.odin index 05312e5a2..17618763f 100644 --- a/core/sync/chan/chan.odin +++ b/core/sync/chan/chan.odin @@ -1166,7 +1166,7 @@ Example: import "core:sync/chan" import "core:fmt" - select_raw_example :: proc() { + try_select_raw_example :: proc() { c, err := chan.create(chan.Chan(int), 1, context.allocator) assert(err == .None) defer chan.destroy(c) @@ -1198,11 +1198,11 @@ Example: Output: - SELECT: 0 true + SELECT: 0 Send RECEIVED VALUE 0 - SELECT: 0 true + SELECT: 0 Recv RECEIVED VALUE 1 - SELECT: 0 false + SELECT: -1 None */ @(require_results) @@ -1219,7 +1219,7 @@ try_select_raw :: proc "odin" (recvs: []^Raw_Chan, sends: []^Raw_Chan, send_msgs count := 0 for c, i in recvs { - if can_recv(c) { + if !c.closed && can_recv(c) { candidates[count] = { is_recv = true, idx = i, @@ -1232,7 +1232,7 @@ try_select_raw :: proc "odin" (recvs: []^Raw_Chan, sends: []^Raw_Chan, send_msgs if i > builtin.len(send_msgs)-1 || send_msgs[i] == nil { continue } - if can_send(c) { + if !c.closed && can_send(c) { candidates[count] = { is_recv = false, idx = i, From fa97aa4dc9745af233ea96997a1c8e4094993b7c Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:10:30 +0100 Subject: [PATCH 172/766] thread: fix aligned loading of unaligned addresses --- core/thread/thread.odin | 45 ++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/core/thread/thread.odin b/core/thread/thread.odin index 26c1a3e27..a07801b98 100644 --- a/core/thread/thread.odin +++ b/core/thread/thread.odin @@ -5,7 +5,10 @@ import "base:runtime" import "core:mem" import "base:intrinsics" -_ :: intrinsics +@(private) +unall :: intrinsics.unaligned_load +@(private) +unals :: intrinsics.unaligned_store /* Value, specifying whether `core:thread` functionality is available on the @@ -347,7 +350,9 @@ create_and_start_with_poly_data :: proc(data: $T, fn: proc(data: T), init_contex thread_proc :: proc(t: ^Thread) { fn := cast(proc(T))t.data assert(t.user_index >= 1) - data := (^T)(&t.user_args[0])^ + + data := unall((^T)(&t.user_args)) + fn(data) } if t = create(thread_proc, priority); t == nil { @@ -356,9 +361,7 @@ create_and_start_with_poly_data :: proc(data: $T, fn: proc(data: T), init_contex t.data = rawptr(fn) t.user_index = 1 - data := data - - mem.copy(&t.user_args[0], &data, size_of(T)) + unals((^T)(&t.user_args), data) if self_cleanup { intrinsics.atomic_or(&t.flags, {.Self_Cleanup}) @@ -393,9 +396,10 @@ create_and_start_with_poly_data2 :: proc(arg1: $T1, arg2: $T2, fn: proc(T1, T2), fn := cast(proc(T1, T2))t.data assert(t.user_index >= 2) - user_args := mem.slice_to_bytes(t.user_args[:]) - arg1 := (^T1)(raw_data(user_args))^ - arg2 := (^T2)(raw_data(user_args[size_of(T1):]))^ + ptr := uintptr(&t.user_args) + + arg1 := unall((^T1)(rawptr(ptr))) + arg2 := unall((^T2)(rawptr(ptr + size_of(T1)))) fn(arg1, arg2) } @@ -405,11 +409,10 @@ create_and_start_with_poly_data2 :: proc(arg1: $T1, arg2: $T2, fn: proc(T1, T2), t.data = rawptr(fn) t.user_index = 2 - arg1, arg2 := arg1, arg2 - user_args := mem.slice_to_bytes(t.user_args[:]) + ptr := uintptr(&t.user_args) - n := copy(user_args, mem.ptr_to_bytes(&arg1)) - _ = copy(user_args[n:], mem.ptr_to_bytes(&arg2)) + unals((^T1)(rawptr(ptr)), arg1) + unals((^T2)(rawptr(ptr + size_of(T1))), arg2) if self_cleanup { intrinsics.atomic_or(&t.flags, {.Self_Cleanup}) @@ -444,10 +447,11 @@ create_and_start_with_poly_data3 :: proc(arg1: $T1, arg2: $T2, arg3: $T3, fn: pr fn := cast(proc(T1, T2, T3))t.data assert(t.user_index >= 3) - user_args := mem.slice_to_bytes(t.user_args[:]) - arg1 := (^T1)(raw_data(user_args))^ - arg2 := (^T2)(raw_data(user_args[size_of(T1):]))^ - arg3 := (^T3)(raw_data(user_args[size_of(T1) + size_of(T2):]))^ + ptr := uintptr(&t.user_args) + + arg1 := unall((^T1)(rawptr(ptr))) + arg2 := unall((^T2)(rawptr(ptr + size_of(T1)))) + arg3 := unall((^T3)(rawptr(ptr + size_of(T1) + size_of(T2)))) fn(arg1, arg2, arg3) } @@ -457,12 +461,11 @@ create_and_start_with_poly_data3 :: proc(arg1: $T1, arg2: $T2, arg3: $T3, fn: pr t.data = rawptr(fn) t.user_index = 3 - arg1, arg2, arg3 := arg1, arg2, arg3 - user_args := mem.slice_to_bytes(t.user_args[:]) + ptr := uintptr(&t.user_args) - n := copy(user_args, mem.ptr_to_bytes(&arg1)) - n += copy(user_args[n:], mem.ptr_to_bytes(&arg2)) - _ = copy(user_args[n:], mem.ptr_to_bytes(&arg3)) + unals((^T1)(rawptr(ptr)), arg1) + unals((^T2)(rawptr(ptr + size_of(T1))), arg2) + unals((^T3)(rawptr(ptr + size_of(T1) + size_of(T2))), arg3) if self_cleanup { intrinsics.atomic_or(&t.flags, {.Self_Cleanup}) From bc7040209364f06817ceeff4d5effd599f70f5f5 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:11:07 +0100 Subject: [PATCH 173/766] os: add non blocking open flag --- core/os/os2/file.odin | 2 +- core/os/os2/file_linux.odin | 1 + core/os/os2/file_posix.odin | 13 +++++++------ core/os/os2/file_wasi.odin | 5 +++-- core/os/os2/file_windows.odin | 10 +++++++++- core/os/os2/temp_file.odin | 4 ++-- core/os/os_windows.odin | 10 ++++++++-- 7 files changed, 31 insertions(+), 14 deletions(-) diff --git a/core/os/os2/file.odin b/core/os/os2/file.odin index 9e7788c31..33446726e 100644 --- a/core/os/os2/file.odin +++ b/core/os/os2/file.odin @@ -67,7 +67,7 @@ File_Flag :: enum { Trunc, Sparse, Inheritable, - + Non_Blocking, Unbuffered_IO, } diff --git a/core/os/os2/file_linux.odin b/core/os/os2/file_linux.odin index fb25ca411..924251dfc 100644 --- a/core/os/os2/file_linux.odin +++ b/core/os/os2/file_linux.odin @@ -82,6 +82,7 @@ _open :: proc(name: string, flags: File_Flags, perm: Permissions) -> (f: ^File, if .Excl in flags { sys_flags += {.EXCL} } if .Sync in flags { sys_flags += {.DSYNC} } if .Trunc in flags { sys_flags += {.TRUNC} } + if .Non_Blocking in flags { sys_flags += {.NONBLOCK} } if .Inheritable in flags { sys_flags -= {.CLOEXEC} } fd, errno := linux.open(name_cstr, sys_flags, transmute(linux.Mode)transmute(u32)perm) diff --git a/core/os/os2/file_posix.odin b/core/os/os2/file_posix.odin index 874ec7c7d..cdc8e491a 100644 --- a/core/os/os2/file_posix.odin +++ b/core/os/os2/file_posix.odin @@ -61,12 +61,13 @@ _open :: proc(name: string, flags: File_Flags, perm: Permissions) -> (f: ^File, } } - if .Append in flags { sys_flags += {.APPEND} } - if .Create in flags { sys_flags += {.CREAT} } - if .Excl in flags { sys_flags += {.EXCL} } - if .Sync in flags { sys_flags += {.DSYNC} } - if .Trunc in flags { sys_flags += {.TRUNC} } - if .Inheritable in flags { sys_flags -= {.CLOEXEC} } + if .Append in flags { sys_flags += {.APPEND} } + if .Create in flags { sys_flags += {.CREAT} } + if .Excl in flags { sys_flags += {.EXCL} } + if .Sync in flags { sys_flags += {.DSYNC} } + if .Trunc in flags { sys_flags += {.TRUNC} } + if .Non_Blocking in flags { sys_flags += {.NONBLOCK} } + if .Inheritable in flags { sys_flags -= {.CLOEXEC} } temp_allocator := TEMP_ALLOCATOR_GUARD({}) cname := clone_to_cstring(name, temp_allocator) or_return diff --git a/core/os/os2/file_wasi.odin b/core/os/os2/file_wasi.odin index b60cce4be..fc37ef9f2 100644 --- a/core/os/os2/file_wasi.odin +++ b/core/os/os2/file_wasi.odin @@ -185,8 +185,9 @@ _open :: proc(name: string, flags: File_Flags, perm: Permissions) -> (f: ^File, if .Trunc in flags { oflags += {.TRUNC} } fdflags: wasi.fdflags_t - if .Append in flags { fdflags += {.APPEND} } - if .Sync in flags { fdflags += {.SYNC} } + if .Append in flags { fdflags += {.APPEND} } + if .Sync in flags { fdflags += {.SYNC} } + if .Non_Blocking in flags { fdflags += {.NONBLOCK} } // NOTE: rights are adjusted to what this package's functions might want to call. rights: wasi.rights_t diff --git a/core/os/os2/file_windows.odin b/core/os/os2/file_windows.odin index 9a969f07e..4df9398cc 100644 --- a/core/os/os2/file_windows.odin +++ b/core/os/os2/file_windows.odin @@ -126,7 +126,11 @@ _open_internal :: proc(name: string, flags: File_Flags, perm: Permissions) -> (h // NOTE(bill): Open has just asked to create a file in read-only mode. // If the file already exists, to make it akin to a *nix open call, // the call preserves the existing permissions. - h := win32.CreateFileW(path, access, share_mode, &sa, win32.TRUNCATE_EXISTING, win32.FILE_ATTRIBUTE_NORMAL, nil) + nix_attrs := win32.FILE_ATTRIBUTE_NORMAL + if .Non_Blocking in flags { + nix_attrs |= win32.FILE_FLAG_OVERLAPPED + } + h := win32.CreateFileW(path, access, share_mode, &sa, win32.TRUNCATE_EXISTING, nix_attrs, nil) if h == win32.INVALID_HANDLE { switch e := win32.GetLastError(); e { case win32.ERROR_FILE_NOT_FOUND, _ERROR_BAD_NETPATH, win32.ERROR_PATH_NOT_FOUND: @@ -140,6 +144,10 @@ _open_internal :: proc(name: string, flags: File_Flags, perm: Permissions) -> (h } } + if .Non_Blocking in flags { + attrs |= win32.FILE_FLAG_OVERLAPPED + } + h := win32.CreateFileW(path, access, share_mode, &sa, create_mode, attrs, nil) if h == win32.INVALID_HANDLE { return 0, _get_platform_error() diff --git a/core/os/os2/temp_file.odin b/core/os/os2/temp_file.odin index f0bc3788e..2c0236428 100644 --- a/core/os/os2/temp_file.odin +++ b/core/os/os2/temp_file.odin @@ -14,7 +14,7 @@ MAX_ATTEMPTS :: 1<<13 // Should be enough for everyone, right? // // The caller must `close` the file once finished with. @(require_results) -create_temp_file :: proc(dir, pattern: string) -> (f: ^File, err: Error) { +create_temp_file :: proc(dir, pattern: string, additional_flags: File_Flags = {}) -> (f: ^File, err: Error) { temp_allocator := TEMP_ALLOCATOR_GUARD({}) dir := dir if dir != "" else temp_directory(temp_allocator) or_return prefix, suffix := _prefix_and_suffix(pattern) or_return @@ -26,7 +26,7 @@ create_temp_file :: proc(dir, pattern: string) -> (f: ^File, err: Error) { attempts := 0 for { name := concatenate_strings_from_buffer(name_buf[:], prefix, random_string(rand_buf[:]), suffix) - f, err = open(name, {.Read, .Write, .Create, .Excl}, Permissions_Read_Write_All) + f, err = open(name, {.Read, .Write, .Create, .Excl} + additional_flags, Permissions_Read_Write_All) if err == .Exist { close(f) attempts += 1 diff --git a/core/os/os_windows.odin b/core/os/os_windows.odin index 03c194596..cb7e42f67 100644 --- a/core/os/os_windows.odin +++ b/core/os/os_windows.odin @@ -333,8 +333,14 @@ open :: proc(path: string, mode: int = O_RDONLY, perm: int = 0) -> (Handle, Erro case: create_mode = win32.OPEN_EXISTING } + + attrs := win32.FILE_ATTRIBUTE_NORMAL|win32.FILE_FLAG_BACKUP_SEMANTICS + if mode & (O_NONBLOCK) == O_NONBLOCK { + attrs |= win32.FILE_FLAG_OVERLAPPED + } + wide_path := win32.utf8_to_wstring(path) - handle := Handle(win32.CreateFileW(wide_path, access, share_mode, sa, create_mode, win32.FILE_ATTRIBUTE_NORMAL|win32.FILE_FLAG_BACKUP_SEMANTICS, nil)) + handle := Handle(win32.CreateFileW(wide_path, access, share_mode, sa, create_mode, attrs, nil)) if handle != INVALID_HANDLE { return handle, nil } @@ -862,4 +868,4 @@ pipe :: proc() -> (r, w: Handle, err: Error) { err = get_last_error() } return -} \ No newline at end of file +} From 872fe3ff73b4673ac3e393da6a69b98ae5c4dcf2 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:12:28 +0100 Subject: [PATCH 174/766] kqueue: fix bsds, add user filter, add struct tests --- core/sys/kqueue/kqueue.odin | 93 +++++++++++++++------- tests/core/normal.odin | 1 + tests/core/sys/kqueue/structs.odin | 56 +++++++++++++ tests/core/sys/kqueue/structs/structs.c | 63 +++++++++++++++ tests/core/sys/kqueue/structs/structs.odin | 58 ++++++++++++++ 5 files changed, 244 insertions(+), 27 deletions(-) create mode 100644 tests/core/sys/kqueue/structs.odin create mode 100644 tests/core/sys/kqueue/structs/structs.c create mode 100644 tests/core/sys/kqueue/structs/structs.odin diff --git a/core/sys/kqueue/kqueue.odin b/core/sys/kqueue/kqueue.odin index 25ee9bdce..b51f3426f 100644 --- a/core/sys/kqueue/kqueue.odin +++ b/core/sys/kqueue/kqueue.odin @@ -32,6 +32,7 @@ kevent :: proc(kq: KQ, change_list: []KEvent, event_list: []KEvent, timeout: ^po timeout, ) if n_events == -1 { + n_events = 0 err = posix.errno() } return @@ -60,6 +61,7 @@ Filter :: enum _Filter_Backing { Proc = _FILTER_PROC, // Check for changes to the subject process. Signal = _FILTER_SIGNAL, // Check for signals delivered to the process. Timer = _FILTER_TIMER, // Timers. + User = _FILTER_USER, // User events. } RW_Flag :: enum u32 { @@ -82,18 +84,30 @@ Proc_Flag :: enum u32 { Exit = log2(0x80000000), // Process exited. Fork = log2(0x40000000), // Process forked. Exec = log2(0x20000000), // Process exec'd. - Signal = log2(0x08000000), // Shared with `Filter.Signal`. } Proc_Flags :: bit_set[Proc_Flag; u32] Timer_Flag :: enum u32 { Seconds = log2(0x00000001), // Data is seconds. - USeconds = log2(0x00000002), // Data is microseconds. - NSeconds = log2(_NOTE_NSECONDS), // Data is nanoseconds. + USeconds = log2(_NOTE_USECONDS), // Data is microseconds. Absolute = log2(_NOTE_ABSOLUTE), // Absolute timeout. } Timer_Flags :: bit_set[Timer_Flag; u32] +User_Flag :: enum u32 { + Trigger = log2(0x01000000), + FFAnd = log2(0x40000000), + FFOr = log2(0x80000000), +} +User_Flags :: bit_set[User_Flag; u32] + +USER_FLAGS_COPY :: User_Flags{.FFOr, .FFAnd} +USER_FLAGS_CONTROL_MASK :: transmute(User_Flags)u32(0xc0000000) +USER_FLAGS_MASK :: transmute(User_Flags)u32(0x00FFFFFF) + +// Data is nanoseconds. +TIMER_FLAGS_NSECONDS :: _TIMER_FLAGS_NSECONDS + when ODIN_OS == .Darwin { _Filter_Backing :: distinct i16 @@ -106,10 +120,14 @@ when ODIN_OS == .Darwin { _FILTER_PROC :: -5 _FILTER_SIGNAL :: -6 _FILTER_TIMER :: -7 + _FILTER_USER :: -10 + _NOTE_USECONDS :: 0x00000002 _NOTE_NSECONDS :: 0x00000004 _NOTE_ABSOLUTE :: 0x00000008 + _TIMER_FLAGS_NSECONDS :: Timer_Flags{Timer_Flag(log2(_NOTE_NSECONDS))} + KEvent :: struct #align(4) { // Value used to identify this event. The exact interpretation is determined by the attached filter. ident: uintptr, @@ -119,11 +137,12 @@ when ODIN_OS == .Darwin { flags: Flags, // Filter specific flags. fflags: struct #raw_union { - rw: RW_Flags, - vnode: VNode_Flags, - fproc: Proc_Flags, + rw: RW_Flags `raw_union_tag:"filter=.Read, filter=.Write"`, + vnode: VNode_Flags `raw_union_tag:"filter=.VNode"`, + fproc: Proc_Flags `raw_union_tag:"filter=.Proc"`, // vm: VM_Flags, - timer: Timer_Flags, + timer: Timer_Flags `raw_union_tag:"filter=.Timer"`, + user: User_Flags `raw_union_tag:"filter=.User"`, }, // Filter specific data. data: c.long /* intptr_t */, @@ -143,9 +162,13 @@ when ODIN_OS == .Darwin { _FILTER_PROC :: -5 _FILTER_SIGNAL :: -6 _FILTER_TIMER :: -7 + _FILTER_USER :: -11 - _NOTE_NSECONDS :: 0x00000004 - _NOTE_ABSOLUTE :: 0x00000008 + _NOTE_USECONDS :: 0x00000004 + _NOTE_NSECONDS :: 0x00000008 + _NOTE_ABSOLUTE :: 0x00000010 + + _TIMER_FLAGS_NSECONDS :: Timer_Flags{Timer_Flag(log2(_NOTE_NSECONDS))} KEvent :: struct { // Value used to identify this event. The exact interpretation is determined by the attached filter. @@ -156,11 +179,12 @@ when ODIN_OS == .Darwin { flags: Flags, // Filter specific flags. fflags: struct #raw_union { - rw: RW_Flags, - vnode: VNode_Flags, - fproc: Proc_Flags, + rw: RW_Flags `raw_union_tag:"filter=.Read, filter=.Write"`, + vnode: VNode_Flags `raw_union_tag:"filter=.VNode"`, + fproc: Proc_Flags `raw_union_tag:"filter=.Proc"`, // vm: VM_Flags, - timer: Timer_Flags, + timer: Timer_Flags `raw_union_tag:"filter=.Timer"`, + user: User_Flags `raw_union_tag:"filter=.User"`, }, // Filter specific data. data: i64, @@ -181,11 +205,14 @@ when ODIN_OS == .Darwin { _FILTER_PROC :: 4 _FILTER_SIGNAL :: 5 _FILTER_TIMER :: 6 + _FILTER_USER :: 8 - _NOTE_NSECONDS :: 0x00000003 + _NOTE_USECONDS :: 0x00000002 _NOTE_ABSOLUTE :: 0x00000010 - KEvent :: struct #align(4) { + _TIMER_FLAGS_NSECONDS :: Timer_Flags{.Seconds, .USeconds} + + KEvent :: struct { // Value used to identify this event. The exact interpretation is determined by the attached filter. ident: uintptr, // Filter for event. @@ -194,18 +221,17 @@ when ODIN_OS == .Darwin { flags: Flags, // Filter specific flags. fflags: struct #raw_union { - rw: RW_Flags, - vnode: VNode_Flags, - fproc: Proc_Flags, + rw: RW_Flags `raw_union_tag:"filter=.Read, filter=.Write"`, + vnode: VNode_Flags `raw_union_tag:"filter=.VNode"`, + fproc: Proc_Flags `raw_union_tag:"filter=.Proc"`, // vm: VM_Flags, - timer: Timer_Flags, + timer: Timer_Flags `raw_union_tag:"filter=.Timer"`, + user: User_Flags `raw_union_tag:"filter=.User"`, }, // Filter specific data. data: i64, // Opaque user data passed through the kernel unchanged. udata: rawptr, - // Extensions. - ext: [4]u64, } } else when ODIN_OS == .OpenBSD { @@ -219,10 +245,14 @@ when ODIN_OS == .Darwin { _FILTER_PROC :: -5 _FILTER_SIGNAL :: -6 _FILTER_TIMER :: -7 + _FILTER_USER :: -10 - _NOTE_NSECONDS :: 0x00000003 + _NOTE_USECONDS :: 0x00000002 + _NOTE_NSECONDS :: 0x00000004 _NOTE_ABSOLUTE :: 0x00000010 + _TIMER_FLAGS_NSECONDS :: Timer_Flags{Timer_Flag(log2(_NOTE_NSECONDS))} + KEvent :: struct #align(4) { // Value used to identify this event. The exact interpretation is determined by the attached filter. ident: uintptr, @@ -232,11 +262,12 @@ when ODIN_OS == .Darwin { flags: Flags, // Filter specific flags. fflags: struct #raw_union { - rw: RW_Flags, - vnode: VNode_Flags, - fproc: Proc_Flags, + rw: RW_Flags `raw_union_tag:"filter=.Read, filter=.Write"`, + vnode: VNode_Flags `raw_union_tag:"filter=.VNode"`, + fproc: Proc_Flags `raw_union_tag:"filter=.Proc"`, // vm: VM_Flags, - timer: Timer_Flags, + timer: Timer_Flags `raw_union_tag:"filter=.Timer"`, + user: User_Flags `raw_union_tag:"filter=.User"`, }, // Filter specific data. data: i64, @@ -245,12 +276,20 @@ when ODIN_OS == .Darwin { } } +when ODIN_OS == .NetBSD { + @(private) + LKEVENT :: "__kevent50" +} else { + @(private) + LKEVENT :: "kevent" +} + @(private) log2 :: intrinsics.constant_log2 foreign lib { @(link_name="kqueue") _kqueue :: proc() -> KQ --- - @(link_name="kevent") + @(link_name=LKEVENT) _kevent :: proc(kq: KQ, change_list: [^]KEvent, n_changes: c.int, event_list: [^]KEvent, n_events: c.int, timeout: ^posix.timespec) -> c.int --- } diff --git a/tests/core/normal.odin b/tests/core/normal.odin index e8b61fee8..42da389d2 100644 --- a/tests/core/normal.odin +++ b/tests/core/normal.odin @@ -45,6 +45,7 @@ download_assets :: proc "contextless" () { @(require) import "sync" @(require) import "sync/chan" @(require) import "sys/posix" +@(require) import "sys/kqueue" @(require) import "sys/windows" @(require) import "text/i18n" @(require) import "text/match" diff --git a/tests/core/sys/kqueue/structs.odin b/tests/core/sys/kqueue/structs.odin new file mode 100644 index 000000000..edf1fdd1e --- /dev/null +++ b/tests/core/sys/kqueue/structs.odin @@ -0,0 +1,56 @@ +#+build darwin, freebsd, openbsd, netbsd +package tests_core_sys_kqueue + +import "core:strings" +import "core:testing" +import os "core:os/os2" + +@(test) +structs :: proc(t: ^testing.T) { + { + c_compiler := os.get_env("CC", context.temp_allocator) + if c_compiler == "" { + c_compiler = "clang" + } + + c_compilation, c_start_err := os.process_start({ + command = {c_compiler, #directory + "/structs/structs.c", "-o", #directory + "/structs/c_structs"}, + stdout = os.stdout, + stderr = os.stderr, + }) + testing.expect_value(t, c_start_err, nil) + + o_compilation, o_start_err := os.process_start({ + command = {ODIN_ROOT + "/odin", "build", #directory + "/structs", "-out:" + #directory + "/structs/odin_structs"}, + stdout = os.stdout, + stderr = os.stderr, + }) + testing.expect_value(t, o_start_err, nil) + + c_status, c_err := os.process_wait(c_compilation) + testing.expect_value(t, c_err, nil) + testing.expect_value(t, c_status.exit_code, 0) + + o_status, o_err := os.process_wait(o_compilation) + testing.expect_value(t, o_err, nil) + testing.expect_value(t, o_status.exit_code, 0) + } + + c_status, c_stdout, c_stderr, c_err := os.process_exec({command={#directory + "/structs/c_structs"}}, context.temp_allocator) + testing.expect_value(t, c_err, nil) + testing.expect_value(t, c_status.exit_code, 0) + testing.expect_value(t, string(c_stderr), "") + + o_status, o_stdout, o_stderr, o_err := os.process_exec({command={#directory + "/structs/odin_structs"}}, context.temp_allocator) + testing.expect_value(t, o_err, nil) + testing.expect_value(t, o_status.exit_code, 0) + testing.expect_value(t, string(o_stderr), "") + + testing.expect(t, strings.trim_space(string(c_stdout)) != "") + + testing.expect_value( + t, + strings.trim_space(string(o_stdout)), + strings.trim_space(string(c_stdout)), + ) +} diff --git a/tests/core/sys/kqueue/structs/structs.c b/tests/core/sys/kqueue/structs/structs.c new file mode 100644 index 000000000..e7620c994 --- /dev/null +++ b/tests/core/sys/kqueue/structs/structs.c @@ -0,0 +1,63 @@ +#include +#include +#include + +int main(int argc, char *argv[]) +{ + printf("kevent %zu %zu\n", sizeof(struct kevent), _Alignof(struct kevent)); + printf("kevent.ident %zu\n", offsetof(struct kevent, ident)); + printf("kevent.filter %zu\n", offsetof(struct kevent, filter)); + printf("kevent.flags %zu\n", offsetof(struct kevent, flags)); + printf("kevent.fflags %zu\n", offsetof(struct kevent, fflags)); + printf("kevent.data %zu\n", offsetof(struct kevent, data)); + printf("kevent.udata %zu\n", offsetof(struct kevent, udata)); + + printf("EV_ADD %d\n", EV_ADD); + printf("EV_DELETE %d\n", EV_DELETE); + printf("EV_ENABLE %d\n", EV_ENABLE); + printf("EV_DISABLE %d\n", EV_DISABLE); + printf("EV_ONESHOT %d\n", EV_ONESHOT); + printf("EV_CLEAR %d\n", EV_CLEAR); + printf("EV_RECEIPT %d\n", EV_RECEIPT); + printf("EV_DISPATCH %d\n", EV_DISPATCH); + printf("EV_ERROR %d\n", EV_ERROR); + printf("EV_EOF %d\n", EV_EOF); + + printf("EVFILT_READ %d\n", EVFILT_READ); + printf("EVFILT_WRITE %d\n", EVFILT_WRITE); + printf("EVFILT_AIO %d\n", EVFILT_AIO); + printf("EVFILT_VNODE %d\n", EVFILT_VNODE); + printf("EVFILT_PROC %d\n", EVFILT_PROC); + printf("EVFILT_SIGNAL %d\n", EVFILT_SIGNAL); + printf("EVFILT_TIMER %d\n", EVFILT_TIMER); + printf("EVFILT_USER %d\n", EVFILT_USER); + + printf("NOTE_SECONDS %u\n", NOTE_SECONDS); + printf("NOTE_USECONDS %u\n", NOTE_USECONDS); + printf("NOTE_NSECONDS %u\n", NOTE_NSECONDS); +#if defined(NOTE_ABSOLUTE) + printf("NOTE_ABSOLUTE %u\n", NOTE_ABSOLUTE); +#else + printf("NOTE_ABSOLUTE %u\n", NOTE_ABSTIME); +#endif + + printf("NOTE_LOWAT %u\n", NOTE_LOWAT); + + printf("NOTE_DELETE %u\n", NOTE_DELETE); + printf("NOTE_WRITE %u\n", NOTE_WRITE); + printf("NOTE_EXTEND %u\n", NOTE_EXTEND); + printf("NOTE_ATTRIB %u\n", NOTE_ATTRIB); + printf("NOTE_LINK %u\n", NOTE_LINK); + printf("NOTE_RENAME %u\n", NOTE_RENAME); + printf("NOTE_REVOKE %u\n", NOTE_REVOKE); + + printf("NOTE_EXIT %u\n", NOTE_EXIT); + printf("NOTE_FORK %u\n", NOTE_FORK); + printf("NOTE_EXEC %u\n", NOTE_EXEC); + + printf("NOTE_TRIGGER %u\n", NOTE_TRIGGER); + printf("NOTE_FFAND %u\n", NOTE_FFAND); + printf("NOTE_FFOR %u\n", NOTE_FFOR); + printf("NOTE_FFCOPY %u\n", NOTE_FFCOPY); + return 0; +} diff --git a/tests/core/sys/kqueue/structs/structs.odin b/tests/core/sys/kqueue/structs/structs.odin new file mode 100644 index 000000000..4886f63e4 --- /dev/null +++ b/tests/core/sys/kqueue/structs/structs.odin @@ -0,0 +1,58 @@ +package main + +import "core:fmt" +import "core:sys/kqueue" + +main :: proc() { + fmt.println("kevent", size_of(kqueue.KEvent), align_of(kqueue.KEvent)) + fmt.println("kevent.ident", offset_of(kqueue.KEvent, ident)) + fmt.println("kevent.filter", offset_of(kqueue.KEvent, filter)) + fmt.println("kevent.flags", offset_of(kqueue.KEvent, flags)) + fmt.println("kevent.fflags", offset_of(kqueue.KEvent, fflags)) + fmt.println("kevent.data", offset_of(kqueue.KEvent, data)) + fmt.println("kevent.udata", offset_of(kqueue.KEvent, udata)) + + fmt.println("EV_ADD", transmute(kqueue._Flags_Backing)kqueue.Flags{.Add}) + fmt.println("EV_DELETE", transmute(kqueue._Flags_Backing)kqueue.Flags{.Delete}) + fmt.println("EV_ENABLE", transmute(kqueue._Flags_Backing)kqueue.Flags{.Enable}) + fmt.println("EV_DISABLE", transmute(kqueue._Flags_Backing)kqueue.Flags{.Disable}) + fmt.println("EV_ONESHOT", transmute(kqueue._Flags_Backing)kqueue.Flags{.One_Shot}) + fmt.println("EV_CLEAR", transmute(kqueue._Flags_Backing)kqueue.Flags{.Clear}) + fmt.println("EV_RECEIPT", transmute(kqueue._Flags_Backing)kqueue.Flags{.Receipt}) + fmt.println("EV_DISPATCH", transmute(kqueue._Flags_Backing)kqueue.Flags{.Dispatch}) + fmt.println("EV_ERROR", transmute(kqueue._Flags_Backing)kqueue.Flags{.Error}) + fmt.println("EV_EOF", transmute(kqueue._Flags_Backing)kqueue.Flags{.EOF}) + + fmt.println("EVFILT_READ", int(kqueue.Filter.Read)) + fmt.println("EVFILT_WRITE", int(kqueue.Filter.Write)) + fmt.println("EVFILT_AIO", int(kqueue.Filter.AIO)) + fmt.println("EVFILT_VNODE", int(kqueue.Filter.VNode)) + fmt.println("EVFILT_PROC", int(kqueue.Filter.Proc)) + fmt.println("EVFILT_SIGNAL", int(kqueue.Filter.Signal)) + fmt.println("EVFILT_TIMER", int(kqueue.Filter.Timer)) + fmt.println("EVFILT_USER", int(kqueue.Filter.User)) + + fmt.println("NOTE_SECONDS", transmute(u32)kqueue.Timer_Flags{.Seconds}) + fmt.println("NOTE_USECONDS", transmute(u32)kqueue.Timer_Flags{.USeconds}) + fmt.println("NOTE_NSECONDS", transmute(u32)kqueue.TIMER_FLAGS_NSECONDS) + fmt.println("NOTE_ABSOLUTE", transmute(u32)kqueue.Timer_Flags{.Absolute}) + + fmt.println("NOTE_LOWAT", transmute(u32)kqueue.RW_Flags{.Low_Water_Mark}) + + fmt.println("NOTE_DELETE", transmute(u32)kqueue.VNode_Flags{.Delete}) + fmt.println("NOTE_WRITE", transmute(u32)kqueue.VNode_Flags{.Write}) + fmt.println("NOTE_EXTEND", transmute(u32)kqueue.VNode_Flags{.Extend}) + fmt.println("NOTE_ATTRIB", transmute(u32)kqueue.VNode_Flags{.Attrib}) + fmt.println("NOTE_LINK", transmute(u32)kqueue.VNode_Flags{.Link}) + fmt.println("NOTE_RENAME", transmute(u32)kqueue.VNode_Flags{.Rename}) + fmt.println("NOTE_REVOKE", transmute(u32)kqueue.VNode_Flags{.Revoke}) + + fmt.println("NOTE_EXIT", transmute(u32)kqueue.Proc_Flags{.Exit}) + fmt.println("NOTE_FORK", transmute(u32)kqueue.Proc_Flags{.Fork}) + fmt.println("NOTE_EXEC", transmute(u32)kqueue.Proc_Flags{.Exec}) + + fmt.println("NOTE_TRIGGER", transmute(u32)kqueue.User_Flags{.Trigger}) + fmt.println("NOTE_FFAND", transmute(u32)kqueue.User_Flags{.FFAnd}) + fmt.println("NOTE_FFOR", transmute(u32)kqueue.User_Flags{.FFOr}) + fmt.println("NOTE_FFCOPY", transmute(u32)kqueue.USER_FLAGS_COPY) +} From 26d47f23f71dbeec3c10c3e4c7ed6b5e0f462b5e Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:13:43 +0100 Subject: [PATCH 175/766] linux: implement eventfd syscall --- core/sys/linux/bits.odin | 6 ++++++ core/sys/linux/sys.odin | 5 ++++- core/sys/linux/types.odin | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index 213d6c26f..59383638d 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -2269,3 +2269,9 @@ Swap_Flags_Bits :: enum { PREFER = log2(0x8000), DISCARD = log2(0x10000), } + +Eventfd_Flags_Bits :: enum { + SEMAPHORE, + CLOEXEC = auto_cast Open_Flags_Bits.CLOEXEC, + NONBLOCK = auto_cast Open_Flags_Bits.NONBLOCK, +} diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index faeda6f43..b10759595 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -3001,7 +3001,10 @@ timerfd_create :: proc "contextless" (clock_id: Clock_Id, flags: Open_Flags) -> return errno_unwrap2(ret, Fd) } -// TODO(flysand): eventfd +eventfd :: proc "contextless" (initval: u32, flags: Eventfd_Flags) -> (Fd, Errno) { + ret := syscall(SYS_eventfd2, initval, transmute(i32)flags) + return errno_unwrap2(ret, Fd) +} // TODO(flysand): fallocate diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index 0910f11ec..de4417beb 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -1748,3 +1748,5 @@ Mount_Flags :: bit_set[Mount_Flags_Bits; uint] Umount2_Flags :: bit_set[Umount2_Flags_Bits; u32] Swap_Flags :: bit_set[Swap_Flags_Bits; u32] + +Eventfd_Flags :: bit_set[Eventfd_Flags_Bits; i32] From b2af4f335d47a9e4424bd5393381a4b226afe998 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:14:17 +0100 Subject: [PATCH 176/766] posix: fix openat mode not being c_vararg --- core/sys/posix/fcntl.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index db095c418..52d97f528 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -70,7 +70,7 @@ foreign lib { [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html ]] */ - openat :: proc(fd: FD, path: cstring, flags: O_Flags, mode: mode_t = {}) -> FD --- + openat :: proc(fd: FD, path: cstring, flags: O_Flags, #c_vararg mode: ..mode_t) -> FD --- } FCNTL_Cmd :: enum c.int { From 24ee35af28a49a110861b49c8aa3a0c7b7c9d5d5 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 11 Jan 2026 20:15:55 +0100 Subject: [PATCH 177/766] nbio: add package --- core/container/pool/pool.odin | 132 + core/container/pool/pool_arena_others.odin | 29 + core/container/pool/pool_arena_virtual.odin | 24 + core/nbio/doc.odin | 195 ++ core/nbio/errors.odin | 84 + core/nbio/errors_linux.odin | 16 + core/nbio/errors_others.odin | 20 + core/nbio/errors_posix.odin | 17 + core/nbio/errors_windows.odin | 17 + core/nbio/impl.odin | 256 ++ core/nbio/impl_linux.odin | 1421 +++++++++++ core/nbio/impl_others.odin | 217 ++ core/nbio/impl_posix.odin | 1403 +++++++++++ core/nbio/impl_posix_darwin.odin | 29 + core/nbio/impl_posix_freebsd.odin | 52 + core/nbio/impl_posix_netbsd.odin | 12 + core/nbio/impl_posix_openbsd.odin | 12 + core/nbio/impl_windows.odin | 1738 +++++++++++++ core/nbio/nbio.odin | 435 ++++ core/nbio/net.odin | 39 + core/nbio/ops.odin | 2473 +++++++++++++++++++ core/nbio/uring/doc.odin | 88 + core/nbio/uring/ops.odin | 847 +++++++ core/nbio/uring/uring.odin | 294 +++ core/slice/slice.odin | 36 + core/sys/linux/types.odin | 48 +- core/sys/windows/kernel32.odin | 23 +- core/sys/windows/mswsock.odin | 40 + core/sys/windows/ntdll.odin | 25 +- core/sys/windows/types.odin | 12 +- core/sys/windows/winerror.odin | 7 + core/sys/windows/ws2_32.odin | 8 +- examples/all/all_main.odin | 5 +- tests/core/nbio/fs.odin | 100 + tests/core/nbio/nbio.odin | 258 ++ tests/core/nbio/net.odin | 400 +++ tests/core/nbio/remove.odin | 247 ++ tests/core/normal.odin | 1 + 38 files changed, 11026 insertions(+), 34 deletions(-) create mode 100644 core/container/pool/pool.odin create mode 100644 core/container/pool/pool_arena_others.odin create mode 100644 core/container/pool/pool_arena_virtual.odin create mode 100644 core/nbio/doc.odin create mode 100644 core/nbio/errors.odin create mode 100644 core/nbio/errors_linux.odin create mode 100644 core/nbio/errors_others.odin create mode 100644 core/nbio/errors_posix.odin create mode 100644 core/nbio/errors_windows.odin create mode 100644 core/nbio/impl.odin create mode 100644 core/nbio/impl_linux.odin create mode 100644 core/nbio/impl_others.odin create mode 100644 core/nbio/impl_posix.odin create mode 100644 core/nbio/impl_posix_darwin.odin create mode 100644 core/nbio/impl_posix_freebsd.odin create mode 100644 core/nbio/impl_posix_netbsd.odin create mode 100644 core/nbio/impl_posix_openbsd.odin create mode 100644 core/nbio/impl_windows.odin create mode 100644 core/nbio/nbio.odin create mode 100644 core/nbio/net.odin create mode 100644 core/nbio/ops.odin create mode 100644 core/nbio/uring/doc.odin create mode 100644 core/nbio/uring/ops.odin create mode 100644 core/nbio/uring/uring.odin create mode 100644 core/sys/windows/mswsock.odin create mode 100644 tests/core/nbio/fs.odin create mode 100644 tests/core/nbio/nbio.odin create mode 100644 tests/core/nbio/net.odin create mode 100644 tests/core/nbio/remove.odin diff --git a/core/container/pool/pool.odin b/core/container/pool/pool.odin new file mode 100644 index 000000000..93eddb514 --- /dev/null +++ b/core/container/pool/pool.odin @@ -0,0 +1,132 @@ +package container_pool + +import "base:intrinsics" +import "base:sanitizer" + +import "core:mem" +import "core:sync" + +_ :: sanitizer + +DEFAULT_BLOCK_SIZE :: _DEFAULT_BLOCK_SIZE + +Pool_Arena :: _Pool_Arena + +/* +A thread-safe (between init and destroy) object pool backed by virtual growing arena returning stable pointers. +The element type requires an intrusive link node. + +Example: + Elem :: struct { + link: ^Elem, + } + + p: pool.Pool(Elem) + pool.init(&p, "link") +*/ +Pool :: struct($T: typeid) { + arena: Pool_Arena, + num_outstanding: int, + num_ready: int, + link_off: uintptr, + free_list: ^T, +} + +@(require_results) +init :: proc(p: ^Pool($T), $link_field: string, block_size: uint = DEFAULT_BLOCK_SIZE) -> (err: mem.Allocator_Error) + where intrinsics.type_has_field(T, link_field), + intrinsics.type_field_type(T, link_field) == ^T { + p.link_off = offset_of_by_string(T, link_field) + return _pool_arena_init(&p.arena, block_size) +} + +destroy :: proc(p: ^Pool($T)) { + for elem := p.free_list; elem != nil; elem = _get_next(p, elem) { + _unpoison_elem(p, elem) + free(elem, _pool_arena_allocator(&p.arena)) + } + + _pool_arena_destroy(&p.arena) +} + +@(require_results) +get :: proc(p: ^Pool($T)) -> (elem: ^T, err: mem.Allocator_Error) #optional_allocator_error { + sync.atomic_add_explicit(&p.num_outstanding, 1, .Relaxed) + + for { + elem = sync.atomic_load(&p.free_list) + if elem == nil { + // NOTE: pool arena has an internal lock. + return new(T, _pool_arena_allocator(&p.arena)) + } + + if _, ok := sync.atomic_compare_exchange_weak(&p.free_list, elem, _get_next(p, elem)); ok { + _set_next(p, elem, nil) + _unpoison_elem(p, elem) + sync.atomic_sub_explicit(&p.num_ready, 1, .Relaxed) + return + } + } +} + +put :: proc(p: ^Pool($T), elem: ^T) { + mem.zero_item(elem) + _poison_elem(p, elem) + + defer sync.atomic_sub_explicit(&p.num_outstanding, 1, .Relaxed) + defer sync.atomic_add_explicit(&p.num_ready, 1, .Relaxed) + + for { + head := sync.atomic_load(&p.free_list) + _set_next(p, elem, head) + if _, ok := sync.atomic_compare_exchange_weak(&p.free_list, head, elem); ok { + return + } + } +} + +num_outstanding :: proc(p: ^Pool($T)) -> int { + return sync.atomic_load(&p.num_outstanding) +} + +num_ready :: proc(p: ^Pool($T)) -> int { + return sync.atomic_load(&p.num_ready) +} + +cap :: proc(p: ^Pool($T)) -> int { + return sync.atomic_load(&p.num_ready) + sync.atomic_load(&p.num_outstanding) +} + +_get_next :: proc(p: ^Pool($T), elem: ^T) -> ^T { + return (^^T)(uintptr(elem) + p.link_off)^ +} + +_set_next :: proc(p: ^Pool($T), elem: ^T, next: ^T) { + (^^T)(uintptr(elem) + p.link_off)^ = next +} + +@(disabled=.Address not_in ODIN_SANITIZER_FLAGS) +_poison_elem :: proc(p: ^Pool($T), elem: ^T) { + if p.link_off > 0 { + sanitizer.address_poison_rawptr(elem, int(p.link_off)) + } + + len := size_of(T) - p.link_off - size_of(rawptr) + if len > 0 { + ptr := rawptr(uintptr(elem) + p.link_off + size_of(rawptr)) + sanitizer.address_poison_rawptr(ptr, int(len)) + } +} + +@(disabled=.Address not_in ODIN_SANITIZER_FLAGS) +_unpoison_elem :: proc(p: ^Pool($T), elem: ^T) { + if p.link_off > 0 { + sanitizer.address_unpoison_rawptr(elem, int(p.link_off)) + } + + len := size_of(T) - p.link_off - size_of(rawptr) + if len > 0 { + ptr := rawptr(uintptr(elem) + p.link_off + size_of(rawptr)) + sanitizer.address_unpoison_rawptr(ptr, int(len)) + } +} diff --git a/core/container/pool/pool_arena_others.odin b/core/container/pool/pool_arena_others.odin new file mode 100644 index 000000000..3069076f7 --- /dev/null +++ b/core/container/pool/pool_arena_others.odin @@ -0,0 +1,29 @@ +#+build !darwin +#+build !freebsd +#+build !openbsd +#+build !netbsd +#+build !linux +#+build !windows +#+private +package container_pool + +import "base:runtime" + +import "core:mem" + +_Pool_Arena :: runtime.Arena + +_DEFAULT_BLOCK_SIZE :: mem.Megabyte + +_pool_arena_init :: proc(arena: ^Pool_Arena, block_size: uint = DEFAULT_BLOCK_SIZE) -> (err: runtime.Allocator_Error) { + runtime.arena_init(arena, block_size, runtime.default_allocator()) or_return + return +} + +_pool_arena_allocator :: proc(arena: ^Pool_Arena) -> runtime.Allocator { + return runtime.arena_allocator(arena) +} + +_pool_arena_destroy :: proc(arena: ^Pool_Arena) { + runtime.arena_destroy(arena) +} diff --git a/core/container/pool/pool_arena_virtual.odin b/core/container/pool/pool_arena_virtual.odin new file mode 100644 index 000000000..192e60260 --- /dev/null +++ b/core/container/pool/pool_arena_virtual.odin @@ -0,0 +1,24 @@ +#+build darwin, freebsd, openbsd, netbsd, linux, windows +package container_pool + +import "base:runtime" + +import "core:mem" +import "core:mem/virtual" + +_Pool_Arena :: virtual.Arena + +_DEFAULT_BLOCK_SIZE :: mem.Gigabyte + +_pool_arena_init :: proc(arena: ^Pool_Arena, block_size: uint = DEFAULT_BLOCK_SIZE) -> (err: runtime.Allocator_Error) { + virtual.arena_init_growing(arena, block_size) or_return + return +} + +_pool_arena_allocator :: proc(arena: ^Pool_Arena) -> runtime.Allocator { + return virtual.arena_allocator(arena) +} + +_pool_arena_destroy :: proc(arena: ^Pool_Arena) { + virtual.arena_destroy(arena) +} diff --git a/core/nbio/doc.odin b/core/nbio/doc.odin new file mode 100644 index 000000000..c43196923 --- /dev/null +++ b/core/nbio/doc.odin @@ -0,0 +1,195 @@ +/* +package nbio implements a non-blocking I/O and event loop abstraction layer +over several platform-specific asynchronous I/O APIs. + +More examples can be found in Odin's examples repository +at [[ examples/nbio ; https://github.com/odin-lang/examples/nbio ]]. + +**Event Loop**: + +Each thread may have at most one event loop associated with it. +This is enforced by the package, as running multiple event loops on a single +thread does not make sense. + +Event loops are reference counted and managed by the package. + +`acquire_thread_event_loop` and `release_thread_event_loop` can be used +to acquire and release a reference. Acquiring must be done before any operation +is done. + +The event loop progresses in ticks. A tick checks if any work is to be done, +and based on the given timeout may block waiting for work. + +Ticks are typically done using the `tick`, `run`, and `run_until` procedures. + +Example: + package main + + import "core:nbio" + import "core:time" + import "core:fmt" + + main :: proc() { + err := nbio.acquire_thread_event_loop() + assert(err == nil) + defer nbio.release_thread_event_loop() + + nbio.timeout(time.Second, proc(_: ^nbio.Operation) { + fmt.println("Hellope after 1 second!") + }) + + err = nbio.run() + assert(err == nil) + } + + +**Time and timeouts**: + +Timeouts are intentionally *slightly inaccurate* by design. + +A timeout is not checked continuously, instead, it is evaluated only when +a tick occurs. This means if a tick took a long time, your timeout may be ready +for a bit of time already before the callback is called. + +The function `now` returns the current time as perceived by the event +loop. This value is cached at least once per tick so it is fast to retrieve. + +Most operations also take an optional timeout when executed. +If the timeout completes before the operation, the operation is cancelled and +called back with a `.Timeout` error. + + +**Threading**: + +The package has a concept of I/O threads (threads that are ticking) and worker +threads (any other thread). + +An I/O thread is mostly self contained, operations are executed on it, and +callbacks run on it. + +If you try to execute an operation on a thread that has no running event loop +a panic will be executed. Instead a worker thread can execute operations onto +a running event loop by taking it's reference and executing operations with +that reference. + +In this case: +- The operation is enqueued from the worker thread +- The I/O thread is optionally woken up from blocking for work with `wake_up` +- The next tick, the operation is executed by the I/O thread +- The callback is invoked on the I/O thread + +Example: + package main + + import "core:nbio" + import "core:net" + import "core:thread" + import "core:time" + + Connection :: struct { + loop: ^nbio.Event_Loop, + socket: net.TCP_Socket, + } + + main :: proc() { + workers: thread.Pool + thread.pool_init(&workers, context.allocator, 2) + thread.pool_start(&workers) + + err := nbio.acquire_thread_event_loop() + defer nbio.release_thread_event_loop() + assert(err == nil) + + server, listen_err := nbio.listen_tcp({nbio.IP4_Any, 1234}) + assert(listen_err == nil) + nbio.accept_poly(server, &workers, on_accept) + + err = nbio.run() + assert(err == nil) + + on_accept :: proc(op: ^nbio.Operation, workers: ^thread.Pool) { + assert(op.accept.err == nil) + + nbio.accept_poly(op.accept.socket, workers, on_accept) + + thread.pool_add_task(workers, context.allocator, do_work, new_clone(Connection{ + loop = op.l, + socket = op.accept.client, + })) + } + + do_work :: proc(t: thread.Task) { + connection := (^Connection)(t.data) + + // Imagine CPU intensive work that's been ofloaded to a worker thread. + time.sleep(time.Second * 1) + + nbio.send_poly(connection.socket, {transmute([]byte)string("Hellope!\n")}, connection, on_sent, l=connection.loop) + } + + on_sent :: proc(op: ^nbio.Operation, connection: ^Connection) { + assert(op.send.err == nil) + // Client got our message, clean up. + nbio.close(connection.socket) + free(connection) + } + } + + +**Handle and socket association**: + +Most platforms require handles (files, sockets, etc.) to be explicitly +associated with an event loop or configured for non-blocking/asynchronous +operation. + +On some platforms (notably Windows), this requires a specific flag at open +time (`.Non_Blocking` for `core:os`) and association may fail if the handle was not created +correctly. + +For this reason, prefer `open` and `create_socket` from this package instead. + +`associate_handle`, `associate_file`, and `associate_socket` can be used for externally opened +files/sockets. + + +**Offsets and positional I/O**: + +Operations do not implicitly use or modify a handle’s internal file +offset. + +Instead, operations such as `read` and `write` are *positional* and require +an explicit offset. + +This avoids ambiguity and subtle bugs when multiple asynchronous operations +are issued concurrently against the same handle. + + +**Contexts and callbacks**: + +The `context` inside a callback is *not* the context that submitted the +operation. + +Instead, the callback receives the context that was active when the event +loop function (`tick`, `run`, etc.) was called. + +This is because otherwise the context would have to be copied and held onto for each operation. + +If the submitting context is required inside the callback, it must be copied +into the operation’s user data explicitly. + +Example: + nbio.timeout_poly(time.Second, new_clone(context), proc(_: ^Operation, ctx: ^runtime.Context) { + context = ctx^ + free(ctx) + }) + + +**Callback scheduling guarantees**: + +Callbacks are guaranteed to be invoked in a later tick, never synchronously. +This means that the operation returned from a procedure is at least valid till the end of the +current tick, because an operation is freed after it's callback is called. +Thus you can set user data after an execution is queued, or call `remove`, removing subtle "race" +conditions and simplifying control flow. +*/ +package nbio diff --git a/core/nbio/errors.odin b/core/nbio/errors.odin new file mode 100644 index 000000000..f3bd381d5 --- /dev/null +++ b/core/nbio/errors.odin @@ -0,0 +1,84 @@ +package nbio + +import "base:intrinsics" + +import "core:reflect" + +Error :: intrinsics.type_merge( + Network_Error, + union #shared_nil { + General_Error, + FS_Error, + }, +) +#assert(size_of(Error) == 8) + +// Errors regarding general usage of the event loop. +General_Error :: enum i32 { + None, + + Allocation_Failed = i32(PLATFORM_ERR_ALLOCATION_FAILED), + Unsupported = i32(PLATFORM_ERR_UNSUPPORTED), +} + +// Errors gotten from file system operations. +FS_Error :: enum i32 { + None, + Unsupported = i32(PLATFORM_ERR_UNSUPPORTED), + Allocation_Failed = i32(PLATFORM_ERR_ALLOCATION_FAILED), + Timeout = i32(PLATFORM_ERR_TIMEOUT), + Invalid_Argument = i32(PLATFORM_ERR_INVALID_ARGUMENT), + Permission_Denied = i32(PLATFORM_ERR_PERMISSION_DENIED), + EOF = i32(PLATFORM_ERR_EOF), + Exists = i32(PLATFORM_ERR_EXISTS), + Not_Found = i32(PLATFORM_ERR_NOT_FOUND), +} + +Platform_Error :: _Platform_Error + +error_string :: proc(err: Error) -> string { + err := err + variant := any{ + id = reflect.union_variant_typeid(err), + data = &err, + } + str := reflect.enum_string(variant) + + if str == "" { + #partial switch uerr in err { + case FS_Error: + str, _ = reflect.enum_name_from_value(Platform_Error(uerr)) + case General_Error: + str, _ = reflect.enum_name_from_value(Platform_Error(uerr)) + } + } + if str == "" { + str = "Unknown" + } + + return str +} + +error_string_recv :: proc(recv_err: Recv_Error) -> string { + switch err in recv_err { + case TCP_Recv_Error: return error_string(err) + case UDP_Recv_Error: return error_string(err) + case: return "Unknown" + } +} + +error_string_send :: proc(send_err: Send_Error) -> string { + switch err in send_err { + case TCP_Send_Error: return error_string(err) + case UDP_Send_Error: return error_string(err) + case: return "Unknown" + } +} + +error_string_sendfile :: proc(send_err: Send_File_Error) -> string { + switch err in send_err { + case TCP_Send_Error: return error_string(err) + case FS_Error: return error_string(err) + case: return "Unknown" + } +} diff --git a/core/nbio/errors_linux.odin b/core/nbio/errors_linux.odin new file mode 100644 index 000000000..5c3472500 --- /dev/null +++ b/core/nbio/errors_linux.odin @@ -0,0 +1,16 @@ +#+private +package nbio + +import "core:sys/linux" + +PLATFORM_ERR_UNSUPPORTED :: linux.Errno.ENOSYS +PLATFORM_ERR_ALLOCATION_FAILED :: linux.Errno.ENOMEM +PLATFORM_ERR_TIMEOUT :: linux.Errno.ECANCELED +PLATFORM_ERR_INVALID_ARGUMENT :: linux.Errno.EINVAL +PLATFORM_ERR_OVERFLOW :: linux.Errno.E2BIG +PLATFORM_ERR_NOT_FOUND :: linux.Errno.ENOENT +PLATFORM_ERR_EXISTS :: linux.Errno.EEXIST +PLATFORM_ERR_PERMISSION_DENIED :: linux.Errno.EPERM +PLATFORM_ERR_EOF :: -100 // There is no EOF errno, we use negative for our own error codes. + +_Platform_Error :: linux.Errno diff --git a/core/nbio/errors_others.odin b/core/nbio/errors_others.odin new file mode 100644 index 000000000..f27c91178 --- /dev/null +++ b/core/nbio/errors_others.odin @@ -0,0 +1,20 @@ +#+build !darwin +#+build !freebsd +#+build !openbsd +#+build !netbsd +#+build !linux +#+build !windows +#+private +package nbio + +PLATFORM_ERR_UNSUPPORTED :: 1 +PLATFORM_ERR_ALLOCATION_FAILED :: 2 +PLATFORM_ERR_TIMEOUT :: 3 +PLATFORM_ERR_INVALID_ARGUMENT :: 4 +PLATFORM_ERR_OVERFLOW :: 5 +PLATFORM_ERR_NOT_FOUND :: 6 +PLATFORM_ERR_EXISTS :: 7 +PLATFORM_ERR_PERMISSION_DENIED :: 8 +PLATFORM_ERR_EOF :: 9 + +_Platform_Error :: enum i32 {} diff --git a/core/nbio/errors_posix.odin b/core/nbio/errors_posix.odin new file mode 100644 index 000000000..3dd8f781d --- /dev/null +++ b/core/nbio/errors_posix.odin @@ -0,0 +1,17 @@ +#+build darwin, freebsd, netbsd, openbsd +#+private +package nbio + +import "core:sys/posix" + +PLATFORM_ERR_UNSUPPORTED :: posix.Errno.ENOSYS +PLATFORM_ERR_ALLOCATION_FAILED :: posix.Errno.ENOMEM +PLATFORM_ERR_TIMEOUT :: posix.Errno.ECANCELED +PLATFORM_ERR_INVALID_ARGUMENT :: posix.Errno.EINVAL +PLATFORM_ERR_OVERFLOW :: posix.Errno.E2BIG +PLATFORM_ERR_NOT_FOUND :: posix.Errno.ENOENT +PLATFORM_ERR_EXISTS :: posix.Errno.EEXIST +PLATFORM_ERR_PERMISSION_DENIED :: posix.Errno.EPERM +PLATFORM_ERR_EOF :: -100 // There is no EOF errno, we use negative for our own error codes. + +_Platform_Error :: posix.Errno diff --git a/core/nbio/errors_windows.odin b/core/nbio/errors_windows.odin new file mode 100644 index 000000000..d9b3b7e4d --- /dev/null +++ b/core/nbio/errors_windows.odin @@ -0,0 +1,17 @@ +#+private +package nbio + +import win "core:sys/windows" + +PLATFORM_ERR_UNSUPPORTED :: win.System_Error.NOT_SUPPORTED + +PLATFORM_ERR_ALLOCATION_FAILED :: win.System_Error.OUTOFMEMORY +PLATFORM_ERR_TIMEOUT :: win.System_Error.WAIT_TIMEOUT +PLATFORM_ERR_INVALID_ARGUMENT :: win.System_Error.BAD_ARGUMENTS +PLATFORM_ERR_OVERFLOW :: win.System_Error.BUFFER_OVERFLOW +PLATFORM_ERR_NOT_FOUND :: win.System_Error.FILE_NOT_FOUND +PLATFORM_ERR_EXISTS :: win.System_Error.FILE_EXISTS +PLATFORM_ERR_PERMISSION_DENIED :: win.System_Error.ACCESS_DENIED +PLATFORM_ERR_EOF :: win.System_Error.HANDLE_EOF + +_Platform_Error :: win.System_Error diff --git a/core/nbio/impl.odin b/core/nbio/impl.odin new file mode 100644 index 000000000..3f5191c5e --- /dev/null +++ b/core/nbio/impl.odin @@ -0,0 +1,256 @@ +#+private +package nbio + +import "base:runtime" +import "base:intrinsics" + +import "core:container/pool" +import "core:container/queue" +import "core:net" +import "core:strings" +import "core:sync" +import "core:time" +import "core:reflect" + +@(init, private) +init_thread_local_cleaner :: proc "contextless" () { + runtime.add_thread_local_cleaner(proc() { + l := &_tls_event_loop + if l.refs > 0 { + l.refs = 1 + _release_thread_event_loop() + } + }) +} + +@(thread_local) +_tls_event_loop: Event_Loop + +_acquire_thread_event_loop :: proc() -> General_Error { + l := &_tls_event_loop + if l.err == nil && l.refs == 0 { + when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 && ODIN_OS != .Orca { + allocator := runtime.default_wasm_allocator() + } else { + allocator := runtime.heap_allocator() + } + + l.queue.data.allocator = allocator + + if pool_err := pool.init(&l.operation_pool, "_pool_link"); pool_err != nil { + l.err = .Allocation_Failed + return l.err + } + defer if l.err != nil { pool.destroy(&l.operation_pool) } + + l.err = _init(l, allocator) + l.now = time.now() + } + + if l.err != nil { + return l.err + } + + l.refs += 1 + return nil +} + +_release_thread_event_loop :: proc() { + l := &_tls_event_loop + if l.err != nil { + assert(l.refs == 0) + return + } + + if l.refs > 0 { + l.refs -= 1 + if l.refs == 0 { + queue.destroy(&l.queue) + pool.destroy(&l.operation_pool) + _destroy(l) + l^ = {} + } + } +} + +_current_thread_event_loop :: #force_inline proc(loc := #caller_location) -> (^Event_Loop) { + l := &_tls_event_loop + + if intrinsics.expect(l.refs == 0, false) { + return nil + } + + return l +} + +_tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { + // Receive operations queued from other threads first. + { + sync.guard(&l.queue_mu) + for op in queue.pop_front_safe(&l.queue) { + _exec(op) + } + } + + return __tick(l, timeout) +} + +_listen_tcp :: proc( + l: ^Event_Loop, + endpoint: Endpoint, + backlog := 1000, + loc := #caller_location, +) -> ( + socket: TCP_Socket, + err: Network_Error, +) { + family := family_from_endpoint(endpoint) + socket = create_tcp_socket(family, l, loc) or_return + defer if err != nil { close(socket, l=l) } + + net.set_option(socket, .Reuse_Address, true) + + bind(socket, endpoint) or_return + + _listen(socket, backlog) or_return + return +} + +_read_entire_file :: proc(l: ^Event_Loop, path: string, user_data: rawptr, cb: Read_Entire_File_Callback, allocator := context.allocator, dir := CWD) { + open_poly3(path, user_data, cb, allocator, on_open, dir=dir, l=l) + + on_open :: proc(op: ^Operation, user_data: rawptr, cb: Read_Entire_File_Callback, allocator: runtime.Allocator) { + if op.open.err != nil { + cb(user_data, nil, {.Open, op.open.err}) + return + } + + stat_poly3(op.open.handle, user_data, cb, allocator, on_stat) + } + + on_stat :: proc(op: ^Operation, user_data: rawptr, cb: Read_Entire_File_Callback, allocator: runtime.Allocator) { + if op.stat.err != nil { + close(op.stat.handle) + cb(user_data, nil, {.Stat, op.stat.err}) + return + } + + if op.stat.type != .Regular { + close(op.stat.handle) + cb(user_data, nil, {.Stat, .Unsupported}) + return + } + + buf, err := make([]byte, op.stat.size, allocator) + if err != nil { + close(op.stat.handle) + cb(user_data, nil, {.Read, .Allocation_Failed}) + return + } + + read_poly3(op.stat.handle, 0, buf, user_data, cb, allocator, on_read, all=true) + } + + on_read :: proc(op: ^Operation, user_data: rawptr, cb: Read_Entire_File_Callback, allocator: runtime.Allocator) { + close(op.read.handle) + + if op.read.err != nil { + delete(op.read.buf, allocator) + cb(user_data, nil, {.Read, op.read.err}) + return + } + + assert(op.read.read == len(op.read.buf)) + cb(user_data, op.read.buf, {}) + } +} + +NBIO_DEBUG :: #config(NBIO_DEBUG, false) + +Debuggable :: union { + Operation_Type, + string, + int, + time.Time, + time.Duration, +} + +@(disabled=!NBIO_DEBUG) +debug :: proc(contents: ..Debuggable, location := #caller_location) { + if context.logger.procedure == nil || .Debug < context.logger.lowest_level { + return + } + + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() + + b: strings.Builder + b.buf.allocator = context.temp_allocator + + strings.write_string(&b, "[nbio] ") + + for content, i in contents { + switch val in content { + case Operation_Type: + name, _ := reflect.enum_name_from_value(val) + strings.write_string(&b, name) + case string: + strings.write_string(&b, val) + case int: + strings.write_int(&b, val) + case time.Duration: + ms := time.duration_milliseconds(val) + strings.write_f64(&b, ms, 'f') + strings.write_string(&b, "ms") + + case time.Time: + buf: [time.MIN_HMS_LEN+1]byte + h, m, s, ns := time.precise_clock_from_time(val) + buf[8] = '.' + buf[7] = '0' + u8(s % 10); s /= 10 + buf[6] = '0' + u8(s) + buf[5] = ':' + buf[4] = '0' + u8(m % 10); m /= 10 + buf[3] = '0' + u8(m) + buf[2] = ':' + buf[1] = '0' + u8(h % 10); h /= 10 + buf[0] = '0' + u8(h) + + strings.write_string(&b, string(buf[:])) + strings.write_int(&b, ns) + } + + if i < len(contents)-1 { + strings.write_byte(&b, ' ') + } + } + + context.logger.procedure(context.logger.data, .Debug, strings.to_string(b), context.logger.options, location) +} + +warn :: proc(text: string, location := #caller_location) { + if context.logger.procedure == nil || .Warning < context.logger.lowest_level { + return + } + + context.logger.procedure(context.logger.data, .Warning, text, context.logger.options, location) +} + +@(require_results) +constraint_bufs_to_max_rw :: proc(bufs: [][]byte) -> (constrained: [][]byte, total: int) { + for buf in bufs { + total += len(buf) + } + + constrained = bufs + for n := total; n > MAX_RW; { + last := &constrained[len(constrained)-1] + take := min(len(last), n-MAX_RW) + last^ = last[:take] + if len(last) == 0 { + constrained = constrained[:len(constrained)-1] + } + n -= take + } + + return +} diff --git a/core/nbio/impl_linux.odin b/core/nbio/impl_linux.odin new file mode 100644 index 000000000..b48fe248c --- /dev/null +++ b/core/nbio/impl_linux.odin @@ -0,0 +1,1421 @@ +#+private file +package nbio + +import "base:intrinsics" + +import "core:container/pool" +import "core:container/queue" +import "core:mem" +import "core:nbio/uring" +import "core:net" +import "core:slice" +import "core:strings" +import "core:sys/linux" +import "core:time" + +@(private="package") +_FULLY_SUPPORTED :: true + +@(private="package") +_Event_Loop :: struct { + ring: uring.Ring, + // Ready to be submitted to kernel, if kernel is full. + unqueued: queue.Queue(^Operation), + // Ready to run callbacks, mainly next tick, some other ops that error outside the kernel. + completed: queue.Queue(^Operation), + allocator: mem.Allocator, + wake: ^Operation, +} + +@(private="package") +_Handle :: linux.Fd + +@(private="package") +_CWD :: linux.AT_FDCWD + +@(private="package") +MAX_RW :: mem.Gigabyte + +@(private="package") +_Operation :: struct { + removal: ^Operation, + sqe: ^linux.IO_Uring_SQE, + expires: linux.Time_Spec, +} + +@(private="package") +_Accept :: struct { + sockaddr: linux.Sock_Addr_Any, + sockaddr_len: i32, +} + +@(private="package") +_Close :: struct {} + +@(private="package") +_Dial :: struct { + sockaddr: linux.Sock_Addr_Any, +} + +@(private="package") +_Read :: struct {} + +@(private="package") +_Write :: struct {} + +@(private="package") +_Send :: struct { + endpoint: linux.Sock_Addr_Any, + msghdr: linux.Msg_Hdr, + small_bufs: [1][]byte, +} + +@(private="package") +_Recv :: struct { + addr_out: linux.Sock_Addr_Any, + msghdr: linux.Msg_Hdr, + small_bufs: [1][]byte, +} + +@(private="package") +_Timeout :: struct { + expires: linux.Time_Spec, +} + +@(private="package") +_Poll :: struct {} + +@(private="package") +_Remove :: struct { + target: ^Operation, +} + +@(private="package") +_Link_Timeout :: struct { + target: ^Operation, + expires: linux.Time_Spec, +} + +@(private="package") +_Send_File :: struct { + len: int, + pipe: Handle, + + splice: ^Operation, +} + +@(private="package") +_Splice :: struct { + off: int, + len: int, + file: Handle, + pipe: Handle, + + written: int, + + sendfile: ^Operation, +} + +@(private="package") +_Open :: struct { + cpath: cstring, +} + +@(private="package") +_Stat :: struct { + buf: linux.Statx, +} + +@(private="package") +_init :: proc(l: ^Event_Loop, alloc: mem.Allocator) -> (err: General_Error) { + l.allocator = alloc + + params := uring.DEFAULT_PARAMS + params.flags += {.SUBMIT_ALL, .COOP_TASKRUN, .SINGLE_ISSUER} + + uerr := uring.init(&l.ring, ¶ms, QUEUE_SIZE) + if uerr != nil { + err = General_Error(uerr) + return + } + defer if err != nil { uring.destroy(&l.ring) } + + if perr := queue.init(&l.unqueued, allocator = alloc); perr != nil { + err = .Allocation_Failed + return + } + defer if err != nil { queue.destroy(&l.unqueued) } + + if perr := queue.init(&l.completed, allocator = alloc); perr != nil { + err = .Allocation_Failed + return + } + defer if err != nil { queue.destroy(&l.completed) } + + set_up_wake_up(l) or_return + + return + + set_up_wake_up :: proc(l: ^Event_Loop) -> General_Error { + wakefd, wakefd_err := linux.eventfd(0, {.SEMAPHORE, .CLOEXEC, .NONBLOCK}) + if wakefd_err != nil { + return General_Error(wakefd_err) + } + + op, alloc_err := new(Operation, l.allocator) + if alloc_err != nil { + linux.close(wakefd) + return .Allocation_Failed + } + + l.wake = op + l.wake.detached = true + l.wake.l = l + l.wake.type = .Read + l.wake.cb = wake_up_callback + l.wake.read.handle = wakefd + l.wake.read.buf = ([^]byte)(&l.wake.user_data)[:8] + _exec(l.wake) + + return nil + } + + wake_up_callback :: proc(op: ^Operation) { + assert(op.type == .Read) + assert(op == op.l.wake) + assert(op.read.err == nil) + assert(op.read.read == 8) + value := intrinsics.unaligned_load((^u64)(&op.user_data)) + assert(value > 0) + debug(int(value), "wake_up calls handled") + + op.read.read = 0 + op.user_data = {} + _exec(op) + } +} + +@(private="package") +_destroy :: proc(l: ^Event_Loop) { + linux.close(l.wake.read.handle) + free(l.wake, l.allocator) + + queue.destroy(&l.unqueued) + queue.destroy(&l.completed) + uring.destroy(&l.ring) +} + +@(private="package") +__tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> General_Error { + debug("tick") + + // Execute completed operations, mostly next tick ops, also some other ops that may error before + // adding it to the Uring. + n := queue.len(l.completed) + if n > 0 { + l.now = time.now() + for _ in 0 ..< n { + completed := queue.pop_front(&l.completed) + if completed._impl.removal == nil { + completed.cb(completed) + } else if completed._impl.removal != (^Operation)(REMOVED) { + completed._impl.removal._remove.target = nil + } + if !completed.detached { + pool.put(&l.operation_pool, completed) + } + } + } + + err := _flush_submissions(l, timeout) + if err != nil { return General_Error(err) } + + l.now = time.now() + + err = _flush_completions(l, false) + if err != nil { return General_Error(err) } + + return nil + + _flush_completions :: proc(l: ^Event_Loop, wait: bool) -> linux.Errno { + wait := wait + cqes: [128]linux.IO_Uring_CQE = --- + for { + completed, err := uring.copy_cqes(&l.ring, cqes[:], 1 if wait else 0) + if err == .EINTR { + continue + } else if err != nil { + return err + } + + _flush_unqueued(l) + + if completed > 0 { + debug(int(completed), "operations returned from uring") + } + + for cqe in cqes[:completed] { + assert(cqe.user_data != 0) + op, is_timeout := unpack_operation(cqe.user_data) + if is_timeout { + link_timeout_callback(op, cqe.res) + } else { + handle_completed(op, cqe.res) + } + } + + if completed < len(cqes) { break } + + debug("more events ready than our results buffer handles, getting more") + wait = false + } + + return nil + } + + _flush_submissions :: proc(l: ^Event_Loop, timeout: time.Duration) -> linux.Errno { + for { + ts: linux.Time_Spec + ts.time_nsec = uint(timeout) + _, err := uring.submit(&l.ring, 0 if timeout == 0 else 1, nil if timeout < 0 else &ts) + #partial switch err { + case .NONE, .ETIME: + case .EINTR: + warn("uring interrupted") + continue + case .ENOMEM: + // It's full, wait for at least one operation to complete and try again. + warn("could not flush submissions, ENOMEM, waiting for operations to complete before continuing") + ferr := _flush_completions(l, true) + if ferr != nil { return ferr } + continue + case: + return err + } + + break + } + + return nil + } + + _flush_unqueued :: proc(l: ^Event_Loop) { + n := queue.len(l.unqueued) + for _ in 0.. (handle: Handle, err: FS_Error) { + if path == "" { + err = .Invalid_Argument + return + } + + cpath, cerr := strings.clone_to_cstring(path, l.allocator) + if cerr != nil { + err = .Allocation_Failed + return + } + defer delete(cpath, l.allocator) + + sys_flags := linux.Open_Flags{.NOCTTY, .CLOEXEC, .NONBLOCK} + + if .Write in mode { + if .Read in mode { + sys_flags += {.RDWR} + } else { + sys_flags += {.WRONLY} + } + } + + if .Append in mode { sys_flags += {.APPEND} } + if .Create in mode { sys_flags += {.CREAT} } + if .Excl in mode { sys_flags += {.EXCL} } + if .Sync in mode { sys_flags += {.DSYNC} } + if .Trunc in mode { sys_flags += {.TRUNC} } + // if .Inheritable in mode { sys_flags -= {.CLOEXEC} } + + errno: linux.Errno + handle, errno = linux.openat(dir, cpath, sys_flags, transmute(linux.Mode)perm) + if errno != nil { + err = FS_Error(errno) + } + + return +} + +@(private="package") +_create_socket :: proc( + _: ^Event_Loop, + family: Address_Family, + protocol: Socket_Protocol, +) -> ( + socket: Any_Socket, + err: Create_Socket_Error, +) { + socket = net.create_socket(family, protocol) or_return + // NOTE: this doesn't seem needed with io uring. + // defer if err != nil { net.close(socket) } + // net.set_blocking(socket, false) or_return + return +} + +@(private="package") +_listen :: proc(socket: TCP_Socket, backlog := 1000) -> Listen_Error { + err := linux.listen(linux.Fd(socket), i32(backlog)) + if err != nil { + return net._listen_error(err) + } + return nil +} + +@(private="package") +_remove :: proc(target: ^Operation) { + target := target + assert(target != nil) + + if target._impl.removal != nil { + return + } + + op := _prep(target.l, proc(_: ^Operation) {}, ._Remove) + op._remove.target = target + + target._impl.removal = op + + enqueue(op, uring.async_cancel( + &op.l.ring, + u64(uintptr(target)), + u64(uintptr(op)), + )) +} + +@(private="package") +_associate_handle :: proc(handle: uintptr, l: ^Event_Loop) -> (Handle, Association_Error) { + // Works by default. + return Handle(handle), nil +} + +@(private="package") +_associate_socket :: proc(socket: Any_Socket, l: ^Event_Loop) -> Association_Error { + // Works by default. + return nil +} + +@(private="package") +_wake_up :: proc(l: ^Event_Loop) { + assert(l != &_tls_event_loop) + one: u64 = 1 + // Called from another thread, in which we can't use the uring. + n, err := linux.write(l.wake.read.handle, ([^]byte)(&one)[:size_of(one)]) + // Shouldn't fail. + assert(err == nil) + assert(n == 8) +} + +// Start file private. + +// The size of the IO Uring queues. +QUEUE_SIZE :: #config(ODIN_NBIO_QUEUE_SIZE, 2048) +#assert(QUEUE_SIZE <= uring.MAX_ENTRIES) + +#assert(size_of(Operation) <= 384) // Just so we see when we make it bigger. +#assert(size_of(Specifics) <= 288) // Just so we see when we make it bigger. + +REMOVED :: rawptr(max(uintptr)-1) + +handle_completed :: proc(op: ^Operation, res: i32) { + debug("handling", op.type, "result", int(res)) + + switch op.type { + case .Accept: + accept_callback(op, res) + case .Dial: + dial_callback(op, res) + case .Timeout: + timeout_callback(op, res) + case .Write: + if !write_callback(op, res) { return } + case .Read: + if !read_callback(op, res) { return } + case .Close: + close_callback(op, res) + case .Poll: + poll_callback(op, res) + case .Send: + if !send_callback(op, res) { return } + maybe_callback(op) + if len(op.send.bufs) > 1 { delete(op.send.bufs, op.l.allocator) } + cleanup(op) + return + case .Recv: + if !recv_callback(op, res) { return } + maybe_callback(op) + if len(op.recv.bufs) > 1 { delete(op.recv.bufs, op.l.allocator) } + cleanup(op) + return + case .Open: + open_callback(op, res) + case .Stat: + stat_callback(op, res) + case .Send_File: + if !sendfile_callback(op, res) { return } + case ._Splice: + if !splice_callback(op, res) { return } + case ._Remove: + if !remove_callback(op, res) { return } + case ._Link_Timeout: + unreachable() + case .None: + fallthrough + case: + panic("corrupted operation") + } + + maybe_callback(op) + cleanup(op) + + maybe_callback :: proc(op: ^Operation) { + if op._impl.removal == nil { + debug("done, calling back", op.type) + op.cb(op) + } else if op._impl.removal == (^Operation)(REMOVED) { + debug("done but was cancelled by remove", op.type) + } else { + debug("done but has removal pending", op.type) + // If the remove callback sees their target is nil, they know it is done already. + op._impl.removal._remove.target = nil + } + } + + cleanup :: proc(op: ^Operation) { + if !op.detached { + pool.put(&op.l.operation_pool, op) + } + } +} + +enqueue :: proc(op: ^Operation, sqe: ^linux.IO_Uring_SQE, ok: bool) { + assert(uintptr(op) & LINK_TIMEOUT_MASK == 0) + debug("enqueue", op.type) + if !ok { + warn("queueing for next tick because the ring is full, queue size may need increasing") + pok, _ := queue.push_back(&op.l.unqueued, op) + ensure(pok, "unqueued queue allocation failure") + return + } + + op._impl.sqe = sqe +} + +LINK_TIMEOUT_MASK :: 1 + +link_timeout :: proc(target: ^Operation, expires: time.Time) { + if expires == {} { + return + } + + // If the last op was queued because kernel is full, return. + if target._impl.sqe == nil { + assert(queue.len(target.l.unqueued) > 0 && queue.back_ptr(&target.l.unqueued)^ == target) + return + } + + target._impl.sqe.flags += {.IO_LINK} + target._impl.expires = ns_to_time_spec(expires._nsec) + + // Tag the pointer as a timeout. + p := uintptr(target) + assert(p & LINK_TIMEOUT_MASK == 0) + p |= LINK_TIMEOUT_MASK + + _, ok := uring.link_timeout( + &target.l.ring, + u64(p), + &target._impl.expires, + {.ABS, .REALTIME}, + ) + // If the target wasn't queued, the link timeout should not need to be queued, because uring + // leaves one spot specifically for a link. + assert(ok) +} + +link_timeout_callback :: proc(op: ^Operation, res: i32) { + err := linux.Errno(-res) + if err != nil && err != .ETIME && err != .ECANCELED { + panic("unexpected nbio.link_timeout() error") + } +} + +unpack_operation :: #force_inline proc(user_data: u64) -> (op: ^Operation, timed_out: bool) { + p := uintptr(user_data) + return (^Operation)(p &~ LINK_TIMEOUT_MASK), bool(p & LINK_TIMEOUT_MASK) +} + +@(require_results) +remove_callback :: proc(op: ^Operation, res: i32) -> bool { + assert(op.type == ._Remove) + err := linux.Errno(-res) + + target := op._remove.target + if target == nil { + debug("remove target nil, already handled") + return true + } + + assert(target.type != .None) + assert(target._impl.removal == op) + + if err == .ENOENT { + debug("remove ENOENT, trying again") + + enqueue(op, uring.async_cancel( + &op.l.ring, + u64(uintptr(target)), + u64(uintptr(op)), + )) + + return false + } else if err == .EALREADY { + debug("remove is accepted and will be tried") + } else if err != nil { + assert(false, "unexpected nbio.remove() error") + } + + // Set to sentinel so nothing references the operation that will be reused. + target._impl.removal = (^Operation)(REMOVED) + return true +} + +accept_exec :: proc(op: ^Operation) { + assert(op.type == .Accept) + op.accept._impl.sockaddr_len = size_of(op.accept._impl.sockaddr) + enqueue(op, uring.accept( + &op.l.ring, + u64(uintptr(op)), + linux.Fd(op.accept.socket), + &op.accept._impl.sockaddr, + &op.accept._impl.sockaddr_len, + {}, + )) + link_timeout(op, op.accept.expires) +} + +accept_callback :: proc(op: ^Operation, res: i32) { + assert(op.type == .Accept) + if res < 0 { + errno := linux.Errno(-res) + #partial switch errno { + case .ECANCELED: + op.accept.err = .Timeout + case: + op.accept.err = net._accept_error(errno) + } + + return + } + + op.accept.client = TCP_Socket(res) + // net.set_blocking(net.TCP_Socket(op.accept.client), false) + op.accept.client_endpoint = sockaddr_storage_to_endpoint(&op.accept._impl.sockaddr) +} + +dial_exec :: proc(op: ^Operation) { + assert(op.type == .Dial) + if op.dial.socket == {} { + if op.dial.endpoint.port == 0 { + op.dial.err = .Port_Required + queue.push_back(&op.l.completed, op) + return + } + + sock, err := create_socket(net.family_from_endpoint(op.dial.endpoint), .TCP) + if err != nil { + op.dial.err = err + queue.push_back(&op.l.completed, op) + return + } + + op.dial.socket = sock.(TCP_Socket) + op.dial._impl.sockaddr = endpoint_to_sockaddr(op.dial.endpoint) + } + + enqueue(op, uring.connect( + &op.l.ring, + u64(uintptr(op)), + linux.Fd(op.dial.socket), + &op.dial._impl.sockaddr, + )) + link_timeout(op, op.dial.expires) +} + +dial_callback :: proc(op: ^Operation, res: i32) { + assert(op.type == .Dial) + errno := linux.Errno(-res) + if errno != nil { + #partial switch errno { + case .ECANCELED: + op.dial.err = Dial_Error.Timeout + case: + op.dial.err = net._dial_error(errno) + } + close(op.dial.socket) + } +} + +timeout_exec :: proc(op: ^Operation) { + assert(op.type == .Timeout) + if op.timeout.duration <= 0 { + queue.push_back(&op.l.completed, op) + return + } + + expires := time.time_add(op.l.now, op.timeout.duration) + op.timeout._impl.expires = ns_to_time_spec(expires._nsec) + + enqueue(op, uring.timeout( + &op.l.ring, + u64(uintptr(op)), + &op.timeout._impl.expires, + 0, + {.ABS, .REALTIME}, + )) +} + +timeout_callback :: proc(op: ^Operation, res: i32) { + if res < 0 { + errno := linux.Errno(-res) + #partial switch errno { + case .ETIME, .ECANCELED: // OK. + case: + debug("unexpected timeout error:", int(errno)) + panic("unexpected timeout error") + } + } +} + +close_exec :: proc(op: ^Operation) { + assert(op.type == .Close) + + fd: linux.Fd + switch closable in op.close.subject { + case Handle: fd = linux.Fd(closable) + case TCP_Socket: fd = linux.Fd(closable) + case UDP_Socket: fd = linux.Fd(closable) + case: op.close.err = .Invalid_Argument; return + } + + enqueue(op, uring.close( + &op.l.ring, + u64(uintptr(op)), + fd, + )) +} + +close_callback :: proc(op: ^Operation, res: i32) { + assert(op.type == .Close) + op.close.err = FS_Error(linux.Errno(-res)) +} + +recv_exec :: proc(op: ^Operation) { + assert(op.type == .Recv) + + if op.recv.err != nil { + queue.push_back(&op.l.completed, op) + return + } + + bufs := slice.advance_slices(op.recv.bufs, op.recv.received) + bufs, _ = constraint_bufs_to_max_rw(bufs) + op.recv._impl.msghdr.iov = transmute([]linux.IO_Vec)bufs + + sock: linux.Fd + switch socket in op.recv.socket { + case TCP_Socket: + sock = linux.Fd(socket) + case UDP_Socket: + sock = linux.Fd(socket) + op.recv._impl.msghdr.name = &op.recv._impl.addr_out + op.recv._impl.msghdr.namelen = size_of(op.recv._impl.addr_out) + } + + enqueue(op, uring.recvmsg( + &op.l.ring, + u64(uintptr(op)), + linux.Fd(sock), + &op.recv._impl.msghdr, + {.NOSIGNAL}, + )) + link_timeout(op, op.recv.expires) +} + +@(require_results) +recv_callback :: proc(op: ^Operation, res: i32) -> bool { + assert(op.type == .Recv) + + if res < 0 { + errno := linux.Errno(-res) + switch sock in op.recv.socket { + case TCP_Socket: + #partial switch errno { + case .ECANCELED: + op.recv.err = TCP_Recv_Error.Timeout + case: + op.recv.err = net._tcp_recv_error(errno) + } + case UDP_Socket: + #partial switch errno { + case .ECANCELED: + op.recv.err = UDP_Recv_Error.Timeout + case: + op.recv.err = net._udp_recv_error(errno) + } + } + + return true + } + + op.recv.received += int(res) + + switch sock in op.recv.socket { + case TCP_Socket: + if res == 0 { + // Connection closed. + return true + } + + if op.recv.all { + total: int + for buf in op.recv.bufs { + total += len(buf) + } + + if op.recv.received < total { + recv_exec(op) + return false + } + } + + case UDP_Socket: + op.recv.source = sockaddr_storage_to_endpoint(&op.recv._impl.addr_out) + } + + return true +} + +send_exec :: proc(op: ^Operation) { + assert(op.type == .Send) + + if op.send.err != nil { + queue.push_back(&op.l.completed, op) + return + } + + bufs := slice.advance_slices(op.send.bufs, op.send.sent) + bufs, _ = constraint_bufs_to_max_rw(bufs) + op.send._impl.msghdr.iov = transmute([]linux.IO_Vec)bufs + + sock: linux.Fd + switch socket in op.send.socket { + case TCP_Socket: + sock = linux.Fd(socket) + case UDP_Socket: + sock = linux.Fd(socket) + op.send._impl.endpoint = endpoint_to_sockaddr(op.send.endpoint) + op.send._impl.msghdr.name = &op.send._impl.endpoint + op.send._impl.msghdr.namelen = size_of(op.send._impl.endpoint) + } + + enqueue(op, uring.sendmsg( + &op.l.ring, + u64(uintptr(op)), + sock, + &op.send._impl.msghdr, + {.NOSIGNAL}, + )) + link_timeout(op, op.send.expires) +} + +@(require_results) +send_callback :: proc(op: ^Operation, res: i32) -> bool { + assert(op.type == .Send) + if res < 0 { + errno := linux.Errno(-res) + switch sock in op.send.socket { + case TCP_Socket: + #partial switch errno { + case .ECANCELED: + op.send.err = TCP_Send_Error.Timeout + case: + op.send.err = net._tcp_send_error(errno) + } + case UDP_Socket: + #partial switch errno { + case .ECANCELED: + op.send.err = UDP_Send_Error.Timeout + case: + op.send.err = net._udp_send_error(errno) + } + case: panic("corrupted socket") + } + + return true + } + + op.send.sent += int(res) + + if op.send.all { + total: int + for buf in op.send.bufs { + total += len(buf) + } + + if op.send.sent < total { + assert(res > 0) + send_exec(op) + return false + } + } + + return true +} + +write_exec :: proc(op: ^Operation) { + assert(op.type == .Write) + + buf := op.write.buf[op.write.written:] + buf = buf[:min(MAX_RW, len(buf))] + + enqueue(op, uring.write( + &op.l.ring, + u64(uintptr(op)), + op.write.handle, + buf, + u64(op.write.offset) + u64(op.write.written), + )) + link_timeout(op, op.write.expires) +} + +@(require_results) +write_callback :: proc(op: ^Operation, res: i32) -> bool { + if res < 0 { + errno := linux.Errno(-res) + op.write.err = FS_Error(errno) + return true + } + + op.write.written += int(res) + + if op.write.all && op.write.written < len(op.write.buf) { + write_exec(op) + return false + } + + return true +} + +read_exec :: proc(op: ^Operation) { + assert(op.type == .Read) + + buf := op.read.buf[op.read.read:] + buf = buf[:min(MAX_RW, len(buf))] + + enqueue(op, uring.read( + &op.l.ring, + u64(uintptr(op)), + op.read.handle, + buf, + u64(op.read.offset) + u64(op.read.read), + )) + link_timeout(op, op.read.expires) +} + +@(require_results) +read_callback :: proc(op: ^Operation, res: i32) -> bool { + if res < 0 { + errno := linux.Errno(-res) + op.read.err = FS_Error(errno) + return true + } else if res == 0 { + if op.read.read == 0 { + op.read.err = .EOF + } + return true + } + + op.read.read += int(res) + + if op.read.all && op.read.read < len(op.read.buf) { + read_exec(op) + return false + } + + return true +} + +poll_exec :: proc(op: ^Operation) { + assert(op.type == .Poll) + + events: linux.Fd_Poll_Events + switch op.poll.event { + case .Receive: events = { .IN } + case .Send: events = { .OUT } + } + + fd: linux.Fd + switch sock in op.poll.socket { + case TCP_Socket: fd = linux.Fd(sock) + case UDP_Socket: fd = linux.Fd(sock) + } + + enqueue(op, uring.poll_add( + &op.l.ring, + u64(uintptr(op)), + fd, + events, + {}, + )) + link_timeout(op, op.poll.expires) +} + +poll_callback :: proc(op: ^Operation, res: i32) { + if res < 0 { + errno := linux.Errno(-res) + #partial switch errno { + case .NONE: // no-op + case .ECANCELED: + op.poll.result = .Timeout + case .EINVAL, .EFAULT, .EBADF: + op.poll.result = .Invalid_Argument + case: + op.poll.result = .Error + } + + return + } + + op.poll.result = .Ready +} + +/* +`sendfile` is implemented with 2 splices over a pipe. + +Splice A: from file to pipe +Splice B: from pipe to socket (optionally linked to a timeout) + +The splices are hard-linked which means A completes before B. +B could get an `EWOULDBLOCK`, which is when the remote end has not read enough of the socket data yet. +In that case we enqueue a poll on the socket and continue when that completes. +A shouldn't get `EWOULDBLOCK`, but as a cautionary measure we handle it. + +The timeout is either linked to the splice B op, or the poll op, either of these is also always in progress in the kernel. +*/ +sendfile_exec :: proc(op: ^Operation, splice := true) { + assert(op.type == .Send_File) + + splice_done := !splice + if splice_op := op.sendfile._impl.splice; splice && splice_op != nil { + splice_done = splice_op._splice.written == splice_op._splice.len + } + + debug("sendfile_exec") + + if op.sendfile._impl.splice == nil { + // First stat for the file size. + if op.sendfile.nbytes == SEND_ENTIRE_FILE { + debug("sendfile SEND_ENTIRE_FILE, doing stat") + + stat_poly(op.sendfile.file, op, proc(stat_op: ^Operation, sendfile_op: ^Operation) { + if stat_op.stat.err != nil { + sendfile_op.sendfile.err = stat_op.stat.err + } else if stat_op.stat.type != .Regular { + sendfile_op.sendfile.err = FS_Error.Invalid_Argument + } else { + sendfile_op.sendfile.nbytes = int(i64(stat_op.stat.size) - i64(sendfile_op.sendfile.offset)) + if sendfile_op.sendfile.nbytes <= 0 { + sendfile_op.sendfile.err = FS_Error.Invalid_Argument + } + } + + if sendfile_op.sendfile.err != nil { + handle_completed(sendfile_op, 0) + return + } + + sendfile_exec(sendfile_op) + }) + return + } + + debug("sendfile setting up") + + rw: [2]linux.Fd + err := linux.pipe2(&rw, {.NONBLOCK, .CLOEXEC}) + if err != nil { + op.sendfile.err = FS_Error(err) + queue.push_back(&op.l.completed, op) + return + } + + splice_op := _prep(op.l, proc(_: ^Operation) { debug("sendfile splice helper callback") }, ._Splice) + splice_op._splice.sendfile = op + splice_op._splice.file = op.sendfile.file + splice_op._splice.pipe = rw[1] + splice_op._splice.off = op.sendfile.offset + splice_op._splice.len = op.sendfile.nbytes + + op.sendfile._impl.splice = splice_op + op.sendfile._impl.pipe = rw[0] + op.sendfile._impl.len = op.sendfile.nbytes + } + + splice_op: ^Operation + if !splice_done { + splice_op = op.sendfile._impl.splice + enqueue(splice_op, uring.splice( + &splice_op.l.ring, + u64(uintptr(splice_op)), + splice_op._splice.file, + i64(splice_op._splice.off) + i64(splice_op._splice.written), + splice_op._splice.pipe, + -1, + u32(min(splice_op._splice.len - splice_op._splice.written, MAX_RW)), + {.NONBLOCK}, + )) + } + + b, b_added := uring.splice( + &op.l.ring, + u64(uintptr(op)), + op.sendfile._impl.pipe, + -1, + linux.Fd(op.sendfile.socket), + -1, + u32(min(op.sendfile._impl.len - op.sendfile.sent, MAX_RW)), + {.NONBLOCK}, + ) + if !splice_done && b_added { + assert(splice_op._impl.sqe != nil) // if b was added successfully, a should've been too. + // Makes sure splice A (file to pipe) completes before splice B (pipe to socket). + splice_op._impl.sqe.flags += {.IO_HARDLINK} + } + enqueue(op, b, b_added) + + link_timeout(op, op.sendfile.expires) +} + +@(require_results) +splice_callback :: proc(op: ^Operation, res: i32) -> bool { + assert(op.type == ._Splice) + + if res < 0 { + errno := linux.Errno(-res) + #partial switch errno { + case .EAGAIN: + // Splice A (from file to pipe) would block, this means the buffer is full and it first needs + // to be sent over the socket by splice B (from pipe to socket). + // So we don't do anything here, once a splice B completes a new splice A will be created. + + case: + // Splice A (from file to pipe) error, we need to close the pipes, cancel the pending splice B, + // and call the callback with the error. + + debug("sendfile helper splice error, closing pipe") + + close(op._splice.pipe) + + // This is nil if this is a cancel originating from the sendfile. + // This is not nil if it is an actual error that happened on this splice. + sendfile_op := op._splice.sendfile + if sendfile_op != nil { + debug("sendfile helper splice error, cancelling main sendfile") + assert(sendfile_op.type == .Send_File) + + sendfile_op.sendfile._impl.splice = nil + sendfile_op.sendfile.err = FS_Error(errno) + } + } + + return true + } + + op._splice.written += int(res) + + sendfile_op := op._splice.sendfile + if sendfile_op != nil { + if op._splice.written < sendfile_op.sendfile.nbytes { + return false + } + + sendfile_op.sendfile._impl.splice = nil + } + + assert(op._splice.pipe > 0) + close(op._splice.pipe) + + debug("sendfile helper splice completely done") + return true +} + +@(require_results) +sendfile_callback :: proc(op: ^Operation, res: i32) -> bool { + assert(op.type == .Send_File) + + if op.sendfile.err == nil && res < 0 { + errno := linux.Errno(-res) + #partial switch errno { + case .EAGAIN: + // Splice B (from pipe to socket) would block. We are waiting on the remote to read more + // of our buffer before we can send more to it. + // We use a poll to find out when this is. + + debug("sendfile needs to poll") + + poll_op := poll_poly(op.sendfile.socket, .Send, op, proc(poll_op: ^Operation, sendfile_op: ^Operation) { + #partial switch poll_op.poll.result { + case .Ready: + // Do not enqueue a splice right away, we know there is at least one splice call worth of data in the kernel buffer. + sendfile_exec(sendfile_op, splice=false) + return + + case .Timeout: + sendfile_op.sendfile.err = TCP_Send_Error.Timeout + case: + sendfile_op.sendfile.err = TCP_Send_Error.Unknown + } + + debug("sendfile poll error") + handle_completed(sendfile_op, 0) + }) + + link_timeout(poll_op, op.sendfile.expires) + return false + + case .ECANCELED: + op.sendfile.err = TCP_Send_Error.Timeout + case: + op.sendfile.err = net._tcp_send_error(errno) + } + } + + if op.sendfile.err != nil { + debug("sendfile error") + + if op.sendfile._impl.pipe > 0 { + close(op.sendfile._impl.pipe) + } + + splice_op := op.sendfile._impl.splice + if splice_op != nil { + assert(splice_op.type == ._Splice) + splice_op._splice.sendfile = nil + _remove(splice_op) + } + + return true + } + + op.sendfile.sent += int(res) + if op.sendfile.sent < op.sendfile._impl.len { + debug("sendfile not completely done yet") + sendfile_exec(op) + if op.sendfile.progress_updates { op.cb(op) } + return false + } + + debug("sendfile completely done") + return true +} + +open_exec :: proc(op: ^Operation) { + assert(op.type == .Open) + + sys_flags := linux.Open_Flags{.NOCTTY, .CLOEXEC, .NONBLOCK} + + if .Write in op.open.mode { + if .Read in op.open.mode { + sys_flags += {.RDWR} + } else { + sys_flags += {.WRONLY} + } + } + + if .Append in op.open.mode { sys_flags += {.APPEND} } + if .Create in op.open.mode { sys_flags += {.CREAT} } + if .Excl in op.open.mode { sys_flags += {.EXCL} } + if .Sync in op.open.mode { sys_flags += {.DSYNC} } + if .Trunc in op.open.mode { sys_flags += {.TRUNC} } + // if .Inheritable in op.open.mode { sys_flags -= {.CLOEXEC} } + + cpath, err := strings.clone_to_cstring(op.open.path, op.l.allocator) + if err != nil { + op.open.err = .Allocation_Failed + queue.push_back(&op.l.completed, op) + return + } + op.open._impl.cpath = cpath + + enqueue(op, uring.openat( + &op.l.ring, + u64(uintptr(op)), + linux.Fd(op.open.dir), + op.open._impl.cpath, + transmute(linux.Mode)op.open.perm, + sys_flags, + )) +} + +open_callback :: proc(op: ^Operation, res: i32) { + assert(op.type == .Open) + + delete(op.open._impl.cpath, op.l.allocator) + + if res < 0 { + errno := linux.Errno(-res) + op.open.err = FS_Error(errno) + return + } + + op.open.handle = Handle(res) +} + +stat_exec :: proc(op: ^Operation) { + assert(op.type == .Stat) + + enqueue(op, uring.statx( + &op.l.ring, + u64(uintptr(op)), + op.stat.handle, + "", + {.EMPTY_PATH}, + {.TYPE, .SIZE}, + &op.stat._impl.buf, + )) +} + +stat_callback :: proc(op: ^Operation, res: i32) { + assert(op.type == .Stat) + + if res < 0 { + errno := linux.Errno(-res) + op.stat.err = FS_Error(errno) + return + } + + type := File_Type.Regular + switch op.stat._impl.buf.mode & linux.S_IFMT { + case linux.S_IFBLK, linux.S_IFCHR: type = .Device + case linux.S_IFDIR: type = .Directory + case linux.S_IFIFO: type = .Pipe_Or_Socket + case linux.S_IFLNK: type = .Symlink + case linux.S_IFREG: type = .Regular + case linux.S_IFSOCK: type = .Pipe_Or_Socket + } + + op.stat.type = type + op.stat.size = i64(op.stat._impl.buf.size) +} + +@(require_results) +sockaddr_storage_to_endpoint :: proc(addr: ^linux.Sock_Addr_Any) -> (ep: Endpoint) { + #partial switch addr.family { + case .INET: + return Endpoint { + address = IP4_Address(addr.sin_addr), + port = int(addr.sin_port), + } + case .INET6: + return Endpoint { + address = IP6_Address(transmute([8]u16be)addr.sin6_addr), + port = int(addr.sin6_port), + } + case: + return {} + } +} + +@(require_results) +endpoint_to_sockaddr :: proc(ep: Endpoint) -> (sockaddr: linux.Sock_Addr_Any) { + switch a in ep.address { + case IP4_Address: + sockaddr.sin_family = .INET + sockaddr.sin_port = u16be(ep.port) + sockaddr.sin_addr = cast([4]u8)a + return + case IP6_Address: + sockaddr.sin6_family = .INET6 + sockaddr.sin6_port = u16be(ep.port) + sockaddr.sin6_addr = transmute([16]u8)a + return + } + + unreachable() +} + +@(require_results) +ns_to_time_spec :: proc(nsec: i64) -> linux.Time_Spec { + NANOSECONDS_PER_SECOND :: 1e9 + return { + time_sec = uint(nsec / NANOSECONDS_PER_SECOND), + time_nsec = uint(nsec % NANOSECONDS_PER_SECOND), + } +} diff --git a/core/nbio/impl_others.odin b/core/nbio/impl_others.odin new file mode 100644 index 000000000..cac1f0c63 --- /dev/null +++ b/core/nbio/impl_others.odin @@ -0,0 +1,217 @@ +#+build !darwin +#+build !freebsd +#+build !openbsd +#+build !netbsd +#+build !linux +#+build !windows +#+private +package nbio + +import "core:container/avl" +import "core:container/pool" +import "core:container/queue" +import "core:mem" +import "core:slice" +import "core:time" + +_FULLY_SUPPORTED :: false + +_Event_Loop :: struct { + completed: queue.Queue(^Operation), + timeouts: avl.Tree(^Operation), + allocator: mem.Allocator, +} + +_Handle :: uintptr + +_CWD :: Handle(-100) + +MAX_RW :: mem.Gigabyte + +_Operation :: struct { + removed: bool, +} + +_Accept :: struct {} + +_Close :: struct {} + +_Dial :: struct {} + +_Recv :: struct { + small_bufs: [1][]byte, +} + +_Send :: struct { + small_bufs: [1][]byte, +} + +_Read :: struct {} + +_Write :: struct {} + +_Timeout :: struct { + expires: time.Time, +} + +_Poll :: struct {} + +_Send_File :: struct {} + +_Open :: struct {} + +_Stat :: struct {} + +_Splice :: struct {} + +_Remove :: struct {} + +_Link_Timeout :: struct {} + +_init :: proc(l: ^Event_Loop, allocator: mem.Allocator) -> (rerr: General_Error) { + l.allocator = allocator + l.completed.data.allocator = allocator + + avl.init_cmp(&l.timeouts, timeouts_cmp, allocator) + + return nil + + timeouts_cmp :: #force_inline proc(a, b: ^Operation) -> slice.Ordering { + switch { + case a.timeout._impl.expires._nsec < b.timeout._impl.expires._nsec: + return .Less + case a.timeout._impl.expires._nsec > b.timeout._impl.expires._nsec: + return .Greater + case uintptr(a) < uintptr(b): + return .Less + case uintptr(a) > uintptr(b): + return .Greater + case: + assert(a == b) + return .Equal + } + } +} + +_destroy :: proc(l: ^Event_Loop) { + queue.destroy(&l.completed) + avl.destroy(&l.timeouts, false) +} + +__tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> General_Error { + l.now = time.now() + + for op in queue.pop_front_safe(&l.completed) { + if !op._impl.removed { + op.cb(op) + } + if !op.detached { + pool.put(&l.operation_pool, op) + } + } + + iter := avl.iterator(&l.timeouts, .Forward) + for node in avl.iterator_next(&iter) { + op := node.value + cexpires := time.diff(l.now, op.timeout._impl.expires) + + done := cexpires <= 0 + if done { + op.cb(op) + avl.remove_node(&l.timeouts, node) + if !op.detached { + pool.put(&l.operation_pool, op) + } + continue + } + + break + } + + return nil +} + +_create_socket :: proc(l: ^Event_Loop, family: Address_Family, protocol: Socket_Protocol) -> (socket: Any_Socket, err: Create_Socket_Error) { + return nil, .Network_Unreachable +} + +_listen :: proc(socket: TCP_Socket, backlog := 1000) -> Listen_Error { + return .Network_Unreachable +} + +_exec :: proc(op: ^Operation) { + switch op.type { + case .Timeout: + _, _, err := avl.find_or_insert(&op.l.timeouts, op) + if err != nil { + panic("nbio: allocation failure") + } + return + case .Accept: + op.accept.err = .Network_Unreachable + case .Close: + op.close.err = .Unsupported + case .Dial: + op.dial.err = Dial_Error.Network_Unreachable + case .Recv: + switch _ in op.recv.socket { + case TCP_Socket: op.recv.err = TCP_Recv_Error.Network_Unreachable + case UDP_Socket: op.recv.err = UDP_Recv_Error.Network_Unreachable + case: op.recv.err = TCP_Recv_Error.Network_Unreachable + } + case .Send: + switch _ in op.send.socket { + case TCP_Socket: op.send.err = TCP_Send_Error.Network_Unreachable + case UDP_Socket: op.send.err = UDP_Send_Error.Network_Unreachable + case: op.send.err = TCP_Send_Error.Network_Unreachable + } + case .Send_File: + op.sendfile.err = .Network_Unreachable + case .Read: + op.read.err = .Unsupported + case .Write: + op.write.err = .Unsupported + case .Poll: + op.poll.result = .Error + case .Open: + op.open.err = .Unsupported + case .Stat: + op.stat.err = .Unsupported + case .None, ._Link_Timeout, ._Remove, ._Splice: + fallthrough + case: + unreachable() + } + + _, err := queue.push_back(&op.l.completed, op) + if err != nil { + panic("nbio: allocation failure") + } +} + +_remove :: proc(target: ^Operation) { + #partial switch target.type { + case .Timeout: + avl.remove_value(&target.l.timeouts, target) + if !target.detached { + pool.put(&target.l.operation_pool, target) + } + case: + target._impl.removed = true + } +} + +_open_sync :: proc(l: ^Event_Loop, path: string, dir: Handle, mode: File_Flags, perm: Permissions) -> (handle: Handle, err: FS_Error) { + return 0, FS_Error.Unsupported +} + +_associate_handle :: proc(handle: uintptr, l: ^Event_Loop) -> (Handle, Association_Error) { + return Handle(handle), nil +} + +_associate_socket :: proc(socket: Any_Socket, l: ^Event_Loop) -> Association_Error { + return nil +} + +_wake_up :: proc(l: ^Event_Loop) { +} diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin new file mode 100644 index 000000000..e003f6ea3 --- /dev/null +++ b/core/nbio/impl_posix.odin @@ -0,0 +1,1403 @@ +#+build darwin, freebsd, openbsd, netbsd +#+private file +package nbio + +import "core:c" +import "core:container/pool" +import "core:container/queue" +import "core:mem" +import "core:net" +import "core:slice" +import "core:strings" +import "core:sys/posix" +import "core:time" +import kq "core:sys/kqueue" +import sa "core:container/small_array" + +@(private="package") +_FULLY_SUPPORTED :: true + +@(private="package") +_Event_Loop :: struct { + // kqueue does not permit multiple {ident, filter} pairs in the kqueue. + // We have to keep record of what we currently have in the kqueue, and if we get an operation + // that would be the same (ident, filter) pair we need to bundle the operations under one kevent. + submitted: map[Queue_Identifier]^Operation, + allocator: mem.Allocator, + // Holds all events we want to flush. Flushing is done each tick at which point this is emptied. + pending: sa.Small_Array(QUEUE_SIZE, kq.KEvent), + // Holds what should be in `pending` but didn't fit. + // When `pending`is flushed these are moved to `pending`. + overflow: queue.Queue(kq.KEvent), + // Contains all operations that were immediately completed in `exec`. + // These ops did not block so can call back next tick. + completed: queue.Queue(^Operation), + kqueue: kq.KQ, +} + +@(private="package") +_Handle :: posix.FD + +@(private="package") +_CWD :: posix.AT_FDCWD + +@(private="package") +MAX_RW :: mem.Gigabyte + +@(private="package") +_Operation :: struct { + // Linked list of operations that are bundled (same {ident, filter} pair) with this one. + next: ^Operation, + prev: ^Operation, + + flags: Operation_Flags, + result: i64, +} + +@(private="package") +_Accept :: struct {} + +@(private="package") +_Close :: struct {} + +@(private="package") +_Dial :: struct {} + +@(private="package") +_Recv :: struct { + small_bufs: [1][]byte, +} + +@(private="package") +_Send :: struct { + small_bufs: [1][]byte, +} + +@(private="package") +_Read :: struct {} + +@(private="package") +_Write :: struct {} + +@(private="package") +_Timeout :: struct {} + +@(private="package") +_Poll :: struct {} + +@(private="package") +_Send_File :: struct { + mapping: []byte, // `mmap`'d buffer (if native `sendfile` is not supported). +} + +@(private="package") +_Open :: struct {} + +@(private="package") +_Stat :: struct {} + +@(private="package") +_Splice :: struct {} + +@(private="package") +_Remove :: struct {} + +@(private="package") +_Link_Timeout :: struct {} + +@(private="package") +_init :: proc(l: ^Event_Loop, allocator: mem.Allocator) -> (rerr: General_Error) { + l.allocator = allocator + l.submitted.allocator = allocator + l.overflow.data.allocator = allocator + l.completed.data.allocator = allocator + + kqueue, err := kq.kqueue() + if err != nil { + return General_Error(posix.errno()) + } + + l.kqueue = kqueue + + sa.append(&l.pending, kq.KEvent{ + ident = IDENT_WAKE_UP, + filter = .User, + flags = {.Add, .Enable, .Clear}, + }) + + return nil +} + +@(private="package") +_destroy :: proc(l: ^Event_Loop) { + delete(l.submitted) + queue.destroy(&l.overflow) + queue.destroy(&l.completed) + posix.close(l.kqueue) +} + +@(private="package") +__tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> General_Error { + debug("tick") + + if n := queue.len(l.completed); n > 0 { + l.now = time.now() + debug("processing", n, "already completed") + + for _ in 0 ..< n { + op := queue.pop_front(&l.completed) + handle_completed(op) + } + + if pool.num_outstanding(&l.operation_pool) == 0 { return nil } + } + + if NBIO_DEBUG { + npending := sa.len(l.pending) + if npending > 0 { + debug("queueing", npending, "new events, there are", int(len(l.submitted)), "events pending") + } else { + debug("there are", int(len(l.submitted)), "events pending") + } + } + + ts_backing: posix.timespec + ts_pointer: ^posix.timespec // nil means forever. + if queue.len(l.completed) == 0 && len(l.submitted) > 0 { + if timeout >= 0 { + debug("timeout", timeout) + ts_backing = {tv_sec=posix.time_t(timeout/time.Second), tv_nsec=c.long(timeout%time.Second)} + ts_pointer = &ts_backing + } else { + debug("timeout forever") + } + } else { + debug("timeout 0, there is completed work pending") + ts_pointer = &ts_backing + } + + for { + results_buf: [128]kq.KEvent + results := kevent(l, results_buf[:], ts_pointer) or_return + + sa.clear(&l.pending) + for overflow in queue.pop_front_safe(&l.overflow) { + sa.append(&l.pending, overflow) or_break + } + + l.now = time.now() + + handle_results(l, results) + + if len(results) < len(results_buf) { + break + } + + debug("more events ready than our results buffer handles, getting more") + + // No timeout for the next call. + ts_backing = {} + ts_pointer = &ts_backing + } + + + return nil + + kevent :: proc(l: ^Event_Loop, buf: []kq.KEvent, ts: ^posix.timespec) -> ([]kq.KEvent, General_Error) { + for { + new_events, err := kq.kevent(l.kqueue, sa.slice(&l.pending), buf, ts) + #partial switch err { + case nil: + assert(new_events >= 0) + return buf[:new_events], nil + case .EINTR: + warn("kevent interrupted") + case: + warn("kevent error") + warn(string(posix.strerror(err))) + return nil, General_Error(err) + } + } + } + + is_internal_timeout :: proc(filter: kq.Filter, op: ^Operation) -> bool { + // A `.Timeout` that `.Has_Timeout` is a `remove()`'d timeout. + return filter == .Timer && (op.type != .Timeout || .Has_Timeout in op._impl.flags) + } + + handle_results :: proc(l: ^Event_Loop, results: []kq.KEvent) { + if len(results) > 0 { + debug(len(results), "events completed") + } + + // Mark all operations that have an event returned as not `.For_Kernel`. + // We have to do this right away, or we may process an operation as if we think the kernel is responsible. + for &event in results { + if ODIN_OS != .Darwin { + // On the BSDs, a `.Delete` that results in an `.Error` does not keep the `.Delete` flag in the result. + // We only have `udata == nil` when we do a delete, so we can add it back here to keep consistent. + if .Error in event.flags && event.udata == nil { + event.flags += {.Delete} + } + } + + if .Delete in event.flags { + continue + } + + if event.filter == .User && event.ident == IDENT_WAKE_UP { + continue + } + + op := cast(^Operation)event.udata + assert(op != nil) + assert(op.type != .None) + + if is_internal_timeout(event.filter, op) { + continue + } + + _, del := delete_key(&l.submitted, Queue_Identifier{ ident = event.ident, filter = event.filter }) + assert(del != nil) + + for next := op; next != nil; next = next._impl.next { + assert(.For_Kernel in next._impl.flags) + next._impl.flags -= {.For_Kernel} + } + } + + // If we get a timeout and an actual result, ignore the timeout. + // We have to do this after the previous loop so we know if the target op of a timeout was also completed. + // We have to do this before the next loop so we handle timeouts before their target ops. Otherwise the target could already be done. + for &event in results { + if .Delete in event.flags { + continue + } + + if event.filter == .User && event.ident == IDENT_WAKE_UP { + continue + } + + op := cast(^Operation)event.udata + if is_internal_timeout(event.filter, op) { + // If the actual event has also been returned this tick, we need to ignore the timeout to not get a uaf. + if .For_Kernel not_in op._impl.flags { + assert(.Has_Timeout in op._impl.flags) + op._impl.flags -= {.Has_Timeout} + + event.filter = kq.Filter(FILTER_IGNORE) + debug(op.type, "timed out but was also completed this tick, ignoring timeout") + } + + } + } + + for event in results { + if event.filter == kq.Filter(FILTER_IGNORE) { + // Previous loop told us to ignore. + continue + } + + if event.filter == .User && event.ident == IDENT_WAKE_UP { + debug("woken up") + continue + } + + if .Delete in event.flags { + assert(.Error in event.flags) + // Seems to happen when you delete at the same time or just after a close. + debug("delete error", int(event.data)) + if err := posix.Errno(event.data); err != .ENOENT && err != .EBADF { + warn("unexpected delete error") + warn(string(posix.strerror(err))) + } + continue + } + + op := cast(^Operation)event.udata + assert(op != nil) + assert(op.type != .None) + + // Timeout result that is a non-timeout op, meaning the operation timed out. + // Because of the previous loop we are sure that the target op is not also in this tick's results. + if is_internal_timeout(event.filter, op) { + debug("got timeout for", op.type) + + assert(.Error not_in event.flags) + + assert(.Has_Timeout in op._impl.flags) + op._impl.flags -= {.Has_Timeout} + + // Remove the actual operation. + timeout_and_delete(op) + handle_completed(op) + continue + } + + // Weird loop, but we need to get the next ptr before handle_completed(curr), curr is freed in handle_completed. + for curr, next := op, op._impl.next; curr != nil; curr, next = next, next == nil ? nil : next._impl.next { + if .Error in event.flags { curr._impl.flags += {.Error} } + if .EOF in event.flags { curr._impl.flags += {.EOF} } + curr._impl.result = event.data + handle_completed(curr) + } + } + } +} + +@(private="package") +_create_socket :: proc(l: ^Event_Loop, family: Address_Family, protocol: Socket_Protocol) -> (socket: Any_Socket, err: Create_Socket_Error) { + socket = net.create_socket(family, protocol) or_return + + berr := net.set_blocking(socket, false) + // This shouldn't be able to fail. + assert(berr == nil) + + return +} + +@(private="package") +_listen :: proc(socket: TCP_Socket, backlog := 1000) -> Listen_Error { + if res := posix.listen(posix.FD(socket), i32(backlog)); res != .OK { + return posix_listen_error() + } + return nil +} + +@(private="package") +_exec :: proc(op: ^Operation) { + assert(op.l == &_tls_event_loop) + + debug("exec", op.type) + + result: Op_Result + switch op.type { + case .Accept: + result = accept_exec(op) + case .Close: + // no-op + case .Timeout: + result = timeout_exec(op) + case .Dial: + result = dial_exec(op) + case .Recv: + result = recv_exec(op) + case .Send: + result = send_exec(op) + case .Send_File: + result = sendfile_exec(op) + case .Read: + result = read_exec(op) + case .Write: + result = write_exec(op) + case .Poll: + result = poll_exec(op) + assert(result == .Pending) + case .Open: + open_exec(op) + case .Stat: + stat_exec(op) + case .None, ._Link_Timeout, ._Remove, ._Splice: + fallthrough + case: + unreachable() + } + + switch result { + case .Pending: + // no-op, in kernel. + debug(op.type, "pending") + case .Done: + debug(op.type, "done immediately") + op._impl.flags += {.Done} + _, err := queue.push_back(&op.l.completed, op) // Got result, handle it next tick. + ensure(err == nil, "allocation failure") + } +} + +@(private="package") +_remove :: proc(target: ^Operation) { + assert(target != nil) + + debug("remove", target.type) + + if .Removed in target._impl.flags { + debug("already removed") + return + } + + target._impl.flags += {.Removed, .Has_Timeout} + link_timeout(target, target.l.now) +} + +@(private="package") +_open_sync :: proc(l: ^Event_Loop, path: string, dir: Handle, mode: File_Flags, perm: Permissions) -> (handle: Handle, err: FS_Error) { + if path == "" { + err = .Invalid_Argument + return + } + + cpath, cerr := strings.clone_to_cstring(path, l.allocator) + if cerr != nil { + err = .Allocation_Failed + return + } + defer delete(cpath, l.allocator) + + sys_flags := posix.O_Flags{.NOCTTY, .CLOEXEC, .NONBLOCK} + + if .Write in mode { + if .Read in mode { + sys_flags += {.RDWR} + } else { + sys_flags += {.WRONLY} + } + } + + if .Append in mode { sys_flags += {.APPEND} } + if .Create in mode { sys_flags += {.CREAT} } + if .Excl in mode { sys_flags += {.EXCL} } + if .Sync in mode { sys_flags += {.DSYNC} } + if .Trunc in mode { sys_flags += {.TRUNC} } + + handle = posix.openat(dir, cpath, sys_flags, transmute(posix.mode_t)posix._mode_t(transmute(u32)perm)) + if handle < 0 { + err = FS_Error(posix.errno()) + } + + return +} + +@(private="package") +_associate_handle :: proc(handle: uintptr, l: ^Event_Loop) -> (Handle, Association_Error) { + flags_ := posix.fcntl(posix.FD(handle), .GETFL) + if flags_ < 0 { + #partial switch errno := posix.errno(); errno { + case .EBADF: return -1, .Invalid_Handle + case: return -1, Association_Error(errno) + } + } + flags := transmute(posix.O_Flags)(flags_) + + if .NONBLOCK in flags { + return Handle(handle), nil + } + + if posix.fcntl(posix.FD(handle), .SETFL, flags) < 0 { + #partial switch errno := posix.errno(); errno { + case .EBADF: return -1, .Invalid_Handle + case: return -1, Association_Error(errno) + } + } + + return Handle(handle), nil +} + +@(private="package") +_associate_socket :: proc(socket: Any_Socket, l: ^Event_Loop) -> Association_Error { + if err := net.set_blocking(socket, false); err != nil { + switch err { + case .None: unreachable() + case .Network_Unreachable: return .Network_Unreachable + case .Invalid_Argument: return .Invalid_Handle + case .Unknown: fallthrough + case: return Association_Error(net.last_platform_error()) + } + } + + return nil +} + +@(private="package") +_wake_up :: proc(l: ^Event_Loop) { + ev := [1]kq.KEvent{ + { + ident = IDENT_WAKE_UP, + filter = .User, + flags = {}, + fflags = { + user = {.Trigger}, + }, + }, + } + t: posix.timespec + n, err := kq.kevent(l.kqueue, ev[:], nil, &t) + assert(err == nil) + assert(n == 0) +} + +// Start file private. + +// Max operations that can be enqueued per tick. +QUEUE_SIZE :: #config(ODIN_NBIO_QUEUE_SIZE, 256) + +FILTER_IGNORE :: kq.Filter(max(kq._Filter_Backing)) + +IDENT_WAKE_UP :: 69 + +Op_Result :: enum { + Done, + Pending, +} + +Operation_Flag :: enum { + Done, + Removed, + Has_Timeout, + For_Kernel, + EOF, + Error, +} +Operation_Flags :: bit_set[Operation_Flag] + +// Operations in the kqueue are uniquely identified using these 2 fields. You may not have more +// than one operation with the same identity submitted. +// So we need to keep track of the operations we have submitted, and if we add another, link it to a previously +// added operation. +Queue_Identifier :: struct { + filter: kq.Filter, + ident: uintptr, +} + +handle_completed :: proc(op: ^Operation) { + debug("handling", op.type) + + result: Op_Result + #partial switch op.type { + case .Accept: + result = accept_exec(op) + case .Dial: + result = dial_exec(op) + case .Send: + if send_exec(op) == .Done { + maybe_callback(op) + bufs_destroy(op.send.bufs, op.l.allocator) + cleanup(op) + } + return + case .Recv: + if recv_exec(op) == .Done { + maybe_callback(op) + bufs_destroy(op.recv.bufs, op.l.allocator) + cleanup(op) + } + return + case .Send_File: + result = sendfile_exec(op) + case .Read: + result = read_exec(op) + case .Write: + result = write_exec(op) + case .Poll: + result = poll_exec(op) + case .Open: + open_exec(op) + case .Close: + close_exec(op) + case .Timeout, .Stat: + // no-op + case: + unimplemented() + } + + if result == .Done { + maybe_callback(op) + cleanup(op) + } + + maybe_callback :: proc(op: ^Operation) { + if .Removed not_in op._impl.flags { + debug("done", op.type, "calling back") + op.cb(op) + } else { + debug("done but removed", op.type) + } + } + + bufs_destroy :: proc(bufs: [][]byte, allocator: mem.Allocator) { + if len(bufs) > 1 { + delete(bufs, allocator) + } + } + + cleanup :: proc(op: ^Operation) { + if .Has_Timeout in op._impl.flags { + remove_link_timeout(op) + } + if !op.detached { + pool.put(&op.l.operation_pool, op) + } + } +} + +@(require_results) +accept_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Accept) + + defer if op.accept.err != nil && op.accept.client > 0 { + posix.close(posix.FD(op.accept.client)) + } + + if op.accept.err != nil || .Done in op._impl.flags { + return .Done + } + + op.accept.client, op.accept.client_endpoint, op.accept.err = net.accept_tcp(op.accept.socket) + if op.accept.err != nil { + if op.accept.err == .Would_Block { + op.accept.err = nil + add_pending(op, .Read, uintptr(op.accept.socket)) + link_timeout(op, op.accept.expires) + return .Pending + } + + return .Done + } + + if err := net.set_blocking(op.accept.client, false); err != nil { + op.accept.err = posix_accept_error() + } + + return .Done +} + +@(require_results) +dial_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Dial) + + defer if op.dial.err != nil && op.dial.socket > 0 { + posix.close(posix.FD(op.dial.socket)) + } + + if op.dial.err != nil || .Done in op._impl.flags { + return .Done + } + + if op.dial.socket > 0 { + // We have already called connect, retrieve potential error number only. + err: posix.Errno + size := posix.socklen_t(size_of(err)) + posix.getsockopt(posix.FD(op.dial.socket), posix.SOL_SOCKET, .ERROR, &err, &size) + if err != nil { + posix.errno(err) + op.dial.err = posix_dial_error() + } + return .Done + } + + if op.dial.endpoint.port == 0 { + op.dial.err = .Port_Required + return .Done + } + + family := family_from_endpoint(op.dial.endpoint) + osocket, socket_err := _create_socket(op.l, family, .TCP) + if socket_err != nil { + op.dial.err = socket_err + return .Done + } + + op.dial.socket = osocket.(TCP_Socket) + + sockaddr := endpoint_to_sockaddr(op.dial.endpoint) + if posix.connect(posix.FD(op.dial.socket), (^posix.sockaddr)(&sockaddr), posix.socklen_t(sockaddr.ss_len)) != .OK { + if posix.errno() == .EINPROGRESS { + add_pending(op, .Write, uintptr(op.dial.socket)) + link_timeout(op, op.dial.expires) + return .Pending + } + + op.dial.err = posix_dial_error() + return .Done + } + + return .Done +} + +@(require_results) +poll_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Poll) + + if .Error in op._impl.flags { + #partial switch posix.Errno(op._impl.result) { + case .EBADF: op.poll.result = .Invalid_Argument + case: op.poll.result = .Error + } + return .Done + } + + if op._impl.result != 0 { + op.poll.result = .Ready + return .Done + } + + if op.poll.result != .Ready { + return .Done + } + + filter: kq.Filter + switch op.poll.event { + case .Receive: filter = .Read + case .Send: filter = .Write + } + + add_pending(op, filter, uintptr(net.any_socket_to_socket(op.poll.socket))) + link_timeout(op, op.poll.expires) + return .Pending +} + +close_exec :: proc(op: ^Operation) { + assert(op.type == .Close) + + if op.close.err != nil || op.close.subject == nil { + return + } + + fd: posix.FD + switch subject in op.close.subject { + case TCP_Socket: fd = posix.FD(subject) + case UDP_Socket: fd = posix.FD(subject) + case Handle: fd = posix.FD(subject) + case: op.close.err = .Invalid_Argument; return + } + + if posix.close(fd) != .OK { + op.close.err = FS_Error(posix.errno()) + } +} + +@(require_results) +send_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Send) + + if op.send.err != nil || .Done in op._impl.flags { + return .Done + } + + total: int + bufs := slice.advance_slices(op.send.bufs, op.send.sent) + bufs, total = constraint_bufs_to_max_rw(op.send.bufs) + + sock, n := sendv(op.send.socket, bufs, op.send.endpoint) + if n < 0 { + if posix.errno() == .EWOULDBLOCK { + if !op.send.all && op.send.sent > 0 { + return .Done + } + + add_pending(op, .Write, uintptr(sock)) + link_timeout(op, op.send.expires) + return .Pending + } + + switch _ in op.send.socket { + case TCP_Socket: op.send.err = posix_tcp_send_error() + case UDP_Socket: op.send.err = posix_udp_send_error() + } + return .Done + } + + op.send.sent += n + + if op.send.sent < total { + return send_exec(op) + } + + return .Done + + sendv :: proc(socket: Any_Socket, bufs: [][]byte, to: net.Endpoint) -> (posix.FD, int) { + assert(len(bufs) < int(max(i32))) + + msg: posix.msghdr + msg.msg_iov = cast([^]posix.iovec)raw_data(bufs) + msg.msg_iovlen = i32(len(bufs)) + + toaddr: posix.sockaddr_storage + fd: posix.FD + switch sock in socket { + case TCP_Socket: + fd = posix.FD(sock) + case UDP_Socket: + fd = posix.FD(sock) + toaddr = endpoint_to_sockaddr(to) + msg.msg_name = &toaddr + msg.msg_namelen = posix.socklen_t(toaddr.ss_len) + } + + return fd, posix.sendmsg(fd, &msg, {.NOSIGNAL}) + } +} + +@(require_results) +recv_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Recv) + + if op.recv.err != nil || .Done in op._impl.flags { + return .Done + } + + total: int + bufs := slice.advance_slices(op.recv.bufs, op.recv.received) + bufs, total = constraint_bufs_to_max_rw(op.recv.bufs) + + _, is_tcp := op.recv.socket.(net.TCP_Socket) + + sock, n := recvv(op.recv.socket, bufs, &op.recv.source) + if n < 0 { + if posix.errno() == .EWOULDBLOCK { + if is_tcp && !op.recv.all && op.recv.received > 0 { + return .Done + } + + add_pending(op, .Read, uintptr(sock)) + link_timeout(op, op.recv.expires) + return .Pending + } + + if is_tcp { + op.recv.err = posix_tcp_recv_error() + } else { + op.recv.err = posix_udp_recv_error() + } + + return .Done + } + + assert(is_tcp || op.recv.received == 0) + op.recv.received += n + + if is_tcp && n != 0 && op.recv.received < total { + return recv_exec(op) + } + + return .Done + + recvv :: proc(socket: Any_Socket, bufs: [][]byte, from: ^Endpoint) -> (fd: posix.FD, n: int) { + assert(len(bufs) < int(max(i32))) + + msg: posix.msghdr + msg.msg_iov = cast([^]posix.iovec)raw_data(bufs) + msg.msg_iovlen = i32(len(bufs)) + + udp: bool + fromaddr: posix.sockaddr_storage + switch sock in socket { + case TCP_Socket: + fd = posix.FD(sock) + case UDP_Socket: + fd = posix.FD(sock) + udp = true + msg.msg_name = &fromaddr + msg.msg_namelen = posix.socklen_t(size_of(fromaddr)) + } + + n = posix.recvmsg(fd, &msg, {.NOSIGNAL}) + if n >= 0 && udp { + from^ = sockaddr_to_endpoint(&fromaddr) + } + + return + } +} + +@(require_results) +sendfile_exec :: proc(op: ^Operation) -> (result: Op_Result) { + assert(op.type == .Send_File) + + defer if result == .Done && op.sendfile._impl.mapping != nil { + posix.munmap(raw_data(op.sendfile._impl.mapping), len(op.sendfile._impl.mapping)) + } + + if op.sendfile.err != nil || .Done in op._impl.flags { + return .Done + } + + when ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { + // Doesn't have `sendfile`, emulate it with `mmap` + normal `send`. + return sendfile_exec_emulated(op) + } else { + return sendfile_exec_native(op) + + @(require_results) + sendfile_exec_native :: proc(op: ^Operation) -> Op_Result { + nbytes := op.sendfile.nbytes + assert(nbytes != 0) + if nbytes == SEND_ENTIRE_FILE { + nbytes = 0 // special value for entire file. + + // If we want progress updates we need nbytes to be the actual size, or the user + // won't be able to check `sent < nbytes` to know if it's the final callback. + if op.sendfile.progress_updates { + stat: posix.stat_t + if posix.fstat(op.sendfile.file, &stat) != .OK { + op.sendfile.err = FS_Error(posix.errno()) + return .Done + } + op.sendfile.nbytes = int(stat.st_size - posix.off_t(op.sendfile.offset)) + } + } else { + nbytes -= op.sendfile.sent + } + + n, ok := posix_sendfile(op.sendfile.file, op.sendfile.socket, op.sendfile.offset + op.sendfile.sent, nbytes) + + assert(n >= 0) + op.sendfile.sent += n + + if !ok { + op.sendfile.err = posix_tcp_send_error() + if op.sendfile.err == .Would_Block { + op.sendfile.err = nil + if op.sendfile.progress_updates { op.cb(op) } + add_pending(op, .Write, uintptr(op.sendfile.socket)) + link_timeout(op, op.sendfile.expires) + return .Pending + } + + return .Done + } + + assert(op.sendfile.nbytes == SEND_ENTIRE_FILE || op.sendfile.sent == op.sendfile.nbytes) + return .Done + } + } + + @(require_results) + sendfile_exec_emulated :: proc(op: ^Operation) -> Op_Result { + if op.sendfile.nbytes == SEND_ENTIRE_FILE { + stat: posix.stat_t + if posix.fstat(op.sendfile.file, &stat) != .OK { + op.sendfile.err = FS_Error(posix.errno()) + return .Done + } + op.sendfile.nbytes = int(stat.st_size - posix.off_t(op.sendfile.offset)) + } + + if op.sendfile._impl.mapping == nil { + addr := posix.mmap(nil, uint(op.sendfile.nbytes), {.READ}, {}, op.sendfile.file, posix.off_t(op.sendfile.offset)) + if addr == posix.MAP_FAILED { + op.sendfile.err = FS_Error(posix.errno()) + return .Done + } + op.sendfile._impl.mapping = ([^]byte)(addr)[:op.sendfile.nbytes] + } + + n := posix.send( + posix.FD(op.sendfile.socket), + raw_data(op.sendfile._impl.mapping)[op.sendfile.sent:], + uint(min(MAX_RW, op.sendfile.nbytes - op.sendfile.sent)), + {.NOSIGNAL}, + ) + if n < 0 { + op.sendfile.err = posix_tcp_send_error() + if op.sendfile.err == .Would_Block { + op.sendfile.err = nil + add_pending(op, .Write, uintptr(op.sendfile.socket)) + link_timeout(op, op.sendfile.expires) + return .Pending + } + + return .Done + } + + op.sendfile.sent += n + + if op.sendfile.sent < op.sendfile.nbytes { + if op.sendfile.progress_updates { op.cb(op) } + return sendfile_exec_emulated(op) + } + + return .Done + } +} + +@(require_results) +read_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Read) + + if op.read.err != nil || .Done in op._impl.flags { + return .Done + } + + to_read := op.read.buf[op.read.read:] + to_read = to_read[:min(MAX_RW, len(to_read))] + + res := posix.pread(op.read.handle, raw_data(to_read), len(to_read), posix.off_t(op.read.offset) + posix.off_t(op.read.read)) + if res < 0 { + errno := posix.errno() + if errno == .EWOULDBLOCK { + if !op.read.all && op.read.read > 0 { + return .Done + } + + add_pending(op, .Read, uintptr(op.read.handle)) + link_timeout(op, op.read.expires) + return .Pending + } + + op.read.err = FS_Error(errno) + return .Done + } else if res == 0 { + if op.read.read == 0 { + op.read.err = .EOF + } + return .Done + } + + op.read.read += res + + if op.read.read < len(op.read.buf) { + return read_exec(op) + } + + return .Done +} + +@(require_results) +write_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Write) + + if op.write.err != nil || .Done in op._impl.flags { + return .Done + } + + to_write := op.write.buf[op.write.written:] + to_write = to_write[:min(MAX_RW, len(to_write))] + + res := posix.pwrite(op.write.handle, raw_data(to_write), len(to_write), posix.off_t(op.write.offset) + posix.off_t(op.write.written)) + if res < 0 { + errno := posix.errno() + if errno == .EWOULDBLOCK { + if !op.write.all && op.write.written > 0 { + return .Done + } + + add_pending(op, .Write, uintptr(op.write.handle)) + link_timeout(op, op.write.expires) + return .Pending + } + + op.write.err = FS_Error(errno) + return .Done + } + + op.write.written += res + + if op.write.written < len(op.write.buf) { + return write_exec(op) + } + + return .Done +} + +timeout_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Timeout) + + if op.timeout.duration <= 0 { + return .Done + } + + op.l.submitted[Queue_Identifier{ ident = uintptr(op), filter = .Timer }] = op + + op._impl.flags += {.For_Kernel} + + append_pending(op.l, kq.KEvent { + ident = uintptr(op), + filter = .Timer, + flags = {.Add, .Enable, .One_Shot}, + fflags = { + timer = kq.TIMER_FLAGS_NSECONDS + {.Absolute}, + }, + data = op.l.now._nsec + i64(op.timeout.duration), + udata = op, + }) + return .Pending +} + +open_exec :: proc(op: ^Operation) { + assert(op.type == .Open) + + if op.open.err != nil && op.open.handle > 0 { + posix.close(op.open.handle) + return + } + + if .Done in op._impl.flags { + return + } + + op.open.handle, op.open.err = _open_sync(op.l, op.open.path, op.open.dir, op.open.mode, op.open.perm) +} + +stat_exec :: proc(op: ^Operation) { + assert(op.type == .Stat) + + stat: posix.stat_t + if posix.fstat(op.stat.handle, &stat) != .OK { + op.stat.err = FS_Error(posix.errno()) + return + } + + op.stat.type = .Undetermined + switch { + case posix.S_ISBLK(stat.st_mode) || posix.S_ISCHR(stat.st_mode): + op.stat.type = .Device + case posix.S_ISDIR(stat.st_mode): + op.stat.type = .Directory + case posix.S_ISFIFO(stat.st_mode) || posix.S_ISSOCK(stat.st_mode): + op.stat.type = .Pipe_Or_Socket + case posix.S_ISLNK(stat.st_mode): + op.stat.type = .Symlink + case posix.S_ISREG(stat.st_mode): + op.stat.type = .Regular + } + + op.stat.size = i64(stat.st_size) +} + +add_pending :: proc(op: ^Operation, filter: kq.Filter, ident: uintptr) { + debug("adding pending", op.type) + op._impl.flags += {.For_Kernel} + + _, val, just_inserted, err := map_entry(&op.l.submitted, Queue_Identifier{ ident = ident, filter = filter }) + ensure(err == nil, "allocation failure") + if just_inserted { + val^ = op + + append_pending(op.l, kq.KEvent { + filter = filter, + ident = ident, + flags = {.Add, .Enable, .One_Shot}, + udata = op, + }) + } else { + debug("already have this operation on the kqueue, bundling it") + + last := val^ + for last._impl.next != nil { + last = last._impl.next + } + last._impl.next = op + op._impl.prev = last + } +} + +append_pending :: #force_inline proc(l: ^Event_Loop, ev: kq.KEvent) { + if !sa.append(&l.pending, ev) { + warn("queue is full, adding to overflow, should QUEUE_SIZE be increased?") + _, err := queue.append(&l.overflow, ev) + ensure(err == nil, "allocation failure") + } +} + +link_timeout :: proc(op: ^Operation, expires: time.Time) { + if expires == {} { + return + } + + debug(op.type, "times out at", expires) + + op._impl.flags += {.Has_Timeout} + + append_pending(op.l, kq.KEvent { + ident = uintptr(op), + filter = .Timer, + flags = {.Add, .Enable, .One_Shot}, + fflags = { + timer = kq.TIMER_FLAGS_NSECONDS + {.Absolute}, + }, + data = expires._nsec, + udata = op, + }) +} + +remove_link_timeout :: proc(op: ^Operation) { + debug("removing timeout of", op.type) + assert(.Has_Timeout in op._impl.flags) + + append_pending(op.l, kq.KEvent { + ident = uintptr(op), + filter = .Timer, + flags = {.Delete, .Disable, .One_Shot}, + }) +} + +timeout_and_delete :: proc(target: ^Operation) { + filter: kq.Filter + ident: uintptr + switch target.type { + case .Accept: + target.accept.err = .Timeout + filter = .Read + ident = uintptr(target.accept.socket) + case .Dial: + target.dial.err = Dial_Error.Timeout + filter = .Write + ident = uintptr(target.dial.socket) + case .Read: + target.read.err = .Timeout + filter = .Read + ident = uintptr(target.read.handle) + case .Write: + target.write.err = .Timeout + filter = .Write + ident = uintptr(target.write.handle) + case .Recv: + switch sock in target.recv.socket { + case TCP_Socket: + target.recv.err = TCP_Recv_Error.Timeout + ident = uintptr(sock) + case UDP_Socket: + target.recv.err = UDP_Recv_Error.Timeout + ident = uintptr(sock) + } + filter = .Read + case .Send: + switch sock in target.send.socket { + case TCP_Socket: + target.send.err = TCP_Send_Error.Timeout + ident = uintptr(sock) + case UDP_Socket: + target.send.err = UDP_Send_Error.Timeout + ident = uintptr(sock) + } + filter = .Write + case .Send_File: + target.send.err = TCP_Send_Error.Timeout + filter = .Write + ident = uintptr(target.sendfile.socket) + case .Poll: + target.poll.result = .Timeout + ident = uintptr(net.any_socket_to_socket(target.poll.socket)) + + switch target.poll.event { + case .Receive: filter = .Read + case .Send: filter = .Write + } + + case .Timeout: + ident = uintptr(target) + filter = .Timer + + case .Close: + target.close.err = .Timeout + return + + case .Open: + target.open.err = .Timeout + return + + case .Stat: + target.stat.err = .Timeout + return + + case .None, ._Link_Timeout, ._Remove, ._Splice: + return + } + + // If there are other ops linked to this kevent, don't remove it. + if target._impl.next != nil || target._impl.prev != nil { + debug("removing target by pulling it out of the linked list, other ops depend on the kevent") + assert(filter != .Timer) + + if target._impl.next != nil { + target._impl.next._impl.prev = target._impl.prev + } + + if target._impl.prev != nil { + target._impl.prev._impl.next = target._impl.next + } else { + debug("target was the head of the list, updating map to point at new head") + + _, vp, _, err := map_entry(&target.l.submitted, Queue_Identifier{ ident = ident, filter = filter }) + ensure(err == nil, "allocation failure") + assert(vp^ == target) + vp^ = target._impl.next + + ev := kq.KEvent{ + filter = filter, + ident = ident, + flags = {.Add, .Enable, .One_Shot}, + udata = target._impl.next, + } + if !sa.append(&target.l.pending, ev) { + warn("just removed the head operation of a list of multiple, and the queue is full, have to force this update through inefficiently") + // This has to happen the next time we submit or we could have udata pointing wrong. + // Very inefficient but probably never hit. + + // Makes kevent return a receipt for our addition, so we don't take any new events from it. + // This forces .Error to be added and data being 0 means it's added. + ev.flags += {.Receipt} + + timeout: posix.timespec + n, err := kq.kevent(target.l.kqueue, ([^]kq.KEvent)(&ev)[:1], ([^]kq.KEvent)(&ev)[:1], &timeout) + assert(n == 1) + assert(err == nil) + + // The receipt flag makes this occur on the event. + assert(.Error in ev.flags) + assert(ev.data == 0) + } + } + + } else if .For_Kernel in target._impl.flags { + debug("adding delete event") + + _, dval := delete_key(&target.l.submitted, Queue_Identifier{ ident = ident, filter = filter }) + assert(dval != nil) + + append_pending(target.l, kq.KEvent{ + ident = ident, + filter = filter, + flags = {.Delete, .Disable, .One_Shot}, + }) + } else { + debug("remove without delete event, because target is not in kernel") + } +} + +@(require_results) +endpoint_to_sockaddr :: proc(ep: Endpoint) -> (sockaddr: posix.sockaddr_storage) { + switch a in ep.address { + case IP4_Address: + (^posix.sockaddr_in)(&sockaddr)^ = posix.sockaddr_in { + sin_port = u16be(ep.port), + sin_addr = transmute(posix.in_addr)a, + sin_family = .INET, + sin_len = size_of(posix.sockaddr_in), + } + return + case IP6_Address: + (^posix.sockaddr_in6)(&sockaddr)^ = posix.sockaddr_in6 { + sin6_port = u16be(ep.port), + sin6_addr = transmute(posix.in6_addr)a, + sin6_family = .INET6, + sin6_len = size_of(posix.sockaddr_in6), + } + return + } + unreachable() +} + +@(require_results) +sockaddr_to_endpoint :: proc(native_addr: ^posix.sockaddr_storage) -> (ep: Endpoint) { + #partial switch native_addr.ss_family { + case .INET: + addr := cast(^posix.sockaddr_in)native_addr + port := int(addr.sin_port) + ep = Endpoint { + address = IP4_Address(transmute([4]byte)addr.sin_addr), + port = port, + } + case .INET6: + addr := cast(^posix.sockaddr_in6)native_addr + port := int(addr.sin6_port) + ep = Endpoint { + address = IP6_Address(transmute([8]u16be)addr.sin6_addr), + port = port, + } + case: + panic("native_addr is neither IP4 or IP6 address") + } + return +} diff --git a/core/nbio/impl_posix_darwin.odin b/core/nbio/impl_posix_darwin.odin new file mode 100644 index 000000000..7ec64c2df --- /dev/null +++ b/core/nbio/impl_posix_darwin.odin @@ -0,0 +1,29 @@ +#+private +package nbio + +import "core:net" +import "core:sys/posix" + +foreign import lib "system:System" + +posix_sendfile :: proc(fd: Handle, s: TCP_Socket, offset, nbytes: int) -> (sent: int, ok := true) { + foreign lib { + @(link_name="sendfile") + _posix_sendfile :: proc (fd, s: posix.FD, offset: posix.off_t, len: ^posix.off_t, hdtr: rawptr, flags: i32) -> posix.result --- + } + + len := posix.off_t(nbytes) + if _posix_sendfile(posix.FD(fd), posix.FD(s), posix.off_t(offset), &len, nil, 0) != .OK { + ok = false + } + sent = int(len) + return +} + +posix_listen_error :: net._listen_error +posix_accept_error :: net._accept_error +posix_dial_error :: net._dial_error +posix_tcp_send_error :: net._tcp_send_error +posix_udp_send_error :: net._udp_send_error +posix_tcp_recv_error :: net._tcp_recv_error +posix_udp_recv_error :: net._udp_recv_error diff --git a/core/nbio/impl_posix_freebsd.odin b/core/nbio/impl_posix_freebsd.odin new file mode 100644 index 000000000..50089510b --- /dev/null +++ b/core/nbio/impl_posix_freebsd.odin @@ -0,0 +1,52 @@ +#+private +package nbio + +import "core:net" +import "core:sys/posix" +import "core:sys/freebsd" + +foreign import lib "system:c" + +// TODO: rewrite freebsd implementation to use `sys/freebsd` instead of `sys/posix`. + +posix_sendfile :: proc(fd: Handle, s: TCP_Socket, offset, nbytes: int) -> (sent: int, ok := true) { + foreign lib { + @(link_name="sendfile") + _posix_sendfile :: proc (fd, s: posix.FD, offset: posix.off_t, nbytes: uint, hdtr: rawptr, sbytes: ^posix.off_t, flags: i32) -> posix.result --- + } + + len: posix.off_t + if _posix_sendfile(posix.FD(fd), posix.FD(s), posix.off_t(offset), uint(nbytes), nil, &len, 0) != .OK { + ok = false + } + sent = int(len) + return +} + +posix_listen_error :: proc() -> Listen_Error { + return net._listen_error(freebsd.Errno(posix.errno())) +} + +posix_accept_error :: proc() -> Accept_Error { + return net._accept_error(freebsd.Errno(posix.errno())) +} + +posix_dial_error :: proc() -> Dial_Error { + return net._dial_error(freebsd.Errno(posix.errno())) +} + +posix_tcp_send_error :: proc() -> TCP_Send_Error { + return net._tcp_send_error(freebsd.Errno(posix.errno())) +} + +posix_udp_send_error :: proc() -> UDP_Send_Error { + return net._udp_send_error(freebsd.Errno(posix.errno())) +} + +posix_tcp_recv_error :: proc() -> TCP_Recv_Error { + return net._tcp_recv_error(freebsd.Errno(posix.errno())) +} + +posix_udp_recv_error :: proc() -> UDP_Recv_Error { + return net._udp_recv_error(freebsd.Errno(posix.errno())) +} diff --git a/core/nbio/impl_posix_netbsd.odin b/core/nbio/impl_posix_netbsd.odin new file mode 100644 index 000000000..a0e2652f4 --- /dev/null +++ b/core/nbio/impl_posix_netbsd.odin @@ -0,0 +1,12 @@ +#+private +package nbio + +import "core:net" + +posix_listen_error :: net._listen_error +posix_accept_error :: net._accept_error +posix_dial_error :: net._dial_error +posix_tcp_send_error :: net._tcp_send_error +posix_udp_send_error :: net._udp_send_error +posix_tcp_recv_error :: net._tcp_recv_error +posix_udp_recv_error :: net._udp_recv_error diff --git a/core/nbio/impl_posix_openbsd.odin b/core/nbio/impl_posix_openbsd.odin new file mode 100644 index 000000000..a0e2652f4 --- /dev/null +++ b/core/nbio/impl_posix_openbsd.odin @@ -0,0 +1,12 @@ +#+private +package nbio + +import "core:net" + +posix_listen_error :: net._listen_error +posix_accept_error :: net._accept_error +posix_dial_error :: net._dial_error +posix_tcp_send_error :: net._tcp_send_error +posix_udp_send_error :: net._udp_send_error +posix_tcp_recv_error :: net._tcp_recv_error +posix_udp_recv_error :: net._udp_recv_error diff --git a/core/nbio/impl_windows.odin b/core/nbio/impl_windows.odin new file mode 100644 index 000000000..7f98c7490 --- /dev/null +++ b/core/nbio/impl_windows.odin @@ -0,0 +1,1738 @@ +#+private file +package nbio + +import "base:intrinsics" + +import "core:container/avl" +import "core:container/pool" +import "core:container/queue" +import "core:mem" +import "core:net" +import "core:slice" +import "core:strings" +import "core:time" +import "core:path/filepath" + +import win "core:sys/windows" + +@(private="package") +_FULLY_SUPPORTED :: true + +@(private="package") +_Event_Loop :: struct { + iocp: win.HANDLE, + allocator: mem.Allocator, + timeouts: avl.Tree(^Operation), + completed: queue.Queue(^Operation), +} + +@(private="package") +_Handle :: distinct uintptr + +@(private="package") +_CWD :: ~_Handle(99) + +@(private="package") +MAX_RW :: mem.Gigabyte + +@(private="package") +_Operation :: struct { + over: win.OVERLAPPED, + timeout: ^Operation, +} +#assert(offset_of(Operation, _impl) == 0, "needs to be the first field to work") +#assert(offset_of(_Operation, over) == 0, "needs to be the first field to work") + +@(private="package") +_Accept :: struct { + // Space that gets the local and remote address written into it. + addrs: [(size_of(win.sockaddr_in6)+16)*2]byte, +} + +@(private="package") +_Close :: struct {} + +@(private="package") +_Dial :: struct { + addr: win.SOCKADDR_STORAGE_LH, +} + +@(private="package") +_Read :: struct {} + +@(private="package") +_Write :: struct {} + +@(private="package") +_Send :: struct { + small_bufs: [1][]byte, +} + +@(private="package") +_Recv :: struct { + source: win.SOCKADDR_STORAGE_LH, + source_len: win.INT, + small_bufs: [1][]byte, + flags: win.DWORD, +} + +@(private="package") +_Timeout :: struct { + expires: time.Time, + target: ^Operation, +} + +@(private="package") +_Poll :: struct { + wait_handle: win.HANDLE, +} + +@(private="package") +_Send_File :: struct {} + +@(private="package") +_Remove :: struct {} + +@(private="package") +_Link_Timeout :: struct {} + +@(private="package") +_Splice :: struct {} + +@(private="package") +_Open :: struct {} + +@(private="package") +_Stat :: struct {} + +@(private="package") +_init :: proc(l: ^Event_Loop, alloc: mem.Allocator) -> (err: General_Error) { + l.allocator = alloc + + mem_err: mem.Allocator_Error + if mem_err = queue.init(&l.completed, allocator = alloc); mem_err != nil { + err = .Allocation_Failed + return + } + defer if err != nil { queue.destroy(&l.completed) } + + avl.init(&l.timeouts, timeouts_cmp, alloc) + + win.ensure_winsock_initialized() + + l.iocp = win.CreateIoCompletionPort(win.INVALID_HANDLE_VALUE, nil, 0, 1) + if l.iocp == nil { + err = General_Error(win.GetLastError()) + return + } + + return + + timeouts_cmp :: #force_inline proc(a, b: ^Operation) -> slice.Ordering { + switch { + case a.timeout._impl.expires._nsec < b.timeout._impl.expires._nsec: + return .Less + case a.timeout._impl.expires._nsec > b.timeout._impl.expires._nsec: + return .Greater + case uintptr(a) < uintptr(b): + return .Less + case uintptr(a) > uintptr(b): + return .Greater + case: + assert(a == b) + return .Equal + } + } +} + +@(private="package") +_destroy :: proc(l: ^Event_Loop) { + queue.destroy(&l.completed) + avl.destroy(&l.timeouts) + win.CloseHandle(l.iocp) +} + +@(private="package") +__tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { + debug("tick") + + l.now = time.now() + next_timeout := check_timeouts(l) + + // Prevent infinite loop when callback adds to completed by storing length. + n := queue.len(l.completed) + if n > 0 { + for _ in 0 ..< n { + op := queue.pop_front(&l.completed) + handle_completed(op) + } + } + + if pool.num_outstanding(&l.operation_pool) == 0 { return nil } + + actual_timeout := win.INFINITE + if queue.len(l.completed) > 0 { + actual_timeout = 0 + } else if timeout >= 0 { + actual_timeout = win.DWORD(timeout / time.Millisecond) + } + if nt, ok := next_timeout.?; ok { + actual_timeout = min(actual_timeout, win.DWORD(nt / time.Millisecond)) + } + + for { + QUEUE_SIZE :: 256 + events: [QUEUE_SIZE]win.OVERLAPPED_ENTRY + entries_removed: win.ULONG + if !win.GetQueuedCompletionStatusEx(l.iocp, &events[0], len(events), &entries_removed, actual_timeout, false) { + if terr := win.GetLastError(); terr != win.WAIT_TIMEOUT { + err = General_Error(terr) + return + } + } + + if actual_timeout > 0 { + // We may have just waited some time, lets update the current time. + l.now = time.now() + } + + if entries_removed > 0 { + debug(int(entries_removed), "operations were completed") + } + + for event in events[:entries_removed] { + if event.lpCompletionKey == COMPLETION_KEY_WAKE_UP { continue } + assert(event.lpOverlapped != nil) + + // This is actually pointing at the Completion.over field, but because it is the first field + // It is also a valid pointer to the Completion struct. + op := (^Operation)(event.lpOverlapped) + handle_completed(op) + } + + if entries_removed < QUEUE_SIZE { + break + } + + // `events` was filled up, get more. + debug("GetQueuedCompletionStatusEx filled entire events buffer, getting more") + actual_timeout = 0 + } + + return nil + + check_timeouts :: proc(l: ^Event_Loop) -> (expires: Maybe(time.Duration)) { + curr := l.now + + if avl.len(&l.timeouts) == 0 { + return + } + + debug(avl.len(&l.timeouts), "timeouts", "threshold", curr) + + iter := avl.iterator(&l.timeouts, .Forward) + for node in avl.iterator_next(&iter) { + op := node.value + cexpires := time.diff(curr, op.timeout._impl.expires) + + debug("expires after", cexpires) + + removed := op._impl.timeout == (^Operation)(REMOVED) + done := cexpires <= 0 + if removed { + debug("timeout removed!") + } else if done { + debug("timeout done!") + handle_completed(op) + } + if removed || done { + avl.remove_node(&l.timeouts, node) + continue + } + + expires = cexpires + debug("first timeout in the future is at", op.timeout._impl.expires, "after", cexpires) + return + } + + return + } + + handle_completed :: proc(op: ^Operation) { + debug("handling", op.type) + + if op._impl.timeout == (^Operation)(REMOVED) { + debug(op.type, "was removed") + + // Set an error, and call the internal callback. + // This way resources are cleaned up properly, for example the result socket for dial. + // If we just do nothing it will be leaked. + + if op._impl.over.Internal == nil { + // There is no error from the kernel, set one ourselves. + // This needs to be an NTSTATUS code, not a win32 error number. + STATUS_REQUEST_ABORTED :: 0xC023000C + op._impl.over.Internal = (^win.c_ulong)(uintptr(STATUS_REQUEST_ABORTED)) + } + } + + result := Op_Result.Done + switch op.type { + case .Read: + result = read_callback(op) + case .Recv: + result = recv_callback(op) + if result == .Done { + maybe_callback(op) + if len(op.recv.bufs) > 1 { + delete(op.recv.bufs, op.l.allocator) + } + cleanup(op) + return + } + case .Write: + result = write_callback(op) + case .Send: + result = send_callback(op) + if result == .Done { + maybe_callback(op) + if len(op.send.bufs) > 1 { + delete(op.send.bufs, op.l.allocator) + } + cleanup(op) + return + } + case .Send_File: + result = sendfile_callback(op) + case .Accept: + accept_callback(op) + case .Dial: + dial_callback(op) + case .Poll: + poll_callback(op) + case .Timeout, .Open, .Stat, .Close: + // no-op. + case .None, ._Link_Timeout, ._Remove, ._Splice: + fallthrough + case: + unreachable() + } + + if result == .Pending { + assert(op._impl.timeout != (^Operation)(REMOVED)) + debug(op.type, "pending") + return + } + + maybe_callback(op) + cleanup(op) + + maybe_callback :: proc(op: ^Operation) { + if op._impl.timeout == (^Operation)(REMOVED) { + debug(op.type, "done but removed") + } else { + debug(op.type, "done") + op.cb(op) + + if op._impl.timeout != nil { + debug("cancelling timeout of", op.type) + op._impl.timeout.timeout._impl.target = nil + _remove(op._impl.timeout) + } + } + } + + cleanup :: proc(op: ^Operation) { + if !op.detached { + pool.put(&op.l.operation_pool, op) + } + } + } + +} + +@(private="package") +_exec :: proc(op: ^Operation) { + assert(op.l == &_tls_event_loop) + + result: Op_Result + switch op.type { + case .Accept: result = accept_exec(op) + case .Close: close_exec(op); result = .Done + case .Dial: result = dial_exec(op) + case .Recv: result = recv_exec(op) + case .Send: result = send_exec(op) + case .Send_File: result = sendfile_exec(op) + case .Read: result = read_exec(op) + case .Write: result = write_exec(op) + case .Timeout: result = timeout_exec(op) + case .Poll: result = poll_exec(op) + case .Open: open_exec(op); result = .Done + case .Stat: stat_exec(op); result = .Done + case .None, ._Link_Timeout, ._Remove, ._Splice: + unreachable() + } + + switch result { + case .Pending: + // no-op, in kernel. + debug("exec", op.type, "pending") + case .Done: + debug("exec", op.type, "done immediately") + _, err := queue.append(&op.l.completed, op) // Got result, handle it next tick. + ensure(err == nil, "allocation failure") + } +} + +@(private="package") +_open_sync :: proc(l: ^Event_Loop, name: string, dir: Handle, mode: File_Flags, perm: Permissions) -> (handle: Handle, err: FS_Error) { + if len(name) == 0 { + err = .Invalid_Argument + return + } + + dir := dir + + is_abs := filepath.is_abs(name) + is_cwd: bool + cwd_path: win.wstring + if !is_abs && dir == CWD { + is_cwd = true + + cwd_len := win.GetCurrentDirectoryW(0, nil) + assert(cwd_len > 0) + cwd_buf, cwd_err := make([]u16, cwd_len, l.allocator) + if cwd_err != nil { return INVALID_HANDLE, .Allocation_Failed } + cwd_len = win.GetCurrentDirectoryW(cwd_len, raw_data(cwd_buf)) + assert(int(cwd_len) == len(cwd_buf)-1) + cwd_path = win.wstring(raw_data(cwd_buf)) + + dir = Handle(win.CreateFileW( + cwd_path, + win.GENERIC_READ, + win.FILE_SHARE_READ|win.FILE_SHARE_WRITE, + nil, + win.OPEN_EXISTING, + win.FILE_FLAG_BACKUP_SEMANTICS, + nil, + )) + if dir == INVALID_HANDLE { + err = FS_Error(win.GetLastError()) + return + } + } + defer if is_cwd { + delete(cwd_path, l.allocator) + win.CloseHandle(win.HANDLE(dir)) + } + + path, was_alloc := _normalize_path(name, l.allocator) + defer if was_alloc { delete(path, l.allocator) } + + wpath := win.utf8_to_utf16(path, l.allocator) + defer delete(wpath, l.allocator) + + if path == "" || wpath == nil { + return INVALID_HANDLE, .Allocation_Failed + } + + path_len := len(wpath) * 2 + if path_len > int(max(u16)) { + err = .Invalid_Argument + return + } + + access: u32 + switch mode & {.Read, .Write} { + case {.Read}: access = win.FILE_GENERIC_READ + case {.Write}: access = win.FILE_GENERIC_WRITE + case {.Read, .Write}: access = win.FILE_GENERIC_READ | win.FILE_GENERIC_WRITE + } + + if .Create in mode { + access |= win.FILE_GENERIC_WRITE + } + if .Append in mode { + access &~= win.FILE_GENERIC_WRITE + access |= win.FILE_APPEND_DATA + } + share_mode := u32(win.FILE_SHARE_READ | win.FILE_SHARE_WRITE) + + create_mode: u32 = win.FILE_OPEN + switch { + case mode & {.Create, .Excl} == {.Create, .Excl}: + create_mode = win.FILE_CREATE + case mode & {.Create, .Trunc} == {.Create, .Trunc}: + create_mode = win.FILE_OVERWRITE_IF + case mode & {.Create} == {.Create}: + create_mode = win.FILE_OPEN_IF + case mode & {.Trunc} == {.Trunc}: + create_mode = win.FILE_OVERWRITE + } + + attrs: u32 = win.FILE_ATTRIBUTE_NORMAL + + if .Write_User not_in perm { + attrs = win.FILE_ATTRIBUTE_READONLY + if create_mode == win.FILE_OVERWRITE_IF { + // NOTE(bill): Open has just asked to create a file in read-only mode. + // If the file already exists, to make it akin to a *nix open call, + // the call preserves the existing permissions. + + h: win.HANDLE + io_status: win.IO_STATUS_BLOCK + status := win.NtCreateFile( + &h, + access, + &{ + Length = size_of(win.OBJECT_ATTRIBUTES), + RootDirectory = is_abs ? nil : win.HANDLE(dir), + ObjectName = &{ + Length = u16(path_len), + MaximumLength = u16(path_len), + Buffer = raw_data(wpath), + }, + }, + &io_status, + nil, + win.FILE_ATTRIBUTE_NORMAL, + share_mode, + win.FILE_OVERWRITE, + 0, + nil, + 0, + ) + syserr := win.System_Error(win.RtlNtStatusToDosError(status)) + #partial switch syserr { + case .FILE_NOT_FOUND, .BAD_NETPATH, .PATH_NOT_FOUND: + // File does not exists, create the file + case .SUCCESS: + association_err: Association_Error + handle, association_err = _associate_handle(uintptr(h), l) + // This shouldn't fail, we just created this file, with correct flags. + assert(association_err != nil) + return + case: + err = FS_Error(syserr) + return + } + } + } + + h: win.HANDLE + io_status: win.IO_STATUS_BLOCK + status := win.NtCreateFile( + &h, + access, + &{ + Length = size_of(win.OBJECT_ATTRIBUTES), + RootDirectory = is_abs ? nil : win.HANDLE(dir), + ObjectName = &{ + Length = u16(path_len), + MaximumLength = u16(path_len), + Buffer = raw_data(wpath), + }, + }, + &io_status, + nil, + attrs, + share_mode, + create_mode, + 0, + nil, + 0, + ) + syserr := win.System_Error(win.RtlNtStatusToDosError(status)) + #partial switch syserr { + case .SUCCESS: + association_err: Association_Error + handle, association_err = _associate_handle(uintptr(h), l) + // This shouldn't fail, we just created this file, with correct flags. + assert(association_err == nil) + return + case: + err = FS_Error(syserr) + return + } + + @(require_results) + _normalize_path :: proc(path: string, allocator := context.allocator) -> (fixed: string, allocated: bool) { + // An UNC path or relative, just replace slashes. + if strings.has_prefix(path, `\\`) || !filepath.is_abs(path) { + return strings.replace_all(path, `/`, `\`) + } + + path_buf, err := make([]byte, len(PREFIX)+len(path)+1, allocator) + if err != nil { return } + defer if !allocated { delete(path_buf, allocator) } + + PREFIX :: `\??` + copy(path_buf, PREFIX) + n := len(path) + r, w := 0, len(PREFIX) + for r < n { + switch { + case filepath.is_separator(path[r]): + r += 1 + case path[r] == '.' && (r+1 == n || filepath.is_separator(path[r+1])): + // \.\ + r += 1 + case r+1 < n && path[r] == '.' && path[r+1] == '.' && (r+2 == n || filepath.is_separator(path[r+2])): + // Skip \..\ paths + return path, false + case: + path_buf[w] = '\\' + w += 1 + for r < n && !filepath.is_separator(path[r]) { + path_buf[w] = path[r] + r += 1 + w += 1 + } + } + } + + // Root directories require a trailing \ + if w == len(`\\?\c:`) { + path_buf[w] = '\\' + w += 1 + } + + allocated = true + fixed = string(path_buf[:w]) + return + } +} + +@(private="package") +_listen :: proc(socket: TCP_Socket, backlog := 1000) -> (err: Listen_Error) { + if res := win.listen(win.SOCKET(socket), i32(backlog)); res == win.SOCKET_ERROR { + err = net._listen_error() + } + return +} + +@(private="package") +_create_socket :: proc( + l: ^Event_Loop, + family: Address_Family, + protocol: Socket_Protocol, +) -> ( + socket: Any_Socket, + err: Create_Socket_Error, +) { + socket = net.create_socket(family, protocol) or_return + + association_err := _associate_socket(socket, l) + // Network unreachable would've happened on creation too. + // Not possible to associate or invalid handle can't happen because we controlled creation. + assert(association_err == nil) + + return +} + +@(private="package") +_remove :: proc(target: ^Operation) { + debug("remove", target.type) + + if target._impl.timeout == (^Operation)(REMOVED) { + return + } + + if target._impl.timeout != nil { + _remove(target._impl.timeout) + } + + target._impl.timeout = (^Operation)(REMOVED) + + switch target.type { + case .Poll: + win.UnregisterWaitEx(target.poll._impl.wait_handle, nil) + target.poll._impl.wait_handle = nil + + ok := win.PostQueuedCompletionStatus( + target.l.iocp, + 0, + 0, + &target._impl.over, + ) + ensure(ok == true, "unexpected PostQueuedCompletionStatus error") + return + + case .Timeout: + if avl.remove_value(&target.l.timeouts, target) { + debug("removed timeout directly") + if !target.detached { + pool.put(&target.l.operation_pool, target) + } + } else { + debug("timeout is in completed queue, will be picked up there") + } + return + + case .Close, .Open, .Stat: + // Synchronous ops, picked up in handler. + return + + case .Accept, .Dial, .Read, .Recv, .Send, .Write, .Send_File: + if is_pending(target._impl.over) { + handle := operation_handle(target) + assert(handle != win.INVALID_HANDLE) + ok := win.CancelIoEx(handle, &target._impl.over) + if !ok { + err := win.System_Error(win.GetLastError()) + #partial switch err { + case .NOT_FOUND: + debug("Remove: Cancel", target.type, "NOT_FOUND") + case .INVALID_HANDLE: + debug("Remove: Cancel", target.type, "INVALID_HANDLE") // Likely closed already. + case: + assert(false, "unexpected CancelIoEx error") + } + } + } + + case ._Remove: + panic("can't remove a removal") + + case .None, ._Splice, ._Link_Timeout: + fallthrough + case: + unreachable() + } +} + +@(private="package") +_associate_handle :: proc(handle: uintptr, l: ^Event_Loop) -> (Handle, Association_Error) { + handle_iocp := win.CreateIoCompletionPort(win.HANDLE(handle), l.iocp, 0, 0) + if handle_iocp != l.iocp { + return INVALID_HANDLE, .Not_Possible_To_Associate + } + + cmode: byte + cmode |= win.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS + cmode |= win.FILE_SKIP_SET_EVENT_ON_HANDLE + ok := win.SetFileCompletionNotificationModes(win.HANDLE(handle), cmode) + + // This is an assertion because I don't believe this can happen when we just successfully + // called `CreateIoCompletionPort`. + assert(ok == true, "unexpected SetFileCompletionNotificationModes error") + + return Handle(handle), nil +} + +@(private="package") +_associate_socket :: proc(socket: Any_Socket, l: ^Event_Loop) -> Association_Error { + if err := net.set_blocking(socket, false); err != nil { + switch err { + case .None: unreachable() + case .Network_Unreachable: return .Network_Unreachable + case .Invalid_Argument: return .Invalid_Handle + case .Unknown: fallthrough + case: return Association_Error(net.last_platform_error()) + } + } + + _, err := _associate_handle(uintptr(net.any_socket_to_socket(socket)), l) + return err +} + +@(private="package") +_wake_up :: proc(l: ^Event_Loop) { + win.PostQueuedCompletionStatus( + l.iocp, + 0, + COMPLETION_KEY_WAKE_UP, + nil, + ) +} + +// Start file private. + +REMOVED :: rawptr(max(uintptr)-1) + +INVALID_HANDLE :: Handle(win.INVALID_HANDLE) + +COMPLETION_KEY_WAKE_UP :: 69 + +Op_Result :: enum { + Done, + Pending, +} + +operation_handle :: proc(op: ^Operation) -> win.HANDLE { + switch op.type { + case .Accept: return win.HANDLE(uintptr(op.accept.socket)) + case .Close: + switch fd in op.close.subject { + case TCP_Socket: return win.HANDLE(uintptr(fd)) + case UDP_Socket: return win.HANDLE(uintptr(fd)) + case Handle: return win.HANDLE(uintptr(fd)) + case: + unreachable() + } + case .Dial: return win.HANDLE(uintptr(op.dial.socket)) + case .Read: return win.HANDLE(op.read.handle) + case .Write: return win.HANDLE(op.write.handle) + case .Recv: return win.HANDLE(uintptr(net.any_socket_to_socket(op.recv.socket))) + case .Send: return win.HANDLE(uintptr(net.any_socket_to_socket(op.send.socket))) + case .Send_File: return win.HANDLE(uintptr(net.any_socket_to_socket(op.sendfile.socket))) + case .Poll: return win.HANDLE(uintptr(net.any_socket_to_socket(op.poll.socket))) + case .Stat: return win.HANDLE(uintptr(op.stat.handle)) + + case .Timeout, .Open, ._Splice, ._Link_Timeout, ._Remove, .None: + return win.INVALID_HANDLE + case: + unreachable() + } +} + +close_exec :: proc(op: ^Operation) { + assert(op.type == .Close) + + switch h in op.close.subject { + case Handle: + if !win.CloseHandle(win.HANDLE(h)) { + op.close.err = FS_Error(win.GetLastError()) + } + case TCP_Socket: + if win.closesocket(win.SOCKET(h)) != win.NO_ERROR { + op.close.err = FS_Error(win.WSAGetLastError()) + } + case UDP_Socket: + if win.closesocket(win.SOCKET(h)) != win.NO_ERROR { + op.close.err = FS_Error(win.WSAGetLastError()) + } + case: + op.close.err = .Invalid_Argument + return + } +} + +@(require_results) +accept_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Accept) + assert(is_fresh(op._impl.over)) + + family := Address_Family.IP4 + { + ep, err := bound_endpoint(op.accept.socket) + if err != nil { + op.accept.err = net._accept_error() + return .Done + } + + if _, is_ip6 := ep.address.(IP6_Address); is_ip6 { + family = .IP6 + } + } + + client, err := _create_socket(op.l, family, .TCP) + if err != nil { + op.accept.err = net._accept_error() + return .Done + } + + + op.accept.client = client.(TCP_Socket) + + received: win.DWORD + if !win.AcceptEx( + win.SOCKET(op.accept.socket), + win.SOCKET(op.accept.client), + &op.accept._impl.addrs, + 0, + size_of(win.sockaddr_in6) + 16, + size_of(win.sockaddr_in6) + 16, + &received, + &op._impl.over, + ) { + if op._impl.over.Internal == nil { + op.accept.err = net._accept_error() + } else if is_pending(op._impl.over) { + link_timeout(op, op.accept.expires) + return .Pending + } + } + + return .Done +} + +accept_callback :: proc(op: ^Operation) { + assert(op.type == .Accept) + + defer if op.accept.err != nil { + win.closesocket(win.SOCKET(op.accept.client)) + } + + if op.accept.err != nil { + return + } + + _, err := get_result(op._impl.over) + #partial switch err { + case .SUCCESS: + local_addr: ^win.sockaddr + local_addr_len: win.INT + remote_addr: ^win.sockaddr + remote_addr_len: win.INT + win.GetAcceptExSockaddrs( + &op.accept._impl.addrs, + 0, + size_of(win.sockaddr_in6) + 16, + size_of(win.sockaddr_in6) + 16, + &local_addr, + &local_addr_len, + &remote_addr, + &remote_addr_len, + ) + + assert(remote_addr_len <= size_of(win.SOCKADDR_STORAGE_LH)) + op.accept.client_endpoint = sockaddr_to_endpoint((^win.SOCKADDR_STORAGE_LH)(remote_addr)) + + // enables getsockopt, setsockopt, getsockname, getpeername, etc. + win.setsockopt(win.SOCKET(op.accept.client), win.SOL_SOCKET, win.SO_UPDATE_ACCEPT_CONTEXT, nil, 0) + + case .OPERATION_ABORTED: + // This error could also happen when the user calls close on the socket. + if check_timed_out(op, op.accept.expires) { + op.accept.err = Accept_Error.Timeout + return + } + fallthrough + + case: + win.SetLastError(win.DWORD(err)) + op.accept.err = net._accept_error() + } +} + +@(require_results) +dial_exec :: proc(op: ^Operation) -> (result: Op_Result) { + assert(op.type == .Dial) + assert(is_fresh(op._impl.over)) + + if op.dial.endpoint.port == 0 { + op.dial.err = .Port_Required + return .Done + } + + family := family_from_endpoint(op.dial.endpoint) + osocket, socket_err := _create_socket(op.l, family, .TCP) + if socket_err != nil { + op.dial.err = socket_err + return .Done + } + + op.dial.socket = osocket.(TCP_Socket) + + sockaddr := endpoint_to_sockaddr({IP6_Any if family == .IP6 else net.IP4_Any, 0}) + res := win.bind(win.SOCKET(op.dial.socket), &sockaddr, size_of(sockaddr)) + if res < 0 { + op.dial.err = net._bind_error() + win.closesocket(win.SOCKET(op.dial.socket)) + return .Done + } + + op.dial._impl.addr = endpoint_to_sockaddr(op.dial.endpoint) + + connect_ex: win.LPFN_CONNECTEX + load_socket_fn(win.SOCKET(op.dial.socket), win.WSAID_CONNECTEX, &connect_ex) + + transferred: win.DWORD + if !connect_ex( + win.SOCKET(op.dial.socket), + &op.dial._impl.addr, + size_of(op.dial._impl.addr), + nil, + 0, + &transferred, + &op._impl.over, + ) { + if op._impl.over.Internal == nil { + op.dial.err = net._dial_error() + } else if is_pending(op._impl.over) { + link_timeout(op, op.dial.expires) + return .Pending + } + + return .Done + } + + return .Done +} + +dial_callback :: proc(op: ^Operation) { + assert(op.type == .Dial) + + defer if op.dial.err != nil { + win.closesocket(win.SOCKET(op.dial.socket)) + } + + if op.dial.err != nil { + return + } + + _, err := get_result(op._impl.over) + #partial switch err { + case .SUCCESS: + // enables getsockopt, setsockopt, getsockname, getpeername, etc. + win.setsockopt(win.SOCKET(op.dial.socket), win.SOL_SOCKET, win.SO_UPDATE_CONNECT_CONTEXT, nil, 0) + + case .OPERATION_ABORTED: + op.dial.err = Dial_Error.Timeout + + case: + win.SetLastError(win.DWORD(err)) + op.dial.err = net._dial_error() + } +} + +@(require_results) +read_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Read) + op._impl.over = {} // Can be called multiple times. + + op._impl.over.OffsetFull = u64(op.read.offset) + u64(op.read.read) + + to_read := op.read.buf[op.read.read:] + + read: win.DWORD + if !win.ReadFile( + win.HANDLE(op.read.handle), + raw_data(to_read), + win.DWORD(min(len(to_read), MAX_RW)), + &read, + &op._impl.over, + ) { + assert(read == 0) + if op._impl.over.Internal == nil { + op.read.err = FS_Error(win.GetLastError()) + } else if is_pending(op._impl.over) { + link_timeout(op, op.read.expires) + return .Pending + } + } + + assert(uintptr(read) == uintptr(op._impl.over.InternalHigh)) + return .Done +} + +@(require_results) +read_callback :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Read) + + if op.read.err != nil { + return .Done + } + + n, err := get_result(op._impl.over) + #partial switch err { + case .SUCCESS: + case .OPERATION_ABORTED: + // This error could also happen when the user calls close on the handle. + if check_timed_out(op, op.read.expires) { + op.read.err = .Timeout + return .Done + } + fallthrough + case .HANDLE_EOF: + if op.read.read == 0 { + op.read.err = .EOF + return .Done + } + case: + op.read.err = FS_Error(err) + return .Done + } + + op.read.read += n + if op.read.all && op.read.read < len(op.read.buf) { + switch read_exec(op) { + case .Done: return read_callback(op) + case .Pending: return .Pending + } + } + + return .Done +} + +@(require_results) +write_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Write) + op._impl.over = {} // Can be called multiple times. + + op._impl.over.OffsetFull = u64(op.write.offset) + u64(op.write.written) + + to_write := op.write.buf[op.write.written:] + + written: win.DWORD + if !win.WriteFile( + win.HANDLE(op.write.handle), + raw_data(to_write), + win.DWORD(min(len(to_write), MAX_RW)), + &written, + &op._impl.over, + ) { + assert(written == 0) + if op._impl.over.Internal == nil { + op.write.err = FS_Error(win.GetLastError()) + } else if is_pending(op._impl.over) { + link_timeout(op, op.write.expires) + return .Pending + } + } + + assert(uintptr(written) == uintptr(op._impl.over.InternalHigh)) + return .Done +} + +@(require_results) +write_callback :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Write) + + if op.write.err != nil { + return .Done + } + + n, err := get_result(op._impl.over) + #partial switch err { + case .SUCCESS: + case .OPERATION_ABORTED: + // This error could also happen when the user calls close on the handle. + if check_timed_out(op, op.write.expires) { + op.write.err = .Timeout + return .Done + } + fallthrough + case: + op.write.err = FS_Error(err) + return .Done + } + + op.write.written += n + if op.write.all && op.write.written < len(op.write.buf) { + switch write_exec(op) { + case .Done: return write_callback(op) + case .Pending: return .Pending + } + } + + return .Done +} + +@(require_results) +recv_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Recv) + op._impl.over = {} // Can be called multiple times. + + if op.recv.err != nil { + return .Done + } + + bufs := slice.advance_slices(op.recv.bufs, op.recv.received) + bufs, _ = constraint_bufs_to_max_rw(op.recv.bufs) + + win_bufs := ([^]win.WSABUF)(intrinsics.alloca(size_of(win.WSABUF) * len(bufs), align_of(win.WSABUF))) + for buf, i in bufs { + assert(i64(len(buf)) < i64(max(u32))) + win_bufs[i] = {len=u32(len(buf)), buf=raw_data(buf)} + } + + status: win.c_int + switch sock in op.recv.socket { + case TCP_Socket: + status = win.WSARecv( + win.SOCKET(sock), + win_bufs, + u32(len(bufs)), + nil, + &op.recv._impl.flags, + win.LPWSAOVERLAPPED(&op._impl.over), + nil, + ) + case UDP_Socket: + op.recv._impl.source_len = size_of(op.recv._impl.source) + status = win.WSARecvFrom( + win.SOCKET(sock), + win_bufs, + u32(len(bufs)), + nil, + &op.recv._impl.flags, + (^win.sockaddr)(&op.recv._impl.source), + &op.recv._impl.source_len, + win.LPWSAOVERLAPPED(&op._impl.over), + nil, + ) + } + + if status == win.SOCKET_ERROR { + if op._impl.over.Internal == nil { + switch _ in op.recv.socket { + case TCP_Socket: op.recv.err = net._tcp_recv_error() + case UDP_Socket: op.recv.err = net._udp_recv_error() + } + } else if is_pending(op._impl.over) { + link_timeout(op, op.recv.expires) + return .Pending + } + } + + return .Done +} + +@(require_results) +recv_callback :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Recv) + + if op.recv.err != nil { + return .Done + } + + n, err := get_result(op._impl.over) + #partial switch err { + case .SUCCESS: + case .OPERATION_ABORTED: + // This error could also happen when the user calls close on the socket. + if check_timed_out(op, op.recv.expires) { + switch _ in op.recv.socket { + case TCP_Socket: op.recv.err = net.TCP_Recv_Error.Timeout + case UDP_Socket: op.recv.err = net.UDP_Recv_Error.Timeout + } + return .Done + } + fallthrough + case: + win.SetLastError(win.DWORD(err)) + switch _ in op.recv.socket { + case TCP_Socket: op.recv.err = net._tcp_recv_error() + case UDP_Socket: op.recv.err = net._udp_recv_error() + } + return .Done + } + + op.recv.received += n + + switch sock in op.recv.socket { + case TCP_Socket: + if n == 0 { + // Connection closed. + return .Done + } + + if op.recv.all { + total: int + for buf in op.recv.bufs { + total += len(buf) + } + + if op.recv.received < total { + switch recv_exec(op) { + case .Done: return recv_callback(op) + case .Pending: return .Pending + } + } + } + + case UDP_Socket: + assert(op.recv._impl.source_len > 0) + op.recv.source = sockaddr_to_endpoint(&op.recv._impl.source) + } + + return .Done +} + +@(require_results) +send_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Send) + op._impl.over = {} // Can be called multiple times. + + if op.send.err != nil { + return .Done + } + + bufs := slice.advance_slices(op.send.bufs, op.send.sent) + bufs, _ = constraint_bufs_to_max_rw(op.send.bufs) + + win_bufs := ([^]win.WSABUF)(intrinsics.alloca(size_of(win.WSABUF) * len(bufs), align_of(win.WSABUF))) + for buf, i in bufs { + assert(i64(len(buf)) < i64(max(u32))) + win_bufs[i] = {len=u32(len(buf)), buf=raw_data(buf)} + } + + status: win.c_int + switch sock in op.send.socket { + case TCP_Socket: + status = win.WSASend( + win.SOCKET(sock), + win_bufs, + u32(len(bufs)), + nil, + 0, + win.LPWSAOVERLAPPED(&op._impl.over), + nil, + ) + case UDP_Socket: + addr := endpoint_to_sockaddr(op.send.endpoint) + status = win.WSASendTo( + win.SOCKET(sock), + win_bufs, + u32(len(bufs)), + nil, + 0, + (^win.sockaddr)(&addr), + size_of(addr), + win.LPWSAOVERLAPPED(&op._impl.over), + nil, + ) + } + + if status == win.SOCKET_ERROR { + if op._impl.over.Internal == nil { + switch _ in op.send.socket { + case TCP_Socket: op.send.err = net._tcp_send_error() + case UDP_Socket: op.send.err = net._udp_send_error() + } + } else if is_pending(op._impl.over) { + link_timeout(op, op.send.expires) + return .Pending + } + } + + return .Done +} + +@(require_results) +send_callback :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Send) + + if op.send.err != nil { + return .Done + } + + n, err := get_result(op._impl.over) + #partial switch err { + case .SUCCESS: + case .OPERATION_ABORTED: + // This error could also happen when the user calls close on the socket. + if check_timed_out(op, op.send.expires) { + switch _ in op.send.socket { + case TCP_Socket: op.send.err = net.TCP_Send_Error.Timeout + case UDP_Socket: op.send.err = net.UDP_Send_Error.Timeout + } + return .Done + } + fallthrough + case: + win.SetLastError(win.DWORD(err)) + switch _ in op.send.socket { + case TCP_Socket: op.send.err = net._tcp_send_error() + case UDP_Socket: op.send.err = net._udp_send_error() + } + return .Done + } + + op.send.sent += n + + if op.send.all { + total: int + for buf in op.send.bufs { + total += len(buf) + } + + if op.send.sent < total { + switch send_exec(op) { + case .Done: return send_callback(op) + case .Pending: return .Pending + } + } + } + + return .Done +} + +@(require_results) +sendfile_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Send_File) + op._impl.over = {} // Can be called multiple times. + + if op.sendfile.nbytes == SEND_ENTIRE_FILE { + type, size, stat_err := stat(op.sendfile.file) + if stat_err != nil { + op.sendfile.err = stat_err + return .Done + } + + op.sendfile.nbytes = int(size - i64(op.sendfile.offset)) + if type != .Regular || op.sendfile.nbytes <= 0 { + op.sendfile.err = FS_Error.Invalid_Argument + return .Done + } + } + + op._impl.over.OffsetFull = u64(op.sendfile.offset) + u64(op.sendfile.sent) + + if !win.TransmitFile( + win.SOCKET(op.sendfile.socket), + win.HANDLE(op.sendfile.file), + u32(min(op.sendfile.nbytes - op.sendfile.sent, MAX_RW)), + 0, + &op._impl.over, + nil, + 0, + ) { + if op._impl.over.Internal == nil { + op.sendfile.err = net._tcp_send_error() + } else if is_pending(op._impl.over) { + link_timeout(op, op.sendfile.expires) + return .Pending + } + } + + return .Done +} + +@(require_results) +sendfile_callback :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Send_File) + + if op.sendfile.err != nil { + return .Done + } + + n, err := get_result(op._impl.over) + #partial switch err { + case .SUCCESS: + case .OPERATION_ABORTED: + // This error could also happen when the user calls close on the socket. + if check_timed_out(op, op.sendfile.expires) { + op.sendfile.err = TCP_Send_Error.Timeout + return .Done + } + fallthrough + case: + win.SetLastError(win.DWORD(err)) + op.sendfile.err = net._tcp_send_error() + return .Done + } + + op.sendfile.sent += n + if op.sendfile.sent < op.sendfile.nbytes { + switch sendfile_exec(op) { + case .Done: + return sendfile_callback(op) + case .Pending: + if op.sendfile.progress_updates { op.cb(op) } + return .Pending + } + } + + return .Done +} + +@(require_results) +poll_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Poll) + + events: i32 = win.FD_CLOSE + switch op.poll.event { + case .Send: events |= win.FD_WRITE|win.FD_CONNECT + case .Receive: events |= win.FD_READ|win.FD_ACCEPT + case: + op.poll.result = .Invalid_Argument + return .Done + } + + op._impl.over.hEvent = win.WSACreateEvent() + if win.WSAEventSelect( + win.SOCKET(net.any_socket_to_socket(op.poll.socket)), + op._impl.over.hEvent, + events, + ) != 0 { + #partial switch win.System_Error(win.GetLastError()) { + case .WSAEINVAL, .WSAENOTSOCK: op.poll.result = .Invalid_Argument + case: op.poll.result = .Error + } + return .Done + } + + timeout := win.INFINITE + if op.poll.expires != {} { + diff := max(0, time.diff(op.l.now, op.poll.expires)) + timeout = win.DWORD(diff / time.Millisecond) + } + + ok := win.RegisterWaitForSingleObject( + &op.poll._impl.wait_handle, + op._impl.over.hEvent, + wait_callback, + op, + timeout, + win.WT_EXECUTEINWAITTHREAD|win.WT_EXECUTEONLYONCE, + ) + ensure(ok == true, "unexpected RegisterWaitForSingleObject error") + + return .Pending + + wait_callback :: proc "system" (lpParameter: win.PVOID, TimerOrWaitFired: win.BOOLEAN) { + op := (^Operation)(lpParameter) + assert_contextless(op.type == .Poll) + + if TimerOrWaitFired { + op.poll.result = .Timeout + } + + ok := win.PostQueuedCompletionStatus( + op.l.iocp, + 0, + 0, + &op._impl.over, + ) + ensure_contextless(ok == true, "unexpected PostQueuedCompletionStatus error") + } +} + +poll_callback :: proc(op: ^Operation) { + assert(op.type == .Poll) + + if op._impl.over.hEvent != nil { + win.WSACloseEvent(op._impl.over.hEvent) + } + + if op.poll._impl.wait_handle != nil { + win.UnregisterWaitEx(op.poll._impl.wait_handle, nil) + } + + if op.poll.result != nil { + return + } + + _, err := get_result(op._impl.over) + #partial switch err { + case .SUCCESS: + case: + op.poll.result = .Error + } +} + +open_exec :: proc(op: ^Operation) { + assert(op.type == .Open) + // No async way of doing this. + op.open.handle, op.open.err = _open_sync(op.l, op.open.path, op.open.dir, op.open.mode, op.open.perm) +} + +stat_exec :: proc(op: ^Operation) { + assert(op.type == .Stat) + // No async way of doing this. + op.stat.type, op.stat.size, op.stat.err = stat(op.stat.handle) +} + +@(require_results) +timeout_exec :: proc(op: ^Operation) -> Op_Result { + assert(op.type == .Timeout) + + if op.timeout.duration <= 0 { + return .Done + } else { + op.timeout._impl.expires = time.time_add(now(), op.timeout.duration) + node, inserted, alloc_err := avl.find_or_insert(&op.l.timeouts, op) + assert(alloc_err == nil) + assert(inserted) + assert(node != nil) + return .Pending + } +} + +link_timeout :: proc(op: ^Operation, expires: time.Time) { + if expires == {} { + return + } + + timeout_op := _prep(op.l, internal_timeout_callback, .Timeout) + timeout_op.timeout._impl.expires = expires + timeout_op.timeout._impl.target = op + op._impl.timeout = timeout_op + + node, inserted, alloc_err := avl.find_or_insert(&op.l.timeouts, timeout_op) + assert(alloc_err == nil) + assert(inserted) + assert(node != nil) +} + +internal_timeout_callback :: proc(op: ^Operation) { + assert(op.type == .Timeout) + + target := op.timeout._impl.target + assert(target != nil) + assert(target._impl.timeout == op) + target._impl.timeout = nil + + #partial switch target.type { + case .Poll: + target.poll.result = .Timeout + target.cb(target) + _remove(target) + return + } + + if is_pending(target._impl.over) { + handle := operation_handle(target) + assert(handle != win.INVALID_HANDLE) + ok := win.CancelIoEx(handle, &target._impl.over) + if !ok { + err := win.System_Error(win.GetLastError()) + #partial switch err { + case .NOT_FOUND: + debug("Timeout: Cancel", target.type, "NOT_FOUND") + case .INVALID_HANDLE: + debug("Timeout: Cancel", target.type, "INVALID_HANDLE") + case: + assert(false, "unexpected CancelIoEx error") + } + } + } +} + +stat :: proc(handle: Handle) -> (type: File_Type, size: i64, err: FS_Error) { + info: win.FILE_STANDARD_INFO + if !win.GetFileInformationByHandleEx(win.HANDLE(handle), .FileStandardInfo, &info, size_of(info)) { + err = FS_Error(win.GetLastError()) + return + } + + size = i64(info.EndOfFile) + + if info.Directory { + type = .Directory + return + } + + switch win.GetFileType(win.HANDLE(handle)) { + case win.FILE_TYPE_PIPE: + type = .Pipe_Or_Socket + return + case win.FILE_TYPE_CHAR: + type = .Device + return + case win.FILE_TYPE_DISK: + type = .Regular + // Don't return, might be a symlink. + case: + type = .Undetermined + return + } + + + tag_info: win.FILE_ATTRIBUTE_TAG_INFO + if !win.GetFileInformationByHandleEx(win.HANDLE(handle), .FileAttributeTagInfo, &tag_info, size_of(tag_info)) { + return + } + + if ( + (tag_info.FileAttributes & win.FILE_ATTRIBUTE_REPARSE_POINT != 0) && + ( + (tag_info.ReparseTag == win.IO_REPARSE_TAG_SYMLINK) || + (tag_info.ReparseTag == win.IO_REPARSE_TAG_MOUNT_POINT) + ) + ) { + type = .Symlink + } + + return +} + +STATUS_PENDING :: rawptr(uintptr(0x103)) + +is_pending :: proc(over: win.OVERLAPPED) -> bool { + return over.Internal == STATUS_PENDING +} + +is_fresh :: proc(over: win.OVERLAPPED) -> bool { + return over.Internal == nil && over.InternalHigh == nil +} + +get_result :: proc(over: win.OVERLAPPED) -> (n: int, err: win.System_Error) { + assert(!is_pending(over)) + + n = int(uintptr(over.InternalHigh)) + + if over.Internal != nil { + err = win.System_Error(win.RtlNtStatusToDosError(win.NTSTATUS(uintptr(over.Internal)))) + assert(!is_incomplete(err)) + } + return +} + +is_incomplete :: proc(err: win.System_Error) -> bool { + #partial switch err { + case .WSAEWOULDBLOCK, .IO_PENDING, .IO_INCOMPLETE, .WSAEALREADY: return true + case: return false + } +} + +endpoint_to_sockaddr :: proc(ep: Endpoint) -> (sockaddr: win.SOCKADDR_STORAGE_LH) { + switch a in ep.address { + case IP4_Address: + (^win.sockaddr_in)(&sockaddr)^ = win.sockaddr_in { + sin_port = u16be(win.USHORT(ep.port)), + sin_addr = transmute(win.in_addr)a, + sin_family = u16(win.AF_INET), + } + return + case IP6_Address: + (^win.sockaddr_in6)(&sockaddr)^ = win.sockaddr_in6 { + sin6_port = u16be(win.USHORT(ep.port)), + sin6_addr = transmute(win.in6_addr)a, + sin6_family = u16(win.AF_INET6), + } + return + } + unreachable() +} + +sockaddr_to_endpoint :: proc(native_addr: ^win.SOCKADDR_STORAGE_LH) -> (ep: Endpoint) { + switch native_addr.ss_family { + case u16(win.AF_INET): + addr := cast(^win.sockaddr_in)native_addr + port := int(addr.sin_port) + ep = Endpoint { + address = IP4_Address(transmute([4]byte)addr.sin_addr), + port = port, + } + case u16(win.AF_INET6): + addr := cast(^win.sockaddr_in6)native_addr + port := int(addr.sin6_port) + ep = Endpoint { + address = IP6_Address(transmute([8]u16be)addr.sin6_addr), + port = port, + } + case: + panic("native_addr is neither IP4 or IP6 address") + } + return +} + +load_socket_fn :: proc(subject: win.SOCKET, guid: win.GUID, fn: ^$T) { + over: win.OVERLAPPED + + guid := guid + bytes: u32 + rc := win.WSAIoctl( + subject, + win.SIO_GET_EXTENSION_FUNCTION_POINTER, + &guid, + size_of(guid), + fn, + size_of(fn), + &bytes, + // NOTE: I don't think loading a socket fn ever blocks, + // but I would like to hit an assert if it does, so we do pass it. + &over, + nil, + ) + assert(rc != win.SOCKET_ERROR) + assert(bytes == size_of(fn^)) +} + +check_timed_out :: proc(op: ^Operation, expires: time.Time) -> bool { + return expires != {} && time.diff(op.l.now, expires) <= 0 +} diff --git a/core/nbio/nbio.odin b/core/nbio/nbio.odin new file mode 100644 index 000000000..16664ea9f --- /dev/null +++ b/core/nbio/nbio.odin @@ -0,0 +1,435 @@ +package nbio + +import "base:intrinsics" + +import "core:container/pool" +import "core:container/queue" +import "core:net" +import "core:sync" +import "core:time" + +/* +If the package is fully supported on the current target. If it is not it will compile but work +in a matter where things are unimplemented. + +Additionally if it is `FULLY_SUPPORTED` it may still return `.Unsupported` in `acquire_thread_event_loop` +If the target does not support the needed syscalls for operating the package. +*/ +FULLY_SUPPORTED :: _FULLY_SUPPORTED + +/* +An event loop, one per thread, consider the fields private. +Do not copy. +*/ +Event_Loop :: struct /* #no_copy */ { + using impl: _Event_Loop, + err: General_Error, + refs: int, + now: time.Time, + + // Queue that is used to queue operations from another thread to be executed on this thread. + // TODO: Better data-structure. + queue: queue.Queue(^Operation), + queue_mu: sync.Mutex, + + operation_pool: pool.Pool(Operation), +} + +Handle :: _Handle + +// The maximum size of user arguments for an operation, can be increased at the cost of more RAM. +MAX_USER_ARGUMENTS :: #config(NBIO_MAX_USER_ARGUMENTS, 4) +#assert(MAX_USER_ARGUMENTS >= 4) + +Operation :: struct { + _impl: _Operation `fmt:"-"`, + using _: struct #raw_union { + _pool_link: ^Operation, + l: ^Event_Loop, + }, + cb: Callback, + using _specifics: Specifics, + user_data: [MAX_USER_ARGUMENTS + 1]rawptr, + type: Operation_Type, + detached: bool, +} + +Specifics :: struct #raw_union { + accept: Accept `raw_union_tag:"type=.Accept"`, + close: Close `raw_union_tag:"type=.Close"`, + dial: Dial `raw_union_tag:"type=.Dial"`, + read: Read `raw_union_tag:"type=.Read"`, + recv: Recv `raw_union_tag:"type=.Recv"`, + send: Send `raw_union_tag:"type=.Send"`, + write: Write `raw_union_tag:"type=.Write"`, + timeout: Timeout `raw_union_tag:"type=.Timeout"`, + poll: Poll `raw_union_tag:"type=.Poll"`, + sendfile: Send_File `raw_union_tag:"type=.Send_File"`, + open: Open `raw_union_tag:"type=.Open"`, + stat: Stat `raw_union_tag:"type=.Stat"`, + + _remove: _Remove `raw_union_tag:"type=._Remove"`, + _link_timeout: _Link_Timeout `raw_union_tag:"type=._Link_Timeout"`, + _splice: _Splice `raw_union_tag:"type=._Splice"`, +} + +Operation_Type :: enum i32 { + None, + Accept, + Close, + Dial, + Read, + Recv, + Send, + Write, + Timeout, + Poll, + Send_File, + Open, + Stat, + + _Link_Timeout, + _Remove, + _Splice, +} + +Callback :: #type proc(op: ^Operation) + +/* +Initialize or increment the reference counted event loop for the current thread. +*/ +acquire_thread_event_loop :: proc() -> General_Error { + return _acquire_thread_event_loop() +} + +/* +Destroy or decrease the reference counted event loop for the current thread. +*/ +release_thread_event_loop :: proc() { + _release_thread_event_loop() +} + +current_thread_event_loop :: proc(loc := #caller_location) -> ^Event_Loop { + return _current_thread_event_loop(loc) +} + +/* +Each time you call this the implementation checks its state +and calls any callbacks which are ready. You would typically call this in a loop. + +Blocks for up-to timeout waiting for events if there is nothing to do. +*/ +tick :: proc(timeout: time.Duration = NO_TIMEOUT) -> General_Error { + l := &_tls_event_loop + if l.refs == 0 { return nil } + return _tick(l, timeout) +} + +/* +Runs the event loop by ticking in a loop until there is no more work to be done. +*/ +run :: proc() -> General_Error { + l := &_tls_event_loop + if l.refs == 0 { return nil } + + acquire_thread_event_loop() + defer release_thread_event_loop() + + for num_waiting() > 0 { + if errno := _tick(l, NO_TIMEOUT); errno != nil { + return errno + } + } + return nil +} + +/* +Runs the event loop by ticking in a loop until there is no more work to be done, or the flag `done` is `true`. +*/ +run_until :: proc(done: ^bool) -> General_Error { + l := &_tls_event_loop + if l.refs == 0 { return nil } + + acquire_thread_event_loop() + defer release_thread_event_loop() + + for num_waiting() > 0 && !intrinsics.volatile_load(done) { + if errno := _tick(l, NO_TIMEOUT); errno != nil { + return errno + } + } + return nil +} + +/* +Returns the number of in-progress operations to be completed on the event loop. +*/ +num_waiting :: proc(l: Maybe(^Event_Loop) = nil) -> int { + l_ := l.? or_else &_tls_event_loop + if l_.refs == 0 { return 0 } + return pool.num_outstanding(&l_.operation_pool) +} + +/* +Returns the current time (cached at most at the beginning of the current tick). +*/ +now :: proc() -> time.Time { + if _tls_event_loop.now == {} { + return time.now() + } + return _tls_event_loop.now +} + +/* +Remove the given operation from the event loop. The callback of it won't be called and resources are freed. + +Calling `remove`: +- Cancels the operation if it has not yet completed +- Prevents the callback from being called + +Cancellation via `remove` is *final* and silent: +- The callback will never be invoked +- No error is delivered +- The operation must be considered dead after removal + +WARN: the operation could have already been (partially or completely) completed. + A send with `all` set to true could have sent a portion already. + But also, a send that could be completed without blocking could have been completed. + You just won't get a callback. + +WARN: once an operation's callback is called it can not be removed anymore (use after free). + +WARN: needs to be called from the thread of the event loop the target belongs to. + +Common use would be to cancel a timeout, remove a polling, or remove an `accept` before calling `close` on it's socket. +*/ +remove :: proc(target: ^Operation) { + if target == nil { + return + } + + assert(target.type != .None) + + if target.l != &_tls_event_loop { + panic("nbio.remove called on different thread") + } + + _remove(target) +} + +/* +Creates a socket for use in `nbio` and relates it to the given event loop. + +Inputs: +- family: Should this be an IP4 or IP6 socket +- protocol: The type of socket (TCP or UDP) +- l: The event loop to associate it with, defaults to the current thread's loop + +Returns: +- socket: The created socket, consider `create_{udp|tcp}_socket` for a typed socket instead of the union +- err: A network error (`Create_Socket_Error`, or `Set_Blocking_Error`) which happened while opening +*/ +create_socket :: proc( + family: Address_Family, + protocol: Socket_Protocol, + l: ^Event_Loop = nil, + loc := #caller_location, +) -> ( + socket: Any_Socket, + err: Create_Socket_Error, +) { + return _create_socket(l if l != nil else _current_thread_event_loop(loc), family, protocol) +} + +/* +Creates a UDP socket for use in `nbio` and relates it to the given event loop. + +Inputs: +- family: Should this be an IP4 or IP6 socket +- l: The event loop to associate it with, defaults to the current thread's loop + +Returns: +- socket: The created UDP socket +- err: A network error (`Create_Socket_Error`, or `Set_Blocking_Error`) which happened while opening +*/ +create_udp_socket :: proc(family: Address_Family, l: ^Event_Loop = nil, loc := #caller_location) -> (net.UDP_Socket, Create_Socket_Error) { + socket, err := create_socket(family, .UDP, l, loc) + if err != nil { + return -1, err + } + + return socket.(UDP_Socket), nil +} + +/* +Creates a TCP socket for use in `nbio` and relates it to the given event loop. + +Inputs: +- family: Should this be an IP4 or IP6 socket +- l: The event loop to associate it with, defaults to the current thread's loop + +Returns: +- socket: The created TCP socket +- err: A network error (`Create_Socket_Error`, or `Set_Blocking_Error`) which happened while opening +*/ +create_tcp_socket :: proc(family: Address_Family, l: ^Event_Loop = nil, loc := #caller_location) -> (net.TCP_Socket, Create_Socket_Error) { + socket, err := create_socket(family, .TCP, l, loc) + if err != nil { + return -1, err + } + + return socket.(TCP_Socket), nil +} + +/* +Creates a socket, sets non blocking mode, relates it to the given IO, binds the socket to the given endpoint and starts listening. + +Inputs: +- endpoint: Where to bind the socket to +- backlog: The maximum length to which the queue of pending connections may grow, before refusing connections +- l: The event loop to associate the socket with, defaults to the current thread's loop + +Returns: +- socket: The opened, bound and listening socket +- err: A network error (`Create_Socket_Error`, `Bind_Error`, or `Listen_Error`) that has happened +*/ +listen_tcp :: proc(endpoint: Endpoint, backlog := 1000, l: ^Event_Loop = nil, loc := #caller_location) -> (socket: TCP_Socket, err: net.Network_Error) { + assert(backlog > 0 && backlog < int(max(i32))) + return _listen_tcp(l if l != nil else _current_thread_event_loop(loc), endpoint, backlog) +} + +/* +Opens a file and associates it with the event loop. + +Inputs: +- path: path to the file, if not absolute: relative from `dir` +- dir: directory that `path` is relative from (if it is relative), defaults to the current working directory +- mode: open mode, defaults to read-only +- perm: permissions to use when creating a file, defaults to read+write for everybody +- l: event loop to associate the file with, defaults to the current thread's + +Returns: +- handle: The file handle +- err: An error if it occurred +*/ +open_sync :: proc(path: string, dir: Handle = CWD, mode: File_Flags = {.Read}, perm := Permissions_Default_File, l: ^Event_Loop = nil, loc := #caller_location) -> (handle: Handle, err: FS_Error) { + return _open_sync(l if l != nil else _current_thread_event_loop(loc), path, dir, mode, perm) +} + +Association_Error :: enum { + None, + // The given file/handle/socket was not opened in a mode that it can be made non-blocking afterwards. + // + // On Windows, this can happen when a file is not opened with the `FILE_FLAG_OVERLAPPED` flag. + // If using `core:os`, that is set when you specify the `O_NONBLOCK` flag. + // There is no way to add that after the fact. + Not_Possible_To_Associate, + // The given handle is not a valid handle. + Invalid_Handle, + // No network connection, or the network stack is not initialized. + Network_Unreachable, +} + +/* +Associate the given OS handle, not opened through this package, with the event loop. + +Consider using this package's `open` or `open_sync` directly instead. + +The handle returned is for convenience, it is actually still the same handle as given. +Thus you should not close the given handle. + +On Windows, this can error when a file is not opened with the `FILE_FLAG_OVERLAPPED` flag. +If using `core:os`, that is set when you specify the `O_NONBLOCK` flag. +There is no way to add that after the fact. +*/ +associate_handle :: proc(handle: uintptr, l: ^Event_Loop = nil, loc := #caller_location) -> (Handle, Association_Error) { + return _associate_handle(handle, l if l != nil else _current_thread_event_loop(loc)) +} + +/* +Associate the given socket, not created through this package, with the event loop. + +Consider using this package's `create_socket` directly instead. +*/ +associate_socket :: proc(socket: Any_Socket, l: ^Event_Loop = nil, loc := #caller_location) -> Association_Error { + return _associate_socket(socket, l if l != nil else _current_thread_event_loop(loc)) +} + +Read_Entire_File_Error :: struct { + operation: Operation_Type, + value: FS_Error, +} + +Read_Entire_File_Callback :: #type proc(user_data: rawptr, data: []byte, err: Read_Entire_File_Error) + +/* +Combines multiple operations (open, stat, read, close) into one that reads an entire regular file. + +The error contains the `operation` that the error happened on. + +Inputs: +- path: path to the file, if not absolute: relative from `dir` +- user_data: a pointer passed through into the callback +- cb: the callback to call once completed, called with the user data, file data, and an optional error +- allocator: the allocator to allocate the file's contents onto +- dir: directory that `path` is relative from (if it is relative), defaults to the current working directory +- l: event loop to execute the operation on +*/ +read_entire_file :: proc(path: string, user_data: rawptr, cb: Read_Entire_File_Callback, allocator := context.allocator, dir := CWD, l: ^Event_Loop = nil, loc := #caller_location) { + _read_entire_file(l if l != nil else _current_thread_event_loop(loc), path, user_data, cb, allocator, dir) +} + +/* +Detach an operation from the package's lifetime management. + +By default the operation's lifetime is managed by the package and freed after a callback is called. +Calling this function detaches the operation from this lifetime. +You are expected to call `reattach` to give the package back this operation. +*/ +detach :: proc(op: ^Operation) { + op.detached = true +} + +/* +Reattach an operation to the package's lifetime management. +*/ +reattach :: proc(op: ^Operation) { + pool.put(&op.l.operation_pool, op) +} + +/* +Execute an operation. + +If the operation is attached to another thread's event loop, it is queued to be executed on that event loop, +optionally waking that loop up (from a blocking `tick`) with `trigger_wake_up`. +*/ +exec :: proc(op: ^Operation, trigger_wake_up := true) { + if op.l == &_tls_event_loop { + _exec(op) + } else { + { + // TODO: Better data-structure. + sync.guard(&op.l.queue_mu) + _, err := queue.push_back(&op.l.queue, op) + if err != nil { + panic("exec: queueing operation failed due to memory allocation failure") + } + } + if trigger_wake_up { + wake_up(op.l) + } + } +} + +/* +Wake up an event loop on another thread which may be blocking for completed operations. + +Commonly used with `exec` from a worker thread to have the event loop pick up that work. +Note that by default `exec` already calls this procedure. +*/ +wake_up :: proc(l: ^Event_Loop) { + if l == &_tls_event_loop { + return + } + _wake_up(l) +} diff --git a/core/nbio/net.odin b/core/nbio/net.odin new file mode 100644 index 000000000..d584639a7 --- /dev/null +++ b/core/nbio/net.odin @@ -0,0 +1,39 @@ +package nbio + +import "core:net" + +Network_Error :: net.Network_Error +Accept_Error :: net.Accept_Error +Dial_Error :: net.Dial_Error +Send_Error :: net.Send_Error +TCP_Send_Error :: net.TCP_Send_Error +UDP_Send_Error :: net.UDP_Send_Error +Recv_Error :: net.Recv_Error +TCP_Recv_Error :: net.TCP_Recv_Error +UDP_Recv_Error :: net.UDP_Recv_Error +Listen_Error :: net.Listen_Error +Create_Socket_Error :: net.Create_Socket_Error + +Address_Family :: net.Address_Family +Socket_Protocol :: net.Socket_Protocol + +Address :: net.Address +IP4_Address :: net.IP4_Address +IP6_Address :: net.IP6_Address + +Endpoint :: net.Endpoint + +TCP_Socket :: net.TCP_Socket +UDP_Socket :: net.UDP_Socket +Any_Socket :: net.Any_Socket + +IP4_Any :: net.IP4_Any +IP6_Any :: net.IP6_Any +IP4_Loopback :: net.IP4_Loopback +IP6_Loopback :: net.IP6_Loopback + +family_from_endpoint :: net.family_from_endpoint +bind :: net.bind +bound_endpoint :: net.bound_endpoint +parse_endpoint :: net.parse_endpoint +endpoint_to_string :: net.endpoint_to_string diff --git a/core/nbio/ops.odin b/core/nbio/ops.odin new file mode 100644 index 000000000..e028c4a76 --- /dev/null +++ b/core/nbio/ops.odin @@ -0,0 +1,2473 @@ +package nbio + +import "base:intrinsics" + +import "core:container/pool" +import "core:time" +import "core:slice" +import "core:mem" + +NO_TIMEOUT: time.Duration: -1 + +Accept :: struct { + // Socket to accept an incoming connection on. + socket: TCP_Socket, + // When this operation expires and should be timed out. + expires: time.Time, + + // The connection that was accepted. + client: TCP_Socket, + // The connection's remote origin. + client_endpoint: Endpoint, + // An error, if it occurred. + err: Accept_Error, + + // Implementation specifics, private. + _impl: _Accept `fmt:"-"`, +} + +/* +Retrieves and preps an operation to do an accept without executing it. + +Executing can then be done with the `exec` procedure. + +The timeout is calculated from the time when this procedure was called, not from when it's executed. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- socket: A bound and listening socket *associated with the event loop* +- cb: The callback to be called when the operation finishes, `Operation.accept` will contain results +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_accept :: #force_inline proc( + socket: TCP_Socket, + cb: Callback, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + op := _prep(l, cb, .Accept) + op.accept.socket = socket + if timeout > 0 { + op.accept.expires = time.time_add(now(), timeout) + } + return op +} + +/* +Using the given socket, accepts the next incoming connection, calling the callback when that happens. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `accept_poly`, `accept_poly2`, and `accept_poly3`. + +Inputs: +- socket: A bound and listening socket *associated with the event loop* +- cb: The callback to be called when the operation finishes, `Operation.accept` will contain results +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +accept :: #force_inline proc( + socket: TCP_Socket, + cb: Callback, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + res := prep_accept(socket, cb, timeout, l) + exec(res) + return res +} + +/* +Using the given socket, accepts the next incoming connection, calling the callback when that happens. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: A bound and listening socket *associated with the event loop* +- p: User data, the callback will receive this as it's second argument +- cb: The callback to be called when the operation finishes, `Operation.accept` will contain results +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +accept_poly :: #force_inline proc( + socket: TCP_Socket, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil +) -> ^Operation where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_accept(socket, _poly_cb(C, T), timeout, l) + _put_user_data(op, cb, p) + exec(op) + return op +} + +/* +Using the given socket, accepts the next incoming connection, calling the callback when that happens. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: A bound and listening socket *associated with the event loop* +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- cb: The callback to be called when the operation finishes, `Operation.accept` will contain results +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +accept_poly2 :: #force_inline proc( + socket: TCP_Socket, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_accept(socket, _poly_cb2(C, T, T2), timeout, l) + _put_user_data2(op, cb, p, p2) + exec(op) + return op +} + +/* +Using the given socket, accepts the next incoming connection, calling the callback when that happens. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: A bound and listening socket *associated with the event loop* +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- p3: User data, the callback will receive this as it's fourth argument +- cb: The callback to be called when the operation finishes, `Operation.accept` will contain results +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +accept_poly3 :: #force_inline proc( + socket: TCP_Socket, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_accept(socket, _poly_cb3(C, T, T2, T3), timeout, l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + return op +} + +/* +A union of closable types that can be passed to `close`. +*/ +Closable :: union { + TCP_Socket, + UDP_Socket, + Handle, +} + +Close :: struct { + // The subject to close. + subject: Closable, + + // An error, if it occurred. + err: FS_Error, + + // Implementation specifics, private. + _impl: _Close `fmt:"-"`, +} + +@(private) +empty_callback :: proc(_: ^Operation) {} + +/* +Retrieves and preps an operation to do a close without executing it. + +Executing can then be done with the `exec` procedure. + +Closing something that has IO in progress may or may not cancel it, and may or may not call the callback. +For consistent behavior first call `remove` on in progress IO. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- subject: The subject (socket or file) to close +- cb: The optional callback to be called when the operation finishes, `Operation.close` will contain results +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_close :: #force_inline proc(subject: Closable, cb: Callback = empty_callback, l: ^Event_Loop = nil) -> ^Operation { + op := _prep(l, cb, .Close) + op.close.subject = subject + return op +} + +/* +Closes the given subject (file or socket). + +Closing something that has IO in progress may or may not cancel it, and may or may not call the callback. +For consistent behavior first call `remove` on in progress IO. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `close_poly`, `close_poly2`, and `close_poly3`. + +Inputs: +- subject: The subject (socket or file) to close +- cb: The optional callback to be called when the operation finishes, `Operation.close` will contain results +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +close :: #force_inline proc(subject: Closable, cb: Callback = empty_callback, l: ^Event_Loop = nil) -> ^Operation { + op := prep_close(subject, cb, l) + exec(op) + return op +} + +/* +Closes the given subject (file or socket). + +Closing something that has IO in progress may or may not cancel it, and may or may not call the callback. +For consistent behavior first call `remove` on in progress IO. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- subject: The subject (socket or file) to close +- p: User data, the callback will receive this as it's second argument +- cb: The optional callback to be called when the operation finishes, `Operation.close` will contain results +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +close_poly :: #force_inline proc(subject: Closable, p: $T, cb: $C/proc(op: ^Operation, p: T), l: ^Event_Loop = nil) -> ^Operation +where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_close(subject, _poly_cb(C, T), l) + _put_user_data(op, cb, p) + exec(op) + return op +} + +/* +Closes the given subject (file or socket). + +Closing something that has IO in progress may or may not cancel it, and may or may not call the callback. +For consistent behavior first call `remove` on in progress IO. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- subject: The subject (socket or file) to close +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- cb: The optional callback to be called when the operation finishes, `Operation.close` will contain results +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +close_poly2 :: #force_inline proc(subject: Closable, p: $T, p2: $T2, cb: $C/proc(op: ^Operation, p: T, p2: T2), l: ^Event_Loop = nil) -> ^Operation +where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_close(subject, _poly_cb2(C, T, T2), l) + _put_user_data2(op, cb, p, p2) + exec(op) + return op +} + +/* +Closes the given subject (file or socket). + +Closing something that has IO in progress may or may not cancel it, and may or may not call the callback. +For consistent behavior first call `remove` on in progress IO. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- subject: The subject (socket or file) to close +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- p3: User data, the callback will receive this as it's fourth argument +- cb: The optional callback to be called when the operation finishes, `Operation.close` will contain results +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +close_poly3 :: #force_inline proc(subject: Closable, p: $T, p2: $T2, p3: $T3, cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), l: ^Event_Loop = nil) -> ^Operation +where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_close(subject, _poly_cb3(C, T, T2, T3), l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + return op +} + +Dial :: struct { + // The endpoint to connect to. + endpoint: Endpoint, + // When this operation expires and should be timed out. + expires: time.Time, + + // Errors that can be returned: `Create_Socket_Error`, or `Dial_Error`. + err: Network_Error, + // The socket to communicate with the connected server. + socket: TCP_Socket, + + // Implementation specifics, private. + _impl: _Dial `fmt:"-"`, +} + +/* +Retrieves and preps an operation to do a dial operation without executing it. + +Executing can then be done with the `exec` procedure. + +The timeout is calculated from the time when this procedure was called, not from when it's executed. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- endpoint: The endpoint to connect to +- cb: The callback to be called when the operation finishes, `Operation.dial` will contain results +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_dial :: #force_inline proc( + endpoint: Endpoint, + cb: Callback, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + op := _prep(l, cb, .Dial) + if timeout > 0 { + op.dial.expires = time.time_add(now(), timeout) + } + op.dial.endpoint = endpoint + return op +} + +/* +Dials the given endpoint. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `dial_poly`, `dial_poly2`, and `dial_poly3`. + +Inputs: +- endpoint: The endpoint to connect to +- cb: The callback to be called when the operation finishes, `Operation.dial` will contain results +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +dial :: #force_inline proc( + endpoint: Endpoint, + cb: Callback, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + res := prep_dial(endpoint, cb, timeout, l) + exec(res) + return res +} + +/* +Dials the given endpoint. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- endpoint: The endpoint to connect to +- p: User data, the callback will receive this as it's second argument +- cb: The callback to be called when the operation finishes, `Operation.dial` will contain results +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +dial_poly :: #force_inline proc( + endpoint: Endpoint, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_dial(endpoint, _poly_cb(C, T), timeout, l) + _put_user_data(op, cb, p) + exec(op) + + return op +} + +/* +Dials the given endpoint. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- endpoint: The endpoint to connect to +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- cb: The callback to be called when the operation finishes, `Operation.dial` will contain results +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +dial_poly2 :: #force_inline proc( + endpoint: Endpoint, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_dial(endpoint, _poly_cb2(C, T, T2), timeout, l) + _put_user_data2(op, cb, p, p2) + exec(op) + + return op +} + +/* +Dials the given endpoint. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- endpoint: The endpoint to connect to +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- p3: User data, the callback will receive this as it's fourth argument +- cb: The callback to be called when the operation finishes, `Operation.dial` will contain results +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +dial_poly3 :: #force_inline proc( + endpoint: Endpoint, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_dial(endpoint, _poly_cb3(C, T, T2, T3), timeout, l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + + return op +} + +Recv :: struct { + // The socket to receive from. + socket: Any_Socket, + // The buffers to receive data into. + // The outer slice is copied internally, but the backing arrays must remain alive. + // It is safe to access `bufs` during the callback. + bufs: [][]byte, + // If true, the operation waits until all buffers are filled (TCP only). + all: bool, + // When this operation expires and should be timed out. + expires: time.Time, + + // The source endpoint data was received from (UDP only). + source: Endpoint, + + // An error, if it occurred. + // If `received == 0` and `err == nil`, the connection was closed by the peer. + err: Recv_Error, + // The number of bytes received. + received: int, + + // Implementation specifics, private. + _impl: _Recv `fmt:"-"`, +} + +/* +Retrieves and preps an operation to do a receive without executing it. + +Executing can then be done with the `exec` procedure. + +To avoid ambiguity between a closed connection and a 0-byte read, the provided buffers must have a total capacity greater than 0. + +The `bufs` slice itself is copied into the operation, so it can be temporary (e.g. on the stack), but the underlying memory of the buffers must remain valid until the callback is fired. + +The timeout is calculated from the time when this procedure was called, not from when it's executed. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- socket: The socket to receive from +- bufs: Buffers to fill with received data +- cb: The callback to be called when the operation finishes, `Operation.recv` will contain results +- all: If true, waits until all buffers are full before completing (TCP only, ignored for UDP) +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_recv :: #force_inline proc( + socket: Any_Socket, + bufs: [][]byte, + cb: Callback, + all := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + assert(socket != nil) + + // If we accepted `bufs` that total 0 it would be ambiguous if the result of `received == 0 && err == nil` means connection closed or received 0 bytes. + assert(len(bufs) > 0) + assert(slice.any_of_proc(bufs, proc(buf: []byte) -> bool { return len(buf) > 0 })) + + op := _prep(l, cb, .Recv) + op.recv.socket = socket + op.recv.bufs = bufs + op.recv.all = all + if timeout > 0 { + op.recv.expires = time.time_add(now(), timeout) + } + + if len(op.recv.bufs) == 1 { + op.recv._impl.small_bufs = {op.recv.bufs[0]} + op.recv.bufs = op.recv._impl.small_bufs[:] + } else { + err: mem.Allocator_Error + if op.recv.bufs, err = slice.clone(op.recv.bufs, op.l.allocator); err != nil { + switch _ in op.recv.socket { + case TCP_Socket: op.recv.err = TCP_Recv_Error.Insufficient_Resources + case UDP_Socket: op.recv.err = UDP_Recv_Error.Insufficient_Resources + case: unreachable() + } + } + } + + return op +} + +/* +Receives data from the socket. + +If the operation completes with 0 bytes received and no error, it indicates the connection was closed by the peer. + +The `bufs` slice itself is copied into the operation, so it can be temporary (e.g. on the stack), but the underlying memory of the buffers must remain valid until the callback is fired. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `recv_poly`, `recv_poly2`, and `recv_poly3`. + +Inputs: +- socket: The socket to receive from +- bufs: Buffers to fill with received data +- cb: The callback to be called when the operation finishes, `Operation.recv` will contain results +- all: If true, waits until all buffers are full before completing (TCP only, ignored for UDP) +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +recv :: #force_inline proc( + socket: Any_Socket, + bufs: [][]byte, + cb: Callback, + all := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil +) -> ^Operation { + op := prep_recv(socket, bufs, cb, all, timeout, l) + exec(op) + return op +} + +/* +Receives data from the socket. + +If the operation completes with 0 bytes received and no error, it indicates the connection was closed by the peer. + +The `bufs` slice itself is copied into the operation, so it can be temporary (e.g. on the stack), but the underlying memory of the buffers must remain valid until the callback is fired. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: The socket to receive from +- bufs: Buffers to fill with received data +- p: User data, the callback will receive this as it's second argument +- cb: The callback to be called when the operation finishes, `Operation.recv` will contain results +- all: If true, waits until all buffers are full before completing (TCP only, ignored for UDP) +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +recv_poly :: #force_inline proc( + socket: Any_Socket, + bufs: [][]byte, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + all := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_recv(socket, bufs, _poly_cb(C, T), all, timeout, l) + _put_user_data(op, cb, p) + exec(op) + + return op +} + +/* +Receives data from the socket. + +If the operation completes with 0 bytes received and no error, it indicates the connection was closed by the peer. + +The `bufs` slice itself is copied into the operation, so it can be temporary (e.g. on the stack), but the underlying memory of the buffers must remain valid until the callback is fired. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: The socket to receive from +- bufs: Buffers to fill with received data +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- cb: The callback to be called when the operation finishes, `Operation.recv` will contain results +- all: If true, waits until all buffers are full before completing (TCP only, ignored for UDP) +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +recv_poly2 :: #force_inline proc( + socket: Any_Socket, + bufs: [][]byte, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + all := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_recv(socket, bufs, _poly_cb2(C, T, T2), all, timeout, l) + _put_user_data2(op, cb, p, p2) + exec(op) + + return op +} + +/* +Receives data from the socket. + +If the operation completes with 0 bytes received and no error, it indicates the connection was closed by the peer. + +The `bufs` slice itself is copied into the operation, so it can be temporary (e.g. on the stack), but the underlying memory of the buffers must remain valid until the callback is fired. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: The socket to receive from +- bufs: Buffers to fill with received data +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- p3: User data, the callback will receive this as it's fourth argument +- cb: The callback to be called when the operation finishes, `Operation.recv` will contain results +- all: If true, waits until all buffers are full before completing (TCP only, ignored for UDP) +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +recv_poly3 :: #force_inline proc( + socket: Any_Socket, + bufs: [][]byte, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + all := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_recv(socket, bufs, _poly_cb3(C, T, T2, T3), all, timeout, l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + + return op +} + +Send :: struct { + // The socket to send to. + socket: Any_Socket, + // The buffers to send. + // The outer slice is copied internally, but the backing arrays must remain alive. + bufs: [][]byte `fmt:"-"`, + // The destination endpoint to send to (UDP only). + endpoint: Endpoint, + // If true, the operation ensures all data is sent before completing. + all: bool, + // When this operation expires and should be timed out. + expires: time.Time, + + // An error, if it occurred. + err: Send_Error, + // The number of bytes sent. + sent: int, + + // Implementation specifics, private. + _impl: _Send `fmt:"-"`, +} + +/* +Retrieves and preps an operation to do a send without executing it. + +Executing can then be done with the `exec` procedure. + +The `bufs` slice itself is copied into the operation, so it can be temporary (e.g. on the stack), but the underlying memory of the buffers must remain valid until the callback is fired. + +The timeout is calculated from the time when this procedure was called, not from when it's executed. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- socket: The socket to send to +- bufs: Buffers containing the data to send +- cb: The callback to be called when the operation finishes, `Operation.send` will contain results +- endpoint: The destination endpoint (UDP only, ignored for TCP) +- all: If true, the operation ensures all data is sent before completing +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_send :: proc( + socket: Any_Socket, + bufs: [][]byte, + cb: Callback, + endpoint: Endpoint = {}, + all := true, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + assert(socket != nil) + op := _prep(l, cb, .Send) + op.send.socket = socket + op.send.bufs = bufs + op.send.endpoint = endpoint + op.send.all = all + if timeout > 0 { + op.send.expires = time.time_add(now(), timeout) + } + + if len(op.send.bufs) == 1 { + op.send._impl.small_bufs = {op.send.bufs[0]} + op.send.bufs = op.send._impl.small_bufs[:] + } else { + err: mem.Allocator_Error + if op.send.bufs, err = slice.clone(op.send.bufs, op.l.allocator); err != nil { + switch _ in op.send.socket { + case TCP_Socket: op.send.err = TCP_Send_Error.Insufficient_Resources + case UDP_Socket: op.send.err = UDP_Send_Error.Insufficient_Resources + case: unreachable() + } + } + } + + return op +} + +/* +Sends data to the socket. + +The `bufs` slice itself is copied into the operation, so it can be temporary (e.g. on the stack), but the underlying memory of the buffers must remain valid until the callback is fired. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `send_poly`, `send_poly2`, and `send_poly3`. + +Inputs: +- socket: The socket to send to +- bufs: Buffers containing the data to send +- cb: The callback to be called when the operation finishes, `Operation.send` will contain results +- endpoint: The destination endpoint (UDP only, ignored for TCP) +- all: If true, the operation ensures all data is sent before completing +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +send :: #force_inline proc( + socket: Any_Socket, + bufs: [][]byte, + cb: Callback, + endpoint: Endpoint = {}, + all := true, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + op := prep_send(socket, bufs, cb, endpoint, all, timeout, l) + exec(op) + return op +} + +/* +Sends data to the socket. + +The `bufs` slice itself is copied into the operation, so it can be temporary (e.g. on the stack), but the underlying memory of the buffers must remain valid until the callback is fired. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: The socket to send to +- bufs: Buffers containing the data to send +- p: User data, the callback will receive this as it's second argument +- cb: The callback to be called when the operation finishes, `Operation.send` will contain results +- endpoint: The destination endpoint (UDP only, ignored for TCP) +- all: If true, the operation ensures all data is sent before completing +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +send_poly :: #force_inline proc( + socket: Any_Socket, + bufs: [][]byte, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + endpoint: Endpoint = {}, + all := true, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_send(socket, bufs, _poly_cb(C, T), endpoint, all, timeout, l) + _put_user_data(op, cb, p) + exec(op) + + return op +} + +/* +Sends data to the socket. + +The `bufs` slice itself is copied into the operation, so it can be temporary (e.g. on the stack), but the underlying memory of the buffers must remain valid until the callback is fired. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: The socket to send to +- bufs: Buffers containing the data to send +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- cb: The callback to be called when the operation finishes, `Operation.send` will contain results +- endpoint: The destination endpoint (UDP only, ignored for TCP) +- all: If true, the operation ensures all data is sent before completing +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +send_poly2 :: #force_inline proc( + socket: Any_Socket, + bufs: [][]byte, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + endpoint: Endpoint = {}, + all := true, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_send(socket, bufs, _poly_cb2(C, T, T2), endpoint, all, timeout, l) + _put_user_data2(op, cb, p, p2) + exec(op) + + return op +} + +/* +Sends data to the socket. + +The `bufs` slice itself is copied into the operation, so it can be temporary (e.g. on the stack), but the underlying memory of the buffers must remain valid until the callback is fired. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: The socket to send to +- bufs: Buffers containing the data to send +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- p3: User data, the callback will receive this as it's fourth argument +- cb: The callback to be called when the operation finishes, `Operation.send` will contain results +- endpoint: The destination endpoint (UDP only, ignored for TCP) +- all: If true, the operation ensures all data is sent before completing +- timeout: Optional timeout for the operation, the callback will get a `.Timeout` error after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +send_poly3 :: #force_inline proc( + socket: Any_Socket, + bufs: [][]byte, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + endpoint: Endpoint = {}, + all := true, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_send(socket, bufs, _poly_cb3(C, T, T2, T3), endpoint, all, timeout, l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + + return op +} + +Read :: struct { + // Handle to read from. + handle: Handle, + // Buffer to read data into. + buf: []byte `fmt:"v,read"`, + // Offset to read from. + offset: int, + // Whether to read until the buffer is full or an error occurs. + all: bool, + // When this operation expires and should be timed out. + expires: time.Time, + + // Error, if it occurred. + err: FS_Error, + // Number of bytes read. + read: int, + + // Implementation specifics, private. + _impl: _Read `fmt:"-"`, +} + +/* +Retrieves and preps a positional read operation without executing it. + +This is a pread-style operation: the read starts at the given offset and does +not modify the handle's current file position. + +Executing can then be done with the `exec` procedure. + +The timeout is calculated from the time when this procedure was called, +not from when it's executed. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- handle: Handle to read from +- offset: Offset to read from +- buf: Buffer to read data into (must not be empty) +- cb: The callback to be called when the operation finishes, `Operation.read` will contain results +- all: Whether to read until the buffer is full or an error occurs +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_read :: #force_inline proc( + handle: Handle, + offset: int, + buf: []byte, + cb: Callback, + all := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + assert(len(buf) > 0) + op := _prep(l, cb, .Read) + op.read.handle = handle + op.read.buf = buf + op.read.offset = offset + op.read.all = all + if timeout > 0 { + op.read.expires = time.time_add(now(), timeout) + } + return op +} + +/* +Reads data from a handle at a specific offset. + +This is a pread-style operation: the read starts at the given offset and does +not modify the handle's current file position. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `read_poly`, `read_poly2`, and `read_poly3`. + +Inputs: +- handle: Handle to read from +- offset: Offset to read from +- buf: Buffer to read data into (must not be empty) +- cb: The callback to be called when the operation finishes, `Operation.read` will contain results +- all: Whether to read until the buffer is full or an error occurs +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +read :: #force_inline proc( + handle: Handle, + offset: int, + buf: []byte, + cb: Callback, + all := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + op := prep_read(handle, offset, buf, cb, all, timeout, l) + exec(op) + return op +} + +/* +Reads data from a handle at a specific offset. + +This is a pread-style operation: the read starts at the given offset and does +not modify the handle's current file position. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- handle: Handle to read from +- offset: Offset to read from +- buf: Buffer to read data into (must not be empty) +- p: User data, the callback will receive this as its second argument +- cb: The callback to be called when the operation finishes, `Operation.read` will contain results +- all: Whether to read until the buffer is full or an error occurs +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +read_poly :: #force_inline proc( + handle: Handle, + offset: int, + buf: []byte, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + all := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil +) -> ^Operation where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_read(handle, offset, buf, _poly_cb(C, T), all=all, timeout=timeout, l=l) + _put_user_data(op, cb, p) + exec(op) + + return op +} + +/* +Reads data from a handle at a specific offset. + +This is a pread-style operation: the read starts at the given offset and does +not modify the handle's current file position. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- handle: Handle to read from +- offset: Offset to read from +- buf: Buffer to read data into (must not be empty) +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- cb: The callback to be called when the operation finishes, `Operation.read` will contain results +- all: Whether to read until the buffer is full or an error occurs +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +read_poly2 :: #force_inline proc( + handle: Handle, + offset: int, + buf: []byte, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + all := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil +) -> ^Operation where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_read(handle, offset, buf, _poly_cb2(C, T, T2), all, timeout, l) + _put_user_data2(op, cb, p, p2) + exec(op) + + return op +} + +/* +Reads data from a handle at a specific offset. + +This is a pread-style operation: the read starts at the given offset and does +not modify the handle's current file position. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- handle: Handle to read from +- offset: Offset to read from +- buf: Buffer to read data into (must not be empty) +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- p3: User data, the callback will receive this as its fourth argument +- cb: The callback to be called when the operation finishes, `Operation.read` will contain results +- all: Whether to read until the buffer is full or an error occurs +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +read_poly3 :: #force_inline proc( + handle: Handle, + offset: int, + buf: []byte, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + all := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil +) -> ^Operation where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_read(handle, offset, buf, _poly_cb3(C, T, T2, T3), all, timeout, l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + + return op +} + +Write :: struct { + // Handle to write to. + handle: Handle, + // Buffer containing data to write. + buf: []byte, + // Offset to write to. + offset: int, + // Whether to write until the buffer is fully written or an error occurs. + all: bool, + // When this operation expires and should be timed out. + expires: time.Time, + + // Error, if it occurred. + err: FS_Error, + // Number of bytes written. + written: int, + + // Implementation specifics, private. + _impl: _Write `fmt:"-"`, +} + +/* +Retrieves and preps a positional write operation without executing it. + +This is a pwrite-style operation: the write starts at the given offset and does +not modify the handle's current file position. + +Executing can then be done with the `exec` procedure. + +The timeout is calculated from the time when this procedure was called, +not from when it's executed. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- handle: Handle to write to +- offset: Offset to write to +- buf: Buffer containing data to write (must not be empty) +- cb: The callback to be called when the operation finishes, `Operation.write` will contain results +- all: Whether to write until the entire buffer is written or an error occurs +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_write :: #force_inline proc( + handle: Handle, + offset: int, + buf: []byte, + cb: Callback, + all := true, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + assert(len(buf) > 0) + op := _prep(l, cb, .Write) + op.write.handle = handle + op.write.buf = buf + op.write.offset = offset + op.write.all = all + if timeout > 0 { + op.write.expires = time.time_add(now(), timeout) + } + return op +} + +/* +Writes data to a handle at a specific offset. + +This is a pwrite-style operation: the write starts at the given offset and does +not modify the handle's current file position. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `write_poly`, `write_poly2`, and `write_poly3`. + +Inputs: +- handle: Handle to write to +- offset: Offset to write to +- buf: Buffer containing data to write (must not be empty) +- cb: The callback to be called when the operation finishes, `Operation.write` will contain results +- all: Whether to write until the entire buffer is written or an error occurs +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +write :: #force_inline proc( + handle: Handle, + offset: int, + buf: []byte, + cb: Callback, + all := true, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + op := prep_write(handle, offset, buf, cb, all, timeout, l) + exec(op) + return op +} + +/* +Writes data to a handle at a specific offset. + +This is a pwrite-style operation: the write starts at the given offset and does +not modify the handle's current file position. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- handle: Handle to write to +- offset: Offset to write to +- buf: Buffer containing data to write (must not be empty) +- p: User data, the callback will receive this as its second argument +- cb: The callback to be called when the operation finishes, `Operation.write` will contain results +- all: Whether to write until the entire buffer is written or an error occurs +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +write_poly :: #force_inline proc( + handle: Handle, + offset: int, + buf: []byte, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + all := true, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil +) -> ^Operation where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_write(handle, offset, buf, _poly_cb(C, T), all=all, timeout=timeout, l=l) + _put_user_data(op, cb, p) + exec(op) + + return op +} + +/* +Writes data to a handle at a specific offset. + +This is a pwrite-style operation: the write starts at the given offset and does +not modify the handle's current file position. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- handle: Handle to write to +- offset: Offset to write to +- buf: Buffer containing data to write (must not be empty) +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- cb: The callback to be called when the operation finishes, `Operation.write` will contain results +- all: Whether to write until the entire buffer is written or an error occurs +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +write_poly2 :: #force_inline proc( + handle: Handle, + offset: int, + buf: []byte, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + all := true, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil +) -> ^Operation where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_write(handle, offset, buf, _poly_cb2(C, T, T2), all, timeout, l) + _put_user_data2(op, cb, p, p2) + exec(op) + + return op +} + +/* +Writes data to a handle at a specific offset. + +This is a pwrite-style operation: the write starts at the given offset and does +not modify the handle's current file position. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- handle: Handle to write to +- offset: Offset to write to +- buf: Buffer containing data to write (must not be empty) +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- p3: User data, the callback will receive this as its fourth argument +- cb: The callback to be called when the operation finishes, `Operation.write` will contain results +- all: Whether to write until the entire buffer is written or an error occurs +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +write_poly3 :: #force_inline proc( + handle: Handle, + offset: int, + buf: []byte, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + all := true, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil +) -> ^Operation where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_write(handle, offset, buf, _poly_cb3(C, T, T2, T3), all, timeout, l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + + return op +} + +Timeout :: struct { + // Duration after which the timeout expires. + duration: time.Duration, + + // Implementation specifics, private. + _impl: _Timeout `fmt:"-"`, +} + +/* +Retrieves and preps a timeout operation without executing it. + +Executing can then be done with the `exec` procedure. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- duration: Duration to wait before the operation completes +- cb: The callback to be called when the operation finishes +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_timeout :: #force_inline proc( + duration: time.Duration, + cb: Callback, + l: ^Event_Loop = nil, +) -> ^Operation { + op := _prep(l, cb, .Timeout) + op.timeout.duration = duration + return op +} + +/* +Schedules a timeout that completes after the given duration. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `timeout_poly`, `timeout_poly2`, and `timeout_poly3`. + +Inputs: +- duration: Duration to wait before the operation completes +- cb: The callback to be called when the operation finishes +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +timeout :: #force_inline proc( + duration: time.Duration, + cb: Callback, + l: ^Event_Loop = nil, +) -> ^Operation { + op := prep_timeout(duration, cb, l) + exec(op) + return op +} + +/* +Schedules a timeout that completes after the given duration. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- dur: Duration to wait before the operation completes +- p: User data, the callback will receive this as its second argument +- cb: The callback to be called when the operation finishes +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +timeout_poly :: #force_inline proc( + dur: time.Duration, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + l: ^Event_Loop = nil, +) -> ^Operation + where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_timeout(dur, _poly_cb(C, T), l) + _put_user_data(op, cb, p) + exec(op) + + return op +} + +/* +Schedules a timeout that completes after the given duration. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- dur: Duration to wait before the operation completes +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- cb: The callback to be called when the operation finishes +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +timeout_poly2 :: #force_inline proc( + dur: time.Duration, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + l: ^Event_Loop = nil, +) -> ^Operation + where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_timeout(dur, _poly_cb2(C, T, T2), l) + _put_user_data2(op, cb, p, p2) + exec(op) + + return op +} + +/* +Schedules a timeout that completes after the given duration. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- dur: Duration to wait before the operation completes +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- p3: User data, the callback will receive this as its fourth argument +- cb: The callback to be called when the operation finishes +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +timeout_poly3 :: #force_inline proc( + dur: time.Duration, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + l: ^Event_Loop = nil, +) -> ^Operation + where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_timeout(dur, _poly_cb3(C, T, T2, T3), l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + + return op +} + +/* +Retrieves and preps an operation that completes on the next event loop tick. + +This is equivalent to `prep_timeout(0, ...)`. +*/ +prep_next_tick :: #force_inline proc(cb: Callback, l: ^Event_Loop = nil) -> ^Operation { + return prep_timeout(0, cb, l) +} + +/* +Schedules an operation that completes on the next event loop tick. + +This is equivalent to `timeout(0, ...)`. +*/ +next_tick :: #force_inline proc(cb: Callback, l: ^Event_Loop = nil) -> ^Operation { + return timeout(0, cb, l) +} + +/* +Schedules an operation that completes on the next event loop tick. + +This is equivalent to `timeout_poly(0, ...)`. +*/ +next_tick_poly :: #force_inline proc(p: $T, cb: $C/proc(op: ^Operation, p: T), l: ^Event_Loop = nil) -> ^Operation + where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + return timeout_poly(0, p, cb, l) +} + +/* +Schedules an operation that completes on the next event loop tick. + +This is equivalent to `timeout_poly2(0, ...)`. +*/ +next_tick_poly2 :: #force_inline proc(p: $T, p2: $T2, cb: $C/proc(op: ^Operation, p: T, p2: T2), l: ^Event_Loop = nil) -> ^Operation + where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + return timeout_poly2(0, p, p2, cb, l) +} + +/* +Schedules an operation that completes on the next event loop tick. + +This is equivalent to `timeout_poly3(0, ...)`. +*/ +next_tick_poly3 :: #force_inline proc(p: $T, p2: $T2, p3: $T3, cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), l: ^Event_Loop = nil) -> ^Operation + where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + return timeout_poly3(0, p, p2, p3, cb, l) +} + +Poll_Result :: enum i32 { + // The requested event is ready. + Ready, + // The operation timed out before the event became ready. + Timeout, + // The socket was invalid. + Invalid_Argument, + // An unspecified error occurred. + Error, +} + +Poll_Event :: enum { + // The subject is ready to be received from. + Receive, + // The subject is ready to be sent to. + Send, +} + +Poll :: struct { + // Socket to poll. + socket: Any_Socket, + // Event to poll for. + event: Poll_Event, + // When this operation expires and should be timed out. + expires: time.Time, + + // Result of the poll. + result: Poll_Result, + + // Implementation specifics, private. + _impl: _Poll `fmt:"-"`, +} + +/* +Retrieves and preps an operation to poll a socket without executing it. + +Executing can then be done with the `exec` procedure. + +The timeout is calculated from the time when this procedure was called, +not from when it's executed. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- socket: Socket to poll that is *associated with the event loop* +- event: Event to poll for +- cb: The callback to be called when the operation finishes, `Operation.poll` will contain results +- timeout: Optional timeout for the operation, the callback will receive a `.Timeout` result after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_poll :: #force_inline proc( + socket: Any_Socket, + event: Poll_Event, + cb: Callback, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + op := _prep(l, cb, .Poll) + op.poll.socket = socket + op.poll.event = event + if timeout > 0 { + op.poll.expires = time.time_add(now(), timeout) + } + return op +} + +/* +Poll a socket for readiness. + +NOTE: this is provided to help with "legacy" APIs that require polling behavior. +If you can avoid it and use the other procs in this package, do so. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `poll_poly`, `poll_poly2`, and `poll_poly3`. + +Inputs: +- socket: Socket to poll that is *associated with the event loop* +- event: Event to poll for +- cb: The callback to be called when the operation finishes, `Operation.poll` will contain results +- timeout: Optional timeout for the operation, the callback will receive a `.Timeout` result after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +poll :: #force_inline proc( + socket: Any_Socket, + event: Poll_Event, + cb: Callback, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + op := prep_poll(socket, event, cb, timeout, l) + exec(op) + return op +} + +/* +Poll a socket for readiness. + +NOTE: this is provided to help with "legacy" APIs that require polling behavior. +If you can avoid it and use the other procs in this package, do so. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: Socket to poll that is *associated with the event loop* +- event: Event to poll for +- p: User data, the callback will receive this as its second argument +- cb: The callback to be called when the operation finishes, `Operation.poll` will contain results +- timeout: Optional timeout for the operation, the callback will receive a `.Timeout` result after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +poll_poly :: #force_inline proc( + socket: Any_Socket, + event: Poll_Event, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_poll(socket, event, _poly_cb(C, T), timeout, l) + _put_user_data(op, cb, p) + exec(op) + + return op +} + +/* +Poll a socket for readiness. + +NOTE: this is provided to help with "legacy" APIs that require polling behavior. +If you can avoid it and use the other procs in this package, do so. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: Socket to poll that is *associated with the event loop* +- event: Event to poll for +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- cb: The callback to be called when the operation finishes, `Operation.poll` will contain results +- timeout: Optional timeout for the operation, the callback will receive a `.Timeout` result after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +poll_poly2 :: #force_inline proc( + socket: Any_Socket, + event: Poll_Event, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_poll(socket, event, _poly_cb2(C, T, T2), timeout, l) + _put_user_data2(op, cb, p, p2) + exec(op) + + return op +} + +/* +Poll a socket for readiness. + +NOTE: this is provided to help with "legacy" APIs that require polling behavior. +If you can avoid it and use the other procs in this package, do so. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: Socket to poll that is *associated with the event loop* +- event: Event to poll for +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- p3: User data, the callback will receive this as its fourth argument +- cb: The callback to be called when the operation finishes, `Operation.poll` will contain results +- timeout: Optional timeout for the operation, the callback will receive a `.Timeout` result after that duration +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +poll_poly3 :: #force_inline proc( + socket: Any_Socket, + event: Poll_Event, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_poll(socket, event, _poly_cb3(C, T, T2, T3), timeout, l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + + return op +} + +SEND_ENTIRE_FILE :: -1 + +Send_File_Error :: union #shared_nil { + FS_Error, + TCP_Send_Error, +} + +Send_File :: struct { + // The TCP socket to send the file over. + socket: TCP_Socket, + // The handle of the regular file to send. + file: Handle, + // When this operation expires and should be timed out. + expires: time.Time, + // The starting offset within the file. + offset: int, + // Number of bytes to send. If set to SEND_ENTIRE_FILE, the file size is retrieved + // automatically and this field is updated to reflect the full size. + nbytes: int, + // If true, the callback is triggered periodically as data is sent. + // The callback will continue to be called until `sent == nbytes` or an error occurs. + progress_updates: bool, + + // Total number of bytes (so far if `progress_updates` is true). + sent: int, + // An error, if it occurred. Can be a filesystem or networking error. + err: Send_File_Error, + + // Implementation specifics, private. + _impl: _Send_File `fmt:"-"`, +} + +/* +Retrieves and preps an operation to send a file over a socket without executing it. + +Executing can then be done with the `exec` procedure. + +This uses high-performance zero-copy system calls where available. +Note: This is emulated on NetBSD and OpenBSD (stat -> mmap -> send) as they lack a native sendfile implementation. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- socket: The destination TCP socket +- file: The source file handle +- cb: The callback to be called when data is sent (if `progress_updates` is true) or the operation completes +- offset: Byte offset to start reading from the file +- nbytes: Total bytes to send (use SEND_ENTIRE_FILE for the whole file) +- progress_updates: If true, the callback fires multiple times to report progress, `sent == nbytes` means te operation completed +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the final callback is called +*/ +prep_sendfile :: #force_inline proc( + socket: TCP_Socket, + file: Handle, + cb: Callback, + offset: int = 0, + nbytes: int = SEND_ENTIRE_FILE, + progress_updates := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + assert(offset >= 0) + assert(nbytes == SEND_ENTIRE_FILE || nbytes > 0) + op := _prep(l, cb, .Send_File) + op.sendfile.socket = socket + op.sendfile.file = file + if timeout > 0 { + op.sendfile.expires = time.time_add(now(), timeout) + } + op.sendfile.offset = offset + op.sendfile.nbytes = nbytes + op.sendfile.progress_updates = progress_updates + return op +} + +/* +Sends a file over a TCP socket. + +This uses high-performance zero-copy system calls where available. +Note: This is emulated on NetBSD and OpenBSD (stat -> mmap -> send) as they lack a native sendfile implementation. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `sendfile_poly`, `sendfile_poly2`, and `sendfile_poly3`. + +Inputs: +- socket: The destination TCP socket +- file: The source file handle +- cb: The callback to be called when data is sent (if `progress_updates` is true) or the operation completes +- offset: Byte offset to start reading from the file +- nbytes: Total bytes to send (use SEND_ENTIRE_FILE for the whole file) +- progress_updates: If true, the callback fires multiple times to report progress, `sent == nbytes` means te operation completed +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the final callback is called +*/ +sendfile :: #force_inline proc( + socket: TCP_Socket, + file: Handle, + cb: Callback, + offset: int = 0, + nbytes: int = SEND_ENTIRE_FILE, + progress_updates := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation { + op := prep_sendfile(socket, file, cb, offset, nbytes, progress_updates, timeout, l) + exec(op) + return op +} + +/* +Sends a file over a TCP socket. + +This uses high-performance zero-copy system calls where available. +Note: This is emulated on NetBSD and OpenBSD (stat -> mmap -> send) as they lack a native sendfile implementation. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: The destination TCP socket +- file: The source file handle +- p: User data, the callback will receive this as it's second argument +- cb: The callback to be called when data is sent (if `progress_updates` is true) or the operation completes +- offset: Byte offset to start reading from the file +- nbytes: Total bytes to send (use SEND_ENTIRE_FILE for the whole file) +- progress_updates: If true, the callback fires multiple times to report progress, `sent == nbytes` means te operation completed +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the final callback is called +*/ +sendfile_poly :: #force_inline proc( + socket: TCP_Socket, + file: Handle, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + offset: int = 0, + nbytes: int = SEND_ENTIRE_FILE, + progress_updates := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_sendfile(socket, file, _poly_cb(C, T), offset, nbytes, progress_updates, timeout, l) + _put_user_data(op, cb, p) + exec(op) + + return op +} + +/* +Sends a file over a TCP socket. + +This uses high-performance zero-copy system calls where available. +Note: This is emulated on NetBSD and OpenBSD (stat -> mmap -> send) as they lack a native sendfile implementation. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: The destination TCP socket +- file: The source file handle +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- cb: The callback to be called when data is sent (if `progress_updates` is true) or the operation completes +- offset: Byte offset to start reading from the file +- nbytes: Total bytes to send (use SEND_ENTIRE_FILE for the whole file) +- progress_updates: If true, the callback fires multiple times to report progress, `sent == nbytes` means te operation completed +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the final callback is called +*/ +sendfile_poly2 :: #force_inline proc( + socket: TCP_Socket, + file: Handle, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + offset: int = 0, + nbytes: int = SEND_ENTIRE_FILE, + progress_updates := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_sendfile(socket, file, _poly_cb2(C, T, T2), offset, nbytes, progress_updates, timeout, l) + _put_user_data2(op, cb, p, p2) + exec(op) + + return op +} + +/* +Sends a file over a TCP socket. + +This uses high-performance zero-copy system calls where available. +Note: This is emulated on NetBSD and OpenBSD (stat -> mmap -> send) as they lack a native sendfile implementation. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- socket: The destination TCP socket +- file: The source file handle +- p: User data, the callback will receive this as it's second argument +- p2: User data, the callback will receive this as it's third argument +- p3: User data, the callback will receive this as it's fourth argument +- cb: The callback to be called when data is sent (if `progress_updates` is true) or the operation completes +- offset: Byte offset to start reading from the file +- nbytes: Total bytes to send (use SEND_ENTIRE_FILE for the whole file) +- progress_updates: If true, the callback fires multiple times to report progress, `sent == nbytes` means te operation completed +- timeout: Optional timeout for the operation +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the final callback is called +*/ +sendfile_poly3 :: #force_inline proc( + socket: TCP_Socket, + file: Handle, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + offset: int = 0, + nbytes: int = SEND_ENTIRE_FILE, + progress_updates := false, + timeout: time.Duration = NO_TIMEOUT, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_sendfile(socket, file, _poly_cb3(C, T, T2, T3), offset, nbytes, progress_updates, timeout, l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + + return op +} + +/* +File permission bit-set. + +This type represents POSIX-style file permissions, split into user, group, +and other categories, each with read, write, and execute flags. +*/ +Permissions :: distinct bit_set[Permission_Flag; u32] + +Permission_Flag :: enum u32 { + Execute_Other = 0, + Write_Other = 1, + Read_Other = 2, + + Execute_Group = 3, + Write_Group = 4, + Read_Group = 5, + + Execute_User = 6, + Write_User = 7, + Read_User = 8, +} + +// Convenience permission sets. +Permissions_Execute_All :: Permissions{.Execute_User, .Execute_Group, .Execute_Other} +Permissions_Write_All :: Permissions{.Write_User, .Write_Group, .Write_Other} +Permissions_Read_All :: Permissions{.Read_User, .Read_Group, .Read_Other} + +// Read and write permissions for user, group, and others. +Permissions_Read_Write_All :: Permissions_Read_All + Permissions_Write_All + +// Read, write, and execute permissions for user, group, and others. +Permissions_All :: Permissions_Read_All + Permissions_Write_All + Permissions_Execute_All + +// Default permissions used when creating a file (read and write for everyone). +Permissions_Default_File :: Permissions_Read_All + Permissions_Write_All + +// Default permissions used when creating a directory (read, write, and execute for everyone). +Permissions_Default_Directory :: Permissions_Read_All + Permissions_Write_All + Permissions_Execute_All + +File_Flags :: bit_set[File_Flag; int] + +File_Flag :: enum { + // Open for reading. + Read, + // Open for writing. + Write, + // Append writes to the end of the file. + Append, + // Create the file if it does not exist. + Create, + // Fail if the file already exists (used with Create). + Excl, + Sync, + // Truncate the file on open. + Trunc, +} + +Open :: struct { + // Base directory the path is relative to. + dir: Handle, + // Path to the file. + path: string, + // File open mode flags. + mode: File_Flags, + // Permissions used if the file is created. + perm: Permissions, + + // The opened file handle. + handle: Handle, + // An error, if it occurred. + err: FS_Error, + + // Implementation specifics, private. + _impl: _Open `fmt:"-"`, +} + +// Sentinel handle representing the current/present working directory. +CWD :: _CWD + +/* +Retrieves and preps an operation to open a file without executing it. + +Executing can then be done with the `exec` procedure. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- path: Path to the file, if not absolute: relative from `dir` +- cb: The callback to be called when the operation finishes, `Operation.open` will contain results +- mode: File open mode flags, defaults to read-only +- perm: Permissions to use when creating a file, defaults to read+write for everybody +- dir: Directory that `path` is relative from (if it is relative), defaults to the current working directory +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_open :: #force_inline proc( + path: string, + cb: Callback, + mode: File_Flags = {.Read}, + perm: Permissions = Permissions_Default_File, + dir: Handle = CWD, + l: ^Event_Loop = nil, +) -> ^Operation { + op := _prep(l, cb, .Open) + op.open.path = path + op.open.mode = mode + op.open.perm = perm + op.open.dir = dir + return op +} + +/* +Opens a file and associates it with the event loop. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `open_poly`, `open_poly2`, and `open_poly3`. + +Inputs: +- path: Path to the file, if not absolute: relative from `dir` +- cb: The callback to be called when the operation finishes, `Operation.open` will contain results +- mode: File open mode flags, defaults to read-only +- perm: Permissions to use when creating a file, defaults to read+write for everybody +- dir: Directory that `path` is relative from (if it is relative), defaults to the current working directory +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +open :: #force_inline proc( + path: string, + cb: Callback, + mode: File_Flags = {.Read}, + perm: Permissions = Permissions_Default_File, + dir: Handle = CWD, + l: ^Event_Loop = nil, +) -> ^Operation { + op := prep_open(path, cb, mode, perm, dir, l) + exec(op) + return op +} + +/* +Opens a file and associates it with the event loop. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- path: Path to the file, if not absolute: relative from `dir` +- p: User data, the callback will receive this as its second argument +- cb: The callback to be called when the operation finishes, `Operation.open` will contain results +- mode: File open mode flags, defaults to read-only +- perm: Permissions to use when creating a file, defaults to read+write for everybody +- dir: Directory that `path` is relative from (if it is relative), defaults to the current working directory +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +open_poly :: #force_inline proc( + path: string, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + mode: File_Flags = {.Read}, + perm: Permissions = Permissions_Default_File, + dir: Handle = CWD, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_open(path, _poly_cb(C, T), mode, perm, dir, l) + _put_user_data(op, cb, p) + exec(op) + + return op +} + +/* +Opens a file and associates it with the event loop. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- path: Path to the file, if not absolute: relative from `dir` +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- cb: The callback to be called when the operation finishes, `Operation.open` will contain results +- mode: File open mode flags, defaults to read-only +- perm: Permissions to use when creating a file, defaults to read+write for everybody +- dir: Directory that `path` is relative from (if it is relative), defaults to the current working directory +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +open_poly2 :: #force_inline proc( + path: string, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + mode: File_Flags = {.Read}, + perm: Permissions = Permissions_Default_File, + dir: Handle = CWD, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_open(path, _poly_cb2(C, T, T2), mode, perm, dir, l) + _put_user_data2(op, cb, p, p2) + exec(op) + + return op +} + +/* +Asynchronously opens a file and associates it with the event loop. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- path: Path to the file, if not absolute: relative from `dir` +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- p3: User data, the callback will receive this as its fourth argument +- cb: The callback to be called when the operation finishes, `Operation.open` will contain results +- mode: File open mode flags, defaults to read-only +- perm: Permissions to use when creating a file, defaults to read+write for everybody +- dir: Directory that `path` is relative from (if it is relative), defaults to the current working directory +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +open_poly3 :: #force_inline proc( + path: string, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + mode: File_Flags = {.Read}, + perm: Permissions = Permissions_Default_File, + dir: Handle = CWD, + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_open(path, _poly_cb3(C, T, T2, T3), mode, perm, dir, l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + + return op +} + +File_Type :: enum { + // File type could not be determined. + Undetermined, + // Regular file. + Regular, + // Directory. + Directory, + // Symbolic link. + Symlink, + // Pipe or socket. + Pipe_Or_Socket, + // Character or block device. + Device, +} + +Stat :: struct { + // Handle to stat. + handle: Handle, + + // The type of the file. + type: File_Type, + // Size of the file in bytes. + size: i64 `fmt:"M"`, + + // An error, if it occurred. + err: FS_Error, + + // Implementation specifics, private. + _impl: _Stat `fmt:"-"`, +} + +/* +Retrieves and preps an operation to stat a handle without executing it. + +Executing can then be done with the `exec` procedure. + +Any user data can be set on the returned operation's `user_data` field. + +Inputs: +- handle: Handle to retrieve stat +- cb: The callback to be called when the operation finishes, `Operation.stat` will contain results +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +prep_stat :: #force_inline proc( + handle: Handle, + cb: Callback, + l: ^Event_Loop = nil, +) -> ^Operation { + op := _prep(l, cb, .Stat) + op.stat.handle = handle + return op +} + +/* +Stats a handle. + +Any user data can be set on the returned operation's `user_data` field. +Polymorphic variants for type safe user data are available under `stat_poly`, `stat_poly2`, and `stat_poly3`. + +Inputs: +- handle: Handle to retrieve status information for +- cb: The callback to be called when the operation finishes, `Operation.stat` will contain results +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +stat :: #force_inline proc( + handle: Handle, + cb: Callback, + l: ^Event_Loop = nil, +) -> ^Operation { + op := prep_stat(handle, cb, l) + exec(op) + return op +} + +/* +Stats a handle. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- handle: Handle to retrieve status information for +- p: User data, the callback will receive this as its second argument +- cb: The callback to be called when the operation finishes, `Operation.stat` will contain results +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +stat_poly :: #force_inline proc( + handle: Handle, + p: $T, + cb: $C/proc(op: ^Operation, p: T), + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_stat(handle, _poly_cb(C, T), l) + _put_user_data(op, cb, p) + exec(op) + + return op +} + +/* +Stats a handle. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- handle: Handle to retrieve status information for +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- cb: The callback to be called when the operation finishes, `Operation.stat` will contain results +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +stat_poly2 :: #force_inline proc( + handle: Handle, + p: $T, p2: $T2, + cb: $C/proc(op: ^Operation, p: T, p2: T2), + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_stat(handle, _poly_cb2(C, T, T2), l) + _put_user_data2(op, cb, p, p2) + exec(op) + + return op +} + +/* +Stats a handle. + +This procedure uses polymorphism for type safe user data up to a certain size. + +Inputs: +- handle: Handle to retrieve status information for +- p: User data, the callback will receive this as its second argument +- p2: User data, the callback will receive this as its third argument +- p3: User data, the callback will receive this as its fourth argument +- cb: The callback to be called when the operation finishes, `Operation.stat` will contain results +- l: Event loop to associate the operation with, defaults to the current thread's loop + +Returns: A non-nil pointer to the operation, alive until the callback is called +*/ +stat_poly3 :: #force_inline proc( + handle: Handle, + p: $T, p2: $T2, p3: $T3, + cb: $C/proc(op: ^Operation, p: T, p2: T2, p3: T3), + l: ^Event_Loop = nil, +) -> ^Operation where size_of(T) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { + + op := prep_stat(handle, _poly_cb3(C, T, T2, T3), l) + _put_user_data3(op, cb, p, p2, p3) + exec(op) + + return op +} + +_prep :: proc(l: ^Event_Loop, cb: Callback, type: Operation_Type) -> ^Operation { + assert(cb != nil) + assert(type != .None) + l := l + if l == nil { l = _current_thread_event_loop() } + operation := pool.get(&l.operation_pool) + operation.l = l + operation.type = type + operation.cb = cb + return operation +} + +_poly_cb :: #force_inline proc($C: typeid, $T: typeid) -> proc(^Operation) { + return proc(op: ^Operation) { + ptr := uintptr(&op.user_data) + cb := intrinsics.unaligned_load((^C)(rawptr(ptr))) + p := intrinsics.unaligned_load((^T)(rawptr(ptr + size_of(C)))) + cb(op, p) + } +} + +_poly_cb2 :: #force_inline proc($C: typeid, $T: typeid, $T2: typeid) -> proc(^Operation) { + return proc(op: ^Operation) { + ptr := uintptr(&op.user_data) + cb := intrinsics.unaligned_load((^C) (rawptr(ptr))) + p := intrinsics.unaligned_load((^T) (rawptr(ptr + size_of(C)))) + p2 := intrinsics.unaligned_load((^T2)(rawptr(ptr + size_of(C) + size_of(T)))) + cb(op, p, p2) + } +} + +_poly_cb3 :: #force_inline proc($C: typeid, $T: typeid, $T2: typeid, $T3: typeid) -> proc(^Operation) { + return proc(op: ^Operation) { + ptr := uintptr(&op.user_data) + cb := intrinsics.unaligned_load((^C) (rawptr(ptr))) + p := intrinsics.unaligned_load((^T) (rawptr(ptr + size_of(C)))) + p2 := intrinsics.unaligned_load((^T2)(rawptr(ptr + size_of(C) + size_of(T)))) + p3 := intrinsics.unaligned_load((^T3)(rawptr(ptr + size_of(C) + size_of(T) + size_of(T2)))) + cb(op, p, p2, p3) + } +} + +_put_user_data :: #force_inline proc(op: ^Operation, cb: $C, p: $T) { + ptr := uintptr(&op.user_data) + intrinsics.unaligned_store((^C)(rawptr(ptr)), cb) + intrinsics.unaligned_store((^T)(rawptr(ptr + size_of(cb))), p) +} + +_put_user_data2 :: #force_inline proc(op: ^Operation, cb: $C, p: $T, p2: $T2) { + ptr := uintptr(&op.user_data) + intrinsics.unaligned_store((^C) (rawptr(ptr)), cb) + intrinsics.unaligned_store((^T) (rawptr(ptr + size_of(cb))), p) + intrinsics.unaligned_store((^T2)(rawptr(ptr + size_of(cb) + size_of(p))), p2) +} + +_put_user_data3 :: #force_inline proc(op: ^Operation, cb: $C, p: $T, p2: $T2, p3: $T3) { + ptr := uintptr(&op.user_data) + intrinsics.unaligned_store((^C) (rawptr(ptr)), cb) + intrinsics.unaligned_store((^T) (rawptr(ptr + size_of(cb))), p) + intrinsics.unaligned_store((^T2)(rawptr(ptr + size_of(cb) + size_of(p))), p2) + intrinsics.unaligned_store((^T3)(rawptr(ptr + size_of(cb) + size_of(p) + size_of(p2))), p3) +} diff --git a/core/nbio/uring/doc.odin b/core/nbio/uring/doc.odin new file mode 100644 index 000000000..440b294d6 --- /dev/null +++ b/core/nbio/uring/doc.odin @@ -0,0 +1,88 @@ +/* +Wrapper/convenience package over the raw io_uring syscalls, providing help with setup, creation, and operating the ring. + +The following example shows a simple `cat` program implementation using the package. + +Example: + package main + + import "base:runtime" + + import "core:fmt" + import "core:os" + import "core:sys/linux" + import "core:nbio/uring" + + Request :: struct { + path: cstring, + buffer: []byte, + completion: linux.IO_Uring_CQE, + } + + main :: proc() { + if len(os.args) < 2 { + fmt.eprintfln("Usage: %s [file name] <[file name] ...>", os.args[0]) + os.exit(1) + } + + requests := make_soa(#soa []Request, len(os.args)-1) + defer delete(requests) + + ring: uring.Ring + params := uring.DEFAULT_PARAMS + err := uring.init(&ring, ¶ms) + fmt.assertf(err == nil, "uring.init: %v", err) + defer uring.destroy(&ring) + + for &request, i in requests { + request.path = runtime.args__[i+1] + // sets up a read requests and adds it to the ring buffer. + submit_read_request(request.path, &request.buffer, &ring) + } + + ulen := u32(len(requests)) + + // submit the requests and wait for them to complete right away. + n, serr := uring.submit(&ring, ulen) + fmt.assertf(serr == nil, "uring.submit: %v", serr) + assert(n == ulen) + + // copy the completed requests out of the ring buffer. + cn := uring.copy_cqes_ready(&ring, requests.completion[:ulen]) + assert(cn == ulen) + + for request in requests { + // check result of the requests. + fmt.assertf(request.completion.res >= 0, "read %q failed: %v", request.path, linux.Errno(-request.completion.res)) + // print out. + fmt.print(string(request.buffer)) + + delete(request.buffer) + } + } + + submit_read_request :: proc(path: cstring, buffer: ^[]byte, ring: ^uring.Ring) { + fd, err := linux.open(path, {}) + fmt.assertf(err == nil, "open(%q): %v", path, err) + + file_sz := get_file_size(fd) + + buffer^ = make([]byte, file_sz) + + _, ok := uring.read(ring, 0, fd, buffer^, 0) + assert(ok, "could not get read sqe") + } + + get_file_size :: proc(fd: linux.Fd) -> uint { + st: linux.Stat + err := linux.fstat(fd, &st) + fmt.assertf(err == nil, "fstat: %v", err) + + if linux.S_ISREG(st.mode) { + return uint(st.size) + } + + panic("not a regular file") + } +*/ +package uring diff --git a/core/nbio/uring/ops.odin b/core/nbio/uring/ops.odin new file mode 100644 index 000000000..7b3392e98 --- /dev/null +++ b/core/nbio/uring/ops.odin @@ -0,0 +1,847 @@ +package uring + +import "core:sys/linux" + +// Do not perform any I/O. This is useful for testing the performance of the uring implementation itself. +nop :: proc(ring: ^Ring, user_data: u64) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .NOP + sqe.user_data = user_data + + ok = true + return +} + +// Vectored read operation, see also readv(2). +readv :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, iovs: []linux.IO_Vec, off: u64) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .READV + sqe.fd = fd + sqe.addr = cast(u64)uintptr(raw_data(iovs)) + sqe.len = u32(len(iovs)) + sqe.off = off + sqe.user_data = user_data + + ok = true + return +} + +// Vectored write operation, see also writev(2). +writev :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, iovs: []linux.IO_Vec, off: u64) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .WRITEV + sqe.fd = fd + sqe.addr = cast(u64)uintptr(raw_data(iovs)) + sqe.len = u32(len(iovs)) + sqe.off = off + sqe.user_data = user_data + + ok = true + return +} + +read_fixed :: proc() { + unimplemented() +} + +write_fixed :: proc() { + unimplemented() +} + +/* +File sync. See also fsync(2). + +Optionally off and len can be used to specify a range within the file to be synced rather than syncing the entire file, which is the default behavior. + +Note that, while I/O is initiated in the order in which it appears in the submission queue, completions are unordered. +For example, an application which places a write I/O followed by an fsync in the submission queue cannot expect the fsync to apply to the write. +The two operations execute in parallel, so the fsync may complete before the write is issued to the storage. +The same is also true for previously issued writes that have not completed prior to the fsync. +To enforce ordering one may utilize linked SQEs, +IOSQE_IO_DRAIN or wait for the arrival of CQEs of requests which have to be ordered before a given request before submitting its SQE. +*/ +fsync :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, flags: linux.IO_Uring_Fsync_Flags) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .FSYNC + sqe.fsync_flags = flags + sqe.fd = fd + sqe.user_data = user_data + + ok = true + return +} + +/* +Poll the fd specified in the submission queue entry for the events specified in the poll_events field. + +Unlike poll or epoll without EPOLLONESHOT, by default this interface always works in one shot mode. +That is, once the poll operation is completed, it will have to be resubmitted. + +If IORING_POLL_ADD_MULTI is set in the SQE len field, then the poll will work in multi shot mode instead. +That means it'll repatedly trigger when the requested event becomes true, and hence multiple CQEs can be generated from this single SQE. +The CQE flags field will have IORING_CQE_F_MORE set on completion if the application should expect further CQE entries from the original request. +If this flag isn't set on completion, then the poll request has been terminated and no further events will be generated. +This mode is available since 5.13. + +This command works like an async poll(2) and the completion event result is the returned mask of events. + +Without IORING_POLL_ADD_MULTI and the initial poll operation with IORING_POLL_ADD_MULTI the operation is level triggered, +i.e. if there is data ready or events pending etc. +at the time of submission a corresponding CQE will be posted. +Potential further completions beyond the first caused by a IORING_POLL_ADD_MULTI are edge triggered. +*/ +poll_add :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, events: linux.Fd_Poll_Events, flags: linux.IO_Uring_Poll_Add_Flags) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .POLL_ADD + sqe.fd = fd + sqe.poll_events = events + sqe.poll_flags = flags + sqe.user_data = user_data + + ok = true + return +} + +/* +Remove an existing poll request. + +If found, the res field of the struct io_uring_cqe will contain 0. +If not found, res will contain -ENOENT, or -EALREADY if the poll request was in the process of completing already. +*/ +poll_remove :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, events: linux.Fd_Poll_Events) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .POLL_REMOVE + sqe.fd = fd + sqe.poll_events = events + sqe.user_data = user_data + + ok = true + return +} + +/* +Update the events of an existing poll request. + +The request will update an existing poll request with the mask of events passed in with this request. +The lookup is based on the user_data field of the original SQE submitted. + +Updating an existing poll is available since 5.13. +*/ +poll_update_events :: proc(ring: ^Ring, user_data: u64, orig_user_data: u64, fd: linux.Fd, events: linux.Fd_Poll_Events) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .POLL_REMOVE + sqe.fd = fd + sqe.addr = orig_user_data + sqe.poll_events = events + sqe.user_data = user_data + sqe.poll_flags = {.UPDATE_EVENTS} + + ok = true + return +} + +/* +Update the user data of an existing poll request. + +The request will update the user_data of an existing poll request based on the value passed. + +Updating an existing poll is available since 5.13. +*/ +poll_update_user_data :: proc(ring: ^Ring, user_data: u64, orig_user_data: u64, new_user_data: u64, fd: linux.Fd) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .POLL_REMOVE + sqe.fd = fd + sqe.off = orig_user_data + sqe.addr = new_user_data + sqe.user_data = user_data + sqe.poll_flags = {.UPDATE_USER_DATA} + + ok = true + return +} + +/* +Add, remove or modify entries in the interest list of epoll(7). + +See epoll_ctl(2) for details of the system call. + +Available since 5.6. +*/ +epoll_ctl :: proc(ring: ^Ring, user_data: u64, epfd: linux.Fd, op: linux.EPoll_Ctl_Opcode, fd: linux.Fd, event: ^linux.EPoll_Event) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .EPOLL_CTL + sqe.fd = epfd + sqe.off = u64(fd) + sqe.epoll_ctl_op = op + sqe.addr = cast(u64)uintptr(event) + sqe.user_data = user_data + + ok = true + return +} + +sync_file_range :: proc() { + unimplemented() +} + +/* +Issue the equivalent of a sendmsg(2) system call. + +See also sendmsg(2) for the general description of the related system call. + +poll_first: if set, uring will assume the socket is currently full and attempting to send data will be unsuccessful. +For this case, uring will arm internal poll and trigger a send of the data when there is enough space available. +This initial send attempt can be wasteful for the case where the socket is expected to be full, setting this flag will +bypass the initial send attempt and go straight to arming poll. +If poll does indicate that data can be sent, the operation will proceed. + +Available since 5.3. +*/ +sendmsg :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, msghdr: ^linux.Msg_Hdr, flags: linux.Socket_Msg, poll_first := false) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .SENDMSG + sqe.fd = fd + sqe.addr = cast(u64)uintptr(msghdr) + sqe.msg_flags = flags + sqe.user_data = user_data + sqe.sq_send_recv_flags = {.RECVSEND_POLL_FIRST} if poll_first else {} + + ok = true + return +} + +/* +Works just like sendmsg, but receives instead of sends. + +poll_first: If set, uring will assume the socket is currently empty and attempting to receive data will be unsuccessful. +For this case, uring will arm internal poll and trigger a receive of the data when the socket has data to be read. +This initial receive attempt can be wasteful for the case where the socket is expected to be empty, setting this flag will bypass the initial receive attempt and go straight to arming poll. +If poll does indicate that data is ready to be received, the operation will proceed. + +Available since 5.3. +*/ +recvmsg :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, msghdr: ^linux.Msg_Hdr, flags: linux.Socket_Msg, poll_first := false) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .RECVMSG + sqe.fd = fd + sqe.addr = cast(u64)uintptr(msghdr) + sqe.msg_flags = flags + sqe.user_data = user_data + sqe.sq_send_recv_flags = {.RECVSEND_POLL_FIRST} if poll_first else {} + + ok = true + return +} + +/* +Issue the equivalent of a send(2) system call. + +See also send(2) for the general description of the related system call. + +poll_first: If set, uring will assume the socket is currently full and attempting to send data will be unsuccessful. +For this case, uring will arm internal poll and trigger a send of the data when there is enough space available. +This initial send attempt can be wasteful for the case where the socket is expected to be full, setting this flag will bypass the initial send attempt and go straight to arming poll. +If poll does indicate that data can be sent, the operation will proceed. + +Available since 5.6. +*/ +send :: proc(ring: ^Ring, user_data: u64, sockfd: linux.Fd, buf: []byte, flags: linux.Socket_Msg, poll_first := false) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .SEND + sqe.fd = sockfd + sqe.addr = cast(u64)uintptr(raw_data(buf)) + sqe.len = u32(len(buf)) + sqe.msg_flags = flags + sqe.user_data = user_data + sqe.sq_send_recv_flags = {.RECVSEND_POLL_FIRST} if poll_first else {} + + ok = true + return +} + +sendto :: proc(ring: ^Ring, user_data: u64, sockfd: linux.Fd, buf: []byte, flags: linux.Socket_Msg, dest: ^$T, poll_first := false) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) + where T == linux.Sock_Addr_In || T == linux.Sock_Addr_In6 || T == linux.Sock_Addr_Un || T == linux.Sock_Addr_Any { + + sqe = send(ring, user_data, sockfd, buf, flags, poll_first) or_return + sqe.addr2 = u64(uintptr(dest)) + sqe.addr_len = u16(size_of(T)) + + ok = true + return +} + +/* +Works just like send, but receives instead of sends. + +poll_first: If set, uring will assume the socket is currently empty and attempting to receive data will be unsuccessful. +For this case, uring will arm internal poll and trigger a receive of the data when the socket has data to be read. +This initial receive attempt can be wasteful for the case where the socket is expected to be empty, setting this flag will bypass the initial receive attempt and go straight to arming poll. +If poll does indicate that data is ready to be received, the operation will proceed. + +Available since 5.6. +*/ +recv :: proc(ring: ^Ring, user_data: u64, sockfd: linux.Fd, buf: []byte, flags: linux.Socket_Msg, poll_first := false) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .RECV + sqe.fd = sockfd + sqe.addr = cast(u64)uintptr(raw_data(buf)) + sqe.len = cast(u32)uintptr(len(buf)) + sqe.msg_flags = flags + sqe.user_data = user_data + sqe.sq_send_recv_flags = {.RECVSEND_POLL_FIRST} if poll_first else {} + + ok = true + return +} + +/* +Register a timeout operation. + +The timeout will complete when either the timeout expires, or after the specified number of +events complete (if `count` is greater than `0`). + +`flags` may be `0` for a relative timeout, or `IORING_TIMEOUT_ABS` for an absolute timeout. + +The completion event result will be `-ETIME` if the timeout completed through expiration, +`0` if the timeout completed after the specified number of events, or `-ECANCELED` if the +timeout was removed before it expired. + +uring timeouts use the `CLOCK.MONOTONIC` clock source. +*/ +timeout :: proc(ring: ^Ring, user_data: u64, ts: ^linux.Time_Spec, count: u32, flags: linux.IO_Uring_Timeout_Flags) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .TIMEOUT + sqe.fd = -1 + sqe.addr = cast(u64)uintptr(ts) + sqe.len = 1 + sqe.off = u64(count) + sqe.timeout_flags = flags + sqe.user_data = user_data + + ok = true + return +} + +/* +Rmove an existing timeout operation. + +The timeout is identified by it's `user_data`. + +The completion event result will be `0` if the timeout was found and cancelled successfully, +`-EBUSY` if the timeout was found but expiration was already in progress, or +`-ENOENT` if the timeout was not found. +*/ +timeout_remove :: proc(ring: ^Ring, user_data: u64, timeout_user_data: u64, flags: linux.IO_Uring_Timeout_Flags) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .TIMEOUT_REMOVE + sqe.fd = -1 + sqe.addr = timeout_user_data + sqe.timeout_flags = flags + sqe.user_data = user_data + + ok = true + return +} + +/* +Issue the equivalent of an accept4(2) system call. + +See also accept4(2) for the general description of the related system call. + +If the file_index field is set to a positive number, the file won't be installed into the normal file table as usual +but will be placed into the fixed file table at index file_index - 1. +In this case, instead of returning a file descriptor, the result will contain either 0 on success or an error. +If the index points to a valid empty slot, the installation is guaranteed to not fail. +If there is already a file in the slot, it will be replaced, similar to IORING_OP_FILES_UPDATE. +Please note that only uring has access to such files and no other syscall can use them. See IOSQE_FIXED_FILE and IORING_REGISTER_FILES. + +Available since 5.5. +*/ +accept :: proc(ring: ^Ring, user_data: u64, sockfd: linux.Fd, addr: ^$T, addr_len: ^i32, flags: linux.Socket_FD_Flags, file_index: u32 = 0) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) +where T == linux.Sock_Addr_In || T == linux.Sock_Addr_In6 || T == linux.Sock_Addr_Un || T == linux.Sock_Addr_Any { + + sqe = get_sqe(ring) or_return + sqe.opcode = .ACCEPT + sqe.fd = sockfd + sqe.addr = cast(u64)uintptr(addr) + sqe.off = cast(u64)uintptr(addr_len) + sqe.accept_flags = flags + sqe.user_data = user_data + sqe.file_index = file_index + + ok = true + return +} + +/* +Attempt to cancel an already issued request. + +The request is identified by it's user data. + +The cancelation request will complete with one of the following results codes. + +If found, the res field of the cqe will contain 0. +If not found, res will contain -ENOENT. + +If found and attempted canceled, the res field will contain -EALREADY. +In this case, the request may or may not terminate. +In general, requests that are interruptible (like socket IO) will get canceled, while disk IO requests cannot be canceled if already started. + +Available since 5.5. +*/ +async_cancel :: proc(ring: ^Ring, orig_user_data: u64, user_data: u64) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .ASYNC_CANCEL + sqe.addr = orig_user_data + sqe.user_data = user_data + + ok = true + return +} + +/* +Adds a link timeout operation. + +You need to set linux.IOSQE_IO_LINK to flags of the target operation +and then call this method right after the target operation. +See https://lwn.net/Articles/803932/ for detail. + +If the dependent request finishes before the linked timeout, the timeout +is canceled. If the timeout finishes before the dependent request, the +dependent request will be canceled. + +The completion event result of the link_timeout will be +`-ETIME` if the timeout finishes before the dependent request +(in this case, the completion event result of the dependent request will +be `-ECANCELED`), or +`-EALREADY` if the dependent request finishes before the linked timeout. + +Available since 5.5. +*/ +link_timeout :: proc(ring: ^Ring, user_data: u64, ts: ^linux.Time_Spec, flags: linux.IO_Uring_Timeout_Flags) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring, 0) or_return + sqe.opcode = .LINK_TIMEOUT + sqe.fd = -1 + sqe.addr = cast(u64)uintptr(ts) + sqe.len = 1 + sqe.timeout_flags = flags + sqe.user_data = user_data + + ok = true + return +} + +/* +Issue the equivalent of a connect(2) system call. + +See also connect(2) for the general description of the related system call. + +Available since 5.5. +*/ +connect :: proc(ring: ^Ring, user_data: u64, sockfd: linux.Fd, addr: ^$T) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) +where T == linux.Sock_Addr_In || T == linux.Sock_Addr_In6 || T == linux.Sock_Addr_Un || T == linux.Sock_Addr_Any { + + sqe = get_sqe(ring) or_return + sqe.opcode = .CONNECT + sqe.fd = sockfd + sqe.addr = cast(u64)uintptr(addr) + sqe.off = size_of(T) + sqe.user_data = user_data + + ok = true + return +} + +fallocate :: proc() { + unimplemented() +} + +fadvise :: proc() { + unimplemented() +} + +/* +Issue the equivalent of a madvise(2) system call. + +See also madvise(2) for the general description of the related system call. + +Available since 5.6. +*/ +madvise :: proc(ring: ^Ring, user_data: u64, addr: rawptr, size: u32, advise: linux.MAdvice) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .MADVISE + sqe.addr = u64(uintptr(addr)) + sqe.len = size + sqe.fadvise_advice = cast(u32)transmute(int)advise + sqe.user_data = user_data + + ok = true + return +} + +/* +Issue the equivalent of a openat(2) system call. + +See also openat(2) for the general description of the related system call. + +Available since 5.6. + +If the file_index is set to a positive number, +the file won't be installed into the normal file table as usual but will be placed into the fixed file table at index file_index - 1. +In this case, instead of returning a file descriptor, the result will contain either 0 on success or an error. +If the index points to a valid empty slot, the installation is guaranteed to not fail. +If there is already a file in the slot, it will be replaced, similar to IORING_OP_FILES_UPDATE. +Please note that only uring has access to such files and no other syscall can use them. +See IOSQE_FIXED_FILE and IORING_REGISTER_FILES. + +Available since 5.15. +*/ +openat :: proc(ring: ^Ring, user_data: u64, dirfd: linux.Fd, path: cstring, mode: linux.Mode, flags: linux.Open_Flags, file_index: u32 = 0) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .OPENAT + sqe.fd = dirfd + sqe.addr = cast(u64)transmute(uintptr)path + sqe.len = transmute(u32)mode + sqe.open_flags = flags + sqe.user_data = user_data + sqe.file_index = file_index + + ok = true + return +} + +openat2 :: proc() { + unimplemented() +} + +/* +Issue the equivalent of a close(2) system call. + +See also close(2) for the general description of the related system call. + +Available since 5.6. + +If the file_index field is set to a positive number, this command can be used to close files that were +direct opened through IORING_OP_OPENAT, IORING_OP_OPENAT2, or IORING_OP_ACCEPT using the uring specific direct descriptors. +Note that only one of the descriptor fields may be set. +The direct close feature is available since the 5.15 kernel, where direct descriptors were introduced. +*/ +close :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, file_index: u32 = 0) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .CLOSE + sqe.fd = fd + sqe.user_data = user_data + sqe.file_index = file_index + + ok = true + return +} + +/* +Issue the equivalent of a statx(2) system call. + +See also statx(2) for the general description of the related system call. + +Available since 5.6. +*/ +statx :: proc(ring: ^Ring, user_data: u64, dirfd: linux.Fd, pathname: cstring, flags: linux.FD_Flags, mask: linux.Statx_Mask, buf: ^linux.Statx) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .STATX + sqe.fd = dirfd + sqe.addr = cast(u64)transmute(uintptr)pathname + sqe.statx_flags = flags + sqe.statx_mask = mask + sqe.statx = buf + sqe.user_data = user_data + + ok = true + return +} + +/* +Issue the equivalent of a pread(2) system call. + +If offset is set to -1 , the offset will use (and advance) the file position, like the read(2) system calls. +These are non-vectored versions of the IORING_OP_READV and IORING_OP_WRITEV opcodes. +See also read(2) for the general description of the related system call. + +Available since 5.6. +*/ +read :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, buf: []u8, offset: u64) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .READ + sqe.fd = fd + sqe.addr = cast(u64)uintptr(raw_data(buf)) + sqe.len = u32(len(buf)) + sqe.off = offset + sqe.user_data = user_data + + ok = true + return +} + +/* +Issue the equivalent of a pwrite(2) system call. + +If offset is set to -1 , the offset will use (and advance) the file position, like the read(2) system calls. +These are non-vectored versions of the IORING_OP_READV and IORING_OP_WRITEV opcodes. +See also write(2) for the general description of the related system call. + +Available since 5.6. +*/ +write :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, buf: []u8, offset: u64) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .WRITE + sqe.fd = fd + sqe.addr = cast(u64)uintptr(raw_data(buf)) + sqe.len = u32(len(buf)) + sqe.off = offset + sqe.user_data = user_data + + ok = true + return +} + +/* +Issue the equivalent of a splice(2) system call. + +A sentinel value of -1 is used to pass the equivalent of a NULL for the offsets to splice(2). + +Please note that one of the file descriptors must refer to a pipe. +See also splice(2) for the general description of the related system call. + +Available since 5.7. + +*/ +splice :: proc(ring: ^Ring, user_data: u64, fd_in: linux.Fd, off_in: i64, fd_out: linux.Fd, off_out: i64, len: u32, flags: linux.IO_Uring_Splice_Flags) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .SPLICE + sqe.splice_fd_in = fd_in + sqe.splice_off_in = cast(u64)off_in + sqe.fd = fd_out + sqe.off = cast(u64)off_out + sqe.len = len + sqe.splice_flags = flags + sqe.user_data = user_data + + ok = true + return +} + +/* +Issue the equivalent of a tee(2) system call. + +Please note that both of the file descriptors must refer to a pipe. +See also tee(2) for the general description of the related system call. + +Available since 5.8. +*/ +tee :: proc(ring: ^Ring, user_data: u64, fd_in: linux.Fd, fd_out: linux.Fd, len: u32, flags: linux.IO_Uring_Splice_Flags) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .TEE + sqe.splice_fd_in = fd_in + sqe.fd = fd_out + sqe.len = len + sqe.splice_flags = flags + sqe.user_data = user_data + + ok = true + return +} + +/* +This command is an alternative to using IORING_REGISTER_FILES_UPDATE which then works in an async fashion, like the rest of the uring commands. + +Note that the array of file descriptors pointed to in addr must remain valid until this operation has completed. + +Available since 5.6. +*/ +files_update :: proc(ring: ^Ring, user_data: u64, fds: []linux.Fd, off: u64) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .FILES_UPDATE + sqe.addr = cast(u64)uintptr(raw_data(fds)) + sqe.len = cast(u32)len(fds) + sqe.off = off + sqe.user_data = user_data + + ok = true + return +} + +provide_buffers :: proc() { + unimplemented() +} + +remove_buffers :: proc() { + unimplemented() +} + +/* +Issue the equivalent of a shutdown(2) system call. + +Available since 5.11. +*/ +shutdown :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, how: linux.Shutdown_How) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .SHUTDOWN + sqe.fd = fd + sqe.shutdown_how = how + sqe.user_data = user_data + + ok = true + return +} + +renameat :: proc() { + unimplemented() +} + +unlinkat :: proc() { + unimplemented() +} + +mkdirat :: proc() { + unimplemented() +} + +symlinkat :: proc() { + unimplemented() +} + +linkat :: proc() { + unimplemented() +} + +msg_ring :: proc() { + unimplemented() +} + +/* +Issue the equivalent of a socket(2) system call. + +See also socket(2) for the general description of the related system call. + +Available since 5.19. + +If the file_index field is set to a positive number, the file won't be installed into the normal file +table as usual but will be placed into the fixed file table at index file_index - 1. +In this case, instead of returning a file descriptor, the result will contain either 0 on success or an error. +If the index points to a valid empty slot, the installation is guaranteed to not fail. +If there is already a file in the slot, it will be replaced, similar to IORING_OP_FILES_UPDATE. +Please note that only uring has access to such files and no other syscall can use them. +See IOSQE_FIXED_FILE and IORING_REGISTER_FILES. +*/ +socket :: proc(ring: ^Ring, user_data: u64, domain: linux.Address_Family, socktype: linux.Socket_Type, protocol: linux.Protocol, file_index: u32 = 0) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .SOCKET + sqe.user_data = user_data + sqe.fd = cast(linux.Fd)domain + sqe.off = cast(u64)socktype + sqe.len = cast(u32)protocol + sqe.rw_flags = {} + sqe.file_index = file_index + + ok = true + return +} + +uring_cmd :: proc() { + unimplemented() +} + +send_zc :: proc() { + unimplemented() +} + +sendmsg_zc :: proc() { + unimplemented() +} + +waitid :: proc() { + unimplemented() +} + +setxattr :: proc() { + unimplemented() +} + +getxattr :: proc() { + unimplemented() +} + +fsetxattr :: proc() { + unimplemented() +} + +fgetxattr :: proc() { + unimplemented() +} + +/* +Issues the equivalent of the bind(2) system call. + +Available since 6.11. +*/ +bind :: proc(ring: ^Ring, user_data: u64, sock: linux.Fd, addr: ^$T) -> (sqe: linux.IO_Uring_SQE, ok: bool) + where + T == linux.Sock_Addr_In || + T == linux.Sock_Addr_In6 || + T == linux.Sock_Addr_Un || + T == linux.Sock_Addr_Any +{ + sqe = get_sqe(ring) or_return + sqe.opcode = .BIND + sqe.user_data = user_data + sqe.fd = sock + sqe.addr = cast(u64)uintptr(addr) + sqe.addr2 = size_of(T) + + ok = true + return +} + +/* +Issues the equivalent of the listen(2) system call. + +fd must contain the file descriptor of the socket and addr must contain the backlog parameter, i.e. the maximum amount of pending queued connections. + +Available since 6.11. +*/ +listen :: proc(ring: ^Ring, user_data: u64, fd: linux.Fd, backlog: u64) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sqe = get_sqe(ring) or_return + sqe.opcode = .LISTEN + sqe.user_data = user_data + sqe.fd = fd + sqe.addr = backlog + + ok = true + return +} + +ftruncate :: proc() { + unimplemented() +} + +read_multishot :: proc() { + unimplemented() +} + +futex_wait :: proc() { + unimplemented() +} + +futex_wake :: proc() { + unimplemented() +} + +futex_waitv :: proc() { + unimplemented() +} + +fixed_fd_install :: proc() { + unimplemented() +} + +fixed_file :: proc() { + unimplemented() +} diff --git a/core/nbio/uring/uring.odin b/core/nbio/uring/uring.odin new file mode 100644 index 000000000..8e4315e6a --- /dev/null +++ b/core/nbio/uring/uring.odin @@ -0,0 +1,294 @@ +package uring + +import "core:math" +import "core:sync" +import "core:sys/linux" + +DEFAULT_THREAD_IDLE_MS :: 1000 +DEFAULT_ENTRIES :: 32 +MAX_ENTRIES :: 4096 + +Ring :: struct { + fd: linux.Fd, + sq: Submission_Queue, + cq: Completion_Queue, + flags: linux.IO_Uring_Setup_Flags, + features: linux.IO_Uring_Features, +} + +DEFAULT_PARAMS :: linux.IO_Uring_Params { + sq_thread_idle = DEFAULT_THREAD_IDLE_MS, +} + +// Initialize and setup an uring, `entries` must be a power of 2 between 1 and 4096. +init :: proc(ring: ^Ring, params: ^linux.IO_Uring_Params, entries: u32 = DEFAULT_ENTRIES) -> (err: linux.Errno) { + assert(entries <= MAX_ENTRIES, "too many entries") + assert(entries != 0, "entries must be positive") + assert(math.is_power_of_two(int(entries)), "entries must be a power of two") + + fd := linux.io_uring_setup(entries, params) or_return + defer if err != nil { linux.close(fd) } + + if .SINGLE_MMAP not_in params.features { + // NOTE: Could support this, but currently isn't. + err = .ENOSYS + return + } + + assert(.CQE32 not_in params.flags, "unsupported flag") // NOTE: Could support this by making IO_Uring generic. + assert(.SQE128 not_in params.flags, "unsupported flag") // NOTE: Could support this by making IO_Uring generic. + + sq := submission_queue_make(fd, params) or_return + + ring.fd = fd + ring.sq = sq + ring.cq = completion_queue_make(fd, params, &sq) + ring.flags = params.flags + ring.features = params.features + + return +} + +destroy :: proc(ring: ^Ring) { + assert(ring.fd >= 0) + submission_queue_destroy(&ring.sq) + linux.close(ring.fd) + ring.fd = -1 +} + +// Returns a pointer to a vacant submission queue entry, or nil if the submission queue is full. +// NOTE: extra is so you can make sure there is space for related entries, defaults to 1 so +// a link timeout op can always be added after another. +get_sqe :: proc(ring: ^Ring, extra: int = 1) -> (sqe: ^linux.IO_Uring_SQE, ok: bool) { + sq := &ring.sq + head: u32 = sync.atomic_load_explicit(sq.head, .Acquire) + next := sq.sqe_tail + 1 + + if int(next - head) > len(sq.sqes)-extra { + sqe = nil + ok = false + return + } + + sqe = &sq.sqes[sq.sqe_tail & sq.mask] + sqe^ = {} + + sq.sqe_tail = next + ok = true + return +} + +free_space :: proc(ring: ^Ring) -> int { + sq := &ring.sq + head := sync.atomic_load_explicit(sq.head, .Acquire) + next := sq.sqe_tail + 1 + free := len(sq.sqes) - int(next - head) + assert(free >= 0) + return free +} + +// Sync internal state with kernel ring state on the submission queue side. +// Returns the number of all pending events in the submission queue. +// Rationale is to determine that an enter call is needed. +flush_sq :: proc(ring: ^Ring) -> (n_pending: u32) { + sq := &ring.sq + to_submit := sq.sqe_tail - sq.sqe_head + if to_submit != 0 { + tail := sq.tail^ + i: u32 = 0 + for ; i < to_submit; i += 1 { + sq.array[tail & sq.mask] = sq.sqe_head & sq.mask + tail += 1 + sq.sqe_head += 1 + } + sync.atomic_store_explicit(sq.tail, tail, .Release) + } + n_pending = sq_ready(ring) + return +} + +// Returns true if we are not using an SQ thread (thus nobody submits but us), +// or if IORING_SQ_NEED_WAKEUP is set and the SQ thread must be explicitly awakened. +// For the latter case, we set the SQ thread wakeup flag. +// Matches the implementation of sq_ring_needs_enter() in liburing. +sq_ring_needs_enter :: proc(ring: ^Ring, flags: ^linux.IO_Uring_Enter_Flags) -> bool { + assert(flags^ == {}) + if .SQPOLL not_in ring.flags { return true } + if .NEED_WAKEUP in sync.atomic_load_explicit(ring.sq.flags, .Relaxed) { + flags^ += {.SQ_WAKEUP} + return true + } + return false +} + + +// Submits the submission queue entries acquired via get_sqe(). +// Returns the number of entries submitted. +// Optionally wait for a number of events by setting `wait_nr`, and/or set a maximum wait time by setting `timeout`. +submit :: proc(ring: ^Ring, wait_nr: u32 = 0, timeout: ^linux.Time_Spec = nil) -> (n_submitted: u32, err: linux.Errno) { + n_submitted = flush_sq(ring) + flags: linux.IO_Uring_Enter_Flags + if sq_ring_needs_enter(ring, &flags) || wait_nr > 0 { + if wait_nr > 0 || .IOPOLL in ring.flags { + flags += {.GETEVENTS} + } + + flags += {.EXT_ARG} + ext: linux.IO_Uring_Getevents_Arg + ext.ts = timeout + + n_submitted_: int + n_submitted_, err = linux.io_uring_enter2(ring.fd, n_submitted, wait_nr, flags, &ext) + assert(n_submitted_ >= 0) + n_submitted = u32(n_submitted_) + } + return +} + +// Returns the number of submission queue entries in the submission queue. +sq_ready :: proc(ring: ^Ring) -> u32 { + // Always use the shared ring state (i.e. head and not sqe_head) to avoid going out of sync, + // see https://github.com/axboe/liburing/issues/92. + return ring.sq.sqe_tail - sync.atomic_load_explicit(ring.sq.head, .Acquire) +} + +// Returns the number of completion queue entries in the completion queue (yet to consume). +cq_ready :: proc(ring: ^Ring) -> (n_ready: u32) { + return sync.atomic_load_explicit(ring.cq.tail, .Acquire) - ring.cq.head^ +} + +// Copies as many CQEs as are ready, and that can fit into the destination `cqes` slice. +// If none are available, enters into the kernel to wait for at most `wait_nr` CQEs. +// Returns the number of CQEs copied, advancing the CQ ring. +// Provides all the wait/peek methods found in liburing, but with batching and a single method. +// TODO: allow for timeout. +copy_cqes :: proc(ring: ^Ring, cqes: []linux.IO_Uring_CQE, wait_nr: u32) -> (n_copied: u32, err: linux.Errno) { + n_copied = copy_cqes_ready(ring, cqes) + if n_copied > 0 { return } + if wait_nr > 0 || cq_ring_needs_flush(ring) { + _ = linux.io_uring_enter(ring.fd, 0, wait_nr, {.GETEVENTS}, nil) or_return + n_copied = copy_cqes_ready(ring, cqes) + } + return +} + +copy_cqes_ready :: proc(ring: ^Ring, cqes: []linux.IO_Uring_CQE) -> (n_copied: u32) { + n_ready := cq_ready(ring) + n_copied = min(u32(len(cqes)), n_ready) + head := ring.cq.head^ + tail := head + n_copied + shift := u32(.CQE32 in ring.flags) + + i := 0 + for head != tail { + cqes[i] = ring.cq.cqes[(head & ring.cq.mask) << shift] + head += 1 + i += 1 + } + cq_advance(ring, n_copied) + return +} + +cq_ring_needs_flush :: proc(ring: ^Ring) -> bool { + return .CQ_OVERFLOW in sync.atomic_load_explicit(ring.sq.flags, .Relaxed) +} + +// For advanced use cases only that implement custom completion queue methods. +// If you use copy_cqes() or copy_cqe() you must not call cqe_seen() or cq_advance(). +// Must be called exactly once after a zero-copy CQE has been processed by your application. +// Not idempotent, calling more than once will result in other CQEs being lost. +// Matches the implementation of cqe_seen() in liburing. +cqe_seen :: proc(ring: ^Ring) { + cq_advance(ring, 1) +} + +// For advanced use cases only that implement custom completion queue methods. +// Matches the implementation of cq_advance() in liburing. +cq_advance :: proc(ring: ^Ring, count: u32) { + if count == 0 { return } + sync.atomic_store_explicit(ring.cq.head, ring.cq.head^ + count, .Release) +} + +Submission_Queue :: struct { + head: ^u32, + tail: ^u32, + mask: u32, + flags: ^linux.IO_Uring_Submission_Queue_Flags, + dropped: ^u32, + array: []u32, + sqes: []linux.IO_Uring_SQE, + mmap: []u8, + mmap_sqes: []u8, + + // We use `sqe_head` and `sqe_tail` in the same way as liburing: + // We increment `sqe_tail` (but not `tail`) for each call to `get_sqe()`. + // We then set `tail` to `sqe_tail` once, only when these events are actually submitted. + // This allows us to amortize the cost of the @atomicStore to `tail` across multiple SQEs. + sqe_head: u32, + sqe_tail: u32, +} + +submission_queue_make :: proc(fd: linux.Fd, params: ^linux.IO_Uring_Params) -> (sq: Submission_Queue, err: linux.Errno) { + assert(fd >= 0, "uninitialized queue fd") + assert(.SINGLE_MMAP in params.features, "unsupported feature") // NOTE: Could support this, but currently isn't. + + sq_size := params.sq_off.array + params.sq_entries * size_of(u32) + cq_size := params.cq_off.cqes + params.cq_entries * size_of(linux.IO_Uring_CQE) + size := max(sq_size, cq_size) + + // PERF: .POPULATE commits all pages right away, is that desired? + + cqe_map := cast([^]byte)(linux.mmap(0, uint(size), {.READ, .WRITE}, {.SHARED, .POPULATE}, fd, linux.IORING_OFF_SQ_RING) or_return) + defer if err != nil { linux.munmap(cqe_map, uint(size)) } + + size_sqes := params.sq_entries * size_of(linux.IO_Uring_SQE) + sqe_map := cast([^]byte)(linux.mmap(0, uint(size_sqes), {.READ, .WRITE}, {.SHARED, .POPULATE}, fd, linux.IORING_OFF_SQES) or_return) + + array := cast([^]u32)cqe_map[params.sq_off.array:] + sqes := cast([^]linux.IO_Uring_SQE)sqe_map + + sq.head = cast(^u32)&cqe_map[params.sq_off.head] + sq.tail = cast(^u32)&cqe_map[params.sq_off.tail] + sq.mask = (cast(^u32)&cqe_map[params.sq_off.ring_mask])^ + sq.flags = cast(^linux.IO_Uring_Submission_Queue_Flags)&cqe_map[params.sq_off.flags] + sq.dropped = cast(^u32)&cqe_map[params.sq_off.dropped] + sq.array = array[:params.sq_entries] + sq.sqes = sqes[:params.sq_entries] + sq.mmap = cqe_map[:size] + sq.mmap_sqes = sqe_map[:size_sqes] + + return +} + +submission_queue_destroy :: proc(sq: ^Submission_Queue) -> (err: linux.Errno) { + err = linux.munmap(raw_data(sq.mmap), uint(len(sq.mmap))) + err2 := linux.munmap(raw_data(sq.mmap_sqes), uint(len(sq.mmap_sqes))) + if err == nil { err = err2 } + return +} + +Completion_Queue :: struct { + head: ^u32, + tail: ^u32, + mask: u32, + overflow: ^u32, + cqes: []linux.IO_Uring_CQE, +} + +completion_queue_make :: proc(fd: linux.Fd, params: ^linux.IO_Uring_Params, sq: ^Submission_Queue) -> Completion_Queue { + assert(fd >= 0, "uninitialized queue fd") + assert(.SINGLE_MMAP in params.features, "required feature SINGLE_MMAP not supported") + + mmap := sq.mmap + cqes := cast([^]linux.IO_Uring_CQE)&mmap[params.cq_off.cqes] + + return( + { + head = cast(^u32)&mmap[params.cq_off.head], + tail = cast(^u32)&mmap[params.cq_off.tail], + mask = (cast(^u32)&mmap[params.cq_off.ring_mask])^, + overflow = cast(^u32)&mmap[params.cq_off.overflow], + cqes = cqes[:params.cq_entries], + } \ + ) +} diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 58d35b9f0..12ebfce3b 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -924,3 +924,39 @@ bitset_to_enum_slice_with_make :: proc(bs: $T, $E: typeid, allocator := context. } bitset_to_enum_slice :: proc{bitset_to_enum_slice_with_make, bitset_to_enum_slice_with_buffer} + +/* +Removes the first n elements (`elems`) from a slice of slices, spanning inner slices and dropping empty ones. + +If `elems` is out of bounds (more than the total) this will trigger a bounds check. + +Example: + import "core:fmt" + import "core:slice" + + advance_slices_example :: proc() { + slices := [][]byte { + {1, 2, 3, 4}, + {5, 6, 7}, + } + + fmt.println(slice.advance_slices(slices, 4)) + } + +Output: + [[5, 6, 7]] +*/ +advance_slices :: proc(slices: $S/[][]$T, elems: int) -> S { + slices, elems := slices, elems + for elems > 0 { + slice := &slices[0] + take := builtin.min(elems, len(slice)) + slice^ = slice[take:] + if len(slice) == 0 { + slices = slices[1:] + } + elems -= take + } + + return slices +} diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index de4417beb..01028b9e1 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -1589,23 +1589,23 @@ IO_Uring_SQE :: struct { using __ioprio: struct #raw_union { ioprio: u16, sq_accept_flags: IO_Uring_Accept_Flags, - sq_send_recv_flags: IO_Uring_Send_Recv_Flags, + sq_send_recv_flags: IO_Uring_Send_Recv_Flags `raw_union_tag:"opcode=.SENDMSG, opcode=.RECVMSG, opcode=.SEND, opcode=.RECV"`, }, fd: Fd, using __offset: struct #raw_union { // Offset into file. - off: u64, - addr2: u64, + off: u64 `raw_union_tag:"opcode=.READV, opcode=.WRITEV, opcode=.SPLICE, opcode=.POLL_REMOVE, opcode=.EPOLL_CTL, opcode=.TIMEOUT, opcode=.ACCEPT, opcode=.CONNECT, opcode=.READ, opcode=.WRITE, opcode=.FILES_UPDATE, opcode=.SOCKET"`, + addr2: u64 `raw_union_tag:"opcode=.SEND, opcode=.BIND"`, using _: struct { cmd_op: u32, __pad1: u32, }, - statx: ^Statx, + statx: ^Statx `raw_union_tag:"opcode=.STATX"`, }, using __iovecs: struct #raw_union { // Pointer to buffer or iovecs. - addr: u64, - splice_off_in: u64, + addr: u64 `raw_union_tag:"opcode=.READV, opcode=.WRITEV, opcode=.POLL_REMOVE, opcode=.EPOLL_CTL, opcode=.SENDMSG, opcode=.RECVMSG, opcode=.SEND, opcode=.RECV, opcode=.TIMEOUT, opcode=.TIMEOUT_REMOVE, opcode=.ACCEPT, opcode=.ASYNC_CANCEL, opcode=.LINK_TIMEOUT, opcode=.CONNECT, opcode=.MADVISE, opcode=.OPENAT, opcode=.STATX, opcode=.READ, opcode=.WRITE, opcode=.FILES_UPDATE, opcode=.BIND, opcode=.LISTEN"`, + splice_off_in: u64 `raw_union_tag:"opcode=.SPLICE"`, using _: struct { level: u32, optname: u32, @@ -1613,28 +1613,28 @@ IO_Uring_SQE :: struct { }, using __len: struct #raw_union { // Buffer size or number of iovecs. - len: u32, - poll_flags: IO_Uring_Poll_Add_Flags, - statx_mask: Statx_Mask, - epoll_ctl_op: EPoll_Ctl_Opcode, - shutdown_how: Shutdown_How, + len: u32 `raw_union_tag:"opcode=.READV, opcode=.WRITEV, opcode=.SPLICE, opcode=.SEND, opcode=.RECV, opcode=.TIMEOUT, opcode=.LINK_TIMEOUT, opcode=.MADVISE, opcode=.OPENAT, opcode=.READ, opcode=.WRITE, opcode=.TEE, opcode=.FILES_UPDATE, opcode=.SOCKET"`, + poll_flags: IO_Uring_Poll_Add_Flags `raw_union_tag:"opcode=.POLL_ADD, opcode=.POLL_REMOVE"`, + statx_mask: Statx_Mask `raw_union_tag:"opcode=.STATX"`, + epoll_ctl_op: EPoll_Ctl_Opcode `raw_union_tag:"opcode=.EPOLL_CTL"`, + shutdown_how: Shutdown_How `raw_union_tag:"opcode=.SHUTDOWN"`, }, using __contents: struct #raw_union { - rw_flags: i32, - fsync_flags: IO_Uring_Fsync_Flags, + rw_flags: i32 `raw_union_tag:"opcode=.READV, opcode=.WRITEV, opcode=.SOCKET"`, + fsync_flags: IO_Uring_Fsync_Flags `raw_union_tag:"opcode=.FSYNC"`, // compatibility. - poll_events: Fd_Poll_Events, + poll_events: Fd_Poll_Events `raw_union_tag:"opcode=.POLL_ADD, opcode=.POLL_REMOVE"`, // word-reversed for BE. poll32_events: u32, sync_range_flags: u32, - msg_flags: Socket_Msg, - timeout_flags: IO_Uring_Timeout_Flags, - accept_flags: Socket_FD_Flags, + msg_flags: Socket_Msg `raw_union_tag:"opcode=.SENDMSG, opcode=.RECVMSG, opcode=.SEND, opcode=.RECV"`, + timeout_flags: IO_Uring_Timeout_Flags `raw_union_tag:"opcode=.TIMEOUT, opcode=.TIMEOUT_REMOVE, opcode=.LINK_TIMEOUT"`, + accept_flags: Socket_FD_Flags `raw_union_tag:"opcode=.ACCEPT"`, cancel_flags: u32, - open_flags: Open_Flags, - statx_flags: FD_Flags, - fadvise_advice: u32, - splice_flags: IO_Uring_Splice_Flags, + open_flags: Open_Flags `raw_union_tag:"opcode=.OPENAT"`, + statx_flags: FD_Flags `raw_union_tag:"opcode=.STATX"`, + fadvise_advice: u32 `raw_union_tag:"opcode=.MADVISE"`, + splice_flags: IO_Uring_Splice_Flags `raw_union_tag:"opcode=.SPLICE, opcode=.TEE"`, rename_flags: u32, unlink_flags: u32, hardlink_flags: u32, @@ -1653,10 +1653,10 @@ IO_Uring_SQE :: struct { // Personality to use, if used. personality: u16, using _: struct #raw_union { - splice_fd_in: Fd, - file_index: u32, + splice_fd_in: Fd `raw_union_tag:"opcode=.SPLICE, opcode=.TEE"`, + file_index: u32 `raw_union_tag:"opcode=.ACCEPT, opcode=.OPENAT, opcode=.CLOSE, opcode=.SOCKET"`, using _: struct { - addr_len: u16, + addr_len: u16 `raw_union_tag:"opcode=.SEND"`, __pad3: [1]u16, }, }, diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 0ad11121e..dc76cb037 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -30,6 +30,16 @@ EV_RXCHAR :: DWORD(0x0001) EV_RXFLAG :: DWORD(0x0002) EV_TXEMPTY :: DWORD(0x0004) +WAITORTIMERCALLBACK :: #type proc "system" (lpParameter: PVOID, TimerOrWaitFired: BOOLEAN) + +WT_EXECUTEDEFAULT :: 0x00000000 +WT_EXECUTEINIOTHREAD :: 0x00000001 +WT_EXECUTEINPERSISTENTTHREAD :: 0x00000080 +WT_EXECUTEINWAITTHREAD :: 0x00000004 +WT_EXECUTELONGFUNCTION :: 0x00000010 +WT_EXECUTEONLYONCE :: 0x00000008 +WT_TRANSFER_IMPERSONATION :: 0x00000100 + @(default_calling_convention="system") foreign kernel32 { OutputDebugStringA :: proc(lpOutputString: LPCSTR) --- // The only A thing that is allowed @@ -567,7 +577,7 @@ foreign kernel32 { // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatusex) GetQueuedCompletionStatusEx :: proc(CompletionPort: HANDLE, lpCompletionPortEntries: ^OVERLAPPED_ENTRY, ulCount: c_ulong, ulNumEntriesRemoved: ^c_ulong, dwMilliseconds: DWORD, fAlertable: BOOL) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-postqueuedcompletionstatus) - PostQueuedCompletionStatus :: proc(CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: c_ulong, lpOverlapped: ^OVERLAPPED) -> BOOL --- + PostQueuedCompletionStatus :: proc(CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: ULONG_PTR, lpOverlapped: ^OVERLAPPED) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation) GetHandleInformation :: proc(hObject: HANDLE, lpdwFlags: ^DWORD) -> BOOL --- @@ -575,6 +585,17 @@ foreign kernel32 { RtlNtStatusToDosError :: proc(status: NTSTATUS) -> ULONG --- GetSystemPowerStatus :: proc(lpSystemPowerStatus: ^SYSTEM_POWER_STATUS) -> BOOL --- + + RegisterWaitForSingleObject :: proc( + phNewWaitObject: PHANDLE, + hObject: HANDLE, + Callback: WAITORTIMERCALLBACK, + Context: PVOID, + dwMilliseconds: ULONG, + dwFlags: ULONG, + ) -> BOOL --- + + UnregisterWaitEx :: proc(WaitHandle: HANDLE, CompletionEvent: HANDLE) -> BOOL --- } DEBUG_PROCESS :: 0x00000001 diff --git a/core/sys/windows/mswsock.odin b/core/sys/windows/mswsock.odin new file mode 100644 index 000000000..9019fc821 --- /dev/null +++ b/core/sys/windows/mswsock.odin @@ -0,0 +1,40 @@ +#+build windows +package sys_windows + +foreign import mswsock "system:mswsock.lib" + +foreign mswsock { + TransmitFile :: proc( + hSocket: SOCKET, + hFile: HANDLE, + nNumberOfBytesToWrite: DWORD, + nNumberOfBytesPerSend: DWORD, + lpOverlapped: LPOVERLAPPED, + lpTransmitBuffers: rawptr, + dwReserved: DWORD, + ) -> BOOL --- + + AcceptEx :: proc( + sListenSocket: SOCKET, + sAcceptSocket: SOCKET, + lpOutputBuffer: PVOID, + dwReceiveDataLength: DWORD, + dwLocalAddressLength: DWORD, + dwRemoteAddressLength: DWORD, + lpdwBytesReceived: LPDWORD, + lpOverlapped: LPOVERLAPPED, + ) -> BOOL --- + + GetAcceptExSockaddrs :: proc( + lpOutputBuffer: PVOID, + dwReceiveDataLength: DWORD, + dwLocalAddressLength: DWORD, + dwRemoteAddressLength: DWORD, + LocalSockaddr: ^^sockaddr, + LocalSockaddrLength: LPINT, + RemoteSockaddr: ^^sockaddr, + RemoteSockaddrLength: LPINT, + ) --- +} + +SO_UPDATE_CONNECT_CONTEXT :: 0x7010 \ No newline at end of file diff --git a/core/sys/windows/ntdll.odin b/core/sys/windows/ntdll.odin index 747130749..8362bb9df 100644 --- a/core/sys/windows/ntdll.odin +++ b/core/sys/windows/ntdll.odin @@ -36,6 +36,20 @@ foreign ntdll_lib { QueryFlags: ULONG, FileName : PUNICODE_STRING, ) -> NTSTATUS --- + + NtCreateFile :: proc( + FileHandle: PHANDLE, + DesiredAccess: ACCESS_MASK, + ObjectAttributes: POBJECT_ATTRIBUTES, + IoStatusBlock: PIO_STATUS_BLOCK, + AllocationSize: PLARGE_INTEGER, + FileAttributes: ULONG, + ShareAccess: ULONG, + CreateDisposition: ULONG, + CreateOptions: ULONG, + EaBuffer: PVOID, + EaLength: ULONG, + ) -> NTSTATUS --- } @@ -256,4 +270,13 @@ RTL_DRIVE_LETTER_CURDIR :: struct { LIST_ENTRY :: struct { Flink: ^LIST_ENTRY, Blink: ^LIST_ENTRY, -} \ No newline at end of file +} + +FILE_SUPERSEDE :: 0x00000000 +FILE_OPEN :: 0x00000001 +FILE_CREATE :: 0x00000002 +FILE_OPEN_IF :: 0x00000003 +FILE_OVERWRITE :: 0x00000004 +FILE_OVERWRITE_IF :: 0x00000005 + +FILE_NON_DIRECTORY_FILE :: 0x00000040 diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index e1a14fb94..0d8854724 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -3139,6 +3139,7 @@ OBJECT_ATTRIBUTES :: struct { SecurityDescriptor: rawptr, SecurityQualityOfService: rawptr, } +POBJECT_ATTRIBUTES :: ^OBJECT_ATTRIBUTES PUNICODE_STRING :: ^UNICODE_STRING UNICODE_STRING :: struct { @@ -3150,9 +3151,14 @@ UNICODE_STRING :: struct { OVERLAPPED :: struct { Internal: ^c_ulong, InternalHigh: ^c_ulong, - Offset: DWORD, - OffsetHigh: DWORD, - hEvent: HANDLE, + using _: struct #raw_union { + using _: struct { + Offset: DWORD, + OffsetHigh: DWORD, + }, + OffsetFull: u64, // Convenience field to set Offset and OffsetHigh with one value. + }, + hEvent: HANDLE, } OVERLAPPED_ENTRY :: struct { diff --git a/core/sys/windows/winerror.odin b/core/sys/windows/winerror.odin index 23467761d..2807ca0f8 100644 --- a/core/sys/windows/winerror.odin +++ b/core/sys/windows/winerror.odin @@ -248,6 +248,13 @@ E_HANDLE :: 0x80070006 // Handle that is not valid E_OUTOFMEMORY :: 0x8007000E // Failed to allocate necessary memory E_INVALIDARG :: 0x80070057 // One or more arguments are not valid +SEC_E_INCOMPLETE_MESSAGE :: 0x80090318 + +SEC_I_INCOMPLETE_CREDENTIALS :: 0x00090320 +SEC_I_CONTINUE_NEEDED :: 0x00090312 +SEC_I_CONTEXT_EXPIRED :: 0x00090317 +SEC_I_RENEGOTIATE :: 0x00090321 + // Severity values SEVERITY :: enum DWORD { SUCCESS = 0, diff --git a/core/sys/windows/ws2_32.odin b/core/sys/windows/ws2_32.odin index ad9089c6e..77a288d6f 100644 --- a/core/sys/windows/ws2_32.odin +++ b/core/sys/windows/ws2_32.odin @@ -38,7 +38,7 @@ WSANETWORKEVENTS :: struct { WSAID_ACCEPTEX :: GUID{0xb5367df1, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} WSAID_GETACCEPTEXSOCKADDRS :: GUID{0xb5367df2, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} -WSAID_CONNECTX :: GUID{0x25a207b9, 0xddf3, 0x4660, {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}} +WSAID_CONNECTEX :: GUID{0x25a207b9, 0xddf3, 0x4660, {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}} SIO_GET_EXTENSION_FUNCTION_POINTER :: IOC_INOUT | IOC_WS2 | 6 SIO_UDP_CONNRESET :: IOC_IN | IOC_VENDOR | 12 @@ -129,7 +129,7 @@ foreign ws2_32 { dwBufferCount: DWORD, lpNumberOfBytesSent: LPDWORD, dwFlags: DWORD, - lpTo: ^SOCKADDR_STORAGE_LH, + lpTo: ^sockaddr, iToLen: c_int, lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, @@ -151,8 +151,8 @@ foreign ws2_32 { dwBufferCount: DWORD, lpNumberOfBytesRecvd: LPDWORD, lpFlags: LPDWORD, - lpFrom: ^SOCKADDR_STORAGE_LH, - lpFromlen: ^c_int, + lpFrom: ^sockaddr, + lpFromlen: LPINT, lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> c_int --- diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 7895b4640..9a7613ba5 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -17,6 +17,7 @@ package all @(require) import "core:container/avl" @(require) import "core:container/bit_array" +@(require) import "core:container/pool" @(require) import "core:container/priority_queue" @(require) import "core:container/queue" @(require) import "core:container/small_array" @@ -104,6 +105,8 @@ package all @(require) import "core:mem/tlsf" @(require) import "core:mem/virtual" +@(require) import "core:nbio" + @(require) import "core:odin/ast" @(require) import doc_format "core:odin/doc-format" @(require) import "core:odin/parser" @@ -156,4 +159,4 @@ package all @(require) import "core:unicode/utf8/utf8string" @(require) import "core:unicode/utf16" -main :: proc() {} \ No newline at end of file +main :: proc() {} diff --git a/tests/core/nbio/fs.odin b/tests/core/nbio/fs.odin new file mode 100644 index 000000000..6e079f96e --- /dev/null +++ b/tests/core/nbio/fs.odin @@ -0,0 +1,100 @@ +package tests_nbio + +import "core:nbio" +import "core:testing" +import "core:time" +import os "core:os/os2" + +@(test) +close_invalid_handle :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + nbio.close(max(nbio.Handle)) + + ev(t, nbio.run(), nil) + } +} + +@(test) +write_read_close :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + @static content := [20]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20} + @static result: [20]byte + + FILENAME :: "test_write_read_close" + + nbio.open_poly(FILENAME, t, on_open, mode={.Read, .Write, .Create, .Trunc}) + + on_open :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.open.err, nil) + + nbio.write_poly(op.open.handle, 0, content[:], t, on_write) + } + + on_write :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.write.err, nil) + ev(t, op.write.written, len(content)) + + nbio.read_poly(op.write.handle, 0, result[:], t, on_read, all=true) + } + + on_read :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.read.err, nil) + ev(t, op.read.read, len(result)) + ev(t, result, content) + + nbio.close_poly(op.read.handle, t, on_close) + } + + on_close :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.close.err, nil) + os.remove(FILENAME) + } + + ev(t, nbio.run(), nil) + } +} + +@(test) +read_empty_file :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + FILENAME :: "test_read_empty_file" + + handle, err := nbio.open_sync(FILENAME, mode={.Read, .Write, .Create, .Trunc}) + ev(t, err, nil) + + buf: [128]byte + nbio.read_poly(handle, 0, buf[:], t, proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.read.err, nbio.FS_Error.EOF) + ev(t, op.read.read, 0) + + nbio.close_poly(op.read.handle, t, proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.close.err, nil) + os.remove(FILENAME) + }) + }) + + ev(t, nbio.run(), nil) + } +} + +@(test) +read_entire_file :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + nbio.read_entire_file(#file, t, on_read) + + on_read :: proc(t: rawptr, data: []byte, err: nbio.Read_Entire_File_Error) { + t := (^testing.T)(t) + ev(t, err.value, nil) + ev(t, string(data), #load(#file, string)) + delete(data) + } + } +} diff --git a/tests/core/nbio/nbio.odin b/tests/core/nbio/nbio.odin new file mode 100644 index 000000000..2f454f55b --- /dev/null +++ b/tests/core/nbio/nbio.odin @@ -0,0 +1,258 @@ +package tests_nbio + +import "core:log" +import "core:nbio" +import "core:testing" +import "core:thread" +import "core:time" +import os "core:os/os2" + +ev :: testing.expect_value +e :: testing.expect + +@(deferred_in=event_loop_guard_exit) +event_loop_guard :: proc(t: ^testing.T) -> bool { + err := nbio.acquire_thread_event_loop() + if err == .Unsupported || !nbio.FULLY_SUPPORTED { + log.warn("nbio unsupported, skipping") + return false + } + + ev(t, err, nil) + return true +} + +event_loop_guard_exit :: proc(t: ^testing.T) { + ev(t, nbio.run(), nil) // Could have some things to clean up from a `defer` in the test. + nbio.release_thread_event_loop() +} + +// Tests that all poly variants are correctly passing through arguments, and that +// all procs eventually get their callback called. +// +// This is important because the poly procs are only checked when they are called, +// So this will also catch any typos in their implementations. +@(test) +all_poly_work :: proc(tt: ^testing.T) { + if event_loop_guard(tt) { + testing.set_fail_timeout(tt, time.Minute) + + @static t: ^testing.T + t = tt + + @static n: int + n = 0 + NUM_TESTS :: 39 + + UDP_SOCKET :: max(nbio.UDP_Socket) + TCP_SOCKET :: max(nbio.TCP_Socket) + + tmp, terr := os.create_temp_file("", "tests_nbio_poly*", {.Non_Blocking}) + ev(t, terr, nil) + defer os.close(tmp) + + HANDLE, aerr := nbio.associate_handle(os.fd(tmp)) + ev(t, aerr, nil) + + _buf: [1]byte + buf := _buf[:] + + one :: proc(op: ^nbio.Operation, one: int) { + n += 1 + ev(t, one, 1) + } + + two :: proc(op: ^nbio.Operation, one: int, two: int) { + n += 1 + ev(t, one, 1) + ev(t, two, 2) + } + + three :: proc(op: ^nbio.Operation, one: int, two: int, three: int) { + n += 1 + ev(t, one, 1) + ev(t, two, 2) + ev(t, three, 3) + } + + nbio.accept_poly(TCP_SOCKET, 1, one) + nbio.accept_poly2(TCP_SOCKET, 1, 2, two) + nbio.accept_poly3(TCP_SOCKET, 1, 2, 3, three) + + nbio.close_poly(max(nbio.Handle), 1, one) + nbio.close_poly2(max(nbio.Handle), 1, 2, two) + nbio.close_poly3(max(nbio.Handle), 1, 2, 3, three) + + nbio.dial_poly({nbio.IP4_Address{127, 0, 0, 1}, 0}, 1, one) + nbio.dial_poly2({nbio.IP4_Address{127, 0, 0, 1}, 0}, 1, 2, two) + nbio.dial_poly3({nbio.IP4_Address{127, 0, 0, 1}, 0}, 1, 2, 3, three) + + nbio.recv_poly(TCP_SOCKET, {buf}, 1, one) + nbio.recv_poly2(TCP_SOCKET, {buf}, 1, 2, two) + nbio.recv_poly3(TCP_SOCKET, {buf}, 1, 2, 3, three) + + nbio.send_poly(TCP_SOCKET, {buf}, 1, one) + nbio.send_poly2(TCP_SOCKET, {buf}, 1, 2, two) + nbio.send_poly3(TCP_SOCKET, {buf}, 1, 2, 3, three) + + nbio.sendfile_poly(TCP_SOCKET, HANDLE, 1, one) + nbio.sendfile_poly2(TCP_SOCKET, HANDLE, 1, 2, two) + nbio.sendfile_poly3(TCP_SOCKET, HANDLE, 1, 2, 3, three) + + nbio.read_poly(HANDLE, 0, buf, 1, one) + nbio.read_poly2(HANDLE, 0, buf, 1, 2, two) + nbio.read_poly3(HANDLE, 0, buf, 1, 2, 3, three) + + nbio.write_poly(HANDLE, 0, buf, 1, one) + nbio.write_poly2(HANDLE, 0, buf, 1, 2, two) + nbio.write_poly3(HANDLE, 0, buf, 1, 2, 3, three) + + nbio.next_tick_poly(1, one) + nbio.next_tick_poly2(1, 2, two) + nbio.next_tick_poly3(1, 2, 3, three) + + nbio.timeout_poly(1, 1, one) + nbio.timeout_poly2(1, 1, 2, two) + nbio.timeout_poly3(1, 1, 2, 3, three) + + nbio.poll_poly(TCP_SOCKET, .Receive, 1, one) + nbio.poll_poly2(TCP_SOCKET, .Receive, 1, 2, two) + nbio.poll_poly3(TCP_SOCKET, .Receive, 1, 2, 3, three) + + nbio.open_poly("", 1, one) + nbio.open_poly2("", 1, 2, two) + nbio.open_poly3("", 1, 2, 3, three) + + nbio.stat_poly(HANDLE, 1, one) + nbio.stat_poly2(HANDLE, 1, 2, two) + nbio.stat_poly3(HANDLE, 1, 2, 3, three) + + ev(t, n, 0) // Test that no callbacks are ran before the loop is ticked. + ev(t, nbio.run(), nil) + ev(t, n, NUM_TESTS) // Test that all callbacks have ran. + } +} + +@(test) +two_ops_at_the_same_time :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + server, err := nbio.create_udp_socket(.IP4) + ev(t, err, nil) + defer nbio.close(server) + + berr := nbio.bind(server, {nbio.IP4_Loopback, 0}) + ev(t, berr, nil) + ep, eperr := nbio.bound_endpoint(server) + ev(t, eperr, nil) + + // Server. + { + nbio.poll_poly(server, .Receive, t, on_poll) + + on_poll :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.poll.result, nbio.Poll_Result.Ready) + } + + buf: [128]byte + nbio.recv_poly(server, {buf[:]}, t, on_recv) + + on_recv :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.recv.err, nil) + } + } + + // Client. + { + sock, cerr := nbio.create_udp_socket(.IP4) + ev(t, cerr, nil) + + // Make sure the server would block. + nbio.timeout_poly3(time.Millisecond*10, t, sock, ep.port, on_timeout) + + on_timeout :: proc(op: ^nbio.Operation, t: ^testing.T, sock: nbio.UDP_Socket, port: int) { + nbio.send_poly(sock, {transmute([]byte)string("Hiya")}, t, on_send, {nbio.IP4_Loopback, port}) + } + + on_send :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.send.err, nil) + ev(t, op.send.sent, 4) + + // Do another send after a bit, some backends don't trigger both ops when one was enough to + // use up the socket. + nbio.timeout_poly3(time.Millisecond*10, t, op.send.socket.(nbio.UDP_Socket), op.send.endpoint.port, on_timeout2) + } + + on_timeout2 :: proc(op: ^nbio.Operation, t: ^testing.T, sock: nbio.UDP_Socket, port: int) { + nbio.send_poly(sock, {transmute([]byte)string("Hiya")}, t, on_send2, {nbio.IP4_Loopback, port}) + } + + on_send2 :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.send.err, nil) + ev(t, op.send.sent, 4) + + nbio.close(op.send.socket.(nbio.UDP_Socket)) + } + } + + ev(t, nbio.run(), nil) + } +} + +@(test) +timeout :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + start := time.now() + + nbio.timeout_poly2(time.Millisecond*20, t, start, on_timeout) + + on_timeout :: proc(op: ^nbio.Operation, t: ^testing.T, start: time.Time) { + since := time.since(start) + log.infof("timeout ran after: %v", since) + testing.expect(t, since >= time.Millisecond*19) // A ms grace, for some reason it is sometimes ran after 19.8ms. + if since < 20 { + log.warnf("timeout ran after: %v", since) + } + } + + ev(t, nbio.run(), nil) + } +} + +@(test) +wake_up :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, time.Minute) + if event_loop_guard(t) { + for _ in 0..<2 { + sock, _ := open_next_available_local_port(t) + + // Add an accept, with nobody dialling this should block the event loop forever. + accept := nbio.accept(sock, proc(op: ^nbio.Operation) { + log.error("shouldn't be called") + }) + + // Make sure the accept is in progress. + ev(t, nbio.tick(timeout=0), nil) + + hit: bool + thr := thread.create_and_start_with_poly_data2(nbio.current_thread_event_loop(), &hit, proc(l: ^nbio.Event_Loop, hit: ^bool) { + hit^ = true + nbio.wake_up(l) + }, context) + defer thread.destroy(thr) + + // Should block forever until the thread calling wake_up will make it return. + ev(t, nbio.tick(), nil) + e(t, hit) + + nbio.remove(accept) + nbio.close(sock) + + ev(t, nbio.run(), nil) + ev(t, nbio.tick(timeout=0), nil) + } + } +} diff --git a/tests/core/nbio/net.odin b/tests/core/nbio/net.odin new file mode 100644 index 000000000..688ee0b45 --- /dev/null +++ b/tests/core/nbio/net.odin @@ -0,0 +1,400 @@ +package tests_nbio + +import "core:mem" +import "core:nbio" +import "core:net" +import "core:testing" +import "core:time" +import "core:log" + +open_next_available_local_port :: proc(t: ^testing.T, addr: net.Address = net.IP4_Loopback, loc := #caller_location) -> (sock: net.TCP_Socket, ep: net.Endpoint) { + err: net.Network_Error + sock, err = nbio.listen_tcp({addr, 0}) + if err != nil { + log.errorf("listen_tcp: %v", err, location=loc) + return + } + + ep, err = net.bound_endpoint(sock) + if err != nil { + log.errorf("bound_endpoint: %v", err, location=loc) + } + + return +} + +@(test) +client_and_server_send_recv :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + server, ep := open_next_available_local_port(t) + + CONTENT :: [20]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20} + + State :: struct { + server: net.TCP_Socket, + server_client: net.TCP_Socket, + client: net.TCP_Socket, + recv_buf: [20]byte, + send_buf: [20]byte, + } + + state := State{ + server = server, + send_buf = CONTENT, + } + + close_ok :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.close.err, nil) + } + + // Server + { + nbio.accept_poly2(server, t, &state, on_accept) + + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { + ev(t, op.accept.err, nil) + + state.server_client = op.accept.client + + log.debugf("accepted connection from: %v", op.accept.client_endpoint) + + nbio.recv_poly2(state.server_client, {state.recv_buf[:]}, t, state, on_recv) + } + + on_recv :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { + ev(t, op.recv.err, nil) + ev(t, op.recv.received, 20) + ev(t, state.recv_buf, CONTENT) + + nbio.close_poly(state.server_client, t, close_ok) + nbio.close_poly(state.server, t, close_ok) + } + + ev(t, nbio.tick(0), nil) + } + + // Client + { + nbio.dial_poly2(ep, t, &state, on_dial) + + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { + ev(t, op.dial.err, nil) + + state.client = op.dial.socket + + nbio.send_poly2(state.client, {state.send_buf[:]}, t, state, on_send) + } + + on_send :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { + ev(t, op.send.err, nil) + ev(t, op.send.sent, 20) + + nbio.close_poly(state.client, t, close_ok) + } + } + + ev(t, nbio.run(), nil) + } +} + +@(test) +close_and_remove_accept :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + server, _ := open_next_available_local_port(t) + + accept := nbio.accept_poly(server, t, proc(_: ^nbio.Operation, t: ^testing.T) { + testing.fail_now(t) + }) + + ev(t, nbio.tick(0), nil) + + nbio.close_poly(server, t, proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.close.err, nil) + }) + + nbio.remove(accept) + ev(t, nbio.run(), nil) + } +} + +// Tests that when a client calls `close` on it's socket, `recv` returns with `0, nil` (connection closed). +@(test) +close_errors_recv :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + server, ep := open_next_available_local_port(t) + + // Server + { + nbio.accept_poly(server, t, on_accept) + + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.accept.err, nil) + + bytes := make([]byte, 128, context.temp_allocator) + nbio.recv_poly(op.accept.client, {bytes}, t, on_recv) + } + + on_recv :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.recv.received, 0) + ev(t, op.recv.err, nil) + } + + ev(t, nbio.tick(0), nil) + } + + // Client + { + nbio.dial_poly(ep, t, on_dial) + + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.dial.err, nil) + nbio.close_poly(op.dial.socket, t, on_close) + } + + on_close :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.close.err, nil) + } + } + + ev(t, nbio.run(), nil) + } +} + +@(test) +ipv6 :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + server, ep := open_next_available_local_port(t, net.IP6_Loopback) + + nbio.accept_poly(server, t, on_accept) + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.accept.err, nil) + addr, is_ipv6 := op.accept.client_endpoint.address.(net.IP6_Address) + e(t, is_ipv6) + ev(t, addr, net.IP6_Loopback) + e(t, op.accept.client_endpoint.port != 0) + nbio.close(op.accept.client) + nbio.close(op.accept.socket) + } + + nbio.dial_poly(ep, t, on_dial) + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.dial.err, nil) + nbio.close(op.dial.socket) + } + + ev(t, nbio.run(), nil) + } +} + +@(test) +accept_timeout :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + sock, _ := open_next_available_local_port(t) + + hit: bool + nbio.accept_poly2(sock, t, &hit, on_accept, timeout=time.Millisecond) + + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T, hit: ^bool) { + hit^ = true + ev(t, op.accept.err, net.Accept_Error.Timeout) + nbio.close(op.accept.socket) + } + + ev(t, nbio.run(), nil) + + e(t, hit) + } +} + +@(test) +poll_timeout :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + sock, err := nbio.create_udp_socket(.IP4) + ev(t, err, nil) + berr := nbio.bind(sock, {nbio.IP4_Loopback, 0}) + ev(t, berr, nil) + + nbio.poll_poly(sock, .Receive, t, on_poll, time.Millisecond) + on_poll :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.poll.result, nbio.Poll_Result.Timeout) + } + + ev(t, nbio.run(), nil) + } +} + +/* +This test walks through the scenario where a user wants to `poll` in order to check if some other package (in this case `core:net`), +would be able to do an operation without blocking. + +It also tests whether a poll can be issues when it is already in a ready state. +And it tests big send/recv buffers being handled properly. +*/ +@(test) +poll :: proc(t: ^testing.T) { + if event_loop_guard(t) { +// testing.set_fail_timeout(t, time.Minute) + + can_recv: bool + + sock, ep := open_next_available_local_port(t) + + // Server + { + nbio.accept_poly2(sock, t, &can_recv, on_accept) + + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T, can_recv: ^bool) { + ev(t, op.accept.err, nil) + + check_recv :: proc(op: ^nbio.Operation, t: ^testing.T, can_recv: ^bool, client: net.TCP_Socket) { + // Not ready to unblock the client yet, requeue for after 10ms. + if !can_recv^ { + nbio.timeout_poly3(time.Millisecond * 10, t, can_recv, client, check_recv) + return + } + + free_all(context.temp_allocator) + + // Connection was closed by client, close server. + if op.type == .Recv && op.recv.received == 0 && op.recv.err == nil { + nbio.close(client) + return + } + + if op.type == .Recv { + log.debugf("received %M this time", op.recv.received) + } + + // Receive some data to unblock the client, which should complete the poll it does, allowing it to send data again. + buf, mem_err := make([]byte, mem.Gigabyte, context.temp_allocator) + ev(t, mem_err, nil) + nbio.recv_poly3(client, {buf}, t, can_recv, client, check_recv) + } + nbio.timeout_poly3(time.Millisecond * 10, t, can_recv, op.accept.client, check_recv) + } + + ev(t, nbio.tick(0), nil) + } + + // Client + { + nbio.dial_poly2(ep, t, &can_recv, on_dial) + + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T, can_recv: ^bool) { + ev(t, op.dial.err, nil) + + // Do a poll even though we know it's ready, so we can test that all implementations can handle that. + nbio.poll_poly2(op.dial.socket, .Send, t, can_recv, on_poll1) + } + + on_poll1 :: proc(op: ^nbio.Operation, t: ^testing.T, can_recv: ^bool) { + ev(t, op.poll.result, nil) + + // Send 4 GB of data, which in my experience causes a Would_Block error because we filled up the internal buffer. + buf, mem_err := make([]byte, mem.Gigabyte*4, context.temp_allocator) + ev(t, mem_err, nil) + + // Use `core:net` as example external code that doesn't care about the event loop. + net.set_blocking(op.poll.socket, false) + n, send_err := net.send(op.poll.socket, buf) + ev(t, send_err, net.TCP_Send_Error.Would_Block) + + log.debugf("blocking after %M", n) + + // Tell the server it can start issueing recv calls, so it unblocks us. + can_recv^ = true + + // Now poll again, when the server reads enough data it should complete, telling us we can send without blocking again. + nbio.poll_poly(op.poll.socket, .Send, t, on_poll2) + } + + on_poll2 :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.poll.result, nil) + + buf: [128]byte + bytes_written, send_err := net.send(op.poll.socket, buf[:]) + ev(t, bytes_written, 128) + ev(t, send_err, nil) + + nbio.close(op.poll.socket.(net.TCP_Socket)) + } + } + + ev(t, nbio.run(), nil) + nbio.close(sock) + ev(t, nbio.run(), nil) + } +} + +@(test) +sendfile :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + CONTENT :: #load(#file) + + sock, ep := open_next_available_local_port(t) + + // Server + { + nbio.accept_poly(sock, t, on_accept) + + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.accept.err, nil) + e(t, op.accept.client != 0) + + log.debugf("connection from: %v", op.accept.client_endpoint) + nbio.open_poly3(#file, t, op.accept.socket, op.accept.client, on_open) + } + + on_open :: proc(op: ^nbio.Operation, t: ^testing.T, server, client: net.TCP_Socket) { + ev(t, op.open.err, nil) + + nbio.sendfile_poly2(client, op.open.handle, t, server, on_sendfile) + } + + on_sendfile :: proc(op: ^nbio.Operation, t: ^testing.T, server: net.TCP_Socket) { + ev(t, op.sendfile.err, nil) + ev(t, op.sendfile.sent, len(CONTENT)) + + nbio.close(op.sendfile.file) + nbio.close(op.sendfile.socket) + nbio.close(server) + } + } + + // Client + { + nbio.dial_poly(ep, t, on_dial) + + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.dial.err, nil) + + buf := make([]byte, len(CONTENT), context.temp_allocator) + nbio.recv_poly(op.dial.socket, {buf}, t, on_recv, all=true) + } + + on_recv :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.recv.err, nil) + ev(t, op.recv.received, len(CONTENT)) + ev(t, string(op.recv.bufs[0]), string(CONTENT)) + + nbio.close(op.recv.socket.(net.TCP_Socket)) + } + } + + ev(t, nbio.run(), nil) + } +} diff --git a/tests/core/nbio/remove.odin b/tests/core/nbio/remove.odin new file mode 100644 index 000000000..063c2cf58 --- /dev/null +++ b/tests/core/nbio/remove.odin @@ -0,0 +1,247 @@ +package tests_nbio + +import "core:nbio" +import "core:net" +import "core:testing" +import "core:time" +import "core:log" + +// Removals are pretty complex. + +@(test) +immediate_remove_of_sendfile :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + sock, ep := open_next_available_local_port(t) + + // Server + { + nbio.accept_poly(sock, t, on_accept) + + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.accept.err, nil) + e(t, op.accept.client != 0) + + log.debugf("connection from: %v", op.accept.client_endpoint) + nbio.open_poly3(#file, t, op.accept.socket, op.accept.client, on_open) + } + + on_open :: proc(op: ^nbio.Operation, t: ^testing.T, server, client: net.TCP_Socket) { + ev(t, op.open.err, nil) + e(t, op.open.handle != 0) + + sendfile_op := nbio.sendfile_poly2(client, op.open.handle, t, server, on_sendfile) + + // oh no changed my mind. + nbio.remove(sendfile_op) + + nbio.close(op.open.handle) + nbio.close(client) + nbio.close(server) + } + + on_sendfile :: proc(op: ^nbio.Operation, t: ^testing.T, server: net.TCP_Socket) { + log.error("on_sendfile shouldn't be called") + } + } + + // Client + { + nbio.dial_poly(ep, t, on_dial) + + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.dial.err, nil) + + buf := make([]byte, 128, context.temp_allocator) + nbio.recv_poly(op.dial.socket, {buf}, t, on_recv) + } + + on_recv :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.recv.err, nil) + + nbio.close(op.recv.socket.(net.TCP_Socket)) + } + } + + ev(t, nbio.run(), nil) + } +} + +@(test) +immediate_remove_of_sendfile_without_stat :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + sock, ep := open_next_available_local_port(t) + + // Server + { + nbio.accept_poly(sock, t, on_accept) + + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.accept.err, nil) + e(t, op.accept.client != 0) + + log.debugf("connection from: %v", op.accept.client_endpoint) + nbio.open_poly3(#file, t, op.accept.socket, op.accept.client, on_open) + } + + on_open :: proc(op: ^nbio.Operation, t: ^testing.T, server, client: net.TCP_Socket) { + ev(t, op.open.err, nil) + e(t, op.open.handle != 0) + + nbio.stat_poly3(op.open.handle, t, server, client, on_stat) + } + + on_stat :: proc(op: ^nbio.Operation, t: ^testing.T, server, client: net.TCP_Socket) { + ev(t, op.stat.err, nil) + + sendfile_op := nbio.sendfile_poly2(client, op.stat.handle, t, server, on_sendfile, nbytes=int(op.stat.size)) + + // oh no changed my mind. + nbio.remove(sendfile_op) + + nbio.timeout_poly3(time.Millisecond * 10, op.stat.handle, client, server, proc(op: ^nbio.Operation, p1: nbio.Handle, p2, p3: net.TCP_Socket){ + nbio.close(p1) + nbio.close(p2) + nbio.close(p3) + }) + } + + on_sendfile :: proc(op: ^nbio.Operation, t: ^testing.T, server: net.TCP_Socket) { + log.error("on_sendfile shouldn't be called") + } + } + + // Client + { + nbio.dial_poly(ep, t, on_dial) + + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.dial.err, nil) + + buf := make([]byte, 128, context.temp_allocator) + nbio.recv_poly(op.dial.socket, {buf}, t, on_recv) + } + + on_recv :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.recv.err, nil) + + nbio.close(op.recv.socket.(net.TCP_Socket)) + } + } + + ev(t, nbio.run(), nil) + } +} + +// Open should free the temporary memory allocated for the path when removed. +// Can't really test that though, so should be checked manually that the internal callback is called but not the external. +@(test) +remove_open :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + open := nbio.open(#file, on_open) + nbio.remove(open) + + on_open :: proc(op: ^nbio.Operation) { + log.error("on_open shouldn't be called") + } + + ev(t, nbio.run(), nil) + } +} + +// Dial should close the socket when removed. +// Can't really test that though, so should be checked manually that the internal callback is called but not the external. +@(test) +remove_dial :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + sock, ep := open_next_available_local_port(t) + defer nbio.close(sock) + + dial := nbio.dial(ep, on_dial) + nbio.remove(dial) + + on_dial :: proc(op: ^nbio.Operation) { + log.error("on_dial shouldn't be called") + } + + ev(t, nbio.run(), nil) + } +} + +@(test) +remove_next_tick :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + nt := nbio.next_tick_poly(t, proc(op: ^nbio.Operation, t: ^testing.T) { + log.error("shouldn't be called") + }) + nbio.remove(nt) + + ev(t, nbio.run(), nil) + } +} + +@(test) +remove_timeout :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + hit: bool + timeout := nbio.timeout_poly(time.Second, &hit, proc(_: ^nbio.Operation, hit: ^bool) { + hit^ = true + }) + + nbio.remove(timeout) + + ev(t, nbio.run(), nil) + + e(t, !hit) + } +} + +@(test) +remove_multiple_poll :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + sock, ep := open_next_available_local_port(t) + defer nbio.close(sock) + + hit: bool + + first := nbio.poll(sock, .Receive, on_poll) + nbio.poll_poly2(sock, .Receive, t, &hit, on_poll2) + + on_poll :: proc(op: ^nbio.Operation) { + log.error("shouldn't be called") + } + + on_poll2 :: proc(op: ^nbio.Operation, t: ^testing.T, hit: ^bool) { + ev(t, op.poll.result, nbio.Poll_Result.Ready) + hit^ = true + } + + ev(t, nbio.tick(0), nil) + + nbio.remove(first) + + ev(t, nbio.tick(0), nil) + + nbio.dial_poly(ep, t, on_dial) + + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T) { + ev(t, op.dial.err, nil) + } + + ev(t, nbio.run(), nil) + e(t, hit) + } +} diff --git a/tests/core/normal.odin b/tests/core/normal.odin index 42da389d2..d0889bf89 100644 --- a/tests/core/normal.odin +++ b/tests/core/normal.odin @@ -32,6 +32,7 @@ download_assets :: proc "contextless" () { @(require) import "math/noise" @(require) import "math/rand" @(require) import "mem" +@(require) import "nbio" @(require) import "net" @(require) import "odin" @(require) import "os" From ef84b24b6882687f003ca8a3f59df4cd3db71409 Mon Sep 17 00:00:00 2001 From: Wassim Alhajomar <75145262+Wassimulator@users.noreply.github.com> Date: Mon, 12 Jan 2026 12:39:57 +0100 Subject: [PATCH 178/766] cleanup --- core/thread/thread_pool.odin | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/core/thread/thread_pool.odin b/core/thread/thread_pool.odin index d7a03d04c..ea772c725 100644 --- a/core/thread/thread_pool.odin +++ b/core/thread/thread_pool.odin @@ -20,6 +20,9 @@ Task :: struct { allocator: mem.Allocator, } +Thread_Init_Proc :: #type proc(thread_index: int, user_data: rawptr) +Thread_Fini_Proc :: #type proc(thread_index: int, user_data: rawptr) + // Do not access the pool's members directly while the pool threads are running, // since they use different kinds of locking and mutual exclusion devices. // Careless access can and will lead to nasty bugs. Once initialized, the @@ -36,6 +39,13 @@ Pool :: struct { num_done: int, // end of atomics + // called once per thread at startup + thread_init_proc: Thread_Init_Proc, + thread_init_data: rawptr, + // called once per thread at shutdown + thread_fini_proc: Thread_Fini_Proc, + thread_fini_data: rawptr, + is_running: bool, threads: []^Thread, @@ -55,6 +65,10 @@ pool_thread_runner :: proc(t: ^Thread) { data := cast(^Pool_Thread_Data)t.data pool := data.pool + if pool.thread_init_proc != nil { + pool.thread_init_proc(t.user_index, pool.thread_init_data) + } + for intrinsics.atomic_load(&pool.is_running) { sync.wait(&pool.sem_available) @@ -66,6 +80,10 @@ pool_thread_runner :: proc(t: ^Thread) { } } + if pool.thread_fini_proc != nil { + pool.thread_fini_proc(t.user_index, pool.thread_fini_data) + } + sync.post(&pool.sem_available, 1) } @@ -73,13 +91,26 @@ pool_thread_runner :: proc(t: ^Thread) { // it is destroyed. // // The thread pool requires an allocator which it either owns, or which is thread safe. -pool_init :: proc(pool: ^Pool, allocator: mem.Allocator, thread_count: int) { +pool_init :: proc( + pool: ^Pool, + allocator: mem.Allocator, + thread_count: int, + init_proc: Thread_Init_Proc = nil, + init_data: rawptr = nil, + fini_proc: Thread_Init_Proc = nil, + fini_data: rawptr = nil, +){ context.allocator = allocator pool.allocator = allocator queue.init(&pool.tasks) pool.tasks_done = make([dynamic]Task) pool.threads = make([]^Thread, max(thread_count, 1)) + pool.thread_init_proc = init_proc + pool.thread_fini_proc = fini_proc + pool.thread_init_data = init_data + pool.thread_fini_data = fini_data + pool.is_running = true for _, i in pool.threads { From ebaf8779815833b816b98cc370c0cf74b1ee2bae Mon Sep 17 00:00:00 2001 From: Paul Page Date: Mon, 12 Jan 2026 16:31:40 -0600 Subject: [PATCH 179/766] Update Orca bindings --- core/sys/orca/orca.odin | 238 ++++++++++++++++++++++++---------------- 1 file changed, 142 insertions(+), 96 deletions(-) diff --git a/core/sys/orca/orca.odin b/core/sys/orca/orca.odin index a36c5fa2a..ba47a13fa 100644 --- a/core/sys/orca/orca.odin +++ b/core/sys/orca/orca.odin @@ -1,6 +1,7 @@ // Bindings for the Orca platform // // See: [[ https://orca-app.dev ]] + package orca import "core:c" @@ -204,6 +205,26 @@ foreign { mat2x3_rotate :: proc(radians: f32) -> mat2x3 --- // Return a 2x3 matrix representing a translation. mat2x3_translate :: proc(x: f32, y: f32) -> mat2x3 --- + // Return a 2x3 matrix representing a scale. + mat2x3_scale :: proc(x: f32, y: f32) -> mat2x3 --- +} + +//////////////////////////////////////////////////////////////////////////////// +// API for sampling the system clock. +//////////////////////////////////////////////////////////////////////////////// + +clock_kind :: enum u32 { + // A clock incrementing monotonically. + MONOTONIC = 0, + // A clock incrementing monotonically during uptime. + UPTIME = 1, + // A clock driven by the platform time. + DATE = 2, +} + +@(default_calling_convention="c", link_prefix="oc_") +foreign { + clock_time :: proc(clock: clock_kind) -> f64 --- } //////////////////////////////////////////////////////////////////////////////// @@ -354,10 +375,14 @@ foreign { arena_init_with_options :: proc(arena: ^arena, options: ^arena_options) --- // Release all resources allocated to a memory arena. arena_cleanup :: proc(arena: ^arena) --- - // Allocate a block of memory from an arena. + // Allocate a zero initialized block of memory from an arena. arena_push :: proc(arena: ^arena, size: u64) -> rawptr --- - // Allocate an aligned block of memory from an arena. + // Allocate an aligned, zero initialized block of memory from an arena. arena_push_aligned :: proc(arena: ^arena, size: u64, alignment: u32) -> rawptr --- + // Allocate a block of memory from an arena. + arena_push_uninitialized :: proc(arena: ^arena, size: u64) -> rawptr --- + // Allocate an aligned block of memory from an arena. + arena_push_aligned_uninitialized :: proc(arena: ^arena, size: u64, alignment: u32) -> rawptr --- // Reset an arena. All memory that was previously allocated from this arena is released to the arena, and can be reallocated by later calls to `oc_arena_push` and similar functions. No memory is actually released _to the system_. arena_clear :: proc(arena: ^arena) --- // Begin a memory scope. This creates an `oc_arena_scope` object that stores the current offset of the arena. The arena can later be reset to that offset by calling `oc_arena_scope_end`, releasing all memory that was allocated within the scope to the arena. @@ -530,15 +555,15 @@ utf8_status :: enum u32 { // The operation unexpectedly encountered the end of the utf8 sequence. OUT_OF_BOUNDS = 1, // A continuation byte was encountered where a leading byte was expected. - UNEXPECTED_CONTINUATION_BYTE = 3, + UNEXPECTED_CONTINUATION_BYTE = 2, // A leading byte was encountered in the middle of the encoding of utf8 codepoint. - UNEXPECTED_LEADING_BYTE = 4, + UNEXPECTED_LEADING_BYTE = 3, // The utf8 sequence contains an invalid byte. - INVALID_BYTE = 5, + INVALID_BYTE = 4, // The operation encountered an invalid utf8 codepoint. - INVALID_CODEPOINT = 6, + INVALID_CODEPOINT = 5, // The utf8 sequence contains an overlong encoding of a utf8 codepoint. - OVERLONG_ENCODING = 7, + OVERLONG_ENCODING = 6, } // A type representing the result of decoding of utf8-encoded codepoint. @@ -1044,6 +1069,9 @@ file_dialog_result :: struct { selection: str8_list, } +// An opaque handle identifying a window. +window :: distinct u64 + @(default_calling_convention="c", link_prefix="oc_") foreign { // Set the title of the application's window. @@ -1054,8 +1082,93 @@ foreign { request_quit :: proc() --- // Convert a scancode to a keycode, according to current keyboard layout. scancode_to_keycode :: proc(scanCode: scan_code) -> key_code --- +} + +//////////////////////////////////////////////////////////////////////////////// +// Application user input. +//////////////////////////////////////////////////////////////////////////////// + +key_state :: struct { + lastUpdate: u64, + transitionCount: u32, + repeatCount: u32, + down: bool, + sysClicked: bool, + sysDoubleClicked: bool, + sysTripleClicked: bool, +} + +keyboard_state :: struct { + keys: [349]key_state, + mods: keymod_flags, +} + +mouse_state :: struct { + lastUpdate: u64, + posValid: bool, + pos: vec2, + delta: vec2, + wheel: vec2, + using _: struct #raw_union { + buttons: [5]key_state, + using _: struct { + left: key_state, + right: key_state, + middle: key_state, + ext1: key_state, + ext2: key_state, + }, + }, +} + +BACKING_SIZE :: 64 + +text_state :: struct { + lastUpdate: u64, + backing: [64]utf32, + codePoints: str32, +} + +clipboard_state :: struct { + lastUpdate: u64, + pastedText: str8, +} + +input_state :: struct { + frameCounter: u64, + keyboard: keyboard_state, + mouse: mouse_state, + text: text_state, + clipboard: clipboard_state, +} + +@(default_calling_convention="c", link_prefix="oc_") +foreign { + input_process_event :: proc(arena: ^arena, state: ^input_state, event: ^event) --- + input_next_frame :: proc(state: ^input_state) --- + key_down :: proc(state: ^input_state, key: key_code) -> bool --- + key_press_count :: proc(state: ^input_state, key: key_code) -> u8 --- + key_release_count :: proc(state: ^input_state, key: key_code) -> u8 --- + key_repeat_count :: proc(state: ^input_state, key: key_code) -> u8 --- + key_down_scancode :: proc(state: ^input_state, key: scan_code) -> bool --- + key_press_count_scancode :: proc(state: ^input_state, key: scan_code) -> u8 --- + key_release_count_scancode :: proc(state: ^input_state, key: scan_code) -> u8 --- + key_repeat_count_scancode :: proc(state: ^input_state, key: scan_code) -> u8 --- + mouse_down :: proc(state: ^input_state, button: mouse_button) -> bool --- + mouse_pressed :: proc(state: ^input_state, button: mouse_button) -> u8 --- + mouse_released :: proc(state: ^input_state, button: mouse_button) -> u8 --- + mouse_clicked :: proc(state: ^input_state, button: mouse_button) -> bool --- + mouse_double_clicked :: proc(state: ^input_state, button: mouse_button) -> bool --- + mouse_position :: proc(state: ^input_state) -> vec2 --- + mouse_delta :: proc(state: ^input_state) -> vec2 --- + mouse_wheel :: proc(state: ^input_state) -> vec2 --- + input_text_utf32 :: proc(arena: ^arena, state: ^input_state) -> str32 --- + input_text_utf8 :: proc(arena: ^arena, state: ^input_state) -> str8 --- // Put a string in the clipboard. clipboard_set_string :: proc(string: str8) --- + clipboard_pasted :: proc(state: ^input_state) -> bool --- + clipboard_pasted_text :: proc(state: ^input_state) -> str8 --- + key_mods :: proc(state: ^input_state) -> keymod_flags --- } //////////////////////////////////////////////////////////////////////////////// @@ -1073,7 +1186,7 @@ file :: distinct u64 // Flags for the `oc_file_open()` function. file_open_flag :: enum u16 { // Open the file in 'append' mode. All writes append data at the end of the file. - APPEND = 1, + APPEND = 0, // Truncate the file to 0 bytes when opening. TRUNCATE, // Create the file if it does not exist. @@ -1090,7 +1203,7 @@ file_open_flags :: bit_set[file_open_flag; u16] // This enum describes the access permissions of a file handle. file_access_flag :: enum u16 { // The file handle can be used for reading from the file. - READ = 1, + READ = 0, // The file handle can be used for writing to the file. WRITE, } @@ -1242,7 +1355,7 @@ file_type :: enum u32 { // A type describing file permissions. file_perm_flag :: enum u16 { - OTHER_EXEC = 1, + OTHER_EXEC = 0, OTHER_WRITE, OTHER_READ, GROUP_EXEC, @@ -1272,6 +1385,18 @@ file_status :: struct { modificationDate: datestamp, } +// An type describing a list of enumerated files in a given directory. +file_list :: struct { + list: list, + eltCount: u64, +} + +file_listdir_elt :: struct { + listElt: list_elt, + basename: str8, + type: file_type, +} + @(default_calling_convention="c", link_prefix="oc_") foreign { // Send a single I/O request and wait for its completion. @@ -1299,6 +1424,7 @@ foreign { file_get_status :: proc(file: file) -> file_status --- file_size :: proc(file: file) -> u64 --- file_open_with_request :: proc(path: str8, rights: file_access, flags: file_open_flags) -> file --- + file_listdir :: proc(arena: ^arena, directory: str8) -> file_list --- } //////////////////////////////////////////////////////////////////////////////// @@ -1703,87 +1829,6 @@ foreign { // Graphical User Interface API. //////////////////////////////////////////////////////////////////////////////// -key_state :: struct { - lastUpdate: u64, - transitionCount: u32, - repeatCount: u32, - down: bool, - sysClicked: bool, - sysDoubleClicked: bool, - sysTripleClicked: bool, -} - -keyboard_state :: struct { - keys: [349]key_state, - mods: keymod_flags, -} - -mouse_state :: struct { - lastUpdate: u64, - posValid: bool, - pos: vec2, - delta: vec2, - wheel: vec2, - using _: struct #raw_union { - buttons: [5]key_state, - using _: struct { - left: key_state, - right: key_state, - middle: key_state, - ext1: key_state, - ext2: key_state, - }, - }, -} - -BACKING_SIZE :: 64 - -text_state :: struct { - lastUpdate: u64, - backing: [64]utf32, - codePoints: str32, -} - -clipboard_state :: struct { - lastUpdate: u64, - pastedText: str8, -} - -input_state :: struct { - frameCounter: u64, - keyboard: keyboard_state, - mouse: mouse_state, - text: text_state, - clipboard: clipboard_state, -} - -@(default_calling_convention="c", link_prefix="oc_") -foreign { - input_process_event :: proc(arena: ^arena, state: ^input_state, event: ^event) --- - input_next_frame :: proc(state: ^input_state) --- - key_down :: proc(state: ^input_state, key: key_code) -> bool --- - key_press_count :: proc(state: ^input_state, key: key_code) -> u8 --- - key_release_count :: proc(state: ^input_state, key: key_code) -> u8 --- - key_repeat_count :: proc(state: ^input_state, key: key_code) -> u8 --- - key_down_scancode :: proc(state: ^input_state, key: scan_code) -> bool --- - key_press_count_scancode :: proc(state: ^input_state, key: scan_code) -> u8 --- - key_release_count_scancode :: proc(state: ^input_state, key: scan_code) -> u8 --- - key_repeat_count_scancode :: proc(state: ^input_state, key: scan_code) -> u8 --- - mouse_down :: proc(state: ^input_state, button: mouse_button) -> bool --- - mouse_pressed :: proc(state: ^input_state, button: mouse_button) -> u8 --- - mouse_released :: proc(state: ^input_state, button: mouse_button) -> u8 --- - mouse_clicked :: proc(state: ^input_state, button: mouse_button) -> bool --- - mouse_double_clicked :: proc(state: ^input_state, button: mouse_button) -> bool --- - mouse_position :: proc(state: ^input_state) -> vec2 --- - mouse_delta :: proc(state: ^input_state) -> vec2 --- - mouse_wheel :: proc(state: ^input_state) -> vec2 --- - input_text_utf32 :: proc(arena: ^arena, state: ^input_state) -> str32 --- - input_text_utf8 :: proc(arena: ^arena, state: ^input_state) -> str8 --- - clipboard_pasted :: proc(state: ^input_state) -> bool --- - clipboard_pasted_text :: proc(state: ^input_state) -> str8 --- - key_mods :: proc(state: ^input_state) -> keymod_flags --- -} - //////////////////////////////////////////////////////////////////////////////// // Graphical User Interface Core API. //////////////////////////////////////////////////////////////////////////////// @@ -1857,11 +1902,11 @@ ui_attribute_mask :: enum u32 { SIZE_WIDTH = 1, SIZE_HEIGHT = 2, LAYOUT_AXIS = 4, - LAYOUT_ALIGN_X = 64, - LAYOUT_ALIGN_Y = 128, - LAYOUT_SPACING = 32, LAYOUT_MARGIN_X = 8, LAYOUT_MARGIN_Y = 16, + LAYOUT_SPACING = 32, + LAYOUT_ALIGN_X = 64, + LAYOUT_ALIGN_Y = 128, FLOATING_X = 256, FLOATING_Y = 512, FLOAT_TARGET_X = 1024, @@ -1873,10 +1918,10 @@ ui_attribute_mask :: enum u32 { COLOR = 65536, BG_COLOR = 131072, BORDER_COLOR = 262144, - BORDER_SIZE = 2097152, - ROUNDNESS = 4194304, FONT = 524288, FONT_SIZE = 1048576, + BORDER_SIZE = 2097152, + ROUNDNESS = 4194304, DRAW_MASK = 8388608, ANIMATION_TIME = 16777216, ANIMATION_MASK = 33554432, @@ -1898,6 +1943,7 @@ ui_box_size :: [2]ui_size ui_box_floating :: [2]bool +// These bits *disable* the corresponding element when they're set. ui_draw_mask :: enum u32 { BACKGROUND = 1, BORDER = 2, From 7e7cd755275e768c114e4b778fd9552197f17f35 Mon Sep 17 00:00:00 2001 From: Paul Page Date: Mon, 12 Jan 2026 16:52:57 -0600 Subject: [PATCH 180/766] remove unneeded manual definitions --- core/sys/orca/orca.odin | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/core/sys/orca/orca.odin b/core/sys/orca/orca.odin index ba47a13fa..a0fe0a041 100644 --- a/core/sys/orca/orca.odin +++ b/core/sys/orca/orca.odin @@ -8,9 +8,6 @@ import "core:c" char :: c.char -// currently missing in the api.json -window :: distinct u64 - // currently missing in the api.json pool :: struct { arena: arena, @@ -143,17 +140,6 @@ UNICODE_VARIATION_SELECTORS_SUPPLEMENT :: unicode_range { 0xe0100, 239 } UNICODE_SUPPLEMENTARY_PRIVATE_USE_AREA_A :: unicode_range { 0xf0000, 65533 } UNICODE_SUPPLEMENTARY_PRIVATE_USE_AREA_B :: unicode_range { 0x100000, 65533 } -clock_kind :: enum c.int { - MONOTONIC, - UPTIME, - DATE, -} - -@(default_calling_convention="c", link_prefix="oc_") -foreign { - clock_time :: proc(clock: clock_kind) -> f64 --- -} - file_write_slice :: proc(file: file, slice: []char) -> u64 { return file_write(file, u64(len(slice)), raw_data(slice)) } From 4ae02aaacf3ccb9791e01fd3d095b9579cf072d8 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 13 Jan 2026 19:38:10 +0100 Subject: [PATCH 181/766] pool: explicit memory ordering and improved destroy --- core/container/pool/pool.odin | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/core/container/pool/pool.odin b/core/container/pool/pool.odin index 93eddb514..d3e815351 100644 --- a/core/container/pool/pool.odin +++ b/core/container/pool/pool.odin @@ -41,26 +41,33 @@ init :: proc(p: ^Pool($T), $link_field: string, block_size: uint = DEFAULT_BLOCK } destroy :: proc(p: ^Pool($T)) { - for elem := p.free_list; elem != nil; elem = _get_next(p, elem) { - _unpoison_elem(p, elem) - free(elem, _pool_arena_allocator(&p.arena)) + elem := sync.atomic_exchange_explicit(&p.free_list, nil, .Acquire) + + sync.atomic_store_explicit(&p.num_ready, 0, .Relaxed) + assert(sync.atomic_load_explicit(&p.num_outstanding, .Relaxed) == 0) + + when .Address in ODIN_SANITIZER_FLAGS { + for ; elem != nil; elem = _get_next(p, elem) { + _unpoison_elem(p, elem) + } } _pool_arena_destroy(&p.arena) + p.arena = {} } @(require_results) get :: proc(p: ^Pool($T)) -> (elem: ^T, err: mem.Allocator_Error) #optional_allocator_error { - sync.atomic_add_explicit(&p.num_outstanding, 1, .Relaxed) + defer sync.atomic_add_explicit(&p.num_outstanding, 1, .Relaxed) for { - elem = sync.atomic_load(&p.free_list) + elem = sync.atomic_load_explicit(&p.free_list, .Acquire) if elem == nil { // NOTE: pool arena has an internal lock. return new(T, _pool_arena_allocator(&p.arena)) } - if _, ok := sync.atomic_compare_exchange_weak(&p.free_list, elem, _get_next(p, elem)); ok { + if _, ok := sync.atomic_compare_exchange_weak_explicit(&p.free_list, elem, _get_next(p, elem), .Acquire, .Relaxed); ok { _set_next(p, elem, nil) _unpoison_elem(p, elem) sync.atomic_sub_explicit(&p.num_ready, 1, .Relaxed) @@ -77,9 +84,9 @@ put :: proc(p: ^Pool($T), elem: ^T) { defer sync.atomic_add_explicit(&p.num_ready, 1, .Relaxed) for { - head := sync.atomic_load(&p.free_list) + head := sync.atomic_load_explicit(&p.free_list, .Relaxed) _set_next(p, elem, head) - if _, ok := sync.atomic_compare_exchange_weak(&p.free_list, head, elem); ok { + if _, ok := sync.atomic_compare_exchange_weak_explicit(&p.free_list, head, elem, .Release, .Relaxed); ok { return } } From 8f5702e69eaeda44008bf0b6539a192fe9d74419 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 13 Jan 2026 19:38:27 +0100 Subject: [PATCH 182/766] nbio: reorder Operation fields to be more logical --- core/nbio/nbio.odin | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/nbio/nbio.odin b/core/nbio/nbio.odin index 16664ea9f..274cc5291 100644 --- a/core/nbio/nbio.odin +++ b/core/nbio/nbio.odin @@ -42,16 +42,17 @@ MAX_USER_ARGUMENTS :: #config(NBIO_MAX_USER_ARGUMENTS, 4) #assert(MAX_USER_ARGUMENTS >= 4) Operation :: struct { + cb: Callback, + user_data: [MAX_USER_ARGUMENTS + 1]rawptr, + detached: bool, + type: Operation_Type, + using specifics: Specifics, + _impl: _Operation `fmt:"-"`, using _: struct #raw_union { _pool_link: ^Operation, l: ^Event_Loop, }, - cb: Callback, - using _specifics: Specifics, - user_data: [MAX_USER_ARGUMENTS + 1]rawptr, - type: Operation_Type, - detached: bool, } Specifics :: struct #raw_union { From c637679917397417a4f15e5ee93dc96dc44c9baa Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 13 Jan 2026 19:46:46 +0100 Subject: [PATCH 183/766] nbio: don't rely on the private _impl being the first field --- core/nbio/impl_windows.odin | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/core/nbio/impl_windows.odin b/core/nbio/impl_windows.odin index 7f98c7490..4610d4754 100644 --- a/core/nbio/impl_windows.odin +++ b/core/nbio/impl_windows.odin @@ -37,11 +37,9 @@ MAX_RW :: mem.Gigabyte @(private="package") _Operation :: struct { - over: win.OVERLAPPED, - timeout: ^Operation, + over: win.OVERLAPPED, + timeout: ^Operation, } -#assert(offset_of(Operation, _impl) == 0, "needs to be the first field to work") -#assert(offset_of(_Operation, over) == 0, "needs to be the first field to work") @(private="package") _Accept :: struct { @@ -203,10 +201,7 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { for event in events[:entries_removed] { if event.lpCompletionKey == COMPLETION_KEY_WAKE_UP { continue } assert(event.lpOverlapped != nil) - - // This is actually pointing at the Completion.over field, but because it is the first field - // It is also a valid pointer to the Completion struct. - op := (^Operation)(event.lpOverlapped) + op := container_of(container_of(event.lpOverlapped, _Operation, "over"), Operation, "_impl") handle_completed(op) } From 4af4b2f5757a8d45aba6bf5db5c99faf63150173 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 13 Jan 2026 19:47:09 +0100 Subject: [PATCH 184/766] pool: use `elem` in else of the when statement (vet issue) --- core/container/pool/pool.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/container/pool/pool.odin b/core/container/pool/pool.odin index d3e815351..425d6a0fb 100644 --- a/core/container/pool/pool.odin +++ b/core/container/pool/pool.odin @@ -50,6 +50,8 @@ destroy :: proc(p: ^Pool($T)) { for ; elem != nil; elem = _get_next(p, elem) { _unpoison_elem(p, elem) } + } else { + _ = elem } _pool_arena_destroy(&p.arena) From 622fa818bcc7521fefa7786b3112c78adb18c31b Mon Sep 17 00:00:00 2001 From: Fabrice <67000409+Fabbboy@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:56:40 +0100 Subject: [PATCH 185/766] Adds static linking to non-windows platforms (#6057) --- src/linker.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/linker.cpp b/src/linker.cpp index c2a3ee928..c68417994 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -737,7 +737,21 @@ try_cross_linking:; } if (build_context.build_mode == BuildMode_StaticLibrary) { - compiler_error("TODO(bill): -build-mode:static on non-windows targets"); + TIME_SECTION("Static Library Creation"); + + gbString ar_command = gb_string_make(heap_allocator(), ""); + defer (gb_string_free(ar_command)); + + ar_command = gb_string_appendc(ar_command, "ar rcs "); + ar_command = gb_string_append_fmt(ar_command, "\"%.*s\" ", LIT(output_filename)); + ar_command = gb_string_appendc(ar_command, object_files); + + result = system_exec_command_line_app("ar", ar_command); + if (result) { + return result; + } + + return result; } // NOTE(dweiler): We use clang as a frontend for the linker as there are From 0c3f3f536bd802ee8cdb0d8cf844c3962513a251 Mon Sep 17 00:00:00 2001 From: Znarf <90558133+FrancisTheCat@users.noreply.github.com> Date: Tue, 13 Jan 2026 21:02:08 +0100 Subject: [PATCH 186/766] Implement more Linux syscalls. (#6083) --- core/sys/linux/bits.odin | 31 ++++++++ core/sys/linux/constants.odin | 14 ++++ core/sys/linux/sys.odin | 137 +++++++++++++++++++++++++++++----- core/sys/linux/types.odin | 30 ++++++++ 4 files changed, 192 insertions(+), 20 deletions(-) diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index 213d6c26f..2487ebe92 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -2269,3 +2269,34 @@ Swap_Flags_Bits :: enum { PREFER = log2(0x8000), DISCARD = log2(0x10000), } + +Sched_Policy :: enum u32 { + OTHER = 0, + BATCH = 3, + IDLE = 5, + FIFO = 1, + RR = 2, + DEADLINE = 6, +} + +Sched_Flag_Bits :: enum { + RESET_ON_FORK = log2(0x01), + RECLAIM = log2(0x02), + DL_OVERRUN = log2(0x04), + KEEP_POLICY = log2(0x08), + KEEP_PARAMS = log2(0x10), + UTIL_CLAMP_MIN = log2(0x20), + UTIL_CLAMP_MAX = log2(0x40), +} + +Sched_Attr_Flag_Bits :: enum {} + +/* + See `constants.odin` for `MFD_HUGE_16KB`, et al. +*/ +Memfd_Create_Flag_Bits :: enum { + CLOEXEC = log2(0x1), + ALLOW_SEALING = log2(0x2), + HUGETLB = log2(0x4), +} + diff --git a/core/sys/linux/constants.odin b/core/sys/linux/constants.odin index 71a16312e..4de57f40b 100644 --- a/core/sys/linux/constants.odin +++ b/core/sys/linux/constants.odin @@ -395,6 +395,20 @@ MAP_HUGE_1GB :: transmute(Map_Flags)(u32(30) << MAP_HUGE_SHIFT) MAP_HUGE_2GB :: transmute(Map_Flags)(u32(31) << MAP_HUGE_SHIFT) MAP_HUGE_16GB :: transmute(Map_Flags)(u32(34) << MAP_HUGE_SHIFT) +MFD_HUGE_16KB :: transmute(Memfd_Create_Flags)(u32(14) << MAP_HUGE_SHIFT) +MFD_HUGE_64KB :: transmute(Memfd_Create_Flags)(u32(16) << MAP_HUGE_SHIFT) +MFD_HUGE_512KB :: transmute(Memfd_Create_Flags)(u32(19) << MAP_HUGE_SHIFT) +MFD_HUGE_1MB :: transmute(Memfd_Create_Flags)(u32(20) << MAP_HUGE_SHIFT) +MFD_HUGE_2MB :: transmute(Memfd_Create_Flags)(u32(21) << MAP_HUGE_SHIFT) +MFD_HUGE_8MB :: transmute(Memfd_Create_Flags)(u32(23) << MAP_HUGE_SHIFT) +MFD_HUGE_16MB :: transmute(Memfd_Create_Flags)(u32(24) << MAP_HUGE_SHIFT) +MFD_HUGE_32MB :: transmute(Memfd_Create_Flags)(u32(25) << MAP_HUGE_SHIFT) +MFD_HUGE_256MB :: transmute(Memfd_Create_Flags)(u32(28) << MAP_HUGE_SHIFT) +MFD_HUGE_512MB :: transmute(Memfd_Create_Flags)(u32(29) << MAP_HUGE_SHIFT) +MFD_HUGE_1GB :: transmute(Memfd_Create_Flags)(u32(30) << MAP_HUGE_SHIFT) +MFD_HUGE_2GB :: transmute(Memfd_Create_Flags)(u32(31) << MAP_HUGE_SHIFT) +MFD_HUGE_16GB :: transmute(Memfd_Create_Flags)(u32(34) << MAP_HUGE_SHIFT) + /* Get window size */ TIOCGWINSZ :: 0x5413 diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index faeda6f43..b4943411a 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -2043,22 +2043,71 @@ setpriority :: proc "contextless" (which: Priority_Which, who: i32, prio: i32) - return Errno(-ret) } -// TODO(flysand): sched_setparam - -// TODO(flysand): sched_getparam - -// TODO(flysand): sched_setscheduler - -// TODO(flysand): sched_getscheduler - -// TODO(flysand): sched_get_priority_max - -// TODO(flysand): sched_get_priority_min - -// TODO(flysand): sched_rr_get_interval +/* + Set scheduling parameters. + Available since Linux 2.0. +*/ +sched_setparam :: proc "contextless" (pid: Pid, param: ^Sched_Param) -> (Errno) { + ret := syscall(SYS_sched_setparam, pid, param) + return Errno(-ret) +} /* - Lock and memory. + Get scheduling parameters. + Available since Linux 2.0. +*/ +sched_getparam :: proc "contextless" (pid: Pid, param: ^Sched_Param) -> (Errno) { + ret := syscall(SYS_sched_getparam, pid, param) + return Errno(-ret) +} + +/* + Set scheduling policy/parameters. + Available since Linux 2.0. +*/ +sched_setscheduler :: proc "contextless" (pid: Pid, policy: i32, param: ^Sched_Param) -> (Errno) { + ret := syscall(SYS_sched_setscheduler, pid, policy, param) + return Errno(-ret) +} + +/* + Get scheduling policy/parameters. + Available since Linux 2.0. +*/ +sched_getscheduler :: proc "contextless" (pid: Pid, policy: i32, param: ^Sched_Param) -> (i32, Errno) { + ret := syscall(SYS_sched_getscheduler, pid) + return errno_unwrap(ret, i32) +} + +/* + Get static priority range. + Available since Linux 2.0. +*/ +sched_get_priority_max :: proc "contextless" (policy: i32) -> (i32, Errno) { + ret := syscall(SYS_sched_get_priority_max, policy) + return errno_unwrap(ret, i32) +} + +/* + Get static priority range. + Available since Linux 2.0. +*/ +sched_get_priority_min :: proc "contextless" (policy: i32) -> (i32, Errno) { + ret := syscall(SYS_sched_get_priority_min, policy) + return errno_unwrap(ret, i32) +} + +/* + get the SCHED_RR interval for the named process. + Available since Linux 2.0. +*/ +sched_rr_get_interval :: proc "contextless" (pid: Pid, tp: ^Time_Spec) -> (Errno) { + ret := syscall(SYS_sched_rr_get_interval, pid, tp) + return Errno(-ret) +} + +/* + Lock memory. Available since Linux 2.0. If flags specified, available since Linux 4.4. */ @@ -2560,9 +2609,29 @@ futex :: proc{ futex_wake_bitset, } -// TODO(flysand): sched_setaffinity +/* + Set a thread's CPU affinity mask. + Available since Linux 2.6. + + If you are running on a system with less than 128 cores you can use `linux.Cpu_Set` as the type for the mask argument. + Otherwise use an array of integers. +*/ +sched_setaffinity :: proc "contextless" (pid: Pid, cpusetsize: uint, mask: rawptr) -> (Errno) { + ret := syscall(SYS_sched_setaffinity, pid, cpusetsize, mask) + return Errno(-ret) +} -// TODO(flysand): sched_getaffinity +/* + Get a thread's CPU affinity mask. + Available since Linux 2.6. + + If you are running on a system with less than 128 cores you can use `linux.Cpu_Set` as the type for the mask argument. + Otherwise use an array of integers. +*/ +sched_getaffinity :: proc "contextless" (pid: Pid, cpusetsize: uint, mask: rawptr) -> (Errno) { + ret := syscall(SYS_sched_getaffinity, pid, cpusetsize, mask) + return Errno(-ret) +} // TODO(flysand): set_thread_area @@ -3100,7 +3169,14 @@ sendmmsg :: proc "contextless" (sock: Fd, msg_vec: []MMsg_Hdr, flags: Socket_Msg // TODO(flysand): setns -// TODO(flysand): getcpu +/* + Determine CPU and NUMA node on which the calling thread is running. + Available since Linux 2.6.19. +*/ +getcpu :: proc "contextless" (cpu, node: ^u32) -> (Errno) { + ret := syscall(SYS_getcpu, cpu, node) + return Errno(-ret) +} // TODO(flysand): process_vm_readv @@ -3110,9 +3186,23 @@ sendmmsg :: proc "contextless" (sock: Fd, msg_vec: []MMsg_Hdr, flags: Socket_Msg // TODO(flysand): finit_module -// TODO(flysand): sched_setattr +/* + Set scheduling policy and attributes. + Available since Linux 3.14. +*/ +sched_setattr :: proc "contextless" (pid: Pid, attr: ^Sched_Attr, flags: Sched_Attr_Flags) -> (Errno) { + ret := syscall(SYS_sched_setattr, pid, attr, transmute(u32)flags) + return Errno(-ret) +} -// TODO(flysand): sched_getattr +/* + Get scheduling policy and attributes. + Available since Linux 3.14. +*/ +sched_getattr :: proc "contextless" (pid: Pid, attr: ^Sched_Attr, size: u32, flags: Sched_Attr_Flags) -> (Errno) { + ret := syscall(SYS_sched_getattr, pid, attr, transmute(u32)flags) + return Errno(-ret) +} /* Rename the file with names relative to the specified dirfd's with other options. @@ -3130,7 +3220,14 @@ getrandom :: proc "contextless" (buf: []u8, flags: Get_Random_Flags) -> (int, Er return errno_unwrap(ret, int) } -// TODO(flysand): memfd_create +/* + Create an anonymous file. + Available since Linux 3.17. +*/ +memfd_create :: proc "contextless" (name: cstring, flags: Memfd_Create_Flags) -> (Fd, Errno) { + ret := syscall(SYS_memfd_create, cast(rawptr)name, transmute(u32)flags) + return errno_unwrap(ret, Fd) +} // TODO(flysand): kexec_file_load diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index 0910f11ec..d0cc6c433 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -1748,3 +1748,33 @@ Mount_Flags :: bit_set[Mount_Flags_Bits; uint] Umount2_Flags :: bit_set[Umount2_Flags_Bits; u32] Swap_Flags :: bit_set[Swap_Flags_Bits; u32] + +Cpu_Set :: bit_set[0 ..< 128] + +Sched_Param :: struct { + sched_priority: i32, +} + +Sched_Flags :: bit_set[Sched_Flag_Bits; u32] + +Sched_Attr :: struct { + size: u32, + + sched_policy: Sched_Policy, + sched_flags: Sched_Flags, + sched_nice: i32, + sched_priority: u32, + + /* For the DEADLINE policy */ + sched_runtime: u64, + sched_deadline: u64, + sched_period: u64, + + /* Utilization hints */ + sched_util_min: u32, + sched_util_max: u32, +} + +Sched_Attr_Flags :: bit_set[Sched_Attr_Flag_Bits; u32] + +Memfd_Create_Flags :: bit_set[Memfd_Create_Flag_Bits; u32] From edb70a8d7560e003482af5277feb014a1e65251d Mon Sep 17 00:00:00 2001 From: Xotchkass <78706300+Xotchkass@users.noreply.github.com> Date: Tue, 13 Jan 2026 22:11:01 +0200 Subject: [PATCH 187/766] optimized slice filling in xoshiro/pcg_random_generator_proc (#6001) --- core/math/rand/rand_pcg.odin | 22 +++++++++++++--------- core/math/rand/rand_xoshiro256.odin | 22 +++++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/core/math/rand/rand_pcg.odin b/core/math/rand/rand_pcg.odin index 009e139be..79c18acbb 100644 --- a/core/math/rand/rand_pcg.odin +++ b/core/math/rand/rand_pcg.odin @@ -55,16 +55,20 @@ pcg_random_generator_proc :: proc(data: rawptr, mode: runtime.Random_Generator_M intrinsics.unaligned_store((^u64)(raw_data(p)), read_u64(r)) case: // All other cases. - pos := i8(0) - val := u64(0) - for &v in p { - if pos == 0 { - val = read_u64(r) - pos = 8 + n := len(p) / size_of(u64) + buff := ([^]u64)(raw_data(p))[:n] + for &e in buff { + intrinsics.unaligned_store(&e, read_u64(r)) + } + // Handle remaining bytes + rem := len(p) % size_of(u64) + if rem > 0 { + val := read_u64(r) + tail := p[len(p) - rem:] + for &b in tail { + b = byte(val) + val >>= 8 } - v = byte(val) - val >>= 8 - pos -= 1 } } diff --git a/core/math/rand/rand_xoshiro256.odin b/core/math/rand/rand_xoshiro256.odin index 54dd02130..7326ba8d5 100644 --- a/core/math/rand/rand_xoshiro256.odin +++ b/core/math/rand/rand_xoshiro256.odin @@ -74,16 +74,20 @@ xoshiro256_random_generator_proc :: proc(data: rawptr, mode: runtime.Random_Gene intrinsics.unaligned_store((^u64)(raw_data(p)), read_u64(r)) case: // All other cases. - pos := i8(0) - val := u64(0) - for &v in p { - if pos == 0 { - val = read_u64(r) - pos = 8 + n := len(p) / size_of(u64) + buff := ([^]u64)(raw_data(p))[:n] + for &e in buff { + intrinsics.unaligned_store(&e, read_u64(r)) + } + // Handle remaining bytes + rem := len(p) % size_of(u64) + if rem > 0 { + val := read_u64(r) + tail := p[len(p) - rem:] + for &b in tail { + b = byte(val) + val >>= 8 } - v = byte(val) - val >>= 8 - pos -= 1 } } From a4f958b738b2cfd9d50d07b1357645d6c4d7902f Mon Sep 17 00:00:00 2001 From: Jacob Evelyn Date: Tue, 13 Jan 2026 15:13:18 -0500 Subject: [PATCH 188/766] Fix darwin/Foundation/NSScreen type property bindings (#6038) This commit updates the `darwin/Foundation` package's `NSScreen` bindings to treat Objective-C "type properties" as class methods rather than instance methods. As a result, we can now access these properties like this: ```odin import NS "core:sys/darwin/Foundation" main :: proc() { NS.Screen.mainScreen() } ``` instead of this: ```odin import NS "core:sys/darwin/Foundation" main :: proc() { (^NS.Screen)(nil).mainScreen() } ``` This commit also adds a binding for `NSScreen`'s `screensHaveSeparateSpaces` type property, which was previously missing from the `darwin/Foundation` package. Co-authored-by: Jacob Evelyn --- core/sys/darwin/Foundation/NSScreen.odin | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/sys/darwin/Foundation/NSScreen.odin b/core/sys/darwin/Foundation/NSScreen.odin index 79ab00fbe..8d52b9e1c 100644 --- a/core/sys/darwin/Foundation/NSScreen.odin +++ b/core/sys/darwin/Foundation/NSScreen.odin @@ -3,18 +3,22 @@ package objc_Foundation @(objc_class="NSScreen") Screen :: struct {using _: Object} -@(objc_type=Screen, objc_name="mainScreen") +@(objc_type=Screen, objc_name="mainScreen", objc_is_class_method=true) Screen_mainScreen :: proc "c" () -> ^Screen { return msgSend(^Screen, Screen, "mainScreen") } -@(objc_type=Screen, objc_name="deepestScreen") +@(objc_type=Screen, objc_name="deepestScreen", objc_is_class_method=true) Screen_deepestScreen :: proc "c" () -> ^Screen { return msgSend(^Screen, Screen, "deepestScreen") } -@(objc_type=Screen, objc_name="screens") +@(objc_type=Screen, objc_name="screens", objc_is_class_method=true) Screen_screens :: proc "c" () -> ^Array { return msgSend(^Array, Screen, "screens") } +@(objc_type=Screen, objc_name="screensHaveSeparateSpaces", objc_is_class_method=true) +Screen_screensHaveSeparateSpaces :: proc "c" () -> BOOL { + return msgSend(BOOL, Screen, "screensHaveSeparateSpaces") +} @(objc_type=Screen, objc_name="frame") Screen_frame :: proc "c" (self: ^Screen) -> Rect { return msgSend(Rect, self, "frame") From 11afefeedc3258f6bca822ef33e5908f3cf6592c Mon Sep 17 00:00:00 2001 From: Jacob Evelyn Date: Tue, 13 Jan 2026 15:13:59 -0500 Subject: [PATCH 189/766] Add NSWindow layout information method bindings to darwin/Foundation (#6040) This commit adds bindings for `NSWindow`'s ["Getting Layout Information"](https://developer.apple.com/documentation/appkit/nswindow?language=objc#Getting-Layout-Information) methods to the `core:sys/darwin/Foundation` package. Co-authored-by: Jacob Evelyn --- core/sys/darwin/Foundation/NSWindow.odin | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/sys/darwin/Foundation/NSWindow.odin b/core/sys/darwin/Foundation/NSWindow.odin index f39faca0a..11f8b187e 100644 --- a/core/sys/darwin/Foundation/NSWindow.odin +++ b/core/sys/darwin/Foundation/NSWindow.odin @@ -968,3 +968,23 @@ Window_setTabbingMode :: proc "c" (self: ^Window, mode: WindowTabbingMode) { Window_toggleFullScreen :: proc "c" (self: ^Window, sender: id) { msgSend(nil, self, "toggleFullScreen:", sender) } +@(objc_type = Window, objc_name = "contentRectForFrameRect", objc_is_class_method=true) +Window_contentRectForFrameRectType :: proc "c" (frameRect: Rect, styleMask: WindowStyleMask) -> Rect { + return msgSend(Rect, Window, "contentRectForFrameRect:styleMask:", frameRect, styleMask) +} +@(objc_type = Window, objc_name = "frameRectForContentRect", objc_is_class_method=true) +Window_frameRectForContentRectType :: proc "c" (contentRect: Rect, styleMask: WindowStyleMask) -> Rect { + return msgSend(Rect, Window, "frameRectForContentRect:styleMask:", contentRect, styleMask) +} +@(objc_type = Window, objc_name = "minFrameWidthWithTitle", objc_is_class_method=true) +Window_minFrameWidthWithTitle :: proc "c" (title: ^String, styleMask: WindowStyleMask) -> Float { + return msgSend(Float, Window, "minFrameWidthWithTitle:styleMask:", title, styleMask) +} +@(objc_type = Window, objc_name = "contentRectForFrameRect") +Window_contentRectForFrameRectInstance :: proc "c" (self: ^Window, frameRect: Rect) -> Rect { + return msgSend(Rect, self, "contentRectForFrameRect:", frameRect) +} +@(objc_type = Window, objc_name = "frameRectForContentRect") +Window_frameRectForContentRectInstance :: proc "c" (self: ^Window, contentRect: Rect) -> Rect { + return msgSend(Rect, self, "frameRectForContentRect:", contentRect) +} From 9d72025a0b6f7b94682662316b892ece865ad8aa Mon Sep 17 00:00:00 2001 From: Faker-09 Date: Tue, 13 Jan 2026 15:25:17 -0500 Subject: [PATCH 190/766] Remove duplicate assingment of array.allocator = allocator in _make_dynamic_array_len_cap(...) (#6095) --- base/runtime/core_builtin.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 6fecbaad9..6528fdd1b 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -433,7 +433,6 @@ _make_dynamic_array_len_cap :: proc(array: ^Raw_Dynamic_Array, size_of_elem, ali array.data = raw_data(data) array.len = 0 if use_zero else len array.cap = 0 if use_zero else cap - array.allocator = allocator return } From c64fad8ef7ab196854112c4a65992b11510fde90 Mon Sep 17 00:00:00 2001 From: Franz Date: Wed, 14 Jan 2026 00:43:06 +0100 Subject: [PATCH 191/766] Add warning for `size_of(&x)` expressions --- src/check_builtin.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 1b3e6912c..7b31314f8 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -2695,6 +2695,16 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As case BuiltinProc_size_of: { // size_of :: proc(Type or expr) -> untyped int + if (ce->args[0]->kind == Ast_UnaryExpr) { + ast_node(arg, UnaryExpr, ce->args[0]); + if (arg->op.kind == Token_And) { + ERROR_BLOCK(); + + warning(ce->args[0], "'size_of(&x)' returns the size of a pointer, not the size of x"); + error_line("\tSuggestion: Use 'size_of(rawptr)' if you want the size of the pointer"); + } + } + Operand o = {}; check_expr_or_type(c, &o, ce->args[0]); if (o.mode == Addressing_Invalid) { From bd9d682d154ceb4b6d4a9b129eacce16757219b3 Mon Sep 17 00:00:00 2001 From: Nathan Wong Date: Tue, 13 Jan 2026 16:38:22 -0800 Subject: [PATCH 192/766] Ensure creating a low priority thread does not assert with SCHED_OTHER policy --- core/thread/thread_unix.odin | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/thread/thread_unix.odin b/core/thread/thread_unix.odin index e18ea593d..af2a4a3c1 100644 --- a/core/thread/thread_unix.odin +++ b/core/thread/thread_unix.odin @@ -107,7 +107,11 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread { high := posix.sched_get_priority_max(policy) switch priority { case .Normal: // Okay - case .Low: params.sched_priority = low + 1 + case .Low: + params.sched_priority = low + 1 + if params.sched_priority >= high { + params.sched_priority = low + } case .High: params.sched_priority = high } res = posix.pthread_attr_setschedparam(&attrs, ¶ms) From ac35e0336b9c246673f1482ad907c013bfff7938 Mon Sep 17 00:00:00 2001 From: Franz Hoeltermann Date: Wed, 14 Jan 2026 10:42:43 +0100 Subject: [PATCH 193/766] Fix indentation --- src/check_builtin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 7b31314f8..929891826 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -2701,7 +2701,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As ERROR_BLOCK(); warning(ce->args[0], "'size_of(&x)' returns the size of a pointer, not the size of x"); - error_line("\tSuggestion: Use 'size_of(rawptr)' if you want the size of the pointer"); + error_line("\tSuggestion: Use 'size_of(rawptr)' if you want the size of the pointer"); } } From 4dcbc67ead5d58fc43efaac4d296c58fb854fb3d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 14 Jan 2026 12:48:19 +0000 Subject: [PATCH 194/766] Remove old dead directory `core:sys/win32` --- core/sys/win32/removal.odin | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 core/sys/win32/removal.odin diff --git a/core/sys/win32/removal.odin b/core/sys/win32/removal.odin deleted file mode 100644 index 09c16aa05..000000000 --- a/core/sys/win32/removal.odin +++ /dev/null @@ -1,3 +0,0 @@ -package sys_win32 - -#panic(`"core:sys/win32" has been removed. Please use "core:sys/windows"`) \ No newline at end of file From 28c9e319d3fe4314dc043123729056422b49a55e Mon Sep 17 00:00:00 2001 From: Wassim Alhajomar <75145262+Wassimulator@users.noreply.github.com> Date: Wed, 14 Jan 2026 15:00:50 +0100 Subject: [PATCH 195/766] use ^Thread instead of index in init and fini --- core/thread/thread_pool.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/thread/thread_pool.odin b/core/thread/thread_pool.odin index ea772c725..10f1438d7 100644 --- a/core/thread/thread_pool.odin +++ b/core/thread/thread_pool.odin @@ -20,8 +20,8 @@ Task :: struct { allocator: mem.Allocator, } -Thread_Init_Proc :: #type proc(thread_index: int, user_data: rawptr) -Thread_Fini_Proc :: #type proc(thread_index: int, user_data: rawptr) +Thread_Init_Proc :: #type proc(thread: ^Thread, user_data: rawptr) +Thread_Fini_Proc :: #type proc(thread: ^Thread, user_data: rawptr) // Do not access the pool's members directly while the pool threads are running, // since they use different kinds of locking and mutual exclusion devices. @@ -66,7 +66,7 @@ pool_thread_runner :: proc(t: ^Thread) { pool := data.pool if pool.thread_init_proc != nil { - pool.thread_init_proc(t.user_index, pool.thread_init_data) + pool.thread_init_proc(t, pool.thread_init_data) } for intrinsics.atomic_load(&pool.is_running) { @@ -81,7 +81,7 @@ pool_thread_runner :: proc(t: ^Thread) { } if pool.thread_fini_proc != nil { - pool.thread_fini_proc(t.user_index, pool.thread_fini_data) + pool.thread_fini_proc(t, pool.thread_fini_data) } sync.post(&pool.sem_available, 1) From 5fcf210c916135a66283b65cd7785cbbe091ebee Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 14 Jan 2026 19:03:15 +0100 Subject: [PATCH 196/766] uring: move package from nbio/uring to sys/linux/uring --- core/nbio/impl_linux.odin | 2 +- core/{nbio => sys/linux}/uring/doc.odin | 2 +- core/{nbio => sys/linux}/uring/ops.odin | 0 core/{nbio => sys/linux}/uring/uring.odin | 0 examples/all/all_linux.odin | 3 ++- 5 files changed, 4 insertions(+), 3 deletions(-) rename core/{nbio => sys/linux}/uring/doc.odin (98%) rename core/{nbio => sys/linux}/uring/ops.odin (100%) rename core/{nbio => sys/linux}/uring/uring.odin (100%) diff --git a/core/nbio/impl_linux.odin b/core/nbio/impl_linux.odin index b48fe248c..cdcbeedc1 100644 --- a/core/nbio/impl_linux.odin +++ b/core/nbio/impl_linux.odin @@ -6,11 +6,11 @@ import "base:intrinsics" import "core:container/pool" import "core:container/queue" import "core:mem" -import "core:nbio/uring" import "core:net" import "core:slice" import "core:strings" import "core:sys/linux" +import "core:sys/linux/uring" import "core:time" @(private="package") diff --git a/core/nbio/uring/doc.odin b/core/sys/linux/uring/doc.odin similarity index 98% rename from core/nbio/uring/doc.odin rename to core/sys/linux/uring/doc.odin index 440b294d6..8b9ae5ee8 100644 --- a/core/nbio/uring/doc.odin +++ b/core/sys/linux/uring/doc.odin @@ -11,7 +11,7 @@ Example: import "core:fmt" import "core:os" import "core:sys/linux" - import "core:nbio/uring" + import "core:sys/linux/uring" Request :: struct { path: cstring, diff --git a/core/nbio/uring/ops.odin b/core/sys/linux/uring/ops.odin similarity index 100% rename from core/nbio/uring/ops.odin rename to core/sys/linux/uring/ops.odin diff --git a/core/nbio/uring/uring.odin b/core/sys/linux/uring/uring.odin similarity index 100% rename from core/nbio/uring/uring.odin rename to core/sys/linux/uring/uring.odin diff --git a/examples/all/all_linux.odin b/examples/all/all_linux.odin index 2b70fa1e1..d7d005ba0 100644 --- a/examples/all/all_linux.odin +++ b/examples/all/all_linux.odin @@ -2,4 +2,5 @@ package all @(require) import "core:sys/linux" -@(require) import "vendor:x11/xlib" \ No newline at end of file +@(require) import "core:sys/linux/uring" +@(require) import "vendor:x11/xlib" From 57d02cb14850e7b241f5ec519ff5e44c6129a5fe Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 14 Jan 2026 20:02:08 +0100 Subject: [PATCH 197/766] pool: remove assert that is too strict --- core/container/pool/pool.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/container/pool/pool.odin b/core/container/pool/pool.odin index 425d6a0fb..01fb29f2d 100644 --- a/core/container/pool/pool.odin +++ b/core/container/pool/pool.odin @@ -44,7 +44,6 @@ destroy :: proc(p: ^Pool($T)) { elem := sync.atomic_exchange_explicit(&p.free_list, nil, .Acquire) sync.atomic_store_explicit(&p.num_ready, 0, .Relaxed) - assert(sync.atomic_load_explicit(&p.num_outstanding, .Relaxed) == 0) when .Address in ODIN_SANITIZER_FLAGS { for ; elem != nil; elem = _get_next(p, elem) { From 0366cd3304b3910a397c4989e46bee4c575adeec Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 15 Jan 2026 16:32:52 +0000 Subject: [PATCH 198/766] Add `#must_tail` (similar syntax to `#force_inline` --- src/check_expr.cpp | 30 +++++++++++++++++++++--- src/llvm_backend.cpp | 12 +++++----- src/llvm_backend.hpp | 3 ++- src/llvm_backend_proc.cpp | 48 ++++++++++++++++++++++++++++++++++----- src/parser.cpp | 23 +++++++++++++++---- src/parser.hpp | 13 ++++++++--- 6 files changed, 105 insertions(+), 24 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index cd2307c6d..3b470cb88 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8210,7 +8210,7 @@ gb_internal void check_objc_call_expr(CheckerContext *c, Operand *operand, Ast * add_objc_proc_type(c, call, return_type, param_types); } -gb_internal ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *call, Ast *proc, Slice const &args, ProcInlining inlining, Type *type_hint) { +gb_internal ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *call, Ast *proc, Slice const &args, ProcInlining inlining, ProcTailing tailing, Type *type_hint) { if (proc != nullptr && proc->kind == Ast_BasicDirective) { ast_node(bd, BasicDirective, proc); @@ -8241,7 +8241,10 @@ gb_internal ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *c return Expr_Expr; } if (inlining != ProcInlining_none) { - error(call, "Inlining operators are not allowed on built-in procedures"); + error(call, "Inlining directives are not allowed on built-in procedures"); + } + if (tailing != ProcTailing_none) { + error(call, "Tailing directives are not allowed on built-in procedures"); } } else { if (proc != nullptr) { @@ -8383,6 +8386,7 @@ gb_internal ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *c } bool is_call_inlined = false; + bool is_call_tailed = true; switch (inlining) { case ProcInlining_inline: @@ -8417,6 +8421,20 @@ gb_internal ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *c } } + switch (tailing) { + case ProcTailing_none: + break; + case ProcTailing_must_tail: + is_call_tailed = true; + if (proc != nullptr) { + Entity *e = entity_from_expr(proc); + if (e != nullptr && e->kind == Entity_Procedure) { + // TODO(bill): `preserve_none` + } + } + break; + } + { String invalid; if (pt->kind == Type_Proc && pt->Proc.require_target_feature.len != 0) { @@ -11825,7 +11843,7 @@ gb_internal ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast case_end; case_ast_node(ce, CallExpr, node); - return check_call_expr(c, o, node, ce->proc, ce->args, ce->inlining, type_hint); + return check_call_expr(c, o, node, ce->proc, ce->args, ce->inlining, ce->tailing, type_hint); case_end; case_ast_node(de, DerefExpr, node); @@ -12566,6 +12584,12 @@ gb_internal gbString write_expr_to_string(gbString str, Ast *node, bool shorthan case_end; case_ast_node(ce, CallExpr, node); + switch (ce->tailing) { + case ProcTailing_must_tail: + str = gb_string_appendc(str, "#must_tail "); + break; + } + switch (ce->inlining) { case ProcInlining_inline: str = gb_string_appendc(str, "#force_inline "); diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 1cde65640..0bf3d1125 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2111,7 +2111,7 @@ gb_internal void lb_create_startup_runtime_generate_body(lbModule *m, lbProcedur for (Entity *e : info->init_procedures) { lbValue value = lb_find_procedure_value_from_entity(m, e); - lb_emit_call(p, value, {}, ProcInlining_none); + lb_emit_call(p, value, {}, ProcInlining_none, ProcTailing_none); } @@ -2157,7 +2157,7 @@ gb_internal lbProcedure *lb_create_cleanup_runtime(lbModule *main_module) { // C for (Entity *e : info->fini_procedures) { lbValue value = lb_find_procedure_value_from_entity(main_module, e); - lb_emit_call(p, value, {}, ProcInlining_none); + lb_emit_call(p, value, {}, ProcInlining_none, ProcTailing_none); } lb_end_procedure_body(p); @@ -2850,7 +2850,7 @@ gb_internal lbProcedure *lb_create_main_procedure(lbModule *m, lbProcedure *star } lbValue startup_runtime_value = {startup_runtime->value, startup_runtime->type}; - lb_emit_call(p, startup_runtime_value, {}, ProcInlining_none); + lb_emit_call(p, startup_runtime_value, {}, ProcInlining_none, ProcTailing_none); if (build_context.command_kind == Command_test) { Type *t_Internal_Test = find_type_in_pkg(m->info, str_lit("testing"), str_lit("Internal_Test")); @@ -2917,16 +2917,16 @@ gb_internal lbProcedure *lb_create_main_procedure(lbModule *m, lbProcedure *star auto exit_args = array_make(temporary_allocator(), 1); exit_args[0] = lb_emit_select(p, result, lb_const_int(m, t_int, 0), lb_const_int(m, t_int, 1)); - lb_emit_call(p, exit_runner, exit_args, ProcInlining_none); + lb_emit_call(p, exit_runner, exit_args, ProcInlining_none, ProcTailing_none); } else { if (m->info->entry_point != nullptr) { lbValue entry_point = lb_find_procedure_value_from_entity(m, m->info->entry_point); - lb_emit_call(p, entry_point, {}, ProcInlining_no_inline); + lb_emit_call(p, entry_point, {}, ProcInlining_no_inline, ProcTailing_none); } if (call_cleanup) { lbValue cleanup_runtime_value = {cleanup_runtime->value, cleanup_runtime->type}; - lb_emit_call(p, cleanup_runtime_value, {}, ProcInlining_none); + lb_emit_call(p, cleanup_runtime_value, {}, ProcInlining_none, ProcTailing_none); } if (is_dll_main) { diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index da5d91f2e..9db7e94d9 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -345,6 +345,7 @@ struct lbProcedure { Ast * body; u64 tags; ProcInlining inlining; + ProcTailing tailing; bool is_foreign; bool is_export; bool is_entry_point; @@ -484,7 +485,7 @@ gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlo gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlock *block, Ast *node); gb_internal lbValue lb_emit_transmute(lbProcedure *p, lbValue value, Type *t); gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue right); -gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining = ProcInlining_none); +gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining = ProcInlining_none, ProcTailing tailing = ProcTailing_none); gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t); gb_internal lbValue lb_emit_comp_against_nil(lbProcedure *p, TokenKind op_kind, lbValue x); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 216d600da..0703941c1 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -117,6 +117,7 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i p->type_expr = decl->type_expr; p->body = pl->body; p->inlining = pl->inlining; + p->tailing = pl->tailing; p->is_foreign = entity->Procedure.is_foreign; p->is_export = entity->Procedure.is_export; p->is_entry_point = false; @@ -178,6 +179,12 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i } } + switch (p->tailing) { + case ProcTailing_must_tail: + lb_add_attribute_to_proc(m, p->value, "preserve_none"); + break; + } + switch (entity->Procedure.optimization_mode) { case ProcedureOptimizationMode_None: lb_add_attribute_to_proc(m, p->value, "optnone"); @@ -387,6 +394,7 @@ gb_internal lbProcedure *lb_create_dummy_procedure(lbModule *m, String link_name p->body = nullptr; p->tags = 0; p->inlining = ProcInlining_none; + p->tailing = ProcTailing_none; p->is_foreign = false; p->is_export = false; p->is_entry_point = false; @@ -855,7 +863,7 @@ gb_internal Array lb_value_to_array(lbProcedure *p, gbAllocator const & -gb_internal lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue return_ptr, Array const &processed_args, Type *abi_rt, lbAddr context_ptr, ProcInlining inlining) { +gb_internal lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue return_ptr, Array const &processed_args, Type *abi_rt, lbAddr context_ptr, ProcInlining inlining, ProcTailing tailing) { GB_ASSERT(p->module->ctx == LLVMGetTypeContext(LLVMTypeOf(value.value))); unsigned arg_count = cast(unsigned)processed_args.count; @@ -972,6 +980,15 @@ gb_internal lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue break; } + switch (tailing) { + case ProcTailing_none: + break; + case ProcTailing_must_tail: + LLVMSetTailCall(ret, true); + LLVMSetTailCallKind(ret, LLVMTailCallKindMustTail); + break; + } + lbValue res = {}; res.value = ret; res.type = abi_rt; @@ -1045,7 +1062,7 @@ gb_internal lbValue lb_emit_conjugate(lbProcedure *p, lbValue val, Type *type) { return lb_emit_load(p, res); } -gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining) { +gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining, ProcTailing tailing) { lbModule *m = p->module; Type *pt = base_type(value.type); @@ -1168,10 +1185,10 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c if (return_by_pointer) { lbValue return_ptr = lb_add_local_generated(p, rt, true).addr; - lb_emit_call_internal(p, value, return_ptr, processed_args, nullptr, context_ptr, inlining); + lb_emit_call_internal(p, value, return_ptr, processed_args, nullptr, context_ptr, inlining, tailing); result = lb_emit_load(p, return_ptr); } else if (rt != nullptr) { - result = lb_emit_call_internal(p, value, {}, processed_args, rt, context_ptr, inlining); + result = lb_emit_call_internal(p, value, {}, processed_args, rt, context_ptr, inlining, tailing); if (ft->ret.cast_type) { result.value = OdinLLVMBuildTransmute(p, result.value, ft->ret.cast_type); } @@ -1184,7 +1201,7 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c result = lb_emit_conv(p, result, rt); } } else { - lb_emit_call_internal(p, value, {}, processed_args, nullptr, context_ptr, inlining); + lb_emit_call_internal(p, value, {}, processed_args, nullptr, context_ptr, inlining, tailing); } if (original_rt != rt) { @@ -4402,6 +4419,25 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { return lb_handle_objc_auto_send(p, expr, slice(call_args, 0, call_args.count)); } - return lb_emit_call(p, value, call_args, ce->inlining); + + ProcInlining inlining = ce->inlining; + ProcTailing tailing = ce->tailing; + + if (tailing == ProcTailing_none && + proc_entity && proc_entity->kind == Entity_Procedure && + proc_entity->decl_info && + proc_entity->decl_info->proc_lit) { + ast_node(pl, ProcLit, proc_entity->decl_info->proc_lit); + + if (pl->inlining != ProcInlining_none) { + inlining = pl->inlining; + } + + if (pl->tailing != ProcTailing_none) { + tailing = pl->tailing; + } + } + + return lb_emit_call(p, value, call_args, inlining, tailing); } diff --git a/src/parser.cpp b/src/parser.cpp index 823021e04..d8a9df473 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2176,7 +2176,7 @@ gb_internal bool ast_on_same_line(Token const &x, Ast *yp) { return x.pos.line == y.pos.line; } -gb_internal Ast *parse_force_inlining_operand(AstFile *f, Token token) { +gb_internal Ast *parse_inlining_or_tailing_operand(AstFile *f, Token token) { Ast *expr = parse_unary_expr(f, false); Ast *e = strip_or_return_expr(expr); if (e == nullptr) { @@ -2187,11 +2187,14 @@ gb_internal Ast *parse_force_inlining_operand(AstFile *f, Token token) { return ast_bad_expr(f, token, f->curr_token); } ProcInlining pi = ProcInlining_none; + ProcTailing pt = ProcTailing_none; if (token.kind == Token_Ident) { if (token.string == "force_inline") { pi = ProcInlining_inline; } else if (token.string == "force_no_inline") { pi = ProcInlining_no_inline; + } else if (token.string == "must_tail") { + pt = ProcTailing_must_tail; } } @@ -2211,6 +2214,14 @@ gb_internal Ast *parse_force_inlining_operand(AstFile *f, Token token) { } } + if (pt != ProcTailing_none) { + if (e->kind == Ast_ProcLit) { + e->ProcLit.tailing = pt; + } else if (e->kind == Ast_CallExpr) { + e->CallExpr.tailing = pt; + } + } + return expr; } @@ -2507,8 +2518,9 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { syntax_error(tag, "#relative types have now been removed in favour of \"core:relative\""); return ast_relative_type(f, tag, type); } else if (name.string == "force_inline" || - name.string == "force_no_inline") { - return parse_force_inlining_operand(f, name); + name.string == "force_no_inline" || + name.string == "must_tail") { + return parse_inlining_or_tailing_operand(f, name); } return ast_basic_directive(f, token, name); } @@ -5399,8 +5411,9 @@ gb_internal Ast *parse_stmt(AstFile *f) { expect_semicolon(f); return stmt; } else if (name.string == "force_inline" || - name.string == "force_no_inline") { - Ast *expr = parse_force_inlining_operand(f, name); + name.string == "force_no_inline" || + name.string == "must_tail") { + Ast *expr = parse_inlining_or_tailing_operand(f, name); Ast *stmt = ast_expr_stmt(f, expr); expect_semicolon(f); return stmt; diff --git a/src/parser.hpp b/src/parser.hpp index 71b61d95f..30b11c730 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -263,12 +263,17 @@ struct ForeignFileWorkerData { -enum ProcInlining { - ProcInlining_none = 0, - ProcInlining_inline = 1, +enum ProcInlining : u8 { + ProcInlining_none = 0, + ProcInlining_inline = 1, ProcInlining_no_inline = 2, }; +enum ProcTailing : u8 { + ProcTailing_none = 0, + ProcTailing_must_tail = 1, +}; + enum ProcTag { ProcTag_bounds_check = 1<<0, ProcTag_no_bounds_check = 1<<1, @@ -441,6 +446,7 @@ struct AstSplitArgs { Ast *body; \ u64 tags; \ ProcInlining inlining; \ + ProcTailing tailing; \ Token where_token; \ Slice where_clauses; \ DeclInfo *decl; \ @@ -486,6 +492,7 @@ AST_KIND(_ExprBegin, "", bool) \ Token close; \ Token ellipsis; \ ProcInlining inlining; \ + ProcTailing tailing; \ bool optional_ok_one; \ bool was_selector; \ AstSplitArgs *split_args; \ From 5f07055ac1548e6254651f40a23e74093a9bebfe Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 15 Jan 2026 17:28:28 +0000 Subject: [PATCH 199/766] Add `#must_tail` and `"preserve/none"` calling convention --- src/check_expr.cpp | 13 ++++++++----- src/llvm_backend.hpp | 3 +++ src/llvm_backend_proc.cpp | 6 ------ src/parser.cpp | 3 +++ src/parser.hpp | 2 ++ src/types.cpp | 38 +++++--------------------------------- 6 files changed, 21 insertions(+), 44 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 3b470cb88..74ae02f94 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8426,11 +8426,14 @@ gb_internal ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *c break; case ProcTailing_must_tail: is_call_tailed = true; - if (proc != nullptr) { - Entity *e = entity_from_expr(proc); - if (e != nullptr && e->kind == Entity_Procedure) { - // TODO(bill): `preserve_none` - } + if (c->curr_proc_sig == nullptr || !are_types_identical(c->curr_proc_sig, pt)) { + ERROR_BLOCK(); + gbString a = type_to_string(pt); + gbString b = type_to_string(c->curr_proc_sig); + error(call, "Use of '#must_tail' of a procedure must have the same type as the procedure it was called within"); + error_line("\tCall type: %s, parent type: %s", a, b); + gb_string_free(b); + gb_string_free(a); } break; } diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 9db7e94d9..884b87998 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -671,6 +671,7 @@ enum lbCallingConventionKind : unsigned { lbCallingConvention_PreserveAll = 15, lbCallingConvention_Swift = 16, lbCallingConvention_CXX_FAST_TLS = 17, + lbCallingConvention_PreserveNone = 21, lbCallingConvention_FirstTargetCC = 64, lbCallingConvention_X86_StdCall = 64, lbCallingConvention_X86_FastCall = 65, @@ -724,6 +725,8 @@ lbCallingConventionKind const lb_calling_convention_map[ProcCC_MAX] = { lbCallingConvention_Win64, // ProcCC_Win64, lbCallingConvention_X86_64_SysV, // ProcCC_SysV, + lbCallingConvention_PreserveNone, // ProcCC_PreserveNone, + }; enum : LLVMDWARFTypeEncoding { diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 0703941c1..9ac51bba3 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -179,12 +179,6 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i } } - switch (p->tailing) { - case ProcTailing_must_tail: - lb_add_attribute_to_proc(m, p->value, "preserve_none"); - break; - } - switch (entity->Procedure.optimization_mode) { case ProcedureOptimizationMode_None: lb_add_attribute_to_proc(m, p->value, "optnone"); diff --git a/src/parser.cpp b/src/parser.cpp index d8a9df473..8782b3a2b 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2216,6 +2216,7 @@ gb_internal Ast *parse_inlining_or_tailing_operand(AstFile *f, Token token) { if (pt != ProcTailing_none) { if (e->kind == Ast_ProcLit) { + syntax_error(expr, "'#must_call' can only be applied to a procedure call, not the procedure literal"); e->ProcLit.tailing = pt; } else if (e->kind == Ast_CallExpr) { e->CallExpr.tailing = pt; @@ -4020,6 +4021,8 @@ gb_internal ProcCallingConvention string_to_calling_convention(String const &s) if (s == "win64") return ProcCC_Win64; if (s == "sysv") return ProcCC_SysV; + if (s == "preserve/none") return ProcCC_PreserveNone; + if (s == "system") { if (build_context.metrics.os == TargetOs_windows) { return ProcCC_StdCall; diff --git a/src/parser.hpp b/src/parser.hpp index 30b11c730..77d38b291 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -301,6 +301,7 @@ enum ProcCallingConvention : i32 { ProcCC_Win64 = 9, ProcCC_SysV = 10, + ProcCC_PreserveNone = 11, ProcCC_MAX, @@ -320,6 +321,7 @@ gb_global char const *proc_calling_convention_strings[ProcCC_MAX] = { "inlineasm", "win64", "sysv", + "preserve/none", }; gb_internal ProcCallingConvention default_calling_convention(void) { diff --git a/src/types.cpp b/src/types.cpp index 18e3b56ac..911cd4448 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -5210,40 +5210,12 @@ gb_internal gbString write_type_to_string(gbString str, Type *type, bool shortha case Type_Proc: str = gb_string_appendc(str, "proc"); - switch (type->Proc.calling_convention) { - case ProcCC_Odin: - if (default_calling_convention() != ProcCC_Odin) { - str = gb_string_appendc(str, " \"odin\" "); - } - break; - case ProcCC_Contextless: - if (default_calling_convention() != ProcCC_Contextless) { - str = gb_string_appendc(str, " \"contextless\" "); - } - break; - case ProcCC_CDecl: - str = gb_string_appendc(str, " \"c\" "); - break; - case ProcCC_StdCall: - str = gb_string_appendc(str, " \"std\" "); - break; - case ProcCC_FastCall: - str = gb_string_appendc(str, " \"fastcall\" "); - break; - break; - case ProcCC_None: - str = gb_string_appendc(str, " \"none\" "); - break; - case ProcCC_Naked: - str = gb_string_appendc(str, " \"naked\" "); - break; - // case ProcCC_VectorCall: - // str = gb_string_appendc(str, " \"vectorcall\" "); - // break; - // case ProcCC_ClrCall: - // str = gb_string_appendc(str, " \"clrcall\" "); - // break; + if (type->Proc.calling_convention != default_calling_convention()) { + str = gb_string_appendc(str, " \""); + str = gb_string_appendc(str, proc_calling_convention_strings[type->Proc.calling_convention]); + str = gb_string_appendc(str, "\" "); } + str = gb_string_appendc(str, "("); if (type->Proc.params) { str = write_type_to_string(str, type->Proc.params, shorthand, allow_polymorphic); From b3f4807b2d11d9e3f18279dcb51ffc1ec031abbc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 15 Jan 2026 17:31:42 +0000 Subject: [PATCH 200/766] Add `#must_tail` to odin/parser --- core/odin/ast/ast.odin | 7 +++++++ core/odin/parser/parser.odin | 19 ++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index a8c198476..6755ca4d0 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -17,6 +17,11 @@ Proc_Inlining :: enum u32 { No_Inline = 2, } +Proc_Tailing :: enum u32 { + None = 0, + Must_Tail = 1, +} + Proc_Calling_Convention_Extra :: enum i32 { Foreign_Block_Default, } @@ -147,6 +152,7 @@ Proc_Lit :: struct { body: ^Stmt, // nil when it represents a foreign procedure tags: Proc_Tags, inlining: Proc_Inlining, + tailing: Proc_Tailing, where_token: tokenizer.Token, where_clauses: []^Expr, } @@ -243,6 +249,7 @@ Matrix_Index_Expr :: struct { Call_Expr :: struct { using node: Expr, inlining: Proc_Inlining, + tailing: Proc_Tailing, expr: ^Expr, open: tokenizer.Pos, args: []^Expr, diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index f4beddcbb..719cb0374 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -1528,8 +1528,8 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { es.expr = ce return es - case "force_inline", "force_no_inline": - expr := parse_inlining_operand(p, true, tag) + case "force_inline", "force_no_inline", "must_tail": + expr := parse_inlining_or_tailing_operand(p, true, tag) es := ast.new(ast.Expr_Stmt, expr.pos, expr) es.expr = expr return es @@ -2235,10 +2235,11 @@ parse_proc_type :: proc(p: ^Parser, tok: tokenizer.Token) -> ^ast.Proc_Type { return pt } -parse_inlining_operand :: proc(p: ^Parser, lhs: bool, tok: tokenizer.Token) -> ^ast.Expr { +parse_inlining_or_tailing_operand :: proc(p: ^Parser, lhs: bool, tok: tokenizer.Token) -> ^ast.Expr { expr := parse_unary_expr(p, lhs) pi := ast.Proc_Inlining.None + pt := ast.Proc_Tailing.None #partial switch tok.kind { case .Inline: pi = .Inline @@ -2250,6 +2251,8 @@ parse_inlining_operand :: proc(p: ^Parser, lhs: bool, tok: tokenizer.Token) -> ^ pi = .Inline case "force_no_inline": pi = .No_Inline + case "must_tail": + pt = .Must_Tail } } @@ -2259,13 +2262,19 @@ parse_inlining_operand :: proc(p: ^Parser, lhs: bool, tok: tokenizer.Token) -> ^ if e.inlining != .None && e.inlining != pi { error(p, expr.pos, "both 'inline' and 'no_inline' cannot be applied to a procedure literal") } + if pt != .None { + error(p, expr.pos, "'#must_tail' can only be applied to a procedure call, not the procedure literal") + } + e.inlining = pi + e.tailing = pt return expr case ^ast.Call_Expr: if e.inlining != .None && e.inlining != pi { error(p, expr.pos, "both 'inline' and 'no_inline' cannot be applied to a procedure call") } e.inlining = pi + e.tailing = pt return expr } } @@ -2451,7 +2460,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { return rt case "force_inline", "force_no_inline": - return parse_inlining_operand(p, lhs, name) + return parse_inlining_or_tailing_operand(p, lhs, name) case: expr := parse_expr(p, lhs) end := expr.pos if expr != nil else end_pos(tok) @@ -2464,7 +2473,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { case .Inline, .No_Inline: tok := advance_token(p) - return parse_inlining_operand(p, lhs, tok) + return parse_inlining_or_tailing_operand(p, lhs, tok) case .Proc: tok := expect_token(p, .Proc) From 59ae82634ed69b019a8965d1120dd8c7c5a7a605 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 15 Jan 2026 17:52:36 +0000 Subject: [PATCH 201/766] Add `preserve/most` and `preserve/all` --- src/llvm_backend.hpp | 2 ++ src/parser.cpp | 2 ++ src/parser.hpp | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 884b87998..e10471527 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -726,6 +726,8 @@ lbCallingConventionKind const lb_calling_convention_map[ProcCC_MAX] = { lbCallingConvention_X86_64_SysV, // ProcCC_SysV, lbCallingConvention_PreserveNone, // ProcCC_PreserveNone, + lbCallingConvention_PreserveMost, // ProcCC_PreserveMost, + lbCallingConvention_PreserveAll, // ProcCC_PreserveAll, }; diff --git a/src/parser.cpp b/src/parser.cpp index 8782b3a2b..fc55dae97 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -4022,6 +4022,8 @@ gb_internal ProcCallingConvention string_to_calling_convention(String const &s) if (s == "sysv") return ProcCC_SysV; if (s == "preserve/none") return ProcCC_PreserveNone; + if (s == "preserve/most") return ProcCC_PreserveMost; + if (s == "preserve/all") return ProcCC_PreserveAll; if (s == "system") { if (build_context.metrics.os == TargetOs_windows) { diff --git a/src/parser.hpp b/src/parser.hpp index 77d38b291..011330438 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -302,6 +302,8 @@ enum ProcCallingConvention : i32 { ProcCC_SysV = 10, ProcCC_PreserveNone = 11, + ProcCC_PreserveMost = 12, + ProcCC_PreserveAll = 13, ProcCC_MAX, @@ -322,6 +324,8 @@ gb_global char const *proc_calling_convention_strings[ProcCC_MAX] = { "win64", "sysv", "preserve/none", + "preserve/most", + "preserve/all", }; gb_internal ProcCallingConvention default_calling_convention(void) { From f4a7e0b279043357a550c26f1972835f9f5688a1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 15 Jan 2026 18:06:25 +0000 Subject: [PATCH 202/766] Add `@(no_sanitize_thread)` --- src/check_decl.cpp | 1 + src/checker.cpp | 6 ++++++ src/checker.hpp | 1 + src/entity.cpp | 1 + src/llvm_backend_proc.cpp | 2 +- 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 27babd255..8019d00c3 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -1473,6 +1473,7 @@ gb_internal void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) { e->Procedure.no_sanitize_address = ac.no_sanitize_address; e->Procedure.no_sanitize_memory = ac.no_sanitize_memory; + e->Procedure.no_sanitize_thread = ac.no_sanitize_thread; e->deprecated_message = ac.deprecated_message; e->warning_message = ac.warning_message; diff --git a/src/checker.cpp b/src/checker.cpp index ab3ba50dd..453f3e241 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3990,6 +3990,12 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) { } ac->no_sanitize_memory = true; return true; + } else if (name == "no_sanitize_thread") { + if (value != nullptr) { + error(value, "'%.*s' expects no parameter", LIT(name)); + } + ac->no_sanitize_thread = true; + return true; } return false; } diff --git a/src/checker.hpp b/src/checker.hpp index bda7b2746..f9c279a51 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -141,6 +141,7 @@ struct AttributeContext { bool instrumentation_exit : 1; bool no_sanitize_address : 1; bool no_sanitize_memory : 1; + bool no_sanitize_thread : 1; bool rodata : 1; bool ignore_duplicates : 1; u32 optimization_mode; // ProcedureOptimizationMode diff --git a/src/entity.cpp b/src/entity.cpp index 2b21fdcac..55aca8069 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -268,6 +268,7 @@ struct Entity { bool is_anonymous : 1; bool no_sanitize_address : 1; bool no_sanitize_memory : 1; + bool no_sanitize_thread : 1; bool is_objc_impl_or_import : 1; bool is_objc_class_method : 1; } Procedure; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 9ac51bba3..524c37186 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -347,7 +347,7 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i if (build_context.sanitizer_flags & SanitizerFlag_Memory && !entity->Procedure.no_sanitize_memory) { lb_add_attribute_to_proc(m, p->value, "sanitize_memory"); } - if (build_context.sanitizer_flags & SanitizerFlag_Thread) { + if (build_context.sanitizer_flags & SanitizerFlag_Thread && !entity->Procedure.no_sanitize_thread) { lb_add_attribute_to_proc(m, p->value, "sanitize_thread"); } } From 557e854864e13f5da23533547b443ffde471cfc9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 15 Jan 2026 18:12:39 +0000 Subject: [PATCH 203/766] `-disable-unwind` --- src/build_settings.cpp | 1 + src/llvm_backend_proc.cpp | 4 ++++ src/main.cpp | 8 ++++++++ 3 files changed, 13 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 7160f3721..31a07aa69 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -582,6 +582,7 @@ struct BuildContext { RelocMode reloc_mode; bool disable_red_zone; + bool disable_unwind; isize max_error_count; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 524c37186..640a43111 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -153,6 +153,10 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i lb_ensure_abi_function_type(m, p); lb_add_function_type_attributes(p->value, p->abi_function_type, p->abi_function_type->calling_convention); + if (build_context.disable_unwind) { + lb_add_attribute_to_proc(m, p->value, "nounwind"); + } + if (pt->Proc.diverging) { lb_add_attribute_to_proc(m, p->value, "noreturn"); } diff --git a/src/main.cpp b/src/main.cpp index 326c4c457..753f58986 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -363,6 +363,8 @@ enum BuildFlagKind { BuildFlag_RelocMode, BuildFlag_DisableRedZone, + BuildFlag_DisableUnwind, + BuildFlag_DisallowDo, BuildFlag_DefaultToNilAllocator, BuildFlag_DefaultToPanicAllocator, @@ -592,6 +594,8 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_RelocMode, str_lit("reloc-mode"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_DisableRedZone, str_lit("disable-red-zone"), BuildFlagParam_None, Command__does_build); + add_flag(&build_flags, BuildFlag_DisableUnwind, str_lit("disable-unwind"), BuildFlagParam_None, Command__does_build); + add_flag(&build_flags, BuildFlag_DisallowDo, str_lit("disallow-do"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_DefaultToNilAllocator, str_lit("default-to-nil-allocator"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_DefaultToPanicAllocator, str_lit("default-to-panic-allocator"),BuildFlagParam_None, Command__does_check); @@ -1424,6 +1428,10 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_DisableRedZone: build_context.disable_red_zone = true; break; + case BuildFlag_DisableUnwind: + build_context.disable_unwind = true; + break; + case BuildFlag_DisallowDo: build_context.disallow_do = true; break; From 71c4da8e344e406f02faf1bfc76148bbdfc474a8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 16 Jan 2026 09:19:01 +0000 Subject: [PATCH 204/766] Fix typo in strings.equal_fold --- core/strings/strings.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/strings/strings.odin b/core/strings/strings.odin index beaa8bda1..bad0ac26a 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -438,7 +438,7 @@ equal_fold :: proc(u, v: string) -> (res: bool) { r := unicode.simple_fold(sr) for r != sr && r < tr { - r = unicode.simple_fold(sr) + r = unicode.simple_fold(r) } if r == tr { continue loop From f4aa64e934f6ddd73a91fdeb6fec492811f09207 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 16 Jan 2026 17:47:40 +0000 Subject: [PATCH 205/766] Add `html.escape_string` --- core/html/escape.odin | 59 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 core/html/escape.odin diff --git a/core/html/escape.odin b/core/html/escape.odin new file mode 100644 index 000000000..dfdcc6f92 --- /dev/null +++ b/core/html/escape.odin @@ -0,0 +1,59 @@ +package html + +// escape_string escapes special characters like '&' to become '&'. +// It escapes only 5 different characters: & ' < > and ". +@(require_results) +escape_string :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool) { + /* + & -> & + ' -> ' // ' is shorter than ' (NOTE: ' was not available until HTML 5) + < -> < + > -> > + " -> " // " is shorter than " + */ + + b := transmute([]byte)s + + extra_bytes_needed := 0 + + for c in b { + switch c { + case '&': extra_bytes_needed += 4 + case '\'': extra_bytes_needed += 4 + case '<': extra_bytes_needed += 3 + case '>': extra_bytes_needed += 3 + case '"': extra_bytes_needed += 4 + } + } + + if extra_bytes_needed == 0 { + return s, false + } + + t, err := make([]byte, len(s) + extra_bytes_needed, allocator, loc) + if err != nil { + return + } + was_allocation = true + + w := 0 + for c in b { + s := "" + switch c { + case '&': s = "&" + case '\'': s = "'" + case '<': s = "<" + case '>': s = ">" + case '"': s = """ + } + if s != "" { + copy(t[w:], s) + w += len(s) + } else { + t[w] = c + w += 1 + } + } + output = string(t[0:w]) + return +} \ No newline at end of file From 59d08f3a5705c8db2fc99291af6079f0c7a30819 Mon Sep 17 00:00:00 2001 From: magicalhack Date: Sat, 17 Jan 2026 13:14:28 -0500 Subject: [PATCH 206/766] Minor x11/xlib bindings fixes - Fix Xutf8LookupString signature (^cstring -> cstring) - Fix type of KeySym (u32 -> uint) --- vendor/x11/xlib/xlib_keysym.odin | 2 +- vendor/x11/xlib/xlib_procs.odin | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/x11/xlib/xlib_keysym.odin b/vendor/x11/xlib/xlib_keysym.odin index 61284c723..267b77b1c 100644 --- a/vendor/x11/xlib/xlib_keysym.odin +++ b/vendor/x11/xlib/xlib_keysym.odin @@ -1,7 +1,7 @@ #+build linux, freebsd, openbsd package xlib -KeySym :: enum u32 { +KeySym :: enum uint { XK_BackSpace = 0xff08, /* Back space, back char */ XK_Tab = 0xff09, XK_Linefeed = 0xff0a, /* Linefeed, LF */ diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index c33c6d351..2409ad000 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -2068,7 +2068,7 @@ foreign xlib { Xutf8LookupString :: proc( ic: XIC, event: ^XKeyPressedEvent, - buffer_return: ^cstring, + buffer_return: cstring, bytes_buffer: i32, keysym_return: ^KeySym, status_return: ^LookupStringStatus, From 44aabdbcda09555be754d20992e1f8dde919071d Mon Sep 17 00:00:00 2001 From: laytan Date: Sat, 17 Jan 2026 19:22:09 +0100 Subject: [PATCH 207/766] nbio(windows): explicitly set entries_removed = 0 when GetQueuedCompletionStatusEx returns false --- core/nbio/impl_windows.odin | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/nbio/impl_windows.odin b/core/nbio/impl_windows.odin index 4610d4754..2ff391a23 100644 --- a/core/nbio/impl_windows.odin +++ b/core/nbio/impl_windows.odin @@ -183,8 +183,12 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { events: [QUEUE_SIZE]win.OVERLAPPED_ENTRY entries_removed: win.ULONG if !win.GetQueuedCompletionStatusEx(l.iocp, &events[0], len(events), &entries_removed, actual_timeout, false) { - if terr := win.GetLastError(); terr != win.WAIT_TIMEOUT { - err = General_Error(terr) + winerr := win.GetLastError() + switch winerr { + case win.WAIT_TIMEOUT: + entries_removed = 0 + case: + err = General_Error(winerr) return } } From e4bd92763aec78550129cc139c5d1fa8987e5f63 Mon Sep 17 00:00:00 2001 From: laytan Date: Sat, 17 Jan 2026 20:55:09 +0100 Subject: [PATCH 208/766] nbio(windows): fix "recursive" timeouts not being taken into consideration for blocking --- core/nbio/impl_windows.odin | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/nbio/impl_windows.odin b/core/nbio/impl_windows.odin index 2ff391a23..e7987671d 100644 --- a/core/nbio/impl_windows.odin +++ b/core/nbio/impl_windows.odin @@ -249,11 +249,20 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { continue } - expires = cexpires - debug("first timeout in the future is at", op.timeout._impl.expires, "after", cexpires) - return + break } + // Don't merge this with the previous iteration because the `handle_completed` in that one might queue + // more timeouts which we want to detect here. + // For example: `timeout(time.Second, proc(_: ^Operation) { timeout(time.Second, ...) })` + + first := avl.first(&l.timeouts) + if first != nil { + op := first.value + cexpires := time.diff(curr, op.timeout._impl.expires) + debug("first timeout in the future is at", op.timeout._impl.expires, "after", cexpires) + expires = cexpires + } return } From 3a3ed48fae8c7d38f7af1fce39343b2302fd5639 Mon Sep 17 00:00:00 2001 From: laytan Date: Sat, 17 Jan 2026 21:03:25 +0100 Subject: [PATCH 209/766] nbio: mpsc queue for execs on another thread --- core/nbio/impl.odin | 21 +++++++------ core/nbio/impl_linux.odin | 5 +++ core/nbio/impl_others.odin | 3 ++ core/nbio/impl_posix.odin | 5 +++ core/nbio/impl_windows.odin | 20 +++++++----- core/nbio/mpsc.odin | 63 +++++++++++++++++++++++++++++++++++++ core/nbio/nbio.odin | 19 +++++------ 7 files changed, 108 insertions(+), 28 deletions(-) create mode 100644 core/nbio/mpsc.odin diff --git a/core/nbio/impl.odin b/core/nbio/impl.odin index 3f5191c5e..476b8ab43 100644 --- a/core/nbio/impl.odin +++ b/core/nbio/impl.odin @@ -5,10 +5,8 @@ import "base:runtime" import "base:intrinsics" import "core:container/pool" -import "core:container/queue" import "core:net" import "core:strings" -import "core:sync" import "core:time" import "core:reflect" @@ -35,7 +33,13 @@ _acquire_thread_event_loop :: proc() -> General_Error { allocator := runtime.heap_allocator() } - l.queue.data.allocator = allocator + l.allocator = allocator + + if alloc_err := mpsc_init(&l.queue, 128, l.allocator); alloc_err != nil { + l.err = .Allocation_Failed + return l.err + } + defer if l.err != nil { mpsc_destroy(&l.queue, l.allocator) } if pool_err := pool.init(&l.operation_pool, "_pool_link"); pool_err != nil { l.err = .Allocation_Failed @@ -65,7 +69,7 @@ _release_thread_event_loop :: proc() { if l.refs > 0 { l.refs -= 1 if l.refs == 0 { - queue.destroy(&l.queue) + mpsc_destroy(&l.queue, l.allocator) pool.destroy(&l.operation_pool) _destroy(l) l^ = {} @@ -85,11 +89,10 @@ _current_thread_event_loop :: #force_inline proc(loc := #caller_location) -> (^E _tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { // Receive operations queued from other threads first. - { - sync.guard(&l.queue_mu) - for op in queue.pop_front_safe(&l.queue) { - _exec(op) - } + for { + op := (^Operation)(mpsc_dequeue(&l.queue)) + if op == nil { break } + _exec(op) } return __tick(l, timeout) diff --git a/core/nbio/impl_linux.odin b/core/nbio/impl_linux.odin index cdcbeedc1..552133e67 100644 --- a/core/nbio/impl_linux.odin +++ b/core/nbio/impl_linux.odin @@ -472,6 +472,11 @@ _wake_up :: proc(l: ^Event_Loop) { assert(n == 8) } +@(private="package") +_yield :: proc() { + linux.sched_yield() +} + // Start file private. // The size of the IO Uring queues. diff --git a/core/nbio/impl_others.odin b/core/nbio/impl_others.odin index cac1f0c63..1c1e7674e 100644 --- a/core/nbio/impl_others.odin +++ b/core/nbio/impl_others.odin @@ -215,3 +215,6 @@ _associate_socket :: proc(socket: Any_Socket, l: ^Event_Loop) -> Association_Err _wake_up :: proc(l: ^Event_Loop) { } + +_yield :: proc() { +} diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index e003f6ea3..ed65a05b0 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -526,6 +526,11 @@ _wake_up :: proc(l: ^Event_Loop) { assert(n == 0) } +@(private="package") +_yield :: proc() { + posix.sched_yield() +} + // Start file private. // Max operations that can be enqueued per tick. diff --git a/core/nbio/impl_windows.odin b/core/nbio/impl_windows.odin index e7987671d..fbbe2c2ce 100644 --- a/core/nbio/impl_windows.odin +++ b/core/nbio/impl_windows.odin @@ -107,17 +107,15 @@ _Stat :: struct {} _init :: proc(l: ^Event_Loop, alloc: mem.Allocator) -> (err: General_Error) { l.allocator = alloc - mem_err: mem.Allocator_Error - if mem_err = queue.init(&l.completed, allocator = alloc); mem_err != nil { - err = .Allocation_Failed - return - } - defer if err != nil { queue.destroy(&l.completed) } + l.completed.data.allocator = l.allocator avl.init(&l.timeouts, timeouts_cmp, alloc) win.ensure_winsock_initialized() + mpsc_init(&l.completed_oob, QUEUE_SIZE, l.allocator) + defer if err != nil { mpsc_destroy(&l.completed_oob, l.allocator) } + l.iocp = win.CreateIoCompletionPort(win.INVALID_HANDLE_VALUE, nil, 0, 1) if l.iocp == nil { err = General_Error(win.GetLastError()) @@ -145,8 +143,9 @@ _init :: proc(l: ^Event_Loop, alloc: mem.Allocator) -> (err: General_Error) { @(private="package") _destroy :: proc(l: ^Event_Loop) { - queue.destroy(&l.completed) avl.destroy(&l.timeouts) + queue.destroy(&l.completed) + mpsc_destroy(&l.completed_oob, l.allocator) win.CloseHandle(l.iocp) } @@ -754,8 +753,15 @@ _wake_up :: proc(l: ^Event_Loop) { ) } +@(private="package") +_yield :: proc() { + win.SwitchToThread() +} + // Start file private. +QUEUE_SIZE :: 128 + REMOVED :: rawptr(max(uintptr)-1) INVALID_HANDLE :: Handle(win.INVALID_HANDLE) diff --git a/core/nbio/mpsc.odin b/core/nbio/mpsc.odin new file mode 100644 index 000000000..7f88829b4 --- /dev/null +++ b/core/nbio/mpsc.odin @@ -0,0 +1,63 @@ +#+private +package nbio + +import "base:runtime" + +import "core:sync" + +Multi_Producer_Single_Consumer :: struct { + count: int, + head: int, + tail: int, + buffer: []rawptr, + mask: int, +} + +mpsc_init :: proc(mpscq: ^Multi_Producer_Single_Consumer, cap: int, allocator: runtime.Allocator) -> runtime.Allocator_Error { + assert(runtime.is_power_of_two_int(cap), "cap must be a power of 2") + mpscq.buffer = make([]rawptr, cap, allocator) or_return + mpscq.mask = cap-1 + sync.atomic_thread_fence(.Release) + return nil +} + +mpsc_destroy :: proc(mpscq: ^Multi_Producer_Single_Consumer, allocator: runtime.Allocator) { + delete(mpscq.buffer, allocator) +} + +mpsc_enqueue :: proc(mpscq: ^Multi_Producer_Single_Consumer, obj: rawptr) -> bool { + count := sync.atomic_add_explicit(&mpscq.count, 1, .Acquire) + if count >= len(mpscq.buffer) { + sync.atomic_sub_explicit(&mpscq.count, 1, .Release) + return false + } + + head := sync.atomic_add_explicit(&mpscq.head, 1, .Acquire) + assert(mpscq.buffer[head & mpscq.mask] == nil) + rv := sync.atomic_exchange_explicit(&mpscq.buffer[head & mpscq.mask], obj, .Release) + assert(rv == nil) + return true +} + +mpsc_dequeue :: proc(mpscq: ^Multi_Producer_Single_Consumer) -> rawptr { + ret := sync.atomic_exchange_explicit(&mpscq.buffer[mpscq.tail], nil, .Acquire) + if ret == nil { + return nil + } + + mpscq.tail += 1 + if mpscq.tail >= len(mpscq.buffer) { + mpscq.tail = 0 + } + r := sync.atomic_sub_explicit(&mpscq.count, 1, .Release) + assert(r > 0) + return ret +} + +mpsc_count :: proc(mpscq: ^Multi_Producer_Single_Consumer) -> int { + return sync.atomic_load_explicit(&mpscq.count, .Relaxed) +} + +mpsc_cap :: proc(mpscq: ^Multi_Producer_Single_Consumer) -> int { + return len(mpscq.buffer) +} \ No newline at end of file diff --git a/core/nbio/nbio.odin b/core/nbio/nbio.odin index 274cc5291..703a2b4d7 100644 --- a/core/nbio/nbio.odin +++ b/core/nbio/nbio.odin @@ -1,11 +1,10 @@ package nbio import "base:intrinsics" +import "base:runtime" import "core:container/pool" -import "core:container/queue" import "core:net" -import "core:sync" import "core:time" /* @@ -23,14 +22,13 @@ Do not copy. */ Event_Loop :: struct /* #no_copy */ { using impl: _Event_Loop, + allocator: runtime.Allocator, err: General_Error, refs: int, now: time.Time, // Queue that is used to queue operations from another thread to be executed on this thread. - // TODO: Better data-structure. - queue: queue.Queue(^Operation), - queue_mu: sync.Mutex, + queue: Multi_Producer_Single_Consumer, operation_pool: pool.Pool(Operation), } @@ -408,13 +406,10 @@ exec :: proc(op: ^Operation, trigger_wake_up := true) { if op.l == &_tls_event_loop { _exec(op) } else { - { - // TODO: Better data-structure. - sync.guard(&op.l.queue_mu) - _, err := queue.push_back(&op.l.queue, op) - if err != nil { - panic("exec: queueing operation failed due to memory allocation failure") - } + for !mpsc_enqueue(&op.l.queue, op) { + warn("operation queue on event loop filled up") + wake_up(op.l) + _yield() } if trigger_wake_up { wake_up(op.l) From 2caee687ed76b5ae883444bab67c0c1a157f25df Mon Sep 17 00:00:00 2001 From: laytan Date: Sat, 17 Jan 2026 21:06:13 +0100 Subject: [PATCH 210/766] nbio(windows): use one IOCP for all event loops --- core/nbio/impl_posix.odin | 1 + core/nbio/impl_windows.odin | 236 ++++++++++++++++++++++----------- core/sys/windows/kernel32.odin | 4 + core/sys/windows/types.odin | 2 + 4 files changed, 169 insertions(+), 74 deletions(-) diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index ed65a05b0..19a61c256 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -510,6 +510,7 @@ _associate_socket :: proc(socket: Any_Socket, l: ^Event_Loop) -> Association_Err @(private="package") _wake_up :: proc(l: ^Event_Loop) { + // TODO: only if we are sleeping (like Windows). ev := [1]kq.KEvent{ { ident = IDENT_WAKE_UP, diff --git a/core/nbio/impl_windows.odin b/core/nbio/impl_windows.odin index fbbe2c2ce..af4518cb7 100644 --- a/core/nbio/impl_windows.odin +++ b/core/nbio/impl_windows.odin @@ -8,10 +8,11 @@ import "core:container/pool" import "core:container/queue" import "core:mem" import "core:net" +import "core:path/filepath" import "core:slice" import "core:strings" +import "core:sync" import "core:time" -import "core:path/filepath" import win "core:sys/windows" @@ -20,10 +21,15 @@ _FULLY_SUPPORTED :: true @(private="package") _Event_Loop :: struct { - iocp: win.HANDLE, - allocator: mem.Allocator, - timeouts: avl.Tree(^Operation), - completed: queue.Queue(^Operation), + timeouts: avl.Tree(^Operation), + thread: win.HANDLE, + completed: queue.Queue(^Operation), + completed_oob: Multi_Producer_Single_Consumer, + state: enum { + Working, + Waking, + Sleeping, + }, } @(private="package") @@ -111,34 +117,19 @@ _init :: proc(l: ^Event_Loop, alloc: mem.Allocator) -> (err: General_Error) { avl.init(&l.timeouts, timeouts_cmp, alloc) - win.ensure_winsock_initialized() - mpsc_init(&l.completed_oob, QUEUE_SIZE, l.allocator) defer if err != nil { mpsc_destroy(&l.completed_oob, l.allocator) } - l.iocp = win.CreateIoCompletionPort(win.INVALID_HANDLE_VALUE, nil, 0, 1) - if l.iocp == nil { - err = General_Error(win.GetLastError()) - return - } + dup_ok := win.DuplicateHandle( + win.GetCurrentProcess(), win.GetCurrentThread(), + win.GetCurrentProcess(), &l.thread, + 0, false, win.DUPLICATE_SAME_ACCESS, + ) + ensure(dup_ok == true) + defer if err != nil { win.CloseHandle(l.thread) } + err = g_ref() return - - timeouts_cmp :: #force_inline proc(a, b: ^Operation) -> slice.Ordering { - switch { - case a.timeout._impl.expires._nsec < b.timeout._impl.expires._nsec: - return .Less - case a.timeout._impl.expires._nsec > b.timeout._impl.expires._nsec: - return .Greater - case uintptr(a) < uintptr(b): - return .Less - case uintptr(a) > uintptr(b): - return .Greater - case: - assert(a == b) - return .Equal - } - } } @(private="package") @@ -146,7 +137,8 @@ _destroy :: proc(l: ^Event_Loop) { avl.destroy(&l.timeouts) queue.destroy(&l.completed) mpsc_destroy(&l.completed_oob, l.allocator) - win.CloseHandle(l.iocp) + win.CloseHandle(l.thread) + g_unref() } @(private="package") @@ -165,10 +157,16 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { } } + for { + op := (^Operation)(mpsc_dequeue(&l.completed_oob)) + if op == nil { break } + handle_completed(op) + } + if pool.num_outstanding(&l.operation_pool) == 0 { return nil } actual_timeout := win.INFINITE - if queue.len(l.completed) > 0 { + if queue.len(l.completed) > 0 || mpsc_count(&l.completed_oob) > 0 { actual_timeout = 0 } else if timeout >= 0 { actual_timeout = win.DWORD(timeout / time.Millisecond) @@ -177,14 +175,33 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { actual_timeout = min(actual_timeout, win.DWORD(nt / time.Millisecond)) } + if actual_timeout > 0 { + sync.atomic_store_explicit(&l.state, .Sleeping, .Release) + + // There could be a race condition where we go sleeping at the same time as things get queued + // and a wakeup isn't done because the state is not .Sleeping yet. + // So after sleeping we first check our queues. + + for { + op := (^Operation)(mpsc_dequeue(&l.queue)) + if op == nil { break } + _exec(op) + } + + for { + op := (^Operation)(mpsc_dequeue(&l.completed_oob)) + if op == nil { break } + handle_completed(op) + } + } + for { - QUEUE_SIZE :: 256 - events: [QUEUE_SIZE]win.OVERLAPPED_ENTRY + events: [256]win.OVERLAPPED_ENTRY entries_removed: win.ULONG - if !win.GetQueuedCompletionStatusEx(l.iocp, &events[0], len(events), &entries_removed, actual_timeout, false) { + if !win.GetQueuedCompletionStatusEx(g.iocp, &events[0], len(events), &entries_removed, actual_timeout, true) { winerr := win.GetLastError() switch winerr { - case win.WAIT_TIMEOUT: + case win.WAIT_TIMEOUT, win.WAIT_IO_COMPLETION: entries_removed = 0 case: err = General_Error(winerr) @@ -192,6 +209,8 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { } } + sync.atomic_store_explicit(&l.state, .Working, .Relaxed) + if actual_timeout > 0 { // We may have just waited some time, lets update the current time. l.now = time.now() @@ -202,13 +221,23 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { } for event in events[:entries_removed] { - if event.lpCompletionKey == COMPLETION_KEY_WAKE_UP { continue } assert(event.lpOverlapped != nil) op := container_of(container_of(event.lpOverlapped, _Operation, "over"), Operation, "_impl") - handle_completed(op) + + if op.l == l { + handle_completed(op) + } else { + op_l := op.l + for !mpsc_enqueue(&op.l.completed_oob, op) { + warn("oob queue filled up, QUEUE_SIZE may need increasing") + _wake_up(op_l) + win.SwitchToThread() + } + _wake_up(op_l) + } } - if entries_removed < QUEUE_SIZE { + if entries_removed < len(events) { break } @@ -657,7 +686,7 @@ _remove :: proc(target: ^Operation) { target.poll._impl.wait_handle = nil ok := win.PostQueuedCompletionStatus( - target.l.iocp, + g.iocp, 0, 0, &target._impl.over, @@ -710,8 +739,8 @@ _remove :: proc(target: ^Operation) { @(private="package") _associate_handle :: proc(handle: uintptr, l: ^Event_Loop) -> (Handle, Association_Error) { - handle_iocp := win.CreateIoCompletionPort(win.HANDLE(handle), l.iocp, 0, 0) - if handle_iocp != l.iocp { + handle_iocp := win.CreateIoCompletionPort(win.HANDLE(handle), g.iocp, 0, 0) + if handle_iocp != g.iocp { return INVALID_HANDLE, .Not_Possible_To_Associate } @@ -745,12 +774,10 @@ _associate_socket :: proc(socket: Any_Socket, l: ^Event_Loop) -> Association_Err @(private="package") _wake_up :: proc(l: ^Event_Loop) { - win.PostQueuedCompletionStatus( - l.iocp, - 0, - COMPLETION_KEY_WAKE_UP, - nil, - ) + _, exchanged := sync.atomic_compare_exchange_strong(&l.state, .Sleeping, .Waking) + if exchanged { + win.QueueUserAPC(proc "system" (Parameter: win.ULONG_PTR) {}, l.thread, 0) + } } @(private="package") @@ -766,13 +793,50 @@ REMOVED :: rawptr(max(uintptr)-1) INVALID_HANDLE :: Handle(win.INVALID_HANDLE) -COMPLETION_KEY_WAKE_UP :: 69 - Op_Result :: enum { Done, Pending, } +/* +IOCP is designed to be used from multiple threads. +For best performance we need to adhere to that and have one single IOCP for the event loops to share. +*/ +g: struct{ + mu: sync.Mutex, + refs: int, + iocp: win.HANDLE, + err: General_Error, +} + +g_ref :: proc() -> General_Error { + sync.guard(&g.mu) + + if g.refs == 0 { + win.ensure_winsock_initialized() + + // NOTE: setting NumberOfConcurrentThreads to 0 which makes Windows use the amount of processors as a default. + // We may want to make this configurable somehow? + g.iocp = win.CreateIoCompletionPort(win.INVALID_HANDLE_VALUE, nil, 0, 0) + if g.iocp == nil { + g.err = General_Error(win.GetLastError()) + } + } + + sync.atomic_add(&g.refs, 1) + + return sync.atomic_load(&g.err) +} + +g_unref :: proc() { + sync.guard(&g.mu) + + if sync.atomic_sub(&g.refs, 1) == 1 { + win.CloseHandle(g.iocp) + g.err = nil + } +} + operation_handle :: proc(op: ^Operation) -> win.HANDLE { switch op.type { case .Accept: return win.HANDLE(uintptr(op.accept.socket)) @@ -860,11 +924,11 @@ accept_exec :: proc(op: ^Operation) -> Op_Result { &received, &op._impl.over, ) { - if op._impl.over.Internal == nil { - op.accept.err = net._accept_error() - } else if is_pending(op._impl.over) { + if is_pending(op._impl.over) || (op._impl.over.Internal == nil && is_incomplete(win.System_Error(win.GetLastError()))) { link_timeout(op, op.accept.expires) return .Pending + } else if op._impl.over.Internal == nil { + op.accept.err = net._accept_error() } } @@ -962,14 +1026,12 @@ dial_exec :: proc(op: ^Operation) -> (result: Op_Result) { &transferred, &op._impl.over, ) { - if op._impl.over.Internal == nil { - op.dial.err = net._dial_error() - } else if is_pending(op._impl.over) { + if is_pending(op._impl.over) || (op._impl.over.Internal == nil && is_incomplete(win.System_Error(win.GetLastError()))) { link_timeout(op, op.dial.expires) return .Pending + } else if op._impl.over.Internal == nil { + op.dial.err = net._dial_error() } - - return .Done } return .Done @@ -1019,11 +1081,16 @@ read_exec :: proc(op: ^Operation) -> Op_Result { &op._impl.over, ) { assert(read == 0) - if op._impl.over.Internal == nil { - op.read.err = FS_Error(win.GetLastError()) - } else if is_pending(op._impl.over) { + if is_pending(op._impl.over) { link_timeout(op, op.read.expires) return .Pending + } else if op._impl.over.Internal == nil { + err := win.GetLastError() + if is_incomplete(win.System_Error(err)) { + link_timeout(op, op.read.expires) + return .Pending + } + op.read.err = FS_Error(err) } } @@ -1088,11 +1155,16 @@ write_exec :: proc(op: ^Operation) -> Op_Result { &op._impl.over, ) { assert(written == 0) - if op._impl.over.Internal == nil { - op.write.err = FS_Error(win.GetLastError()) - } else if is_pending(op._impl.over) { + if is_pending(op._impl.over) { link_timeout(op, op.write.expires) return .Pending + } else if op._impl.over.Internal == nil { + err := win.GetLastError() + if is_incomplete(win.System_Error(err)) { + link_timeout(op, op.write.expires) + return .Pending + } + op.write.err = FS_Error(err) } } @@ -1180,14 +1252,14 @@ recv_exec :: proc(op: ^Operation) -> Op_Result { } if status == win.SOCKET_ERROR { - if op._impl.over.Internal == nil { + if is_pending(op._impl.over) || (op._impl.over.Internal == nil && is_incomplete(win.System_Error(win.GetLastError()))) { + link_timeout(op, op.recv.expires) + return .Pending + } else if op._impl.over.Internal == nil { switch _ in op.recv.socket { case TCP_Socket: op.recv.err = net._tcp_recv_error() case UDP_Socket: op.recv.err = net._udp_recv_error() } - } else if is_pending(op._impl.over) { - link_timeout(op, op.recv.expires) - return .Pending } } @@ -1301,14 +1373,14 @@ send_exec :: proc(op: ^Operation) -> Op_Result { } if status == win.SOCKET_ERROR { - if op._impl.over.Internal == nil { + if is_pending(op._impl.over) || (op._impl.over.Internal == nil && is_incomplete(win.System_Error(win.GetLastError()))) { + link_timeout(op, op.send.expires) + return .Pending + } else if op._impl.over.Internal == nil { switch _ in op.send.socket { case TCP_Socket: op.send.err = net._tcp_send_error() case UDP_Socket: op.send.err = net._udp_send_error() } - } else if is_pending(op._impl.over) { - link_timeout(op, op.send.expires) - return .Pending } } @@ -1394,11 +1466,11 @@ sendfile_exec :: proc(op: ^Operation) -> Op_Result { nil, 0, ) { - if op._impl.over.Internal == nil { - op.sendfile.err = net._tcp_send_error() - } else if is_pending(op._impl.over) { + if is_pending(op._impl.over) || (op._impl.over.Internal == nil && is_incomplete(win.System_Error(win.GetLastError()))) { link_timeout(op, op.sendfile.expires) return .Pending + } else if op._impl.over.Internal == nil { + op.sendfile.err = net._tcp_send_error() } } @@ -1496,7 +1568,7 @@ poll_exec :: proc(op: ^Operation) -> Op_Result { } ok := win.PostQueuedCompletionStatus( - op.l.iocp, + g.iocp, 0, 0, &op._impl.over, @@ -1750,3 +1822,19 @@ load_socket_fn :: proc(subject: win.SOCKET, guid: win.GUID, fn: ^$T) { check_timed_out :: proc(op: ^Operation, expires: time.Time) -> bool { return expires != {} && time.diff(op.l.now, expires) <= 0 } + +timeouts_cmp :: #force_inline proc(a, b: ^Operation) -> slice.Ordering { + switch { + case a.timeout._impl.expires._nsec < b.timeout._impl.expires._nsec: + return .Less + case a.timeout._impl.expires._nsec > b.timeout._impl.expires._nsec: + return .Greater + case uintptr(a) < uintptr(b): + return .Less + case uintptr(a) > uintptr(b): + return .Greater + case: + assert(a == b) + return .Equal + } +} \ No newline at end of file diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index dc76cb037..07f34bed2 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -32,6 +32,8 @@ EV_TXEMPTY :: DWORD(0x0004) WAITORTIMERCALLBACK :: #type proc "system" (lpParameter: PVOID, TimerOrWaitFired: BOOLEAN) +PAPCFUNC :: #type proc "system" (Parameter: ULONG_PTR) + WT_EXECUTEDEFAULT :: 0x00000000 WT_EXECUTEINIOTHREAD :: 0x00000001 WT_EXECUTEINPERSISTENTTHREAD :: 0x00000080 @@ -596,6 +598,8 @@ foreign kernel32 { ) -> BOOL --- UnregisterWaitEx :: proc(WaitHandle: HANDLE, CompletionEvent: HANDLE) -> BOOL --- + + QueueUserAPC :: proc(pfnAPC: PAPCFUNC, hThread: HANDLE, dwData: ULONG_PTR) -> DWORD --- } DEBUG_PROCESS :: 0x00000001 diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 0d8854724..f3f581844 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -2726,6 +2726,8 @@ WAIT_OBJECT_0 : DWORD : 0x00000000 WAIT_TIMEOUT : DWORD : 258 WAIT_FAILED : DWORD : 0xFFFFFFFF +WAIT_IO_COMPLETION: DWORD : 0x000000C0 + FILE_FLAG_WRITE_THROUGH : DWORD : 0x80000000 FILE_FLAG_OVERLAPPED : DWORD : 0x40000000 FILE_FLAG_NO_BUFFERING : DWORD : 0x20000000 From 54abe76f20f73132877edcb2371f1231cd02a99d Mon Sep 17 00:00:00 2001 From: laytan Date: Sat, 17 Jan 2026 21:10:53 +0100 Subject: [PATCH 211/766] nbio: forgot to remove allocator from other impls --- core/nbio/impl_linux.odin | 3 --- core/nbio/impl_others.odin | 2 -- core/nbio/impl_posix.odin | 2 -- 3 files changed, 7 deletions(-) diff --git a/core/nbio/impl_linux.odin b/core/nbio/impl_linux.odin index 552133e67..47d47d77c 100644 --- a/core/nbio/impl_linux.odin +++ b/core/nbio/impl_linux.odin @@ -23,7 +23,6 @@ _Event_Loop :: struct { unqueued: queue.Queue(^Operation), // Ready to run callbacks, mainly next tick, some other ops that error outside the kernel. completed: queue.Queue(^Operation), - allocator: mem.Allocator, wake: ^Operation, } @@ -128,8 +127,6 @@ _Stat :: struct { @(private="package") _init :: proc(l: ^Event_Loop, alloc: mem.Allocator) -> (err: General_Error) { - l.allocator = alloc - params := uring.DEFAULT_PARAMS params.flags += {.SUBMIT_ALL, .COOP_TASKRUN, .SINGLE_ISSUER} diff --git a/core/nbio/impl_others.odin b/core/nbio/impl_others.odin index 1c1e7674e..0a4564454 100644 --- a/core/nbio/impl_others.odin +++ b/core/nbio/impl_others.odin @@ -19,7 +19,6 @@ _FULLY_SUPPORTED :: false _Event_Loop :: struct { completed: queue.Queue(^Operation), timeouts: avl.Tree(^Operation), - allocator: mem.Allocator, } _Handle :: uintptr @@ -69,7 +68,6 @@ _Remove :: struct {} _Link_Timeout :: struct {} _init :: proc(l: ^Event_Loop, allocator: mem.Allocator) -> (rerr: General_Error) { - l.allocator = allocator l.completed.data.allocator = allocator avl.init_cmp(&l.timeouts, timeouts_cmp, allocator) diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index 19a61c256..9b4863710 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -23,7 +23,6 @@ _Event_Loop :: struct { // We have to keep record of what we currently have in the kqueue, and if we get an operation // that would be the same (ident, filter) pair we need to bundle the operations under one kevent. submitted: map[Queue_Identifier]^Operation, - allocator: mem.Allocator, // Holds all events we want to flush. Flushing is done each tick at which point this is emptied. pending: sa.Small_Array(QUEUE_SIZE, kq.KEvent), // Holds what should be in `pending` but didn't fit. @@ -107,7 +106,6 @@ _Link_Timeout :: struct {} @(private="package") _init :: proc(l: ^Event_Loop, allocator: mem.Allocator) -> (rerr: General_Error) { - l.allocator = allocator l.submitted.allocator = allocator l.overflow.data.allocator = allocator l.completed.data.allocator = allocator From 454f75cb2288e171cd4d40879938ea970e3b9019 Mon Sep 17 00:00:00 2001 From: rykad <> Date: Sat, 17 Jan 2026 22:26:25 +0000 Subject: [PATCH 212/766] core:encoding/base64: add support for url variant --- core/encoding/base64/base64.odin | 49 ++++++++++++++++++++++++++ tests/core/encoding/base64/base64.odin | 17 ++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/core/encoding/base64/base64.odin b/core/encoding/base64/base64.odin index 032716bde..0677fdfb7 100644 --- a/core/encoding/base64/base64.odin +++ b/core/encoding/base64/base64.odin @@ -24,6 +24,18 @@ ENC_TABLE := [64]byte { '4', '5', '6', '7', '8', '9', '+', '/', } +// Encoding table for Base64url variant +ENC_URL_TABLE := [64]byte { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '-', '_', +} + PADDING :: '=' DEC_TABLE := [256]u8 { @@ -61,6 +73,43 @@ DEC_TABLE := [256]u8 { 0, 0, 0, 0, 0, 0, 0, 0, } +// Decoding table for Base64url variant +DEC_URL_TABLE := [256]u8 { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 62, 0, 0, + 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 0, 0, 0, 0, 63, + 0, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +} + + encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> (encoded: string, err: mem.Allocator_Error) #optional_allocator_error { out_length := encoded_len(data) if out_length == 0 { diff --git a/tests/core/encoding/base64/base64.odin b/tests/core/encoding/base64/base64.odin index ed1bee8af..93b3afb59 100644 --- a/tests/core/encoding/base64/base64.odin +++ b/tests/core/encoding/base64/base64.odin @@ -50,4 +50,19 @@ test_roundtrip :: proc(t: ^testing.T) { for v, i in decoded { testing.expect_value(t, v, values[i]) } -} \ No newline at end of file +} + +@(test) +test_base64url :: proc(t: ^testing.T) { + plain := ">>>" + url := "Pj4-" + + encoded := base64.encode(transmute([]byte)plain, base64.ENC_URL_TABLE) + defer delete(encoded) + testing.expect_value(t, encoded, url) + + decoded := string(base64.decode(url, base64.DEC_URL_TABLE)) + defer delete(decoded) + testing.expect_value(t, decoded, plain) + +} From 227e7920a84ca6d899edcabcdd7fb04dde447f97 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 18 Jan 2026 10:45:58 +0000 Subject: [PATCH 213/766] Add `unescape_string` and `unescape_entity` --- core/html/escape.odin | 191 ++- core/html/html_entities.odin | 2275 ++++++++++++++++++++++++++++++++++ 2 files changed, 2465 insertions(+), 1 deletion(-) create mode 100644 core/html/html_entities.odin diff --git a/core/html/escape.odin b/core/html/escape.odin index dfdcc6f92..011d1f4cd 100644 --- a/core/html/escape.odin +++ b/core/html/escape.odin @@ -1,5 +1,10 @@ package html +import "base:runtime" +import "core:fmt" +import "core:strings" +import "core:unicode/utf8" + // escape_string escapes special characters like '&' to become '&'. // It escapes only 5 different characters: & ' < > and ". @(require_results) @@ -56,4 +61,188 @@ escape_string :: proc(s: string, allocator := context.allocator, loc := #caller_ } output = string(t[0:w]) return -} \ No newline at end of file +} + +@(require_results) +unescape_string :: proc(s: string, entity_map: Entity_Map, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool, err: runtime.Allocator_Error) { + @(require_results) + do_append :: proc(s: string, amp_idx: int, entity_map: Entity_Map, buf: ^[dynamic]byte) -> (n: int) { + s, amp_idx := s, amp_idx + + n += len(s[:amp_idx]) + if buf != nil { append(buf, s[:amp_idx]) } + s = s[amp_idx:] + for len(s) > 0 { + b, w, j := unescape_entity(s, entity_map) + n += w + if buf != nil { append(buf, ..b[:w]) } + + s = s[j:] + + amp_idx = strings.index_byte(s, '&') + if amp_idx < 0 { + n += len(s) + if buf != nil { append(buf, s) } + break + } + n += amp_idx + if buf != nil { append(buf, s[:amp_idx]) } + s = s[amp_idx:] + } + + return + } + + s := s + amp_idx := strings.index_byte(s, '&') + if amp_idx < 0 { + return s, false, nil + } + + // NOTE(bill): this does a two pass in order to minimize the allocations required + bytes_required := do_append(s, amp_idx, entity_map, nil) + + buf := make([dynamic]byte, 0, bytes_required, allocator, loc) or_return + was_allocation = true + + _ = do_append(s, amp_idx, entity_map, &buf) + + assert(len(buf) == cap(buf)) + output = string(buf[:]) + + return +} + +// Returns an unescaped string of an encoded HTML entity. +@(require_results) +unescape_entity :: proc(s: string, entity_map: Entity_Map) -> (b: [8]byte, w: int, j: int) { + s := s + if len(s) < 2 { + return + } + if s[0] != '&' { + return + } + j = 1 + + if s[j] == '#' { // scan numbers + j += 1 + if len(s) <= 3 { // remove `&#.` + return + } + c := s[j] + hex := false + if c == 'x' || c == 'X' { + hex = true + j += 1 + } + + x := rune(0) + scan_number: for j < len(s) { + c = s[j] + j += 1 + if hex { + switch c { + case '0'..='9': x = 16*x + rune(c) - '0'; continue scan_number + case 'a'..='f': x = 16*x + rune(c) - 'a' + 10; continue scan_number + case 'A'..='F': x = 16*x + rune(c) - 'A' + 10; continue scan_number + } + } else { + switch c { + case '0'..='9': x = 10*x + rune(c) - '0'; continue scan_number + } + } + + // Keep the ';' to check for cases which require it and cases which might not + if c != ';' { + j -= 1 + } + break scan_number + } + + + if j <= 3 { // no replacement characters found + return + } + + @(static, rodata) + windows_1252_replacement_table := [0xa0 - 0x80]rune{ // Windows-1252 -> UTF-8 + '\u20ac', '\u0081', '\u201a', '\u0192', + '\u201e', '\u2026', '\u2020', '\u2021', + '\u02c6', '\u2030', '\u0160', '\u2039', + '\u0152', '\u008d', '\u017d', '\u008f', + '\u0090', '\u2018', '\u2019', '\u201c', + '\u201d', '\u2022', '\u2013', '\u2014', + '\u02dc', '\u2122', '\u0161', '\u203a', + '\u0153', '\u009d', '\u017e', '\u0178', + } + + switch x { + case 0x80..<0xa0: + x = windows_1252_replacement_table[x-0x80] + case 0, 0xd800..=0xdfff: + x = utf8.RUNE_ERROR + case: + if x > 0x10ffff { + x = utf8.RUNE_ERROR + } + + } + + b1, w1 := utf8.encode_rune(x) + w += copy(b[:], b1[:w1]) + return + } + + // Lookup by entity names + + scan_ident: for j < len(s) { // scan over letters and digits + c := s[j] + j += 1 + + switch c { + case 'a'..='z', 'A'..='Z', '0'..='9': + continue scan_ident + } + // Keep the ';' to check for cases which require it and cases which might not + if c != ';' { + j -= 1 + } + break scan_ident + } + + entity_name := s[1:j] + if len(entity_name) == 0 { + return + } + + if r, ok := entity_map.entity1[entity_name]; ok { + b1, w1 := utf8.encode_rune(r) + copy(b[:], b1[:w1]) + w = w1 + return + } + + if r2, ok := entity_map.entity2[entity_name]; ok { + b1, w1 := utf8.encode_rune(r2[0]) + b2, w2 := utf8.encode_rune(r2[1]) + w += copy(b[w:], b1[:w1]) + w += copy(b[w:], b2[:w2]) + return + } + + // The longest entities that do not end with a semicolon are <=6 bytes long + LONGEST_ENTITY_WITHOUT_SEMICOLON :: 6 + + n := min(len(entity_name)-1, LONGEST_ENTITY_WITHOUT_SEMICOLON) + for i := n; i > 1; i -= 1 { + if r, ok := entity_map.entity1[entity_name[:i]]; ok { + b1, w1 := utf8.encode_rune(r) + copy(b[:], b1[:w1]) + w = w1 + return + } + } + + return +} diff --git a/core/html/html_entities.odin b/core/html/html_entities.odin new file mode 100644 index 000000000..be52f5d26 --- /dev/null +++ b/core/html/html_entities.odin @@ -0,0 +1,2275 @@ +package html + +Entity_Map :: struct { + entity1: map[string]rune, + entity2: map[string][2]rune, +} + + +entity_map_create :: proc(allocator := context.allocator) -> (m: Entity_Map) { + m.entity1.allocator = allocator + m.entity2.allocator = allocator + + reserve(&m.entity1, len(_entity1)*2) + reserve(&m.entity2, len(_entity2)*2) + + for &e in _entity1 { + map_insert(&m.entity1, e.n, e.r) + } + + for &e in _entity2 { + map_insert(&m.entity2, e.n, e.r) + } + + return +} + +entity_map_destroy :: proc(m: ^Entity_Map) { + delete(m.entity1) + delete(m.entity2) + m^ = {} +} + + +// Generated from http://www.w3.org/TR/html4/sgml/entities.html + + +@(private="file", rodata) +_entity1 := [?]struct{n: string, r: rune}{ + {"AElig;", '\U000000C6'}, + {"AMP;", '\U00000026'}, + {"Aacute;", '\U000000C1'}, + {"Abreve;", '\U00000102'}, + {"Acirc;", '\U000000C2'}, + {"Acy;", '\U00000410'}, + {"Afr;", '\U0001D504'}, + {"Agrave;", '\U000000C0'}, + {"Alpha;", '\U00000391'}, + {"Amacr;", '\U00000100'}, + {"And;", '\U00002A53'}, + {"Aogon;", '\U00000104'}, + {"Aopf;", '\U0001D538'}, + {"ApplyFunction;", '\U00002061'}, + {"Aring;", '\U000000C5'}, + {"Ascr;", '\U0001D49C'}, + {"Assign;", '\U00002254'}, + {"Atilde;", '\U000000C3'}, + {"Auml;", '\U000000C4'}, + {"Backslash;", '\U00002216'}, + {"Barv;", '\U00002AE7'}, + {"Barwed;", '\U00002306'}, + {"Bcy;", '\U00000411'}, + {"Because;", '\U00002235'}, + {"Bernoullis;", '\U0000212C'}, + {"Beta;", '\U00000392'}, + {"Bfr;", '\U0001D505'}, + {"Bopf;", '\U0001D539'}, + {"Breve;", '\U000002D8'}, + {"Bscr;", '\U0000212C'}, + {"Bumpeq;", '\U0000224E'}, + {"CHcy;", '\U00000427'}, + {"COPY;", '\U000000A9'}, + {"Cacute;", '\U00000106'}, + {"Cap;", '\U000022D2'}, + {"CapitalDifferentialD;", '\U00002145'}, + {"Cayleys;", '\U0000212D'}, + {"Ccaron;", '\U0000010C'}, + {"Ccedil;", '\U000000C7'}, + {"Ccirc;", '\U00000108'}, + {"Cconint;", '\U00002230'}, + {"Cdot;", '\U0000010A'}, + {"Cedilla;", '\U000000B8'}, + {"CenterDot;", '\U000000B7'}, + {"Cfr;", '\U0000212D'}, + {"Chi;", '\U000003A7'}, + {"CircleDot;", '\U00002299'}, + {"CircleMinus;", '\U00002296'}, + {"CirclePlus;", '\U00002295'}, + {"CircleTimes;", '\U00002297'}, + {"ClockwiseContourIntegral;", '\U00002232'}, + {"CloseCurlyDoubleQuote;", '\U0000201D'}, + {"CloseCurlyQuote;", '\U00002019'}, + {"Colon;", '\U00002237'}, + {"Colone;", '\U00002A74'}, + {"Congruent;", '\U00002261'}, + {"Conint;", '\U0000222F'}, + {"ContourIntegral;", '\U0000222E'}, + {"Copf;", '\U00002102'}, + {"Coproduct;", '\U00002210'}, + {"CounterClockwiseContourIntegral;", '\U00002233'}, + {"Cross;", '\U00002A2F'}, + {"Cscr;", '\U0001D49E'}, + {"Cup;", '\U000022D3'}, + {"CupCap;", '\U0000224D'}, + {"DD;", '\U00002145'}, + {"DDotrahd;", '\U00002911'}, + {"DJcy;", '\U00000402'}, + {"DScy;", '\U00000405'}, + {"DZcy;", '\U0000040F'}, + {"Dagger;", '\U00002021'}, + {"Darr;", '\U000021A1'}, + {"Dashv;", '\U00002AE4'}, + {"Dcaron;", '\U0000010E'}, + {"Dcy;", '\U00000414'}, + {"Del;", '\U00002207'}, + {"Delta;", '\U00000394'}, + {"Dfr;", '\U0001D507'}, + {"DiacriticalAcute;", '\U000000B4'}, + {"DiacriticalDot;", '\U000002D9'}, + {"DiacriticalDoubleAcute;", '\U000002DD'}, + {"DiacriticalGrave;", '\U00000060'}, + {"DiacriticalTilde;", '\U000002DC'}, + {"Diamond;", '\U000022C4'}, + {"DifferentialD;", '\U00002146'}, + {"Dopf;", '\U0001D53B'}, + {"Dot;", '\U000000A8'}, + {"DotDot;", '\U000020DC'}, + {"DotEqual;", '\U00002250'}, + {"DoubleContourIntegral;", '\U0000222F'}, + {"DoubleDot;", '\U000000A8'}, + {"DoubleDownArrow;", '\U000021D3'}, + {"DoubleLeftArrow;", '\U000021D0'}, + {"DoubleLeftRightArrow;", '\U000021D4'}, + {"DoubleLeftTee;", '\U00002AE4'}, + {"DoubleLongLeftArrow;", '\U000027F8'}, + {"DoubleLongLeftRightArrow;", '\U000027FA'}, + {"DoubleLongRightArrow;", '\U000027F9'}, + {"DoubleRightArrow;", '\U000021D2'}, + {"DoubleRightTee;", '\U000022A8'}, + {"DoubleUpArrow;", '\U000021D1'}, + {"DoubleUpDownArrow;", '\U000021D5'}, + {"DoubleVerticalBar;", '\U00002225'}, + {"DownArrow;", '\U00002193'}, + {"DownArrowBar;", '\U00002913'}, + {"DownArrowUpArrow;", '\U000021F5'}, + {"DownBreve;", '\U00000311'}, + {"DownLeftRightVector;", '\U00002950'}, + {"DownLeftTeeVector;", '\U0000295E'}, + {"DownLeftVector;", '\U000021BD'}, + {"DownLeftVectorBar;", '\U00002956'}, + {"DownRightTeeVector;", '\U0000295F'}, + {"DownRightVector;", '\U000021C1'}, + {"DownRightVectorBar;", '\U00002957'}, + {"DownTee;", '\U000022A4'}, + {"DownTeeArrow;", '\U000021A7'}, + {"Downarrow;", '\U000021D3'}, + {"Dscr;", '\U0001D49F'}, + {"Dstrok;", '\U00000110'}, + {"ENG;", '\U0000014A'}, + {"ETH;", '\U000000D0'}, + {"Eacute;", '\U000000C9'}, + {"Ecaron;", '\U0000011A'}, + {"Ecirc;", '\U000000CA'}, + {"Ecy;", '\U0000042D'}, + {"Edot;", '\U00000116'}, + {"Efr;", '\U0001D508'}, + {"Egrave;", '\U000000C8'}, + {"Element;", '\U00002208'}, + {"Emacr;", '\U00000112'}, + {"EmptySmallSquare;", '\U000025FB'}, + {"EmptyVerySmallSquare;", '\U000025AB'}, + {"Eogon;", '\U00000118'}, + {"Eopf;", '\U0001D53C'}, + {"Epsilon;", '\U00000395'}, + {"Equal;", '\U00002A75'}, + {"EqualTilde;", '\U00002242'}, + {"Equilibrium;", '\U000021CC'}, + {"Escr;", '\U00002130'}, + {"Esim;", '\U00002A73'}, + {"Eta;", '\U00000397'}, + {"Euml;", '\U000000CB'}, + {"Exists;", '\U00002203'}, + {"ExponentialE;", '\U00002147'}, + {"Fcy;", '\U00000424'}, + {"Ffr;", '\U0001D509'}, + {"FilledSmallSquare;", '\U000025FC'}, + {"FilledVerySmallSquare;", '\U000025AA'}, + {"Fopf;", '\U0001D53D'}, + {"ForAll;", '\U00002200'}, + {"Fouriertrf;", '\U00002131'}, + {"Fscr;", '\U00002131'}, + {"GJcy;", '\U00000403'}, + {"GT;", '\U0000003E'}, + {"Gamma;", '\U00000393'}, + {"Gammad;", '\U000003DC'}, + {"Gbreve;", '\U0000011E'}, + {"Gcedil;", '\U00000122'}, + {"Gcirc;", '\U0000011C'}, + {"Gcy;", '\U00000413'}, + {"Gdot;", '\U00000120'}, + {"Gfr;", '\U0001D50A'}, + {"Gg;", '\U000022D9'}, + {"Gopf;", '\U0001D53E'}, + {"GreaterEqual;", '\U00002265'}, + {"GreaterEqualLess;", '\U000022DB'}, + {"GreaterFullEqual;", '\U00002267'}, + {"GreaterGreater;", '\U00002AA2'}, + {"GreaterLess;", '\U00002277'}, + {"GreaterSlantEqual;", '\U00002A7E'}, + {"GreaterTilde;", '\U00002273'}, + {"Gscr;", '\U0001D4A2'}, + {"Gt;", '\U0000226B'}, + {"HARDcy;", '\U0000042A'}, + {"Hacek;", '\U000002C7'}, + {"Hat;", '\U0000005E'}, + {"Hcirc;", '\U00000124'}, + {"Hfr;", '\U0000210C'}, + {"HilbertSpace;", '\U0000210B'}, + {"Hopf;", '\U0000210D'}, + {"HorizontalLine;", '\U00002500'}, + {"Hscr;", '\U0000210B'}, + {"Hstrok;", '\U00000126'}, + {"HumpDownHump;", '\U0000224E'}, + {"HumpEqual;", '\U0000224F'}, + {"IEcy;", '\U00000415'}, + {"IJlig;", '\U00000132'}, + {"IOcy;", '\U00000401'}, + {"Iacute;", '\U000000CD'}, + {"Icirc;", '\U000000CE'}, + {"Icy;", '\U00000418'}, + {"Idot;", '\U00000130'}, + {"Ifr;", '\U00002111'}, + {"Igrave;", '\U000000CC'}, + {"Im;", '\U00002111'}, + {"Imacr;", '\U0000012A'}, + {"ImaginaryI;", '\U00002148'}, + {"Implies;", '\U000021D2'}, + {"Int;", '\U0000222C'}, + {"Integral;", '\U0000222B'}, + {"Intersection;", '\U000022C2'}, + {"InvisibleComma;", '\U00002063'}, + {"InvisibleTimes;", '\U00002062'}, + {"Iogon;", '\U0000012E'}, + {"Iopf;", '\U0001D540'}, + {"Iota;", '\U00000399'}, + {"Iscr;", '\U00002110'}, + {"Itilde;", '\U00000128'}, + {"Iukcy;", '\U00000406'}, + {"Iuml;", '\U000000CF'}, + {"Jcirc;", '\U00000134'}, + {"Jcy;", '\U00000419'}, + {"Jfr;", '\U0001D50D'}, + {"Jopf;", '\U0001D541'}, + {"Jscr;", '\U0001D4A5'}, + {"Jsercy;", '\U00000408'}, + {"Jukcy;", '\U00000404'}, + {"KHcy;", '\U00000425'}, + {"KJcy;", '\U0000040C'}, + {"Kappa;", '\U0000039A'}, + {"Kcedil;", '\U00000136'}, + {"Kcy;", '\U0000041A'}, + {"Kfr;", '\U0001D50E'}, + {"Kopf;", '\U0001D542'}, + {"Kscr;", '\U0001D4A6'}, + {"LJcy;", '\U00000409'}, + {"LT;", '\U0000003C'}, + {"Lacute;", '\U00000139'}, + {"Lambda;", '\U0000039B'}, + {"Lang;", '\U000027EA'}, + {"Laplacetrf;", '\U00002112'}, + {"Larr;", '\U0000219E'}, + {"Lcaron;", '\U0000013D'}, + {"Lcedil;", '\U0000013B'}, + {"Lcy;", '\U0000041B'}, + {"LeftAngleBracket;", '\U000027E8'}, + {"LeftArrow;", '\U00002190'}, + {"LeftArrowBar;", '\U000021E4'}, + {"LeftArrowRightArrow;", '\U000021C6'}, + {"LeftCeiling;", '\U00002308'}, + {"LeftDoubleBracket;", '\U000027E6'}, + {"LeftDownTeeVector;", '\U00002961'}, + {"LeftDownVector;", '\U000021C3'}, + {"LeftDownVectorBar;", '\U00002959'}, + {"LeftFloor;", '\U0000230A'}, + {"LeftRightArrow;", '\U00002194'}, + {"LeftRightVector;", '\U0000294E'}, + {"LeftTee;", '\U000022A3'}, + {"LeftTeeArrow;", '\U000021A4'}, + {"LeftTeeVector;", '\U0000295A'}, + {"LeftTriangle;", '\U000022B2'}, + {"LeftTriangleBar;", '\U000029CF'}, + {"LeftTriangleEqual;", '\U000022B4'}, + {"LeftUpDownVector;", '\U00002951'}, + {"LeftUpTeeVector;", '\U00002960'}, + {"LeftUpVector;", '\U000021BF'}, + {"LeftUpVectorBar;", '\U00002958'}, + {"LeftVector;", '\U000021BC'}, + {"LeftVectorBar;", '\U00002952'}, + {"Leftarrow;", '\U000021D0'}, + {"Leftrightarrow;", '\U000021D4'}, + {"LessEqualGreater;", '\U000022DA'}, + {"LessFullEqual;", '\U00002266'}, + {"LessGreater;", '\U00002276'}, + {"LessLess;", '\U00002AA1'}, + {"LessSlantEqual;", '\U00002A7D'}, + {"LessTilde;", '\U00002272'}, + {"Lfr;", '\U0001D50F'}, + {"Ll;", '\U000022D8'}, + {"Lleftarrow;", '\U000021DA'}, + {"Lmidot;", '\U0000013F'}, + {"LongLeftArrow;", '\U000027F5'}, + {"LongLeftRightArrow;", '\U000027F7'}, + {"LongRightArrow;", '\U000027F6'}, + {"Longleftarrow;", '\U000027F8'}, + {"Longleftrightarrow;", '\U000027FA'}, + {"Longrightarrow;", '\U000027F9'}, + {"Lopf;", '\U0001D543'}, + {"LowerLeftArrow;", '\U00002199'}, + {"LowerRightArrow;", '\U00002198'}, + {"Lscr;", '\U00002112'}, + {"Lsh;", '\U000021B0'}, + {"Lstrok;", '\U00000141'}, + {"Lt;", '\U0000226A'}, + {"Map;", '\U00002905'}, + {"Mcy;", '\U0000041C'}, + {"MediumSpace;", '\U0000205F'}, + {"Mellintrf;", '\U00002133'}, + {"Mfr;", '\U0001D510'}, + {"MinusPlus;", '\U00002213'}, + {"Mopf;", '\U0001D544'}, + {"Mscr;", '\U00002133'}, + {"Mu;", '\U0000039C'}, + {"NJcy;", '\U0000040A'}, + {"Nacute;", '\U00000143'}, + {"Ncaron;", '\U00000147'}, + {"Ncedil;", '\U00000145'}, + {"Ncy;", '\U0000041D'}, + {"NegativeMediumSpace;", '\U0000200B'}, + {"NegativeThickSpace;", '\U0000200B'}, + {"NegativeThinSpace;", '\U0000200B'}, + {"NegativeVeryThinSpace;", '\U0000200B'}, + {"NestedGreaterGreater;", '\U0000226B'}, + {"NestedLessLess;", '\U0000226A'}, + {"NewLine;", '\U0000000A'}, + {"Nfr;", '\U0001D511'}, + {"NoBreak;", '\U00002060'}, + {"NonBreakingSpace;", '\U000000A0'}, + {"Nopf;", '\U00002115'}, + {"Not;", '\U00002AEC'}, + {"NotCongruent;", '\U00002262'}, + {"NotCupCap;", '\U0000226D'}, + {"NotDoubleVerticalBar;", '\U00002226'}, + {"NotElement;", '\U00002209'}, + {"NotEqual;", '\U00002260'}, + {"NotExists;", '\U00002204'}, + {"NotGreater;", '\U0000226F'}, + {"NotGreaterEqual;", '\U00002271'}, + {"NotGreaterLess;", '\U00002279'}, + {"NotGreaterTilde;", '\U00002275'}, + {"NotLeftTriangle;", '\U000022EA'}, + {"NotLeftTriangleEqual;", '\U000022EC'}, + {"NotLess;", '\U0000226E'}, + {"NotLessEqual;", '\U00002270'}, + {"NotLessGreater;", '\U00002278'}, + {"NotLessTilde;", '\U00002274'}, + {"NotPrecedes;", '\U00002280'}, + {"NotPrecedesSlantEqual;", '\U000022E0'}, + {"NotReverseElement;", '\U0000220C'}, + {"NotRightTriangle;", '\U000022EB'}, + {"NotRightTriangleEqual;", '\U000022ED'}, + {"NotSquareSubsetEqual;", '\U000022E2'}, + {"NotSquareSupersetEqual;", '\U000022E3'}, + {"NotSubsetEqual;", '\U00002288'}, + {"NotSucceeds;", '\U00002281'}, + {"NotSucceedsSlantEqual;", '\U000022E1'}, + {"NotSupersetEqual;", '\U00002289'}, + {"NotTilde;", '\U00002241'}, + {"NotTildeEqual;", '\U00002244'}, + {"NotTildeFullEqual;", '\U00002247'}, + {"NotTildeTilde;", '\U00002249'}, + {"NotVerticalBar;", '\U00002224'}, + {"Nscr;", '\U0001D4A9'}, + {"Ntilde;", '\U000000D1'}, + {"Nu;", '\U0000039D'}, + {"OElig;", '\U00000152'}, + {"Oacute;", '\U000000D3'}, + {"Ocirc;", '\U000000D4'}, + {"Ocy;", '\U0000041E'}, + {"Odblac;", '\U00000150'}, + {"Ofr;", '\U0001D512'}, + {"Ograve;", '\U000000D2'}, + {"Omacr;", '\U0000014C'}, + {"Omega;", '\U000003A9'}, + {"Omicron;", '\U0000039F'}, + {"Oopf;", '\U0001D546'}, + {"OpenCurlyDoubleQuote;", '\U0000201C'}, + {"OpenCurlyQuote;", '\U00002018'}, + {"Or;", '\U00002A54'}, + {"Oscr;", '\U0001D4AA'}, + {"Oslash;", '\U000000D8'}, + {"Otilde;", '\U000000D5'}, + {"Otimes;", '\U00002A37'}, + {"Ouml;", '\U000000D6'}, + {"OverBar;", '\U0000203E'}, + {"OverBrace;", '\U000023DE'}, + {"OverBracket;", '\U000023B4'}, + {"OverParenthesis;", '\U000023DC'}, + {"PartialD;", '\U00002202'}, + {"Pcy;", '\U0000041F'}, + {"Pfr;", '\U0001D513'}, + {"Phi;", '\U000003A6'}, + {"Pi;", '\U000003A0'}, + {"PlusMinus;", '\U000000B1'}, + {"Poincareplane;", '\U0000210C'}, + {"Popf;", '\U00002119'}, + {"Pr;", '\U00002ABB'}, + {"Precedes;", '\U0000227A'}, + {"PrecedesEqual;", '\U00002AAF'}, + {"PrecedesSlantEqual;", '\U0000227C'}, + {"PrecedesTilde;", '\U0000227E'}, + {"Prime;", '\U00002033'}, + {"Product;", '\U0000220F'}, + {"Proportion;", '\U00002237'}, + {"Proportional;", '\U0000221D'}, + {"Pscr;", '\U0001D4AB'}, + {"Psi;", '\U000003A8'}, + {"QUOT;", '\U00000022'}, + {"Qfr;", '\U0001D514'}, + {"Qopf;", '\U0000211A'}, + {"Qscr;", '\U0001D4AC'}, + {"RBarr;", '\U00002910'}, + {"REG;", '\U000000AE'}, + {"Racute;", '\U00000154'}, + {"Rang;", '\U000027EB'}, + {"Rarr;", '\U000021A0'}, + {"Rarrtl;", '\U00002916'}, + {"Rcaron;", '\U00000158'}, + {"Rcedil;", '\U00000156'}, + {"Rcy;", '\U00000420'}, + {"Re;", '\U0000211C'}, + {"ReverseElement;", '\U0000220B'}, + {"ReverseEquilibrium;", '\U000021CB'}, + {"ReverseUpEquilibrium;", '\U0000296F'}, + {"Rfr;", '\U0000211C'}, + {"Rho;", '\U000003A1'}, + {"RightAngleBracket;", '\U000027E9'}, + {"RightArrow;", '\U00002192'}, + {"RightArrowBar;", '\U000021E5'}, + {"RightArrowLeftArrow;", '\U000021C4'}, + {"RightCeiling;", '\U00002309'}, + {"RightDoubleBracket;", '\U000027E7'}, + {"RightDownTeeVector;", '\U0000295D'}, + {"RightDownVector;", '\U000021C2'}, + {"RightDownVectorBar;", '\U00002955'}, + {"RightFloor;", '\U0000230B'}, + {"RightTee;", '\U000022A2'}, + {"RightTeeArrow;", '\U000021A6'}, + {"RightTeeVector;", '\U0000295B'}, + {"RightTriangle;", '\U000022B3'}, + {"RightTriangleBar;", '\U000029D0'}, + {"RightTriangleEqual;", '\U000022B5'}, + {"RightUpDownVector;", '\U0000294F'}, + {"RightUpTeeVector;", '\U0000295C'}, + {"RightUpVector;", '\U000021BE'}, + {"RightUpVectorBar;", '\U00002954'}, + {"RightVector;", '\U000021C0'}, + {"RightVectorBar;", '\U00002953'}, + {"Rightarrow;", '\U000021D2'}, + {"Ropf;", '\U0000211D'}, + {"RoundImplies;", '\U00002970'}, + {"Rrightarrow;", '\U000021DB'}, + {"Rscr;", '\U0000211B'}, + {"Rsh;", '\U000021B1'}, + {"RuleDelayed;", '\U000029F4'}, + {"SHCHcy;", '\U00000429'}, + {"SHcy;", '\U00000428'}, + {"SOFTcy;", '\U0000042C'}, + {"Sacute;", '\U0000015A'}, + {"Sc;", '\U00002ABC'}, + {"Scaron;", '\U00000160'}, + {"Scedil;", '\U0000015E'}, + {"Scirc;", '\U0000015C'}, + {"Scy;", '\U00000421'}, + {"Sfr;", '\U0001D516'}, + {"ShortDownArrow;", '\U00002193'}, + {"ShortLeftArrow;", '\U00002190'}, + {"ShortRightArrow;", '\U00002192'}, + {"ShortUpArrow;", '\U00002191'}, + {"Sigma;", '\U000003A3'}, + {"SmallCircle;", '\U00002218'}, + {"Sopf;", '\U0001D54A'}, + {"Sqrt;", '\U0000221A'}, + {"Square;", '\U000025A1'}, + {"SquareIntersection;", '\U00002293'}, + {"SquareSubset;", '\U0000228F'}, + {"SquareSubsetEqual;", '\U00002291'}, + {"SquareSuperset;", '\U00002290'}, + {"SquareSupersetEqual;", '\U00002292'}, + {"SquareUnion;", '\U00002294'}, + {"Sscr;", '\U0001D4AE'}, + {"Star;", '\U000022C6'}, + {"Sub;", '\U000022D0'}, + {"Subset;", '\U000022D0'}, + {"SubsetEqual;", '\U00002286'}, + {"Succeeds;", '\U0000227B'}, + {"SucceedsEqual;", '\U00002AB0'}, + {"SucceedsSlantEqual;", '\U0000227D'}, + {"SucceedsTilde;", '\U0000227F'}, + {"SuchThat;", '\U0000220B'}, + {"Sum;", '\U00002211'}, + {"Sup;", '\U000022D1'}, + {"Superset;", '\U00002283'}, + {"SupersetEqual;", '\U00002287'}, + {"Supset;", '\U000022D1'}, + {"THORN;", '\U000000DE'}, + {"TRADE;", '\U00002122'}, + {"TSHcy;", '\U0000040B'}, + {"TScy;", '\U00000426'}, + {"Tab;", '\U00000009'}, + {"Tau;", '\U000003A4'}, + {"Tcaron;", '\U00000164'}, + {"Tcedil;", '\U00000162'}, + {"Tcy;", '\U00000422'}, + {"Tfr;", '\U0001D517'}, + {"Therefore;", '\U00002234'}, + {"Theta;", '\U00000398'}, + {"ThinSpace;", '\U00002009'}, + {"Tilde;", '\U0000223C'}, + {"TildeEqual;", '\U00002243'}, + {"TildeFullEqual;", '\U00002245'}, + {"TildeTilde;", '\U00002248'}, + {"Topf;", '\U0001D54B'}, + {"TripleDot;", '\U000020DB'}, + {"Tscr;", '\U0001D4AF'}, + {"Tstrok;", '\U00000166'}, + {"Uacute;", '\U000000DA'}, + {"Uarr;", '\U0000219F'}, + {"Uarrocir;", '\U00002949'}, + {"Ubrcy;", '\U0000040E'}, + {"Ubreve;", '\U0000016C'}, + {"Ucirc;", '\U000000DB'}, + {"Ucy;", '\U00000423'}, + {"Udblac;", '\U00000170'}, + {"Ufr;", '\U0001D518'}, + {"Ugrave;", '\U000000D9'}, + {"Umacr;", '\U0000016A'}, + {"UnderBar;", '\U0000005F'}, + {"UnderBrace;", '\U000023DF'}, + {"UnderBracket;", '\U000023B5'}, + {"UnderParenthesis;", '\U000023DD'}, + {"Union;", '\U000022C3'}, + {"UnionPlus;", '\U0000228E'}, + {"Uogon;", '\U00000172'}, + {"Uopf;", '\U0001D54C'}, + {"UpArrow;", '\U00002191'}, + {"UpArrowBar;", '\U00002912'}, + {"UpArrowDownArrow;", '\U000021C5'}, + {"UpDownArrow;", '\U00002195'}, + {"UpEquilibrium;", '\U0000296E'}, + {"UpTee;", '\U000022A5'}, + {"UpTeeArrow;", '\U000021A5'}, + {"Uparrow;", '\U000021D1'}, + {"Updownarrow;", '\U000021D5'}, + {"UpperLeftArrow;", '\U00002196'}, + {"UpperRightArrow;", '\U00002197'}, + {"Upsi;", '\U000003D2'}, + {"Upsilon;", '\U000003A5'}, + {"Uring;", '\U0000016E'}, + {"Uscr;", '\U0001D4B0'}, + {"Utilde;", '\U00000168'}, + {"Uuml;", '\U000000DC'}, + {"VDash;", '\U000022AB'}, + {"Vbar;", '\U00002AEB'}, + {"Vcy;", '\U00000412'}, + {"Vdash;", '\U000022A9'}, + {"Vdashl;", '\U00002AE6'}, + {"Vee;", '\U000022C1'}, + {"Verbar;", '\U00002016'}, + {"Vert;", '\U00002016'}, + {"VerticalBar;", '\U00002223'}, + {"VerticalLine;", '\U0000007C'}, + {"VerticalSeparator;", '\U00002758'}, + {"VerticalTilde;", '\U00002240'}, + {"VeryThinSpace;", '\U0000200A'}, + {"Vfr;", '\U0001D519'}, + {"Vopf;", '\U0001D54D'}, + {"Vscr;", '\U0001D4B1'}, + {"Vvdash;", '\U000022AA'}, + {"Wcirc;", '\U00000174'}, + {"Wedge;", '\U000022C0'}, + {"Wfr;", '\U0001D51A'}, + {"Wopf;", '\U0001D54E'}, + {"Wscr;", '\U0001D4B2'}, + {"Xfr;", '\U0001D51B'}, + {"Xi;", '\U0000039E'}, + {"Xopf;", '\U0001D54F'}, + {"Xscr;", '\U0001D4B3'}, + {"YAcy;", '\U0000042F'}, + {"YIcy;", '\U00000407'}, + {"YUcy;", '\U0000042E'}, + {"Yacute;", '\U000000DD'}, + {"Ycirc;", '\U00000176'}, + {"Ycy;", '\U0000042B'}, + {"Yfr;", '\U0001D51C'}, + {"Yopf;", '\U0001D550'}, + {"Yscr;", '\U0001D4B4'}, + {"Yuml;", '\U00000178'}, + {"ZHcy;", '\U00000416'}, + {"Zacute;", '\U00000179'}, + {"Zcaron;", '\U0000017D'}, + {"Zcy;", '\U00000417'}, + {"Zdot;", '\U0000017B'}, + {"ZeroWidthSpace;", '\U0000200B'}, + {"Zeta;", '\U00000396'}, + {"Zfr;", '\U00002128'}, + {"Zopf;", '\U00002124'}, + {"Zscr;", '\U0001D4B5'}, + {"aacute;", '\U000000E1'}, + {"abreve;", '\U00000103'}, + {"ac;", '\U0000223E'}, + {"acd;", '\U0000223F'}, + {"acirc;", '\U000000E2'}, + {"acute;", '\U000000B4'}, + {"acy;", '\U00000430'}, + {"aelig;", '\U000000E6'}, + {"af;", '\U00002061'}, + {"afr;", '\U0001D51E'}, + {"agrave;", '\U000000E0'}, + {"alefsym;", '\U00002135'}, + {"aleph;", '\U00002135'}, + {"alpha;", '\U000003B1'}, + {"amacr;", '\U00000101'}, + {"amalg;", '\U00002A3F'}, + {"amp;", '\U00000026'}, + {"and;", '\U00002227'}, + {"andand;", '\U00002A55'}, + {"andd;", '\U00002A5C'}, + {"andslope;", '\U00002A58'}, + {"andv;", '\U00002A5A'}, + {"ang;", '\U00002220'}, + {"ange;", '\U000029A4'}, + {"angle;", '\U00002220'}, + {"angmsd;", '\U00002221'}, + {"angmsdaa;", '\U000029A8'}, + {"angmsdab;", '\U000029A9'}, + {"angmsdac;", '\U000029AA'}, + {"angmsdad;", '\U000029AB'}, + {"angmsdae;", '\U000029AC'}, + {"angmsdaf;", '\U000029AD'}, + {"angmsdag;", '\U000029AE'}, + {"angmsdah;", '\U000029AF'}, + {"angrt;", '\U0000221F'}, + {"angrtvb;", '\U000022BE'}, + {"angrtvbd;", '\U0000299D'}, + {"angsph;", '\U00002222'}, + {"angst;", '\U000000C5'}, + {"angzarr;", '\U0000237C'}, + {"aogon;", '\U00000105'}, + {"aopf;", '\U0001D552'}, + {"ap;", '\U00002248'}, + {"apE;", '\U00002A70'}, + {"apacir;", '\U00002A6F'}, + {"ape;", '\U0000224A'}, + {"apid;", '\U0000224B'}, + {"apos;", '\U00000027'}, + {"approx;", '\U00002248'}, + {"approxeq;", '\U0000224A'}, + {"aring;", '\U000000E5'}, + {"ascr;", '\U0001D4B6'}, + {"ast;", '\U0000002A'}, + {"asymp;", '\U00002248'}, + {"asympeq;", '\U0000224D'}, + {"atilde;", '\U000000E3'}, + {"auml;", '\U000000E4'}, + {"awconint;", '\U00002233'}, + {"awint;", '\U00002A11'}, + {"bNot;", '\U00002AED'}, + {"backcong;", '\U0000224C'}, + {"backepsilon;", '\U000003F6'}, + {"backprime;", '\U00002035'}, + {"backsim;", '\U0000223D'}, + {"backsimeq;", '\U000022CD'}, + {"barvee;", '\U000022BD'}, + {"barwed;", '\U00002305'}, + {"barwedge;", '\U00002305'}, + {"bbrk;", '\U000023B5'}, + {"bbrktbrk;", '\U000023B6'}, + {"bcong;", '\U0000224C'}, + {"bcy;", '\U00000431'}, + {"bdquo;", '\U0000201E'}, + {"becaus;", '\U00002235'}, + {"because;", '\U00002235'}, + {"bemptyv;", '\U000029B0'}, + {"bepsi;", '\U000003F6'}, + {"bernou;", '\U0000212C'}, + {"beta;", '\U000003B2'}, + {"beth;", '\U00002136'}, + {"between;", '\U0000226C'}, + {"bfr;", '\U0001D51F'}, + {"bigcap;", '\U000022C2'}, + {"bigcirc;", '\U000025EF'}, + {"bigcup;", '\U000022C3'}, + {"bigodot;", '\U00002A00'}, + {"bigoplus;", '\U00002A01'}, + {"bigotimes;", '\U00002A02'}, + {"bigsqcup;", '\U00002A06'}, + {"bigstar;", '\U00002605'}, + {"bigtriangledown;", '\U000025BD'}, + {"bigtriangleup;", '\U000025B3'}, + {"biguplus;", '\U00002A04'}, + {"bigvee;", '\U000022C1'}, + {"bigwedge;", '\U000022C0'}, + {"bkarow;", '\U0000290D'}, + {"blacklozenge;", '\U000029EB'}, + {"blacksquare;", '\U000025AA'}, + {"blacktriangle;", '\U000025B4'}, + {"blacktriangledown;", '\U000025BE'}, + {"blacktriangleleft;", '\U000025C2'}, + {"blacktriangleright;", '\U000025B8'}, + {"blank;", '\U00002423'}, + {"blk12;", '\U00002592'}, + {"blk14;", '\U00002591'}, + {"blk34;", '\U00002593'}, + {"block;", '\U00002588'}, + {"bnot;", '\U00002310'}, + {"bopf;", '\U0001D553'}, + {"bot;", '\U000022A5'}, + {"bottom;", '\U000022A5'}, + {"bowtie;", '\U000022C8'}, + {"boxDL;", '\U00002557'}, + {"boxDR;", '\U00002554'}, + {"boxDl;", '\U00002556'}, + {"boxDr;", '\U00002553'}, + {"boxH;", '\U00002550'}, + {"boxHD;", '\U00002566'}, + {"boxHU;", '\U00002569'}, + {"boxHd;", '\U00002564'}, + {"boxHu;", '\U00002567'}, + {"boxUL;", '\U0000255D'}, + {"boxUR;", '\U0000255A'}, + {"boxUl;", '\U0000255C'}, + {"boxUr;", '\U00002559'}, + {"boxV;", '\U00002551'}, + {"boxVH;", '\U0000256C'}, + {"boxVL;", '\U00002563'}, + {"boxVR;", '\U00002560'}, + {"boxVh;", '\U0000256B'}, + {"boxVl;", '\U00002562'}, + {"boxVr;", '\U0000255F'}, + {"boxbox;", '\U000029C9'}, + {"boxdL;", '\U00002555'}, + {"boxdR;", '\U00002552'}, + {"boxdl;", '\U00002510'}, + {"boxdr;", '\U0000250C'}, + {"boxh;", '\U00002500'}, + {"boxhD;", '\U00002565'}, + {"boxhU;", '\U00002568'}, + {"boxhd;", '\U0000252C'}, + {"boxhu;", '\U00002534'}, + {"boxminus;", '\U0000229F'}, + {"boxplus;", '\U0000229E'}, + {"boxtimes;", '\U000022A0'}, + {"boxuL;", '\U0000255B'}, + {"boxuR;", '\U00002558'}, + {"boxul;", '\U00002518'}, + {"boxur;", '\U00002514'}, + {"boxv;", '\U00002502'}, + {"boxvH;", '\U0000256A'}, + {"boxvL;", '\U00002561'}, + {"boxvR;", '\U0000255E'}, + {"boxvh;", '\U0000253C'}, + {"boxvl;", '\U00002524'}, + {"boxvr;", '\U0000251C'}, + {"bprime;", '\U00002035'}, + {"breve;", '\U000002D8'}, + {"brvbar;", '\U000000A6'}, + {"bscr;", '\U0001D4B7'}, + {"bsemi;", '\U0000204F'}, + {"bsim;", '\U0000223D'}, + {"bsime;", '\U000022CD'}, + {"bsol;", '\U0000005C'}, + {"bsolb;", '\U000029C5'}, + {"bsolhsub;", '\U000027C8'}, + {"bull;", '\U00002022'}, + {"bullet;", '\U00002022'}, + {"bump;", '\U0000224E'}, + {"bumpE;", '\U00002AAE'}, + {"bumpe;", '\U0000224F'}, + {"bumpeq;", '\U0000224F'}, + {"cacute;", '\U00000107'}, + {"cap;", '\U00002229'}, + {"capand;", '\U00002A44'}, + {"capbrcup;", '\U00002A49'}, + {"capcap;", '\U00002A4B'}, + {"capcup;", '\U00002A47'}, + {"capdot;", '\U00002A40'}, + {"caret;", '\U00002041'}, + {"caron;", '\U000002C7'}, + {"ccaps;", '\U00002A4D'}, + {"ccaron;", '\U0000010D'}, + {"ccedil;", '\U000000E7'}, + {"ccirc;", '\U00000109'}, + {"ccups;", '\U00002A4C'}, + {"ccupssm;", '\U00002A50'}, + {"cdot;", '\U0000010B'}, + {"cedil;", '\U000000B8'}, + {"cemptyv;", '\U000029B2'}, + {"cent;", '\U000000A2'}, + {"centerdot;", '\U000000B7'}, + {"cfr;", '\U0001D520'}, + {"chcy;", '\U00000447'}, + {"check;", '\U00002713'}, + {"checkmark;", '\U00002713'}, + {"chi;", '\U000003C7'}, + {"cir;", '\U000025CB'}, + {"cirE;", '\U000029C3'}, + {"circ;", '\U000002C6'}, + {"circeq;", '\U00002257'}, + {"circlearrowleft;", '\U000021BA'}, + {"circlearrowright;", '\U000021BB'}, + {"circledR;", '\U000000AE'}, + {"circledS;", '\U000024C8'}, + {"circledast;", '\U0000229B'}, + {"circledcirc;", '\U0000229A'}, + {"circleddash;", '\U0000229D'}, + {"cire;", '\U00002257'}, + {"cirfnint;", '\U00002A10'}, + {"cirmid;", '\U00002AEF'}, + {"cirscir;", '\U000029C2'}, + {"clubs;", '\U00002663'}, + {"clubsuit;", '\U00002663'}, + {"colon;", '\U0000003A'}, + {"colone;", '\U00002254'}, + {"coloneq;", '\U00002254'}, + {"comma;", '\U0000002C'}, + {"commat;", '\U00000040'}, + {"comp;", '\U00002201'}, + {"compfn;", '\U00002218'}, + {"complement;", '\U00002201'}, + {"complexes;", '\U00002102'}, + {"cong;", '\U00002245'}, + {"congdot;", '\U00002A6D'}, + {"conint;", '\U0000222E'}, + {"copf;", '\U0001D554'}, + {"coprod;", '\U00002210'}, + {"copy;", '\U000000A9'}, + {"copysr;", '\U00002117'}, + {"crarr;", '\U000021B5'}, + {"cross;", '\U00002717'}, + {"cscr;", '\U0001D4B8'}, + {"csub;", '\U00002ACF'}, + {"csube;", '\U00002AD1'}, + {"csup;", '\U00002AD0'}, + {"csupe;", '\U00002AD2'}, + {"ctdot;", '\U000022EF'}, + {"cudarrl;", '\U00002938'}, + {"cudarrr;", '\U00002935'}, + {"cuepr;", '\U000022DE'}, + {"cuesc;", '\U000022DF'}, + {"cularr;", '\U000021B6'}, + {"cularrp;", '\U0000293D'}, + {"cup;", '\U0000222A'}, + {"cupbrcap;", '\U00002A48'}, + {"cupcap;", '\U00002A46'}, + {"cupcup;", '\U00002A4A'}, + {"cupdot;", '\U0000228D'}, + {"cupor;", '\U00002A45'}, + {"curarr;", '\U000021B7'}, + {"curarrm;", '\U0000293C'}, + {"curlyeqprec;", '\U000022DE'}, + {"curlyeqsucc;", '\U000022DF'}, + {"curlyvee;", '\U000022CE'}, + {"curlywedge;", '\U000022CF'}, + {"curren;", '\U000000A4'}, + {"curvearrowleft;", '\U000021B6'}, + {"curvearrowright;", '\U000021B7'}, + {"cuvee;", '\U000022CE'}, + {"cuwed;", '\U000022CF'}, + {"cwconint;", '\U00002232'}, + {"cwint;", '\U00002231'}, + {"cylcty;", '\U0000232D'}, + {"dArr;", '\U000021D3'}, + {"dHar;", '\U00002965'}, + {"dagger;", '\U00002020'}, + {"daleth;", '\U00002138'}, + {"darr;", '\U00002193'}, + {"dash;", '\U00002010'}, + {"dashv;", '\U000022A3'}, + {"dbkarow;", '\U0000290F'}, + {"dblac;", '\U000002DD'}, + {"dcaron;", '\U0000010F'}, + {"dcy;", '\U00000434'}, + {"dd;", '\U00002146'}, + {"ddagger;", '\U00002021'}, + {"ddarr;", '\U000021CA'}, + {"ddotseq;", '\U00002A77'}, + {"deg;", '\U000000B0'}, + {"delta;", '\U000003B4'}, + {"demptyv;", '\U000029B1'}, + {"dfisht;", '\U0000297F'}, + {"dfr;", '\U0001D521'}, + {"dharl;", '\U000021C3'}, + {"dharr;", '\U000021C2'}, + {"diam;", '\U000022C4'}, + {"diamond;", '\U000022C4'}, + {"diamondsuit;", '\U00002666'}, + {"diams;", '\U00002666'}, + {"die;", '\U000000A8'}, + {"digamma;", '\U000003DD'}, + {"disin;", '\U000022F2'}, + {"div;", '\U000000F7'}, + {"divide;", '\U000000F7'}, + {"divideontimes;", '\U000022C7'}, + {"divonx;", '\U000022C7'}, + {"djcy;", '\U00000452'}, + {"dlcorn;", '\U0000231E'}, + {"dlcrop;", '\U0000230D'}, + {"dollar;", '\U00000024'}, + {"dopf;", '\U0001D555'}, + {"dot;", '\U000002D9'}, + {"doteq;", '\U00002250'}, + {"doteqdot;", '\U00002251'}, + {"dotminus;", '\U00002238'}, + {"dotplus;", '\U00002214'}, + {"dotsquare;", '\U000022A1'}, + {"doublebarwedge;", '\U00002306'}, + {"downarrow;", '\U00002193'}, + {"downdownarrows;", '\U000021CA'}, + {"downharpoonleft;", '\U000021C3'}, + {"downharpoonright;", '\U000021C2'}, + {"drbkarow;", '\U00002910'}, + {"drcorn;", '\U0000231F'}, + {"drcrop;", '\U0000230C'}, + {"dscr;", '\U0001D4B9'}, + {"dscy;", '\U00000455'}, + {"dsol;", '\U000029F6'}, + {"dstrok;", '\U00000111'}, + {"dtdot;", '\U000022F1'}, + {"dtri;", '\U000025BF'}, + {"dtrif;", '\U000025BE'}, + {"duarr;", '\U000021F5'}, + {"duhar;", '\U0000296F'}, + {"dwangle;", '\U000029A6'}, + {"dzcy;", '\U0000045F'}, + {"dzigrarr;", '\U000027FF'}, + {"eDDot;", '\U00002A77'}, + {"eDot;", '\U00002251'}, + {"eacute;", '\U000000E9'}, + {"easter;", '\U00002A6E'}, + {"ecaron;", '\U0000011B'}, + {"ecir;", '\U00002256'}, + {"ecirc;", '\U000000EA'}, + {"ecolon;", '\U00002255'}, + {"ecy;", '\U0000044D'}, + {"edot;", '\U00000117'}, + {"ee;", '\U00002147'}, + {"efDot;", '\U00002252'}, + {"efr;", '\U0001D522'}, + {"eg;", '\U00002A9A'}, + {"egrave;", '\U000000E8'}, + {"egs;", '\U00002A96'}, + {"egsdot;", '\U00002A98'}, + {"el;", '\U00002A99'}, + {"elinters;", '\U000023E7'}, + {"ell;", '\U00002113'}, + {"els;", '\U00002A95'}, + {"elsdot;", '\U00002A97'}, + {"emacr;", '\U00000113'}, + {"empty;", '\U00002205'}, + {"emptyset;", '\U00002205'}, + {"emptyv;", '\U00002205'}, + {"emsp;", '\U00002003'}, + {"emsp13;", '\U00002004'}, + {"emsp14;", '\U00002005'}, + {"eng;", '\U0000014B'}, + {"ensp;", '\U00002002'}, + {"eogon;", '\U00000119'}, + {"eopf;", '\U0001D556'}, + {"epar;", '\U000022D5'}, + {"eparsl;", '\U000029E3'}, + {"eplus;", '\U00002A71'}, + {"epsi;", '\U000003B5'}, + {"epsilon;", '\U000003B5'}, + {"epsiv;", '\U000003F5'}, + {"eqcirc;", '\U00002256'}, + {"eqcolon;", '\U00002255'}, + {"eqsim;", '\U00002242'}, + {"eqslantgtr;", '\U00002A96'}, + {"eqslantless;", '\U00002A95'}, + {"equals;", '\U0000003D'}, + {"equest;", '\U0000225F'}, + {"equiv;", '\U00002261'}, + {"equivDD;", '\U00002A78'}, + {"eqvparsl;", '\U000029E5'}, + {"erDot;", '\U00002253'}, + {"erarr;", '\U00002971'}, + {"escr;", '\U0000212F'}, + {"esdot;", '\U00002250'}, + {"esim;", '\U00002242'}, + {"eta;", '\U000003B7'}, + {"eth;", '\U000000F0'}, + {"euml;", '\U000000EB'}, + {"euro;", '\U000020AC'}, + {"excl;", '\U00000021'}, + {"exist;", '\U00002203'}, + {"expectation;", '\U00002130'}, + {"exponentiale;", '\U00002147'}, + {"fallingdotseq;", '\U00002252'}, + {"fcy;", '\U00000444'}, + {"female;", '\U00002640'}, + {"ffilig;", '\U0000FB03'}, + {"fflig;", '\U0000FB00'}, + {"ffllig;", '\U0000FB04'}, + {"ffr;", '\U0001D523'}, + {"filig;", '\U0000FB01'}, + {"flat;", '\U0000266D'}, + {"fllig;", '\U0000FB02'}, + {"fltns;", '\U000025B1'}, + {"fnof;", '\U00000192'}, + {"fopf;", '\U0001D557'}, + {"forall;", '\U00002200'}, + {"fork;", '\U000022D4'}, + {"forkv;", '\U00002AD9'}, + {"fpartint;", '\U00002A0D'}, + {"frac12;", '\U000000BD'}, + {"frac13;", '\U00002153'}, + {"frac14;", '\U000000BC'}, + {"frac15;", '\U00002155'}, + {"frac16;", '\U00002159'}, + {"frac18;", '\U0000215B'}, + {"frac23;", '\U00002154'}, + {"frac25;", '\U00002156'}, + {"frac34;", '\U000000BE'}, + {"frac35;", '\U00002157'}, + {"frac38;", '\U0000215C'}, + {"frac45;", '\U00002158'}, + {"frac56;", '\U0000215A'}, + {"frac58;", '\U0000215D'}, + {"frac78;", '\U0000215E'}, + {"frasl;", '\U00002044'}, + {"frown;", '\U00002322'}, + {"fscr;", '\U0001D4BB'}, + {"gE;", '\U00002267'}, + {"gEl;", '\U00002A8C'}, + {"gacute;", '\U000001F5'}, + {"gamma;", '\U000003B3'}, + {"gammad;", '\U000003DD'}, + {"gap;", '\U00002A86'}, + {"gbreve;", '\U0000011F'}, + {"gcirc;", '\U0000011D'}, + {"gcy;", '\U00000433'}, + {"gdot;", '\U00000121'}, + {"ge;", '\U00002265'}, + {"gel;", '\U000022DB'}, + {"geq;", '\U00002265'}, + {"geqq;", '\U00002267'}, + {"geqslant;", '\U00002A7E'}, + {"ges;", '\U00002A7E'}, + {"gescc;", '\U00002AA9'}, + {"gesdot;", '\U00002A80'}, + {"gesdoto;", '\U00002A82'}, + {"gesdotol;", '\U00002A84'}, + {"gesles;", '\U00002A94'}, + {"gfr;", '\U0001D524'}, + {"gg;", '\U0000226B'}, + {"ggg;", '\U000022D9'}, + {"gimel;", '\U00002137'}, + {"gjcy;", '\U00000453'}, + {"gl;", '\U00002277'}, + {"glE;", '\U00002A92'}, + {"gla;", '\U00002AA5'}, + {"glj;", '\U00002AA4'}, + {"gnE;", '\U00002269'}, + {"gnap;", '\U00002A8A'}, + {"gnapprox;", '\U00002A8A'}, + {"gne;", '\U00002A88'}, + {"gneq;", '\U00002A88'}, + {"gneqq;", '\U00002269'}, + {"gnsim;", '\U000022E7'}, + {"gopf;", '\U0001D558'}, + {"grave;", '\U00000060'}, + {"gscr;", '\U0000210A'}, + {"gsim;", '\U00002273'}, + {"gsime;", '\U00002A8E'}, + {"gsiml;", '\U00002A90'}, + {"gt;", '\U0000003E'}, + {"gtcc;", '\U00002AA7'}, + {"gtcir;", '\U00002A7A'}, + {"gtdot;", '\U000022D7'}, + {"gtlPar;", '\U00002995'}, + {"gtquest;", '\U00002A7C'}, + {"gtrapprox;", '\U00002A86'}, + {"gtrarr;", '\U00002978'}, + {"gtrdot;", '\U000022D7'}, + {"gtreqless;", '\U000022DB'}, + {"gtreqqless;", '\U00002A8C'}, + {"gtrless;", '\U00002277'}, + {"gtrsim;", '\U00002273'}, + {"hArr;", '\U000021D4'}, + {"hairsp;", '\U0000200A'}, + {"half;", '\U000000BD'}, + {"hamilt;", '\U0000210B'}, + {"hardcy;", '\U0000044A'}, + {"harr;", '\U00002194'}, + {"harrcir;", '\U00002948'}, + {"harrw;", '\U000021AD'}, + {"hbar;", '\U0000210F'}, + {"hcirc;", '\U00000125'}, + {"hearts;", '\U00002665'}, + {"heartsuit;", '\U00002665'}, + {"hellip;", '\U00002026'}, + {"hercon;", '\U000022B9'}, + {"hfr;", '\U0001D525'}, + {"hksearow;", '\U00002925'}, + {"hkswarow;", '\U00002926'}, + {"hoarr;", '\U000021FF'}, + {"homtht;", '\U0000223B'}, + {"hookleftarrow;", '\U000021A9'}, + {"hookrightarrow;", '\U000021AA'}, + {"hopf;", '\U0001D559'}, + {"horbar;", '\U00002015'}, + {"hscr;", '\U0001D4BD'}, + {"hslash;", '\U0000210F'}, + {"hstrok;", '\U00000127'}, + {"hybull;", '\U00002043'}, + {"hyphen;", '\U00002010'}, + {"iacute;", '\U000000ED'}, + {"ic;", '\U00002063'}, + {"icirc;", '\U000000EE'}, + {"icy;", '\U00000438'}, + {"iecy;", '\U00000435'}, + {"iexcl;", '\U000000A1'}, + {"iff;", '\U000021D4'}, + {"ifr;", '\U0001D526'}, + {"igrave;", '\U000000EC'}, + {"ii;", '\U00002148'}, + {"iiiint;", '\U00002A0C'}, + {"iiint;", '\U0000222D'}, + {"iinfin;", '\U000029DC'}, + {"iiota;", '\U00002129'}, + {"ijlig;", '\U00000133'}, + {"imacr;", '\U0000012B'}, + {"image;", '\U00002111'}, + {"imagline;", '\U00002110'}, + {"imagpart;", '\U00002111'}, + {"imath;", '\U00000131'}, + {"imof;", '\U000022B7'}, + {"imped;", '\U000001B5'}, + {"in;", '\U00002208'}, + {"incare;", '\U00002105'}, + {"infin;", '\U0000221E'}, + {"infintie;", '\U000029DD'}, + {"inodot;", '\U00000131'}, + {"int;", '\U0000222B'}, + {"intcal;", '\U000022BA'}, + {"integers;", '\U00002124'}, + {"intercal;", '\U000022BA'}, + {"intlarhk;", '\U00002A17'}, + {"intprod;", '\U00002A3C'}, + {"iocy;", '\U00000451'}, + {"iogon;", '\U0000012F'}, + {"iopf;", '\U0001D55A'}, + {"iota;", '\U000003B9'}, + {"iprod;", '\U00002A3C'}, + {"iquest;", '\U000000BF'}, + {"iscr;", '\U0001D4BE'}, + {"isin;", '\U00002208'}, + {"isinE;", '\U000022F9'}, + {"isindot;", '\U000022F5'}, + {"isins;", '\U000022F4'}, + {"isinsv;", '\U000022F3'}, + {"isinv;", '\U00002208'}, + {"it;", '\U00002062'}, + {"itilde;", '\U00000129'}, + {"iukcy;", '\U00000456'}, + {"iuml;", '\U000000EF'}, + {"jcirc;", '\U00000135'}, + {"jcy;", '\U00000439'}, + {"jfr;", '\U0001D527'}, + {"jmath;", '\U00000237'}, + {"jopf;", '\U0001D55B'}, + {"jscr;", '\U0001D4BF'}, + {"jsercy;", '\U00000458'}, + {"jukcy;", '\U00000454'}, + {"kappa;", '\U000003BA'}, + {"kappav;", '\U000003F0'}, + {"kcedil;", '\U00000137'}, + {"kcy;", '\U0000043A'}, + {"kfr;", '\U0001D528'}, + {"kgreen;", '\U00000138'}, + {"khcy;", '\U00000445'}, + {"kjcy;", '\U0000045C'}, + {"kopf;", '\U0001D55C'}, + {"kscr;", '\U0001D4C0'}, + {"lAarr;", '\U000021DA'}, + {"lArr;", '\U000021D0'}, + {"lAtail;", '\U0000291B'}, + {"lBarr;", '\U0000290E'}, + {"lE;", '\U00002266'}, + {"lEg;", '\U00002A8B'}, + {"lHar;", '\U00002962'}, + {"lacute;", '\U0000013A'}, + {"laemptyv;", '\U000029B4'}, + {"lagran;", '\U00002112'}, + {"lambda;", '\U000003BB'}, + {"lang;", '\U000027E8'}, + {"langd;", '\U00002991'}, + {"langle;", '\U000027E8'}, + {"lap;", '\U00002A85'}, + {"laquo;", '\U000000AB'}, + {"larr;", '\U00002190'}, + {"larrb;", '\U000021E4'}, + {"larrbfs;", '\U0000291F'}, + {"larrfs;", '\U0000291D'}, + {"larrhk;", '\U000021A9'}, + {"larrlp;", '\U000021AB'}, + {"larrpl;", '\U00002939'}, + {"larrsim;", '\U00002973'}, + {"larrtl;", '\U000021A2'}, + {"lat;", '\U00002AAB'}, + {"latail;", '\U00002919'}, + {"late;", '\U00002AAD'}, + {"lbarr;", '\U0000290C'}, + {"lbbrk;", '\U00002772'}, + {"lbrace;", '\U0000007B'}, + {"lbrack;", '\U0000005B'}, + {"lbrke;", '\U0000298B'}, + {"lbrksld;", '\U0000298F'}, + {"lbrkslu;", '\U0000298D'}, + {"lcaron;", '\U0000013E'}, + {"lcedil;", '\U0000013C'}, + {"lceil;", '\U00002308'}, + {"lcub;", '\U0000007B'}, + {"lcy;", '\U0000043B'}, + {"ldca;", '\U00002936'}, + {"ldquo;", '\U0000201C'}, + {"ldquor;", '\U0000201E'}, + {"ldrdhar;", '\U00002967'}, + {"ldrushar;", '\U0000294B'}, + {"ldsh;", '\U000021B2'}, + {"le;", '\U00002264'}, + {"leftarrow;", '\U00002190'}, + {"leftarrowtail;", '\U000021A2'}, + {"leftharpoondown;", '\U000021BD'}, + {"leftharpoonup;", '\U000021BC'}, + {"leftleftarrows;", '\U000021C7'}, + {"leftrightarrow;", '\U00002194'}, + {"leftrightarrows;", '\U000021C6'}, + {"leftrightharpoons;", '\U000021CB'}, + {"leftrightsquigarrow;", '\U000021AD'}, + {"leftthreetimes;", '\U000022CB'}, + {"leg;", '\U000022DA'}, + {"leq;", '\U00002264'}, + {"leqq;", '\U00002266'}, + {"leqslant;", '\U00002A7D'}, + {"les;", '\U00002A7D'}, + {"lescc;", '\U00002AA8'}, + {"lesdot;", '\U00002A7F'}, + {"lesdoto;", '\U00002A81'}, + {"lesdotor;", '\U00002A83'}, + {"lesges;", '\U00002A93'}, + {"lessapprox;", '\U00002A85'}, + {"lessdot;", '\U000022D6'}, + {"lesseqgtr;", '\U000022DA'}, + {"lesseqqgtr;", '\U00002A8B'}, + {"lessgtr;", '\U00002276'}, + {"lesssim;", '\U00002272'}, + {"lfisht;", '\U0000297C'}, + {"lfloor;", '\U0000230A'}, + {"lfr;", '\U0001D529'}, + {"lg;", '\U00002276'}, + {"lgE;", '\U00002A91'}, + {"lhard;", '\U000021BD'}, + {"lharu;", '\U000021BC'}, + {"lharul;", '\U0000296A'}, + {"lhblk;", '\U00002584'}, + {"ljcy;", '\U00000459'}, + {"ll;", '\U0000226A'}, + {"llarr;", '\U000021C7'}, + {"llcorner;", '\U0000231E'}, + {"llhard;", '\U0000296B'}, + {"lltri;", '\U000025FA'}, + {"lmidot;", '\U00000140'}, + {"lmoust;", '\U000023B0'}, + {"lmoustache;", '\U000023B0'}, + {"lnE;", '\U00002268'}, + {"lnap;", '\U00002A89'}, + {"lnapprox;", '\U00002A89'}, + {"lne;", '\U00002A87'}, + {"lneq;", '\U00002A87'}, + {"lneqq;", '\U00002268'}, + {"lnsim;", '\U000022E6'}, + {"loang;", '\U000027EC'}, + {"loarr;", '\U000021FD'}, + {"lobrk;", '\U000027E6'}, + {"longleftarrow;", '\U000027F5'}, + {"longleftrightarrow;", '\U000027F7'}, + {"longmapsto;", '\U000027FC'}, + {"longrightarrow;", '\U000027F6'}, + {"looparrowleft;", '\U000021AB'}, + {"looparrowright;", '\U000021AC'}, + {"lopar;", '\U00002985'}, + {"lopf;", '\U0001D55D'}, + {"loplus;", '\U00002A2D'}, + {"lotimes;", '\U00002A34'}, + {"lowast;", '\U00002217'}, + {"lowbar;", '\U0000005F'}, + {"loz;", '\U000025CA'}, + {"lozenge;", '\U000025CA'}, + {"lozf;", '\U000029EB'}, + {"lpar;", '\U00000028'}, + {"lparlt;", '\U00002993'}, + {"lrarr;", '\U000021C6'}, + {"lrcorner;", '\U0000231F'}, + {"lrhar;", '\U000021CB'}, + {"lrhard;", '\U0000296D'}, + {"lrm;", '\U0000200E'}, + {"lrtri;", '\U000022BF'}, + {"lsaquo;", '\U00002039'}, + {"lscr;", '\U0001D4C1'}, + {"lsh;", '\U000021B0'}, + {"lsim;", '\U00002272'}, + {"lsime;", '\U00002A8D'}, + {"lsimg;", '\U00002A8F'}, + {"lsqb;", '\U0000005B'}, + {"lsquo;", '\U00002018'}, + {"lsquor;", '\U0000201A'}, + {"lstrok;", '\U00000142'}, + {"lt;", '\U0000003C'}, + {"ltcc;", '\U00002AA6'}, + {"ltcir;", '\U00002A79'}, + {"ltdot;", '\U000022D6'}, + {"lthree;", '\U000022CB'}, + {"ltimes;", '\U000022C9'}, + {"ltlarr;", '\U00002976'}, + {"ltquest;", '\U00002A7B'}, + {"ltrPar;", '\U00002996'}, + {"ltri;", '\U000025C3'}, + {"ltrie;", '\U000022B4'}, + {"ltrif;", '\U000025C2'}, + {"lurdshar;", '\U0000294A'}, + {"luruhar;", '\U00002966'}, + {"mDDot;", '\U0000223A'}, + {"macr;", '\U000000AF'}, + {"male;", '\U00002642'}, + {"malt;", '\U00002720'}, + {"maltese;", '\U00002720'}, + {"map;", '\U000021A6'}, + {"mapsto;", '\U000021A6'}, + {"mapstodown;", '\U000021A7'}, + {"mapstoleft;", '\U000021A4'}, + {"mapstoup;", '\U000021A5'}, + {"marker;", '\U000025AE'}, + {"mcomma;", '\U00002A29'}, + {"mcy;", '\U0000043C'}, + {"mdash;", '\U00002014'}, + {"measuredangle;", '\U00002221'}, + {"mfr;", '\U0001D52A'}, + {"mho;", '\U00002127'}, + {"micro;", '\U000000B5'}, + {"mid;", '\U00002223'}, + {"midast;", '\U0000002A'}, + {"midcir;", '\U00002AF0'}, + {"middot;", '\U000000B7'}, + {"minus;", '\U00002212'}, + {"minusb;", '\U0000229F'}, + {"minusd;", '\U00002238'}, + {"minusdu;", '\U00002A2A'}, + {"mlcp;", '\U00002ADB'}, + {"mldr;", '\U00002026'}, + {"mnplus;", '\U00002213'}, + {"models;", '\U000022A7'}, + {"mopf;", '\U0001D55E'}, + {"mp;", '\U00002213'}, + {"mscr;", '\U0001D4C2'}, + {"mstpos;", '\U0000223E'}, + {"mu;", '\U000003BC'}, + {"multimap;", '\U000022B8'}, + {"mumap;", '\U000022B8'}, + {"nLeftarrow;", '\U000021CD'}, + {"nLeftrightarrow;", '\U000021CE'}, + {"nRightarrow;", '\U000021CF'}, + {"nVDash;", '\U000022AF'}, + {"nVdash;", '\U000022AE'}, + {"nabla;", '\U00002207'}, + {"nacute;", '\U00000144'}, + {"nap;", '\U00002249'}, + {"napos;", '\U00000149'}, + {"napprox;", '\U00002249'}, + {"natur;", '\U0000266E'}, + {"natural;", '\U0000266E'}, + {"naturals;", '\U00002115'}, + {"nbsp;", '\U000000A0'}, + {"ncap;", '\U00002A43'}, + {"ncaron;", '\U00000148'}, + {"ncedil;", '\U00000146'}, + {"ncong;", '\U00002247'}, + {"ncup;", '\U00002A42'}, + {"ncy;", '\U0000043D'}, + {"ndash;", '\U00002013'}, + {"ne;", '\U00002260'}, + {"neArr;", '\U000021D7'}, + {"nearhk;", '\U00002924'}, + {"nearr;", '\U00002197'}, + {"nearrow;", '\U00002197'}, + {"nequiv;", '\U00002262'}, + {"nesear;", '\U00002928'}, + {"nexist;", '\U00002204'}, + {"nexists;", '\U00002204'}, + {"nfr;", '\U0001D52B'}, + {"nge;", '\U00002271'}, + {"ngeq;", '\U00002271'}, + {"ngsim;", '\U00002275'}, + {"ngt;", '\U0000226F'}, + {"ngtr;", '\U0000226F'}, + {"nhArr;", '\U000021CE'}, + {"nharr;", '\U000021AE'}, + {"nhpar;", '\U00002AF2'}, + {"ni;", '\U0000220B'}, + {"nis;", '\U000022FC'}, + {"nisd;", '\U000022FA'}, + {"niv;", '\U0000220B'}, + {"njcy;", '\U0000045A'}, + {"nlArr;", '\U000021CD'}, + {"nlarr;", '\U0000219A'}, + {"nldr;", '\U00002025'}, + {"nle;", '\U00002270'}, + {"nleftarrow;", '\U0000219A'}, + {"nleftrightarrow;", '\U000021AE'}, + {"nleq;", '\U00002270'}, + {"nless;", '\U0000226E'}, + {"nlsim;", '\U00002274'}, + {"nlt;", '\U0000226E'}, + {"nltri;", '\U000022EA'}, + {"nltrie;", '\U000022EC'}, + {"nmid;", '\U00002224'}, + {"nopf;", '\U0001D55F'}, + {"not;", '\U000000AC'}, + {"notin;", '\U00002209'}, + {"notinva;", '\U00002209'}, + {"notinvb;", '\U000022F7'}, + {"notinvc;", '\U000022F6'}, + {"notni;", '\U0000220C'}, + {"notniva;", '\U0000220C'}, + {"notnivb;", '\U000022FE'}, + {"notnivc;", '\U000022FD'}, + {"npar;", '\U00002226'}, + {"nparallel;", '\U00002226'}, + {"npolint;", '\U00002A14'}, + {"npr;", '\U00002280'}, + {"nprcue;", '\U000022E0'}, + {"nprec;", '\U00002280'}, + {"nrArr;", '\U000021CF'}, + {"nrarr;", '\U0000219B'}, + {"nrightarrow;", '\U0000219B'}, + {"nrtri;", '\U000022EB'}, + {"nrtrie;", '\U000022ED'}, + {"nsc;", '\U00002281'}, + {"nsccue;", '\U000022E1'}, + {"nscr;", '\U0001D4C3'}, + {"nshortmid;", '\U00002224'}, + {"nshortparallel;", '\U00002226'}, + {"nsim;", '\U00002241'}, + {"nsime;", '\U00002244'}, + {"nsimeq;", '\U00002244'}, + {"nsmid;", '\U00002224'}, + {"nspar;", '\U00002226'}, + {"nsqsube;", '\U000022E2'}, + {"nsqsupe;", '\U000022E3'}, + {"nsub;", '\U00002284'}, + {"nsube;", '\U00002288'}, + {"nsubseteq;", '\U00002288'}, + {"nsucc;", '\U00002281'}, + {"nsup;", '\U00002285'}, + {"nsupe;", '\U00002289'}, + {"nsupseteq;", '\U00002289'}, + {"ntgl;", '\U00002279'}, + {"ntilde;", '\U000000F1'}, + {"ntlg;", '\U00002278'}, + {"ntriangleleft;", '\U000022EA'}, + {"ntrianglelefteq;", '\U000022EC'}, + {"ntriangleright;", '\U000022EB'}, + {"ntrianglerighteq;", '\U000022ED'}, + {"nu;", '\U000003BD'}, + {"num;", '\U00000023'}, + {"numero;", '\U00002116'}, + {"numsp;", '\U00002007'}, + {"nvDash;", '\U000022AD'}, + {"nvHarr;", '\U00002904'}, + {"nvdash;", '\U000022AC'}, + {"nvinfin;", '\U000029DE'}, + {"nvlArr;", '\U00002902'}, + {"nvrArr;", '\U00002903'}, + {"nwArr;", '\U000021D6'}, + {"nwarhk;", '\U00002923'}, + {"nwarr;", '\U00002196'}, + {"nwarrow;", '\U00002196'}, + {"nwnear;", '\U00002927'}, + {"oS;", '\U000024C8'}, + {"oacute;", '\U000000F3'}, + {"oast;", '\U0000229B'}, + {"ocir;", '\U0000229A'}, + {"ocirc;", '\U000000F4'}, + {"ocy;", '\U0000043E'}, + {"odash;", '\U0000229D'}, + {"odblac;", '\U00000151'}, + {"odiv;", '\U00002A38'}, + {"odot;", '\U00002299'}, + {"odsold;", '\U000029BC'}, + {"oelig;", '\U00000153'}, + {"ofcir;", '\U000029BF'}, + {"ofr;", '\U0001D52C'}, + {"ogon;", '\U000002DB'}, + {"ograve;", '\U000000F2'}, + {"ogt;", '\U000029C1'}, + {"ohbar;", '\U000029B5'}, + {"ohm;", '\U000003A9'}, + {"oint;", '\U0000222E'}, + {"olarr;", '\U000021BA'}, + {"olcir;", '\U000029BE'}, + {"olcross;", '\U000029BB'}, + {"oline;", '\U0000203E'}, + {"olt;", '\U000029C0'}, + {"omacr;", '\U0000014D'}, + {"omega;", '\U000003C9'}, + {"omicron;", '\U000003BF'}, + {"omid;", '\U000029B6'}, + {"ominus;", '\U00002296'}, + {"oopf;", '\U0001D560'}, + {"opar;", '\U000029B7'}, + {"operp;", '\U000029B9'}, + {"oplus;", '\U00002295'}, + {"or;", '\U00002228'}, + {"orarr;", '\U000021BB'}, + {"ord;", '\U00002A5D'}, + {"order;", '\U00002134'}, + {"orderof;", '\U00002134'}, + {"ordf;", '\U000000AA'}, + {"ordm;", '\U000000BA'}, + {"origof;", '\U000022B6'}, + {"oror;", '\U00002A56'}, + {"orslope;", '\U00002A57'}, + {"orv;", '\U00002A5B'}, + {"oscr;", '\U00002134'}, + {"oslash;", '\U000000F8'}, + {"osol;", '\U00002298'}, + {"otilde;", '\U000000F5'}, + {"otimes;", '\U00002297'}, + {"otimesas;", '\U00002A36'}, + {"ouml;", '\U000000F6'}, + {"ovbar;", '\U0000233D'}, + {"par;", '\U00002225'}, + {"para;", '\U000000B6'}, + {"parallel;", '\U00002225'}, + {"parsim;", '\U00002AF3'}, + {"parsl;", '\U00002AFD'}, + {"part;", '\U00002202'}, + {"pcy;", '\U0000043F'}, + {"percnt;", '\U00000025'}, + {"period;", '\U0000002E'}, + {"permil;", '\U00002030'}, + {"perp;", '\U000022A5'}, + {"pertenk;", '\U00002031'}, + {"pfr;", '\U0001D52D'}, + {"phi;", '\U000003C6'}, + {"phiv;", '\U000003D5'}, + {"phmmat;", '\U00002133'}, + {"phone;", '\U0000260E'}, + {"pi;", '\U000003C0'}, + {"pitchfork;", '\U000022D4'}, + {"piv;", '\U000003D6'}, + {"planck;", '\U0000210F'}, + {"planckh;", '\U0000210E'}, + {"plankv;", '\U0000210F'}, + {"plus;", '\U0000002B'}, + {"plusacir;", '\U00002A23'}, + {"plusb;", '\U0000229E'}, + {"pluscir;", '\U00002A22'}, + {"plusdo;", '\U00002214'}, + {"plusdu;", '\U00002A25'}, + {"pluse;", '\U00002A72'}, + {"plusmn;", '\U000000B1'}, + {"plussim;", '\U00002A26'}, + {"plustwo;", '\U00002A27'}, + {"pm;", '\U000000B1'}, + {"pointint;", '\U00002A15'}, + {"popf;", '\U0001D561'}, + {"pound;", '\U000000A3'}, + {"pr;", '\U0000227A'}, + {"prE;", '\U00002AB3'}, + {"prap;", '\U00002AB7'}, + {"prcue;", '\U0000227C'}, + {"pre;", '\U00002AAF'}, + {"prec;", '\U0000227A'}, + {"precapprox;", '\U00002AB7'}, + {"preccurlyeq;", '\U0000227C'}, + {"preceq;", '\U00002AAF'}, + {"precnapprox;", '\U00002AB9'}, + {"precneqq;", '\U00002AB5'}, + {"precnsim;", '\U000022E8'}, + {"precsim;", '\U0000227E'}, + {"prime;", '\U00002032'}, + {"primes;", '\U00002119'}, + {"prnE;", '\U00002AB5'}, + {"prnap;", '\U00002AB9'}, + {"prnsim;", '\U000022E8'}, + {"prod;", '\U0000220F'}, + {"profalar;", '\U0000232E'}, + {"profline;", '\U00002312'}, + {"profsurf;", '\U00002313'}, + {"prop;", '\U0000221D'}, + {"propto;", '\U0000221D'}, + {"prsim;", '\U0000227E'}, + {"prurel;", '\U000022B0'}, + {"pscr;", '\U0001D4C5'}, + {"psi;", '\U000003C8'}, + {"puncsp;", '\U00002008'}, + {"qfr;", '\U0001D52E'}, + {"qint;", '\U00002A0C'}, + {"qopf;", '\U0001D562'}, + {"qprime;", '\U00002057'}, + {"qscr;", '\U0001D4C6'}, + {"quaternions;", '\U0000210D'}, + {"quatint;", '\U00002A16'}, + {"quest;", '\U0000003F'}, + {"questeq;", '\U0000225F'}, + {"quot;", '\U00000022'}, + {"rAarr;", '\U000021DB'}, + {"rArr;", '\U000021D2'}, + {"rAtail;", '\U0000291C'}, + {"rBarr;", '\U0000290F'}, + {"rHar;", '\U00002964'}, + {"racute;", '\U00000155'}, + {"radic;", '\U0000221A'}, + {"raemptyv;", '\U000029B3'}, + {"rang;", '\U000027E9'}, + {"rangd;", '\U00002992'}, + {"range;", '\U000029A5'}, + {"rangle;", '\U000027E9'}, + {"raquo;", '\U000000BB'}, + {"rarr;", '\U00002192'}, + {"rarrap;", '\U00002975'}, + {"rarrb;", '\U000021E5'}, + {"rarrbfs;", '\U00002920'}, + {"rarrc;", '\U00002933'}, + {"rarrfs;", '\U0000291E'}, + {"rarrhk;", '\U000021AA'}, + {"rarrlp;", '\U000021AC'}, + {"rarrpl;", '\U00002945'}, + {"rarrsim;", '\U00002974'}, + {"rarrtl;", '\U000021A3'}, + {"rarrw;", '\U0000219D'}, + {"ratail;", '\U0000291A'}, + {"ratio;", '\U00002236'}, + {"rationals;", '\U0000211A'}, + {"rbarr;", '\U0000290D'}, + {"rbbrk;", '\U00002773'}, + {"rbrace;", '\U0000007D'}, + {"rbrack;", '\U0000005D'}, + {"rbrke;", '\U0000298C'}, + {"rbrksld;", '\U0000298E'}, + {"rbrkslu;", '\U00002990'}, + {"rcaron;", '\U00000159'}, + {"rcedil;", '\U00000157'}, + {"rceil;", '\U00002309'}, + {"rcub;", '\U0000007D'}, + {"rcy;", '\U00000440'}, + {"rdca;", '\U00002937'}, + {"rdldhar;", '\U00002969'}, + {"rdquo;", '\U0000201D'}, + {"rdquor;", '\U0000201D'}, + {"rdsh;", '\U000021B3'}, + {"real;", '\U0000211C'}, + {"realine;", '\U0000211B'}, + {"realpart;", '\U0000211C'}, + {"reals;", '\U0000211D'}, + {"rect;", '\U000025AD'}, + {"reg;", '\U000000AE'}, + {"rfisht;", '\U0000297D'}, + {"rfloor;", '\U0000230B'}, + {"rfr;", '\U0001D52F'}, + {"rhard;", '\U000021C1'}, + {"rharu;", '\U000021C0'}, + {"rharul;", '\U0000296C'}, + {"rho;", '\U000003C1'}, + {"rhov;", '\U000003F1'}, + {"rightarrow;", '\U00002192'}, + {"rightarrowtail;", '\U000021A3'}, + {"rightharpoondown;", '\U000021C1'}, + {"rightharpoonup;", '\U000021C0'}, + {"rightleftarrows;", '\U000021C4'}, + {"rightleftharpoons;", '\U000021CC'}, + {"rightrightarrows;", '\U000021C9'}, + {"rightsquigarrow;", '\U0000219D'}, + {"rightthreetimes;", '\U000022CC'}, + {"ring;", '\U000002DA'}, + {"risingdotseq;", '\U00002253'}, + {"rlarr;", '\U000021C4'}, + {"rlhar;", '\U000021CC'}, + {"rlm;", '\U0000200F'}, + {"rmoust;", '\U000023B1'}, + {"rmoustache;", '\U000023B1'}, + {"rnmid;", '\U00002AEE'}, + {"roang;", '\U000027ED'}, + {"roarr;", '\U000021FE'}, + {"robrk;", '\U000027E7'}, + {"ropar;", '\U00002986'}, + {"ropf;", '\U0001D563'}, + {"roplus;", '\U00002A2E'}, + {"rotimes;", '\U00002A35'}, + {"rpar;", '\U00000029'}, + {"rpargt;", '\U00002994'}, + {"rppolint;", '\U00002A12'}, + {"rrarr;", '\U000021C9'}, + {"rsaquo;", '\U0000203A'}, + {"rscr;", '\U0001D4C7'}, + {"rsh;", '\U000021B1'}, + {"rsqb;", '\U0000005D'}, + {"rsquo;", '\U00002019'}, + {"rsquor;", '\U00002019'}, + {"rthree;", '\U000022CC'}, + {"rtimes;", '\U000022CA'}, + {"rtri;", '\U000025B9'}, + {"rtrie;", '\U000022B5'}, + {"rtrif;", '\U000025B8'}, + {"rtriltri;", '\U000029CE'}, + {"ruluhar;", '\U00002968'}, + {"rx;", '\U0000211E'}, + {"sacute;", '\U0000015B'}, + {"sbquo;", '\U0000201A'}, + {"sc;", '\U0000227B'}, + {"scE;", '\U00002AB4'}, + {"scap;", '\U00002AB8'}, + {"scaron;", '\U00000161'}, + {"sccue;", '\U0000227D'}, + {"sce;", '\U00002AB0'}, + {"scedil;", '\U0000015F'}, + {"scirc;", '\U0000015D'}, + {"scnE;", '\U00002AB6'}, + {"scnap;", '\U00002ABA'}, + {"scnsim;", '\U000022E9'}, + {"scpolint;", '\U00002A13'}, + {"scsim;", '\U0000227F'}, + {"scy;", '\U00000441'}, + {"sdot;", '\U000022C5'}, + {"sdotb;", '\U000022A1'}, + {"sdote;", '\U00002A66'}, + {"seArr;", '\U000021D8'}, + {"searhk;", '\U00002925'}, + {"searr;", '\U00002198'}, + {"searrow;", '\U00002198'}, + {"sect;", '\U000000A7'}, + {"semi;", '\U0000003B'}, + {"seswar;", '\U00002929'}, + {"setminus;", '\U00002216'}, + {"setmn;", '\U00002216'}, + {"sext;", '\U00002736'}, + {"sfr;", '\U0001D530'}, + {"sfrown;", '\U00002322'}, + {"sharp;", '\U0000266F'}, + {"shchcy;", '\U00000449'}, + {"shcy;", '\U00000448'}, + {"shortmid;", '\U00002223'}, + {"shortparallel;", '\U00002225'}, + {"shy;", '\U000000AD'}, + {"sigma;", '\U000003C3'}, + {"sigmaf;", '\U000003C2'}, + {"sigmav;", '\U000003C2'}, + {"sim;", '\U0000223C'}, + {"simdot;", '\U00002A6A'}, + {"sime;", '\U00002243'}, + {"simeq;", '\U00002243'}, + {"simg;", '\U00002A9E'}, + {"simgE;", '\U00002AA0'}, + {"siml;", '\U00002A9D'}, + {"simlE;", '\U00002A9F'}, + {"simne;", '\U00002246'}, + {"simplus;", '\U00002A24'}, + {"simrarr;", '\U00002972'}, + {"slarr;", '\U00002190'}, + {"smallsetminus;", '\U00002216'}, + {"smashp;", '\U00002A33'}, + {"smeparsl;", '\U000029E4'}, + {"smid;", '\U00002223'}, + {"smile;", '\U00002323'}, + {"smt;", '\U00002AAA'}, + {"smte;", '\U00002AAC'}, + {"softcy;", '\U0000044C'}, + {"sol;", '\U0000002F'}, + {"solb;", '\U000029C4'}, + {"solbar;", '\U0000233F'}, + {"sopf;", '\U0001D564'}, + {"spades;", '\U00002660'}, + {"spadesuit;", '\U00002660'}, + {"spar;", '\U00002225'}, + {"sqcap;", '\U00002293'}, + {"sqcup;", '\U00002294'}, + {"sqsub;", '\U0000228F'}, + {"sqsube;", '\U00002291'}, + {"sqsubset;", '\U0000228F'}, + {"sqsubseteq;", '\U00002291'}, + {"sqsup;", '\U00002290'}, + {"sqsupe;", '\U00002292'}, + {"sqsupset;", '\U00002290'}, + {"sqsupseteq;", '\U00002292'}, + {"squ;", '\U000025A1'}, + {"square;", '\U000025A1'}, + {"squarf;", '\U000025AA'}, + {"squf;", '\U000025AA'}, + {"srarr;", '\U00002192'}, + {"sscr;", '\U0001D4C8'}, + {"ssetmn;", '\U00002216'}, + {"ssmile;", '\U00002323'}, + {"sstarf;", '\U000022C6'}, + {"star;", '\U00002606'}, + {"starf;", '\U00002605'}, + {"straightepsilon;", '\U000003F5'}, + {"straightphi;", '\U000003D5'}, + {"strns;", '\U000000AF'}, + {"sub;", '\U00002282'}, + {"subE;", '\U00002AC5'}, + {"subdot;", '\U00002ABD'}, + {"sube;", '\U00002286'}, + {"subedot;", '\U00002AC3'}, + {"submult;", '\U00002AC1'}, + {"subnE;", '\U00002ACB'}, + {"subne;", '\U0000228A'}, + {"subplus;", '\U00002ABF'}, + {"subrarr;", '\U00002979'}, + {"subset;", '\U00002282'}, + {"subseteq;", '\U00002286'}, + {"subseteqq;", '\U00002AC5'}, + {"subsetneq;", '\U0000228A'}, + {"subsetneqq;", '\U00002ACB'}, + {"subsim;", '\U00002AC7'}, + {"subsub;", '\U00002AD5'}, + {"subsup;", '\U00002AD3'}, + {"succ;", '\U0000227B'}, + {"succapprox;", '\U00002AB8'}, + {"succcurlyeq;", '\U0000227D'}, + {"succeq;", '\U00002AB0'}, + {"succnapprox;", '\U00002ABA'}, + {"succneqq;", '\U00002AB6'}, + {"succnsim;", '\U000022E9'}, + {"succsim;", '\U0000227F'}, + {"sum;", '\U00002211'}, + {"sung;", '\U0000266A'}, + {"sup;", '\U00002283'}, + {"sup1;", '\U000000B9'}, + {"sup2;", '\U000000B2'}, + {"sup3;", '\U000000B3'}, + {"supE;", '\U00002AC6'}, + {"supdot;", '\U00002ABE'}, + {"supdsub;", '\U00002AD8'}, + {"supe;", '\U00002287'}, + {"supedot;", '\U00002AC4'}, + {"suphsol;", '\U000027C9'}, + {"suphsub;", '\U00002AD7'}, + {"suplarr;", '\U0000297B'}, + {"supmult;", '\U00002AC2'}, + {"supnE;", '\U00002ACC'}, + {"supne;", '\U0000228B'}, + {"supplus;", '\U00002AC0'}, + {"supset;", '\U00002283'}, + {"supseteq;", '\U00002287'}, + {"supseteqq;", '\U00002AC6'}, + {"supsetneq;", '\U0000228B'}, + {"supsetneqq;", '\U00002ACC'}, + {"supsim;", '\U00002AC8'}, + {"supsub;", '\U00002AD4'}, + {"supsup;", '\U00002AD6'}, + {"swArr;", '\U000021D9'}, + {"swarhk;", '\U00002926'}, + {"swarr;", '\U00002199'}, + {"swarrow;", '\U00002199'}, + {"swnwar;", '\U0000292A'}, + {"szlig;", '\U000000DF'}, + {"target;", '\U00002316'}, + {"tau;", '\U000003C4'}, + {"tbrk;", '\U000023B4'}, + {"tcaron;", '\U00000165'}, + {"tcedil;", '\U00000163'}, + {"tcy;", '\U00000442'}, + {"tdot;", '\U000020DB'}, + {"telrec;", '\U00002315'}, + {"tfr;", '\U0001D531'}, + {"there4;", '\U00002234'}, + {"therefore;", '\U00002234'}, + {"theta;", '\U000003B8'}, + {"thetasym;", '\U000003D1'}, + {"thetav;", '\U000003D1'}, + {"thickapprox;", '\U00002248'}, + {"thicksim;", '\U0000223C'}, + {"thinsp;", '\U00002009'}, + {"thkap;", '\U00002248'}, + {"thksim;", '\U0000223C'}, + {"thorn;", '\U000000FE'}, + {"tilde;", '\U000002DC'}, + {"times;", '\U000000D7'}, + {"timesb;", '\U000022A0'}, + {"timesbar;", '\U00002A31'}, + {"timesd;", '\U00002A30'}, + {"tint;", '\U0000222D'}, + {"toea;", '\U00002928'}, + {"top;", '\U000022A4'}, + {"topbot;", '\U00002336'}, + {"topcir;", '\U00002AF1'}, + {"topf;", '\U0001D565'}, + {"topfork;", '\U00002ADA'}, + {"tosa;", '\U00002929'}, + {"tprime;", '\U00002034'}, + {"trade;", '\U00002122'}, + {"triangle;", '\U000025B5'}, + {"triangledown;", '\U000025BF'}, + {"triangleleft;", '\U000025C3'}, + {"trianglelefteq;", '\U000022B4'}, + {"triangleq;", '\U0000225C'}, + {"triangleright;", '\U000025B9'}, + {"trianglerighteq;", '\U000022B5'}, + {"tridot;", '\U000025EC'}, + {"trie;", '\U0000225C'}, + {"triminus;", '\U00002A3A'}, + {"triplus;", '\U00002A39'}, + {"trisb;", '\U000029CD'}, + {"tritime;", '\U00002A3B'}, + {"trpezium;", '\U000023E2'}, + {"tscr;", '\U0001D4C9'}, + {"tscy;", '\U00000446'}, + {"tshcy;", '\U0000045B'}, + {"tstrok;", '\U00000167'}, + {"twixt;", '\U0000226C'}, + {"twoheadleftarrow;", '\U0000219E'}, + {"twoheadrightarrow;", '\U000021A0'}, + {"uArr;", '\U000021D1'}, + {"uHar;", '\U00002963'}, + {"uacute;", '\U000000FA'}, + {"uarr;", '\U00002191'}, + {"ubrcy;", '\U0000045E'}, + {"ubreve;", '\U0000016D'}, + {"ucirc;", '\U000000FB'}, + {"ucy;", '\U00000443'}, + {"udarr;", '\U000021C5'}, + {"udblac;", '\U00000171'}, + {"udhar;", '\U0000296E'}, + {"ufisht;", '\U0000297E'}, + {"ufr;", '\U0001D532'}, + {"ugrave;", '\U000000F9'}, + {"uharl;", '\U000021BF'}, + {"uharr;", '\U000021BE'}, + {"uhblk;", '\U00002580'}, + {"ulcorn;", '\U0000231C'}, + {"ulcorner;", '\U0000231C'}, + {"ulcrop;", '\U0000230F'}, + {"ultri;", '\U000025F8'}, + {"umacr;", '\U0000016B'}, + {"uml;", '\U000000A8'}, + {"uogon;", '\U00000173'}, + {"uopf;", '\U0001D566'}, + {"uparrow;", '\U00002191'}, + {"updownarrow;", '\U00002195'}, + {"upharpoonleft;", '\U000021BF'}, + {"upharpoonright;", '\U000021BE'}, + {"uplus;", '\U0000228E'}, + {"upsi;", '\U000003C5'}, + {"upsih;", '\U000003D2'}, + {"upsilon;", '\U000003C5'}, + {"upuparrows;", '\U000021C8'}, + {"urcorn;", '\U0000231D'}, + {"urcorner;", '\U0000231D'}, + {"urcrop;", '\U0000230E'}, + {"uring;", '\U0000016F'}, + {"urtri;", '\U000025F9'}, + {"uscr;", '\U0001D4CA'}, + {"utdot;", '\U000022F0'}, + {"utilde;", '\U00000169'}, + {"utri;", '\U000025B5'}, + {"utrif;", '\U000025B4'}, + {"uuarr;", '\U000021C8'}, + {"uuml;", '\U000000FC'}, + {"uwangle;", '\U000029A7'}, + {"vArr;", '\U000021D5'}, + {"vBar;", '\U00002AE8'}, + {"vBarv;", '\U00002AE9'}, + {"vDash;", '\U000022A8'}, + {"vangrt;", '\U0000299C'}, + {"varepsilon;", '\U000003F5'}, + {"varkappa;", '\U000003F0'}, + {"varnothing;", '\U00002205'}, + {"varphi;", '\U000003D5'}, + {"varpi;", '\U000003D6'}, + {"varpropto;", '\U0000221D'}, + {"varr;", '\U00002195'}, + {"varrho;", '\U000003F1'}, + {"varsigma;", '\U000003C2'}, + {"vartheta;", '\U000003D1'}, + {"vartriangleleft;", '\U000022B2'}, + {"vartriangleright;", '\U000022B3'}, + {"vcy;", '\U00000432'}, + {"vdash;", '\U000022A2'}, + {"vee;", '\U00002228'}, + {"veebar;", '\U000022BB'}, + {"veeeq;", '\U0000225A'}, + {"vellip;", '\U000022EE'}, + {"verbar;", '\U0000007C'}, + {"vert;", '\U0000007C'}, + {"vfr;", '\U0001D533'}, + {"vltri;", '\U000022B2'}, + {"vopf;", '\U0001D567'}, + {"vprop;", '\U0000221D'}, + {"vrtri;", '\U000022B3'}, + {"vscr;", '\U0001D4CB'}, + {"vzigzag;", '\U0000299A'}, + {"wcirc;", '\U00000175'}, + {"wedbar;", '\U00002A5F'}, + {"wedge;", '\U00002227'}, + {"wedgeq;", '\U00002259'}, + {"weierp;", '\U00002118'}, + {"wfr;", '\U0001D534'}, + {"wopf;", '\U0001D568'}, + {"wp;", '\U00002118'}, + {"wr;", '\U00002240'}, + {"wreath;", '\U00002240'}, + {"wscr;", '\U0001D4CC'}, + {"xcap;", '\U000022C2'}, + {"xcirc;", '\U000025EF'}, + {"xcup;", '\U000022C3'}, + {"xdtri;", '\U000025BD'}, + {"xfr;", '\U0001D535'}, + {"xhArr;", '\U000027FA'}, + {"xharr;", '\U000027F7'}, + {"xi;", '\U000003BE'}, + {"xlArr;", '\U000027F8'}, + {"xlarr;", '\U000027F5'}, + {"xmap;", '\U000027FC'}, + {"xnis;", '\U000022FB'}, + {"xodot;", '\U00002A00'}, + {"xopf;", '\U0001D569'}, + {"xoplus;", '\U00002A01'}, + {"xotime;", '\U00002A02'}, + {"xrArr;", '\U000027F9'}, + {"xrarr;", '\U000027F6'}, + {"xscr;", '\U0001D4CD'}, + {"xsqcup;", '\U00002A06'}, + {"xuplus;", '\U00002A04'}, + {"xutri;", '\U000025B3'}, + {"xvee;", '\U000022C1'}, + {"xwedge;", '\U000022C0'}, + {"yacute;", '\U000000FD'}, + {"yacy;", '\U0000044F'}, + {"ycirc;", '\U00000177'}, + {"ycy;", '\U0000044B'}, + {"yen;", '\U000000A5'}, + {"yfr;", '\U0001D536'}, + {"yicy;", '\U00000457'}, + {"yopf;", '\U0001D56A'}, + {"yscr;", '\U0001D4CE'}, + {"yucy;", '\U0000044E'}, + {"yuml;", '\U000000FF'}, + {"zacute;", '\U0000017A'}, + {"zcaron;", '\U0000017E'}, + {"zcy;", '\U00000437'}, + {"zdot;", '\U0000017C'}, + {"zeetrf;", '\U00002128'}, + {"zeta;", '\U000003B6'}, + {"zfr;", '\U0001D537'}, + {"zhcy;", '\U00000436'}, + {"zigrarr;", '\U000021DD'}, + {"zopf;", '\U0001D56B'}, + {"zscr;", '\U0001D4CF'}, + {"zwj;", '\U0000200D'}, + {"zwnj;", '\U0000200C'}, + + {"Aacute", '\U000000C1'}, + {"aacute", '\U000000E1'}, + {"Acirc", '\U000000C2'}, + {"acirc", '\U000000E2'}, + {"acute", '\U000000B4'}, + {"AElig", '\U000000C6'}, + {"aelig", '\U000000E6'}, + {"Agrave", '\U000000C0'}, + {"agrave", '\U000000E0'}, + {"AMP", '\U00000026'}, + {"amp", '\U00000026'}, + {"Aring", '\U000000C5'}, + {"aring", '\U000000E5'}, + {"Atilde", '\U000000C3'}, + {"atilde", '\U000000E3'}, + {"Auml", '\U000000C4'}, + {"auml", '\U000000E4'}, + {"brvbar", '\U000000A6'}, + {"Ccedil", '\U000000C7'}, + {"ccedil", '\U000000E7'}, + {"cedil", '\U000000B8'}, + {"cent", '\U000000A2'}, + {"COPY", '\U000000A9'}, + {"copy", '\U000000A9'}, + {"curren", '\U000000A4'}, + {"deg", '\U000000B0'}, + {"divide", '\U000000F7'}, + {"Eacute", '\U000000C9'}, + {"eacute", '\U000000E9'}, + {"Ecirc", '\U000000CA'}, + {"ecirc", '\U000000EA'}, + {"Egrave", '\U000000C8'}, + {"egrave", '\U000000E8'}, + {"ETH", '\U000000D0'}, + {"eth", '\U000000F0'}, + {"Euml", '\U000000CB'}, + {"euml", '\U000000EB'}, + {"frac12", '\U000000BD'}, + {"frac14", '\U000000BC'}, + {"frac34", '\U000000BE'}, + {"GT", '\U0000003E'}, + {"gt", '\U0000003E'}, + {"Iacute", '\U000000CD'}, + {"iacute", '\U000000ED'}, + {"Icirc", '\U000000CE'}, + {"icirc", '\U000000EE'}, + {"iexcl", '\U000000A1'}, + {"Igrave", '\U000000CC'}, + {"igrave", '\U000000EC'}, + {"iquest", '\U000000BF'}, + {"Iuml", '\U000000CF'}, + {"iuml", '\U000000EF'}, + {"laquo", '\U000000AB'}, + {"LT", '\U0000003C'}, + {"lt", '\U0000003C'}, + {"macr", '\U000000AF'}, + {"micro", '\U000000B5'}, + {"middot", '\U000000B7'}, + {"nbsp", '\U000000A0'}, + {"not", '\U000000AC'}, + {"Ntilde", '\U000000D1'}, + {"ntilde", '\U000000F1'}, + {"Oacute", '\U000000D3'}, + {"oacute", '\U000000F3'}, + {"Ocirc", '\U000000D4'}, + {"ocirc", '\U000000F4'}, + {"Ograve", '\U000000D2'}, + {"ograve", '\U000000F2'}, + {"ordf", '\U000000AA'}, + {"ordm", '\U000000BA'}, + {"Oslash", '\U000000D8'}, + {"oslash", '\U000000F8'}, + {"Otilde", '\U000000D5'}, + {"otilde", '\U000000F5'}, + {"Ouml", '\U000000D6'}, + {"ouml", '\U000000F6'}, + {"para", '\U000000B6'}, + {"plusmn", '\U000000B1'}, + {"pound", '\U000000A3'}, + {"QUOT", '\U00000022'}, + {"quot", '\U00000022'}, + {"raquo", '\U000000BB'}, + {"REG", '\U000000AE'}, + {"reg", '\U000000AE'}, + {"sect", '\U000000A7'}, + {"shy", '\U000000AD'}, + {"sup1", '\U000000B9'}, + {"sup2", '\U000000B2'}, + {"sup3", '\U000000B3'}, + {"szlig", '\U000000DF'}, + {"THORN", '\U000000DE'}, + {"thorn", '\U000000FE'}, + {"times", '\U000000D7'}, + {"Uacute", '\U000000DA'}, + {"uacute", '\U000000FA'}, + {"Ucirc", '\U000000DB'}, + {"ucirc", '\U000000FB'}, + {"Ugrave", '\U000000D9'}, + {"ugrave", '\U000000F9'}, + {"uml", '\U000000A8'}, + {"Uuml", '\U000000DC'}, + {"uuml", '\U000000FC'}, + {"Yacute", '\U000000DD'}, + {"yacute", '\U000000FD'}, + {"yen", '\U000000A5'}, + {"yuml", '\U000000FF'}, +} + +@(private="file", rodata) +_entity2 := [?]struct{n: string, r: [2]rune}{ + {"acE;", {'\u223E', '\u0333'}}, + {"bne;", {'\u003D', '\u20E5'}}, + {"bnequiv;", {'\u2261', '\u20E5'}}, + {"caps;", {'\u2229', '\uFE00'}}, + {"cups;", {'\u222A', '\uFE00'}}, + {"fjlig;", {'\u0066', '\u006A'}}, + {"gesl;", {'\u22DB', '\uFE00'}}, + {"gvertneqq;", {'\u2269', '\uFE00'}}, + {"gvnE;", {'\u2269', '\uFE00'}}, + {"lates;", {'\u2AAD', '\uFE00'}}, + {"lesg;", {'\u22DA', '\uFE00'}}, + {"lvertneqq;", {'\u2268', '\uFE00'}}, + {"lvnE;", {'\u2268', '\uFE00'}}, + {"nang;", {'\u2220', '\u20D2'}}, + {"napE;", {'\u2A70', '\u0338'}}, + {"napid;", {'\u224B', '\u0338'}}, + {"nbump;", {'\u224E', '\u0338'}}, + {"nbumpe;", {'\u224F', '\u0338'}}, + {"ncongdot;", {'\u2A6D', '\u0338'}}, + {"nedot;", {'\u2250', '\u0338'}}, + {"nesim;", {'\u2242', '\u0338'}}, + {"ngE;", {'\u2267', '\u0338'}}, + {"ngeqq;", {'\u2267', '\u0338'}}, + {"ngeqslant;", {'\u2A7E', '\u0338'}}, + {"nges;", {'\u2A7E', '\u0338'}}, + {"nGg;", {'\u22D9', '\u0338'}}, + {"nGt;", {'\u226B', '\u20D2'}}, + {"nGtv;", {'\u226B', '\u0338'}}, + {"nlE;", {'\u2266', '\u0338'}}, + {"nleqq;", {'\u2266', '\u0338'}}, + {"nleqslant;", {'\u2A7D', '\u0338'}}, + {"nles;", {'\u2A7D', '\u0338'}}, + {"nLl;", {'\u22D8', '\u0338'}}, + {"nLt;", {'\u226A', '\u20D2'}}, + {"nLtv;", {'\u226A', '\u0338'}}, + {"NotEqualTilde;", {'\u2242', '\u0338'}}, + {"NotGreaterFullEqual;", {'\u2267', '\u0338'}}, + {"NotGreaterGreater;", {'\u226B', '\u0338'}}, + {"NotGreaterSlantEqual;", {'\u2A7E', '\u0338'}}, + {"NotHumpDownHump;", {'\u224E', '\u0338'}}, + {"NotHumpEqual;", {'\u224F', '\u0338'}}, + {"notindot;", {'\u22F5', '\u0338'}}, + {"notinE;", {'\u22F9', '\u0338'}}, + {"NotLeftTriangleBar;", {'\u29CF', '\u0338'}}, + {"NotLessLess;", {'\u226A', '\u0338'}}, + {"NotLessSlantEqual;", {'\u2A7D', '\u0338'}}, + {"NotNestedGreaterGreater;", {'\u2AA2', '\u0338'}}, + {"NotNestedLessLess;", {'\u2AA1', '\u0338'}}, + {"NotPrecedesEqual;", {'\u2AAF', '\u0338'}}, + {"NotRightTriangleBar;", {'\u29D0', '\u0338'}}, + {"NotSquareSubset;", {'\u228F', '\u0338'}}, + {"NotSquareSuperset;", {'\u2290', '\u0338'}}, + {"NotSubset;", {'\u2282', '\u20D2'}}, + {"NotSucceedsEqual;", {'\u2AB0', '\u0338'}}, + {"NotSucceedsTilde;", {'\u227F', '\u0338'}}, + {"NotSuperset;", {'\u2283', '\u20D2'}}, + {"nparsl;", {'\u2AFD', '\u20E5'}}, + {"npart;", {'\u2202', '\u0338'}}, + {"npre;", {'\u2AAF', '\u0338'}}, + {"npreceq;", {'\u2AAF', '\u0338'}}, + {"nrarrc;", {'\u2933', '\u0338'}}, + {"nrarrw;", {'\u219D', '\u0338'}}, + {"nsce;", {'\u2AB0', '\u0338'}}, + {"nsubE;", {'\u2AC5', '\u0338'}}, + {"nsubset;", {'\u2282', '\u20D2'}}, + {"nsubseteqq;", {'\u2AC5', '\u0338'}}, + {"nsucceq;", {'\u2AB0', '\u0338'}}, + {"nsupE;", {'\u2AC6', '\u0338'}}, + {"nsupset;", {'\u2283', '\u20D2'}}, + {"nsupseteqq;", {'\u2AC6', '\u0338'}}, + {"nvap;", {'\u224D', '\u20D2'}}, + {"nvge;", {'\u2265', '\u20D2'}}, + {"nvgt;", {'\u003E', '\u20D2'}}, + {"nvle;", {'\u2264', '\u20D2'}}, + {"nvlt;", {'\u003C', '\u20D2'}}, + {"nvltrie;", {'\u22B4', '\u20D2'}}, + {"nvrtrie;", {'\u22B5', '\u20D2'}}, + {"nvsim;", {'\u223C', '\u20D2'}}, + {"race;", {'\u223D', '\u0331'}}, + {"smtes;", {'\u2AAC', '\uFE00'}}, + {"sqcaps;", {'\u2293', '\uFE00'}}, + {"sqcups;", {'\u2294', '\uFE00'}}, + {"ThickSpace;", {'\u205F', '\u200A'}}, + {"varsubsetneq;", {'\u228A', '\uFE00'}}, + {"varsubsetneqq;", {'\u2ACB', '\uFE00'}}, + {"varsupsetneq;", {'\u228B', '\uFE00'}}, + {"varsupsetneqq;", {'\u2ACC', '\uFE00'}}, + {"vnsub;", {'\u2282', '\u20D2'}}, + {"vnsup;", {'\u2283', '\u20D2'}}, + {"vsubne;", {'\u228A', '\uFE00'}}, + {"vsubnE;", {'\u2ACB', '\uFE00'}}, + {"vsupne;", {'\u228B', '\uFE00'}}, + {"vsupnE;", {'\u2ACC', '\uFE00'}}, +} \ No newline at end of file From 23198f79179075f05a965db7951613ef6bb3f9fd Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 18 Jan 2026 11:45:40 +0000 Subject: [PATCH 214/766] Move html escaping calls and fix existing generator --- core/encoding/entity/entity.odin | 279 +- core/encoding/entity/generated.odin | 4828 ++++++++--------- core/html/escape.odin | 248 - core/html/html_entities.odin | 2275 -------- core/unicode/tools/generate_entity_table.odin | 49 +- 5 files changed, 2701 insertions(+), 4978 deletions(-) delete mode 100644 core/html/escape.odin delete mode 100644 core/html/html_entities.odin diff --git a/core/encoding/entity/entity.odin b/core/encoding/entity/entity.odin index e112eedf2..0d455ef88 100644 --- a/core/encoding/entity/entity.odin +++ b/core/encoding/entity/entity.odin @@ -21,6 +21,7 @@ package encoding_unicode_entity Jeroen van Rijn: Initial implementation. */ +import "base:runtime" import "core:unicode/utf8" import "core:unicode" import "core:strings" @@ -141,8 +142,10 @@ decode_xml :: proc(input: string, options := XML_Decode_Options{}, allocator := write_string(&builder, entity) } else { if .No_Entity_Decode not_in options { - if decoded, ok := xml_decode_entity(entity); ok { - write_rune(&builder, decoded) + if decoded, count, ok := xml_decode_entity(entity); ok { + for i in 0.. (err: Error) { } } -xml_decode_entity :: proc(entity: string) -> (decoded: rune, ok: bool) { +xml_decode_entity :: proc(entity: string) -> (decoded: [2]rune, rune_count: int, ok: bool) { entity := entity - if len(entity) == 0 { return -1, false } + if len(entity) == 0 { return } - switch entity[0] { - case '#': + if entity[0] == '#' { base := 10 val := 0 entity = entity[1:] - if len(entity) == 0 { return -1, false } + if len(entity) == 0 { return } if entity[0] == 'x' || entity[0] == 'X' { base = 16 @@ -237,30 +239,275 @@ xml_decode_entity :: proc(entity: string) -> (decoded: rune, ok: bool) { val += int(r - '0') case 'a'..='f': - if base == 10 { return -1, false } + if base == 10 { return } val *= base val += int(r - 'a' + 10) case 'A'..='F': - if base == 10 { return -1, false } + if base == 10 { return } val *= base val += int(r - 'A' + 10) case: - return -1, false + return } - if val > MAX_RUNE_CODEPOINT { return -1, false } + if val > MAX_RUNE_CODEPOINT { return } entity = entity[1:] } - return rune(val), true - - case: - // Named entity. - return named_xml_entity_to_rune(entity) + return rune(val), 1, true } + // Named entity. + return named_xml_entity_to_rune(entity) } + +// escape_html escapes special characters like '&' to become '&'. +// It escapes only 5 different characters: & ' < > and ". +@(require_results) +escape_html :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool) { + /* + & -> & + ' -> ' // ' is shorter than ' (NOTE: ' was not available until HTML 5) + < -> < + > -> > + " -> " // " is shorter than " + */ + + b := transmute([]byte)s + + extra_bytes_needed := 0 + + for c in b { + switch c { + case '&': extra_bytes_needed += 4 + case '\'': extra_bytes_needed += 4 + case '<': extra_bytes_needed += 3 + case '>': extra_bytes_needed += 3 + case '"': extra_bytes_needed += 4 + } + } + + if extra_bytes_needed == 0 { + return s, false + } + + t, err := make([]byte, len(s) + extra_bytes_needed, allocator, loc) + if err != nil { + return + } + was_allocation = true + + w := 0 + for c in b { + s := "" + switch c { + case '&': s = "&" + case '\'': s = "'" + case '<': s = "<" + case '>': s = ">" + case '"': s = """ + } + if s != "" { + copy(t[w:], s) + w += len(s) + } else { + t[w] = c + w += 1 + } + } + output = string(t[0:w]) + return +} + + +@(require_results) +unescape_html :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool, err: runtime.Allocator_Error) { + @(require_results) + do_append :: proc(s: string, amp_idx: int, buf: ^[dynamic]byte) -> (n: int) { + s, amp_idx := s, amp_idx + + n += len(s[:amp_idx]) + if buf != nil { append(buf, s[:amp_idx]) } + s = s[amp_idx:] + for len(s) > 0 { + b, w, j := unescape_entity(s) + n += w + if buf != nil { append(buf, ..b[:w]) } + + s = s[j:] + + amp_idx = strings.index_byte(s, '&') + if amp_idx < 0 { + n += len(s) + if buf != nil { append(buf, s) } + break + } + n += amp_idx + if buf != nil { append(buf, s[:amp_idx]) } + s = s[amp_idx:] + } + + return + } + + s := s + amp_idx := strings.index_byte(s, '&') + if amp_idx < 0 { + return s, false, nil + } + + // NOTE(bill): this does a two pass in order to minimize the allocations required + bytes_required := do_append(s, amp_idx, nil) + + buf := make([dynamic]byte, 0, bytes_required, allocator, loc) or_return + was_allocation = true + + _ = do_append(s, amp_idx, &buf) + + assert(len(buf) == cap(buf)) + output = string(buf[:]) + + return +} + +// Returns an unescaped string of an encoded XML/HTML entity. +@(require_results) +unescape_entity :: proc(s: string) -> (b: [8]byte, w: int, j: int) { + s := s + if len(s) < 2 { + return + } + if s[0] != '&' { + return + } + j = 1 + + if s[j] == '#' { // scan numbers + j += 1 + if len(s) <= 3 { // remove `&#.` + return + } + c := s[j] + hex := false + if c == 'x' || c == 'X' { + hex = true + j += 1 + } + + x := rune(0) + scan_number: for j < len(s) { + c = s[j] + j += 1 + if hex { + switch c { + case '0'..='9': x = 16*x + rune(c) - '0'; continue scan_number + case 'a'..='f': x = 16*x + rune(c) - 'a' + 10; continue scan_number + case 'A'..='F': x = 16*x + rune(c) - 'A' + 10; continue scan_number + } + } else { + switch c { + case '0'..='9': x = 10*x + rune(c) - '0'; continue scan_number + } + } + + // Keep the ';' to check for cases which require it and cases which might not + if c != ';' { + j -= 1 + } + break scan_number + } + + + if j <= 3 { // no replacement characters found + return + } + + @(static, rodata) + windows_1252_replacement_table := [0xa0 - 0x80]rune{ // Windows-1252 -> UTF-8 + '\u20ac', '\u0081', '\u201a', '\u0192', + '\u201e', '\u2026', '\u2020', '\u2021', + '\u02c6', '\u2030', '\u0160', '\u2039', + '\u0152', '\u008d', '\u017d', '\u008f', + '\u0090', '\u2018', '\u2019', '\u201c', + '\u201d', '\u2022', '\u2013', '\u2014', + '\u02dc', '\u2122', '\u0161', '\u203a', + '\u0153', '\u009d', '\u017e', '\u0178', + } + + switch x { + case 0x80..<0xa0: + x = windows_1252_replacement_table[x-0x80] + case 0, 0xd800..=0xdfff: + x = utf8.RUNE_ERROR + case: + if x > 0x10ffff { + x = utf8.RUNE_ERROR + } + + } + + b1, w1 := utf8.encode_rune(x) + w += copy(b[:], b1[:w1]) + return + } + + // Lookup by entity names + + scan_ident: for j < len(s) { // scan over letters and digits + c := s[j] + j += 1 + + switch c { + case 'a'..='z', 'A'..='Z', '0'..='9': + continue scan_ident + } + // Keep the ';' to check for cases which require it and cases which might not + if c != ';' { + j -= 1 + } + break scan_ident + } + + entity_name := s[1:j] + if len(entity_name) == 0 { + return + } + + if entity_name[len(entity_name)-1] == ';' { + entity_name = entity_name[:len(entity_name)-1] + } + + if r2, _, ok := named_xml_entity_to_rune(entity_name); ok { + b1, w1 := utf8.encode_rune(r2[0]) + w += copy(b[w:], b1[:w1]) + if r2[1] != 0 { + b2, w2 := utf8.encode_rune(r2[1]) + w += copy(b[w:], b2[:w2]) + } + return + } + + // The longest entities that do not end with a semicolon are <=6 bytes long + LONGEST_ENTITY_WITHOUT_SEMICOLON :: 6 + + n := min(len(entity_name)-1, LONGEST_ENTITY_WITHOUT_SEMICOLON) + for i := n; i > 1; i -= 1 { + if r2, _, ok := named_xml_entity_to_rune(entity_name[:i]); ok { + b1, w1 := utf8.encode_rune(r2[0]) + w += copy(b[w:], b1[:w1]) + if r2[1] != 0 { + b2, w2 := utf8.encode_rune(r2[1]) + w += copy(b[w:], b2[:w2]) + } + return + } + } + + return +} + + // Private XML helper to extract `&;` entity. @(private="file") _extract_xml_entity :: proc(t: ^Tokenizer) -> (entity: string, err: Error) { diff --git a/core/encoding/entity/generated.odin b/core/encoding/entity/generated.odin index 52027ae03..553554976 100644 --- a/core/encoding/entity/generated.odin +++ b/core/encoding/entity/generated.odin @@ -43,5047 +43,5047 @@ XML_NAME_TO_RUNE_MAX_LENGTH :: 31 entity_name - a string, like "copy" that describes a user-encoded Unicode entity as used in XML. Returns: - "decoded" - The decoded rune if found by name, or -1 otherwise. - "ok" - true if found, false if not. + "decoded" - The decoded runes if found by name, or all zero otherwise. + "rune_count" - The number of decoded runes + "ok" - true if found, false if not. IMPORTANT: XML processors (including browsers) treat these names as case-sensitive. So do we. */ -named_xml_entity_to_rune :: proc(name: string) -> (decoded: rune, ok: bool) { +named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: int, ok: bool) { /* Early out if the name is too short or too long. min as a precaution in case the generated table has a bogus value. */ if len(name) < min(1, XML_NAME_TO_RUNE_MIN_LENGTH) || len(name) > XML_NAME_TO_RUNE_MAX_LENGTH { - return -1, false + return } switch rune(name[0]) { - case 'A': switch name { case "AElig": // LATIN CAPITAL LETTER AE - return rune(0xc6), true + return {'Æ', 0}, 1, true case "AMP": // AMPERSAND - return rune(0x26), true + return {'&', 0}, 1, true case "Aacgr": // GREEK CAPITAL LETTER ALPHA WITH TONOS - return rune(0x0386), true + return {'\u0386', 0}, 1, true case "Aacute": // LATIN CAPITAL LETTER A WITH ACUTE - return rune(0xc1), true + return {'Á', 0}, 1, true case "Abreve": // LATIN CAPITAL LETTER A WITH BREVE - return rune(0x0102), true + return {'\u0102', 0}, 1, true case "Acirc": // LATIN CAPITAL LETTER A WITH CIRCUMFLEX - return rune(0xc2), true + return {'Â', 0}, 1, true case "Acy": // CYRILLIC CAPITAL LETTER A - return rune(0x0410), true + return {'\u0410', 0}, 1, true case "Afr": // MATHEMATICAL FRAKTUR CAPITAL A - return rune(0x01d504), true + return {'\U0001d504', 0}, 1, true case "Agr": // GREEK CAPITAL LETTER ALPHA - return rune(0x0391), true + return {'\u0391', 0}, 1, true case "Agrave": // LATIN CAPITAL LETTER A WITH GRAVE - return rune(0xc0), true + return {'À', 0}, 1, true case "Alpha": // GREEK CAPITAL LETTER ALPHA - return rune(0x0391), true + return {'\u0391', 0}, 1, true case "Amacr": // LATIN CAPITAL LETTER A WITH MACRON - return rune(0x0100), true + return {'\u0100', 0}, 1, true case "And": // DOUBLE LOGICAL AND - return rune(0x2a53), true + return {'\u2a53', 0}, 1, true case "Aogon": // LATIN CAPITAL LETTER A WITH OGONEK - return rune(0x0104), true + return {'\u0104', 0}, 1, true case "Aopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL A - return rune(0x01d538), true + return {'\U0001d538', 0}, 1, true case "ApplyFunction": // FUNCTION APPLICATION - return rune(0x2061), true + return {'\u2061', 0}, 1, true case "Aring": // LATIN CAPITAL LETTER A WITH RING ABOVE - return rune(0xc5), true + return {'Å', 0}, 1, true case "Ascr": // MATHEMATICAL SCRIPT CAPITAL A - return rune(0x01d49c), true + return {'\U0001d49c', 0}, 1, true case "Assign": // COLON EQUALS - return rune(0x2254), true + return {'\u2254', 0}, 1, true case "Ast": // TWO ASTERISKS ALIGNED VERTICALLY - return rune(0x2051), true + return {'\u2051', 0}, 1, true case "Atilde": // LATIN CAPITAL LETTER A WITH TILDE - return rune(0xc3), true + return {'Ã', 0}, 1, true case "Auml": // LATIN CAPITAL LETTER A WITH DIAERESIS - return rune(0xc4), true + return {'Ä', 0}, 1, true } case 'B': switch name { case "Backslash": // SET MINUS - return rune(0x2216), true + return {'\u2216', 0}, 1, true case "Barint": // INTEGRAL WITH DOUBLE STROKE - return rune(0x2a0e), true + return {'\u2a0e', 0}, 1, true case "Barv": // SHORT DOWN TACK WITH OVERBAR - return rune(0x2ae7), true + return {'\u2ae7', 0}, 1, true case "Barwed": // PERSPECTIVE - return rune(0x2306), true + return {'\u2306', 0}, 1, true case "Barwedl": // LOGICAL AND WITH DOUBLE OVERBAR - return rune(0x2a5e), true + return {'\u2a5e', 0}, 1, true case "Bcy": // CYRILLIC CAPITAL LETTER BE - return rune(0x0411), true + return {'\u0411', 0}, 1, true case "Because": // BECAUSE - return rune(0x2235), true + return {'\u2235', 0}, 1, true case "Bernoullis": // SCRIPT CAPITAL B - return rune(0x212c), true + return {'\u212c', 0}, 1, true case "Beta": // GREEK CAPITAL LETTER BETA - return rune(0x0392), true + return {'\u0392', 0}, 1, true case "Bfr": // MATHEMATICAL FRAKTUR CAPITAL B - return rune(0x01d505), true + return {'\U0001d505', 0}, 1, true case "Bgr": // GREEK CAPITAL LETTER BETA - return rune(0x0392), true + return {'\u0392', 0}, 1, true case "Bopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL B - return rune(0x01d539), true + return {'\U0001d539', 0}, 1, true case "Breve": // BREVE - return rune(0x02d8), true + return {'\u02d8', 0}, 1, true case "Bscr": // SCRIPT CAPITAL B - return rune(0x212c), true + return {'\u212c', 0}, 1, true case "Bumpeq": // GEOMETRICALLY EQUIVALENT TO - return rune(0x224e), true + return {'\u224e', 0}, 1, true case "Bvert": // BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL - return rune(0x2506), true + return {'\u2506', 0}, 1, true } case 'C': switch name { case "CHcy": // CYRILLIC CAPITAL LETTER CHE - return rune(0x0427), true + return {'\u0427', 0}, 1, true case "COPY": // COPYRIGHT SIGN - return rune(0xa9), true + return {'©', 0}, 1, true case "Cacute": // LATIN CAPITAL LETTER C WITH ACUTE - return rune(0x0106), true + return {'\u0106', 0}, 1, true case "Cap": // DOUBLE INTERSECTION - return rune(0x22d2), true + return {'\u22d2', 0}, 1, true case "CapitalDifferentialD": // DOUBLE-STRUCK ITALIC CAPITAL D - return rune(0x2145), true + return {'\u2145', 0}, 1, true case "Cayleys": // BLACK-LETTER CAPITAL C - return rune(0x212d), true + return {'\u212d', 0}, 1, true case "Ccaron": // LATIN CAPITAL LETTER C WITH CARON - return rune(0x010c), true + return {'\u010c', 0}, 1, true case "Ccedil": // LATIN CAPITAL LETTER C WITH CEDILLA - return rune(0xc7), true + return {'Ç', 0}, 1, true case "Ccirc": // LATIN CAPITAL LETTER C WITH CIRCUMFLEX - return rune(0x0108), true + return {'\u0108', 0}, 1, true case "Cconint": // VOLUME INTEGRAL - return rune(0x2230), true + return {'\u2230', 0}, 1, true case "Cdot": // LATIN CAPITAL LETTER C WITH DOT ABOVE - return rune(0x010a), true + return {'\u010a', 0}, 1, true case "Cedilla": // CEDILLA - return rune(0xb8), true + return {'¸', 0}, 1, true case "CenterDot": // MIDDLE DOT - return rune(0xb7), true + return {'·', 0}, 1, true case "Cfr": // BLACK-LETTER CAPITAL C - return rune(0x212d), true + return {'\u212d', 0}, 1, true case "Chi": // GREEK CAPITAL LETTER CHI - return rune(0x03a7), true + return {'\u03a7', 0}, 1, true case "CircleDot": // CIRCLED DOT OPERATOR - return rune(0x2299), true + return {'\u2299', 0}, 1, true case "CircleMinus": // CIRCLED MINUS - return rune(0x2296), true + return {'\u2296', 0}, 1, true case "CirclePlus": // CIRCLED PLUS - return rune(0x2295), true + return {'\u2295', 0}, 1, true case "CircleTimes": // CIRCLED TIMES - return rune(0x2297), true + return {'\u2297', 0}, 1, true case "ClockwiseContourIntegral": // CLOCKWISE CONTOUR INTEGRAL - return rune(0x2232), true + return {'\u2232', 0}, 1, true case "CloseCurlyDoubleQuote": // RIGHT DOUBLE QUOTATION MARK - return rune(0x201d), true + return {'\u201d', 0}, 1, true case "CloseCurlyQuote": // RIGHT SINGLE QUOTATION MARK - return rune(0x2019), true + return {'\u2019', 0}, 1, true case "Colon": // PROPORTION - return rune(0x2237), true + return {'\u2237', 0}, 1, true case "Colone": // DOUBLE COLON EQUAL - return rune(0x2a74), true + return {'\u2a74', 0}, 1, true case "Congruent": // IDENTICAL TO - return rune(0x2261), true + return {'\u2261', 0}, 1, true case "Conint": // SURFACE INTEGRAL - return rune(0x222f), true + return {'\u222f', 0}, 1, true case "ContourIntegral": // CONTOUR INTEGRAL - return rune(0x222e), true + return {'\u222e', 0}, 1, true case "Copf": // DOUBLE-STRUCK CAPITAL C - return rune(0x2102), true + return {'\u2102', 0}, 1, true case "Coproduct": // N-ARY COPRODUCT - return rune(0x2210), true + return {'\u2210', 0}, 1, true case "CounterClockwiseContourIntegral": // ANTICLOCKWISE CONTOUR INTEGRAL - return rune(0x2233), true + return {'\u2233', 0}, 1, true case "Cross": // VECTOR OR CROSS PRODUCT - return rune(0x2a2f), true + return {'\u2a2f', 0}, 1, true case "Cscr": // MATHEMATICAL SCRIPT CAPITAL C - return rune(0x01d49e), true + return {'\U0001d49e', 0}, 1, true case "Cup": // DOUBLE UNION - return rune(0x22d3), true + return {'\u22d3', 0}, 1, true case "CupCap": // EQUIVALENT TO - return rune(0x224d), true + return {'\u224d', 0}, 1, true } case 'D': switch name { case "DD": // DOUBLE-STRUCK ITALIC CAPITAL D - return rune(0x2145), true + return {'\u2145', 0}, 1, true case "DDotrahd": // RIGHTWARDS ARROW WITH DOTTED STEM - return rune(0x2911), true + return {'\u2911', 0}, 1, true case "DJcy": // CYRILLIC CAPITAL LETTER DJE - return rune(0x0402), true + return {'\u0402', 0}, 1, true case "DScy": // CYRILLIC CAPITAL LETTER DZE - return rune(0x0405), true + return {'\u0405', 0}, 1, true case "DZcy": // CYRILLIC CAPITAL LETTER DZHE - return rune(0x040f), true + return {'\u040f', 0}, 1, true case "Dagger": // DOUBLE DAGGER - return rune(0x2021), true + return {'\u2021', 0}, 1, true case "Darr": // DOWNWARDS TWO HEADED ARROW - return rune(0x21a1), true + return {'\u21a1', 0}, 1, true case "Dashv": // VERTICAL BAR DOUBLE LEFT TURNSTILE - return rune(0x2ae4), true + return {'\u2ae4', 0}, 1, true case "Dcaron": // LATIN CAPITAL LETTER D WITH CARON - return rune(0x010e), true + return {'\u010e', 0}, 1, true case "Dcy": // CYRILLIC CAPITAL LETTER DE - return rune(0x0414), true + return {'\u0414', 0}, 1, true case "Del": // NABLA - return rune(0x2207), true + return {'\u2207', 0}, 1, true case "Delta": // GREEK CAPITAL LETTER DELTA - return rune(0x0394), true + return {'\u0394', 0}, 1, true case "Dfr": // MATHEMATICAL FRAKTUR CAPITAL D - return rune(0x01d507), true + return {'\U0001d507', 0}, 1, true case "Dgr": // GREEK CAPITAL LETTER DELTA - return rune(0x0394), true + return {'\u0394', 0}, 1, true case "DiacriticalAcute": // ACUTE ACCENT - return rune(0xb4), true + return {'´', 0}, 1, true case "DiacriticalDot": // DOT ABOVE - return rune(0x02d9), true + return {'\u02d9', 0}, 1, true case "DiacriticalDoubleAcute": // DOUBLE ACUTE ACCENT - return rune(0x02dd), true + return {'\u02dd', 0}, 1, true case "DiacriticalGrave": // GRAVE ACCENT - return rune(0x60), true + return {'`', 0}, 1, true case "DiacriticalTilde": // SMALL TILDE - return rune(0x02dc), true + return {'\u02dc', 0}, 1, true case "Diamond": // DIAMOND OPERATOR - return rune(0x22c4), true + return {'\u22c4', 0}, 1, true case "DifferentialD": // DOUBLE-STRUCK ITALIC SMALL D - return rune(0x2146), true + return {'\u2146', 0}, 1, true case "Dopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL D - return rune(0x01d53b), true + return {'\U0001d53b', 0}, 1, true case "Dot": // DIAERESIS - return rune(0xa8), true + return {'¨', 0}, 1, true case "DotDot": // COMBINING FOUR DOTS ABOVE - return rune(0x20dc), true + return {'\u20dc', 0}, 1, true case "DotEqual": // APPROACHES THE LIMIT - return rune(0x2250), true + return {'\u2250', 0}, 1, true case "DoubleContourIntegral": // SURFACE INTEGRAL - return rune(0x222f), true + return {'\u222f', 0}, 1, true case "DoubleDot": // DIAERESIS - return rune(0xa8), true + return {'¨', 0}, 1, true case "DoubleDownArrow": // DOWNWARDS DOUBLE ARROW - return rune(0x21d3), true + return {'\u21d3', 0}, 1, true case "DoubleLeftArrow": // LEFTWARDS DOUBLE ARROW - return rune(0x21d0), true + return {'\u21d0', 0}, 1, true case "DoubleLeftRightArrow": // LEFT RIGHT DOUBLE ARROW - return rune(0x21d4), true + return {'\u21d4', 0}, 1, true case "DoubleLeftTee": // VERTICAL BAR DOUBLE LEFT TURNSTILE - return rune(0x2ae4), true + return {'\u2ae4', 0}, 1, true case "DoubleLongLeftArrow": // LONG LEFTWARDS DOUBLE ARROW - return rune(0x27f8), true + return {'\u27f8', 0}, 1, true case "DoubleLongLeftRightArrow": // LONG LEFT RIGHT DOUBLE ARROW - return rune(0x27fa), true + return {'\u27fa', 0}, 1, true case "DoubleLongRightArrow": // LONG RIGHTWARDS DOUBLE ARROW - return rune(0x27f9), true + return {'\u27f9', 0}, 1, true case "DoubleRightArrow": // RIGHTWARDS DOUBLE ARROW - return rune(0x21d2), true + return {'\u21d2', 0}, 1, true case "DoubleRightTee": // TRUE - return rune(0x22a8), true + return {'\u22a8', 0}, 1, true case "DoubleUpArrow": // UPWARDS DOUBLE ARROW - return rune(0x21d1), true + return {'\u21d1', 0}, 1, true case "DoubleUpDownArrow": // UP DOWN DOUBLE ARROW - return rune(0x21d5), true + return {'\u21d5', 0}, 1, true case "DoubleVerticalBar": // PARALLEL TO - return rune(0x2225), true + return {'\u2225', 0}, 1, true case "DownArrow": // DOWNWARDS ARROW - return rune(0x2193), true + return {'\u2193', 0}, 1, true case "DownArrowBar": // DOWNWARDS ARROW TO BAR - return rune(0x2913), true + return {'\u2913', 0}, 1, true case "DownArrowUpArrow": // DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW - return rune(0x21f5), true + return {'\u21f5', 0}, 1, true case "DownBreve": // COMBINING INVERTED BREVE - return rune(0x0311), true + return {'\u0311', 0}, 1, true case "DownLeftRightVector": // LEFT BARB DOWN RIGHT BARB DOWN HARPOON - return rune(0x2950), true + return {'\u2950', 0}, 1, true case "DownLeftTeeVector": // LEFTWARDS HARPOON WITH BARB DOWN FROM BAR - return rune(0x295e), true + return {'\u295e', 0}, 1, true case "DownLeftVector": // LEFTWARDS HARPOON WITH BARB DOWNWARDS - return rune(0x21bd), true + return {'\u21bd', 0}, 1, true case "DownLeftVectorBar": // LEFTWARDS HARPOON WITH BARB DOWN TO BAR - return rune(0x2956), true + return {'\u2956', 0}, 1, true case "DownRightTeeVector": // RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR - return rune(0x295f), true + return {'\u295f', 0}, 1, true case "DownRightVector": // RIGHTWARDS HARPOON WITH BARB DOWNWARDS - return rune(0x21c1), true + return {'\u21c1', 0}, 1, true case "DownRightVectorBar": // RIGHTWARDS HARPOON WITH BARB DOWN TO BAR - return rune(0x2957), true + return {'\u2957', 0}, 1, true case "DownTee": // DOWN TACK - return rune(0x22a4), true + return {'\u22a4', 0}, 1, true case "DownTeeArrow": // DOWNWARDS ARROW FROM BAR - return rune(0x21a7), true + return {'\u21a7', 0}, 1, true case "Downarrow": // DOWNWARDS DOUBLE ARROW - return rune(0x21d3), true + return {'\u21d3', 0}, 1, true case "Dscr": // MATHEMATICAL SCRIPT CAPITAL D - return rune(0x01d49f), true + return {'\U0001d49f', 0}, 1, true case "Dstrok": // LATIN CAPITAL LETTER D WITH STROKE - return rune(0x0110), true + return {'\u0110', 0}, 1, true } case 'E': switch name { case "EEacgr": // GREEK CAPITAL LETTER ETA WITH TONOS - return rune(0x0389), true + return {'\u0389', 0}, 1, true case "EEgr": // GREEK CAPITAL LETTER ETA - return rune(0x0397), true + return {'\u0397', 0}, 1, true case "ENG": // LATIN CAPITAL LETTER ENG - return rune(0x014a), true + return {'\u014a', 0}, 1, true case "ETH": // LATIN CAPITAL LETTER ETH - return rune(0xd0), true + return {'Ð', 0}, 1, true case "Eacgr": // GREEK CAPITAL LETTER EPSILON WITH TONOS - return rune(0x0388), true + return {'\u0388', 0}, 1, true case "Eacute": // LATIN CAPITAL LETTER E WITH ACUTE - return rune(0xc9), true + return {'É', 0}, 1, true case "Ecaron": // LATIN CAPITAL LETTER E WITH CARON - return rune(0x011a), true + return {'\u011a', 0}, 1, true case "Ecirc": // LATIN CAPITAL LETTER E WITH CIRCUMFLEX - return rune(0xca), true + return {'Ê', 0}, 1, true case "Ecy": // CYRILLIC CAPITAL LETTER E - return rune(0x042d), true + return {'\u042d', 0}, 1, true case "Edot": // LATIN CAPITAL LETTER E WITH DOT ABOVE - return rune(0x0116), true + return {'\u0116', 0}, 1, true case "Efr": // MATHEMATICAL FRAKTUR CAPITAL E - return rune(0x01d508), true + return {'\U0001d508', 0}, 1, true case "Egr": // GREEK CAPITAL LETTER EPSILON - return rune(0x0395), true + return {'\u0395', 0}, 1, true case "Egrave": // LATIN CAPITAL LETTER E WITH GRAVE - return rune(0xc8), true + return {'È', 0}, 1, true case "Element": // ELEMENT OF - return rune(0x2208), true + return {'\u2208', 0}, 1, true case "Emacr": // LATIN CAPITAL LETTER E WITH MACRON - return rune(0x0112), true + return {'\u0112', 0}, 1, true case "EmptySmallSquare": // WHITE MEDIUM SQUARE - return rune(0x25fb), true + return {'\u25fb', 0}, 1, true case "EmptyVerySmallSquare": // WHITE SMALL SQUARE - return rune(0x25ab), true + return {'\u25ab', 0}, 1, true case "Eogon": // LATIN CAPITAL LETTER E WITH OGONEK - return rune(0x0118), true + return {'\u0118', 0}, 1, true case "Eopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL E - return rune(0x01d53c), true + return {'\U0001d53c', 0}, 1, true case "Epsilon": // GREEK CAPITAL LETTER EPSILON - return rune(0x0395), true + return {'\u0395', 0}, 1, true case "Equal": // TWO CONSECUTIVE EQUALS SIGNS - return rune(0x2a75), true + return {'\u2a75', 0}, 1, true case "EqualTilde": // MINUS TILDE - return rune(0x2242), true + return {'\u2242', 0}, 1, true case "Equilibrium": // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON - return rune(0x21cc), true + return {'\u21cc', 0}, 1, true case "Escr": // SCRIPT CAPITAL E - return rune(0x2130), true + return {'\u2130', 0}, 1, true case "Esim": // EQUALS SIGN ABOVE TILDE OPERATOR - return rune(0x2a73), true + return {'\u2a73', 0}, 1, true case "Eta": // GREEK CAPITAL LETTER ETA - return rune(0x0397), true + return {'\u0397', 0}, 1, true case "Euml": // LATIN CAPITAL LETTER E WITH DIAERESIS - return rune(0xcb), true + return {'Ë', 0}, 1, true case "Exists": // THERE EXISTS - return rune(0x2203), true + return {'\u2203', 0}, 1, true case "ExponentialE": // DOUBLE-STRUCK ITALIC SMALL E - return rune(0x2147), true + return {'\u2147', 0}, 1, true } case 'F': switch name { case "Fcy": // CYRILLIC CAPITAL LETTER EF - return rune(0x0424), true + return {'\u0424', 0}, 1, true case "Ffr": // MATHEMATICAL FRAKTUR CAPITAL F - return rune(0x01d509), true + return {'\U0001d509', 0}, 1, true case "FilledSmallSquare": // BLACK MEDIUM SQUARE - return rune(0x25fc), true + return {'\u25fc', 0}, 1, true case "FilledVerySmallSquare": // BLACK SMALL SQUARE - return rune(0x25aa), true + return {'\u25aa', 0}, 1, true case "Fopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL F - return rune(0x01d53d), true + return {'\U0001d53d', 0}, 1, true case "ForAll": // FOR ALL - return rune(0x2200), true + return {'\u2200', 0}, 1, true case "Fouriertrf": // SCRIPT CAPITAL F - return rune(0x2131), true + return {'\u2131', 0}, 1, true case "Fscr": // SCRIPT CAPITAL F - return rune(0x2131), true + return {'\u2131', 0}, 1, true } case 'G': switch name { case "GJcy": // CYRILLIC CAPITAL LETTER GJE - return rune(0x0403), true + return {'\u0403', 0}, 1, true case "GT": // GREATER-THAN SIGN - return rune(0x3e), true + return {'>', 0}, 1, true case "Game": // TURNED SANS-SERIF CAPITAL G - return rune(0x2141), true + return {'\u2141', 0}, 1, true case "Gamma": // GREEK CAPITAL LETTER GAMMA - return rune(0x0393), true + return {'\u0393', 0}, 1, true case "Gammad": // GREEK LETTER DIGAMMA - return rune(0x03dc), true + return {'\u03dc', 0}, 1, true case "Gbreve": // LATIN CAPITAL LETTER G WITH BREVE - return rune(0x011e), true + return {'\u011e', 0}, 1, true case "Gcedil": // LATIN CAPITAL LETTER G WITH CEDILLA - return rune(0x0122), true + return {'\u0122', 0}, 1, true case "Gcirc": // LATIN CAPITAL LETTER G WITH CIRCUMFLEX - return rune(0x011c), true + return {'\u011c', 0}, 1, true case "Gcy": // CYRILLIC CAPITAL LETTER GHE - return rune(0x0413), true + return {'\u0413', 0}, 1, true case "Gdot": // LATIN CAPITAL LETTER G WITH DOT ABOVE - return rune(0x0120), true + return {'\u0120', 0}, 1, true case "Gfr": // MATHEMATICAL FRAKTUR CAPITAL G - return rune(0x01d50a), true + return {'\U0001d50a', 0}, 1, true case "Gg": // VERY MUCH GREATER-THAN - return rune(0x22d9), true + return {'\u22d9', 0}, 1, true case "Ggr": // GREEK CAPITAL LETTER GAMMA - return rune(0x0393), true + return {'\u0393', 0}, 1, true case "Gopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL G - return rune(0x01d53e), true + return {'\U0001d53e', 0}, 1, true case "GreaterEqual": // GREATER-THAN OR EQUAL TO - return rune(0x2265), true + return {'\u2265', 0}, 1, true case "GreaterEqualLess": // GREATER-THAN EQUAL TO OR LESS-THAN - return rune(0x22db), true + return {'\u22db', 0}, 1, true case "GreaterFullEqual": // GREATER-THAN OVER EQUAL TO - return rune(0x2267), true + return {'\u2267', 0}, 1, true case "GreaterGreater": // DOUBLE NESTED GREATER-THAN - return rune(0x2aa2), true + return {'\u2aa2', 0}, 1, true case "GreaterLess": // GREATER-THAN OR LESS-THAN - return rune(0x2277), true + return {'\u2277', 0}, 1, true case "GreaterSlantEqual": // GREATER-THAN OR SLANTED EQUAL TO - return rune(0x2a7e), true + return {'\u2a7e', 0}, 1, true case "GreaterTilde": // GREATER-THAN OR EQUIVALENT TO - return rune(0x2273), true + return {'\u2273', 0}, 1, true case "Gscr": // MATHEMATICAL SCRIPT CAPITAL G - return rune(0x01d4a2), true + return {'\U0001d4a2', 0}, 1, true case "Gt": // MUCH GREATER-THAN - return rune(0x226b), true + return {'\u226b', 0}, 1, true } case 'H': switch name { case "HARDcy": // CYRILLIC CAPITAL LETTER HARD SIGN - return rune(0x042a), true + return {'\u042a', 0}, 1, true case "Hacek": // CARON - return rune(0x02c7), true + return {'\u02c7', 0}, 1, true case "Hat": // CIRCUMFLEX ACCENT - return rune(0x5e), true + return {'^', 0}, 1, true case "Hcirc": // LATIN CAPITAL LETTER H WITH CIRCUMFLEX - return rune(0x0124), true + return {'\u0124', 0}, 1, true case "Hfr": // BLACK-LETTER CAPITAL H - return rune(0x210c), true + return {'\u210c', 0}, 1, true case "HilbertSpace": // SCRIPT CAPITAL H - return rune(0x210b), true + return {'\u210b', 0}, 1, true case "Hopf": // DOUBLE-STRUCK CAPITAL H - return rune(0x210d), true + return {'\u210d', 0}, 1, true case "HorizontalLine": // BOX DRAWINGS LIGHT HORIZONTAL - return rune(0x2500), true + return {'\u2500', 0}, 1, true case "Hscr": // SCRIPT CAPITAL H - return rune(0x210b), true + return {'\u210b', 0}, 1, true case "Hstrok": // LATIN CAPITAL LETTER H WITH STROKE - return rune(0x0126), true + return {'\u0126', 0}, 1, true case "HumpDownHump": // GEOMETRICALLY EQUIVALENT TO - return rune(0x224e), true + return {'\u224e', 0}, 1, true case "HumpEqual": // DIFFERENCE BETWEEN - return rune(0x224f), true + return {'\u224f', 0}, 1, true } case 'I': switch name { case "IEcy": // CYRILLIC CAPITAL LETTER IE - return rune(0x0415), true + return {'\u0415', 0}, 1, true case "IJlig": // LATIN CAPITAL LIGATURE IJ - return rune(0x0132), true + return {'\u0132', 0}, 1, true case "IOcy": // CYRILLIC CAPITAL LETTER IO - return rune(0x0401), true + return {'\u0401', 0}, 1, true case "Iacgr": // GREEK CAPITAL LETTER IOTA WITH TONOS - return rune(0x038a), true + return {'\u038a', 0}, 1, true case "Iacute": // LATIN CAPITAL LETTER I WITH ACUTE - return rune(0xcd), true + return {'Í', 0}, 1, true case "Icirc": // LATIN CAPITAL LETTER I WITH CIRCUMFLEX - return rune(0xce), true + return {'Î', 0}, 1, true case "Icy": // CYRILLIC CAPITAL LETTER I - return rune(0x0418), true + return {'\u0418', 0}, 1, true case "Idigr": // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - return rune(0x03aa), true + return {'\u03aa', 0}, 1, true case "Idot": // LATIN CAPITAL LETTER I WITH DOT ABOVE - return rune(0x0130), true + return {'\u0130', 0}, 1, true case "Ifr": // BLACK-LETTER CAPITAL I - return rune(0x2111), true + return {'\u2111', 0}, 1, true case "Igr": // GREEK CAPITAL LETTER IOTA - return rune(0x0399), true + return {'\u0399', 0}, 1, true case "Igrave": // LATIN CAPITAL LETTER I WITH GRAVE - return rune(0xcc), true + return {'Ì', 0}, 1, true case "Im": // BLACK-LETTER CAPITAL I - return rune(0x2111), true + return {'\u2111', 0}, 1, true case "Imacr": // LATIN CAPITAL LETTER I WITH MACRON - return rune(0x012a), true + return {'\u012a', 0}, 1, true case "ImaginaryI": // DOUBLE-STRUCK ITALIC SMALL I - return rune(0x2148), true + return {'\u2148', 0}, 1, true case "Implies": // RIGHTWARDS DOUBLE ARROW - return rune(0x21d2), true + return {'\u21d2', 0}, 1, true case "Int": // DOUBLE INTEGRAL - return rune(0x222c), true + return {'\u222c', 0}, 1, true case "Integral": // INTEGRAL - return rune(0x222b), true + return {'\u222b', 0}, 1, true case "Intersection": // N-ARY INTERSECTION - return rune(0x22c2), true + return {'\u22c2', 0}, 1, true case "InvisibleComma": // INVISIBLE SEPARATOR - return rune(0x2063), true + return {'\u2063', 0}, 1, true case "InvisibleTimes": // INVISIBLE TIMES - return rune(0x2062), true + return {'\u2062', 0}, 1, true case "Iogon": // LATIN CAPITAL LETTER I WITH OGONEK - return rune(0x012e), true + return {'\u012e', 0}, 1, true case "Iopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL I - return rune(0x01d540), true + return {'\U0001d540', 0}, 1, true case "Iota": // GREEK CAPITAL LETTER IOTA - return rune(0x0399), true + return {'\u0399', 0}, 1, true case "Iscr": // SCRIPT CAPITAL I - return rune(0x2110), true + return {'\u2110', 0}, 1, true case "Itilde": // LATIN CAPITAL LETTER I WITH TILDE - return rune(0x0128), true + return {'\u0128', 0}, 1, true case "Iukcy": // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - return rune(0x0406), true + return {'\u0406', 0}, 1, true case "Iuml": // LATIN CAPITAL LETTER I WITH DIAERESIS - return rune(0xcf), true + return {'Ï', 0}, 1, true } case 'J': switch name { case "Jcirc": // LATIN CAPITAL LETTER J WITH CIRCUMFLEX - return rune(0x0134), true + return {'\u0134', 0}, 1, true case "Jcy": // CYRILLIC CAPITAL LETTER SHORT I - return rune(0x0419), true + return {'\u0419', 0}, 1, true case "Jfr": // MATHEMATICAL FRAKTUR CAPITAL J - return rune(0x01d50d), true + return {'\U0001d50d', 0}, 1, true case "Jopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL J - return rune(0x01d541), true + return {'\U0001d541', 0}, 1, true case "Jscr": // MATHEMATICAL SCRIPT CAPITAL J - return rune(0x01d4a5), true + return {'\U0001d4a5', 0}, 1, true case "Jsercy": // CYRILLIC CAPITAL LETTER JE - return rune(0x0408), true + return {'\u0408', 0}, 1, true case "Jukcy": // CYRILLIC CAPITAL LETTER UKRAINIAN IE - return rune(0x0404), true + return {'\u0404', 0}, 1, true } case 'K': switch name { case "KHcy": // CYRILLIC CAPITAL LETTER HA - return rune(0x0425), true + return {'\u0425', 0}, 1, true case "KHgr": // GREEK CAPITAL LETTER CHI - return rune(0x03a7), true + return {'\u03a7', 0}, 1, true case "KJcy": // CYRILLIC CAPITAL LETTER KJE - return rune(0x040c), true + return {'\u040c', 0}, 1, true case "Kappa": // GREEK CAPITAL LETTER KAPPA - return rune(0x039a), true + return {'\u039a', 0}, 1, true case "Kcedil": // LATIN CAPITAL LETTER K WITH CEDILLA - return rune(0x0136), true + return {'\u0136', 0}, 1, true case "Kcy": // CYRILLIC CAPITAL LETTER KA - return rune(0x041a), true + return {'\u041a', 0}, 1, true case "Kfr": // MATHEMATICAL FRAKTUR CAPITAL K - return rune(0x01d50e), true + return {'\U0001d50e', 0}, 1, true case "Kgr": // GREEK CAPITAL LETTER KAPPA - return rune(0x039a), true + return {'\u039a', 0}, 1, true case "Kopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL K - return rune(0x01d542), true + return {'\U0001d542', 0}, 1, true case "Kscr": // MATHEMATICAL SCRIPT CAPITAL K - return rune(0x01d4a6), true + return {'\U0001d4a6', 0}, 1, true } case 'L': switch name { case "LJcy": // CYRILLIC CAPITAL LETTER LJE - return rune(0x0409), true + return {'\u0409', 0}, 1, true case "LT": // LESS-THAN SIGN - return rune(0x3c), true + return {'<', 0}, 1, true case "Lacute": // LATIN CAPITAL LETTER L WITH ACUTE - return rune(0x0139), true + return {'\u0139', 0}, 1, true case "Lambda": // GREEK CAPITAL LETTER LAMDA - return rune(0x039b), true + return {'\u039b', 0}, 1, true case "Lang": // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET - return rune(0x27ea), true + return {'\u27ea', 0}, 1, true case "Laplacetrf": // SCRIPT CAPITAL L - return rune(0x2112), true + return {'\u2112', 0}, 1, true case "Larr": // LEFTWARDS TWO HEADED ARROW - return rune(0x219e), true + return {'\u219e', 0}, 1, true case "Lcaron": // LATIN CAPITAL LETTER L WITH CARON - return rune(0x013d), true + return {'\u013d', 0}, 1, true case "Lcedil": // LATIN CAPITAL LETTER L WITH CEDILLA - return rune(0x013b), true + return {'\u013b', 0}, 1, true case "Lcy": // CYRILLIC CAPITAL LETTER EL - return rune(0x041b), true + return {'\u041b', 0}, 1, true case "LeftAngleBracket": // MATHEMATICAL LEFT ANGLE BRACKET - return rune(0x27e8), true + return {'\u27e8', 0}, 1, true case "LeftArrow": // LEFTWARDS ARROW - return rune(0x2190), true + return {'\u2190', 0}, 1, true case "LeftArrowBar": // LEFTWARDS ARROW TO BAR - return rune(0x21e4), true + return {'\u21e4', 0}, 1, true case "LeftArrowRightArrow": // LEFTWARDS ARROW OVER RIGHTWARDS ARROW - return rune(0x21c6), true + return {'\u21c6', 0}, 1, true case "LeftCeiling": // LEFT CEILING - return rune(0x2308), true + return {'\u2308', 0}, 1, true case "LeftDoubleBracket": // MATHEMATICAL LEFT WHITE SQUARE BRACKET - return rune(0x27e6), true + return {'\u27e6', 0}, 1, true case "LeftDownTeeVector": // DOWNWARDS HARPOON WITH BARB LEFT FROM BAR - return rune(0x2961), true + return {'\u2961', 0}, 1, true case "LeftDownVector": // DOWNWARDS HARPOON WITH BARB LEFTWARDS - return rune(0x21c3), true + return {'\u21c3', 0}, 1, true case "LeftDownVectorBar": // DOWNWARDS HARPOON WITH BARB LEFT TO BAR - return rune(0x2959), true + return {'\u2959', 0}, 1, true case "LeftFloor": // LEFT FLOOR - return rune(0x230a), true + return {'\u230a', 0}, 1, true case "LeftRightArrow": // LEFT RIGHT ARROW - return rune(0x2194), true + return {'\u2194', 0}, 1, true case "LeftRightVector": // LEFT BARB UP RIGHT BARB UP HARPOON - return rune(0x294e), true + return {'\u294e', 0}, 1, true case "LeftTee": // LEFT TACK - return rune(0x22a3), true + return {'\u22a3', 0}, 1, true case "LeftTeeArrow": // LEFTWARDS ARROW FROM BAR - return rune(0x21a4), true + return {'\u21a4', 0}, 1, true case "LeftTeeVector": // LEFTWARDS HARPOON WITH BARB UP FROM BAR - return rune(0x295a), true + return {'\u295a', 0}, 1, true case "LeftTriangle": // NORMAL SUBGROUP OF - return rune(0x22b2), true + return {'\u22b2', 0}, 1, true case "LeftTriangleBar": // LEFT TRIANGLE BESIDE VERTICAL BAR - return rune(0x29cf), true + return {'\u29cf', 0}, 1, true case "LeftTriangleEqual": // NORMAL SUBGROUP OF OR EQUAL TO - return rune(0x22b4), true + return {'\u22b4', 0}, 1, true case "LeftUpDownVector": // UP BARB LEFT DOWN BARB LEFT HARPOON - return rune(0x2951), true + return {'\u2951', 0}, 1, true case "LeftUpTeeVector": // UPWARDS HARPOON WITH BARB LEFT FROM BAR - return rune(0x2960), true + return {'\u2960', 0}, 1, true case "LeftUpVector": // UPWARDS HARPOON WITH BARB LEFTWARDS - return rune(0x21bf), true + return {'\u21bf', 0}, 1, true case "LeftUpVectorBar": // UPWARDS HARPOON WITH BARB LEFT TO BAR - return rune(0x2958), true + return {'\u2958', 0}, 1, true case "LeftVector": // LEFTWARDS HARPOON WITH BARB UPWARDS - return rune(0x21bc), true + return {'\u21bc', 0}, 1, true case "LeftVectorBar": // LEFTWARDS HARPOON WITH BARB UP TO BAR - return rune(0x2952), true + return {'\u2952', 0}, 1, true case "Leftarrow": // LEFTWARDS DOUBLE ARROW - return rune(0x21d0), true + return {'\u21d0', 0}, 1, true case "Leftrightarrow": // LEFT RIGHT DOUBLE ARROW - return rune(0x21d4), true + return {'\u21d4', 0}, 1, true case "LessEqualGreater": // LESS-THAN EQUAL TO OR GREATER-THAN - return rune(0x22da), true + return {'\u22da', 0}, 1, true case "LessFullEqual": // LESS-THAN OVER EQUAL TO - return rune(0x2266), true + return {'\u2266', 0}, 1, true case "LessGreater": // LESS-THAN OR GREATER-THAN - return rune(0x2276), true + return {'\u2276', 0}, 1, true case "LessLess": // DOUBLE NESTED LESS-THAN - return rune(0x2aa1), true + return {'\u2aa1', 0}, 1, true case "LessSlantEqual": // LESS-THAN OR SLANTED EQUAL TO - return rune(0x2a7d), true + return {'\u2a7d', 0}, 1, true case "LessTilde": // LESS-THAN OR EQUIVALENT TO - return rune(0x2272), true + return {'\u2272', 0}, 1, true case "Lfr": // MATHEMATICAL FRAKTUR CAPITAL L - return rune(0x01d50f), true + return {'\U0001d50f', 0}, 1, true case "Lgr": // GREEK CAPITAL LETTER LAMDA - return rune(0x039b), true + return {'\u039b', 0}, 1, true case "Ll": // VERY MUCH LESS-THAN - return rune(0x22d8), true + return {'\u22d8', 0}, 1, true case "Lleftarrow": // LEFTWARDS TRIPLE ARROW - return rune(0x21da), true + return {'\u21da', 0}, 1, true case "Lmidot": // LATIN CAPITAL LETTER L WITH MIDDLE DOT - return rune(0x013f), true + return {'\u013f', 0}, 1, true case "LongLeftArrow": // LONG LEFTWARDS ARROW - return rune(0x27f5), true + return {'\u27f5', 0}, 1, true case "LongLeftRightArrow": // LONG LEFT RIGHT ARROW - return rune(0x27f7), true + return {'\u27f7', 0}, 1, true case "LongRightArrow": // LONG RIGHTWARDS ARROW - return rune(0x27f6), true + return {'\u27f6', 0}, 1, true case "Longleftarrow": // LONG LEFTWARDS DOUBLE ARROW - return rune(0x27f8), true + return {'\u27f8', 0}, 1, true case "Longleftrightarrow": // LONG LEFT RIGHT DOUBLE ARROW - return rune(0x27fa), true + return {'\u27fa', 0}, 1, true case "Longrightarrow": // LONG RIGHTWARDS DOUBLE ARROW - return rune(0x27f9), true + return {'\u27f9', 0}, 1, true case "Lopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL L - return rune(0x01d543), true + return {'\U0001d543', 0}, 1, true case "LowerLeftArrow": // SOUTH WEST ARROW - return rune(0x2199), true + return {'\u2199', 0}, 1, true case "LowerRightArrow": // SOUTH EAST ARROW - return rune(0x2198), true + return {'\u2198', 0}, 1, true case "Lscr": // SCRIPT CAPITAL L - return rune(0x2112), true + return {'\u2112', 0}, 1, true case "Lsh": // UPWARDS ARROW WITH TIP LEFTWARDS - return rune(0x21b0), true + return {'\u21b0', 0}, 1, true case "Lstrok": // LATIN CAPITAL LETTER L WITH STROKE - return rune(0x0141), true + return {'\u0141', 0}, 1, true case "Lt": // MUCH LESS-THAN - return rune(0x226a), true + return {'\u226a', 0}, 1, true case "Ltbar": // DOUBLE NESTED LESS-THAN WITH UNDERBAR - return rune(0x2aa3), true + return {'\u2aa3', 0}, 1, true } case 'M': switch name { case "Map": // RIGHTWARDS TWO-HEADED ARROW FROM BAR - return rune(0x2905), true + return {'\u2905', 0}, 1, true case "Mapfrom": // LEFTWARDS DOUBLE ARROW FROM BAR - return rune(0x2906), true + return {'\u2906', 0}, 1, true case "Mapto": // RIGHTWARDS DOUBLE ARROW FROM BAR - return rune(0x2907), true + return {'\u2907', 0}, 1, true case "Mcy": // CYRILLIC CAPITAL LETTER EM - return rune(0x041c), true + return {'\u041c', 0}, 1, true case "MediumSpace": // MEDIUM MATHEMATICAL SPACE - return rune(0x205f), true + return {'\u205f', 0}, 1, true case "Mellintrf": // SCRIPT CAPITAL M - return rune(0x2133), true + return {'\u2133', 0}, 1, true case "Mfr": // MATHEMATICAL FRAKTUR CAPITAL M - return rune(0x01d510), true + return {'\U0001d510', 0}, 1, true case "Mgr": // GREEK CAPITAL LETTER MU - return rune(0x039c), true + return {'\u039c', 0}, 1, true case "MinusPlus": // MINUS-OR-PLUS SIGN - return rune(0x2213), true + return {'\u2213', 0}, 1, true case "Mopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL M - return rune(0x01d544), true + return {'\U0001d544', 0}, 1, true case "Mscr": // SCRIPT CAPITAL M - return rune(0x2133), true + return {'\u2133', 0}, 1, true case "Mu": // GREEK CAPITAL LETTER MU - return rune(0x039c), true + return {'\u039c', 0}, 1, true } case 'N': switch name { case "NJcy": // CYRILLIC CAPITAL LETTER NJE - return rune(0x040a), true + return {'\u040a', 0}, 1, true case "Nacute": // LATIN CAPITAL LETTER N WITH ACUTE - return rune(0x0143), true + return {'\u0143', 0}, 1, true case "Ncaron": // LATIN CAPITAL LETTER N WITH CARON - return rune(0x0147), true + return {'\u0147', 0}, 1, true case "Ncedil": // LATIN CAPITAL LETTER N WITH CEDILLA - return rune(0x0145), true + return {'\u0145', 0}, 1, true case "Ncy": // CYRILLIC CAPITAL LETTER EN - return rune(0x041d), true + return {'\u041d', 0}, 1, true case "NegativeMediumSpace": // ZERO WIDTH SPACE - return rune(0x200b), true + return {'\u200b', 0}, 1, true case "NegativeThickSpace": // ZERO WIDTH SPACE - return rune(0x200b), true + return {'\u200b', 0}, 1, true case "NegativeThinSpace": // ZERO WIDTH SPACE - return rune(0x200b), true + return {'\u200b', 0}, 1, true case "NegativeVeryThinSpace": // ZERO WIDTH SPACE - return rune(0x200b), true + return {'\u200b', 0}, 1, true case "NestedGreaterGreater": // MUCH GREATER-THAN - return rune(0x226b), true + return {'\u226b', 0}, 1, true case "NestedLessLess": // MUCH LESS-THAN - return rune(0x226a), true + return {'\u226a', 0}, 1, true case "NewLine": // LINE FEED (LF) - return rune(0x0a), true + return {'\n', 0}, 1, true case "Nfr": // MATHEMATICAL FRAKTUR CAPITAL N - return rune(0x01d511), true + return {'\U0001d511', 0}, 1, true case "Ngr": // GREEK CAPITAL LETTER NU - return rune(0x039d), true + return {'\u039d', 0}, 1, true case "NoBreak": // WORD JOINER - return rune(0x2060), true + return {'\u2060', 0}, 1, true case "NonBreakingSpace": // NO-BREAK SPACE - return rune(0xa0), true + return {'\u00a0', 0}, 1, true case "Nopf": // DOUBLE-STRUCK CAPITAL N - return rune(0x2115), true + return {'\u2115', 0}, 1, true case "Not": // DOUBLE STROKE NOT SIGN - return rune(0x2aec), true + return {'\u2aec', 0}, 1, true case "NotCongruent": // NOT IDENTICAL TO - return rune(0x2262), true + return {'\u2262', 0}, 1, true case "NotCupCap": // NOT EQUIVALENT TO - return rune(0x226d), true + return {'\u226d', 0}, 1, true case "NotDoubleVerticalBar": // NOT PARALLEL TO - return rune(0x2226), true + return {'\u2226', 0}, 1, true case "NotElement": // NOT AN ELEMENT OF - return rune(0x2209), true + return {'\u2209', 0}, 1, true case "NotEqual": // NOT EQUAL TO - return rune(0x2260), true + return {'\u2260', 0}, 1, true case "NotEqualTilde": // MINUS TILDE with slash - return rune(0x2242), true + return {'\u2242', '\u2242'}, 2, true case "NotExists": // THERE DOES NOT EXIST - return rune(0x2204), true + return {'\u2204', 0}, 1, true case "NotGreater": // NOT GREATER-THAN - return rune(0x226f), true + return {'\u226f', 0}, 1, true case "NotGreaterEqual": // NEITHER GREATER-THAN NOR EQUAL TO - return rune(0x2271), true + return {'\u2271', 0}, 1, true case "NotGreaterFullEqual": // GREATER-THAN OVER EQUAL TO with slash - return rune(0x2267), true + return {'\u2267', '\u2267'}, 2, true case "NotGreaterGreater": // MUCH GREATER THAN with slash - return rune(0x226b), true + return {'\u226b', '\u226b'}, 2, true case "NotGreaterLess": // NEITHER GREATER-THAN NOR LESS-THAN - return rune(0x2279), true + return {'\u2279', 0}, 1, true case "NotGreaterSlantEqual": // GREATER-THAN OR SLANTED EQUAL TO with slash - return rune(0x2a7e), true + return {'\u2a7e', '\u2a7e'}, 2, true case "NotGreaterTilde": // NEITHER GREATER-THAN NOR EQUIVALENT TO - return rune(0x2275), true + return {'\u2275', 0}, 1, true case "NotHumpDownHump": // GEOMETRICALLY EQUIVALENT TO with slash - return rune(0x224e), true + return {'\u224e', '\u224e'}, 2, true case "NotHumpEqual": // DIFFERENCE BETWEEN with slash - return rune(0x224f), true + return {'\u224f', '\u224f'}, 2, true case "NotLeftTriangle": // NOT NORMAL SUBGROUP OF - return rune(0x22ea), true + return {'\u22ea', 0}, 1, true case "NotLeftTriangleBar": // LEFT TRIANGLE BESIDE VERTICAL BAR with slash - return rune(0x29cf), true + return {'\u29cf', '\u29cf'}, 2, true case "NotLeftTriangleEqual": // NOT NORMAL SUBGROUP OF OR EQUAL TO - return rune(0x22ec), true + return {'\u22ec', 0}, 1, true case "NotLess": // NOT LESS-THAN - return rune(0x226e), true + return {'\u226e', 0}, 1, true case "NotLessEqual": // NEITHER LESS-THAN NOR EQUAL TO - return rune(0x2270), true + return {'\u2270', 0}, 1, true case "NotLessGreater": // NEITHER LESS-THAN NOR GREATER-THAN - return rune(0x2278), true + return {'\u2278', 0}, 1, true case "NotLessLess": // MUCH LESS THAN with slash - return rune(0x226a), true + return {'\u226a', '\u226a'}, 2, true case "NotLessSlantEqual": // LESS-THAN OR SLANTED EQUAL TO with slash - return rune(0x2a7d), true + return {'\u2a7d', '\u2a7d'}, 2, true case "NotLessTilde": // NEITHER LESS-THAN NOR EQUIVALENT TO - return rune(0x2274), true + return {'\u2274', 0}, 1, true case "NotNestedGreaterGreater": // DOUBLE NESTED GREATER-THAN with slash - return rune(0x2aa2), true + return {'\u2aa2', '\u2aa2'}, 2, true case "NotNestedLessLess": // DOUBLE NESTED LESS-THAN with slash - return rune(0x2aa1), true + return {'\u2aa1', '\u2aa1'}, 2, true case "NotPrecedes": // DOES NOT PRECEDE - return rune(0x2280), true + return {'\u2280', 0}, 1, true case "NotPrecedesEqual": // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash - return rune(0x2aaf), true + return {'\u2aaf', '\u2aaf'}, 2, true case "NotPrecedesSlantEqual": // DOES NOT PRECEDE OR EQUAL - return rune(0x22e0), true + return {'\u22e0', 0}, 1, true case "NotReverseElement": // DOES NOT CONTAIN AS MEMBER - return rune(0x220c), true + return {'\u220c', 0}, 1, true case "NotRightTriangle": // DOES NOT CONTAIN AS NORMAL SUBGROUP - return rune(0x22eb), true + return {'\u22eb', 0}, 1, true case "NotRightTriangleBar": // VERTICAL BAR BESIDE RIGHT TRIANGLE with slash - return rune(0x29d0), true + return {'\u29d0', '\u29d0'}, 2, true case "NotRightTriangleEqual": // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL - return rune(0x22ed), true + return {'\u22ed', 0}, 1, true case "NotSquareSubset": // SQUARE IMAGE OF with slash - return rune(0x228f), true + return {'\u228f', '\u228f'}, 2, true case "NotSquareSubsetEqual": // NOT SQUARE IMAGE OF OR EQUAL TO - return rune(0x22e2), true + return {'\u22e2', 0}, 1, true case "NotSquareSuperset": // SQUARE ORIGINAL OF with slash - return rune(0x2290), true + return {'\u2290', '\u2290'}, 2, true case "NotSquareSupersetEqual": // NOT SQUARE ORIGINAL OF OR EQUAL TO - return rune(0x22e3), true + return {'\u22e3', 0}, 1, true case "NotSubset": // SUBSET OF with vertical line - return rune(0x2282), true + return {'\u2282', '\u2282'}, 2, true case "NotSubsetEqual": // NEITHER A SUBSET OF NOR EQUAL TO - return rune(0x2288), true + return {'\u2288', 0}, 1, true case "NotSucceeds": // DOES NOT SUCCEED - return rune(0x2281), true + return {'\u2281', 0}, 1, true case "NotSucceedsEqual": // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash - return rune(0x2ab0), true + return {'\u2ab0', '\u2ab0'}, 2, true case "NotSucceedsSlantEqual": // DOES NOT SUCCEED OR EQUAL - return rune(0x22e1), true + return {'\u22e1', 0}, 1, true case "NotSucceedsTilde": // SUCCEEDS OR EQUIVALENT TO with slash - return rune(0x227f), true + return {'\u227f', '\u227f'}, 2, true case "NotSuperset": // SUPERSET OF with vertical line - return rune(0x2283), true + return {'\u2283', '\u2283'}, 2, true case "NotSupersetEqual": // NEITHER A SUPERSET OF NOR EQUAL TO - return rune(0x2289), true + return {'\u2289', 0}, 1, true case "NotTilde": // NOT TILDE - return rune(0x2241), true + return {'\u2241', 0}, 1, true case "NotTildeEqual": // NOT ASYMPTOTICALLY EQUAL TO - return rune(0x2244), true + return {'\u2244', 0}, 1, true case "NotTildeFullEqual": // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO - return rune(0x2247), true + return {'\u2247', 0}, 1, true case "NotTildeTilde": // NOT ALMOST EQUAL TO - return rune(0x2249), true + return {'\u2249', 0}, 1, true case "NotVerticalBar": // DOES NOT DIVIDE - return rune(0x2224), true + return {'\u2224', 0}, 1, true case "Nscr": // MATHEMATICAL SCRIPT CAPITAL N - return rune(0x01d4a9), true + return {'\U0001d4a9', 0}, 1, true case "Ntilde": // LATIN CAPITAL LETTER N WITH TILDE - return rune(0xd1), true + return {'Ñ', 0}, 1, true case "Nu": // GREEK CAPITAL LETTER NU - return rune(0x039d), true + return {'\u039d', 0}, 1, true } case 'O': switch name { case "OElig": // LATIN CAPITAL LIGATURE OE - return rune(0x0152), true + return {'\u0152', 0}, 1, true case "OHacgr": // GREEK CAPITAL LETTER OMEGA WITH TONOS - return rune(0x038f), true + return {'\u038f', 0}, 1, true case "OHgr": // GREEK CAPITAL LETTER OMEGA - return rune(0x03a9), true + return {'\u03a9', 0}, 1, true case "Oacgr": // GREEK CAPITAL LETTER OMICRON WITH TONOS - return rune(0x038c), true + return {'\u038c', 0}, 1, true case "Oacute": // LATIN CAPITAL LETTER O WITH ACUTE - return rune(0xd3), true + return {'Ó', 0}, 1, true case "Ocirc": // LATIN CAPITAL LETTER O WITH CIRCUMFLEX - return rune(0xd4), true + return {'Ô', 0}, 1, true case "Ocy": // CYRILLIC CAPITAL LETTER O - return rune(0x041e), true + return {'\u041e', 0}, 1, true case "Odblac": // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - return rune(0x0150), true + return {'\u0150', 0}, 1, true case "Ofr": // MATHEMATICAL FRAKTUR CAPITAL O - return rune(0x01d512), true + return {'\U0001d512', 0}, 1, true case "Ogr": // GREEK CAPITAL LETTER OMICRON - return rune(0x039f), true + return {'\u039f', 0}, 1, true case "Ograve": // LATIN CAPITAL LETTER O WITH GRAVE - return rune(0xd2), true + return {'Ò', 0}, 1, true case "Omacr": // LATIN CAPITAL LETTER O WITH MACRON - return rune(0x014c), true + return {'\u014c', 0}, 1, true case "Omega": // GREEK CAPITAL LETTER OMEGA - return rune(0x03a9), true + return {'\u03a9', 0}, 1, true case "Omicron": // GREEK CAPITAL LETTER OMICRON - return rune(0x039f), true + return {'\u039f', 0}, 1, true case "Oopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL O - return rune(0x01d546), true + return {'\U0001d546', 0}, 1, true case "OpenCurlyDoubleQuote": // LEFT DOUBLE QUOTATION MARK - return rune(0x201c), true + return {'\u201c', 0}, 1, true case "OpenCurlyQuote": // LEFT SINGLE QUOTATION MARK - return rune(0x2018), true + return {'\u2018', 0}, 1, true case "Or": // DOUBLE LOGICAL OR - return rune(0x2a54), true + return {'\u2a54', 0}, 1, true case "Oscr": // MATHEMATICAL SCRIPT CAPITAL O - return rune(0x01d4aa), true + return {'\U0001d4aa', 0}, 1, true case "Oslash": // LATIN CAPITAL LETTER O WITH STROKE - return rune(0xd8), true + return {'Ø', 0}, 1, true case "Otilde": // LATIN CAPITAL LETTER O WITH TILDE - return rune(0xd5), true + return {'Õ', 0}, 1, true case "Otimes": // MULTIPLICATION SIGN IN DOUBLE CIRCLE - return rune(0x2a37), true + return {'\u2a37', 0}, 1, true case "Ouml": // LATIN CAPITAL LETTER O WITH DIAERESIS - return rune(0xd6), true + return {'Ö', 0}, 1, true case "OverBar": // OVERLINE - return rune(0x203e), true + return {'\u203e', 0}, 1, true case "OverBrace": // TOP CURLY BRACKET - return rune(0x23de), true + return {'\u23de', 0}, 1, true case "OverBracket": // TOP SQUARE BRACKET - return rune(0x23b4), true + return {'\u23b4', 0}, 1, true case "OverParenthesis": // TOP PARENTHESIS - return rune(0x23dc), true + return {'\u23dc', 0}, 1, true } case 'P': switch name { case "PHgr": // GREEK CAPITAL LETTER PHI - return rune(0x03a6), true + return {'\u03a6', 0}, 1, true case "PSgr": // GREEK CAPITAL LETTER PSI - return rune(0x03a8), true + return {'\u03a8', 0}, 1, true case "PartialD": // PARTIAL DIFFERENTIAL - return rune(0x2202), true + return {'\u2202', 0}, 1, true case "Pcy": // CYRILLIC CAPITAL LETTER PE - return rune(0x041f), true + return {'\u041f', 0}, 1, true case "Pfr": // MATHEMATICAL FRAKTUR CAPITAL P - return rune(0x01d513), true + return {'\U0001d513', 0}, 1, true case "Pgr": // GREEK CAPITAL LETTER PI - return rune(0x03a0), true + return {'\u03a0', 0}, 1, true case "Phi": // GREEK CAPITAL LETTER PHI - return rune(0x03a6), true + return {'\u03a6', 0}, 1, true case "Pi": // GREEK CAPITAL LETTER PI - return rune(0x03a0), true + return {'\u03a0', 0}, 1, true case "PlusMinus": // PLUS-MINUS SIGN - return rune(0xb1), true + return {'±', 0}, 1, true case "Poincareplane": // BLACK-LETTER CAPITAL H - return rune(0x210c), true + return {'\u210c', 0}, 1, true case "Popf": // DOUBLE-STRUCK CAPITAL P - return rune(0x2119), true + return {'\u2119', 0}, 1, true case "Pr": // DOUBLE PRECEDES - return rune(0x2abb), true + return {'\u2abb', 0}, 1, true case "Precedes": // PRECEDES - return rune(0x227a), true + return {'\u227a', 0}, 1, true case "PrecedesEqual": // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN - return rune(0x2aaf), true + return {'\u2aaf', 0}, 1, true case "PrecedesSlantEqual": // PRECEDES OR EQUAL TO - return rune(0x227c), true + return {'\u227c', 0}, 1, true case "PrecedesTilde": // PRECEDES OR EQUIVALENT TO - return rune(0x227e), true + return {'\u227e', 0}, 1, true case "Prime": // DOUBLE PRIME - return rune(0x2033), true + return {'\u2033', 0}, 1, true case "Product": // N-ARY PRODUCT - return rune(0x220f), true + return {'\u220f', 0}, 1, true case "Proportion": // PROPORTION - return rune(0x2237), true + return {'\u2237', 0}, 1, true case "Proportional": // PROPORTIONAL TO - return rune(0x221d), true + return {'\u221d', 0}, 1, true case "Pscr": // MATHEMATICAL SCRIPT CAPITAL P - return rune(0x01d4ab), true + return {'\U0001d4ab', 0}, 1, true case "Psi": // GREEK CAPITAL LETTER PSI - return rune(0x03a8), true + return {'\u03a8', 0}, 1, true } case 'Q': switch name { case "QUOT": // QUOTATION MARK - return rune(0x22), true + return {'"', 0}, 1, true case "Qfr": // MATHEMATICAL FRAKTUR CAPITAL Q - return rune(0x01d514), true + return {'\U0001d514', 0}, 1, true case "Qopf": // DOUBLE-STRUCK CAPITAL Q - return rune(0x211a), true + return {'\u211a', 0}, 1, true case "Qscr": // MATHEMATICAL SCRIPT CAPITAL Q - return rune(0x01d4ac), true + return {'\U0001d4ac', 0}, 1, true } case 'R': switch name { case "RBarr": // RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW - return rune(0x2910), true + return {'\u2910', 0}, 1, true case "REG": // REGISTERED SIGN - return rune(0xae), true + return {'®', 0}, 1, true case "Racute": // LATIN CAPITAL LETTER R WITH ACUTE - return rune(0x0154), true + return {'\u0154', 0}, 1, true case "Rang": // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET - return rune(0x27eb), true + return {'\u27eb', 0}, 1, true case "Rarr": // RIGHTWARDS TWO HEADED ARROW - return rune(0x21a0), true + return {'\u21a0', 0}, 1, true case "Rarrtl": // RIGHTWARDS TWO-HEADED ARROW WITH TAIL - return rune(0x2916), true + return {'\u2916', 0}, 1, true case "Rcaron": // LATIN CAPITAL LETTER R WITH CARON - return rune(0x0158), true + return {'\u0158', 0}, 1, true case "Rcedil": // LATIN CAPITAL LETTER R WITH CEDILLA - return rune(0x0156), true + return {'\u0156', 0}, 1, true case "Rcy": // CYRILLIC CAPITAL LETTER ER - return rune(0x0420), true + return {'\u0420', 0}, 1, true case "Re": // BLACK-LETTER CAPITAL R - return rune(0x211c), true + return {'\u211c', 0}, 1, true case "ReverseElement": // CONTAINS AS MEMBER - return rune(0x220b), true + return {'\u220b', 0}, 1, true case "ReverseEquilibrium": // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON - return rune(0x21cb), true + return {'\u21cb', 0}, 1, true case "ReverseUpEquilibrium": // DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT - return rune(0x296f), true + return {'\u296f', 0}, 1, true case "Rfr": // BLACK-LETTER CAPITAL R - return rune(0x211c), true + return {'\u211c', 0}, 1, true case "Rgr": // GREEK CAPITAL LETTER RHO - return rune(0x03a1), true + return {'\u03a1', 0}, 1, true case "Rho": // GREEK CAPITAL LETTER RHO - return rune(0x03a1), true + return {'\u03a1', 0}, 1, true case "RightAngleBracket": // MATHEMATICAL RIGHT ANGLE BRACKET - return rune(0x27e9), true + return {'\u27e9', 0}, 1, true case "RightArrow": // RIGHTWARDS ARROW - return rune(0x2192), true + return {'\u2192', 0}, 1, true case "RightArrowBar": // RIGHTWARDS ARROW TO BAR - return rune(0x21e5), true + return {'\u21e5', 0}, 1, true case "RightArrowLeftArrow": // RIGHTWARDS ARROW OVER LEFTWARDS ARROW - return rune(0x21c4), true + return {'\u21c4', 0}, 1, true case "RightCeiling": // RIGHT CEILING - return rune(0x2309), true + return {'\u2309', 0}, 1, true case "RightDoubleBracket": // MATHEMATICAL RIGHT WHITE SQUARE BRACKET - return rune(0x27e7), true + return {'\u27e7', 0}, 1, true case "RightDownTeeVector": // DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR - return rune(0x295d), true + return {'\u295d', 0}, 1, true case "RightDownVector": // DOWNWARDS HARPOON WITH BARB RIGHTWARDS - return rune(0x21c2), true + return {'\u21c2', 0}, 1, true case "RightDownVectorBar": // DOWNWARDS HARPOON WITH BARB RIGHT TO BAR - return rune(0x2955), true + return {'\u2955', 0}, 1, true case "RightFloor": // RIGHT FLOOR - return rune(0x230b), true + return {'\u230b', 0}, 1, true case "RightTee": // RIGHT TACK - return rune(0x22a2), true + return {'\u22a2', 0}, 1, true case "RightTeeArrow": // RIGHTWARDS ARROW FROM BAR - return rune(0x21a6), true + return {'\u21a6', 0}, 1, true case "RightTeeVector": // RIGHTWARDS HARPOON WITH BARB UP FROM BAR - return rune(0x295b), true + return {'\u295b', 0}, 1, true case "RightTriangle": // CONTAINS AS NORMAL SUBGROUP - return rune(0x22b3), true + return {'\u22b3', 0}, 1, true case "RightTriangleBar": // VERTICAL BAR BESIDE RIGHT TRIANGLE - return rune(0x29d0), true + return {'\u29d0', 0}, 1, true case "RightTriangleEqual": // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO - return rune(0x22b5), true + return {'\u22b5', 0}, 1, true case "RightUpDownVector": // UP BARB RIGHT DOWN BARB RIGHT HARPOON - return rune(0x294f), true + return {'\u294f', 0}, 1, true case "RightUpTeeVector": // UPWARDS HARPOON WITH BARB RIGHT FROM BAR - return rune(0x295c), true + return {'\u295c', 0}, 1, true case "RightUpVector": // UPWARDS HARPOON WITH BARB RIGHTWARDS - return rune(0x21be), true + return {'\u21be', 0}, 1, true case "RightUpVectorBar": // UPWARDS HARPOON WITH BARB RIGHT TO BAR - return rune(0x2954), true + return {'\u2954', 0}, 1, true case "RightVector": // RIGHTWARDS HARPOON WITH BARB UPWARDS - return rune(0x21c0), true + return {'\u21c0', 0}, 1, true case "RightVectorBar": // RIGHTWARDS HARPOON WITH BARB UP TO BAR - return rune(0x2953), true + return {'\u2953', 0}, 1, true case "Rightarrow": // RIGHTWARDS DOUBLE ARROW - return rune(0x21d2), true + return {'\u21d2', 0}, 1, true case "Ropf": // DOUBLE-STRUCK CAPITAL R - return rune(0x211d), true + return {'\u211d', 0}, 1, true case "RoundImplies": // RIGHT DOUBLE ARROW WITH ROUNDED HEAD - return rune(0x2970), true + return {'\u2970', 0}, 1, true case "Rrightarrow": // RIGHTWARDS TRIPLE ARROW - return rune(0x21db), true + return {'\u21db', 0}, 1, true case "Rscr": // SCRIPT CAPITAL R - return rune(0x211b), true + return {'\u211b', 0}, 1, true case "Rsh": // UPWARDS ARROW WITH TIP RIGHTWARDS - return rune(0x21b1), true + return {'\u21b1', 0}, 1, true case "RuleDelayed": // RULE-DELAYED - return rune(0x29f4), true + return {'\u29f4', 0}, 1, true } case 'S': switch name { case "SHCHcy": // CYRILLIC CAPITAL LETTER SHCHA - return rune(0x0429), true + return {'\u0429', 0}, 1, true case "SHcy": // CYRILLIC CAPITAL LETTER SHA - return rune(0x0428), true + return {'\u0428', 0}, 1, true case "SOFTcy": // CYRILLIC CAPITAL LETTER SOFT SIGN - return rune(0x042c), true + return {'\u042c', 0}, 1, true case "Sacute": // LATIN CAPITAL LETTER S WITH ACUTE - return rune(0x015a), true + return {'\u015a', 0}, 1, true case "Sc": // DOUBLE SUCCEEDS - return rune(0x2abc), true + return {'\u2abc', 0}, 1, true case "Scaron": // LATIN CAPITAL LETTER S WITH CARON - return rune(0x0160), true + return {'\u0160', 0}, 1, true case "Scedil": // LATIN CAPITAL LETTER S WITH CEDILLA - return rune(0x015e), true + return {'\u015e', 0}, 1, true case "Scirc": // LATIN CAPITAL LETTER S WITH CIRCUMFLEX - return rune(0x015c), true + return {'\u015c', 0}, 1, true case "Scy": // CYRILLIC CAPITAL LETTER ES - return rune(0x0421), true + return {'\u0421', 0}, 1, true case "Sfr": // MATHEMATICAL FRAKTUR CAPITAL S - return rune(0x01d516), true + return {'\U0001d516', 0}, 1, true case "Sgr": // GREEK CAPITAL LETTER SIGMA - return rune(0x03a3), true + return {'\u03a3', 0}, 1, true case "ShortDownArrow": // DOWNWARDS ARROW - return rune(0x2193), true + return {'\u2193', 0}, 1, true case "ShortLeftArrow": // LEFTWARDS ARROW - return rune(0x2190), true + return {'\u2190', 0}, 1, true case "ShortRightArrow": // RIGHTWARDS ARROW - return rune(0x2192), true + return {'\u2192', 0}, 1, true case "ShortUpArrow": // UPWARDS ARROW - return rune(0x2191), true + return {'\u2191', 0}, 1, true case "Sigma": // GREEK CAPITAL LETTER SIGMA - return rune(0x03a3), true + return {'\u03a3', 0}, 1, true case "SmallCircle": // RING OPERATOR - return rune(0x2218), true + return {'\u2218', 0}, 1, true case "Sopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL S - return rune(0x01d54a), true + return {'\U0001d54a', 0}, 1, true case "Sqrt": // SQUARE ROOT - return rune(0x221a), true + return {'\u221a', 0}, 1, true case "Square": // WHITE SQUARE - return rune(0x25a1), true + return {'\u25a1', 0}, 1, true case "SquareIntersection": // SQUARE CAP - return rune(0x2293), true + return {'\u2293', 0}, 1, true case "SquareSubset": // SQUARE IMAGE OF - return rune(0x228f), true + return {'\u228f', 0}, 1, true case "SquareSubsetEqual": // SQUARE IMAGE OF OR EQUAL TO - return rune(0x2291), true + return {'\u2291', 0}, 1, true case "SquareSuperset": // SQUARE ORIGINAL OF - return rune(0x2290), true + return {'\u2290', 0}, 1, true case "SquareSupersetEqual": // SQUARE ORIGINAL OF OR EQUAL TO - return rune(0x2292), true + return {'\u2292', 0}, 1, true case "SquareUnion": // SQUARE CUP - return rune(0x2294), true + return {'\u2294', 0}, 1, true case "Sscr": // MATHEMATICAL SCRIPT CAPITAL S - return rune(0x01d4ae), true + return {'\U0001d4ae', 0}, 1, true case "Star": // STAR OPERATOR - return rune(0x22c6), true + return {'\u22c6', 0}, 1, true case "Sub": // DOUBLE SUBSET - return rune(0x22d0), true + return {'\u22d0', 0}, 1, true case "Subset": // DOUBLE SUBSET - return rune(0x22d0), true + return {'\u22d0', 0}, 1, true case "SubsetEqual": // SUBSET OF OR EQUAL TO - return rune(0x2286), true + return {'\u2286', 0}, 1, true case "Succeeds": // SUCCEEDS - return rune(0x227b), true + return {'\u227b', 0}, 1, true case "SucceedsEqual": // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN - return rune(0x2ab0), true + return {'\u2ab0', 0}, 1, true case "SucceedsSlantEqual": // SUCCEEDS OR EQUAL TO - return rune(0x227d), true + return {'\u227d', 0}, 1, true case "SucceedsTilde": // SUCCEEDS OR EQUIVALENT TO - return rune(0x227f), true + return {'\u227f', 0}, 1, true case "SuchThat": // CONTAINS AS MEMBER - return rune(0x220b), true + return {'\u220b', 0}, 1, true case "Sum": // N-ARY SUMMATION - return rune(0x2211), true + return {'\u2211', 0}, 1, true case "Sup": // DOUBLE SUPERSET - return rune(0x22d1), true + return {'\u22d1', 0}, 1, true case "Superset": // SUPERSET OF - return rune(0x2283), true + return {'\u2283', 0}, 1, true case "SupersetEqual": // SUPERSET OF OR EQUAL TO - return rune(0x2287), true + return {'\u2287', 0}, 1, true case "Supset": // DOUBLE SUPERSET - return rune(0x22d1), true + return {'\u22d1', 0}, 1, true } case 'T': switch name { case "THORN": // LATIN CAPITAL LETTER THORN - return rune(0xde), true + return {'Þ', 0}, 1, true case "THgr": // GREEK CAPITAL LETTER THETA - return rune(0x0398), true + return {'\u0398', 0}, 1, true case "TRADE": // TRADE MARK SIGN - return rune(0x2122), true + return {'\u2122', 0}, 1, true case "TSHcy": // CYRILLIC CAPITAL LETTER TSHE - return rune(0x040b), true + return {'\u040b', 0}, 1, true case "TScy": // CYRILLIC CAPITAL LETTER TSE - return rune(0x0426), true + return {'\u0426', 0}, 1, true case "Tab": // CHARACTER TABULATION - return rune(0x09), true + return {'\t', 0}, 1, true case "Tau": // GREEK CAPITAL LETTER TAU - return rune(0x03a4), true + return {'\u03a4', 0}, 1, true case "Tcaron": // LATIN CAPITAL LETTER T WITH CARON - return rune(0x0164), true + return {'\u0164', 0}, 1, true case "Tcedil": // LATIN CAPITAL LETTER T WITH CEDILLA - return rune(0x0162), true + return {'\u0162', 0}, 1, true case "Tcy": // CYRILLIC CAPITAL LETTER TE - return rune(0x0422), true + return {'\u0422', 0}, 1, true case "Tfr": // MATHEMATICAL FRAKTUR CAPITAL T - return rune(0x01d517), true + return {'\U0001d517', 0}, 1, true case "Tgr": // GREEK CAPITAL LETTER TAU - return rune(0x03a4), true + return {'\u03a4', 0}, 1, true case "Therefore": // THEREFORE - return rune(0x2234), true + return {'\u2234', 0}, 1, true case "Theta": // GREEK CAPITAL LETTER THETA - return rune(0x0398), true + return {'\u0398', 0}, 1, true case "Thetav": // GREEK CAPITAL THETA SYMBOL - return rune(0x03f4), true + return {'\u03f4', 0}, 1, true case "ThickSpace": // space of width 5/18 em - return rune(0x205f), true + return {'\u205f', '\u205f'}, 2, true case "ThinSpace": // THIN SPACE - return rune(0x2009), true + return {'\u2009', 0}, 1, true case "Tilde": // TILDE OPERATOR - return rune(0x223c), true + return {'\u223c', 0}, 1, true case "TildeEqual": // ASYMPTOTICALLY EQUAL TO - return rune(0x2243), true + return {'\u2243', 0}, 1, true case "TildeFullEqual": // APPROXIMATELY EQUAL TO - return rune(0x2245), true + return {'\u2245', 0}, 1, true case "TildeTilde": // ALMOST EQUAL TO - return rune(0x2248), true + return {'\u2248', 0}, 1, true case "Topf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL T - return rune(0x01d54b), true + return {'\U0001d54b', 0}, 1, true case "TripleDot": // COMBINING THREE DOTS ABOVE - return rune(0x20db), true + return {'\u20db', 0}, 1, true case "Tscr": // MATHEMATICAL SCRIPT CAPITAL T - return rune(0x01d4af), true + return {'\U0001d4af', 0}, 1, true case "Tstrok": // LATIN CAPITAL LETTER T WITH STROKE - return rune(0x0166), true + return {'\u0166', 0}, 1, true } case 'U': switch name { case "Uacgr": // GREEK CAPITAL LETTER UPSILON WITH TONOS - return rune(0x038e), true + return {'\u038e', 0}, 1, true case "Uacute": // LATIN CAPITAL LETTER U WITH ACUTE - return rune(0xda), true + return {'Ú', 0}, 1, true case "Uarr": // UPWARDS TWO HEADED ARROW - return rune(0x219f), true + return {'\u219f', 0}, 1, true case "Uarrocir": // UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE - return rune(0x2949), true + return {'\u2949', 0}, 1, true case "Ubrcy": // CYRILLIC CAPITAL LETTER SHORT U - return rune(0x040e), true + return {'\u040e', 0}, 1, true case "Ubreve": // LATIN CAPITAL LETTER U WITH BREVE - return rune(0x016c), true + return {'\u016c', 0}, 1, true case "Ucirc": // LATIN CAPITAL LETTER U WITH CIRCUMFLEX - return rune(0xdb), true + return {'Û', 0}, 1, true case "Ucy": // CYRILLIC CAPITAL LETTER U - return rune(0x0423), true + return {'\u0423', 0}, 1, true case "Udblac": // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - return rune(0x0170), true + return {'\u0170', 0}, 1, true case "Udigr": // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - return rune(0x03ab), true + return {'\u03ab', 0}, 1, true case "Ufr": // MATHEMATICAL FRAKTUR CAPITAL U - return rune(0x01d518), true + return {'\U0001d518', 0}, 1, true case "Ugr": // GREEK CAPITAL LETTER UPSILON - return rune(0x03a5), true + return {'\u03a5', 0}, 1, true case "Ugrave": // LATIN CAPITAL LETTER U WITH GRAVE - return rune(0xd9), true + return {'Ù', 0}, 1, true case "Umacr": // LATIN CAPITAL LETTER U WITH MACRON - return rune(0x016a), true + return {'\u016a', 0}, 1, true case "UnderBar": // LOW LINE - return rune(0x5f), true + return {'_', 0}, 1, true case "UnderBrace": // BOTTOM CURLY BRACKET - return rune(0x23df), true + return {'\u23df', 0}, 1, true case "UnderBracket": // BOTTOM SQUARE BRACKET - return rune(0x23b5), true + return {'\u23b5', 0}, 1, true case "UnderParenthesis": // BOTTOM PARENTHESIS - return rune(0x23dd), true + return {'\u23dd', 0}, 1, true case "Union": // N-ARY UNION - return rune(0x22c3), true + return {'\u22c3', 0}, 1, true case "UnionPlus": // MULTISET UNION - return rune(0x228e), true + return {'\u228e', 0}, 1, true case "Uogon": // LATIN CAPITAL LETTER U WITH OGONEK - return rune(0x0172), true + return {'\u0172', 0}, 1, true case "Uopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL U - return rune(0x01d54c), true + return {'\U0001d54c', 0}, 1, true case "UpArrow": // UPWARDS ARROW - return rune(0x2191), true + return {'\u2191', 0}, 1, true case "UpArrowBar": // UPWARDS ARROW TO BAR - return rune(0x2912), true + return {'\u2912', 0}, 1, true case "UpArrowDownArrow": // UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW - return rune(0x21c5), true + return {'\u21c5', 0}, 1, true case "UpDownArrow": // UP DOWN ARROW - return rune(0x2195), true + return {'\u2195', 0}, 1, true case "UpEquilibrium": // UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT - return rune(0x296e), true + return {'\u296e', 0}, 1, true case "UpTee": // UP TACK - return rune(0x22a5), true + return {'\u22a5', 0}, 1, true case "UpTeeArrow": // UPWARDS ARROW FROM BAR - return rune(0x21a5), true + return {'\u21a5', 0}, 1, true case "Uparrow": // UPWARDS DOUBLE ARROW - return rune(0x21d1), true + return {'\u21d1', 0}, 1, true case "Updownarrow": // UP DOWN DOUBLE ARROW - return rune(0x21d5), true + return {'\u21d5', 0}, 1, true case "UpperLeftArrow": // NORTH WEST ARROW - return rune(0x2196), true + return {'\u2196', 0}, 1, true case "UpperRightArrow": // NORTH EAST ARROW - return rune(0x2197), true + return {'\u2197', 0}, 1, true case "Upsi": // GREEK UPSILON WITH HOOK SYMBOL - return rune(0x03d2), true + return {'\u03d2', 0}, 1, true case "Upsilon": // GREEK CAPITAL LETTER UPSILON - return rune(0x03a5), true + return {'\u03a5', 0}, 1, true case "Uring": // LATIN CAPITAL LETTER U WITH RING ABOVE - return rune(0x016e), true + return {'\u016e', 0}, 1, true case "Uscr": // MATHEMATICAL SCRIPT CAPITAL U - return rune(0x01d4b0), true + return {'\U0001d4b0', 0}, 1, true case "Utilde": // LATIN CAPITAL LETTER U WITH TILDE - return rune(0x0168), true + return {'\u0168', 0}, 1, true case "Uuml": // LATIN CAPITAL LETTER U WITH DIAERESIS - return rune(0xdc), true + return {'Ü', 0}, 1, true } case 'V': switch name { case "VDash": // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE - return rune(0x22ab), true + return {'\u22ab', 0}, 1, true case "Vbar": // DOUBLE UP TACK - return rune(0x2aeb), true + return {'\u2aeb', 0}, 1, true case "Vcy": // CYRILLIC CAPITAL LETTER VE - return rune(0x0412), true + return {'\u0412', 0}, 1, true case "Vdash": // FORCES - return rune(0x22a9), true + return {'\u22a9', 0}, 1, true case "Vdashl": // LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL - return rune(0x2ae6), true + return {'\u2ae6', 0}, 1, true case "Vee": // N-ARY LOGICAL OR - return rune(0x22c1), true + return {'\u22c1', 0}, 1, true case "Verbar": // DOUBLE VERTICAL LINE - return rune(0x2016), true + return {'\u2016', 0}, 1, true case "Vert": // DOUBLE VERTICAL LINE - return rune(0x2016), true + return {'\u2016', 0}, 1, true case "VerticalBar": // DIVIDES - return rune(0x2223), true + return {'\u2223', 0}, 1, true case "VerticalLine": // VERTICAL LINE - return rune(0x7c), true + return {'|', 0}, 1, true case "VerticalSeparator": // LIGHT VERTICAL BAR - return rune(0x2758), true + return {'\u2758', 0}, 1, true case "VerticalTilde": // WREATH PRODUCT - return rune(0x2240), true + return {'\u2240', 0}, 1, true case "VeryThinSpace": // HAIR SPACE - return rune(0x200a), true + return {'\u200a', 0}, 1, true case "Vfr": // MATHEMATICAL FRAKTUR CAPITAL V - return rune(0x01d519), true + return {'\U0001d519', 0}, 1, true case "Vopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL V - return rune(0x01d54d), true + return {'\U0001d54d', 0}, 1, true case "Vscr": // MATHEMATICAL SCRIPT CAPITAL V - return rune(0x01d4b1), true + return {'\U0001d4b1', 0}, 1, true case "Vvdash": // TRIPLE VERTICAL BAR RIGHT TURNSTILE - return rune(0x22aa), true + return {'\u22aa', 0}, 1, true } case 'W': switch name { case "Wcirc": // LATIN CAPITAL LETTER W WITH CIRCUMFLEX - return rune(0x0174), true + return {'\u0174', 0}, 1, true case "Wedge": // N-ARY LOGICAL AND - return rune(0x22c0), true + return {'\u22c0', 0}, 1, true case "Wfr": // MATHEMATICAL FRAKTUR CAPITAL W - return rune(0x01d51a), true + return {'\U0001d51a', 0}, 1, true case "Wopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL W - return rune(0x01d54e), true + return {'\U0001d54e', 0}, 1, true case "Wscr": // MATHEMATICAL SCRIPT CAPITAL W - return rune(0x01d4b2), true + return {'\U0001d4b2', 0}, 1, true } case 'X': switch name { case "Xfr": // MATHEMATICAL FRAKTUR CAPITAL X - return rune(0x01d51b), true + return {'\U0001d51b', 0}, 1, true case "Xgr": // GREEK CAPITAL LETTER XI - return rune(0x039e), true + return {'\u039e', 0}, 1, true case "Xi": // GREEK CAPITAL LETTER XI - return rune(0x039e), true + return {'\u039e', 0}, 1, true case "Xopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL X - return rune(0x01d54f), true + return {'\U0001d54f', 0}, 1, true case "Xscr": // MATHEMATICAL SCRIPT CAPITAL X - return rune(0x01d4b3), true + return {'\U0001d4b3', 0}, 1, true } case 'Y': switch name { case "YAcy": // CYRILLIC CAPITAL LETTER YA - return rune(0x042f), true + return {'\u042f', 0}, 1, true case "YIcy": // CYRILLIC CAPITAL LETTER YI - return rune(0x0407), true + return {'\u0407', 0}, 1, true case "YUcy": // CYRILLIC CAPITAL LETTER YU - return rune(0x042e), true + return {'\u042e', 0}, 1, true case "Yacute": // LATIN CAPITAL LETTER Y WITH ACUTE - return rune(0xdd), true + return {'Ý', 0}, 1, true case "Ycirc": // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX - return rune(0x0176), true + return {'\u0176', 0}, 1, true case "Ycy": // CYRILLIC CAPITAL LETTER YERU - return rune(0x042b), true + return {'\u042b', 0}, 1, true case "Yfr": // MATHEMATICAL FRAKTUR CAPITAL Y - return rune(0x01d51c), true + return {'\U0001d51c', 0}, 1, true case "Yopf": // MATHEMATICAL DOUBLE-STRUCK CAPITAL Y - return rune(0x01d550), true + return {'\U0001d550', 0}, 1, true case "Yscr": // MATHEMATICAL SCRIPT CAPITAL Y - return rune(0x01d4b4), true + return {'\U0001d4b4', 0}, 1, true case "Yuml": // LATIN CAPITAL LETTER Y WITH DIAERESIS - return rune(0x0178), true + return {'\u0178', 0}, 1, true } case 'Z': switch name { case "ZHcy": // CYRILLIC CAPITAL LETTER ZHE - return rune(0x0416), true + return {'\u0416', 0}, 1, true case "Zacute": // LATIN CAPITAL LETTER Z WITH ACUTE - return rune(0x0179), true + return {'\u0179', 0}, 1, true case "Zcaron": // LATIN CAPITAL LETTER Z WITH CARON - return rune(0x017d), true + return {'\u017d', 0}, 1, true case "Zcy": // CYRILLIC CAPITAL LETTER ZE - return rune(0x0417), true + return {'\u0417', 0}, 1, true case "Zdot": // LATIN CAPITAL LETTER Z WITH DOT ABOVE - return rune(0x017b), true + return {'\u017b', 0}, 1, true case "ZeroWidthSpace": // ZERO WIDTH SPACE - return rune(0x200b), true + return {'\u200b', 0}, 1, true case "Zeta": // GREEK CAPITAL LETTER ZETA - return rune(0x0396), true + return {'\u0396', 0}, 1, true case "Zfr": // BLACK-LETTER CAPITAL Z - return rune(0x2128), true + return {'\u2128', 0}, 1, true case "Zgr": // GREEK CAPITAL LETTER ZETA - return rune(0x0396), true + return {'\u0396', 0}, 1, true case "Zopf": // DOUBLE-STRUCK CAPITAL Z - return rune(0x2124), true + return {'\u2124', 0}, 1, true case "Zscr": // MATHEMATICAL SCRIPT CAPITAL Z - return rune(0x01d4b5), true + return {'\U0001d4b5', 0}, 1, true } case 'a': switch name { case "aacgr": // GREEK SMALL LETTER ALPHA WITH TONOS - return rune(0x03ac), true + return {'\u03ac', 0}, 1, true case "aacute": // LATIN SMALL LETTER A WITH ACUTE - return rune(0xe1), true + return {'á', 0}, 1, true case "abreve": // LATIN SMALL LETTER A WITH BREVE - return rune(0x0103), true + return {'\u0103', 0}, 1, true case "ac": // INVERTED LAZY S - return rune(0x223e), true + return {'\u223e', 0}, 1, true case "acE": // INVERTED LAZY S with double underline - return rune(0x223e), true + return {'\u223e', '\u223e'}, 2, true case "acd": // SINE WAVE - return rune(0x223f), true + return {'\u223f', 0}, 1, true case "acirc": // LATIN SMALL LETTER A WITH CIRCUMFLEX - return rune(0xe2), true + return {'â', 0}, 1, true case "actuary": // COMBINING ANNUITY SYMBOL - return rune(0x20e7), true + return {'\u20e7', 0}, 1, true case "acute": // ACUTE ACCENT - return rune(0xb4), true + return {'´', 0}, 1, true case "acy": // CYRILLIC SMALL LETTER A - return rune(0x0430), true + return {'\u0430', 0}, 1, true case "aelig": // LATIN SMALL LETTER AE - return rune(0xe6), true + return {'æ', 0}, 1, true case "af": // FUNCTION APPLICATION - return rune(0x2061), true + return {'\u2061', 0}, 1, true case "afr": // MATHEMATICAL FRAKTUR SMALL A - return rune(0x01d51e), true + return {'\U0001d51e', 0}, 1, true case "agr": // GREEK SMALL LETTER ALPHA - return rune(0x03b1), true + return {'\u03b1', 0}, 1, true case "agrave": // LATIN SMALL LETTER A WITH GRAVE - return rune(0xe0), true + return {'à', 0}, 1, true case "alefsym": // ALEF SYMBOL - return rune(0x2135), true + return {'\u2135', 0}, 1, true case "aleph": // ALEF SYMBOL - return rune(0x2135), true + return {'\u2135', 0}, 1, true case "alpha": // GREEK SMALL LETTER ALPHA - return rune(0x03b1), true + return {'\u03b1', 0}, 1, true case "amacr": // LATIN SMALL LETTER A WITH MACRON - return rune(0x0101), true + return {'\u0101', 0}, 1, true case "amalg": // AMALGAMATION OR COPRODUCT - return rune(0x2a3f), true + return {'\u2a3f', 0}, 1, true case "amp": // AMPERSAND - return rune(0x26), true + return {'&', 0}, 1, true case "and": // LOGICAL AND - return rune(0x2227), true + return {'\u2227', 0}, 1, true case "andand": // TWO INTERSECTING LOGICAL AND - return rune(0x2a55), true + return {'\u2a55', 0}, 1, true case "andd": // LOGICAL AND WITH HORIZONTAL DASH - return rune(0x2a5c), true + return {'\u2a5c', 0}, 1, true case "andslope": // SLOPING LARGE AND - return rune(0x2a58), true + return {'\u2a58', 0}, 1, true case "andv": // LOGICAL AND WITH MIDDLE STEM - return rune(0x2a5a), true + return {'\u2a5a', 0}, 1, true case "ang": // ANGLE - return rune(0x2220), true + return {'\u2220', 0}, 1, true case "ang90": // RIGHT ANGLE - return rune(0x221f), true + return {'\u221f', 0}, 1, true case "angdnl": // TURNED ANGLE - return rune(0x29a2), true + return {'\u29a2', 0}, 1, true case "angdnr": // ACUTE ANGLE - return rune(0x299f), true + return {'\u299f', 0}, 1, true case "ange": // ANGLE WITH UNDERBAR - return rune(0x29a4), true + return {'\u29a4', 0}, 1, true case "angle": // ANGLE - return rune(0x2220), true + return {'\u2220', 0}, 1, true case "angles": // ANGLE WITH S INSIDE - return rune(0x299e), true + return {'\u299e', 0}, 1, true case "angmsd": // MEASURED ANGLE - return rune(0x2221), true + return {'\u2221', 0}, 1, true case "angmsdaa": // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT - return rune(0x29a8), true + return {'\u29a8', 0}, 1, true case "angmsdab": // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT - return rune(0x29a9), true + return {'\u29a9', 0}, 1, true case "angmsdac": // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT - return rune(0x29aa), true + return {'\u29aa', 0}, 1, true case "angmsdad": // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT - return rune(0x29ab), true + return {'\u29ab', 0}, 1, true case "angmsdae": // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP - return rune(0x29ac), true + return {'\u29ac', 0}, 1, true case "angmsdaf": // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP - return rune(0x29ad), true + return {'\u29ad', 0}, 1, true case "angmsdag": // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN - return rune(0x29ae), true + return {'\u29ae', 0}, 1, true case "angmsdah": // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN - return rune(0x29af), true + return {'\u29af', 0}, 1, true case "angrt": // RIGHT ANGLE - return rune(0x221f), true + return {'\u221f', 0}, 1, true case "angrtvb": // RIGHT ANGLE WITH ARC - return rune(0x22be), true + return {'\u22be', 0}, 1, true case "angrtvbd": // MEASURED RIGHT ANGLE WITH DOT - return rune(0x299d), true + return {'\u299d', 0}, 1, true case "angsph": // SPHERICAL ANGLE - return rune(0x2222), true + return {'\u2222', 0}, 1, true case "angst": // LATIN CAPITAL LETTER A WITH RING ABOVE - return rune(0xc5), true + return {'Å', 0}, 1, true case "angupl": // REVERSED ANGLE - return rune(0x29a3), true + return {'\u29a3', 0}, 1, true case "angzarr": // RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW - return rune(0x237c), true + return {'\u237c', 0}, 1, true case "aogon": // LATIN SMALL LETTER A WITH OGONEK - return rune(0x0105), true + return {'\u0105', 0}, 1, true case "aopf": // MATHEMATICAL DOUBLE-STRUCK SMALL A - return rune(0x01d552), true + return {'\U0001d552', 0}, 1, true case "ap": // ALMOST EQUAL TO - return rune(0x2248), true + return {'\u2248', 0}, 1, true case "apE": // APPROXIMATELY EQUAL OR EQUAL TO - return rune(0x2a70), true + return {'\u2a70', 0}, 1, true case "apacir": // ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT - return rune(0x2a6f), true + return {'\u2a6f', 0}, 1, true case "ape": // ALMOST EQUAL OR EQUAL TO - return rune(0x224a), true + return {'\u224a', 0}, 1, true case "apid": // TRIPLE TILDE - return rune(0x224b), true + return {'\u224b', 0}, 1, true case "apos": // APOSTROPHE - return rune(0x27), true + return {'\'', 0}, 1, true case "approx": // ALMOST EQUAL TO - return rune(0x2248), true + return {'\u2248', 0}, 1, true case "approxeq": // ALMOST EQUAL OR EQUAL TO - return rune(0x224a), true + return {'\u224a', 0}, 1, true case "aring": // LATIN SMALL LETTER A WITH RING ABOVE - return rune(0xe5), true + return {'å', 0}, 1, true case "arrllsr": // LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW - return rune(0x2943), true + return {'\u2943', 0}, 1, true case "arrlrsl": // RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW - return rune(0x2942), true + return {'\u2942', 0}, 1, true case "arrsrll": // SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW - return rune(0x2944), true + return {'\u2944', 0}, 1, true case "ascr": // MATHEMATICAL SCRIPT SMALL A - return rune(0x01d4b6), true + return {'\U0001d4b6', 0}, 1, true case "ast": // ASTERISK - return rune(0x2a), true + return {'*', 0}, 1, true case "astb": // SQUARED ASTERISK - return rune(0x29c6), true + return {'\u29c6', 0}, 1, true case "asymp": // ALMOST EQUAL TO - return rune(0x2248), true + return {'\u2248', 0}, 1, true case "asympeq": // EQUIVALENT TO - return rune(0x224d), true + return {'\u224d', 0}, 1, true case "atilde": // LATIN SMALL LETTER A WITH TILDE - return rune(0xe3), true + return {'ã', 0}, 1, true case "auml": // LATIN SMALL LETTER A WITH DIAERESIS - return rune(0xe4), true + return {'ä', 0}, 1, true case "awconint": // ANTICLOCKWISE CONTOUR INTEGRAL - return rune(0x2233), true + return {'\u2233', 0}, 1, true case "awint": // ANTICLOCKWISE INTEGRATION - return rune(0x2a11), true + return {'\u2a11', 0}, 1, true } case 'b': switch name { case "b.Delta": // MATHEMATICAL BOLD CAPITAL DELTA - return rune(0x01d6ab), true + return {'\U0001d6ab', 0}, 1, true case "b.Gamma": // MATHEMATICAL BOLD CAPITAL GAMMA - return rune(0x01d6aa), true + return {'\U0001d6aa', 0}, 1, true case "b.Gammad": // MATHEMATICAL BOLD CAPITAL DIGAMMA - return rune(0x01d7ca), true + return {'\U0001d7ca', 0}, 1, true case "b.Lambda": // MATHEMATICAL BOLD CAPITAL LAMDA - return rune(0x01d6b2), true + return {'\U0001d6b2', 0}, 1, true case "b.Omega": // MATHEMATICAL BOLD CAPITAL OMEGA - return rune(0x01d6c0), true + return {'\U0001d6c0', 0}, 1, true case "b.Phi": // MATHEMATICAL BOLD CAPITAL PHI - return rune(0x01d6bd), true + return {'\U0001d6bd', 0}, 1, true case "b.Pi": // MATHEMATICAL BOLD CAPITAL PI - return rune(0x01d6b7), true + return {'\U0001d6b7', 0}, 1, true case "b.Psi": // MATHEMATICAL BOLD CAPITAL PSI - return rune(0x01d6bf), true + return {'\U0001d6bf', 0}, 1, true case "b.Sigma": // MATHEMATICAL BOLD CAPITAL SIGMA - return rune(0x01d6ba), true + return {'\U0001d6ba', 0}, 1, true case "b.Theta": // MATHEMATICAL BOLD CAPITAL THETA - return rune(0x01d6af), true + return {'\U0001d6af', 0}, 1, true case "b.Upsi": // MATHEMATICAL BOLD CAPITAL UPSILON - return rune(0x01d6bc), true + return {'\U0001d6bc', 0}, 1, true case "b.Xi": // MATHEMATICAL BOLD CAPITAL XI - return rune(0x01d6b5), true + return {'\U0001d6b5', 0}, 1, true case "b.alpha": // MATHEMATICAL BOLD SMALL ALPHA - return rune(0x01d6c2), true + return {'\U0001d6c2', 0}, 1, true case "b.beta": // MATHEMATICAL BOLD SMALL BETA - return rune(0x01d6c3), true + return {'\U0001d6c3', 0}, 1, true case "b.chi": // MATHEMATICAL BOLD SMALL CHI - return rune(0x01d6d8), true + return {'\U0001d6d8', 0}, 1, true case "b.delta": // MATHEMATICAL BOLD SMALL DELTA - return rune(0x01d6c5), true + return {'\U0001d6c5', 0}, 1, true case "b.epsi": // MATHEMATICAL BOLD SMALL EPSILON - return rune(0x01d6c6), true + return {'\U0001d6c6', 0}, 1, true case "b.epsiv": // MATHEMATICAL BOLD EPSILON SYMBOL - return rune(0x01d6dc), true + return {'\U0001d6dc', 0}, 1, true case "b.eta": // MATHEMATICAL BOLD SMALL ETA - return rune(0x01d6c8), true + return {'\U0001d6c8', 0}, 1, true case "b.gamma": // MATHEMATICAL BOLD SMALL GAMMA - return rune(0x01d6c4), true + return {'\U0001d6c4', 0}, 1, true case "b.gammad": // MATHEMATICAL BOLD SMALL DIGAMMA - return rune(0x01d7cb), true + return {'\U0001d7cb', 0}, 1, true case "b.iota": // MATHEMATICAL BOLD SMALL IOTA - return rune(0x01d6ca), true + return {'\U0001d6ca', 0}, 1, true case "b.kappa": // MATHEMATICAL BOLD SMALL KAPPA - return rune(0x01d6cb), true + return {'\U0001d6cb', 0}, 1, true case "b.kappav": // MATHEMATICAL BOLD KAPPA SYMBOL - return rune(0x01d6de), true + return {'\U0001d6de', 0}, 1, true case "b.lambda": // MATHEMATICAL BOLD SMALL LAMDA - return rune(0x01d6cc), true + return {'\U0001d6cc', 0}, 1, true case "b.mu": // MATHEMATICAL BOLD SMALL MU - return rune(0x01d6cd), true + return {'\U0001d6cd', 0}, 1, true case "b.nu": // MATHEMATICAL BOLD SMALL NU - return rune(0x01d6ce), true + return {'\U0001d6ce', 0}, 1, true case "b.omega": // MATHEMATICAL BOLD SMALL OMEGA - return rune(0x01d6da), true + return {'\U0001d6da', 0}, 1, true case "b.phi": // MATHEMATICAL BOLD SMALL PHI - return rune(0x01d6d7), true + return {'\U0001d6d7', 0}, 1, true case "b.phiv": // MATHEMATICAL BOLD PHI SYMBOL - return rune(0x01d6df), true + return {'\U0001d6df', 0}, 1, true case "b.pi": // MATHEMATICAL BOLD SMALL PI - return rune(0x01d6d1), true + return {'\U0001d6d1', 0}, 1, true case "b.piv": // MATHEMATICAL BOLD PI SYMBOL - return rune(0x01d6e1), true + return {'\U0001d6e1', 0}, 1, true case "b.psi": // MATHEMATICAL BOLD SMALL PSI - return rune(0x01d6d9), true + return {'\U0001d6d9', 0}, 1, true case "b.rho": // MATHEMATICAL BOLD SMALL RHO - return rune(0x01d6d2), true + return {'\U0001d6d2', 0}, 1, true case "b.rhov": // MATHEMATICAL BOLD RHO SYMBOL - return rune(0x01d6e0), true + return {'\U0001d6e0', 0}, 1, true case "b.sigma": // MATHEMATICAL BOLD SMALL SIGMA - return rune(0x01d6d4), true + return {'\U0001d6d4', 0}, 1, true case "b.sigmav": // MATHEMATICAL BOLD SMALL FINAL SIGMA - return rune(0x01d6d3), true + return {'\U0001d6d3', 0}, 1, true case "b.tau": // MATHEMATICAL BOLD SMALL TAU - return rune(0x01d6d5), true + return {'\U0001d6d5', 0}, 1, true case "b.thetas": // MATHEMATICAL BOLD SMALL THETA - return rune(0x01d6c9), true + return {'\U0001d6c9', 0}, 1, true case "b.thetav": // MATHEMATICAL BOLD THETA SYMBOL - return rune(0x01d6dd), true + return {'\U0001d6dd', 0}, 1, true case "b.upsi": // MATHEMATICAL BOLD SMALL UPSILON - return rune(0x01d6d6), true + return {'\U0001d6d6', 0}, 1, true case "b.xi": // MATHEMATICAL BOLD SMALL XI - return rune(0x01d6cf), true + return {'\U0001d6cf', 0}, 1, true case "b.zeta": // MATHEMATICAL BOLD SMALL ZETA - return rune(0x01d6c7), true + return {'\U0001d6c7', 0}, 1, true case "bNot": // REVERSED DOUBLE STROKE NOT SIGN - return rune(0x2aed), true + return {'\u2aed', 0}, 1, true case "backcong": // ALL EQUAL TO - return rune(0x224c), true + return {'\u224c', 0}, 1, true case "backepsilon": // GREEK REVERSED LUNATE EPSILON SYMBOL - return rune(0x03f6), true + return {'\u03f6', 0}, 1, true case "backprime": // REVERSED PRIME - return rune(0x2035), true + return {'\u2035', 0}, 1, true case "backsim": // REVERSED TILDE - return rune(0x223d), true + return {'\u223d', 0}, 1, true case "backsimeq": // REVERSED TILDE EQUALS - return rune(0x22cd), true + return {'\u22cd', 0}, 1, true case "barV": // DOUBLE DOWN TACK - return rune(0x2aea), true + return {'\u2aea', 0}, 1, true case "barvee": // NOR - return rune(0x22bd), true + return {'\u22bd', 0}, 1, true case "barwed": // PROJECTIVE - return rune(0x2305), true + return {'\u2305', 0}, 1, true case "barwedge": // PROJECTIVE - return rune(0x2305), true + return {'\u2305', 0}, 1, true case "bbrk": // BOTTOM SQUARE BRACKET - return rune(0x23b5), true + return {'\u23b5', 0}, 1, true case "bbrktbrk": // BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET - return rune(0x23b6), true + return {'\u23b6', 0}, 1, true case "bcong": // ALL EQUAL TO - return rune(0x224c), true + return {'\u224c', 0}, 1, true case "bcy": // CYRILLIC SMALL LETTER BE - return rune(0x0431), true + return {'\u0431', 0}, 1, true case "bdlhar": // DOWNWARDS HARPOON WITH BARB LEFT FROM BAR - return rune(0x2961), true + return {'\u2961', 0}, 1, true case "bdquo": // DOUBLE LOW-9 QUOTATION MARK - return rune(0x201e), true + return {'\u201e', 0}, 1, true case "bdrhar": // DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR - return rune(0x295d), true + return {'\u295d', 0}, 1, true case "becaus": // BECAUSE - return rune(0x2235), true + return {'\u2235', 0}, 1, true case "because": // BECAUSE - return rune(0x2235), true + return {'\u2235', 0}, 1, true case "bemptyv": // REVERSED EMPTY SET - return rune(0x29b0), true + return {'\u29b0', 0}, 1, true case "bepsi": // GREEK REVERSED LUNATE EPSILON SYMBOL - return rune(0x03f6), true + return {'\u03f6', 0}, 1, true case "bernou": // SCRIPT CAPITAL B - return rune(0x212c), true + return {'\u212c', 0}, 1, true case "beta": // GREEK SMALL LETTER BETA - return rune(0x03b2), true + return {'\u03b2', 0}, 1, true case "beth": // BET SYMBOL - return rune(0x2136), true + return {'\u2136', 0}, 1, true case "between": // BETWEEN - return rune(0x226c), true + return {'\u226c', 0}, 1, true case "bfr": // MATHEMATICAL FRAKTUR SMALL B - return rune(0x01d51f), true + return {'\U0001d51f', 0}, 1, true case "bgr": // GREEK SMALL LETTER BETA - return rune(0x03b2), true + return {'\u03b2', 0}, 1, true case "bigcap": // N-ARY INTERSECTION - return rune(0x22c2), true + return {'\u22c2', 0}, 1, true case "bigcirc": // LARGE CIRCLE - return rune(0x25ef), true + return {'\u25ef', 0}, 1, true case "bigcup": // N-ARY UNION - return rune(0x22c3), true + return {'\u22c3', 0}, 1, true case "bigodot": // N-ARY CIRCLED DOT OPERATOR - return rune(0x2a00), true + return {'\u2a00', 0}, 1, true case "bigoplus": // N-ARY CIRCLED PLUS OPERATOR - return rune(0x2a01), true + return {'\u2a01', 0}, 1, true case "bigotimes": // N-ARY CIRCLED TIMES OPERATOR - return rune(0x2a02), true + return {'\u2a02', 0}, 1, true case "bigsqcup": // N-ARY SQUARE UNION OPERATOR - return rune(0x2a06), true + return {'\u2a06', 0}, 1, true case "bigstar": // BLACK STAR - return rune(0x2605), true + return {'\u2605', 0}, 1, true case "bigtriangledown": // WHITE DOWN-POINTING TRIANGLE - return rune(0x25bd), true + return {'\u25bd', 0}, 1, true case "bigtriangleup": // WHITE UP-POINTING TRIANGLE - return rune(0x25b3), true + return {'\u25b3', 0}, 1, true case "biguplus": // N-ARY UNION OPERATOR WITH PLUS - return rune(0x2a04), true + return {'\u2a04', 0}, 1, true case "bigvee": // N-ARY LOGICAL OR - return rune(0x22c1), true + return {'\u22c1', 0}, 1, true case "bigwedge": // N-ARY LOGICAL AND - return rune(0x22c0), true + return {'\u22c0', 0}, 1, true case "bkarow": // RIGHTWARDS DOUBLE DASH ARROW - return rune(0x290d), true + return {'\u290d', 0}, 1, true case "blacklozenge": // BLACK LOZENGE - return rune(0x29eb), true + return {'\u29eb', 0}, 1, true case "blacksquare": // BLACK SMALL SQUARE - return rune(0x25aa), true + return {'\u25aa', 0}, 1, true case "blacktriangle": // BLACK UP-POINTING SMALL TRIANGLE - return rune(0x25b4), true + return {'\u25b4', 0}, 1, true case "blacktriangledown": // BLACK DOWN-POINTING SMALL TRIANGLE - return rune(0x25be), true + return {'\u25be', 0}, 1, true case "blacktriangleleft": // BLACK LEFT-POINTING SMALL TRIANGLE - return rune(0x25c2), true + return {'\u25c2', 0}, 1, true case "blacktriangleright": // BLACK RIGHT-POINTING SMALL TRIANGLE - return rune(0x25b8), true + return {'\u25b8', 0}, 1, true case "blank": // BLANK SYMBOL - return rune(0x2422), true + return {'\u2422', 0}, 1, true case "bldhar": // LEFTWARDS HARPOON WITH BARB DOWN FROM BAR - return rune(0x295e), true + return {'\u295e', 0}, 1, true case "blk12": // MEDIUM SHADE - return rune(0x2592), true + return {'\u2592', 0}, 1, true case "blk14": // LIGHT SHADE - return rune(0x2591), true + return {'\u2591', 0}, 1, true case "blk34": // DARK SHADE - return rune(0x2593), true + return {'\u2593', 0}, 1, true case "block": // FULL BLOCK - return rune(0x2588), true + return {'\u2588', 0}, 1, true case "bluhar": // LEFTWARDS HARPOON WITH BARB UP FROM BAR - return rune(0x295a), true + return {'\u295a', 0}, 1, true case "bne": // EQUALS SIGN with reverse slash - return rune(0x3d), true + return {'=', '='}, 2, true case "bnequiv": // IDENTICAL TO with reverse slash - return rune(0x2261), true + return {'\u2261', '\u2261'}, 2, true case "bnot": // REVERSED NOT SIGN - return rune(0x2310), true + return {'\u2310', 0}, 1, true case "bopf": // MATHEMATICAL DOUBLE-STRUCK SMALL B - return rune(0x01d553), true + return {'\U0001d553', 0}, 1, true case "bot": // UP TACK - return rune(0x22a5), true + return {'\u22a5', 0}, 1, true case "bottom": // UP TACK - return rune(0x22a5), true + return {'\u22a5', 0}, 1, true case "bowtie": // BOWTIE - return rune(0x22c8), true + return {'\u22c8', 0}, 1, true case "boxDL": // BOX DRAWINGS DOUBLE DOWN AND LEFT - return rune(0x2557), true + return {'\u2557', 0}, 1, true case "boxDR": // BOX DRAWINGS DOUBLE DOWN AND RIGHT - return rune(0x2554), true + return {'\u2554', 0}, 1, true case "boxDl": // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - return rune(0x2556), true + return {'\u2556', 0}, 1, true case "boxDr": // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - return rune(0x2553), true + return {'\u2553', 0}, 1, true case "boxH": // BOX DRAWINGS DOUBLE HORIZONTAL - return rune(0x2550), true + return {'\u2550', 0}, 1, true case "boxHD": // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - return rune(0x2566), true + return {'\u2566', 0}, 1, true case "boxHU": // BOX DRAWINGS DOUBLE UP AND HORIZONTAL - return rune(0x2569), true + return {'\u2569', 0}, 1, true case "boxHd": // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - return rune(0x2564), true + return {'\u2564', 0}, 1, true case "boxHu": // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - return rune(0x2567), true + return {'\u2567', 0}, 1, true case "boxUL": // BOX DRAWINGS DOUBLE UP AND LEFT - return rune(0x255d), true + return {'\u255d', 0}, 1, true case "boxUR": // BOX DRAWINGS DOUBLE UP AND RIGHT - return rune(0x255a), true + return {'\u255a', 0}, 1, true case "boxUl": // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - return rune(0x255c), true + return {'\u255c', 0}, 1, true case "boxUr": // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - return rune(0x2559), true + return {'\u2559', 0}, 1, true case "boxV": // BOX DRAWINGS DOUBLE VERTICAL - return rune(0x2551), true + return {'\u2551', 0}, 1, true case "boxVH": // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - return rune(0x256c), true + return {'\u256c', 0}, 1, true case "boxVL": // BOX DRAWINGS DOUBLE VERTICAL AND LEFT - return rune(0x2563), true + return {'\u2563', 0}, 1, true case "boxVR": // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - return rune(0x2560), true + return {'\u2560', 0}, 1, true case "boxVh": // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - return rune(0x256b), true + return {'\u256b', 0}, 1, true case "boxVl": // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - return rune(0x2562), true + return {'\u2562', 0}, 1, true case "boxVr": // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - return rune(0x255f), true + return {'\u255f', 0}, 1, true case "boxbox": // TWO JOINED SQUARES - return rune(0x29c9), true + return {'\u29c9', 0}, 1, true case "boxdL": // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - return rune(0x2555), true + return {'\u2555', 0}, 1, true case "boxdR": // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - return rune(0x2552), true + return {'\u2552', 0}, 1, true case "boxdl": // BOX DRAWINGS LIGHT DOWN AND LEFT - return rune(0x2510), true + return {'\u2510', 0}, 1, true case "boxdr": // BOX DRAWINGS LIGHT DOWN AND RIGHT - return rune(0x250c), true + return {'\u250c', 0}, 1, true case "boxh": // BOX DRAWINGS LIGHT HORIZONTAL - return rune(0x2500), true + return {'\u2500', 0}, 1, true case "boxhD": // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - return rune(0x2565), true + return {'\u2565', 0}, 1, true case "boxhU": // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - return rune(0x2568), true + return {'\u2568', 0}, 1, true case "boxhd": // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - return rune(0x252c), true + return {'\u252c', 0}, 1, true case "boxhu": // BOX DRAWINGS LIGHT UP AND HORIZONTAL - return rune(0x2534), true + return {'\u2534', 0}, 1, true case "boxminus": // SQUARED MINUS - return rune(0x229f), true + return {'\u229f', 0}, 1, true case "boxplus": // SQUARED PLUS - return rune(0x229e), true + return {'\u229e', 0}, 1, true case "boxtimes": // SQUARED TIMES - return rune(0x22a0), true + return {'\u22a0', 0}, 1, true case "boxuL": // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - return rune(0x255b), true + return {'\u255b', 0}, 1, true case "boxuR": // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - return rune(0x2558), true + return {'\u2558', 0}, 1, true case "boxul": // BOX DRAWINGS LIGHT UP AND LEFT - return rune(0x2518), true + return {'\u2518', 0}, 1, true case "boxur": // BOX DRAWINGS LIGHT UP AND RIGHT - return rune(0x2514), true + return {'\u2514', 0}, 1, true case "boxv": // BOX DRAWINGS LIGHT VERTICAL - return rune(0x2502), true + return {'\u2502', 0}, 1, true case "boxvH": // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - return rune(0x256a), true + return {'\u256a', 0}, 1, true case "boxvL": // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - return rune(0x2561), true + return {'\u2561', 0}, 1, true case "boxvR": // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - return rune(0x255e), true + return {'\u255e', 0}, 1, true case "boxvh": // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - return rune(0x253c), true + return {'\u253c', 0}, 1, true case "boxvl": // BOX DRAWINGS LIGHT VERTICAL AND LEFT - return rune(0x2524), true + return {'\u2524', 0}, 1, true case "boxvr": // BOX DRAWINGS LIGHT VERTICAL AND RIGHT - return rune(0x251c), true + return {'\u251c', 0}, 1, true case "bprime": // REVERSED PRIME - return rune(0x2035), true + return {'\u2035', 0}, 1, true case "brdhar": // RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR - return rune(0x295f), true + return {'\u295f', 0}, 1, true case "breve": // BREVE - return rune(0x02d8), true + return {'\u02d8', 0}, 1, true case "bruhar": // RIGHTWARDS HARPOON WITH BARB UP FROM BAR - return rune(0x295b), true + return {'\u295b', 0}, 1, true case "brvbar": // BROKEN BAR - return rune(0xa6), true + return {'¦', 0}, 1, true case "bscr": // MATHEMATICAL SCRIPT SMALL B - return rune(0x01d4b7), true + return {'\U0001d4b7', 0}, 1, true case "bsemi": // REVERSED SEMICOLON - return rune(0x204f), true + return {'\u204f', 0}, 1, true case "bsim": // REVERSED TILDE - return rune(0x223d), true + return {'\u223d', 0}, 1, true case "bsime": // REVERSED TILDE EQUALS - return rune(0x22cd), true + return {'\u22cd', 0}, 1, true case "bsol": // REVERSE SOLIDUS - return rune(0x5c), true + return {'\\', 0}, 1, true case "bsolb": // SQUARED FALLING DIAGONAL SLASH - return rune(0x29c5), true + return {'\u29c5', 0}, 1, true case "bsolhsub": // REVERSE SOLIDUS PRECEDING SUBSET - return rune(0x27c8), true + return {'\u27c8', 0}, 1, true case "btimes": // SEMIDIRECT PRODUCT WITH BOTTOM CLOSED - return rune(0x2a32), true + return {'\u2a32', 0}, 1, true case "bulhar": // UPWARDS HARPOON WITH BARB LEFT FROM BAR - return rune(0x2960), true + return {'\u2960', 0}, 1, true case "bull": // BULLET - return rune(0x2022), true + return {'\u2022', 0}, 1, true case "bullet": // BULLET - return rune(0x2022), true + return {'\u2022', 0}, 1, true case "bump": // GEOMETRICALLY EQUIVALENT TO - return rune(0x224e), true + return {'\u224e', 0}, 1, true case "bumpE": // EQUALS SIGN WITH BUMPY ABOVE - return rune(0x2aae), true + return {'\u2aae', 0}, 1, true case "bumpe": // DIFFERENCE BETWEEN - return rune(0x224f), true + return {'\u224f', 0}, 1, true case "bumpeq": // DIFFERENCE BETWEEN - return rune(0x224f), true + return {'\u224f', 0}, 1, true case "burhar": // UPWARDS HARPOON WITH BARB RIGHT FROM BAR - return rune(0x295c), true + return {'\u295c', 0}, 1, true } case 'c': switch name { case "cacute": // LATIN SMALL LETTER C WITH ACUTE - return rune(0x0107), true + return {'\u0107', 0}, 1, true case "cap": // INTERSECTION - return rune(0x2229), true + return {'\u2229', 0}, 1, true case "capand": // INTERSECTION WITH LOGICAL AND - return rune(0x2a44), true + return {'\u2a44', 0}, 1, true case "capbrcup": // INTERSECTION ABOVE BAR ABOVE UNION - return rune(0x2a49), true + return {'\u2a49', 0}, 1, true case "capcap": // INTERSECTION BESIDE AND JOINED WITH INTERSECTION - return rune(0x2a4b), true + return {'\u2a4b', 0}, 1, true case "capcup": // INTERSECTION ABOVE UNION - return rune(0x2a47), true + return {'\u2a47', 0}, 1, true case "capdot": // INTERSECTION WITH DOT - return rune(0x2a40), true + return {'\u2a40', 0}, 1, true case "capint": // INTEGRAL WITH INTERSECTION - return rune(0x2a19), true + return {'\u2a19', 0}, 1, true case "caps": // INTERSECTION with serifs - return rune(0x2229), true + return {'\u2229', '\u2229'}, 2, true case "caret": // CARET INSERTION POINT - return rune(0x2041), true + return {'\u2041', 0}, 1, true case "caron": // CARON - return rune(0x02c7), true + return {'\u02c7', 0}, 1, true case "ccaps": // CLOSED INTERSECTION WITH SERIFS - return rune(0x2a4d), true + return {'\u2a4d', 0}, 1, true case "ccaron": // LATIN SMALL LETTER C WITH CARON - return rune(0x010d), true + return {'\u010d', 0}, 1, true case "ccedil": // LATIN SMALL LETTER C WITH CEDILLA - return rune(0xe7), true + return {'ç', 0}, 1, true case "ccirc": // LATIN SMALL LETTER C WITH CIRCUMFLEX - return rune(0x0109), true + return {'\u0109', 0}, 1, true case "ccups": // CLOSED UNION WITH SERIFS - return rune(0x2a4c), true + return {'\u2a4c', 0}, 1, true case "ccupssm": // CLOSED UNION WITH SERIFS AND SMASH PRODUCT - return rune(0x2a50), true + return {'\u2a50', 0}, 1, true case "cdot": // LATIN SMALL LETTER C WITH DOT ABOVE - return rune(0x010b), true + return {'\u010b', 0}, 1, true case "cedil": // CEDILLA - return rune(0xb8), true + return {'¸', 0}, 1, true case "cemptyv": // EMPTY SET WITH SMALL CIRCLE ABOVE - return rune(0x29b2), true + return {'\u29b2', 0}, 1, true case "cent": // CENT SIGN - return rune(0xa2), true + return {'¢', 0}, 1, true case "centerdot": // MIDDLE DOT - return rune(0xb7), true + return {'·', 0}, 1, true case "cfr": // MATHEMATICAL FRAKTUR SMALL C - return rune(0x01d520), true + return {'\U0001d520', 0}, 1, true case "chcy": // CYRILLIC SMALL LETTER CHE - return rune(0x0447), true + return {'\u0447', 0}, 1, true case "check": // CHECK MARK - return rune(0x2713), true + return {'\u2713', 0}, 1, true case "checkmark": // CHECK MARK - return rune(0x2713), true + return {'\u2713', 0}, 1, true case "chi": // GREEK SMALL LETTER CHI - return rune(0x03c7), true + return {'\u03c7', 0}, 1, true case "cir": // WHITE CIRCLE - return rune(0x25cb), true + return {'\u25cb', 0}, 1, true case "cirE": // CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT - return rune(0x29c3), true + return {'\u29c3', 0}, 1, true case "cirb": // SQUARED SMALL CIRCLE - return rune(0x29c7), true + return {'\u29c7', 0}, 1, true case "circ": // MODIFIER LETTER CIRCUMFLEX ACCENT - return rune(0x02c6), true + return {'\u02c6', 0}, 1, true case "circeq": // RING EQUAL TO - return rune(0x2257), true + return {'\u2257', 0}, 1, true case "circlearrowleft": // ANTICLOCKWISE OPEN CIRCLE ARROW - return rune(0x21ba), true + return {'\u21ba', 0}, 1, true case "circlearrowright": // CLOCKWISE OPEN CIRCLE ARROW - return rune(0x21bb), true + return {'\u21bb', 0}, 1, true case "circledR": // REGISTERED SIGN - return rune(0xae), true + return {'®', 0}, 1, true case "circledS": // CIRCLED LATIN CAPITAL LETTER S - return rune(0x24c8), true + return {'\u24c8', 0}, 1, true case "circledast": // CIRCLED ASTERISK OPERATOR - return rune(0x229b), true + return {'\u229b', 0}, 1, true case "circledcirc": // CIRCLED RING OPERATOR - return rune(0x229a), true + return {'\u229a', 0}, 1, true case "circleddash": // CIRCLED DASH - return rune(0x229d), true + return {'\u229d', 0}, 1, true case "cirdarr": // WHITE CIRCLE WITH DOWN ARROW - return rune(0x29ec), true + return {'\u29ec', 0}, 1, true case "cire": // RING EQUAL TO - return rune(0x2257), true + return {'\u2257', 0}, 1, true case "cirerr": // ERROR-BARRED WHITE CIRCLE - return rune(0x29f2), true + return {'\u29f2', 0}, 1, true case "cirfdarr": // BLACK CIRCLE WITH DOWN ARROW - return rune(0x29ed), true + return {'\u29ed', 0}, 1, true case "cirferr": // ERROR-BARRED BLACK CIRCLE - return rune(0x29f3), true + return {'\u29f3', 0}, 1, true case "cirfnint": // CIRCULATION FUNCTION - return rune(0x2a10), true + return {'\u2a10', 0}, 1, true case "cirmid": // VERTICAL LINE WITH CIRCLE ABOVE - return rune(0x2aef), true + return {'\u2aef', 0}, 1, true case "cirscir": // CIRCLE WITH SMALL CIRCLE TO THE RIGHT - return rune(0x29c2), true + return {'\u29c2', 0}, 1, true case "closur": // CLOSE UP - return rune(0x2050), true + return {'\u2050', 0}, 1, true case "clubs": // BLACK CLUB SUIT - return rune(0x2663), true + return {'\u2663', 0}, 1, true case "clubsuit": // BLACK CLUB SUIT - return rune(0x2663), true + return {'\u2663', 0}, 1, true case "colon": // COLON - return rune(0x3a), true + return {':', 0}, 1, true case "colone": // COLON EQUALS - return rune(0x2254), true + return {'\u2254', 0}, 1, true case "coloneq": // COLON EQUALS - return rune(0x2254), true + return {'\u2254', 0}, 1, true case "comma": // COMMA - return rune(0x2c), true + return {',', 0}, 1, true case "commat": // COMMERCIAL AT - return rune(0x40), true + return {'@', 0}, 1, true case "comp": // COMPLEMENT - return rune(0x2201), true + return {'\u2201', 0}, 1, true case "compfn": // RING OPERATOR - return rune(0x2218), true + return {'\u2218', 0}, 1, true case "complement": // COMPLEMENT - return rune(0x2201), true + return {'\u2201', 0}, 1, true case "complexes": // DOUBLE-STRUCK CAPITAL C - return rune(0x2102), true + return {'\u2102', 0}, 1, true case "cong": // APPROXIMATELY EQUAL TO - return rune(0x2245), true + return {'\u2245', 0}, 1, true case "congdot": // CONGRUENT WITH DOT ABOVE - return rune(0x2a6d), true + return {'\u2a6d', 0}, 1, true case "conint": // CONTOUR INTEGRAL - return rune(0x222e), true + return {'\u222e', 0}, 1, true case "copf": // MATHEMATICAL DOUBLE-STRUCK SMALL C - return rune(0x01d554), true + return {'\U0001d554', 0}, 1, true case "coprod": // N-ARY COPRODUCT - return rune(0x2210), true + return {'\u2210', 0}, 1, true case "copy": // COPYRIGHT SIGN - return rune(0xa9), true + return {'©', 0}, 1, true case "copysr": // SOUND RECORDING COPYRIGHT - return rune(0x2117), true + return {'\u2117', 0}, 1, true case "crarr": // DOWNWARDS ARROW WITH CORNER LEFTWARDS - return rune(0x21b5), true + return {'\u21b5', 0}, 1, true case "cross": // BALLOT X - return rune(0x2717), true + return {'\u2717', 0}, 1, true case "cscr": // MATHEMATICAL SCRIPT SMALL C - return rune(0x01d4b8), true + return {'\U0001d4b8', 0}, 1, true case "csub": // CLOSED SUBSET - return rune(0x2acf), true + return {'\u2acf', 0}, 1, true case "csube": // CLOSED SUBSET OR EQUAL TO - return rune(0x2ad1), true + return {'\u2ad1', 0}, 1, true case "csup": // CLOSED SUPERSET - return rune(0x2ad0), true + return {'\u2ad0', 0}, 1, true case "csupe": // CLOSED SUPERSET OR EQUAL TO - return rune(0x2ad2), true + return {'\u2ad2', 0}, 1, true case "ctdot": // MIDLINE HORIZONTAL ELLIPSIS - return rune(0x22ef), true + return {'\u22ef', 0}, 1, true case "cudarrl": // RIGHT-SIDE ARC CLOCKWISE ARROW - return rune(0x2938), true + return {'\u2938', 0}, 1, true case "cudarrr": // ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS - return rune(0x2935), true + return {'\u2935', 0}, 1, true case "cuepr": // EQUAL TO OR PRECEDES - return rune(0x22de), true + return {'\u22de', 0}, 1, true case "cuesc": // EQUAL TO OR SUCCEEDS - return rune(0x22df), true + return {'\u22df', 0}, 1, true case "cularr": // ANTICLOCKWISE TOP SEMICIRCLE ARROW - return rune(0x21b6), true + return {'\u21b6', 0}, 1, true case "cularrp": // TOP ARC ANTICLOCKWISE ARROW WITH PLUS - return rune(0x293d), true + return {'\u293d', 0}, 1, true case "cup": // UNION - return rune(0x222a), true + return {'\u222a', 0}, 1, true case "cupbrcap": // UNION ABOVE BAR ABOVE INTERSECTION - return rune(0x2a48), true + return {'\u2a48', 0}, 1, true case "cupcap": // UNION ABOVE INTERSECTION - return rune(0x2a46), true + return {'\u2a46', 0}, 1, true case "cupcup": // UNION BESIDE AND JOINED WITH UNION - return rune(0x2a4a), true + return {'\u2a4a', 0}, 1, true case "cupdot": // MULTISET MULTIPLICATION - return rune(0x228d), true + return {'\u228d', 0}, 1, true case "cupint": // INTEGRAL WITH UNION - return rune(0x2a1a), true + return {'\u2a1a', 0}, 1, true case "cupor": // UNION WITH LOGICAL OR - return rune(0x2a45), true + return {'\u2a45', 0}, 1, true case "cupre": // PRECEDES OR EQUAL TO - return rune(0x227c), true + return {'\u227c', 0}, 1, true case "cups": // UNION with serifs - return rune(0x222a), true + return {'\u222a', '\u222a'}, 2, true case "curarr": // CLOCKWISE TOP SEMICIRCLE ARROW - return rune(0x21b7), true + return {'\u21b7', 0}, 1, true case "curarrm": // TOP ARC CLOCKWISE ARROW WITH MINUS - return rune(0x293c), true + return {'\u293c', 0}, 1, true case "curlyeqprec": // EQUAL TO OR PRECEDES - return rune(0x22de), true + return {'\u22de', 0}, 1, true case "curlyeqsucc": // EQUAL TO OR SUCCEEDS - return rune(0x22df), true + return {'\u22df', 0}, 1, true case "curlyvee": // CURLY LOGICAL OR - return rune(0x22ce), true + return {'\u22ce', 0}, 1, true case "curlywedge": // CURLY LOGICAL AND - return rune(0x22cf), true + return {'\u22cf', 0}, 1, true case "curren": // CURRENCY SIGN - return rune(0xa4), true + return {'¤', 0}, 1, true case "curvearrowleft": // ANTICLOCKWISE TOP SEMICIRCLE ARROW - return rune(0x21b6), true + return {'\u21b6', 0}, 1, true case "curvearrowright": // CLOCKWISE TOP SEMICIRCLE ARROW - return rune(0x21b7), true + return {'\u21b7', 0}, 1, true case "cuvee": // CURLY LOGICAL OR - return rune(0x22ce), true + return {'\u22ce', 0}, 1, true case "cuwed": // CURLY LOGICAL AND - return rune(0x22cf), true + return {'\u22cf', 0}, 1, true case "cwconint": // CLOCKWISE CONTOUR INTEGRAL - return rune(0x2232), true + return {'\u2232', 0}, 1, true case "cwint": // CLOCKWISE INTEGRAL - return rune(0x2231), true + return {'\u2231', 0}, 1, true case "cylcty": // CYLINDRICITY - return rune(0x232d), true + return {'\u232d', 0}, 1, true } case 'd': switch name { case "dAarr": // DOWNWARDS TRIPLE ARROW - return rune(0x290b), true + return {'\u290b', 0}, 1, true case "dArr": // DOWNWARDS DOUBLE ARROW - return rune(0x21d3), true + return {'\u21d3', 0}, 1, true case "dHar": // DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT - return rune(0x2965), true + return {'\u2965', 0}, 1, true case "dagger": // DAGGER - return rune(0x2020), true + return {'\u2020', 0}, 1, true case "dalembrt": // SQUARE WITH CONTOURED OUTLINE - return rune(0x29e0), true + return {'\u29e0', 0}, 1, true case "daleth": // DALET SYMBOL - return rune(0x2138), true + return {'\u2138', 0}, 1, true case "darr": // DOWNWARDS ARROW - return rune(0x2193), true + return {'\u2193', 0}, 1, true case "darr2": // DOWNWARDS PAIRED ARROWS - return rune(0x21ca), true + return {'\u21ca', 0}, 1, true case "darrb": // DOWNWARDS ARROW TO BAR - return rune(0x2913), true + return {'\u2913', 0}, 1, true case "darrln": // DOWNWARDS ARROW WITH HORIZONTAL STROKE - return rune(0x2908), true + return {'\u2908', 0}, 1, true case "dash": // HYPHEN - return rune(0x2010), true + return {'\u2010', 0}, 1, true case "dashV": // DOUBLE VERTICAL BAR LEFT TURNSTILE - return rune(0x2ae3), true + return {'\u2ae3', 0}, 1, true case "dashv": // LEFT TACK - return rune(0x22a3), true + return {'\u22a3', 0}, 1, true case "dbkarow": // RIGHTWARDS TRIPLE DASH ARROW - return rune(0x290f), true + return {'\u290f', 0}, 1, true case "dblac": // DOUBLE ACUTE ACCENT - return rune(0x02dd), true + return {'\u02dd', 0}, 1, true case "dcaron": // LATIN SMALL LETTER D WITH CARON - return rune(0x010f), true + return {'\u010f', 0}, 1, true case "dcy": // CYRILLIC SMALL LETTER DE - return rune(0x0434), true + return {'\u0434', 0}, 1, true case "dd": // DOUBLE-STRUCK ITALIC SMALL D - return rune(0x2146), true + return {'\u2146', 0}, 1, true case "ddagger": // DOUBLE DAGGER - return rune(0x2021), true + return {'\u2021', 0}, 1, true case "ddarr": // DOWNWARDS PAIRED ARROWS - return rune(0x21ca), true + return {'\u21ca', 0}, 1, true case "ddotseq": // EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW - return rune(0x2a77), true + return {'\u2a77', 0}, 1, true case "deg": // DEGREE SIGN - return rune(0xb0), true + return {'°', 0}, 1, true case "delta": // GREEK SMALL LETTER DELTA - return rune(0x03b4), true + return {'\u03b4', 0}, 1, true case "demptyv": // EMPTY SET WITH OVERBAR - return rune(0x29b1), true + return {'\u29b1', 0}, 1, true case "dfisht": // DOWN FISH TAIL - return rune(0x297f), true + return {'\u297f', 0}, 1, true case "dfr": // MATHEMATICAL FRAKTUR SMALL D - return rune(0x01d521), true + return {'\U0001d521', 0}, 1, true case "dgr": // GREEK SMALL LETTER DELTA - return rune(0x03b4), true + return {'\u03b4', 0}, 1, true case "dharl": // DOWNWARDS HARPOON WITH BARB LEFTWARDS - return rune(0x21c3), true + return {'\u21c3', 0}, 1, true case "dharr": // DOWNWARDS HARPOON WITH BARB RIGHTWARDS - return rune(0x21c2), true + return {'\u21c2', 0}, 1, true case "diam": // DIAMOND OPERATOR - return rune(0x22c4), true + return {'\u22c4', 0}, 1, true case "diamdarr": // BLACK DIAMOND WITH DOWN ARROW - return rune(0x29ea), true + return {'\u29ea', 0}, 1, true case "diamerr": // ERROR-BARRED WHITE DIAMOND - return rune(0x29f0), true + return {'\u29f0', 0}, 1, true case "diamerrf": // ERROR-BARRED BLACK DIAMOND - return rune(0x29f1), true + return {'\u29f1', 0}, 1, true case "diamond": // DIAMOND OPERATOR - return rune(0x22c4), true + return {'\u22c4', 0}, 1, true case "diamondsuit": // BLACK DIAMOND SUIT - return rune(0x2666), true + return {'\u2666', 0}, 1, true case "diams": // BLACK DIAMOND SUIT - return rune(0x2666), true + return {'\u2666', 0}, 1, true case "die": // DIAERESIS - return rune(0xa8), true + return {'¨', 0}, 1, true case "digamma": // GREEK SMALL LETTER DIGAMMA - return rune(0x03dd), true + return {'\u03dd', 0}, 1, true case "disin": // ELEMENT OF WITH LONG HORIZONTAL STROKE - return rune(0x22f2), true + return {'\u22f2', 0}, 1, true case "div": // DIVISION SIGN - return rune(0xf7), true + return {'÷', 0}, 1, true case "divide": // DIVISION SIGN - return rune(0xf7), true + return {'÷', 0}, 1, true case "divideontimes": // DIVISION TIMES - return rune(0x22c7), true + return {'\u22c7', 0}, 1, true case "divonx": // DIVISION TIMES - return rune(0x22c7), true + return {'\u22c7', 0}, 1, true case "djcy": // CYRILLIC SMALL LETTER DJE - return rune(0x0452), true + return {'\u0452', 0}, 1, true case "dlarr": // SOUTH WEST ARROW - return rune(0x2199), true + return {'\u2199', 0}, 1, true case "dlcorn": // BOTTOM LEFT CORNER - return rune(0x231e), true + return {'\u231e', 0}, 1, true case "dlcrop": // BOTTOM LEFT CROP - return rune(0x230d), true + return {'\u230d', 0}, 1, true case "dlharb": // DOWNWARDS HARPOON WITH BARB LEFT TO BAR - return rune(0x2959), true + return {'\u2959', 0}, 1, true case "dollar": // DOLLAR SIGN - return rune(0x24), true + return {'$', 0}, 1, true case "dopf": // MATHEMATICAL DOUBLE-STRUCK SMALL D - return rune(0x01d555), true + return {'\U0001d555', 0}, 1, true case "dot": // DOT ABOVE - return rune(0x02d9), true + return {'\u02d9', 0}, 1, true case "doteq": // APPROACHES THE LIMIT - return rune(0x2250), true + return {'\u2250', 0}, 1, true case "doteqdot": // GEOMETRICALLY EQUAL TO - return rune(0x2251), true + return {'\u2251', 0}, 1, true case "dotminus": // DOT MINUS - return rune(0x2238), true + return {'\u2238', 0}, 1, true case "dotplus": // DOT PLUS - return rune(0x2214), true + return {'\u2214', 0}, 1, true case "dotsquare": // SQUARED DOT OPERATOR - return rune(0x22a1), true + return {'\u22a1', 0}, 1, true case "doublebarwedge": // PERSPECTIVE - return rune(0x2306), true + return {'\u2306', 0}, 1, true case "downarrow": // DOWNWARDS ARROW - return rune(0x2193), true + return {'\u2193', 0}, 1, true case "downdownarrows": // DOWNWARDS PAIRED ARROWS - return rune(0x21ca), true + return {'\u21ca', 0}, 1, true case "downharpoonleft": // DOWNWARDS HARPOON WITH BARB LEFTWARDS - return rune(0x21c3), true + return {'\u21c3', 0}, 1, true case "downharpoonright": // DOWNWARDS HARPOON WITH BARB RIGHTWARDS - return rune(0x21c2), true + return {'\u21c2', 0}, 1, true case "drarr": // SOUTH EAST ARROW - return rune(0x2198), true + return {'\u2198', 0}, 1, true case "drbkarow": // RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW - return rune(0x2910), true + return {'\u2910', 0}, 1, true case "drcorn": // BOTTOM RIGHT CORNER - return rune(0x231f), true + return {'\u231f', 0}, 1, true case "drcrop": // BOTTOM RIGHT CROP - return rune(0x230c), true + return {'\u230c', 0}, 1, true case "drharb": // DOWNWARDS HARPOON WITH BARB RIGHT TO BAR - return rune(0x2955), true + return {'\u2955', 0}, 1, true case "dscr": // MATHEMATICAL SCRIPT SMALL D - return rune(0x01d4b9), true + return {'\U0001d4b9', 0}, 1, true case "dscy": // CYRILLIC SMALL LETTER DZE - return rune(0x0455), true + return {'\u0455', 0}, 1, true case "dsol": // SOLIDUS WITH OVERBAR - return rune(0x29f6), true + return {'\u29f6', 0}, 1, true case "dstrok": // LATIN SMALL LETTER D WITH STROKE - return rune(0x0111), true + return {'\u0111', 0}, 1, true case "dtdot": // DOWN RIGHT DIAGONAL ELLIPSIS - return rune(0x22f1), true + return {'\u22f1', 0}, 1, true case "dtri": // WHITE DOWN-POINTING SMALL TRIANGLE - return rune(0x25bf), true + return {'\u25bf', 0}, 1, true case "dtrif": // BLACK DOWN-POINTING SMALL TRIANGLE - return rune(0x25be), true + return {'\u25be', 0}, 1, true case "dtrilf": // DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK - return rune(0x29e8), true + return {'\u29e8', 0}, 1, true case "dtrirf": // DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK - return rune(0x29e9), true + return {'\u29e9', 0}, 1, true case "duarr": // DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW - return rune(0x21f5), true + return {'\u21f5', 0}, 1, true case "duhar": // DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT - return rune(0x296f), true + return {'\u296f', 0}, 1, true case "dumap": // DOUBLE-ENDED MULTIMAP - return rune(0x29df), true + return {'\u29df', 0}, 1, true case "dwangle": // OBLIQUE ANGLE OPENING UP - return rune(0x29a6), true + return {'\u29a6', 0}, 1, true case "dzcy": // CYRILLIC SMALL LETTER DZHE - return rune(0x045f), true + return {'\u045f', 0}, 1, true case "dzigrarr": // LONG RIGHTWARDS SQUIGGLE ARROW - return rune(0x27ff), true + return {'\u27ff', 0}, 1, true } case 'e': switch name { case "eDDot": // EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW - return rune(0x2a77), true + return {'\u2a77', 0}, 1, true case "eDot": // GEOMETRICALLY EQUAL TO - return rune(0x2251), true + return {'\u2251', 0}, 1, true case "eacgr": // GREEK SMALL LETTER EPSILON WITH TONOS - return rune(0x03ad), true + return {'\u03ad', 0}, 1, true case "eacute": // LATIN SMALL LETTER E WITH ACUTE - return rune(0xe9), true + return {'é', 0}, 1, true case "easter": // EQUALS WITH ASTERISK - return rune(0x2a6e), true + return {'\u2a6e', 0}, 1, true case "ecaron": // LATIN SMALL LETTER E WITH CARON - return rune(0x011b), true + return {'\u011b', 0}, 1, true case "ecir": // RING IN EQUAL TO - return rune(0x2256), true + return {'\u2256', 0}, 1, true case "ecirc": // LATIN SMALL LETTER E WITH CIRCUMFLEX - return rune(0xea), true + return {'ê', 0}, 1, true case "ecolon": // EQUALS COLON - return rune(0x2255), true + return {'\u2255', 0}, 1, true case "ecy": // CYRILLIC SMALL LETTER E - return rune(0x044d), true + return {'\u044d', 0}, 1, true case "edot": // LATIN SMALL LETTER E WITH DOT ABOVE - return rune(0x0117), true + return {'\u0117', 0}, 1, true case "ee": // DOUBLE-STRUCK ITALIC SMALL E - return rune(0x2147), true + return {'\u2147', 0}, 1, true case "eeacgr": // GREEK SMALL LETTER ETA WITH TONOS - return rune(0x03ae), true + return {'\u03ae', 0}, 1, true case "eegr": // GREEK SMALL LETTER ETA - return rune(0x03b7), true + return {'\u03b7', 0}, 1, true case "efDot": // APPROXIMATELY EQUAL TO OR THE IMAGE OF - return rune(0x2252), true + return {'\u2252', 0}, 1, true case "efr": // MATHEMATICAL FRAKTUR SMALL E - return rune(0x01d522), true + return {'\U0001d522', 0}, 1, true case "eg": // DOUBLE-LINE EQUAL TO OR GREATER-THAN - return rune(0x2a9a), true + return {'\u2a9a', 0}, 1, true case "egr": // GREEK SMALL LETTER EPSILON - return rune(0x03b5), true + return {'\u03b5', 0}, 1, true case "egrave": // LATIN SMALL LETTER E WITH GRAVE - return rune(0xe8), true + return {'è', 0}, 1, true case "egs": // SLANTED EQUAL TO OR GREATER-THAN - return rune(0x2a96), true + return {'\u2a96', 0}, 1, true case "egsdot": // SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE - return rune(0x2a98), true + return {'\u2a98', 0}, 1, true case "el": // DOUBLE-LINE EQUAL TO OR LESS-THAN - return rune(0x2a99), true + return {'\u2a99', 0}, 1, true case "elinters": // ELECTRICAL INTERSECTION - return rune(0x23e7), true + return {'\u23e7', 0}, 1, true case "ell": // SCRIPT SMALL L - return rune(0x2113), true + return {'\u2113', 0}, 1, true case "els": // SLANTED EQUAL TO OR LESS-THAN - return rune(0x2a95), true + return {'\u2a95', 0}, 1, true case "elsdot": // SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE - return rune(0x2a97), true + return {'\u2a97', 0}, 1, true case "emacr": // LATIN SMALL LETTER E WITH MACRON - return rune(0x0113), true + return {'\u0113', 0}, 1, true case "empty": // EMPTY SET - return rune(0x2205), true + return {'\u2205', 0}, 1, true case "emptyset": // EMPTY SET - return rune(0x2205), true + return {'\u2205', 0}, 1, true case "emptyv": // EMPTY SET - return rune(0x2205), true + return {'\u2205', 0}, 1, true case "emsp": // EM SPACE - return rune(0x2003), true + return {'\u2003', 0}, 1, true case "emsp13": // THREE-PER-EM SPACE - return rune(0x2004), true + return {'\u2004', 0}, 1, true case "emsp14": // FOUR-PER-EM SPACE - return rune(0x2005), true + return {'\u2005', 0}, 1, true case "eng": // LATIN SMALL LETTER ENG - return rune(0x014b), true + return {'\u014b', 0}, 1, true case "ensp": // EN SPACE - return rune(0x2002), true + return {'\u2002', 0}, 1, true case "eogon": // LATIN SMALL LETTER E WITH OGONEK - return rune(0x0119), true + return {'\u0119', 0}, 1, true case "eopf": // MATHEMATICAL DOUBLE-STRUCK SMALL E - return rune(0x01d556), true + return {'\U0001d556', 0}, 1, true case "epar": // EQUAL AND PARALLEL TO - return rune(0x22d5), true + return {'\u22d5', 0}, 1, true case "eparsl": // EQUALS SIGN AND SLANTED PARALLEL - return rune(0x29e3), true + return {'\u29e3', 0}, 1, true case "eplus": // EQUALS SIGN ABOVE PLUS SIGN - return rune(0x2a71), true + return {'\u2a71', 0}, 1, true case "epsi": // GREEK SMALL LETTER EPSILON - return rune(0x03b5), true + return {'\u03b5', 0}, 1, true case "epsilon": // GREEK SMALL LETTER EPSILON - return rune(0x03b5), true + return {'\u03b5', 0}, 1, true case "epsis": // GREEK LUNATE EPSILON SYMBOL - return rune(0x03f5), true + return {'\u03f5', 0}, 1, true case "epsiv": // GREEK LUNATE EPSILON SYMBOL - return rune(0x03f5), true + return {'\u03f5', 0}, 1, true case "eqcirc": // RING IN EQUAL TO - return rune(0x2256), true + return {'\u2256', 0}, 1, true case "eqcolon": // EQUALS COLON - return rune(0x2255), true + return {'\u2255', 0}, 1, true case "eqeq": // TWO CONSECUTIVE EQUALS SIGNS - return rune(0x2a75), true + return {'\u2a75', 0}, 1, true case "eqsim": // MINUS TILDE - return rune(0x2242), true + return {'\u2242', 0}, 1, true case "eqslantgtr": // SLANTED EQUAL TO OR GREATER-THAN - return rune(0x2a96), true + return {'\u2a96', 0}, 1, true case "eqslantless": // SLANTED EQUAL TO OR LESS-THAN - return rune(0x2a95), true + return {'\u2a95', 0}, 1, true case "equals": // EQUALS SIGN - return rune(0x3d), true + return {'=', 0}, 1, true case "equest": // QUESTIONED EQUAL TO - return rune(0x225f), true + return {'\u225f', 0}, 1, true case "equiv": // IDENTICAL TO - return rune(0x2261), true + return {'\u2261', 0}, 1, true case "equivDD": // EQUIVALENT WITH FOUR DOTS ABOVE - return rune(0x2a78), true + return {'\u2a78', 0}, 1, true case "eqvparsl": // IDENTICAL TO AND SLANTED PARALLEL - return rune(0x29e5), true + return {'\u29e5', 0}, 1, true case "erDot": // IMAGE OF OR APPROXIMATELY EQUAL TO - return rune(0x2253), true + return {'\u2253', 0}, 1, true case "erarr": // EQUALS SIGN ABOVE RIGHTWARDS ARROW - return rune(0x2971), true + return {'\u2971', 0}, 1, true case "escr": // SCRIPT SMALL E - return rune(0x212f), true + return {'\u212f', 0}, 1, true case "esdot": // APPROACHES THE LIMIT - return rune(0x2250), true + return {'\u2250', 0}, 1, true case "esim": // MINUS TILDE - return rune(0x2242), true + return {'\u2242', 0}, 1, true case "eta": // GREEK SMALL LETTER ETA - return rune(0x03b7), true + return {'\u03b7', 0}, 1, true case "eth": // LATIN SMALL LETTER ETH - return rune(0xf0), true + return {'ð', 0}, 1, true case "euml": // LATIN SMALL LETTER E WITH DIAERESIS - return rune(0xeb), true + return {'ë', 0}, 1, true case "euro": // EURO SIGN - return rune(0x20ac), true + return {'\u20ac', 0}, 1, true case "excl": // EXCLAMATION MARK - return rune(0x21), true + return {'!', 0}, 1, true case "exist": // THERE EXISTS - return rune(0x2203), true + return {'\u2203', 0}, 1, true case "expectation": // SCRIPT CAPITAL E - return rune(0x2130), true + return {'\u2130', 0}, 1, true case "exponentiale": // DOUBLE-STRUCK ITALIC SMALL E - return rune(0x2147), true + return {'\u2147', 0}, 1, true } case 'f': switch name { case "fallingdotseq": // APPROXIMATELY EQUAL TO OR THE IMAGE OF - return rune(0x2252), true + return {'\u2252', 0}, 1, true case "fbowtie": // BLACK BOWTIE - return rune(0x29d3), true + return {'\u29d3', 0}, 1, true case "fcy": // CYRILLIC SMALL LETTER EF - return rune(0x0444), true + return {'\u0444', 0}, 1, true case "fdiag": // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT - return rune(0x2572), true + return {'\u2572', 0}, 1, true case "fdiordi": // FALLING DIAGONAL CROSSING RISING DIAGONAL - return rune(0x292c), true + return {'\u292c', 0}, 1, true case "fdonearr": // FALLING DIAGONAL CROSSING NORTH EAST ARROW - return rune(0x292f), true + return {'\u292f', 0}, 1, true case "female": // FEMALE SIGN - return rune(0x2640), true + return {'\u2640', 0}, 1, true case "ffilig": // LATIN SMALL LIGATURE FFI - return rune(0xfb03), true + return {'\ufb03', 0}, 1, true case "fflig": // LATIN SMALL LIGATURE FF - return rune(0xfb00), true + return {'\ufb00', 0}, 1, true case "ffllig": // LATIN SMALL LIGATURE FFL - return rune(0xfb04), true + return {'\ufb04', 0}, 1, true case "ffr": // MATHEMATICAL FRAKTUR SMALL F - return rune(0x01d523), true + return {'\U0001d523', 0}, 1, true case "fhrglass": // BLACK HOURGLASS - return rune(0x29d7), true + return {'\u29d7', 0}, 1, true case "filig": // LATIN SMALL LIGATURE FI - return rune(0xfb01), true + return {'\ufb01', 0}, 1, true case "fjlig": // fj ligature - return rune(0x66), true + return {'f', 'f'}, 2, true case "flat": // MUSIC FLAT SIGN - return rune(0x266d), true + return {'\u266d', 0}, 1, true case "fllig": // LATIN SMALL LIGATURE FL - return rune(0xfb02), true + return {'\ufb02', 0}, 1, true case "fltns": // WHITE PARALLELOGRAM - return rune(0x25b1), true + return {'\u25b1', 0}, 1, true case "fnof": // LATIN SMALL LETTER F WITH HOOK - return rune(0x0192), true + return {'\u0192', 0}, 1, true case "fopf": // MATHEMATICAL DOUBLE-STRUCK SMALL F - return rune(0x01d557), true + return {'\U0001d557', 0}, 1, true case "forall": // FOR ALL - return rune(0x2200), true + return {'\u2200', 0}, 1, true case "fork": // PITCHFORK - return rune(0x22d4), true + return {'\u22d4', 0}, 1, true case "forkv": // ELEMENT OF OPENING DOWNWARDS - return rune(0x2ad9), true + return {'\u2ad9', 0}, 1, true case "fpartint": // FINITE PART INTEGRAL - return rune(0x2a0d), true + return {'\u2a0d', 0}, 1, true case "frac12": // VULGAR FRACTION ONE HALF - return rune(0xbd), true + return {'½', 0}, 1, true case "frac13": // VULGAR FRACTION ONE THIRD - return rune(0x2153), true + return {'\u2153', 0}, 1, true case "frac14": // VULGAR FRACTION ONE QUARTER - return rune(0xbc), true + return {'¼', 0}, 1, true case "frac15": // VULGAR FRACTION ONE FIFTH - return rune(0x2155), true + return {'\u2155', 0}, 1, true case "frac16": // VULGAR FRACTION ONE SIXTH - return rune(0x2159), true + return {'\u2159', 0}, 1, true case "frac18": // VULGAR FRACTION ONE EIGHTH - return rune(0x215b), true + return {'\u215b', 0}, 1, true case "frac23": // VULGAR FRACTION TWO THIRDS - return rune(0x2154), true + return {'\u2154', 0}, 1, true case "frac25": // VULGAR FRACTION TWO FIFTHS - return rune(0x2156), true + return {'\u2156', 0}, 1, true case "frac34": // VULGAR FRACTION THREE QUARTERS - return rune(0xbe), true + return {'¾', 0}, 1, true case "frac35": // VULGAR FRACTION THREE FIFTHS - return rune(0x2157), true + return {'\u2157', 0}, 1, true case "frac38": // VULGAR FRACTION THREE EIGHTHS - return rune(0x215c), true + return {'\u215c', 0}, 1, true case "frac45": // VULGAR FRACTION FOUR FIFTHS - return rune(0x2158), true + return {'\u2158', 0}, 1, true case "frac56": // VULGAR FRACTION FIVE SIXTHS - return rune(0x215a), true + return {'\u215a', 0}, 1, true case "frac58": // VULGAR FRACTION FIVE EIGHTHS - return rune(0x215d), true + return {'\u215d', 0}, 1, true case "frac78": // VULGAR FRACTION SEVEN EIGHTHS - return rune(0x215e), true + return {'\u215e', 0}, 1, true case "frasl": // FRACTION SLASH - return rune(0x2044), true + return {'\u2044', 0}, 1, true case "frown": // FROWN - return rune(0x2322), true + return {'\u2322', 0}, 1, true case "fscr": // MATHEMATICAL SCRIPT SMALL F - return rune(0x01d4bb), true + return {'\U0001d4bb', 0}, 1, true } case 'g': switch name { case "gE": // GREATER-THAN OVER EQUAL TO - return rune(0x2267), true + return {'\u2267', 0}, 1, true case "gEl": // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN - return rune(0x2a8c), true + return {'\u2a8c', 0}, 1, true case "gacute": // LATIN SMALL LETTER G WITH ACUTE - return rune(0x01f5), true + return {'\u01f5', 0}, 1, true case "gamma": // GREEK SMALL LETTER GAMMA - return rune(0x03b3), true + return {'\u03b3', 0}, 1, true case "gammad": // GREEK SMALL LETTER DIGAMMA - return rune(0x03dd), true + return {'\u03dd', 0}, 1, true case "gap": // GREATER-THAN OR APPROXIMATE - return rune(0x2a86), true + return {'\u2a86', 0}, 1, true case "gbreve": // LATIN SMALL LETTER G WITH BREVE - return rune(0x011f), true + return {'\u011f', 0}, 1, true case "gcedil": // LATIN SMALL LETTER G WITH CEDILLA - return rune(0x0123), true + return {'\u0123', 0}, 1, true case "gcirc": // LATIN SMALL LETTER G WITH CIRCUMFLEX - return rune(0x011d), true + return {'\u011d', 0}, 1, true case "gcy": // CYRILLIC SMALL LETTER GHE - return rune(0x0433), true + return {'\u0433', 0}, 1, true case "gdot": // LATIN SMALL LETTER G WITH DOT ABOVE - return rune(0x0121), true + return {'\u0121', 0}, 1, true case "ge": // GREATER-THAN OR EQUAL TO - return rune(0x2265), true + return {'\u2265', 0}, 1, true case "gel": // GREATER-THAN EQUAL TO OR LESS-THAN - return rune(0x22db), true + return {'\u22db', 0}, 1, true case "geq": // GREATER-THAN OR EQUAL TO - return rune(0x2265), true + return {'\u2265', 0}, 1, true case "geqq": // GREATER-THAN OVER EQUAL TO - return rune(0x2267), true + return {'\u2267', 0}, 1, true case "geqslant": // GREATER-THAN OR SLANTED EQUAL TO - return rune(0x2a7e), true + return {'\u2a7e', 0}, 1, true case "ges": // GREATER-THAN OR SLANTED EQUAL TO - return rune(0x2a7e), true + return {'\u2a7e', 0}, 1, true case "gescc": // GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL - return rune(0x2aa9), true + return {'\u2aa9', 0}, 1, true case "gesdot": // GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE - return rune(0x2a80), true + return {'\u2a80', 0}, 1, true case "gesdoto": // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE - return rune(0x2a82), true + return {'\u2a82', 0}, 1, true case "gesdotol": // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT - return rune(0x2a84), true + return {'\u2a84', 0}, 1, true case "gesl": // GREATER-THAN slanted EQUAL TO OR LESS-THAN - return rune(0x22db), true + return {'\u22db', '\u22db'}, 2, true case "gesles": // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL - return rune(0x2a94), true + return {'\u2a94', 0}, 1, true case "gfr": // MATHEMATICAL FRAKTUR SMALL G - return rune(0x01d524), true + return {'\U0001d524', 0}, 1, true case "gg": // MUCH GREATER-THAN - return rune(0x226b), true + return {'\u226b', 0}, 1, true case "ggg": // VERY MUCH GREATER-THAN - return rune(0x22d9), true + return {'\u22d9', 0}, 1, true case "ggr": // GREEK SMALL LETTER GAMMA - return rune(0x03b3), true + return {'\u03b3', 0}, 1, true case "gimel": // GIMEL SYMBOL - return rune(0x2137), true + return {'\u2137', 0}, 1, true case "gjcy": // CYRILLIC SMALL LETTER GJE - return rune(0x0453), true + return {'\u0453', 0}, 1, true case "gl": // GREATER-THAN OR LESS-THAN - return rune(0x2277), true + return {'\u2277', 0}, 1, true case "glE": // GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL - return rune(0x2a92), true + return {'\u2a92', 0}, 1, true case "gla": // GREATER-THAN BESIDE LESS-THAN - return rune(0x2aa5), true + return {'\u2aa5', 0}, 1, true case "glj": // GREATER-THAN OVERLAPPING LESS-THAN - return rune(0x2aa4), true + return {'\u2aa4', 0}, 1, true case "gnE": // GREATER-THAN BUT NOT EQUAL TO - return rune(0x2269), true + return {'\u2269', 0}, 1, true case "gnap": // GREATER-THAN AND NOT APPROXIMATE - return rune(0x2a8a), true + return {'\u2a8a', 0}, 1, true case "gnapprox": // GREATER-THAN AND NOT APPROXIMATE - return rune(0x2a8a), true + return {'\u2a8a', 0}, 1, true case "gne": // GREATER-THAN AND SINGLE-LINE NOT EQUAL TO - return rune(0x2a88), true + return {'\u2a88', 0}, 1, true case "gneq": // GREATER-THAN AND SINGLE-LINE NOT EQUAL TO - return rune(0x2a88), true + return {'\u2a88', 0}, 1, true case "gneqq": // GREATER-THAN BUT NOT EQUAL TO - return rune(0x2269), true + return {'\u2269', 0}, 1, true case "gnsim": // GREATER-THAN BUT NOT EQUIVALENT TO - return rune(0x22e7), true + return {'\u22e7', 0}, 1, true case "gopf": // MATHEMATICAL DOUBLE-STRUCK SMALL G - return rune(0x01d558), true + return {'\U0001d558', 0}, 1, true case "grave": // GRAVE ACCENT - return rune(0x60), true + return {'`', 0}, 1, true case "gscr": // SCRIPT SMALL G - return rune(0x210a), true + return {'\u210a', 0}, 1, true case "gsdot": // GREATER-THAN WITH DOT - return rune(0x22d7), true + return {'\u22d7', 0}, 1, true case "gsim": // GREATER-THAN OR EQUIVALENT TO - return rune(0x2273), true + return {'\u2273', 0}, 1, true case "gsime": // GREATER-THAN ABOVE SIMILAR OR EQUAL - return rune(0x2a8e), true + return {'\u2a8e', 0}, 1, true case "gsiml": // GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN - return rune(0x2a90), true + return {'\u2a90', 0}, 1, true case "gt": // GREATER-THAN SIGN - return rune(0x3e), true + return {'>', 0}, 1, true case "gtcc": // GREATER-THAN CLOSED BY CURVE - return rune(0x2aa7), true + return {'\u2aa7', 0}, 1, true case "gtcir": // GREATER-THAN WITH CIRCLE INSIDE - return rune(0x2a7a), true + return {'\u2a7a', 0}, 1, true case "gtdot": // GREATER-THAN WITH DOT - return rune(0x22d7), true + return {'\u22d7', 0}, 1, true case "gtlPar": // DOUBLE LEFT ARC GREATER-THAN BRACKET - return rune(0x2995), true + return {'\u2995', 0}, 1, true case "gtquest": // GREATER-THAN WITH QUESTION MARK ABOVE - return rune(0x2a7c), true + return {'\u2a7c', 0}, 1, true case "gtrapprox": // GREATER-THAN OR APPROXIMATE - return rune(0x2a86), true + return {'\u2a86', 0}, 1, true case "gtrarr": // GREATER-THAN ABOVE RIGHTWARDS ARROW - return rune(0x2978), true + return {'\u2978', 0}, 1, true case "gtrdot": // GREATER-THAN WITH DOT - return rune(0x22d7), true + return {'\u22d7', 0}, 1, true case "gtreqless": // GREATER-THAN EQUAL TO OR LESS-THAN - return rune(0x22db), true + return {'\u22db', 0}, 1, true case "gtreqqless": // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN - return rune(0x2a8c), true + return {'\u2a8c', 0}, 1, true case "gtrless": // GREATER-THAN OR LESS-THAN - return rune(0x2277), true + return {'\u2277', 0}, 1, true case "gtrpar": // SPHERICAL ANGLE OPENING LEFT - return rune(0x29a0), true + return {'\u29a0', 0}, 1, true case "gtrsim": // GREATER-THAN OR EQUIVALENT TO - return rune(0x2273), true + return {'\u2273', 0}, 1, true case "gvertneqq": // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke - return rune(0x2269), true + return {'\u2269', '\u2269'}, 2, true case "gvnE": // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke - return rune(0x2269), true + return {'\u2269', '\u2269'}, 2, true } case 'h': switch name { case "hArr": // LEFT RIGHT DOUBLE ARROW - return rune(0x21d4), true + return {'\u21d4', 0}, 1, true case "hairsp": // HAIR SPACE - return rune(0x200a), true + return {'\u200a', 0}, 1, true case "half": // VULGAR FRACTION ONE HALF - return rune(0xbd), true + return {'½', 0}, 1, true case "hamilt": // SCRIPT CAPITAL H - return rune(0x210b), true + return {'\u210b', 0}, 1, true case "hardcy": // CYRILLIC SMALL LETTER HARD SIGN - return rune(0x044a), true + return {'\u044a', 0}, 1, true case "harr": // LEFT RIGHT ARROW - return rune(0x2194), true + return {'\u2194', 0}, 1, true case "harrcir": // LEFT RIGHT ARROW THROUGH SMALL CIRCLE - return rune(0x2948), true + return {'\u2948', 0}, 1, true case "harrw": // LEFT RIGHT WAVE ARROW - return rune(0x21ad), true + return {'\u21ad', 0}, 1, true case "hbar": // PLANCK CONSTANT OVER TWO PI - return rune(0x210f), true + return {'\u210f', 0}, 1, true case "hcirc": // LATIN SMALL LETTER H WITH CIRCUMFLEX - return rune(0x0125), true + return {'\u0125', 0}, 1, true case "hearts": // BLACK HEART SUIT - return rune(0x2665), true + return {'\u2665', 0}, 1, true case "heartsuit": // BLACK HEART SUIT - return rune(0x2665), true + return {'\u2665', 0}, 1, true case "hellip": // HORIZONTAL ELLIPSIS - return rune(0x2026), true + return {'\u2026', 0}, 1, true case "hercon": // HERMITIAN CONJUGATE MATRIX - return rune(0x22b9), true + return {'\u22b9', 0}, 1, true case "hfr": // MATHEMATICAL FRAKTUR SMALL H - return rune(0x01d525), true + return {'\U0001d525', 0}, 1, true case "hksearow": // SOUTH EAST ARROW WITH HOOK - return rune(0x2925), true + return {'\u2925', 0}, 1, true case "hkswarow": // SOUTH WEST ARROW WITH HOOK - return rune(0x2926), true + return {'\u2926', 0}, 1, true case "hoarr": // LEFT RIGHT OPEN-HEADED ARROW - return rune(0x21ff), true + return {'\u21ff', 0}, 1, true case "homtht": // HOMOTHETIC - return rune(0x223b), true + return {'\u223b', 0}, 1, true case "hookleftarrow": // LEFTWARDS ARROW WITH HOOK - return rune(0x21a9), true + return {'\u21a9', 0}, 1, true case "hookrightarrow": // RIGHTWARDS ARROW WITH HOOK - return rune(0x21aa), true + return {'\u21aa', 0}, 1, true case "hopf": // MATHEMATICAL DOUBLE-STRUCK SMALL H - return rune(0x01d559), true + return {'\U0001d559', 0}, 1, true case "horbar": // HORIZONTAL BAR - return rune(0x2015), true + return {'\u2015', 0}, 1, true case "hrglass": // WHITE HOURGLASS - return rune(0x29d6), true + return {'\u29d6', 0}, 1, true case "hscr": // MATHEMATICAL SCRIPT SMALL H - return rune(0x01d4bd), true + return {'\U0001d4bd', 0}, 1, true case "hslash": // PLANCK CONSTANT OVER TWO PI - return rune(0x210f), true + return {'\u210f', 0}, 1, true case "hstrok": // LATIN SMALL LETTER H WITH STROKE - return rune(0x0127), true + return {'\u0127', 0}, 1, true case "htimes": // VECTOR OR CROSS PRODUCT - return rune(0x2a2f), true + return {'\u2a2f', 0}, 1, true case "hybull": // HYPHEN BULLET - return rune(0x2043), true + return {'\u2043', 0}, 1, true case "hyphen": // HYPHEN - return rune(0x2010), true + return {'\u2010', 0}, 1, true } case 'i': switch name { case "iacgr": // GREEK SMALL LETTER IOTA WITH TONOS - return rune(0x03af), true + return {'\u03af', 0}, 1, true case "iacute": // LATIN SMALL LETTER I WITH ACUTE - return rune(0xed), true + return {'í', 0}, 1, true case "ic": // INVISIBLE SEPARATOR - return rune(0x2063), true + return {'\u2063', 0}, 1, true case "icirc": // LATIN SMALL LETTER I WITH CIRCUMFLEX - return rune(0xee), true + return {'î', 0}, 1, true case "icy": // CYRILLIC SMALL LETTER I - return rune(0x0438), true + return {'\u0438', 0}, 1, true case "idiagr": // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - return rune(0x0390), true + return {'\u0390', 0}, 1, true case "idigr": // GREEK SMALL LETTER IOTA WITH DIALYTIKA - return rune(0x03ca), true + return {'\u03ca', 0}, 1, true case "iecy": // CYRILLIC SMALL LETTER IE - return rune(0x0435), true + return {'\u0435', 0}, 1, true case "iexcl": // INVERTED EXCLAMATION MARK - return rune(0xa1), true + return {'¡', 0}, 1, true case "iff": // LEFT RIGHT DOUBLE ARROW - return rune(0x21d4), true + return {'\u21d4', 0}, 1, true case "ifr": // MATHEMATICAL FRAKTUR SMALL I - return rune(0x01d526), true + return {'\U0001d526', 0}, 1, true case "igr": // GREEK SMALL LETTER IOTA - return rune(0x03b9), true + return {'\u03b9', 0}, 1, true case "igrave": // LATIN SMALL LETTER I WITH GRAVE - return rune(0xec), true + return {'ì', 0}, 1, true case "ii": // DOUBLE-STRUCK ITALIC SMALL I - return rune(0x2148), true + return {'\u2148', 0}, 1, true case "iiiint": // QUADRUPLE INTEGRAL OPERATOR - return rune(0x2a0c), true + return {'\u2a0c', 0}, 1, true case "iiint": // TRIPLE INTEGRAL - return rune(0x222d), true + return {'\u222d', 0}, 1, true case "iinfin": // INCOMPLETE INFINITY - return rune(0x29dc), true + return {'\u29dc', 0}, 1, true case "iiota": // TURNED GREEK SMALL LETTER IOTA - return rune(0x2129), true + return {'\u2129', 0}, 1, true case "ijlig": // LATIN SMALL LIGATURE IJ - return rune(0x0133), true + return {'\u0133', 0}, 1, true case "imacr": // LATIN SMALL LETTER I WITH MACRON - return rune(0x012b), true + return {'\u012b', 0}, 1, true case "image": // BLACK-LETTER CAPITAL I - return rune(0x2111), true + return {'\u2111', 0}, 1, true case "imagline": // SCRIPT CAPITAL I - return rune(0x2110), true + return {'\u2110', 0}, 1, true case "imagpart": // BLACK-LETTER CAPITAL I - return rune(0x2111), true + return {'\u2111', 0}, 1, true case "imath": // LATIN SMALL LETTER DOTLESS I - return rune(0x0131), true + return {'\u0131', 0}, 1, true case "imof": // IMAGE OF - return rune(0x22b7), true + return {'\u22b7', 0}, 1, true case "imped": // LATIN CAPITAL LETTER Z WITH STROKE - return rune(0x01b5), true + return {'\u01b5', 0}, 1, true case "in": // ELEMENT OF - return rune(0x2208), true + return {'\u2208', 0}, 1, true case "incare": // CARE OF - return rune(0x2105), true + return {'\u2105', 0}, 1, true case "infin": // INFINITY - return rune(0x221e), true + return {'\u221e', 0}, 1, true case "infintie": // TIE OVER INFINITY - return rune(0x29dd), true + return {'\u29dd', 0}, 1, true case "inodot": // LATIN SMALL LETTER DOTLESS I - return rune(0x0131), true + return {'\u0131', 0}, 1, true case "int": // INTEGRAL - return rune(0x222b), true + return {'\u222b', 0}, 1, true case "intcal": // INTERCALATE - return rune(0x22ba), true + return {'\u22ba', 0}, 1, true case "integers": // DOUBLE-STRUCK CAPITAL Z - return rune(0x2124), true + return {'\u2124', 0}, 1, true case "intercal": // INTERCALATE - return rune(0x22ba), true + return {'\u22ba', 0}, 1, true case "intlarhk": // INTEGRAL WITH LEFTWARDS ARROW WITH HOOK - return rune(0x2a17), true + return {'\u2a17', 0}, 1, true case "intprod": // INTERIOR PRODUCT - return rune(0x2a3c), true + return {'\u2a3c', 0}, 1, true case "iocy": // CYRILLIC SMALL LETTER IO - return rune(0x0451), true + return {'\u0451', 0}, 1, true case "iogon": // LATIN SMALL LETTER I WITH OGONEK - return rune(0x012f), true + return {'\u012f', 0}, 1, true case "iopf": // MATHEMATICAL DOUBLE-STRUCK SMALL I - return rune(0x01d55a), true + return {'\U0001d55a', 0}, 1, true case "iota": // GREEK SMALL LETTER IOTA - return rune(0x03b9), true + return {'\u03b9', 0}, 1, true case "iprod": // INTERIOR PRODUCT - return rune(0x2a3c), true + return {'\u2a3c', 0}, 1, true case "iprodr": // RIGHTHAND INTERIOR PRODUCT - return rune(0x2a3d), true + return {'\u2a3d', 0}, 1, true case "iquest": // INVERTED QUESTION MARK - return rune(0xbf), true + return {'¿', 0}, 1, true case "iscr": // MATHEMATICAL SCRIPT SMALL I - return rune(0x01d4be), true + return {'\U0001d4be', 0}, 1, true case "isin": // ELEMENT OF - return rune(0x2208), true + return {'\u2208', 0}, 1, true case "isinE": // ELEMENT OF WITH TWO HORIZONTAL STROKES - return rune(0x22f9), true + return {'\u22f9', 0}, 1, true case "isindot": // ELEMENT OF WITH DOT ABOVE - return rune(0x22f5), true + return {'\u22f5', 0}, 1, true case "isins": // SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE - return rune(0x22f4), true + return {'\u22f4', 0}, 1, true case "isinsv": // ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE - return rune(0x22f3), true + return {'\u22f3', 0}, 1, true case "isinv": // ELEMENT OF - return rune(0x2208), true + return {'\u2208', 0}, 1, true case "isinvb": // ELEMENT OF WITH UNDERBAR - return rune(0x22f8), true + return {'\u22f8', 0}, 1, true case "it": // INVISIBLE TIMES - return rune(0x2062), true + return {'\u2062', 0}, 1, true case "itilde": // LATIN SMALL LETTER I WITH TILDE - return rune(0x0129), true + return {'\u0129', 0}, 1, true case "iukcy": // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - return rune(0x0456), true + return {'\u0456', 0}, 1, true case "iuml": // LATIN SMALL LETTER I WITH DIAERESIS - return rune(0xef), true + return {'ï', 0}, 1, true } case 'j': switch name { case "jcirc": // LATIN SMALL LETTER J WITH CIRCUMFLEX - return rune(0x0135), true + return {'\u0135', 0}, 1, true case "jcy": // CYRILLIC SMALL LETTER SHORT I - return rune(0x0439), true + return {'\u0439', 0}, 1, true case "jfr": // MATHEMATICAL FRAKTUR SMALL J - return rune(0x01d527), true + return {'\U0001d527', 0}, 1, true case "jmath": // LATIN SMALL LETTER DOTLESS J - return rune(0x0237), true + return {'\u0237', 0}, 1, true case "jnodot": // LATIN SMALL LETTER DOTLESS J - return rune(0x0237), true + return {'\u0237', 0}, 1, true case "jopf": // MATHEMATICAL DOUBLE-STRUCK SMALL J - return rune(0x01d55b), true + return {'\U0001d55b', 0}, 1, true case "jscr": // MATHEMATICAL SCRIPT SMALL J - return rune(0x01d4bf), true + return {'\U0001d4bf', 0}, 1, true case "jsercy": // CYRILLIC SMALL LETTER JE - return rune(0x0458), true + return {'\u0458', 0}, 1, true case "jukcy": // CYRILLIC SMALL LETTER UKRAINIAN IE - return rune(0x0454), true + return {'\u0454', 0}, 1, true } case 'k': switch name { case "kappa": // GREEK SMALL LETTER KAPPA - return rune(0x03ba), true + return {'\u03ba', 0}, 1, true case "kappav": // GREEK KAPPA SYMBOL - return rune(0x03f0), true + return {'\u03f0', 0}, 1, true case "kcedil": // LATIN SMALL LETTER K WITH CEDILLA - return rune(0x0137), true + return {'\u0137', 0}, 1, true case "kcy": // CYRILLIC SMALL LETTER KA - return rune(0x043a), true + return {'\u043a', 0}, 1, true case "kfr": // MATHEMATICAL FRAKTUR SMALL K - return rune(0x01d528), true + return {'\U0001d528', 0}, 1, true case "kgr": // GREEK SMALL LETTER KAPPA - return rune(0x03ba), true + return {'\u03ba', 0}, 1, true case "kgreen": // LATIN SMALL LETTER KRA - return rune(0x0138), true + return {'\u0138', 0}, 1, true case "khcy": // CYRILLIC SMALL LETTER HA - return rune(0x0445), true + return {'\u0445', 0}, 1, true case "khgr": // GREEK SMALL LETTER CHI - return rune(0x03c7), true + return {'\u03c7', 0}, 1, true case "kjcy": // CYRILLIC SMALL LETTER KJE - return rune(0x045c), true + return {'\u045c', 0}, 1, true case "kopf": // MATHEMATICAL DOUBLE-STRUCK SMALL K - return rune(0x01d55c), true + return {'\U0001d55c', 0}, 1, true case "koppa": // GREEK LETTER KOPPA - return rune(0x03de), true + return {'\u03de', 0}, 1, true case "kscr": // MATHEMATICAL SCRIPT SMALL K - return rune(0x01d4c0), true + return {'\U0001d4c0', 0}, 1, true } case 'l': switch name { case "lAarr": // LEFTWARDS TRIPLE ARROW - return rune(0x21da), true + return {'\u21da', 0}, 1, true case "lArr": // LEFTWARDS DOUBLE ARROW - return rune(0x21d0), true + return {'\u21d0', 0}, 1, true case "lAtail": // LEFTWARDS DOUBLE ARROW-TAIL - return rune(0x291b), true + return {'\u291b', 0}, 1, true case "lBarr": // LEFTWARDS TRIPLE DASH ARROW - return rune(0x290e), true + return {'\u290e', 0}, 1, true case "lE": // LESS-THAN OVER EQUAL TO - return rune(0x2266), true + return {'\u2266', 0}, 1, true case "lEg": // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN - return rune(0x2a8b), true + return {'\u2a8b', 0}, 1, true case "lHar": // LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN - return rune(0x2962), true + return {'\u2962', 0}, 1, true case "lacute": // LATIN SMALL LETTER L WITH ACUTE - return rune(0x013a), true + return {'\u013a', 0}, 1, true case "laemptyv": // EMPTY SET WITH LEFT ARROW ABOVE - return rune(0x29b4), true + return {'\u29b4', 0}, 1, true case "lagran": // SCRIPT CAPITAL L - return rune(0x2112), true + return {'\u2112', 0}, 1, true case "lambda": // GREEK SMALL LETTER LAMDA - return rune(0x03bb), true + return {'\u03bb', 0}, 1, true case "lang": // MATHEMATICAL LEFT ANGLE BRACKET - return rune(0x27e8), true + return {'\u27e8', 0}, 1, true case "langd": // LEFT ANGLE BRACKET WITH DOT - return rune(0x2991), true + return {'\u2991', 0}, 1, true case "langle": // MATHEMATICAL LEFT ANGLE BRACKET - return rune(0x27e8), true + return {'\u27e8', 0}, 1, true case "lap": // LESS-THAN OR APPROXIMATE - return rune(0x2a85), true + return {'\u2a85', 0}, 1, true case "laquo": // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - return rune(0xab), true + return {'«', 0}, 1, true case "larr": // LEFTWARDS ARROW - return rune(0x2190), true + return {'\u2190', 0}, 1, true case "larr2": // LEFTWARDS PAIRED ARROWS - return rune(0x21c7), true + return {'\u21c7', 0}, 1, true case "larrb": // LEFTWARDS ARROW TO BAR - return rune(0x21e4), true + return {'\u21e4', 0}, 1, true case "larrbfs": // LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND - return rune(0x291f), true + return {'\u291f', 0}, 1, true case "larrfs": // LEFTWARDS ARROW TO BLACK DIAMOND - return rune(0x291d), true + return {'\u291d', 0}, 1, true case "larrhk": // LEFTWARDS ARROW WITH HOOK - return rune(0x21a9), true + return {'\u21a9', 0}, 1, true case "larrlp": // LEFTWARDS ARROW WITH LOOP - return rune(0x21ab), true + return {'\u21ab', 0}, 1, true case "larrpl": // LEFT-SIDE ARC ANTICLOCKWISE ARROW - return rune(0x2939), true + return {'\u2939', 0}, 1, true case "larrsim": // LEFTWARDS ARROW ABOVE TILDE OPERATOR - return rune(0x2973), true + return {'\u2973', 0}, 1, true case "larrtl": // LEFTWARDS ARROW WITH TAIL - return rune(0x21a2), true + return {'\u21a2', 0}, 1, true case "lat": // LARGER THAN - return rune(0x2aab), true + return {'\u2aab', 0}, 1, true case "latail": // LEFTWARDS ARROW-TAIL - return rune(0x2919), true + return {'\u2919', 0}, 1, true case "late": // LARGER THAN OR EQUAL TO - return rune(0x2aad), true + return {'\u2aad', 0}, 1, true case "lates": // LARGER THAN OR slanted EQUAL - return rune(0x2aad), true + return {'\u2aad', '\u2aad'}, 2, true case "lbarr": // LEFTWARDS DOUBLE DASH ARROW - return rune(0x290c), true + return {'\u290c', 0}, 1, true case "lbbrk": // LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT - return rune(0x2772), true + return {'\u2772', 0}, 1, true case "lbrace": // LEFT CURLY BRACKET - return rune(0x7b), true + return {'{', 0}, 1, true case "lbrack": // LEFT SQUARE BRACKET - return rune(0x5b), true + return {'[', 0}, 1, true case "lbrke": // LEFT SQUARE BRACKET WITH UNDERBAR - return rune(0x298b), true + return {'\u298b', 0}, 1, true case "lbrksld": // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER - return rune(0x298f), true + return {'\u298f', 0}, 1, true case "lbrkslu": // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER - return rune(0x298d), true + return {'\u298d', 0}, 1, true case "lcaron": // LATIN SMALL LETTER L WITH CARON - return rune(0x013e), true + return {'\u013e', 0}, 1, true case "lcedil": // LATIN SMALL LETTER L WITH CEDILLA - return rune(0x013c), true + return {'\u013c', 0}, 1, true case "lceil": // LEFT CEILING - return rune(0x2308), true + return {'\u2308', 0}, 1, true case "lcub": // LEFT CURLY BRACKET - return rune(0x7b), true + return {'{', 0}, 1, true case "lcy": // CYRILLIC SMALL LETTER EL - return rune(0x043b), true + return {'\u043b', 0}, 1, true case "ldca": // ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS - return rune(0x2936), true + return {'\u2936', 0}, 1, true case "ldharb": // LEFTWARDS HARPOON WITH BARB DOWN TO BAR - return rune(0x2956), true + return {'\u2956', 0}, 1, true case "ldot": // LESS-THAN WITH DOT - return rune(0x22d6), true + return {'\u22d6', 0}, 1, true case "ldquo": // LEFT DOUBLE QUOTATION MARK - return rune(0x201c), true + return {'\u201c', 0}, 1, true case "ldquor": // DOUBLE LOW-9 QUOTATION MARK - return rune(0x201e), true + return {'\u201e', 0}, 1, true case "ldrdhar": // LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN - return rune(0x2967), true + return {'\u2967', 0}, 1, true case "ldrdshar": // LEFT BARB DOWN RIGHT BARB DOWN HARPOON - return rune(0x2950), true + return {'\u2950', 0}, 1, true case "ldrushar": // LEFT BARB DOWN RIGHT BARB UP HARPOON - return rune(0x294b), true + return {'\u294b', 0}, 1, true case "ldsh": // DOWNWARDS ARROW WITH TIP LEFTWARDS - return rune(0x21b2), true + return {'\u21b2', 0}, 1, true case "le": // LESS-THAN OR EQUAL TO - return rune(0x2264), true + return {'\u2264', 0}, 1, true case "leftarrow": // LEFTWARDS ARROW - return rune(0x2190), true + return {'\u2190', 0}, 1, true case "leftarrowtail": // LEFTWARDS ARROW WITH TAIL - return rune(0x21a2), true + return {'\u21a2', 0}, 1, true case "leftharpoondown": // LEFTWARDS HARPOON WITH BARB DOWNWARDS - return rune(0x21bd), true + return {'\u21bd', 0}, 1, true case "leftharpoonup": // LEFTWARDS HARPOON WITH BARB UPWARDS - return rune(0x21bc), true + return {'\u21bc', 0}, 1, true case "leftleftarrows": // LEFTWARDS PAIRED ARROWS - return rune(0x21c7), true + return {'\u21c7', 0}, 1, true case "leftrightarrow": // LEFT RIGHT ARROW - return rune(0x2194), true + return {'\u2194', 0}, 1, true case "leftrightarrows": // LEFTWARDS ARROW OVER RIGHTWARDS ARROW - return rune(0x21c6), true + return {'\u21c6', 0}, 1, true case "leftrightharpoons": // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON - return rune(0x21cb), true + return {'\u21cb', 0}, 1, true case "leftrightsquigarrow": // LEFT RIGHT WAVE ARROW - return rune(0x21ad), true + return {'\u21ad', 0}, 1, true case "leftthreetimes": // LEFT SEMIDIRECT PRODUCT - return rune(0x22cb), true + return {'\u22cb', 0}, 1, true case "leg": // LESS-THAN EQUAL TO OR GREATER-THAN - return rune(0x22da), true + return {'\u22da', 0}, 1, true case "leq": // LESS-THAN OR EQUAL TO - return rune(0x2264), true + return {'\u2264', 0}, 1, true case "leqq": // LESS-THAN OVER EQUAL TO - return rune(0x2266), true + return {'\u2266', 0}, 1, true case "leqslant": // LESS-THAN OR SLANTED EQUAL TO - return rune(0x2a7d), true + return {'\u2a7d', 0}, 1, true case "les": // LESS-THAN OR SLANTED EQUAL TO - return rune(0x2a7d), true + return {'\u2a7d', 0}, 1, true case "lescc": // LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL - return rune(0x2aa8), true + return {'\u2aa8', 0}, 1, true case "lesdot": // LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE - return rune(0x2a7f), true + return {'\u2a7f', 0}, 1, true case "lesdoto": // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE - return rune(0x2a81), true + return {'\u2a81', 0}, 1, true case "lesdotor": // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT - return rune(0x2a83), true + return {'\u2a83', 0}, 1, true case "lesg": // LESS-THAN slanted EQUAL TO OR GREATER-THAN - return rune(0x22da), true + return {'\u22da', '\u22da'}, 2, true case "lesges": // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL - return rune(0x2a93), true + return {'\u2a93', 0}, 1, true case "lessapprox": // LESS-THAN OR APPROXIMATE - return rune(0x2a85), true + return {'\u2a85', 0}, 1, true case "lessdot": // LESS-THAN WITH DOT - return rune(0x22d6), true + return {'\u22d6', 0}, 1, true case "lesseqgtr": // LESS-THAN EQUAL TO OR GREATER-THAN - return rune(0x22da), true + return {'\u22da', 0}, 1, true case "lesseqqgtr": // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN - return rune(0x2a8b), true + return {'\u2a8b', 0}, 1, true case "lessgtr": // LESS-THAN OR GREATER-THAN - return rune(0x2276), true + return {'\u2276', 0}, 1, true case "lesssim": // LESS-THAN OR EQUIVALENT TO - return rune(0x2272), true + return {'\u2272', 0}, 1, true case "lfbowtie": // BOWTIE WITH LEFT HALF BLACK - return rune(0x29d1), true + return {'\u29d1', 0}, 1, true case "lfisht": // LEFT FISH TAIL - return rune(0x297c), true + return {'\u297c', 0}, 1, true case "lfloor": // LEFT FLOOR - return rune(0x230a), true + return {'\u230a', 0}, 1, true case "lfr": // MATHEMATICAL FRAKTUR SMALL L - return rune(0x01d529), true + return {'\U0001d529', 0}, 1, true case "lftimes": // TIMES WITH LEFT HALF BLACK - return rune(0x29d4), true + return {'\u29d4', 0}, 1, true case "lg": // LESS-THAN OR GREATER-THAN - return rune(0x2276), true + return {'\u2276', 0}, 1, true case "lgE": // LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL - return rune(0x2a91), true + return {'\u2a91', 0}, 1, true case "lgr": // GREEK SMALL LETTER LAMDA - return rune(0x03bb), true + return {'\u03bb', 0}, 1, true case "lhard": // LEFTWARDS HARPOON WITH BARB DOWNWARDS - return rune(0x21bd), true + return {'\u21bd', 0}, 1, true case "lharu": // LEFTWARDS HARPOON WITH BARB UPWARDS - return rune(0x21bc), true + return {'\u21bc', 0}, 1, true case "lharul": // LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH - return rune(0x296a), true + return {'\u296a', 0}, 1, true case "lhblk": // LOWER HALF BLOCK - return rune(0x2584), true + return {'\u2584', 0}, 1, true case "ljcy": // CYRILLIC SMALL LETTER LJE - return rune(0x0459), true + return {'\u0459', 0}, 1, true case "ll": // MUCH LESS-THAN - return rune(0x226a), true + return {'\u226a', 0}, 1, true case "llarr": // LEFTWARDS PAIRED ARROWS - return rune(0x21c7), true + return {'\u21c7', 0}, 1, true case "llcorner": // BOTTOM LEFT CORNER - return rune(0x231e), true + return {'\u231e', 0}, 1, true case "llhard": // LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH - return rune(0x296b), true + return {'\u296b', 0}, 1, true case "lltri": // LOWER LEFT TRIANGLE - return rune(0x25fa), true + return {'\u25fa', 0}, 1, true case "lltrif": // BLACK LOWER LEFT TRIANGLE - return rune(0x25e3), true + return {'\u25e3', 0}, 1, true case "lmidot": // LATIN SMALL LETTER L WITH MIDDLE DOT - return rune(0x0140), true + return {'\u0140', 0}, 1, true case "lmoust": // UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION - return rune(0x23b0), true + return {'\u23b0', 0}, 1, true case "lmoustache": // UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION - return rune(0x23b0), true + return {'\u23b0', 0}, 1, true case "lnE": // LESS-THAN BUT NOT EQUAL TO - return rune(0x2268), true + return {'\u2268', 0}, 1, true case "lnap": // LESS-THAN AND NOT APPROXIMATE - return rune(0x2a89), true + return {'\u2a89', 0}, 1, true case "lnapprox": // LESS-THAN AND NOT APPROXIMATE - return rune(0x2a89), true + return {'\u2a89', 0}, 1, true case "lne": // LESS-THAN AND SINGLE-LINE NOT EQUAL TO - return rune(0x2a87), true + return {'\u2a87', 0}, 1, true case "lneq": // LESS-THAN AND SINGLE-LINE NOT EQUAL TO - return rune(0x2a87), true + return {'\u2a87', 0}, 1, true case "lneqq": // LESS-THAN BUT NOT EQUAL TO - return rune(0x2268), true + return {'\u2268', 0}, 1, true case "lnsim": // LESS-THAN BUT NOT EQUIVALENT TO - return rune(0x22e6), true + return {'\u22e6', 0}, 1, true case "loang": // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET - return rune(0x27ec), true + return {'\u27ec', 0}, 1, true case "loarr": // LEFTWARDS OPEN-HEADED ARROW - return rune(0x21fd), true + return {'\u21fd', 0}, 1, true case "lobrk": // MATHEMATICAL LEFT WHITE SQUARE BRACKET - return rune(0x27e6), true + return {'\u27e6', 0}, 1, true case "locub": // LEFT WHITE CURLY BRACKET - return rune(0x2983), true + return {'\u2983', 0}, 1, true case "longleftarrow": // LONG LEFTWARDS ARROW - return rune(0x27f5), true + return {'\u27f5', 0}, 1, true case "longleftrightarrow": // LONG LEFT RIGHT ARROW - return rune(0x27f7), true + return {'\u27f7', 0}, 1, true case "longmapsto": // LONG RIGHTWARDS ARROW FROM BAR - return rune(0x27fc), true + return {'\u27fc', 0}, 1, true case "longrightarrow": // LONG RIGHTWARDS ARROW - return rune(0x27f6), true + return {'\u27f6', 0}, 1, true case "looparrowleft": // LEFTWARDS ARROW WITH LOOP - return rune(0x21ab), true + return {'\u21ab', 0}, 1, true case "looparrowright": // RIGHTWARDS ARROW WITH LOOP - return rune(0x21ac), true + return {'\u21ac', 0}, 1, true case "lopar": // LEFT WHITE PARENTHESIS - return rune(0x2985), true + return {'\u2985', 0}, 1, true case "lopf": // MATHEMATICAL DOUBLE-STRUCK SMALL L - return rune(0x01d55d), true + return {'\U0001d55d', 0}, 1, true case "loplus": // PLUS SIGN IN LEFT HALF CIRCLE - return rune(0x2a2d), true + return {'\u2a2d', 0}, 1, true case "lotimes": // MULTIPLICATION SIGN IN LEFT HALF CIRCLE - return rune(0x2a34), true + return {'\u2a34', 0}, 1, true case "lowast": // LOW ASTERISK - return rune(0x204e), true + return {'\u204e', 0}, 1, true case "lowbar": // LOW LINE - return rune(0x5f), true + return {'_', 0}, 1, true case "lowint": // INTEGRAL WITH UNDERBAR - return rune(0x2a1c), true + return {'\u2a1c', 0}, 1, true case "loz": // LOZENGE - return rune(0x25ca), true + return {'\u25ca', 0}, 1, true case "lozenge": // LOZENGE - return rune(0x25ca), true + return {'\u25ca', 0}, 1, true case "lozf": // BLACK LOZENGE - return rune(0x29eb), true + return {'\u29eb', 0}, 1, true case "lpar": // LEFT PARENTHESIS - return rune(0x28), true + return {'(', 0}, 1, true case "lpargt": // SPHERICAL ANGLE OPENING LEFT - return rune(0x29a0), true + return {'\u29a0', 0}, 1, true case "lparlt": // LEFT ARC LESS-THAN BRACKET - return rune(0x2993), true + return {'\u2993', 0}, 1, true case "lrarr": // LEFTWARDS ARROW OVER RIGHTWARDS ARROW - return rune(0x21c6), true + return {'\u21c6', 0}, 1, true case "lrarr2": // LEFTWARDS ARROW OVER RIGHTWARDS ARROW - return rune(0x21c6), true + return {'\u21c6', 0}, 1, true case "lrcorner": // BOTTOM RIGHT CORNER - return rune(0x231f), true + return {'\u231f', 0}, 1, true case "lrhar": // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON - return rune(0x21cb), true + return {'\u21cb', 0}, 1, true case "lrhar2": // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON - return rune(0x21cb), true + return {'\u21cb', 0}, 1, true case "lrhard": // RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH - return rune(0x296d), true + return {'\u296d', 0}, 1, true case "lrm": // LEFT-TO-RIGHT MARK - return rune(0x200e), true + return {'\u200e', 0}, 1, true case "lrtri": // RIGHT TRIANGLE - return rune(0x22bf), true + return {'\u22bf', 0}, 1, true case "lsaquo": // SINGLE LEFT-POINTING ANGLE QUOTATION MARK - return rune(0x2039), true + return {'\u2039', 0}, 1, true case "lscr": // MATHEMATICAL SCRIPT SMALL L - return rune(0x01d4c1), true + return {'\U0001d4c1', 0}, 1, true case "lsh": // UPWARDS ARROW WITH TIP LEFTWARDS - return rune(0x21b0), true + return {'\u21b0', 0}, 1, true case "lsim": // LESS-THAN OR EQUIVALENT TO - return rune(0x2272), true + return {'\u2272', 0}, 1, true case "lsime": // LESS-THAN ABOVE SIMILAR OR EQUAL - return rune(0x2a8d), true + return {'\u2a8d', 0}, 1, true case "lsimg": // LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN - return rune(0x2a8f), true + return {'\u2a8f', 0}, 1, true case "lsqb": // LEFT SQUARE BRACKET - return rune(0x5b), true + return {'[', 0}, 1, true case "lsquo": // LEFT SINGLE QUOTATION MARK - return rune(0x2018), true + return {'\u2018', 0}, 1, true case "lsquor": // SINGLE LOW-9 QUOTATION MARK - return rune(0x201a), true + return {'\u201a', 0}, 1, true case "lstrok": // LATIN SMALL LETTER L WITH STROKE - return rune(0x0142), true + return {'\u0142', 0}, 1, true case "lt": // LESS-THAN SIGN - return rune(0x3c), true + return {'<', 0}, 1, true case "ltcc": // LESS-THAN CLOSED BY CURVE - return rune(0x2aa6), true + return {'\u2aa6', 0}, 1, true case "ltcir": // LESS-THAN WITH CIRCLE INSIDE - return rune(0x2a79), true + return {'\u2a79', 0}, 1, true case "ltdot": // LESS-THAN WITH DOT - return rune(0x22d6), true + return {'\u22d6', 0}, 1, true case "lthree": // LEFT SEMIDIRECT PRODUCT - return rune(0x22cb), true + return {'\u22cb', 0}, 1, true case "ltimes": // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT - return rune(0x22c9), true + return {'\u22c9', 0}, 1, true case "ltlarr": // LESS-THAN ABOVE LEFTWARDS ARROW - return rune(0x2976), true + return {'\u2976', 0}, 1, true case "ltquest": // LESS-THAN WITH QUESTION MARK ABOVE - return rune(0x2a7b), true + return {'\u2a7b', 0}, 1, true case "ltrPar": // DOUBLE RIGHT ARC LESS-THAN BRACKET - return rune(0x2996), true + return {'\u2996', 0}, 1, true case "ltri": // WHITE LEFT-POINTING SMALL TRIANGLE - return rune(0x25c3), true + return {'\u25c3', 0}, 1, true case "ltrie": // NORMAL SUBGROUP OF OR EQUAL TO - return rune(0x22b4), true + return {'\u22b4', 0}, 1, true case "ltrif": // BLACK LEFT-POINTING SMALL TRIANGLE - return rune(0x25c2), true + return {'\u25c2', 0}, 1, true case "ltrivb": // LEFT TRIANGLE BESIDE VERTICAL BAR - return rune(0x29cf), true + return {'\u29cf', 0}, 1, true case "luharb": // LEFTWARDS HARPOON WITH BARB UP TO BAR - return rune(0x2952), true + return {'\u2952', 0}, 1, true case "lurdshar": // LEFT BARB UP RIGHT BARB DOWN HARPOON - return rune(0x294a), true + return {'\u294a', 0}, 1, true case "luruhar": // LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP - return rune(0x2966), true + return {'\u2966', 0}, 1, true case "lurushar": // LEFT BARB UP RIGHT BARB UP HARPOON - return rune(0x294e), true + return {'\u294e', 0}, 1, true case "lvertneqq": // LESS-THAN BUT NOT EQUAL TO - with vertical stroke - return rune(0x2268), true + return {'\u2268', '\u2268'}, 2, true case "lvnE": // LESS-THAN BUT NOT EQUAL TO - with vertical stroke - return rune(0x2268), true + return {'\u2268', '\u2268'}, 2, true } case 'm': switch name { case "mDDot": // GEOMETRIC PROPORTION - return rune(0x223a), true + return {'\u223a', 0}, 1, true case "macr": // MACRON - return rune(0xaf), true + return {'¯', 0}, 1, true case "male": // MALE SIGN - return rune(0x2642), true + return {'\u2642', 0}, 1, true case "malt": // MALTESE CROSS - return rune(0x2720), true + return {'\u2720', 0}, 1, true case "maltese": // MALTESE CROSS - return rune(0x2720), true + return {'\u2720', 0}, 1, true case "map": // RIGHTWARDS ARROW FROM BAR - return rune(0x21a6), true + return {'\u21a6', 0}, 1, true case "mapsto": // RIGHTWARDS ARROW FROM BAR - return rune(0x21a6), true + return {'\u21a6', 0}, 1, true case "mapstodown": // DOWNWARDS ARROW FROM BAR - return rune(0x21a7), true + return {'\u21a7', 0}, 1, true case "mapstoleft": // LEFTWARDS ARROW FROM BAR - return rune(0x21a4), true + return {'\u21a4', 0}, 1, true case "mapstoup": // UPWARDS ARROW FROM BAR - return rune(0x21a5), true + return {'\u21a5', 0}, 1, true case "marker": // BLACK VERTICAL RECTANGLE - return rune(0x25ae), true + return {'\u25ae', 0}, 1, true case "mcomma": // MINUS SIGN WITH COMMA ABOVE - return rune(0x2a29), true + return {'\u2a29', 0}, 1, true case "mcy": // CYRILLIC SMALL LETTER EM - return rune(0x043c), true + return {'\u043c', 0}, 1, true case "mdash": // EM DASH - return rune(0x2014), true + return {'\u2014', 0}, 1, true case "measuredangle": // MEASURED ANGLE - return rune(0x2221), true + return {'\u2221', 0}, 1, true case "mfr": // MATHEMATICAL FRAKTUR SMALL M - return rune(0x01d52a), true + return {'\U0001d52a', 0}, 1, true case "mgr": // GREEK SMALL LETTER MU - return rune(0x03bc), true + return {'\u03bc', 0}, 1, true case "mho": // INVERTED OHM SIGN - return rune(0x2127), true + return {'\u2127', 0}, 1, true case "micro": // MICRO SIGN - return rune(0xb5), true + return {'µ', 0}, 1, true case "mid": // DIVIDES - return rune(0x2223), true + return {'\u2223', 0}, 1, true case "midast": // ASTERISK - return rune(0x2a), true + return {'*', 0}, 1, true case "midcir": // VERTICAL LINE WITH CIRCLE BELOW - return rune(0x2af0), true + return {'\u2af0', 0}, 1, true case "middot": // MIDDLE DOT - return rune(0xb7), true + return {'·', 0}, 1, true case "minus": // MINUS SIGN - return rune(0x2212), true + return {'\u2212', 0}, 1, true case "minusb": // SQUARED MINUS - return rune(0x229f), true + return {'\u229f', 0}, 1, true case "minusd": // DOT MINUS - return rune(0x2238), true + return {'\u2238', 0}, 1, true case "minusdu": // MINUS SIGN WITH DOT BELOW - return rune(0x2a2a), true + return {'\u2a2a', 0}, 1, true case "mlcp": // TRANSVERSAL INTERSECTION - return rune(0x2adb), true + return {'\u2adb', 0}, 1, true case "mldr": // HORIZONTAL ELLIPSIS - return rune(0x2026), true + return {'\u2026', 0}, 1, true case "mnplus": // MINUS-OR-PLUS SIGN - return rune(0x2213), true + return {'\u2213', 0}, 1, true case "models": // MODELS - return rune(0x22a7), true + return {'\u22a7', 0}, 1, true case "mopf": // MATHEMATICAL DOUBLE-STRUCK SMALL M - return rune(0x01d55e), true + return {'\U0001d55e', 0}, 1, true case "mp": // MINUS-OR-PLUS SIGN - return rune(0x2213), true + return {'\u2213', 0}, 1, true case "mscr": // MATHEMATICAL SCRIPT SMALL M - return rune(0x01d4c2), true + return {'\U0001d4c2', 0}, 1, true case "mstpos": // INVERTED LAZY S - return rune(0x223e), true + return {'\u223e', 0}, 1, true case "mu": // GREEK SMALL LETTER MU - return rune(0x03bc), true + return {'\u03bc', 0}, 1, true case "multimap": // MULTIMAP - return rune(0x22b8), true + return {'\u22b8', 0}, 1, true case "mumap": // MULTIMAP - return rune(0x22b8), true + return {'\u22b8', 0}, 1, true } case 'n': switch name { case "nGg": // VERY MUCH GREATER-THAN with slash - return rune(0x22d9), true + return {'\u22d9', '\u22d9'}, 2, true case "nGt": // MUCH GREATER THAN with vertical line - return rune(0x226b), true + return {'\u226b', '\u226b'}, 2, true case "nGtv": // MUCH GREATER THAN with slash - return rune(0x226b), true + return {'\u226b', '\u226b'}, 2, true case "nLeftarrow": // LEFTWARDS DOUBLE ARROW WITH STROKE - return rune(0x21cd), true + return {'\u21cd', 0}, 1, true case "nLeftrightarrow": // LEFT RIGHT DOUBLE ARROW WITH STROKE - return rune(0x21ce), true + return {'\u21ce', 0}, 1, true case "nLl": // VERY MUCH LESS-THAN with slash - return rune(0x22d8), true + return {'\u22d8', '\u22d8'}, 2, true case "nLt": // MUCH LESS THAN with vertical line - return rune(0x226a), true + return {'\u226a', '\u226a'}, 2, true case "nLtv": // MUCH LESS THAN with slash - return rune(0x226a), true + return {'\u226a', '\u226a'}, 2, true case "nRightarrow": // RIGHTWARDS DOUBLE ARROW WITH STROKE - return rune(0x21cf), true + return {'\u21cf', 0}, 1, true case "nVDash": // NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE - return rune(0x22af), true + return {'\u22af', 0}, 1, true case "nVdash": // DOES NOT FORCE - return rune(0x22ae), true + return {'\u22ae', 0}, 1, true case "nabla": // NABLA - return rune(0x2207), true + return {'\u2207', 0}, 1, true case "nacute": // LATIN SMALL LETTER N WITH ACUTE - return rune(0x0144), true + return {'\u0144', 0}, 1, true case "nang": // ANGLE with vertical line - return rune(0x2220), true + return {'\u2220', '\u2220'}, 2, true case "nap": // NOT ALMOST EQUAL TO - return rune(0x2249), true + return {'\u2249', 0}, 1, true case "napE": // APPROXIMATELY EQUAL OR EQUAL TO with slash - return rune(0x2a70), true + return {'\u2a70', '\u2a70'}, 2, true case "napid": // TRIPLE TILDE with slash - return rune(0x224b), true + return {'\u224b', '\u224b'}, 2, true case "napos": // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE - return rune(0x0149), true + return {'\u0149', 0}, 1, true case "napprox": // NOT ALMOST EQUAL TO - return rune(0x2249), true + return {'\u2249', 0}, 1, true case "natur": // MUSIC NATURAL SIGN - return rune(0x266e), true + return {'\u266e', 0}, 1, true case "natural": // MUSIC NATURAL SIGN - return rune(0x266e), true + return {'\u266e', 0}, 1, true case "naturals": // DOUBLE-STRUCK CAPITAL N - return rune(0x2115), true + return {'\u2115', 0}, 1, true case "nbsp": // NO-BREAK SPACE - return rune(0xa0), true + return {'\u00a0', 0}, 1, true case "nbump": // GEOMETRICALLY EQUIVALENT TO with slash - return rune(0x224e), true + return {'\u224e', '\u224e'}, 2, true case "nbumpe": // DIFFERENCE BETWEEN with slash - return rune(0x224f), true + return {'\u224f', '\u224f'}, 2, true case "ncap": // INTERSECTION WITH OVERBAR - return rune(0x2a43), true + return {'\u2a43', 0}, 1, true case "ncaron": // LATIN SMALL LETTER N WITH CARON - return rune(0x0148), true + return {'\u0148', 0}, 1, true case "ncedil": // LATIN SMALL LETTER N WITH CEDILLA - return rune(0x0146), true + return {'\u0146', 0}, 1, true case "ncong": // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO - return rune(0x2247), true + return {'\u2247', 0}, 1, true case "ncongdot": // CONGRUENT WITH DOT ABOVE with slash - return rune(0x2a6d), true + return {'\u2a6d', '\u2a6d'}, 2, true case "ncup": // UNION WITH OVERBAR - return rune(0x2a42), true + return {'\u2a42', 0}, 1, true case "ncy": // CYRILLIC SMALL LETTER EN - return rune(0x043d), true + return {'\u043d', 0}, 1, true case "ndash": // EN DASH - return rune(0x2013), true + return {'\u2013', 0}, 1, true case "ne": // NOT EQUAL TO - return rune(0x2260), true + return {'\u2260', 0}, 1, true case "neArr": // NORTH EAST DOUBLE ARROW - return rune(0x21d7), true + return {'\u21d7', 0}, 1, true case "nearhk": // NORTH EAST ARROW WITH HOOK - return rune(0x2924), true + return {'\u2924', 0}, 1, true case "nearr": // NORTH EAST ARROW - return rune(0x2197), true + return {'\u2197', 0}, 1, true case "nearrow": // NORTH EAST ARROW - return rune(0x2197), true + return {'\u2197', 0}, 1, true case "nedot": // APPROACHES THE LIMIT with slash - return rune(0x2250), true + return {'\u2250', '\u2250'}, 2, true case "neonwarr": // NORTH EAST ARROW CROSSING NORTH WEST ARROW - return rune(0x2931), true + return {'\u2931', 0}, 1, true case "neosearr": // NORTH EAST ARROW CROSSING SOUTH EAST ARROW - return rune(0x292e), true + return {'\u292e', 0}, 1, true case "nequiv": // NOT IDENTICAL TO - return rune(0x2262), true + return {'\u2262', 0}, 1, true case "nesear": // NORTH EAST ARROW AND SOUTH EAST ARROW - return rune(0x2928), true + return {'\u2928', 0}, 1, true case "nesim": // MINUS TILDE with slash - return rune(0x2242), true + return {'\u2242', '\u2242'}, 2, true case "neswsarr": // NORTH EAST AND SOUTH WEST ARROW - return rune(0x2922), true + return {'\u2922', 0}, 1, true case "nexist": // THERE DOES NOT EXIST - return rune(0x2204), true + return {'\u2204', 0}, 1, true case "nexists": // THERE DOES NOT EXIST - return rune(0x2204), true + return {'\u2204', 0}, 1, true case "nfr": // MATHEMATICAL FRAKTUR SMALL N - return rune(0x01d52b), true + return {'\U0001d52b', 0}, 1, true case "ngE": // GREATER-THAN OVER EQUAL TO with slash - return rune(0x2267), true + return {'\u2267', '\u2267'}, 2, true case "nge": // NEITHER GREATER-THAN NOR EQUAL TO - return rune(0x2271), true + return {'\u2271', 0}, 1, true case "ngeq": // NEITHER GREATER-THAN NOR EQUAL TO - return rune(0x2271), true + return {'\u2271', 0}, 1, true case "ngeqq": // GREATER-THAN OVER EQUAL TO with slash - return rune(0x2267), true + return {'\u2267', '\u2267'}, 2, true case "ngeqslant": // GREATER-THAN OR SLANTED EQUAL TO with slash - return rune(0x2a7e), true + return {'\u2a7e', '\u2a7e'}, 2, true case "nges": // GREATER-THAN OR SLANTED EQUAL TO with slash - return rune(0x2a7e), true + return {'\u2a7e', '\u2a7e'}, 2, true case "ngr": // GREEK SMALL LETTER NU - return rune(0x03bd), true + return {'\u03bd', 0}, 1, true case "ngsim": // NEITHER GREATER-THAN NOR EQUIVALENT TO - return rune(0x2275), true + return {'\u2275', 0}, 1, true case "ngt": // NOT GREATER-THAN - return rune(0x226f), true + return {'\u226f', 0}, 1, true case "ngtr": // NOT GREATER-THAN - return rune(0x226f), true + return {'\u226f', 0}, 1, true case "nhArr": // LEFT RIGHT DOUBLE ARROW WITH STROKE - return rune(0x21ce), true + return {'\u21ce', 0}, 1, true case "nharr": // LEFT RIGHT ARROW WITH STROKE - return rune(0x21ae), true + return {'\u21ae', 0}, 1, true case "nhpar": // PARALLEL WITH HORIZONTAL STROKE - return rune(0x2af2), true + return {'\u2af2', 0}, 1, true case "ni": // CONTAINS AS MEMBER - return rune(0x220b), true + return {'\u220b', 0}, 1, true case "nis": // SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE - return rune(0x22fc), true + return {'\u22fc', 0}, 1, true case "nisd": // CONTAINS WITH LONG HORIZONTAL STROKE - return rune(0x22fa), true + return {'\u22fa', 0}, 1, true case "niv": // CONTAINS AS MEMBER - return rune(0x220b), true + return {'\u220b', 0}, 1, true case "njcy": // CYRILLIC SMALL LETTER NJE - return rune(0x045a), true + return {'\u045a', 0}, 1, true case "nlArr": // LEFTWARDS DOUBLE ARROW WITH STROKE - return rune(0x21cd), true + return {'\u21cd', 0}, 1, true case "nlE": // LESS-THAN OVER EQUAL TO with slash - return rune(0x2266), true + return {'\u2266', '\u2266'}, 2, true case "nlarr": // LEFTWARDS ARROW WITH STROKE - return rune(0x219a), true + return {'\u219a', 0}, 1, true case "nldr": // TWO DOT LEADER - return rune(0x2025), true + return {'\u2025', 0}, 1, true case "nle": // NEITHER LESS-THAN NOR EQUAL TO - return rune(0x2270), true + return {'\u2270', 0}, 1, true case "nleftarrow": // LEFTWARDS ARROW WITH STROKE - return rune(0x219a), true + return {'\u219a', 0}, 1, true case "nleftrightarrow": // LEFT RIGHT ARROW WITH STROKE - return rune(0x21ae), true + return {'\u21ae', 0}, 1, true case "nleq": // NEITHER LESS-THAN NOR EQUAL TO - return rune(0x2270), true + return {'\u2270', 0}, 1, true case "nleqq": // LESS-THAN OVER EQUAL TO with slash - return rune(0x2266), true + return {'\u2266', '\u2266'}, 2, true case "nleqslant": // LESS-THAN OR SLANTED EQUAL TO with slash - return rune(0x2a7d), true + return {'\u2a7d', '\u2a7d'}, 2, true case "nles": // LESS-THAN OR SLANTED EQUAL TO with slash - return rune(0x2a7d), true + return {'\u2a7d', '\u2a7d'}, 2, true case "nless": // NOT LESS-THAN - return rune(0x226e), true + return {'\u226e', 0}, 1, true case "nlsim": // NEITHER LESS-THAN NOR EQUIVALENT TO - return rune(0x2274), true + return {'\u2274', 0}, 1, true case "nlt": // NOT LESS-THAN - return rune(0x226e), true + return {'\u226e', 0}, 1, true case "nltri": // NOT NORMAL SUBGROUP OF - return rune(0x22ea), true + return {'\u22ea', 0}, 1, true case "nltrie": // NOT NORMAL SUBGROUP OF OR EQUAL TO - return rune(0x22ec), true + return {'\u22ec', 0}, 1, true case "nltrivb": // LEFT TRIANGLE BESIDE VERTICAL BAR with slash - return rune(0x29cf), true + return {'\u29cf', '\u29cf'}, 2, true case "nmid": // DOES NOT DIVIDE - return rune(0x2224), true + return {'\u2224', 0}, 1, true case "nopf": // MATHEMATICAL DOUBLE-STRUCK SMALL N - return rune(0x01d55f), true + return {'\U0001d55f', 0}, 1, true case "not": // NOT SIGN - return rune(0xac), true + return {'¬', 0}, 1, true case "notin": // NOT AN ELEMENT OF - return rune(0x2209), true + return {'\u2209', 0}, 1, true case "notinE": // ELEMENT OF WITH TWO HORIZONTAL STROKES with slash - return rune(0x22f9), true + return {'\u22f9', '\u22f9'}, 2, true case "notindot": // ELEMENT OF WITH DOT ABOVE with slash - return rune(0x22f5), true + return {'\u22f5', '\u22f5'}, 2, true case "notinva": // NOT AN ELEMENT OF - return rune(0x2209), true + return {'\u2209', 0}, 1, true case "notinvb": // SMALL ELEMENT OF WITH OVERBAR - return rune(0x22f7), true + return {'\u22f7', 0}, 1, true case "notinvc": // ELEMENT OF WITH OVERBAR - return rune(0x22f6), true + return {'\u22f6', 0}, 1, true case "notni": // DOES NOT CONTAIN AS MEMBER - return rune(0x220c), true + return {'\u220c', 0}, 1, true case "notniva": // DOES NOT CONTAIN AS MEMBER - return rune(0x220c), true + return {'\u220c', 0}, 1, true case "notnivb": // SMALL CONTAINS WITH OVERBAR - return rune(0x22fe), true + return {'\u22fe', 0}, 1, true case "notnivc": // CONTAINS WITH OVERBAR - return rune(0x22fd), true + return {'\u22fd', 0}, 1, true case "npar": // NOT PARALLEL TO - return rune(0x2226), true + return {'\u2226', 0}, 1, true case "nparallel": // NOT PARALLEL TO - return rune(0x2226), true + return {'\u2226', 0}, 1, true case "nparsl": // DOUBLE SOLIDUS OPERATOR with reverse slash - return rune(0x2afd), true + return {'\u2afd', '\u2afd'}, 2, true case "npart": // PARTIAL DIFFERENTIAL with slash - return rune(0x2202), true + return {'\u2202', '\u2202'}, 2, true case "npolint": // LINE INTEGRATION NOT INCLUDING THE POLE - return rune(0x2a14), true + return {'\u2a14', 0}, 1, true case "npr": // DOES NOT PRECEDE - return rune(0x2280), true + return {'\u2280', 0}, 1, true case "nprcue": // DOES NOT PRECEDE OR EQUAL - return rune(0x22e0), true + return {'\u22e0', 0}, 1, true case "npre": // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash - return rune(0x2aaf), true + return {'\u2aaf', '\u2aaf'}, 2, true case "nprec": // DOES NOT PRECEDE - return rune(0x2280), true + return {'\u2280', 0}, 1, true case "npreceq": // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash - return rune(0x2aaf), true + return {'\u2aaf', '\u2aaf'}, 2, true case "nprsim": // PRECEDES OR EQUIVALENT TO with slash - return rune(0x227e), true + return {'\u227e', '\u227e'}, 2, true case "nrArr": // RIGHTWARDS DOUBLE ARROW WITH STROKE - return rune(0x21cf), true + return {'\u21cf', 0}, 1, true case "nrarr": // RIGHTWARDS ARROW WITH STROKE - return rune(0x219b), true + return {'\u219b', 0}, 1, true case "nrarrc": // WAVE ARROW POINTING DIRECTLY RIGHT with slash - return rune(0x2933), true + return {'\u2933', '\u2933'}, 2, true case "nrarrw": // RIGHTWARDS WAVE ARROW with slash - return rune(0x219d), true + return {'\u219d', '\u219d'}, 2, true case "nrightarrow": // RIGHTWARDS ARROW WITH STROKE - return rune(0x219b), true + return {'\u219b', 0}, 1, true case "nrtri": // DOES NOT CONTAIN AS NORMAL SUBGROUP - return rune(0x22eb), true + return {'\u22eb', 0}, 1, true case "nrtrie": // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL - return rune(0x22ed), true + return {'\u22ed', 0}, 1, true case "nsGt": // DOUBLE NESTED GREATER-THAN with slash - return rune(0x2aa2), true + return {'\u2aa2', '\u2aa2'}, 2, true case "nsLt": // DOUBLE NESTED LESS-THAN with slash - return rune(0x2aa1), true + return {'\u2aa1', '\u2aa1'}, 2, true case "nsc": // DOES NOT SUCCEED - return rune(0x2281), true + return {'\u2281', 0}, 1, true case "nsccue": // DOES NOT SUCCEED OR EQUAL - return rune(0x22e1), true + return {'\u22e1', 0}, 1, true case "nsce": // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash - return rune(0x2ab0), true + return {'\u2ab0', '\u2ab0'}, 2, true case "nscr": // MATHEMATICAL SCRIPT SMALL N - return rune(0x01d4c3), true + return {'\U0001d4c3', 0}, 1, true case "nscsim": // SUCCEEDS OR EQUIVALENT TO with slash - return rune(0x227f), true + return {'\u227f', '\u227f'}, 2, true case "nshortmid": // DOES NOT DIVIDE - return rune(0x2224), true + return {'\u2224', 0}, 1, true case "nshortparallel": // NOT PARALLEL TO - return rune(0x2226), true + return {'\u2226', 0}, 1, true case "nsim": // NOT TILDE - return rune(0x2241), true + return {'\u2241', 0}, 1, true case "nsime": // NOT ASYMPTOTICALLY EQUAL TO - return rune(0x2244), true + return {'\u2244', 0}, 1, true case "nsimeq": // NOT ASYMPTOTICALLY EQUAL TO - return rune(0x2244), true + return {'\u2244', 0}, 1, true case "nsmid": // DOES NOT DIVIDE - return rune(0x2224), true + return {'\u2224', 0}, 1, true case "nspar": // NOT PARALLEL TO - return rune(0x2226), true + return {'\u2226', 0}, 1, true case "nsqsub": // SQUARE IMAGE OF with slash - return rune(0x228f), true + return {'\u228f', '\u228f'}, 2, true case "nsqsube": // NOT SQUARE IMAGE OF OR EQUAL TO - return rune(0x22e2), true + return {'\u22e2', 0}, 1, true case "nsqsup": // SQUARE ORIGINAL OF with slash - return rune(0x2290), true + return {'\u2290', '\u2290'}, 2, true case "nsqsupe": // NOT SQUARE ORIGINAL OF OR EQUAL TO - return rune(0x22e3), true + return {'\u22e3', 0}, 1, true case "nsub": // NOT A SUBSET OF - return rune(0x2284), true + return {'\u2284', 0}, 1, true case "nsubE": // SUBSET OF ABOVE EQUALS SIGN with slash - return rune(0x2ac5), true + return {'\u2ac5', '\u2ac5'}, 2, true case "nsube": // NEITHER A SUBSET OF NOR EQUAL TO - return rune(0x2288), true + return {'\u2288', 0}, 1, true case "nsubset": // SUBSET OF with vertical line - return rune(0x2282), true + return {'\u2282', '\u2282'}, 2, true case "nsubseteq": // NEITHER A SUBSET OF NOR EQUAL TO - return rune(0x2288), true + return {'\u2288', 0}, 1, true case "nsubseteqq": // SUBSET OF ABOVE EQUALS SIGN with slash - return rune(0x2ac5), true + return {'\u2ac5', '\u2ac5'}, 2, true case "nsucc": // DOES NOT SUCCEED - return rune(0x2281), true + return {'\u2281', 0}, 1, true case "nsucceq": // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash - return rune(0x2ab0), true + return {'\u2ab0', '\u2ab0'}, 2, true case "nsup": // NOT A SUPERSET OF - return rune(0x2285), true + return {'\u2285', 0}, 1, true case "nsupE": // SUPERSET OF ABOVE EQUALS SIGN with slash - return rune(0x2ac6), true + return {'\u2ac6', '\u2ac6'}, 2, true case "nsupe": // NEITHER A SUPERSET OF NOR EQUAL TO - return rune(0x2289), true + return {'\u2289', 0}, 1, true case "nsupset": // SUPERSET OF with vertical line - return rune(0x2283), true + return {'\u2283', '\u2283'}, 2, true case "nsupseteq": // NEITHER A SUPERSET OF NOR EQUAL TO - return rune(0x2289), true + return {'\u2289', 0}, 1, true case "nsupseteqq": // SUPERSET OF ABOVE EQUALS SIGN with slash - return rune(0x2ac6), true + return {'\u2ac6', '\u2ac6'}, 2, true case "ntgl": // NEITHER GREATER-THAN NOR LESS-THAN - return rune(0x2279), true + return {'\u2279', 0}, 1, true case "ntilde": // LATIN SMALL LETTER N WITH TILDE - return rune(0xf1), true + return {'ñ', 0}, 1, true case "ntlg": // NEITHER LESS-THAN NOR GREATER-THAN - return rune(0x2278), true + return {'\u2278', 0}, 1, true case "ntriangleleft": // NOT NORMAL SUBGROUP OF - return rune(0x22ea), true + return {'\u22ea', 0}, 1, true case "ntrianglelefteq": // NOT NORMAL SUBGROUP OF OR EQUAL TO - return rune(0x22ec), true + return {'\u22ec', 0}, 1, true case "ntriangleright": // DOES NOT CONTAIN AS NORMAL SUBGROUP - return rune(0x22eb), true + return {'\u22eb', 0}, 1, true case "ntrianglerighteq": // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL - return rune(0x22ed), true + return {'\u22ed', 0}, 1, true case "nu": // GREEK SMALL LETTER NU - return rune(0x03bd), true + return {'\u03bd', 0}, 1, true case "num": // NUMBER SIGN - return rune(0x23), true + return {'#', 0}, 1, true case "numero": // NUMERO SIGN - return rune(0x2116), true + return {'\u2116', 0}, 1, true case "numsp": // FIGURE SPACE - return rune(0x2007), true + return {'\u2007', 0}, 1, true case "nvDash": // NOT TRUE - return rune(0x22ad), true + return {'\u22ad', 0}, 1, true case "nvHarr": // LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE - return rune(0x2904), true + return {'\u2904', 0}, 1, true case "nvap": // EQUIVALENT TO with vertical line - return rune(0x224d), true + return {'\u224d', '\u224d'}, 2, true case "nvbrtri": // VERTICAL BAR BESIDE RIGHT TRIANGLE with slash - return rune(0x29d0), true + return {'\u29d0', '\u29d0'}, 2, true case "nvdash": // DOES NOT PROVE - return rune(0x22ac), true + return {'\u22ac', 0}, 1, true case "nvge": // GREATER-THAN OR EQUAL TO with vertical line - return rune(0x2265), true + return {'\u2265', '\u2265'}, 2, true case "nvgt": // GREATER-THAN SIGN with vertical line - return rune(0x3e), true + return {'>', '>'}, 2, true case "nvinfin": // INFINITY NEGATED WITH VERTICAL BAR - return rune(0x29de), true + return {'\u29de', 0}, 1, true case "nvlArr": // LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE - return rune(0x2902), true + return {'\u2902', 0}, 1, true case "nvle": // LESS-THAN OR EQUAL TO with vertical line - return rune(0x2264), true + return {'\u2264', '\u2264'}, 2, true case "nvlt": // LESS-THAN SIGN with vertical line - return rune(0x3c), true + return {'<', '<'}, 2, true case "nvltrie": // NORMAL SUBGROUP OF OR EQUAL TO with vertical line - return rune(0x22b4), true + return {'\u22b4', '\u22b4'}, 2, true case "nvrArr": // RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE - return rune(0x2903), true + return {'\u2903', 0}, 1, true case "nvrtrie": // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line - return rune(0x22b5), true + return {'\u22b5', '\u22b5'}, 2, true case "nvsim": // TILDE OPERATOR with vertical line - return rune(0x223c), true + return {'\u223c', '\u223c'}, 2, true case "nwArr": // NORTH WEST DOUBLE ARROW - return rune(0x21d6), true + return {'\u21d6', 0}, 1, true case "nwarhk": // NORTH WEST ARROW WITH HOOK - return rune(0x2923), true + return {'\u2923', 0}, 1, true case "nwarr": // NORTH WEST ARROW - return rune(0x2196), true + return {'\u2196', 0}, 1, true case "nwarrow": // NORTH WEST ARROW - return rune(0x2196), true + return {'\u2196', 0}, 1, true case "nwnear": // NORTH WEST ARROW AND NORTH EAST ARROW - return rune(0x2927), true + return {'\u2927', 0}, 1, true case "nwonearr": // NORTH WEST ARROW CROSSING NORTH EAST ARROW - return rune(0x2932), true + return {'\u2932', 0}, 1, true case "nwsesarr": // NORTH WEST AND SOUTH EAST ARROW - return rune(0x2921), true + return {'\u2921', 0}, 1, true } case 'o': switch name { case "oS": // CIRCLED LATIN CAPITAL LETTER S - return rune(0x24c8), true + return {'\u24c8', 0}, 1, true case "oacgr": // GREEK SMALL LETTER OMICRON WITH TONOS - return rune(0x03cc), true + return {'\u03cc', 0}, 1, true case "oacute": // LATIN SMALL LETTER O WITH ACUTE - return rune(0xf3), true + return {'ó', 0}, 1, true case "oast": // CIRCLED ASTERISK OPERATOR - return rune(0x229b), true + return {'\u229b', 0}, 1, true case "obsol": // CIRCLED REVERSE SOLIDUS - return rune(0x29b8), true + return {'\u29b8', 0}, 1, true case "ocir": // CIRCLED RING OPERATOR - return rune(0x229a), true + return {'\u229a', 0}, 1, true case "ocirc": // LATIN SMALL LETTER O WITH CIRCUMFLEX - return rune(0xf4), true + return {'ô', 0}, 1, true case "ocy": // CYRILLIC SMALL LETTER O - return rune(0x043e), true + return {'\u043e', 0}, 1, true case "odash": // CIRCLED DASH - return rune(0x229d), true + return {'\u229d', 0}, 1, true case "odblac": // LATIN SMALL LETTER O WITH DOUBLE ACUTE - return rune(0x0151), true + return {'\u0151', 0}, 1, true case "odiv": // CIRCLED DIVISION SIGN - return rune(0x2a38), true + return {'\u2a38', 0}, 1, true case "odot": // CIRCLED DOT OPERATOR - return rune(0x2299), true + return {'\u2299', 0}, 1, true case "odsold": // CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN - return rune(0x29bc), true + return {'\u29bc', 0}, 1, true case "oelig": // LATIN SMALL LIGATURE OE - return rune(0x0153), true + return {'\u0153', 0}, 1, true case "ofcir": // CIRCLED BULLET - return rune(0x29bf), true + return {'\u29bf', 0}, 1, true case "ofr": // MATHEMATICAL FRAKTUR SMALL O - return rune(0x01d52c), true + return {'\U0001d52c', 0}, 1, true case "ogon": // OGONEK - return rune(0x02db), true + return {'\u02db', 0}, 1, true case "ogr": // GREEK SMALL LETTER OMICRON - return rune(0x03bf), true + return {'\u03bf', 0}, 1, true case "ograve": // LATIN SMALL LETTER O WITH GRAVE - return rune(0xf2), true + return {'ò', 0}, 1, true case "ogt": // CIRCLED GREATER-THAN - return rune(0x29c1), true + return {'\u29c1', 0}, 1, true case "ohacgr": // GREEK SMALL LETTER OMEGA WITH TONOS - return rune(0x03ce), true + return {'\u03ce', 0}, 1, true case "ohbar": // CIRCLE WITH HORIZONTAL BAR - return rune(0x29b5), true + return {'\u29b5', 0}, 1, true case "ohgr": // GREEK SMALL LETTER OMEGA - return rune(0x03c9), true + return {'\u03c9', 0}, 1, true case "ohm": // GREEK CAPITAL LETTER OMEGA - return rune(0x03a9), true + return {'\u03a9', 0}, 1, true case "oint": // CONTOUR INTEGRAL - return rune(0x222e), true + return {'\u222e', 0}, 1, true case "olarr": // ANTICLOCKWISE OPEN CIRCLE ARROW - return rune(0x21ba), true + return {'\u21ba', 0}, 1, true case "olcir": // CIRCLED WHITE BULLET - return rune(0x29be), true + return {'\u29be', 0}, 1, true case "olcross": // CIRCLE WITH SUPERIMPOSED X - return rune(0x29bb), true + return {'\u29bb', 0}, 1, true case "oline": // OVERLINE - return rune(0x203e), true + return {'\u203e', 0}, 1, true case "olt": // CIRCLED LESS-THAN - return rune(0x29c0), true + return {'\u29c0', 0}, 1, true case "omacr": // LATIN SMALL LETTER O WITH MACRON - return rune(0x014d), true + return {'\u014d', 0}, 1, true case "omega": // GREEK SMALL LETTER OMEGA - return rune(0x03c9), true + return {'\u03c9', 0}, 1, true case "omicron": // GREEK SMALL LETTER OMICRON - return rune(0x03bf), true + return {'\u03bf', 0}, 1, true case "omid": // CIRCLED VERTICAL BAR - return rune(0x29b6), true + return {'\u29b6', 0}, 1, true case "ominus": // CIRCLED MINUS - return rune(0x2296), true + return {'\u2296', 0}, 1, true case "oopf": // MATHEMATICAL DOUBLE-STRUCK SMALL O - return rune(0x01d560), true + return {'\U0001d560', 0}, 1, true case "opar": // CIRCLED PARALLEL - return rune(0x29b7), true + return {'\u29b7', 0}, 1, true case "operp": // CIRCLED PERPENDICULAR - return rune(0x29b9), true + return {'\u29b9', 0}, 1, true case "opfgamma": // DOUBLE-STRUCK SMALL GAMMA - return rune(0x213d), true + return {'\u213d', 0}, 1, true case "opfpi": // DOUBLE-STRUCK CAPITAL PI - return rune(0x213f), true + return {'\u213f', 0}, 1, true case "opfsum": // DOUBLE-STRUCK N-ARY SUMMATION - return rune(0x2140), true + return {'\u2140', 0}, 1, true case "oplus": // CIRCLED PLUS - return rune(0x2295), true + return {'\u2295', 0}, 1, true case "or": // LOGICAL OR - return rune(0x2228), true + return {'\u2228', 0}, 1, true case "orarr": // CLOCKWISE OPEN CIRCLE ARROW - return rune(0x21bb), true + return {'\u21bb', 0}, 1, true case "ord": // LOGICAL OR WITH HORIZONTAL DASH - return rune(0x2a5d), true + return {'\u2a5d', 0}, 1, true case "order": // SCRIPT SMALL O - return rune(0x2134), true + return {'\u2134', 0}, 1, true case "orderof": // SCRIPT SMALL O - return rune(0x2134), true + return {'\u2134', 0}, 1, true case "ordf": // FEMININE ORDINAL INDICATOR - return rune(0xaa), true + return {'ª', 0}, 1, true case "ordm": // MASCULINE ORDINAL INDICATOR - return rune(0xba), true + return {'º', 0}, 1, true case "origof": // ORIGINAL OF - return rune(0x22b6), true + return {'\u22b6', 0}, 1, true case "oror": // TWO INTERSECTING LOGICAL OR - return rune(0x2a56), true + return {'\u2a56', 0}, 1, true case "orslope": // SLOPING LARGE OR - return rune(0x2a57), true + return {'\u2a57', 0}, 1, true case "orv": // LOGICAL OR WITH MIDDLE STEM - return rune(0x2a5b), true + return {'\u2a5b', 0}, 1, true case "oscr": // SCRIPT SMALL O - return rune(0x2134), true + return {'\u2134', 0}, 1, true case "oslash": // LATIN SMALL LETTER O WITH STROKE - return rune(0xf8), true + return {'ø', 0}, 1, true case "osol": // CIRCLED DIVISION SLASH - return rune(0x2298), true + return {'\u2298', 0}, 1, true case "otilde": // LATIN SMALL LETTER O WITH TILDE - return rune(0xf5), true + return {'õ', 0}, 1, true case "otimes": // CIRCLED TIMES - return rune(0x2297), true + return {'\u2297', 0}, 1, true case "otimesas": // CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT - return rune(0x2a36), true + return {'\u2a36', 0}, 1, true case "ouml": // LATIN SMALL LETTER O WITH DIAERESIS - return rune(0xf6), true + return {'ö', 0}, 1, true case "ovbar": // APL FUNCTIONAL SYMBOL CIRCLE STILE - return rune(0x233d), true + return {'\u233d', 0}, 1, true case "ovrbrk": // TOP SQUARE BRACKET - return rune(0x23b4), true + return {'\u23b4', 0}, 1, true case "ovrcub": // TOP CURLY BRACKET - return rune(0x23de), true + return {'\u23de', 0}, 1, true case "ovrpar": // TOP PARENTHESIS - return rune(0x23dc), true + return {'\u23dc', 0}, 1, true case "oxuarr": // UP ARROW THROUGH CIRCLE - return rune(0x29bd), true + return {'\u29bd', 0}, 1, true } case 'p': switch name { case "par": // PARALLEL TO - return rune(0x2225), true + return {'\u2225', 0}, 1, true case "para": // PILCROW SIGN - return rune(0xb6), true + return {'¶', 0}, 1, true case "parallel": // PARALLEL TO - return rune(0x2225), true + return {'\u2225', 0}, 1, true case "parsim": // PARALLEL WITH TILDE OPERATOR - return rune(0x2af3), true + return {'\u2af3', 0}, 1, true case "parsl": // DOUBLE SOLIDUS OPERATOR - return rune(0x2afd), true + return {'\u2afd', 0}, 1, true case "part": // PARTIAL DIFFERENTIAL - return rune(0x2202), true + return {'\u2202', 0}, 1, true case "pcy": // CYRILLIC SMALL LETTER PE - return rune(0x043f), true + return {'\u043f', 0}, 1, true case "percnt": // PERCENT SIGN - return rune(0x25), true + return {'%', 0}, 1, true case "period": // FULL STOP - return rune(0x2e), true + return {'.', 0}, 1, true case "permil": // PER MILLE SIGN - return rune(0x2030), true + return {'\u2030', 0}, 1, true case "perp": // UP TACK - return rune(0x22a5), true + return {'\u22a5', 0}, 1, true case "pertenk": // PER TEN THOUSAND SIGN - return rune(0x2031), true + return {'\u2031', 0}, 1, true case "pfr": // MATHEMATICAL FRAKTUR SMALL P - return rune(0x01d52d), true + return {'\U0001d52d', 0}, 1, true case "pgr": // GREEK SMALL LETTER PI - return rune(0x03c0), true + return {'\u03c0', 0}, 1, true case "phgr": // GREEK SMALL LETTER PHI - return rune(0x03c6), true + return {'\u03c6', 0}, 1, true case "phi": // GREEK SMALL LETTER PHI - return rune(0x03c6), true + return {'\u03c6', 0}, 1, true case "phis": // GREEK PHI SYMBOL - return rune(0x03d5), true + return {'\u03d5', 0}, 1, true case "phiv": // GREEK PHI SYMBOL - return rune(0x03d5), true + return {'\u03d5', 0}, 1, true case "phmmat": // SCRIPT CAPITAL M - return rune(0x2133), true + return {'\u2133', 0}, 1, true case "phone": // BLACK TELEPHONE - return rune(0x260e), true + return {'\u260e', 0}, 1, true case "pi": // GREEK SMALL LETTER PI - return rune(0x03c0), true + return {'\u03c0', 0}, 1, true case "pitchfork": // PITCHFORK - return rune(0x22d4), true + return {'\u22d4', 0}, 1, true case "piv": // GREEK PI SYMBOL - return rune(0x03d6), true + return {'\u03d6', 0}, 1, true case "planck": // PLANCK CONSTANT OVER TWO PI - return rune(0x210f), true + return {'\u210f', 0}, 1, true case "planckh": // PLANCK CONSTANT - return rune(0x210e), true + return {'\u210e', 0}, 1, true case "plankv": // PLANCK CONSTANT OVER TWO PI - return rune(0x210f), true + return {'\u210f', 0}, 1, true case "plus": // PLUS SIGN - return rune(0x2b), true + return {'+', 0}, 1, true case "plusacir": // PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE - return rune(0x2a23), true + return {'\u2a23', 0}, 1, true case "plusb": // SQUARED PLUS - return rune(0x229e), true + return {'\u229e', 0}, 1, true case "pluscir": // PLUS SIGN WITH SMALL CIRCLE ABOVE - return rune(0x2a22), true + return {'\u2a22', 0}, 1, true case "plusdo": // DOT PLUS - return rune(0x2214), true + return {'\u2214', 0}, 1, true case "plusdu": // PLUS SIGN WITH DOT BELOW - return rune(0x2a25), true + return {'\u2a25', 0}, 1, true case "pluse": // PLUS SIGN ABOVE EQUALS SIGN - return rune(0x2a72), true + return {'\u2a72', 0}, 1, true case "plusmn": // PLUS-MINUS SIGN - return rune(0xb1), true + return {'±', 0}, 1, true case "plussim": // PLUS SIGN WITH TILDE BELOW - return rune(0x2a26), true + return {'\u2a26', 0}, 1, true case "plustrif": // PLUS SIGN WITH BLACK TRIANGLE - return rune(0x2a28), true + return {'\u2a28', 0}, 1, true case "plustwo": // PLUS SIGN WITH SUBSCRIPT TWO - return rune(0x2a27), true + return {'\u2a27', 0}, 1, true case "pm": // PLUS-MINUS SIGN - return rune(0xb1), true + return {'±', 0}, 1, true case "pointint": // INTEGRAL AROUND A POINT OPERATOR - return rune(0x2a15), true + return {'\u2a15', 0}, 1, true case "popf": // MATHEMATICAL DOUBLE-STRUCK SMALL P - return rune(0x01d561), true + return {'\U0001d561', 0}, 1, true case "pound": // POUND SIGN - return rune(0xa3), true + return {'£', 0}, 1, true case "pr": // PRECEDES - return rune(0x227a), true + return {'\u227a', 0}, 1, true case "prE": // PRECEDES ABOVE EQUALS SIGN - return rune(0x2ab3), true + return {'\u2ab3', 0}, 1, true case "prap": // PRECEDES ABOVE ALMOST EQUAL TO - return rune(0x2ab7), true + return {'\u2ab7', 0}, 1, true case "prcue": // PRECEDES OR EQUAL TO - return rune(0x227c), true + return {'\u227c', 0}, 1, true case "pre": // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN - return rune(0x2aaf), true + return {'\u2aaf', 0}, 1, true case "prec": // PRECEDES - return rune(0x227a), true + return {'\u227a', 0}, 1, true case "precapprox": // PRECEDES ABOVE ALMOST EQUAL TO - return rune(0x2ab7), true + return {'\u2ab7', 0}, 1, true case "preccurlyeq": // PRECEDES OR EQUAL TO - return rune(0x227c), true + return {'\u227c', 0}, 1, true case "preceq": // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN - return rune(0x2aaf), true + return {'\u2aaf', 0}, 1, true case "precnapprox": // PRECEDES ABOVE NOT ALMOST EQUAL TO - return rune(0x2ab9), true + return {'\u2ab9', 0}, 1, true case "precneqq": // PRECEDES ABOVE NOT EQUAL TO - return rune(0x2ab5), true + return {'\u2ab5', 0}, 1, true case "precnsim": // PRECEDES BUT NOT EQUIVALENT TO - return rune(0x22e8), true + return {'\u22e8', 0}, 1, true case "precsim": // PRECEDES OR EQUIVALENT TO - return rune(0x227e), true + return {'\u227e', 0}, 1, true case "prime": // PRIME - return rune(0x2032), true + return {'\u2032', 0}, 1, true case "primes": // DOUBLE-STRUCK CAPITAL P - return rune(0x2119), true + return {'\u2119', 0}, 1, true case "prnE": // PRECEDES ABOVE NOT EQUAL TO - return rune(0x2ab5), true + return {'\u2ab5', 0}, 1, true case "prnap": // PRECEDES ABOVE NOT ALMOST EQUAL TO - return rune(0x2ab9), true + return {'\u2ab9', 0}, 1, true case "prnsim": // PRECEDES BUT NOT EQUIVALENT TO - return rune(0x22e8), true + return {'\u22e8', 0}, 1, true case "prod": // N-ARY PRODUCT - return rune(0x220f), true + return {'\u220f', 0}, 1, true case "profalar": // ALL AROUND-PROFILE - return rune(0x232e), true + return {'\u232e', 0}, 1, true case "profline": // ARC - return rune(0x2312), true + return {'\u2312', 0}, 1, true case "profsurf": // SEGMENT - return rune(0x2313), true + return {'\u2313', 0}, 1, true case "prop": // PROPORTIONAL TO - return rune(0x221d), true + return {'\u221d', 0}, 1, true case "propto": // PROPORTIONAL TO - return rune(0x221d), true + return {'\u221d', 0}, 1, true case "prsim": // PRECEDES OR EQUIVALENT TO - return rune(0x227e), true + return {'\u227e', 0}, 1, true case "prurel": // PRECEDES UNDER RELATION - return rune(0x22b0), true + return {'\u22b0', 0}, 1, true case "pscr": // MATHEMATICAL SCRIPT SMALL P - return rune(0x01d4c5), true + return {'\U0001d4c5', 0}, 1, true case "psgr": // GREEK SMALL LETTER PSI - return rune(0x03c8), true + return {'\u03c8', 0}, 1, true case "psi": // GREEK SMALL LETTER PSI - return rune(0x03c8), true + return {'\u03c8', 0}, 1, true case "puncsp": // PUNCTUATION SPACE - return rune(0x2008), true + return {'\u2008', 0}, 1, true } case 'q': switch name { case "qfr": // MATHEMATICAL FRAKTUR SMALL Q - return rune(0x01d52e), true + return {'\U0001d52e', 0}, 1, true case "qint": // QUADRUPLE INTEGRAL OPERATOR - return rune(0x2a0c), true + return {'\u2a0c', 0}, 1, true case "qopf": // MATHEMATICAL DOUBLE-STRUCK SMALL Q - return rune(0x01d562), true + return {'\U0001d562', 0}, 1, true case "qprime": // QUADRUPLE PRIME - return rune(0x2057), true + return {'\u2057', 0}, 1, true case "qscr": // MATHEMATICAL SCRIPT SMALL Q - return rune(0x01d4c6), true + return {'\U0001d4c6', 0}, 1, true case "quaternions": // DOUBLE-STRUCK CAPITAL H - return rune(0x210d), true + return {'\u210d', 0}, 1, true case "quatint": // QUATERNION INTEGRAL OPERATOR - return rune(0x2a16), true + return {'\u2a16', 0}, 1, true case "quest": // QUESTION MARK - return rune(0x3f), true + return {'?', 0}, 1, true case "questeq": // QUESTIONED EQUAL TO - return rune(0x225f), true + return {'\u225f', 0}, 1, true case "quot": // QUOTATION MARK - return rune(0x22), true + return {'"', 0}, 1, true } case 'r': switch name { case "rAarr": // RIGHTWARDS TRIPLE ARROW - return rune(0x21db), true + return {'\u21db', 0}, 1, true case "rArr": // RIGHTWARDS DOUBLE ARROW - return rune(0x21d2), true + return {'\u21d2', 0}, 1, true case "rAtail": // RIGHTWARDS DOUBLE ARROW-TAIL - return rune(0x291c), true + return {'\u291c', 0}, 1, true case "rBarr": // RIGHTWARDS TRIPLE DASH ARROW - return rune(0x290f), true + return {'\u290f', 0}, 1, true case "rHar": // RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN - return rune(0x2964), true + return {'\u2964', 0}, 1, true case "race": // REVERSED TILDE with underline - return rune(0x223d), true + return {'\u223d', '\u223d'}, 2, true case "racute": // LATIN SMALL LETTER R WITH ACUTE - return rune(0x0155), true + return {'\u0155', 0}, 1, true case "radic": // SQUARE ROOT - return rune(0x221a), true + return {'\u221a', 0}, 1, true case "raemptyv": // EMPTY SET WITH RIGHT ARROW ABOVE - return rune(0x29b3), true + return {'\u29b3', 0}, 1, true case "rang": // MATHEMATICAL RIGHT ANGLE BRACKET - return rune(0x27e9), true + return {'\u27e9', 0}, 1, true case "rangd": // RIGHT ANGLE BRACKET WITH DOT - return rune(0x2992), true + return {'\u2992', 0}, 1, true case "range": // REVERSED ANGLE WITH UNDERBAR - return rune(0x29a5), true + return {'\u29a5', 0}, 1, true case "rangle": // MATHEMATICAL RIGHT ANGLE BRACKET - return rune(0x27e9), true + return {'\u27e9', 0}, 1, true case "raquo": // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - return rune(0xbb), true + return {'»', 0}, 1, true case "rarr": // RIGHTWARDS ARROW - return rune(0x2192), true + return {'\u2192', 0}, 1, true case "rarr2": // RIGHTWARDS PAIRED ARROWS - return rune(0x21c9), true + return {'\u21c9', 0}, 1, true case "rarr3": // THREE RIGHTWARDS ARROWS - return rune(0x21f6), true + return {'\u21f6', 0}, 1, true case "rarrap": // RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO - return rune(0x2975), true + return {'\u2975', 0}, 1, true case "rarrb": // RIGHTWARDS ARROW TO BAR - return rune(0x21e5), true + return {'\u21e5', 0}, 1, true case "rarrbfs": // RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND - return rune(0x2920), true + return {'\u2920', 0}, 1, true case "rarrc": // WAVE ARROW POINTING DIRECTLY RIGHT - return rune(0x2933), true + return {'\u2933', 0}, 1, true case "rarrfs": // RIGHTWARDS ARROW TO BLACK DIAMOND - return rune(0x291e), true + return {'\u291e', 0}, 1, true case "rarrhk": // RIGHTWARDS ARROW WITH HOOK - return rune(0x21aa), true + return {'\u21aa', 0}, 1, true case "rarrlp": // RIGHTWARDS ARROW WITH LOOP - return rune(0x21ac), true + return {'\u21ac', 0}, 1, true case "rarrpl": // RIGHTWARDS ARROW WITH PLUS BELOW - return rune(0x2945), true + return {'\u2945', 0}, 1, true case "rarrsim": // RIGHTWARDS ARROW ABOVE TILDE OPERATOR - return rune(0x2974), true + return {'\u2974', 0}, 1, true case "rarrtl": // RIGHTWARDS ARROW WITH TAIL - return rune(0x21a3), true + return {'\u21a3', 0}, 1, true case "rarrw": // RIGHTWARDS WAVE ARROW - return rune(0x219d), true + return {'\u219d', 0}, 1, true case "rarrx": // RIGHTWARDS ARROW THROUGH X - return rune(0x2947), true + return {'\u2947', 0}, 1, true case "ratail": // RIGHTWARDS ARROW-TAIL - return rune(0x291a), true + return {'\u291a', 0}, 1, true case "ratio": // RATIO - return rune(0x2236), true + return {'\u2236', 0}, 1, true case "rationals": // DOUBLE-STRUCK CAPITAL Q - return rune(0x211a), true + return {'\u211a', 0}, 1, true case "rbarr": // RIGHTWARDS DOUBLE DASH ARROW - return rune(0x290d), true + return {'\u290d', 0}, 1, true case "rbbrk": // LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT - return rune(0x2773), true + return {'\u2773', 0}, 1, true case "rbrace": // RIGHT CURLY BRACKET - return rune(0x7d), true + return {'}', 0}, 1, true case "rbrack": // RIGHT SQUARE BRACKET - return rune(0x5d), true + return {']', 0}, 1, true case "rbrke": // RIGHT SQUARE BRACKET WITH UNDERBAR - return rune(0x298c), true + return {'\u298c', 0}, 1, true case "rbrksld": // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER - return rune(0x298e), true + return {'\u298e', 0}, 1, true case "rbrkslu": // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER - return rune(0x2990), true + return {'\u2990', 0}, 1, true case "rcaron": // LATIN SMALL LETTER R WITH CARON - return rune(0x0159), true + return {'\u0159', 0}, 1, true case "rcedil": // LATIN SMALL LETTER R WITH CEDILLA - return rune(0x0157), true + return {'\u0157', 0}, 1, true case "rceil": // RIGHT CEILING - return rune(0x2309), true + return {'\u2309', 0}, 1, true case "rcub": // RIGHT CURLY BRACKET - return rune(0x7d), true + return {'}', 0}, 1, true case "rcy": // CYRILLIC SMALL LETTER ER - return rune(0x0440), true + return {'\u0440', 0}, 1, true case "rdca": // ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS - return rune(0x2937), true + return {'\u2937', 0}, 1, true case "rdharb": // RIGHTWARDS HARPOON WITH BARB DOWN TO BAR - return rune(0x2957), true + return {'\u2957', 0}, 1, true case "rdiag": // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT - return rune(0x2571), true + return {'\u2571', 0}, 1, true case "rdiofdi": // RISING DIAGONAL CROSSING FALLING DIAGONAL - return rune(0x292b), true + return {'\u292b', 0}, 1, true case "rdldhar": // RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN - return rune(0x2969), true + return {'\u2969', 0}, 1, true case "rdosearr": // RISING DIAGONAL CROSSING SOUTH EAST ARROW - return rune(0x2930), true + return {'\u2930', 0}, 1, true case "rdquo": // RIGHT DOUBLE QUOTATION MARK - return rune(0x201d), true + return {'\u201d', 0}, 1, true case "rdquor": // RIGHT DOUBLE QUOTATION MARK - return rune(0x201d), true + return {'\u201d', 0}, 1, true case "rdsh": // DOWNWARDS ARROW WITH TIP RIGHTWARDS - return rune(0x21b3), true + return {'\u21b3', 0}, 1, true case "real": // BLACK-LETTER CAPITAL R - return rune(0x211c), true + return {'\u211c', 0}, 1, true case "realine": // SCRIPT CAPITAL R - return rune(0x211b), true + return {'\u211b', 0}, 1, true case "realpart": // BLACK-LETTER CAPITAL R - return rune(0x211c), true + return {'\u211c', 0}, 1, true case "reals": // DOUBLE-STRUCK CAPITAL R - return rune(0x211d), true + return {'\u211d', 0}, 1, true case "rect": // WHITE RECTANGLE - return rune(0x25ad), true + return {'\u25ad', 0}, 1, true case "reg": // REGISTERED SIGN - return rune(0xae), true + return {'®', 0}, 1, true case "rfbowtie": // BOWTIE WITH RIGHT HALF BLACK - return rune(0x29d2), true + return {'\u29d2', 0}, 1, true case "rfisht": // RIGHT FISH TAIL - return rune(0x297d), true + return {'\u297d', 0}, 1, true case "rfloor": // RIGHT FLOOR - return rune(0x230b), true + return {'\u230b', 0}, 1, true case "rfr": // MATHEMATICAL FRAKTUR SMALL R - return rune(0x01d52f), true + return {'\U0001d52f', 0}, 1, true case "rftimes": // TIMES WITH RIGHT HALF BLACK - return rune(0x29d5), true + return {'\u29d5', 0}, 1, true case "rgr": // GREEK SMALL LETTER RHO - return rune(0x03c1), true + return {'\u03c1', 0}, 1, true case "rhard": // RIGHTWARDS HARPOON WITH BARB DOWNWARDS - return rune(0x21c1), true + return {'\u21c1', 0}, 1, true case "rharu": // RIGHTWARDS HARPOON WITH BARB UPWARDS - return rune(0x21c0), true + return {'\u21c0', 0}, 1, true case "rharul": // RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH - return rune(0x296c), true + return {'\u296c', 0}, 1, true case "rho": // GREEK SMALL LETTER RHO - return rune(0x03c1), true + return {'\u03c1', 0}, 1, true case "rhov": // GREEK RHO SYMBOL - return rune(0x03f1), true + return {'\u03f1', 0}, 1, true case "rightarrow": // RIGHTWARDS ARROW - return rune(0x2192), true + return {'\u2192', 0}, 1, true case "rightarrowtail": // RIGHTWARDS ARROW WITH TAIL - return rune(0x21a3), true + return {'\u21a3', 0}, 1, true case "rightharpoondown": // RIGHTWARDS HARPOON WITH BARB DOWNWARDS - return rune(0x21c1), true + return {'\u21c1', 0}, 1, true case "rightharpoonup": // RIGHTWARDS HARPOON WITH BARB UPWARDS - return rune(0x21c0), true + return {'\u21c0', 0}, 1, true case "rightleftarrows": // RIGHTWARDS ARROW OVER LEFTWARDS ARROW - return rune(0x21c4), true + return {'\u21c4', 0}, 1, true case "rightleftharpoons": // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON - return rune(0x21cc), true + return {'\u21cc', 0}, 1, true case "rightrightarrows": // RIGHTWARDS PAIRED ARROWS - return rune(0x21c9), true + return {'\u21c9', 0}, 1, true case "rightsquigarrow": // RIGHTWARDS WAVE ARROW - return rune(0x219d), true + return {'\u219d', 0}, 1, true case "rightthreetimes": // RIGHT SEMIDIRECT PRODUCT - return rune(0x22cc), true + return {'\u22cc', 0}, 1, true case "rimply": // RIGHT DOUBLE ARROW WITH ROUNDED HEAD - return rune(0x2970), true + return {'\u2970', 0}, 1, true case "ring": // RING ABOVE - return rune(0x02da), true + return {'\u02da', 0}, 1, true case "risingdotseq": // IMAGE OF OR APPROXIMATELY EQUAL TO - return rune(0x2253), true + return {'\u2253', 0}, 1, true case "rlarr": // RIGHTWARDS ARROW OVER LEFTWARDS ARROW - return rune(0x21c4), true + return {'\u21c4', 0}, 1, true case "rlarr2": // RIGHTWARDS ARROW OVER LEFTWARDS ARROW - return rune(0x21c4), true + return {'\u21c4', 0}, 1, true case "rlhar": // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON - return rune(0x21cc), true + return {'\u21cc', 0}, 1, true case "rlhar2": // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON - return rune(0x21cc), true + return {'\u21cc', 0}, 1, true case "rlm": // RIGHT-TO-LEFT MARK - return rune(0x200f), true + return {'\u200f', 0}, 1, true case "rmoust": // UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION - return rune(0x23b1), true + return {'\u23b1', 0}, 1, true case "rmoustache": // UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION - return rune(0x23b1), true + return {'\u23b1', 0}, 1, true case "rnmid": // DOES NOT DIVIDE WITH REVERSED NEGATION SLASH - return rune(0x2aee), true + return {'\u2aee', 0}, 1, true case "roang": // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET - return rune(0x27ed), true + return {'\u27ed', 0}, 1, true case "roarr": // RIGHTWARDS OPEN-HEADED ARROW - return rune(0x21fe), true + return {'\u21fe', 0}, 1, true case "robrk": // MATHEMATICAL RIGHT WHITE SQUARE BRACKET - return rune(0x27e7), true + return {'\u27e7', 0}, 1, true case "rocub": // RIGHT WHITE CURLY BRACKET - return rune(0x2984), true + return {'\u2984', 0}, 1, true case "ropar": // RIGHT WHITE PARENTHESIS - return rune(0x2986), true + return {'\u2986', 0}, 1, true case "ropf": // MATHEMATICAL DOUBLE-STRUCK SMALL R - return rune(0x01d563), true + return {'\U0001d563', 0}, 1, true case "roplus": // PLUS SIGN IN RIGHT HALF CIRCLE - return rune(0x2a2e), true + return {'\u2a2e', 0}, 1, true case "rotimes": // MULTIPLICATION SIGN IN RIGHT HALF CIRCLE - return rune(0x2a35), true + return {'\u2a35', 0}, 1, true case "rpar": // RIGHT PARENTHESIS - return rune(0x29), true + return {')', 0}, 1, true case "rpargt": // RIGHT ARC GREATER-THAN BRACKET - return rune(0x2994), true + return {'\u2994', 0}, 1, true case "rppolint": // LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE - return rune(0x2a12), true + return {'\u2a12', 0}, 1, true case "rrarr": // RIGHTWARDS PAIRED ARROWS - return rune(0x21c9), true + return {'\u21c9', 0}, 1, true case "rsaquo": // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - return rune(0x203a), true + return {'\u203a', 0}, 1, true case "rscr": // MATHEMATICAL SCRIPT SMALL R - return rune(0x01d4c7), true + return {'\U0001d4c7', 0}, 1, true case "rsh": // UPWARDS ARROW WITH TIP RIGHTWARDS - return rune(0x21b1), true + return {'\u21b1', 0}, 1, true case "rsolbar": // REVERSE SOLIDUS WITH HORIZONTAL STROKE - return rune(0x29f7), true + return {'\u29f7', 0}, 1, true case "rsqb": // RIGHT SQUARE BRACKET - return rune(0x5d), true + return {']', 0}, 1, true case "rsquo": // RIGHT SINGLE QUOTATION MARK - return rune(0x2019), true + return {'\u2019', 0}, 1, true case "rsquor": // RIGHT SINGLE QUOTATION MARK - return rune(0x2019), true + return {'\u2019', 0}, 1, true case "rthree": // RIGHT SEMIDIRECT PRODUCT - return rune(0x22cc), true + return {'\u22cc', 0}, 1, true case "rtimes": // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT - return rune(0x22ca), true + return {'\u22ca', 0}, 1, true case "rtri": // WHITE RIGHT-POINTING SMALL TRIANGLE - return rune(0x25b9), true + return {'\u25b9', 0}, 1, true case "rtrie": // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO - return rune(0x22b5), true + return {'\u22b5', 0}, 1, true case "rtrif": // BLACK RIGHT-POINTING SMALL TRIANGLE - return rune(0x25b8), true + return {'\u25b8', 0}, 1, true case "rtriltri": // RIGHT TRIANGLE ABOVE LEFT TRIANGLE - return rune(0x29ce), true + return {'\u29ce', 0}, 1, true case "ruharb": // RIGHTWARDS HARPOON WITH BARB UP TO BAR - return rune(0x2953), true + return {'\u2953', 0}, 1, true case "ruluhar": // RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP - return rune(0x2968), true + return {'\u2968', 0}, 1, true case "rx": // PRESCRIPTION TAKE - return rune(0x211e), true + return {'\u211e', 0}, 1, true } case 's': switch name { case "sacute": // LATIN SMALL LETTER S WITH ACUTE - return rune(0x015b), true + return {'\u015b', 0}, 1, true case "samalg": // N-ARY COPRODUCT - return rune(0x2210), true + return {'\u2210', 0}, 1, true case "sampi": // GREEK LETTER SAMPI - return rune(0x03e0), true + return {'\u03e0', 0}, 1, true case "sbquo": // SINGLE LOW-9 QUOTATION MARK - return rune(0x201a), true + return {'\u201a', 0}, 1, true case "sbsol": // SMALL REVERSE SOLIDUS - return rune(0xfe68), true + return {'\ufe68', 0}, 1, true case "sc": // SUCCEEDS - return rune(0x227b), true + return {'\u227b', 0}, 1, true case "scE": // SUCCEEDS ABOVE EQUALS SIGN - return rune(0x2ab4), true + return {'\u2ab4', 0}, 1, true case "scap": // SUCCEEDS ABOVE ALMOST EQUAL TO - return rune(0x2ab8), true + return {'\u2ab8', 0}, 1, true case "scaron": // LATIN SMALL LETTER S WITH CARON - return rune(0x0161), true + return {'\u0161', 0}, 1, true case "sccue": // SUCCEEDS OR EQUAL TO - return rune(0x227d), true + return {'\u227d', 0}, 1, true case "sce": // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN - return rune(0x2ab0), true + return {'\u2ab0', 0}, 1, true case "scedil": // LATIN SMALL LETTER S WITH CEDILLA - return rune(0x015f), true + return {'\u015f', 0}, 1, true case "scirc": // LATIN SMALL LETTER S WITH CIRCUMFLEX - return rune(0x015d), true + return {'\u015d', 0}, 1, true case "scnE": // SUCCEEDS ABOVE NOT EQUAL TO - return rune(0x2ab6), true + return {'\u2ab6', 0}, 1, true case "scnap": // SUCCEEDS ABOVE NOT ALMOST EQUAL TO - return rune(0x2aba), true + return {'\u2aba', 0}, 1, true case "scnsim": // SUCCEEDS BUT NOT EQUIVALENT TO - return rune(0x22e9), true + return {'\u22e9', 0}, 1, true case "scpolint": // LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE - return rune(0x2a13), true + return {'\u2a13', 0}, 1, true case "scsim": // SUCCEEDS OR EQUIVALENT TO - return rune(0x227f), true + return {'\u227f', 0}, 1, true case "scy": // CYRILLIC SMALL LETTER ES - return rune(0x0441), true + return {'\u0441', 0}, 1, true case "sdot": // DOT OPERATOR - return rune(0x22c5), true + return {'\u22c5', 0}, 1, true case "sdotb": // SQUARED DOT OPERATOR - return rune(0x22a1), true + return {'\u22a1', 0}, 1, true case "sdote": // EQUALS SIGN WITH DOT BELOW - return rune(0x2a66), true + return {'\u2a66', 0}, 1, true case "seArr": // SOUTH EAST DOUBLE ARROW - return rune(0x21d8), true + return {'\u21d8', 0}, 1, true case "searhk": // SOUTH EAST ARROW WITH HOOK - return rune(0x2925), true + return {'\u2925', 0}, 1, true case "searr": // SOUTH EAST ARROW - return rune(0x2198), true + return {'\u2198', 0}, 1, true case "searrow": // SOUTH EAST ARROW - return rune(0x2198), true + return {'\u2198', 0}, 1, true case "sect": // SECTION SIGN - return rune(0xa7), true + return {'§', 0}, 1, true case "semi": // SEMICOLON - return rune(0x3b), true + return {';', 0}, 1, true case "seonearr": // SOUTH EAST ARROW CROSSING NORTH EAST ARROW - return rune(0x292d), true + return {'\u292d', 0}, 1, true case "seswar": // SOUTH EAST ARROW AND SOUTH WEST ARROW - return rune(0x2929), true + return {'\u2929', 0}, 1, true case "setminus": // SET MINUS - return rune(0x2216), true + return {'\u2216', 0}, 1, true case "setmn": // SET MINUS - return rune(0x2216), true + return {'\u2216', 0}, 1, true case "sext": // SIX POINTED BLACK STAR - return rune(0x2736), true + return {'\u2736', 0}, 1, true case "sfgr": // GREEK SMALL LETTER FINAL SIGMA - return rune(0x03c2), true + return {'\u03c2', 0}, 1, true case "sfr": // MATHEMATICAL FRAKTUR SMALL S - return rune(0x01d530), true + return {'\U0001d530', 0}, 1, true case "sfrown": // FROWN - return rune(0x2322), true + return {'\u2322', 0}, 1, true case "sgr": // GREEK SMALL LETTER SIGMA - return rune(0x03c3), true + return {'\u03c3', 0}, 1, true case "sharp": // MUSIC SHARP SIGN - return rune(0x266f), true + return {'\u266f', 0}, 1, true case "shchcy": // CYRILLIC SMALL LETTER SHCHA - return rune(0x0449), true + return {'\u0449', 0}, 1, true case "shcy": // CYRILLIC SMALL LETTER SHA - return rune(0x0448), true + return {'\u0448', 0}, 1, true case "shortmid": // DIVIDES - return rune(0x2223), true + return {'\u2223', 0}, 1, true case "shortparallel": // PARALLEL TO - return rune(0x2225), true + return {'\u2225', 0}, 1, true case "shuffle": // SHUFFLE PRODUCT - return rune(0x29e2), true + return {'\u29e2', 0}, 1, true case "shy": // SOFT HYPHEN - return rune(0xad), true + return {'\u00ad', 0}, 1, true case "sigma": // GREEK SMALL LETTER SIGMA - return rune(0x03c3), true + return {'\u03c3', 0}, 1, true case "sigmaf": // GREEK SMALL LETTER FINAL SIGMA - return rune(0x03c2), true + return {'\u03c2', 0}, 1, true case "sigmav": // GREEK SMALL LETTER FINAL SIGMA - return rune(0x03c2), true + return {'\u03c2', 0}, 1, true case "sim": // TILDE OPERATOR - return rune(0x223c), true + return {'\u223c', 0}, 1, true case "simdot": // TILDE OPERATOR WITH DOT ABOVE - return rune(0x2a6a), true + return {'\u2a6a', 0}, 1, true case "sime": // ASYMPTOTICALLY EQUAL TO - return rune(0x2243), true + return {'\u2243', 0}, 1, true case "simeq": // ASYMPTOTICALLY EQUAL TO - return rune(0x2243), true + return {'\u2243', 0}, 1, true case "simg": // SIMILAR OR GREATER-THAN - return rune(0x2a9e), true + return {'\u2a9e', 0}, 1, true case "simgE": // SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN - return rune(0x2aa0), true + return {'\u2aa0', 0}, 1, true case "siml": // SIMILAR OR LESS-THAN - return rune(0x2a9d), true + return {'\u2a9d', 0}, 1, true case "simlE": // SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN - return rune(0x2a9f), true + return {'\u2a9f', 0}, 1, true case "simne": // APPROXIMATELY BUT NOT ACTUALLY EQUAL TO - return rune(0x2246), true + return {'\u2246', 0}, 1, true case "simplus": // PLUS SIGN WITH TILDE ABOVE - return rune(0x2a24), true + return {'\u2a24', 0}, 1, true case "simrarr": // TILDE OPERATOR ABOVE RIGHTWARDS ARROW - return rune(0x2972), true + return {'\u2972', 0}, 1, true case "slarr": // LEFTWARDS ARROW - return rune(0x2190), true + return {'\u2190', 0}, 1, true case "slint": // INTEGRAL AVERAGE WITH SLASH - return rune(0x2a0f), true + return {'\u2a0f', 0}, 1, true case "smallsetminus": // SET MINUS - return rune(0x2216), true + return {'\u2216', 0}, 1, true case "smashp": // SMASH PRODUCT - return rune(0x2a33), true + return {'\u2a33', 0}, 1, true case "smeparsl": // EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE - return rune(0x29e4), true + return {'\u29e4', 0}, 1, true case "smid": // DIVIDES - return rune(0x2223), true + return {'\u2223', 0}, 1, true case "smile": // SMILE - return rune(0x2323), true + return {'\u2323', 0}, 1, true case "smt": // SMALLER THAN - return rune(0x2aaa), true + return {'\u2aaa', 0}, 1, true case "smte": // SMALLER THAN OR EQUAL TO - return rune(0x2aac), true + return {'\u2aac', 0}, 1, true case "smtes": // SMALLER THAN OR slanted EQUAL - return rune(0x2aac), true + return {'\u2aac', '\u2aac'}, 2, true case "softcy": // CYRILLIC SMALL LETTER SOFT SIGN - return rune(0x044c), true + return {'\u044c', 0}, 1, true case "sol": // SOLIDUS - return rune(0x2f), true + return {'/', 0}, 1, true case "solb": // SQUARED RISING DIAGONAL SLASH - return rune(0x29c4), true + return {'\u29c4', 0}, 1, true case "solbar": // APL FUNCTIONAL SYMBOL SLASH BAR - return rune(0x233f), true + return {'\u233f', 0}, 1, true case "sopf": // MATHEMATICAL DOUBLE-STRUCK SMALL S - return rune(0x01d564), true + return {'\U0001d564', 0}, 1, true case "spades": // BLACK SPADE SUIT - return rune(0x2660), true + return {'\u2660', 0}, 1, true case "spadesuit": // BLACK SPADE SUIT - return rune(0x2660), true + return {'\u2660', 0}, 1, true case "spar": // PARALLEL TO - return rune(0x2225), true + return {'\u2225', 0}, 1, true case "sqcap": // SQUARE CAP - return rune(0x2293), true + return {'\u2293', 0}, 1, true case "sqcaps": // SQUARE CAP with serifs - return rune(0x2293), true + return {'\u2293', '\u2293'}, 2, true case "sqcup": // SQUARE CUP - return rune(0x2294), true + return {'\u2294', 0}, 1, true case "sqcups": // SQUARE CUP with serifs - return rune(0x2294), true + return {'\u2294', '\u2294'}, 2, true case "sqsub": // SQUARE IMAGE OF - return rune(0x228f), true + return {'\u228f', 0}, 1, true case "sqsube": // SQUARE IMAGE OF OR EQUAL TO - return rune(0x2291), true + return {'\u2291', 0}, 1, true case "sqsubset": // SQUARE IMAGE OF - return rune(0x228f), true + return {'\u228f', 0}, 1, true case "sqsubseteq": // SQUARE IMAGE OF OR EQUAL TO - return rune(0x2291), true + return {'\u2291', 0}, 1, true case "sqsup": // SQUARE ORIGINAL OF - return rune(0x2290), true + return {'\u2290', 0}, 1, true case "sqsupe": // SQUARE ORIGINAL OF OR EQUAL TO - return rune(0x2292), true + return {'\u2292', 0}, 1, true case "sqsupset": // SQUARE ORIGINAL OF - return rune(0x2290), true + return {'\u2290', 0}, 1, true case "sqsupseteq": // SQUARE ORIGINAL OF OR EQUAL TO - return rune(0x2292), true + return {'\u2292', 0}, 1, true case "squ": // WHITE SQUARE - return rune(0x25a1), true + return {'\u25a1', 0}, 1, true case "square": // WHITE SQUARE - return rune(0x25a1), true + return {'\u25a1', 0}, 1, true case "squarf": // BLACK SMALL SQUARE - return rune(0x25aa), true + return {'\u25aa', 0}, 1, true case "squb": // SQUARED SQUARE - return rune(0x29c8), true + return {'\u29c8', 0}, 1, true case "squerr": // ERROR-BARRED WHITE SQUARE - return rune(0x29ee), true + return {'\u29ee', 0}, 1, true case "squf": // BLACK SMALL SQUARE - return rune(0x25aa), true + return {'\u25aa', 0}, 1, true case "squferr": // ERROR-BARRED BLACK SQUARE - return rune(0x29ef), true + return {'\u29ef', 0}, 1, true case "srarr": // RIGHTWARDS ARROW - return rune(0x2192), true + return {'\u2192', 0}, 1, true case "sscr": // MATHEMATICAL SCRIPT SMALL S - return rune(0x01d4c8), true + return {'\U0001d4c8', 0}, 1, true case "ssetmn": // SET MINUS - return rune(0x2216), true + return {'\u2216', 0}, 1, true case "ssmile": // SMILE - return rune(0x2323), true + return {'\u2323', 0}, 1, true case "sstarf": // STAR OPERATOR - return rune(0x22c6), true + return {'\u22c6', 0}, 1, true case "star": // WHITE STAR - return rune(0x2606), true + return {'\u2606', 0}, 1, true case "starf": // BLACK STAR - return rune(0x2605), true + return {'\u2605', 0}, 1, true case "stigma": // GREEK LETTER STIGMA - return rune(0x03da), true + return {'\u03da', 0}, 1, true case "straightepsilon": // GREEK LUNATE EPSILON SYMBOL - return rune(0x03f5), true + return {'\u03f5', 0}, 1, true case "straightphi": // GREEK PHI SYMBOL - return rune(0x03d5), true + return {'\u03d5', 0}, 1, true case "strns": // MACRON - return rune(0xaf), true + return {'¯', 0}, 1, true case "sub": // SUBSET OF - return rune(0x2282), true + return {'\u2282', 0}, 1, true case "subE": // SUBSET OF ABOVE EQUALS SIGN - return rune(0x2ac5), true + return {'\u2ac5', 0}, 1, true case "subdot": // SUBSET WITH DOT - return rune(0x2abd), true + return {'\u2abd', 0}, 1, true case "sube": // SUBSET OF OR EQUAL TO - return rune(0x2286), true + return {'\u2286', 0}, 1, true case "subedot": // SUBSET OF OR EQUAL TO WITH DOT ABOVE - return rune(0x2ac3), true + return {'\u2ac3', 0}, 1, true case "submult": // SUBSET WITH MULTIPLICATION SIGN BELOW - return rune(0x2ac1), true + return {'\u2ac1', 0}, 1, true case "subnE": // SUBSET OF ABOVE NOT EQUAL TO - return rune(0x2acb), true + return {'\u2acb', 0}, 1, true case "subne": // SUBSET OF WITH NOT EQUAL TO - return rune(0x228a), true + return {'\u228a', 0}, 1, true case "subplus": // SUBSET WITH PLUS SIGN BELOW - return rune(0x2abf), true + return {'\u2abf', 0}, 1, true case "subrarr": // SUBSET ABOVE RIGHTWARDS ARROW - return rune(0x2979), true + return {'\u2979', 0}, 1, true case "subset": // SUBSET OF - return rune(0x2282), true + return {'\u2282', 0}, 1, true case "subseteq": // SUBSET OF OR EQUAL TO - return rune(0x2286), true + return {'\u2286', 0}, 1, true case "subseteqq": // SUBSET OF ABOVE EQUALS SIGN - return rune(0x2ac5), true + return {'\u2ac5', 0}, 1, true case "subsetneq": // SUBSET OF WITH NOT EQUAL TO - return rune(0x228a), true + return {'\u228a', 0}, 1, true case "subsetneqq": // SUBSET OF ABOVE NOT EQUAL TO - return rune(0x2acb), true + return {'\u2acb', 0}, 1, true case "subsim": // SUBSET OF ABOVE TILDE OPERATOR - return rune(0x2ac7), true + return {'\u2ac7', 0}, 1, true case "subsub": // SUBSET ABOVE SUBSET - return rune(0x2ad5), true + return {'\u2ad5', 0}, 1, true case "subsup": // SUBSET ABOVE SUPERSET - return rune(0x2ad3), true + return {'\u2ad3', 0}, 1, true case "succ": // SUCCEEDS - return rune(0x227b), true + return {'\u227b', 0}, 1, true case "succapprox": // SUCCEEDS ABOVE ALMOST EQUAL TO - return rune(0x2ab8), true + return {'\u2ab8', 0}, 1, true case "succcurlyeq": // SUCCEEDS OR EQUAL TO - return rune(0x227d), true + return {'\u227d', 0}, 1, true case "succeq": // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN - return rune(0x2ab0), true + return {'\u2ab0', 0}, 1, true case "succnapprox": // SUCCEEDS ABOVE NOT ALMOST EQUAL TO - return rune(0x2aba), true + return {'\u2aba', 0}, 1, true case "succneqq": // SUCCEEDS ABOVE NOT EQUAL TO - return rune(0x2ab6), true + return {'\u2ab6', 0}, 1, true case "succnsim": // SUCCEEDS BUT NOT EQUIVALENT TO - return rune(0x22e9), true + return {'\u22e9', 0}, 1, true case "succsim": // SUCCEEDS OR EQUIVALENT TO - return rune(0x227f), true + return {'\u227f', 0}, 1, true case "sum": // N-ARY SUMMATION - return rune(0x2211), true + return {'\u2211', 0}, 1, true case "sumint": // SUMMATION WITH INTEGRAL - return rune(0x2a0b), true + return {'\u2a0b', 0}, 1, true case "sung": // EIGHTH NOTE - return rune(0x266a), true + return {'\u266a', 0}, 1, true case "sup": // SUPERSET OF - return rune(0x2283), true + return {'\u2283', 0}, 1, true case "sup1": // SUPERSCRIPT ONE - return rune(0xb9), true + return {'¹', 0}, 1, true case "sup2": // SUPERSCRIPT TWO - return rune(0xb2), true + return {'²', 0}, 1, true case "sup3": // SUPERSCRIPT THREE - return rune(0xb3), true + return {'³', 0}, 1, true case "supE": // SUPERSET OF ABOVE EQUALS SIGN - return rune(0x2ac6), true + return {'\u2ac6', 0}, 1, true case "supdot": // SUPERSET WITH DOT - return rune(0x2abe), true + return {'\u2abe', 0}, 1, true case "supdsub": // SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET - return rune(0x2ad8), true + return {'\u2ad8', 0}, 1, true case "supe": // SUPERSET OF OR EQUAL TO - return rune(0x2287), true + return {'\u2287', 0}, 1, true case "supedot": // SUPERSET OF OR EQUAL TO WITH DOT ABOVE - return rune(0x2ac4), true + return {'\u2ac4', 0}, 1, true case "suphsol": // SUPERSET PRECEDING SOLIDUS - return rune(0x27c9), true + return {'\u27c9', 0}, 1, true case "suphsub": // SUPERSET BESIDE SUBSET - return rune(0x2ad7), true + return {'\u2ad7', 0}, 1, true case "suplarr": // SUPERSET ABOVE LEFTWARDS ARROW - return rune(0x297b), true + return {'\u297b', 0}, 1, true case "supmult": // SUPERSET WITH MULTIPLICATION SIGN BELOW - return rune(0x2ac2), true + return {'\u2ac2', 0}, 1, true case "supnE": // SUPERSET OF ABOVE NOT EQUAL TO - return rune(0x2acc), true + return {'\u2acc', 0}, 1, true case "supne": // SUPERSET OF WITH NOT EQUAL TO - return rune(0x228b), true + return {'\u228b', 0}, 1, true case "supplus": // SUPERSET WITH PLUS SIGN BELOW - return rune(0x2ac0), true + return {'\u2ac0', 0}, 1, true case "supset": // SUPERSET OF - return rune(0x2283), true + return {'\u2283', 0}, 1, true case "supseteq": // SUPERSET OF OR EQUAL TO - return rune(0x2287), true + return {'\u2287', 0}, 1, true case "supseteqq": // SUPERSET OF ABOVE EQUALS SIGN - return rune(0x2ac6), true + return {'\u2ac6', 0}, 1, true case "supsetneq": // SUPERSET OF WITH NOT EQUAL TO - return rune(0x228b), true + return {'\u228b', 0}, 1, true case "supsetneqq": // SUPERSET OF ABOVE NOT EQUAL TO - return rune(0x2acc), true + return {'\u2acc', 0}, 1, true case "supsim": // SUPERSET OF ABOVE TILDE OPERATOR - return rune(0x2ac8), true + return {'\u2ac8', 0}, 1, true case "supsub": // SUPERSET ABOVE SUBSET - return rune(0x2ad4), true + return {'\u2ad4', 0}, 1, true case "supsup": // SUPERSET ABOVE SUPERSET - return rune(0x2ad6), true + return {'\u2ad6', 0}, 1, true case "swArr": // SOUTH WEST DOUBLE ARROW - return rune(0x21d9), true + return {'\u21d9', 0}, 1, true case "swarhk": // SOUTH WEST ARROW WITH HOOK - return rune(0x2926), true + return {'\u2926', 0}, 1, true case "swarr": // SOUTH WEST ARROW - return rune(0x2199), true + return {'\u2199', 0}, 1, true case "swarrow": // SOUTH WEST ARROW - return rune(0x2199), true + return {'\u2199', 0}, 1, true case "swnwar": // SOUTH WEST ARROW AND NORTH WEST ARROW - return rune(0x292a), true + return {'\u292a', 0}, 1, true case "szlig": // LATIN SMALL LETTER SHARP S - return rune(0xdf), true + return {'ß', 0}, 1, true } case 't': switch name { case "target": // POSITION INDICATOR - return rune(0x2316), true + return {'\u2316', 0}, 1, true case "tau": // GREEK SMALL LETTER TAU - return rune(0x03c4), true + return {'\u03c4', 0}, 1, true case "tbrk": // TOP SQUARE BRACKET - return rune(0x23b4), true + return {'\u23b4', 0}, 1, true case "tcaron": // LATIN SMALL LETTER T WITH CARON - return rune(0x0165), true + return {'\u0165', 0}, 1, true case "tcedil": // LATIN SMALL LETTER T WITH CEDILLA - return rune(0x0163), true + return {'\u0163', 0}, 1, true case "tcy": // CYRILLIC SMALL LETTER TE - return rune(0x0442), true + return {'\u0442', 0}, 1, true case "tdot": // COMBINING THREE DOTS ABOVE - return rune(0x20db), true + return {'\u20db', 0}, 1, true case "telrec": // TELEPHONE RECORDER - return rune(0x2315), true + return {'\u2315', 0}, 1, true case "tfr": // MATHEMATICAL FRAKTUR SMALL T - return rune(0x01d531), true + return {'\U0001d531', 0}, 1, true case "tgr": // GREEK SMALL LETTER TAU - return rune(0x03c4), true + return {'\u03c4', 0}, 1, true case "there4": // THEREFORE - return rune(0x2234), true + return {'\u2234', 0}, 1, true case "therefore": // THEREFORE - return rune(0x2234), true + return {'\u2234', 0}, 1, true case "thermod": // THERMODYNAMIC - return rune(0x29e7), true + return {'\u29e7', 0}, 1, true case "theta": // GREEK SMALL LETTER THETA - return rune(0x03b8), true + return {'\u03b8', 0}, 1, true case "thetas": // GREEK SMALL LETTER THETA - return rune(0x03b8), true + return {'\u03b8', 0}, 1, true case "thetasym": // GREEK THETA SYMBOL - return rune(0x03d1), true + return {'\u03d1', 0}, 1, true case "thetav": // GREEK THETA SYMBOL - return rune(0x03d1), true + return {'\u03d1', 0}, 1, true case "thgr": // GREEK SMALL LETTER THETA - return rune(0x03b8), true + return {'\u03b8', 0}, 1, true case "thickapprox": // ALMOST EQUAL TO - return rune(0x2248), true + return {'\u2248', 0}, 1, true case "thicksim": // TILDE OPERATOR - return rune(0x223c), true + return {'\u223c', 0}, 1, true case "thinsp": // THIN SPACE - return rune(0x2009), true + return {'\u2009', 0}, 1, true case "thkap": // ALMOST EQUAL TO - return rune(0x2248), true + return {'\u2248', 0}, 1, true case "thksim": // TILDE OPERATOR - return rune(0x223c), true + return {'\u223c', 0}, 1, true case "thorn": // LATIN SMALL LETTER THORN - return rune(0xfe), true + return {'þ', 0}, 1, true case "tilde": // SMALL TILDE - return rune(0x02dc), true + return {'\u02dc', 0}, 1, true case "timeint": // INTEGRAL WITH TIMES SIGN - return rune(0x2a18), true + return {'\u2a18', 0}, 1, true case "times": // MULTIPLICATION SIGN - return rune(0xd7), true + return {'×', 0}, 1, true case "timesb": // SQUARED TIMES - return rune(0x22a0), true + return {'\u22a0', 0}, 1, true case "timesbar": // MULTIPLICATION SIGN WITH UNDERBAR - return rune(0x2a31), true + return {'\u2a31', 0}, 1, true case "timesd": // MULTIPLICATION SIGN WITH DOT ABOVE - return rune(0x2a30), true + return {'\u2a30', 0}, 1, true case "tint": // TRIPLE INTEGRAL - return rune(0x222d), true + return {'\u222d', 0}, 1, true case "toea": // NORTH EAST ARROW AND SOUTH EAST ARROW - return rune(0x2928), true + return {'\u2928', 0}, 1, true case "top": // DOWN TACK - return rune(0x22a4), true + return {'\u22a4', 0}, 1, true case "topbot": // APL FUNCTIONAL SYMBOL I-BEAM - return rune(0x2336), true + return {'\u2336', 0}, 1, true case "topcir": // DOWN TACK WITH CIRCLE BELOW - return rune(0x2af1), true + return {'\u2af1', 0}, 1, true case "topf": // MATHEMATICAL DOUBLE-STRUCK SMALL T - return rune(0x01d565), true + return {'\U0001d565', 0}, 1, true case "topfork": // PITCHFORK WITH TEE TOP - return rune(0x2ada), true + return {'\u2ada', 0}, 1, true case "tosa": // SOUTH EAST ARROW AND SOUTH WEST ARROW - return rune(0x2929), true + return {'\u2929', 0}, 1, true case "tprime": // TRIPLE PRIME - return rune(0x2034), true + return {'\u2034', 0}, 1, true case "trade": // TRADE MARK SIGN - return rune(0x2122), true + return {'\u2122', 0}, 1, true case "triS": // S IN TRIANGLE - return rune(0x29cc), true + return {'\u29cc', 0}, 1, true case "triangle": // WHITE UP-POINTING SMALL TRIANGLE - return rune(0x25b5), true + return {'\u25b5', 0}, 1, true case "triangledown": // WHITE DOWN-POINTING SMALL TRIANGLE - return rune(0x25bf), true + return {'\u25bf', 0}, 1, true case "triangleleft": // WHITE LEFT-POINTING SMALL TRIANGLE - return rune(0x25c3), true + return {'\u25c3', 0}, 1, true case "trianglelefteq": // NORMAL SUBGROUP OF OR EQUAL TO - return rune(0x22b4), true + return {'\u22b4', 0}, 1, true case "triangleq": // DELTA EQUAL TO - return rune(0x225c), true + return {'\u225c', 0}, 1, true case "triangleright": // WHITE RIGHT-POINTING SMALL TRIANGLE - return rune(0x25b9), true + return {'\u25b9', 0}, 1, true case "trianglerighteq": // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO - return rune(0x22b5), true + return {'\u22b5', 0}, 1, true case "tribar": // TRIANGLE WITH UNDERBAR - return rune(0x29cb), true + return {'\u29cb', 0}, 1, true case "tridot": // WHITE UP-POINTING TRIANGLE WITH DOT - return rune(0x25ec), true + return {'\u25ec', 0}, 1, true case "tridoto": // TRIANGLE WITH DOT ABOVE - return rune(0x29ca), true + return {'\u29ca', 0}, 1, true case "trie": // DELTA EQUAL TO - return rune(0x225c), true + return {'\u225c', 0}, 1, true case "triminus": // MINUS SIGN IN TRIANGLE - return rune(0x2a3a), true + return {'\u2a3a', 0}, 1, true case "triplus": // PLUS SIGN IN TRIANGLE - return rune(0x2a39), true + return {'\u2a39', 0}, 1, true case "trisb": // TRIANGLE WITH SERIFS AT BOTTOM - return rune(0x29cd), true + return {'\u29cd', 0}, 1, true case "tritime": // MULTIPLICATION SIGN IN TRIANGLE - return rune(0x2a3b), true + return {'\u2a3b', 0}, 1, true case "trpezium": // WHITE TRAPEZIUM - return rune(0x23e2), true + return {'\u23e2', 0}, 1, true case "tscr": // MATHEMATICAL SCRIPT SMALL T - return rune(0x01d4c9), true + return {'\U0001d4c9', 0}, 1, true case "tscy": // CYRILLIC SMALL LETTER TSE - return rune(0x0446), true + return {'\u0446', 0}, 1, true case "tshcy": // CYRILLIC SMALL LETTER TSHE - return rune(0x045b), true + return {'\u045b', 0}, 1, true case "tstrok": // LATIN SMALL LETTER T WITH STROKE - return rune(0x0167), true + return {'\u0167', 0}, 1, true case "tverbar": // TRIPLE VERTICAL BAR DELIMITER - return rune(0x2980), true + return {'\u2980', 0}, 1, true case "twixt": // BETWEEN - return rune(0x226c), true + return {'\u226c', 0}, 1, true case "twoheadleftarrow": // LEFTWARDS TWO HEADED ARROW - return rune(0x219e), true + return {'\u219e', 0}, 1, true case "twoheadrightarrow": // RIGHTWARDS TWO HEADED ARROW - return rune(0x21a0), true + return {'\u21a0', 0}, 1, true } case 'u': switch name { case "uAarr": // UPWARDS TRIPLE ARROW - return rune(0x290a), true + return {'\u290a', 0}, 1, true case "uArr": // UPWARDS DOUBLE ARROW - return rune(0x21d1), true + return {'\u21d1', 0}, 1, true case "uHar": // UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT - return rune(0x2963), true + return {'\u2963', 0}, 1, true case "uacgr": // GREEK SMALL LETTER UPSILON WITH TONOS - return rune(0x03cd), true + return {'\u03cd', 0}, 1, true case "uacute": // LATIN SMALL LETTER U WITH ACUTE - return rune(0xfa), true + return {'ú', 0}, 1, true case "uarr": // UPWARDS ARROW - return rune(0x2191), true + return {'\u2191', 0}, 1, true case "uarr2": // UPWARDS PAIRED ARROWS - return rune(0x21c8), true + return {'\u21c8', 0}, 1, true case "uarrb": // UPWARDS ARROW TO BAR - return rune(0x2912), true + return {'\u2912', 0}, 1, true case "uarrln": // UPWARDS ARROW WITH HORIZONTAL STROKE - return rune(0x2909), true + return {'\u2909', 0}, 1, true case "ubrcy": // CYRILLIC SMALL LETTER SHORT U - return rune(0x045e), true + return {'\u045e', 0}, 1, true case "ubreve": // LATIN SMALL LETTER U WITH BREVE - return rune(0x016d), true + return {'\u016d', 0}, 1, true case "ucirc": // LATIN SMALL LETTER U WITH CIRCUMFLEX - return rune(0xfb), true + return {'û', 0}, 1, true case "ucy": // CYRILLIC SMALL LETTER U - return rune(0x0443), true + return {'\u0443', 0}, 1, true case "udarr": // UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW - return rune(0x21c5), true + return {'\u21c5', 0}, 1, true case "udblac": // LATIN SMALL LETTER U WITH DOUBLE ACUTE - return rune(0x0171), true + return {'\u0171', 0}, 1, true case "udhar": // UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT - return rune(0x296e), true + return {'\u296e', 0}, 1, true case "udiagr": // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - return rune(0x03b0), true + return {'\u03b0', 0}, 1, true case "udigr": // GREEK SMALL LETTER UPSILON WITH DIALYTIKA - return rune(0x03cb), true + return {'\u03cb', 0}, 1, true case "udrbrk": // BOTTOM SQUARE BRACKET - return rune(0x23b5), true + return {'\u23b5', 0}, 1, true case "udrcub": // BOTTOM CURLY BRACKET - return rune(0x23df), true + return {'\u23df', 0}, 1, true case "udrpar": // BOTTOM PARENTHESIS - return rune(0x23dd), true + return {'\u23dd', 0}, 1, true case "ufisht": // UP FISH TAIL - return rune(0x297e), true + return {'\u297e', 0}, 1, true case "ufr": // MATHEMATICAL FRAKTUR SMALL U - return rune(0x01d532), true + return {'\U0001d532', 0}, 1, true case "ugr": // GREEK SMALL LETTER UPSILON - return rune(0x03c5), true + return {'\u03c5', 0}, 1, true case "ugrave": // LATIN SMALL LETTER U WITH GRAVE - return rune(0xf9), true + return {'ù', 0}, 1, true case "uharl": // UPWARDS HARPOON WITH BARB LEFTWARDS - return rune(0x21bf), true + return {'\u21bf', 0}, 1, true case "uharr": // UPWARDS HARPOON WITH BARB RIGHTWARDS - return rune(0x21be), true + return {'\u21be', 0}, 1, true case "uhblk": // UPPER HALF BLOCK - return rune(0x2580), true + return {'\u2580', 0}, 1, true case "ulcorn": // TOP LEFT CORNER - return rune(0x231c), true + return {'\u231c', 0}, 1, true case "ulcorner": // TOP LEFT CORNER - return rune(0x231c), true + return {'\u231c', 0}, 1, true case "ulcrop": // TOP LEFT CROP - return rune(0x230f), true + return {'\u230f', 0}, 1, true case "uldlshar": // UP BARB LEFT DOWN BARB LEFT HARPOON - return rune(0x2951), true + return {'\u2951', 0}, 1, true case "ulharb": // UPWARDS HARPOON WITH BARB LEFT TO BAR - return rune(0x2958), true + return {'\u2958', 0}, 1, true case "ultri": // UPPER LEFT TRIANGLE - return rune(0x25f8), true + return {'\u25f8', 0}, 1, true case "umacr": // LATIN SMALL LETTER U WITH MACRON - return rune(0x016b), true + return {'\u016b', 0}, 1, true case "uml": // DIAERESIS - return rune(0xa8), true + return {'¨', 0}, 1, true case "uogon": // LATIN SMALL LETTER U WITH OGONEK - return rune(0x0173), true + return {'\u0173', 0}, 1, true case "uopf": // MATHEMATICAL DOUBLE-STRUCK SMALL U - return rune(0x01d566), true + return {'\U0001d566', 0}, 1, true case "uparrow": // UPWARDS ARROW - return rune(0x2191), true + return {'\u2191', 0}, 1, true case "updownarrow": // UP DOWN ARROW - return rune(0x2195), true + return {'\u2195', 0}, 1, true case "upharpoonleft": // UPWARDS HARPOON WITH BARB LEFTWARDS - return rune(0x21bf), true + return {'\u21bf', 0}, 1, true case "upharpoonright": // UPWARDS HARPOON WITH BARB RIGHTWARDS - return rune(0x21be), true + return {'\u21be', 0}, 1, true case "upint": // INTEGRAL WITH OVERBAR - return rune(0x2a1b), true + return {'\u2a1b', 0}, 1, true case "uplus": // MULTISET UNION - return rune(0x228e), true + return {'\u228e', 0}, 1, true case "upsi": // GREEK SMALL LETTER UPSILON - return rune(0x03c5), true + return {'\u03c5', 0}, 1, true case "upsih": // GREEK UPSILON WITH HOOK SYMBOL - return rune(0x03d2), true + return {'\u03d2', 0}, 1, true case "upsilon": // GREEK SMALL LETTER UPSILON - return rune(0x03c5), true + return {'\u03c5', 0}, 1, true case "upuparrows": // UPWARDS PAIRED ARROWS - return rune(0x21c8), true + return {'\u21c8', 0}, 1, true case "urcorn": // TOP RIGHT CORNER - return rune(0x231d), true + return {'\u231d', 0}, 1, true case "urcorner": // TOP RIGHT CORNER - return rune(0x231d), true + return {'\u231d', 0}, 1, true case "urcrop": // TOP RIGHT CROP - return rune(0x230e), true + return {'\u230e', 0}, 1, true case "urdrshar": // UP BARB RIGHT DOWN BARB RIGHT HARPOON - return rune(0x294f), true + return {'\u294f', 0}, 1, true case "urharb": // UPWARDS HARPOON WITH BARB RIGHT TO BAR - return rune(0x2954), true + return {'\u2954', 0}, 1, true case "uring": // LATIN SMALL LETTER U WITH RING ABOVE - return rune(0x016f), true + return {'\u016f', 0}, 1, true case "urtri": // UPPER RIGHT TRIANGLE - return rune(0x25f9), true + return {'\u25f9', 0}, 1, true case "urtrif": // BLACK UPPER RIGHT TRIANGLE - return rune(0x25e5), true + return {'\u25e5', 0}, 1, true case "uscr": // MATHEMATICAL SCRIPT SMALL U - return rune(0x01d4ca), true + return {'\U0001d4ca', 0}, 1, true case "utdot": // UP RIGHT DIAGONAL ELLIPSIS - return rune(0x22f0), true + return {'\u22f0', 0}, 1, true case "utilde": // LATIN SMALL LETTER U WITH TILDE - return rune(0x0169), true + return {'\u0169', 0}, 1, true case "utri": // WHITE UP-POINTING SMALL TRIANGLE - return rune(0x25b5), true + return {'\u25b5', 0}, 1, true case "utrif": // BLACK UP-POINTING SMALL TRIANGLE - return rune(0x25b4), true + return {'\u25b4', 0}, 1, true case "uuarr": // UPWARDS PAIRED ARROWS - return rune(0x21c8), true + return {'\u21c8', 0}, 1, true case "uuml": // LATIN SMALL LETTER U WITH DIAERESIS - return rune(0xfc), true + return {'ü', 0}, 1, true case "uwangle": // OBLIQUE ANGLE OPENING DOWN - return rune(0x29a7), true + return {'\u29a7', 0}, 1, true } case 'v': switch name { case "vArr": // UP DOWN DOUBLE ARROW - return rune(0x21d5), true + return {'\u21d5', 0}, 1, true case "vBar": // SHORT UP TACK WITH UNDERBAR - return rune(0x2ae8), true + return {'\u2ae8', 0}, 1, true case "vBarv": // SHORT UP TACK ABOVE SHORT DOWN TACK - return rune(0x2ae9), true + return {'\u2ae9', 0}, 1, true case "vDash": // TRUE - return rune(0x22a8), true + return {'\u22a8', 0}, 1, true case "vDdash": // VERTICAL BAR TRIPLE RIGHT TURNSTILE - return rune(0x2ae2), true + return {'\u2ae2', 0}, 1, true case "vangrt": // RIGHT ANGLE VARIANT WITH SQUARE - return rune(0x299c), true + return {'\u299c', 0}, 1, true case "varepsilon": // GREEK LUNATE EPSILON SYMBOL - return rune(0x03f5), true + return {'\u03f5', 0}, 1, true case "varkappa": // GREEK KAPPA SYMBOL - return rune(0x03f0), true + return {'\u03f0', 0}, 1, true case "varnothing": // EMPTY SET - return rune(0x2205), true + return {'\u2205', 0}, 1, true case "varphi": // GREEK PHI SYMBOL - return rune(0x03d5), true + return {'\u03d5', 0}, 1, true case "varpi": // GREEK PI SYMBOL - return rune(0x03d6), true + return {'\u03d6', 0}, 1, true case "varpropto": // PROPORTIONAL TO - return rune(0x221d), true + return {'\u221d', 0}, 1, true case "varr": // UP DOWN ARROW - return rune(0x2195), true + return {'\u2195', 0}, 1, true case "varrho": // GREEK RHO SYMBOL - return rune(0x03f1), true + return {'\u03f1', 0}, 1, true case "varsigma": // GREEK SMALL LETTER FINAL SIGMA - return rune(0x03c2), true + return {'\u03c2', 0}, 1, true case "varsubsetneq": // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members - return rune(0x228a), true + return {'\u228a', '\u228a'}, 2, true case "varsubsetneqq": // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members - return rune(0x2acb), true + return {'\u2acb', '\u2acb'}, 2, true case "varsupsetneq": // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members - return rune(0x228b), true + return {'\u228b', '\u228b'}, 2, true case "varsupsetneqq": // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members - return rune(0x2acc), true + return {'\u2acc', '\u2acc'}, 2, true case "vartheta": // GREEK THETA SYMBOL - return rune(0x03d1), true + return {'\u03d1', 0}, 1, true case "vartriangleleft": // NORMAL SUBGROUP OF - return rune(0x22b2), true + return {'\u22b2', 0}, 1, true case "vartriangleright": // CONTAINS AS NORMAL SUBGROUP - return rune(0x22b3), true + return {'\u22b3', 0}, 1, true case "vbrtri": // VERTICAL BAR BESIDE RIGHT TRIANGLE - return rune(0x29d0), true + return {'\u29d0', 0}, 1, true case "vcy": // CYRILLIC SMALL LETTER VE - return rune(0x0432), true + return {'\u0432', 0}, 1, true case "vdash": // RIGHT TACK - return rune(0x22a2), true + return {'\u22a2', 0}, 1, true case "vee": // LOGICAL OR - return rune(0x2228), true + return {'\u2228', 0}, 1, true case "veeBar": // LOGICAL OR WITH DOUBLE UNDERBAR - return rune(0x2a63), true + return {'\u2a63', 0}, 1, true case "veebar": // XOR - return rune(0x22bb), true + return {'\u22bb', 0}, 1, true case "veeeq": // EQUIANGULAR TO - return rune(0x225a), true + return {'\u225a', 0}, 1, true case "vellip": // VERTICAL ELLIPSIS - return rune(0x22ee), true + return {'\u22ee', 0}, 1, true case "vellip4": // DOTTED FENCE - return rune(0x2999), true + return {'\u2999', 0}, 1, true case "vellipv": // TRIPLE COLON OPERATOR - return rune(0x2af6), true + return {'\u2af6', 0}, 1, true case "verbar": // VERTICAL LINE - return rune(0x7c), true + return {'|', 0}, 1, true case "vert": // VERTICAL LINE - return rune(0x7c), true + return {'|', 0}, 1, true case "vert3": // TRIPLE VERTICAL BAR BINARY RELATION - return rune(0x2af4), true + return {'\u2af4', 0}, 1, true case "vfr": // MATHEMATICAL FRAKTUR SMALL V - return rune(0x01d533), true + return {'\U0001d533', 0}, 1, true case "vldash": // LEFT SQUARE BRACKET LOWER CORNER - return rune(0x23a3), true + return {'\u23a3', 0}, 1, true case "vltri": // NORMAL SUBGROUP OF - return rune(0x22b2), true + return {'\u22b2', 0}, 1, true case "vnsub": // SUBSET OF with vertical line - return rune(0x2282), true + return {'\u2282', '\u2282'}, 2, true case "vnsup": // SUPERSET OF with vertical line - return rune(0x2283), true + return {'\u2283', '\u2283'}, 2, true case "vopf": // MATHEMATICAL DOUBLE-STRUCK SMALL V - return rune(0x01d567), true + return {'\U0001d567', 0}, 1, true case "vprime": // PRIME - return rune(0x2032), true + return {'\u2032', 0}, 1, true case "vprop": // PROPORTIONAL TO - return rune(0x221d), true + return {'\u221d', 0}, 1, true case "vrtri": // CONTAINS AS NORMAL SUBGROUP - return rune(0x22b3), true + return {'\u22b3', 0}, 1, true case "vscr": // MATHEMATICAL SCRIPT SMALL V - return rune(0x01d4cb), true + return {'\U0001d4cb', 0}, 1, true case "vsubnE": // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members - return rune(0x2acb), true + return {'\u2acb', '\u2acb'}, 2, true case "vsubne": // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members - return rune(0x228a), true + return {'\u228a', '\u228a'}, 2, true case "vsupnE": // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members - return rune(0x2acc), true + return {'\u2acc', '\u2acc'}, 2, true case "vsupne": // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members - return rune(0x228b), true + return {'\u228b', '\u228b'}, 2, true case "vzigzag": // VERTICAL ZIGZAG LINE - return rune(0x299a), true + return {'\u299a', 0}, 1, true } case 'w': switch name { case "wcirc": // LATIN SMALL LETTER W WITH CIRCUMFLEX - return rune(0x0175), true + return {'\u0175', 0}, 1, true case "wedbar": // LOGICAL AND WITH UNDERBAR - return rune(0x2a5f), true + return {'\u2a5f', 0}, 1, true case "wedge": // LOGICAL AND - return rune(0x2227), true + return {'\u2227', 0}, 1, true case "wedgeq": // ESTIMATES - return rune(0x2259), true + return {'\u2259', 0}, 1, true case "weierp": // SCRIPT CAPITAL P - return rune(0x2118), true + return {'\u2118', 0}, 1, true case "wfr": // MATHEMATICAL FRAKTUR SMALL W - return rune(0x01d534), true + return {'\U0001d534', 0}, 1, true case "wopf": // MATHEMATICAL DOUBLE-STRUCK SMALL W - return rune(0x01d568), true + return {'\U0001d568', 0}, 1, true case "wp": // SCRIPT CAPITAL P - return rune(0x2118), true + return {'\u2118', 0}, 1, true case "wr": // WREATH PRODUCT - return rune(0x2240), true + return {'\u2240', 0}, 1, true case "wreath": // WREATH PRODUCT - return rune(0x2240), true + return {'\u2240', 0}, 1, true case "wscr": // MATHEMATICAL SCRIPT SMALL W - return rune(0x01d4cc), true + return {'\U0001d4cc', 0}, 1, true } case 'x': switch name { case "xandand": // TWO LOGICAL AND OPERATOR - return rune(0x2a07), true + return {'\u2a07', 0}, 1, true case "xbsol": // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT - return rune(0x2571), true + return {'\u2571', 0}, 1, true case "xcap": // N-ARY INTERSECTION - return rune(0x22c2), true + return {'\u22c2', 0}, 1, true case "xcirc": // LARGE CIRCLE - return rune(0x25ef), true + return {'\u25ef', 0}, 1, true case "xcup": // N-ARY UNION - return rune(0x22c3), true + return {'\u22c3', 0}, 1, true case "xcupdot": // N-ARY UNION OPERATOR WITH DOT - return rune(0x2a03), true + return {'\u2a03', 0}, 1, true case "xdtri": // WHITE DOWN-POINTING TRIANGLE - return rune(0x25bd), true + return {'\u25bd', 0}, 1, true case "xfr": // MATHEMATICAL FRAKTUR SMALL X - return rune(0x01d535), true + return {'\U0001d535', 0}, 1, true case "xgr": // GREEK SMALL LETTER XI - return rune(0x03be), true + return {'\u03be', 0}, 1, true case "xhArr": // LONG LEFT RIGHT DOUBLE ARROW - return rune(0x27fa), true + return {'\u27fa', 0}, 1, true case "xharr": // LONG LEFT RIGHT ARROW - return rune(0x27f7), true + return {'\u27f7', 0}, 1, true case "xi": // GREEK SMALL LETTER XI - return rune(0x03be), true + return {'\u03be', 0}, 1, true case "xlArr": // LONG LEFTWARDS DOUBLE ARROW - return rune(0x27f8), true + return {'\u27f8', 0}, 1, true case "xlarr": // LONG LEFTWARDS ARROW - return rune(0x27f5), true + return {'\u27f5', 0}, 1, true case "xmap": // LONG RIGHTWARDS ARROW FROM BAR - return rune(0x27fc), true + return {'\u27fc', 0}, 1, true case "xnis": // CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE - return rune(0x22fb), true + return {'\u22fb', 0}, 1, true case "xodot": // N-ARY CIRCLED DOT OPERATOR - return rune(0x2a00), true + return {'\u2a00', 0}, 1, true case "xopf": // MATHEMATICAL DOUBLE-STRUCK SMALL X - return rune(0x01d569), true + return {'\U0001d569', 0}, 1, true case "xoplus": // N-ARY CIRCLED PLUS OPERATOR - return rune(0x2a01), true + return {'\u2a01', 0}, 1, true case "xoror": // TWO LOGICAL OR OPERATOR - return rune(0x2a08), true + return {'\u2a08', 0}, 1, true case "xotime": // N-ARY CIRCLED TIMES OPERATOR - return rune(0x2a02), true + return {'\u2a02', 0}, 1, true case "xrArr": // LONG RIGHTWARDS DOUBLE ARROW - return rune(0x27f9), true + return {'\u27f9', 0}, 1, true case "xrarr": // LONG RIGHTWARDS ARROW - return rune(0x27f6), true + return {'\u27f6', 0}, 1, true case "xscr": // MATHEMATICAL SCRIPT SMALL X - return rune(0x01d4cd), true + return {'\U0001d4cd', 0}, 1, true case "xsol": // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT - return rune(0x2572), true + return {'\u2572', 0}, 1, true case "xsqcap": // N-ARY SQUARE INTERSECTION OPERATOR - return rune(0x2a05), true + return {'\u2a05', 0}, 1, true case "xsqcup": // N-ARY SQUARE UNION OPERATOR - return rune(0x2a06), true + return {'\u2a06', 0}, 1, true case "xsqu": // WHITE MEDIUM SQUARE - return rune(0x25fb), true + return {'\u25fb', 0}, 1, true case "xsquf": // BLACK MEDIUM SQUARE - return rune(0x25fc), true + return {'\u25fc', 0}, 1, true case "xtimes": // N-ARY TIMES OPERATOR - return rune(0x2a09), true + return {'\u2a09', 0}, 1, true case "xuplus": // N-ARY UNION OPERATOR WITH PLUS - return rune(0x2a04), true + return {'\u2a04', 0}, 1, true case "xutri": // WHITE UP-POINTING TRIANGLE - return rune(0x25b3), true + return {'\u25b3', 0}, 1, true case "xvee": // N-ARY LOGICAL OR - return rune(0x22c1), true + return {'\u22c1', 0}, 1, true case "xwedge": // N-ARY LOGICAL AND - return rune(0x22c0), true + return {'\u22c0', 0}, 1, true } case 'y': switch name { case "yacute": // LATIN SMALL LETTER Y WITH ACUTE - return rune(0xfd), true + return {'ý', 0}, 1, true case "yacy": // CYRILLIC SMALL LETTER YA - return rune(0x044f), true + return {'\u044f', 0}, 1, true case "ycirc": // LATIN SMALL LETTER Y WITH CIRCUMFLEX - return rune(0x0177), true + return {'\u0177', 0}, 1, true case "ycy": // CYRILLIC SMALL LETTER YERU - return rune(0x044b), true + return {'\u044b', 0}, 1, true case "yen": // YEN SIGN - return rune(0xa5), true + return {'¥', 0}, 1, true case "yfr": // MATHEMATICAL FRAKTUR SMALL Y - return rune(0x01d536), true + return {'\U0001d536', 0}, 1, true case "yicy": // CYRILLIC SMALL LETTER YI - return rune(0x0457), true + return {'\u0457', 0}, 1, true case "yopf": // MATHEMATICAL DOUBLE-STRUCK SMALL Y - return rune(0x01d56a), true + return {'\U0001d56a', 0}, 1, true case "yscr": // MATHEMATICAL SCRIPT SMALL Y - return rune(0x01d4ce), true + return {'\U0001d4ce', 0}, 1, true case "yucy": // CYRILLIC SMALL LETTER YU - return rune(0x044e), true + return {'\u044e', 0}, 1, true case "yuml": // LATIN SMALL LETTER Y WITH DIAERESIS - return rune(0xff), true + return {'ÿ', 0}, 1, true } case 'z': switch name { case "zacute": // LATIN SMALL LETTER Z WITH ACUTE - return rune(0x017a), true + return {'\u017a', 0}, 1, true case "zcaron": // LATIN SMALL LETTER Z WITH CARON - return rune(0x017e), true + return {'\u017e', 0}, 1, true case "zcy": // CYRILLIC SMALL LETTER ZE - return rune(0x0437), true + return {'\u0437', 0}, 1, true case "zdot": // LATIN SMALL LETTER Z WITH DOT ABOVE - return rune(0x017c), true + return {'\u017c', 0}, 1, true case "zeetrf": // BLACK-LETTER CAPITAL Z - return rune(0x2128), true + return {'\u2128', 0}, 1, true case "zeta": // GREEK SMALL LETTER ZETA - return rune(0x03b6), true + return {'\u03b6', 0}, 1, true case "zfr": // MATHEMATICAL FRAKTUR SMALL Z - return rune(0x01d537), true + return {'\U0001d537', 0}, 1, true case "zgr": // GREEK SMALL LETTER ZETA - return rune(0x03b6), true + return {'\u03b6', 0}, 1, true case "zhcy": // CYRILLIC SMALL LETTER ZHE - return rune(0x0436), true + return {'\u0436', 0}, 1, true case "zigrarr": // RIGHTWARDS SQUIGGLE ARROW - return rune(0x21dd), true + return {'\u21dd', 0}, 1, true case "zopf": // MATHEMATICAL DOUBLE-STRUCK SMALL Z - return rune(0x01d56b), true + return {'\U0001d56b', 0}, 1, true case "zscr": // MATHEMATICAL SCRIPT SMALL Z - return rune(0x01d4cf), true + return {'\U0001d4cf', 0}, 1, true case "zwj": // ZERO WIDTH JOINER - return rune(0x200d), true + return {'\u200d', 0}, 1, true case "zwnj": // ZERO WIDTH NON-JOINER - return rune(0x200c), true + return {'\u200c', 0}, 1, true } } - return -1, false + return } /* diff --git a/core/html/escape.odin b/core/html/escape.odin deleted file mode 100644 index 011d1f4cd..000000000 --- a/core/html/escape.odin +++ /dev/null @@ -1,248 +0,0 @@ -package html - -import "base:runtime" -import "core:fmt" -import "core:strings" -import "core:unicode/utf8" - -// escape_string escapes special characters like '&' to become '&'. -// It escapes only 5 different characters: & ' < > and ". -@(require_results) -escape_string :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool) { - /* - & -> & - ' -> ' // ' is shorter than ' (NOTE: ' was not available until HTML 5) - < -> < - > -> > - " -> " // " is shorter than " - */ - - b := transmute([]byte)s - - extra_bytes_needed := 0 - - for c in b { - switch c { - case '&': extra_bytes_needed += 4 - case '\'': extra_bytes_needed += 4 - case '<': extra_bytes_needed += 3 - case '>': extra_bytes_needed += 3 - case '"': extra_bytes_needed += 4 - } - } - - if extra_bytes_needed == 0 { - return s, false - } - - t, err := make([]byte, len(s) + extra_bytes_needed, allocator, loc) - if err != nil { - return - } - was_allocation = true - - w := 0 - for c in b { - s := "" - switch c { - case '&': s = "&" - case '\'': s = "'" - case '<': s = "<" - case '>': s = ">" - case '"': s = """ - } - if s != "" { - copy(t[w:], s) - w += len(s) - } else { - t[w] = c - w += 1 - } - } - output = string(t[0:w]) - return -} - -@(require_results) -unescape_string :: proc(s: string, entity_map: Entity_Map, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool, err: runtime.Allocator_Error) { - @(require_results) - do_append :: proc(s: string, amp_idx: int, entity_map: Entity_Map, buf: ^[dynamic]byte) -> (n: int) { - s, amp_idx := s, amp_idx - - n += len(s[:amp_idx]) - if buf != nil { append(buf, s[:amp_idx]) } - s = s[amp_idx:] - for len(s) > 0 { - b, w, j := unescape_entity(s, entity_map) - n += w - if buf != nil { append(buf, ..b[:w]) } - - s = s[j:] - - amp_idx = strings.index_byte(s, '&') - if amp_idx < 0 { - n += len(s) - if buf != nil { append(buf, s) } - break - } - n += amp_idx - if buf != nil { append(buf, s[:amp_idx]) } - s = s[amp_idx:] - } - - return - } - - s := s - amp_idx := strings.index_byte(s, '&') - if amp_idx < 0 { - return s, false, nil - } - - // NOTE(bill): this does a two pass in order to minimize the allocations required - bytes_required := do_append(s, amp_idx, entity_map, nil) - - buf := make([dynamic]byte, 0, bytes_required, allocator, loc) or_return - was_allocation = true - - _ = do_append(s, amp_idx, entity_map, &buf) - - assert(len(buf) == cap(buf)) - output = string(buf[:]) - - return -} - -// Returns an unescaped string of an encoded HTML entity. -@(require_results) -unescape_entity :: proc(s: string, entity_map: Entity_Map) -> (b: [8]byte, w: int, j: int) { - s := s - if len(s) < 2 { - return - } - if s[0] != '&' { - return - } - j = 1 - - if s[j] == '#' { // scan numbers - j += 1 - if len(s) <= 3 { // remove `&#.` - return - } - c := s[j] - hex := false - if c == 'x' || c == 'X' { - hex = true - j += 1 - } - - x := rune(0) - scan_number: for j < len(s) { - c = s[j] - j += 1 - if hex { - switch c { - case '0'..='9': x = 16*x + rune(c) - '0'; continue scan_number - case 'a'..='f': x = 16*x + rune(c) - 'a' + 10; continue scan_number - case 'A'..='F': x = 16*x + rune(c) - 'A' + 10; continue scan_number - } - } else { - switch c { - case '0'..='9': x = 10*x + rune(c) - '0'; continue scan_number - } - } - - // Keep the ';' to check for cases which require it and cases which might not - if c != ';' { - j -= 1 - } - break scan_number - } - - - if j <= 3 { // no replacement characters found - return - } - - @(static, rodata) - windows_1252_replacement_table := [0xa0 - 0x80]rune{ // Windows-1252 -> UTF-8 - '\u20ac', '\u0081', '\u201a', '\u0192', - '\u201e', '\u2026', '\u2020', '\u2021', - '\u02c6', '\u2030', '\u0160', '\u2039', - '\u0152', '\u008d', '\u017d', '\u008f', - '\u0090', '\u2018', '\u2019', '\u201c', - '\u201d', '\u2022', '\u2013', '\u2014', - '\u02dc', '\u2122', '\u0161', '\u203a', - '\u0153', '\u009d', '\u017e', '\u0178', - } - - switch x { - case 0x80..<0xa0: - x = windows_1252_replacement_table[x-0x80] - case 0, 0xd800..=0xdfff: - x = utf8.RUNE_ERROR - case: - if x > 0x10ffff { - x = utf8.RUNE_ERROR - } - - } - - b1, w1 := utf8.encode_rune(x) - w += copy(b[:], b1[:w1]) - return - } - - // Lookup by entity names - - scan_ident: for j < len(s) { // scan over letters and digits - c := s[j] - j += 1 - - switch c { - case 'a'..='z', 'A'..='Z', '0'..='9': - continue scan_ident - } - // Keep the ';' to check for cases which require it and cases which might not - if c != ';' { - j -= 1 - } - break scan_ident - } - - entity_name := s[1:j] - if len(entity_name) == 0 { - return - } - - if r, ok := entity_map.entity1[entity_name]; ok { - b1, w1 := utf8.encode_rune(r) - copy(b[:], b1[:w1]) - w = w1 - return - } - - if r2, ok := entity_map.entity2[entity_name]; ok { - b1, w1 := utf8.encode_rune(r2[0]) - b2, w2 := utf8.encode_rune(r2[1]) - w += copy(b[w:], b1[:w1]) - w += copy(b[w:], b2[:w2]) - return - } - - // The longest entities that do not end with a semicolon are <=6 bytes long - LONGEST_ENTITY_WITHOUT_SEMICOLON :: 6 - - n := min(len(entity_name)-1, LONGEST_ENTITY_WITHOUT_SEMICOLON) - for i := n; i > 1; i -= 1 { - if r, ok := entity_map.entity1[entity_name[:i]]; ok { - b1, w1 := utf8.encode_rune(r) - copy(b[:], b1[:w1]) - w = w1 - return - } - } - - return -} diff --git a/core/html/html_entities.odin b/core/html/html_entities.odin deleted file mode 100644 index be52f5d26..000000000 --- a/core/html/html_entities.odin +++ /dev/null @@ -1,2275 +0,0 @@ -package html - -Entity_Map :: struct { - entity1: map[string]rune, - entity2: map[string][2]rune, -} - - -entity_map_create :: proc(allocator := context.allocator) -> (m: Entity_Map) { - m.entity1.allocator = allocator - m.entity2.allocator = allocator - - reserve(&m.entity1, len(_entity1)*2) - reserve(&m.entity2, len(_entity2)*2) - - for &e in _entity1 { - map_insert(&m.entity1, e.n, e.r) - } - - for &e in _entity2 { - map_insert(&m.entity2, e.n, e.r) - } - - return -} - -entity_map_destroy :: proc(m: ^Entity_Map) { - delete(m.entity1) - delete(m.entity2) - m^ = {} -} - - -// Generated from http://www.w3.org/TR/html4/sgml/entities.html - - -@(private="file", rodata) -_entity1 := [?]struct{n: string, r: rune}{ - {"AElig;", '\U000000C6'}, - {"AMP;", '\U00000026'}, - {"Aacute;", '\U000000C1'}, - {"Abreve;", '\U00000102'}, - {"Acirc;", '\U000000C2'}, - {"Acy;", '\U00000410'}, - {"Afr;", '\U0001D504'}, - {"Agrave;", '\U000000C0'}, - {"Alpha;", '\U00000391'}, - {"Amacr;", '\U00000100'}, - {"And;", '\U00002A53'}, - {"Aogon;", '\U00000104'}, - {"Aopf;", '\U0001D538'}, - {"ApplyFunction;", '\U00002061'}, - {"Aring;", '\U000000C5'}, - {"Ascr;", '\U0001D49C'}, - {"Assign;", '\U00002254'}, - {"Atilde;", '\U000000C3'}, - {"Auml;", '\U000000C4'}, - {"Backslash;", '\U00002216'}, - {"Barv;", '\U00002AE7'}, - {"Barwed;", '\U00002306'}, - {"Bcy;", '\U00000411'}, - {"Because;", '\U00002235'}, - {"Bernoullis;", '\U0000212C'}, - {"Beta;", '\U00000392'}, - {"Bfr;", '\U0001D505'}, - {"Bopf;", '\U0001D539'}, - {"Breve;", '\U000002D8'}, - {"Bscr;", '\U0000212C'}, - {"Bumpeq;", '\U0000224E'}, - {"CHcy;", '\U00000427'}, - {"COPY;", '\U000000A9'}, - {"Cacute;", '\U00000106'}, - {"Cap;", '\U000022D2'}, - {"CapitalDifferentialD;", '\U00002145'}, - {"Cayleys;", '\U0000212D'}, - {"Ccaron;", '\U0000010C'}, - {"Ccedil;", '\U000000C7'}, - {"Ccirc;", '\U00000108'}, - {"Cconint;", '\U00002230'}, - {"Cdot;", '\U0000010A'}, - {"Cedilla;", '\U000000B8'}, - {"CenterDot;", '\U000000B7'}, - {"Cfr;", '\U0000212D'}, - {"Chi;", '\U000003A7'}, - {"CircleDot;", '\U00002299'}, - {"CircleMinus;", '\U00002296'}, - {"CirclePlus;", '\U00002295'}, - {"CircleTimes;", '\U00002297'}, - {"ClockwiseContourIntegral;", '\U00002232'}, - {"CloseCurlyDoubleQuote;", '\U0000201D'}, - {"CloseCurlyQuote;", '\U00002019'}, - {"Colon;", '\U00002237'}, - {"Colone;", '\U00002A74'}, - {"Congruent;", '\U00002261'}, - {"Conint;", '\U0000222F'}, - {"ContourIntegral;", '\U0000222E'}, - {"Copf;", '\U00002102'}, - {"Coproduct;", '\U00002210'}, - {"CounterClockwiseContourIntegral;", '\U00002233'}, - {"Cross;", '\U00002A2F'}, - {"Cscr;", '\U0001D49E'}, - {"Cup;", '\U000022D3'}, - {"CupCap;", '\U0000224D'}, - {"DD;", '\U00002145'}, - {"DDotrahd;", '\U00002911'}, - {"DJcy;", '\U00000402'}, - {"DScy;", '\U00000405'}, - {"DZcy;", '\U0000040F'}, - {"Dagger;", '\U00002021'}, - {"Darr;", '\U000021A1'}, - {"Dashv;", '\U00002AE4'}, - {"Dcaron;", '\U0000010E'}, - {"Dcy;", '\U00000414'}, - {"Del;", '\U00002207'}, - {"Delta;", '\U00000394'}, - {"Dfr;", '\U0001D507'}, - {"DiacriticalAcute;", '\U000000B4'}, - {"DiacriticalDot;", '\U000002D9'}, - {"DiacriticalDoubleAcute;", '\U000002DD'}, - {"DiacriticalGrave;", '\U00000060'}, - {"DiacriticalTilde;", '\U000002DC'}, - {"Diamond;", '\U000022C4'}, - {"DifferentialD;", '\U00002146'}, - {"Dopf;", '\U0001D53B'}, - {"Dot;", '\U000000A8'}, - {"DotDot;", '\U000020DC'}, - {"DotEqual;", '\U00002250'}, - {"DoubleContourIntegral;", '\U0000222F'}, - {"DoubleDot;", '\U000000A8'}, - {"DoubleDownArrow;", '\U000021D3'}, - {"DoubleLeftArrow;", '\U000021D0'}, - {"DoubleLeftRightArrow;", '\U000021D4'}, - {"DoubleLeftTee;", '\U00002AE4'}, - {"DoubleLongLeftArrow;", '\U000027F8'}, - {"DoubleLongLeftRightArrow;", '\U000027FA'}, - {"DoubleLongRightArrow;", '\U000027F9'}, - {"DoubleRightArrow;", '\U000021D2'}, - {"DoubleRightTee;", '\U000022A8'}, - {"DoubleUpArrow;", '\U000021D1'}, - {"DoubleUpDownArrow;", '\U000021D5'}, - {"DoubleVerticalBar;", '\U00002225'}, - {"DownArrow;", '\U00002193'}, - {"DownArrowBar;", '\U00002913'}, - {"DownArrowUpArrow;", '\U000021F5'}, - {"DownBreve;", '\U00000311'}, - {"DownLeftRightVector;", '\U00002950'}, - {"DownLeftTeeVector;", '\U0000295E'}, - {"DownLeftVector;", '\U000021BD'}, - {"DownLeftVectorBar;", '\U00002956'}, - {"DownRightTeeVector;", '\U0000295F'}, - {"DownRightVector;", '\U000021C1'}, - {"DownRightVectorBar;", '\U00002957'}, - {"DownTee;", '\U000022A4'}, - {"DownTeeArrow;", '\U000021A7'}, - {"Downarrow;", '\U000021D3'}, - {"Dscr;", '\U0001D49F'}, - {"Dstrok;", '\U00000110'}, - {"ENG;", '\U0000014A'}, - {"ETH;", '\U000000D0'}, - {"Eacute;", '\U000000C9'}, - {"Ecaron;", '\U0000011A'}, - {"Ecirc;", '\U000000CA'}, - {"Ecy;", '\U0000042D'}, - {"Edot;", '\U00000116'}, - {"Efr;", '\U0001D508'}, - {"Egrave;", '\U000000C8'}, - {"Element;", '\U00002208'}, - {"Emacr;", '\U00000112'}, - {"EmptySmallSquare;", '\U000025FB'}, - {"EmptyVerySmallSquare;", '\U000025AB'}, - {"Eogon;", '\U00000118'}, - {"Eopf;", '\U0001D53C'}, - {"Epsilon;", '\U00000395'}, - {"Equal;", '\U00002A75'}, - {"EqualTilde;", '\U00002242'}, - {"Equilibrium;", '\U000021CC'}, - {"Escr;", '\U00002130'}, - {"Esim;", '\U00002A73'}, - {"Eta;", '\U00000397'}, - {"Euml;", '\U000000CB'}, - {"Exists;", '\U00002203'}, - {"ExponentialE;", '\U00002147'}, - {"Fcy;", '\U00000424'}, - {"Ffr;", '\U0001D509'}, - {"FilledSmallSquare;", '\U000025FC'}, - {"FilledVerySmallSquare;", '\U000025AA'}, - {"Fopf;", '\U0001D53D'}, - {"ForAll;", '\U00002200'}, - {"Fouriertrf;", '\U00002131'}, - {"Fscr;", '\U00002131'}, - {"GJcy;", '\U00000403'}, - {"GT;", '\U0000003E'}, - {"Gamma;", '\U00000393'}, - {"Gammad;", '\U000003DC'}, - {"Gbreve;", '\U0000011E'}, - {"Gcedil;", '\U00000122'}, - {"Gcirc;", '\U0000011C'}, - {"Gcy;", '\U00000413'}, - {"Gdot;", '\U00000120'}, - {"Gfr;", '\U0001D50A'}, - {"Gg;", '\U000022D9'}, - {"Gopf;", '\U0001D53E'}, - {"GreaterEqual;", '\U00002265'}, - {"GreaterEqualLess;", '\U000022DB'}, - {"GreaterFullEqual;", '\U00002267'}, - {"GreaterGreater;", '\U00002AA2'}, - {"GreaterLess;", '\U00002277'}, - {"GreaterSlantEqual;", '\U00002A7E'}, - {"GreaterTilde;", '\U00002273'}, - {"Gscr;", '\U0001D4A2'}, - {"Gt;", '\U0000226B'}, - {"HARDcy;", '\U0000042A'}, - {"Hacek;", '\U000002C7'}, - {"Hat;", '\U0000005E'}, - {"Hcirc;", '\U00000124'}, - {"Hfr;", '\U0000210C'}, - {"HilbertSpace;", '\U0000210B'}, - {"Hopf;", '\U0000210D'}, - {"HorizontalLine;", '\U00002500'}, - {"Hscr;", '\U0000210B'}, - {"Hstrok;", '\U00000126'}, - {"HumpDownHump;", '\U0000224E'}, - {"HumpEqual;", '\U0000224F'}, - {"IEcy;", '\U00000415'}, - {"IJlig;", '\U00000132'}, - {"IOcy;", '\U00000401'}, - {"Iacute;", '\U000000CD'}, - {"Icirc;", '\U000000CE'}, - {"Icy;", '\U00000418'}, - {"Idot;", '\U00000130'}, - {"Ifr;", '\U00002111'}, - {"Igrave;", '\U000000CC'}, - {"Im;", '\U00002111'}, - {"Imacr;", '\U0000012A'}, - {"ImaginaryI;", '\U00002148'}, - {"Implies;", '\U000021D2'}, - {"Int;", '\U0000222C'}, - {"Integral;", '\U0000222B'}, - {"Intersection;", '\U000022C2'}, - {"InvisibleComma;", '\U00002063'}, - {"InvisibleTimes;", '\U00002062'}, - {"Iogon;", '\U0000012E'}, - {"Iopf;", '\U0001D540'}, - {"Iota;", '\U00000399'}, - {"Iscr;", '\U00002110'}, - {"Itilde;", '\U00000128'}, - {"Iukcy;", '\U00000406'}, - {"Iuml;", '\U000000CF'}, - {"Jcirc;", '\U00000134'}, - {"Jcy;", '\U00000419'}, - {"Jfr;", '\U0001D50D'}, - {"Jopf;", '\U0001D541'}, - {"Jscr;", '\U0001D4A5'}, - {"Jsercy;", '\U00000408'}, - {"Jukcy;", '\U00000404'}, - {"KHcy;", '\U00000425'}, - {"KJcy;", '\U0000040C'}, - {"Kappa;", '\U0000039A'}, - {"Kcedil;", '\U00000136'}, - {"Kcy;", '\U0000041A'}, - {"Kfr;", '\U0001D50E'}, - {"Kopf;", '\U0001D542'}, - {"Kscr;", '\U0001D4A6'}, - {"LJcy;", '\U00000409'}, - {"LT;", '\U0000003C'}, - {"Lacute;", '\U00000139'}, - {"Lambda;", '\U0000039B'}, - {"Lang;", '\U000027EA'}, - {"Laplacetrf;", '\U00002112'}, - {"Larr;", '\U0000219E'}, - {"Lcaron;", '\U0000013D'}, - {"Lcedil;", '\U0000013B'}, - {"Lcy;", '\U0000041B'}, - {"LeftAngleBracket;", '\U000027E8'}, - {"LeftArrow;", '\U00002190'}, - {"LeftArrowBar;", '\U000021E4'}, - {"LeftArrowRightArrow;", '\U000021C6'}, - {"LeftCeiling;", '\U00002308'}, - {"LeftDoubleBracket;", '\U000027E6'}, - {"LeftDownTeeVector;", '\U00002961'}, - {"LeftDownVector;", '\U000021C3'}, - {"LeftDownVectorBar;", '\U00002959'}, - {"LeftFloor;", '\U0000230A'}, - {"LeftRightArrow;", '\U00002194'}, - {"LeftRightVector;", '\U0000294E'}, - {"LeftTee;", '\U000022A3'}, - {"LeftTeeArrow;", '\U000021A4'}, - {"LeftTeeVector;", '\U0000295A'}, - {"LeftTriangle;", '\U000022B2'}, - {"LeftTriangleBar;", '\U000029CF'}, - {"LeftTriangleEqual;", '\U000022B4'}, - {"LeftUpDownVector;", '\U00002951'}, - {"LeftUpTeeVector;", '\U00002960'}, - {"LeftUpVector;", '\U000021BF'}, - {"LeftUpVectorBar;", '\U00002958'}, - {"LeftVector;", '\U000021BC'}, - {"LeftVectorBar;", '\U00002952'}, - {"Leftarrow;", '\U000021D0'}, - {"Leftrightarrow;", '\U000021D4'}, - {"LessEqualGreater;", '\U000022DA'}, - {"LessFullEqual;", '\U00002266'}, - {"LessGreater;", '\U00002276'}, - {"LessLess;", '\U00002AA1'}, - {"LessSlantEqual;", '\U00002A7D'}, - {"LessTilde;", '\U00002272'}, - {"Lfr;", '\U0001D50F'}, - {"Ll;", '\U000022D8'}, - {"Lleftarrow;", '\U000021DA'}, - {"Lmidot;", '\U0000013F'}, - {"LongLeftArrow;", '\U000027F5'}, - {"LongLeftRightArrow;", '\U000027F7'}, - {"LongRightArrow;", '\U000027F6'}, - {"Longleftarrow;", '\U000027F8'}, - {"Longleftrightarrow;", '\U000027FA'}, - {"Longrightarrow;", '\U000027F9'}, - {"Lopf;", '\U0001D543'}, - {"LowerLeftArrow;", '\U00002199'}, - {"LowerRightArrow;", '\U00002198'}, - {"Lscr;", '\U00002112'}, - {"Lsh;", '\U000021B0'}, - {"Lstrok;", '\U00000141'}, - {"Lt;", '\U0000226A'}, - {"Map;", '\U00002905'}, - {"Mcy;", '\U0000041C'}, - {"MediumSpace;", '\U0000205F'}, - {"Mellintrf;", '\U00002133'}, - {"Mfr;", '\U0001D510'}, - {"MinusPlus;", '\U00002213'}, - {"Mopf;", '\U0001D544'}, - {"Mscr;", '\U00002133'}, - {"Mu;", '\U0000039C'}, - {"NJcy;", '\U0000040A'}, - {"Nacute;", '\U00000143'}, - {"Ncaron;", '\U00000147'}, - {"Ncedil;", '\U00000145'}, - {"Ncy;", '\U0000041D'}, - {"NegativeMediumSpace;", '\U0000200B'}, - {"NegativeThickSpace;", '\U0000200B'}, - {"NegativeThinSpace;", '\U0000200B'}, - {"NegativeVeryThinSpace;", '\U0000200B'}, - {"NestedGreaterGreater;", '\U0000226B'}, - {"NestedLessLess;", '\U0000226A'}, - {"NewLine;", '\U0000000A'}, - {"Nfr;", '\U0001D511'}, - {"NoBreak;", '\U00002060'}, - {"NonBreakingSpace;", '\U000000A0'}, - {"Nopf;", '\U00002115'}, - {"Not;", '\U00002AEC'}, - {"NotCongruent;", '\U00002262'}, - {"NotCupCap;", '\U0000226D'}, - {"NotDoubleVerticalBar;", '\U00002226'}, - {"NotElement;", '\U00002209'}, - {"NotEqual;", '\U00002260'}, - {"NotExists;", '\U00002204'}, - {"NotGreater;", '\U0000226F'}, - {"NotGreaterEqual;", '\U00002271'}, - {"NotGreaterLess;", '\U00002279'}, - {"NotGreaterTilde;", '\U00002275'}, - {"NotLeftTriangle;", '\U000022EA'}, - {"NotLeftTriangleEqual;", '\U000022EC'}, - {"NotLess;", '\U0000226E'}, - {"NotLessEqual;", '\U00002270'}, - {"NotLessGreater;", '\U00002278'}, - {"NotLessTilde;", '\U00002274'}, - {"NotPrecedes;", '\U00002280'}, - {"NotPrecedesSlantEqual;", '\U000022E0'}, - {"NotReverseElement;", '\U0000220C'}, - {"NotRightTriangle;", '\U000022EB'}, - {"NotRightTriangleEqual;", '\U000022ED'}, - {"NotSquareSubsetEqual;", '\U000022E2'}, - {"NotSquareSupersetEqual;", '\U000022E3'}, - {"NotSubsetEqual;", '\U00002288'}, - {"NotSucceeds;", '\U00002281'}, - {"NotSucceedsSlantEqual;", '\U000022E1'}, - {"NotSupersetEqual;", '\U00002289'}, - {"NotTilde;", '\U00002241'}, - {"NotTildeEqual;", '\U00002244'}, - {"NotTildeFullEqual;", '\U00002247'}, - {"NotTildeTilde;", '\U00002249'}, - {"NotVerticalBar;", '\U00002224'}, - {"Nscr;", '\U0001D4A9'}, - {"Ntilde;", '\U000000D1'}, - {"Nu;", '\U0000039D'}, - {"OElig;", '\U00000152'}, - {"Oacute;", '\U000000D3'}, - {"Ocirc;", '\U000000D4'}, - {"Ocy;", '\U0000041E'}, - {"Odblac;", '\U00000150'}, - {"Ofr;", '\U0001D512'}, - {"Ograve;", '\U000000D2'}, - {"Omacr;", '\U0000014C'}, - {"Omega;", '\U000003A9'}, - {"Omicron;", '\U0000039F'}, - {"Oopf;", '\U0001D546'}, - {"OpenCurlyDoubleQuote;", '\U0000201C'}, - {"OpenCurlyQuote;", '\U00002018'}, - {"Or;", '\U00002A54'}, - {"Oscr;", '\U0001D4AA'}, - {"Oslash;", '\U000000D8'}, - {"Otilde;", '\U000000D5'}, - {"Otimes;", '\U00002A37'}, - {"Ouml;", '\U000000D6'}, - {"OverBar;", '\U0000203E'}, - {"OverBrace;", '\U000023DE'}, - {"OverBracket;", '\U000023B4'}, - {"OverParenthesis;", '\U000023DC'}, - {"PartialD;", '\U00002202'}, - {"Pcy;", '\U0000041F'}, - {"Pfr;", '\U0001D513'}, - {"Phi;", '\U000003A6'}, - {"Pi;", '\U000003A0'}, - {"PlusMinus;", '\U000000B1'}, - {"Poincareplane;", '\U0000210C'}, - {"Popf;", '\U00002119'}, - {"Pr;", '\U00002ABB'}, - {"Precedes;", '\U0000227A'}, - {"PrecedesEqual;", '\U00002AAF'}, - {"PrecedesSlantEqual;", '\U0000227C'}, - {"PrecedesTilde;", '\U0000227E'}, - {"Prime;", '\U00002033'}, - {"Product;", '\U0000220F'}, - {"Proportion;", '\U00002237'}, - {"Proportional;", '\U0000221D'}, - {"Pscr;", '\U0001D4AB'}, - {"Psi;", '\U000003A8'}, - {"QUOT;", '\U00000022'}, - {"Qfr;", '\U0001D514'}, - {"Qopf;", '\U0000211A'}, - {"Qscr;", '\U0001D4AC'}, - {"RBarr;", '\U00002910'}, - {"REG;", '\U000000AE'}, - {"Racute;", '\U00000154'}, - {"Rang;", '\U000027EB'}, - {"Rarr;", '\U000021A0'}, - {"Rarrtl;", '\U00002916'}, - {"Rcaron;", '\U00000158'}, - {"Rcedil;", '\U00000156'}, - {"Rcy;", '\U00000420'}, - {"Re;", '\U0000211C'}, - {"ReverseElement;", '\U0000220B'}, - {"ReverseEquilibrium;", '\U000021CB'}, - {"ReverseUpEquilibrium;", '\U0000296F'}, - {"Rfr;", '\U0000211C'}, - {"Rho;", '\U000003A1'}, - {"RightAngleBracket;", '\U000027E9'}, - {"RightArrow;", '\U00002192'}, - {"RightArrowBar;", '\U000021E5'}, - {"RightArrowLeftArrow;", '\U000021C4'}, - {"RightCeiling;", '\U00002309'}, - {"RightDoubleBracket;", '\U000027E7'}, - {"RightDownTeeVector;", '\U0000295D'}, - {"RightDownVector;", '\U000021C2'}, - {"RightDownVectorBar;", '\U00002955'}, - {"RightFloor;", '\U0000230B'}, - {"RightTee;", '\U000022A2'}, - {"RightTeeArrow;", '\U000021A6'}, - {"RightTeeVector;", '\U0000295B'}, - {"RightTriangle;", '\U000022B3'}, - {"RightTriangleBar;", '\U000029D0'}, - {"RightTriangleEqual;", '\U000022B5'}, - {"RightUpDownVector;", '\U0000294F'}, - {"RightUpTeeVector;", '\U0000295C'}, - {"RightUpVector;", '\U000021BE'}, - {"RightUpVectorBar;", '\U00002954'}, - {"RightVector;", '\U000021C0'}, - {"RightVectorBar;", '\U00002953'}, - {"Rightarrow;", '\U000021D2'}, - {"Ropf;", '\U0000211D'}, - {"RoundImplies;", '\U00002970'}, - {"Rrightarrow;", '\U000021DB'}, - {"Rscr;", '\U0000211B'}, - {"Rsh;", '\U000021B1'}, - {"RuleDelayed;", '\U000029F4'}, - {"SHCHcy;", '\U00000429'}, - {"SHcy;", '\U00000428'}, - {"SOFTcy;", '\U0000042C'}, - {"Sacute;", '\U0000015A'}, - {"Sc;", '\U00002ABC'}, - {"Scaron;", '\U00000160'}, - {"Scedil;", '\U0000015E'}, - {"Scirc;", '\U0000015C'}, - {"Scy;", '\U00000421'}, - {"Sfr;", '\U0001D516'}, - {"ShortDownArrow;", '\U00002193'}, - {"ShortLeftArrow;", '\U00002190'}, - {"ShortRightArrow;", '\U00002192'}, - {"ShortUpArrow;", '\U00002191'}, - {"Sigma;", '\U000003A3'}, - {"SmallCircle;", '\U00002218'}, - {"Sopf;", '\U0001D54A'}, - {"Sqrt;", '\U0000221A'}, - {"Square;", '\U000025A1'}, - {"SquareIntersection;", '\U00002293'}, - {"SquareSubset;", '\U0000228F'}, - {"SquareSubsetEqual;", '\U00002291'}, - {"SquareSuperset;", '\U00002290'}, - {"SquareSupersetEqual;", '\U00002292'}, - {"SquareUnion;", '\U00002294'}, - {"Sscr;", '\U0001D4AE'}, - {"Star;", '\U000022C6'}, - {"Sub;", '\U000022D0'}, - {"Subset;", '\U000022D0'}, - {"SubsetEqual;", '\U00002286'}, - {"Succeeds;", '\U0000227B'}, - {"SucceedsEqual;", '\U00002AB0'}, - {"SucceedsSlantEqual;", '\U0000227D'}, - {"SucceedsTilde;", '\U0000227F'}, - {"SuchThat;", '\U0000220B'}, - {"Sum;", '\U00002211'}, - {"Sup;", '\U000022D1'}, - {"Superset;", '\U00002283'}, - {"SupersetEqual;", '\U00002287'}, - {"Supset;", '\U000022D1'}, - {"THORN;", '\U000000DE'}, - {"TRADE;", '\U00002122'}, - {"TSHcy;", '\U0000040B'}, - {"TScy;", '\U00000426'}, - {"Tab;", '\U00000009'}, - {"Tau;", '\U000003A4'}, - {"Tcaron;", '\U00000164'}, - {"Tcedil;", '\U00000162'}, - {"Tcy;", '\U00000422'}, - {"Tfr;", '\U0001D517'}, - {"Therefore;", '\U00002234'}, - {"Theta;", '\U00000398'}, - {"ThinSpace;", '\U00002009'}, - {"Tilde;", '\U0000223C'}, - {"TildeEqual;", '\U00002243'}, - {"TildeFullEqual;", '\U00002245'}, - {"TildeTilde;", '\U00002248'}, - {"Topf;", '\U0001D54B'}, - {"TripleDot;", '\U000020DB'}, - {"Tscr;", '\U0001D4AF'}, - {"Tstrok;", '\U00000166'}, - {"Uacute;", '\U000000DA'}, - {"Uarr;", '\U0000219F'}, - {"Uarrocir;", '\U00002949'}, - {"Ubrcy;", '\U0000040E'}, - {"Ubreve;", '\U0000016C'}, - {"Ucirc;", '\U000000DB'}, - {"Ucy;", '\U00000423'}, - {"Udblac;", '\U00000170'}, - {"Ufr;", '\U0001D518'}, - {"Ugrave;", '\U000000D9'}, - {"Umacr;", '\U0000016A'}, - {"UnderBar;", '\U0000005F'}, - {"UnderBrace;", '\U000023DF'}, - {"UnderBracket;", '\U000023B5'}, - {"UnderParenthesis;", '\U000023DD'}, - {"Union;", '\U000022C3'}, - {"UnionPlus;", '\U0000228E'}, - {"Uogon;", '\U00000172'}, - {"Uopf;", '\U0001D54C'}, - {"UpArrow;", '\U00002191'}, - {"UpArrowBar;", '\U00002912'}, - {"UpArrowDownArrow;", '\U000021C5'}, - {"UpDownArrow;", '\U00002195'}, - {"UpEquilibrium;", '\U0000296E'}, - {"UpTee;", '\U000022A5'}, - {"UpTeeArrow;", '\U000021A5'}, - {"Uparrow;", '\U000021D1'}, - {"Updownarrow;", '\U000021D5'}, - {"UpperLeftArrow;", '\U00002196'}, - {"UpperRightArrow;", '\U00002197'}, - {"Upsi;", '\U000003D2'}, - {"Upsilon;", '\U000003A5'}, - {"Uring;", '\U0000016E'}, - {"Uscr;", '\U0001D4B0'}, - {"Utilde;", '\U00000168'}, - {"Uuml;", '\U000000DC'}, - {"VDash;", '\U000022AB'}, - {"Vbar;", '\U00002AEB'}, - {"Vcy;", '\U00000412'}, - {"Vdash;", '\U000022A9'}, - {"Vdashl;", '\U00002AE6'}, - {"Vee;", '\U000022C1'}, - {"Verbar;", '\U00002016'}, - {"Vert;", '\U00002016'}, - {"VerticalBar;", '\U00002223'}, - {"VerticalLine;", '\U0000007C'}, - {"VerticalSeparator;", '\U00002758'}, - {"VerticalTilde;", '\U00002240'}, - {"VeryThinSpace;", '\U0000200A'}, - {"Vfr;", '\U0001D519'}, - {"Vopf;", '\U0001D54D'}, - {"Vscr;", '\U0001D4B1'}, - {"Vvdash;", '\U000022AA'}, - {"Wcirc;", '\U00000174'}, - {"Wedge;", '\U000022C0'}, - {"Wfr;", '\U0001D51A'}, - {"Wopf;", '\U0001D54E'}, - {"Wscr;", '\U0001D4B2'}, - {"Xfr;", '\U0001D51B'}, - {"Xi;", '\U0000039E'}, - {"Xopf;", '\U0001D54F'}, - {"Xscr;", '\U0001D4B3'}, - {"YAcy;", '\U0000042F'}, - {"YIcy;", '\U00000407'}, - {"YUcy;", '\U0000042E'}, - {"Yacute;", '\U000000DD'}, - {"Ycirc;", '\U00000176'}, - {"Ycy;", '\U0000042B'}, - {"Yfr;", '\U0001D51C'}, - {"Yopf;", '\U0001D550'}, - {"Yscr;", '\U0001D4B4'}, - {"Yuml;", '\U00000178'}, - {"ZHcy;", '\U00000416'}, - {"Zacute;", '\U00000179'}, - {"Zcaron;", '\U0000017D'}, - {"Zcy;", '\U00000417'}, - {"Zdot;", '\U0000017B'}, - {"ZeroWidthSpace;", '\U0000200B'}, - {"Zeta;", '\U00000396'}, - {"Zfr;", '\U00002128'}, - {"Zopf;", '\U00002124'}, - {"Zscr;", '\U0001D4B5'}, - {"aacute;", '\U000000E1'}, - {"abreve;", '\U00000103'}, - {"ac;", '\U0000223E'}, - {"acd;", '\U0000223F'}, - {"acirc;", '\U000000E2'}, - {"acute;", '\U000000B4'}, - {"acy;", '\U00000430'}, - {"aelig;", '\U000000E6'}, - {"af;", '\U00002061'}, - {"afr;", '\U0001D51E'}, - {"agrave;", '\U000000E0'}, - {"alefsym;", '\U00002135'}, - {"aleph;", '\U00002135'}, - {"alpha;", '\U000003B1'}, - {"amacr;", '\U00000101'}, - {"amalg;", '\U00002A3F'}, - {"amp;", '\U00000026'}, - {"and;", '\U00002227'}, - {"andand;", '\U00002A55'}, - {"andd;", '\U00002A5C'}, - {"andslope;", '\U00002A58'}, - {"andv;", '\U00002A5A'}, - {"ang;", '\U00002220'}, - {"ange;", '\U000029A4'}, - {"angle;", '\U00002220'}, - {"angmsd;", '\U00002221'}, - {"angmsdaa;", '\U000029A8'}, - {"angmsdab;", '\U000029A9'}, - {"angmsdac;", '\U000029AA'}, - {"angmsdad;", '\U000029AB'}, - {"angmsdae;", '\U000029AC'}, - {"angmsdaf;", '\U000029AD'}, - {"angmsdag;", '\U000029AE'}, - {"angmsdah;", '\U000029AF'}, - {"angrt;", '\U0000221F'}, - {"angrtvb;", '\U000022BE'}, - {"angrtvbd;", '\U0000299D'}, - {"angsph;", '\U00002222'}, - {"angst;", '\U000000C5'}, - {"angzarr;", '\U0000237C'}, - {"aogon;", '\U00000105'}, - {"aopf;", '\U0001D552'}, - {"ap;", '\U00002248'}, - {"apE;", '\U00002A70'}, - {"apacir;", '\U00002A6F'}, - {"ape;", '\U0000224A'}, - {"apid;", '\U0000224B'}, - {"apos;", '\U00000027'}, - {"approx;", '\U00002248'}, - {"approxeq;", '\U0000224A'}, - {"aring;", '\U000000E5'}, - {"ascr;", '\U0001D4B6'}, - {"ast;", '\U0000002A'}, - {"asymp;", '\U00002248'}, - {"asympeq;", '\U0000224D'}, - {"atilde;", '\U000000E3'}, - {"auml;", '\U000000E4'}, - {"awconint;", '\U00002233'}, - {"awint;", '\U00002A11'}, - {"bNot;", '\U00002AED'}, - {"backcong;", '\U0000224C'}, - {"backepsilon;", '\U000003F6'}, - {"backprime;", '\U00002035'}, - {"backsim;", '\U0000223D'}, - {"backsimeq;", '\U000022CD'}, - {"barvee;", '\U000022BD'}, - {"barwed;", '\U00002305'}, - {"barwedge;", '\U00002305'}, - {"bbrk;", '\U000023B5'}, - {"bbrktbrk;", '\U000023B6'}, - {"bcong;", '\U0000224C'}, - {"bcy;", '\U00000431'}, - {"bdquo;", '\U0000201E'}, - {"becaus;", '\U00002235'}, - {"because;", '\U00002235'}, - {"bemptyv;", '\U000029B0'}, - {"bepsi;", '\U000003F6'}, - {"bernou;", '\U0000212C'}, - {"beta;", '\U000003B2'}, - {"beth;", '\U00002136'}, - {"between;", '\U0000226C'}, - {"bfr;", '\U0001D51F'}, - {"bigcap;", '\U000022C2'}, - {"bigcirc;", '\U000025EF'}, - {"bigcup;", '\U000022C3'}, - {"bigodot;", '\U00002A00'}, - {"bigoplus;", '\U00002A01'}, - {"bigotimes;", '\U00002A02'}, - {"bigsqcup;", '\U00002A06'}, - {"bigstar;", '\U00002605'}, - {"bigtriangledown;", '\U000025BD'}, - {"bigtriangleup;", '\U000025B3'}, - {"biguplus;", '\U00002A04'}, - {"bigvee;", '\U000022C1'}, - {"bigwedge;", '\U000022C0'}, - {"bkarow;", '\U0000290D'}, - {"blacklozenge;", '\U000029EB'}, - {"blacksquare;", '\U000025AA'}, - {"blacktriangle;", '\U000025B4'}, - {"blacktriangledown;", '\U000025BE'}, - {"blacktriangleleft;", '\U000025C2'}, - {"blacktriangleright;", '\U000025B8'}, - {"blank;", '\U00002423'}, - {"blk12;", '\U00002592'}, - {"blk14;", '\U00002591'}, - {"blk34;", '\U00002593'}, - {"block;", '\U00002588'}, - {"bnot;", '\U00002310'}, - {"bopf;", '\U0001D553'}, - {"bot;", '\U000022A5'}, - {"bottom;", '\U000022A5'}, - {"bowtie;", '\U000022C8'}, - {"boxDL;", '\U00002557'}, - {"boxDR;", '\U00002554'}, - {"boxDl;", '\U00002556'}, - {"boxDr;", '\U00002553'}, - {"boxH;", '\U00002550'}, - {"boxHD;", '\U00002566'}, - {"boxHU;", '\U00002569'}, - {"boxHd;", '\U00002564'}, - {"boxHu;", '\U00002567'}, - {"boxUL;", '\U0000255D'}, - {"boxUR;", '\U0000255A'}, - {"boxUl;", '\U0000255C'}, - {"boxUr;", '\U00002559'}, - {"boxV;", '\U00002551'}, - {"boxVH;", '\U0000256C'}, - {"boxVL;", '\U00002563'}, - {"boxVR;", '\U00002560'}, - {"boxVh;", '\U0000256B'}, - {"boxVl;", '\U00002562'}, - {"boxVr;", '\U0000255F'}, - {"boxbox;", '\U000029C9'}, - {"boxdL;", '\U00002555'}, - {"boxdR;", '\U00002552'}, - {"boxdl;", '\U00002510'}, - {"boxdr;", '\U0000250C'}, - {"boxh;", '\U00002500'}, - {"boxhD;", '\U00002565'}, - {"boxhU;", '\U00002568'}, - {"boxhd;", '\U0000252C'}, - {"boxhu;", '\U00002534'}, - {"boxminus;", '\U0000229F'}, - {"boxplus;", '\U0000229E'}, - {"boxtimes;", '\U000022A0'}, - {"boxuL;", '\U0000255B'}, - {"boxuR;", '\U00002558'}, - {"boxul;", '\U00002518'}, - {"boxur;", '\U00002514'}, - {"boxv;", '\U00002502'}, - {"boxvH;", '\U0000256A'}, - {"boxvL;", '\U00002561'}, - {"boxvR;", '\U0000255E'}, - {"boxvh;", '\U0000253C'}, - {"boxvl;", '\U00002524'}, - {"boxvr;", '\U0000251C'}, - {"bprime;", '\U00002035'}, - {"breve;", '\U000002D8'}, - {"brvbar;", '\U000000A6'}, - {"bscr;", '\U0001D4B7'}, - {"bsemi;", '\U0000204F'}, - {"bsim;", '\U0000223D'}, - {"bsime;", '\U000022CD'}, - {"bsol;", '\U0000005C'}, - {"bsolb;", '\U000029C5'}, - {"bsolhsub;", '\U000027C8'}, - {"bull;", '\U00002022'}, - {"bullet;", '\U00002022'}, - {"bump;", '\U0000224E'}, - {"bumpE;", '\U00002AAE'}, - {"bumpe;", '\U0000224F'}, - {"bumpeq;", '\U0000224F'}, - {"cacute;", '\U00000107'}, - {"cap;", '\U00002229'}, - {"capand;", '\U00002A44'}, - {"capbrcup;", '\U00002A49'}, - {"capcap;", '\U00002A4B'}, - {"capcup;", '\U00002A47'}, - {"capdot;", '\U00002A40'}, - {"caret;", '\U00002041'}, - {"caron;", '\U000002C7'}, - {"ccaps;", '\U00002A4D'}, - {"ccaron;", '\U0000010D'}, - {"ccedil;", '\U000000E7'}, - {"ccirc;", '\U00000109'}, - {"ccups;", '\U00002A4C'}, - {"ccupssm;", '\U00002A50'}, - {"cdot;", '\U0000010B'}, - {"cedil;", '\U000000B8'}, - {"cemptyv;", '\U000029B2'}, - {"cent;", '\U000000A2'}, - {"centerdot;", '\U000000B7'}, - {"cfr;", '\U0001D520'}, - {"chcy;", '\U00000447'}, - {"check;", '\U00002713'}, - {"checkmark;", '\U00002713'}, - {"chi;", '\U000003C7'}, - {"cir;", '\U000025CB'}, - {"cirE;", '\U000029C3'}, - {"circ;", '\U000002C6'}, - {"circeq;", '\U00002257'}, - {"circlearrowleft;", '\U000021BA'}, - {"circlearrowright;", '\U000021BB'}, - {"circledR;", '\U000000AE'}, - {"circledS;", '\U000024C8'}, - {"circledast;", '\U0000229B'}, - {"circledcirc;", '\U0000229A'}, - {"circleddash;", '\U0000229D'}, - {"cire;", '\U00002257'}, - {"cirfnint;", '\U00002A10'}, - {"cirmid;", '\U00002AEF'}, - {"cirscir;", '\U000029C2'}, - {"clubs;", '\U00002663'}, - {"clubsuit;", '\U00002663'}, - {"colon;", '\U0000003A'}, - {"colone;", '\U00002254'}, - {"coloneq;", '\U00002254'}, - {"comma;", '\U0000002C'}, - {"commat;", '\U00000040'}, - {"comp;", '\U00002201'}, - {"compfn;", '\U00002218'}, - {"complement;", '\U00002201'}, - {"complexes;", '\U00002102'}, - {"cong;", '\U00002245'}, - {"congdot;", '\U00002A6D'}, - {"conint;", '\U0000222E'}, - {"copf;", '\U0001D554'}, - {"coprod;", '\U00002210'}, - {"copy;", '\U000000A9'}, - {"copysr;", '\U00002117'}, - {"crarr;", '\U000021B5'}, - {"cross;", '\U00002717'}, - {"cscr;", '\U0001D4B8'}, - {"csub;", '\U00002ACF'}, - {"csube;", '\U00002AD1'}, - {"csup;", '\U00002AD0'}, - {"csupe;", '\U00002AD2'}, - {"ctdot;", '\U000022EF'}, - {"cudarrl;", '\U00002938'}, - {"cudarrr;", '\U00002935'}, - {"cuepr;", '\U000022DE'}, - {"cuesc;", '\U000022DF'}, - {"cularr;", '\U000021B6'}, - {"cularrp;", '\U0000293D'}, - {"cup;", '\U0000222A'}, - {"cupbrcap;", '\U00002A48'}, - {"cupcap;", '\U00002A46'}, - {"cupcup;", '\U00002A4A'}, - {"cupdot;", '\U0000228D'}, - {"cupor;", '\U00002A45'}, - {"curarr;", '\U000021B7'}, - {"curarrm;", '\U0000293C'}, - {"curlyeqprec;", '\U000022DE'}, - {"curlyeqsucc;", '\U000022DF'}, - {"curlyvee;", '\U000022CE'}, - {"curlywedge;", '\U000022CF'}, - {"curren;", '\U000000A4'}, - {"curvearrowleft;", '\U000021B6'}, - {"curvearrowright;", '\U000021B7'}, - {"cuvee;", '\U000022CE'}, - {"cuwed;", '\U000022CF'}, - {"cwconint;", '\U00002232'}, - {"cwint;", '\U00002231'}, - {"cylcty;", '\U0000232D'}, - {"dArr;", '\U000021D3'}, - {"dHar;", '\U00002965'}, - {"dagger;", '\U00002020'}, - {"daleth;", '\U00002138'}, - {"darr;", '\U00002193'}, - {"dash;", '\U00002010'}, - {"dashv;", '\U000022A3'}, - {"dbkarow;", '\U0000290F'}, - {"dblac;", '\U000002DD'}, - {"dcaron;", '\U0000010F'}, - {"dcy;", '\U00000434'}, - {"dd;", '\U00002146'}, - {"ddagger;", '\U00002021'}, - {"ddarr;", '\U000021CA'}, - {"ddotseq;", '\U00002A77'}, - {"deg;", '\U000000B0'}, - {"delta;", '\U000003B4'}, - {"demptyv;", '\U000029B1'}, - {"dfisht;", '\U0000297F'}, - {"dfr;", '\U0001D521'}, - {"dharl;", '\U000021C3'}, - {"dharr;", '\U000021C2'}, - {"diam;", '\U000022C4'}, - {"diamond;", '\U000022C4'}, - {"diamondsuit;", '\U00002666'}, - {"diams;", '\U00002666'}, - {"die;", '\U000000A8'}, - {"digamma;", '\U000003DD'}, - {"disin;", '\U000022F2'}, - {"div;", '\U000000F7'}, - {"divide;", '\U000000F7'}, - {"divideontimes;", '\U000022C7'}, - {"divonx;", '\U000022C7'}, - {"djcy;", '\U00000452'}, - {"dlcorn;", '\U0000231E'}, - {"dlcrop;", '\U0000230D'}, - {"dollar;", '\U00000024'}, - {"dopf;", '\U0001D555'}, - {"dot;", '\U000002D9'}, - {"doteq;", '\U00002250'}, - {"doteqdot;", '\U00002251'}, - {"dotminus;", '\U00002238'}, - {"dotplus;", '\U00002214'}, - {"dotsquare;", '\U000022A1'}, - {"doublebarwedge;", '\U00002306'}, - {"downarrow;", '\U00002193'}, - {"downdownarrows;", '\U000021CA'}, - {"downharpoonleft;", '\U000021C3'}, - {"downharpoonright;", '\U000021C2'}, - {"drbkarow;", '\U00002910'}, - {"drcorn;", '\U0000231F'}, - {"drcrop;", '\U0000230C'}, - {"dscr;", '\U0001D4B9'}, - {"dscy;", '\U00000455'}, - {"dsol;", '\U000029F6'}, - {"dstrok;", '\U00000111'}, - {"dtdot;", '\U000022F1'}, - {"dtri;", '\U000025BF'}, - {"dtrif;", '\U000025BE'}, - {"duarr;", '\U000021F5'}, - {"duhar;", '\U0000296F'}, - {"dwangle;", '\U000029A6'}, - {"dzcy;", '\U0000045F'}, - {"dzigrarr;", '\U000027FF'}, - {"eDDot;", '\U00002A77'}, - {"eDot;", '\U00002251'}, - {"eacute;", '\U000000E9'}, - {"easter;", '\U00002A6E'}, - {"ecaron;", '\U0000011B'}, - {"ecir;", '\U00002256'}, - {"ecirc;", '\U000000EA'}, - {"ecolon;", '\U00002255'}, - {"ecy;", '\U0000044D'}, - {"edot;", '\U00000117'}, - {"ee;", '\U00002147'}, - {"efDot;", '\U00002252'}, - {"efr;", '\U0001D522'}, - {"eg;", '\U00002A9A'}, - {"egrave;", '\U000000E8'}, - {"egs;", '\U00002A96'}, - {"egsdot;", '\U00002A98'}, - {"el;", '\U00002A99'}, - {"elinters;", '\U000023E7'}, - {"ell;", '\U00002113'}, - {"els;", '\U00002A95'}, - {"elsdot;", '\U00002A97'}, - {"emacr;", '\U00000113'}, - {"empty;", '\U00002205'}, - {"emptyset;", '\U00002205'}, - {"emptyv;", '\U00002205'}, - {"emsp;", '\U00002003'}, - {"emsp13;", '\U00002004'}, - {"emsp14;", '\U00002005'}, - {"eng;", '\U0000014B'}, - {"ensp;", '\U00002002'}, - {"eogon;", '\U00000119'}, - {"eopf;", '\U0001D556'}, - {"epar;", '\U000022D5'}, - {"eparsl;", '\U000029E3'}, - {"eplus;", '\U00002A71'}, - {"epsi;", '\U000003B5'}, - {"epsilon;", '\U000003B5'}, - {"epsiv;", '\U000003F5'}, - {"eqcirc;", '\U00002256'}, - {"eqcolon;", '\U00002255'}, - {"eqsim;", '\U00002242'}, - {"eqslantgtr;", '\U00002A96'}, - {"eqslantless;", '\U00002A95'}, - {"equals;", '\U0000003D'}, - {"equest;", '\U0000225F'}, - {"equiv;", '\U00002261'}, - {"equivDD;", '\U00002A78'}, - {"eqvparsl;", '\U000029E5'}, - {"erDot;", '\U00002253'}, - {"erarr;", '\U00002971'}, - {"escr;", '\U0000212F'}, - {"esdot;", '\U00002250'}, - {"esim;", '\U00002242'}, - {"eta;", '\U000003B7'}, - {"eth;", '\U000000F0'}, - {"euml;", '\U000000EB'}, - {"euro;", '\U000020AC'}, - {"excl;", '\U00000021'}, - {"exist;", '\U00002203'}, - {"expectation;", '\U00002130'}, - {"exponentiale;", '\U00002147'}, - {"fallingdotseq;", '\U00002252'}, - {"fcy;", '\U00000444'}, - {"female;", '\U00002640'}, - {"ffilig;", '\U0000FB03'}, - {"fflig;", '\U0000FB00'}, - {"ffllig;", '\U0000FB04'}, - {"ffr;", '\U0001D523'}, - {"filig;", '\U0000FB01'}, - {"flat;", '\U0000266D'}, - {"fllig;", '\U0000FB02'}, - {"fltns;", '\U000025B1'}, - {"fnof;", '\U00000192'}, - {"fopf;", '\U0001D557'}, - {"forall;", '\U00002200'}, - {"fork;", '\U000022D4'}, - {"forkv;", '\U00002AD9'}, - {"fpartint;", '\U00002A0D'}, - {"frac12;", '\U000000BD'}, - {"frac13;", '\U00002153'}, - {"frac14;", '\U000000BC'}, - {"frac15;", '\U00002155'}, - {"frac16;", '\U00002159'}, - {"frac18;", '\U0000215B'}, - {"frac23;", '\U00002154'}, - {"frac25;", '\U00002156'}, - {"frac34;", '\U000000BE'}, - {"frac35;", '\U00002157'}, - {"frac38;", '\U0000215C'}, - {"frac45;", '\U00002158'}, - {"frac56;", '\U0000215A'}, - {"frac58;", '\U0000215D'}, - {"frac78;", '\U0000215E'}, - {"frasl;", '\U00002044'}, - {"frown;", '\U00002322'}, - {"fscr;", '\U0001D4BB'}, - {"gE;", '\U00002267'}, - {"gEl;", '\U00002A8C'}, - {"gacute;", '\U000001F5'}, - {"gamma;", '\U000003B3'}, - {"gammad;", '\U000003DD'}, - {"gap;", '\U00002A86'}, - {"gbreve;", '\U0000011F'}, - {"gcirc;", '\U0000011D'}, - {"gcy;", '\U00000433'}, - {"gdot;", '\U00000121'}, - {"ge;", '\U00002265'}, - {"gel;", '\U000022DB'}, - {"geq;", '\U00002265'}, - {"geqq;", '\U00002267'}, - {"geqslant;", '\U00002A7E'}, - {"ges;", '\U00002A7E'}, - {"gescc;", '\U00002AA9'}, - {"gesdot;", '\U00002A80'}, - {"gesdoto;", '\U00002A82'}, - {"gesdotol;", '\U00002A84'}, - {"gesles;", '\U00002A94'}, - {"gfr;", '\U0001D524'}, - {"gg;", '\U0000226B'}, - {"ggg;", '\U000022D9'}, - {"gimel;", '\U00002137'}, - {"gjcy;", '\U00000453'}, - {"gl;", '\U00002277'}, - {"glE;", '\U00002A92'}, - {"gla;", '\U00002AA5'}, - {"glj;", '\U00002AA4'}, - {"gnE;", '\U00002269'}, - {"gnap;", '\U00002A8A'}, - {"gnapprox;", '\U00002A8A'}, - {"gne;", '\U00002A88'}, - {"gneq;", '\U00002A88'}, - {"gneqq;", '\U00002269'}, - {"gnsim;", '\U000022E7'}, - {"gopf;", '\U0001D558'}, - {"grave;", '\U00000060'}, - {"gscr;", '\U0000210A'}, - {"gsim;", '\U00002273'}, - {"gsime;", '\U00002A8E'}, - {"gsiml;", '\U00002A90'}, - {"gt;", '\U0000003E'}, - {"gtcc;", '\U00002AA7'}, - {"gtcir;", '\U00002A7A'}, - {"gtdot;", '\U000022D7'}, - {"gtlPar;", '\U00002995'}, - {"gtquest;", '\U00002A7C'}, - {"gtrapprox;", '\U00002A86'}, - {"gtrarr;", '\U00002978'}, - {"gtrdot;", '\U000022D7'}, - {"gtreqless;", '\U000022DB'}, - {"gtreqqless;", '\U00002A8C'}, - {"gtrless;", '\U00002277'}, - {"gtrsim;", '\U00002273'}, - {"hArr;", '\U000021D4'}, - {"hairsp;", '\U0000200A'}, - {"half;", '\U000000BD'}, - {"hamilt;", '\U0000210B'}, - {"hardcy;", '\U0000044A'}, - {"harr;", '\U00002194'}, - {"harrcir;", '\U00002948'}, - {"harrw;", '\U000021AD'}, - {"hbar;", '\U0000210F'}, - {"hcirc;", '\U00000125'}, - {"hearts;", '\U00002665'}, - {"heartsuit;", '\U00002665'}, - {"hellip;", '\U00002026'}, - {"hercon;", '\U000022B9'}, - {"hfr;", '\U0001D525'}, - {"hksearow;", '\U00002925'}, - {"hkswarow;", '\U00002926'}, - {"hoarr;", '\U000021FF'}, - {"homtht;", '\U0000223B'}, - {"hookleftarrow;", '\U000021A9'}, - {"hookrightarrow;", '\U000021AA'}, - {"hopf;", '\U0001D559'}, - {"horbar;", '\U00002015'}, - {"hscr;", '\U0001D4BD'}, - {"hslash;", '\U0000210F'}, - {"hstrok;", '\U00000127'}, - {"hybull;", '\U00002043'}, - {"hyphen;", '\U00002010'}, - {"iacute;", '\U000000ED'}, - {"ic;", '\U00002063'}, - {"icirc;", '\U000000EE'}, - {"icy;", '\U00000438'}, - {"iecy;", '\U00000435'}, - {"iexcl;", '\U000000A1'}, - {"iff;", '\U000021D4'}, - {"ifr;", '\U0001D526'}, - {"igrave;", '\U000000EC'}, - {"ii;", '\U00002148'}, - {"iiiint;", '\U00002A0C'}, - {"iiint;", '\U0000222D'}, - {"iinfin;", '\U000029DC'}, - {"iiota;", '\U00002129'}, - {"ijlig;", '\U00000133'}, - {"imacr;", '\U0000012B'}, - {"image;", '\U00002111'}, - {"imagline;", '\U00002110'}, - {"imagpart;", '\U00002111'}, - {"imath;", '\U00000131'}, - {"imof;", '\U000022B7'}, - {"imped;", '\U000001B5'}, - {"in;", '\U00002208'}, - {"incare;", '\U00002105'}, - {"infin;", '\U0000221E'}, - {"infintie;", '\U000029DD'}, - {"inodot;", '\U00000131'}, - {"int;", '\U0000222B'}, - {"intcal;", '\U000022BA'}, - {"integers;", '\U00002124'}, - {"intercal;", '\U000022BA'}, - {"intlarhk;", '\U00002A17'}, - {"intprod;", '\U00002A3C'}, - {"iocy;", '\U00000451'}, - {"iogon;", '\U0000012F'}, - {"iopf;", '\U0001D55A'}, - {"iota;", '\U000003B9'}, - {"iprod;", '\U00002A3C'}, - {"iquest;", '\U000000BF'}, - {"iscr;", '\U0001D4BE'}, - {"isin;", '\U00002208'}, - {"isinE;", '\U000022F9'}, - {"isindot;", '\U000022F5'}, - {"isins;", '\U000022F4'}, - {"isinsv;", '\U000022F3'}, - {"isinv;", '\U00002208'}, - {"it;", '\U00002062'}, - {"itilde;", '\U00000129'}, - {"iukcy;", '\U00000456'}, - {"iuml;", '\U000000EF'}, - {"jcirc;", '\U00000135'}, - {"jcy;", '\U00000439'}, - {"jfr;", '\U0001D527'}, - {"jmath;", '\U00000237'}, - {"jopf;", '\U0001D55B'}, - {"jscr;", '\U0001D4BF'}, - {"jsercy;", '\U00000458'}, - {"jukcy;", '\U00000454'}, - {"kappa;", '\U000003BA'}, - {"kappav;", '\U000003F0'}, - {"kcedil;", '\U00000137'}, - {"kcy;", '\U0000043A'}, - {"kfr;", '\U0001D528'}, - {"kgreen;", '\U00000138'}, - {"khcy;", '\U00000445'}, - {"kjcy;", '\U0000045C'}, - {"kopf;", '\U0001D55C'}, - {"kscr;", '\U0001D4C0'}, - {"lAarr;", '\U000021DA'}, - {"lArr;", '\U000021D0'}, - {"lAtail;", '\U0000291B'}, - {"lBarr;", '\U0000290E'}, - {"lE;", '\U00002266'}, - {"lEg;", '\U00002A8B'}, - {"lHar;", '\U00002962'}, - {"lacute;", '\U0000013A'}, - {"laemptyv;", '\U000029B4'}, - {"lagran;", '\U00002112'}, - {"lambda;", '\U000003BB'}, - {"lang;", '\U000027E8'}, - {"langd;", '\U00002991'}, - {"langle;", '\U000027E8'}, - {"lap;", '\U00002A85'}, - {"laquo;", '\U000000AB'}, - {"larr;", '\U00002190'}, - {"larrb;", '\U000021E4'}, - {"larrbfs;", '\U0000291F'}, - {"larrfs;", '\U0000291D'}, - {"larrhk;", '\U000021A9'}, - {"larrlp;", '\U000021AB'}, - {"larrpl;", '\U00002939'}, - {"larrsim;", '\U00002973'}, - {"larrtl;", '\U000021A2'}, - {"lat;", '\U00002AAB'}, - {"latail;", '\U00002919'}, - {"late;", '\U00002AAD'}, - {"lbarr;", '\U0000290C'}, - {"lbbrk;", '\U00002772'}, - {"lbrace;", '\U0000007B'}, - {"lbrack;", '\U0000005B'}, - {"lbrke;", '\U0000298B'}, - {"lbrksld;", '\U0000298F'}, - {"lbrkslu;", '\U0000298D'}, - {"lcaron;", '\U0000013E'}, - {"lcedil;", '\U0000013C'}, - {"lceil;", '\U00002308'}, - {"lcub;", '\U0000007B'}, - {"lcy;", '\U0000043B'}, - {"ldca;", '\U00002936'}, - {"ldquo;", '\U0000201C'}, - {"ldquor;", '\U0000201E'}, - {"ldrdhar;", '\U00002967'}, - {"ldrushar;", '\U0000294B'}, - {"ldsh;", '\U000021B2'}, - {"le;", '\U00002264'}, - {"leftarrow;", '\U00002190'}, - {"leftarrowtail;", '\U000021A2'}, - {"leftharpoondown;", '\U000021BD'}, - {"leftharpoonup;", '\U000021BC'}, - {"leftleftarrows;", '\U000021C7'}, - {"leftrightarrow;", '\U00002194'}, - {"leftrightarrows;", '\U000021C6'}, - {"leftrightharpoons;", '\U000021CB'}, - {"leftrightsquigarrow;", '\U000021AD'}, - {"leftthreetimes;", '\U000022CB'}, - {"leg;", '\U000022DA'}, - {"leq;", '\U00002264'}, - {"leqq;", '\U00002266'}, - {"leqslant;", '\U00002A7D'}, - {"les;", '\U00002A7D'}, - {"lescc;", '\U00002AA8'}, - {"lesdot;", '\U00002A7F'}, - {"lesdoto;", '\U00002A81'}, - {"lesdotor;", '\U00002A83'}, - {"lesges;", '\U00002A93'}, - {"lessapprox;", '\U00002A85'}, - {"lessdot;", '\U000022D6'}, - {"lesseqgtr;", '\U000022DA'}, - {"lesseqqgtr;", '\U00002A8B'}, - {"lessgtr;", '\U00002276'}, - {"lesssim;", '\U00002272'}, - {"lfisht;", '\U0000297C'}, - {"lfloor;", '\U0000230A'}, - {"lfr;", '\U0001D529'}, - {"lg;", '\U00002276'}, - {"lgE;", '\U00002A91'}, - {"lhard;", '\U000021BD'}, - {"lharu;", '\U000021BC'}, - {"lharul;", '\U0000296A'}, - {"lhblk;", '\U00002584'}, - {"ljcy;", '\U00000459'}, - {"ll;", '\U0000226A'}, - {"llarr;", '\U000021C7'}, - {"llcorner;", '\U0000231E'}, - {"llhard;", '\U0000296B'}, - {"lltri;", '\U000025FA'}, - {"lmidot;", '\U00000140'}, - {"lmoust;", '\U000023B0'}, - {"lmoustache;", '\U000023B0'}, - {"lnE;", '\U00002268'}, - {"lnap;", '\U00002A89'}, - {"lnapprox;", '\U00002A89'}, - {"lne;", '\U00002A87'}, - {"lneq;", '\U00002A87'}, - {"lneqq;", '\U00002268'}, - {"lnsim;", '\U000022E6'}, - {"loang;", '\U000027EC'}, - {"loarr;", '\U000021FD'}, - {"lobrk;", '\U000027E6'}, - {"longleftarrow;", '\U000027F5'}, - {"longleftrightarrow;", '\U000027F7'}, - {"longmapsto;", '\U000027FC'}, - {"longrightarrow;", '\U000027F6'}, - {"looparrowleft;", '\U000021AB'}, - {"looparrowright;", '\U000021AC'}, - {"lopar;", '\U00002985'}, - {"lopf;", '\U0001D55D'}, - {"loplus;", '\U00002A2D'}, - {"lotimes;", '\U00002A34'}, - {"lowast;", '\U00002217'}, - {"lowbar;", '\U0000005F'}, - {"loz;", '\U000025CA'}, - {"lozenge;", '\U000025CA'}, - {"lozf;", '\U000029EB'}, - {"lpar;", '\U00000028'}, - {"lparlt;", '\U00002993'}, - {"lrarr;", '\U000021C6'}, - {"lrcorner;", '\U0000231F'}, - {"lrhar;", '\U000021CB'}, - {"lrhard;", '\U0000296D'}, - {"lrm;", '\U0000200E'}, - {"lrtri;", '\U000022BF'}, - {"lsaquo;", '\U00002039'}, - {"lscr;", '\U0001D4C1'}, - {"lsh;", '\U000021B0'}, - {"lsim;", '\U00002272'}, - {"lsime;", '\U00002A8D'}, - {"lsimg;", '\U00002A8F'}, - {"lsqb;", '\U0000005B'}, - {"lsquo;", '\U00002018'}, - {"lsquor;", '\U0000201A'}, - {"lstrok;", '\U00000142'}, - {"lt;", '\U0000003C'}, - {"ltcc;", '\U00002AA6'}, - {"ltcir;", '\U00002A79'}, - {"ltdot;", '\U000022D6'}, - {"lthree;", '\U000022CB'}, - {"ltimes;", '\U000022C9'}, - {"ltlarr;", '\U00002976'}, - {"ltquest;", '\U00002A7B'}, - {"ltrPar;", '\U00002996'}, - {"ltri;", '\U000025C3'}, - {"ltrie;", '\U000022B4'}, - {"ltrif;", '\U000025C2'}, - {"lurdshar;", '\U0000294A'}, - {"luruhar;", '\U00002966'}, - {"mDDot;", '\U0000223A'}, - {"macr;", '\U000000AF'}, - {"male;", '\U00002642'}, - {"malt;", '\U00002720'}, - {"maltese;", '\U00002720'}, - {"map;", '\U000021A6'}, - {"mapsto;", '\U000021A6'}, - {"mapstodown;", '\U000021A7'}, - {"mapstoleft;", '\U000021A4'}, - {"mapstoup;", '\U000021A5'}, - {"marker;", '\U000025AE'}, - {"mcomma;", '\U00002A29'}, - {"mcy;", '\U0000043C'}, - {"mdash;", '\U00002014'}, - {"measuredangle;", '\U00002221'}, - {"mfr;", '\U0001D52A'}, - {"mho;", '\U00002127'}, - {"micro;", '\U000000B5'}, - {"mid;", '\U00002223'}, - {"midast;", '\U0000002A'}, - {"midcir;", '\U00002AF0'}, - {"middot;", '\U000000B7'}, - {"minus;", '\U00002212'}, - {"minusb;", '\U0000229F'}, - {"minusd;", '\U00002238'}, - {"minusdu;", '\U00002A2A'}, - {"mlcp;", '\U00002ADB'}, - {"mldr;", '\U00002026'}, - {"mnplus;", '\U00002213'}, - {"models;", '\U000022A7'}, - {"mopf;", '\U0001D55E'}, - {"mp;", '\U00002213'}, - {"mscr;", '\U0001D4C2'}, - {"mstpos;", '\U0000223E'}, - {"mu;", '\U000003BC'}, - {"multimap;", '\U000022B8'}, - {"mumap;", '\U000022B8'}, - {"nLeftarrow;", '\U000021CD'}, - {"nLeftrightarrow;", '\U000021CE'}, - {"nRightarrow;", '\U000021CF'}, - {"nVDash;", '\U000022AF'}, - {"nVdash;", '\U000022AE'}, - {"nabla;", '\U00002207'}, - {"nacute;", '\U00000144'}, - {"nap;", '\U00002249'}, - {"napos;", '\U00000149'}, - {"napprox;", '\U00002249'}, - {"natur;", '\U0000266E'}, - {"natural;", '\U0000266E'}, - {"naturals;", '\U00002115'}, - {"nbsp;", '\U000000A0'}, - {"ncap;", '\U00002A43'}, - {"ncaron;", '\U00000148'}, - {"ncedil;", '\U00000146'}, - {"ncong;", '\U00002247'}, - {"ncup;", '\U00002A42'}, - {"ncy;", '\U0000043D'}, - {"ndash;", '\U00002013'}, - {"ne;", '\U00002260'}, - {"neArr;", '\U000021D7'}, - {"nearhk;", '\U00002924'}, - {"nearr;", '\U00002197'}, - {"nearrow;", '\U00002197'}, - {"nequiv;", '\U00002262'}, - {"nesear;", '\U00002928'}, - {"nexist;", '\U00002204'}, - {"nexists;", '\U00002204'}, - {"nfr;", '\U0001D52B'}, - {"nge;", '\U00002271'}, - {"ngeq;", '\U00002271'}, - {"ngsim;", '\U00002275'}, - {"ngt;", '\U0000226F'}, - {"ngtr;", '\U0000226F'}, - {"nhArr;", '\U000021CE'}, - {"nharr;", '\U000021AE'}, - {"nhpar;", '\U00002AF2'}, - {"ni;", '\U0000220B'}, - {"nis;", '\U000022FC'}, - {"nisd;", '\U000022FA'}, - {"niv;", '\U0000220B'}, - {"njcy;", '\U0000045A'}, - {"nlArr;", '\U000021CD'}, - {"nlarr;", '\U0000219A'}, - {"nldr;", '\U00002025'}, - {"nle;", '\U00002270'}, - {"nleftarrow;", '\U0000219A'}, - {"nleftrightarrow;", '\U000021AE'}, - {"nleq;", '\U00002270'}, - {"nless;", '\U0000226E'}, - {"nlsim;", '\U00002274'}, - {"nlt;", '\U0000226E'}, - {"nltri;", '\U000022EA'}, - {"nltrie;", '\U000022EC'}, - {"nmid;", '\U00002224'}, - {"nopf;", '\U0001D55F'}, - {"not;", '\U000000AC'}, - {"notin;", '\U00002209'}, - {"notinva;", '\U00002209'}, - {"notinvb;", '\U000022F7'}, - {"notinvc;", '\U000022F6'}, - {"notni;", '\U0000220C'}, - {"notniva;", '\U0000220C'}, - {"notnivb;", '\U000022FE'}, - {"notnivc;", '\U000022FD'}, - {"npar;", '\U00002226'}, - {"nparallel;", '\U00002226'}, - {"npolint;", '\U00002A14'}, - {"npr;", '\U00002280'}, - {"nprcue;", '\U000022E0'}, - {"nprec;", '\U00002280'}, - {"nrArr;", '\U000021CF'}, - {"nrarr;", '\U0000219B'}, - {"nrightarrow;", '\U0000219B'}, - {"nrtri;", '\U000022EB'}, - {"nrtrie;", '\U000022ED'}, - {"nsc;", '\U00002281'}, - {"nsccue;", '\U000022E1'}, - {"nscr;", '\U0001D4C3'}, - {"nshortmid;", '\U00002224'}, - {"nshortparallel;", '\U00002226'}, - {"nsim;", '\U00002241'}, - {"nsime;", '\U00002244'}, - {"nsimeq;", '\U00002244'}, - {"nsmid;", '\U00002224'}, - {"nspar;", '\U00002226'}, - {"nsqsube;", '\U000022E2'}, - {"nsqsupe;", '\U000022E3'}, - {"nsub;", '\U00002284'}, - {"nsube;", '\U00002288'}, - {"nsubseteq;", '\U00002288'}, - {"nsucc;", '\U00002281'}, - {"nsup;", '\U00002285'}, - {"nsupe;", '\U00002289'}, - {"nsupseteq;", '\U00002289'}, - {"ntgl;", '\U00002279'}, - {"ntilde;", '\U000000F1'}, - {"ntlg;", '\U00002278'}, - {"ntriangleleft;", '\U000022EA'}, - {"ntrianglelefteq;", '\U000022EC'}, - {"ntriangleright;", '\U000022EB'}, - {"ntrianglerighteq;", '\U000022ED'}, - {"nu;", '\U000003BD'}, - {"num;", '\U00000023'}, - {"numero;", '\U00002116'}, - {"numsp;", '\U00002007'}, - {"nvDash;", '\U000022AD'}, - {"nvHarr;", '\U00002904'}, - {"nvdash;", '\U000022AC'}, - {"nvinfin;", '\U000029DE'}, - {"nvlArr;", '\U00002902'}, - {"nvrArr;", '\U00002903'}, - {"nwArr;", '\U000021D6'}, - {"nwarhk;", '\U00002923'}, - {"nwarr;", '\U00002196'}, - {"nwarrow;", '\U00002196'}, - {"nwnear;", '\U00002927'}, - {"oS;", '\U000024C8'}, - {"oacute;", '\U000000F3'}, - {"oast;", '\U0000229B'}, - {"ocir;", '\U0000229A'}, - {"ocirc;", '\U000000F4'}, - {"ocy;", '\U0000043E'}, - {"odash;", '\U0000229D'}, - {"odblac;", '\U00000151'}, - {"odiv;", '\U00002A38'}, - {"odot;", '\U00002299'}, - {"odsold;", '\U000029BC'}, - {"oelig;", '\U00000153'}, - {"ofcir;", '\U000029BF'}, - {"ofr;", '\U0001D52C'}, - {"ogon;", '\U000002DB'}, - {"ograve;", '\U000000F2'}, - {"ogt;", '\U000029C1'}, - {"ohbar;", '\U000029B5'}, - {"ohm;", '\U000003A9'}, - {"oint;", '\U0000222E'}, - {"olarr;", '\U000021BA'}, - {"olcir;", '\U000029BE'}, - {"olcross;", '\U000029BB'}, - {"oline;", '\U0000203E'}, - {"olt;", '\U000029C0'}, - {"omacr;", '\U0000014D'}, - {"omega;", '\U000003C9'}, - {"omicron;", '\U000003BF'}, - {"omid;", '\U000029B6'}, - {"ominus;", '\U00002296'}, - {"oopf;", '\U0001D560'}, - {"opar;", '\U000029B7'}, - {"operp;", '\U000029B9'}, - {"oplus;", '\U00002295'}, - {"or;", '\U00002228'}, - {"orarr;", '\U000021BB'}, - {"ord;", '\U00002A5D'}, - {"order;", '\U00002134'}, - {"orderof;", '\U00002134'}, - {"ordf;", '\U000000AA'}, - {"ordm;", '\U000000BA'}, - {"origof;", '\U000022B6'}, - {"oror;", '\U00002A56'}, - {"orslope;", '\U00002A57'}, - {"orv;", '\U00002A5B'}, - {"oscr;", '\U00002134'}, - {"oslash;", '\U000000F8'}, - {"osol;", '\U00002298'}, - {"otilde;", '\U000000F5'}, - {"otimes;", '\U00002297'}, - {"otimesas;", '\U00002A36'}, - {"ouml;", '\U000000F6'}, - {"ovbar;", '\U0000233D'}, - {"par;", '\U00002225'}, - {"para;", '\U000000B6'}, - {"parallel;", '\U00002225'}, - {"parsim;", '\U00002AF3'}, - {"parsl;", '\U00002AFD'}, - {"part;", '\U00002202'}, - {"pcy;", '\U0000043F'}, - {"percnt;", '\U00000025'}, - {"period;", '\U0000002E'}, - {"permil;", '\U00002030'}, - {"perp;", '\U000022A5'}, - {"pertenk;", '\U00002031'}, - {"pfr;", '\U0001D52D'}, - {"phi;", '\U000003C6'}, - {"phiv;", '\U000003D5'}, - {"phmmat;", '\U00002133'}, - {"phone;", '\U0000260E'}, - {"pi;", '\U000003C0'}, - {"pitchfork;", '\U000022D4'}, - {"piv;", '\U000003D6'}, - {"planck;", '\U0000210F'}, - {"planckh;", '\U0000210E'}, - {"plankv;", '\U0000210F'}, - {"plus;", '\U0000002B'}, - {"plusacir;", '\U00002A23'}, - {"plusb;", '\U0000229E'}, - {"pluscir;", '\U00002A22'}, - {"plusdo;", '\U00002214'}, - {"plusdu;", '\U00002A25'}, - {"pluse;", '\U00002A72'}, - {"plusmn;", '\U000000B1'}, - {"plussim;", '\U00002A26'}, - {"plustwo;", '\U00002A27'}, - {"pm;", '\U000000B1'}, - {"pointint;", '\U00002A15'}, - {"popf;", '\U0001D561'}, - {"pound;", '\U000000A3'}, - {"pr;", '\U0000227A'}, - {"prE;", '\U00002AB3'}, - {"prap;", '\U00002AB7'}, - {"prcue;", '\U0000227C'}, - {"pre;", '\U00002AAF'}, - {"prec;", '\U0000227A'}, - {"precapprox;", '\U00002AB7'}, - {"preccurlyeq;", '\U0000227C'}, - {"preceq;", '\U00002AAF'}, - {"precnapprox;", '\U00002AB9'}, - {"precneqq;", '\U00002AB5'}, - {"precnsim;", '\U000022E8'}, - {"precsim;", '\U0000227E'}, - {"prime;", '\U00002032'}, - {"primes;", '\U00002119'}, - {"prnE;", '\U00002AB5'}, - {"prnap;", '\U00002AB9'}, - {"prnsim;", '\U000022E8'}, - {"prod;", '\U0000220F'}, - {"profalar;", '\U0000232E'}, - {"profline;", '\U00002312'}, - {"profsurf;", '\U00002313'}, - {"prop;", '\U0000221D'}, - {"propto;", '\U0000221D'}, - {"prsim;", '\U0000227E'}, - {"prurel;", '\U000022B0'}, - {"pscr;", '\U0001D4C5'}, - {"psi;", '\U000003C8'}, - {"puncsp;", '\U00002008'}, - {"qfr;", '\U0001D52E'}, - {"qint;", '\U00002A0C'}, - {"qopf;", '\U0001D562'}, - {"qprime;", '\U00002057'}, - {"qscr;", '\U0001D4C6'}, - {"quaternions;", '\U0000210D'}, - {"quatint;", '\U00002A16'}, - {"quest;", '\U0000003F'}, - {"questeq;", '\U0000225F'}, - {"quot;", '\U00000022'}, - {"rAarr;", '\U000021DB'}, - {"rArr;", '\U000021D2'}, - {"rAtail;", '\U0000291C'}, - {"rBarr;", '\U0000290F'}, - {"rHar;", '\U00002964'}, - {"racute;", '\U00000155'}, - {"radic;", '\U0000221A'}, - {"raemptyv;", '\U000029B3'}, - {"rang;", '\U000027E9'}, - {"rangd;", '\U00002992'}, - {"range;", '\U000029A5'}, - {"rangle;", '\U000027E9'}, - {"raquo;", '\U000000BB'}, - {"rarr;", '\U00002192'}, - {"rarrap;", '\U00002975'}, - {"rarrb;", '\U000021E5'}, - {"rarrbfs;", '\U00002920'}, - {"rarrc;", '\U00002933'}, - {"rarrfs;", '\U0000291E'}, - {"rarrhk;", '\U000021AA'}, - {"rarrlp;", '\U000021AC'}, - {"rarrpl;", '\U00002945'}, - {"rarrsim;", '\U00002974'}, - {"rarrtl;", '\U000021A3'}, - {"rarrw;", '\U0000219D'}, - {"ratail;", '\U0000291A'}, - {"ratio;", '\U00002236'}, - {"rationals;", '\U0000211A'}, - {"rbarr;", '\U0000290D'}, - {"rbbrk;", '\U00002773'}, - {"rbrace;", '\U0000007D'}, - {"rbrack;", '\U0000005D'}, - {"rbrke;", '\U0000298C'}, - {"rbrksld;", '\U0000298E'}, - {"rbrkslu;", '\U00002990'}, - {"rcaron;", '\U00000159'}, - {"rcedil;", '\U00000157'}, - {"rceil;", '\U00002309'}, - {"rcub;", '\U0000007D'}, - {"rcy;", '\U00000440'}, - {"rdca;", '\U00002937'}, - {"rdldhar;", '\U00002969'}, - {"rdquo;", '\U0000201D'}, - {"rdquor;", '\U0000201D'}, - {"rdsh;", '\U000021B3'}, - {"real;", '\U0000211C'}, - {"realine;", '\U0000211B'}, - {"realpart;", '\U0000211C'}, - {"reals;", '\U0000211D'}, - {"rect;", '\U000025AD'}, - {"reg;", '\U000000AE'}, - {"rfisht;", '\U0000297D'}, - {"rfloor;", '\U0000230B'}, - {"rfr;", '\U0001D52F'}, - {"rhard;", '\U000021C1'}, - {"rharu;", '\U000021C0'}, - {"rharul;", '\U0000296C'}, - {"rho;", '\U000003C1'}, - {"rhov;", '\U000003F1'}, - {"rightarrow;", '\U00002192'}, - {"rightarrowtail;", '\U000021A3'}, - {"rightharpoondown;", '\U000021C1'}, - {"rightharpoonup;", '\U000021C0'}, - {"rightleftarrows;", '\U000021C4'}, - {"rightleftharpoons;", '\U000021CC'}, - {"rightrightarrows;", '\U000021C9'}, - {"rightsquigarrow;", '\U0000219D'}, - {"rightthreetimes;", '\U000022CC'}, - {"ring;", '\U000002DA'}, - {"risingdotseq;", '\U00002253'}, - {"rlarr;", '\U000021C4'}, - {"rlhar;", '\U000021CC'}, - {"rlm;", '\U0000200F'}, - {"rmoust;", '\U000023B1'}, - {"rmoustache;", '\U000023B1'}, - {"rnmid;", '\U00002AEE'}, - {"roang;", '\U000027ED'}, - {"roarr;", '\U000021FE'}, - {"robrk;", '\U000027E7'}, - {"ropar;", '\U00002986'}, - {"ropf;", '\U0001D563'}, - {"roplus;", '\U00002A2E'}, - {"rotimes;", '\U00002A35'}, - {"rpar;", '\U00000029'}, - {"rpargt;", '\U00002994'}, - {"rppolint;", '\U00002A12'}, - {"rrarr;", '\U000021C9'}, - {"rsaquo;", '\U0000203A'}, - {"rscr;", '\U0001D4C7'}, - {"rsh;", '\U000021B1'}, - {"rsqb;", '\U0000005D'}, - {"rsquo;", '\U00002019'}, - {"rsquor;", '\U00002019'}, - {"rthree;", '\U000022CC'}, - {"rtimes;", '\U000022CA'}, - {"rtri;", '\U000025B9'}, - {"rtrie;", '\U000022B5'}, - {"rtrif;", '\U000025B8'}, - {"rtriltri;", '\U000029CE'}, - {"ruluhar;", '\U00002968'}, - {"rx;", '\U0000211E'}, - {"sacute;", '\U0000015B'}, - {"sbquo;", '\U0000201A'}, - {"sc;", '\U0000227B'}, - {"scE;", '\U00002AB4'}, - {"scap;", '\U00002AB8'}, - {"scaron;", '\U00000161'}, - {"sccue;", '\U0000227D'}, - {"sce;", '\U00002AB0'}, - {"scedil;", '\U0000015F'}, - {"scirc;", '\U0000015D'}, - {"scnE;", '\U00002AB6'}, - {"scnap;", '\U00002ABA'}, - {"scnsim;", '\U000022E9'}, - {"scpolint;", '\U00002A13'}, - {"scsim;", '\U0000227F'}, - {"scy;", '\U00000441'}, - {"sdot;", '\U000022C5'}, - {"sdotb;", '\U000022A1'}, - {"sdote;", '\U00002A66'}, - {"seArr;", '\U000021D8'}, - {"searhk;", '\U00002925'}, - {"searr;", '\U00002198'}, - {"searrow;", '\U00002198'}, - {"sect;", '\U000000A7'}, - {"semi;", '\U0000003B'}, - {"seswar;", '\U00002929'}, - {"setminus;", '\U00002216'}, - {"setmn;", '\U00002216'}, - {"sext;", '\U00002736'}, - {"sfr;", '\U0001D530'}, - {"sfrown;", '\U00002322'}, - {"sharp;", '\U0000266F'}, - {"shchcy;", '\U00000449'}, - {"shcy;", '\U00000448'}, - {"shortmid;", '\U00002223'}, - {"shortparallel;", '\U00002225'}, - {"shy;", '\U000000AD'}, - {"sigma;", '\U000003C3'}, - {"sigmaf;", '\U000003C2'}, - {"sigmav;", '\U000003C2'}, - {"sim;", '\U0000223C'}, - {"simdot;", '\U00002A6A'}, - {"sime;", '\U00002243'}, - {"simeq;", '\U00002243'}, - {"simg;", '\U00002A9E'}, - {"simgE;", '\U00002AA0'}, - {"siml;", '\U00002A9D'}, - {"simlE;", '\U00002A9F'}, - {"simne;", '\U00002246'}, - {"simplus;", '\U00002A24'}, - {"simrarr;", '\U00002972'}, - {"slarr;", '\U00002190'}, - {"smallsetminus;", '\U00002216'}, - {"smashp;", '\U00002A33'}, - {"smeparsl;", '\U000029E4'}, - {"smid;", '\U00002223'}, - {"smile;", '\U00002323'}, - {"smt;", '\U00002AAA'}, - {"smte;", '\U00002AAC'}, - {"softcy;", '\U0000044C'}, - {"sol;", '\U0000002F'}, - {"solb;", '\U000029C4'}, - {"solbar;", '\U0000233F'}, - {"sopf;", '\U0001D564'}, - {"spades;", '\U00002660'}, - {"spadesuit;", '\U00002660'}, - {"spar;", '\U00002225'}, - {"sqcap;", '\U00002293'}, - {"sqcup;", '\U00002294'}, - {"sqsub;", '\U0000228F'}, - {"sqsube;", '\U00002291'}, - {"sqsubset;", '\U0000228F'}, - {"sqsubseteq;", '\U00002291'}, - {"sqsup;", '\U00002290'}, - {"sqsupe;", '\U00002292'}, - {"sqsupset;", '\U00002290'}, - {"sqsupseteq;", '\U00002292'}, - {"squ;", '\U000025A1'}, - {"square;", '\U000025A1'}, - {"squarf;", '\U000025AA'}, - {"squf;", '\U000025AA'}, - {"srarr;", '\U00002192'}, - {"sscr;", '\U0001D4C8'}, - {"ssetmn;", '\U00002216'}, - {"ssmile;", '\U00002323'}, - {"sstarf;", '\U000022C6'}, - {"star;", '\U00002606'}, - {"starf;", '\U00002605'}, - {"straightepsilon;", '\U000003F5'}, - {"straightphi;", '\U000003D5'}, - {"strns;", '\U000000AF'}, - {"sub;", '\U00002282'}, - {"subE;", '\U00002AC5'}, - {"subdot;", '\U00002ABD'}, - {"sube;", '\U00002286'}, - {"subedot;", '\U00002AC3'}, - {"submult;", '\U00002AC1'}, - {"subnE;", '\U00002ACB'}, - {"subne;", '\U0000228A'}, - {"subplus;", '\U00002ABF'}, - {"subrarr;", '\U00002979'}, - {"subset;", '\U00002282'}, - {"subseteq;", '\U00002286'}, - {"subseteqq;", '\U00002AC5'}, - {"subsetneq;", '\U0000228A'}, - {"subsetneqq;", '\U00002ACB'}, - {"subsim;", '\U00002AC7'}, - {"subsub;", '\U00002AD5'}, - {"subsup;", '\U00002AD3'}, - {"succ;", '\U0000227B'}, - {"succapprox;", '\U00002AB8'}, - {"succcurlyeq;", '\U0000227D'}, - {"succeq;", '\U00002AB0'}, - {"succnapprox;", '\U00002ABA'}, - {"succneqq;", '\U00002AB6'}, - {"succnsim;", '\U000022E9'}, - {"succsim;", '\U0000227F'}, - {"sum;", '\U00002211'}, - {"sung;", '\U0000266A'}, - {"sup;", '\U00002283'}, - {"sup1;", '\U000000B9'}, - {"sup2;", '\U000000B2'}, - {"sup3;", '\U000000B3'}, - {"supE;", '\U00002AC6'}, - {"supdot;", '\U00002ABE'}, - {"supdsub;", '\U00002AD8'}, - {"supe;", '\U00002287'}, - {"supedot;", '\U00002AC4'}, - {"suphsol;", '\U000027C9'}, - {"suphsub;", '\U00002AD7'}, - {"suplarr;", '\U0000297B'}, - {"supmult;", '\U00002AC2'}, - {"supnE;", '\U00002ACC'}, - {"supne;", '\U0000228B'}, - {"supplus;", '\U00002AC0'}, - {"supset;", '\U00002283'}, - {"supseteq;", '\U00002287'}, - {"supseteqq;", '\U00002AC6'}, - {"supsetneq;", '\U0000228B'}, - {"supsetneqq;", '\U00002ACC'}, - {"supsim;", '\U00002AC8'}, - {"supsub;", '\U00002AD4'}, - {"supsup;", '\U00002AD6'}, - {"swArr;", '\U000021D9'}, - {"swarhk;", '\U00002926'}, - {"swarr;", '\U00002199'}, - {"swarrow;", '\U00002199'}, - {"swnwar;", '\U0000292A'}, - {"szlig;", '\U000000DF'}, - {"target;", '\U00002316'}, - {"tau;", '\U000003C4'}, - {"tbrk;", '\U000023B4'}, - {"tcaron;", '\U00000165'}, - {"tcedil;", '\U00000163'}, - {"tcy;", '\U00000442'}, - {"tdot;", '\U000020DB'}, - {"telrec;", '\U00002315'}, - {"tfr;", '\U0001D531'}, - {"there4;", '\U00002234'}, - {"therefore;", '\U00002234'}, - {"theta;", '\U000003B8'}, - {"thetasym;", '\U000003D1'}, - {"thetav;", '\U000003D1'}, - {"thickapprox;", '\U00002248'}, - {"thicksim;", '\U0000223C'}, - {"thinsp;", '\U00002009'}, - {"thkap;", '\U00002248'}, - {"thksim;", '\U0000223C'}, - {"thorn;", '\U000000FE'}, - {"tilde;", '\U000002DC'}, - {"times;", '\U000000D7'}, - {"timesb;", '\U000022A0'}, - {"timesbar;", '\U00002A31'}, - {"timesd;", '\U00002A30'}, - {"tint;", '\U0000222D'}, - {"toea;", '\U00002928'}, - {"top;", '\U000022A4'}, - {"topbot;", '\U00002336'}, - {"topcir;", '\U00002AF1'}, - {"topf;", '\U0001D565'}, - {"topfork;", '\U00002ADA'}, - {"tosa;", '\U00002929'}, - {"tprime;", '\U00002034'}, - {"trade;", '\U00002122'}, - {"triangle;", '\U000025B5'}, - {"triangledown;", '\U000025BF'}, - {"triangleleft;", '\U000025C3'}, - {"trianglelefteq;", '\U000022B4'}, - {"triangleq;", '\U0000225C'}, - {"triangleright;", '\U000025B9'}, - {"trianglerighteq;", '\U000022B5'}, - {"tridot;", '\U000025EC'}, - {"trie;", '\U0000225C'}, - {"triminus;", '\U00002A3A'}, - {"triplus;", '\U00002A39'}, - {"trisb;", '\U000029CD'}, - {"tritime;", '\U00002A3B'}, - {"trpezium;", '\U000023E2'}, - {"tscr;", '\U0001D4C9'}, - {"tscy;", '\U00000446'}, - {"tshcy;", '\U0000045B'}, - {"tstrok;", '\U00000167'}, - {"twixt;", '\U0000226C'}, - {"twoheadleftarrow;", '\U0000219E'}, - {"twoheadrightarrow;", '\U000021A0'}, - {"uArr;", '\U000021D1'}, - {"uHar;", '\U00002963'}, - {"uacute;", '\U000000FA'}, - {"uarr;", '\U00002191'}, - {"ubrcy;", '\U0000045E'}, - {"ubreve;", '\U0000016D'}, - {"ucirc;", '\U000000FB'}, - {"ucy;", '\U00000443'}, - {"udarr;", '\U000021C5'}, - {"udblac;", '\U00000171'}, - {"udhar;", '\U0000296E'}, - {"ufisht;", '\U0000297E'}, - {"ufr;", '\U0001D532'}, - {"ugrave;", '\U000000F9'}, - {"uharl;", '\U000021BF'}, - {"uharr;", '\U000021BE'}, - {"uhblk;", '\U00002580'}, - {"ulcorn;", '\U0000231C'}, - {"ulcorner;", '\U0000231C'}, - {"ulcrop;", '\U0000230F'}, - {"ultri;", '\U000025F8'}, - {"umacr;", '\U0000016B'}, - {"uml;", '\U000000A8'}, - {"uogon;", '\U00000173'}, - {"uopf;", '\U0001D566'}, - {"uparrow;", '\U00002191'}, - {"updownarrow;", '\U00002195'}, - {"upharpoonleft;", '\U000021BF'}, - {"upharpoonright;", '\U000021BE'}, - {"uplus;", '\U0000228E'}, - {"upsi;", '\U000003C5'}, - {"upsih;", '\U000003D2'}, - {"upsilon;", '\U000003C5'}, - {"upuparrows;", '\U000021C8'}, - {"urcorn;", '\U0000231D'}, - {"urcorner;", '\U0000231D'}, - {"urcrop;", '\U0000230E'}, - {"uring;", '\U0000016F'}, - {"urtri;", '\U000025F9'}, - {"uscr;", '\U0001D4CA'}, - {"utdot;", '\U000022F0'}, - {"utilde;", '\U00000169'}, - {"utri;", '\U000025B5'}, - {"utrif;", '\U000025B4'}, - {"uuarr;", '\U000021C8'}, - {"uuml;", '\U000000FC'}, - {"uwangle;", '\U000029A7'}, - {"vArr;", '\U000021D5'}, - {"vBar;", '\U00002AE8'}, - {"vBarv;", '\U00002AE9'}, - {"vDash;", '\U000022A8'}, - {"vangrt;", '\U0000299C'}, - {"varepsilon;", '\U000003F5'}, - {"varkappa;", '\U000003F0'}, - {"varnothing;", '\U00002205'}, - {"varphi;", '\U000003D5'}, - {"varpi;", '\U000003D6'}, - {"varpropto;", '\U0000221D'}, - {"varr;", '\U00002195'}, - {"varrho;", '\U000003F1'}, - {"varsigma;", '\U000003C2'}, - {"vartheta;", '\U000003D1'}, - {"vartriangleleft;", '\U000022B2'}, - {"vartriangleright;", '\U000022B3'}, - {"vcy;", '\U00000432'}, - {"vdash;", '\U000022A2'}, - {"vee;", '\U00002228'}, - {"veebar;", '\U000022BB'}, - {"veeeq;", '\U0000225A'}, - {"vellip;", '\U000022EE'}, - {"verbar;", '\U0000007C'}, - {"vert;", '\U0000007C'}, - {"vfr;", '\U0001D533'}, - {"vltri;", '\U000022B2'}, - {"vopf;", '\U0001D567'}, - {"vprop;", '\U0000221D'}, - {"vrtri;", '\U000022B3'}, - {"vscr;", '\U0001D4CB'}, - {"vzigzag;", '\U0000299A'}, - {"wcirc;", '\U00000175'}, - {"wedbar;", '\U00002A5F'}, - {"wedge;", '\U00002227'}, - {"wedgeq;", '\U00002259'}, - {"weierp;", '\U00002118'}, - {"wfr;", '\U0001D534'}, - {"wopf;", '\U0001D568'}, - {"wp;", '\U00002118'}, - {"wr;", '\U00002240'}, - {"wreath;", '\U00002240'}, - {"wscr;", '\U0001D4CC'}, - {"xcap;", '\U000022C2'}, - {"xcirc;", '\U000025EF'}, - {"xcup;", '\U000022C3'}, - {"xdtri;", '\U000025BD'}, - {"xfr;", '\U0001D535'}, - {"xhArr;", '\U000027FA'}, - {"xharr;", '\U000027F7'}, - {"xi;", '\U000003BE'}, - {"xlArr;", '\U000027F8'}, - {"xlarr;", '\U000027F5'}, - {"xmap;", '\U000027FC'}, - {"xnis;", '\U000022FB'}, - {"xodot;", '\U00002A00'}, - {"xopf;", '\U0001D569'}, - {"xoplus;", '\U00002A01'}, - {"xotime;", '\U00002A02'}, - {"xrArr;", '\U000027F9'}, - {"xrarr;", '\U000027F6'}, - {"xscr;", '\U0001D4CD'}, - {"xsqcup;", '\U00002A06'}, - {"xuplus;", '\U00002A04'}, - {"xutri;", '\U000025B3'}, - {"xvee;", '\U000022C1'}, - {"xwedge;", '\U000022C0'}, - {"yacute;", '\U000000FD'}, - {"yacy;", '\U0000044F'}, - {"ycirc;", '\U00000177'}, - {"ycy;", '\U0000044B'}, - {"yen;", '\U000000A5'}, - {"yfr;", '\U0001D536'}, - {"yicy;", '\U00000457'}, - {"yopf;", '\U0001D56A'}, - {"yscr;", '\U0001D4CE'}, - {"yucy;", '\U0000044E'}, - {"yuml;", '\U000000FF'}, - {"zacute;", '\U0000017A'}, - {"zcaron;", '\U0000017E'}, - {"zcy;", '\U00000437'}, - {"zdot;", '\U0000017C'}, - {"zeetrf;", '\U00002128'}, - {"zeta;", '\U000003B6'}, - {"zfr;", '\U0001D537'}, - {"zhcy;", '\U00000436'}, - {"zigrarr;", '\U000021DD'}, - {"zopf;", '\U0001D56B'}, - {"zscr;", '\U0001D4CF'}, - {"zwj;", '\U0000200D'}, - {"zwnj;", '\U0000200C'}, - - {"Aacute", '\U000000C1'}, - {"aacute", '\U000000E1'}, - {"Acirc", '\U000000C2'}, - {"acirc", '\U000000E2'}, - {"acute", '\U000000B4'}, - {"AElig", '\U000000C6'}, - {"aelig", '\U000000E6'}, - {"Agrave", '\U000000C0'}, - {"agrave", '\U000000E0'}, - {"AMP", '\U00000026'}, - {"amp", '\U00000026'}, - {"Aring", '\U000000C5'}, - {"aring", '\U000000E5'}, - {"Atilde", '\U000000C3'}, - {"atilde", '\U000000E3'}, - {"Auml", '\U000000C4'}, - {"auml", '\U000000E4'}, - {"brvbar", '\U000000A6'}, - {"Ccedil", '\U000000C7'}, - {"ccedil", '\U000000E7'}, - {"cedil", '\U000000B8'}, - {"cent", '\U000000A2'}, - {"COPY", '\U000000A9'}, - {"copy", '\U000000A9'}, - {"curren", '\U000000A4'}, - {"deg", '\U000000B0'}, - {"divide", '\U000000F7'}, - {"Eacute", '\U000000C9'}, - {"eacute", '\U000000E9'}, - {"Ecirc", '\U000000CA'}, - {"ecirc", '\U000000EA'}, - {"Egrave", '\U000000C8'}, - {"egrave", '\U000000E8'}, - {"ETH", '\U000000D0'}, - {"eth", '\U000000F0'}, - {"Euml", '\U000000CB'}, - {"euml", '\U000000EB'}, - {"frac12", '\U000000BD'}, - {"frac14", '\U000000BC'}, - {"frac34", '\U000000BE'}, - {"GT", '\U0000003E'}, - {"gt", '\U0000003E'}, - {"Iacute", '\U000000CD'}, - {"iacute", '\U000000ED'}, - {"Icirc", '\U000000CE'}, - {"icirc", '\U000000EE'}, - {"iexcl", '\U000000A1'}, - {"Igrave", '\U000000CC'}, - {"igrave", '\U000000EC'}, - {"iquest", '\U000000BF'}, - {"Iuml", '\U000000CF'}, - {"iuml", '\U000000EF'}, - {"laquo", '\U000000AB'}, - {"LT", '\U0000003C'}, - {"lt", '\U0000003C'}, - {"macr", '\U000000AF'}, - {"micro", '\U000000B5'}, - {"middot", '\U000000B7'}, - {"nbsp", '\U000000A0'}, - {"not", '\U000000AC'}, - {"Ntilde", '\U000000D1'}, - {"ntilde", '\U000000F1'}, - {"Oacute", '\U000000D3'}, - {"oacute", '\U000000F3'}, - {"Ocirc", '\U000000D4'}, - {"ocirc", '\U000000F4'}, - {"Ograve", '\U000000D2'}, - {"ograve", '\U000000F2'}, - {"ordf", '\U000000AA'}, - {"ordm", '\U000000BA'}, - {"Oslash", '\U000000D8'}, - {"oslash", '\U000000F8'}, - {"Otilde", '\U000000D5'}, - {"otilde", '\U000000F5'}, - {"Ouml", '\U000000D6'}, - {"ouml", '\U000000F6'}, - {"para", '\U000000B6'}, - {"plusmn", '\U000000B1'}, - {"pound", '\U000000A3'}, - {"QUOT", '\U00000022'}, - {"quot", '\U00000022'}, - {"raquo", '\U000000BB'}, - {"REG", '\U000000AE'}, - {"reg", '\U000000AE'}, - {"sect", '\U000000A7'}, - {"shy", '\U000000AD'}, - {"sup1", '\U000000B9'}, - {"sup2", '\U000000B2'}, - {"sup3", '\U000000B3'}, - {"szlig", '\U000000DF'}, - {"THORN", '\U000000DE'}, - {"thorn", '\U000000FE'}, - {"times", '\U000000D7'}, - {"Uacute", '\U000000DA'}, - {"uacute", '\U000000FA'}, - {"Ucirc", '\U000000DB'}, - {"ucirc", '\U000000FB'}, - {"Ugrave", '\U000000D9'}, - {"ugrave", '\U000000F9'}, - {"uml", '\U000000A8'}, - {"Uuml", '\U000000DC'}, - {"uuml", '\U000000FC'}, - {"Yacute", '\U000000DD'}, - {"yacute", '\U000000FD'}, - {"yen", '\U000000A5'}, - {"yuml", '\U000000FF'}, -} - -@(private="file", rodata) -_entity2 := [?]struct{n: string, r: [2]rune}{ - {"acE;", {'\u223E', '\u0333'}}, - {"bne;", {'\u003D', '\u20E5'}}, - {"bnequiv;", {'\u2261', '\u20E5'}}, - {"caps;", {'\u2229', '\uFE00'}}, - {"cups;", {'\u222A', '\uFE00'}}, - {"fjlig;", {'\u0066', '\u006A'}}, - {"gesl;", {'\u22DB', '\uFE00'}}, - {"gvertneqq;", {'\u2269', '\uFE00'}}, - {"gvnE;", {'\u2269', '\uFE00'}}, - {"lates;", {'\u2AAD', '\uFE00'}}, - {"lesg;", {'\u22DA', '\uFE00'}}, - {"lvertneqq;", {'\u2268', '\uFE00'}}, - {"lvnE;", {'\u2268', '\uFE00'}}, - {"nang;", {'\u2220', '\u20D2'}}, - {"napE;", {'\u2A70', '\u0338'}}, - {"napid;", {'\u224B', '\u0338'}}, - {"nbump;", {'\u224E', '\u0338'}}, - {"nbumpe;", {'\u224F', '\u0338'}}, - {"ncongdot;", {'\u2A6D', '\u0338'}}, - {"nedot;", {'\u2250', '\u0338'}}, - {"nesim;", {'\u2242', '\u0338'}}, - {"ngE;", {'\u2267', '\u0338'}}, - {"ngeqq;", {'\u2267', '\u0338'}}, - {"ngeqslant;", {'\u2A7E', '\u0338'}}, - {"nges;", {'\u2A7E', '\u0338'}}, - {"nGg;", {'\u22D9', '\u0338'}}, - {"nGt;", {'\u226B', '\u20D2'}}, - {"nGtv;", {'\u226B', '\u0338'}}, - {"nlE;", {'\u2266', '\u0338'}}, - {"nleqq;", {'\u2266', '\u0338'}}, - {"nleqslant;", {'\u2A7D', '\u0338'}}, - {"nles;", {'\u2A7D', '\u0338'}}, - {"nLl;", {'\u22D8', '\u0338'}}, - {"nLt;", {'\u226A', '\u20D2'}}, - {"nLtv;", {'\u226A', '\u0338'}}, - {"NotEqualTilde;", {'\u2242', '\u0338'}}, - {"NotGreaterFullEqual;", {'\u2267', '\u0338'}}, - {"NotGreaterGreater;", {'\u226B', '\u0338'}}, - {"NotGreaterSlantEqual;", {'\u2A7E', '\u0338'}}, - {"NotHumpDownHump;", {'\u224E', '\u0338'}}, - {"NotHumpEqual;", {'\u224F', '\u0338'}}, - {"notindot;", {'\u22F5', '\u0338'}}, - {"notinE;", {'\u22F9', '\u0338'}}, - {"NotLeftTriangleBar;", {'\u29CF', '\u0338'}}, - {"NotLessLess;", {'\u226A', '\u0338'}}, - {"NotLessSlantEqual;", {'\u2A7D', '\u0338'}}, - {"NotNestedGreaterGreater;", {'\u2AA2', '\u0338'}}, - {"NotNestedLessLess;", {'\u2AA1', '\u0338'}}, - {"NotPrecedesEqual;", {'\u2AAF', '\u0338'}}, - {"NotRightTriangleBar;", {'\u29D0', '\u0338'}}, - {"NotSquareSubset;", {'\u228F', '\u0338'}}, - {"NotSquareSuperset;", {'\u2290', '\u0338'}}, - {"NotSubset;", {'\u2282', '\u20D2'}}, - {"NotSucceedsEqual;", {'\u2AB0', '\u0338'}}, - {"NotSucceedsTilde;", {'\u227F', '\u0338'}}, - {"NotSuperset;", {'\u2283', '\u20D2'}}, - {"nparsl;", {'\u2AFD', '\u20E5'}}, - {"npart;", {'\u2202', '\u0338'}}, - {"npre;", {'\u2AAF', '\u0338'}}, - {"npreceq;", {'\u2AAF', '\u0338'}}, - {"nrarrc;", {'\u2933', '\u0338'}}, - {"nrarrw;", {'\u219D', '\u0338'}}, - {"nsce;", {'\u2AB0', '\u0338'}}, - {"nsubE;", {'\u2AC5', '\u0338'}}, - {"nsubset;", {'\u2282', '\u20D2'}}, - {"nsubseteqq;", {'\u2AC5', '\u0338'}}, - {"nsucceq;", {'\u2AB0', '\u0338'}}, - {"nsupE;", {'\u2AC6', '\u0338'}}, - {"nsupset;", {'\u2283', '\u20D2'}}, - {"nsupseteqq;", {'\u2AC6', '\u0338'}}, - {"nvap;", {'\u224D', '\u20D2'}}, - {"nvge;", {'\u2265', '\u20D2'}}, - {"nvgt;", {'\u003E', '\u20D2'}}, - {"nvle;", {'\u2264', '\u20D2'}}, - {"nvlt;", {'\u003C', '\u20D2'}}, - {"nvltrie;", {'\u22B4', '\u20D2'}}, - {"nvrtrie;", {'\u22B5', '\u20D2'}}, - {"nvsim;", {'\u223C', '\u20D2'}}, - {"race;", {'\u223D', '\u0331'}}, - {"smtes;", {'\u2AAC', '\uFE00'}}, - {"sqcaps;", {'\u2293', '\uFE00'}}, - {"sqcups;", {'\u2294', '\uFE00'}}, - {"ThickSpace;", {'\u205F', '\u200A'}}, - {"varsubsetneq;", {'\u228A', '\uFE00'}}, - {"varsubsetneqq;", {'\u2ACB', '\uFE00'}}, - {"varsupsetneq;", {'\u228B', '\uFE00'}}, - {"varsupsetneqq;", {'\u2ACC', '\uFE00'}}, - {"vnsub;", {'\u2282', '\u20D2'}}, - {"vnsup;", {'\u2283', '\u20D2'}}, - {"vsubne;", {'\u228A', '\uFE00'}}, - {"vsubnE;", {'\u2ACB', '\uFE00'}}, - {"vsupne;", {'\u228B', '\uFE00'}}, - {"vsupnE;", {'\u2ACC', '\uFE00'}}, -} \ No newline at end of file diff --git a/core/unicode/tools/generate_entity_table.odin b/core/unicode/tools/generate_entity_table.odin index 020ef94e4..b5ee0d22d 100644 --- a/core/unicode/tools/generate_entity_table.odin +++ b/core/unicode/tools/generate_entity_table.odin @@ -18,7 +18,7 @@ OPTIONS :: xml.Options{ flags = { .Ignore_Unsupported, }, expected_doctype = "un Entity :: struct { name: string, - codepoint: rune, + codepoints: [2]rune, description: string, } @@ -57,7 +57,10 @@ generate_encoding_entity_table :: proc() { fmt.printf("Found `` with %v children.\n", len(charlist.value)) entity_map: map[string]Entity + defer delete(entity_map) + names: [dynamic]string + defer delete(names) min_name_length := max(int) max_name_length := min(int) @@ -78,7 +81,13 @@ generate_encoding_entity_table :: proc() { fmt.eprintln("`` attribute not found.") os.exit(1) } else { - codepoint := strconv.atoi(codepoint_string) + r1, _, r2 := strings.partition(codepoint_string, "-") + + codepoint, codepoint2: int + codepoint, _ = strconv.parse_int(r1) + if r2 != "" { + codepoint2, _ = strconv.parse_int(r1) + } desc, desc_ok := xml.find_child_by_ident(doc, id, "description") description := "" @@ -115,7 +124,7 @@ generate_encoding_entity_table :: proc() { e := Entity{ name = name, - codepoint = rune(codepoint), + codepoints = {rune(codepoint), rune(codepoint2)}, description = description, } @@ -162,22 +171,22 @@ generate_encoding_entity_table :: proc() { entity_name - a string, like "copy" that describes a user-encoded Unicode entity as used in XML. Returns: - "decoded" - The decoded rune if found by name, or -1 otherwise. - "ok" - true if found, false if not. + "decoded" - The decoded runes if found by name, or all zero otherwise. + "rune_count" - The number of decoded runes + "ok" - true if found, false if not. IMPORTANT: XML processors (including browsers) treat these names as case-sensitive. So do we. */ -named_xml_entity_to_rune :: proc(name: string) -> (decoded: rune, ok: bool) { +named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: int, ok: bool) { /* Early out if the name is too short or too long. min as a precaution in case the generated table has a bogus value. */ if len(name) < min(1, XML_NAME_TO_RUNE_MIN_LENGTH) || len(name) > XML_NAME_TO_RUNE_MAX_LENGTH { - return -1, false + return } - switch rune(name[0]) { -`) + switch rune(name[0]) {`) prefix := '?' should_close := false @@ -200,13 +209,17 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: rune, ok: bool) { fmt.wprintf(w, " ") } fmt.wprintf(w, " // %v\n", e.description) - fmt.wprintf(w, "\t\t\treturn %v, true\n", rune_to_string(e.codepoint)) + if e.codepoints[1] != 0 { + fmt.wprintf(w, "\t\t\treturn {{%q, %q}}, 2, true\n", e.codepoints[0], e.codepoints[1]) + } else { + fmt.wprintf(w, "\t\t\treturn {{%q, 0}}, 1, true\n", e.codepoints[0]) + } should_close = true } fmt.wprintln(w, "\t\t}") fmt.wprintln(w, "\t}") - fmt.wprintln(w, "\treturn -1, false") + fmt.wprintln(w, "\treturn") fmt.wprintln(w, "}\n") fmt.wprintln(w, GENERATED) @@ -221,12 +234,6 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: rune, ok: bool) { } else { fmt.printf("Failed to write generated \"%v\".\n", generated_filename) } - - delete(entity_map) - delete(names) - for &name in names { - free(&name) - } } GENERATED :: `/* @@ -262,14 +269,6 @@ TABLE_FILE_PROLOG :: `/* */ ` -rune_to_string :: proc(r: rune) -> (res: string) { - res = fmt.tprintf("%08x", int(r)) - for len(res) > 2 && res[:2] == "00" { - res = res[2:] - } - return fmt.tprintf("rune(0x%v)", res) -} - is_dotted_name :: proc(name: string) -> (dotted: bool) { for r in name { if r == '.' { return true} From 871cedc70173503d6cfec16d8533c3b3520b6afb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 18 Jan 2026 11:47:51 +0000 Subject: [PATCH 215/766] Keep `-vet` happy --- core/encoding/entity/entity.odin | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/encoding/entity/entity.odin b/core/encoding/entity/entity.odin index 0d455ef88..95a404a81 100644 --- a/core/encoding/entity/entity.odin +++ b/core/encoding/entity/entity.odin @@ -300,17 +300,17 @@ escape_html :: proc(s: string, allocator := context.allocator, loc := #caller_lo w := 0 for c in b { - s := "" + x := "" switch c { - case '&': s = "&" - case '\'': s = "'" - case '<': s = "<" - case '>': s = ">" - case '"': s = """ + case '&': x = "&" + case '\'': x = "'" + case '<': x = "<" + case '>': x = ">" + case '"': x = """ } - if s != "" { - copy(t[w:], s) - w += len(s) + if x != "" { + copy(t[w:], x) + w += len(x) } else { t[w] = c w += 1 From 625e17212d5e99a99ec5e35defa2ad0bb6a39a10 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 18 Jan 2026 12:13:03 +0000 Subject: [PATCH 216/766] Correct 2 rune printing --- core/unicode/tools/generate_entity_table.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/unicode/tools/generate_entity_table.odin b/core/unicode/tools/generate_entity_table.odin index b5ee0d22d..9517b632b 100644 --- a/core/unicode/tools/generate_entity_table.odin +++ b/core/unicode/tools/generate_entity_table.odin @@ -86,7 +86,7 @@ generate_encoding_entity_table :: proc() { codepoint, codepoint2: int codepoint, _ = strconv.parse_int(r1) if r2 != "" { - codepoint2, _ = strconv.parse_int(r1) + codepoint2, _ = strconv.parse_int(r2) } desc, desc_ok := xml.find_child_by_ident(doc, id, "description") From ba20bfa5f45d4f4357bbbce5ccf931b27cf38431 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 18 Jan 2026 12:17:28 +0000 Subject: [PATCH 217/766] Update generated.odin --- core/encoding/entity/generated.odin | 202 ++++++++++++++-------------- 1 file changed, 101 insertions(+), 101 deletions(-) diff --git a/core/encoding/entity/generated.odin b/core/encoding/entity/generated.odin index 553554976..0096c8199 100644 --- a/core/encoding/entity/generated.odin +++ b/core/encoding/entity/generated.odin @@ -794,7 +794,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "NotEqual": // NOT EQUAL TO return {'\u2260', 0}, 1, true case "NotEqualTilde": // MINUS TILDE with slash - return {'\u2242', '\u2242'}, 2, true + return {'\u2242', '\u0338'}, 2, true case "NotExists": // THERE DOES NOT EXIST return {'\u2204', 0}, 1, true case "NotGreater": // NOT GREATER-THAN @@ -802,23 +802,23 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "NotGreaterEqual": // NEITHER GREATER-THAN NOR EQUAL TO return {'\u2271', 0}, 1, true case "NotGreaterFullEqual": // GREATER-THAN OVER EQUAL TO with slash - return {'\u2267', '\u2267'}, 2, true + return {'\u2267', '\u0338'}, 2, true case "NotGreaterGreater": // MUCH GREATER THAN with slash - return {'\u226b', '\u226b'}, 2, true + return {'\u226b', '\u0338'}, 2, true case "NotGreaterLess": // NEITHER GREATER-THAN NOR LESS-THAN return {'\u2279', 0}, 1, true case "NotGreaterSlantEqual": // GREATER-THAN OR SLANTED EQUAL TO with slash - return {'\u2a7e', '\u2a7e'}, 2, true + return {'\u2a7e', '\u0338'}, 2, true case "NotGreaterTilde": // NEITHER GREATER-THAN NOR EQUIVALENT TO return {'\u2275', 0}, 1, true case "NotHumpDownHump": // GEOMETRICALLY EQUIVALENT TO with slash - return {'\u224e', '\u224e'}, 2, true + return {'\u224e', '\u0338'}, 2, true case "NotHumpEqual": // DIFFERENCE BETWEEN with slash - return {'\u224f', '\u224f'}, 2, true + return {'\u224f', '\u0338'}, 2, true case "NotLeftTriangle": // NOT NORMAL SUBGROUP OF return {'\u22ea', 0}, 1, true case "NotLeftTriangleBar": // LEFT TRIANGLE BESIDE VERTICAL BAR with slash - return {'\u29cf', '\u29cf'}, 2, true + return {'\u29cf', '\u0338'}, 2, true case "NotLeftTriangleEqual": // NOT NORMAL SUBGROUP OF OR EQUAL TO return {'\u22ec', 0}, 1, true case "NotLess": // NOT LESS-THAN @@ -828,19 +828,19 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "NotLessGreater": // NEITHER LESS-THAN NOR GREATER-THAN return {'\u2278', 0}, 1, true case "NotLessLess": // MUCH LESS THAN with slash - return {'\u226a', '\u226a'}, 2, true + return {'\u226a', '\u0338'}, 2, true case "NotLessSlantEqual": // LESS-THAN OR SLANTED EQUAL TO with slash - return {'\u2a7d', '\u2a7d'}, 2, true + return {'\u2a7d', '\u0338'}, 2, true case "NotLessTilde": // NEITHER LESS-THAN NOR EQUIVALENT TO return {'\u2274', 0}, 1, true case "NotNestedGreaterGreater": // DOUBLE NESTED GREATER-THAN with slash - return {'\u2aa2', '\u2aa2'}, 2, true + return {'\u2aa2', '\u0338'}, 2, true case "NotNestedLessLess": // DOUBLE NESTED LESS-THAN with slash - return {'\u2aa1', '\u2aa1'}, 2, true + return {'\u2aa1', '\u0338'}, 2, true case "NotPrecedes": // DOES NOT PRECEDE return {'\u2280', 0}, 1, true case "NotPrecedesEqual": // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash - return {'\u2aaf', '\u2aaf'}, 2, true + return {'\u2aaf', '\u0338'}, 2, true case "NotPrecedesSlantEqual": // DOES NOT PRECEDE OR EQUAL return {'\u22e0', 0}, 1, true case "NotReverseElement": // DOES NOT CONTAIN AS MEMBER @@ -848,31 +848,31 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "NotRightTriangle": // DOES NOT CONTAIN AS NORMAL SUBGROUP return {'\u22eb', 0}, 1, true case "NotRightTriangleBar": // VERTICAL BAR BESIDE RIGHT TRIANGLE with slash - return {'\u29d0', '\u29d0'}, 2, true + return {'\u29d0', '\u0338'}, 2, true case "NotRightTriangleEqual": // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL return {'\u22ed', 0}, 1, true case "NotSquareSubset": // SQUARE IMAGE OF with slash - return {'\u228f', '\u228f'}, 2, true + return {'\u228f', '\u0338'}, 2, true case "NotSquareSubsetEqual": // NOT SQUARE IMAGE OF OR EQUAL TO return {'\u22e2', 0}, 1, true case "NotSquareSuperset": // SQUARE ORIGINAL OF with slash - return {'\u2290', '\u2290'}, 2, true + return {'\u2290', '\u0338'}, 2, true case "NotSquareSupersetEqual": // NOT SQUARE ORIGINAL OF OR EQUAL TO return {'\u22e3', 0}, 1, true case "NotSubset": // SUBSET OF with vertical line - return {'\u2282', '\u2282'}, 2, true + return {'\u2282', '\u20d2'}, 2, true case "NotSubsetEqual": // NEITHER A SUBSET OF NOR EQUAL TO return {'\u2288', 0}, 1, true case "NotSucceeds": // DOES NOT SUCCEED return {'\u2281', 0}, 1, true case "NotSucceedsEqual": // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash - return {'\u2ab0', '\u2ab0'}, 2, true + return {'\u2ab0', '\u0338'}, 2, true case "NotSucceedsSlantEqual": // DOES NOT SUCCEED OR EQUAL return {'\u22e1', 0}, 1, true case "NotSucceedsTilde": // SUCCEEDS OR EQUIVALENT TO with slash - return {'\u227f', '\u227f'}, 2, true + return {'\u227f', '\u0338'}, 2, true case "NotSuperset": // SUPERSET OF with vertical line - return {'\u2283', '\u2283'}, 2, true + return {'\u2283', '\u20d2'}, 2, true case "NotSupersetEqual": // NEITHER A SUPERSET OF NOR EQUAL TO return {'\u2289', 0}, 1, true case "NotTilde": // NOT TILDE @@ -1224,7 +1224,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "Thetav": // GREEK CAPITAL THETA SYMBOL return {'\u03f4', 0}, 1, true case "ThickSpace": // space of width 5/18 em - return {'\u205f', '\u205f'}, 2, true + return {'\u205f', '\u200a'}, 2, true case "ThinSpace": // THIN SPACE return {'\u2009', 0}, 1, true case "Tilde": // TILDE OPERATOR @@ -1454,7 +1454,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "ac": // INVERTED LAZY S return {'\u223e', 0}, 1, true case "acE": // INVERTED LAZY S with double underline - return {'\u223e', '\u223e'}, 2, true + return {'\u223e', '\u0333'}, 2, true case "acd": // SINE WAVE return {'\u223f', 0}, 1, true case "acirc": // LATIN SMALL LETTER A WITH CIRCUMFLEX @@ -1788,9 +1788,9 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "bluhar": // LEFTWARDS HARPOON WITH BARB UP FROM BAR return {'\u295a', 0}, 1, true case "bne": // EQUALS SIGN with reverse slash - return {'=', '='}, 2, true + return {'=', '\u20e5'}, 2, true case "bnequiv": // IDENTICAL TO with reverse slash - return {'\u2261', '\u2261'}, 2, true + return {'\u2261', '\u20e5'}, 2, true case "bnot": // REVERSED NOT SIGN return {'\u2310', 0}, 1, true case "bopf": // MATHEMATICAL DOUBLE-STRUCK SMALL B @@ -1952,7 +1952,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "capint": // INTEGRAL WITH INTERSECTION return {'\u2a19', 0}, 1, true case "caps": // INTERSECTION with serifs - return {'\u2229', '\u2229'}, 2, true + return {'\u2229', '\ufe00'}, 2, true case "caret": // CARET INSERTION POINT return {'\u2041', 0}, 1, true case "caron": // CARON @@ -2112,7 +2112,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "cupre": // PRECEDES OR EQUAL TO return {'\u227c', 0}, 1, true case "cups": // UNION with serifs - return {'\u222a', '\u222a'}, 2, true + return {'\u222a', '\ufe00'}, 2, true case "curarr": // CLOCKWISE TOP SEMICIRCLE ARROW return {'\u21b7', 0}, 1, true case "curarrm": // TOP ARC CLOCKWISE ARROW WITH MINUS @@ -2478,7 +2478,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "filig": // LATIN SMALL LIGATURE FI return {'\ufb01', 0}, 1, true case "fjlig": // fj ligature - return {'f', 'f'}, 2, true + return {'f', 'j'}, 2, true case "flat": // MUSIC FLAT SIGN return {'\u266d', 0}, 1, true case "fllig": // LATIN SMALL LIGATURE FL @@ -2580,7 +2580,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "gesdotol": // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT return {'\u2a84', 0}, 1, true case "gesl": // GREATER-THAN slanted EQUAL TO OR LESS-THAN - return {'\u22db', '\u22db'}, 2, true + return {'\u22db', '\ufe00'}, 2, true case "gesles": // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL return {'\u2a94', 0}, 1, true case "gfr": // MATHEMATICAL FRAKTUR SMALL G @@ -2660,9 +2660,9 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "gtrsim": // GREATER-THAN OR EQUIVALENT TO return {'\u2273', 0}, 1, true case "gvertneqq": // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke - return {'\u2269', '\u2269'}, 2, true + return {'\u2269', '\ufe00'}, 2, true case "gvnE": // GREATER-THAN BUT NOT EQUAL TO - with vertical stroke - return {'\u2269', '\u2269'}, 2, true + return {'\u2269', '\ufe00'}, 2, true } case 'h': @@ -2958,7 +2958,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "late": // LARGER THAN OR EQUAL TO return {'\u2aad', 0}, 1, true case "lates": // LARGER THAN OR slanted EQUAL - return {'\u2aad', '\u2aad'}, 2, true + return {'\u2aad', '\ufe00'}, 2, true case "lbarr": // LEFTWARDS DOUBLE DASH ARROW return {'\u290c', 0}, 1, true case "lbbrk": // LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT @@ -3042,7 +3042,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "lesdotor": // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT return {'\u2a83', 0}, 1, true case "lesg": // LESS-THAN slanted EQUAL TO OR GREATER-THAN - return {'\u22da', '\u22da'}, 2, true + return {'\u22da', '\ufe00'}, 2, true case "lesges": // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL return {'\u2a93', 0}, 1, true case "lessapprox": // LESS-THAN OR APPROXIMATE @@ -3232,9 +3232,9 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "lurushar": // LEFT BARB UP RIGHT BARB UP HARPOON return {'\u294e', 0}, 1, true case "lvertneqq": // LESS-THAN BUT NOT EQUAL TO - with vertical stroke - return {'\u2268', '\u2268'}, 2, true + return {'\u2268', '\ufe00'}, 2, true case "lvnE": // LESS-THAN BUT NOT EQUAL TO - with vertical stroke - return {'\u2268', '\u2268'}, 2, true + return {'\u2268', '\ufe00'}, 2, true } case 'm': @@ -3320,21 +3320,21 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case 'n': switch name { case "nGg": // VERY MUCH GREATER-THAN with slash - return {'\u22d9', '\u22d9'}, 2, true + return {'\u22d9', '\u0338'}, 2, true case "nGt": // MUCH GREATER THAN with vertical line - return {'\u226b', '\u226b'}, 2, true + return {'\u226b', '\u20d2'}, 2, true case "nGtv": // MUCH GREATER THAN with slash - return {'\u226b', '\u226b'}, 2, true + return {'\u226b', '\u0338'}, 2, true case "nLeftarrow": // LEFTWARDS DOUBLE ARROW WITH STROKE return {'\u21cd', 0}, 1, true case "nLeftrightarrow": // LEFT RIGHT DOUBLE ARROW WITH STROKE return {'\u21ce', 0}, 1, true case "nLl": // VERY MUCH LESS-THAN with slash - return {'\u22d8', '\u22d8'}, 2, true + return {'\u22d8', '\u0338'}, 2, true case "nLt": // MUCH LESS THAN with vertical line - return {'\u226a', '\u226a'}, 2, true + return {'\u226a', '\u20d2'}, 2, true case "nLtv": // MUCH LESS THAN with slash - return {'\u226a', '\u226a'}, 2, true + return {'\u226a', '\u0338'}, 2, true case "nRightarrow": // RIGHTWARDS DOUBLE ARROW WITH STROKE return {'\u21cf', 0}, 1, true case "nVDash": // NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE @@ -3346,13 +3346,13 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nacute": // LATIN SMALL LETTER N WITH ACUTE return {'\u0144', 0}, 1, true case "nang": // ANGLE with vertical line - return {'\u2220', '\u2220'}, 2, true + return {'\u2220', '\u20d2'}, 2, true case "nap": // NOT ALMOST EQUAL TO return {'\u2249', 0}, 1, true case "napE": // APPROXIMATELY EQUAL OR EQUAL TO with slash - return {'\u2a70', '\u2a70'}, 2, true + return {'\u2a70', '\u0338'}, 2, true case "napid": // TRIPLE TILDE with slash - return {'\u224b', '\u224b'}, 2, true + return {'\u224b', '\u0338'}, 2, true case "napos": // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE return {'\u0149', 0}, 1, true case "napprox": // NOT ALMOST EQUAL TO @@ -3366,9 +3366,9 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nbsp": // NO-BREAK SPACE return {'\u00a0', 0}, 1, true case "nbump": // GEOMETRICALLY EQUIVALENT TO with slash - return {'\u224e', '\u224e'}, 2, true + return {'\u224e', '\u0338'}, 2, true case "nbumpe": // DIFFERENCE BETWEEN with slash - return {'\u224f', '\u224f'}, 2, true + return {'\u224f', '\u0338'}, 2, true case "ncap": // INTERSECTION WITH OVERBAR return {'\u2a43', 0}, 1, true case "ncaron": // LATIN SMALL LETTER N WITH CARON @@ -3378,7 +3378,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "ncong": // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO return {'\u2247', 0}, 1, true case "ncongdot": // CONGRUENT WITH DOT ABOVE with slash - return {'\u2a6d', '\u2a6d'}, 2, true + return {'\u2a6d', '\u0338'}, 2, true case "ncup": // UNION WITH OVERBAR return {'\u2a42', 0}, 1, true case "ncy": // CYRILLIC SMALL LETTER EN @@ -3396,7 +3396,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nearrow": // NORTH EAST ARROW return {'\u2197', 0}, 1, true case "nedot": // APPROACHES THE LIMIT with slash - return {'\u2250', '\u2250'}, 2, true + return {'\u2250', '\u0338'}, 2, true case "neonwarr": // NORTH EAST ARROW CROSSING NORTH WEST ARROW return {'\u2931', 0}, 1, true case "neosearr": // NORTH EAST ARROW CROSSING SOUTH EAST ARROW @@ -3406,7 +3406,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nesear": // NORTH EAST ARROW AND SOUTH EAST ARROW return {'\u2928', 0}, 1, true case "nesim": // MINUS TILDE with slash - return {'\u2242', '\u2242'}, 2, true + return {'\u2242', '\u0338'}, 2, true case "neswsarr": // NORTH EAST AND SOUTH WEST ARROW return {'\u2922', 0}, 1, true case "nexist": // THERE DOES NOT EXIST @@ -3416,17 +3416,17 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nfr": // MATHEMATICAL FRAKTUR SMALL N return {'\U0001d52b', 0}, 1, true case "ngE": // GREATER-THAN OVER EQUAL TO with slash - return {'\u2267', '\u2267'}, 2, true + return {'\u2267', '\u0338'}, 2, true case "nge": // NEITHER GREATER-THAN NOR EQUAL TO return {'\u2271', 0}, 1, true case "ngeq": // NEITHER GREATER-THAN NOR EQUAL TO return {'\u2271', 0}, 1, true case "ngeqq": // GREATER-THAN OVER EQUAL TO with slash - return {'\u2267', '\u2267'}, 2, true + return {'\u2267', '\u0338'}, 2, true case "ngeqslant": // GREATER-THAN OR SLANTED EQUAL TO with slash - return {'\u2a7e', '\u2a7e'}, 2, true + return {'\u2a7e', '\u0338'}, 2, true case "nges": // GREATER-THAN OR SLANTED EQUAL TO with slash - return {'\u2a7e', '\u2a7e'}, 2, true + return {'\u2a7e', '\u0338'}, 2, true case "ngr": // GREEK SMALL LETTER NU return {'\u03bd', 0}, 1, true case "ngsim": // NEITHER GREATER-THAN NOR EQUIVALENT TO @@ -3454,7 +3454,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nlArr": // LEFTWARDS DOUBLE ARROW WITH STROKE return {'\u21cd', 0}, 1, true case "nlE": // LESS-THAN OVER EQUAL TO with slash - return {'\u2266', '\u2266'}, 2, true + return {'\u2266', '\u0338'}, 2, true case "nlarr": // LEFTWARDS ARROW WITH STROKE return {'\u219a', 0}, 1, true case "nldr": // TWO DOT LEADER @@ -3468,11 +3468,11 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nleq": // NEITHER LESS-THAN NOR EQUAL TO return {'\u2270', 0}, 1, true case "nleqq": // LESS-THAN OVER EQUAL TO with slash - return {'\u2266', '\u2266'}, 2, true + return {'\u2266', '\u0338'}, 2, true case "nleqslant": // LESS-THAN OR SLANTED EQUAL TO with slash - return {'\u2a7d', '\u2a7d'}, 2, true + return {'\u2a7d', '\u0338'}, 2, true case "nles": // LESS-THAN OR SLANTED EQUAL TO with slash - return {'\u2a7d', '\u2a7d'}, 2, true + return {'\u2a7d', '\u0338'}, 2, true case "nless": // NOT LESS-THAN return {'\u226e', 0}, 1, true case "nlsim": // NEITHER LESS-THAN NOR EQUIVALENT TO @@ -3484,7 +3484,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nltrie": // NOT NORMAL SUBGROUP OF OR EQUAL TO return {'\u22ec', 0}, 1, true case "nltrivb": // LEFT TRIANGLE BESIDE VERTICAL BAR with slash - return {'\u29cf', '\u29cf'}, 2, true + return {'\u29cf', '\u0338'}, 2, true case "nmid": // DOES NOT DIVIDE return {'\u2224', 0}, 1, true case "nopf": // MATHEMATICAL DOUBLE-STRUCK SMALL N @@ -3494,9 +3494,9 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "notin": // NOT AN ELEMENT OF return {'\u2209', 0}, 1, true case "notinE": // ELEMENT OF WITH TWO HORIZONTAL STROKES with slash - return {'\u22f9', '\u22f9'}, 2, true + return {'\u22f9', '\u0338'}, 2, true case "notindot": // ELEMENT OF WITH DOT ABOVE with slash - return {'\u22f5', '\u22f5'}, 2, true + return {'\u22f5', '\u0338'}, 2, true case "notinva": // NOT AN ELEMENT OF return {'\u2209', 0}, 1, true case "notinvb": // SMALL ELEMENT OF WITH OVERBAR @@ -3516,9 +3516,9 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nparallel": // NOT PARALLEL TO return {'\u2226', 0}, 1, true case "nparsl": // DOUBLE SOLIDUS OPERATOR with reverse slash - return {'\u2afd', '\u2afd'}, 2, true + return {'\u2afd', '\u20e5'}, 2, true case "npart": // PARTIAL DIFFERENTIAL with slash - return {'\u2202', '\u2202'}, 2, true + return {'\u2202', '\u0338'}, 2, true case "npolint": // LINE INTEGRATION NOT INCLUDING THE POLE return {'\u2a14', 0}, 1, true case "npr": // DOES NOT PRECEDE @@ -3526,21 +3526,21 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nprcue": // DOES NOT PRECEDE OR EQUAL return {'\u22e0', 0}, 1, true case "npre": // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash - return {'\u2aaf', '\u2aaf'}, 2, true + return {'\u2aaf', '\u0338'}, 2, true case "nprec": // DOES NOT PRECEDE return {'\u2280', 0}, 1, true case "npreceq": // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash - return {'\u2aaf', '\u2aaf'}, 2, true + return {'\u2aaf', '\u0338'}, 2, true case "nprsim": // PRECEDES OR EQUIVALENT TO with slash - return {'\u227e', '\u227e'}, 2, true + return {'\u227e', '\u0338'}, 2, true case "nrArr": // RIGHTWARDS DOUBLE ARROW WITH STROKE return {'\u21cf', 0}, 1, true case "nrarr": // RIGHTWARDS ARROW WITH STROKE return {'\u219b', 0}, 1, true case "nrarrc": // WAVE ARROW POINTING DIRECTLY RIGHT with slash - return {'\u2933', '\u2933'}, 2, true + return {'\u2933', '\u0338'}, 2, true case "nrarrw": // RIGHTWARDS WAVE ARROW with slash - return {'\u219d', '\u219d'}, 2, true + return {'\u219d', '\u0338'}, 2, true case "nrightarrow": // RIGHTWARDS ARROW WITH STROKE return {'\u219b', 0}, 1, true case "nrtri": // DOES NOT CONTAIN AS NORMAL SUBGROUP @@ -3548,19 +3548,19 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nrtrie": // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL return {'\u22ed', 0}, 1, true case "nsGt": // DOUBLE NESTED GREATER-THAN with slash - return {'\u2aa2', '\u2aa2'}, 2, true + return {'\u2aa2', '\u0338'}, 2, true case "nsLt": // DOUBLE NESTED LESS-THAN with slash - return {'\u2aa1', '\u2aa1'}, 2, true + return {'\u2aa1', '\u0338'}, 2, true case "nsc": // DOES NOT SUCCEED return {'\u2281', 0}, 1, true case "nsccue": // DOES NOT SUCCEED OR EQUAL return {'\u22e1', 0}, 1, true case "nsce": // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash - return {'\u2ab0', '\u2ab0'}, 2, true + return {'\u2ab0', '\u0338'}, 2, true case "nscr": // MATHEMATICAL SCRIPT SMALL N return {'\U0001d4c3', 0}, 1, true case "nscsim": // SUCCEEDS OR EQUIVALENT TO with slash - return {'\u227f', '\u227f'}, 2, true + return {'\u227f', '\u0338'}, 2, true case "nshortmid": // DOES NOT DIVIDE return {'\u2224', 0}, 1, true case "nshortparallel": // NOT PARALLEL TO @@ -3576,41 +3576,41 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nspar": // NOT PARALLEL TO return {'\u2226', 0}, 1, true case "nsqsub": // SQUARE IMAGE OF with slash - return {'\u228f', '\u228f'}, 2, true + return {'\u228f', '\u0338'}, 2, true case "nsqsube": // NOT SQUARE IMAGE OF OR EQUAL TO return {'\u22e2', 0}, 1, true case "nsqsup": // SQUARE ORIGINAL OF with slash - return {'\u2290', '\u2290'}, 2, true + return {'\u2290', '\u0338'}, 2, true case "nsqsupe": // NOT SQUARE ORIGINAL OF OR EQUAL TO return {'\u22e3', 0}, 1, true case "nsub": // NOT A SUBSET OF return {'\u2284', 0}, 1, true case "nsubE": // SUBSET OF ABOVE EQUALS SIGN with slash - return {'\u2ac5', '\u2ac5'}, 2, true + return {'\u2ac5', '\u0338'}, 2, true case "nsube": // NEITHER A SUBSET OF NOR EQUAL TO return {'\u2288', 0}, 1, true case "nsubset": // SUBSET OF with vertical line - return {'\u2282', '\u2282'}, 2, true + return {'\u2282', '\u20d2'}, 2, true case "nsubseteq": // NEITHER A SUBSET OF NOR EQUAL TO return {'\u2288', 0}, 1, true case "nsubseteqq": // SUBSET OF ABOVE EQUALS SIGN with slash - return {'\u2ac5', '\u2ac5'}, 2, true + return {'\u2ac5', '\u0338'}, 2, true case "nsucc": // DOES NOT SUCCEED return {'\u2281', 0}, 1, true case "nsucceq": // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash - return {'\u2ab0', '\u2ab0'}, 2, true + return {'\u2ab0', '\u0338'}, 2, true case "nsup": // NOT A SUPERSET OF return {'\u2285', 0}, 1, true case "nsupE": // SUPERSET OF ABOVE EQUALS SIGN with slash - return {'\u2ac6', '\u2ac6'}, 2, true + return {'\u2ac6', '\u0338'}, 2, true case "nsupe": // NEITHER A SUPERSET OF NOR EQUAL TO return {'\u2289', 0}, 1, true case "nsupset": // SUPERSET OF with vertical line - return {'\u2283', '\u2283'}, 2, true + return {'\u2283', '\u20d2'}, 2, true case "nsupseteq": // NEITHER A SUPERSET OF NOR EQUAL TO return {'\u2289', 0}, 1, true case "nsupseteqq": // SUPERSET OF ABOVE EQUALS SIGN with slash - return {'\u2ac6', '\u2ac6'}, 2, true + return {'\u2ac6', '\u0338'}, 2, true case "ntgl": // NEITHER GREATER-THAN NOR LESS-THAN return {'\u2279', 0}, 1, true case "ntilde": // LATIN SMALL LETTER N WITH TILDE @@ -3638,31 +3638,31 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "nvHarr": // LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE return {'\u2904', 0}, 1, true case "nvap": // EQUIVALENT TO with vertical line - return {'\u224d', '\u224d'}, 2, true + return {'\u224d', '\u20d2'}, 2, true case "nvbrtri": // VERTICAL BAR BESIDE RIGHT TRIANGLE with slash - return {'\u29d0', '\u29d0'}, 2, true + return {'\u29d0', '\u0338'}, 2, true case "nvdash": // DOES NOT PROVE return {'\u22ac', 0}, 1, true case "nvge": // GREATER-THAN OR EQUAL TO with vertical line - return {'\u2265', '\u2265'}, 2, true + return {'\u2265', '\u20d2'}, 2, true case "nvgt": // GREATER-THAN SIGN with vertical line - return {'>', '>'}, 2, true + return {'>', '\u20d2'}, 2, true case "nvinfin": // INFINITY NEGATED WITH VERTICAL BAR return {'\u29de', 0}, 1, true case "nvlArr": // LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE return {'\u2902', 0}, 1, true case "nvle": // LESS-THAN OR EQUAL TO with vertical line - return {'\u2264', '\u2264'}, 2, true + return {'\u2264', '\u20d2'}, 2, true case "nvlt": // LESS-THAN SIGN with vertical line - return {'<', '<'}, 2, true + return {'<', '\u20d2'}, 2, true case "nvltrie": // NORMAL SUBGROUP OF OR EQUAL TO with vertical line - return {'\u22b4', '\u22b4'}, 2, true + return {'\u22b4', '\u20d2'}, 2, true case "nvrArr": // RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE return {'\u2903', 0}, 1, true case "nvrtrie": // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line - return {'\u22b5', '\u22b5'}, 2, true + return {'\u22b5', '\u20d2'}, 2, true case "nvsim": // TILDE OPERATOR with vertical line - return {'\u223c', '\u223c'}, 2, true + return {'\u223c', '\u20d2'}, 2, true case "nwArr": // NORTH WEST DOUBLE ARROW return {'\u21d6', 0}, 1, true case "nwarhk": // NORTH WEST ARROW WITH HOOK @@ -3996,7 +3996,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "rHar": // RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN return {'\u2964', 0}, 1, true case "race": // REVERSED TILDE with underline - return {'\u223d', '\u223d'}, 2, true + return {'\u223d', '\u0331'}, 2, true case "racute": // LATIN SMALL LETTER R WITH ACUTE return {'\u0155', 0}, 1, true case "radic": // SQUARE ROOT @@ -4360,7 +4360,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "smte": // SMALLER THAN OR EQUAL TO return {'\u2aac', 0}, 1, true case "smtes": // SMALLER THAN OR slanted EQUAL - return {'\u2aac', '\u2aac'}, 2, true + return {'\u2aac', '\ufe00'}, 2, true case "softcy": // CYRILLIC SMALL LETTER SOFT SIGN return {'\u044c', 0}, 1, true case "sol": // SOLIDUS @@ -4380,11 +4380,11 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "sqcap": // SQUARE CAP return {'\u2293', 0}, 1, true case "sqcaps": // SQUARE CAP with serifs - return {'\u2293', '\u2293'}, 2, true + return {'\u2293', '\ufe00'}, 2, true case "sqcup": // SQUARE CUP return {'\u2294', 0}, 1, true case "sqcups": // SQUARE CUP with serifs - return {'\u2294', '\u2294'}, 2, true + return {'\u2294', '\ufe00'}, 2, true case "sqsub": // SQUARE IMAGE OF return {'\u228f', 0}, 1, true case "sqsube": // SQUARE IMAGE OF OR EQUAL TO @@ -4856,13 +4856,13 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "varsigma": // GREEK SMALL LETTER FINAL SIGMA return {'\u03c2', 0}, 1, true case "varsubsetneq": // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members - return {'\u228a', '\u228a'}, 2, true + return {'\u228a', '\ufe00'}, 2, true case "varsubsetneqq": // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members - return {'\u2acb', '\u2acb'}, 2, true + return {'\u2acb', '\ufe00'}, 2, true case "varsupsetneq": // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members - return {'\u228b', '\u228b'}, 2, true + return {'\u228b', '\ufe00'}, 2, true case "varsupsetneqq": // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members - return {'\u2acc', '\u2acc'}, 2, true + return {'\u2acc', '\ufe00'}, 2, true case "vartheta": // GREEK THETA SYMBOL return {'\u03d1', 0}, 1, true case "vartriangleleft": // NORMAL SUBGROUP OF @@ -4902,9 +4902,9 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "vltri": // NORMAL SUBGROUP OF return {'\u22b2', 0}, 1, true case "vnsub": // SUBSET OF with vertical line - return {'\u2282', '\u2282'}, 2, true + return {'\u2282', '\u20d2'}, 2, true case "vnsup": // SUPERSET OF with vertical line - return {'\u2283', '\u2283'}, 2, true + return {'\u2283', '\u20d2'}, 2, true case "vopf": // MATHEMATICAL DOUBLE-STRUCK SMALL V return {'\U0001d567', 0}, 1, true case "vprime": // PRIME @@ -4916,13 +4916,13 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: case "vscr": // MATHEMATICAL SCRIPT SMALL V return {'\U0001d4cb', 0}, 1, true case "vsubnE": // SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members - return {'\u2acb', '\u2acb'}, 2, true + return {'\u2acb', '\ufe00'}, 2, true case "vsubne": // SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members - return {'\u228a', '\u228a'}, 2, true + return {'\u228a', '\ufe00'}, 2, true case "vsupnE": // SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members - return {'\u2acc', '\u2acc'}, 2, true + return {'\u2acc', '\ufe00'}, 2, true case "vsupne": // SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members - return {'\u228b', '\u228b'}, 2, true + return {'\u228b', '\ufe00'}, 2, true case "vzigzag": // VERTICAL ZIGZAG LINE return {'\u299a', 0}, 1, true } From ca507d059617e1a5b9f1cba600f42091694a44d0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 18 Jan 2026 12:30:55 +0000 Subject: [PATCH 218/766] Fix crc32 for `xml_test_entities_unbox_decode` --- tests/core/encoding/xml/test_core_xml.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/encoding/xml/test_core_xml.odin b/tests/core/encoding/xml/test_core_xml.odin index 409a8c9c0..30353e227 100644 --- a/tests/core/encoding/xml/test_core_xml.odin +++ b/tests/core/encoding/xml/test_core_xml.odin @@ -142,7 +142,7 @@ xml_test_entities_unbox_decode :: proc(t: ^testing.T) { }, expected_doctype = "html", }, - crc32 = 0x68d2571e, + crc32 = 0x6e45a697, }) } From 2ce21cd3f72eb192e1317b12b468b857e3aedfe1 Mon Sep 17 00:00:00 2001 From: konodin Date: Sun, 18 Jan 2026 21:42:14 +0100 Subject: [PATCH 219/766] Fix `endpoint_to_string` missing colon --- core/net/addr.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/net/addr.odin b/core/net/addr.odin index a3fa02cce..d29b46b65 100644 --- a/core/net/addr.odin +++ b/core/net/addr.odin @@ -619,6 +619,7 @@ endpoint_to_string :: proc(ep: Endpoint, allocator := context.temp_allocator) -> switch a in ep.address { case IP4_Address: strings.write_string(&b, s) + strings.write_string(&b, ":") strings.write_int(&b, ep.port) case IP6_Address: strings.write_string(&b, "[") From d838065d32bd5088ad5cd1707d4a961c19d3daa3 Mon Sep 17 00:00:00 2001 From: wpcasarin <72427968+wpcasarin@users.noreply.github.com> Date: Sun, 18 Jan 2026 23:28:52 -0300 Subject: [PATCH 220/766] vendor/x11/xlib: Fix XSetWindowBackgroundPixmap binding name Changed SetWindowBackgroundMap to SetWindowBackgroundPixmap to match the actual X11 C function name. The incorrect name caused linker errors. --- vendor/x11/xlib/xlib_procs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index c33c6d351..42e49ea02 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -241,7 +241,7 @@ foreign xlib { window: Window, pixel: uint, ) --- - SetWindowBackgroundMap :: proc( + SetWindowBackgroundPixmap :: proc( display: ^Display, window: Window, pixmap: Pixmap, From 45beed0fb381d514e8133fa5d527dcc425a7a867 Mon Sep 17 00:00:00 2001 From: laytan Date: Mon, 19 Jan 2026 18:57:00 +0100 Subject: [PATCH 221/766] nbio(windows): use WSAGetOverlappedResult for socket operations for contextfull error code mapping --- core/nbio/impl_windows.odin | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/core/nbio/impl_windows.odin b/core/nbio/impl_windows.odin index af4518cb7..d9ac7f379 100644 --- a/core/nbio/impl_windows.odin +++ b/core/nbio/impl_windows.odin @@ -946,7 +946,7 @@ accept_callback :: proc(op: ^Operation) { return } - _, err := get_result(op._impl.over) + _, err := wsa_get_result(win.SOCKET(op.accept.socket), op._impl.over) #partial switch err { case .SUCCESS: local_addr: ^win.sockaddr @@ -979,7 +979,6 @@ accept_callback :: proc(op: ^Operation) { fallthrough case: - win.SetLastError(win.DWORD(err)) op.accept.err = net._accept_error() } } @@ -1048,7 +1047,7 @@ dial_callback :: proc(op: ^Operation) { return } - _, err := get_result(op._impl.over) + _, err := wsa_get_result(win.SOCKET(op.dial.socket), op._impl.over) #partial switch err { case .SUCCESS: // enables getsockopt, setsockopt, getsockname, getpeername, etc. @@ -1058,7 +1057,6 @@ dial_callback :: proc(op: ^Operation) { op.dial.err = Dial_Error.Timeout case: - win.SetLastError(win.DWORD(err)) op.dial.err = net._dial_error() } } @@ -1274,7 +1272,7 @@ recv_callback :: proc(op: ^Operation) -> Op_Result { return .Done } - n, err := get_result(op._impl.over) + n, err := wsa_get_result(win.SOCKET((^net.Socket)(&op.recv.socket)^), op._impl.over) #partial switch err { case .SUCCESS: case .OPERATION_ABORTED: @@ -1288,7 +1286,6 @@ recv_callback :: proc(op: ^Operation) -> Op_Result { } fallthrough case: - win.SetLastError(win.DWORD(err)) switch _ in op.recv.socket { case TCP_Socket: op.recv.err = net._tcp_recv_error() case UDP_Socket: op.recv.err = net._udp_recv_error() @@ -1395,7 +1392,7 @@ send_callback :: proc(op: ^Operation) -> Op_Result { return .Done } - n, err := get_result(op._impl.over) + n, err := wsa_get_result(win.SOCKET((^net.Socket)(&op.send.socket)^), op._impl.over) #partial switch err { case .SUCCESS: case .OPERATION_ABORTED: @@ -1409,7 +1406,6 @@ send_callback :: proc(op: ^Operation) -> Op_Result { } fallthrough case: - win.SetLastError(win.DWORD(err)) switch _ in op.send.socket { case TCP_Socket: op.send.err = net._tcp_send_error() case UDP_Socket: op.send.err = net._udp_send_error() @@ -1485,7 +1481,7 @@ sendfile_callback :: proc(op: ^Operation) -> Op_Result { return .Done } - n, err := get_result(op._impl.over) + n, err := wsa_get_result(win.SOCKET(op.sendfile.socket), op._impl.over) #partial switch err { case .SUCCESS: case .OPERATION_ABORTED: @@ -1496,7 +1492,6 @@ sendfile_callback :: proc(op: ^Operation) -> Op_Result { } fallthrough case: - win.SetLastError(win.DWORD(err)) op.sendfile.err = net._tcp_send_error() return .Done } @@ -1748,6 +1743,27 @@ get_result :: proc(over: win.OVERLAPPED) -> (n: int, err: win.System_Error) { return } +// `get_result` above translates NT status codes to errors through RtlNtStatsToDosError, +// this is context free and can cause weird mappings, thus for sockets we want to call `WSAGetOverlappedResult` +// which does context based mapping of error codes. +// See https://stackoverflow.com/questions/28925003/calling-wsagetlasterror-from-an-iocp-thread-return-incorrect-result +wsa_get_result :: proc(socket: win.SOCKET, over: win.OVERLAPPED) -> (n: int, err: win.System_Error) { + over := over + assert(!is_pending(over)) + + if over.Internal != nil { + flags: win.DWORD + _n: win.DWORD + res := win.WSAGetOverlappedResult(socket, &over, &_n, false, &flags) + assert(!res) + assert(_n == 0) + err = win.System_Error(win.WSAGetLastError()) + } + + n = int(uintptr(over.InternalHigh)) + return +} + is_incomplete :: proc(err: win.System_Error) -> bool { #partial switch err { case .WSAEWOULDBLOCK, .IO_PENDING, .IO_INCOMPLETE, .WSAEALREADY: return true From 0a63aa05bd6d0e5a718f6d46794fc1c817403ce7 Mon Sep 17 00:00:00 2001 From: laytan Date: Mon, 19 Jan 2026 19:11:06 +0100 Subject: [PATCH 222/766] nbio(windows): remove assert that would trigger on cancel/remove --- core/nbio/impl_windows.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/nbio/impl_windows.odin b/core/nbio/impl_windows.odin index d9ac7f379..f75193fe4 100644 --- a/core/nbio/impl_windows.odin +++ b/core/nbio/impl_windows.odin @@ -1756,7 +1756,7 @@ wsa_get_result :: proc(socket: win.SOCKET, over: win.OVERLAPPED) -> (n: int, err _n: win.DWORD res := win.WSAGetOverlappedResult(socket, &over, &_n, false, &flags) assert(!res) - assert(_n == 0) + n = int(_n) // NOTE: It is possible that an amount of bytes is present when the operation was cancelled. err = win.System_Error(win.WSAGetLastError()) } From fddc73286999df7f0e04f00ea36d404687a82ec4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 19 Jan 2026 18:17:13 +0000 Subject: [PATCH 223/766] Escape non-breaking space (0xa0) to ` ` --- core/encoding/entity/entity.odin | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/encoding/entity/entity.odin b/core/encoding/entity/entity.odin index 95a404a81..89155b3a7 100644 --- a/core/encoding/entity/entity.odin +++ b/core/encoding/entity/entity.odin @@ -263,7 +263,7 @@ xml_decode_entity :: proc(entity: string) -> (decoded: [2]rune, rune_count: int, // escape_html escapes special characters like '&' to become '&'. -// It escapes only 5 different characters: & ' < > and ". +// It escapes only 6 different characters: & ' < > " and non-breaking space. @(require_results) escape_html :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool) { /* @@ -272,6 +272,7 @@ escape_html :: proc(s: string, allocator := context.allocator, loc := #caller_lo < -> < > -> > " -> " // " is shorter than " + 0x6a ->   */ b := transmute([]byte)s @@ -285,6 +286,7 @@ escape_html :: proc(s: string, allocator := context.allocator, loc := #caller_lo case '<': extra_bytes_needed += 3 case '>': extra_bytes_needed += 3 case '"': extra_bytes_needed += 4 + case 0xa0: extra_bytes_needed += 5 } } @@ -307,6 +309,7 @@ escape_html :: proc(s: string, allocator := context.allocator, loc := #caller_lo case '<': x = "<" case '>': x = ">" case '"': x = """ + case 0xa0: x = " " } if x != "" { copy(t[w:], x) From 85b3251105d22d96357cd6e79a0e34dd3a62d517 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 19 Jan 2026 19:30:37 +0000 Subject: [PATCH 224/766] Remove the nbsp change, as it is not necessary --- core/encoding/entity/entity.odin | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core/encoding/entity/entity.odin b/core/encoding/entity/entity.odin index 89155b3a7..bc3a79635 100644 --- a/core/encoding/entity/entity.odin +++ b/core/encoding/entity/entity.odin @@ -263,7 +263,7 @@ xml_decode_entity :: proc(entity: string) -> (decoded: [2]rune, rune_count: int, // escape_html escapes special characters like '&' to become '&'. -// It escapes only 6 different characters: & ' < > " and non-breaking space. +// It escapes only 5 different characters: & ' < > and " @(require_results) escape_html :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool) { /* @@ -272,21 +272,19 @@ escape_html :: proc(s: string, allocator := context.allocator, loc := #caller_lo < -> < > -> > " -> " // " is shorter than " - 0x6a ->   */ b := transmute([]byte)s extra_bytes_needed := 0 - for c in b { + for c, i in b { switch c { case '&': extra_bytes_needed += 4 case '\'': extra_bytes_needed += 4 case '<': extra_bytes_needed += 3 case '>': extra_bytes_needed += 3 case '"': extra_bytes_needed += 4 - case 0xa0: extra_bytes_needed += 5 } } @@ -309,7 +307,6 @@ escape_html :: proc(s: string, allocator := context.allocator, loc := #caller_lo case '<': x = "<" case '>': x = ">" case '"': x = """ - case 0xa0: x = " " } if x != "" { copy(t[w:], x) From 0de3d872d169f58705b387250df12e8e92b13c54 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 19 Jan 2026 19:32:41 +0000 Subject: [PATCH 225/766] Keep -vet happy --- core/encoding/entity/entity.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/encoding/entity/entity.odin b/core/encoding/entity/entity.odin index bc3a79635..a756bdf39 100644 --- a/core/encoding/entity/entity.odin +++ b/core/encoding/entity/entity.odin @@ -278,7 +278,7 @@ escape_html :: proc(s: string, allocator := context.allocator, loc := #caller_lo extra_bytes_needed := 0 - for c, i in b { + for c in b { switch c { case '&': extra_bytes_needed += 4 case '\'': extra_bytes_needed += 4 From ab0de6d33a121650803206e8e889e33f03cbdcec Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Tue, 20 Jan 2026 14:11:30 +0100 Subject: [PATCH 226/766] Added target freestanding_amd64_mingw for building freestanding on windows without MSVC installed (use for example clang-mingw) --- src/build_settings.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 31a07aa69..7d43788cd 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -840,6 +840,15 @@ gb_global TargetMetrics target_freestanding_amd64_win64 = { TargetABI_Win64, }; +gb_global TargetMetrics target_freestanding_amd64_mingw = { + TargetOs_freestanding, + TargetArch_amd64, + 8, 8, AMD64_MAX_ALIGNMENT, 32, + str_lit("x86_64-pc-windows-gnu"), + TargetABI_Win64, +}; + + gb_global TargetMetrics target_freestanding_arm64 = { TargetOs_freestanding, TargetArch_arm64, @@ -902,6 +911,7 @@ gb_global NamedTargetMetrics named_targets[] = { { str_lit("freestanding_amd64_sysv"), &target_freestanding_amd64_sysv }, { str_lit("freestanding_amd64_win64"), &target_freestanding_amd64_win64 }, + { str_lit("freestanding_amd64_mingw"), &target_freestanding_amd64_mingw }, { str_lit("freestanding_arm64"), &target_freestanding_arm64 }, { str_lit("freestanding_arm32"), &target_freestanding_arm32 }, From 4acdd3f60b39c95c2700618feb828b4cf687bb92 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 22 Jan 2026 11:49:47 +0100 Subject: [PATCH 227/766] Fix CRC --- tests/core/encoding/xml/test_core_xml.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/encoding/xml/test_core_xml.odin b/tests/core/encoding/xml/test_core_xml.odin index 9f233e00e..09cca4a63 100644 --- a/tests/core/encoding/xml/test_core_xml.odin +++ b/tests/core/encoding/xml/test_core_xml.odin @@ -142,7 +142,7 @@ xml_test_entities_unbox_decode :: proc(t: ^testing.T) { }, expected_doctype = "html", }, - crc32 = 0x6e45a697, + crc32 = 0xda1ac384, }) } From 4ace851f9a1e968de805e612c6752db3ea111d00 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 22 Jan 2026 13:17:26 +0000 Subject: [PATCH 228/766] Instead of using typeid hash, use the canonical name for internal procedure for debuggability --- src/llvm_backend.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 0bf3d1125..34afb9c8c 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -239,9 +239,9 @@ gb_internal lbContextData *lb_push_context_onto_stack(lbProcedure *p, lbAddr ctx gb_internal String lb_internal_gen_name_from_type(char const *prefix, Type *type) { gbString str = gb_string_make(permanent_allocator(), prefix); - u64 hash = type_hash_canonical_type(type); - str = gb_string_appendc(str, "-"); - str = gb_string_append_fmt(str, "%llu", cast(unsigned long long)hash); + str = gb_string_appendc(str, "$$"); + gbString ct = temp_canonical_string(type); + str = gb_string_append_length(str, ct, gb_string_length(ct)); String proc_name = make_string(cast(u8 const *)str, gb_string_length(str)); return proc_name; } From b0064f38cfb7f24d760feb010c09472fc7f896ee Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 22 Jan 2026 13:17:54 +0000 Subject: [PATCH 229/766] Minor rearrange of `check_is_operand_compound_lit_constant` for future optimization prep --- src/check_expr.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 99f803a08..8fdd5372b 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8768,6 +8768,14 @@ gb_internal bool check_is_operand_compound_lit_constant(CheckerContext *c, Opera if (is_operand_nil(*o)) { return true; } + if (is_type_any(field_type)) { + return false; + } + if (field_type != nullptr && is_type_typeid(field_type) && o->mode == Addressing_Type) { + add_type_info_type(c, o->type); + return true; + } + Ast *expr = unparen_expr(o->expr); if (expr != nullptr) { Entity *e = strip_entity_wrapping(entity_from_expr(expr)); @@ -8778,13 +8786,12 @@ gb_internal bool check_is_operand_compound_lit_constant(CheckerContext *c, Opera add_type_and_value(c, expr, Addressing_Constant, type_of_expr(expr), exact_value_procedure(expr)); return true; } - } - if (field_type != nullptr && is_type_typeid(field_type) && o->mode == Addressing_Type) { - add_type_info_type(c, o->type); - return true; - } - if (is_type_any(field_type)) { - return false; + + if (e != nullptr && e->kind == Entity_Variable && e->Variable.is_rodata) { + // DeclInfo *d = e->decl_info; + // TODO(bill): rodata inlining for non-indirect values + // e.g. **NOT** []T{...} + } } return o->mode == Addressing_Constant; } From dc6067a8a988477446181ca428553948821ec06c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 22 Jan 2026 13:18:22 +0000 Subject: [PATCH 230/766] Unify "mem*.inline" logic to only inline for <=8 bytes on all platforms --- src/llvm_backend.hpp | 2 +- src/llvm_backend_proc.cpp | 8 ++++---- src/llvm_backend_utility.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index e10471527..3491c0d39 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -619,7 +619,7 @@ gb_internal LLVMValueRef lb_mem_zero_ptr_internal(lbProcedure *p, LLVMValueRef p gb_internal LLVMValueRef lb_mem_zero_ptr_internal(lbProcedure *p, LLVMValueRef ptr, usize len, unsigned alignment, bool is_volatile); gb_internal gb_inline i64 lb_max_zero_init_size(void) { - return cast(i64)(4*build_context.int_size); + return cast(i64)(8); } gb_internal LLVMTypeRef OdinLLVMGetArrayElementType(LLVMTypeRef type); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 640a43111..837d7ce48 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -12,9 +12,9 @@ gb_internal void lb_mem_copy_overlapping(lbProcedure *p, lbValue dst, lbValue sr len = lb_emit_conv(p, len, t_int); char const *name = "llvm.memmove"; - if (LLVMIsConstant(len.value)) { + if (!p->is_startup && LLVMIsConstant(len.value)) { i64 const_len = cast(i64)LLVMConstIntGetSExtValue(len.value); - if (const_len <= 4*build_context.int_size) { + if (const_len <= lb_max_zero_init_size()) { name = "llvm.memmove.inline"; } } @@ -41,9 +41,9 @@ gb_internal void lb_mem_copy_non_overlapping(lbProcedure *p, lbValue dst, lbValu len = lb_emit_conv(p, len, t_int); char const *name = "llvm.memcpy"; - if (LLVMIsConstant(len.value)) { + if (!p->is_startup && LLVMIsConstant(len.value)) { i64 const_len = cast(i64)LLVMConstIntGetSExtValue(len.value); - if (const_len <= 4*build_context.int_size) { + if (const_len <= lb_max_zero_init_size()) { name = "llvm.memcpy.inline"; } } diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 9ddbd1f9c..43cac70c1 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -89,7 +89,7 @@ gb_internal LLVMValueRef lb_mem_zero_ptr_internal(lbProcedure *p, LLVMValueRef p bool is_inlinable = false; i64 const_len = 0; - if (LLVMIsConstant(len)) { + if (!p->is_startup && LLVMIsConstant(len)) { const_len = cast(i64)LLVMConstIntGetSExtValue(len); // TODO(bill): Determine when it is better to do the `*.inline` versions if (const_len <= lb_max_zero_init_size()) { From 5072d5c776eb53afb2439f43dfa40ccadb68dfb9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 22 Jan 2026 13:54:53 +0000 Subject: [PATCH 231/766] Add warning in code generation stage which might cause a possible code gen issue, when non-constant initialization is large --- src/llvm_backend.cpp | 5 +++++ src/main.cpp | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 34afb9c8c..c15f326f8 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2045,6 +2045,11 @@ gb_internal bool lb_init_global_var(lbModule *m, lbProcedure *p, Entity *e, Ast lb_emit_store(p, data, lb_emit_conv(p, gp, t_rawptr)); lb_emit_store(p, ti, lb_typeid(p->module, var_type)); } else { + i64 sz = type_size_of(e->type); + if (sz >= 4 * 1024) { + warning(init_expr, "[Possible Code Generation Issue] Non-constant initialization is large (%lld bytes), and might cause problems with LLVM", cast(long long)sz); + } + LLVMTypeRef vt = llvm_addr_type(p->module, var.var); lbValue src0 = lb_emit_conv(p, var.init, t); LLVMValueRef src = OdinLLVMBuildTransmute(p, src0.value, vt); diff --git a/src/main.cpp b/src/main.cpp index 753f58986..499b8a5ff 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4046,6 +4046,14 @@ int main(int arg_count, char const **arg_ptr) { remove_temp_files(gen); } + if (any_errors()) { + print_all_errors(); + return 1; + } + if (any_warnings()) { + print_all_errors(); + } + end_of_code_gen:; if (build_context.export_dependencies_format != DependenciesExportUnspecified) { From ce71227b6bba4bbe74d53c681264a9cba974403a Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 22 Jan 2026 15:20:39 +0100 Subject: [PATCH 232/766] Fix #6130 --- src/parser.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index fc55dae97..277a405b7 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5071,6 +5071,10 @@ gb_internal Ast *parse_import_decl(AstFile *f, ImportDeclKind kind) { syntax_error(import_name, "'using import' is not allowed, please use the import name explicitly"); } + if (file_path.string == "\".\"") { + syntax_error(import_name, "Cannot cyclicly import packages"); + } + expect_semicolon(f); return s; } From 5f974059f46317328db64b9f0dcf9ead55f167fa Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 22 Jan 2026 21:34:46 +0100 Subject: [PATCH 233/766] move vendor:libc to vendor:libc-shim --- vendor/box2d/box2d_wasm.odin | 2 +- vendor/box2d/wasm.Makefile | 2 +- vendor/cgltf/cgltf_wasm.odin | 2 +- vendor/cgltf/src/Makefile | 2 +- vendor/{libc => libc-shim}/README.md | 6 ++--- vendor/{libc => libc-shim}/assert.odin | 0 vendor/{libc => libc-shim}/ctype.odin | 0 vendor/{libc => libc-shim}/include/alloca.h | 0 vendor/{libc => libc-shim}/include/assert.h | 0 vendor/{libc => libc-shim}/include/ctype.h | 0 vendor/{libc => libc-shim}/include/inttypes.h | 0 vendor/{libc => libc-shim}/include/math.h | 0 vendor/{libc => libc-shim}/include/sched.h | 0 vendor/{libc => libc-shim}/include/stdio.h | 0 vendor/{libc => libc-shim}/include/stdlib.h | 0 vendor/{libc => libc-shim}/include/string.h | 0 vendor/{libc => libc-shim}/include/time.h | 0 vendor/libc-shim/libc.odin | 26 +++++++++++++++++++ vendor/{libc => libc-shim}/math.odin | 0 vendor/{libc => libc-shim}/sched.odin | 0 vendor/{libc => libc-shim}/stdio.odin | 4 +-- vendor/{libc => libc-shim}/stdlib.odin | 0 vendor/{libc => libc-shim}/string.odin | 0 vendor/{libc => libc-shim}/time.odin | 0 vendor/libc/libc.odin | 25 +----------------- vendor/stb/image/stb_image_wasm.odin | 2 +- vendor/stb/rect_pack/stb_rect_pack_wasm.odin | 2 +- vendor/stb/src/Makefile | 12 ++++----- vendor/stb/truetype/stb_truetype_wasm.odin | 2 +- 29 files changed, 45 insertions(+), 42 deletions(-) rename vendor/{libc => libc-shim}/README.md (79%) rename vendor/{libc => libc-shim}/assert.odin (100%) rename vendor/{libc => libc-shim}/ctype.odin (100%) rename vendor/{libc => libc-shim}/include/alloca.h (100%) rename vendor/{libc => libc-shim}/include/assert.h (100%) rename vendor/{libc => libc-shim}/include/ctype.h (100%) rename vendor/{libc => libc-shim}/include/inttypes.h (100%) rename vendor/{libc => libc-shim}/include/math.h (100%) rename vendor/{libc => libc-shim}/include/sched.h (100%) rename vendor/{libc => libc-shim}/include/stdio.h (100%) rename vendor/{libc => libc-shim}/include/stdlib.h (100%) rename vendor/{libc => libc-shim}/include/string.h (100%) rename vendor/{libc => libc-shim}/include/time.h (100%) create mode 100644 vendor/libc-shim/libc.odin rename vendor/{libc => libc-shim}/math.odin (100%) rename vendor/{libc => libc-shim}/sched.odin (100%) rename vendor/{libc => libc-shim}/stdio.odin (98%) rename vendor/{libc => libc-shim}/stdlib.odin (100%) rename vendor/{libc => libc-shim}/string.odin (100%) rename vendor/{libc => libc-shim}/time.odin (100%) diff --git a/vendor/box2d/box2d_wasm.odin b/vendor/box2d/box2d_wasm.odin index 0fcaf753f..1bbe9b8bc 100644 --- a/vendor/box2d/box2d_wasm.odin +++ b/vendor/box2d/box2d_wasm.odin @@ -1,4 +1,4 @@ #+build wasm32, wasm64p32 package vendor_box2d -@(require) import _ "vendor:libc" +@(require) import _ "vendor:libc-shim" diff --git a/vendor/box2d/wasm.Makefile b/vendor/box2d/wasm.Makefile index 80dd2ba14..5cce30ad1 100644 --- a/vendor/box2d/wasm.Makefile +++ b/vendor/box2d/wasm.Makefile @@ -11,7 +11,7 @@ VERSION = 3.1.1 SRCS = $(wildcard box2d-$(VERSION)/src/*.c) OBJS_SIMD = $(SRCS:.c=_simd.o) OBJS = $(SRCS:.c=.o) -SYSROOT = $(shell odin root)/vendor/libc +SYSROOT = $(shell odin root)/vendor/libc-shim CFLAGS = -Ibox2d-$(VERSION)/include --target=wasm32 -D__EMSCRIPTEN__ -DNDEBUG -O3 --sysroot=$(SYSROOT) all: lib/box2d_wasm.o lib/box2d_wasm_simd.o diff --git a/vendor/cgltf/cgltf_wasm.odin b/vendor/cgltf/cgltf_wasm.odin index fb612b2ac..1404fc592 100644 --- a/vendor/cgltf/cgltf_wasm.odin +++ b/vendor/cgltf/cgltf_wasm.odin @@ -1,4 +1,4 @@ #+build wasm32, wasm64p32 package cgltf -@(require) import _ "vendor:libc" +@(require) import _ "vendor:libc-shim" diff --git a/vendor/cgltf/src/Makefile b/vendor/cgltf/src/Makefile index 0dd450ce0..f4dc8c12c 100644 --- a/vendor/cgltf/src/Makefile +++ b/vendor/cgltf/src/Makefile @@ -8,7 +8,7 @@ endif wasm: mkdir -p ../lib - $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc cgltf.c -o ../lib/cgltf_wasm.o + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc-shim cgltf.c -o ../lib/cgltf_wasm.o unix: mkdir -p ../lib diff --git a/vendor/libc/README.md b/vendor/libc-shim/README.md similarity index 79% rename from vendor/libc/README.md rename to vendor/libc-shim/README.md index 1dd50c5a9..9b44984f6 100644 --- a/vendor/libc/README.md +++ b/vendor/libc-shim/README.md @@ -1,11 +1,11 @@ -# vendor:libc +# vendor:libc-shim A (very small) subset of a libc implementation over Odin libraries. This is mainly intended for use in Odin WASM builds to allow using libraries like box2d, cgltf etc. without emscripten hacks. -You can use this with clang by doing `clang -c --target=wasm32 --sysroot=$(odin root)/vendor/libc` (+ all other flags and inputs). +You can use this with clang by doing `clang -c --target=wasm32 --sysroot=$(odin root)/vendor/libc-shim` (+ all other flags and inputs). This will (if all the libc usage of the library is implemented) spit out a `.o` file you can use with the foreign import system. -If you then also make sure this package is included in the Odin side of the project (`@(require) import "vendor:libc"`) you will be able +If you then also make sure this package is included in the Odin side of the project (`@(require) import "vendor:libc-shim"`) you will be able compile to WASM like Odin expects. This is currently used by `vendor:box2d`, `vendor:stb/image`, `vendor:stb/truetype`, `vendor:stb/rect_pack`, and `vendor:cgltf`. diff --git a/vendor/libc/assert.odin b/vendor/libc-shim/assert.odin similarity index 100% rename from vendor/libc/assert.odin rename to vendor/libc-shim/assert.odin diff --git a/vendor/libc/ctype.odin b/vendor/libc-shim/ctype.odin similarity index 100% rename from vendor/libc/ctype.odin rename to vendor/libc-shim/ctype.odin diff --git a/vendor/libc/include/alloca.h b/vendor/libc-shim/include/alloca.h similarity index 100% rename from vendor/libc/include/alloca.h rename to vendor/libc-shim/include/alloca.h diff --git a/vendor/libc/include/assert.h b/vendor/libc-shim/include/assert.h similarity index 100% rename from vendor/libc/include/assert.h rename to vendor/libc-shim/include/assert.h diff --git a/vendor/libc/include/ctype.h b/vendor/libc-shim/include/ctype.h similarity index 100% rename from vendor/libc/include/ctype.h rename to vendor/libc-shim/include/ctype.h diff --git a/vendor/libc/include/inttypes.h b/vendor/libc-shim/include/inttypes.h similarity index 100% rename from vendor/libc/include/inttypes.h rename to vendor/libc-shim/include/inttypes.h diff --git a/vendor/libc/include/math.h b/vendor/libc-shim/include/math.h similarity index 100% rename from vendor/libc/include/math.h rename to vendor/libc-shim/include/math.h diff --git a/vendor/libc/include/sched.h b/vendor/libc-shim/include/sched.h similarity index 100% rename from vendor/libc/include/sched.h rename to vendor/libc-shim/include/sched.h diff --git a/vendor/libc/include/stdio.h b/vendor/libc-shim/include/stdio.h similarity index 100% rename from vendor/libc/include/stdio.h rename to vendor/libc-shim/include/stdio.h diff --git a/vendor/libc/include/stdlib.h b/vendor/libc-shim/include/stdlib.h similarity index 100% rename from vendor/libc/include/stdlib.h rename to vendor/libc-shim/include/stdlib.h diff --git a/vendor/libc/include/string.h b/vendor/libc-shim/include/string.h similarity index 100% rename from vendor/libc/include/string.h rename to vendor/libc-shim/include/string.h diff --git a/vendor/libc/include/time.h b/vendor/libc-shim/include/time.h similarity index 100% rename from vendor/libc/include/time.h rename to vendor/libc-shim/include/time.h diff --git a/vendor/libc-shim/libc.odin b/vendor/libc-shim/libc.odin new file mode 100644 index 000000000..a5508e14f --- /dev/null +++ b/vendor/libc-shim/libc.odin @@ -0,0 +1,26 @@ +package odin_libc + +import "base:runtime" + +import "core:mem" + +@(private) +g_ctx: runtime.Context +@(private) +g_allocator: mem.Compat_Allocator + +@(init) +init_context :: proc "contextless" () { + g_ctx = runtime.default_context() + context = g_ctx + + // Wrapping the allocator with the mem.Compat_Allocator so we can + // mimic the realloc semantics. + mem.compat_allocator_init(&g_allocator, g_ctx.allocator) + g_ctx.allocator = mem.compat_allocator(&g_allocator) +} + +// NOTE: the allocator must respect an `old_size` of `-1` on resizes! +set_context :: proc(ctx := context) { + g_ctx = ctx +} diff --git a/vendor/libc/math.odin b/vendor/libc-shim/math.odin similarity index 100% rename from vendor/libc/math.odin rename to vendor/libc-shim/math.odin diff --git a/vendor/libc/sched.odin b/vendor/libc-shim/sched.odin similarity index 100% rename from vendor/libc/sched.odin rename to vendor/libc-shim/sched.odin diff --git a/vendor/libc/stdio.odin b/vendor/libc-shim/stdio.odin similarity index 98% rename from vendor/libc/stdio.odin rename to vendor/libc-shim/stdio.odin index d41f790ee..e269b8986 100644 --- a/vendor/libc/stdio.odin +++ b/vendor/libc-shim/stdio.odin @@ -17,7 +17,7 @@ EOF :: -1 @(require, linkage="strong", link_name="fopen") fopen :: proc "c" (path: cstring, mode: cstring) -> FILE { context = g_ctx - unimplemented("vendor/libc: fopen") + unimplemented("vendor/libc-shim: fopen") } @(require, linkage="strong", link_name="fseek") @@ -366,7 +366,7 @@ _sscanf :: proc "c" (str, fmt: [^]byte, orig_ptrs: [^]rawptr) -> i32 { i = 0 k = t == 'c' ? width + 1 : 31 if size == .l { - unimplemented("vendor/libc: sscanf wide character support") + unimplemented("vendor/libc-shim: sscanf wide character support") } else if alloc { s = make([^]byte, k) if s == nil { diff --git a/vendor/libc/stdlib.odin b/vendor/libc-shim/stdlib.odin similarity index 100% rename from vendor/libc/stdlib.odin rename to vendor/libc-shim/stdlib.odin diff --git a/vendor/libc/string.odin b/vendor/libc-shim/string.odin similarity index 100% rename from vendor/libc/string.odin rename to vendor/libc-shim/string.odin diff --git a/vendor/libc/time.odin b/vendor/libc-shim/time.odin similarity index 100% rename from vendor/libc/time.odin rename to vendor/libc-shim/time.odin diff --git a/vendor/libc/libc.odin b/vendor/libc/libc.odin index a5508e14f..7af35b090 100644 --- a/vendor/libc/libc.odin +++ b/vendor/libc/libc.odin @@ -1,26 +1,3 @@ package odin_libc -import "base:runtime" - -import "core:mem" - -@(private) -g_ctx: runtime.Context -@(private) -g_allocator: mem.Compat_Allocator - -@(init) -init_context :: proc "contextless" () { - g_ctx = runtime.default_context() - context = g_ctx - - // Wrapping the allocator with the mem.Compat_Allocator so we can - // mimic the realloc semantics. - mem.compat_allocator_init(&g_allocator, g_ctx.allocator) - g_ctx.allocator = mem.compat_allocator(&g_allocator) -} - -// NOTE: the allocator must respect an `old_size` of `-1` on resizes! -set_context :: proc(ctx := context) { - g_ctx = ctx -} +#panic("`vendor:libc` has been moved, use `vendor:libc-shim` instead.") diff --git a/vendor/stb/image/stb_image_wasm.odin b/vendor/stb/image/stb_image_wasm.odin index f43012383..cfad4725a 100644 --- a/vendor/stb/image/stb_image_wasm.odin +++ b/vendor/stb/image/stb_image_wasm.odin @@ -1,4 +1,4 @@ #+build wasm32, wasm64p32 package stb_image -@(require) import _ "vendor:libc" +@(require) import _ "vendor:libc-shim" diff --git a/vendor/stb/rect_pack/stb_rect_pack_wasm.odin b/vendor/stb/rect_pack/stb_rect_pack_wasm.odin index c4e2e5160..c9b6f3de8 100644 --- a/vendor/stb/rect_pack/stb_rect_pack_wasm.odin +++ b/vendor/stb/rect_pack/stb_rect_pack_wasm.odin @@ -1,4 +1,4 @@ #+build wasm32, wasm64p32 package stb_rect_pack -@(require) import _ "vendor:libc" +@(require) import _ "vendor:libc-shim" diff --git a/vendor/stb/src/Makefile b/vendor/stb/src/Makefile index 194ea5e75..94ba4d5bf 100644 --- a/vendor/stb/src/Makefile +++ b/vendor/stb/src/Makefile @@ -8,12 +8,12 @@ endif wasm: mkdir -p ../lib - $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_image.c -o ../lib/stb_image_wasm.o -DSTBI_NO_STDIO - $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_image_write.c -o ../lib/stb_image_write_wasm.o -DSTBI_WRITE_NO_STDIO - $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_image_resize.c -o ../lib/stb_image_resize_wasm.o - $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_truetype.c -o ../lib/stb_truetype_wasm.o - # $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_vorbis.c -o ../lib/stb_vorbis_wasm.o -DSTB_VORBIS_NO_STDIO - $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_rect_pack.c -o ../lib/stb_rect_pack_wasm.o + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc-shim stb_image.c -o ../lib/stb_image_wasm.o -DSTBI_NO_STDIO + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc-shim stb_image_write.c -o ../lib/stb_image_write_wasm.o -DSTBI_WRITE_NO_STDIO + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc-shim stb_image_resize.c -o ../lib/stb_image_resize_wasm.o + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc-shim stb_truetype.c -o ../lib/stb_truetype_wasm.o + # $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc-shim stb_vorbis.c -o ../lib/stb_vorbis_wasm.o -DSTB_VORBIS_NO_STDIO + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc-shim stb_rect_pack.c -o ../lib/stb_rect_pack_wasm.o $(CC) -c -Os --target=wasm32 stb_sprintf.c -o ../lib/stb_sprintf_wasm.o unix: diff --git a/vendor/stb/truetype/stb_truetype_wasm.odin b/vendor/stb/truetype/stb_truetype_wasm.odin index f36239086..727ba3ef0 100644 --- a/vendor/stb/truetype/stb_truetype_wasm.odin +++ b/vendor/stb/truetype/stb_truetype_wasm.odin @@ -1,4 +1,4 @@ #+build wasm32, wasm64p32 package stb_truetype -@(require) import _ "vendor:libc" +@(require) import _ "vendor:libc-shim" From da9b1dfcc6a607d928b4346ff4305fc5bb959018 Mon Sep 17 00:00:00 2001 From: nowheredevel Date: Thu, 22 Jan 2026 22:46:08 -0500 Subject: [PATCH 234/766] Implement missing device properties function --- vendor/sdl3/sdl3_gpu.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/vendor/sdl3/sdl3_gpu.odin b/vendor/sdl3/sdl3_gpu.odin index 85f05db83..551b23947 100644 --- a/vendor/sdl3/sdl3_gpu.odin +++ b/vendor/sdl3/sdl3_gpu.odin @@ -824,6 +824,7 @@ foreign lib { GetGPUDriver :: proc(index: c.int) -> cstring --- GetGPUDeviceDriver :: proc(device: ^GPUDevice) -> cstring --- GetGPUShaderFormats :: proc(device: ^GPUDevice) -> GPUShaderFormat --- + GetGPUDeviceProperties :: proc(device: ^GPUDevice) -> PropertiesID --- CreateGPUComputePipeline :: proc(device: ^GPUDevice, #by_ptr createinfo: GPUComputePipelineCreateInfo) -> ^GPUComputePipeline --- CreateGPUGraphicsPipeline :: proc(device: ^GPUDevice, #by_ptr createinfo: GPUGraphicsPipelineCreateInfo) -> ^GPUGraphicsPipeline --- CreateGPUSampler :: proc(device: ^GPUDevice, #by_ptr createinfo: GPUSamplerCreateInfo) -> ^GPUSampler --- From 89f6f535db7cf540aa40f76256b2c180195bf99c Mon Sep 17 00:00:00 2001 From: CJ Date: Sat, 24 Jan 2026 01:26:36 +0900 Subject: [PATCH 235/766] Fix string16 bugs in Mac and Linux --- src/string.cpp | 107 ++++++++++++++++++++++++++---- tests/issues/test_issue_6101.odin | 23 +++++++ 2 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 tests/issues/test_issue_6101.odin diff --git a/src/string.cpp b/src/string.cpp index 9c08114a7..c26457acf 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -635,26 +635,107 @@ gb_internal String normalize_path(gbAllocator a, String const &path, String cons #elif defined(GB_SYSTEM_UNIX) || defined(GB_SYSTEM_OSX) #include + gb_internal void utf16_encode_surrogate_pair(Rune r, u16 *r1, u16 *r2) { + static Rune const _surr_self = 0x10000; + static Rune const _surr1 = 0xd800; + static Rune const _surr2 = 0xdc00; + Rune r_ = r - _surr_self; + *r1 = _surr1 + ((r_ >> 10) & 0x3ff); + *r2 = _surr2 + (r_ & 0x3ff); + } + + gb_internal isize utf16_decode(u16 const *s, isize n, Rune *r) { + static Rune const _surr1 = 0xd800; + static Rune const _surr2 = 0xdc00; + static Rune const _surr3 = 0xe000; + static Rune const _surr_self = 0x10000; + if (n < 1) { + *r = GB_RUNE_INVALID; + return 0; + } + u16 c = s[0]; + if (c < 0xd800 || c > 0xdfff) { + *r = cast(Rune)c; + return 1; + } + if (c >= 0xdc00) { + *r = GB_RUNE_INVALID; + return 1; + } + if (n < 2) { + *r = GB_RUNE_INVALID; + return 1; + } + u16 c2 = s[1]; + if (c2 < 0xdc00 || c2 > 0xdfff) { + *r = GB_RUNE_INVALID; + return 1; + } + *r = (((c-_surr1)<<10) | (c2 - _surr2)) + _surr_self; + return 2; + } + gb_internal int convert_multibyte_to_widechar(char const *multibyte_input, usize input_length, wchar_t *output, usize output_size) { - String string = copy_string(heap_allocator(), make_string(cast(u8 const*)multibyte_input, input_length)); /* Guarantee NULL terminator */ - u8* input = string.text; + u16 *out = cast(u16 *)output; + String s = make_string(cast(u8 const *)multibyte_input, input_length); + isize i = 0; + isize output_len = 0; + while (i < s.len) { + Rune r = 0; + isize width = utf8_decode(s.text + i, s.len - i, &r); + if (r == GB_RUNE_INVALID) { + return -1; + } + i += width; + if (r < 0x10000) { + if (out) { + if (cast(usize)output_len+1 > output_size) { + return -1; + } + out[output_len] = cast(u16)r; + } + output_len += 1; + } else { + if (out) { + if (cast(usize)output_len+2 > output_size) { + return -1; + } + u16 r1, r2; + utf16_encode_surrogate_pair(r, &r1, &r2); + out[output_len+0] = r1; + out[output_len+1] = r2; + } + output_len += 2; + } + } - mbstate_t ps = { 0 }; - size_t result = mbsrtowcs(output, cast(const char**)&input, output_size, &ps); - - gb_free(heap_allocator(), string.text); - return (result == (size_t)-1) ? -1 : (int)result; + return cast(int)output_len; } gb_internal int convert_widechar_to_multibyte(wchar_t const *widechar_input, usize input_length, char* output, usize output_size) { - String string = copy_string(heap_allocator(), make_string(cast(u8 const*)widechar_input, input_length)); /* Guarantee NULL terminator */ - u8* input = string.text; + u16 const *in = cast(u16 const *)widechar_input; + isize i = 0; + isize output_len = 0; + while (i < input_length) { + Rune r; + isize width = utf16_decode(in + i, input_length - i, &r); + if (r == GB_RUNE_INVALID) { + return -1; + } + i += width; - mbstate_t ps = { 0 }; - size_t result = wcsrtombs(output, cast(const wchar_t**)&input, output_size, &ps); + u8 buf[4]; + isize char_len = gb_utf8_encode_rune(buf, r); - gb_free(heap_allocator(), string.text); - return (result == (size_t)-1) ? -1 : (int)result; + if(output) { + if (cast(usize)output_len+cast(usize)char_len > output_size) { + return -1; + } + gb_memmove(output + output_len, buf, char_len); + } + output_len += char_len; + } + return cast(int)output_len; } #else #error Implement system diff --git a/tests/issues/test_issue_6101.odin b/tests/issues/test_issue_6101.odin new file mode 100644 index 000000000..9f24ade52 --- /dev/null +++ b/tests/issues/test_issue_6101.odin @@ -0,0 +1,23 @@ +// Tests issue #6101 https://github.com/odin-lang/Odin/issues/6101 +package test_issues + +import "core:testing" + +@(test) +test_issue_6101_bmp :: proc(t: ^testing.T) { + s := string16("\u732b") + testing.expect_value(t, len(s), 1) + + u := transmute([]u16)s + testing.expect_value(t, u[0], 0x732b) +} + +@(test) +test_issue_6101_non_bmp :: proc(t: ^testing.T) { + s := string16("\U0001F63A") + testing.expect_value(t, len(s), 2) + + u := transmute([]u16)s + testing.expect_value(t, u[0], 0xD83D) + testing.expect_value(t, u[1], 0xDE3A) +} From 55f3a45322af4a2b2abf4388c0f66ae7c67eabae Mon Sep 17 00:00:00 2001 From: CJ Date: Sat, 24 Jan 2026 01:30:15 +0900 Subject: [PATCH 236/766] Update run.bat and run.sh --- tests/issues/run.bat | 1 + tests/issues/run.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/issues/run.bat b/tests/issues/run.bat index 0ceaf554c..9106a339b 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -27,6 +27,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin build ..\test_issue_5265.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_5699.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6068.odin %COMMON% || exit /b +..\..\..\odin test ..\test_issue_6101.odin %COMMON% || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index ce02ba20a..58382c7ad 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -34,6 +34,7 @@ $ODIN build ../test_issue_5097-2.odin $COMMON $ODIN build ../test_issue_5265.odin $COMMON $ODIN test ../test_issue_5699.odin $COMMON $ODIN test ../test_issue_6068.odin $COMMON +$ODIN test ../test_issue_6101.odin $COMMON set +x From 85e2e3244b96a72aa7b4f5e7fa6acc944b9d0471 Mon Sep 17 00:00:00 2001 From: Tohei Ichikawa Date: Fri, 23 Jan 2026 11:45:24 -0500 Subject: [PATCH 237/766] Create new `core:sys/darwin/CoreGraphics` package (#6147) * Add Darwin mouse cursor-related bindings Create CoreGraphics package in the process * Remove unneeded semicolons * Define some CG types in CoreFoundation instead This matches where Darwin's C header files defines these types --- core/sys/darwin/CoreFoundation/CFCGTypes.odin | 18 ++++++ .../sys/darwin/CoreGraphics/CoreGraphics.odin | 57 +++++++++++++++++++ core/sys/darwin/Foundation/NSCursor.odin | 13 +++++ core/sys/darwin/Foundation/NSTypes.odin | 13 ++--- core/sys/darwin/Foundation/NSWindow.odin | 26 ++++++++- 5 files changed, 115 insertions(+), 12 deletions(-) create mode 100644 core/sys/darwin/CoreFoundation/CFCGTypes.odin create mode 100644 core/sys/darwin/CoreGraphics/CoreGraphics.odin diff --git a/core/sys/darwin/CoreFoundation/CFCGTypes.odin b/core/sys/darwin/CoreFoundation/CFCGTypes.odin new file mode 100644 index 000000000..ccfdf177a --- /dev/null +++ b/core/sys/darwin/CoreFoundation/CFCGTypes.odin @@ -0,0 +1,18 @@ +package CoreFoundation + +CGFloat :: distinct (f32 when size_of(uint) == 4 else f64) + +CGPoint :: struct { + x: CGFloat, + y: CGFloat, +} + +CGRect :: struct { + using origin: CGPoint, + using size: CGSize, +} + +CGSize :: struct { + width: CGFloat, + height: CGFloat, +} diff --git a/core/sys/darwin/CoreGraphics/CoreGraphics.odin b/core/sys/darwin/CoreGraphics/CoreGraphics.odin new file mode 100644 index 000000000..e2ba5fe3c --- /dev/null +++ b/core/sys/darwin/CoreGraphics/CoreGraphics.odin @@ -0,0 +1,57 @@ +package CoreGraphics + +import "core:c" +import CF "core:sys/darwin/CoreFoundation" + +@(require) +foreign import "system:CoreGraphics.framework" + +@(link_prefix="CG", default_calling_convention="c") +foreign CoreGraphics { + AssociateMouseAndMouseCursorPosition :: proc(connected: b32) -> Error --- + DisplayIDToOpenGLDisplayMask :: proc(display: DirectDisplayID) -> OpenGLDisplayMask --- + DisplayMoveCursorToPoint :: proc(display: DirectDisplayID, point: Point) -> Error --- + EventSourceKeyState :: proc(stateID: EventSourceStateID, key: KeyCode) -> bool --- + GetActiveDisplayList :: proc(maxDisplays: c.uint32_t, activeDisplays: [^]DirectDisplayID, displayCount: ^c.uint32_t) -> Error --- + GetDisplaysWithOpenGLDisplayMask :: proc(mask: OpenGLDisplayMask, maxDisplays: c.uint32_t, displays: [^]DirectDisplayID, matchingDisplayCount: ^c.uint32_t) -> Error --- + GetDisplaysWithPoint :: proc(point: Point, maxDisplays: c.uint32_t, displays: [^]DirectDisplayID, matchingDisplayCount: ^c.uint32_t) -> Error --- + GetDisplaysWithRect :: proc(rect: Rect, maxDisplays: c.uint32_t, displays: [^]DirectDisplayID, matchingDisplayCount: ^c.uint32_t) -> Error --- + GetOnlineDisplayList :: proc(maxDisplays: c.uint32_t, onlineDisplays: [^]DirectDisplayID, displayCount: ^c.uint32_t) -> Error --- + MainDisplayID :: proc() -> DirectDisplayID --- + OpenGLDisplayMaskToDisplayID :: proc(mask: OpenGLDisplayMask) -> DirectDisplayID --- + WarpMouseCursorPosition :: proc(newCursorPosition: Point) -> Error --- +} + +DirectDisplayID :: c.uint32_t + +Error :: enum c.int32_t { + Success = 0, + Failure = 1000, + IllegalArgument = 1001, + InvalidConnection = 1002, + InvalidContext = 1003, + CannotComplete = 1004, + NotImplemented = 1006, + RangeCheck = 1007, + TypeCheck = 1008, + InvalidOperation = 1010, + NoneAvailable = 1011, +} + +EventSourceStateID :: enum c.int32_t { + Private = -1, + CombinedSessionState = 0, + HIDSystemState = 1, +} + +Float :: CF.CGFloat + +KeyCode :: c.uint16_t + +OpenGLDisplayMask :: c.uint32_t + +Point :: CF.CGPoint + +Rect :: CF.CGRect + +Size :: CF.CGSize diff --git a/core/sys/darwin/Foundation/NSCursor.odin b/core/sys/darwin/Foundation/NSCursor.odin index ad2decdca..2bebf5362 100644 --- a/core/sys/darwin/Foundation/NSCursor.odin +++ b/core/sys/darwin/Foundation/NSCursor.odin @@ -3,6 +3,19 @@ package objc_Foundation @(objc_class="NSCursor") Cursor :: struct {using _: Object} +@(objc_type=Cursor, objc_name="hide", objc_is_class_method=true) +Cursor_hide :: proc() { + msgSend(nil, Cursor, "hide") +} +@(objc_type=Cursor, objc_name="unhide", objc_is_class_method=true) +Cursor_unhide :: proc() { + msgSend(nil, Cursor, "unhide") +} +@(objc_type=Cursor, objc_name="setHiddenUntilMouseMoves", objc_is_class_method=true) +Cursor_setHiddenUntilMouseMoves :: proc(flag: BOOL) { + msgSend(nil, Cursor, "setHiddenUntilMouseMoves:", flag) +} + @(objc_type=Cursor, objc_name="set") Cursor_set :: proc(self: ^Cursor) { msgSend(EventType, self, "set") diff --git a/core/sys/darwin/Foundation/NSTypes.odin b/core/sys/darwin/Foundation/NSTypes.odin index 822a07ab1..7c379cf99 100644 --- a/core/sys/darwin/Foundation/NSTypes.odin +++ b/core/sys/darwin/Foundation/NSTypes.odin @@ -1,6 +1,7 @@ package objc_Foundation import "base:intrinsics" +import CF "core:sys/darwin/CoreFoundation" @(private) msgSend :: intrinsics.objc_send @@ -34,17 +35,11 @@ ComparisonResult :: enum Integer { NotFound :: IntegerMax -Float :: distinct (f32 when size_of(uint) == 4 else f64) +Float :: CF.CGFloat -Point :: struct { - x: Float, - y: Float, -} +Point :: CF.CGPoint -Size :: struct { - width: Float, - height: Float, -} +Size :: CF.CGSize when size_of(UInteger) == 8 { _UINTEGER_ENCODING :: "Q" diff --git a/core/sys/darwin/Foundation/NSWindow.odin b/core/sys/darwin/Foundation/NSWindow.odin index 11f8b187e..fcf35546e 100644 --- a/core/sys/darwin/Foundation/NSWindow.odin +++ b/core/sys/darwin/Foundation/NSWindow.odin @@ -1,12 +1,28 @@ package objc_Foundation import "core:strings" +import CF "core:sys/darwin/CoreFoundation" import "base:runtime" import "base:intrinsics" -Rect :: struct { - using origin: Point, - using size: Size, +Rect :: CF.CGRect +MaxX :: proc(aRect: Rect) -> Float { + return aRect.origin.x + aRect.size.width +} +MaxY :: proc(aRect: Rect) -> Float { + return aRect.origin.y + aRect.size.height +} +MidX :: proc(aRect: Rect) -> Float { + return aRect.origin.x + aRect.size.width*0.5 +} +MidY :: proc(aRect: Rect) -> Float { + return aRect.origin.y + aRect.size.height*0.5 +} +MinX :: proc(aRect: Rect) -> Float { + return aRect.origin.x +} +MinY :: proc(aRect: Rect) -> Float { + return aRect.origin.y } Depth :: enum UInteger { @@ -988,3 +1004,7 @@ Window_contentRectForFrameRectInstance :: proc "c" (self: ^Window, frameRect: Re Window_frameRectForContentRectInstance :: proc "c" (self: ^Window, contentRect: Rect) -> Rect { return msgSend(Rect, self, "frameRectForContentRect:", contentRect) } +@(objc_type = Window, objc_name = "screen") +Window_screen :: proc "c" (self: ^Window) -> ^Screen { + return msgSend(^Screen, self, "screen") +} From d108b50c89d7ac8e15da3cb7fa34a0c3cc41aa85 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 23 Jan 2026 17:47:20 +0100 Subject: [PATCH 238/766] add new CoreGraphics to examples for doc gen --- examples/all/all_vendor.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/all/all_vendor.odin b/examples/all/all_vendor.odin index 80f6c52bb..fc2a401b3 100644 --- a/examples/all/all_vendor.odin +++ b/examples/all/all_vendor.odin @@ -30,6 +30,7 @@ package all // NOTE: needed for doc generator @(require) import "core:sys/darwin/Foundation" @(require) import "core:sys/darwin/CoreFoundation" +@(require) import "core:sys/darwin/CoreGraphics" @(require) import "core:sys/darwin/Security" @(require) import "vendor:darwin/CoreVideo" @(require) import "vendor:darwin/Metal" From 5e4895e76dc5bb5ee4357037433825907403457e Mon Sep 17 00:00:00 2001 From: Barinzaya Date: Fri, 23 Jan 2026 15:53:29 -0500 Subject: [PATCH 239/766] Fixed some issues with `in` and `not_in` on constant `bit_set`s. This addresses two issues: - With a `bit_set` having no underlying type and a non-zero lower bound, `in` and `not_in` were returning incorrect results when done at compile-time. - With a `bit_set` of more than 128 bits, `in` always returns false on values that fall within the upper 64 bits. --- src/check_expr.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 8fdd5372b..d64c733f3 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4125,15 +4125,19 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ i64 upper = yt->BitSet.upper; if (lower <= key && key <= upper) { - i64 bit = 1ll<mode = Addressing_Constant; x->type = t_untyped_bool; if (op.kind == Token_in) { - x->value = exact_value_bool((bit & bits) != 0); + x->value = exact_value_bool(!big_int_is_zero(&mask)); } else { - x->value = exact_value_bool((bit & bits) == 0); + x->value = exact_value_bool(big_int_is_zero(&mask)); } x->expr = node; return; From 808c14f60f3753e9030de8a8d9086dacb341c414 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Sat, 3 Jan 2026 12:07:47 +0100 Subject: [PATCH 240/766] Add more win32 bindings --- core/sys/windows/gdi32.odin | 11 +++++-- core/sys/windows/user32.odin | 12 +++++++ core/sys/windows/ux_theme.odin | 57 ++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 756ec5011..ad2243b56 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -34,7 +34,6 @@ foreign gdi32 { SetDCBrushColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- GetDCBrushColor :: proc(hdc: HDC) -> COLORREF --- PatBlt :: proc(hdc: HDC, x, y, w, h: INT, rop: DWORD) -> BOOL --- - Rectangle :: proc(hdc: HDC, left, top, right, bottom: INT) -> BOOL --- CreateFontW :: proc(cHeight, cWidth, cEscapement, cOrientation, cWeight: INT, bItalic, bUnderline, bStrikeOut, iCharSet, iOutPrecision: DWORD, iClipPrecision, iQuality, iPitchAndFamily: DWORD, pszFaceName: LPCWSTR) -> HFONT --- CreateFontIndirectW :: proc(lplf: ^LOGFONTW) -> HFONT --- @@ -70,12 +69,20 @@ foreign gdi32 { RealizePalette :: proc(hdc: HDC) -> UINT --- SetTextColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- - RoundRect :: proc(hdc: HDC, left: INT, top: INT, right: INT, bottom: INT, width: INT, height: INT) -> BOOL --- SetPixel :: proc(hdc: HDC, x: INT, y: INT, color: COLORREF) -> COLORREF --- GdiTransparentBlt :: proc(hdcDest: HDC, xoriginDest, yoriginDest, wDest, hDest: INT, hdcSrc: HDC, xoriginSrc, yoriginSrc, wSrc, hSrc: INT, crTransparent: UINT) -> BOOL --- GdiGradientFill :: proc(hdc: HDC, pVertex: PTRIVERTEX, nVertex: ULONG, pMesh: PVOID, nCount: ULONG, ulMode: ULONG) -> BOOL --- GdiAlphaBlend :: proc(hdcDest: HDC, xoriginDest, yoriginDest, wDest, hDest: INT, hdcSrc: HDC, xoriginSrc, yoriginSrc, wSrc, hSrc: INT, ftn: BLENDFUNCTION) -> BOOL --- + + // Filled Shape Functions + Rectangle :: proc(hdc: HDC, left, top, right, bottom: c_int) -> BOOL --- + Ellipse :: proc(hdc: HDC, left, top, right, bottom: c_int) -> BOOL --- + RoundRect :: proc(hdc: HDC, left, top, right, bottom, width, height: c_int) -> BOOL --- + Pie :: proc(hdc: HDC, left, right, top, bottom, xr1, yr1, xr2, yr2: c_int) -> BOOL --- + Chord :: proc(hdc: HDC, x1, y1, x2, y2, x3, y3, x4, y4: c_int) -> BOOL --- + Polygon :: proc(hdc: HDC, apt: [^]POINT, cpt: c_int) -> BOOL --- + PolyPolygon :: proc(hdc: HDC, apt: [^]POINT, asz: [^]c_int, csz: c_int) -> BOOL --- } @(require_results) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index cd3efdeb7..580c09b45 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -58,6 +58,7 @@ foreign user32 { IsZoomed :: proc(hwnd: HWND) -> BOOL --- BringWindowToTop :: proc(hWnd: HWND) -> BOOL --- GetTopWindow :: proc(hWnd: HWND) -> HWND --- + GetWindow :: proc(hwnd: HWND, uCmd: UINT) -> HWND --- SetForegroundWindow :: proc(hWnd: HWND) -> BOOL --- GetForegroundWindow :: proc() -> HWND --- GetDesktopWindow :: proc() -> HWND --- @@ -279,6 +280,7 @@ foreign user32 { FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- + InvertRect :: proc(hDC: HDC, lprc: ^RECT) -> BOOL --- EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- @@ -939,3 +941,13 @@ ESB_DISABLE_UP :: 0x0001 ESB_DISABLE_DOWN :: 0x0002 ESB_DISABLE_LTUP :: ESB_DISABLE_LEFT ESB_DISABLE_RTDN :: ESB_DISABLE_RIGHT + +// Command constants for GetWindow +GW_HWNDFIRST :: 0 +GW_HWNDLAST :: 1 +GW_HWNDNEXT :: 2 +GW_HWNDPREV :: 3 +GW_OWNER :: 4 +GW_CHILD :: 5 +GW_ENABLEDPOPUP :: 6 +GW_MAX :: 6 diff --git a/core/sys/windows/ux_theme.odin b/core/sys/windows/ux_theme.odin index 4ce126c73..e19800246 100644 --- a/core/sys/windows/ux_theme.odin +++ b/core/sys/windows/ux_theme.odin @@ -14,5 +14,62 @@ PMARGINS :: ^MARGINS @(default_calling_convention="system") foreign uxtheme { IsThemeActive :: proc() -> BOOL --- + GetWindowTheme :: proc(hwnd: HWND) -> HTHEME --- SetWindowTheme :: proc(hWnd: HWND, pszSubAppName, pszSubIdList: LPCWSTR) -> HRESULT --- + + // Buffered painting and buffered animation + BufferedPaintInit :: proc() -> HRESULT --- + BufferedPaintUnInit :: proc() -> HRESULT --- + + BeginBufferedPaint :: proc(hdcTarget: HDC, prcTarget: ^RECT, dwFormat: BP_BUFFERFORMAT, pPaintParams: ^BP_PAINTPARAMS, phdc: ^HDC) -> HPAINTBUFFER --- + EndBufferedPaint :: proc(hBufferedPaint: HPAINTBUFFER, fUpdateTarget: BOOL) -> HRESULT --- + + GetBufferedPaintTargetRect :: proc(hBufferedPaint: HPAINTBUFFER, prc: ^RECT) -> HRESULT --- + GetBufferedPaintTargetDC :: proc(hBufferedPaint: HPAINTBUFFER) -> HDC --- + GetBufferedPaintDC :: proc(hBufferedPaint: HPAINTBUFFER) -> HDC --- + GetBufferedPaintBits :: proc(hBufferedPaint, ppbBuffer: ^[^]RGBQUAD, pcxRow: ^c_int) -> HRESULT --- + + BufferedPaintClear :: proc(hBufferedPaint: HPAINTBUFFER, prc: ^RECT) -> HRESULT --- + BufferedPaintSetAlpha :: proc(hBufferedPaint: HPAINTBUFFER, prc: ^RECT, alpha: BYTE) -> HRESULT --- + + BufferedPaintStopAllAnimations :: proc(hwnd: HWND) -> HRESULT --- + BeginBufferedAnimation :: proc(hwnd: HWND, hdcTarget: HDC, prcTarget: ^RECT, dwFormat: BP_BUFFERFORMAT, pPaintParams: ^BP_PAINTPARAMS, pAnimationParams: ^BP_ANIMATIONPARAMS, phdcFrom: ^HDC, phdcTo: ^HDC) -> HANIMATIONBUFFER --- + BufferedPaintRenderAnimation :: proc(hwnd: HWND, hdcTarget: HDC) -> BOOL --- +} + +HTHEME :: distinct HANDLE +HPAINTBUFFER :: distinct HANDLE +HANIMATIONBUFFER :: distinct HANDLE + +BP_BUFFERFORMAT :: enum c_int { + BPBF_COMPATIBLEBITMAP, + BPBF_DIB, + BPBF_TOPDOWNDIB, + BPBF_TOPDOWNMONODIB, +} + +BP_ANIMATIONSTYLE :: enum c_int { + BPAS_NONE, + BPAS_LINEAR, + BPAS_CUBIC, + BPAS_SINE, +} + +// Constants for BP_PAINTPARAMS.dwFlags +BPPF_ERASE :: 0x0001 +BPPF_NOCLIP :: 0x0002 +BPPF_NONCLIENT :: 0x0004 + +BP_ANIMATIONPARAMS :: struct { + cbSize: DWORD, + dwFlags: DWORD, + style: BP_ANIMATIONSTYLE, + dwDuration: DWORD, +} + +BP_PAINTPARAMS :: struct { + cbSize: DWORD, + dwFlags: DWORD, + prcExclude: ^RECT, + pBlendFunction: ^BLENDFUNCTION, } From e0ff16f98cf6c61115db50bb607479e6f8b0b98b Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 24 Jan 2026 10:53:38 +0100 Subject: [PATCH 241/766] Fix #6126 `ExactValue_Compound` wasn't handled properly. --- src/check_expr.cpp | 4 ++-- src/exact_value.cpp | 13 ++++--------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 8fdd5372b..4e791af16 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -12128,12 +12128,12 @@ gb_internal bool is_exact_value_zero(ExactValue const &v) { -gb_internal bool compare_exact_values_compound_lit(TokenKind op, ExactValue x, ExactValue y, bool *do_break_) { +gb_internal bool compare_exact_values_compound_lit(TokenKind op, ExactValue x, ExactValue y) { ast_node(x_cl, CompoundLit, x.value_compound); ast_node(y_cl, CompoundLit, y.value_compound); if (x_cl->elems.count != y_cl->elems.count) { - if (do_break_) *do_break_ = true; + return false; } bool test = op == Token_CmpEq; diff --git a/src/exact_value.cpp b/src/exact_value.cpp index f266b8b24..0f425e043 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -947,7 +947,7 @@ gb_internal gb_inline i32 cmp_f64(f64 a, f64 b) { return (a > b) - (a < b); } -gb_internal bool compare_exact_values_compound_lit(TokenKind op, ExactValue x, ExactValue y, bool *do_break_); +gb_internal bool compare_exact_values_compound_lit(TokenKind op, ExactValue x, ExactValue y); gb_internal bool compare_exact_values(TokenKind op, ExactValue x, ExactValue y) { match_exact_values(&x, &y); @@ -1060,18 +1060,13 @@ gb_internal bool compare_exact_values(TokenKind op, ExactValue x, ExactValue y) case ExactValue_Compound: if (op != Token_CmpEq && op != Token_NotEq) { - break; + return false; } if (x.kind != y.kind) { - break; + return false; } - bool do_break = false; - bool res = compare_exact_values_compound_lit(op, x, y, &do_break); - if (do_break) { - break; - } - return res; + return compare_exact_values_compound_lit(op, x, y); } GB_PANIC("Invalid comparison: %d", x.kind); From 533079fc1ae8e88ae7a5ce10666e56a53791a0d0 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 24 Jan 2026 11:13:50 +0100 Subject: [PATCH 242/766] Fix #6123 --- core/slice/sort.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/slice/sort.odin b/core/slice/sort.odin index 9f91a0f73..ed9d1f315 100644 --- a/core/slice/sort.odin +++ b/core/slice/sort.odin @@ -416,7 +416,7 @@ reverse_sort_by_cmp :: proc(data: $T/[]$E, cmp: proc(i, j: E) -> Ordering) { sort_by_cmp_with_data(data, proc(i, j: E, user_data: rawptr) -> Ordering { k := (proc(i, j: E) -> Ordering)(user_data) return k(j, i) - }, rawptr(data)) + }, rawptr(cmp)) } From a9a65b5377e8146edc35040a1faedd38c425d6cf Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sat, 24 Jan 2026 12:59:55 +0100 Subject: [PATCH 243/766] make #+vet tags always work in addition to command line flags --- src/parser.cpp | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 277a405b7..91ee0ba22 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6363,14 +6363,12 @@ gb_internal u64 parse_vet_tag(Token token_for_pos, String s) { GB_ASSERT(string_starts_with(s, prefix)); s = string_trim_whitespace(substring(s, prefix.len, s.len)); + u64 vet_flags = build_context.vet_flags; + if (s.len == 0) { - return VetFlag_All; + vet_flags |= VetFlag_All; } - - u64 vet_flags = 0; - u64 vet_not_flags = 0; - while (s.len > 0) { String p = string_trim_whitespace(vet_tag_get_token(s, &s, /*allow_colon*/false)); if (p.len == 0) { @@ -6383,16 +6381,16 @@ gb_internal u64 parse_vet_tag(Token token_for_pos, String s) { p = substring(p, 1, p.len); if (p.len == 0) { syntax_error(token_for_pos, "Expected a vet flag name after '!'"); - return build_context.vet_flags; + return vet_flags; } } u64 flag = get_vet_flag_from_name(p); if (flag != VetFlag_NONE) { if (is_notted) { - vet_not_flags |= flag; + vet_flags = vet_flags &~ flag; } else { - vet_flags |= flag; + vet_flags |= flag; } } else { ERROR_BLOCK(); @@ -6410,21 +6408,11 @@ gb_internal u64 parse_vet_tag(Token token_for_pos, String s) { error_line("\tcast\n"); error_line("\ttabs\n"); error_line("\texplicit-allocators\n"); - return build_context.vet_flags; + return vet_flags; } } - if (vet_flags == 0 && vet_not_flags == 0) { - return build_context.vet_flags; - } - if (vet_flags == 0 && vet_not_flags != 0) { - return build_context.vet_flags &~ vet_not_flags; - } - if (vet_flags != 0 && vet_not_flags == 0) { - return vet_flags; - } - GB_ASSERT(vet_flags != 0 && vet_not_flags != 0); - return vet_flags &~ vet_not_flags; + return vet_flags; } gb_internal u64 parse_feature_tag(Token token_for_pos, String s) { From 1c529d8cb217cc97138934f393b5670e16fd1843 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 24 Jan 2026 14:06:31 +0100 Subject: [PATCH 244/766] Fix #6165 --- src/parser.cpp | 6 ++++++ tests/issues/run.bat | 1 + tests/issues/run.sh | 2 +- tests/issues/test_issue_6165.odin | 13 +++++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 tests/issues/test_issue_6165.odin diff --git a/src/parser.cpp b/src/parser.cpp index 277a405b7..fe864a6bc 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6023,6 +6023,12 @@ gb_internal bool determine_path_from_string(BlockingMutex *file_mutex, Ast *node has_windows_drive = true; } } + + for (isize i = 0; i < original_string.len; i++) { + if (original_string.text[i] == '\\') { + original_string.text[i] = '/'; + } + } } #endif diff --git a/tests/issues/run.bat b/tests/issues/run.bat index 9106a339b..f17f646a6 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -28,6 +28,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_5699.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6068.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6101.odin %COMMON% || exit /b +..\..\..\odin test ..\test_issue_6165.odin %COMMON% || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index 58382c7ad..73d0d9587 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -35,7 +35,7 @@ $ODIN build ../test_issue_5265.odin $COMMON $ODIN test ../test_issue_5699.odin $COMMON $ODIN test ../test_issue_6068.odin $COMMON $ODIN test ../test_issue_6101.odin $COMMON - +$ODIN test ../test_issue_6165.odin $COMMON set +x popd diff --git a/tests/issues/test_issue_6165.odin b/tests/issues/test_issue_6165.odin new file mode 100644 index 000000000..b16995f0e --- /dev/null +++ b/tests/issues/test_issue_6165.odin @@ -0,0 +1,13 @@ +// Tests issue #6165 https://github.com/odin-lang/Odin/issues/6165 +package test_issues + +import "core:testing" + +@(test) +test_issue_6165 :: proc(t: ^testing.T) { + TXT :: #load(ODIN_ROOT + "LICENSE") + + // We don't really care about the length. The test is whether this compiles, or + // if the compiler says it can't find the file we know to exist. + assert(len(TXT) > 0) +} \ No newline at end of file From c188bbf82d2313eda866ced3dd5edae8fef66d12 Mon Sep 17 00:00:00 2001 From: nowheredevel Date: Sat, 24 Jan 2026 14:38:53 -0500 Subject: [PATCH 245/766] Update SDL_image to 3.4.0 --- vendor/sdl3/image/LICENSE.txt | 2 +- vendor/sdl3/image/SDL3_image.dll | Bin 289280 -> 382464 bytes vendor/sdl3/image/SDL3_image.lib | Bin 13162 -> 23232 bytes vendor/sdl3/image/include/SDL_image.h | 2572 ++++++++++++++++++------- vendor/sdl3/image/sdl_image.odin | 114 +- 5 files changed, 2001 insertions(+), 687 deletions(-) diff --git a/vendor/sdl3/image/LICENSE.txt b/vendor/sdl3/image/LICENSE.txt index 52d0ed38b..acaf5b21b 100644 --- a/vendor/sdl3/image/LICENSE.txt +++ b/vendor/sdl3/image/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (C) 1997-2025 Sam Lantinga +Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/image/SDL3_image.dll b/vendor/sdl3/image/SDL3_image.dll index 2ba20a7cf88e1cc556544a550346747391b27a7d..ea48dab75ceed250bc0004511819c7d485a5701c 100644 GIT binary patch literal 382464 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

      d`AY0jf+1qD%;G=|@n&gI6nc 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 z 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 z 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%0A!z{0vn-6n<<{WhX zAMZX7k{1OLoFGMJ-8WwgfL4()yyn~uno)So1R9UOQ!9(+u$|wa4(rSZZN%$7`Z5Qc zl))+FWp@i?q94pVgREA0m!-K;*}nIQ{4TT~PT85mr7OGXUFiQxCgO-9c2!fhITT~oCbobX1$z33s7rQ~O z>jpLROWBQXzsv_Uif(&!?oqK21Z@*oqhcV)z~I>YPpOu*x0>-auVeE+=kDJQ{Bw^t zA7|=z;{mM_ad7D_6EMEy)14>bxZ?y514E~aib1y>DXe;wtx z1GHMvr&sjHrvLw8<((7%wiaOlKV}BwOOD?^v>f2yb^Z>xm*aq5H(G3Z()&t!?_@^HBu>J~K40i6tZ(b&b*8iX-RG?rj1&so! zgGz|gyrA|xBvM>ko`7a7&c8Us3o7%$OLD-G*4+b+Zcyd)2ozh5M?mQUJX---NadS+ z;N?|b#DWx9{|4Nlfvh(H_hE8WJV0xvG+xZ%1@&RT!(h-A96q2v%-a{8Aon!?VB&8D ztvhI_QE~Xs-};wnHG1;TjbMhpmjD^(z6c#{WS*>IiTN0gDgBQWgi$ z2&4(zP|)}a)X-_5$&zg@Dvmb)OY&`Q^0$CiAF&wNaFmrGv^#;cf8_xe|4gN6Al^eB zP~iBeI73DNK#QxKJi0#|e9poA)1&)zZ}`6#9Xw17-Pb*u5B+oC-}csn`I-l4m4WMf zkRNW9D8Cl=IDQD!9`NWs?b7SS^df=>ys?hI)df^0aJ zv4LN}>jJ-^!vTH)rw9Ck9vAopygu*?I)K<8JeprJmag^a^>ujRBFg~U*kO9-9}|O5 zZ>qy*egWGV|Cks&dSyBPfkr|8`)EJsmuL9w$S=TR^O--A{WE{WvCsSw$6s9F2JQaX z#v=cjKjxSx=%9h)ET8#xPIUUTICwVycc?kt?V{oUSvw0V{4}~xIBNScICi=+@V9{S zQ|n2WUdR942OashUw7g6Jox=a>q&mkgBO34a7;-1f9T?m(w`pPE-D6&yFuHuUHG>@ za_l~n=6LxzXnC>Y|MO|C%0FEAx3Ms~Ftd4dw_X6vv~3shaO^(qsD0w{BS%g#mrgdv z<{upVO`y$luD#h0;o}RA{M+1^J$kzz@GvlRxTq+AYkQCG<{LZ=4EsTA!#%Wrcv}DU zobtnoIYA|C2B9Ffe!=2b%^O zsq?h{TP*3@eH3hqkM?m7=Ig%QXF+M*MFX7i6#nzKf^rAUWQfDS4mswcqR8N({R5;| z5!FfJRC1Ccijy{~GcY(FRO4{zW^-&l@B*_IrdoySV zRo;OC(cdO6y#IUhyZ?uVw-sm{gzWJC4+`(&pfFQ_dG0(YysxN{7~aTES}wuF;6Vi^ z!NVKuBu6z!csH~CXtv|vZ@&2N|NocSpyB|L_#L}XyYO#gKqPcW?Gyal1yB>YEhq!X zL(Xp?J-kneQ^#|t;hmyNL3o=}$w{c;eNhE7ydg!5tMQYa_6(p=uPfaLJ3~}7EJIox zN_qaD^!N{IL)U+J&DMPpR7N-dV&v~(Wo2OS?S2nwpF1_ztZ`s)>^{QZx{whxx4ZWN zm|A)R94QR{4|x7R+WbQRvLL{fe_M+RXk|4hUYXe(`L|C8DaXi1PN2?zZ^Fm43B<+c zA5VVwKhXU1OO%rM`~%8AM^N(58BqS2qD*3ZB0DLaN=|~uC)i1h%9!!#(+v)INVFOs zfW!`eOBtvL0~c9t-9Bp^T)Pjtww|nHcKm+=G+V^K{rdNtuB|5>`8`iw{8_>ds)K%( z{!BagfCXClfEG0xKx&{9X^#KT^KU-{s)RhaPk3~ z(Z~*OT=kKQ0*T>`>?Cn2ISC%#;QDBzJS4o4>mx`;@<G`o52L#m)R6%76}K^hTJ3XGKs^r6?&t_devRS}j{F+c4?MdcgL{v$ zko~}Ce7f(1hJ!YkI);1puJ-r^?x;)vEw1Qhz3~jzLHPihv1xt43Lbc9KJeG0(?_Mk zwfhC+ARf?qw)Qsy3=EEqKR{;^^7r2dbACcNmju9F3Ej+3AV;yD{>a4O*%>Y1)64rG z%q*7h=nehi+nKE32tHoPkzcd;#Akj1Q=d^VK?4(x{M$JAqfdV3k39XEKkgu0 z4x|t)F4*)3)W6j@ilGFm-GdRL&gl<7SkWn5=76Trph`eaa^#P^fT9#;9uveoCa78z zHAv0^9q|EG0yXX;ic*+y%n;+8SfGkg6d{=h8YaM|1Y{1>2o8umJftAPO+1XC6cKqE z6zD8aw_M`aIO@?GqySpp1P^)NUIz{o>p^CNbp8FzFX;4!U*jm)#7N8_{LC-d1Zqej zltAsd{MnH|@(ET$|A7qsfY5=W2;^~)p`e2caVP;f4rIg^xcnKI5g?tQ6BbcrK#G5W z21of@OaA`7c0d>^|?>3)0lr znFQP!U>l%zgKQ0f2!Pgif$U?1=t8n;l?1B&5g?nUN?^0U9%4TzU7*^Z2DkqJXt4&w zPLJNuJBXkZgu27^k|Y22qiF|UaCEq+1h{nMs06}fu7l3lfXTRmb~cqDB(H+}6vDuG z%ta-P@tErsj$^JjnZf-9PSA9IhtogD{|Ama{TKA@^c5ME^TyxK}yB$;; zdiM5%MlJRUgC@0mLoa|g#(QYr@UXt;!S8+#+?hE1Vl5{VgD2yBu!hF{APPM6q2}4$ z4;uRL?41rW#1VYRiR1t2py3bC<6!eaEd>wjd&SZo+MhuQ+=KbDPxmoM?1MtoSsc`h zYS-Wa?F>2T**%?u2Q;gE9=syw#aD=|0S_$LJ-eq1AS<{6QD6brE`g9`e6bB8>wv6X z0a?LRaaaPm1xiqm2=eK5y$XsTob5RKsJmz|Z88N=m>&W>3 zASmX1dmWhgw=sG21~GQHz@o{q)8Sw9Pv)ANXn_uz7f3tqdYi!>9PGzj?=pabzBlv& zYVhlE&?@+kh=R5X9d`w-Z(}&_x&#zm$6Z0kMKFL$DKOVX1$=U?YwI`uzJu(bQSzlP zKurYW|DXyx>J@01@HVIhW=(s=!~kOOIzkzu4X>COoO)S6OD4cFvgJ@2RW%TUU%*uB z6=-3v<{A|NHU_W~T@i@L78THGy&&UE-@RmFaOsRu$$+=tjZb#^s1&%izUA)&oiyRn z4Q{nK^+L}0>2#d|8ab@+=$*g74FEuEv)fwU73CFgo(DKhf#i z(Cfk6e1HYSapYfrpwqXlD}Cxc|LQjGaCz31D&8mR=_&2&<#li5bLlgpPl#xr-*_^u|Wnp@<(3&%pdvgGk?s5&-^j3L0UfZ$Gm~6Vq#zbvDS!! z7Vv_6!vXQhYi7{u3jXzHoO?yMUAlc#BACxH`?ho+)IR2FeU{($aP4` z=MPG#$6R18ox!hhrW=%Rnh&ychp6O$5)~*nMu4>61$hOWyd3!>pMlMSr!mlaXpqm= zi2ea>q-Z`Q;L)7BgOR^={~yo_N*|RJ$NvYqOXoN;pK<(u8k9Aids!?%Qv^L-pxwmX zC7?x`psiV;EsQ?Bt)RB0N3V-YfKT^1&^lcQkKU=E6kc3;3R>X?G7zHJ!>6~83ACsQWF|<7gHNyP2ajIYB_NIk$aJu58w(d` zF4slHz@xW~8MO8qyp*@MjfDduuJEFgSff|KjRu+1ON7yKPyhe#_E9MSWyX}|gB&i* zzH6XGY`5zMm+lyq3{de4ijovZ>$ChlcYpo=4=d(fm~Vh)=bPVifQxKL>wEk?zQ4c* zhPd!+K#Fx2eho;851M_e=ym+x{DY0ZJr;C$PmM|dco$om_Cd#epam8D+Yd0GX#UB; z-((7s|JZ%pQG422ReVF zjM|8C={|tjg7LJz2O2Us25KZk_-G&YV7~0zeGb%qY32hD8ASZ&Z|wx1y993aKwSoQ z38;Aqsn$bO0#Mx)MlCl5pt$KhF9XBD=N#R~J+;5_w_XMfdV-tYuX!L%a7eI%8#n)N zg1i(1ZsCAk3u+t3Km!ug7HR&?8lij0~RL{h)TB3%|w^ z6$MZw%Y52}Ut^An0UKx?yT%k12MD7_B>=)`Q335L=hxVyQUKaWuCYa>0i>;ai^>Hy z1_sYguyG!ZKfx_aRhRCA&{ichdZ3YFd=j}~+5DTSSiwj8G1wE}NI3$Hm)GEC9@tFK za^o9dtLCVj0MV@{OO$b$k7T-I_p#SZp!G$)pm7n3bMZ5O#JkU~{E>%0 z^9wrs_{=XD05bU^*m4<=j!U4@`n4m!#t9Jb)Mr;vv%rO4z(D~#TmYIzj`<36i~-20 z9tNNJ1sOm-;Ey@={2$1bQu<(JV6B|&N zlt9BI1T{=@$P5#lxd!BdfDCxRfc%8WFQ60w&NAQy7m%<@zz7yl;6Vd}KjH@{e}MhW z9|0-_K>ikV$boqgmd%NkIY!WNX! zVkQCRDo}VTfI=q#RDgnunFpZY0rjFmA;T}&0S+mY5CYB5ql8cjwh)2_45%CiWjat` zd4RJVq(BC_08}P}0|{$^d;}CiF7Oa~fj5LWKxqvrnX$l<8Nc8LuzMZ(Bf%j9E_*=1 z1Iux!rLYDlN2P!q2Py_Y!2>CAPJj{}xIW?+ba(;^BG3rKXZ{FKY1{z{E>L;_mBkI9 zRWSS-VCTLB34#+*23in-TyPv3MBq?C6htt~k;))YsSpV%gV6lR0SQ~d4Io=VVeA7A zFi;@{3a=lK;02|yH=y(n3Kd9#i8%x*dO+a7Y$fV3dhay+2Sh_$lP0R>YA%%z}U z(g3HTGoWAs$-Mvt(Hijd0yu=gp@ou)dKefOP*M@q%ce7+1cVYEk@(9d9#HUr>TPfk zfkNgpzu*S2LqWY&P)LA61b^|Q0}FyTpZNtlKtbTqd_cgX`4uC7YsT;Y|M@j)R0@20 zA&a9y(_JrI`8AwRxbkaw?{MYU2wvgJuMs`Nm0u&d!-ZcXM@7JeU&BPjv->gpWGv|V zz0MdF0nqwy3D6ox1<<+PkaMLP-z0$6ZgsOBIt`r_Yf%Z{VPNp-T?iVPbPi(aYKj;ep0GJ$hNgAw1CFrbjQUCPW`-Fq2=CNRkeA{m)4I5GzO0nKET_WAT~Q30K1;A(u*qqj!I0qh*OdwjcXR6M(1I(C1A z)F+Po+t^zUl!$or^60yCALtEZ?7s1W{TCyH2lMOy$Bwb+GkE?#-uzFX<{JMteplm@ zj{MsXI(A=#n+ICEEzX$c*vS$G8d^>Jf564+V986@mIEaMV4Il_{5$Aqb)xj!>nonk zM>sqhkAsH$JR6UJ7Pose=cp(!^0%ge7kc0H=`B&w@a?_{+O7`rf^Y9$Q22w)fvv~z z?PmArEm3iB?6&jhKJ2M|z^D7F2lEHGdmQ<<2{`@-EnQ^t?G0iAEsyu?}>I6 z0c}<5w|-{xZQ->HK|)5ZFH%~{Xp;~by^cRU*pgJ%3Z8jpgV)_54?P{*C1p-9ih z-=G`cY8pYiRY0i@)akhRn2`aL;z8-svpd?tvpd_tv%A;>d5RZuo&_j93xLwI1Zcso z0(2in_f7B$(@s!t&7=F3tMNB}c?M7Z^*?ujdRiXcS3R^3dUSvHu>Rq}@BG1|@gS(9 z=fQm1r~BB8tsfZ~Ji5EVTA9yzbV69rKAIx~+ID(HshGb6A`uJc(mTZ2b0rC{+Cais+ zj+Jls576$4PyFGR_``2|bRXiE2hH7bfX*1^PdMSx>%fu5pLimT|KG(l{ydLAY5WN% zpaM6+OJBj`_!a+;KqvM=onP?Q+yqePHzAGx->o$M{KJk19C-T#5- zRgS+11$8K);oG|!67c8If>{9+%-vT}g4p;Z(&|#jy`WJN59@!$3ZSzQdqY$bAZs37 zA!|$@fObzoECKri)LE|Z(EbT?3Q~+8e{uLdQjDWJMFr#($TC;l&H+2bL;E|#8s_Uh z-N&GdUBfXPG6fvE9@;-)3tLg#Vh(Z(>XMso&{>s`b+@o(9-xEjyRSl$9#W`)(pUy) z;jIjK;Vr}_NVq_qbK=kc|BgFBr%w2GAN2$sGjjUHmOuah`zD_O3tR^+cv}n_7HmGE z0qO5M#>7Kbf*T(|tx$~6_zt1Ljv?Uk1?1<(Hyc1hZ{4i9N1>HU>jcn#$lIU=78#(u zNDe;T4?#yqvKt?GY0U>3;@hHf1Ei;OkIDnkVKJR+z-M59Hd?L#^Y^GM03CO+JQ#S)MiB1mS0sA#;n3sQsR zgfNI+kQ3TKQeY>vg0!cCv|k0y0vf&b=oOW{zyu8y&`hc#Xa|eNi|jj$;M-+DgWir? z8No83P!Wy3z{J2GexTE}!PV#+SZ()j(8doPmtF@J2cvJG>bBs84n%tk=>Ccc&>-&x zEr{wq^TGt;OHferw@w5fW_SP+ic%nVHveGZZ{7Cq|Nm|m6%~(O(NE`@82C>>%mCeK z0JihR>DwUpmAbn0I*537p8@GFcya4CBZEit4-x*>PS8P62YpluIJ$479rRHt;sB8) zV6qHM)^Ma9^lbnUO&k!zJ$gmgorgt5HpF~0kRv?1&)9-480Bwo0j)6woje*k;YIFk zMh5Ur0M>{3TS1FYcdTBuYSs70-M=orha0#QZlDyzKo3wbK^<)HLKEU(7XH=%&}glT ziUIie6Ogg|C-`?g;CAKT_RWER+cy_}r;ngrL@OG=Va@OQ5pKn)b1*k=zXb}D5+#tE zS1^_^{Xd|67!+b90^JuN+e1K!q4E|y6ZDGq!ZlZcHS@QC2Jww=zw`hNghH}PuP8HI zRR~no$G`voLsGi=Ie1E!zXeOBa_5;CUi`bs$nY|c3p7^^%1&koh2L(%6n;I&#PH%O zNTDlSVJJf3S-8S8Acbo{3T5C5c_0d3EQhOF22#}qQuU1!X0IMZ70By#aD}xXg|Q%o zXE{MfG`gr1xPbP~R5Typ=ie5iQrUf?`Qe9yFIYN#R7_l3-h!jWaWAO+bK!UW*-)dR z$N=7a0y-fwz=hxCW%FZ37yk7x9GUNTpYDuNv2f&Hf7YclM}s1$YksF=L?2GZK;qT=Aw4O(-}-|~Zlf#I8rN+nZ?s0*kqIVPI0v{Cz z(ETl-i$g)?G4Qu81ubDay#rJuUVh-w8#}?X8+3t(!He%;CqoV~S;7Gd$&)VK*J15F z{%zc#6-l1m0URE^(aeq=K7xPvw>kgw?DpVr>~P`y%fHR}Ka2y}=y<02zd{M8L(4b* zmW`m3e7es=ZEgPHz~4F#bZX@fpI+Yyj=Pi?7(i!bb2|1q{k!neqgMoc5shcJ14joB z6Nqx;-{#49;bn)903(dc1m-e1_B#Cs$ucABy6_T79}8F^Tpuf#%LLNHcHyOC_aS7B zNZQyz>X_i#IKW(xb&MdboXEORtm6VHL^zWh%mwKKTgih{A1_!T+&(@q7o?9FWFJ3< zK9HyYC@{bZ!HyDyb3yu8Kq`bV^nuiXWP~C5U|bO}7o?9BBrA$jpBPvn+@0cJE=V66 zNS_2weUe~>aD7r>E=V6cNS`!LeKKH$aDB31E=V5-NS_=|eez(1aD573E=V6INS`8x zK9H!=g_of4@a^?9Ku&6(;d;41s=i>=`xT@UtPpPJH!v4uCpSpncdYt;VCwq`*T)0W z_Y14O-2r`01|AIt8JSGtDpR4udqCMaewmU|}qLkUSQv%eAM~N`xEJ@GqYcGyJVq|!! z2s+HH`M(5z3+P6!mXrLghd}$*4>@*!Jothc)b;=!;QbriYD!VDfUXZRKH%DY)1#9a zbZ%~S_di$T|DaextPgYSKI^!#!I6LcY1i)K9^IEcn9sZMZxb$IcRiAyhDvo;_6dFcTMljHvb9{&$HUU&)G)mRKV9xOyf z>Gfg9|A$?z?-b1j1x52=j{l$#QsHj`t%C*~<{R+RgOP!uw}{=f`{2QM%$+4FDy^6J zTR57<8D4J(Eg`x5z>$CZiPx)p zMI89I`G`*Fbz%agTGk1@PK^B9Tv#U@e8Ay&@PU8}^8pv;gReVXx(~eWaBM!p;bNVl zVp7Zlv*7kW&;pVil@!piwHe(ZDh8m&NYVd8pd4&{p*RGTu|Y0L0(BU{S6BDSo;w0M z9m2EwT=$O`8_zQ`xPapR8YmMSKM!gl`KUO&ID8&-aFItZ@7^PzjpCO<-8hFAQ_nLp zyyo!iKKG&$tPU!=0e}zrp8Y>4Mza{DTL4KGqM9UeVq|kcPa%i+ATh4SDeSSS%jBqBT$n zjTcwJ5}@<3AYD(!Ay=Xj0lO*yeCY((vCA)jN;QyU&ww1N5DK|d z3$!xhF20MNM#8lVBa z&MhjSd+uL2p96UwG+zXcDNvD`0J?Rt`@;)8kkf2IQYFHmQBm1^KW@@U_=L z{QF&0Qb37MC7FMJiAo0lHs6KXA3&mMF5M^j_lKxt{XYg;c&L5h{~^%YngGX!AB?5> z|4ugiWG*WPo45vKVj9@Q5ETdTuJyAos=$0ucf1lL9SP<_oa+g?CS{Ha*azLcAisiQ zwGI?d-Fs9lKpty60tyq@_(tqu$A%vqrIQ+dGL{M)cTw>H6$+3;MqZ0I{AA{DE&2cd zKS%;}sJ!D2&y^-j{QG?u@vpz=k$ekWoOpDf1`T&a zyqI%_kpUEd7LaS{O8Gr{WuG4e<$x0}FEcSPcy?a{^+P;-x{D-SER%Tn`y@cM2>&+M zg`kqv#iB+fsZ`CU`!KjxIs0N0$UIOT(F#)r>X&G|1WjLgcHj4~j8TawD|KysQX1&m z>!QL4iZalBgD)yU8bMoITD`$lk&B9g&4FSL$o9O~NT(1gc!KV(U*Pcn|Nj>*a7~~S zsz9gHD0Hw`JN`cdI>*8~MkS(XD(LLSgT~q=y7_86LO7L$3-Q#@e(ksXA z(+!UpFFkVR5Ha-pf3W!lW94oB{jQ7tA9id$z+ru(W-r(Qj{gsX4)=DkzELv=?3kCJ z8Oi1!9HlBg$;UjpulraZ294M9J0E^=;x;4b08Lkjt6$cDjyC=wQCjZ7eBY=0Iw)(j z94JYF)E7RyY|ngGhq;6vJzK)RZLFqU#Q z)TkKnlsT&!K!{7h^A!k>B&K+ku1u6?9)txEXK_q-W1b&TuZ!Hy^}d^8A0?*ZN1zIf&7>Pr!`s0<9nD zu2Hc7T_LRjI#PB22}XvO#lJzvL!EH|ovjYOjj)?FV*|A8Z2{j$2s%xt^<*iF(Sg^+ zpwbp}A1>&^Bhb-=FRq>d1u-bkfZPjeYI<~kFuMKX@Cil+4{%XiD%((_qQF%u25Qc+ zmhyw!tNhz;Tezqw@w?psjp%@ecF(^E0cioPHUrJ8g06j>1HO6}G}Qvi6QFW24HSKi zM?mh3M;+e<*Ov<5YbI|(u9@uG%Ea*E%W*~q(CJFTj?hzoPJ1*TQHXvCx~2lmf|=qF z3Oaz=!;ya*Xfqw?@<<_%US7YgpmR@-c*MuPTmmwwGe#u=G}Tc6x!}73bd;2XtI_|) zN){G{GBKClGVqZs8Ksupjsl9>092uECnh&yoDpLi=?pvVt zjsfW89}b^R8x>dM|DeW9Z#|QX_2IgD&+f~hDJu=%UT+R)``-Frt%xK4cE&VIrXueD z$J06)LH7>77U18`Pq;q2kl)_t(FdryI0i zX**~F`;R04c9HJ1|A!p4Z>2eQ2C`H>0~PoRuAu7ix<~7Q3Ry_~oz)^oj^M{y*s2dZ~V^Pq&QGI5>_sf|gW(SRUP{`30M^CNMDY3pQ6xU|@K`Cc?k~ zZf3z83qJqIi_fLkN&dx4VFre7=a_Eq1pd_rn-4H`dM9)`$29-oC^Ac%;L+{u;9>3T zQOwrC;ql+u;b3+GN3(OxkLKza4*qT43B~t7EjQ5Fvo94v7t!sJgydha2tNbLS!tj^ z^=N)0;nE!$;{m!0H%3JPl&K6ndN;0`1Uho8M1=#g2HC^9(15=g)ZTOH4oqEPIX3zUd`dTqa@{r?Y6xuE1N;Mn|+v6RP!f18;j|E_l&9{-Q=Z{u_Pc8rm~1-yk| zTON~3_f7t7evBT?$CwX3<=}ql%)h-Sz95j9!G(YO6pyYB&@~iO7(o&0*nPqgbe+Lv zm(G9$$6g+RPLG)8pBzP|ko4oz?cv~K?cq_(?b;#e@!!D#B;e8=kkIWB<9P5DNAtlS zAdL`B#TT9Vw@tAw2xew*?QWS~5XsEos(je-@&i}yLoU4{TrQms2`-%hF^*vcBT8-DeyBf>sO^i#YLbn_^oK!pz{tzip0f zK^QZ`YcY?5FF8QsmIV#yUo9C3L_|;xbSbE<8i8sfx)r+l;h>c zuG}|Vds&2BIwKNXIvrv_g9=4RB)ITzy9Lu*eCjnj$X|}#mtDK3%m)WUuZ)C?@>Q44h#1H26RzEd!C`(06m*W= zw;Y>)bMQCq056+AiDV;6fP<}!00+8b^I>qPJ9gg!nFunj`8P-L(bpBAdn>@v3Q82v zn0D+w?aF-P@*_v?OCZ%C$97-pz6I4)rTVO?Or-<0qdbb*SO<6%bGvjffg-@8JHX*!Mgm8(L(GrniWtz?k3&N74das_Rs53byH|o1nt`&a2B<1A=v)JC zpn)2qzOCO%g<9Y8w>WTs?kX$R;BPVGU|{I>*69w`U_RCSlZn6S8mJ-Rt-^fDrTe5~ zui1aXaH;{%XGKF5Ew4dyh6%Un7j-t7+7==Rq6e~9^1XRt=|Pv)XC!c3)_G z1a@h!10#4h^TFN-hI#`c0CIY(-~a#r z!2t=5TbJ%^js2ita@787U9H3KT&>ett<(Cpl-IHGFW65_QJ^gw-N6~)do*0SlT}<> zFLiqhxOSg$eBi%JCxp%4 zk^$;k9^&6V#TgX5pjHCt{w7EM?MKqI54rGfzu{tipT8Y6XAX(FULGSC3y8I)g1wIa zT`V9L@wZF>^*^>x0Y?+a96r#U7HH=DVqjpvG=~?-oDv^?Br`xGRp@R3T^@vC27jyS z|NsAy%;9ep`TzgFD`+wSG~3~7e89K+6lh;<%NNjkg+rd&hoC|0!+Zg0Jez+Tr*|(4 z7id?x6-OzDH``_Yys*!=A@h_-N$KSLWH2B%=Y|!ib zmoYoUwb%K72Zv+#36SQ4FF9N~KsV1h8+3Ruc{Dp4Fne@+TkvmVyzqjjp@R{hHICf} zKQ{s()-vHJw&zA?n<8@yg|Z2rYuBFk5Wx^a&j84kW+w?0(N``uZ9fq{d8zvcFK z&>d7Botq)83eb_^pjHL=eyP?2rHW9)UT*#lYSM#MfxF2*otr`GUUPs*2L71`K)rR? zV03(3EM&PI`21ys&@e~PHR1}c#+N{~na6iWu;rjO4Cvktm+oIBg58cP+Kv&{jymOR zpaWK3GlQ;lvlJ}V^yqE`5A$?SJOIwS93I-IJQ{zV@nK{r;_>NT4Jwv>m|wkS_vu}| zY7(gF>>c3Q+q%aGG*0d80V*PVI~Di|0TEqPCJ1t%2W>-LT@KH%8=p9R!ca^RnG;PQjsOh#_!gihy# z&g_`xzZ^wY9^KUr9@frzT;><`lGWr!GV9< zF^In66R$ZzD!V}!%{cA@o%ZC~da~3VJWn>7UN5=S;3u8(6Y%jAO8RE z_6~9BzTngC?cm#eu=ON=%MtKRiWfb!uY3GId2VX+EcHRk&{M$Z4 z4LRx39URi@DB#Gy{Sv4@ak0}mrZYGJ)O9w7j;Hv5`p)c*9pK1;L@Ovvn-Bar_zDq| z#Wz4Exf);VKGA$Yz?FadDaXqXUARxVbOwjGAo}B)X%iskxq{0t2arji2nRV5)+sN( z3o+`XtMN6EcK#Mn^^Md%jp=rdaAZD+(!lC<kWF5>Z{%xT2 z<@o=gi?w%1(bCt_uC13!r5t;M7(o%`(S5qJ7?i?Z?05(2135dmf?9idOyJQ5P=e%d zEoWq4XgyG33K~g(#stVuU{7*8B0LGo44{FB13$W9gA>KqK*>yifq}n88Z@)h9jpMl zisRD3R}z;W^?GnX@)#tdz@2x{gb%2jK1Ugz2 zoZws`2@Y&Zb^?b>cW?qM){5`GdVD5B|>Ana`uZGb0hPeYg*aJ%Y&M_cE zK%Z&(IG)dw!VVEVx6oPXOXNXja{+Up?z36df$Sb9eI zyW1OL-$7XZ0EbWU4advRdL0E^xIc9|$GCJBgY%dgXgmVyU2wh!*$7IYF5SgQ-u3A1 z2DNpJFFEdLU}9i+vGO=0!++-*kKX3hlNcDfiyc5?#Q~rOq=!eRvw=r%GiWdh)YR*C z4q}-Jp>;kM3sBW^a#94v*e$ zP<7$c?ac9Cxb;A3_VH#=68!)F|9|k+ORr-+dMATbBp>s!epTw?(cKNHftn%pk%mY2 zQSFx=+6R5C5AZv^^I+}PQr`5i(*8z?{v&^bUAZsVIDoS*?a);H6bA@>WkUf^H=EqVrB zq46A#F+DX5d`*nQE1`2_zqMvq=k#{VuY4xrs! zrSD$`GC`KP8*o9j9DKlL{LO>;IB1Rg3y^a`tAjmyCxB!1fNSf?IvtN*-%H@}GZ+5t zOlhDiTlxMUOLOUT{Fm0r2pV<%f54;p5R;?z!J4~1y{(|lJ)jGqLod9@2Cc`u2AXl! z@aR6_)BWK^=ZpXUTffzbgJzn$kMVB@osGrv-=)U^v>&$gy{qxb-JtPa>(Bgstf01d zuPYK{8OP`!l~P3jl%?HmmUX?{|B8qUDh~&#OvOH?j<+==Gy(& zv-^@~^Dm|vC(mBjf3C&{JTAWI<#7dVWO32{$qzlRx!YxmgJbsz(2$S^qYLv5$L0e} z-7ZsXJeprIU4G!g{K3Qea{Voj)=PDKF5NyLwPzi*&pTdz=+nJN1>_{>UKTkQ<`a(H zXS)xBRwD3bZxN!A1Loe=o}l&~_?#{oweY!?XL8Z|kKxC2)9lyYx7;9w_DV z_r;gp6ttaaYy?RBaf75U<&WHJiPw#Y)M?i8O2OqHcFkgVhmn;7^X5#~( z1ZW64)y%D%r^%~Vq{*?@ld+Qvw4ST`VlNLv^CL#bi!ZwmIsQMvebBY_K>dp}$4(~C z=0i-Lph=R~jHTN>x_d!65j6YwVl8;J4k)LB_L)F3GHCGb4D|jHkIo#>ro|E!NISRuBc6mjd4hqyWATsPPSWOJg@{&Ln90)1m^}0O{NP0dz;uFOS|H z6$Q|(%ar`L_%B_ByceZ##AH6-VPC z21W*k|1CWrGyb&*G9H{C9J>#L=2sOCKH%`_ZGpJ$q;D@vgOBzh(0M=#yTIWJcTXpWBQp;} zrw5B8vkwCcXbT#+lzY+ot;F4hfBRV<(9KlWkj78C!OjN_wr@Y=arp)RwgcThEeejE zB7L6SpxuuSe;}g&U0M{tGgxOmy3afQKiqtj!?XLJPxnU`>)ZTIq2Rk1kAvp0LBR=1 zMT=H5g0~BT0^GAZTEVkB+XA#zFfJZ>haD(>khTh+1kGoi`k?`ziU?}Bt{C^&F!n!SJ47dJ;<32giTG#GlAO)Ed7#K>q z9si#LDX>0X|JpP8zen$6aQ^H*?$PU8@Ir7WBLj%xn|#cJ`MgK(WYA2F zRqXh~4}e$4UUlp~>)L&nU$EJ$4LoHQ)yBZk*__qJz>wD2oY%&{;M)3xzeSM=wAnYb zz?FX+mut(((wx?lCAQ5!nTusWJ)$(m9%qpD?&JTDJ9Lz=7&IUJU;62_WZHkQK@BgN zK{Cf&SPTR@d~6KVKpzHWLa###nFO@!hZ30@W?4n}u|9JB+ zu5!V&|IImV3=9pgm>rL?FbKZphuYZiiW?*#)DZ%4*Hss*b0wjzCrj)>zLP`tUD^bY z+lcjFn$!OlZ;)%dkGpjEuo%3S|9`OgCtIl$G*Ccw(((Vt!GQwuD)ay2j{gsP{yzlj zV!2x1;cuGo@BjbSlO@g|hp47GG4_Cs17&!4{yqL5VmKtc>!C)2oZ0Y_8EiBtykDoZ zUMfifg`hSx1flI+)bQhGW?*oEho2EBA^E_Fpt;&tKQ=A2M`XBTMoxlgZbo#+4m-KRhUjFLYbSr|YWv1=j&Ln+7q zQ=kpBl~239V_bT@7{QyVT&z#H@cW$Tbz}iq+8g)>*2M(%H#DK)54W8S(qlok9MZpZ z?LO+-da@(|GXDzdi+3LYxj+Ks0?-Tr$OXNQ%rMg--Haj)h<&(F0S!TbW=6riOBeoahhX}OFM!TCyx`dUOQ0yyjenbqj)7yZ(+4O1eJv7i zBAFQ+yH7e^e&EP_(1rUDC=mZ21=$J;KW&gj{PGOoaSv{&T_7>!0EEV#i}ic{CeZM{ zM|Ur%tOnHvQ^kg8)%hhr!n{jX;B^qhMf-JTc-A?ya1Jp;RhUhT|uX59)a8z#4qUD&oAgY z-=(v5x%EMQpM%W@EIpD>cy#(se-XC`G#=+V-=`b2m8+B=w9qUJWW|A(Tev}M3$~~{ zU|?VXH+zn|wrhgSmv>GF~wr1k8m?IRyh`^cmFvS;^+ z7y64pE8IYql}LDWy3Y6LjGgY$4Z7*ux813Ohry?_wBM)Obw1ce7tPxC(#hSfcR%RS%d77OT07p-xFZsDDKM+SH_#9$yCeUu7d#%luKh0Hc9%P7{-E(8=-N*3 zuFK|wOy3_mcAo%q4!-1bR6c+4)&E1C{xY56BA|i!pG=JpK|A=t3c*t05{~@49`F~5 zc=Yyz<}g8BVbCSLFXrt4RgvwWey~Spd4xx&yMaeE@io$d}Eo$ek!o%ISHo#izio#hE0o#iDSo#i>5+dz8_p)7;jt5@|czl2C0a~JR+e7=1$Hf;O%!fPTfF!zI_xbYBpNTmC)2lMq8{_7bT7~=~x<4fQg+refrpZ4hFuq>}A;c)Ce zZdqPZ!qk1NvmKP)UUMA>)1aGDElcYiyN^0{pY!R=-S5cndd35ij`-If^nfL$^_WR1 z`GyB56*9*j_voAtPL!SPVDEK8QUfTdaWjFE7sx{XR?z$zEUA44-F4jhwuBQL<)Ha9 zq=W}*BZCtjX#BvV`}~Xgdys^896901gAyJn!H9uI^SU8+!jl^~9cth9{QlUp`!F~q zY99h8!HX|^LA!@gQ{Dw%kU`*mO4mG_e}U2+cmollzrnwa*|GT`B>C}gbB3fo{%y{X z#K*tQ8Itz+w>d+S9{)CHNXp~i<_t-A{M(!%>CU71Foz2$-5vC_K2)>}l(r5Pi|}t_ z{(p%1gvbBGE|BzgsOSwibrDQ&zS_4OcR|vd9eL?35T0y^OK3aSih2Nm!J$1cDuj_G-&eG!^uynK?lB$pkHIL5i;G(8;J5qu? z-VQ3;z-vuGiS9THBGK&zwe&gng9~OZfdQPh&VdTb?(;8{?|{-)DUVC{eo!)f zc@(Tbqg3C+5^P1Onq_%Osp2lM>D}jFY<>b#UkO(a+P3J@SzkeH-VPx#tcyXT3y^Sy zWpPMYgYq_{lz;>`D=2?6yLA6^=>+@4vH3qEf9p|DOTF85yGM6uKWGcs4-Sv!L)U$} zYtQpeVZa}=I{>fCNnc9H0C z{ow&-33Ryrgs?a|Tz`R9PJLi;<==Lo`2l~2?@Nz^FIikVTwfh`z1|t%=kC}&rNtnS znW6EMO;Hs4ao5|tTvA-!hmO16XJBC9ZGOOi@D+=P@xkM+k3BtHg3>xmpQm+}zCPyq zp2N`?qOqxk_p ziWoZI)A+FG!Pg-Fqbu_?K8!9zEB^OO-G>f7;yCz1qQmt|_o0I?Bo02}=y3fCV;+1Z z(c${dquX_UN9cEc0oUvN0>01r1sOi^3%Gvg7xWPL#4qTeaLhp?#G~66+@AF5Efnyv z{#@n>YEasM+koKlBdqO7-}#{NwtLed<86FkGoUTX*F2t`<}a^_xpFsWW?qdg^fx@NxnsbMX*awepkXv2*55AH(_>7|?gySQq zpNlMZ@SQ|Q2*)RwLWhnLj?W(5=RKR*Engg)1{w->o&Q=EQAva9!F6D9-}x_=P6G|j zfW~Y=ZFSHPHmD!q(e29)>a#qU0n$E41$2>$2V^&fBkUd{SP#V^ILtA`G0da!4XBKD z1$8h!I(FX!bz2NPKy%G@pgV}CPh(_o?R8@U4f{KI^iEL$7rLOsqaM6y1UUwL53Vq1 z7hLBW@KHoN3_(%QS))?1*96=}$x$ir0JSV?R5CydmQ+Bys$H!Ag7&7V@H@S5(FQXW zUQ~k&=|0!l0^U^8{o_Rz3;2>`4VUg0t^fJ^qM1Qcp!|Ko%%E|m|0QZ3-REAofz-69 zfU2NgkN=H7|1mHyl!<%v%1)ia#PCv|nStRrMD{-e1H%sR*%{yscaF{fnLqz7FxmpWuBR{Ea`s`#RXcD>Ghmfo~sp&CI{;ApiQ~KFL42T~ri6TcZ3y z+m@DtY;8RN-nf_61v)V0+{-ZVkf8&IWA{0a{|7+n3f5ol@L=rV=tpq5;&7eCMHk!lTni#iRL`34il*@bct)phVTWiGhK^xAh5s zpEGC)s=NaOynh2(_6SO1;Of2m+zUmJQ^5NQ^+AfawWxq(ST1xx7&eUMr#o1zJ^ml| zw7yew06ek|bA)5#Pf&!{s`|G6F9Gd&^6fqjoj=Pw0Fs&M`2A;x<9~1#e&(6%D)9fP z2lEf>92E`zUXU9>d$T}$>Qr7@{{R2q7c}HC5tOdG&%L+|o{H!1n8m=r0JHyo(bJdJ z|NsAYu>_s2)qUL;v`zV(2fxeZ7txa$89c3zm*)9cmZ*5}w?=}Lb*}*joh#^IuXB*` z7tqcCRCJc*zeQ zx{gsXc*zT9`KVauzVHO8GClxR6%Sg^1U@DzuAPbDh211jXTC-y!?XJs z$QcEo>C+02Zb;_$XgmTcO&sGKW8$I@8y`UB!-^g-?Eu=&g>V0m%p}nMA<*0wXdc19 zqZ_(^hzsPP<{wPpZEFSrrDFWsd{hj<8Lr`_A^*194L?~?wyn*b2r3P6?Hd9+1~xwg zb<<7b{}W*8F$A>j@brr*AVa{3aV}^;WSfhMg^hBl0iu6^ralF#zO)dux7EUiw}i!p ztMnHCwi7R&P6Th{o(FQb#fytzUWr%Z|1)RK@YFhimG}Dp>gDN2GP2jk1GFfJ4`!+~ zL^H@$tp`dEgOXc}iUDW>J084c%K$uc4&g(5=n(AD{06k&85EikFDgJLK}rfm577N5 zpxr69|NsB5FOz)XJ^?h^!CTnR#PGs*0;s0(0PkRT+zD<3gO-Yc=0y#!*U5bvD<`wujO0@`~H-H!&@b8i7& z&-LO=KPWwcJ zWMBYIaewsfzTwjS3$mLIa<{iHXrM(LT-Ti};dShF{0mBb?W~{^MVkMM@%Q`&tp?xb z&bk|P2a*f_Hh&iWZJhku!WsFu<%3RWNN09D_>jYe`vm_scQyo*9m;g=BN(KG*RjKy6SP#JrIHC$6CdDj0o|VH z*zk*)zbOs0s=VPB3x9hI69a<{BY%4c69dD+haB9eK*ZUD4>=sU&our_%git2Z?#|o z?F-w%&~jbe@%u*?>jV7Fs$es}l`^|_e{$ttf6$eG{W0I<2cQ!lmi9ubCJmo%P%X{h z@)Hz#mq6Pk4IFoX>cbb`moPFoHXr{1+P%fV!0_MI=m5B#;c9f!)##GL*8kwTXAfu< z-SOj~kq_VGZ@$`peS2e>T)J~qR9e5)vHw5!vXGI1!O{9Ie=lgwx<~Ti|A+aviC8rL z0<|tmjlcq+dulBpEYM*uF8tegU|b&+MHi5I@W~`EL2a)4uqIFuTJTIDP%%sNaiOb0-0riMq%D$Fh*2kS63ykc@;I^n`}$)yA2VvudG z{U95Htv!+tH$1X$c%|_FunW^EumX?=`L`Wxc*uX?1xv$A4jm4rQ%r|km=3rwT?Cs5 z_U>yQTd)gRyFWEQvv=U%b~O6}=xn1y*(X59I2~lZ*vr$vd=XUH_3}7?nnTPNn;+SC zx=b-}?Qs6*+Ts1*wL{pm`5#Lui(^MNqc8J4?_L&pPwON6J@MdE0drI|JiCuVu9fHk zXCP3E_Z=v0bk9-g02N1#M?g6ZX$dT7=c+>}sKEa{6mVrwVs86pG z#iP@8hT{$}tCuwfEDoAQVesg5T>w7a&~-;=tc6FXYk)_u>kf}jSBDp2ps-E8;L+>5 zqubR%+ckjE)xx9G*P-=NDNkqY29Ms*ogJ||UUPv48$k9kU-0M*_3-IsE$s!J`WzbJ z(f#|liwbB@6@!QMsbU^bEARh7kP)v#EMqs6__}nvZUH;B+jqtP&X zKU0#^?V?iA{DY&O3+9j4oXtN3N^L+#_`z%D?i!VX<_aFh5|QH$pi4m+JX-&ka(HzA zet8tM^`P6pr8|S=xQhyCXBWe3S&v@PGvHc`cV#UT!;8)iMuwMjK(>SKBzlq20csHW zsARl|gR&A{gn*P(f|T@%7J|aImp2cj)eo$~HDG6l2PhY~I)Hoz^4AM7u*?roe@WD% zS2U*908OAYcrY-$h@B5gK&}m-W?U!xi@XV-%y+(XzJ~_` z!|`?>4+aKM<~Y`_0b;$lZ_dDAbECxDqgV7zH`v^VHB1aI4z`0F?iv6#1j#AWLE^ol zl@O)dKuV{zGctghQU;(f0#z!YSVGqq-_FPY_Sg&0c2KkS0mw5F9=)RTYrvM~fK2iM z8Q%T-btsB|dgnp>iHx10XrF^?xZZ+{s0Z3=GXRDmIKIqM-KB);1*XghAvSI3RK}k>#vF z(>b!{mCOt!B9KF)T|qsvYal~rP6X}Vbx|>R2|6|f+>`+w5cZ;`4dfTrQ_KtuoiQpl z9-XcQ9=%h+Bl*3oM;B^VhPUigC!>PJF2xflANAOs)h$=^~2vab7tgVBFiqi-(`wt`X?X!eu81=QYwmK2r} z{C%3>&i-Y1|Bn%LJ|5`UyABr6If9PhBk($0xELMzw>g3j((G{I0-X}+2tG)&!-b0( zbTA+PHXi}zhM)gS#9L053OKaoC7tm_CLoANg5;fCY zTfUWuLiZV*d(qg+$k43z@8t~!1_p^AcUT{KXcYziZ^}7FG`S<_- z|NJeWbi@=3ns+I`iv^;?~qYxlVcj{Ms|(|Q4np3MiCKqDQD9Ue>_0n8rF2Ux%>(e8ON zANFj1#aMaR(nf@QPma2IGiX)T%|3SS(aF55M`HjYlPfd&r z#wS5za8n@rmo-359k9G_@`0E4n-HrKJd!U#`janv!J+n*1p{sNtk65!IAzyTiQ0p$h*$L4=5{Ovn9LHCeF zKk)6$KJg+-7gWacwH_!<^hl2608RAuy#`s;c%;N^VKHfl$XUCa!i z?b2EQTwA}D@>w5p?f&Y*@B0btI_pEFDwfj%JQx^Cgj_6_fvTHQVHe9~pxURD%dz{a zPiKyb#cM&I&J@r{$(80G%>1pOD_0$x|1tCTf>yh0fa`f}c&UPt#EkKQ@pZN478`jKV7;Hbb9l6bn}6t%3tUI2}kCG9-ZDl9KV0`==A>3>C6GTL$kG!fq}u* z`e>^(24CVKxSa5<$?&NBzw2KV7Up@b`n->Mq?UUHR9a19e$D7O+9OtR2%qYK0(b z9l!r@u|C1y-^>O&WqADwNB;Ha8h`%#|G%EUKc9_(q1TboBl*M&)p}3~!{^ftY9{cv zfOdErgO1fQv21fJetN!1D|I>p|;tj=36t>%QU1dkfePLy3xmNADh$E#UPJF5UG%Kx;g^^)LQ#v3^mL?a>|n#;4o;$?Hsy zZZ?nP2uOy~0rg_gGE_$$mKZAr3!=wZEJPF$V=r%mx)j~vPkg%F-*mfwaq0H|;NhpG<>^{gM8=Fef|Hm3Q#Mzo9|^S zGXn$Yu(?)Sko9e#0;BanX{oF6Nf%2_{x(ovcIV&5qUp%LjmHvnadGp@hVFw0UvMyk zhz@3F?BdR#s+>pD@&7@PyD;@RGeO+yV$D%BALQ7-p!_fB(|y*b8|*gU?&DxLgZ7Mp zw{Twv75=R~pn~cDC68`4SK|XNmJIxDD?y`_$m8qI{M$q{9RDBS-^Tpy0{^xX{OeDl zxf!&o0lO3^Je`?v$ibb=P&6ClWG~PV5XdcjFYUqOJC=fFa%mIzxA9p0Kh)vP)Zxw8 z!42|0#H-c|9;9e=qJGJxN*5GDOMgYNY8 z=#6H=Vcs$4|NmXk%=`y6^YF`1P?NlpgN45p)I{utCK&$K>7eq~_>v1Ky&9t1$D;*` z6f0LyVs!>l!XaFB*^Rj{Y(7_iR{M!y> zUI6r@7|*VY8HSdWcKbo0Gtb~SziZ8X*Sc%YTwD` zg9f5DkAcz(e=Dd>4yx)EKt~cufMy{zK=qk{V_ZC1c;%=_goQhTrkE0ZlBa+h zfv(2?J-a`6bieXQo&r88$hG^pWAiT-{#H9sVZooT8(PQ2z^_@O;*iFlZ>v!UzVOyX z#URavKcBS{!u3&60C9P{AlwiY0T5S|8^V=Q0r6yeYnd3Df3frTfllM$*DO&9;1B-> z%JH!IWzXaTY5e)uKxdz(@#jBFsSoZ`15Z;1fJec z<4<@164Y?)bzp~F5tV-=jlb|BOB(;*n`w^xPY;2JhiUwUk6A#h3u*j+52o?|1&KUh zN#jqyk;eb`Q5t{#=`{YrCm<#1kJI=Q&ZP0@A57!VxRb`8csPwe^Ymx_ddAQE^_~JA z%?A~%5ApW|fI6WXB`N_f{2C$P8|r*O1L+zrDh8nI?HpYAHDpvglMi@w{{kJ6-pc~Y za-DO)>l1u>Bbhw4UxKzsf<`JlwLg0G%5eC0fAY}&fgB$E+k`=5{Bqzl>Ui*>NUu|a zW8*bw9-o#2s9N9_ZdCqSta%+o%Uc>$6(FFGFlCDQm1k~Ud5nJ+l@Iy7V+03}UO znq)o*N}tfA#_x)h)?B(TLWNONpe;DD^0p$hfDW0&|-yv?t3nvnd6@x$%kFK&smx@`Si*()v5J5Gdgv&Ffy<*Fn|t@`hUQ) z@dqQQV+9_F2Aw--&0TZ%|KaA}0yRfGlMngyZsY(p*TLf$-S>RD&pC8#;Q(pxKIYh4 z#W%sTcRHANTKj}2^F_x_KM($GT#nYKO5J^X+d(J6`1i7SAgy0dbL?aQU5v-Sjmx*! zfyt%&255)P!T$#wtxuIaa_l|@w(0UC7wcR6&7fmTy3coCxcrFufMcf^$i>aaSeoB6 zR(5zM9|8}kJMI8k;@N%P@pwx+3mYgQ{Qv(Vtc#JM^>$r2sNi()?A;G?qG#`VkW&6_ z?9D$o%eDBohcfKsWME*>J^_w_%MUI;YCTXVEWb}=%5+SNyy zJpLcI{#HTZOws04tT(U5E5;^U$Zd-RGfDFc`KGt-$EUQ`x=O8wW@piu>; zK;=0H=yWRqaIATNF84F#FJoc=9mMYf>aK$~OnX>2gHDMm=I7tW0Y2adEc#llx!QoC zL=H4Z{ka&f7*!3E(Mc;F^HMnv=)n0}uxmjjrU9tzgdXSV(JT59;?#F(Objp16@ofl zF)9Y2Ys5=bpo+lfO@f9mLLEWJ;wo@~tYi%YtyDBV;?dcnA^;Y-3CiUeTnr4|o&wE3 zS!=mL?wc$RI(1E;+gYOd;BS}i2c6ym%@5=q558e_=}eaB-2h5;pcDQ<8u&pPk{}vf zx|1awyN|f^2L5(zejlF#=tx)2n0R(*1!y`~Y}! z6u)4LiUMe#c?)PyE@=@4wadiO=pfj_l5j@_rg0Sh|F|D$X7 zEf?z(#l9Zh)f^t(%pTUqi&%_KzUG9*3^V_>i>|#+9FEKgJB|4_CfE@4IeZkZE9e)pG=}V4^0_aKrP*Vxy7snmKpq4`K6tF)*lP3l* z1ZqHi=`AXtr~@_r^Fh6!V1ede0<|?h-N76_mcm7n&DA0d{H=~m3=GYO1dcm{hO`+v zg9TnkxpaF=K*PYL`w)05cd^q1k8WnrYHM`gA9U;u0PP#;3>E_^zpqZ|MHlI9ea&?|J(7|Nl~Zk6v#Zm+oVr)ng#_FV0tj=hm!1M;A;1 z&klMpUv%vT-B$@pkT2Fl>{a%YZ8Kq7X~pZ7>U`JyHVRAxffNHl^p8Q%ttZ$^OX-vm&^ z_Q^3bFu3)aJpJ|`)T#aE)2n+{;QxQu?$eIlhh6#CpW$DB%!PmbY5w(xeVEUCFdubn z{wK-b&d1Ea;F)~Rv3pAIo=*%6p3GPOKk5zs-+GC^;~*#-z5TC*Y#YKky4Lsfe)fs}(+H+u9sFjqc*S&C4fg;)JC2WIec$jZkr zLB#;n4l}SGxcM9&y$+y>6{gC!FQpMC3xHK2tv^I@4->L`K$}ybX5Rv}NU*pcuAaq_ zf1Bt34v+tp_g}6Boy7zRo<*RX5A`s}L11MdS21^Z{Do@ycg*4c|H_*$LDNSry}|!o zLE)MS?gq%afCeVFc`}0h;*xm~-1q0-<_QWq=Io20F%M7Bv6tBweL;s`g2xJ8F@icP zl_y?;4tIl_Cy8Mm6E5>W&T(Nrgkk2t$|Em9n<(IBf;LQm_h(^s9}Codf3TVLzw*S( zHt?`L)W4OWu}|=LDJWDx{zZ2mUi1Eebb*8az-vQroKql7pf`T7ZZ+U`(pQXbC ztmPjl#_ob|0lLrM^96K&K==6<4w;~QbQHAAF#^=6N&vO7K&#FWdAR%h3n{RwvoC}| zbg!rkq<3u?$HeeLFcVaeyxs?zu=<<t1L4_A+NgAl|5&{)o-7zW=pha$=l{N8)9lMW#nu{L%>ksp%^A}VyIqn6Wl;+6%&Zn1Em*+p^LMT{&)e*F-YyELh5!K7%4&fc+Uw_!6m&L95 zuOxrF7kEzjtYi0-j*9P~(&_@dwE6)nt+sQfb%Kg3rZkt%3?`3W2bRj`FK;1AiSyu6 z0#ROp)O)b__Ifg+V5@xcaydfF9IzG#Ncn@I9%K(2=x~e5`!9H8oUz#l%0OT}AUCq5b$a}Q8Sn?>yML8eU(NtcA;XHWZg82&08#`BVMKo3?g zHgNf{-SZbl`H<$)>F}@exKA&u0oVWkFF`BD;bo2)*iZ)s#P}i1d=_|lhGst4aab++ zQ+ddzm-RH~|Nk%VAs0p$A%#&30|>y(M|VF5)crrO8VzxO0m$fPgwYjMpz?CNCn!A7 z-HYEm(DDAz$lB-A%PP+K|Nm=UNI|CtPZ6LPVgtL^x7U*+tkl}JZ#n)y>|zbd zYCXH4#av_xsF*tjD%>1EWnBQMH|7EAmm%eLP;NE=D?Il?14Q?V8fAcUwRfOX2D;fG6?y!|@tBJfTl7z*0if5M~j4S0!3H|u#XX2{ZBR{`Vypd*|eKuy3-AC&-? zZtzMOpYE3)-JFiiKLkK?=oJq9Q;z>X?#RFXXY*drvKEF?o$gl9h)t)9ibc003&;oq zm+oVrd!f2PH!guDs$Li}Gcde-&jeb+0-6H_b#g(=T|jNb|KR1b2lzX_F@YMB;HKnE z$L~KtO~l8bi5dR&CqU}1Gcho<{^#!i6>ud25M|&0gH(YItcJEDO_D&v<*p6jnP^Ze z4zx?CbB+pV1ly-`33&0PD`;3}j|ymgk1J^BVTp>5PiJXI+62(O3oA017>qCZcDpis z=C60%aNKnP6F5udv({xWfyF)?cU=M#TLl%HaNKnTsNd<7tV0*v;_&#BtXLpq1Us2amfx0h#Cc{UgZA3ohLcj=R19 ziGZ#HivbyV!KE`rCBx&mD`?P#;kYXY$S#m<2&k(W$jAUT`~&EoN)HyW6%mfTj{lht zI(`S;ww%-b0i;e7G%pB_QpfH)j{NH*IJ$d55$Dnkj%*hd2hcL23jXysI((6%|^k8;v@JK%G!F=L{Xd!4dnu|&b^LIz)`<~5j7)wvM zbeE`r{Ndr!ouZP_U7`Y7qgdeh{}}TL(Bva1tUO#mGr4)7I|E}>N_@I&J3PC6C0_6) zFfwSys5rQEhp6~;ANF8$QK@h>{stZ&JI>`)HJFmO{R!KHf+c>fsaOx)xpDxgb~9J>#K zb`pUGx;(mnIyV0ia0DIQ`pc1j$|1-9ha9_4@vlG8ebAAAJ?JWJ507s4?hKCZqmKOR z4|V3KD1dS+=sfU_%b)=rPfp_e17%Ei37_6_32^2t0%?59-w_E~ z3bP07o!0*)d?35Nf46?Y-w)~)^RIv3nWLi8`j)@L5M*)d6aEejkWKs`b&lV^fE0>@ zOaS@hi0u#X0thycKo5Akl1py}yW_#P%%G7ei`J7RV11x<`!D$W?}L_kbRTupzRSP< zp!H$?{&OIKUROpC_XB^^es%^1r(T|1P*wWkb}Y#K;5-6a1jXO738c9B4@a#4Y|Y|T zP*iDv&XV_0(QxU$ZhW${2RuV!32_U5n>}bPaxbe0)Bpdz$u~WFTT~L_nHhXKV^j=0 znL$gkE`nBKM}QKY4Zl1?_d(FiQ$X_rMi+3*9d-PE!Lj)PWA{fFQ1jKoxBEH&`Vtin zm+lun%!fRg%{+Q#Kx^&TJ^vpEtpsSl2U=;-E4qXcbkb6(Apf=&0Rbl#hUOov{Ozou zy^AwElYe#hG)-V-Wbj}<_5Yy{=)7I&Xb($H;ufQ~NqN zM1F$mdC*D^MkdA%7D1%&01XuSw%)GO_640#dD&O{yl3}$U+wFj-Iqb?IYCMl1g#eeTR)P-kJP!)e=ARDyO`y&(sQSPf7obB6P~!sJ zv+q8M5f=wh;^G7>E|A*ipg{iM*?brr9~|KL0JQ^A<3j*7J~*(&2M0Jl1mN)@@W9vl zX3YXnb!OmWeXG_0lu9At3r?co@YRNdFB78^JVIVEmc9mS^02~5M*j5|9S=NUaqJNE1YgVL!S8z5qx*)7 z_1&UFFZ-Y?JUl=qf>-^4&0|J4j}6^CCamVYc5HoHVheE-JGvR{u1p8`w_O04wEiN< zW!Q{33~Es*K!eG}x(B?IoWBL!s{?Icyaw8ms{ZBw|CgYZN{%s)r z98mpiaQ%K?__ulg;os)`7a{bGf1CF|{%y|x;X--8(mMTqfNj|ZO54y>=+hmeV(|YU zDBC%J*R_KhVm6?l)PPo>*3jy+>CKP-|2?`-y@(Ejo=*DO)uUH5EgIZ%D)we#co7^1 z>KB4;ST+x1WO%LO(JSg6%>=qZ@VGnZ!WagRUePjduzF{ZdgU-s0}RxN1C?u#IcCTK zX`nV*(?14=ss9)lUjAcX0Bz1LWng5GWI|e>+!><+KJQcjG^!*49!EERd%O{}^bWK& zq;n-`v2OP#kM5tx8X>zxcCvzYiSW0A7N^7Y&ESTiC3xnu*a2jgKC<4DBM^&Adm4X2P89O!KJUOk_>#x*#s_X7CTKeJqsQ?^3wJ2*c%uV?IRn95fMEVWFc~}`+KxA7Kv^$hK?h78 z;BNut0#Hu1Wq}6qP0&KamffK1c7B5H{wQ?^Nv{h6`>_4um z-X}h5N0t&jk6zJ};o#ug=fTAAVqP#f_?nMc#6=$lMfABBLEa$y`CA%6t3bNXy=a11 z*7y_b^j24pmHR+3!@%DX3s%Dh8j&<`HGb=2nZW@$s{k}m8Q{@7?*nM1ZfA{31Zb&v z0%%4>1JtfmnBdY~ea6-Jn@e}{1;^&&?2gSx*c}i4XLdaJhZ%gH8)z`e_&<2|1(aTm z-#T_5^XcvDFkxWeU+>J}xJv+Z3)b<257s7*^s;z(Bs=f%IQW3whxvpjXiQN1 z1oC*-ejmnv{QCp`frbe_aR6A^~VlAUlayVN5=kM_V9WV9& zn5*>{{vLhsGF~=E@bc^g7wZfT{+{pPEt)kd3ZUU~4N!%f09uF;0UBEh0F5mfKstJm z=mD=gfDta;o)R9QewU*Fc%_A7_X*Hqi&Mq!KHUKvp!+*GJgrX^u^3$f&0Y(7fHwJo zCT{t+fo_y&KEMIK1;RnVrPBj4e=X+NeFAI}*qEaI9^D=s9-SP};hQrKpzNdI*!`jP zQe8f%b75x)cY_r0ZxcYQ#o*ue%ftF$u@Y>GAFPmn+rfj+Ihc=wtp`~if7tjx z*hqblk@g594?gEW*NLJHY=Y5AxPh>e3EBNOU+94o$La1LFI2#+7!`wq&jpx|L#zgQ z7;^pt|2A-0?$Q0z=6?wv zMu5t1Y&yaI^~bHV7=F3@r(1xIl5^635u zN=^o#g28f|4ru=ghhz7p#&6X>9C z3wRi`GX%8eHAlq(v^h$^v)4hvwAS0Do@tg6r7mff5dx)lX_gTR zr50(H5eB73X_gTVr8;Sr5do!Y{QEr~9DK;s*$WCOm+qIHy`ZYM`(mfBLZ>f7r|*N8 zcA&vR{{0aGF8upB`1c1mxbW{U2;kpeVBo^PKjVQ@FAtYX=E0R53=Em4`ehjy95XN4 z^MJNU@yNM$UvSaB$iLr1!IAlbTQ7^Ii}p*$gAaHd4?g8_?X?kb(LUtftD@!7$)e(_ z{mQ+UMb5dGhtZ|`a^}wqLJSO!jmH^4gUP)-a*mBhK+MdGseB;uqacn`FOOXJeeGMB z7a27{)}B24^Z$R>%+p$i3=FQB_duufY5#J}yfE(pNca$|1OtOh=CxZ23=A&Jw_TV| zxiH`A7Ey6wKIp=H(S`Z23-fsw=If1zKt?-2Tt-yiV_6gggLmJv+g*bxH9juJR_jKHzu1dg2`aO^w+$IcOOm*Zt;FKAo^ z6gw)NzAT--PhQ$XV@Jq^f4>J4|Na0cQ1k@x?=LU{Mb9ImqDN^6N6!=F=wU&Q9u<7i z0}jy6rJ&&K3{3&;{&eYF3z~xK^mPHXLp+*uR5%#^8_e&IQ6oKyL8`n(Y~2^0+KNffHHX;q2{&(zU5pnFuWy52Ri}oYO4p#=pgMS1a8~=c6n=&!i)+d#$u0~H@^FW2_m>swL zckX3jbL~iF#bcPO_6NrfS4PK!{{$Ty|G^CV1~Tj$$S|-_9kb&$kYW6;9i=RI4g2ZX z;mYKA@V}sABWS$<1IT6nL5BSY83q=rV|LvBAJjSK@JRMik??Fjtl-*F%k0Da5|o?- z7{SShzx4!oMxqB?jDsc`W_W^nz;nQxJv|zafXaK&+6U0WFHn~jTJu9FpYA&zjc-8H z6rUaW^CJZK!%u=3837QL5jf^Iyj`c@c%uW#{c(FnhSs8l{82G zp8+7T{BLReUroDwnHWH7U!}S5e>LUtV`6aS5C0G1=-vlOx$u7#Edw$56Hlb^7d>Q2 z1MO`!;155U#-DkDKm0%%f8wDu{vy!Q{(2XcfHX(``~wh$F8rCl()jC3R20(q^S`F? zCw@-juLo^vaN*BC2eN^8FWBJxziIrLzti~tzDeUxJetOze?N`?tL#FMoC|;EoirEz z%%dPDJ_hMg^#qAKf@29PMLGf32h|EugNkO;_$0%`pDCqO}}0g~eX%6kDM z7A<5tTIl z{16p`H2!~I()fRcsDSr=d`;v3C)(u=j=z7O(j57Jy#jgX0m#hkgCNV#gWZz=vZF>N z0qi8uE(=HgqGwzn?;lR%FM0}h$G<;mF8tXaKn9(LIuNuaB>N@EsN--C9!}%`1@fc| z|F7R^{Qr14KrR695Gi^9HuWLM=(}nBMNhcW__H5?%)1H+fuhG?1xKLa08#(zBS^)W zH2&-xY5e&tDln^mq(Plo^c-Z)#WeoJUull~+27OnGY>)bkJPiMfZTQsl!riB>IftO zC4vMpZ-BPIu&98N&o^*(<4^pM#-I5kjX(cT8h_$Jko5mF{>+OYBhIDqC!Pi={hY?1 ze=m(c@kSbd<_A!Q`IQDr#;*MN@6-4*pMuoB0I366^#;T{0J0nugICk|6EA{vfaQOH zQtVk!+T`8t1b zSN`yCAj?1w$-fKEY(e z+wK6-uzU%M{(mYeY2b|a4^$}Cr+_jPH1&T>56aVDS@S?9 zIr9IynC8m=?_nB$eTqr|D3(DP(-E}2$(8@tsWkrj7*Jlwj{$F)`gb#pKcBY*V$MI% zZYWT$cH#ebGL8QqC_3vwx?Mo#xqx&QfD8nMHz+$g^8Y#tO6;Iaeh`$X1;G)a0J8rs zs8|4Pi2C@q@NZ{c}-q0BODjiblaS{(m6FMGpnjT={=}2jxU? ziS#jzKmRZ&PS2$A{{xk;AQKXxT0pA#vq34}1r*2sj;Fcsr-PPGfOd!R7d-%(dJbHy zIP&KoOXL4{6qKw4p}IjDf2F86`1VSJN{AE{a6$1kjsI5+INW~4sDPZB12P(1a6aM6uMxb$m0tr|1!+L49{%);;L<_?YSFKAj{F+MFFcY#6~z;f z^$$VBV?j`H^+XWl*T*2{Gmt>`IahuSa8(8pdJLAm0}6nLX|DX~k6rmSqGy1LEx|PY z?4xP?=^)>Owwxs#N#jp=nC8Nt0SbUSY5WN{()cqTfC~yo{tQsPmw(WeUn99AjX&WK zWarv7P7mf2Y5W6_n@QFCxiO69=*EakN^D#4VMQvc7qP+76%PVMt}w{6F|qc zHT?WvY!1=ieUX1#k0ofg5onE%I|~DYi8|3OGV8_1we!Xh%f*V4j>`` zL?nQSf|dg%IWFCkK~8nCzFsQ=3Qo6o;NXOc)%dt{cY}hq`@C!SK^N`oj+YO3^z!Tl zjfQtm(F8fV`;gKwEfEdL+B3 zRQU9=I5>761YOPd{eoln6p0;f3=G|;zF#yxQDNA6sZtEI#ZJ)pBxq!$!BP95^#%U9 z2Ve6Wp9C+>7x33wl)Tdxe4Yv&xWVUFFW9r?H0sB~X{aa0g8*qs7a znxj&{zyCORuZbi7{?q*HPoz0^@`L9?Tp$Spv=j}pbIJNGC@8=w!KHgP$QO>?hdmCy z5O?L@@8ikUrqxZun3xv{2@>)1d4}!Z$OrV^*DB4h9qVu z{%t%4pfs%Q(%lV;q3(mAd%F!mso2r_B!55X43^7}AW7Io`{YZ|H0Qxr0-n8XpmgiF z19XFoYxf0ffg*vl36B2{fYPhy|3lUS#h;)iIyV0h+KIGVa!twHBsFz(j!EOazykr1MtKA=( zpYfLp+kODeleB_vy>C7)@Ny9Y1H-`=EX+SVl8^sC&cAI9B$%wv)k=bbWBqGTaDWYR zu|8MJ>S}!Hb&yLpIJ5fn$|~Id_usYqQ1>~<%LiPv&p94^CGXM8vlWy~ow}z;f?VwQ z|CF2Z6iHCR>^}7U0@PKgY4nmuuLyWSjwAp6Lms`lC-43H@5H~KM+uZpoH}`|n*TfS z_gwz_|37%t{4PDdy8BS~DfBcCTI~Tz@Q&T* zpvfC-p-=Mhw960vA3ykugMa@CXZ~$13ZNXozyA{GXa`8PNOSBIaeO%oJrnGF333i* zCeQ$70u5-Ag=7LvcqW*@3c4sAo(W#pgL6PDdJf>jll~8aQZgw0yRb4aprn6i)jThRMmGJmi%8@gBE%9 zie_6gF}ze{VPNP!2RTp+bkkX9GbjzVek(}<UI3^ zvX+^FVJ~Pr+p+sx+U2L9g{q*lRQ{iUsD}Ef-%?0=3{)Q2#Sf*g|v4VNfLnsw}|yL=BqDQS!+N{{9RmP@Ctmi}t~n zO`yg|_i4{wa4vzjZ(O@CT5}YMLf5xBLfSW=`ho*gUw}&qP!os0MVJY6h}H@Iei0_* z{BrX0D`({?(?Ai2Ex$Ym-|ub)ghHC=rD-+#EX`%+=W!)tlRUI#>_ zXlf3w6ty&%7+!E0gDOSP>{0+|o+$xTDQ3VbMetzaVSM)!H}3?65rb#<2T#xihi`8b?Sm;n6Gl-xM5bU(}cwUR*JR zg&K|vlU=P()t~l7?p$03=fE~lT6XJhX@k^Qu+ByKd{^y@kd6h&+0e#2q(bK3)&g#< z@o)P8%5Uw3|NsAQIZ%@3VtozLPmp^A3LvnvU97Lw_(EF>-RE4p54&hzgVaN?2ACnp z0ib&5HMkx+4ecnnDbF#)tcPxaItsUaU@fuk%RbCkJr6!&b?n|E1@0)Edy%*YG`q>) za{C`>x9&Y~h2`2g2O>Qi+ypv(`H^Gy=@-XYA+7(7|Nj36^$GSL1}lcwY~TVmt&{)d zQjh|0PH+CfSSt+5#MTcHolV9XT}TPh%OlhY?h*BR{D(AbTQ5}#c6Wm;g&Cd3C=NFF zWxzkg@swvk?K?=TE)>$N1FdaHaOvIyzQx1%ZD)>(!w%3)4QPVg!ngZjr;Cb#Z}$t( z-OvG`gIhqW=pkomUStH#e%}DEbYBNrNm-*3z`@^A3li?!0zT0MvqvzWCzm(0f zn?(h5UFh*{dq@8DwG900fA}PS_v}9RB1s=Kpby@kDDBZJxNH6`3()cnGy~x9z@yhwq4}r+h~x3W zqnCxtx7WcTjsN1IH2#aH()e$)UNr@c7~bYR3#QW#r14*KypRSS+PUTl8Pz`k)_nn4 z*L<+*+q~1kG(^_}n64L|)(2}EJd%%kS|6*GfYq=3+kBiEJ9rE{{vYtPK34MqlqBr+ zK*4p-qkE4EsHx`B4Grw>E#Rg2&9>(hKwHtJK%vg!+HIra+U?5V+I_xT9Hd*z5)^HR z(G~=P?jZtQ%nnK)9H7%gCBRL8qZ4u)T6aHaovlY_Kga-369{ygDQFJ~NVxkoXnBT# zZ|k=b+2((YC5j%sqKU@fWKgHX#PA|cmyzLRDrk`z=sZ)pPv&<~32?MNQpW>chYH@(-2K3{GnD~U;Cq0U6Bx99E3xek=du1& zV&>cWtyHz!oyDd5m`gXmM>lA5kb-0LAC6M?7hCrK|NolxMeY%hzg~2f^MF_If;MAz zvwL(yj*S8xNdU67ld0RCrIQhK$&E3{N1Tqw*+H$p*Q(v_9FCpr;Df*q8-abdK#_^z zMS~6_!^?J1zUhup0pBPRqXUX!&?3(uD9hr72bgvDWgJLhuc(tD*noJD0rnsR+!z_4 z$7T!ZfL2h0^AqS0g$zZoN>h+ZQ5{Bx*Oe$|W=A@ME}S{%*=hG8&jfTH_BqGSd7xFD zj>o|V=7E-ZIvxWr3jF`#&h7vIZElnVdi09E)CU`TPl1Wy#XfD2d)q^=uNFxt2K{EM~~|Nn#B-F@T5BQ20mz}W*- za-px6?R8=VovG4&5wv902IX|73XvWE>lqkkI)49YeA31G0{^^&-3JfvU}*UN-}od* z)V1|w#dDCvT(ATvNgM{{Hvv#t3+Zn|%4EsUa+d%W=mY(;4I z&Et&~P|op22{;Q>KY{vQ-Qabitp_}gH-cJuAfe-pprth+7IaY;_^>E`*AvIVT_KP} z^KS5>%kJh74+e(L?i^5et5t{vbXW=_f9oaCrJl))BRm)wT#dhZ_nM@59DK&=!Ti~! zd*2>6(B4Pzsi}~)mPes$E&npRw!Y=>O8{LA0$FS631YtGmuK)u?%U!9>h??qExGha zZd(Id$=N%(!;FCeyvDM(+e3nF2WY!ch>C&7!3SI(%-}798XlPkCxG?< zb%GAw>oDbWb}1w$()?0Cj<7-vyAq z{QPd2NqGos$HG`J&f}#jKKnV(eaAd$@2@?Ltz{dYa#L@rbu%(}S{{8>&2wM92 zmA_}fKj@GUs2~ER70_gPwie`~Y*1=~T$G*d;MrY_d{K7%VdHP0-Hn!;r?@dN)a?QF zIAQecRZl#d7Zou$eb@38={ zzdi0^4e@G^IA{ZA2xzaVi;BnpL!i|%pilz`ku@afz~?3ZM@?Ix`l%V*pN6I_`|Bua zi@#m&-~a#gNMDZskGfbxV!ek8bRo|%Q2MY2rw{&~7k~f%e>wRtc-cOGYZJIc*bGVo z#^3yVRmwaMK4Eq2ULyl44qUtU$be2!Za&HmDiRLt12bsVb@Oh}Xd{D1@(IuG78&p|?_Lp)Qf05?7G+T6f=dNR z+`4w3gXVPiPyheFHu6gDQHCU~Zg6SRebA@38B~~nN)J#PfutIb?$bWZ2VOA0h9rqX zCI$vV@v{6XTD-LVp-;U0KW_b(zvl)xMjSyYZ|}eV|6g+a`TyV5_=$_v&)$^+%xfh)MdJ(x7l<$3#4UFG<_nMSJi*?I&pd85G zR|gs=mv><3ZUg0CQX@J9YHrJ_JR%`JLB4Yj(>e0NICOa{`Gy}C_K-65Vmx_ z4HkJ=3+E{xAi)nhpA=%p|Krv_Y8L!IY7KTlO`Auzi;4$$S^EJNa87cuhWG=#{GCvg zeYuPlWtV@^C(0cEA9t~aL_kkHxUfFrVhxF?9?;cEFTH;K|8IQYrN=LDFAdZlKr{uy zJwPMw-GvH1y{dgQs27Rphy-n(&_=ZdM(ia((nc~iaolE6&yP3 zJpLbh83j5Ov}HCU14H9~Inenaz4Jk9FuR=vJd%&QcF$?q6Uofr*uAI4CX$)Kwe@z1 zk*oFLS{{(q_2)s|duM^}Uw}fH9SDar`3Wt zKY1H?XrJ>)KJH#-(Oz;`~N>k_B>dY5wzX5gU#drG0>^X?_cf&mE_eT3?7}u3MI15)dB*w z;vT)CpCG;P{~}BbFYe2O+Uc)ZcYxZgpiLwmpbnG+bnL7Ie*RDl+HNSw_?ZB5FS2)y zO2C`{|95N(aiw3XYsKp50Ym-OjfyMUj8!PV#q=y(FqrO_!W zj@`dNw_Q{iUjm(_kO5lBUEtIG^O%c@1A|NVqqI&J6&IK8PaQ5QZk-`2A)O&A0i7W# z5yxFrJU|Zb3{gqw3{gqx3{i>kZ9Q3{+qhRignqe zV&B>S{|`PB@aR6x{Ncq$sPK;$%R$1=1$ued8-E75czE)+mw@(dwfq5PlAoSV>CXHu zkHPE^M;FhMw8oz9UZ zOHfI_%|*qb7xEUB4LEUc${`L%R28Qk$l@OO+6FYD-2(+ut z)%r`BlWXgfQgO#U3<9A0`o6gEyFUXp%>qDjyspeoT&=&9{{V}4cKdTUc3*k18003< zn7}+Pu!A^!x}WLicu$)K(#=)R}q z|32NvU)&q;kHIzwc7pe<@J~6|da^XbqgRwm3EY1a z7h+;~@m&U#&ON$&!HLlL%nMz4kZE&NeuywIfUay7VPF7FnSw`$!6#gRZTCq2=h4d| z4&4h=z6yNAz?l~TAg3^b-3vO3y1=D7MI``qR7VKtD36Gjt63R9_s_+E(&o$Apur7r z478;G2h|9jE-D_)|9JUZL5oE}$*S-)Bw77x4@(q7KVz_3$LuTOi}@b;CmVD9%?zs-}(u( z$QV=09z0t1BedWN#VQ;oK)1?tx~L?8uMjQ#`~QD8ck4<1mh``%YQviabTvv#)ZhRA zjW2-~p*Vd1=+N@5)WrA_=+w=FFPOT|H$P+o9hT92k`Xj}`Tc`Sr!$A6^+EpT0MN-5 zy`ul*m>6El|NZ~};0vbX&fp_;K+;XDfB*k~sl&{`(D>6e#3z8i~3HA#rDJg@N z0}ucF|Ifecp)7y%7Ip@P)^GeRznK^qDuq$=(aUF`J)od$TA~Np^`_ko%8=IQYC#*5 zKv`D%BWTl6_cael&ifxM@p2kfk50E>9K{GA#koGTh zlM+&5N7|Ezd_MAJDWtT4tcJ2f9u-c|Nnza%404nj*R>*``8#5j1Pd5YxjrlAEj2HQz*7T4ts>UulYYS ze=q3H3s3^>JO2NFT4zh`1bzmF|HnW_NEdU|+<6J=Vu5s4ff`<54WRRQKpJ9?|Nrlq z?62U_E6OCp#K6Dp!2e_X+e8HU*B|O|v2lT#aQY?a=1pk4a{m7RzwsXfXt!(1WfpK|E9>kd$f|KcNbR)`O@fT7!UMR)B2?b;Qdo$dml zy1Av~CumI4pW{V<7$ZZsk4lDbXE{f=GlvWRwh|QwmtGG>N9&WNe9b?ZOE_IyzVWw! z7B9K*Z%a{ebZvQ3%Iwm8qT59!!KM3nw~tB+Xd0)}2Xsm6d6!Oa9>;EX1<&qq0no7d zixZn5Eg2@zez2A&{4K2DJF)n?9a%uvBY_HA&u)JS{#MWc1*nz=UBTsQe5tvbhpE)c zg@1c1D7|)H0QCpcTr5HDOO_p=4IXKZ{4R&mIvpV=H#~U>S`h+q;mbr&uVDMsDg24kpJAFDBpKAZGCS5YJxD2AO56 z1~Ry$totKey%XqM5ztM8RZJ}hN*rCf54d!naOB_S#Atje^8nam7hgCsA8`Es(fE>M zhZAGwL9ifH#HIU2=5d6;Yfyr@3Azp2v4hFABZ|qh`4Edo^E<}UDX(R^L0A5QtU`7l z3&efkG$jQp=Uh}W9Qn6>>n!HzEaqwc!Cb@I>CDsp0d(zC1p|L8sATZ$X7}u_mvHGW zU~%DJZvZMWIzXq3Se09~H?NSukGgLTReCI--D zL;@YGT~H=R2W!I*CWe>azx@Ay+!?$h7Gn07FaQ7dIx@oTdh+G}e+STg^$OjN0v_Er zT|np0pKxq`%w8hnXnnYrNLB(CBTQT z^KWyOaQuIug9&tIlVh*rkAp8cI=v-ax=*wosDISyEC8Acv}irR-?18$$C6KYH2-9& zRr3LjaC9?!S|5O&HUKHPnL9#2)1wDLs%jpBN(0ax+%77Hpj)?%!MCL|A2|4s10-X_ ze8RE&fGMbKvOZDj?*ZC~_``$wyoa?nN4bMXcd&wIFN=VOwX;DPcmSeL9^BQo^yn4_ zcd5Mm2rqf;$tZSeY1JtP%kA9col8j1PcTl|YUp zhlC$!(d4C)T90l{kM3X&&<)99kQXdk-x0(AcrOZEYI7wZG1JdWQEDU`A~Hvi-(0nMgsL7Zd`a+0_J zIE^+RQHVZld;k>A1|FTx0-etA`DW1gg(GP30r-@A*j)pT-4`GS_Pc|QxyN;8ze}$Z zM>qJs0r;8y;42FxVa8m3;Mje^#rj0iUJp=Yb~1y;qJCX`)%={%@&Ad=U4BSfbNep!p#)=n$yWFC_l{|NlA|RIz3?|70vR1s!AWxC30r1$6*_2Xw^c=1w-fdMky_I?hiVl4spJ(S;o*%F{} znCbsOdAvr&0FsKp(E&rG10H4C}(Gk3k+@t%n zOZO|+?(Z+W_Wu9h{iFE@H-FD2R(LxH+F%2X4;nD=xAcQ$PQSRz4_ATG#cTM1A{H3$0-9= zNo1qZ4~KIgeWi=NPXAZ_0W}<2Z-7QZelhX4oQGVV-Wkl%eX8|RiLys;+Y99TJAFDG zUig5nka0-x)IL}Gp*xtP*NLT<#mV{yf9oU`1_qbTHqZs6uH6s1y+L(&Uj(R;-K*Qp z2g=F&K%?EDb`5Mk3|@YN&qct~?Q7=49TMx%3yt=lz6J@4o_)y`Bl+M$SXfeQprNuH8pK@$A@reCGGc zKcH)6OF&CgyN}KMZVBS0fq4H9cr+hOaJ4>Ia~-rk>TCne$#grjfUbl+;Q0MR zXB%kprn#DffxpijoCKls>FzI#FLnFBaqK?8zn&SS`ncow@5Yxp*}D&dM)g1<#~ivRXTyuhY99(=&;(&^5@zrGJ-rcY{&cTPwo&G$opvsjEw4&-He+Q`f zhI~Ei0sj8ipz${T^`HgK{GbNfAx_XCJMJ>zehH{q=h1wC-=q1#2ais7k!HvtO(kXB z{v6#0UAo)&mtuCA{EmG>}7(>w`geZnmDR z@NWG1|NnpcdgopiPTLRv|JT=Bf^14Y@xmVB1QpONf0{_vn}E(aI-X#i&B5Pu0XF~r z@*HT@YG*p=Y_#luj0_&VycYi$8D2yIKlftd_W%E1E`g|&@#qzGgs9{L zseH%5$ngItXlfF)dj)!zVfSCqc`ML^hjwv*8imR}oyk8C2M;X;3np{;bS5L+WY`Z8 zMLKxsHRyb-L|!I_*ODH+q81>AfJd+Bbsi=L&?UQ~eLSGThqw7JBg2bi4se~_9Rs>O zDn|vpcOwDRpnwlVB5z;=)fYI{lYkD?@aSee^qvWF7`BT_fk*ep?pxib8ef8rci?Yn z2bB;n#ra$OK?5=`nfO~|L5!bDkZW~&n-oBYa{b^h<7xZ_N;dqh&Y+bS-Fz>uZu|eg z`vvII(;frRPLQ`ujlV%F4)|L^ht4(sW##VyUDobu{MM(}_Qz__Le{^IAQ1*)4#vrb zp0}fq7*#~6tw3d}lU0xX6wrPz(1E`$ps^DdP#5JtYt7u|x2&KV3Up^I=nBcJ$J;=w zo4|eWzx)gg;7a(VH>m#l{SGwv-6{+k(*MiD-@^r&G4<)Sbs^Wy)f~9XOpu!mVnMTC zM;-Z*+{^}YGaJawo#2Te&`26+Pz_p%7xQ@hKL8y~doAh$I{prP$rb2?4UhkjshpmXFv=f$nx^8Y_*K}m1IKk(se7r+}HY+tNI>?a^4 zIVj+D_rdNL%@6nwzGZ3t%gEn83zW2fF!Q%hWCqnfA3VGNdLDenHo>D?uJvsRxUny| z<^TWg6R$l8)WP8J28SEy)@rC?jO56_?IdWgnLTK!yvP6Jp3KM6I(yu}Yn+<@JJfWv zzTN4_z`(ErRJ`!Jo^a8A2nvz@zo7a2ouJXtZoU@{n?WnbTwtLEy21kFUYG8lP+MW? z0rwF8UqtH*!-+2Z+djH>zjJJU#_xFWEsG;KoItl(GXnk83MmWKNPc{Qb_)P9XZ^Qk4e03S zxBM-j?IE5ApL6;2P6I7K@nyd5**gd9FqiI|@bL`hG{;UZoB#aHpjD7={M&jIKn``{ z-?m4=Lmt#>cnOZ2hx{dlPQ5Jrpvwp|KpSBXJ6?VO&R&j<4?r{a;L8aewNE-;{^8i` z`5)9@J5Vd)*nJYbApG(puv+ayF3blUdmBJ?0r)hUa;Y@OgAZ8JTtGW6Knz#rgJ~|z z$J1OpnT$_5{y*&T|FCECAtuMh-=Kq@_H1^6K%#{P|NO#BX~ou zBmb16j@?H=hv^o8)}Os*hO9pW*@$!fnMbeaY*uiUH{ly2!;1n&P?h(3_Zi6iF?2ly zWG%!`k8aKvX&XRAn>^@_R>%aL^<>b{8z?PuffihKf<=*s_rHKrGo+o15q13APJ&io z8h}<+SakM-7RNOIWaMuu23LM8{OzFot~|QgtvxvS`{O_>D_DHl7#J8pBmSV85>%;e z2d#eskB`d}ojDWmxXGhio`2g%qKy*8YZSZjB^Ul}CtZyXbbD~Lo~)Dh=xtvBT9hZx zU};do`~Q$9s9}2`!TMs&d+Uq*Exn8k4Bp`F(I-6)K43lglBKi90<_wy`6n}fJ7~TV zJVMdgV*y%U

      r9tv+__6#IYFv-uc{^?Fbs^7p(0cXWvl5kFAF7e_3CL*!s*yNL(9 zwj!eZ1J|F}b1ck2&^8{T19}Y}1G}e#+{VA{VD|}7&GV9_c|Uk5ZD&7d3s7e}Xm>_Q zK=UvAdKs7Qc96A>%|Gnx`5mn<)N?ied`CO#{|v{&7VQ-zki@PB+#M@ z3(%qq@Nsw!puI}qlknmXw_Yke+j_F}Wb1*_qsPIf+Jh<7aIn_H@u{QO4<@Sw@e}`5>Xz1En&Z?gk#c?v~K?+sBw0 zKFrZErYG^U;_2g2(?u;IZ2qp52EJpYdpZ!@<9e$*22P2cr+@F3q2e zrQ98kj2_*fgCIE$^KWC~-xkCOZuT}GVghYimhepe*vsR`4DK8k7)A& zrh_k-Ivg20z+uoGqaqP^xYvUTG?*uF@FkN+_dmxDZja`FjCH}D+BbZAJs3UypZDzz zW&*DlbL8K~>DwE`>y&k|mj5Cv?wffPxKtOSfaM+yCYVKluAVTlCZT^K}E6m>7I}1HhwU z5Tc^uOC6YhYfSAL}N|GbgLU-*FubmYii&{;>9!H1LZ z7yn`cAM(O~aI~y0A+Fs&`_#p z@=4$Bd;Hs2B>A`T7=k0oxtE92Bl)6ZuP38xFN*`HE^=;c4mks!4-xR_Wi?&}nlL-)(b)*v zb>Y#=YE=LKzei_d1*p33WqtAs%xmxf-P#Op%JMJb-}OkUSj(fAReZz$|DK%

      q@m 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

      (OXCBlf`p9yIE8`dU-lM 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 diff --git a/vendor/sdl3/image/SDL3_image.lib b/vendor/sdl3/image/SDL3_image.lib index 4e9913b4c9606f22791723314bc8b242916a7c5c..7db2f734a43ecd93afafc9571ce696a6385c981a 100644 GIT binary patch literal 23232 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 delta 2358 zcmX@GmGM>D1dDnjGZPC1Fi7BHU|^_ZU=X!pU=S~0V31hFz@Xg&!7Be47(iI6hJgWu z)fX@@fUxos1_lsT>0w|1V-W@h6%hso=@1B(abREoVd-NG3?MAU#lQf<+CLZ=Kv=5& z2?K-F69xv2KM<^$!N35*x(gT>Kv?Gt0|OW*F)-*PF)+xLL9nb60|N-lY++ykVO=u@ z1`w9xU|;}Y*$E5`Agss5zyQK>PZ$_LSn~!00|;xmFff2{y0K$ex7#KiU z^%(;L80RrCsOB*+80kTpm#48}|ltZu}> zpl%c&@97)h9~3f~Q{G_m9%iS>nkwRxy;%e&|6?|v+$YUGIfbQWGMg0N zRcX=5y{vqb9aID-akFf85e{OkH!?GYCpJ3<1_mop28IH028LA<3=BQm3=IEN7#M1# z7#J3)GcYVsW?<-1VPFtZVPFW6W?*oTVPH5W&A`AV#lY}Gn}Okp6a&K_4F-k`O$LSq zx(p0wbQlAqlo%MI3>g^Alo=R~7&0(CQ)OVtQ)OV#Gh$!}Q)6J5VZ^|2 zM2&%gM}vW(L8G35fytPG!AKpP&lva^*cb#DxEXjEco-xY#2KU+q!`2)WEm70lo?bR z)ETrHbQ$y+3>XXxEMGYSQ*S1Oc^W~tQhPV*cq%DY#0O?gc#%)MF)gc)QQ6d05kR2bA4v>0?4^caj7Oc>1T87vuW85kLu=x;UHW*KG%Pha2NaKPzOAIfH2Dk<$K+yF;mJ!?g(k05^O{_#F1mT1 zdI2M6NNm;@Aw~uUj>*2-(vyueC$h*goGYDtTr-yGTtR%THdU1J!G;s|}J((aoA1WiBGD@&3UTMFtRH0ei)* zD0T8iPw&b1+(bCd9Kw!BFfcGMPBu67ne6W@%=u}N$}M>Y1_q|d?B?m*d_MYjKzf-O zSSB+{2~X}Z58;edD!Hr4z`(#V`K5WG$m3URFI5;A7+4t~rh^0Opry>@4R$V^Y>V!^ zmt$aHV4Hm1B9*h*;`tR2kA1SMWh%Fid&xm{1_lNW2A0VQQj(L;S%z@V-uCzpNCoF) zZL6Tk{8qx8HcGpnfke0_|F%x${9d&0B#6g7InySU^Vsf|OCTQ4A(6=+>_a#OEq8ncsSug$>yXOXv?csM zh$lLEw?iuD0oU)BL4hYWS<^9{bJHQ_8z3KwPoC+R&*}A7=bI7(1B1k5L8nZShlg$) zRbXIXkVFnP1#6GV2LeU7)Ap}@roq6#AjQBk`GU06WPaxmj=z4_KqgC1&UQ}ce7)z~ zYmlunlW#kxa>{LZe;dS;o$Tq7%K7-=uhX&&3=DFUx4WbYKYwuHy)**@gFM2X$&40} zoV_-jmqF2{FnOYDHm5_#^7lFn3=E2sC%TGH65*Vz>SjOL%tM5eW#_t!G7Jn1N|S>< z{3rW4i*V-n)tm-7M0v8gXYk|zZxM0*gG$dqR;WO&0A&uZ0QboYy+S#c=YIkRmg?mD zeyN=CEEC^?RH{w(^-t!!vCaE8$l2DKM9wckeg8l_oyj*t5=GakZUpmm zq3+2n_H_22EEp2X8C)TG9i&cg^4icu&Xpcce?UC_$>L#&obk%_e?dHh$&F!&oJzI6 z&prH~df@^nw_3qXj0j^0cJVQe&&*9sPt{Aw$zcEh@We6~ diff --git a/vendor/sdl3/image/include/SDL_image.h b/vendor/sdl3/image/include/SDL_image.h index 60d041fe6..19d9f2e02 100644 --- a/vendor/sdl3/image/include/SDL_image.h +++ b/vendor/sdl3/image/include/SDL_image.h @@ -1,6 +1,6 @@ /* SDL_image: An example image loading library for use with SDL - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -44,8 +44,8 @@ extern "C" { * Printable format: "%d.%d.%d", MAJOR, MINOR, MICRO */ #define SDL_IMAGE_MAJOR_VERSION 3 -#define SDL_IMAGE_MINOR_VERSION 2 -#define SDL_IMAGE_MICRO_VERSION 4 +#define SDL_IMAGE_MINOR_VERSION 4 +#define SDL_IMAGE_MICRO_VERSION 0 /** * This is the version number macro for the current SDL_image version. @@ -70,6 +70,103 @@ extern "C" { */ extern SDL_DECLSPEC int SDLCALL IMG_Version(void); +/** + * Load an image from a filesystem path into a software surface. + * + * An SDL_Surface is a buffer of pixels in memory accessible by the CPU. Use + * this if you plan to hand the data to something else or manipulate it + * further in code. + * + * There are no guarantees about what format the new SDL_Surface data will be; + * in many cases, SDL_image will attempt to supply a surface that exactly + * matches the provided image, but in others it might have to convert (either + * because the image is in a format that SDL doesn't directly support or + * because it's compressed data that could reasonably uncompress to various + * formats and SDL_image had to pick one). You can inspect an SDL_Surface for + * its specifics, and use SDL_ConvertSurface to then migrate to any supported + * format. + * + * If the image format supports a transparent pixel, SDL will set the colorkey + * for the surface. You can enable RLE acceleration on the surface afterwards + * by calling: SDL_SetSurfaceColorKey(image, SDL_RLEACCEL, + * image->format->colorkey); + * + * There is a separate function to read files from an SDL_IOStream, if you + * need an i/o abstraction to provide data from anywhere instead of a simple + * filesystem read; that function is IMG_Load_IO(). + * + * If you are using SDL's 2D rendering API, there is an equivalent call to + * load images directly into an SDL_Texture for use by the GPU without using a + * software surface: call IMG_LoadTexture() instead. + * + * When done with the returned surface, the app should dispose of it with a + * call to + * [SDL_DestroySurface](https://wiki.libsdl.org/SDL3/SDL_DestroySurface) + * (). + * + * \param file a path on the filesystem to load an image from. + * \returns a new SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadTyped_IO + * \sa IMG_Load_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_Load(const char *file); + +/** + * Load an image from an SDL data source into a software surface. + * + * An SDL_Surface is a buffer of pixels in memory accessible by the CPU. Use + * this if you plan to hand the data to something else or manipulate it + * further in code. + * + * There are no guarantees about what format the new SDL_Surface data will be; + * in many cases, SDL_image will attempt to supply a surface that exactly + * matches the provided image, but in others it might have to convert (either + * because the image is in a format that SDL doesn't directly support or + * because it's compressed data that could reasonably uncompress to various + * formats and SDL_image had to pick one). You can inspect an SDL_Surface for + * its specifics, and use SDL_ConvertSurface to then migrate to any supported + * format. + * + * If the image format supports a transparent pixel, SDL will set the colorkey + * for the surface. You can enable RLE acceleration on the surface afterwards + * by calling: SDL_SetSurfaceColorKey(image, SDL_RLEACCEL, + * image->format->colorkey); + * + * If `closeio` is true, `src` will be closed before returning, whether this + * function succeeds or not. SDL_image reads everything it needs from `src` + * during this call in any case. + * + * There is a separate function to read files from disk without having to deal + * with SDL_IOStream: `IMG_Load("filename.jpg")` will call this function and + * manage those details for you, determining the file type from the filename's + * extension. + * + * There is also IMG_LoadTyped_IO(), which is equivalent to this function + * except a file extension (like "BMP", "JPG", etc) can be specified, in case + * SDL_image cannot autodetect the file format. + * + * If you are using SDL's 2D rendering API, there is an equivalent call to + * load images directly into an SDL_Texture for use by the GPU without using a + * software surface: call IMG_LoadTexture_IO() instead. + * + * When done with the returned surface, the app should dispose of it with a + * call to SDL_DestroySurface(). + * + * \param src an SDL_IOStream that data will be read from. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \returns a new SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_Load + * \sa IMG_LoadTyped_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_Load_IO(SDL_IOStream *src, bool closeio); + /** * Load an image from an SDL data source into a software surface. * @@ -128,111 +225,11 @@ extern SDL_DECLSPEC int SDLCALL IMG_Version(void); * * \sa IMG_Load * \sa IMG_Load_IO - * \sa SDL_DestroySurface */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadTyped_IO(SDL_IOStream *src, bool closeio, const char *type); /** - * Load an image from a filesystem path into a software surface. - * - * An SDL_Surface is a buffer of pixels in memory accessible by the CPU. Use - * this if you plan to hand the data to something else or manipulate it - * further in code. - * - * There are no guarantees about what format the new SDL_Surface data will be; - * in many cases, SDL_image will attempt to supply a surface that exactly - * matches the provided image, but in others it might have to convert (either - * because the image is in a format that SDL doesn't directly support or - * because it's compressed data that could reasonably uncompress to various - * formats and SDL_image had to pick one). You can inspect an SDL_Surface for - * its specifics, and use SDL_ConvertSurface to then migrate to any supported - * format. - * - * If the image format supports a transparent pixel, SDL will set the colorkey - * for the surface. You can enable RLE acceleration on the surface afterwards - * by calling: SDL_SetSurfaceColorKey(image, SDL_RLEACCEL, - * image->format->colorkey); - * - * There is a separate function to read files from an SDL_IOStream, if you - * need an i/o abstraction to provide data from anywhere instead of a simple - * filesystem read; that function is IMG_Load_IO(). - * - * If you are using SDL's 2D rendering API, there is an equivalent call to - * load images directly into an SDL_Texture for use by the GPU without using a - * software surface: call IMG_LoadTexture() instead. - * - * When done with the returned surface, the app should dispose of it with a - * call to - * [SDL_DestroySurface](https://wiki.libsdl.org/SDL3/SDL_DestroySurface) - * (). - * - * \param file a path on the filesystem to load an image from. - * \returns a new SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_LoadTyped_IO - * \sa IMG_Load_IO - * \sa SDL_DestroySurface - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_Load(const char *file); - -/** - * Load an image from an SDL data source into a software surface. - * - * An SDL_Surface is a buffer of pixels in memory accessible by the CPU. Use - * this if you plan to hand the data to something else or manipulate it - * further in code. - * - * There are no guarantees about what format the new SDL_Surface data will be; - * in many cases, SDL_image will attempt to supply a surface that exactly - * matches the provided image, but in others it might have to convert (either - * because the image is in a format that SDL doesn't directly support or - * because it's compressed data that could reasonably uncompress to various - * formats and SDL_image had to pick one). You can inspect an SDL_Surface for - * its specifics, and use SDL_ConvertSurface to then migrate to any supported - * format. - * - * If the image format supports a transparent pixel, SDL will set the colorkey - * for the surface. You can enable RLE acceleration on the surface afterwards - * by calling: SDL_SetSurfaceColorKey(image, SDL_RLEACCEL, - * image->format->colorkey); - * - * If `closeio` is true, `src` will be closed before returning, whether this - * function succeeds or not. SDL_image reads everything it needs from `src` - * during this call in any case. - * - * There is a separate function to read files from disk without having to deal - * with SDL_IOStream: `IMG_Load("filename.jpg")` will call this function and - * manage those details for you, determining the file type from the filename's - * extension. - * - * There is also IMG_LoadTyped_IO(), which is equivalent to this function - * except a file extension (like "BMP", "JPG", etc) can be specified, in case - * SDL_image cannot autodetect the file format. - * - * If you are using SDL's 2D rendering API, there is an equivalent call to - * load images directly into an SDL_Texture for use by the GPU without using a - * software surface: call IMG_LoadTexture_IO() instead. - * - * When done with the returned surface, the app should dispose of it with a - * call to SDL_DestroySurface(). - * - * \param src an SDL_IOStream that data will be read from. - * \param closeio true to close/free the SDL_IOStream before returning, false - * to leave it open. - * \returns a new SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_Load - * \sa IMG_LoadTyped_IO - * \sa SDL_DestroySurface - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_Load_IO(SDL_IOStream *src, bool closeio); - -/** - * Load an image from a filesystem path into a GPU texture. + * Load an image from a filesystem path into a texture. * * An SDL_Texture represents an image in GPU memory, usable by SDL's 2D Render * API. This can be significantly more efficient than using a CPU-bound @@ -255,7 +252,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_Load_IO(SDL_IOStream *src, bool cl * When done with the returned texture, the app should dispose of it with a * call to SDL_DestroyTexture(). * - * \param renderer the SDL_Renderer to use to create the GPU texture. + * \param renderer the SDL_Renderer to use to create the texture. * \param file a path on the filesystem to load an image from. * \returns a new texture, or NULL on error. * @@ -267,7 +264,7 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_Load_IO(SDL_IOStream *src, bool cl extern SDL_DECLSPEC SDL_Texture * SDLCALL IMG_LoadTexture(SDL_Renderer *renderer, const char *file); /** - * Load an image from an SDL data source into a GPU texture. + * Load an image from an SDL data source into a texture. * * An SDL_Texture represents an image in GPU memory, usable by SDL's 2D Render * API. This can be significantly more efficient than using a CPU-bound @@ -299,7 +296,7 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL IMG_LoadTexture(SDL_Renderer *renderer * When done with the returned texture, the app should dispose of it with a * call to SDL_DestroyTexture(). * - * \param renderer the SDL_Renderer to use to create the GPU texture. + * \param renderer the SDL_Renderer to use to create the texture. * \param src an SDL_IOStream that data will be read from. * \param closeio true to close/free the SDL_IOStream before returning, false * to leave it open. @@ -309,12 +306,11 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL IMG_LoadTexture(SDL_Renderer *renderer * * \sa IMG_LoadTexture * \sa IMG_LoadTextureTyped_IO - * \sa SDL_DestroyTexture */ extern SDL_DECLSPEC SDL_Texture * SDLCALL IMG_LoadTexture_IO(SDL_Renderer *renderer, SDL_IOStream *src, bool closeio); /** - * Load an image from an SDL data source into a GPU texture. + * Load an image from an SDL data source into a texture. * * An SDL_Texture represents an image in GPU memory, usable by SDL's 2D Render * API. This can be significantly more efficient than using a CPU-bound @@ -352,7 +348,7 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL IMG_LoadTexture_IO(SDL_Renderer *rende * When done with the returned texture, the app should dispose of it with a * call to SDL_DestroyTexture(). * - * \param renderer the SDL_Renderer to use to create the GPU texture. + * \param renderer the SDL_Renderer to use to create the texture. * \param src an SDL_IOStream that data will be read from. * \param closeio true to close/free the SDL_IOStream before returning, false * to leave it open. @@ -364,10 +360,194 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL IMG_LoadTexture_IO(SDL_Renderer *rende * * \sa IMG_LoadTexture * \sa IMG_LoadTexture_IO - * \sa SDL_DestroyTexture */ extern SDL_DECLSPEC SDL_Texture * SDLCALL IMG_LoadTextureTyped_IO(SDL_Renderer *renderer, SDL_IOStream *src, bool closeio, const char *type); +/** + * Load an image from a filesystem path into a GPU texture. + * + * An SDL_GPUTexture represents an image in GPU memory, usable by SDL's GPU + * API. Regardless of the source format of the image, this function will + * create a GPU texture with the format SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM + * with no mip levels. It can be bound as a sampled texture from a graphics or + * compute pipeline and as a a readonly storage texture in a compute pipeline. + * + * There is a separate function to read files from an SDL_IOStream, if you + * need an i/o abstraction to provide data from anywhere instead of a simple + * filesystem read; that function is IMG_LoadGPUTexture_IO(). + * + * When done with the returned texture, the app should dispose of it with a + * call to SDL_ReleaseGPUTexture(). + * + * \param device the SDL_GPUDevice to use to create the GPU texture. + * \param copy_pass the SDL_GPUCopyPass to use to upload the loaded image to + * the GPU texture. + * \param file a path on the filesystem to load an image from. + * \param width a pointer filled in with the width of the GPU texture. may be + * NULL. + * \param height a pointer filled in with the width of the GPU texture. may be + * NULL. + * \returns a new GPU texture, or NULL on error. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_LoadGPUTextureTyped_IO + * \sa IMG_LoadGPUTexture_IO + */ +extern SDL_DECLSPEC SDL_GPUTexture * SDLCALL IMG_LoadGPUTexture(SDL_GPUDevice *device, SDL_GPUCopyPass *copy_pass, const char *file, int *width, int *height); + +/** + * Load an image from an SDL data source into a GPU texture. + * + * An SDL_GPUTexture represents an image in GPU memory, usable by SDL's GPU + * API. Regardless of the source format of the image, this function will + * create a GPU texture with the format SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM + * with no mip levels. It can be bound as a sampled texture from a graphics or + * compute pipeline and as a a readonly storage texture in a compute pipeline. + * + * If `closeio` is true, `src` will be closed before returning, whether this + * function succeeds or not. SDL_image reads everything it needs from `src` + * during this call in any case. + * + * There is a separate function to read files from disk without having to deal + * with SDL_IOStream: `IMG_LoadGPUTexture(device, copy_pass, "filename.jpg", + * width, height) will call this function and manage those details for you, + * determining the file type from the filename's extension. + * + * There is also IMG_LoadGPUTextureTyped_IO(), which is equivalent to this + * function except a file extension (like "BMP", "JPG", etc) can be specified, + * in case SDL_image cannot autodetect the file format. + * + * When done with the returned texture, the app should dispose of it with a + * call to SDL_ReleaseGPUTexture(). + * + * \param device the SDL_GPUDevice to use to create the GPU texture. + * \param copy_pass the SDL_GPUCopyPass to use to upload the loaded image to + * the GPU texture. + * \param src an SDL_IOStream that data will be read from. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \param width a pointer filled in with the width of the GPU texture. may be + * NULL. + * \param height a pointer filled in with the width of the GPU texture. may be + * NULL. + * \returns a new GPU texture, or NULL on error. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_LoadGPUTexture + * \sa IMG_LoadGPUTextureTyped_IO + */ +extern SDL_DECLSPEC SDL_GPUTexture * SDLCALL IMG_LoadGPUTexture_IO(SDL_GPUDevice *device, SDL_GPUCopyPass *copy_pass, SDL_IOStream *src, bool closeio, int *width, int *height); + +/** + * Load an image from an SDL data source into a GPU texture. + * + * An SDL_GPUTexture represents an image in GPU memory, usable by SDL's GPU + * API. Regardless of the source format of the image, this function will + * create a GPU texture with the format SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM + * with no mip levels. It can be bound as a sampled texture from a graphics or + * compute pipeline and as a a readonly storage texture in a compute pipeline. + * + * If `closeio` is true, `src` will be closed before returning, whether this + * function succeeds or not. SDL_image reads everything it needs from `src` + * during this call in any case. + * + * Even though this function accepts a file type, SDL_image may still try + * other decoders that are capable of detecting file type from the contents of + * the image data, but may rely on the caller-provided type string for formats + * that it cannot autodetect. If `type` is NULL, SDL_image will rely solely on + * its ability to guess the format. + * + * There is a separate function to read files from disk without having to deal + * with SDL_IOStream: `IMG_LoadGPUTexture(device, copy_pass, "filename.jpg", + * width, height) will call this function and manage those details for you, + * determining the file type from the filename's extension. + * + * There is also IMG_LoadGPUTexture_IO(), which is equivalent to this function + * except that it will rely on SDL_image to determine what type of data it is + * loading, much like passing a NULL for type. + * + * When done with the returned texture, the app should dispose of it with a + * call to SDL_ReleaseGPUTexture(). + * + * \param device the SDL_GPUDevice to use to create the GPU texture. + * \param copy_pass the SDL_GPUCopyPass to use to upload the loaded image to + * the GPU texture. + * \param src an SDL_IOStream that data will be read from. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \param type a filename extension that represent this data ("BMP", "GIF", + * "PNG", etc). + * \param width a pointer filled in with the width of the GPU texture. may be + * NULL. + * \param height a pointer filled in with the width of the GPU texture. may be + * NULL. + * \returns a new GPU texture, or NULL on error. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_LoadGPUTexture + * \sa IMG_LoadGPUTexture_IO + */ +extern SDL_DECLSPEC SDL_GPUTexture * SDLCALL IMG_LoadGPUTextureTyped_IO(SDL_GPUDevice *device, SDL_GPUCopyPass *copy_pass, SDL_IOStream *src, bool closeio, const char *type, int *width, int *height); + +/** + * Get the image currently in the clipboard. + * + * When done with the returned surface, the app should dispose of it with a + * call to SDL_DestroySurface(). + * + * \returns a new SDL surface, or NULL if no supported image is available. + * + * \since This function is available since SDL_image 3.4.0. + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_GetClipboardImage(void); + +/** + * Detect ANI animated cursor data on a readable/seekable SDL_IOStream. + * + * This function attempts to determine if a file is a given filetype, reading + * the least amount possible from the SDL_IOStream (usually a few bytes). + * + * There is no distinction made between "not the filetype in question" and + * basic i/o errors. + * + * This function will always attempt to seek `src` back to where it started + * when this function was called, but it will not report any errors in doing + * so, but assuming seeking works, this means you can immediately use this + * with a different IMG_isTYPE function, or load the image without further + * seeking. + * + * You do not need to call this function to load data; SDL_image can work to + * determine file type in many cases in its standard load functions. + * + * \param src a seekable/readable SDL_IOStream to provide image data. + * \returns true if this is ANI animated cursor data, false otherwise. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_isAVIF + * \sa IMG_isBMP + * \sa IMG_isCUR + * \sa IMG_isGIF + * \sa IMG_isICO + * \sa IMG_isJPG + * \sa IMG_isJXL + * \sa IMG_isLBM + * \sa IMG_isPCX + * \sa IMG_isPNG + * \sa IMG_isPNM + * \sa IMG_isQOI + * \sa IMG_isSVG + * \sa IMG_isTIF + * \sa IMG_isWEBP + * \sa IMG_isXCF + * \sa IMG_isXPM + * \sa IMG_isXV + */ +extern SDL_DECLSPEC bool SDLCALL IMG_isANI(SDL_IOStream *src); + /** * Detect AVIF image data on a readable/seekable SDL_IOStream. * @@ -387,74 +567,31 @@ extern SDL_DECLSPEC SDL_Texture * SDLCALL IMG_LoadTextureTyped_IO(SDL_Renderer * * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is AVIF data, zero otherwise. + * \returns true if this is AVIF data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * - * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR + * \sa IMG_isANI * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isAVIF(SDL_IOStream *src); -/** - * Detect ICO image data on a readable/seekable SDL_IOStream. - * - * This function attempts to determine if a file is a given filetype, reading - * the least amount possible from the SDL_IOStream (usually a few bytes). - * - * There is no distinction made between "not the filetype in question" and - * basic i/o errors. - * - * This function will always attempt to seek `src` back to where it started - * when this function was called, but it will not report any errors in doing - * so, but assuming seeking works, this means you can immediately use this - * with a different IMG_isTYPE function, or load the image without further - * seeking. - * - * You do not need to call this function to load data; SDL_image can work to - * determine file type in many cases in its standard load functions. - * - * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is ICO data, zero otherwise. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_isAVIF - * \sa IMG_isCUR - * \sa IMG_isBMP - * \sa IMG_isGIF - * \sa IMG_isJPG - * \sa IMG_isJXL - * \sa IMG_isLBM - * \sa IMG_isPCX - * \sa IMG_isPNG - * \sa IMG_isPNM - * \sa IMG_isSVG - * \sa IMG_isQOI - * \sa IMG_isTIF - * \sa IMG_isXCF - * \sa IMG_isXPM - * \sa IMG_isXV - * \sa IMG_isWEBP - */ -extern SDL_DECLSPEC bool SDLCALL IMG_isICO(SDL_IOStream *src); - /** * Detect CUR image data on a readable/seekable SDL_IOStream. * @@ -474,27 +611,28 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isICO(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is CUR data, zero otherwise. + * \returns true if this is CUR data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO * \sa IMG_isBMP * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isCUR(SDL_IOStream *src); @@ -517,27 +655,28 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isCUR(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is BMP data, zero otherwise. + * \returns true if this is BMP data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isBMP(SDL_IOStream *src); @@ -560,30 +699,75 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isBMP(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is GIF data, zero otherwise. + * \returns true if this is GIF data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isGIF(SDL_IOStream *src); +/** + * Detect ICO image data on a readable/seekable SDL_IOStream. + * + * This function attempts to determine if a file is a given filetype, reading + * the least amount possible from the SDL_IOStream (usually a few bytes). + * + * There is no distinction made between "not the filetype in question" and + * basic i/o errors. + * + * This function will always attempt to seek `src` back to where it started + * when this function was called, but it will not report any errors in doing + * so, but assuming seeking works, this means you can immediately use this + * with a different IMG_isTYPE function, or load the image without further + * seeking. + * + * You do not need to call this function to load data; SDL_image can work to + * determine file type in many cases in its standard load functions. + * + * \param src a seekable/readable SDL_IOStream to provide image data. + * \returns true if this is ICO data, false otherwise. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_isANI + * \sa IMG_isAVIF + * \sa IMG_isBMP + * \sa IMG_isCUR + * \sa IMG_isGIF + * \sa IMG_isJPG + * \sa IMG_isJXL + * \sa IMG_isLBM + * \sa IMG_isPCX + * \sa IMG_isPNG + * \sa IMG_isPNM + * \sa IMG_isQOI + * \sa IMG_isSVG + * \sa IMG_isTIF + * \sa IMG_isWEBP + * \sa IMG_isXCF + * \sa IMG_isXPM + * \sa IMG_isXV + */ +extern SDL_DECLSPEC bool SDLCALL IMG_isICO(SDL_IOStream *src); + /** * Detect JPG image data on a readable/seekable SDL_IOStream. * @@ -603,27 +787,28 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isGIF(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is JPG data, zero otherwise. + * \returns true if this is JPG data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isJPG(SDL_IOStream *src); @@ -646,27 +831,28 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isJPG(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is JXL data, zero otherwise. + * \returns true if this is JXL data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isJXL(SDL_IOStream *src); @@ -689,27 +875,28 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isJXL(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is LBM data, zero otherwise. + * \returns true if this is LBM data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isLBM(SDL_IOStream *src); @@ -732,27 +919,28 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isLBM(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is PCX data, zero otherwise. + * \returns true if this is PCX data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isPCX(SDL_IOStream *src); @@ -775,27 +963,28 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isPCX(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is PNG data, zero otherwise. + * \returns true if this is PNG data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isPNG(SDL_IOStream *src); @@ -818,73 +1007,31 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isPNG(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is PNM data, zero otherwise. + * \returns true if this is PNM data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isPNM(SDL_IOStream *src); -/** - * Detect SVG image data on a readable/seekable SDL_IOStream. - * - * This function attempts to determine if a file is a given filetype, reading - * the least amount possible from the SDL_IOStream (usually a few bytes). - * - * There is no distinction made between "not the filetype in question" and - * basic i/o errors. - * - * This function will always attempt to seek `src` back to where it started - * when this function was called, but it will not report any errors in doing - * so, but assuming seeking works, this means you can immediately use this - * with a different IMG_isTYPE function, or load the image without further - * seeking. - * - * You do not need to call this function to load data; SDL_image can work to - * determine file type in many cases in its standard load functions. - * - * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is SVG data, zero otherwise. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR - * \sa IMG_isBMP - * \sa IMG_isGIF - * \sa IMG_isJPG - * \sa IMG_isJXL - * \sa IMG_isLBM - * \sa IMG_isPCX - * \sa IMG_isPNG - * \sa IMG_isPNM - * \sa IMG_isQOI - * \sa IMG_isTIF - * \sa IMG_isXCF - * \sa IMG_isXPM - * \sa IMG_isXV - * \sa IMG_isWEBP - */ -extern SDL_DECLSPEC bool SDLCALL IMG_isSVG(SDL_IOStream *src); - /** * Detect QOI image data on a readable/seekable SDL_IOStream. * @@ -904,15 +1051,16 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isSVG(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is QOI data, zero otherwise. + * \returns true if this is QOI data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM @@ -921,13 +1069,57 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isSVG(SDL_IOStream *src); * \sa IMG_isPNM * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isQOI(SDL_IOStream *src); +/** + * Detect SVG image data on a readable/seekable SDL_IOStream. + * + * This function attempts to determine if a file is a given filetype, reading + * the least amount possible from the SDL_IOStream (usually a few bytes). + * + * There is no distinction made between "not the filetype in question" and + * basic i/o errors. + * + * This function will always attempt to seek `src` back to where it started + * when this function was called, but it will not report any errors in doing + * so, but assuming seeking works, this means you can immediately use this + * with a different IMG_isTYPE function, or load the image without further + * seeking. + * + * You do not need to call this function to load data; SDL_image can work to + * determine file type in many cases in its standard load functions. + * + * \param src a seekable/readable SDL_IOStream to provide image data. + * \returns true if this is SVG data, false otherwise. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_isANI + * \sa IMG_isAVIF + * \sa IMG_isBMP + * \sa IMG_isCUR + * \sa IMG_isGIF + * \sa IMG_isICO + * \sa IMG_isJPG + * \sa IMG_isJXL + * \sa IMG_isLBM + * \sa IMG_isPCX + * \sa IMG_isPNG + * \sa IMG_isPNM + * \sa IMG_isQOI + * \sa IMG_isTIF + * \sa IMG_isWEBP + * \sa IMG_isXCF + * \sa IMG_isXPM + * \sa IMG_isXV + */ +extern SDL_DECLSPEC bool SDLCALL IMG_isSVG(SDL_IOStream *src); + /** * Detect TIFF image data on a readable/seekable SDL_IOStream. * @@ -947,30 +1139,75 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isQOI(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is TIFF data, zero otherwise. + * \returns true if this is TIFF data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isTIF(SDL_IOStream *src); +/** + * Detect WEBP image data on a readable/seekable SDL_IOStream. + * + * This function attempts to determine if a file is a given filetype, reading + * the least amount possible from the SDL_IOStream (usually a few bytes). + * + * There is no distinction made between "not the filetype in question" and + * basic i/o errors. + * + * This function will always attempt to seek `src` back to where it started + * when this function was called, but it will not report any errors in doing + * so, but assuming seeking works, this means you can immediately use this + * with a different IMG_isTYPE function, or load the image without further + * seeking. + * + * You do not need to call this function to load data; SDL_image can work to + * determine file type in many cases in its standard load functions. + * + * \param src a seekable/readable SDL_IOStream to provide image data. + * \returns true if this is WEBP data, false otherwise. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_isANI + * \sa IMG_isAVIF + * \sa IMG_isBMP + * \sa IMG_isCUR + * \sa IMG_isGIF + * \sa IMG_isICO + * \sa IMG_isJPG + * \sa IMG_isJXL + * \sa IMG_isLBM + * \sa IMG_isPCX + * \sa IMG_isPNG + * \sa IMG_isPNM + * \sa IMG_isQOI + * \sa IMG_isSVG + * \sa IMG_isTIF + * \sa IMG_isXCF + * \sa IMG_isXPM + * \sa IMG_isXV + */ +extern SDL_DECLSPEC bool SDLCALL IMG_isWEBP(SDL_IOStream *src); + /** * Detect XCF image data on a readable/seekable SDL_IOStream. * @@ -990,27 +1227,28 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isTIF(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is XCF data, zero otherwise. + * \returns true if this is XCF data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXPM * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isXCF(SDL_IOStream *src); @@ -1033,27 +1271,28 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isXCF(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is XPM data, zero otherwise. + * \returns true if this is XPM data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXV - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isXPM(SDL_IOStream *src); @@ -1076,73 +1315,31 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isXPM(SDL_IOStream *src); * determine file type in many cases in its standard load functions. * * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is XV data, zero otherwise. + * \returns true if this is XV data, false otherwise. * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isANI * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR * \sa IMG_isBMP + * \sa IMG_isCUR * \sa IMG_isGIF + * \sa IMG_isICO * \sa IMG_isJPG * \sa IMG_isJXL * \sa IMG_isLBM * \sa IMG_isPCX * \sa IMG_isPNG * \sa IMG_isPNM - * \sa IMG_isSVG * \sa IMG_isQOI + * \sa IMG_isSVG * \sa IMG_isTIF + * \sa IMG_isWEBP * \sa IMG_isXCF * \sa IMG_isXPM - * \sa IMG_isWEBP */ extern SDL_DECLSPEC bool SDLCALL IMG_isXV(SDL_IOStream *src); -/** - * Detect WEBP image data on a readable/seekable SDL_IOStream. - * - * This function attempts to determine if a file is a given filetype, reading - * the least amount possible from the SDL_IOStream (usually a few bytes). - * - * There is no distinction made between "not the filetype in question" and - * basic i/o errors. - * - * This function will always attempt to seek `src` back to where it started - * when this function was called, but it will not report any errors in doing - * so, but assuming seeking works, this means you can immediately use this - * with a different IMG_isTYPE function, or load the image without further - * seeking. - * - * You do not need to call this function to load data; SDL_image can work to - * determine file type in many cases in its standard load functions. - * - * \param src a seekable/readable SDL_IOStream to provide image data. - * \returns non-zero if this is WEBP data, zero otherwise. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_isAVIF - * \sa IMG_isICO - * \sa IMG_isCUR - * \sa IMG_isBMP - * \sa IMG_isGIF - * \sa IMG_isJPG - * \sa IMG_isJXL - * \sa IMG_isLBM - * \sa IMG_isPCX - * \sa IMG_isPNG - * \sa IMG_isPNM - * \sa IMG_isSVG - * \sa IMG_isQOI - * \sa IMG_isTIF - * \sa IMG_isXCF - * \sa IMG_isXPM - * \sa IMG_isXV - */ -extern SDL_DECLSPEC bool SDLCALL IMG_isWEBP(SDL_IOStream *src); - /** * Load a AVIF image directly. * @@ -1156,95 +1353,27 @@ extern SDL_DECLSPEC bool SDLCALL IMG_isWEBP(SDL_IOStream *src); * * \since This function is available since SDL_image 3.0.0. * - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO * \sa IMG_LoadJPG_IO * \sa IMG_LoadJXL_IO * \sa IMG_LoadLBM_IO * \sa IMG_LoadPCX_IO * \sa IMG_LoadPNG_IO * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO * \sa IMG_LoadTGA_IO * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO * \sa IMG_LoadXCF_IO * \sa IMG_LoadXPM_IO * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadAVIF_IO(SDL_IOStream *src); -/** - * Load a ICO image directly. - * - * If you know you definitely have a ICO image, you can call this function, - * which will skip SDL_image's file format detection routines. Generally it's - * better to use the abstract interfaces; also, there is only an SDL_IOStream - * interface available here. - * - * \param src an SDL_IOStream to load image data from. - * \returns SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadCUR_IO - * \sa IMG_LoadBMP_IO - * \sa IMG_LoadGIF_IO - * \sa IMG_LoadJPG_IO - * \sa IMG_LoadJXL_IO - * \sa IMG_LoadLBM_IO - * \sa IMG_LoadPCX_IO - * \sa IMG_LoadPNG_IO - * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO - * \sa IMG_LoadQOI_IO - * \sa IMG_LoadTGA_IO - * \sa IMG_LoadTIF_IO - * \sa IMG_LoadXCF_IO - * \sa IMG_LoadXPM_IO - * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadICO_IO(SDL_IOStream *src); - -/** - * Load a CUR image directly. - * - * If you know you definitely have a CUR image, you can call this function, - * which will skip SDL_image's file format detection routines. Generally it's - * better to use the abstract interfaces; also, there is only an SDL_IOStream - * interface available here. - * - * \param src an SDL_IOStream to load image data from. - * \returns SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadBMP_IO - * \sa IMG_LoadGIF_IO - * \sa IMG_LoadJPG_IO - * \sa IMG_LoadJXL_IO - * \sa IMG_LoadLBM_IO - * \sa IMG_LoadPCX_IO - * \sa IMG_LoadPNG_IO - * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO - * \sa IMG_LoadQOI_IO - * \sa IMG_LoadTGA_IO - * \sa IMG_LoadTIF_IO - * \sa IMG_LoadXCF_IO - * \sa IMG_LoadXPM_IO - * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadCUR_IO(SDL_IOStream *src); - /** * Load a BMP image directly. * @@ -1259,26 +1388,60 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadCUR_IO(SDL_IOStream *src); * \since This function is available since SDL_image 3.0.0. * * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO * \sa IMG_LoadCUR_IO * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO * \sa IMG_LoadJPG_IO * \sa IMG_LoadJXL_IO * \sa IMG_LoadLBM_IO * \sa IMG_LoadPCX_IO * \sa IMG_LoadPNG_IO * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO * \sa IMG_LoadTGA_IO * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO * \sa IMG_LoadXCF_IO * \sa IMG_LoadXPM_IO * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadBMP_IO(SDL_IOStream *src); +/** + * Load a CUR image directly. + * + * If you know you definitely have a CUR image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. + * + * \param src an SDL_IOStream to load image data from. + * \returns SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadAVIF_IO + * \sa IMG_LoadBMP_IO + * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO + * \sa IMG_LoadJPG_IO + * \sa IMG_LoadJXL_IO + * \sa IMG_LoadLBM_IO + * \sa IMG_LoadPCX_IO + * \sa IMG_LoadPNG_IO + * \sa IMG_LoadPNM_IO + * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO + * \sa IMG_LoadTGA_IO + * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO + * \sa IMG_LoadXCF_IO + * \sa IMG_LoadXPM_IO + * \sa IMG_LoadXV_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadCUR_IO(SDL_IOStream *src); + /** * Load a GIF image directly. * @@ -1293,26 +1456,60 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadBMP_IO(SDL_IOStream *src); * \since This function is available since SDL_image 3.0.0. * * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO + * \sa IMG_LoadICO_IO * \sa IMG_LoadJPG_IO * \sa IMG_LoadJXL_IO * \sa IMG_LoadLBM_IO * \sa IMG_LoadPCX_IO * \sa IMG_LoadPNG_IO * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO * \sa IMG_LoadTGA_IO * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO * \sa IMG_LoadXCF_IO * \sa IMG_LoadXPM_IO * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadGIF_IO(SDL_IOStream *src); +/** + * Load a ICO image directly. + * + * If you know you definitely have a ICO image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. + * + * \param src an SDL_IOStream to load image data from. + * \returns SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadAVIF_IO + * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO + * \sa IMG_LoadGIF_IO + * \sa IMG_LoadJPG_IO + * \sa IMG_LoadJXL_IO + * \sa IMG_LoadLBM_IO + * \sa IMG_LoadPCX_IO + * \sa IMG_LoadPNG_IO + * \sa IMG_LoadPNM_IO + * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO + * \sa IMG_LoadTGA_IO + * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO + * \sa IMG_LoadXCF_IO + * \sa IMG_LoadXPM_IO + * \sa IMG_LoadXV_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadICO_IO(SDL_IOStream *src); + /** * Load a JPG image directly. * @@ -1327,23 +1524,23 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadGIF_IO(SDL_IOStream *src); * \since This function is available since SDL_image 3.0.0. * * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO * \sa IMG_LoadJXL_IO * \sa IMG_LoadLBM_IO * \sa IMG_LoadPCX_IO * \sa IMG_LoadPNG_IO * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO * \sa IMG_LoadTGA_IO * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO * \sa IMG_LoadXCF_IO * \sa IMG_LoadXPM_IO * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadJPG_IO(SDL_IOStream *src); @@ -1361,23 +1558,23 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadJPG_IO(SDL_IOStream *src); * \since This function is available since SDL_image 3.0.0. * * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO * \sa IMG_LoadJPG_IO * \sa IMG_LoadLBM_IO * \sa IMG_LoadPCX_IO * \sa IMG_LoadPNG_IO * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO * \sa IMG_LoadTGA_IO * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO * \sa IMG_LoadXCF_IO * \sa IMG_LoadXPM_IO * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadJXL_IO(SDL_IOStream *src); @@ -1395,23 +1592,23 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadJXL_IO(SDL_IOStream *src); * \since This function is available since SDL_image 3.0.0. * * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO * \sa IMG_LoadJPG_IO * \sa IMG_LoadJXL_IO * \sa IMG_LoadPCX_IO * \sa IMG_LoadPNG_IO * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO * \sa IMG_LoadTGA_IO * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO * \sa IMG_LoadXCF_IO * \sa IMG_LoadXPM_IO * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadLBM_IO(SDL_IOStream *src); @@ -1429,23 +1626,23 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadLBM_IO(SDL_IOStream *src); * \since This function is available since SDL_image 3.0.0. * * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO * \sa IMG_LoadJPG_IO * \sa IMG_LoadJXL_IO * \sa IMG_LoadLBM_IO * \sa IMG_LoadPNG_IO * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO * \sa IMG_LoadTGA_IO * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO * \sa IMG_LoadXCF_IO * \sa IMG_LoadXPM_IO * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadPCX_IO(SDL_IOStream *src); @@ -1463,23 +1660,23 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadPCX_IO(SDL_IOStream *src); * \since This function is available since SDL_image 3.0.0. * * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO * \sa IMG_LoadJPG_IO * \sa IMG_LoadJXL_IO * \sa IMG_LoadLBM_IO * \sa IMG_LoadPCX_IO * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO * \sa IMG_LoadTGA_IO * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO * \sa IMG_LoadXCF_IO * \sa IMG_LoadXPM_IO * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadPNG_IO(SDL_IOStream *src); @@ -1497,23 +1694,23 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadPNG_IO(SDL_IOStream *src); * \since This function is available since SDL_image 3.0.0. * * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO * \sa IMG_LoadJPG_IO * \sa IMG_LoadJXL_IO * \sa IMG_LoadLBM_IO * \sa IMG_LoadPCX_IO * \sa IMG_LoadPNG_IO - * \sa IMG_LoadSVG_IO * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO * \sa IMG_LoadTGA_IO * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO * \sa IMG_LoadXCF_IO * \sa IMG_LoadXPM_IO * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadPNM_IO(SDL_IOStream *src); @@ -1531,10 +1728,10 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadPNM_IO(SDL_IOStream *src); * \since This function is available since SDL_image 3.0.0. * * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO * \sa IMG_LoadJPG_IO * \sa IMG_LoadJXL_IO * \sa IMG_LoadLBM_IO @@ -1542,253 +1739,16 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadPNM_IO(SDL_IOStream *src); * \sa IMG_LoadPNG_IO * \sa IMG_LoadPNM_IO * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSizedSVG_IO * \sa IMG_LoadTGA_IO * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO * \sa IMG_LoadXCF_IO * \sa IMG_LoadXPM_IO * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadSVG_IO(SDL_IOStream *src); -/** - * Load a QOI image directly. - * - * If you know you definitely have a QOI image, you can call this function, - * which will skip SDL_image's file format detection routines. Generally it's - * better to use the abstract interfaces; also, there is only an SDL_IOStream - * interface available here. - * - * \param src an SDL_IOStream to load image data from. - * \returns SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO - * \sa IMG_LoadBMP_IO - * \sa IMG_LoadGIF_IO - * \sa IMG_LoadJPG_IO - * \sa IMG_LoadJXL_IO - * \sa IMG_LoadLBM_IO - * \sa IMG_LoadPCX_IO - * \sa IMG_LoadPNG_IO - * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO - * \sa IMG_LoadTGA_IO - * \sa IMG_LoadTIF_IO - * \sa IMG_LoadXCF_IO - * \sa IMG_LoadXPM_IO - * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadQOI_IO(SDL_IOStream *src); - -/** - * Load a TGA image directly. - * - * If you know you definitely have a TGA image, you can call this function, - * which will skip SDL_image's file format detection routines. Generally it's - * better to use the abstract interfaces; also, there is only an SDL_IOStream - * interface available here. - * - * \param src an SDL_IOStream to load image data from. - * \returns SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO - * \sa IMG_LoadBMP_IO - * \sa IMG_LoadGIF_IO - * \sa IMG_LoadJPG_IO - * \sa IMG_LoadJXL_IO - * \sa IMG_LoadLBM_IO - * \sa IMG_LoadPCX_IO - * \sa IMG_LoadPNG_IO - * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO - * \sa IMG_LoadQOI_IO - * \sa IMG_LoadTIF_IO - * \sa IMG_LoadXCF_IO - * \sa IMG_LoadXPM_IO - * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadTGA_IO(SDL_IOStream *src); - -/** - * Load a TIFF image directly. - * - * If you know you definitely have a TIFF image, you can call this function, - * which will skip SDL_image's file format detection routines. Generally it's - * better to use the abstract interfaces; also, there is only an SDL_IOStream - * interface available here. - * - * \param src an SDL_IOStream to load image data from. - * \returns SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO - * \sa IMG_LoadBMP_IO - * \sa IMG_LoadGIF_IO - * \sa IMG_LoadJPG_IO - * \sa IMG_LoadJXL_IO - * \sa IMG_LoadLBM_IO - * \sa IMG_LoadPCX_IO - * \sa IMG_LoadPNG_IO - * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO - * \sa IMG_LoadQOI_IO - * \sa IMG_LoadTGA_IO - * \sa IMG_LoadXCF_IO - * \sa IMG_LoadXPM_IO - * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadTIF_IO(SDL_IOStream *src); - -/** - * Load a XCF image directly. - * - * If you know you definitely have a XCF image, you can call this function, - * which will skip SDL_image's file format detection routines. Generally it's - * better to use the abstract interfaces; also, there is only an SDL_IOStream - * interface available here. - * - * \param src an SDL_IOStream to load image data from. - * \returns SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO - * \sa IMG_LoadBMP_IO - * \sa IMG_LoadGIF_IO - * \sa IMG_LoadJPG_IO - * \sa IMG_LoadJXL_IO - * \sa IMG_LoadLBM_IO - * \sa IMG_LoadPCX_IO - * \sa IMG_LoadPNG_IO - * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO - * \sa IMG_LoadQOI_IO - * \sa IMG_LoadTGA_IO - * \sa IMG_LoadTIF_IO - * \sa IMG_LoadXPM_IO - * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadXCF_IO(SDL_IOStream *src); - -/** - * Load a XPM image directly. - * - * If you know you definitely have a XPM image, you can call this function, - * which will skip SDL_image's file format detection routines. Generally it's - * better to use the abstract interfaces; also, there is only an SDL_IOStream - * interface available here. - * - * \param src an SDL_IOStream to load image data from. - * \returns SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO - * \sa IMG_LoadBMP_IO - * \sa IMG_LoadGIF_IO - * \sa IMG_LoadJPG_IO - * \sa IMG_LoadJXL_IO - * \sa IMG_LoadLBM_IO - * \sa IMG_LoadPCX_IO - * \sa IMG_LoadPNG_IO - * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO - * \sa IMG_LoadQOI_IO - * \sa IMG_LoadTGA_IO - * \sa IMG_LoadTIF_IO - * \sa IMG_LoadXCF_IO - * \sa IMG_LoadXV_IO - * \sa IMG_LoadWEBP_IO - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadXPM_IO(SDL_IOStream *src); - -/** - * Load a XV image directly. - * - * If you know you definitely have a XV image, you can call this function, - * which will skip SDL_image's file format detection routines. Generally it's - * better to use the abstract interfaces; also, there is only an SDL_IOStream - * interface available here. - * - * \param src an SDL_IOStream to load image data from. - * \returns SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO - * \sa IMG_LoadBMP_IO - * \sa IMG_LoadGIF_IO - * \sa IMG_LoadJPG_IO - * \sa IMG_LoadJXL_IO - * \sa IMG_LoadLBM_IO - * \sa IMG_LoadPCX_IO - * \sa IMG_LoadPNG_IO - * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO - * \sa IMG_LoadQOI_IO - * \sa IMG_LoadTGA_IO - * \sa IMG_LoadTIF_IO - * \sa IMG_LoadXCF_IO - * \sa IMG_LoadXPM_IO - * \sa IMG_LoadWEBP_IO - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadXV_IO(SDL_IOStream *src); - -/** - * Load a WEBP image directly. - * - * If you know you definitely have a WEBP image, you can call this function, - * which will skip SDL_image's file format detection routines. Generally it's - * better to use the abstract interfaces; also, there is only an SDL_IOStream - * interface available here. - * - * \param src an SDL_IOStream to load image data from. - * \returns SDL surface, or NULL on error. - * - * \since This function is available since SDL_image 3.0.0. - * - * \sa IMG_LoadAVIF_IO - * \sa IMG_LoadICO_IO - * \sa IMG_LoadCUR_IO - * \sa IMG_LoadBMP_IO - * \sa IMG_LoadGIF_IO - * \sa IMG_LoadJPG_IO - * \sa IMG_LoadJXL_IO - * \sa IMG_LoadLBM_IO - * \sa IMG_LoadPCX_IO - * \sa IMG_LoadPNG_IO - * \sa IMG_LoadPNM_IO - * \sa IMG_LoadSVG_IO - * \sa IMG_LoadQOI_IO - * \sa IMG_LoadTGA_IO - * \sa IMG_LoadTIF_IO - * \sa IMG_LoadXCF_IO - * \sa IMG_LoadXPM_IO - * \sa IMG_LoadXV_IO - */ -extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadWEBP_IO(SDL_IOStream *src); - /** * Load an SVG image, scaled to a specific size. * @@ -1807,9 +1767,249 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadWEBP_IO(SDL_IOStream *src); * \returns a new SDL surface, or NULL on error. * * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadSVG_IO */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadSizedSVG_IO(SDL_IOStream *src, int width, int height); +/** + * Load a QOI image directly. + * + * If you know you definitely have a QOI image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. + * + * \param src an SDL_IOStream to load image data from. + * \returns SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadAVIF_IO + * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO + * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO + * \sa IMG_LoadJPG_IO + * \sa IMG_LoadJXL_IO + * \sa IMG_LoadLBM_IO + * \sa IMG_LoadPCX_IO + * \sa IMG_LoadPNG_IO + * \sa IMG_LoadPNM_IO + * \sa IMG_LoadSVG_IO + * \sa IMG_LoadTGA_IO + * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO + * \sa IMG_LoadXCF_IO + * \sa IMG_LoadXPM_IO + * \sa IMG_LoadXV_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadQOI_IO(SDL_IOStream *src); + +/** + * Load a TGA image directly. + * + * If you know you definitely have a TGA image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. + * + * \param src an SDL_IOStream to load image data from. + * \returns SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadAVIF_IO + * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO + * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO + * \sa IMG_LoadJPG_IO + * \sa IMG_LoadJXL_IO + * \sa IMG_LoadLBM_IO + * \sa IMG_LoadPCX_IO + * \sa IMG_LoadPNG_IO + * \sa IMG_LoadPNM_IO + * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO + * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO + * \sa IMG_LoadXCF_IO + * \sa IMG_LoadXPM_IO + * \sa IMG_LoadXV_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadTGA_IO(SDL_IOStream *src); + +/** + * Load a TIFF image directly. + * + * If you know you definitely have a TIFF image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. + * + * \param src an SDL_IOStream to load image data from. + * \returns SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadAVIF_IO + * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO + * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO + * \sa IMG_LoadJPG_IO + * \sa IMG_LoadJXL_IO + * \sa IMG_LoadLBM_IO + * \sa IMG_LoadPCX_IO + * \sa IMG_LoadPNG_IO + * \sa IMG_LoadPNM_IO + * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO + * \sa IMG_LoadTGA_IO + * \sa IMG_LoadWEBP_IO + * \sa IMG_LoadXCF_IO + * \sa IMG_LoadXPM_IO + * \sa IMG_LoadXV_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadTIF_IO(SDL_IOStream *src); + +/** + * Load a WEBP image directly. + * + * If you know you definitely have a WEBP image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. + * + * \param src an SDL_IOStream to load image data from. + * \returns SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadAVIF_IO + * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO + * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO + * \sa IMG_LoadJPG_IO + * \sa IMG_LoadJXL_IO + * \sa IMG_LoadLBM_IO + * \sa IMG_LoadPCX_IO + * \sa IMG_LoadPNG_IO + * \sa IMG_LoadPNM_IO + * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO + * \sa IMG_LoadTGA_IO + * \sa IMG_LoadTIF_IO + * \sa IMG_LoadXCF_IO + * \sa IMG_LoadXPM_IO + * \sa IMG_LoadXV_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadWEBP_IO(SDL_IOStream *src); + +/** + * Load a XCF image directly. + * + * If you know you definitely have a XCF image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. + * + * \param src an SDL_IOStream to load image data from. + * \returns SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadAVIF_IO + * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO + * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO + * \sa IMG_LoadJPG_IO + * \sa IMG_LoadJXL_IO + * \sa IMG_LoadLBM_IO + * \sa IMG_LoadPCX_IO + * \sa IMG_LoadPNG_IO + * \sa IMG_LoadPNM_IO + * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO + * \sa IMG_LoadTGA_IO + * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO + * \sa IMG_LoadXPM_IO + * \sa IMG_LoadXV_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadXCF_IO(SDL_IOStream *src); + +/** + * Load a XPM image directly. + * + * If you know you definitely have a XPM image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. + * + * \param src an SDL_IOStream to load image data from. + * \returns SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadAVIF_IO + * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO + * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO + * \sa IMG_LoadJPG_IO + * \sa IMG_LoadJXL_IO + * \sa IMG_LoadLBM_IO + * \sa IMG_LoadPCX_IO + * \sa IMG_LoadPNG_IO + * \sa IMG_LoadPNM_IO + * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO + * \sa IMG_LoadTGA_IO + * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO + * \sa IMG_LoadXCF_IO + * \sa IMG_LoadXV_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadXPM_IO(SDL_IOStream *src); + +/** + * Load a XV image directly. + * + * If you know you definitely have a XV image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. + * + * \param src an SDL_IOStream to load image data from. + * \returns SDL surface, or NULL on error. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadAVIF_IO + * \sa IMG_LoadBMP_IO + * \sa IMG_LoadCUR_IO + * \sa IMG_LoadGIF_IO + * \sa IMG_LoadICO_IO + * \sa IMG_LoadJPG_IO + * \sa IMG_LoadJXL_IO + * \sa IMG_LoadLBM_IO + * \sa IMG_LoadPCX_IO + * \sa IMG_LoadPNG_IO + * \sa IMG_LoadPNM_IO + * \sa IMG_LoadQOI_IO + * \sa IMG_LoadSVG_IO + * \sa IMG_LoadTGA_IO + * \sa IMG_LoadTIF_IO + * \sa IMG_LoadWEBP_IO + * \sa IMG_LoadXCF_IO + * \sa IMG_LoadXPM_IO + */ +extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_LoadXV_IO(SDL_IOStream *src); + /** * Load an XPM image from a memory array. * @@ -1848,6 +2048,67 @@ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_ReadXPMFromArray(char **xpm); */ extern SDL_DECLSPEC SDL_Surface * SDLCALL IMG_ReadXPMFromArrayToRGB888(char **xpm); +/** + * Save an SDL_Surface into an image file. + * + * If the file already exists, it will be overwritten. + * + * For formats that accept a quality, a default quality of 90 will be used. + * + * \param surface the SDL surface to save. + * \param file path on the filesystem to write new file to. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveTyped_IO + * \sa IMG_SaveAVIF + * \sa IMG_SaveBMP + * \sa IMG_SaveCUR + * \sa IMG_SaveGIF + * \sa IMG_SaveICO + * \sa IMG_SaveJPG + * \sa IMG_SavePNG + * \sa IMG_SaveTGA + * \sa IMG_SaveWEBP + */ +extern SDL_DECLSPEC bool SDLCALL IMG_Save(SDL_Surface *surface, const char *file); + +/** + * Save an SDL_Surface into formatted image data, via an SDL_IOStream. + * + * If you just want to save to a filename, you can use IMG_Save() instead. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * For formats that accept a quality, a default quality of 90 will be used. + * + * \param surface the SDL surface to save. + * \param dst the SDL_IOStream to save the image data to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \param type a filename extension that represent this data ("BMP", "GIF", + * "PNG", etc). + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_Save + * \sa IMG_SaveAVIF_IO + * \sa IMG_SaveBMP_IO + * \sa IMG_SaveCUR_IO + * \sa IMG_SaveGIF_IO + * \sa IMG_SaveICO_IO + * \sa IMG_SaveJPG_IO + * \sa IMG_SavePNG_IO + * \sa IMG_SaveTGA_IO + * \sa IMG_SaveWEBP_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveTyped_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio, const char *type); + /** * Save an SDL_Surface into a AVIF image file. * @@ -1890,7 +2151,7 @@ extern SDL_DECLSPEC bool SDLCALL IMG_SaveAVIF(SDL_Surface *surface, const char * extern SDL_DECLSPEC bool SDLCALL IMG_SaveAVIF_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio, int quality); /** - * Save an SDL_Surface into a PNG image file. + * Save an SDL_Surface into a BMP image file. * * If the file already exists, it will be overwritten. * @@ -1899,16 +2160,16 @@ extern SDL_DECLSPEC bool SDLCALL IMG_SaveAVIF_IO(SDL_Surface *surface, SDL_IOStr * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL_image 3.0.0. + * \since This function is available since SDL_image 3.4.0. * - * \sa IMG_SavePNG_IO + * \sa IMG_SaveBMP_IO */ -extern SDL_DECLSPEC bool SDLCALL IMG_SavePNG(SDL_Surface *surface, const char *file); +extern SDL_DECLSPEC bool SDLCALL IMG_SaveBMP(SDL_Surface *surface, const char *file); /** - * Save an SDL_Surface into PNG image data, via an SDL_IOStream. + * Save an SDL_Surface into BMP image data, via an SDL_IOStream. * - * If you just want to save to a filename, you can use IMG_SavePNG() instead. + * If you just want to save to a filename, you can use IMG_SaveBMP() instead. * * If `closeio` is true, `dst` will be closed before returning, whether this * function succeeds or not. @@ -1920,11 +2181,122 @@ extern SDL_DECLSPEC bool SDLCALL IMG_SavePNG(SDL_Surface *surface, const char *f * \returns true on success or false on failure; call SDL_GetError() for more * information. * - * \since This function is available since SDL_image 3.0.0. + * \since This function is available since SDL_image 3.4.0. * - * \sa IMG_SavePNG + * \sa IMG_SaveBMP */ -extern SDL_DECLSPEC bool SDLCALL IMG_SavePNG_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); +extern SDL_DECLSPEC bool SDLCALL IMG_SaveBMP_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); + +/** + * Save an SDL_Surface into a CUR image file. + * + * If the file already exists, it will be overwritten. + * + * \param surface the SDL surface to save. + * \param file path on the filesystem to write new file to. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveCUR_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveCUR(SDL_Surface *surface, const char *file); + +/** + * Save an SDL_Surface into CUR image data, via an SDL_IOStream. + * + * If you just want to save to a filename, you can use IMG_SaveCUR() instead. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param surface the SDL surface to save. + * \param dst the SDL_IOStream to save the image data to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveCUR + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveCUR_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); + +/** + * Save an SDL_Surface into a GIF image file. + * + * If the file already exists, it will be overwritten. + * + * \param surface the SDL surface to save. + * \param file path on the filesystem to write new file to. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveGIF_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveGIF(SDL_Surface *surface, const char *file); + +/** + * Save an SDL_Surface into GIF image data, via an SDL_IOStream. + * + * If you just want to save to a filename, you can use IMG_SaveGIF() instead. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param surface the SDL surface to save. + * \param dst the SDL_IOStream to save the image data to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveGIF + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveGIF_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); + +/** + * Save an SDL_Surface into a ICO image file. + * + * If the file already exists, it will be overwritten. + * + * \param surface the SDL surface to save. + * \param file path on the filesystem to write new file to. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveICO_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveICO(SDL_Surface *surface, const char *file); + +/** + * Save an SDL_Surface into ICO image data, via an SDL_IOStream. + * + * If you just want to save to a filename, you can use IMG_SaveICO() instead. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param surface the SDL surface to save. + * \param dst the SDL_IOStream to save the image data to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveICO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveICO_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); /** * Save an SDL_Surface into a JPEG image file. @@ -1968,16 +2340,134 @@ extern SDL_DECLSPEC bool SDLCALL IMG_SaveJPG(SDL_Surface *surface, const char *f extern SDL_DECLSPEC bool SDLCALL IMG_SaveJPG_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio, int quality); /** - * Animated image support + * Save an SDL_Surface into a PNG image file. * - * Currently only animated GIFs and WEBP images are supported. + * If the file already exists, it will be overwritten. + * + * \param surface the SDL surface to save. + * \param file path on the filesystem to write new file to. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_SavePNG_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SavePNG(SDL_Surface *surface, const char *file); + +/** + * Save an SDL_Surface into PNG image data, via an SDL_IOStream. + * + * If you just want to save to a filename, you can use IMG_SavePNG() instead. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param surface the SDL surface to save. + * \param dst the SDL_IOStream to save the image data to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_SavePNG + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SavePNG_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); + +/** + * Save an SDL_Surface into a TGA image file. + * + * If the file already exists, it will be overwritten. + * + * \param surface the SDL surface to save. + * \param file path on the filesystem to write new file to. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveTGA_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveTGA(SDL_Surface *surface, const char *file); + +/** + * Save an SDL_Surface into TGA image data, via an SDL_IOStream. + * + * If you just want to save to a filename, you can use IMG_SaveTGA() instead. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param surface the SDL surface to save. + * \param dst the SDL_IOStream to save the image data to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveTGA + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveTGA_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio); + +/** + * Save an SDL_Surface into a WEBP image file. + * + * If the file already exists, it will be overwritten. + * + * \param surface the SDL surface to save. + * \param file path on the filesystem to write the new file to. + * \param quality between 0 and 100. For lossy, 0 gives the smallest size and + * 100 the largest. For lossless, this parameter is the amount + * of effort put into the compression: 0 is the fastest but + * gives larger files compared to the slowest, but best, 100. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveWEBP_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveWEBP(SDL_Surface *surface, const char *file, float quality); + +/** + * Save an SDL_Surface into WEBP image data, via an SDL_IOStream. + * + * If you just want to save to a filename, you can use IMG_SaveWEBP() instead. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param surface the SDL surface to save. + * \param dst the SDL_IOStream to save the image data to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \param quality between 0 and 100. For lossy, 0 gives the smallest size and + * 100 the largest. For lossless, this parameter is the amount + * of effort put into the compression: 0 is the fastest but + * gives larger files compared to the slowest, but best, 100. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveWEBP + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveWEBP_IO(SDL_Surface *surface, SDL_IOStream *dst, bool closeio, float quality); + +/** + * Animated image support */ typedef struct IMG_Animation { - int w, h; - int count; - SDL_Surface **frames; - int *delays; + int w; /**< The width of the frames */ + int h; /**< The height of the frames */ + int count; /**< The number of frames */ + SDL_Surface **frames; /**< An array of frames */ + int *delays; /**< An array of frame delays, in milliseconds */ } IMG_Animation; /** @@ -1991,6 +2481,14 @@ typedef struct IMG_Animation * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_CreateAnimatedCursor + * \sa IMG_LoadAnimation_IO + * \sa IMG_LoadAnimationTyped_IO + * \sa IMG_LoadANIAnimation_IO + * \sa IMG_LoadAPNGAnimation_IO + * \sa IMG_LoadAVIFAnimation_IO + * \sa IMG_LoadGIFAnimation_IO + * \sa IMG_LoadWEBPAnimation_IO * \sa IMG_FreeAnimation */ extern SDL_DECLSPEC IMG_Animation * SDLCALL IMG_LoadAnimation(const char *file); @@ -2012,12 +2510,20 @@ extern SDL_DECLSPEC IMG_Animation * SDLCALL IMG_LoadAnimation(const char *file); * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_CreateAnimatedCursor + * \sa IMG_LoadAnimation + * \sa IMG_LoadAnimationTyped_IO + * \sa IMG_LoadANIAnimation_IO + * \sa IMG_LoadAPNGAnimation_IO + * \sa IMG_LoadAVIFAnimation_IO + * \sa IMG_LoadGIFAnimation_IO + * \sa IMG_LoadWEBPAnimation_IO * \sa IMG_FreeAnimation */ extern SDL_DECLSPEC IMG_Animation * SDLCALL IMG_LoadAnimation_IO(SDL_IOStream *src, bool closeio); /** - * Load an animation from an SDL datasource + * Load an animation from an SDL_IOStream. * * Even though this function accepts a file type, SDL_image may still try * other decoders that are capable of detecting file type from the contents of @@ -2040,26 +2546,101 @@ extern SDL_DECLSPEC IMG_Animation * SDLCALL IMG_LoadAnimation_IO(SDL_IOStream *s * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_CreateAnimatedCursor * \sa IMG_LoadAnimation * \sa IMG_LoadAnimation_IO + * \sa IMG_LoadANIAnimation_IO + * \sa IMG_LoadAPNGAnimation_IO + * \sa IMG_LoadAVIFAnimation_IO + * \sa IMG_LoadGIFAnimation_IO + * \sa IMG_LoadWEBPAnimation_IO * \sa IMG_FreeAnimation */ extern SDL_DECLSPEC IMG_Animation * SDLCALL IMG_LoadAnimationTyped_IO(SDL_IOStream *src, bool closeio, const char *type); /** - * Dispose of an IMG_Animation and free its resources. + * Load an ANI animation directly from an SDL_IOStream. * - * The provided `anim` pointer is not valid once this call returns. + * If you know you definitely have an ANI image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally, it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. * - * \param anim IMG_Animation to dispose of. + * When done with the returned animation, the app should dispose of it with a + * call to IMG_FreeAnimation(). * - * \since This function is available since SDL_image 3.0.0. + * \param src an SDL_IOStream from which data will be read. + * \returns a new IMG_Animation, or NULL on error. * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_isANI * \sa IMG_LoadAnimation * \sa IMG_LoadAnimation_IO * \sa IMG_LoadAnimationTyped_IO + * \sa IMG_LoadAPNGAnimation_IO + * \sa IMG_LoadAVIFAnimation_IO + * \sa IMG_LoadGIFAnimation_IO + * \sa IMG_LoadWEBPAnimation_IO + * \sa IMG_FreeAnimation */ -extern SDL_DECLSPEC void SDLCALL IMG_FreeAnimation(IMG_Animation *anim); +extern SDL_DECLSPEC IMG_Animation *SDLCALL IMG_LoadANIAnimation_IO(SDL_IOStream *src); + +/** + * Load an APNG animation directly from an SDL_IOStream. + * + * If you know you definitely have an APNG image, you can call this function, + * which will skip SDL_image's file format detection routines. Generally, it's + * better to use the abstract interfaces; also, there is only an SDL_IOStream + * interface available here. + * + * When done with the returned animation, the app should dispose of it with a + * call to IMG_FreeAnimation(). + * + * \param src an SDL_IOStream from which data will be read. + * \returns a new IMG_Animation, or NULL on error. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_isPNG + * \sa IMG_LoadAnimation + * \sa IMG_LoadAnimation_IO + * \sa IMG_LoadAnimationTyped_IO + * \sa IMG_LoadANIAnimation_IO + * \sa IMG_LoadAVIFAnimation_IO + * \sa IMG_LoadGIFAnimation_IO + * \sa IMG_LoadWEBPAnimation_IO + * \sa IMG_FreeAnimation + */ +extern SDL_DECLSPEC IMG_Animation *SDLCALL IMG_LoadAPNGAnimation_IO(SDL_IOStream *src); + +/** + * Load an AVIF animation directly from an SDL_IOStream. + * + * If you know you definitely have an AVIF animation, you can call this + * function, which will skip SDL_image's file format detection routines. + * Generally it's better to use the abstract interfaces; also, there is only + * an SDL_IOStream interface available here. + * + * When done with the returned animation, the app should dispose of it with a + * call to IMG_FreeAnimation(). + * + * \param src an SDL_IOStream that data will be read from. + * \returns a new IMG_Animation, or NULL on error. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_isAVIF + * \sa IMG_LoadAnimation + * \sa IMG_LoadAnimation_IO + * \sa IMG_LoadAnimationTyped_IO + * \sa IMG_LoadANIAnimation_IO + * \sa IMG_LoadAPNGAnimation_IO + * \sa IMG_LoadGIFAnimation_IO + * \sa IMG_LoadWEBPAnimation_IO + * \sa IMG_FreeAnimation + */ +extern SDL_DECLSPEC IMG_Animation *SDLCALL IMG_LoadAVIFAnimation_IO(SDL_IOStream *src); /** * Load a GIF animation directly. @@ -2074,9 +2655,14 @@ extern SDL_DECLSPEC void SDLCALL IMG_FreeAnimation(IMG_Animation *anim); * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isGIF * \sa IMG_LoadAnimation * \sa IMG_LoadAnimation_IO * \sa IMG_LoadAnimationTyped_IO + * \sa IMG_LoadANIAnimation_IO + * \sa IMG_LoadAPNGAnimation_IO + * \sa IMG_LoadAVIFAnimation_IO + * \sa IMG_LoadWEBPAnimation_IO * \sa IMG_FreeAnimation */ extern SDL_DECLSPEC IMG_Animation * SDLCALL IMG_LoadGIFAnimation_IO(SDL_IOStream *src); @@ -2094,13 +2680,643 @@ extern SDL_DECLSPEC IMG_Animation * SDLCALL IMG_LoadGIFAnimation_IO(SDL_IOStream * * \since This function is available since SDL_image 3.0.0. * + * \sa IMG_isWEBP * \sa IMG_LoadAnimation * \sa IMG_LoadAnimation_IO * \sa IMG_LoadAnimationTyped_IO + * \sa IMG_LoadANIAnimation_IO + * \sa IMG_LoadAPNGAnimation_IO + * \sa IMG_LoadAVIFAnimation_IO + * \sa IMG_LoadGIFAnimation_IO * \sa IMG_FreeAnimation */ extern SDL_DECLSPEC IMG_Animation * SDLCALL IMG_LoadWEBPAnimation_IO(SDL_IOStream *src); +/** + * Save an animation to a file. + * + * For formats that accept a quality, a default quality of 90 will be used. + * + * \param anim the animation to save. + * \param file path on the filesystem containing an animated image. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveAnimationTyped_IO + * \sa IMG_SaveANIAnimation_IO + * \sa IMG_SaveAPNGAnimation_IO + * \sa IMG_SaveAVIFAnimation_IO + * \sa IMG_SaveGIFAnimation_IO + * \sa IMG_SaveWEBPAnimation_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveAnimation(IMG_Animation *anim, const char *file); + +/** + * Save an animation to an SDL_IOStream. + * + * If you just want to save to a filename, you can use IMG_SaveAnimation() + * instead. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * For formats that accept a quality, a default quality of 90 will be used. + * + * \param anim the animation to save. + * \param dst an SDL_IOStream that data will be written to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \param type a filename extension that represent this data ("GIF", etc). + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveAnimation + * \sa IMG_SaveANIAnimation_IO + * \sa IMG_SaveAPNGAnimation_IO + * \sa IMG_SaveAVIFAnimation_IO + * \sa IMG_SaveGIFAnimation_IO + * \sa IMG_SaveWEBPAnimation_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveAnimationTyped_IO(IMG_Animation *anim, SDL_IOStream *dst, bool closeio, const char *type); + +/** + * Save an animation in ANI format to an SDL_IOStream. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param anim the animation to save. + * \param dst an SDL_IOStream from which data will be written to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveAnimation + * \sa IMG_SaveAnimationTyped_IO + * \sa IMG_SaveAPNGAnimation_IO + * \sa IMG_SaveAVIFAnimation_IO + * \sa IMG_SaveGIFAnimation_IO + * \sa IMG_SaveWEBPAnimation_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveANIAnimation_IO(IMG_Animation *anim, SDL_IOStream *dst, bool closeio); + +/** + * Save an animation in APNG format to an SDL_IOStream. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param anim the animation to save. + * \param dst an SDL_IOStream from which data will be written to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveAnimation + * \sa IMG_SaveAnimationTyped_IO + * \sa IMG_SaveANIAnimation_IO + * \sa IMG_SaveAVIFAnimation_IO + * \sa IMG_SaveGIFAnimation_IO + * \sa IMG_SaveWEBPAnimation_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveAPNGAnimation_IO(IMG_Animation *anim, SDL_IOStream *dst, bool closeio); + +/** + * Save an animation in AVIF format to an SDL_IOStream. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param anim the animation to save. + * \param dst an SDL_IOStream from which data will be written to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \param quality the desired quality, ranging between 0 (lowest) and 100 + * (highest). + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveAnimation + * \sa IMG_SaveAnimationTyped_IO + * \sa IMG_SaveANIAnimation_IO + * \sa IMG_SaveAPNGAnimation_IO + * \sa IMG_SaveGIFAnimation_IO + * \sa IMG_SaveWEBPAnimation_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveAVIFAnimation_IO(IMG_Animation *anim, SDL_IOStream *dst, bool closeio, int quality); + +/** + * Save an animation in GIF format to an SDL_IOStream. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param anim the animation to save. + * \param dst an SDL_IOStream from which data will be written to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveAnimation + * \sa IMG_SaveAnimationTyped_IO + * \sa IMG_SaveANIAnimation_IO + * \sa IMG_SaveAPNGAnimation_IO + * \sa IMG_SaveAVIFAnimation_IO + * \sa IMG_SaveWEBPAnimation_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveGIFAnimation_IO(IMG_Animation *anim, SDL_IOStream *dst, bool closeio); + +/** + * Save an animation in WEBP format to an SDL_IOStream. + * + * If `closeio` is true, `dst` will be closed before returning, whether this + * function succeeds or not. + * + * \param anim the animation to save. + * \param dst an SDL_IOStream from which data will be written to. + * \param closeio true to close/free the SDL_IOStream before returning, false + * to leave it open. + * \param quality between 0 and 100. For lossy, 0 gives the smallest size and + * 100 the largest. For lossless, this parameter is the amount + * of effort put into the compression: 0 is the fastest but + * gives larger files compared to the slowest, but best, 100. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_SaveAnimation + * \sa IMG_SaveAnimationTyped_IO + * \sa IMG_SaveANIAnimation_IO + * \sa IMG_SaveAPNGAnimation_IO + * \sa IMG_SaveAVIFAnimation_IO + * \sa IMG_SaveGIFAnimation_IO + */ +extern SDL_DECLSPEC bool SDLCALL IMG_SaveWEBPAnimation_IO(IMG_Animation *anim, SDL_IOStream *dst, bool closeio, int quality); + +/** + * Create an animated cursor from an animation. + * + * \param anim an animation to use to create an animated cursor. + * \param hot_x the x position of the cursor hot spot. + * \param hot_y the y position of the cursor hot spot. + * \returns the new cursor on success or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_LoadAnimation + * \sa IMG_LoadAnimation_IO + * \sa IMG_LoadAnimationTyped_IO + */ +extern SDL_DECLSPEC SDL_Cursor * SDLCALL IMG_CreateAnimatedCursor(IMG_Animation *anim, int hot_x, int hot_y); + +/** + * Dispose of an IMG_Animation and free its resources. + * + * The provided `anim` pointer is not valid once this call returns. + * + * \param anim IMG_Animation to dispose of. + * + * \since This function is available since SDL_image 3.0.0. + * + * \sa IMG_LoadAnimation + * \sa IMG_LoadAnimation_IO + * \sa IMG_LoadAnimationTyped_IO + * \sa IMG_LoadANIAnimation_IO + * \sa IMG_LoadAPNGAnimation_IO + * \sa IMG_LoadAVIFAnimation_IO + * \sa IMG_LoadGIFAnimation_IO + * \sa IMG_LoadWEBPAnimation_IO + */ +extern SDL_DECLSPEC void SDLCALL IMG_FreeAnimation(IMG_Animation *anim); + +/** + * An object representing the encoder context. + */ +typedef struct IMG_AnimationEncoder IMG_AnimationEncoder; + +/** + * Create an encoder to save a series of images to a file. + * + * These animation types are currently supported: + * + * - ANI + * - APNG + * - AVIFS + * - GIF + * - WEBP + * + * The file type is determined from the file extension, e.g. "file.webp" will + * be encoded using WEBP. + * + * \param file the file where the animation will be saved. + * \returns a new IMG_AnimationEncoder, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationEncoder_IO + * \sa IMG_CreateAnimationEncoderWithProperties + * \sa IMG_AddAnimationEncoderFrame + * \sa IMG_CloseAnimationEncoder + */ +extern SDL_DECLSPEC IMG_AnimationEncoder * SDLCALL IMG_CreateAnimationEncoder(const char *file); + +/** + * Create an encoder to save a series of images to an IOStream. + * + * These animation types are currently supported: + * + * - ANI + * - APNG + * - AVIFS + * - GIF + * - WEBP + * + * If `closeio` is true, `dst` will be closed before returning if this + * function fails, or when the animation encoder is closed if this function + * succeeds. + * + * \param dst an SDL_IOStream that will be used to save the stream. + * \param closeio true to close the SDL_IOStream when done, false to leave it + * open. + * \param type a filename extension that represent this data ("WEBP", etc). + * \returns a new IMG_AnimationEncoder, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationEncoder + * \sa IMG_CreateAnimationEncoderWithProperties + * \sa IMG_AddAnimationEncoderFrame + * \sa IMG_CloseAnimationEncoder + */ +extern SDL_DECLSPEC IMG_AnimationEncoder * SDLCALL IMG_CreateAnimationEncoder_IO(SDL_IOStream *dst, bool closeio, const char *type); + +/** + * Create an animation encoder with the specified properties. + * + * These animation types are currently supported: + * + * - ANI + * - APNG + * - AVIFS + * - GIF + * - WEBP + * + * These are the supported properties: + * + * - `IMG_PROP_ANIMATION_ENCODER_CREATE_FILENAME_STRING`: the file to save, if + * an SDL_IOStream isn't being used. This is required if + * `IMG_PROP_ANIMATION_ENCODER_CREATE_IOSTREAM_POINTER` isn't set. + * - `IMG_PROP_ANIMATION_ENCODER_CREATE_IOSTREAM_POINTER`: an SDL_IOStream + * that will be used to save the stream. This should not be closed until the + * animation encoder is closed. This is required if + * `IMG_PROP_ANIMATION_ENCODER_CREATE_FILENAME_STRING` isn't set. + * - `IMG_PROP_ANIMATION_ENCODER_CREATE_IOSTREAM_AUTOCLOSE_BOOLEAN`: true if + * closing the animation encoder should also close the associated + * SDL_IOStream. + * - `IMG_PROP_ANIMATION_ENCODER_CREATE_TYPE_STRING`: the output file type, + * e.g. "webp", defaults to the file extension if + * `IMG_PROP_ANIMATION_ENCODER_CREATE_FILENAME_STRING` is set. + * - `IMG_PROP_ANIMATION_ENCODER_CREATE_QUALITY_NUMBER`: the compression + * quality, in the range of 0 to 100. The higher the number, the higher the + * quality and file size. This defaults to a balanced value for compression + * and quality. + * - `IMG_PROP_ANIMATION_ENCODER_CREATE_TIMEBASE_NUMERATOR_NUMBER`: the + * numerator of the fraction used to multiply the pts to convert it to + * seconds. This defaults to 1. + * - `IMG_PROP_ANIMATION_ENCODER_CREATE_TIMEBASE_DENOMINATOR_NUMBER`: the + * denominator of the fraction used to multiply the pts to convert it to + * seconds. This defaults to 1000. + * + * \param props the properties of the animation encoder. + * \returns a new IMG_AnimationEncoder, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationEncoder + * \sa IMG_CreateAnimationEncoder_IO + * \sa IMG_AddAnimationEncoderFrame + * \sa IMG_CloseAnimationEncoder + */ +extern SDL_DECLSPEC IMG_AnimationEncoder * SDLCALL IMG_CreateAnimationEncoderWithProperties(SDL_PropertiesID props); + +#define IMG_PROP_ANIMATION_ENCODER_CREATE_FILENAME_STRING "SDL_image.animation_encoder.create.filename" +#define IMG_PROP_ANIMATION_ENCODER_CREATE_IOSTREAM_POINTER "SDL_image.animation_encoder.create.iostream" +#define IMG_PROP_ANIMATION_ENCODER_CREATE_IOSTREAM_AUTOCLOSE_BOOLEAN "SDL_image.animation_encoder.create.iostream.autoclose" +#define IMG_PROP_ANIMATION_ENCODER_CREATE_TYPE_STRING "SDL_image.animation_encoder.create.type" +#define IMG_PROP_ANIMATION_ENCODER_CREATE_QUALITY_NUMBER "SDL_image.animation_encoder.create.quality" +#define IMG_PROP_ANIMATION_ENCODER_CREATE_TIMEBASE_NUMERATOR_NUMBER "SDL_image.animation_encoder.create.timebase.numerator" +#define IMG_PROP_ANIMATION_ENCODER_CREATE_TIMEBASE_DENOMINATOR_NUMBER "SDL_image.animation_encoder.create.timebase.denominator" + +#define IMG_PROP_ANIMATION_ENCODER_CREATE_AVIF_MAX_THREADS_NUMBER "SDL_image.animation_encoder.create.avif.max_threads" +#define IMG_PROP_ANIMATION_ENCODER_CREATE_AVIF_KEYFRAME_INTERVAL_NUMBER "SDL_image.animation_encoder.create.avif.keyframe_interval" +#define IMG_PROP_ANIMATION_ENCODER_CREATE_GIF_USE_LUT_BOOLEAN "SDL_image.animation_encoder.create.gif.use_lut" + +/** + * Add a frame to an animation encoder. + * + * \param encoder the receiving images. + * \param surface the surface to add as the next frame in the animation. + * \param duration the duration of the frame, usually in milliseconds but can + * be other units if the + * `IMG_PROP_ANIMATION_ENCODER_CREATE_TIMEBASE_DENOMINATOR_NUMBER` + * property is set when creating the encoder. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationEncoder + * \sa IMG_CreateAnimationEncoder_IO + * \sa IMG_CreateAnimationEncoderWithProperties + * \sa IMG_CloseAnimationEncoder + */ +extern SDL_DECLSPEC bool SDLCALL IMG_AddAnimationEncoderFrame(IMG_AnimationEncoder *encoder, SDL_Surface *surface, Uint64 duration); + +/** + * Close an animation encoder, finishing any encoding. + * + * Calling this function frees the animation encoder, and returns the final + * status of the encoding process. + * + * \param encoder the encoder to close. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationEncoder + * \sa IMG_CreateAnimationEncoder_IO + * \sa IMG_CreateAnimationEncoderWithProperties + */ +extern SDL_DECLSPEC bool SDLCALL IMG_CloseAnimationEncoder(IMG_AnimationEncoder *encoder); + +/** + * An enum representing the status of an animation decoder. + * + * \since This enum is available since SDL_image 3.4.0. + */ +typedef enum IMG_AnimationDecoderStatus +{ + IMG_DECODER_STATUS_INVALID = -1, /**< The decoder is invalid */ + IMG_DECODER_STATUS_OK, /**< The decoder is ready to decode the next frame */ + IMG_DECODER_STATUS_FAILED, /**< The decoder failed to decode a frame, call SDL_GetError() for more information. */ + IMG_DECODER_STATUS_COMPLETE /**< No more frames available */ +} IMG_AnimationDecoderStatus; + +/** + * An object representing animation decoder. + */ +typedef struct IMG_AnimationDecoder IMG_AnimationDecoder; + +/** + * Create a decoder to read a series of images from a file. + * + * These animation types are currently supported: + * + * - ANI + * - APNG + * - AVIFS + * - GIF + * - WEBP + * + * The file type is determined from the file extension, e.g. "file.webp" will + * be decoded using WEBP. + * + * \param file the file containing a series of images. + * \returns a new IMG_AnimationDecoder, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationDecoder_IO + * \sa IMG_CreateAnimationDecoderWithProperties + * \sa IMG_GetAnimationDecoderFrame + * \sa IMG_ResetAnimationDecoder + * \sa IMG_CloseAnimationDecoder + */ +extern SDL_DECLSPEC IMG_AnimationDecoder * SDLCALL IMG_CreateAnimationDecoder(const char *file); + +/** + * Create a decoder to read a series of images from an IOStream. + * + * These animation types are currently supported: + * + * - ANI + * - APNG + * - AVIFS + * - GIF + * - WEBP + * + * If `closeio` is true, `src` will be closed before returning if this + * function fails, or when the animation decoder is closed if this function + * succeeds. + * + * \param src an SDL_IOStream containing a series of images. + * \param closeio true to close the SDL_IOStream when done, false to leave it + * open. + * \param type a filename extension that represent this data ("WEBP", etc). + * \returns a new IMG_AnimationDecoder, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationDecoder + * \sa IMG_CreateAnimationDecoderWithProperties + * \sa IMG_GetAnimationDecoderFrame + * \sa IMG_ResetAnimationDecoder + * \sa IMG_CloseAnimationDecoder + */ +extern SDL_DECLSPEC IMG_AnimationDecoder * SDLCALL IMG_CreateAnimationDecoder_IO(SDL_IOStream *src, bool closeio, const char *type); + +/** + * Create an animation decoder with the specified properties. + * + * These animation types are currently supported: + * + * - ANI + * - APNG + * - AVIFS + * - GIF + * - WEBP + * + * These are the supported properties: + * + * - `IMG_PROP_ANIMATION_DECODER_CREATE_FILENAME_STRING`: the file to load, if + * an SDL_IOStream isn't being used. This is required if + * `IMG_PROP_ANIMATION_DECODER_CREATE_IOSTREAM_POINTER` isn't set. + * - `IMG_PROP_ANIMATION_DECODER_CREATE_IOSTREAM_POINTER`: an SDL_IOStream + * containing a series of images. This should not be closed until the + * animation decoder is closed. This is required if + * `IMG_PROP_ANIMATION_DECODER_CREATE_FILENAME_STRING` isn't set. + * - `IMG_PROP_ANIMATION_DECODER_CREATE_IOSTREAM_AUTOCLOSE_BOOLEAN`: true if + * closing the animation decoder should also close the associated + * SDL_IOStream. + * - `IMG_PROP_ANIMATION_DECODER_CREATE_TYPE_STRING`: the input file type, + * e.g. "webp", defaults to the file extension if + * `IMG_PROP_ANIMATION_DECODER_CREATE_FILENAME_STRING` is set. + * + * \param props the properties of the animation decoder. + * \returns a new IMG_AnimationDecoder, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationDecoder + * \sa IMG_CreateAnimationDecoder_IO + * \sa IMG_GetAnimationDecoderFrame + * \sa IMG_ResetAnimationDecoder + * \sa IMG_CloseAnimationDecoder + */ +extern SDL_DECLSPEC IMG_AnimationDecoder * SDLCALL IMG_CreateAnimationDecoderWithProperties(SDL_PropertiesID props); + +#define IMG_PROP_ANIMATION_DECODER_CREATE_FILENAME_STRING "SDL_image.animation_decoder.create.filename" +#define IMG_PROP_ANIMATION_DECODER_CREATE_IOSTREAM_POINTER "SDL_image.animation_decoder.create.iostream" +#define IMG_PROP_ANIMATION_DECODER_CREATE_IOSTREAM_AUTOCLOSE_BOOLEAN "SDL_image.animation_decoder.create.iostream.autoclose" +#define IMG_PROP_ANIMATION_DECODER_CREATE_TYPE_STRING "SDL_image.animation_decoder.create.type" +#define IMG_PROP_ANIMATION_DECODER_CREATE_TIMEBASE_NUMERATOR_NUMBER "SDL_image.animation_decoder.create.timebase.numerator" +#define IMG_PROP_ANIMATION_DECODER_CREATE_TIMEBASE_DENOMINATOR_NUMBER "SDL_image.animation_decoder.create.timebase.denominator" + +#define IMG_PROP_ANIMATION_DECODER_CREATE_AVIF_MAX_THREADS_NUMBER "SDL_image.animation_decoder.create.avif.max_threads" +#define IMG_PROP_ANIMATION_DECODER_CREATE_AVIF_ALLOW_INCREMENTAL_BOOLEAN "SDL_image.animation_decoder.create.avif.allow_incremental" +#define IMG_PROP_ANIMATION_DECODER_CREATE_AVIF_ALLOW_PROGRESSIVE_BOOLEAN "SDL_image.animation_decoder.create.avif.allow_progressive" +#define IMG_PROP_ANIMATION_DECODER_CREATE_GIF_TRANSPARENT_COLOR_INDEX_NUMBER "SDL_image.animation_encoder.create.gif.transparent_color_index" +#define IMG_PROP_ANIMATION_DECODER_CREATE_GIF_NUM_COLORS_NUMBER "SDL_image.animation_encoder.create.gif.num_colors" + +/** + * Get the properties of an animation decoder. + * + * This function returns the properties of the animation decoder, which holds + * information about the underlying image such as description, copyright text + * and loop count. + * + * \param decoder the animation decoder. + * \returns the properties ID of the animation decoder, or 0 if there are no + * properties; call SDL_GetError() for more information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationDecoder + * \sa IMG_CreateAnimationDecoder_IO + * \sa IMG_CreateAnimationDecoderWithProperties + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL IMG_GetAnimationDecoderProperties(IMG_AnimationDecoder* decoder); + +#define IMG_PROP_METADATA_IGNORE_PROPS_BOOLEAN "SDL_image.metadata.ignore_props" +#define IMG_PROP_METADATA_DESCRIPTION_STRING "SDL_image.metadata.description" +#define IMG_PROP_METADATA_COPYRIGHT_STRING "SDL_image.metadata.copyright" +#define IMG_PROP_METADATA_TITLE_STRING "SDL_image.metadata.title" +#define IMG_PROP_METADATA_AUTHOR_STRING "SDL_image.metadata.author" +#define IMG_PROP_METADATA_CREATION_TIME_STRING "SDL_image.metadata.creation_time" +#define IMG_PROP_METADATA_FRAME_COUNT_NUMBER "SDL_image.metadata.frame_count" +#define IMG_PROP_METADATA_LOOP_COUNT_NUMBER "SDL_image.metadata.loop_count" + +/** + * Get the next frame in an animation decoder. + * + * This function decodes the next frame in the animation decoder, returning it + * as an SDL_Surface. The returned surface should be freed with + * SDL_FreeSurface() when no longer needed. + * + * If the animation decoder has no more frames or an error occurred while + * decoding the frame, this function returns false. In that case, please call + * SDL_GetError() for more information. If SDL_GetError() returns an empty + * string, that means there are no more available frames. If SDL_GetError() + * returns a valid string, that means the decoding failed. + * + * \param decoder the animation decoder. + * \param frame a pointer filled in with the SDL_Surface for the next frame in + * the animation. + * \param duration the duration of the frame, usually in milliseconds but can + * be other units if the + * `IMG_PROP_ANIMATION_DECODER_CREATE_TIMEBASE_DENOMINATOR_NUMBER` + * property is set when creating the decoder. + * \returns true on success or false on failure and when no more frames are + * available; call IMG_GetAnimationDecoderStatus() or SDL_GetError() + * for more information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationDecoder + * \sa IMG_CreateAnimationDecoder_IO + * \sa IMG_CreateAnimationDecoderWithProperties + * \sa IMG_GetAnimationDecoderStatus + * \sa IMG_ResetAnimationDecoder + * \sa IMG_CloseAnimationDecoder + */ +extern SDL_DECLSPEC bool SDLCALL IMG_GetAnimationDecoderFrame(IMG_AnimationDecoder *decoder, SDL_Surface **frame, Uint64 *duration); + +/** + * Get the decoder status indicating the current state of the decoder. + * + * \param decoder the decoder to get the status of. + * \returns the status of the underlying decoder, or + * IMG_DECODER_STATUS_INVALID if the given decoder is invalid. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_GetAnimationDecoderFrame + */ +extern SDL_DECLSPEC IMG_AnimationDecoderStatus SDLCALL IMG_GetAnimationDecoderStatus(IMG_AnimationDecoder *decoder); + +/** + * Reset an animation decoder. + * + * Calling this function resets the animation decoder, allowing it to start + * from the beginning again. This is useful if you want to decode the frame + * sequence again without creating a new decoder. + * + * \param decoder the decoder to reset. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationDecoder + * \sa IMG_CreateAnimationDecoder_IO + * \sa IMG_CreateAnimationDecoderWithProperties + * \sa IMG_GetAnimationDecoderFrame + * \sa IMG_CloseAnimationDecoder + */ +extern SDL_DECLSPEC bool SDLCALL IMG_ResetAnimationDecoder(IMG_AnimationDecoder *decoder); + +/** + * Close an animation decoder, finishing any decoding. + * + * Calling this function frees the animation decoder, and returns the final + * status of the decoding process. + * + * \param decoder the decoder to close. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_image 3.4.0. + * + * \sa IMG_CreateAnimationDecoder + * \sa IMG_CreateAnimationDecoder_IO + * \sa IMG_CreateAnimationDecoderWithProperties + */ +extern SDL_DECLSPEC bool SDLCALL IMG_CloseAnimationDecoder(IMG_AnimationDecoder *decoder); + /* Ends C function definitions when using C++ */ #ifdef __cplusplus } diff --git a/vendor/sdl3/image/sdl_image.odin b/vendor/sdl3/image/sdl_image.odin index 098d21de7..820a7c4da 100644 --- a/vendor/sdl3/image/sdl_image.odin +++ b/vendor/sdl3/image/sdl_image.odin @@ -11,8 +11,8 @@ when ODIN_OS == .Windows { } MAJOR_VERSION :: 3 -MINOR_VERSION :: 2 -PATCHLEVEL :: 4 +MINOR_VERSION :: 4 +PATCHLEVEL :: 0 Animation :: struct { w, h: c.int, @@ -21,6 +21,51 @@ Animation :: struct { delays: [^]c.int, } +AnimationEncoder :: struct {} + +PROP_ANIMATION_ENCODER_CREATE_FILENAME_STRING :: "SDL_image.animation_encoder.create.filename" +PROP_ANIMATION_ENCODER_CREATE_IOSTREAM_POINTER :: "SDL_image.animation_encoder.create.iostream" +PROP_ANIMATION_ENCODER_CREATE_IOSTREAM_AUTOCLOSE_BOOLEAN :: "SDL_image.animation_encoder.create.iostream.autoclose" +PROP_ANIMATION_ENCODER_CREATE_TYPE_STRING :: "SDL_image.animation_encoder.create.type" +PROP_ANIMATION_ENCODER_CREATE_QUALITY_NUMBER :: "SDL_image.animation_encoder.create.quality" +PROP_ANIMATION_ENCODER_CREATE_TIMEBASE_NUMERATOR_NUMBER :: "SDL_image.animation_encoder.create.timebase.numerator" +PROP_ANIMATION_ENCODER_CREATE_TIMEBASE_DENOMINATOR_NUMBER :: "SDL_image.animation_encoder.create.timebase.denominator" + +PROP_ANIMATION_ENCODER_CREATE_AVIF_MAX_THREADS_NUMBER :: "SDL_image.animation_encoder.create.avif.max_threads" +PROP_ANIMATION_ENCODER_CREATE_AVIF_KEYFRAME_INTERVAL_NUMBER :: "SDL_image.animation_encoder.create.avif.keyframe_interval" +PROP_ANIMATION_ENCODER_CREATE_GIF_USE_LUT_BOOLEAN :: "SDL_image.animation_encoder.create.gif.use_lut" + +AnimationDecoderStatus :: enum c.int { + INVALID = -1, + OK, + FAILED, + COMPLETE, +} + +AnimationDecoder :: struct {} + +PROP_ANIMATION_DECODER_CREATE_FILENAME_STRING :: "SDL_image.animation_decoder.create.filename" +PROP_ANIMATION_DECODER_CREATE_IOSTREAM_POINTER :: "SDL_image.animation_decoder.create.iostream" +PROP_ANIMATION_DECODER_CREATE_IOSTREAM_AUTOCLOSE_BOOLEAN :: "SDL_image.animation_decoder.create.iostream.autoclose" +PROP_ANIMATION_DECODER_CREATE_TYPE_STRING :: "SDL_image.animation_decoder.create.type" +PROP_ANIMATION_DECODER_CREATE_TIMEBASE_NUMERATOR_NUMBER :: "SDL_image.animation_decoder.create.timebase.numerator" +PROP_ANIMATION_DECODER_CREATE_TIMEBASE_DENOMINATOR_NUMBER :: "SDL_image.animation_decoder.create.timebase.denominator" + +PROP_ANIMATION_DECODER_CREATE_AVIF_MAX_THREADS_NUMBER :: "SDL_image.animation_decoder.create.avif.max_threads" +PROP_ANIMATION_DECODER_CREATE_AVIF_ALLOW_INCREMENTAL_BOOLEAN :: "SDL_image.animation_decoder.create.avif.allow_incremental" +PROP_ANIMATION_DECODER_CREATE_AVIF_ALLOW_PROGRESSIVE_BOOLEAN :: "SDL_image.animation_decoder.create.avif.allow_progressive" +PROP_ANIMATION_DECODER_CREATE_GIF_TRANSPARENT_COLOR_INDEX_NUMBER :: "SDL_image.animation_encoder.create.gif.transparent_color_index" +PROP_ANIMATION_DECODER_CREATE_GIF_NUM_COLORS_NUMBER :: "SDL_image.animation_encoder.create.gif.num_colors" + +PROP_METADATA_IGNORE_PROPS_BOOLEAN :: "SDL_image.metadata.ignore_props" +PROP_METADATA_DESCRIPTION_STRING :: "SDL_image.metadata.description" +PROP_METADATA_COPYRIGHT_STRING :: "SDL_image.metadata.copyright" +PROP_METADATA_TITLE_STRING :: "SDL_image.metadata.title" +PROP_METADATA_AUTHOR_STRING :: "SDL_image.metadata.author" +PROP_METADATA_CREATION_TIME_STRING :: "SDL_image.metadata.creation_time" +PROP_METADATA_FRAME_COUNT_NUMBER :: "SDL_image.metadata.frame_count" +PROP_METADATA_LOOP_COUNT_NUMBER :: "SDL_image.metadata.loop_count" + @(default_calling_convention="c", link_prefix="IMG_") foreign lib { Version :: proc() -> c.int --- @@ -43,7 +88,16 @@ foreign lib { LoadTexture_IO :: proc(renderer: ^SDL.Renderer, src: ^SDL.IOStream, closeio: bool) -> ^SDL.Texture --- LoadTextureTyped_IO :: proc(renderer: ^SDL.Renderer, src: ^SDL.IOStream, closeio: bool, type: cstring) -> ^SDL.Texture --- + /* Load an image directly into a GPU texture. */ + LoadGPUTexture :: proc(device: ^SDL.GPUDevice, copy_pass: ^SDL.GPUCopyPass, file: cstring, width: ^c.int, height: ^c.int) -> ^SDL.GPUTexture --- + LoadGPUTexture_IO :: proc(device: ^SDL.GPUDevice, copy_pass: ^SDL.GPUCopyPass, src: ^SDL.IOStream, closeio: bool, width: ^c.int, height: ^c.int) -> ^SDL.GPUTexture --- + LoadGPUTextureTyped_IO :: proc(device: ^SDL.GPUDevice, copy_pass: ^SDL.GPUCopyPass, src: ^SDL.IOStream, closeio: bool, type: cstring, width: ^c.int, height: ^c.int) -> ^SDL.GPUTexture --- + + /* Get the image currently in the clipboard. */ + GetClipboardImage :: proc() -> ^SDL.Surface --- + /* Functions to detect a file type, given a seekable source */ + isANI :: proc(src: ^SDL.IOStream) -> bool --- isAVIF :: proc(src: ^SDL.IOStream) -> bool --- isICO :: proc(src: ^SDL.IOStream) -> bool --- isCUR :: proc(src: ^SDL.IOStream) -> bool --- @@ -90,19 +144,63 @@ foreign lib { ReadXPMFromArrayToRGB888 :: proc(xpm: [^]cstring) -> ^SDL.Surface --- /* Individual saving functions */ - SaveAVIF :: proc(surface: ^SDL.Surface, file: cstring, quality: c.int) -> c.bool --- - SaveAVIF_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool, quality: c.int) -> c.bool --- - SavePNG :: proc(surface: ^SDL.Surface, file: cstring) -> c.bool --- - SavePNG_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool) -> c.bool --- - SaveJPG :: proc(surface: ^SDL.Surface, file: cstring, quality: c.int) -> c.bool --- - SaveJPG_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool, quality: c.int) -> c.bool --- + Save :: proc(surface: ^SDL.Surface, file: cstring) -> c.bool --- + SaveTyped_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool, type: cstring) -> c.bool --- + SaveAVIF :: proc(surface: ^SDL.Surface, file: cstring, quality: c.int) -> c.bool --- + SaveAVIF_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool, quality: c.int) -> c.bool --- + SaveBMP :: proc(surface: ^SDL.Surface, file: cstring) -> c.bool --- + SaveBMP_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool) -> c.bool --- + SaveCUR :: proc(surface: ^SDL.Surface, file: cstring) -> c.bool --- + SaveCUR_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool) -> c.bool --- + SaveGIF :: proc(surface: ^SDL.Surface, file: cstring) -> c.bool --- + SaveGIF_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool) -> c.bool --- + SaveICO :: proc(surface: ^SDL.Surface, file: cstring) -> c.bool --- + SaveICO_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool) -> c.bool --- + SaveJPG :: proc(surface: ^SDL.Surface, file: cstring, quality: c.int) -> c.bool --- + SaveJPG_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool, quality: c.int) -> c.bool --- + SavePNG :: proc(surface: ^SDL.Surface, file: cstring) -> c.bool --- + SavePNG_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool) -> c.bool --- + SaveTGA :: proc(surface: ^SDL.Surface, file: cstring) -> c.bool --- + SaveTGA_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool) -> c.bool --- + SaveWEBP :: proc(surface: ^SDL.Surface, file: cstring, quality: f32) -> c.bool --- + SaveWEBP_IO :: proc(surface: ^SDL.Surface, dst: ^SDL.IOStream, closeio: bool, quality: f32) -> c.bool --- LoadAnimation :: proc(file: cstring) -> ^Animation --- LoadAnimation_IO :: proc(src: ^SDL.IOStream, closeio: bool) -> ^Animation --- LoadAnimationTyped_IO :: proc(src: ^SDL.IOStream, closeio: bool, type: cstring) -> ^Animation --- + SaveAnimation :: proc(anim: ^Animation, file: cstring) -> c.bool --- + SaveAnimationTyped_IO :: proc(anim: ^Animation, dst: ^SDL.IOStream, closeio: bool, type: cstring) -> c.bool --- + CreateAnimatedCursor :: proc(anim: ^Animation, hot_x: c.int, hot_y: c.int) -> ^SDL.Cursor --- FreeAnimation :: proc(anim: ^Animation) --- + /* Animation encoder functions */ + CreateAnimationEncoder :: proc(file: cstring) -> ^AnimationEncoder --- + CreateAnimationEncoder_IO :: proc(dst: ^SDL.IOStream, closeio: bool, type: cstring) -> ^AnimationEncoder --- + CreateAnimationEncoderWithProperties :: proc(props: SDL.PropertiesID) -> ^AnimationEncoder --- + AddAnimationEncoderFrame :: proc(encoder: ^AnimationEncoder, surface: ^SDL.Surface, duration: u64) -> c.bool --- + CloseAnimationEncoder :: proc(encoder: ^AnimationEncoder) -> c.bool --- + + /* Animation decoder functions */ + CreateAnimationDecoder :: proc(file: cstring) -> ^AnimationDecoder --- + CreateAnimationDecoder_IO :: proc(src: ^SDL.IOStream, closeio: bool, type: cstring) -> ^AnimationDecoder --- + CreateAnimationDecoderWithProperties :: proc(props: SDL.PropertiesID) -> ^AnimationDecoder --- + GetAnimationDecoderProperties :: proc(decoder: ^AnimationDecoder) -> SDL.PropertiesID --- + GetAnimationDecoderFrame :: proc(decoder: ^AnimationDecoder, frame: ^^SDL.Surface, duration: ^u64) -> c.bool --- + GetAnimationDecoderStatus :: proc(decoder: ^AnimationDecoder) -> AnimationDecoderStatus --- + ResetAnimationDecoder :: proc(decoder: ^AnimationDecoder) -> c.bool --- + CloseAnimationDecoder :: proc(decoder: ^AnimationDecoder) -> c.bool --- + /* Individual loading functions */ + LoadANIAnimation_IO :: proc(src: ^SDL.IOStream) -> ^Animation --- + LoadAPNGAnimation_IO :: proc(src: ^SDL.IOStream) -> ^Animation --- + LoadAVIFAnimation_IO :: proc(src: ^SDL.IOStream) -> ^Animation --- LoadGIFAnimation_IO :: proc(src: ^SDL.IOStream) -> ^Animation --- LoadWEBPAnimation_IO :: proc(src: ^SDL.IOStream) -> ^Animation --- + + /* Individual saving functions */ + SaveANIAnimation_IO :: proc(anim: ^Animation, dst: ^SDL.IOStream, closeio: bool) -> c.bool --- + SaveAPNGAnimation_IO :: proc(anim: ^Animation, dst: ^SDL.IOStream, closeio: bool) -> c.bool --- + SaveAVIFAnimation_IO :: proc(anim: ^Animation, dst: ^SDL.IOStream, closeio: bool, quality: c.int) -> c.bool --- + SaveGIFAnimation_IO :: proc(anim: ^Animation, dst: ^SDL.IOStream, closeio: bool) -> c.bool --- + SaveWEBPAnimation_IO :: proc(anim: ^Animation, dst: ^SDL.IOStream, closeio: bool, quality: c.int) -> c.bool --- } From 8a9d15ba3574b2f7a0b277e574b1fa0c5042e66f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 25 Jan 2026 12:28:23 +0000 Subject: [PATCH 246/766] Fix link to examples in nbio --- core/nbio/doc.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/nbio/doc.odin b/core/nbio/doc.odin index c43196923..15a21bbee 100644 --- a/core/nbio/doc.odin +++ b/core/nbio/doc.odin @@ -3,7 +3,7 @@ package nbio implements a non-blocking I/O and event loop abstraction layer over several platform-specific asynchronous I/O APIs. More examples can be found in Odin's examples repository -at [[ examples/nbio ; https://github.com/odin-lang/examples/nbio ]]. +at [[ examples/nbio ; https://github.com/odin-lang/examples/tree/master/nbio ]]. **Event Loop**: From 628b4b03be69379f687011c9374d3a32f5205bf1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 25 Jan 2026 12:32:26 +0000 Subject: [PATCH 247/766] Add section on "Why callbacks?" --- core/nbio/doc.odin | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/core/nbio/doc.odin b/core/nbio/doc.odin index 15a21bbee..706d9d42f 100644 --- a/core/nbio/doc.odin +++ b/core/nbio/doc.odin @@ -143,13 +143,13 @@ associated with an event loop or configured for non-blocking/asynchronous operation. On some platforms (notably Windows), this requires a specific flag at open -time (`.Non_Blocking` for `core:os`) and association may fail if the handle was not created -correctly. +time (`.Non_Blocking` for `core:os`) and association may fail if the handle was +not created correctly. For this reason, prefer `open` and `create_socket` from this package instead. -`associate_handle`, `associate_file`, and `associate_socket` can be used for externally opened -files/sockets. +`associate_handle`, `associate_file`, and `associate_socket` can be used for +externally opened files/sockets. **Offsets and positional I/O**: @@ -172,7 +172,8 @@ operation. Instead, the callback receives the context that was active when the event loop function (`tick`, `run`, etc.) was called. -This is because otherwise the context would have to be copied and held onto for each operation. +This is because otherwise the context would have to be copied and held onto for +each operation. If the submitting context is required inside the callback, it must be copied into the operation’s user data explicitly. @@ -187,9 +188,26 @@ Example: **Callback scheduling guarantees**: Callbacks are guaranteed to be invoked in a later tick, never synchronously. -This means that the operation returned from a procedure is at least valid till the end of the -current tick, because an operation is freed after it's callback is called. -Thus you can set user data after an execution is queued, or call `remove`, removing subtle "race" -conditions and simplifying control flow. +This means that the operation returned from a procedure is at least valid till +the end of the current tick, because an operation is freed after it's callback +is called. Thus you can set user data after an execution is queued, or call +`remove`, removing subtle "race" conditions and simplifying control flow. + +**Why does the design of this package use callbacks?** + +Callbacks are the simplest interface an event loop can reasonably expose: "Run +this when the operation completes". This means the loop itself doesn’t need to +know how the result is consumed (You could give control of the entire loop to +the user, but that comes with all the problems in that). + +Other mechanisms can be built on top of this, such as coroutines or even a queue +you comsume at your own time. + +The choice of one `Operation` type and one callback type for all the operations +is partly so it is easy to bind into Lua-like or native coroutines. + +Callbacks also allow multiple independent users to share the same event loop. +A package can register its own operations, and application code can register +others, without either seeing or handling the other’s completions. */ package nbio From 56445dff970d4fb2a8b4652f204d9930296937e5 Mon Sep 17 00:00:00 2001 From: Isabella Basso Date: Sun, 25 Jan 2026 21:33:05 -0300 Subject: [PATCH 248/766] encoding/xml: pass allocator on destroy --- core/encoding/xml/xml_reader.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/encoding/xml/xml_reader.odin b/core/encoding/xml/xml_reader.odin index 5e056177e..8f8fffe14 100644 --- a/core/encoding/xml/xml_reader.odin +++ b/core/encoding/xml/xml_reader.odin @@ -386,7 +386,8 @@ load_from_file :: proc(filename: string, options := DEFAULT_OPTIONS, error_handl return parse_bytes(data, options, filename, error_handler, allocator) } -destroy :: proc(doc: ^Document) { +destroy :: proc(doc: ^Document, allocator := context.allocator) { + context.allocator = allocator if doc == nil { return } for el in doc.elements { From 249e6c104e5b6d169e15e7167cf6c654105a6688 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 26 Jan 2026 08:58:06 +0100 Subject: [PATCH 249/766] Update the rest of the libs as needed --- vendor/sdl3/image/LICENSE.libpng.txt | 134 +++++++++++++++++++++++++++ vendor/sdl3/image/image.sha256 | 5 + vendor/sdl3/image/libavif-16.dll | Bin 13907968 -> 13907968 bytes vendor/sdl3/image/libpng16-16.dll | Bin 0 -> 247296 bytes vendor/sdl3/image/libtiff-6.dll | Bin 403456 -> 425984 bytes vendor/sdl3/image/libwebpmux-3.dll | Bin 0 -> 44544 bytes 6 files changed, 139 insertions(+) create mode 100644 vendor/sdl3/image/LICENSE.libpng.txt create mode 100644 vendor/sdl3/image/image.sha256 create mode 100644 vendor/sdl3/image/libpng16-16.dll create mode 100644 vendor/sdl3/image/libwebpmux-3.dll diff --git a/vendor/sdl3/image/LICENSE.libpng.txt b/vendor/sdl3/image/LICENSE.libpng.txt new file mode 100644 index 000000000..ea6df986c --- /dev/null +++ b/vendor/sdl3/image/LICENSE.libpng.txt @@ -0,0 +1,134 @@ +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE +========================================= + +PNG Reference Library License version 2 +--------------------------------------- + + * Copyright (c) 1995-2025 The PNG Reference Library Authors. + * Copyright (c) 2018-2025 Cosmin Truta. + * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. + * Copyright (c) 1996-1997 Andreas Dilger. + * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +The software is supplied "as is", without warranty of any kind, +express or implied, including, without limitation, the warranties +of merchantability, fitness for a particular purpose, title, and +non-infringement. In no event shall the Copyright owners, or +anyone distributing the software, be liable for any damages or +other liability, whether in contract, tort or otherwise, arising +from, out of, or in connection with the software, or the use or +other dealings in the software, even if advised of the possibility +of such damage. + +Permission is hereby granted to use, copy, modify, and distribute +this software, or portions hereof, for any purpose, without fee, +subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you + use this software in a product, an acknowledgment in the product + documentation would be appreciated, but is not required. + + 2. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + + +PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) +----------------------------------------------------------------------- + +libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are +Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are +derived from libpng-1.0.6, and are distributed according to the same +disclaimer and license as libpng-1.0.6 with the following individuals +added to the list of Contributing Authors: + + Simon-Pierre Cadieux + Eric S. Raymond + Mans Rullgard + Cosmin Truta + Gilles Vollant + James Yu + Mandar Sahastrabuddhe + Google Inc. + Vadim Barkov + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of + the library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is + with the user. + +Some files in the "contrib" directory and some configure-generated +files that are distributed with libpng have other copyright owners, and +are released under other open source licenses. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from +libpng-0.96, and are distributed according to the same disclaimer and +license as libpng-0.96, with the following individuals added to the +list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, +and are distributed according to the same disclaimer and license as +libpng-0.88, with the following individuals added to the list of +Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +Some files in the "scripts" directory have other copyright owners, +but are released under this license. + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing +Authors and Group 42, Inc. disclaim all warranties, expressed or +implied, including, without limitation, the warranties of +merchantability and of fitness for any purpose. The Contributing +Authors and Group 42, Inc. assume no liability for direct, indirect, +incidental, special, exemplary, or consequential damages, which may +result from the use of the PNG Reference Library, even if advised of +the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + + 1. The origin of this source code must not be misrepresented. + + 2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, +without fee, and encourage the use of this source code as a component +to supporting the PNG file format in commercial products. If you use +this source code in a product, acknowledgment is not required but would +be appreciated. diff --git a/vendor/sdl3/image/image.sha256 b/vendor/sdl3/image/image.sha256 new file mode 100644 index 000000000..90116b556 --- /dev/null +++ b/vendor/sdl3/image/image.sha256 @@ -0,0 +1,5 @@ +37d53aed3e127eec41a2fc28be62dae3660097f56e74a5fbaf52514da3b64646 *libavif-16.dll +a6dbc633ae480cf0ce84aedc3ef67f82c3a0015601844482696211458cbb13bd *libtiff-6.dll +bc5ae0287c030902cc3132e9fc7c4611e358e0462513800f76aee0f907039455 *libwebp-7.dll +4daf903fd124351c2cdf5aea3cb803162a5c813736532e0285b924e1d3964a8c *libwebpdemux-2.dll +2ed872741d4faf261912dbbf96cc1c3f1f7d6fc4ec19ebb3230b9b50dd3f4510 *SDL3_image.dll diff --git a/vendor/sdl3/image/libavif-16.dll b/vendor/sdl3/image/libavif-16.dll index 7fef6232a44a89d45a1191a6534c5c69c9cd8f62..eb235450fe041071145da07db891723371ae55f8 100644 GIT binary patch delta 1111 zcmZqpaDfekC){A-o7{M-^%mpSTTJt8)DJT-FnDyg889<29A{u;U|`^1_o2B?f|0*{ z7Xt%Bw;MHOq%Lx6FhqNHGoui{(Q0V#vX=lH;L8* zCBZ)3s_I;~8C(tD?*0G&|NrR)c1+?N%09iD6}~YuOrK!Kq{6kQ+l{03KuNgarRfLk znA%iBu7h-go!aj8@Bjaom;U|#&o2*hKGahFwyo{C_Dt=$_RQ_M_AKqW_N?u>_H6CB z_U!Gs_8jfG_MGjx_FV0`_T25c_B`#m_Pp)6_I&NR_WbR+_5$s>_JZxX_CoEs_QLJC z_9E@M_M+{%_G0b1_Tufi_7d&6_LA+n_EPP+_R{US_A>3c_Ok7{_HymH_VVqy_6qH} z_KNMf_Db!!_R8(K_A2eU_Nwi<_G<09_Ui4q_8RTE_L}Xv_FC<^_S)^a_B!pk_PXu4 z_ImBP_WJF)_6F^__J-}b_D1cw_QvhG_9pGQ_NMK*_Gaz5_U7%m_7?5A_Ll9r_Ezn= z_SWsW_BQRg_O|W0_IB;L_V(?$_73g2_Kxkj_D=1&_Rj6O_Ac$Y_O9)@_HOOD_U`Su z_8#rI_MYvz_FnC|_TKHe_CD>o_P*`8_I~ZT_Wtd;_5tm=_JQrW_Cf8r_QCDB_95-L z_Mz>$_F?V0_TlZh_7Uy5_L1$m_EGJ*_R;OR_A%|b_Ob1`_HpgG_VMkx_6hB|_KEGe z_DSuz_Q~zJ_9^YT_Nnc;_G#_8_UY}p_8IND_L=Ru_F3(@_Sx;Z_Brjj_POo3_Id5O z_WA9(_66;^_J!@a_C@Wv_QmbF_9gAP_NDE)_GRt4_T}xl_7&~9_Lc3q_Eqh<_SNmV z_BHLf_OTS_WkX-_7mE3?I*V9+D~fFwV&LcYd@tu*M4ey zuKl$3T>I(mx%M;KbM0rg=i1L|&$XZ3o@+m+J=cD2d#?Sw_FVhs}w&&U} zYR|P_+@5Q{q&?SuX?w2yvi4m2B&Kx%NlfbM23{=h`1{&$U0% zo@;-yJ=gwJd#?TI_FVfj?YZ`6+jH&DwddNOZ_l;A(4K35u|3!R()L{Y%hPADNUN^S L*v@g|@{f1`xq-P{ delta 1128 zcmZqpaDfekC){AtnAmu$^%mpSTTJt8)VDD(FnDyg889<29A{u;U|`^1_o2B?f|0*{ zH3I`fw;Mo3uFuGViD4#i9)s9Ki-=lY512Y3i*^2`=_Aqq2Nwgj)iSy}JHRHO?;A;4G z@Bjb*|EKBk%eR0Hb?JQVk$Jn}8#99kbDThTx5qbThSrm%Dn7lN6}~YuOqf2!j!A`Q zcefiy>w%I;!%JxsrXR9nYEuup4l*0;@^+tp|Np-{{_p>Pet8#UC-JwfXwS80YR|Q2 zZqK!6Y0tH1ZO^r5YtOZ3Z_l;oXwS9hY|pjlYR|RjZqK#nY0tIiZO^smYtOakZ_l+C zXwS75Y|ph9YR|P7ZqKzBY0tG6ZO^qAYtOY8Z_l-tXwS8mY|piqYR|QoZqK!sY0tHn zZO^rrYtOZpZ_l+?XwS7*Y|phY0tG+ZO^q=YtOY;Z_l;YXwS9RY|pjV zYR|RTZqK#XY0tISZO^sWYtOaUZ_l+iXwS7bY|phfYR|PdZqKzhY0tGcZO^qgYtOYe zZ_l;2XwS8`Y|pi~YR|Q|ZqK#1Y0tH{ZO^s0YtOZ}Z_l-NXwS8GY|piKYR|QIZqK!M zY0tHHZO^rLYtOZJZ_l;&XwS9xY|pj#YR|RzZqK#%Y0tIyZO^s$YtOa!Z_l+4XwS6| zY|ph1YR|O~ZqKz3Y0tF}ZO^q2YtOY0Z_l-lXwS8eY|piiYR|QgZqK!kY0tHfZO^rj zYtOZhZ_l+)XwS7zY|ph%YR|P#ZqKz(Y0tG!ZO^q&YtOY$Z_l;QXwS9JY|pjNYR|RL zZqK#PY0tIKZO^sOYtOaMZ_l+aXwS7TY|phXYR|PVZqKzZY0tGUZO^qYYtOYWZ_l-_ zXwS8;Y|pi?YR|Q=ZqK!^Y0tHZ_l-FXwS88Y|piCYR|QAZqK!EY0tH9 zZO^rDYtOZBZ_l;wXwS9pY|pjtYR|RrZqK#vY0tIqZO^suYtOasZ_l-#(4K2Qu|3y* zQhTobXxr?uzWPjAn)pV6LcKeIj8epY*~{p|K!`#J5o_H)~F?dP@U z+Rty#wO`PlYrn8P*M3oZuKnWnT>B;Mx%NxjbM2S4=h`oC&$S1o&6VxB_N&@+?N_(w z+OKKPwO`wwYrn2N*M5C_uKkAgT>Fjfx%QjdbL}^`=h|;+&$Zv$o@>9YJ=cDFd#?SC z_FVg&?YZ{5+H>u9x98gLY0tIa+n#H`uRYg(e|xU|f%aVcgYCKYhuU-P54Y#qA8F6E zKiZyaf2=*%{&;(?{fYKm`;+at_NUr&?N7Jo+Mj99wLjaQYk#gi*ZzEauKk7fT>Fdd ax%QW~=h|PMK7-|y`n%Na95*iihz9_R*1+ii diff --git a/vendor/sdl3/image/libpng16-16.dll b/vendor/sdl3/image/libpng16-16.dll new file mode 100644 index 0000000000000000000000000000000000000000..ea1e35e615733e331f8a647085586ed276c5d8b7 GIT binary patch literal 247296 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 literal 0 HcmV?d00001 diff --git a/vendor/sdl3/image/libtiff-6.dll b/vendor/sdl3/image/libtiff-6.dll index 645e446b82453c001c0b815ebc3f783e3381b1b4..0dcf40a01420d07ef1d931e0e79caf6d29ad3b8e 100644 GIT binary patch delta 182554 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

      o5we!0@*v^VS|Nr~+vM!zqc2E#h@)krg8sZ>u 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 delta 159145 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

      Dol1&=@f+1&s97x4J=U&HOs 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 diff --git a/vendor/sdl3/image/libwebpmux-3.dll b/vendor/sdl3/image/libwebpmux-3.dll new file mode 100644 index 0000000000000000000000000000000000000000..4294a2394ac7c1217befc2dc49b258ebed1f969a GIT binary patch literal 44544 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 Date: Mon, 26 Jan 2026 09:07:06 +0100 Subject: [PATCH 250/766] Delete unnecessary file. --- vendor/sdl3/image/image.sha256 | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 vendor/sdl3/image/image.sha256 diff --git a/vendor/sdl3/image/image.sha256 b/vendor/sdl3/image/image.sha256 deleted file mode 100644 index 90116b556..000000000 --- a/vendor/sdl3/image/image.sha256 +++ /dev/null @@ -1,5 +0,0 @@ -37d53aed3e127eec41a2fc28be62dae3660097f56e74a5fbaf52514da3b64646 *libavif-16.dll -a6dbc633ae480cf0ce84aedc3ef67f82c3a0015601844482696211458cbb13bd *libtiff-6.dll -bc5ae0287c030902cc3132e9fc7c4611e358e0462513800f76aee0f907039455 *libwebp-7.dll -4daf903fd124351c2cdf5aea3cb803162a5c813736532e0285b924e1d3964a8c *libwebpdemux-2.dll -2ed872741d4faf261912dbbf96cc1c3f1f7d6fc4ec19ebb3230b9b50dd3f4510 *SDL3_image.dll From 83a10e929f634dad2f7e2542ec18d90f73a8925c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 10:49:24 +0000 Subject: [PATCH 251/766] Require space after the prefix of `#+build` style tags --- src/parser.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index c1a7fe0ff..af533d9a3 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6238,9 +6238,28 @@ gb_internal String build_tag_get_token(String s, String *out) { return s; } +// returns true on failure +gb_internal bool build_require_space_after(String s, String prefix) { + GB_ASSERT(string_starts_with(s, prefix)); + + if (s.len == prefix.len) { + return false; + } + String stripped = string_trim_whitespace(substring(s, prefix.len, s.len)); + + if (s[prefix.len] != ' ' && stripped.len != 0) { + return true; + } + return false; +} + gb_internal bool parse_build_tag(Token token_for_pos, String s) { String const prefix = str_lit("build"); GB_ASSERT(string_starts_with(s, prefix)); + if (build_require_space_after(s, prefix)) { + syntax_error(token_for_pos, "Expected a space after #+%.*s", LIT(prefix)); + return true; + } s = string_trim_whitespace(substring(s, prefix.len, s.len)); if (s.len == 0) { @@ -6367,6 +6386,10 @@ gb_internal String vet_tag_get_token(String s, String *out, bool allow_colon) { gb_internal u64 parse_vet_tag(Token token_for_pos, String s) { String const prefix = str_lit("vet"); GB_ASSERT(string_starts_with(s, prefix)); + if (build_require_space_after(s, prefix)) { + syntax_error(token_for_pos, "Expected a space after #+%.*s", LIT(prefix)); + return true; + } s = string_trim_whitespace(substring(s, prefix.len, s.len)); u64 vet_flags = build_context.vet_flags; @@ -6424,6 +6447,10 @@ gb_internal u64 parse_vet_tag(Token token_for_pos, String s) { gb_internal u64 parse_feature_tag(Token token_for_pos, String s) { String const prefix = str_lit("feature"); GB_ASSERT(string_starts_with(s, prefix)); + if (build_require_space_after(s, prefix)) { + syntax_error(token_for_pos, "Expected a space after #+%.*s", LIT(prefix)); + return true; + } s = string_trim_whitespace(substring(s, prefix.len, s.len)); if (s.len == 0) { From 425e7ca780abef80bd646fce9a6541101bd5593d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 11:46:59 +0000 Subject: [PATCH 252/766] Add `core:container/handle_map` --- core/container/handle_map/handle_map.odin | 206 ++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 core/container/handle_map/handle_map.odin diff --git a/core/container/handle_map/handle_map.odin b/core/container/handle_map/handle_map.odin new file mode 100644 index 000000000..da816d288 --- /dev/null +++ b/core/container/handle_map/handle_map.odin @@ -0,0 +1,206 @@ +/* +Handle-based map using fixed-length arrays. + +Example: + import hm "core:container/handle_map" + + Handle :: hm.Handle32 + + Entity :: struct { + handle: Handle, + pos: [2]f32, + } + + entities: hm.Handle_Map(1024, Entity, Handle) + + h1 := hm.add(&entities, Entity{pos = {1, 4}}) + h2 := hm.add(&entities, Entity{pos = {9, 16}}) + + if e, ok := hm.get(&entities, h2); ok { + e.pos.x += 32 + } + + hm.remove(&entities, h1) + + h3 := hm.add(&entities, Entity{pos = {6, 7}}) + + it := hm.iterator_make(&entities) + for e, h in hm.iterate(&it) { + e.pos += {1, 2} + } +*/ +package container_handle_map + +import "base:builtin" +import "base:intrinsics" + +// Default 16-bit Handle type which can be used for handle maps which only need a maximum of 254 (1<<8 - 2) items +Handle16 :: struct { + idx: u8, + gen: u8, +} + +// Default 32-bit Handle type which can be used for handle maps which only need a maximum of 65534 (1<<16 - 2) items +Handle32 :: struct { + idx: u16, + gen: u16, +} + +// Default 64-bit Handle type which can be used for handle maps which only need a maximum of 4294967294 (1<<32 - 2) items +Handle64 :: struct { + idx: u32, + gen: u32, +} + +Handle_Map :: struct($N: uint, $T: typeid, $Handle_Type: typeid) + where + 0 < N, N < uint(1<<31 - 1), + + intrinsics.type_has_field(Handle_Type, "idx"), + intrinsics.type_has_field(Handle_Type, "gen"), + intrinsics.type_is_unsigned(intrinsics.type_field_type(Handle_Type, "idx")), + intrinsics.type_is_unsigned(intrinsics.type_field_type(Handle_Type, "gen")), + intrinsics.type_field_type(Handle_Type, "idx") == intrinsics.type_field_type(Handle_Type, "gen"), + + N < uint(max(intrinsics.type_field_type(Handle_Type, "idx"))), + + intrinsics.type_has_field (T, "handle"), + intrinsics.type_field_type(T, "handle") == Handle_Type +{ + + // The zero element represent a zero-value sentinel (dummy value), allowing for `idx == 0` to mean a no-handle. + // This means the capacity is actually N-1 items. + items: [N]T, + + used_len: u32, // How many of the items are in use + unused_len: u32, // Use to calculate the number of valid items + unused_items: [N]u32, + next_unused: u32, +} + + +// `add` a value of type `T` to the handle map. This will return a pointer to the item and an optional boolean to check for validity. +@(require_results) +add :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type), item: T) -> (handle: Handle_Type, ok: bool) #optional_ok { + if i := m.next_unused; i != 0 { + ptr := &m.items[i] + + m.next_unused = m.unused_items[i] + m.unused_items[i] = 0 + + prev_gen := ptr.handle.gen + ptr^ = item + + ptr.handle.idx = auto_cast i + ptr.handle.gen = auto_cast (prev_gen + 1) + m.unused_len -= 1 + return ptr.handle, true + } + + if m.used_len == 0 { + // initialize the zero-value sentinel + m.items[0] = {} + m.used_len += 1 + } + + if m.used_len == builtin.len(m.items) { + return {}, false + } + + ptr := &m.items[m.used_len] + ptr^ = item + + ptr.handle.idx = auto_cast m.used_len + ptr.handle.gen = 1 + m.used_len += 1 + return ptr.handle, true +} + +// `get` a stable pointer of type `^T` by resolving the handle `h`. If the handle is not valid, then `nil, false` is returned. +@(require_results) +get :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type), h: Handle_Type) -> (^T, bool) #optional_ok { + if h.idx <= 0 || u32(h.idx) >= m.used_len { + return nil, false + } + if e := &m.items[h.idx]; e.handle == h { + return e, true + } + return nil, false +} + +// `remove` an item from the handle map from the handle `h`. +remove :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type), h: Handle_Type) -> bool { + if h.idx <= 0 || u32(h.idx) >= m.used_len { + return false + } + + if item := &m.items[h.idx]; item.handle == h { + m.unused_items[h.idx] = m.next_unused + m.next_unused = u32(h.idx) + m.unused_len += 1 + item.handle.idx = 0 + return true + } + + return false +} + +// Returns true when the handle `h` is valid relating to the handle map. +@(require_results) +is_valid :: proc "contextless" (m: $H/Handle_Map($N, $T, $Handle_Type), h: Handle_Type) -> bool { + return h.idx > 0 && u32(h.idx) < m.used_len && m.items[h.idx].handle == h +} + +// Returns the number of possibly valid items in the handle map. +@(require_results) +len :: proc "contextless" (m: $H/Handle_Map($N, $T, $Handle_Type)) -> uint { + n := uint(m.used_len) - uint(m.unused_len) + return n-1 if n > 0 else 0 +} + +// Returns the capacity of the items in a handle map. +// This is equivalent to `N-1` as the zero value is reserved for the zero-value sentinel. +@(require_results) +cap :: proc "contextless" (m: $H/Handle_Map($N, $T, $Handle_Type)) -> uint { + // We could just return `N` but I am doing this for clarity + return builtin.len(m.items)-1 +} + +// `clear` the handle map by zeroing all of the memory. +// Internally this does not do `m^ = {}` but rather uses `intrinsics.mem_zero` explicitly improve performance. +clear :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type)) { + intrinsics.mem_zero(m, size_of(m^)) +} + +// An iterator for a handle map. +Handle_Map_Iterator :: struct($H: typeid) { + m: ^H, + index: u32, +} + +// Makes an iterator from a handle map. +@(require_results) +iterator_make :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type)) -> Handle_Map_Iterator(H) { + return {m, 1} +} + +/* + Iterate over a handle map. It will skip over unused item slots (e.g. handle.idx == 0). + Usage: + it := hm.iterator_make(&the_handle_map) + for item, handle in hm.iterate(&it) { + ... + } +*/ +@(require_results) +iterate :: proc "contextless" (it: ^$HI/Handle_Map_Iterator($H/Handle_Map($N, $T, $Handle_Type))) -> (val: ^T, h: Handle_Type, ok: bool) { + for _ in it.index.. Date: Mon, 26 Jan 2026 12:21:28 +0000 Subject: [PATCH 253/766] Add handle_map to examples/all --- examples/all/all_main.odin | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 9a7613ba5..69c9ad434 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -17,13 +17,14 @@ package all @(require) import "core:container/avl" @(require) import "core:container/bit_array" +@(require) import "core:container/handle_map" +@(require) import "core:container/intrusive/list" +@(require) import "core:container/lru" @(require) import "core:container/pool" @(require) import "core:container/priority_queue" @(require) import "core:container/queue" -@(require) import "core:container/small_array" -@(require) import "core:container/lru" -@(require) import "core:container/intrusive/list" @(require) import "core:container/rbtree" +@(require) import "core:container/small_array" @(require) import "core:container/topological_sort" @(require) import "core:container/xar" From 02e84f210843e4689090660131a3c6319ad06ee2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 14:11:40 +0000 Subject: [PATCH 254/766] Keep `-strict-style` happy --- core/container/handle_map/handle_map.odin | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/container/handle_map/handle_map.odin b/core/container/handle_map/handle_map.odin index da816d288..37b8de9f6 100644 --- a/core/container/handle_map/handle_map.odin +++ b/core/container/handle_map/handle_map.odin @@ -65,8 +65,7 @@ Handle_Map :: struct($N: uint, $T: typeid, $Handle_Type: typeid) N < uint(max(intrinsics.type_field_type(Handle_Type, "idx"))), intrinsics.type_has_field (T, "handle"), - intrinsics.type_field_type(T, "handle") == Handle_Type -{ + intrinsics.type_field_type(T, "handle") == Handle_Type { // The zero element represent a zero-value sentinel (dummy value), allowing for `idx == 0` to mean a no-handle. // This means the capacity is actually N-1 items. From f2a8960ab0e94a2e94d6ddce1959c0373e251d4e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 14:48:56 +0000 Subject: [PATCH 255/766] Add `Dynamic_Handle_Map` --- core/container/handle_map/doc.odin | 32 ++++ .../handle_map/dynamic_handle_map.odin | 142 ++++++++++++++++++ core/container/handle_map/handle_map.odin | 31 ---- 3 files changed, 174 insertions(+), 31 deletions(-) create mode 100644 core/container/handle_map/doc.odin create mode 100644 core/container/handle_map/dynamic_handle_map.odin diff --git a/core/container/handle_map/doc.odin b/core/container/handle_map/doc.odin new file mode 100644 index 000000000..e6ef0b344 --- /dev/null +++ b/core/container/handle_map/doc.odin @@ -0,0 +1,32 @@ +/* +Handle-based map using fixed-length arrays. + +Example: + import hm "core:container/handle_map" + + Handle :: hm.Handle32 + + Entity :: struct { + handle: Handle, + pos: [2]f32, + } + + entities: hm.Handle_Map(1024, Entity, Handle) + + h1 := hm.add(&entities, Entity{pos = {1, 4}}) + h2 := hm.add(&entities, Entity{pos = {9, 16}}) + + if e, ok := hm.get(&entities, h2); ok { + e.pos.x += 32 + } + + hm.remove(&entities, h1) + + h3 := hm.add(&entities, Entity{pos = {6, 7}}) + + it := hm.iterator_make(&entities) + for e, h in hm.iterate(&it) { + e.pos += {1, 2} + } +*/ +package container_handle_map \ No newline at end of file diff --git a/core/container/handle_map/dynamic_handle_map.odin b/core/container/handle_map/dynamic_handle_map.odin new file mode 100644 index 000000000..c754f2f25 --- /dev/null +++ b/core/container/handle_map/dynamic_handle_map.odin @@ -0,0 +1,142 @@ +package container_handle_map + +import "base:builtin" +import "base:runtime" +import "base:intrinsics" +import "core:container/xar" + + +Dynamic_Handle_Map :: struct($T: typeid, $Handle_Type: typeid) + where + intrinsics.type_has_field(Handle_Type, "idx"), + intrinsics.type_has_field(Handle_Type, "gen"), + intrinsics.type_is_unsigned(intrinsics.type_field_type(Handle_Type, "idx")), + intrinsics.type_is_unsigned(intrinsics.type_field_type(Handle_Type, "gen")), + intrinsics.type_field_type(Handle_Type, "idx") == intrinsics.type_field_type(Handle_Type, "gen"), + + intrinsics.type_has_field (T, "handle"), + intrinsics.type_field_type(T, "handle") == Handle_Type { + + items: xar.Array(T, 4), + unused_items: xar.Array(u32, 4), +} + +dynamic_init :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), allocator: runtime.Allocator) { + xar.init(&m.items, allocator) + xar.init(&m.unused_items, allocator) +} + +dynamic_destroy :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) { + xar.destroy(&m.unused_items) + xar.destroy(&m.items) +} + +@(require_results) +dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc := #caller_location) -> (handle: Handle_Type, err: runtime.Allocator_Error) { + if xar.len(m.unused_items) > 0 { + i := xar.pop(&m.unused_items) + ptr := xar.get_ptr(&m.items, i, loc) + prev_gen := ptr.handle.gen + ptr^ = item + + ptr.handle.idx = auto_cast i + ptr.handle.gen = auto_cast (prev_gen + 1) + return ptr.handle, nil + } + + if xar.len(m.items) == 0 { + // initialize the zero-value sentinel + xar.append(&m.items, T{}, loc) or_return + } + + i := xar.append(&m.items, item, loc) or_return + + ptr := xar.get_ptr(&m.items, i, loc) + ptr^ = item + + ptr.handle.idx = auto_cast i + ptr.handle.gen = 1 + return ptr.handle, nil +} + +@(require_results) +dynamic_get :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type) -> (^T, bool) #optional_ok { + if h.idx <= 0 || int(u32(h.idx)) >= xar.len(m.items) { + return nil, false + } + if e := xar.get_ptr(&m.items, h.idx); e.handle == h { + return e, true + } + return nil, false +} + +dynamic_remove :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type, loc := #caller_location) -> (found: bool, err: runtime.Allocator_Error) { + if h.idx <= 0 || int(u32(h.idx)) >= xar.len(m.items) { + return false, nil + } + + if item := xar.get_ptr(&m.items, h.idx); item.handle == h { + xar.append(&m.unused_items, u32(h.idx), loc) or_return + item.handle.idx = 0 + return true, nil + } + + return false, nil +} + +@(require_results) +dynamic_is_valid :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type, loc := #caller_location) -> bool { + return h.idx > 0 && int(u32(h.idx)) < xar.len(m.items) && xar.get(&m.items, h.idx, loc).handle == h +} + +// Returns the number of possibly valid items in the handle map. +@(require_results) +dynamic_len :: proc(m: $D/Dynamic_Handle_Map($T, $Handle_Type)) -> uint { + n := xar.len(m.items) - xar.len(m.unused_items) + return uint(n-1 if n > 0 else 0) +} + +@(require_results) +dynamic_cap :: proc(m: $D/Dynamic_Handle_Map($T, $Handle_Type)) -> uint { + n := xar.cap(m.items) + return uint(n-1 if n > 0 else 0) +} + +dynamic_clear :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) { + xar.clear(&m.items) + xar.clear(&m.unused_items) +} + + +// An iterator for a handle map. +Dynamic_Handle_Map_Iterator :: struct($D: typeid) { + m: ^D, + index: int, +} + +// Makes an iterator from a handle map. +@(require_results) +dynamic_iterator_make :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) -> Dynamic_Handle_Map_Iterator(D) { + return {m, 1} +} + +/* + Iterate over a handle map. It will skip over unused item slots (e.g. handle.idx == 0). + Usage: + it := hm.dynamic_iterator_make(&the_dynamic_handle_map) + for item, handle in hm.iterate(&it) { + ... + } +*/ +@(require_results) +dynamic_iterate :: proc(it: ^$DHI/Dynamic_Handle_Map_Iterator($D/Dynamic_Handle_Map($T, $Handle_Type))) -> (val: ^T, h: Handle_Type, ok: bool) { + for _ in it.index.. Date: Mon, 26 Jan 2026 14:53:01 +0000 Subject: [PATCH 256/766] Make things contextless where possible --- .../handle_map/dynamic_handle_map.odin | 24 +++++++++---------- core/container/xar/xar.odin | 15 ++++++++---- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/core/container/handle_map/dynamic_handle_map.odin b/core/container/handle_map/dynamic_handle_map.odin index c754f2f25..600f49c28 100644 --- a/core/container/handle_map/dynamic_handle_map.odin +++ b/core/container/handle_map/dynamic_handle_map.odin @@ -35,7 +35,7 @@ dynamic_destroy :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) { dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc := #caller_location) -> (handle: Handle_Type, err: runtime.Allocator_Error) { if xar.len(m.unused_items) > 0 { i := xar.pop(&m.unused_items) - ptr := xar.get_ptr(&m.items, i, loc) + ptr := xar.get_ptr_unsafe(&m.items, i) prev_gen := ptr.handle.gen ptr^ = item @@ -51,7 +51,7 @@ dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc := i := xar.append(&m.items, item, loc) or_return - ptr := xar.get_ptr(&m.items, i, loc) + ptr := xar.get_ptr_unsafe(&m.items, i) ptr^ = item ptr.handle.idx = auto_cast i @@ -60,11 +60,11 @@ dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc := } @(require_results) -dynamic_get :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type) -> (^T, bool) #optional_ok { +dynamic_get :: proc "contextless" (m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type) -> (^T, bool) #optional_ok { if h.idx <= 0 || int(u32(h.idx)) >= xar.len(m.items) { return nil, false } - if e := xar.get_ptr(&m.items, h.idx); e.handle == h { + if e := xar.get_ptr_unsafe(&m.items, h.idx); e.handle == h { return e, true } return nil, false @@ -85,24 +85,24 @@ dynamic_remove :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Ty } @(require_results) -dynamic_is_valid :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type, loc := #caller_location) -> bool { - return h.idx > 0 && int(u32(h.idx)) < xar.len(m.items) && xar.get(&m.items, h.idx, loc).handle == h +dynamic_is_valid :: proc "contextless" (m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type) -> bool { + return h.idx > 0 && int(u32(h.idx)) < xar.len(m.items) && xar.get_ptr_unsafe(&m.items, h.idx).handle == h } // Returns the number of possibly valid items in the handle map. @(require_results) -dynamic_len :: proc(m: $D/Dynamic_Handle_Map($T, $Handle_Type)) -> uint { +dynamic_len :: proc "contextless" (m: $D/Dynamic_Handle_Map($T, $Handle_Type)) -> uint { n := xar.len(m.items) - xar.len(m.unused_items) return uint(n-1 if n > 0 else 0) } @(require_results) -dynamic_cap :: proc(m: $D/Dynamic_Handle_Map($T, $Handle_Type)) -> uint { +dynamic_cap :: proc "contextless" (m: $D/Dynamic_Handle_Map($T, $Handle_Type)) -> uint { n := xar.cap(m.items) return uint(n-1 if n > 0 else 0) } -dynamic_clear :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) { +dynamic_clear :: proc "contextless" (m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) { xar.clear(&m.items) xar.clear(&m.unused_items) } @@ -116,7 +116,7 @@ Dynamic_Handle_Map_Iterator :: struct($D: typeid) { // Makes an iterator from a handle map. @(require_results) -dynamic_iterator_make :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) -> Dynamic_Handle_Map_Iterator(D) { +dynamic_iterator_make :: proc "contextless" (m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) -> Dynamic_Handle_Map_Iterator(D) { return {m, 1} } @@ -129,9 +129,9 @@ dynamic_iterator_make :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) -> Dy } */ @(require_results) -dynamic_iterate :: proc(it: ^$DHI/Dynamic_Handle_Map_Iterator($D/Dynamic_Handle_Map($T, $Handle_Type))) -> (val: ^T, h: Handle_Type, ok: bool) { +dynamic_iterate :: proc "contextless" (it: ^$DHI/Dynamic_Handle_Map_Iterator($D/Dynamic_Handle_Map($T, $Handle_Type))) -> (val: ^T, h: Handle_Type, ok: bool) { for _ in it.index.. int { +len :: proc "contextless" (x: $X/Array($T, $SHIFT)) -> int { return x.len } // Returns the number of allocated elements @(require_results) -cap :: proc(x: $X/Array($T, $SHIFT)) -> int { +cap :: proc "contextless" (x: $X/Array($T, $SHIFT)) -> int { #reverse for c, i in x.chunks { if c != nil { return 1 << (SHIFT + uint(i if i > 0 else 1)) @@ -132,7 +132,7 @@ cap :: proc(x: $X/Array($T, $SHIFT)) -> int { // Internal: computes chunk index, element index within chunk, and chunk capacity for a given index. @(require_results) -_meta_get :: #force_inline proc($SHIFT: uint, index: uint) -> (chunk_idx, elem_idx, chunk_cap: uint) { +_meta_get :: #force_inline proc "contextless" ($SHIFT: uint, index: uint) -> (chunk_idx, elem_idx, chunk_cap: uint) { elem_idx = index chunk_cap = uint(1) << SHIFT chunk_idx = 0 @@ -206,6 +206,13 @@ get_ptr :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_lo return &x.chunks[chunk_idx][elem_idx] } +// No bounds checking +@(require_results) +get_ptr_unsafe :: proc "contextless" (x: ^$X/Array($T, $SHIFT), #any_int index: int) -> (val: ^T) #no_bounds_check { + chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) + return &x.chunks[chunk_idx][elem_idx] +} + /* Set the element at the specified index to the given value. From 25ecca7159c8cf1c63579ea796662357cd93d804 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 15:00:00 +0000 Subject: [PATCH 257/766] Rename to `Static_Handle_Map` --- core/container/handle_map/handle_map.odin | 71 +++++++++++++++++++---- 1 file changed, 59 insertions(+), 12 deletions(-) diff --git a/core/container/handle_map/handle_map.odin b/core/container/handle_map/handle_map.odin index 485371d42..f308c5e95 100644 --- a/core/container/handle_map/handle_map.odin +++ b/core/container/handle_map/handle_map.odin @@ -21,7 +21,7 @@ Handle64 :: struct { gen: u32, } -Handle_Map :: struct($N: uint, $T: typeid, $Handle_Type: typeid) +Static_Handle_Map :: struct($N: uint, $T: typeid, $Handle_Type: typeid) where 0 < N, N < uint(1<<31 - 1), @@ -49,7 +49,7 @@ Handle_Map :: struct($N: uint, $T: typeid, $Handle_Type: typeid) // `add` a value of type `T` to the handle map. This will return a pointer to the item and an optional boolean to check for validity. @(require_results) -add :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type), item: T) -> (handle: Handle_Type, ok: bool) #optional_ok { +static_add :: proc "contextless" (m: ^$H/Static_Handle_Map($N, $T, $Handle_Type), item: T) -> (handle: Handle_Type, ok: bool) #optional_ok { if i := m.next_unused; i != 0 { ptr := &m.items[i] @@ -86,7 +86,7 @@ add :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type), item: T) -> // `get` a stable pointer of type `^T` by resolving the handle `h`. If the handle is not valid, then `nil, false` is returned. @(require_results) -get :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type), h: Handle_Type) -> (^T, bool) #optional_ok { +static_get :: proc "contextless" (m: ^$H/Static_Handle_Map($N, $T, $Handle_Type), h: Handle_Type) -> (^T, bool) #optional_ok { if h.idx <= 0 || u32(h.idx) >= m.used_len { return nil, false } @@ -97,7 +97,7 @@ get :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type), h: Handle_Ty } // `remove` an item from the handle map from the handle `h`. -remove :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type), h: Handle_Type) -> bool { +static_remove :: proc "contextless" (m: ^$H/Static_Handle_Map($N, $T, $Handle_Type), h: Handle_Type) -> bool { if h.idx <= 0 || u32(h.idx) >= m.used_len { return false } @@ -115,13 +115,13 @@ remove :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type), h: Handle // Returns true when the handle `h` is valid relating to the handle map. @(require_results) -is_valid :: proc "contextless" (m: $H/Handle_Map($N, $T, $Handle_Type), h: Handle_Type) -> bool { +static_is_valid :: proc "contextless" (m: $H/Static_Handle_Map($N, $T, $Handle_Type), h: Handle_Type) -> bool { return h.idx > 0 && u32(h.idx) < m.used_len && m.items[h.idx].handle == h } // Returns the number of possibly valid items in the handle map. @(require_results) -len :: proc "contextless" (m: $H/Handle_Map($N, $T, $Handle_Type)) -> uint { +static_len :: proc "contextless" (m: $H/Static_Handle_Map($N, $T, $Handle_Type)) -> uint { n := uint(m.used_len) - uint(m.unused_len) return n-1 if n > 0 else 0 } @@ -129,26 +129,26 @@ len :: proc "contextless" (m: $H/Handle_Map($N, $T, $Handle_Type)) -> uint { // Returns the capacity of the items in a handle map. // This is equivalent to `N-1` as the zero value is reserved for the zero-value sentinel. @(require_results) -cap :: proc "contextless" (m: $H/Handle_Map($N, $T, $Handle_Type)) -> uint { +static_cap :: proc "contextless" (m: $H/Static_Handle_Map($N, $T, $Handle_Type)) -> uint { // We could just return `N` but I am doing this for clarity return builtin.len(m.items)-1 } // `clear` the handle map by zeroing all of the memory. // Internally this does not do `m^ = {}` but rather uses `intrinsics.mem_zero` explicitly improve performance. -clear :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type)) { +static_clear :: proc "contextless" (m: ^$H/Static_Handle_Map($N, $T, $Handle_Type)) { intrinsics.mem_zero(m, size_of(m^)) } // An iterator for a handle map. -Handle_Map_Iterator :: struct($H: typeid) { +Static_Handle_Map_Iterator :: struct($H: typeid) { m: ^H, index: u32, } // Makes an iterator from a handle map. @(require_results) -iterator_make :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type)) -> Handle_Map_Iterator(H) { +static_iterator_make :: proc "contextless" (m: ^$H/Static_Handle_Map($N, $T, $Handle_Type)) -> Static_Handle_Map_Iterator(H) { return {m, 1} } @@ -161,7 +161,7 @@ iterator_make :: proc "contextless" (m: ^$H/Handle_Map($N, $T, $Handle_Type)) -> } */ @(require_results) -iterate :: proc "contextless" (it: ^$HI/Handle_Map_Iterator($H/Handle_Map($N, $T, $Handle_Type))) -> (val: ^T, h: Handle_Type, ok: bool) { +static_iterate :: proc "contextless" (it: ^$HI/Static_Handle_Map_Iterator($H/Static_Handle_Map($N, $T, $Handle_Type))) -> (val: ^T, h: Handle_Type, ok: bool) { for _ in it.index.. Date: Mon, 26 Jan 2026 15:00:15 +0000 Subject: [PATCH 258/766] Rename to static_handle_map.odin --- .../handle_map/{handle_map.odin => static_handle_map.odin} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core/container/handle_map/{handle_map.odin => static_handle_map.odin} (100%) diff --git a/core/container/handle_map/handle_map.odin b/core/container/handle_map/static_handle_map.odin similarity index 100% rename from core/container/handle_map/handle_map.odin rename to core/container/handle_map/static_handle_map.odin From 9f206ba6d5fca31130a43e2ed167b6f898bf3a85 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 15:06:15 +0000 Subject: [PATCH 259/766] Keep `-vet` happy --- core/container/handle_map/dynamic_handle_map.odin | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/container/handle_map/dynamic_handle_map.odin b/core/container/handle_map/dynamic_handle_map.odin index 600f49c28..067212a54 100644 --- a/core/container/handle_map/dynamic_handle_map.odin +++ b/core/container/handle_map/dynamic_handle_map.odin @@ -1,10 +1,9 @@ package container_handle_map -import "base:builtin" import "base:runtime" +import "base:builtin" import "base:intrinsics" -import "core:container/xar" - +@(require) import "core:container/xar" Dynamic_Handle_Map :: struct($T: typeid, $Handle_Type: typeid) where From 2859bc08534d00fe8b8b30b55a08a795221d1620 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 15:11:07 +0000 Subject: [PATCH 260/766] Update doc.odin --- core/container/handle_map/doc.odin | 44 +++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/core/container/handle_map/doc.odin b/core/container/handle_map/doc.odin index e6ef0b344..c1949ffdd 100644 --- a/core/container/handle_map/doc.odin +++ b/core/container/handle_map/doc.odin @@ -11,22 +11,46 @@ Example: pos: [2]f32, } - entities: hm.Handle_Map(1024, Entity, Handle) + { // static map + entities: hm.Static_Handle_Map(1024, Entity, Handle) - h1 := hm.add(&entities, Entity{pos = {1, 4}}) - h2 := hm.add(&entities, Entity{pos = {9, 16}}) + h1 := hm.add(&entities, Entity{pos = {1, 4}}) + h2 := hm.add(&entities, Entity{pos = {9, 16}}) - if e, ok := hm.get(&entities, h2); ok { - e.pos.x += 32 + if e, ok := hm.get(&entities, h2); ok { + e.pos.x += 32 + } + + hm.remove(&entities, h1) + + h3 := hm.add(&entities, Entity{pos = {6, 7}}) + + it := hm.iterator_make(&entities) + for e, h in hm.iterate(&it) { + e.pos += {1, 2} + } } - hm.remove(&entities, h1) + { // dynamic map + entities: hm.Dynamic_Handle_Map(Entity, Handle) + hm.dynamic_init(&entities, context.allocator) + defer hm.dynamic_destroy(&entities) - h3 := hm.add(&entities, Entity{pos = {6, 7}}) + h1 := hm.add(&entities, Entity{pos = {1, 4}}) + h2 := hm.add(&entities, Entity{pos = {9, 16}}) - it := hm.iterator_make(&entities) - for e, h in hm.iterate(&it) { - e.pos += {1, 2} + if e, ok := hm.get(&entities, h2); ok { + e.pos.x += 32 + } + + hm.remove(&entities, h1) + + h3 := hm.add(&entities, Entity{pos = {6, 7}}) + + it := hm.iterator_make(&entities) + for e, h in hm.iterate(&it) { + e.pos += {1, 2} + } } */ package container_handle_map \ No newline at end of file From afe4369f6e1100fbacc0eb60a8d838dd0411850a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 15:37:54 +0000 Subject: [PATCH 261/766] Add `#+feature force-type-assert` which overrides `-no-type-assert` on a per-file basis --- src/build_settings.cpp | 8 +++++- src/llvm_backend_expr.cpp | 59 ++++++++++++++++++++++++++------------- 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 7d43788cd..e66d46713 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -360,12 +360,15 @@ enum OptInFeatureFlags : u64 { OptInFeatureFlag_IntegerDivisionByZero_Self = 1u<<4, OptInFeatureFlag_IntegerDivisionByZero_AllBits = 1u<<5, - OptInFeatureFlag_IntegerDivisionByZero_ALL = OptInFeatureFlag_IntegerDivisionByZero_Trap| OptInFeatureFlag_IntegerDivisionByZero_Zero| OptInFeatureFlag_IntegerDivisionByZero_Self| OptInFeatureFlag_IntegerDivisionByZero_AllBits, + OptInFeatureFlag_ForceTypeAssert = 1u<<6, + + + }; u64 get_feature_flag_from_name(String const &name) { @@ -384,6 +387,9 @@ u64 get_feature_flag_from_name(String const &name) { if (name == "integer-division-by-zero:all-bits") { return OptInFeatureFlag_IntegerDivisionByZero_AllBits; } + if (name == "force-type-assert") { + return OptInFeatureFlag_ForceTypeAssert; + } if (name == "global-context") { diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index dba61df44..59359942e 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -282,8 +282,7 @@ gb_internal lbValue lb_emit_unary_arith(lbProcedure *p, TokenKind op, lbValue x, return res; } - -gb_internal IntegerDivisionByZeroKind lb_check_for_integer_division_by_zero_behaviour(lbProcedure *p) { +gb_internal u64 lb_get_file_feature_flags(lbProcedure *p) { AstFile *file = nullptr; if (p->body && p->body->file()) { @@ -295,20 +294,29 @@ gb_internal IntegerDivisionByZeroKind lb_check_for_integer_division_by_zero_beha } if (file != nullptr && file->feature_flags_set) { - u64 flags = file->feature_flags; - if (flags & OptInFeatureFlag_IntegerDivisionByZero_Trap) { - return IntegerDivisionByZero_Trap; - } - if (flags & OptInFeatureFlag_IntegerDivisionByZero_Zero) { - return IntegerDivisionByZero_Zero; - } - if (flags & OptInFeatureFlag_IntegerDivisionByZero_Self) { - return IntegerDivisionByZero_Self; - } - if (flags & OptInFeatureFlag_IntegerDivisionByZero_AllBits) { - return IntegerDivisionByZero_AllBits; - } + return file->feature_flags; } + return 0; +} + + + +gb_internal IntegerDivisionByZeroKind lb_check_for_integer_division_by_zero_behaviour(lbProcedure *p) { + u64 flags = lb_get_file_feature_flags(p); + + if (flags & OptInFeatureFlag_IntegerDivisionByZero_Trap) { + return IntegerDivisionByZero_Trap; + } + if (flags & OptInFeatureFlag_IntegerDivisionByZero_Zero) { + return IntegerDivisionByZero_Zero; + } + if (flags & OptInFeatureFlag_IntegerDivisionByZero_Self) { + return IntegerDivisionByZero_Self; + } + if (flags & OptInFeatureFlag_IntegerDivisionByZero_AllBits) { + return IntegerDivisionByZero_AllBits; + } + return build_context.integer_division_by_zero_behaviour; } @@ -3802,6 +3810,17 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { Type *type = type_of_expr(ue_expr); GB_ASSERT(!is_type_tuple(type)); + bool do_type_check = true; + if (build_context.no_type_assert) { + u64 feature_flags = lb_get_file_feature_flags(p); + if ((feature_flags & OptInFeatureFlag_ForceTypeAssert) == 0) { + do_type_check = false; + } + + } else if ((p->state_flags & StateFlag_no_type_assert) != 0) { + do_type_check = false; + } + lbValue e = lb_build_expr(p, ta->expr); Type *t = type_deref(e.type); if (is_type_union(t)) { @@ -3813,7 +3832,7 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { Type *dst_type = type; - if (!build_context.no_type_assert && (p->state_flags & StateFlag_no_type_assert) == 0) { + if (do_type_check) { lbValue src_tag = {}; lbValue dst_tag = {}; if (is_type_union_maybe_pointer(src_type)) { @@ -3851,7 +3870,7 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { v = lb_emit_load(p, v); } lbValue data_ptr = lb_emit_struct_ev(p, v, 0); - if (!build_context.no_type_assert && (p->state_flags & StateFlag_no_type_assert) == 0) { + if (do_type_check) { GB_ASSERT(!build_context.no_rtti); lbValue any_id = lb_emit_struct_ev(p, v, 1); @@ -5313,7 +5332,8 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { if (cl->elems.count == 0) { break; } - GB_ASSERT(expr->file()->feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals); + u64 feature_flags = lb_get_file_feature_flags(p); + GB_ASSERT(feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals); lbValue err = lb_dynamic_map_reserve(p, v.addr, 2*cl->elems.count, pos); gb_unused(err); @@ -5402,7 +5422,8 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { if (cl->elems.count == 0) { break; } - GB_ASSERT(expr->file()->feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals); + u64 feature_flags = lb_get_file_feature_flags(p); + GB_ASSERT(feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals); Type *et = bt->DynamicArray.elem; lbValue size = lb_const_int(p->module, t_int, type_size_of(et)); From efdb89afcb893d9b405d517d00331082fcc849df Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 15:41:15 +0000 Subject: [PATCH 262/766] Revert dynamic literals feature check --- src/llvm_backend_expr.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 59359942e..c925ba2c9 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -5332,8 +5332,7 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { if (cl->elems.count == 0) { break; } - u64 feature_flags = lb_get_file_feature_flags(p); - GB_ASSERT(feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals); + GB_ASSERT(expr->file()->feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals); lbValue err = lb_dynamic_map_reserve(p, v.addr, 2*cl->elems.count, pos); gb_unused(err); @@ -5422,8 +5421,7 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { if (cl->elems.count == 0) { break; } - u64 feature_flags = lb_get_file_feature_flags(p); - GB_ASSERT(feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals); + GB_ASSERT(expr->file()->feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals); Type *et = bt->DynamicArray.elem; lbValue size = lb_const_int(p->module, t_int, type_size_of(et)); From 0774b7465fe0eb29c54af24e0375f80b776f42f6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 15:51:38 +0000 Subject: [PATCH 263/766] Allow for shortcut to get feature flags from the expression directly assuming it as a file --- src/llvm_backend_expr.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index c925ba2c9..3c7092a32 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -282,10 +282,16 @@ gb_internal lbValue lb_emit_unary_arith(lbProcedure *p, TokenKind op, lbValue x, return res; } -gb_internal u64 lb_get_file_feature_flags(lbProcedure *p) { +gb_internal u64 lb_get_file_feature_flags(lbProcedure *p, Ast *expr = nullptr) { AstFile *file = nullptr; - if (p->body && p->body->file()) { + if (expr != nullptr) { + file = expr->file(); + } + + if (file != nullptr) { + // it is now set + } else if (p->body && p->body->file()) { file = p->body->file(); } else if (p->type_expr && p->type_expr->file()) { file = p->type_expr->file(); @@ -3812,7 +3818,7 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { bool do_type_check = true; if (build_context.no_type_assert) { - u64 feature_flags = lb_get_file_feature_flags(p); + u64 feature_flags = lb_get_file_feature_flags(p, ue_expr); if ((feature_flags & OptInFeatureFlag_ForceTypeAssert) == 0) { do_type_check = false; } From 3586bda6ae80b1dca1984ae54b023d5fec69067e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 18:23:29 +0000 Subject: [PATCH 264/766] Use `context.assertion_failure_proc` with type assertions when the `context` is available, otherwise use a trivial trap. --- base/runtime/error_checks.odin | 159 +++++++++++++--- base/runtime/print.odin | 331 +++++++++++++++++++++++++++++++++ src/check_expr.cpp | 16 +- src/llvm_backend_expr.cpp | 27 ++- src/llvm_backend_utility.cpp | 13 +- 5 files changed, 509 insertions(+), 37 deletions(-) diff --git a/base/runtime/error_checks.odin b/base/runtime/error_checks.odin index 32a895c3f..79245fc0c 100644 --- a/base/runtime/error_checks.odin +++ b/base/runtime/error_checks.odin @@ -137,7 +137,22 @@ matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32 when ODIN_NO_RTTI { - type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32) { + type_assertion_check_with_context :: proc "odin" (ok: bool, file: string, line, column: i32) { + if ok { + return + } + @(cold, no_instrumentation) + handle_error :: proc "odin" (file: string, line, column: i32) -> ! { + p := context.assertion_failure_proc + if p == nil { + p = default_assertion_failure_proc + } + p("type assertion", "Invalid type assertion", Source_Code_Location{file, line, column, ""}) + } + handle_error(file, line, column) + } + + type_assertion_check_contextless :: proc "contextless" (ok: bool, file: string, line, column: i32) { if ok { return } @@ -150,7 +165,7 @@ when ODIN_NO_RTTI { handle_error(file, line, column) } - type_assertion_check2 :: proc "contextless" (ok: bool, file: string, line, column: i32) { + type_assertion_check2_with_context :: proc "odin" (ok: bool, file: string, line, column: i32) { if ok { return } @@ -162,8 +177,53 @@ when ODIN_NO_RTTI { } handle_error(file, line, column) } + + type_assertion_check2_contextless :: proc "contextless" (ok: bool, file: string, line, column: i32) { + if ok { + return + } + @(cold, no_instrumentation) + handle_error :: proc "odin" (file: string, line, column: i32) -> ! { + p := context.assertion_failure_proc + if p == nil { + p = default_assertion_failure_proc + } + p("type assertion", "Invalid type assertion", Source_Code_Location{file, line, column, ""}) + } + handle_error(file, line, column) + } } else { - type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) { + @(private="file") + TYPE_ASSERTION_BUFFER_SIZE :: 1024 + + type_assertion_check_with_context :: proc "odin" (ok: bool, file: string, line, column: i32, from, to: typeid) { + if ok { + return + } + @(cold, no_instrumentation) + handle_error :: proc "odin" (file: string, line, column: i32, from, to: typeid) -> ! { + do_msg :: proc "contextless" (i: ^int, buf: []byte, file: string, line, column: i32, from, to: typeid) -> bool { + try_copy_string(i, buf, "Invalid type assertion from ") or_return + try_copy_typeid(i, buf, from) or_return + try_copy_string(i, buf, " to ") or_return + try_copy_typeid(i, buf, to) or_return + return true + } + + buf: [TYPE_ASSERTION_BUFFER_SIZE]byte + i := 0 + _ = do_msg(&i, buf[:], file, line, column, from, to) + + p := context.assertion_failure_proc + if p == nil { + p = default_assertion_failure_proc + } + p("type assertion", string(buf[:i]), Source_Code_Location{file, line, column, ""}) + } + handle_error(file, line, column, from, to) + } + + type_assertion_check_contextless :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) { if ok { return } @@ -180,42 +240,85 @@ when ODIN_NO_RTTI { handle_error(file, line, column, from, to) } - type_assertion_check2 :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) { + @(private="file") + type_assertion_variant_type :: proc "contextless" (id: typeid, data: rawptr) -> typeid { + if id == nil || data == nil { + return id + } + ti := type_info_base(type_info_of(id)) + #partial switch v in ti.variant { + case Type_Info_Any: + return (^any)(data).id + case Type_Info_Union: + if v.tag_type == nil { + if (^rawptr)(data)^ == nil { + return nil + } + return v.variants[0].id + + } + + tag_ptr := uintptr(data) + v.tag_offset + idx := 0 + switch v.tag_type.size { + case 1: idx = int( (^u8)(tag_ptr)^); if !v.no_nil { idx -= 1 } + case 2: idx = int( (^u16)(tag_ptr)^); if !v.no_nil { idx -= 1 } + case 4: idx = int( (^u32)(tag_ptr)^); if !v.no_nil { idx -= 1 } + case 8: idx = int( (^u64)(tag_ptr)^); if !v.no_nil { idx -= 1 } + case 16: idx = int((^u128)(tag_ptr)^); if !v.no_nil { idx -= 1 } + } + if idx < 0 { + return nil + } else if idx < len(v.variants) { + return v.variants[idx].id + } + } + return id + } + + type_assertion_check2_with_context :: proc "odin" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) { if ok { return } - variant_type :: proc "contextless" (id: typeid, data: rawptr) -> typeid { - if id == nil || data == nil { - return id - } - ti := type_info_base(type_info_of(id)) - #partial switch v in ti.variant { - case Type_Info_Any: - return (^any)(data).id - case Type_Info_Union: - tag_ptr := uintptr(data) + v.tag_offset - idx := 0 - switch v.tag_type.size { - case 1: idx = int((^u8)(tag_ptr)^) - 1 - case 2: idx = int((^u16)(tag_ptr)^) - 1 - case 4: idx = int((^u32)(tag_ptr)^) - 1 - case 8: idx = int((^u64)(tag_ptr)^) - 1 - case 16: idx = int((^u128)(tag_ptr)^) - 1 - } - if idx < 0 { - return nil - } else if idx < len(v.variants) { - return v.variants[idx].id + @(cold, no_instrumentation) + handle_error :: proc "odin" (file: string, line, column: i32, from, to: typeid, from_data: rawptr) -> ! { + do_msg :: proc "contextless" (i: ^int, buf: []byte, file: string, line, column: i32, from, to, actual: typeid) -> bool { + try_copy_string(i, buf, "Invalid type assertion from ") or_return + try_copy_typeid(i, buf, from) or_return + try_copy_string(i, buf, " to ") or_return + try_copy_typeid(i, buf, to) or_return + if actual != from { + try_copy_string(i, buf, ", actual type: ") or_return + try_copy_typeid(i, buf, actual) or_return } + return true } - return id + + actual := type_assertion_variant_type(from, from_data) + + buf: [TYPE_ASSERTION_BUFFER_SIZE]byte + i := 0 + _ = do_msg(&i, buf[:], file, line, column, from, to, actual) + + p := context.assertion_failure_proc + if p == nil { + p = default_assertion_failure_proc + } + p("type assertion", string(buf[:i]), Source_Code_Location{file, line, column, ""}) + } + handle_error(file, line, column, from, to, from_data) + } + + type_assertion_check2_contextless :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) { + if ok { + return } @(cold, no_instrumentation) handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid, from_data: rawptr) -> ! { - actual := variant_type(from, from_data) + actual := type_assertion_variant_type(from, from_data) print_caller_location(Source_Code_Location{file, line, column, ""}) print_string(" Invalid type assertion from ") diff --git a/base/runtime/print.odin b/base/runtime/print.odin index 4ef142037..4a66f9743 100644 --- a/base/runtime/print.odin +++ b/base/runtime/print.odin @@ -502,3 +502,334 @@ print_type :: #force_no_inline proc "contextless" (ti: ^Type_Info) { print_type(info.elem) } } + + +@(require_results) +try_copy_string :: proc "contextless" (i: ^int, dst: []byte, src: string) -> bool { + if i^ < len(dst) { + i^ += copy(dst[i^:], src) + return true + } + return false +} + + +@(require_results) +try_copy_byte :: proc "contextless" (i: ^int, dst: []byte, src: byte) -> bool { + if i^ < len(dst) { + dst[i^] = src + i^ += 1 + return true + } + return false +} + + +@(require_results) +try_copy_u64 :: proc "contextless" (j: ^int, dst: []byte, x: u64) -> bool { + if j^ < len(dst) { + b :: u64(10) + u := x + + a: [129]byte + i := len(a) + for u >= b { + i -= 1; a[i] = _INTEGER_DIGITS_VAR[u % b] + u /= b + } + i -= 1; a[i] = _INTEGER_DIGITS_VAR[u % b] + + return try_copy_string(j, dst, string(a[i:])) + } + return false +} + + +@(require_results) +try_copy_caller_location :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, loc: Source_Code_Location) -> bool { + try_copy_string(i, buf, loc.file_path) or_return + + when ODIN_ERROR_POS_STYLE == .Default { + try_copy_byte(i, buf, '(') or_return + try_copy_u64(i, buf, u64(loc.line)) or_return + if loc.column != 0 { + try_copy_byte(i, buf, ':') or_return + try_copy_u64(i, buf, u64(loc.column)) or_return + } + try_copy_byte(i, buf, ')') or_return + return true + } else when ODIN_ERROR_POS_STYLE == .Unix { + try_copy_byte(i, buf, ':') or_return + try_copy_u64(i, buf, u64(loc.line)) or_return + if loc.column != 0 { + try_copy_try_copy_bytetring(i, buf, ':') or_return + try_copy_u64(i, buf, u64(loc.column)) or_return + } + try_copy_byte(i, buf, ':') or_return + return true + } else { + #panic("unhandled ODIN_ERROR_POS_STYLE") + } +} + +@(require_results) +try_copy_typeid :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, id: typeid) -> bool { + when ODIN_NO_RTTI { + if id == nil { + try_copy_string(i, buf, "nil") or_return + } else { + try_copy_string(i, buf, "") or_return + } + } else { + if id == nil { + try_copy_string(i, buf, "nil") or_return + } else { + ti := type_info_of(id) + try_copy_write_type(i, buf, ti) or_return + } + } + return true +} + +@(optimization_mode="favor_size") +try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, ti: ^Type_Info) -> bool { + if ti == nil { + try_copy_string(i, buf, "nil") or_return + return true + } + + switch info in ti.variant { + case Type_Info_Named: + try_copy_string(i, buf, info.name) or_return + case Type_Info_Integer: + switch ti.id { + case int: try_copy_string(i, buf, "int") or_return + case uint: try_copy_string(i, buf, "uint") or_return + case uintptr: try_copy_string(i, buf, "uintptr") or_return + case: + try_copy_byte(i, buf, 'i' if info.signed else 'u') or_return + try_copy_u64(i, buf, u64(8*ti.size)) or_return + } + case Type_Info_Rune: + try_copy_string(i, buf, "rune") or_return + case Type_Info_Float: + try_copy_byte(i, buf, 'f') or_return + try_copy_u64(i, buf, u64(8*ti.size)) or_return + case Type_Info_Complex: + try_copy_string(i, buf, "complex") or_return + try_copy_u64(i, buf, u64(8*ti.size)) or_return + case Type_Info_Quaternion: + try_copy_string(i, buf, "quaternion") or_return + try_copy_u64(i, buf, u64(8*ti.size)) or_return + case Type_Info_String: + if info.is_cstring { + try_copy_byte(i, buf, 'c') or_return + } + try_copy_string(i, buf, "string") or_return + switch info.encoding { + case .UTF_8: /**/ + case .UTF_16: try_copy_string(i, buf, "16") or_return + } + case Type_Info_Boolean: + switch ti.id { + case bool: try_copy_string(i, buf, "bool") or_return + case: + try_copy_byte(i, buf, 'b') or_return + try_copy_u64(i, buf, u64(8*ti.size)) or_return + } + case Type_Info_Any: + try_copy_string(i, buf, "any") or_return + case Type_Info_Type_Id: + try_copy_string(i, buf, "typeid") or_return + + case Type_Info_Pointer: + if info.elem == nil { + try_copy_string(i, buf, "rawptr") or_return + } else { + try_copy_string(i, buf, "^") or_return + try_copy_write_type(i, buf, info.elem) or_return + } + case Type_Info_Multi_Pointer: + try_copy_string(i, buf, "[^]") or_return + try_copy_write_type(i, buf, info.elem) or_return + case Type_Info_Soa_Pointer: + try_copy_string(i, buf, "#soa ^") or_return + try_copy_write_type(i, buf, info.elem) or_return + case Type_Info_Procedure: + try_copy_string(i, buf, "proc") or_return + if info.params == nil { + try_copy_string(i, buf, "()") or_return + } else { + t := info.params.variant.(Type_Info_Parameters) + try_copy_byte(i, buf, '(') or_return + for t, j in t.types { + if j > 0 { try_copy_string(i, buf, ", ") or_return } + try_copy_write_type(i, buf, t) or_return + } + try_copy_string(i, buf, ")") or_return + } + if info.results != nil { + try_copy_string(i, buf, " -> ") or_return + try_copy_write_type(i, buf, info.results) or_return + } + case Type_Info_Parameters: + count := len(info.names) + if count != 1 { try_copy_byte(i, buf, '(') or_return } + for name, j in info.names { + if j > 0 { try_copy_string(i, buf, ", ") or_return } + + t := info.types[j] + + if len(name) > 0 { + try_copy_string(i, buf, name) or_return + try_copy_string(i, buf, ": ") or_return + } + try_copy_write_type(i, buf, t) or_return + } + if count != 1 { try_copy_string(i, buf, ")") or_return } + + case Type_Info_Array: + try_copy_byte(i, buf, '[') or_return + try_copy_u64(i, buf, u64(info.count)) or_return + try_copy_byte(i, buf, ']') or_return + try_copy_write_type(i, buf, info.elem) or_return + + case Type_Info_Enumerated_Array: + if info.is_sparse { + try_copy_string(i, buf, "#sparse") or_return + } + try_copy_byte(i, buf, '[') or_return + try_copy_write_type(i, buf, info.index) or_return + try_copy_byte(i, buf, ']') or_return + try_copy_write_type(i, buf, info.elem) or_return + + + case Type_Info_Dynamic_Array: + try_copy_string(i, buf, "[dynamic]") or_return + try_copy_write_type(i, buf, info.elem) or_return + case Type_Info_Slice: + try_copy_string(i, buf, "[]") or_return + try_copy_write_type(i, buf, info.elem) or_return + + case Type_Info_Map: + try_copy_string(i, buf, "map[") or_return + try_copy_write_type(i, buf, info.key) or_return + try_copy_byte(i, buf, ']') or_return + try_copy_write_type(i, buf, info.value) or_return + + case Type_Info_Struct: + switch info.soa_kind { + case .None: // Ignore + case .Fixed: + try_copy_string(i, buf, "#soa[") or_return + try_copy_u64(i, buf, u64(info.soa_len)) or_return + try_copy_byte(i, buf, ']') or_return + try_copy_write_type(i, buf, info.soa_base_type) or_return + return true + case .Slice: + try_copy_string(i, buf, "#soa[]") or_return + try_copy_write_type(i, buf, info.soa_base_type) or_return + return true + case .Dynamic: + try_copy_string(i, buf, "#soa[dynamic]") or_return + try_copy_write_type(i, buf, info.soa_base_type) or_return + return true + } + + try_copy_string(i, buf, "struct ") or_return + if .packed in info.flags { try_copy_string(i, buf, "#packed ") or_return } + if .raw_union in info.flags { try_copy_string(i, buf, "#raw_union ") or_return } + if .all_or_none in info.flags { try_copy_string(i, buf, "#all_or_none ") or_return } + if .align in info.flags { + try_copy_string(i, buf, "#align(") or_return + try_copy_u64(i, buf, u64(ti.align)) or_return + try_copy_string(i, buf, ") ") or_return + } + try_copy_byte(i, buf, '{') or_return + for name, j in info.names[:info.field_count] { + if j > 0 { try_copy_string(i, buf, ", ") or_return } + try_copy_string(i, buf, name) or_return + try_copy_string(i, buf, ": ") or_return + try_copy_write_type(i, buf, info.types[j]) or_return + } + try_copy_byte(i, buf, '}') or_return + + case Type_Info_Union: + try_copy_string(i, buf, "union ") or_return + if info.custom_align { + try_copy_string(i, buf, "#align(") or_return + try_copy_u64(i, buf, u64(ti.align)) or_return + try_copy_string(i, buf, ") ") or_return + } + if info.no_nil { + try_copy_string(i, buf, "#no_nil ") or_return + } + try_copy_byte(i, buf, '{') or_return + for variant, j in info.variants { + if j > 0 { try_copy_string(i, buf, ", ") or_return } + try_copy_write_type(i, buf, variant) or_return + } + try_copy_string(i, buf, "}") or_return + + case Type_Info_Enum: + try_copy_string(i, buf, "enum ") or_return + try_copy_write_type(i, buf, info.base) or_return + try_copy_string(i, buf, " {") or_return + for name, j in info.names { + if j > 0 { try_copy_string(i, buf, ", ") or_return } + try_copy_string(i, buf, name) or_return + } + try_copy_string(i, buf, "}") or_return + + case Type_Info_Bit_Set: + try_copy_string(i, buf, "bit_set[") or_return + + #partial switch elem in type_info_base(info.elem).variant { + case Type_Info_Enum: + try_copy_write_type(i, buf, info.elem) or_return + case Type_Info_Rune: + print_encoded_rune(rune(info.lower)) + try_copy_string(i, buf, "..") or_return + print_encoded_rune(rune(info.upper)) + case: + print_i64(info.lower) + try_copy_string(i, buf, "..") or_return + print_i64(info.upper) + } + if info.underlying != nil { + try_copy_string(i, buf, "; ") or_return + try_copy_write_type(i, buf, info.underlying) or_return + } + try_copy_byte(i, buf, ']') or_return + + case Type_Info_Bit_Field: + try_copy_string(i, buf, "bit_field ") or_return + try_copy_write_type(i, buf, info.backing_type) or_return + try_copy_string(i, buf, " {") or_return + for name, j in info.names[:info.field_count] { + if j > 0 { try_copy_string(i, buf, ", ") or_return } + try_copy_string(i, buf, name) or_return + try_copy_string(i, buf, ": ") or_return + try_copy_write_type(i, buf, info.types[j]) or_return + try_copy_string(i, buf, " | ") or_return + try_copy_u64(i, buf, u64(info.bit_sizes[j])) or_return + } + try_copy_byte(i, buf, '}') or_return + + + case Type_Info_Simd_Vector: + try_copy_string(i, buf, "#simd[") or_return + try_copy_u64(i, buf, u64(info.count)) or_return + try_copy_byte(i, buf, ']') or_return + try_copy_write_type(i, buf, info.elem) or_return + + case Type_Info_Matrix: + try_copy_string(i, buf, "matrix[") or_return + try_copy_u64(i, buf, u64(info.row_count)) or_return + try_copy_string(i, buf, ", ") or_return + try_copy_u64(i, buf, u64(info.column_count)) or_return + try_copy_string(i, buf, "]") or_return + try_copy_write_type(i, buf, info.elem) or_return + } + return true +} \ No newline at end of file diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 42a398597..7d2240fdf 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -11064,8 +11064,20 @@ gb_internal ExprKind check_type_assertion(CheckerContext *c, Operand *o, Ast *no end:; if ((c->state_flags & StateFlag_no_type_assert) == 0) { - add_package_dependency(c, "runtime", "type_assertion_check"); - add_package_dependency(c, "runtime", "type_assertion_check2"); + bool has_context = true; + if (c->proc_name.len == 0 && c->curr_proc_sig == nullptr) { + has_context = false; + } else if ((c->scope->flags & ScopeFlag_ContextDefined) == 0) { + has_context = false; + } + + if (has_context) { + add_package_dependency(c, "runtime", "type_assertion_check_with_context"); + add_package_dependency(c, "runtime", "type_assertion_check2_with_context"); + } else { + add_package_dependency(c, "runtime", "type_assertion_check_contextless"); + add_package_dependency(c, "runtime", "type_assertion_check2_contextless"); + } } return kind; } diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 3c7092a32..aba196af8 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -3865,7 +3865,12 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { args[4] = lb_typeid(p->module, src_type); args[5] = lb_typeid(p->module, dst_type); } - lb_emit_runtime_call(p, "type_assertion_check", args); + + char const *name = "type_assertion_check_contextless"; + if (p->context_stack.count > 0) { + name = "type_assertion_check_with_context"; + } + lb_emit_runtime_call(p, name, args); } lbValue data_ptr = v; @@ -3881,16 +3886,28 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { lbValue any_id = lb_emit_struct_ev(p, v, 1); + isize arg_count = 6; + if (build_context.no_rtti) { + arg_count = 4; + } + lbValue id = lb_typeid(p->module, type); lbValue ok = lb_emit_comp(p, Token_CmpEq, any_id, id); - auto args = array_make(permanent_allocator(), 6); + auto args = array_make(permanent_allocator(), arg_count); args[0] = ok; lb_set_file_line_col(p, array_slice(args, 1, args.count), pos); - args[4] = any_id; - args[5] = id; - lb_emit_runtime_call(p, "type_assertion_check", args); + if (!build_context.no_rtti) { + args[4] = any_id; + args[5] = id; + } + + char const *name = "type_assertion_check_contextless"; + if (p->context_stack.count > 0) { + name = "type_assertion_check_with_context"; + } + lb_emit_runtime_call(p, name, args); } return lb_emit_conv(p, data_ptr, tv.type); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 43cac70c1..929239486 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -803,7 +803,12 @@ gb_internal lbValue lb_emit_union_cast(lbProcedure *p, lbValue value, Type *type args[5] = lb_typeid(m, dst_type); args[6] = lb_emit_conv(p, value_, t_rawptr); } - lb_emit_runtime_call(p, "type_assertion_check2", args); + + char const *name = "type_assertion_check2_contextless"; + if (p->context_stack.count > 0) { + name = "type_assertion_check2_with_context"; + } + lb_emit_runtime_call(p, name, args); } return lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 0)); @@ -877,7 +882,11 @@ gb_internal lbAddr lb_emit_any_cast_addr(lbProcedure *p, lbValue value, Type *ty args[5] = dst_typeid; args[6] = lb_emit_struct_ev(p, value, 0); } - lb_emit_runtime_call(p, "type_assertion_check2", args); + char const *name = "type_assertion_check2_contextless"; + if (p->context_stack.count > 0) { + name = "type_assertion_check2_with_context"; + } + lb_emit_runtime_call(p, name, args); } return lb_addr(lb_emit_struct_ep(p, v.addr, 0)); From 96f1069e4a615e0857d9443fe5af639e3b2dd46a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 18:29:39 +0000 Subject: [PATCH 265/766] Fix `type_assertion_check2*` for `-no-rtti` --- base/runtime/error_checks.odin | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/base/runtime/error_checks.odin b/base/runtime/error_checks.odin index 79245fc0c..34f51ab8e 100644 --- a/base/runtime/error_checks.odin +++ b/base/runtime/error_checks.odin @@ -170,11 +170,14 @@ when ODIN_NO_RTTI { return } @(cold, no_instrumentation) - handle_error :: proc "contextless" (file: string, line, column: i32) -> ! { - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Invalid type assertion\n") - type_assertion_trap() + handle_error :: proc "odin" (file: string, line, column: i32) -> ! { + p := context.assertion_failure_proc + if p == nil { + p = default_assertion_failure_proc + } + p("type assertion", "Invalid type assertion", Source_Code_Location{file, line, column, ""}) } + handle_error(file, line, column) } @@ -183,12 +186,10 @@ when ODIN_NO_RTTI { return } @(cold, no_instrumentation) - handle_error :: proc "odin" (file: string, line, column: i32) -> ! { - p := context.assertion_failure_proc - if p == nil { - p = default_assertion_failure_proc - } - p("type assertion", "Invalid type assertion", Source_Code_Location{file, line, column, ""}) + handle_error :: proc "contextless" (file: string, line, column: i32) -> ! { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Invalid type assertion\n") + type_assertion_trap() } handle_error(file, line, column) } From b85f29d979ffbeb044bba644d43dd2e462a63008 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 18:31:04 +0000 Subject: [PATCH 266/766] Rename to `type_assertion_trap_contextless` --- base/runtime/error_checks.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/base/runtime/error_checks.odin b/base/runtime/error_checks.odin index 34f51ab8e..df6cb9485 100644 --- a/base/runtime/error_checks.odin +++ b/base/runtime/error_checks.odin @@ -12,7 +12,7 @@ bounds_trap :: proc "contextless" () -> ! { } @(no_instrumentation) -type_assertion_trap :: proc "contextless" () -> ! { +type_assertion_trap_contextless :: proc "contextless" () -> ! { when ODIN_OS == .Windows { windows_trap_type_assertion() } else when ODIN_OS == .Orca { @@ -160,7 +160,7 @@ when ODIN_NO_RTTI { handle_error :: proc "contextless" (file: string, line, column: i32) -> ! { print_caller_location(Source_Code_Location{file, line, column, ""}) print_string(" Invalid type assertion\n") - type_assertion_trap() + type_assertion_trap_contextless() } handle_error(file, line, column) } @@ -189,7 +189,7 @@ when ODIN_NO_RTTI { handle_error :: proc "contextless" (file: string, line, column: i32) -> ! { print_caller_location(Source_Code_Location{file, line, column, ""}) print_string(" Invalid type assertion\n") - type_assertion_trap() + type_assertion_trap_contextless() } handle_error(file, line, column) } @@ -236,7 +236,7 @@ when ODIN_NO_RTTI { print_string(" to ") print_typeid(to) print_byte('\n') - type_assertion_trap() + type_assertion_trap_contextless() } handle_error(file, line, column, from, to) } @@ -331,7 +331,7 @@ when ODIN_NO_RTTI { print_typeid(actual) } print_byte('\n') - type_assertion_trap() + type_assertion_trap_contextless() } handle_error(file, line, column, from, to, from_data) } From 27bd72c18a0c4ff36e8464df0232263a93a5372e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 19:15:40 +0000 Subject: [PATCH 267/766] Fix constant indexing within a call that doesn't exist --- src/check_expr.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 7d2240fdf..46455aacf 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -5192,6 +5192,11 @@ gb_internal ExactValue get_constant_field_single(CheckerContext *c, ExactValue v } } else { TypeAndValue index_tav = fv->field->tav; + if (index_tav.mode != Addressing_Constant) { + if (success_) *success_ = false; + if (finish_) *finish_ = true; + return empty_exact_value; + } GB_ASSERT(index_tav.mode == Addressing_Constant); ExactValue index_value = index_tav.value; if (is_type_enumerated_array(node->tav.type)) { From 7bdd0a80caed77ea27907b380788b6e764b81364 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 26 Jan 2026 19:31:37 +0000 Subject: [PATCH 268/766] Allow for `CONSTANT_TYPEID_ARRAY[idx]` to be used as a type in certain contexts --- src/check_type.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/check_type.cpp b/src/check_type.cpp index af07efd8f..4b8f7b6ac 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -3750,6 +3750,20 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T set_base_type(named_type, *type); return true; case_end; + + default: { + Operand o = {}; + check_expr_base(ctx, &o, e, nullptr); + + if (o.mode == Addressing_Constant && + o.value.kind == ExactValue_Typeid) { + Type *t = o.value.value_typeid; + if (t != nullptr && t != t_invalid) { + *type = t; + return true; + } + } + } } *type = t_invalid; From f4008e9c9db4070198270a4b203c00df174462f0 Mon Sep 17 00:00:00 2001 From: Jim Date: Mon, 26 Jan 2026 23:33:17 -0800 Subject: [PATCH 269/766] Fix issue #6176 Update RenderTextureRotated to accept a nil pointer for center point parameter --- vendor/sdl3/sdl3_render.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/sdl3/sdl3_render.odin b/vendor/sdl3/sdl3_render.odin index 9b2d4efd4..51abbf777 100644 --- a/vendor/sdl3/sdl3_render.odin +++ b/vendor/sdl3/sdl3_render.odin @@ -235,7 +235,7 @@ foreign lib { RenderFillRect :: proc(renderer: ^Renderer, rect: Maybe(^FRect)) -> bool --- RenderFillRects :: proc(renderer: ^Renderer, rects: [^]FRect, count: c.int) -> bool --- RenderTexture :: proc(renderer: ^Renderer, texture: ^Texture, srcrect, dstrect: Maybe(^FRect)) -> bool --- - RenderTextureRotated :: proc(renderer: ^Renderer, texture: ^Texture, srcrect, dstrect: Maybe(^FRect), angle: f64, #by_ptr center: FPoint, flip: FlipMode) -> bool --- + RenderTextureRotated :: proc(renderer: ^Renderer, texture: ^Texture, srcrect, dstrect: Maybe(^FRect), angle: f64, center: Maybe(^FPoint), flip: FlipMode) -> bool --- RenderTextureAffine :: proc(renderer: ^Renderer, texture: ^Texture, srcrect: Maybe(^FRect), origin, right, down: Maybe(^FPoint)) -> bool --- RenderTextureTiled :: proc(renderer: ^Renderer, texture: ^Texture, srcrect: Maybe(^FRect), scale: f32, dstrect: Maybe(^FRect)) -> bool --- RenderTexture9Grid :: proc(renderer: ^Renderer, texture: ^Texture, srcrect: Maybe(^FRect), left_width, right_width, top_height, bottom_height: f32, scale: f32, dstrect: Maybe(^FRect)) -> bool --- From 92bef4578100e1bd4ca2e2ab9479216d8efcf2d3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 27 Jan 2026 09:44:52 +0000 Subject: [PATCH 270/766] Fix #6183 --- src/check_builtin.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 929891826..e732d8ec3 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -5383,6 +5383,14 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As return false; } } + if (!are_types_identical(x.type, y.type)) { + gbString xts = type_to_string(x.type); + gbString yts = type_to_string(y.type); + error(x.expr, "Mismatched types for '%.*s', got %s vs %s", LIT(builtin_name), xts, yts); + gb_string_free(yts); + gb_string_free(xts); + return false; + } operand->mode = Addressing_Value; operand->type = make_optional_ok_type(default_type(x.type)); @@ -5426,6 +5434,14 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As return false; } } + if (!are_types_identical(x.type, y.type)) { + gbString xts = type_to_string(x.type); + gbString yts = type_to_string(y.type); + error(x.expr, "Mismatched types for '%.*s', got %s vs %s", LIT(builtin_name), xts, yts); + gb_string_free(yts); + gb_string_free(xts); + return false; + } operand->mode = Addressing_Value; operand->type = default_type(x.type); From 9084d7e99b5679ba25c3dcc0f5f859939b76cc5d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 27 Jan 2026 12:27:35 +0000 Subject: [PATCH 271/766] Fix #6173 --- core/sys/linux/bits.odin | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index 2ca7558a2..9ce352bf6 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -449,7 +449,7 @@ FLock_Type :: enum i16 { /* Bits for FD_Notifications */ -FD_Notifications_Bits :: enum { +FD_Notifications_Bits :: enum i32 { ACCESS = 0, MODIFY = 1, CREATE = 2, @@ -1690,17 +1690,17 @@ IPC_Cmd :: enum i16 { /* File locking operation bits */ -FLock_Op_Bits :: enum { - SH = 1, - EX = 2, - NB = 4, - UN = 8, +FLock_Op_Bits :: enum i32 { + SH = 0, + EX = 1, + NB = 2, + UN = 3, } /* ptrace requests */ -PTrace_Request :: enum { +PTrace_Request :: enum i32 { TRACEME = 0, PEEKTEXT = 1, PEEKDATA = 2, @@ -1747,7 +1747,7 @@ PTrace_Request :: enum { /* ptrace options */ -PTrace_Options_Bits :: enum { +PTrace_Options_Bits :: enum i32 { TRACESYSGOOD = 0, TRACEFORK = 1, TRACEVFORK = 2, From 22ef6ae8c616ffdb2ce980dbbcc3f9eb3f9b3ff9 Mon Sep 17 00:00:00 2001 From: Leo Zurbriggen Date: Tue, 27 Jan 2026 18:11:09 +0100 Subject: [PATCH 272/766] add windows.ReadDirectoryChangesExW --- core/sys/windows/kernel32.odin | 11 +++++++++++ core/sys/windows/types.odin | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 07f34bed2..0309ff16f 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -474,6 +474,17 @@ foreign kernel32 { lpOverlapped: LPOVERLAPPED, lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE, ) -> BOOL --- + ReadDirectoryChangesExW :: proc( + hDirectory: HANDLE, + lpBuffer: LPVOID, + nBufferLength: DWORD, + bWatchSubtree: BOOL, + dwNotifyFilter: DWORD, + lpBytesReturned: LPDWORD, + lpOverlapped: LPOVERLAPPED, + lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE, + ReadDirectoryNotifyInformationClass: READ_DIRECTORY_NOTIFY_INFORMATION_CLASS, + ) -> BOOL --- FindFirstChangeNotificationW :: proc( lpPathName: LPWSTR, bWatchSubtree: BOOL, diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index f3f581844..f9e9764e2 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -3176,6 +3176,13 @@ LPOVERLAPPED_COMPLETION_ROUTINE :: #type proc "system" ( lpOverlapped: LPOVERLAPPED, ) +READ_DIRECTORY_NOTIFY_INFORMATION_CLASS :: enum c_int { + ReadDirectoryNotifyInformation = 1, + ReadDirectoryNotifyExtendedInformation, + ReadDirectoryNotifyFullInformation, + ReadDirectoryNotifyMaximumInformation, +} + ADDRESS_MODE :: enum c_int { AddrMode1616, AddrMode1632, From 117e74cb8b74b3eec567e16533cc269bd873bd89 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 28 Jan 2026 11:43:29 +0000 Subject: [PATCH 273/766] Fix typo in `try_copy_caller_location` --- base/runtime/print.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/base/runtime/print.odin b/base/runtime/print.odin index 4a66f9743..c1b04f7cd 100644 --- a/base/runtime/print.odin +++ b/base/runtime/print.odin @@ -562,8 +562,8 @@ try_copy_caller_location :: #force_no_inline proc "contextless" (i: ^int, buf: [ try_copy_byte(i, buf, ':') or_return try_copy_u64(i, buf, u64(loc.line)) or_return if loc.column != 0 { - try_copy_try_copy_bytetring(i, buf, ':') or_return - try_copy_u64(i, buf, u64(loc.column)) or_return + try_copy_byte(i, buf, ':') or_return + try_copy_u64 (i, buf, u64(loc.column)) or_return } try_copy_byte(i, buf, ':') or_return return true From 0d8b1481eaf2d0e2eaa12320da52397a41f285aa Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 28 Jan 2026 11:53:40 +0000 Subject: [PATCH 274/766] Improve `try_copy_*` logic --- base/runtime/print.odin | 246 ++++++++++++++++++++++++++++------------ 1 file changed, 172 insertions(+), 74 deletions(-) diff --git a/base/runtime/print.odin b/base/runtime/print.odin index c1b04f7cd..cc51394c8 100644 --- a/base/runtime/print.odin +++ b/base/runtime/print.odin @@ -280,11 +280,22 @@ print_type :: #force_no_inline proc "contextless" (ti: ^Type_Info) { print_byte('i' if info.signed else 'u') print_u64(u64(8*ti.size)) } + switch info.endianness { + case .Platform: // nothing + case .Little: print_string("le") + case .Big: print_string("be") + } + case Type_Info_Rune: print_string("rune") case Type_Info_Float: print_byte('f') print_u64(u64(8*ti.size)) + switch info.endianness { + case .Platform: // nothing + case .Little: print_string("le") + case .Big: print_string("be") + } case Type_Info_Complex: print_string("complex") print_u64(u64(8*ti.size)) @@ -494,6 +505,9 @@ print_type :: #force_no_inline proc "contextless" (ti: ^Type_Info) { print_type(info.elem) case Type_Info_Matrix: + if info.layout == .Row_Major { + print_string("#row_major ") + } print_string("matrix[") print_u64(u64(info.row_count)) print_string(", ") @@ -544,25 +558,48 @@ try_copy_u64 :: proc "contextless" (j: ^int, dst: []byte, x: u64) -> bool { return false } +@(require_results) +try_copy_i64 :: proc "contextless" (j: ^int, dst: []byte, x: i64) -> bool { + if j^ < len(dst) { + b :: u64(10) + u := u64(abs(x)) + neg := x < 0 + + a: [129]byte + i := len(a) + for u >= b { + i -= 1; a[i] = _INTEGER_DIGITS_VAR[u % b] + u /= b + } + i -= 1; a[i] = _INTEGER_DIGITS_VAR[u % b] + if neg { + i -= 1; a[i] = '-' + } + + return try_copy_string(j, dst, string(a[i:])) + } + return false +} + @(require_results) try_copy_caller_location :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, loc: Source_Code_Location) -> bool { try_copy_string(i, buf, loc.file_path) or_return when ODIN_ERROR_POS_STYLE == .Default { - try_copy_byte(i, buf, '(') or_return - try_copy_u64(i, buf, u64(loc.line)) or_return + try_copy_byte(i, buf, '(') or_return + try_copy_u64 (i, buf, u64(loc.line)) or_return if loc.column != 0 { - try_copy_byte(i, buf, ':') or_return - try_copy_u64(i, buf, u64(loc.column)) or_return + try_copy_byte(i, buf, ':') or_return + try_copy_u64 (i, buf, u64(loc.column)) or_return } try_copy_byte(i, buf, ')') or_return return true } else when ODIN_ERROR_POS_STYLE == .Unix { - try_copy_byte(i, buf, ':') or_return - try_copy_u64(i, buf, u64(loc.line)) or_return + try_copy_byte(i, buf, ':') or_return + try_copy_u64 (i, buf, u64(loc.line)) or_return if loc.column != 0 { - try_copy_byte(i, buf, ':') or_return + try_copy_byte(i, buf, ':') or_return try_copy_u64 (i, buf, u64(loc.column)) or_return } try_copy_byte(i, buf, ':') or_return @@ -591,6 +628,52 @@ try_copy_typeid :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, id return true } + +@(require_results) +try_copy_rune :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, r: rune) -> (written: int, ok: bool) #no_bounds_check { + RUNE_SELF :: 0x80 + + if r < RUNE_SELF { + try_copy_byte(i, buf,byte(r)) or_return + return 1, true + } + + b, n := encode_rune(r) + prev := i^ + try_copy_string(i, buf, string(b[:n])) or_return + return i^ - prev, true +} + +@(require_results) +try_copy_encoded_rune :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, r: rune) -> bool { + try_copy_byte(i, buf, '\'') or_return + + switch r { + case '\a': try_copy_string(i, buf, "\\a") or_return + case '\b': try_copy_string(i, buf, "\\b") or_return + case '\e': try_copy_string(i, buf, "\\e") or_return + case '\f': try_copy_string(i, buf, "\\f") or_return + case '\n': try_copy_string(i, buf, "\\n") or_return + case '\r': try_copy_string(i, buf, "\\r") or_return + case '\t': try_copy_string(i, buf, "\\t") or_return + case '\v': try_copy_string(i, buf, "\\v") or_return + case: + if r <= 0 { + try_copy_string(i, buf, "\\x00") or_return + } else if r < 32 { + n0, n1 := u8(r) >> 4, u8(r) & 0xf + try_copy_string(i, buf, "\\x") or_return + try_copy_byte (i, buf, _INTEGER_DIGITS_VAR[n0]) or_return + try_copy_byte (i, buf, _INTEGER_DIGITS_VAR[n1]) or_return + } else { + _ = try_copy_rune(i, buf, r) or_return + } + } + + try_copy_byte(i, buf, '\'') or_return + return true +} + @(optimization_mode="favor_size") try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, ti: ^Type_Info) -> bool { if ti == nil { @@ -603,24 +686,36 @@ try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte try_copy_string(i, buf, info.name) or_return case Type_Info_Integer: switch ti.id { - case int: try_copy_string(i, buf, "int") or_return - case uint: try_copy_string(i, buf, "uint") or_return + case int: try_copy_string(i, buf, "int") or_return + case uint: try_copy_string(i, buf, "uint") or_return case uintptr: try_copy_string(i, buf, "uintptr") or_return case: try_copy_byte(i, buf, 'i' if info.signed else 'u') or_return - try_copy_u64(i, buf, u64(8*ti.size)) or_return + try_copy_u64 (i, buf, u64(8*ti.size)) or_return } + switch info.endianness { + case .Platform: // nothing + case .Little: try_copy_string(i, buf, "le") or_return + case .Big: try_copy_string(i, buf, "be") or_return + } + case Type_Info_Rune: try_copy_string(i, buf, "rune") or_return case Type_Info_Float: try_copy_byte(i, buf, 'f') or_return try_copy_u64(i, buf, u64(8*ti.size)) or_return + switch info.endianness { + case .Platform: // nothing + case .Little: try_copy_string(i, buf, "le") or_return + case .Big: try_copy_string(i, buf, "be") or_return + } + case Type_Info_Complex: - try_copy_string(i, buf, "complex") or_return - try_copy_u64(i, buf, u64(8*ti.size)) or_return + try_copy_string(i, buf, "complex") or_return + try_copy_u64 (i, buf, u64(8*ti.size)) or_return case Type_Info_Quaternion: - try_copy_string(i, buf, "quaternion") or_return - try_copy_u64(i, buf, u64(8*ti.size)) or_return + try_copy_string(i, buf, "quaternion") or_return + try_copy_u64 (i, buf, u64(8*ti.size)) or_return case Type_Info_String: if info.is_cstring { try_copy_byte(i, buf, 'c') or_return @@ -634,8 +729,8 @@ try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte switch ti.id { case bool: try_copy_string(i, buf, "bool") or_return case: - try_copy_byte(i, buf, 'b') or_return - try_copy_u64(i, buf, u64(8*ti.size)) or_return + try_copy_byte(i, buf, 'b') or_return + try_copy_u64 (i, buf, u64(8*ti.size)) or_return } case Type_Info_Any: try_copy_string(i, buf, "any") or_return @@ -646,14 +741,14 @@ try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte if info.elem == nil { try_copy_string(i, buf, "rawptr") or_return } else { - try_copy_string(i, buf, "^") or_return + try_copy_string (i, buf, "^") or_return try_copy_write_type(i, buf, info.elem) or_return } case Type_Info_Multi_Pointer: - try_copy_string(i, buf, "[^]") or_return + try_copy_string (i, buf, "[^]") or_return try_copy_write_type(i, buf, info.elem) or_return case Type_Info_Soa_Pointer: - try_copy_string(i, buf, "#soa ^") or_return + try_copy_string (i, buf, "#soa ^") or_return try_copy_write_type(i, buf, info.elem) or_return case Type_Info_Procedure: try_copy_string(i, buf, "proc") or_return @@ -669,7 +764,7 @@ try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte try_copy_string(i, buf, ")") or_return } if info.results != nil { - try_copy_string(i, buf, " -> ") or_return + try_copy_string (i, buf, " -> ") or_return try_copy_write_type(i, buf, info.results) or_return } case Type_Info_Parameters: @@ -689,67 +784,67 @@ try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte if count != 1 { try_copy_string(i, buf, ")") or_return } case Type_Info_Array: - try_copy_byte(i, buf, '[') or_return - try_copy_u64(i, buf, u64(info.count)) or_return - try_copy_byte(i, buf, ']') or_return - try_copy_write_type(i, buf, info.elem) or_return + try_copy_byte (i, buf, '[') or_return + try_copy_u64 (i, buf, u64(info.count)) or_return + try_copy_byte (i, buf, ']') or_return + try_copy_write_type(i, buf, info.elem) or_return case Type_Info_Enumerated_Array: if info.is_sparse { try_copy_string(i, buf, "#sparse") or_return } - try_copy_byte(i, buf, '[') or_return + try_copy_byte (i, buf, '[') or_return try_copy_write_type(i, buf, info.index) or_return - try_copy_byte(i, buf, ']') or_return - try_copy_write_type(i, buf, info.elem) or_return + try_copy_byte (i, buf, ']') or_return + try_copy_write_type(i, buf, info.elem) or_return case Type_Info_Dynamic_Array: - try_copy_string(i, buf, "[dynamic]") or_return - try_copy_write_type(i, buf, info.elem) or_return + try_copy_string (i, buf, "[dynamic]") or_return + try_copy_write_type(i, buf, info.elem) or_return case Type_Info_Slice: - try_copy_string(i, buf, "[]") or_return + try_copy_string (i, buf, "[]") or_return try_copy_write_type(i, buf, info.elem) or_return case Type_Info_Map: - try_copy_string(i, buf, "map[") or_return - try_copy_write_type(i, buf, info.key) or_return - try_copy_byte(i, buf, ']') or_return + try_copy_string (i, buf, "map[") or_return + try_copy_write_type(i, buf, info.key) or_return + try_copy_byte (i, buf, ']') or_return try_copy_write_type(i, buf, info.value) or_return case Type_Info_Struct: switch info.soa_kind { case .None: // Ignore case .Fixed: - try_copy_string(i, buf, "#soa[") or_return - try_copy_u64(i, buf, u64(info.soa_len)) or_return - try_copy_byte(i, buf, ']') or_return + try_copy_string (i, buf, "#soa[") or_return + try_copy_u64 (i, buf, u64(info.soa_len)) or_return + try_copy_byte (i, buf, ']') or_return try_copy_write_type(i, buf, info.soa_base_type) or_return return true case .Slice: - try_copy_string(i, buf, "#soa[]") or_return + try_copy_string (i, buf, "#soa[]") or_return try_copy_write_type(i, buf, info.soa_base_type) or_return return true case .Dynamic: - try_copy_string(i, buf, "#soa[dynamic]") or_return + try_copy_string (i, buf, "#soa[dynamic]") or_return try_copy_write_type(i, buf, info.soa_base_type) or_return return true } try_copy_string(i, buf, "struct ") or_return - if .packed in info.flags { try_copy_string(i, buf, "#packed ") or_return } - if .raw_union in info.flags { try_copy_string(i, buf, "#raw_union ") or_return } + if .packed in info.flags { try_copy_string(i, buf, "#packed ") or_return } + if .raw_union in info.flags { try_copy_string(i, buf, "#raw_union ") or_return } if .all_or_none in info.flags { try_copy_string(i, buf, "#all_or_none ") or_return } if .align in info.flags { - try_copy_string(i, buf, "#align(") or_return - try_copy_u64(i, buf, u64(ti.align)) or_return - try_copy_string(i, buf, ") ") or_return + try_copy_string(i, buf, "#align(") or_return + try_copy_u64(i, buf, u64(ti.align)) or_return + try_copy_string(i, buf, ") ") or_return } try_copy_byte(i, buf, '{') or_return for name, j in info.names[:info.field_count] { if j > 0 { try_copy_string(i, buf, ", ") or_return } - try_copy_string(i, buf, name) or_return - try_copy_string(i, buf, ": ") or_return + try_copy_string (i, buf, name) or_return + try_copy_string (i, buf, ": ") or_return try_copy_write_type(i, buf, info.types[j]) or_return } try_copy_byte(i, buf, '}') or_return @@ -757,9 +852,9 @@ try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte case Type_Info_Union: try_copy_string(i, buf, "union ") or_return if info.custom_align { - try_copy_string(i, buf, "#align(") or_return - try_copy_u64(i, buf, u64(ti.align)) or_return - try_copy_string(i, buf, ") ") or_return + try_copy_string(i, buf, "#align(") or_return + try_copy_u64 (i, buf, u64(ti.align)) or_return + try_copy_string(i, buf, ") ") or_return } if info.no_nil { try_copy_string(i, buf, "#no_nil ") or_return @@ -772,9 +867,9 @@ try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte try_copy_string(i, buf, "}") or_return case Type_Info_Enum: - try_copy_string(i, buf, "enum ") or_return + try_copy_string (i, buf, "enum ") or_return try_copy_write_type(i, buf, info.base) or_return - try_copy_string(i, buf, " {") or_return + try_copy_string (i, buf, " {") or_return for name, j in info.names { if j > 0 { try_copy_string(i, buf, ", ") or_return } try_copy_string(i, buf, name) or_return @@ -788,48 +883,51 @@ try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte case Type_Info_Enum: try_copy_write_type(i, buf, info.elem) or_return case Type_Info_Rune: - print_encoded_rune(rune(info.lower)) - try_copy_string(i, buf, "..") or_return - print_encoded_rune(rune(info.upper)) + try_copy_encoded_rune(i, buf, rune(info.lower)) or_return + try_copy_string (i, buf, "..") or_return + try_copy_encoded_rune(i, buf, rune(info.upper)) or_return case: - print_i64(info.lower) - try_copy_string(i, buf, "..") or_return - print_i64(info.upper) + try_copy_i64 (i, buf, info.lower) or_return + try_copy_string(i, buf, "..") or_return + try_copy_i64 (i, buf, info.upper) or_return } if info.underlying != nil { - try_copy_string(i, buf, "; ") or_return + try_copy_string (i, buf, "; ") or_return try_copy_write_type(i, buf, info.underlying) or_return } try_copy_byte(i, buf, ']') or_return case Type_Info_Bit_Field: - try_copy_string(i, buf, "bit_field ") or_return + try_copy_string (i, buf, "bit_field ") or_return try_copy_write_type(i, buf, info.backing_type) or_return - try_copy_string(i, buf, " {") or_return + try_copy_string (i, buf, " {") or_return for name, j in info.names[:info.field_count] { if j > 0 { try_copy_string(i, buf, ", ") or_return } - try_copy_string(i, buf, name) or_return - try_copy_string(i, buf, ": ") or_return - try_copy_write_type(i, buf, info.types[j]) or_return - try_copy_string(i, buf, " | ") or_return - try_copy_u64(i, buf, u64(info.bit_sizes[j])) or_return + try_copy_string (i, buf, name) or_return + try_copy_string (i, buf, ": ") or_return + try_copy_write_type(i, buf, info.types[j]) or_return + try_copy_string (i, buf, " | ") or_return + try_copy_u64 (i, buf, u64(info.bit_sizes[j])) or_return } try_copy_byte(i, buf, '}') or_return case Type_Info_Simd_Vector: - try_copy_string(i, buf, "#simd[") or_return - try_copy_u64(i, buf, u64(info.count)) or_return - try_copy_byte(i, buf, ']') or_return - try_copy_write_type(i, buf, info.elem) or_return + try_copy_string (i, buf, "#simd[") or_return + try_copy_u64 (i, buf, u64(info.count)) or_return + try_copy_byte (i, buf, ']') or_return + try_copy_write_type(i, buf, info.elem) or_return case Type_Info_Matrix: - try_copy_string(i, buf, "matrix[") or_return - try_copy_u64(i, buf, u64(info.row_count)) or_return - try_copy_string(i, buf, ", ") or_return - try_copy_u64(i, buf, u64(info.column_count)) or_return - try_copy_string(i, buf, "]") or_return - try_copy_write_type(i, buf, info.elem) or_return + if info.layout == .Row_Major { + try_copy_string(i, buf, "#row_major ") or_return + } + try_copy_string (i, buf, "matrix[") or_return + try_copy_u64 (i, buf, u64(info.row_count)) or_return + try_copy_string (i, buf, ", ") or_return + try_copy_u64 (i, buf, u64(info.column_count)) or_return + try_copy_string (i, buf, "]") or_return + try_copy_write_type(i, buf, info.elem) or_return } return true } \ No newline at end of file From 7135bbdd67514d80739d1e9ee9dd41be9d5488f1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 28 Jan 2026 11:54:17 +0000 Subject: [PATCH 275/766] Rename `try_copy_*` to `write_*` --- base/runtime/error_checks.odin | 20 +- base/runtime/print.odin | 350 ++++++++++++++++----------------- 2 files changed, 185 insertions(+), 185 deletions(-) diff --git a/base/runtime/error_checks.odin b/base/runtime/error_checks.odin index df6cb9485..46a8f9b1d 100644 --- a/base/runtime/error_checks.odin +++ b/base/runtime/error_checks.odin @@ -204,10 +204,10 @@ when ODIN_NO_RTTI { @(cold, no_instrumentation) handle_error :: proc "odin" (file: string, line, column: i32, from, to: typeid) -> ! { do_msg :: proc "contextless" (i: ^int, buf: []byte, file: string, line, column: i32, from, to: typeid) -> bool { - try_copy_string(i, buf, "Invalid type assertion from ") or_return - try_copy_typeid(i, buf, from) or_return - try_copy_string(i, buf, " to ") or_return - try_copy_typeid(i, buf, to) or_return + write_string(i, buf, "Invalid type assertion from ") or_return + write_typeid(i, buf, from) or_return + write_string(i, buf, " to ") or_return + write_typeid(i, buf, to) or_return return true } @@ -285,13 +285,13 @@ when ODIN_NO_RTTI { @(cold, no_instrumentation) handle_error :: proc "odin" (file: string, line, column: i32, from, to: typeid, from_data: rawptr) -> ! { do_msg :: proc "contextless" (i: ^int, buf: []byte, file: string, line, column: i32, from, to, actual: typeid) -> bool { - try_copy_string(i, buf, "Invalid type assertion from ") or_return - try_copy_typeid(i, buf, from) or_return - try_copy_string(i, buf, " to ") or_return - try_copy_typeid(i, buf, to) or_return + write_string(i, buf, "Invalid type assertion from ") or_return + write_typeid(i, buf, from) or_return + write_string(i, buf, " to ") or_return + write_typeid(i, buf, to) or_return if actual != from { - try_copy_string(i, buf, ", actual type: ") or_return - try_copy_typeid(i, buf, actual) or_return + write_string(i, buf, ", actual type: ") or_return + write_typeid(i, buf, actual) or_return } return true } diff --git a/base/runtime/print.odin b/base/runtime/print.odin index cc51394c8..2deb0f4b1 100644 --- a/base/runtime/print.odin +++ b/base/runtime/print.odin @@ -519,7 +519,7 @@ print_type :: #force_no_inline proc "contextless" (ti: ^Type_Info) { @(require_results) -try_copy_string :: proc "contextless" (i: ^int, dst: []byte, src: string) -> bool { +write_string :: proc "contextless" (i: ^int, dst: []byte, src: string) -> bool { if i^ < len(dst) { i^ += copy(dst[i^:], src) return true @@ -529,7 +529,7 @@ try_copy_string :: proc "contextless" (i: ^int, dst: []byte, src: string) -> boo @(require_results) -try_copy_byte :: proc "contextless" (i: ^int, dst: []byte, src: byte) -> bool { +write_byte :: proc "contextless" (i: ^int, dst: []byte, src: byte) -> bool { if i^ < len(dst) { dst[i^] = src i^ += 1 @@ -540,7 +540,7 @@ try_copy_byte :: proc "contextless" (i: ^int, dst: []byte, src: byte) -> bool { @(require_results) -try_copy_u64 :: proc "contextless" (j: ^int, dst: []byte, x: u64) -> bool { +write_u64 :: proc "contextless" (j: ^int, dst: []byte, x: u64) -> bool { if j^ < len(dst) { b :: u64(10) u := x @@ -553,13 +553,13 @@ try_copy_u64 :: proc "contextless" (j: ^int, dst: []byte, x: u64) -> bool { } i -= 1; a[i] = _INTEGER_DIGITS_VAR[u % b] - return try_copy_string(j, dst, string(a[i:])) + return write_string(j, dst, string(a[i:])) } return false } @(require_results) -try_copy_i64 :: proc "contextless" (j: ^int, dst: []byte, x: i64) -> bool { +write_i64 :: proc "contextless" (j: ^int, dst: []byte, x: i64) -> bool { if j^ < len(dst) { b :: u64(10) u := u64(abs(x)) @@ -576,33 +576,33 @@ try_copy_i64 :: proc "contextless" (j: ^int, dst: []byte, x: i64) -> bool { i -= 1; a[i] = '-' } - return try_copy_string(j, dst, string(a[i:])) + return write_string(j, dst, string(a[i:])) } return false } @(require_results) -try_copy_caller_location :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, loc: Source_Code_Location) -> bool { - try_copy_string(i, buf, loc.file_path) or_return +write_caller_location :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, loc: Source_Code_Location) -> bool { + write_string(i, buf, loc.file_path) or_return when ODIN_ERROR_POS_STYLE == .Default { - try_copy_byte(i, buf, '(') or_return - try_copy_u64 (i, buf, u64(loc.line)) or_return + write_byte(i, buf, '(') or_return + write_u64 (i, buf, u64(loc.line)) or_return if loc.column != 0 { - try_copy_byte(i, buf, ':') or_return - try_copy_u64 (i, buf, u64(loc.column)) or_return + write_byte(i, buf, ':') or_return + write_u64 (i, buf, u64(loc.column)) or_return } - try_copy_byte(i, buf, ')') or_return + write_byte(i, buf, ')') or_return return true } else when ODIN_ERROR_POS_STYLE == .Unix { - try_copy_byte(i, buf, ':') or_return - try_copy_u64 (i, buf, u64(loc.line)) or_return + write_byte(i, buf, ':') or_return + write_u64 (i, buf, u64(loc.line)) or_return if loc.column != 0 { - try_copy_byte(i, buf, ':') or_return - try_copy_u64 (i, buf, u64(loc.column)) or_return + write_byte(i, buf, ':') or_return + write_u64 (i, buf, u64(loc.column)) or_return } - try_copy_byte(i, buf, ':') or_return + write_byte(i, buf, ':') or_return return true } else { #panic("unhandled ODIN_ERROR_POS_STYLE") @@ -610,19 +610,19 @@ try_copy_caller_location :: #force_no_inline proc "contextless" (i: ^int, buf: [ } @(require_results) -try_copy_typeid :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, id: typeid) -> bool { +write_typeid :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, id: typeid) -> bool { when ODIN_NO_RTTI { if id == nil { - try_copy_string(i, buf, "nil") or_return + write_string(i, buf, "nil") or_return } else { - try_copy_string(i, buf, "") or_return + write_string(i, buf, "") or_return } } else { if id == nil { - try_copy_string(i, buf, "nil") or_return + write_string(i, buf, "nil") or_return } else { ti := type_info_of(id) - try_copy_write_type(i, buf, ti) or_return + write_write_type(i, buf, ti) or_return } } return true @@ -630,304 +630,304 @@ try_copy_typeid :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, id @(require_results) -try_copy_rune :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, r: rune) -> (written: int, ok: bool) #no_bounds_check { +write_rune :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, r: rune) -> (written: int, ok: bool) #no_bounds_check { RUNE_SELF :: 0x80 if r < RUNE_SELF { - try_copy_byte(i, buf,byte(r)) or_return + write_byte(i, buf,byte(r)) or_return return 1, true } b, n := encode_rune(r) prev := i^ - try_copy_string(i, buf, string(b[:n])) or_return + write_string(i, buf, string(b[:n])) or_return return i^ - prev, true } @(require_results) -try_copy_encoded_rune :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, r: rune) -> bool { - try_copy_byte(i, buf, '\'') or_return +write_encoded_rune :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, r: rune) -> bool { + write_byte(i, buf, '\'') or_return switch r { - case '\a': try_copy_string(i, buf, "\\a") or_return - case '\b': try_copy_string(i, buf, "\\b") or_return - case '\e': try_copy_string(i, buf, "\\e") or_return - case '\f': try_copy_string(i, buf, "\\f") or_return - case '\n': try_copy_string(i, buf, "\\n") or_return - case '\r': try_copy_string(i, buf, "\\r") or_return - case '\t': try_copy_string(i, buf, "\\t") or_return - case '\v': try_copy_string(i, buf, "\\v") or_return + case '\a': write_string(i, buf, "\\a") or_return + case '\b': write_string(i, buf, "\\b") or_return + case '\e': write_string(i, buf, "\\e") or_return + case '\f': write_string(i, buf, "\\f") or_return + case '\n': write_string(i, buf, "\\n") or_return + case '\r': write_string(i, buf, "\\r") or_return + case '\t': write_string(i, buf, "\\t") or_return + case '\v': write_string(i, buf, "\\v") or_return case: if r <= 0 { - try_copy_string(i, buf, "\\x00") or_return + write_string(i, buf, "\\x00") or_return } else if r < 32 { n0, n1 := u8(r) >> 4, u8(r) & 0xf - try_copy_string(i, buf, "\\x") or_return - try_copy_byte (i, buf, _INTEGER_DIGITS_VAR[n0]) or_return - try_copy_byte (i, buf, _INTEGER_DIGITS_VAR[n1]) or_return + write_string(i, buf, "\\x") or_return + write_byte (i, buf, _INTEGER_DIGITS_VAR[n0]) or_return + write_byte (i, buf, _INTEGER_DIGITS_VAR[n1]) or_return } else { - _ = try_copy_rune(i, buf, r) or_return + _ = write_rune(i, buf, r) or_return } } - try_copy_byte(i, buf, '\'') or_return + write_byte(i, buf, '\'') or_return return true } @(optimization_mode="favor_size") -try_copy_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, ti: ^Type_Info) -> bool { +write_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, ti: ^Type_Info) -> bool { if ti == nil { - try_copy_string(i, buf, "nil") or_return + write_string(i, buf, "nil") or_return return true } switch info in ti.variant { case Type_Info_Named: - try_copy_string(i, buf, info.name) or_return + write_string(i, buf, info.name) or_return case Type_Info_Integer: switch ti.id { - case int: try_copy_string(i, buf, "int") or_return - case uint: try_copy_string(i, buf, "uint") or_return - case uintptr: try_copy_string(i, buf, "uintptr") or_return + case int: write_string(i, buf, "int") or_return + case uint: write_string(i, buf, "uint") or_return + case uintptr: write_string(i, buf, "uintptr") or_return case: - try_copy_byte(i, buf, 'i' if info.signed else 'u') or_return - try_copy_u64 (i, buf, u64(8*ti.size)) or_return + write_byte(i, buf, 'i' if info.signed else 'u') or_return + write_u64 (i, buf, u64(8*ti.size)) or_return } switch info.endianness { case .Platform: // nothing - case .Little: try_copy_string(i, buf, "le") or_return - case .Big: try_copy_string(i, buf, "be") or_return + case .Little: write_string(i, buf, "le") or_return + case .Big: write_string(i, buf, "be") or_return } case Type_Info_Rune: - try_copy_string(i, buf, "rune") or_return + write_string(i, buf, "rune") or_return case Type_Info_Float: - try_copy_byte(i, buf, 'f') or_return - try_copy_u64(i, buf, u64(8*ti.size)) or_return + write_byte(i, buf, 'f') or_return + write_u64(i, buf, u64(8*ti.size)) or_return switch info.endianness { case .Platform: // nothing - case .Little: try_copy_string(i, buf, "le") or_return - case .Big: try_copy_string(i, buf, "be") or_return + case .Little: write_string(i, buf, "le") or_return + case .Big: write_string(i, buf, "be") or_return } case Type_Info_Complex: - try_copy_string(i, buf, "complex") or_return - try_copy_u64 (i, buf, u64(8*ti.size)) or_return + write_string(i, buf, "complex") or_return + write_u64 (i, buf, u64(8*ti.size)) or_return case Type_Info_Quaternion: - try_copy_string(i, buf, "quaternion") or_return - try_copy_u64 (i, buf, u64(8*ti.size)) or_return + write_string(i, buf, "quaternion") or_return + write_u64 (i, buf, u64(8*ti.size)) or_return case Type_Info_String: if info.is_cstring { - try_copy_byte(i, buf, 'c') or_return + write_byte(i, buf, 'c') or_return } - try_copy_string(i, buf, "string") or_return + write_string(i, buf, "string") or_return switch info.encoding { case .UTF_8: /**/ - case .UTF_16: try_copy_string(i, buf, "16") or_return + case .UTF_16: write_string(i, buf, "16") or_return } case Type_Info_Boolean: switch ti.id { - case bool: try_copy_string(i, buf, "bool") or_return + case bool: write_string(i, buf, "bool") or_return case: - try_copy_byte(i, buf, 'b') or_return - try_copy_u64 (i, buf, u64(8*ti.size)) or_return + write_byte(i, buf, 'b') or_return + write_u64 (i, buf, u64(8*ti.size)) or_return } case Type_Info_Any: - try_copy_string(i, buf, "any") or_return + write_string(i, buf, "any") or_return case Type_Info_Type_Id: - try_copy_string(i, buf, "typeid") or_return + write_string(i, buf, "typeid") or_return case Type_Info_Pointer: if info.elem == nil { - try_copy_string(i, buf, "rawptr") or_return + write_string(i, buf, "rawptr") or_return } else { - try_copy_string (i, buf, "^") or_return - try_copy_write_type(i, buf, info.elem) or_return + write_string (i, buf, "^") or_return + write_write_type(i, buf, info.elem) or_return } case Type_Info_Multi_Pointer: - try_copy_string (i, buf, "[^]") or_return - try_copy_write_type(i, buf, info.elem) or_return + write_string (i, buf, "[^]") or_return + write_write_type(i, buf, info.elem) or_return case Type_Info_Soa_Pointer: - try_copy_string (i, buf, "#soa ^") or_return - try_copy_write_type(i, buf, info.elem) or_return + write_string (i, buf, "#soa ^") or_return + write_write_type(i, buf, info.elem) or_return case Type_Info_Procedure: - try_copy_string(i, buf, "proc") or_return + write_string(i, buf, "proc") or_return if info.params == nil { - try_copy_string(i, buf, "()") or_return + write_string(i, buf, "()") or_return } else { t := info.params.variant.(Type_Info_Parameters) - try_copy_byte(i, buf, '(') or_return + write_byte(i, buf, '(') or_return for t, j in t.types { - if j > 0 { try_copy_string(i, buf, ", ") or_return } - try_copy_write_type(i, buf, t) or_return + if j > 0 { write_string(i, buf, ", ") or_return } + write_write_type(i, buf, t) or_return } - try_copy_string(i, buf, ")") or_return + write_string(i, buf, ")") or_return } if info.results != nil { - try_copy_string (i, buf, " -> ") or_return - try_copy_write_type(i, buf, info.results) or_return + write_string (i, buf, " -> ") or_return + write_write_type(i, buf, info.results) or_return } case Type_Info_Parameters: count := len(info.names) - if count != 1 { try_copy_byte(i, buf, '(') or_return } + if count != 1 { write_byte(i, buf, '(') or_return } for name, j in info.names { - if j > 0 { try_copy_string(i, buf, ", ") or_return } + if j > 0 { write_string(i, buf, ", ") or_return } t := info.types[j] if len(name) > 0 { - try_copy_string(i, buf, name) or_return - try_copy_string(i, buf, ": ") or_return + write_string(i, buf, name) or_return + write_string(i, buf, ": ") or_return } - try_copy_write_type(i, buf, t) or_return + write_write_type(i, buf, t) or_return } - if count != 1 { try_copy_string(i, buf, ")") or_return } + if count != 1 { write_string(i, buf, ")") or_return } case Type_Info_Array: - try_copy_byte (i, buf, '[') or_return - try_copy_u64 (i, buf, u64(info.count)) or_return - try_copy_byte (i, buf, ']') or_return - try_copy_write_type(i, buf, info.elem) or_return + write_byte (i, buf, '[') or_return + write_u64 (i, buf, u64(info.count)) or_return + write_byte (i, buf, ']') or_return + write_write_type(i, buf, info.elem) or_return case Type_Info_Enumerated_Array: if info.is_sparse { - try_copy_string(i, buf, "#sparse") or_return + write_string(i, buf, "#sparse") or_return } - try_copy_byte (i, buf, '[') or_return - try_copy_write_type(i, buf, info.index) or_return - try_copy_byte (i, buf, ']') or_return - try_copy_write_type(i, buf, info.elem) or_return + write_byte (i, buf, '[') or_return + write_write_type(i, buf, info.index) or_return + write_byte (i, buf, ']') or_return + write_write_type(i, buf, info.elem) or_return case Type_Info_Dynamic_Array: - try_copy_string (i, buf, "[dynamic]") or_return - try_copy_write_type(i, buf, info.elem) or_return + write_string (i, buf, "[dynamic]") or_return + write_write_type(i, buf, info.elem) or_return case Type_Info_Slice: - try_copy_string (i, buf, "[]") or_return - try_copy_write_type(i, buf, info.elem) or_return + write_string (i, buf, "[]") or_return + write_write_type(i, buf, info.elem) or_return case Type_Info_Map: - try_copy_string (i, buf, "map[") or_return - try_copy_write_type(i, buf, info.key) or_return - try_copy_byte (i, buf, ']') or_return - try_copy_write_type(i, buf, info.value) or_return + write_string (i, buf, "map[") or_return + write_write_type(i, buf, info.key) or_return + write_byte (i, buf, ']') or_return + write_write_type(i, buf, info.value) or_return case Type_Info_Struct: switch info.soa_kind { case .None: // Ignore case .Fixed: - try_copy_string (i, buf, "#soa[") or_return - try_copy_u64 (i, buf, u64(info.soa_len)) or_return - try_copy_byte (i, buf, ']') or_return - try_copy_write_type(i, buf, info.soa_base_type) or_return + write_string (i, buf, "#soa[") or_return + write_u64 (i, buf, u64(info.soa_len)) or_return + write_byte (i, buf, ']') or_return + write_write_type(i, buf, info.soa_base_type) or_return return true case .Slice: - try_copy_string (i, buf, "#soa[]") or_return - try_copy_write_type(i, buf, info.soa_base_type) or_return + write_string (i, buf, "#soa[]") or_return + write_write_type(i, buf, info.soa_base_type) or_return return true case .Dynamic: - try_copy_string (i, buf, "#soa[dynamic]") or_return - try_copy_write_type(i, buf, info.soa_base_type) or_return + write_string (i, buf, "#soa[dynamic]") or_return + write_write_type(i, buf, info.soa_base_type) or_return return true } - try_copy_string(i, buf, "struct ") or_return - if .packed in info.flags { try_copy_string(i, buf, "#packed ") or_return } - if .raw_union in info.flags { try_copy_string(i, buf, "#raw_union ") or_return } - if .all_or_none in info.flags { try_copy_string(i, buf, "#all_or_none ") or_return } + write_string(i, buf, "struct ") or_return + if .packed in info.flags { write_string(i, buf, "#packed ") or_return } + if .raw_union in info.flags { write_string(i, buf, "#raw_union ") or_return } + if .all_or_none in info.flags { write_string(i, buf, "#all_or_none ") or_return } if .align in info.flags { - try_copy_string(i, buf, "#align(") or_return - try_copy_u64(i, buf, u64(ti.align)) or_return - try_copy_string(i, buf, ") ") or_return + write_string(i, buf, "#align(") or_return + write_u64(i, buf, u64(ti.align)) or_return + write_string(i, buf, ") ") or_return } - try_copy_byte(i, buf, '{') or_return + write_byte(i, buf, '{') or_return for name, j in info.names[:info.field_count] { - if j > 0 { try_copy_string(i, buf, ", ") or_return } - try_copy_string (i, buf, name) or_return - try_copy_string (i, buf, ": ") or_return - try_copy_write_type(i, buf, info.types[j]) or_return + if j > 0 { write_string(i, buf, ", ") or_return } + write_string (i, buf, name) or_return + write_string (i, buf, ": ") or_return + write_write_type(i, buf, info.types[j]) or_return } - try_copy_byte(i, buf, '}') or_return + write_byte(i, buf, '}') or_return case Type_Info_Union: - try_copy_string(i, buf, "union ") or_return + write_string(i, buf, "union ") or_return if info.custom_align { - try_copy_string(i, buf, "#align(") or_return - try_copy_u64 (i, buf, u64(ti.align)) or_return - try_copy_string(i, buf, ") ") or_return + write_string(i, buf, "#align(") or_return + write_u64 (i, buf, u64(ti.align)) or_return + write_string(i, buf, ") ") or_return } if info.no_nil { - try_copy_string(i, buf, "#no_nil ") or_return + write_string(i, buf, "#no_nil ") or_return } - try_copy_byte(i, buf, '{') or_return + write_byte(i, buf, '{') or_return for variant, j in info.variants { - if j > 0 { try_copy_string(i, buf, ", ") or_return } - try_copy_write_type(i, buf, variant) or_return + if j > 0 { write_string(i, buf, ", ") or_return } + write_write_type(i, buf, variant) or_return } - try_copy_string(i, buf, "}") or_return + write_string(i, buf, "}") or_return case Type_Info_Enum: - try_copy_string (i, buf, "enum ") or_return - try_copy_write_type(i, buf, info.base) or_return - try_copy_string (i, buf, " {") or_return + write_string (i, buf, "enum ") or_return + write_write_type(i, buf, info.base) or_return + write_string (i, buf, " {") or_return for name, j in info.names { - if j > 0 { try_copy_string(i, buf, ", ") or_return } - try_copy_string(i, buf, name) or_return + if j > 0 { write_string(i, buf, ", ") or_return } + write_string(i, buf, name) or_return } - try_copy_string(i, buf, "}") or_return + write_string(i, buf, "}") or_return case Type_Info_Bit_Set: - try_copy_string(i, buf, "bit_set[") or_return + write_string(i, buf, "bit_set[") or_return #partial switch elem in type_info_base(info.elem).variant { case Type_Info_Enum: - try_copy_write_type(i, buf, info.elem) or_return + write_write_type(i, buf, info.elem) or_return case Type_Info_Rune: - try_copy_encoded_rune(i, buf, rune(info.lower)) or_return - try_copy_string (i, buf, "..") or_return - try_copy_encoded_rune(i, buf, rune(info.upper)) or_return + write_encoded_rune(i, buf, rune(info.lower)) or_return + write_string (i, buf, "..") or_return + write_encoded_rune(i, buf, rune(info.upper)) or_return case: - try_copy_i64 (i, buf, info.lower) or_return - try_copy_string(i, buf, "..") or_return - try_copy_i64 (i, buf, info.upper) or_return + write_i64 (i, buf, info.lower) or_return + write_string(i, buf, "..") or_return + write_i64 (i, buf, info.upper) or_return } if info.underlying != nil { - try_copy_string (i, buf, "; ") or_return - try_copy_write_type(i, buf, info.underlying) or_return + write_string (i, buf, "; ") or_return + write_write_type(i, buf, info.underlying) or_return } - try_copy_byte(i, buf, ']') or_return + write_byte(i, buf, ']') or_return case Type_Info_Bit_Field: - try_copy_string (i, buf, "bit_field ") or_return - try_copy_write_type(i, buf, info.backing_type) or_return - try_copy_string (i, buf, " {") or_return + write_string (i, buf, "bit_field ") or_return + write_write_type(i, buf, info.backing_type) or_return + write_string (i, buf, " {") or_return for name, j in info.names[:info.field_count] { - if j > 0 { try_copy_string(i, buf, ", ") or_return } - try_copy_string (i, buf, name) or_return - try_copy_string (i, buf, ": ") or_return - try_copy_write_type(i, buf, info.types[j]) or_return - try_copy_string (i, buf, " | ") or_return - try_copy_u64 (i, buf, u64(info.bit_sizes[j])) or_return + if j > 0 { write_string(i, buf, ", ") or_return } + write_string (i, buf, name) or_return + write_string (i, buf, ": ") or_return + write_write_type(i, buf, info.types[j]) or_return + write_string (i, buf, " | ") or_return + write_u64 (i, buf, u64(info.bit_sizes[j])) or_return } - try_copy_byte(i, buf, '}') or_return + write_byte(i, buf, '}') or_return case Type_Info_Simd_Vector: - try_copy_string (i, buf, "#simd[") or_return - try_copy_u64 (i, buf, u64(info.count)) or_return - try_copy_byte (i, buf, ']') or_return - try_copy_write_type(i, buf, info.elem) or_return + write_string (i, buf, "#simd[") or_return + write_u64 (i, buf, u64(info.count)) or_return + write_byte (i, buf, ']') or_return + write_write_type(i, buf, info.elem) or_return case Type_Info_Matrix: if info.layout == .Row_Major { - try_copy_string(i, buf, "#row_major ") or_return + write_string(i, buf, "#row_major ") or_return } - try_copy_string (i, buf, "matrix[") or_return - try_copy_u64 (i, buf, u64(info.row_count)) or_return - try_copy_string (i, buf, ", ") or_return - try_copy_u64 (i, buf, u64(info.column_count)) or_return - try_copy_string (i, buf, "]") or_return - try_copy_write_type(i, buf, info.elem) or_return + write_string (i, buf, "matrix[") or_return + write_u64 (i, buf, u64(info.row_count)) or_return + write_string (i, buf, ", ") or_return + write_u64 (i, buf, u64(info.column_count)) or_return + write_string (i, buf, "]") or_return + write_write_type(i, buf, info.elem) or_return } return true } \ No newline at end of file From 429e8a46dba047833087f22bddd8d03519929258 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Wed, 31 Dec 2025 09:30:29 +0900 Subject: [PATCH 276/766] core/crypto/ed25519: Cosmetic fixes (NFC) --- core/crypto/_edwards25519/edwards25519_scalar_mul.odin | 2 +- core/crypto/ed25519/ed25519.odin | 2 +- tests/core/crypto/test_core_crypto_edwards.odin | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/crypto/_edwards25519/edwards25519_scalar_mul.odin b/core/crypto/_edwards25519/edwards25519_scalar_mul.odin index 757a51257..c24447072 100644 --- a/core/crypto/_edwards25519/edwards25519_scalar_mul.odin +++ b/core/crypto/_edwards25519/edwards25519_scalar_mul.odin @@ -8,7 +8,7 @@ import "core:mem" // // Note: When generating, the values were reduced to Tight_Field_Element // ranges, even though that is not required. -@(private) +@(private,rodata) GE_BASEPOINT_TABLE := Multiply_Table { { {62697248952638, 204681361388450, 631292143396476, 338455783676468, 1213667448819585}, diff --git a/core/crypto/ed25519/ed25519.odin b/core/crypto/ed25519/ed25519.odin index 0382a6739..f6a71d888 100644 --- a/core/crypto/ed25519/ed25519.odin +++ b/core/crypto/ed25519/ed25519.odin @@ -170,7 +170,7 @@ public_key_set_bytes :: proc "contextless" (pub_key: ^Public_Key, b: []byte) -> // public_key_set_priv sets pub_key to the public component of priv_key. public_key_set_priv :: proc(pub_key: ^Public_Key, priv_key: ^Private_Key) { - ensure(priv_key._is_initialized, "crypto/ed25519: uninitialized public key") + ensure(priv_key._is_initialized, "crypto/ed25519: uninitialized private key") src := &priv_key._pub_key copy(pub_key._b[:], src._b[:]) diff --git a/tests/core/crypto/test_core_crypto_edwards.odin b/tests/core/crypto/test_core_crypto_edwards.odin index 61933c00f..a1307da24 100644 --- a/tests/core/crypto/test_core_crypto_edwards.odin +++ b/tests/core/crypto/test_core_crypto_edwards.odin @@ -10,7 +10,7 @@ import "core:crypto/x25519" import "core:crypto/x448" @(test) -test_sqrt_ratio_m1 :: proc(t: ^testing.T) { +test_edwards25519_sqrt_ratio_m1 :: proc(t: ^testing.T) { test_vectors := []struct { u: string, v: string, @@ -747,14 +747,14 @@ test_x448 :: proc(t: ^testing.T) { } } -@(private) +@(private="file") ge_str :: proc(ge: ^ristretto255.Group_Element) -> string { b: [ristretto255.ELEMENT_SIZE]byte ristretto255.ge_bytes(ge, b[:]) return string(hex.encode(b[:], context.temp_allocator)) } -@(private) +@(private="file") fe_str :: proc(fe: ^field.Tight_Field_Element) -> string { b: [32]byte field.fe_to_bytes(&b, fe) From 6bbd060352dc0aba41594362c9b82bda636fedde Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Fri, 2 Jan 2026 23:59:38 +0900 Subject: [PATCH 277/766] core/crypto/_subtle: Refactor out common helpers --- .../edwards25519_scalar_mul.odin | 6 +-- .../crypto/_fiat/field_scalar25519/field.odin | 7 ++-- core/crypto/_subtle/subtle.odin | 42 +++++++++++++++++++ core/crypto/crypto.odin | 13 +++++- 4 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 core/crypto/_subtle/subtle.odin diff --git a/core/crypto/_edwards25519/edwards25519_scalar_mul.odin b/core/crypto/_edwards25519/edwards25519_scalar_mul.odin index c24447072..6e0eb42c7 100644 --- a/core/crypto/_edwards25519/edwards25519_scalar_mul.odin +++ b/core/crypto/_edwards25519/edwards25519_scalar_mul.odin @@ -1,7 +1,7 @@ package _edwards25519 import field "core:crypto/_fiat/field_scalar25519" -import "core:math/bits" +import subtle "core:crypto/_subtle" import "core:mem" // GE_BASEPOINT_TABLE is 1 * G, ... 15 * G, in precomputed format. @@ -281,8 +281,8 @@ mul_tbl_add :: proc "contextless" ( {2, 0, 0, 0, 0}, // z * 2 } for i := u64(1); i < 16; i = i + 1 { - _, ctrl := bits.sub_u64(0, (i ~ idx), 0) - ge_addend_conditional_assign(tmp_addend, &tbl[i - 1], int(~ctrl) & 1) + ctrl := subtle.eq(i, idx) + ge_addend_conditional_assign(tmp_addend, &tbl[i - 1], int(ctrl)) } ge_add_addend(ge, ge, tmp_addend, tmp_add) } diff --git a/core/crypto/_fiat/field_scalar25519/field.odin b/core/crypto/_fiat/field_scalar25519/field.odin index 933637c54..96b279ce7 100644 --- a/core/crypto/_fiat/field_scalar25519/field.odin +++ b/core/crypto/_fiat/field_scalar25519/field.odin @@ -1,5 +1,6 @@ package field_scalar25519 +import subtle "core:crypto/_subtle" import "core:encoding/endian" import "core:math/bits" import "core:mem" @@ -121,13 +122,11 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> tmp: Montgomery_Domain_Field_Element fe_sub(&tmp, arg1, arg2) - // This will only underflow iff arg1 == arg2, and we return the borrow, - // which will be 1. - _, borrow := bits.sub_u64(fe_non_zero(&tmp), 1, 0) + is_eq := subtle.eq(fe_non_zero(&tmp), 0) fe_clear(&tmp) - return int(borrow) + return int(is_eq) } fe_zero :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element) { diff --git a/core/crypto/_subtle/subtle.odin b/core/crypto/_subtle/subtle.odin new file mode 100644 index 000000000..89328072c --- /dev/null +++ b/core/crypto/_subtle/subtle.odin @@ -0,0 +1,42 @@ +/* +Various useful bit operations in constant time. +*/ +package _subtle + +import "core:math/bits" + +// byte_eq returns 1 iff a == b, 0 otherwise. +@(optimization_mode="none") +byte_eq :: proc "contextless" (a, b: byte) -> int { + v := a ~ b + + // v == 0 iff a == b. The subtraction will underflow, setting the + // sign bit, which will get returned. + return int((u32(v)-1) >> 31) +} + +// u64_eq returns 1 iff a == b, 0 otherwise. +@(optimization_mode="none") +u64_eq :: proc "contextless" (a, b: u64) -> u64 { + _, borrow := bits.sub_u64(0, a ~ b, 0) + return (~borrow) & 1 +} + +eq :: proc { + byte_eq, + u64_eq, +} + +// u64_is_zero returns 1 iff a == 0, 0 otherwise. +@(optimization_mode="none") +u64_is_zero :: proc "contextless" (a: u64) -> u64 { + _, borrow := bits.sub_u64(a, 1, 0) + return borrow +} + +// u64_is_non_zero returns 1 iff a != 0, 0 otherwise. +@(optimization_mode="none") +u64_is_non_zero :: proc "contextless" (a: u64) -> u64 { + is_zero := u64_is_zero(a) + return (~is_zero) & 1 +} diff --git a/core/crypto/crypto.odin b/core/crypto/crypto.odin index 7ccf126e6..435c5daaf 100644 --- a/core/crypto/crypto.odin +++ b/core/crypto/crypto.odin @@ -2,6 +2,7 @@ package crypto import "base:runtime" +import subtle "core:crypto/_subtle" import "core:mem" // HAS_RAND_BYTES is true iff the runtime provides a cryptographic @@ -44,7 +45,17 @@ compare_byte_ptrs_constant_time :: proc "contextless" (a, b: ^byte, n: int) -> i // After the loop, v == 0 iff a == b. The subtraction will underflow // iff v == 0, setting the sign-bit, which gets returned. - return int((u32(v)-1) >> 31) + return subtle.eq(0, v) +} + +// is_zero_constant_time returns 1 iff b is all 0s, 0 otherwise. +is_zero_constant_time :: proc "contextless" (b: []byte) -> int { + v: byte + for b_ in b { + v |= b_ + } + + return subtle.byte_eq(0, v) } // rand_bytes fills the dst buffer with cryptographic entropy taken from From db26fb8a216982a4cf7bb7f992e1cf92ad856a02 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 28 Jan 2026 13:39:51 +0000 Subject: [PATCH 278/766] Add missing `@(require_results)` to procedures --- core/unicode/utf8/utf8.odin | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/unicode/utf8/utf8.odin b/core/unicode/utf8/utf8.odin index 281e36f43..78cefa8b4 100644 --- a/core/unicode/utf8/utf8.odin +++ b/core/unicode/utf8/utf8.odin @@ -60,6 +60,7 @@ accept_sizes := [256]u8{ 0xf5..=0xff = 0xf1, // ascii, size 1 } +@(require_results) encode_rune :: proc "contextless" (c: rune) -> ([4]u8, int) { r := c @@ -101,9 +102,11 @@ decode_rune :: proc{ decode_rune_in_string, decode_rune_in_bytes, } +@(require_results) decode_rune_in_string :: #force_inline proc "contextless" (s: string) -> (rune, int) { return decode_rune_in_bytes(transmute([]u8)s) } +@(require_results) decode_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { n := len(s) if n < 1 { @@ -141,6 +144,7 @@ decode_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { return rune(s0&MASK4)<<18 | rune(b1&MASKX)<<12 | rune(b2&MASKX)<<6 | rune(b3&MASKX), 4 } +@(require_results) string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (runes: []rune) { n := rune_count_in_string(s) @@ -153,6 +157,7 @@ string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (r return } +@(require_results) runes_to_string :: proc "odin" (runes: []rune, allocator := context.allocator) -> string { byte_count := 0 for r in runes { @@ -177,9 +182,11 @@ decode_last_rune :: proc{ decode_last_rune_in_bytes, } +@(require_results) decode_last_rune_in_string :: #force_inline proc "contextless" (s: string) -> (rune, int) { return decode_last_rune_in_bytes(transmute([]u8)s) } +@(require_results) decode_last_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { r: rune size: int @@ -212,6 +219,7 @@ decode_last_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { return r, size } +@(require_results) rune_at_pos :: proc "contextless" (s: string, pos: int) -> rune { if pos < 0 { return RUNE_ERROR @@ -227,6 +235,7 @@ rune_at_pos :: proc "contextless" (s: string, pos: int) -> rune { return RUNE_ERROR } +@(require_results) rune_string_at_pos :: proc "contextless" (s: string, pos: int) -> string { if pos < 0 { return "" @@ -243,6 +252,7 @@ rune_string_at_pos :: proc "contextless" (s: string, pos: int) -> string { return "" } +@(require_results) rune_at :: proc "contextless" (s: string, byte_index: int) -> rune { r, _ := decode_rune_in_string(s[byte_index:]) return r @@ -250,6 +260,7 @@ rune_at :: proc "contextless" (s: string, byte_index: int) -> rune { // Returns the byte position of rune at position pos in s with an optional start byte position. // Returns -1 if it runs out of the string. +@(require_results) rune_offset :: proc "contextless" (s: string, pos: int, start: int = 0) -> int { if pos < 0 { return -1 @@ -265,6 +276,7 @@ rune_offset :: proc "contextless" (s: string, pos: int, start: int = 0) -> int { return -1 } +@(require_results) valid_rune :: proc "contextless" (r: rune) -> bool { if r < 0 { return false @@ -276,6 +288,7 @@ valid_rune :: proc "contextless" (r: rune) -> bool { return true } +@(require_results) valid_string :: proc "contextless" (s: string) -> bool { n := len(s) for i := 0; i < n; { @@ -309,6 +322,7 @@ valid_string :: proc "contextless" (s: string) -> bool { return true } +@(require_results) rune_start :: #force_inline proc "contextless" (b: u8) -> bool { return b&0xc0 != 0x80 } @@ -318,9 +332,11 @@ rune_count :: proc{ rune_count_in_bytes, } +@(require_results) rune_count_in_string :: #force_inline proc(s: string) -> int { return rune_count_in_bytes(transmute([]u8)s) } +@(require_results) rune_count_in_bytes :: proc "contextless" (s: []u8) -> int { count := 0 n := len(s) @@ -360,6 +376,7 @@ rune_count_in_bytes :: proc "contextless" (s: []u8) -> int { } +@(require_results) rune_size :: proc "contextless" (r: rune) -> int { switch { case r < 0: return -1 @@ -381,6 +398,7 @@ full_rune :: proc{ // full_rune_in_bytes reports if the bytes in b begin with a full utf-8 encoding of a rune or not // An invalid encoding is considered a full rune since it will convert as an error rune of width 1 (RUNE_ERROR) +@(require_results) full_rune_in_bytes :: proc "contextless" (b: []byte) -> bool { n := len(b) if n == 0 { @@ -401,6 +419,7 @@ full_rune_in_bytes :: proc "contextless" (b: []byte) -> bool { // full_rune_in_string reports if the bytes in s begin with a full utf-8 encoding of a rune or not // An invalid encoding is considered a full rune since it will convert as an error rune of width 1 (RUNE_ERROR) +@(require_results) full_rune_in_string :: proc "contextless" (s: string) -> bool { return full_rune_in_bytes(transmute([]byte)s) } From 5ce448a8d52bec3c3e8bd44629bfef870e06dac6 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 2 Oct 2025 07:42:52 +0900 Subject: [PATCH 279/766] core/crypto: Start work on the NIST curves --- core/crypto/_fiat/field_p256r1/field.odin | 346 ++ core/crypto/_fiat/field_p256r1/field64.odin | 501 +++ .../_fiat/field_scalarp256r1/field.odin | 210 + .../_fiat/field_scalarp256r1/field64.odin | 569 +++ core/crypto/_weierstrass/fe.odin | 135 + core/crypto/_weierstrass/point.odin | 548 +++ core/crypto/_weierstrass/point_s11n_sec.odin | 95 + core/crypto/_weierstrass/sc.odin | 76 + core/crypto/_weierstrass/scalar_mul.odin | 204 + core/crypto/_weierstrass/secp256r1_table.odin | 3985 +++++++++++++++++ .../_weierstrass/tools/ecc_gen_tables.odin | 99 + core/crypto/crypto.odin | 3 + .../crypto/test_core_crypto_weierstrass.odin | 486 ++ 13 files changed, 7257 insertions(+) create mode 100644 core/crypto/_fiat/field_p256r1/field.odin create mode 100644 core/crypto/_fiat/field_p256r1/field64.odin create mode 100644 core/crypto/_fiat/field_scalarp256r1/field.odin create mode 100644 core/crypto/_fiat/field_scalarp256r1/field64.odin create mode 100644 core/crypto/_weierstrass/fe.odin create mode 100644 core/crypto/_weierstrass/point.odin create mode 100644 core/crypto/_weierstrass/point_s11n_sec.odin create mode 100644 core/crypto/_weierstrass/sc.odin create mode 100644 core/crypto/_weierstrass/scalar_mul.odin create mode 100644 core/crypto/_weierstrass/secp256r1_table.odin create mode 100644 core/crypto/_weierstrass/tools/ecc_gen_tables.odin create mode 100644 tests/core/crypto/test_core_crypto_weierstrass.odin diff --git a/core/crypto/_fiat/field_p256r1/field.odin b/core/crypto/_fiat/field_p256r1/field.odin new file mode 100644 index 000000000..b1662fd48 --- /dev/null +++ b/core/crypto/_fiat/field_p256r1/field.odin @@ -0,0 +1,346 @@ +package field_p256r1 + +import subtle "core:crypto/_subtle" +import "core:encoding/endian" +import "core:math/bits" +import "core:mem" + +fe_clear :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) { + mem.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) +} + +fe_clear_vec :: proc "contextless" ( + arg1: []^Montgomery_Domain_Field_Element, +) { + for fe in arg1 { + fe_clear(fe) + } +} + +fe_from_bytes :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: []byte, + unsafe_assume_canonical := false, +) -> bool { + ensure_contextless(len(arg1) == 32, "p256r1: invalid fe input buffer") + + // Note: We assume the input is in big-endian. + tmp := Non_Montgomery_Domain_Field_Element { + endian.unchecked_get_u64be(arg1[24:]), + endian.unchecked_get_u64be(arg1[16:]), + endian.unchecked_get_u64be(arg1[8:]), + endian.unchecked_get_u64be(arg1[0:]), + } + defer mem.zero_explicit(&tmp, size_of(tmp)) + + // Check that tmp is in the the range [0, ELL). + if !unsafe_assume_canonical { + _, borrow := bits.sub_u64(ELL[0] - 1, tmp[0], 0) + _, borrow = bits.sub_u64(ELL[1], tmp[1], borrow) + _, borrow = bits.sub_u64(ELL[2], tmp[2], borrow) + _, borrow = bits.sub_u64(ELL[3], tmp[3], borrow) + if borrow != 0 { + return false + } + } + + fe_to_montgomery(out1, &tmp) + + return true +} + +fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_Element) { + ensure_contextless(len(out1) == 32, "p256r1: invalid fe output buffer") + + tmp: Non_Montgomery_Domain_Field_Element + fe_from_montgomery(&tmp, arg1) + + // Note: Likewise, output in big-endian. + endian.unchecked_put_u64be(out1[24:], tmp[0]) + endian.unchecked_put_u64be(out1[16:], tmp[1]) + endian.unchecked_put_u64be(out1[8:], tmp[2]) + endian.unchecked_put_u64be(out1[0:], tmp[3]) + + mem.zero_explicit(&tmp, size_of(tmp)) +} + +@(require_results) +fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> int { + tmp: Montgomery_Domain_Field_Element + fe_sub(&tmp, arg1, arg2) + + // This will only underflow iff arg1 == arg2, and we return the borrow, + // which will be 1. + is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) + + fe_clear(&tmp) + + return int(is_eq) +} + +@(require_results) +fe_is_odd :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> int { + tmp: Non_Montgomery_Domain_Field_Element + defer mem.zero_explicit(&tmp, size_of(tmp)) + + fe_from_montgomery(&tmp, arg1) + return int(tmp[0] & 1) +} + +fe_pow2k :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: ^Montgomery_Domain_Field_Element, + arg2: uint, +) { + // Special case: `arg1^(2 * 0) = 1`, though this should never happen. + if arg2 == 0 { + fe_one(out1) + return + } + + fe_square(out1, arg1) + for _ in 1 ..< arg2 { + fe_square(out1, out1) + } +} + +fe_inv :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + // Inversion computation is derived from the addition chain: + // + // _10 = 2*1 + // _11 = 1 + _10 + // _110 = 2*_11 + // _111 = 1 + _110 + // _111000 = _111 << 3 + // _111111 = _111 + _111000 + // x12 = _111111 << 6 + _111111 + // x15 = x12 << 3 + _111 + // x16 = 2*x15 + 1 + // x32 = x16 << 16 + x16 + // i53 = x32 << 15 + // x47 = x15 + i53 + // i263 = ((i53 << 17 + 1) << 143 + x47) << 47 + // return (x47 + i263) << 2 + // + // Operations: 255 squares 11 multiplies + // + // Generated by github.com/mmcloughlin/addchain v0.4.0. + + // Note: Need to stash `arg1` (`xx`) in the case that `out1`/`arg1` alias, + // as `arg1` is used after `out1` has been altered. + t0, t1, xx: Montgomery_Domain_Field_Element = ---, ---, arg1^ + + // Step 1: z = x^0x2 + fe_square(out1, arg1) + + // Step 2: z = x^0x3 + fe_mul(out1, &xx, out1) + + // Step 3: z = x^0x6 + fe_square(out1, out1) + + // Step 4: z = x^0x7 + fe_mul(out1, &xx, out1) + + // Step 7: t0 = x^0x38 + fe_pow2k(&t0, out1, 3) + + // Step 8: t0 = x^0x3f + fe_mul(&t0, out1, &t0) + + // Step 14: t1 = x^0xfc0 + fe_pow2k(&t1, &t0, 6) + + // Step 15: t0 = x^0xfff + fe_mul(&t0, &t0, &t1) + + // Step 18: t0 = x^0x7ff8 + fe_pow2k(&t0, &t0, 3) + + // Step 19: z = x^0x7fff + fe_mul(out1, out1, &t0) + + // Step 20: t0 = x^0xfffe + fe_square(&t0, out1) + + // Step 21: t0 = x^0xffff + fe_mul(&t0, &xx, &t0) + + // Step 37: t1 = x^0xffff0000 + fe_pow2k(&t1, &t0, 16) + + // Step 38: t0 = x^0xffffffff + fe_mul(&t0, &t0, &t1) + + // Step 53: t0 = x^0x7fffffff8000 + fe_pow2k(&t0, &t0, 15) + + // Step 54: z = x^0x7fffffffffff + fe_mul(out1, out1, &t0) + + // Step 71: t0 = x^0xffffffff00000000 + fe_pow2k(&t0, &t0, 17) + + // Step 72: t0 = x^0xffffffff00000001 + fe_mul(&t0, &xx, &t0) + + // Step 215: t0 = x^0x7fffffff80000000800000000000000000000000000000000000 + fe_pow2k(&t0, &t0, 143) + + // Step 216: t0 = x^0x7fffffff800000008000000000000000000000007fffffffffff + fe_mul(&t0, out1, &t0) + + // Step 263: t0 = x^0x3fffffffc00000004000000000000000000000003fffffffffff800000000000 + fe_pow2k(&t0, &t0, 47) + + // Step 264: z = x^0x3fffffffc00000004000000000000000000000003fffffffffffffffffffffff + fe_mul(out1, out1, &t0) + + // Step 266: z = x^0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc + fe_pow2k(out1, out1, 2) + + fe_mul(out1, out1, &xx) + + fe_clear_vec([]^Montgomery_Domain_Field_Element{&t0, &t1, &xx}) +} + +@(require_results) +fe_sqrt :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) -> int { + // Square root candidate can be derived via exponentiation by `(p + 1) / 4` + // From sage: 28948022302589062190674361737351893382521535853822578548883407827216774463488 + // + // // Inversion computation is derived from the addition chain: + // + // _10 = 2*1 + // _11 = 1 + _10 + // _1100 = _11 << 2 + // _1111 = _11 + _1100 + // _11110000 = _1111 << 4 + // _11111111 = _1111 + _11110000 + // x16 = _11111111 << 8 + _11111111 + // x32 = x16 << 16 + x16 + // return ((x32 << 32 + 1) << 96 + 1) << 94 + // + // Operations: 253 squares 7 multiplies + // + // Generated by github.com/mmcloughlin/addchain v0.4.0. + + // Likewise this tramples over arg1, so stash another copy. + t0, xx: Montgomery_Domain_Field_Element = ---, arg1^ + + // Step 1: z = x^0x2 + fe_square(out1, arg1) + + // Step 2: z = x^0x3 + fe_mul(out1, &xx, out1) + + // Step 4: t0 = x^0xc + fe_pow2k(&t0, &xx, 2) + + // Step 5: z = x^0xf + fe_mul(out1, out1, &t0) + + // Step 9: t0 = x^0xf0 + fe_pow2k(&t0, out1, 4) + + // Step 10: z = x^0xff + fe_mul(out1, out1, &t0) + + // Step 18: t0 = x^0xff00 + fe_pow2k(&t0, out1, 8) + + // Step 19: z = x^0xffff + fe_mul(out1, out1, &t0) + + // Step 35: t0 = x^0xffff0000 + fe_pow2k(&t0, out1, 16) + + // Step 36: z = x^0xffffffff + fe_mul(out1, out1, &t0) + + // Step 68: z = x^0xffffffff00000000 + fe_pow2k(out1, out1, 32) + + // Step 69: z = x^0xffffffff00000001 + fe_mul(out1, &xx, out1) + + // Step 165: z = x^0xffffffff00000001000000000000000000000000 + fe_pow2k(out1, out1, 96) + + // Step 166: z = x^0xffffffff00000001000000000000000000000001 + fe_mul(out1, &xx, out1) + + // Step 260: z = x^0x3fffffffc0000000400000000000000000000000400000000000000000000000 + fe_pow2k(out1, out1, 94) + + // Ensure that our candidate is actually the square root. + check, zero: Montgomery_Domain_Field_Element + fe_square(&check, out1) + + is_valid := fe_equal(&check, &xx) + fe_cond_select(out1, &zero, out1, is_valid) + + fe_clear_vec([]^Montgomery_Domain_Field_Element{&t0, &xx, &check}) + + return is_valid + +} + +fe_zero :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element) { + out1[0] = 0 + out1[1] = 0 + out1[2] = 0 + out1[3] = 0 +} + +fe_set :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1 := arg1[0] + x2 := arg1[1] + x3 := arg1[2] + x4 := arg1[3] + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 +} + +@(optimization_mode = "none") +fe_cond_swap :: #force_no_inline proc "contextless" (out1, out2: ^Montgomery_Domain_Field_Element, arg1: int) { + mask := (u64(arg1) * 0xffffffffffffffff) + x := (out1[0] ~ out2[0]) & mask + x1, y1 := out1[0] ~ x, out2[0] ~ x + x = (out1[1] ~ out2[1]) & mask + x2, y2 := out1[1] ~ x, out2[1] ~ x + x = (out1[2] ~ out2[2]) & mask + x3, y3 := out1[2] ~ x, out2[2] ~ x + x = (out1[3] ~ out2[3]) & mask + x4, y4 := out1[3] ~ x, out2[3] ~ x + out1[0], out2[0] = x1, y1 + out1[1], out2[1] = x2, y2 + out1[2], out2[2] = x3, y3 + out1[3], out2[3] = x4, y4 +} + +@(optimization_mode = "none") +fe_cond_select :: #force_no_inline proc "contextless" ( + out1, arg1, arg2: ^Montgomery_Domain_Field_Element, + arg3: int, +) { + mask := (u64(arg3) * 0xffffffffffffffff) + x1 := ((mask & arg2[0]) | ((~mask) & arg1[0])) + x2 := ((mask & arg2[1]) | ((~mask) & arg1[1])) + x3 := ((mask & arg2[2]) | ((~mask) & arg1[2])) + x4 := ((mask & arg2[3]) | ((~mask) & arg1[3])) + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 +} + +fe_cond_negate :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element, ctrl: int) { + tmp1: Montgomery_Domain_Field_Element = --- + fe_opp(&tmp1, arg1) + fe_cond_select(out1, arg1, &tmp1, ctrl) + + fe_clear(&tmp1) +} diff --git a/core/crypto/_fiat/field_p256r1/field64.odin b/core/crypto/_fiat/field_p256r1/field64.odin new file mode 100644 index 000000000..940f2cd07 --- /dev/null +++ b/core/crypto/_fiat/field_p256r1/field64.odin @@ -0,0 +1,501 @@ +// The BSD 1-Clause License (BSD-1-Clause) +// +// Copyright (c) 2015-2020 the fiat-crypto authors (see the AUTHORS file) +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY the fiat-crypto authors "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, +// Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package field_p256r1 + +// The file provides arithmetic on the field Z/(2^256 - 2^224 + 2^192 + 2^96 - 1) +// using a 64-bit Montgomery form internal representation. It is derived +// primarily from the machine generated Golang output from the fiat-crypto +// project. +// +// While the base implementation is provably correct, this implementation +// makes no such claims as the port and optimizations were done by hand. +// +// WARNING: While big-endian is the common representation used for this +// curve, the fiat output uses least-significant-limb first. + +import fiat "core:crypto/_fiat" +import "core:math/bits" + +// ELL is the saturated representation of the field order, least-significant +// limb first. +ELL :: [4]u64{0xffffffffffffffff, 0xffffffff, 0x0, 0xffffffff00000001} + +Montgomery_Domain_Field_Element :: distinct [4]u64 +Non_Montgomery_Domain_Field_Element :: distinct [4]u64 + +fe_mul :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[0] + x6, x5 := bits.mul_u64(x4, arg2[3]) + x8, x7 := bits.mul_u64(x4, arg2[2]) + x10, x9 := bits.mul_u64(x4, arg2[1]) + x12, x11 := bits.mul_u64(x4, arg2[0]) + x13, x14 := bits.add_u64(x12, x9, u64(0x0)) + x15, x16 := bits.add_u64(x10, x7, u64(fiat.u1(x14))) + x17, x18 := bits.add_u64(x8, x5, u64(fiat.u1(x16))) + x19 := (u64(fiat.u1(x18)) + x6) + x21, x20 := bits.mul_u64(x11, 0xffffffff00000001) + x23, x22 := bits.mul_u64(x11, 0xffffffff) + x25, x24 := bits.mul_u64(x11, 0xffffffffffffffff) + x26, x27 := bits.add_u64(x25, x22, u64(0x0)) + x28 := (u64(fiat.u1(x27)) + x23) + _, x30 := bits.add_u64(x11, x24, u64(0x0)) + x31, x32 := bits.add_u64(x13, x26, u64(fiat.u1(x30))) + x33, x34 := bits.add_u64(x15, x28, u64(fiat.u1(x32))) + x35, x36 := bits.add_u64(x17, x20, u64(fiat.u1(x34))) + x37, x38 := bits.add_u64(x19, x21, u64(fiat.u1(x36))) + x40, x39 := bits.mul_u64(x1, arg2[3]) + x42, x41 := bits.mul_u64(x1, arg2[2]) + x44, x43 := bits.mul_u64(x1, arg2[1]) + x46, x45 := bits.mul_u64(x1, arg2[0]) + x47, x48 := bits.add_u64(x46, x43, u64(0x0)) + x49, x50 := bits.add_u64(x44, x41, u64(fiat.u1(x48))) + x51, x52 := bits.add_u64(x42, x39, u64(fiat.u1(x50))) + x53 := (u64(fiat.u1(x52)) + x40) + x54, x55 := bits.add_u64(x31, x45, u64(0x0)) + x56, x57 := bits.add_u64(x33, x47, u64(fiat.u1(x55))) + x58, x59 := bits.add_u64(x35, x49, u64(fiat.u1(x57))) + x60, x61 := bits.add_u64(x37, x51, u64(fiat.u1(x59))) + x62, x63 := bits.add_u64(u64(fiat.u1(x38)), x53, u64(fiat.u1(x61))) + x65, x64 := bits.mul_u64(x54, 0xffffffff00000001) + x67, x66 := bits.mul_u64(x54, 0xffffffff) + x69, x68 := bits.mul_u64(x54, 0xffffffffffffffff) + x70, x71 := bits.add_u64(x69, x66, u64(0x0)) + x72 := (u64(fiat.u1(x71)) + x67) + _, x74 := bits.add_u64(x54, x68, u64(0x0)) + x75, x76 := bits.add_u64(x56, x70, u64(fiat.u1(x74))) + x77, x78 := bits.add_u64(x58, x72, u64(fiat.u1(x76))) + x79, x80 := bits.add_u64(x60, x64, u64(fiat.u1(x78))) + x81, x82 := bits.add_u64(x62, x65, u64(fiat.u1(x80))) + x83 := (u64(fiat.u1(x82)) + u64(fiat.u1(x63))) + x85, x84 := bits.mul_u64(x2, arg2[3]) + x87, x86 := bits.mul_u64(x2, arg2[2]) + x89, x88 := bits.mul_u64(x2, arg2[1]) + x91, x90 := bits.mul_u64(x2, arg2[0]) + x92, x93 := bits.add_u64(x91, x88, u64(0x0)) + x94, x95 := bits.add_u64(x89, x86, u64(fiat.u1(x93))) + x96, x97 := bits.add_u64(x87, x84, u64(fiat.u1(x95))) + x98 := (u64(fiat.u1(x97)) + x85) + x99, x100 := bits.add_u64(x75, x90, u64(0x0)) + x101, x102 := bits.add_u64(x77, x92, u64(fiat.u1(x100))) + x103, x104 := bits.add_u64(x79, x94, u64(fiat.u1(x102))) + x105, x106 := bits.add_u64(x81, x96, u64(fiat.u1(x104))) + x107, x108 := bits.add_u64(x83, x98, u64(fiat.u1(x106))) + x110, x109 := bits.mul_u64(x99, 0xffffffff00000001) + x112, x111 := bits.mul_u64(x99, 0xffffffff) + x114, x113 := bits.mul_u64(x99, 0xffffffffffffffff) + x115, x116 := bits.add_u64(x114, x111, u64(0x0)) + x117 := (u64(fiat.u1(x116)) + x112) + _, x119 := bits.add_u64(x99, x113, u64(0x0)) + x120, x121 := bits.add_u64(x101, x115, u64(fiat.u1(x119))) + x122, x123 := bits.add_u64(x103, x117, u64(fiat.u1(x121))) + x124, x125 := bits.add_u64(x105, x109, u64(fiat.u1(x123))) + x126, x127 := bits.add_u64(x107, x110, u64(fiat.u1(x125))) + x128 := (u64(fiat.u1(x127)) + u64(fiat.u1(x108))) + x130, x129 := bits.mul_u64(x3, arg2[3]) + x132, x131 := bits.mul_u64(x3, arg2[2]) + x134, x133 := bits.mul_u64(x3, arg2[1]) + x136, x135 := bits.mul_u64(x3, arg2[0]) + x137, x138 := bits.add_u64(x136, x133, u64(0x0)) + x139, x140 := bits.add_u64(x134, x131, u64(fiat.u1(x138))) + x141, x142 := bits.add_u64(x132, x129, u64(fiat.u1(x140))) + x143 := (u64(fiat.u1(x142)) + x130) + x144, x145 := bits.add_u64(x120, x135, u64(0x0)) + x146, x147 := bits.add_u64(x122, x137, u64(fiat.u1(x145))) + x148, x149 := bits.add_u64(x124, x139, u64(fiat.u1(x147))) + x150, x151 := bits.add_u64(x126, x141, u64(fiat.u1(x149))) + x152, x153 := bits.add_u64(x128, x143, u64(fiat.u1(x151))) + x155, x154 := bits.mul_u64(x144, 0xffffffff00000001) + x157, x156 := bits.mul_u64(x144, 0xffffffff) + x159, x158 := bits.mul_u64(x144, 0xffffffffffffffff) + x160, x161 := bits.add_u64(x159, x156, u64(0x0)) + x162 := (u64(fiat.u1(x161)) + x157) + _, x164 := bits.add_u64(x144, x158, u64(0x0)) + x165, x166 := bits.add_u64(x146, x160, u64(fiat.u1(x164))) + x167, x168 := bits.add_u64(x148, x162, u64(fiat.u1(x166))) + x169, x170 := bits.add_u64(x150, x154, u64(fiat.u1(x168))) + x171, x172 := bits.add_u64(x152, x155, u64(fiat.u1(x170))) + x173 := (u64(fiat.u1(x172)) + u64(fiat.u1(x153))) + x174, x175 := bits.sub_u64(x165, 0xffffffffffffffff, u64(0x0)) + x176, x177 := bits.sub_u64(x167, 0xffffffff, u64(fiat.u1(x175))) + x178, x179 := bits.sub_u64(x169, u64(0x0), u64(fiat.u1(x177))) + x180, x181 := bits.sub_u64(x171, 0xffffffff00000001, u64(fiat.u1(x179))) + _, x183 := bits.sub_u64(x173, u64(0x0), u64(fiat.u1(x181))) + x184 := fiat.cmovznz_u64(fiat.u1(x183), x174, x165) + x185 := fiat.cmovznz_u64(fiat.u1(x183), x176, x167) + x186 := fiat.cmovznz_u64(fiat.u1(x183), x178, x169) + x187 := fiat.cmovznz_u64(fiat.u1(x183), x180, x171) + out1[0] = x184 + out1[1] = x185 + out1[2] = x186 + out1[3] = x187 +} + +fe_square :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[0] + x6, x5 := bits.mul_u64(x4, arg1[3]) + x8, x7 := bits.mul_u64(x4, arg1[2]) + x10, x9 := bits.mul_u64(x4, arg1[1]) + x12, x11 := bits.mul_u64(x4, arg1[0]) + x13, x14 := bits.add_u64(x12, x9, u64(0x0)) + x15, x16 := bits.add_u64(x10, x7, u64(fiat.u1(x14))) + x17, x18 := bits.add_u64(x8, x5, u64(fiat.u1(x16))) + x19 := (u64(fiat.u1(x18)) + x6) + x21, x20 := bits.mul_u64(x11, 0xffffffff00000001) + x23, x22 := bits.mul_u64(x11, 0xffffffff) + x25, x24 := bits.mul_u64(x11, 0xffffffffffffffff) + x26, x27 := bits.add_u64(x25, x22, u64(0x0)) + x28 := (u64(fiat.u1(x27)) + x23) + _, x30 := bits.add_u64(x11, x24, u64(0x0)) + x31, x32 := bits.add_u64(x13, x26, u64(fiat.u1(x30))) + x33, x34 := bits.add_u64(x15, x28, u64(fiat.u1(x32))) + x35, x36 := bits.add_u64(x17, x20, u64(fiat.u1(x34))) + x37, x38 := bits.add_u64(x19, x21, u64(fiat.u1(x36))) + x40, x39 := bits.mul_u64(x1, arg1[3]) + x42, x41 := bits.mul_u64(x1, arg1[2]) + x44, x43 := bits.mul_u64(x1, arg1[1]) + x46, x45 := bits.mul_u64(x1, arg1[0]) + x47, x48 := bits.add_u64(x46, x43, u64(0x0)) + x49, x50 := bits.add_u64(x44, x41, u64(fiat.u1(x48))) + x51, x52 := bits.add_u64(x42, x39, u64(fiat.u1(x50))) + x53 := (u64(fiat.u1(x52)) + x40) + x54, x55 := bits.add_u64(x31, x45, u64(0x0)) + x56, x57 := bits.add_u64(x33, x47, u64(fiat.u1(x55))) + x58, x59 := bits.add_u64(x35, x49, u64(fiat.u1(x57))) + x60, x61 := bits.add_u64(x37, x51, u64(fiat.u1(x59))) + x62, x63 := bits.add_u64(u64(fiat.u1(x38)), x53, u64(fiat.u1(x61))) + x65, x64 := bits.mul_u64(x54, 0xffffffff00000001) + x67, x66 := bits.mul_u64(x54, 0xffffffff) + x69, x68 := bits.mul_u64(x54, 0xffffffffffffffff) + x70, x71 := bits.add_u64(x69, x66, u64(0x0)) + x72 := (u64(fiat.u1(x71)) + x67) + _, x74 := bits.add_u64(x54, x68, u64(0x0)) + x75, x76 := bits.add_u64(x56, x70, u64(fiat.u1(x74))) + x77, x78 := bits.add_u64(x58, x72, u64(fiat.u1(x76))) + x79, x80 := bits.add_u64(x60, x64, u64(fiat.u1(x78))) + x81, x82 := bits.add_u64(x62, x65, u64(fiat.u1(x80))) + x83 := (u64(fiat.u1(x82)) + u64(fiat.u1(x63))) + x85, x84 := bits.mul_u64(x2, arg1[3]) + x87, x86 := bits.mul_u64(x2, arg1[2]) + x89, x88 := bits.mul_u64(x2, arg1[1]) + x91, x90 := bits.mul_u64(x2, arg1[0]) + x92, x93 := bits.add_u64(x91, x88, u64(0x0)) + x94, x95 := bits.add_u64(x89, x86, u64(fiat.u1(x93))) + x96, x97 := bits.add_u64(x87, x84, u64(fiat.u1(x95))) + x98 := (u64(fiat.u1(x97)) + x85) + x99, x100 := bits.add_u64(x75, x90, u64(0x0)) + x101, x102 := bits.add_u64(x77, x92, u64(fiat.u1(x100))) + x103, x104 := bits.add_u64(x79, x94, u64(fiat.u1(x102))) + x105, x106 := bits.add_u64(x81, x96, u64(fiat.u1(x104))) + x107, x108 := bits.add_u64(x83, x98, u64(fiat.u1(x106))) + x110, x109 := bits.mul_u64(x99, 0xffffffff00000001) + x112, x111 := bits.mul_u64(x99, 0xffffffff) + x114, x113 := bits.mul_u64(x99, 0xffffffffffffffff) + x115, x116 := bits.add_u64(x114, x111, u64(0x0)) + x117 := (u64(fiat.u1(x116)) + x112) + _, x119 := bits.add_u64(x99, x113, u64(0x0)) + x120, x121 := bits.add_u64(x101, x115, u64(fiat.u1(x119))) + x122, x123 := bits.add_u64(x103, x117, u64(fiat.u1(x121))) + x124, x125 := bits.add_u64(x105, x109, u64(fiat.u1(x123))) + x126, x127 := bits.add_u64(x107, x110, u64(fiat.u1(x125))) + x128 := (u64(fiat.u1(x127)) + u64(fiat.u1(x108))) + x130, x129 := bits.mul_u64(x3, arg1[3]) + x132, x131 := bits.mul_u64(x3, arg1[2]) + x134, x133 := bits.mul_u64(x3, arg1[1]) + x136, x135 := bits.mul_u64(x3, arg1[0]) + x137, x138 := bits.add_u64(x136, x133, u64(0x0)) + x139, x140 := bits.add_u64(x134, x131, u64(fiat.u1(x138))) + x141, x142 := bits.add_u64(x132, x129, u64(fiat.u1(x140))) + x143 := (u64(fiat.u1(x142)) + x130) + x144, x145 := bits.add_u64(x120, x135, u64(0x0)) + x146, x147 := bits.add_u64(x122, x137, u64(fiat.u1(x145))) + x148, x149 := bits.add_u64(x124, x139, u64(fiat.u1(x147))) + x150, x151 := bits.add_u64(x126, x141, u64(fiat.u1(x149))) + x152, x153 := bits.add_u64(x128, x143, u64(fiat.u1(x151))) + x155, x154 := bits.mul_u64(x144, 0xffffffff00000001) + x157, x156 := bits.mul_u64(x144, 0xffffffff) + x159, x158 := bits.mul_u64(x144, 0xffffffffffffffff) + x160, x161 := bits.add_u64(x159, x156, u64(0x0)) + x162 := (u64(fiat.u1(x161)) + x157) + _, x164 := bits.add_u64(x144, x158, u64(0x0)) + x165, x166 := bits.add_u64(x146, x160, u64(fiat.u1(x164))) + x167, x168 := bits.add_u64(x148, x162, u64(fiat.u1(x166))) + x169, x170 := bits.add_u64(x150, x154, u64(fiat.u1(x168))) + x171, x172 := bits.add_u64(x152, x155, u64(fiat.u1(x170))) + x173 := (u64(fiat.u1(x172)) + u64(fiat.u1(x153))) + x174, x175 := bits.sub_u64(x165, 0xffffffffffffffff, u64(0x0)) + x176, x177 := bits.sub_u64(x167, 0xffffffff, u64(fiat.u1(x175))) + x178, x179 := bits.sub_u64(x169, u64(0x0), u64(fiat.u1(x177))) + x180, x181 := bits.sub_u64(x171, 0xffffffff00000001, u64(fiat.u1(x179))) + _, x183 := bits.sub_u64(x173, u64(0x0), u64(fiat.u1(x181))) + x184 := fiat.cmovznz_u64(fiat.u1(x183), x174, x165) + x185 := fiat.cmovznz_u64(fiat.u1(x183), x176, x167) + x186 := fiat.cmovznz_u64(fiat.u1(x183), x178, x169) + x187 := fiat.cmovznz_u64(fiat.u1(x183), x180, x171) + out1[0] = x184 + out1[1] = x185 + out1[2] = x186 + out1[3] = x187 +} + +fe_add :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.add_u64(arg1[0], arg2[0], u64(0x0)) + x3, x4 := bits.add_u64(arg1[1], arg2[1], u64(fiat.u1(x2))) + x5, x6 := bits.add_u64(arg1[2], arg2[2], u64(fiat.u1(x4))) + x7, x8 := bits.add_u64(arg1[3], arg2[3], u64(fiat.u1(x6))) + x9, x10 := bits.sub_u64(x1, 0xffffffffffffffff, u64(0x0)) + x11, x12 := bits.sub_u64(x3, 0xffffffff, u64(fiat.u1(x10))) + x13, x14 := bits.sub_u64(x5, u64(0x0), u64(fiat.u1(x12))) + x15, x16 := bits.sub_u64(x7, 0xffffffff00000001, u64(fiat.u1(x14))) + _, x18 := bits.sub_u64(u64(fiat.u1(x8)), u64(0x0), u64(fiat.u1(x16))) + x19 := fiat.cmovznz_u64(fiat.u1(x18), x9, x1) + x20 := fiat.cmovznz_u64(fiat.u1(x18), x11, x3) + x21 := fiat.cmovznz_u64(fiat.u1(x18), x13, x5) + x22 := fiat.cmovznz_u64(fiat.u1(x18), x15, x7) + out1[0] = x19 + out1[1] = x20 + out1[2] = x21 + out1[3] = x22 +} + +fe_sub :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.sub_u64(arg1[0], arg2[0], u64(0x0)) + x3, x4 := bits.sub_u64(arg1[1], arg2[1], u64(fiat.u1(x2))) + x5, x6 := bits.sub_u64(arg1[2], arg2[2], u64(fiat.u1(x4))) + x7, x8 := bits.sub_u64(arg1[3], arg2[3], u64(fiat.u1(x6))) + x9 := fiat.cmovznz_u64(fiat.u1(x8), u64(0x0), 0xffffffffffffffff) + x10, x11 := bits.add_u64(x1, x9, u64(0x0)) + x12, x13 := bits.add_u64(x3, (x9 & 0xffffffff), u64(fiat.u1(x11))) + x14, x15 := bits.add_u64(x5, u64(0x0), u64(fiat.u1(x13))) + x16, _ := bits.add_u64(x7, (x9 & 0xffffffff00000001), u64(fiat.u1(x15))) + out1[0] = x10 + out1[1] = x12 + out1[2] = x14 + out1[3] = x16 +} + +fe_opp :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.sub_u64(u64(0x0), arg1[0], u64(0x0)) + x3, x4 := bits.sub_u64(u64(0x0), arg1[1], u64(fiat.u1(x2))) + x5, x6 := bits.sub_u64(u64(0x0), arg1[2], u64(fiat.u1(x4))) + x7, x8 := bits.sub_u64(u64(0x0), arg1[3], u64(fiat.u1(x6))) + x9 := fiat.cmovznz_u64(fiat.u1(x8), u64(0x0), 0xffffffffffffffff) + x10, x11 := bits.add_u64(x1, x9, u64(0x0)) + x12, x13 := bits.add_u64(x3, (x9 & 0xffffffff), u64(fiat.u1(x11))) + x14, x15 := bits.add_u64(x5, u64(0x0), u64(fiat.u1(x13))) + x16, _ := bits.add_u64(x7, (x9 & 0xffffffff00000001), u64(fiat.u1(x15))) + out1[0] = x10 + out1[1] = x12 + out1[2] = x14 + out1[3] = x16 +} + +fe_one :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element) { + out1[0] = 0x1 + out1[1] = 0xffffffff00000000 + out1[2] = 0xffffffffffffffff + out1[3] = 0xfffffffe +} + +fe_non_zero :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> u64 { + return arg1[0] | (arg1[1] | (arg1[2] | arg1[3])) +} + +@(optimization_mode = "none") +fe_cond_assign :: #force_no_inline proc "contextless" ( + out1, arg1: ^Montgomery_Domain_Field_Element, + arg2: int, +) { + x1 := fiat.cmovznz_u64(fiat.u1(arg2), out1[0], arg1[0]) + x2 := fiat.cmovznz_u64(fiat.u1(arg2), out1[1], arg1[1]) + x3 := fiat.cmovznz_u64(fiat.u1(arg2), out1[2], arg1[2]) + x4 := fiat.cmovznz_u64(fiat.u1(arg2), out1[3], arg1[3]) + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 +} + +fe_from_montgomery :: proc "contextless" ( + out1: ^Non_Montgomery_Domain_Field_Element, + arg1: ^Montgomery_Domain_Field_Element, +) { + x1 := arg1[0] + x3, x2 := bits.mul_u64(x1, 0xffffffff00000001) + x5, x4 := bits.mul_u64(x1, 0xffffffff) + x7, x6 := bits.mul_u64(x1, 0xffffffffffffffff) + x8, x9 := bits.add_u64(x7, x4, u64(0x0)) + _, x11 := bits.add_u64(x1, x6, u64(0x0)) + x12, x13 := bits.add_u64(u64(0x0), x8, u64(fiat.u1(x11))) + x14, x15 := bits.add_u64(x12, arg1[1], u64(0x0)) + x17, x16 := bits.mul_u64(x14, 0xffffffff00000001) + x19, x18 := bits.mul_u64(x14, 0xffffffff) + x21, x20 := bits.mul_u64(x14, 0xffffffffffffffff) + x22, x23 := bits.add_u64(x21, x18, u64(0x0)) + _, x25 := bits.add_u64(x14, x20, u64(0x0)) + x26, x27 := bits.add_u64((u64(fiat.u1(x15)) + (u64(fiat.u1(x13)) + (u64(fiat.u1(x9)) + x5))), x22, u64(fiat.u1(x25))) + x28, x29 := bits.add_u64(x2, (u64(fiat.u1(x23)) + x19), u64(fiat.u1(x27))) + x30, x31 := bits.add_u64(x3, x16, u64(fiat.u1(x29))) + x32, x33 := bits.add_u64(x26, arg1[2], u64(0x0)) + x34, x35 := bits.add_u64(x28, u64(0x0), u64(fiat.u1(x33))) + x36, x37 := bits.add_u64(x30, u64(0x0), u64(fiat.u1(x35))) + x39, x38 := bits.mul_u64(x32, 0xffffffff00000001) + x41, x40 := bits.mul_u64(x32, 0xffffffff) + x43, x42 := bits.mul_u64(x32, 0xffffffffffffffff) + x44, x45 := bits.add_u64(x43, x40, u64(0x0)) + _, x47 := bits.add_u64(x32, x42, u64(0x0)) + x48, x49 := bits.add_u64(x34, x44, u64(fiat.u1(x47))) + x50, x51 := bits.add_u64(x36, (u64(fiat.u1(x45)) + x41), u64(fiat.u1(x49))) + x52, x53 := bits.add_u64((u64(fiat.u1(x37)) + (u64(fiat.u1(x31)) + x17)), x38, u64(fiat.u1(x51))) + x54, x55 := bits.add_u64(x48, arg1[3], u64(0x0)) + x56, x57 := bits.add_u64(x50, u64(0x0), u64(fiat.u1(x55))) + x58, x59 := bits.add_u64(x52, u64(0x0), u64(fiat.u1(x57))) + x61, x60 := bits.mul_u64(x54, 0xffffffff00000001) + x63, x62 := bits.mul_u64(x54, 0xffffffff) + x65, x64 := bits.mul_u64(x54, 0xffffffffffffffff) + x66, x67 := bits.add_u64(x65, x62, u64(0x0)) + _, x69 := bits.add_u64(x54, x64, u64(0x0)) + x70, x71 := bits.add_u64(x56, x66, u64(fiat.u1(x69))) + x72, x73 := bits.add_u64(x58, (u64(fiat.u1(x67)) + x63), u64(fiat.u1(x71))) + x74, x75 := bits.add_u64((u64(fiat.u1(x59)) + (u64(fiat.u1(x53)) + x39)), x60, u64(fiat.u1(x73))) + x76 := (u64(fiat.u1(x75)) + x61) + x77, x78 := bits.sub_u64(x70, 0xffffffffffffffff, u64(0x0)) + x79, x80 := bits.sub_u64(x72, 0xffffffff, u64(fiat.u1(x78))) + x81, x82 := bits.sub_u64(x74, u64(0x0), u64(fiat.u1(x80))) + x83, x84 := bits.sub_u64(x76, 0xffffffff00000001, u64(fiat.u1(x82))) + _, x86 := bits.sub_u64(u64(0x0), u64(0x0), u64(fiat.u1(x84))) + x87 := fiat.cmovznz_u64(fiat.u1(x86), x77, x70) + x88 := fiat.cmovznz_u64(fiat.u1(x86), x79, x72) + x89 := fiat.cmovznz_u64(fiat.u1(x86), x81, x74) + x90 := fiat.cmovznz_u64(fiat.u1(x86), x83, x76) + out1[0] = x87 + out1[1] = x88 + out1[2] = x89 + out1[3] = x90 +} + +fe_to_montgomery :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: ^Non_Montgomery_Domain_Field_Element, +) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[0] + x6, x5 := bits.mul_u64(x4, 0x4fffffffd) + x8, x7 := bits.mul_u64(x4, 0xfffffffffffffffe) + x10, x9 := bits.mul_u64(x4, 0xfffffffbffffffff) + x12, x11 := bits.mul_u64(x4, 0x3) + x13, x14 := bits.add_u64(x12, x9, u64(0x0)) + x15, x16 := bits.add_u64(x10, x7, u64(fiat.u1(x14))) + x17, x18 := bits.add_u64(x8, x5, u64(fiat.u1(x16))) + x20, x19 := bits.mul_u64(x11, 0xffffffff00000001) + x22, x21 := bits.mul_u64(x11, 0xffffffff) + x24, x23 := bits.mul_u64(x11, 0xffffffffffffffff) + x25, x26 := bits.add_u64(x24, x21, u64(0x0)) + _, x28 := bits.add_u64(x11, x23, u64(0x0)) + x29, x30 := bits.add_u64(x13, x25, u64(fiat.u1(x28))) + x31, x32 := bits.add_u64(x15, (u64(fiat.u1(x26)) + x22), u64(fiat.u1(x30))) + x33, x34 := bits.add_u64(x17, x19, u64(fiat.u1(x32))) + x35, x36 := bits.add_u64((u64(fiat.u1(x18)) + x6), x20, u64(fiat.u1(x34))) + x38, x37 := bits.mul_u64(x1, 0x4fffffffd) + x40, x39 := bits.mul_u64(x1, 0xfffffffffffffffe) + x42, x41 := bits.mul_u64(x1, 0xfffffffbffffffff) + x44, x43 := bits.mul_u64(x1, 0x3) + x45, x46 := bits.add_u64(x44, x41, u64(0x0)) + x47, x48 := bits.add_u64(x42, x39, u64(fiat.u1(x46))) + x49, x50 := bits.add_u64(x40, x37, u64(fiat.u1(x48))) + x51, x52 := bits.add_u64(x29, x43, u64(0x0)) + x53, x54 := bits.add_u64(x31, x45, u64(fiat.u1(x52))) + x55, x56 := bits.add_u64(x33, x47, u64(fiat.u1(x54))) + x57, x58 := bits.add_u64(x35, x49, u64(fiat.u1(x56))) + x60, x59 := bits.mul_u64(x51, 0xffffffff00000001) + x62, x61 := bits.mul_u64(x51, 0xffffffff) + x64, x63 := bits.mul_u64(x51, 0xffffffffffffffff) + x65, x66 := bits.add_u64(x64, x61, u64(0x0)) + _, x68 := bits.add_u64(x51, x63, u64(0x0)) + x69, x70 := bits.add_u64(x53, x65, u64(fiat.u1(x68))) + x71, x72 := bits.add_u64(x55, (u64(fiat.u1(x66)) + x62), u64(fiat.u1(x70))) + x73, x74 := bits.add_u64(x57, x59, u64(fiat.u1(x72))) + x75, x76 := bits.add_u64(((u64(fiat.u1(x58)) + u64(fiat.u1(x36))) + (u64(fiat.u1(x50)) + x38)), x60, u64(fiat.u1(x74))) + x78, x77 := bits.mul_u64(x2, 0x4fffffffd) + x80, x79 := bits.mul_u64(x2, 0xfffffffffffffffe) + x82, x81 := bits.mul_u64(x2, 0xfffffffbffffffff) + x84, x83 := bits.mul_u64(x2, 0x3) + x85, x86 := bits.add_u64(x84, x81, u64(0x0)) + x87, x88 := bits.add_u64(x82, x79, u64(fiat.u1(x86))) + x89, x90 := bits.add_u64(x80, x77, u64(fiat.u1(x88))) + x91, x92 := bits.add_u64(x69, x83, u64(0x0)) + x93, x94 := bits.add_u64(x71, x85, u64(fiat.u1(x92))) + x95, x96 := bits.add_u64(x73, x87, u64(fiat.u1(x94))) + x97, x98 := bits.add_u64(x75, x89, u64(fiat.u1(x96))) + x100, x99 := bits.mul_u64(x91, 0xffffffff00000001) + x102, x101 := bits.mul_u64(x91, 0xffffffff) + x104, x103 := bits.mul_u64(x91, 0xffffffffffffffff) + x105, x106 := bits.add_u64(x104, x101, u64(0x0)) + _, x108 := bits.add_u64(x91, x103, u64(0x0)) + x109, x110 := bits.add_u64(x93, x105, u64(fiat.u1(x108))) + x111, x112 := bits.add_u64(x95, (u64(fiat.u1(x106)) + x102), u64(fiat.u1(x110))) + x113, x114 := bits.add_u64(x97, x99, u64(fiat.u1(x112))) + x115, x116 := bits.add_u64(((u64(fiat.u1(x98)) + u64(fiat.u1(x76))) + (u64(fiat.u1(x90)) + x78)), x100, u64(fiat.u1(x114))) + x118, x117 := bits.mul_u64(x3, 0x4fffffffd) + x120, x119 := bits.mul_u64(x3, 0xfffffffffffffffe) + x122, x121 := bits.mul_u64(x3, 0xfffffffbffffffff) + x124, x123 := bits.mul_u64(x3, 0x3) + x125, x126 := bits.add_u64(x124, x121, u64(0x0)) + x127, x128 := bits.add_u64(x122, x119, u64(fiat.u1(x126))) + x129, x130 := bits.add_u64(x120, x117, u64(fiat.u1(x128))) + x131, x132 := bits.add_u64(x109, x123, u64(0x0)) + x133, x134 := bits.add_u64(x111, x125, u64(fiat.u1(x132))) + x135, x136 := bits.add_u64(x113, x127, u64(fiat.u1(x134))) + x137, x138 := bits.add_u64(x115, x129, u64(fiat.u1(x136))) + x140, x139 := bits.mul_u64(x131, 0xffffffff00000001) + x142, x141 := bits.mul_u64(x131, 0xffffffff) + x144, x143 := bits.mul_u64(x131, 0xffffffffffffffff) + x145, x146 := bits.add_u64(x144, x141, u64(0x0)) + _, x148 := bits.add_u64(x131, x143, u64(0x0)) + x149, x150 := bits.add_u64(x133, x145, u64(fiat.u1(x148))) + x151, x152 := bits.add_u64(x135, (u64(fiat.u1(x146)) + x142), u64(fiat.u1(x150))) + x153, x154 := bits.add_u64(x137, x139, u64(fiat.u1(x152))) + x155, x156 := bits.add_u64(((u64(fiat.u1(x138)) + u64(fiat.u1(x116))) + (u64(fiat.u1(x130)) + x118)), x140, u64(fiat.u1(x154))) + x157, x158 := bits.sub_u64(x149, 0xffffffffffffffff, u64(0x0)) + x159, x160 := bits.sub_u64(x151, 0xffffffff, u64(fiat.u1(x158))) + x161, x162 := bits.sub_u64(x153, u64(0x0), u64(fiat.u1(x160))) + x163, x164 := bits.sub_u64(x155, 0xffffffff00000001, u64(fiat.u1(x162))) + _, x166 := bits.sub_u64(u64(fiat.u1(x156)), u64(0x0), u64(fiat.u1(x164))) + x167 := fiat.cmovznz_u64(fiat.u1(x166), x157, x149) + x168 := fiat.cmovznz_u64(fiat.u1(x166), x159, x151) + x169 := fiat.cmovznz_u64(fiat.u1(x166), x161, x153) + x170 := fiat.cmovznz_u64(fiat.u1(x166), x163, x155) + out1[0] = x167 + out1[1] = x168 + out1[2] = x169 + out1[3] = x170 +} diff --git a/core/crypto/_fiat/field_scalarp256r1/field.odin b/core/crypto/_fiat/field_scalarp256r1/field.odin new file mode 100644 index 000000000..73c01fb46 --- /dev/null +++ b/core/crypto/_fiat/field_scalarp256r1/field.odin @@ -0,0 +1,210 @@ +package field_scalarp256r1 + +import subtle "core:crypto/_subtle" +import "core:encoding/endian" +import "core:math/bits" +import "core:mem" + +@(private, rodata) +TWO_192 := Montgomery_Domain_Field_Element{ + 2482910415990817935, + 2879494685571067143, + 8732918506673730078, + 85565669603516024, +} +@(private, rodata) +TWO_384 := Montgomery_Domain_Field_Element{ + 2127524300190691059, + 17014302137236182484, + 16604910261202196099, + 3621421107472562910, +} +// 2^384 % p (From sage) +// 0x431905529c0166ce652e96b7ccca0a99679b73e19ad16947f01cf013fc632551 + +fe_clear :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) { + mem.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) +} + +fe_clear_vec :: proc "contextless" ( + arg1: []^Montgomery_Domain_Field_Element, +) { + for fe in arg1 { + fe_clear(fe) + } +} + +fe_from_bytes :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: []byte, +) -> bool { + ensure_contextless(len(out1) <= 64, "p256r1: invalid scalar input buffer") + + is_canonical := false + s_len := len(arg1) + switch { + case s_len < 32: + // No way this can be greater than the order. + fe_unchecked_set(out1, arg1) + is_canonical = true + case s_len == 32: + // It is quite likely that a reduction mod p is required, + // as the order of the curve is sufficiently smaller than + // 2^256-1, so just check if we actually needed to reduced + // and do the reduction anyway, so that things that require + // canonical scalars can reject non-canonical encodings. + is_canonical = fe_is_canonical(arg1) + fallthrough + case: + // Use Frank Denis' trick, as documented by Filippo Valsorda + // at https://words.filippo.io/dispatches/wide-reduction/ + // + // "I represent the value as a+b*2^192+c*2^384" + // + // Note: Omitting the `c` computation is fine as, reduction + // being length dependent provides no useful timing information. + + // Zero extend to 512-bits. + src_512: [64]byte + copy(src_512[64-s_len:], arg1) + defer mem.zero_explicit(&src_512, size_of(src_512)) + + fe_unchecked_set(out1, src_512[40:]) // a + b: Montgomery_Domain_Field_Element + fe_unchecked_set(&b, src_512[16:40]) // b + + fe_mul(&b, &b, &TWO_192) + fe_add(out1, out1, &b) + if s_len >= 48 { + c: Montgomery_Domain_Field_Element + fe_unchecked_set(&c, src_512[:16]) // c + fe_mul(&c, &c, &TWO_384) + fe_add(out1, out1, &c) + + fe_clear(&c) + } + + fe_clear(&b) + } + + return !is_canonical +} + +@(private) +fe_is_canonical :: proc "contextless" (arg1: []byte) -> bool { + _, borrow := bits.sub_u64(ELL[0] - 1, endian.unchecked_get_u64be(arg1[24:]), 0) + _, borrow = bits.sub_u64(ELL[1], endian.unchecked_get_u64be(arg1[16:]), borrow) + _, borrow = bits.sub_u64(ELL[2], endian.unchecked_get_u64be(arg1[8:]), borrow) + _, borrow = bits.sub_u64(ELL[3], endian.unchecked_get_u64be(arg1[0:]), borrow) + return borrow == 0 +} + +@(private) +fe_unchecked_set :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element, arg1: []byte) { + arg1_256: [32]byte + defer mem.zero_explicit(&arg1_256, size_of(arg1_256)) + copy(arg1_256[32-len(arg1):], arg1) + + tmp := Non_Montgomery_Domain_Field_Element { + endian.unchecked_get_u64be(arg1_256[24:]), + endian.unchecked_get_u64be(arg1_256[16:]), + endian.unchecked_get_u64be(arg1_256[8:]), + endian.unchecked_get_u64be(arg1_256[0:]), + } + defer mem.zero_explicit(&tmp, size_of(tmp)) + + fe_to_montgomery(out1, &tmp) +} + +fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_Element) { + ensure_contextless(len(out1) == 32, "p256r1: invalid scalar output buffer") + + tmp: Non_Montgomery_Domain_Field_Element + fe_from_montgomery(&tmp, arg1) + + // Note: Likewise, output in big-endian. + endian.unchecked_put_u64be(out1[24:], tmp[0]) + endian.unchecked_put_u64be(out1[16:], tmp[1]) + endian.unchecked_put_u64be(out1[8:], tmp[2]) + endian.unchecked_put_u64be(out1[0:], tmp[3]) + + mem.zero_explicit(&tmp, size_of(tmp)) +} + +fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> int { + tmp: Montgomery_Domain_Field_Element + fe_sub(&tmp, arg1, arg2) + + is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) + + fe_clear(&tmp) + + return int(is_eq) +} + +fe_is_odd :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> int { + tmp: Non_Montgomery_Domain_Field_Element + defer mem.zero_explicit(&tmp, size_of(tmp)) + + fe_from_montgomery(&tmp, arg1) + return int(tmp[0] & 1) +} + +fe_zero :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element) { + out1[0] = 0 + out1[1] = 0 + out1[2] = 0 + out1[3] = 0 +} + +fe_set :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1 := arg1[0] + x2 := arg1[1] + x3 := arg1[2] + x4 := arg1[3] + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 +} + +@(optimization_mode = "none") +fe_cond_swap :: #force_no_inline proc "contextless" (out1, out2: ^Montgomery_Domain_Field_Element, arg1: int) { + mask := (u64(arg1) * 0xffffffffffffffff) + x := (out1[0] ~ out2[0]) & mask + x1, y1 := out1[0] ~ x, out2[0] ~ x + x = (out1[1] ~ out2[1]) & mask + x2, y2 := out1[1] ~ x, out2[1] ~ x + x = (out1[2] ~ out2[2]) & mask + x3, y3 := out1[2] ~ x, out2[2] ~ x + x = (out1[3] ~ out2[3]) & mask + x4, y4 := out1[3] ~ x, out2[3] ~ x + out1[0], out2[0] = x1, y1 + out1[1], out2[1] = x2, y2 + out1[2], out2[2] = x3, y3 + out1[3], out2[3] = x4, y4 +} + +@(optimization_mode = "none") +fe_cond_select :: #force_no_inline proc "contextless" ( + out1, arg1, arg2: ^Montgomery_Domain_Field_Element, + arg3: int, +) { + mask := (u64(arg3) * 0xffffffffffffffff) + x1 := ((mask & arg2[0]) | ((~mask) & arg1[0])) + x2 := ((mask & arg2[1]) | ((~mask) & arg1[1])) + x3 := ((mask & arg2[2]) | ((~mask) & arg1[2])) + x4 := ((mask & arg2[3]) | ((~mask) & arg1[3])) + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 +} + +fe_cond_negate :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element, ctrl: int) { + tmp1: Montgomery_Domain_Field_Element = --- + fe_opp(&tmp1, arg1) + fe_cond_select(out1, arg1, &tmp1, ctrl) + + fe_clear(&tmp1) +} diff --git a/core/crypto/_fiat/field_scalarp256r1/field64.odin b/core/crypto/_fiat/field_scalarp256r1/field64.odin new file mode 100644 index 000000000..4217374a7 --- /dev/null +++ b/core/crypto/_fiat/field_scalarp256r1/field64.odin @@ -0,0 +1,569 @@ +// The BSD 1-Clause License (BSD-1-Clause) +// +// Copyright (c) 2015-2020 the fiat-crypto authors (see the AUTHORS file) +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY the fiat-crypto authors "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, +// Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package field_scalarp256r1 + +// The file provides arithmetic on the field Z/(2^256 - 2^224 + 2^192 - +// 89188191075325690597107910205041859247) using a 64-bit Montgomery form +// internal representation. It is derived primarily from the machine +// generated Golang output from the fiat-crypto project. +// +// While the base implementation is provably correct, this implementation +// makes no such claims as the port and optimizations were done by hand. +// +// WARNING: While big-endian is the common representation used for this +// curve, the fiat output uses least-significant-limb first. + +import fiat "core:crypto/_fiat" +import "core:math/bits" + +// ELL is the saturated representation of the field order, least-significant +// limb first. +ELL :: [4]u64{0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000} + +Montgomery_Domain_Field_Element :: distinct [4]u64 +Non_Montgomery_Domain_Field_Element :: distinct [4]u64 + +fe_mul :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[0] + x6, x5 := bits.mul_u64(x4, arg2[3]) + x8, x7 := bits.mul_u64(x4, arg2[2]) + x10, x9 := bits.mul_u64(x4, arg2[1]) + x12, x11 := bits.mul_u64(x4, arg2[0]) + x13, x14 := bits.add_u64(x12, x9, u64(0x0)) + x15, x16 := bits.add_u64(x10, x7, u64(fiat.u1(x14))) + x17, x18 := bits.add_u64(x8, x5, u64(fiat.u1(x16))) + x19 := (u64(fiat.u1(x18)) + x6) + _, x20 := bits.mul_u64(x11, 0xccd1c8aaee00bc4f) + x23, x22 := bits.mul_u64(x20, 0xffffffff00000000) + x25, x24 := bits.mul_u64(x20, 0xffffffffffffffff) + x27, x26 := bits.mul_u64(x20, 0xbce6faada7179e84) + x29, x28 := bits.mul_u64(x20, 0xf3b9cac2fc632551) + x30, x31 := bits.add_u64(x29, x26, u64(0x0)) + x32, x33 := bits.add_u64(x27, x24, u64(fiat.u1(x31))) + x34, x35 := bits.add_u64(x25, x22, u64(fiat.u1(x33))) + x36 := (u64(fiat.u1(x35)) + x23) + _, x38 := bits.add_u64(x11, x28, u64(0x0)) + x39, x40 := bits.add_u64(x13, x30, u64(fiat.u1(x38))) + x41, x42 := bits.add_u64(x15, x32, u64(fiat.u1(x40))) + x43, x44 := bits.add_u64(x17, x34, u64(fiat.u1(x42))) + x45, x46 := bits.add_u64(x19, x36, u64(fiat.u1(x44))) + x48, x47 := bits.mul_u64(x1, arg2[3]) + x50, x49 := bits.mul_u64(x1, arg2[2]) + x52, x51 := bits.mul_u64(x1, arg2[1]) + x54, x53 := bits.mul_u64(x1, arg2[0]) + x55, x56 := bits.add_u64(x54, x51, u64(0x0)) + x57, x58 := bits.add_u64(x52, x49, u64(fiat.u1(x56))) + x59, x60 := bits.add_u64(x50, x47, u64(fiat.u1(x58))) + x61 := (u64(fiat.u1(x60)) + x48) + x62, x63 := bits.add_u64(x39, x53, u64(0x0)) + x64, x65 := bits.add_u64(x41, x55, u64(fiat.u1(x63))) + x66, x67 := bits.add_u64(x43, x57, u64(fiat.u1(x65))) + x68, x69 := bits.add_u64(x45, x59, u64(fiat.u1(x67))) + x70, x71 := bits.add_u64(u64(fiat.u1(x46)), x61, u64(fiat.u1(x69))) + _, x72 := bits.mul_u64(x62, 0xccd1c8aaee00bc4f) + x75, x74 := bits.mul_u64(x72, 0xffffffff00000000) + x77, x76 := bits.mul_u64(x72, 0xffffffffffffffff) + x79, x78 := bits.mul_u64(x72, 0xbce6faada7179e84) + x81, x80 := bits.mul_u64(x72, 0xf3b9cac2fc632551) + x82, x83 := bits.add_u64(x81, x78, u64(0x0)) + x84, x85 := bits.add_u64(x79, x76, u64(fiat.u1(x83))) + x86, x87 := bits.add_u64(x77, x74, u64(fiat.u1(x85))) + x88 := (u64(fiat.u1(x87)) + x75) + _, x90 := bits.add_u64(x62, x80, u64(0x0)) + x91, x92 := bits.add_u64(x64, x82, u64(fiat.u1(x90))) + x93, x94 := bits.add_u64(x66, x84, u64(fiat.u1(x92))) + x95, x96 := bits.add_u64(x68, x86, u64(fiat.u1(x94))) + x97, x98 := bits.add_u64(x70, x88, u64(fiat.u1(x96))) + x99 := (u64(fiat.u1(x98)) + u64(fiat.u1(x71))) + x101, x100 := bits.mul_u64(x2, arg2[3]) + x103, x102 := bits.mul_u64(x2, arg2[2]) + x105, x104 := bits.mul_u64(x2, arg2[1]) + x107, x106 := bits.mul_u64(x2, arg2[0]) + x108, x109 := bits.add_u64(x107, x104, u64(0x0)) + x110, x111 := bits.add_u64(x105, x102, u64(fiat.u1(x109))) + x112, x113 := bits.add_u64(x103, x100, u64(fiat.u1(x111))) + x114 := (u64(fiat.u1(x113)) + x101) + x115, x116 := bits.add_u64(x91, x106, u64(0x0)) + x117, x118 := bits.add_u64(x93, x108, u64(fiat.u1(x116))) + x119, x120 := bits.add_u64(x95, x110, u64(fiat.u1(x118))) + x121, x122 := bits.add_u64(x97, x112, u64(fiat.u1(x120))) + x123, x124 := bits.add_u64(x99, x114, u64(fiat.u1(x122))) + _, x125 := bits.mul_u64(x115, 0xccd1c8aaee00bc4f) + x128, x127 := bits.mul_u64(x125, 0xffffffff00000000) + x130, x129 := bits.mul_u64(x125, 0xffffffffffffffff) + x132, x131 := bits.mul_u64(x125, 0xbce6faada7179e84) + x134, x133 := bits.mul_u64(x125, 0xf3b9cac2fc632551) + x135, x136 := bits.add_u64(x134, x131, u64(0x0)) + x137, x138 := bits.add_u64(x132, x129, u64(fiat.u1(x136))) + x139, x140 := bits.add_u64(x130, x127, u64(fiat.u1(x138))) + x141 := (u64(fiat.u1(x140)) + x128) + _, x143 := bits.add_u64(x115, x133, u64(0x0)) + x144, x145 := bits.add_u64(x117, x135, u64(fiat.u1(x143))) + x146, x147 := bits.add_u64(x119, x137, u64(fiat.u1(x145))) + x148, x149 := bits.add_u64(x121, x139, u64(fiat.u1(x147))) + x150, x151 := bits.add_u64(x123, x141, u64(fiat.u1(x149))) + x152 := (u64(fiat.u1(x151)) + u64(fiat.u1(x124))) + x154, x153 := bits.mul_u64(x3, arg2[3]) + x156, x155 := bits.mul_u64(x3, arg2[2]) + x158, x157 := bits.mul_u64(x3, arg2[1]) + x160, x159 := bits.mul_u64(x3, arg2[0]) + x161, x162 := bits.add_u64(x160, x157, u64(0x0)) + x163, x164 := bits.add_u64(x158, x155, u64(fiat.u1(x162))) + x165, x166 := bits.add_u64(x156, x153, u64(fiat.u1(x164))) + x167 := (u64(fiat.u1(x166)) + x154) + x168, x169 := bits.add_u64(x144, x159, u64(0x0)) + x170, x171 := bits.add_u64(x146, x161, u64(fiat.u1(x169))) + x172, x173 := bits.add_u64(x148, x163, u64(fiat.u1(x171))) + x174, x175 := bits.add_u64(x150, x165, u64(fiat.u1(x173))) + x176, x177 := bits.add_u64(x152, x167, u64(fiat.u1(x175))) + _, x178 := bits.mul_u64(x168, 0xccd1c8aaee00bc4f) + x181, x180 := bits.mul_u64(x178, 0xffffffff00000000) + x183, x182 := bits.mul_u64(x178, 0xffffffffffffffff) + x185, x184 := bits.mul_u64(x178, 0xbce6faada7179e84) + x187, x186 := bits.mul_u64(x178, 0xf3b9cac2fc632551) + x188, x189 := bits.add_u64(x187, x184, u64(0x0)) + x190, x191 := bits.add_u64(x185, x182, u64(fiat.u1(x189))) + x192, x193 := bits.add_u64(x183, x180, u64(fiat.u1(x191))) + x194 := (u64(fiat.u1(x193)) + x181) + _, x196 := bits.add_u64(x168, x186, u64(0x0)) + x197, x198 := bits.add_u64(x170, x188, u64(fiat.u1(x196))) + x199, x200 := bits.add_u64(x172, x190, u64(fiat.u1(x198))) + x201, x202 := bits.add_u64(x174, x192, u64(fiat.u1(x200))) + x203, x204 := bits.add_u64(x176, x194, u64(fiat.u1(x202))) + x205 := (u64(fiat.u1(x204)) + u64(fiat.u1(x177))) + x206, x207 := bits.sub_u64(x197, 0xf3b9cac2fc632551, u64(0x0)) + x208, x209 := bits.sub_u64(x199, 0xbce6faada7179e84, u64(fiat.u1(x207))) + x210, x211 := bits.sub_u64(x201, 0xffffffffffffffff, u64(fiat.u1(x209))) + x212, x213 := bits.sub_u64(x203, 0xffffffff00000000, u64(fiat.u1(x211))) + _, x215 := bits.sub_u64(x205, u64(0x0), u64(fiat.u1(x213))) + x216 := fiat.cmovznz_u64(fiat.u1(x215), x206, x197) + x217 := fiat.cmovznz_u64(fiat.u1(x215), x208, x199) + x218 := fiat.cmovznz_u64(fiat.u1(x215), x210, x201) + x219 := fiat.cmovznz_u64(fiat.u1(x215), x212, x203) + out1[0] = x216 + out1[1] = x217 + out1[2] = x218 + out1[3] = x219 +} + +fe_square :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[0] + x6, x5 := bits.mul_u64(x4, arg1[3]) + x8, x7 := bits.mul_u64(x4, arg1[2]) + x10, x9 := bits.mul_u64(x4, arg1[1]) + x12, x11 := bits.mul_u64(x4, arg1[0]) + x13, x14 := bits.add_u64(x12, x9, u64(0x0)) + x15, x16 := bits.add_u64(x10, x7, u64(fiat.u1(x14))) + x17, x18 := bits.add_u64(x8, x5, u64(fiat.u1(x16))) + x19 := (u64(fiat.u1(x18)) + x6) + _, x20 := bits.mul_u64(x11, 0xccd1c8aaee00bc4f) + x23, x22 := bits.mul_u64(x20, 0xffffffff00000000) + x25, x24 := bits.mul_u64(x20, 0xffffffffffffffff) + x27, x26 := bits.mul_u64(x20, 0xbce6faada7179e84) + x29, x28 := bits.mul_u64(x20, 0xf3b9cac2fc632551) + x30, x31 := bits.add_u64(x29, x26, u64(0x0)) + x32, x33 := bits.add_u64(x27, x24, u64(fiat.u1(x31))) + x34, x35 := bits.add_u64(x25, x22, u64(fiat.u1(x33))) + x36 := (u64(fiat.u1(x35)) + x23) + _, x38 := bits.add_u64(x11, x28, u64(0x0)) + x39, x40 := bits.add_u64(x13, x30, u64(fiat.u1(x38))) + x41, x42 := bits.add_u64(x15, x32, u64(fiat.u1(x40))) + x43, x44 := bits.add_u64(x17, x34, u64(fiat.u1(x42))) + x45, x46 := bits.add_u64(x19, x36, u64(fiat.u1(x44))) + x48, x47 := bits.mul_u64(x1, arg1[3]) + x50, x49 := bits.mul_u64(x1, arg1[2]) + x52, x51 := bits.mul_u64(x1, arg1[1]) + x54, x53 := bits.mul_u64(x1, arg1[0]) + x55, x56 := bits.add_u64(x54, x51, u64(0x0)) + x57, x58 := bits.add_u64(x52, x49, u64(fiat.u1(x56))) + x59, x60 := bits.add_u64(x50, x47, u64(fiat.u1(x58))) + x61 := (u64(fiat.u1(x60)) + x48) + x62, x63 := bits.add_u64(x39, x53, u64(0x0)) + x64, x65 := bits.add_u64(x41, x55, u64(fiat.u1(x63))) + x66, x67 := bits.add_u64(x43, x57, u64(fiat.u1(x65))) + x68, x69 := bits.add_u64(x45, x59, u64(fiat.u1(x67))) + x70, x71 := bits.add_u64(u64(fiat.u1(x46)), x61, u64(fiat.u1(x69))) + _, x72 := bits.mul_u64(x62, 0xccd1c8aaee00bc4f) + x75, x74 := bits.mul_u64(x72, 0xffffffff00000000) + x77, x76 := bits.mul_u64(x72, 0xffffffffffffffff) + x79, x78 := bits.mul_u64(x72, 0xbce6faada7179e84) + x81, x80 := bits.mul_u64(x72, 0xf3b9cac2fc632551) + x82, x83 := bits.add_u64(x81, x78, u64(0x0)) + x84, x85 := bits.add_u64(x79, x76, u64(fiat.u1(x83))) + x86, x87 := bits.add_u64(x77, x74, u64(fiat.u1(x85))) + x88 := (u64(fiat.u1(x87)) + x75) + _, x90 := bits.add_u64(x62, x80, u64(0x0)) + x91, x92 := bits.add_u64(x64, x82, u64(fiat.u1(x90))) + x93, x94 := bits.add_u64(x66, x84, u64(fiat.u1(x92))) + x95, x96 := bits.add_u64(x68, x86, u64(fiat.u1(x94))) + x97, x98 := bits.add_u64(x70, x88, u64(fiat.u1(x96))) + x99 := (u64(fiat.u1(x98)) + u64(fiat.u1(x71))) + x101, x100 := bits.mul_u64(x2, arg1[3]) + x103, x102 := bits.mul_u64(x2, arg1[2]) + x105, x104 := bits.mul_u64(x2, arg1[1]) + x107, x106 := bits.mul_u64(x2, arg1[0]) + x108, x109 := bits.add_u64(x107, x104, u64(0x0)) + x110, x111 := bits.add_u64(x105, x102, u64(fiat.u1(x109))) + x112, x113 := bits.add_u64(x103, x100, u64(fiat.u1(x111))) + x114 := (u64(fiat.u1(x113)) + x101) + x115, x116 := bits.add_u64(x91, x106, u64(0x0)) + x117, x118 := bits.add_u64(x93, x108, u64(fiat.u1(x116))) + x119, x120 := bits.add_u64(x95, x110, u64(fiat.u1(x118))) + x121, x122 := bits.add_u64(x97, x112, u64(fiat.u1(x120))) + x123, x124 := bits.add_u64(x99, x114, u64(fiat.u1(x122))) + _, x125 := bits.mul_u64(x115, 0xccd1c8aaee00bc4f) + x128, x127 := bits.mul_u64(x125, 0xffffffff00000000) + x130, x129 := bits.mul_u64(x125, 0xffffffffffffffff) + x132, x131 := bits.mul_u64(x125, 0xbce6faada7179e84) + x134, x133 := bits.mul_u64(x125, 0xf3b9cac2fc632551) + x135, x136 := bits.add_u64(x134, x131, u64(0x0)) + x137, x138 := bits.add_u64(x132, x129, u64(fiat.u1(x136))) + x139, x140 := bits.add_u64(x130, x127, u64(fiat.u1(x138))) + x141 := (u64(fiat.u1(x140)) + x128) + _, x143 := bits.add_u64(x115, x133, u64(0x0)) + x144, x145 := bits.add_u64(x117, x135, u64(fiat.u1(x143))) + x146, x147 := bits.add_u64(x119, x137, u64(fiat.u1(x145))) + x148, x149 := bits.add_u64(x121, x139, u64(fiat.u1(x147))) + x150, x151 := bits.add_u64(x123, x141, u64(fiat.u1(x149))) + x152 := (u64(fiat.u1(x151)) + u64(fiat.u1(x124))) + x154, x153 := bits.mul_u64(x3, arg1[3]) + x156, x155 := bits.mul_u64(x3, arg1[2]) + x158, x157 := bits.mul_u64(x3, arg1[1]) + x160, x159 := bits.mul_u64(x3, arg1[0]) + x161, x162 := bits.add_u64(x160, x157, u64(0x0)) + x163, x164 := bits.add_u64(x158, x155, u64(fiat.u1(x162))) + x165, x166 := bits.add_u64(x156, x153, u64(fiat.u1(x164))) + x167 := (u64(fiat.u1(x166)) + x154) + x168, x169 := bits.add_u64(x144, x159, u64(0x0)) + x170, x171 := bits.add_u64(x146, x161, u64(fiat.u1(x169))) + x172, x173 := bits.add_u64(x148, x163, u64(fiat.u1(x171))) + x174, x175 := bits.add_u64(x150, x165, u64(fiat.u1(x173))) + x176, x177 := bits.add_u64(x152, x167, u64(fiat.u1(x175))) + _, x178 := bits.mul_u64(x168, 0xccd1c8aaee00bc4f) + x181, x180 := bits.mul_u64(x178, 0xffffffff00000000) + x183, x182 := bits.mul_u64(x178, 0xffffffffffffffff) + x185, x184 := bits.mul_u64(x178, 0xbce6faada7179e84) + x187, x186 := bits.mul_u64(x178, 0xf3b9cac2fc632551) + x188, x189 := bits.add_u64(x187, x184, u64(0x0)) + x190, x191 := bits.add_u64(x185, x182, u64(fiat.u1(x189))) + x192, x193 := bits.add_u64(x183, x180, u64(fiat.u1(x191))) + x194 := (u64(fiat.u1(x193)) + x181) + _, x196 := bits.add_u64(x168, x186, u64(0x0)) + x197, x198 := bits.add_u64(x170, x188, u64(fiat.u1(x196))) + x199, x200 := bits.add_u64(x172, x190, u64(fiat.u1(x198))) + x201, x202 := bits.add_u64(x174, x192, u64(fiat.u1(x200))) + x203, x204 := bits.add_u64(x176, x194, u64(fiat.u1(x202))) + x205 := (u64(fiat.u1(x204)) + u64(fiat.u1(x177))) + x206, x207 := bits.sub_u64(x197, 0xf3b9cac2fc632551, u64(0x0)) + x208, x209 := bits.sub_u64(x199, 0xbce6faada7179e84, u64(fiat.u1(x207))) + x210, x211 := bits.sub_u64(x201, 0xffffffffffffffff, u64(fiat.u1(x209))) + x212, x213 := bits.sub_u64(x203, 0xffffffff00000000, u64(fiat.u1(x211))) + _, x215 := bits.sub_u64(x205, u64(0x0), u64(fiat.u1(x213))) + x216 := fiat.cmovznz_u64(fiat.u1(x215), x206, x197) + x217 := fiat.cmovznz_u64(fiat.u1(x215), x208, x199) + x218 := fiat.cmovznz_u64(fiat.u1(x215), x210, x201) + x219 := fiat.cmovznz_u64(fiat.u1(x215), x212, x203) + out1[0] = x216 + out1[1] = x217 + out1[2] = x218 + out1[3] = x219 +} + +fe_add :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.add_u64(arg1[0], arg2[0], u64(0x0)) + x3, x4 := bits.add_u64(arg1[1], arg2[1], u64(fiat.u1(x2))) + x5, x6 := bits.add_u64(arg1[2], arg2[2], u64(fiat.u1(x4))) + x7, x8 := bits.add_u64(arg1[3], arg2[3], u64(fiat.u1(x6))) + x9, x10 := bits.sub_u64(x1, 0xf3b9cac2fc632551, u64(0x0)) + x11, x12 := bits.sub_u64(x3, 0xbce6faada7179e84, u64(fiat.u1(x10))) + x13, x14 := bits.sub_u64(x5, 0xffffffffffffffff, u64(fiat.u1(x12))) + x15, x16 := bits.sub_u64(x7, 0xffffffff00000000, u64(fiat.u1(x14))) + _, x18 := bits.sub_u64(u64(fiat.u1(x8)), u64(0x0), u64(fiat.u1(x16))) + x19 := fiat.cmovznz_u64(fiat.u1(x18), x9, x1) + x20 := fiat.cmovznz_u64(fiat.u1(x18), x11, x3) + x21 := fiat.cmovznz_u64(fiat.u1(x18), x13, x5) + x22 := fiat.cmovznz_u64(fiat.u1(x18), x15, x7) + out1[0] = x19 + out1[1] = x20 + out1[2] = x21 + out1[3] = x22 +} + +fe_sub :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.sub_u64(arg1[0], arg2[0], u64(0x0)) + x3, x4 := bits.sub_u64(arg1[1], arg2[1], u64(fiat.u1(x2))) + x5, x6 := bits.sub_u64(arg1[2], arg2[2], u64(fiat.u1(x4))) + x7, x8 := bits.sub_u64(arg1[3], arg2[3], u64(fiat.u1(x6))) + x9 := fiat.cmovznz_u64(fiat.u1(x8), u64(0x0), 0xffffffffffffffff) + x10, x11 := bits.add_u64(x1, (x9 & 0xf3b9cac2fc632551), u64(0x0)) + x12, x13 := bits.add_u64(x3, (x9 & 0xbce6faada7179e84), u64(fiat.u1(x11))) + x14, x15 := bits.add_u64(x5, x9, u64(fiat.u1(x13))) + x16, _ := bits.add_u64(x7, (x9 & 0xffffffff00000000), u64(fiat.u1(x15))) + out1[0] = x10 + out1[1] = x12 + out1[2] = x14 + out1[3] = x16 +} + +fe_opp :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.sub_u64(u64(0x0), arg1[0], u64(0x0)) + x3, x4 := bits.sub_u64(u64(0x0), arg1[1], u64(fiat.u1(x2))) + x5, x6 := bits.sub_u64(u64(0x0), arg1[2], u64(fiat.u1(x4))) + x7, x8 := bits.sub_u64(u64(0x0), arg1[3], u64(fiat.u1(x6))) + x9 := fiat.cmovznz_u64(fiat.u1(x8), u64(0x0), 0xffffffffffffffff) + x10, x11 := bits.add_u64(x1, (x9 & 0xf3b9cac2fc632551), u64(0x0)) + x12, x13 := bits.add_u64(x3, (x9 & 0xbce6faada7179e84), u64(fiat.u1(x11))) + x14, x15 := bits.add_u64(x5, x9, u64(fiat.u1(x13))) + x16, _ := bits.add_u64(x7, (x9 & 0xffffffff00000000), u64(fiat.u1(x15))) + out1[0] = x10 + out1[1] = x12 + out1[2] = x14 + out1[3] = x16 +} + +fe_one :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element) { + out1[0] = 0xc46353d039cdaaf + out1[1] = 0x4319055258e8617b + out1[2] = u64(0x0) + out1[3] = 0xffffffff +} + +fe_non_zero :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> u64 { + return arg1[0] | (arg1[1] | (arg1[2] | arg1[3])) +} + +@(optimization_mode = "none") +fe_cond_assign :: #force_no_inline proc "contextless" ( + out1, arg1: ^Montgomery_Domain_Field_Element, + arg2: int, +) { + x1 := fiat.cmovznz_u64(fiat.u1(arg2), out1[0], arg1[0]) + x2 := fiat.cmovznz_u64(fiat.u1(arg2), out1[1], arg1[1]) + x3 := fiat.cmovznz_u64(fiat.u1(arg2), out1[2], arg1[2]) + x4 := fiat.cmovznz_u64(fiat.u1(arg2), out1[3], arg1[3]) + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 +} + +fe_from_montgomery :: proc "contextless" ( + out1: ^Non_Montgomery_Domain_Field_Element, + arg1: ^Montgomery_Domain_Field_Element, +) { + x1 := arg1[0] + _, x2 := bits.mul_u64(x1, 0xccd1c8aaee00bc4f) + x5, x4 := bits.mul_u64(x2, 0xffffffff00000000) + x7, x6 := bits.mul_u64(x2, 0xffffffffffffffff) + x9, x8 := bits.mul_u64(x2, 0xbce6faada7179e84) + x11, x10 := bits.mul_u64(x2, 0xf3b9cac2fc632551) + x12, x13 := bits.add_u64(x11, x8, u64(0x0)) + x14, x15 := bits.add_u64(x9, x6, u64(fiat.u1(x13))) + x16, x17 := bits.add_u64(x7, x4, u64(fiat.u1(x15))) + _, x19 := bits.add_u64(x1, x10, u64(0x0)) + x20, x21 := bits.add_u64(u64(0x0), x12, u64(fiat.u1(x19))) + x22, x23 := bits.add_u64(u64(0x0), x14, u64(fiat.u1(x21))) + x24, x25 := bits.add_u64(u64(0x0), x16, u64(fiat.u1(x23))) + x26, x27 := bits.add_u64(x20, arg1[1], u64(0x0)) + x28, x29 := bits.add_u64(x22, u64(0x0), u64(fiat.u1(x27))) + x30, x31 := bits.add_u64(x24, u64(0x0), u64(fiat.u1(x29))) + _, x32 := bits.mul_u64(x26, 0xccd1c8aaee00bc4f) + x35, x34 := bits.mul_u64(x32, 0xffffffff00000000) + x37, x36 := bits.mul_u64(x32, 0xffffffffffffffff) + x39, x38 := bits.mul_u64(x32, 0xbce6faada7179e84) + x41, x40 := bits.mul_u64(x32, 0xf3b9cac2fc632551) + x42, x43 := bits.add_u64(x41, x38, u64(0x0)) + x44, x45 := bits.add_u64(x39, x36, u64(fiat.u1(x43))) + x46, x47 := bits.add_u64(x37, x34, u64(fiat.u1(x45))) + _, x49 := bits.add_u64(x26, x40, u64(0x0)) + x50, x51 := bits.add_u64(x28, x42, u64(fiat.u1(x49))) + x52, x53 := bits.add_u64(x30, x44, u64(fiat.u1(x51))) + x54, x55 := bits.add_u64((u64(fiat.u1(x31)) + (u64(fiat.u1(x25)) + (u64(fiat.u1(x17)) + x5))), x46, u64(fiat.u1(x53))) + x56, x57 := bits.add_u64(x50, arg1[2], u64(0x0)) + x58, x59 := bits.add_u64(x52, u64(0x0), u64(fiat.u1(x57))) + x60, x61 := bits.add_u64(x54, u64(0x0), u64(fiat.u1(x59))) + _, x62 := bits.mul_u64(x56, 0xccd1c8aaee00bc4f) + x65, x64 := bits.mul_u64(x62, 0xffffffff00000000) + x67, x66 := bits.mul_u64(x62, 0xffffffffffffffff) + x69, x68 := bits.mul_u64(x62, 0xbce6faada7179e84) + x71, x70 := bits.mul_u64(x62, 0xf3b9cac2fc632551) + x72, x73 := bits.add_u64(x71, x68, u64(0x0)) + x74, x75 := bits.add_u64(x69, x66, u64(fiat.u1(x73))) + x76, x77 := bits.add_u64(x67, x64, u64(fiat.u1(x75))) + _, x79 := bits.add_u64(x56, x70, u64(0x0)) + x80, x81 := bits.add_u64(x58, x72, u64(fiat.u1(x79))) + x82, x83 := bits.add_u64(x60, x74, u64(fiat.u1(x81))) + x84, x85 := bits.add_u64((u64(fiat.u1(x61)) + (u64(fiat.u1(x55)) + (u64(fiat.u1(x47)) + x35))), x76, u64(fiat.u1(x83))) + x86, x87 := bits.add_u64(x80, arg1[3], u64(0x0)) + x88, x89 := bits.add_u64(x82, u64(0x0), u64(fiat.u1(x87))) + x90, x91 := bits.add_u64(x84, u64(0x0), u64(fiat.u1(x89))) + _, x92 := bits.mul_u64(x86, 0xccd1c8aaee00bc4f) + x95, x94 := bits.mul_u64(x92, 0xffffffff00000000) + x97, x96 := bits.mul_u64(x92, 0xffffffffffffffff) + x99, x98 := bits.mul_u64(x92, 0xbce6faada7179e84) + x101, x100 := bits.mul_u64(x92, 0xf3b9cac2fc632551) + x102, x103 := bits.add_u64(x101, x98, u64(0x0)) + x104, x105 := bits.add_u64(x99, x96, u64(fiat.u1(x103))) + x106, x107 := bits.add_u64(x97, x94, u64(fiat.u1(x105))) + _, x109 := bits.add_u64(x86, x100, u64(0x0)) + x110, x111 := bits.add_u64(x88, x102, u64(fiat.u1(x109))) + x112, x113 := bits.add_u64(x90, x104, u64(fiat.u1(x111))) + x114, x115 := bits.add_u64((u64(fiat.u1(x91)) + (u64(fiat.u1(x85)) + (u64(fiat.u1(x77)) + x65))), x106, u64(fiat.u1(x113))) + x116 := (u64(fiat.u1(x115)) + (u64(fiat.u1(x107)) + x95)) + x117, x118 := bits.sub_u64(x110, 0xf3b9cac2fc632551, u64(0x0)) + x119, x120 := bits.sub_u64(x112, 0xbce6faada7179e84, u64(fiat.u1(x118))) + x121, x122 := bits.sub_u64(x114, 0xffffffffffffffff, u64(fiat.u1(x120))) + x123, x124 := bits.sub_u64(x116, 0xffffffff00000000, u64(fiat.u1(x122))) + _, x126 := bits.sub_u64(u64(0x0), u64(0x0), u64(fiat.u1(x124))) + x127 := fiat.cmovznz_u64(fiat.u1(x126), x117, x110) + x128 := fiat.cmovznz_u64(fiat.u1(x126), x119, x112) + x129 := fiat.cmovznz_u64(fiat.u1(x126), x121, x114) + x130 := fiat.cmovznz_u64(fiat.u1(x126), x123, x116) + out1[0] = x127 + out1[1] = x128 + out1[2] = x129 + out1[3] = x130 +} + +fe_to_montgomery :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: ^Non_Montgomery_Domain_Field_Element, +) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[0] + x6, x5 := bits.mul_u64(x4, 0x66e12d94f3d95620) + x8, x7 := bits.mul_u64(x4, 0x2845b2392b6bec59) + x10, x9 := bits.mul_u64(x4, 0x4699799c49bd6fa6) + x12, x11 := bits.mul_u64(x4, 0x83244c95be79eea2) + x13, x14 := bits.add_u64(x12, x9, u64(0x0)) + x15, x16 := bits.add_u64(x10, x7, u64(fiat.u1(x14))) + x17, x18 := bits.add_u64(x8, x5, u64(fiat.u1(x16))) + _, x19 := bits.mul_u64(x11, 0xccd1c8aaee00bc4f) + x22, x21 := bits.mul_u64(x19, 0xffffffff00000000) + x24, x23 := bits.mul_u64(x19, 0xffffffffffffffff) + x26, x25 := bits.mul_u64(x19, 0xbce6faada7179e84) + x28, x27 := bits.mul_u64(x19, 0xf3b9cac2fc632551) + x29, x30 := bits.add_u64(x28, x25, u64(0x0)) + x31, x32 := bits.add_u64(x26, x23, u64(fiat.u1(x30))) + x33, x34 := bits.add_u64(x24, x21, u64(fiat.u1(x32))) + _, x36 := bits.add_u64(x11, x27, u64(0x0)) + x37, x38 := bits.add_u64(x13, x29, u64(fiat.u1(x36))) + x39, x40 := bits.add_u64(x15, x31, u64(fiat.u1(x38))) + x41, x42 := bits.add_u64(x17, x33, u64(fiat.u1(x40))) + x43, x44 := bits.add_u64((u64(fiat.u1(x18)) + x6), (u64(fiat.u1(x34)) + x22), u64(fiat.u1(x42))) + x46, x45 := bits.mul_u64(x1, 0x66e12d94f3d95620) + x48, x47 := bits.mul_u64(x1, 0x2845b2392b6bec59) + x50, x49 := bits.mul_u64(x1, 0x4699799c49bd6fa6) + x52, x51 := bits.mul_u64(x1, 0x83244c95be79eea2) + x53, x54 := bits.add_u64(x52, x49, u64(0x0)) + x55, x56 := bits.add_u64(x50, x47, u64(fiat.u1(x54))) + x57, x58 := bits.add_u64(x48, x45, u64(fiat.u1(x56))) + x59, x60 := bits.add_u64(x37, x51, u64(0x0)) + x61, x62 := bits.add_u64(x39, x53, u64(fiat.u1(x60))) + x63, x64 := bits.add_u64(x41, x55, u64(fiat.u1(x62))) + x65, x66 := bits.add_u64(x43, x57, u64(fiat.u1(x64))) + _, x67 := bits.mul_u64(x59, 0xccd1c8aaee00bc4f) + x70, x69 := bits.mul_u64(x67, 0xffffffff00000000) + x72, x71 := bits.mul_u64(x67, 0xffffffffffffffff) + x74, x73 := bits.mul_u64(x67, 0xbce6faada7179e84) + x76, x75 := bits.mul_u64(x67, 0xf3b9cac2fc632551) + x77, x78 := bits.add_u64(x76, x73, u64(0x0)) + x79, x80 := bits.add_u64(x74, x71, u64(fiat.u1(x78))) + x81, x82 := bits.add_u64(x72, x69, u64(fiat.u1(x80))) + _, x84 := bits.add_u64(x59, x75, u64(0x0)) + x85, x86 := bits.add_u64(x61, x77, u64(fiat.u1(x84))) + x87, x88 := bits.add_u64(x63, x79, u64(fiat.u1(x86))) + x89, x90 := bits.add_u64(x65, x81, u64(fiat.u1(x88))) + x91, x92 := bits.add_u64(((u64(fiat.u1(x66)) + u64(fiat.u1(x44))) + (u64(fiat.u1(x58)) + x46)), (u64(fiat.u1(x82)) + x70), u64(fiat.u1(x90))) + x94, x93 := bits.mul_u64(x2, 0x66e12d94f3d95620) + x96, x95 := bits.mul_u64(x2, 0x2845b2392b6bec59) + x98, x97 := bits.mul_u64(x2, 0x4699799c49bd6fa6) + x100, x99 := bits.mul_u64(x2, 0x83244c95be79eea2) + x101, x102 := bits.add_u64(x100, x97, u64(0x0)) + x103, x104 := bits.add_u64(x98, x95, u64(fiat.u1(x102))) + x105, x106 := bits.add_u64(x96, x93, u64(fiat.u1(x104))) + x107, x108 := bits.add_u64(x85, x99, u64(0x0)) + x109, x110 := bits.add_u64(x87, x101, u64(fiat.u1(x108))) + x111, x112 := bits.add_u64(x89, x103, u64(fiat.u1(x110))) + x113, x114 := bits.add_u64(x91, x105, u64(fiat.u1(x112))) + _, x115 := bits.mul_u64(x107, 0xccd1c8aaee00bc4f) + x118, x117 := bits.mul_u64(x115, 0xffffffff00000000) + x120, x119 := bits.mul_u64(x115, 0xffffffffffffffff) + x122, x121 := bits.mul_u64(x115, 0xbce6faada7179e84) + x124, x123 := bits.mul_u64(x115, 0xf3b9cac2fc632551) + x125, x126 := bits.add_u64(x124, x121, u64(0x0)) + x127, x128 := bits.add_u64(x122, x119, u64(fiat.u1(x126))) + x129, x130 := bits.add_u64(x120, x117, u64(fiat.u1(x128))) + _, x132 := bits.add_u64(x107, x123, u64(0x0)) + x133, x134 := bits.add_u64(x109, x125, u64(fiat.u1(x132))) + x135, x136 := bits.add_u64(x111, x127, u64(fiat.u1(x134))) + x137, x138 := bits.add_u64(x113, x129, u64(fiat.u1(x136))) + x139, x140 := bits.add_u64(((u64(fiat.u1(x114)) + u64(fiat.u1(x92))) + (u64(fiat.u1(x106)) + x94)), (u64(fiat.u1(x130)) + x118), u64(fiat.u1(x138))) + x142, x141 := bits.mul_u64(x3, 0x66e12d94f3d95620) + x144, x143 := bits.mul_u64(x3, 0x2845b2392b6bec59) + x146, x145 := bits.mul_u64(x3, 0x4699799c49bd6fa6) + x148, x147 := bits.mul_u64(x3, 0x83244c95be79eea2) + x149, x150 := bits.add_u64(x148, x145, u64(0x0)) + x151, x152 := bits.add_u64(x146, x143, u64(fiat.u1(x150))) + x153, x154 := bits.add_u64(x144, x141, u64(fiat.u1(x152))) + x155, x156 := bits.add_u64(x133, x147, u64(0x0)) + x157, x158 := bits.add_u64(x135, x149, u64(fiat.u1(x156))) + x159, x160 := bits.add_u64(x137, x151, u64(fiat.u1(x158))) + x161, x162 := bits.add_u64(x139, x153, u64(fiat.u1(x160))) + _, x163 := bits.mul_u64(x155, 0xccd1c8aaee00bc4f) + x166, x165 := bits.mul_u64(x163, 0xffffffff00000000) + x168, x167 := bits.mul_u64(x163, 0xffffffffffffffff) + x170, x169 := bits.mul_u64(x163, 0xbce6faada7179e84) + x172, x171 := bits.mul_u64(x163, 0xf3b9cac2fc632551) + x173, x174 := bits.add_u64(x172, x169, u64(0x0)) + x175, x176 := bits.add_u64(x170, x167, u64(fiat.u1(x174))) + x177, x178 := bits.add_u64(x168, x165, u64(fiat.u1(x176))) + _, x180 := bits.add_u64(x155, x171, u64(0x0)) + x181, x182 := bits.add_u64(x157, x173, u64(fiat.u1(x180))) + x183, x184 := bits.add_u64(x159, x175, u64(fiat.u1(x182))) + x185, x186 := bits.add_u64(x161, x177, u64(fiat.u1(x184))) + x187, x188 := bits.add_u64(((u64(fiat.u1(x162)) + u64(fiat.u1(x140))) + (u64(fiat.u1(x154)) + x142)), (u64(fiat.u1(x178)) + x166), u64(fiat.u1(x186))) + x189, x190 := bits.sub_u64(x181, 0xf3b9cac2fc632551, u64(0x0)) + x191, x192 := bits.sub_u64(x183, 0xbce6faada7179e84, u64(fiat.u1(x190))) + x193, x194 := bits.sub_u64(x185, 0xffffffffffffffff, u64(fiat.u1(x192))) + x195, x196 := bits.sub_u64(x187, 0xffffffff00000000, u64(fiat.u1(x194))) + _, x198 := bits.sub_u64(u64(fiat.u1(x188)), u64(0x0), u64(fiat.u1(x196))) + x199 := fiat.cmovznz_u64(fiat.u1(x198), x189, x181) + x200 := fiat.cmovznz_u64(fiat.u1(x198), x191, x183) + x201 := fiat.cmovznz_u64(fiat.u1(x198), x193, x185) + x202 := fiat.cmovznz_u64(fiat.u1(x198), x195, x187) + out1[0] = x199 + out1[1] = x200 + out1[2] = x201 + out1[3] = x202 +} diff --git a/core/crypto/_weierstrass/fe.odin b/core/crypto/_weierstrass/fe.odin new file mode 100644 index 000000000..1a160a03c --- /dev/null +++ b/core/crypto/_weierstrass/fe.odin @@ -0,0 +1,135 @@ +package _weierstrass + +import p256r1 "core:crypto/_fiat/field_p256r1" +import "core:math/bits" + +Field_Element_p256r1 :: p256r1.Montgomery_Domain_Field_Element + +FE_SIZE_P256R1 :: 32 + +fe_clear :: proc { + p256r1.fe_clear, +} + +fe_clear_vec :: proc { + p256r1.fe_clear_vec, +} + +fe_set_bytes :: proc { + p256r1.fe_from_bytes, +} +fe_bytes :: proc { + p256r1.fe_to_bytes, +} + +fe_set :: proc { + p256r1.fe_set, +} + +fe_zero :: proc { + p256r1.fe_zero, +} + +fe_a :: proc { + fe_a_p256r1, +} + +fe_b :: proc { + fe_b_p256r1, +} + +fe_gen_x :: proc { + fe_gen_x_p256r1, +} + +fe_gen_y :: proc { + fe_gen_y_p256r1, +} + +fe_one :: proc { + p256r1.fe_one, +} + +fe_add :: proc { + p256r1.fe_add, +} + +fe_sub :: proc { + p256r1.fe_sub, +} + +fe_negate :: proc { + p256r1.fe_opp, +} + +fe_mul :: proc { + p256r1.fe_mul, +} + +fe_square :: proc { + p256r1.fe_square, +} + +fe_inv :: proc { + p256r1.fe_inv, +} + +fe_sqrt :: proc { + p256r1.fe_sqrt, +} + +fe_equal :: proc { + p256r1.fe_equal, +} + +fe_is_odd :: proc { + p256r1.fe_is_odd, +} + +fe_is_zero :: proc { + fe_is_zero_p256r1, +} + +fe_cond_select :: proc { + p256r1.fe_cond_select, +} + +fe_a_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) { + // a = 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc + // = -3 mod p + fe[0] = 18446744073709551612 + fe[1] = 17179869183 + fe[2] = 0 + fe[3] = 18446744056529682436 +} + +fe_b_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) { + // b = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b + fe[0] = 15608596021259845087 + fe[1] = 12461466548982526096 + fe[2] = 16546823903870267094 + fe[3] = 15866188208926050356 +} + +fe_gen_x_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) { + // G_x = 0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296 + fe[0] = 8784043285714375740 + fe[1] = 8483257759279461889 + fe[2] = 8789745728267363600 + fe[3] = 1770019616739251654 +} + +fe_gen_y_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) { + // G_y = 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5 + fe[0] = 15992936863339206154 + fe[1] = 10037038012062884956 + fe[2] = 15197544864945402661 + fe[3] = 9615747158586711429 +} + +@(require_results) +fe_is_zero_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) -> int { + ctrl := p256r1.fe_non_zero(fe) + _, borrow := bits.sub_u64(ctrl, 1, 0) + return int(borrow) +} diff --git a/core/crypto/_weierstrass/point.odin b/core/crypto/_weierstrass/point.odin new file mode 100644 index 000000000..cde82ebb2 --- /dev/null +++ b/core/crypto/_weierstrass/point.odin @@ -0,0 +1,548 @@ +package _weierstrass + +/* +This implements prime order short Weierstrass curves defined over a field +k with char(k) != 2, 3 (`y^2 = x^3 + ax + b`). for the purpose of +implementing ECDH and ECDSA. Use of this package for other purposes is +NOT RECOMMENDED. + +As an explicit simplicity/performance tradeoff, projective representation +was chosen so that it is possible to use the complete addition +formulas. + +See: +- https://eprint.iacr.org/2015/1060.pdf +- https://hyperelliptic.org/EFD/g1p/auto-shortw-projective.html + +WARNING: The point addition and doubling formulas are specialized for +`a = -3`, which covers secp256r1, secp384r1, secp521r1, FRP256v1, SM2, +and GOST 34.10. The brainpool curves and secp256k1 are NOT SUPPORTED +and would require slightly different formulas. +*/ + +Point_p256r1 :: struct { + x: Field_Element_p256r1, + y: Field_Element_p256r1, + z: Field_Element_p256r1, +} + +@(require_results) +pt_set_xy_bytes :: proc "contextless" (p: ^$T, x_raw, y_raw: []byte) -> bool { + when T == Point_p256r1 { + FE_SZ :: FE_SIZE_P256R1 + x, y: Field_Element_p256r1 + defer fe_clear_vec([]^Field_Element_p256r1{&x, &y}) + } else { + #panic("weierstrass: invalid curve") + } + + if len(x_raw) != FE_SZ || len(y_raw) != FE_SZ { + return false + } + + if !fe_set_bytes(&x, x_raw) { + return false + } + if !fe_set_bytes(&y, y_raw) { + return false + } + if !is_on_curve(&x, &y) { + return false + } + + fe_set(&p.x, &x) + fe_set(&p.y, &y) + fe_one(&p.z) + + return true +} + +@(require_results) +pt_set_x_bytes :: proc "contextless" (p: ^$T, x_raw: []byte, y_is_odd: int) -> bool { + when T == Point_p256r1 { + FE_SZ :: FE_SIZE_P256R1 + x, y, yy, y_neg: Field_Element_p256r1 + defer fe_clear_vec([]^Field_Element_p256r1{&x, &y, &yy, &y_neg}) + } else { + #panic("weierstrass: invalid curve") + } + + if len(x_raw) != FE_SZ { + return false + } + + if !fe_set_bytes(&x, x_raw) { + return false + } + set_yy_candidate(&yy, &x) + if fe_sqrt(&y, &yy) != 1 { + return false + } + + // Pick the correct y-coordinate. + fe_negate(&y_neg, &y) + parity_neq := (y_is_odd ~ fe_is_odd(&y)) & 1 + + fe_set(&p.x, &x) + fe_cond_select(&p.y, &y, &y_neg, parity_neq) + fe_one(&p.z) + + return true +} + +@(require_results) +pt_bytes :: proc "contextless" (x, y: []byte, p: ^$T) -> bool { + when T == Point_p256r1 { + FE_SZ :: FE_SIZE_P256R1 + } else { + #panic("weierstrass: invalid curve") + } + + if pt_is_identity(p) == 1 { + return false + } + + // Convert to affine coordinates. + pt_rescale(p, p) + + switch len(x) { + case 0: + case FE_SZ: + fe_bytes(x, &p.x) + case: + panic_contextless("weierstrass: invalid x buffer") + } + switch len(y) { + case 0: + case FE_SZ: + fe_bytes(y, &p.y) + case: + panic_contextless("weierstrass: invalid y buffer") + } + + return true +} + +pt_set :: proc "contextless" (p, q: ^$T) { + fe_set(&p.x, &q.x) + fe_set(&p.y, &q.y) + fe_set(&p.z, &q.z) +} + +pt_identity :: proc "contextless" (p: ^$T) { + fe_zero(&p.x) + fe_one(&p.y) + fe_zero(&p.z) +} + +pt_generator :: proc "contextless" (p: ^$T) { + fe_gen_x(&p.x) + fe_gen_y(&p.y) + fe_one(&p.z) +} + +pt_clear :: proc "contextless" (p: ^$T) { + fe_clear(&p.x) + fe_clear(&p.y) + fe_clear(&p.z) +} + +pt_clear_vec :: proc "contextless" (arg: []^$T) { + for p in arg { + pt_clear(p) + } +} + +pt_add :: proc "contextless" (p, a, b: ^$T) { + // Algorithm 4 from "Complete addition formulas for prime + // order elliptic curves" by Renes, Costello, and Batina. + // + // The formula is complete in that it is valid for all a and b, + // without exceptions or extra assumptions about the inputs. + // + // The operation costs are `12M + 2mb + 29a`. + + when T == Point_p256r1 { + t0, t1, t2, t3, t4, b_fe: Field_Element_p256r1 + x3, y3, z3: Field_Element_p256r1 + defer fe_clear_vec([]^Field_Element_p256r1{&t0, &t1, &t2, &t3, &t4, &x3, &y3, &z3}) + } else { + #panic("weierstrass: invalid curve") + } + + x1, y1, z1 := &a.x, &a.y, &a.z + x2, y2, z2 := &b.x, &b.y, &b.z + + fe_b(&b_fe) + + // t0 := X1 * X2 ; t1 := Y1 * Y2 ; t2 := Z1 * Z2 ; + fe_mul(&t0, x1, x2) + fe_mul(&t1, y1, y2) + fe_mul(&t2, z1, z2) + + // t3 := X1 + Y1 ; t4 := X2 + Y2 ; t3 := t3 * t4 ; + fe_add(&t3, x1, y1) + fe_add(&t4, x2, y2) + fe_mul(&t3, &t3, &t4) + + // t4 := t0 + t1 ; t3 := t3 - t4 ; t4 := Y1 + Z1 ; + fe_add(&t4, &t0, &t1) + fe_sub(&t3, &t3, &t4) + fe_add(&t4, y1, z1) + + // X3 := Y2 + Z2 ; t4 := t4 * X3 ; X3 := t1 + t2 ; + fe_add(&x3, y2, z2) + fe_mul(&t4, &t4, &x3) + fe_add(&x3, &t1, &t2) + + // t4 := t4 - X3 ; X3 := X1 + Z1 ; Y3 := X2 + Z2 ; + fe_sub(&t4, &t4, &x3) + fe_add(&x3, x1, z1) + fe_add(&y3, x2, z2) + + // X3 := X3 * Y3 ; Y3 := t0 + t2 ; Y3 := X3 - Y3 ; + fe_mul(&x3, &x3, &y3) + fe_add(&y3, &t0, &t2) + fe_sub(&y3, &x3, &y3) + + // Z3 := b * t2 ; X3 := Y3 - Z3 ; Z3 := X3 + X3 ; + fe_mul(&z3, &b_fe, &t2) + fe_sub(&x3, &y3, &z3) + fe_add(&z3, &x3, &x3) + + // X3 := X3 + Z3 ; Z3 := t1 - X3 ; X3 := t1 + X3 ; + fe_add(&x3, &x3, &z3) + fe_sub(&z3, &t1, &x3) + fe_add(&x3, &t1, &x3) + + // Y3 := b * Y3 ; t1 := t2 + t2 ; t2 := t1 + t2 ; + fe_mul(&y3, &b_fe, &y3) + fe_add(&t1, &t2, &t2) + fe_add(&t2, &t1, &t2) + + // Y3 := Y3 - t2 ; Y3 := Y3 - t0 ; t1 := Y3 + Y3 ; + fe_sub(&y3, &y3, &t2) + fe_sub(&y3, &y3, &t0) + fe_add(&t1, &y3, &y3) + + // Y3 := t1 + Y3 ; t1 := t0 + t0 ; t0 := t1 + t0 ; + fe_add(&y3, &t1, &y3) + fe_add(&t1, &t0, &t0) + fe_add(&t0, &t1, &t0) + + // t0 := t0 - t2 ; t1 := t4 * Y3 ; t2 := t0 * Y3 ; + fe_sub(&t0, &t0, &t2) + fe_mul(&t1, &t4, &y3) + fe_mul(&t2, &t0, &y3) + + // Y3 := X3 * Z3 ; Y3 := Y3 + t2 ; X3 := t3 * X3 ; + fe_mul(&y3, &x3, &z3) + fe_add(&y3, &y3, &t2) + fe_mul(&x3, &t3, &x3) + + // X3 := X3 - t1 ; Z3 := t4 * Z3 ; t1 := t3 * t0 ; + fe_sub(&x3, &x3, &t1) + fe_mul(&z3, &t4, &z3) + fe_mul(&t1, &t3, &t0) + + // Z3 := Z3 + t1 ; + fe_add(&z3, &z3, &t1) + + // return X3 , Y3 , Z3 ; + fe_set(&p.x, &x3) + fe_set(&p.y, &y3) + fe_set(&p.z, &z3) +} + +@(private) +pt_add_mixed :: proc "contextless" (p, a: ^$T, x2, y2: ^$U) { + // Algorithm 5 from "Complete addition formulas for prime + // order elliptic curves" by Renes, Costello, and Batina. + // + // The formula is mixed in that it assumes the z-coordinate + // of the addend (`Z2`) is `1`, meaning that it CAN NOT + // handle the addend being the point at infinity. + // + // The operation costs are `11M + 2mb + 23a` saving + // `1M + 6a` over `pt_add`. + + when T == Point_p256r1 && U == Field_Element_p256r1 { + t0, t1, t2, t3, t4, b_fe: Field_Element_p256r1 + x3, y3, z3: Field_Element_p256r1 + defer fe_clear_vec([]^Field_Element_p256r1{&t0, &t1, &t2, &t3, &t4, &x3, &y3, &z3}) + } else { + #panic("weierstrass: invalid curve") + } + + x1, y1, z1 := &a.x, &a.y, &a.z + + fe_b(&b_fe) + + // t0 := X1 * X2 ; t1 := Y1 * Y2 ; t3 := X2 + Y2 ; + fe_mul(&t0, x1, x2) + fe_mul(&t1, y1, y2) + fe_add(&t3, x2, y2) + + // t4 := X1 + Y1 ; t3 := t3 * t4 ; t4 := t0 + t1 ; + fe_add(&t4, x1, y1) + fe_mul(&t3, &t3, &t4) + fe_add(&t4, &t0, &t1) + + // t3 := t3 − t4 ; t4 := Y2 * Z1 ; t4 := t4 + Y1 ; + fe_sub(&t3, &t3, &t4) + fe_mul(&t4, y2, z1) + fe_add(&t4, &t4, y1) + + // Y3 := X2 * Z1 ; Y3 := Y3 + X1 ; Z3 := b * Z1 ; + fe_mul(&y3, x2, z1) + fe_add(&y3, &y3, x1) + fe_mul(&z3, &b_fe, z1) + + // X3 := Y3 − Z3 ; Z3 := X3 + X3 ; X3 := X3 + Z3 ; + fe_sub(&x3, &y3, &z3) + fe_add(&z3, &x3, &x3) + fe_add(&x3, &x3, &z3) + + // Z3 := t1 − X3 ; X3 := t1 + X3 ;. Y3 := b * Y3 ; + fe_sub(&z3, &t1, &x3) + fe_add(&x3, &t1, &x3) + fe_mul(&y3, &b_fe, &y3) + + // t1 := Z1 + Z1 ; t2 := t1 + Z1 ; Y3 := Y3 − t2 ; + fe_add(&t1, z1, z1) + fe_add(&t2, &t1, z1) + fe_sub(&y3, &y3, &t2) + + // Y3 := Y3 − t0 ; t1 := Y3 + Y3 ; Y3 := t1 + Y3 ; + fe_sub(&y3, &y3, &t0) + fe_add(&t1, &y3, &y3) + fe_add(&y3, &t1, &y3) + + // t1 := t0 + t0 ; t0 := t1 + t0 ; t0 := t0 − t2 ; + fe_add(&t1, &t0, &t0) + fe_add(&t0, &t1, &t0) + fe_sub(&t0, &t0, &t2) + + // t1 := t4 * Y3 ; t2 := t0 * Y3 ; Y3 := X3 * Z3 ; + fe_mul(&t1, &t4, &y3) + fe_mul(&t2, &t0, &y3) + fe_mul(&y3, &x3, &z3) + + // Y3 := Y3 + t2 ; X3 := t3 * X3 ; X3 := X3 − t1 ; + fe_add(&y3, &y3, &t2) + fe_mul(&x3, &t3, &x3) + fe_sub(&x3, &x3, &t1) + + // Z3 := t4 * Z3 ; t1 := t3 * t0 ; Z3 := Z3 + t1 ; + fe_mul(&z3, &t4, &z3) + fe_mul(&t1, &t3, &t0) + fe_add(&z3, &z3, &t1) + + // return X3 , Y3 , Z3 ; + fe_set(&p.x, &x3) + fe_set(&p.y, &y3) + fe_set(&p.z, &z3) +} + +pt_double :: proc "contextless" (p, a: ^$T) { + // Algorithm 6 from "Complete addition formulas for prime + // order elliptic curves" by Renes, Costello, and Batina. + // + // The formula is complete in that it is valid for all a, + // without exceptions or extra assumptions about the inputs. + // + // The operation costs are `8M + 3S + 2mb + 21a`. + + when T == Point_p256r1 { + t0, t1, t2, t3, b_fe: Field_Element_p256r1 + x3, y3, z3: Field_Element_p256r1 + defer fe_clear_vec([]^Field_Element_p256r1{&t0, &t1, &t2, &t3, &x3, &y3, &z3}) + } else { + #panic("weierstrass: invalid curve") + } + + x, y, z := &a.x, &a.y, &a.z + + fe_b(&b_fe) + + // t0 := X ^2; t1 := Y ^2; t2 := Z ^2; + fe_square(&t0, x) + fe_square(&t1, y) + fe_square(&t2, z) + + // t3 := X * Y ; t3 := t3 + t3 ; Z3 := X * Z ; + fe_mul(&t3, x, y) + fe_add(&t3, &t3, &t3) + fe_mul(&z3, x, z) + + // Z3 := Z3 + Z3 ; Y3 := b * t2 ; Y3 := Y3 - Z3 ; + fe_add(&z3, &z3, &z3) + fe_mul(&y3, &b_fe, &t2) + fe_sub(&y3, &y3, &z3) + + // X3 := Y3 + Y3 ; Y3 := X3 + Y3 ; X3 := t1 - Y3 ; + fe_add(&x3, &y3, &y3) + fe_add(&y3, &x3, &y3) + fe_sub(&x3, &t1, &y3) + + // Y3 := t1 + Y3 ; Y3 := X3 * Y3 ; X3 := X3 * t3 ; + fe_add(&y3, &t1, &y3) + fe_mul(&y3, &x3, &y3) + fe_mul(&x3, &x3, &t3) + + // t3 := t2 + t2 ; t2 := t2 + t3 ; Z3 := b * Z3 ; + fe_add(&t3, &t2, &t2) + fe_add(&t2, &t2, &t3) + fe_mul(&z3, &b_fe, &z3) + + // Z3 := Z3 - t2 ; Z3 := Z3 - t0 ; t3 := Z3 + Z3 ; + fe_sub(&z3, &z3, &t2) + fe_sub(&z3, &z3, &t0) + fe_add(&t3, &z3, &z3) + + // Z3 := Z3 + t3 ; t3 := t0 + t0 ; t0 := t3 + t0 ; + fe_add(&z3, &z3, &t3) + fe_add(&t3, &t0, &t0) + fe_add(&t0, &t3, &t0) + + // t0 := t0 - t2 ; t0 := t0 * Z3 ; Y3 := Y3 + t0 ; + fe_sub(&t0, &t0, &t2) + fe_mul(&t0, &t0, &z3) + fe_add(&y3, &y3, &t0) + + // t0 := Y * Z ; t0 := t0 + t0 ; Z3 := t0 * Z3 ; + fe_mul(&t0, y, z) + fe_add(&t0, &t0, &t0) + fe_mul(&z3, &t0, &z3) + + // X3 := X3 - Z3 ; Z3 := t0 * t1 ; Z3 := Z3 + Z3 ; + fe_sub(&x3, &x3, &z3) + fe_mul(&z3, &t0, &t1) + fe_add(&z3, &z3, &z3) + + // Z3 := Z3 + Z3 ; + fe_add(&z3, &z3, &z3) + + // return X3 , Y3 , Z3 ; + fe_set(&p.x, &x3) + fe_set(&p.y, &y3) + fe_set(&p.z, &z3) +} + +pt_sub :: proc "contextless" (p, a, b: ^$T) { + b_neg: T + pt_negate(&b_neg, b) + pt_add(p, a, &b_neg) + + fe_clear(&b_neg) +} + +pt_negate :: proc "contextless" (p, a: ^$T) { + fe_set(&p.x, &a.x) + fe_negate(&p.y, &a.y) + fe_set(&p.z, &a.z) +} + +pt_rescale :: proc "contextless" (p, a: ^$T) { + // A = 1/Z1 + // X3 = A*X1 + // Y3 = A*Y1 + // Z3 = 1 + // + // As per "From A to Z: Projective coordinates leakage in the wild" + // leaking the Z-coordinate is bad. The modular inversion algorithm + // used in this library is based on Fermat's Little Theorem. + // + // See: https://eprint.iacr.org/2020/432.pdf + + was_identity := pt_is_identity(a) + + when T == Point_p256r1 { + z_inv: Field_Element_p256r1 + } else { + #panic("weierstrass: invalid curve") + } + + ident: T + fe_inv(&z_inv, &a.z) + fe_mul(&p.x, &a.x, &z_inv) + fe_mul(&p.y, &a.y, &z_inv) + fe_one(&p.z) + + pt_identity(&ident) + pt_cond_select(p, p, &ident, was_identity) + + fe_clear(&z_inv) +} + +pt_cond_select :: proc "contextless" (p, a, b: ^$T, ctrl: int) { + fe_cond_select(&p.x, &a.x, &b.x, ctrl) + fe_cond_select(&p.y, &a.y, &b.y, ctrl) + fe_cond_select(&p.z, &a.z, &b.z, ctrl) +} + +@(require_results) +pt_equal :: proc "contextless" (a, b: ^$T) -> int { + when T == Point_p256r1 { + x1z2, x2z1, y1z2, y2z1: Field_Element_p256r1 + } else { + #panic("weierstrass: invalid curve") + } + + // Check X1Z2 == X2Z1 && Y1Z2 == Y2Z1 + fe_mul(&x1z2, &a.x, &b.z) + fe_mul(&x2z1, &b.x, &a.z) + + fe_mul(&y1z2, &a.y, &b.z) + fe_mul(&y2z1, &b.y, &a.z) + + return fe_equal(&x1z2, &x2z1) & fe_equal(&y1z2, &y2z1) +} + +@(require_results) +pt_is_identity :: proc "contextless" (p: ^$T) -> int { + return fe_is_zero(&p.z) +} + +@(require_results) +pt_is_y_odd :: proc "contextless" (p: ^$T) -> int { + tmp: T + defer pt_clear(&tmp) + + fe_set(&tmp, p) + pt_rescale(&tmp) + + return fe_is_odd(&tmp.y) +} + +@(private) +is_on_curve :: proc "contextless" (x, y: ^$T) -> bool { + maybe_yy, yy: T + defer fe_clear_vec([]^T{&maybe_yy, &yy}) + + // RHS: x^3 + ax + b + set_yy_candidate(&maybe_yy, x) + + // LHS: y^2 + fe_square(&yy, y) + + return fe_equal(&maybe_yy, &yy) == 1 +} + +@(private) +set_yy_candidate :: proc "contextless" (maybe_yy, x: ^$T) { + // RHS: x^3 + ax + b + rhs, tmp: T + + fe_square(&tmp, x) + fe_mul(&rhs, &tmp, x) + + fe_a(&tmp) + fe_mul(&tmp, &tmp, x) + fe_add(&rhs, &rhs, &tmp) + + fe_b(&tmp) + fe_add(maybe_yy, &rhs, &tmp) + + fe_clear(&rhs) +} diff --git a/core/crypto/_weierstrass/point_s11n_sec.odin b/core/crypto/_weierstrass/point_s11n_sec.odin new file mode 100644 index 000000000..ae009edb0 --- /dev/null +++ b/core/crypto/_weierstrass/point_s11n_sec.odin @@ -0,0 +1,95 @@ +package _weierstrass + +@(require) import "core:mem" + +@(private) +SEC_PREFIX_IDENTITY :: 0x00 +@(private) +SEC_PREFIX_COMPRESSED_EVEN :: 0x02 +@(private) +SEC_PREFIX_COMPRESSED_ODD :: 0x03 +SEC_PREFIX_UNCOMPRESSED :: 0x04 + +@(require_results) +pt_set_sec_bytes :: proc "contextless" (p: ^$T, b: []byte) -> bool { + when T == Point_p256r1 { + FE_SZ :: FE_SIZE_P256R1 + } else { + #panic("weierstrass: invalid curve") + } + + b_len := len(b) + if b_len < 1 { + return false + } + + switch b[0] { + case SEC_PREFIX_IDENTITY: + if b_len != 1 { + return false + } + pt_identity(p) + return true + case SEC_PREFIX_COMPRESSED_EVEN, SEC_PREFIX_COMPRESSED_ODD: + if b_len != 1 + FE_SZ { + return false + } + y_is_odd := b[0] - SEC_PREFIX_COMPRESSED_EVEN + return pt_set_x_bytes(p, b[1:], int(y_is_odd)) + case SEC_PREFIX_UNCOMPRESSED: + if b_len != 1 + 2 * FE_SZ { + return false + } + x, y := b[1:1+FE_SZ], b[1+FE_SZ:] + return pt_set_xy_bytes(p, x, y) + case: + return false + } +} + +@(require_results) +pt_sec_bytes :: proc "contextless" (b: []byte, p: ^$T, compressed: bool) -> bool { + when T == Point_p256r1 { + FE_SZ :: FE_SIZE_P256R1 + } else { + #panic("weierstrass: invalid curve") + } + + b_len := len(b) + if pt_is_identity(p) == 1 { + if b_len != 1 { + return false + } + b[0] = SEC_PREFIX_IDENTITY + return true + } + + x, y: []byte + y_: [FE_SZ]byte + switch compressed { + case true: + if b_len != 1 + FE_SZ { + return false + } + x, y = b[1:], y_[:] + case false: + if b_len != 1 + 2 * FE_SZ { + return false + } + b[0]= SEC_PREFIX_UNCOMPRESSED + x, y = b[1:1+FE_SZ], b[1+FE_SZ:] + } + if !pt_bytes(x, y, p) { + return false + } + if compressed { + // Instead of calling pt_is_y_odd, just serializing + // y into a temp buffer and checking the parity saves + // 1 redundant rescale call. + y_is_odd := byte(y[FE_SZ-1] & 1) + b[0] = SEC_PREFIX_COMPRESSED_EVEN + y_is_odd + mem.zero_explicit(&y_, size_of(y_)) + } + + return true +} diff --git a/core/crypto/_weierstrass/sc.odin b/core/crypto/_weierstrass/sc.odin new file mode 100644 index 000000000..2ed9459bc --- /dev/null +++ b/core/crypto/_weierstrass/sc.odin @@ -0,0 +1,76 @@ +package _weierstrass + +import p256r1 "core:crypto/_fiat/field_scalarp256r1" +import subtle "core:crypto/_subtle" + +Scalar_p256r1 :: p256r1.Montgomery_Domain_Field_Element + +SC_SIZE_P256R1 :: 32 + +sc_clear :: proc { + p256r1.fe_clear, +} + +sc_clear_vec :: proc { + p256r1.fe_clear_vec, +} + +sc_set_bytes :: proc { + p256r1.fe_from_bytes, +} +sc_bytes :: proc { + p256r1.fe_to_bytes, +} + +sc_set :: proc { + p256r1.fe_set, +} + +sc_zero :: proc { + p256r1.fe_zero, +} + +sc_one_p256r1 :: proc { + p256r1.fe_one, +} + +sc_add :: proc { + p256r1.fe_add, +} + +sc_sub :: proc { + p256r1.fe_sub, +} + +sc_negate :: proc { + p256r1.fe_opp, +} + +sc_mul :: proc { + p256r1.fe_mul, +} + +sc_square :: proc { + p256r1.fe_square, +} + +sc_cond_assign :: proc { + p256r1.fe_cond_assign, +} + +sc_equal :: proc { + p256r1.fe_equal, +} + +sc_is_odd :: proc { + p256r1.fe_is_odd, +} + +sc_is_zero :: proc { + sc_is_zero_p256r1, +} + +@(require_results) +sc_is_zero_p256r1 :: proc "contextless" (fe: ^Scalar_p256r1) -> int { + return int(subtle.u64_is_zero(p256r1.fe_non_zero(fe))) +} diff --git a/core/crypto/_weierstrass/scalar_mul.odin b/core/crypto/_weierstrass/scalar_mul.odin new file mode 100644 index 000000000..1781ac3b6 --- /dev/null +++ b/core/crypto/_weierstrass/scalar_mul.odin @@ -0,0 +1,204 @@ +package _weierstrass + +import "core:crypto" +import subtle "core:crypto/_subtle" +import "core:mem" + +pt_scalar_mul :: proc "contextless" ( + p, a: ^$T, + sc: ^$S, + unsafe_is_vartime: bool = false, +) { + when T == Point_p256r1 && S == Scalar_p256r1 { + SC_SZ :: SC_SIZE_P256R1 + } else { + #panic("weierstrass: invalid curve") + } + + b: [SC_SZ]byte = --- + sc_bytes(b[:], sc) + + pt_scalar_mul_bytes(p, a, b[:], unsafe_is_vartime) + + if !unsafe_is_vartime { + mem.zero_explicit(&b, size_of(b)) + } +} + +pt_scalar_mul_bytes :: proc "contextless" ( + p, a: ^$T, + sc: []byte, + unsafe_is_vartime: bool = false, +) { + when T == Point_p256r1 { + p_tbl: Multiply_Table_p256r1 = --- + q, tmp: Point_p256r1 = ---, --- + SC_SZ :: SC_SIZE_P256R1 + } else { + #panic("weierstrass: invalid curve") + } + + assert_contextless(len(sc) == SC_SZ, "weierstrass: invalid scalar size") + mul_tbl_set(&p_tbl, a, unsafe_is_vartime) + + pt_identity(&q) + for limb_byte, i in sc { + hi, lo := (limb_byte >> 4) & 0x0f, limb_byte & 0x0f + + if i != 0 { + pt_double(&q, &q) + pt_double(&q, &q) + pt_double(&q, &q) + pt_double(&q, &q) + } + mul_tbl_lookup_add(&q, &tmp, &p_tbl, u64(hi), unsafe_is_vartime) + + pt_double(&q, &q) + pt_double(&q, &q) + pt_double(&q, &q) + pt_double(&q, &q) + mul_tbl_lookup_add(&q, &tmp, &p_tbl, u64(lo), unsafe_is_vartime) + } + + pt_set(p, &q) + + if !unsafe_is_vartime { + mem.zero_explicit(&p_tbl, size_of(p_tbl)) + pt_clear_vec([]^T{&q, &tmp}) + } +} + +when crypto.COMPACT_IMPLS == true { + pt_scalar_mul_generator :: proc "contextless" ( + p: ^$T, + sc: ^$S, + unsafe_is_vartime: bool = false, + ) { + g: T + pt_generator(&g) + + pt_scalar_mul(p, &g, sc, unsafe_is_vartime) + } +} else { + pt_scalar_mul_generator :: proc "contextless" ( + p: ^$T, + sc: ^$S, + unsafe_is_vartime: bool = false, + ) { + when T == Point_p256r1 && S == Scalar_p256r1 { + p_tbl_hi := &Gen_Multiply_Table_p256r1_hi + p_tbl_lo := &Gen_Multiply_Table_p256r1_lo + tmp: Point_p256r1 = --- + SC_SZ :: SC_SIZE_P256R1 + } else { + #panic("weierstrass: invalid curve") + } + + b: [SC_SZ]byte + sc_bytes(b[:], sc) + + pt_identity(p) + for limb_byte, i in b { + hi, lo := (limb_byte >> 4) & 0x0f, limb_byte & 0x0f + mul_affine_tbl_lookup_add(p, &tmp, &p_tbl_hi[i], u64(hi), unsafe_is_vartime) + mul_affine_tbl_lookup_add(p, &tmp, &p_tbl_lo[i], u64(lo), unsafe_is_vartime) + } + + if !unsafe_is_vartime { + mem.zero_explicit(&b, size_of(b)) + pt_clear(&tmp) + } + } +} + +@(private="file") +Multiply_Table_p256r1 :: [15]Point_p256r1 + +@(private="file") +mul_tbl_set :: proc "contextless"( + tbl: ^$T, + point: ^$U, + unsafe_is_vartime: bool, +) { + when T == Multiply_Table_p256r1 && U == Point_p256r1{ + tmp: Point_p256r1 + pt_set(&tmp, point) + } else { + #panic("weierstrass: invalid curve") + } + + pt_set(&tbl[0], &tmp) + for i in 1 ..<15 { + pt_add(&tmp, &tmp, point) + pt_set(&tbl[i], &tmp) + } + + if !unsafe_is_vartime { + pt_clear(&tmp) + } +} + +@(private="file") +mul_tbl_lookup_add :: proc "contextless" ( + point, tmp: ^$T, + tbl: ^$U, + idx: u64, + unsafe_is_vartime: bool, + ) { + if unsafe_is_vartime { + switch idx { + case 0: + case: + pt_add(point, point, &tbl[idx - 1]) + } + return + } + + pt_identity(tmp) + for i in u64(1)..<16 { + ctrl := subtle.eq(i, idx) + pt_cond_select(tmp, tmp, &tbl[i - 1], int(ctrl)) + } + + pt_add(point, point, tmp) +} + +when crypto.COMPACT_IMPLS == false { + @(private) + Affine_Point_p256r1 :: struct { + x: Field_Element_p256r1, + y: Field_Element_p256r1, + } + + @(private="file") + mul_affine_tbl_lookup_add :: proc "contextless" ( + point, tmp: ^$T, + tbl: ^$U, + idx: u64, + unsafe_is_vartime: bool, + ) { + if unsafe_is_vartime { + switch idx { + case 0: + case: + pt_add_mixed(point, point, &tbl[idx - 1].x, &tbl[idx - 1].y) + } + return + } + + pt_identity(tmp) + for i in u64(1)..<16 { + ctrl := int(subtle.eq(i, idx)) + fe_cond_select(&tmp.x, &tmp.x, &tbl[i - 1].x, ctrl) + fe_cond_select(&tmp.y, &tmp.y, &tbl[i - 1].y, ctrl) + } + + // The mixed addition formula assumes that the addend is not + // the neutral element. Do the addition regardless, and then + // conditionally select the right result. + pt_add_mixed(tmp, point, &tmp.x, &tmp.y) + + ctrl := subtle.u64_is_non_zero(idx) + pt_cond_select(point, point, tmp, int(ctrl)) + } +} diff --git a/core/crypto/_weierstrass/secp256r1_table.odin b/core/crypto/_weierstrass/secp256r1_table.odin new file mode 100644 index 000000000..1a6bc3ef6 --- /dev/null +++ b/core/crypto/_weierstrass/secp256r1_table.odin @@ -0,0 +1,3985 @@ +package _weierstrass + +/* + ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ +*/ + +import "core:crypto" + +when crypto.COMPACT_IMPLS == false { + @(private,rodata) + Gen_Multiply_Table_p256r1_hi := [32][15]Affine_Point_p256r1 { + { + { + {9259451175701532574, 15597985540941612547, 4541553034987877619, 8927802479718285609}, + {14672230714928802576, 14284617950605306700, 13339970812390782046, 787078889494395850}, + }, + { + {18165439414433063919, 14693282888419586094, 14992616289789993230, 13232208150801553912}, + {16850347485914337693, 223364064845089224, 7302899015436300563, 4391216311540396088}, + }, + { + {12558388403188680537, 10687978569513354810, 9373570856564649772, 4079327722512691465}, + {5372437374337150740, 3297421622932790851, 9326853593823854687, 8305371884938201251}, + }, + { + {13121472331750731303, 323745485980480220, 15110308702528119977, 4696302365805118372}, + {9859094500834571602, 5315656270700787939, 4187063204400651801, 1695695129564818327}, + }, + { + {12817586844019849804, 15425488216915741929, 15293562913126043054, 11770898970765978555}, + {6806103820345670787, 17789094149138630459, 3807781571713999192, 5823254011289457198}, + }, + { + {10112524230916015604, 13571143908656270599, 6031089010487808103, 5774558171390644848}, + {1808959243244841573, 14071312530426692155, 9241399242704553402, 9836150050655369231}, + }, + { + {14083007972403535491, 16009534514129505275, 12481249112231139039, 10309390659262581143}, + {5782517315325366794, 16717384553294759530, 4578392002424884134, 239005024949492645}, + }, + { + {1836857790164349346, 11263074778654917115, 4786985732596838094, 10525445084936097674}, + {1484357665966453236, 3110871407036679558, 1668700683093601768, 2736269131339849752}, + }, + { + {9249362594190920246, 8088172462140746331, 4080107866285682736, 16205599538438551353}, + {18312943145606312277, 9100632964181080418, 3969991115337154345, 5340098959750368315}, + }, + { + {12122448407048035645, 2891250339380982359, 12794212052932523400, 7166035112141500392}, + {15777441312724841162, 4552528682229856831, 2210391301762911476, 16410254680957321386}, + }, + { + {6910044784455706429, 11951245774670922855, 207795885948948810, 3884359690300962405}, + {4578772752480772344, 2948797025787714138, 16774444535658202808, 1388183483009000463}, + }, + { + {16561979129019905420, 1881862411760441386, 15441950514711322010, 12933020223458438856}, + {5570341451312029630, 18172638959728259059, 9074261777549091198, 6171200053222754816}, + }, + { + {10126435102176037237, 1545112930055760251, 11563139991870561593, 10766754172364938834}, + {5116781688621052838, 14471715119500781375, 4724882615229687192, 10031687030722046325}, + }, + { + {15016829467434780812, 6777508689306592732, 3811682306063049290, 11475361222871876387}, + {6080948654298953274, 11612742274762615033, 5268311600240325047, 9147351973710519861}, + }, + { + {12130203770930472759, 3880998309361490881, 8807462332494735511, 9291388074337055133}, + {18165312304248982432, 12733144434841535979, 18090195697688236271, 5825342884125782172}, + }, + }, + { + { + {194633990068625151, 1028128699653523895, 7436102537486268753, 1855520454959348468}, + {5098690958966904466, 3342676718901330604, 6942212660412942406, 16510188838209674083}, + }, + { + {7963995066277321795, 14986230345162551366, 10616366460602472778, 16186943329215681149}, + {9522855644164647723, 9858336437877021178, 16344942402271072884, 18027353494090590022}, + }, + { + {13392726161043192788, 7606793939450765773, 9543984695709321129, 6135912406103198328}, + {10903991926178685177, 529801710637680784, 8207012095420105234, 4590962949922268360}, + }, + { + {13175608910844763921, 11168387468381338510, 5555873864224342205, 17780559602571640345}, + {1582669533588472814, 8145133762789622706, 1625372887980692455, 4576809104068554285}, + }, + { + {17616803153811079355, 17809794753465712025, 10788493879428408032, 1263026253532745742}, + {331896291298606534, 13299145463579793142, 8951131463540898010, 11121758705853021600}, + }, + { + {17015522374255846157, 7155392284047197223, 1248775493117789546, 9199472299655737207}, + {13126885324657282947, 12092989376083683289, 2035698983314262432, 835441512024005104}, + }, + { + {12481871371020004325, 15786477648044981224, 2586272424816191689, 4208704695692543659}, + {16940467964964992440, 11207566805119564978, 2858987625603639630, 9561510646236248154}, + }, + { + {2900978533555060931, 1749946807863203576, 11705734511931072459, 4446980691693419424}, + {14437524160594907241, 12795912566640000773, 10400036254697939154, 8356113088668925361}, + }, + { + {3770654812111500682, 7723332701546321657, 12057007323752084660, 11871339027463593983}, + {8927366002257844381, 331175455338905356, 6085376066711046662, 195998713859126244}, + }, + { + {15888580251537997623, 14253909833728698978, 14445538492667230716, 4028538972354525849}, + {7720263170150940477, 1190890222876864097, 8657188516818851005, 1987613286973742753}, + }, + { + {1556082539082087499, 9191446579576007527, 16923484407567577707, 4662661048159090855}, + {12760778972220173745, 3942937056545553996, 12952479961991875179, 8914103212381870290}, + }, + { + {8900726473285671992, 890209742292473781, 16059468388719373167, 16577940938542233221}, + {17381766864962227733, 231915274132518769, 16477817024012878700, 15646021286310268545}, + }, + { + {10104554368814337641, 170400126349943750, 16051269335758964391, 7842493858299913771}, + {9246756702190574744, 110682656515867335, 11402798562961521905, 17325237240525801251}, + }, + { + {15837018286366797690, 18114413810565810328, 9441874034567150801, 14075941137889189393}, + {12786763055047269260, 9121030808281463204, 1713778999270814105, 17015261864438490667}, + }, + { + {12997570542605430113, 5500897611058123544, 4160129407772614089, 13768264346635084004}, + {6638654171187871203, 6080635069726153281, 2255431148803290413, 3789670411999607189}, + }, + }, + { + { + {1830819081327272165, 11951292080860646547, 18002500803418629938, 13317986695217403840}, + {5005574200470766330, 10138179785738652504, 1610518863105278224, 13309443265578956954}, + }, + { + {14192194428653714479, 11578618567931657764, 6032668189933768881, 15981535562386193924}, + {8925792218631314923, 9408714146004183681, 8859017894477140398, 1675606340537058506}, + }, + { + {3265119697568866078, 13753322853248061974, 15435163376825672274, 13646180516491714938}, + {15620545622955090250, 18241486585498394565, 459566729126467878, 9728217493753855944}, + }, + { + {9883406233903270985, 17184231210468300584, 5498903678702785900, 6903833261382863389}, + {11489138095102981636, 9021901931786177471, 3227433089132150317, 16639455550797627042}, + }, + { + {839045372102318861, 2032615141683118500, 1921816835840256924, 504869150737570005}, + {15932184001422473505, 7849475855313305697, 1189994394722618598, 9874798350548229684}, + }, + { + {4636201671610663345, 16662311204732135584, 12398897461787695675, 1355753199357412657}, + {14695655628527768564, 1692838776852698754, 7346906782826540912, 14869028424564984700}, + }, + { + {14240080119980315297, 4751983902385717684, 7941412103662252178, 4796803816695225123}, + {9327986654018000413, 15111345676387005726, 3582558555283734415, 11913156735178831102}, + }, + { + {12915868875134296756, 3071143582305760275, 10848717856747030010, 10973183887638314967}, + {5983269487036236823, 9885184706933333413, 14509493669845681951, 9669608065801379977}, + }, + { + {7848634325810890057, 4356492357483949442, 8777700982672429871, 447737364627887590}, + {2892466086138453900, 12013259293340538023, 3423275627272380730, 11171074631447548946}, + }, + { + {14593553227914306527, 7393098159726367793, 959457858782426605, 12924066827318848802}, + {14790800265003508462, 13805969419986022239, 4408523909823076864, 16722715416825698787}, + }, + { + {8554182115079118694, 17233907570567075631, 12336560627384786590, 5123566378696582545}, + {96401035522143140, 10138155491929979850, 17651328686428132420, 3453390145222258032}, + }, + { + {16197242500758474188, 3349369240724295499, 9422940308750670637, 16888844525585804807}, + {14045424784406071799, 13180603138700207746, 2683581192503868543, 3842875784859878}, + }, + { + {17498073686183419231, 6922314891526280784, 16083733402282932920, 15425477806093217459}, + {12425976625898608391, 16458101989314253841, 10013521940061058050, 10858868879196007236}, + }, + { + {123600201037598181, 6690762836954208162, 17157040810691942664, 15263405971805161132}, + {8685477170453562173, 10331174323986544033, 5789045082422148337, 3007978469441468974}, + }, + { + {2402095889286816125, 18054120920831753009, 11753130221915918396, 10341553510464463050}, + {280903370426929900, 14994955837151914025, 13551362401871479612, 14711789630561753093}, + }, + }, + { + { + {14086745261650819748, 17953107869776717888, 1777725846494438428, 2765314406831814212}, + {2603997194371852991, 2223517025105045134, 15579901335531749634, 6571733615332171148}, + }, + { + {5478465698516556930, 287443454357750768, 12201204663663129285, 782849770204658255}, + {11270045035009204251, 18152683972363144337, 10463300037926642739, 14363641589598863851}, + }, + { + {3790592075869665284, 5120320091554329756, 15361581282394028709, 14360464660911164915}, + {15249656958991931940, 2563751872827049233, 13745792006936646733, 14572943674933168173}, + }, + { + {3167679014977537749, 3417445004776702290, 1709246158507866266, 5861367897285174360}, + {8437429877561342262, 17231607446243478748, 16047596399306766948, 17656438585829685897}, + }, + { + {12977336347094692192, 13723871955002954132, 17399919575273038847, 16163973860244779675}, + {14997921584659740746, 6543247361992425067, 4675926398794487109, 17580512382853194054}, + }, + { + {10778828023580771765, 9812611440536367405, 14168149065325522570, 6692229110872358750}, + {11010962724400581057, 13055203605065073902, 11396463140731730116, 16969789651736772232}, + }, + { + {3285258013801327520, 14114268241282882888, 5367399533198476395, 17277410244918727028}, + {2751895479568588421, 751309667192066167, 13038472116718581917, 16013586354334596135}, + }, + { + {12364168614988940500, 13194367252463423118, 12223406606527741280, 5014139294736037086}, + {11244699482831816093, 5336498572491451990, 14268404582568856142, 14502318820969599316}, + }, + { + {13295673091232554814, 313981772853781347, 11829785736449464030, 13341198421333360997}, + {16787450350663111566, 6525407229623764159, 2012189087039636323, 2110887590404698758}, + }, + { + {16984895766311549717, 1057465499230843916, 13565444352859773343, 1019268943988786852}, + {2190009140530404855, 10045598732295352970, 4789803496780829836, 10700158388954091321}, + }, + { + {14840255112988420500, 10066628133368048408, 6527354835873855384, 16106607076894419125}, + {3989024604987083046, 10713316697020150694, 16811389107269552264, 11294596059797019619}, + }, + { + {622403023838932676, 11423409007234191765, 17086830255702454786, 1213655124481948199}, + {3976593910085142945, 6315875935390432543, 17947502153968859628, 18031540937011531543}, + }, + { + {342675887578148289, 18366454547938469828, 3853530442390999217, 7499455395579634652}, + {768597405171336502, 1636271570683567151, 16786205337983572309, 13056241332863199715}, + }, + { + {15991153618414855143, 803325462494472241, 5709347424437559249, 10138502962472290727}, + {4675124205115228106, 9599016746550345197, 2769443894695609085, 12311020551315051087}, + }, + { + {11470964304318784059, 17313372553735202469, 10686997186364536871, 9228453594798060121}, + {57933324335302024, 8931389936300346353, 17823596478938529898, 1126996688113949835}, + }, + }, + { + { + {15804957839814547154, 7924193945337173678, 1080401129055171214, 10816444561878528576}, + {13171610473229361771, 8099842733764406841, 9284741070210451667, 9245195215372025289}, + }, + { + {7185947197544988797, 13306809398790059447, 11440959253278285287, 15084384140482244570}, + {5059824327869316332, 7585354587200615362, 6801884469610571467, 6427162399794357267}, + }, + { + {1505501490785526604, 6062033360335279190, 13214531355927393851, 8869230490276248430}, + {11596558698255017116, 6698268011950867978, 15445165013361223076, 4910055064120213146}, + }, + { + {1453348772281274490, 13028088570940491471, 16100623112750251840, 5210244400259879874}, + {9443916155735416174, 16869520919318450506, 7479400208826706574, 14374970913352602458}, + }, + { + {13057495656815142976, 1743194961605203063, 15733599697884179267, 3501754291485677593}, + {7405256272105757266, 12344297842308545819, 3389605493339498760, 3092252531918600248}, + }, + { + {5038191990715247960, 2723916483244871576, 4891019526710760134, 11094632341133260369}, + {6274429941353136467, 1408871421293516065, 12455625869488488781, 3401549469990652817}, + }, + { + {4716563932720198201, 1584625214845878997, 13213357619008940082, 13122950207230795185}, + {12303370001794463898, 6725033180592084698, 12302152314224424594, 6139100303374835750}, + }, + { + {10149597276931117465, 5778043705364022356, 13888443605241209218, 6889225091714429810}, + {16209363638493043975, 8516350006446457646, 9214830076046105138, 8894115046323798175}, + }, + { + {161027176918876103, 2287100732338401479, 16561946444121779293, 9805329436091376243}, + {11473978632757961256, 1245289731366992705, 7338435771556366282, 15749864527919116005}, + }, + { + {2753237807828198865, 11508305846735597339, 9058745440380813449, 3960739040735759442}, + {17921955885187582871, 10231929062430218022, 18115018235326517243, 17854413167898372208}, + }, + { + {638684488109167329, 14596365931372343092, 1917271942976854297, 12291978018935761003}, + {5076527739384635812, 7833625460571766680, 17060902137821849350, 17134703695475138982}, + }, + { + {13026208197163596446, 1935567165776196957, 17296090833026336866, 8461284827078097590}, + {14545382879887213077, 3302103559307506085, 16026840048628844803, 4599071908983273604}, + }, + { + {9156540407095300222, 7598243263658987831, 1996711254516517688, 13013193687414837552}, + {116495354444693499, 12803585308662671588, 8278106437192580735, 3374263264867687146}, + }, + { + {4318910866113560561, 8122780372606489166, 11952351993471767425, 9581759925599323445}, + {12268585667545114307, 7286163136539353394, 12697490728074784421, 7270019569202782882}, + }, + { + {16247467139569457576, 14043942371464607677, 6338399572126720647, 9528527345786650933}, + {16344656963096275115, 13804658662065732334, 2991248997774547140, 12174436388699549119}, + }, + }, + { + { + {1169887957113173798, 4936710663791789838, 8029349457377894665, 3317691225106441967}, + {3622769674498678594, 1954144360900150482, 1432045977341997899, 934737636789214593}, + }, + { + {9646181593082190523, 16068017411165381498, 13319927590045936565, 6113055520205251774}, + {5576373032696512038, 13880344501714804196, 12022206929479211261, 7387979357081975315}, + }, + { + {13553890993911526641, 1237937561304731611, 11053651340854998814, 8737874920379363783}, + {15414508226001886918, 9311523317130687807, 12080742822716708234, 4715194040021784977}, + }, + { + {17182132836049601530, 1486820395924546410, 14089047182364760490, 5375431386740917568}, + {2352352269256972682, 6220398075470064021, 11444733678216077372, 8173002234516562536}, + }, + { + {7896339057146013415, 17613745684396593735, 4238258305077796259, 15438639564771394288}, + {1482402451684594916, 3104492350488980260, 5195487229736262641, 1361150797580203482}, + }, + { + {15949855327936545010, 15892613064802301412, 7776232754624386979, 2193423430757249310}, + {10751855334513902678, 13772090376350944100, 5644047706587449960, 370992037484721524}, + }, + { + {16329953561108738383, 14553061366216182492, 5112198484879130320, 1893048255589705004}, + {11469678860036344015, 8992526488267920066, 18208245559304821518, 8980963391041920447}, + }, + { + {5783711159088718530, 3503029393593618754, 10736192136662142256, 15443859608128978668}, + {271805305647187927, 8244170003029416464, 17017071503038388446, 2536084345379259313}, + }, + { + {9850291665987916519, 6499970366121170030, 7001995026899086280, 9961826319039756858}, + {7497823327397141096, 6975352931548332265, 4068344268340314997, 15888973419716629698}, + }, + { + {3982898776583485812, 10403233710814076420, 8681461491810344216, 4116685619183896910}, + {18192868132325233114, 17377077437999490605, 17997716263755054576, 10376686656480866118}, + }, + { + {3479412946560984795, 5044366097675527819, 13707564929638264911, 5666779920208401261}, + {10137470376683230183, 2075467328249870088, 11457126564907274413, 13701087332649256159}, + }, + { + {12574253652565934836, 8388159655344384255, 16127953452716629313, 1877819316325313228}, + {8945746653921217760, 4616678606113198065, 1336330019150074567, 11910289150769410280}, + }, + { + {9565592090082898867, 1968790057506790036, 4797721149040405609, 13125809848505545280}, + {14122665390767023537, 17271175538744290850, 16007653062195668190, 16371835205840876479}, + }, + { + {10409691258933377688, 13736467137095186370, 2757793467881882435, 12443439690522935631}, + {17601924849565694404, 988048065500720515, 7554063443268400107, 4274248596892038508}, + }, + { + {8972162505776549196, 16209364130421564220, 13018196697272262431, 418388148277092169}, + {11645493996879973039, 5024734975063482607, 3708889997144620499, 11208942121415360714}, + }, + }, + { + { + {17596113920958619489, 11920824479658301378, 3786905428099710821, 11112764289322906111}, + {8817260450068629272, 6518847791514184438, 14593687325057339783, 18018581321332807475}, + }, + { + {2056254186648603335, 12143016575009965669, 3290271983033386616, 4338404082685850854}, + {12660444972475266123, 6345409453044955404, 13278869140778657354, 10063005167581762786}, + }, + { + {5303950317664091150, 17409642188139937758, 12135894348302287058, 16444741243419918751}, + {13935885817311324323, 8496908197501732703, 12163317723288843510, 16891353436915314685}, + }, + { + {4168420842704770545, 338440394515115377, 2102734009665481092, 9772725684473416465}, + {1247616337419130000, 4222072446972129729, 4836898447189504007, 9154346000276664999}, + }, + { + {14649401370738987318, 10044081678892811795, 1306517740393103656, 16586067283450489622}, + {8211832777731897494, 12849393859171286949, 17327526552807783018, 14171704619529498238}, + }, + { + {12849053390245557890, 12693731077061619694, 5891211584023409476, 1008960642219209210}, + {15593393872187214387, 7381248773473326001, 16559656086795428559, 2106025108820858934}, + }, + { + {4347667984894353308, 2129883711661222690, 1076488804494872856, 15059968377755299195}, + {12380937310378496242, 16425480883270944108, 4769192332535557551, 10388305045430499744}, + }, + { + {8553482596123775980, 12627020622203381515, 10774788686070344669, 6271789114731522097}, + {6270586844349642345, 5584690155569770537, 9478526526319537174, 3405597782572827563}, + }, + { + {10255408065071335198, 2384996481315588922, 10679447117297819075, 3734157461055440416}, + {1635042286365643780, 11321809677772938996, 2373960964139986040, 4869129159740273704}, + }, + { + {16681657814739017038, 2045405432090866328, 9473434018957974472, 5549808619751464269}, + {3650191693776946828, 15805634549736708741, 16764187297356548667, 6849534466635874363}, + }, + { + {15295973549776084894, 8150873746601283651, 8017271980921908229, 4899654767305073834}, + {15257501950484641691, 17365331272978440066, 14582514748324426172, 14727798284858071666}, + }, + { + {3180828552573045472, 17698570278585440462, 8986722854533057232, 4518665117523514004}, + {1718699978312382231, 16973074530347269964, 5684175730451960274, 17228649521631238473}, + }, + { + {2897180423141326703, 13691273076814343144, 2967066815351306232, 1032540647518716635}, + {16365716239989474776, 9503666134295232767, 4599017511227366879, 14475021161770955579}, + }, + { + {4512626226592149712, 13575110216387069176, 13488662643497927183, 9673147324484250604}, + {143936220816719815, 2307325398241477161, 468315224038772027, 17743582630124600591}, + }, + { + {1476494936296433813, 3408612621327299295, 11632756669813257564, 14296719897220703576}, + {2241234207239321749, 12237974399755684219, 16253635131573079566, 11892871179872526079}, + }, + }, + { + { + {9440495138081785154, 17328162383695942099, 1870751290505230781, 17987066187778049275}, + {9952223038481207705, 10126409487298126876, 1181369784146909444, 8158422380540037915}, + }, + { + {10892870009313407934, 5709686117526627488, 16343828906887149047, 16063790174205876315}, + {9076070192754075075, 4639156357669822592, 4904064385440242264, 5942264027390072320}, + }, + { + {14586043427955633062, 1886633882927769308, 12786104261802569226, 17414735423561048102}, + {3869682486341171982, 17146691898427698057, 9886217016173201579, 17515773620461053745}, + }, + { + {17271984572727555145, 2097715321690717305, 5328035183708920909, 13206781766168781008}, + {5915693606819932446, 3870849056297265622, 18070792155150730518, 7786839743829304936}, + }, + { + {14091274565690260814, 5039742420071412611, 2322945829654574283, 7678395717670225646}, + {17396071770599775867, 4747582460834310767, 13387178106758137047, 7224458787360678986}, + }, + { + {2020583809775623843, 3803516109208330416, 10492323079463714031, 18244921722581618682}, + {6400055933742731191, 18370212581946723247, 11415812944884122048, 5987324147127294665}, + }, + { + {3106709870210381627, 3437108621064387068, 3265644153772373951, 14353255805499610949}, + {11329727508866046420, 5461257448868659690, 8139681370942905079, 8439558396411914298}, + }, + { + {7939886940063870939, 3597929036186322512, 12732772396498766041, 13300425267730247515}, + {2345112231224079293, 12327614629296314761, 17106102937162407683, 1702694317559034053}, + }, + { + {4276582831142955483, 1304336253044853784, 18317056640605949326, 11200473213973297420}, + {3937030502759894542, 2315314353886242360, 2673827662906962132, 9781744582918546067}, + }, + { + {17837268310687096164, 10122495457633601623, 11985150009870152981, 11282144500794610389}, + {13999168735732598559, 9030771445951876212, 6423904381826094276, 6148980837201061250}, + }, + { + {14621142736654260750, 1806201536162806753, 12562675185535659971, 5326177198980139868}, + {8675433132905478434, 10796034085894917871, 7562073626744691385, 1491977564717017512}, + }, + { + {8821632341545057929, 16708916351043551467, 9171560460858577216, 5711973041149612575}, + {15808302665077457285, 8412173943543358851, 12602476370021215716, 4778674887660148537}, + }, + { + {7524796586818405222, 5468491023058834244, 7965536127579551161, 9575670558568595724}, + {4020611179055350793, 186082735900253826, 11198349470461895384, 2693853052562145978}, + }, + { + {7977371007734934919, 1442746893361509157, 15080044066626816201, 9179319344686817504}, + {17927184654813605164, 16541635384799094673, 1663389722548868092, 9157422724003022421}, + }, + { + {4167146676307544690, 12042136744739037957, 6606952994938338836, 7554398412699794678}, + {11844277247778765775, 8165791089025933303, 14954338535964037723, 16693854111477654477}, + }, + }, + { + { + {5841260956815214452, 9461234662498869948, 4761949640006529525, 18229823346336752572}, + {16055957459773168413, 4272222475092786627, 18249888117586812770, 4531982814021269346}, + }, + { + {7270238601276019194, 7318279377964882079, 5226788506940171017, 16838449902078450273}, + {3375184937745100689, 16320655850583231520, 2173229791272659780, 9816381971766204380}, + }, + { + {17113448198982970082, 8879656883528014268, 15215762680430094206, 15232212751792759071}, + {13699137317730183483, 11815206710130297569, 12298409691055054593, 2192455093917691024}, + }, + { + {9742819322069712752, 8779224519997661749, 2591205872359340025, 9144644967919881415}, + {10495832103710459914, 4557264342687723360, 935865282128150338, 7120324256648044882}, + }, + { + {4683169301229531061, 14940390399739549639, 13128742567354398401, 15222231511210090535}, + {7352694898928671332, 1221555526903686446, 8697118143614336514, 14515400523185205597}, + }, + { + {10239864229747754958, 12477284975467600510, 14054830413782031834, 17752968481181892755}, + {16082713391521411762, 17191329716867535304, 11245514405315337909, 15159733745232554536}, + }, + { + {15444441705629456398, 12030687282161152512, 16500102437404896225, 11467410246278043769}, + {14031300093087427598, 14458597378298191386, 9434445586505481169, 18221119130471329822}, + }, + { + {12694666558858009121, 10992313774737315187, 6046508760845509477, 16818819584649823054}, + {10464090160691032219, 1221502600750419478, 8658907655588546849, 16110628890984509877}, + }, + { + {14304143349839262251, 13048055876309896774, 8676204847923624352, 8365498293767636038}, + {13565995665971214654, 10895028049457785231, 5911971723937387023, 8436244239466286317}, + }, + { + {11501032393232899227, 3895174794911924947, 3230698222875450976, 7264134402609589101}, + {18091100044992147344, 13252184705645692134, 8424205723200969631, 5731735154358029264}, + }, + { + {12163905774765001813, 3911227235818691672, 9833792088244333742, 6413344327541478453}, + {15325942369130325853, 12629318625161567307, 8784755949357111975, 9462269284575183222}, + }, + { + {2157617452419341992, 3753997642171159286, 6553292364671628995, 4814048166016850277}, + {6152139240994642263, 14066819599579263267, 7377541740373798192, 17830582976167057789}, + }, + { + {6906089045659836134, 17967958089618664024, 13353206790928340833, 14671934547763383296}, + {12187232481950713594, 8718528695481423527, 18137604428804898613, 17758096361511845106}, + }, + { + {17646581888040948752, 8252837592394234071, 2508742924483223473, 5332070238932154531}, + {13165985796861395246, 4409584176627274781, 9230253121183107430, 8784052955551358471}, + }, + { + {5394535031187713437, 5279515585052353937, 14159976884067043134, 10130852155763718010}, + {13777927158878861230, 14015445621678244733, 3350717438960860318, 7071836838770144750}, + }, + }, + { + { + {10708602749843635238, 8046488591192123621, 11391158257016334553, 2512908912806916201}, + {14760224624269838038, 2631910198880826809, 2387247811669872033, 2048193899742148806}, + }, + { + {17392983665205025720, 12603331233691760840, 3752711326309791976, 8281544857330094164}, + {17004651346561270106, 10399322540256775923, 9721299450284863176, 3725182263994944884}, + }, + { + {13643198694788276032, 8127425924819487897, 14165945065582850538, 16520977003164405917}, + {1941948502806705647, 12390949208067741787, 17112117376594486408, 10232906951259490042}, + }, + { + {74190110112564319, 11227229657066745164, 10151080599595091944, 16591051376074591375}, + {8256332495682655293, 7127985739945537626, 5708687346183367016, 18310921046455023281}, + }, + { + {10040565835468209502, 3986586816478505371, 7957179672896506016, 13347112914739722590}, + {14099734293320932556, 13921950344400895005, 17478414833301838037, 961445463330402797}, + }, + { + {10553899634420153414, 4215979268474142438, 3643081140297634139, 11620906704125380460}, + {17733628678553828301, 137473878710304143, 6211837577294956591, 13926110616399428016}, + }, + { + {15203257341351417031, 11597829209697937782, 17317571979811895272, 15929491640570317745}, + {5731227916276913121, 17093153916149088230, 3908757069480556294, 18211818355208735794}, + }, + { + {6887629766078662088, 15330755394432598442, 14144608177273202986, 13258654996547018856}, + {8975611270007504091, 16869834856279102361, 12707970875852047823, 8520055680055874514}, + }, + { + {1643407997152867899, 5400650551136488814, 14663391437159245064, 4743209938058826866}, + {1728998201888511561, 11238331920657195520, 11617984741897247805, 13858029141809651878}, + }, + { + {14003691155137683825, 14641672309228817657, 4031783205073356111, 7414359968614421153}, + {8166814052414482491, 5209260157266028169, 17555696996149558694, 9780166780476833956}, + }, + { + {16029688335186691281, 4244772808651443261, 6450459413414527821, 695875191412722741}, + {11104054226249884864, 146461617619843327, 17480214580411209436, 11285418463967817315}, + }, + { + {4922928863857449168, 7226901725606965824, 7568276305032368752, 6253457805758596797}, + {14345040877576203078, 1718759302498746946, 3544444746772280646, 17880302727399449566}, + }, + { + {10693864548794383214, 736148233485985101, 5241869061152863453, 7166954323782542739}, + {16861482585847848251, 11483636939866570861, 5950529069765100144, 700887039653157350}, + }, + { + {3906969739692830848, 5546431121705298614, 10491799900914853406, 5871175286230239238}, + {2851574662174517162, 5511397532379144624, 17409985391224790540, 319012646822749823}, + }, + { + {15269778527761027251, 16471737837294177924, 8830398856035267114, 8206807757132984992}, + {1421214226977370752, 14233751335943482739, 9668238787333455452, 8700964319357541954}, + }, + }, + { + { + {16477698187919702699, 2757160833848759781, 5976267476122243443, 7375951277779829055}, + {6525111513935493528, 9969722922172879681, 12582700753056539952, 3861958159147836631}, + }, + { + {6001837395299394988, 7545846298204709215, 6662102781970969966, 12696054550672669874}, + {7436995610194789060, 9042605089262227561, 11621508125069628605, 7289479057360149973}, + }, + { + {9447061002880879247, 14620964119546151815, 12310553083192998735, 15923694411935453454}, + {7392925129127637753, 14135139889986895975, 12760571438361221130, 17000514617803354735}, + }, + { + {15555649500689005370, 7857014165815014600, 4664069234996337119, 8058230521837307501}, + {18090421626009183450, 9278179697462444898, 17138879353097908770, 18285223269807746171}, + }, + { + {6099842409325199202, 2732701612070195412, 18229871238556385053, 10275023622778520796}, + {5986266691884320152, 9796109565274465130, 8132405984970989382, 4521405733027618902}, + }, + { + {7427469853953577123, 9581104712231034671, 1702722776800247878, 12656779221313783543}, + {17977155285174544822, 7208039998659519604, 16978428797146101290, 4487821481774245164}, + }, + { + {8040999562333134211, 6854344540855006667, 2481534773419348751, 15571316619985340537}, + {10089854957334316687, 4775911690791701632, 15619815835608539594, 336338508421162031}, + }, + { + {12741225973381753432, 5461579923265799106, 4348015554411389960, 14970536173310927872}, + {11568371199139699619, 11748662751675667230, 15495664823061891700, 670495577617908409}, + }, + { + {6065163107315563308, 10179715614080542168, 15046885616273736618, 3965401047645186422}, + {7013093813183571821, 6087826007582017410, 14469686436525543908, 9620661780899615891}, + }, + { + {4469547109588409455, 11124190799085603197, 7471495874998642156, 14754586999614006506}, + {88849924092797594, 3031352551776027825, 15701321561580429717, 783416358537121491}, + }, + { + {16899538363784443428, 1224176808212436099, 8044883358999763192, 8119246882922976226}, + {1602185320898819533, 7795133078900055750, 15379182653822915088, 11717676755990779936}, + }, + { + {9865772269601493999, 7325690007062740244, 18437964667185475354, 9546360111100619473}, + {6266116854923135821, 295905071295541234, 16037468634731642095, 16602609756229843150}, + }, + { + {9871952371310035629, 16929106233175362415, 3445554197529258762, 1598752868683659684}, + {10123732080482057842, 2393692486932623922, 2380673894473467164, 14578017559552626408}, + }, + { + {16688239163561330036, 11170579336923472003, 3699145675255553709, 3266133724446548264}, + {13646430870088709566, 9802235972068927845, 4016187574117121322, 8646347483626678378}, + }, + { + {3473609455134319994, 8666646689587058890, 10588670228528079578, 1636194164122827747}, + {10443498896203771168, 1711092164750178258, 3641509682909832777, 11037852869436666140}, + }, + }, + { + { + {15254713655124736464, 6283719686609422435, 5417864180357938798, 14010638809605797246}, + {10873690600705871523, 15014239467130590294, 15765460219545280655, 6048061577845125750}, + }, + { + {12012729503226546642, 4811951115754240681, 2652621264600062520, 1108958391967017223}, + {2508980100759035797, 9023233544151778447, 11183557587641545146, 10726727280840759519}, + }, + { + {396296174223428093, 16763788748988621834, 10606803701784640909, 2399987183687936561}, + {3641562114746393614, 8536687357022564742, 14532545286961725758, 14658331097531946901}, + }, + { + {2386026063595321071, 9144724461940169335, 13121187420621518554, 17351696676224980491}, + {143495028693925520, 4590642171152119027, 8655406817079059692, 10005507077955932112}, + }, + { + {2047964090310465728, 14133690277069748515, 8287749071957055844, 16821270580974431218}, + {10324684883587585565, 9652498187344172497, 2461802306013063247, 15048850312040680643}, + }, + { + {105705035058376953, 7541598459498134635, 6627685529861836787, 5724525771392188178}, + {13865897118300842617, 627652561624109853, 167084371112939132, 14192831153344015422}, + }, + { + {12837696619944805389, 13470316523008526719, 3074966674353053986, 2630814767089382743}, + {13353767941686870870, 11405513520090968568, 3071969598389884693, 8212421686942839224}, + }, + { + {3464453985305889088, 7486900500389940957, 8944303108517222303, 18319933556403836918}, + {6782476025105836770, 12822840946923377510, 2799592944286097404, 8737598030273298051}, + }, + { + {170025682710985810, 13049055489275530431, 1714038719952287416, 8470425667049459662}, + {15692449588624337561, 6306908925988159475, 7292362624201217567, 10084542069209889549}, + }, + { + {5788423445465760069, 7489854375947810149, 2512436350424132958, 18422682564857699600}, + {5177251288327577128, 13879051611542381588, 12430182880452441435, 16367520376757404605}, + }, + { + {1828702178325893477, 504110179554648546, 13285173922848349127, 15811513724231368560}, + {5009291056218383875, 12726125712718222937, 2511326207435121241, 4878070763721166868}, + }, + { + {3151967592390934907, 8745573685636820318, 6591530195811780291, 2269684725432150574}, + {7575618284647930930, 14430170051221190457, 17370623489799706048, 17190167628015666439}, + }, + { + {13971505255871035961, 14447456703883945351, 7749508685925819836, 12281701633335081378}, + {4638096293890044597, 16388439049639616700, 2805317369196495081, 5611057071508020450}, + }, + { + {3416635149605340108, 10996030428276056653, 14121021550848949146, 17748729969482499931}, + {12079053778595035959, 7473419378019222577, 1862205264236631673, 13655366704192015583}, + }, + { + {4817911180954611512, 14468615228783100826, 5900448495927012352, 2522071476550218088}, + {15649024877429766334, 3445298745493942789, 2295617386899137580, 18376023059372246253}, + }, + }, + { + { + {5228416958727036186, 12534300056259911378, 6859045937063682340, 16561718753727911412}, + {9427589074776024847, 4167904055656501509, 10156691045253563236, 17557096561606923049}, + }, + { + {12847261474293104380, 15935635664155479706, 11956861064550631146, 11743590506948225647}, + {15973092866215748716, 8269726904881958353, 15639962392523441528, 15171417818360069012}, + }, + { + {2605212343977737441, 18393471024186189813, 2302707671753008158, 8606549841034095192}, + {3842822953634987820, 3094721493917442423, 6408313759447502937, 13486364200254727287}, + }, + { + {2191808101092881088, 128992526124656216, 738676021426139131, 10157323147642681558}, + {11221959943853120586, 18255489816550713347, 10885231659068427649, 12104397395119665023}, + }, + { + {7707807226411417919, 16609863548699265350, 17639371636697428128, 8755472387723764172}, + {164779854477783265, 9714199241756765614, 3491355372893948450, 17683742455036967163}, + }, + { + {13595758632462338296, 14515163666150177917, 6720823780841221770, 15071435664343609336}, + {9016075014492765983, 16881277609836316886, 6969993988115170067, 15419704786434737070}, + }, + { + {14933348768149415725, 8499210770493553168, 6778840616148281272, 13282837866452012488}, + {12007326272174861053, 11172739862019218274, 15202495365302649711, 8797477675597086120}, + }, + { + {17862558746132168231, 4941846130090682869, 17131557654945008226, 5312800819142473968}, + {5818269467205924209, 13458582047859447022, 2683428091382447153, 12956887954464730664}, + }, + { + {11820752998821943867, 5623379642132478491, 11666807493120740820, 7241997274572162616}, + {17165010508995490690, 1769225877906480182, 3814296306467163522, 1913823003062817434}, + }, + { + {11936813336110488997, 3878433838529606580, 6540053284493149566, 10610279324743393563}, + {14079852809920102066, 9176732841330794388, 14287311909822853963, 7146204303626670196}, + }, + { + {1222343790928490335, 2199405396044383670, 14080919887213592148, 7341303626667347624}, + {11784881532696657518, 17307742911086150556, 6036132721599132043, 12167106497065306941}, + }, + { + {13817073203406999359, 7220729284169210756, 14908407498603601482, 13536224989620701632}, + {1615171540711527931, 2063856048260214664, 10622581435417474559, 16378505765730768032}, + }, + { + {6855676470217754770, 9517149712286624325, 11080380031068971680, 667425509348698033}, + {6136243307299269825, 5326577850303193160, 16120190278345757447, 1982981965726975383}, + }, + { + {15399454106099176868, 3988744407816581672, 3596277710300384050, 15129113714633923498}, + {1554582462382333698, 3164553872715651710, 12729140363982748426, 16366728035709811784}, + }, + { + {11647936211409428873, 14704462653811533865, 10005129575282387925, 1526194796943187368}, + {10906326807488904308, 18256878690674435807, 13093574545395154003, 12352810226542367406}, + }, + }, + { + { + {17055119974261943875, 6266720893662254540, 13102139953381148874, 5249314164321788611}, + {7157525732140787612, 15381277459195914226, 17265025258266710353, 17573500432599548120}, + }, + { + {940679263188661008, 14653357165718140350, 15439920797347843673, 9415587255510557494}, + {18115037054677722678, 8165849408798239027, 17369387099667572407, 17619066457126678815}, + }, + { + {8649149223282317557, 7756351751136698462, 18239772072009739451, 9817506578949224559}, + {18378033667730800420, 16794121140066562876, 5288247581483071333, 12402303517382928119}, + }, + { + {11047138821675365077, 8918121441180891972, 26692501222219426, 15248413052700323978}, + {7305399157133896461, 7065644238942265367, 3949166834387057064, 14178248206708015607}, + }, + { + {2031270890855333638, 16982096442429440651, 16686304398848635900, 5829842366016448839}, + {14111080098472974183, 12565301877743332219, 1685254887702201709, 10638099573980009130}, + }, + { + {9618597135962048429, 4323708363301758294, 1934098864729515110, 12038442338797726450}, + {8373847126955513333, 3300151407444969023, 15888126952439796914, 1426880256839266097}, + }, + { + {6428576619669681259, 7657770350257045071, 17839413659396163406, 4702043961312931605}, + {8200928556018997183, 13282376860743810804, 13005614455417667639, 17419029631791664639}, + }, + { + {69860179712677448, 15464996655458230480, 15095351218136595554, 3792171085643513009}, + {3187131848664503636, 12713332789590787064, 6278731049699775392, 1597379696359884724}, + }, + { + {15673011075664376010, 15519225812231888543, 1336371877669824820, 4354970830277120843}, + {8744720488959125220, 17541792919601146935, 14299260104084112815, 16082554294713598652}, + }, + { + {13540612390708052286, 10213354985487483900, 11366371415587713866, 10334937577432263044}, + {13368390835254255145, 13453645319717588760, 6303196127329783110, 1204334422768264234}, + }, + { + {18221540219239501535, 8536815826205784644, 17328509446048600304, 13923028809228258331}, + {13984621134784540482, 10254983270679630247, 17457131706329229663, 927850905006752032}, + }, + { + {3952205381894147962, 11371446109407143937, 7231851263356642380, 11612512368538303138}, + {5227214975837085115, 10737565048439707166, 6333629542995218640, 12386725921557807638}, + }, + { + {3772067962000745672, 4436468403847408320, 10612599615182677580, 13738755391074136269}, + {13665557786177426407, 14568219921857752, 2691062926825113708, 14666515738377567975}, + }, + { + {5392936538333570234, 10526292103645946001, 14132494129869423619, 7207059073717065545}, + {283545293669631007, 15845011600683983526, 5081287846871250008, 17931854980704528162}, + }, + { + {8364400939527235175, 7959571573625351093, 15849019287994534535, 6982609389731776566}, + {6287382484291579264, 16496145344132275167, 12062306229709713775, 312030175316686885}, + }, + }, + { + { + {17224650011872599657, 11430188086182976152, 12892063618843720029, 5912993124689510433}, + {7069617917494051681, 1298012103142698333, 7943359430865057535, 9329776843721719539}, + }, + { + {9464085603669036454, 7848014338005901108, 2368914226155404065, 11578416111848517850}, + {6323647866244499941, 14399589996703947996, 2824522520842155768, 391310842153371124}, + }, + { + {9948650801233133770, 5836115460383443197, 11404170696974449207, 4791020823967734476}, + {423024247809958592, 11251668387880260801, 5562546584223492723, 578572156618131794}, + }, + { + {13988854693674964723, 10817154032069031941, 3171651998645961547, 5518712225783687705}, + {14706905091132091970, 13960758460934966876, 12141035142079693145, 3149939820435101269}, + }, + { + {2505301881938098126, 9962323478923652140, 9312199523950444342, 12957822502673689705}, + {8060810607849163143, 737408553843844193, 8143568733429881786, 18003168270780769476}, + }, + { + {4460927228453411137, 16058422703785787527, 8016770980039986075, 11450941100964860520}, + {2742597710491507274, 16940752978671801273, 5897441526901650840, 5926672707007682446}, + }, + { + {5772778048593061508, 15424756817708323928, 11842041259277183807, 17669952685051160523}, + {5405007811515938363, 4415223809135251038, 2223192286456742546, 15742105795795272774}, + }, + { + {11809342655313500273, 16822704101813284237, 13097372075606737923, 5463281428453250615}, + {11967866991673525562, 6828790575157689223, 12568831962097805646, 8385980093725157349}, + }, + { + {8090324765778815982, 15997433100218204643, 7771766025433829989, 914551143312324786}, + {4640358803642182649, 17428148208737756210, 12144967737399770998, 15075125743380741412}, + }, + { + {5954807828598238451, 3186352433639831389, 333598278340882889, 8647732331490039308}, + {3706589107409903019, 7338319463305947507, 3829684452513478938, 8551967121356509963}, + }, + { + {16753777599759754869, 12028154198579512953, 7911616552276519044, 789841268294170739}, + {8228995103825761982, 14293958931719060336, 2778055819582565008, 1399082948378499882}, + }, + { + {12492565198527218900, 17337285577296730202, 15088344513573802417, 4272568906387671217}, + {2365541522321646412, 678395397666822608, 437334842774934301, 13443327606166079837}, + }, + { + {1266313952277763194, 11470850617813390661, 10426389264474337810, 2996447663006153747}, + {15218295359022152122, 14634539952819815592, 1775270187047190460, 2942637199921677956}, + }, + { + {4952377176677649521, 7473631065005310719, 7363684030854414233, 12556891399998587233}, + {2190850394642244911, 5458637782288631421, 270926994697866523, 5528436328062366401}, + }, + { + {9497175173535366966, 25345745857275253, 5047829133239508177, 5340238103822773099}, + {3133339556064328840, 666970525709876149, 15575505473500291502, 12769675806855640654}, + }, + }, + { + { + {7669790431656261769, 2776517632462593286, 11694025667665633506, 9533794089008895277}, + {2895611631120558023, 11551410655448788956, 10026541900772270925, 6243136875017000843}, + }, + { + {9434484992529186384, 16435748047660609525, 16190660694150989986, 7083965852434071085}, + {4216306437741910756, 2698742177539497614, 5199793642504009017, 17298424769819019160}, + }, + { + {4041169394784902550, 5699517344009382913, 5306272267462320559, 15846674482556330025}, + {2606351264228884283, 4162585980422107281, 3715151019132039005, 6607223447043258693}, + }, + { + {8168579295855409503, 16727569921530031841, 6182114460261837773, 8940603165471931374}, + {6081572078077526926, 5890840443923124563, 11215305828294759727, 2875117534361804712}, + }, + { + {9045974983664041829, 905036705033699463, 6962033946652121779, 3027264198782618401}, + {13786415307358010100, 3643342525745067473, 13641958783381681886, 15675065537779359584}, + }, + { + {7507377696839752642, 1061259379811757443, 10276590160392917813, 6889137095037822679}, + {16373913505782725550, 12287733095803524526, 5695917172259210496, 6360958736925918808}, + }, + { + {7459854586357006968, 702429387211615855, 8231296036461604410, 628323703857882004}, + {1059802628602873385, 12517208225099517507, 2368172548334856593, 4792344750094708709}, + }, + { + {18352334786472886037, 7096021570596476676, 17045407505128867173, 2467670847537319400}, + {2225663888244226889, 1876713214939672742, 5329943993157142620, 12168650975912182188}, + }, + { + {6639850268372381409, 2284514769224558945, 15390110317831975716, 13933785559694229008}, + {12787641603764341997, 793886210532292741, 3222136169196008839, 11104892506868626444}, + }, + { + {12660547967989039787, 2109392063597767300, 9889743271997754037, 11803327596624324036}, + {6940409327849314286, 1466399127363116843, 2572333022681966275, 4216097356402537802}, + }, + { + {16858757460581672909, 5838407119753001493, 4453405435911954669, 2828665451507432751}, + {13657966632733241760, 6875986784381874300, 2390233934255482553, 17386653779125555159}, + }, + { + {2976756344404126744, 17032556609402836559, 16348907464011574182, 2196781021202618892}, + {8270822867494340805, 4738372358350764889, 6088256422707334932, 17121369334507507505}, + }, + { + {2081729301541563384, 5577186154173396778, 1865152567701500436, 1422284589642218069}, + {2489023909725140903, 276494395149046869, 17420927169263487236, 8292343688801608074}, + }, + { + {7819174654675104600, 12778055482430336726, 14615848543490171611, 17498415175263742825}, + {4785899184222234034, 5227136636239697699, 1570704808469050246, 2858953380860123257}, + }, + { + {4323577007857413306, 10524228743339400397, 5418808897687027557, 5939367271366264075}, + {3569359126353670574, 12961495213964770607, 8906990808988099905, 261084295374207271}, + }, + }, + { + { + {14408045416865494124, 2442199381796557002, 10475326303775862953, 13637445125954159957}, + {3778313603630758744, 9247460369874272772, 17572237597883145087, 11338350096360776602}, + }, + { + {4336697789732072031, 16054848662858822197, 17934449813415035557, 14518380622432694666}, + {14100582434152190048, 6262866632984449325, 18069160441815400774, 9798342103009260692}, + }, + { + {17244020587062193870, 7625407515295016845, 12692919397126044801, 739129074276464779}, + {977900962655641355, 1516169712468716336, 16875961107875019625, 1582931498538195018}, + }, + { + {687104890149081183, 1938816743979859301, 11342071981175913904, 4270322127259097184}, + {4964776270155503160, 17849333582861534767, 15814479527332819692, 8083943565773123408}, + }, + { + {7977186743666958490, 3126199553548085949, 16879636338977836444, 16647578924708995556}, + {5526017172393528596, 11328754652335568585, 8095074058116436597, 14648690727521713743}, + }, + { + {18335678403814425235, 13764304056086998207, 18139296224460762074, 17620705673387523052}, + {16059975647897396183, 14392541906869470064, 13641721532745636092, 6122032872822720831}, + }, + { + {13983401929934353021, 13860725962778449344, 11760533704789481157, 12566657951327299627}, + {14697122142882732522, 1606632877136342124, 7872716135734366961, 18220536079227927821}, + }, + { + {3986890035154628803, 15316660330065019741, 11560940574529263780, 12576851520091035878}, + {10883944418224886092, 9908329441525486205, 11238684990962507809, 12900626758810151662}, + }, + { + {2629393050548942288, 6363222898077806203, 18404650886731368903, 2691451856029551156}, + {5104932743043229112, 1302939624985069019, 11820239270922660661, 16228045717328023331}, + }, + { + {778457530134061801, 4290661013056586404, 12033745869654330486, 17833837257536520292}, + {950548111600899172, 16026254932420015523, 14620989142158250051, 8236598933984161995}, + }, + { + {8828068000936861634, 10901971915827198521, 15635295283164640480, 352740455954411610}, + {4853015383138960329, 2945696874639059776, 7204307993540375148, 11980890732241054979}, + }, + { + {4077800412543228484, 7173833470188867493, 4604439809988262876, 8090706047559948234}, + {6117166546062912279, 15748537214854486946, 16719594636199001564, 563850925691991999}, + }, + { + {4802884399593912281, 13437020732272033050, 12197788481695720547, 2162699662292229581}, + {4193517889478995518, 8610646873096992408, 9485787089338760040, 12392145097158647056}, + }, + { + {18079795516810465755, 15723042000668265475, 12488322519570427659, 14012836221417650412}, + {6534900133691249330, 8115921632235353076, 4093907116172233459, 16784728000548766561}, + }, + { + {6262200118048820167, 12719453838344002789, 5526427573572313315, 8520226123932607126}, + {3618116539863181413, 14020033065434801713, 15675496263723836857, 11987954535452978647}, + }, + }, + { + { + {10847249691051757241, 13332329214721571156, 12457628412284474075, 17044657510482764070}, + {5218221397478351943, 6922630493693541156, 6207927102810766143, 5644846665334649748}, + }, + { + {6506371904134856034, 9541373683805144018, 3149037850125132851, 7111810601994573897}, + {16732445693192247884, 4994069681898274622, 7223719243730104348, 5649174084086150712}, + }, + { + {16562962997045986629, 1977585352264948582, 15588655103333244279, 253344970359156714}, + {12939363813291366775, 12548224526376199974, 14450582788883748364, 5869541533939881460}, + }, + { + {13970586842647892965, 3680317572634289692, 3416494470839852757, 8341497967750607131}, + {5522860734580749818, 6847292760525096386, 9317394708872196559, 8522252330730808934}, + }, + { + {6838341670149165895, 12326189699069923388, 9258908232339348843, 17297038041466207989}, + {5242182985453021593, 9648294165629935142, 9715128265517308395, 2662662536493743894}, + }, + { + {6790869670806738567, 4499989093713728199, 17496748050437205626, 7194829324969293638}, + {18432532588985091708, 12041300075343806904, 7788543067151959941, 13703334460383638224}, + }, + { + {5996381448168274884, 8108757135223610234, 8067369725584584297, 7184925262427750366}, + {8199341143188441284, 13031376443169557016, 16036606349050125404, 11958720833222295864}, + }, + { + {9293668142017263584, 17134656749295164870, 5879480323258506465, 4788695233340705697}, + {17809277710857366810, 15157733645094688870, 14143869691462709080, 3162286338158090229}, + }, + { + {16056959590901591813, 1082823161154599460, 10221040439441372421, 18283403891485112294}, + {17582486701671091218, 6489397700174053547, 3952499348250646760, 4381145145005361247}, + }, + { + {464321249842430028, 11444362575253049653, 2734975360475017776, 4746579078625212558}, + {11326126526565916100, 7840007639237722362, 7545779893877671555, 8952053274372957788}, + }, + { + {9171324502111757965, 11245577625425383295, 15294815109909975990, 12306264653913762086}, + {5906268309303228662, 2685370982867857233, 5470203265560800284, 1354105134944127233}, + }, + { + {10610818607308010986, 1017341076592473937, 13259969743043862138, 1850907007366751943}, + {7689302552902672401, 15375957693502270090, 13877050204486881614, 16441247744335371320}, + }, + { + {18161720198110725057, 14887135440336057963, 6790952723850964648, 15120775513153544155}, + {11797493458812299470, 9090758778610315656, 605835259544633945, 14755333155432393992}, + }, + { + {14967102006962978091, 4301508725220174920, 11299977101982031802, 14410789725331022027}, + {17005709003661351591, 9843840931527318478, 11917612896070173894, 12007179364072802553}, + }, + { + {15913542135925395264, 2830138374220921671, 6395020779026969444, 1239443258852925290}, + {4519359001030231260, 9606729174209623750, 14291346135557028396, 16179513817501558495}, + }, + }, + { + { + {10223936123327786454, 2321887803300626936, 13607747528117965743, 10456421630388400123}, + {3266519591187534953, 1053691207967834494, 7151443045753788549, 18124688636664828399}, + }, + { + {6946488664257064464, 9775328903143754150, 58700362449753229, 7901817271072273406}, + {5074738678159003249, 18397239731906005785, 15911102965988125888, 9277654580204145348}, + }, + { + {1874700306906525099, 7337351570334852732, 7954195906114335343, 17230226427261850070}, + {5181329498860909261, 107167242193237170, 4364856176182710332, 14611171841443342914}, + }, + { + {10990327814895720476, 16588412771027628390, 2850177278998422188, 11569813740328484871}, + {3922148781422941186, 3581659216490446242, 3646872304052351376, 10887870617200051198}, + }, + { + {8175121141368087217, 15079393830876652065, 16766987879267543828, 10582796406546815217}, + {16832256009371376870, 10042650470778064892, 17867163453935683780, 7123418345572641116}, + }, + { + {1782651072016504775, 11033882508408412333, 11105300284232190625, 3276372405089292929}, + {6399472468041061588, 15319690780388315076, 4928530863063375966, 11596222198340277418}, + }, + { + {5452424185619067445, 12050433097586021281, 15018766900844679217, 273234254926088220}, + {15426383635547379531, 5213762666043737626, 2829185842069118470, 3230799283770935127}, + }, + { + {280030342772428106, 17354882606189694746, 17455445295460080284, 18076709382926018941}, + {9895982528034548913, 13681172423928175330, 1656433131309057012, 11935757350437721114}, + }, + { + {14437472586336929440, 17387041914242263390, 14861577074379746687, 5146556788377906297}, + {13036814755814090195, 15108836859245573802, 1667563994642521213, 14722845469958372258}, + }, + { + {7781061995240980266, 2066078418484154391, 4089376589847114892, 2434843609506038666}, + {18376509832460312721, 7187709121160627756, 2455436656049651823, 14419116837518875372}, + }, + { + {1270185079976403265, 9214436628411717184, 15450450827683432913, 2880014804806096082}, + {15448799931519826757, 10080240282127928735, 10673974088219619287, 12998944469117087518}, + }, + { + {18028691745165748687, 8931519595829275195, 18379893031942930865, 12120980098075498008}, + {9596371470855895261, 4133427878071274570, 13159312399982591699, 1639865074052258019}, + }, + { + {1661696187746428348, 2656198437014978712, 13769477291975851694, 12512848714492869444}, + {5980926616932344693, 15821983893144953005, 5816015630031200526, 15887565799959254415}, + }, + { + {16463929919291729278, 14920112063826664828, 10056471508435050704, 10696267144984026763}, + {12049530292963090991, 11926086636123189182, 9464890378472966538, 9719194510330239601}, + }, + { + {18110249193861022779, 5612784685592189906, 11360454032996393150, 6795401682138043705}, + {1961398978248902107, 8999847457729547905, 8941741619641401180, 6086938661427918241}, + }, + }, + { + { + {1119490156854665483, 16772836556735128526, 8607715508817325509, 9931017263385440911}, + {8799481055779587022, 11740562709785257943, 1956849872282864970, 595288629437737005}, + }, + { + {11601570184515356415, 11247678357869162156, 8415095559389686315, 9625816053586466047}, + {11807876143163335372, 15690209134241397733, 8684637224468015605, 15974968144193406020}, + }, + { + {6498861108824484382, 4670555282769381189, 6606014320886832914, 17078765892830617318}, + {546267528591230105, 17808649363082080722, 3219358059129920687, 9180845247506322192}, + }, + { + {11275984449259340674, 14922638629881602958, 17186426309348732477, 2094500549052461127}, + {1245672419927595636, 7529921141299797945, 3181089597449057707, 7749529014968942143}, + }, + { + {11277133910568934671, 4278895672933635880, 5062049475469993812, 2827897582327968966}, + {2992831031801695571, 13244636528396736375, 11509629662092358067, 9385849226639579800}, + }, + { + {8454236707620433029, 10192313737667573051, 18232259474515025711, 6196538652828521245}, + {6326999652188467228, 7611130140249634596, 5729331023083628955, 9386297316005425714}, + }, + { + {7621274909358193632, 3619625095597194913, 18038386254997645285, 17262892689028255302}, + {17953989125460428814, 4571031913557658215, 12218524221515562809, 12016327352942264220}, + }, + { + {12842581296013847382, 7845624487558348664, 8747439372999364825, 849305823897878133}, + {2217292264321907974, 8173534404179332054, 3588643190593022889, 12047811416592660080}, + }, + { + {8121746263843271081, 10363835147942471345, 312023379108980148, 17191823034761670562}, + {315776409136454719, 8322002171533871918, 659256727451485128, 6073539214057006838}, + }, + { + {5999134638957620752, 14196265207258829507, 5400793612736232063, 16259338359738368573}, + {11179852704740695306, 3486799782309774463, 3060529319750906379, 3540275797284687957}, + }, + { + {5485176043812882513, 10727553589889164848, 5617457077214333092, 15937493816713568462}, + {6287330459840726949, 5451240171054977850, 3524414944972920777, 8740440597273129486}, + }, + { + {6959527445237219799, 17170778245769606301, 807762173031474321, 9151445233487017286}, + {15103411489939446333, 7976669669591851659, 14824323986579638641, 1535817133122800221}, + }, + { + {13993486080187419934, 14882121651768660644, 7947881871819932407, 1364312030151957949}, + {10673187305202558690, 15038997055055408315, 9268330880459316485, 4319340556575124142}, + }, + { + {12846922591360496097, 15518450931549829779, 3843880753372237176, 11741559986398913430}, + {16974382348775305594, 7085384294841794242, 10278478682851578175, 16997904984485898637}, + }, + { + {13670930062027115328, 9912297966339314023, 17061419147322177635, 6220676237879734303}, + {12723388668517709225, 14967294924815531226, 7286002704046609276, 2105494380036834916}, + }, + }, + { + { + {17955247196574331290, 285928599571507431, 11902987704297070981, 2841167725097799100}, + {9281167410796848363, 16444340476026142274, 3423202423051178709, 9101021305726472246}, + }, + { + {8869273893561412239, 10349812081309865197, 8913824872487209090, 3148808685596180274}, + {530908416884501807, 10284103744075805979, 13606889938905754722, 2418062398586758364}, + }, + { + {2298603653884322501, 601221199968240092, 1285112712738261659, 13882709760355308533}, + {13563254433762438170, 13447718334658435053, 13493687958886238103, 11032778298151679283}, + }, + { + {8626760324117733843, 16403951745962159364, 5837394731212322914, 6847167719031297053}, + {2888142337636247281, 3409818743436360750, 1677113113408664401, 1222157560539217476}, + }, + { + {2294668553308381923, 17165287249067859297, 9897724011823072967, 17409851874231284314}, + {13888575318617508639, 12092766090379658603, 8412268183255186961, 8046572777745318483}, + }, + { + {13178439025428734594, 16388038968589028071, 16165750006742628176, 17903639397633243161}, + {9560319088110737392, 7888974492854359310, 16116323630343158496, 10177829649622711030}, + }, + { + {2378363646789710539, 494954399989334038, 6915496914984330558, 757197055392642378}, + {9097171378505823650, 12104288338329241488, 1905673690814481722, 13011078677095066032}, + }, + { + {12712274459771886808, 15748114764509451764, 1994630377849062253, 564390855806287868}, + {135493276425567450, 4305883520257541088, 4842008929542073044, 7035106970720249617}, + }, + { + {4772079965696324995, 15925041062593990538, 2818172089014580505, 11304215074611546986}, + {10130691823118346040, 11796228810049908587, 9262801389703476249, 6629344122525229781}, + }, + { + {11045983914861167112, 14106148195606833916, 4442596873181225087, 15627975325288846806}, + {8173496855557146242, 6061080385918934423, 5233260187121969538, 17554093556474728494}, + }, + { + {12122792368758575262, 810814789452398299, 6387727669765211854, 3304731719391402237}, + {15296845834923103160, 3685348582131767195, 12636335057478947340, 16971253767099552987}, + }, + { + {12345454807632743424, 11546569651702761483, 8873100774001529421, 7001975923028025552}, + {8129283832066039281, 18147888225504425296, 3510907297028745651, 897602195837260824}, + }, + { + {17896345382362222994, 2167374959533815311, 5029128091600127895, 1770543276160593316}, + {17234124146043512942, 5338191548265818047, 15676046602975694398, 1943153641089805200}, + }, + { + {11084819495273800718, 12966507689731825252, 15026437832429189138, 2506312683689776139}, + {7417463323869895004, 9819555221238697390, 1250200244896601539, 1394555910521460172}, + }, + { + {2221512141494043286, 9203854585477888176, 12171379127551511504, 10667358469120985695}, + {3795093165005123272, 6129005969593025264, 8738204659003189419, 5273583671698415302}, + }, + }, + { + { + {16549155412115374305, 75977962737081600, 8870825488941031605, 7403557657089993256}, + {5825394234709429518, 11978746413791918409, 1876293130790608838, 9416631623519692610}, + }, + { + {12346821858361333862, 6352722970730511156, 9920942104315084988, 10492373916708072181}, + {11163323626947992791, 17035282992056675772, 835685192553490421, 12792459312570503983}, + }, + { + {10447922451077327640, 1515090998837129975, 13498807582085718212, 1212623301098019779}, + {11573518650162536086, 4823461685803772444, 7289704908733783271, 13167881392748327839}, + }, + { + {16959954449957105311, 11051594981465026138, 16062472412226411858, 1976004115345602080}, + {3630495248560019222, 12698191555196404138, 10107923614229901155, 1597725222698864118}, + }, + { + {3416019089997140849, 3011417601086561495, 6275242351124667286, 14197557183081060761}, + {5633711018871057458, 9723496411345030748, 13910057756335530832, 7285051335492395815}, + }, + { + {16774605620279328247, 10223834398868957807, 15781733027568799739, 2607095622729296315}, + {16499590296954181006, 7576646116121533069, 16638313875339315529, 14296194207652471696}, + }, + { + {12874411821611501068, 1998417862388106640, 13882642435422318946, 5791129521978463837}, + {7512934139125398199, 6966283273373526248, 5475728301311080129, 13542211842758381589}, + }, + { + {7798993150530415596, 3288770257171840452, 13373286069558329631, 9784279046496345014}, + {15725032660238528813, 16038931923358478835, 6921788930154218900, 6093507035435214187}, + }, + { + {12194839527972802101, 8376199250979271449, 9055995864116790217, 8125030124567662718}, + {1070812422878398727, 3950906148308170707, 10121516919638719072, 813471384549762068}, + }, + { + {7610605259962047827, 14617655900985224117, 16089669078196617440, 10594009761533811214}, + {3425971360520359121, 1245021768718221594, 16690372892586114152, 9933179766195044175}, + }, + { + {15142732720676276463, 17435583143726694663, 6030257647680338377, 243683009289621849}, + {3064238900429394982, 7655019927497549159, 4484400084400458429, 11650860345018651068}, + }, + { + {16203650576183697977, 17614744533772112337, 1119292890050870301, 4574885263986729787}, + {8108207498737924504, 9708434439316056191, 10676823369888368482, 1078311554675991883}, + }, + { + {6876202174636220158, 18057502510666060150, 7821730895845187783, 8882321799602877790}, + {16220624224336230256, 15562800387021280583, 3043825293109091520, 697130162105054983}, + }, + { + {5394549491776704087, 14795348078061113966, 14206080764200897220, 4623073019242398493}, + {5850602047109930316, 13783531993760979209, 14764346975698048641, 8951680172224205890}, + }, + { + {7302725075484262769, 12572584665857403749, 6499691362933905099, 14476353114356185371}, + {7381716148644532401, 1573798302334388880, 8128390307766282880, 14547454176248589604}, + }, + }, + { + { + {4477325369345373420, 299141931133875776, 6787652129916359301, 2498016036564260464}, + {13342319943892943548, 11124287719737492205, 2456333599771808442, 5084719026388755304}, + }, + { + {12246932755942887931, 10842213418139067847, 1827392608284960926, 6961756951208563550}, + {14626966634382828071, 12653808277900379805, 3359368990539585596, 1190255644328095727}, + }, + { + {14845756090430871381, 1260135108359348096, 18373249503604334230, 14931345532671487262}, + {8304897926217252744, 16639705302116302354, 14578633917159176703, 5624357498623418462}, + }, + { + {10836955050615624183, 6228108794259714192, 3769609579318360527, 1481673673659326756}, + {301329772189110029, 3574710782304999603, 3037244905687722509, 14442941761397229485}, + }, + { + {3863379967423475252, 4598414140150397553, 13498347034161095546, 5995458763090398343}, + {8994138995797612256, 1053878477247308872, 16525881906724873538, 16597989933510424042}, + }, + { + {18195618552940791509, 12801347400921689158, 13372055618013067129, 14929951832730936581}, + {2563109394536979589, 3392102243539970867, 2978145866937578695, 15809561751101461921}, + }, + { + {6470844231261685519, 4860920111547376221, 6133864928365904793, 8914566156785557227}, + {8258394874597607714, 4464810914649217913, 120457844518757378, 18209291810039348360}, + }, + { + {7739110373965523311, 11019153332996240080, 7346010155518751797, 14853737521111213548}, + {2542883237207113209, 11015136828834421504, 1998601666328316353, 1540417751495800469}, + }, + { + {3376092179741497360, 12221254335784366861, 5282973200516004163, 11372960528472533628}, + {8188139842572259074, 3946305224334575645, 16643338862665650950, 5859492058050333909}, + }, + { + {14916042081488114271, 3303190861468284762, 14234546272335492538, 5776190344932209905}, + {16339988209459724195, 10022514953301624769, 7878363685856556300, 3127365206552843780}, + }, + { + {8340102858481562978, 5401806343794775245, 12619159636229742566, 16221085737347795155}, + {1241298364136442056, 9142635103215118982, 14403222699038355211, 12145678822325215894}, + }, + { + {599034134015360884, 11263317530774995092, 6667501365379084069, 9844276013103312691}, + {7566306886180438990, 13702768345615509363, 12525031963170717968, 8463786212988210464}, + }, + { + {7279390679700007004, 10579602100702377479, 4366146547587324748, 6962092370680728424}, + {16372420580520124739, 4597019194685908384, 13217149760366044828, 7222487257194391332}, + }, + { + {8454830421421057736, 4100731209937375984, 18348214289895908213, 6778376865226169852}, + {12945227893790929647, 1818657910008686277, 3629900123705314093, 2861658388952811590}, + }, + { + {15882969890737930334, 5849157078791136995, 10068103243390577755, 13131421240079433547}, + {10404642120419399290, 8199866428750316037, 1032443962738597455, 15582122438927179496}, + }, + }, + { + { + {6390361653475754940, 1093882175267357438, 3784079074949811167, 17343872969822169769}, + {3359715652121662979, 16808529787251986583, 5169730697018536870, 52766949850965558}, + }, + { + {13147212495082910072, 5628914243538540648, 439989514095330941, 7620472329041817834}, + {4272251824771633288, 16564977601507013119, 5441117136715882317, 5622571730905974389}, + }, + { + {4207421531032215145, 7924589143024019458, 5496622772676523695, 7061817399179278712}, + {7371689806847905735, 8282663810521090335, 11422487361383982601, 6397294642072086677}, + }, + { + {960381383357168877, 16774709963697143275, 17896181076874992240, 1150415168189819777}, + {5498481130530161530, 6895900060791069290, 2079514944189747822, 3428689507902936354}, + }, + { + {12056920178557394302, 5131253251712581899, 16251877995882633963, 10883064494054484051}, + {9473274815269607947, 8874308005470196739, 4412709653190846630, 16469366225886156991}, + }, + { + {3547198835521135552, 9940690805769919242, 15170549880149605690, 10701681269101530298}, + {5914809102954412895, 15790219349994701461, 13664049285300230863, 5735249081148743651}, + }, + { + {14753645881295168970, 9410794713982813264, 13485977523338061503, 14267793994973767571}, + {15813187206361118954, 16449603969001878152, 17705410933007144731, 10960511750491378082}, + }, + { + {4669722990542640772, 10017368027073540045, 13392819319228640800, 1070815632453829996}, + {7274130058405640448, 4460835865761538026, 15283885107956150892, 5815884817303156137}, + }, + { + {3469614802230980914, 18060080625283048965, 580464295809221798, 3338153928139206412}, + {9845192339392693455, 13250323899168115720, 11058696855422647818, 9665232062806155902}, + }, + { + {14461336556325939926, 16946363864290460645, 17546878353664479567, 17949437676666656135}, + {7932367178689988878, 4806368097560008659, 3460529608269790679, 6065321700046177254}, + }, + { + {16883816924971606835, 5486714189826473375, 15204267662844332028, 17199232837602035696}, + {15958749676770074119, 5540664038667498053, 15914281753951743318, 12225053486711127081}, + }, + { + {15346266095840263783, 14129675453960658911, 1781465630073142581, 12398710533895277470}, + {17697074063253841985, 13826156613321578228, 8855030685964401164, 3749659313217692983}, + }, + { + {14888039192306165275, 11233459160096048886, 709252573146299872, 17614748022803380926}, + {10853790173866038588, 2988411430602910678, 1343284586410250367, 4491892393582674365}, + }, + { + {5653853395031137185, 11847098886335071270, 15046954358935848863, 490763079643421287}, + {3113500211585712650, 15997550469331041114, 5281575885072775975, 2887311255648554506}, + }, + { + {5376335754670737023, 13164671289498247151, 6846569847526260467, 5496656304894178122}, + {2009132493403453913, 17250524577747091030, 2315376314333653245, 142024984008484689}, + }, + }, + { + { + {7237168574323016859, 17908810107504968137, 16225708127838178121, 11127095986977103648}, + {9346291308317410251, 7381283458277047010, 15168602815371846943, 9193719743691734294}, + }, + { + {9607254959726458411, 16837156817186931862, 16178143308706847393, 10970721795101931539}, + {10840376278605273092, 8298765077094727469, 15520543037910966843, 11484620381947762562}, + }, + { + {17395070963094117711, 7608132718922490881, 6531178971071758016, 1302814667007331361}, + {4002629363862769670, 14649492495298089937, 6868174210142585697, 15456170652716048683}, + }, + { + {3688308493559609536, 5123828159813683938, 6245436817220183971, 13062234263274605325}, + {1313395302496832996, 4961840797708687855, 4990192311341859196, 5283131006216350959}, + }, + { + {16952735659396950704, 1249482796824289329, 17859504101404809981, 13260403650830168625}, + {1583343855370236084, 11389120333403185826, 13676599385745755008, 5066667130137739346}, + }, + { + {4799264864906918301, 18347145714884655971, 17034125441088681346, 11828378178487279470}, + {1759038296522081901, 9582407833575609381, 4195817009050503354, 12618256395967210055}, + }, + { + {6486755100213398364, 5270923715575268322, 9268255346880651103, 3147724493117082267}, + {16710318779269985633, 1240462642985509644, 2400811796254219369, 13670743068809614358}, + }, + { + {11437779990773246594, 13609113239383378152, 31268927496646090, 11618772705165035208}, + {3078024460365036167, 12138983306908962712, 4779157919015181380, 11901698850260672002}, + }, + { + {14642787507945832432, 16258081639927585935, 2560321462542164242, 16286882196975458174}, + {4328159372518768969, 14313553865397841147, 13769372656320240568, 8950675126435331579}, + }, + { + {1309709344837422378, 18403288028608342631, 17102350491414677993, 1133523394849437315}, + {12526496222782003755, 5447309058259018864, 17311120581405946631, 3760058661125144368}, + }, + { + {17891474172606596407, 320094264574086461, 93927075222964142, 14355817838636249140}, + {1777882427773785068, 8237021421587560510, 11520559469641852991, 10567910693910023157}, + }, + { + {9164300764173563614, 12322279811717869943, 2768902015676238485, 7761799112151133995}, + {5740162933856370894, 8043946608495226840, 8923704438836381869, 15189322655373943849}, + }, + { + {12046275966378825708, 5909386969214935556, 1201990704907881028, 12128549009950617306}, + {10773478878317625320, 4554854625564648958, 14029736945871573056, 1353247251064221090}, + }, + { + {11909123603272307101, 5517949035179831783, 3295386484950432959, 5605137795524476293}, + {10718654547602473221, 4984952409581272095, 883267724006996723, 17328431094026829348}, + }, + { + {13671210467347025770, 9980617617519781731, 8339868735163579231, 2150724314757661915}, + {8571153021065445899, 9146903697769397191, 9122246102814640373, 7744779513085605450}, + }, + }, + { + { + {9508384588323002196, 4786531415304518048, 2690306308552249535, 12208815515689370850}, + {5145548243685871201, 1536915039528215765, 709289946127949333, 7152734178531880864}, + }, + { + {9627905753364576437, 12776456422166281355, 2851899644189834214, 16998174196920379994}, + {9001602524188761177, 8960294999163663712, 6580949973363012183, 7568306074815116797}, + }, + { + {7686633626025788546, 8110394872630496906, 8482210436161892079, 16882855163559885891}, + {1154081680627148904, 12804224766760790394, 1850455828762691082, 14191115350906359627}, + }, + { + {13345381996769253014, 6278048669175242345, 15990349685835870151, 16358261962292186792}, + {8505261070637963021, 9396725065098564446, 15331953351049782155, 16194796339208321205}, + }, + { + {15505898598362934929, 16825210854979603981, 4697782190623959274, 9370503401456774242}, + {12874840227707962403, 6119547445810629810, 9764164009057494220, 5416853666956021065}, + }, + { + {7699498684510298360, 16542285627069734869, 200751785530104649, 6985944962584804095}, + {7365545959109847649, 14865387755379324112, 4167319688751668987, 12162483513847343974}, + }, + { + {1039980316046001816, 7207503221801597145, 10591680158322288825, 11266400320575557454}, + {10706275395641440317, 9288394947884616208, 10167533985006762418, 1456585988309878747}, + }, + { + {7076257175157660597, 13221730879315432464, 4499548735964119085, 7559253754663705944}, + {10196808438730350168, 2391718471837563931, 914409564589897387, 6649744842278078706}, + }, + { + {10039057354622246685, 7195562849416781100, 17696866082062058984, 3668253949076972503}, + {3291647709604288622, 14581068695089559804, 10104544037456163379, 5446494334499941155}, + }, + { + {11083442423555675697, 16463352501129765262, 8326106600927169880, 14461723217830443766}, + {8960039240507947123, 6112452535158412156, 16298251376476091126, 5185774007776019173}, + }, + { + {5801222283949474418, 13946418525037992779, 2275515160040674505, 3244981365190546382}, + {9460698310301428534, 14807942233170768102, 6180104492182570514, 4695926909096500015}, + }, + { + {5502356275170104522, 12750322860129485966, 9581277511584938955, 3872282844937972630}, + {13668854758739140874, 15020438121087800965, 4581631138384430657, 13296613956093963588}, + }, + { + {7394309355461523862, 5374161350639568117, 2763783634295242959, 10215168014269656712}, + {10862202275249464165, 16813773246956503013, 4644566761082532589, 15300517379307655907}, + }, + { + {10894319502247195436, 16018449015752583379, 7936971022695592164, 8273950599391165937}, + {1130484969598457981, 10652972605389048300, 5964985167476071140, 1178111465674979168}, + }, + { + {3215460690308212256, 13044009109542950831, 1248575312568743704, 5805472854961471970}, + {16935262056111009166, 14323719510498371522, 4137201278518680629, 9262447671880633672}, + }, + }, + { + { + {10228366644420455452, 12084265406352277347, 10265869676493821892, 3560143954870272139}, + {14368775225608592689, 13173522067191372913, 3592475039513249949, 11243554718624931135}, + }, + { + {6543255501112359319, 6063422531520498671, 17228726254778244409, 7570754775709645369}, + {18222396492501523182, 14903937974816691813, 1216646642383641441, 7602781158453005929}, + }, + { + {14568782576170814716, 17582848432122737506, 1079387064102681806, 17278567874821675408}, + {3094302191119669899, 3730448048895347901, 3508894590334961422, 14091660942919228106}, + }, + { + {13329033749048978810, 4765695903433858377, 4452680451529163940, 5638854187414651620}, + {7897503022043776206, 17187635538005569019, 17766753195497526986, 13201529234556380285}, + }, + { + {8934119620399766972, 4226481091885914732, 16000709195004445297, 14687868180928846933}, + {16269913392757896907, 18294005838441325342, 17625669613551023126, 10864307042201644469}, + }, + { + {14722530431277419104, 12333728409662476827, 4162946257347548625, 7052045338975163666}, + {16435875989376103923, 527141841571514699, 8480360258792897962, 4322786951393806781}, + }, + { + {14380803034817149259, 11042134597430846555, 9992762805140200547, 9895143575678511242}, + {3228768306004664915, 16153114680219541243, 12036181641761325912, 491369524302296324}, + }, + { + {12320933424684960076, 8906954611339502145, 16931708732547376267, 6446897311644431583}, + {13749563256713530203, 11522599770043814384, 14455556215959342791, 9022955938835504923}, + }, + { + {8738648866901281761, 4688741093801776285, 17069682640810525423, 7158141773766072053}, + {11460933790638879246, 687134766504463570, 7796313120876518884, 11150451731319135164}, + }, + { + {13652684811535265600, 8494726433844453583, 15999979552047212740, 16433235792902853942}, + {13641303900302396790, 418630713805776951, 13090797093697365883, 6529658430803752768}, + }, + { + {3944614182924380177, 9542495129087581473, 6699683662731923419, 5017219913619823514}, + {17045736494588140273, 3578045824537114332, 15234910011456151711, 4392310298224006475}, + }, + { + {13050963220563520130, 16311879939705207639, 12461297624582251388, 9677731599265769222}, + {5160679975931966230, 3218707041599533629, 17098083534384492023, 2330141721984719029}, + }, + { + {8245975647138927146, 11496799090887525271, 1709462103065191917, 18401529677683893204}, + {13971543411749700717, 15107687167816783802, 7171906080161032790, 2549191081579169610}, + }, + { + {17251496610557148115, 13056982918233222110, 16321077587645226911, 15873643227887663856}, + {7790198561388957118, 9539520576306975575, 15234893276112958324, 12999697377068360422}, + }, + { + {16169560456946825943, 18091964243071526492, 4341876361632902705, 7532668331381251135}, + {15346381760818990405, 18301333564088079147, 6565096728885044125, 2494845330727350075}, + }, + }, + { + { + {16319476863352440541, 10283930715856640343, 17675054544532098447, 11261132162985242084}, + {13712716897981761400, 2681907143459288706, 6930256922080133347, 1445069157579547822}, + }, + { + {16928574868467385886, 166417019993787654, 5882811520342817815, 14106304179344008065}, + {3747123724781081800, 197109533566874475, 14303280595714789450, 15457633026018307066}, + }, + { + {10773597511592584859, 12552868588431074640, 13500771767160426835, 8002499270056378440}, + {13792839099998553174, 12949371255843262119, 1713974340992291550, 16150173130483658061}, + }, + { + {14745984256428057001, 9333707338036985191, 15365925315303462, 11789129028059619744}, + {7873100217437235208, 5289763977161829145, 17731215200358323788, 8876377479309635703}, + }, + { + {265950821974454804, 5047467530470542278, 17523044368516619801, 10054436503372765176}, + {10321185867287373431, 1212061937729015591, 15311258419138633926, 11236518538207084768}, + }, + { + {10904693956407098222, 9013418755007070130, 15510005599846320670, 995378633446250700}, + {12234095025518917836, 6689106237771514188, 2809193993744369126, 548124799387888260}, + }, + { + {267350765778774337, 2853877351938464055, 3677119082593358544, 7685335121077514739}, + {6491980094762370981, 1384870316654548002, 10568872345228996498, 241629538659623878}, + }, + { + {5839400175629113441, 5238299193248381245, 16787876416022887315, 6051613843621920008}, + {9219569873668974552, 5916753090530931032, 13390630214643423749, 3265335490455191268}, + }, + { + {1507475744849985303, 2597075068965622770, 14968669113917266926, 597606442423659891}, + {44293923912414886, 3832651144752540816, 17438860065613195810, 782112340603343331}, + }, + { + {9050896199196733903, 6427608033444590004, 13787696679536621857, 9682087046920409188}, + {4519093754155995429, 13564098392055667371, 10512507082236058799, 5289934424008191746}, + }, + { + {3477191607403300916, 18283244229745029067, 8462159792484018099, 3056576498976014760}, + {7259283167233712785, 12530251965039903998, 10232104933720625111, 14190745998092156987}, + }, + { + {15759362035410895911, 16075598437961371531, 4651513528876405575, 7694151626503869614}, + {14468862724637972284, 1838601521755586245, 4168957446435305706, 8694905613027663664}, + }, + { + {14825552838983151434, 8639609968952840931, 15547914584352392016, 2313507499500708287}, + {6902543375698033684, 9987468886016348918, 9068175779860656258, 6899641689193116297}, + }, + { + {7449110402827616954, 5689206471789540768, 12722069021950813669, 16017131401246233663}, + {2240977975275954837, 4794705713606614946, 5734937900461809607, 118285984764445639}, + }, + { + {13917685647531721740, 2432096911145792817, 17733637484624159521, 3848601825403209903}, + {8192433211051054683, 17388066421914150767, 14336306308847565282, 7501625553608785022}, + }, + }, + { + { + {9194523390605857831, 2335161171394626054, 12290490336543843159, 12464172604156286188}, + {15842196578033029974, 9081285134201585379, 6123406461662038242, 5504260508195082396}, + }, + { + {9599159247384506427, 13011559959971256245, 6331802547989957841, 2642320882309956905}, + {9140255367820630480, 6883541786494880896, 9560822438260750771, 9273862677291701694}, + }, + { + {12578940088863451089, 4698579870843180556, 13634180401794570924, 15763130743395284022}, + {7444441842547931942, 4944622454458561492, 9589156490791486440, 14762328488235724618}, + }, + { + {6185067974942684922, 6452325785873503452, 15247257292915812252, 3689324664200339196}, + {3264129576054154137, 14977721630214750038, 10720913377937894256, 15914487080763816378}, + }, + { + {8926126498606164569, 12956394005759769716, 16902149488499586013, 7841840983349613625}, + {10587053251468526108, 696362153501209498, 9784750880259098186, 1207696323194229080}, + }, + { + {6366297849225708271, 1653728037493780302, 924103820671018926, 2050213326049184692}, + {5527413390519421127, 129805527414320490, 11550889572378802302, 15667992622431666977}, + }, + { + {3759028419971240833, 201899490644698259, 16787882148977818573, 3755266958958128460}, + {16997526157701685291, 6920710029293447897, 14077301651040071328, 10880144992445166875}, + }, + { + {5498621600689515064, 11498885804037952971, 12697073118321478539, 13999008478737234463}, + {4324885099420360642, 14021182496192299466, 10763088992583373843, 12898585157666243299}, + }, + { + {9367059860785010847, 15787147891143727655, 2519720658767337732, 11593809545681651942}, + {11966083811953753216, 12761111316475086277, 5681625861426437827, 15920587591610358813}, + }, + { + {390729441391219522, 16780558466241830343, 1374488446906327562, 10865131913700232628}, + {10115076211715532468, 18184016780675566832, 8365356477197603014, 672096097598251136}, + }, + { + {2393424067712509928, 16879911507754196299, 6441307574161100589, 2818743579517374412}, + {7083174841445248189, 3410683030590349702, 14697584027599531676, 8328975445543175696}, + }, + { + {11622402383521841588, 18271726976204770291, 4805501248621435402, 13483122453682180759}, + {9288143526654965614, 4688427612851085031, 3280806057528512375, 2249349779106893174}, + }, + { + {6807440366000180651, 16399452121226315247, 5098169947999459087, 3558234272787006753}, + {1792969085845015294, 5524357634740353242, 9429244535996516945, 3937357214017147760}, + }, + { + {15504868609044485967, 6752328153557303622, 3778610801922734369, 13830970685441980645}, + {8715733351182855585, 13970559751738714496, 11410776131378170826, 5487441016062951646}, + }, + { + {13162254303511925286, 1500183854026947752, 6344593292969383689, 13968537166293685529}, + {3100593991852309751, 464141462036312207, 5107705843278430088, 1965835506583809167}, + }, + }, + { + { + {12081034000518110752, 2773740877021737013, 6429475399936543899, 6804412599792308979}, + {16082860502313571182, 10013838454082912732, 7176778953927883654, 8065751639278576331}, + }, + { + {17741525051518363144, 1374267330336191942, 4677891169679898540, 9639823611685431337}, + {5482431056894095950, 6629146695374718376, 3884574854221819712, 13266790928096813258}, + }, + { + {17505459029376928465, 14087658194607915364, 12240552390931686885, 1809009366037859941}, + {9468395484396723291, 9446052656478984520, 3720796795453397330, 18035355127900871187}, + }, + { + {18221138344920380175, 16761112742545021198, 14421639991115588619, 9419167563943683547}, + {6237248361283446238, 889754338720059891, 2289880386545166424, 4280148734121099084}, + }, + { + {5259165122317589354, 6306061166879114159, 2622163270351284906, 15212813592118086979}, + {11497359168652342849, 7085380391293263482, 11799059272489792659, 4912160901181298022}, + }, + { + {10512473611770099290, 11735037909076331019, 2922606398008539984, 2599799834378751770}, + {10226702495047936424, 6109026252412854338, 15572556822827169237, 11993701786788749663}, + }, + { + {5106897453764491321, 10540479232768400094, 3938246597140945859, 13156157265138481529}, + {4932443191001849637, 11374218582626530502, 2907557293167002437, 6807344711257391317}, + }, + { + {3993197157612782947, 14810882170056329119, 3476738916713041107, 1512933700383846542}, + {17820889751141311776, 9132720567660500233, 17598924894608972696, 9704537908665702455}, + }, + { + {12121941964759747109, 161674837074510172, 2599887134944602725, 10582301831176576187}, + {17746858667522793487, 10735346620578591475, 90382511151212475, 8756617880518165297}, + }, + { + {13269854730742674802, 16128423099443070808, 3557230428644480193, 9637953317416090984}, + {6295039911768726240, 7019479692290635445, 11667616931857432446, 7159479331923350611}, + }, + { + {14416651741118525418, 10180867452897498870, 5073925566889872021, 17399294023945814271}, + {2042657564518230341, 3364886656428812718, 6324877312192616572, 12778324589036538810}, + }, + { + {10574237360751578123, 5116798422805306054, 14491722292795290218, 10799156134310323684}, + {12689926633011134844, 2658342468671191169, 15293758403109373386, 16248058473163364262}, + }, + { + {17412396133163580666, 6474892296180387693, 3334160446575187305, 12749216946172573968}, + {18160154520597666127, 8818156595950176943, 16077267238396508593, 12651459389529897136}, + }, + { + {7837268594975894598, 3733413917041538879, 9408433334074005916, 9807113299110084489}, + {673053561909802023, 10235823672366472244, 9197803481286702511, 5670973022205283920}, + }, + { + {4435804333677545569, 12530066828083700918, 14652119799285589695, 7610189145859517535}, + {16049951379406478991, 1895939661259683634, 10886955028200106760, 10575752015672416378}, + }, + }, + { + { + {7454214833719424418, 2128900810399984335, 8254953962723841408, 5341529923812819418}, + {11486532916552139238, 4528331821405917357, 5048485034448492541, 4189495710753944825}, + }, + { + {9223539587116638677, 879142711399260546, 2878829560233905572, 13081522393987952773}, + {3067261963348061547, 16008150780594711643, 5466468631453287640, 16659147898971349582}, + }, + { + {8047766502132608624, 8715815570878148809, 9093649079884580138, 3437267783531715968}, + {17562225708466062266, 3512667182749067601, 9223059995161026858, 1366690634827047376}, + }, + { + {17929132376737482163, 5565926714491294456, 5252303555134107501, 8169975563698132305}, + {1829326230943509100, 13780918661853274468, 17736665596871232627, 4246797342334307384}, + }, + { + {5113556452592134569, 7304867793218750141, 6016631926489320290, 16471860203547627727}, + {3444471410714850041, 16571738096215232488, 2003912224952639024, 4203884000388032492}, + }, + { + {16858425223672505353, 3192567884201479579, 1688923188642613263, 4159042130811153987}, + {14900413503869744297, 7521485042788722327, 14038093805562042641, 14713051866364662650}, + }, + { + {3738774192924465076, 14037618828827556145, 12882915396530927286, 10882862194263941815}, + {13115222579444494605, 18244214260845794346, 17217867059738274194, 2458870331386500577}, + }, + { + {8768788172344064509, 2761897497254272960, 1400167175024837359, 2591319596670212133}, + {1499652044223484974, 6820326453941021707, 9701009499879906773, 6897435972338565418}, + }, + { + {8314355711464256163, 8435944020779763783, 1814803522962187872, 1875253356755380905}, + {8214588085484192137, 18062045700553127821, 6649947905482043494, 3119726140944397531}, + }, + { + {11881571666857493523, 6300786026612414187, 4928573492087752294, 18343550313462089203}, + {6770642120472453960, 11296815027803718740, 17312916793783562794, 13028515123652649961}, + }, + { + {583508939637547757, 3195115082527873085, 8497784022800549923, 15135719419829981016}, + {1180291993378114150, 5447281494912347899, 4710517655176242215, 606503081693490000}, + }, + { + {17732293765863716052, 853971165248416821, 2022886284923413326, 7522564752651732633}, + {1417954193520965954, 5046659528429172066, 11426939225844711305, 17687206690616539318}, + }, + { + {6518552374736169438, 7940416740434530770, 15228615103587329007, 10662504584317997513}, + {18370800756791469891, 5564085264882124489, 51043856061444814, 11996026931884728651}, + }, + { + {7009195269496826002, 18330778751427846129, 7903886241001925539, 8198930484643879628}, + {5453546027419466587, 10378692433982210944, 2242412603379120569, 14762161396393277464}, + }, + { + {6146718865488327808, 8559779132928137805, 14001994895150170346, 9915701789711858841}, + {17119408219089522083, 4345363585985782988, 7559492126634131602, 17074565022279033371}, + }, + }, + { + { + {9262509587234749312, 6377906816499461739, 15415592259881792841, 6113140067088447267}, + {17505803833889144731, 3922849788840338823, 6180172597177093790, 7272741317181956640}, + }, + { + {15620168851912893400, 13762314693487747007, 13577625382054330775, 4116976667540664996}, + {712200332640207605, 9098568002202933512, 8905476951567380032, 7075673514150314660}, + }, + { + {7724870937269356050, 12054277107553403808, 1881284905431205309, 14429595888039183277}, + {4176419490283315185, 803567059653412279, 12138878637145159139, 9651152331113389250}, + }, + { + {15811459837282651008, 4038049993244767161, 9054218236388056577, 10807376403937048775}, + {11113869110590438959, 10336442539492421506, 9228056645601479672, 2983388754829658480}, + }, + { + {5272549712777700740, 3890998652469537324, 2338530655383446899, 13889100994494825258}, + {2605827345546331653, 1946537408424111099, 5960128674616374312, 2996461229050766944}, + }, + { + {9235630643187100528, 7874836741106774683, 1509645736063284557, 1291934408179243533}, + {2170879231846765016, 18243888082459973651, 266993053446290594, 4551583084211481457}, + }, + { + {7680050744092380106, 10728235076013009138, 5020205498410121740, 8174117988374987111}, + {15823303896577313648, 6268651341788131847, 16646239256422284672, 7277830349937654337}, + }, + { + {7189376137127712298, 9147574701720272724, 3983921661449444789, 12479790317447783959}, + {13221020976679959405, 13001868979553711359, 17918176319017234744, 18030393246529651080}, + }, + { + {1277346094474678251, 9498303380775859142, 5384923668452161486, 1780647986160100011}, + {8642790494747200341, 9734232043260261391, 5142834828615817260, 13851307413031336094}, + }, + { + {13856162196947802633, 8991033151317963811, 9758143338284799726, 16669930361261935141}, + {2769693485089420097, 14961618614592883242, 6027973048684521312, 339045855685213514}, + }, + { + {4705473345956039571, 17384553086897199761, 4490030246274451948, 1509996255726148943}, + {13542663230247432557, 15148026535112827520, 10014941605271261089, 5488071105468657298}, + }, + { + {13903368497828271814, 8050546449078305498, 6932373216915935575, 16010012759059004304}, + {15451708272653450375, 211711129247219149, 10435723642185827585, 17790507800712341232}, + }, + { + {11196283625212661460, 11223173364796389182, 15927254202510526683, 15939111530538795368}, + {3486548927974609940, 8233744837082586587, 7138041412908951164, 12863368836600604627}, + }, + { + {587498550288996803, 9937849083717302378, 17460580580397185843, 16850270092759302710}, + {8661654791709545973, 2350686583325065432, 14816283856648791595, 13021196930055398267}, + }, + { + {9641099975481205848, 5936405208377074167, 16926315209235053832, 9612898534540818137}, + {17782980290875306043, 4118599702370009503, 5379494204096737612, 10529123509904334042}, + }, + }, + } + + @(private,rodata) + Gen_Multiply_Table_p256r1_lo := [32][15]Affine_Point_p256r1 { + { + { + {17511864284462479051, 4391315454785363822, 16633389246499252566, 4290325975494843430}, + {15912670649662225191, 14172733821603328367, 12709802627494541709, 9648238681838878635}, + }, + { + {12840624483048662115, 13614226123606379619, 15087571995173849344, 1395488309690794621}, + {7173958427217959878, 1198561064176820332, 16821886260165681626, 10019479169661217935}, + }, + { + {9901328250515532535, 12796305315632203942, 10819069447660403847, 12542238242508661240}, + {17077777737462854238, 4364294351375777648, 8335244153165894685, 8863541604979427311}, + }, + { + {11029520456752683158, 2297291237551781454, 7934683676555855479, 1563954733146546128}, + {2252805128528536255, 10523375695822939112, 4598652721256818062, 17493379105069761435}, + }, + { + {2747551692916263132, 3151123035150683281, 13938314333309683791, 11970864255483579560}, + {7894236725861110998, 10515613623232567716, 10445557830757066839, 11155097727742050955}, + }, + { + {9569762631377921701, 10341967309273270300, 4697570564829842013, 16684762125903667303}, + {5281929071085172097, 13027961546412671127, 18398764602992176314, 3872796039504642974}, + }, + { + {5035609627965208105, 6338722048255995169, 11594969687968475335, 5639340633771742838}, + {6928934109570365590, 11589609913085167707, 18353534295019770247, 6879412911232288750}, + }, + { + {10042008593756684008, 6713471518385846030, 10961845838926538977, 855334359173719954}, + {7598642325962297361, 18006511265377032901, 6844179774752820363, 248341098560552116}, + }, + { + {12797853895127133352, 17314687680589848148, 4801569699821499927, 9711604734594547217}, + {8212610645535363590, 17221681508724305642, 11398663136094709935, 14918164175449979798}, + }, + { + {14940688064094792027, 10874356086032303420, 9942334156288812894, 18314945846365913248}, + {2026773265909278528, 13079907189666226787, 2413436844382479762, 17172916412715413729}, + }, + { + {6906211734178583215, 2568977141255648055, 12122130143181371713, 828440041422552532}, + {9361946962651414191, 8982763378443381215, 13842936470438971226, 14726899303190381422}, + }, + { + {15233793159839573220, 7091365221489488397, 7026505041428577564, 7614138360854053029}, + {5906758210005848219, 18266182645583974519, 15465977441750183309, 15365799046100584430}, + }, + { + {5523310814149808824, 11103439607538154330, 10292039577546071548, 1169663949743807030}, + {902203905701917473, 12346725749938989079, 17633270407605278415, 6960688675023695455}, + }, + { + {4505161139988645144, 10689463780805884897, 9379083335142738351, 1333253488693735633}, + {16044931735888519844, 16145584549427855743, 15405407720239538978, 11239573776554839202}, + }, + { + {6975554318981968975, 15982286720404911512, 1685931425716796252, 17715405440768877495}, + {4827607732096558544, 6375626601740689475, 3502039151843227915, 12085565714635174559}, + }, + }, + { + { + {1190044221726873109, 732025666411072563, 7781096808432277694, 13079879637655900365}, + {9048680577986693793, 12528346194104542124, 10575369576322629835, 14068913038053465964}, + }, + { + {3297775431071502652, 7947266993949467566, 6161673381820779563, 10604626734847205996}, + {17669018066064502925, 2386071939136502354, 1076023928806956187, 16075459682742916440}, + }, + { + {12387028018538599950, 5791681577936683396, 7536922194386052138, 15377770247350254336}, + {6564316170002440575, 10629371267149545956, 16125760269901494382, 16051398044897962024}, + }, + { + {6237354803374899565, 1782400080026955610, 16115027077529639342, 17907259814836219524}, + {13179234383592426160, 7302978467158243198, 13607720993463749225, 6693531817169120736}, + }, + { + {9659467198848065929, 13765104107473534739, 820057324758632016, 16604163594878267405}, + {15321524555426147294, 14524167419333362957, 157291234996957911, 3689488130722730671}, + }, + { + {13896531645245568605, 13598412639648980920, 3875086557856143664, 9242105512956135595}, + {17410265178284161091, 14904754836127450463, 2354327747158525902, 3858493849578874654}, + }, + { + {17288438225198818690, 15275190140700748774, 14532856272428522409, 2192294551011758591}, + {4275966798014984695, 13252812474545742114, 8604705074440591847, 504054699541924162}, + }, + { + {3623027910997185067, 15957466839356832933, 3504133700071704955, 4135728439139397021}, + {1160600455691338871, 4431928072859292239, 1542956305318065546, 14109181184369694855}, + }, + { + {9135041378474229537, 15626265487594878380, 2645257479784082878, 8105679948445763432}, + {8579715781576202730, 13437359533149316300, 4344754720520585005, 13326372852934103673}, + }, + { + {11341622086474305983, 17104958945811183278, 8154944722722765678, 6696975609844549775}, + {10895966360082878017, 2277686037575837054, 12236842881540344526, 2086470279064067791}, + }, + { + {2942668817124399651, 11439025398519255779, 17477264434671471242, 9606507094132585461}, + {1771475584689465869, 10791261379080046759, 12901998265727968789, 16423426725595035468}, + }, + { + {555419805011031621, 13715683285513290290, 15526654591995532751, 7023761423093873354}, + {15093366433178982304, 8625749648874372840, 6412297471587129206, 12161114204724955762}, + }, + { + {9362623422820895267, 6491356159483508885, 8543224082493101588, 17290929683278258587}, + {17348088672546490894, 3323350644823701753, 398525379151271104, 17794417664139368677}, + }, + { + {5880914635028486784, 2898124605786107494, 7953506026198179840, 2189477357380899574}, + {11207122442953694293, 9288539232660208671, 13527697625010979453, 448462453367651162}, + }, + { + {11262205719433170585, 7539606872920196479, 492385789142086954, 16036594120332851267}, + {8084547797138041354, 10063336189771527714, 2484395715469739911, 4879298610504146231}, + }, + }, + { + { + {10457697409306668434, 7830477435299250296, 7772379952622394912, 6109610138112185532}, + {4382803614711332911, 286231563340803504, 14408860285425706036, 9445290615796219321}, + }, + { + {8838210194055479741, 16190279688839291456, 16520121358582757556, 16768959728701970634}, + {17279896910204983538, 3582816187015369256, 372137484481226748, 12972230207718993241}, + }, + { + {5372953569411270487, 17808033035436856194, 18122397266105109983, 7100719381161799491}, + {14789750485957107776, 7797117101197801156, 3512936690589352328, 17020065099624467120}, + }, + { + {11480031272463364121, 2525856087688686375, 5875255653057452580, 5606696614467440464}, + {12094715534218447962, 6173479337351577758, 18244015404482482803, 13199349349511499695}, + }, + { + {15137716704658930971, 10986987873306909694, 1939043496821343401, 831824210330752494}, + {1056638569496361761, 1714583153436391847, 5183439003162975519, 1665087783666164342}, + }, + { + {8618628902870211609, 18064648431799903596, 7274877928823092285, 5660734703123876155}, + {17178150811821260605, 5485275535084805985, 12607767610318589165, 2215859519135800862}, + }, + { + {14525253431314563485, 18061438239992695424, 3753059877845742067, 6434164734885086330}, + {7925955539869645215, 5236273722884803492, 17135463959633855728, 1885217581414238490}, + }, + { + {6097225965006328457, 2630336000831717722, 7049638698786526134, 4203465038263485233}, + {4677974565964393904, 16044036678123636261, 7266049959100300634, 11339674070148504929}, + }, + { + {8932509163442546090, 15088719838810504543, 16380598316811388529, 11816509227456545305}, + {16117098651837966507, 6506253137957995237, 7842840841723336777, 14854630695614255489}, + }, + { + {13319400996902371533, 7582870533150862327, 3853021819016824068, 1553148791440569506}, + {1383156799113954152, 15192818247458559870, 16096167687117464686, 6356494963887209448}, + }, + { + {16159738883836847557, 12797888767862801410, 14516904553705186948, 13070086184381080434}, + {916885380224317954, 9486576895096666538, 2320292919516422975, 5019772534786350963}, + }, + { + {1979992348876614621, 7494083465935166973, 16035723662722831744, 6820849908885211777}, + {16740735239901023053, 2017530162004533409, 3087262288875984227, 9072904925376793991}, + }, + { + {11716934526135332476, 433379719600995157, 14981324743710487461, 16580162143428931768}, + {17678216037230646787, 2252837520490636634, 15914299694597684738, 15253999728204986937}, + }, + { + {15673599333229961794, 8862902775863712472, 7565222536246787763, 6724910605061440481}, + {5835390808530098179, 9647776340035782792, 1038074137838521743, 3352456378381259564}, + }, + { + {13166325906224116930, 10408481058915151795, 13583679214409957982, 13238337156927685694}, + {16088785436819834700, 15860660615594092228, 6472158593272826810, 15600310172166391652}, + }, + }, + { + { + {16375505785562641226, 4903074653735993511, 10355787845763031761, 3188849033041803587}, + {3145147452182864049, 13878747873108378466, 2798650520315922121, 2325962694441538199}, + }, + { + {11530583608023224967, 15979155166527001287, 592931868138800645, 5361781029549479856}, + {11246418752830406096, 11882251984248471436, 12026389461944629423, 12289077922798223820}, + }, + { + {1328339467113622233, 13374824154992864223, 12057132015324007824, 8507647484414695512}, + {9286016370798146986, 9083798709648036612, 4312959727577073260, 3732271624824420608}, + }, + { + {14129872794455315922, 16354810591314135702, 3177417010197743958, 16494351130927698692}, + {16557765056328447818, 3139394196704738651, 16891813998271303650, 7374470997276173905}, + }, + { + {1547814412223404746, 14194709348405912167, 15771028929623393801, 10945048172868684389}, + {11234483878611528405, 9542605377580701681, 4555391547268120796, 14916872217451960022}, + }, + { + {15490131882364039637, 5140304620645573547, 9403655757498826823, 9824850954989176893}, + {6366139388903157264, 1981838834216345294, 14659870286877979556, 12091578124492612524}, + }, + { + {6832171775190531128, 7903951882621813138, 13717573220828409267, 15400575122727850054}, + {6101307565293576434, 17226772767105983314, 3485283905347036760, 18439321272895583847}, + }, + { + {6289130721434350290, 16129337673129720846, 6648351866142453445, 7705983837166554199}, + {8120136556582544814, 7924417299222764443, 7821995671300500892, 17697662726179084739}, + }, + { + {6669506511185916061, 7036555931205961476, 15471324228012955656, 1075869467462424743}, + {14834182808856841386, 9481869408708862398, 193651363902981365, 3496053494343565969}, + }, + { + {15198290782478916101, 16205293865829644684, 2104596565474767471, 7783918193658109501}, + {1567469099169331732, 11324634977690198924, 1374141643017900909, 18368642394438425630}, + }, + { + {13389638006727712302, 17518324493263447682, 13178832200681259657, 8955667391164524441}, + {9331759525815425703, 12920722511913101049, 15807602761711044426, 17873219821625976662}, + }, + { + {12103811390374960600, 2801185238127939998, 16289223959107648345, 17243660994858386104}, + {14818957729322960498, 10018491794651971206, 5502065678180783560, 4158378425043433526}, + }, + { + {10278921174996593635, 4630624563386647486, 11179643216044347020, 8701826069861381281}, + {5839989039471676569, 3060138177923841885, 11279648082143612852, 15207786733412131883}, + }, + { + {18277950978951138342, 2577918906618404946, 11684553042740786163, 3082582313241836872}, + {5222056779189126973, 7794579876203167869, 8527673475629739407, 9851790541007784515}, + }, + { + {671618501514350673, 3455246317052893537, 18161533457452722900, 8968434886308785175}, + {8445049055511813064, 16897132794064300993, 14420937999674600470, 11110627336577683437}, + }, + }, + { + { + {11535283160083833975, 15102917952496589829, 12909095696891909745, 4611119212602854744}, + {4195756524232932570, 3754603965149529000, 11539276962358607816, 4401424391553230481}, + }, + { + {6842993463058627120, 2708745114617181146, 3832382691810282630, 10333834458057320812}, + {15028197197004077388, 7681293343255119354, 16227537691626587485, 6703363869832495607}, + }, + { + {17567108285065737529, 8693245930330183070, 4025672038042952121, 3491067119247522844}, + {2100799837993193702, 9579542950705774054, 5091525285265581997, 1806757015709820088}, + }, + { + {7757354840118131559, 16227348978414023262, 5800861674805516343, 16486235803248700961}, + {15646700163023677309, 504258765210816549, 13724147899924699697, 13588899538317277096}, + }, + { + {15895596198730294923, 12513494396374459899, 13552575153453342654, 11312160635199213507}, + {12446618129881485796, 11286186116805515445, 1584191291800429567, 10188741008566636830}, + }, + { + {10157626021970320469, 6580688164585715207, 17158416694471177787, 2873484006255074946}, + {14852216457444863041, 7463041347566136496, 2190030775722958628, 1116223035803602728}, + }, + { + {8598875756176012541, 2146658618778432566, 17575736667490551813, 3602654209723135985}, + {7223347129734689099, 7256921024940026570, 12249118963297692963, 18168532365040819099}, + }, + { + {7585174044375463988, 2491923406404093282, 9355733262044036112, 11484079611349577325}, + {13145030009254943291, 1234932884591406048, 479845670619308618, 87735010308690865}, + }, + { + {17307641427543377277, 5862898330718319545, 485176909118483750, 9845223919324484076}, + {4293549583740204024, 12765124043303931186, 17870894781132657382, 6508172378961793849}, + }, + { + {14234156373312856400, 16210939788814051708, 6478880037923038392, 10435512103812909561}, + {18142844321802359753, 3243996803126554757, 395603619159523019, 10213589535656704607}, + }, + { + {13256075137060741204, 991285459654295161, 7857174835799942102, 16201105040554625727}, + {18398612085349994216, 4512860776717176840, 3521452275695011919, 10622137733045360311}, + }, + { + {14993897771652736376, 3320388672992783302, 18421556740970114213, 7438967127794745135}, + {15048397725789819354, 12721899159423777001, 1135125102123667189, 6637485660805148630}, + }, + { + {205606553319362431, 15484041062449893984, 12896720585684759529, 16675624014916513672}, + {7579112430564108390, 4602460356900251082, 2677787525524280838, 16723483619407414479}, + }, + { + {17981939084373319995, 3989926231875116241, 15342509934701840045, 12999252495311233519}, + {15389919024942778009, 6136335679373143315, 4117381415379544275, 13342256463740646775}, + }, + { + {7622769999043907199, 15227992053145045634, 2719412067263856950, 17811161335980566241}, + {15036003689029442301, 4919601685231030712, 6756893600905532338, 18029567067112075531}, + }, + }, + { + { + {8492025373682814159, 9341562763134230960, 10104358220305514878, 17545404790574939459}, + {15737064134098795026, 3880597485411313924, 388663918823974597, 15032915458906101183}, + }, + { + {9452334891928331309, 15207477416486363718, 8081596400773698461, 7528187414539292243}, + {4773782664413845594, 9435822414884353799, 2722451711480791323, 13642248100035410269}, + }, + { + {14202843175914986568, 9421566354325954710, 8667368258699634314, 8733557788892402517}, + {331451278037425751, 1109013653863287548, 8802742738207038150, 4667769857523050796}, + }, + { + {16570512961992288509, 15784840936011612960, 17797638261217375128, 10589124475671334830}, + {16848440972121709899, 697679021479737566, 1456738239410270672, 7214966028857473701}, + }, + { + {13782421991242364698, 14661156263311647121, 4726455119103158850, 5026680986111581594}, + {15610213195880130268, 13703306863846075517, 1371700218221235399, 16792392307217237043}, + }, + { + {3250188629442787152, 2728518744775098354, 3140694818026767341, 17566141747707001105}, + {9569291890730505101, 4439949820491175035, 13751802166620923317, 6602549032413906269}, + }, + { + {1067242659333881602, 11852011445832610026, 10644339539182752718, 15519552867360295119}, + {8817864336906465495, 8844034637292547409, 8850766994595652906, 5299330403389585218}, + }, + { + {11434157439953722433, 9090860151661100670, 8407869262026581159, 17882547383849407986}, + {5277257988019769029, 11463853580825342183, 13607489835500075467, 16878800997498950751}, + }, + { + {11526703690786988415, 6919770449526881259, 6713486711636442468, 14697284704991333147}, + {5405738839499060129, 4737011393825878948, 8707677918280383477, 16881185094380241198}, + }, + { + {9056014389564242176, 13179419520216397988, 9815298409700670396, 15302091100015307530}, + {12552178314548371153, 3975519917079954227, 17211203317279781814, 17755252427177154090}, + }, + { + {14056502343958951437, 9570378325961888046, 18335930130582329417, 12188057598786655680}, + {605832426765150582, 15265028749599155713, 4881763628803375168, 425422732543303669}, + }, + { + {16059297404709367406, 8426877510924536482, 15269952608796785555, 6256768900860981984}, + {13142655793714702073, 14566340391957173918, 17147065283704191109, 879106195264399}, + }, + { + {14152733561556558931, 6788431167332998309, 2303657738205239031, 12712406085467592411}, + {1740483284496903693, 7206807366776489586, 13420608648010812358, 9180900918550128115}, + }, + { + {7193311017682954852, 7916342489073401148, 7990830552202175554, 15066065171478273830}, + {15601436495559985484, 11056245839590890541, 15963012082312968312, 7270947051909344657}, + }, + { + {5010740583028703301, 15413348048560455978, 2028314374959411194, 16685660750422250777}, + {14284468905357216559, 13715859397068327775, 400943255937053645, 15390787503961331119}, + }, + }, + { + { + {2707032230021934480, 14943945588296447659, 13333962501998857701, 10603744732015256400}, + {3386903941135274495, 8507451908469049716, 9231176235773710950, 995464562185179329}, + }, + { + {1497127512412966214, 11292269970549257426, 13920714718237672232, 1363993524078475237}, + {3687544717271789391, 14097532154250414203, 8367320351336033564, 11089672460564007700}, + }, + { + {16993953276024768829, 12025590727803527383, 2672535181364381995, 2183111709986676538}, + {14822521615475063339, 10618745739454592027, 9957515072444869664, 4797521918890127374}, + }, + { + {18097777493026370528, 398882723487597643, 10462164796529820357, 7704526739683689547}, + {12438059168025171393, 8163001730991802064, 3319372757738711275, 11518015261707325261}, + }, + { + {7809927122217534998, 6003738786706135597, 16541272992243715653, 11352602417510156921}, + {6070703545889058045, 3742828100079104877, 9416263310824977145, 1406892456840131842}, + }, + { + {4005088727670892586, 10215872293486093012, 7634075494800881158, 7707144163086802537}, + {7085702388211248163, 12168208652772836726, 16347414703478252736, 9386623607672009940}, + }, + { + {16530167766100505402, 14672843572926881623, 10752276706209340624, 6888427606311779724}, + {9060900993058482991, 10439396339124215720, 17640982730425880863, 12916411341252677116}, + }, + { + {11776245660806714247, 18129100488268011560, 15389929343761297429, 14544292652959164154}, + {18063319363114104433, 13433144948667100183, 462314076175867487, 1862686058702915115}, + }, + { + {17306422602774323327, 17272002328208118653, 9314885036861009829, 7485631191912561636}, + {1933835651414138452, 15231897024969540970, 507247317572839552, 10741595984991150047}, + }, + { + {18297797979313130180, 16976628082093243813, 13059060093619519046, 6865085966096869228}, + {15021840537243000183, 17843637254308940381, 13122764022765250336, 12556030904692962295}, + }, + { + {11175787671000337381, 17757097628648374409, 13408571223487217321, 2720103532070247452}, + {3237822932023459208, 10155101091021157316, 13910068101949253623, 648579517754264097}, + }, + { + {16597587101652675879, 3941450686064909756, 17635514250964078220, 13107347044039852240}, + {8910347370050088758, 3114023981351548745, 5209360756412143979, 8990623441581200588}, + }, + { + {7692284195082081732, 15977071788000084350, 3594719301791478282, 16545490512039598136}, + {7629535887569375952, 3241949087900065139, 170526822997903747, 3422990592513330514}, + }, + { + {5473399325468482480, 2511351254139828397, 1124856552206019504, 210074180589003934}, + {9693298849967626723, 16185054013081266938, 16070865229793723400, 734500463998096984}, + }, + { + {4895849847827915947, 15252720925614851036, 5944268852782996266, 8171510665067151601}, + {10594809041696466609, 4377920841124876663, 3816206760439007336, 17150624011379500381}, + }, + }, + { + { + {6266830413981331818, 10890859480409122410, 738708598357264321, 9241173142142102299}, + {9152169484987657321, 12122430118903337055, 14270062735458703743, 13877635605034675649}, + }, + { + {4572419849863661964, 16330741525817240677, 5456771007607263420, 8798510164381810403}, + {16547183593064549865, 11355135595370359779, 17581910791451710925, 11684604415749005488}, + }, + { + {2766130068233451740, 15909689412657372214, 3272828023364980896, 12907534005596438003}, + {7065629942275705493, 10609982651084321649, 17330343421617897811, 1746246157222856918}, + }, + { + {13168953859078137190, 9072500190247791267, 11090199374278127099, 3503847851309060744}, + {14395788825673846582, 15073993563711333791, 12879874391706003251, 15417028700542288171}, + }, + { + {2686132933630431595, 334448852204016400, 5636563341880055087, 3897420469445246068}, + {10569177829735084588, 8244586887721364305, 17973493209847502315, 18083956436923498083}, + }, + { + {15514509130323617046, 9833490355170899102, 12028021566105512521, 6349458533674010018}, + {13470024118569549588, 7867188201997717819, 6110792121234766402, 9917858515766574695}, + }, + { + {8273062939911446888, 1936638151089648185, 44602505720759914, 7839132833110815763}, + {13045756168264521992, 5375972549477973022, 16964151563535745964, 2871770426902555432}, + }, + { + {14164643693563803212, 6386904235704679249, 931435629437735510, 4496152555914735639}, + {820099532545743339, 13419988718062417698, 8948965620484833159, 7238410427920554862}, + }, + { + {4387941928212462673, 8023190031094282215, 12322462122895470016, 17311901330042910195}, + {16445894183838823370, 690424095855074674, 12820742226551488738, 227935274674223825}, + }, + { + {17437729542205914525, 8439533239207225162, 2862942422640746698, 7340866642549630610}, + {6770451500989398335, 17262212260581413381, 2156505157624055602, 12195119268846383898}, + }, + { + {13685370053507732180, 8304030489296890211, 7042719123662732989, 12115154796394040286}, + {10496877583013829980, 8909625177349683785, 5268451666475070682, 8910488385056259560}, + }, + { + {8874918984373509240, 6652428549855789281, 14866714872885601270, 12093494664302554643}, + {10149999253136441007, 1611873554177023520, 10271627298853910516, 15171882630355491729}, + }, + { + {17085353800722834618, 3271271583189511718, 9338466116389304614, 4685545953421459012}, + {5059702655119414343, 201476627889215522, 6388612869673101372, 8357217932305360896}, + }, + { + {1836621694151238424, 11438765101326043062, 5537182303007083642, 2657011195641217678}, + {15370176245454161308, 1478361893117141052, 8729368992402422055, 4807782542738120272}, + }, + { + {5084555197036037383, 500829604818691390, 8128181767026348964, 17895639808733462562}, + {4138748420878083709, 267892430674902987, 8954358455330696651, 1946224964877667668}, + }, + }, + { + { + {17561670470565298976, 9524122142014309347, 12619871254022879995, 4098610542031538614}, + {8338691110372464881, 4378598564044777665, 16435680634249352743, 12067828180476756532}, + }, + { + {12574920924242276218, 18146097977073890534, 18281543194137545725, 4432773597060264867}, + {797962164984225968, 13432184750641235201, 12394976215803938078, 3054137600383896411}, + }, + { + {12910897300898239001, 14116919300756610521, 9737100313909655285, 8792063194563201934}, + {924297264228895146, 975866810375743708, 14953819883516375119, 9992561966868201517}, + }, + { + {18270562314314829224, 17574550722906577917, 15522987576586641271, 4200899284963891561}, + {15719788437321868967, 18390235318178988753, 17371818886753265385, 4583380351670429228}, + }, + { + {11290716045321163897, 423611636875887759, 8716385793549629027, 8029377844845093468}, + {16573848460451650185, 15094868140191104543, 14624483608434776103, 9086586764934160662}, + }, + { + {1320522168839874087, 6395673054871725696, 7793960979093413321, 11402054451286901177}, + {17278080290632229040, 3823680337747309837, 7840042035002848151, 17839593774203285281}, + }, + { + {10024545625018137606, 3780616370895328213, 1516632588067435378, 13846630703933575818}, + {14323905768888574358, 16062987352815864444, 13444338098535013457, 13400662018607341910}, + }, + { + {10102001197913431240, 6211688443233768420, 1986665099237206297, 9248907879269017005}, + {3081890249882755206, 7828527646248386813, 12676034092230326487, 14655968027461080131}, + }, + { + {3763532248936424432, 13507960710132312440, 2003243330622949364, 8723351916784911918}, + {17411870179533482591, 495549359712213584, 6958432541445845486, 7674356092204128350}, + }, + { + {11814337248412299972, 9347461245743305200, 15456560932072269534, 9579754357941936175}, + {2098168907840746456, 2063921976437345588, 9267808714920405578, 6482702408130663270}, + }, + { + {3313415711246730386, 4607422129142883607, 278072683866121896, 830840258180061490}, + {16961959739026004139, 7896385585906900106, 7610238284391475173, 7231671772874233939}, + }, + { + {11464797300361906821, 1444449385286554508, 12433005157477847389, 964895564896662942}, + {8457290958728547067, 7044433897330872257, 12292673928275053405, 13679355097865192207}, + }, + { + {15352304695586484723, 1527883079108513336, 5890042963344522083, 13407971103520766077}, + {12385239629152188662, 315706510218287516, 5361117161753711484, 8824676525356150938}, + }, + { + {4555925933619499493, 14889603365479712329, 15898222225673484215, 878884802170861101}, + {430001626591485427, 881428142547721183, 653855015067704092, 11378990354467312809}, + }, + { + {10219225570653005145, 9205374019534090202, 16828986596058027743, 1089575570166892706}, + {3079144130112884386, 4682944567048139400, 7674497449298779575, 14137535283566239898}, + }, + }, + { + { + {13266892287530449189, 2232961926857263527, 5934654989155432442, 5415975493246016158}, + {17117784386882463158, 3875398271691758986, 15755743581177209843, 11380746535012415659}, + }, + { + {10162459499000477259, 7534168794800651527, 6320985751131807192, 9263840233901040421}, + {12178625283764017250, 13143797113231152006, 13089053551699608219, 13480464010111258056}, + }, + { + {11426681347395118622, 17135867298562042628, 10870734720453621112, 13803364322975322217}, + {9740527283062276630, 13765238480893165263, 4792349632705804116, 18359029140065847048}, + }, + { + {1420251412241033168, 6449255753238336368, 7468624722117319576, 5716072259994197219}, + {8165015263320602150, 4757529151848960259, 2040364517493350115, 11069642333484542749}, + }, + { + {9434687670958330812, 4808705744496679962, 13910334628239183613, 2628594509406050235}, + {10055911465166862298, 8069256921143792190, 11886968715847498191, 6351594160398684406}, + }, + { + {5472832021993175857, 6120966193470238758, 13156950075464061259, 14833372202848630444}, + {5760885723102571027, 18022572190906170343, 9870918995920897221, 9546055667466056471}, + }, + { + {17124591880405051324, 3379747334483646957, 2084957978131092947, 2413497199486596627}, + {2867893699156486423, 1357836849049583382, 13607307985344221035, 18039194570940763745}, + }, + { + {13230815692170010235, 10662664037814374845, 10120384214921531334, 8892863196093018212}, + {4443096401408136417, 1896901619181196514, 739574867683694091, 11233952771600927581}, + }, + { + {13885878918475208407, 18415131106660406656, 14362601436612948914, 5740711586144226035}, + {220574937152712384, 16774016249557318959, 4658351269477373440, 7890975779439252404}, + }, + { + {16628715286876183012, 5300385226682547206, 4493053153469218188, 6690552861098862065}, + {9359345201611660030, 17390357193161728482, 9283655448484665614, 13747647357786913441}, + }, + { + {3101241556869117917, 4731590937333975732, 8347709942856514723, 580858462407103829}, + {8937550160715031857, 563888416351720575, 6928865729903641398, 8295908905021542009}, + }, + { + {2219303446125808132, 7766409607764464233, 4492816761527421087, 1687012079818776091}, + {9967512906892097592, 8099397263797608226, 264054732854154094, 14515622825083967497}, + }, + { + {10586626338424063837, 11285305220583812031, 1552873676034063335, 7108571382532772330}, + {12077600502438115659, 4925647731241250576, 887903929602864140, 3575833277214438245}, + }, + { + {14685642695197717757, 4830460343095831969, 1748938116371486214, 3212377924501398108}, + {7575821759023381902, 4416593227203343304, 17810665332121047202, 5387420006905173437}, + }, + { + {8644732068940188724, 17116805484232699355, 6611042643736763845, 12686480611232016266}, + {13422256101258226329, 15901664205323922499, 100273141428472746, 3184681836469139902}, + }, + }, + { + { + {2754563581284692865, 11257360722362829387, 8254261291934606879, 10023569920325096229}, + {7980898855627864603, 17162063449612285703, 9275759455936104363, 15936804738099638644}, + }, + { + {303387668469489035, 7978391052264888020, 15413722057350324494, 508608987485166058}, + {5585753287556892522, 1344134516582665443, 15144279405777509214, 17014353449841567149}, + }, + { + {12518577022215294774, 11347384788122950558, 17122718824958020364, 5431993665805279177}, + {1445831254446028321, 9845654210244803480, 18315778529692612284, 930563922336183289}, + }, + { + {4894710987714215219, 15704993603878996107, 1606204036324478223, 14308635149530198932}, + {5026736228773269251, 2911689442372084137, 9004077539360196849, 7770049130277452000}, + }, + { + {2745120518194234905, 17255944807561408883, 7371907591838942770, 11781525288383871227}, + {7814952754785494862, 15022715213812536212, 4112388658963418656, 13703771908397991335}, + }, + { + {17455440140812341569, 16738670164475421762, 13259904130186215994, 2168106064304872507}, + {1969289843772256992, 9025317999701057831, 5835661391798891929, 3826587698101558069}, + }, + { + {9149648374608464235, 7248346993716635643, 17283919168525322365, 10107681064815728795}, + {12176813938029507719, 15110337574289033068, 2436453685316043712, 5876967059744625564}, + }, + { + {6197919059881189313, 3300993078638782623, 9357667752372201437, 17688129755135009447}, + {5477090746558113696, 12602024521188880300, 15889961935507293355, 7135039746373941272}, + }, + { + {12561063426893244305, 3079971284510744316, 15695857190375815873, 16730673956207425338}, + {12065477821845465116, 13846158368121919228, 2126156187526559500, 3005167441915916768}, + }, + { + {3858987859895327040, 17043903959888117395, 5861237635520080595, 3292646198413575902}, + {14286644557048422360, 14346409530388980974, 12583555046601155161, 4665981927428063991}, + }, + { + {7657686120974201842, 2388299767028319466, 17934808017791217639, 16708640707026372313}, + {14122341266134976486, 9547124998857374491, 11194069918436025923, 14657538980930727877}, + }, + { + {18115789712912297420, 6543740714573413570, 1955886376702349613, 14736853369719086334}, + {3914330395250768396, 7607848156418885173, 18220633528980056514, 11930952850158858930}, + }, + { + {17010681753474701341, 6961088634819162945, 18395881317121515295, 11611411242007267179}, + {7996717433149311639, 2687736005475404867, 15340214362731923149, 7116441414289074727}, + }, + { + {14302198697220662403, 11915041511943922518, 12363437164440173650, 4047410026894059083}, + {11439743031696133447, 8776097395071907030, 6851061783357383945, 16484733576581941012}, + }, + { + {2861660066704264713, 16453202148771053225, 10039035813504063627, 6275446616881871868}, + {7150609984920482782, 11100941755544354363, 6219760433202580646, 2875377482232912143}, + }, + }, + { + { + {15290817014272444879, 8012864091692295774, 7591940515496590516, 9299619125326026848}, + {7297256232167521068, 17861204372399797627, 3100022958796565106, 15313770879200204613}, + }, + { + {9902363248877274636, 15776195244792726061, 1935342462634574355, 16572507349421626602}, + {7503944294807242065, 7454248748618678609, 2837392985175901475, 16494567631149775512}, + }, + { + {7821919851875204434, 3437243050078433703, 16281279739393410040, 3105985403882097775}, + {6392071520880083076, 2042340026857542253, 2492719020444109453, 7325465357665053546}, + }, + { + {12299242278498309265, 117303082144788574, 18382936515565701803, 7941141688858846015}, + {14923823358299367958, 15681089039073030752, 16878721085421212785, 3933697483394042011}, + }, + { + {17669228922922186836, 6423621568318435743, 16298886067880336557, 11009276012664659704}, + {2934438101395245878, 7492928446481808311, 1311515713186855284, 4493146166488261630}, + }, + { + {14009653500169461120, 12982754496644678513, 14586034645437015762, 18126832542767444974}, + {627541781236454235, 3801503508930355635, 14654684147782092084, 4179096323459534629}, + }, + { + {14829342742512426992, 12453047655591346244, 13146459409240287380, 18077963306248855764}, + {17149389409735171474, 13591892902058002302, 13872587256559899629, 15878632005942819501}, + }, + { + {2878536922988449879, 8819365314325664735, 2696760638950720974, 11357179421800829605}, + {14730809809256560583, 16277258726425730599, 13189689275745970592, 13769784951430309444}, + }, + { + {14706229979050107962, 8679247682181027680, 9705538653507374238, 12793525936716723768}, + {10022723640772366793, 2224403391050849804, 11511158380587667232, 3250960576892370870}, + }, + { + {17671892277522139639, 1384260767972381005, 7623504419117295292, 11197930232971575240}, + {14867469242175831789, 897596747715880677, 3892483173599058531, 13453254609965163080}, + }, + { + {2690362926234343281, 12134546410412600166, 15715872358030533545, 18160163251393343275}, + {12233720002415141519, 556081697748597124, 1099809960955937522, 15489604457800724223}, + }, + { + {10292669945637125918, 13595563061674492799, 18301330068714272653, 16981073598172019270}, + {4022713583718555211, 847970754090163894, 12867993617169467387, 10021141621864633865}, + }, + { + {5408393826294570360, 16896935186698126584, 13028972412622343885, 7850626233281656805}, + {962076344521148275, 12332350290936839731, 1774588207039851940, 17877147526933423087}, + }, + { + {11625440764115934244, 17372224561416726989, 13457342366450471135, 1569549943944038472}, + {17753658357081801983, 14093490077993040859, 1282770820260996510, 16402793994329437670}, + }, + { + {13086054618104175873, 11714492854942191582, 1743587223054035136, 5474094059388998723}, + {13150833497051757606, 17129392131927259958, 5739140380294248045, 10239738807213437974}, + }, + }, + { + { + {3631886121917081375, 14286411187847401959, 1546298555066841633, 4790996540037176549}, + {9541492152219486842, 12304868498960755609, 11426775785781090329, 10793898029125361155}, + }, + { + {10932352970046201499, 5875690226460998551, 3699681560657289718, 8665743594825198441}, + {10232089728487302472, 15664572298733091969, 7267222702489958195, 10552093353886118696}, + }, + { + {4008236965647744142, 8547116629188387980, 13874587567755370880, 12696453513706541959}, + {10752386832421030566, 365775083075323708, 14295272684753058141, 11024897725724291722}, + }, + { + {2399232949134869057, 16408469118941953277, 17229778225562184411, 15990256768949242309}, + {10694906341686584836, 2816242351659628719, 10794163145486835660, 15601904974333104002}, + }, + { + {1158521281204350113, 6232098057848694897, 12517518152351190341, 17852831094628421272}, + {11653774695260269881, 4420518556213490728, 13835371272800239099, 12119809446886544909}, + }, + { + {5143546864201185527, 6400878864024957342, 15513803558106064076, 6712861984922181478}, + {15623960351786428150, 3094277713920675576, 6184647748693682810, 7857605928718754519}, + }, + { + {2219152199405421709, 5367881810186787185, 9606063680551349934, 18233690822105957780}, + {9941441403610160291, 14996958158691873775, 4936282940888570414, 16608409936766385729}, + }, + { + {13270099407878039596, 11569032926557804346, 7759575992876193458, 8239088820951102451}, + {9633607727685959064, 9775909232917811341, 12297921731498614906, 14756100221590046549}, + }, + { + {3076166255574886489, 5587891405059542759, 2449830540875545916, 15616237426524550707}, + {17820334717580127167, 11506219580693301288, 15242532286743473103, 3266057695402840388}, + }, + { + {7193168093115966016, 8050992763687139302, 9734357192061785185, 15553552690657851227}, + {4632257996795951659, 1007158456255834509, 17052740163052114844, 15619284827675470063}, + }, + { + {4224824291132201768, 5709863556852834901, 13539485156399791894, 10330250853413634451}, + {2817020820518906625, 14306724568884734914, 10421968182740721623, 6943068506740047695}, + }, + { + {10830476567180688368, 10003074695797360184, 5589380226277136479, 14952961630386717087}, + {6354514974022878533, 3426762794422332369, 17950815054280597743, 14940277403242978595}, + }, + { + {14582622177810553114, 2819236216667324430, 11333005326119114902, 15900677556115860419}, + {12265999577465855236, 14521351376076108710, 3999293994697120555, 2365385934872188434}, + }, + { + {1803647016552158312, 12981833819573589527, 11371133227762071, 8210800033974528109}, + {16927172347295306236, 11674533305143999306, 1514600283696801303, 17036724058500952986}, + }, + { + {15551380071341300893, 1378878534597097794, 16601031904934455368, 14515377519758777108}, + {7039813638645241317, 12524221355672362377, 10483072291636269482, 5711815649533531303}, + }, + }, + { + { + {9246769514475702626, 5788284997389507365, 15857897362850327403, 13864676801095094218}, + {12881526722328523267, 2620841421323221200, 12599981775316397124, 12820989846844560040}, + }, + { + {13066648645100247757, 16727492115601921665, 15749471761440498106, 937594351871983779}, + {8381111811209734349, 10884357918725639691, 781591570669492079, 12778743765298428266}, + }, + { + {1797915488494232282, 17274756142259274463, 14207994319179101777, 9405903752538915237}, + {9001743317941152797, 15048752608061590843, 4925745663463425863, 17143694017177138485}, + }, + { + {11613437975225156304, 8619196433402562266, 11907033287998837424, 5056904365610561965}, + {7637552956459333558, 2827449950719061527, 9998507085256853501, 9238562885525900325}, + }, + { + {13246436769495027717, 5445015753017977819, 16266739009580878036, 15566606095998238977}, + {12196078605380432771, 4854324313875295137, 10974170498288217052, 6425550765546527417}, + }, + { + {14574824159194628650, 16992289415800830701, 3499062703303067574, 11220872042664151226}, + {18135860701984580530, 13630928571014923388, 2913126838766947469, 15869180955632349704}, + }, + { + {10621010745328025245, 14637275395423748577, 12928463178963493980, 3270672471462681194}, + {11765440832075775157, 8138439106739837848, 10004644076263261924, 12582897670868871780}, + }, + { + {9605391611675301152, 14014632424042523224, 4638465078692570733, 3013469722048440965}, + {10972600060210514686, 4497572559400894366, 2652629676209366276, 15827846806499715082}, + }, + { + {216774559418075105, 7056732230404238374, 4342481467357759950, 16143194646968227790}, + {12304857685680249595, 5021239809847286634, 745754913624924064, 1603290801266214539}, + }, + { + {2784418922013631805, 3554650219010546629, 8896448905401216908, 13445015286698819482}, + {6508982623352460996, 3322529327934132311, 18417788670080975365, 17554108945303789353}, + }, + { + {17620122226715347133, 9738429733440215024, 15577771434516492888, 12422193389576942718}, + {18383756008252443605, 12736926759685644351, 16981429110294392086, 11999528928951986433}, + }, + { + {14489177617081844909, 15995916840320959685, 6361381313838994395, 11146176143708648759}, + {17190512001934479207, 8406914945663974955, 18073221191428103088, 14075266763636071788}, + }, + { + {11493260321718935244, 7134447477334726345, 10489281872281557152, 6145540581503915475}, + {4002857892747271740, 5167943945955725680, 2892864850826359384, 16887114279977647596}, + }, + { + {16493058314197913501, 14642843949567816202, 8421201635021034279, 3645913604138483317}, + {6127272877310948153, 3660286308390076870, 14343325047340052700, 5355450922054278073}, + }, + { + {8426383571761073988, 17627146217941553397, 7396223609641674418, 2402241526082789613}, + {4067059813672963823, 10306840429023537942, 18342506396531908477, 7249869764848707701}, + }, + }, + { + { + {13937553904380032591, 9165760362893872288, 14159606902675650669, 7794101517494576908}, + {11994596892880464164, 16211278212275417034, 1568324133241165712, 6579463633356173526}, + }, + { + {369660229032730089, 11851915833529805698, 13485269529443969890, 1270120511649175022}, + {9128783725626301238, 6173048611666804214, 14151404531169195672, 18241008099921643437}, + }, + { + {16331025972320545471, 6852381640421896437, 9324740413214863495, 15718339035381717722}, + {1521756232012903545, 5431459367124818841, 5364830919043042094, 11104748870982011750}, + }, + { + {16226789363155700046, 13734705589524056856, 9629995513492843231, 2636144377026081617}, + {1233405076007260313, 2119672919365858964, 4932766292290315579, 4185117177904214366}, + }, + { + {6556637108078954923, 854911879338322327, 17335608616262058670, 8212786550755149003}, + {8111194132924193031, 15689965289081013375, 16641361924274000294, 13131032775030004856}, + }, + { + {8653575060724839982, 11482527594744353256, 10837608928215660048, 3651629796762058243}, + {7098570919231943894, 16903422906687575782, 6449467519885582678, 14455694979526406871}, + }, + { + {781149662684377075, 9606778745577048892, 16642923833572014687, 6804945833779567806}, + {7749938807818369385, 4119995592971432914, 17172069782410404367, 11558710124840085255}, + }, + { + {16996170392430604056, 2476294162951949891, 6677439492116109133, 1649550562276235959}, + {7307278264575968221, 17128676264244010843, 9768062299436691373, 3825325732056225433}, + }, + { + {6593955722549970555, 17069122731812152854, 9033349482403834703, 17728559655579364768}, + {16586780540128534825, 13307658170018069777, 3129405955501687685, 11183053750385689524}, + }, + { + {396019325068553604, 11523268935121791712, 15099363117146465288, 15263791092270534216}, + {13442484747453660303, 9234120847672647934, 12419564747087042045, 11765927783051357577}, + }, + { + {6946885342337567475, 7614129273290805579, 5593360004251714058, 12661112521307810378}, + {3109170497657341517, 17179338146382046416, 10757457188650866858, 6777926602245453235}, + }, + { + {5861627228365499618, 5011684805137210454, 1579621475012951778, 11535371650014354624}, + {12847902922833318241, 4997014846790385136, 9875988184618650628, 13094082946822736823}, + }, + { + {2372542806512167707, 4770713673953713652, 14348746494327256696, 7497346441434630132}, + {8937635379675246570, 8485257033326447249, 9021969910533595955, 17083952234675640995}, + }, + { + {15253158548483712314, 10967825792345015198, 9742716807127259344, 14359543366972625129}, + {6622650705673586588, 10738437674137632549, 1628663686364470696, 6788821495127737255}, + }, + { + {10456049238997614164, 3762844951386993276, 489305084297229810, 1360312650067674972}, + {11869321173985817492, 5817931657599210177, 16741327479242559412, 1205037582258757668}, + }, + }, + { + { + {7109145612337154341, 10502845970727626855, 6527587047878193251, 7049690136888681718}, + {16750703006415156202, 2559311261501721445, 1222802194566919230, 18019462938525560766}, + }, + { + {2592184418896595488, 1723751460114310463, 11198512454461769811, 6203707848404803677}, + {2601731234271436477, 18186700975610533226, 4757569424831899615, 13359873383138312209}, + }, + { + {13904640252203718708, 10747313134117021792, 14667070697514384141, 2600977347774743546}, + {15498986940124021079, 14740645313274577011, 17403811028932224808, 8060102076475954685}, + }, + { + {12990649636107730851, 13002224935892458030, 4380799638612122791, 7935443787987894924}, + {10438069978940053126, 302419699431148366, 551508078777729872, 366155636877501719}, + }, + { + {14734735764746786753, 1378251478826083755, 13509550209468602124, 14458158239096821346}, + {5681313138148713219, 9054039627425609375, 4235536482830620712, 1502753755874778370}, + }, + { + {8914021876030553161, 9071747156187788379, 14974736924255494885, 17070198435868341999}, + {3643991391224035758, 260637732328275649, 17609644917816078225, 2302996326941944665}, + }, + { + {5888744936142942064, 17277140802638358763, 10290028650289820825, 1940657436863195045}, + {10796401239257150661, 7788083050548605852, 13474393003015663489, 8961936186303685357}, + }, + { + {16407225233842256953, 13423683834633513951, 17454464203550700633, 6033758555290610449}, + {5063673994339442907, 12250392784929419939, 5954485814444410119, 10099095370725442279}, + }, + { + {4687621216548073298, 12683256962895584277, 1406415612737291460, 3991320149877222007}, + {403384179417053146, 7072351635192146705, 14388831570324308780, 2518546598792352745}, + }, + { + {2866701220158780648, 14345701180700655413, 10383205903323525163, 14561034237887346332}, + {4525630512028460468, 7470042867870921036, 12498636959757093905, 14959680069767374094}, + }, + { + {939355076355747784, 236998652239230884, 7862332576114728232, 3008745396212765985}, + {16892515157128448879, 1688671543548974140, 582235491724828261, 2879861045707356356}, + }, + { + {5793581539270397654, 12067972155882240315, 1914416028486337582, 2044052608129533771}, + {1045680055817519578, 6183307954634642810, 1115903654002488241, 9729229622559998051}, + }, + { + {11505233554542243613, 13650372171621554098, 11886401428750724176, 2616122636264787282}, + {9807875738265530891, 2065326856613209663, 3841177149705795822, 12478836916087572836}, + }, + { + {8725096612265348131, 16959754534248500306, 3934616751368449170, 887912345061829880}, + {11410178859948957868, 12867384504930748729, 4367798270196663137, 4359910421693489126}, + }, + { + {18221589825782480868, 15875305463032670629, 1054133002549446970, 2220911650204683784}, + {10874691797030180071, 13903803155513130100, 14873882741737344436, 9374498718172057556}, + }, + }, + { + { + {4471613312912718060, 13601785177495103328, 8083849806888905297, 9053545412554844461}, + {1876605639999952155, 6124537911475118673, 16877891074567085688, 16541720065079132344}, + }, + { + {18138305348849897995, 11498878557125400853, 14125346336359365201, 11991638807788804369}, + {13935355764550912568, 16209147067155729660, 11086190285777019292, 16727288863943596410}, + }, + { + {8873152377611229668, 6260821826956744083, 11489383533808918262, 6585112195310961861}, + {7365821041919648819, 1936165695028211587, 16164747634991415711, 17957320776652490392}, + }, + { + {13065030057172289846, 7278765836407486850, 383827150208081081, 7832055893191054601}, + {5249323286889945617, 1631661912887095912, 4431088469837785451, 2866263172993336891}, + }, + { + {6140213328062333551, 16704025329777067037, 5839832043209342792, 9196354634862869885}, + {2735762290983671190, 5323501742548818139, 3199127466610501482, 6719610946615763192}, + }, + { + {4032564124345275293, 240208626666701335, 10264845378648897042, 15608289126091352415}, + {17866864241918154829, 6207477318890336372, 491708931325462670, 7002400618323099260}, + }, + { + {11507747783030541234, 13683043390668171754, 9924966309328785763, 5549516466627385909}, + {3724001483041449858, 2408778220985427590, 10510707601023430105, 12862520912519186496}, + }, + { + {5012372868660694231, 12033652755433827667, 5960732801180177919, 6089487525155575261}, + {18400192045204062277, 12754175136438960528, 6170965736016609163, 10141374482047067946}, + }, + { + {11781193922347227447, 16937876011211881637, 2982972111293427964, 1728244726890919596}, + {3327997232304084768, 4754833121145407334, 5871027825507908591, 15772493911709624273}, + }, + { + {5862944033912881884, 11132730978666088350, 12167180155548291888, 16449838286695349787}, + {14399676610730016345, 17071083123672650337, 13727728787831175379, 7507765123422748291}, + }, + { + {4883057314704644529, 6606742732149784343, 16070555141087563722, 8408294891669305261}, + {4298316003054547788, 1573237855902568238, 5357176885445018289, 5855732582172939202}, + }, + { + {11721126538980357625, 7216004194033429913, 12765889884935948315, 6003399149613653734}, + {4571046290325663920, 15023470461830485075, 11463513436288928362, 16135217522406374542}, + }, + { + {14300855104129153291, 11491527690078786162, 5674183453812271017, 5044682546652747711}, + {9153978680942338831, 400454762074409409, 12351470849648616331, 10559229320903248832}, + }, + { + {11839166519633311143, 16489041153719856002, 4820713204385149226, 13768001962143023630}, + {13107713406478328396, 15471245828032402460, 6733652296473831544, 7665657127090105428}, + }, + { + {6114372925011600760, 13061069979571997963, 12156991017966837826, 12403009591138383583}, + {5761958709898299258, 1907771304051897263, 3007439379929412593, 18410854883912163962}, + }, + }, + { + { + {10153847769616409178, 16591913677701651064, 11369151065084080884, 9493662847124813178}, + {14299126668179023903, 2451525064998641745, 16055696673728703463, 7600736037142850105}, + }, + { + {3339871688614476269, 2937156932445032796, 2071344655111136329, 509603454456841298}, + {10929109734329673813, 4531629375826317764, 1802431569220697099, 7971315018970882891}, + }, + { + {831440329504272059, 17398063681351066636, 14954668702259408996, 5717183520144440084}, + {5683898996859918421, 9613688159291425744, 14476049487507222229, 3689544236835488368}, + }, + { + {4307546666223047416, 13914498777427309061, 6812156124789414732, 1680174913762530491}, + {6756325174405757110, 2535144759174364990, 11263393915003278429, 14767595249676286403}, + }, + { + {16671897597823309975, 8846923580617118936, 16420413907022376284, 2344779928765541883}, + {13727655669851883280, 934227091954463432, 4722713881950047653, 11812583008287470589}, + }, + { + {5321392406277114518, 347488367118035707, 13877286915167943316, 9829617275563347891}, + {12220860524024630629, 12190721936758412489, 7308208895364574537, 1525158119497637419}, + }, + { + {12984508126047021344, 13884472939864196037, 7382834581395586970, 11638480609720520178}, + {3822030693056621440, 16565826187005934945, 8411123762207988382, 1177726217844912325}, + }, + { + {6981289090623415465, 8930069945493884157, 8223216504978132408, 796477795300774057}, + {3120155459209743472, 14825603392456550470, 3711879425019804830, 11041054473536223927}, + }, + { + {6533202055887887500, 8435346764005128028, 14910943752455571727, 12906760590440667071}, + {6009159206340842586, 15232286290711710102, 13101554303130256987, 9535887764075322183}, + }, + { + {2364828287094520952, 12465747625792776806, 2520175043973011525, 17224593222741233568}, + {1891958595100476046, 14167979679885431508, 6587293950576996181, 438078840840804918}, + }, + { + {3740623254035318453, 2026091438664349886, 10842473205058238690, 5471257179527938221}, + {7725900701946760330, 2830662433803069280, 17799722315873409980, 10759084277615005300}, + }, + { + {14135544350792474553, 6171419888118563156, 12495035851387242130, 2843310747449412555}, + {5668766087526340552, 10117858698838396246, 5181027414039980750, 13247490124270426}, + }, + { + {5630566354382744149, 13019515676216329576, 5170054423571001981, 6980215251505169036}, + {12147009277250683724, 5685374899516102781, 10470553909247052379, 13479624060240397189}, + }, + { + {9352291669847160009, 8941401423217216209, 14488820078509299610, 16185610851702419585}, + {11995025321082820298, 8447817180287020945, 5861763576711981236, 14278368152612939946}, + }, + { + {17266177108677586607, 54295173557875478, 6565771227548453510, 11327083086584790599}, + {2516266639353612660, 16450448808532150212, 4693041555468884719, 10262468795248362309}, + }, + }, + { + { + {2365455792963674834, 2249234228455309648, 5237136544555745182, 8814246419234451463}, + {13017813702607013347, 2241193992640629733, 17982226236989862510, 9800528153239873634}, + }, + { + {17271890190678399664, 284117971978206043, 14999643475704678808, 6264699496666119083}, + {8859934981351804429, 8300880062060532031, 3667839168820458685, 17133003164910522197}, + }, + { + {17791633957402883820, 5938849497629314459, 8356801465373786047, 3163889445599730677}, + {9723709910898285412, 2841967670768995554, 10896757438566636700, 7434996874241771203}, + }, + { + {14086272070125896854, 12009239107306499026, 6592816798466831203, 11371087141421707743}, + {16277593907837607793, 16449564916599232060, 17471042072158213549, 11953382410698485455}, + }, + { + {14613304240735929191, 7658770973133328064, 3028731168325633068, 1486737152001467114}, + {16715835021406106944, 15214200823642287507, 18441898204110447697, 5669963154424393607}, + }, + { + {8381651800836461905, 275661552864412688, 5548629401959193001, 7174991431295718071}, + {7441251258233899268, 14052832476485122412, 301250917807487282, 17797202428295526090}, + }, + { + {16448089571044203401, 1396460397790470601, 9796571033221459545, 8162511506983092708}, + {13893406727199803081, 16188892369453405032, 16023105002157964343, 7061289566170423383}, + }, + { + {8743817608749172620, 7804846024944300667, 507107926259802795, 5258061329638283805}, + {15071070675288472598, 1848743106176521296, 16295570828486620412, 7409462376590083349}, + }, + { + {2825832734356158434, 10662490421734807455, 6363563030616301959, 16552149102037287266}, + {8852342875874616869, 16848248230809388411, 6581680050166700198, 245046966305064563}, + }, + { + {7828655274510399422, 8354801505584011854, 17818478328917068523, 17325245990806811268}, + {750899848242404370, 6729023687199559366, 5406329621088392947, 9196565205678366888}, + }, + { + {8064539304829538257, 6441901327220658696, 17278408443193767018, 6094106832683864460}, + {9824329910822370076, 5272517980512991724, 8211352561755619726, 16303987070546290759}, + }, + { + {16798983177239698753, 12189491924433050580, 9517619110936281609, 17570406314312177597}, + {9873809692789257777, 7539953961664846819, 14652839873293130968, 11082914471633564328}, + }, + { + {5471221015674785794, 8844747884377425274, 10084666525179707178, 11340747033059217003}, + {7295797213045550755, 8395678759725657352, 9654316500807954493, 9062353099996695484}, + }, + { + {4588282548354659427, 7317148840331807496, 1344326657487996813, 1542409176821028318}, + {16178223850158437787, 14916858636047869579, 13512744779273961596, 13549205429423761570}, + }, + { + {12307321769285447055, 293357554223804370, 1007020265087773203, 701738899338647839}, + {12276634770118212432, 14777553112070534726, 4541693432120405052, 9103025487888313415}, + }, + }, + { + { + {5757832545805155636, 17609080533053427627, 13855662030602089892, 9622498683452213297}, + {12281586442064581946, 610529441714948581, 14740357477019436626, 16983190111725558863}, + }, + { + {8470173855499872166, 15915210069852758660, 12368087246231545517, 3867174158581293223}, + {9082358201271846042, 16663463402757176964, 13740908859955866819, 7748969412274962298}, + }, + { + {13375424826931892789, 8508645806391261552, 18359272328758476903, 16433208398005282080}, + {13071423254987294580, 7999383023651164492, 14514701556577587750, 4848295889377673720}, + }, + { + {1020519568493754982, 10467781020270669620, 17607771250627508499, 6620300538436640218}, + {3858527175523168333, 13798129597334232823, 12495322651937391008, 3926713306087152023}, + }, + { + {5116038770086590715, 9943789276328255827, 13715439407309914230, 4887040860130243503}, + {18288477612078228131, 7640050573721350378, 14537362862524718973, 1658575506924200900}, + }, + { + {18400486168653423966, 18026904540891591040, 2037921821724043966, 18010956304511658647}, + {3751340308708032971, 16275459031633957091, 17177866831427164840, 1635431811339422016}, + }, + { + {3897330996014812355, 14347736534650088376, 16862404119462964612, 12216005411754788835}, + {11561909516001453735, 6261639657930189859, 9101978764314050064, 12280333151331067982}, + }, + { + {910276569977357717, 2872810615152156462, 1942106118995935911, 8734004121981822024}, + {13862118436432879698, 1912639548162720505, 13060137938875924732, 10642216911059510120}, + }, + { + {5132232031613377471, 3053931945527415993, 2695169719602504430, 11855046366025891084}, + {16462491222215366712, 16664416596202206835, 3077124688577987843, 7109495326459366311}, + }, + { + {3858762384693274897, 7520194928987242278, 4496744297661574884, 16159343214247089321}, + {6441167128044578145, 3604951495694157848, 3072075325567814428, 1964798869371174506}, + }, + { + {13689578474000942304, 8998724267038772595, 3350174507425430811, 15015413657749135511}, + {4848907595494161497, 7935644131326131098, 385849363817229511, 10087353746314516691}, + }, + { + {6067717601858189468, 10438404859927821308, 9991403870358837471, 17728358586134467771}, + {13476949968946830198, 7311235997042381570, 4429835371823736972, 17463216455983091974}, + }, + { + {3446799583712077997, 6763499387263152328, 9231082163128267527, 7733182914440272884}, + {17225092062157610409, 8163842076250628108, 14230171836718858439, 8195740716303697476}, + }, + { + {57759226194841354, 14962480748390190557, 2047254208877381876, 2830450574091058648}, + {14905486147404440754, 15792397930637469157, 16383409053580142957, 8686506861607761226}, + }, + { + {11120178572139812895, 11534611317577597022, 10437856602660752754, 13925966850017814278}, + {16776862023867799947, 17362554889424346260, 3408825299914455645, 2606150045870067742}, + }, + }, + { + { + {12109367644744157376, 18037756988516427980, 814572839386760074, 913616818805172815}, + {12974490864633240943, 5228203788953366069, 11458421156905635350, 14534725545904442520}, + }, + { + {13918155529832261002, 12953608416498491778, 4285102780598248527, 15853935066983430239}, + {2610351403194505517, 14905969693015035277, 12043976761492019990, 3883507340167876094}, + }, + { + {5439519346074792827, 2176389624009388617, 2631244572392601375, 15049241095214776941}, + {16292195309463965431, 4379169091046493311, 2454237863606964835, 16333960950959567989}, + }, + { + {10994470105201067642, 16033352651464686189, 15774427704233149170, 4596106024708523955}, + {8854068685612048031, 13529126595187822090, 11509928293490788309, 11620850709434334690}, + }, + { + {267621988570094461, 10587206279243947181, 11593510291287574067, 14787400314862354894}, + {4136983718443464652, 2976380359687256413, 11142324903811863489, 4610908641771667701}, + }, + { + {296274281547444433, 3085587185113256560, 12609265193181717917, 4535801536028989527}, + {3096496338675531142, 9292526016029159200, 13112825412047135381, 16663099831183411702}, + }, + { + {2767353193349225715, 8712112934471091092, 608599382922156785, 4028449356066786979}, + {17542394472389324402, 8680897831809226389, 7666317335732585298, 17261030852301003617}, + }, + { + {2068337952936280662, 6856444059219131741, 17213926210819196459, 513413453513211652}, + {5520465604253824995, 12970886588014924605, 12296275668437451137, 16808287251356954962}, + }, + { + {15914937173048753781, 12510295026185206015, 15954705664179129326, 9689253582699600268}, + {15356442010394775998, 2438265211465631320, 15141425278420483672, 17026865278332658671}, + }, + { + {775118291486058191, 14811108570252044526, 1277462327112210144, 1303109520734915949}, + {17662756477349124684, 3447822852149651619, 6150341860560710757, 13223916277431807977}, + }, + { + {9324118164416603919, 86833914568469678, 16815316898277944489, 5015780480822908208}, + {4077581079810359659, 6644887514971920354, 4892606269782662646, 12780428915404556278}, + }, + { + {3413637388791433603, 16937929882486384885, 11215805046681294327, 11559398419268924015}, + {11697258172757450737, 6137795229387768085, 3190984692021653574, 15347236891154706739}, + }, + { + {12504195828868930633, 14311735968635225029, 3580069346315758668, 12909891866007218579}, + {10780120525711488015, 17942431687417272891, 4966616543136223651, 11565637729828595342}, + }, + { + {12013939709036934636, 4233656138400235608, 5744753585886244254, 7800398410233442143}, + {15609887409465530711, 11633197710359969914, 4221051249637072360, 11317958694020095179}, + }, + { + {5703670472856822602, 8043375474958283103, 2470834322231268196, 13020386017071254236}, + {13795230438353673114, 9108571599173545401, 10145331563807416240, 17474439008571566321}, + }, + }, + { + { + {16430555432520738762, 11225321696360643709, 11777973654353154098, 13133115227828884393}, + {17678738157022850345, 1586660156856830642, 840647763693221003, 8645742354464326466}, + }, + { + {3598736754916501501, 4827022662021197854, 8203180748141933720, 10283251600632599041}, + {16186680658340956808, 15183393398087319142, 8714402370450665212, 13217902016653171217}, + }, + { + {11743016372336018414, 6125536020759642301, 16563280170798047733, 14529052521060111789}, + {15253502329174644388, 1556763737841306861, 3041940064290508531, 18020881359462953336}, + }, + { + {2297585344913389180, 13965959247788377604, 11341378863608387800, 9890953382689640379}, + {10443523266835246852, 9631856696811288063, 6944503116553031744, 10030824122780966395}, + }, + { + {6636244234467769744, 18284390012667441869, 722929822219329257, 3274166388651987221}, + {13177791837760949480, 2568122970128111127, 3477167651270374316, 11371867850093288299}, + }, + { + {12876460969864886954, 4692925517843901006, 17390372170975588763, 14692578774429957295}, + {1759864963511373267, 12016553435172103063, 13015881292003590351, 16187569590073958370}, + }, + { + {5868176722765418764, 8429364877332796959, 7785756492654137899, 14975349488807886278}, + {3272010964035218775, 8946396491617515063, 3774503492701710541, 2113917870331282160}, + }, + { + {13276631120161396750, 16968574704982977753, 2376454925072971568, 9477134218094425043}, + {13784622991820528988, 2074505569780291922, 14294803056569335889, 8759684036994631222}, + }, + { + {9884417819806228161, 10473583853313294601, 14339795822328931094, 8504498283323826917}, + {526127293629665058, 10891388783681447537, 4568472708151557518, 10369081088106148862}, + }, + { + {14875690099724520068, 15708131372860771936, 15063351920655636623, 13673754555867312132}, + {15920462627529593070, 9885706734937065436, 16823591115242423655, 1258777215756511827}, + }, + { + {8202515950988182345, 14546423651242108828, 14227698061016162353, 10918615690964448766}, + {17106085332738434415, 16355746637376756806, 990444867181428081, 15553043817355146246}, + }, + { + {3823475181283510630, 10848691050793796395, 6491636971888772243, 757676231362735550}, + {8973136455980928416, 6503381298194573307, 7834237673135397878, 10787325521157907075}, + }, + { + {455211601892268020, 1552688795129565862, 8165081519906588268, 5446810663215253742}, + {6750786745561416995, 6997284811902307211, 16012972729607911414, 9114458230677816387}, + }, + { + {10975008541567105079, 3750365577590028809, 13516995106985748006, 8919511738051569176}, + {12930984911878205493, 14293252788401143455, 1989517604536428154, 10167748824687611261}, + }, + { + {4403033949751056724, 8371165401092074176, 4457099049748166877, 18160854660487137945}, + {18090711188318162626, 2052332783995780991, 10990843822512572670, 8096670640545581193}, + }, + }, + { + { + {987127652983079722, 6872208513691823695, 10110578719299008714, 16457381243184327116}, + {10779072738879347999, 5965282398006505989, 18251577267494363268, 9321323379108563422}, + }, + { + {6119049170407437179, 12938407708038792521, 10105420405825346383, 3416306788177016826}, + {330648587825212481, 125568991290568141, 13857127346570918649, 4376080986981308805}, + }, + { + {5930434126597036589, 11240994623469578584, 839346533006694594, 10015087329724081709}, + {6285097815938761787, 17244606485954860090, 11523249727882012981, 7178451948850151803}, + }, + { + {16733615335426327004, 14833564736134873977, 15736159435317472941, 17560193966711884894}, + {4670172300306758374, 9477713670983496835, 14243955354032737980, 6459864769649694970}, + }, + { + {16053517698989562256, 2069464650596796670, 18305730134729303993, 1090863611964008044}, + {10595928817546105363, 11743183506441120484, 8584767248013363683, 9187452830514379903}, + }, + { + {6938579711827578880, 16268282168771714072, 4567473305742437221, 754548046014059669}, + {7773636946295303572, 8132380485366854656, 5054542590195827722, 6074347500754248128}, + }, + { + {3955857908381474930, 11852678900999621852, 13783017203403417097, 13616745777931267488}, + {13189924588414196918, 14519927295809952876, 9334100965942760501, 15172548734242885286}, + }, + { + {4869852132020793901, 14921212823114724347, 14342559113353033349, 13336827701782657309}, + {11168346789878684452, 9790480725902426052, 9171116079841529936, 9268902731763220711}, + }, + { + {4417372365016540659, 17280138652899703220, 6650972319709075180, 11252221422799491438}, + {6825784270383052414, 18308562203755695191, 4237445205082731447, 8485872406483449772}, + }, + { + {11718726714045105993, 2624508790343569765, 5794111482300008213, 12819216567095091385}, + {285329842793152354, 17257707863943097374, 16912487373614458842, 9501952033607497057}, + }, + { + {13074643344738491288, 8505193022029238118, 9932652098552590323, 267408114280737600}, + {14802861246220332716, 17506028737327736269, 15929083591675282371, 10937680132245212187}, + }, + { + {16688733766460131050, 12777635326299184071, 7769405825716531061, 12435979606514844725}, + {2767987141420672349, 6723940414217341603, 16114182069580717377, 4541113259200434040}, + }, + { + {8506371389960537559, 18031198550689409305, 11510251852995503442, 1923472385053944821}, + {6189904387119195613, 345664413118550356, 6439003191582953600, 18344385760549575361}, + }, + { + {5320548958745018096, 8341561189829530680, 3327828110998403156, 17981346269177513223}, + {14254804273025688074, 11111147827704077234, 9093333670517437191, 7272552282364063165}, + }, + { + {7587268797387514088, 4402481408866840263, 11260815389095334885, 14391444701764948710}, + {4224880318604689771, 2472148458660279030, 961218007313548745, 13826356220879831691}, + }, + }, + { + { + {5733697799130763963, 962857090393715865, 10538932452511329419, 3413281437172590207}, + {6635428480179771287, 4404718679994229138, 329074170931436370, 17746708206910902139}, + }, + { + {179238781994802586, 9017860544212172426, 16179187983079961859, 1380105261896053495}, + {6187003332254463653, 9896593306091975718, 17181949235068293496, 6820143159816507763}, + }, + { + {4652378169433586070, 2069013165869224423, 13972912433480425078, 2248203233787863058}, + {12819880125496785064, 12462800229583867169, 7969192387226362512, 15450728326339004590}, + }, + { + {11156900805411912784, 1737275748212365168, 16993486692205800040, 12538938066475152524}, + {13167476167764338790, 17373319366642541595, 6054831428930905282, 7118452124011953000}, + }, + { + {15319323094268250368, 15751569639563379275, 9174762389399453601, 5359273060607997116}, + {7548480167962649047, 4093535200286790152, 18255003581953064302, 17037929372197430710}, + }, + { + {3640693116491518731, 9689920283410066894, 16070225083132083168, 13505008973802466003}, + {750230942699692016, 15522838682331888368, 112268476925002814, 17491605970126192984}, + }, + { + {16769567946241955549, 17099752525969374817, 14041401861628609700, 13883170585376164878}, + {1568639950869924595, 7305902646691031157, 12536573783075304502, 12490145094151973568}, + }, + { + {743288751022377974, 9226164090128370715, 17669221687181604232, 1117842260351396541}, + {17697784451833850722, 14382209306891991103, 16951372733687268016, 188390802712613066}, + }, + { + {7332583781810119624, 11974900502289827649, 9825039434151224666, 13612433455140779130}, + {11167094757836568968, 148858902984029622, 4325547061862811500, 8439987427904092212}, + }, + { + {9775040802880336170, 2183956155792599391, 10102475962557589963, 14902149990037881859}, + {7528893974593517583, 18271333130592009124, 11812759747597590978, 3931581515688264350}, + }, + { + {7368734173241076742, 12419301291748626639, 10534790951032501149, 16676926058266807225}, + {13614593066288445663, 5547469267128540754, 5071513241190976074, 6206141439571986364}, + }, + { + {13268209255833199938, 16633146482265079265, 6044233937395578074, 1733872861371247406}, + {14239198956565602758, 4036306057099495106, 1778912298053970082, 6174082695927204648}, + }, + { + {9563897475320169888, 3828463449263891363, 4522408683909966848, 10085044841903958270}, + {15115863363467748291, 3921763467143122522, 3241611744432406503, 16149166019569794702}, + }, + { + {13355027832202142668, 13259310595418810737, 16638224598838046396, 388655643128437049}, + {6131988039969669992, 16758867465997134050, 793705445085763779, 16225736542798627427}, + }, + { + {12060616483613851492, 11185023117529741833, 15286366164051065546, 5407795227432242447}, + {3261413161331398298, 7182873809282605970, 2155509494582452911, 16998725707829879258}, + }, + }, + { + { + {14380343880230315251, 6834909096379668102, 15975839936772635678, 7738230945027714388}, + {7971648870467745046, 8320128435052726628, 10820026056424631461, 7058118462476293754}, + }, + { + {11165438517321289842, 8661037418831619311, 4401480924846865713, 9355650368902126256}, + {14352422544185763829, 12268031594529744663, 17607497268577344783, 12698954426769962214}, + }, + { + {5091534986326281709, 8005812102849517353, 17366496686564185717, 3658878980438307796}, + {8455810244524637026, 7649393961871195909, 8629386422022530934, 507133797409068858}, + }, + { + {10098955144981013765, 4095621933458866623, 313357785962326778, 14880249056209398407}, + {10605627454111004262, 7841561005378789988, 5015399193497762029, 5818383539901203899}, + }, + { + {829322392873083372, 3459913121476606612, 4547714508342797986, 5801286056105229312}, + {11591136160675314269, 17965845487226778560, 7022309609363885527, 5990586084398664157}, + }, + { + {6288277991521986035, 12231480617236286340, 8633990423689180869, 13535190275290488690}, + {13419223868164389899, 17622732596713666209, 10071779220640400024, 9451660464882303005}, + }, + { + {11761084765182152401, 9226969173242076459, 5445719591917489914, 9371133174853825566}, + {18381867235964583187, 17262888224001222346, 1934253649802391267, 3574888052111089863}, + }, + { + {15270079546607712667, 8471883658965202468, 10333206241569264742, 7414741159725097798}, + {7709713706668701850, 4461310100162632915, 10099194304024685274, 4760203118683828795}, + }, + { + {784143359277603248, 15514589681861498400, 4131024411374659852, 3624433493936743696}, + {3251402229976672212, 4649659622203715244, 926933500763282104, 6444675794782453444}, + }, + { + {3756269038539504739, 7020323719189662644, 9035687928909659722, 10611580746254894906}, + {6310976205075048332, 11776014447017145895, 18193543588427463707, 12941703752632419110}, + }, + { + {13258346207952257162, 14737306929596267614, 139896257833059475, 5049568122463438631}, + {12260461320589066027, 46497756452454082, 15185750105748824007, 3681406295924007900}, + }, + { + {2833339165549332500, 18300762432878821923, 13251805801497937312, 17798840894981774941}, + {10659715417364364943, 9241413425866019176, 9144746556705463526, 18018473193185776281}, + }, + { + {7436336871105679313, 3718902224813103412, 8186181643677715434, 17182578567975462342}, + {659724975715028710, 9425698860660002856, 796351253238186633, 18323943433898241577}, + }, + { + {13500588337778130334, 15143039800006025480, 5471884014140775766, 8599189774825271733}, + {14063442714998210193, 17130659899212878144, 2181888550891204616, 13594088124987533554}, + }, + { + {16216101853436910766, 13302132899821289315, 8876723129840557561, 2026846371223185778}, + {7753254296964005427, 16607365864296868674, 1800351426181020953, 12473523172043936884}, + }, + }, + { + { + {14734199666349771791, 4159865781008764547, 4413963548436270853, 4489431649937855880}, + {2824856157476907519, 5111945927271461159, 9825486821405155220, 7657332565522279292}, + }, + { + {8798422177670065832, 1250388939918922012, 5145324733132743026, 3716299737175574168}, + {14387202892738514375, 10255681359895407489, 8563822744122397080, 18430417713920116013}, + }, + { + {7857399215288147901, 2593284350589299949, 10086687882410147351, 14407837835956327624}, + {4469878646287387405, 6845712208092605310, 3019047164798827279, 2760591274816994522}, + }, + { + {10930605176025081830, 5850835312463207607, 9603163404664606781, 15623771803942139684}, + {4096748595672894276, 13060617166821837740, 11222939712741281346, 18445178894593253710}, + }, + { + {7976335583419810431, 16568954524837045521, 5581116346602990350, 18369129318179031997}, + {1930478946186473631, 14255806344323769850, 5302512325798050097, 10008570767203424472}, + }, + { + {929118050943456183, 445163760697913504, 7208246135487165437, 13565354217377841149}, + {3835063466770003968, 8214155842021576753, 2078717035803259674, 12502657820500987763}, + }, + { + {17741004372977419914, 16320851348541958575, 11853008901690968430, 9954777341381304447}, + {14274892887030297417, 10721339848307167540, 8731332510371325649, 13676383433520290197}, + }, + { + {6251805914672095769, 1063060143452094078, 16647397170554915088, 15454955736319919321}, + {11509235104607349098, 8441647766544589978, 956121464218389431, 10752793912033728149}, + }, + { + {14879603883666664508, 11158422912437249402, 8667988090392051507, 12702057193823135575}, + {13234479167199208223, 13752955092077643608, 1117550756888145931, 1184967682872965330}, + }, + { + {7004802666964716824, 395433501626287206, 16674151908279399004, 2279551165611331131}, + {18032555740803644790, 3573953642384243989, 9892480504006025100, 2397759375236735831}, + }, + { + {15032723931727013905, 4176673226777913017, 7270920367565154969, 8867675920919464620}, + {8174119413251699506, 15030539680120439131, 12325981936900309518, 2932283844656871802}, + }, + { + {3227890727136855788, 10772277744280338071, 10065219931092397730, 17233706446636791341}, + {1372997838851103811, 14430098741859995846, 3290287064497023581, 13054133915521430696}, + }, + { + {3404625123065318735, 11884832674715736469, 16513753127836546671, 2355202492840722899}, + {2182039060332057784, 17942518439766613327, 16731345075928062112, 5501869092504492134}, + }, + { + {15704211025163561149, 14596679078416770266, 10262177146233936833, 12443005669252298316}, + {1541294166390346144, 2952804996209068760, 15358481016273272880, 1321729586231860999}, + }, + { + {6862865331233391228, 15106279167311639122, 3283008666555627541, 13405610967904725343}, + {9845239597399801983, 10764942720093673542, 6506992344666983370, 2483131164245259278}, + }, + }, + { + { + {9844707592410952215, 8167497709587672711, 18115463401502884199, 8471563375691441535}, + {17525405040226359165, 2460181803833371342, 3375780580907171205, 3024376384135966552}, + }, + { + {18138724984190926809, 4154767406604950048, 5209478936276366634, 15469512148904762872}, + {3613429290324777670, 12631812917445459751, 10280179062385049041, 19656860716268566}, + }, + { + {14203862032167128161, 13470939927320077756, 10327441827790615277, 10318573137694660185}, + {14560780313347476436, 17088464982837309355, 733937949060316950, 14069325810788446179}, + }, + { + {12030193727051241373, 13981191132445467472, 18205169646206905593, 12162181194046583886}, + {10929925499200074058, 15291772758590352491, 8452344520852919320, 8199821440451878776}, + }, + { + {702956275289752726, 11856189935311796245, 14185745521831658392, 4370665693013677718}, + {4339320942948136612, 7422618440224759582, 871840009976682819, 1758213746931263134}, + }, + { + {7463305936638691553, 10552402742907536443, 9732741351132553899, 194397927117005699}, + {12837197785265289115, 4412933472643099429, 12440864981406580998, 17072316007921211511}, + }, + { + {5025653014579399483, 6266285559889618786, 17667439302823084142, 8837073500207072384}, + {16230880878690171580, 8966359704103918073, 2671625161783975934, 5761959268140569579}, + }, + { + {9876482463501409337, 17331045017548147052, 17542726936580732548, 8299195336372136083}, + {12891767721269002608, 14062358772374813347, 4165127680073507756, 16350672737379495431}, + }, + { + {15987859092221739938, 10999006767011320329, 16931834873460681704, 40989027820989117}, + {16439290771012023473, 6900965556474667785, 7253680936177336810, 17240235510851599487}, + }, + { + {4114449005477323279, 11333071244606712260, 5639227616302034307, 15107257128889549417}, + {5046122977641767311, 17558812465185003134, 18137671581165086239, 4382776603153058089}, + }, + { + {18024760665596162063, 4581156045659391508, 968287218068232238, 9228777525067749703}, + {17309990917327276325, 7114941925430814300, 16735731670154258613, 6290532662018771504}, + }, + { + {7595271959296927018, 15286771623821390629, 980612661413312852, 5738158184597378995}, + {6972117550390447038, 6246497134979772260, 2935831443692029059, 12837371529160496660}, + }, + { + {10790135298802805255, 7259368218310211690, 12050916808246223984, 2030323364779525994}, + {12824594050397534312, 4098150364864727064, 15604500991562385767, 2831443658783115116}, + }, + { + {6469454686530052235, 2594644969515545140, 5284951626835069400, 14441180041267617906}, + {16001664398759990060, 13049178223054879255, 3268931999230968043, 3072360434503949622}, + }, + { + {4565530397071857053, 857029374864691712, 15955478286869670604, 17781316921869181573}, + {16457191703043818907, 5989113593649065091, 4425872606756635499, 4532030700973621003}, + }, + }, + { + { + {2317249352525369754, 15030797481081533168, 12237590576308284360, 15660076992611440873}, + {11341015819700735887, 8280257602754365719, 9212501234696283343, 9673375202141178099}, + }, + { + {9762534010701623728, 15349113802811029024, 8305297169667044246, 18013018210154476198}, + {18414050009163335761, 2190126859433916996, 5444481274452218807, 13415988647365667724}, + }, + { + {11641532224340210206, 71261001011952801, 2321745415903209397, 6595984444855093239}, + {10341299657770272718, 11529878689049370930, 14381510695605158203, 6869272773579747365}, + }, + { + {1073778278665127828, 301289653767944933, 11482324780950168317, 10626716202328004967}, + {7258024014655363102, 12597648090458567878, 2617914106162603499, 12324652644266476584}, + }, + { + {13957732574177025801, 1100344278733481546, 12156946932617203965, 2007756425747006287}, + {16454508610548016441, 18058668363064769203, 15619001054652658323, 1201476243910931863}, + }, + { + {16341334571424533804, 4657494880554316004, 18092783076286521475, 19832895869027143}, + {8667365497283429486, 11501953273367138162, 5832487631687776985, 664754160781757174}, + }, + { + {13524719886605363170, 11553593166914861649, 12034020205580665813, 985175984881624722}, + {11040631342644137311, 12107496606245418129, 7328748654066365904, 14741972847454326011}, + }, + { + {12828567388121500364, 2264959796189127526, 6222205589523394088, 8827682270015065013}, + {2619170858745203321, 14835030117099398518, 5960028394532808010, 2233397097850889639}, + }, + { + {3879642723354138203, 5439355518658448857, 14194463322012776543, 14947367699252203702}, + {11497182458118153903, 16347396442451668378, 16912659817226286851, 6972297461053626970}, + }, + { + {14953681219966965709, 18116944572750863844, 16774540053916392198, 6518998682436778354}, + {11207035159486725904, 17279266785091386830, 15987732680339874714, 4953887381255790681}, + }, + { + {18128055290529398111, 4838636144867908799, 17655818333374840693, 5013823741985131317}, + {1920449774281311783, 13898340137609808546, 861099289958274037, 12441596565887895930}, + }, + { + {7244015348755525626, 13520825180887535513, 9165067445392785660, 9250553550156732893}, + {15663564389384259196, 5724018088820370997, 11379531752316746866, 17687565409319417941}, + }, + { + {11050714794366707475, 12230144450501707996, 12363862313107363407, 6348205119671766380}, + {14263471584626838352, 7350100163762375926, 1902788311165167298, 11691126042005505984}, + }, + { + {3948847772791576201, 11933738159609952054, 15749315384347059669, 8831922078851474178}, + {8463496071867925621, 12756218686011120865, 4691766390469398064, 5252134452066688477}, + }, + { + {4880806069791899809, 11099088460364672063, 12627384861893315861, 4239079797011518662}, + {14560690935803003234, 15267325636353169132, 16919582304973803583, 10073876067858458517}, + }, + }, + { + { + {15695265447782578013, 15506558718447241194, 12341861439298989232, 18400958156300100845}, + {13704811286967591150, 5802260047239067846, 3266013253411255445, 9892957742319181954}, + }, + { + {6053458788987550519, 3243549259991905443, 17990025476026266205, 3918149716414968130}, + {562225565996136148, 12175287017902713154, 16317970834262634990, 5431198806775607012}, + }, + { + {15123186170178367264, 3054913246068400920, 8130663466272395280, 2852812622149318730}, + {6747630551931917110, 18302049774259156971, 3663865061939346221, 12340091610704678811}, + }, + { + {17453312277789785069, 1148609799196055657, 5931758962926317381, 5297597381576544508}, + {9136842287749269744, 3007653173299649609, 12364677607049679091, 3656932227466449489}, + }, + { + {17732801126130995365, 16093023291975796560, 17028512234142609413, 6293028118993952199}, + {4019599708379609715, 3557632583507755601, 16737140015288442165, 7041678499288317736}, + }, + { + {5187842645752673199, 14914432544387315508, 4944360914161982641, 4177329533692612281}, + {18423887817846407126, 11935898134550505219, 9191754399457615042, 962223885189306707}, + }, + { + {5467152559317256227, 13407023128339380091, 656806207084558176, 10823228592509573890}, + {282802378108427873, 13003319652664166176, 11501612671901244594, 8595770155487539951}, + }, + { + {1805255869285898834, 11676967700876044626, 3486630203654875772, 8366336693945605431}, + {17874084888474647879, 8803709150655606891, 680993178667234696, 1603785777136148315}, + }, + { + {3637712241808318043, 1673622542455477465, 14468899013751477571, 6607241816357171779}, + {2332200248940843815, 14077155355848738174, 17298155509321457563, 13624623885136011130}, + }, + { + {12550073596584561722, 13898852145577133829, 31360866049197404, 12629522544897401454}, + {4563446134761510332, 7272813487383198495, 16767195814334178362, 13600498026689482359}, + }, + { + {5170414136067325373, 10875290278133558518, 7331268231382198947, 4082234313337835514}, + {11725295114019619895, 6488017511603508543, 11399466652931338200, 2898113599278666684}, + }, + { + {7553418756944942759, 2324485560009697358, 16004009784734101843, 8345371056076551939}, + {7377284629098981027, 11049718262343754276, 8021605820736410979, 8175349759714152494}, + }, + { + {805625092558946929, 11996029844853502332, 1725029464967101849, 8189609560660709539}, + {10396089572662865065, 1756007811373736605, 7645529329516777410, 2608132938055260111}, + }, + { + {17014595621244604813, 1574499958190108567, 8684546755761322906, 9997538531915911005}, + {5652402150243592363, 6315865356369667235, 8687115108443972047, 12369176255146729475}, + }, + { + {5117004045853299762, 2238407612548002914, 12392667457861900490, 10614312910576266709}, + {6446577503758597410, 3767883614425995197, 17954966454260719539, 5233322901463099}, + }, + }, + { + { + {1081257522368061155, 16144982029632101790, 2280210790959566458, 5000326950136078873}, + {10441086845859171982, 5717080014740953823, 16816253740467637151, 5185838557034755093}, + }, + { + {3897734650128449985, 3892478283047854402, 153850176068596076, 4448963435449755938}, + {9911011406822436713, 6379744721342779297, 360324666931028426, 8002086405015565067}, + }, + { + {13662666854424521459, 17028614494600252018, 13372166182804100759, 8978661571842967509}, + {1689945315009228820, 9997133634912151808, 4070075534875432478, 5780712439158341418}, + }, + { + {18068291112584812890, 10288580446655316879, 16866690514199445805, 15458664010538199871}, + {17175925202246173890, 12208778610361755998, 927739404697616036, 10330183209424493139}, + }, + { + {4422872630455196261, 14815650254807917367, 9426346157598724768, 17764302665164113296}, + {9474027272970951461, 3048886202121388617, 7073604597785890399, 9516006646305083675}, + }, + { + {16541317581647968302, 7221753201217091047, 554497992080233562, 12743131795939254731}, + {6113032707000257613, 4448176364247161206, 738044254484725063, 3096942233684051465}, + }, + { + {2801392933730991479, 15502003900939246745, 11340323610824656109, 13690394827169426680}, + {2298413291804124677, 12243772219106809119, 9550327342593445260, 18354548835264437008}, + }, + { + {17095781462759061506, 13984950766342782369, 7038608479806172868, 7073471193601880894}, + {9212126909381119712, 15865851343492198107, 3874039137971369196, 15366505242302572319}, + }, + { + {10476508037395688256, 5905562397524931472, 15147896444621280595, 3856601647293477321}, + {4204909177546012159, 17515684210872904454, 12561834979880779760, 6477848309789627185}, + }, + { + {3226022509034031128, 5771385963704757771, 17861700165696478115, 14976034400726774156}, + {17945959497662269352, 6322288130414861016, 3008853024335853994, 5599925939427067989}, + }, + { + {15408448007738805625, 3855259080280453396, 11776434265478354726, 11784885919111239520}, + {8108981861486003291, 16553896039002150783, 5694423121092647200, 16414563259092889693}, + }, + { + {3235058267792568155, 8030551941244615429, 12851363585510555514, 9786973022560471711}, + {4901414898060251968, 13240438628487941170, 4707852389766057435, 6503805666511566831}, + }, + { + {1178073204986944698, 10685133932326477495, 11710162005310407793, 11019188929725710305}, + {16244991946372165706, 3272168887117805467, 15045747299972144833, 8155681972478369649}, + }, + { + {12308450869393289693, 14268794937571237354, 9141189178824378983, 11605207657904000518}, + {17071770108549330148, 11045960524457021256, 13807710432855107212, 8427718050873363613}, + }, + { + {16762196363426636910, 7316863360113205703, 7937998445095491508, 3946557199536080470}, + {16019910399697645039, 11522845950519380293, 2362453023191035102, 6547077716792082654}, + }, + }, + { + { + {5218985848865375996, 5835476376320976237, 9096499658845542933, 8952489298840360492}, + {16605895184424459659, 505731104315931813, 17784248872812610986, 4151555707609374291}, + }, + { + {4963953120977916566, 6585250545846301109, 4490972754776862709, 10674499592300479120}, + {17494988318349821345, 1814042777264686189, 8938395423478059768, 9062966010283426056}, + }, + { + {3879469818714011415, 11493820457829716643, 10091807027724827301, 5032134849078736052}, + {18015749204009276046, 9667758283246223357, 4629693773460610802, 3807196436109718946}, + }, + { + {5724217930909760221, 15420221591912350415, 9910465013739250802, 12511683773790779491}, + {2841532862707547306, 16614426471009646589, 407574220261191228, 17422057170120224031}, + }, + { + {3725101809714764432, 2995111022132376824, 9338883729618021504, 8824923738291347476}, + {3745497072215538317, 3576446898425965872, 2350077748663612773, 15793255155885543355}, + }, + { + {12904339001067417585, 1972265247859388742, 8908590936681392405, 10320719400504224158}, + {8298368064038407143, 2105745729886511647, 16509751074757847095, 15156289751671616565}, + }, + { + {885617946245226760, 17871561572095909264, 16413308527330544768, 2938750343525834336}, + {6332736376778563648, 16772687696658236231, 9760470695949399178, 17420556823805232882}, + }, + { + {4407657041250297528, 13832960959347315977, 15056546959967740939, 4350443362134191429}, + {8013419913016572733, 8888684099801298477, 15401479253620745715, 18279947201669400847}, + }, + { + {16774767206504477529, 15784248755460218800, 890363416232172440, 6798249980336291014}, + {1295939576916968887, 14501516576359061383, 5181286196215569291, 8884842683907072200}, + }, + { + {12906144535917740163, 4179201185048577793, 8949647323841299627, 2168773816567792706}, + {1715683170634778607, 9901501903322086192, 7624633731287546358, 10530124063631858009}, + }, + { + {14199956317346734484, 13250211595320054421, 18197952479293091552, 16161313407818957084}, + {17435507292968186894, 6560268436714668609, 1299607057816966726, 8157462320016248727}, + }, + { + {3603583288706717651, 17387128326071547512, 17907604816622771553, 17853094381965037384}, + {12273843852205811233, 13840584476006398280, 2018654168596055410, 11549248055135584644}, + }, + { + {4742377140579111706, 845465928037625085, 12028953960657292824, 16438644767032965255}, + {17377088622232632294, 1631558517096568450, 11363064014018667511, 6006029335296807862}, + }, + { + {8877393780281438935, 9848923171251074575, 1554975198005028643, 2251034043951525516}, + {9696558687758873050, 3889942916226212472, 8326933892612496812, 7463785348361544799}, + }, + { + {4205364996189816688, 5453611962777060261, 16993840011943171053, 11689161310506207011}, + {16699173739044458906, 6254168288000491517, 12642281218300963313, 10028950653175051753}, + }, + }, + { + { + {8784043285714375740, 8483257759279461889, 8789745728267363600, 1770019616739251654}, + {15992936863339206154, 10037038012062884956, 15197544864945402661, 9615747158586711429}, + }, + { + {9583737883674400333, 12279877754802111101, 8296198976379850969, 17778859909846088251}, + {3401986641240187301, 1525831644595056632, 1849003687033449918, 8702493044913179195}, + }, + { + {18423170064697770279, 12693387071620743675, 7398701556189346968, 2779682216903406718}, + {12703629940499916779, 6358598532389273114, 8683512038509439374, 15415938252666293255}, + }, + { + {8408419572923862476, 5066733120953500019, 926242532005776114, 6301489109130024811}, + {3285079390283344806, 1685054835664548935, 7740622190510199342, 9561507292862134371}, + }, + { + {13698695174800826869, 10442832251048252285, 10672604962207744524, 14485711676978308040}, + {16947216143812808464, 8342189264337602603, 3837253281927274344, 8331789856935110934}, + }, + { + {4627808394696681034, 6174000022702321214, 15351247319787348909, 1371147458593240691}, + {10651965436787680331, 2998319090323362997, 17592419471314886417, 11874181791118522207}, + }, + { + {524165018444839759, 3157588572894920951, 17599692088379947784, 1421537803477597699}, + {2902517390503550285, 7440776657136679901, 17263207614729765269, 16928425260420958311}, + }, + { + {2878166099891431311, 5056053391262430293, 10345032411278802027, 13214556496570163981}, + {17698482058276194679, 2441850938900527637, 1314061001345252336, 6263402014353842038}, + }, + { + {8487436533858443496, 12386798851261442113, 3224748875345095424, 16166568617729909099}, + {2213369110503306004, 6246347469485852131, 3129440554298978074, 605269941184323483}, + }, + { + {3177531230451277512, 11022989490494865721, 8321856985295555401, 14727273563873821327}, + {876865438755954294, 14139765236890058248, 6880705719513638354, 8678887646434118325}, + }, + { + {16896703203004244996, 11377226897030111200, 2302364246994590389, 4499255394192625779}, + {1906858144627445384, 2670515414718439880, 868537809054295101, 7535366755622172814}, + }, + { + {339769604981749608, 12384581172556225075, 2596838235904096350, 5684069910326796630}, + {913125548148611907, 1661497269948077623, 2892028918424825190, 9220412792897768138}, + }, + { + {14754959387565938441, 1023838193204581133, 13599978343236540433, 8323909593307920217}, + {3852032956982813055, 7526785533690696419, 8993798556223495105, 18140648187477079959}, + }, + { + {11692087196810962506, 1328079167955601379, 1664008958165329504, 18063501818261063470}, + {2861243404839114859, 13702578580056324034, 16781565866279299035, 1524194541633674171}, + }, + { + {8267721299596412251, 273633183929630283, 17164190306640434032, 16332882679719778825}, + {4663567915067622493, 15521151801790569253, 7273215397645141911, 2324445691280731636}, + }, + }, + } +} diff --git a/core/crypto/_weierstrass/tools/ecc_gen_tables.odin b/core/crypto/_weierstrass/tools/ecc_gen_tables.odin new file mode 100644 index 000000000..e69927a90 --- /dev/null +++ b/core/crypto/_weierstrass/tools/ecc_gen_tables.odin @@ -0,0 +1,99 @@ +package weistrass_tools + +import secec "core:crypto/_weierstrass" +import "core:fmt" +import path "core:path/filepath" +import "core:os" +import "core:strings" + +// Yes this leaks memory, fite me IRL. + +GENERATED :: `/* + ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ +*/` + +main :: proc() { + gen_p256r1_tables() +} + +gen_p256r1_tables :: proc() { + Affine_Point_p256r1 :: struct { + x: secec.Field_Element_p256r1, + y: secec.Field_Element_p256r1, + } + Multiply_Table_p256r1_hi: [32][15]Affine_Point_p256r1 + Multiply_Table_p256r1_lo: [32][15]Affine_Point_p256r1 + + g, p: secec.Point_p256r1 + secec.pt_generator(&g) + + // Precompute ([1,15] << n) * G multiples of G, MSB->LSB + for i in 0..<32 { + b: [32]byte + for j in 1..<16 { + b[i] = u8(j) << 4 + secec.pt_scalar_mul_bytes(&p, &g, b[:], true) + secec.pt_rescale(&p, &p) + secec.fe_set(&Multiply_Table_p256r1_hi[i][j-1].x, &p.x) + secec.fe_set(&Multiply_Table_p256r1_hi[i][j-1].y, &p.y) + + b[i] = u8(j) + secec.pt_scalar_mul_bytes(&p, &g, b[:], true) + secec.pt_rescale(&p, &p) + secec.fe_set(&Multiply_Table_p256r1_lo[i][j-1].x, &p.x) + secec.fe_set(&Multiply_Table_p256r1_lo[i][j-1].y, &p.y) + + b[i] = 0 + } + } + + fn := path.join({ODIN_ROOT, "core", "crypto", "_weierstrass", "secp256r1_table.odin"}) + bld: strings.Builder + w := strings.to_writer(&bld) + + fmt.wprintln(w, "package _weierstrass") + fmt.wprintln(w, "") + fmt.wprintln(w, GENERATED) + fmt.wprintln(w, "") + fmt.wprintln(w, "import \"core:crypto\"") + fmt.wprintln(w, "") + fmt.wprintln(w, "when crypto.COMPACT_IMPLS == false {") + + fmt.wprintln(w, "\t@(private,rodata)") + fmt.wprintln(w, "\tGen_Multiply_Table_p256r1_hi := [32][15]Affine_Point_p256r1 {") + for &v, i in Multiply_Table_p256r1_hi { + fmt.wprintln(w, "\t\t{") + for &ap, j in v { + fmt.wprintln(w, "\t\t\t{") + + x, y := &ap.x, &ap.y + fmt.wprintf(w, "\t\t\t\t{{%d, %d, %d, %d},\n", x[0], x[1], x[2], x[3]) + fmt.wprintf(w, "\t\t\t\t{{%d, %d, %d, %d},\n", y[0], y[1], y[2], y[3]) + + fmt.wprintln(w, "\t\t\t},") + } + fmt.wprintln(w, "\t\t},") + } + fmt.wprintln(w, "\t}\n") + + fmt.wprintln(w, "\t@(private,rodata)") + fmt.wprintln(w, "\tGen_Multiply_Table_p256r1_lo := [32][15]Affine_Point_p256r1 {") + for &v, i in Multiply_Table_p256r1_lo { + fmt.wprintln(w, "\t\t{") + for &ap, j in v { + fmt.wprintln(w, "\t\t\t{") + + x, y := &ap.x, &ap.y + fmt.wprintf(w, "\t\t\t\t{{%d, %d, %d, %d},\n", x[0], x[1], x[2], x[3]) + fmt.wprintf(w, "\t\t\t\t{{%d, %d, %d, %d},\n", y[0], y[1], y[2], y[3]) + + fmt.wprintln(w, "\t\t\t},") + } + fmt.wprintln(w, "\t\t},") + } + fmt.wprintln(w, "\t}") + + fmt.wprintln(w, "}") + + _ = os.write_entire_file(fn, transmute([]byte)(strings.to_string(bld))) +} diff --git a/core/crypto/crypto.odin b/core/crypto/crypto.odin index 435c5daaf..3fb369a54 100644 --- a/core/crypto/crypto.odin +++ b/core/crypto/crypto.odin @@ -5,6 +5,9 @@ import "base:runtime" import subtle "core:crypto/_subtle" import "core:mem" +// Omit large precomputed tables, trading off performance for size. +COMPACT_IMPLS: bool : #config(ODIN_CRYPTO_COMPACT, false) + // HAS_RAND_BYTES is true iff the runtime provides a cryptographic // entropy source. HAS_RAND_BYTES :: runtime.HAS_RAND_BYTES diff --git a/tests/core/crypto/test_core_crypto_weierstrass.odin b/tests/core/crypto/test_core_crypto_weierstrass.odin new file mode 100644 index 000000000..206e98bd7 --- /dev/null +++ b/tests/core/crypto/test_core_crypto_weierstrass.odin @@ -0,0 +1,486 @@ +package test_core_crypto + +import ec "core:crypto/_weierstrass" +import "core:encoding/hex" +import "core:math/big" +import "core:testing" + +@(private="file") +P256_G_X :: "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" +@(private="file") +P256_G_Y :: "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5" + +@(private="file") +P256_G_UNCOMPRESSED :: "04" + P256_G_X + P256_G_Y + +@(test) +test_p256_a :: proc(t: ^testing.T) { + a_str := "ffffffff00000001000000000000000000000000fffffffffffffffffffffffc" + + fe, a_fe: ec.Field_Element_p256r1 + ec.fe_a(&fe) + ec.fe_a(&a_fe) + + b: [32]byte + ec.fe_bytes(b[:], &fe) + + s := (string)(hex.encode(b[:], context.temp_allocator)) + + testing.expect(t, s == a_str) + + ec.fe_zero(&fe) + ec.fe_set_bytes(&fe, b[:]) + + testing.expect(t, ec.fe_equal(&fe, &a_fe) == 1) +} + +@(test) +test_p256_b :: proc(t: ^testing.T) { + b_str := "5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b" + + fe, b_fe: ec.Field_Element_p256r1 + ec.fe_b(&fe) + ec.fe_b(&b_fe) + + b: [32]byte + ec.fe_bytes(b[:], &fe) + + s := (string)(hex.encode(b[:], context.temp_allocator)) + + testing.expect(t, s == b_str) + + ec.fe_zero(&fe) + ec.fe_set_bytes(&fe, b[:]) + + testing.expect(t, ec.fe_equal(&fe, &b_fe) == 1) +} + +@(test) +test_p256_g_x :: proc(t: ^testing.T) { + fe, x_fe: ec.Field_Element_p256r1 + ec.fe_gen_x(&fe) + ec.fe_gen_x(&x_fe) + + b: [32]byte + ec.fe_bytes(b[:], &fe) + + s := (string)(hex.encode(b[:], context.temp_allocator)) + testing.expect(t, s == P256_G_X) + + ec.fe_zero(&fe) + ec.fe_set_bytes(&fe, b[:]) + + testing.expect(t, ec.fe_equal(&fe, &x_fe) == 1) +} + +@(test) +test_p256_g_y :: proc(t: ^testing.T) { + fe, y_fe: ec.Field_Element_p256r1 + ec.fe_gen_y(&fe) + ec.fe_gen_y(&y_fe) + + b: [32]byte + ec.fe_bytes(b[:], &fe) + + s := (string)(hex.encode(b[:], context.temp_allocator)) + testing.expect(t, s == P256_G_Y) + + ec.fe_zero(&fe) + ec.fe_set_bytes(&fe, b[:]) + + testing.expect(t, ec.fe_equal(&fe, &y_fe) == 1) +} + +@(test) +test_p256_scalar_reduce :: proc(t: ^testing.T) { + test_vectors := []struct { + raw: string, + reduced: string, + } { + // n + { + "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "0000000000000000000000000000000000000000000000000000000000000000", + }, + // n + 1 + { + "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552", + "0000000000000000000000000000000000000000000000000000000000000001", + }, + // 2^384 (Sage) + { + "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "431905529c0166ce652e96b7ccca0a99679b73e19ad16947f01cf013fc632551", + }, + // SHA384 odin-linux-amd64-dev-2026-01.tar.gz (Sage) + { + "87622f79b4b0e76001f9c99b0337b61a0bcd2b5a8e9a3937176825ad75ef0fe8742a348a251dd2682d711f76b33df3e6", + "f66db86e28d903033d1e17d818c0eb13fe3d1ae095b4d2ecbcd1a1eccf9f2f8c", + }, + // SHA512 odin-linux-amd64-dev-2026-01.tar.gz (Sage) + { + "6f85507cec3a35fdb3d4f40d23583681144561e77bc4ea88ab0ea219d5c17b7c9178f5f5a6296a2d18eddd4bdf19e61830fc85d7de23fd4fbde31c4cf6694719", + "3217ecbee32c8b0dfcca0f10a884fe43658fbe91458f25d0f1bf2075759c5ebe", + }, + } + + for v, _ in test_vectors { + raw_bytes, _ := hex.decode(transmute([]byte)(v.raw), context.temp_allocator) + + sc: ec.Scalar_p256r1 + _ = ec.sc_set_bytes(&sc, raw_bytes) + + b: [ec.SC_SIZE_P256R1]byte + ec.sc_bytes(b[:], &sc) + s := (string)(hex.encode(b[:], context.temp_allocator)) + + testing.expectf(t, v.reduced == s, "sc: raw %s reduced: %s, expected: %s", v.raw, s, v.reduced) + } +} + +@(test) +test_p256_scalar_mul :: proc(t: ^testing.T) { + test_vectors := []struct { + scalar: string, // NOTE: Base 10 + x, y: string, + } { + // Test vectors from http://point-at-infinity.org/ecc/nisttv + { + "1", + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", + + }, + { + "2", + "7CF27B188D034F7E8A52380304B51AC3C08969E277F21B35A60B48FC47669978", + "07775510DB8ED040293D9AC69F7430DBBA7DADE63CE982299E04B79D227873D1", + }, + { + "3", + "5ECBE4D1A6330A44C8F7EF951D4BF165E6C6B721EFADA985FB41661BC6E7FD6C", + "8734640C4998FF7E374B06CE1A64A2ECD82AB036384FB83D9A79B127A27D5032", + }, + { + "4", + "E2534A3532D08FBBA02DDE659EE62BD0031FE2DB785596EF509302446B030852", + "E0F1575A4C633CC719DFEE5FDA862D764EFC96C3F30EE0055C42C23F184ED8C6", + }, + { + "5", + "51590B7A515140D2D784C85608668FDFEF8C82FD1F5BE52421554A0DC3D033ED", + "E0C17DA8904A727D8AE1BF36BF8A79260D012F00D4D80888D1D0BB44FDA16DA4", + }, + { + "6", + "B01A172A76A4602C92D3242CB897DDE3024C740DEBB215B4C6B0AAE93C2291A9", + "E85C10743237DAD56FEC0E2DFBA703791C00F7701C7E16BDFD7C48538FC77FE2", + }, + { + "7", + "8E533B6FA0BF7B4625BB30667C01FB607EF9F8B8A80FEF5B300628703187B2A3", + "73EB1DBDE03318366D069F83A6F5900053C73633CB041B21C55E1A86C1F400B4", + }, + { + "8", + "62D9779DBEE9B0534042742D3AB54CADC1D238980FCE97DBB4DD9DC1DB6FB393", + "AD5ACCBD91E9D8244FF15D771167CEE0A2ED51F6BBE76A78DA540A6A0F09957E", + }, + { + "9", + "EA68D7B6FEDF0B71878938D51D71F8729E0ACB8C2C6DF8B3D79E8A4B90949EE0", + "2A2744C972C9FCE787014A964A8EA0C84D714FEAA4DE823FE85A224A4DD048FA", + }, + { + "10", + "CEF66D6B2A3A993E591214D1EA223FB545CA6C471C48306E4C36069404C5723F", + "878662A229AAAE906E123CDD9D3B4C10590DED29FE751EEECA34BBAA44AF0773", + }, + { + "11", + "3ED113B7883B4C590638379DB0C21CDA16742ED0255048BF433391D374BC21D1", + "9099209ACCC4C8A224C843AFA4F4C68A090D04DA5E9889DAE2F8EEFCE82A3740", + }, + { + "12", + "741DD5BDA817D95E4626537320E5D55179983028B2F82C99D500C5EE8624E3C4", + "0770B46A9C385FDC567383554887B1548EEB912C35BA5CA71995FF22CD4481D3", + }, + { + "13", + "177C837AE0AC495A61805DF2D85EE2FC792E284B65EAD58A98E15D9D46072C01", + "63BB58CD4EBEA558A24091ADB40F4E7226EE14C3A1FB4DF39C43BBE2EFC7BFD8", + }, + { + "14", + "54E77A001C3862B97A76647F4336DF3CF126ACBE7A069C5E5709277324D2920B", + "F599F1BB29F4317542121F8C05A2E7C37171EA77735090081BA7C82F60D0B375", + }, + { + "15", + "F0454DC6971ABAE7ADFB378999888265AE03AF92DE3A0EF163668C63E59B9D5F", + "B5B93EE3592E2D1F4E6594E51F9643E62A3B21CE75B5FA3F47E59CDE0D034F36", + }, + { + "16", + "76A94D138A6B41858B821C629836315FCD28392EFF6CA038A5EB4787E1277C6E", + "A985FE61341F260E6CB0A1B5E11E87208599A0040FC78BAA0E9DDD724B8C5110", + }, + { + "17", + "47776904C0F1CC3A9C0984B66F75301A5FA68678F0D64AF8BA1ABCE34738A73E", + "AA005EE6B5B957286231856577648E8381B2804428D5733F32F787FF71F1FCDC", + }, + { + "18", + "1057E0AB5780F470DEFC9378D1C7C87437BB4C6F9EA55C63D936266DBD781FDA", + "F6F1645A15CBE5DC9FA9B7DFD96EE5A7DCC11B5C5EF4F1F78D83B3393C6A45A2", + }, + { + "19", + "CB6D2861102C0C25CE39B7C17108C507782C452257884895C1FC7B74AB03ED83", + "58D7614B24D9EF515C35E7100D6D6CE4A496716E30FA3E03E39150752BCECDAA", + }, + { + "20", + "83A01A9378395BAB9BCD6A0AD03CC56D56E6B19250465A94A234DC4C6B28DA9A", + "76E49B6DE2F73234AE6A5EB9D612B75C9F2202BB6923F54FF8240AAA86F640B8", + }, + { + "112233445566778899", + "339150844EC15234807FE862A86BE77977DBFB3AE3D96F4C22795513AEAAB82F", + "B1C14DDFDC8EC1B2583F51E85A5EB3A155840F2034730E9B5ADA38B674336A21", + }, + { + "112233445566778899112233445566778899", + "1B7E046A076CC25E6D7FA5003F6729F665CC3241B5ADAB12B498CD32F2803264", + "BFEA79BE2B666B073DB69A2A241ADAB0738FE9D2DD28B5604EB8C8CF097C457B", + }, + { + "029852220098221261079183923314599206100666902414330245206392788703677545185283", + "9EACE8F4B071E677C5350B02F2BB2B384AAE89D58AA72CA97A170572E0FB222F", + "1BBDAEC2430B09B93F7CB08678636CE12EAAFD58390699B5FD2F6E1188FC2A78", + }, + { + "057896042899961394862005778464643882389978449576758748073725983489954366354431", + "878F22CC6DB6048D2B767268F22FFAD8E56AB8E2DC615F7BD89F1E350500DD8D", + "714A5D7BB901C9C5853400D12341A892EF45D87FC553786756C4F0C9391D763E", + }, + { + "57896042899961394862005778464643882389978449576758748073725983489954366354431", + "878F22CC6DB6048D2B767268F22FFAD8E56AB8E2DC615F7BD89F1E350500DD8D", + "714A5D7BB901C9C5853400D12341A892EF45D87FC553786756C4F0C9391D763E", + }, + { + "1766845392945710151501889105729049882997660004824848915955419660366636031", + "659A379625AB122F2512B8DADA02C6348D53B54452DFF67AC7ACE4E8856295CA", + "49D81AB97B648464D0B4A288BD7818FAB41A16426E943527C4FED8736C53D0F6", + }, + { + "28948025760307534517734791687894775804466072615242963443097661355606862201087", + "CBCEAAA8A4DD44BBCE58E8DB7740A5510EC2CB7EA8DA8D8F036B3FB04CDA4DE4", + "4BD7AA301A80D7F59FD983FEDBE59BB7B2863FE46494935E3745B360E32332FA", + }, + { + "113078210460870548944811695960290644973229224625838436424477095834645696384", + "F0C4A0576154FF3A33A3460D42EAED806E854DFA37125221D37935124BA462A4", + "5B392FA964434D29EEC6C9DBC261CF116796864AA2FAADB984A2DF38D1AEF7A3", + }, + { + "12078056106883488161242983286051341125085761470677906721917479268909056", + "5E6C8524B6369530B12C62D31EC53E0288173BD662BDF680B53A41ECBCAD00CC", + "447FE742C2BFEF4D0DB14B5B83A2682309B5618E0064A94804E9282179FE089F", + }, + { + "57782969857385448082319957860328652998540760998293976083718804450708503920639", + "03792E541BC209076A3D7920A915021ECD396A6EB5C3960024BE5575F3223484", + "FC774AE092403101563B712F68170312304F20C80B40C06282063DB25F268DE4", + }, + { + "57896017119460046759583662757090100341435943767777707906455551163257755533312", + "2379FF85AB693CDF901D6CE6F2473F39C04A2FE3DCD842CE7AAB0E002095BCF8", + "F8B476530A634589D5129E46F322B02FBC610A703D80875EE70D7CE1877436A1", + }, + { + "452312848374287284681282171017647412726433684238464212999305864837160993279", + "C1E4072C529BF2F44DA769EFC934472848003B3AF2C0F5AA8F8DDBD53E12ED7C", + "39A6EE77812BB37E8079CD01ED649D3830FCA46F718C1D3993E4A591824ABCDB", + }, + { + "904571339174065134293634407946054000774746055866917729876676367558469746684", + "34DFBC09404C21E250A9B40FA8772897AC63A094877DB65862B61BD1507B34F3", + "CF6F8A876C6F99CEAEC87148F18C7E1E0DA6E165FFC8ED82ABB65955215F77D3", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044349", + "83A01A9378395BAB9BCD6A0AD03CC56D56E6B19250465A94A234DC4C6B28DA9A", + "891B64911D08CDCC5195A14629ED48A360DDFD4596DC0AB007DBF5557909BF47", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044350", + "CB6D2861102C0C25CE39B7C17108C507782C452257884895C1FC7B74AB03ED83", + "A7289EB3DB2610AFA3CA18EFF292931B5B698E92CF05C1FC1C6EAF8AD4313255", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044351", + "1057E0AB5780F470DEFC9378D1C7C87437BB4C6F9EA55C63D936266DBD781FDA", + "090E9BA4EA341A246056482026911A58233EE4A4A10B0E08727C4CC6C395BA5D", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044352", + "47776904C0F1CC3A9C0984B66F75301A5FA68678F0D64AF8BA1ABCE34738A73E", + "55FFA1184A46A8D89DCE7A9A889B717C7E4D7FBCD72A8CC0CD0878008E0E0323", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044353", + "76A94D138A6B41858B821C629836315FCD28392EFF6CA038A5EB4787E1277C6E", + "567A019DCBE0D9F2934F5E4A1EE178DF7A665FFCF0387455F162228DB473AEEF", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044354", + "F0454DC6971ABAE7ADFB378999888265AE03AF92DE3A0EF163668C63E59B9D5F", + "4A46C11BA6D1D2E1B19A6B1AE069BC19D5C4DE328A4A05C0B81A6321F2FCB0C9", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044355", + "54E77A001C3862B97A76647F4336DF3CF126ACBE7A069C5E5709277324D2920B", + "0A660E43D60BCE8BBDEDE073FA5D183C8E8E15898CAF6FF7E45837D09F2F4C8A", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044356", + "177C837AE0AC495A61805DF2D85EE2FC792E284B65EAD58A98E15D9D46072C01", + "9C44A731B1415AA85DBF6E524BF0B18DD911EB3D5E04B20C63BC441D10384027", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044357", + "741DD5BDA817D95E4626537320E5D55179983028B2F82C99D500C5EE8624E3C4", + "F88F4B9463C7A024A98C7CAAB7784EAB71146ED4CA45A358E66A00DD32BB7E2C", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044358", + "3ED113B7883B4C590638379DB0C21CDA16742ED0255048BF433391D374BC21D1", + "6F66DF64333B375EDB37BC505B0B3975F6F2FB26A16776251D07110317D5C8BF", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044359", + "CEF66D6B2A3A993E591214D1EA223FB545CA6C471C48306E4C36069404C5723F", + "78799D5CD655517091EDC32262C4B3EFA6F212D7018AE11135CB4455BB50F88C", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044360", + "EA68D7B6FEDF0B71878938D51D71F8729E0ACB8C2C6DF8B3D79E8A4B90949EE0", + "D5D8BB358D36031978FEB569B5715F37B28EB0165B217DC017A5DDB5B22FB705", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044361", + "62D9779DBEE9B0534042742D3AB54CADC1D238980FCE97DBB4DD9DC1DB6FB393", + "52A533416E1627DCB00EA288EE98311F5D12AE0A4418958725ABF595F0F66A81", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044362", + "8E533B6FA0BF7B4625BB30667C01FB607EF9F8B8A80FEF5B300628703187B2A3", + "8C14E2411FCCE7CA92F9607C590A6FFFAC38C9CD34FBE4DE3AA1E5793E0BFF4B", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044363", + "B01A172A76A4602C92D3242CB897DDE3024C740DEBB215B4C6B0AAE93C2291A9", + "17A3EF8ACDC8252B9013F1D20458FC86E3FF0890E381E9420283B7AC7038801D", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044364", + "51590B7A515140D2D784C85608668FDFEF8C82FD1F5BE52421554A0DC3D033ED", + "1F3E82566FB58D83751E40C9407586D9F2FED1002B27F7772E2F44BB025E925B", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044365", + "E2534A3532D08FBBA02DDE659EE62BD0031FE2DB785596EF509302446B030852", + "1F0EA8A4B39CC339E62011A02579D289B103693D0CF11FFAA3BD3DC0E7B12739", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044366", + "5ECBE4D1A6330A44C8F7EF951D4BF165E6C6B721EFADA985FB41661BC6E7FD6C", + "78CB9BF2B6670082C8B4F931E59B5D1327D54FCAC7B047C265864ED85D82AFCD", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044367", + "7CF27B188D034F7E8A52380304B51AC3C08969E277F21B35A60B48FC47669978", + "F888AAEE24712FC0D6C26539608BCF244582521AC3167DD661FB4862DD878C2E", + }, + { + "115792089210356248762697446949407573529996955224135760342422259061068512044368", + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", + "B01CBD1C01E58065711814B583F061E9D431CCA994CEA1313449BF97C840AE0A", + }, + } + + for v, _ in test_vectors { + x_bytes, _ := hex.decode(transmute([]byte)(v.x), context.temp_allocator) + y_bytes, _ := hex.decode(transmute([]byte)(v.y), context.temp_allocator) + + k_big: big.Int + err := big.set(&k_big, v.scalar, 10, context.temp_allocator) + testing.expectf(t, err == nil, "failed to parse k", err) + + k_sz: int + k_sz, err = big.int_to_bytes_size(&k_big, allocator = context.temp_allocator) + testing.expect(t, err == nil) + + k_bytes := make([]byte, k_sz, context.temp_allocator) + err = big.int_to_bytes_big(&k_big, k_bytes, allocator = context.temp_allocator) + + p, q, expected, g: ec.Point_p256r1 + sc: ec.Scalar_p256r1 + + _ = ec.sc_set_bytes(&sc, k_bytes) + + ec.pt_generator(&g) + ok := ec.pt_set_xy_bytes(&expected, x_bytes, y_bytes) + testing.expectf(t, ok, "failed to set point; %s, %s", v.x, v.y) + + ec.pt_scalar_mul(&p, &g, &sc) + ec.pt_scalar_mul_generator(&q, &sc) + ec.pt_rescale(&p, &p) + ec.pt_rescale(&q, &q) + + testing.expect(t, ec.pt_equal(&p, &q) == 1) + testing.expectf(t, ec.pt_equal(&p, &expected) == 1, "sc: %s actual: %v expected: %v", v.scalar, &p, &expected) + } +} + +@(test) +test_p256_s11n_sec_identity ::proc(t: ^testing.T) { + p: ec.Point_p256r1 + + ec.pt_generator(&p) + ok := ec.pt_set_sec_bytes(&p, []byte{0x00}) + testing.expect(t, ok) + testing.expectf(t, ec.pt_is_identity(&p) == 1, "%v", p) + + b := []byte{0xff} + ok = ec.pt_sec_bytes(b, &p, true) + testing.expect(t, ok) + testing.expect(t, b[0] == 0x00) + + b = []byte{0xff} + ok = ec.pt_sec_bytes(b, &p, false) + testing.expect(t, ok) + testing.expect(t, b[0] == 0x00) +} + +@(test) +test_p256_s11n_sec_generator ::proc(t: ^testing.T) { + p, g: ec.Point_p256r1 + + ec.pt_generator(&g) + ec.pt_identity(&p) + + b: [65]byte + ok := ec.pt_sec_bytes(b[:], &g, false) + testing.expect(t, ok) + s := (string)(hex.encode(b[:], context.temp_allocator)) + testing.expectf(t, s == P256_G_UNCOMPRESSED, "g: %v bytes: %v, %v", g, P256_G_UNCOMPRESSED, s) + + ok = ec.pt_set_sec_bytes(&p, b[:]) + testing.expectf(t, ok, "%s", s) + testing.expect(t, ec.pt_equal(&g, &p) == 1) +} From c35b49bf6050ecdc456d3482ff0037067e640f7d Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 3 Jan 2026 23:42:06 +0900 Subject: [PATCH 280/766] core/crypto/ecdh: Initial import --- core/crypto/ecdh/doc.odin | 4 + core/crypto/ecdh/ecdh.odin | 404 ++++++++++++++++++ examples/all/all_js.odin | 1 + examples/all/all_main.odin | 1 + tests/benchmark/crypto/benchmark_ecc.odin | 87 ++-- tests/core/crypto/test_core_crypto_ecdh.odin | 154 +++++++ .../core/crypto/test_core_crypto_edwards.odin | 124 ------ 7 files changed, 597 insertions(+), 178 deletions(-) create mode 100644 core/crypto/ecdh/doc.odin create mode 100644 core/crypto/ecdh/ecdh.odin create mode 100644 tests/core/crypto/test_core_crypto_ecdh.odin diff --git a/core/crypto/ecdh/doc.odin b/core/crypto/ecdh/doc.odin new file mode 100644 index 000000000..e34f255f2 --- /dev/null +++ b/core/crypto/ecdh/doc.odin @@ -0,0 +1,4 @@ +/* +A generic interface to Elliptic Curve Diffie-Hellman key exchange. +*/ +package ecdh diff --git a/core/crypto/ecdh/ecdh.odin b/core/crypto/ecdh/ecdh.odin new file mode 100644 index 000000000..3e97ebdc7 --- /dev/null +++ b/core/crypto/ecdh/ecdh.odin @@ -0,0 +1,404 @@ +package ecdh + +import "core:crypto" +import secec "core:crypto/_weierstrass" +import "core:crypto/x25519" +import "core:crypto/x448" +import "core:mem" +import "core:reflect" + +// Note: For these primitives scalar size = point size +@(private="file") +X25519_Buf :: [x25519.SCALAR_SIZE]byte +@(private="file") +X448_Buf :: [x448.SCALAR_SIZE]byte + +// Curve the curve identifier associated with a given Private_Key +// or Public_Key +Curve :: enum { + Invalid, + SECP256R1, + X25519, + X448, +} + +// CURVE_NAMES is the Curve to curve name string. +CURVE_NAMES := [Curve]string { + .Invalid = "Invalid", + .SECP256R1 = "secp256r1", + .X25519 = "X25519", + .X448 = "X448", +} + +// PRIVATE_KEY_SIZES is the Curve to private key size in bytes. +PRIVATE_KEY_SIZES := [Curve]int { + .Invalid = 0, + .SECP256R1 = secec.SC_SIZE_P256R1, + .X25519 = x25519.SCALAR_SIZE, + .X448 = x448.SCALAR_SIZE, +} + +// PUBLIC_KEY_SIZES is the Curve to public key size in bytes. +PUBLIC_KEY_SIZES := [Curve]int { + .Invalid = 0, + .SECP256R1 = 1 + 2 * secec.FE_SIZE_P256R1, + .X25519 = x25519.POINT_SIZE, + .X448 = x448.POINT_SIZE, +} + +// SHARED_SECRET_SIZES is the Curve to shared secret size in bytes. +SHARED_SECRET_SIZES := [Curve]int { + .Invalid = 0, + .SECP256R1 = secec.FE_SIZE_P256R1, + .X25519 = x25519.POINT_SIZE, + .X448 = x448.POINT_SIZE, +} + +@(private="file") +_PRIV_IMPL_IDS := [Curve]typeid { + .Invalid = nil, + .SECP256R1 = typeid_of(secec.Scalar_p256r1), + .X25519 = typeid_of(X25519_Buf), + .X448 = typeid_of(X448_Buf), +} + +@(private="file") +_PUB_IMPL_IDS := [Curve]typeid { + .Invalid = nil, + .SECP256R1 = typeid_of(secec.Point_p256r1), + .X25519 = typeid_of(X25519_Buf), + .X448 = typeid_of(X448_Buf), +} + +// Private_Key is an ECDH private key. +Private_Key :: struct { + // WARNING: All of the members are to be treated as internal (ie: + // the Private_Key structure is intended to be opaque). + _curve: Curve, + _impl: union { + secec.Scalar_p256r1, + X25519_Buf, + X448_Buf, + }, + _pub_key: Public_Key, +} + +// Public_Key is an ECDH public key. +Public_Key :: struct { + // WARNING: All of the members are to be treated as internal (ie: + // the Public_Key structure is intended to be opaque). + _curve: Curve, + _impl: union { + secec.Point_p256r1, + X25519_Buf, + X448_Buf, + }, +} + +// private_key_generate uses the system entropy source to generate a new +// Private_Key. This will only fail iff the system entropy source is +// missing or broken. +private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { + private_key_clear(priv_key) + + if !crypto.HAS_RAND_BYTES { + return false + } + + reflect.set_union_variant_typeid( + priv_key._impl, + _PRIV_IMPL_IDS[curve], + ) + + #partial switch curve { + case .SECP256R1: + sc := &priv_key._impl.(secec.Scalar_p256r1) + + // 384-bits reduced makes the modulo bias insignificant + b: [48]byte = --- + defer (mem.zero_explicit(&b, size_of(b))) + for { + crypto.rand_bytes(b[:]) + _ = secec.sc_set_bytes(sc, b[:]) + if secec.sc_is_zero(sc) == 0 { // Likely + break + } + } + case .X25519: + sc := &priv_key._impl.(X25519_Buf) + crypto.rand_bytes(sc[:]) + case .X448: + sc := &priv_key._impl.(X448_Buf) + crypto.rand_bytes(sc[:]) + case: + panic("crypto/ecdh: invalid curve") + } + + priv_key._curve = curve + private_key_generate_public(priv_key) + + return true +} + +// private_key_set_bytes decodes a byte-encoded private key, and returns +// true iff the operation was successful. +private_key_set_bytes :: proc(priv_key: ^Private_Key, curve: Curve, b: []byte) -> bool { + private_key_clear(priv_key) + + if len(b) != PRIVATE_KEY_SIZES[curve] { + return false + } + + reflect.set_union_variant_typeid( + priv_key._impl, + _PRIV_IMPL_IDS[curve], + ) + + #partial switch curve { + case .SECP256R1: + sc := &priv_key._impl.(secec.Scalar_p256r1) + did_reduce := secec.sc_set_bytes(sc, b) + is_zero := secec.sc_is_zero(sc) == 1 + + // Reject `0` and scalars that are not less than the + // curve order. + if did_reduce || is_zero { + private_key_clear(priv_key) + return false + } + case .X25519: + sc := &priv_key._impl.(X25519_Buf) + copy(sc[:], b) + case .X448: + sc := &priv_key._impl.(X448_Buf) + copy(sc[:], b) + case: + panic("crypto/ecdh: invalid curve") + } + + priv_key._curve = curve + private_key_generate_public(priv_key) + + return true +} + +@(private="file") +private_key_generate_public :: proc(priv_key: ^Private_Key) { + switch &sc in priv_key._impl { + case secec.Scalar_p256r1: + pub_key: secec.Point_p256r1 = --- + secec.pt_scalar_mul_generator(&pub_key, &sc) + secec.pt_rescale(&pub_key, &pub_key) + priv_key._pub_key._impl = pub_key + case X25519_Buf: + pub_key: X25519_Buf = --- + x25519.scalarmult_basepoint(pub_key[:], sc[:]) + priv_key._pub_key._impl = pub_key + case X448_Buf: + pub_key: X448_Buf = --- + x448.scalarmult_basepoint(pub_key[:], sc[:]) + priv_key._pub_key._impl = pub_key + case: + panic("crypto/ecdh: invalid curve") + } + + priv_key._pub_key._curve = priv_key._curve +} + +// private_key_bytes sets dst to byte-encoding of priv_key. +private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { + ensure(priv_key._curve != .Invalid, "crypto/ecdh: uninitialized private key") + ensure(len(dst) == PRIVATE_KEY_SIZES[priv_key._curve], "crypto/ecdh: invalid destination size") + + #partial switch priv_key._curve { + case .SECP256R1: + sc := &priv_key._impl.(secec.Scalar_p256r1) + secec.sc_bytes(dst, sc) + case .X25519: + sc := &priv_key._impl.(X25519_Buf) + copy(dst, sc[:]) + case .X448: + sc := &priv_key._impl.(X448_Buf) + copy(dst, sc[:]) + case: + panic("crypto/ecdh: invalid curve") + } +} + +// private_key_equal returns true iff the private keys are equal, +// in constant time. +private_key_equal :: proc(p, q: ^Private_Key) -> bool { + if p._curve != q._curve { + return false + } + + #partial switch p._curve { + case .SECP256R1: + sc_p, sc_q := &p._impl.(secec.Scalar_p256r1), &q._impl.(secec.Scalar_p256r1) + return secec.sc_equal(sc_p, sc_q) == 1 + case .X25519: + b_p, b_q := &p._impl.(X25519_Buf), &q._impl.(X25519_Buf) + return crypto.compare_constant_time(b_p[:], b_q[:]) == 1 + case .X448: + b_p, b_q := &p._impl.(X448_Buf), &q._impl.(X448_Buf) + return crypto.compare_constant_time(b_p[:], b_q[:]) == 1 + case: + return false + } +} + +// private_key_clear clears priv_key to the uninitialized state. +private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { + mem.zero_explicit(priv_key, size_of(Private_Key)) +} + +// public_key_set_bytes decodes a byte-encoded public key, and returns +// true iff the operation was successful. +public_key_set_bytes :: proc(pub_key: ^Public_Key, curve: Curve, b: []byte) -> bool { + public_key_clear(pub_key) + + if len(b) != PUBLIC_KEY_SIZES[curve] { + return false + } + + reflect.set_union_variant_typeid( + pub_key._impl, + _PUB_IMPL_IDS[curve], + ) + + #partial switch curve { + case .SECP256R1: + if b[0] != secec.SEC_PREFIX_UNCOMPRESSED { + return false + } + + pt := &pub_key._impl.(secec.Point_p256r1) + ok := secec.pt_set_sec_bytes(pt, b) + if !ok || secec.pt_is_identity(pt) == 1 { + return false + } + case .X25519: + pt := &pub_key._impl.(X25519_Buf) + copy(pt[:], b) + case .X448: + pt := &pub_key._impl.(X448_Buf) + copy(pt[:], b) + case: + panic("crypto/ecdh: invalid curve") + } + + pub_key._curve = curve + + return true +} + +// public_key_set_priv sets pub_key to the public component of priv_key. +public_key_set_priv :: proc(pub_key: ^Public_Key, priv_key: ^Private_Key) { + ensure(priv_key._curve != .Invalid, "crypto/ecdh: uninitialized private key") + public_key_clear(pub_key) + pub_key^ = priv_key._pub_key +} + +// public_key_bytes sets dst to byte-encoding of pub_key. +public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { + ensure(pub_key._curve != .Invalid, "crypto/ecdh: uninitialized public key") + ensure(len(dst) == PUBLIC_KEY_SIZES[pub_key._curve], "crypto/ecdh: invalid destination size") + + #partial switch pub_key._curve { + case .SECP256R1: + // Invariant: Unless the caller is manually building pub_key + // `Z = 1`, so we can skip the rescale. + pt := &pub_key._impl.(secec.Point_p256r1) + + dst[0] = secec.SEC_PREFIX_UNCOMPRESSED + secec.fe_bytes(dst[1:1+secec.FE_SIZE_P256R1], &pt.x) + secec.fe_bytes(dst[1+secec.FE_SIZE_P256R1:], &pt.y) + case .X25519: + pt := &pub_key._impl.(X25519_Buf) + copy(dst, pt[:]) + case .X448: + pt := &pub_key._impl.(X448_Buf) + copy(dst, pt[:]) + case: + panic("crypto/ecdh: invalid curve") + } +} + +// public_key_equal returns true iff the public keys are equal, +// in constant time. +public_key_equal :: proc(p, q: ^Public_Key) -> bool { + if p._curve != q._curve { + return false + } + + #partial switch p._curve { + case .SECP256R1: + pt_p, pt_q := &p._impl.(secec.Point_p256r1), &q._impl.(secec.Point_p256r1) + return secec.pt_equal(pt_p, pt_q) == 1 + case .X25519: + b_p, b_q := &p._impl.(X25519_Buf), &q._impl.(X25519_Buf) + return crypto.compare_constant_time(b_p[:], b_q[:]) == 1 + case .X448: + b_p, b_q := &p._impl.(X448_Buf), &q._impl.(X448_Buf) + return crypto.compare_constant_time(b_p[:], b_q[:]) == 1 + case: + panic("crypto/ecdh: invalid curve") + } +} + +// public_key_clear clears pub_key to the uninitialized state. +public_key_clear :: proc "contextless" (pub_key: ^Public_Key) { + mem.zero_explicit(pub_key, size_of(Public_Key)) +} + +// ecdh performs an Elliptic Curve Diffie-Hellman key exchange betwween +// the Private_Key and Public_Key, writing the shared secret to dst. +// +// The neutral element is rejected as an error. +@(require_results) +ecdh :: proc(priv_key: ^Private_Key, pub_key: ^Public_Key, dst: []byte) -> bool { + ensure(priv_key._curve == pub_key._curve, "crypto/ecdh: curve mismatch") + ensure(pub_key._curve != .Invalid, "crypto/ecdh: uninitialized public key") + ensure(len(dst) == SHARED_SECRET_SIZES[priv_key._curve], "crypto/ecdh: invalid shared secret size") + + #partial switch priv_key._curve { + case .SECP256R1: + sc, pt := &priv_key._impl.(secec.Scalar_p256r1), &pub_key._impl.(secec.Point_p256r1) + ss: secec.Point_p256r1 + defer secec.pt_clear(&ss) + + secec.pt_scalar_mul(&ss, pt, sc) + return secec.pt_bytes(dst, nil, &ss) + case .X25519: + sc, pt := &priv_key._impl.(X25519_Buf), &pub_key._impl.(X25519_Buf) + x25519.scalarmult(dst, sc[:], pt[:]) + case .X448: + sc, pt := &priv_key._impl.(X448_Buf), &pub_key._impl.(X448_Buf) + x448.scalarmult(dst, sc[:], pt[:]) + case: + panic("crypto/ecdh: invalid curve") + } + + // X25519/X448 check for all zero digest. + return crypto.is_zero_constant_time(dst) == 0 +} + +// curve returns the Curve used by a Private_Key or Public_Key instance. +curve :: proc(k: ^$T) -> Curve where(T == Private_Key || T == Public_Key) { + return k._curve +} + +// key_size returns the key size of a Private_Key or Public_Key in bytes. +key_size :: proc(k: ^$T) -> int where(T == Private_Key || T == Public_Key) { + when T == Private_Key { + return PRIVATE_KEY_SIZES[k._curve] + } else { + return PUBLIC_KEY_SIZES[k._curve] + } +} + +// shared_secret_size returns the shared secret size of a key exchange +// in bytes. +shared_secret_size :: proc(k: ^$T) -> int where(T == Private_Key || T == Public_Key) { + return SHARED_SECRET_SIZES[k._curve] +} diff --git a/examples/all/all_js.odin b/examples/all/all_js.odin index 28b85f537..ee006ae86 100644 --- a/examples/all/all_js.odin +++ b/examples/all/all_js.odin @@ -33,6 +33,7 @@ package all @(require) import "core:crypto/chacha20poly1305" @(require) import chash "core:crypto/hash" @(require) import "core:crypto/deoxysii" +@(require) import "core:crypto/ecdh" @(require) import "core:crypto/ed25519" @(require) import "core:crypto/hkdf" @(require) import "core:crypto/hmac" diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 9a7613ba5..a7f230022 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -37,6 +37,7 @@ package all @(require) import "core:crypto/chacha20poly1305" @(require) import chash "core:crypto/hash" @(require) import "core:crypto/deoxysii" +@(require) import "core:crypto/ecdh" @(require) import "core:crypto/ed25519" @(require) import "core:crypto/hkdf" @(require) import "core:crypto/hmac" diff --git a/tests/benchmark/crypto/benchmark_ecc.odin b/tests/benchmark/crypto/benchmark_ecc.odin index 16ca798dc..52a1a4ac1 100644 --- a/tests/benchmark/crypto/benchmark_ecc.odin +++ b/tests/benchmark/crypto/benchmark_ecc.odin @@ -2,13 +2,14 @@ package benchmark_core_crypto import "base:runtime" import "core:encoding/hex" +import "core:log" import "core:testing" import "core:text/table" import "core:time" +import "core:crypto" +import "core:crypto/ecdh" import "core:crypto/ed25519" -import "core:crypto/x25519" -import "core:crypto/x448" @(private = "file") ECDH_ITERS :: 10000 @@ -25,6 +26,10 @@ benchmark_crypto_ecc :: proc(t: ^testing.T) { @(private = "file") bench_ecdh :: proc() { + if !crypto.HAS_RAND_BYTES { + log.warnf("ECDH benchmarks skipped, no system entropy source") + } + tbl: table.Table table.init(&tbl) defer table.destroy(&tbl) @@ -42,63 +47,37 @@ bench_ecdh :: proc() { ) } - scalar_bp, scalar := bench_x25519() - append_tbl(&tbl, "X25519", scalar_bp, scalar) + for algo in ecdh.Curve { + if algo == .Invalid { + continue + } + algo_name := ecdh.CURVE_NAMES[algo] - scalar_bp, scalar = bench_x448() - append_tbl(&tbl, "X448", scalar_bp, scalar) + priv_key_alice: ecdh.Private_Key + start := time.tick_now() + for _ in 0 ..< ECDH_ITERS { + _ = ecdh.private_key_generate(&priv_key_alice, algo) + } + bp := time.tick_since(start) / ECDH_ITERS + + pub_key_alice: ecdh.Public_Key + ecdh.public_key_set_priv(&pub_key_alice, &priv_key_alice) + + priv_key_bob: ecdh.Private_Key + _ = ecdh.private_key_generate(&priv_key_bob, algo) + ss := make([]byte, ecdh.SHARED_SECRET_SIZES[algo], context.temp_allocator) + start = time.tick_now() + for _ in 0 ..< ECDH_ITERS { + _ = ecdh.ecdh(&priv_key_bob, &pub_key_alice, ss) + } + sc := time.tick_since(start) / ECDH_ITERS + + append_tbl(&tbl, algo_name, bp, sc) + } log_table(&tbl) } -@(private = "file") -bench_x25519 :: proc() -> (bp, sc: time.Duration) { - point_str := "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" - scalar_str := "cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe" - - point, _ := hex.decode(transmute([]byte)(point_str), context.temp_allocator) - scalar, _ := hex.decode(transmute([]byte)(scalar_str), context.temp_allocator) - out: [x25519.POINT_SIZE]byte = --- - - start := time.tick_now() - for _ in 0 ..< ECDH_ITERS { - x25519.scalarmult_basepoint(out[:], scalar[:]) - } - bp = time.tick_since(start) / ECDH_ITERS - - start = time.tick_now() - for _ in 0 ..< ECDH_ITERS { - x25519.scalarmult(out[:], scalar[:], point[:]) - } - sc = time.tick_since(start) / ECDH_ITERS - - return -} - -@(private = "file") -bench_x448 :: proc() -> (bp, sc: time.Duration) { - point_str := "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" - scalar_str := "cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe" - - point, _ := hex.decode(transmute([]byte)(point_str), context.temp_allocator) - scalar, _ := hex.decode(transmute([]byte)(scalar_str), context.temp_allocator) - out: [x448.POINT_SIZE]byte = --- - - start := time.tick_now() - for _ in 0 ..< ECDH_ITERS { - x448.scalarmult_basepoint(out[:], scalar[:]) - } - bp = time.tick_since(start) / ECDH_ITERS - - start = time.tick_now() - for _ in 0 ..< ECDH_ITERS { - x448.scalarmult(out[:], scalar[:], point[:]) - } - sc = time.tick_since(start) / ECDH_ITERS - - return -} - @(private = "file") bench_dsa :: proc() { tbl: table.Table diff --git a/tests/core/crypto/test_core_crypto_ecdh.odin b/tests/core/crypto/test_core_crypto_ecdh.odin new file mode 100644 index 000000000..87c9e8a4d --- /dev/null +++ b/tests/core/crypto/test_core_crypto_ecdh.odin @@ -0,0 +1,154 @@ +package test_core_crypto + +import "core:encoding/hex" +import "core:testing" + +import "core:crypto/ecdh" + +@(test) +test_ecdh :: proc(t: ^testing.T) { + test_vectors := []struct { + curve: ecdh.Curve, + scalar: string, + point: string, + product: string, + } { + // X25519 Test vectors from RFC 7748 + { + .X25519, + "a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4", + "e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c", + "c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552", + }, + { + .X25519, + "4b66e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba0d", + "e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a493", + "95cbde9476e8907d7aade45cb4b873f88b595a68799fa152e6f8f7647aac7957", + }, + // X448 Test vectors from RFC 7748 + { + .X448, + "3d262fddf9ec8e88495266fea19a34d28882acef045104d0d1aae121700a779c984c24f8cdd78fbff44943eba368f54b29259a4f1c600ad3", + "06fce640fa3487bfda5f6cf2d5263f8aad88334cbd07437f020f08f9814dc031ddbdc38c19c6da2583fa5429db94ada18aa7a7fb4ef8a086", + "ce3e4ff95a60dc6697da1db1d85e6afbdf79b50a2412d7546d5f239fe14fbaadeb445fc66a01b0779d98223961111e21766282f73dd96b6f", + }, + { + .X448, + "203d494428b8399352665ddca42f9de8fef600908e0d461cb021f8c538345dd77c3e4806e25f46d3315c44e0a5b4371282dd2c8d5be3095f", + "0fbcc2f993cd56d3305b0b7d9e55d4c1a8fb5dbb52f8e9a1e9b6201b165d015894e56c4d3570bee52fe205e28a78b91cdfbde71ce8d157db", + "884a02576239ff7a2f2f63b2db6a9ff37047ac13568e1e30fe63c4a7ad1b3ee3a5700df34321d62077e63633c575c1c954514e99da7c179d", + }, + // secp256r1 Test vectors (subset) from NIST CAVP + { + .SECP256R1, + "7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534", + "04700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac", + "46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b", + }, + { + .SECP256R1, + "38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5", + "04809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7aeb29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3", + "057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67", + }, + } + + for v, _ in test_vectors { + raw_scalar, _ := hex.decode(transmute([]byte)(v.scalar), context.temp_allocator) + raw_point, _ := hex.decode(transmute([]byte)(v.point), context.temp_allocator) + + pub_key: ecdh.Public_Key + priv_key: ecdh.Private_Key + + ok := ecdh.private_key_set_bytes(&priv_key, v.curve, raw_scalar) + testing.expectf(t, ok, "failed to deserialize private key: %v %x", v.curve, raw_scalar) + + ok = ecdh.public_key_set_bytes(&pub_key, v.curve, raw_point) + testing.expectf(t, ok, "failed to deserialize public key: %v %x", v.curve, raw_scalar) + + shared_secret := make([]byte, ecdh.shared_secret_size(&pub_key), context.temp_allocator) + ok = ecdh.ecdh(&priv_key, &pub_key, shared_secret) + testing.expectf(t, ok, "ecdh failed: %v %v %v", v.curve, &priv_key, &pub_key) + + ss_str := string(hex.encode(shared_secret, context.temp_allocator)) + testing.expectf( + t, + ss_str == v.product, + "Expected %s for %v %s * %s, but got %s instead", + v.product, + v.curve, + v.scalar, + v.point, + ss_str, + ) + } +} + +@(test) +test_ecdh_scalar_basemult :: proc(t: ^testing.T) { + test_vectors := []struct { + curve: ecdh.Curve, + scalar : string, + point: string, + } { + // X25519 from RFC 7748 6.1 + { + .X25519, + "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a", + "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a", + }, + { + .X25519, + "5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb", + "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f", + }, + // X448 from RFC 7748 6.2 + { + .X448, + "9a8f4925d1519f5775cf46b04b5800d4ee9ee8bae8bc5565d498c28dd9c9baf574a9419744897391006382a6f127ab1d9ac2d8c0a598726b", + "9b08f7cc31b7e3e67d22d5aea121074a273bd2b83de09c63faa73d2c22c5d9bbc836647241d953d40c5b12da88120d53177f80e532c41fa0", + }, + { + .X448, + "1c306a7ac2a0e2e0990b294470cba339e6453772b075811d8fad0d1d6927c120bb5ee8972b0d3e21374c9c921b09d1b0366f10b65173992d", + "3eb7a829b0cd20f5bcfc0b599b6feccf6da4627107bdb0d4f345b43027d8b972fc3e34fb4232a13ca706dcb57aec3dae07bdc1c67bf33609", + }, + // secp256r1 Test vectors (subset) from NIST CAVP + { + .SECP256R1, + "7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534", + "04ead218590119e8876b29146ff89ca61770c4edbbf97d38ce385ed281d8a6b23028af61281fd35e2fa7002523acc85a429cb06ee6648325389f59edfce1405141", + }, + { + .SECP256R1, + "38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5", + "04119f2f047902782ab0c9e27a54aff5eb9b964829ca99c06b02ddba95b0a3f6d08f52b726664cac366fc98ac7a012b2682cbd962e5acb544671d41b9445704d1d", + }, + } + + for v, _ in test_vectors { + raw_scalar, _ := hex.decode(transmute([]byte)(v.scalar), context.temp_allocator) + + priv_key: ecdh.Private_Key + pub_key: ecdh.Public_Key + + ok := ecdh.private_key_set_bytes(&priv_key, v.curve, raw_scalar) + testing.expectf(t, ok, "failed to deserialize private key: %v %x", v.curve, raw_scalar) + + ecdh.public_key_set_priv(&pub_key, &priv_key) + b := make([]byte, ecdh.key_size(&pub_key), context.temp_allocator) + ecdh.public_key_bytes(&pub_key, b) + + pub_str := string(hex.encode(b, context.temp_allocator)) + testing.expectf( + t, + pub_str == v.point, + "Expected %s for %v %s * G, but got %s instead", + v.point, + v.curve, + v.scalar, + pub_str, + ) + } +} \ No newline at end of file diff --git a/tests/core/crypto/test_core_crypto_edwards.odin b/tests/core/crypto/test_core_crypto_edwards.odin index a1307da24..2da98000c 100644 --- a/tests/core/crypto/test_core_crypto_edwards.odin +++ b/tests/core/crypto/test_core_crypto_edwards.odin @@ -6,8 +6,6 @@ import "core:testing" import field "core:crypto/_fiat/field_curve25519" import "core:crypto/ed25519" import "core:crypto/ristretto255" -import "core:crypto/x25519" -import "core:crypto/x448" @(test) test_edwards25519_sqrt_ratio_m1 :: proc(t: ^testing.T) { @@ -625,128 +623,6 @@ test_ed25519 :: proc(t: ^testing.T) { } } -@(test) -test_x25519 :: proc(t: ^testing.T) { - // Local copy of this so that the base point doesn't need to be exported. - _BASE_POINT: [32]byte = { - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - } - - test_vectors := []struct { - scalar: string, - point: string, - product: string, - } { - // Test vectors from RFC 7748 - { - "a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4", - "e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c", - "c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552", - }, - { - "4b66e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba0d", - "e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a493", - "95cbde9476e8907d7aade45cb4b873f88b595a68799fa152e6f8f7647aac7957", - }, - } - for v, _ in test_vectors { - scalar, _ := hex.decode(transmute([]byte)(v.scalar), context.temp_allocator) - point, _ := hex.decode(transmute([]byte)(v.point), context.temp_allocator) - - derived_point: [x25519.POINT_SIZE]byte - x25519.scalarmult(derived_point[:], scalar[:], point[:]) - derived_point_str := string(hex.encode(derived_point[:], context.temp_allocator)) - - testing.expectf( - t, - derived_point_str == v.product, - "Expected %s for %s * %s, but got %s instead", - v.product, - v.scalar, - v.point, - derived_point_str, - ) - - // Abuse the test vectors to sanity-check the scalar-basepoint multiply. - p1, p2: [x25519.POINT_SIZE]byte - x25519.scalarmult_basepoint(p1[:], scalar[:]) - x25519.scalarmult(p2[:], scalar[:], _BASE_POINT[:]) - p1_str := string(hex.encode(p1[:], context.temp_allocator)) - p2_str := string(hex.encode(p2[:], context.temp_allocator)) - testing.expectf( - t, - p1_str == p2_str, - "Expected %s for %s * basepoint, but got %s instead", - p2_str, - v.scalar, - p1_str, - ) - } -} - -@(test) -test_x448 :: proc(t: ^testing.T) { - // Local copy of this so that the base point doesn't need to be exported. - _BASE_POINT: [56]byte = { - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - } - - test_vectors := []struct { - scalar: string, - point: string, - product: string, - } { - // Test vectors from RFC 7748 - { - "3d262fddf9ec8e88495266fea19a34d28882acef045104d0d1aae121700a779c984c24f8cdd78fbff44943eba368f54b29259a4f1c600ad3", - "06fce640fa3487bfda5f6cf2d5263f8aad88334cbd07437f020f08f9814dc031ddbdc38c19c6da2583fa5429db94ada18aa7a7fb4ef8a086", - "ce3e4ff95a60dc6697da1db1d85e6afbdf79b50a2412d7546d5f239fe14fbaadeb445fc66a01b0779d98223961111e21766282f73dd96b6f", - }, - { - "203d494428b8399352665ddca42f9de8fef600908e0d461cb021f8c538345dd77c3e4806e25f46d3315c44e0a5b4371282dd2c8d5be3095f", - "0fbcc2f993cd56d3305b0b7d9e55d4c1a8fb5dbb52f8e9a1e9b6201b165d015894e56c4d3570bee52fe205e28a78b91cdfbde71ce8d157db", - "884a02576239ff7a2f2f63b2db6a9ff37047ac13568e1e30fe63c4a7ad1b3ee3a5700df34321d62077e63633c575c1c954514e99da7c179d", - }, - } - for v, _ in test_vectors { - scalar, _ := hex.decode(transmute([]byte)(v.scalar), context.temp_allocator) - point, _ := hex.decode(transmute([]byte)(v.point), context.temp_allocator) - - derived_point: [x448.POINT_SIZE]byte - x448.scalarmult(derived_point[:], scalar[:], point[:]) - derived_point_str := string(hex.encode(derived_point[:], context.temp_allocator)) - - testing.expectf( - t, - derived_point_str == v.product, - "Expected %s for %s * %s, but got %s instead", - v.product, - v.scalar, - v.point, - derived_point_str, - ) - - // Abuse the test vectors to sanity-check the scalar-basepoint multiply. - p1, p2: [x448.POINT_SIZE]byte - x448.scalarmult_basepoint(p1[:], scalar[:]) - x448.scalarmult(p2[:], scalar[:], _BASE_POINT[:]) - p1_str := string(hex.encode(p1[:], context.temp_allocator)) - p2_str := string(hex.encode(p2[:], context.temp_allocator)) - testing.expectf( - t, - p1_str == p2_str, - "Expected %s for %s * basepoint, but got %s instead", - p2_str, - v.scalar, - p1_str, - ) - } -} - @(private="file") ge_str :: proc(ge: ^ristretto255.Group_Element) -> string { b: [ristretto255.ELEMENT_SIZE]byte From f5b7274a77f008e5df722d442870619a3769a0f9 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Wed, 21 Jan 2026 00:43:10 +0900 Subject: [PATCH 281/766] core/crypto/_edwards25519: Support `crypto.COMPACT_IMPLS` --- core/crypto/_edwards25519/edwards25519.odin | 4 +- .../edwards25519_scalar_mul.odin | 133 +- .../edwards25519_scalar_mul_base.odin | 147 + .../_edwards25519/edwards25519_table.odin | 4947 +++++++++++++++++ .../tools/edwards_gen_tables.odin | 134 + core/crypto/x25519/x25519.odin | 49 +- 6 files changed, 5288 insertions(+), 126 deletions(-) create mode 100644 core/crypto/_edwards25519/edwards25519_scalar_mul_base.odin create mode 100644 core/crypto/_edwards25519/edwards25519_table.odin create mode 100644 core/crypto/_edwards25519/tools/edwards_gen_tables.odin diff --git a/core/crypto/_edwards25519/edwards25519.odin b/core/crypto/_edwards25519/edwards25519.odin index d6f01d497..12192102d 100644 --- a/core/crypto/_edwards25519/edwards25519.odin +++ b/core/crypto/_edwards25519/edwards25519.odin @@ -195,7 +195,6 @@ ge_generator :: proc "contextless" (ge: ^Group_Element) { ge_set(ge, &GE_BASEPOINT) } -@(private) Addend_Group_Element :: struct { y2_minus_x2: field.Loose_Field_Element, // t1 y2_plus_x2: field.Loose_Field_Element, // t3 @@ -203,7 +202,6 @@ Addend_Group_Element :: struct { two_times_z2: field.Loose_Field_Element, // t5 } -@(private) ge_addend_set :: proc "contextless" (ge_a: ^Addend_Group_Element, ge: ^Group_Element) { field.fe_sub(&ge_a.y2_minus_x2, &ge.y, &ge.x) field.fe_add(&ge_a.y2_plus_x2, &ge.y, &ge.x) @@ -420,6 +418,6 @@ ge_in_prime_order_subgroup_vartime :: proc "contextless" (ge: ^Group_Element) -> // that is a ~50% speedup, and a lot of added complexity for something // that is better solved by "just use ristretto255". tmp: Group_Element = --- - _ge_scalarmult(&tmp, ge, &SC_ELL, true) + ge_scalarmult_raw(&tmp, ge, &SC_ELL, true) return ge_equal(&tmp, &GE_IDENTITY) == 1 } diff --git a/core/crypto/_edwards25519/edwards25519_scalar_mul.odin b/core/crypto/_edwards25519/edwards25519_scalar_mul.odin index 6e0eb42c7..d4ffa1075 100644 --- a/core/crypto/_edwards25519/edwards25519_scalar_mul.odin +++ b/core/crypto/_edwards25519/edwards25519_scalar_mul.odin @@ -1,130 +1,24 @@ package _edwards25519 +import "core:crypto" import field "core:crypto/_fiat/field_scalar25519" import subtle "core:crypto/_subtle" import "core:mem" -// GE_BASEPOINT_TABLE is 1 * G, ... 15 * G, in precomputed format. -// -// Note: When generating, the values were reduced to Tight_Field_Element -// ranges, even though that is not required. -@(private,rodata) -GE_BASEPOINT_TABLE := Multiply_Table { - { - {62697248952638, 204681361388450, 631292143396476, 338455783676468, 1213667448819585}, - {1288382639258501, 245678601348599, 269427782077623, 1462984067271730, 137412439391563}, - {301289933810280, 1259582250014073, 1422107436869536, 796239922652654, 1953934009299142}, - {2, 0, 0, 0, 0}, - }, - { - {1519297034332653, 1098796920435767, 1823476547744119, 808144629470969, 2110930855619772}, - {338005982828284, 1667856962156925, 100399270107451, 1604566703601691, 1950338038771369}, - {1920505767731247, 1443759578976892, 1659852098357048, 1484431291070208, 275018744912646}, - {763163817085987, 2195095074806923, 2167883174351839, 1868059999999762, 911071066608705}, - }, - { - {960627541894068, 1314966688943942, 1126875971034044, 2059608312958945, 605975666152586}, - {1714478358025626, 2209607666607510, 1600912834284834, 496072478982142, 481970031861896}, - {851735079403194, 1088965826757164, 141569479297499, 602804610059257, 2004026468601520}, - {197585529552380, 324719066578543, 564481854250498, 1173818332764578, 35452976395676}, - }, - { - {1152980410747203, 2196804280851952, 25745194962557, 1915167295473129, 1266299690309224}, - {809905889679060, 979732230071345, 1509972345538142, 188492426534402, 818965583123815}, - {997685409185036, 1451818320876327, 2126681166774509, 2000509606057528, 235432372486854}, - {887734189279642, 1460338685162044, 877378220074262, 102436391401299, 153369156847490}, - }, - { - {2056621900836770, 1821657694132497, 1627986892909426, 1163363868678833, 1108873376459226}, - {1187697490593623, 1066539945237335, 885654531892000, 1357534489491782, 359370291392448}, - {1509033452137525, 1305318174298508, 613642471748944, 1987256352550234, 1044283663101541}, - {220105720697037, 387661783287620, 328296827867762, 360035589590664, 795213236824054}, - }, - { - {1820794733038396, 1612235121681074, 757405923441402, 1094031020892801, 231025333128907}, - {1639067873254194, 1484176557946322, 300800382144789, 1329915446659183, 1211704578730455}, - {641900794791527, 1711751746971612, 179044712319955, 576455585963824, 1852617592509865}, - {743549047192397, 685091042550147, 1952415336873496, 1965124675654685, 513364998442917}, - }, - { - {1004557076870448, 1762911374844520, 1330807633622723, 384072910939787, 953849032243810}, - {2178275058221458, 257933183722891, 376684351537894, 2010189102001786, 1981824297484148}, - {1332915663881114, 1286540505502549, 1741691283561518, 977214932156314, 1764059494778091}, - {429702949064027, 1368332611650677, 2019867176450999, 2212258376161746, 526160996742554}, - }, - { - {2098932988258576, 2203688382075948, 2120400160059479, 1748488020948146, 1203264167282624}, - {677131386735829, 1850249298025188, 672782146532031, 2144145693078904, 2088656272813787}, - {1065622343976192, 1573853211848116, 223560413590068, 333846833073379, 27832122205830}, - {1781008836504573, 917619542051793, 544322748939913, 882577394308384, 1720521246471195}, - }, - { - {660120928379860, 2081944024858618, 1878411111349191, 424587356517195, 2111317439894005}, - {1834193977811532, 1864164086863319, 797334633289424, 150410812403062, 2085177078466389}, - {1438117271371866, 783915531014482, 388731514584658, 292113935417795, 1945855002546714}, - {1678140823166658, 679103239148744, 614102761596238, 1052962498997885, 1863983323810390}, - }, - { - {1690309392496233, 1116333140326275, 1377242323631039, 717196888780674, 82724646713353}, - {1722370213432106, 74265192976253, 264239578448472, 1714909985012994, 2216984958602173}, - {2010482366920922, 1294036471886319, 566466395005815, 1631955803657320, 1751698647538458}, - {1073230604155753, 1159087041338551, 1664057985455483, 127472702826203, 1339591128522371}, - }, - { - {478053307175577, 2179515791720985, 21146535423512, 1831683844029536, 462805561553981}, - {1945267486565588, 1298536818409655, 2214511796262989, 1904981051429012, 252904800782086}, - {268945954671210, 222740425595395, 1208025911856230, 1080418823003555, 75929831922483}, - {1884784014268948, 643868448202966, 978736549726821, 46385971089796, 1296884812292320}, - }, - { - {1861159462859103, 7077532564710, 963010365896826, 1938780006785270, 766241051941647}, - {1778966986051906, 1713995999765361, 1394565822271816, 1366699246468722, 1213407027149475}, - {1978989286560907, 2135084162045594, 1951565508865477, 671788336314416, 293123929458176}, - {902608944504080, 2167765718046481, 1285718473078022, 1222562171329269, 492109027844479}, - }, - { - {1820807832746213, 1029220580458586, 1101997555432203, 1039081975563572, 202477981158221}, - {1866134980680205, 2222325502763386, 1830284629571201, 1046966214478970, 418381946936795}, - {1783460633291322, 1719505443254998, 1810489639976220, 877049370713018, 2187801198742619}, - {197118243000763, 305493867565736, 518814410156522, 1656246186645170, 901894734874934}, - }, - { - {225454942125915, 478410476654509, 600524586037746, 643450007230715, 1018615928259319}, - {1733330584845708, 881092297970296, 507039890129464, 496397090721598, 2230888519577628}, - {690155664737246, 1010454785646677, 753170144375012, 1651277613844874, 1622648796364156}, - {1321310321891618, 1089655277873603, 235891750867089, 815878279563688, 1709264240047556}, - }, - { - {805027036551342, 1387174275567452, 1156538511461704, 1465897486692171, 1208567094120903}, - {2228417017817483, 202885584970535, 2182114782271881, 2077405042592934, 1029684358182774}, - {460447547653983, 627817697755692, 524899434670834, 1228019344939427, 740684787777653}, - {849757462467675, 447476306919899, 422618957298818, 302134659227815, 675831828440895}, - }, -} - ge_scalarmult :: proc "contextless" (ge, p: ^Group_Element, sc: ^Scalar) { tmp: field.Non_Montgomery_Domain_Field_Element field.fe_from_montgomery(&tmp, sc) - _ge_scalarmult(ge, p, &tmp) + ge_scalarmult_raw(ge, p, &tmp) mem.zero_explicit(&tmp, size_of(tmp)) } -ge_scalarmult_basepoint :: proc "contextless" (ge: ^Group_Element, sc: ^Scalar) { - // Something like the comb method from "Fast and compact elliptic-curve - // cryptography" Section 3.3, would be more performant, but more - // complex. - // - // - https://eprint.iacr.org/2012/309 - ge_scalarmult(ge, &GE_BASEPOINT, sc) -} - ge_scalarmult_vartime :: proc "contextless" (ge, p: ^Group_Element, sc: ^Scalar) { tmp: field.Non_Montgomery_Domain_Field_Element field.fe_from_montgomery(&tmp, sc) - _ge_scalarmult(ge, p, &tmp, true) + ge_scalarmult_raw(ge, p, &tmp, true) } ge_double_scalarmult_basepoint_vartime :: proc "contextless" ( @@ -147,6 +41,12 @@ ge_double_scalarmult_basepoint_vartime :: proc "contextless" ( A_tbl: Multiply_Table = --- mul_tbl_set(&A_tbl, A, &tmp_add) + when crypto.COMPACT_IMPLS == true { + G_tbl: Multiply_Table = --- + mul_tbl_set(&G_tbl, &GE_BASEPOINT, &tmp_add) + } else { + tmp_bp_addend: Basepoint_Addend_Group_Element = --- + } sc_a, sc_b: field.Non_Montgomery_Domain_Field_Element field.fe_from_montgomery(&sc_a, a) @@ -170,21 +70,28 @@ ge_double_scalarmult_basepoint_vartime :: proc "contextless" ( ge_double(&tmp, &tmp, &tmp_dbl) } mul_tbl_add(&tmp, &A_tbl, hi_a, &tmp_add, &tmp_addend, true) - mul_tbl_add(&tmp, &GE_BASEPOINT_TABLE, hi_b, &tmp_add, &tmp_addend, true) + when crypto.COMPACT_IMPLS == true { + mul_tbl_add(&tmp, &G_tbl, hi_b, &tmp_add, &tmp_addend, true) + } else { + mul_bp_tbl_add(&tmp, GE_BASEPOINT_TABLE, hi_b, &tmp_add, &tmp_bp_addend, true) + } ge_double(&tmp, &tmp, &tmp_dbl) ge_double(&tmp, &tmp, &tmp_dbl) ge_double(&tmp, &tmp, &tmp_dbl) ge_double(&tmp, &tmp, &tmp_dbl) mul_tbl_add(&tmp, &A_tbl, lo_a, &tmp_add, &tmp_addend, true) - mul_tbl_add(&tmp, &GE_BASEPOINT_TABLE, lo_b, &tmp_add, &tmp_addend, true) + when crypto.COMPACT_IMPLS == true { + mul_tbl_add(&tmp, &G_tbl, lo_b, &tmp_add, &tmp_addend, true) + } else { + mul_bp_tbl_add(&tmp, GE_BASEPOINT_TABLE, lo_b, &tmp_add, &tmp_bp_addend, true) + } } ge_set(ge, &tmp) } -@(private) -_ge_scalarmult :: proc "contextless" ( +ge_scalarmult_raw :: proc "contextless" ( ge, p: ^Group_Element, sc: ^field.Non_Montgomery_Domain_Field_Element, unsafe_is_vartime := false, diff --git a/core/crypto/_edwards25519/edwards25519_scalar_mul_base.odin b/core/crypto/_edwards25519/edwards25519_scalar_mul_base.odin new file mode 100644 index 000000000..6820d618e --- /dev/null +++ b/core/crypto/_edwards25519/edwards25519_scalar_mul_base.odin @@ -0,0 +1,147 @@ +package _edwards25519 + +import "core:crypto" +import field "core:crypto/_fiat/field_curve25519" +import scalar "core:crypto/_fiat/field_scalar25519" +import subtle "core:crypto/_subtle" +import "core:mem" + +ge_scalarmult_basepoint :: proc "contextless" (ge: ^Group_Element, sc: ^Scalar) { + when crypto.COMPACT_IMPLS == true { + ge_scalarmult(ge, &GE_BASEPOINT, sc) + } else { + tmp_sc: scalar.Non_Montgomery_Domain_Field_Element + scalar.fe_from_montgomery(&tmp_sc, sc) + + tmp_add: Add_Scratch = --- + tmp_addend: Basepoint_Addend_Group_Element = --- + + ge_identity(ge) + for i in 0..<32 { + limb := i / 8 + shift := uint(i & 7) * 8 + limb_byte := tmp_sc[limb] >> shift + + hi, lo := (limb_byte >> 4) & 0x0f, limb_byte & 0x0f + mul_bp_tbl_add(ge, &Gen_Multiply_Table_edwards25519_lo[i], lo, &tmp_add, &tmp_addend, false) + mul_bp_tbl_add(ge, &Gen_Multiply_Table_edwards25519_hi[i], hi, &tmp_add, &tmp_addend, false) + } + + mem.zero_explicit(&tmp_sc, size_of(tmp_sc)) + mem.zero_explicit(&tmp_add, size_of(Add_Scratch)) + mem.zero_explicit(&tmp_addend, size_of(Basepoint_Addend_Group_Element)) + } +} + +when crypto.COMPACT_IMPLS == false { + @(private="file",rodata) + TWO_TIMES_Z2 := field.Loose_Field_Element{2, 0, 0, 0, 0} + + @(private) + Basepoint_Addend_Group_Element :: struct { + y2_minus_x2: field.Loose_Field_Element, // t1 + y2_plus_x2: field.Loose_Field_Element, // t3 + k_times_t2: field.Tight_Field_Element, // t4 + } + + @(private) + Basepoint_Multiply_Table :: [15]Basepoint_Addend_Group_Element + + @(private) + ge_bp_addend_conditional_assign :: proc "contextless" (ge_a, a: ^Basepoint_Addend_Group_Element, ctrl: int) { + field.fe_cond_select(&ge_a.y2_minus_x2, &ge_a.y2_minus_x2, &a.y2_minus_x2, ctrl) + field.fe_cond_select(&ge_a.y2_plus_x2, &ge_a.y2_plus_x2, &a.y2_plus_x2, ctrl) + field.fe_cond_select(&ge_a.k_times_t2, &ge_a.k_times_t2, &a.k_times_t2, ctrl) + } + + @(private) + ge_add_bp_addend :: proc "contextless" ( + ge, a: ^Group_Element, + b: ^Basepoint_Addend_Group_Element, + scratch: ^Add_Scratch, + ) { + // https://www.hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#addition-add-2008-hwcd-3 + // Assumptions: k=2*d, z = 1 (precomputation ftw) + // + // t0 = Y1-X1 + // t1 = Y2-X2 + // A = t0*t1 + // t2 = Y1+X1 + // t3 = Y2+X2 + // B = t2*t3 + // t4 = k*T2 + // C = T1*t4 + // t5 = 2*Z2 + // D = Z1*t5 + // E = B-A + // F = D-C + // G = D+C + // H = B+A + // X3 = E*F + // Y3 = G*H + // T3 = E*H + // Z3 = F*G + // + // In order to make the scalar multiply faster, the addend is provided + // as a `Addend_Group_Element` with t1, t3, t4, and t5 precomputed, as + // it is trivially obvious that those are the only values used by the + // formula that are directly dependent on `b`, and are only dependent + // on `b` and constants. This saves 1 sub, 2 adds, and 1 multiply, + // each time the intermediate representation can be reused. + + A, B, C, D := &scratch.A, &scratch.B, &scratch.C, &scratch.D + E, F, G, H := &scratch.E, &scratch.F, &scratch.G, &scratch.H + t0, t2 := &scratch.t0, &scratch.t2 + + field.fe_sub(t0, &a.y, &a.x) + t1 := &b.y2_minus_x2 + field.fe_carry_mul(A, t0, t1) + field.fe_add(t2, &a.y, &a.x) + t3 := &b.y2_plus_x2 + field.fe_carry_mul(B, t2, t3) + t4 := &b.k_times_t2 + field.fe_carry_mul(C, field.fe_relax_cast(&a.t), field.fe_relax_cast(t4)) + field.fe_carry_mul(D, field.fe_relax_cast(&a.z), &TWO_TIMES_Z2) + field.fe_sub(E, B, A) + field.fe_sub(F, D, C) + field.fe_add(G, D, C) + field.fe_add(H, B, A) + field.fe_carry_mul(&ge.x, E, F) + field.fe_carry_mul(&ge.y, G, H) + field.fe_carry_mul(&ge.t, E, H) + field.fe_carry_mul(&ge.z, F, G) + } + + @(private) + mul_bp_tbl_add :: proc "contextless" ( + ge: ^Group_Element, + tbl: ^Basepoint_Multiply_Table, + idx: u64, + tmp_add: ^Add_Scratch, + tmp_addend: ^Basepoint_Addend_Group_Element, + unsafe_is_vartime: bool, + ) { + // Variable time lookup, with the addition omitted entirely if idx == 0. + if unsafe_is_vartime { + // Skip adding the point at infinity. + if idx != 0 { + ge_add_bp_addend(ge, ge, &tbl[idx-1], tmp_add) + } + return + } + + // Constant time lookup. + tmp_addend^ = { + // Point at infinity (0, 1, 1, 0) in precomputed form, note + // that the precomputed tables rescale so that `Z = 1`. + {1, 0, 0, 0, 0}, // y - x + {1, 0, 0, 0, 0}, // y + x + {0, 0, 0, 0, 0}, // t * 2d + } + for i := u64(1); i < 16; i = i + 1 { + ctrl := subtle.eq(i, idx) + ge_bp_addend_conditional_assign(tmp_addend, &tbl[i - 1], int(ctrl)) + } + ge_add_bp_addend(ge, ge, tmp_addend, tmp_add) + } +} diff --git a/core/crypto/_edwards25519/edwards25519_table.odin b/core/crypto/_edwards25519/edwards25519_table.odin new file mode 100644 index 000000000..029b08418 --- /dev/null +++ b/core/crypto/_edwards25519/edwards25519_table.odin @@ -0,0 +1,4947 @@ +package _edwards25519 + +/* + ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ +*/ + +import "core:crypto" + +when crypto.COMPACT_IMPLS == false { + @(private,rodata) + Gen_Multiply_Table_edwards25519_lo := [32]Basepoint_Multiply_Table { + { + { + {4566296876323096, 4708280988758944, 2883091957081722, 4842055411046963, 5717267076190079}, + {3540182452943730, 2497478415033846, 2521227595762870, 1462984067271729, 2389212253076811}, + {301289933810280, 1259582250014073, 1422107436869536, 796239922652654, 1953934009299142}, + }, + { + {4966907458672021, 4936584233144657, 6114240989277698, 5254498676225494, 4146642117106832}, + {3632771708514775, 790832306631235, 2067202295274102, 1995808275510000, 1566530869037010}, + {748439484463711, 1033211726465151, 1396005112841647, 1611506220286469, 1972177495910992}, + }, + { + {4820158664987218, 4429624038632138, 3711242400124238, 3713328211397903, 3003390509798844}, + {1601611775252272, 1720807796594148, 1132070835939856, 3512254832574799, 2147779492816910}, + {1850748884277385, 1200145853858453, 1068094770532492, 672251375690438, 1586055907191707}, + }, + { + {3946190272469145, 6239505675006654, 5208669189437987, 5151632689063553, 5199813637784664}, + {934282339813791, 1846903124198670, 1172395437954843, 1007037127761661, 1830588347719256}, + {1121406372216585, 192876649532226, 190294192191717, 1994165897297032, 2245000007398739}, + }, + { + {4928851390486164, 2860263086157808, 4946162173083730, 5341365721927258, 4878154719998387}, + {769950342298400, 2384754244604994, 3095885746880802, 3225892188161580, 2977876099231263}, + {1086255230780037, 274979815921559, 1960002765731872, 929474102396301, 1190409889297339}, + }, + { + {4510980453010577, 4649810060060977, 4808503203819400, 5702468951241614, 3249489646904341}, + {1388594989461809, 316767091099457, 2646098655878230, 1230079486801004, 1440737038838979}, + {1181317918772081, 114573476638901, 262805072233344, 265712217171332, 294181933805782}, + }, + { + {4271167442657675, 2928511714391884, 4614310625181828, 3360446656227271, 5021391587042608}, + {2916800678241215, 2065379846933858, 2622030924071124, 2602788184473875, 1233371373142984}, + {965130719900578, 247011430587952, 526356006571389, 91986625355052, 2157223321444601}, + }, + { + {4325401225737414, 4534620752133203, 4768100597167576, 4751634318022197, 3282052041613534}, + {4320419353804412, 4218074731744053, 957728544705548, 729906502578991, 2411634706750414}, + {551790716293402, 1989538725166328, 801169423371717, 2052451893578887, 678432056995012}, + }, + { + {6229274597883966, 4185445767544427, 3794144352961029, 6271388400944242, 5801047593299399}, + {1802695059464988, 1664899123557221, 2845359304426105, 2160434469266658, 3179370264440279}, + {1381809363726107, 1430341051343062, 2061843536018959, 1551778050872521, 2036394857967624}, + }, + { + {3190293695332791, 4165728475672253, 4346255112396895, 3238346181288697, 4562115113555210}, + {1569908045411451, 706723917266915, 1500941167088851, 2522858060362189, 3442327746686552}, + {1454533688490200, 416156769327623, 1344514353803379, 1816391251363763, 259908591619060}, + }, + { + {4322190032257826, 3710718875543082, 5127771470387916, 5558932420078259, 4937587148103002}, + {4222693909998302, 2779866139518454, 1619374932191226, 2207306624415883, 1169170329061080}, + {893653801273833, 1168026499324677, 1242553501121234, 1306366254304474, 1086752658510815}, + }, + { + {4366666225767590, 5094682881462444, 5444160766003964, 2663859630225193, 4386427788371457}, + {1548398643541286, 3090755542662214, 2368065889335542, 1878116023572279, 2384475613352909}, + {1571032457823571, 1253760059932116, 665829584253800, 109400965270906, 981221002823741}, + }, + { + {6475278226276205, 4841626135259659, 5265997707342765, 5158696113477971, 4545898660066816}, + {2465253816303469, 3191571337672685, 1159882208056013, 2569188183312765, 621213314200686}, + {177130678690680, 1754759263300204, 1864311296286618, 1180675631479880, 1292726903152791}, + }, + { + {3248252964508250, 5061531253750778, 5542769770211014, 4619085244233909, 5311803534193606}, + {2375959787421170, 2263885670311134, 2822409136676350, 3122669455540755, 1947192330052816}, + {498660636760962, 1605652986893012, 893278769679967, 1769999239723039, 646478004325289}, + }, + { + {5574001150447352, 3524291821486207, 4161953422248557, 4327379335382018, 3442969602526468}, + {1913163449625248, 2712579013977241, 2193883288642313, 1008900146920800, 1721983679009502}, + {692896803108118, 500174642072499, 2068223309439677, 1162190621851337, 1426986007309901}, + }, + }, + { + { + {5457238221803851, 3344133750480297, 5923374394087185, 3057477798065323, 3111028807187760}, + {1368953770187805, 3042147450398169, 2689308289352409, 2142576377050579, 1932081720066286}, + {1200766035879111, 20142053207432, 1465634435977050, 1645256912097844, 295121984874596}, + }, + { + {5563698449899448, 3838625675758736, 4715900944610621, 4227102525088801, 5170323687134830}, + {1735718747031538, 1248237894295956, 1204753118328107, 976066523550493, 2317743583219840}, + {1091990273418756, 1572899409348578, 80968014455247, 306009358661350, 1520450739132526}, + }, + { + {4403130087311393, 3013844998431429, 3939874146236762, 3074845922691006, 3159402582764738}, + {3732317023121341, 1511153322193951, 3496143672676420, 2556587964178488, 2620936670181690}, + {2047386910586836, 168470092900250, 1552838872594810, 340951180073789, 360819374702533}, + }, + { + {5483833971283375, 6215856366616550, 5092534899560758, 4707898440462492, 3093598134728534}, + {1982622644432037, 2014393600336956, 2380709022489462, 3869592437614438, 2357094095599062}, + {197561292938973, 454817274782871, 1963754960082318, 2113372252160468, 971377527342673}, + }, + { + {5235862574050758, 3926212577912309, 4434256219348056, 5854494381844745, 2810258686980493}, + {2416499262514576, 2254927265442919, 3451304785234000, 1766155447043651, 1899238924683527}, + {2103305098582922, 1960809151316468, 715134605001343, 1454892949167181, 40827143824949}, + }, + { + {4483855840793217, 3239143728269862, 4367394306679708, 4071397886477406, 3371105467700097}, + {1239289043050193, 1744654158124578, 758702410031698, 4048562808759936, 2253402870349013}, + {320153677847348, 939613871605645, 641883205761567, 1930009789398224, 329165806634126}, + }, + { + {4780421392687930, 3788635404873276, 3557012555097608, 4565073531580670, 4303176850668304}, + {3232730304159378, 1242488692177892, 1251446316964684, 1086618677993530, 1961430968465772}, + {833449923882501, 1750270368490475, 1123347002068295, 185477424765687, 278090826653186}, + }, + { + {3756645926444593, 3454896102689928, 5065739048841913, 4777932644822338, 3536143867460687}, + {794524995833413, 1849907304548286, 2305148486158393, 1272368559505216, 1147304168324779}, + {483048732424432, 2116063063343382, 30120189902313, 292451576741007, 1156379271702225}, + }, + { + {5884070579505425, 5535277330947453, 5603542025663670, 4776593639127153, 4995715838681551}, + {2505290486961759, 2288457607049763, 1322694247668132, 2996684795874985, 1441775943403867}, + {1862130357601747, 1576563056403606, 1053598539514442, 836379099899856, 1745075449649052}, + }, + { + {4271432792719273, 4354519732898601, 3841949260311002, 4278872468826501, 3182588946344969}, + {994086190120795, 2265566763472579, 1778668799717474, 1759565368702851, 1705243805775865}, + {208457126969992, 1306788169067141, 1504881061177412, 778305094530678, 286650467791603}, + }, + { + {3704308183084302, 4667642921024280, 3735446294701327, 4710970560312866, 5219863835152358}, + {1155946475009464, 1378854908418478, 3050476655608427, 738141412602796, 1805371589338096}, + {1627667107954997, 2038498693464737, 380348381597727, 693747096546728, 1241364634477378}, + }, + { + {4610118268113321, 3236474426265456, 4804410568671572, 4099577866548348, 3504102383946080}, + {748123900738723, 2239140288387656, 322477057520882, 2644973441419796, 1290933190145308}, + {2218076336525385, 339947754397137, 1735892619490, 1441988709036711, 932991353908008}, + }, + { + {5176295056640358, 3403895808063209, 3860193783232080, 4018349594328251, 4528337169205809}, + {2638983432827646, 2268258692789757, 3287339174338050, 1299412654822337, 936917254750873}, + {430804656367208, 1812394904738259, 550528638373630, 2103769550939254, 443986453677108}, + }, + { + {4019814909194368, 2925457503142305, 3944973873459804, 4250278944002558, 4031746156495663}, + {3925945607985574, 2164215477088927, 2286513560718006, 3385980103702156, 1734257170111047}, + {38890723392351, 853701573154564, 966467672212375, 417321296433946, 554926061377915}, + }, + { + {5000002949084352, 4896484517581292, 5148976024567894, 4815058842461170, 4176010608048328}, + {1720782684885150, 798987029915204, 1610161967147136, 3970529737234552, 936254274515738}, + {562662523022136, 737396420860869, 1964828496205405, 271079414894445, 1393713695470127}, + }, + }, + { + { + {4641332589184683, 2958470737602587, 5890637714236266, 6469243441056846, 3636576929381593}, + {3180171966714267, 2147692869914563, 1455665844462196, 1986737809425946, 2437006863943337}, + {481144981981577, 2053319313589856, 2065402289827512, 617954271490316, 1106602634668125}, + }, + { + {5160989980743332, 3250299780570808, 5495492964276292, 5314069834477255, 2594939618294032}, + {2948097833334040, 3145099472726142, 1148636718636008, 2278533891034865, 2203955659340680}, + {791736669492960, 934767652997115, 824656780392914, 1759463253018643, 361530362383518}, + }, + { + {5791086827335700, 4467111755065554, 3804728204617233, 6168459157050691, 3376804788950489}, + {2022541353055578, 4346500076272714, 3802807888710933, 2494585331103411, 2947785218648809}, + {677434665154918, 989582503122485, 1817429540898386, 1052904935475344, 1143826298169798}, + }, + { + {3025160502526487, 6318980957908565, 4867373065037870, 5043229614440699, 3035080247933683}, + {2619066141993637, 2570231002607651, 2947429167440602, 2885885471266079, 2276381426249673}, + {180820816194166, 168937968377394, 748416242794470, 1227281252254508, 1567587861004268}, + }, + { + {4236540720225255, 5582763806770724, 3307821162947907, 3911758370168910, 3340328882710774}, + {2730575372268893, 2062896624554806, 2951191072970647, 2609899222113120, 1277310261461760}, + {580736401511151, 1842931091388998, 1177201471228238, 2075460256527244, 1301133425678027}, + }, + { + {3547095551954881, 3966542127392273, 5049182669833076, 6538011303633046, 3765047903698852}, + {1515728832059163, 1575261009617579, 1510246567196186, 2442877836294952, 2368461529974388}, + {230710545179830, 30821514358353, 760704303452229, 390668103790604, 573437871383156}, + }, + { + {4354054137171033, 3822632479902001, 4538296533915119, 4245013553492583, 4574238179641958}, + {3421179921230875, 2514967047430861, 4274701112739695, 3071700566936367, 4275698278559832}, + {894132856735058, 548675863558441, 845349339503395, 1942269668326667, 1615682209874691}, + }, + { + {5296988143897756, 3567256897335281, 4224086813027664, 4153625766737702, 4841869104592905}, + {3539470031223082, 1222355136884919, 1846481788678694, 1150426571265110, 1613523400722047}, + {550201530671806, 778605267108140, 2063911101902983, 115500557286349, 2041641272971022}, + }, + { + {2639140850252425, 3988225053741778, 4109492541046027, 4467731762307139, 4788525019017799}, + {1956266817271455, 2914237312642832, 2018010448016151, 4042065159660719, 3422400064417223}, + {1185820244523867, 953640094456191, 1426524678517613, 1191533398208458, 1993578549159852}, + }, + { + {4724762102005390, 3941768459309593, 3168985852401486, 5230753070525336, 5120855380354436}, + {2162922301975048, 2584871642802941, 2903836488265486, 2034914383000476, 1973107217149520}, + {1225503059018859, 1744932331605022, 393061606917651, 2045141059558447, 1187823695528756}, + }, + { + {3873867956612972, 5901886943623014, 4214442512189194, 3726570129804851, 4003114175771373}, + {2499971111138236, 1856344473990516, 2851460465748678, 1490509710033167, 3414551741933391}, + {1569106592395768, 1670704805332568, 2011861983976474, 822492307064908, 1138495702641636}, + }, + { + {4611233673112936, 4109919865110418, 3874636387071312, 4304609757893158, 4158539624577373}, + {3888656531434102, 3371559592472684, 2495053387333630, 3579436360572308, 1114431352259831}, + {2209993507106795, 1762615018349199, 1687296090930185, 9491601628221, 870532128794902}, + }, + { + {4833972836221169, 5399132877586271, 4606616407949355, 4080860583790927, 4239964386503137}, + {1305913677624121, 3558400184075999, 3275823038503467, 3454063433790229, 1309514508446881}, + {1566723549675548, 1397175496983691, 504231980459915, 306990234666329, 1744893526714441}, + }, + { + {4014795958128859, 5054570465100501, 3081378639295577, 5833550217358299, 3899560884622359}, + {972376391789061, 1850852472634117, 2719443704140285, 2186622623776515, 3209686661433313}, + {2171782442569495, 1594104418173184, 1848207566547320, 2195471209947031, 1091928745815642}, + }, + { + {4698583634348737, 4028817484747578, 3922491723357167, 4921897981297279, 5070174707952522}, + {3952749170677737, 509151538148928, 2600240333845125, 2270835069234179, 3790913978189516}, + {1587050028613976, 1757976429633698, 440367736554514, 102469500615778, 1293087093446941}, + }, + }, + { + { + {4765314848902696, 4047154143755239, 3748677840535530, 5003339347891547, 4892630780044264}, + {717255318455100, 519313764361315, 2080406977303708, 541981206705521, 774328150311600}, + {1997217696294013, 1717306351628065, 1684313917746180, 1644426076011410, 1857378133465451}, + }, + { + {4274106452868777, 5229895690942370, 4818944681819138, 3310533142834467, 5951800763431172}, + {3727234538477877, 2328731709971226, 3368528843456914, 2002544139318041, 2977347647489186}, + {1710065158525665, 1895094923036397, 123988286168546, 1145519900776355, 1607510767693874}, + }, + { + {6052094801116259, 4945910156597034, 3249872360685630, 5056653985755776, 5148423953746665}, + {2813405189107769, 1071733543815036, 2383296312486238, 1946868434569998, 3079937947649451}, + {1445526537029440, 2225519789662536, 914628859347385, 1064754194555068, 1660295614401091}, + }, + { + {5380526401591301, 2806418790173460, 3263856123526812, 3091761635239858, 3666299153992924}, + {3451490036797185, 2275827949507588, 2318438102929588, 2309425969971222, 2816893781664854}, + {703047626104145, 1266841406201770, 165556500219173, 486991595001879, 1011325891650656}, + }, + { + {4838486554794399, 4993110726592022, 4632760493337220, 3972608926828727, 2871500009334501}, + {1622861044480487, 1156394801573634, 4120932379100752, 2578903799462977, 2095342781472283}, + {1646545795166119, 1758370782583567, 714746174550637, 1472693650165135, 898994790308209}, + }, + { + {4062996033667232, 5572569452904097, 4793202602203933, 4240755857296838, 5367161970768862}, + {2585203586724508, 2547572356138185, 1693106465353609, 912330357530760, 2723035471635610}, + {906282429780072, 2108672665779781, 432396390473936, 150625823801893, 1708930497638539}, + }, + { + {3731585820952935, 6242481486437170, 4572245823847061, 4398306869785574, 5751262444905966}, + {925664675702309, 2273216662253932, 4083236455546587, 601157008940112, 2623617868729744}, + {52035296774456, 939969390708103, 312023458773250, 59873523517659, 1231345905848899}, + }, + { + {4632957969763174, 4184611431390023, 5680349018170176, 4901639977232284, 5674379295460919}, + {2895154920100990, 2541986621181021, 2013561737429022, 2571447883196794, 2645536492181409}, + {2051980782668029, 121859921510665, 2048329875753063, 1235229850149665, 519062146124755}, + }, + { + {4207228868621988, 4953881226819951, 4139842782246336, 4298958943276773, 3359727402165629}, + {947983997565204, 1512975730400883, 4017071259732234, 765863411195419, 2287620622340759}, + {2248717923990509, 953644234015146, 118881148429301, 1244045737066019, 519708790776758}, + }, + { + {5697680122778496, 6228365759267448, 4861216723530833, 4702869303488893, 5552489090348314}, + {1440754265571108, 2717772629254708, 2851948946836421, 3389483713931559, 1448786922664578}, + {843777949621211, 1435525643946674, 1087149831109219, 1794919173070415, 1112222323032617}, + }, + { + {5102037877608319, 4652686712219969, 3897951345871191, 3585818368367414, 5206224086433126}, + {1659077274827511, 3292962448731851, 3877468219103951, 1516723029470630, 2756801757695330}, + {1080269027468022, 217052522911549, 1656325362355128, 1627927536138189, 547476742306034}, + }, + { + {4629572650764889, 5482991583454262, 5026118951697692, 3386284302539994, 4183091862778757}, + {4049116095173975, 2853051218008192, 874408124299498, 2811479573934506, 3061819813989639}, + {1673853233469462, 2069508754540826, 444570721431342, 318669192295723, 1286647860911061}, + }, + { + {5230179910306733, 4570722910725029, 2679420725332655, 3219299251684998, 5101899978929471}, + {3368016050367733, 1864179846991811, 2025579249953153, 2185933453914170, 3081358815633795}, + {1120488984292940, 268864491510849, 230793761352121, 54153081190951, 1544798876643945}, + }, + { + {4594071143939477, 4032573207368795, 3586642054806445, 2633280388282362, 4204685405148786}, + {3215023450765629, 1989745848107067, 2317683847606295, 2073505048594828, 792770882411102}, + {213368529611304, 716996641453362, 1913278462832177, 1585475497182388, 563601091454134}, + }, + { + {2835663672936090, 4829603014808807, 3487022863582034, 2792788055117753, 4407939774570859}, + {1893732627269868, 2896260158734549, 1988156739597398, 2606708976150985, 1947694156880429}, + {1687313081048019, 7705508083870, 487993091259388, 560742684726806, 779697153923449}, + }, + }, + { + { + {4089455896800313, 6013733676182565, 5409863301562555, 4072864011490980, 5068974752046796}, + {3859970785658325, 2667608874045675, 1350468408164765, 2038620059057678, 3278704299674360}, + {578027192365650, 2034800251375322, 2128954087207123, 478816193810521, 2196171989962750}, + }, + { + {4965788985850512, 4036616547844474, 3863134115336615, 3555738077628787, 5211189187689919}, + {1633188840273120, 3104586986058956, 1548762607215795, 1266275218902681, 3359018017010381}, + {1038829280972848, 38176604650029, 753193246598573, 1136076426528122, 595709990562434}, + }, + { + {4508300680732578, 6151240693672842, 5551152629612579, 4175434827081223, 4710569942272560}, + {3660251634545082, 2194984964010832, 2198361797561729, 1061962440055713, 1645147963442934}, + {1750479161778571, 1362553355169293, 1891721260220598, 966109370862782, 1024913988299801}, + }, + { + {5140408161043668, 3514001525352806, 4894551007701094, 3915220506382540, 5065550949127901}, + {2464498862816952, 1117950018299774, 1873945661751056, 3655602735669306, 2382695896337945}, + {520731594438141, 1446301499955692, 273753264629267, 1565101517999256, 1019411827004672}, + }, + { + {3716451775537782, 3735537109406964, 3771250375020764, 3413229645449032, 4909514625550472}, + {3178327305714638, 3443653291096626, 734233225181170, 2435838701226518, 4042225960010590}, + {996126634382301, 796204125879525, 127517800546509, 344155944689303, 615279846169038}, + }, + { + {5126516964784293, 5722588804459529, 5788457340217086, 5474101689079853, 4854624835487584}, + {2990523894660505, 2188666632415295, 1961313708559162, 1506545807547587, 3403101452654988}, + {2067814584765580, 1677855129927492, 2086109782475197, 235286517313238, 1416314046739645}, + }, + { + {5182089550298661, 4268457398409278, 4594577010420123, 5530431534605076, 5118871120313016}, + {2838644076315587, 2559244195637442, 458399356043425, 2853867838192310, 3280348017100490}, + {301225714012278, 1094837270268560, 1202288391010439, 644352775178361, 1647055902137983}, + }, + { + {5639203700568665, 3935121894170720, 5272747431747178, 4338487944274660, 5404045310490874}, + {1210746697896459, 1416608304244708, 2938287290903104, 3496931005119382, 3303038150540984}, + {1971518477615628, 401909519527336, 448627091057375, 1409486868273821, 1214789035034363}, + }, + { + {5099963449143288, 5521329395009146, 5925708408867572, 4221709339736212, 4612387286592975}, + {1894554173291056, 3439387781984292, 2885767225889068, 620075308547710, 1923191105660691}, + {2193142205372254, 2249202758109308, 136771833945490, 2136446252990850, 1913453314551631}, + }, + { + {3519416739470062, 5800837512824035, 5629830750568439, 3858242948002290, 4384918516791051}, + {1031287572005306, 2743053635058531, 1307200063174499, 886968262945288, 322139622562321}, + {1603190765881197, 1131168289986667, 1851325240689452, 1811918922856612, 1688789764638099}, + }, + { + {5675121438563826, 3813646429348722, 6155915780969232, 4550135853787182, 3281226794470063}, + {1227916715088978, 3565721991039408, 2825753167382054, 446650609575830, 3201068492916497}, + {465975618381320, 1757724298980204, 2172737911773281, 1844204403201116, 367200393612929}, + }, + { + {4053304559591831, 4763567221009860, 6256382270106074, 5569940279565028, 4297628970970611}, + {522695684014153, 2454309386747442, 1812320598717590, 1790060723730286, 513480358702681}, + {1695032670616248, 1588968761785032, 699742416328216, 547685855993128, 1790235994988743}, + }, + { + {3776137870634381, 3800031162558423, 5542451196069607, 4330978223940644, 5450131593237007}, + {3411403847639229, 1506626399353463, 2324339461338721, 1195836709245006, 2829489236982793}, + {263703254267006, 1082588170565097, 2024394221181425, 46543794553459, 2110417854356146}, + }, + { + {5712489756196259, 4857601027744288, 4243491518458906, 4901936639181452, 4456074323550475}, + {2520601556174181, 1164555774547222, 2770926848501726, 3208860864993280, 497236288525621}, + {247502314830666, 1623351904090299, 1162047175878913, 1697644630093486, 776531516340321}, + }, + { + {2686302584388573, 3722578779150130, 6045187633044733, 3467509394641570, 3302975571798606}, + {2408284467064191, 2899235622132542, 2270755745458389, 1460665123127634, 2622446416668442}, + {625008843842459, 305089228555404, 1124988453243439, 123919845855976, 788637610781258}, + }, + }, + { + { + {3297030136943183, 5321806228516302, 2882313002761349, 3923846342683379, 5310803644932932}, + {1364039144731711, 1897497433586190, 2203097701135459, 2397261210496499, 1349844460790698}, + {439961968385997, 386362664488986, 1382706320807688, 309894000125359, 2207801346498567}, + }, + { + {4255565910583278, 4673673686605660, 3392924072653217, 3737219707166220, 3825562634713972}, + {3480804500082836, 3172443782216110, 2375775707596425, 2933223806901024, 1400559197080972}, + {729905708611432, 1270323270673202, 123353058984288, 426460209632942, 2195574535456672}, + }, + { + {4013408251151364, 5086960474897299, 3838506203370739, 4408856413264508, 3422492183371019}, + {1271140255321216, 2044363183174497, 2303925201319937, 3696920060379952, 3194341800024331}, + {871476219910823, 1878769545097794, 2241832391238412, 548957640601001, 690047440233174}, + }, + { + {3251428812313581, 5636436335863895, 4336541488202699, 4972942980386107, 5182382616078529}, + {2548994545820755, 1366347803776819, 3552985325930849, 561849853336293, 1533554921345731}, + {2189427607417022, 699801937082607, 412764402319267, 1478091893643349, 2244675696854460}, + }, + { + {5012160783311108, 5470528103057159, 4488517614835378, 2676343672262544, 4341072770671390}, + {3964091869651792, 2456213404310121, 3657538451018088, 2660781114515010, 3112882032961968}, + {221245220129925, 1156020201681217, 491145634799213, 542422431960839, 828100817819207}, + }, + { + {2810886626483710, 5076777331583206, 6133336711186896, 3651619527147841, 3898754191951285}, + {2405556784925632, 1299874139923976, 2644898978945750, 1058234455773021, 996989038681183}, + {1887963056288059, 228507035730124, 1468368348640282, 930557653420194, 613513962454686}, + }, + { + {5579887344422086, 5618055197913529, 4690896687085975, 4754046511662615, 4136987326235786}, + {1224529808187534, 1577022856702685, 2206946542980843, 625883007765001, 2531730607197406}, + {902497362940219, 76749815795675, 1657927525633846, 1420238379745202, 1340321636548352}, + }, + { + {5132340287409247, 4194838312213087, 4971385975164381, 5596941055673869, 4739013486883497}, + {1129576631190765, 3533793823712575, 996844254743017, 2509676177174497, 3402650555740265}, + {237425418909360, 469614029179605, 1512389769174935, 1241726368345357, 441602891065214}, + }, + { + {5266234055777943, 3166499093963215, 4159587332862448, 3232787848503690, 6261694765772425}, + {2508069708566903, 2982887287210837, 1712829089863354, 1739545432690564, 1853100260794477}, + {4642168584761, 1314096799362798, 1620739012635580, 444075187404753, 76135520441225}, + }, + { + {5167832514805982, 5410004641404511, 3809624149844670, 4773980049888932, 3778278866830004}, + {1717340294466846, 3145810307460687, 1904170181110298, 3950114374260626, 2248427553137502}, + {1356583144121446, 1439603152129038, 880464721166116, 426511648446184, 1044401386572766}, + }, + { + {3827273464157640, 5470853620720833, 4235776821907793, 5432246822532161, 4674460658804935}, + {3682691082267936, 1935676112917301, 3170276622979891, 2876033130676637, 1596266630249199}, + {1484505136430423, 343818915658679, 1066931341976591, 1574952097402529, 895157643469052}, + }, + { + {6636210482709397, 2566644085561849, 4278449441656290, 5708653335234549, 6540605640281063}, + {2193735258244385, 2265742668153213, 2801601661178220, 1573679250261669, 2218164822512395}, + {125908919015544, 908539856510216, 254196493329521, 1841783557943867, 1826956209112337}, + }, + { + {4015848574593688, 5374261932338028, 4759505940569418, 5686761164384680, 3410517186063399}, + {1218465765165754, 1222399589933778, 4149598104194804, 2307999947285970, 2530437726498307}, + {1352017428769842, 1226345478088737, 1834808987089176, 171935268241134, 1252599135760918}, + }, + { + {4391913968320982, 5643346087738336, 3260878495624279, 6345563729780486, 6485738780527396}, + {269241043449612, 1713401415896622, 3060740655644691, 2228155591500882, 2273523243235430}, + {994025955714788, 1395495501299355, 1717525291885154, 64780760930213, 1492125616744822}, + }, + { + {4496571738540020, 6137682561017990, 4165346179942417, 4589212756752962, 5249152453870163}, + {2859457773452122, 2592803086422694, 761249806099561, 4355723617152898, 2688955778843975}, + {686675614020084, 1129369471718576, 1361332769753183, 814390480194826, 1958437091006724}, + }, + }, + { + { + {4212554477605918, 5000640585259457, 4161632664968341, 3523231950682073, 4471580181706187}, + {3988217766743784, 726531315520507, 1833335034432527, 1629442561574747, 2876218732971333}, + {1537037379417136, 1358865369268262, 2130838645654099, 828733687040705, 1999987652890901}, + }, + { + {4063362146350583, 3753681832692920, 4465563314774246, 4863172707090131, 4539970192419610}, + {629042105241795, 1098854999137608, 887281544569320, 3674901833560025, 2259711072636808}, + {218907117361280, 1209298913016966, 1944312619096112, 1130690631451061, 1342327389191701}, + }, + { + {4482501699248035, 5851772807709469, 4424655942309844, 5930138373494266, 4947793108696645}, + {1369976867854685, 1396479602419169, 4017456468084104, 2203659200586298, 3250127649802489}, + {784210426627951, 918204562375674, 1284546780452985, 1324534636134684, 1872449409642708}, + }, + { + {4153660020381144, 4256288935750983, 3877646875253483, 3225329557085126, 4327087498998152}, + {2571438643225542, 2848082470493653, 2037902696412607, 1557219121643918, 341938082688094}, + {1371853944110545, 1042332820512553, 1949855697918254, 1791195775521505, 37487364849293}, + }, + { + {4334516943269102, 4531429052909917, 4649254694042464, 3942327023530758, 6368860137043973}, + {687200189577836, 1082536651125675, 2896024754556794, 2592723009743198, 2595381160432643}, + {1059729620568824, 2163709103470266, 1440302280256872, 1769143160546397, 869830310425069}, + }, + { + {4276621734726805, 4930548302820644, 2846933097770719, 4975460488256465, 2852121493098246}, + {3861316033464273, 777277757338816, 2101121130363987, 550762194946473, 1905542338659364}, + {598474602406721, 1468128276358244, 1191923149557635, 1501376424093216, 1281662691293476}, + }, + { + {2971320059272372, 4896980339002840, 4635950028233875, 3795071084495975, 4071343109483907}, + {1721138489890688, 1264336102277790, 2684864359106535, 1359988423149465, 3813671107094695}, + {396397949784152, 1811354474471839, 1362679985304303, 2117033964846756, 498041172552279}, + }, + { + {5154223559778472, 3389351102095821, 4377023217300786, 3977457826906518, 4386692778803043}, + {1812471844975748, 1856491995543149, 126579494584102, 3288044672967868, 1975108050082549}, + {522584000310195, 1241762481390450, 1743702789495384, 2227404127826575, 1686746002148897}, + }, + { + {4080889153606423, 5116319911316914, 4006591728131774, 4350736921528591, 4198995697088691}, + {3932341308304797, 1612580099028530, 2937385230920440, 1836672506516533, 517164940700103}, + {1413348606155183, 810499206093511, 1138057743946731, 1556315649471799, 993617155135620}, + }, + { + {5656453792030509, 6079591987914126, 5929179648294721, 5230798899043491, 3370342887971873}, + {2735841961308013, 2116601197688202, 2652241807415589, 1945152844924315, 2885012584681659}, + {551620533268687, 1182887684657061, 1043366705332762, 944140538303658, 2240921917214007}, + }, + { + {2427888929082724, 4467682652740956, 5335339067201761, 5550886290485514, 5050956980777821}, + {2247945978763224, 215736457901546, 1047424049356243, 1389596126698944, 816935367913617}, + {1146743855918524, 1418503734887175, 843342293437400, 1502230097098390, 1240491010654824}, + }, + { + {6701933119211633, 5059229274152685, 4982837924778640, 4159052306481152, 4290369756778959}, + {2204538589507457, 3142843240983995, 2451576614290660, 3204217003708084, 2887474477188681}, + {510455031824465, 465163402943305, 2022658124081289, 1881132727821470, 31746160856543}, + }, + { + {5097091659825113, 2826376647382075, 3998920599703675, 3513481695405562, 5076475699131519}, + {1330330618013145, 2313004235002329, 3963525218487729, 2303930585911304, 2755772190474933}, + {944243695677568, 255912283647788, 1855489019383837, 1244636060478392, 1911682985774639}, + }, + { + {5024454158738700, 2514912085825565, 3852574473189297, 4034915921452192, 3904120669219782}, + {3843903221055742, 2416642267747155, 1715729591405051, 1735036083660438, 1182009761997504}, + {1140604273028187, 1352033415206334, 1448886815181311, 941652546197192, 1001542060535421}, + }, + { + {4277058348919964, 5364603224614130, 5366326037527057, 4814184001945705, 5895346951506596}, + {3602696745610322, 2198425366751348, 1768623515003979, 2456584282641319, 3022619356175890}, + {1305849451281975, 726672899606505, 2105928429843370, 246834240873219, 1573506984361288}, + }, + }, + { + { + {4821701574825479, 4751738035366345, 3733704008989173, 4812878081681692, 3510316573903125}, + {427904865186293, 1703211129693455, 1585368107547509, 3688784302429584, 3012988348299225}, + {1275068538599310, 513726919533379, 349926553492294, 688428871968420, 1702400196000666}, + }, + { + {3810616250567627, 4214696146321770, 5841309449432647, 3753213644462184, 4798035793202427}, + {3313663849950481, 3213411074010628, 2573659446386085, 3297400443644764, 1985130202504037}, + {818359826554971, 1862173000996177, 626821592884859, 573655738872376, 1749691246745455}, + }, + { + {4398313517418541, 5088388527765162, 4968565284650452, 4435773453041373, 4741970786827285}, + {1988022651432119, 3333911312271288, 1834020786104820, 3706626690108935, 692929915223121}, + {1129007025494441, 2197883144413266, 265142755578169, 971864464758890, 1983715884903702}, + }, + { + {4948148597287912, 3704086267538602, 4365531255192057, 2896988087581106, 5313917252680007}, + {1291366624493056, 2633256531874362, 1711482489312443, 1815233647702022, 3144079596677715}, + {2242724082797924, 1373354730327868, 1006520110883049, 2147330369940688, 1151816104883620}, + }, + { + {4667323107306775, 4619024517173644, 3407816205266473, 6398541848123859, 4222349233671575}, + {3997520014069025, 4163522956860564, 2056329390702073, 2607026987995097, 3131032608056347}, + {681981452362484, 267208874112496, 1374683991933094, 638600984916117, 646178654558546}, + }, + { + {2512483707152304, 5357659933447732, 5417239179350606, 4508304204210617, 2532054624493958}, + {2265178468539480, 2358037120714814, 1944412051589650, 4093776581610705, 2482502633520820}, + {715374893080287, 1173334812210491, 1806524662079626, 1894596008000979, 398905715033393}, + }, + { + {4348221360643351, 4174322814635610, 5293430650247335, 4930894772059273, 4824523600532224}, + {2751826223412909, 3848231101880618, 1420380351989369, 3237011375206737, 392444930785632}, + {1927770723575450, 1485792977512719, 1850996108474547, 551696031508956, 2126047405475647}, + }, + { + {2635705015322199, 3111746811317117, 5359223495008139, 3268925594263041, 3046050645563056}, + {2112099158080129, 2994370617594963, 2258284371762679, 1951119898618915, 2344890196388664}, + {77571826285752, 999304298101753, 487841111777762, 1038031143212339, 339066367948762}, + }, + { + {5619164208408509, 4079972709845361, 3927824185200012, 3681293890692042, 5452751544406703}, + {2191882696778049, 531264700870777, 3039670365049278, 1359665656266722, 3162072763716517}, + {1570940255668145, 688547574737286, 1632136413236589, 2053774689811525, 676669102580803}, + }, + { + {5183231995448322, 4155796849234556, 4791323788081582, 4471675968988079, 5711715782924180}, + {3207409007530338, 935702897763596, 729948770061474, 1584905172662705, 2425339805308626}, + {288239669792058, 2152796035840109, 162317061559789, 1257054119617939, 421141027109762}, + }, + { + {4958697699223355, 3221953471379609, 2818398572467973, 5875894486831009, 3850357049774603}, + {642422906756119, 3171839279489789, 1695193497886789, 3040583315302385, 3362141503479163}, + {1042979452017909, 1774768735282920, 464726722030945, 1465185933073826, 1382968477576580}, + }, + { + {3858506126065685, 4410239993278318, 3464562222229353, 3841799127123745, 3236074797259687}, + {3342987691574741, 2002872538662690, 3240810091817983, 3479310152893167, 2490884376592639}, + {2139337814897324, 178720275772072, 596052025976159, 666224594355251, 630639510547398}, + }, + { + {2744437082123657, 4441348097375482, 3869182720347428, 4304304367735980, 3086995265547722}, + {2392789380667179, 812658446707360, 1599624958311986, 214741817968452, 1436587626236000}, + {130387450082061, 1779587373012878, 417414670169839, 716150862374041, 154849814949784}, + }, + { + {4442837550688441, 4997631045842130, 5291735080737359, 4549950120656089, 4456650325708853}, + {2746366883922045, 2305345226446032, 2885706560860073, 4092938150156125, 656228807731693}, + {1456049106825164, 137394514200521, 2140871605490631, 1643256698410764, 679389221519059}, + }, + { + {3925184987729414, 3825370065750239, 2928329430708313, 5366989011209685, 4444246216420488}, + {2346187442256272, 1014027377437197, 2069628555505675, 1559427210701775, 1456229816012936}, + {2009324336353948, 1468073297564484, 1969534512584396, 827056802549955, 104599952309039}, + }, + }, + { + { + {5505012288893163, 2599996010752544, 3918414180409193, 3140224808718007, 2832547501486604}, + {2926794589205781, 2517835660016036, 826951213393477, 1405007746162285, 1781791018620876}, + {1939560076207777, 1409892634407635, 552574736069277, 383854338280405, 190706709864139}, + }, + { + {5180561690600497, 4132075350834054, 4298520825287953, 5392062874453498, 5821901179394561}, + {2177087163428741, 1439255351721944, 3459870654068041, 2230616362004768, 1396886392021913}, + {1466980508178206, 617045217998949, 652303580573628, 757303753529064, 207583137376902}, + }, + { + {4105782219090338, 4130463869936394, 6031610648174487, 5523226095524059, 5632038039559529}, + {3762856566592150, 2357202940576524, 2745234706458093, 1091943425335975, 1802717338077427}, + {1963939888391106, 293456433791664, 697897559513649, 985882796904380, 796244541237972}, + }, + { + {3680158110175880, 5530714909790973, 4808440325428831, 4945009801397122, 4071158169963819}, + {2668570812315008, 2641455366112301, 1314476859406755, 1749382513022778, 3413705412424739}, + {204943430200135, 1554861433819175, 216426658514651, 264149070665950, 2047097371738319}, + }, + { + {5165635210954903, 4790335732463592, 5635372627881110, 5322093841581933, 4976543419424973}, + {1934415182909015, 1393285083565062, 2768209145458208, 3409490548679139, 2372839480279515}, + {665784778135882, 1893179629898606, 808313193813106, 276797254706413, 1563426179676396}, + }, + { + {4283233217201481, 4707596242598657, 4674086796207577, 5485113232161884, 3095373778602077}, + {945205108984213, 2778077376644543, 1324180513733565, 1666970227868664, 2405347422974421}, + {1476570093962618, 838514669399805, 1857930577281364, 2017007352225784, 317085545220047}, + }, + { + {3545343323078703, 4395424422887793, 5561961194168003, 4717696754764488, 3198688329157975}, + {1461557121912823, 1600674043318359, 2157134900399597, 1670641601940616, 2379565397488531}, + {357067959932916, 1290876214345711, 521245575443703, 1494975468601005, 800942377643885}, + }, + { + {5120856274973686, 3903907574784685, 4109012860330718, 3337396988900217, 3069232573515769}, + {2817916472785262, 820247422481739, 994464017954148, 2578957425371613, 2344391131796991}, + {771808161440705, 1323510426395069, 680497615846440, 851580615547985, 1320806384849017}, + }, + { + {6662756671601401, 5055771079546289, 4642910898897859, 4274227027260534, 5833718441044794}, + {2335519494956627, 3820365010713627, 1944201046475949, 1640913863967574, 2358631279976586}, + {990528501134234, 1330224017810407, 1573804236508381, 942270438439677, 25201841708767}, + }, + { + {5526427987749634, 4518401023168866, 4921120012283882, 4779318497665973, 4555652731610533}, + {2646721458762538, 1247587116821480, 2586827199616378, 3932021497491885, 969339720975687}, + {1595456591254808, 1919330451560855, 265402806641622, 1560117962587834, 1169927205192232}, + }, + { + {4189409997656536, 4659089518495636, 6000827340603279, 5702161301408170, 5941261317517041}, + {3317917962903276, 1668664191271588, 1899844145838597, 1696011444672828, 2282054748309227}, + {2126527989994119, 1465890683922518, 416427350021352, 1618807264846944, 1588324622180673}, + }, + { + {4009588676432813, 4225252562340771, 5138392626199289, 6147384375179966, 4323738229760897}, + {2550824143198317, 3724772924079255, 2640826097206085, 2805004284285778, 3725892598967957}, + {901870527597111, 1300831444709451, 1795706127510368, 1590464383227069, 60287918150860}, + }, + { + {4260735023331218, 2752239523202930, 4432983289513289, 6073621772440017, 5069964246448815}, + {2411640257311042, 2404639281373100, 935718519552991, 2182928933394409, 3181304181386605}, + {301088722784222, 902977224984285, 1485824849826196, 864674789855395, 2204280040105719}, + }, + { + {5294452585150653, 4378774784126084, 2684611835446325, 6054460125397337, 3113938028918105}, + {1102630701890799, 2202327440719776, 1844385418066207, 1719220574774295, 3022438833862057}, + {1192644591215061, 1951970263153038, 182489349589207, 1072483329544407, 1425993434915257}, + }, + { + {3759682407110969, 4757463391782573, 6126440026160055, 4699689556446215, 5715476431941391}, + {2696424379059465, 2927324693839557, 2595575928464217, 3964369572567959, 2720628440266425}, + {786193544150213, 816842401151828, 2071842707112420, 581055055128968, 310970557266803}, + }, + }, + { + { + {3579768107573076, 3587300666628503, 3653386978219511, 5061736939322935, 6054960176639396}, + {1219260086131896, 2898968820282063, 2331400938444953, 2161724213426747, 2656661710745446}, + {417621685193956, 1429953819744454, 396157358457099, 1940470778873255, 214000046234152}, + }, + { + {3878872728667188, 4463402894965320, 4164169415301751, 3443570249906556, 4439109571211107}, + {1268047918491954, 2172375426948536, 1533916099229249, 1761293575457130, 3842422480712013}, + {1149147819689533, 378692712667677, 828475842424202, 2218619146419342, 70688125792186}, + }, + { + {4292523638342576, 4903155265245570, 5136143002823489, 3124449750693297, 5738994354400728}, + {3551539230764990, 3690416477138006, 3788528892189659, 2053896748919837, 3260220846276494}, + {2211311599327900, 2139787259888175, 938706616835350, 12609661139114, 2081897930719789}, + }, + { + {4097322728303089, 5725797875706037, 4654440700130628, 4178828883626228, 5693513031868506}, + {1324994503390431, 2588782144267879, 1183998925654176, 3343454479598522, 2300527487656566}, + {1079559557592645, 2215338383666441, 1903569501302605, 49033973033940, 305703433934152}, + }, + { + {3683815626821508, 4943964422665864, 3647446876506747, 4228674336449825, 5438052000093847}, + {2346453219102138, 3637921163538246, 3313930291577009, 2288353761164521, 3085469462634093}, + {1296625309219774, 2068273464883862, 1858621048097805, 1492281814208508, 2235868981918946}, + }, + { + {3534262737397977, 5245485311356750, 4279554456512807, 2770789343226274, 4078409823241192}, + {1490330266465551, 1858795661361448, 3688040948655011, 2546373032584894, 3459939824714180}, + {1525827120027511, 723686461809551, 1597702369236987, 244802101764964, 1502833890372311}, + }, + { + {6545268376680796, 4436205135889147, 3885200451296283, 4362482319222146, 6551744017455139}, + {2365421849929742, 3485539881431101, 2925909765963743, 2114345180342964, 2418564326541511}, + {503058759232932, 760293024620937, 2027152777219493, 666858468148475, 1539184379870952}, + }, + { + {2929839349119735, 5074186917559835, 3857102490299366, 4399562376560948, 3957863610776951}, + {1916168475367211, 3167426246226591, 883217071712574, 363427871374304, 1976029821251593}, + {1439489648586438, 2194580753290951, 832380563557396, 561521973970522, 584497280718389}, + }, + { + {4107979200870526, 4899400547785857, 5175087145170849, 5761419237914916, 2674185367684618}, + {1133946710417756, 499737269360777, 1645961935513831, 2259932248870354, 2394185034627430}, + {2211650710341615, 1916525167795392, 2219254718801699, 1123275886572725, 2065912631812720}, + }, + { + {2942743383283030, 4661681143781323, 4853180648224206, 3984362536169634, 3769046963947699}, + {2547466619616960, 1599890997313053, 1767449403100900, 3146589914609346, 2442645855602917}, + {1023269497317835, 1006858415503750, 2159836138753919, 1535892167365222, 826474553854585}, + }, + { + {4044410514205452, 4788613576788997, 4922881390894542, 4505428839963076, 3254381502973105}, + {2881011303685958, 323260022642283, 2392511825935364, 2680218607241472, 2086628284323147}, + {1011041096783712, 1570461284958064, 399516828994561, 1037957371973381, 293292885426852}, + }, + { + {3922699440356983, 4166667378343946, 4637678914861614, 4901406304713256, 5486018227566634}, + {3894750463833161, 836931108663410, 4007195920412586, 1173057924841174, 2662523305285872}, + {2047497366930440, 1249020434696646, 353399299276962, 1824831452522161, 1950016482901783}, + }, + { + {6367491312268994, 5392176809230541, 4683379383522741, 4425977262002237, 5566950871345983}, + {2375227161224824, 2257267128164595, 1056955680380401, 2844088942852363, 1386644755985081}, + {1251794829999036, 1772886866476173, 955066187540246, 1232293719330892, 396636503102089}, + }, + { + {5348918388440793, 5110360065015040, 4585673363095533, 4391593798666572, 4556880644633940}, + {2531431177429893, 1987695830473810, 227622233346307, 1010967397553478, 1341018389661594}, + {83039271672929, 423138535583767, 1183109031328467, 165324254826210, 1340545562288681}, + }, + { + {4651180052187971, 4721139042433965, 4397263424421690, 3818446426246947, 4163799598655846}, + {1971810452973589, 1766684231420693, 299216980507446, 1405770006429853, 3505404036582454}, + {814876839307346, 1973981610718707, 715190907115349, 1240128743335375, 100752655285750}, + }, + }, + { + { + {5917065716904928, 4914443718136124, 5900862973774566, 4911826770493904, 3846361616833057}, + {2439789269177838, 681223515948274, 1933493571072456, 1872921007304880, 2739962177820919}, + {2102170800973153, 719462588665004, 1479649438510153, 1097529543970028, 1302363283777685}, + }, + { + {5650165172926835, 3913771113130458, 4910281332119388, 5068052063776583, 5612709493199633}, + {3193865531532443, 3321113493038208, 2007341951411050, 2322773230131539, 1419433790163705}, + {2214421081775077, 1165671861210569, 1890453018796184, 3556249878661, 442116172656317}, + }, + { + {5118771546583273, 6027449032225062, 3106360274232749, 4318897183975962, 4017125662271289}, + {3005630360306059, 1666955059895018, 1530775289309243, 3371786842789394, 2164156153857579}, + {1094538949313667, 1796592198908825, 870221004284388, 2025558921863561, 1699010892802384}, + }, + { + {3266123011223623, 3120950453625853, 6259609570067094, 3586752371060918, 6048545006453369}, + {1951351290725195, 1916457206844795, 2449824998123274, 1909076887557594, 1938542290318919}, + {764055910920305, 1603590757375439, 146805246592357, 1843313433854297, 954279890114939}, + }, + { + {4578096739917745, 5243693780562643, 3997054445402827, 5231313513873625, 3534834178102174}, + {80113526615731, 764536758732259, 3306939158785481, 2721052465444637, 2869697326116762}, + {525892105991110, 1723776830270342, 1476444848991936, 573789489857760, 133864092632978}, + }, + { + {4567722854714830, 3491727534333040, 3612522797131151, 4726210441025156, 4566029114558485}, + {2794411533877810, 1986812262899320, 1162535242465837, 2733298779828712, 2796400347268869}, + {1793193323953132, 91096687857833, 70945970938921, 2158587638946380, 1537042406482111}, + }, + { + {4644957907857340, 4595035516942998, 5590808199923137, 4081399466208167, 3445106834328894}, + {1895854577604590, 3646695522634664, 1728548428495943, 3392664713925397, 2815445147288308}, + {1611230858525381, 950720175540785, 499589887488610, 2001656988495019, 88977313255908}, + }, + { + {5377566504324214, 5594237977720934, 3960359138874383, 2924144408487157, 5824037597070734}, + {3440880315164906, 2184348804772596, 3292618539427567, 2018318290311833, 1712060030915354}, + {1508590048271766, 1131769479776094, 101550868699323, 428297785557897, 561791648661744}, + }, + { + {4856954879111275, 4243615896786977, 5034997993102829, 5162125577354786, 4490078142041683}, + {432920540217177, 290770592514699, 627484756484379, 3076610223383366, 982836063036305}, + {1857779135539838, 1774848070278290, 1383862392183037, 1948805685118077, 1143607656457264}, + }, + { + {5925968830616980, 5475584226682352, 5076614308992012, 5422447722241084, 4871259074999718}, + {1741735203658460, 2040511596280954, 3245879940788742, 1750904751318660, 1289068422789788}, + {103031326341235, 1843731695283489, 1066974994445109, 1210433521778964, 118970268237578}, + }, + { + {5029675928196841, 3837944199959690, 3856667351331398, 4299101000305422, 4340504849680591}, + {1990983617046169, 3106460878930032, 1275461113767736, 1443049000516840, 1724142301140669}, + {888262946735860, 1859763056800716, 714395964694532, 57820586821189, 354182478325612}, + }, + { + {3800325421725661, 5577357186452733, 3783169523012609, 5425955064608896, 6347571520159237}, + {1658219197861187, 1494360717755939, 1921505970326949, 3049386312266838, 2475279382922093}, + {1290766154788448, 1600589032610209, 784792370088015, 423204440383515, 459184860068298}, + }, + { + {3425205252763663, 5240056527358710, 4140356292677088, 4578393707504979, 5259386798582854}, + {2215101089214073, 1997062079162084, 1249116849924618, 465107085276733, 1293244424458276}, + {880894898454805, 639667973647762, 200272726605326, 297199521205209, 1640420309599773}, + }, + { + {4024399276644653, 4828207338948134, 4459991457755541, 6377452215012324, 4100282940590511}, + {658635179203333, 3717891363165700, 3673816673290121, 2129566854376278, 1443087419989351}, + {1532654097308642, 1958497386525981, 111717506991097, 1708848284574815, 1306115185198907}, + }, + { + {6112399743594082, 4482370964094274, 5295504988778619, 4900443159383520, 4202262340818045}, + {2039429018914652, 3043146685732704, 1364716986897875, 1031303003048000, 1123429638631433}, + {765045651502510, 451621180435426, 15885268584069, 767513226653014, 768056106241896}, + }, + }, + { + { + {4032987623010691, 3949423965177593, 3633193504625235, 4678793759655164, 3734854480100484}, + {3008217384184691, 2489682092917849, 2136263418594015, 1701968045454886, 2955512998822720}, + {2175517777364616, 708781536456029, 955668231122942, 1967557500069555, 2021208005604118}, + }, + { + {3694962906564668, 2643675345331409, 4432646948339879, 4968138170389248, 3845898010522424}, + {3366935780292116, 2476017186636029, 915967306279221, 593866251291540, 2813546907893254}, + {850858855888869, 319436476624586, 327807784938441, 740785849558761, 17128415486016}, + }, + { + {3776976050663564, 5477805104091557, 2545236069347884, 4651869248468534, 4641561625804457}, + {2132756334090048, 2788047633840893, 2300706964962114, 2860273011285942, 3513489358708031}, + {1121075518299410, 2071745529082111, 1265567917414828, 1648196578317805, 496232102750820}, + }, + { + {5158525177930532, 3420610809262104, 2827455773116173, 5409358332231883, 5000374192034028}, + {2374121042985030, 3274721891178932, 2001275453369483, 2017441881607947, 3245005694463250}, + {1954109525779738, 2117022646152485, 338102630417180, 1194140505732026, 107881734943492}, + }, + { + {4610031103869799, 4566082599491057, 6017046282479905, 5310858379140016, 4504138118839608}, + {1714785840001267, 4288299832366837, 1876380234251965, 2056717182974196, 1645855254384642}, + {2002850762893643, 1243624520538135, 1486040410574605, 2184752338181213, 378495998083531}, + }, + { + {4119798625761979, 5219024680951196, 4543568213831910, 4424867828271409, 5157422279171799}, + {922510868424903, 1089502620807680, 402544072617374, 1131446598479839, 1290278588136533}, + {162892278589453, 182585796682149, 75093073137630, 497037941226502, 133871727117371}, + }, + { + {4201115364782060, 3320803158679711, 4190964847185163, 3800027019416103, 4185567469546654}, + {4166396390264918, 1608999621851577, 1987629837704609, 1519655314857977, 1819193753409464}, + {1730519386931635, 1393284965610134, 1597143735726030, 416032382447158, 1429665248828629}, + }, + { + {4551201741097278, 3774114323393256, 2689506075058172, 3065835144123274, 2587730464618792}, + {360275475604546, 2799635544748326, 2467160717872776, 2848446553564254, 2584509464110332}, + {1291597595523886, 1058020588994081, 402837842324045, 1363323695882781, 2105763393033193}, + }, + { + {5895867926878639, 6191714343966274, 3878657686711880, 3772412065246579, 5254560912358513}, + {1828399243003455, 2730967851207580, 2809663501613790, 3291961475373747, 2085819249159773}, + {1604304703501714, 1563946362290690, 2128875205288733, 257625874150601, 2149102916187814}, + }, + { + {5883573429799187, 4805272859062230, 2886195180819460, 4460210052098162, 3528150621150027}, + {1960233741679201, 2996857902780426, 2245274121401778, 4454263006625692, 1110175461750907}, + {1392548583294657, 697289852607029, 746483005053522, 734366559550160, 929768637070953}, + }, + { + {5047299589947009, 4992620901798841, 5716112978503343, 3741839332315327, 4983937719789158}, + {1673816614349955, 3255360796858239, 2753984593405885, 2969035246796379, 2420194805583742}, + {1159863250954626, 1438000622355742, 254045494246044, 1734996482788294, 484539502358623}, + }, + { + {3740619537304301, 4538691700403019, 5325131682689719, 4744914552382795, 3720848390661317}, + {1212935253295623, 2026300849238541, 3447883684227245, 1364910689032303, 3019520894163467}, + {2014517785153097, 1607430272140319, 1855018731367383, 2200629261829065, 987339037980209}, + }, + { + {4426735416351775, 4348191232564971, 5508438055207952, 2420023948055060, 6131298111765032}, + {2763109171958591, 4020627496535071, 3147539030064750, 2177710318971894, 2463269685396658}, + {831460863845953, 1946524324541207, 761958653274011, 1366775091595921, 1187427455457947}, + }, + { + {3125773853625002, 4814913241945202, 4262512130702308, 3321059176595839, 3567623941809388}, + {2822285257464218, 607639870769094, 2857291392676774, 2362021242026611, 3328398883102618}, + {1972329598509655, 34473001166350, 1728817301333588, 1539479676009467, 1694458836743324}, + }, + { + {4805304108915754, 5125985383393506, 5019883131944028, 4580919291870093, 4156575634700942}, + {1575955157633628, 3067048601687650, 2501496271474334, 4193474980184415, 3288209175931426}, + {1442686188453203, 1751694580158105, 824989332883473, 614995267948452, 1497907423783166}, + }, + }, + { + { + {4408790844622027, 4479344310838572, 4120849908116869, 3006675674164362, 4006042157952305}, + {2361321796251793, 3967057562270386, 1112231216891515, 2046641005101484, 2386048970842261}, + {1846089562873800, 98894784984326, 1412430299204844, 171351226625762, 1100604760929008}, + }, + { + {5371908961903233, 6206610140112367, 4204489822423303, 4507924897296559, 4322883368647362}, + {2335972195815721, 2751510784385293, 425749630620777, 1762872794206857, 2864642415813208}, + {523094549451158, 401938899487815, 1407690589076010, 2022387426254453, 158660516411257}, + }, + { + {3975648787468681, 4460622334219928, 3970548136462187, 4226068267807189, 3446012315943388}, + {612867287630009, 2700012425789062, 2823428891104443, 1466796750919375, 1728478129663858}, + {1254114807944608, 977770684047110, 2010756238954993, 1783628927194099, 1525962994408256}, + }, + { + {5270938303411141, 3005889362003651, 3774991859324322, 4939345652492557, 5016292135810879}, + {2484263871921055, 1948628555342433, 1835348780427694, 1031609499437291, 2316271920603621}, + {1255955808701983, 1700487367990941, 1166401238800299, 1175121994891534, 1190934801395380}, + }, + { + {5381119574505877, 4424637839817897, 4775904018594624, 3906943141245230, 5389829033800309}, + {2600943821853521, 1337012557669161, 1475912332999108, 3573418268585706, 2299411105589567}, + {375806028254706, 214463229793940, 572906353144089, 572168269875638, 697556386112979}, + }, + { + {4199915895763317, 4306698118173043, 4456738998669147, 4714126432522633, 3038393400292872}, + {1168827102357825, 823864273033637, 4323338565789945, 788062026895923, 2851378154428610}, + {1915320147894736, 156481169009469, 655050471180417, 592917090415421, 2165897438660879}, + }, + { + {3081796668531198, 4720661405375633, 3938365723488886, 5850548444590341, 6227423178100675}, + {1726336468579724, 1119932070398949, 1929199510967666, 2285718602008207, 1836837863503149}, + {384301494966394, 687038900403062, 2211195391021739, 254684538421383, 1245698430589680}, + }, + { + {3700877198419411, 4541885072828491, 4388337472863078, 4398292814526820, 5228760778493620}, + {1247567493562669, 4229981908141095, 2435671288478202, 806570235643434, 2540261331753164}, + {1201928866368855, 800415690605445, 1703146756828343, 997278587541744, 1858284414104014}, + }, + { + {3752846457602541, 6051774917153047, 3492614771149749, 5278195549012933, 3851678670548516}, + {1251637423994861, 2037585266091733, 1171182249847439, 1503770304884899, 1938920423810268}, + {2232651154426557, 514116965743385, 983369998596377, 1516132019440103, 1692302360068816}, + }, + { + {4860689994687041, 4138464101331517, 4969836424606600, 3370757908330089, 3017690336853320}, + {3753543276036939, 3037198013841237, 3063121586956950, 2967087171212783, 2388800428725970}, + {1485716675407214, 1159619625081800, 197549418633523, 776030397384998, 252064880140599}, + }, + { + {4116450327020509, 4602447751059104, 4624188822504437, 3786392386215792, 4018069243702311}, + {3871066258534097, 182982139320960, 3846997414183091, 1246347657803786, 966334158538299}, + {2049526525941781, 1431983169228179, 3669291297222, 769041933664973, 1760968694339914}, + }, + { + {5411552533375856, 4680723354107633, 5764453140711672, 3663956673248104, 5834177820168369}, + {2029548972200054, 541413050113871, 2564963424993232, 3150712544977872, 2699322542672271}, + {513500031822581, 836561902873502, 82127696349010, 1591221763097659, 725989684331322}, + }, + { + {4424236584915172, 3098952863411429, 2785705377786181, 4107549518995786, 5362683219257666}, + {1071376590195254, 1910139340535847, 1936705400579295, 3523841068963764, 2356086500199738}, + {357287898232758, 1026512116626804, 1875958986125314, 1743551742697910, 1876232951311596}, + }, + { + {4332669232306147, 5882550009365637, 3881970305785489, 6570990168178499, 3489314838073396}, + {294975596735049, 2145292931466411, 3320625656613141, 2284954433570209, 3090254877821144}, + {1234852195927098, 3815763342761, 2085449281682153, 516098044852331, 164426832090235}, + }, + { + {3292223948318582, 4463121371440286, 5163264330075513, 4550237542693388, 4544934760614835}, + {2590122580645644, 1011386629068498, 960875975353535, 3791419723576010, 2273772136048635}, + {1749858954947675, 1561651915395372, 1738700200168191, 397865176422134, 1467025336447738}, + }, + }, + { + { + {3011428551915689, 3264493287961099, 4857379860456993, 4749679688758046, 4282178671364408}, + {2608268623334125, 3034173730618399, 1718002439402869, 3644022065904502, 663171266061950}, + {2040672435071076, 888593182036908, 1298443657189359, 1804780278521327, 354070726137060}, + }, + { + {4711536788361604, 4516566538409613, 5324597415653586, 3262240285890532, 3953172703826057}, + {1894938527423184, 3715012855162525, 2726210319182898, 2499094776718546, 877975941029127}, + {218882774543183, 533427444716285, 1233243976733245, 435054256891319, 1509568989549904}, + }, + { + {4802737216830789, 3846171402668813, 5371658121409568, 4761371218007175, 4056812806828167}, + {4140638349397055, 3303977572025869, 3465353617009382, 2420981822812579, 2715174081801119}, + {1806842755664364, 2098896946025095, 1356630998422878, 1458279806348064, 347755825962072}, + }, + { + {5169106331623846, 4777370102540357, 5302836601573124, 5351928617448052, 4063248596493177}, + {1402334161391744, 3811883484731547, 1008585416617746, 1147797150908892, 1420416683642459}, + {1468412523962641, 771866649897997, 1931766110147832, 799561180078482, 524837559150077}, + }, + { + {5770203524895319, 4659978036228594, 3527448837914025, 4951338033258915, 4756786089433589}, + {2223212657821831, 2882216061048914, 2144451165500327, 3068710944633039, 3276150872095279}, + {2022215964509735, 136144366993649, 1800716593296582, 1193970603800203, 871675847064218}, + }, + { + {5731767721917939, 4837733510733388, 5091167195790575, 4937212217651675, 5106990027743699}, + {1862751661970309, 851596246739884, 1519315554814041, 3794598280232697, 3669775149586767}, + {121893973206505, 1843345804916664, 1703118377384911, 497810164760654, 101150811654673}, + }, + { + {2836122124869624, 4884260866172613, 4618439021898554, 2906882084185319, 4363655839720099}, + {2710146069631716, 2542709749304591, 1452768413850678, 2802722688939463, 1537286854336537}, + {996965581008991, 2148998626477022, 1012273164934654, 1073876063914522, 1688031788934939}, + }, + { + {3949497701489527, 5838943331198768, 5334888242577534, 5453016312620545, 4792359904762516}, + {3175286832534829, 2085106799623354, 2779882615305384, 1606206360876187, 2987706905397772}, + {1419122478109648, 1325574567803701, 602393874111094, 2107893372601700, 1314159682671307}, + }, + { + {4954618339278337, 3422305785425208, 4565328836139485, 3192891441493866, 4836379953614308}, + {855396458506247, 2470294140783466, 4436061492213979, 1754097632720488, 4112391040574456}, + {985511568884890, 583904209238998, 516128993365349, 1235577837475387, 1449904660690748}, + }, + { + {5895940682517746, 4393238442290827, 4244687834629046, 5245476345580864, 4795864303032094}, + {1477173810966796, 3207978347793495, 2656860913951054, 825157489520718, 2782873637674750}, + {12931323257125, 562700432679180, 780577595442459, 440747171628074, 31993258894121}, + }, + { + {5231235667053925, 5090675513104692, 4933657013889560, 5325938777525481, 4583903281916140}, + {2159229926833831, 1114556221271056, 2050697214928106, 2553796628978461, 2874553280901592}, + {1487427059839672, 1966052937474419, 398866894053509, 2040723626090668, 1223074007342359}, + }, + { + {3294796902098517, 3902877656361122, 4227499257540629, 5627711142390550, 5038311124292534}, + {2677874505039557, 678833394869758, 3687464289589147, 1992670845292812, 654778477108270}, + {651854196246431, 2602668557028, 1822678077647200, 2072267608435533, 435243653222236}, + }, + { + {4313218743534013, 3972172746637215, 5399714135650344, 5547659251980199, 4837224811093838}, + {2487053592812311, 2315738098787275, 1210583464083714, 1056644723032111, 781277197910636}, + {864616322745343, 1362699579128647, 1361407419724038, 495664202671974, 662016549521786}, + }, + { + {6154029469581357, 5498138279894180, 3281752713530018, 3501917375982713, 4910547940594210}, + {2672416110637939, 3245298985644332, 1344078619347414, 2037703067415133, 2697812769645364}, + {325041473989085, 842410640177049, 1052993540865892, 2093280369201601, 361408260911216}, + }, + { + {4388597398802075, 4997551911436129, 2851157853262017, 4795345418726848, 4139150667184165}, + {1519253497716003, 3826826078266703, 2262276529333275, 1386373334348474, 3240242941348023}, + {763973845167102, 1151501355459051, 1283654593302800, 584312404348728, 1219116745359281}, + }, + }, + { + { + {5676939182921069, 5322204711648077, 4551121131734783, 5427708347935459, 5239023033125000}, + {2201150872731785, 2180241023425241, 2349463270108411, 1633405770247823, 3100744856129234}, + {830104860549448, 1886653193241086, 1600929509383773, 1475051275443631, 286679780900937}, + }, + { + {4781988283280724, 4990742996470332, 5431361832879221, 4684617167544704, 3868686514426533}, + {3828911108518224, 3282698983453994, 2396700729978777, 4216472406664814, 2820189914640497}, + {1191033906638969, 940823957346562, 1606870843663445, 861684761499847, 658674867251089}, + }, + { + {5126469419668815, 4155719092635613, 4174388435346876, 3772374525285681, 5590700387545135}, + {1875032594195527, 1427106132796197, 2976536204647406, 3153660325729987, 2887068310954007}, + {25465949416618, 1693639527318811, 1526153382657203, 125943137857169, 145276964043999}, + }, + { + {4258045666458167, 5238362362206654, 4758242557133921, 3658013106441212, 2491103563202933}, + {2466539671654587, 920212862967914, 4191701364657517, 3463662605460468, 2336897329405367}, + {1619678837192149, 1919424032779215, 1357391272956794, 1525634040073113, 1310226789796241}, + }, + { + {4248523125120879, 4096142580252307, 5489055327836539, 3417724495086206, 4815108317240624}, + {3292563523447371, 1704449869235351, 2857062884141577, 1998838089036354, 1312142911487502}, + {43173156290518, 2202883069785309, 1137787467085917, 1733636061944606, 1394992037553852}, + }, + { + {4449014387058033, 5297853724611810, 5533789687884231, 2519432329227148, 4292277862887871}, + {670078326344559, 2807454838744604, 2723759199967685, 2141455487356408, 849015953823125}, + {1812516004670529, 1609256702920783, 1706897079364493, 258549904773295, 996051247540686}, + }, + { + {5827060326775227, 5766290385251485, 3123576947163146, 5563678522359472, 3964036703348132}, + {1540374301420565, 1764656898914615, 1810104162020396, 3175608592848336, 2916189887881826}, + {1696163952057966, 1391710137550823, 608793846867416, 1034391509472039, 1780770894075012}, + }, + { + {5101135942842208, 4543974686113080, 4194056217641295, 5689084272866427, 2564466095709391}, + {1367603834210822, 4383788460268472, 890353773628143, 1908908219165595, 2522636708938139}, + {1919411405316294, 1234508526402192, 1066863051997083, 1008444703737597, 1348810787701552}, + }, + { + {4132340278436948, 4005982088010057, 3308609415246807, 3692550296463618, 3956871570338410}, + {1096972188133236, 3816049499915451, 1251976741328773, 1219603529073670, 1078899265206338}, + {950202511700693, 1240039391743494, 1169033682725545, 1423696267961315, 86935143579550}, + }, + { + {4756214981813576, 5522632333569959, 3862983342357100, 4309495274365548, 5713360895956932}, + {2683363149107878, 1470385524874179, 725539084456484, 3271790833618750, 1222340934084308}, + {200587706310533, 896271240996831, 1147839003219597, 673448965331479, 548900916085084}, + }, + { + {3550032568832337, 4838968015489313, 4675889877479625, 3212531632461645, 4765584451232964}, + {1405860849520605, 738725235942165, 399531320766275, 3195580921007755, 1958618144816834}, + {94349687650983, 306368484955948, 1759034073892087, 2030110332880331, 1270749214795711}, + }, + { + {2967631947537871, 4383349957254579, 3922288445505558, 5226885511958431, 3995794596785200}, + {1753118377928377, 3368465588051047, 1755914948419738, 3441455854862245, 647766692547292}, + {2005162920381704, 1507493192705080, 1430523618875617, 131673490468702, 662093487452573}, + }, + { + {2747463689102953, 5007357876041009, 5072033195962826, 4670246809435049, 5673751346141763}, + {2718321167227969, 855141819034537, 1769780985173952, 3439183400564947, 1192259870209089}, + {747964066233340, 2037427400347459, 49693847757217, 2003202980691532, 2230561945728266}, + }, + { + {4747984612298188, 4723422270130357, 4628272886928943, 3839214906514725, 5200339299152060}, + {1424576382204282, 350051250024461, 3895326653518337, 3070821812734749, 3346444741017048}, + {2021002858021100, 839958875652478, 2080082610761570, 1282995787185392, 313106058533657}, + }, + { + {5293324356940491, 3886891387640488, 5386021427475165, 4491415749098830, 3988924707585306}, + {2136145829133251, 713070507515938, 1951333115623761, 3770252317439440, 1824831508473442}, + {2203533335083089, 2130417962449796, 217179607020589, 153498131255469, 1884913426826060}, + }, + }, + { + { + {6357530995067419, 4511707601241201, 4853814131499793, 3027006748267833, 4004117462852039}, + {2102881477513865, 3822074379630609, 1573617900503707, 2270462449417831, 2232324307922097}, + {1417148368003523, 721357181628282, 505725498207811, 373232277872983, 261634707184480}, + }, + { + {3519916180986434, 5063756715513304, 5306226466970938, 4461989750290959, 5633593412950483}, + {2186733281493248, 2250694917008620, 1014829812957440, 2731797975137637, 2335366007561721}, + {615183387352312, 917611676109240, 878893615973325, 978940963313282, 938686890583575}, + }, + { + {4051478965894094, 5415732403270882, 4529567395411473, 4935730075960955, 4778168617632490}, + {522024729211672, 3296859129001056, 1892245413707789, 1907891107684253, 2059998109500714}, + {98698809797682, 2144627600856209, 1907959298569602, 811491302610148, 1262481774981493}, + }, + { + {5721409450692386, 4425747098618406, 6490527463642820, 3639914744810785, 4516285758530664}, + {1791451399743152, 1713538728337276, 2370149810942738, 1882306388849953, 158235232210248}, + {1650875518872272, 1136263858253897, 1732115601395988, 734312880662190, 1252904681142109}, + }, + { + {5306746809205765, 3120741251682392, 2568099116674910, 5447095217001045, 2823024101589818}, + {2624786269799113, 2777230729143418, 2116279931702134, 2753222527273063, 1907002872974924}, + {227742695588364, 1776969298667369, 628602552821802, 457210915378118, 2041906378111140}, + }, + { + {3832015885289562, 4129797318027691, 5360746788631408, 5207122354148972, 4434563787896849}, + {815000523470260, 3164885502413555, 3303859931956420, 1345536665214222, 541623413135555}, + {1870080310923419, 71988220958492, 1783225432016732, 615915287105016, 1035570475990230}, + }, + { + {4881216209018060, 3833780216763759, 5307643745501116, 4286182636729437, 5147443675842680}, + {2982787564515398, 857613889540279, 1083813157271766, 1002817255970169, 1719228484436074}, + {176957326463017, 1573744060478586, 528642225008045, 1816109618372371, 1515140189765006}, + }, + { + {2695191990687280, 4737393024215632, 4451306435997662, 3263658520201184, 3226476650748376}, + {1888911448245718, 3638910709296328, 4176303607751676, 1731539523700948, 2230378382645454}, + {1846351103143623, 1949984838808427, 671247021915253, 1946756846184401, 1929296930380217}, + }, + { + {4257691815043557, 4587099125055339, 4378829326829150, 4530783676112038, 5088169500723328}, + {2633154847819111, 2373317802678415, 4226812651282694, 3531985668346704, 3254298087102270}, + {1896123626988797, 1131351092678624, 1831358114864483, 1263257519094555, 153161823153575}, + }, + { + {5013999188326350, 5342051120597129, 5658875547575315, 4993589587822012, 3418484323529615}, + {2875848054604140, 2609079967536269, 3221396114275243, 1330649045956928, 1828925625187427}, + {85523512650066, 1145743424577874, 270900922559567, 1781500837265517, 1998986005265292}, + }, + { + {4300315009401728, 4620112123771453, 2612760971016545, 3052063778972094, 4706549333122035}, + {2904227921845290, 4267364811643403, 1994336236107343, 2172724361186958, 2854607055726693}, + {2127639189718319, 2205729457048157, 1849555339256920, 1751645797856968, 1883138982486949}, + }, + { + {3989916020510698, 4741941595447558, 5214589701377240, 4351148330446081, 3428672470823222}, + {762600272699964, 2753498328779892, 3316416370655704, 526788695246361, 3062867170941268}, + {1503368613839734, 2009362771486879, 495897391474535, 1905468005297555, 272387388531978}, + }, + { + {5813046901089551, 5050432868964283, 4705275668110217, 4196337029208819, 5257156494192722}, + {1830890930331365, 3828112268992685, 3895633691902557, 3356965264729727, 2386741853982022}, + {995710478389517, 1430833880042694, 1172677663947400, 1545257382741759, 1798260148494462}, + }, + { + {5205850356707429, 4686811868434220, 5616916192509070, 4494846080958018, 5419646380822597}, + {1276458355120913, 2527187906858810, 1130163473530636, 3533175711581762, 2161750040536619}, + {1025062667466023, 43711902086443, 2210112172846377, 233136450830559, 1412931651896051}, + }, + { + {3560341629038503, 4545538003102686, 5283269045082286, 4816839347899222, 4801547130939062}, + {2448047678851139, 599053419172738, 3080495073729726, 1198848441856844, 1359787207816262}, + {555971766815523, 2160228751293088, 266579216919501, 408880354152864, 2184471346102790}, + }, + }, + { + { + {5195617294728737, 5226905206197221, 3889841953548511, 5251818933360801, 4838188827894395}, + {849646212451983, 1410198775302919, 2325567699868943, 1641663456615811, 3014056086137659}, + {22893968530686, 2235758574399251, 1661465835630252, 925707319443452, 1203475116966621}, + }, + { + {3154905071699595, 4930741522303542, 5064786644540271, 4136130058087200, 4165945522107466}, + {3053098849470395, 3985092410411378, 1664508947088595, 2719548934677170, 3899298398220870}, + {1344191060517578, 1960935031767890, 1518838929955259, 1781502350597190, 1564784025565682}, + }, + { + {4168985401048642, 5601942199123232, 4509535428414908, 4252327476037085, 6042239923552064}, + {2925523165433334, 1979969272514922, 3427087126180756, 1187589090978665, 1881897672213940}, + {2495540013192, 678856913479236, 224998292422872, 219635787698590, 1972465269000940}, + }, + { + {4698182657338567, 5017916408838259, 3081477769920918, 3928215500558329, 5313704211766335}, + {271413961212179, 3604851875156899, 2596511104968730, 2014925838520661, 2006221033113941}, + {1980510813313589, 1948645276483975, 152063780665900, 129968026417582, 256984195613935}, + }, + { + {5300264442994823, 3794960652558197, 6004497419208260, 6170915605358895, 5102903504401205}, + {1860190562533083, 1936576191345085, 2712900106391212, 1811043097042829, 3209286562992083}, + {1151480509533204, 2136010406720455, 738796060240027, 319298003765044, 1150614464349587}, + }, + { + {5520821677598445, 4505587343518853, 4486119403320947, 5124882310463887, 4384352945448272}, + {1731069268103131, 2987442261301335, 1364750481334267, 2669032653668119, 3178908082812908}, + {1567828528453324, 1017807205202360, 565295260895298, 829541698429100, 307243822276582}, + }, + { + {4341766796632437, 4105940157601428, 4403780572905254, 4391581105946996, 4661670073235412}, + {249079270936229, 1501514259790706, 3199709537890096, 944551802437486, 2804458577667728}, + {1338766321464554, 1906702607371284, 1519569445519894, 115384726262267, 1393058953390992}, + }, + { + {4136644411018817, 5105079697639574, 5123803130450031, 3331327213803161, 3453876506817262}, + {3616421371950629, 3764188048593604, 1926731583198685, 2041482526432505, 3172200936019022}, + {840922919763324, 727955812569642, 1303406629750194, 522898432152867, 294161410441865}, + }, + { + {5565570118069330, 4591619629413879, 3505524267391659, 5911065393515679, 5626780252302286}, + {2954349327665336, 2875421537282295, 1177907047549607, 2315244756624323, 3303388475971642}, + {1193532613439179, 1341357357703238, 1857522674746129, 587336359047056, 1462817734082691}, + }, + { + {5032608083579310, 5556680383291862, 4639031978972564, 2550751933150061, 4661900946642239}, + {981709001326388, 2228829982452486, 1195252744174570, 1961335123791201, 473922585791741}, + {158547452916311, 1806851940249257, 1888549274109445, 1234535032385844, 755999937979748}, + }, + { + {5099505633219587, 3654947652195304, 4632839805758299, 3516983533390311, 3156502843280841}, + {2235936902666817, 1844821659342916, 4255944160143733, 2705728103151199, 1360010073190141}, + {1966276380904262, 1243659846916250, 1230287549611464, 1790496592504769, 385075881855087}, + }, + { + {5102974111125320, 5352605641984611, 4254853167292498, 4166876022626639, 4692858050734664}, + {808958715657412, 2787760179369277, 2812754371047796, 3109195163271007, 3174221799565416}, + {1970356456788069, 1887106101566224, 2120741856788965, 1887465058487327, 166078852378175}, + }, + { + {5268074145727905, 3102961204581063, 5775739741243707, 6623549226998551, 5355512520264473}, + {1475882426726637, 2923995069592105, 2595116660588037, 2134573872614909, 2857982748479313}, + {957649428811476, 1521919451665798, 1487878569331559, 1715152263604455, 2000934618350472}, + }, + { + {3462276468747197, 4403243110229213, 5274708467449337, 4946143993185919, 6100123938510411}, + {2624197675552195, 2160845895419703, 991891416996825, 2705836223851003, 2307139020684469}, + {231885416467149, 648441606302746, 1371491506634443, 193373311482025, 2106953050161716}, + }, + { + {2408565470230034, 4633147941257550, 4425551739809483, 4183865634168848, 4784444305258783}, + {2307403528152576, 3136574081495182, 3694424861021853, 1950918571001278, 1747697954472435}, + {931185174846608, 872635055344100, 1155298897916392, 1344438153479985, 863698029056587}, + }, + }, + { + { + {2611656183523465, 4684513982859178, 5365326100017121, 4722407564633480, 2827426586917747}, + {2605560604520539, 1598361541848742, 3374705511887547, 4174333403844152, 2670907514351827}, + {755467689082474, 909202735047934, 730078068932500, 936309075711518, 2007798262842972}, + }, + { + {3236138991462016, 3067527600191131, 3896954399398994, 3910874778063800, 3938401465669403}, + {1609384177904054, 2614544999293875, 1335318541768200, 3052765584121496, 2799677792952659}, + {1697863093781930, 599794399429786, 1104556219769607, 830560774794755, 12812858601017}, + }, + { + {4108730476499120, 5181690479373092, 4171978954440413, 3511327647445115, 4559140599266006}, + {1168737550514982, 897832437380552, 463140296333799, 2554364413707795, 2008360505135500}, + {1158643631044921, 476554103621892, 178447851439725, 1305025542653569, 103433927680625}, + }, + { + {3077203098880308, 4396008401246031, 4177351818329890, 6418777467377480, 5519551756318358}, + {2176793111709008, 3828525530035639, 2009350167273522, 2012390194631546, 2125297410909580}, + {1807108316634472, 1534392066433717, 347342975407218, 1153820745616376, 7375003497471}, + }, + { + {4732167545780233, 5368693586150714, 2609883700135802, 4663217517029815, 3612437739977844}, + {3234860815484973, 2683011703586488, 2201903782961092, 3069193724749589, 2214616493042166}, + {234147501399755, 2229469128637390, 2175289352258889, 1397401514549353, 1885288963089922}, + }, + { + {5617390325210756, 5554766767336738, 5549530285921438, 6514965868913137, 3937966638306001}, + {3363562226636810, 2504649386192636, 3300514047508588, 2397910909286693, 1237505378776769}, + {1054097349305049, 1872495070333352, 182121071220717, 1064378906787311, 100273572924182}, + }, + { + {4607833422014698, 3800719604873494, 4476341726952553, 4306709190801725, 3295603202700400}, + {3558210666856834, 1627717417672446, 2302783034773665, 1109249951172249, 3122001602766640}, + {216762189468802, 707284285441622, 190678557969733, 973969342604308, 1403009538434867}, + }, + { + {4847405480488793, 3554016671099447, 2818672356908788, 4302938753224251, 4825028485754775}, + {3530824104723725, 2596576648903557, 2525521909702446, 4086000250496689, 634517197663803}, + {470067171324852, 1618629234173951, 2000092177515639, 7307679772789, 1117521120249968}, + }, + { + {4032307292940140, 4855742012511787, 4007061004220393, 4186026976205829, 5188147460015837}, + {1726290253928048, 2108179153379055, 3599306339052623, 3804322907336713, 740669388116407}, + {1893601910775915, 1893561171028788, 174914675480509, 2073460144115735, 250678301747773}, + }, + { + {5696478198308385, 3135077959467853, 5039986204304988, 5696739636381970, 5163380137461980}, + {1473356281060031, 1850501243620073, 559809451272168, 2164039335364390, 2799937740729438}, + {506406583155327, 1903499899096002, 445887262445598, 866962765497367, 55809365421254}, + }, + { + {5290224396694939, 4705669579710662, 4614921349557141, 5027610124814334, 5088773866023979}, + {2009707214072007, 3490160897828618, 275706542492147, 1283471147003836, 2026672645131195}, + {1123457689056584, 2213608670005209, 1379370540202855, 2074314852377531, 864461310144552}, + }, + { + {5111150460891680, 4275734012505621, 4206718452855061, 3888755110807716, 5005016151412877}, + {2967787444233740, 1413004988964951, 690605351712577, 3813861694171786, 728516486273669}, + {2016155040846069, 1480238949730910, 882386999623863, 1367342654128568, 589184047321896}, + }, + { + {3850772783035735, 4143292076634522, 5556861502206409, 4279143658707597, 3550043180479289}, + {3493927566017921, 3571431901909570, 2627286406743953, 2047641118374561, 1730233493072697}, + {272317805124786, 1812925138663726, 1217316351219782, 1182300795957412, 1252963393607199}, + }, + { + {5371799854215572, 3393967588858477, 5067027508227680, 3852577519740789, 4734905175716170}, + {3515527020405104, 2159318542704715, 1058260913419646, 2981918447395233, 1340478002453928}, + {896362445577855, 1547885531466434, 942263962614365, 1148475609702329, 2122889133222112}, + }, + { + {5312477093520487, 3952229351525915, 5253212242457428, 4756871683292235, 4134773488559657}, + {2735014629385533, 1581591485505255, 1720528958990566, 4161950575359359, 2332085424554487}, + {704970088806441, 1168889861388831, 354811087636935, 1536113135588939, 2212112893107236}, + }, + }, + { + { + {2828809211088312, 6295039889156786, 4429443549656884, 4678145777282455, 5916104705152820}, + {2529951391976704, 1810282338562946, 1771599529530998, 3635459223356879, 2937173228157088}, + {893719721537457, 1201282458018197, 1522349501711173, 58011597740583, 1130406465887139}, + }, + { + {4766083398225008, 5494110682478710, 2778685366456944, 2823464210331405, 4857685817649218}, + {412607348255434, 1280455764199780, 2233277987330768, 2265979894086913, 2583384512102412}, + {1820352417585487, 24495617171480, 1547899057533253, 10041836186225, 480457105094042}, + }, + { + {5647768329980203, 5108044017780681, 3796340935441384, 4177115363811274, 5130001056264497}, + {2023310314989233, 2889705151211129, 2106474638900686, 2809620524769320, 1687858215057825}, + {1922168257351784, 2018674099908659, 1776454117494445, 956539191509034, 36031129147635}, + }, + { + {4561842048916374, 4287612509327089, 4370291679808170, 5695284091186768, 4550521144824593}, + {2796444352433270, 1039872944430373, 3128550222815858, 2962457525011798, 3468752501170219}, + {272268252444639, 1374166457774292, 2230115177009552, 1053149803909880, 1354288411641016}, + }, + { + {5697036697171416, 5404706777075284, 5503272547981905, 4981184452172701, 4867839206068339}, + {1857910905368338, 1754729879288912, 3137745277795125, 1516096106802165, 1602902393369811}, + {886299989548838, 1538292895758047, 1590564179491896, 1944527126709657, 837344427345298}, + }, + { + {3561647617580592, 3713951676498321, 4714970494042065, 3796394966388927, 5531291426324585}, + {3006358179063534, 1712186480903617, 3955456640022779, 3002110732175033, 2770795853936147}, + {803217563745370, 1884799722343599, 1357706345069218, 2244955901722095, 730869460037413}, + }, + { + {5199950995983500, 5997984878609744, 5241636760987426, 5139985135222038, 5431082849981900}, + {2941099284981214, 1831210565161070, 3626987155270686, 3358084791231418, 1893781834054268}, + {1949114198209333, 1104419699537997, 783495707664463, 1747473107602770, 2002634765788641}, + }, + { + {3320700462489453, 4258691810757797, 5637648896716044, 3890560459865337, 4307195898311025}, + {1607325776830197, 2782683755100581, 1451089452727894, 3833490970768671, 496100432831153}, + {2222475519314561, 1870703901472013, 1884051508440561, 1344072275216753, 1318025677799069}, + }, + { + {4037612142179094, 2987286320918074, 5334840876971305, 3892287190264789, 5794263680951471}, + {471926402845486, 2814813543274642, 3620200888572759, 1728489506884653, 3177161343196207}, + {1819395223745913, 594758877920007, 1653753349717506, 242640844960873, 963869472910932}, + }, + { + {2936569169465705, 6049214516933086, 5963733906800640, 4231427100807371, 4853047066834829}, + {2548596925868729, 2662135700065828, 2088163736824992, 2331981460676031, 2771125203890139}, + {780634400476978, 637764048158951, 901014587909154, 1354805333992459, 2018934308296179}, + }, + { + {2797688906622325, 3428210403110380, 5022584852934687, 3295825468273441, 5705393166486691}, + {2111199241475135, 1851629318616336, 1992578166276991, 2095428925801999, 1218266125748465}, + {1810680242312559, 952287178947563, 681241246062059, 1252456339225424, 1959931529139639}, + }, + { + {4919536354167776, 4843044804249283, 4705930511557457, 5262690042745614, 4386984625976838}, + {3747081830160208, 1520760409479969, 1598412209810121, 1654404133831532, 437659257098574}, + {744124236937047, 1544378156616778, 715829909389559, 2120659842894185, 72002654880101}, + }, + { + {4563826663843359, 5185090504058247, 5145727029702249, 5011944329783380, 5313803489832094}, + {244278499662023, 2000287644883357, 3512120660608951, 1998820466139820, 2107051881706162}, + {1061541907539207, 1129143356143074, 459133314948729, 1177985907118634, 1224368687812524}, + }, + { + {3152842550820126, 4081984728409524, 3254259750651619, 4604329179757860, 4471438744025494}, + {2383716445654654, 2845501105364248, 3179274641918483, 2181012191586748, 4055424112922904}, + {1792270341351139, 2065266134997868, 51895527839218, 798734893906822, 992253836606399}, + }, + { + {4950351600164207, 5298895157252043, 5150281689404603, 4544152582549862, 5356669996354042}, + {1927020266981541, 1747143248428675, 1588706088137551, 1077596294054796, 1170976366872068}, + {1001666581039191, 1742276948383877, 1379478310433234, 767654427573973, 2047968425937961}, + }, + }, + { + { + {4511412834337187, 4698043828798044, 4323205223211753, 5569204703546807, 6149086417101785}, + {155711679280637, 681100400509288, 389811735211209, 2135723811340709, 2660533024889373}, + {16625790644959, 1647648827778410, 1579910185572704, 436452271048548, 121070048451050}, + }, + { + {4694164895067901, 2924655519713304, 4842396181739721, 4841286895864398, 5356846476062228}, + {3289062842237779, 2820185594063076, 2549752917829677, 3810384325616458, 2238221839292470}, + {1763863028400139, 766498079432444, 1321118624818005, 69494294452268, 858786744165651}, + }, + { + {4869852729848717, 5029275869879305, 3701410808950684, 3435100659007430, 4689559933862040}, + {3543856582248253, 1456632109855637, 3352431060735432, 1386133165675320, 3484698163879000}, + {28315355815982, 460422265558930, 1799675876678724, 1969256312504498, 1051823843138725}, + }, + { + {4558284163736209, 4461809852221468, 5698584425525803, 5038838655144199, 3768154892986607}, + {2408714813047231, 3857948219405196, 1665208410108429, 2569443092377519, 1383783705665319}, + {1484387703771650, 198537510937949, 2186282186359116, 617687444857508, 647477376402122}, + }, + { + {4662985813836019, 4129426407048187, 5122336824431007, 5530273911701301, 3409921574477931}, + {2147715541830533, 2751832352131065, 2898179830570073, 2604027669016369, 1488268620408051}, + {1744544377739822, 1964054180355661, 1685781755873170, 2169740670377448, 1286112621104591}, + }, + { + {3854053602374273, 4943141672260381, 4472148111349729, 5161477038123364, 4661051199882732}, + {2333777063470241, 3919742931398333, 3920783633320113, 1605016835177614, 1353960708075544}, + {1029287186166717, 65860128430192, 525298368814832, 1491902500801986, 1461064796385400}, + }, + { + {3437283298068479, 3608139386273800, 5088531994686943, 4605732407316964, 6296522248487285}, + {2660016802414475, 2121095722306988, 913562102267595, 1879708920318308, 2492861262121979}, + {1966196870701923, 2230044620318636, 1425982460745905, 261167817826569, 46517743394330}, + }, + { + {6233793835087996, 4935389669690266, 6335114860649961, 3623880366453827, 5578113556752255}, + {2358877405280588, 3136759755857592, 2279106683482647, 2224911448949389, 3216151871930471}, + {1450880638731607, 1019861580989005, 1229729455116861, 1174945729836143, 826083146840706}, + }, + { + {3994140066248694, 3181522224560048, 3364322700715335, 6108496090134019, 4266308196944062}, + {978398934730796, 1804963209584982, 2902083217855803, 2011728779166715, 3070976799182328}, + {494691910923538, 1903565874798025, 2115181773831520, 2000771501496645, 2163753695162256}, + }, + { + {4499039401984510, 2919282610904813, 3371698570925682, 3170519001059914, 5250127479378489}, + {1654039515014884, 2484661430680993, 2620692000541228, 2669599656280070, 2398652280696967}, + {2019971150480802, 2112841493625261, 237154577131804, 1674207955014809, 1389703158284583}, + }, + { + {4706814366157303, 5336609175411517, 4757963599977030, 4060364649415927, 3640669095240911}, + {780624938414169, 3404608320205059, 1982958325444026, 3570514777233615, 984254926012775}, + {1463658959517057, 1983397723547684, 41055560978805, 424638764130418, 491755157953272}, + }, + { + {3257295355011901, 4096776962011503, 4487597369409850, 5876979850901767, 6030505591690325}, + {2935104701953453, 3989681641092319, 3306366339882358, 2374391350196501, 1896075761392399}, + {1262337399368722, 1039133447611747, 917288766852537, 1931663063827599, 386956994697158}, + }, + { + {5865485955051801, 4898975626365390, 5709055439582716, 3072783210395629, 4352817622936409}, + {2724577252043037, 1050316213165918, 2370342271552724, 2792859709284319, 2760145987712013}, + {1677351910521822, 152891770438727, 738510373109788, 1296476386064424, 1219545250565005}, + }, + { + {2955221061271345, 5973180148171190, 3740903689178612, 4255579446112404, 4178816467357894}, + {1908022307626643, 2469819122662084, 1583327987932656, 3442462106139746, 599498145240366}, + {220308000962909, 460573332431611, 732078470162760, 467340602781483, 1127652895548970}, + }, + { + {4256843681823156, 4695170685669586, 4012905106498514, 5492595949894092, 4822219141250098}, + {1289113762003406, 2808167474320130, 1666802361626320, 1051654028271354, 1724653376239634}, + {1695390634076771, 1517610099990508, 1248456812719894, 2178282202616225, 905038523003109}, + }, + }, + { + { + {4388488268525257, 4351308814649541, 3942600308931722, 3469443492260723, 3080520458769465}, + {1899935429242705, 1602068751520477, 940583196550370, 2334230882739107, 1540863155745695}, + {765548025667841, 462473984016099, 998061409979798, 546353034089527, 2212508972466858}, + }, + { + {6305035755313584, 3986236631593136, 5772327717715563, 4670602724441205, 4485397579520202}, + {2298375097456408, 3144370785258318, 1281983193144089, 1491520128287375, 75847005908304}, + {1997562060465113, 1048700225534011, 7615603985628, 1855310849546841, 2242557647635213}, + }, + { + {3608844722049986, 2980930458947685, 6266068700289474, 3617433430563704, 4684882533775436}, + {1161017320376250, 2744424393854291, 2169815802355236, 3228296595417790, 1770879511019628}, + {1080413443139865, 1155205815510486, 1848782073549786, 622566975152580, 124965574467971}, + }, + { + {4272336182688229, 4705861119105631, 3304969482836130, 4308331792957791, 5281765142064806}, + {1184526762066993, 247622751762817, 2943928830891604, 3071818503097743, 2188697339828084}, + {237404399610207, 1308324858405118, 1229680749538400, 720131409105291, 1958958863624906}, + }, + { + {4785126936528543, 2288770346086770, 3118706734562790, 4474082416637981, 5793198356960377}, + {2767383321724075, 2269456792542436, 1717918437373988, 1568052070792483, 2298775616809171}, + {1278207464902042, 494742455008756, 1262082121427081, 1577236621659884, 1888786707293291}, + }, + { + {4316050955753838, 6170021230760201, 3671071179000687, 2720567588588102, 4695134757737078}, + {353042527954210, 1830056151907359, 1111731275799225, 2426760769524072, 404312815582674}, + {1716987058588002, 1859366439773457, 1767194234188234, 64476199777924, 1117233614485261}, + }, + { + {4802445580021739, 5669686216323056, 5683496153608928, 3599612573083939, 3664745203781455}, + {3236091949205521, 2386938060636506, 2220652137473166, 1722843421165029, 2442282371698157}, + {1143239552672925, 906436640714209, 2177000572812152, 2075299936108548, 325186347798433}, + }, + { + {4921698295511420, 2966865811406529, 3723715952061302, 4420370150973604, 5441412310007539}, + {2972824668060020, 2936287674948563, 3625238557779406, 2193186935276994, 1387043709851261}, + {1043584187226485, 2143395746619356, 2209558562919611, 482427979307092, 847556718384018}, + }, + { + {6539978005364395, 5005405360675302, 4390281321854973, 5817765520609028, 2885569505406129}, + {2401607320460403, 912267207660896, 2797776548107885, 1401692837350636, 2770414290856347}, + {904627574235583, 366582160013268, 1919276459982818, 683852563070972, 849013528013132}, + }, + { + {4382884022719489, 3331418080941236, 4472875449005139, 4019500438389598, 4463034067898545}, + {314313360314847, 1556311374160012, 3420403310565817, 1814168775579274, 3865931899404825}, + {2211811396782717, 1987727116500422, 1201194143426517, 1988979712261853, 884086138400803}, + }, + { + {3928195125806252, 4506628847593763, 4871806493038737, 5468133301160088, 4718975813247195}, + {3157237349544610, 2087027997220233, 1635119994381095, 1685873597006198, 3264645977099821}, + {554990822829571, 1043610604169755, 239155874009083, 1207029530220679, 1248980877883503}, + }, + { + {2330609380614712, 5282631639681642, 3679411410269759, 2770673432637308, 3778717181908177}, + {2321085204756486, 3204498878947842, 1897195179818497, 2221896934640248, 2249233024322127}, + {1100828805329651, 38323682820671, 233339076341529, 570439134676859, 373923102906827}, + }, + { + {4822469807205745, 4578534577854527, 3814578293772758, 6210971875752572, 3469875307698085}, + {650556138336187, 1140806781381529, 1319490550148986, 2443218412602398, 2092597895198457}, + {24874372349398, 672413878008022, 2109618619032869, 617580455983017, 643082448965145}, + }, + { + {3702942502950483, 4221261673998955, 4525315300848625, 5031967728773077, 4411934662665867}, + {895116466708821, 2311360532554913, 1331906084934491, 1442649827370867, 985339602059253}, + {1101806460504208, 48906420814555, 455540794156723, 777238833441277, 678815750013174}, + }, + { + {4956217544664282, 4411017504484405, 3654474138314413, 5155000128389593, 4413650344518487}, + {1203258470211606, 2883266356628027, 1508156827359997, 3638270983429361, 1401834110583505}, + {928961391578986, 832907369443124, 468987297840672, 1558723144077997, 1418280592841651}, + }, + }, + { + { + {3309129437554730, 5123933694799617, 4965300486638528, 6516081243872351, 2549068382794184}, + {1248731221520740, 1465200936117687, 2792603306395388, 2304778448366139, 2513234303861356}, + {1055352180870759, 1553151421852298, 1510903185371259, 1470458349428097, 1226259419062731}, + }, + { + {4550600281784187, 3256554237859110, 4119844627242950, 4676836561429904, 5092370827107509}, + {3744788603986897, 3042126439258578, 3441906842094992, 3641194565844440, 3872208010289441}, + {30498470091663, 1082245510489825, 576771653181956, 806509986132686, 1317634017056939}, + }, + { + {5619235959382811, 4106140804649401, 4587392324740009, 4223977265679267, 2709254929742834}, + {2672107869436803, 3745154677001249, 2417006535213335, 4136645508605033, 2065456951573058}, + {1698968457310898, 1435137169051090, 1083661677032510, 938363267483709, 340103887207182}, + }, + { + {4745319008032005, 4813628148687644, 3467681137065440, 3660014790178871, 4392941970152610}, + {1995325341336555, 911500251774648, 2415810569088940, 855378419194761, 3825401211214090}, + {1315157046163473, 727368447885818, 1363466668108618, 1668921439990361, 1398483384337907}, + }, + { + {6557196758364187, 4276231499541578, 4485350770690107, 4264207089194792, 3124346806789687}, + {2326829491984875, 3267188020145720, 1849729037055211, 4191614430138232, 2696204044080201}, + {1217269667678610, 599909351968693, 1390077048548598, 1471879360694802, 739586172317596}, + }, + { + {4384302481090479, 4717978973545909, 3754548127453306, 4211871514743047, 3605771636328385}, + {3970118453066023, 1560510726633957, 3156262694845170, 1418028351780051, 2346204163137185}, + {319394212043702, 2127459436033571, 717646691535162, 663366796076914, 318459064945314}, + }, + { + {3198885719919217, 2575084544179354, 3737578377662447, 5232176448882889, 5405183975072780}, + {2657789238608841, 1960452633787082, 2919148848086913, 3744474074452359, 1451061489880786}, + {1575783124125742, 2126210792434375, 1569430791264065, 1402582372904727, 1891780248341114}, + }, + { + {5242752265626106, 4326735213088803, 5009083294116390, 3863683170199334, 2880454449080125}, + {3090232019245924, 4249503325136911, 3270591693593114, 1662001808174330, 2330127946643001}, + {1822054032121349, 643057948186973, 7306757352712, 577249257962099, 284735863382083}, + }, + { + {3757294655239106, 4149870483813681, 3943074023634421, 5011331412913659, 4204233544524725}, + {765300458944758, 1962420935223063, 1006865922596525, 556125259357651, 517324314261719}, + {947503289917657, 1503416272497360, 836151367440855, 2025240512839119, 1506056841382176}, + }, + { + {3987605469554571, 4216854847559852, 4606485208582710, 4025002076531210, 5771502720173311}, + {789866795586711, 1219783998007690, 3399339961859034, 1430246873258510, 2263938746297911}, + {272907227620417, 585056874977936, 374400386458564, 1047259762290717, 466584497787787}, + }, + { + {4513305810099276, 3713543936920641, 5881885803512264, 4985359422621344, 5854329220017841}, + {2489594831593530, 2868670421452777, 2653264259914146, 778139640543916, 2896054888052141}, + {67965761977879, 1140658137927248, 1433664110101982, 1907417172350895, 1009746387131234}, + }, + { + {4657525718512496, 4017020332264511, 5032007516852528, 4196574218153666, 4558814287479470}, + {3191788312902362, 1662632170533261, 3849731434302862, 816384760006536, 2103376627071646}, + {98516339668203, 1987095201806236, 109825731538912, 249333174781555, 868887613476084}, + }, + { + {4551570896172554, 4811478172541458, 3661911804185849, 2859956435208139, 3775782540863495}, + {4251836217943410, 1527544805122594, 1416199226269029, 2604023934400523, 2761395386595757}, + {1642831683324706, 1693640639567753, 543897185448748, 1014750779914025, 2000933536049400}, + }, + { + {5616692888384001, 4085181778999311, 5359480780192985, 4168165762634953, 3706985665716275}, + {3046363118074651, 1033878254661623, 1432711896868579, 565399048183279, 1486610644259929}, + {1956000744629083, 2124722115672587, 1869890027060221, 1779425010763214, 2251549887150752}, + }, + { + {5403435201118585, 6603374055023538, 4448450050924979, 4204020352279014, 3319690980306662}, + {1147686993699695, 2183664403489392, 3736291649220767, 3475178747642004, 1656820196694734}, + {993108364179144, 45592857828226, 1223718961690034, 1931120528549047, 1402978202475587}, + }, + }, + { + { + {4707745854342560, 3882311012719969, 4467035027860010, 2426465723968789, 5459727301387711}, + {3618358370049178, 1448606567552085, 3730680834630016, 2417602993041145, 1115718458123497}, + {1562934578796716, 1070893489712745, 11324610642270, 958989751581897, 2172552325473805}, + }, + { + {2875482372335866, 3589666323156759, 5493912977577144, 3566036429447715, 3416572787955522}, + {1770564423056008, 2987323445349813, 1326060113795288, 1509650369341127, 2317692235267932}, + {223256821462517, 723690150104139, 1000261663630601, 933280913953265, 254872671543046}, + }, + { + {5739703102637456, 4089685696952464, 5529672212600950, 5529465141325467, 4053764715117380}, + {1969087237026022, 2876595539132372, 1335555107635968, 2069986355593023, 3963899963027150}, + {1115241013365517, 1712251818829143, 2148864332502771, 2096001471438138, 2235017246626125}, + }, + { + {4621952399709001, 5571208339175198, 5938396303563992, 3935039984233637, 4734466397277932}, + {3551068012286861, 2047148477845620, 2165648650132450, 1612539282026145, 2765997725314138}, + {1850689576796636, 1601590730430274, 1139674615958142, 1954384401440257, 76039205311}, + }, + { + {4398511437540326, 5006878555391994, 2877652875936652, 3360921192078354, 5537453437282356}, + {1723387471374172, 3249101280723658, 2785727448808904, 2272728458379212, 1756575222802512}, + {571005965509422, 2005213373292546, 1016697270349626, 56607856974274, 914438579435146}, + }, + { + {4021767746362864, 3947693133441663, 5655463017046415, 4032842598082935, 4903887401788780}, + {1346698876211176, 2076651707527589, 3336561384795453, 2517134292513653, 1068954492309670}, + {1851867764003121, 403841933237558, 820549523771987, 761292590207581, 1743735048551143}, + }, + { + {4789545034251916, 5151774024717947, 3350203576317227, 5870147068473486, 3757676696824463}, + {410915148140008, 2107072311871739, 3256167275561751, 2351484709082008, 1180818713503223}, + {672095903120153, 1675918957959872, 636236529315028, 1569297300327696, 2164144194785875}, + }, + { + {3867157095427632, 4907857238986876, 4412001163466224, 5664547006559450, 3829838433234787}, + {1902708175321798, 3287143344600686, 1178560808893262, 2552895497743394, 1280977479761117}, + {2013087639791217, 822734930507457, 1785668418619014, 1668650702946164, 389450875221715}, + }, + { + {5139170412209073, 4498594321446990, 3403045096731472, 3523999116931205, 4892973820656308}, + {3100339582931283, 3780065035763732, 3107854667684806, 1176538847728659, 2470425204007084}, + {1439699951361262, 2030141811121675, 1327540074439450, 98760879510567, 2124055188161162}, + }, + { + {5069757928527025, 4269771696870248, 3491008216607494, 2929486207919899, 2963259194922213}, + {1719771161855965, 3899474813414394, 1311077187368436, 1710977333891379, 2936225820601205}, + {630007537003875, 1879755431232807, 1841434412649072, 139825159320909, 1444684178970403}, + }, + { + {4165024628959566, 3986473160684857, 4482720357638229, 3477188964410991, 6063532098390286}, + {2735367442263082, 3037388464741161, 708840305892227, 3376016746983163, 2424461132835430}, + {1692345998026512, 1336264953003836, 472200476738834, 443198297543894, 865332172690922}, + }, + { + {3583240374232032, 6672838339902029, 3302719127491245, 4817707424315947, 3846209753841235}, + {1940518928195986, 2204192709398575, 2559878786338619, 1240694154295451, 3150360999940643}, + {978334155462452, 259156758770697, 1998397384612038, 868981902819036, 526720567050341}, + }, + { + {6295419175112392, 5922842429035919, 3280130237310527, 6154864010584464, 4672381744259604}, + {2495384380697450, 2529087473815087, 3152074437283087, 2705660594301054, 3756859018180124}, + {2829664309620, 1216345963700610, 1352213880784545, 1343440385603407, 1678896558555000}, + }, + { + {4462327178876654, 4861692839162759, 4026088282699843, 4559864737475196, 4141921357362458}, + {970323584385428, 1841886145157987, 771455069751873, 2995416444511372, 1381697279273918}, + {833881464516252, 722547189080954, 1385674139934263, 1947516117258013, 237073770273705}, + }, + { + {4933913084823421, 4670123363141682, 4900446203904881, 4055286352327374, 4290448492223496}, + {2942776662601173, 2578009269314716, 544737250664645, 2975699597442162, 2099680134205576}, + {452946908538500, 838029561099231, 448300214621162, 402872419278705, 704999550269611}, + }, + }, + { + { + {5798682425720784, 4343644325181242, 6354948599958312, 4506974667055090, 5293040366083331}, + {2705718263383616, 2358206633614248, 2072540975937134, 308588860670238, 1304394580755385}, + {2083069137186154, 848523102004566, 993982213589257, 1405313299916317, 1532824818698468}, + }, + { + {4034211192773531, 5600324567335276, 4531193018091912, 2794041663976599, 3792137612125120}, + {3747761112537659, 1397203457344778, 4026750030752190, 2391102557240943, 2318403398028034}, + {693543956581437, 171507720360750, 1557908942697227, 1074697073443438, 1104093109037196}, + }, + { + {4735029189573542, 3778090050106418, 6524974691396918, 6024554123028535, 3058137605210362}, + {345288228393400, 3351443383432420, 2386681722088990, 1740551994106739, 2500011992985018}, + {1079623667189886, 872403650198613, 766894200588288, 2163700860774109, 2023464507911816}, + }, + { + {3748938635589832, 3296620064200837, 3994393700108731, 5740803740117332, 5352647078187481}, + {854645372543796, 1936406001954827, 2403260476226501, 3077125552956802, 1554306377287555}, + {667962773375330, 1897271816877105, 1399712621683474, 1143302161683099, 2081798441209593}, + }, + { + {3324209478486170, 4398737310762775, 3760579922605898, 5439367229755348, 5616400060914562}, + {2378947665252234, 1936114012888109, 1704424366552046, 3108474694401560, 2968403435020606}, + {333549023751292, 280219272863308, 2104176666454852, 1036466864875785, 536135186520207}, + }, + { + {5689714689958878, 4503409610653732, 5602544085249448, 3404912574886620, 4043425317102514}, + {2625466093568366, 2398257055215356, 2555916080813104, 2667888562832962, 3510376944868638}, + {1870078460219737, 2129630962183380, 852283639691142, 292865602592851, 401904317342226}, + }, + { + {3798100817109506, 4962694127433334, 3349468332060557, 6283897397500138, 2972563107372854}, + {1361070124828016, 815664541425524, 3278598711049919, 1951790935390646, 2807674705520038}, + {1212405311403990, 1536693382542438, 61028431067459, 1863929423417129, 1223219538638038}, + }, + { + {4842650611581872, 5104986353880267, 4917334859504562, 3217991068822474, 6343075526828654}, + {1294303766540260, 3435357279640341, 3134071170918340, 2315654383110622, 2213283684565086}, + {235605972169408, 2174055643032978, 1538335001838863, 1281866796917192, 1815940222628465}, + }, + { + {6283914285320299, 4538885684827819, 5272821644392905, 4741145486323262, 3695595414404375}, + {2328903345630831, 383243669352281, 873975569357849, 1167517986625404, 1819176154401511}, + {1015569285123052, 366271559910559, 607712860974980, 1151136439806917, 1092279314442070}, + }, + { + {4644837603275095, 4182486257496369, 5680847280055574, 5281364304268108, 4017310458808244}, + {608363524539665, 1518910856395189, 2487752246555640, 1408491254860196, 1242950972146918}, + {724510145626490, 1990648995683735, 1234513756420164, 776971151906420, 1819715569230741}, + }, + { + {4025210576522653, 5037391877366464, 6220723743247171, 4107687904850403, 5536810198272054}, + {1367586897505451, 2009604536185136, 2660752171350541, 2665866783498593, 3368014404783418}, + {1205287993924177, 1639266049462139, 1103796806037893, 1538960177870822, 829889727712499}, + }, + { + {4793558625576028, 3882027570562344, 4207241179173547, 5281023204511977, 6361433483438371}, + {3281892459792280, 1933131048782198, 2351228493867205, 2032809616708977, 2534356983068777}, + {909754464411828, 785219392684958, 1338541457752162, 826789969638535, 2048189131938215}, + }, + { + {5399590275296719, 3849598676683261, 3407829328170797, 4201689601652353, 3895190733841783}, + {1015687460377127, 2173401063127799, 2017987633047477, 748955581941445, 630511527938929}, + {2101074774193018, 2001243087608708, 801641610437734, 1519697986446082, 594845713523709}, + }, + { + {4827244732148509, 4706350784965857, 3625459412499055, 5917778693464512, 5372808769862558}, + {1452942110247071, 1201823364506117, 2330240170803201, 2907618912660148, 2069141053434694}, + {745779946397307, 916664696261756, 1535477642186117, 1334763610638931, 1366843744138046}, + }, + { + {4176014068905464, 4252766041468492, 3589174288259552, 3776062686798003, 4986282119113185}, + {1092579010212274, 1203724605936750, 2270767453066752, 2458071886656347, 2443647576082745}, + {318795329870799, 185430882319687, 1286511919273276, 657817007383756, 40641447918263}, + }, + }, + { + { + {4538870843995520, 3964150480707053, 5487263883039355, 4602170887743532, 5736245235930330}, + {1632352921721536, 1833328609514701, 2092779091951987, 4175756015558474, 2210068022482918}, + {1998172393429622, 1798947921427073, 784387737563581, 1589352214827263, 1589861734168180}, + }, + { + {5350015016975595, 2997963309224426, 3081458566511327, 5095667333327441, 5460842165191887}, + {1733739258725305, 2283515530744786, 2453769758904107, 3243892858242237, 1194308773174555}, + {1758148849754419, 619249044817679, 168089007997045, 1371497636330523, 1867101418880350}, + }, + { + {3965982201013836, 5981456109444663, 5078495317312678, 4410918223912516, 3807332263401822}, + {2578433797894864, 2513559319756263, 1700682323676192, 1577907266349064, 3469447477068264}, + {853828206885131, 998498946036955, 1835887550391235, 207627336608048, 258363815956050}, + }, + { + {3753463041754121, 3606679279252159, 3696232489183494, 3149612277537848, 5358662226124843}, + {2392941288336925, 3488528558590503, 2894901233585134, 1646615130509172, 1208239602291765}, + {714380763546606, 1032824444965790, 1774073483745338, 1063840874947367, 1738680636537158}, + }, + { + {3423450128487239, 6070685071936072, 3705460605693651, 3009714346694508, 6123110970148691}, + {1640635546696233, 2884968766877360, 2212651044092395, 2282390772269100, 2620315074574625}, + {420958967093237, 971103481109486, 2169549185607107, 1301191633558497, 1661514101014240}, + }, + { + {5625132717515116, 5524850964392681, 4614069623317915, 3762859588443640, 4361835721816909}, + {3158923465503550, 1332556122804145, 4075855067109735, 3619414031128206, 1982558335973171}, + {303213233384524, 2061932261128138, 352862124777736, 40828818670255, 249879468482660}, + }, + { + {3697491154222530, 4544214010492622, 4905703930515359, 4988733897248726, 6163038950957920}, + {856559257852200, 2760317478634258, 3629993581580163, 3975258940632376, 1962275756614520}, + {20057458979482, 1183363722525800, 2140003847237215, 2053873950687614, 2112017736174909}, + }, + { + {2961281310713750, 5035281843536219, 4820563396802425, 4066115702139011, 4762159869794599}, + {2228654250927986, 3735391177100515, 1368661293910955, 3328311098862539, 526650682059607}, + {1053447823660455, 1955135194248683, 1010900954918985, 1182614026976701, 1240051576966610}, + }, + { + {3576347446000839, 3504021369715234, 3286921249007623, 6268908633911267, 4898262353027354}, + {2053850994061963, 1755999209417110, 2842496597997123, 1978798188794297, 1107741233360060}, + {1587558591633082, 1224310153016076, 373416710356490, 733639236443698, 365919571874338}, + }, + { + {4922046667787666, 5384603941382862, 3355282705253058, 5052638190916511, 4442324355401649}, + {716350205934888, 1153032590403764, 2797021656648850, 1143194352934997, 4271302979058629}, + {1588274760900072, 933817618340883, 731655082380959, 688238385999711, 637984915480250}, + }, + { + {4217060480329358, 4374528391636951, 5478312030233942, 5051281083802439, 5405881257383323}, + {413138784837996, 173345891427747, 1873100191622562, 899752727618929, 3454430648436331}, + {830072102529414, 1185948406051604, 1521170049452316, 1259798181998483, 735064905966282}, + }, + { + {5515669600102047, 5759134783811579, 4357089500282138, 5244472517255288, 5695631524373921}, + {2842166480737527, 2947367283673209, 2706356593419314, 2971106642583260, 2444234893549177}, + {1396164055858898, 2228551364195726, 611382817170935, 1662418665433346, 1079098567119990}, + }, + { + {3828208352345746, 5742603493540025, 5912515684826959, 5415942702105867, 4409414272784258}, + {2895166868245672, 3153594867376981, 2883799413649215, 1877187137914547, 1124004944737352}, + {1249379796419407, 1201460644559526, 1259226742776869, 583948750717161, 1178519968480157}, + }, + { + {4715510278636375, 4324771002227588, 4218850944267831, 4037187367673896, 4505301806813551}, + {660737143139077, 1635830759165556, 795647058595473, 2117049403264300, 2692853476865573}, + {1654844956375931, 767321709128720, 475080629455448, 116932684758291, 96451917556060}, + }, + { + {5797033177541322, 5021581754974953, 4978830133961786, 5973534325336756, 4105099431310062}, + {1777561190222404, 3757586069945925, 2868096822929350, 1968746982919962, 1089633650980574}, + {833672890421142, 647759906668054, 572517465546269, 402134952667751, 2083275174687780}, + }, + }, + { + { + {6352542060466074, 3833809696215741, 4101092554705390, 3320298136988035, 4253202043484731}, + {1957943897155478, 1788667368028035, 2389492723714354, 2252839333292309, 3078204576998275}, + {1528282417624269, 2142492439828191, 2179662545816034, 362568973150328, 1591374675250271}, + }, + { + {4265077968872559, 2914460285039701, 3045781039391514, 4915306233356239, 5308090560495285}, + {2411826493119617, 2484141002903963, 2149181472355544, 598041771119831, 2435658815595421}, + {2051892037280204, 488391251096321, 2230187337030708, 930221970662692, 679002758255210}, + }, + { + {3713635732994642, 4207056293821675, 4684465815183558, 6055578880035022, 5061343489334444}, + {1530723630438670, 875873929577927, 2593359947955236, 2701702933216000, 1055551308214178}, + {359179641731115, 1324915145732949, 902828372691474, 294254275669987, 1887036027752957}, + }, + { + {4324702538941745, 2563932266428659, 4813530513012704, 5499843939988947, 3842301114037549}, + {4295071423139571, 2038225437857463, 1317528426475850, 1398989128982787, 2027639881006861}, + {1397254305160710, 695734355138021, 2233992044438756, 1776180593969996, 1085588199351115}, + }, + { + {4202522275076530, 6411445226225292, 4074557295320773, 4373367518435491, 4577411558841716}, + {2692366865016258, 2506694600041928, 2745669038615469, 1556322069683365, 3819256354004466}, + {387139307395758, 2058036430315676, 1220915649965325, 1794832055328951, 1230009312169328}, + }, + { + {3379372614866712, 3476543574256943, 5779819517217769, 3781538535387827, 3841619480557100}, + {1765973779329498, 2911143873132225, 2271621715291913, 3553728154996461, 3368065817761132}, + {2181229378964934, 2190885205260020, 1511536077659137, 1246504208580490, 668883326494241}, + }, + { + {4227237865914097, 5575401147370301, 5098251926594813, 4129497466354055, 3741435180672532}, + {2689666469258543, 2920826224880015, 2333696811665585, 523874406393177, 2496851874620484}, + {958592545673770, 233048016518599, 851568750216589, 567703851596087, 1740300006094761}, + }, + { + {3792569420294954, 4400089757531324, 6101403783497940, 5734203344054362, 3067223272494699}, + {2014540178270324, 192672779514432, 2465676996326778, 2194819933853410, 1716422829364835}, + {1738560251245018, 1779576754536888, 1783765347671392, 1880170990446751, 1088225159617541}, + }, + { + {4447695422728303, 2418292515870024, 5595971144063629, 5081870838292807, 5209525481880645}, + {2916521632160477, 2343112140697014, 1601700300762337, 1763148914953177, 2708190975156259}, + {1339021042945816, 1840804708066696, 877961221559635, 1281458842745501, 1950851850845276}, + }, + { + {4786922334540966, 4955024641438784, 2989160972656404, 5186429632708936, 4984389249074409}, + {1020393680308960, 3834711966547082, 2322726956159582, 995949551108034, 3035172379117141}, + {2248087612518599, 173333799263920, 1744928838552182, 957368524885377, 1722980339454003}, + }, + { + {3826226586501329, 4985391470235567, 3706778387862153, 5001039432994919, 3643485069381971}, + {2453664361158331, 3658664111645897, 2133047286876873, 2891246599919261, 1077039773701841}, + {1403674776792037, 176114870970230, 204752269254815, 823265703401663, 973549049711641}, + }, + { + {4428694302478430, 4279516097530892, 4558829707092394, 4506689423374814, 3060727770678082}, + {3511507258617268, 2341694334736402, 3023178443373630, 4119452783133958, 1541883672814480}, + {273175012476053, 353915697751570, 1920076197363975, 2096923665433891, 694182114426694}, + }, + { + {4184692084971979, 4134060280811983, 3170779668973105, 4456307003709940, 4308299286729100}, + {2273158812011175, 3253770145986191, 1455430838863125, 1701216872600126, 1994907074166318}, + {854928709890819, 247698160098706, 1293104197995963, 648230677212306, 784063325867838}, + }, + { + {4504036913969323, 5450574207835078, 6042071388766678, 4918868602774744, 5356088910233627}, + {2995726671480383, 3106924626287182, 2718750693945174, 3268809265740618, 1129470954185503}, + {2104894828289916, 873144584667742, 506537740149646, 646077767532773, 1966868865211605}, + }, + { + {6048446108790732, 5524115631172029, 4165751037432881, 4331639016561072, 5291322591785068}, + {2269347023399866, 1910686315635227, 654955394153571, 2857416503175088, 847850165913280}, + {836953051260559, 1769743545147988, 699239118029628, 825806019782225, 1990070083297713}, + }, + }, + { + { + {3395265304118584, 3783994539881306, 5596876372865192, 4984641333486582, 4373205247246409}, + {2911103727614740, 1956447718227572, 1830568515922666, 3092868863429656, 1669607124206367}, + {1686424298744462, 1451806974487153, 266296068846582, 1834686947542675, 1720762336132256}, + }, + { + {3458195995174227, 4836757775805549, 3654433306506668, 5623690819092521, 4197273928235755}, + {3141016840074207, 3295090436969907, 3107924901237156, 1669272323124635, 1603340330827879}, + {766720088232571, 1512222781191002, 1189719893490790, 2091302129467914, 2141418006894941}, + }, + { + {5441759705376431, 3673576132738420, 4193443048427021, 4683601810691313, 3666180150435792}, + {2671463460991841, 1998875112167986, 3678399683938955, 3406728169064757, 2738338345823434}, + {398001940109652, 1577721237663248, 1012748649830402, 1540516006905144, 1011684812884559}, + }, + { + {3248461355092589, 5959477015323422, 2996112620542523, 4642813523567241, 5503882535918283}, + {1653276489969611, 2257881638852872, 1921777941170835, 1604139841794531, 3113010867325889}, + {1450817495603008, 1476865707053229, 1030490562252053, 620966950353376, 1744760161539058}, + }, + { + {3213965769821056, 5620199287619286, 4685689805377309, 5959205094392245, 4699653216173778}, + {2811528223687828, 2288856475326432, 2038622963352005, 1637244893271723, 3278365165924196}, + {796863823080135, 1897365583584155, 420466939481601, 2165972651724672, 932177357788289}, + }, + { + {4468743695984567, 4898440950560817, 4474456712004917, 5061786181321024, 3329036690710436}, + {877047233620613, 1375632631944375, 2895573425567369, 2911822552533124, 2271153746017078}, + {801118384953213, 1914330175515892, 574541023311511, 1471123787903705, 1526158900256288}, + }, + { + {3726318200450545, 4012593435854444, 5660999417843231, 3874664121744144, 4669027921793287}, + {3201417702772463, 2207116611267330, 3164719852826535, 2752958352884036, 2314162374456719}, + {1961673048027128, 102619413083113, 1051982726768458, 1603657989805485, 1941613251499678}, + }, + { + {3486506407007189, 5586943518586412, 3150073788000181, 3892658932084745, 4661178025941644}, + {1401939116319247, 2587106153588320, 2323846009771033, 862423201496005, 3102318568216632}, + {1143483057726416, 1992614991758919, 674268662140796, 1773370048077526, 674318359920189}, + }, + { + {5249032546684913, 4376477734728695, 5192833668695386, 3879528383130666, 4673544232718438}, + {2001586827113779, 3745189534067065, 1944288247515270, 3801531181100442, 2035001711257644}, + {1821331151892312, 1302058705892077, 1823533497142581, 1477427445977593, 1256884978338733}, + }, + { + {3816568398797501, 4280523703434080, 5575370580457579, 6556193442157265, 5400032142723120}, + {3676887960291627, 2721875544375886, 1949386962401535, 2062484445640651, 1831148391448868}, + {1098621584553762, 479766126028979, 50128556582829, 1793185955386011, 957643491878541}, + }, + { + {5624964178025902, 5881679035334285, 5337334188128135, 3373245272349238, 6030340196395357}, + {1686491261026354, 2930481776329103, 2527067703865047, 1879410757156738, 2416602562794561}, + {1954783342191961, 1776196854323048, 1073865783628317, 126006585556188, 551111053703277}, + }, + { + {5863020639436884, 5014608403303800, 3487461172336056, 4625089084538493, 3002443292699384}, + {1844293295362196, 3776383490821424, 1827935191421176, 1761145652561373, 2654244832682184}, + {2163920127813722, 1809848067831371, 1226486593520438, 6568253441272, 318658165188350}, + }, + { + {5229528028782988, 3740161041125714, 3628427289315213, 5072860979211871, 5962952384148406}, + {1112209403436618, 3603724598892882, 3004743983803641, 1636637612372587, 1910870598142670}, + {1139920697586991, 989775023258908, 1562720488536799, 1457380545841604, 910097567659210}, + }, + { + {3041059796685021, 3926553231646481, 4587262528244901, 5282743084605635, 4777345624727557}, + {2431004626164709, 3854783312160059, 3273298459729433, 3386841277003151, 3777213922766615}, + {295894405919626, 1325594150172422, 673838771367222, 604280180076012, 485577818727658}, + }, + { + {3793091552131313, 4374989255749447, 4298473526457935, 3586546830561382, 4785727997920673}, + {3556189185732659, 4013352737062889, 2854416081619439, 1896415948116520, 654670146226537}, + {139962000945005, 2246840272939065, 40902718655534, 1533074280944617, 1032382655251714}, + }, + }, + { + { + {3758431901841840, 4379281609207426, 5017412546860750, 4644243343298864, 4946076247670812}, + {1835401379538542, 173900035308392, 818247630716732, 4013900225838034, 1021506399448290}, + {2056683376856736, 219094741662735, 2193541883188309, 1841182310235800, 556477468664293}, + }, + { + {4597695873914911, 5426082008537486, 4528117456116057, 4391230322227749, 4348938857916251}, + {3566819241596075, 1049075855992602, 4318372866671791, 2518704280870781, 2040482348591519}, + {537697207950515, 1399352016347350, 1563663552106345, 2148749520888918, 549922092988516}, + }, + { + {4827183563480027, 4225372812262903, 3444018843651805, 4582954431755768, 5877642652930841}, + {1747985413252415, 680511052635695, 1809559829982725, 2846074064615302, 2453472984431229}, + {213277331329947, 416202017849623, 1950535221091783, 1313441578103244, 2171386783823658}, + }, + { + {6124178045615487, 5044634958558963, 4487585538139111, 4406665622773445, 4226427082437073}, + {2440888617915079, 993969372859109, 3147669935222235, 3799101348983503, 1477373024911349}, + {1346805451740245, 1350981335690626, 942744349501813, 2155094562545502, 1012483751693409}, + }, + { + {3326465926121696, 4752879014110088, 3426137740310600, 3810813345691727, 3724087589204368}, + {2107080134091762, 1132567062788208, 1824935377687210, 769194804343737, 1857941799971888}, + {1872620123779532, 1892932666768992, 1921559078394978, 1270573311796160, 1438913646755037}, + }, + { + {3280128640868324, 3962843103655104, 3602632284060180, 4174964503289574, 5999255996217406}, + {3089190001333428, 3264053113908846, 989780015893986, 1351393287739814, 2580427560230798}, + {1900828492104143, 430212361082163, 687437570852799, 832514536673512, 1685641495940794}, + }, + { + {5679936010824454, 3977277108025017, 4516300250042949, 2929815522503454, 4666323705890374}, + {3094432661621646, 605670026766215, 290836444839585, 2415010588577604, 2213815011799644}, + {1448049969043497, 1789411762943521, 385587766217753, 90201620913498, 832999441066823}, + }, + { + {3515424710267724, 5606202029043823, 5029901811084866, 4403815652814045, 3735639122175257}, + {2767886146978542, 2240508292484615, 3603469341851756, 3475055379001735, 3002035638112385}, + {442991718646863, 1599275157036458, 1925389027579192, 899514691371390, 350263251085160}, + }, + { + {5324956849177719, 3429271620480873, 5513927382492506, 4069478768490913, 4487763984887828}, + {1005736577196489, 1703778335600507, 1256787933200658, 1273583601164519, 4154995520392582}, + {1181460621741892, 515102888370257, 660560226785527, 1121970691511835, 1609869229541589}, + }, + { + {5276536763892090, 4684953471965519, 6139261731383556, 3763310979241977, 3999629994843744}, + {3197840386614072, 2673429719431285, 2328666993391622, 1601604658039797, 754388419948612}, + {2189230067083086, 574898679774723, 1093556583385601, 1590603941933467, 1876625616519950}, + }, + { + {3739860822512771, 4605148533211466, 4174048138272099, 4387338734269228, 2880424850917010}, + {2359748764236743, 2750393191088290, 1526008165088803, 1669725971211966, 2233234520219112}, + {42208074517808, 919916618772548, 1864146060012263, 405874007551625, 167276017170589}, + }, + { + {4682022353746882, 6009429539947866, 2947942480787000, 5087407628431820, 4667285753466106}, + {1939674698340922, 2060465757190214, 2418157875657274, 1687699771189262, 236132178171812}, + {674205207435332, 837990472116301, 1170756550883494, 611962296440926, 1446026806940794}, + }, + { + {4797835609201808, 3649645875831679, 5195894411777247, 3424984715982399, 5322304250778016}, + {3454576586408064, 2256192384569215, 2864444376813541, 2134820396191597, 1047034985188490}, + {1582224761030916, 260261512990929, 1131518591198333, 94648525453241, 270083062170054}, + }, + { + {5595107036983877, 4494054900752656, 3263812520261324, 5044525307237686, 3722017695712965}, + {1188525422166779, 3589855283768506, 1782193012394260, 2155228647422980, 3120862178456839}, + {1981581840102891, 142303636665554, 2039535378650111, 1181156234198923, 1967834468546111}, + }, + { + {5706915977082882, 3753081378072469, 2510190141605996, 4045103810631250, 4992176450645285}, + {1947964231400572, 2169451112529873, 2463002605422706, 3228930307152278, 597158871609891}, + {1385883488372791, 1890958046379947, 2126979282588918, 17215697802179, 562809648160246}, + }, + }, + { + { + {6060806645993160, 4844231320170097, 3729525723161433, 2866535765304666, 4285036937432013}, + {1689713572022124, 2845654372939621, 3229894858477217, 1985127338729498, 3927868934032873}, + {968764929340557, 1225534776710944, 662967304013036, 1155521416178595, 791142883466590}, + }, + { + {5626780938473300, 5189175572245936, 2759405279195173, 3664390275802720, 2819817138913873}, + {1487081286167458, 3244839255500182, 1792378982844639, 2950452258685122, 2153908693179753}, + {560258797465417, 2193971151466401, 1824086900849026, 579056363542056, 1690063960036441}, + }, + { + {4383124982462505, 3428436472114155, 6260522268883476, 3642043430861258, 4218124990723630}, + {1918407319222397, 2605567366745211, 1930426334528098, 1564816146005724, 4113142195393344}, + {2063958120364491, 2140267332393533, 699896251574968, 273268351312140, 375580724713232}, + }, + { + {4285699823073660, 3996702683556035, 4442379901602887, 6453074611624616, 4734649381664242}, + {2024297515263178, 2668759143407935, 3330814048702549, 2423412039258430, 1031677520051052}, + {343868674606581, 550155864008088, 1450580864229630, 481603765195050, 896972360018042}, + }, + { + {6032529693711055, 6108603534430070, 3306860895022921, 5961918729318160, 5737795472583636}, + {2151139328380127, 2566545695770176, 2311556639460451, 1676664391494650, 2048348075599360}, + {830430507734812, 1780282976102377, 1425386760709037, 362399353095425, 2168861579799910}, + }, + { + {3935550130401342, 5155878315656623, 3473598574878785, 4149160495161916, 4823257793397838}, + {3407562046415562, 980662895504005, 2053766700883521, 2742766027762854, 2762205690726604}, + {618808732869972, 72755186759744, 2060379135624181, 1730731526741822, 48862757828238}, + }, + { + {4481933078376341, 5067550582461519, 4294715789111644, 5330913983663967, 5175628607523309}, + {3714971784278753, 3394840525452699, 614590986558882, 1409210575145591, 1882816996436803}, + {264204366029760, 1654686424479449, 2185050199932931, 2207056159091748, 506015669043634}, + }, + { + {4317070754263612, 4535076723640848, 4810021506483985, 4685558271307180, 4158905350371329}, + {1784446333136550, 1973746527984364, 334856327359575, 3408569589569858, 3275749938360725}, + {1496516440779464, 1748485652986458, 872778352227340, 818358834654919, 97932669284220}, + }, + { + {3850207796558603, 3727422831028406, 3797434477252654, 4293213262701836, 4516227523843066}, + {2048146359190201, 2164495845485630, 1987127118350888, 3702022928556186, 1248356726771194}, + {1517919028451878, 1390653207300047, 480997424969526, 463880049786815, 1566994328535414}, + }, + { + {4207292859242158, 4439237956877375, 6466630861755493, 6117169411664878, 6203775439423042}, + {2630289459558480, 2051409995957989, 2137890426251559, 2865150520767226, 2183646505352378}, + {250950165450403, 2108575357747549, 1858230594483734, 184468003072844, 1358638013010624}, + }, + { + {4795165927742161, 3556821674590553, 4452234877886028, 4063350508177236, 4357194618603124}, + {1363161060275889, 2019577584627825, 655391965916958, 2833727353647238, 2341948580614770}, + {1778982619924496, 1328609079558951, 1163827266617015, 1019320353990254, 830400209170522}, + }, + { + {3688756718408583, 4561393289356786, 5750092980695080, 4477840229539135, 3932387371938841}, + {891039147350711, 498786796467410, 3025350790192290, 652448826471937, 3394872208963829}, + {913282769158846, 347533899935257, 99606006705773, 1452035970297517, 2212487011762079}, + }, + { + {3066351608928554, 4959266561713426, 3505484480779672, 3313237988086280, 3214107063996871}, + {2440372328053980, 3986555651364494, 2478020726949882, 3029257951861872, 1322928669372349}, + {1259703414196061, 804804682694258, 2147323977049515, 252131006189623, 2246814133555350}, + }, + { + {4603288585029083, 4275494842669350, 4559975392494094, 5326825482142171, 4885471931566349}, + {616470521493849, 390707946935204, 1334622907385598, 2029831529830923, 2813735341554671}, + {1307353080865175, 1065210115652369, 1698012640184922, 2095589265946492, 688919666182564}, + }, + { + {4119409763828209, 5174415249772511, 6589359183715483, 3474134685034925, 3261800548024222}, + {3800663179733707, 1510662538907767, 2305029203181277, 1120480520235783, 2745749397969076}, + {959187641997964, 1919963359331922, 1067802756608566, 851276549968152, 2180947835690309}, + }, + }, + { + { + {5516816602304168, 5042521547053092, 4167576536206804, 6246422068954372, 4138350501601902}, + {2723435829455580, 2924255216478824, 1804995246884102, 1842309243470804, 3753662318666930}, + {2094270000643336, 303971879192276, 40801275554748, 649448917027930, 1818544418535447}, + }, + { + {5719674169295574, 4553720561304003, 3817628817819056, 2973527969819827, 4852805692036683}, + {2241737709499146, 549397817447461, 838180519319392, 1725686958520781, 3957438894582995}, + {948617110470858, 346222547451945, 1126511960599975, 1759386906004538, 493053284802266}, + }, + { + {4357186931049660, 4248263218811680, 5806608241664995, 5355507743318703, 5857341677159129}, + {1454933046815146, 3126495827951610, 1467170975468587, 1432316382418897, 2111710746366763}, + {750300956351719, 1487736556065813, 15158817002104, 1511998221598392, 971739901354129}, + }, + { + {3486884278433110, 3417910960117329, 3997194671566838, 3657316287568287, 4508063131522112}, + {1874648163531674, 2124487685930551, 1810030029384882, 918400043048335, 2838148440985898}, + {1663810156463827, 327797390285791, 1341846161759410, 1964121122800605, 1747470312055380}, + }, + { + {4458441089863460, 3942387623406751, 3851973436510373, 4407895911319668, 3358622222233463}, + {660005247548214, 2071860029952887, 3610548013635355, 911703252219106, 3266179736709079}, + {1344788193552206, 1949552134239140, 1735915881729557, 675891104100469, 1834220014427292}, + }, + { + {5125820669443841, 3461946287724414, 3994046236028930, 5907438988749520, 4920789118266230}, + {1920949492387945, 2410685102072778, 2322108077349280, 2877838278583064, 3719881539786256}, + {22727256592983, 168471543384997, 1324340989803650, 1839310709638189, 504999476432775}, + }, + { + {3589266475777094, 5791244982040267, 6521619274146678, 2903981043059491, 5401611380582210}, + {3565040332441556, 1721896294296941, 2304063388272514, 2065069734239231, 3056710287109878}, + {1969792547910734, 779969968247557, 2011350094423418, 1823964252907487, 1058949448296945}, + }, + { + {5777164948769480, 3890309495649820, 5262835493859430, 5169614751717201, 5401583088313899}, + {2459143550747250, 1118176942430252, 3010694408233412, 806764629546265, 1157700123092949}, + {1717263794012298, 1059601762860786, 1837819172257618, 1054130665797229, 680893204263559}, + }, + { + {2942680342150880, 4278613828995852, 5350213167690156, 2989120782966715, 4123142629949771}, + {2556444502235146, 1613361869622030, 1402717375340694, 2348339985765731, 3489511500408293}, + {1426750262638336, 314863572574246, 1394348337483702, 1967765724676815, 1262927622887481}, + }, + { + {4948972567610721, 4760459340435499, 4508373064131856, 4400791580495755, 3326118030989422}, + {2602109836867459, 1003276938441793, 244450874677932, 2495574856155249, 3110870831093824}, + {1089876164348856, 610853718362589, 290946077126125, 1189633635903067, 238116851513210}, + }, + { + {5818313990376412, 3745131403850386, 4984633161305300, 4588134365279068, 5605706152381173}, + {2574353462387544, 1744531678913296, 2081810750651984, 1255482175291668, 1579377192487289}, + {1077984189936462, 1101581309304165, 229118769946835, 213129071862971, 1105903869282826}, + }, + { + {4244657319305304, 4848112240284328, 4808999745724375, 4645297205085174, 4469873257565411}, + {2568686941901236, 1277107033850968, 2743723193537219, 3580901504461986, 430697021449829}, + {5110283730621, 236925008060043, 590130982419942, 541274580551940, 2155487465178420}, + }, + { + {4504922761302740, 3620992509914934, 3198533798350925, 3770782329534318, 5363163230411568}, + {275387113122210, 3501532982637668, 2704624275342757, 1489585626413894, 3573009822045302}, + {1859877583133149, 1445451213294944, 309288119160981, 1843441717427399, 584114977316234}, + }, + { + {4103673694186728, 6461574165907240, 3718162222127163, 6247603847194471, 5772831446786927}, + {2087653679988656, 2238424089144458, 2130407033226307, 1889280872742259, 2146873922212313}, + {500701236542790, 1839091700792145, 218488889984877, 1301749778593414, 614810966957821}, + }, + { + {4649730463510780, 3151390162038927, 5365410818081747, 5007340477551264, 5551016597277571}, + {2300360039943938, 1529233553127717, 3500096717284879, 3664531564773424, 3173693672061933}, + {882756809520167, 998774482479105, 593908492257531, 1132796830151366, 1780707297956298}, + }, + }, + { + { + {4583071810090063, 6354729884420668, 4077544622618353, 3073467147166315, 5285394920882441}, + {2237039662793603, 2249022333361206, 2058613546633703, 2401253908530527, 2215176649164581}, + {755822026485370, 152464789723500, 1178207602290608, 410307889503239, 156581253571278}, + }, + { + {3747179848085639, 4828649103787668, 4549946522264427, 3805208654040102, 5332579729206178}, + {3669985309815545, 2736319981413860, 3898537095128197, 3653287498355512, 1349185550126960}, + {1280337889310282, 2070832742866672, 1640940617225222, 2098284908289951, 450929509534434}, + }, + { + {5758557848470941, 5656835588370337, 3194707518654080, 2888905217772639, 5652892897517762}, + {2659503167684029, 2378371955168899, 2537839641198868, 1999255076709337, 2030511179441770}, + {894249020470196, 400291701616810, 406878712230981, 1599128793487393, 1145868722604026}, + }, + { + {4956087140669123, 3603920362709815, 3425295697596203, 4250911519607256, 4870927757824721}, + {3749755063888563, 2361916158338507, 1128535642171975, 1900106496009660, 2381592531146157}, + {1717539401269642, 1475188995688487, 891921989653942, 836824441505699, 1885988485608364}, + }, + { + {4274232174887052, 5592415718055546, 4229643212225114, 4106634029575971, 5067838489399852}, + {3493583935107776, 2439136865632830, 3370281625921440, 2680547565621609, 2282158712612572}, + {938868489100585, 1100285072929025, 1017806255688848, 1957262154788833, 152787950560442}, + }, + { + {3546872176125197, 5434827532059909, 3607531246326933, 5425835363204530, 5395826856780703}, + {3119119231364171, 2872271776627789, 2477832016990963, 2593801257642876, 1761675818237335}, + {1680989767906154, 535362787031440, 2136691276706570, 1942228485381244, 1267350086882274}, + }, + { + {2787309244260446, 2798685347422569, 6028275236918294, 4389895566536949, 3512537903582074}, + {2617818047455756, 2684460443440843, 2378209521329782, 1973842949591661, 2897427157127624}, + {1159906385590467, 2198530004321610, 714559485023225, 81880727882151, 1484020820037082}, + }, + { + {4265412029331945, 4082570389605622, 2787935123905079, 2861072139265641, 4774283971865508}, + {1377485731340769, 2046328105512000, 1802058637158797, 2313945950453421, 1356993908853900}, + {1237542585982777, 2228682050256790, 1385281931622824, 593183794882890, 493654978552689}, + }, + { + {4433747840806046, 3721621780348463, 4999137013220096, 4950695012032930, 2963731882329120}, + {3700733741689868, 2019165860436683, 839545028551310, 954045289946680, 2857671609142350}, + {2031235379883797, 946220755552074, 1457648474415011, 1222951728743327, 1610191601040290}, + }, + { + {4162295633314539, 4747504508371898, 5420102803358852, 5241263790326999, 4652112494046944}, + {3713236670706339, 1708249553383010, 1441184960961852, 2138372449656361, 2208801341603864}, + {743176047113998, 1210025633688996, 1298930577649249, 2241929289171655, 319185600078644}, + }, + { + {2463674019917897, 4802840710289795, 3812247475965604, 5281339404908102, 6114735096224475}, + {2361755477281753, 3920079557094249, 1772761852174940, 2188727617473580, 1972330964627961}, + {2224894613062235, 459022333460366, 853633232091964, 42662368548958, 1428459390829900}, + }, + { + {5876939711261840, 5483557082287477, 3340896169956977, 4741202975388493, 3246978129870096}, + {1888400628800904, 3246442970371919, 2048876033526183, 418388094414663, 2174354817875660}, + {1865410028261408, 627467389699032, 146077987303115, 1698467014229834, 2014393109530681}, + }, + { + {3339126822971782, 5967460547143544, 4911389289674917, 4202215034765918, 5578073611339204}, + {2670644791837462, 2651763434193316, 2285020046276825, 2227807589256768, 1464013488829088}, + {1806473647942365, 538787999504182, 512973154409687, 1944932181085518, 1069910541821032}, + }, + { + {2634758329364868, 4859512915801802, 4928387675794414, 4438135586288705, 5912306986153546}, + {2593937978996354, 2409464365976668, 2076140577147016, 4427101675063297, 1879995664155906}, + {407209884855019, 2088464831333939, 2111856537862679, 1631244096914416, 1074707055277992}, + }, + { + {4379690451347501, 4147722372858437, 6043474882489476, 3830885552726038, 5483938823325814}, + {502401202015803, 2110371415921011, 2529666734456328, 2767243204597450, 2341774206366416}, + {1547018311600067, 615783499206767, 485547569767288, 1517514580034299, 457611163959317}, + }, + }, + { + { + {6197629798333913, 2753838380751446, 3942959878910714, 3201428133247434, 4778709814063561}, + {2299141301692989, 1891414891220256, 983894663308928, 2427961581972066, 3378060928864955}, + {1124515748676336, 1661673816593408, 1499640319059718, 1584929449166988, 558148594103306}, + }, + { + {3540740886557976, 3183587715724649, 4694330636229537, 4258659768352436, 5509531109592197}, + {1784525599998356, 1619698033617383, 2097300287550715, 2510065271789004, 1905684794832757}, + {1465551264822703, 152905080555927, 680334307368453, 173227184634745, 666407097159852}, + }, + { + {4674947851286115, 5166365727170883, 4965938571130991, 4970517390710808, 2908711106554361}, + {2111017076203943, 3630560299479595, 1248583954016455, 3604089008549670, 1895180776543895}, + {488623681976577, 866497561541722, 1708105560937768, 1673781214218839, 1506146329818807}, + }, + { + {5492578995360943, 3611529141261548, 3553634070931276, 4797740788199803, 4532947899647969}, + {2412225278142205, 950394373239688, 2682296937026182, 711676555398831, 320964687779005}, + {1434382743317910, 100082049942065, 221102347892623, 186982837860588, 1305765053501834}, + }, + { + {3443537155111802, 4098841848663610, 3634013358734303, 3291752209395695, 5292412486267354}, + {2205916462268190, 2751663643476068, 961960554686615, 2409862576442233, 1841471168298304}, + {1346965964571152, 1291881610839830, 2142916164336056, 786821641205979, 1571709146321039}, + }, + { + {4996047770903428, 2555904966356003, 4013566981986303, 4737382312068285, 4233095136791335}, + {787164375951248, 2454669019058437, 3608390234717387, 1431233331032509, 786341368775957}, + {665807507761866, 1343384868355425, 895831046139653, 439338948736892, 1986828765695105}, + }, + { + {5356490725342733, 4068788685039808, 6047372383097019, 3426510449207690, 4705728718095123}, + {3007896024559801, 1721699973539148, 2510565115413133, 1390588532210644, 1212530909934781}, + {1205281565824323, 22430498399418, 992947814485516, 1392458699738672, 688441466734558}, + }, + { + {3538981275120648, 2874522279215958, 5384551777942367, 2992835507144444, 4815164902360267}, + {3302427242100220, 1955849529137134, 2171162376368357, 2343545681983462, 447733118757825}, + {1003649078149734, 545233927396469, 1849786171789880, 1318943684880434, 280345687170552}, + }, + { + {3979319739304371, 3173810108641712, 3480574285526200, 3800294424979384, 3983333585686372}, + {2754253003222887, 2275532945921888, 3105484814506120, 2795714951112672, 3618146930096140}, + {247596824353536, 285396193673154, 686289557053653, 399468081949262, 249109087231255}, + }, + { + {2723125664053674, 3464927193948491, 5445834280101391, 5612124161635761, 2933099654237696}, + {2672303537844268, 2038791134455123, 3285678115022383, 2900519586434405, 1978453542160588}, + {1705147526637648, 1274613803517124, 1602845665731412, 1064073198174681, 1486788069078519}, + }, + { + {4077390367222227, 3800932136610666, 4160144924974108, 3561238039866711, 5997919559096945}, + {819031393505739, 2088275424107290, 1796234646803442, 1388708737598893, 2937136216710939}, + {944757498200715, 2015594302768299, 813220261760372, 867002775164821, 501734915431717}, + }, + { + {4424498381651951, 4370145165962473, 4303795913232316, 4673352990886468, 3539252307041619}, + {4258052207216187, 3760480385682185, 3206156011228824, 4088908699869294, 3011569459811111}, + {1187304510804619, 1384816718516187, 514455602674227, 392638325371554, 588228521113051}, + }, + { + {4219797873858933, 4958627631706417, 4511020049341415, 3218925652522905, 5097166154822735}, + {2789655568104153, 4038602698967181, 1701909246528643, 2824012136983963, 2400715389506309}, + {1130277769648576, 1946206888578836, 1343266549795147, 2083590873042325, 264064594409097}, + }, + { + {3196954689864360, 3706526534080788, 3004981697061754, 5970179548131185, 5036616655131901}, + {1526130015031824, 3071067159569878, 2312643039801922, 2400491084238785, 2092334718179931}, + {1720808849496600, 410920656934828, 864594478015792, 229141760159822, 2037677155881017}, + }, + { + {5749040666310109, 2431937887261040, 3580364244969437, 4752008191428386, 4786853370158738}, + {1789863266178839, 2202012677135000, 2680121806416879, 1722812656485926, 572531509973556}, + {2175782751601278, 1608407337873936, 816706054544173, 258225706360159, 1478818623198000}, + }, + }, + } + + @(private,rodata) + Gen_Multiply_Table_edwards25519_hi := [32]Basepoint_Multiply_Table { + { + { + {4593529082752461, 4913481494458327, 5105340091484689, 3450213179198615, 5857240422918567}, + {1412482364088803, 4062389850048069, 923779398567547, 2023841154802081, 2607705760638543}, + {1825728698698411, 497946242397168, 105715611816086, 968568072676853, 592999326381074}, + }, + { + {4495184218325789, 5289073944532264, 4218636788579151, 4988461406676953, 4686478434934441}, + {2949190053601679, 1979948019919136, 2471186112468189, 3573963359061221, 2216896082446061}, + {743917567567859, 870447381138646, 392196079309387, 1786878704882853, 1520161635991866}, + }, + { + {4744444857419634, 3144662423000833, 2994206879871174, 4901643262699391, 4923693546628412}, + {3089537977529994, 1888948267748045, 1789290739253972, 2597750135306899, 3142762081370390}, + {1764333363430455, 898309455329908, 1381444383468949, 620561614151766, 158377983927494}, + }, + { + {5941345963042037, 3413323930288462, 5115763723871020, 3248416926384114, 5473315945632476}, + {2269111888817457, 3231588657429924, 3123230781695332, 1299656894822778, 1180051671372258}, + {407953783981, 1647278360877740, 584504284208188, 906066565536232, 1341016264992694}, + }, + { + {2432346762050178, 4412970725632038, 3922648159237080, 3005442494216723, 4442116552336937}, + {2381425302937802, 1387820520945502, 3125986768243210, 2463732477189113, 4185413214185067}, + {286790540720370, 376171092666609, 1535083117539001, 143466475958698, 1595136426572043}, + }, + { + {4277560779811042, 4605632954767560, 4619246140475080, 3484505719110307, 4989421629835765}, + {2829089547178292, 1790256014216198, 1797656649279268, 2562891052522691, 493980515519391}, + {62004126799683, 1668357417723485, 402010966421038, 827662362499868, 620754241677270}, + }, + { + {3919396572999125, 3838658814915336, 3750839246192093, 3726674239012627, 3831212626851778}, + {1227888687423439, 2913177985394946, 2412294236854021, 2805130984485539, 1308360976872086}, + {1643929373822818, 59659873139317, 1165353313134798, 2003225793255085, 1953102130608543}, + }, + { + {4114999970343247, 3274056679568382, 3954123294817179, 3769263204026901, 4245068682986802}, + {898618711827587, 1314215296781160, 1302503840208753, 3496738988099889, 1698289814254750}, + {1392999845620760, 634309693840701, 815492400002072, 340703897996290, 2038693787178716}, + }, + { + {5214250944985254, 5214298257940112, 3933846341585754, 5894386249523842, 5770685254784336}, + {1934541077562988, 2222946897208970, 2251242179056732, 1591285457544104, 2747813687509638}, + {1016675746743198, 874873189324170, 1360411561434916, 1581878592793672, 1548505102984557}, + }, + { + {4769452847684060, 4913417142027999, 4139599914472574, 5727971436547121, 5162246544117082}, + {2615904366263746, 737197398316645, 1602932940462504, 2167985252180769, 2559960808783062}, + {1882565165016312, 1581434850744420, 1900290919378503, 1985953844470085, 2168995994538833}, + }, + { + {4554120491153816, 4069860035617982, 4340413640826432, 3211862620694644, 5818608637282174}, + {1544885394173400, 1572082853154176, 1022098019061266, 2766927411109582, 2094149897716596}, + {1565161503379169, 1009067677698409, 1758464151571027, 1604769367828030, 1207412426608003}, + }, + { + {4015717287484591, 5253478309058146, 4070204443357591, 4445835852409645, 4665111518123177}, + {2854833619490147, 3573568625503236, 536183518454769, 2263990573554737, 4044861757799243}, + {1398840935273285, 790488576331737, 33415624257391, 1637374533896247, 2205752015162110}, + }, + { + {4260625486568009, 4637770924690903, 6480430642402074, 5542751059832424, 5622960391176990}, + {3715812780985479, 1012232238437221, 2466752896497024, 2611001871592954, 2143269004082900}, + {1886046851462393, 702395341735300, 737389004224425, 943477665979721, 723064819201181}, + }, + { + {5226062982149706, 4477280967632100, 3095356746333787, 4567645348066962, 4846495995079660}, + {2444351104229624, 212638631228834, 2148034812459853, 1041500100514044, 3853826660522166}, + {273084620529389, 1358348733025497, 1143735162114047, 1683813303234668, 2163735276562013}, + }, + { + {5320556456798805, 4779694419891170, 4876824494496501, 5903452387913251, 4729985500450036}, + {3477960290395163, 2468183980355970, 2936794001231177, 2308108181814059, 1969019168758558}, + {2160310767797410, 344164523453241, 83129919763985, 1315117733435601, 945559910324390}, + }, + }, + { + { + {4363327446469061, 2701839972520523, 6527685309871122, 4056456213766895, 3880569128224647}, + {423177393665983, 2333545232306939, 2028971153113312, 2728157354019203, 3777730507929771}, + {1435691822393684, 1850026012837208, 2218717487026642, 81859254010196, 244808221751742}, + }, + { + {4151019106002309, 4804743010530635, 3757223421954400, 4766036153424381, 6107544569595961}, + {821837003520359, 4010299059749559, 2863227431802226, 4078726431091997, 2442551264358059}, + {1428688544729295, 109069749881410, 270830364539996, 1755181768867140, 162349670944771}, + }, + { + {4642027397896088, 5510058210884768, 4553756231196669, 5068441159437344, 6370925538331183}, + {2639121586131590, 2408957406336796, 3986248100020063, 2989795052558558, 2164082093074357}, + {309881142350067, 2106019349943259, 816133263871674, 2018031260992166, 1563425406132832}, + }, + { + {4395494918929745, 3011447404605211, 3917145931603942, 2759967153620848, 6379442527779295}, + {1498799085180043, 1744340656397133, 2064851197592072, 2429833814776112, 2145324400616903}, + {614788980313577, 1501513053451003, 1472055221710495, 1920317897819127, 2208964791748263}, + }, + { + {3560784093342680, 4994362478801752, 3255476397621627, 4445556105981925, 4954471675599246}, + {2150595732685700, 3115920468099904, 1640951315905191, 3465930332728019, 2707896919197916}, + {612249867445962, 159208429955777, 563950177277347, 561041393363217, 1270750549218661}, + }, + { + {4520180469529123, 3948074172686157, 4376189225516076, 4643310756673520, 5392469157863016}, + {2055033216205027, 2461832572574425, 2742691255886072, 1052243367900374, 2752099767668600}, + {1827261746419924, 1468053133723229, 425022050209163, 1161272199376693, 589189496874922}, + }, + { + {4438522896195229, 5675329383977909, 4882438618733149, 5825827678555036, 4497535703422370}, + {2005207463235253, 2001528853385595, 1602253387656095, 3101879903751894, 2375325873201006}, + {847469444462207, 318959830531389, 408429171873782, 1661514071773102, 909441091898553}, + }, + { + {4102243665939998, 4215863334856383, 4408378320450327, 4622977479151665, 4039328475229204}, + {2174491994328136, 493557282042709, 3602705188549813, 3249913558677235, 2748481399349512}, + {758760864397232, 1830650226770835, 326981597370189, 1345979301472296, 174985669849506}, + }, + { + {3114038058163888, 4115257910705954, 5304962337604028, 4942520420915651, 4570979005352829}, + {1616868525778916, 2685769941228860, 1500533033491414, 2505164168102999, 2558430770009979}, + {2210398167996316, 2029125611734957, 1527318329127090, 226535237621728, 757747276478551}, + }, + { + {5660830910412470, 4039716640180729, 3468207460119772, 4614076381392168, 2442548670982292}, + {2039774403824382, 3183946537620297, 1982095153858182, 1293586830098836, 2438708503064038}, + {1357360519318812, 2045548381976834, 1766860667272665, 994521972889149, 393185631961961}, + }, + { + {6365035791876788, 3957527440519852, 4079038689927398, 4319831229004816, 3943934873019078}, + {2354388502926730, 2133757859975250, 3747940319461896, 1050624714408746, 3528225787559372}, + {1423510913950154, 1407788039482417, 761922275972375, 1783557942644647, 464730646959110}, + }, + { + {5146524748212414, 5035960985653238, 5028883959266913, 3282581313444735, 3905335483972979}, + {950694750709616, 2909132113066654, 2692353349246129, 2659905077175497, 978201784181073}, + {1078796318026741, 2070782433025097, 1700702188087909, 1447652546515478, 2144027848464236}, + }, + { + {4464099897473286, 3120477039861599, 5276369827125764, 3567131403687606, 4968190256098962}, + {4085811716920468, 2616309657099343, 775638006452370, 3253232221169984, 2587485588949578}, + {1012423034220617, 2045371869775344, 1260737445157584, 1833095526522043, 1066294173319533}, + }, + { + {5773192417487042, 4517701999097386, 4655557572427803, 5616698382540752, 3371552871839388}, + {2877566362774786, 4401330265553408, 3208625757371899, 1399785720487456, 2531340752609210}, + {1640471888126382, 1014801052117284, 1178704129888297, 982929852576812, 981292318502343}, + }, + { + {6476452238344334, 4693003674971858, 5211751500997938, 4121351294551163, 3152533251509898}, + {2011936343019114, 1133486795463590, 2647435457385352, 2628952425675517, 2374701464984626}, + {1245374341789768, 946202302464214, 1370924353088231, 682015131982855, 1275473548530510}, + }, + }, + { + { + {4235275101318885, 4886666925763093, 3781172458925008, 4774837350787537, 4519905633498379}, + {4159636855200485, 3150221611558687, 1363421772307006, 4120947913313657, 252053503603381}, + {45902352975738, 1246446699820833, 173320410042641, 1542230462600972, 692910725375140}, + }, + { + {4486356754653352, 5011982731057698, 2800477110646540, 4053556040992402, 5267180761554575}, + {710084928405448, 2105676789486896, 2420643007484910, 2605134634368896, 3302669631199693}, + {2191680341805656, 1972509245077282, 981795995975654, 852454486043614, 1189735660434765}, + }, + { + {4897930998338676, 4879106310620971, 4682586750207620, 6132197307461033, 4233426591406375}, + {3995777047683048, 3833719910688599, 2444044754441170, 2232313400412571, 1420975603500953}, + {1931343025077052, 1393738210614177, 622857924319466, 1123524882306454, 1963513295012502}, + }, + { + {4596722267439639, 4583990247552416, 3156713638372258, 5382313953040853, 4261038954366871}, + {1850504730697909, 4381679472853618, 2011448898092860, 2090154061858281, 1857166627539261}, + {1509035496076582, 1583601071466027, 421912810565136, 1678479534084506, 2033502297510813}, + }, + { + {5152283091655165, 5421718026722430, 3997156174417042, 5001987993936945, 4470112047504242}, + {2238137325796915, 1165391281982950, 2048774700033766, 1309041739154703, 3204681887791132}, + {520151332809519, 1588829471961614, 2166353389460390, 404024831468766, 1335244071323823}, + }, + { + {4644249663336450, 4507701753581319, 3592182426303562, 3683130545837732, 4598992005732335}, + {2528474489315892, 2071299735249833, 2619224970187272, 3271465188079442, 1519932762444249}, + {1935180256227856, 250757393177447, 1959439731378182, 1297506762666169, 575184640324100}, + }, + { + {3998007896814392, 4789639746579090, 5427007329099910, 5561733860472916, 4408133776555178}, + {3563813919863414, 1486712601904120, 2979081810490774, 1807789883906314, 3546555493967378}, + {1438068615152094, 34949160848567, 1911746456436447, 1412684293826264, 1046374507505090}, + }, + { + {3358198622960838, 3580145032458308, 6285906454262483, 4413045221104222, 5178477068028319}, + {1493476678908308, 3319155065445914, 2088667670293411, 3599225826407670, 3126758502479837}, + {1428599160764785, 602821281250279, 1877258833313507, 333285098655770, 740310036947361}, + }, + { + {4437738381533964, 4511430215080912, 4623800711093479, 3858159170572748, 3792114250503483}, + {2569231089452712, 3770152139328302, 3269539085929031, 2383025095054982, 2248498609425137}, + {375535123602711, 924645774628115, 2045840727994073, 766250909414083, 1069698092749769}, + }, + { + {4435294130703604, 4934879817377642, 3598080452693711, 4396369088299832, 6194434176750643}, + {3899859044211942, 3058237431324156, 1669265990252613, 3808823766704698, 1861135005644935}, + {1352954153117419, 632457759471481, 85028188501619, 1852310027888311, 1569233778435479}, + }, + { + {4994607739226691, 3549890051462689, 4602469939135293, 5262974664864567, 5829540047772287}, + {1177033227220429, 1414982090591775, 1722841418062421, 3232176376002923, 1625133154241833}, + {478074309368979, 623121553345246, 885068774570210, 117698677138481, 109006840646140}, + }, + { + {3228583777446740, 3685494966163883, 3859895584510878, 4132565491795209, 3602518465644145}, + {1476961150268616, 2321154243603617, 737795879830106, 3409730959236147, 2062873179003703}, + {1329749333731727, 46254713998516, 373767480531871, 1933047124368118, 430092326122748}, + }, + { + {4068619402415723, 3955796447715502, 3724578346370833, 4337532310052478, 4252452058492903}, + {2483442550312325, 3615812911108800, 2858427288312835, 2135393495237610, 596254727540093}, + {8959488931169, 1768025271694380, 2157573235225770, 292082063715064, 330646837880843}, + }, + { + {5129020796146722, 5575913156701592, 4643684154507286, 5052753294034768, 4627882199658166}, + {1682783588724042, 2651474877391040, 965357158907406, 1910483514645702, 1644451034905796}, + {976078747227308, 1952905065031031, 949292862704054, 1492592732072346, 1010921457352162}, + }, + { + {4006410514827696, 4367363852356865, 3108174070644550, 3399842446392251, 3651405461962036}, + {2963842949036336, 1110443523197923, 2370466150687958, 2051405852060769, 1998735788124574}, + {629291283140720, 1484410172308977, 1230690465849055, 1563468011476927, 1425159147311735}, + }, + }, + { + { + {5585239563455525, 4610636723895044, 5486382712767880, 5982393863492935, 4225244847092674}, + {2874785617528993, 1037465406252872, 3296887051144680, 2286839599744315, 786748793374778}, + {1152063960223905, 1495207756023516, 403624329924470, 288757773501508, 634701074033280}, + }, + { + {4288607522123402, 4846896146524989, 4707359298406332, 5135207568875886, 3789334229842457}, + {2917883701302634, 2925085599109681, 4014710226846848, 912132719741982, 2714081319314151}, + {204576686258175, 1916354881141604, 2182213405559566, 836541881049164, 1393662576855498}, + }, + { + {5759444997810940, 4193440837630205, 2993247029494710, 4574723038696780, 5462384317223070}, + {1429326167011008, 3849536799125309, 2267296904452424, 3653618160132546, 2008400870233860}, + {1583200791922713, 581155064879634, 776749520692821, 82151283071376, 1733847968592305}, + }, + { + {5824219020582313, 4082583579489045, 5236716515955319, 4695754388607834, 4087929633004663}, + {2723457493421297, 2288104271131495, 1889807602666693, 571526543144584, 2151183507738315}, + {216379584390389, 359329711860756, 2220840445637019, 1935487238453911, 314381139238943}, + }, + { + {6324432942393073, 3866303010803999, 3020114267775140, 4943018510078408, 2696166744880915}, + {2134908988986295, 2962507202980067, 1681144354786142, 1678261855220080, 2165079891714277}, + {839191618399610, 151822034158330, 65272611705697, 938153274860627, 14360318777459}, + }, + { + {3118414549517527, 4750668024533744, 4389573074356623, 3687569756425714, 5338903547055573}, + {1473478682616257, 3633382583874766, 1909784146543313, 3349986706799106, 993668408613515}, + {364270308207016, 667227739516977, 122427551474936, 957177061876827, 1110258403339423}, + }, + { + {4256211953323020, 5655880769308112, 5147711084133693, 3515346496193909, 3997285326966523}, + {3727619641010474, 1181551732606964, 2600588673325403, 2469054944509579, 3385365618247725}, + {858909692206820, 61057235030988, 1105898533486092, 2202030785898301, 1422234761465688}, + }, + { + {4566369519147140, 3936942479708331, 4946651352770194, 5597737572220025, 4038789996699983}, + {1354120322856538, 3567014996875285, 3125649205892726, 3221576024570935, 3804405204938131}, + {758252632702114, 914226082256766, 434171717412081, 779505540917105, 51590353584795}, + }, + { + {4416135541622855, 4651530410104026, 3833614791957416, 6714310821280595, 6038964345007539}, + {3122819969959355, 1154192626573742, 3197914057178582, 2213609121110881, 2415518693959367}, + {1900133378602138, 577297894556411, 1975904780443420, 367702995667978, 971695605371773}, + }, + { + {5691739211507754, 3947360890016266, 6002902486092077, 2925962297163746, 4016189592321792}, + {1294948213915982, 1859247234048810, 2826079115120605, 2717796469093276, 1254328736376524}, + {1309911522909577, 1419436642934017, 1066858837800204, 1932820656369018, 1183788306261091}, + }, + { + {4373293771099146, 6029412334349101, 4603988300239160, 2779063318785645, 3538182001391078}, + {354784062716014, 2960996156215287, 737478213901140, 2448765213738437, 2443710778345986}, + {37327849111839, 283459044945755, 353933224898901, 1645288254358965, 1295375429334450}, + }, + { + {3677292170794769, 3117650463171591, 4719239493455234, 4362161261080430, 5717636534074846}, + {2663608264759869, 2105855808111831, 3795920549032608, 3588992239888494, 2806554331792318}, + {2036310356419974, 1862941437683537, 2122628002305950, 427826430955887, 291402007632220}, + }, + { + {3100956993836596, 4149163064979557, 5785693523916593, 4751072583726928, 3316412298207139}, + {2400585099524078, 845178406557315, 1712123121349035, 1518690883002826, 2049951197688491}, + {1805653877101595, 2041224626272278, 851063029095866, 1497753468187708, 1406228898239886}, + }, + { + {5260996583106547, 4838608075273405, 5366327117123850, 4982440029922063, 5698050109664171}, + {3676073115087797, 2883668558141193, 2503071760256012, 1640618939206309, 3001604944016599}, + {463897193543924, 852129647033757, 2185610432355774, 914719594057928, 342067349817283}, + }, + { + {3765905247379871, 6338723143452534, 4484328730824797, 5536719681008311, 2764639921823257}, + {1030797243840613, 2110720517661432, 1415230398470209, 2977956931886379, 1982287306571007}, + {2180738906930659, 1806951067450075, 36005005692651, 303238055099928, 190139573853343}, + }, + }, + { + { + {4025496086329564, 5028184343166740, 4304607245262868, 5977861543210978, 5975943712754890}, + {1773953341907106, 1826809791300708, 924874532383668, 2964289914628984, 3000051694532148}, + {1048828262296911, 626018299495748, 1536855937015065, 557005099579827, 205000143299648}, + }, + { + {3686649646834702, 3431735540864864, 3540678075266127, 4755119958422340, 4426577953698517}, + {941815577996700, 1930911276112812, 3001621068228165, 1967675522206374, 892948220720651}, + {39364207708032, 54077643340559, 47072300438335, 484490203728205, 330170579231628}, + }, + { + {4702834568738627, 3291678731018536, 5642230899808367, 3758646432111623, 5155137589229851}, + {1020447780607279, 2803044870250806, 1618835409581889, 2925650123847541, 2605959132875331}, + {1190283817822151, 29815862110548, 1401771831527381, 1814017508050437, 751331585591881}, + }, + { + {5109595606310342, 4551817631663576, 4964640045962167, 2568185324125768, 6484076393091613}, + {2159866514586362, 1758376548473728, 1635569740383557, 2443910752037966, 2023235829583533}, + {535848012622913, 543536404720769, 149076814975879, 1567757637416350, 1002851193383852}, + }, + { + {3815561875504886, 4987304354260221, 4882489851059671, 5118054256243381, 4641807084989976}, + {850247344591352, 3894610597706487, 1974409276090169, 1605973976114297, 3601811238228268}, + {66796032196982, 83108349878636, 1058512765854606, 355785880766958, 2173660513649027}, + }, + { + {5137434473036957, 5769675136285847, 5436511544403722, 4264839407576387, 4266175067727596}, + {1941123290917747, 2316977311376991, 2913763383192580, 1172954226263395, 1951085968954154}, + {1331723279107642, 360406964548232, 602431788387748, 1292398959539176, 347247628588850}, + }, + { + {5432516922132898, 3078886318864995, 4583513191179486, 5867019372106709, 3411264839291911}, + {2170226002806030, 1739335733478471, 4017472424997012, 2918660155665329, 2793865679796361}, + {245885669910192, 255454579697350, 869246923980317, 823008017430135, 2047987637517532}, + }, + { + {4988197221931747, 4124266159815332, 4025663002514467, 4403069876409057, 2825978174946111}, + {3615548446949869, 2386240595324376, 1969460953567929, 2939417927358269, 1831662708850445}, + {1325588019367749, 1763566216507756, 445592400440775, 1009027711126237, 1471076108623188}, + }, + { + {3535455324868691, 4187842716980314, 6000482158112321, 3740505414106560, 5271856051582847}, + {1181816564414671, 1156678021972118, 2682384137206273, 2260248858296388, 1100324256765571}, + {1487590095774723, 277659353917859, 1381509894936782, 1061130669028904, 1364761503808628}, + }, + { + {4778189969823672, 4001451898457449, 6113563635354943, 3279804336055010, 3551539211588960}, + {3358253142401746, 2070882729090991, 2076758122179069, 2612730216279296, 2875157527961954}, + {1082784010061460, 1534894036268453, 1852407202514802, 2109696474131863, 1530718911157644}, + }, + { + {4923904010378051, 4401333064112293, 4345896142363128, 4462036896398403, 4199434117360330}, + {3404425764066199, 790431937118435, 2117892820897492, 1747418170252123, 2322149428381644}, + {1548552607325007, 2020524571521392, 198565314654983, 490668591018400, 531050967405176}, + }, + { + {5145969570912646, 3496492300608685, 4069590843971303, 4335556955800239, 3325377629546533}, + {2623126033999932, 3437252355580701, 1673392257908819, 1954440682865467, 2560737733895255}, + {516406018439380, 1624367135427190, 1319745729116992, 1076628515910554, 819495581575694}, + }, + { + {4005978810673255, 3160053273427578, 4474659303213566, 4173935427495701, 5201857712754300}, + {843136030895887, 1929944939303616, 884551308418834, 1356687291240061, 2259204804361506}, + {1461715846997541, 2038281458208083, 2119767535863762, 636224052565171, 1712721429371389}, + }, + { + {4975731433879692, 3888553624589664, 5228917373823987, 5038386998880250, 4707655682255612}, + {3409114563124612, 1820064381354618, 2421007346773091, 3239920960596314, 3726969650504610}, + {475869807928836, 887669112822100, 481835223948027, 1468799954696850, 1370247723645687}, + }, + { + {5954383345631578, 3742995524386402, 3611065523713845, 4447231480190211, 4725820376570018}, + {1943063487159002, 2890245371286974, 2837035330843453, 1080549927676027, 867285909606140}, + {1413582027032622, 1273926892909999, 726179076119442, 699229594605794, 406422835715518}, + }, + }, + { + { + {4513888950241631, 3212738446973608, 4558390526464820, 4859080230791315, 5273416148656656}, + {1326059070986753, 1683859889439034, 3052200172327874, 3805600625804475, 3687690452819464}, + {1081752225631401, 201284952113932, 1619339403526661, 1533363030164674, 1727571790703503}, + }, + { + {4206177554516483, 5468031785191800, 5978090949319557, 4899439545685678, 3929672195094815}, + {3151535789445747, 1741766716299828, 1742063303545331, 2027626928190420, 2245203856982753}, + {868012933261061, 1472665613225898, 1744063644616181, 1350305502884983, 2227467074628670}, + }, + { + {4669057309967741, 5650515638764201, 3042033906165361, 4078124455841206, 5666341739515191}, + {3587030559572189, 2850528363281919, 2974216851298661, 3227895056003248, 1349661756105253}, + {1313383948772993, 1074655824143287, 20040386640896, 305794891855170, 2123092901229151}, + }, + { + {4199945629383318, 3594320984526977, 4229880092041671, 6384664478996443, 4732837782434517}, + {2744443256254860, 1013874505344583, 1972732629285783, 1936827407065469, 1830481951704579}, + {634737804354539, 422989080575800, 1774993942417585, 688011718282303, 581542014403477}, + }, + { + {2816888940207091, 3903781507184007, 3616069829367681, 5525450216549915, 3780846206608878}, + {2517199667227667, 856367096857961, 2630571629218547, 1768604592283813, 3688963458794126}, + {1683677903016217, 2036167240589310, 262287609979509, 977873833112269, 433284640623898}, + }, + { + {5477402921384451, 3117269161199628, 6049837891653338, 6034999812243824, 5356551064760510}, + {1755760392036121, 2130115351478138, 2694425247498002, 2043622709923142, 2338295058055586}, + {1425112218383847, 329346717672590, 378517748485393, 1806152114945447, 1211275024279312}, + }, + { + {3594715588472482, 3844045487620198, 4484578538777484, 3113667148844230, 4337495224693479}, + {1968587687914188, 2881021730370090, 1429009633828432, 2770076641127580, 2012343565772575}, + {1629969809602186, 1106234784906336, 863587490378700, 1792807263239898, 1429043938024750}, + }, + { + {5737804770941067, 5078013196347608, 3898224610791405, 4804530531188967, 3180800540121608}, + {1973106012015851, 2593923400059844, 833516958919695, 2182197879897069, 1721403407106648}, + {1591076166555979, 849361769125080, 1443799738863429, 166584794343739, 1861773413238536}, + }, + { + {5730227718465208, 5596273386383722, 4195854427433762, 4069266668520101, 4524280540784068}, + {1968981310480276, 1950975116204498, 2592307802896060, 3813918534870745, 2620661073133464}, + {936764653391291, 1452448249608980, 1312847510424692, 1846051928374105, 531372961271999}, + }, + { + {5549943196407418, 3432818760073271, 3449244033859606, 5283577488399029, 4864604608008479}, + {1733819728686816, 2936024966547233, 1590816041651632, 3163811004299109, 2676757470677367}, + {1319097278964637, 787422552977413, 1599496421811883, 1959379193761008, 1506646670818903}, + }, + { + {4227254412838170, 4548570321204425, 4285644009760393, 3751016940211786, 4098838617641914}, + {1732471582908700, 1866076266304485, 2819215151172481, 3074745073420508, 2774887501545996}, + {717261628309176, 1858796230699344, 551077134877547, 149402535309098, 2105648961714394}, + }, + { + {3871916223505114, 4749816457502813, 5358561311326743, 4112663885073414, 4137415642080692}, + {1127279535151728, 1199265744257977, 1248562495202825, 1868357952639788, 917052103965266}, + {25664888255034, 1628004430886188, 1439984389498414, 1961957176184883, 182596205772698}, + }, + { + {4179077756813138, 5647690538147405, 3274850245594335, 4319226212135161, 3864148139899748}, + {1739387701061410, 3112148637704823, 3028846916651989, 3700388643798173, 2412185850016002}, + {975143220058337, 825243809988211, 515186464897625, 1179464291552333, 2112614471328036}, + }, + { + {4947873049161087, 4901033700427489, 6675583808729484, 4941667050946228, 3120269525234559}, + {2996598747660015, 449189546044795, 2197501482114022, 3158206489499126, 2705800926920583}, + {96737353895103, 1534044505139178, 563303281603459, 407703386650348, 1821870774469537}, + }, + { + {5049500432849751, 6040441932911013, 5618655093441099, 5061587505104794, 3837175101097290}, + {2654088892951999, 2871006956063187, 1742690076584393, 921899537851044, 1870021525725886}, + {1637444308641066, 1472124432669136, 741811397216072, 1252880060061292, 423564866101658}, + }, + }, + { + { + {4796818337004571, 6222611117014093, 3083419469630983, 3862822099971652, 6509664209117283}, + {1171837083014025, 2516532715963947, 1770010974323603, 2517908022038722, 2020794083615321}, + {762321251771152, 1460210191529427, 2248797163104578, 217468651569622, 63003536153574}, + }, + { + {4259858178043342, 5554955317979561, 3911791110113593, 5525892988208900, 5545696994818748}, + {391588043113892, 2202456919563943, 3869688632614537, 2945959779196464, 2143606811138354}, + {719793864170869, 1411477466905009, 1515019021063010, 1483421690183889, 1704042941619334}, + }, + { + {3034963268199750, 5870224135513779, 4115305817554936, 5421579290342892, 3835694901998808}, + {2769635787032504, 2958323523618463, 1537480429839772, 1483278086593314, 1378968978067758}, + {1315034452637574, 1172434640681242, 1135533609020364, 253349230877293, 161211572823476}, + }, + { + {3942650253210285, 3918824117103583, 4001647299508483, 5240554545879312, 5035373070605317}, + {2659408003097885, 2049444491227493, 2594690944032877, 3421228755254048, 848234126951057}, + {437225545901468, 888271756229202, 903344393515123, 162913205438885, 1475178706291532}, + }, + { + {4287921885063088, 5041248821201299, 5585484729625036, 5534367719396511, 4532272822475758}, + {3707293450173872, 751219268219695, 1525065253586106, 2054680090861517, 1393874745922970}, + {1910711495320594, 321017884248758, 1651671690842787, 527123817162741, 847944616444202}, + }, + { + {3415231495445846, 4190597015532201, 4905073239386883, 4940927269911495, 5980840029199164}, + {1474221667712446, 3068688770339565, 1358088375247373, 1853329794010803, 2931295009606082}, + {70084211861389, 1248863300280704, 1009402227613886, 1445171656255193, 728732085908498}, + }, + { + {3340501878764401, 5410923356778271, 6030788584012822, 5594611759355304, 5267577702264329}, + {2869750492870027, 1153392601340917, 2754776472841130, 1100510641818700, 2870221151280913}, + {1481950048975238, 97096668186528, 429204027887699, 1510003697018425, 2114825823462494}, + }, + { + {5159850395392603, 5067743945456882, 4551909910661973, 4393814096795878, 6145580658249508}, + {1440929316705129, 1633730452330828, 3657204567294737, 3657918436987822, 2561724546723194}, + {809017030155597, 1831934834657405, 58189812416765, 1517873507099267, 889681994437792}, + }, + { + {4153444167566628, 4372997703941365, 4839161526733376, 2653398635504610, 5324373835991045}, + {4007354401668216, 1201450641763461, 1526795422335006, 2273741230894754, 2130356372280991}, + {1057020591512462, 1324094020999413, 655956927766596, 659874727272243, 2024954110083652}, + }, + { + {5839605326568475, 3831434019746100, 4883240784156331, 3880003889048305, 4841910074653809}, + {2844236939823231, 3043783621566488, 3890227240890757, 3800769469380331, 3175183419371011}, + {863608592350445, 1111828464904337, 322487356734403, 60843367779474, 775147863897458}, + }, + { + {4129677439236364, 4363616958764152, 3255333433286932, 4071265658640216, 5527560633207578}, + {3501906805856088, 2995655036831742, 1989943322549290, 3334534687075832, 3371315397704424}, + {471893887981193, 1459834432249674, 229072407724256, 1165980516905022, 1036865507138076}, + }, + { + {5587927329012785, 4196019533185475, 3488244055775669, 4788679066807545, 3936797203887245}, + {2334971095120001, 1054095219722721, 1729452124624259, 3446754994849569, 3835890504040419}, + {883720982539262, 2126174835830047, 1858128110066030, 1402309396930944, 1358212283922371}, + }, + { + {5437236132245684, 2619202868264644, 4266616048403094, 3779544081061673, 3472381895789909}, + {1158559475833858, 2227035258871772, 2170552210791850, 1087363571520417, 2867304161007231}, + {116357390237056, 38114324586368, 853586347213800, 1638943134635811, 1882124412005945}, + }, + { + {2871025108215057, 3893039278529517, 3878244260089116, 3893554424872522, 4708186328386966}, + {1760242418163439, 3855738944127473, 2877581036561996, 3253911846338252, 671018190326366}, + {1641735698439468, 1630160111859414, 1920036824528970, 346120100914920, 385076471695398}, + }, + { + {3934974918427731, 3807320560303621, 5860456491598573, 5199210868384009, 5781319959443384}, + {819456425532597, 2215390016559513, 2301197053109143, 771274648900875, 1303516882225152}, + {1530178090161037, 1646502716614548, 1058228190532635, 1522572712238470, 991147078780643}, + }, + }, + { + { + {3763364100157977, 4436158450653533, 3664705850096563, 4592883978910063, 4855668048892712}, + {3431442042489897, 3670457457720097, 2927483669898581, 2847896260114069, 3422237175305894}, + {1907217462504765, 679044428705663, 1371479879514675, 1420793148384765, 190685345044087}, + }, + { + {5140896563326095, 4954544354938625, 5148671791011404, 4813313238272129, 4814788700593711}, + {3528505813008031, 3913030166310689, 3457534787545946, 784019563379975, 1449546143149561}, + {2213525665395526, 146358659614731, 1573034916169973, 1131167148341295, 1194403623212224}, + }, + { + {3034590507214084, 3771531416844161, 4279939895181473, 5778619660734332, 4308244183318381}, + {2105305689409168, 1932040296635725, 2559301608776867, 1653053081843050, 3498476220207615}, + {1916484225176, 1896106466807315, 1279953155660650, 1725386140841619, 757101416534772}, + }, + { + {6555214085737347, 2980588876755702, 4785845115539682, 4430693817238987, 4107141749770380}, + {2133488547373079, 2884934342093682, 1652284377802152, 4287340267215791, 2741073463083472}, + {655928016394658, 1087485647128905, 1281789693328119, 2088439151211398, 1863153332596984}, + }, + { + {5220143354789533, 4303392603719785, 3697665521216293, 5367115036779017, 3354674257103145}, + {2461817469666051, 4062983661511151, 1323101412046937, 1360571080713195, 1716626899554003}, + {1790273650925445, 2180187262630477, 28219260774301, 1951582862584504, 1059160821201578}, + }, + { + {3706860118974125, 6182298149062642, 3206841902738667, 4986080379139384, 3223876357324169}, + {3108934357344473, 2823383892309930, 2709776767813967, 2732378265738840, 1695118712507849}, + {95538772778706, 1914880923031197, 417513632407841, 1767845086605839, 832379724270193}, + }, + { + {5132941124964776, 4798553016886828, 4052101096460607, 4475816634870178, 3176602159556433}, + {1456443406045738, 4161184975160682, 816382632051403, 3678387736600146, 2166890266198131}, + {393110820654303, 662371396172458, 1370237312917823, 2034119121136113, 904928937827}, + }, + { + {5075422185081409, 4699433492834214, 5948286955155472, 5933498265459676, 6441657203628461}, + {1257344135899307, 2776494249972420, 1637109398723534, 1801319038042246, 2082644998926031}, + {189274223123103, 2188109173279445, 1461570511269332, 151886143484743, 1557837550414982}, + }, + { + {4365365818590957, 5180206223815189, 5035374537630803, 5955216889373899, 4177347431591518}, + {4105224954841159, 3814048291702159, 1805828417935849, 1548444252518409, 3761242775865814}, + {966697507230426, 1689614203301123, 867370120071235, 563108996765880, 1552869095947518}, + }, + { + {6190612622769392, 5262116783421509, 5770823033954832, 4892678801476142, 3789326136184388}, + {2680510164419078, 3125272296703659, 2480535210869218, 464721098622880, 1141684153257222}, + {1871952745325912, 144470913279784, 434631777342778, 552837449330893, 642852750438644}, + }, + { + {4755508755993467, 3653868693631672, 5880862524139354, 3244860344044728, 4481011039901531}, + {1809358219650823, 2339660560948574, 2410584439137912, 1286742564054194, 3633419878206029}, + {64765075641768, 68764899017819, 1968408548264810, 2037002115471749, 211556643344747}, + }, + { + {5543625841706618, 4560629261024327, 4731751483103768, 6307249547601622, 5012757099435702}, + {3301009531661216, 2677459079264873, 2707326467220240, 2261655438430016, 2962646350850358}, + {1579401584164790, 1951017356653076, 1801209077919862, 1153368800641031, 1775772413220140}, + }, + { + {3556317598507403, 5934251293404526, 4176527831714322, 5239968931380200, 4506603999756496}, + {2798836099557035, 2002468979873228, 1132424890166086, 2388404451698808, 664387721246094}, + {1947208168676528, 1750536949518976, 835780038339521, 1802624114603814, 1867663782159356}, + }, + { + {5351331441108046, 4901733280572801, 5434846723443585, 4372148225205494, 4376250516119689}, + {2519667781375866, 1132412577764719, 2322930879998983, 1660817657158452, 2806576583179867}, + {1273923691469553, 1862566872300733, 2236121435313308, 274949363314112, 477088969758259}, + }, + { + {3358480296518006, 3814827118577810, 5033804317047304, 4803399909431456, 4940637069622359}, + {1965761504739774, 3200209926214852, 3722168784530754, 3464219522306102, 1953662369491229}, + {1946412430894973, 2031215026716789, 1150845535883051, 749273986980949, 1433091314912259}, + }, + }, + { + { + {4565135018699993, 4952235844716789, 4332776238462736, 3944983589420527, 3534528668424353}, + {875483311206731, 1070293195031859, 1281389774974538, 2234860500431395, 3030484939064537}, + {2191861413872447, 1998107865473216, 135161483760725, 1133778951112075, 2177808149908975}, + }, + { + {4472607877838387, 4680291079417999, 5266381476904463, 5448529984859500, 6037873358663623}, + {1355285592679599, 3216332013847453, 2858567121370219, 2432376038574376, 2734263724238645}, + {449706520184472, 2214233011551797, 684523848529734, 431843026966950, 1758835924810462}, + }, + { + {3413242279346498, 4524603375434282, 2637627437993422, 4373910262118552, 5420094068912965}, + {1617166089281188, 448710947316786, 2017034644293574, 1886691422085664, 2375442150405559}, + {1239614751060180, 254449956067847, 1915952567259905, 391989559805324, 853553448301328}, + }, + { + {4142542119790983, 4675453183245373, 3888287250251838, 5522078723840086, 5552692716915124}, + {1381495390544381, 584763141985101, 3131504846670548, 2565162572339012, 2037973653370614}, + {762375715838646, 553562190209386, 1146347552263484, 824188464596685, 1830942666102590}, + }, + { + {5823375217862555, 4240127004291848, 4611065015006224, 3518908128296096, 4915429068500234}, + {1348374701112873, 3953700554194482, 3402331094627540, 2804779645909956, 2204826476892034}, + {2119092558617159, 1045482671389213, 690197889240825, 471826136635342, 1637923217880356}, + }, + { + {4059066650158007, 5141565698162354, 3733026015817812, 4875063676054927, 2832005231346927}, + {2181081937454965, 1121830291087960, 2832579231299976, 3124836269482413, 2225668708158199}, + {1193994157146400, 1628108083694642, 1021885296427132, 816068909639879, 2088480068848711}, + }, + { + {3180618525607636, 5342429333917474, 5008239417572170, 3506064373977331, 4538653079573275}, + {1673050054377632, 1765054067091528, 2962973405879830, 2339273872052899, 3950931503569149}, + {2229241184614921, 2107352800266199, 77312115078922, 2151892262530718, 947910914861383}, + }, + { + {5320544374459840, 4141095319362425, 3313360370605015, 5185507100540960, 3283266576250376}, + {1528297312537716, 2187935649407647, 2967731417391411, 3155021192657576, 1577434241618944}, + {1385713524190245, 153942078459639, 747467190641094, 1446053675113471, 429215290527338}, + }, + { + {4130033413775598, 5253437474448919, 5186743122906330, 3072446418934431, 4486276088811881}, + {3865635552262096, 2111934227084997, 1803460783795098, 2595364764305293, 4294038033412459}, + {1939054538963024, 1515892461529143, 2145315228101212, 206131396483318, 1207808442703235}, + }, + { + {4285235833599064, 5004869505494285, 5398338412388895, 5145057161859867, 6219558308357834}, + {2122251221692966, 1686529461497383, 3592144721245791, 946103181235971, 2261774551055452}, + {1519512635495115, 1879830706415200, 631994832099345, 90552542491442, 1074938948794598}, + }, + { + {4349405123860786, 3135193611243628, 4214940643324649, 5373877724549797, 3499285433136967}, + {699708361184464, 2781323063917462, 1664177773796467, 2129061781951253, 2929310224293355}, + {881819301152893, 1404208553713523, 1706641996539966, 685345252606027, 879987031868371}, + }, + { + {2629920833708073, 3077736686198199, 6153945246604194, 5109883364128321, 4007866927409167}, + {2201062670972485, 2517508956278887, 2681660437016124, 2026769404043331, 1562746334284849}, + {2029537774099989, 798336123274982, 962765795717174, 1441375461370721, 595792417755859}, + }, + { + {6147148440188849, 3255264873123981, 3737719663259093, 4820083084252873, 5252844759112604}, + {2825984342500049, 2739886905391569, 1677188826435105, 1932192000687991, 3155126576093338}, + {75347910850483, 59335245365512, 2051925237105745, 2044824231668461, 970303688628601}, + }, + { + {5763564504160432, 5421442243725773, 3588496091914407, 5369436266097375, 3995085142922692}, + {2488955180168268, 1799719498283103, 3012193868704087, 3191119683274303, 1313407450591024}, + {1669605168509235, 1046380333598262, 8317204728147, 1002144485955824, 1980712166998785}, + }, + { + {5208877095968696, 4101472145123500, 4547654469901586, 4596473001183302, 5108183921345691}, + {1614319198851918, 1592777501272444, 2078178842786638, 1134074463419502, 3406886179792273}, + {46520703266015, 1463053727782106, 1641431035629451, 1167993397224604, 1860200763335910}, + }, + }, + { + { + {3011332796830409, 3293305844851756, 4350706657635174, 6528175041183782, 5633500660447495}, + {1684548552982151, 2512680297050328, 2151565475089600, 2240257948464080, 2357334086387757}, + {2245889758290233, 1304556815701186, 1427348922813143, 221464961710041, 2149077757654506}, + }, + { + {5021889171679330, 4462128123863397, 5496067810219064, 3884382915013647, 4592260500935750}, + {1200977971745538, 679604753110803, 2370440117588934, 2264961098110051, 1017048311556208}, + {1190992926530423, 1046016291129455, 1934369009614752, 958221374199446, 762751542850234}, + }, + { + {3460977055305417, 5402529018730102, 3060601098222640, 3497142554641379, 4775614304897016}, + {1196600994744545, 1547369290503378, 2035231477477616, 1257032246257935, 2729013549752394}, + {1316355169784636, 2159471323343549, 195437001734225, 1784725127680235, 23628188515854}, + }, + { + {4414887133757738, 4702915728776787, 4098231006823107, 4707645820548353, 4031420634244190}, + {4034197670769956, 2299895540249251, 3720313013014369, 1169924369129605, 1452708652401532}, + {246845927125542, 475207520380026, 1495857355234583, 1332907410765356, 1137190823002655}, + }, + { + {4619638086363716, 5112231939480403, 3430351651754637, 4072797244384643, 5452815353333736}, + {402770419372162, 3130948749709529, 2422951975073025, 1521258543891683, 3268450338566556}, + {122249525311324, 1126352422834922, 929325077009082, 782368628240853, 94217591211022}, + }, + { + {4962635153104108, 5274135403834507, 4755774461820061, 4383546262262835, 5457666487690905}, + {2990995606289826, 3021922427972001, 302802129599791, 1502244105829111, 1773114045409669}, + {156241863414061, 496518516536107, 402847929676013, 1139792271454333, 1977247161507402}, + }, + { + {5032814130431534, 4760678921877281, 4442869438253961, 5565429687944605, 4317400766530169}, + {2463323770855702, 3896470221755473, 756431515781897, 3201672938286523, 2288460277235041}, + {1855056967762827, 1495181328549832, 966278130514841, 758391654071223, 467588501531856}, + }, + { + {4817034814919500, 4208076967893683, 5868839484739037, 5852497340094076, 4630054499608831}, + {2436900424213206, 1954148435588967, 1712385658617173, 2723793304425402, 681838917243489}, + {1439947543028469, 885225692302481, 1285222886469976, 1588398795428018, 1298691185892088}, + }, + { + {3166915207030205, 4221727132556131, 5745276646060520, 5830694990900872, 4237998343894079}, + {1368851636374513, 585540725726993, 2239345036245042, 3124363364569248, 2914970196697053}, + {1206666555409985, 1789371104267935, 1925466428785716, 378678703847709, 378978574609534}, + }, + { + {3049990186077834, 4282707068721497, 4031467457902549, 5045270642251952, 5619239366726696}, + {2247218341382540, 3733105160936895, 1542123681165149, 3690639696246556, 2686757663719606}, + {1131525507915411, 151967851358587, 1334045685598637, 1807594577522576, 1666949318203671}, + }, + { + {5317642436905001, 4262905497079623, 3806587609027544, 3162214737577195, 4598325819108034}, + {2322709256244499, 3364701239080335, 1085438519194966, 2211341194954781, 2734280485747362}, + {547075051672667, 1927631982974242, 603999740914722, 1974345687792190, 310412755046628}, + }, + { + {3092260334664458, 6358353190373839, 4150234089958180, 4141601803005412, 4164851538431420}, + {2480565549840732, 2510439995547619, 2534702111260990, 2561344597955166, 619102460354386}, + {1996829248620682, 1059563669319507, 2240440638640706, 1599145288747177, 407659118560947}, + }, + { + {3115383537041122, 4344887992692310, 5501863024972572, 3993241570720752, 3416751871823654}, + {1717619697579090, 3621794853637170, 2666986311609642, 3029150476191498, 2414353362640396}, + {2142003785026841, 2167906365984504, 1742773278204754, 812925480008831, 429368090247755}, + }, + { + {4184856094603567, 5404235283771230, 3764176438258862, 4280121628742729, 3445790640140600}, + {2656068733977443, 2976637537776442, 1238993222325972, 1554795161393303, 2131523863405492}, + {1574345185045103, 2079161140310195, 2092484433153763, 1408980124437971, 44981420431371}, + }, + { + {6193742471986890, 3621814037880206, 5498721010846514, 4536848636334539, 4762288817182267}, + {2703599140394458, 1961129680427764, 3192043467883058, 4259887504588631, 2455375021790255}, + {1758602597767485, 709830862658938, 931608374711636, 2198476269423406, 69272189710304}, + }, + }, + { + { + {3960691793618422, 4697205665896081, 4233023106925560, 3551947497905370, 3667490775726784}, + {2716251404526112, 1631117916585969, 4014857913931082, 2213037729836094, 1396521499150134}, + {296206175452724, 658879322369119, 97943562265366, 1761747874053347, 665498744562262}, + }, + { + {4542146017866057, 2313615921887147, 4181202139006694, 4414799599657545, 5341405847272363}, + {1200760264207189, 2304738880112015, 1927960174691144, 1569518880089323, 1152309979337507}, + {2038947849479643, 237162323211423, 2065816839891168, 419806183479203, 384865548997533}, + }, + { + {4632532202820720, 6679838284939842, 5003934316625137, 4209971835933588, 5519581415427037}, + {1152764853239608, 2282089860477202, 1601380253073465, 898105377854964, 1583948862629235}, + {1558193059260245, 1778073808602536, 402624851529717, 66752783641769, 824353727713740}, + }, + { + {4121947878564012, 3974762513146561, 4400688676047089, 3750758292493538, 5582121141429898}, + {1987770197713484, 751549594590657, 4130774294058181, 2772087960475462, 2398377455469772}, + {1021194340773145, 2214506742467645, 1946787888944335, 2047968106648641, 1821857137920583}, + }, + { + {4817011285691457, 3821500381976103, 5867746283021767, 5892999478528259, 3614975724251316}, + {520345345283715, 993525428347841, 3082505540027545, 1401316007351695, 2524441889115400}, + {540709883326476, 664748033877723, 77460650157458, 1882229467398241, 1217186023704288}, + }, + { + {3888704843022071, 3022592939512474, 5839771089230787, 4705593175556810, 4617871784452989}, + {1148904473568401, 2292434344833748, 2860017655924869, 896886146116790, 1793557015614071}, + {738867948290551, 1113067062951318, 2239418068162676, 2235388618772922, 321946428440080}, + }, + { + {5186369799189058, 3697173555759488, 4262727107695046, 3185380591286776, 4149807772745719}, + {2507278187062390, 1965300287234722, 1455241861966706, 2358026574953040, 2356583034323921}, + {1141974899967420, 1197500508248512, 1725264994009043, 1639228663875285, 1766256613674282}, + }, + { + {4859130511022316, 3438619274603782, 4274393918753007, 4542539306472407, 5021829178357491}, + {1473307785816396, 2183888493524504, 3592230148429221, 2872086545946123, 718894511556159}, + {200438687964996, 1579389594103736, 1144999901302662, 1292188560016150, 1342060233269448}, + }, + { + {5322785092917218, 3564464821553428, 2465159528975281, 5838118438127962, 4862308511365583}, + {2206232904105334, 2908798660147806, 2169658158959269, 2724132358944628, 392390928972895}, + {883459081700629, 1602090588151437, 768552508263143, 1181944834979084, 1796139787109480}, + }, + { + {5591293901585158, 5161437494483979, 4307878889760969, 4546298250229339, 4189604893397730}, + {2182554744233356, 926666458178889, 2790825304990041, 2529147957716171, 951582391464256}, + {187571578269437, 1207365261045700, 1671287753495621, 128062601272884, 1097620007687094}, + }, + { + {5979255840859055, 5170212343908976, 6251571908864416, 4044340797680332, 5873982661311143}, + {1856097540852989, 989253754708050, 2232404724159712, 538127825012338, 2301974812680125}, + {875553341339604, 2202671771469035, 1916683928798488, 1628926854796717, 2104927509529811}, + }, + { + {4738081053584946, 2875665464097852, 4082354471082712, 3079977082389326, 4643006842643895}, + {4085499965974240, 2403823491084742, 3352533311494316, 2981802103584372, 2409154352569497}, + {822917758900752, 1019777701975664, 1564136027018780, 1218107309963297, 1014127758290355}, + }, + { + {4211670720265322, 5260586114139374, 4117778612287885, 5761523698172883, 4942445429900242}, + {2233928901439648, 3249090656816698, 2685023842449397, 2515328324903077, 2780554742949852}, + {1119507853423473, 902873322434013, 1683813506511239, 99271672214794, 1043609318229518}, + }, + { + {4881172173279202, 3599812968457896, 5389450859587312, 4590538673755018, 5926347639505399}, + {2643454724039014, 1385194776028482, 3573341970152704, 2554149121763820, 2626184303949707}, + {1041863798926969, 1989079677249410, 910600041636905, 172639986070412, 958797345271109}, + }, + { + {4102514793801097, 3799057862785664, 3089506143944932, 2968464716766741, 4933382932746089}, + {2671084000631505, 3069928136724336, 1615118202102194, 2860128525830493, 1072943882334681}, + {2239551548278550, 1569208624262185, 270318489599140, 666224807173956, 272660472277513}, + }, + }, + { + { + {3788400011322929, 5238791757709216, 4201438471307196, 5718998504437804, 4699660978114753}, + {831848399557275, 2203944328508070, 1205773492199750, 2947899883606056, 1258775953756159}, + {801855642469056, 1726062700700587, 1064722548099106, 1128997468587175, 1368420390253860}, + }, + { + {5220756346668707, 4207778951928942, 4451591079714714, 5561602467108901, 3701332347939515}, + {1095027470911861, 1309452919940954, 2417363745862806, 3417231569067727, 1895316643922203}, + {2142749866659158, 1962490102531981, 1691447155265793, 1827079035266074, 3803331638058}, + }, + { + {4981668826515757, 5644770367578110, 5443857182354756, 3149391452129516, 4066238206100559}, + {3356282538281353, 2251921811216688, 2887149285344786, 1384857237573084, 4057072468959031}, + {399619403797256, 1517816986720610, 1503473770785461, 1650204761619743, 2016574488970872}, + }, + { + {4082671840470154, 3874834197714005, 4437883298126266, 4222220664757293, 2316031680718393}, + {1452497321657782, 1539338328736177, 4156757905713634, 1587402592924883, 2189645592400953}, + {481460971838645, 495603062939192, 2081146895236470, 971761350637757, 742727604094484}, + }, + { + {5515673501962670, 4546389793895825, 5000269413610660, 4603828815474748, 3900836987569214}, + {2460924811417180, 3521984551624439, 1511404974611240, 375249799211988, 3782407540620780}, + {2048665788177445, 1408893800498572, 1918636993246022, 317961445367427, 656800592778138}, + }, + { + {2426976075633155, 3651600221015543, 3234264849290625, 2473309309095632, 4407296503206636}, + {2422350949934017, 943103623278343, 1291301021890213, 2346315203451818, 4112725099426082}, + {269878912827170, 1290670313639785, 2170448731381563, 1730590899024060, 665688666929019}, + }, + { + {5000413361992888, 3347912965056552, 5787242209541388, 3819792442922756, 4847625000360540}, + {1580177441875156, 2506058297611016, 2934789696579346, 1061310370544480, 596660656376680}, + {1957905575869340, 963138800079095, 1346185076450932, 33814819376238, 1624717058267694}, + }, + { + {2861980301667765, 3354887551296141, 3948074513800240, 4019265998902801, 4754514631586968}, + {1661216359883315, 1198665005326425, 3475476495296842, 881743418686047, 635325796191538}, + {1196599610725063, 2100294611545468, 412113633351820, 925880965367657, 519930913383517}, + }, + { + {5571468672275863, 5188072583684019, 4251873319339365, 2576514881889354, 4045293404267572}, + {2133507738629437, 1327217318093765, 1889369311142453, 2479101608310052, 4045149986308216}, + {703846410484025, 1348842341032186, 1685275777321460, 1615795108904065, 1475415532006380}, + }, + { + {5398949984609248, 3762655856514160, 2412712349948059, 5169973908847336, 4334869322214508}, + {2999632416625302, 3110726069588902, 2228895586394623, 2800522251491198, 2224895404394358}, + {1399061587160944, 1205421803029276, 519683572464804, 340023786200115, 2172700699519595}, + }, + { + {3574689489677767, 5335925023065998, 5369256661040087, 3129592424352108, 5388737531811449}, + {2700892402458353, 2743476698281872, 1953844576554527, 1836651043988628, 2962536972306493}, + {1357694877428531, 1765161852606993, 1167042823088862, 1400958578522448, 1847208195529391}, + }, + { + {3867728253589687, 3773111053869328, 4368860594965835, 6133882052967679, 2533060702765705}, + {2290736769578191, 3757556884488538, 782075793204873, 1953945334364505, 2306213589322841}, + {1820300206186415, 335405661683482, 1092574996911739, 2062461927997493, 39506950020151}, + }, + { + {5534612992751919, 3746157517504511, 4108089392798474, 5131771932089590, 5617809945843001}, + {1342645331878441, 2000053418116353, 2168383944146424, 681027567941522, 1213562615764099}, + {379321638440622, 996302411355145, 1880571763884906, 1004856333759537, 501836588196832}, + }, + { + {4231662813561705, 4640318983129989, 3064518357303150, 5343343094006261, 6450142130522077}, + {1145892199839501, 1078673486712789, 3022417549910920, 1612895247211701, 2324179764588241}, + {1972676776834949, 44492199500322, 1456097929669866, 211262343295697, 1045510624803264}, + }, + { + {5968931973016112, 6019428128447854, 5757013441564652, 4431402751536781, 3192943415309330}, + {1480229165025206, 2054505377286776, 3099784048655970, 3055900157449953, 1375885673210420}, + {1812738520892942, 2084676765238369, 510773948276259, 934572202757904, 537600238103234}, + }, + }, + { + { + {3613080834135665, 5774088788979550, 4480966629462376, 4981692702949983, 5531898286124606}, + {1941100238292769, 1530763972357988, 2941717574786124, 517834246099701, 3268301290369396}, + {402477551873128, 1206353712079331, 1931900782149571, 353151698548753, 227661813611943}, + }, + { + {5770945118915754, 5544555209532203, 5448202195803091, 2841016429831070, 4428081881985983}, + {3042160696267866, 1193039775906917, 2708874250955853, 1880772252763310, 1647664574467171}, + {1801318854301087, 529217444026518, 41439150499132, 1819497139150034, 1914318279506430}, + }, + { + {4617843866085510, 3963473780045850, 4530695843220841, 5152831422757274, 6255165884461126}, + {3653392334037390, 2119290268348412, 1662789932544495, 3712853444146946, 1761023449047586}, + {1892648843913435, 1079776332626104, 1111039290977790, 1827479485396386, 859677304170245}, + }, + { + {6135115193251795, 4578420287793605, 3485955900327480, 5405600312155654, 4983545824887909}, + {1955745180210457, 1703319703537271, 2019166049085294, 3363246542620192, 3873119138750761}, + {1700391063795585, 361747633083750, 1216968456947850, 1993842710713264, 601267006969711}, + }, + { + {4925286822096059, 5955810075280268, 4224518592023607, 4497079033823924, 4700697585549198}, + {1335348453199749, 2692696552964594, 3243268312448681, 1958567111536422, 1194502970771976}, + {1656217138482787, 491628805607466, 1679451179466805, 970181505842258, 1534105889461948}, + }, + { + {4204969625278834, 2839735694548476, 5311815348914771, 3424730456556302, 5437312551033891}, + {1051919605857270, 2689758516764280, 3195630903391853, 2321619474659180, 1445811115388039}, + {1160289603260459, 1956223108351205, 1733312353955470, 208731931777063, 2163609865075088}, + }, + { + {6171922307530267, 3416689909413961, 4398780048782414, 3348704297294309, 4794281577167533}, + {2605760676899691, 2518935989171471, 1655039766011588, 2352706753121153, 1606429966007503}, + {1142834714776341, 85770505106288, 713866520631433, 440023537352050, 178697006218663}, + }, + { + {5369775152479351, 2976619105904851, 4320166487861154, 4349283416973378, 5052617030572584}, + {1815823837273367, 2562753791013569, 1539789395052836, 3647749880076906, 1631063017998020}, + {534961844628464, 1393583055120721, 1748351260324708, 1375538226727024, 2193309623120304}, + }, + { + {4362511965756519, 3334861441534551, 3560279110881819, 4504033277345817, 3695270180099552}, + {872424258749169, 3269419467389617, 2236476348626173, 2024356220545311, 2898783963621386}, + {1239822839121281, 1734625037061034, 1644113104753887, 838912630061655, 2165081997489666}, + }, + { + {4719668160615989, 4954232553381592, 3407504093515639, 6056696583065019, 4080126483053229}, + {2648578609770085, 3690844259333424, 2082598280716609, 2564691042641275, 1346520144951773}, + {1979149515238517, 717801405945362, 2104011649567412, 1561125545440573, 2157118688047562}, + }, + { + {4177174713439601, 5431484182531219, 4912403072956818, 3423215719262779, 6067629588380508}, + {1808742790957793, 2747803311617739, 3845306078978452, 1924084822718509, 2264852519642740}, + {1767189866398838, 835676264200014, 201596448765126, 1979907908451931, 1442810524651041}, + }, + { + {4409296057792696, 4346067875211154, 3459237364299404, 4853798679576266, 4468808308660588}, + {128841748532646, 4150186054273698, 3256924437045680, 4019614742906956, 337338633748078}, + {1077226425497346, 607378044682866, 1485491791574172, 1074180848747199, 1023053128705595}, + }, + { + {5804603278915694, 2796027819585631, 5011026665884139, 5833743165576011, 5103566912764066}, + {2493359374165148, 2464080592904187, 1933101226851633, 1880342534882667, 2417917477223840}, + {1284426144747169, 2005093245564178, 229493920382094, 1642769566056222, 1596652614163344}, + }, + { + {4478501502615841, 5105996638711000, 4307245809257853, 2912192821294412, 4442483575340114}, + {3490678780709549, 2722972627744756, 4141726367382933, 2626667232874306, 3706338015195278}, + {978951056774557, 1610590016630807, 2160020521521822, 2222969528403014, 1290838415735858}, + }, + { + {4233395101645091, 4760048839668621, 3419853204404814, 3555462417010423, 4295491197124032}, + {3136023326660957, 3195581484142287, 2364500047372050, 978391045278571, 2088093684065312}, + {319754006496675, 2078141843592369, 1381704035073408, 2135424637477137, 1217419566529670}, + }, + }, + { + { + {5290773769928918, 4793813444262905, 4720763845546248, 4081316225438835, 4093406366409350}, + {2219813055094868, 3751054103166673, 764148091645988, 3042364539660805, 2174498914560536}, + {1346839273131020, 1947175237418499, 2130499171815608, 841760904333801, 793011313347544}, + }, + { + {3890099439122631, 5436725454634839, 3526358179473960, 4130205528836253, 4143183670329231}, + {2705685430041151, 1931337763813343, 1867986078235466, 963301853857219, 3203544659615889}, + {548016394257586, 1770170736821935, 883041007523403, 1244492123782548, 1874837894534970}, + }, + { + {6107029440448048, 3899130796270571, 5350832732145407, 5288086135111572, 5016688224136320}, + {2322745137203416, 3712079434453421, 1656136902347805, 1063047643279494, 2347290530652372}, + {1585044732618145, 79674660750176, 2047172033863331, 558016866726219, 1811700039750197}, + }, + { + {2903508896190354, 3572836747669154, 5671992452104047, 3145254132994495, 4870698970274559}, + {1980868732324310, 2459850087283418, 1500353534094477, 1977074025846907, 686785408890947}, + {1977199595236300, 927859862391871, 2045825765550850, 1189431662969386, 451125616133550}, + }, + { + {4264958907260919, 4637613300323186, 4723189721727247, 6439587034668993, 4270210266819895}, + {1981177153373343, 1776706813610008, 2956634306768875, 2113399644330229, 364175990188877}, + {1473984112024647, 2212143402178000, 1913009700964560, 489799262080055, 1390546130501803}, + }, + { + {4617432771154388, 2768922884406316, 3194759053322417, 3846588214005790, 4684848439540931}, + {3696338004009516, 2296500736839486, 1483385825107721, 732704435299560, 4093200809844903}, + {781495195344331, 819872919567170, 2058369589741763, 131552040816437, 1143952030551876}, + }, + { + {6045398880892501, 3274164683120730, 3537206235588588, 4953070760072151, 4494335279262109}, + {1632591054957791, 1584029964350608, 1679919371947982, 3412378076716233, 2572356071530817}, + {118276417181988, 2048136038162801, 1736078553924029, 677257986431580, 711847529279284}, + }, + { + {3634115225339518, 3407128374975375, 2997970212274081, 3493862836273928, 3535607408159120}, + {3574732327388664, 2600283522407089, 2877235052318169, 1647316986471086, 1495874784707614}, + {889518489432828, 1216748566987677, 2027061052060458, 268044074097160, 1539610510772867}, + }, + { + {4611501240201625, 4770963666624495, 4338415201879424, 4860883825935208, 4028006785359735}, + {259543849715615, 3116307281996357, 1555340861337048, 2140193697629416, 1035789313751911}, + {1026218773492650, 930245039288082, 1822875264087643, 479782375672284, 1931812455503119}, + }, + { + {4148807861057856, 5812728864755237, 4601316267327746, 6043565150382029, 4199151665681887}, + {3394871127325058, 3191785534223821, 2085795470524552, 2385926585602461, 399655200529949}, + {1057229833653287, 1828041669558530, 1006577782987596, 2162474092618005, 1568476132284973}, + }, + { + {5547684346917888, 4989218016843942, 4586613652979209, 4863124308009928, 6207570019680129}, + {2566237642336854, 3970491812994094, 2598212316441047, 2240782240471054, 2552742376593093}, + {716486226259134, 773421749453144, 1784612269854183, 1741938572500414, 1834164482186148}, + }, + { + {3117421109623856, 3461685839753353, 4955306417606165, 4558294861196235, 5602064404959934}, + {2273224772261066, 1223111129900149, 1584682650834635, 2022200125401455, 1373728084078920}, + {913182622593832, 2001872744868184, 882970207556847, 299806317329996, 1726046908726060}, + }, + { + {6249588231739606, 3368998262120903, 5239047789721372, 3406210943086424, 4754518606052966}, + {2248618336554706, 1339184282498129, 769038678141320, 3217160515726744, 1715873134108166}, + {1976228100247818, 1272400462149307, 1572190226615598, 852044049472028, 1055275428347366}, + }, + { + {5284373775928701, 3618431820022764, 4020557586503952, 4433032839002146, 4171326821228907}, + {2417108732168755, 2170003784635000, 3518440054867754, 3152772966589030, 704341378948759}, + {1290493724571150, 2122276831263561, 1747969631590180, 1399718798480988, 139803941068636}, + }, + { + {4427994415528072, 5149611644022833, 5193849655888518, 3398788549762908, 6113634201730634}, + {216319500947386, 1455486684654953, 828483179169328, 2183296040357724, 2625210482982860}, + {478303205586551, 304131100485205, 248369703081454, 371320991720787, 1635813582756365}, + }, + }, + { + { + {5252346966668309, 5639208782676701, 4075417215389880, 4364690112290244, 3384680235809138}, + {2429491642409009, 1283094434250487, 3316839113847160, 4229629869361324, 2675780619596520}, + {2176454779743876, 931093459142961, 2244697379845986, 723779257225747, 962795008037376}, + }, + { + {4164637625281563, 5566305816206016, 4655415916130208, 4180775155367792, 5707768410211632}, + {1861517597691605, 1772481620932890, 2629476438960640, 2705827759458320, 2107910124630170}, + {683279446283480, 2167544438614321, 1975855992985379, 780955320484514, 780910621778643}, + }, + { + {3955544259328322, 4458238333874171, 5864190420414532, 4345033257929994, 2857162289792042}, + {2686358254975148, 4179751356732233, 2499687248272490, 1241163995738960, 2778131269016956}, + {1074884828909420, 432905047961772, 1185537826254838, 52144045776742, 1826277929133963}, + }, + { + {5684453359674447, 4877177488298427, 2422407833284604, 4605478777171110, 4729984701613103}, + {2156715047802967, 1276772803921323, 2380233522537438, 1960794365816568, 2680384519257273}, + {1862177374063425, 1873700738552432, 308885709393483, 2100622082080360, 1104535253282502}, + }, + { + {3931149063775879, 4254429699498962, 6662929352488607, 4079587572542558, 4855364761755442}, + {3711640686247983, 421582154826228, 2220646689506683, 1208894292386914, 2152820272048462}, + {1565335522994081, 54406341126738, 599331788389250, 1486039135212823, 940991227185565}, + }, + { + {4398457498029638, 4929754658751446, 3952574300737926, 4493043596943885, 5305461811863411}, + {3849064215739384, 4001520908708098, 3463231867051918, 3642198741522237, 1030072339730421}, + {225800753248600, 1001289196776939, 1570695157447337, 474142387326152, 1860241406570283}, + }, + { + {4817367953033495, 5599987240264127, 4736311445242884, 5430531336232182, 4460173530026570}, + {1052973111938531, 2823516883980375, 662638871434014, 2738994056625648, 563864123356550}, + {823857549390635, 2207592640971793, 1855512257490888, 1911413747439725, 1853809846918105}, + }, + { + {6194718989753531, 3626032976625365, 3751630707315810, 4477700840286220, 5452904257109698}, + {2036109024667887, 3040585821349743, 2780985384011476, 1970818175728284, 2968438634461420}, + {695616701038646, 20368455765111, 619664083096696, 723635083382804, 1023760209767255}, + }, + { + {5008707213573776, 2859949901187285, 4290065003741713, 5151870738966180, 3127611889915462}, + {574462324973718, 2125329428751385, 570545018291281, 1476031513731508, 2680835412613570}, + {1517596182333361, 1429983941782802, 1900615890395770, 1911469027059364, 1851356681596334}, + }, + { + {4891662727757105, 6078189791872620, 4341252688115798, 4009612276132060, 4158882628774497}, + {2178830616846417, 2794898270987790, 2339865206643716, 2923242275980220, 1745466521002355}, + {841969861771844, 1234567333486718, 2104638753106763, 1445233761721300, 2209267998342752}, + }, + { + {6440345201923204, 5723637287574387, 5903930483115066, 5778502423080164, 5079904071191760}, + {2035275243828198, 2745418930619871, 2632830605513978, 2519743098631716, 707209224772602}, + {2049800384050253, 382336843047910, 1465264697408643, 242728978654073, 1821420259893325}, + }, + { + {3385848358825911, 2850931104925851, 3458310588278305, 4579597908985563, 4607881337942919}, + {1816700573507985, 2213627388818419, 2637198541463171, 3087473887817081, 2837589033715179}, + {1073720617318924, 1636814037227948, 1227321319951543, 598345156599653, 544027576937438}, + }, + { + {3741365114761762, 3465142572701024, 4346453033629668, 3800732328304411, 5207004929940855}, + {3530134215235346, 1497788707695478, 3538247705814828, 1425334926184197, 3292646832985731}, + {368165631658486, 1427424960871770, 667823977725231, 123986789130850, 789476314816796}, + }, + { + {5183377371949700, 4172584964939172, 4687335701106073, 2534986101578472, 4297053492878574}, + {2375597255557748, 846038920993436, 1398943082722053, 2179038637021886, 325133433602556}, + {1814357252172511, 1812991482130874, 1545461112716185, 2228739665628687, 1030416912136148}, + }, + { + {4102150726478441, 5089888860858732, 3167069131929673, 3336166645247640, 4708635432875520}, + {1325239906989203, 2989936170895398, 2414201768248283, 1851733918704382, 3428546124237928}, + {296568059020374, 1937661788490502, 1994712548479216, 1341415580517821, 919259617560208}, + }, + }, + { + { + {6274182990169406, 4386048988056353, 4097025350643424, 5127499815238002, 5572164902186574}, + {1895408474337392, 1335954976788533, 3236941534902540, 2378721630147940, 1461766309882914}, + {1291953286798969, 2102679466898679, 1596002078575263, 1387588817990761, 2143444637427225}, + }, + { + {5996694561997207, 5683227612437284, 4899213524992592, 4856689735436656, 6404791836913969}, + {2772496102790967, 2917238652453944, 1731727230740742, 2247887220248582, 2143609474706149}, + {923819152192005, 1415712944791087, 1125410698033067, 788009900900011, 869993295869018}, + }, + { + {4786795669239288, 3398808358640920, 4513626939909643, 5985598090247291, 2945790096837940}, + {2456756643078196, 3060894189290238, 3759434421535873, 2442805763764489, 2819028797217160}, + {1757819380032415, 1458259160758992, 404747119062789, 1242483165113555, 1521264843142355}, + }, + { + {4457446227801342, 6427880138295914, 6656730008666805, 3937171933580687, 5754864538579708}, + {1177246463904108, 2488433613267172, 2328478208484747, 3802230570654315, 2344609059443716}, + {1519155588261854, 483899768651806, 1235345257217886, 467640517750393, 1224438957323827}, + }, + { + {5102603430061893, 3128470923287158, 5801341356388264, 4525678559978591, 4718363529583899}, + {1246208485680505, 2848653521425806, 2416405253631000, 3077610602170527, 831805919056409}, + {2045656886162419, 2245569838876242, 1361334406977685, 1370170063372453, 1784586163491838}, + }, + { + {4556063502635342, 5531207665521536, 4057497943029825, 4507014901377590, 3148382369498868}, + {737891874041388, 2451689755512888, 2972729929575783, 1153163677723624, 2631153364835664}, + {1021578499394252, 2003506226907156, 1906928204664703, 617432881327189, 487770381544088}, + }, + { + {2772215428108171, 4464024296635705, 4854458470465137, 4051326172605262, 4041843916653002}, + {1808240492311657, 683215352347115, 2786075502512133, 2784661866757750, 3917451132840122}, + {956648481954026, 2096247164218896, 1027480742584033, 928233599700570, 2122240338574709}, + }, + { + {4629946233006760, 5291553581528148, 3270843847622640, 6572477208034336, 6154625523788459}, + {629205712253428, 2948018954745502, 2240941577462354, 2419373201820060, 2682153541398885}, + {948811544154236, 95827271348811, 971972540788513, 1752656910961976, 1577613288465037}, + }, + { + {5687495579915904, 5920739705585144, 3623686905482864, 4279799360588693, 4937051703985742}, + {2733819029729102, 2941383700719094, 2344126789319304, 272099344396033, 3469931440006564}, + {1155109808876838, 498663775049656, 2009409241380161, 1654861553852237, 2195711930770443}, + }, + { + {4562514450276878, 3610360397280214, 3754786033717112, 6274151337271952, 4102082344471456}, + {3779237395015718, 2531855739502292, 1076300728317328, 2341702386635930, 2037036009072308}, + {357187236460800, 1343207422743391, 1557831743447331, 138875622916216, 2073308474766668}, + }, + { + {4318248447888802, 5457191060945059, 3575720381879889, 5537122891348075, 4658291618481620}, + {1058927027601226, 2097000197595935, 3018484019405255, 1294660112618737, 2932877913314978}, + {216145844764492, 1876995804123388, 1188737931982599, 1588244200049402, 1850009625550870}, + }, + { + {3352537291082093, 5839102984451201, 2319458858510810, 5312519694669356, 2539572161961088}, + {1971880260906249, 2590822963635857, 2283171542295386, 888730652847270, 2069077006720618}, + {986114249350619, 899447833294837, 753796294360457, 1686315816498457, 1484432111173806}, + }, + { + {5781412563046772, 2829048727661187, 4098529237644982, 5146692071916491, 4319033371720950}, + {2231959129524362, 2353147866489543, 1361542642038984, 3436571318049649, 613122764422636}, + {1553151906564201, 42706246613546, 1656634422023210, 337580524133816, 1382068281260380}, + }, + { + {4318188098974879, 4190975253205867, 5053353859489555, 3624409471895100, 5734877817656224}, + {339244995001665, 1760160432424305, 2510143032086917, 900873257630652, 1381243383153778}, + {1027887039599863, 645983151773049, 940633405940384, 791297293294468, 113951612418342}, + }, + { + {4421127861301280, 3227473132618256, 3897823766346675, 4531675054348192, 2597262173415879}, + {497984229256388, 1528193624284798, 3083402776323261, 2834076054300848, 2004534517066737}, + {707308783184531, 1723910086807466, 791458836921758, 441590831592448, 1945299136569002}, + }, + }, + { + { + {5139590791061503, 5074296034161507, 3861111523264964, 4286794753368429, 4613589462411916}, + {1370912655100557, 2279879075953359, 1535348789227130, 2242808749632369, 3061442465980918}, + {2128769772677977, 2142654242576520, 2016094652496998, 2132031230853467, 725434888027655}, + }, + { + {4677803618766960, 5273930469290190, 4617970826042730, 4133081282480847, 4583310983505940}, + {2135073895739904, 3472442449797848, 1493509767807810, 3843639135014989, 1420071562059334}, + {1420603492551010, 679640550295814, 1617533903828801, 780154362635607, 1319780020899258}, + }, + { + {3937068127551315, 5594824685351819, 4538337787238312, 3523378410763828, 5437114214061846}, + {3695575212053185, 2594449599707103, 2742930959436192, 1161286236132678, 2345020968733648}, + {194815921686333, 1256736762545940, 1408742447743650, 304562218341097, 2021464306176092}, + }, + { + {3212222966285493, 3266851872779616, 4336733687401440, 4794872810759007, 4424169619295461}, + {2759763070229743, 2724175318859802, 3031057691838938, 3431189823632909, 2961517144339711}, + {440075250919582, 694825884103652, 2159700403414911, 116894270435230, 1425927073727904}, + }, + { + {4841955313295828, 3461757100553382, 4305435906781420, 3691116875116057, 5298851817605162}, + {1064910415642974, 3095607189587094, 3908971853500052, 2189460887246833, 1354043476687700}, + {1262675707031055, 1219816744922490, 519257628155087, 1497570437960201, 1372594887264798}, + }, + { + {5466094472208141, 5012579346250577, 4661027376097750, 4434802656317810, 3968075278352583}, + {3315525263287981, 943900907578117, 1225723797770692, 4182671057889152, 2697481958411475}, + {1933555860608921, 1275569655188916, 234812135397482, 96042287368239, 386392083574324}, + }, + { + {3319477981428303, 4681888525996228, 6591617607940267, 2604452186053658, 2972488992219816}, + {2831773176554005, 3864996001314642, 2395563170308483, 2090271503443448, 1893990359510416}, + {1681588555670186, 980191207008201, 2154581399538671, 540872424183046, 1943954489289499}, + }, + { + {5977124761029192, 4538331973533215, 5533519881915667, 3479901172100047, 4656405250637608}, + {2363082790805374, 4242757803000485, 2669759818118169, 3333816374844969, 1325118659202748}, + {183359648873960, 382111728086623, 1969766109298473, 2071169946252387, 242935538497060}, + }, + { + {5188738692165469, 2664732629276594, 4968279324223179, 4960443399326301, 4436427572176893}, + {3490990196257229, 2560345203268680, 794851537166791, 1532423795715657, 621302931359813}, + {440189527159075, 2095498912423497, 1575373142262611, 744594360742511, 1157079567398109}, + }, + { + {4869958177792820, 3889970905101269, 4570550615789326, 4496205440964732, 3848931098885666}, + {3870071548603662, 3041096274835181, 2350925463456272, 1091637746528482, 1355815234248438}, + {927792763323382, 1304575354366273, 612939300770904, 1630367810979451, 174107168815644}, + }, + { + {6136927367908702, 5203222247970547, 4888252310796559, 4897189790028520, 4586519387439588}, + {2831448685067634, 1668205588574421, 3161976938852725, 1027424964992432, 2026369259616642}, + {1735694076750726, 1266349638286480, 1493849675863588, 296961022463490, 1483126610434799}, + }, + { + {4654087895073878, 3931119431920957, 3810992402627745, 4571904269427127, 4481981159091504}, + {2466558329032204, 2314404658847041, 2524639581935109, 805442192808499, 1270294344302086}, + {750996510156456, 401855193068398, 58073276915611, 87767580153872, 241880537805683}, + }, + { + {6336062814229381, 5495468976405173, 3085611334327622, 3929566749867368, 4056705138744772}, + {2170745323194467, 1059898966987983, 1821678094574528, 3224522071822304, 3177794562815748}, + {697769608468752, 1369430004061620, 1388586673198089, 909114275708814, 1146450457999407}, + }, + { + {4238043779316857, 3868604149115822, 3602737573195351, 4491948926777684, 2593111277688382}, + {1942420724187743, 1230266918978492, 2950156777850293, 1491177343837674, 2151732388834046}, + {1552628609460396, 385059438618066, 1935679554618991, 1586643703562239, 274738755241324}, + }, + { + {3708634080771636, 3376471647619972, 4144079859874091, 5260099970974267, 5044960426451952}, + {1260464362728368, 2320200151112594, 3280988120127265, 1454370155862373, 3222503455600234}, + {1286187906300863, 286639393218233, 960541512944676, 756511343610150, 732619979206969}, + }, + }, + { + { + {5720776037989329, 3408557855252881, 2836745411300455, 4905300285896935, 2440518813003965}, + {2216608521812979, 1133671267609171, 1886801270451833, 693723450681229, 2177664326279079}, + {2233307833752057, 720411965215730, 1519169695491573, 1249545629073374, 42274079495163}, + }, + { + {5289248568149457, 3817875509053716, 4457685664702894, 4876101051290378, 4294494794724040}, + {3280020244834293, 1318628129209810, 3119398368735896, 391516159010622, 618793687544686}, + {354305362086679, 1512134460741612, 359672307646707, 182487842123724, 70434142068276}, + }, + { + {3945557653570869, 3088092003227000, 5454351386185562, 3234451172420338, 4724702104276340}, + {3276624651778803, 2433844765263326, 2790865929084436, 1963658167580138, 3140414260467690}, + {46706548238824, 1986500518838735, 2027136585204085, 1143580830274421, 237034819567290}, + }, + { + {3929429576586958, 2793383744028645, 5887317021163886, 3203394573309402, 4670385004087593}, + {3462257554153900, 2215903401275259, 1545855048122212, 1560256833448838, 235678314205821}, + {1032532177573683, 1507169914894481, 893954872249259, 1464210961075811, 2248024514969267}, + }, + { + {2517873563818259, 5567259846017152, 4253295986752699, 5558170137710973, 4039120007239859}, + {2215196432839229, 1453988298479780, 3162959582154309, 1417180860727485, 1916001465630095}, + {1593076635649167, 613414152324278, 1398118686752976, 1550186634066418, 2024312475795755}, + }, + { + {4524027900175525, 4847878416694692, 3091409665235077, 4862578993236379, 5350599804185218}, + {1611115816843085, 1564686497935112, 2631443498765253, 2543391790063645, 1070282314438176}, + {1370619542022553, 13593976629245, 670888839522668, 29909561835083, 1113994299778657}, + }, + { + {2995680265327027, 5241715165954044, 3953258701883675, 3989602332635833, 3953848187775337}, + {2462467670415027, 3084380814586442, 979195344857407, 761623507948939, 2354116769190033}, + {1653806661942935, 798938977173667, 1204504651898865, 2012775328403335, 959133953735021}, + }, + { + {4988340255562522, 6250762111649497, 4210027774413747, 4281026073914171, 4124289570254779}, + {3308091097868222, 2438171792492677, 666572176305849, 2221533064225315, 1302577527793701}, + {2246982488380161, 704048527252770, 449031029656446, 2000971659049725, 1830758195793359}, + }, + { + {3190675561821798, 6722820056714491, 5018399111078811, 5991624407670525, 4249280343842061}, + {3052270247598664, 2252472217742059, 2434081171992329, 2672797197928279, 2602890651310523}, + {2144671346446832, 542864631780587, 1155108742000404, 1404732713614448, 240293866423412}, + }, + { + {5121381423145567, 4833873167604293, 4028173334112257, 5524034306881884, 6230562353876706}, + {1307308592059221, 784383479594685, 1720750519626457, 1912081034355222, 2024784929774716}, + {22174994285057, 375276401373336, 1210941030392323, 1903374444438123, 1011323371888298}, + }, + { + {4798470629258750, 3939993567755513, 3967862752630070, 3290332526819821, 3061464921693387}, + {2998794565294986, 2057935584763381, 2899577223808862, 1519188817940759, 1842063844888831}, + {892208073348264, 1880270486117637, 1866139692669281, 577642276098528, 159304923876906}, + }, + { + {4601033632870689, 5799253896657058, 5779104046600604, 4218473381777077, 5066296163965867}, + {3118817410699903, 1416293682313136, 1358642285736990, 4016697695252823, 3785048363131621}, + {841452637470330, 509851329084465, 315943768852800, 745051417948746, 1317978823624451}, + }, + { + {2960724265045759, 3581409910547792, 4757575913235420, 6009932939538924, 4725476498610383}, + {2216474880678649, 1883045416719140, 3557095587267860, 2414252121862082, 3019618269128831}, + {1790146986408439, 1266311794146205, 923857310756466, 2043374401317120, 726369229085659}, + }, + { + {4878312571596775, 4222794967531206, 3321677379160160, 3406594510676891, 4743132105473153}, + {1047639500605479, 3268483579465284, 2206428670313250, 1688287562131353, 1668007864663417}, + {1777656298881359, 367886496899263, 1134571758927624, 161297709883194, 864111924164392}, + }, + { + {4770637647109604, 5356580318440110, 6456410085143486, 5251963198009528, 4612863117603799}, + {3459496839496426, 1172866796116672, 2087657719164010, 3611579473502448, 2226199443508323}, + {179962092093812, 1434865358203901, 1509301171184812, 465007053005824, 1606826267425619}, + }, + }, + { + { + {4321570421086801, 5728967329483361, 3790752945733902, 4440201295898093, 4632192800649486}, + {477207916553285, 1488064260202941, 1661453866463954, 1141228074051855, 672072650786576}, + {916404312971536, 1000014350915647, 1498754584389763, 67530592482209, 1667646385756724}, + }, + { + {3838511633005352, 3067059108181153, 5859654687359949, 4517853996250692, 5491933645129578}, + {810369747020164, 2237618141036509, 2282241440976077, 396142955464532, 2314156456627292}, + {498205650210982, 2029447832739442, 1287708517665602, 2063154761502015, 592549403529808}, + }, + { + {4850172605519114, 4864656344540316, 4532814144934823, 3437824613452670, 4812474608554159}, + {1466752538541840, 2035538193320560, 138132610685025, 1256421706559322, 2431850955679681}, + {1297525937307453, 1360474818962172, 1057976529132470, 481516036122456, 1284896343639676}, + }, + { + {5776741280656995, 5103737594811281, 3360081478971068, 6111393754727746, 4779680024426854}, + {2645933668955707, 3274005597891379, 2656619141981518, 1746214054851430, 3053032647501696}, + {1625278703177771, 652272403287866, 1130860155562117, 1467718191751280, 170296377586353}, + }, + { + {5094219073783849, 5735075135248235, 5606322495206271, 3754059419692243, 4180105537366398}, + {1002349488419261, 3232903243006485, 1398184721429427, 3601262477434907, 4062926820203090}, + {1577778325058339, 2215369962281551, 1331723269758849, 1939632256423674, 52886968354553}, + }, + { + {4933187999581607, 5092493367263378, 3356435735616918, 5217407324510779, 5497406740649621}, + {2729077630033003, 1888615867921888, 2296393402013134, 839924021249031, 1005736290727363}, + {1035587952296453, 772571610990610, 1703146381743864, 447715678256778, 1714287687955168}, + }, + { + {3002761637349276, 4331640081948673, 3834120280377754, 5089609293083651, 3261373019366335}, + {2386307482062396, 240967146617557, 971317535064000, 2019271157069067, 1502539203059821}, + {1328811798417377, 1232170334974369, 1723370191641238, 2166559558468187, 1898556240276951}, + }, + { + {3941047590826269, 4239692035015583, 4490403838767533, 6564872456977192, 4670461766802655}, + {1386180360119611, 3273074614881159, 1729880193705623, 2228606406348098, 1592392117444361}, + {419731549689034, 1989626747750813, 1591278351630992, 1092786235861584, 177178675215960}, + }, + { + {3436683241673758, 3662206674778039, 4373967447323555, 4097363846812803, 4031597646782708}, + {2639672814451512, 3326947991249179, 1680625793199947, 2034248047548953, 721741001003862}, + {1591050698007192, 1091674239474205, 394086386458446, 652864259466208, 252826649880832}, + }, + { + {6202959881484310, 3301137131128391, 3338332791366416, 4386834101046813, 4586134902683138}, + {1761951583445986, 1682354370625515, 1311814077921538, 2232552485157187, 352715570060390}, + {1983847550347734, 1877133028995354, 991701922936357, 942306684083689, 199141297262892}, + }, + { + {4356558984118475, 5693420396107718, 2518386381195401, 4410955637518553, 6067546162903212}, + {748677842691767, 2802469894128656, 2167458034960803, 3580904381157207, 1663021749531972}, + {672345752527423, 987721649439917, 75559353638139, 1202381658061142, 2218885179346238}, + }, + { + {4510531718276206, 5025970311617705, 4298550255570023, 4702464919238073, 3154067300975759}, + {874026063340854, 581394977884979, 2805876061084699, 3945101577343195, 1873084195329207}, + {262642087469467, 394043452244726, 1877384193205089, 135064540003798, 932774458922892}, + }, + { + {3677176615657209, 5004677940509387, 5802006239792640, 4988806137854665, 3142553109499622}, + {2906530412387425, 538942497799423, 3006485045211118, 2701192894331127, 1774793046411044}, + {2163097510860120, 1657639324428092, 324536800194710, 2127826550215010, 1492179302504548}, + }, + { + {4271383757866077, 5161359851331481, 4409665194889791, 3535427764785290, 4743868535366280}, + {2870306695118697, 854883599481521, 1175220622088095, 2190379234235038, 2693308800279672}, + {1469265779048270, 1543845332050728, 2202017995300452, 1928013995331013, 1762032763505452}, + }, + { + {4636656908840010, 5500309513430418, 4897834655713547, 3941193903783821, 4553608952670061}, + {4333916659134460, 1850388591545996, 3627944035206357, 918659547384777, 3374247281351833}, + {2000039510485295, 1183834045401091, 1338556774925931, 1549179790309018, 394428288927656}, + }, + }, + { + { + {3733446780128548, 4970314905751830, 6278139198254466, 4792154002496454, 5723581693713173}, + {1185838263017942, 1658025814770644, 2664414501602854, 2015508295646822, 2967017530049915}, + {1569664128884381, 407663338845983, 2002256010544711, 671085899312035, 984282527793076}, + }, + { + {6341328981945826, 6310526850187699, 3023871274454732, 5578860681574207, 4775900505114104}, + {2574316560560394, 2331223963461233, 2542672004494602, 3174853647927431, 3104624426621216}, + {946711433665760, 2239987349934557, 803861660898522, 2156551410386926, 1502787654920122}, + }, + { + {5437578969471140, 5951179206758851, 5248530961634439, 6426502251854756, 4209704034918088}, + {1002763931894790, 2216555692070697, 3344391891538061, 2095372815347836, 831620519830306}, + {2050669866355306, 2190774465449013, 2058969733807763, 270320273862327, 1870514939355617}, + }, + { + {5155857617776227, 4397988213497465, 3243709928117524, 5944645730694783, 4773063750957235}, + {1975814150439887, 3149875793027583, 1261444197722906, 2760429640974761, 1552966352555279}, + {1633514016507671, 758793436105214, 1666766843388618, 1223902548045585, 233185566290059}, + }, + { + {6335824036525539, 5936753389140468, 4473577463180534, 4906816011267918, 4087654058111774}, + {2368975804221909, 2457041955704880, 3876216785098924, 563819279426048, 3675362390258876}, + {2039348563488973, 248927546652694, 729506739622176, 397171022735714, 1644628056647629}, + }, + { + {5425812761915260, 3810529789490661, 5049333453822998, 4123755530302819, 5615639585264776}, + {2534643198043490, 3071062759450233, 3687767943508924, 594097030236781, 2123224284522922}, + {1869384197190792, 1569592234203114, 2196362163965849, 1717386471659459, 39685498183014}, + }, + { + {4635535175474129, 4605530976221652, 3458801108619450, 4871255059096226, 3508659268324931}, + {1421109370612225, 2276342051030278, 1620731107586926, 2516053916114754, 1357365806509465}, + {985026127753438, 120648499984234, 3776067837201, 1121956503069595, 1317952564469757}, + }, + { + {4522971017836409, 4687828520937668, 5703673191623277, 2940799383081666, 2787006346014769}, + {339460334667999, 3256039500082500, 1203428024902643, 1634973881827916, 2329743371713673}, + {1781496335107774, 734939096367772, 1979958937781877, 860043149833798, 2198713547814584}, + }, + { + {4721820132212972, 5501981664895244, 5264058468541187, 3740873078980979, 5716647821232484}, + {4072332661836284, 1169250173411574, 2007338871529421, 2541018716077961, 3008200101154560}, + {1725071616252177, 449990873352396, 128827658985361, 673241280853224, 751856515144447}, + }, + { + {3453037913720095, 3978754968490530, 3848210473954340, 4246376002566406, 5322220851863886}, + {2584349971388389, 535927716206948, 1961578137923504, 2896060138321356, 2010651373680674}, + {1156080784099315, 481555143811545, 967562545637573, 1677675896966263, 907265960192535}, + }, + { + {4332897500521172, 5216833051048471, 3346087018588415, 4384949392542339, 3375716091409272}, + {3883496497463828, 2136509343818925, 2434189290622529, 429179343434029, 2077816145810058}, + {1658461349569569, 1605536581882396, 1366404149694713, 1196969327840593, 1143971682907018}, + }, + { + {5400721311066691, 4902133966014442, 5147618958116264, 4262202967114947, 5920636443351740}, + {3544460334984043, 1818177095892812, 1745908205006280, 4216608321683323, 1892854460405668}, + {665225119661694, 619309150141627, 1122802004923883, 2010090924812740, 381608939276442}, + }, + { + {3196661699712892, 3684791960878407, 5290400087132528, 4583612441617304, 4269495094598113}, + {1614570977912342, 1623735166790269, 2524803999133080, 2496475358487958, 1935280705616725}, + {1092465046248360, 2063398303783148, 1002343547076250, 391684155494682, 1710560533943348}, + }, + { + {4070608883224340, 3070202986942604, 4904606928783937, 3666937738681094, 5479190180948687}, + {535566969681230, 1737993760203276, 701172348317595, 1733855888978568, 2134615712849277}, + {606893040022944, 2129386574985473, 1699765919891957, 528478848080626, 79217852843510}, + }, + { + {2896556608610982, 6055695907875122, 3732440132349395, 5309166170174244, 2721831575240156}, + {2885737548308128, 2508747900193688, 3606366888469287, 2465312058009042, 1828731582217566}, + {1349811289350391, 1890659682051631, 851360755267261, 2227128394068535, 1024384097528052}, + }, + }, + { + { + {4787547620178774, 3158654330243465, 4256768153665325, 5186246574371168, 4755687815664005}, + {997854281022512, 2623211910140591, 385221936050651, 1659016544729114, 609442868038809}, + {1619428378651736, 1579845830028655, 3625310117685, 170605089295866, 1149673757755609}, + }, + { + {3771360214195724, 3008816652878868, 5465610693671022, 3583291267492728, 4869891036079898}, + {1431189333362726, 2522236815322768, 1841157954619916, 2384464325206820, 2357706544622962}, + {437646608465794, 2094793895484999, 1468162389698058, 248477625893392, 1999708435919408}, + }, + { + {3334695520371433, 3812203917821368, 4517495595943886, 3819008971940261, 3192333158392848}, + {2403562525071701, 3731091650393632, 28706304084430, 2945476990326655, 1695373042660190}, + {11430723322929, 1391830113841252, 1337273140327877, 418617211527096, 2156223821909844}, + }, + { + {3474862062180912, 3882457043015231, 4997421855422554, 3623087331366693, 3980925476191710}, + {2057796043232644, 2263408613360807, 3848582899143280, 1729533403820747, 3162991736601526}, + {43999776827657, 989331901442862, 147120313740048, 495021300047603, 2007031690017476}, + }, + { + {4569310600539567, 3932567990833912, 3385323568255113, 4454797311017655, 5850805500278008}, + {166834800897807, 3648978260893606, 1512008134852981, 3519745367019255, 2891621521405984}, + {1308871835809784, 2116706717414875, 56029465436904, 467188187972025, 1826981082270550}, + }, + { + {4470097619807732, 4636615835029003, 5384758368025606, 3313145881106330, 4330528852662105}, + {1956939819397260, 3815569263781231, 1153022458216286, 2428547349977954, 223633771534995}, + {277297371046776, 1016671322777094, 1912173712739697, 1941234701885292, 1286651577841525}, + }, + { + {5516226444917799, 3864412772019280, 3317545876897683, 3844965839466476, 3985391436490214}, + {2680601238774939, 761018381922150, 3233893633186507, 710728397015564, 1856525231801054}, + {634704084825404, 2129536576841980, 1242863233687290, 1573321106629022, 128474589505663}, + }, + { + {4461600283819019, 5688762331492453, 3571771069068464, 3623234953171514, 5735065250408243}, + {129496500081781, 1790297098324227, 1302842166366374, 1122296729486616, 3168849968185895}, + {627678063257079, 716314893721428, 1223825394014331, 504272345435927, 1599415310067837}, + }, + { + {4497146074973338, 4258524581640411, 3327175345569250, 2988994176227077, 5267912111147682}, + {1802641032705090, 1392499306540523, 1496089620367494, 2312128812044035, 3539470476015736}, + {1352081061607517, 1142882484908029, 664622054563474, 278618602320570, 1557574337895879}, + }, + { + {6186532378029907, 2657902210141327, 3418543318248038, 4786173749208350, 3954647920849896}, + {2160964425547565, 2522131549551103, 2469825005211132, 304256310615628, 1406273379451890}, + {66232156124863, 1741674194899368, 1229742843930407, 260078220485178, 2065725536502563}, + }, + { + {4851046938453980, 3469458552849808, 4088972952218884, 2434262635154865, 5173422452060032}, + {2864583883600790, 1179256560411448, 605392730024768, 2131319985409857, 1797303368136290}, + {1658701641668087, 42705500105455, 1620862321227524, 1064411845535234, 1929505696020986}, + }, + { + {4163795150867629, 5312083389544253, 5442631052553893, 4817195733891862, 3463190319377281}, + {1759675286353623, 1663207329829539, 2312695704742071, 376287419379108, 3196993252356633}, + {1986557906737275, 810826505070108, 96017120328357, 1696299441261906, 1606104856145766}, + }, + { + {3549586047215341, 4636877962062236, 3055155796794642, 2987219577785020, 3528907845687172}, + {3376650841822935, 1032192126856158, 2069071282143034, 2845533170222998, 2607538492640606}, + {1660552858343061, 1231765925349274, 796446050473330, 1786065193241069, 1494189638115097}, + }, + { + {4395801598993052, 5237162742484602, 4130001086185514, 4318996219007855, 6361901289989183}, + {2175013070553356, 3320762044970614, 1143129099999600, 1532959129324381, 2553098860474181}, + {745372522040276, 1748456103797955, 2181743850112213, 796241938657904, 1942989014453742}, + }, + { + {4940563260328687, 3680309631021837, 5780417720128217, 4290252794057113, 4860748118629541}, + {1446945700457117, 3425847613673611, 1973622627786407, 1807324498582473, 848150045623407}, + {1097351026844646, 982517101132756, 149747537095472, 442788546176214, 1331800448358921}, + }, + }, + { + { + {3048999410076971, 3892379313272499, 4501182485180276, 6013415726786911, 3538900302869245}, + {1912748982362695, 3472588964406961, 2955977531735648, 2975418449611955, 1539793845278547}, + {2120957025321772, 1416788979770990, 1248163529640000, 1057479098339217, 1345904049070916}, + }, + { + {4595431001667912, 3778027149812221, 3607566563474045, 5108294493186449, 4683353521871733}, + {1020723204932740, 3177502390904871, 993238884888759, 1734688533140183, 2122148469059677}, + {1672839208916523, 1716495024680343, 1707076061183264, 765180466790910, 2017432747304428}, + }, + { + {4097011095397840, 4818396343707634, 3336533547899513, 4282281512848069, 4911825398741721}, + {2414052521429936, 1593372837632108, 2670905511225157, 3908207528779377, 2363908827003723}, + {192171151121229, 1275967732855104, 1864584199775891, 1693406950762857, 451756333138903}, + }, + { + {4727218507536765, 6731370918172898, 4514881522289443, 4346751476412392, 5345399511692591}, + {1612422054090625, 2236845889213344, 2363747608937251, 1594023725720586, 2961152477238633}, + {1485832258557624, 680071864680695, 1288498699771584, 258483455916573, 1782424270254224}, + }, + { + {4145911876469356, 3824464555215015, 4696287494265278, 5681915693477289, 3460241462730997}, + {2899290323536300, 2148582833270035, 4306072922611340, 2565743726502417, 1518458853723029}, + {1953522143805027, 882595907666496, 958109305864079, 1523427692628869, 1741273556819203}, + }, + { + {6076430972133454, 5015736489916628, 3553768171633221, 4610709058364067, 5082978176345714}, + {2177453523879316, 3719629127010202, 1578609310805205, 3246652757763105, 1948868370865272}, + {2160967413246114, 497546389595616, 235866284515227, 1209326819476215, 385381334474653}, + }, + { + {3922495052587829, 4494539022460083, 4247467603322628, 4394626550110741, 4540112411631648}, + {2794088217731505, 3925821314042297, 3967932263264306, 599992304591101, 3777014795396442}, + {2143663924692386, 1851559468934078, 1845266597269129, 477022990956902, 2179267609261901}, + }, + { + {2757964045702557, 3562399862100370, 5308617563064155, 3110477941637017, 5056214367828129}, + {1958983221377553, 2178877734404748, 1849996731612977, 1835657059247969, 2041180109654311}, + {724524272708234, 661221141789934, 1298795839460575, 1322772218421097, 837427426454482}, + }, + { + {4223608019735549, 5288655260236562, 4785575153888318, 4056483408937593, 3471372655277242}, + {2219315301228611, 1125545597629890, 951081168531596, 568553052705851, 1412860720276020}, + {1137419035579219, 1404302123897914, 70650994795979, 286534554383837, 1248950723208565}, + }, + { + {4430704978424231, 4715040112563554, 3462858870799989, 3675716202870984, 4333024567010524}, + {142500909440961, 3483510976010918, 1633124654372333, 2818821059903848, 1198913332019644}, + {752727997883595, 729011045815856, 344467882917129, 1083479075474047, 1987011026378575}, + }, + { + {4459355955251918, 4177516598428064, 5081135773938774, 3284517801964245, 5485650974376915}, + {928716952855914, 4109673353080708, 989163284951296, 2771681491221325, 1739599539253359}, + {884564007355359, 1882230710793852, 1848620432404050, 211924733371920, 1690861583639863}, + }, + { + {3370568370567081, 5191721693684414, 4210754480734108, 6164440545771688, 5649472005268314}, + {1901455587402533, 813369714566932, 4131962295906966, 1890594180896940, 2481388378410460}, + {226931392632329, 1641783547024066, 245880824976242, 244030597682497, 308840717750219}, + }, + { + {4699529728790440, 3682875431198511, 3687823620487174, 2935047689154352, 3634282712140374}, + {3094491104014232, 1130377028133465, 857472228100160, 2846610482750732, 1997728196650988}, + {832395901935430, 2063621809284227, 195191804737031, 1295260648818684, 140470149874586}, + }, + { + {3598626358333843, 5555876347138442, 3551001516031801, 5418563562930746, 3796685043861386}, + {1119383319424479, 3370445532080284, 2202737095147899, 2643552313073446, 2526474007824020}, + {436475423231066, 206987015606375, 214066996087725, 524361410769522, 1866248992304042}, + }, + { + {5215692725695751, 3669441050652411, 4674665916750844, 5316221279699436, 6443632653069401}, + {1081002530185607, 2909820960350251, 3592240835659126, 2824950488355670, 2408518769691813}, + {2202470261312694, 1511198785606944, 1434711629178163, 1742102768767586, 1282697956395292}, + }, + }, + { + { + {5324690866715337, 5533327845613105, 4036930034597607, 4638490931056674, 5650412235017737}, + {1638260469631915, 1786040878698661, 3158389239420729, 3835314628196980, 2413700758553481}, + {960395712488566, 1090263312831733, 1493488072165035, 718337273853885, 140550395520083}, + }, + { + {4569832948050874, 4985100205291785, 3844846206585447, 3819690642434847, 2746468303866686}, + {2833809135953840, 3714738963129863, 1699035707213511, 1260336843200283, 2274544359656356}, + {447501697246828, 643764017641830, 598739660833153, 477276555234445, 722964385617133}, + }, + { + {5743873914285031, 3319094314541157, 4059899116934908, 4330486197588569, 3357811959011823}, + {1468688697571051, 2930932730830707, 2981359468083280, 2467829883996923, 1572642054261959}, + {601523810297856, 895074627148937, 773977692709653, 1905383167427875, 1540507530397039}, + }, + { + {2901461178567113, 4994292130181829, 3331309663039004, 5793381747506001, 5040143301404956}, + {2651347872114579, 1239727848347325, 3161955024122276, 2712053429837225, 3725184595174532}, + {1148448246837183, 1915539016170074, 727268432049334, 838952046766961, 1100979659516489}, + }, + { + {4313788896597005, 3731391587318928, 5481675874227619, 5342116794928851, 4858074158134343}, + {2801484252789311, 1308243333207398, 3101163188310017, 2902551501956635, 1782136170508091}, + {1354449553272043, 1085110494903468, 2224048655022783, 1932600057639272, 200912869737304}, + }, + { + {3988802802744946, 3054267513827163, 5506469409446024, 5207893419318903, 6705457585999423}, + {768379161979176, 2950328772092937, 1384131174334606, 2825110025249585, 2256845801064479}, + {1328818899805024, 1356396048253838, 60665341223248, 1567700157316511, 290562887661571}, + }, + { + {4789838652012215, 4990599721334973, 5868836171113556, 5456092296292492, 4808665632941719}, + {2083771618977947, 3859777942731437, 1586868936731178, 2520556279463752, 2196980677006699}, + {1179288489475667, 394266093483806, 2023843107238627, 906600297586329, 1987935808498095}, + }, + { + {4852377011852760, 4268226436451965, 5725799343439052, 4170083215192005, 4497273560337215}, + {2190648163527070, 1182302286459911, 1698709705179966, 2858053760026903, 512030280417031}, + {1766029976663583, 578113072554872, 1407762358462124, 1251410333318914, 1519685697291309}, + }, + { + {2425211004658582, 3219329122771349, 4160786304284559, 4915538208049169, 4859858046454066}, + {2165465146173096, 1900611060212209, 1042730545588351, 2014093929109019, 1810920073473014}, + {2188210814895132, 862494540176239, 429026747909695, 420692388686242, 398456856483386}, + }, + { + {5384113697440972, 4249326538414056, 3736088109548391, 4776181701890428, 4340637335144904}, + {2182481135659358, 1214620204337280, 1322637461359405, 3608648111407434, 919105498759084}, + {825616994407031, 220978982016139, 419943662189285, 2047052177976116, 183513451940769}, + }, + { + {4383853436467396, 5616868348446865, 2380427384672103, 4007620388627955, 4745758889436972}, + {3034925520134716, 2558549339328923, 2273570634299175, 2355590727329921, 1721435535499274}, + {397259122369220, 1632965024772390, 1358524229763907, 634652123170537, 1300732316858513}, + }, + { + {4537722552642641, 4406953311574034, 4747655843802439, 4621074214609984, 4656289262373784}, + {3211235434961971, 649442782529810, 632841582251763, 3220605671079152, 3939184634719634}, + {596504540509310, 1411595783429460, 320205765945468, 1703829528897671, 791135694264620}, + }, + { + {3935303504608645, 5231587761610764, 4492307054736833, 4099267906214233, 3895141043651931}, + {2905973217158121, 3180461607923868, 3881652820548741, 1616810006326533, 2007934577851039}, + {1723586093910128, 42167711405468, 711328489930847, 1802621686437750, 138939056743574}, + }, + { + {3535285454280039, 4143874578497438, 4378537178006869, 5183808895312002, 4029558557190188}, + {2822051371235755, 1171790929970038, 2832133858385125, 3449345178331124, 1343246277400448}, + {201514708798683, 714458960438240, 193526864900221, 289856941669808, 677692044183495}, + }, + { + {3390373253525299, 5571978408447513, 3881939102950573, 5664584550774172, 3541416731496846}, + {3067220342787603, 1318716141230895, 859940092247599, 2796965663112684, 1325031219234520}, + {520206601828502, 827736556609109, 1548115289807569, 226762337353952, 901425653289102}, + }, + }, + { + { + {3876784047658153, 3427402741453803, 4260413043643610, 5364266100628625, 4512454692213601}, + {3846988412720927, 1464526558278043, 4150028797303466, 3612037356861449, 561355623244019}, + {427225699371050, 88989906931284, 374954954790275, 1891881595245671, 72849256625193}, + }, + { + {3916811195383628, 3630554563432754, 4990637953666720, 3851134441999325, 2556181869064802}, + {2335839984116276, 1931214780001052, 3695690881878730, 1666635094108941, 2394874384507690}, + {487618024041635, 1610635862259296, 1930277174961405, 2060246530132043, 471988063294585}, + }, + { + {5204676678666455, 6002573394041257, 5469218649554576, 5103810246282644, 5450232393144287}, + {2223680929791699, 2255695602856973, 2223372744379624, 2581758136991750, 1157672051964719}, + {1191620799152162, 584262428445493, 1654487633336816, 80589900150873, 1778885798645876}, + }, + { + {3804876885771689, 3030718867413702, 5084806164730577, 4351829583495248, 4696365675416595}, + {3277232365416075, 1648743746278574, 2268484584766767, 347896520603034, 3388269197255745}, + {437947250844137, 170970937295705, 294909197597269, 2210849722009323, 1802271999575202}, + }, + { + {6229784974313861, 4445187233108198, 4141897661886957, 4112739300676286, 4973450766687119}, + {2452873695124259, 3183518466635188, 3225011157480339, 1530254508436786, 2236389510678133}, + {1718640585909930, 289464657861405, 256448940553760, 1840710967168708, 1367355358576031}, + }, + { + {4418094237484866, 3862166158397851, 6312584233293658, 4170168684472692, 3205101920356659}, + {845231506816104, 3749601727822635, 2431461776355856, 2145415545771870, 1633953832787249}, + {1855071951306216, 234835319416374, 608676288546844, 311106921331784, 1424607004261872}, + }, + { + {5534887235292980, 4955913319898744, 4436282654044178, 5157071574798331, 5799145956361697}, + {3127590738217404, 2607909890139434, 625984861031328, 898713331800149, 1867577233264451}, + {865238419718368, 2167660602098967, 849033435333870, 1879862001988212, 2194604163295964}, + }, + { + {5028901701646599, 4744711118820448, 3470202116031185, 5070974802044518, 5029459282472967}, + {2597573876967117, 3500480183251406, 3245567533116125, 2884144221342044, 2745802723161587}, + {1262037831799441, 1761445988918060, 1818282615037362, 643977010061831, 1670449776207217}, + }, + { + {3900064283125076, 2932367474353790, 3722342375883231, 3973709010425436, 4168589452466075}, + {1182011269637170, 1702301475425876, 1754593023447641, 1069325582888970, 3665084705482905}, + {1389152123534754, 679131622889370, 1335753122628610, 2193861582528949, 1750442867995809}, + }, + { + {5195225631658915, 4626594891714746, 5530846200979591, 5835469573794033, 6108601962615813}, + {2118803625617181, 1938389959549060, 3158628651247723, 2603939933464505, 1887075807282899}, + {1094771758119662, 1784696951595960, 1586111086846247, 1024621381632866, 1336860396265070}, + }, + { + {4962714218495987, 4686221014092595, 2854843506884281, 5460710344297905, 3609844163230280}, + {3350136365379549, 514082045997139, 1809601258343901, 1359082981819817, 2325132321451910}, + {816435505147956, 959029754172122, 1905562189095432, 809602990954940, 205405869295}, + }, + { + {4658319919071161, 5037557822453179, 3052863244608605, 4920651274442715, 4594868309263967}, + {2357418342397899, 1599797957446167, 1723240952262061, 1521319741808023, 1244021174200017}, + {1682663787527018, 508342182938395, 1334960042435994, 788285033210835, 1620852797020940}, + }, + { + {4468831118271270, 5037652592706325, 3842859113890724, 5119527774959881, 6070895395223645}, + {2858969631689118, 3774837200669161, 3030920205974308, 3569621881524763, 2272136016309579}, + {1457792005629762, 1504843532852533, 117754270187566, 1653728802150419, 956441650806976}, + }, + { + {3858799123389730, 4813864196253754, 3424673118223091, 3586667532616773, 4976228037682591}, + {1240797555104590, 3504953395544138, 2270523358088921, 1192446004554973, 1265977430218831}, + {209033356623489, 521030133202188, 2210759687093959, 1391735568682749, 2066024683275958}, + }, + { + {4447381514683745, 3805818101586919, 5048484781457783, 3805764540626535, 4979430662961349}, + {4372830229780273, 3385211896687553, 1322477629921689, 1744994285972241, 2453525332947167}, + {469280089327132, 1530255390484981, 1847838662987617, 2225747405410001, 1682362262024675}, + }, + }, + { + { + {4202827224002136, 3028138102214431, 3666469969152450, 2607795400549083, 3461406593763699}, + {2143318224651032, 2985185441001099, 2506505238926850, 2498470302228395, 1442295963272081}, + {2200224066087308, 1167051805827953, 161446888552827, 1516422365939770, 1942535836845300}, + }, + { + {5171889208942910, 4780829163437052, 5016462198638337, 6470156341077032, 3046275441821918}, + {3482226206224520, 997104644926830, 3305574633418067, 2147764348670690, 1676514761128454}, + {1628314393858778, 1997743320994668, 1561201521750924, 1869590045554733, 1810714681142288}, + }, + { + {4681454419314826, 3433609902051237, 2919531098016978, 4380876633130549, 3072926890864646}, + {1675422916543594, 2672408744787477, 2759217149054666, 640362125760161, 2799605921604096}, + {1484872832783728, 72255685107270, 1098972476164964, 1732914770170238, 145186792002379}, + }, + { + {3935383441158753, 4973709539651372, 4161806475746733, 2598419220788322, 4556716999515219}, + {1372652207334635, 2531888280983978, 3771287204988285, 2258792327010408, 640671581341507}, + {156581553787681, 307978851206907, 1451582278870485, 442722234791876, 662472042575165}, + }, + { + {2866740058396235, 3493635817947651, 2400937210085123, 3122677618181344, 4447500274280321}, + {2082652078388943, 2745645971502049, 2295760696601975, 2362848920638954, 2370414183207021}, + {1712668510139487, 784271226274642, 827073136956465, 1001465329762964, 1662630974562798}, + }, + { + {5156175574821430, 4359502037960358, 5222120068062442, 4645531980214215, 4676244221442153}, + {818080711416948, 3611895686544640, 2535691662679364, 3086441935441805, 787978368976315}, + {1509857525874286, 1496970584948645, 399828714647739, 1863753979948441, 2149707660031809}, + }, + { + {4144865997618639, 5339859640465925, 4438288719418715, 4715011715150674, 3610459694506906}, + {2952195132229463, 3345568150314393, 1768906295222689, 2025477905414216, 2995593107979034}, + {1951144383031056, 1085048452592587, 499199223423315, 2055889411465929, 698006601614245}, + }, + { + {4183964222033211, 4817865139479783, 6220809882369837, 3643181163556103, 5929569705519063}, + {700816495675241, 1165569165048171, 2172597164236109, 1071655796287173, 2392628493878193}, + {1862104717906915, 1752261107932084, 1874923294613947, 1008681858018398, 628821150989939}, + }, + { + {4161348428018682, 4510282473079517, 4817307873546246, 3901464805798077, 5820970885668019}, + {2393760120508366, 2923675062487769, 3447512431195440, 3853675368087017, 2900110716170471}, + {271735680629051, 645447398246691, 1438808971583999, 792432482423730, 947645802664175}, + }, + { + {5548911597254848, 4313111803014757, 4159094458160020, 3906456530516599, 4703406736341543}, + {2468698810952212, 4159587806133767, 3895277333299798, 2370621230252749, 366242246574179}, + {1891237336529861, 2200322075990278, 1389309370267760, 1284260243869154, 2019396638376055}, + }, + { + {6612681523843925, 4270864305450289, 3731318918021201, 3544862780769488, 5178202040634906}, + {2135755065262843, 1122607271257525, 923542923082409, 2860818598984322, 1922554972749380}, + {242471180181642, 559887731579688, 2072408437063313, 1092425853708654, 1508919031894623}, + }, + { + {5872377157668488, 4408911728296550, 4215455815151923, 4350437538061339, 4304102307657902}, + {3016579539029836, 3430456847285690, 2439572409111001, 3210834728649259, 3775979784664836}, + {681181014012506, 1995504690201206, 1747715035603252, 100305442172708, 1898381133318416}, + }, + { + {3131841243480282, 5236372530773376, 5021877536268058, 4866190361541948, 3290429298804025}, + {1471590353308208, 967056793878588, 3802522075784380, 4004598771731972, 2024618065937019}, + {1109658864423422, 2103734444560570, 2073023657041166, 369769649281723, 817132219307245}, + }, + { + {5632635968843701, 4247258704551623, 6265280169576672, 4815811703628991, 4268679712320579}, + {2186780367255445, 4183850462668485, 2677999934662660, 2880987810780319, 4113828005081983}, + {1441842413844030, 161967823757178, 143843657267759, 468984586211790, 1403635869302761}, + }, + { + {4465016058776751, 5317359619864273, 5237005983845137, 3609875861871372, 3464614715951065}, + {2238448064725901, 3110619177809235, 2162294075762619, 2319911679772150, 2285011619226311}, + {19804365830533, 1686591959644968, 641957734952114, 1534607041731245, 2021106986001419}, + }, + }, + { + { + {4685063337509321, 4828498939602920, 5252037453775058, 5946493173698145, 5385655016202805}, + {944214205150673, 2365379166371694, 3557291173836860, 2962349586178017, 1508433893219247}, + {99837384801727, 2128746966172064, 1728087272474317, 1660968164341303, 2094478837305487}, + }, + { + {5059816654277047, 4494318859907208, 5234935703112714, 5064000806734505, 4673368238982494}, + {1045092786794937, 922156857253434, 2823065772236182, 3280047208436923, 400144133024674}, + {1350540322092981, 428507123444697, 863081413402232, 950089447398951, 118865435494230}, + }, + { + {4685872193140817, 2986094649249487, 3994164430284207, 4339988837278092, 5456344527489565}, + {1863120758931529, 2615255562194237, 2546630581550601, 3581241606812888, 3495878108380709}, + {317239144147936, 1378693805440304, 1613995646839215, 1790616997152168, 1664744641804674}, + }, + { + {5168378766438094, 5613439416641824, 4644053531787994, 3823661418550054, 4036137961950509}, + {3162078769819650, 3145982897294820, 830213734772942, 1343060696486484, 611721765217825}, + {220994375354681, 1633125608855915, 2233079832150828, 144297568151940, 217868145580028}, + }, + { + {6394803792754188, 6132368335021053, 5067197744306631, 5563640033331609, 3502674887523375}, + {2185253522527390, 1722061079589371, 929518249744037, 2473172243807197, 3427214482375105}, + {579681536856473, 1962714631533051, 518559321779053, 971489356480100, 509262501560864}, + }, + { + {3925113491817113, 2597442932750426, 4547336592857079, 3567634098715516, 4305879739481027}, + {3780232691597615, 2387499794027268, 780855157188913, 1744928736206446, 1837149863417515}, + {1612827416827303, 1149821613065205, 1844912308905994, 429769677786205, 1866058244678788}, + }, + { + {5323969415910835, 5007501896425241, 4051100888248418, 6293526281093731, 4819708586854638}, + {1087967203355487, 1504313118437159, 1271975234407042, 2125305808015759, 1278369242007838}, + {2109491846902798, 1459244188614787, 1145316246074802, 537401043713173, 2076110035136585}, + }, + { + {5420343519672736, 5167540178478133, 5227270808193702, 3857502656954627, 5090553389549522}, + {2543056198437618, 3682981507069573, 1492922137755706, 2553269698918225, 3362719634517442}, + {641798503068060, 129975789967638, 2167736719761015, 31631641435626, 350785183214734}, + }, + { + {5066057417347081, 4106102383764030, 4636402204189217, 3166449457097492, 6512612113974837}, + {2326671091720579, 1608331768972414, 2153369779460415, 2214666295188594, 2144539481917009}, + {467300109694399, 1693264194394125, 270333528447105, 650109201517682, 1183509432017698}, + }, + { + {4980219730800404, 4347683389360629, 3797217994168414, 3968193844610984, 5065496827863311}, + {1399648064845078, 1606346276621799, 2881852436764688, 2553259795593478, 3428187511626105}, + {301865991723133, 208252052427984, 51972802328726, 2021710333754506, 1378508945174500}, + }, + { + {3184436513057976, 3574184872992923, 3980701068825082, 5420309832432621, 4126883464345483}, + {1378603098333140, 3238698568766207, 2846856431574260, 3096436218915115, 3811649319155499}, + {847831302663356, 1506598425567944, 1109350264779453, 1031639907526886, 1887329321191319}, + }, + { + {2729102328832984, 5496148280158443, 4624803589574900, 4730709608222510, 6347472137270048}, + {2243355286660512, 3259846408864417, 1913072889496856, 753019988978676, 2074854260894060}, + {1050426720469833, 301805153257576, 1393268630450121, 1286505995795045, 1587323866723540}, + }, + { + {5177553689561919, 4133777550475335, 3692495435897478, 3458719135916346, 4458613993531757}, + {2247714139881915, 2782180885900161, 2312112468846576, 1680267679651832, 1590058688526667}, + {714977855392027, 2020332496651261, 1788558438911234, 1873232632822523, 503071332489421}, + }, + { + {3928537419758315, 4962617917721336, 5009684278125795, 5080330424879792, 4736452659996568}, + {1885791717393579, 3608519904666432, 3804656767054515, 3734399316619142, 280860879781734}, + {222453425419780, 1881231455372494, 356159674087381, 2031436073565603, 1587722788974501}, + }, + { + {5557830146603019, 3189235339941465, 4073380612031396, 4406171020530468, 3729384279482635}, + {1262604590990019, 2611597233679237, 1167025725287256, 4282778604598424, 782190165854895}, + {2186405536221393, 1904322539012708, 152608078674767, 560457311616919, 22952815837658}, + }, + }, + { + { + {5410522905087843, 3457067311541871, 3734790664132962, 5317892036251255, 5789103873795877}, + {1051236049852089, 3090035912523931, 3653329677163146, 3071361720175865, 1695547314615009}, + {342012360452061, 1887029215668228, 1155449753977691, 310762800506541, 1868750527042639}, + }, + { + {6005811139638228, 5026414264668887, 4377100252408278, 4270582517957803, 3422272486715601}, + {2698577143176842, 1182111476573107, 2613378546611642, 3220851371976805, 2803670963190147}, + {883746203814773, 276737323512287, 2229390196673160, 2155663378443822, 635390057802745}, + }, + { + {4097156896954595, 4786624081470779, 3512858804636033, 4586748051134289, 3866073874774231}, + {840689961188261, 2918655679606741, 2236632145763387, 553161305644429, 3021893411965909}, + {1649953183870355, 2176771717569818, 1233096109604549, 1152511702037810, 560573824644263}, + }, + { + {3626792084314328, 3138501138424139, 5501515071454841, 3948607545905590, 5453543250308683}, + {3279453112825750, 2682669747401601, 2291239772155005, 3644653666115630, 3532224357711467}, + {380965098906693, 835788132761480, 2232989119976139, 2205277179143298, 1175904351372329}, + }, + { + {5088419201363648, 3175894686165450, 5299797135086175, 2983523363221301, 4220825923293130}, + {1276840412816828, 2771169526519092, 2136012615148103, 2431893903507465, 1217611106137226}, + {2073239372536943, 30649016949678, 644492521678981, 305840627193069, 109901429265295}, + }, + { + {5139707358045825, 4688671704193624, 4352852502302345, 6384641621021538, 3836551482242832}, + {1192657509706017, 2505894684845872, 2556098156240875, 2309411544504528, 1820864150951982}, + {1002466072624564, 1231676492638173, 1795061881446222, 564780581799518, 2025621015597595}, + }, + { + {4858692159454824, 3985618384769197, 4768611969748369, 3070997304216167, 4648245907091308}, + {3367644801750200, 3754604094141859, 1751381457602879, 2418709533236081, 3882122160708146}, + {374714050779396, 405289438859672, 1963133877676048, 2112584561135192, 1143185401022561}, + }, + { + {3846711807981435, 4505402219442327, 5146862869313170, 4623705187751987, 5565609289355471}, + {1926650836092769, 1141267952622767, 3387976667434360, 2038056869767013, 1320936551384977}, + {283489509389185, 614480115735096, 278795579529276, 1166609138076060, 1715497286463476}, + }, + { + {4275758633577087, 3861278996194559, 4466252217383748, 3665496078445880, 4058888268167473}, + {3871692294074427, 1764539273907035, 2887939385751194, 2243961968498350, 871865948439469}, + {2109468136302879, 794757759853720, 236685909745726, 1503678842333224, 2147818470882973}, + }, + { + {6104878619412512, 3485890441294438, 4220586739682332, 4017322426737508, 6001128289990864}, + {2677372099733352, 3437936829126546, 1424452207982980, 3507913002098314, 1735468130831162}, + {1938075620777682, 1762081466410536, 1564991344244054, 1376297777594771, 248036172502508}, + }, + { + {3778095331789531, 4910813465857036, 5137553967349467, 4984396828084641, 3687371747598377}, + {1479550570874507, 2294055327463876, 3724831818626703, 1654245262468829, 3019040190597313}, + {1873423061916096, 248167770548070, 903648623666602, 2087943940366473, 547940262578569}, + }, + { + {4725001988101218, 6546220549270451, 3469130078731384, 5687075187757928, 3413336519371176}, + {1413358533598756, 2252005803690891, 1458088388485468, 1671589233622260, 1797166284473808}, + {523276182513223, 343307024193534, 937383689926833, 1330219799726239, 2232356434433501}, + }, + { + {3569532147039540, 4195918401728545, 5115321889044388, 6609417783186476, 3958938427322120}, + {2397395505704106, 1262743052475361, 2547892063055852, 2321536665849090, 2021113849426924}, + {141428615990698, 1565258204511290, 2188430123291708, 1781055032390171, 763358600759749}, + }, + { + {3906824289179955, 5654339223566203, 5504976063361072, 6361176910130113, 5155227057638370}, + {721005728190537, 2847737995575099, 3056729868442396, 2393716554993649, 3467469336561398}, + {160800301986322, 534920738504617, 1465194074759867, 132949302971740, 1176455782582044}, + }, + { + {3433889410020031, 3665956712149865, 5366646390977683, 5367384152674927, 4795948454618784}, + {1902504950598053, 1202752625490289, 2565725054888499, 3023474686925025, 3059561010324150}, + {1935479944158543, 1102588664377385, 1651606970291190, 1048887489959304, 1677042940335362}, + }, + }, + { + { + {3858553186233324, 4192597543704949, 4422265554716229, 5060918874051413, 4251667779718110}, + {2960733565044348, 2107676482823115, 1657279889267301, 1609984394439769, 1082526754413784}, + {1823622181083017, 408967151178094, 2033143529389867, 2209724434343478, 918118538477317}, + }, + { + {6088716933512995, 6116095372188681, 4275776721065459, 4475819482692536, 4685952285527508}, + {2842268335288737, 1888183319191451, 3692488899816305, 1677336684221250, 4176880757505444}, + {463491021439363, 1750609461077078, 1169967881279297, 474253519600450, 901070375860211}, + }, + { + {4400692422952866, 4659690717529996, 4722795303748102, 4016471577087528, 3702653606869112}, + {3485976485792634, 1118156106770038, 3653108520059592, 2301046652704138, 2381698882921202}, + {288029433804634, 1918327772711516, 1858109617364668, 1548745667412753, 1635036158704975}, + }, + { + {4899918186072737, 5587073618198231, 5408433162977742, 4217274871182020, 3058703542950255}, + {1915560744141461, 3219944346867669, 1684794323668364, 813038486884416, 2736974530406253}, + {131383425958682, 1726194406199626, 1195125520329959, 1269440178344704, 1934708138886976}, + }, + { + {2560939345231273, 4301322442066007, 4073130192422468, 4440850393019204, 4883344655404735}, + {2185121667669569, 1115206785572251, 704158439711004, 2133851508118048, 1251130304627637}, + {1895230235031468, 1896812472261458, 768470747222158, 1996242383935516, 1420798451369434}, + }, + { + {5839795121226482, 2867951589507385, 4636256264448023, 3052659764389740, 5026931603960818}, + {1579856931436900, 2447051767839229, 2868067823655589, 1688893962924788, 2116170079089324}, + {556211501812000, 449190026847667, 2036295767110360, 128995208617458, 1118467502984960}, + }, + { + {5602461071232607, 3307918487728174, 2854017338064603, 5855272157497266, 6150895900635822}, + {3398390622800229, 1820230761045332, 2690748155578623, 3095835968664066, 2530217218349662}, + {1878982227582804, 1431346083601994, 1534977024077189, 2155113334662581, 1782950372830762}, + }, + { + {4697661970186985, 3763132135142867, 5033467660349912, 2907155321697052, 4660465007863417}, + {2604312744349849, 2452708102821815, 3230466926286856, 2118488738947708, 2304478471957885}, + {1390885694073460, 1816639772663275, 1066627353945560, 1454561122724455, 848860562366790}, + }, + { + {5540829116940004, 3948748499449809, 5260550454870879, 4676389564943908, 4383546683050662}, + {2563789831020858, 3343718595008637, 2259025389677919, 1392665428080842, 3671467539073936}, + {981545110828877, 510698765880228, 2161678679515528, 1436791773758609, 1673597748298096}, + }, + { + {4329713062953095, 4939339976361997, 4958702235647932, 3268883154176961, 6391544885910171}, + {3614223297666549, 3897390208178715, 2811994039134574, 2958689501074087, 2363866533687133}, + {1294858674770242, 529668890256843, 2030539078163824, 294693146073477, 969527805905143}, + }, + { + {4670371383742225, 4002936514889177, 4966859846610707, 4736741110602146, 4760957427324248}, + {1176127152490445, 1894013131106171, 1812632908007715, 3751034747324574, 2289873378487758}, + {61868149975749, 236120696290007, 608351327055311, 1829919587421069, 1627340269896729}, + }, + { + {5062259960708944, 2689430826280744, 4108030288846956, 3316359330121699, 5641758926485313}, + {3722896082959268, 1863222026681564, 2044934869352810, 1385880696113195, 1308481967864035}, + {1796753889379582, 2232245583163596, 176790521107364, 133826841897595, 1041041183235991}, + }, + { + {3537934576014922, 2998428847270897, 5788967881664907, 4283416153137820, 3545722873501844}, + {3424639235617092, 2530506041245943, 3202402279176211, 1867524240141886, 1078908361802522}, + {1442655471934418, 1764674447040318, 316317796980033, 318184491515700, 1168933061547497}, + }, + { + {3599845082833499, 3896846545871592, 4303714095196951, 4532827504261802, 6020561742040974}, + {1580156396502051, 3208244370687690, 223926404960589, 565074765027696, 2169726994764050}, + {1942280341359651, 50425926664281, 1816034234875212, 880607828368837, 2092912650330571}, + }, + { + {5512765861463031, 4125716632501591, 4924530697112776, 5238255918415337, 3653602071478327}, + {1344167653424867, 1048535312223495, 1948741777806718, 3072730820612467, 1645288196866883}, + {1745152490874503, 1836336442271605, 2042898833391948, 1540893062903555, 1183365031475960}, + }, + }, + { + { + {5866266958495514, 5059063420853561, 4485040531648720, 3733835905319672, 3149359201467933}, + {2684460961013652, 3709949712072759, 1783966662497692, 1338383483986408, 1938129546538183}, + {40033251972751, 73885946378640, 1935473366247146, 1461619709267546, 1211799649582059}, + }, + { + {5250457209059169, 6625476149991574, 2830402208757038, 2943786524207392, 4303078760549837}, + {2301225069080269, 2184860938031358, 2273332051328548, 1704804667098002, 1911735781256473}, + {2217303387266656, 2227853943602075, 1384266551040407, 847818056628355, 1874126181291960}, + }, + { + {5228171959238562, 2572808713483427, 4818692310321808, 3983994866935258, 3614639592657195}, + {2763608237796206, 2346801614322209, 3045306834104040, 1893958852943478, 1490859261541415}, + {247688480299164, 1512873113726713, 1351630747308477, 937439467136054, 1030677695284257}, + }, + { + {3673708668048072, 4665314801263177, 6233349558231934, 6339984458236183, 4552548914816150}, + {3247306673138258, 2425869243107473, 2622484905091774, 2040657700179409, 1450858492090282}, + {1636572211186580, 2000987144770729, 1893417472062746, 196779160527558, 1557344243161357}, + }, + { + {6493926578942193, 4543542057302668, 3472731731448002, 3629201377772109, 5141975006754257}, + {2310006248725699, 1647962485872618, 2823143389536034, 2192050419207497, 1818655878772515}, + {1024434193686880, 2242250021719251, 564307645117404, 690001361734624, 239056809198959}, + }, + { + {4713019913612655, 4128228433667681, 5028024885108113, 5705734794679268, 3306562584580656}, + {3717108646348257, 4084515682195001, 3812051722646527, 1684888211341314, 1618372056987552}, + {1877409538331051, 337692456674055, 879114692044355, 2186377676371749, 1343387843321657}, + }, + { + {4142192651183813, 3524721259616285, 3594705099270661, 3959153982160586, 5413021910706886}, + {3669516570196207, 2121969005742829, 1652467606544375, 2698034847882520, 3275951535145684}, + {535664786267626, 858000264335400, 1392803193793530, 460772165692459, 1244185301942167}, + }, + { + {4502106313596470, 6443346829525378, 5721231993875900, 4681113914034302, 5472479613319256}, + {1495731174651276, 2532746921337410, 2156800382632014, 1987445924091844, 3448117379338544}, + {483117633444291, 1721449975252800, 2014677970681898, 2079902425951169, 117285229800651}, + }, + { + {3261832527463430, 3508653912421559, 5988429677058390, 5333822038484553, 3271080652355482}, + {2204547407113574, 2042779888674267, 2424936780736806, 1416144793524967, 2647730853119196}, + {417006946097712, 816142170165382, 321665320486095, 1120596382678137, 995334532083163}, + }, + { + {5667435300952982, 4583050105149113, 3937627982933697, 2917941244133350, 3746324610420174}, + {1654154218632292, 2424649854522191, 2118483268871125, 2658103876978958, 3351121693690514}, + {1757087236610187, 114932695265885, 1498710897730185, 1732388966595209, 145995973897689}, + }, + { + {3747574781762871, 3444173068370155, 2989065545095348, 5144077823603124, 5597474176298234}, + {808058917355435, 1642072317689253, 1764756051109168, 1619463984060522, 2971052737331444}, + {344784500521841, 753070981245028, 1021287645349333, 896645545453199, 449568974542070}, + }, + { + {5037125630216086, 4317087092146610, 4394758621519137, 3169411347551391, 3200762148534134}, + {3758879149962654, 2267958484085658, 725842773817223, 2203610500470887, 1640888914156664}, + {1753063336824455, 1632699439142352, 654655992711894, 254878945844677, 1142235737877277}, + }, + { + {3668977677139265, 4332641682100108, 3590347451295966, 5242849066395039, 2727116665213341}, + {3248235630095651, 1380466035309490, 1790683862609512, 3542725848725101, 2663722245169429}, + {863640852068414, 1530602868551714, 1707160942886152, 54230982937714, 122819573759751}, + }, + { + {5532810941110268, 4585437113624970, 5116705204102219, 3665108856301161, 3445572551989045}, + {2829139259902194, 3388923696568854, 2569841942150467, 2697982670988693, 2163914772008849}, + {2076653457069888, 1193685867720358, 1325584969753937, 1501472994346955, 87079528165998}, + }, + { + {4556025881223574, 5720430347742651, 6074363308505144, 4027406626756934, 2527767620430889}, + {2142131119871606, 2984501701896371, 2717746191530066, 2203225891573820, 2175517225379719}, + {897107227346093, 455907621058237, 864390863340574, 316655721359786, 1688391871841069}, + }, + }, + { + { + {5225107848603314, 3997985175873023, 2901647838494787, 3895284350008311, 5682946636557185}, + {3523031484358436, 2824636666213863, 2395141832526945, 770528850757883, 2501907940021781}, + {722866669050453, 648025000876863, 272387785321835, 1191578896340587, 133025146298323}, + }, + { + {4430018927628058, 5528149113975034, 3884602704599257, 4041974594447505, 3905022194274965}, + {82857304500618, 1554338034359360, 760468202446199, 2344834461467455, 688719719651551}, + {2128452325542740, 952454207454828, 1516099560539414, 1362377470631451, 1181280467630705}, + }, + { + {3877905624740973, 5612025444592814, 3620377076227448, 3557624466809644, 5794884625077990}, + {1234316951156125, 2774803744202148, 3038336850143346, 2839603046584234, 1645722164542234}, + {894237486099210, 1516039905189318, 1740044048087400, 593444525063043, 2109764897178862}, + }, + { + {3625360958175610, 5708422748846073, 3787265901576189, 6157656721094708, 5961588011087405}, + {1482109974932762, 1512691293799179, 3308418655922299, 1669766513116242, 1645628848588889}, + {134048702591674, 1512942576919112, 1666722043826583, 1830910766776036, 90483195207340}, + }, + { + {3762249153136541, 5419647444574112, 5020263484993746, 3697437793067561, 3831953348456062}, + {2494438010166937, 1432383122970498, 3625127628421620, 1764585753875763, 2715866922646858}, + {914153294895020, 1485178337004016, 1172992438642136, 742396957515979, 1460451697085215}, + }, + { + {3293341585462216, 4914585647995248, 3425647660888775, 3851476795826281, 2935952374714235}, + {2881676317687314, 3127597808111770, 1680974550469383, 2631492786928655, 2080467460645229}, + {1084836891982052, 405373371974756, 392292573225522, 1228291428535054, 196706224397467}, + }, + { + {5422966393229312, 3517798661028565, 3491057102408135, 5349612585124235, 5098313025804708}, + {2181085219797570, 2438267619893703, 1398091257339579, 1543623638852333, 2275879750497956}, + {1451708073273912, 640663458576442, 472967005176057, 1940369909273489, 1650816055376110}, + }, + { + {5775591770146864, 4809727687563635, 4066767569195787, 3927850608944429, 5542524111957037}, + {2856057239056516, 3899713821492127, 1178627125851433, 3276833765573271, 1528786153297881}, + {1406590024268518, 1220852036090080, 364949301397175, 1654716393716139, 143122595639438}, + }, + { + {3092682960222618, 5760168522994174, 4966136799494047, 6183321071200806, 5955160799299141}, + {1679800253914106, 1418780742199926, 3419507991072325, 2296436046846462, 2072736467396911}, + {882943817583285, 484844826182032, 423720125645701, 79705330082926, 518433021584838}, + }, + { + {4303808439591566, 4492049110308958, 5005208589399660, 3449528090765045, 3218284505011813}, + {3283940803229324, 4459508559485836, 940189907838090, 1705424518756533, 2039165337931945}, + {892563649969864, 218618659831677, 483384434921296, 1959503286788495, 846111377588119}, + }, + { + {3736052427633640, 3240841928280071, 4678563487154791, 3752373267871112, 4181937274986806}, + {2003615224309886, 1453829786196949, 4170849260029473, 2196915936737576, 3465659437703250}, + {870814358129174, 1509533025339595, 2053081266530331, 1737753718216259, 77875205064950}, + }, + { + {6295693526685959, 4477016414498074, 4045516627237016, 5610462754780940, 5285590675711912}, + {2091650387347437, 4186999032385018, 3695680781345242, 1318896896580492, 3133525015024966}, + {2057751622403208, 2124826136415213, 2162400122701924, 512312961318735, 2072953190856236}, + }, + { + {3421075047723659, 5902999844007244, 5257660560322253, 4411230485782045, 3851018473810833}, + {1356912041975431, 2088651341684568, 2115599337938785, 4037573216393849, 2652908467965391}, + {356251628924273, 2088769627568139, 187882754343055, 394347310503797, 1449630398452630}, + }, + { + {3682820885194585, 5173915763318849, 2521868910298419, 4165015930825951, 4883528324075009}, + {1067127578201981, 2883441503009643, 2032675011298617, 3963320928045487, 1183903438950389}, + {1431421126152216, 738544074023370, 2193830823196529, 1671561335663722, 717735409657132}, + }, + { + {4201586389811353, 4375880219104829, 4192199017276052, 4416844421544609, 3903714904213483}, + {1449584304781523, 3077329128471461, 2135282471631868, 3283981709093825, 2025731372310411}, + {1183319077995597, 1294226945214786, 1175504892926680, 1065468559536653, 2201437139069262}, + }, + }, + { + { + {3505559764260479, 6013086951275753, 5081911139396344, 4716516055339902, 4005184608137658}, + {1941635877650331, 2292936607701027, 802548087270426, 553714331402352, 2637835706093694}, + {1415499622184076, 11739232724558, 1448526577403933, 77973485783393, 148463223858677}, + }, + { + {3556556070469100, 6104580777770606, 3153395731542438, 4746347503688425, 3530835687615003}, + {2563241728545350, 2900457320970642, 2021653799300720, 4081786454058715, 1684057546885165}, + {531432570362576, 1071513573823369, 449672118652203, 98547521251379, 260579416510065}, + }, + { + {3113402949202118, 3224343282781895, 6393340053990193, 4574021187583530, 4354743893457091}, + {2098297300858722, 1637995723173513, 2132191683177015, 592134746032938, 1044637126699087}, + {607038018090674, 1768950085932612, 1176147243379098, 1239851308662055, 1164850159859507}, + }, + { + {6544624144736846, 3158440120316048, 4122467747600782, 3270454787206357, 5173743677397902}, + {2302101840952822, 2675605826160506, 3431414289057246, 2525090851992001, 1591101869035052}, + {67986117053250, 143032219413988, 187059126532888, 1606721935579222, 2108737133289470}, + }, + { + {5726022544095362, 3724045113988627, 3515582956648241, 4176155101637246, 5525745188146662}, + {1710358734492362, 2952544254120043, 2348808532032187, 3458396516769880, 1537007452608630}, + {63942543002426, 322070337950512, 1601643046070686, 1223905889282175, 1741111665223434}, + }, + { + {5315895417052113, 4828375526334729, 4444010786735381, 5993309905616190, 3640401138113649}, + {2860407040121293, 1177142915116463, 3145140653940871, 1733521080031482, 3186874796199337}, + {731527977617797, 464892677638406, 850380242165564, 1707297435867315, 797914062581028}, + }, + { + {4481445847621310, 4194775426039896, 4717484155432068, 3203129625283069, 3774741254649070}, + {2200385186612512, 3830080434695126, 3332312936597714, 1819075993402941, 3697021137208346}, + {1808087344592199, 1917986815291197, 1736625562156353, 1691009053422774, 699554104203468}, + }, + { + {5048623459093582, 3345582890430421, 3965077987869649, 4640623371578895, 4912032720993151}, + {2302864341793270, 2363316925891845, 1559429527589511, 2124275860379685, 1685170275648173}, + {567087552892581, 1562927351866469, 299640978917608, 868196882482839, 81953139898216}, + }, + { + {4967323480101032, 4012272011745302, 3862894427518599, 4308636686245327, 5217499651112315}, + {1252667495912574, 926763760798846, 829943705996489, 1227324880932263, 964621170655609}, + {955876088496614, 2071382636271538, 1339562676294470, 1915921082315197, 857114822306108}, + }, + { + {3257326910061677, 5127439013196396, 4310630254544639, 4686443315427179, 4724730249377907}, + {2936128018106963, 1695470026893168, 2973127512604355, 1666309508011309, 2226049713730899}, + {1512722216346670, 113316334999619, 1851114541854723, 1700671412068281, 1858477808352196}, + }, + { + {5998097796107191, 4771418173207581, 4274779313964863, 6374384720876343, 3691059377431806}, + {1747059722842985, 1151985779666741, 2579873034214805, 2259025270175461, 1104167228907676}, + {1120011747324768, 1881628887342023, 2214290331844435, 486356580332714, 2162135539567334}, + }, + { + {5415017211564966, 4131956504736867, 4606393482137328, 4786286211324892, 4752001899018321}, + {3516707084985218, 3646421870194647, 1944208348735794, 2748388507091938, 2933933255585587}, + {939102610898658, 657762889309704, 1555084457788919, 1150153333777593, 1006706590082496}, + }, + { + {3543688234603472, 4194712450230855, 3880927772745797, 3426761679103243, 3127058186392728}, + {3187981953742084, 2855163365535635, 2396035850573347, 3426339364174055, 2041647909167010}, + {463905214510220, 1910840871806134, 115888611524937, 1537009142155618, 880221457903699}, + }, + { + {5589672840238728, 3432294293459350, 5387677215955058, 6169144676112659, 5379715338757042}, + {1784370156336156, 2235499907922716, 2025309612181078, 2188885065316605, 3233083367725482}, + {417210119430620, 1641361429213146, 1508617462812435, 1831075688628217, 1813350286884393}, + }, + { + {3676762525127118, 5016274613231870, 5279594930346407, 2746860593795830, 4531082394479975}, + {2603791557859206, 567981304762832, 3180006238725203, 2675077654404820, 258215834034235}, + {1643563927005454, 1423516315292419, 46523883479803, 1501791298376850, 1157127033006661}, + }, + }, + { + { + {4640633429716646, 4436352535262760, 5042663907988027, 4328339913162644, 4318409930240684}, + {1650059244213924, 1415687339027798, 3751941600642035, 2204874486713656, 3546077689782506}, + {1247200432261975, 265507035905438, 1620404126253617, 117362009527087, 1746435297969059}, + }, + { + {5340736267872142, 3295470429174750, 4407135163398927, 3488366482378904, 3746520348111790}, + {1068629703061668, 3236562504536698, 3481748917474479, 2110232841828030, 1092532788851750}, + {1306097687903586, 1372543655508231, 1658076721821581, 2200003583698537, 780636112677937}, + }, + { + {5226077937175337, 5692428823576533, 5689014150777050, 3908825240466348, 6345259720261058}, + {3066336104509029, 2314860930152579, 3056640011863338, 2260092480216528, 2073254466378784}, + {479894784370716, 1925880613677947, 2183487522494884, 625094381313712, 854845126872293}, + }, + { + {5197618157762598, 4433464121961190, 3260681654961795, 4120975634792281, 5835262176061498}, + {817093479351430, 4088761935787052, 3171716785010059, 2728541872107727, 1520644895959802}, + {1207982418891449, 1577854720087533, 2009037012572541, 1476807775109585, 764858983320152}, + }, + { + {4643752207568541, 4177425086748798, 2717351689863297, 4063904331524798, 6079476938692958}, + {292623621294171, 1087309087737456, 2573455597713993, 859400146466928, 2565065720265056}, + {1960514462005953, 1030291725190195, 357278058611993, 503261352420903, 409647200988996}, + }, + { + {4137436424426920, 3760583205467834, 5814704535202459, 3679343367155289, 3544651677301793}, + {1640564024541742, 3450104780081118, 1372955845260037, 2487953912194947, 1964015174577549}, + {1832104727099167, 996069167520846, 1100729754186688, 1771584084767106, 2117261745027080}, + }, + { + {4431020636065029, 5503695293870154, 4553592025467096, 4019460577334316, 4832018945114183}, + {1199122074926019, 2522059134402784, 397875262207322, 3119865606750668, 1432109594857765}, + {1875633950147766, 1109790076082089, 897660652998513, 1428078707156757, 908826481148722}, + }, + { + {5054013235620828, 5378852271051704, 4293253473160895, 4319499063151422, 5340758119594162}, + {2634018106321626, 2505108247629684, 3126341578772617, 2016974307899050, 1468999769476078}, + {2013224690617610, 881120726963113, 2087874148443678, 930634847072563, 2100154549645766}, + }, + { + {4096027168378681, 4674912073837464, 4651610619813038, 4659750027669693, 4079639323873143}, + {651560684224625, 2530373654189494, 3125510882371828, 1936741789282769, 4026872663838631}, + {1094258812694036, 1294242138409324, 1090035173467081, 1763568378228799, 1431407300427851}, + }, + { + {5901866474833548, 4953841416438018, 5227230958845012, 5669922347444024, 5683271169352586}, + {2172262341405882, 2561868572136046, 3688730950551326, 2503867014426524, 2213093161812464}, + {1951192547947024, 851119993124706, 1847432304733109, 1277897613708864, 601543383482271}, + }, + { + {3631710539670242, 3768950590313261, 5303952111138864, 5325131792733564, 5315344346171139}, + {3338513542876810, 3006290156706597, 1350992246942434, 903865514364164, 3147437075515383}, + {2230520732543357, 1272781658952307, 896500518331525, 1553870550296913, 1174834176365255}, + }, + { + {4212629881454302, 3511449460350501, 3310343538794185, 3281266357642722, 4487974828971768}, + {2969785173831624, 1505727885325259, 2813024274382127, 1442092766966006, 2775912811267378}, + {1226820412291019, 1429525834475644, 2118443840955994, 611048578379551, 1393279248359119}, + }, + { + {2549845597186375, 3623100753864553, 3499310120841001, 3967554171599715, 5734430215634972}, + {1995271425552231, 3083791126213951, 3279752729240055, 1320836376731637, 2619696559790542}, + {209938911194598, 1168941097549542, 1505719700014288, 296602403362327, 585510095036421}, + }, + { + {4596693410811983, 3239555606447835, 5319792910601399, 5807716310972140, 4978776737081211}, + {4298118886570999, 2595714642338047, 2582204981507639, 2283950348816052, 2880808000087105}, + {1625024000487589, 1577328585741835, 1748162688303583, 1508135442094103, 494130659185316}, + }, + { + {5133202328939711, 5161068400634691, 4982689133170151, 5479854286391464, 3974357722065660}, + {2759508860286693, 3544879646603215, 2393702940511177, 1786833813469860, 2879003887330732}, + {374825657994223, 798281160160783, 1037106323566812, 1491213365794340, 786385610113834}, + }, + }, + } + + GE_BASEPOINT_TABLE := &Gen_Multiply_Table_edwards25519_lo[0] +} diff --git a/core/crypto/_edwards25519/tools/edwards_gen_tables.odin b/core/crypto/_edwards25519/tools/edwards_gen_tables.odin new file mode 100644 index 000000000..d05534d9d --- /dev/null +++ b/core/crypto/_edwards25519/tools/edwards_gen_tables.odin @@ -0,0 +1,134 @@ +package weistrass_tools + +import ed "core:crypto/_edwards25519" +import field "core:crypto/_fiat/field_curve25519" +import scalar "core:crypto/_fiat/field_scalar25519" +import "core:encoding/endian" +import "core:fmt" +import path "core:path/filepath" +import "core:os" +import "core:strings" + +// Yes this leaks memory, fite me IRL. + +GENERATED :: `/* + ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ +*/` + +@(private, rodata) +FE_D2 := field.Tight_Field_Element { + 1859910466990425, + 932731440258426, + 1072319116312658, + 1815898335770999, + 633789495995903, +} + +main :: proc() { + Basepoint_Addend_Group_Element :: struct { + y2_minus_x2: field.Loose_Field_Element, // t1 + y2_plus_x2: field.Loose_Field_Element, // t3 + k_times_t2: field.Tight_Field_Element, // t4 + } + Basepoint_Multiply_Table :: [15]Basepoint_Addend_Group_Element + + ge_bp_addend_set := proc(ge_a: ^Basepoint_Addend_Group_Element, ge: ^ed.Group_Element) { + // We rescale so Z == 1, so T = X * Y + x_, y_, z_inv: field.Tight_Field_Element + field.fe_carry_inv(&z_inv, field.fe_relax_cast(&ge.z)) + field.fe_carry_mul(&x_, field.fe_relax_cast(&ge.x), field.fe_relax_cast(&z_inv)) + field.fe_carry_mul(&y_, field.fe_relax_cast(&ge.y), field.fe_relax_cast(&z_inv)) + + field.fe_sub(&ge_a.y2_minus_x2, &y_, &x_) + field.fe_add(&ge_a.y2_plus_x2, &y_, &x_) + field.fe_carry_mul(&ge_a.k_times_t2, field.fe_relax_cast(&x_), field.fe_relax_cast(&y_)) + field.fe_carry_mul(&ge_a.k_times_t2, field.fe_relax_cast(&ge_a.k_times_t2), field.fe_relax_cast(&FE_D2)) + } + + Multiply_Table_hi: [32]Basepoint_Multiply_Table + Multiply_Table_lo: [32]Basepoint_Multiply_Table + + sc_set_unchecked := proc(sc: ^scalar.Non_Montgomery_Domain_Field_Element, b: []byte) { + sc[0] = endian.unchecked_get_u64le(b[0:]) + sc[1] = endian.unchecked_get_u64le(b[8:]) + sc[2] = endian.unchecked_get_u64le(b[16:]) + sc[3] = endian.unchecked_get_u64le(b[24:]) + } + + g, p: ed.Group_Element + ed.ge_generator(&g) + + sc: scalar.Non_Montgomery_Domain_Field_Element + + // Precompute ([1,15] << n) * G multiples of G, LSB->MSB + for i in 0..<32 { + b: [32]byte + for j in 1..<16 { + b[i] = u8(j) + sc_set_unchecked(&sc, b[:]) + ed.ge_scalarmult_raw(&p, &g, &sc, true) + ge_bp_addend_set(&Multiply_Table_lo[i][j-1], &p) + + b[i] = u8(j) << 4 + sc_set_unchecked(&sc, b[:]) + ed.ge_scalarmult_raw(&p, &g, &sc, true) + ge_bp_addend_set(&Multiply_Table_hi[i][j-1], &p) + + b[i] = 0 + } + } + + fn := path.join({ODIN_ROOT, "core", "crypto", "_edwards25519", "edwards25519_table.odin"}) + bld: strings.Builder + w := strings.to_writer(&bld) + + fmt.wprintln(w, "package _edwards25519") + fmt.wprintln(w, "") + fmt.wprintln(w, GENERATED) + fmt.wprintln(w, "") + fmt.wprintln(w, "import \"core:crypto\"") + fmt.wprintln(w, "") + fmt.wprintln(w, "when crypto.COMPACT_IMPLS == false {") + + fmt.wprintln(w, "\t@(private,rodata)") + fmt.wprintln(w, "\tGen_Multiply_Table_edwards25519_lo := [32]Basepoint_Multiply_Table {") + for &v in Multiply_Table_lo { + fmt.wprintln(w, "\t\t{") + for &ap in v { + fmt.wprintln(w, "\t\t\t{") + + t1, t3, t4 := &ap.y2_minus_x2, &ap.y2_plus_x2, &ap.k_times_t2 + fmt.wprintf(w, "\t\t\t\t{{%d, %d, %d, %d, %d},\n", t1[0], t1[1], t1[2], t1[3], t1[4]) + fmt.wprintf(w, "\t\t\t\t{{%d, %d, %d, %d, %d},\n", t3[0], t3[1], t3[2], t3[3], t3[4]) + fmt.wprintf(w, "\t\t\t\t{{%d, %d, %d, %d, %d},\n", t4[0], t4[1], t4[2], t4[3], t4[4]) + + fmt.wprintln(w, "\t\t\t},") + } + fmt.wprintln(w, "\t\t},") + } + fmt.wprintln(w, "\t}\n") + + fmt.wprintln(w, "\t@(private,rodata)") + fmt.wprintln(w, "\tGen_Multiply_Table_edwards25519_hi := [32]Basepoint_Multiply_Table {") + for &v in Multiply_Table_hi { + fmt.wprintln(w, "\t\t{") + for &ap in v { + fmt.wprintln(w, "\t\t\t{") + + t1, t3, t4 := &ap.y2_minus_x2, &ap.y2_plus_x2, &ap.k_times_t2 + fmt.wprintf(w, "\t\t\t\t{{%d, %d, %d, %d, %d},\n", t1[0], t1[1], t1[2], t1[3], t1[4]) + fmt.wprintf(w, "\t\t\t\t{{%d, %d, %d, %d, %d},\n", t3[0], t3[1], t3[2], t3[3], t3[4]) + fmt.wprintf(w, "\t\t\t\t{{%d, %d, %d, %d, %d},\n", t4[0], t4[1], t4[2], t4[3], t4[4]) + + fmt.wprintln(w, "\t\t\t},") + } + fmt.wprintln(w, "\t\t},") + } + fmt.wprintln(w, "\t}\n") + + fmt.wprintln(w, "\tGE_BASEPOINT_TABLE := &Gen_Multiply_Table_edwards25519_lo[0]") + + fmt.wprintln(w, "}") + + _ = os.write_entire_file(fn, transmute([]byte)(strings.to_string(bld))) +} diff --git a/core/crypto/x25519/x25519.odin b/core/crypto/x25519/x25519.odin index e25d1831f..2d7aa4153 100644 --- a/core/crypto/x25519/x25519.odin +++ b/core/crypto/x25519/x25519.odin @@ -6,6 +6,8 @@ See: */ package x25519 +import "core:crypto" +import ed "core:crypto/_edwards25519" import field "core:crypto/_fiat/field_curve25519" import "core:mem" @@ -14,8 +16,10 @@ SCALAR_SIZE :: 32 // POINT_SIZE is the size of a X25519 point (public key/shared secret) in bytes. POINT_SIZE :: 32 -@(private, rodata) -_BASE_POINT: [32]byte = {9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +when crypto.COMPACT_IMPLS == true { + @(private,rodata) + _BASE_POINT: [32]byte = {9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +} @(private) _scalar_bit :: #force_inline proc "contextless" (s: ^[32]byte, i: int) -> u8 { @@ -111,19 +115,44 @@ scalarmult :: proc(dst, scalar, point: []byte) { e[31] &= 127 e[31] |= 64 - p: [32]byte = --- - copy_slice(p[:], point) - - d: [32]byte = --- - _scalarmult(&d, &e, &p) - copy_slice(dst, d[:]) + p := (^[32]byte)(raw_data(point)) + d := (^[32]byte)(raw_data(dst)) + _scalarmult(d, &e, p) mem.zero_explicit(&e, size_of(e)) - mem.zero_explicit(&d, size_of(d)) } // scalarmult_basepoint "multiplies" the provided scalar with the X25519 // base point and writes the resulting point to dst. scalarmult_basepoint :: proc(dst, scalar: []byte) { - scalarmult(dst, scalar, _BASE_POINT[:]) + when crypto.COMPACT_IMPLS == true { + scalarmult(dst, scalar, _BASE_POINT[:]) + } else { + ensure(len(scalar) == SCALAR_SIZE, "crypto/x25519: invalid scalar size") + ensure(len(dst) == POINT_SIZE, "crypto/x25519: invalid destination point size") + + sc: ed.Scalar = --- + ed.sc_set_bytes_rfc8032(&sc, scalar) + + ge: ed.Group_Element = --- + ed.ge_scalarmult_basepoint(&ge, &sc) + + // u = (y + z)/(z - y) + y_plus_z: field.Loose_Field_Element = --- + z_minus_y: field.Loose_Field_Element = --- + u: field.Tight_Field_Element = --- + + field.fe_add(&y_plus_z, &ge.y, &ge.z) + field.fe_sub(&z_minus_y, &ge.z, &ge.y) + field.fe_carry_inv(&u, &z_minus_y) + field.fe_carry_mul(&u, &y_plus_z, field.fe_relax_cast(&u)) + + dst_ := (^[32]byte)(raw_data(dst)) + field.fe_to_bytes(dst_, &u) + + field.fe_clear_vec([]^field.Loose_Field_Element{&y_plus_z, &z_minus_y}) + field.fe_clear(&u) + ed.sc_clear(&sc) + ed.ge_clear(&ge) + } } From d438f27efb3f74c1baf2125c480538ba739c9e5d Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Wed, 28 Jan 2026 23:04:38 +0900 Subject: [PATCH 282/766] core/crypto/_chacha20: Use the precomputation trick for ref Might as well bring this in sync with the runtime chacha8 version of the code since this is faster. --- core/crypto/_chacha20/ref/chacha20_ref.odin | 287 ++++---------------- 1 file changed, 60 insertions(+), 227 deletions(-) diff --git a/core/crypto/_chacha20/ref/chacha20_ref.odin b/core/crypto/_chacha20/ref/chacha20_ref.odin index c111c1c76..c4e6bca98 100644 --- a/core/crypto/_chacha20/ref/chacha20_ref.odin +++ b/core/crypto/_chacha20/ref/chacha20_ref.odin @@ -4,133 +4,68 @@ import "core:crypto/_chacha20" import "core:encoding/endian" import "core:math/bits" +// At least with LLVM21 force_inline produces identical perf to +// manual inlining, yay. +@(private) +quarter_round :: #force_inline proc "contextless" (a, b, c, d: u32) -> (u32, u32, u32, u32) { + a, b, c, d := a, b, c, d + + a += b + d ~= a + d = bits.rotate_left32(d, 16) + + c += d + b ~= c + b = bits.rotate_left32(b, 12) + + a += b + d ~= a + d = bits.rotate_left32(d, 8) + + c += d + b ~= c + b = bits.rotate_left32(b, 7) + + return a, b, c, d +} + stream_blocks :: proc(ctx: ^_chacha20.Context, dst, src: []byte, nr_blocks: int) { // Enforce the maximum consumed keystream per IV. _chacha20.check_counter_limit(ctx, nr_blocks) dst, src := dst, src x := &ctx._s + + + // Filippo Valsorda made an observation that only one of the column + // round depends on the counter (s12), so it is worth precomputing + // and reusing across multiple blocks. As far as I know, only Go's + // chacha implementation does this. + + p1, p5, p9, p13 := quarter_round(_chacha20.SIGMA_1, x[5], x[9], x[13]) + p2, p6, p10, p14 := quarter_round(_chacha20.SIGMA_2, x[6], x[10], x[14]) + p3, p7, p11, p15 := quarter_round(_chacha20.SIGMA_3, x[7], x[11], x[15]) + for n := 0; n < nr_blocks; n = n + 1 { - x0, x1, x2, x3 := - _chacha20.SIGMA_0, _chacha20.SIGMA_1, _chacha20.SIGMA_2, _chacha20.SIGMA_3 - x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 := - x[4], x[5], x[6], x[7], x[8], x[9], x[10], x[11], x[12], x[13], x[14], x[15] + // First column round that depends on the counter + p0, p4, p8, p12 := quarter_round(_chacha20.SIGMA_0, x[4], x[8], x[12]) - for i := _chacha20.ROUNDS; i > 0; i = i - 2 { - // Even when forcing inlining manually inlining all of - // these is decently faster. + // First diagonal round + x0, x5, x10, x15 := quarter_round(p0, p5, p10, p15) + x1, x6, x11, x12 := quarter_round(p1, p6, p11, p12) + x2, x7, x8, x13 := quarter_round(p2, p7, p8, p13) + x3, x4, x9, x14 := quarter_round(p3, p4, p9, p14) - // quarterround(x, 0, 4, 8, 12) - x0 += x4 - x12 ~= x0 - x12 = bits.rotate_left32(x12, 16) - x8 += x12 - x4 ~= x8 - x4 = bits.rotate_left32(x4, 12) - x0 += x4 - x12 ~= x0 - x12 = bits.rotate_left32(x12, 8) - x8 += x12 - x4 ~= x8 - x4 = bits.rotate_left32(x4, 7) + for i := _chacha20.ROUNDS - 2; i > 0; i = i - 2 { + x0, x4, x8, x12 = quarter_round(x0, x4, x8, x12) + x1, x5, x9, x13 = quarter_round(x1, x5, x9, x13) + x2, x6, x10, x14 = quarter_round(x2, x6, x10, x14) + x3, x7, x11, x15 = quarter_round(x3, x7, x11, x15) - // quarterround(x, 1, 5, 9, 13) - x1 += x5 - x13 ~= x1 - x13 = bits.rotate_left32(x13, 16) - x9 += x13 - x5 ~= x9 - x5 = bits.rotate_left32(x5, 12) - x1 += x5 - x13 ~= x1 - x13 = bits.rotate_left32(x13, 8) - x9 += x13 - x5 ~= x9 - x5 = bits.rotate_left32(x5, 7) - - // quarterround(x, 2, 6, 10, 14) - x2 += x6 - x14 ~= x2 - x14 = bits.rotate_left32(x14, 16) - x10 += x14 - x6 ~= x10 - x6 = bits.rotate_left32(x6, 12) - x2 += x6 - x14 ~= x2 - x14 = bits.rotate_left32(x14, 8) - x10 += x14 - x6 ~= x10 - x6 = bits.rotate_left32(x6, 7) - - // quarterround(x, 3, 7, 11, 15) - x3 += x7 - x15 ~= x3 - x15 = bits.rotate_left32(x15, 16) - x11 += x15 - x7 ~= x11 - x7 = bits.rotate_left32(x7, 12) - x3 += x7 - x15 ~= x3 - x15 = bits.rotate_left32(x15, 8) - x11 += x15 - x7 ~= x11 - x7 = bits.rotate_left32(x7, 7) - - // quarterround(x, 0, 5, 10, 15) - x0 += x5 - x15 ~= x0 - x15 = bits.rotate_left32(x15, 16) - x10 += x15 - x5 ~= x10 - x5 = bits.rotate_left32(x5, 12) - x0 += x5 - x15 ~= x0 - x15 = bits.rotate_left32(x15, 8) - x10 += x15 - x5 ~= x10 - x5 = bits.rotate_left32(x5, 7) - - // quarterround(x, 1, 6, 11, 12) - x1 += x6 - x12 ~= x1 - x12 = bits.rotate_left32(x12, 16) - x11 += x12 - x6 ~= x11 - x6 = bits.rotate_left32(x6, 12) - x1 += x6 - x12 ~= x1 - x12 = bits.rotate_left32(x12, 8) - x11 += x12 - x6 ~= x11 - x6 = bits.rotate_left32(x6, 7) - - // quarterround(x, 2, 7, 8, 13) - x2 += x7 - x13 ~= x2 - x13 = bits.rotate_left32(x13, 16) - x8 += x13 - x7 ~= x8 - x7 = bits.rotate_left32(x7, 12) - x2 += x7 - x13 ~= x2 - x13 = bits.rotate_left32(x13, 8) - x8 += x13 - x7 ~= x8 - x7 = bits.rotate_left32(x7, 7) - - // quarterround(x, 3, 4, 9, 14) - x3 += x4 - x14 ~= x3 - x14 = bits.rotate_left32(x14, 16) - x9 += x14 - x4 ~= x9 - x4 = bits.rotate_left32(x4, 12) - x3 += x4 - x14 ~= x3 - x14 = bits.rotate_left32(x14, 8) - x9 += x14 - x4 ~= x9 - x4 = bits.rotate_left32(x4, 7) + x0, x5, x10, x15 = quarter_round(x0, x5, x10, x15) + x1, x6, x11, x12 = quarter_round(x1, x6, x11, x12) + x2, x7, x8, x13 = quarter_round(x2, x7, x8, x13) + x3, x4, x9, x14 = quarter_round(x3, x4, x9, x14) } x0 += _chacha20.SIGMA_0 @@ -236,117 +171,15 @@ hchacha20 :: proc "contextless" (dst, key, iv: []byte) { x15 := endian.unchecked_get_u32le(iv[12:16]) for i := _chacha20.ROUNDS; i > 0; i = i - 2 { - // quarterround(x, 0, 4, 8, 12) - x0 += x4 - x12 ~= x0 - x12 = bits.rotate_left32(x12, 16) - x8 += x12 - x4 ~= x8 - x4 = bits.rotate_left32(x4, 12) - x0 += x4 - x12 ~= x0 - x12 = bits.rotate_left32(x12, 8) - x8 += x12 - x4 ~= x8 - x4 = bits.rotate_left32(x4, 7) + x0, x4, x8, x12 = quarter_round(x0, x4, x8, x12) + x1, x5, x9, x13 = quarter_round(x1, x5, x9, x13) + x2, x6, x10, x14 = quarter_round(x2, x6, x10, x14) + x3, x7, x11, x15 = quarter_round(x3, x7, x11, x15) - // quarterround(x, 1, 5, 9, 13) - x1 += x5 - x13 ~= x1 - x13 = bits.rotate_left32(x13, 16) - x9 += x13 - x5 ~= x9 - x5 = bits.rotate_left32(x5, 12) - x1 += x5 - x13 ~= x1 - x13 = bits.rotate_left32(x13, 8) - x9 += x13 - x5 ~= x9 - x5 = bits.rotate_left32(x5, 7) - - // quarterround(x, 2, 6, 10, 14) - x2 += x6 - x14 ~= x2 - x14 = bits.rotate_left32(x14, 16) - x10 += x14 - x6 ~= x10 - x6 = bits.rotate_left32(x6, 12) - x2 += x6 - x14 ~= x2 - x14 = bits.rotate_left32(x14, 8) - x10 += x14 - x6 ~= x10 - x6 = bits.rotate_left32(x6, 7) - - // quarterround(x, 3, 7, 11, 15) - x3 += x7 - x15 ~= x3 - x15 = bits.rotate_left32(x15, 16) - x11 += x15 - x7 ~= x11 - x7 = bits.rotate_left32(x7, 12) - x3 += x7 - x15 ~= x3 - x15 = bits.rotate_left32(x15, 8) - x11 += x15 - x7 ~= x11 - x7 = bits.rotate_left32(x7, 7) - - // quarterround(x, 0, 5, 10, 15) - x0 += x5 - x15 ~= x0 - x15 = bits.rotate_left32(x15, 16) - x10 += x15 - x5 ~= x10 - x5 = bits.rotate_left32(x5, 12) - x0 += x5 - x15 ~= x0 - x15 = bits.rotate_left32(x15, 8) - x10 += x15 - x5 ~= x10 - x5 = bits.rotate_left32(x5, 7) - - // quarterround(x, 1, 6, 11, 12) - x1 += x6 - x12 ~= x1 - x12 = bits.rotate_left32(x12, 16) - x11 += x12 - x6 ~= x11 - x6 = bits.rotate_left32(x6, 12) - x1 += x6 - x12 ~= x1 - x12 = bits.rotate_left32(x12, 8) - x11 += x12 - x6 ~= x11 - x6 = bits.rotate_left32(x6, 7) - - // quarterround(x, 2, 7, 8, 13) - x2 += x7 - x13 ~= x2 - x13 = bits.rotate_left32(x13, 16) - x8 += x13 - x7 ~= x8 - x7 = bits.rotate_left32(x7, 12) - x2 += x7 - x13 ~= x2 - x13 = bits.rotate_left32(x13, 8) - x8 += x13 - x7 ~= x8 - x7 = bits.rotate_left32(x7, 7) - - // quarterround(x, 3, 4, 9, 14) - x3 += x4 - x14 ~= x3 - x14 = bits.rotate_left32(x14, 16) - x9 += x14 - x4 ~= x9 - x4 = bits.rotate_left32(x4, 12) - x3 += x4 - x14 ~= x3 - x14 = bits.rotate_left32(x14, 8) - x9 += x14 - x4 ~= x9 - x4 = bits.rotate_left32(x4, 7) + x0, x5, x10, x15 = quarter_round(x0, x5, x10, x15) + x1, x6, x11, x12 = quarter_round(x1, x6, x11, x12) + x2, x7, x8, x13 = quarter_round(x2, x7, x8, x13) + x3, x4, x9, x14 = quarter_round(x3, x4, x9, x14) } endian.unchecked_put_u32le(dst[0:4], x0) From 16881e256d5512024dfc85eea2c324cc4241bd99 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 28 Jan 2026 15:24:21 +0000 Subject: [PATCH 283/766] Fix absolute and volume name checks on Windows --- core/os/os2/path_windows.odin | 4 ++ core/path/filepath/path.odin | 71 ++++++++++++++++++++-------- core/path/filepath/path_windows.odin | 3 ++ 3 files changed, 58 insertions(+), 20 deletions(-) diff --git a/core/os/os2/path_windows.odin b/core/os/os2/path_windows.odin index 1225ab2ce..ce3828755 100644 --- a/core/os/os2/path_windows.odin +++ b/core/os/os2/path_windows.odin @@ -283,6 +283,10 @@ _is_absolute_path :: proc(path: string) -> bool { if _is_reserved_name(path) { return true } + if len(path) > 0 && _is_path_separator(path[0]) { + return true + } + l := _volume_name_len(path) if l == 0 { return false diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index 14a9181c3..d5ba76342 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -49,35 +49,66 @@ volume_name_len :: proc(path: string) -> int { if len(path) < 2 { return 0 } - c := path[0] + if path[1] == ':' { - switch c { + switch path[0] { case 'a'..='z', 'A'..='Z': return 2 } } - // URL: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx - if l := len(path); l >= 5 && is_slash(path[0]) && is_slash(path[1]) && - !is_slash(path[2]) && path[2] != '.' { - for n := 3; n < l-1; n += 1 { - if is_slash(path[n]) { - n += 1 - if !is_slash(path[n]) { - if path[n] == '.' { - break - } - } - for ; n < l; n += 1 { - if is_slash(path[n]) { - break - } - } - return n + /* + See: URL: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx + Further allowed paths can be of the form of: + - \\server\share or \\server\share\more\path + - \\?\C:\... + - \\.\PhysicalDriveX + */ + // Any remaining kind of path has to start with two slashes. + if !is_separator(path[0]) || !is_separator(path[1]) { + return 0 + } + + // Device path. The volume name is the whole string + if len(path) >= 5 && path[2] == '.' && is_separator(path[3]) { + return len(path) + } + + // We're a UNC share `\\host\share`, file namespace `\\?\C:` or UNC in file namespace `\\?\\host\share` + prefix := 2 + + // File namespace. + if len(path) >= 5 && path[2] == '?' && is_separator(path[3]) { + if is_separator(path[4]) { + // `\\?\\` UNC path in file namespace + prefix = 5 + } + + if len(path) >= 6 && path[5] == ':' { + switch path[4] { + case 'a'..='z', 'A'..='Z': + return 6 + case: + return 0 } - break } } + + // UNC path, minimum version of the volume is `\\h\s` for host, share. + // Can also contain an IP address in the host position. + slash_count := 0 + for i in prefix.. 0 { + slash_count += 1 + + if slash_count == 2 { + return i + } + } + } + + return len(path) } return 0 } diff --git a/core/path/filepath/path_windows.odin b/core/path/filepath/path_windows.odin index b3f4eee9e..d7549a42c 100644 --- a/core/path/filepath/path_windows.odin +++ b/core/path/filepath/path_windows.odin @@ -36,6 +36,9 @@ is_abs :: proc(path: string) -> bool { if is_reserved_name(path) { return true } + if len(path) > 0 && is_slash(path[0]) { + return true + } l := volume_name_len(path) if l == 0 { return false From 37c2f6882419c8811d9fc9238873668b82a40a04 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 28 Jan 2026 15:30:23 +0000 Subject: [PATCH 284/766] Allow #unroll for arrays of fixed length which are not constants --- src/check_stmt.cpp | 4 +++- src/llvm_backend_stmt.cpp | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 835f0162a..2dc621a84 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1027,7 +1027,9 @@ gb_internal void check_unroll_range_stmt(CheckerContext *ctx, Ast *node, u32 mod error(operand.expr, "Cannot iterate over '%s' of type '%s' in an '#unroll for' statement", s, t); gb_string_free(t); gb_string_free(s); - } else if (operand.mode != Addressing_Constant && unroll_count <= 0) { + } else if (operand.mode != Addressing_Constant && ( + unroll_count <= 0 && + compare_exact_values(Token_CmpEq, inline_for_depth, exact_value_i64(0)))) { error(operand.expr, "An '#unroll for' expression must be known at compile time"); } } diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index b3b5f4251..81755af2d 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1434,12 +1434,13 @@ gb_internal void lb_build_unroll_range_stmt(lbProcedure *p, AstUnrollRangeStmt * if (unroll_count_ev.kind == ExactValue_Invalid) { - GB_ASSERT(expr->tav.mode == Addressing_Constant); Type *t = base_type(expr->tav.type); switch (t->kind) { case Type_Basic: + GB_ASSERT(expr->tav.mode == Addressing_Constant); + GB_ASSERT(is_type_string(t)); { ExactValue value = expr->tav.value; From f2b0f63b811584b2a79a47943bc1299172723d85 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 28 Jan 2026 17:26:19 +0000 Subject: [PATCH 285/766] Use clean paths to calculate volumes --- core/path/filepath/path.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index d5ba76342..dbad98fa1 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -399,8 +399,8 @@ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> ( return strings.clone(".", allocator), .None } - base_vol := volume_name(base_path) - target_vol := volume_name(target_path) + base_vol := volume_name(base_clean) + target_vol := volume_name(target_clean) base := base_clean [len(base_vol):] target := target_clean[len(target_vol):] if base == "." { From f6322b4b31fb0a5cc343d4bae31ebc09639e3403 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Wed, 28 Jan 2026 14:18:30 -0500 Subject: [PATCH 286/766] Fix for vet flags. All combinations of vet flags on the command line and top of file are working --- src/parser.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index af533d9a3..1f08eaec1 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6383,7 +6383,7 @@ gb_internal String vet_tag_get_token(String s, String *out, bool allow_colon) { } -gb_internal u64 parse_vet_tag(Token token_for_pos, String s) { +gb_internal u64 parse_vet_tag(Token token_for_pos, String s, u64 base_vet_flags) { String const prefix = str_lit("vet"); GB_ASSERT(string_starts_with(s, prefix)); if (build_require_space_after(s, prefix)) { @@ -6392,7 +6392,7 @@ gb_internal u64 parse_vet_tag(Token token_for_pos, String s) { } s = string_trim_whitespace(substring(s, prefix.len, s.len)); - u64 vet_flags = build_context.vet_flags; + u64 vet_flags = base_vet_flags; if (s.len == 0) { vet_flags |= VetFlag_All; @@ -6624,7 +6624,7 @@ gb_internal bool parse_file_tag(const String &lc, const Token &tok, AstFile *f) return false; } } else if (string_starts_with(lc, str_lit("vet"))) { - f->vet_flags = parse_vet_tag(tok, lc); + f->vet_flags = parse_vet_tag(tok, lc, ast_file_vet_flags(f)); f->vet_flags_set = true; } else if (string_starts_with(lc, str_lit("test"))) { if ((build_context.command_kind & Command_test) == 0) { From 4a7fb4666722b3ff45998c3bc11f03150a2fe53f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 29 Jan 2026 09:21:31 +0000 Subject: [PATCH 287/766] Complete `is_type_simple_compare` `switch` rules --- src/types.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/types.cpp b/src/types.cpp index 911cd4448..03ff95033 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -2701,6 +2701,7 @@ gb_internal bool is_type_simple_compare(Type *t) { case Type_SoaPointer: case Type_Proc: case Type_BitSet: + case Type_BitField: return true; case Type_Matrix: @@ -2728,6 +2729,16 @@ gb_internal bool is_type_simple_compare(Type *t) { case Type_SimdVector: return is_type_simple_compare(t->SimdVector.elem); + case Type_Tuple: + if (t->Tuple.variables.count == 1) { + return is_type_simple_compare(t->Tuple.variables[0]->type); + } + break; + + case Type_Slice: + case Type_DynamicArray: + case Type_Map: + return false; } return false; From 07d814d9cf3bf2065e4122dba91817935dca7c60 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 29 Jan 2026 10:48:05 +0000 Subject: [PATCH 288/766] Add `struct #simple` to force a struct to use simple comparison if all of the fields "nearly simply comparable". --- base/runtime/core.odin | 1 + base/runtime/print.odin | 2 ++ core/odin/ast/ast.odin | 1 + core/odin/parser/parser.odin | 7 +++++++ core/reflect/types.odin | 5 +++-- src/check_expr.cpp | 6 ++++-- src/check_type.cpp | 15 +++++++++++++++ src/parser.cpp | 13 ++++++++++--- src/parser.hpp | 1 + src/types.cpp | 25 +++++++++++++++++++++++-- 10 files changed, 67 insertions(+), 9 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 58a0b8ad1..5a0b3766c 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -122,6 +122,7 @@ Type_Info_Struct_Flag :: enum u8 { raw_union = 1, all_or_none = 2, align = 3, + simple = 4, } Type_Info_Struct :: struct { diff --git a/base/runtime/print.odin b/base/runtime/print.odin index 2deb0f4b1..2cdde8152 100644 --- a/base/runtime/print.odin +++ b/base/runtime/print.odin @@ -421,6 +421,7 @@ print_type :: #force_no_inline proc "contextless" (ti: ^Type_Info) { if .packed in info.flags { print_string("#packed ") } if .raw_union in info.flags { print_string("#raw_union ") } if .all_or_none in info.flags { print_string("#all_or_none ") } + if .simple in info.flags { print_string("#simple ") } if .align in info.flags { print_string("#align(") print_u64(u64(ti.align)) @@ -835,6 +836,7 @@ write_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, t if .packed in info.flags { write_string(i, buf, "#packed ") or_return } if .raw_union in info.flags { write_string(i, buf, "#raw_union ") or_return } if .all_or_none in info.flags { write_string(i, buf, "#all_or_none ") or_return } + if .simple in info.flags { write_string(i, buf, "#simple ") or_return } if .align in info.flags { write_string(i, buf, "#align(") or_return write_u64(i, buf, u64(ti.align)) or_return diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 6755ca4d0..ec22db434 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -798,6 +798,7 @@ Struct_Type :: struct { is_raw_union: bool, is_no_copy: bool, is_all_or_none: bool, + is_simple: bool, fields: ^Field_List, name_count: int, } diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 719cb0374..a18942e6b 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2667,6 +2667,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { is_raw_union: bool is_no_copy: bool is_all_or_none: bool + is_simple: bool fields: ^ast.Field_List name_count: int @@ -2695,6 +2696,11 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { error(p, tag.pos, "duplicate struct tag '#%s'", tag.text) } is_all_or_none = true + case "simple": + if is_simple { + error(p, tag.pos, "duplicate struct tag '#%s'", tag.text) + } + is_simple = true case "align": if align != nil { error(p, tag.pos, "duplicate struct tag '#%s'", tag.text) @@ -2769,6 +2775,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { st.is_raw_union = is_raw_union st.is_no_copy = is_no_copy st.is_all_or_none = is_all_or_none + st.is_simple = is_simple st.fields = fields st.name_count = name_count st.where_token = where_token diff --git a/core/reflect/types.odin b/core/reflect/types.odin index d6d7011d1..385edb19b 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -696,9 +696,10 @@ write_type_writer :: #force_no_inline proc(w: io.Writer, ti: ^Type_Info, n_writt } io.write_string(w, "struct ", &n) or_return - if .packed in info.flags { io.write_string(w, "#packed ", &n) or_return } - if .raw_union in info.flags { io.write_string(w, "#raw_union ", &n) or_return } + if .packed in info.flags { io.write_string(w, "#packed ", &n) or_return } + if .raw_union in info.flags { io.write_string(w, "#raw_union ", &n) or_return } if .all_or_none in info.flags { io.write_string(w, "#all_or_none ", &n) or_return } + if .simple in info.flags { io.write_string(w, "#simple ", &n) or_return } if .align in info.flags { io.write_string(w, "#align(", &n) or_return io.write_i64(w, i64(ti.align), 10, &n) or_return diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 46455aacf..36b4f6ec6 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -12692,8 +12692,10 @@ gb_internal gbString write_expr_to_string(gbString str, Ast *node, bool shorthan str = write_expr_to_string(str, st->polymorphic_params, shorthand); str = gb_string_appendc(str, ") "); } - if (st->is_packed) str = gb_string_appendc(str, "#packed "); - if (st->is_raw_union) str = gb_string_appendc(str, "#raw_union "); + if (st->is_packed) str = gb_string_appendc(str, "#packed "); + if (st->is_raw_union) str = gb_string_appendc(str, "#raw_union "); + if (st->is_all_or_none) str = gb_string_appendc(str, "#all_or_none "); + if (st->is_simple) str = gb_string_appendc(str, "#simple "); if (st->align) { str = gb_string_appendc(str, "#align "); str = write_expr_to_string(str, st->align, shorthand); diff --git a/src/check_type.cpp b/src/check_type.cpp index 4b8f7b6ac..41c5f48d1 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -679,6 +679,21 @@ gb_internal void check_struct_type(CheckerContext *ctx, Type *struct_type, Ast * gb_unused(where_clause_ok); } check_struct_fields(ctx, node, &struct_type->Struct.fields, &struct_type->Struct.tags, st->fields, min_field_count, struct_type, context); + + if (st->is_simple) { + bool success = true; + for (Entity *f : struct_type->Struct.fields) { + if (!is_type_nearly_simple_compare(f->type)) { + gbString s = type_to_string(f->type); + error(f->token, "'struct #simple' requires all fields to be at least 'nearly simple compare', got %s", s); + gb_string_free(s); + } + } + if (success) { + struct_type->Struct.is_simple = true; + } + } + wait_signal_set(&struct_type->Struct.fields_wait_signal); } diff --git a/src/parser.cpp b/src/parser.cpp index af533d9a3..2eb559e06 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1230,7 +1230,7 @@ gb_internal Ast *ast_dynamic_array_type(AstFile *f, Token token, Ast *elem) { } gb_internal Ast *ast_struct_type(AstFile *f, Token token, Slice fields, isize field_count, - Ast *polymorphic_params, bool is_packed, bool is_raw_union, bool is_all_or_none, + Ast *polymorphic_params, bool is_packed, bool is_raw_union, bool is_all_or_none, bool is_simple, Ast *align, Ast *min_field_align, Ast *max_field_align, Token where_token, Array const &where_clauses) { Ast *result = alloc_ast_node(f, Ast_StructType); @@ -1241,6 +1241,7 @@ gb_internal Ast *ast_struct_type(AstFile *f, Token token, Slice fields, i result->StructType.is_packed = is_packed; result->StructType.is_raw_union = is_raw_union; result->StructType.is_all_or_none = is_all_or_none; + result->StructType.is_simple = is_simple; result->StructType.align = align; result->StructType.min_field_align = min_field_align; result->StructType.max_field_align = max_field_align; @@ -2788,6 +2789,7 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { bool is_packed = false; bool is_all_or_none = false; bool is_raw_union = false; + bool is_simple = false; Ast *align = nullptr; Ast *min_field_align = nullptr; Ast *max_field_align = nullptr; @@ -2869,11 +2871,16 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { error_line("\tSuggestion: #max_field_align(%s)", s); gb_string_free(s); } - }else if (tag.string == "raw_union") { + } else if (tag.string == "raw_union") { if (is_raw_union) { syntax_error(tag, "Duplicate struct tag '#%.*s'", LIT(tag.string)); } is_raw_union = true; + } else if (tag.string == "simple") { + if (is_simple) { + syntax_error(tag, "Duplicate struct tag '#%.*s'", LIT(tag.string)); + } + is_simple = true; } else { syntax_error(tag, "Invalid struct tag '#%.*s'", LIT(tag.string)); } @@ -2919,7 +2926,7 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { parser_check_polymorphic_record_parameters(f, polymorphic_params); return ast_struct_type(f, token, decls, name_count, - polymorphic_params, is_packed, is_raw_union, is_all_or_none, + polymorphic_params, is_packed, is_raw_union, is_all_or_none, is_simple, align, min_field_align, max_field_align, where_token, where_clauses); } break; diff --git a/src/parser.hpp b/src/parser.hpp index 011330438..39f56ffae 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -780,6 +780,7 @@ AST_KIND(_TypeBegin, "", bool) \ bool is_raw_union; \ bool is_no_copy; \ bool is_all_or_none; \ + bool is_simple; \ }) \ AST_KIND(UnionType, "union type", struct { \ Scope *scope; \ diff --git a/src/types.cpp b/src/types.cpp index 03ff95033..a7f2bfda2 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -163,6 +163,7 @@ struct TypeStruct { bool is_packed : 1; bool is_raw_union : 1; bool is_all_or_none : 1; + bool is_simple : 1; bool is_poly_specialized : 1; std::atomic are_offsets_being_processed; @@ -2708,6 +2709,9 @@ gb_internal bool is_type_simple_compare(Type *t) { return is_type_simple_compare(t->Matrix.elem); case Type_Struct: + if (t->Struct.is_simple) { + return true; + } for_array(i, t->Struct.fields) { Entity *f = t->Struct.fields[i]; if (!is_type_simple_compare(f->type)) { @@ -2768,12 +2772,16 @@ gb_internal bool is_type_nearly_simple_compare(Type *t) { case Type_SoaPointer: case Type_Proc: case Type_BitSet: + case Type_BitField: return true; case Type_Matrix: return is_type_nearly_simple_compare(t->Matrix.elem); case Type_Struct: + if (t->Struct.is_simple) { + return true; + } for_array(i, t->Struct.fields) { Entity *f = t->Struct.fields[i]; if (!is_type_nearly_simple_compare(f->type)) { @@ -2795,6 +2803,17 @@ gb_internal bool is_type_nearly_simple_compare(Type *t) { case Type_SimdVector: return is_type_nearly_simple_compare(t->SimdVector.elem); + case Type_Tuple: + if (t->Tuple.variables.count == 1) { + return is_type_nearly_simple_compare(t->Tuple.variables[0]->type); + } + break; + + case Type_Slice: + case Type_DynamicArray: + case Type_Map: + return false; + } return false; @@ -5110,9 +5129,11 @@ gb_internal gbString write_type_to_string(gbString str, Type *type, bool shortha str = gb_string_appendc(str, ")"); } - if (type->Struct.is_packed) str = gb_string_appendc(str, " #packed"); - if (type->Struct.is_raw_union) str = gb_string_appendc(str, " #raw_union"); + if (type->Struct.is_packed) str = gb_string_appendc(str, " #packed"); + if (type->Struct.is_raw_union) str = gb_string_appendc(str, " #raw_union"); if (type->Struct.custom_align != 0) str = gb_string_append_fmt(str, " #align %d", cast(int)type->Struct.custom_align); + if (type->Struct.is_all_or_none) str = gb_string_appendc(str, " #all_or_none"); + if (type->Struct.is_simple) str = gb_string_appendc(str, " #simple"); str = gb_string_appendc(str, " {"); From 67541434f41de1eaeaa99cda0a0e3d0992869081 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 29 Jan 2026 11:58:37 +0000 Subject: [PATCH 289/766] Remove else check for untyped to typed --- src/check_expr.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 36b4f6ec6..1c09ad908 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4704,12 +4704,14 @@ gb_internal void convert_to_typed(CheckerContext *c, Operand *operand, Type *tar switch (t->kind) { case Type_Basic: if (operand->mode == Addressing_Constant) { - check_is_expressible(c, operand, t); + check_is_expressible(c, operand, target_type); if (operand->mode == Addressing_Invalid) { return; } update_untyped_expr_value(c, operand->expr, operand->value); - } else { + } + + { switch (operand->type->Basic.kind) { case Basic_UntypedBool: if (!is_type_boolean(target_type)) { From 7125782bd2743084d804269fa57dd65f6e862033 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 30 Jan 2026 10:46:35 +0000 Subject: [PATCH 290/766] Support `-linker:mold` on FreeBSD and NetBSD; Remove `-use-lld` and `-use-radlink` --- src/linker.cpp | 2 +- src/main.cpp | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/linker.cpp b/src/linker.cpp index c68417994..bc6268049 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -174,7 +174,7 @@ try_cross_linking:; switch (build_context.linker_choice) { case Linker_Default: break; case Linker_lld: section_name = str_lit("lld-link"); break; - #if defined(GB_SYSTEM_LINUX) + #if defined(GB_SYSTEM_LINUX) || defined(GB_SYSTEM_FREEBSD) || defined(GB_SYSTEM_NETBSD) case Linker_mold: section_name = str_lit("mold-link"); break; #endif #if defined(GB_SYSTEM_WINDOWS) diff --git a/src/main.cpp b/src/main.cpp index 499b8a5ff..624869e65 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -324,8 +324,6 @@ enum BuildFlagKind { BuildFlag_NoCRT, BuildFlag_NoRPath, BuildFlag_NoEntryPoint, - BuildFlag_UseLLD, - BuildFlag_UseRADLink, BuildFlag_Linker, BuildFlag_UseSeparateModules, BuildFlag_UseSingleModule, @@ -556,8 +554,6 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_NoRPath, str_lit("no-rpath"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_NoEntryPoint, str_lit("no-entry-point"), BuildFlagParam_None, Command__does_check &~ Command_test); - add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None, Command__does_build); - add_flag(&build_flags, BuildFlag_UseRADLink, str_lit("radlink"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_Linker, str_lit("linker"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_UseSeparateModules, str_lit("use-separate-modules"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_UseSingleModule, str_lit("use-single-module"), BuildFlagParam_None, Command__does_build); @@ -1256,14 +1252,6 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_NoThreadLocal: build_context.no_thread_local = true; break; - case BuildFlag_UseLLD: - gb_printf_err("Warning: Use of -lld has been deprecated in favour of -linker:lld\n"); - build_context.linker_choice = Linker_lld; - break; - case BuildFlag_UseRADLink: - gb_printf_err("Warning: Use of -lld has been deprecated in favour of -linker:radlink\n"); - build_context.linker_choice = Linker_radlink; - break; case BuildFlag_Linker: { GB_ASSERT(value.kind == ExactValue_String); From 2397633618d4cc06a8e72164d2db77b317f983b4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 30 Jan 2026 12:14:59 +0000 Subject: [PATCH 291/766] Update `demo.odin` --- examples/demo/demo.odin | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index 1ea06d096..294668f14 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -1,5 +1,5 @@ #+vet !using-stmt !using-param -#+feature dynamic-literals +#+feature dynamic-literals using-stmt package main import "core:fmt" @@ -751,6 +751,11 @@ union_type :: proc() { } using_statement :: proc() { + // IMPORTANT NOTE: `using` as a statement is an opt-in feature which can be abled + // by adding `#+feature using-stmt` to be beginning of the file + // + // `using` as a struct field modifier remains available always + fmt.println("\n# using statement") // using can used to bring entities declared in a scope/namespace // into the current scope. This can be applied to import names, struct From 4b33c6a36134f665455f26f39bdc4cd6bbf49384 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 30 Jan 2026 12:16:54 +0000 Subject: [PATCH 292/766] Revert build.bat --- build.bat | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/build.bat b/build.bat index 017bdc09c..32c2ae658 100644 --- a/build.bat +++ b/build.bat @@ -130,22 +130,20 @@ set linker_settings=%libs% %odin_res% %linker_flags% del *.pdb > NUL 2> NUL del *.ilk > NUL 2> NUL -rem rc %rc_flags% %odin_rc% +rc %rc_flags% %odin_rc% cl %compiler_settings% "src\main.cpp" "src\libtommath.cpp" /link %linker_settings% -OUT:%exe_name% if %errorlevel% neq 0 goto end_of_build -rem mt -nologo -inputresource:%exe_name%;#1 -manifest misc\odin.manifest -outputresource:%exe_name%;#1 -validate_manifest -identity:"odin, processorArchitecture=amd64, version=%odin_version_full%, type=win32" -rem if %errorlevel% neq 0 goto end_of_build +mt -nologo -inputresource:%exe_name%;#1 -manifest misc\odin.manifest -outputresource:%exe_name%;#1 -validate_manifest -identity:"odin, processorArchitecture=amd64, version=%odin_version_full%, type=win32" +if %errorlevel% neq 0 goto end_of_build -rem call build_vendor.bat -rem if %errorlevel% neq 0 goto end_of_build +call build_vendor.bat +if %errorlevel% neq 0 goto end_of_build rem If the demo doesn't run for you and your CPU is more than a decade old, try -microarch:native -rem if %release_mode% EQU 0 odin run examples/demo -vet -strict-style -resource:examples/demo/demo.rc -- Hellope World - -W:\Odin\odin run examples/bug +if %release_mode% EQU 0 odin run examples/demo -vet -strict-style -resource:examples/demo/demo.rc -- Hellope World rem Many non-compiler devs seem to run debug build but don't realize. -rem if %release_mode% EQU 0 echo: & echo Debug compiler built. Note: run "build.bat release" if you want a faster, release mode compiler. +if %release_mode% EQU 0 echo: & echo Debug compiler built. Note: run "build.bat release" if you want a faster, release mode compiler. del *.obj > NUL 2> NUL From fb9377df17ecd0261ac33b79710e96e09fff6c43 Mon Sep 17 00:00:00 2001 From: David Bader <65665893+BunterSchatten@users.noreply.github.com> Date: Fri, 30 Jan 2026 14:44:38 +0100 Subject: [PATCH 293/766] core/os: fix lookup_env_buf only working with empty buffer --- core/os/os2/env_linux.odin | 1 + core/os/os2/env_posix.odin | 1 + core/os/os2/env_wasi.odin | 1 + core/os/os_darwin.odin | 1 + core/os/os_freebsd.odin | 1 + core/os/os_haiku.odin | 1 + core/os/os_linux.odin | 1 + core/os/os_netbsd.odin | 1 + core/os/os_openbsd.odin | 1 + 9 files changed, 9 insertions(+) diff --git a/core/os/os2/env_linux.odin b/core/os/os2/env_linux.odin index faee5c5ab..7855fbfed 100644 --- a/core/os/os2/env_linux.odin +++ b/core/os/os2/env_linux.odin @@ -282,6 +282,7 @@ when ODIN_NO_CRT { return "", .Buffer_Full } else { copy(buf, key) + buf[len(key)] = 0 } cval := posix.getenv(cstring(raw_data(buf))) diff --git a/core/os/os2/env_posix.odin b/core/os/os2/env_posix.odin index 8b5f2082e..72a1daf18 100644 --- a/core/os/os2/env_posix.odin +++ b/core/os/os2/env_posix.odin @@ -35,6 +35,7 @@ _lookup_env_buf :: proc(buf: []u8, key: string) -> (value: string, error: Error) return "", .Buffer_Full } else { copy(buf, key) + buf[len(key)] = 0 } cval := posix.getenv(cstring(raw_data(buf))) diff --git a/core/os/os2/env_wasi.odin b/core/os/os2/env_wasi.odin index b126d014e..cb40667cf 100644 --- a/core/os/os2/env_wasi.odin +++ b/core/os/os2/env_wasi.odin @@ -88,6 +88,7 @@ _lookup_env_buf :: proc(buf: []u8, key: string) -> (value: string, error: Error) return "", .Buffer_Full } else { copy(buf, key) + buf[len(key)] = 0 } sync.shared_guard(&g_env_mutex) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index 77b5825dd..d8f7a9577 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -1072,6 +1072,7 @@ lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) return "", .Buffer_Full } else { copy(buf, key) + buf[len(key)] = 0 } if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" { diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index 0542e10dc..82b5a2f0f 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -844,6 +844,7 @@ lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) return "", .Buffer_Full } else { copy(buf, key) + buf[len(key)] = 0 } if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" { diff --git a/core/os/os_haiku.odin b/core/os/os_haiku.odin index e7c71338b..ad984e33c 100644 --- a/core/os/os_haiku.odin +++ b/core/os/os_haiku.odin @@ -487,6 +487,7 @@ lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) return "", .Buffer_Full } else { copy(buf, key) + buf[len(key)] = 0 } if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" { diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index f0f9b401c..4c32676c6 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -963,6 +963,7 @@ lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) return "", .Buffer_Full } else { copy(buf, key) + buf[len(key)] = 0 } if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" { diff --git a/core/os/os_netbsd.odin b/core/os/os_netbsd.odin index 30511012f..640ea46cd 100644 --- a/core/os/os_netbsd.odin +++ b/core/os/os_netbsd.odin @@ -891,6 +891,7 @@ lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) return "", .Buffer_Full } else { copy(buf, key) + buf[len(key)] = 0 } if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" { diff --git a/core/os/os_openbsd.odin b/core/os/os_openbsd.odin index 50ee37dff..bf89a21f4 100644 --- a/core/os/os_openbsd.odin +++ b/core/os/os_openbsd.odin @@ -804,6 +804,7 @@ lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) return "", .Buffer_Full } else { copy(buf, key) + buf[len(key)] = 0 } if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" { From 0a05ff05a391673b7f9d095d76485706ba50e0bb Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 30 Jan 2026 23:20:31 +0100 Subject: [PATCH 294/766] nbio: fix send/recv buffer logic --- core/nbio/impl.odin | 61 +++++++++++++++++++++++++++- core/nbio/impl_linux.odin | 80 ++++++++++++++++++++++++++++--------- core/nbio/impl_posix.odin | 19 +++------ core/nbio/impl_windows.odin | 22 ++++------ core/nbio/ops.odin | 38 ++++++------------ tests/core/nbio/net.odin | 72 +++++++++++++++++++++++++++++++++ 6 files changed, 219 insertions(+), 73 deletions(-) diff --git a/core/nbio/impl.odin b/core/nbio/impl.odin index 476b8ab43..18bb7cfa9 100644 --- a/core/nbio/impl.odin +++ b/core/nbio/impl.odin @@ -6,9 +6,10 @@ import "base:intrinsics" import "core:container/pool" import "core:net" +import "core:reflect" +import "core:slice" import "core:strings" import "core:time" -import "core:reflect" @(init, private) init_thread_local_cleaner :: proc "contextless" () { @@ -238,6 +239,64 @@ warn :: proc(text: string, location := #caller_location) { context.logger.procedure(context.logger.data, .Warning, text, context.logger.options, location) } +/* +In order to: +1. Not require the caller to allocate their buffers (`op.send.bufs` and `op.recv.bufs` can be stack allocated) +2. Have `op.send.bufs` and `op.recv.bufs` be valid and the same content in the callback as when called +3. Be able to facilitate the `all` option, which requires mutating the slices (advancing them) +4. Constraint single send/recv syscalls to MAX_RW bytes + +We need to copy the input buffers twice, once for a stable copy returned to the user, +and one for the working copy that we mutate with `all` set. +*/ + +Bufs :: struct { + backing: [1][]byte, + working: struct #raw_union { + small: [1][]byte, + big: [][]byte, + }, +} + +bufs_init :: proc(bufs: ^Bufs, orig: ^[][]byte, allocator: runtime.Allocator) -> runtime.Allocator_Error { + if len(orig) > 1 { + backing := make([][]byte, len(orig)*2, allocator) or_return + bufs.working.big = backing[len(orig):] + copy(bufs.working.big, orig^) + copy(backing, orig^) + orig^ = backing[:len(orig)] + return nil + } + + bufs.backing = {orig[0]} + orig^ = bufs.backing[:] + return nil +} + +bufs_delete :: proc(bufs: ^Bufs, orig: [][]byte, allocator: runtime.Allocator) { + if len(orig) > 1 { + backing := raw_data(orig)[:len(orig)*2] + delete(backing, allocator) + } +} + +@(require_results) +bufs_to_process :: proc(bufs: ^Bufs, orig: [][]byte, processed: int) -> (working: [][]byte, total: int) { + if len(orig) > 1 { + // Reset to length and contents of backing, so a previous modification is removed. + (^runtime.Raw_Slice)(&bufs.working.big).len = len(orig) + copy(bufs.working.big, orig) + working = bufs.working.big + } else { + bufs.working.small = {orig[0]} + working = bufs.working.small[:] + } + + working = slice.advance_slices(working, processed) + working, total = constraint_bufs_to_max_rw(working) + return +} + @(require_results) constraint_bufs_to_max_rw :: proc(bufs: [][]byte) -> (constrained: [][]byte, total: int) { for buf in bufs { diff --git a/core/nbio/impl_linux.odin b/core/nbio/impl_linux.odin index 47d47d77c..f4b200830 100644 --- a/core/nbio/impl_linux.odin +++ b/core/nbio/impl_linux.odin @@ -7,7 +7,6 @@ import "core:container/pool" import "core:container/queue" import "core:mem" import "core:net" -import "core:slice" import "core:strings" import "core:sys/linux" import "core:sys/linux/uring" @@ -62,18 +61,27 @@ _Read :: struct {} @(private="package") _Write :: struct {} +Sock_Addr_Ip :: struct #raw_union { + using _: struct { + family: linux.Address_Family, + port: u16be, + }, + using ipv4: linux.Sock_Addr_In, + using ipv6: linux.Sock_Addr_In6, +} + @(private="package") _Send :: struct { - endpoint: linux.Sock_Addr_Any, - msghdr: linux.Msg_Hdr, - small_bufs: [1][]byte, + endpoint: Sock_Addr_Ip, + msghdr: linux.Msg_Hdr, + bufs: Bufs, } @(private="package") _Recv :: struct { - addr_out: linux.Sock_Addr_Any, - msghdr: linux.Msg_Hdr, - small_bufs: [1][]byte, + addr_out: Sock_Addr_Ip, + msghdr: linux.Msg_Hdr, + bufs: Bufs, } @(private="package") @@ -506,13 +514,13 @@ handle_completed :: proc(op: ^Operation, res: i32) { case .Send: if !send_callback(op, res) { return } maybe_callback(op) - if len(op.send.bufs) > 1 { delete(op.send.bufs, op.l.allocator) } + bufs_delete(&op.send._impl.bufs, op.send.bufs, op.l.allocator) cleanup(op) return case .Recv: if !recv_callback(op, res) { return } maybe_callback(op) - if len(op.recv.bufs) > 1 { delete(op.recv.bufs, op.l.allocator) } + bufs_delete(&op.recv._impl.bufs, op.recv.bufs, op.l.allocator) cleanup(op) return case .Open: @@ -678,7 +686,7 @@ accept_callback :: proc(op: ^Operation, res: i32) { op.accept.client = TCP_Socket(res) // net.set_blocking(net.TCP_Socket(op.accept.client), false) - op.accept.client_endpoint = sockaddr_storage_to_endpoint(&op.accept._impl.sockaddr) + op.accept.client_endpoint = sockaddr_storage_to_endpoint_any(&op.accept._impl.sockaddr) } dial_exec :: proc(op: ^Operation) { @@ -698,7 +706,7 @@ dial_exec :: proc(op: ^Operation) { } op.dial.socket = sock.(TCP_Socket) - op.dial._impl.sockaddr = endpoint_to_sockaddr(op.dial.endpoint) + op.dial._impl.sockaddr = endpoint_to_sockaddr_any(op.dial.endpoint) } enqueue(op, uring.connect( @@ -786,8 +794,7 @@ recv_exec :: proc(op: ^Operation) { return } - bufs := slice.advance_slices(op.recv.bufs, op.recv.received) - bufs, _ = constraint_bufs_to_max_rw(bufs) + bufs, _ := bufs_to_process(&op.recv._impl.bufs, op.recv.bufs, op.recv.received) op.recv._impl.msghdr.iov = transmute([]linux.IO_Vec)bufs sock: linux.Fd @@ -858,7 +865,7 @@ recv_callback :: proc(op: ^Operation, res: i32) -> bool { } case UDP_Socket: - op.recv.source = sockaddr_storage_to_endpoint(&op.recv._impl.addr_out) + op.recv.source = sockaddr_storage_to_endpoint_ip(&op.recv._impl.addr_out) } return true @@ -872,8 +879,7 @@ send_exec :: proc(op: ^Operation) { return } - bufs := slice.advance_slices(op.send.bufs, op.send.sent) - bufs, _ = constraint_bufs_to_max_rw(bufs) + bufs, _ := bufs_to_process(&op.send._impl.bufs, op.send.bufs, op.send.sent) op.send._impl.msghdr.iov = transmute([]linux.IO_Vec)bufs sock: linux.Fd @@ -882,7 +888,7 @@ send_exec :: proc(op: ^Operation) { sock = linux.Fd(socket) case UDP_Socket: sock = linux.Fd(socket) - op.send._impl.endpoint = endpoint_to_sockaddr(op.send.endpoint) + op.send._impl.endpoint = endpoint_to_sockaddr_ip(op.send.endpoint) op.send._impl.msghdr.name = &op.send._impl.endpoint op.send._impl.msghdr.namelen = size_of(op.send._impl.endpoint) } @@ -1378,7 +1384,7 @@ stat_callback :: proc(op: ^Operation, res: i32) { } @(require_results) -sockaddr_storage_to_endpoint :: proc(addr: ^linux.Sock_Addr_Any) -> (ep: Endpoint) { +sockaddr_storage_to_endpoint_ip :: proc(addr: ^Sock_Addr_Ip) -> (ep: Endpoint) { #partial switch addr.family { case .INET: return Endpoint { @@ -1396,7 +1402,43 @@ sockaddr_storage_to_endpoint :: proc(addr: ^linux.Sock_Addr_Any) -> (ep: Endpoin } @(require_results) -endpoint_to_sockaddr :: proc(ep: Endpoint) -> (sockaddr: linux.Sock_Addr_Any) { +sockaddr_storage_to_endpoint_any :: proc(addr: ^linux.Sock_Addr_Any) -> (ep: Endpoint) { + #partial switch addr.family { + case .INET: + return Endpoint { + address = IP4_Address(addr.sin_addr), + port = int(addr.sin_port), + } + case .INET6: + return Endpoint { + address = IP6_Address(transmute([8]u16be)addr.sin6_addr), + port = int(addr.sin6_port), + } + case: + return {} + } +} + +@(require_results) +endpoint_to_sockaddr_ip :: proc(ep: Endpoint) -> (sockaddr: Sock_Addr_Ip) { + switch a in ep.address { + case IP4_Address: + sockaddr.sin_family = .INET + sockaddr.sin_port = u16be(ep.port) + sockaddr.sin_addr = cast([4]u8)a + return + case IP6_Address: + sockaddr.sin6_family = .INET6 + sockaddr.sin6_port = u16be(ep.port) + sockaddr.sin6_addr = transmute([16]u8)a + return + } + + unreachable() +} + +@(require_results) +endpoint_to_sockaddr_any :: proc(ep: Endpoint) -> (sockaddr: linux.Sock_Addr_Any) { switch a in ep.address { case IP4_Address: sockaddr.sin_family = .INET diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index 9b4863710..f76cf2849 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -7,7 +7,6 @@ import "core:container/pool" import "core:container/queue" import "core:mem" import "core:net" -import "core:slice" import "core:strings" import "core:sys/posix" import "core:time" @@ -64,12 +63,12 @@ _Dial :: struct {} @(private="package") _Recv :: struct { - small_bufs: [1][]byte, + bufs: Bufs, } @(private="package") _Send :: struct { - small_bufs: [1][]byte, + bufs: Bufs, } @(private="package") @@ -575,14 +574,14 @@ handle_completed :: proc(op: ^Operation) { case .Send: if send_exec(op) == .Done { maybe_callback(op) - bufs_destroy(op.send.bufs, op.l.allocator) + bufs_delete(&op.send._impl.bufs, op.send.bufs, op.l.allocator) cleanup(op) } return case .Recv: if recv_exec(op) == .Done { maybe_callback(op) - bufs_destroy(op.recv.bufs, op.l.allocator) + bufs_delete(&op.recv._impl.bufs, op.recv.bufs, op.l.allocator) cleanup(op) } return @@ -778,10 +777,7 @@ send_exec :: proc(op: ^Operation) -> Op_Result { return .Done } - total: int - bufs := slice.advance_slices(op.send.bufs, op.send.sent) - bufs, total = constraint_bufs_to_max_rw(op.send.bufs) - + bufs, total := bufs_to_process(&op.send._impl.bufs, op.send.bufs, op.send.sent) sock, n := sendv(op.send.socket, bufs, op.send.endpoint) if n < 0 { if posix.errno() == .EWOULDBLOCK { @@ -840,10 +836,7 @@ recv_exec :: proc(op: ^Operation) -> Op_Result { return .Done } - total: int - bufs := slice.advance_slices(op.recv.bufs, op.recv.received) - bufs, total = constraint_bufs_to_max_rw(op.recv.bufs) - + bufs, total := bufs_to_process(&op.recv._impl.bufs, op.recv.bufs, op.recv.received) _, is_tcp := op.recv.socket.(net.TCP_Socket) sock, n := recvv(op.recv.socket, bufs, &op.recv.source) diff --git a/core/nbio/impl_windows.odin b/core/nbio/impl_windows.odin index f75193fe4..adf2d5351 100644 --- a/core/nbio/impl_windows.odin +++ b/core/nbio/impl_windows.odin @@ -69,15 +69,15 @@ _Write :: struct {} @(private="package") _Send :: struct { - small_bufs: [1][]byte, + bufs: Bufs, } @(private="package") _Recv :: struct { source: win.SOCKADDR_STORAGE_LH, source_len: win.INT, - small_bufs: [1][]byte, flags: win.DWORD, + bufs: Bufs, } @(private="package") @@ -320,9 +320,7 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { result = recv_callback(op) if result == .Done { maybe_callback(op) - if len(op.recv.bufs) > 1 { - delete(op.recv.bufs, op.l.allocator) - } + bufs_delete(&op.recv._impl.bufs, op.recv.bufs, op.l.allocator) cleanup(op) return } @@ -332,9 +330,7 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> (err: General_Error) { result = send_callback(op) if result == .Done { maybe_callback(op) - if len(op.send.bufs) > 1 { - delete(op.send.bufs, op.l.allocator) - } + bufs_delete(&op.send._impl.bufs, op.send.bufs, op.l.allocator) cleanup(op) return } @@ -1213,9 +1209,7 @@ recv_exec :: proc(op: ^Operation) -> Op_Result { return .Done } - bufs := slice.advance_slices(op.recv.bufs, op.recv.received) - bufs, _ = constraint_bufs_to_max_rw(op.recv.bufs) - + bufs, _ := bufs_to_process(&op.recv._impl.bufs, op.recv.bufs, op.recv.received) win_bufs := ([^]win.WSABUF)(intrinsics.alloca(size_of(win.WSABUF) * len(bufs), align_of(win.WSABUF))) for buf, i in bufs { assert(i64(len(buf)) < i64(max(u32))) @@ -1333,9 +1327,7 @@ send_exec :: proc(op: ^Operation) -> Op_Result { return .Done } - bufs := slice.advance_slices(op.send.bufs, op.send.sent) - bufs, _ = constraint_bufs_to_max_rw(op.send.bufs) - + bufs, _ := bufs_to_process(&op.send._impl.bufs, op.send.bufs, op.send.sent) win_bufs := ([^]win.WSABUF)(intrinsics.alloca(size_of(win.WSABUF) * len(bufs), align_of(win.WSABUF))) for buf, i in bufs { assert(i64(len(buf)) < i64(max(u32))) @@ -1853,4 +1845,4 @@ timeouts_cmp :: #force_inline proc(a, b: ^Operation) -> slice.Ordering { assert(a == b) return .Equal } -} \ No newline at end of file +} diff --git a/core/nbio/ops.odin b/core/nbio/ops.odin index e028c4a76..382dca747 100644 --- a/core/nbio/ops.odin +++ b/core/nbio/ops.odin @@ -5,7 +5,6 @@ import "base:intrinsics" import "core:container/pool" import "core:time" import "core:slice" -import "core:mem" NO_TIMEOUT: time.Duration: -1 @@ -480,7 +479,7 @@ Recv :: struct { // The socket to receive from. socket: Any_Socket, // The buffers to receive data into. - // The outer slice is copied internally, but the backing arrays must remain alive. + // The outer slice is copied internally, but the backing data must remain alive. // It is safe to access `bufs` during the callback. bufs: [][]byte, // If true, the operation waits until all buffers are filled (TCP only). @@ -546,17 +545,11 @@ prep_recv :: #force_inline proc( op.recv.expires = time.time_add(now(), timeout) } - if len(op.recv.bufs) == 1 { - op.recv._impl.small_bufs = {op.recv.bufs[0]} - op.recv.bufs = op.recv._impl.small_bufs[:] - } else { - err: mem.Allocator_Error - if op.recv.bufs, err = slice.clone(op.recv.bufs, op.l.allocator); err != nil { - switch _ in op.recv.socket { - case TCP_Socket: op.recv.err = TCP_Recv_Error.Insufficient_Resources - case UDP_Socket: op.recv.err = UDP_Recv_Error.Insufficient_Resources - case: unreachable() - } + if err := bufs_init(&op.recv._impl.bufs, &op.recv.bufs, op.l.allocator); err != nil { + switch _ in op.recv.socket { + case TCP_Socket: op.recv.err = TCP_Recv_Error.Insufficient_Resources + case UDP_Socket: op.recv.err = UDP_Recv_Error.Insufficient_Resources + case: unreachable() } } @@ -714,7 +707,8 @@ Send :: struct { // The socket to send to. socket: Any_Socket, // The buffers to send. - // The outer slice is copied internally, but the backing arrays must remain alive. + // The outer slice is copied internally, but the backing data must remain alive. + // It is safe to access `bufs` during the callback. bufs: [][]byte `fmt:"-"`, // The destination endpoint to send to (UDP only). endpoint: Endpoint, @@ -773,17 +767,11 @@ prep_send :: proc( op.send.expires = time.time_add(now(), timeout) } - if len(op.send.bufs) == 1 { - op.send._impl.small_bufs = {op.send.bufs[0]} - op.send.bufs = op.send._impl.small_bufs[:] - } else { - err: mem.Allocator_Error - if op.send.bufs, err = slice.clone(op.send.bufs, op.l.allocator); err != nil { - switch _ in op.send.socket { - case TCP_Socket: op.send.err = TCP_Send_Error.Insufficient_Resources - case UDP_Socket: op.send.err = UDP_Send_Error.Insufficient_Resources - case: unreachable() - } + if err := bufs_init(&op.send._impl.bufs, &op.send.bufs, op.l.allocator); err != nil { + switch _ in op.send.socket { + case TCP_Socket: op.send.err = TCP_Send_Error.Insufficient_Resources + case UDP_Socket: op.send.err = UDP_Send_Error.Insufficient_Resources + case: unreachable() } } diff --git a/tests/core/nbio/net.odin b/tests/core/nbio/net.odin index 688ee0b45..77e44f73b 100644 --- a/tests/core/nbio/net.odin +++ b/tests/core/nbio/net.odin @@ -398,3 +398,75 @@ sendfile :: proc(t: ^testing.T) { ev(t, nbio.run(), nil) } } + +@(test) +vectored :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + sock, ep := open_next_available_local_port(t) + + to_send := [?][]byte{ + {'H', 'e', 'l', 'l'}, + {'o', 'p', 'e'}, + {'!'}, + } + + to_recv := [?][]byte{ + {0, 0, 0, 0}, + {0, 0, 0}, + {0}, + } + + // Server + { + nbio.accept_poly2(sock, t, &to_send, on_accept) + + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T, to_send: ^[3][]byte) { + ev(t, op.accept.err, nil) + e(t, op.accept.client != 0) + to_send_copy := to_send^[:] + nbio.send_poly3(op.accept.client, to_send_copy, t, op.accept.socket, to_send, on_send) + } + + on_send :: proc(op: ^nbio.Operation, t: ^testing.T, server: net.TCP_Socket, to_send: ^[3][]byte) { + ev(t, op.send.err, nil) + ev(t, op.send.sent, 8) + + expected := to_send^ + for buf, i in expected { + ev(t, string(op.send.bufs[i]), string(buf)) + } + + nbio.close(op.send.socket.(net.TCP_Socket)) + nbio.close(server) + } + } + + // Client + { + nbio.dial_poly3(ep, t, &to_recv, &to_send, on_dial) + + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T, to_recv: ^[3][]byte, expected: ^[3][]byte) { + ev(t, op.dial.err, nil) + + to_recv_copy := to_recv^[:] + nbio.recv_poly2(op.dial.socket, to_recv_copy, t, expected, on_recv, all=true) + } + + on_recv :: proc(op: ^nbio.Operation, t: ^testing.T, expected: ^[3][]byte) { + ev(t, op.recv.err, nil) + ev(t, op.recv.received, 8) + + expected := expected^[:] + for buf, i in expected { + ev(t, string(op.recv.bufs[i]), string(buf)) + } + + nbio.close(op.recv.socket.(net.TCP_Socket)) + } + } + + ev(t, nbio.run(), nil) + } +} From b1122284f1930b49d7a079c55344888fd0935626 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 31 Jan 2026 10:19:00 +0100 Subject: [PATCH 295/766] Fix #6197 --- base/intrinsics/intrinsics.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index 41a1ae1ee..2428e37b9 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -355,7 +355,7 @@ has_target_feature :: proc($test: $T) -> bool where type_is_string(T) || type_is // Utility Calls -concatentate :: proc(x, y: $T, z: ..T) -> T where type_is_array(T) || type_is_slice(T) --- +concatenate :: proc(x, y: $T, z: ..T) -> T where type_is_array(T) || type_is_slice(T) --- // Returns the value of the procedure where `x` must be a call expression procedure_of :: proc(x: $T) -> T where type_is_proc(T) --- From 2b539bfcd5e540ae4bbddd43c39b8d261f80484c Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 31 Jan 2026 10:50:42 +0100 Subject: [PATCH 296/766] Fix #6198 --- core/strings/intern.odin | 11 +++-- core/strings/strings.odin | 95 ++++++++++++++++++++++++--------------- 2 files changed, 67 insertions(+), 39 deletions(-) diff --git a/core/strings/intern.odin b/core/strings/intern.odin index 0b8ed173e..909510c7c 100644 --- a/core/strings/intern.odin +++ b/core/strings/intern.odin @@ -30,6 +30,7 @@ Inputs: - m: A pointer to the Intern struct to be initialized - allocator: The allocator for the Intern_Entry strings (Default: context.allocator) - map_allocator: The allocator for the map of entries (Default: context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - err: An allocator error if one occured, `nil` otherwise @@ -78,6 +79,7 @@ Returns an interned copy of the given text as a cstring, adding it to the map if Inputs: - m: A pointer to the Intern struct - text: The string to be interned +- loc: The caller location for debugging purposes (default: `#caller_location`) NOTE: The returned cstring lives as long as the map entry lives @@ -85,8 +87,8 @@ Returns: - str: The interned cstring - err: An allocator error if one occured, `nil` otherwise */ -intern_get_cstring :: proc(m: ^Intern, text: string) -> (str: cstring, err: runtime.Allocator_Error) { - entry := _intern_get_entry(m, text) or_return +intern_get_cstring :: proc(m: ^Intern, text: string, loc := #caller_location) -> (str: cstring, err: runtime.Allocator_Error) { + entry := _intern_get_entry(m, text, loc) or_return return cstring(&entry.str[0]), nil } @@ -99,12 +101,13 @@ Sets and allocates the entry if it wasn't set yet Inputs: - m: A pointer to the Intern struct - text: The string to be looked up or interned +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - new_entry: The interned cstring - err: An allocator error if one occured, `nil` otherwise */ -_intern_get_entry :: proc(m: ^Intern, text: string) -> (new_entry: ^Intern_Entry, err: runtime.Allocator_Error) #no_bounds_check { +_intern_get_entry :: proc(m: ^Intern, text: string, loc := #caller_location) -> (new_entry: ^Intern_Entry, err: runtime.Allocator_Error) #no_bounds_check { if m.allocator.procedure == nil { m.allocator = context.allocator } @@ -115,7 +118,7 @@ _intern_get_entry :: proc(m: ^Intern, text: string) -> (new_entry: ^Intern_Entry } entry_size := int(offset_of(Intern_Entry, str)) + len(text) + 1 - bytes := runtime.mem_alloc(entry_size, align_of(Intern_Entry), m.allocator) or_return + bytes := runtime.mem_alloc(entry_size, align_of(Intern_Entry), m.allocator, loc) or_return new_entry = (^Intern_Entry)(raw_data(bytes)) new_entry.len = len(text) diff --git a/core/strings/strings.odin b/core/strings/strings.odin index bad0ac26a..cda12f9dc 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -764,6 +764,7 @@ Inputs: - rune_offset: The starting rune index (default is 0). In runes, not bytes. - rune_length: The number of runes to include in the substring (default is 0, which returns the remainder of the string). In runes, not bytes. - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The substring @@ -805,6 +806,7 @@ Inputs: - sep_save: A flag determining if the separator should be saved in the resulting substrings - n: The maximum number of substrings to return, returns `nil` without alloc when `n=0` - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) NOTE: Allocation occurs for the array, the splits are all views of the original string. @@ -869,6 +871,7 @@ Inputs: - s: The string to split. - sep: The separator string used to split the input string. - allocator: (default is context.allocator). +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The slice of strings, each representing a part of the split string. @@ -892,8 +895,8 @@ Output: ["aaa", "bbb", "ccc", "ddd", "eee"] */ -split :: proc(s, sep: string, allocator := context.allocator) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { - return _split(s, sep, 0, -1, allocator) +split :: proc(s, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { + return _split(s, sep, 0, -1, allocator, loc) } /* @@ -906,6 +909,7 @@ Inputs: - sep: The separator string used to split the input string. - n: The maximum amount of parts to split the string into. - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The slice of strings, each representing a part of the split string. @@ -929,8 +933,8 @@ Output: ["aaa", "bbb", "ccc.ddd.eee"] */ -split_n :: proc(s, sep: string, n: int, allocator := context.allocator) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { - return _split(s, sep, 0, n, allocator) +split_n :: proc(s, sep: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { + return _split(s, sep, 0, n, allocator, loc) } /* @@ -942,6 +946,7 @@ Inputs: - s: The string to split. - sep: The separator string used to split the input string. - allocator: (default is context.allocator). +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The slice of strings, each representing a part of the split string after the separator @@ -965,8 +970,8 @@ Output: ["aaa.", "bbb.", "ccc.", "ddd.", "eee"] */ -split_after :: proc(s, sep: string, allocator := context.allocator) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { - return _split(s, sep, len(sep), -1, allocator) +split_after :: proc(s, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { + return _split(s, sep, len(sep), -1, allocator, loc) } /* @@ -979,6 +984,7 @@ Inputs: - sep: The separator string used to split the input string. - n: The maximum number of parts to split the string into. - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The slice of strings with `n` parts or fewer if there weren't @@ -1002,8 +1008,8 @@ Output: ["aaa.", "bbb.", "ccc.ddd.eee"] */ -split_after_n :: proc(s, sep: string, n: int, allocator := context.allocator) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { - return _split(s, sep, len(sep), n, allocator) +split_after_n :: proc(s, sep: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { + return _split(s, sep, len(sep), n, allocator, loc) } /* @@ -1196,6 +1202,7 @@ Splits the input string at every line break `\n`. Inputs: - s: The input string to split. - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The slice (allocated) of the split string (slices into original string) @@ -1217,9 +1224,9 @@ Output: ["a", "b", "c", "d", "e"] */ -split_lines :: proc(s: string, allocator := context.allocator) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_lines :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { sep :: "\n" - lines := _split(s, sep, 0, -1, allocator) or_return + lines := _split(s, sep, 0, -1, allocator, loc) or_return for &line in lines { line = _trim_cr(line) } @@ -1235,6 +1242,7 @@ Inputs: - s: The input string to split. - n: The number of parts to split into. - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The slice (allocated) of the split string (slices into original string) @@ -1258,9 +1266,9 @@ Output: ["a", "b", "c\nd\ne"] */ -split_lines_n :: proc(s: string, n: int, allocator := context.allocator) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_lines_n :: proc(s: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { sep :: "\n" - lines := _split(s, sep, 0, n, allocator) or_return + lines := _split(s, sep, 0, n, allocator, loc) or_return for &line in lines { line = _trim_cr(line) } @@ -1275,6 +1283,7 @@ Splits the input string at every line break `\n` leaving the `\n` in the resulti Inputs: - s: The input string to split. - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The slice (allocated) of the split string (slices into original string), with `\n` included @@ -1298,9 +1307,9 @@ Output: ["a\n", "b\n", "c\n", "d\n", "e"] */ -split_lines_after :: proc(s: string, allocator := context.allocator) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_lines_after :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { sep :: "\n" - lines := _split(s, sep, len(sep), -1, allocator) or_return + lines := _split(s, sep, len(sep), -1, allocator, loc) or_return for &line in lines { line = _trim_cr(line) } @@ -1317,6 +1326,7 @@ Inputs: - s: The input string to split. - n: The number of parts to split into. - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The slice (allocated) of the split string (slices into original string), with `\n` included @@ -1340,9 +1350,9 @@ Output: ["a\n", "b\n", "c\nd\ne"] */ -split_lines_after_n :: proc(s: string, n: int, allocator := context.allocator) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_lines_after_n :: proc(s: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { sep :: "\n" - lines := _split(s, sep, len(sep), n, allocator) or_return + lines := _split(s, sep, len(sep), n, allocator, loc) or_return for &line in lines { line = _trim_cr(line) } @@ -1976,6 +1986,7 @@ Inputs: - s: The string to repeat - count: The number of times to repeat `s` - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The concatenated repeated string @@ -2023,6 +2034,7 @@ Inputs: - old: The substring to replace - new: The substring to replace `old` with - allocator: The allocator to use for the new string (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - output: The modified string @@ -2047,8 +2059,8 @@ Output: */ -replace_all :: proc(s, old, new: string, allocator := context.allocator) -> (output: string, was_allocation: bool) { - return replace(s, old, new, -1, allocator) +replace_all :: proc(s, old, new: string, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool) { + return replace(s, old, new, -1, allocator, loc) } /* @@ -2062,6 +2074,7 @@ Inputs: - new: The replacement string - n: The number of instances to replace (if `n < 0`, no limit on the number of replacements) - allocator: (default: context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - output: The modified string @@ -2140,6 +2153,7 @@ Inputs: - key: The substring to be removed - n: The number of instances to remove (if `n < 0`, no limit on the number of removes) - allocator: (default: context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - output: The modified string @@ -2165,8 +2179,8 @@ Output: abcabc false */ -remove :: proc(s, key: string, n: int, allocator := context.allocator) -> (output: string, was_allocation: bool) { - return replace(s, key, "", n, allocator) +remove :: proc(s, key: string, n: int, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool) { + return replace(s, key, "", n, allocator, loc) } /* @@ -2178,6 +2192,7 @@ Inputs: - s: The input string - key: The substring to be removed - allocator: (default: context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - output: The modified string @@ -2201,8 +2216,8 @@ Output: abcabc false */ -remove_all :: proc(s, key: string, allocator := context.allocator) -> (output: string, was_allocation: bool) { - return remove(s, key, -1, allocator) +remove_all :: proc(s, key: string, allocator := context.allocator, loc := #caller_location) -> (output: string, was_allocation: bool) { + return remove(s, key, -1, allocator, loc) } // Returns true if is an ASCII space character ('\t', '\n', '\v', '\f', '\r', ' ') @@ -2672,6 +2687,7 @@ Inputs: - s: The input string - substrs: An array of substrings used for splitting - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: An array of strings, or nil on empty substring or no matches @@ -2805,6 +2821,7 @@ Inputs: - s: The input string - replacement: The string used to replace invalid UTF-8 characters - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: A new string with invalid UTF-8 characters replaced @@ -2825,10 +2842,10 @@ Output: Hello? */ -scrub :: proc(s: string, replacement: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +scrub :: proc(s: string, replacement: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { str := s b: Builder - builder_init(&b, 0, len(s), allocator) or_return + builder_init(&b, 0, len(s), allocator, loc) or_return has_error := false cursor := 0 @@ -2865,6 +2882,7 @@ Reverses the input string `s` Inputs: - s: The input string - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: A reversed version of the input string @@ -2910,6 +2928,7 @@ Inputs: - s: The input string - tab_size: The number of spaces to use for each tab character - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: A new string with tab characters expanded to the specified tab size @@ -2932,7 +2951,7 @@ Output: abc1 abc2 abc3 */ -expand_tabs :: proc(s: string, tab_size: int, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +expand_tabs :: proc(s: string, tab_size: int, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { if tab_size <= 0 { panic("tab size must be positive") } @@ -2942,7 +2961,7 @@ expand_tabs :: proc(s: string, tab_size: int, allocator := context.allocator) -> } b: Builder - builder_init(&b, allocator) or_return + builder_init(&b, allocator, loc) or_return writer := to_writer(&b) str := s column: int @@ -3038,22 +3057,23 @@ Inputs: - length: The desired length of the centered string, in runes - pad: The string used for padding on both sides - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: A new string centered within a field of the specified length - err: An optional allocator error if one occured, `nil` otherwise */ -centre_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +centre_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { n := rune_count(str) if n >= length || pad == "" { - return clone(str, allocator) + return clone(str, allocator, loc) } remains := length-n pad_len := rune_count(pad) b: Builder - builder_init(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator) or_return + builder_init(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator, loc) or_return w := to_writer(&b) @@ -3074,22 +3094,23 @@ Inputs: - length: The desired length of the left-justified string - pad: The string used for padding on the right side - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: A new string left-justified within a field of the specified length - err: An optional allocator error if one occured, `nil` otherwise */ -left_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +left_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { n := rune_count(str) if n >= length || pad == "" { - return clone(str, allocator) + return clone(str, allocator, loc) } remains := length-n pad_len := rune_count(pad) b: Builder - builder_init(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator) or_return + builder_init(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator, loc) or_return w := to_writer(&b) @@ -3109,22 +3130,23 @@ Inputs: - length: The desired length of the right-justified string - pad: The string used for padding on the left side - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: A new string right-justified within a field of the specified length - err: An optional allocator error if one occured, `nil` otherwise */ -right_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +right_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { n := rune_count(str) if n >= length || pad == "" { - return clone(str, allocator) + return clone(str, allocator, loc) } remains := length-n pad_len := rune_count(pad) b: Builder - builder_init(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator) or_return + builder_init(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator, loc) or_return w := to_writer(&b) @@ -3169,6 +3191,7 @@ Splits a string into a slice of substrings at each instance of one or more conse Inputs: - s: The input string - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: A slice of substrings of the input string, or an empty slice if the input string only contains white space @@ -3232,6 +3255,7 @@ Inputs: - s: The input string - f: A predicate function to determine the split points - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) NOTE: fields_proc makes no guarantee about the order in which it calls `f(r)`, it assumes that `f` always returns the same value for a given `r` @@ -3315,6 +3339,7 @@ NOTE: Does not perform internal allocation if length of string `b`, in runes, is Inputs: - a, b: The two strings to compare - allocator: (default is context.allocator) +- loc: The caller location for debugging purposes (default: `#caller_location`) Returns: - res: The Levenshtein edit distance between the two strings From 8d8aaf65aaaecfafd81c13bdfbcbc16e9eabe630 Mon Sep 17 00:00:00 2001 From: Oleksandr Kovalenko Date: Sat, 31 Jan 2026 15:01:56 +0200 Subject: [PATCH 297/766] os\os2 windows: fix truncate-clamp op order when determining to_read size --- core/os/os2/file_windows.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/os/os2/file_windows.odin b/core/os/os2/file_windows.odin index 4df9398cc..6f29d151c 100644 --- a/core/os/os2/file_windows.odin +++ b/core/os/os2/file_windows.odin @@ -377,7 +377,7 @@ _read_internal :: proc(f: ^File_Impl, p: []byte) -> (n: i64, err: Error) { sync.shared_guard(&f.rw_mutex) // multiple readers if sync.guard(&f.p_mutex) { - to_read := min(win32.DWORD(length), MAX_RW) + to_read := win32.DWORD(min(length, MAX_RW)) switch f.kind { case .Console: // NOTE(laytan): at least for now, just use ReadFile, it seems to work fine, From f7901cffc9f4983259586241d5b336cdb6377b9c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 31 Jan 2026 16:28:47 +0000 Subject: [PATCH 298/766] Add `doc.odin` and mention the defineables through `#config` --- core/testing/doc.odin | 46 +++++++++++++++++++++++++++++++++++++++ core/testing/runner.odin | 28 ++++++++++++------------ core/testing/testing.odin | 1 - 3 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 core/testing/doc.odin diff --git a/core/testing/doc.odin b/core/testing/doc.odin new file mode 100644 index 000000000..85dc80cc3 --- /dev/null +++ b/core/testing/doc.odin @@ -0,0 +1,46 @@ +/* +The implementation of the `odin test` runner and procedures user tests can use for this purpose. + +Defineables through `#config`: + +```odin +// Specify how many threads to use when running tests. +TEST_THREADS : int : #config(ODIN_TEST_THREADS, 0) +// Track the memory used by each test. +TRACKING_MEMORY : bool : #config(ODIN_TEST_TRACK_MEMORY, true) +// Always report how much memory is used, even when there are no leaks or bad frees. +ALWAYS_REPORT_MEMORY : bool : #config(ODIN_TEST_ALWAYS_REPORT_MEMORY, false) +// Treat memory leaks and bad frees as errors. +FAIL_ON_BAD_MEMORY : bool : #config(ODIN_TEST_FAIL_ON_BAD_MEMORY, false) +// Specify how much memory each thread allocator starts with. +PER_THREAD_MEMORY : int : #config(ODIN_TEST_THREAD_MEMORY, mem. ROLLBACK_STACK_DEFAULT_BLOCK_SIZE) +// Select a specific set of tests to run by name. +// Each test is separated by a comma and may optionally include the package name. +// This may be useful when running tests on multiple packages with `-all-packages`. +// The format is: `package.test_name,test_name_only,...` +TEST_NAMES : string : #config(ODIN_TEST_NAMES, "") +// Show the fancy animated progress report. +// This requires terminal color support, as well as STDOUT to not be redirected to a file. +FANCY_OUTPUT : bool : #config(ODIN_TEST_FANCY, true) +// Copy failed tests to the clipboard when done. +USE_CLIPBOARD : bool : #config(ODIN_TEST_CLIPBOARD, false) +// How many test results to show at a time per package. +PROGRESS_WIDTH : int : #config(ODIN_TEST_PROGRESS_WIDTH, 24) +// This is the random seed that will be sent to each test. +// If it is unspecified, it will be set to the system cycle counter at startup. +SHARED_RANDOM_SEED : u64 : #config(ODIN_TEST_RANDOM_SEED, 0) +// Set the lowest log level for this test run. +LOG_LEVEL_DEFAULT : string : "debug" when ODIN_DEBUG else "info" +LOG_LEVEL : string : #config(ODIN_TEST_LOG_LEVEL, LOG_LEVEL_DEFAULT) +// Report a message at the info level when a test has changed its state. +LOG_STATE_CHANGES : bool : #config(ODIN_TEST_LOG_STATE_CHANGES, false) +// Show only the most necessary logging information. +USING_SHORT_LOGS : bool : #config(ODIN_TEST_SHORT_LOGS, false) +// Output a report of the tests to the given path. +JSON_REPORT : string : #config(ODIN_TEST_JSON_REPORT, "") +// Print the full file path for failed test cases on a new line +// in a way that's friendly to regex capture for an editor's "go to error". +GO_TO_ERROR : bool : #config(ODIN_TEST_GO_TO_ERROR, false) +``` +*/ +package testing \ No newline at end of file diff --git a/core/testing/runner.odin b/core/testing/runner.odin index e0a37c46d..03115b165 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -30,42 +30,42 @@ import "core:thread" import "core:time" // Specify how many threads to use when running tests. -TEST_THREADS : int : #config(ODIN_TEST_THREADS, 0) +TEST_THREADS : int : #config(ODIN_TEST_THREADS, 0) // Track the memory used by each test. -TRACKING_MEMORY : bool : #config(ODIN_TEST_TRACK_MEMORY, true) +TRACKING_MEMORY : bool : #config(ODIN_TEST_TRACK_MEMORY, true) // Always report how much memory is used, even when there are no leaks or bad frees. ALWAYS_REPORT_MEMORY : bool : #config(ODIN_TEST_ALWAYS_REPORT_MEMORY, false) // Treat memory leaks and bad frees as errors. -FAIL_ON_BAD_MEMORY : bool : #config(ODIN_TEST_FAIL_ON_BAD_MEMORY, false) +FAIL_ON_BAD_MEMORY : bool : #config(ODIN_TEST_FAIL_ON_BAD_MEMORY, false) // Specify how much memory each thread allocator starts with. -PER_THREAD_MEMORY : int : #config(ODIN_TEST_THREAD_MEMORY, mem.ROLLBACK_STACK_DEFAULT_BLOCK_SIZE) +PER_THREAD_MEMORY : int : #config(ODIN_TEST_THREAD_MEMORY, mem. ROLLBACK_STACK_DEFAULT_BLOCK_SIZE) // Select a specific set of tests to run by name. // Each test is separated by a comma and may optionally include the package name. // This may be useful when running tests on multiple packages with `-all-packages`. // The format is: `package.test_name,test_name_only,...` -TEST_NAMES : string : #config(ODIN_TEST_NAMES, "") +TEST_NAMES : string : #config(ODIN_TEST_NAMES, "") // Show the fancy animated progress report. // This requires terminal color support, as well as STDOUT to not be redirected to a file. -FANCY_OUTPUT : bool : #config(ODIN_TEST_FANCY, true) +FANCY_OUTPUT : bool : #config(ODIN_TEST_FANCY, true) // Copy failed tests to the clipboard when done. -USE_CLIPBOARD : bool : #config(ODIN_TEST_CLIPBOARD, false) +USE_CLIPBOARD : bool : #config(ODIN_TEST_CLIPBOARD, false) // How many test results to show at a time per package. -PROGRESS_WIDTH : int : #config(ODIN_TEST_PROGRESS_WIDTH, 24) +PROGRESS_WIDTH : int : #config(ODIN_TEST_PROGRESS_WIDTH, 24) // This is the random seed that will be sent to each test. // If it is unspecified, it will be set to the system cycle counter at startup. -SHARED_RANDOM_SEED : u64 : #config(ODIN_TEST_RANDOM_SEED, 0) +SHARED_RANDOM_SEED : u64 : #config(ODIN_TEST_RANDOM_SEED, 0) // Set the lowest log level for this test run. LOG_LEVEL_DEFAULT : string : "debug" when ODIN_DEBUG else "info" -LOG_LEVEL : string : #config(ODIN_TEST_LOG_LEVEL, LOG_LEVEL_DEFAULT) +LOG_LEVEL : string : #config(ODIN_TEST_LOG_LEVEL, LOG_LEVEL_DEFAULT) // Report a message at the info level when a test has changed its state. -LOG_STATE_CHANGES : bool : #config(ODIN_TEST_LOG_STATE_CHANGES, false) +LOG_STATE_CHANGES : bool : #config(ODIN_TEST_LOG_STATE_CHANGES, false) // Show only the most necessary logging information. -USING_SHORT_LOGS : bool : #config(ODIN_TEST_SHORT_LOGS, false) +USING_SHORT_LOGS : bool : #config(ODIN_TEST_SHORT_LOGS, false) // Output a report of the tests to the given path. -JSON_REPORT : string : #config(ODIN_TEST_JSON_REPORT, "") +JSON_REPORT : string : #config(ODIN_TEST_JSON_REPORT, "") // Print the full file path for failed test cases on a new line // in a way that's friendly to regex capture for an editor's "go to error". -GO_TO_ERROR : bool : #config(ODIN_TEST_GO_TO_ERROR, false) +GO_TO_ERROR : bool : #config(ODIN_TEST_GO_TO_ERROR, false) get_log_level :: #force_inline proc() -> runtime.Logger_Level { when LOG_LEVEL == "debug" { return .Debug } else diff --git a/core/testing/testing.odin b/core/testing/testing.odin index d6bf6ea33..7182f77f5 100644 --- a/core/testing/testing.odin +++ b/core/testing/testing.odin @@ -1,4 +1,3 @@ -// The implementation of the `odin test` runner and procedures user tests can use for this purpose. package testing /* From 1a7f78b66578492103607628d2cd4a2de70b29ec Mon Sep 17 00:00:00 2001 From: Jesse Meyer Date: Sun, 1 Feb 2026 09:04:53 -0500 Subject: [PATCH 299/766] Add ThinLTO support via -lto:thin and -lto:thin-files flags - Add -lto:thin and -lto:thin-files CLI flags with validation - Emit LLVM bitcode (.bc) instead of object files when LTO is enabled - Pass -flto=thin and -flto-jobs to clang/lld linkers - Guard linkage corrections to skip declarations without definitions (required for LTO where declarations appear across modules) - Allow module-per-file with LTO even at higher optimization levels Co-Authored-By: Claude Opus 4.5 --- src/build_settings.cpp | 30 ++++++++++++++++++++++++++++++ src/linker.cpp | 16 +++++++++++++++- src/llvm_backend.cpp | 23 ++++++++++++++++++----- src/llvm_backend_general.cpp | 2 +- src/main.cpp | 14 ++++++++++++++ 5 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 6b8fefa59..e0017baea 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -420,6 +420,12 @@ struct BuildCacheData { }; +enum LTOKind : i32 { + LTO_None, + LTO_Thin, + LTO_Thin_Files, +}; + enum LinkerChoice : i32 { Linker_Invalid = -1, Linker_Default = 0, @@ -560,6 +566,7 @@ struct BuildContext { bool use_single_module; bool use_separate_modules; + LTOKind lto_kind; bool module_per_file; bool cached; BuildCacheData build_cache_data; @@ -2030,6 +2037,29 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta bc->use_separate_modules = false; } + if (bc->lto_kind == LTO_Thin || bc->lto_kind == LTO_Thin_Files) { +#if LLVM_VERSION_MAJOR < 17 + gb_printf_err("-lto:thin requires LLVM 17 or later\n"); + gb_exit(1); +#endif + if (bc->build_mode == BuildMode_Assembly || bc->build_mode == BuildMode_LLVM_IR) { + gb_printf_err("-lto:thin is incompatible with -build-mode:asm and -build-mode:llvm-ir\n"); + gb_exit(1); + } +#if defined(GB_SYSTEM_WINDOWS) + if (bc->linker_choice != Linker_lld) { + gb_printf_err("-lto:thin on Windows requires -linker:lld\n"); + gb_exit(1); + } +#endif + if (bc->use_single_module) { + gb_printf_err("Warning: -lto:thin overrides -use-single-module; separate modules will be used\n"); + } + bc->use_separate_modules = true; + if (bc->lto_kind == LTO_Thin_Files) { + bc->module_per_file = true; + } + } bc->ODIN_VALGRIND_SUPPORT = false; if (build_context.metrics.os != TargetOs_windows) { diff --git a/src/linker.cpp b/src/linker.cpp index bc6268049..f369a5a38 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -328,6 +328,12 @@ try_cross_linking:; String windows_sdk_bin_path = path_to_string(heap_allocator(), build_context.build_paths[BuildPath_Win_SDK_Bin_Path]); defer (gb_free(heap_allocator(), windows_sdk_bin_path.text)); + gbString lld_lto_flags = gb_string_make(heap_allocator(), ""); + defer (gb_string_free(lld_lto_flags)); + if (build_context.lto_kind != LTO_None) { + lld_lto_flags = gb_string_append_fmt(lld_lto_flags, "/lldltojobs:%d ", build_context.thread_count); + } + switch (build_context.linker_choice) { case Linker_lld: result = system_exec_command_line_app("msvc-lld-link", @@ -336,13 +342,15 @@ try_cross_linking:; "%.*s " "%.*s " "%s " + "%s " "", LIT(build_context.ODIN_ROOT), object_files, LIT(output_filename), link_settings, LIT(windows_subsystem_names[build_context.ODIN_WINDOWS_SUBSYSTEM]), LIT(build_context.link_flags), LIT(build_context.extra_linker_flags), - lib_str + lib_str, + lld_lto_flags ); if (result) { @@ -966,6 +974,12 @@ try_cross_linking:; link_command_line = gb_string_appendc(link_command_line, clang_path); } link_command_line = gb_string_appendc(link_command_line, " -Wno-unused-command-line-argument "); + + if (build_context.lto_kind != LTO_None) { + link_command_line = gb_string_appendc(link_command_line, " -flto=thin"); + link_command_line = gb_string_append_fmt(link_command_line, " -flto-jobs=%d ", build_context.thread_count); + } + link_command_line = gb_string_appendc(link_command_line, object_files); link_command_line = gb_string_append_fmt(link_command_line, " -o \"%.*s\" ", LIT(output_filename)); link_command_line = gb_string_append_fmt(link_command_line, " %s ", platform_lib_str); diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index c15f326f8..43f6f8f03 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -171,7 +171,7 @@ gb_internal void lb_correct_entity_linkage(lbGenerator *gen) { LLVMValueRef other_global = nullptr; if (ec.e->kind == Entity_Variable) { other_global = LLVMGetNamedGlobal(ec.other_module->mod, ec.cname); - if (other_global) { + if (other_global && (LLVMGetInitializer(other_global) != nullptr || LLVMIsExternallyInitialized(other_global))) { LLVM_SET_INTERNAL_WEAK_LINKAGE(other_global); if (!ec.e->Variable.is_export && !ec.e->Variable.is_foreign) { LLVMSetVisibility(other_global, LLVMHiddenVisibility); @@ -179,7 +179,7 @@ gb_internal void lb_correct_entity_linkage(lbGenerator *gen) { } } else if (ec.e->kind == Entity_Procedure) { other_global = LLVMGetNamedFunction(ec.other_module->mod, ec.cname); - if (other_global) { + if (other_global && LLVMCountBasicBlocks(other_global) != 0) { LLVM_SET_INTERNAL_WEAK_LINKAGE(other_global); if (!ec.e->Procedure.is_export && !ec.e->Procedure.is_foreign) { LLVMSetVisibility(other_global, LLVMHiddenVisibility); @@ -2332,7 +2332,12 @@ gb_internal WORKER_TASK_PROC(lb_llvm_emit_worker_proc) { auto wd = cast(lbLLVMEmitWorker *)data; - if (LLVMTargetMachineEmitToFile(wd->target_machine, wd->m->mod, cast(char *)wd->filepath_obj.text, wd->code_gen_file_type, &llvm_error)) { + if (build_context.lto_kind != LTO_None) { + if (LLVMWriteBitcodeToFile(wd->m->mod, cast(char *)wd->filepath_obj.text)) { + gb_printf_err("Failed to write bitcode file: %.*s\n", LIT(wd->filepath_obj)); + exit_with_errors(); + } + } else if (LLVMTargetMachineEmitToFile(wd->target_machine, wd->m->mod, cast(char *)wd->filepath_obj.text, wd->code_gen_file_type, &llvm_error)) { gb_printf_err("LLVM Error: %s\n", llvm_error); exit_with_errors(); } @@ -2701,7 +2706,9 @@ gb_internal String lb_filepath_obj_for_module(lbModule *m) { String ext = {}; - if (build_context.build_mode == BuildMode_Assembly) { + if (build_context.lto_kind != LTO_None) { + ext = STR_LIT("bc"); + } else if (build_context.build_mode == BuildMode_Assembly) { ext = STR_LIT("S"); } else if (build_context.build_mode == BuildMode_Object) { // Allow a user override for the object extension. @@ -2776,7 +2783,13 @@ gb_internal bool lb_llvm_object_generation(lbGenerator *gen, bool do_threading) TIME_SECTION_WITH_LEN(section_name, gb_string_length(section_name)); - if (LLVMTargetMachineEmitToFile(m->target_machine, m->mod, cast(char *)filepath_obj.text, code_gen_file_type, &llvm_error)) { + if (build_context.lto_kind != LTO_None) { + if (LLVMWriteBitcodeToFile(m->mod, cast(char *)filepath_obj.text)) { + gb_printf_err("Failed to write bitcode file: %.*s\n", LIT(filepath_obj)); + exit_with_errors(); + return false; + } + } else if (LLVMTargetMachineEmitToFile(m->target_machine, m->mod, cast(char *)filepath_obj.text, code_gen_file_type, &llvm_error)) { gb_printf_err("LLVM Error: %s\n", llvm_error); exit_with_errors(); return false; diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index c0e57143d..572e3990c 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -163,7 +163,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { map_init(&gen->modules_through_ctx, gen->info->packages.count*2); if (USE_SEPARATE_MODULES) { - bool module_per_file = build_context.module_per_file && build_context.optimization_level <= 0; + bool module_per_file = build_context.module_per_file && (build_context.optimization_level <= 0 || build_context.lto_kind != LTO_None); for (auto const &entry : gen->info->packages) { AstPackage *pkg = entry.value; auto m = gb_alloc_item(permanent_allocator(), lbModule); diff --git a/src/main.cpp b/src/main.cpp index 624869e65..feaf55f4b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -413,6 +413,7 @@ enum BuildFlagKind { BuildFlag_Tilde, BuildFlag_Sanitize, + BuildFlag_LTO, #if defined(GB_SYSTEM_WINDOWS) BuildFlag_IgnoreVsSearch, @@ -643,6 +644,7 @@ gb_internal bool parse_build_flags(Array args) { #endif add_flag(&build_flags, BuildFlag_Sanitize, str_lit("sanitize"), BuildFlagParam_String, Command__does_build, true); + add_flag(&build_flags, BuildFlag_LTO, str_lit("lto"), BuildFlagParam_String, Command__does_build); #if defined(GB_SYSTEM_WINDOWS) @@ -1636,6 +1638,18 @@ gb_internal bool parse_build_flags(Array args) { } break; + case BuildFlag_LTO: + GB_ASSERT(value.kind == ExactValue_String); + if (str_eq_ignore_case(value.value_string, str_lit("thin"))) { + build_context.lto_kind = LTO_Thin; + } else if (str_eq_ignore_case(value.value_string, str_lit("thin-files"))) { + build_context.lto_kind = LTO_Thin_Files; + } else { + gb_printf_err("-lto: options are 'thin' and 'thin-files'\n"); + bad_flags = true; + } + break; + #if defined(GB_SYSTEM_WINDOWS) case BuildFlag_IgnoreVsSearch: { From 8ee943fc0cfbdbf81bf0fc385cf4279cf58da361 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 2 Feb 2026 10:59:30 +0900 Subject: [PATCH 300/766] core/crypto/_weirstrass: Cosmetic fixes (NFC) --- core/crypto/_fiat/field_p256r1/field.odin | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/crypto/_fiat/field_p256r1/field.odin b/core/crypto/_fiat/field_p256r1/field.odin index b1662fd48..0ba0e327d 100644 --- a/core/crypto/_fiat/field_p256r1/field.odin +++ b/core/crypto/_fiat/field_p256r1/field.odin @@ -209,7 +209,7 @@ fe_sqrt :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) -> // Square root candidate can be derived via exponentiation by `(p + 1) / 4` // From sage: 28948022302589062190674361737351893382521535853822578548883407827216774463488 // - // // Inversion computation is derived from the addition chain: + // Inversion computation is derived from the addition chain: // // _10 = 2*1 // _11 = 1 + _10 @@ -283,7 +283,6 @@ fe_sqrt :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) -> fe_clear_vec([]^Montgomery_Domain_Field_Element{&t0, &xx, &check}) return is_valid - } fe_zero :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element) { From 332af91b23e22c452c45d59ecbf5a2ff686aa523 Mon Sep 17 00:00:00 2001 From: Joshua Zimbicki Date: Mon, 2 Feb 2026 17:05:01 +1100 Subject: [PATCH 301/766] user32.odin add UnhookWinEvent --- core/sys/windows/user32.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 580c09b45..0026f939e 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -25,6 +25,7 @@ foreign user32 { idProcess, idThread: DWORD, dwFlags: WinEventFlags, ) -> HWINEVENTHOOK --- + UnhookWinEvent :: proc(winEventHook: HWINEVENTHOOK) -> BOOL --- IsChild :: proc(hWndParent, hWnd: HWND) -> BOOL --- From f45ca2d03e46886d52641b6f40763e0c95ebc3c8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 10:06:44 +0000 Subject: [PATCH 302/766] Use `contextless` --- core/sys/windows/user32.odin | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index beee65ee6..5d3f948d7 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -412,11 +412,13 @@ MAKEINTRESOURCEW :: #force_inline proc "contextless" (#any_int i: int) -> LPWSTR return cast(LPWSTR)uintptr(WORD(i)) } -RAWINPUT_ALIGN :: proc(x: uintptr) -> uintptr { +@(require_results) +RAWINPUT_ALIGN :: proc "contextless" (x: uintptr) -> uintptr { return (x + size_of(uintptr) - 1) & ~uintptr(size_of(uintptr) - 1) } -NEXTRAWINPUTBLOCK :: proc(ptr: ^RAWINPUT) -> ^RAWINPUT { +@(require_results) +NEXTRAWINPUTBLOCK :: proc "contextless" (ptr: ^RAWINPUT) -> ^RAWINPUT { return cast(^RAWINPUT)RAWINPUT_ALIGN(uintptr(ptr) + uintptr(ptr.header.dwSize)) } From 2608f92fee1656ff11f4487667eb72df256eadc7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 10:46:57 +0000 Subject: [PATCH 303/766] Use `std::atomic` for `Ast.viral_state_flags` and `Ast_Ident.entity` --- src/check_builtin.cpp | 4 ++-- src/llvm_backend_utility.cpp | 2 +- src/parser.hpp | 22 +++++++++++----------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index e732d8ec3..e2428576e 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -534,12 +534,12 @@ gb_internal bool check_builtin_objc_procedure(CheckerContext *c, Operand *operan return false; } - if (ident.entity->kind != Entity_Procedure) { + if (ident.entity.load()->kind != Entity_Procedure) { gbString e = expr_to_string(handler_node); ERROR_BLOCK(); error(handler.expr, "'%.*s' expected a direct reference to a procedure", LIT(builtin_name)); - if(ident.entity->kind == Entity_Variable) { + if(ident.entity.load()->kind == Entity_Variable) { error_line("\tSuggestion: Variables referencing a procedure are not allowed, they are not a direct procedure reference."); } else { error_line("\tSuggestion: Ensure '%s' is not a runtime-evaluated expression.", e); // NOTE(harold): Is this case possible to hit? diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 929239486..367e7be75 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -2419,7 +2419,7 @@ gb_internal lbValue lb_handle_objc_block(lbProcedure *p, Ast *expr) { Ast *proc_lit = unparen_expr(ce->args[capture_arg_count]); if (proc_lit->kind == Ast_Ident) { - proc_lit = proc_lit->Ident.entity->decl_info->proc_lit; + proc_lit = proc_lit->Ident.entity.load()->decl_info->proc_lit; } GB_ASSERT(proc_lit->kind == Ast_ProcLit); diff --git a/src/parser.hpp b/src/parser.hpp index 39f56ffae..1026433d0 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -425,7 +425,7 @@ struct AstSplitArgs { #define AST_KINDS \ AST_KIND(Ident, "identifier", struct { \ Token token; \ - Entity *entity; \ + std::atomic entity; \ u32 hash; \ }) \ AST_KIND(Implicit, "implicit", Token) \ @@ -856,19 +856,19 @@ gb_global isize const ast_variant_sizes[] = { }; struct AstCommonStuff { - AstKind kind; // u16 - u8 state_flags; - u8 viral_state_flags; - i32 file_id; - TypeAndValue tav; // NOTE(bill): Making this a pointer is slower + AstKind kind; // u16 + u8 state_flags; + std::atomic viral_state_flags; + i32 file_id; + TypeAndValue tav; // NOTE(bill): Making this a pointer is slower }; struct Ast { - AstKind kind; // u16 - u8 state_flags; - u8 viral_state_flags; - i32 file_id; - TypeAndValue tav; // NOTE(bill): Making this a pointer is slower + AstKind kind; // u16 + u8 state_flags; + std::atomic viral_state_flags; + i32 file_id; + TypeAndValue tav; // NOTE(bill): Making this a pointer is slower // IMPORTANT NOTE(bill): This must be at the end since the AST is allocated to be size of the variant union { From 20a7a645c22f20eb60d9c6612e4a3d84f864087e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 10:48:55 +0000 Subject: [PATCH 304/766] Mock out TSAN_* usage in thread_pool.cpp --- src/thread_pool.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/thread_pool.cpp b/src/thread_pool.cpp index ca6483fd9..a0afbd269 100644 --- a/src/thread_pool.cpp +++ b/src/thread_pool.cpp @@ -1,5 +1,15 @@ // thread_pool.cpp +// TODO(bill): make work on MSVC +// #if defined(__SANITIZE_THREAD__) || (defined(__has_feature) && __has_feature(thread_sanitizer)) +// #include +// #define TSAN_RELEASE(addr) __tsan_release(addr) +// #define TSAN_ACQUIRE(addr) __tsan_acquire(addr) +// #else +#define TSAN_RELEASE(addr) +#define TSAN_ACQUIRE(addr) +// #endif + struct WorkerTask; struct ThreadPool; @@ -88,6 +98,7 @@ void thread_pool_queue_push(Thread *thread, WorkerTask task) { } cur_ring->buffer[bot % cur_ring->size] = task; + TSAN_RELEASE(cur_ring->buffer[bot % cur_ring->size]); std::atomic_thread_fence(std::memory_order_release); thread->queue.bottom.store(bot + 1, std::memory_order_relaxed); @@ -108,6 +119,7 @@ GrabState thread_pool_queue_take(Thread *thread, WorkerTask *task) { if (top <= bot) { // Queue is not empty + TSAN_ACQUIRE(cur_ring->buffer[bot % cur_ring->size]); *task = cur_ring->buffer[bot % cur_ring->size]; if (top == bot) { // Only one entry left in queue @@ -139,6 +151,8 @@ GrabState thread_pool_queue_steal(Thread *thread, WorkerTask *task) { if (top < bot) { // Queue is not empty TaskRingBuffer *cur_ring = thread->queue.ring.load(std::memory_order_consume); + + TSAN_ACQUIRE(&cur_ring->buffer[top % cur_ring->size]); *task = cur_ring->buffer[top % cur_ring->size]; if (!thread->queue.top.compare_exchange_strong(top, top + 1, std::memory_order_seq_cst, std::memory_order_relaxed)) { From cb50725b866ef7020f9bd82a1c39d4d8f7158e97 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 10:50:30 +0000 Subject: [PATCH 305/766] Use `compare_exchange_strong` `mutex_lock` on non-windows sytems --- src/threading.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/threading.cpp b/src/threading.cpp index 02e6de14b..3b2f304e1 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -367,16 +367,16 @@ gb_internal void semaphore_wait(Semaphore *s) { gb_internal void mutex_lock(BlockingMutex *m) { ANNOTATE_LOCK_PRE(m, 0); - i32 v = m->state().exchange(Internal_Mutex_State_Locked, std::memory_order_acquire); - if (v != Internal_Mutex_State_Unlocked) { + i32 expected = Internal_Mutex_State_Unlocked; + if (m->state().compare_exchange_strong(expected, Internal_Mutex_State_Locked, std::memory_order_acquire)) { mutex_lock_slow(m, v); } ANNOTATE_LOCK_POST(m); } gb_internal bool mutex_try_lock(BlockingMutex *m) { ANNOTATE_LOCK_PRE(m, 1); - i32 v = m->state().exchange(Internal_Mutex_State_Locked, std::memory_order_acquire); - if (v == Internal_Mutex_State_Unlocked) { + i32 expected = Internal_Mutex_State_Unlocked; + if (m->state().compare_exchange_strong(expected, Internal_Mutex_State_Locked, std::memory_order_acquire)) { ANNOTATE_LOCK_POST(m); return true; } From d086a16f64d7cfd501cf8f1ebe5385c6afc23d3a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 10:52:14 +0000 Subject: [PATCH 306/766] Make atomic `variant_block_size` and `tag_size` in `TypeUnion` --- src/types.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/types.cpp b/src/types.cpp index a7f2bfda2..9ecdf5cdd 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -170,21 +170,21 @@ struct TypeStruct { }; struct TypeUnion { - Slice variants; + Slice variants; - Ast * node; - Scope * scope; + Ast * node; + Scope * scope; - i64 variant_block_size; - i64 custom_align; - Type * polymorphic_params; // Type_Tuple - Type * polymorphic_parent; - Wait_Signal polymorphic_wait_signal; + std::atomic variant_block_size; + i64 custom_align; + Type * polymorphic_params; // Type_Tuple + Type * polymorphic_parent; + Wait_Signal polymorphic_wait_signal; - i16 tag_size; - bool is_polymorphic; - bool is_poly_specialized; - UnionTypeKind kind; + std::atomic tag_size; + bool is_polymorphic; + bool is_poly_specialized; + UnionTypeKind kind; }; struct TypeProc { From 74347f3069972a7580c0bf2d4f3b1b65eb940cc5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 10:53:18 +0000 Subject: [PATCH 307/766] Make `Entity.code_gen_*` atomic --- src/entity.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/entity.cpp b/src/entity.cpp index 55aca8069..97c908fea 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -181,11 +181,11 @@ struct Entity { Entity * aliased_of; union { - struct lbModule *code_gen_module; + std::atomic code_gen_module; struct cgModule *cg_module; }; union { - struct lbProcedure *code_gen_procedure; + std::atomic code_gen_procedure; struct cgProcedure *cg_procedure; }; From 8a92ba74fc90b70f56af5e0dcfd37c16aab94595 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 10:54:49 +0000 Subject: [PATCH 308/766] Make `defer_use_checked` and `where_clauses_evaluated` atomic --- src/check_decl.cpp | 8 ++++---- src/checker.hpp | 12 ++++++------ src/llvm_backend_proc.cpp | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 8019d00c3..22a74f370 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -2155,7 +2155,7 @@ gb_internal bool check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *de rw_mutex_unlock(&ctx->scope->mutex); - bool where_clause_ok = evaluate_where_clauses(ctx, nullptr, decl->scope, &decl->proc_lit->ProcLit.where_clauses, !decl->where_clauses_evaluated); + bool where_clause_ok = evaluate_where_clauses(ctx, nullptr, decl->scope, &decl->proc_lit->ProcLit.where_clauses, !decl->where_clauses_evaluated.load(std::memory_order_relaxed)); if (!where_clause_ok) { // NOTE(bill, 2019-08-31): Don't check the body as the where clauses failed return false; @@ -2173,15 +2173,15 @@ gb_internal bool check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *de } GB_ASSERT(decl->proc_checked_state != ProcCheckedState_Checked); - if (decl->defer_use_checked) { + if (decl->defer_use_checked.load(std::memory_order_relaxed)) { GB_ASSERT(is_type_polymorphic(type, true)); error(token, "Defer Use Checked: %.*s", LIT(decl->entity.load()->token.string)); - GB_ASSERT(decl->defer_use_checked == false); + GB_ASSERT(decl->defer_use_checked.load(std::memory_order_relaxed) == false); } check_stmt_list(ctx, bs->stmts, Stmt_CheckScopeDecls); - decl->defer_use_checked = true; + decl->defer_use_checked.store(true, std::memory_order_relaxed); for (Ast *stmt : bs->stmts) { if (stmt->kind == Ast_ValueDecl) { diff --git a/src/checker.hpp b/src/checker.hpp index f9c279a51..7ca50d593 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -221,14 +221,14 @@ struct DeclInfo { Entity * para_poly_original; - bool is_using; - bool where_clauses_evaluated; - bool foreign_require_results; + bool is_using; + bool foreign_require_results; + std::atomic where_clauses_evaluated; std::atomic proc_checked_state; - BlockingMutex proc_checked_mutex; - isize defer_used; - bool defer_use_checked; + BlockingMutex proc_checked_mutex; + isize defer_used; + std::atomic defer_use_checked; CommentGroup *comment; CommentGroup *docs; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 837d7ce48..dc502717e 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -676,7 +676,7 @@ gb_internal void lb_begin_procedure_body(lbProcedure *p) { lbAddr res = {}; if (p->entity && p->entity->decl_info && - p->entity->decl_info->defer_use_checked && + p->entity->decl_info->defer_use_checked.load(std::memory_order_relaxed) && p->entity->decl_info->defer_used == 0) { // NOTE(bill): this is a bodge to get around the issue of the problem BELOW From acabae8644dc5fb9cfb1c7dbb2f45625529ab760 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 10:58:25 +0000 Subject: [PATCH 309/766] Make `Entity.parent_proc_decl` atomic --- src/entity.cpp | 4 ++-- src/llvm_backend_proc.cpp | 6 ++++-- src/name_canonicalization.cpp | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/entity.cpp b/src/entity.cpp index 97c908fea..070b05462 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -170,7 +170,7 @@ struct Entity { Type * type; std::atomic identifier; // Can be nullptr DeclInfo * decl_info; - DeclInfo * parent_proc_decl; // nullptr if in file/global scope + std::atomic parent_proc_decl; // nullptr if in file/global scope AstFile * file; AstPackage *pkg; @@ -370,7 +370,7 @@ gb_internal Entity *alloc_entity_using_variable(Entity *parent, Token token, Typ token.pos = parent->token.pos; Entity *entity = alloc_entity(Entity_Variable, parent->scope, token, type); entity->using_parent = parent; - entity->parent_proc_decl = parent->parent_proc_decl; + entity->parent_proc_decl.store(parent->parent_proc_decl, std::memory_order_relaxed); entity->using_expr = using_expr; entity->flags |= EntityFlag_Using; entity->flags |= EntityFlag_Used; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index dc502717e..44a463e31 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2215,8 +2215,10 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu Entity *e = entity_of_node(ident); GB_ASSERT(e != nullptr); - if (e->parent_proc_decl != nullptr && e->parent_proc_decl->entity != nullptr) { - procedure = e->parent_proc_decl->entity.load()->token.string; + DeclInfo *parent_proc_decl = e->parent_proc_decl.load(std::memory_order_relaxed); + if (parent_proc_decl != nullptr && + parent_proc_decl->entity != nullptr) { + procedure = parent_proc_decl->entity.load()->token.string; } else { procedure = str_lit(""); } diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index f1dccb182..d3faefed7 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -559,8 +559,8 @@ gb_internal void write_canonical_parent_prefix(TypeWriter *w, Entity *e) { // no prefix return; } - if (e->parent_proc_decl) { - Entity *p = e->parent_proc_decl->entity; + if (e->parent_proc_decl.load(std::memory_order_relaxed)) { + Entity *p = e->parent_proc_decl.load(std::memory_order_relaxed)->entity; write_canonical_parent_prefix(w, p); type_writer_append(w, p->token.string.text, p->token.string.len); if (is_type_polymorphic(p->type)) { From c7f40b8b8fb129acf369cca7dd472626e983d1b4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:03:22 +0000 Subject: [PATCH 310/766] Use mutex striping for `add_type_and_value` --- src/checker.cpp | 37 ++++++++++++++++++++++++++++--------- src/checker.hpp | 2 +- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 453f3e241..34fa91384 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1792,7 +1792,22 @@ gb_internal void add_untyped(CheckerContext *c, Ast *expr, AddressingMode mode, check_set_expr_info(c, expr, mode, type, value); } -gb_internal void add_type_and_value(CheckerContext *ctx, Ast *expr, AddressingMode mode, Type *type, ExactValue const &value, bool use_mutex) { +struct TypeAndValueMutexStripes alignas(GB_CACHE_LINE_SIZE) { + BlockingMutex mutex; + u8 padding[GB_CACHE_LINE_SIZE - gb_size_of(BlockingMutex)]; +}; + +enum { TypeAndValueMutexStripes_COUNT = 128 }; +gb_global TypeAndValueMutexStripes tav_mutex_stripes[TypeAndValueMutexStripes_COUNT]; + +gb_internal BlockingMutex *tav_mutex_for_node(Ast *node) { + GB_ASSERT(node != nullptr); + uintptr h = cast(uintptr)node; + h ^= h >> 6; + return &tav_mutex_stripes[h % TypeAndValueMutexStripes_COUNT].mutex; +} + +gb_internal void add_type_and_value(CheckerContext *ctx, Ast *expr, AddressingMode mode, Type *type, ExactValue const &value) { if (expr == nullptr) { return; } @@ -1803,14 +1818,18 @@ gb_internal void add_type_and_value(CheckerContext *ctx, Ast *expr, AddressingMo return; } - BlockingMutex *mutex = &ctx->info->type_and_value_mutex; - if (ctx->decl) { - mutex = &ctx->decl->type_and_value_mutex; - } else if (ctx->pkg) { - mutex = &ctx->pkg->type_and_value_mutex; - } + BlockingMutex *mutex = tav_mutex_for_node(expr); - if (use_mutex) mutex_lock(mutex); + /* Previous logic: + BlockingMutex *mutex = &ctx->info->type_and_value_mutex; + if (ctx->decl) { + mutex = &ctx->decl->type_and_value_mutex; + } else if (ctx->pkg) { + mutex = &ctx->pkg->type_and_value_mutex; + } + */ + + mutex_lock(mutex); Ast *prev_expr = nullptr; while (prev_expr != expr) { prev_expr = expr; @@ -1835,7 +1854,7 @@ gb_internal void add_type_and_value(CheckerContext *ctx, Ast *expr, AddressingMo break; }; } - if (use_mutex) mutex_unlock(mutex); + mutex_unlock(mutex); } gb_internal void add_entity_definition(CheckerInfo *i, Ast *identifier, Entity *entity) { diff --git a/src/checker.hpp b/src/checker.hpp index 7ca50d593..374aaf10d 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -631,7 +631,7 @@ gb_internal void scope_lookup_parent (Scope *s, String const &name, Scope **s gb_internal Entity *scope_insert (Scope *s, Entity *entity); -gb_internal void add_type_and_value (CheckerContext *c, Ast *expression, AddressingMode mode, Type *type, ExactValue const &value, bool use_mutex=true); +gb_internal void add_type_and_value (CheckerContext *c, Ast *expression, AddressingMode mode, Type *type, ExactValue const &value); gb_internal ExprInfo *check_get_expr_info (CheckerContext *c, Ast *expr); gb_internal void add_untyped (CheckerContext *c, Ast *expression, AddressingMode mode, Type *basic_type, ExactValue const &value); gb_internal void add_entity_use (CheckerContext *c, Ast *identifier, Entity *entity); From ad2122a7fc867edcb8af6e4b3d01fb06a0c8a055 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:05:30 +0000 Subject: [PATCH 311/766] Move `alignas` to before name --- src/checker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/checker.cpp b/src/checker.cpp index 34fa91384..9568b8cfa 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1792,7 +1792,7 @@ gb_internal void add_untyped(CheckerContext *c, Ast *expr, AddressingMode mode, check_set_expr_info(c, expr, mode, type, value); } -struct TypeAndValueMutexStripes alignas(GB_CACHE_LINE_SIZE) { +struct alignas(GB_CACHE_LINE_SIZE) TypeAndValueMutexStripes { BlockingMutex mutex; u8 padding[GB_CACHE_LINE_SIZE - gb_size_of(BlockingMutex)]; }; From 21509ae3f4071dc3c520b4cd58e80ade4be41ce4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:06:16 +0000 Subject: [PATCH 312/766] Fix `mutex_lock` --- src/threading.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/threading.cpp b/src/threading.cpp index 3b2f304e1..d47421a80 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -369,7 +369,7 @@ gb_internal void semaphore_wait(Semaphore *s) { ANNOTATE_LOCK_PRE(m, 0); i32 expected = Internal_Mutex_State_Unlocked; if (m->state().compare_exchange_strong(expected, Internal_Mutex_State_Locked, std::memory_order_acquire)) { - mutex_lock_slow(m, v); + mutex_lock_slow(m, expected); } ANNOTATE_LOCK_POST(m); } From e014181abf06b1d50458518477b6e3fa8ab08c1a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:12:42 +0000 Subject: [PATCH 313/766] Move `values` construction to after padding has been set --- src/llvm_backend_const.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 8ce2137ab..57c07f5c9 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -736,13 +736,14 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb } LLVMValueRef tag = LLVMConstInt(LLVMStructGetTypeAtIndex(llvm_type, 1), tag_value, false); LLVMValueRef padding = nullptr; - LLVMValueRef values[3] = {cv.value, tag, padding}; isize value_count = 2; if (LLVMCountStructElementTypes(llvm_type) > 2) { value_count = 3; padding = LLVMConstNull(LLVMStructGetTypeAtIndex(llvm_type, 2)); } + + LLVMValueRef values[3] = {cv.value, tag, padding}; res.value = llvm_const_named_struct_internal(m, llvm_type, values, value_count); res.type = original_type; return res; From 3dccd4e3adb9ea88ac22da3608a2359897c28972 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:15:34 +0000 Subject: [PATCH 314/766] Fix debug info --- src/llvm_backend_debug.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index 187aebf7c..e9b0f72cb 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -729,22 +729,22 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { case Basic_i128be: return lb_debug_type_basic_type(m, str_lit("i128be"), 128, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagBigEndian); case Basic_u128be: return lb_debug_type_basic_type(m, str_lit("u128be"), 128, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagBigEndian); - case Basic_f16be: return lb_debug_type_basic_type(m, str_lit("f16be"), 16, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian); - case Basic_f32be: return lb_debug_type_basic_type(m, str_lit("f32be"), 32, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian); - case Basic_f64be: return lb_debug_type_basic_type(m, str_lit("f64be"), 64, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian); + case Basic_f16be: return lb_debug_type_basic_type(m, str_lit("f16be"), 16, LLVMDWARFTypeEncoding_Float, LLVMDIFlagBigEndian); + case Basic_f32be: return lb_debug_type_basic_type(m, str_lit("f32be"), 32, LLVMDWARFTypeEncoding_Float, LLVMDIFlagBigEndian); + case Basic_f64be: return lb_debug_type_basic_type(m, str_lit("f64be"), 64, LLVMDWARFTypeEncoding_Float, LLVMDIFlagBigEndian); case Basic_complex32: { LLVMMetadataRef elements[2] = {}; elements[0] = lb_debug_struct_field(m, str_lit("real"), t_f16, 0*16); elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f16, 1*16); - return lb_debug_basic_struct(m, str_lit("complex32"), 64, 32, elements, gb_count_of(elements)); + return lb_debug_basic_struct(m, str_lit("complex32"), 32, 16, elements, gb_count_of(elements)); } case Basic_complex64: { LLVMMetadataRef elements[2] = {}; elements[0] = lb_debug_struct_field(m, str_lit("real"), t_f32, 0*32); - elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f32, 2*32); + elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f32, 1*32); return lb_debug_basic_struct(m, str_lit("complex64"), 64, 32, elements, gb_count_of(elements)); } case Basic_complex128: @@ -762,7 +762,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { elements[1] = lb_debug_struct_field(m, str_lit("jmag"), t_f16, 1*16); elements[2] = lb_debug_struct_field(m, str_lit("kmag"), t_f16, 2*16); elements[3] = lb_debug_struct_field(m, str_lit("real"), t_f16, 3*16); - return lb_debug_basic_struct(m, str_lit("quaternion64"), 128, 32, elements, gb_count_of(elements)); + return lb_debug_basic_struct(m, str_lit("quaternion64"), 64, 16, elements, gb_count_of(elements)); } case Basic_quaternion128: { @@ -780,7 +780,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { elements[1] = lb_debug_struct_field(m, str_lit("jmag"), t_f64, 1*64); elements[2] = lb_debug_struct_field(m, str_lit("kmag"), t_f64, 2*64); elements[3] = lb_debug_struct_field(m, str_lit("real"), t_f64, 3*64); - return lb_debug_basic_struct(m, str_lit("quaternion256"), 256, 32, elements, gb_count_of(elements)); + return lb_debug_basic_struct(m, str_lit("quaternion256"), 256, 64, elements, gb_count_of(elements)); } @@ -792,6 +792,8 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { } case Basic_string: { + // NOTE(bill): size_of(^u8) <= size_of(int) + LLVMMetadataRef elements[2] = {}; elements[0] = lb_debug_struct_field(m, str_lit("data"), t_u8_ptr, 0); elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, int_bits); @@ -805,6 +807,8 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { case Basic_string16: { + // NOTE(bill): size_of(^u16) <= size_of(int) + LLVMMetadataRef elements[2] = {}; elements[0] = lb_debug_struct_field(m, str_lit("data"), t_u16_ptr, 0); elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, int_bits); @@ -820,7 +824,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { { LLVMMetadataRef elements[2] = {}; elements[0] = lb_debug_struct_field(m, str_lit("data"), t_rawptr, 0); - elements[1] = lb_debug_struct_field(m, str_lit("id"), t_typeid, 64); + elements[1] = lb_debug_struct_field(m, str_lit("id"), t_typeid, 64); // typeid is always 64 bits in size and 64 bits in alignment return lb_debug_basic_struct(m, str_lit("any"), 128, 64, elements, gb_count_of(elements)); } @@ -843,6 +847,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { GB_PANIC("Type_Named should be handled in lb_debug_type separately"); case Type_SoaPointer: + // TODO(bill): This is technically incorrect and needs fixing return LLVMDIBuilderCreatePointerType(m->debug_builder, lb_debug_type(m, type->SoaPointer.elem), int_bits, int_bits, 0, nullptr, 0); case Type_Pointer: return LLVMDIBuilderCreatePointerType(m->debug_builder, lb_debug_type(m, type->Pointer.elem), ptr_bits, ptr_bits, 0, nullptr, 0); From fde90931ded40cc9ebbbb9c80924df2cd20b2e60 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:16:05 +0000 Subject: [PATCH 315/766] Add case for completeness --- src/llvm_backend_expr.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index aba196af8..501108c49 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1377,6 +1377,8 @@ gb_internal LLVMValueRef lb_integer_modulo(lbProcedure *p, LLVMValueRef lhs, LLV if (LLVMIsConstant(rhs)) { if (LLVMIsNull(rhs)) { switch (behaviour) { + case IntegerDivisionByZero_trap: + break; case IntegerDivisionByZero_Self: return zero; case IntegerDivisionByZero_Zero: From 63c4faca75635c0203ff576d7392fe7a0f9bca6c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:19:00 +0000 Subject: [PATCH 316/766] Fix positions for debug locations in `defer`, loops, and `switch` clauses --- src/llvm_backend.hpp | 1 + src/llvm_backend_expr.cpp | 2 +- src/llvm_backend_proc.cpp | 2 +- src/llvm_backend_stmt.cpp | 26 ++++++++++++++++++++++++-- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 3491c0d39..a8076d75e 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -290,6 +290,7 @@ struct lbDefer { isize scope_index; isize context_stack_count; lbBlock * block; + TokenPos pos; union { Ast *stmt; struct { diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 501108c49..d4acfa196 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1377,7 +1377,7 @@ gb_internal LLVMValueRef lb_integer_modulo(lbProcedure *p, LLVMValueRef lhs, LLV if (LLVMIsConstant(rhs)) { if (LLVMIsNull(rhs)) { switch (behaviour) { - case IntegerDivisionByZero_trap: + case IntegerDivisionByZero_Trap: break; case IntegerDivisionByZero_Self: return zero; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 837d7ce48..795e6812f 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1288,7 +1288,7 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c } } - lb_add_defer_proc(p, p->scope_index, deferred, result_as_args); + lb_add_defer_proc(p, p->scope_index, deferred, result_as_args, e->token.pos); } } diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 81755af2d..05ec10cda 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -847,6 +847,10 @@ gb_internal void lb_build_range_interval(lbProcedure *p, AstBinaryExpr *node, lb_close_scope(p, lbDeferExit_Default, nullptr, node->left); lb_pop_target_list(p); + if (p->debug_info != nullptr) { + LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, rs->body)); + } + if (check != nullptr) { lb_emit_jump(p, check); lb_start_block(p, check); @@ -979,6 +983,9 @@ gb_internal void lb_build_range_tuple(lbProcedure *p, AstRangeStmt *rs, Scope *s lb_close_scope(p, lbDeferExit_Default, nullptr, rs->body); lb_pop_target_list(p); + if (p->debug_info != nullptr) { + LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, rs->body)); + } lb_emit_jump(p, loop); lb_start_block(p, done); } @@ -1108,6 +1115,9 @@ gb_internal void lb_build_range_stmt_struct_soa(lbProcedure *p, AstRangeStmt *rs lb_close_scope(p, lbDeferExit_Default, nullptr, rs->body); lb_pop_target_list(p); + if (p->debug_info != nullptr) { + LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, rs->body)); + } lb_emit_jump(p, loop); lb_start_block(p, done); @@ -1330,6 +1340,9 @@ gb_internal void lb_build_range_stmt(lbProcedure *p, AstRangeStmt *rs, Scope *sc lb_close_scope(p, lbDeferExit_Default, nullptr, rs->body); lb_pop_target_list(p); + if (p->debug_info != nullptr) { + LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, rs->body)); + } lb_emit_jump(p, loop); lb_start_block(p, done); } @@ -1807,6 +1820,10 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope * } lbBlock *next_cond = nullptr; + if (p->debug_info != nullptr) { + LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, clause)); + } + for (Ast *expr : cc->list) { expr = unparen_expr(expr); @@ -3164,6 +3181,9 @@ gb_internal void lb_build_defer_stmt(lbProcedure *p, lbDefer const &d) { if (d.kind == lbDefer_Node) { lb_build_stmt(p, d.stmt); } else if (d.kind == lbDefer_Proc) { + if (p->debug_info != nullptr && d.pos.line > 0) { + LLVMSetCurrentDebugLocation2(p->builder, lb_debug_location_from_token_pos(p, d.pos)); + } lb_emit_call(p, d.proc.deferred, d.proc.result_as_args); } } @@ -3240,10 +3260,11 @@ gb_internal void lb_add_defer_node(lbProcedure *p, isize scope_index, Ast *stmt) d->scope_index = scope_index; d->context_stack_count = p->context_stack.count; d->block = p->curr_block; - d->stmt = stmt; + d->pos = ast_token(stmt).pos; + d->stmt = stmt; } -gb_internal void lb_add_defer_proc(lbProcedure *p, isize scope_index, lbValue deferred, Array const &result_as_args) { +gb_internal void lb_add_defer_proc(lbProcedure *p, isize scope_index, lbValue deferred, Array const &result_as_args, TokenPos pos) { Type *pt = base_type(p->type); GB_ASSERT(pt->kind == Type_Proc); if (pt->Proc.calling_convention == ProcCC_Odin) { @@ -3254,6 +3275,7 @@ gb_internal void lb_add_defer_proc(lbProcedure *p, isize scope_index, lbValue de d->kind = lbDefer_Proc; d->scope_index = p->scope_index; d->block = p->curr_block; + d->pos = pos; d->context_stack_count = p->context_stack.count; d->proc.deferred = deferred; d->proc.result_as_args = result_as_args; From b183b1219c3b336988e53235a0671958b5079c09 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:25:49 +0000 Subject: [PATCH 317/766] Revert `mutex_lock` logic --- src/threading.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/threading.cpp b/src/threading.cpp index d47421a80..d8ae321f5 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -367,9 +367,9 @@ gb_internal void semaphore_wait(Semaphore *s) { gb_internal void mutex_lock(BlockingMutex *m) { ANNOTATE_LOCK_PRE(m, 0); - i32 expected = Internal_Mutex_State_Unlocked; - if (m->state().compare_exchange_strong(expected, Internal_Mutex_State_Locked, std::memory_order_acquire)) { - mutex_lock_slow(m, expected); + i32 v = m->state().exchange(Internal_Mutex_State_Locked, std::memory_order_acquire); + if (v != Internal_Mutex_State_Unlocked) { + mutex_lock_slow(m, v); } ANNOTATE_LOCK_POST(m); } From c85af4a454dac14a8b557fa80fe68f5bf1905673 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:27:41 +0000 Subject: [PATCH 318/766] Fix #6202 --- src/llvm_backend_proc.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 837d7ce48..c80241e09 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -983,7 +983,9 @@ gb_internal lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue break; case ProcTailing_must_tail: LLVMSetTailCall(ret, true); + #if LLVM_VERSION_MAJOR > 14 LLVMSetTailCallKind(ret, LLVMTailCallKindMustTail); + #endif break; } From 041ebdd8f6b9cc3c2274ae9284e51d0e70602e00 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:39:17 +0000 Subject: [PATCH 319/766] Add parent mutex lock for `scope_insert_with_name` --- src/checker.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/checker.cpp b/src/checker.cpp index 9568b8cfa..71ccfebc4 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -495,15 +495,18 @@ gb_internal Entity *scope_insert_with_name(Scope *s, String const &name, Entity goto end; } if (s->parent != nullptr && (s->parent->flags & ScopeFlag_Proc) != 0) { + rw_mutex_shared_lock(&s->parent->mutex); found = string_map_get(&s->parent->elements, key); if (found) { if ((*found)->flags & EntityFlag_Result) { if (entity != *found) { result = *found; } + rw_mutex_shared_unlock(&s->parent->mutex); goto end; } } + rw_mutex_shared_unlock(&s->parent->mutex); } string_map_set(&s->elements, key, entity); From 2bbedda61c91eca763b4ef07e889c12372c66560 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:39:57 +0000 Subject: [PATCH 320/766] Remove unneeded mutex in `hash_exact_value` --- src/exact_value.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/exact_value.cpp b/src/exact_value.cpp index 0f425e043..fa99ed3fe 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -1,8 +1,6 @@ #include #include -gb_global BlockingMutex hash_exact_value_mutex; - struct Ast; struct HashKey; struct Type; @@ -54,9 +52,6 @@ struct ExactValue { gb_global ExactValue const empty_exact_value = {}; gb_internal uintptr hash_exact_value(ExactValue v) { - mutex_lock(&hash_exact_value_mutex); - defer (mutex_unlock(&hash_exact_value_mutex)); - uintptr res = 0; switch (v.kind) { From 8594deb4e1f0c75fdcf5e0351e193f2d9e267b5f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:40:30 +0000 Subject: [PATCH 321/766] Move `return true;` to after the if check --- src/types.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types.cpp b/src/types.cpp index 9ecdf5cdd..fa4aa8730 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -4317,8 +4317,8 @@ gb_internal bool type_set_offsets(Type *t) { t->Struct.offsets = type_set_offsets_of(t->Struct.fields, t->Struct.is_packed, t->Struct.is_raw_union, t->Struct.custom_min_field_align, t->Struct.custom_max_field_align); t->Struct.are_offsets_being_processed.store(false); t->Struct.are_offsets_set = true; - return true; } + return true; } else if (is_type_tuple(t)) { MUTEX_GUARD(&t->Tuple.mutex); if (!t->Tuple.are_offsets_set) { @@ -4326,8 +4326,8 @@ gb_internal bool type_set_offsets(Type *t) { t->Tuple.offsets = type_set_offsets_of(t->Tuple.variables, t->Tuple.is_packed, false, 1, 0); t->Tuple.are_offsets_being_processed.store(false); t->Tuple.are_offsets_set = true; - return true; } + return true; } else { GB_PANIC("Invalid type for setting offsets"); } From a936f3fb7d3f6e6abf5e2599b7043625a1a0c17b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 11:41:33 +0000 Subject: [PATCH 322/766] Comment out `t->Struct.are_offsets_being_processed.load()` --- src/types.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/types.cpp b/src/types.cpp index fa4aa8730..0ecce1adc 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -4308,9 +4308,9 @@ gb_internal i64 *type_set_offsets_of(Slice const &fields, bool is_pack gb_internal bool type_set_offsets(Type *t) { t = base_type(t); if (t->kind == Type_Struct) { - if (t->Struct.are_offsets_being_processed.load()) { - return true; - } + // if (t->Struct.are_offsets_being_processed.load()) { + // return true; + // } MUTEX_GUARD(&t->Struct.offset_mutex); if (!t->Struct.are_offsets_set) { t->Struct.are_offsets_being_processed.store(true); From 3a7c4994acb13d2a77baf5a7911ddac666562092 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 2 Feb 2026 13:11:23 +0100 Subject: [PATCH 323/766] Fix #6204 Use temporary stack buffers and some global scratch space to remove the need for any allocator. --- core/sys/info/platform_windows.odin | 152 ++++++++++++++-------------- core/sys/info/sysinfo.odin | 29 ++++++ core/unicode/utf16/utf16.odin | 22 ++-- 3 files changed, 118 insertions(+), 85 deletions(-) diff --git a/core/sys/info/platform_windows.odin b/core/sys/info/platform_windows.odin index bad99f811..c28170919 100644 --- a/core/sys/info/platform_windows.odin +++ b/core/sys/info/platform_windows.odin @@ -3,17 +3,12 @@ package sysinfo import sys "core:sys/windows" import "base:intrinsics" import "core:strings" -import "core:strconv" import "core:unicode/utf16" - -// import "core:fmt" import "base:runtime" -@(private) -version_string_buf: [1024]u8 - @(init, private) init_os_version :: proc "contextless" () { + // NOTE(Jeroen): Only needed for the string builder. context = runtime.default_context() /* @@ -226,14 +221,14 @@ init_os_version :: proc "contextless" () { // Grab Windows DisplayVersion (like 20H02) format_display_version :: proc (b: ^strings.Builder) -> (version: string) { - dv, ok := read_reg_string( + scratch: [512]u8 + + if dv, ok := read_reg_string( sys.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "DisplayVersion", - ) - defer delete(dv) // It'll be interned into `version_string_buf` - - if ok { + scratch[:], + ); ok { strings.write_string(b, " (version: ") l := strings.builder_len(b^) strings.write_string(b, dv) @@ -245,13 +240,11 @@ init_os_version :: proc "contextless" () { // Grab build number and UBR format_build_number :: proc (b: ^strings.Builder, major_build: int) -> (ubr: int) { - res, ok := read_reg_i32( + if res, ok := read_reg_i32( sys.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "UBR", - ) - - if ok { + ); ok { ubr = int(res) strings.write_string(b, ", build: ") strings.write_int(b, major_build) @@ -283,9 +276,6 @@ init_ram :: proc "contextless" () { init_gpu_info :: proc "contextless" () { GPU_ROOT_KEY :: `SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}` - context = runtime.default_context() - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - gpu_key: sys.HKEY if status := sys.RegOpenKeyExW( sys.HKEY_LOCAL_MACHINE, @@ -298,16 +288,18 @@ init_gpu_info :: proc "contextless" () { } defer sys.RegCloseKey(gpu_key) - gpu_list: [dynamic]GPU gpu: ^GPU + gpu_count := 0 index := sys.DWORD(0) - for { + gpu_loop: for { defer index += 1 buf_wstring: [100]u16 buf_len := u32(len(buf_wstring)) - buf_utf8: [4 * len(buf_wstring)]u8 + buf_key: [4 * len(buf_wstring)]u8 + buf_leaf: [100]u8 + buf_scratch: [100]u8 if status := sys.RegEnumKeyW( gpu_key, @@ -318,59 +310,71 @@ init_gpu_info :: proc "contextless" () { break } - utf16.decode_to_utf8(buf_utf8[:], buf_wstring[:]) - leaf := string(cstring(&buf_utf8[0])) + utf16.decode_to_utf8(buf_leaf[:], buf_wstring[:]) + leaf := string(cstring(&buf_leaf[0])) // Skip leafs that are not of the form 000x - if _, is_integer := strconv.parse_int(leaf, 10); !is_integer { + if !is_integer(leaf) { continue } - key := strings.concatenate({GPU_ROOT_KEY, "\\", leaf}, context.temp_allocator) + n := copy(buf_key[:], GPU_ROOT_KEY) + buf_key[n] = '\\' + copy(buf_key[n+1:], leaf) - if vendor, ok := read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "ProviderName"); ok { - idx := append(&gpu_list, GPU{vendor_name = vendor}) - gpu = &gpu_list[idx - 1] + key_len := len(GPU_ROOT_KEY) + len(leaf) + 1 + + utf16.encode_string(buf_wstring[:], string(buf_key[:key_len])) + key := cstring16(&buf_wstring[0]) + + if res, ok := read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "ProviderName", buf_scratch[:]); ok { + if vendor, s_ok := intern_gpu_string(res); s_ok { + gpu = &_gpus[gpu_count] + gpu.vendor_name = vendor + } else { + break gpu_loop + } } else { continue } - if desc, ok := read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "DriverDesc"); ok { - gpu.model_name = desc + if res, ok := read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "DriverDesc", buf_scratch[:]); ok { + if model_name, s_ok := intern_gpu_string(res); s_ok { + gpu = &_gpus[gpu_count] + gpu.model_name = model_name + } else { + break gpu_loop + } } if vram, ok := read_reg_i64(sys.HKEY_LOCAL_MACHINE, key, "HardwareInformation.qwMemorySize"); ok { gpu.total_ram = int(vram) } + + gpu_count += 1 + if gpu_count > MAX_GPUS { + break gpu_loop + } } - gpus = gpu_list[:] + gpus = _gpus[:gpu_count] } @(private) -read_reg_string :: proc(hkey: sys.HKEY, subkey, val: string) -> (res: string, ok: bool) { +read_reg_string :: proc "contextless" (hkey: sys.HKEY, subkey, val: cstring16, res_buf: []u8) -> (res: string, ok: bool) { if len(subkey) == 0 || len(val) == 0 { return } - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - - BUF_SIZE :: 1024 - key_name_wide := make([]u16, BUF_SIZE, context.temp_allocator) - val_name_wide := make([]u16, BUF_SIZE, context.temp_allocator) - - utf16.encode_string(key_name_wide, subkey) - utf16.encode_string(val_name_wide, val) - - result_wide := make([]u16, BUF_SIZE, context.temp_allocator) - result_size := sys.DWORD(BUF_SIZE * size_of(u16)) + buf_utf16: [1024]u16 + result_size := sys.DWORD(size_of(buf_utf16)) status := sys.RegGetValueW( hkey, - cstring16(&key_name_wide[0]), - cstring16(&val_name_wide[0]), + subkey, + val, sys.RRF_RT_REG_SZ, nil, - raw_data(result_wide[:]), + raw_data(buf_utf16[:]), &result_size, ) if status != 0 { @@ -378,31 +382,22 @@ read_reg_string :: proc(hkey: sys.HKEY, subkey, val: string) -> (res: string, ok return } - // Result string will be allocated for the caller. - result_utf8 := make([]u8, BUF_SIZE * 4, context.temp_allocator) - utf16.decode_to_utf8(result_utf8, result_wide[:result_size]) - return strings.clone_from_cstring(cstring(raw_data(result_utf8))), true + utf16.decode_to_utf8(res_buf[:result_size], buf_utf16[:]) + res = string(cstring(&res_buf[0])) + return res, true } + @(private) -read_reg_i32 :: proc(hkey: sys.HKEY, subkey, val: string) -> (res: i32, ok: bool) { +read_reg_i32 :: proc "contextless" (hkey: sys.HKEY, subkey, val: cstring16) -> (res: i32, ok: bool) { if len(subkey) == 0 || len(val) == 0 { return } - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - - BUF_SIZE :: 1024 - key_name_wide := make([]u16, BUF_SIZE, context.temp_allocator) - val_name_wide := make([]u16, BUF_SIZE, context.temp_allocator) - - utf16.encode_string(key_name_wide, subkey) - utf16.encode_string(val_name_wide, val) - result_size := sys.DWORD(size_of(i32)) status := sys.RegGetValueW( hkey, - cstring16(&key_name_wide[0]), - cstring16(&val_name_wide[0]), + subkey, + val, sys.RRF_RT_REG_DWORD, nil, &res, @@ -410,26 +405,18 @@ read_reg_i32 :: proc(hkey: sys.HKEY, subkey, val: string) -> (res: i32, ok: bool ) return res, status == 0 } + @(private) -read_reg_i64 :: proc(hkey: sys.HKEY, subkey, val: string) -> (res: i64, ok: bool) { +read_reg_i64 :: proc "contextless" (hkey: sys.HKEY, subkey, val: cstring16) -> (res: i64, ok: bool) { if len(subkey) == 0 || len(val) == 0 { return } - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - - BUF_SIZE :: 1024 - key_name_wide := make([]u16, BUF_SIZE, context.temp_allocator) - val_name_wide := make([]u16, BUF_SIZE, context.temp_allocator) - - utf16.encode_string(key_name_wide, subkey) - utf16.encode_string(val_name_wide, val) - result_size := sys.DWORD(size_of(i64)) status := sys.RegGetValueW( hkey, - cstring16(&key_name_wide[0]), - cstring16(&val_name_wide[0]), + subkey, + val, sys.RRF_RT_REG_QWORD, nil, &res, @@ -437,3 +424,20 @@ read_reg_i64 :: proc(hkey: sys.HKEY, subkey, val: string) -> (res: i64, ok: bool ) return res, status == 0 } + +@(private) +is_integer :: proc "contextless" (s: string) -> (ok: bool) { + if s == "" { + return + } + + ok = true + + for r in s { + switch r { + case '0'..='9': continue + case: return false + } + } + return +} \ No newline at end of file diff --git a/core/sys/info/sysinfo.odin b/core/sys/info/sysinfo.odin index 75cc237c6..07f8f0c81 100644 --- a/core/sys/info/sysinfo.odin +++ b/core/sys/info/sysinfo.odin @@ -48,3 +48,32 @@ GPU :: struct { model_name: string, total_ram: int, } + +@(private) +version_string_buf: [1024]u8 + +@(private) +MAX_GPUS :: 16 + +@(private) +_gpus: [MAX_GPUS]GPU + +@(private) +_gpu_string_buf: [MAX_GPUS * 256 * 2]u8 // Reserve up to 256 bytes for each GPU's vendor and model name + +@(private) +_gpu_string_offset: int + +@(private) +intern_gpu_string :: proc "contextless" (str: string) -> (res: string, ok: bool) { + if _gpu_string_offset + len(str) + 1 > size_of(_gpu_string_buf) { + return "", false + } + + n := copy(_gpu_string_buf[_gpu_string_offset:], str) + _gpu_string_buf[_gpu_string_offset + len(str)] = 0 + res = string(_gpu_string_buf[_gpu_string_offset:][:len(str)]) + _gpu_string_offset += n + 1 + + return res, true +} \ No newline at end of file diff --git a/core/unicode/utf16/utf16.odin b/core/unicode/utf16/utf16.odin index 990d5bafa..5cc996f8b 100644 --- a/core/unicode/utf16/utf16.odin +++ b/core/unicode/utf16/utf16.odin @@ -12,11 +12,11 @@ _surr3 :: 0xe000 _surr_self :: 0x10000 -is_surrogate :: proc(r: rune) -> bool { +is_surrogate :: proc "contextless" (r: rune) -> bool { return _surr1 <= r && r < _surr3 } -decode_surrogate_pair :: proc(r1, r2: rune) -> rune { +decode_surrogate_pair :: proc "contextless" (r1, r2: rune) -> rune { if _surr1 <= r1 && r1 < _surr2 && _surr2 <= r2 && r2 < _surr3 { return (r1-_surr1)<<10 | (r2 - _surr2) + _surr_self } @@ -24,7 +24,7 @@ decode_surrogate_pair :: proc(r1, r2: rune) -> rune { } -encode_surrogate_pair :: proc(c: rune) -> (r1, r2: rune) { +encode_surrogate_pair :: proc "contextless" (c: rune) -> (r1, r2: rune) { r := c if r < _surr_self || r > MAX_RUNE { return REPLACEMENT_CHAR, REPLACEMENT_CHAR @@ -33,7 +33,7 @@ encode_surrogate_pair :: proc(c: rune) -> (r1, r2: rune) { return _surr1 + (r>>10)&0x3ff, _surr2 + r&0x3ff } -encode :: proc(d: []u16, s: []rune) -> int { +encode :: proc "contextless" (d: []u16, s: []rune) -> int { n, m := 0, len(d) loop: for r in s { switch r { @@ -59,7 +59,7 @@ encode :: proc(d: []u16, s: []rune) -> int { } -encode_string :: proc(d: []u16, s: string) -> int { +encode_string :: proc "contextless" (d: []u16, s: string) -> int { n, m := 0, len(d) loop: for r in s { switch r { @@ -84,7 +84,7 @@ encode_string :: proc(d: []u16, s: string) -> int { return n } -decode :: proc(d: []rune, s: []u16) -> (n: int) { +decode :: proc "contextless" (d: []rune, s: []u16) -> (n: int) { for i := 0; i < len(s); i += 1 { if n >= len(d) { return @@ -107,7 +107,7 @@ decode :: proc(d: []rune, s: []u16) -> (n: int) { return } -decode_rune_in_string :: proc(s: string16) -> (r: rune, width: int) { +decode_rune_in_string :: proc "contextless" (s: string16) -> (r: rune, width: int) { r = rune(REPLACEMENT_CHAR) n := len(s) if n < 1 { @@ -144,7 +144,7 @@ rune_count :: proc{ rune_count_in_string, rune_count_in_slice, } -rune_count_in_string :: proc(s: string16) -> (n: int) { +rune_count_in_string :: proc "contextless" (s: string16) -> (n: int) { for i := 0; i < len(s); i += 1 { c := s[i] if _surr1 <= c && c < _surr2 && i+1 < len(s) && @@ -157,7 +157,7 @@ rune_count_in_string :: proc(s: string16) -> (n: int) { } -rune_count_in_slice :: proc(s: []u16) -> (n: int) { +rune_count_in_slice :: proc "contextless" (s: []u16) -> (n: int) { for i := 0; i < len(s); i += 1 { c := s[i] if _surr1 <= c && c < _surr2 && i+1 < len(s) && @@ -170,7 +170,7 @@ rune_count_in_slice :: proc(s: []u16) -> (n: int) { } -decode_to_utf8 :: proc(d: []byte, s: []u16) -> (n: int) { +decode_to_utf8 :: proc "contextless" (d: []byte, s: []u16) -> (n: int) { for i := 0; i < len(s); i += 1 { if n >= len(d) { return @@ -190,4 +190,4 @@ decode_to_utf8 :: proc(d: []byte, s: []u16) -> (n: int) { n += copy(d[n:], b[:w]) } return -} +} \ No newline at end of file From 98413ad15450ac871c1181d656a1afd717d482bb Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 2 Feb 2026 13:16:13 +0100 Subject: [PATCH 324/766] Remove duplicate buffer --- core/sys/info/platform_bsd.odin | 3 --- core/sys/info/platform_darwin.odin | 3 --- core/sys/info/platform_freebsd.odin | 3 --- core/sys/info/platform_linux.odin | 3 --- 4 files changed, 12 deletions(-) diff --git a/core/sys/info/platform_bsd.odin b/core/sys/info/platform_bsd.odin index 2f8d7f5bb..349b74002 100644 --- a/core/sys/info/platform_bsd.odin +++ b/core/sys/info/platform_bsd.odin @@ -6,9 +6,6 @@ import "core:strings" import "core:strconv" import "base:runtime" -@(private) -version_string_buf: [1024]u8 - @(init, private) init_os_version :: proc "contextless" () { context = runtime.default_context() diff --git a/core/sys/info/platform_darwin.odin b/core/sys/info/platform_darwin.odin index 07c26ec28..498c21846 100644 --- a/core/sys/info/platform_darwin.odin +++ b/core/sys/info/platform_darwin.odin @@ -7,9 +7,6 @@ import "core:strings" import "core:sys/unix" import NS "core:sys/darwin/Foundation" -@(private) -version_string_buf: [1024]u8 - @(init, private) init_platform :: proc "contextless" () { context = runtime.default_context() diff --git a/core/sys/info/platform_freebsd.odin b/core/sys/info/platform_freebsd.odin index eb39769de..ed5db6243 100644 --- a/core/sys/info/platform_freebsd.odin +++ b/core/sys/info/platform_freebsd.odin @@ -5,9 +5,6 @@ import "core:strings" import "core:strconv" import "base:runtime" -@(private) -version_string_buf: [1024]u8 - @(init, private) init_os_version :: proc "contextless" () { context = runtime.default_context() diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index 43cd580c1..671600640 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -7,9 +7,6 @@ import "core:strconv" import "core:strings" import "core:sys/linux" -@(private) -version_string_buf: [1024]u8 - @(init, private) init_os_version :: proc "contextless" () { context = runtime.default_context() From bb7496a2fcc58238a4e3abcc431313385a15183f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 14:28:16 +0000 Subject: [PATCH 325/766] Add `intrinsics.count_trailing_ones` and `intrinsics.count_leading_ones` --- base/intrinsics/intrinsics.odin | 2 ++ src/check_builtin.cpp | 23 +++++++++++++++++++++++ src/checker_builtin_procs.hpp | 4 ++++ src/llvm_backend_proc.cpp | 6 ++++++ src/llvm_backend_utility.cpp | 12 ++++++++++++ 5 files changed, 47 insertions(+) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index 2428e37b9..f06dbdfbf 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -38,6 +38,8 @@ count_ones :: proc(x: $T) -> T where type_is_integer(T) || type_is_sim count_zeros :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) --- count_trailing_zeros :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) --- count_leading_zeros :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) --- +count_trailing_ones :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) --- +count_leading_ones :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) --- reverse_bits :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) --- byte_swap :: proc(x: $T) -> T where type_is_integer(T) || type_is_float(T) --- diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index e2428576e..1a094c1f0 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -5204,6 +5204,8 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As case BuiltinProc_count_zeros: case BuiltinProc_count_trailing_zeros: case BuiltinProc_count_leading_zeros: + case BuiltinProc_count_trailing_ones: + case BuiltinProc_count_leading_ones: case BuiltinProc_reverse_bits: { Operand x = {}; @@ -5301,6 +5303,27 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As v += 1; } break; + + case BuiltinProc_count_trailing_ones: + for (u64 i = 0; i < bit_size; i++) { + u8 b = cast(u8)(i & 7); + u8 j = cast(u8)(i >> 3); + if ((rop[j] & (1 << b)) == 0) { + break; + } + v += 1; + } + break; + case BuiltinProc_count_leading_ones: + for (u64 i = bit_size-1; i < bit_size; i--) { + u8 b = cast(u8)(i & 7); + u8 j = cast(u8)(i >> 3); + if ((rop[j] & (1 << b)) == 0) { + break; + } + v += 1; + } + break; } diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index 5b446cc1c..a13ffc3cd 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -74,6 +74,8 @@ enum BuiltinProcId { BuiltinProc_count_zeros, BuiltinProc_count_trailing_zeros, BuiltinProc_count_leading_zeros, + BuiltinProc_count_trailing_ones, + BuiltinProc_count_leading_ones, BuiltinProc_reverse_bits, BuiltinProc_byte_swap, @@ -453,6 +455,8 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("count_zeros"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("count_trailing_zeros"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("count_leading_zeros"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("count_trailing_ones"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("count_leading_ones"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("reverse_bits"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("byte_swap"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index b596f15ef..e52e91f75 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2850,6 +2850,12 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu case BuiltinProc_count_leading_zeros: return lb_emit_count_leading_zeros(p, lb_build_expr(p, ce->args[0]), tv.type); + case BuiltinProc_count_trailing_ones: + return lb_emit_count_trailing_ones(p, lb_build_expr(p, ce->args[0]), tv.type); + case BuiltinProc_count_leading_ones: + return lb_emit_count_leading_ones(p, lb_build_expr(p, ce->args[0]), tv.type); + + case BuiltinProc_count_ones: return lb_emit_count_ones(p, lb_build_expr(p, ce->args[0]), tv.type); case BuiltinProc_count_zeros: diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 367e7be75..8a7bced59 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -648,6 +648,18 @@ gb_internal lbValue lb_emit_count_leading_zeros(lbProcedure *p, lbValue x, Type return res; } +gb_internal lbValue lb_emit_unary_arith(lbProcedure *p, TokenKind op, lbValue x, Type *type); + +gb_internal lbValue lb_emit_count_trailing_ones(lbProcedure *p, lbValue x, Type *type) { + lbValue z = lb_emit_unary_arith(p, Token_Xor, x, type); + return lb_emit_count_trailing_zeros(p, z, type); +} + +gb_internal lbValue lb_emit_count_leading_ones(lbProcedure *p, lbValue x, Type *type) { + lbValue z = lb_emit_unary_arith(p, Token_Xor, x, type); + return lb_emit_count_leading_zeros(p, z, type); +} + gb_internal lbValue lb_emit_reverse_bits(lbProcedure *p, lbValue x, Type *type) { From 6a07f70c1c1081374faeee2eabe53d23805ea529 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 2 Feb 2026 17:57:50 +0100 Subject: [PATCH 326/766] support -> supported --- src/build_settings.cpp | 2 +- src/linker.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index e0017baea..ded51c420 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1861,7 +1861,7 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta if (bc->disable_red_zone) { if (is_arch_wasm() && bc->metrics.os == TargetOs_freestanding) { - gb_printf_err("-disable-red-zone is not support for this target"); + gb_printf_err("-disable-red-zone is not supported on this target"); gb_exit(1); } } diff --git a/src/linker.cpp b/src/linker.cpp index f369a5a38..9f4f1b2e8 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -181,7 +181,7 @@ try_cross_linking:; case Linker_radlink: section_name = str_lit("rad-link"); break; #endif default: - gb_printf_err("'%.*s' linker is not support for this platform\n", LIT(linker_choices[build_context.linker_choice])); + gb_printf_err("'%.*s' linker is not supported on this platform\n", LIT(linker_choices[build_context.linker_choice])); return 1; } From afbbb829eac29e90ba693730641b586194cbef74 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Mon, 2 Feb 2026 18:13:48 +0100 Subject: [PATCH 327/766] fix LTO on MacOS If no `-minimum-os-version` is given, ignore the `override-module` warnings. The user not using, `-minimum-os-version` opts you into linker warnings about target versions. If a `-minimum-os-version` is provided, normalize it to a full version `11` to `11.0.0` for example. The linker seems to want that when doing LTO. --- src/build_settings.cpp | 27 ++++++++++++++++++++++++++- src/linker.cpp | 4 ++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index e0017baea..61bb601e2 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1728,6 +1728,29 @@ gb_internal char *token_pos_to_string(TokenPos const &pos) { return s; } +gb_internal String normalize_minimum_os_version_string(String version) { + GB_ASSERT(version.len > 0); + + gbString normalized = gb_string_make(permanent_allocator(), ""); + + int granularity = 0; + String_Iterator it = {version, 0}; + for (;; granularity++) { + String str = string_split_iterator(&it, '.'); + if (str == "") break; + if (granularity > 0) { + normalized = gb_string_appendc(normalized, "."); + } + normalized = gb_string_append_length(normalized, str.text, str.len); + } + + for (; granularity < 3; granularity++) { + normalized = gb_string_appendc(normalized, ".0"); + } + + return make_string_c(normalized); +} + gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subtarget) { BuildContext *bc = &build_context; @@ -1997,10 +2020,12 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta } else if (subtarget == Subtarget_iPhone || subtarget == Subtarget_iPhoneSimulator) { // NOTE(harold): We default to 17.4 on iOS because that's when os_sync_wait_on_address was added and // we'd like to avoid any potential App Store issues by using the private ulock_* there. - bc->minimum_os_version_string = str_lit("17.4"); + bc->minimum_os_version_string = str_lit("17.4.0"); } } + bc->minimum_os_version_string = normalize_minimum_os_version_string(bc->minimum_os_version_string); + if (subtarget == Subtarget_iPhoneSimulator) { // For the iPhoneSimulator subtarget, the version must be between 'ios' and '-simulator'. String suffix = str_lit("-simulator"); diff --git a/src/linker.cpp b/src/linker.cpp index f369a5a38..4ad3cf6d2 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -978,6 +978,10 @@ try_cross_linking:; if (build_context.lto_kind != LTO_None) { link_command_line = gb_string_appendc(link_command_line, " -flto=thin"); link_command_line = gb_string_append_fmt(link_command_line, " -flto-jobs=%d ", build_context.thread_count); + + if (is_osx && !build_context.minimum_os_version_string_given) { + link_command_line = gb_string_appendc(link_command_line, " -Wno-override-module "); + } } link_command_line = gb_string_appendc(link_command_line, object_files); From 55ab089ffcb726f565bb8845392e81cc112e4a41 Mon Sep 17 00:00:00 2001 From: Fabian Erdmann Date: Mon, 2 Feb 2026 19:41:37 +0100 Subject: [PATCH 328/766] text/regex: Pass given allocator on in create_iterator --- core/text/regex/regex.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/text/regex/regex.odin b/core/text/regex/regex.odin index c22371f3f..eae95b7e5 100644 --- a/core/text/regex/regex.odin +++ b/core/text/regex/regex.odin @@ -280,9 +280,9 @@ create_iterator :: proc( ) -> (result: Match_Iterator, err: Error) { result.regex = create(pattern, flags, permanent_allocator, temporary_allocator) or_return - result.capture = preallocate_capture() + result.capture = preallocate_capture(permanent_allocator) result.temp = temporary_allocator - result.vm = virtual_machine.create(result.regex.program, str) + result.vm = virtual_machine.create(result.regex.program, str, permanent_allocator) result.vm.class_data = result.regex.class_data result.threads = max(1, virtual_machine.opcode_count(result.vm.code) - 1) From bd0cfe4a81400a4ab8dfbcc7b63177976a4ee0b5 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Tue, 3 Feb 2026 16:13:52 +0900 Subject: [PATCH 329/766] core/crypto/_fiat: Minor p256 cleanups --- core/crypto/_fiat/field_p256r1/field.odin | 6 +++--- core/crypto/_fiat/field_scalarp256r1/field.odin | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/crypto/_fiat/field_p256r1/field.odin b/core/crypto/_fiat/field_p256r1/field.odin index 0ba0e327d..c2e2044aa 100644 --- a/core/crypto/_fiat/field_p256r1/field.odin +++ b/core/crypto/_fiat/field_p256r1/field.odin @@ -52,7 +52,7 @@ fe_from_bytes :: proc "contextless" ( fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_Element) { ensure_contextless(len(out1) == 32, "p256r1: invalid fe output buffer") - tmp: Non_Montgomery_Domain_Field_Element + tmp: Non_Montgomery_Domain_Field_Element = --- fe_from_montgomery(&tmp, arg1) // Note: Likewise, output in big-endian. @@ -66,7 +66,7 @@ fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_ @(require_results) fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> int { - tmp: Montgomery_Domain_Field_Element + tmp: Montgomery_Domain_Field_Element = --- fe_sub(&tmp, arg1, arg2) // This will only underflow iff arg1 == arg2, and we return the borrow, @@ -80,7 +80,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> @(require_results) fe_is_odd :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> int { - tmp: Non_Montgomery_Domain_Field_Element + tmp: Non_Montgomery_Domain_Field_Element = --- defer mem.zero_explicit(&tmp, size_of(tmp)) fe_from_montgomery(&tmp, arg1) diff --git a/core/crypto/_fiat/field_scalarp256r1/field.odin b/core/crypto/_fiat/field_scalarp256r1/field.odin index 73c01fb46..0dfedb442 100644 --- a/core/crypto/_fiat/field_scalarp256r1/field.odin +++ b/core/crypto/_fiat/field_scalarp256r1/field.odin @@ -119,7 +119,7 @@ fe_unchecked_set :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element, fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_Element) { ensure_contextless(len(out1) == 32, "p256r1: invalid scalar output buffer") - tmp: Non_Montgomery_Domain_Field_Element + tmp: Non_Montgomery_Domain_Field_Element = --- fe_from_montgomery(&tmp, arg1) // Note: Likewise, output in big-endian. @@ -132,7 +132,7 @@ fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_ } fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> int { - tmp: Montgomery_Domain_Field_Element + tmp: Montgomery_Domain_Field_Element = --- fe_sub(&tmp, arg1, arg2) is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) @@ -143,7 +143,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> } fe_is_odd :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> int { - tmp: Non_Montgomery_Domain_Field_Element + tmp: Non_Montgomery_Domain_Field_Element = --- defer mem.zero_explicit(&tmp, size_of(tmp)) fe_from_montgomery(&tmp, arg1) From 64ce2bdf0e84a52b4837f26062bb47643fab0bc5 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sun, 1 Feb 2026 02:32:09 +0900 Subject: [PATCH 330/766] core/crypto/_weierstrass: Add secp384r1 --- core/crypto/_fiat/field_p384r1/field.odin | 436 ++ core/crypto/_fiat/field_p384r1/field64.odin | 1063 +++ .../_fiat/field_scalarp384r1/field.odin | 239 + .../_fiat/field_scalarp384r1/field64.odin | 1081 +++ core/crypto/_weierstrass/fe.odin | 78 +- core/crypto/_weierstrass/point.odin | 32 + core/crypto/_weierstrass/point_s11n_sec.odin | 4 + core/crypto/_weierstrass/sc.odin | 25 + core/crypto/_weierstrass/scalar_mul.odin | 27 +- core/crypto/_weierstrass/secp384r1_table.odin | 5969 +++++++++++++++++ .../_weierstrass/tools/ecc_gen_tables.odin | 79 +- .../crypto/test_core_crypto_weierstrass.odin | 455 +- 12 files changed, 9446 insertions(+), 42 deletions(-) create mode 100644 core/crypto/_fiat/field_p384r1/field.odin create mode 100644 core/crypto/_fiat/field_p384r1/field64.odin create mode 100644 core/crypto/_fiat/field_scalarp384r1/field.odin create mode 100644 core/crypto/_fiat/field_scalarp384r1/field64.odin create mode 100644 core/crypto/_weierstrass/secp384r1_table.odin diff --git a/core/crypto/_fiat/field_p384r1/field.odin b/core/crypto/_fiat/field_p384r1/field.odin new file mode 100644 index 000000000..65affc38c --- /dev/null +++ b/core/crypto/_fiat/field_p384r1/field.odin @@ -0,0 +1,436 @@ +package field_p384r1 + +import subtle "core:crypto/_subtle" +import "core:encoding/endian" +import "core:math/bits" +import "core:mem" + +fe_clear :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) { + mem.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) +} + +fe_clear_vec :: proc "contextless" ( + arg1: []^Montgomery_Domain_Field_Element, +) { + for fe in arg1 { + fe_clear(fe) + } +} + +fe_from_bytes :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: []byte, + unsafe_assume_canonical := false, +) -> bool { + ensure_contextless(len(arg1) == 48, "p384r1: invalid fe input buffer") + + // Note: We assume the input is in big-endian. + tmp := Non_Montgomery_Domain_Field_Element { + endian.unchecked_get_u64be(arg1[40:]), + endian.unchecked_get_u64be(arg1[32:]), + endian.unchecked_get_u64be(arg1[24:]), + endian.unchecked_get_u64be(arg1[16:]), + endian.unchecked_get_u64be(arg1[8:]), + endian.unchecked_get_u64be(arg1[0:]), + } + defer mem.zero_explicit(&tmp, size_of(tmp)) + + // Check that tmp is in the the range [0, ELL). + if !unsafe_assume_canonical { + _, borrow := bits.sub_u64(ELL[0] - 1, tmp[0], 0) + _, borrow = bits.sub_u64(ELL[1], tmp[1], borrow) + _, borrow = bits.sub_u64(ELL[2], tmp[2], borrow) + _, borrow = bits.sub_u64(ELL[3], tmp[3], borrow) + _, borrow = bits.sub_u64(ELL[4], tmp[4], borrow) + _, borrow = bits.sub_u64(ELL[5], tmp[5], borrow) + if borrow != 0 { + return false + } + } + + fe_to_montgomery(out1, &tmp) + + return true +} + +fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_Element) { + ensure_contextless(len(out1) == 48, "p384r1: invalid fe output buffer") + + tmp: Non_Montgomery_Domain_Field_Element = --- + fe_from_montgomery(&tmp, arg1) + + // Note: Likewise, output in big-endian. + endian.unchecked_put_u64be(out1[40:], tmp[0]) + endian.unchecked_put_u64be(out1[32:], tmp[1]) + endian.unchecked_put_u64be(out1[24:], tmp[2]) + endian.unchecked_put_u64be(out1[16:], tmp[3]) + endian.unchecked_put_u64be(out1[8:], tmp[4]) + endian.unchecked_put_u64be(out1[0:], tmp[5]) + + mem.zero_explicit(&tmp, size_of(tmp)) +} + +@(require_results) +fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> int { + tmp: Montgomery_Domain_Field_Element = --- + fe_sub(&tmp, arg1, arg2) + + // This will only underflow iff arg1 == arg2, and we return the borrow, + // which will be 1. + is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) + + fe_clear(&tmp) + + return int(is_eq) +} + +@(require_results) +fe_is_odd :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> int { + tmp: Non_Montgomery_Domain_Field_Element = --- + defer mem.zero_explicit(&tmp, size_of(tmp)) + + fe_from_montgomery(&tmp, arg1) + return int(tmp[0] & 1) +} + +fe_pow2k :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: ^Montgomery_Domain_Field_Element, + arg2: uint, +) { + // Special case: `arg1^(2 * 0) = 1`, though this should never happen. + if arg2 == 0 { + fe_one(out1) + return + } + + fe_square(out1, arg1) + for _ in 1 ..< arg2 { + fe_square(out1, out1) + } +} + +fe_inv :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + // Inversion computation is derived from the addition chain: + // + // _10 = 2*1 + // _11 = 1 + _10 + // _110 = 2*_11 + // _111 = 1 + _110 + // _111000 = _111 << 3 + // _111111 = _111 + _111000 + // x12 = _111111 << 6 + _111111 + // x24 = x12 << 12 + x12 + // x30 = x24 << 6 + _111111 + // x31 = 2*x30 + 1 + // x32 = 2*x31 + 1 + // x63 = x32 << 31 + x31 + // x126 = x63 << 63 + x63 + // x252 = x126 << 126 + x126 + // x255 = x252 << 3 + _111 + // return ((x255 << 33 + x32) << 94 + x30) << 2 + // + // Operations: 383 squares 14 multiplies + // + // Generated by github.com/mmcloughlin/addchain v0.4.0. + + // Note: Need to stash `arg1` (`xx`) in the case that `out1`/`arg1` alias, + // as `arg1` is used after `out1` has been altered. + t0, t1, t2, t3, xx: Montgomery_Domain_Field_Element = ---, ---, ---, ---, arg1^ + + // Step 1: z = x^0x2 + fe_square(out1, arg1) + + // Step 2: z = x^0x3 + fe_mul(out1, &xx, out1) + + // Step 3: z = x^0x6 + fe_square(out1, out1) + + // Step 4: t1 = x^0x7 + fe_mul(&t1, &xx, out1) + + // Step 7: z = x^0x38 + fe_pow2k(out1, &t1, 3) + + // Step 8: z = x^0x3f + fe_mul(out1, &t1, out1) + + // Step 14: t0 = x^0xfc0 + fe_pow2k(&t0, out1, 6) + + // Step 15: t0 = x^0xfff + fe_mul(&t0, out1, &t0) + + // Step 27: t2 = x^0xfff000 + fe_pow2k(&t2, &t0, 12) + + // Step 28: t0 = x^0xffffff + fe_mul(&t0, &t0, &t2) + + // Step 34: t0 = x^0x3fffffc0 + fe_pow2k(&t0, &t0, 6) + + // Step 35: z = x^0x3fffffff + fe_mul(out1, out1, &t0) + + // Step 36: t0 = x^0x7ffffffe + fe_square(&t0, out1) + + // Step 37: t2 = x^0x7fffffff + fe_mul(&t2, &xx, &t0) + + // Step 38: t0 = x^0xfffffffe + fe_square(&t0, &t2) + + // Step 39: t0 = x^0xffffffff + fe_mul(&t0, &xx, &t0) + + // Step 70: t3 = x^0x7fffffff80000000 + fe_pow2k(&t3, &t0, 31) + + // Step 71: t2 = x^0x7fffffffffffffff + fe_mul(&t2, &t2, &t3) + + // Step 134: t3 = x^0x3fffffffffffffff8000000000000000 + fe_pow2k(&t3, &t2, 63) + + // Step 135: t2 = x^0x3fffffffffffffffffffffffffffffff + fe_mul(&t2, &t2, &t3) + + // Step 261: t3 = x^0xfffffffffffffffffffffffffffffffc0000000000000000000000000000000 + fe_pow2k(&t3, &t2, 126) + + // Step 262: t2 = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + fe_mul(&t2, &t2, &t3) + + // Step 265: t2 = x^0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8 + fe_pow2k(&t2, &t2, 3) + + // Step 266: t1 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + fe_mul(&t1, &t1, &t2) + + // Step 299: t1 = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 + fe_pow2k(&t1, &t1, 33) + + // Step 300: t0 = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff + fe_mul(&t0, &t0, &t1) + + // Step 394: t0 = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000000000000 + fe_pow2k(&t0, &t0, 94) + + // Step 395: z = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc0000000000000003fffffff + fe_mul(out1, out1, &t0) + + // Step 397: z = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc + fe_pow2k(out1, out1, 2) + + fe_mul(out1, out1, &xx) + + fe_clear_vec([]^Montgomery_Domain_Field_Element{&t0, &t1, &t2, &t3, &xx}) +} + +@(require_results) +fe_sqrt :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) -> int { + // Square root candidate can be derived via exponentiation by `(p + 1) / 4` + // From sage: 9850501549098619803069760025035903451269934817616361666987073351061430442874217582261816522064734500465401743278080 + // + // Inversion computation is derived from the addition chain: + // + // _10 = 2*1 + // _11 = 1 + _10 + // _110 = 2*_11 + // _111 = 1 + _110 + // _111000 = _111 << 3 + // _111111 = _111 + _111000 + // x12 = _111111 << 6 + _111111 + // x24 = x12 << 12 + x12 + // x30 = x24 << 6 + _111111 + // x31 = 2*x30 + 1 + // x32 = 2*x31 + 1 + // x63 = x32 << 31 + x31 + // x126 = x63 << 63 + x63 + // x252 = x126 << 126 + x126 + // x255 = x252 << 3 + _111 + // return ((x255 << 33 + x32) << 94 + x30) << 2 + // + // Operations: 383 squares 14 multiplies + // + // Generated by github.com/mmcloughlin/addchain v0.4.0. + + // Likewise this tramples over arg1, so stash another copy. + t0, t1, t2, t3, xx: Montgomery_Domain_Field_Element = ---, ---, ---, ---, arg1^ + + // Step 1: z = x^0x2 + fe_square(out1, arg1) + + // Step 2: z = x^0x3 + fe_mul(out1, &xx, out1) + + // Step 3: z = x^0x6 + fe_square(out1, out1) + + // Step 4: t1 = x^0x7 + fe_mul(&t1, &xx, out1) + + // Step 7: z = x^0x38 + fe_pow2k(out1, &t1, 3) + + // Step 8: z = x^0x3f + fe_mul(out1, &t1, out1) + + // Step 14: t0 = x^0xfc0 + fe_pow2k(&t0, out1, 6) + + // Step 15: t0 = x^0xfff + fe_mul(&t0, out1, &t0) + + // Step 27: t2 = x^0xfff000 + fe_pow2k(&t2, &t0, 12) + + // Step 28: t0 = x^0xffffff + fe_mul(&t0, &t0, &t2) + + // Step 34: t0 = x^0x3fffffc0 + fe_pow2k(&t0, &t0, 6) + + // Step 35: z = x^0x3fffffff + fe_mul(out1, out1, &t0) + + // Step 36: t0 = x^0x7ffffffe + fe_square(&t0, out1) + + // Step 37: t2 = x^0x7fffffff + fe_mul(&t2, &xx, &t0) + + // Step 38: t0 = x^0xfffffffe + fe_square(&t0, &t2) + + // Step 39: t0 = x^0xffffffff + fe_mul(&t0, &xx, &t0) + + // Step 70: t3 = x^0x7fffffff80000000 + fe_pow2k(&t3, &t0, 31) + + // Step 71: t2 = x^0x7fffffffffffffff + fe_mul(&t2, &t2, &t3) + + // Step 134: t3 = x^0x3fffffffffffffff8000000000000000 + fe_pow2k(&t3, &t2, 63) + + // Step 135: t2 = x^0x3fffffffffffffffffffffffffffffff + fe_mul(&t2, &t2, &t3) + + // Step 261: t3 = x^0xfffffffffffffffffffffffffffffffc0000000000000000000000000000000 + fe_pow2k(&t3, &t2, 126) + + // Step 262: t2 = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + fe_mul(&t2, &t2, &t3) + + // Step 265: t2 = x^0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8 + fe_pow2k(&t2, &t2, 3) + + // Step 266: t1 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + fe_mul(&t1, &t1, &t2) + + // Step 299: t1 = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 + fe_pow2k(&t1, &t1, 33) + + // Step 300: t0 = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff + fe_mul(&t0, &t0, &t1) + + // Step 394: t0 = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000000000000 + fe_pow2k(&t0, &t0, 94) + + // Step 395: z = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc0000000000000003fffffff + fe_mul(out1, out1, &t0) + + // Step 397: z = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc + fe_pow2k(out1, out1, 2) + + // Ensure that our candidate is actually the square root. + check, zero: Montgomery_Domain_Field_Element + fe_square(&check, out1) + + is_valid := fe_equal(&check, &xx) + fe_cond_select(out1, &zero, out1, is_valid) + + fe_clear_vec([]^Montgomery_Domain_Field_Element{&t0, &t1, &t2, &t3, &xx, &check}) + + return is_valid +} + +fe_zero :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element) { + out1[0] = 0 + out1[1] = 0 + out1[2] = 0 + out1[3] = 0 + out1[4] = 0 + out1[5] = 0 +} + +fe_set :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1 := arg1[0] + x2 := arg1[1] + x3 := arg1[2] + x4 := arg1[3] + x5 := arg1[4] + x6 := arg1[5] + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 + out1[4] = x5 + out1[5] = x6 +} + +@(optimization_mode = "none") +fe_cond_swap :: #force_no_inline proc "contextless" (out1, out2: ^Montgomery_Domain_Field_Element, arg1: int) { + mask := (u64(arg1) * 0xffffffffffffffff) + x := (out1[0] ~ out2[0]) & mask + x1, y1 := out1[0] ~ x, out2[0] ~ x + x = (out1[1] ~ out2[1]) & mask + x2, y2 := out1[1] ~ x, out2[1] ~ x + x = (out1[2] ~ out2[2]) & mask + x3, y3 := out1[2] ~ x, out2[2] ~ x + x = (out1[3] ~ out2[3]) & mask + x4, y4 := out1[3] ~ x, out2[3] ~ x + x = (out1[4] ~ out2[4]) & mask + x5, y5 := out1[4] ~ x, out2[4] ~ x + x = (out1[5] ~ out2[5]) & mask + x6, y6 := out1[5] ~ x, out2[5] ~ x + out1[0], out2[0] = x1, y1 + out1[1], out2[1] = x2, y2 + out1[2], out2[2] = x3, y3 + out1[3], out2[3] = x4, y4 + out1[4], out2[4] = x5, y5 + out1[5], out2[5] = x6, y6 +} + +@(optimization_mode = "none") +fe_cond_select :: #force_no_inline proc "contextless" ( + out1, arg1, arg2: ^Montgomery_Domain_Field_Element, + arg3: int, +) { + mask := (u64(arg3) * 0xffffffffffffffff) + x1 := ((mask & arg2[0]) | ((~mask) & arg1[0])) + x2 := ((mask & arg2[1]) | ((~mask) & arg1[1])) + x3 := ((mask & arg2[2]) | ((~mask) & arg1[2])) + x4 := ((mask & arg2[3]) | ((~mask) & arg1[3])) + x5 := ((mask & arg2[4]) | ((~mask) & arg1[4])) + x6 := ((mask & arg2[5]) | ((~mask) & arg1[5])) + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 + out1[4] = x5 + out1[5] = x6 +} + +fe_cond_negate :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element, ctrl: int) { + tmp1: Montgomery_Domain_Field_Element = --- + fe_opp(&tmp1, arg1) + fe_cond_select(out1, arg1, &tmp1, ctrl) + + fe_clear(&tmp1) +} diff --git a/core/crypto/_fiat/field_p384r1/field64.odin b/core/crypto/_fiat/field_p384r1/field64.odin new file mode 100644 index 000000000..493f24b17 --- /dev/null +++ b/core/crypto/_fiat/field_p384r1/field64.odin @@ -0,0 +1,1063 @@ +// The BSD 1-Clause License (BSD-1-Clause) +// +// Copyright (c) 2015-2020 the fiat-crypto authors (see the AUTHORS file) +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY the fiat-crypto authors "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, +// Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package field_p384r1 + +// The file provides arithmetic on the field Z/(2^384 - 2^128 - 2^96 + 2^32 - 1) +// using a 64-bit Montgomery form internal representation. It is derived +// primarily from the machine generated Golang output from the fiat-crypto +// project. +// +// While the base implementation is provably correct, this implementation +// makes no such claims as the port and optimizations were done by hand. +// +// WARNING: While big-endian is the common representation used for this +// curve, the fiat output uses least-significant-limb first. + +import fiat "core:crypto/_fiat" +import "core:math/bits" + +// ELL is the saturated representation of the field order, least-significant +// limb first. +ELL :: [6]u64{0xffffffff, 0xffffffff00000000, 0xfffffffffffffffe, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff} + +Montgomery_Domain_Field_Element :: distinct [6]u64 +Non_Montgomery_Domain_Field_Element :: distinct [6]u64 + +fe_mul :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[4] + x5 := arg1[5] + x6 := arg1[0] + x8, x7 := bits.mul_u64(x6, arg2[5]) + x10, x9 := bits.mul_u64(x6, arg2[4]) + x12, x11 := bits.mul_u64(x6, arg2[3]) + x14, x13 := bits.mul_u64(x6, arg2[2]) + x16, x15 := bits.mul_u64(x6, arg2[1]) + x18, x17 := bits.mul_u64(x6, arg2[0]) + x19, x20 := bits.add_u64(x18, x15, u64(0x0)) + x21, x22 := bits.add_u64(x16, x13, u64(fiat.u1(x20))) + x23, x24 := bits.add_u64(x14, x11, u64(fiat.u1(x22))) + x25, x26 := bits.add_u64(x12, x9, u64(fiat.u1(x24))) + x27, x28 := bits.add_u64(x10, x7, u64(fiat.u1(x26))) + x29 := (u64(fiat.u1(x28)) + x8) + _, x30 := bits.mul_u64(x17, 0x100000001) + x33, x32 := bits.mul_u64(x30, 0xffffffffffffffff) + x35, x34 := bits.mul_u64(x30, 0xffffffffffffffff) + x37, x36 := bits.mul_u64(x30, 0xffffffffffffffff) + x39, x38 := bits.mul_u64(x30, 0xfffffffffffffffe) + x41, x40 := bits.mul_u64(x30, 0xffffffff00000000) + x43, x42 := bits.mul_u64(x30, 0xffffffff) + x44, x45 := bits.add_u64(x43, x40, u64(0x0)) + x46, x47 := bits.add_u64(x41, x38, u64(fiat.u1(x45))) + x48, x49 := bits.add_u64(x39, x36, u64(fiat.u1(x47))) + x50, x51 := bits.add_u64(x37, x34, u64(fiat.u1(x49))) + x52, x53 := bits.add_u64(x35, x32, u64(fiat.u1(x51))) + x54 := (u64(fiat.u1(x53)) + x33) + _, x56 := bits.add_u64(x17, x42, u64(0x0)) + x57, x58 := bits.add_u64(x19, x44, u64(fiat.u1(x56))) + x59, x60 := bits.add_u64(x21, x46, u64(fiat.u1(x58))) + x61, x62 := bits.add_u64(x23, x48, u64(fiat.u1(x60))) + x63, x64 := bits.add_u64(x25, x50, u64(fiat.u1(x62))) + x65, x66 := bits.add_u64(x27, x52, u64(fiat.u1(x64))) + x67, x68 := bits.add_u64(x29, x54, u64(fiat.u1(x66))) + x70, x69 := bits.mul_u64(x1, arg2[5]) + x72, x71 := bits.mul_u64(x1, arg2[4]) + x74, x73 := bits.mul_u64(x1, arg2[3]) + x76, x75 := bits.mul_u64(x1, arg2[2]) + x78, x77 := bits.mul_u64(x1, arg2[1]) + x80, x79 := bits.mul_u64(x1, arg2[0]) + x81, x82 := bits.add_u64(x80, x77, u64(0x0)) + x83, x84 := bits.add_u64(x78, x75, u64(fiat.u1(x82))) + x85, x86 := bits.add_u64(x76, x73, u64(fiat.u1(x84))) + x87, x88 := bits.add_u64(x74, x71, u64(fiat.u1(x86))) + x89, x90 := bits.add_u64(x72, x69, u64(fiat.u1(x88))) + x91 := (u64(fiat.u1(x90)) + x70) + x92, x93 := bits.add_u64(x57, x79, u64(0x0)) + x94, x95 := bits.add_u64(x59, x81, u64(fiat.u1(x93))) + x96, x97 := bits.add_u64(x61, x83, u64(fiat.u1(x95))) + x98, x99 := bits.add_u64(x63, x85, u64(fiat.u1(x97))) + x100, x101 := bits.add_u64(x65, x87, u64(fiat.u1(x99))) + x102, x103 := bits.add_u64(x67, x89, u64(fiat.u1(x101))) + x104, x105 := bits.add_u64(u64(fiat.u1(x68)), x91, u64(fiat.u1(x103))) + _, x106 := bits.mul_u64(x92, 0x100000001) + x109, x108 := bits.mul_u64(x106, 0xffffffffffffffff) + x111, x110 := bits.mul_u64(x106, 0xffffffffffffffff) + x113, x112 := bits.mul_u64(x106, 0xffffffffffffffff) + x115, x114 := bits.mul_u64(x106, 0xfffffffffffffffe) + x117, x116 := bits.mul_u64(x106, 0xffffffff00000000) + x119, x118 := bits.mul_u64(x106, 0xffffffff) + x120, x121 := bits.add_u64(x119, x116, u64(0x0)) + x122, x123 := bits.add_u64(x117, x114, u64(fiat.u1(x121))) + x124, x125 := bits.add_u64(x115, x112, u64(fiat.u1(x123))) + x126, x127 := bits.add_u64(x113, x110, u64(fiat.u1(x125))) + x128, x129 := bits.add_u64(x111, x108, u64(fiat.u1(x127))) + x130 := (u64(fiat.u1(x129)) + x109) + _, x132 := bits.add_u64(x92, x118, u64(0x0)) + x133, x134 := bits.add_u64(x94, x120, u64(fiat.u1(x132))) + x135, x136 := bits.add_u64(x96, x122, u64(fiat.u1(x134))) + x137, x138 := bits.add_u64(x98, x124, u64(fiat.u1(x136))) + x139, x140 := bits.add_u64(x100, x126, u64(fiat.u1(x138))) + x141, x142 := bits.add_u64(x102, x128, u64(fiat.u1(x140))) + x143, x144 := bits.add_u64(x104, x130, u64(fiat.u1(x142))) + x145 := (u64(fiat.u1(x144)) + u64(fiat.u1(x105))) + x147, x146 := bits.mul_u64(x2, arg2[5]) + x149, x148 := bits.mul_u64(x2, arg2[4]) + x151, x150 := bits.mul_u64(x2, arg2[3]) + x153, x152 := bits.mul_u64(x2, arg2[2]) + x155, x154 := bits.mul_u64(x2, arg2[1]) + x157, x156 := bits.mul_u64(x2, arg2[0]) + x158, x159 := bits.add_u64(x157, x154, u64(0x0)) + x160, x161 := bits.add_u64(x155, x152, u64(fiat.u1(x159))) + x162, x163 := bits.add_u64(x153, x150, u64(fiat.u1(x161))) + x164, x165 := bits.add_u64(x151, x148, u64(fiat.u1(x163))) + x166, x167 := bits.add_u64(x149, x146, u64(fiat.u1(x165))) + x168 := (u64(fiat.u1(x167)) + x147) + x169, x170 := bits.add_u64(x133, x156, u64(0x0)) + x171, x172 := bits.add_u64(x135, x158, u64(fiat.u1(x170))) + x173, x174 := bits.add_u64(x137, x160, u64(fiat.u1(x172))) + x175, x176 := bits.add_u64(x139, x162, u64(fiat.u1(x174))) + x177, x178 := bits.add_u64(x141, x164, u64(fiat.u1(x176))) + x179, x180 := bits.add_u64(x143, x166, u64(fiat.u1(x178))) + x181, x182 := bits.add_u64(x145, x168, u64(fiat.u1(x180))) + _, x183 := bits.mul_u64(x169, 0x100000001) + x186, x185 := bits.mul_u64(x183, 0xffffffffffffffff) + x188, x187 := bits.mul_u64(x183, 0xffffffffffffffff) + x190, x189 := bits.mul_u64(x183, 0xffffffffffffffff) + x192, x191 := bits.mul_u64(x183, 0xfffffffffffffffe) + x194, x193 := bits.mul_u64(x183, 0xffffffff00000000) + x196, x195 := bits.mul_u64(x183, 0xffffffff) + x197, x198 := bits.add_u64(x196, x193, u64(0x0)) + x199, x200 := bits.add_u64(x194, x191, u64(fiat.u1(x198))) + x201, x202 := bits.add_u64(x192, x189, u64(fiat.u1(x200))) + x203, x204 := bits.add_u64(x190, x187, u64(fiat.u1(x202))) + x205, x206 := bits.add_u64(x188, x185, u64(fiat.u1(x204))) + x207 := (u64(fiat.u1(x206)) + x186) + _, x209 := bits.add_u64(x169, x195, u64(0x0)) + x210, x211 := bits.add_u64(x171, x197, u64(fiat.u1(x209))) + x212, x213 := bits.add_u64(x173, x199, u64(fiat.u1(x211))) + x214, x215 := bits.add_u64(x175, x201, u64(fiat.u1(x213))) + x216, x217 := bits.add_u64(x177, x203, u64(fiat.u1(x215))) + x218, x219 := bits.add_u64(x179, x205, u64(fiat.u1(x217))) + x220, x221 := bits.add_u64(x181, x207, u64(fiat.u1(x219))) + x222 := (u64(fiat.u1(x221)) + u64(fiat.u1(x182))) + x224, x223 := bits.mul_u64(x3, arg2[5]) + x226, x225 := bits.mul_u64(x3, arg2[4]) + x228, x227 := bits.mul_u64(x3, arg2[3]) + x230, x229 := bits.mul_u64(x3, arg2[2]) + x232, x231 := bits.mul_u64(x3, arg2[1]) + x234, x233 := bits.mul_u64(x3, arg2[0]) + x235, x236 := bits.add_u64(x234, x231, u64(0x0)) + x237, x238 := bits.add_u64(x232, x229, u64(fiat.u1(x236))) + x239, x240 := bits.add_u64(x230, x227, u64(fiat.u1(x238))) + x241, x242 := bits.add_u64(x228, x225, u64(fiat.u1(x240))) + x243, x244 := bits.add_u64(x226, x223, u64(fiat.u1(x242))) + x245 := (u64(fiat.u1(x244)) + x224) + x246, x247 := bits.add_u64(x210, x233, u64(0x0)) + x248, x249 := bits.add_u64(x212, x235, u64(fiat.u1(x247))) + x250, x251 := bits.add_u64(x214, x237, u64(fiat.u1(x249))) + x252, x253 := bits.add_u64(x216, x239, u64(fiat.u1(x251))) + x254, x255 := bits.add_u64(x218, x241, u64(fiat.u1(x253))) + x256, x257 := bits.add_u64(x220, x243, u64(fiat.u1(x255))) + x258, x259 := bits.add_u64(x222, x245, u64(fiat.u1(x257))) + _, x260 := bits.mul_u64(x246, 0x100000001) + x263, x262 := bits.mul_u64(x260, 0xffffffffffffffff) + x265, x264 := bits.mul_u64(x260, 0xffffffffffffffff) + x267, x266 := bits.mul_u64(x260, 0xffffffffffffffff) + x269, x268 := bits.mul_u64(x260, 0xfffffffffffffffe) + x271, x270 := bits.mul_u64(x260, 0xffffffff00000000) + x273, x272 := bits.mul_u64(x260, 0xffffffff) + x274, x275 := bits.add_u64(x273, x270, u64(0x0)) + x276, x277 := bits.add_u64(x271, x268, u64(fiat.u1(x275))) + x278, x279 := bits.add_u64(x269, x266, u64(fiat.u1(x277))) + x280, x281 := bits.add_u64(x267, x264, u64(fiat.u1(x279))) + x282, x283 := bits.add_u64(x265, x262, u64(fiat.u1(x281))) + x284 := (u64(fiat.u1(x283)) + x263) + _, x286 := bits.add_u64(x246, x272, u64(0x0)) + x287, x288 := bits.add_u64(x248, x274, u64(fiat.u1(x286))) + x289, x290 := bits.add_u64(x250, x276, u64(fiat.u1(x288))) + x291, x292 := bits.add_u64(x252, x278, u64(fiat.u1(x290))) + x293, x294 := bits.add_u64(x254, x280, u64(fiat.u1(x292))) + x295, x296 := bits.add_u64(x256, x282, u64(fiat.u1(x294))) + x297, x298 := bits.add_u64(x258, x284, u64(fiat.u1(x296))) + x299 := (u64(fiat.u1(x298)) + u64(fiat.u1(x259))) + x301, x300 := bits.mul_u64(x4, arg2[5]) + x303, x302 := bits.mul_u64(x4, arg2[4]) + x305, x304 := bits.mul_u64(x4, arg2[3]) + x307, x306 := bits.mul_u64(x4, arg2[2]) + x309, x308 := bits.mul_u64(x4, arg2[1]) + x311, x310 := bits.mul_u64(x4, arg2[0]) + x312, x313 := bits.add_u64(x311, x308, u64(0x0)) + x314, x315 := bits.add_u64(x309, x306, u64(fiat.u1(x313))) + x316, x317 := bits.add_u64(x307, x304, u64(fiat.u1(x315))) + x318, x319 := bits.add_u64(x305, x302, u64(fiat.u1(x317))) + x320, x321 := bits.add_u64(x303, x300, u64(fiat.u1(x319))) + x322 := (u64(fiat.u1(x321)) + x301) + x323, x324 := bits.add_u64(x287, x310, u64(0x0)) + x325, x326 := bits.add_u64(x289, x312, u64(fiat.u1(x324))) + x327, x328 := bits.add_u64(x291, x314, u64(fiat.u1(x326))) + x329, x330 := bits.add_u64(x293, x316, u64(fiat.u1(x328))) + x331, x332 := bits.add_u64(x295, x318, u64(fiat.u1(x330))) + x333, x334 := bits.add_u64(x297, x320, u64(fiat.u1(x332))) + x335, x336 := bits.add_u64(x299, x322, u64(fiat.u1(x334))) + _, x337 := bits.mul_u64(x323, 0x100000001) + x340, x339 := bits.mul_u64(x337, 0xffffffffffffffff) + x342, x341 := bits.mul_u64(x337, 0xffffffffffffffff) + x344, x343 := bits.mul_u64(x337, 0xffffffffffffffff) + x346, x345 := bits.mul_u64(x337, 0xfffffffffffffffe) + x348, x347 := bits.mul_u64(x337, 0xffffffff00000000) + x350, x349 := bits.mul_u64(x337, 0xffffffff) + x351, x352 := bits.add_u64(x350, x347, u64(0x0)) + x353, x354 := bits.add_u64(x348, x345, u64(fiat.u1(x352))) + x355, x356 := bits.add_u64(x346, x343, u64(fiat.u1(x354))) + x357, x358 := bits.add_u64(x344, x341, u64(fiat.u1(x356))) + x359, x360 := bits.add_u64(x342, x339, u64(fiat.u1(x358))) + x361 := (u64(fiat.u1(x360)) + x340) + _, x363 := bits.add_u64(x323, x349, u64(0x0)) + x364, x365 := bits.add_u64(x325, x351, u64(fiat.u1(x363))) + x366, x367 := bits.add_u64(x327, x353, u64(fiat.u1(x365))) + x368, x369 := bits.add_u64(x329, x355, u64(fiat.u1(x367))) + x370, x371 := bits.add_u64(x331, x357, u64(fiat.u1(x369))) + x372, x373 := bits.add_u64(x333, x359, u64(fiat.u1(x371))) + x374, x375 := bits.add_u64(x335, x361, u64(fiat.u1(x373))) + x376 := (u64(fiat.u1(x375)) + u64(fiat.u1(x336))) + x378, x377 := bits.mul_u64(x5, arg2[5]) + x380, x379 := bits.mul_u64(x5, arg2[4]) + x382, x381 := bits.mul_u64(x5, arg2[3]) + x384, x383 := bits.mul_u64(x5, arg2[2]) + x386, x385 := bits.mul_u64(x5, arg2[1]) + x388, x387 := bits.mul_u64(x5, arg2[0]) + x389, x390 := bits.add_u64(x388, x385, u64(0x0)) + x391, x392 := bits.add_u64(x386, x383, u64(fiat.u1(x390))) + x393, x394 := bits.add_u64(x384, x381, u64(fiat.u1(x392))) + x395, x396 := bits.add_u64(x382, x379, u64(fiat.u1(x394))) + x397, x398 := bits.add_u64(x380, x377, u64(fiat.u1(x396))) + x399 := (u64(fiat.u1(x398)) + x378) + x400, x401 := bits.add_u64(x364, x387, u64(0x0)) + x402, x403 := bits.add_u64(x366, x389, u64(fiat.u1(x401))) + x404, x405 := bits.add_u64(x368, x391, u64(fiat.u1(x403))) + x406, x407 := bits.add_u64(x370, x393, u64(fiat.u1(x405))) + x408, x409 := bits.add_u64(x372, x395, u64(fiat.u1(x407))) + x410, x411 := bits.add_u64(x374, x397, u64(fiat.u1(x409))) + x412, x413 := bits.add_u64(x376, x399, u64(fiat.u1(x411))) + _, x414 := bits.mul_u64(x400, 0x100000001) + x417, x416 := bits.mul_u64(x414, 0xffffffffffffffff) + x419, x418 := bits.mul_u64(x414, 0xffffffffffffffff) + x421, x420 := bits.mul_u64(x414, 0xffffffffffffffff) + x423, x422 := bits.mul_u64(x414, 0xfffffffffffffffe) + x425, x424 := bits.mul_u64(x414, 0xffffffff00000000) + x427, x426 := bits.mul_u64(x414, 0xffffffff) + x428, x429 := bits.add_u64(x427, x424, u64(0x0)) + x430, x431 := bits.add_u64(x425, x422, u64(fiat.u1(x429))) + x432, x433 := bits.add_u64(x423, x420, u64(fiat.u1(x431))) + x434, x435 := bits.add_u64(x421, x418, u64(fiat.u1(x433))) + x436, x437 := bits.add_u64(x419, x416, u64(fiat.u1(x435))) + x438 := (u64(fiat.u1(x437)) + x417) + _, x440 := bits.add_u64(x400, x426, u64(0x0)) + x441, x442 := bits.add_u64(x402, x428, u64(fiat.u1(x440))) + x443, x444 := bits.add_u64(x404, x430, u64(fiat.u1(x442))) + x445, x446 := bits.add_u64(x406, x432, u64(fiat.u1(x444))) + x447, x448 := bits.add_u64(x408, x434, u64(fiat.u1(x446))) + x449, x450 := bits.add_u64(x410, x436, u64(fiat.u1(x448))) + x451, x452 := bits.add_u64(x412, x438, u64(fiat.u1(x450))) + x453 := (u64(fiat.u1(x452)) + u64(fiat.u1(x413))) + x454, x455 := bits.sub_u64(x441, 0xffffffff, u64(0x0)) + x456, x457 := bits.sub_u64(x443, 0xffffffff00000000, u64(fiat.u1(x455))) + x458, x459 := bits.sub_u64(x445, 0xfffffffffffffffe, u64(fiat.u1(x457))) + x460, x461 := bits.sub_u64(x447, 0xffffffffffffffff, u64(fiat.u1(x459))) + x462, x463 := bits.sub_u64(x449, 0xffffffffffffffff, u64(fiat.u1(x461))) + x464, x465 := bits.sub_u64(x451, 0xffffffffffffffff, u64(fiat.u1(x463))) + _, x467 := bits.sub_u64(x453, u64(0x0), u64(fiat.u1(x465))) + x468 := fiat.cmovznz_u64(fiat.u1(x467), x454, x441) + x469 := fiat.cmovznz_u64(fiat.u1(x467), x456, x443) + x470 := fiat.cmovznz_u64(fiat.u1(x467), x458, x445) + x471 := fiat.cmovznz_u64(fiat.u1(x467), x460, x447) + x472 := fiat.cmovznz_u64(fiat.u1(x467), x462, x449) + x473 := fiat.cmovznz_u64(fiat.u1(x467), x464, x451) + out1[0] = x468 + out1[1] = x469 + out1[2] = x470 + out1[3] = x471 + out1[4] = x472 + out1[5] = x473 +} + +fe_square :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[4] + x5 := arg1[5] + x6 := arg1[0] + x8, x7 := bits.mul_u64(x6, arg1[5]) + x10, x9 := bits.mul_u64(x6, arg1[4]) + x12, x11 := bits.mul_u64(x6, arg1[3]) + x14, x13 := bits.mul_u64(x6, arg1[2]) + x16, x15 := bits.mul_u64(x6, arg1[1]) + x18, x17 := bits.mul_u64(x6, arg1[0]) + x19, x20 := bits.add_u64(x18, x15, u64(0x0)) + x21, x22 := bits.add_u64(x16, x13, u64(fiat.u1(x20))) + x23, x24 := bits.add_u64(x14, x11, u64(fiat.u1(x22))) + x25, x26 := bits.add_u64(x12, x9, u64(fiat.u1(x24))) + x27, x28 := bits.add_u64(x10, x7, u64(fiat.u1(x26))) + x29 := (u64(fiat.u1(x28)) + x8) + _, x30 := bits.mul_u64(x17, 0x100000001) + x33, x32 := bits.mul_u64(x30, 0xffffffffffffffff) + x35, x34 := bits.mul_u64(x30, 0xffffffffffffffff) + x37, x36 := bits.mul_u64(x30, 0xffffffffffffffff) + x39, x38 := bits.mul_u64(x30, 0xfffffffffffffffe) + x41, x40 := bits.mul_u64(x30, 0xffffffff00000000) + x43, x42 := bits.mul_u64(x30, 0xffffffff) + x44, x45 := bits.add_u64(x43, x40, u64(0x0)) + x46, x47 := bits.add_u64(x41, x38, u64(fiat.u1(x45))) + x48, x49 := bits.add_u64(x39, x36, u64(fiat.u1(x47))) + x50, x51 := bits.add_u64(x37, x34, u64(fiat.u1(x49))) + x52, x53 := bits.add_u64(x35, x32, u64(fiat.u1(x51))) + x54 := (u64(fiat.u1(x53)) + x33) + _, x56 := bits.add_u64(x17, x42, u64(0x0)) + x57, x58 := bits.add_u64(x19, x44, u64(fiat.u1(x56))) + x59, x60 := bits.add_u64(x21, x46, u64(fiat.u1(x58))) + x61, x62 := bits.add_u64(x23, x48, u64(fiat.u1(x60))) + x63, x64 := bits.add_u64(x25, x50, u64(fiat.u1(x62))) + x65, x66 := bits.add_u64(x27, x52, u64(fiat.u1(x64))) + x67, x68 := bits.add_u64(x29, x54, u64(fiat.u1(x66))) + x70, x69 := bits.mul_u64(x1, arg1[5]) + x72, x71 := bits.mul_u64(x1, arg1[4]) + x74, x73 := bits.mul_u64(x1, arg1[3]) + x76, x75 := bits.mul_u64(x1, arg1[2]) + x78, x77 := bits.mul_u64(x1, arg1[1]) + x80, x79 := bits.mul_u64(x1, arg1[0]) + x81, x82 := bits.add_u64(x80, x77, u64(0x0)) + x83, x84 := bits.add_u64(x78, x75, u64(fiat.u1(x82))) + x85, x86 := bits.add_u64(x76, x73, u64(fiat.u1(x84))) + x87, x88 := bits.add_u64(x74, x71, u64(fiat.u1(x86))) + x89, x90 := bits.add_u64(x72, x69, u64(fiat.u1(x88))) + x91 := (u64(fiat.u1(x90)) + x70) + x92, x93 := bits.add_u64(x57, x79, u64(0x0)) + x94, x95 := bits.add_u64(x59, x81, u64(fiat.u1(x93))) + x96, x97 := bits.add_u64(x61, x83, u64(fiat.u1(x95))) + x98, x99 := bits.add_u64(x63, x85, u64(fiat.u1(x97))) + x100, x101 := bits.add_u64(x65, x87, u64(fiat.u1(x99))) + x102, x103 := bits.add_u64(x67, x89, u64(fiat.u1(x101))) + x104, x105 := bits.add_u64(u64(fiat.u1(x68)), x91, u64(fiat.u1(x103))) + _, x106 := bits.mul_u64(x92, 0x100000001) + x109, x108 := bits.mul_u64(x106, 0xffffffffffffffff) + x111, x110 := bits.mul_u64(x106, 0xffffffffffffffff) + x113, x112 := bits.mul_u64(x106, 0xffffffffffffffff) + x115, x114 := bits.mul_u64(x106, 0xfffffffffffffffe) + x117, x116 := bits.mul_u64(x106, 0xffffffff00000000) + x119, x118 := bits.mul_u64(x106, 0xffffffff) + x120, x121 := bits.add_u64(x119, x116, u64(0x0)) + x122, x123 := bits.add_u64(x117, x114, u64(fiat.u1(x121))) + x124, x125 := bits.add_u64(x115, x112, u64(fiat.u1(x123))) + x126, x127 := bits.add_u64(x113, x110, u64(fiat.u1(x125))) + x128, x129 := bits.add_u64(x111, x108, u64(fiat.u1(x127))) + x130 := (u64(fiat.u1(x129)) + x109) + _, x132 := bits.add_u64(x92, x118, u64(0x0)) + x133, x134 := bits.add_u64(x94, x120, u64(fiat.u1(x132))) + x135, x136 := bits.add_u64(x96, x122, u64(fiat.u1(x134))) + x137, x138 := bits.add_u64(x98, x124, u64(fiat.u1(x136))) + x139, x140 := bits.add_u64(x100, x126, u64(fiat.u1(x138))) + x141, x142 := bits.add_u64(x102, x128, u64(fiat.u1(x140))) + x143, x144 := bits.add_u64(x104, x130, u64(fiat.u1(x142))) + x145 := (u64(fiat.u1(x144)) + u64(fiat.u1(x105))) + x147, x146 := bits.mul_u64(x2, arg1[5]) + x149, x148 := bits.mul_u64(x2, arg1[4]) + x151, x150 := bits.mul_u64(x2, arg1[3]) + x153, x152 := bits.mul_u64(x2, arg1[2]) + x155, x154 := bits.mul_u64(x2, arg1[1]) + x157, x156 := bits.mul_u64(x2, arg1[0]) + x158, x159 := bits.add_u64(x157, x154, u64(0x0)) + x160, x161 := bits.add_u64(x155, x152, u64(fiat.u1(x159))) + x162, x163 := bits.add_u64(x153, x150, u64(fiat.u1(x161))) + x164, x165 := bits.add_u64(x151, x148, u64(fiat.u1(x163))) + x166, x167 := bits.add_u64(x149, x146, u64(fiat.u1(x165))) + x168 := (u64(fiat.u1(x167)) + x147) + x169, x170 := bits.add_u64(x133, x156, u64(0x0)) + x171, x172 := bits.add_u64(x135, x158, u64(fiat.u1(x170))) + x173, x174 := bits.add_u64(x137, x160, u64(fiat.u1(x172))) + x175, x176 := bits.add_u64(x139, x162, u64(fiat.u1(x174))) + x177, x178 := bits.add_u64(x141, x164, u64(fiat.u1(x176))) + x179, x180 := bits.add_u64(x143, x166, u64(fiat.u1(x178))) + x181, x182 := bits.add_u64(x145, x168, u64(fiat.u1(x180))) + _, x183 := bits.mul_u64(x169, 0x100000001) + x186, x185 := bits.mul_u64(x183, 0xffffffffffffffff) + x188, x187 := bits.mul_u64(x183, 0xffffffffffffffff) + x190, x189 := bits.mul_u64(x183, 0xffffffffffffffff) + x192, x191 := bits.mul_u64(x183, 0xfffffffffffffffe) + x194, x193 := bits.mul_u64(x183, 0xffffffff00000000) + x196, x195 := bits.mul_u64(x183, 0xffffffff) + x197, x198 := bits.add_u64(x196, x193, u64(0x0)) + x199, x200 := bits.add_u64(x194, x191, u64(fiat.u1(x198))) + x201, x202 := bits.add_u64(x192, x189, u64(fiat.u1(x200))) + x203, x204 := bits.add_u64(x190, x187, u64(fiat.u1(x202))) + x205, x206 := bits.add_u64(x188, x185, u64(fiat.u1(x204))) + x207 := (u64(fiat.u1(x206)) + x186) + _, x209 := bits.add_u64(x169, x195, u64(0x0)) + x210, x211 := bits.add_u64(x171, x197, u64(fiat.u1(x209))) + x212, x213 := bits.add_u64(x173, x199, u64(fiat.u1(x211))) + x214, x215 := bits.add_u64(x175, x201, u64(fiat.u1(x213))) + x216, x217 := bits.add_u64(x177, x203, u64(fiat.u1(x215))) + x218, x219 := bits.add_u64(x179, x205, u64(fiat.u1(x217))) + x220, x221 := bits.add_u64(x181, x207, u64(fiat.u1(x219))) + x222 := (u64(fiat.u1(x221)) + u64(fiat.u1(x182))) + x224, x223 := bits.mul_u64(x3, arg1[5]) + x226, x225 := bits.mul_u64(x3, arg1[4]) + x228, x227 := bits.mul_u64(x3, arg1[3]) + x230, x229 := bits.mul_u64(x3, arg1[2]) + x232, x231 := bits.mul_u64(x3, arg1[1]) + x234, x233 := bits.mul_u64(x3, arg1[0]) + x235, x236 := bits.add_u64(x234, x231, u64(0x0)) + x237, x238 := bits.add_u64(x232, x229, u64(fiat.u1(x236))) + x239, x240 := bits.add_u64(x230, x227, u64(fiat.u1(x238))) + x241, x242 := bits.add_u64(x228, x225, u64(fiat.u1(x240))) + x243, x244 := bits.add_u64(x226, x223, u64(fiat.u1(x242))) + x245 := (u64(fiat.u1(x244)) + x224) + x246, x247 := bits.add_u64(x210, x233, u64(0x0)) + x248, x249 := bits.add_u64(x212, x235, u64(fiat.u1(x247))) + x250, x251 := bits.add_u64(x214, x237, u64(fiat.u1(x249))) + x252, x253 := bits.add_u64(x216, x239, u64(fiat.u1(x251))) + x254, x255 := bits.add_u64(x218, x241, u64(fiat.u1(x253))) + x256, x257 := bits.add_u64(x220, x243, u64(fiat.u1(x255))) + x258, x259 := bits.add_u64(x222, x245, u64(fiat.u1(x257))) + _, x260 := bits.mul_u64(x246, 0x100000001) + x263, x262 := bits.mul_u64(x260, 0xffffffffffffffff) + x265, x264 := bits.mul_u64(x260, 0xffffffffffffffff) + x267, x266 := bits.mul_u64(x260, 0xffffffffffffffff) + x269, x268 := bits.mul_u64(x260, 0xfffffffffffffffe) + x271, x270 := bits.mul_u64(x260, 0xffffffff00000000) + x273, x272 := bits.mul_u64(x260, 0xffffffff) + x274, x275 := bits.add_u64(x273, x270, u64(0x0)) + x276, x277 := bits.add_u64(x271, x268, u64(fiat.u1(x275))) + x278, x279 := bits.add_u64(x269, x266, u64(fiat.u1(x277))) + x280, x281 := bits.add_u64(x267, x264, u64(fiat.u1(x279))) + x282, x283 := bits.add_u64(x265, x262, u64(fiat.u1(x281))) + x284 := (u64(fiat.u1(x283)) + x263) + _, x286 := bits.add_u64(x246, x272, u64(0x0)) + x287, x288 := bits.add_u64(x248, x274, u64(fiat.u1(x286))) + x289, x290 := bits.add_u64(x250, x276, u64(fiat.u1(x288))) + x291, x292 := bits.add_u64(x252, x278, u64(fiat.u1(x290))) + x293, x294 := bits.add_u64(x254, x280, u64(fiat.u1(x292))) + x295, x296 := bits.add_u64(x256, x282, u64(fiat.u1(x294))) + x297, x298 := bits.add_u64(x258, x284, u64(fiat.u1(x296))) + x299 := (u64(fiat.u1(x298)) + u64(fiat.u1(x259))) + x301, x300 := bits.mul_u64(x4, arg1[5]) + x303, x302 := bits.mul_u64(x4, arg1[4]) + x305, x304 := bits.mul_u64(x4, arg1[3]) + x307, x306 := bits.mul_u64(x4, arg1[2]) + x309, x308 := bits.mul_u64(x4, arg1[1]) + x311, x310 := bits.mul_u64(x4, arg1[0]) + x312, x313 := bits.add_u64(x311, x308, u64(0x0)) + x314, x315 := bits.add_u64(x309, x306, u64(fiat.u1(x313))) + x316, x317 := bits.add_u64(x307, x304, u64(fiat.u1(x315))) + x318, x319 := bits.add_u64(x305, x302, u64(fiat.u1(x317))) + x320, x321 := bits.add_u64(x303, x300, u64(fiat.u1(x319))) + x322 := (u64(fiat.u1(x321)) + x301) + x323, x324 := bits.add_u64(x287, x310, u64(0x0)) + x325, x326 := bits.add_u64(x289, x312, u64(fiat.u1(x324))) + x327, x328 := bits.add_u64(x291, x314, u64(fiat.u1(x326))) + x329, x330 := bits.add_u64(x293, x316, u64(fiat.u1(x328))) + x331, x332 := bits.add_u64(x295, x318, u64(fiat.u1(x330))) + x333, x334 := bits.add_u64(x297, x320, u64(fiat.u1(x332))) + x335, x336 := bits.add_u64(x299, x322, u64(fiat.u1(x334))) + _, x337 := bits.mul_u64(x323, 0x100000001) + x340, x339 := bits.mul_u64(x337, 0xffffffffffffffff) + x342, x341 := bits.mul_u64(x337, 0xffffffffffffffff) + x344, x343 := bits.mul_u64(x337, 0xffffffffffffffff) + x346, x345 := bits.mul_u64(x337, 0xfffffffffffffffe) + x348, x347 := bits.mul_u64(x337, 0xffffffff00000000) + x350, x349 := bits.mul_u64(x337, 0xffffffff) + x351, x352 := bits.add_u64(x350, x347, u64(0x0)) + x353, x354 := bits.add_u64(x348, x345, u64(fiat.u1(x352))) + x355, x356 := bits.add_u64(x346, x343, u64(fiat.u1(x354))) + x357, x358 := bits.add_u64(x344, x341, u64(fiat.u1(x356))) + x359, x360 := bits.add_u64(x342, x339, u64(fiat.u1(x358))) + x361 := (u64(fiat.u1(x360)) + x340) + _, x363 := bits.add_u64(x323, x349, u64(0x0)) + x364, x365 := bits.add_u64(x325, x351, u64(fiat.u1(x363))) + x366, x367 := bits.add_u64(x327, x353, u64(fiat.u1(x365))) + x368, x369 := bits.add_u64(x329, x355, u64(fiat.u1(x367))) + x370, x371 := bits.add_u64(x331, x357, u64(fiat.u1(x369))) + x372, x373 := bits.add_u64(x333, x359, u64(fiat.u1(x371))) + x374, x375 := bits.add_u64(x335, x361, u64(fiat.u1(x373))) + x376 := (u64(fiat.u1(x375)) + u64(fiat.u1(x336))) + x378, x377 := bits.mul_u64(x5, arg1[5]) + x380, x379 := bits.mul_u64(x5, arg1[4]) + x382, x381 := bits.mul_u64(x5, arg1[3]) + x384, x383 := bits.mul_u64(x5, arg1[2]) + x386, x385 := bits.mul_u64(x5, arg1[1]) + x388, x387 := bits.mul_u64(x5, arg1[0]) + x389, x390 := bits.add_u64(x388, x385, u64(0x0)) + x391, x392 := bits.add_u64(x386, x383, u64(fiat.u1(x390))) + x393, x394 := bits.add_u64(x384, x381, u64(fiat.u1(x392))) + x395, x396 := bits.add_u64(x382, x379, u64(fiat.u1(x394))) + x397, x398 := bits.add_u64(x380, x377, u64(fiat.u1(x396))) + x399 := (u64(fiat.u1(x398)) + x378) + x400, x401 := bits.add_u64(x364, x387, u64(0x0)) + x402, x403 := bits.add_u64(x366, x389, u64(fiat.u1(x401))) + x404, x405 := bits.add_u64(x368, x391, u64(fiat.u1(x403))) + x406, x407 := bits.add_u64(x370, x393, u64(fiat.u1(x405))) + x408, x409 := bits.add_u64(x372, x395, u64(fiat.u1(x407))) + x410, x411 := bits.add_u64(x374, x397, u64(fiat.u1(x409))) + x412, x413 := bits.add_u64(x376, x399, u64(fiat.u1(x411))) + _, x414 := bits.mul_u64(x400, 0x100000001) + x417, x416 := bits.mul_u64(x414, 0xffffffffffffffff) + x419, x418 := bits.mul_u64(x414, 0xffffffffffffffff) + x421, x420 := bits.mul_u64(x414, 0xffffffffffffffff) + x423, x422 := bits.mul_u64(x414, 0xfffffffffffffffe) + x425, x424 := bits.mul_u64(x414, 0xffffffff00000000) + x427, x426 := bits.mul_u64(x414, 0xffffffff) + x428, x429 := bits.add_u64(x427, x424, u64(0x0)) + x430, x431 := bits.add_u64(x425, x422, u64(fiat.u1(x429))) + x432, x433 := bits.add_u64(x423, x420, u64(fiat.u1(x431))) + x434, x435 := bits.add_u64(x421, x418, u64(fiat.u1(x433))) + x436, x437 := bits.add_u64(x419, x416, u64(fiat.u1(x435))) + x438 := (u64(fiat.u1(x437)) + x417) + _, x440 := bits.add_u64(x400, x426, u64(0x0)) + x441, x442 := bits.add_u64(x402, x428, u64(fiat.u1(x440))) + x443, x444 := bits.add_u64(x404, x430, u64(fiat.u1(x442))) + x445, x446 := bits.add_u64(x406, x432, u64(fiat.u1(x444))) + x447, x448 := bits.add_u64(x408, x434, u64(fiat.u1(x446))) + x449, x450 := bits.add_u64(x410, x436, u64(fiat.u1(x448))) + x451, x452 := bits.add_u64(x412, x438, u64(fiat.u1(x450))) + x453 := (u64(fiat.u1(x452)) + u64(fiat.u1(x413))) + x454, x455 := bits.sub_u64(x441, 0xffffffff, u64(0x0)) + x456, x457 := bits.sub_u64(x443, 0xffffffff00000000, u64(fiat.u1(x455))) + x458, x459 := bits.sub_u64(x445, 0xfffffffffffffffe, u64(fiat.u1(x457))) + x460, x461 := bits.sub_u64(x447, 0xffffffffffffffff, u64(fiat.u1(x459))) + x462, x463 := bits.sub_u64(x449, 0xffffffffffffffff, u64(fiat.u1(x461))) + x464, x465 := bits.sub_u64(x451, 0xffffffffffffffff, u64(fiat.u1(x463))) + _, x467 := bits.sub_u64(x453, u64(0x0), u64(fiat.u1(x465))) + x468 := fiat.cmovznz_u64(fiat.u1(x467), x454, x441) + x469 := fiat.cmovznz_u64(fiat.u1(x467), x456, x443) + x470 := fiat.cmovznz_u64(fiat.u1(x467), x458, x445) + x471 := fiat.cmovznz_u64(fiat.u1(x467), x460, x447) + x472 := fiat.cmovznz_u64(fiat.u1(x467), x462, x449) + x473 := fiat.cmovznz_u64(fiat.u1(x467), x464, x451) + out1[0] = x468 + out1[1] = x469 + out1[2] = x470 + out1[3] = x471 + out1[4] = x472 + out1[5] = x473 +} + +fe_add :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.add_u64(arg1[0], arg2[0], u64(0x0)) + x3, x4 := bits.add_u64(arg1[1], arg2[1], u64(fiat.u1(x2))) + x5, x6 := bits.add_u64(arg1[2], arg2[2], u64(fiat.u1(x4))) + x7, x8 := bits.add_u64(arg1[3], arg2[3], u64(fiat.u1(x6))) + x9, x10 := bits.add_u64(arg1[4], arg2[4], u64(fiat.u1(x8))) + x11, x12 := bits.add_u64(arg1[5], arg2[5], u64(fiat.u1(x10))) + x13, x14 := bits.sub_u64(x1, 0xffffffff, u64(0x0)) + x15, x16 := bits.sub_u64(x3, 0xffffffff00000000, u64(fiat.u1(x14))) + x17, x18 := bits.sub_u64(x5, 0xfffffffffffffffe, u64(fiat.u1(x16))) + x19, x20 := bits.sub_u64(x7, 0xffffffffffffffff, u64(fiat.u1(x18))) + x21, x22 := bits.sub_u64(x9, 0xffffffffffffffff, u64(fiat.u1(x20))) + x23, x24 := bits.sub_u64(x11, 0xffffffffffffffff, u64(fiat.u1(x22))) + _, x26 := bits.sub_u64(u64(fiat.u1(x12)), u64(0x0), u64(fiat.u1(x24))) + x27 := fiat.cmovznz_u64(fiat.u1(x26), x13, x1) + x28 := fiat.cmovznz_u64(fiat.u1(x26), x15, x3) + x29 := fiat.cmovznz_u64(fiat.u1(x26), x17, x5) + x30 := fiat.cmovznz_u64(fiat.u1(x26), x19, x7) + x31 := fiat.cmovznz_u64(fiat.u1(x26), x21, x9) + x32 := fiat.cmovznz_u64(fiat.u1(x26), x23, x11) + out1[0] = x27 + out1[1] = x28 + out1[2] = x29 + out1[3] = x30 + out1[4] = x31 + out1[5] = x32 +} + +fe_sub :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.sub_u64(arg1[0], arg2[0], u64(0x0)) + x3, x4 := bits.sub_u64(arg1[1], arg2[1], u64(fiat.u1(x2))) + x5, x6 := bits.sub_u64(arg1[2], arg2[2], u64(fiat.u1(x4))) + x7, x8 := bits.sub_u64(arg1[3], arg2[3], u64(fiat.u1(x6))) + x9, x10 := bits.sub_u64(arg1[4], arg2[4], u64(fiat.u1(x8))) + x11, x12 := bits.sub_u64(arg1[5], arg2[5], u64(fiat.u1(x10))) + x13 := fiat.cmovznz_u64(fiat.u1(x12), u64(0x0), 0xffffffffffffffff) + x14, x15 := bits.add_u64(x1, (x13 & 0xffffffff), u64(0x0)) + x16, x17 := bits.add_u64(x3, (x13 & 0xffffffff00000000), u64(fiat.u1(x15))) + x18, x19 := bits.add_u64(x5, (x13 & 0xfffffffffffffffe), u64(fiat.u1(x17))) + x20, x21 := bits.add_u64(x7, x13, u64(fiat.u1(x19))) + x22, x23 := bits.add_u64(x9, x13, u64(fiat.u1(x21))) + x24, _ := bits.add_u64(x11, x13, u64(fiat.u1(x23))) + out1[0] = x14 + out1[1] = x16 + out1[2] = x18 + out1[3] = x20 + out1[4] = x22 + out1[5] = x24 +} + +fe_opp :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.sub_u64(u64(0x0), arg1[0], u64(0x0)) + x3, x4 := bits.sub_u64(u64(0x0), arg1[1], u64(fiat.u1(x2))) + x5, x6 := bits.sub_u64(u64(0x0), arg1[2], u64(fiat.u1(x4))) + x7, x8 := bits.sub_u64(u64(0x0), arg1[3], u64(fiat.u1(x6))) + x9, x10 := bits.sub_u64(u64(0x0), arg1[4], u64(fiat.u1(x8))) + x11, x12 := bits.sub_u64(u64(0x0), arg1[5], u64(fiat.u1(x10))) + x13 := fiat.cmovznz_u64(fiat.u1(x12), u64(0x0), 0xffffffffffffffff) + x14, x15 := bits.add_u64(x1, (x13 & 0xffffffff), u64(0x0)) + x16, x17 := bits.add_u64(x3, (x13 & 0xffffffff00000000), u64(fiat.u1(x15))) + x18, x19 := bits.add_u64(x5, (x13 & 0xfffffffffffffffe), u64(fiat.u1(x17))) + x20, x21 := bits.add_u64(x7, x13, u64(fiat.u1(x19))) + x22, x23 := bits.add_u64(x9, x13, u64(fiat.u1(x21))) + x24, _ := bits.add_u64(x11, x13, u64(fiat.u1(x23))) + out1[0] = x14 + out1[1] = x16 + out1[2] = x18 + out1[3] = x20 + out1[4] = x22 + out1[5] = x24 +} + +fe_one :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element) { + out1[0] = 0xffffffff00000001 + out1[1] = 0xffffffff + out1[2] = 0x1 + out1[3] = 0x0 + out1[4] = 0x0 + out1[5] = 0x0 +} + +fe_non_zero :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> u64 { + return (arg1[0] | (arg1[1] | (arg1[2] | (arg1[3] | (arg1[4] | arg1[5]))))) +} + +@(optimization_mode = "none") +fe_cond_assign :: #force_no_inline proc "contextless" ( + out1, arg1: ^Montgomery_Domain_Field_Element, + arg2: int, +) { + x1 := fiat.cmovznz_u64(fiat.u1(arg2), out1[0], arg1[0]) + x2 := fiat.cmovznz_u64(fiat.u1(arg2), out1[1], arg1[1]) + x3 := fiat.cmovznz_u64(fiat.u1(arg2), out1[2], arg1[2]) + x4 := fiat.cmovznz_u64(fiat.u1(arg2), out1[3], arg1[3]) + x5 := fiat.cmovznz_u64(fiat.u1(arg2), out1[4], arg1[4]) + x6 := fiat.cmovznz_u64(fiat.u1(arg2), out1[5], arg1[5]) + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 + out1[4] = x5 + out1[5] = x6 +} + +fe_from_montgomery :: proc "contextless" ( + out1: ^Non_Montgomery_Domain_Field_Element, + arg1: ^Montgomery_Domain_Field_Element, +) { + x1 := arg1[0] + _, x2 := bits.mul_u64(x1, 0x100000001) + x5, x4 := bits.mul_u64(x2, 0xffffffffffffffff) + x7, x6 := bits.mul_u64(x2, 0xffffffffffffffff) + x9, x8 := bits.mul_u64(x2, 0xffffffffffffffff) + x11, x10 := bits.mul_u64(x2, 0xfffffffffffffffe) + x13, x12 := bits.mul_u64(x2, 0xffffffff00000000) + x15, x14 := bits.mul_u64(x2, 0xffffffff) + x16, x17 := bits.add_u64(x15, x12, u64(0x0)) + x18, x19 := bits.add_u64(x13, x10, u64(fiat.u1(x17))) + x20, x21 := bits.add_u64(x11, x8, u64(fiat.u1(x19))) + x22, x23 := bits.add_u64(x9, x6, u64(fiat.u1(x21))) + x24, x25 := bits.add_u64(x7, x4, u64(fiat.u1(x23))) + _, x27 := bits.add_u64(x1, x14, u64(0x0)) + x28, x29 := bits.add_u64(u64(0x0), x16, u64(fiat.u1(x27))) + x30, x31 := bits.add_u64(u64(0x0), x18, u64(fiat.u1(x29))) + x32, x33 := bits.add_u64(u64(0x0), x20, u64(fiat.u1(x31))) + x34, x35 := bits.add_u64(u64(0x0), x22, u64(fiat.u1(x33))) + x36, x37 := bits.add_u64(u64(0x0), x24, u64(fiat.u1(x35))) + x38, x39 := bits.add_u64(u64(0x0), (u64(fiat.u1(x25)) + x5), u64(fiat.u1(x37))) + x40, x41 := bits.add_u64(x28, arg1[1], u64(0x0)) + x42, x43 := bits.add_u64(x30, u64(0x0), u64(fiat.u1(x41))) + x44, x45 := bits.add_u64(x32, u64(0x0), u64(fiat.u1(x43))) + x46, x47 := bits.add_u64(x34, u64(0x0), u64(fiat.u1(x45))) + x48, x49 := bits.add_u64(x36, u64(0x0), u64(fiat.u1(x47))) + x50, x51 := bits.add_u64(x38, u64(0x0), u64(fiat.u1(x49))) + _, x52 := bits.mul_u64(x40, 0x100000001) + x55, x54 := bits.mul_u64(x52, 0xffffffffffffffff) + x57, x56 := bits.mul_u64(x52, 0xffffffffffffffff) + x59, x58 := bits.mul_u64(x52, 0xffffffffffffffff) + x61, x60 := bits.mul_u64(x52, 0xfffffffffffffffe) + x63, x62 := bits.mul_u64(x52, 0xffffffff00000000) + x65, x64 := bits.mul_u64(x52, 0xffffffff) + x66, x67 := bits.add_u64(x65, x62, u64(0x0)) + x68, x69 := bits.add_u64(x63, x60, u64(fiat.u1(x67))) + x70, x71 := bits.add_u64(x61, x58, u64(fiat.u1(x69))) + x72, x73 := bits.add_u64(x59, x56, u64(fiat.u1(x71))) + x74, x75 := bits.add_u64(x57, x54, u64(fiat.u1(x73))) + _, x77 := bits.add_u64(x40, x64, u64(0x0)) + x78, x79 := bits.add_u64(x42, x66, u64(fiat.u1(x77))) + x80, x81 := bits.add_u64(x44, x68, u64(fiat.u1(x79))) + x82, x83 := bits.add_u64(x46, x70, u64(fiat.u1(x81))) + x84, x85 := bits.add_u64(x48, x72, u64(fiat.u1(x83))) + x86, x87 := bits.add_u64(x50, x74, u64(fiat.u1(x85))) + x88, x89 := bits.add_u64((u64(fiat.u1(x51)) + u64(fiat.u1(x39))), (u64(fiat.u1(x75)) + x55), u64(fiat.u1(x87))) + x90, x91 := bits.add_u64(x78, arg1[2], u64(0x0)) + x92, x93 := bits.add_u64(x80, u64(0x0), u64(fiat.u1(x91))) + x94, x95 := bits.add_u64(x82, u64(0x0), u64(fiat.u1(x93))) + x96, x97 := bits.add_u64(x84, u64(0x0), u64(fiat.u1(x95))) + x98, x99 := bits.add_u64(x86, u64(0x0), u64(fiat.u1(x97))) + x100, x101 := bits.add_u64(x88, u64(0x0), u64(fiat.u1(x99))) + _, x102 := bits.mul_u64(x90, 0x100000001) + x105, x104 := bits.mul_u64(x102, 0xffffffffffffffff) + x107, x106 := bits.mul_u64(x102, 0xffffffffffffffff) + x109, x108 := bits.mul_u64(x102, 0xffffffffffffffff) + x111, x110 := bits.mul_u64(x102, 0xfffffffffffffffe) + x113, x112 := bits.mul_u64(x102, 0xffffffff00000000) + x115, x114 := bits.mul_u64(x102, 0xffffffff) + x116, x117 := bits.add_u64(x115, x112, u64(0x0)) + x118, x119 := bits.add_u64(x113, x110, u64(fiat.u1(x117))) + x120, x121 := bits.add_u64(x111, x108, u64(fiat.u1(x119))) + x122, x123 := bits.add_u64(x109, x106, u64(fiat.u1(x121))) + x124, x125 := bits.add_u64(x107, x104, u64(fiat.u1(x123))) + _, x127 := bits.add_u64(x90, x114, u64(0x0)) + x128, x129 := bits.add_u64(x92, x116, u64(fiat.u1(x127))) + x130, x131 := bits.add_u64(x94, x118, u64(fiat.u1(x129))) + x132, x133 := bits.add_u64(x96, x120, u64(fiat.u1(x131))) + x134, x135 := bits.add_u64(x98, x122, u64(fiat.u1(x133))) + x136, x137 := bits.add_u64(x100, x124, u64(fiat.u1(x135))) + x138, x139 := bits.add_u64((u64(fiat.u1(x101)) + u64(fiat.u1(x89))), (u64(fiat.u1(x125)) + x105), u64(fiat.u1(x137))) + x140, x141 := bits.add_u64(x128, arg1[3], u64(0x0)) + x142, x143 := bits.add_u64(x130, u64(0x0), u64(fiat.u1(x141))) + x144, x145 := bits.add_u64(x132, u64(0x0), u64(fiat.u1(x143))) + x146, x147 := bits.add_u64(x134, u64(0x0), u64(fiat.u1(x145))) + x148, x149 := bits.add_u64(x136, u64(0x0), u64(fiat.u1(x147))) + x150, x151 := bits.add_u64(x138, u64(0x0), u64(fiat.u1(x149))) + _, x152 := bits.mul_u64(x140, 0x100000001) + x155, x154 := bits.mul_u64(x152, 0xffffffffffffffff) + x157, x156 := bits.mul_u64(x152, 0xffffffffffffffff) + x159, x158 := bits.mul_u64(x152, 0xffffffffffffffff) + x161, x160 := bits.mul_u64(x152, 0xfffffffffffffffe) + x163, x162 := bits.mul_u64(x152, 0xffffffff00000000) + x165, x164 := bits.mul_u64(x152, 0xffffffff) + x166, x167 := bits.add_u64(x165, x162, u64(0x0)) + x168, x169 := bits.add_u64(x163, x160, u64(fiat.u1(x167))) + x170, x171 := bits.add_u64(x161, x158, u64(fiat.u1(x169))) + x172, x173 := bits.add_u64(x159, x156, u64(fiat.u1(x171))) + x174, x175 := bits.add_u64(x157, x154, u64(fiat.u1(x173))) + _, x177 := bits.add_u64(x140, x164, u64(0x0)) + x178, x179 := bits.add_u64(x142, x166, u64(fiat.u1(x177))) + x180, x181 := bits.add_u64(x144, x168, u64(fiat.u1(x179))) + x182, x183 := bits.add_u64(x146, x170, u64(fiat.u1(x181))) + x184, x185 := bits.add_u64(x148, x172, u64(fiat.u1(x183))) + x186, x187 := bits.add_u64(x150, x174, u64(fiat.u1(x185))) + x188, x189 := bits.add_u64((u64(fiat.u1(x151)) + u64(fiat.u1(x139))), (u64(fiat.u1(x175)) + x155), u64(fiat.u1(x187))) + x190, x191 := bits.add_u64(x178, arg1[4], u64(0x0)) + x192, x193 := bits.add_u64(x180, u64(0x0), u64(fiat.u1(x191))) + x194, x195 := bits.add_u64(x182, u64(0x0), u64(fiat.u1(x193))) + x196, x197 := bits.add_u64(x184, u64(0x0), u64(fiat.u1(x195))) + x198, x199 := bits.add_u64(x186, u64(0x0), u64(fiat.u1(x197))) + x200, x201 := bits.add_u64(x188, u64(0x0), u64(fiat.u1(x199))) + _, x202 := bits.mul_u64(x190, 0x100000001) + x205, x204 := bits.mul_u64(x202, 0xffffffffffffffff) + x207, x206 := bits.mul_u64(x202, 0xffffffffffffffff) + x209, x208 := bits.mul_u64(x202, 0xffffffffffffffff) + x211, x210 := bits.mul_u64(x202, 0xfffffffffffffffe) + x213, x212 := bits.mul_u64(x202, 0xffffffff00000000) + x215, x214 := bits.mul_u64(x202, 0xffffffff) + x216, x217 := bits.add_u64(x215, x212, u64(0x0)) + x218, x219 := bits.add_u64(x213, x210, u64(fiat.u1(x217))) + x220, x221 := bits.add_u64(x211, x208, u64(fiat.u1(x219))) + x222, x223 := bits.add_u64(x209, x206, u64(fiat.u1(x221))) + x224, x225 := bits.add_u64(x207, x204, u64(fiat.u1(x223))) + _, x227 := bits.add_u64(x190, x214, u64(0x0)) + x228, x229 := bits.add_u64(x192, x216, u64(fiat.u1(x227))) + x230, x231 := bits.add_u64(x194, x218, u64(fiat.u1(x229))) + x232, x233 := bits.add_u64(x196, x220, u64(fiat.u1(x231))) + x234, x235 := bits.add_u64(x198, x222, u64(fiat.u1(x233))) + x236, x237 := bits.add_u64(x200, x224, u64(fiat.u1(x235))) + x238, x239 := bits.add_u64((u64(fiat.u1(x201)) + u64(fiat.u1(x189))), (u64(fiat.u1(x225)) + x205), u64(fiat.u1(x237))) + x240, x241 := bits.add_u64(x228, arg1[5], u64(0x0)) + x242, x243 := bits.add_u64(x230, u64(0x0), u64(fiat.u1(x241))) + x244, x245 := bits.add_u64(x232, u64(0x0), u64(fiat.u1(x243))) + x246, x247 := bits.add_u64(x234, u64(0x0), u64(fiat.u1(x245))) + x248, x249 := bits.add_u64(x236, u64(0x0), u64(fiat.u1(x247))) + x250, x251 := bits.add_u64(x238, u64(0x0), u64(fiat.u1(x249))) + _, x252 := bits.mul_u64(x240, 0x100000001) + x255, x254 := bits.mul_u64(x252, 0xffffffffffffffff) + x257, x256 := bits.mul_u64(x252, 0xffffffffffffffff) + x259, x258 := bits.mul_u64(x252, 0xffffffffffffffff) + x261, x260 := bits.mul_u64(x252, 0xfffffffffffffffe) + x263, x262 := bits.mul_u64(x252, 0xffffffff00000000) + x265, x264 := bits.mul_u64(x252, 0xffffffff) + x266, x267 := bits.add_u64(x265, x262, u64(0x0)) + x268, x269 := bits.add_u64(x263, x260, u64(fiat.u1(x267))) + x270, x271 := bits.add_u64(x261, x258, u64(fiat.u1(x269))) + x272, x273 := bits.add_u64(x259, x256, u64(fiat.u1(x271))) + x274, x275 := bits.add_u64(x257, x254, u64(fiat.u1(x273))) + _, x277 := bits.add_u64(x240, x264, u64(0x0)) + x278, x279 := bits.add_u64(x242, x266, u64(fiat.u1(x277))) + x280, x281 := bits.add_u64(x244, x268, u64(fiat.u1(x279))) + x282, x283 := bits.add_u64(x246, x270, u64(fiat.u1(x281))) + x284, x285 := bits.add_u64(x248, x272, u64(fiat.u1(x283))) + x286, x287 := bits.add_u64(x250, x274, u64(fiat.u1(x285))) + x288, x289 := bits.add_u64((u64(fiat.u1(x251)) + u64(fiat.u1(x239))), (u64(fiat.u1(x275)) + x255), u64(fiat.u1(x287))) + x290, x291 := bits.sub_u64(x278, 0xffffffff, u64(0x0)) + x292, x293 := bits.sub_u64(x280, 0xffffffff00000000, u64(fiat.u1(x291))) + x294, x295 := bits.sub_u64(x282, 0xfffffffffffffffe, u64(fiat.u1(x293))) + x296, x297 := bits.sub_u64(x284, 0xffffffffffffffff, u64(fiat.u1(x295))) + x298, x299 := bits.sub_u64(x286, 0xffffffffffffffff, u64(fiat.u1(x297))) + x300, x301 := bits.sub_u64(x288, 0xffffffffffffffff, u64(fiat.u1(x299))) + _, x303 := bits.sub_u64(u64(fiat.u1(x289)), u64(0x0), u64(fiat.u1(x301))) + x304 := fiat.cmovznz_u64(fiat.u1(x303), x290, x278) + x305 := fiat.cmovznz_u64(fiat.u1(x303), x292, x280) + x306 := fiat.cmovznz_u64(fiat.u1(x303), x294, x282) + x307 := fiat.cmovznz_u64(fiat.u1(x303), x296, x284) + x308 := fiat.cmovznz_u64(fiat.u1(x303), x298, x286) + x309 := fiat.cmovznz_u64(fiat.u1(x303), x300, x288) + out1[0] = x304 + out1[1] = x305 + out1[2] = x306 + out1[3] = x307 + out1[4] = x308 + out1[5] = x309 +} + +fe_to_montgomery :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: ^Non_Montgomery_Domain_Field_Element, +) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[4] + x5 := arg1[5] + x6 := arg1[0] + x8, x7 := bits.mul_u64(x6, 0x200000000) + x10, x9 := bits.mul_u64(x6, 0xfffffffe00000000) + x12, x11 := bits.mul_u64(x6, 0x200000000) + x14, x13 := bits.mul_u64(x6, 0xfffffffe00000001) + x15, x16 := bits.add_u64(x14, x11, u64(0x0)) + x17, x18 := bits.add_u64(x12, x9, u64(fiat.u1(x16))) + x19, x20 := bits.add_u64(x10, x7, u64(fiat.u1(x18))) + x21, x22 := bits.add_u64(x8, x6, u64(fiat.u1(x20))) + _, x23 := bits.mul_u64(x13, 0x100000001) + x26, x25 := bits.mul_u64(x23, 0xffffffffffffffff) + x28, x27 := bits.mul_u64(x23, 0xffffffffffffffff) + x30, x29 := bits.mul_u64(x23, 0xffffffffffffffff) + x32, x31 := bits.mul_u64(x23, 0xfffffffffffffffe) + x34, x33 := bits.mul_u64(x23, 0xffffffff00000000) + x36, x35 := bits.mul_u64(x23, 0xffffffff) + x37, x38 := bits.add_u64(x36, x33, u64(0x0)) + x39, x40 := bits.add_u64(x34, x31, u64(fiat.u1(x38))) + x41, x42 := bits.add_u64(x32, x29, u64(fiat.u1(x40))) + x43, x44 := bits.add_u64(x30, x27, u64(fiat.u1(x42))) + x45, x46 := bits.add_u64(x28, x25, u64(fiat.u1(x44))) + _, x48 := bits.add_u64(x13, x35, u64(0x0)) + x49, x50 := bits.add_u64(x15, x37, u64(fiat.u1(x48))) + x51, x52 := bits.add_u64(x17, x39, u64(fiat.u1(x50))) + x53, x54 := bits.add_u64(x19, x41, u64(fiat.u1(x52))) + x55, x56 := bits.add_u64(x21, x43, u64(fiat.u1(x54))) + x57, x58 := bits.add_u64(u64(fiat.u1(x22)), x45, u64(fiat.u1(x56))) + x59, x60 := bits.add_u64(u64(0x0), (u64(fiat.u1(x46)) + x26), u64(fiat.u1(x58))) + x62, x61 := bits.mul_u64(x1, 0x200000000) + x64, x63 := bits.mul_u64(x1, 0xfffffffe00000000) + x66, x65 := bits.mul_u64(x1, 0x200000000) + x68, x67 := bits.mul_u64(x1, 0xfffffffe00000001) + x69, x70 := bits.add_u64(x68, x65, u64(0x0)) + x71, x72 := bits.add_u64(x66, x63, u64(fiat.u1(x70))) + x73, x74 := bits.add_u64(x64, x61, u64(fiat.u1(x72))) + x75, x76 := bits.add_u64(x62, x1, u64(fiat.u1(x74))) + x77, x78 := bits.add_u64(x49, x67, u64(0x0)) + x79, x80 := bits.add_u64(x51, x69, u64(fiat.u1(x78))) + x81, x82 := bits.add_u64(x53, x71, u64(fiat.u1(x80))) + x83, x84 := bits.add_u64(x55, x73, u64(fiat.u1(x82))) + x85, x86 := bits.add_u64(x57, x75, u64(fiat.u1(x84))) + x87, x88 := bits.add_u64(x59, u64(fiat.u1(x76)), u64(fiat.u1(x86))) + _, x89 := bits.mul_u64(x77, 0x100000001) + x92, x91 := bits.mul_u64(x89, 0xffffffffffffffff) + x94, x93 := bits.mul_u64(x89, 0xffffffffffffffff) + x96, x95 := bits.mul_u64(x89, 0xffffffffffffffff) + x98, x97 := bits.mul_u64(x89, 0xfffffffffffffffe) + x100, x99 := bits.mul_u64(x89, 0xffffffff00000000) + x102, x101 := bits.mul_u64(x89, 0xffffffff) + x103, x104 := bits.add_u64(x102, x99, u64(0x0)) + x105, x106 := bits.add_u64(x100, x97, u64(fiat.u1(x104))) + x107, x108 := bits.add_u64(x98, x95, u64(fiat.u1(x106))) + x109, x110 := bits.add_u64(x96, x93, u64(fiat.u1(x108))) + x111, x112 := bits.add_u64(x94, x91, u64(fiat.u1(x110))) + _, x114 := bits.add_u64(x77, x101, u64(0x0)) + x115, x116 := bits.add_u64(x79, x103, u64(fiat.u1(x114))) + x117, x118 := bits.add_u64(x81, x105, u64(fiat.u1(x116))) + x119, x120 := bits.add_u64(x83, x107, u64(fiat.u1(x118))) + x121, x122 := bits.add_u64(x85, x109, u64(fiat.u1(x120))) + x123, x124 := bits.add_u64(x87, x111, u64(fiat.u1(x122))) + x125, x126 := bits.add_u64((u64(fiat.u1(x88)) + u64(fiat.u1(x60))), (u64(fiat.u1(x112)) + x92), u64(fiat.u1(x124))) + x128, x127 := bits.mul_u64(x2, 0x200000000) + x130, x129 := bits.mul_u64(x2, 0xfffffffe00000000) + x132, x131 := bits.mul_u64(x2, 0x200000000) + x134, x133 := bits.mul_u64(x2, 0xfffffffe00000001) + x135, x136 := bits.add_u64(x134, x131, u64(0x0)) + x137, x138 := bits.add_u64(x132, x129, u64(fiat.u1(x136))) + x139, x140 := bits.add_u64(x130, x127, u64(fiat.u1(x138))) + x141, x142 := bits.add_u64(x128, x2, u64(fiat.u1(x140))) + x143, x144 := bits.add_u64(x115, x133, u64(0x0)) + x145, x146 := bits.add_u64(x117, x135, u64(fiat.u1(x144))) + x147, x148 := bits.add_u64(x119, x137, u64(fiat.u1(x146))) + x149, x150 := bits.add_u64(x121, x139, u64(fiat.u1(x148))) + x151, x152 := bits.add_u64(x123, x141, u64(fiat.u1(x150))) + x153, x154 := bits.add_u64(x125, u64(fiat.u1(x142)), u64(fiat.u1(x152))) + _, x155 := bits.mul_u64(x143, 0x100000001) + x158, x157 := bits.mul_u64(x155, 0xffffffffffffffff) + x160, x159 := bits.mul_u64(x155, 0xffffffffffffffff) + x162, x161 := bits.mul_u64(x155, 0xffffffffffffffff) + x164, x163 := bits.mul_u64(x155, 0xfffffffffffffffe) + x166, x165 := bits.mul_u64(x155, 0xffffffff00000000) + x168, x167 := bits.mul_u64(x155, 0xffffffff) + x169, x170 := bits.add_u64(x168, x165, u64(0x0)) + x171, x172 := bits.add_u64(x166, x163, u64(fiat.u1(x170))) + x173, x174 := bits.add_u64(x164, x161, u64(fiat.u1(x172))) + x175, x176 := bits.add_u64(x162, x159, u64(fiat.u1(x174))) + x177, x178 := bits.add_u64(x160, x157, u64(fiat.u1(x176))) + _, x180 := bits.add_u64(x143, x167, u64(0x0)) + x181, x182 := bits.add_u64(x145, x169, u64(fiat.u1(x180))) + x183, x184 := bits.add_u64(x147, x171, u64(fiat.u1(x182))) + x185, x186 := bits.add_u64(x149, x173, u64(fiat.u1(x184))) + x187, x188 := bits.add_u64(x151, x175, u64(fiat.u1(x186))) + x189, x190 := bits.add_u64(x153, x177, u64(fiat.u1(x188))) + x191, x192 := bits.add_u64((u64(fiat.u1(x154)) + u64(fiat.u1(x126))), (u64(fiat.u1(x178)) + x158), u64(fiat.u1(x190))) + x194, x193 := bits.mul_u64(x3, 0x200000000) + x196, x195 := bits.mul_u64(x3, 0xfffffffe00000000) + x198, x197 := bits.mul_u64(x3, 0x200000000) + x200, x199 := bits.mul_u64(x3, 0xfffffffe00000001) + x201, x202 := bits.add_u64(x200, x197, u64(0x0)) + x203, x204 := bits.add_u64(x198, x195, u64(fiat.u1(x202))) + x205, x206 := bits.add_u64(x196, x193, u64(fiat.u1(x204))) + x207, x208 := bits.add_u64(x194, x3, u64(fiat.u1(x206))) + x209, x210 := bits.add_u64(x181, x199, u64(0x0)) + x211, x212 := bits.add_u64(x183, x201, u64(fiat.u1(x210))) + x213, x214 := bits.add_u64(x185, x203, u64(fiat.u1(x212))) + x215, x216 := bits.add_u64(x187, x205, u64(fiat.u1(x214))) + x217, x218 := bits.add_u64(x189, x207, u64(fiat.u1(x216))) + x219, x220 := bits.add_u64(x191, u64(fiat.u1(x208)), u64(fiat.u1(x218))) + _, x221 := bits.mul_u64(x209, 0x100000001) + x224, x223 := bits.mul_u64(x221, 0xffffffffffffffff) + x226, x225 := bits.mul_u64(x221, 0xffffffffffffffff) + x228, x227 := bits.mul_u64(x221, 0xffffffffffffffff) + x230, x229 := bits.mul_u64(x221, 0xfffffffffffffffe) + x232, x231 := bits.mul_u64(x221, 0xffffffff00000000) + x234, x233 := bits.mul_u64(x221, 0xffffffff) + x235, x236 := bits.add_u64(x234, x231, u64(0x0)) + x237, x238 := bits.add_u64(x232, x229, u64(fiat.u1(x236))) + x239, x240 := bits.add_u64(x230, x227, u64(fiat.u1(x238))) + x241, x242 := bits.add_u64(x228, x225, u64(fiat.u1(x240))) + x243, x244 := bits.add_u64(x226, x223, u64(fiat.u1(x242))) + _, x246 := bits.add_u64(x209, x233, u64(0x0)) + x247, x248 := bits.add_u64(x211, x235, u64(fiat.u1(x246))) + x249, x250 := bits.add_u64(x213, x237, u64(fiat.u1(x248))) + x251, x252 := bits.add_u64(x215, x239, u64(fiat.u1(x250))) + x253, x254 := bits.add_u64(x217, x241, u64(fiat.u1(x252))) + x255, x256 := bits.add_u64(x219, x243, u64(fiat.u1(x254))) + x257, x258 := bits.add_u64((u64(fiat.u1(x220)) + u64(fiat.u1(x192))), (u64(fiat.u1(x244)) + x224), u64(fiat.u1(x256))) + x260, x259 := bits.mul_u64(x4, 0x200000000) + x262, x261 := bits.mul_u64(x4, 0xfffffffe00000000) + x264, x263 := bits.mul_u64(x4, 0x200000000) + x266, x265 := bits.mul_u64(x4, 0xfffffffe00000001) + x267, x268 := bits.add_u64(x266, x263, u64(0x0)) + x269, x270 := bits.add_u64(x264, x261, u64(fiat.u1(x268))) + x271, x272 := bits.add_u64(x262, x259, u64(fiat.u1(x270))) + x273, x274 := bits.add_u64(x260, x4, u64(fiat.u1(x272))) + x275, x276 := bits.add_u64(x247, x265, u64(0x0)) + x277, x278 := bits.add_u64(x249, x267, u64(fiat.u1(x276))) + x279, x280 := bits.add_u64(x251, x269, u64(fiat.u1(x278))) + x281, x282 := bits.add_u64(x253, x271, u64(fiat.u1(x280))) + x283, x284 := bits.add_u64(x255, x273, u64(fiat.u1(x282))) + x285, x286 := bits.add_u64(x257, u64(fiat.u1(x274)), u64(fiat.u1(x284))) + _, x287 := bits.mul_u64(x275, 0x100000001) + x290, x289 := bits.mul_u64(x287, 0xffffffffffffffff) + x292, x291 := bits.mul_u64(x287, 0xffffffffffffffff) + x294, x293 := bits.mul_u64(x287, 0xffffffffffffffff) + x296, x295 := bits.mul_u64(x287, 0xfffffffffffffffe) + x298, x297 := bits.mul_u64(x287, 0xffffffff00000000) + x300, x299 := bits.mul_u64(x287, 0xffffffff) + x301, x302 := bits.add_u64(x300, x297, u64(0x0)) + x303, x304 := bits.add_u64(x298, x295, u64(fiat.u1(x302))) + x305, x306 := bits.add_u64(x296, x293, u64(fiat.u1(x304))) + x307, x308 := bits.add_u64(x294, x291, u64(fiat.u1(x306))) + x309, x310 := bits.add_u64(x292, x289, u64(fiat.u1(x308))) + _, x312 := bits.add_u64(x275, x299, u64(0x0)) + x313, x314 := bits.add_u64(x277, x301, u64(fiat.u1(x312))) + x315, x316 := bits.add_u64(x279, x303, u64(fiat.u1(x314))) + x317, x318 := bits.add_u64(x281, x305, u64(fiat.u1(x316))) + x319, x320 := bits.add_u64(x283, x307, u64(fiat.u1(x318))) + x321, x322 := bits.add_u64(x285, x309, u64(fiat.u1(x320))) + x323, x324 := bits.add_u64((u64(fiat.u1(x286)) + u64(fiat.u1(x258))), (u64(fiat.u1(x310)) + x290), u64(fiat.u1(x322))) + x326, x325 := bits.mul_u64(x5, 0x200000000) + x328, x327 := bits.mul_u64(x5, 0xfffffffe00000000) + x330, x329 := bits.mul_u64(x5, 0x200000000) + x332, x331 := bits.mul_u64(x5, 0xfffffffe00000001) + x333, x334 := bits.add_u64(x332, x329, u64(0x0)) + x335, x336 := bits.add_u64(x330, x327, u64(fiat.u1(x334))) + x337, x338 := bits.add_u64(x328, x325, u64(fiat.u1(x336))) + x339, x340 := bits.add_u64(x326, x5, u64(fiat.u1(x338))) + x341, x342 := bits.add_u64(x313, x331, u64(0x0)) + x343, x344 := bits.add_u64(x315, x333, u64(fiat.u1(x342))) + x345, x346 := bits.add_u64(x317, x335, u64(fiat.u1(x344))) + x347, x348 := bits.add_u64(x319, x337, u64(fiat.u1(x346))) + x349, x350 := bits.add_u64(x321, x339, u64(fiat.u1(x348))) + x351, x352 := bits.add_u64(x323, u64(fiat.u1(x340)), u64(fiat.u1(x350))) + _, x353 := bits.mul_u64(x341, 0x100000001) + x356, x355 := bits.mul_u64(x353, 0xffffffffffffffff) + x358, x357 := bits.mul_u64(x353, 0xffffffffffffffff) + x360, x359 := bits.mul_u64(x353, 0xffffffffffffffff) + x362, x361 := bits.mul_u64(x353, 0xfffffffffffffffe) + x364, x363 := bits.mul_u64(x353, 0xffffffff00000000) + x366, x365 := bits.mul_u64(x353, 0xffffffff) + x367, x368 := bits.add_u64(x366, x363, u64(0x0)) + x369, x370 := bits.add_u64(x364, x361, u64(fiat.u1(x368))) + x371, x372 := bits.add_u64(x362, x359, u64(fiat.u1(x370))) + x373, x374 := bits.add_u64(x360, x357, u64(fiat.u1(x372))) + x375, x376 := bits.add_u64(x358, x355, u64(fiat.u1(x374))) + _, x378 := bits.add_u64(x341, x365, u64(0x0)) + x379, x380 := bits.add_u64(x343, x367, u64(fiat.u1(x378))) + x381, x382 := bits.add_u64(x345, x369, u64(fiat.u1(x380))) + x383, x384 := bits.add_u64(x347, x371, u64(fiat.u1(x382))) + x385, x386 := bits.add_u64(x349, x373, u64(fiat.u1(x384))) + x387, x388 := bits.add_u64(x351, x375, u64(fiat.u1(x386))) + x389, x390 := bits.add_u64((u64(fiat.u1(x352)) + u64(fiat.u1(x324))), (u64(fiat.u1(x376)) + x356), u64(fiat.u1(x388))) + x391, x392 := bits.sub_u64(x379, 0xffffffff, u64(0x0)) + x393, x394 := bits.sub_u64(x381, 0xffffffff00000000, u64(fiat.u1(x392))) + x395, x396 := bits.sub_u64(x383, 0xfffffffffffffffe, u64(fiat.u1(x394))) + x397, x398 := bits.sub_u64(x385, 0xffffffffffffffff, u64(fiat.u1(x396))) + x399, x400 := bits.sub_u64(x387, 0xffffffffffffffff, u64(fiat.u1(x398))) + x401, x402 := bits.sub_u64(x389, 0xffffffffffffffff, u64(fiat.u1(x400))) + _, x404 := bits.sub_u64(u64(fiat.u1(x390)), u64(0x0), u64(fiat.u1(x402))) + x405 := fiat.cmovznz_u64(fiat.u1(x404), x391, x379) + x406 := fiat.cmovznz_u64(fiat.u1(x404), x393, x381) + x407 := fiat.cmovznz_u64(fiat.u1(x404), x395, x383) + x408 := fiat.cmovznz_u64(fiat.u1(x404), x397, x385) + x409 := fiat.cmovznz_u64(fiat.u1(x404), x399, x387) + x410 := fiat.cmovznz_u64(fiat.u1(x404), x401, x389) + out1[0] = x405 + out1[1] = x406 + out1[2] = x407 + out1[3] = x408 + out1[4] = x409 + out1[5] = x410 +} diff --git a/core/crypto/_fiat/field_scalarp384r1/field.odin b/core/crypto/_fiat/field_scalarp384r1/field.odin new file mode 100644 index 000000000..f8af5e0f5 --- /dev/null +++ b/core/crypto/_fiat/field_scalarp384r1/field.odin @@ -0,0 +1,239 @@ +package field_scalarp384r1 + +import subtle "core:crypto/_subtle" +import "core:encoding/endian" +import "core:math/bits" +import "core:mem" + +@(private, rodata) +TWO_256 := Montgomery_Domain_Field_Element{ + 17975668497346362272, + 12895982994901192340, + 1913828944324294218, + 902107514168524577, + 1374695839762142861, + 12098342389602539653, +} + +fe_clear :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) { + mem.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) +} + +fe_clear_vec :: proc "contextless" ( + arg1: []^Montgomery_Domain_Field_Element, +) { + for fe in arg1 { + fe_clear(fe) + } +} + +fe_from_bytes :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: []byte, +) -> bool { + ensure_contextless(len(out1) <= 64, "p384r1: invalid scalar input buffer") + + is_canonical := false + s_len := len(arg1) + switch { + case s_len < 48: + // No way this can be greater than the order. + fe_unchecked_set(out1, arg1) + is_canonical = true + case s_len == 48: + // There is no way for any 384-bit value to be >= 2n, so + // the reduction can be done by `src - n` and a conditional + // select based on the underflow. + // + // It is *extremely* unlikely that the reduction is actually + // needed. + tmp: Non_Montgomery_Domain_Field_Element = --- + fe_unchecked_set_saturated(&tmp, arg1) + reduced := tmp + defer mem.zero_explicit(&tmp, size_of(tmp)) + defer mem.zero_explicit(&reduced, size_of(reduced)) + + borrow: u64 + reduced[0], borrow = bits.sub_u64(tmp[0], ELL[0], borrow) + reduced[1], borrow = bits.sub_u64(tmp[1], ELL[1], borrow) + reduced[2], borrow = bits.sub_u64(tmp[2], ELL[2], borrow) + reduced[3], borrow = bits.sub_u64(tmp[3], ELL[3], borrow) + reduced[4], borrow = bits.sub_u64(tmp[4], ELL[4], borrow) + reduced[5], borrow = bits.sub_u64(tmp[5], ELL[5], borrow) + need_reduced := subtle.u64_is_zero(borrow) + + fe_cond_select(&tmp, &tmp, &reduced, int(need_reduced)) + fe_to_montgomery(out1, &tmp) + + is_canonical = need_reduced == 0 + case: + // Use Frank Denis' trick, as documented by Filippo Valsorda + // at https://words.filippo.io/dispatches/wide-reduction/ + // + // "I represent the value as a+b*2^192+c*2^384" + // + // Since digests beyond 512-bits are unrealistic, we do + // "a+b*2^256" + + // Zero extend to 512-bits. + src_512: [64]byte + copy(src_512[64-s_len:], arg1) + defer mem.zero_explicit(&src_512, size_of(src_512)) + + fe_unchecked_set(out1, src_512[32:]) // a + b: Montgomery_Domain_Field_Element + fe_unchecked_set(&b, src_512[:32]) // b + + fe_mul(&b, &b, &TWO_256) + fe_add(out1, out1, &b) + + fe_clear(&b) + } + + return !is_canonical +} + +@(private) +fe_is_canonical :: proc "contextless" (arg1: []byte) -> bool { + _, borrow := bits.sub_u64(ELL[0] - 1, endian.unchecked_get_u64be(arg1[40:]), 0) + _, borrow = bits.sub_u64(ELL[1], endian.unchecked_get_u64be(arg1[32:]), borrow) + _, borrow = bits.sub_u64(ELL[2], endian.unchecked_get_u64be(arg1[24:]), borrow) + _, borrow = bits.sub_u64(ELL[3], endian.unchecked_get_u64be(arg1[16:]), borrow) + _, borrow = bits.sub_u64(ELL[4], endian.unchecked_get_u64be(arg1[8:]), borrow) + _, borrow = bits.sub_u64(ELL[5], endian.unchecked_get_u64be(arg1[0:]), borrow) + return borrow == 0 +} + +@(private="file") +fe_unchecked_set_saturated :: proc "contextless" (out1: ^Non_Montgomery_Domain_Field_Element, arg1: []byte) { + out1[0] = endian.unchecked_get_u64be(arg1[40:]) + out1[1] = endian.unchecked_get_u64be(arg1[32:]) + out1[2] = endian.unchecked_get_u64be(arg1[24:]) + out1[3] = endian.unchecked_get_u64be(arg1[16:]) + out1[4] = endian.unchecked_get_u64be(arg1[8:]) + out1[5] = endian.unchecked_get_u64be(arg1[0:]) +} + +@(private) +fe_unchecked_set :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element, arg1: []byte) { + arg1_384: [48]byte + defer mem.zero_explicit(&arg1_384, size_of(arg1_384)) + copy(arg1_384[48-len(arg1):], arg1) + + tmp: Non_Montgomery_Domain_Field_Element = --- + fe_unchecked_set_saturated(&tmp, arg1_384[:]) + defer mem.zero_explicit(&tmp, size_of(tmp)) + + fe_to_montgomery(out1, &tmp) +} + +fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_Element) { + ensure_contextless(len(out1) == 48, "p384r1: invalid scalar output buffer") + + tmp: Non_Montgomery_Domain_Field_Element = --- + fe_from_montgomery(&tmp, arg1) + + // Note: Likewise, output in big-endian. + endian.unchecked_put_u64be(out1[40:], tmp[0]) + endian.unchecked_put_u64be(out1[32:], tmp[1]) + endian.unchecked_put_u64be(out1[24:], tmp[2]) + endian.unchecked_put_u64be(out1[16:], tmp[3]) + endian.unchecked_put_u64be(out1[8:], tmp[4]) + endian.unchecked_put_u64be(out1[0:], tmp[5]) + + mem.zero_explicit(&tmp, size_of(tmp)) +} + +fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> int { + tmp: Montgomery_Domain_Field_Element = --- + fe_sub(&tmp, arg1, arg2) + + is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) + + fe_clear(&tmp) + + return int(is_eq) +} + +fe_is_odd :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> int { + tmp: Non_Montgomery_Domain_Field_Element = --- + defer mem.zero_explicit(&tmp, size_of(tmp)) + + fe_from_montgomery(&tmp, arg1) + return int(tmp[0] & 1) +} + +fe_zero :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element) { + out1[0] = 0 + out1[1] = 0 + out1[2] = 0 + out1[3] = 0 + out1[4] = 0 + out1[5] = 0 +} + +fe_set :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1 := arg1[0] + x2 := arg1[1] + x3 := arg1[2] + x4 := arg1[3] + x5 := arg1[4] + x6 := arg1[5] + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 + out1[4] = x5 + out1[5] = x6 +} + +@(optimization_mode = "none") +fe_cond_swap :: #force_no_inline proc "contextless" (out1, out2: ^Montgomery_Domain_Field_Element, arg1: int) { + mask := (u64(arg1) * 0xffffffffffffffff) + x := (out1[0] ~ out2[0]) & mask + x1, y1 := out1[0] ~ x, out2[0] ~ x + x = (out1[1] ~ out2[1]) & mask + x2, y2 := out1[1] ~ x, out2[1] ~ x + x = (out1[2] ~ out2[2]) & mask + x3, y3 := out1[2] ~ x, out2[2] ~ x + x = (out1[3] ~ out2[3]) & mask + x4, y4 := out1[3] ~ x, out2[3] ~ x + x = (out1[4] ~ out2[4]) & mask + x5, y5 := out1[4] ~ x, out2[4] ~ x + x = (out1[5] ~ out2[5]) & mask + x6, y6 := out1[5] ~ x, out2[5] ~ x + out1[0], out2[0] = x1, y1 + out1[1], out2[1] = x2, y2 + out1[2], out2[2] = x3, y3 + out1[3], out2[3] = x4, y4 + out1[4], out2[4] = x5, y5 + out1[5], out2[5] = x6, y6 +} + +@(optimization_mode = "none") +fe_cond_select :: #force_no_inline proc "contextless" ( + out1, arg1, arg2: ^$T, + arg3: int, +) where T == Montgomery_Domain_Field_Element || T == Non_Montgomery_Domain_Field_Element { + mask := (u64(arg3) * 0xffffffffffffffff) + x1 := ((mask & arg2[0]) | ((~mask) & arg1[0])) + x2 := ((mask & arg2[1]) | ((~mask) & arg1[1])) + x3 := ((mask & arg2[2]) | ((~mask) & arg1[2])) + x4 := ((mask & arg2[3]) | ((~mask) & arg1[3])) + x5 := ((mask & arg2[4]) | ((~mask) & arg1[4])) + x6 := ((mask & arg2[5]) | ((~mask) & arg1[5])) + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 + out1[4] = x5 + out1[5] = x6 +} + +fe_cond_negate :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element, ctrl: int) { + tmp1: Montgomery_Domain_Field_Element = --- + fe_opp(&tmp1, arg1) + fe_cond_select(out1, arg1, &tmp1, ctrl) + + fe_clear(&tmp1) +} diff --git a/core/crypto/_fiat/field_scalarp384r1/field64.odin b/core/crypto/_fiat/field_scalarp384r1/field64.odin new file mode 100644 index 000000000..ce29060e8 --- /dev/null +++ b/core/crypto/_fiat/field_scalarp384r1/field64.odin @@ -0,0 +1,1081 @@ +// The BSD 1-Clause License (BSD-1-Clause) +// +// Copyright (c) 2015-2020 the fiat-crypto authors (see the AUTHORS file) +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY the fiat-crypto authors "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, +// Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package field_scalarp384r1 + +// The file provides arithmetic on the field Z/(2^384 - 1388124618062372383947042015309946732620727252194336364173) +// using a 64-bit Montgomery form internal representation. It is derived +// primarily from the machine generated Golang output from the fiat-crypto +// project. +// +// While the base implementation is provably correct, this implementation +// makes no such claims as the port and optimizations were done by hand. +// +// WARNING: While big-endian is the common representation used for this +// curve, the fiat output uses least-significant-limb first. + +import fiat "core:crypto/_fiat" +import "core:math/bits" + +// ELL is the saturated representation of the field order, least-significant +// limb first. +ELL :: [6]u64{0xecec196accc52973, 0x581a0db248b0a77a, 0xc7634d81f4372ddf, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff} + +Montgomery_Domain_Field_Element :: distinct [6]u64 +Non_Montgomery_Domain_Field_Element :: distinct [6]u64 + +fe_mul :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[4] + x5 := arg1[5] + x6 := arg1[0] + x8, x7 := bits.mul_u64(x6, arg2[5]) + x10, x9 := bits.mul_u64(x6, arg2[4]) + x12, x11 := bits.mul_u64(x6, arg2[3]) + x14, x13 := bits.mul_u64(x6, arg2[2]) + x16, x15 := bits.mul_u64(x6, arg2[1]) + x18, x17 := bits.mul_u64(x6, arg2[0]) + x19, x20 := bits.add_u64(x18, x15, u64(0x0)) + x21, x22 := bits.add_u64(x16, x13, u64(fiat.u1(x20))) + x23, x24 := bits.add_u64(x14, x11, u64(fiat.u1(x22))) + x25, x26 := bits.add_u64(x12, x9, u64(fiat.u1(x24))) + x27, x28 := bits.add_u64(x10, x7, u64(fiat.u1(x26))) + x29 := (u64(fiat.u1(x28)) + x8) + _, x30 := bits.mul_u64(x17, 0x6ed46089e88fdc45) + x33, x32 := bits.mul_u64(x30, 0xffffffffffffffff) + x35, x34 := bits.mul_u64(x30, 0xffffffffffffffff) + x37, x36 := bits.mul_u64(x30, 0xffffffffffffffff) + x39, x38 := bits.mul_u64(x30, 0xc7634d81f4372ddf) + x41, x40 := bits.mul_u64(x30, 0x581a0db248b0a77a) + x43, x42 := bits.mul_u64(x30, 0xecec196accc52973) + x44, x45 := bits.add_u64(x43, x40, u64(0x0)) + x46, x47 := bits.add_u64(x41, x38, u64(fiat.u1(x45))) + x48, x49 := bits.add_u64(x39, x36, u64(fiat.u1(x47))) + x50, x51 := bits.add_u64(x37, x34, u64(fiat.u1(x49))) + x52, x53 := bits.add_u64(x35, x32, u64(fiat.u1(x51))) + x54 := (u64(fiat.u1(x53)) + x33) + _, x56 := bits.add_u64(x17, x42, u64(0x0)) + x57, x58 := bits.add_u64(x19, x44, u64(fiat.u1(x56))) + x59, x60 := bits.add_u64(x21, x46, u64(fiat.u1(x58))) + x61, x62 := bits.add_u64(x23, x48, u64(fiat.u1(x60))) + x63, x64 := bits.add_u64(x25, x50, u64(fiat.u1(x62))) + x65, x66 := bits.add_u64(x27, x52, u64(fiat.u1(x64))) + x67, x68 := bits.add_u64(x29, x54, u64(fiat.u1(x66))) + x70, x69 := bits.mul_u64(x1, arg2[5]) + x72, x71 := bits.mul_u64(x1, arg2[4]) + x74, x73 := bits.mul_u64(x1, arg2[3]) + x76, x75 := bits.mul_u64(x1, arg2[2]) + x78, x77 := bits.mul_u64(x1, arg2[1]) + x80, x79 := bits.mul_u64(x1, arg2[0]) + x81, x82 := bits.add_u64(x80, x77, u64(0x0)) + x83, x84 := bits.add_u64(x78, x75, u64(fiat.u1(x82))) + x85, x86 := bits.add_u64(x76, x73, u64(fiat.u1(x84))) + x87, x88 := bits.add_u64(x74, x71, u64(fiat.u1(x86))) + x89, x90 := bits.add_u64(x72, x69, u64(fiat.u1(x88))) + x91 := (u64(fiat.u1(x90)) + x70) + x92, x93 := bits.add_u64(x57, x79, u64(0x0)) + x94, x95 := bits.add_u64(x59, x81, u64(fiat.u1(x93))) + x96, x97 := bits.add_u64(x61, x83, u64(fiat.u1(x95))) + x98, x99 := bits.add_u64(x63, x85, u64(fiat.u1(x97))) + x100, x101 := bits.add_u64(x65, x87, u64(fiat.u1(x99))) + x102, x103 := bits.add_u64(x67, x89, u64(fiat.u1(x101))) + x104, x105 := bits.add_u64(u64(fiat.u1(x68)), x91, u64(fiat.u1(x103))) + _, x106 := bits.mul_u64(x92, 0x6ed46089e88fdc45) + x109, x108 := bits.mul_u64(x106, 0xffffffffffffffff) + x111, x110 := bits.mul_u64(x106, 0xffffffffffffffff) + x113, x112 := bits.mul_u64(x106, 0xffffffffffffffff) + x115, x114 := bits.mul_u64(x106, 0xc7634d81f4372ddf) + x117, x116 := bits.mul_u64(x106, 0x581a0db248b0a77a) + x119, x118 := bits.mul_u64(x106, 0xecec196accc52973) + x120, x121 := bits.add_u64(x119, x116, u64(0x0)) + x122, x123 := bits.add_u64(x117, x114, u64(fiat.u1(x121))) + x124, x125 := bits.add_u64(x115, x112, u64(fiat.u1(x123))) + x126, x127 := bits.add_u64(x113, x110, u64(fiat.u1(x125))) + x128, x129 := bits.add_u64(x111, x108, u64(fiat.u1(x127))) + x130 := (u64(fiat.u1(x129)) + x109) + _, x132 := bits.add_u64(x92, x118, u64(0x0)) + x133, x134 := bits.add_u64(x94, x120, u64(fiat.u1(x132))) + x135, x136 := bits.add_u64(x96, x122, u64(fiat.u1(x134))) + x137, x138 := bits.add_u64(x98, x124, u64(fiat.u1(x136))) + x139, x140 := bits.add_u64(x100, x126, u64(fiat.u1(x138))) + x141, x142 := bits.add_u64(x102, x128, u64(fiat.u1(x140))) + x143, x144 := bits.add_u64(x104, x130, u64(fiat.u1(x142))) + x145 := (u64(fiat.u1(x144)) + u64(fiat.u1(x105))) + x147, x146 := bits.mul_u64(x2, arg2[5]) + x149, x148 := bits.mul_u64(x2, arg2[4]) + x151, x150 := bits.mul_u64(x2, arg2[3]) + x153, x152 := bits.mul_u64(x2, arg2[2]) + x155, x154 := bits.mul_u64(x2, arg2[1]) + x157, x156 := bits.mul_u64(x2, arg2[0]) + x158, x159 := bits.add_u64(x157, x154, u64(0x0)) + x160, x161 := bits.add_u64(x155, x152, u64(fiat.u1(x159))) + x162, x163 := bits.add_u64(x153, x150, u64(fiat.u1(x161))) + x164, x165 := bits.add_u64(x151, x148, u64(fiat.u1(x163))) + x166, x167 := bits.add_u64(x149, x146, u64(fiat.u1(x165))) + x168 := (u64(fiat.u1(x167)) + x147) + x169, x170 := bits.add_u64(x133, x156, u64(0x0)) + x171, x172 := bits.add_u64(x135, x158, u64(fiat.u1(x170))) + x173, x174 := bits.add_u64(x137, x160, u64(fiat.u1(x172))) + x175, x176 := bits.add_u64(x139, x162, u64(fiat.u1(x174))) + x177, x178 := bits.add_u64(x141, x164, u64(fiat.u1(x176))) + x179, x180 := bits.add_u64(x143, x166, u64(fiat.u1(x178))) + x181, x182 := bits.add_u64(x145, x168, u64(fiat.u1(x180))) + _, x183 := bits.mul_u64(x169, 0x6ed46089e88fdc45) + x186, x185 := bits.mul_u64(x183, 0xffffffffffffffff) + x188, x187 := bits.mul_u64(x183, 0xffffffffffffffff) + x190, x189 := bits.mul_u64(x183, 0xffffffffffffffff) + x192, x191 := bits.mul_u64(x183, 0xc7634d81f4372ddf) + x194, x193 := bits.mul_u64(x183, 0x581a0db248b0a77a) + x196, x195 := bits.mul_u64(x183, 0xecec196accc52973) + x197, x198 := bits.add_u64(x196, x193, u64(0x0)) + x199, x200 := bits.add_u64(x194, x191, u64(fiat.u1(x198))) + x201, x202 := bits.add_u64(x192, x189, u64(fiat.u1(x200))) + x203, x204 := bits.add_u64(x190, x187, u64(fiat.u1(x202))) + x205, x206 := bits.add_u64(x188, x185, u64(fiat.u1(x204))) + x207 := (u64(fiat.u1(x206)) + x186) + _, x209 := bits.add_u64(x169, x195, u64(0x0)) + x210, x211 := bits.add_u64(x171, x197, u64(fiat.u1(x209))) + x212, x213 := bits.add_u64(x173, x199, u64(fiat.u1(x211))) + x214, x215 := bits.add_u64(x175, x201, u64(fiat.u1(x213))) + x216, x217 := bits.add_u64(x177, x203, u64(fiat.u1(x215))) + x218, x219 := bits.add_u64(x179, x205, u64(fiat.u1(x217))) + x220, x221 := bits.add_u64(x181, x207, u64(fiat.u1(x219))) + x222 := (u64(fiat.u1(x221)) + u64(fiat.u1(x182))) + x224, x223 := bits.mul_u64(x3, arg2[5]) + x226, x225 := bits.mul_u64(x3, arg2[4]) + x228, x227 := bits.mul_u64(x3, arg2[3]) + x230, x229 := bits.mul_u64(x3, arg2[2]) + x232, x231 := bits.mul_u64(x3, arg2[1]) + x234, x233 := bits.mul_u64(x3, arg2[0]) + x235, x236 := bits.add_u64(x234, x231, u64(0x0)) + x237, x238 := bits.add_u64(x232, x229, u64(fiat.u1(x236))) + x239, x240 := bits.add_u64(x230, x227, u64(fiat.u1(x238))) + x241, x242 := bits.add_u64(x228, x225, u64(fiat.u1(x240))) + x243, x244 := bits.add_u64(x226, x223, u64(fiat.u1(x242))) + x245 := (u64(fiat.u1(x244)) + x224) + x246, x247 := bits.add_u64(x210, x233, u64(0x0)) + x248, x249 := bits.add_u64(x212, x235, u64(fiat.u1(x247))) + x250, x251 := bits.add_u64(x214, x237, u64(fiat.u1(x249))) + x252, x253 := bits.add_u64(x216, x239, u64(fiat.u1(x251))) + x254, x255 := bits.add_u64(x218, x241, u64(fiat.u1(x253))) + x256, x257 := bits.add_u64(x220, x243, u64(fiat.u1(x255))) + x258, x259 := bits.add_u64(x222, x245, u64(fiat.u1(x257))) + _, x260 := bits.mul_u64(x246, 0x6ed46089e88fdc45) + x263, x262 := bits.mul_u64(x260, 0xffffffffffffffff) + x265, x264 := bits.mul_u64(x260, 0xffffffffffffffff) + x267, x266 := bits.mul_u64(x260, 0xffffffffffffffff) + x269, x268 := bits.mul_u64(x260, 0xc7634d81f4372ddf) + x271, x270 := bits.mul_u64(x260, 0x581a0db248b0a77a) + x273, x272 := bits.mul_u64(x260, 0xecec196accc52973) + x274, x275 := bits.add_u64(x273, x270, u64(0x0)) + x276, x277 := bits.add_u64(x271, x268, u64(fiat.u1(x275))) + x278, x279 := bits.add_u64(x269, x266, u64(fiat.u1(x277))) + x280, x281 := bits.add_u64(x267, x264, u64(fiat.u1(x279))) + x282, x283 := bits.add_u64(x265, x262, u64(fiat.u1(x281))) + x284 := (u64(fiat.u1(x283)) + x263) + _, x286 := bits.add_u64(x246, x272, u64(0x0)) + x287, x288 := bits.add_u64(x248, x274, u64(fiat.u1(x286))) + x289, x290 := bits.add_u64(x250, x276, u64(fiat.u1(x288))) + x291, x292 := bits.add_u64(x252, x278, u64(fiat.u1(x290))) + x293, x294 := bits.add_u64(x254, x280, u64(fiat.u1(x292))) + x295, x296 := bits.add_u64(x256, x282, u64(fiat.u1(x294))) + x297, x298 := bits.add_u64(x258, x284, u64(fiat.u1(x296))) + x299 := (u64(fiat.u1(x298)) + u64(fiat.u1(x259))) + x301, x300 := bits.mul_u64(x4, arg2[5]) + x303, x302 := bits.mul_u64(x4, arg2[4]) + x305, x304 := bits.mul_u64(x4, arg2[3]) + x307, x306 := bits.mul_u64(x4, arg2[2]) + x309, x308 := bits.mul_u64(x4, arg2[1]) + x311, x310 := bits.mul_u64(x4, arg2[0]) + x312, x313 := bits.add_u64(x311, x308, u64(0x0)) + x314, x315 := bits.add_u64(x309, x306, u64(fiat.u1(x313))) + x316, x317 := bits.add_u64(x307, x304, u64(fiat.u1(x315))) + x318, x319 := bits.add_u64(x305, x302, u64(fiat.u1(x317))) + x320, x321 := bits.add_u64(x303, x300, u64(fiat.u1(x319))) + x322 := (u64(fiat.u1(x321)) + x301) + x323, x324 := bits.add_u64(x287, x310, u64(0x0)) + x325, x326 := bits.add_u64(x289, x312, u64(fiat.u1(x324))) + x327, x328 := bits.add_u64(x291, x314, u64(fiat.u1(x326))) + x329, x330 := bits.add_u64(x293, x316, u64(fiat.u1(x328))) + x331, x332 := bits.add_u64(x295, x318, u64(fiat.u1(x330))) + x333, x334 := bits.add_u64(x297, x320, u64(fiat.u1(x332))) + x335, x336 := bits.add_u64(x299, x322, u64(fiat.u1(x334))) + _, x337 := bits.mul_u64(x323, 0x6ed46089e88fdc45) + x340, x339 := bits.mul_u64(x337, 0xffffffffffffffff) + x342, x341 := bits.mul_u64(x337, 0xffffffffffffffff) + x344, x343 := bits.mul_u64(x337, 0xffffffffffffffff) + x346, x345 := bits.mul_u64(x337, 0xc7634d81f4372ddf) + x348, x347 := bits.mul_u64(x337, 0x581a0db248b0a77a) + x350, x349 := bits.mul_u64(x337, 0xecec196accc52973) + x351, x352 := bits.add_u64(x350, x347, u64(0x0)) + x353, x354 := bits.add_u64(x348, x345, u64(fiat.u1(x352))) + x355, x356 := bits.add_u64(x346, x343, u64(fiat.u1(x354))) + x357, x358 := bits.add_u64(x344, x341, u64(fiat.u1(x356))) + x359, x360 := bits.add_u64(x342, x339, u64(fiat.u1(x358))) + x361 := (u64(fiat.u1(x360)) + x340) + _, x363 := bits.add_u64(x323, x349, u64(0x0)) + x364, x365 := bits.add_u64(x325, x351, u64(fiat.u1(x363))) + x366, x367 := bits.add_u64(x327, x353, u64(fiat.u1(x365))) + x368, x369 := bits.add_u64(x329, x355, u64(fiat.u1(x367))) + x370, x371 := bits.add_u64(x331, x357, u64(fiat.u1(x369))) + x372, x373 := bits.add_u64(x333, x359, u64(fiat.u1(x371))) + x374, x375 := bits.add_u64(x335, x361, u64(fiat.u1(x373))) + x376 := (u64(fiat.u1(x375)) + u64(fiat.u1(x336))) + x378, x377 := bits.mul_u64(x5, arg2[5]) + x380, x379 := bits.mul_u64(x5, arg2[4]) + x382, x381 := bits.mul_u64(x5, arg2[3]) + x384, x383 := bits.mul_u64(x5, arg2[2]) + x386, x385 := bits.mul_u64(x5, arg2[1]) + x388, x387 := bits.mul_u64(x5, arg2[0]) + x389, x390 := bits.add_u64(x388, x385, u64(0x0)) + x391, x392 := bits.add_u64(x386, x383, u64(fiat.u1(x390))) + x393, x394 := bits.add_u64(x384, x381, u64(fiat.u1(x392))) + x395, x396 := bits.add_u64(x382, x379, u64(fiat.u1(x394))) + x397, x398 := bits.add_u64(x380, x377, u64(fiat.u1(x396))) + x399 := (u64(fiat.u1(x398)) + x378) + x400, x401 := bits.add_u64(x364, x387, u64(0x0)) + x402, x403 := bits.add_u64(x366, x389, u64(fiat.u1(x401))) + x404, x405 := bits.add_u64(x368, x391, u64(fiat.u1(x403))) + x406, x407 := bits.add_u64(x370, x393, u64(fiat.u1(x405))) + x408, x409 := bits.add_u64(x372, x395, u64(fiat.u1(x407))) + x410, x411 := bits.add_u64(x374, x397, u64(fiat.u1(x409))) + x412, x413 := bits.add_u64(x376, x399, u64(fiat.u1(x411))) + _, x414 := bits.mul_u64(x400, 0x6ed46089e88fdc45) + x417, x416 := bits.mul_u64(x414, 0xffffffffffffffff) + x419, x418 := bits.mul_u64(x414, 0xffffffffffffffff) + x421, x420 := bits.mul_u64(x414, 0xffffffffffffffff) + x423, x422 := bits.mul_u64(x414, 0xc7634d81f4372ddf) + x425, x424 := bits.mul_u64(x414, 0x581a0db248b0a77a) + x427, x426 := bits.mul_u64(x414, 0xecec196accc52973) + x428, x429 := bits.add_u64(x427, x424, u64(0x0)) + x430, x431 := bits.add_u64(x425, x422, u64(fiat.u1(x429))) + x432, x433 := bits.add_u64(x423, x420, u64(fiat.u1(x431))) + x434, x435 := bits.add_u64(x421, x418, u64(fiat.u1(x433))) + x436, x437 := bits.add_u64(x419, x416, u64(fiat.u1(x435))) + x438 := (u64(fiat.u1(x437)) + x417) + _, x440 := bits.add_u64(x400, x426, u64(0x0)) + x441, x442 := bits.add_u64(x402, x428, u64(fiat.u1(x440))) + x443, x444 := bits.add_u64(x404, x430, u64(fiat.u1(x442))) + x445, x446 := bits.add_u64(x406, x432, u64(fiat.u1(x444))) + x447, x448 := bits.add_u64(x408, x434, u64(fiat.u1(x446))) + x449, x450 := bits.add_u64(x410, x436, u64(fiat.u1(x448))) + x451, x452 := bits.add_u64(x412, x438, u64(fiat.u1(x450))) + x453 := (u64(fiat.u1(x452)) + u64(fiat.u1(x413))) + x454, x455 := bits.sub_u64(x441, 0xecec196accc52973, u64(0x0)) + x456, x457 := bits.sub_u64(x443, 0x581a0db248b0a77a, u64(fiat.u1(x455))) + x458, x459 := bits.sub_u64(x445, 0xc7634d81f4372ddf, u64(fiat.u1(x457))) + x460, x461 := bits.sub_u64(x447, 0xffffffffffffffff, u64(fiat.u1(x459))) + x462, x463 := bits.sub_u64(x449, 0xffffffffffffffff, u64(fiat.u1(x461))) + x464, x465 := bits.sub_u64(x451, 0xffffffffffffffff, u64(fiat.u1(x463))) + _, x467 := bits.sub_u64(x453, u64(0x0), u64(fiat.u1(x465))) + x468 := fiat.cmovznz_u64(fiat.u1(x467), x454, x441) + x469 := fiat.cmovznz_u64(fiat.u1(x467), x456, x443) + x470 := fiat.cmovznz_u64(fiat.u1(x467), x458, x445) + x471 := fiat.cmovznz_u64(fiat.u1(x467), x460, x447) + x472 := fiat.cmovznz_u64(fiat.u1(x467), x462, x449) + x473 := fiat.cmovznz_u64(fiat.u1(x467), x464, x451) + out1[0] = x468 + out1[1] = x469 + out1[2] = x470 + out1[3] = x471 + out1[4] = x472 + out1[5] = x473 +} + +fe_square :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[4] + x5 := arg1[5] + x6 := arg1[0] + x8, x7 := bits.mul_u64(x6, arg1[5]) + x10, x9 := bits.mul_u64(x6, arg1[4]) + x12, x11 := bits.mul_u64(x6, arg1[3]) + x14, x13 := bits.mul_u64(x6, arg1[2]) + x16, x15 := bits.mul_u64(x6, arg1[1]) + x18, x17 := bits.mul_u64(x6, arg1[0]) + x19, x20 := bits.add_u64(x18, x15, u64(0x0)) + x21, x22 := bits.add_u64(x16, x13, u64(fiat.u1(x20))) + x23, x24 := bits.add_u64(x14, x11, u64(fiat.u1(x22))) + x25, x26 := bits.add_u64(x12, x9, u64(fiat.u1(x24))) + x27, x28 := bits.add_u64(x10, x7, u64(fiat.u1(x26))) + x29 := (u64(fiat.u1(x28)) + x8) + _, x30 := bits.mul_u64(x17, 0x6ed46089e88fdc45) + x33, x32 := bits.mul_u64(x30, 0xffffffffffffffff) + x35, x34 := bits.mul_u64(x30, 0xffffffffffffffff) + x37, x36 := bits.mul_u64(x30, 0xffffffffffffffff) + x39, x38 := bits.mul_u64(x30, 0xc7634d81f4372ddf) + x41, x40 := bits.mul_u64(x30, 0x581a0db248b0a77a) + x43, x42 := bits.mul_u64(x30, 0xecec196accc52973) + x44, x45 := bits.add_u64(x43, x40, u64(0x0)) + x46, x47 := bits.add_u64(x41, x38, u64(fiat.u1(x45))) + x48, x49 := bits.add_u64(x39, x36, u64(fiat.u1(x47))) + x50, x51 := bits.add_u64(x37, x34, u64(fiat.u1(x49))) + x52, x53 := bits.add_u64(x35, x32, u64(fiat.u1(x51))) + x54 := (u64(fiat.u1(x53)) + x33) + _, x56 := bits.add_u64(x17, x42, u64(0x0)) + x57, x58 := bits.add_u64(x19, x44, u64(fiat.u1(x56))) + x59, x60 := bits.add_u64(x21, x46, u64(fiat.u1(x58))) + x61, x62 := bits.add_u64(x23, x48, u64(fiat.u1(x60))) + x63, x64 := bits.add_u64(x25, x50, u64(fiat.u1(x62))) + x65, x66 := bits.add_u64(x27, x52, u64(fiat.u1(x64))) + x67, x68 := bits.add_u64(x29, x54, u64(fiat.u1(x66))) + x70, x69 := bits.mul_u64(x1, arg1[5]) + x72, x71 := bits.mul_u64(x1, arg1[4]) + x74, x73 := bits.mul_u64(x1, arg1[3]) + x76, x75 := bits.mul_u64(x1, arg1[2]) + x78, x77 := bits.mul_u64(x1, arg1[1]) + x80, x79 := bits.mul_u64(x1, arg1[0]) + x81, x82 := bits.add_u64(x80, x77, u64(0x0)) + x83, x84 := bits.add_u64(x78, x75, u64(fiat.u1(x82))) + x85, x86 := bits.add_u64(x76, x73, u64(fiat.u1(x84))) + x87, x88 := bits.add_u64(x74, x71, u64(fiat.u1(x86))) + x89, x90 := bits.add_u64(x72, x69, u64(fiat.u1(x88))) + x91 := (u64(fiat.u1(x90)) + x70) + x92, x93 := bits.add_u64(x57, x79, u64(0x0)) + x94, x95 := bits.add_u64(x59, x81, u64(fiat.u1(x93))) + x96, x97 := bits.add_u64(x61, x83, u64(fiat.u1(x95))) + x98, x99 := bits.add_u64(x63, x85, u64(fiat.u1(x97))) + x100, x101 := bits.add_u64(x65, x87, u64(fiat.u1(x99))) + x102, x103 := bits.add_u64(x67, x89, u64(fiat.u1(x101))) + x104, x105 := bits.add_u64(u64(fiat.u1(x68)), x91, u64(fiat.u1(x103))) + _, x106 := bits.mul_u64(x92, 0x6ed46089e88fdc45) + x109, x108 := bits.mul_u64(x106, 0xffffffffffffffff) + x111, x110 := bits.mul_u64(x106, 0xffffffffffffffff) + x113, x112 := bits.mul_u64(x106, 0xffffffffffffffff) + x115, x114 := bits.mul_u64(x106, 0xc7634d81f4372ddf) + x117, x116 := bits.mul_u64(x106, 0x581a0db248b0a77a) + x119, x118 := bits.mul_u64(x106, 0xecec196accc52973) + x120, x121 := bits.add_u64(x119, x116, u64(0x0)) + x122, x123 := bits.add_u64(x117, x114, u64(fiat.u1(x121))) + x124, x125 := bits.add_u64(x115, x112, u64(fiat.u1(x123))) + x126, x127 := bits.add_u64(x113, x110, u64(fiat.u1(x125))) + x128, x129 := bits.add_u64(x111, x108, u64(fiat.u1(x127))) + x130 := (u64(fiat.u1(x129)) + x109) + _, x132 := bits.add_u64(x92, x118, u64(0x0)) + x133, x134 := bits.add_u64(x94, x120, u64(fiat.u1(x132))) + x135, x136 := bits.add_u64(x96, x122, u64(fiat.u1(x134))) + x137, x138 := bits.add_u64(x98, x124, u64(fiat.u1(x136))) + x139, x140 := bits.add_u64(x100, x126, u64(fiat.u1(x138))) + x141, x142 := bits.add_u64(x102, x128, u64(fiat.u1(x140))) + x143, x144 := bits.add_u64(x104, x130, u64(fiat.u1(x142))) + x145 := (u64(fiat.u1(x144)) + u64(fiat.u1(x105))) + x147, x146 := bits.mul_u64(x2, arg1[5]) + x149, x148 := bits.mul_u64(x2, arg1[4]) + x151, x150 := bits.mul_u64(x2, arg1[3]) + x153, x152 := bits.mul_u64(x2, arg1[2]) + x155, x154 := bits.mul_u64(x2, arg1[1]) + x157, x156 := bits.mul_u64(x2, arg1[0]) + x158, x159 := bits.add_u64(x157, x154, u64(0x0)) + x160, x161 := bits.add_u64(x155, x152, u64(fiat.u1(x159))) + x162, x163 := bits.add_u64(x153, x150, u64(fiat.u1(x161))) + x164, x165 := bits.add_u64(x151, x148, u64(fiat.u1(x163))) + x166, x167 := bits.add_u64(x149, x146, u64(fiat.u1(x165))) + x168 := (u64(fiat.u1(x167)) + x147) + x169, x170 := bits.add_u64(x133, x156, u64(0x0)) + x171, x172 := bits.add_u64(x135, x158, u64(fiat.u1(x170))) + x173, x174 := bits.add_u64(x137, x160, u64(fiat.u1(x172))) + x175, x176 := bits.add_u64(x139, x162, u64(fiat.u1(x174))) + x177, x178 := bits.add_u64(x141, x164, u64(fiat.u1(x176))) + x179, x180 := bits.add_u64(x143, x166, u64(fiat.u1(x178))) + x181, x182 := bits.add_u64(x145, x168, u64(fiat.u1(x180))) + _, x183 := bits.mul_u64(x169, 0x6ed46089e88fdc45) + x186, x185 := bits.mul_u64(x183, 0xffffffffffffffff) + x188, x187 := bits.mul_u64(x183, 0xffffffffffffffff) + x190, x189 := bits.mul_u64(x183, 0xffffffffffffffff) + x192, x191 := bits.mul_u64(x183, 0xc7634d81f4372ddf) + x194, x193 := bits.mul_u64(x183, 0x581a0db248b0a77a) + x196, x195 := bits.mul_u64(x183, 0xecec196accc52973) + x197, x198 := bits.add_u64(x196, x193, u64(0x0)) + x199, x200 := bits.add_u64(x194, x191, u64(fiat.u1(x198))) + x201, x202 := bits.add_u64(x192, x189, u64(fiat.u1(x200))) + x203, x204 := bits.add_u64(x190, x187, u64(fiat.u1(x202))) + x205, x206 := bits.add_u64(x188, x185, u64(fiat.u1(x204))) + x207 := (u64(fiat.u1(x206)) + x186) + _, x209 := bits.add_u64(x169, x195, u64(0x0)) + x210, x211 := bits.add_u64(x171, x197, u64(fiat.u1(x209))) + x212, x213 := bits.add_u64(x173, x199, u64(fiat.u1(x211))) + x214, x215 := bits.add_u64(x175, x201, u64(fiat.u1(x213))) + x216, x217 := bits.add_u64(x177, x203, u64(fiat.u1(x215))) + x218, x219 := bits.add_u64(x179, x205, u64(fiat.u1(x217))) + x220, x221 := bits.add_u64(x181, x207, u64(fiat.u1(x219))) + x222 := (u64(fiat.u1(x221)) + u64(fiat.u1(x182))) + x224, x223 := bits.mul_u64(x3, arg1[5]) + x226, x225 := bits.mul_u64(x3, arg1[4]) + x228, x227 := bits.mul_u64(x3, arg1[3]) + x230, x229 := bits.mul_u64(x3, arg1[2]) + x232, x231 := bits.mul_u64(x3, arg1[1]) + x234, x233 := bits.mul_u64(x3, arg1[0]) + x235, x236 := bits.add_u64(x234, x231, u64(0x0)) + x237, x238 := bits.add_u64(x232, x229, u64(fiat.u1(x236))) + x239, x240 := bits.add_u64(x230, x227, u64(fiat.u1(x238))) + x241, x242 := bits.add_u64(x228, x225, u64(fiat.u1(x240))) + x243, x244 := bits.add_u64(x226, x223, u64(fiat.u1(x242))) + x245 := (u64(fiat.u1(x244)) + x224) + x246, x247 := bits.add_u64(x210, x233, u64(0x0)) + x248, x249 := bits.add_u64(x212, x235, u64(fiat.u1(x247))) + x250, x251 := bits.add_u64(x214, x237, u64(fiat.u1(x249))) + x252, x253 := bits.add_u64(x216, x239, u64(fiat.u1(x251))) + x254, x255 := bits.add_u64(x218, x241, u64(fiat.u1(x253))) + x256, x257 := bits.add_u64(x220, x243, u64(fiat.u1(x255))) + x258, x259 := bits.add_u64(x222, x245, u64(fiat.u1(x257))) + _, x260 := bits.mul_u64(x246, 0x6ed46089e88fdc45) + x263, x262 := bits.mul_u64(x260, 0xffffffffffffffff) + x265, x264 := bits.mul_u64(x260, 0xffffffffffffffff) + x267, x266 := bits.mul_u64(x260, 0xffffffffffffffff) + x269, x268 := bits.mul_u64(x260, 0xc7634d81f4372ddf) + x271, x270 := bits.mul_u64(x260, 0x581a0db248b0a77a) + x273, x272 := bits.mul_u64(x260, 0xecec196accc52973) + x274, x275 := bits.add_u64(x273, x270, u64(0x0)) + x276, x277 := bits.add_u64(x271, x268, u64(fiat.u1(x275))) + x278, x279 := bits.add_u64(x269, x266, u64(fiat.u1(x277))) + x280, x281 := bits.add_u64(x267, x264, u64(fiat.u1(x279))) + x282, x283 := bits.add_u64(x265, x262, u64(fiat.u1(x281))) + x284 := (u64(fiat.u1(x283)) + x263) + _, x286 := bits.add_u64(x246, x272, u64(0x0)) + x287, x288 := bits.add_u64(x248, x274, u64(fiat.u1(x286))) + x289, x290 := bits.add_u64(x250, x276, u64(fiat.u1(x288))) + x291, x292 := bits.add_u64(x252, x278, u64(fiat.u1(x290))) + x293, x294 := bits.add_u64(x254, x280, u64(fiat.u1(x292))) + x295, x296 := bits.add_u64(x256, x282, u64(fiat.u1(x294))) + x297, x298 := bits.add_u64(x258, x284, u64(fiat.u1(x296))) + x299 := (u64(fiat.u1(x298)) + u64(fiat.u1(x259))) + x301, x300 := bits.mul_u64(x4, arg1[5]) + x303, x302 := bits.mul_u64(x4, arg1[4]) + x305, x304 := bits.mul_u64(x4, arg1[3]) + x307, x306 := bits.mul_u64(x4, arg1[2]) + x309, x308 := bits.mul_u64(x4, arg1[1]) + x311, x310 := bits.mul_u64(x4, arg1[0]) + x312, x313 := bits.add_u64(x311, x308, u64(0x0)) + x314, x315 := bits.add_u64(x309, x306, u64(fiat.u1(x313))) + x316, x317 := bits.add_u64(x307, x304, u64(fiat.u1(x315))) + x318, x319 := bits.add_u64(x305, x302, u64(fiat.u1(x317))) + x320, x321 := bits.add_u64(x303, x300, u64(fiat.u1(x319))) + x322 := (u64(fiat.u1(x321)) + x301) + x323, x324 := bits.add_u64(x287, x310, u64(0x0)) + x325, x326 := bits.add_u64(x289, x312, u64(fiat.u1(x324))) + x327, x328 := bits.add_u64(x291, x314, u64(fiat.u1(x326))) + x329, x330 := bits.add_u64(x293, x316, u64(fiat.u1(x328))) + x331, x332 := bits.add_u64(x295, x318, u64(fiat.u1(x330))) + x333, x334 := bits.add_u64(x297, x320, u64(fiat.u1(x332))) + x335, x336 := bits.add_u64(x299, x322, u64(fiat.u1(x334))) + _, x337 := bits.mul_u64(x323, 0x6ed46089e88fdc45) + x340, x339 := bits.mul_u64(x337, 0xffffffffffffffff) + x342, x341 := bits.mul_u64(x337, 0xffffffffffffffff) + x344, x343 := bits.mul_u64(x337, 0xffffffffffffffff) + x346, x345 := bits.mul_u64(x337, 0xc7634d81f4372ddf) + x348, x347 := bits.mul_u64(x337, 0x581a0db248b0a77a) + x350, x349 := bits.mul_u64(x337, 0xecec196accc52973) + x351, x352 := bits.add_u64(x350, x347, u64(0x0)) + x353, x354 := bits.add_u64(x348, x345, u64(fiat.u1(x352))) + x355, x356 := bits.add_u64(x346, x343, u64(fiat.u1(x354))) + x357, x358 := bits.add_u64(x344, x341, u64(fiat.u1(x356))) + x359, x360 := bits.add_u64(x342, x339, u64(fiat.u1(x358))) + x361 := (u64(fiat.u1(x360)) + x340) + _, x363 := bits.add_u64(x323, x349, u64(0x0)) + x364, x365 := bits.add_u64(x325, x351, u64(fiat.u1(x363))) + x366, x367 := bits.add_u64(x327, x353, u64(fiat.u1(x365))) + x368, x369 := bits.add_u64(x329, x355, u64(fiat.u1(x367))) + x370, x371 := bits.add_u64(x331, x357, u64(fiat.u1(x369))) + x372, x373 := bits.add_u64(x333, x359, u64(fiat.u1(x371))) + x374, x375 := bits.add_u64(x335, x361, u64(fiat.u1(x373))) + x376 := (u64(fiat.u1(x375)) + u64(fiat.u1(x336))) + x378, x377 := bits.mul_u64(x5, arg1[5]) + x380, x379 := bits.mul_u64(x5, arg1[4]) + x382, x381 := bits.mul_u64(x5, arg1[3]) + x384, x383 := bits.mul_u64(x5, arg1[2]) + x386, x385 := bits.mul_u64(x5, arg1[1]) + x388, x387 := bits.mul_u64(x5, arg1[0]) + x389, x390 := bits.add_u64(x388, x385, u64(0x0)) + x391, x392 := bits.add_u64(x386, x383, u64(fiat.u1(x390))) + x393, x394 := bits.add_u64(x384, x381, u64(fiat.u1(x392))) + x395, x396 := bits.add_u64(x382, x379, u64(fiat.u1(x394))) + x397, x398 := bits.add_u64(x380, x377, u64(fiat.u1(x396))) + x399 := (u64(fiat.u1(x398)) + x378) + x400, x401 := bits.add_u64(x364, x387, u64(0x0)) + x402, x403 := bits.add_u64(x366, x389, u64(fiat.u1(x401))) + x404, x405 := bits.add_u64(x368, x391, u64(fiat.u1(x403))) + x406, x407 := bits.add_u64(x370, x393, u64(fiat.u1(x405))) + x408, x409 := bits.add_u64(x372, x395, u64(fiat.u1(x407))) + x410, x411 := bits.add_u64(x374, x397, u64(fiat.u1(x409))) + x412, x413 := bits.add_u64(x376, x399, u64(fiat.u1(x411))) + _, x414 := bits.mul_u64(x400, 0x6ed46089e88fdc45) + x417, x416 := bits.mul_u64(x414, 0xffffffffffffffff) + x419, x418 := bits.mul_u64(x414, 0xffffffffffffffff) + x421, x420 := bits.mul_u64(x414, 0xffffffffffffffff) + x423, x422 := bits.mul_u64(x414, 0xc7634d81f4372ddf) + x425, x424 := bits.mul_u64(x414, 0x581a0db248b0a77a) + x427, x426 := bits.mul_u64(x414, 0xecec196accc52973) + x428, x429 := bits.add_u64(x427, x424, u64(0x0)) + x430, x431 := bits.add_u64(x425, x422, u64(fiat.u1(x429))) + x432, x433 := bits.add_u64(x423, x420, u64(fiat.u1(x431))) + x434, x435 := bits.add_u64(x421, x418, u64(fiat.u1(x433))) + x436, x437 := bits.add_u64(x419, x416, u64(fiat.u1(x435))) + x438 := (u64(fiat.u1(x437)) + x417) + _, x440 := bits.add_u64(x400, x426, u64(0x0)) + x441, x442 := bits.add_u64(x402, x428, u64(fiat.u1(x440))) + x443, x444 := bits.add_u64(x404, x430, u64(fiat.u1(x442))) + x445, x446 := bits.add_u64(x406, x432, u64(fiat.u1(x444))) + x447, x448 := bits.add_u64(x408, x434, u64(fiat.u1(x446))) + x449, x450 := bits.add_u64(x410, x436, u64(fiat.u1(x448))) + x451, x452 := bits.add_u64(x412, x438, u64(fiat.u1(x450))) + x453 := (u64(fiat.u1(x452)) + u64(fiat.u1(x413))) + x454, x455 := bits.sub_u64(x441, 0xecec196accc52973, u64(0x0)) + x456, x457 := bits.sub_u64(x443, 0x581a0db248b0a77a, u64(fiat.u1(x455))) + x458, x459 := bits.sub_u64(x445, 0xc7634d81f4372ddf, u64(fiat.u1(x457))) + x460, x461 := bits.sub_u64(x447, 0xffffffffffffffff, u64(fiat.u1(x459))) + x462, x463 := bits.sub_u64(x449, 0xffffffffffffffff, u64(fiat.u1(x461))) + x464, x465 := bits.sub_u64(x451, 0xffffffffffffffff, u64(fiat.u1(x463))) + _, x467 := bits.sub_u64(x453, u64(0x0), u64(fiat.u1(x465))) + x468 := fiat.cmovznz_u64(fiat.u1(x467), x454, x441) + x469 := fiat.cmovznz_u64(fiat.u1(x467), x456, x443) + x470 := fiat.cmovznz_u64(fiat.u1(x467), x458, x445) + x471 := fiat.cmovznz_u64(fiat.u1(x467), x460, x447) + x472 := fiat.cmovznz_u64(fiat.u1(x467), x462, x449) + x473 := fiat.cmovznz_u64(fiat.u1(x467), x464, x451) + out1[0] = x468 + out1[1] = x469 + out1[2] = x470 + out1[3] = x471 + out1[4] = x472 + out1[5] = x473 +} + +fe_add :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.add_u64(arg1[0], arg2[0], u64(0x0)) + x3, x4 := bits.add_u64(arg1[1], arg2[1], u64(fiat.u1(x2))) + x5, x6 := bits.add_u64(arg1[2], arg2[2], u64(fiat.u1(x4))) + x7, x8 := bits.add_u64(arg1[3], arg2[3], u64(fiat.u1(x6))) + x9, x10 := bits.add_u64(arg1[4], arg2[4], u64(fiat.u1(x8))) + x11, x12 := bits.add_u64(arg1[5], arg2[5], u64(fiat.u1(x10))) + x13, x14 := bits.sub_u64(x1, 0xecec196accc52973, u64(0x0)) + x15, x16 := bits.sub_u64(x3, 0x581a0db248b0a77a, u64(fiat.u1(x14))) + x17, x18 := bits.sub_u64(x5, 0xc7634d81f4372ddf, u64(fiat.u1(x16))) + x19, x20 := bits.sub_u64(x7, 0xffffffffffffffff, u64(fiat.u1(x18))) + x21, x22 := bits.sub_u64(x9, 0xffffffffffffffff, u64(fiat.u1(x20))) + x23, x24 := bits.sub_u64(x11, 0xffffffffffffffff, u64(fiat.u1(x22))) + _, x26 := bits.sub_u64(u64(fiat.u1(x12)), u64(0x0), u64(fiat.u1(x24))) + x27 := fiat.cmovznz_u64(fiat.u1(x26), x13, x1) + x28 := fiat.cmovznz_u64(fiat.u1(x26), x15, x3) + x29 := fiat.cmovznz_u64(fiat.u1(x26), x17, x5) + x30 := fiat.cmovznz_u64(fiat.u1(x26), x19, x7) + x31 := fiat.cmovznz_u64(fiat.u1(x26), x21, x9) + x32 := fiat.cmovznz_u64(fiat.u1(x26), x23, x11) + out1[0] = x27 + out1[1] = x28 + out1[2] = x29 + out1[3] = x30 + out1[4] = x31 + out1[5] = x32 +} + +fe_sub :: proc "contextless" (out1, arg1, arg2: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.sub_u64(arg1[0], arg2[0], u64(0x0)) + x3, x4 := bits.sub_u64(arg1[1], arg2[1], u64(fiat.u1(x2))) + x5, x6 := bits.sub_u64(arg1[2], arg2[2], u64(fiat.u1(x4))) + x7, x8 := bits.sub_u64(arg1[3], arg2[3], u64(fiat.u1(x6))) + x9, x10 := bits.sub_u64(arg1[4], arg2[4], u64(fiat.u1(x8))) + x11, x12 := bits.sub_u64(arg1[5], arg2[5], u64(fiat.u1(x10))) + x13 := fiat.cmovznz_u64(fiat.u1(x12), u64(0x0), 0xffffffffffffffff) + x14, x15 := bits.add_u64(x1, (x13 & 0xecec196accc52973), u64(0x0)) + x16, x17 := bits.add_u64(x3, (x13 & 0x581a0db248b0a77a), u64(fiat.u1(x15))) + x18, x19 := bits.add_u64(x5, (x13 & 0xc7634d81f4372ddf), u64(fiat.u1(x17))) + x20, x21 := bits.add_u64(x7, x13, u64(fiat.u1(x19))) + x22, x23 := bits.add_u64(x9, x13, u64(fiat.u1(x21))) + x24, _ := bits.add_u64(x11, x13, u64(fiat.u1(x23))) + out1[0] = x14 + out1[1] = x16 + out1[2] = x18 + out1[3] = x20 + out1[4] = x22 + out1[5] = x24 +} + +fe_opp :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + x1, x2 := bits.sub_u64(u64(0x0), arg1[0], u64(0x0)) + x3, x4 := bits.sub_u64(u64(0x0), arg1[1], u64(fiat.u1(x2))) + x5, x6 := bits.sub_u64(u64(0x0), arg1[2], u64(fiat.u1(x4))) + x7, x8 := bits.sub_u64(u64(0x0), arg1[3], u64(fiat.u1(x6))) + x9, x10 := bits.sub_u64(u64(0x0), arg1[4], u64(fiat.u1(x8))) + x11, x12 := bits.sub_u64(u64(0x0), arg1[5], u64(fiat.u1(x10))) + x13 := fiat.cmovznz_u64(fiat.u1(x12), u64(0x0), 0xffffffffffffffff) + x14, x15 := bits.add_u64(x1, (x13 & 0xecec196accc52973), u64(0x0)) + x16, x17 := bits.add_u64(x3, (x13 & 0x581a0db248b0a77a), u64(fiat.u1(x15))) + x18, x19 := bits.add_u64(x5, (x13 & 0xc7634d81f4372ddf), u64(fiat.u1(x17))) + x20, x21 := bits.add_u64(x7, x13, u64(fiat.u1(x19))) + x22, x23 := bits.add_u64(x9, x13, u64(fiat.u1(x21))) + x24, _ := bits.add_u64(x11, x13, u64(fiat.u1(x23))) + out1[0] = x14 + out1[1] = x16 + out1[2] = x18 + out1[3] = x20 + out1[4] = x22 + out1[5] = x24 +} + +fe_one :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element) { + out1[0] = 0x1313e695333ad68d + out1[1] = 0xa7e5f24db74f5885 + out1[2] = 0x389cb27e0bc8d220 + out1[3] = 0x0 + out1[4] = 0x0 + out1[5] = 0x0 +} + +fe_non_zero :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> u64 { + return (arg1[0] | (arg1[1] | (arg1[2] | (arg1[3] | (arg1[4] | arg1[5]))))) +} + +@(optimization_mode = "none") +fe_cond_assign :: #force_no_inline proc "contextless" ( + out1, arg1: ^Montgomery_Domain_Field_Element, + arg2: int, +) { + x1 := fiat.cmovznz_u64(fiat.u1(arg2), out1[0], arg1[0]) + x2 := fiat.cmovznz_u64(fiat.u1(arg2), out1[1], arg1[1]) + x3 := fiat.cmovznz_u64(fiat.u1(arg2), out1[2], arg1[2]) + x4 := fiat.cmovznz_u64(fiat.u1(arg2), out1[3], arg1[3]) + x5 := fiat.cmovznz_u64(fiat.u1(arg2), out1[4], arg1[4]) + x6 := fiat.cmovznz_u64(fiat.u1(arg2), out1[5], arg1[5]) + out1[0] = x1 + out1[1] = x2 + out1[2] = x3 + out1[3] = x4 + out1[4] = x5 + out1[5] = x6 +} + +fe_from_montgomery :: proc "contextless" ( + out1: ^Non_Montgomery_Domain_Field_Element, + arg1: ^Montgomery_Domain_Field_Element, +) { + x1 := arg1[0] + _, x2 := bits.mul_u64(x1, 0x6ed46089e88fdc45) + x5, x4 := bits.mul_u64(x2, 0xffffffffffffffff) + x7, x6 := bits.mul_u64(x2, 0xffffffffffffffff) + x9, x8 := bits.mul_u64(x2, 0xffffffffffffffff) + x11, x10 := bits.mul_u64(x2, 0xc7634d81f4372ddf) + x13, x12 := bits.mul_u64(x2, 0x581a0db248b0a77a) + x15, x14 := bits.mul_u64(x2, 0xecec196accc52973) + x16, x17 := bits.add_u64(x15, x12, u64(0x0)) + x18, x19 := bits.add_u64(x13, x10, u64(fiat.u1(x17))) + x20, x21 := bits.add_u64(x11, x8, u64(fiat.u1(x19))) + x22, x23 := bits.add_u64(x9, x6, u64(fiat.u1(x21))) + x24, x25 := bits.add_u64(x7, x4, u64(fiat.u1(x23))) + _, x27 := bits.add_u64(x1, x14, u64(0x0)) + x28, x29 := bits.add_u64(u64(0x0), x16, u64(fiat.u1(x27))) + x30, x31 := bits.add_u64(u64(0x0), x18, u64(fiat.u1(x29))) + x32, x33 := bits.add_u64(u64(0x0), x20, u64(fiat.u1(x31))) + x34, x35 := bits.add_u64(u64(0x0), x22, u64(fiat.u1(x33))) + x36, x37 := bits.add_u64(u64(0x0), x24, u64(fiat.u1(x35))) + x38, x39 := bits.add_u64(u64(0x0), (u64(fiat.u1(x25)) + x5), u64(fiat.u1(x37))) + x40, x41 := bits.add_u64(x28, arg1[1], u64(0x0)) + x42, x43 := bits.add_u64(x30, u64(0x0), u64(fiat.u1(x41))) + x44, x45 := bits.add_u64(x32, u64(0x0), u64(fiat.u1(x43))) + x46, x47 := bits.add_u64(x34, u64(0x0), u64(fiat.u1(x45))) + x48, x49 := bits.add_u64(x36, u64(0x0), u64(fiat.u1(x47))) + x50, x51 := bits.add_u64(x38, u64(0x0), u64(fiat.u1(x49))) + _, x52 := bits.mul_u64(x40, 0x6ed46089e88fdc45) + x55, x54 := bits.mul_u64(x52, 0xffffffffffffffff) + x57, x56 := bits.mul_u64(x52, 0xffffffffffffffff) + x59, x58 := bits.mul_u64(x52, 0xffffffffffffffff) + x61, x60 := bits.mul_u64(x52, 0xc7634d81f4372ddf) + x63, x62 := bits.mul_u64(x52, 0x581a0db248b0a77a) + x65, x64 := bits.mul_u64(x52, 0xecec196accc52973) + x66, x67 := bits.add_u64(x65, x62, u64(0x0)) + x68, x69 := bits.add_u64(x63, x60, u64(fiat.u1(x67))) + x70, x71 := bits.add_u64(x61, x58, u64(fiat.u1(x69))) + x72, x73 := bits.add_u64(x59, x56, u64(fiat.u1(x71))) + x74, x75 := bits.add_u64(x57, x54, u64(fiat.u1(x73))) + _, x77 := bits.add_u64(x40, x64, u64(0x0)) + x78, x79 := bits.add_u64(x42, x66, u64(fiat.u1(x77))) + x80, x81 := bits.add_u64(x44, x68, u64(fiat.u1(x79))) + x82, x83 := bits.add_u64(x46, x70, u64(fiat.u1(x81))) + x84, x85 := bits.add_u64(x48, x72, u64(fiat.u1(x83))) + x86, x87 := bits.add_u64(x50, x74, u64(fiat.u1(x85))) + x88, x89 := bits.add_u64((u64(fiat.u1(x51)) + u64(fiat.u1(x39))), (u64(fiat.u1(x75)) + x55), u64(fiat.u1(x87))) + x90, x91 := bits.add_u64(x78, arg1[2], u64(0x0)) + x92, x93 := bits.add_u64(x80, u64(0x0), u64(fiat.u1(x91))) + x94, x95 := bits.add_u64(x82, u64(0x0), u64(fiat.u1(x93))) + x96, x97 := bits.add_u64(x84, u64(0x0), u64(fiat.u1(x95))) + x98, x99 := bits.add_u64(x86, u64(0x0), u64(fiat.u1(x97))) + x100, x101 := bits.add_u64(x88, u64(0x0), u64(fiat.u1(x99))) + _, x102 := bits.mul_u64(x90, 0x6ed46089e88fdc45) + x105, x104 := bits.mul_u64(x102, 0xffffffffffffffff) + x107, x106 := bits.mul_u64(x102, 0xffffffffffffffff) + x109, x108 := bits.mul_u64(x102, 0xffffffffffffffff) + x111, x110 := bits.mul_u64(x102, 0xc7634d81f4372ddf) + x113, x112 := bits.mul_u64(x102, 0x581a0db248b0a77a) + x115, x114 := bits.mul_u64(x102, 0xecec196accc52973) + x116, x117 := bits.add_u64(x115, x112, u64(0x0)) + x118, x119 := bits.add_u64(x113, x110, u64(fiat.u1(x117))) + x120, x121 := bits.add_u64(x111, x108, u64(fiat.u1(x119))) + x122, x123 := bits.add_u64(x109, x106, u64(fiat.u1(x121))) + x124, x125 := bits.add_u64(x107, x104, u64(fiat.u1(x123))) + _, x127 := bits.add_u64(x90, x114, u64(0x0)) + x128, x129 := bits.add_u64(x92, x116, u64(fiat.u1(x127))) + x130, x131 := bits.add_u64(x94, x118, u64(fiat.u1(x129))) + x132, x133 := bits.add_u64(x96, x120, u64(fiat.u1(x131))) + x134, x135 := bits.add_u64(x98, x122, u64(fiat.u1(x133))) + x136, x137 := bits.add_u64(x100, x124, u64(fiat.u1(x135))) + x138, x139 := bits.add_u64((u64(fiat.u1(x101)) + u64(fiat.u1(x89))), (u64(fiat.u1(x125)) + x105), u64(fiat.u1(x137))) + x140, x141 := bits.add_u64(x128, arg1[3], u64(0x0)) + x142, x143 := bits.add_u64(x130, u64(0x0), u64(fiat.u1(x141))) + x144, x145 := bits.add_u64(x132, u64(0x0), u64(fiat.u1(x143))) + x146, x147 := bits.add_u64(x134, u64(0x0), u64(fiat.u1(x145))) + x148, x149 := bits.add_u64(x136, u64(0x0), u64(fiat.u1(x147))) + x150, x151 := bits.add_u64(x138, u64(0x0), u64(fiat.u1(x149))) + _, x152 := bits.mul_u64(x140, 0x6ed46089e88fdc45) + x155, x154 := bits.mul_u64(x152, 0xffffffffffffffff) + x157, x156 := bits.mul_u64(x152, 0xffffffffffffffff) + x159, x158 := bits.mul_u64(x152, 0xffffffffffffffff) + x161, x160 := bits.mul_u64(x152, 0xc7634d81f4372ddf) + x163, x162 := bits.mul_u64(x152, 0x581a0db248b0a77a) + x165, x164 := bits.mul_u64(x152, 0xecec196accc52973) + x166, x167 := bits.add_u64(x165, x162, u64(0x0)) + x168, x169 := bits.add_u64(x163, x160, u64(fiat.u1(x167))) + x170, x171 := bits.add_u64(x161, x158, u64(fiat.u1(x169))) + x172, x173 := bits.add_u64(x159, x156, u64(fiat.u1(x171))) + x174, x175 := bits.add_u64(x157, x154, u64(fiat.u1(x173))) + _, x177 := bits.add_u64(x140, x164, u64(0x0)) + x178, x179 := bits.add_u64(x142, x166, u64(fiat.u1(x177))) + x180, x181 := bits.add_u64(x144, x168, u64(fiat.u1(x179))) + x182, x183 := bits.add_u64(x146, x170, u64(fiat.u1(x181))) + x184, x185 := bits.add_u64(x148, x172, u64(fiat.u1(x183))) + x186, x187 := bits.add_u64(x150, x174, u64(fiat.u1(x185))) + x188, x189 := bits.add_u64((u64(fiat.u1(x151)) + u64(fiat.u1(x139))), (u64(fiat.u1(x175)) + x155), u64(fiat.u1(x187))) + x190, x191 := bits.add_u64(x178, arg1[4], u64(0x0)) + x192, x193 := bits.add_u64(x180, u64(0x0), u64(fiat.u1(x191))) + x194, x195 := bits.add_u64(x182, u64(0x0), u64(fiat.u1(x193))) + x196, x197 := bits.add_u64(x184, u64(0x0), u64(fiat.u1(x195))) + x198, x199 := bits.add_u64(x186, u64(0x0), u64(fiat.u1(x197))) + x200, x201 := bits.add_u64(x188, u64(0x0), u64(fiat.u1(x199))) + _, x202 := bits.mul_u64(x190, 0x6ed46089e88fdc45) + x205, x204 := bits.mul_u64(x202, 0xffffffffffffffff) + x207, x206 := bits.mul_u64(x202, 0xffffffffffffffff) + x209, x208 := bits.mul_u64(x202, 0xffffffffffffffff) + x211, x210 := bits.mul_u64(x202, 0xc7634d81f4372ddf) + x213, x212 := bits.mul_u64(x202, 0x581a0db248b0a77a) + x215, x214 := bits.mul_u64(x202, 0xecec196accc52973) + x216, x217 := bits.add_u64(x215, x212, u64(0x0)) + x218, x219 := bits.add_u64(x213, x210, u64(fiat.u1(x217))) + x220, x221 := bits.add_u64(x211, x208, u64(fiat.u1(x219))) + x222, x223 := bits.add_u64(x209, x206, u64(fiat.u1(x221))) + x224, x225 := bits.add_u64(x207, x204, u64(fiat.u1(x223))) + _, x227 := bits.add_u64(x190, x214, u64(0x0)) + x228, x229 := bits.add_u64(x192, x216, u64(fiat.u1(x227))) + x230, x231 := bits.add_u64(x194, x218, u64(fiat.u1(x229))) + x232, x233 := bits.add_u64(x196, x220, u64(fiat.u1(x231))) + x234, x235 := bits.add_u64(x198, x222, u64(fiat.u1(x233))) + x236, x237 := bits.add_u64(x200, x224, u64(fiat.u1(x235))) + x238, x239 := bits.add_u64((u64(fiat.u1(x201)) + u64(fiat.u1(x189))), (u64(fiat.u1(x225)) + x205), u64(fiat.u1(x237))) + x240, x241 := bits.add_u64(x228, arg1[5], u64(0x0)) + x242, x243 := bits.add_u64(x230, u64(0x0), u64(fiat.u1(x241))) + x244, x245 := bits.add_u64(x232, u64(0x0), u64(fiat.u1(x243))) + x246, x247 := bits.add_u64(x234, u64(0x0), u64(fiat.u1(x245))) + x248, x249 := bits.add_u64(x236, u64(0x0), u64(fiat.u1(x247))) + x250, x251 := bits.add_u64(x238, u64(0x0), u64(fiat.u1(x249))) + _, x252 := bits.mul_u64(x240, 0x6ed46089e88fdc45) + x255, x254 := bits.mul_u64(x252, 0xffffffffffffffff) + x257, x256 := bits.mul_u64(x252, 0xffffffffffffffff) + x259, x258 := bits.mul_u64(x252, 0xffffffffffffffff) + x261, x260 := bits.mul_u64(x252, 0xc7634d81f4372ddf) + x263, x262 := bits.mul_u64(x252, 0x581a0db248b0a77a) + x265, x264 := bits.mul_u64(x252, 0xecec196accc52973) + x266, x267 := bits.add_u64(x265, x262, u64(0x0)) + x268, x269 := bits.add_u64(x263, x260, u64(fiat.u1(x267))) + x270, x271 := bits.add_u64(x261, x258, u64(fiat.u1(x269))) + x272, x273 := bits.add_u64(x259, x256, u64(fiat.u1(x271))) + x274, x275 := bits.add_u64(x257, x254, u64(fiat.u1(x273))) + _, x277 := bits.add_u64(x240, x264, u64(0x0)) + x278, x279 := bits.add_u64(x242, x266, u64(fiat.u1(x277))) + x280, x281 := bits.add_u64(x244, x268, u64(fiat.u1(x279))) + x282, x283 := bits.add_u64(x246, x270, u64(fiat.u1(x281))) + x284, x285 := bits.add_u64(x248, x272, u64(fiat.u1(x283))) + x286, x287 := bits.add_u64(x250, x274, u64(fiat.u1(x285))) + x288, x289 := bits.add_u64((u64(fiat.u1(x251)) + u64(fiat.u1(x239))), (u64(fiat.u1(x275)) + x255), u64(fiat.u1(x287))) + x290, x291 := bits.sub_u64(x278, 0xecec196accc52973, u64(0x0)) + x292, x293 := bits.sub_u64(x280, 0x581a0db248b0a77a, u64(fiat.u1(x291))) + x294, x295 := bits.sub_u64(x282, 0xc7634d81f4372ddf, u64(fiat.u1(x293))) + x296, x297 := bits.sub_u64(x284, 0xffffffffffffffff, u64(fiat.u1(x295))) + x298, x299 := bits.sub_u64(x286, 0xffffffffffffffff, u64(fiat.u1(x297))) + x300, x301 := bits.sub_u64(x288, 0xffffffffffffffff, u64(fiat.u1(x299))) + _, x303 := bits.sub_u64(u64(fiat.u1(x289)), u64(0x0), u64(fiat.u1(x301))) + x304 := fiat.cmovznz_u64(fiat.u1(x303), x290, x278) + x305 := fiat.cmovznz_u64(fiat.u1(x303), x292, x280) + x306 := fiat.cmovznz_u64(fiat.u1(x303), x294, x282) + x307 := fiat.cmovznz_u64(fiat.u1(x303), x296, x284) + x308 := fiat.cmovznz_u64(fiat.u1(x303), x298, x286) + x309 := fiat.cmovznz_u64(fiat.u1(x303), x300, x288) + out1[0] = x304 + out1[1] = x305 + out1[2] = x306 + out1[3] = x307 + out1[4] = x308 + out1[5] = x309 +} + +fe_to_montgomery :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: ^Non_Montgomery_Domain_Field_Element, +) { + x1 := arg1[1] + x2 := arg1[2] + x3 := arg1[3] + x4 := arg1[4] + x5 := arg1[5] + x6 := arg1[0] + x8, x7 := bits.mul_u64(x6, 0xc84ee012b39bf21) + x10, x9 := bits.mul_u64(x6, 0x3fb05b7a28266895) + x12, x11 := bits.mul_u64(x6, 0xd40d49174aab1cc5) + x14, x13 := bits.mul_u64(x6, 0xbc3e483afcb82947) + x16, x15 := bits.mul_u64(x6, 0xff3d81e5df1aa419) + x18, x17 := bits.mul_u64(x6, 0x2d319b2419b409a9) + x19, x20 := bits.add_u64(x18, x15, u64(0x0)) + x21, x22 := bits.add_u64(x16, x13, u64(fiat.u1(x20))) + x23, x24 := bits.add_u64(x14, x11, u64(fiat.u1(x22))) + x25, x26 := bits.add_u64(x12, x9, u64(fiat.u1(x24))) + x27, x28 := bits.add_u64(x10, x7, u64(fiat.u1(x26))) + _, x29 := bits.mul_u64(x17, 0x6ed46089e88fdc45) + x32, x31 := bits.mul_u64(x29, 0xffffffffffffffff) + x34, x33 := bits.mul_u64(x29, 0xffffffffffffffff) + x36, x35 := bits.mul_u64(x29, 0xffffffffffffffff) + x38, x37 := bits.mul_u64(x29, 0xc7634d81f4372ddf) + x40, x39 := bits.mul_u64(x29, 0x581a0db248b0a77a) + x42, x41 := bits.mul_u64(x29, 0xecec196accc52973) + x43, x44 := bits.add_u64(x42, x39, u64(0x0)) + x45, x46 := bits.add_u64(x40, x37, u64(fiat.u1(x44))) + x47, x48 := bits.add_u64(x38, x35, u64(fiat.u1(x46))) + x49, x50 := bits.add_u64(x36, x33, u64(fiat.u1(x48))) + x51, x52 := bits.add_u64(x34, x31, u64(fiat.u1(x50))) + _, x54 := bits.add_u64(x17, x41, u64(0x0)) + x55, x56 := bits.add_u64(x19, x43, u64(fiat.u1(x54))) + x57, x58 := bits.add_u64(x21, x45, u64(fiat.u1(x56))) + x59, x60 := bits.add_u64(x23, x47, u64(fiat.u1(x58))) + x61, x62 := bits.add_u64(x25, x49, u64(fiat.u1(x60))) + x63, x64 := bits.add_u64(x27, x51, u64(fiat.u1(x62))) + x65, x66 := bits.add_u64((u64(fiat.u1(x28)) + x8), (u64(fiat.u1(x52)) + x32), u64(fiat.u1(x64))) + x68, x67 := bits.mul_u64(x1, 0xc84ee012b39bf21) + x70, x69 := bits.mul_u64(x1, 0x3fb05b7a28266895) + x72, x71 := bits.mul_u64(x1, 0xd40d49174aab1cc5) + x74, x73 := bits.mul_u64(x1, 0xbc3e483afcb82947) + x76, x75 := bits.mul_u64(x1, 0xff3d81e5df1aa419) + x78, x77 := bits.mul_u64(x1, 0x2d319b2419b409a9) + x79, x80 := bits.add_u64(x78, x75, u64(0x0)) + x81, x82 := bits.add_u64(x76, x73, u64(fiat.u1(x80))) + x83, x84 := bits.add_u64(x74, x71, u64(fiat.u1(x82))) + x85, x86 := bits.add_u64(x72, x69, u64(fiat.u1(x84))) + x87, x88 := bits.add_u64(x70, x67, u64(fiat.u1(x86))) + x89, x90 := bits.add_u64(x55, x77, u64(0x0)) + x91, x92 := bits.add_u64(x57, x79, u64(fiat.u1(x90))) + x93, x94 := bits.add_u64(x59, x81, u64(fiat.u1(x92))) + x95, x96 := bits.add_u64(x61, x83, u64(fiat.u1(x94))) + x97, x98 := bits.add_u64(x63, x85, u64(fiat.u1(x96))) + x99, x100 := bits.add_u64(x65, x87, u64(fiat.u1(x98))) + _, x101 := bits.mul_u64(x89, 0x6ed46089e88fdc45) + x104, x103 := bits.mul_u64(x101, 0xffffffffffffffff) + x106, x105 := bits.mul_u64(x101, 0xffffffffffffffff) + x108, x107 := bits.mul_u64(x101, 0xffffffffffffffff) + x110, x109 := bits.mul_u64(x101, 0xc7634d81f4372ddf) + x112, x111 := bits.mul_u64(x101, 0x581a0db248b0a77a) + x114, x113 := bits.mul_u64(x101, 0xecec196accc52973) + x115, x116 := bits.add_u64(x114, x111, u64(0x0)) + x117, x118 := bits.add_u64(x112, x109, u64(fiat.u1(x116))) + x119, x120 := bits.add_u64(x110, x107, u64(fiat.u1(x118))) + x121, x122 := bits.add_u64(x108, x105, u64(fiat.u1(x120))) + x123, x124 := bits.add_u64(x106, x103, u64(fiat.u1(x122))) + _, x126 := bits.add_u64(x89, x113, u64(0x0)) + x127, x128 := bits.add_u64(x91, x115, u64(fiat.u1(x126))) + x129, x130 := bits.add_u64(x93, x117, u64(fiat.u1(x128))) + x131, x132 := bits.add_u64(x95, x119, u64(fiat.u1(x130))) + x133, x134 := bits.add_u64(x97, x121, u64(fiat.u1(x132))) + x135, x136 := bits.add_u64(x99, x123, u64(fiat.u1(x134))) + x137, x138 := bits.add_u64(((u64(fiat.u1(x100)) + u64(fiat.u1(x66))) + (u64(fiat.u1(x88)) + x68)), (u64(fiat.u1(x124)) + x104), u64(fiat.u1(x136))) + x140, x139 := bits.mul_u64(x2, 0xc84ee012b39bf21) + x142, x141 := bits.mul_u64(x2, 0x3fb05b7a28266895) + x144, x143 := bits.mul_u64(x2, 0xd40d49174aab1cc5) + x146, x145 := bits.mul_u64(x2, 0xbc3e483afcb82947) + x148, x147 := bits.mul_u64(x2, 0xff3d81e5df1aa419) + x150, x149 := bits.mul_u64(x2, 0x2d319b2419b409a9) + x151, x152 := bits.add_u64(x150, x147, u64(0x0)) + x153, x154 := bits.add_u64(x148, x145, u64(fiat.u1(x152))) + x155, x156 := bits.add_u64(x146, x143, u64(fiat.u1(x154))) + x157, x158 := bits.add_u64(x144, x141, u64(fiat.u1(x156))) + x159, x160 := bits.add_u64(x142, x139, u64(fiat.u1(x158))) + x161, x162 := bits.add_u64(x127, x149, u64(0x0)) + x163, x164 := bits.add_u64(x129, x151, u64(fiat.u1(x162))) + x165, x166 := bits.add_u64(x131, x153, u64(fiat.u1(x164))) + x167, x168 := bits.add_u64(x133, x155, u64(fiat.u1(x166))) + x169, x170 := bits.add_u64(x135, x157, u64(fiat.u1(x168))) + x171, x172 := bits.add_u64(x137, x159, u64(fiat.u1(x170))) + _, x173 := bits.mul_u64(x161, 0x6ed46089e88fdc45) + x176, x175 := bits.mul_u64(x173, 0xffffffffffffffff) + x178, x177 := bits.mul_u64(x173, 0xffffffffffffffff) + x180, x179 := bits.mul_u64(x173, 0xffffffffffffffff) + x182, x181 := bits.mul_u64(x173, 0xc7634d81f4372ddf) + x184, x183 := bits.mul_u64(x173, 0x581a0db248b0a77a) + x186, x185 := bits.mul_u64(x173, 0xecec196accc52973) + x187, x188 := bits.add_u64(x186, x183, u64(0x0)) + x189, x190 := bits.add_u64(x184, x181, u64(fiat.u1(x188))) + x191, x192 := bits.add_u64(x182, x179, u64(fiat.u1(x190))) + x193, x194 := bits.add_u64(x180, x177, u64(fiat.u1(x192))) + x195, x196 := bits.add_u64(x178, x175, u64(fiat.u1(x194))) + _, x198 := bits.add_u64(x161, x185, u64(0x0)) + x199, x200 := bits.add_u64(x163, x187, u64(fiat.u1(x198))) + x201, x202 := bits.add_u64(x165, x189, u64(fiat.u1(x200))) + x203, x204 := bits.add_u64(x167, x191, u64(fiat.u1(x202))) + x205, x206 := bits.add_u64(x169, x193, u64(fiat.u1(x204))) + x207, x208 := bits.add_u64(x171, x195, u64(fiat.u1(x206))) + x209, x210 := bits.add_u64(((u64(fiat.u1(x172)) + u64(fiat.u1(x138))) + (u64(fiat.u1(x160)) + x140)), (u64(fiat.u1(x196)) + x176), u64(fiat.u1(x208))) + x212, x211 := bits.mul_u64(x3, 0xc84ee012b39bf21) + x214, x213 := bits.mul_u64(x3, 0x3fb05b7a28266895) + x216, x215 := bits.mul_u64(x3, 0xd40d49174aab1cc5) + x218, x217 := bits.mul_u64(x3, 0xbc3e483afcb82947) + x220, x219 := bits.mul_u64(x3, 0xff3d81e5df1aa419) + x222, x221 := bits.mul_u64(x3, 0x2d319b2419b409a9) + x223, x224 := bits.add_u64(x222, x219, u64(0x0)) + x225, x226 := bits.add_u64(x220, x217, u64(fiat.u1(x224))) + x227, x228 := bits.add_u64(x218, x215, u64(fiat.u1(x226))) + x229, x230 := bits.add_u64(x216, x213, u64(fiat.u1(x228))) + x231, x232 := bits.add_u64(x214, x211, u64(fiat.u1(x230))) + x233, x234 := bits.add_u64(x199, x221, u64(0x0)) + x235, x236 := bits.add_u64(x201, x223, u64(fiat.u1(x234))) + x237, x238 := bits.add_u64(x203, x225, u64(fiat.u1(x236))) + x239, x240 := bits.add_u64(x205, x227, u64(fiat.u1(x238))) + x241, x242 := bits.add_u64(x207, x229, u64(fiat.u1(x240))) + x243, x244 := bits.add_u64(x209, x231, u64(fiat.u1(x242))) + _, x245 := bits.mul_u64(x233, 0x6ed46089e88fdc45) + x248, x247 := bits.mul_u64(x245, 0xffffffffffffffff) + x250, x249 := bits.mul_u64(x245, 0xffffffffffffffff) + x252, x251 := bits.mul_u64(x245, 0xffffffffffffffff) + x254, x253 := bits.mul_u64(x245, 0xc7634d81f4372ddf) + x256, x255 := bits.mul_u64(x245, 0x581a0db248b0a77a) + x258, x257 := bits.mul_u64(x245, 0xecec196accc52973) + x259, x260 := bits.add_u64(x258, x255, u64(0x0)) + x261, x262 := bits.add_u64(x256, x253, u64(fiat.u1(x260))) + x263, x264 := bits.add_u64(x254, x251, u64(fiat.u1(x262))) + x265, x266 := bits.add_u64(x252, x249, u64(fiat.u1(x264))) + x267, x268 := bits.add_u64(x250, x247, u64(fiat.u1(x266))) + _, x270 := bits.add_u64(x233, x257, u64(0x0)) + x271, x272 := bits.add_u64(x235, x259, u64(fiat.u1(x270))) + x273, x274 := bits.add_u64(x237, x261, u64(fiat.u1(x272))) + x275, x276 := bits.add_u64(x239, x263, u64(fiat.u1(x274))) + x277, x278 := bits.add_u64(x241, x265, u64(fiat.u1(x276))) + x279, x280 := bits.add_u64(x243, x267, u64(fiat.u1(x278))) + x281, x282 := bits.add_u64(((u64(fiat.u1(x244)) + u64(fiat.u1(x210))) + (u64(fiat.u1(x232)) + x212)), (u64(fiat.u1(x268)) + x248), u64(fiat.u1(x280))) + x284, x283 := bits.mul_u64(x4, 0xc84ee012b39bf21) + x286, x285 := bits.mul_u64(x4, 0x3fb05b7a28266895) + x288, x287 := bits.mul_u64(x4, 0xd40d49174aab1cc5) + x290, x289 := bits.mul_u64(x4, 0xbc3e483afcb82947) + x292, x291 := bits.mul_u64(x4, 0xff3d81e5df1aa419) + x294, x293 := bits.mul_u64(x4, 0x2d319b2419b409a9) + x295, x296 := bits.add_u64(x294, x291, u64(0x0)) + x297, x298 := bits.add_u64(x292, x289, u64(fiat.u1(x296))) + x299, x300 := bits.add_u64(x290, x287, u64(fiat.u1(x298))) + x301, x302 := bits.add_u64(x288, x285, u64(fiat.u1(x300))) + x303, x304 := bits.add_u64(x286, x283, u64(fiat.u1(x302))) + x305, x306 := bits.add_u64(x271, x293, u64(0x0)) + x307, x308 := bits.add_u64(x273, x295, u64(fiat.u1(x306))) + x309, x310 := bits.add_u64(x275, x297, u64(fiat.u1(x308))) + x311, x312 := bits.add_u64(x277, x299, u64(fiat.u1(x310))) + x313, x314 := bits.add_u64(x279, x301, u64(fiat.u1(x312))) + x315, x316 := bits.add_u64(x281, x303, u64(fiat.u1(x314))) + _, x317 := bits.mul_u64(x305, 0x6ed46089e88fdc45) + x320, x319 := bits.mul_u64(x317, 0xffffffffffffffff) + x322, x321 := bits.mul_u64(x317, 0xffffffffffffffff) + x324, x323 := bits.mul_u64(x317, 0xffffffffffffffff) + x326, x325 := bits.mul_u64(x317, 0xc7634d81f4372ddf) + x328, x327 := bits.mul_u64(x317, 0x581a0db248b0a77a) + x330, x329 := bits.mul_u64(x317, 0xecec196accc52973) + x331, x332 := bits.add_u64(x330, x327, u64(0x0)) + x333, x334 := bits.add_u64(x328, x325, u64(fiat.u1(x332))) + x335, x336 := bits.add_u64(x326, x323, u64(fiat.u1(x334))) + x337, x338 := bits.add_u64(x324, x321, u64(fiat.u1(x336))) + x339, x340 := bits.add_u64(x322, x319, u64(fiat.u1(x338))) + _, x342 := bits.add_u64(x305, x329, u64(0x0)) + x343, x344 := bits.add_u64(x307, x331, u64(fiat.u1(x342))) + x345, x346 := bits.add_u64(x309, x333, u64(fiat.u1(x344))) + x347, x348 := bits.add_u64(x311, x335, u64(fiat.u1(x346))) + x349, x350 := bits.add_u64(x313, x337, u64(fiat.u1(x348))) + x351, x352 := bits.add_u64(x315, x339, u64(fiat.u1(x350))) + x353, x354 := bits.add_u64(((u64(fiat.u1(x316)) + u64(fiat.u1(x282))) + (u64(fiat.u1(x304)) + x284)), (u64(fiat.u1(x340)) + x320), u64(fiat.u1(x352))) + x356, x355 := bits.mul_u64(x5, 0xc84ee012b39bf21) + x358, x357 := bits.mul_u64(x5, 0x3fb05b7a28266895) + x360, x359 := bits.mul_u64(x5, 0xd40d49174aab1cc5) + x362, x361 := bits.mul_u64(x5, 0xbc3e483afcb82947) + x364, x363 := bits.mul_u64(x5, 0xff3d81e5df1aa419) + x366, x365 := bits.mul_u64(x5, 0x2d319b2419b409a9) + x367, x368 := bits.add_u64(x366, x363, u64(0x0)) + x369, x370 := bits.add_u64(x364, x361, u64(fiat.u1(x368))) + x371, x372 := bits.add_u64(x362, x359, u64(fiat.u1(x370))) + x373, x374 := bits.add_u64(x360, x357, u64(fiat.u1(x372))) + x375, x376 := bits.add_u64(x358, x355, u64(fiat.u1(x374))) + x377, x378 := bits.add_u64(x343, x365, u64(0x0)) + x379, x380 := bits.add_u64(x345, x367, u64(fiat.u1(x378))) + x381, x382 := bits.add_u64(x347, x369, u64(fiat.u1(x380))) + x383, x384 := bits.add_u64(x349, x371, u64(fiat.u1(x382))) + x385, x386 := bits.add_u64(x351, x373, u64(fiat.u1(x384))) + x387, x388 := bits.add_u64(x353, x375, u64(fiat.u1(x386))) + _, x389 := bits.mul_u64(x377, 0x6ed46089e88fdc45) + x392, x391 := bits.mul_u64(x389, 0xffffffffffffffff) + x394, x393 := bits.mul_u64(x389, 0xffffffffffffffff) + x396, x395 := bits.mul_u64(x389, 0xffffffffffffffff) + x398, x397 := bits.mul_u64(x389, 0xc7634d81f4372ddf) + x400, x399 := bits.mul_u64(x389, 0x581a0db248b0a77a) + x402, x401 := bits.mul_u64(x389, 0xecec196accc52973) + x403, x404 := bits.add_u64(x402, x399, u64(0x0)) + x405, x406 := bits.add_u64(x400, x397, u64(fiat.u1(x404))) + x407, x408 := bits.add_u64(x398, x395, u64(fiat.u1(x406))) + x409, x410 := bits.add_u64(x396, x393, u64(fiat.u1(x408))) + x411, x412 := bits.add_u64(x394, x391, u64(fiat.u1(x410))) + _, x414 := bits.add_u64(x377, x401, u64(0x0)) + x415, x416 := bits.add_u64(x379, x403, u64(fiat.u1(x414))) + x417, x418 := bits.add_u64(x381, x405, u64(fiat.u1(x416))) + x419, x420 := bits.add_u64(x383, x407, u64(fiat.u1(x418))) + x421, x422 := bits.add_u64(x385, x409, u64(fiat.u1(x420))) + x423, x424 := bits.add_u64(x387, x411, u64(fiat.u1(x422))) + x425, x426 := bits.add_u64(((u64(fiat.u1(x388)) + u64(fiat.u1(x354))) + (u64(fiat.u1(x376)) + x356)), (u64(fiat.u1(x412)) + x392), u64(fiat.u1(x424))) + x427, x428 := bits.sub_u64(x415, 0xecec196accc52973, u64(0x0)) + x429, x430 := bits.sub_u64(x417, 0x581a0db248b0a77a, u64(fiat.u1(x428))) + x431, x432 := bits.sub_u64(x419, 0xc7634d81f4372ddf, u64(fiat.u1(x430))) + x433, x434 := bits.sub_u64(x421, 0xffffffffffffffff, u64(fiat.u1(x432))) + x435, x436 := bits.sub_u64(x423, 0xffffffffffffffff, u64(fiat.u1(x434))) + x437, x438 := bits.sub_u64(x425, 0xffffffffffffffff, u64(fiat.u1(x436))) + _, x440 := bits.sub_u64(u64(fiat.u1(x426)), u64(0x0), u64(fiat.u1(x438))) + x441 := fiat.cmovznz_u64(fiat.u1(x440), x427, x415) + x442 := fiat.cmovznz_u64(fiat.u1(x440), x429, x417) + x443 := fiat.cmovznz_u64(fiat.u1(x440), x431, x419) + x444 := fiat.cmovznz_u64(fiat.u1(x440), x433, x421) + x445 := fiat.cmovznz_u64(fiat.u1(x440), x435, x423) + x446 := fiat.cmovznz_u64(fiat.u1(x440), x437, x425) + out1[0] = x441 + out1[1] = x442 + out1[2] = x443 + out1[3] = x444 + out1[4] = x445 + out1[5] = x446 +} diff --git a/core/crypto/_weierstrass/fe.odin b/core/crypto/_weierstrass/fe.odin index 1a160a03c..8ff6fe346 100644 --- a/core/crypto/_weierstrass/fe.odin +++ b/core/crypto/_weierstrass/fe.odin @@ -1,97 +1,123 @@ package _weierstrass import p256r1 "core:crypto/_fiat/field_p256r1" -import "core:math/bits" +import p384r1 "core:crypto/_fiat/field_p384r1" +import subtle "core:crypto/_subtle" Field_Element_p256r1 :: p256r1.Montgomery_Domain_Field_Element +Field_Element_p384r1 :: p384r1.Montgomery_Domain_Field_Element FE_SIZE_P256R1 :: 32 +FE_SIZE_P384R1 :: 48 fe_clear :: proc { p256r1.fe_clear, + p384r1.fe_clear, } fe_clear_vec :: proc { p256r1.fe_clear_vec, + p384r1.fe_clear_vec, } fe_set_bytes :: proc { p256r1.fe_from_bytes, + p384r1.fe_from_bytes, } + fe_bytes :: proc { p256r1.fe_to_bytes, + p384r1.fe_to_bytes, } fe_set :: proc { p256r1.fe_set, + p384r1.fe_set, } fe_zero :: proc { p256r1.fe_zero, + p384r1.fe_zero, } fe_a :: proc { fe_a_p256r1, + fe_a_p384r1, } fe_b :: proc { fe_b_p256r1, + fe_b_p384r1, } fe_gen_x :: proc { fe_gen_x_p256r1, + fe_gen_x_p384r1, } fe_gen_y :: proc { fe_gen_y_p256r1, + fe_gen_y_p384r1, } fe_one :: proc { p256r1.fe_one, + p384r1.fe_one, } fe_add :: proc { p256r1.fe_add, + p384r1.fe_add, } fe_sub :: proc { p256r1.fe_sub, + p384r1.fe_sub, } fe_negate :: proc { p256r1.fe_opp, + p384r1.fe_opp, } fe_mul :: proc { p256r1.fe_mul, + p384r1.fe_mul, } fe_square :: proc { p256r1.fe_square, + p384r1.fe_square, } fe_inv :: proc { p256r1.fe_inv, + p384r1.fe_inv, } fe_sqrt :: proc { p256r1.fe_sqrt, + p384r1.fe_sqrt, } fe_equal :: proc { p256r1.fe_equal, + p384r1.fe_equal, } fe_is_odd :: proc { p256r1.fe_is_odd, + p384r1.fe_is_odd, } fe_is_zero :: proc { fe_is_zero_p256r1, + fe_is_zero_p384r1, } fe_cond_select :: proc { p256r1.fe_cond_select, + p384r1.fe_cond_select, } fe_a_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) { @@ -127,9 +153,53 @@ fe_gen_y_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) { fe[3] = 9615747158586711429 } +fe_a_p384r1 :: proc "contextless" (fe: ^Field_Element_p384r1) { + // a = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc + // = -3 mod p + fe[0] = 17179869180 + fe[1] = 18446744056529682432 + fe[2] = 18446744073709551611 + fe[3] = 18446744073709551615 + fe[4] = 18446744073709551615 + fe[5] = 18446744073709551615 +} + +fe_b_p384r1 :: proc "contextless" (fe: ^Field_Element_p384r1) { + // b = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef + fe[0] = 581395848458481100 + fe[1] = 17809957346689692396 + fe[2] = 8643006485390950958 + fe[3] = 16372638458395724514 + fe[4] = 13126622871277412500 + fe[5] = 14774077593024970745 +} + +fe_gen_x_p384r1 :: proc "contextless" (fe: ^Field_Element_p384r1) { + // G_x = 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7 + fe[0] = 4454189113653900584 + fe[1] = 2369870743683386936 + fe[2] = 9771750146904378734 + fe[3] = 7229551204834152191 + fe[4] = 9308930686126579243 + fe[5] = 5564951339003155731 +} + +fe_gen_y_p384r1 :: proc "contextless" (fe: ^Field_Element_p384r1) { + // G_y = 0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f + fe[0] = 2523209505731486974 + fe[1] = 11655219901025790380 + fe[2] = 10064955099576512592 + fe[3] = 14322381509056856025 + fe[4] = 15960759442596276288 + fe[5] = 3132442392059561449 +} + @(require_results) fe_is_zero_p256r1 :: proc "contextless" (fe: ^Field_Element_p256r1) -> int { - ctrl := p256r1.fe_non_zero(fe) - _, borrow := bits.sub_u64(ctrl, 1, 0) - return int(borrow) + return int(subtle.u64_is_zero(p256r1.fe_non_zero(fe))) +} + +@(require_results) +fe_is_zero_p384r1 :: proc "contextless" (fe: ^Field_Element_p384r1) -> int { + return int(subtle.u64_is_zero(p384r1.fe_non_zero(fe))) } diff --git a/core/crypto/_weierstrass/point.odin b/core/crypto/_weierstrass/point.odin index cde82ebb2..0e6e48678 100644 --- a/core/crypto/_weierstrass/point.odin +++ b/core/crypto/_weierstrass/point.odin @@ -26,12 +26,22 @@ Point_p256r1 :: struct { z: Field_Element_p256r1, } +Point_p384r1 :: struct { + x: Field_Element_p384r1, + y: Field_Element_p384r1, + z: Field_Element_p384r1, +} + @(require_results) pt_set_xy_bytes :: proc "contextless" (p: ^$T, x_raw, y_raw: []byte) -> bool { when T == Point_p256r1 { FE_SZ :: FE_SIZE_P256R1 x, y: Field_Element_p256r1 defer fe_clear_vec([]^Field_Element_p256r1{&x, &y}) + } else when T == Point_p384r1 { + FE_SZ :: FE_SIZE_P384R1 + x, y: Field_Element_p384r1 + defer fe_clear_vec([]^Field_Element_p384r1{&x, &y}) } else { #panic("weierstrass: invalid curve") } @@ -63,6 +73,10 @@ pt_set_x_bytes :: proc "contextless" (p: ^$T, x_raw: []byte, y_is_odd: int) -> b FE_SZ :: FE_SIZE_P256R1 x, y, yy, y_neg: Field_Element_p256r1 defer fe_clear_vec([]^Field_Element_p256r1{&x, &y, &yy, &y_neg}) + } else when T == Point_p384r1 { + FE_SZ :: FE_SIZE_P384R1 + x, y, yy, y_neg: Field_Element_p384r1 + defer fe_clear_vec([]^Field_Element_p384r1{&x, &y, &yy, &y_neg}) } else { #panic("weierstrass: invalid curve") } @@ -94,6 +108,8 @@ pt_set_x_bytes :: proc "contextless" (p: ^$T, x_raw: []byte, y_is_odd: int) -> b pt_bytes :: proc "contextless" (x, y: []byte, p: ^$T) -> bool { when T == Point_p256r1 { FE_SZ :: FE_SIZE_P256R1 + } else when T == Point_p384r1 { + FE_SZ :: FE_SIZE_P384R1 } else { #panic("weierstrass: invalid curve") } @@ -166,6 +182,10 @@ pt_add :: proc "contextless" (p, a, b: ^$T) { t0, t1, t2, t3, t4, b_fe: Field_Element_p256r1 x3, y3, z3: Field_Element_p256r1 defer fe_clear_vec([]^Field_Element_p256r1{&t0, &t1, &t2, &t3, &t4, &x3, &y3, &z3}) + } else when T == Point_p384r1 { + t0, t1, t2, t3, t4, b_fe: Field_Element_p384r1 + x3, y3, z3: Field_Element_p384r1 + defer fe_clear_vec([]^Field_Element_p384r1{&t0, &t1, &t2, &t3, &t4, &x3, &y3, &z3}) } else { #panic("weierstrass: invalid curve") } @@ -270,6 +290,10 @@ pt_add_mixed :: proc "contextless" (p, a: ^$T, x2, y2: ^$U) { t0, t1, t2, t3, t4, b_fe: Field_Element_p256r1 x3, y3, z3: Field_Element_p256r1 defer fe_clear_vec([]^Field_Element_p256r1{&t0, &t1, &t2, &t3, &t4, &x3, &y3, &z3}) + } else when T == Point_p384r1 { + t0, t1, t2, t3, t4, b_fe: Field_Element_p384r1 + x3, y3, z3: Field_Element_p384r1 + defer fe_clear_vec([]^Field_Element_p384r1{&t0, &t1, &t2, &t3, &t4, &x3, &y3, &z3}) } else { #panic("weierstrass: invalid curve") } @@ -357,6 +381,10 @@ pt_double :: proc "contextless" (p, a: ^$T) { t0, t1, t2, t3, b_fe: Field_Element_p256r1 x3, y3, z3: Field_Element_p256r1 defer fe_clear_vec([]^Field_Element_p256r1{&t0, &t1, &t2, &t3, &x3, &y3, &z3}) + } else when T == Point_p384r1 { + t0, t1, t2, t3, b_fe: Field_Element_p384r1 + x3, y3, z3: Field_Element_p384r1 + defer fe_clear_vec([]^Field_Element_p384r1{&t0, &t1, &t2, &t3, &x3, &y3, &z3}) } else { #panic("weierstrass: invalid curve") } @@ -459,6 +487,8 @@ pt_rescale :: proc "contextless" (p, a: ^$T) { when T == Point_p256r1 { z_inv: Field_Element_p256r1 + } else when T == Point_p384r1 { + z_inv: Field_Element_p384r1 } else { #panic("weierstrass: invalid curve") } @@ -485,6 +515,8 @@ pt_cond_select :: proc "contextless" (p, a, b: ^$T, ctrl: int) { pt_equal :: proc "contextless" (a, b: ^$T) -> int { when T == Point_p256r1 { x1z2, x2z1, y1z2, y2z1: Field_Element_p256r1 + } else when T == Point_p384r1 { + x1z2, x2z1, y1z2, y2z1: Field_Element_p384r1 } else { #panic("weierstrass: invalid curve") } diff --git a/core/crypto/_weierstrass/point_s11n_sec.odin b/core/crypto/_weierstrass/point_s11n_sec.odin index ae009edb0..53dd4002f 100644 --- a/core/crypto/_weierstrass/point_s11n_sec.odin +++ b/core/crypto/_weierstrass/point_s11n_sec.odin @@ -14,6 +14,8 @@ SEC_PREFIX_UNCOMPRESSED :: 0x04 pt_set_sec_bytes :: proc "contextless" (p: ^$T, b: []byte) -> bool { when T == Point_p256r1 { FE_SZ :: FE_SIZE_P256R1 + } else when T == Point_p384r1 { + FE_SZ :: FE_SIZE_P384R1 } else { #panic("weierstrass: invalid curve") } @@ -51,6 +53,8 @@ pt_set_sec_bytes :: proc "contextless" (p: ^$T, b: []byte) -> bool { pt_sec_bytes :: proc "contextless" (b: []byte, p: ^$T, compressed: bool) -> bool { when T == Point_p256r1 { FE_SZ :: FE_SIZE_P256R1 + } else when T == Point_p384r1 { + FE_SZ :: FE_SIZE_P384R1 } else { #panic("weierstrass: invalid curve") } diff --git a/core/crypto/_weierstrass/sc.odin b/core/crypto/_weierstrass/sc.odin index 2ed9459bc..e119eec2e 100644 --- a/core/crypto/_weierstrass/sc.odin +++ b/core/crypto/_weierstrass/sc.odin @@ -1,76 +1,101 @@ package _weierstrass import p256r1 "core:crypto/_fiat/field_scalarp256r1" +import p384r1 "core:crypto/_fiat/field_scalarp384r1" import subtle "core:crypto/_subtle" Scalar_p256r1 :: p256r1.Montgomery_Domain_Field_Element +Scalar_p384r1 :: p384r1.Montgomery_Domain_Field_Element SC_SIZE_P256R1 :: 32 +SC_SIZE_P384R1 :: 48 sc_clear :: proc { p256r1.fe_clear, + p384r1.fe_clear, } sc_clear_vec :: proc { p256r1.fe_clear_vec, + p384r1.fe_clear_vec, } sc_set_bytes :: proc { p256r1.fe_from_bytes, + p384r1.fe_from_bytes, } + sc_bytes :: proc { p256r1.fe_to_bytes, + p384r1.fe_to_bytes, } sc_set :: proc { p256r1.fe_set, + p384r1.fe_set, } sc_zero :: proc { p256r1.fe_zero, + p384r1.fe_zero, } sc_one_p256r1 :: proc { p256r1.fe_one, + p384r1.fe_one, } sc_add :: proc { p256r1.fe_add, + p384r1.fe_add, } sc_sub :: proc { p256r1.fe_sub, + p384r1.fe_sub, } sc_negate :: proc { p256r1.fe_opp, + p384r1.fe_opp, } sc_mul :: proc { p256r1.fe_mul, + p384r1.fe_mul, } sc_square :: proc { p256r1.fe_square, + p384r1.fe_square, } sc_cond_assign :: proc { p256r1.fe_cond_assign, + p384r1.fe_cond_assign, } sc_equal :: proc { p256r1.fe_equal, + p384r1.fe_equal, } sc_is_odd :: proc { p256r1.fe_is_odd, + p384r1.fe_is_odd, } sc_is_zero :: proc { sc_is_zero_p256r1, + sc_is_zero_p384r1, } @(require_results) sc_is_zero_p256r1 :: proc "contextless" (fe: ^Scalar_p256r1) -> int { return int(subtle.u64_is_zero(p256r1.fe_non_zero(fe))) } + +@(require_results) +sc_is_zero_p384r1 :: proc "contextless" (fe: ^Scalar_p384r1) -> int { + return int(subtle.u64_is_zero(p384r1.fe_non_zero(fe))) +} diff --git a/core/crypto/_weierstrass/scalar_mul.odin b/core/crypto/_weierstrass/scalar_mul.odin index 1781ac3b6..108dc5d74 100644 --- a/core/crypto/_weierstrass/scalar_mul.odin +++ b/core/crypto/_weierstrass/scalar_mul.odin @@ -1,8 +1,8 @@ package _weierstrass import "core:crypto" -import subtle "core:crypto/_subtle" -import "core:mem" +@(require) import subtle "core:crypto/_subtle" +@(require) import "core:mem" pt_scalar_mul :: proc "contextless" ( p, a: ^$T, @@ -11,6 +11,8 @@ pt_scalar_mul :: proc "contextless" ( ) { when T == Point_p256r1 && S == Scalar_p256r1 { SC_SZ :: SC_SIZE_P256R1 + } else when T == Point_p384r1 && S == Scalar_p384r1 { + SC_SZ :: SC_SIZE_P384R1 } else { #panic("weierstrass: invalid curve") } @@ -34,6 +36,10 @@ pt_scalar_mul_bytes :: proc "contextless" ( p_tbl: Multiply_Table_p256r1 = --- q, tmp: Point_p256r1 = ---, --- SC_SZ :: SC_SIZE_P256R1 + } else when T == Point_p384r1 { + p_tbl: Multiply_Table_p384r1 = --- + q, tmp: Point_p384r1 = ---, --- + SC_SZ :: SC_SIZE_P384R1 } else { #panic("weierstrass: invalid curve") } @@ -90,6 +96,11 @@ when crypto.COMPACT_IMPLS == true { p_tbl_lo := &Gen_Multiply_Table_p256r1_lo tmp: Point_p256r1 = --- SC_SZ :: SC_SIZE_P256R1 + } else when T == Point_p384r1 && S == Scalar_p384r1 { + p_tbl_hi := &Gen_Multiply_Table_p384r1_hi + p_tbl_lo := &Gen_Multiply_Table_p384r1_lo + tmp: Point_p384r1 = --- + SC_SZ :: SC_SIZE_P384R1 } else { #panic("weierstrass: invalid curve") } @@ -113,6 +124,8 @@ when crypto.COMPACT_IMPLS == true { @(private="file") Multiply_Table_p256r1 :: [15]Point_p256r1 +@(private="file") +Multiply_Table_p384r1 :: [15]Point_p384r1 @(private="file") mul_tbl_set :: proc "contextless"( @@ -122,11 +135,13 @@ mul_tbl_set :: proc "contextless"( ) { when T == Multiply_Table_p256r1 && U == Point_p256r1{ tmp: Point_p256r1 - pt_set(&tmp, point) + } else when T == Multiply_Table_p384r1 && U == Point_p384r1{ + tmp: Point_p384r1 } else { #panic("weierstrass: invalid curve") } + pt_set(&tmp, point) pt_set(&tbl[0], &tmp) for i in 1 ..<15 { pt_add(&tmp, &tmp, point) @@ -170,6 +185,12 @@ when crypto.COMPACT_IMPLS == false { y: Field_Element_p256r1, } + @(private) + Affine_Point_p384r1 :: struct { + x: Field_Element_p384r1, + y: Field_Element_p384r1, + } + @(private="file") mul_affine_tbl_lookup_add :: proc "contextless" ( point, tmp: ^$T, diff --git a/core/crypto/_weierstrass/secp384r1_table.odin b/core/crypto/_weierstrass/secp384r1_table.odin new file mode 100644 index 000000000..338e7b9b9 --- /dev/null +++ b/core/crypto/_weierstrass/secp384r1_table.odin @@ -0,0 +1,5969 @@ +package _weierstrass + +/* + ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ +*/ + +import "core:crypto" + +when crypto.COMPACT_IMPLS == false { + @(private,rodata) + Gen_Multiply_Table_p384r1_hi := [48][15]Affine_Point_p384r1 { + { + { + {3349844787980918824, 5700721700487043153, 1581288787708942329, 17304888540980539863, 3234495129650039747, 11694852976059594522}, + {11454526365474276483, 17280055605583648274, 11483041770187710052, 15064860306174908787, 9425940298043390756, 7831029453110477537}, + }, + { + {10854210904801992286, 8255439613636595718, 1316348857406525596, 2282633625581246438, 14438173431932387987, 5673747503677604393}, + {8960903665589529841, 14030078906563026478, 466971755747792240, 16909751879911376491, 8261483486653352128, 12597935804442306524}, + }, + { + {6447508696227153408, 2759028665179735381, 794515856920409590, 14869397668262921446, 10588017418631076914, 12633095840797167228}, + {6607496461698970477, 6359006165521880122, 16663268705047656412, 18219762716186036953, 13315075775889493847, 6546871415552527515}, + }, + { + {4250815476678138550, 17073439466111852958, 3750529698426925825, 1904641224225602431, 7274009899457528107, 9209596034767199086}, + {6863361867383511223, 4099555040981761624, 16013520265914987211, 17330863835225155437, 15236683723773407531, 9886066912739647523}, + }, + { + {6548020115141006009, 2051287398488083721, 18013217855858620214, 17512108880758082211, 9657257807517110121, 13349423389223700059}, + {11448378503671870177, 16607356707891652776, 17986139470446831883, 2256897346286898360, 7779521166731257394, 14734261666263853530}, + }, + { + {16451156334851086799, 10433346012762661878, 1154088382826340721, 13920053107889463035, 12824812460638933002, 5771020232226448223}, + {10182053156369870491, 9953188423679889138, 3623574174398550414, 6539131418856354537, 4739863922718165110, 13968548469751179186}, + }, + { + {5057596744164756370, 12108644536263189339, 15628783732405749711, 9182850460131890127, 7755150145219327164, 12512487145101794871}, + {9783765255428637296, 17231411912625418137, 3031503376230558613, 3001321323125863884, 3711029936425287900, 18364899108493632271}, + }, + { + {4364170143483158168, 3837420327812895040, 11153877356291905762, 8627127623255240713, 10258093926722597263, 6966392554053872709}, + {13838494481389844004, 12447754423026187562, 14673290292701904554, 6888547195036401202, 3349351868797716527, 6817319933710697746}, + }, + { + {18016384373848540113, 7565820187757705205, 16185660972256070888, 2502822820839506307, 3880408517672548187, 4194119666426113160}, + {15694892319489811154, 4832422690840974597, 900725859486443418, 10265913502031862890, 1864821221915885738, 3700988259937570428}, + }, + { + {8488064655818993057, 13159008538953946469, 11028809874392449897, 11486244481861659915, 8569628704299090359, 2892252873674546430}, + {2941671072611665985, 9930810186813308033, 10852463932839803129, 6122756170654615426, 13303416592882569572, 6113713156059966484}, + }, + { + {10029451401870245184, 17181275891609445610, 1563464611048571891, 9249056941485261951, 15488363863106956591, 17426032626929358463}, + {3624362630716884995, 17733027703464349615, 12615837230382222165, 2899993379581625588, 10641197672343453466, 6876651786059986401}, + }, + { + {12941176093218387209, 18012784992688854716, 17630514364742901970, 7489207242388660276, 3300101790738216151, 165750267447677843}, + {17420203378203929547, 18429168937941287247, 12685766409811315467, 17062737254687688913, 11583537930945240085, 374101281300528640}, + }, + { + {16294845494152982505, 7182435875615992692, 3318017447157242087, 6087688366366383495, 328984259793137604, 14904070120287703952}, + {565244652741101966, 4951466181341698004, 11866318921579101416, 6194578547220221350, 15631557042652121752, 10545898140965819968}, + }, + { + {15745305462398415447, 6816971438675772065, 1075554629877262698, 8234899837982726223, 3512560196005219004, 17693290669008338152}, + {14638482525770633011, 15865918008670368297, 11359271142073926365, 17074664191994857570, 15613938350520725613, 17352596771318223922}, + }, + { + {6627628274763979245, 6430867977390741183, 16640991507592485950, 13915161472308593069, 9005635619537074355, 17136188005588780957}, + {6349032855227933129, 13790585653547635104, 6107878840283566203, 17101678754123509440, 4589529453987745844, 8778990861876837520}, + }, + }, + { + { + {8752339740764879889, 17204670892025727113, 13948917001537480663, 6015237120129105404, 12568825630768815527, 17098885903057916524}, + {3196947359408104404, 10557260209896054933, 15941743809901771731, 11319635393284889026, 15404036538896402776, 1823888675766330133}, + }, + { + {469276640564380241, 10942708362323945260, 5172129155405724574, 17521202989307779782, 285237824018528197, 14755519896084931015}, + {13450199151338167480, 4987469637889591012, 11072253743028383225, 4126494248833488207, 10403393469323319433, 14468451395906602570}, + }, + { + {10409556101848104492, 2312052479304391304, 8367833927637255749, 12718782815503837000, 12586549663603169139, 10099896633356211470}, + {7897182246145608734, 6279866437607856313, 15077509973591020067, 1920596236429885894, 8944171611482738124, 468560753431799278}, + }, + { + {14398196793687807397, 8276491336766244001, 16962771698246445022, 8043838882426521864, 3609036178188456346, 17961572587511875610}, + {10659300691638275682, 12905326140192521229, 651286293824175704, 6550291910155090287, 10359196978363721745, 8054349679302352396}, + }, + { + {14267646986135279321, 8023233762563366251, 3277224320191152598, 2431726775717059350, 3733051418604042579, 11078740418949781682}, + {4641466211631370887, 5972034612476576125, 11061332758238937654, 565694857032650296, 15196808723752961845, 5493285531974069465}, + }, + { + {18369275680877034088, 3644498253900435800, 5207654447363684810, 15054017021149325074, 13441959779061156291, 10801557030657187731}, + {5488228865522937525, 10042916063344664944, 16628991126352116102, 13399733271269739520, 7919096844168308660, 12224871956968387142}, + }, + { + {9406504212815497730, 6315084170282838751, 1538052392585176449, 3287788394884246045, 11684015502339439334, 774607932742351547}, + {13523687029812911694, 8970259436187285903, 516344689739437046, 8879385705799553570, 15472954217075584115, 17165612419994903190}, + }, + { + {6153906285028789904, 4881581827835548877, 9088581243877761387, 8673828452274153145, 3729691157199039232, 14763971970770720159}, + {11125946843031387253, 16893034180060177406, 11028878025260215404, 13414446456552306577, 15673952559920934625, 8227747155230402213}, + }, + { + {4019194246965870655, 15651844969361453739, 14943903262285431608, 16531569415823118894, 12811244602177600058, 13239818034282515750}, + {5449698701210370930, 10791866857788139766, 5646650868879525525, 13293667095645494023, 12241262662724597658, 13853472368070253083}, + }, + { + {4116627791673898568, 5326753363832360760, 11600148105162668652, 16022425070120634880, 12379564163937803418, 18403278989519500037}, + {3838756056494870539, 9746510470453080454, 15196381880087604041, 1324266274153753608, 1934910704818180248, 16192237923261768598}, + }, + { + {5766511464995673783, 8244831189622490542, 8170343088439188103, 6232835306175447562, 5263728916489688559, 11717533286834875}, + {12241226361813518908, 13563045206906982275, 6620157279318203022, 5949784687776791647, 2638510331637305823, 8202404349400972534}, + }, + { + {17137086209956005801, 204428026461370733, 3234178205969960017, 1143006718786815780, 7294365920988646447, 3430748893910901229}, + {15644744495324135074, 6526193849034702994, 15311692696436479485, 100536624425234142, 2072137864950345134, 2838362248079960254}, + }, + { + {3864766173433820636, 1971303109201164903, 5674191275610292510, 1729560487462795155, 10192657450724834454, 13552365051012392948}, + {6029200215919341904, 15607499798945720199, 9235384391078164863, 13115797159041968899, 11473304030559673981, 6717143313334294198}, + }, + { + {16073198989296538507, 1260522085794207919, 2484833084695527559, 16663233906141730979, 16370173418105654173, 15941588275532048355}, + {15264482454100651294, 1530324904307833661, 5346522558909751820, 168718846601743143, 12733323453851106540, 15054596367649585566}, + }, + { + {8779244963536382258, 14774177152181331880, 4385874624061025062, 1164231020920773885, 18441595039555055892, 10628161864427821209}, + {314776300789919008, 15953928246882392341, 11239013102079015593, 12105564780074077722, 14167815415915669462, 1359490032240618238}, + }, + }, + { + { + {17495831655399754328, 5174414647671185898, 11318938235462267547, 10600238109237010238, 3808662780947456733, 9982761271652922419}, + {9825065447185105695, 17201221608158777066, 8386702419239390647, 6669452484318451541, 9948181677775458542, 10854356442296663251}, + }, + { + {9814807791324751977, 12296930083946621987, 10307437404349332723, 9109385710605983143, 14812805821653280276, 9073050103164402930}, + {13867323253290964163, 4560904001274587374, 8320427990736234822, 16081927245724423233, 5738004521721590874, 6293359268685952360}, + }, + { + {1102440177859885328, 6433584039832869723, 5220624537358960047, 13680706619037828486, 8111463461178477715, 8222960733395115842}, + {17599283693164557341, 15090346558134489779, 4538679599583135375, 15042688490235051776, 13835441515025117083, 16073809881077304026}, + }, + { + {10047787296578964584, 2965381022962740423, 16294614689730458159, 9190282415235004744, 2690723303600845570, 2433913875956636400}, + {314860987985756378, 17256734903814295206, 15934782378906162714, 430963730343504134, 11136098731840913906, 17571316264889158941}, + }, + { + {13751698910353501324, 13510591610088790493, 7296230476386677951, 15771194764882310216, 7071348632181406726, 4016223392586971068}, + {5697427461676860171, 8233597763060359382, 11010267185618729313, 3415981542645755022, 5457294468077244468, 225392490383371832}, + }, + { + {15646693844663402255, 3326571016557891145, 11654470234122088961, 15157961803112063987, 2993882145665175656, 8636467418941461771}, + {6779513489978476950, 5971261203840109208, 12247590628659552873, 17305918993021939273, 16119245356860371088, 1321130712911895728}, + }, + { + {11483973417069062031, 6037224851072625784, 15557951376706404252, 2470679358159540669, 12238331311548942969, 8726725576681513552}, + {9571412658072452963, 13081411829441971381, 11182177874732199472, 4596163123987649855, 2508633440203353096, 13386883764628321276}, + }, + { + {13238425823862395570, 9364555424927625812, 13036757456625831933, 17258175170914518289, 10977661896195155237, 2108108449570745277}, + {9531888381573748695, 871050091524626285, 5415169211299494043, 12856340691567607896, 13004810147483829082, 16238406080182275763}, + }, + { + {15371919503521995592, 1023245974044194281, 7465441369206311123, 1659176121116069520, 14352885355523706915, 12313186690485283196}, + {16829625273347829325, 14329982894690398353, 13430769608769996200, 14433580840835616212, 1575399656250103267, 5631450320997959585}, + }, + { + {1308927832832721864, 7645300720509257753, 394821027033666361, 1405179974140973893, 9998561471841590974, 740549317055684310}, + {9206896584584034779, 14330288277576019540, 5482705534907018177, 1134228745870193564, 14319406255178735919, 6723548280696025825}, + }, + { + {7488031393132578836, 4827301471138388705, 13879957958516433613, 8914235600795497221, 9625930790436045227, 14346277439968844011}, + {8799754665963613196, 17445816559731029471, 1345966680255046785, 2291437085360476682, 17887362986581489890, 11089873753828852787}, + }, + { + {2786087897073892568, 3104846214576331224, 16466749382591438860, 18025871964671977774, 11073207410569350939, 15738740251530786465}, + {13634745416070217585, 5695916567870375377, 3278890813204002656, 436738283047315052, 7668575393144640681, 4923414004094995102}, + }, + { + {14851753411270223421, 2820295503131879793, 17134510985746317750, 6635507126737913572, 2826933808807957093, 14392615754844885363}, + {2507906658398669588, 10780876428782550273, 10380620345441284945, 7886790170905380501, 10231944265771711398, 16476655346301721654}, + }, + { + {13070800538562112677, 9974973058199179811, 17174935952981795715, 11396839698540407513, 6936502055882250851, 14166262455025754064}, + {8364117452854843552, 6706032581969460855, 18006192088730697620, 14578422357554768654, 8987670312607011721, 12637025718236942994}, + }, + { + {3558937619125289797, 5542434901402954033, 5561316942068979218, 3053265417595846608, 17622647805733278772, 13078656474266295183}, + {4792933921067825163, 12438312561223885381, 4069107248810180056, 14562883583229266197, 15526204878824637024, 13971448521721856329}, + }, + }, + { + { + {13881233885713608853, 18310267182505878203, 9666283410481579841, 7622892083109029242, 7627364883537502737, 7711280318302167400}, + {2653916418723521679, 2132538432068103232, 7384809380579857215, 3976377314823384782, 6302545514324279629, 4766374634552375286}, + }, + { + {14275770317741623555, 13472206961963184891, 14882629621446810331, 4745461955502981496, 13430642232042183996, 18385303470562194476}, + {3828360326258537309, 5628323622401545900, 10617176218500988509, 3376138133187194596, 1896232731466588191, 4015792813110298739}, + }, + { + {17520011058000060892, 13282870058194119308, 2970088605549251468, 559824469192815928, 13074959133117617173, 13965335622649006598}, + {14278086476506718074, 15679496005431490447, 7405358540117832269, 11499896947138894959, 6967445910717609773, 2473509465854660680}, + }, + { + {14218645527427232303, 16094073974715081351, 14550346839806249740, 17359042213091334869, 8243736883827664451, 19411709369106904}, + {17360637257722902309, 13524203219993551359, 17248055348998851403, 818508604090109170, 17862494632117412800, 7597397595500206950}, + }, + { + {355637953695091928, 13365105901469090585, 11160916490622410120, 2871346391173754292, 6750400526492046394, 211127482213137910}, + {549443043401466743, 11744212739472559234, 4600076762405256377, 12166210043154281415, 11432931513593152138, 17057353378977209047}, + }, + { + {11045556636417587304, 15797122882916606544, 9857941873608458027, 15587445337518508161, 16747134094270843369, 1942895756873835958}, + {16926974666046519651, 17530543788685554725, 1482855329287158678, 4473134732938867843, 16205916098480860897, 14394504722885977211}, + }, + { + {11278672676047883003, 3127364840791393317, 14661695642506572763, 11327535520461364742, 16295126143649156464, 9195965710616161195}, + {2883629345650458713, 1172057357528370502, 3611546183472157852, 13774548359392334165, 13259339647748906816, 629600286834219016}, + }, + { + {7869123316056211366, 8912948800190134731, 7048222560394935760, 5384815822636674013, 8276041929283508860, 10387125700457001021}, + {5152418287465476363, 10375890927386960077, 17017201689085708686, 17352090541805918837, 12744013506722056115, 16512473688480987896}, + }, + { + {13274024037452373469, 13088421719716579977, 6488831580186260168, 12167840477765829729, 4048926237756853262, 10042315437016580210}, + {16990037843046932062, 11650375436582455716, 336515426783093448, 5621387034989961497, 16227625293517574482, 1675664794019173789}, + }, + { + {8998700262199537435, 3948126232667015745, 6110307257346779364, 1830671386111562275, 17929406846170452655, 6510115356319508860}, + {11701924621820907518, 624276597106916110, 7769841773667732717, 12604366378926560515, 8005398115052195134, 293463208231752797}, + }, + { + {3901247269240974390, 8083958895346723402, 13047079326090925018, 10022566546990307546, 16068843007491877327, 10422873494559390104}, + {6431582432115208832, 7003752929540397423, 751812828597354449, 13448257234944313700, 17160453016917581253, 224281597487448015}, + }, + { + {15505836579778927831, 12536765066489116061, 7911004464200661773, 4589459948731631618, 1352286392773861838, 6489162408280759760}, + {6654011263605559897, 8851080956163569570, 14795264073060462823, 14859036427142293159, 7090935575643363067, 15615386349502020600}, + }, + { + {13497550669973445610, 776655080972150030, 3491366472103751840, 16846118274841047081, 13565352443717216734, 16762453283994907024}, + {12654927015632301198, 15345461380888405279, 4403814052111981055, 17852880245807884583, 14115340613623856930, 4860085117378061039}, + }, + { + {6433917609890801577, 10685400209354089382, 10418542423521959747, 3946310041240688418, 9635492151118952286, 9917954643840099262}, + {15291273590135926152, 4720885519447161005, 17166594277722852696, 3334399947768089986, 17999815131740278301, 8130038528325353891}, + }, + { + {6629307447971988422, 5335548022504527311, 12146427842799104389, 8972801394900876948, 14555534637545481678, 1004424158638645771}, + {6032457518228329693, 15568108340121417066, 8949689274415917695, 4542026629771725374, 7740306014723477514, 16661552339503449836}, + }, + }, + { + { + {9224203646647229025, 12662711716512669786, 12163889523034683189, 2867493967382851716, 8230710800753936196, 207192902851491327}, + {9006096280315984413, 10727939396825569390, 7414333640665166734, 8831661749780045475, 10577657048648935168, 7340987637726578721}, + }, + { + {16819901085357815109, 1200308257500709808, 17900351623796430109, 421922693020621282, 4799108745080418673, 2867647093297445986}, + {4820563775913927012, 5975941317603369967, 14072742165336817571, 2287502568922658853, 9587001235227187358, 4290334145148904430}, + }, + { + {3832022561932601686, 7513971564898549429, 7265952414186567449, 5571401045684531851, 5917838096882845075, 9020054854027355230}, + {17666670175994672478, 14849859059336890140, 16575133114891581747, 18181109587632733552, 9353137766555932790, 14224517063829047201}, + }, + { + {11379736539869871663, 14064395773240508269, 15376587550927055762, 12366734842807406024, 7399730532330594511, 16291653033248048665}, + {17533123140589700114, 16874629705534527689, 2772413922918237986, 17100246637189895662, 12295986277440111980, 9880401782043035390}, + }, + { + {4600239529793568865, 13314440057685353765, 5513099208751614902, 10672101316916498735, 7845480375626361331, 13210044038654501689}, + {9289518081528298195, 11080913979513349207, 17396978866245763032, 6250395789173560880, 16771707236585087336, 2590734212198297899}, + }, + { + {930462897994518978, 9217181672387315942, 17307812439812166569, 3609084933939549829, 16131501236725989478, 8757759376648884060}, + {16339503747609931114, 17221587404154414579, 7488052216073421601, 4518526255668709375, 16947062963375159993, 18380636145787033322}, + }, + { + {3629310135461852726, 14261574859150072195, 12180309193984885578, 10259672401517896031, 6494810599317794988, 17046762876694577034}, + {12098574628862673469, 10378154311416559487, 12750606156573867456, 8663374335352934709, 4693992916394743961, 357493171015036757}, + }, + { + {11833317211185183313, 10488624928285281625, 3077329497649896790, 8470872799795652062, 18163548998316849229, 7886285029156450668}, + {18270578357826845759, 15548792140868659315, 193286806456843076, 16001981975120132135, 5119039709260849665, 9668247383740756817}, + }, + { + {9031752377320763641, 242818397681257852, 18241906657254956110, 13839428244885956520, 9537688327632448482, 2680760180422680034}, + {1140834959571490287, 9218649627789651517, 5215286326434684525, 9085211375997438966, 14681078397199707995, 6543087453410959651}, + }, + { + {12771546520335765761, 8608812848025739593, 11046738517958961200, 2102753437152423641, 14544186608765681553, 17802705546689279874}, + {16807367192212923198, 5264409545529952952, 18278421807570260973, 5724995243518092238, 1214809321092318114, 10853502413658374973}, + }, + { + {16212300912408911066, 1517529852090653420, 4886194125638679873, 1212252738684378336, 11831701727622714538, 7716816927665980895}, + {17295498200608277293, 13425634643770440583, 15749163629045239603, 7303838501526289106, 14498496375761955339, 6454509847858940644}, + }, + { + {18202283120945286395, 2039362142522516476, 18347665142857106533, 17305114143802821185, 11943785292295778029, 2743738074951986737}, + {4994513738578570266, 6348689099302941658, 15173738691317246698, 11558529557606048315, 4106465899018522358, 8424813643021743657}, + }, + { + {10424551593037483425, 17413812589282410500, 705854651896543614, 6898508513214864618, 145837834970548303, 2863236542933854914}, + {12835826729643090586, 1958115997725533394, 280738023943547097, 6087206023074646703, 4265323126954195996, 8619647725472919222}, + }, + { + {5732596994419719701, 9319740642492016182, 8478607680989525873, 17406976540323360541, 14044433736883338890, 5843487408713771306}, + {17866336923428882759, 6507956087423256715, 9144061297371615776, 3240732467142651847, 5257579294906270467, 13872281309975586392}, + }, + { + {12720761491485366396, 6776966272901501581, 11463518450782265334, 17251569553757868971, 6624504318270596406, 11185165932902536570}, + {12227483127918029728, 6324632225240663892, 9478714313429082812, 12835053263906838560, 6450777494445586817, 5700121989629794103}, + }, + }, + { + { + {15147392016261929612, 2592171191975946442, 7902428577086443761, 18094018070971638928, 17125131301575142676, 10403369618039505987}, + {7782580376688466610, 4703006815182908293, 5606766158256046999, 9775555907755921362, 18306579346372695468, 18162177355143222738}, + }, + { + {12724835834640470632, 9147221313705790092, 7170406708748588612, 4886504410000298099, 17202448621988755776, 13271672497061292325}, + {17599074313590505725, 3164548778567106464, 14831945487181112151, 10047709902632560980, 80312838214623996, 4488377331349129562}, + }, + { + {16935158672435590850, 3414074563213825020, 14976003461413697269, 16596700862409772375, 1410879114739726020, 1257343276542464557}, + {12595581628483328246, 18321480388540739538, 16111335550040023466, 18371700889666820459, 5114856790954063486, 12702332139456970834}, + }, + { + {9865043235042057824, 6029147174750169487, 4293853667229843866, 9112439374197776924, 14635415243831213657, 16684692725807653987}, + {6007944397888869536, 10548392254307770404, 7913056855243428884, 6568756587625967278, 595480320951638110, 15988239687909198680}, + }, + { + {6682713213932946292, 7716189363132191471, 6386782149539319850, 9799679847346926198, 12768758919818342081, 12149412740097346866}, + {15963729003660447748, 9187947812534491537, 15358865564388966319, 17453292715073688659, 6185316189136789449, 12625900424403229246}, + }, + { + {1176014715697049427, 10940632468289921525, 1316897139158742923, 4659486690798028078, 6789215229361554544, 6689879531142462158}, + {9044301377244887283, 3631078536826367378, 7428358043384314342, 1014081592875127196, 9053433738331035978, 8688971663426964781}, + }, + { + {13620164954367910528, 9966976914653058965, 4659720763711269903, 6933780758465588457, 8151676732205446269, 8752412244536117943}, + {2214917853338768919, 12945088371494225060, 4601901579622551791, 15942583889923574471, 7281044701092345103, 17030848736008966572}, + }, + { + {7835462182282043081, 6752736874837396136, 1692977477997399163, 6932537288585414532, 14477842662688910095, 15049850015849067234}, + {6173531860463995642, 15846342177339735029, 1597137878407950850, 5502938210031734458, 7415040766859401533, 1338338807883996623}, + }, + { + {140753466411001702, 2297914471247852879, 1028738292103309951, 17823758766646087018, 15769363817186087193, 4910055743319677712}, + {15419773815255457739, 12240682779047476716, 18282251230655960630, 16713544303549254380, 13083613671678892706, 3210908138315425474}, + }, + { + {3793265829253063392, 417218602524327002, 4908064786314635338, 1898100452518531755, 2568510715793833230, 14120149645664052105}, + {18146362507954308672, 2545351352320443286, 5008353042150968046, 10916578200202739329, 13715068559100727645, 17156509812140536028}, + }, + { + {9838244599212892470, 12509523685653687922, 10577600670943532011, 15106554186241242699, 12631690473512788728, 9169152683892800174}, + {729650498691277361, 12159677075966957800, 1876936289057209821, 253712351947999722, 194325639412533985, 9244721047496417443}, + }, + { + {2482116316041585169, 2104186195194786493, 7202193418181832678, 15057368806550291031, 8766969826300985526, 14582594738267145235}, + {16362045180297581158, 14472742906561159645, 14204095959602911743, 12991159482136232910, 5359117497638310078, 17218381012207861896}, + }, + { + {1272816448120968979, 9359442561097893921, 3623593162723332560, 8905232475783332533, 5169888391258441059, 8811080810485397684}, + {653572848361898632, 16110636390338543963, 13671121912701413366, 4560998650645223117, 10962017893531637465, 12770222065189975065}, + }, + { + {3116586205508178734, 2050508606805777592, 675566623125517728, 5812215637185565400, 16747763503048114993, 979095159683344417}, + {4422968182455831938, 2371155931114840425, 4264880153383139392, 2245458832441390704, 4962056465731516764, 13785630336035383669}, + }, + { + {11608620191053318010, 3148547465913113704, 4334059326127053351, 3242751952971024244, 15779619493269214681, 16028659557022656525}, + {10258993644149710167, 6956689905416847195, 1219361474591302664, 15358800427564853076, 18412522508913131917, 11320199778311670341}, + }, + }, + { + { + {1763123866941591327, 16900027656783472578, 11315458126277126494, 14678873114899664069, 16385889875309589997, 9608350753469446028}, + {8365156417390395208, 9518773903920392233, 15517769310656023055, 15557612401839384612, 6818638793384298196, 4689490629614769647}, + }, + { + {7029169502144566380, 15357026717875887823, 10958228541568110205, 12991311448110316375, 18163413024255486907, 4423132467880086538}, + {14329574318939096952, 15986250779104246749, 5149023581841912567, 857692231877427831, 6766579494828030413, 13297528373249043274}, + }, + { + {8833286985133922820, 1422352152750949632, 17916971651207587120, 9852959168575954132, 720074577693725724, 16992164406778833274}, + {13658912852753184715, 15995732835663412588, 109169432375935263, 7153134127152350339, 1740708231718983481, 10096352175613178615}, + }, + { + {8898444536197899229, 7363197234870550392, 13859502656863853529, 16353929722932824154, 3563926877908575789, 7083332022656946846}, + {1192602583272042541, 11691701210306654678, 17768977285493519026, 1325595029028298323, 6083154463528028942, 9420136318321879646}, + }, + { + {9357643633468667166, 9777626262221569724, 13091931063589755125, 7867107412773768943, 15020623651884666147, 12089257806028258277}, + {10848050713527447877, 5954793401847436243, 11016251893792937739, 3094692726578056666, 13335998362365960105, 4456549853200134134}, + }, + { + {6615550875184532162, 17802299024252154693, 9829209431047041336, 12066910166505767332, 9658085204117106784, 628187108833105552}, + {4704248642052554113, 6397156614024370344, 11345180222991965460, 6233845157183108927, 9777374421972523308, 5874678333002996612}, + }, + { + {7822288722540972332, 7952138195439261347, 11169290659098881849, 3042519944988229158, 5405508523428790131, 17939670977762776799}, + {2939158258373740623, 12697341633646165676, 13062397760872702525, 17176707327834230530, 15615175546165608557, 8494997402872669401}, + }, + { + {15755839765779794871, 4360301701503507242, 18156570609668386254, 5119543763469609383, 16128603506838286124, 8332918297114938687}, + {2581195955267651639, 4444333459878089434, 14369377281187161259, 8296332340199089840, 16659639448818898530, 18345037457345897147}, + }, + { + {4758277028832022225, 11683847788382241419, 515925726413885095, 3693914633629232851, 1334049558186740102, 9903363943316486178}, + {6186305948183309326, 9076841023132049489, 2269793805693240470, 5838292741631995685, 15624692348115370947, 5174016497034202999}, + }, + { + {13050258405219282279, 16752510433331299519, 16577830848329560188, 14788323970814757487, 3531220681642194883, 10450279241367329525}, + {2241246527454921768, 5961237379972381806, 17018546346619625080, 4693825024640504146, 1766972201817885924, 12382031514930570953}, + }, + { + {14186663977554217418, 15921452897246352532, 1670746882987574783, 10569214187154214751, 8735916617091829853, 4778008137059793493}, + {12230336867909671050, 4713018484448365389, 17202143122302469643, 709747344404349977, 11975499930396914498, 17122512072780824252}, + }, + { + {18302357690866390301, 7110969485339785348, 13942032347351245328, 5693499076189202693, 12668677863581132895, 12259773033298583409}, + {9466495933006422543, 11511978512020081294, 2926450004721272470, 13153116633565406229, 11631506386728977206, 16476012745611483528}, + }, + { + {3807014191641283110, 18120911889946646293, 6904037019088813739, 8534576748083079369, 7162583560481993923, 8819640486580967436}, + {440118242100524191, 6463206891372223528, 547302312933082159, 16377841440620731411, 13653804506016223223, 11521845620308131867}, + }, + { + {5885835281685587260, 14732488327182469839, 9123122330185964050, 7188708702276480952, 11527895050614825468, 16851231088680010599}, + {16816057606689618333, 11155368217836023835, 12624177727172231086, 16592926329340617105, 15223575869568336594, 7273522873166632571}, + }, + { + {5641683582398435967, 4216323241605386457, 3341345023369259125, 5445036994137252291, 5739257813022814747, 14500775521438222305}, + {11851051397499831538, 8952633600654017343, 16150283802430207733, 14278765209911766161, 10318996485999417200, 17994297809574684578}, + }, + }, + { + { + {12250833825141170631, 8405485792690252918, 12864232748520003516, 10788258468673581522, 11856270866800692413, 17612133403939424877}, + {6699634647130975491, 3731182997054981008, 3644858741145969783, 15278087383684100287, 12254545970866866689, 15919262562293099205}, + }, + { + {8514722413728667145, 18324970319650698111, 1140876005394585162, 14935735778864688897, 13574593964511010162, 5249313883818330346}, + {7116828599638239878, 15508924984182297327, 4202376624751087766, 17328701599850278205, 3030575546715635832, 10545614704608166749}, + }, + { + {1712884901460314968, 9844020979159339847, 6421369648072212416, 15296006715190099259, 14597799127028308590, 14859929927669149364}, + {6921131700509172807, 2364609551036929704, 6856710389833844455, 12969257838905572572, 15852094516432192950, 18132001333910704096}, + }, + { + {17180792802575253493, 12600911473819356885, 3979738952931545371, 897682737326728136, 3061890262390512969, 15521523824750041606}, + {332654518124076169, 10307766275571297144, 15915817537662916802, 8907165492937349795, 7857497823831313277, 691902339344201455}, + }, + { + {18398586274195528059, 15773719058798786758, 12837048689216171565, 11953182511721889201, 5401493090861388884, 18440361993747252486}, + {5508661908202617743, 12788348494283175173, 12802197537676893221, 13389178143916130308, 538230151218415613, 16302560609031790145}, + }, + { + {8617925644825956245, 4355127854548976134, 14887476132899231451, 18298212220260618556, 373812720990200546, 18003600147222108981}, + {9609711738554496849, 14532030487725870587, 7449281719849717093, 8469200687346562573, 10559473347725150336, 12054655914827657608}, + }, + { + {3996011418975128202, 6210410771156724227, 16016243241151657273, 17559838693774705198, 18254204752477848622, 5017013903626038628}, + {11728280652213039591, 18003698909909675482, 5616545407832730442, 3102086566055618083, 5927895418024958106, 18268521772846570919}, + }, + { + {4353949603957647042, 9085101501655849465, 12908896052138981424, 17855767860621714692, 9492202381046329533, 6493982940855119418}, + {920636089493927515, 7492445422033208514, 15300073048779302285, 14892838342609729650, 7806275110911940261, 18060719008911082625}, + }, + { + {11178478997628375018, 2538869944843427535, 1225616675740174641, 262785678366031569, 7237556322327894647, 9013462934359109785}, + {13984952488792193847, 11393155007624702919, 7707447211005168284, 9473882403030139097, 3744543934645693007, 552942797664059813}, + }, + { + {8830021259611276202, 14238468777507748310, 8084636387556533453, 16267493202640556542, 11525587568835060457, 10481188297824139279}, + {1115271124367336174, 311879893672637356, 9462111876944106068, 13040825816840411547, 2701770737309674052, 1508687001335391359}, + }, + { + {18280457447310560954, 1268638543685594562, 17105501920321557826, 8343192844895939858, 10103219901911409344, 5772380144868336032}, + {3999072919154635477, 16332682335690661625, 17160109792742439915, 5532275933255506759, 11912464980270406151, 15340700818574378247}, + }, + { + {7968741417565336095, 4204348514802527406, 10647577904042939816, 18088419244287416759, 17463728543868140844, 8457835342186140450}, + {8996396783317142351, 11593744928362394165, 1118739296758409498, 14422226999371433227, 12625902505025381474, 3115381790871861597}, + }, + { + {13500267717482823695, 12826999588757664414, 9339382239162750836, 8128243301916864690, 12056736855957358028, 8196723657625083381}, + {13279394920737824036, 2958586812346659937, 17330699213847682717, 16087607133092967162, 16401864758434998681, 10039877192861155006}, + }, + { + {671802191804153328, 4139782484917432247, 2458696726707986631, 13509154007102964993, 17371423440074958223, 1797826281916833787}, + {11733261849393823747, 4590492414496687225, 11885892654308987107, 10686151607542826668, 1505341691600550175, 14056863349008723570}, + }, + { + {15792482088894033762, 5480086515083249209, 11855064859109876087, 17787767953015637343, 12667533478417710162, 7387754975679279919}, + {1207308571340156947, 16667444176920164891, 15975281376773688805, 12572215559198527609, 14287924549904848354, 15022984237456793014}, + }, + }, + { + { + {44405927858177408, 5350377411887964085, 14455423006632940030, 5051888284479827915, 18289264027550181045, 8742179469806049698}, + {1965293239814067675, 6296618101654059964, 3622639221300896262, 13683273513375487727, 4967193303260329462, 11081296004911608832}, + }, + { + {9099612492305855642, 13667366445618114651, 2368345502115408891, 355808025346965495, 6486699240755468623, 17662463045646732595}, + {13873320631421175736, 5934257143872775779, 5746672378903457427, 3704713689249420299, 12753304704606405263, 3217678872185309915}, + }, + { + {16414774628626628182, 32433971592372646, 4545225813507032103, 6836784835149171090, 5605550610705879937, 5548109210523028334}, + {15540467984433628639, 2461569588551261176, 7976753374299459545, 7581883501804398076, 4495381352011398463, 14281052217405746417}, + }, + { + {11076024185715957092, 3756765523882542942, 16665914572503891748, 14424567262466352621, 3717953767462280879, 16707839638391689758}, + {16892433804273414193, 8340332951294898930, 16313859462232353177, 13057798224010923708, 2523399837778976306, 12671960932364471005}, + }, + { + {17680998608405488653, 16454370296773597713, 13745267107063112083, 17812400946273208067, 6537239167722644731, 18154061302206627196}, + {14732093356815809073, 5178617476103754703, 13809803262147327548, 8824415336739118563, 17720661792494399232, 332116945344768606}, + }, + { + {5904671783816032987, 12111663325909606562, 6880618626717651658, 15875709066691863243, 11314665215817792920, 17321877266325783037}, + {15530273438553475601, 13979895649836346625, 9161871406971555955, 8903894066085514940, 6153387203496648040, 12571794686069326995}, + }, + { + {13016093613163620702, 11300489640845417680, 12781125362901831503, 801538149314788550, 2606593691508046519, 3163799746260716745}, + {7990809893160984636, 14408985047470077797, 347123455262478363, 13992131173035179306, 11786974102048305024, 11698441235974567349}, + }, + { + {11403599927368253583, 3279567955763272667, 7486403755075843180, 14522524358510212243, 14041846160447403772, 6435799871106467417}, + {14030691594486470451, 7790983720309604281, 6582028046670807563, 2822694964154013291, 16463582068215434850, 15072905663834443911}, + }, + { + {3407741673335114913, 11737534300849159723, 6401636175760439089, 12664954507386771017, 9946081910621171804, 5351127802521315559}, + {3173915260803124860, 10290055371665382209, 1714775078878069738, 10809651193197592847, 7937909731024783757, 10117809777580180877}, + }, + { + {16234864712073389023, 5314806349780370870, 4543488410858487687, 16873514203217580096, 10926710397504298767, 9299654171185615615}, + {15666939264737647752, 631855467695092014, 12193734327123054559, 17500404761181864020, 5421672177931299996, 3181351099583887620}, + }, + { + {9865914660144246756, 679604583562241462, 12921501903321601694, 13643679714879784509, 9802439286503205145, 3566349991748818559}, + {3712245593303086298, 13460846416004687749, 9489981526591301543, 3123337991328400667, 4486301121585605289, 8667920552833478113}, + }, + { + {11007825084924597849, 3874134660444866478, 7483283914474628520, 2947665680662261000, 18206338370303112208, 6893224180612988447}, + {15534747185067764117, 14985089178434671491, 3753309356845273643, 15570826499824234809, 4279214973488175555, 9593222558729075908}, + }, + { + {8602395341968076463, 15871701026135700965, 3712441164876432259, 7899892413623964244, 2712639600130105811, 12974295924845123944}, + {12399828322355686123, 18332014219357823799, 16863123510502888446, 771187562270410330, 8994686144476825705, 8686520534353888933}, + }, + { + {5941138557129179410, 16597018407758618077, 11490599640002981607, 3438708541253264112, 2003804289091704123, 16058751440908460062}, + {12804590885840718391, 1477090995170106511, 6149788628468626331, 1665866219994921367, 674399758826895796, 3022438717214642932}, + }, + { + {12649661972779445664, 4013263712261539431, 14554669017811351896, 13226091073296320692, 15697669929212159615, 10884886018241841834}, + {7538090638724339870, 17307058199744561660, 10160210242875571595, 18329720837322489027, 6424491245976098107, 11439659459774047524}, + }, + }, + { + { + {7518960189446694562, 6993197482502760102, 3624948335487031629, 3298603013801970257, 4557303586291885385, 513965581431450258}, + {15631936952275006776, 17646865581595831452, 356541621832294767, 13550122502020347389, 14318884666702203958, 10960356269253451077}, + }, + { + {18088774058581706331, 13144474494348168686, 7944684987556043669, 14803417489453188919, 9523674128757303753, 11078534252464233827}, + {12388996124243602932, 7847055437820113788, 8655700446678160057, 8000087902999810104, 6845432560166828222, 12293660227730163310}, + }, + { + {4121836826461176490, 6993311364897236225, 5980001915532870045, 9191387104629167574, 610736785956912723, 16369608744481332444}, + {8192853368245745564, 7830351299822135372, 7708271704384679284, 8692236521179851966, 4729288028381163761, 15087261038869840952}, + }, + { + {12359675760240320823, 5017343929380605284, 13074869016670236859, 15189571864632066092, 16437432446366423946, 10450373967097078613}, + {6473521102572105839, 10479204864703445101, 9531740430353536824, 16747435491821370083, 13590492053866597783, 13972781732492559558}, + }, + { + {13526124267573528663, 8270416783887521310, 12350520572663083733, 8457342880502864923, 9576612715781561966, 15585819794980473675}, + {12920791615644428441, 14682599939111671380, 4336061001815369200, 12825352708863745934, 13689910154205327554, 1285753843825672638}, + }, + { + {16260954862601212942, 15141701739798325327, 3469367818986501585, 12433553164601433194, 13397654412997304037, 9513462516209648688}, + {8806424456394813714, 3283666376713533561, 12560245143465260449, 17855428090864138328, 9493604162795122493, 12112034994090758518}, + }, + { + {7529184601583900565, 11129864964563043004, 7211397676801058227, 1363637554105090981, 17895272493932277282, 3646615785541938193}, + {5125329656455924528, 4567149614941497190, 11074336456476606030, 15476194487447194466, 7180704409380789299, 13835694922459390849}, + }, + { + {6367771991991911192, 8601334531593085019, 4312076039860441887, 3349991553201651706, 9823362064268535912, 13889910441974079325}, + {15204812249791097149, 6041265790239125946, 12691543265160543238, 10306665514263435988, 14767325902815340861, 10379404251573981879}, + }, + { + {5287451048506707013, 4348959316051807494, 2195731310084877410, 10147908105969953285, 6603704322303743751, 945595692043651424}, + {8176294556983740459, 3760024494015990869, 1596032494450454490, 9532812003368449590, 11266525576652515928, 17675618372058806611}, + }, + { + {13713835993913486801, 7766578236545921171, 14534805690298336184, 5666909695385346186, 8839507885361423259, 4694981751780603071}, + {17723407317459630378, 4443283331360111884, 15519272406098385785, 17520713768065915126, 5696872215251363099, 17703348601524604831}, + }, + { + {2164215638320833038, 17121084597475879972, 953559170830523874, 9824463983667276307, 14122056531227172478, 17378911366973403187}, + {11224042629539202120, 9891688504526640813, 17195883541507550243, 6329564008856258694, 10930601382660244797, 7336662048169067742}, + }, + { + {995921546101717569, 5828224904318233156, 8250787968679150139, 18216596344319934990, 11999487189021985197, 12415115477515701118}, + {15186145702255030700, 2113607545324837959, 15288422804320951323, 6325938775505173826, 10420910094419414217, 1927106976056222556}, + }, + { + {168373835175327962, 5954547085671796454, 17463611069868415386, 225394552152764446, 2307768634143069290, 8042600063379354713}, + {8117902579268801666, 10832127345976105061, 13664993000566573485, 16355061628853536029, 11258951867911128064, 13533986249738933070}, + }, + { + {2256466623088827889, 11490136642947524148, 10955178908605173832, 370819964681409304, 10493984649757869556, 5132627896758472655}, + {6336091067505438921, 10780074837814789259, 16645850939014586085, 8079913953781307235, 4062116077218792165, 9366190569985953070}, + }, + { + {7040462669310098393, 5297122089825027264, 17836763057295674752, 8661859425168585511, 4207236964581867607, 16977003945502762190}, + {13639729604193903699, 3075230971516641826, 12603679116623626959, 17929390171247529438, 4340045624055496198, 12958507460470817783}, + }, + }, + { + { + {13603267959306598193, 8693043305222262466, 8385036129731204785, 17301749092100773230, 17293119319290412054, 7997938435970033452}, + {17626685223448488356, 12525034788314564340, 14661668164222586257, 3322104272345643135, 1609592810955141849, 2549513802617457284}, + }, + { + {8798435167269930640, 13070514712052083568, 4736461614042760363, 14206975230185412328, 133298083050190689, 3881702371340834770}, + {9708307132029784886, 1190148038752103456, 6413103290824094803, 13481632314215227255, 13825269422873963023, 10412305108920689107}, + }, + { + {15788775674106557193, 2647031410423879993, 11824234196304518021, 16508012954631132049, 2851858215553102032, 9031676847819265350}, + {17056269066330629533, 16578781453141932588, 12149327146251727097, 5603735625820741662, 6198349307184960758, 15317416179414320750}, + }, + { + {12101899190913284916, 9608769495503265584, 15201140684891239564, 6542484635045229965, 2916993459978592676, 4802334108209352673}, + {1973336680768349386, 12679196129410828967, 13463385388413200455, 9654153036115837558, 16342609945030294957, 13480152702062555703}, + }, + { + {2899711161363462805, 13301605990446182752, 13405176039316030122, 12694240906495353636, 6028874869507943666, 17436011221762298446}, + {3799912876591532513, 3287947124836704136, 5920239729516121972, 4658851572162401105, 16206677545960268727, 11754748256988512736}, + }, + { + {14829746466477852272, 8785495584277675921, 6423194551544767939, 692454830006456519, 231353646984097766, 10478691929706490052}, + {13187510740839857109, 6329453754316993892, 16082691749983710504, 9140500440454110398, 1359919744529707405, 5867635887532143880}, + }, + { + {8283409025155305021, 8326153006408425638, 8192125950875031557, 12491925510388767602, 15318184472466947145, 17174845401039236071}, + {4024628118229282985, 15541859898701908579, 14997151867577432677, 2742910007129941237, 11281936698759777841, 4053513648766184443}, + }, + { + {17504540629335028708, 10934158903032446529, 10440102841886099171, 14945242719790343095, 9216441307898357664, 9638980805394197765}, + {17980359344968817157, 7448102317851383292, 6074361339806645900, 13629660188149307441, 13004652602731784581, 11547813582289855464}, + }, + { + {5835495230485007597, 14350772393378726062, 8747233229858209651, 3317935002292804215, 1073070181947964939, 7460355407911594663}, + {13395345232316724375, 10346078775799124075, 13798478435639795560, 1629058324627559163, 14747763100431935680, 15299073526901740916}, + }, + { + {15651423385292143727, 4846110050285526280, 8366261324209130800, 18348748562705004572, 1191482937147378439, 14318163684990419654}, + {5828426112534678889, 15752453922521080195, 788797916869961805, 1050155050965406592, 16245505178409635417, 4624404334332384586}, + }, + { + {9519649412281579636, 15518026566172043316, 8230071711608174064, 15501328228846578396, 15538051064956598926, 8638696845481203911}, + {6545591773917305375, 5939294308617001483, 5916517198820221821, 2183353220433638210, 6608710467805325002, 6375674496051123629}, + }, + { + {14599741493080584733, 265043095998502009, 15590157843765788733, 16283462652920133690, 127450980034769700, 8101994233918053876}, + {4354404904705327864, 10527772165440476297, 3472213175562207788, 14083669454947716927, 13275423539077686885, 5338095862941712423}, + }, + { + {1235012355674231855, 2090134554838509585, 11863415298782072711, 18023496095060787824, 8410498900143253177, 10594109983238360693}, + {17550081202781797913, 2173651076708559007, 1186671825722566228, 15233030551314777921, 9888771203060958359, 15468843840302879988}, + }, + { + {11461190636282409817, 14308116091595492374, 15509337886967718014, 3305520874657987597, 7626903910031076977, 3082923764612175270}, + {14811303431165168732, 8838542203092895295, 16984937260064502824, 11714999386942378861, 4897363879848520603, 1001099817032265897}, + }, + { + {3637674483014131572, 3117885916559390287, 13017322864107767485, 11567467141438885182, 4996993546175421383, 1767669170792783157}, + {6426400534208188423, 18081501770343787332, 6628088911946069490, 15549150917856099952, 14206743374618728130, 14181348296669151521}, + }, + }, + { + { + {7989198143366045630, 7010829800355578048, 8546053455940578601, 6881887443026808498, 15042102422681491309, 5420645403520488369}, + {10849333199099746435, 12113569487191320877, 3246658105605143184, 6336537385102402345, 4597429228667676601, 5272271520244435977}, + }, + { + {14306638724632781511, 5757106316922152519, 17125373792178988648, 1583100757864258958, 17360083944987639843, 3920600288799646538}, + {3331960036348075865, 16584227479356001542, 17306396376373940447, 14759099067984370905, 5812518892646247762, 15782678322655568927}, + }, + { + {5413193268301814099, 10713883248352187164, 13410675108716405078, 3585734128190446197, 2777085511140743921, 1755162931158100151}, + {14101275991297185856, 1707557804525078570, 1967729659696736336, 4823950423327664451, 862801022254850239, 12435639820717247064}, + }, + { + {306679465712635984, 12152848986799385191, 6883719236152567513, 12305822533289967588, 18402162608409722972, 11108631399674712772}, + {2571321336657345725, 5282906424085283199, 14072199601206037589, 6326969628422378510, 7257345697465293614, 15327414546710657910}, + }, + { + {12201144960808694291, 2266284960898988252, 8424553153700131642, 9167059607375209949, 7355136040026239658, 2541478780035614622}, + {16506463005253913043, 6582690723164939915, 6599951765449856592, 2404559737777750863, 8780347760287852096, 17846128204113467575}, + }, + { + {14860969561074928871, 4809849983665237968, 12242711789150271258, 13843481869678455226, 14175051524655250463, 14334810640036579932}, + {11575444057028938068, 1682341910648266103, 10938858063273491391, 4341242396287801217, 7613196676950010801, 2500752005513253600}, + }, + { + {12440061027889587972, 13927371198268500445, 16154935051556123915, 18096961537601388555, 8424464497516729675, 2313786208528450307}, + {6509771027110309267, 3390162382665127855, 14587068644788920599, 1328169351793106371, 10509868205576387317, 2765759870517196435}, + }, + { + {2900406544253496059, 7303698760912649984, 8691265875763036027, 9197553224083694706, 18352617242438717063, 14750961326114925844}, + {2499601025675361076, 8368427257901887897, 18132146080106643208, 1110936544903604055, 16261680704811161606, 15090938849013897133}, + }, + { + {5870727586880606917, 3817524309119245910, 10695436097727319065, 16784573325267031769, 168386867463964139, 18415971011491165889}, + {13492479568749674699, 15834291406704295009, 15705574100744201096, 2398014061321015822, 12468258805517123137, 13991053711847966585}, + }, + { + {4169557306961711707, 4015219248181969243, 12214392270444620774, 16050078587473704262, 2784750252993704422, 17395896913298686268}, + {12843958296305025565, 369831555843170916, 11677678398942896027, 6641755134933316997, 9109097098896451407, 4781721487698386903}, + }, + { + {1392099397992149225, 6653317869794434155, 8261302057061700743, 17076785984088590530, 12214500026419464516, 8183114113550743923}, + {7219173278975390146, 13854678885102808519, 52819572796104662, 14959508682837821268, 4666245422256363222, 526398188884660107}, + }, + { + {146377064121748072, 11117625842528721265, 16508297934345517505, 13963807611317318780, 15513104757270430459, 9486443679271300608}, + {8499000076286979115, 6314693643347125094, 15660966474005923460, 4849442041573028425, 4417660487771261375, 13534789771025100765}, + }, + { + {14165452728554216170, 13694105377023575661, 12112553140758207627, 13499340770701043478, 10416006904191195926, 3543462727896098709}, + {4066244216336615064, 6569278217794074558, 387967286518318157, 270108989062251217, 16349063922035707389, 12438514695154831396}, + }, + { + {587040577811041823, 6936770533105343364, 16776134995012734224, 10277362302644779257, 14649614714574251627, 15051066325824432588}, + {8291129711414316681, 9551002213274431576, 6676196382269508743, 6874374105452669031, 14751197759974741889, 9029571467065764667}, + }, + { + {14428258617344372219, 9908056332586719435, 3405976719581642508, 11387547871499772614, 2994350212903836640, 16490884790412572450}, + {11355150127282843741, 753093375853717498, 3493937923504423687, 8754398622695613018, 10230143170990690589, 8594587862090207256}, + }, + }, + { + { + {12025065147930696764, 16395321909258498666, 17254275975074883492, 8698446818264119462, 13921708813901601023, 11317527677055938762}, + {8372735897264020153, 3995509821790542114, 17844440857746011127, 7150508535332996970, 7856356095447891107, 18425881274930431587}, + }, + { + {3868179882159761840, 2264438469296879600, 14040732472308090308, 6176899669975159097, 7687708097392128226, 15700212396478219258}, + {14432188665158358139, 14093430104632320380, 6658435239629637912, 16817255952598430533, 4042186219830704930, 5581603010754890001}, + }, + { + {4194420838030196541, 1333911740513429952, 18216514596089176140, 5522562721578975413, 14019454638832409935, 16180950399634304052}, + {7874407470843020638, 16700170713448853543, 13238545221113708433, 17341343942946679971, 2492905945545894244, 6150964092835885281}, + }, + { + {9160207688035903546, 10421934692844981887, 12973343349121023222, 4588457373452478724, 8930230292368920615, 8764471311578947963}, + {2287273259416958217, 7105649602824330442, 18442962768087545765, 6705276737238885061, 577380682084602753, 596787676998246106}, + }, + { + {663478452777260243, 16283602145029174982, 11124685403360893629, 4781563535459832423, 9323851769832103844, 18097969442952761286}, + {7837190984970827968, 6643489635464035580, 17874774866954327612, 16430201046158097201, 12045640219457858446, 6223326808284158866}, + }, + { + {1657492744835373106, 14305521459309102400, 3869067393311496051, 10037235265268002078, 795960391565742762, 15570341341842321230}, + {1416215615272420305, 3844160609182024535, 5420451137511849586, 1949162974936638642, 8451435764323596076, 8788000062158561339}, + }, + { + {13928009376574601896, 7291171400028186761, 16473025605005992076, 16638477947212814985, 12047811767976047467, 6878298473296735831}, + {14902080744924353595, 11030229314796494659, 12098457778174714596, 9424760405850702049, 1497914805837158259, 3249894799792534256}, + }, + { + {3590247938838498240, 8806692635119047359, 1698761057036684647, 6343574101558802001, 3746591523512207350, 16046850941587493893}, + {9375703075091035250, 11484732524515574701, 10605373578002057385, 1718556460448813872, 228246291976542303, 10311368155034743860}, + }, + { + {13497031464860502366, 9397761439599875485, 1318541732049664766, 15374121346380046672, 17717429548790284664, 5159388673283835821}, + {13355298244502234884, 9645381144552778188, 15577838213165745473, 17224721347234155862, 440552977874015809, 3485586753351733297}, + }, + { + {3516261141390918044, 4335927420212454420, 9153235025059865419, 17728981115683781993, 5407851417900531604, 15034043952911725703}, + {8360898999522732095, 14154807375320553311, 12720119837506596047, 17979696399481662488, 1503715168515766653, 5169207090054716326}, + }, + { + {12162980084934091895, 4233957881103578519, 17170356997174783866, 4243094926092018555, 16613894431916307329, 6606193115702532471}, + {11789634164556738593, 996991792386448418, 6962245779712200787, 4974442952401074444, 10897550856395547118, 10995646432875528213}, + }, + { + {17102632525353385033, 4726908628368929907, 4247885372815903947, 1788394963141125417, 15102348628480678182, 15128367306207476457}, + {3972599649912410141, 3921603030106002483, 161288956218192081, 7338348096295758314, 7143236202635983396, 8624888890090620099}, + }, + { + {6331943491044463866, 14228029352154794719, 2947037856011623469, 11772679753184455432, 7465692292318631028, 14289953244793202905}, + {5134250825128073664, 17656488618598423937, 16854119307556681012, 2421796355445999202, 15424387029136720472, 7987182987578392406}, + }, + { + {2608951835161989111, 14588356830133736122, 787581713316032185, 9896238476586952494, 4431066364605451791, 2903280281635265356}, + {8247495622914418748, 11683109383984515972, 11561088616384052872, 1149723125258168883, 14529556212737756877, 8912094569277399627}, + }, + { + {12789135954360228010, 6780075827365568571, 8810224435698828502, 13446476233477343302, 7214376817335187762, 14458570598448093615}, + {15615130062596991276, 17246585199766548683, 6890348740309790991, 2462037107533762815, 14348419451565630896, 5342642686877329738}, + }, + }, + { + { + {2905464083126352106, 15382523776645615659, 4208326436876253066, 18269526693635159971, 5790854390728730522, 10746880826459375258}, + {8662248081050622522, 13826611872785505390, 16436929138283976510, 6326154269244482967, 2880171501306902421, 6678386436918333169}, + }, + { + {4081558640315641247, 1910870639571469881, 6877171221443835842, 14157529767685404063, 7740037116920621887, 14764919955763458331}, + {10267569861886921827, 2529844482184019983, 3259055836051436011, 12721359948163822535, 9659485045930382444, 2682511237837334805}, + }, + { + {6257278162168451228, 14804471928370352903, 17266243102614466221, 1834384770768531640, 1291836003048662370, 6034253395610136614}, + {8743066898222911631, 10312528166509794599, 15491664890314077124, 9459311605542100872, 18188244670802339459, 11837284714306023066}, + }, + { + {7384073074546884058, 13342536901934035362, 1796642291707654196, 14924003300567702780, 17696513874113839739, 2170126944979395945}, + {15655425421070558346, 9046927642313144782, 2539141704545898189, 2313651783662755544, 10988582385563170062, 10708895281446879013}, + }, + { + {8049823402121284107, 1015261354744953141, 11001601026371351857, 5188408555842360927, 238307893716713840, 9306355674483778871}, + {4882696385991861541, 10855316230146219920, 7297309210275934874, 2129929538911047623, 6105877736586220144, 16540174430975243109}, + }, + { + {3846553462991609521, 18287444857448547300, 4860654016674888150, 12102465094571524845, 9665319422122056880, 7341976002114379270}, + {11450690261526312033, 14359620265055539834, 2129613678351742251, 4154310935547659871, 17819794191738178105, 12470777076380361738}, + }, + { + {1820231603330482333, 8197912473886688932, 17564410961062418802, 5547060850511847496, 14784446920715373986, 6744079834192692285}, + {8045763461421446101, 10946745933502697155, 3334195578263537309, 4155813158460651681, 16304254047867190720, 9129755894729457353}, + }, + { + {5858270368901180686, 5650671310031369526, 17358036986724164367, 12272486751450316321, 8118942123504245440, 7605341247988122771}, + {6460053483168551327, 13974980628946427300, 15265461046774765196, 1434115779622874584, 18256968071394468929, 162814016140883808}, + }, + { + {2332162608871511375, 1868148336815015635, 10688622518437469162, 4535570520634779462, 5558414024910369005, 12846608910105978921}, + {10182583164281883737, 10225962215828780864, 6647302228613027609, 13926246345815428275, 16444874778110264906, 12426728125906820495}, + }, + { + {7319356743643981758, 17290801891240533282, 13680538635395325509, 9431898857998460284, 9654052594732493588, 11216128628361019165}, + {5480652586120031716, 12264251589473554648, 629460023613249876, 13888625092415164277, 5982727213326537179, 4575309381338208673}, + }, + { + {9318690217895942273, 3885888063527830607, 9646742812304452818, 18262479706556902502, 3620133047155459299, 18388160719790129736}, + {1914761448944519470, 9758008627466255788, 18418420068679038400, 12896122466120836747, 10890035278343231294, 3646620616965601722}, + }, + { + {7320055252736060853, 1303381685630079106, 1389396534790493913, 2784451395900022634, 12504771187503822515, 4227927385881340861}, + {12071605771892533802, 2754948426319968897, 11085204177816817620, 182697453064193454, 9227505917134720328, 10621984715679088732}, + }, + { + {6220826937720121878, 13229947210201087101, 16420906931171635230, 4228069687275537145, 10649909068460962812, 14974797380841429985}, + {2099387861104913886, 17576472277696906704, 11384913496578412357, 6794363617398915145, 4335808821084623592, 9733284623560895058}, + }, + { + {1755145516295475548, 15247893042361836531, 5738179788894433569, 11279068420917658317, 4290389521159722087, 14365410757465934654}, + {7291605289247002500, 11812770986542211322, 48289046067440439, 1233419001099601995, 13182799439408327769, 3066909062077171440}, + }, + { + {9251396949650789431, 10964669964980210420, 18441875565843264347, 10766527953487419221, 2053504370587058697, 1120548999764652480}, + {13156388621520434359, 9488348829267331096, 471226560476910099, 16729073468825516463, 6843824047113762587, 932518740561235009}, + }, + }, + { + { + {8005022716490156292, 172470276668278570, 12027061491585017361, 12668206184074529368, 2383566891938055597, 15146733507906754355}, + {7778895097740687136, 14251829674046124789, 12738613561581015447, 12051618485845136097, 9897878846738638320, 7907234926402663579}, + }, + { + {10065252555514097915, 6386861198439688962, 2775722427207394938, 17952746237366567827, 16390357373389037601, 13972513434252720715}, + {14700210881752165375, 15185652113659869954, 1923970725644198719, 12211789976130827254, 2585886428464543151, 5288489885799434816}, + }, + { + {10567691911424697649, 16971243382477786521, 10251841113143443125, 1687737920922643646, 3746145726913279586, 4786791138611857452}, + {8476041976560261273, 15570593593290952605, 17648077308436960175, 5839063770228102907, 9706501119134890748, 6475897123160711932}, + }, + { + {16272681470773409672, 18157143820860266346, 6874350001337166182, 13501252460259511743, 17259688624947069488, 17317925810681384843}, + {17458673210103455399, 8293651101654188440, 4287591827563518608, 17477963865483680843, 927677871568183454, 4257762449075391782}, + }, + { + {8076033399227106890, 16533143032280607906, 13521927650080284497, 11510742235496409044, 773074617642472847, 5480268378661415914}, + {10560774877949781007, 1551950937282276704, 699681785268341449, 139399977164437031, 6186795762861491620, 10490971431428917955}, + }, + { + {9190090661907342314, 10353817139393866538, 13722719350565763089, 8086989101739556304, 11831125735426804282, 6527360398769008658}, + {15661687200097987699, 17883372000534567314, 18228449294037686953, 16276062303086046777, 11067473153184484205, 5270793026007762758}, + }, + { + {4644322026860926003, 13840860549436432899, 773219189435319969, 4214545261061108721, 7349178605060789384, 14108663996709041985}, + {15086368808776131018, 5873313287260733157, 10958955294835479142, 1029190239709350397, 16575148148212140239, 548824197340738121}, + }, + { + {10538023507650655080, 6405097420742099168, 3772328850901597675, 13431850381701237922, 17301482879787833065, 10960182504575418989}, + {3458141607490423836, 15983729892825441020, 6674827306666597406, 6998631059837206710, 10452310379665360233, 12442577005422810090}, + }, + { + {6357449289782518654, 5562676255948928403, 4267773668505879348, 17042466998439942315, 15445173922414204273, 5045693191253100284}, + {10888452729312376066, 7286005702779769520, 6310396517254538489, 17973884204765258948, 8552375160420880806, 9676186921102873385}, + }, + { + {5132936755125381856, 13632397944410194731, 1195217251618711717, 14192521157173466766, 7136777102122506464, 4992685048206006386}, + {12758444670751645174, 14211008273195363585, 15176937626622599827, 17548458272828201751, 5057260891126473883, 9952036262648196850}, + }, + { + {16078498188091009803, 1162033447512069931, 10059309132406299500, 8829937177340388978, 14448159399458657941, 374069359661101813}, + {13367213118297441109, 5274140197674632268, 16907854435294080281, 10813040207319437761, 17981016036466195869, 7390729432234187734}, + }, + { + {927041625307275433, 8960709029455529859, 10831922670190955819, 18290821865497267571, 15356340336167722251, 1277117312667074566}, + {11345332917031878869, 14333153309564749909, 4757616462511080414, 15371264136186622670, 16048790410218032652, 6253972033361590906}, + }, + { + {13515732918257273776, 13723630809424897822, 1256040724895856748, 741241381320040022, 4179658714379202158, 7700440732059923700}, + {12620782566472061643, 8647092247759141584, 14556418162370042196, 10398569400923172183, 2942763850561441253, 13510474539740910285}, + }, + { + {9284152513908444951, 13364815009916075834, 4919960874500389956, 11846737451875562809, 6206281447342218811, 16898214858205632546}, + {4777300224767696450, 16738332457351222374, 2425414676554916356, 10738169294712527458, 8592315599382595498, 779347662452931693}, + }, + { + {12657704884116037495, 16629278614392996531, 16644595643705514648, 13083603858484073418, 5531378660228117371, 1072715305930583874}, + {16281698922290258814, 17101495949789370442, 697325071236988515, 6834733894203542328, 16874883980138472052, 13765652846823513818}, + }, + }, + { + { + {1443983809817335050, 5159436179287288748, 8718823893455992642, 13859422481759839054, 16821370532543822004, 11312232963165366867}, + {16799784256686916142, 11063086467296440173, 5409640362054745615, 1744861157419261406, 9159074957446964246, 14640106507936810200}, + }, + { + {2855230597739850155, 13620723665924576268, 15633539828476547165, 12790587404740345825, 14929382470136573230, 11024875668098768390}, + {9757666174600838731, 2232369412498935956, 5843374372613155338, 15919240107279516647, 16925041227711211671, 10150031711225457751}, + }, + { + {167838721727610261, 7541800216831159956, 18111323457358615697, 1375214001809563574, 12793193868391341616, 18288999141676090200}, + {13741005234449322878, 11213622750935649716, 1522802528596667168, 15269019072730025083, 10719991413129377137, 15521380803604598551}, + }, + { + {718529776434363422, 12683359777452057212, 2804554777590895595, 13664120639095226495, 13598640112814221798, 15241444675921322490}, + {8810840946828957504, 7811396362330849266, 9645885245397761208, 679907887946404609, 13039332546165252336, 8209508558765517234}, + }, + { + {4626158970998280523, 17779366207669178780, 14066716967377837836, 5541345249351270224, 71760835438433145, 1781108686838293059}, + {11015261109851457791, 16129646178084531488, 10669691012640045245, 18184224459278962224, 668895765928111620, 18347537117071351865}, + }, + { + {5383950189451203046, 10844133140951324068, 2374979840933487414, 18242105404652163653, 2153887761192573295, 3314974606006034191}, + {13575532204571281217, 2247071187256305144, 448195274692108969, 2053979169079271594, 13812860435287696334, 1732389448089431296}, + }, + { + {4284546519240384782, 18250416328676695864, 6075393821764526355, 6803234443690359332, 2308015705795216965, 14282768041402275649}, + {14692234199015945763, 10982825331872323691, 16257836708673068915, 9290937795903983017, 13215156669957704998, 13581066011281717289}, + }, + { + {726662160657361021, 12794593883926219472, 7861799432245846591, 14620923059626590643, 13564033114045541206, 12056825063290520144}, + {9319654440973526666, 13306574040007137554, 12383704628262510604, 16837061611201648320, 5148924680488916382, 757589831530246899}, + }, + { + {11260142852359901856, 2910994799586619654, 8190175402543023708, 10282746214391918351, 6197128196041568622, 12103744805432714925}, + {2754925794608765953, 7213719752583096226, 12149382823057292581, 6622803011412572659, 1043029140538289242, 2160363121257772533}, + }, + { + {3959688648190130918, 8473581564018232725, 8102575542433283254, 17478136759519300612, 10782499745742339984, 15960018897339834420}, + {16254514834142148732, 7808901449511931787, 18330166307905077063, 10432644456391460073, 12246398526421152951, 16631198455707802675}, + }, + { + {3447922898029507114, 16051230154621670189, 16072905312851388355, 15031563884401549512, 14706198388315798396, 7847298879472932181}, + {14334929624882962482, 4207755459965567091, 2727607546440637589, 11028268195413273994, 65681139350480862, 10388523824998445409}, + }, + { + {13621028160954218188, 9189281248079816548, 6559689192872320191, 12511220059980672697, 15021931978161570527, 14942251476194345708}, + {8032030039336040011, 15968186657808771957, 9377328317206799246, 11373269023340235305, 14864609151221526904, 12259184676083236409}, + }, + { + {4993001240436128010, 14622033823485440043, 1269131542761241152, 3340746980531933825, 7474601841448992000, 6720228020507007935}, + {7637406401737657019, 7627450969186809480, 16514017994864839608, 4814188734303098279, 2484761716517021839, 8799093000399717716}, + }, + { + {12269127574265060145, 9724465093155898416, 15873065313448764429, 8761869776521026054, 13485847957822391857, 2439524426319009706}, + {2196722629873916930, 16606975023104026874, 14395842146577003711, 8980633514374222856, 14337391476390507239, 3245539094489483683}, + }, + { + {4586284023246783172, 2578135446952921534, 16829066520710412866, 703408518185354273, 1484970151848468921, 4187259876483048418}, + {16026918465565392877, 12845800470973132882, 3563015620264375279, 16242852718263860671, 13711297870624837478, 10327260052313469500}, + }, + }, + { + { + {11907264597133981686, 5345484317343243432, 3526298189589605651, 14941494503371346641, 4390348405627321537, 3075441678856402034}, + {9143920156043167932, 1663991502233570797, 11411151526779617123, 6295062208334296723, 11167953874910400669, 2847239470361941655}, + }, + { + {12048307220520866404, 10548739433510366959, 5828937682586289028, 8259138483713638196, 1664521593180101667, 15076565371876670808}, + {9031856040208856894, 7347877633160823775, 2684001693679752997, 1187394758632407893, 2023471202170921576, 11368770613720851227}, + }, + { + {17683555864724676435, 13968533138851757949, 1943437173787895091, 15827749049763045012, 6987423277000309812, 4926724831615296075}, + {17103731276906243966, 10968826448844601259, 16352070254497671124, 16551824619482611318, 10381849412124093967, 9436665416229949512}, + }, + { + {7048379827497088065, 7443977613807482377, 15322620479477551149, 5013135385875340566, 5747364795223736553, 7862606879963470164}, + {12609816404493593258, 88582923555110046, 9264042141620870961, 12622483743145618453, 36832241874005927, 11846454950663675962}, + }, + { + {10498869048482452833, 10139776276152664444, 15056732056726485889, 15099480040493702355, 5399073333783908255, 18182172735172720788}, + {13323470181256898728, 7293540973022589120, 1981283917056275351, 1683846209255518469, 10681059793003383268, 16940960671858675128}, + }, + { + {11079616827562091047, 6298929519625833683, 467167558554168186, 4358762903022032877, 3416306995690695388, 14393771751405339556}, + {8542268838893846242, 13985040364793095543, 15595485032978442778, 13710848327370489861, 12647895656520219232, 18141386123053510590}, + }, + { + {7421011150990207232, 11463423897464684083, 11777398400930295903, 12887147976139911049, 13452389883052007052, 4276539450334756600}, + {17003232901404646154, 5648172435840152002, 9060551298958599769, 9865768386391095478, 2380928329972073322, 16806909077051674163}, + }, + { + {6879794746887651427, 15191659499793488108, 15434300527081888859, 7856295689590209271, 6774603981548851786, 14620245528126721402}, + {17675423419823628072, 5010454868432987998, 9315026554545892356, 15171741100035630176, 13503881861133354654, 13836586572609238772}, + }, + { + {2081093758072482234, 2160302331720847475, 1771001500045437109, 524929417164114132, 948139338327583506, 13116239640907621525}, + {2067558540785058447, 16015346840737264408, 8998465241460291405, 3205597488226039915, 13132850068494171809, 12550638131827261524}, + }, + { + {11487678613186732166, 12226538283374456197, 386046383678908710, 261136384486182248, 6073820936063889754, 338089910147739013}, + {2204520790471760666, 13225443348522804886, 5533826822105659739, 8067241596100405272, 17056747808692642524, 7928554988750665570}, + }, + { + {6926667811451225445, 11361726998764751598, 11858255027279547942, 12874828932074051770, 13844212609147206062, 9229674123496154728}, + {2157148641194346791, 7533189974437599411, 3818533723919763688, 17102113454166535674, 11957918589822377676, 199286897588186765}, + }, + { + {18098297521262853561, 2549150080497419905, 1920476418432176737, 12406241507983538977, 9994324328270480744, 6865216726931218199}, + {10882517499218691272, 3878271624739672851, 2651991057058067418, 8041121093439073066, 2863398953389074916, 14090287437597767123}, + }, + { + {15691539065269187690, 15926915037487623140, 10414347487737173015, 4830265708288246683, 11328595530368816451, 4903535768556567628}, + {12008565653438033332, 1571218720864129835, 1840887482550755461, 6912046034772469524, 3644063824758321256, 2126322707583833546}, + }, + { + {12169143892540109486, 6002799381834121764, 9166177939527749537, 2717071050858554, 14132387690398409212, 9461668085670424152}, + {4615175463679096657, 2777593348175259115, 1086524210167200873, 3727975968832889444, 259602294277541227, 3220284105548094890}, + }, + { + {7567574313834290099, 8145437034220375349, 10888802157352801074, 15444274935766241808, 7033566652389697721, 15084515844524348642}, + {15010111241306351000, 14537704976709260010, 13901878997182787975, 11697236875339079364, 16516786017890903855, 1661580686211855443}, + }, + }, + { + { + {15463648276913935878, 4382144021532630330, 5071136388542935899, 898357497003506891, 6306262877201485580, 7503267895380498351}, + {12209894407081504812, 13537298049306094654, 684729356387257364, 7075405619352396484, 15714299178550944331, 15696888615882072580}, + }, + { + {7477407170849995021, 13555863987096416386, 8646006234528633039, 10219427423139282479, 16098841852404237961, 8497637134921782372}, + {5309688570092265610, 3976413109977205320, 14825158186275338256, 18330027746161861298, 8379597551709481692, 7776375825952465168}, + }, + { + {17368205043853313911, 11366480305058719483, 3986491568217663545, 17776307296855398379, 18166640678790561016, 12400054106979718042}, + {14701884885297130131, 11997630432923609339, 2316884967752005589, 899451448914269587, 12320093108807155483, 13224130717820204708}, + }, + { + {2301120181151250930, 7134427926629173419, 13652391877351066163, 14358476347223217001, 7720954555948039363, 16079187223864015439}, + {16130714394389204488, 15060521357793404892, 6157723303371622460, 388433905262539304, 6397942210441116350, 15870010555361278310}, + }, + { + {8386588512253237744, 12398600073071431889, 15704645810442703641, 13918516392916317159, 4048204874387041555, 14789502552726712590}, + {10953546364075891631, 307391290824075890, 4085950680975341402, 8528936851895154413, 16191803140891684852, 694681636582541066}, + }, + { + {4052072016637665509, 10815871552988988571, 8015406219413895615, 1996664536108251392, 15055672969658133547, 11345388978032390658}, + {3833741327008156172, 8078127745144700769, 18219007769895676040, 12373542083253387973, 10749960526614124693, 5297937097120834946}, + }, + { + {6473608164798697997, 1704324113009551078, 313510886399003784, 7482485442761088384, 3630467062499177474, 17889206319568130728}, + {17813422549220613506, 13365489546100356563, 3642293795923051505, 13366391632389811062, 9309608098424960759, 15583860066261322393}, + }, + { + {3920285757492003115, 969197763731201452, 16178147428848039825, 6611676964264587135, 4670040846705473526, 9965087165592606467}, + {9385067634888736531, 17301457722800757500, 6213258855206728473, 8445301014191943446, 8142518927165972910, 16360532488199989251}, + }, + { + {5265906353635046495, 4989115549924370545, 7716029377102384472, 581999053178428771, 1927216309428257662, 16726029285829946215}, + {13608385105784378405, 16390741907364333262, 2050639151388485496, 11880595111878011177, 11418095767233061977, 6193391483702304675}, + }, + { + {983944277502152387, 17618013366706679742, 13527856424316363938, 17809004578576556920, 16807595463159644124, 12659014490378234561}, + {16660215596018323668, 1845548200977670934, 14981347628825634975, 3292665052105349975, 1255560706381478700, 16841318968187590600}, + }, + { + {2665344548535488753, 10749679950323224770, 14480048826753464948, 8103744201764603054, 4292621633536097205, 17368247036505307539}, + {8629653144199349731, 15713695068648974367, 1391688109689860259, 17209900783908384199, 16396814162862442509, 5977962909365766241}, + }, + { + {1765723133486333001, 13553591410290383834, 17120307789275811780, 5867585200918539797, 10340378507202539704, 10417992971032525897}, + {5521483192544399925, 13339071700237022049, 619482636797119427, 3159013689121603910, 5024096637477394285, 398928734167456668}, + }, + { + {13703486582158429978, 4835870969542931590, 13849753374989811859, 1366566739320000236, 17404228716488772409, 5130516311326930222}, + {6137130478942191139, 17716584582497907230, 16134870936885120581, 12112071202840308227, 7545387975022640244, 13816774847829473152}, + }, + { + {971030984593369643, 3220347373596070794, 13959149202405537534, 15516864884375555266, 12029622495808712626, 6647055389116471320}, + {11132585267709726879, 9838206173776721087, 1787590871969783091, 4539972049341594577, 6034675663835419496, 17293055497219064814}, + }, + { + {17570642940564731459, 8213552062444081653, 15593226808110603739, 3879030828893359677, 13433601001024396878, 4211122738890174635}, + {17934189169765241763, 10790041884906581465, 4207951857220635543, 12628418922625498827, 3341984002885074575, 6259488712494116991}, + }, + }, + { + { + {13403761680618042221, 16536343759299396957, 17972613761828085938, 13333143634871897494, 8217080844173300090, 8327319758336938056}, + {11266549251857186424, 5632462193213183426, 12437134888406006072, 18063700593397823279, 18150635335174302985, 8092211028476756137}, + }, + { + {1207108350681107077, 6429062998832911556, 8673250477723521447, 18170583393512312328, 3550801055781941700, 11719672827257672268}, + {9655111182266878395, 3132327691752397108, 14419687084811747991, 13073348421646940420, 5049344006922558667, 14000517852372127517}, + }, + { + {9716991597801328457, 9345079756027796093, 11200045987212678732, 8772280601358427821, 8639259441726405566, 12571033841874242820}, + {17715089933168590527, 11095491120411888771, 13347464584416454324, 485046159821099087, 571976757247075453, 10200902628607063580}, + }, + { + {8660499117188074779, 14226599538335222514, 8340352780522593400, 1946310520997776236, 6787355814568168885, 5153689776891688054}, + {5667308841323258461, 11049803545816366962, 5483549481076210859, 2650281183298359631, 10767231237699743035, 9742809143935952370}, + }, + { + {9986140370114486237, 7466209585105907907, 1754679179647126464, 17945009041507108637, 12527902125314539776, 6140813986326054524}, + {16393207997039569607, 17870467338953320569, 11842665547915567264, 13006120953816441470, 3548078985168965983, 16007487616892315454}, + }, + { + {988676199292814316, 13795038563960075881, 16898044307644951136, 1804989563201918949, 2415690271309649768, 1403951095677177318}, + {6559788013277581301, 4206972693543414726, 18371258651929788196, 16216427380122603337, 17635684431775122262, 9400941069599463959}, + }, + { + {34276850896178184, 9065645945697227102, 13317573345776592985, 601525926235193053, 9217981927592209636, 12309969749608407478}, + {10546130936371370328, 8868787171248972574, 10889253363563606858, 6066708084552745229, 7944441856950188066, 5353076020090917453}, + }, + { + {14598544504315957518, 7432571723098985759, 10858597307591799424, 10923605445845404997, 13436652897726474200, 13271716260984755076}, + {11746484360997594567, 18260883576159652569, 16536705360207159365, 11555128771579375669, 12265809109975236207, 8710014081931635373}, + }, + { + {9533947271063157362, 3972341891231849936, 9209964459552097719, 7267309578223077779, 13770805495144557607, 14101871822520603545}, + {12718640989104832837, 8947514731845143756, 14070551777157757491, 536892280925814178, 15747030266203480092, 18200278268968621690}, + }, + { + {7077130438749295216, 6779238826822620474, 10474903966971522019, 6820278386136128934, 7255072249237041, 12514067474090301555}, + {7241461786197226059, 6467732564131199867, 3747183394163351948, 16770929168264693834, 17085066469289276480, 9143407880258729982}, + }, + { + {290347547239938735, 15468258237582113955, 660408138412436868, 1302684185031722990, 16641837582246495972, 13735740180315027614}, + {6557401589512433778, 17846464164436659617, 9246161196630668218, 6890950256970483725, 6402204265992443022, 10338073060862145258}, + }, + { + {15430861178767026114, 6156963833198612703, 18365332210313898228, 3325534901104799446, 10271591932915681474, 18275367409906466678}, + {2067293804126060977, 15233366967537526098, 5396097640022364444, 1000014498192944822, 2327452880062984343, 12841411739269464963}, + }, + { + {3385350950958430684, 606441855443472767, 13033776423762098262, 2439357857147383084, 18252952076577877678, 16120810045031173460}, + {15157581942921822634, 4215996528362266156, 6476897491406537975, 5275043577903261598, 17454296124704487863, 17027978976524912289}, + }, + { + {8644752755484142871, 7520506767179250566, 9386137872506045147, 9782131010687153158, 4578495700127020092, 4136883695294906150}, + {11998149667575356581, 11059056827970704042, 12270233192667197003, 2455222920699340298, 9618999184986094275, 6116998915343032425}, + }, + { + {3193697934884363730, 10140335243666665118, 4870491066049398271, 637453714006877933, 14709075847235147331, 13193262757253144996}, + {17938884861655126589, 15835455202328116116, 16378047501426682850, 13063459063154887816, 8093827040207265175, 14470652935631573504}, + }, + }, + { + { + {16034112998441587883, 63845002635443002, 4593001182702153658, 8670578084218703882, 15774651180914872398, 13011991283112025000}, + {15423226930432745692, 4127345328586917270, 1602656434526331459, 3487999218598710668, 1255208198000959867, 10109403147260388638}, + }, + { + {10562160444642241972, 4693105869372484085, 17703834603739267248, 9021680918874890901, 15481929100325334120, 6845602054990892604}, + {16898382896248806202, 5343640296806331476, 6915303502069874700, 12691955589654230714, 13119484603892573302, 444753398747923872}, + }, + { + {17283295680731918382, 10382975592516681859, 10060598265400044655, 1313342669690321024, 15676629915621228473, 14015433292309842706}, + {3722541864418588142, 14316642109988396582, 9534209643602653706, 13980670620545874771, 7954420611695152174, 9814225047068930652}, + }, + { + {248374788036866218, 17964913720605794071, 16982718660501411011, 16539334441772479951, 5999220954131990982, 4565255831754507469}, + {15763389274228509815, 6793638010832842884, 17795140448628569794, 4610627011608977927, 13484317218426525831, 2384269128785251439}, + }, + { + {2064700530864965515, 10923886096271221890, 3965781226482780927, 1349539335778141934, 12283277140753198011, 14288291926557028409}, + {4755291516376942338, 14961944343518391105, 14986331171481011377, 2502562775678124281, 16690683782834868128, 18249446433878083968}, + }, + { + {10500343217363396563, 14604642486751688903, 14821582350585533209, 4360682754333123179, 17373258282956363535, 6560652026876217517}, + {5925790258489013411, 12382625725858582375, 8191985561612267659, 8311548657817207535, 3006895680396725527, 3424975657919705430}, + }, + { + {786181852668121822, 3801037947411321795, 2585057011854260354, 12788225394892184473, 12121545804172165809, 11694085950174284847}, + {1454296081340454152, 12662133117530554350, 15386954396026382518, 12188364006311053755, 14067469636462237943, 6286019250473603394}, + }, + { + {4641661046536668968, 15004063183056394436, 15294276007335774446, 8657963759909427419, 8639015101221632772, 17792395880030705551}, + {11362725454724497258, 14875854967673364453, 16443994946864117237, 16738074345499328534, 11771999957157378351, 14373743150670458553}, + }, + { + {7451471218366369279, 684245731125347196, 15398340817834830921, 11295766022223517867, 13796419334827571161, 2612443196993735753}, + {7266302045333075703, 17867476614955463252, 5444704239473117280, 357656867535988264, 15166074865462198557, 3395143793729939538}, + }, + { + {9509682271313714077, 9145094498501491985, 13014758147649818691, 4392894942493592724, 11373886379849938565, 16136200415791294662}, + {15645599976658644512, 14840712622512041213, 3362514637218698312, 15450726990483884945, 3596435004543257072, 4415992810307073795}, + }, + { + {436726982121698239, 13056502432887055088, 15945046688454709231, 6523495243194823485, 9810653958526702955, 9848069844181259583}, + {16826626473951948582, 231037515307333908, 16194400318485741693, 3341139243875410050, 7198330632933430971, 7499173440340466946}, + }, + { + {7368601478194798007, 12230035070325836486, 3516680325632927852, 3369692206924057126, 3839719055081332823, 12595556495411997471}, + {8654493585319068452, 12397958396131600158, 6963511070567779898, 12454283910184705082, 15562030337854730099, 15142592400258359045}, + }, + { + {8837809708004032486, 13277037412298218780, 16996196458911291717, 15020576394594692202, 7172043530412198673, 8471665740380245865}, + {11048001909658695452, 1722104415157885624, 16816688571596127304, 326278451259665665, 16226792594575388803, 11568977043541034616}, + }, + { + {8456421891774413106, 16587861652105824697, 14920803257030657404, 12140658454692956011, 2890921724026031732, 12248872106995059646}, + {592841531535126012, 9580494709626759695, 6803986786165840954, 3665682418447597915, 8504060701005800264, 12144369197475287665}, + }, + { + {5922269777496758330, 14836479545831353112, 8253590747960613367, 7431627931206560621, 7537389025408568437, 6545197178800609703}, + {4783858952421044028, 8590095805578721626, 1536842665057149294, 8541415499733223192, 314926954266960247, 2029622086554107518}, + }, + }, + { + { + {4552857008992046677, 7742982176237677764, 12614777762761021709, 17623070834843911177, 7352134649339042116, 6424241685372912961}, + {18284550672507410602, 4854060557681920993, 10258397549646077684, 3584018295573283683, 17668477552040944899, 13192004216363332229}, + }, + { + {17395497660961887899, 16009800729326461553, 3265273913749573846, 9525956475609557354, 8008893070464926044, 3999458899476097125}, + {5718380022945515412, 17235833906403176472, 13454747352995042112, 7452239822974730986, 4102392695939993093, 2803000540861803936}, + }, + { + {16618737600557794728, 2033973305346022392, 13031336632325068307, 7832039322814057742, 12529462370460373850, 15738577000088471938}, + {277987228557519899, 2457326519366423538, 4962659838606449004, 6462045821947637749, 14278115896296845634, 5493465508681078002}, + }, + { + {11771918065257941348, 15959999845581824982, 8970191473775898411, 11027278633783758541, 9400158449323034551, 947901598666525928}, + {16512757415387632108, 12706593809124338887, 6988242886781123197, 16531083476591412578, 12943906174817632915, 7656648959205801931}, + }, + { + {9950095340907991327, 18323483036824977356, 8826742511566055218, 17289678119472024221, 16533507249962244789, 15598631885516380765}, + {11278387603777833774, 15536595680256820784, 15785905710436386503, 906326985858832835, 17435036139151677190, 6061369501778984272}, + }, + { + {9936222309360295519, 612751096165259792, 6985140021370817962, 1577482019780095971, 18261512140175647300, 2268925111829825997}, + {8997280151950305277, 15099942588201541647, 11975082702124791135, 10350894913803197836, 3939026946439666522, 15071423278799975648}, + }, + { + {11100833451065161224, 6687431061458662316, 13938739712482703228, 9097524113006971645, 11310108789698970481, 7263803389930912069}, + {7579732541402969223, 4427494314869998923, 17444201060244136886, 16922365472232600409, 4405012916660752532, 12070687041452080974}, + }, + { + {15647519617270108164, 117991711471445854, 6393176877020591891, 12580017776760024469, 5697272146318734492, 6061004989930742460}, + {2473756929649050129, 6642185257675347189, 11657278544254761788, 7595244572280804026, 16987026974396265658, 7603680608840671838}, + }, + { + {4641817200788130074, 11411582570279978213, 14271172827338073307, 983033021155616654, 8960364147838313835, 1083015732588609826}, + {1497200903677486726, 10353458850981831261, 2374066392391409216, 14420375504998989822, 2686838733391603031, 8314093359533890676}, + }, + { + {17496508456763250145, 3725851402903874990, 5215356232054038476, 8626178798561231122, 7346081438096983294, 5668902882044010550}, + {12691479253178408400, 11602632369474788625, 15888416067375784848, 5084998651123071836, 17687638434614023978, 4748093935259778032}, + }, + { + {7012591365105857634, 2874880375540929348, 3220174710965004795, 3059517961108662801, 782775158531417858, 5458085543118651718}, + {1041626186007335450, 1540954764582416518, 9157012689553456216, 6955405647089997424, 5200809672173570153, 11421235046137546582}, + }, + { + {4523124602653947973, 5836966919029851883, 15986368381641127657, 15621634437004074460, 10729890475855047355, 15294257247680785512}, + {11285439807747745101, 11111809578467323610, 14892047086560953694, 11048499802178473817, 2516056791328163076, 16852268565013832233}, + }, + { + {16471199282876861755, 13210632438290224271, 7489191141275166803, 1018062459034819295, 10390278673880097194, 8531679383922148028}, + {10429530876679392022, 16263107527863893420, 16501163786286139551, 13280134735187206873, 1020285771945898492, 9886235265786298880}, + }, + { + {3953361034531375110, 7386122381239091719, 14255034285668453820, 15785522167361485422, 515961023718038653, 15929890586479205538}, + {6439493683049357704, 8056685472536938535, 15913828424728076669, 7849931732449815279, 8828673947015448236, 17381185117791234015}, + }, + { + {6935262837758552669, 7238290685472994963, 12638530517079483671, 1598710569731665524, 980245562699768920, 877454677177454227}, + {13771635882215066620, 16040753974649338826, 7896323269797579290, 788789760541962817, 1510803060770395652, 1869615403943907757}, + }, + }, + { + { + {5531580499851611686, 13083938152796080580, 8093925535259937316, 17200389625360018863, 14842037215178251796, 11988119859109137475}, + {12263909710787132014, 13130916007869632497, 10441881769690738090, 16476642241864490775, 13984242664609457262, 14845292102137925557}, + }, + { + {12517076146320333530, 10291406855889954894, 12064707867419687573, 1502641198165310419, 5109759070771650866, 10320287993169153654}, + {8399783621045104794, 4798114569651528165, 13755067856098540412, 16302764698541317278, 1003238627835525562, 12928911232568933328}, + }, + { + {16493640364904216538, 16952576493628188735, 8338786068864117560, 8893685516440999887, 11383847562341498629, 5266455800998421009}, + {11752729420077323639, 3693269312053900188, 2099384749139572854, 18271582031918815784, 4429897358715577578, 3927504374421523062}, + }, + { + {8698070787678755125, 15703050641810248638, 18420332370057065886, 6522943156759230092, 8207665535041398772, 18112327861657685869}, + {2673396578153201579, 4785641887391457008, 3201343168686834345, 10594426270740968521, 6137975018005068614, 8967572499474389126}, + }, + { + {16980781357310728815, 9400368845185156373, 10978677447297186946, 9679748460996475145, 12732154117709762699, 11885892661392904979}, + {13639001668971925003, 8287641087844004413, 9636673197644968413, 11135961857199331499, 1593345137419156162, 6112607232727638903}, + }, + { + {1618121961524149483, 7125019653217610280, 4135046824878421576, 5280859186376679590, 5657048372118791602, 2933466611636648975}, + {5805664612181580903, 1205209836997769509, 6806945599172222398, 15385614052211122330, 5146598126955318559, 8075018016062999662}, + }, + { + {7764055997887316625, 3096247021063747628, 3855058303686011896, 8368825559451644110, 8834573136185883032, 11962274012645814108}, + {3892254476562240873, 17250665319194659862, 8912259066218683223, 165112253005842692, 7958059294996660528, 2841248137703216850}, + }, + { + {3680472053937419225, 15818262971662536925, 13906534632021415373, 10388162304643816807, 15630768198665438636, 15299740983304379113}, + {15444479968420088661, 4725578511733068322, 6592797451123590955, 12644252808393788891, 3368737811520598812, 2557827868369225502}, + }, + { + {8738552487289663521, 12798020703054253540, 16285176121985392361, 8515295685945774862, 13775150004805130289, 5480066442593566352}, + {1832062561221016724, 11474440365914311748, 12840477284251180526, 9418012590905495131, 10980357385153192796, 11175435945147283367}, + }, + { + {12031563579597435632, 9205196637096882542, 11184135606984465931, 1401305294056001956, 4011048655023979025, 6048353554978805897}, + {9981078758998137503, 2677269315040497841, 8661895209193888174, 2176295311480160014, 1399949325842755013, 1287167020178538381}, + }, + { + {14989416317733195928, 5215645857684328926, 7743823977182561807, 16035950733196346339, 17265966818360956995, 8141738386272537518}, + {15308740448260040102, 4819506016918069818, 10426746682594017119, 792592082078639440, 9734028579320469106, 4168164141775623240}, + }, + { + {15110332316914443547, 2454995031938088056, 8681564356238928114, 8347098831687234549, 7523258191196591151, 3959358611912316605}, + {9351830676079593795, 7428833308286598266, 1416453949629038883, 13547349981311301086, 10428277550264282650, 3606337116602082651}, + }, + { + {5899820503488869883, 11958490906970962079, 16075475723156804884, 9886958163106570293, 2336860573252008348, 13927573664175717710}, + {16197429394630719701, 3637410335075415017, 11999182092087635021, 1303728926256486256, 11862646426072718672, 12350194941729076911}, + }, + { + {11908703473110352895, 2298157340739520546, 12948782415344060130, 3891804988944198780, 11457024627994711505, 9170264692053088570}, + {13049916205169787428, 1232888971483236977, 408187673144451089, 9362353849122321485, 2376369338115959747, 14275353516415817459}, + }, + { + {13799005322110561814, 3601529694367639643, 11106772392590283339, 14056629906511810342, 13572576527799392856, 3487092026537252918}, + {8004945340194339537, 12604327154304882576, 9170501006502176061, 7882459238319530612, 10231971368325328570, 12291029816500597144}, + }, + }, + { + { + {12016493313669998017, 12933290028169404494, 7574629307155081194, 11064769132776585661, 14341813749429263738, 15283735852995564728}, + {5619619958275981377, 4050556776362198952, 3177576231622277940, 8943006541554009372, 7305626035911810624, 2218764583069172594}, + }, + { + {9566598936438275016, 1524065942898634278, 6538402437371981825, 7619146568983786789, 4056320053847575406, 12732024686662415782}, + {17127152314608074825, 15674977896298098134, 17387546565573344457, 5579093677326322780, 12742505204554944005, 9270656236439021505}, + }, + { + {9662754095902029984, 11052177687755266491, 6564855675021815294, 3737820401397024623, 9158763078587705755, 18065064980820239052}, + {1653796274043149373, 8013850902639245573, 10214534956928427486, 9886536041863638379, 436480483045091770, 11299718318113762234}, + }, + { + {967339059085129682, 13104166305190785688, 4270323337549419783, 5748057697199097523, 8577924642091241283, 3581915858994574733}, + {16286952775270696590, 10080909121150901764, 14969905990810770951, 16982777697014839521, 10781115824630384652, 10066879780630943259}, + }, + { + {92896671827781235, 2887243649264806545, 15833385588487728320, 123691791239786979, 11763384358781563166, 2158831843887588802}, + {8596741012506330566, 13826523457635717537, 6540594903680582753, 13793962889582160991, 5269794365508943505, 12066409262788357582}, + }, + { + {14160395515480751096, 4804393992065108318, 5865339760971292592, 16944867750437583884, 12346156586123862268, 13893983071198461568}, + {8669655392775136330, 16391668238375635128, 15081288913073483485, 14651450622111663417, 10940438561578281261, 1459769045883260702}, + }, + { + {4763396496514922336, 11162734181090584219, 6254038965156999258, 7654502220362726613, 2599074756235434712, 4175520862838218020}, + {5532712110222397779, 6663653809301337170, 11279470997460625805, 18326970986868768181, 9974042098100537539, 13917964898357259770}, + }, + { + {15546191471293518390, 2963849438433690733, 1598685141972719458, 8898856010516215467, 8627198789811864809, 18213029019475870781}, + {14333200464642291702, 11308787646021527497, 18050331911988613311, 6162173240162706538, 5132865581846192726, 12525247456279358053}, + }, + { + {11888520648547343281, 494917248976844922, 18138185753471197483, 12035073496965460264, 1674990322514407384, 5436485227695752804}, + {5110912561716495333, 3540271208711945312, 16423892434973715102, 12964671785499501176, 9148547701868918153, 8452102921910430935}, + }, + { + {10550849065095437067, 10753053363341312814, 1074211954227515445, 10020702799800602789, 12864406763293784387, 2698115192684535328}, + {2660806710140858085, 6972138123836745017, 15756537040022601667, 3441297371570217231, 15992662632802735446, 14962954137941778116}, + }, + { + {4348443051639929958, 635118108731535045, 2015655861614690138, 7353522871311274501, 7204918312248323903, 16297291314051374567}, + {819730982198770845, 12608785952359657870, 8576080532289806827, 3009710480834492730, 16107946955600658269, 6618414758853382272}, + }, + { + {3553937582483580592, 748557765063505988, 13881146308285141838, 1352625613370615861, 9547466942139744787, 2062114793498335002}, + {14124993439348982791, 16102858923929790336, 11804652514462156585, 5732609751578720530, 714375047010554356, 6431147290667166077}, + }, + { + {16907430455802407338, 651092243779400541, 5558490953571514703, 421524543072162879, 9495583213289666453, 13989694091243449064}, + {12986952796935468504, 16698463546003412945, 8012703590208385816, 7886765190319975434, 10751493468002030133, 6515081698151754556}, + }, + { + {6087474257130132004, 4181631832640612201, 6923834817653851052, 13172825904549355364, 11686731712296308893, 8288122396407189675}, + {12024088251429940990, 3651003894223587872, 1019304847301994100, 9991022902762889112, 16582922336964107294, 16110644774675481098}, + }, + { + {5498126896868064142, 4836747456186980397, 14439451922445606120, 2540627828887613339, 14545261008261773051, 11467969799607449102}, + {6475133878892579834, 11091521615198288188, 2782411639442406711, 5318254024968417786, 5859257904336594124, 2341590642428951702}, + }, + }, + { + { + {14518481408695687669, 2095771038881695915, 15826157616849474498, 7631060871632259188, 7943802148536381101, 9960658929149574973}, + {14220929306479180052, 6691269956130908121, 11961714924677727754, 9368323637302814513, 7291095832678254036, 1472432228204364122}, + }, + { + {296235288120767705, 15980896506163657127, 9062593919771909466, 16125661299672370182, 9635461578488266018, 1155136620315591386}, + {15542837136824990624, 12143968280527693151, 11763598774950389381, 6763568060848908383, 9078265856423831300, 11111306292226892543}, + }, + { + {3439881221278078059, 14900693561020779474, 5254088415616219888, 6252474065701086141, 9557647970998076314, 16557080478909731651}, + {17984691969139760073, 6920275699694311708, 11586093772939554855, 10567368687255256163, 5080233168822419117, 4328516116216989313}, + }, + { + {4596402599231671431, 18270370190796421118, 2306869450531067189, 14899242618385405087, 5573077655838651504, 14786962047597110553}, + {8824292366761823595, 4280831893742429953, 15856753721134043278, 6520053395038611912, 18021729931870278099, 6369767037287702722}, + }, + { + {2092756234911620351, 12191998366985012384, 7450107522245627844, 13887131358456374402, 8075627236568549243, 2080029865308854734}, + {14564437191532160823, 1248159409055904140, 11241915899684752873, 374881929831255064, 13433377109261039811, 4864742963124465747}, + }, + { + {16241148550837149451, 7822351548402593379, 8309026501457287155, 5103819580434410766, 9108794158669260903, 16488989256917731421}, + {654044319854628751, 4653846517548435917, 17199712750191435016, 4845695359451199828, 8117219445563926224, 12507860620472651305}, + }, + { + {7653070797102301348, 5941550290626705984, 17158569969337658821, 9643823508741141673, 1522997131282064389, 14961110431686131034}, + {11802659136406721500, 12306955104612554951, 9514149419806882461, 14375242488313250733, 5052075298187092512, 7410174133191576572}, + }, + { + {4358758092801908863, 7341423105081917858, 10291109018391718430, 16808750129865208976, 8165688726053843552, 6688211068991597475}, + {17960382836450267765, 4303165753492267405, 7660091042153170442, 3855051391425497455, 10928187542174197484, 13179854521947504240}, + }, + { + {11914960295850256028, 736894971573607460, 12038994816721001602, 15765970801138452754, 4004778617735408471, 13131827739122379797}, + {17423943862970446994, 11783909998933696219, 8224961911959792292, 16132329169568881376, 2487867689899583885, 15018657522918867674}, + }, + { + {8657571447411467172, 14465724378300467677, 7456925156021131657, 10099394822944333635, 1108995305500533003, 14670621046876829893}, + {13859265344673965228, 12642756285805199588, 10618371399223472359, 10368789075142392456, 17024775460445275303, 4836741220623357252}, + }, + { + {13978074604430806636, 18407681732775924476, 8539556435113599518, 12436983718097546564, 12305195225429220776, 14562179379065953930}, + {6423549542556077018, 5040755781466160241, 17482453842942123143, 16447448498858010488, 11479552475069053178, 1277752221540085617}, + }, + { + {920233764095776718, 3319139992705676642, 10862716399636326975, 9064714243076616640, 14300958971895109720, 9740515883782303421}, + {6704838650099908790, 13781706302104941529, 2159164314515365763, 2657942042243527314, 8728543051894613622, 2325932806770059428}, + }, + { + {1967422502593875213, 7041760415173107577, 9050221304247474093, 6387184238732181908, 5042857585504795697, 8540152121523996010}, + {12903368152967462170, 12590063752208819611, 1933648838835739903, 14309714702251501120, 3968656691162699954, 7006655092536063292}, + }, + { + {4234961586345538709, 4555151906871493852, 3232985920750903052, 4244526539796687845, 9377328776465632031, 7060246266590210233}, + {2853784874472922126, 12423531525688330431, 5274221307163072241, 8471968438469831965, 5168569868577424241, 13738202276372145637}, + }, + { + {11027740333858210397, 14805109795564990231, 18001404758531034531, 8113634300017707290, 7136773249584072726, 6460937237419466983}, + {11113010926555478983, 8211408909041649548, 12479292053761376428, 4353008690987758386, 8859777315867880266, 15451653478486520306}, + }, + }, + { + { + {13818182961147912906, 16111231902964497105, 5753266394530009372, 17616272516546069710, 7303352128999517861, 5933646202109354624}, + {5921806076173096907, 13896009253778745778, 11309023928924737855, 4469463255182812436, 11037920326247304138, 1421676035563246889}, + }, + { + {9963872303672903223, 10215244336266366950, 15328675269518615753, 122600537279116424, 7616143723151064557, 10569183306278169313}, + {7031003844724741558, 14407986305911385591, 11788159030526689129, 3609241791309434129, 13905596487394238209, 17665966721516237541}, + }, + { + {2594699758954057096, 11341478545067279123, 17990597733287642429, 15246802590252455327, 8353870017669333748, 12614437615817297240}, + {6394781505133818163, 7425571888170698179, 10395654478962895608, 28575799984957524, 2682124171246326926, 3197867099218106953}, + }, + { + {11244734218150742610, 10723159354785424855, 7484860387130692692, 2467563150354920554, 17551980904639200483, 18441274508899025558}, + {3676988885705600635, 1865990625010728131, 10102149234595216040, 1252552252382716358, 684792256577566866, 6943047702176820428}, + }, + { + {12653542557867698652, 1142433072335098633, 3314552015716235100, 12422430364987401619, 15277043111900184721, 15734019630472200325}, + {15919711988870913647, 10725565601222767370, 11290906213530487192, 4662157581039009933, 11015350972696669275, 8208086286380460938}, + }, + { + {8149565212922680035, 9567944225255802618, 12487131892260634436, 7443172048029929426, 4305538689986215677, 4430546250909191430}, + {10741221950240759364, 16545153560365439267, 6755029137094727228, 81110724808247078, 5717471797282522877, 1486218088878517808}, + }, + { + {9544854622790528047, 10769761497113177908, 1502686769356489564, 11081322603706834961, 13364711539216168883, 5094854373914013146}, + {16200855071998899478, 11725976297239923532, 3061711654331076059, 2493583541459486142, 16389197377130664032, 1243320213701794262}, + }, + { + {8357050367418458359, 5525355159387149167, 17747090324964588952, 15694673113104643586, 7307621991317580676, 1289366645950419281}, + {528742783924328467, 12856892207404403478, 7148581103958210921, 1069895320583652302, 8428983332864385655, 12605554700259997922}, + }, + { + {2487016972575222431, 707675339208452706, 13435953217565346444, 10759388806374516776, 11194720901200530938, 7026549091209652010}, + {9613174021959686236, 4467223759668079541, 1818968857637375440, 13722755860101057871, 7447888855543394914, 11546251567136013168}, + }, + { + {2457098738888001184, 13436425175767521555, 2765094396909275573, 13944016834209830039, 11092919542763411502, 1754742216756443900}, + {3000476756681394440, 9364034762555019549, 6876992788712194394, 3585709061747683458, 14106253519316541506, 5279212076903345269}, + }, + { + {10813235272482429086, 731216775886127646, 15234319760355729449, 9466303362664776229, 13159285075818128580, 5734182119311122400}, + {5552097949831952705, 8072700375309437721, 16694077426905656662, 6836436096351296392, 11231592576240564431, 18047071890971042931}, + }, + { + {1022254770374886277, 9469459507582571128, 2689087779341478977, 10040558278837523393, 83202215085697759, 11389135963216852624}, + {43806665444650760, 10286022177325133470, 12773072940237016578, 10992425690329167747, 4947183945666379415, 13675981203969163591}, + }, + { + {13477598317485536079, 10040066752150433290, 7405123541490280851, 9274383932346246150, 14309192723531202554, 2524700381746668787}, + {3616389453203314756, 13581678150808337225, 14540726193639627397, 3234008850825878308, 15341468248221057383, 3830563877031748372}, + }, + { + {10853619680499782048, 17362724233771660267, 10116273108750733202, 8385992189881504730, 17855585710140315498, 8470682662587365724}, + {8287837611861659551, 10994242426397343384, 7964721658577081933, 4070529224299771220, 9413822451565658120, 12865616140969909319}, + }, + { + {4909175585319342946, 10921727442298570876, 10167667568640009770, 6338375152080033018, 3059470611612240919, 5445884441031512847}, + {2080017510988083324, 994134584813785821, 11859009130969323612, 4838588735676167501, 7193860141357257635, 14012081064531795045}, + }, + }, + { + { + {18027264009080180273, 2475688335442217172, 11495630589568554783, 2044610447313340819, 16211574958831636691, 18082923260238685029}, + {15706469362280984389, 10175042474371958564, 1978937508224725826, 8517309419909857419, 14117179981307010083, 16117021543255946075}, + }, + { + {1511347881429709117, 14331553269818546726, 3174494305719383998, 11632902270807950107, 173546718771105251, 8459530881951500056}, + {9768245664684322698, 16561286001450401034, 8971518231697912000, 10976747460480974856, 5720643303151017754, 10819571526556570257}, + }, + { + {9576152676005768185, 10006989422531598194, 16187127654089665852, 10942929199410456340, 12406093935974963980, 9789646989960898506}, + {1787070800558790010, 15321395745534743079, 10957766159164936872, 8270293817925324519, 6611548955360388519, 811894490473141865}, + }, + { + {1177812967446514471, 1517957963298502615, 11830891177576473426, 13778978023558357649, 5108224327305754122, 14001515739949397207}, + {8456370711154495527, 9224707985240991577, 11975300863666543456, 11628484027954011676, 4106175737255204293, 141089986476922703}, + }, + { + {9131678980253850574, 4479975833350928208, 10129015129452566706, 14596103361459462005, 6870275426489406730, 9740372621433972730}, + {14372377876881420680, 5948925994235262952, 14844830411071630096, 5061939034624460495, 13713851364090957723, 15171884222064254954}, + }, + { + {11883295856694360955, 10292514093729377837, 1018241106247366045, 5734998220934568611, 604293790623280200, 6610275829270273887}, + {12366129529412267868, 18331188876567635410, 5216829119638902498, 8912427667935396786, 9501870605862624528, 12344298042089151792}, + }, + { + {8163932230030769123, 9636016199609023759, 9161423603597683840, 6654511074475296823, 17793619545653824539, 4124609248372213291}, + {11230396913985033299, 16604770927162297627, 15127151935380606658, 17824607882620004762, 10373865240573715539, 16654854491247214292}, + }, + { + {14818683899450679836, 14357841858587947614, 5205003223993289617, 9070636802111036582, 5470773669151086737, 16750045699953367638}, + {14277479053033448070, 16287996706847536112, 15752386157739826785, 17892417758463210493, 15541841791609187377, 4029170486772069449}, + }, + { + {590558285614616488, 10384571122104306912, 5382287961959199743, 1207676815187815333, 13011773384862224953, 532436966815548636}, + {3019650690602626765, 7314252074457497416, 1838949562628498144, 10537471043392597480, 3070353104978729913, 15624376645604971077}, + }, + { + {17115127186232346178, 10621035233663393896, 18371958430819337089, 1193295512905013155, 16614017806526374903, 10388183900788590144}, + {12609314943764198670, 11179941239127206128, 12182679129557646733, 8965475646212860502, 13633585572850681632, 3426380476575326349}, + }, + { + {8276623546443212404, 9482903315384710760, 15538896085254227434, 15790143076571948507, 13143573532148067747, 3184541945442546624}, + {4972549455963732427, 18394646794778833511, 9055568163078599201, 11111002929065765438, 17363710725009368186, 15039897105379313802}, + }, + { + {1298806571453657723, 1042114212262366662, 5680532184394488579, 8926718412388834594, 17803123059561224046, 8663230263216788351}, + {1629533050023872010, 16027578301664521945, 10229699200823727147, 7773663415615911623, 14047718958480228325, 9551563011362116236}, + }, + { + {5989309147210387183, 17849299546447616600, 13296929709722338577, 12659773706196250035, 9857145876253632711, 11836080982965367426}, + {13554494825619368750, 17266926296470690286, 18031413991494048783, 16082997100696095698, 7954101307530025972, 17805255183453764631}, + }, + { + {11764175621326135951, 1791939567018465213, 13029241477144523291, 10840557939557580560, 8381031918646881664, 15423611692748071864}, + {867816783445809673, 6030296688691172286, 5561502310603617073, 15534923164629599800, 1208665840373127315, 12554641657645359528}, + }, + { + {3209670898909179942, 3098303062665745356, 14606274486451097890, 5959844521554290710, 2464075942028132860, 4072466165408271129}, + {4803469398150112461, 13680850164034057508, 11856265931978933824, 13240671495015013351, 15372029486600936548, 16702375458830177711}, + }, + }, + { + { + {18354847664660713402, 9400129736098519180, 1693064830516242847, 8562602303494815916, 13461534639537583386, 12859295804198471696}, + {17914958195244970799, 14970948874889495984, 16335291403269479707, 10631004823344361203, 17176847807154743365, 7714732495833925335}, + }, + { + {14957716628768963046, 17714101461064775895, 14988284950839047625, 16071167094351699344, 13890128763447277457, 4634560608180312269}, + {15209983968927413233, 13604763079237964821, 10947506257796639042, 16898823699351743161, 13294221703899555280, 15072745049022926507}, + }, + { + {3852056161889022327, 2473180673803482388, 3734174223964831443, 18372076238287597117, 12199161160370991577, 5666481007872478146}, + {14306064415346698520, 10330919921159881314, 8823577501055193872, 1854546884403147535, 8350718724062793691, 6987169359640195828}, + }, + { + {6350728622830713728, 5701874018092832478, 1307420847228487387, 12162151629784986353, 9986023597556720981, 7652258640582743122}, + {2186001021201828888, 3639063210548593758, 17939576646917089186, 7727612437620888084, 7790541002958463900, 16125720901743858869}, + }, + { + {7987758804483759886, 15261177063236862551, 14141837944496855895, 12436175571389993349, 8274042047049891014, 17152451709054820788}, + {8637518459734046525, 14044145421979578672, 7087188747750571441, 6313728565256547988, 11986656046293683375, 4860648976415357838}, + }, + { + {9009539789648791006, 17968770175863968085, 7552239675047114070, 2857176040809917182, 17447219567921940196, 7265407823518294105}, + {17146273377976250579, 6793545786177262831, 14702522055640190270, 4115098237661381737, 2503118300874563585, 1557013629291304762}, + }, + { + {11378438312695848589, 6538246237007438137, 17401630259167972224, 3718158584776484875, 4653786582172050367, 8204345231064757942}, + {14333075355191893658, 17490753073467497501, 882454733741447284, 13137676416912827511, 12367922995099391170, 11659416979788208350}, + }, + { + {6506114746421938896, 15057654379054626074, 15301323392829790768, 4198974549026211659, 17765210741443108016, 7132509492152477030}, + {13814681355173788286, 18227429366563277742, 5706529263838269680, 3305860129954779061, 6258038612413033234, 5553019991310521590}, + }, + { + {2740541731000766119, 8596175174200043370, 15268406586850192141, 4422842783758936070, 16124815896970518429, 16832763608196271685}, + {15434766743141189819, 7524954445211264826, 10235492655871568031, 8982274848184708554, 61280556653488570, 2365856772460075321}, + }, + { + {13157569055430348176, 15120480921106359700, 8907221703681745856, 9744220876937878792, 12735259395540542647, 9934004250126983654}, + {16718615067756416460, 410404144349530529, 6127062667806307811, 13658502470838162746, 14801118008320529094, 16148996127797465924}, + }, + { + {15802530345131809115, 17755831194964343760, 17769515049688374693, 7857718956073628784, 210191518703714850, 1746393941813293182}, + {9588189846482137991, 16335835178827943095, 13379307055600165683, 13189771146869278015, 15165452058189091322, 16119082358562095187}, + }, + { + {14291300888450540580, 12179403608989848787, 1574081386467411267, 17634301459964659121, 8878112303286796059, 17677799131162737575}, + {15596184219007084082, 6187497693225343219, 3798717948418717856, 4726638163830739524, 5752064164618039868, 12151699975292370996}, + }, + { + {2566281592983211586, 7556513094797110610, 2450166108042699822, 5117635899811819452, 9378838926483608725, 6536766093196310265}, + {7844966478885204208, 17742733133746826278, 14738531168438873782, 12821429720867364479, 17548355350637387437, 10379676596614787905}, + }, + { + {9312968557225948243, 12012357331777111837, 15378903016229100083, 12000905387706281859, 17061047818694588137, 9595998526695275691}, + {11468745480135275611, 15336669098149774847, 1341152435528764937, 15838536921908481248, 11418408147933255250, 5931142050180490224}, + }, + { + {4126355864148604636, 13615307424696038095, 610122995599041643, 7310843591875371159, 9562945189555198546, 5139192984197086614}, + {16434764370823678107, 8879626425844710867, 10870500519197212704, 10351639341497698657, 2684669702506554173, 12776278319330754082}, + }, + }, + { + { + {2976080374040978112, 15463477607266400944, 18021857121116180535, 12769842468896246932, 3127871016491855528, 16064631537662018368}, + {14779669176601385973, 3776668856093058683, 14901222703045028630, 3232341387704264788, 11524644522032323784, 2840977857469413331}, + }, + { + {5288000162182207268, 6882039810247587375, 8670725030786145343, 5145183205378561959, 5837273482862705559, 12796134768505888809}, + {4538314407891574892, 9060622484855928248, 10762409677748173572, 3978391277049014537, 17437084673881602774, 9597445123068848506}, + }, + { + {9647243303471030171, 14403945224496984264, 13886934807685357620, 17412670052512822239, 5167671672373181761, 11309623208884894891}, + {16223393003006029431, 1419420326439656825, 2369169453814801856, 13061716774043471194, 14634525798681795534, 4751674434384485255}, + }, + { + {4551832817507521552, 2313908657037532903, 5993995178973949921, 12447883782437853955, 2555223230220912865, 15167076377045730267}, + {2005335384595372774, 8714558357337187482, 14553513576888660757, 9344637821077197511, 11470542328000845120, 8444785364767260640}, + }, + { + {4138889373221767098, 12141056423117115293, 14874649331180645388, 1705049756225833969, 7848874201060248948, 5156845906941397672}, + {4861831505262375336, 4347196895421922491, 13681671418165655661, 10985831839263041306, 12731646375130791986, 13097670606652769270}, + }, + { + {13662345490304024129, 2974839373795112820, 12056507699680569779, 11760177245091509243, 1304067584530226034, 5993077591223164847}, + {2387375708577719238, 9626459487654222268, 1955587799597889262, 13097747078399605477, 17202959331606801221, 2329556196948809962}, + }, + { + {17812987452373376709, 93922986227836615, 6326230905711504623, 16126249753219785660, 2455759288569847701, 5953549367496130585}, + {330019371493755212, 3787738706597361027, 6252621554557272655, 725518130284881658, 976894057381550612, 3762034607037675717}, + }, + { + {15030213828999353996, 7537307216693595568, 10906817211901741334, 12978201161486570836, 13688879460912198344, 16875104360403708899}, + {2236812266517027774, 8283440131031015303, 2503310362171705003, 14140140152955857646, 9324835099807979519, 14222655865872085142}, + }, + { + {3744645064193324992, 11767671095853168147, 1146189435518138409, 5628986181810339417, 918940426876816812, 15936037265796453016}, + {6613161822954084270, 11628888581784661943, 10812400261220740733, 18166624472577344261, 5876006248392439801, 16310306694834328246}, + }, + { + {14125633931334589394, 14751339378917740218, 5150510528739010610, 14276625313476908582, 428670252922191956, 2631125662043419149}, + {1617981761951911336, 11583305636829657910, 5101252848640834978, 16667317030245715710, 15236201878077258476, 10871787548070323489}, + }, + { + {7447893961295274471, 232689431551823296, 13869806697620401084, 5330160866804784025, 14865575443350752261, 1679832461395111529}, + {13432840916023326626, 5655812378144376418, 17569608518110186458, 12501129428357124126, 12870492098064776642, 2977413908822477380}, + }, + { + {16051075988752124526, 387294815279188176, 3113985811668805632, 1973998868188061597, 3007935075189940834, 1096206135454331889}, + {5718521169091374159, 14981024399127745789, 12740192428843246945, 16002483798782724245, 646320423819307823, 3798677800777828461}, + }, + { + {3175319352668641931, 16660628462131386552, 6009313219444175330, 7678412375003613097, 9306411708347736279, 9935327299823143180}, + {11559141188091897348, 16810520437389758501, 17490645749839025712, 17259327961568124278, 15274735373631914960, 8983416743854404564}, + }, + { + {11963348162499020986, 5141506614889163229, 17433303046800477704, 8199586499645960554, 11047244048987602943, 6043499675044562520}, + {3566164965696214407, 7496224733250850598, 18368140720280229179, 1567369354656910484, 5448980629729479630, 7863641419129732206}, + }, + { + {2725337558589481703, 2497570082780513054, 8145569365382441623, 16909216290827518100, 2055218062540628228, 2415304909498436767}, + {9493217182909039176, 16224541192418752121, 7654146956830687353, 15910281318968056771, 7566577530597601060, 392195615790859862}, + }, + }, + { + { + {16389181503826270360, 12110241482308603158, 18288412366208628916, 6215500050936591061, 6014488852457703712, 15271085167906108065}, + {14292078858945118972, 14481422217835125511, 7781324865065249448, 1680769593324888263, 10152646427558791174, 11660961480686650731}, + }, + { + {12596615897631832150, 8821755551627965643, 9377179163931081776, 39054669779258365, 16376149550862611797, 14563278930531491140}, + {16172472663040388770, 5190287148139844803, 9110064025691300865, 15647288432646291523, 11591045834006760644, 844689883380316992}, + }, + { + {13548776749212678702, 17662168188358040525, 12032615038574171326, 6080133567086225201, 16938431180779549179, 3443895457286094158}, + {6436317213424755334, 9475881081120747064, 8925950328230980837, 1431876965977827621, 2014835158760914736, 12987015014298314305}, + }, + { + {6414994335254419743, 13126391477045983044, 7334301732865328995, 17814900833709399507, 4626754175182728225, 15638724462213933799}, + {4525732141028097375, 8291242304314061980, 7906228613924545091, 15172916208217647131, 12973611124608613858, 14415032784796747468}, + }, + { + {2941763674782308367, 8542334074892503502, 6518009639926774875, 8175768187727642229, 6810163642801138717, 13000888070357934506}, + {6742587576626772316, 6185408768536176876, 6199936764943605186, 14449234849358571084, 15099106384716206744, 424689763956421079}, + }, + { + {11352046731905647368, 13199556803131515747, 5716134925316732088, 5648788594959551026, 3705999902843684565, 560536953153999361}, + {11871652593424132117, 9835410362049088550, 1151003289591121644, 6319035178000560268, 14320824175339506736, 9395144506212799342}, + }, + { + {15455730684964191688, 10234835525295487673, 13182207266101117103, 6524185547415883508, 3326725631592873861, 15008535546194382452}, + {14902727792883529480, 15934241170433009830, 9499368143445027089, 7932650776206057878, 7397463728482754856, 15064673712954012572}, + }, + { + {10466244619397673266, 15399629207270328335, 17269983148989232532, 11915757566815614941, 10527914924508876394, 14191866475212875708}, + {1195709843044148654, 13844920180243298721, 1913057717019589478, 2076654993296600487, 5771535096432721647, 5276006344600556560}, + }, + { + {11597571737530846199, 15087369689361537037, 1943002093062010773, 14166422307764789509, 9566693410200051474, 5715847907279017779}, + {10365566668051221446, 15849087890611260377, 17862304002596752565, 13346541298411131391, 17741431867034125269, 5459305016755278252}, + }, + { + {11716528930963372212, 5531007692335820969, 16480109661368747208, 4989131671065416736, 1321744169687329693, 14777911526361771830}, + {16382233147918448360, 8261406114108376025, 14558557421269437229, 14834971601402563213, 15317501415447267445, 6664947553397092024}, + }, + { + {5785339725163835826, 6971210823493195704, 16124144681939339987, 3475104212436227942, 6049658499241715622, 16458315540661701699}, + {13323859344989042773, 6912561797063467249, 16800874344261680852, 8282162771440569212, 16369106286531876819, 1170526359132776853}, + }, + { + {9782081741251904701, 157951607661604103, 16926146768919338915, 7973413355284153573, 8362125879537081326, 9862990051212466177}, + {5184297884162915665, 10244746657009000097, 17343337497982107750, 10499903102065327375, 4012731889022182801, 7003219507037376215}, + }, + { + {12814653486444031879, 695131493401594940, 5677983402953066279, 12084690974215027335, 10420441289745630608, 14692497896969958685}, + {10769477264375836410, 17164147105428372995, 2619906011157181849, 1415661898003451303, 9866791318849538593, 11584829697149423292}, + }, + { + {14473501522542709727, 10749304489595316230, 2934355198146439368, 11017927560935119595, 5915324032076206144, 6354575443760924114}, + {8112720200285039304, 3582240290765355039, 4273023256712648103, 18427552816472655644, 12422787084653101783, 1105225281604355429}, + }, + { + {17128222588782702290, 13487368180342466954, 18017424846076363710, 8988322008818510817, 4708906557988367239, 7838727005553267159}, + {9398500148632613444, 2222389518787551320, 9441001728156177075, 11730541176540093429, 2854531586000055239, 9731840308469777308}, + }, + }, + { + { + {12818200022021032544, 18304962199648570900, 13782454312217074924, 15136749185545329918, 6562515245419546737, 15005045681562431971}, + {698694633971573994, 4013566334015448244, 14911595848732456117, 18305955879156015222, 6117212666624617460, 18143980466289027383}, + }, + { + {3502426890414957587, 12060773399876551675, 9782583782804195660, 2856421043271709331, 9172760811796379412, 287598491992287381}, + {3574882806715667454, 1471467928527282465, 18213296168373130112, 14471573043027880442, 9733220931679498558, 18238876809557846346}, + }, + { + {1186541863308497492, 9046950340101487212, 2745706024936898790, 4989009340224862161, 12823642979701239217, 17942139398687727132}, + {285479679301825536, 15862959466038586171, 9521459034208492274, 5591094499772746735, 11556872820220759870, 859478641511045607}, + }, + { + {15238342970318237289, 12057224731033370287, 3456414471220945721, 10398678431367169082, 16329262524936091613, 9810430130271885572}, + {507823287632145607, 13852199732643342659, 6599758124440658421, 6281020241660422787, 7196547321920663751, 10793248012346291609}, + }, + { + {16383444525677044377, 2278315169443859734, 10660119552937534602, 11864735405260308934, 8495438467432993830, 17346877704286895877}, + {3849319409996272322, 15807271853256513609, 1281702280418940250, 2373472013096372228, 13886255586271670807, 9001471337887209400}, + }, + { + {126909537204579598, 9749804666000980109, 16255800152061704810, 16609135318627234518, 17961723534307687333, 11140782709978313514}, + {4136643585846766549, 13601295896682468661, 13257346841610635045, 13497111085366129373, 4536183896151771989, 2489943574182543991}, + }, + { + {17280995436445609182, 7102456830521880903, 11461813376456526486, 9119286224190937602, 1677507200155630395, 6530478943017087729}, + {14611227007048719177, 251469378654353230, 4648274799629731126, 18315451912783545607, 16748007467838496641, 8627030552960679348}, + }, + { + {3196164040344762946, 13715698755805511585, 12458229346805024551, 3656509940452321691, 14877033093641476326, 11337317622750049895}, + {13942131585783347058, 18149827011545790191, 14895656048349000943, 16669534928350175969, 12531447672595399983, 13192103245474624236}, + }, + { + {14145917324940179268, 1801646073880966091, 15389460022241189228, 12374720625988164902, 12743858920585304074, 17607177891983515301}, + {15207272938242753632, 10413323271560975478, 12343096097117660807, 8269383012599149690, 15406849301603489917, 5134788699979908779}, + }, + { + {15888200229957314506, 14831411534621040361, 17970009204612188323, 2343767984014726431, 17841302528539551395, 17397648858980735628}, + {5368978612132943636, 4213367444878083717, 2033768727106228984, 14322131493744692794, 1236700335920101663, 9898949435294220253}, + }, + { + {24758834352404155, 5091013253272577242, 2028941475205281304, 15518967929666839380, 18004005068930730609, 1086684650652446553}, + {3503524165121762927, 16631444510755073447, 11468393061269997145, 11182831309911774750, 14403549322101529071, 13276637040909393512}, + }, + { + {16631857123721916775, 12096833102612622585, 17555483922966042784, 6723532965693736694, 5206953889265807064, 5257296707684647125}, + {9873856732725887735, 2019034753037317738, 12416543296251547862, 11111904680478030156, 7089558964960452193, 18166289056279109058}, + }, + { + {10481925795166053003, 6733183822951411784, 2336616077761967501, 16214291345655367389, 1553615587408951311, 17704541651779617310}, + {15809632617388566423, 7040680416264460118, 13227773672965345020, 5249395959455852855, 3700955432488167579, 5695246660982315902}, + }, + { + {1322177735500321843, 9036238380817454036, 7985514519046855063, 12745778131660207555, 7517032570151312640, 9543215009508727185}, + {15511746435670372720, 1582199859560802198, 16232964063663491032, 18413513284071022892, 878561573889774723, 17999994568313632469}, + }, + { + {51610547936916636, 449080743773055520, 11895942441668539651, 11528163466753867928, 5327778117936222113, 8054693531038673087}, + {2883116022051785418, 10880071210182937273, 16424612420341096868, 12563975202447499768, 17898191392637488032, 4341166004500306028}, + }, + }, + { + { + {13532417727291518966, 15621487234118278211, 11434135490251796442, 12174621814582402377, 11920309846702883069, 2376809786088257319}, + {13790218081512629675, 11886070728329073138, 14026033143551470492, 1787100914236464953, 304006454051884466, 2756779920933373985}, + }, + { + {14557765107140528328, 12355977617261039918, 4747772470536185104, 18066963986056971247, 2652951795222371597, 10786073208769016103}, + {11296024438266601030, 10656113304080611004, 8026365448356501999, 2223277656070704256, 11257682407574091370, 7238909102714165030}, + }, + { + {2791395962931366632, 1203894038483281930, 15578449492227701100, 2119859552714176601, 5772832886191005383, 2752141942254219689}, + {10053647313488524348, 5086479179724027856, 17277990771954143064, 15685827892771379266, 7735502714666745260, 9034852030753288603}, + }, + { + {9516343685613462106, 5255139143590615572, 12557738960870331208, 6702052925707924899, 9793008294868108308, 1711520204119625593}, + {13236841202015067107, 11129785963068370784, 1317992927785313925, 17479451244447802402, 13036816126933313535, 12502011338757112622}, + }, + { + {5480168288956527943, 11042549818448342343, 5915412500172865058, 12999251329017129768, 5808021534739634680, 15104939226808360257}, + {16234634328969043664, 3758395717098249756, 1015491288991804400, 5068251056783778816, 16324558660491861300, 1738698513676655878}, + }, + { + {15946881038575547502, 11116762950959791543, 1297081076272427975, 18245256277091707800, 15100977783223461884, 6017885634508292069}, + {16886823282698854680, 2072463130596047656, 6569088142237167338, 1681498520362575025, 5901004614588673498, 17871763470160973506}, + }, + { + {5104558086478114328, 8971286270876655577, 16470947836284805745, 9037729831080471007, 1965555872583588977, 15433240281955214704}, + {15775227419098203047, 9665258145206729468, 6253192577851256595, 14270940816171443030, 16612589103033695708, 15637879580008007829}, + }, + { + {17904034783907348399, 2626038317331972399, 1873258435072511230, 10005975240297222027, 7533652174638142552, 8419273188570922972}, + {1990391844410141613, 7373216149717011445, 12388874252879150470, 16614842721902772761, 2061105669992609107, 9570836984475646549}, + }, + { + {8491665721135698298, 1799890999791860692, 2389734471340627870, 6270039658247138318, 2463312350149470933, 2217609086834055191}, + {2540364179975154870, 13284898623265362260, 15339373729732261072, 4514279700129226946, 9114575154956391114, 2305724692490304627}, + }, + { + {16530141398463115553, 14748291394528377795, 12303798781899702708, 12438876515281985755, 3858890397627964933, 13323517596969431732}, + {9818536194104432590, 16122491291064677498, 484427543635671756, 14180970696306090632, 9883282120273913918, 1968662552094340067}, + }, + { + {10479341768131470504, 2190791104965238551, 2211152119507925575, 2517772887931981229, 4163883984830586116, 7101754214377757388}, + {1318955625560086134, 10530268190194110, 15248667065937080538, 7939869955605316809, 14313273335008385545, 13762768542953544187}, + }, + { + {690011461657587646, 10912073132311140135, 3674573373985417129, 1597723780107325694, 3549368082234927465, 5785289767244769610}, + {10814725183340498172, 1844706750982331307, 3626691260264165038, 5983040194600768762, 14282060651990538968, 3649897431950147558}, + }, + { + {2301048926250107017, 14317366235953485757, 11632712123230515281, 15595916662388747577, 15711429699151908381, 1305749118231488029}, + {10723669266169674926, 5797826425608678920, 17405218711301982393, 21871232298874801, 15013562554137035037, 9701498342635018022}, + }, + { + {8248839050962163686, 188360563145520954, 16729953975463785867, 3169981816175024043, 7187517706576344210, 9124675384823574083}, + {10262932309387547064, 2404363551953852313, 13372721599356368606, 2531242226775172773, 14257983105055729397, 2642170875421515959}, + }, + { + {13319873663433996292, 13089646428714940315, 10556137876882685421, 11656950941183630010, 12276319669931009991, 9463441716524353939}, + {3370727689367607500, 16018376472071193381, 3301478033055661161, 13190011310690675390, 3229558123256164376, 1583255490085522802}, + }, + }, + { + { + {11928390292426988518, 12638952790538679939, 2608009033823001125, 1242834957664439029, 17797992506731473096, 10340201033905982118}, + {10278753530600088172, 14116327152473508099, 5415842384660027374, 8566401179276240818, 4672386168367646978, 7541801451638385534}, + }, + { + {8566538196049418515, 3197654215985957962, 6355192582145549922, 2489061264757130927, 10197194261710918732, 3715293456694744633}, + {1991945499394841082, 3380660455057193206, 9083458464137174418, 3254176369798763840, 9684490403170591220, 10473571146597457026}, + }, + { + {6457826063520179285, 16268949646546946980, 3097451422505225454, 16453171385247691361, 17481519375542182315, 8112355562842761847}, + {18025352535213545210, 3750835203252893359, 10768297909412467901, 17629461198543052222, 10843179524144693103, 5226721924620138404}, + }, + { + {11631805870497408523, 18340134794831315912, 13311913312275168872, 2845528461275777300, 13173530356238926504, 14929218971024971026}, + {2411139026399661115, 17215217074808016346, 18228531498431262439, 6710245408258710904, 10307545091592698852, 15144971226257950491}, + }, + { + {11109750770824264074, 1088007372340209252, 10263956230079210784, 13896899727089451859, 4559138529870539846, 7777534303712666029}, + {15041017330059266135, 14622601734133247399, 7108706896655204385, 7934590922797237644, 7575713521896250968, 3332437975700014380}, + }, + { + {13801266825487496316, 15263809516575468264, 15419536487874300835, 9072780772100611698, 5969380434932396755, 11198543363610134500}, + {4171408162113015715, 10202388527823988708, 4311928890627114703, 11816249602018388228, 16313146221834083742, 16629955175557153355}, + }, + { + {11660286662603189685, 1207956299008625786, 11363359882526736892, 12477550434520668425, 17179867938403281938, 5655901105940295926}, + {136910678421418920, 2416064355587887290, 4502724777522615718, 17912124462718346700, 1361328791937120561, 12111897685488154046}, + }, + { + {8096344270340363443, 2517756701774451654, 9304005451085866903, 5715847369594509871, 9745892404944266254, 6051292773703160279}, + {15884195349114695334, 9517199133306271549, 1066058705882005165, 8365496980814928779, 7686746440596632791, 13176504626066527022}, + }, + { + {5447100387998907411, 15776278570078464376, 15224157255965180681, 16441839948680600381, 8813248177057271462, 10796641304027905046}, + {15358728422211379791, 6653135625270840458, 18255855576461478753, 9625920573335344034, 6295553526678577130, 12814858875321523185}, + }, + { + {17422403916567477760, 6238259464169695174, 11407009829093777631, 14718862258997290816, 14501697263370095522, 18221436165995139407}, + {6055444735226512775, 6768775017420314875, 7196971579967975624, 16790550980878240131, 16309548149795408433, 13384461631727488380}, + }, + { + {14079161021446380314, 7955905127227850069, 6465999511395878315, 7788108352019910331, 6222197449376487017, 4871252710770322572}, + {16673373722646856051, 13544022498694656238, 7378084945975549635, 6707761833586330039, 12377553912462035692, 17347971251371560420}, + }, + { + {14395815921984889730, 16242663560670555551, 10933265444645517596, 5914394225264036695, 16421696853010989602, 5685552142879689368}, + {12020206507361369768, 11602855627342652015, 5200080540337794980, 15877202861979761300, 16623062677785575198, 4399280632997370270}, + }, + { + {1019528443634077636, 6201939062294227465, 2193674349270074093, 17838059521213356953, 17494214752031608293, 1870623058299198966}, + {11485380789709140498, 6901145761334773250, 9249667932906723287, 9945518497873500003, 2287783742604500536, 15642905768346824183}, + }, + { + {6482332546440863608, 7760091220023803488, 3238194504321395476, 11017818554400598448, 15989612191997623737, 17176177776749389800}, + {9233800304624853063, 15940633772893955963, 1055365280899111788, 17832351193102257533, 3728875607894595859, 11458906737664282937}, + }, + { + {8155436981174747409, 4245212880996209373, 7397768860981266872, 12376011921970823763, 6727814153288120097, 4925255243200109984}, + {12956382084478097801, 7578047214327095169, 14028361267843039054, 12893429039763352989, 15016902170609700113, 3952485452273593863}, + }, + }, + { + { + {10212113970351356092, 7523429041914331341, 7486406457607204412, 3324890123572559980, 3609678540132843360, 2779647883674003080}, + {10785490009290216694, 5512178091962365081, 15405389773555373879, 17119053545814414444, 4550915783680335364, 5243325139730264225}, + }, + { + {15514067016142951342, 6798704670058921365, 15788722941232068928, 11593726264526847078, 2286988197169413876, 14828646074338136439}, + {2215588591344044651, 11994073923064762522, 3627301481345142037, 17167985271749886895, 14022445437114653662, 7923678237890136587}, + }, + { + {6611156704115509785, 18035620512627347750, 12381083171658118986, 270239073191874966, 1473931467604861674, 16752630206679926972}, + {13564215097326132206, 4074525343054815713, 177585984812302656, 10624670211816340622, 10109313618255604651, 14687069652115498251}, + }, + { + {16146132531590710538, 12624070149355925261, 3371340830834921143, 3637666900208692421, 12578993021430103850, 8399914141968916590}, + {701294690134606357, 18348654154222046066, 16080787544185533713, 13729499035821774112, 101002779873624994, 6415359183199533087}, + }, + { + {893065980645567055, 9780512522735000137, 14013587606638438320, 2042146894211661930, 4926876227730145005, 17705997753590203223}, + {403180381605128100, 2168255912491056834, 2400870712237917082, 7361183795795049574, 9566809726615509364, 6303637469757763886}, + }, + { + {17460362964014562908, 15586968786742110252, 8494757460457574325, 15624700433298528101, 17318575918908746254, 12652072085873395255}, + {9835587478950302112, 15548301433729187970, 4835168265500394400, 4967939877357046781, 12172794064315424711, 13503969662963117963}, + }, + { + {10829288067385404126, 18368582702063329154, 7495898914356102398, 6638691277000448994, 12421305448095328104, 12913821326734578178}, + {8084574956986873667, 5701547954903136324, 9827732902307175096, 9844605815961285215, 12681790933515557867, 11120448073083314536}, + }, + { + {16068344822778820192, 8689936877594040165, 8315547524451662260, 3879243152723994807, 4538257327824274009, 14758576181122195171}, + {8434922169634574674, 5728614983829345478, 1650023042553620956, 11308715920844572662, 12984057269003477315, 3325170259493507497}, + }, + { + {2598915533513585113, 14183744977018914294, 181474781586722719, 14637209114370560238, 18213257975009888133, 16601151640440493077}, + {11667415477497099667, 14085199965267867494, 16721473494118951513, 14499309470908758904, 12850701150110062639, 2986900412652523759}, + }, + { + {3221589256444770394, 11214409482440895328, 2728454368684972041, 11241800590680666601, 4667060631816223587, 4054750084181257934}, + {16826694011900430102, 11268855356189298229, 17144797540779468702, 8125742309270210655, 3796632567822982708, 8322624158258003342}, + }, + { + {17852794608451085917, 15586644236280880670, 2638796224141730299, 6571369537216725099, 17238484134695994919, 6584002309074770367}, + {332176389297000027, 13368981597643817994, 9475905376702633, 887026676346074182, 2659944342595076192, 9716495411301164463}, + }, + { + {8760436800248748645, 16559589424441408742, 17728067511446087541, 15979039360791931099, 1186131304518732359, 544669493272271576}, + {11512458030364033194, 4234660342823911330, 13269362908985131848, 6620254276755952341, 2472637252854054812, 2804760878774068057}, + }, + { + {15928091392978072069, 1045418146814199706, 7425379098630386963, 16455708007612906306, 5515953762090790798, 4146738699702553135}, + {5126640753769911542, 15649236295646849030, 8100061362821164710, 5931546784464607243, 10980236595948879217, 6825063281664784010}, + }, + { + {8543951044930873896, 6542715458284226112, 2761529550697027755, 10608334059217377785, 5013963483795824785, 12907134297467450098}, + {980382309389436255, 7808952507916033869, 15275563855873621709, 5310054094388396360, 8349155105071860026, 11043771142323384823}, + }, + { + {10152873500779880984, 8921920392860909449, 14073008766417442634, 7574006587459435649, 8742698680973393947, 3634151658166442700}, + {16215510897853847342, 6313231586526240160, 15374028344552157486, 16025015223144590637, 4962437968942642052, 2389997079243177935}, + }, + }, + { + { + {14281041519735018975, 12922311381137007214, 10232502343768314657, 1134871332686858449, 2406027671397524741, 8211135280367851709}, + {17686015482034995045, 13964987788145667419, 7719837707443653733, 11241849337066564058, 6107424228088781549, 6557866097251668304}, + }, + { + {44745771075211169, 12978700281287734965, 12341083357048397205, 1797820217645587144, 16645470871308398952, 5574272877734914713}, + {17391736056610728361, 16032339083920183657, 3446991150741449782, 10033643099742979783, 14851902199569135753, 1830235897561763723}, + }, + { + {8645411699894411605, 1426585791906124213, 3579550076805920171, 9083173147160007694, 11631776499533913846, 8510913582608227570}, + {1541698565399230466, 17192733751495667997, 1610633544366852348, 14882834591025699164, 3805773893383467941, 18227555101610282617}, + }, + { + {7654469169679738716, 17884541881059058957, 1658182501566786879, 2647862499567454261, 3575230054065121063, 5196577140526681418}, + {12604411569045121957, 13620316591036967083, 18197402841216136733, 16577144861751835196, 1856064252812727669, 18261694871001689672}, + }, + { + {4917344388382226976, 6330884756405843776, 17908872738552769229, 5244919991308831166, 8697595492991011433, 4947226470683672404}, + {8425523832699364501, 7754795213298783206, 8063207615592653394, 3563540304379150938, 15696361418241150720, 6209953025795422024}, + }, + { + {10542961880027073714, 14819776903900712189, 10788823732453390406, 3505823457495732649, 7370161041256253297, 7602319824210592069}, + {15683925906988243629, 4273670365516442517, 3693480665904390884, 16506632164939082014, 15344251801076915117, 9664860330838560631}, + }, + { + {13453231080122146905, 6512465127883837379, 7629388504183246683, 4217401442467660418, 13133301451058498685, 10166079809976017824}, + {7398318211270177803, 8363389463704327290, 10324465568426256419, 4965710503345352609, 2089060017802990689, 13427246861509147536}, + }, + { + {3328996401163396997, 14795923992923049777, 2850129498190588037, 2818567789790091571, 2452485851215886435, 10898789027092665189}, + {14647661412525870291, 3599306402736479964, 3756515659636605976, 12815169094441383661, 15786213320252390618, 6231903730571064302}, + }, + { + {10711642105210749960, 3964832036350312570, 2594869633154010768, 7504273439683990593, 6171834057422616095, 12806635729425016087}, + {6242042828168471440, 11746641890873718074, 16615154546579032279, 95454097875132020, 6393615725707696241, 7618061211687978664}, + }, + { + {9930957720367733639, 1077368814711136367, 2417053219800485985, 10848530230418354055, 7260326287853856173, 14141227535390115151}, + {7830749040726146784, 9016206039825747868, 11290344305602325972, 14750454853595294291, 14714683920601490123, 1432121990527736048}, + }, + { + {17441977106390458994, 8730805915901635226, 5819567079469848168, 6321912429222256985, 837082610639548473, 15410302798534400718}, + {16852273756502231397, 8917666851023000894, 14301029351076598242, 15350040486231497808, 1621413004527249197, 13889481477114808738}, + }, + { + {8916394881822438043, 1646293865051273262, 16633458954488857984, 1971089263341201042, 14055873993496913092, 13954758750729316517}, + {12992583064239709509, 1952701756447682135, 5933085826608622333, 3590325588620993260, 18107021064040771922, 5262440036415899013}, + }, + { + {8672666323143994986, 3432698976158862459, 7932092920769909604, 9350507304052696520, 9950195840741471235, 3384863162662803302}, + {11269793069739340493, 6207863446301189912, 12329276380474262269, 10965144619249951761, 97704029241884757, 10457642244982072945}, + }, + { + {12371754360290866894, 1591074855650384155, 8325409655366518323, 11442314427085611305, 10875405650221560131, 7491900189345980515}, + {17244250783259713081, 9507080483851292003, 9417267023896977595, 4243988893984453349, 11064476576986125131, 17158304321030000154}, + }, + { + {5517940657612757396, 4123868648127756780, 943948557181189068, 6078511197957700447, 13220388742767098964, 3184112381859294304}, + {12392153938824408522, 3168610752876052364, 350018255493345977, 2813965382812065687, 11093319528930675311, 6598131031733576701}, + }, + }, + { + { + {17846260309109160862, 1306797101136445625, 11647460062050134126, 4280254741069645613, 13550506007057592994, 18283679445420746708}, + {14822459580299409390, 16348337099471471523, 14343139876287082865, 16111294748648165111, 6270862100768665567, 5789912213367358682}, + }, + { + {200047379930668220, 3107506412723209866, 12635605344473049868, 6454603385777743125, 3634997813341433192, 7438775972421422847}, + {13638641130311201683, 11030479200470016288, 4711568272785668705, 3373744634232082099, 12735396517885935812, 1666767200715548592}, + }, + { + {1661699022230626915, 7732150026917057818, 6874108361236320794, 1159587009959479866, 7007379701174607195, 9952444100833302939}, + {5965322983127194050, 4366859071433931272, 3231323670368819730, 18362879607830583246, 5646154626466164812, 16999943723339328275}, + }, + { + {18089243736135451887, 15837467602480156595, 4979955351269012725, 12695524654989516016, 15309527870169710145, 9923199650873375699}, + {477633266795650405, 6218407297793375468, 13972928132308654086, 6804584457444043116, 11304504344726657230, 16511473903383869711}, + }, + { + {18035621934283433559, 17683775718600141872, 1200977174684534015, 5313684562476274913, 16332322452774063686, 2145323195208686943}, + {1572586157017613665, 6541397378767315724, 4667619245659807579, 6374201727420350952, 18032000221066592915, 2059105043707958084}, + }, + { + {12166351370380034203, 7102163135877977227, 13332299513090850017, 16122777051352557935, 1102940088487877845, 5212887364114727166}, + {6687171729958891220, 1664933694283032903, 14897359728576714580, 5549891844111603232, 4137590082941305255, 10264069531127198424}, + }, + { + {272620083016298055, 17189778207291663400, 15639379971966818574, 3447379160890980726, 10696794611439970864, 16890999064760725295}, + {9003356812390325490, 166360430953008789, 6721503120622592701, 16752071907266696152, 10459887288559544412, 16460372927471671270}, + }, + { + {15720666782902086695, 2243636647767906075, 14348999864993654614, 16530847832477493511, 13572226349455897926, 10485166353342867630}, + {1701375111884628062, 2188828106789127558, 12645689658478144853, 8016727425888546008, 12431997919751623083, 7136689765653286632}, + }, + { + {3054654888507663517, 3901732615579060999, 11618712726777764967, 10400033150633623763, 11673620844004038101, 5065261890057318586}, + {14496601939391821092, 11531645523028139605, 14474922880926708005, 7706650634046982502, 6570274599504352046, 7642596377689896565}, + }, + { + {7699868198387215867, 13465612880023018168, 6802825825452629152, 17947085319706590740, 399098071367693766, 2227253631387109201}, + {7913744672279207864, 5711722633374904101, 16654422138819448366, 1591238867781947932, 13785062295639206639, 5681650681074277757}, + }, + { + {14302942159889415158, 2510726813191413600, 13501150440879192520, 14000061751928804479, 6039954540724187037, 7505529269867033702}, + {18250665573771576073, 5127325503233443708, 14065731457493758594, 11160674673771208971, 15693171419798520829, 17233795126257791284}, + }, + { + {15622130931527103601, 16901855276484525272, 18102024747919573302, 7726517490109845107, 14147913176577212424, 12842015409583521397}, + {8781643538636513691, 12123988514306098157, 16318265076922410388, 17085813739519115894, 11427890478685706148, 13711950220864410601}, + }, + { + {6680912247635161790, 17580838069043296523, 16777963020027530302, 5469775206057287185, 16990549936692332421, 16432218618617031088}, + {16382011306148463125, 16249390935258095721, 789229423855427321, 5584503286135036603, 14761218594144073940, 14540866621986964431}, + }, + { + {9496858985145256777, 6425875918734527060, 12207380394759736422, 7438079918113743538, 696640929848616795, 4155405326832419357}, + {10690817436861400384, 1479037799171245484, 13853435209996737946, 772955156615502406, 16556804502651134724, 13405497439711762710}, + }, + { + {12180390271623191338, 2554198210777409989, 15828648806466804950, 13386302369804389308, 17877328148870959009, 17063001337418714450}, + {14566511491060416421, 5205063642854029012, 15266492670006985909, 10920630473589926436, 6854610609610056970, 4823212255031433832}, + }, + }, + { + { + {11555239510565564423, 102493428844323960, 11265440475505070062, 6954957201906837447, 11578828270036850246, 5363571767815413948}, + {10687688618938071305, 17560569863417444168, 1763490681657096693, 10285148253700502778, 228169834671249043, 3817223026964299801}, + }, + { + {11869614854023374983, 12616170826516189176, 1249571328192797152, 1152755290640443365, 17679907775602849695, 11345355428207169384}, + {92124442948271692, 15136392605896368971, 7174298541623418149, 3977850961259601135, 15260799075573749863, 419190360224954337}, + }, + { + {12941138664806365009, 78537568941164918, 4499564597238696841, 9259817189360690299, 3875404300171494106, 18031393974005709390}, + {14230220635083072083, 8633088687256087821, 9439675871539484936, 10592074684996303446, 5207584782270069594, 16579180203133498559}, + }, + { + {15911051168603653765, 12912915675404184524, 16445705037168890851, 16740563878098656388, 5961314645410792024, 7476305351043019972}, + {11904755216174892471, 4508187020781349730, 1122261304753504973, 6085882050766589531, 8389757320097382309, 13048473480684052162}, + }, + { + {17680809686224888166, 2880007448785334434, 17671705111659901281, 5357941687184787676, 6416428659886206805, 2539295694241036705}, + {15493556906347117063, 15184359621150444926, 15623522089297218213, 11422112823115234443, 10761632026600704373, 10659378440527931495}, + }, + { + {3820135739709169880, 7261377824800497120, 7489769782834815216, 13165627835187312122, 13110045944249714025, 1304982596015592431}, + {10409327089880860262, 8119523470638259517, 3634401951306540946, 1979100535727127060, 7288813164350284510, 8247925357758448450}, + }, + { + {12278090077201324890, 16864061172993697783, 5587071207462858732, 14536122420710742668, 13859058519726422179, 10645667192932212843}, + {15670105262718068703, 15430134228548786966, 1251089591865195285, 2149683357007094264, 1836398382617121265, 16062290149085488761}, + }, + { + {6401472755905860665, 18251568613645282796, 4758943616732471246, 6655672671851225203, 102549765979647744, 6901551898032346073}, + {10154259747808913943, 13030720662056447919, 2754179948730913899, 214967400224523605, 9208467612937514595, 16909326990814546062}, + }, + { + {6054271246698272853, 14544060829566630707, 8136820029398201235, 953136503654279040, 84568208454785546, 14305961879546400571}, + {1732011551860061479, 11399625830128770326, 10400513758237997842, 3165162339732221581, 9416667999137637971, 17092345029934304618}, + }, + { + {9400098298185420887, 5556041148968335564, 6912036430365340369, 2944702321639771461, 13167226429156120766, 18187144612223747373}, + {7959639088001081413, 4236408582243967575, 14543785681099574184, 11098877575745565163, 14302577285379639548, 10484088530600671912}, + }, + { + {9373483053259607268, 3543313042332813439, 17074705243236711793, 7450654168557338084, 16833050907477987107, 16070783762419210385}, + {540551482092433485, 896422619371514104, 138542949191418634, 18265302404419375371, 16792245401695248275, 12353390887345526565}, + }, + { + {3539472665850408941, 9973857813280052924, 12971804241703503646, 7407990072499301360, 9559955945280406647, 14424568234166047002}, + {11096806861225971603, 6816003284380469282, 1147913720130733539, 13720120058704725060, 1399756058361164073, 983212633898190589}, + }, + { + {10664997543956449171, 454517167775805631, 15856261682659737800, 4154393874169146738, 12268872310704088235, 11262767255104080967}, + {1686376439172079011, 12012369940855624242, 6114883187951156869, 778196593644747678, 2384399524034132671, 15059515630710187014}, + }, + { + {16693905404142293085, 4325377301783117143, 2580347499530969883, 1407527347166788600, 17454091049478095854, 17446410903937548513}, + {12048478360023053515, 756323182854419638, 18183393958679661690, 2276830709283047969, 15484089378884863933, 11532985185158241406}, + }, + { + {962670163839534853, 8108389445709454545, 10885345009931744728, 1709075883125195127, 12639892596513679369, 7994345234505196064}, + {3957358292438775986, 15177501453635460453, 5749874344089288877, 13980629880591955685, 11290207695256566671, 6266738518930986595}, + }, + }, + { + { + {2112471176772812653, 5992610445858141042, 3359824065683384802, 14910744199028914975, 3540279332055051816, 7481318687562895300}, + {3778660497841133917, 7665160960416784403, 18344176739282807989, 6652353946044311969, 10335050395834175287, 829161198718552289}, + }, + { + {987187890721916756, 1180893057043299417, 7997694989088471290, 13943477209509617880, 5789135275803442933, 15003053876978578152}, + {11491981179365890542, 9783628750553484845, 78941951872642943, 413130106196007898, 5965786292528401894, 962843809509488765}, + }, + { + {8077344451961036015, 12071091132773222174, 3465673301214104928, 16928369631937685883, 5355222520769513898, 13361191077839573619}, + {10372078388188800788, 16137701973564428727, 16378364657125535444, 14147781750402923873, 16760187636270495320, 7550201579272756957}, + }, + { + {14084923669266627263, 7553568273380849735, 15691370880642541716, 1999581770825966126, 4575194939013031822, 12495949140700950136}, + {7538580687408334777, 17053011349491117810, 1716759308796398676, 16611187257146498231, 8469759805465235212, 12974300428352030494}, + }, + { + {859955691188282569, 13352606119576189973, 3180693414073792430, 5959867301005659300, 13835947303818547540, 162851927886880075}, + {16769940376654738256, 9939117735531953429, 13149699086290415664, 3305357061162836785, 9009939707511121271, 13981210403713247609}, + }, + { + {15280492422823355766, 15236897741281284068, 16375251899685919662, 2375999612321238009, 6002020302005330277, 4867913810970375080}, + {11372869170822493237, 14166186567360268594, 4761141133604528346, 10183261926525426109, 9349125973207534361, 8199961450165628412}, + }, + { + {11291117276267195299, 14973998728699422778, 16425655270225982283, 15329324944689574083, 7979576976920559153, 14994530807417641960}, + {16703738914238983421, 2834957708878859809, 10020001258433278091, 3066018529077593047, 7903800555273951661, 13033393171964190854}, + }, + { + {1653789232981578275, 952371650849832179, 10927445400776044968, 12157933816885775189, 9290507541884583865, 12826421106361126902}, + {551558165798937217, 1729101615745031644, 4791663141996814522, 16904640700879459114, 12874781959897756061, 3513760684524485070}, + }, + { + {8207357056686195321, 11137222442007015668, 15645132451218915478, 3105709674939731826, 10607257435983024941, 16912916807528355764}, + {6323399773421218599, 2748551999608353527, 8626149829332963214, 3316199943098194703, 6716681752170794378, 2936787212120932946}, + }, + { + {15440834838198080689, 931869522652835594, 7592851540253747298, 5478596926880972349, 6652810167530776258, 4577181343372966932}, + {13801964408907248297, 13739037151947376992, 8697064982745685286, 12401883107738713638, 2448777686813372733, 4016677910779410184}, + }, + { + {930435436459751529, 7291335211208166106, 8662147097774800941, 1754832412907874485, 11716049188393912454, 6088054938180223267}, + {14767636360685531193, 16761369108402789416, 3774240452651006015, 8812730740575156268, 2441588704916651547, 6532572576667981720}, + }, + { + {14520642821078702231, 9152978367661523282, 6377069713671652085, 12296007202473970904, 17767917081512566521, 9137555524675129570}, + {339729066832634027, 13577486648345315707, 8784435346186982538, 11788746341130221385, 17389275735918464762, 1499091028328348784}, + }, + { + {6895056287740805821, 15551414767986485684, 18245567068949911079, 11780461279934853858, 17514165768801962395, 4604945067503181622}, + {17970049594076464754, 5131328972180637912, 14013492191391630748, 13860986326135334440, 17262237096531626622, 15447317764876697344}, + }, + { + {9241932972904406753, 10136261935647290984, 2240671992235812692, 17354651007012787836, 3225243242586300908, 3556466132564431774}, + {15035753318658290895, 17220643029876180698, 5318335111039228183, 4424502322878902841, 2675895669690622325, 1884586557676234029}, + }, + { + {5250110106303814488, 1975207799636297674, 13532036578394208591, 3969043079520697544, 5728723625100363223, 7158702673653973988}, + {16195684125677252996, 4149751094169622529, 11846551373222263809, 13787057146822598191, 16962390587607642862, 7670754904406853980}, + }, + }, + { + { + {158721254439694626, 14016472328785146057, 3215742685919437659, 4283116501421190228, 14416945229571419453, 3260361759779720928}, + {11569905182149055942, 13365945824267994176, 9560316005976549600, 8014152880174667326, 8983248355930398915, 6003107822914970018}, + }, + { + {11769244887375954354, 16734798255146218250, 7450660885486578621, 13241415025693890385, 7585701487764431710, 7068349087572048763}, + {11673574025706412973, 12054573315442038381, 3465595090934871151, 14116150045410515995, 16747453732925727391, 2053788472539252039}, + }, + { + {8254128435175778191, 17961721281775180333, 3465171206067904370, 17786859311178538748, 5750765123994852536, 5373889982583891369}, + {5947994461711601875, 4264969794290341217, 5733140740964071824, 566813084550213227, 3008438020483790267, 9393523034553376074}, + }, + { + {3488992165971683960, 5408858964234561845, 3943860838659448298, 10606370049279338924, 1497444843416374478, 5655792335049791924}, + {991809778400186594, 15331432498205269189, 14409135173658903226, 4844024566576229783, 8437358490135848140, 15238255612948837438}, + }, + { + {3981945260589053255, 5238428271891653292, 17666609270668276737, 5136761226420502964, 8998438003563725182, 2026122825528004680}, + {14800276493572942057, 12172612348684122426, 8309771000688236057, 1565694914599287285, 14726316506042877882, 9150853180590412510}, + }, + { + {17340721586269964714, 217529583853973911, 8591243800256753437, 13887006532271166813, 16938831598502428118, 5372377227102637491}, + {451250041397357076, 4989306166373412675, 13630414847684491708, 3996969106514180362, 2275313485002180685, 2301296218808044149}, + }, + { + {4291242465719312676, 10844339224270608311, 2121832093979610215, 16773046612047697523, 10995952484439012381, 12237539089984856911}, + {11585863874855568916, 13849634900022210805, 12285224492680055214, 5525310790718599719, 4273270766854007820, 14699310461571394996}, + }, + { + {13339800343403240396, 7709432974418657015, 5301385839232292107, 2969538953397180786, 3800860603349698317, 2508772359731689564}, + {14378517458066378354, 8882708296441449226, 8558667663066577082, 17076224488360060086, 16842404219922924015, 17095860696531681717}, + }, + { + {6709186302039351677, 8451434297354584619, 4758927276311396271, 12322849161987713036, 3702550498120081225, 16306272953980522166}, + {1037682183893893480, 14663627147661191968, 11571949542375472706, 5714568058845181963, 15981901038671696988, 11976708367028629004}, + }, + { + {11207839561296012338, 4875894249269467127, 5107711364762712689, 8192718242078932005, 5352423725257079410, 3571810293108102994}, + {5515509758059991725, 7457615682786317799, 4860181546702428200, 8930731253012747041, 5659928076906420302, 7496101079865843064}, + }, + { + {12022229726853822462, 14706436872065443302, 3389725333074082852, 1604903701561777472, 8950817588405763739, 13190244158376540107}, + {14016236309633488294, 8475371081917274175, 9944826967483171109, 18053549564499967546, 7930723406558155263, 4626913441465521473}, + }, + { + {2715165459263721907, 9674001561320555387, 12396221282651500645, 3973238506618524626, 7278954243806937758, 9176131567068265043}, + {2372457887719386534, 5022496686095517029, 16913411979107538659, 11089957791594060315, 3232871551299762533, 10181928965032453240}, + }, + { + {13077103522673276166, 13953006147353067459, 13937321564029460312, 11775289180731898757, 9005718366158380378, 13645760323002406046}, + {10332481686150199318, 5314709245555453273, 14740068464959386027, 39846363329861329, 6936258174745205094, 15346255345000921785}, + }, + { + {11902235556304614325, 9716523013532558935, 6408642420452662970, 10910145013733353424, 10487750635963941672, 3263923993556113887}, + {3979263897601764948, 11489365827974628507, 5295637109315505928, 6972999611880974771, 1108442977000346725, 669149380592427324}, + }, + { + {1157132430713125844, 9939423443740928614, 7186655438202963643, 14372268141018236868, 12646427359638789024, 7392025192496396479}, + {11172990535174193001, 1182082134585836558, 2511299207918210769, 2172910944443379020, 9484470871043901670, 1230325285277248870}, + }, + }, + { + { + {9665579348258363865, 2087918080557695122, 135537599087992531, 15215723868160805464, 278908927488187941, 17503720082240216915}, + {5744927809331053213, 13798298316314029615, 9696283778270547989, 4870358740201919966, 3439882118475813321, 4143783440792496951}, + }, + { + {7769489242957847290, 16684864626270304081, 2879249682816493383, 6265076094334458119, 6886499504502814482, 14195770023097875547}, + {2631387143433279288, 16031347118135873637, 2311344129842860939, 12572114332759228948, 7732595900970909006, 14311355333002206999}, + }, + { + {11228237540890978828, 1079293124827979304, 7487220471408651681, 13548174215752533194, 13320332840506137434, 14014587572505105518}, + {10308451336179922295, 1971803029831470018, 3369232812295268792, 4471651358093175556, 12478347644279240383, 16248645353907765158}, + }, + { + {881896658963638416, 2026615415208131225, 1975014851600144074, 6268313587596276173, 15189049743474081851, 14141869123482614039}, + {4695467916519996154, 12465708679157180870, 11422608049605393187, 16598608052494558909, 3756011221236491774, 8063000249101262382}, + }, + { + {5494197245461486331, 15364625217797987691, 1134233848906038918, 7726911346031918100, 15503554540833122104, 9953446955839429175}, + {719175439330210354, 11993546280891538825, 12098356945782186267, 14761662828882868605, 4054521887535828822, 568836477239613961}, + }, + { + {4895604554173507232, 12377758172579626987, 15401866685509290286, 9150363264406780287, 6123727635885171426, 2013086363637951538}, + {1499537875756117851, 10260341551071830418, 15012297749974575104, 11295782034836939405, 14699384490428880947, 4058564242175274162}, + }, + { + {5697099271842625185, 11897498065292086007, 165253007275908673, 8683995743377403005, 12085865296553972670, 5953667974147175744}, + {824129719356249097, 17390674672020315024, 14600835594781296921, 14157907740151210460, 14620516163389564217, 6402637035301660148}, + }, + { + {6814805391879506821, 13733360575773203028, 14964423068624665929, 2845857522246553444, 4737277078061891938, 14974979150537406091}, + {10199845472834911755, 12457032282300718325, 12509382395143476419, 12723831063072297351, 9804751755261218393, 9738618498716380065}, + }, + { + {12971320806846916743, 6373340119401674163, 14940450957165318789, 6054294310918381610, 16262716106286726308, 11738163287805791020}, + {6651936162381007336, 272251828638977954, 16782812253935098255, 157477203834421822, 9758166039167226447, 3757098019902685001}, + }, + { + {2797914620292272718, 6824445594276636543, 7612944636508242479, 12310914090409404192, 5900414063625470828, 1578574444575760813}, + {1746963247281383230, 8358183515669196030, 114807234762833252, 3434169954702426697, 10754906727586255973, 13248437026834498974}, + }, + { + {10367883878888843605, 13209011820972196415, 4546179109832588353, 10048885285637082041, 13740390940277885181, 3897350217203120410}, + {4420913340021562814, 4575173797445180389, 9128196763097374162, 1507217548372129726, 11871635706539357657, 731457449257913541}, + }, + { + {12327596966828336878, 12044047960030865903, 12590450765463213560, 10493254635328920048, 8651077485178084369, 6371936575607168909}, + {5090312744055455793, 17685482889085467956, 9393295431338315435, 15080146787113774018, 8385657726957576620, 3383348226554775383}, + }, + { + {14588590004163196212, 18274572275841358391, 7651897004994035620, 7427055507937608536, 7778320234184341217, 16916348689537901989}, + {2419944192928809758, 8857445667038434995, 11459028014322971295, 8519876766524924471, 8951414995530421895, 11510037251020037555}, + }, + { + {15790971709064914690, 17551616639212949181, 17685426066530430956, 8470300602731078412, 7440168085597529492, 7627174044502506272}, + {1710862283221741969, 13964871482694027643, 617332758617265162, 3711135961102404485, 4655924078995340065, 2113569679148694735}, + }, + { + {2154983266339619301, 11861362304971063147, 4258182409238841621, 6253453232321750157, 15909672604786711366, 1482606699963487564}, + {10258975978079697240, 4952492506950453020, 5749995703462780308, 9651071132904525497, 14977376759992362124, 14011541847161628118}, + }, + }, + { + { + {11998317121553500299, 2582325766599936510, 10226444194055732720, 6578918458494290458, 16856344663543484552, 8023206593552703223}, + {10896969734623517030, 8965286626042649860, 15869898932136510986, 188758287853374907, 3043553330642597875, 4825743274601412340}, + }, + { + {14811264716270138923, 9172209925012047033, 16222958531492700587, 11130963356286229429, 12646613143129669873, 15325043128670486670}, + {11347507763721459405, 12900058314528881450, 5171017319841793302, 4651322121729076016, 10307557446743606869, 6055886709749279778}, + }, + { + {8183782069332642864, 4400608719297868437, 9887680839598123793, 16997602958862657609, 6307175890874383417, 14450424872255242386}, + {6872546037892456974, 8399143418250687787, 9134623456632335969, 13760709404346799708, 12989741448870036879, 2909960824443156805}, + }, + { + {5430907109181030283, 16527229751480129461, 4626559521361924187, 9923786072582407723, 3599523730508604347, 7403949125284615057}, + {4562148631066323166, 5805336986933520185, 8257255431523708381, 4507203543461357226, 5619824380968497684, 11986819821861980903}, + }, + { + {5319261111797206279, 4857131879138244426, 10148248807556188825, 11267161186123495115, 1870130028222872285, 2706665384656124928}, + {17899120971855949667, 3796430035357845496, 12931652797283355998, 8202504218162242839, 4247443200870022359, 11773865795553695256}, + }, + { + {6197233327569567984, 11863568501944321119, 10309410692812279373, 18064151364176098605, 651644022956656301, 10015612095276572238}, + {3712079372837513925, 12629021524719225747, 14243639867450874095, 17310848059794411658, 5934269651842912614, 7281399930842709350}, + }, + { + {2511581009523899341, 15219471439294737719, 7319331989694981973, 5501409405436918279, 16976076438864148161, 6162909726068177573}, + {16008540889386100268, 4274652746244818627, 12394070200068488667, 263293445411113815, 16742410837666591362, 13337130885835734358}, + }, + { + {3564999479898740369, 187214543496040556, 5760327611422130945, 15928347702080842921, 5118946570680674960, 13188149096923612709}, + {18076374160986186344, 1142074025295083811, 300437958095382782, 16478562199461788278, 15937231598514871133, 6966938597435454129}, + }, + { + {13530583958756622194, 16230919531879218650, 7960208013515434222, 8928487179767185338, 4297154246225352437, 18083693613832338785}, + {9858555096056225549, 10553430097471230871, 12398865197153772201, 2169073753193400460, 15971418942371450367, 1091129085077207635}, + }, + { + {9681282287508526911, 4228346943866017698, 10211475224895899114, 1698892461040930260, 17803383979093774988, 10310416508095123236}, + {14111993390309359036, 2601950955716363720, 6730639879397050736, 916578826304680783, 3894845782969558019, 14122184451458658420}, + }, + { + {311655445282733128, 2366794277731754693, 8447159453573507161, 12862724207019311852, 10879028081424972165, 3930832077575481179}, + {14584836693230155370, 3726981236135324025, 817259866591722463, 134655665446114637, 16268648157415006878, 355268316254117109}, + }, + { + {4860532288606162276, 11004314106081710488, 13906897172384614977, 17082455640344885157, 9775380650399905532, 4859705013148787294}, + {4027669077440695384, 4484628209953599288, 13138896518548468962, 18071971245715712413, 11010957284943999098, 3796309351538330539}, + }, + { + {13949338558872623983, 13999822274187176958, 4733168546809278902, 1627926466897635936, 17007149557493659471, 13788534126928728612}, + {6675844921694720089, 9637011121617213286, 15573984252403764668, 2898513089190539810, 10606052222462092213, 18300597426015463926}, + }, + { + {9020738854941186688, 1697516889381119272, 10894637951430404070, 15457129124942948177, 16383433189144661467, 18047431570429355124}, + {6107850723361208829, 17243425140244995421, 13395554308381924491, 1364807545420052892, 16213716354723238556, 17690236310907832398}, + }, + { + {2522091960819005086, 3742779915092319093, 16499486839317582864, 12740630314665543268, 1980734899856062565, 12849686842043469074}, + {12935833425771077826, 83225990269841200, 15699446177561037505, 11225486016581978415, 2649847060493723129, 911854890207243944}, + }, + }, + { + { + {12424795815234096738, 11929854285805518958, 1614907582435615152, 3243608722624509713, 11618089050999655243, 16450991037761706190}, + {14791827265740380694, 16253295635917069809, 12967661044055669288, 8950779205008902591, 8504639429942410457, 17167078365929060886}, + }, + { + {1313046233449071650, 12998265777408570719, 4977133893460974672, 2561165906571264315, 2564935401972071022, 10644027015828213948}, + {10686048288050006911, 9039002669587247392, 7778186232262317846, 15418338195770720773, 12395635872224741505, 11648627441950590376}, + }, + { + {14681037105441419090, 11154412906553738939, 16558423151175496356, 6285030627926492227, 10290832285247957235, 16522750161805300815}, + {4436228920200714418, 2409858423294994518, 617155725363325676, 14011524653303053004, 5177797359236803245, 8290899194960599185}, + }, + { + {12435263296022000489, 14513062589041133148, 3001590359688622693, 1093106399238867375, 8390630854825882223, 5298071266967498440}, + {9716703994510762833, 139163142171401861, 10954439330188883947, 3997722728391005309, 15245271690519046411, 2686187644733347867}, + }, + { + {11528745980014882011, 6182430424023761381, 3475082923360625607, 3076073459063455076, 10378442361972777951, 1928653322025847242}, + {11275859159200702717, 17732962924665430019, 18439987823449214394, 7064944630179873720, 3304719418024411692, 2153772832250412099}, + }, + { + {243789443148875657, 14348824346423476228, 9830514620004209466, 15033617551094748322, 13287145353793822594, 5879970292069402674}, + {12214538079058326601, 16847679853452995547, 18169365757890727021, 16879879400199284117, 7800932071917017135, 12460054258572695815}, + }, + { + {10090114058748492201, 7363290374561050715, 7843838338279350344, 7920870311130336096, 10170914017871367100, 9865561470166537637}, + {9334256772527683640, 8581897812539458667, 8599471352803027994, 8796183458658268985, 12659201731590700622, 4970311472744086260}, + }, + { + {11601996913454808056, 2966774980339442523, 8806491719792949791, 10028525763203412255, 17850477211982122081, 13173986239201796652}, + {4294659508144450490, 274180317020745003, 4247201611788433227, 5939975532167416714, 7655114550003254785, 18074517862019706540}, + }, + { + {11681890644329677881, 2335615570183618708, 12700694827537854982, 6177201878022338797, 10745204280522885060, 5447698501831385650}, + {13944548355133223332, 13427954271655744372, 1758846050835724655, 4081176162908411954, 143138826110337136, 1333853703322284874}, + }, + { + {2393802334236414897, 13598149804179976864, 3558363201881498809, 10555101826553612932, 4227704841951906537, 100142050362332829}, + {12474424570957807697, 1991825797392445989, 17078870348149694209, 1571893036435136749, 11842302574300496814, 17791109433102614838}, + }, + { + {8550811044062711868, 13733211819722662864, 17711131098892634177, 1540706468250987542, 3800475869236690840, 16871019571035580709}, + {6156757348293294843, 16929121828562583242, 18390632985111796241, 11618787844989532555, 10141372211456532826, 10522160836096579564}, + }, + { + {8165081209334278958, 4318582065069784775, 8081574069194739336, 8837613972613683181, 8266196792698516362, 3864857654878740737}, + {6803499104632318962, 10355487208936010141, 8739779104813710437, 12797187628326760113, 12836259478886858533, 7668861972296903573}, + }, + { + {8680747440971223366, 9209090258749385791, 982535240747476893, 4968038987235564059, 16403151423719561525, 11948841256741010288}, + {12550112619626029423, 12104110998874624802, 7496321954500925035, 17315621249735120555, 15846515502273544800, 12285193498005904194}, + }, + { + {4458184136234141447, 13912288647211446586, 7117356884920961264, 5467268310638154588, 15245220777673729712, 1674280713480622742}, + {11266978702654960956, 8634408824232294194, 14563437357018599132, 12842855704844405513, 1838111782288095759, 6169326332823577777}, + }, + { + {15630121427809305107, 1264840490697624404, 701327106091044566, 4687859862481244801, 4265389202393581678, 5961642557976590205}, + {6203324135029419236, 7455513180678088141, 6200001572379546985, 13701878844691679107, 177549874223488145, 685737752624899694}, + }, + }, + { + { + {17917652049280870568, 15058137289936578634, 13285085763522663208, 9845541049437644680, 11548676527161727192, 1593118089521595216}, + {10864003938379607147, 6682934333876753207, 8053350681795059753, 551995444074003321, 3834039616241196288, 13845962738460690774}, + }, + { + {17541102291453342324, 16435134367897898459, 3939250297619897100, 12831289266484462644, 2672302121940744249, 7983602741649631751}, + {9523831687169710855, 17856472103343426230, 10843947846323217757, 14788689810244029330, 16504581624723904320, 11424882804767220488}, + }, + { + {2900014861634585510, 11023132652887767105, 2781680546817585197, 2476750077618814416, 319701938011681702, 16893912712850804803}, + {17902073833702688977, 7222956556801351179, 17573562467147835250, 12198424156050387872, 7580627929306217147, 13998202371779366768}, + }, + { + {1943983450904780125, 7408346268399740105, 575213954926041679, 1462915584543848271, 2793007152100116392, 14469842559338475936}, + {3871734769136634846, 6700443490968311306, 6647535974540130541, 16864861301170855711, 10601116194391087412, 3578030254148841428}, + }, + { + {17076168913451726474, 12485001555750504145, 14937987845634560457, 16395528327395759722, 5249566901251131187, 14663685647372164951}, + {10098944853248455296, 13972698641100795994, 1737447218715933176, 2714092024085619006, 11856165348735870270, 6799485136302256186}, + }, + { + {5871871142109447713, 3293520181912634558, 7939325551904631466, 10798118573813278311, 13730791012248413123, 10321504720930821065}, + {17809680245543286190, 6650716579366069822, 10928266693125200322, 1399611361785322991, 5452474480776063976, 11884595003144475719}, + }, + { + {1276101160526991692, 1768819204291469464, 6678258399213622671, 10371513950625536782, 13597732847202290270, 16825083293383279230}, + {14168055895026590584, 2774764008800741021, 2309957760746875777, 6610907305570878050, 9706314202777059385, 16449252911102591674}, + }, + { + {14813060919741573474, 7098612088410986625, 966349190955014421, 5030549973018435870, 16698536462268084234, 604473235996320648}, + {10311165654586245785, 6873675636522594928, 14584273072844681489, 14316320659212458696, 1005079606220503069, 15954821355200367890}, + }, + { + {11183652692239073486, 8884116362394548598, 16492077002226140882, 16441016482531564528, 7470807081036429707, 9739141751658800808}, + {10370008242233770052, 680077688048593942, 7591564246708190689, 3645206790017203395, 2343053669027771998, 12572086616810161300}, + }, + { + {7519219331676774985, 3636740765491217067, 5116697285820822168, 13451090039382057704, 1896663396212964754, 5095592986735787153}, + {8207963783074146802, 6043379100202585906, 7652091558617243287, 7757654959377578673, 6081998859385971492, 2348786168616402284}, + }, + { + {7133122685181885176, 18155906669418812507, 8358116164721036434, 1130164626051647366, 2252530757558141869, 53649050676747504}, + {6768458751052378608, 10192709252783071229, 12663625005887863612, 9834336599446253001, 2038072719748979950, 13671585969003086743}, + }, + { + {4173851761541023368, 11613248765669161044, 12438237453144940177, 14553457703654741901, 12124876439154757010, 12300911432501569717}, + {9801691717672785463, 15951088982856589802, 13753872259817625075, 8949450803632947356, 12300776088138489008, 840080730448769108}, + }, + { + {5858476980082527952, 3415994521904095408, 16728629317865207261, 7095110407248715536, 9601602711454432831, 13502772203209999571}, + {8615007365984796321, 6504095591339955518, 5137600816385143072, 13062434456967887391, 4631991737746920809, 14058443721136417450}, + }, + { + {1656883461929285686, 17999602600826473063, 1799632323068877945, 7732508045647761265, 10873882997372651873, 3506525810685866503}, + {15989411289191292639, 16479471154067566511, 2001393974257662209, 843909327062680514, 3242569658964181728, 8478074943121574788}, + }, + { + {8836486505210648494, 10426577898344062793, 15007011756836364324, 313253543022452733, 11238239898276565663, 9629338715516113114}, + {993560883855492779, 15607551791478573230, 15193357750834803730, 13987812869592549277, 8887672059344069418, 5889521823488896936}, + }, + }, + { + { + {3145983761589624622, 17611056211316241576, 7512834765800752414, 18184573603751780835, 242382926403786594, 4397520716964975958}, + {4247119304022133294, 8685419354613982051, 9278503793637334290, 16772431670903233717, 16405977360280723789, 18340424413449720973}, + }, + { + {7278488351594086657, 13741799650370721053, 7077234897085578231, 18054749312950890784, 18263305810183755751, 17993843681498715672}, + {931117702416785030, 5163042803543400584, 7302612788872058407, 3506972565756252769, 13474801549451642960, 12996402258486911171}, + }, + { + {12722582186246792962, 8320877050791714570, 8335877567392598374, 13905858286751392828, 9736409409986876840, 11481277047355207753}, + {10562168749192737373, 14796357906073824644, 5143880557235132223, 1571641856571928949, 2271316785876440591, 3660167720441454348}, + }, + { + {18049602908503252792, 11214422395908641790, 11430824735860140075, 2019476279635404969, 6289777936286416617, 13753051460215424762}, + {11815459366199608802, 12257585796234971843, 8445139535123038318, 18054472803182783544, 7741484337923311202, 8173824012406015686}, + }, + { + {12256197267402510387, 13981324545434438090, 8854870249521577116, 1322567737371616078, 206839117288725323, 7997975760757403170}, + {10936017633135714664, 7366988068807007130, 8063896872358704385, 2137626719657327928, 3857424773492212377, 2719356304578840102}, + }, + { + {301934102174571642, 17806324394288773834, 16260123717658024207, 2047056936294915604, 7772436465589087916, 10948745767775306521}, + {9748882939263142737, 15303318171412953528, 951366600399039153, 11773285376383557606, 973693395285409021, 17741704800677625463}, + }, + { + {17924453454819492958, 11063986742596412626, 3141255180896459304, 6613007634173851965, 8230425337359415489, 9592328879812768331}, + {2074105989750243852, 8292968072994968539, 1989007282115330477, 9773026020534605403, 575143206156426338, 15794135741551054909}, + }, + { + {8693419915948057531, 1857557492170437980, 3828328131632721806, 16028252623001538746, 18359326643571678076, 6797739150028305116}, + {5767011240779324391, 1596344978223521735, 17443341853132737437, 10141092192444507922, 2880787045172334942, 2732830950861490359}, + }, + { + {3720564070329831762, 1116290302908559499, 8937540830788665972, 9131941124777117589, 17948366512937030527, 14685135061941669573}, + {18087232427084058704, 16817803762356804259, 1008977742792474413, 9381957960616185727, 11019890287218060046, 3802083666870379154}, + }, + { + {4862605723300674513, 9575672576917996640, 7558492797250409763, 105451604303370500, 16038157294412882498, 8761291945534568660}, + {3569807536094118073, 12152660506168626366, 15524077973685866450, 12984443099952829222, 14525324946986225232, 846797246005295625}, + }, + { + {16118471591100195500, 15075676621793721135, 16827468519303942764, 15179554880581807399, 17607860075908872130, 4006056291125828527}, + {13532541668080502449, 6554388530128575875, 11492311210085820804, 17407862345050568276, 3079559812598152049, 1961041605272859295}, + }, + { + {11643823884368608148, 13692078871457260347, 12760667246660146798, 14632954658001918449, 8493526038677331601, 11799308386431974644}, + {14675672791238509138, 1711971116872200846, 14683263505637045451, 9945937059533842597, 2533449755114148002, 182889653926968389}, + }, + { + {12117719403043995995, 2911986408429249777, 1810092692597231347, 18376367531841849458, 6595121441567685408, 12086792012295038031}, + {18169524376531427837, 7290300957931658086, 1193279940028308124, 133756179824057793, 3153937764794889756, 949814549860399421}, + }, + { + {484820520924399903, 4326328160527123330, 960211674708882727, 8917024768858500619, 6654526459358471452, 13449950526572072120}, + {9962763721058274024, 15699755065403197794, 16510141891401774591, 4621297269285137763, 9994000521116731271, 18052048126792112397}, + }, + { + {13533215919022444391, 9410324278985615744, 9852634656100194208, 1155971444710515203, 2911320463483837737, 231084108675667411}, + {5261097282088390531, 14003855699351521178, 17744595804999607148, 12877326770237543851, 2381016402869931196, 9246060959671779703}, + }, + }, + { + { + {1480509573599822036, 5087695994006556261, 17552775024242623509, 4908461990210297503, 7162610856648884601, 4093820247209466993}, + {2797950306474546244, 5001803039722689495, 6874955169311742070, 16748306778408052918, 4663084007893308007, 14696281298177607450}, + }, + { + {11992083281415385424, 15003924313644360188, 16060749513147241488, 15017414158265602339, 592682985276747063, 10327384700468822392}, + {12963019048030648384, 9853215583316433375, 5853002447766629843, 3573502149365840495, 7038518580360953609, 6673767391281747746}, + }, + { + {9298643174512728477, 13990767093997540279, 4393323960646334288, 4483648226430512282, 8076224304421767616, 6102759767515536930}, + {3652706241006741637, 3186805786206752554, 13272394214313265857, 8224305150459867349, 741190616027468712, 63238693198034713}, + }, + { + {2449597540862217259, 12351778639332774926, 262991594157788783, 2680188811965411501, 615952274938618918, 11101057916879795178}, + {15843704445146482504, 15768003479919439006, 16910795055422658817, 8210619241519359236, 13238407118245991998, 16212017713818083131}, + }, + { + {14806494457242751533, 3449804849483160156, 16962452567092059192, 9141394773020099337, 8870354660703521024, 3891566159386999852}, + {6146187894824960028, 11953410583785840196, 4404488807426703410, 6773066909874546524, 13716047320419439079, 4345501551123937401}, + }, + { + {11770160881016297977, 912473005790610286, 2745675273862880545, 15571792568792967285, 10677789776282348899, 295569599270057816}, + {6996654843946379963, 3996640705568842675, 12385530671849869858, 7412246026156424081, 8603296241680544804, 642377289008783440}, + }, + { + {11971881963673402517, 5439855382586921512, 16727103775229765963, 919596519199508651, 17937823088055377422, 17176167766106996798}, + {3663817202726401586, 5233288534404927566, 12262379145132434982, 12524678428958655570, 15158879251407581617, 18113402803324294467}, + }, + { + {5911831825147712996, 11728153653307965512, 9638203731413711221, 7948268717672672186, 7633819740372611413, 7035796435141898619}, + {6174193923587781027, 5408370123448680957, 4626366961562317252, 2309742647852990490, 16455916524028211003, 4504573468719265476}, + }, + { + {9058031745280178311, 690568667783443719, 5828783220548918226, 16050974080522553564, 13601922218850425804, 8808996512886455105}, + {5092307204676037523, 2947766400331304188, 7168571072799599807, 18029292030846640494, 15149715177238445188, 7857041415140644235}, + }, + { + {11743616397824348491, 11497771481919230308, 7158569983910845263, 13603604323915554008, 3337542887194115557, 14157633378937758586}, + {370281458279622519, 17762634864406198956, 11337855845757706931, 2929878283715844237, 13865396000587203957, 7059037007931834351}, + }, + { + {6973772658311339209, 791613060143613947, 207740421140774752, 15112398720810035573, 9603899779905889177, 5467205843920466750}, + {14380982275701503993, 12490114314596206995, 6782837922057127896, 8380489751197838412, 8510299632595261617, 4701772950345167165}, + }, + { + {17694086330481919631, 11636328947060876015, 1995706737774084856, 1925297315118813321, 3075862652270344957, 6399044835008845126}, + {3179065217616615921, 1550261549062697917, 6277396572721355536, 17738387466266963038, 8634038426968132537, 10728928687683354197}, + }, + { + {13587993255682028939, 3093746275081235678, 18152806066111947732, 14870862873010104695, 6947641398927171301, 6167792530140134466}, + {15651443704630473260, 6642812576181662272, 17064834710938919444, 7375543199807976966, 14845457653197598647, 11635197020740053176}, + }, + { + {4049527531120095178, 4601134559076758743, 9749942598880804868, 3990727773964515788, 7976713942185951445, 3046031092694896893}, + {15903097778987665452, 9044411259806049413, 1100762861888218692, 9340935249673778045, 13483058690067148645, 1545265903606923858}, + }, + { + {2035047113284776118, 14270860440293482779, 8925762303886288983, 14305197949489621718, 10202635115093639414, 10612436012257691297}, + {4441413877178186113, 5982857664255490920, 2491752418622962596, 9740828623410492538, 16822026648654939159, 13367270937584463190}, + }, + }, + { + { + {753467293193578188, 14319628483702379607, 9902332266754012588, 10961250711959848420, 14561592831116999990, 5289034957582773903}, + {16878255390347501753, 6614600699964682579, 15224133068199077460, 8845898800353928686, 13501508557386903079, 12790515894544276936}, + }, + { + {11011452278678065531, 11497839782101232733, 7285443384376562651, 3269734604421310040, 13431092833461803889, 3947360924216217744}, + {3251034893487035800, 12202372175578593549, 1928365734042402305, 13907315815562159932, 4942146767537177575, 9208365212678422011}, + }, + { + {12195725836685438469, 858993920875325442, 13838230858435487279, 3353504415316812969, 7929957941866392419, 14225218649971283983}, + {18163292212490608521, 5208475779203961411, 18277468513758427896, 5137327622216988361, 14819617095799940577, 16354307604702819275}, + }, + { + {16781294408245827650, 10125764934688471810, 17386045350799928761, 7875599535676923213, 11646654052414081972, 13301057675984901743}, + {12871815118558604397, 730917248827024292, 9514315608146867033, 513190696593073824, 15098974280120040377, 16196294686650511719}, + }, + { + {16909596444779110671, 10723968674526571591, 10996553782910854129, 16341969708695486761, 8635318916065362596, 6184764740785536711}, + {4510923062913139004, 2099379644008359301, 12406019366618763142, 11660159720716101851, 9002817464305502564, 15689479522617312827}, + }, + { + {9012015558077211452, 12527300838564203164, 5537302239069624297, 4367370042010266898, 15289441745247695580, 4593879093246181819}, + {7147970286091237416, 7287559954909509597, 4624960348890895434, 4403301422292173682, 7585442950983589875, 7325469891518486313}, + }, + { + {11624314814028789299, 4829320234443117094, 10699140943317911265, 14108042008131265164, 14865288068464758045, 10370004463666457157}, + {5805719613941872131, 5896198105631611038, 1844096097102433842, 1338882622497873479, 2882306796959123998, 15679394935542538300}, + }, + { + {11839803958974077427, 12283042318798607896, 14631718929239598705, 3167303738550719650, 8387688327413311466, 16263982689936295493}, + {4641171021165489505, 15063549369667052490, 4114993861532264470, 17514729201584918440, 11567986488283330737, 11751214862996904663}, + }, + { + {7533651708740465644, 3241255842488644864, 6743080020393835585, 9662587303565932915, 14065041846648071011, 12865213763613806318}, + {3077902115599738788, 3561402121178551657, 14611443992052777610, 8057658460840092305, 3326179385599463412, 10159717164443540788}, + }, + { + {700570683660150445, 16431145398710913934, 14168612051358907826, 13260960614387819370, 12988684119093007748, 1867024934246155048}, + {6311188673107170040, 3547825519151270185, 7128858853100723527, 4250551126633259556, 32233820825017096, 544635653753539727}, + }, + { + {8186226847711890094, 120861651635567506, 15214391831057401822, 9554237535615944181, 10075996254396042981, 14008290848782906398}, + {16525833259001997344, 10952578407797544068, 9567631957420742761, 4694819969357735839, 7767798136118541848, 18127622189992993176}, + }, + { + {7372375356062107488, 14109154833185040894, 4602775210887940742, 13468454637087016746, 5719482738764538175, 4919648522641500969}, + {14001774924525738221, 1330372407151555180, 3428768277669749657, 2816692670087351763, 9277450502900005529, 13715847643179616093}, + }, + { + {6794725365200966305, 9338913627946190988, 6477518264556505079, 5413655651412570539, 3966748832123982834, 17431753968516942256}, + {2369756878476639122, 3529105775992784064, 8846093841954577079, 16453616771411600591, 4485347503114816232, 6730810021701621332}, + }, + { + {1450226730593401111, 2904272681147253326, 11091003663793942841, 12036368148456428561, 11936601964184969530, 16312603396316459043}, + {4136271589497610048, 14294570804106047765, 15555359403853426727, 10264827714357589573, 9810665706497301464, 1311018743132753054}, + }, + { + {18271820402515351558, 8762537564155822450, 6068223146661937849, 5461403608011964107, 4988573958931158097, 10363771067980560783}, + {1663617762306194365, 15095271556849436192, 3047795323021630415, 15887201493595197850, 7868923572436975277, 14683359131088610248}, + }, + }, + { + { + {3584219355111975656, 16371250505380188607, 1783498323461654093, 994193781588257676, 9344084148092131914, 15250514640734155003}, + {5059260913356645611, 15865386190442670448, 17548757651739284710, 8085895309926420946, 4682964998668660167, 5020215203959826643}, + }, + { + {14253762630740826994, 3822111194856117434, 9311588183436895562, 14738024658650371287, 10441316960341346644, 14194770708525922705}, + {10501198799087781964, 6776195770649012397, 2069471581290353759, 16296715215024806431, 4534980656861543696, 6047881007434832794}, + }, + { + {2576612335437377594, 1899682712651141430, 11887300270792449021, 11804472993069758206, 10830999119719313280, 1741753179884488861}, + {16286699122731099873, 3643516247376722163, 3682273255591068565, 6392728837720629214, 11901348706175159921, 16143485051395996208}, + }, + { + {16501275346405437273, 14761564517561445391, 4638515002973003639, 17077550066034272812, 3698823236196638906, 124739081757270004}, + {15651979540537047037, 4985552038876265035, 13897675410836153797, 6701001687129639509, 16001679255576062512, 15935676633572097252}, + }, + { + {6152665130156855097, 9705469503204567708, 13951924545067113356, 2434138635056070528, 16591230788773292318, 4426260001178290949}, + {6390121195308333473, 8700572060668754242, 4812036275221797020, 13956720073248299438, 1902555843966298265, 5202141163826482301}, + }, + { + {2205395724283622824, 14105060019721358203, 15333631923716583964, 15403277868996709611, 16053651221022177038, 4784915253302323097}, + {971368063439244399, 827094312859966805, 1289222939864657176, 6606646522754926560, 17884747739152229998, 2668818780560918135}, + }, + { + {8525645166886970196, 3134143460247871741, 15116115167560752933, 3078800960701409856, 13059504075862532550, 9108153517754978547}, + {8250610785324912755, 9363672325956190127, 1495074847941437905, 10404043508726832050, 3904454763323616406, 12813791572599100929}, + }, + { + {16231508947971999600, 13363198726931461200, 5108997208952476742, 313182511761731319, 13219320773345255384, 17738895122530321495}, + {13811613026355251284, 8104379475524665186, 11192626091005940452, 12269372147510686296, 14390816163307043004, 12548485382177679293}, + }, + { + {8324780214689809449, 12924270761990727384, 15667753985117360698, 2943366707006427041, 10732039278085105434, 187369508428043393}, + {13244759855456178980, 13648213682810990274, 2660837912365849198, 11976770768362504658, 9693934687975961239, 13497908482787476774}, + }, + { + {14274386677405027725, 5124210746189478907, 13406608799629323494, 6405757996539000551, 14833312365952984384, 17785392529319073280}, + {7012330673098190805, 4918207845691492471, 14569574826272718621, 14168881522510616264, 14543438332068119070, 4326878510849999806}, + }, + { + {3341517100128815958, 2243420303688401610, 7153321666640309374, 10525543547452580816, 15776339624494341946, 7695076598671462598}, + {17732536140683547636, 3592810100391824473, 8413963613597435501, 6287395742336969309, 17465824153452860115, 6235174426722257030}, + }, + { + {5115445260875459050, 16200730294025276633, 6547940770886449207, 14513875339087588525, 2198135911102420364, 5169696006198573197}, + {11212158904251814892, 12437547968034770636, 11358243474088174481, 15452137528587726940, 4669136461455404974, 16320538143089060251}, + }, + { + {535242441654234443, 17036092933883802967, 11600759291125000719, 8050420965161709260, 17428526452419188659, 16458791281477337579}, + {6849931777343444339, 8512792140518036559, 7343733992893241199, 600235943839786928, 12840987592523793156, 9723169304965060621}, + }, + { + {16910417058622635394, 13917679375324377616, 17959562963138340920, 13359247597962361445, 636821169073744083, 11256621821635909669}, + {7096901051607551014, 2253054364079345329, 10215298864674526475, 8119225351234426800, 6541463265042612592, 12031138687814031665}, + }, + { + {5533765953345363299, 3666831701473191637, 14428123488067625678, 10208783684904868326, 4235254303243099550, 1152270923153823119}, + {7789988973198825144, 6281293996379084253, 11378132145663703106, 3044105183226657672, 15306186828154649523, 15118610766364934343}, + }, + }, + { + { + {16935319226801225402, 17479248115784925404, 11638874181787898404, 10204689344548103047, 5117503946912602321, 12798676317624404688}, + {9505799912502843544, 8138377038334669868, 12720954262725413506, 15335292261188744188, 15038060543229285980, 8787225712640151227}, + }, + { + {15287318513745980942, 15744943637312052287, 7712210611206194812, 2217808902952441036, 2880866790953980192, 7667233076242231085}, + {13340980843800511721, 1457443910895561494, 5659029865434015148, 9961325920271003974, 15801510722608035636, 12796727676398023612}, + }, + { + {15122689851130277466, 2795800145719527903, 13568032512724822791, 11462146579021072831, 4492622156197866593, 2389375563422758140}, + {12865430000561425758, 6876703980342191229, 6462758017056646394, 8138171318212409116, 4936990990444974691, 5220248005727829595}, + }, + { + {8222368087744136131, 12347516717036849679, 11297745347969103984, 8698144848560622671, 15235738417459308488, 11458307232141527973}, + {3156981165764697119, 3057909217286827485, 12707579681957851551, 14845444651771540740, 80043930456510931, 1427289826580350896}, + }, + { + {7271145335703081483, 8550379746366065405, 13222245170616935372, 1540183103607345547, 2206602728696862159, 2058073362893523092}, + {5459388607478785206, 13539611642074024292, 14402323904633266753, 11367015657725980988, 17537636140146252991, 14350125041234662967}, + }, + { + {15616429048255216098, 9646593367959435050, 10000076172445964456, 6887507833360734784, 9214691284865468772, 13407989755707318537}, + {23319057005728778, 5445755128474749921, 13782721823710291190, 4306629918002434911, 15715349716986824199, 6251943698106742954}, + }, + { + {198559125451872098, 8385427235747237692, 4233027135118542510, 12503554726860108589, 11105115177544924331, 10775185446004113820}, + {18212911447748408345, 13178565926755254085, 11114640510577499, 13843735599818615925, 18381258674287597192, 4756672869046810150}, + }, + { + {17538496477622964185, 1433183888673756786, 9984974491682898090, 4517808169349623741, 11986465564270089848, 8951472393424828879}, + {18196670723256299192, 535472157380722178, 693981884244746078, 15216522065428143733, 17726679260273203578, 9642969849409448024}, + }, + { + {5160114191168942061, 16463297770925271772, 10584792713261988719, 171850540846180989, 11579918515133959672, 10396694913224588816}, + {1922695067497914227, 3714397082557422085, 14915689713324864917, 3021901216294169148, 8451082446819513089, 2760044106111795702}, + }, + { + {2097173236089378814, 1814647054859784608, 10170299954366323333, 15955393059406664485, 4430370743633462938, 14617134597845327698}, + {6936197719765052068, 2035967928833128806, 10470936468275213989, 4552370931749195957, 7631626755294792165, 6995299789974072943}, + }, + { + {12192685447194213477, 16243788027426389138, 3307221830229366704, 4572373691827105584, 1147991015406820584, 7590972120066359889}, + {734169818930149130, 13046977851131733697, 18326449449602619156, 6629039284529698715, 7271937928914886253, 6619823517983792967}, + }, + { + {3491881131560177144, 7135322509001495847, 7718439954155088601, 939390052225540969, 10510098057025374009, 1036897112091468594}, + {16801210479572678348, 15364620159660153125, 9689801136876260321, 8466379544537007598, 4580285922100315708, 14754066353072462775}, + }, + { + {14236937969687093384, 11875131250768543855, 9199326778448473576, 17010296519672747261, 1432191715295448820, 7240396672478525409}, + {9282856696818793150, 8929298554101654038, 11691758527810395698, 13529214720842330904, 11364130274429289404, 16330417304431446315}, + }, + { + {15048936394544601723, 9976495942367902744, 5091911528724055948, 11917276080086885230, 18264141168509742890, 8988005100166523392}, + {13433041019916296924, 81537940451447058, 7905632599843138323, 7403634956612254316, 9471327080643618410, 14680725036927871901}, + }, + { + {2480592968060069230, 10676679272536823217, 15243200241275199686, 4240286848559333728, 12603956967014393016, 7473015364599570554}, + {2693765916823593525, 17572693658548274653, 13118888526718862906, 7144820876393735119, 17370196132870621301, 15051190136387242039}, + }, + }, + { + { + {15739670027855719825, 11036910205333787352, 4021544392863474986, 3565553387347367423, 3964961332364428282, 11603690097938709153}, + {11178322814781082150, 16935748921430175757, 10468742523886846223, 12912873445700591944, 5891559088297154919, 7322207037498008851}, + }, + { + {12503447801634120868, 970610322114574805, 1771807998727008733, 13441366741769313415, 4222236502986444720, 6760646999389453689}, + {1245452496533201083, 11777722003914828797, 8588751099069529352, 5461466601148872630, 8337331853046009840, 14200040474835462559}, + }, + { + {4381862158218819279, 3257946724717759531, 5715153718741221113, 4670267951691935548, 7126319499291794377, 7414184252515644416}, + {4409132192672707346, 5008109015870660081, 6646364227378002309, 2739818052318307018, 5254205492507002412, 2818763676677612931}, + }, + { + {17099575116390052440, 10771651599651215927, 16162078968288139277, 11747949268467955645, 18198632468383550806, 5718826843079118428}, + {12831818154622136923, 1139908981801729025, 18325634788038344414, 7897003381227512409, 4530946171065941992, 9839081555707087441}, + }, + { + {1822027882663919965, 2586692059104727545, 5262003340562216457, 15937894742226805212, 2377491755233029350, 2199279221179036230}, + {54627843603070570, 11018477725217416055, 13581326215347987485, 2599428256427468431, 13357876536889150180, 5983800947159377657}, + }, + { + {15875913836362316711, 10364504788586479828, 17159094454348286198, 2800760017120758514, 14648701318118632258, 10084646760313097110}, + {7413441597539522638, 5800112976104553529, 9603144930153129200, 18001343598967203147, 14907060105560621240, 12851016504514458788}, + }, + { + {3323767885881860783, 945816439403988314, 3122694203407892777, 18097120801908111115, 9507940132379519570, 13017216324377796046}, + {12112635426215062124, 1632305052635647076, 4503287615961131543, 5133655488959366792, 13376146870575309121, 17882590448286769229}, + }, + { + {16466564999101809423, 1103282883706681354, 13897339472612964740, 17515405571613479317, 231560140111353554, 11990302689318760970}, + {7461824051127758032, 2488635053784032130, 6738969321229436836, 12690895278364961387, 2762939532146449635, 2566430231249792091}, + }, + { + {7209658814720595696, 6910205524542965175, 16895432611633764341, 1110904616599822555, 768894652460082360, 5179276470661463666}, + {15046305975780485616, 12488826026249142249, 8883750914202815334, 7813886526674522093, 17626611286752587237, 14173740877250861014}, + }, + { + {9184078983275066527, 171829382296912269, 1767211109057348846, 3838810139883956938, 2892177352325525577, 587540104068323612}, + {16438018710111896232, 13071494062615911086, 9382254240153787479, 17837390153984245022, 9337352294335969384, 18306549772652293379}, + }, + { + {14206472070300656666, 15149876885322007535, 3058976565256742606, 7554155984973508676, 848860206737153803, 17384966138802851783}, + {6071585659381516479, 14599727484496636530, 14181631841630691241, 13597791031715947870, 787248750081521448, 8147947928967221166}, + }, + { + {7004817083098459682, 16726689782184453232, 3213280543725383668, 14046342544758604883, 16080740219683260927, 6076899979239474997}, + {14309002016238865418, 10488447184497156801, 10347316099979186191, 11941243369619909359, 11458632538231428835, 16102685462015086321}, + }, + { + {5487055055828671823, 4943171312842343470, 2928579838198416229, 11795723672039180426, 15618595864800120544, 11464055884874039484}, + {13454571326567663312, 12358687232096370990, 7938409714147002954, 8608381810067054636, 372913087078823561, 864501330934225576}, + }, + { + {635797081607123489, 1104369599182677226, 12483036179234706450, 17056128228042647500, 10009312675611681732, 12059669643105161762}, + {11477626132980303816, 5618063553013787498, 166943516871328425, 14701206874730673486, 9058640949987144681, 14563869860860339278}, + }, + { + {5395965497092106349, 3612539035634205771, 17681237127506582399, 3439193647142441652, 13780614753565633276, 235023041725887347}, + {3033179449351627440, 2044311760483059251, 2065568607574809846, 17974731450209330886, 14177489327434055447, 3961147821444060613}, + }, + }, + } + + @(private,rodata) + Gen_Multiply_Table_p384r1_lo := [48][15]Affine_Point_p384r1 { + { + { + {16703670340392818579, 1286760518886852636, 11248394403413918835, 4151901610420793306, 7970266049123896154, 17445779790134370107}, + {4329645970348976719, 16042142634338562513, 4537215703931505808, 6697447871083152280, 5793772036565999466, 5422118019001268159}, + }, + { + {14433915249620809430, 14971215887698628099, 14827104772163660010, 11634958463871186927, 828474226872480842, 5684743366783276110}, + {1331356080952535699, 5841511589364898644, 16990208903097464526, 13569226881169318218, 14248664498875166094, 17077506676755919754}, + }, + { + {5595676609776115867, 14618789080398559922, 2201134414120099102, 470895016097834742, 4102274241195483625, 2844568561456831518}, + {9494102924637200590, 7204580187252836546, 7742575358791209801, 5793245187166312694, 7454323588778133219, 7806095107071672157}, + }, + { + {18441227226710925557, 4630553211990364563, 3567153708366150805, 3858385788220258018, 2078907395053339838, 13453284031779612583}, + {16169419783227686582, 17856966316888004876, 9896590068038479498, 14513417153433374062, 5670844902446917335, 9309033883650068756}, + }, + { + {8174394611136832104, 13491946505368383532, 12716018224795668623, 15943834453938385647, 3311092385060995418, 10887239960276233526}, + {15318725704412058702, 13116557402644158788, 14528201448082359539, 9228826301082322952, 17581754887086264468, 4047041475027063331}, + }, + { + {18438599215442843313, 4015537097131987576, 1561321091994153296, 9662659929380603540, 5578281112816876342, 3480911564464745823}, + {858348351556501620, 17689640268312640141, 6959330516163154977, 6424518012595766799, 9187284181582831648, 6293794091600054382}, + }, + { + {13045229387657188208, 13690085938659083295, 9600974199166858024, 526884655886879619, 9290237641803195661, 7044646765166233376}, + {16602070129307025076, 15849288967186609035, 9092091796131291387, 10381155581334810487, 4911799803962481643, 914336345096302600}, + }, + { + {13490991706206957717, 8927032385078017633, 7775090801253487746, 17974570142754513596, 464854089971106110, 13646019468240342346}, + {13801477758808282478, 13267721605400745615, 8832595569781960770, 9823421671556846000, 11348861522513112089, 6704673626616438154}, + }, + { + {8798162395637210450, 2683284686000899615, 4296198105208970139, 7947505075124182900, 13030877569967081055, 7202635434125543310}, + {13802611418940267507, 17744356624256633959, 8515974827567262278, 16069780865789899366, 10235134369297564617, 15382730249140051729}, + }, + { + {10693928681786088231, 1868325427202955038, 2891972363284809610, 6677373020746038340, 14105047344690585066, 17441979056936361876}, + {2686563440401097160, 8335702271416969845, 3158278451667439105, 5195564280130047356, 13312870524821286691, 15037483265391344728}, + }, + { + {3961559481920028500, 898644078007715818, 14752617534552494351, 10654851227350209338, 6258212134755923496, 17327451745924835018}, + {5507497779295982340, 843987163524714857, 14881898850445300947, 16441634412065732426, 11312619178008978797, 3479463508901782856}, + }, + { + {17561502496821949095, 17726839616498802252, 13796139019518438084, 17300206272420033420, 10454206928587256948, 15885557324996538691}, + {16041928347765771195, 2239441821804334412, 6135738566013018613, 4043665170586576566, 10115109045930619727, 6594457533842211310}, + }, + { + {14756924596072248000, 4565075227644918341, 9793935188935462586, 9388712027596954480, 8006957541468583297, 8242831277630235578}, + {15798273981155867752, 6668583424992018829, 16434344268720351774, 3606110602406722084, 15561842144076827952, 2349656254358783019}, + }, + { + {3253443540806261442, 12555698908805436602, 6007490220897601617, 5307008481266272767, 13393830130502009899, 8899654776078387782}, + {4245028374464324749, 15297078807106399119, 16491046288077512347, 4048243407351607495, 13370129289324274804, 9876476920885673812}, + }, + { + {5390721684048918729, 16937659987125372309, 7680342595364868670, 12142253496635306986, 14233066834308424598, 671988498495879468}, + {2704194713182753691, 8912885238785332267, 15078054313953845804, 4795992794995133067, 11649755685481317418, 11930012365952944103}, + }, + }, + { + { + {8103759701478546490, 6028420157132162257, 3067900158853996905, 11583772150650265, 13094984669461418774, 6924985893407600465}, + {54958071128185219, 5021622351003191237, 11654157968548247126, 16247401174679100696, 16385802195540251172, 1031107974518303989}, + }, + { + {6428454722497658491, 10574271313549116822, 6743635881957160769, 16913635330376244749, 9681507818909145851, 4876529861171491293}, + {1814394652136903734, 4968086053144023329, 8920542953983370742, 210240699625540355, 8955586987380900266, 2164268895419701767}, + }, + { + {5608034336248364138, 5067877992472687888, 1933286244725713046, 13242405536880737213, 17263293185510756261, 1983344179233384988}, + {4237886563426459300, 9362799971325551733, 6786753397135169332, 5328115443562703638, 13654670013742588183, 3496580653988254115}, + }, + { + {16071914267185072355, 1315031918944783309, 16012293156990256785, 873056734499530638, 182560274640457158, 7405766622048342074}, + {16511661555914077662, 16795211140914816975, 1916902833101131312, 1130623122713241497, 3989275369171052712, 8501563225308840504}, + }, + { + {13149817102019880631, 10613889292284716178, 14010209428095701112, 1069882031932704860, 2775529095131230131, 9347998569909840066}, + {4409541671614199253, 17197365123077983458, 15652322139676023536, 7678148401641840335, 6034482384901310542, 9413989696720117446}, + }, + { + {11107110071047359159, 16288145590887699966, 2478598181863120847, 15571111403485190543, 10919164510183037186, 14098221725957317118}, + {3061511168275528853, 11371457453448805883, 8189313039485832750, 6940285322230600293, 14956213158219260245, 10799498050375169041}, + }, + { + {5031907698608444539, 18023991803445814565, 8556321431341137752, 8726888316311726846, 15478462387049033552, 10223636290028566398}, + {1905780687053743980, 6821165281886008665, 7646114077486165623, 3026148831014052877, 5536359622022292613, 18100746543211803131}, + }, + { + {11288497443759020267, 4363091778301392226, 8219453406085589946, 10369445991132585411, 5649747494026709400, 18114667371941410725}, + {5194421950530684100, 4023001639787678110, 13257830134828579022, 11041975949961923389, 15908375997592753284, 6836247357428864861}, + }, + { + {8547337202213930412, 6990159258245634878, 17883445208299166982, 4330231136088960102, 6472431629071074290, 8131668855043775727}, + {1615633974804093366, 17702421785830517013, 9040817873428455213, 7253431082049880663, 2580856565062595255, 957305604392189103}, + }, + { + {12550147352209098659, 16706353701874781568, 700985739649075400, 4991698549871850585, 14639605956467764796, 3990548737524847695}, + {2159031565346056390, 14297287012776021245, 4068789221096394891, 11837860404566828450, 1306127140860623184, 8582603028558393539}, + }, + { + {8572221175486824716, 7382610452565148879, 3798240777531515882, 7720424940498032163, 7955672733623916913, 10400992857478606514}, + {12536704118238452711, 1197472667002221920, 7958112946414946287, 7516882332626933011, 6786534214144691859, 10528818884598336300}, + }, + { + {4533011924393772581, 16478214876471299994, 2870575348476289509, 8319688882646555414, 7938557478377595810, 17061203640304685056}, + {6044136899841184844, 17176981934203875292, 14440091607628557291, 9556569541816694726, 12283955757179373500, 1728837458486823533}, + }, + { + {5856710237476933835, 18180055770541353170, 13666756016638015302, 9964122442248888293, 10568196656880286198, 10795529097021501365}, + {10291893071934944227, 1707329095509852784, 10774246437350578760, 8243808578767563702, 9842723530450682815, 10188532762574071159}, + }, + { + {12927366458992235142, 12160026958988547745, 16049652135447450561, 11154205822470049879, 2553582547365345640, 1479077593723189613}, + {6276822011775852642, 1807019718136820449, 5338003307650859330, 13548512004292529114, 274283195318475252, 4262254754558484551}, + }, + { + {2472529054687466938, 17137589090954053016, 13215293749622035568, 14627962367947576303, 10928297195163569905, 7813265877078949706}, + {13456308939723513800, 13108147281933977161, 5072676724153339749, 13630316084050530379, 10412807778936469738, 15061325193703102493}, + }, + }, + { + { + {14062262138187338878, 14826409911427014159, 3147169237468764230, 5040482455529903325, 15961102847332276086, 13076348733721508834}, + {15710048825425827881, 4711284320020833684, 5495111936001513123, 3975264090403135121, 18277552338555821101, 4982873089438865894}, + }, + { + {5881757900577935727, 3082203099603789340, 10587626589676775022, 9790887005834760478, 9753637089164583050, 17530540992010733452}, + {5906674355300253726, 14153899797650168477, 3203393482568874434, 7159946211415711208, 7770493192583170243, 6644035929201092924}, + }, + { + {7565543376250635378, 4894026024316289281, 1064629363627018549, 2229266393711567405, 13431836127556156122, 12345166870816475249}, + {5683094813130145113, 14460568816529669593, 16208596146346015783, 2251060002020925256, 6312100574995421868, 14142863082990548960}, + }, + { + {1701333505386754372, 18113825521491950532, 15971836848310645636, 10666804696553863930, 13339073901359549963, 9016082484725164613}, + {524595420371030344, 15193894147408008715, 11249116561046537456, 1416362693818654170, 8646200124849404878, 14789125286420214299}, + }, + { + {4448219040529062825, 16518108651741681163, 3867577730929059843, 12855944907169975887, 16383070643186103984, 3819970029429236068}, + {12270348593365308353, 3228624969622433424, 17746128033189004516, 15514466691444838563, 16922017859272304090, 10873928830553796343}, + }, + { + {6961979079470599534, 16442399973939705101, 5377070573932785756, 17366295333623521118, 1494760113702996405, 429566900985508037}, + {14596353036230607150, 18306968147291386069, 1956159373957339528, 13362661793127394768, 11047915751588023609, 15562772745602654490}, + }, + { + {12121783799905148744, 3210361347813891304, 15601117831098401384, 11374300947166969030, 14495343294857431451, 16887049363902653749}, + {2806824323484143617, 5891762208520246921, 10519788632722533851, 12406881532231465105, 12476596345610166775, 2929326634009750346}, + }, + { + {11619033824779825453, 6336011282085668010, 66441947656791796, 12634397924162340700, 16056962418493926156, 11181515142520561407}, + {228191213136585541, 10830330953744400264, 2487877016763970308, 943175580952184167, 46830635233029711, 6767691008612241467}, + }, + { + {10533215390069074161, 4240175145555423422, 927926585809726275, 5478507036975461437, 7372848586643865635, 9188187990850719132}, + {8456896957742765, 13507092707706845733, 4249106212594536568, 9711299350266342220, 13631286176123080117, 4243238077447546989}, + }, + { + {18238242856411579816, 7012871932937161633, 5224050476172253536, 12408721251948601788, 10429115795365006677, 3477371341824366834}, + {15692232122888670788, 7069484297055312625, 1511660220915668033, 13645274720004713009, 11371041276648404641, 3227460690876065865}, + }, + { + {9499451334789564187, 9807725712319466421, 17195273970347031491, 6512007407498606377, 825966736514514068, 7114432455006537628}, + {10929611578313393309, 3516227960140039809, 12431877805751955166, 4016269285378947058, 8308345904367589503, 479384259777781962}, + }, + { + {14823174488388431791, 10564122197066740052, 6359884666645689361, 3305490714663935161, 6956926106723106036, 1757044025346810681}, + {9218490684456903330, 17894538754746428292, 3686852509050441380, 11911436761000976094, 11281044983406290132, 4794870267149123419}, + }, + { + {6169315169310965043, 5050462902740654046, 4420119860349968507, 5900509286663583281, 6291948542666637974, 3502179279509591327}, + {13414573911064604645, 8561174987712176835, 15147203171479718083, 8916929729860280634, 465692852423696059, 3241796192189938737}, + }, + { + {4805037083483896463, 15749560291366181979, 3006668833558996338, 12746633991383561533, 2093748724448476449, 9143995667421057397}, + {862280791886494713, 158031676650943923, 9973152260325767561, 5540147634920097817, 18166813436129848595, 8728770860976175253}, + }, + { + {4780823618183778549, 14061468507515826456, 7924000550603741539, 16510436260807392542, 17111673152849580261, 1234594638075874309}, + {16418687934646105232, 3635175728906499987, 17864341637460241578, 49761007765188774, 5595562975249122128, 5917189370132161288}, + }, + }, + { + { + {2891150813386726224, 13575952774970790164, 16329951209698470872, 18208247565458407151, 795211506291706468, 3446245218498235605}, + {14887832502310695652, 7581320984927408991, 15304466638902159963, 12725650577835381689, 2109861799774686052, 14818469767057813718}, + }, + { + {8520307348850101682, 7147166939641194797, 7109795853315555561, 442556286123685640, 16703274587824683126, 11297170023439632439}, + {10777125051934595230, 8742602774458406457, 4568334189916483142, 9580614388736516768, 2144947800046381092, 11233838117038064428}, + }, + { + {14724535093102438262, 1097342397055114606, 9684252469138587855, 10770495648038995593, 4782115196813486405, 13108894563021474936}, + {6186407145212796523, 13044986185014550590, 14287812581901877630, 2228056593434999714, 2377539634072584064, 11484070981184438199}, + }, + { + {2372261882030647536, 17006732445240006818, 102465582613597482, 2306438222867094987, 7030387201499219717, 5620507683182655462}, + {7426675944447602092, 17517494666366669692, 1813907813072832665, 1664846168154029277, 8169354358603845783, 1009146886505697517}, + }, + { + {5359889361557595171, 18332881320680903217, 12992372967564983467, 3235336283246928496, 1918122366598530872, 9672910778717714037}, + {10998109349782570051, 13802180944593323119, 9243457800738211841, 14095366958484090980, 16875322389911718389, 11796767024296942452}, + }, + { + {4154159147515201722, 1273058311504047038, 14930295376923149691, 3541538910606543693, 14677828445112984159, 5652606725362693691}, + {12587781688969918075, 5762437720521018878, 8791631222951065564, 18036051705319852103, 6505939774259762064, 7898749725936014100}, + }, + { + {6073232427180312380, 2682532781858699359, 12899347092203445153, 3460025242522313749, 4187053964557337310, 14007867821755778993}, + {18308269875959593333, 17332777355331823582, 7827095597708416078, 17863450250717363140, 18143218844291088501, 10900355318411639865}, + }, + { + {15193822661262360443, 5913328606143520006, 4932960895618406335, 15675963329264670252, 786659723967404702, 15232212664900441010}, + {15668180363894430003, 10607216776267006109, 5301637052223037456, 6083790571087095778, 10053342033687645838, 11423643886760792179}, + }, + { + {13508339220661185864, 7911953729259324588, 18173014631200309538, 270516748480480779, 674907878659291397, 3314126255600287460}, + {11240909876624153823, 14246305828355338213, 16826984562886383731, 13091972868382905056, 16310998494569268055, 13182051848225269981}, + }, + { + {14790615268961369640, 10646825950331407644, 10001662541750174959, 4485562084633894157, 4694132461615297692, 12672440127863843193}, + {14852450733356045921, 12752269371731614662, 1290625671287973161, 2039070529850743039, 8986721707197477570, 7630558459824216971}, + }, + { + {3913192058752964309, 374802346376725418, 7620720531723602129, 7342095966104858310, 10538685091773236584, 16209362234668385483}, + {12484799568540253613, 12923921033391389174, 5685298310721897238, 8993584320789077055, 6359972113055748935, 3898751772482394271}, + }, + { + {1075126414131149860, 16702551730100501572, 16055620698555862254, 12278885216348953795, 3548642758697723931, 15071720148450568818}, + {12280024271646974211, 4447996993562488799, 14555333424853785642, 1510116618615803509, 3964481213568291913, 4155814256055970508}, + }, + { + {10647300335660095520, 18204591302040110305, 16964359131090101117, 11243541948462109820, 8583754773070458282, 5855117432513754745}, + {12473603800066854136, 10368688750745799978, 6023393792530123639, 12684166823166670856, 5507715439369687446, 1938961554823093885}, + }, + { + {13853144112993896041, 13666138769156330420, 3081504300584253886, 10998940258778477483, 2715364081362496022, 5105801355297802600}, + {10251345083070754091, 5637878810016321791, 2328631003481310687, 8881649909555714117, 16947069603315339244, 7416533920645212782}, + }, + { + {8283704072516909927, 12371773270912112344, 3092081269786213287, 16680017677990020370, 689642403329869517, 1983474266047873258}, + {3309976929403283249, 12532343087642554741, 13903549971839166752, 10358144884777122985, 5685607956768455269, 15212858975393784996}, + }, + }, + { + { + {1974541103187663850, 14419503307385213572, 1910357063271577544, 9405849388295731825, 8846714195441265126, 1825348137739350109}, + {8946791593625047664, 7707902765438605609, 16743886742959612839, 10498180759536919434, 17561637045610857774, 6591991118449510560}, + }, + { + {5396387893935102068, 9492930398296567082, 13435301371127725418, 15386190233236435468, 7248487611273180305, 10016334808351425905}, + {11988208056926197509, 10137338921708783421, 2716545254572709847, 14606914623397840325, 2555748042271077974, 4613981232528869724}, + }, + { + {1157528445712671795, 7268820473896949348, 1310099106886122503, 4262348507724938662, 8917553728509651151, 17005257183552454953}, + {10059173412034340597, 577994398230440258, 7002708654309095293, 10286301441424331105, 16384815498995719862, 112791320905797865}, + }, + { + {12313672925235387459, 625188478309360787, 3630661012849554290, 6134464256048521087, 17936871466010965416, 17564699109077082040}, + {6761309657688544628, 17284240846518446876, 3570047841144108922, 15668537842491950089, 17083391336599335387, 9282566732138308423}, + }, + { + {14888961160828833873, 1864596543262469754, 17784154409948684103, 3052077954154793867, 7607056789868369456, 3894203281376040408}, + {17710090260347574598, 2210004113826562961, 5671161332907863757, 6625158587348516953, 577771095520713590, 16394908675016020276}, + }, + { + {6603729010820482722, 310501835036252193, 13954871388003056741, 14251448811909808675, 5233636024407453469, 12245878228209898903}, + {11486231149562966694, 2835585577048418114, 6551484302395633982, 1147669539433231355, 16475838258018071696, 12247646139693000214}, + }, + { + {8095718986263574912, 10516714254110691975, 10870802407417590732, 12874599804285329736, 16364633263585191132, 8865300776110950252}, + {3563236263281283648, 6644962740435178657, 13092866580083075501, 16578846863092146456, 10069414745327895789, 9434194139304387489}, + }, + { + {3556391957256886772, 2045016845106055936, 16226354733380887667, 17466044866167164875, 5174514841894426254, 1878394346602870901}, + {6716526457444196714, 7250663133803025807, 6718545916437832659, 13969599547915135008, 9325220973174112271, 1581163301870356679}, + }, + { + {17874459379059293830, 17502662865497015769, 1413180880150211940, 15088446747480281041, 8470145037392166085, 15096281883892228601}, + {16563437908222832225, 440803266862528997, 17031080291135092609, 11406614303171495232, 3723108198050621166, 4347405779711045020}, + }, + { + {14923234998584905456, 10067479898750534001, 16939842266743060751, 17700070519960195683, 5683478503944407120, 11025361952743521652}, + {4209605377271021882, 1469922120365400988, 11514012988142017467, 7856087734177419136, 4097954809069446909, 12489390616599495992}, + }, + { + {17122478311949624172, 2606406176820258447, 10067594371237100910, 15451154690481864146, 12038146827921735864, 15614369208187755152}, + {6824524079696297568, 2015807129229573570, 8194028607199100376, 6009223747668470820, 7772398281249621704, 762894964403298890}, + }, + { + {7815360071000367774, 17901565192138878313, 10434394026011307506, 17374730254587070753, 520674668586498531, 9514841979847171014}, + {8950553127025783937, 14895127801975478381, 12425287594242504013, 4645132844100203397, 5976766478892526023, 7370660544571859011}, + }, + { + {17533325387355455402, 12119607747199535982, 9073368446213478432, 2599055833895753629, 2355979442709556838, 16659690147892928501}, + {6238157733277724851, 1384135036242951943, 2192811311355019409, 10465103238457430542, 13159060180143520417, 10257462144135243277}, + }, + { + {15864053898474748885, 3221238804944627, 6003608638035281159, 13653735634664806453, 8230891808319557046, 6613649981851363837}, + {5893628415615729604, 9710922278586234190, 10395125337377360528, 3931451882481143085, 15979557321922502583, 16029662329812025753}, + }, + { + {2992392235075872590, 6059858128867517556, 15617366226623071384, 4111806970940100258, 2815759757037139466, 11575444833660170455}, + {12346698926973835666, 7263128764813325306, 15235588485234058492, 7572978345825547287, 4333826640601921394, 1322529269991380909}, + }, + }, + { + { + {9784032244755280441, 10040637167065316270, 13599824657669619733, 10375431024260591386, 11026488569773701752, 148008158803836909}, + {14567290934774912661, 16110515707287744352, 7491732171320356409, 940936830894493669, 14287255966622464286, 5426456074085300916}, + }, + { + {14969046289595378522, 2961608585839402462, 8313047147741327249, 15157159053809069603, 7193489948575262630, 14433197008239894898}, + {14199648694191979725, 3269958096730932465, 7497592897262475128, 2728526358559655944, 4744743661876038842, 2743084008632367240}, + }, + { + {12708234784965893093, 3307842163098541971, 17303873939057534192, 13260319540233926124, 9019484163029605371, 9900024564598332822}, + {9160913700210863226, 14428342536017851587, 603459719728403776, 18236218541634735507, 4474730692000472054, 13244873297017787236}, + }, + { + {1470084386249125812, 13287518884856486050, 2962960042040907088, 2151437856455287500, 2905195302281113959, 16356195231949614105}, + {10979007359054784823, 17866133863009475011, 4170501321215960549, 4594340427813823261, 16023065223081480373, 12495390124432989208}, + }, + { + {3972369974785239897, 2263460443502958971, 271463035813818108, 4070768510424378794, 18183758750525376366, 9693239897287717465}, + {1475136609401905372, 5379591160737925092, 8153537820525801184, 1865515692994364877, 11166184186139353884, 7175559837327764278}, + }, + { + {15851820172704931949, 12655143336395232851, 14730294842561239904, 12459362250042251879, 8382688064372334901, 5889068791548184842}, + {8985568054046695170, 3001288673081076633, 749616385212969715, 2646834045811835619, 4782194008578140982, 10854034154938442923}, + }, + { + {3566983516939841616, 16390187007609797937, 8741971305711964717, 10988398606335852160, 7867588372988852672, 14538400485602331946}, + {8104114227557982732, 14039413126798418158, 5102330106089863488, 5619388808486733299, 2378045731360365970, 7775897872465058879}, + }, + { + {8285639907960685452, 6907081304694029245, 3932091882248482870, 7739498675000172490, 10103249503689721665, 15185105419572705287}, + {6218795015578490321, 6781880938546434941, 5905078566070212755, 299457794212684954, 2165089807353723840, 8480540247598037310}, + }, + { + {14784673784599919989, 2082260535205922993, 8168045341288037020, 11903543474273736259, 11981001928254322331, 9522037239934847936}, + {14472653912826320219, 11309503817936052299, 13738425228648904701, 8042010790362339419, 14117271511958285496, 790309299276090992}, + }, + { + {1732476059839006505, 17018699420444452651, 12153180531366356108, 11316536740921479323, 10078354046704171747, 10800231856927927233}, + {9504117955400644407, 12280517700591263912, 1062093141564177828, 7578015021890571031, 11569246388902651024, 17406496106428159878}, + }, + { + {2347276268330916160, 3811437762946151257, 13719307347921295013, 3930073025002065810, 6454531622431144143, 7482466867004373254}, + {4716770925419565679, 5110702795209658366, 15071426966139561730, 12738769369895983368, 9464508449545437568, 14677026754609888388}, + }, + { + {15527739528861052501, 8795354980099030148, 17061268663297745190, 13090961285447854468, 15698285934641221614, 12271672067594065876}, + {12952447277463416183, 17845959850709540103, 15366734867247877735, 13405705559578435369, 13317381544359441361, 9727437258673830028}, + }, + { + {11430653818134040708, 13972160408058655396, 7084064239516383189, 5779466131231952465, 13956916356587340454, 15097328365167500151}, + {11851587197086244848, 5814948700376813477, 12470797735177958521, 289525451793692048, 15282352302269881904, 15273112883324865707}, + }, + { + {2162599553469592657, 4663793700503951742, 16049802300031157625, 14926606091765253431, 8356290077455847249, 4143079345240852597}, + {13247139040866943853, 14022573155642926251, 207855347034742811, 4720924427150657828, 15071740430405402718, 6051774750243840661}, + }, + { + {7719115525766766580, 15211733959779219234, 9890856375298480641, 2106523170188804656, 11116661084796200293, 7362312025325548799}, + {3717785929351377088, 13315020865788643418, 18113403510273317893, 14815931788618774540, 14634966516940592950, 2034948857717155805}, + }, + }, + { + { + {14244174369224556546, 5342392209233508928, 7438713248457968580, 10614297495547921248, 9202135001584851596, 3342234996026879127}, + {13691335804923598208, 15140348432227922719, 8428540434060562744, 12043754816218808261, 10858831840083451813, 4598155351159579828}, + }, + { + {4498695262421386143, 9265193209482259657, 17498675555682479110, 24163428822819825, 16737629178311549749, 11187404778246278772}, + {10767729479345778777, 17391117902918412174, 6880253873200674120, 15284410651868444657, 12792198194450228219, 2395904758303124696}, + }, + { + {8158446918957702678, 7546107368870022629, 11717312886106537153, 6923216345857736395, 11003539876942772744, 1153070042831623474}, + {633963820936975157, 11353131760056430258, 7976658868901878513, 8020939041587681581, 8591633705762983526, 1696346219311964099}, + }, + { + {16508671692567979884, 7478096400789445774, 14273613261641667275, 16142155569890490590, 17190642547002219793, 1935098112081588531}, + {4595462997311059955, 15750249483900207872, 5924388750545229489, 5293390377249847029, 4749762219313386172, 13693994083245523550}, + }, + { + {16380431445715687892, 106230990604580903, 18014344013591313889, 1033379254497495760, 12516742637402838545, 13779274142940005848}, + {9785610002952463038, 9797590851340545635, 2035999898130400225, 7132629806216558751, 9169445448696845522, 12182932187779129821}, + }, + { + {501907073775093791, 17308901417650437752, 14252322144012009433, 14212853038379844496, 9157666821207522685, 14098967321770430754}, + {693358881197934327, 14629222976781047974, 2813134959990207271, 11343356266664072637, 6987651623587825922, 10281965377549280543}, + }, + { + {2764452604422336440, 300997096301046019, 14094398322842717733, 8058134187047147246, 15215625261188908838, 4382907902287523761}, + {8492851920809087726, 5937579395094221111, 7477845800356457342, 10689515189034436722, 12617667903878138436, 3774778193535313798}, + }, + { + {9960007214821980729, 4069548394854294195, 8627747251011093233, 8210112892681901809, 7088798910112129600, 2053428079297196270}, + {3702967442659062216, 2310906403335544760, 7567753294056516949, 1948580970688562476, 13536454877958536205, 6639944374963599628}, + }, + { + {15295696372734148976, 3579596265901281843, 9574081162895456810, 4923374886486176154, 3219363399904390571, 5015637093415491888}, + {4593899936599160002, 3908598443341109958, 957285171332479030, 15321912334716832124, 7810866701395908986, 1221281858922781688}, + }, + { + {13874958592881679723, 6638033067173937719, 12963324999336699337, 14597466910971525853, 5238085686240872501, 18280593805011112769}, + {1903676504579977735, 6574951020929533498, 13950840705690778416, 1696682485827935789, 8423274085423453740, 14078931046981905240}, + }, + { + {3517518319454019911, 10814049823525725669, 18276808946264820784, 13619936204927961226, 229197000889315492, 16087612506648744856}, + {13359110821899203348, 18273672153546569067, 15448342392556280774, 12827254463788206440, 16731815387033480424, 14776988595871001826}, + }, + { + {15270415391437565596, 2028683490070884787, 11702183509282950225, 8688196922408363831, 9849893844753628582, 9968552033497457092}, + {8940282168698946885, 11937029660413868974, 11118271464781804264, 11568483938414775956, 5728644286601384752, 3703969168279877107}, + }, + { + {11652044326376748259, 17908439335707899388, 17421220331644622730, 9490161168331495839, 12156528627204515202, 7912628748081518108}, + {12398934214500264906, 15275646021381992403, 4419692862258023354, 16421180417058441595, 2454832921933908163, 17393752904451977236}, + }, + { + {17844918621715720543, 3502040829859328267, 12871353770728226564, 3472339707328644724, 12451097532318425848, 71861369639778964}, + {17295347875481859563, 3690461964037187899, 18360181465850037021, 3712583869172705797, 12197237321535716543, 4729929162220746067}, + }, + { + {8731053926361454382, 7287398925224999230, 18086826009699036346, 8335574098738039638, 7591410546978300407, 8794647666674147762}, + {3125018303771223725, 4278864892990223517, 16568066644140435565, 4494257938435512782, 12764272586590492568, 15409898743615904621}, + }, + }, + { + { + {13983598851114853863, 529849755045537891, 1350161153312991881, 5942999622371373086, 13586823003297946505, 12570856107373756476}, + {11045595872248151877, 13409716803560067967, 7556599145425958335, 12242191131006857685, 13579932482365250112, 18381666009358571885}, + }, + { + {17762884470933745605, 13091628412956520, 11848002318246680260, 11007732397942638623, 6536960302098188074, 815221834698284970}, + {9236334332791328041, 1308454297106192382, 13073132817539534118, 10187597698470053764, 1224340772341594193, 17492375944897582958}, + }, + { + {8342214479854782437, 12753724076994494301, 15158115729208345118, 10675749973467471208, 13779951729398402660, 9124105394386876597}, + {16701027235021659665, 17012019762848269150, 9335333600380004220, 4905542903515934494, 4679911467761810541, 18087992689526637879}, + }, + { + {15671008364960232950, 7860658171410702100, 14227259085597804568, 5601891579416133188, 13347153814200955463, 16322888887317605171}, + {6781550399618311953, 3002152930532217896, 16651539803074113759, 12688880914945537327, 8458859171342351565, 6912445599896725323}, + }, + { + {5223854540563296107, 6918357952454360661, 9207094772512963084, 14426924911853158195, 5755518699259636294, 9387283789461380977}, + {3503930759476121643, 9159964934165741367, 15206356441822401499, 1480953354201474586, 16143427034936870480, 14366839330630373342}, + }, + { + {15025229139882835362, 6569314276317895034, 2647355676900663405, 15940408348923221874, 9319872831842193999, 2441065085739546990}, + {10915383241419292088, 9125679006919517116, 16537773929817775472, 16520361616767483661, 177268947296049279, 5845623806684850619}, + }, + { + {1715144640521397840, 9713182207991148222, 9099904704212771890, 18362082653791274277, 5942292809119944225, 9769586133554284694}, + {11519768289953656760, 11743868714787315094, 6721165095180661980, 10279267157246395337, 15375558993376490987, 14492867532550448130}, + }, + { + {12103512047683613691, 4278073385410902126, 14292291658628531517, 9854045601464761923, 16032579696315420438, 7195268416745968767}, + {612006809983855445, 11060333399844039545, 10009253468204157639, 12689475911984215777, 4543371362129747434, 16168227213690204032}, + }, + { + {11770921065158854893, 107067300718291927, 6216709271265794600, 6933524040251286410, 1452606278006972167, 6352326468906969436}, + {14670895904694727522, 3137275022800628766, 14281654070417022408, 17577495604202186311, 16841827195439601162, 422964381244324663}, + }, + { + {2173637395644840283, 9666438537552030781, 2621516439523045149, 16194421987699911464, 1151524228457474221, 2401703450418989544}, + {17462142435831844356, 15163851247483784831, 1841486106108653340, 7822858850019771468, 4249485329140599845, 1821072017377180323}, + }, + { + {15298268041084334151, 1531237843026640514, 15841013071716322151, 9410793877088000637, 5108136920376770765, 14198994672804406233}, + {12867076639631558569, 17777512969934768577, 4278122367966949505, 1107145346780540130, 15722269527707226912, 966176458294482319}, + }, + { + {3539257888383275199, 17944547213827679412, 9759251359067155556, 7261158630405432972, 15290149052332111161, 4170309286957220483}, + {7708910151755850904, 3634500268466769566, 5837736360460882054, 18200381407287071659, 3169144765352868301, 203115232477137729}, + }, + { + {6840468866856259700, 7758204996514135607, 17976257971060442776, 14304394653760424496, 8378305391704268529, 15501414806030165669}, + {11373547512176927055, 7169306605754795400, 4819206690827867025, 938930549801608666, 15550126629632404977, 16998450850862106862}, + }, + { + {15700328879061755831, 3194744149035659602, 12913379952862607162, 10843238782556582006, 10727228193111430396, 1268507586473183326}, + {13242157096784103517, 9764148610613513484, 13432136698405924597, 17207758635006490092, 5669195169308257419, 9700784012686509553}, + }, + { + {13323401950222069126, 7143389192525342566, 2753977793903748710, 14752970139128156351, 11560905576527598704, 7772265590772671469}, + {15339277736310777779, 11892168454138922804, 17815983037800870820, 15149987747549949858, 11149095484837869946, 3146330589620022603}, + }, + }, + { + { + {2176496575786881341, 11137175552988470328, 18165371128924571066, 14493665018797210129, 9027832134416315155, 17831122727374654343}, + {13941117776210453432, 3262628315315934865, 6955607093154218866, 9315601893566251415, 5081138766383608342, 9449507684235557713}, + }, + { + {3015183280845351853, 8567302742230480780, 12270847108839625213, 11246873507912728870, 1058839101090450289, 15063533146116054837}, + {15816951661145602122, 17835613250576961263, 377336345548517249, 16952055578532303378, 10643126612569896087, 15589909904400117121}, + }, + { + {5917530861159333215, 16376811621868701260, 12468667157041084287, 6060910297573454847, 5999643954660792761, 10374199955429433218}, + {15354447643953389125, 17866869079904367209, 8929885267107625215, 9764565262519350782, 12345751593966204455, 9590062130519338399}, + }, + { + {5932736646654537524, 11111625974290371458, 15669816313412657243, 18348488897895796471, 17719589740702908170, 13074575404328778262}, + {13337220567014765893, 3183217332202609863, 13737875422290924678, 5053183954635209364, 7253181521673343044, 16432970095551512913}, + }, + { + {14090926673589572542, 17530443530454432055, 12384368526139233597, 13369819312395505251, 7198182961160804423, 794076975275841051}, + {2760884514203992257, 14661425019208431637, 13933494052308237687, 13461782301434087101, 15552200892959134758, 17074320298955503096}, + }, + { + {6895102306183172231, 17913949034057542002, 8793858421550093100, 16831072178043970751, 13776552101358985318, 1188816091752039796}, + {17433095774009548776, 1361051895268056816, 1584454468837935219, 9000587494960507617, 9150046460469003449, 6677236369751497162}, + }, + { + {10073416357027898043, 11049353932450326412, 5686074628312392124, 8667039569779248174, 7027692055059522005, 7268282275319392236}, + {8629306706584271868, 4544414308773698323, 15825173458798511659, 3783245463927499985, 3277602994961352368, 16594668318001131253}, + }, + { + {17194222042243013514, 9755907999220542865, 15203045510993220352, 16670494240308716815, 5468356552637101934, 2209927657220556130}, + {4080551261822064698, 9410102261896788927, 1729749535853106305, 12865714430736655885, 16788188297672046823, 4739114570896754270}, + }, + { + {14031233216260426655, 13894451532350910002, 14721305842339563831, 2571399673735228739, 17136925918547685412, 12486318545760378351}, + {14945904247785918924, 4332191017784273191, 3577416897748122497, 10770672964471969794, 13859172261775533936, 1323080729872112496}, + }, + { + {4806132367170729030, 3012780210920457375, 3465902493839868696, 8367717133643917430, 7541627860300058604, 15166837387405701033}, + {8755188577678123832, 15440550960246952705, 6821177912455354424, 13580899156034649200, 13889507678691571539, 8622094254907884271}, + }, + { + {8944073100303306076, 6542151642656830118, 4104527697818383341, 956456087501600204, 1355338812157776915, 1576264571133590433}, + {14576384464935893161, 12976993851388633360, 8882463173850021133, 6146594088987122341, 4213885861865358420, 5730501125228024803}, + }, + { + {7734895557992270496, 13773292779533050725, 11791360189416713892, 3844762521853578365, 1284645752772663495, 9812572158308316394}, + {7423486593749131086, 9063179868650496218, 15664453574296549152, 12189904173100887627, 15565268483602424319, 3276085766266736963}, + }, + { + {13663977661665765595, 12869596706690969469, 11622894659269832036, 8626701230474747130, 10051999084490524702, 1254507355148706860}, + {3738417688632628979, 10128963025153309524, 10379579774762834621, 16085982828578912188, 999630916899084620, 5890496890318826833}, + }, + { + {5464691878810358086, 16779490499259550831, 16167618561212471093, 1500388924177938877, 12758820778786031069, 8726936634855616738}, + {17023037108698278190, 3926165730727012559, 2857709494954513428, 3375996756516865105, 7319015008396427730, 5981183379963579669}, + }, + { + {9453101235061934254, 8471689648697407064, 6756160836097095590, 4538217394377244150, 3501535205004454648, 11902347949869551885}, + {698830528006196076, 8321354741552964610, 2475663594321703580, 13966220326496163916, 1495087475066029926, 9248489243263297804}, + }, + }, + { + { + {340762250586370878, 15885853259854490950, 14170016703992127752, 13413185133968590757, 9132295233250564044, 9955913638095083109}, + {11442204168742219584, 18030844452885851851, 4172771706246866818, 8415318956258968622, 10025498907972372942, 9168803391366195663}, + }, + { + {8511258912015600714, 16401285336019435955, 11567231709606604746, 10909146042530314890, 5175867930620067690, 1758264796269950390}, + {1311893356838490889, 2075003657340819455, 4150679767398135680, 9944985572047220304, 11726442185374948983, 9515564709417907692}, + }, + { + {947814274602777664, 16977093960389365711, 17182772961477092323, 7950550504137754878, 12164286910738269376, 2396865457216588451}, + {7712672988612544289, 2256404627520187318, 8042169559407463337, 4322215616044918854, 7896874306873269018, 8861341680456564805}, + }, + { + {1573021064477563490, 12385142738510496803, 5846352022563838737, 7179392922412551607, 16770926861117259109, 4748524474277694353}, + {627992288971210988, 5079973027627716026, 12148275790420566931, 2974507608681532690, 4977283032988448426, 12122543170457868729}, + }, + { + {14982315046876125397, 10694656698025592471, 69978513957895432, 10720522802782817933, 674072974690397016, 18202488981264823240}, + {2763268093414423208, 16627509676996448791, 7905391784431874217, 15969282761758331738, 4087266599186541195, 6705534661083402155}, + }, + { + {4260928749573083864, 14414653187745491590, 17669562882664725861, 5539725367798503840, 9892464532031311709, 8646224288734922726}, + {14636838328767388157, 272416839100440696, 9027818199363669781, 13152959597440376914, 9885545384154705441, 4531971612013043371}, + }, + { + {3054144515900924393, 12231678983485064511, 5344887254723067065, 16260784250181309348, 13554495123766829763, 16541428532159722510}, + {16971418268239157688, 6561565182987963636, 11849488276654035036, 5626075694176069835, 5950685614385695889, 659455020499241038}, + }, + { + {4016750444584361935, 10934103594664060658, 1610640179181480423, 2687152927501620139, 4356423113034416292, 1508042570353658648}, + {12444493154493623021, 7858990549536828280, 2620376282128316119, 3094221996681006634, 2197436117225946497, 13627448762660605994}, + }, + { + {11319267592865004792, 5771783128259971891, 18183444021717726622, 14584551296093059489, 8197314068068346944, 1496665335270628278}, + {7533930075545786161, 17913476997028566696, 10110826559280511221, 12595790705256942207, 8383527098300125989, 10468103262027643123}, + }, + { + {1297397412658178639, 17891290189040928260, 11494441724074567854, 4008680981284786655, 3752678751199473490, 2327749996539228182}, + {14427514318988472029, 3553111765024203036, 9339018535932944476, 5033337384514825308, 4461712737595757481, 1042763231946705190}, + }, + { + {5282595958571557801, 213593101601136936, 5851288338443284810, 7230384975686448098, 5076726665241242579, 15657565414881533309}, + {2806053347798036217, 13325810292191155888, 11207865985035518040, 16753610899485159157, 11780444340160414775, 117213508700926531}, + }, + { + {12301002695840234190, 5825957247323734322, 7540088495914446527, 16042651929295067210, 10094620945045619814, 10110065362760208923}, + {13445281647852023130, 14273322378142608479, 3078794690211711993, 3432436226120118989, 5328806020363596991, 6994513974763316732}, + }, + { + {12003038273625258094, 10383425068383640359, 15520194992621832802, 377777956418164695, 14943016921304093418, 11013649826256127439}, + {7230967483902155369, 10825313619847326325, 7037825115392195402, 8972357023328446193, 1253857384837096935, 6266649133505623519}, + }, + { + {10589482155172539950, 12297389734324327538, 4069221173445026474, 16016744041800779341, 18417752858659154550, 5634264208757126073}, + {15473968400152854338, 2809792092226097652, 7273042078361794560, 2614557813052600661, 11360021509152649943, 16733025469392257248}, + }, + { + {14029153203244842151, 8283401980696181560, 11095661564207243200, 17088874757598325946, 17546567502506221871, 5640913915552816107}, + {7075972272517500150, 2257279655826038849, 5696746906369339622, 2316175253051029175, 17712158778401896374, 364112814656520215}, + }, + }, + { + { + {14679924527974280886, 15947635289512277104, 15351404070450195459, 4727979236151915703, 16350474002987521743, 3821044743014808256}, + {9479595861519884974, 8516666617350278746, 11503226012034686940, 3623032435206572941, 13809630545510991358, 15014347175818555977}, + }, + { + {11057592299455225148, 11418500207601195379, 10015659838321279434, 3277591360102749557, 13870089373464432053, 11899764543560815680}, + {10598708899627490235, 5204860756179583225, 5704026074815499757, 3961740021052616841, 8083325146143482469, 9703502648801234299}, + }, + { + {5296723995152596286, 12702366508473375573, 3560342141598167052, 1229852828708405148, 987112422309132678, 9050289325451932333}, + {8377778558476358877, 18299004077752380767, 8205821641610714688, 415872980483417712, 9637058392436615799, 16488239169772178994}, + }, + { + {14131815066626142041, 11540556304194578314, 17720164231008490194, 8647469527673297080, 13717080072986283066, 16364407850305375121}, + {9812923705693309894, 15252855277120316678, 4251079378183712824, 16287850228852183968, 16981432229628540775, 7288137070535318945}, + }, + { + {8134759848840978213, 133995483652992421, 12594363638483218087, 9394943745697767530, 3292684192987421047, 5641109531274744017}, + {18340625042234832363, 11659678257409646710, 7834895451987153240, 15013848757483954741, 6923004623931848431, 10731117231772923396}, + }, + { + {710182862970832652, 7186938586352280975, 843940566536207033, 18222882275783810673, 9033108566167385693, 5062146455700166349}, + {8983560327851192528, 9593314042056721839, 13080593353438570596, 8499297145526220981, 12018300556898041742, 5590813964218970674}, + }, + { + {560148900890697500, 3872724270688497231, 12155226431747164567, 12069399862495208716, 7800323474020451504, 17842129873781067995}, + {10386941694229256988, 12627593178570682056, 13595572751629997365, 8796981607722448553, 16749808188347360672, 7845278385143284636}, + }, + { + {5771329137650242669, 14398580224071912888, 2684433028961805130, 5472793673559551896, 4139791942141311772, 10242427010920223149}, + {3435557043383543647, 16439074182964580066, 1897097733009851383, 7790954287877138337, 4094797857151328545, 17636387648829877391}, + }, + { + {11084338203592089978, 7046536437278056828, 15270162581532936685, 14872594521711089230, 1065044340676136516, 12215363914120183972}, + {8807558094930205455, 6192530442586873261, 7580836915562456588, 14608662449758709959, 15699254439480728117, 7514868894683313347}, + }, + { + {6725908589474685098, 17990909432805680896, 10064707122671181170, 16351089498679067398, 6987057004328973058, 1476297822394021518}, + {16905817105678067782, 15956790087223100464, 11919441400720484520, 6472307250416206582, 8105558973519980497, 6060069727850515408}, + }, + { + {4394995949664289457, 6428291279342645254, 14868971543072031986, 7469984888154793685, 4535882282594416153, 14087727563932343498}, + {13764853652994987377, 3726460811537607063, 9231152303364152091, 7795121740553029976, 3567427738439652965, 828395371245164136}, + }, + { + {3588112622259521330, 14318995036651536017, 15152996261895537910, 13117193981606719833, 10869520400973032500, 1535537291014629366}, + {3953371315021198156, 386530500873665491, 3508849322379756897, 4055089442250030357, 12628113724743989767, 4186397566457919545}, + }, + { + {3443066389826097469, 5916450488257370663, 14335878619740602917, 10811180552560485498, 10078378655405541627, 10331041864412397191}, + {7918530238023081306, 10187646187565606947, 10643817701072622350, 14671988813510778565, 17264570610690688746, 5035607629406476407}, + }, + { + {3532200476336731719, 5678111310353191224, 11922638866398303913, 7540915859698370345, 7422783730002635298, 12884745215638918079}, + {11258694614182796345, 589030835645795838, 2262193094720294286, 13773904298325886739, 13573020426752625101, 1682880838844955766}, + }, + { + {3667751664279524715, 11424246261326489986, 11184700745029985834, 6642084736925658394, 16833380705883602850, 7641656710490994742}, + {3519566587420847235, 12380249650455369211, 14234084881378137812, 11403307110698732867, 10605766497849541425, 10861452779244197005}, + }, + }, + { + { + {508120474314030324, 2355066544885544183, 2781810294408129833, 15987954833749728730, 11640488433383588320, 273718689405132586}, + {2640929119024127447, 6627781401094026707, 8341197168509731890, 3918225740211580144, 12693567636985320532, 12010813241293331917}, + }, + { + {1067643586933482569, 15789537218210505592, 11772390798352937810, 8551678486344942630, 18134749517345567483, 8018480309623112915}, + {13721763421328053376, 3248048408533182382, 14403298468089883307, 18344377936005924503, 8145236551628572080, 18246715613208739706}, + }, + { + {7517918011338920649, 10924417706771677823, 17726681281676783216, 18231267965570514089, 9942149863736880790, 2495324098584754616}, + {7703134802415701672, 6763631388551517046, 4129117670208724623, 15972974109259347702, 7281041685266079849, 4033286739838961760}, + }, + { + {18167431682574255272, 16875991970663412008, 17295095002088005373, 8493357273501291495, 15937618870319643038, 11833224465563102215}, + {5034304464808785416, 4940901108264101769, 4572127150938139448, 4375798149940068108, 15502449895994354606, 11063825957880913338}, + }, + { + {12106998444454782089, 478129254096369622, 3583445821883510974, 3783525850583222929, 12700800678744232856, 8398918095020677450}, + {10572000908134195556, 2591572375203033135, 7440424324108251337, 5098405712381411786, 16645670879854917662, 1340903336183382664}, + }, + { + {7662402429691938227, 12301560877341388372, 854014491934252472, 13252962285002044539, 14950007384282365768, 9322453517274020995}, + {3037202449373284699, 10134277839370356135, 7874405825451119639, 6074763175687974962, 12425801537362983169, 18441996758138525244}, + }, + { + {6377198952519496340, 10452019513637841848, 17999702029925940943, 7474985002644580736, 16710285089220886173, 8795286825426459720}, + {9274877579709547055, 11658383846072744560, 15190956902413353547, 5248750851994650598, 2300395682072506542, 2755645297874985482}, + }, + { + {17741788053056918633, 14066143977624056531, 9188940017443802353, 8808532662781054683, 3364478519071964886, 3169335378890645771}, + {17112675492175952719, 14236192466751475311, 5603662455233963823, 12286659362580784043, 491873052068930659, 15049849551374735889}, + }, + { + {2576424316119212598, 12775551962911576966, 15259699755977921424, 11651942542046543115, 1402783857204478837, 18324652864132536670}, + {1707338149370542188, 3298420157097588817, 7521797060095862577, 11460596774399479099, 2575910799608490644, 12312525139228130635}, + }, + { + {392896831764612871, 17176033439239962097, 4721807216245185554, 16182155038868684552, 5761252087564225471, 15052621263295120129}, + {12346920066003727294, 6129012491021115289, 9977552588222578097, 6652331187558815009, 14909718540327055008, 968144566139233934}, + }, + { + {13293883802715635807, 2653176068873560866, 709377591048241427, 8121623725564414915, 16119489273759831559, 17342448566209464262}, + {1211174416757974427, 14015417764234041664, 14462722521216925477, 14082661984659007681, 1695477692957516417, 10365750554717767074}, + }, + { + {4884022083833567724, 7559598399602191657, 198426261319140977, 12353123114206461318, 7871074382107198052, 15544439452501146366}, + {10764302824973303475, 18236640700905160595, 4118397287860275206, 8469775327273188212, 6943100138927210185, 7678646557360620170}, + }, + { + {9047129816186912754, 686205745533008290, 17091874804035707852, 13829610192011685605, 8445841882472685584, 12683587236818333381}, + {15248187852218806490, 9143067576807462149, 13130422498538192412, 1987394184930393469, 17234091013976042376, 5309021133366567407}, + }, + { + {11153014502206421469, 15119688811090307722, 11900512007334729116, 12033534775335022157, 14206136005718288725, 11758356920610289524}, + {1170674544739813802, 1735805534869368410, 14265461327530260009, 454122264224446315, 1196955246858854577, 13496891451537487585}, + }, + { + {1963635747876520766, 8037994677047475948, 9778925841589003509, 18373179051584417655, 17774160058627740027, 11457632676580645202}, + {10746767866979893471, 6679657251517714598, 11924693891957720076, 15059776164765359320, 17106029443182107067, 2977050945907214605}, + }, + }, + { + { + {11428714276400700816, 9684363906879720073, 2326880593732199571, 8761076367298171397, 896913682478838017, 17538745710015774502}, + {16011943008419601378, 5975733755904344526, 18015284849904033774, 12671514003052240271, 17740261525233420473, 8887483872226550753}, + }, + { + {4149943974880712918, 10350790058854190497, 8196369947058715735, 4949794127529191723, 14693007776575755250, 799869184787085670}, + {13583602297228816985, 9731922590252326563, 11783888221311533059, 11272596661461028723, 10650424498639591856, 6814307635900293619}, + }, + { + {5187662544727433604, 6610818388649597184, 13217214483925463411, 11225358343307261041, 3979262110455362044, 17023319482473508776}, + {13540734409372034129, 10873366545113221391, 6574497676007990697, 16695089176775352098, 1800106753424785549, 10409365476253724591}, + }, + { + {7201953056257784053, 7550552970976446148, 6715285792546737720, 1597813460246962944, 5934044807465023074, 5362427500790106824}, + {10951441180547054651, 18111344793262344961, 11925095468088301604, 9885237597177799430, 17378911605611802956, 6344832877661407429}, + }, + { + {2193141511878184296, 8475396127202322472, 3917381969650598296, 16265248388470690809, 6186852221346093846, 11846013739636446977}, + {5487357187469375202, 13711750528133438663, 1849109594291933227, 15949224025529501096, 15221000652947043364, 2391723465441720967}, + }, + { + {7536562994359807923, 8905565631504805860, 16506171098935768123, 4130408208541979441, 9322288628868118772, 3079300424148444967}, + {16936259574260547615, 18438783821712938661, 10324525933994673862, 8397550184634189831, 17434676747885185144, 13637497700498785239}, + }, + { + {8483145192795413196, 3847913378476383052, 4337984637797992463, 7010629707438332975, 11953181174909111039, 12014680632165513786}, + {12276869096120751141, 12577833746497947189, 11723523233456261682, 14093651901317012131, 12375742220834231759, 12908141375852234811}, + }, + { + {3461865703771860361, 797298537903379949, 1718621620291046004, 9179319574938112016, 15506643513481237125, 17129849380198117652}, + {7110323273563692976, 2203663670190111617, 9853530541246034651, 12592752863363999293, 5433719754579498668, 224022543784731840}, + }, + { + {326532432663732788, 4070991663847076038, 1470607885232799605, 6211408722804468886, 15716355503743027945, 5590361253785299677}, + {7812181315317979243, 11828059863468531398, 12778009786378056601, 7800732687373876279, 4224156601900994011, 16057020107391082099}, + }, + { + {7782487925572685932, 1724391588041133300, 17972041778362775708, 11333825676811621865, 4537746153362835585, 4171052629714822431}, + {12770750867191330688, 634694503287104037, 10540092664171311636, 1350757360469465298, 16229194085829187695, 11033889142205249636}, + }, + { + {1500626805655044948, 1474262357314620997, 11484027637627776587, 8585564162226987518, 4361776374583212023, 14496468422187250418}, + {17741545623455229310, 12747090277885336885, 18323745182075670270, 2038556268554236114, 7015814683852162475, 2248939812176116415}, + }, + { + {4335040403419509309, 4616570637565163389, 17011251234033239541, 879860923453038495, 6819883123403800219, 1722220926773986334}, + {4709656270455345524, 16636162851412473237, 7348864482366322076, 14270025125795014424, 6328218483059680686, 13214052880713025067}, + }, + { + {11977022734060949713, 5628060629783977587, 103670064741031623, 8484869049261498542, 4939759321638626982, 16432117890868549963}, + {7629267303968775517, 16619962589721111422, 17463764779224102539, 10685322297759502900, 8807902043402042351, 17462711850802416480}, + }, + { + {15295264908526444823, 13335307760080513805, 4604414283483994449, 5316311055438475989, 9106484611277661419, 13606509782370139031}, + {4442177947438604155, 5803819775434638136, 4655697769853187972, 9432210737074556266, 1181431965380933231, 17230321351582564170}, + }, + { + {16450007145062463968, 4085694834533625610, 10068111071916006395, 7262607959861442044, 16002455059452793805, 14195715414553647245}, + {11695905535525197488, 17972632274451872946, 1579756808173779650, 9867832289808138729, 7742524395848721653, 2581276165337478448}, + }, + }, + { + { + {12418897939030198809, 15206661827925660880, 3670234668273509673, 629739459084205561, 12432881678413324698, 14794818295399912598}, + {8304013048279127199, 8979239574719663301, 7898287937622516136, 18064217129523036783, 15422375485556825691, 3491105078158712969}, + }, + { + {12712561841049401285, 13926510503703002969, 2612279756031831730, 9493430901786542794, 13291879522996024106, 5809241029170276658}, + {13691694507969220766, 18143668557798275313, 9138492995891623951, 688189100127541854, 15640560704872541163, 715816703484468594}, + }, + { + {9922254315993542377, 3698353835142433482, 2152397153019100388, 12317485668320147862, 7630803741744990206, 14043844136716370060}, + {8779442871712769558, 9907756658115628584, 14458334256944611273, 16860549487530785456, 6324109159626157948, 4731255892134100106}, + }, + { + {8002922251516613060, 978443873609457407, 3195553158279317543, 5854976976295928246, 10958159112329303460, 3970083282599810189}, + {5557639662225343558, 15971994949723322072, 11989908821085930999, 8821364574039081706, 16665145761534571014, 4658625544288657356}, + }, + { + {6340510664543185199, 17018415579031156332, 5848132202484941289, 1936333141268823482, 12812324366507433640, 6731572340563570418}, + {16857078034411292476, 15068277976532276123, 11722116475437972189, 1964509865396978581, 18238872631873981400, 7991345170212629670}, + }, + { + {4399729739127562657, 11272928375680253530, 11946741552547688174, 14049301799414882766, 15181782087994325146, 10089988859449254233}, + {6518268185564876927, 6536487350448659481, 9828361032623653320, 1339336992832075931, 500012115828942236, 14824212847841613777}, + }, + { + {171920790242842166, 5492071276632784703, 7283720254645560138, 5078044100187809965, 10385647514177990351, 4643536432707194364}, + {14989909821879706494, 8756233713883588748, 12449984475333613170, 12585959722117915734, 1005739684596759274, 11155909844346489416}, + }, + { + {11688324725241825062, 15138461392078796204, 12325266391227455113, 1340485671902994619, 282500164578345499, 7467882813685092227}, + {74331176722111354, 8867394635845954934, 10408699117489665536, 15725442571211452985, 2590111940561580876, 122458286127547889}, + }, + { + {15892645628302923294, 5856468311490081970, 6874561504197875933, 18019303355409739795, 6082937058931523996, 215426188952156771}, + {1268422509930086836, 14213194550854690836, 11126293425133380142, 9865185168089540488, 11632286407552253140, 15174468604920668601}, + }, + { + {10936413110689795487, 15010995742767473191, 4568817801913429420, 4205444133627513879, 6395122355763512349, 8918743386740702009}, + {16692774758406989332, 17955372475145034386, 15048470334846953021, 3736761708891032300, 2111259224340263959, 15614397697732925529}, + }, + { + {8738432084134066654, 3426263179552640084, 719712812862575782, 10981970426674636690, 9230912351159198043, 10854126184000364805}, + {1961455377595115519, 11451312678111642174, 7688356239558056833, 5143561757570891633, 9215608498872789998, 7917478891815725904}, + }, + { + {13905441237538948064, 12480816058500448930, 9351950531208974987, 17868240518152709336, 16456831118221743401, 14827343335622163069}, + {5502543494126784481, 389131188595713234, 13066540568193379266, 13328625471332746991, 5244571811269709341, 6606962250802166084}, + }, + { + {8488561190820155258, 5704568936155861609, 14891109450025140507, 14985917965027582458, 8150697647605526155, 13242121807143276147}, + {3762467964945321810, 6385131138942825064, 11791602379712639353, 8213332910240399371, 995112454035913025, 8530416099523440086}, + }, + { + {13640325735363574879, 9838259707028418406, 13090326969619576773, 13639005985461657607, 2136356356058124836, 13990780887246135133}, + {5609755522352639162, 17659567235866466759, 16259320408797139425, 5409555833771708415, 9408620568269064004, 6504340943038131334}, + }, + { + {5831978049482033791, 13004433680416851426, 13573449569471990176, 7730273069509750576, 11703396887458680397, 13713882189606773514}, + {15136688631097887611, 6655871600738369661, 10582530699775137958, 2242461969176695317, 607007649724149634, 12963349946916344106}, + }, + }, + { + { + {1245849788995478406, 15927065038482738007, 14167031681717622750, 6558184416262903003, 12026552713606964001, 13141157765235910782}, + {13953548913050124814, 10512136906136752951, 17603704039609623324, 145717304147461215, 325471403460036622, 13128236733581623507}, + }, + { + {16674741188506215062, 9760284329368026164, 6227912018538320358, 6062313431245706681, 11530767050864043247, 4050743335749600291}, + {5438096629683113243, 4619575833741800840, 3125333116803012851, 3488990215372938922, 10001296793595923533, 10533821010269665140}, + }, + { + {16525932200239811820, 11277725255119639967, 13380457983594150580, 11345091161981432621, 16404711622698975165, 2413157060343610687}, + {6861888264192898716, 4349048715057257879, 17588098592479288977, 17308040295861018844, 10945075256382032297, 6591571232106737441}, + }, + { + {3312100944805375360, 17751669833244855959, 11421167323527761031, 2790564601954208965, 2677089945270728547, 14912524259578856947}, + {5283996146017069939, 10959370318137784011, 9095576254518931495, 1311273597919359627, 14918615616693191386, 926115797902848153}, + }, + { + {13690563848743893725, 12308308054894561959, 15395087439588112783, 2472586724818805576, 8533710141094669405, 7942802424878184185}, + {5420945215657024810, 16122859608174405004, 3053741733492700862, 12221133467396472029, 15851472746153652052, 1947565546705152863}, + }, + { + {15897054605211154249, 15279739731289823093, 2336561653796295997, 12705889529297020171, 5961825895197974169, 2720481772301941412}, + {18443277954611435845, 594427728188203259, 12303839396678154633, 5358688406862385350, 13000467893527182939, 14952128333381655033}, + }, + { + {6619004200098886597, 3521645713977761698, 12344376102408265251, 12402516760501056887, 16667318326769571309, 12874140072685141335}, + {9621314969493341823, 5207967593480486550, 2826521035705699793, 16265445537996266956, 5066340697704330848, 14633460704255879322}, + }, + { + {4697083591690261853, 16801765456421135763, 18151421584540787936, 16835495532227054337, 7795860894099083043, 1328764521238600097}, + {8297620491750460337, 11793447721298138387, 10295382270817397671, 12786024121368826653, 7279518368534718792, 318434652860893917}, + }, + { + {17026077028448645577, 565529336479994071, 9535502575346171761, 6007100762400155323, 5678897757750626782, 9959925017754425050}, + {16242528163060496516, 4576911095161823236, 4403607854299656167, 12912517930864843821, 4739470393271194311, 1151478280656415262}, + }, + { + {16048476540489898494, 6783117499823714007, 6415336927764029960, 15673195924318961740, 6247136051556578121, 13084657697232162709}, + {13162992357344402018, 16464326350960129807, 839616770160173579, 4740726662754602535, 3152479265198829295, 6404513982945014328}, + }, + { + {3092232113376296196, 15331813846360575326, 18290474234869335723, 8231838642205234980, 7400082193016179605, 8410763375241570875}, + {9128762227989687509, 3794598237625234172, 4286873165056892559, 15334567321376368149, 14794216692099838599, 6895373348463126576}, + }, + { + {2724979383179813062, 14777475620842655294, 8495183486057249617, 13049191530970000171, 1463143549362168712, 7716595605180919892}, + {4514675039144392038, 3975933817505069894, 12970184659307405583, 4177319338659410908, 6165857585915235970, 17620162379352558438}, + }, + { + {1745353185162679063, 3792943368267263896, 5392169106673425858, 12818767881496565683, 12092569230529535449, 2578847804476911357}, + {2780126809449397009, 5405540052572325879, 15285827524500880746, 2941675021271411795, 9447355824276841918, 4559807377485007719}, + }, + { + {7610007746883416737, 10147509530120995196, 10888385397255137878, 14772040059195211280, 10560108669991599276, 2620459706274870386}, + {4887132538582860164, 2596493858310366442, 13580111877897930049, 13035579030058060026, 10732634358057493593, 13596263836781091773}, + }, + { + {16502308326832314698, 6813655593085792854, 865540522694200977, 18406777409114169497, 70237201416715116, 5540630135583650201}, + {11043265419464844764, 75803127346564744, 3544127781510566665, 8608672751361961179, 5292089330226488152, 1998221520759237189}, + }, + }, + { + { + {15843747259285912280, 11051757736519314133, 15850618202671354967, 11414438518663550807, 8901822655665788460, 4938308746649520510}, + {777341510519627412, 11562816405392154916, 767515422569196951, 16316638273329970696, 8108021482044013490, 11530472289475307950}, + }, + { + {17325850825538431065, 37125221006850315, 9538255856396155842, 1677341822293077462, 8890165136267025298, 15244650613952369517}, + {4845598674027029924, 276084057002262337, 16096273565408425115, 5476011667390370895, 13774404766368645238, 1693789135306442102}, + }, + { + {14853893681504474636, 7246777094738611755, 14348468490599768069, 1584676862820702751, 4055902816558872583, 14691624686566000273}, + {8463792358840766097, 3916260300604218254, 7138823842751636444, 12063405069309472256, 9666094494441286118, 227223526050825967}, + }, + { + {11439448267446980509, 10876971879546473859, 12463594188698329361, 4867143769403125573, 12497774131673245064, 3293027647115301082}, + {17269845420219875716, 7999343694417279981, 11042866033136034598, 15364989427615166682, 10865140228718307051, 15023792553833632785}, + }, + { + {3313587089867634043, 12345206552722066323, 2085484537482749047, 8672528099921546193, 13019543378492473719, 16014000899261448682}, + {8688247996955695393, 13880086369349074733, 13685898059232129585, 9745238149905695566, 12860398562206147371, 17318310740773319426}, + }, + { + {4831067862161961952, 1700016751300913085, 120879261664102718, 10126392277187226937, 12334968545166906646, 2424236269343093373}, + {5064451542294364369, 18179376425888307033, 18011599774285802620, 5403509623689485964, 6314622790688034216, 11605915467730303384}, + }, + { + {2247133619710642624, 14577616964025781087, 2368018907158808843, 16498726243986409168, 1407790037339558890, 1268560497020660735}, + {9801656500494901417, 2349861632952537447, 9517882931966374505, 17010759715257218806, 15435798766523589684, 17726795183758368944}, + }, + { + {18311374045587866554, 14447020620922821410, 11083360170030115832, 9113415708727437834, 14541956290558262142, 13961285592123282152}, + {828114605405992045, 12150002910767606346, 7206389356124187542, 17860503209876058312, 11798129788760460490, 17127855426259911149}, + }, + { + {6199176795763629395, 7044922086316649293, 13997864205295119697, 276986585995515541, 18048058974579713616, 16490720274644998299}, + {8536596227155890833, 3914547013952713733, 16510694033833622662, 3939667794619888075, 3178595810875111442, 12482691560580240458}, + }, + { + {6817856411751563437, 5442319161374364825, 2600227314552885688, 885644663444831557, 11700451742910873418, 12995396601628275569}, + {12803389344446349365, 17830292246277698677, 9309532553762179652, 6680640295615786576, 16662072345574199545, 5503555633912973406}, + }, + { + {9023109435328558547, 15291865436110219430, 13383262037362169985, 17595017389171456916, 9112975926620102374, 6959372004949197556}, + {5079998641977253062, 6532421761731762580, 3807095942977659963, 8160554533119900022, 6829392063047646882, 9484387938580835773}, + }, + { + {10226973915924968410, 8694011647938489632, 4300203054946897035, 12117316368104547695, 13852935341469006648, 16325279905079591603}, + {3279907632975731352, 17658867899191622273, 6430488073563164502, 11102370118583390470, 1351653460592165074, 1155328654798844033}, + }, + { + {17696616168038539128, 14705634818800389635, 13086381626647796878, 8160829291664474794, 12380871402708163904, 86292804711961768}, + {18387045944833009681, 366768093235351805, 6342784007092933055, 10213820317755221687, 2637460351332260222, 14273547543620959978}, + }, + { + {17055410858120919085, 5117864209362229433, 7752728474235998778, 5718238531312883549, 11379901830549393718, 6167331998180922513}, + {2139807429787460156, 15318820080504273410, 4676863271077360086, 11038500994511396240, 10091980097419465773, 14332586624137472063}, + }, + { + {10283737372978878771, 12574954996091932368, 15672686541053306208, 12565297310940420187, 16116977738821195704, 13549410483910339391}, + {7927005432441035757, 13175590081759395358, 1211258742602602684, 15884670892710680064, 3650720270567732720, 12671425442920594205}, + }, + }, + { + { + {16945326091077782209, 16464694010613758543, 15031894690983835272, 4230984078465338834, 15876751555985865416, 13853851790773712608}, + {10629669182284449427, 7123507341691517943, 1604779450978617269, 12335442368004615918, 15831231179039969998, 5721219491336463048}, + }, + { + {8779923605369004874, 11015027029723172570, 13053683587822215278, 14371924836322803667, 6175910444240484015, 7444596092153062599}, + {16538104473324970868, 17940085998297689696, 8904671253507597276, 10735167732778346892, 10719411100540081001, 11825864791636217846}, + }, + { + {10513874959070541808, 141726534094196367, 8961670049397339577, 17110620828714912466, 9276156314861939407, 5283989756429336401}, + {10830576007717201253, 10019682216548180288, 14732709404946097825, 11154000097553876933, 7279438743640661651, 11741828296965158287}, + }, + { + {13710602247235634585, 5794283881286256131, 7189333897035442825, 11474888458737436516, 9536387759009059378, 37447282054824480}, + {13831688592995763204, 15514310505960816464, 5617377358519582781, 5382874924721720664, 12826347177360954774, 16487830138240466133}, + }, + { + {10136021926566126263, 11928523244042660673, 620080950963362813, 8625626899007622861, 13450521127313958418, 12173913767817931256}, + {12782398870117899816, 18284930545209739688, 8340732005841122414, 7667253783573485052, 1170918830797979709, 2726644985398233748}, + }, + { + {5868319710548462775, 4614538984539777268, 3606513902357509689, 5842687629722217460, 655661300379058806, 5750034184391579904}, + {6706948898263875391, 1861998499115841763, 17416124038131320471, 3088573942691514912, 10862822225918958565, 10723788336215927712}, + }, + { + {3469954697000879474, 9886078825125536983, 16639512902206423417, 949458984263591079, 4713065388685405969, 6485681870763151394}, + {17550597369256616144, 8492358132474734258, 1973243959933916082, 11845479291839734419, 10373742178422412864, 12917185093797127077}, + }, + { + {10148520876393042933, 17008996819208361065, 11244838413238054187, 7578025140351179165, 11819693939772377780, 11922206691683897452}, + {5193678850892441703, 11269576636085412111, 14586018532679524926, 2160103807216749946, 2883270595579022419, 8933957426785365011}, + }, + { + {7701278840381406043, 813864330332921165, 15346578798485581339, 4630804650809464614, 16185031359787444003, 17826776112141610425}, + {8401323936341934197, 9592171776430509912, 7758005530392712135, 14454554148729439336, 7956273653179990376, 7839320390573561917}, + }, + { + {9250363391170832193, 11006035015261134401, 14458550514807354785, 9325016894298710330, 4144596754841442017, 15054746156170374381}, + {11456640279410058145, 16275606744085683852, 17831878718437221277, 1528529578606146868, 10275813860685205403, 15479223083860040951}, + }, + { + {14596302840734253179, 14900690077811267578, 16140097010885461623, 12772352415462534488, 8614394783748304718, 6766902863888446020}, + {3301138793577892410, 172863568565472035, 5251004015700101269, 3165424378709792613, 4958340403792084944, 12619148531858668210}, + }, + { + {3284553122109620274, 5270759104970263988, 8347616712857016748, 10393685591838506061, 7030247929091757107, 11570651577508724004}, + {303593432212184598, 10870347165523269046, 5858810139852537379, 1529168183268214217, 15332143584615473398, 15102908354736105773}, + }, + { + {9574340152153043928, 1662915623607662881, 1811398080012362182, 14878205415613515919, 13936394534036516069, 2337960597242570130}, + {4877776368265943702, 405103566243555934, 14225276821637443863, 15556532615883469807, 13552306515137288805, 13115529663394516774}, + }, + { + {8161989794903954412, 11660052284711833602, 181947658370696753, 12989304799327482750, 4066413204451462606, 1942221685308503206}, + {12484888137941485851, 4649383641303460090, 8371451456723263654, 18441597518505156777, 2352723388962482606, 13975888702704352920}, + }, + { + {3847700141255053024, 16406472982872848520, 12468984591385771739, 14942334423186830995, 9933763195617481489, 1409101159701707313}, + {3573772803237348824, 11730844867315771254, 7243658460515938367, 2166169203511142802, 6248287935705475203, 8265081108739245827}, + }, + }, + { + { + {13853753564171363451, 13820378722717422408, 3590234094500056381, 6866298275188000567, 9895869565406539361, 14927210698587219451}, + {18236367046121661763, 4730509858602802480, 16337561945026136271, 14109799857833288312, 11587799424253933816, 18285301586729898647}, + }, + { + {5697628194755082385, 10473326214136017445, 14513883747346413480, 15341298111275585222, 17117376470859521237, 11176286297628034124}, + {13634599286238815170, 17382552533170299294, 9094266669583253997, 239734418257835070, 3591794414849763173, 3133034763403569336}, + }, + { + {479206554903518820, 14658665690734737994, 17152906210790105810, 5958667172720220276, 18361725589118886101, 6185981515380453548}, + {3944672359066359091, 13732151285655721173, 13939827029587789643, 4302296200033682886, 10240802189705837857, 17865142655928189798}, + }, + { + {8306168305072060501, 14751131852602843064, 8096080752206544475, 4680206077732390021, 4419645889416275973, 1519820218356079506}, + {5861554578628119723, 17661801171279693964, 13496831092349512650, 3841281188034367706, 9158790543647317313, 10612203699190989969}, + }, + { + {17037898389052207682, 17860849396131636095, 4349951673886175152, 16094377250964498544, 8476986837295463150, 13680887785001025305}, + {9336507099265066829, 5947089043768571535, 16585602400938566700, 12581267016799867259, 5245484406207830441, 15258801158753041634}, + }, + { + {17548721630682880044, 2012629971546646455, 800602602193080743, 17396222438338198463, 15386698858603827900, 4460480856545157616}, + {8525314085294734845, 6802480695964082562, 3816316223911984005, 2464494579218714722, 16070919992014947059, 12434854377052757812}, + }, + { + {10772836789272530628, 17088691547289098969, 6718631187086570471, 420298886229605471, 14226789851958972081, 17291643744773087097}, + {12356365831670845340, 13630822714405907791, 16223114371865091666, 15934941425414639409, 17030594846596638635, 8894066301960174157}, + }, + { + {4310605480085901679, 5471288425725661823, 6576140643955467936, 3714340113776184365, 15078838872712774233, 18067422699917639715}, + {12245168645156565325, 15389216374359086860, 18243910314816324743, 13468377185671333723, 11841166299472831071, 11909676588719569514}, + }, + { + {3039346662401409366, 11575031947853028231, 14291487837746157982, 282111250317099825, 4887181073166372566, 14047452768090024474}, + {2283232607704977993, 4156222868336602759, 2441521584735661714, 13573229353517305526, 9684005436985156440, 16922485212222584386}, + }, + { + {1553039617197624241, 16514547904183858426, 17367571479943820700, 6825408557936662849, 2149227651964819356, 12858662242348855034}, + {16445523343296776096, 15421752631325482241, 9264183421788584112, 10262669298529989004, 3891304426791575665, 7854962043530510807}, + }, + { + {7161328094115041425, 14768718294470741983, 1078847568267874018, 6322480815278149199, 18188544274188331587, 16963805236223110899}, + {6569325721741554692, 3602100460502266263, 6206643867130260259, 3995469255074245935, 4504503583988431466, 13467328567518375341}, + }, + { + {63226333202683911, 14671906635501883344, 4335660486805420293, 11275217723178135465, 6969760830613945548, 5475843160816775058}, + {5191859885839573328, 11668101171119622286, 9518940388019884438, 14714241947617194877, 632307311715190469, 10690578858328770477}, + }, + { + {14884997433355015941, 156621939301515107, 2445891763674288403, 6687931105529654257, 8038932454300528136, 17697513852216155615}, + {10697408303393919012, 1270195498851099805, 8775588255042571995, 1242116603145454630, 9905730533240215250, 11108714318383369270}, + }, + { + {11500726014983094694, 4893160514903146014, 6828604209587544129, 6694479643978756339, 10165551838331433795, 8922014005219839474}, + {3229903124718463251, 14809704320533033299, 16708685770407035451, 5156200782696113140, 8700282174866114406, 7662703141074882120}, + }, + { + {5701014331899997770, 4977516111362250117, 10386130146580034690, 5907362069264702911, 5301877636154186197, 397392370575027293}, + {1263487057932284919, 11711479762453857997, 16042267091696606042, 15652910858049110642, 10197526967041956937, 9889216320967166622}, + }, + }, + { + { + {2278932254609762845, 3068437509226158452, 15744868666981586003, 8677007854964299754, 14625754507006402628, 7482852446653641224}, + {15206963697756253732, 7484355521899064206, 6303098706947551318, 2787820459819783710, 10505036182664953766, 16812578278348872057}, + }, + { + {5328402213024840932, 2831229329708260259, 9906671250991291328, 7195378896450113384, 8137962574541487106, 15483420743942942895}, + {10185763153215621718, 14520317539607894634, 16021622969265412233, 249210915963234415, 17409430098951304156, 3459897863682731842}, + }, + { + {4578309973503497569, 5447834563002642123, 15020655062803172906, 9784029918330815189, 2259183585428823851, 16276654784273178554}, + {16974315692938443293, 10322189489795986428, 18095043949242233690, 15529824169672291114, 1043280182503641486, 14396190389419318386}, + }, + { + {13791916129725914380, 13541507063515942618, 9276345046434203244, 6943275844315018043, 16854690413809965818, 2726487241024832361}, + {3900450032896335120, 5969156219373170750, 17268291021193518751, 11250600592358444059, 7565688406177070545, 15380048155812318403}, + }, + { + {2159715218114046205, 301696308536518990, 11911287610460594499, 11610729258797804364, 1589214470697930255, 1570320627315083551}, + {9260920251773296769, 7918633900008866828, 7386692371354490728, 7126854243096368735, 15222007907649556112, 11290458721857786222}, + }, + { + {17312369275830596578, 5182973081822417591, 5758577204554952034, 295579627010058982, 2247918074145955246, 8367663961370585320}, + {3503412556908913188, 5007246298285139323, 8914116616437113026, 1817837618482256490, 3888281808755203703, 3596198455140072332}, + }, + { + {4204733050884801398, 1015148026108767645, 4474014702901614014, 7893591904251967078, 4629334549496872963, 15544715130284192268}, + {11515169364144564012, 11336358832640243779, 10261616753173485797, 10330995131826947610, 12790048324162427726, 3954964425838098297}, + }, + { + {15466718315096778468, 8207059140145815039, 10673629467808554944, 886708118721286191, 10960160354467637448, 9642682828370620599}, + {17438921783439498819, 14206610474459128199, 11283947246870324451, 12050660127565107275, 13394619346776634282, 17491132232695062376}, + }, + { + {10457517951627566681, 7814805982659785572, 4650803108692583382, 4440130354090651090, 7336812384548660642, 13822285076682517424}, + {11611474337378208231, 10509443664430110860, 10916114862115943164, 12170669850354153477, 1352553062166066021, 11347589626152349860}, + }, + { + {7366949076040585274, 9972276751640303927, 16423512277534811183, 7530907908504052262, 14015798648185098200, 8802667423497257421}, + {228792414850368243, 10508703706507014037, 15514995919049710800, 9118562110950567762, 10221889965935090890, 16185466175233862997}, + }, + { + {16803723690699933675, 8487548998297552291, 5803011050307689648, 8460712827018550942, 16456152075823939447, 156300814418469424}, + {17276908626721299576, 10528203526298520812, 16491173177262003297, 11906011972808274164, 6723396315092456133, 15740670211031988239}, + }, + { + {15373669199500708772, 1418986186617967125, 14646929309039869466, 10499548009936132679, 5225957845760868950, 4939303423191000552}, + {2490287739273437898, 16292383701614685255, 1045010937850952943, 12708627850998017142, 10150876621237058060, 3374704772596624527}, + }, + { + {6486481503809124917, 11162331521576557500, 10016688945665150046, 10440833383589084422, 14434962491136116288, 13795058186240622619}, + {7202909919242169987, 7084906191002088475, 2670999100224514475, 11205165509896785683, 9153315609780748370, 5520519463950164065}, + }, + { + {351071170739877570, 13322560781273060052, 1701785565365847432, 9955777089526659386, 7009753490594385600, 829657910123534028}, + {9606276748652074643, 4015732708367370031, 11721876633733031363, 1595979662340466299, 3599656218219669185, 6412814251963052600}, + }, + { + {322868295872168097, 10779671223207907160, 17146021042584030369, 7744919563204743978, 18009926370684955932, 44255721611034122}, + {7075518626826263580, 12948066299893087092, 7907043165345290748, 13326944701483639264, 4900286334119935957, 4216867816480695349}, + }, + }, + { + { + {11422675888913080491, 5395798484379963549, 17893801226572621158, 3834831668463767880, 18370393837527875887, 17800133101197187390}, + {7029247643873698097, 17334943497121462468, 2660202885167189413, 329065954663218375, 6698129215665562567, 13717605916501910272}, + }, + { + {8639178386474167317, 866299449001193597, 3615027842912577064, 3248451241352944854, 15229370169242039655, 14022996697023959990}, + {18261603954599110401, 277984183194636545, 7122474136492127151, 17268552229454245560, 8360275028065354990, 12658058275321946659}, + }, + { + {7568749213445711158, 11322886283898751316, 1514838974790282409, 16480451187055352472, 3521826310939475982, 13331538149045598985}, + {16615732436977239999, 2388796933096443142, 12226612954948297380, 10822339804892299866, 11505338527635209905, 13965903403607753974}, + }, + { + {17992684961837313681, 6896408298290524868, 8544072807657571566, 6748791036415412590, 14025071172791740982, 9009141746159193034}, + {13586218153614538887, 7799628080484457452, 10266486360990114058, 10957603090701342492, 17913488373740611379, 3678764260563976289}, + }, + { + {7850028067287088329, 12999005266298055869, 177742117066576348, 4187563636181037744, 18227464305249346823, 3944943827343100145}, + {693604820039552598, 11582121744559616851, 8219537047451291189, 12011868187157813437, 4720619866818053644, 4330189064262098264}, + }, + { + {5651722935351245741, 16211924818358123384, 11885056608369234243, 4201983212017634359, 544526908348909642, 18119044215050860139}, + {1629340396439724022, 4959173500186337859, 4507705775156637972, 8833696014848286450, 779478998504818906, 7902380186120673057}, + }, + { + {18293852260825634987, 11802124232706822019, 1644849027510672867, 2812476574328933804, 15557250672802932860, 16508981297686648154}, + {3465734358950613242, 526649456539607490, 1919417099895547055, 17331494709758577824, 5162227762764949865, 6242065099954684976}, + }, + { + {14405288903984360898, 3180009282630369461, 7764333772077120386, 14416489610146878273, 6877362386602494384, 8785041971848387380}, + {16205552197332611855, 1946014005873611974, 7425906351428289382, 14466564319882318102, 17948246265185418576, 2220383241683179866}, + }, + { + {14872241004765885673, 3636107144878936670, 11410176190546783355, 12181463760260857326, 10438330742190191570, 8102662675316985666}, + {6176126135590814635, 15938212979141106430, 6930351408968184663, 8991851982195757076, 5444235666245388183, 9160086367185317170}, + }, + { + {15340964667452830754, 14317488092981700975, 510238063968897076, 6837249889367286466, 525386960344698653, 13363589982130767126}, + {17072735759253073196, 3498833952641874877, 18362568207671943201, 8995020072357799227, 7719631523143820724, 1085622312019426779}, + }, + { + {13037971076711969658, 7591102587937139905, 16112103964232511295, 6658071900440103886, 3506958499519852800, 11206278262730072649}, + {874512935619455066, 14023431168230615564, 7818120766602709739, 8832031439666609419, 5585964366092107082, 11504555017740100069}, + }, + { + {15350102097560218059, 17960930933998802379, 5819537312713605133, 16574725790066529972, 5613973488460835436, 1634532828922318920}, + {6054735558644874316, 6779535286618214798, 12125632371272029575, 14822061593509407829, 9915577628769350648, 3262340591497022728}, + }, + { + {8571949731132956833, 17851489671172976600, 16122671592171467294, 17953595451749771955, 7101774572418004893, 444927268485192911}, + {12898124468306022144, 4543591108002290851, 16651517581025086108, 16702288951395475761, 9009172261902505944, 17794186523942672480}, + }, + { + {15874281727524415422, 6572132168538751333, 2488717046038925837, 7528462563702651155, 15177291123321120421, 14276075288284279593}, + {7287442030153170731, 8621411913466239822, 2230532822823360290, 17882655262254713908, 10820729357094734590, 17116812739217748569}, + }, + { + {3521891825683807648, 1428294732738224966, 4467541612632144795, 10743380230531306175, 11596549629085266496, 12996854075027646298}, + {7286872326554604613, 4747621740227512796, 5892707014992033323, 4322214473714022904, 15745271974603396672, 7332629562375692095}, + }, + }, + { + { + {11178967054056195663, 5059057946657071041, 15846370838494899705, 4058997021862163911, 2593984691649122230, 6254605580411388786}, + {4176062086390468245, 16189011794825339160, 3064989397845883132, 13286588576296135872, 535125068036700463, 10408854172492123217}, + }, + { + {13415824456928728537, 9031989784978508164, 17964218247364329886, 10744745034242750397, 11043008786756317850, 7568533431395324401}, + {7507011205371347198, 2388282443864154121, 13696995679089020165, 12583409078815059304, 13898075392069488590, 3664734608506976906}, + }, + { + {16544958402351236901, 14337484652764170641, 9770866337239118974, 17810777202725060237, 2097808205286057289, 10362289157561627722}, + {2685761484429320421, 2462399891877992298, 6512262486201450596, 10981880327208688077, 6617301996979402163, 2835239075992528291}, + }, + { + {7991173582500478757, 8893625338111976660, 14169111919230117155, 12356393203568432042, 6624804336968870156, 4373502195159979453}, + {5525831087690451674, 11667968375332638977, 11672899591207027148, 16453647862989440606, 11804399513913845371, 7628460269199181450}, + }, + { + {14630566089474246013, 12500213971114656059, 830106031407073402, 6911967831791350423, 5540576114989833332, 5622942981234358149}, + {9345206395676904366, 629433153585557678, 12592664746177863352, 7117895689488311014, 6126264353083621009, 8672251668710377501}, + }, + { + {15343270797031359599, 11669913580639087574, 5479735138674518875, 8134395341091815991, 3472212905841111046, 1943386847444310169}, + {4802323257275851562, 13041393404614837895, 300696023871229709, 8124939534882080453, 7037259695740405607, 15666477288369374120}, + }, + { + {16929655147930952127, 8700678224807582342, 6899508338063907541, 14124820011808216974, 6685131911353931949, 11392136278714910024}, + {16320977876025241931, 1873285772151321892, 3864985292509805330, 9209816330063069102, 14360660501914452161, 13765026774665638630}, + }, + { + {892554047301358165, 8208545275404753447, 8552497586050955747, 5886745868526813090, 11422451069439740114, 14454702771432318255}, + {13473748178404916790, 15675215165690108087, 5664345539094868232, 987897124768858568, 15329698597492189645, 13301936956751718708}, + }, + { + {11819868530282842855, 6710224194746120191, 748201410135027328, 11307022666945855023, 17212649811821554251, 13423110040809399786}, + {9934050328022487645, 12074357593722511625, 6630946082142899698, 17056161405408381398, 8571006633367538659, 3796784189746526746}, + }, + { + {2305785560014348207, 9531795736757421484, 9618934670188570881, 14780074586441306089, 6200104801707088881, 5386351446699164262}, + {3002942961830406638, 148274483233190080, 12735679168321756134, 14693507680316309726, 14232858087052761737, 13985992269476016693}, + }, + { + {13842387890174377681, 15419080605999723375, 16681571383346636493, 9653218004391250805, 1748476375644147649, 16081919636049288692}, + {16200057164189696404, 16659975838973439415, 16148363345960831424, 1128253701358674568, 11627719509137069576, 4062100673790478823}, + }, + { + {9445528033084918138, 3236780574278685899, 9682773997054520194, 3980365165990825614, 10958694477307693178, 10839810148743664524}, + {6650282121724231548, 7894922159420004756, 5624389477223934865, 18151956206730252126, 3735677846659494424, 7111781989342355242}, + }, + { + {10926693111959793122, 3929513560799028061, 13083700370081498912, 7606788298622011804, 1499929199041655117, 2537708677997890346}, + {16163615921094614869, 12490168710448316035, 4173408469387936546, 9680453490885130745, 6897387665823483412, 1803882466154055696}, + }, + { + {12928382421675599167, 8246098434142042032, 7828289919035992593, 12704490623615851803, 11049427248294980078, 13839977807550225944}, + {8790158444480790055, 14691519147850982325, 3571740556626361440, 2025494493460599521, 3901915857099204524, 9232848549491285301}, + }, + { + {17205250580750313739, 15838972152830244406, 5212027996849957464, 16696646218907655391, 13718292263491425643, 17806855155656742837}, + {11988041571551593283, 12853752025657189673, 13524920127388710455, 10671352188986408025, 17279385799981015698, 4758202966923836309}, + }, + }, + { + { + {3974313353418109687, 5720345224825286858, 6801835843798312295, 6372634484952764872, 3310006789326513240, 2726055308497026029}, + {3843770043613727251, 7900599654720541372, 632972795419277904, 5983319127366592262, 3077785537568329842, 11218370678822489750}, + }, + { + {8928421106978139244, 16345148895360341144, 13492011400134727288, 1731289337634521374, 12525842512649542947, 4207120388067304407}, + {2345046098001310699, 330997644936357897, 13635040363459393506, 15230878178212376507, 13652277951430850918, 7237296141945425478}, + }, + { + {4557723407539085034, 14471756909246230823, 12448850285779367089, 7851797223627122363, 5151430975338428030, 2954895927776921398}, + {5279712016090746131, 10809813162354586237, 9242053890074456174, 9668653512111950665, 10135306740731568651, 3351464240228973156}, + }, + { + {1627053608069570695, 11376938021692164730, 9622466798286684763, 5827728193917331600, 975693545877321955, 17470494739932363034}, + {2436171715026125366, 7848361070155121218, 14061221750869732481, 4888283785453330436, 5036741489113467755, 18084794423259936778}, + }, + { + {3552955380513038861, 6493678664778873794, 649357577150179579, 10545862185632419419, 16350124503975893898, 17724367842084936677}, + {8896453178391269512, 4710703558251776246, 8492419126400496150, 12768468520236451572, 9192761450614257478, 7438647446930613021}, + }, + { + {12369531841339403158, 12996664064774054476, 16155473999921375261, 6644207479370307599, 15208474964382806744, 633958492471874768}, + {15790482482394397377, 11673958026072739923, 2075775971265990014, 1102830502989644674, 14328138387706433231, 13602359449553119289}, + }, + { + {12143092119248055873, 14188915263690936719, 7408425876028150433, 3779414505485695820, 1780029671596030155, 12865710926564478965}, + {11680590440944425259, 6090714137241796515, 17343249885314900203, 16644769067866316590, 7256952446206185353, 12961945084971064727}, + }, + { + {11134447122165152593, 12122722588466177555, 13031738851579131777, 775360620960643964, 14535630049172421527, 15517365877497081698}, + {6749416834835986329, 111798195283805063, 9427922671178152846, 5583634039175768131, 18026394909638384188, 9381210933213377107}, + }, + { + {10334265748604755240, 14313974363914896934, 906523409788490776, 18014259526343590726, 2489497295341492694, 15497769074229220560}, + {16667753502962144886, 13343473574324449479, 10922772232061902038, 17638948975896960836, 6206546855196209053, 701379544767660020}, + }, + { + {7323167804561066698, 11606373977379537829, 7740797211952786009, 6774632772002662447, 4137066669379889537, 16448062068535134384}, + {2263388950950990004, 13986419062957738814, 12736780551361126087, 2151837813422636155, 1478109418633068180, 13196418687650255350}, + }, + { + {4763801360917190189, 8413965106647468101, 4459652012857109043, 9905026392952537025, 7732441075598956516, 5321607056947218327}, + {18121980170092748441, 3481588764335216251, 10446782825632997719, 7693360199940913038, 17104571571510845330, 9855412900039516293}, + }, + { + {9385835129240491860, 4824589714590984336, 2196446888524873714, 14983326779959559720, 3813990482140930799, 7930070026494865435}, + {10845320348409053590, 11702362686639252435, 15805206625312010834, 8614879420112692657, 9694429543708544128, 10989853026030014509}, + }, + { + {4594816827257062041, 2562345560258457605, 15050193570974712932, 17246403151526033694, 16146699389908107161, 3086841042515638998}, + {1177843674463060692, 12536747725401551571, 13206715304133223188, 8671490102358535635, 12212794350549092683, 20556749311088582}, + }, + { + {10565304604241425748, 5627103307724972881, 2705248188066943448, 11105071139145988281, 16803969759084451954, 14319542282813740942}, + {9198217579227787191, 10953486347952736044, 4560368619486330585, 757042920267352831, 9594548960853813804, 16693022163678979226}, + }, + { + {16489742344230153188, 6539412415140498039, 5165832543217723569, 13003478072329918265, 10047084890632029191, 4694331753623574371}, + {10703728784580237099, 15556245530594099306, 17588951018132280983, 3935002524499547861, 17702492742125323184, 8520257892664878061}, + }, + }, + { + { + {6560439988460907757, 5477297489685795935, 8263272205317190744, 2155221279069076320, 11867925124460267529, 8571196738200600952}, + {6380793266523402469, 15145030817477249320, 17647327914659401104, 13319573822063298508, 5205094261198279328, 9191043393335719432}, + }, + { + {12034745616655220445, 1806587157936901864, 7601847606478345239, 4533004298191165610, 3124085236761665559, 17389156053407331651}, + {2864989624008200953, 5136009810031599899, 10582433036693217288, 14931735150274274801, 10439401220326631886, 12677134576293396474}, + }, + { + {14650755191841474854, 16300166795758970811, 10649037273588294054, 7104270209860104788, 7967261075606297822, 7279561497784730946}, + {11697616288471532112, 1052366164901768766, 2912238129374155198, 9701834771332452417, 5442175782826775844, 2299045115469613839}, + }, + { + {1287332463662400432, 3513212364154390112, 15346209202263562543, 10855689071781783808, 1452088722357536954, 18071443086358423492}, + {868440689883949449, 1816852863222370485, 5199615657293991859, 9449935448458274470, 177207136542962287, 18245562675978917823}, + }, + { + {17651410429892341588, 2994246517539724152, 17728394019247321391, 15386586165465459648, 3241419904742758835, 8030267348237056794}, + {8435074151094093690, 524712275897055450, 6804195566995782773, 7679712373149113143, 7995287808064276131, 8927279975652841496}, + }, + { + {10778050409776497212, 9536627676531662024, 7658414011223352564, 12327599912454605669, 10735492819935528307, 2807151273987894916}, + {16239030609792653613, 10332717478474239620, 17257364018983708944, 3381279635307716914, 6577585621142376520, 13802487288606991045}, + }, + { + {17954497611593459666, 3664315036641118415, 16509024076253684643, 17283250569741859362, 14982375386085505669, 7689080851173975344}, + {6539602342283003922, 14623322619256010467, 2886392582253254823, 11318353402632029623, 1048960849463114154, 6823726223520193527}, + }, + { + {4530098428200707620, 12839096969967251554, 6198816293838808699, 14497410916805455082, 5464738801928006246, 2590420136286143409}, + {11539859348742386287, 6448283683032046535, 5190841120404297714, 12682630274691496068, 3502978196473226835, 12528396777891929349}, + }, + { + {3746596285568179795, 4244746780559722754, 14192133631604917518, 7971972442736154200, 12850431088842970183, 12924848893782277960}, + {6210043026683817121, 16093936346760077654, 12896762480304091787, 37796835925086671, 3297320202618582783, 16993735692589610973}, + }, + { + {16449417965222475184, 7693932127514324007, 365506606826317804, 11357852591741708092, 13089599889026601450, 16903400737548641302}, + {16984170724371326225, 10391779522684702015, 3067870164038615636, 14252841648119381798, 16218707853229586386, 7836241961586971830}, + }, + { + {15192483994066769425, 4516676767104334066, 3298548929696008355, 14149842818379505147, 7754159985358226567, 18074898548922930513}, + {6787600702315314002, 17427509000681768725, 454039934719798915, 6687725764533626315, 650049015881932447, 8174481017589685550}, + }, + { + {1190766049258248701, 16712766508257076609, 16011267443004798709, 4304976661940244179, 17401735122754430323, 17805491770899188624}, + {12819712409221279306, 6012470734633531883, 13202842728516275075, 6714649673431658519, 14766728086190011567, 12025005326013128366}, + }, + { + {2550442130803597746, 4388182498378820973, 11877916159578114240, 2491232568553766269, 3061633366263606868, 8930196601588700949}, + {8351158090909235917, 17643196865264803997, 15136059012100053669, 10435163437422615040, 14669662828147957267, 1927075496220718405}, + }, + { + {8522264882073051051, 1620578049778200332, 8273686191210510914, 15161466784984992681, 8880636972606501019, 5137083413106892985}, + {7453074636338505180, 12738938384123169905, 14134926144460829976, 13289026532736437285, 9961457855205231232, 16868281080316857896}, + }, + { + {7869220388851879053, 9243594331185701304, 4578820859414588545, 6726500389404417900, 17828060266225175185, 2805995484906762914}, + {8127865232957840490, 1119209698667346666, 1543121112626802223, 11635665147697604228, 8700384215304758069, 15110956032330707009}, + }, + }, + { + { + {3999765870898298471, 14172770317997608516, 15838808511345459441, 17483331932540195875, 11537545446428919358, 18161106008778308362}, + {10832208579815022485, 11144226171709861172, 17832358814667390783, 8104027490956075374, 7738001035752373711, 9976303985994712521}, + }, + { + {3053316092196908301, 14599294197004415859, 11376968891216184065, 2166021074759834008, 15176324388121041813, 1177183645238737592}, + {8872756236922047177, 12695199395087628448, 43719476960233138, 9968538827589652609, 18292294231863534866, 15247938318298852535}, + }, + { + {12542532240058205361, 7268582068935965299, 13539169522639613195, 6415306438194106780, 752732255800848126, 6467156824109874302}, + {8919765688158995394, 10376805730213749427, 3560797874989249371, 13765505640431451465, 5413502209131873679, 5479930898819906026}, + }, + { + {1620953412301746638, 1834494332682380488, 1221287231603861044, 7143200653970910387, 2142887614724373742, 515369627860172237}, + {668312192947122200, 14495573370059274601, 19053408511875346, 11573007294798838371, 5996919291690021344, 10963600343891369281}, + }, + { + {3772056564995867704, 8936213084537725440, 14741295503761475310, 10169482512429303117, 7395158688725827440, 10625709550842394718}, + {14145698620161177178, 2138174424797012712, 6382911437211835009, 9621628449746421183, 15318114188233644891, 9127092351657370481}, + }, + { + {7569439361788924386, 5358743744068588919, 2472617216924555430, 14446025836401453832, 15206339952764265454, 7985026553542652918}, + {2885368393308729366, 7662239829932173449, 16902869606779080248, 173909372728520956, 4745825384290840252, 18238389235634593837}, + }, + { + {17278763089415978011, 14648999284612290464, 14549644405624342751, 5242220935080712551, 1281695041546515602, 15620247700383069753}, + {6061717613096359788, 16094895295267398297, 10954605165474093325, 17036094738837097294, 17315827424817840310, 4006783343088127765}, + }, + { + {3347760495316022590, 18353910874341978035, 6043778301036432970, 13355724919784404041, 13015796096139756391, 12036177583658955420}, + {6518471179080804014, 17158842633921763658, 14405522311746951243, 6973400651137011042, 4746890325642485958, 6736547103097705136}, + }, + { + {10669366973839367672, 2385569531879845310, 5688157778456360570, 5432194657022107321, 12671178471488614588, 7761060866335594839}, + {8978451158519567422, 8492352982229672202, 16643425269116819050, 14671179713658552694, 4363789067899164540, 9370620302779212621}, + }, + { + {13310909055019013380, 9596076897475568893, 6086247547890141325, 6615089564251394108, 7111916614455620574, 11675908774987320387}, + {15925711704010954904, 1550153309190557596, 18423416479089687440, 2237807451710845475, 18354395799746145454, 5438928742395904784}, + }, + { + {4608572069409268399, 15073585230746724421, 5850493471469990136, 17178910933214514567, 9197442918599759710, 1507943865355025659}, + {10368207473957700231, 2360337372791198513, 5963074125901124077, 4250878605574616141, 16077767359709901643, 4855088307376525666}, + }, + { + {2203675397636717516, 10128211604548624427, 4835587188573085370, 7287969591049025649, 18068255218779265239, 17327995020974268765}, + {5719882824311508910, 6709568563671378548, 5291703009398100222, 10788191138630994747, 10408053012947876069, 17443305409665545835}, + }, + { + {3342016462643355321, 16679489257601825281, 12043384844586211843, 2115834496701139743, 7212063995634259653, 9441913556375417406}, + {7879272060659630672, 1322154690117373473, 1520558149537399921, 10259915503278516179, 3368650106971654575, 4144693617269779944}, + }, + { + {123661428923518452, 17329242377861899194, 2113549760254636588, 847106394960135909, 9954070461361301937, 15563438708607816744}, + {1040702637047883211, 10189161753028718742, 4009789976573376701, 1936488692781097326, 8873733742849194027, 12009079112311092681}, + }, + { + {17741068926415815996, 2460265563474934139, 1072480528377351648, 11885568366174373122, 275536108394716793, 4505994571681041972}, + {4997815718062610307, 7966342590073259297, 12194728418927987790, 7653673951695752977, 14783821829300070265, 12992716489185017892}, + }, + }, + { + { + {11640101960998639313, 15953805101075159736, 3493841973394909037, 12961869929990749200, 13933610253398336212, 12682152790147939130}, + {11399471237860797020, 9683858492545796215, 1548460573545589546, 7173998343795107028, 11677696610449743857, 8398835533776273489}, + }, + { + {18347627398589476579, 10477209504919905991, 11985004040168566638, 14212280469459055980, 17155809208164808508, 232842756626748023}, + {17663176896634111834, 11266862009271054832, 2801433370426448852, 5656158823188135309, 12410354059238919535, 2244879375847000921}, + }, + { + {3190520016779022051, 13246407962418081856, 6668351451725762413, 7768576717338627844, 2262028295584292801, 14381567562481981200}, + {15520621358714576108, 15362331656590194956, 13091576850573016550, 5790621552805149408, 11085966456081752022, 7995145398979072602}, + }, + { + {13623592007492989552, 5695669685400021686, 11103834195452561281, 3924874736262277070, 14749945062025337942, 4117578579179786869}, + {4942010861531575831, 1697597687729901180, 8378286745350822869, 1042755497644966445, 4609634700670610222, 1595371322671204226}, + }, + { + {7356907816961926000, 1600282058170066082, 10425052022355846482, 13802483414078059083, 6527010123231557260, 17014236698247006256}, + {18079966107052649494, 18199473573195697305, 12045755339859992655, 9377227322475274712, 4707316309742615490, 9453719605925386277}, + }, + { + {18077338856333540591, 10940855750925578638, 14676427357499773843, 7077022433649111811, 16481763083992802494, 7834705448306735746}, + {10145419701640226394, 16562141330625721365, 16626213781430570449, 17015973614586109901, 12442022173385031947, 9087600251713065715}, + }, + { + {14206474989889371590, 15241997516043179936, 10046960511573015546, 4012668500672179053, 6302607210097986007, 14073285009414845523}, + {10393845740118669710, 9303896053454113349, 318938169015454180, 16356683611313694376, 4951073049233679376, 8961912152048041842}, + }, + { + {8028335957857989427, 10757251699849982309, 4827184158706600421, 1972803202369040744, 10894855692237667943, 4915699847075993000}, + {2764904044867252832, 3759515232559764976, 16791991319742688688, 15982469402311953688, 4451160053970330710, 10836878114068503963}, + }, + { + {1898218734300846462, 1890052160621754096, 17802491502548108823, 6190373917215274157, 803001649590263174, 3115437408056727221}, + {17784493560265139286, 4722713594994619444, 7211558284311348923, 12566601502228621014, 13213147693274689277, 6593798376447442065}, + }, + { + {14162633535901746112, 13888434174969429930, 3406707891053136625, 14343716935895842484, 624836619325620495, 16396608622030250358}, + {11243183545197281900, 13435578064685298093, 8553550930687221160, 11901710173536269070, 11201351899495201574, 6707939517125993234}, + }, + { + {9276193773801045700, 5450558417706905067, 9450904291105895205, 9833917887246857818, 7285500844025425965, 14754203014686269594}, + {810778446780024575, 2913316233752324212, 5099291060376680008, 5738827727953191083, 9464181523940859483, 5936468513591129863}, + }, + { + {4878961831520826954, 14509215665191898446, 6708977457709037859, 12634291587039233323, 14051107097299387218, 1257131711299495146}, + {2944921399309621693, 930008782908430501, 1144887774944683814, 12070375620973983173, 8562905952672576547, 6655131226711101957}, + }, + { + {2899574573379169897, 1484714325759426788, 13026584324463930570, 7354422735718365143, 15271320868736293087, 16264371063992305811}, + {16407322345111310891, 8408499977463544416, 15290440212843619800, 17056597194115740595, 1666861996182883636, 13197583661824364865}, + }, + { + {6358774672677922630, 821442820597003176, 3813988636387892061, 6549290188660731594, 3924164508423783399, 10897312938877431610}, + {10853174774402828944, 11140723571860242940, 13060695462912345962, 14956978874467708930, 3205778154938349955, 4857627122623530951}, + }, + { + {11135246107897067582, 12930931433283727075, 16046715789896369411, 15407716337362202421, 13785191090068112, 14267330907406142872}, + {9630464474491738918, 15849686165796549334, 6769531647489555179, 14133844287397398953, 14941312803089108859, 2539509877677478606}, + }, + }, + { + { + {4519426578252664019, 12498635300136211504, 6321021405218202857, 726318959046945666, 13882007167200891438, 2395319726326567532}, + {14574068852065085528, 10190204462571587840, 3147469108386280925, 10820985172387594951, 6286320751972150388, 11262911446209261547}, + }, + { + {14681940503030753559, 845444804754325384, 17738750192032703554, 16488507045196756482, 11910847346995920258, 8626355026937911802}, + {18017945832199185475, 11050392025640445707, 10242360224530664755, 1617332161128003926, 14748788017604482554, 10938197837639769317}, + }, + { + {16523024021068053599, 14153734702399414874, 8975814599494295874, 13479798347939192877, 11858323547050135962, 16835135870848796279}, + {18442770255404680133, 6432227429946434052, 14626833122688941937, 15380321854072410541, 8513682513482878540, 17341688292014129030}, + }, + { + {9982750773031032188, 8982169985591678537, 5249265836220267338, 745482432716420646, 15780419841302462097, 15584095070673766359}, + {7735573468252400802, 3795411598689442193, 10306326103347347341, 14546148414040805838, 12297870683806673875, 10180646444691724781}, + }, + { + {12710315976002578004, 18013486904999737909, 15071959480643480686, 11232436041458243738, 11242505152758575624, 8836015187488468465}, + {7163797004587484021, 6976175793895240071, 17645939623644273967, 15778152496214427324, 11329126604565270312, 13110466004937401027}, + }, + { + {7062286409431630812, 2728146973991795543, 9706360251287090173, 17163823676653858159, 10108371106182915478, 15145658691257940197}, + {10397214263743326838, 16577575568682665639, 12639970963217473417, 17440990594269730118, 14950277950848187668, 17431952877316305268}, + }, + { + {6480066766050317343, 3568668077668658088, 13783844110647363350, 3962057444946379264, 10510088723077169182, 7170700020292960967}, + {18344863488775695783, 8824084188613580257, 6513472792662119798, 8283498389636157255, 2472052284746094828, 4520476222306731358}, + }, + { + {4812653469852902630, 7740257893595917350, 933590915187574091, 5367604661371230699, 11524926856934229507, 1547803982974742036}, + {7173249707714144699, 3782455439068354757, 3436775349109564743, 2186512130420632639, 13544740200729805403, 16975429410143506788}, + }, + { + {15877732835883777356, 5756653960126645671, 2937501458743429054, 3189115871611189466, 1436979939858552352, 14064609826654033973}, + {6211184029252028368, 14949803431947181926, 13070266838064658248, 12061247352423941993, 10971542374730440659, 3480209766469344160}, + }, + { + {14525709786341885047, 8039674455841380225, 12237612161305828783, 3099183041004087991, 6867967360204688651, 4823608220141329719}, + {2084876862441787600, 12090014665548950766, 3746144123408878153, 3923168966734460049, 9736629444481310223, 2220438547349139262}, + }, + { + {12036615988734629195, 16475002855996060653, 4484972141187264922, 5765002039288394851, 17063350421202862246, 13141299915467681366}, + {18175008310626520279, 16161757370162131471, 10768451552383046438, 17776643199179949221, 10598298165332627044, 15321920779815178261}, + }, + { + {11362509937560115945, 10576153459965418079, 1262608791982484244, 8810089598173523841, 12316042044260285948, 2268907115684739741}, + {11678522433578723279, 13370587091821540471, 9764685266488488043, 16120963353852178901, 6374843544537806852, 9069656632944802220}, + }, + { + {2566151116175682705, 18419852245029475374, 8482627328365732076, 85390825415125292, 15919801360472688229, 5270660089582520119}, + {9546653662379271343, 15939549011572950268, 14048762686232196880, 16243975286260758268, 11298686963723559385, 16417368127514338489}, + }, + { + {17555499161685523827, 4589562335151500279, 4172801013578954247, 4538649193559819086, 14507716041867679317, 15478474910313981001}, + {6017839036160861908, 4246101108460983771, 13629753094704860997, 5513007954781513788, 3904348220984245516, 9061778934720872085}, + }, + { + {15748938882069408756, 14277135008861981773, 18217921952747007161, 13344713176347262386, 17886228199837380528, 1540401873780123937}, + {3324086529084340824, 16272343370371044813, 742477341260013957, 3350915636385358992, 6792514656381585078, 8878152636708404891}, + }, + }, + { + { + {606092015174216516, 5918356105766628823, 3171854402026042629, 5083410488709721579, 3403581311288428367, 17676510467286289614}, + {2967008223055154986, 4440513410884574177, 16523045544893119274, 3217655037837401371, 13054487720522321142, 10034418456224208190}, + }, + { + {7347573045686808521, 8524339315025279874, 16314398830774990578, 7148576901562720613, 17397796952544351613, 12574968465368627587}, + {17127750532495035623, 7031729130299604572, 8389747942949500517, 6996080963912626814, 13495784988274569257, 1168514218006331799}, + }, + { + {3096433627791070893, 1860156442548924013, 15384249936468274478, 6818491582204214579, 16342638307737468887, 4369943414960054850}, + {17533478036417612037, 15025947594061943030, 18236676236976149572, 7039406316466350694, 15869565193009626370, 3852675700088288543}, + }, + { + {18309824205914080602, 6894088905116897314, 10591623158526430812, 2528539630082230699, 12042495883122935729, 5844044239001656400}, + {17005697103726708846, 7925252746001041067, 10999152033548088863, 9154176622465162277, 15084949920970423534, 5578598380515797128}, + }, + { + {6917179209198910574, 3886697537844862434, 18150496386873591051, 4972646778348909437, 4969661664166180669, 2872836128490559084}, + {2704398887171405709, 13639654495080115785, 11425684371658593338, 232369335821630324, 218748759902514707, 6158205593118649580}, + }, + { + {16496178860935794046, 15119575313167393886, 15571136778187380808, 15718174980588554218, 8407222631419874046, 3994751679816363176}, + {16137943000116730838, 649686844284716838, 8196756005862490544, 6988085908898901263, 8051931904212610802, 996284375053598207}, + }, + { + {11202012828915629624, 16434906580972492259, 5073784107975608951, 4555011077667954368, 15056393774484220435, 7153650342547995309}, + {17034230510077633808, 9529331632480295071, 17805365034946979115, 1306070794871122132, 11283252790245181700, 14195024093610616158}, + }, + { + {17062804313340314021, 12487559988166578822, 15223533012653521266, 4215428489484541930, 16150265079986093045, 5813481978377140106}, + {16065565784667247990, 11555499440070100600, 12227692665725509655, 174038838204068309, 6944904892485822829, 8209387774354117162}, + }, + { + {7097764295443365680, 7845963410214653920, 5797125233317311504, 17926005715153747711, 4229684472586339799, 17705398018071993192}, + {11024978540019744970, 7926106855153668317, 3165689713040846858, 1324462571872837789, 4092065205041218276, 4114073167420719940}, + }, + { + {14832234719124735027, 17720736763724642037, 7569347324614805545, 2422203898133075744, 8407080162538697312, 4638392288322278865}, + {14250957996942719144, 1268388636046597839, 5742106579831765479, 7403762642777718888, 10608168393433486378, 5148201736835738471}, + }, + { + {12017738182708598078, 15496109165938912856, 16276087896775269508, 14348251368567035394, 15495719802443424398, 2886769213483924492}, + {13088574881807814182, 6175259348987407998, 10240343649650858024, 2445547966947917305, 4412093101877027279, 11575806026599033878}, + }, + { + {1978949153914018361, 9333756199061121765, 2483677446328516905, 4947844288118935595, 8796341380385369544, 13376588153739423951}, + {15189671345805877067, 7857386656423263866, 12087267128677715980, 3124246805898824272, 8155860863800786429, 10855265042165217616}, + }, + { + {10968540393441817286, 4229948088947631485, 8845677625419290462, 3176865215857370108, 7460329129753473479, 16979518947567294508}, + {2509227000662036147, 6062006495041137172, 10067170914885555116, 17887270821175830326, 11296565130650766701, 7373311159946922401}, + }, + { + {8850120526955796736, 11314469582193677783, 1068054995241090552, 7318394094178466418, 7619360585150493559, 1453572552029566577}, + {17996868603041808639, 17518159987665308986, 12081491143590269787, 16972562088952683938, 9389093909820463685, 4548563124413215604}, + }, + { + {17046249548250582064, 7914728399210345507, 4240928990714296695, 14486835470503581294, 372290144157579880, 16839406978927405392}, + {1016866348257954267, 15113309936348826018, 6432209476523479319, 10269747907106890252, 941691948152294603, 14287414307327182997}, + }, + }, + { + { + {1272546058761547252, 13578575248362383071, 7500958990496300674, 3099202960982751824, 6362531162831059087, 2019233083206809658}, + {2754115770602762476, 17265393813973046355, 1460109499264827148, 8566701200794847730, 7001275408840316981, 8133565635966870191}, + }, + { + {4530800567522751634, 172100420111867893, 10423105592359647894, 5854403877381514842, 8749270627115121145, 3573817859696661904}, + {10641876612315799701, 13310097519809820175, 2575058335739178127, 1763270043880050, 13175676291469077040, 16171136871688122050}, + }, + { + {18354147526894604667, 13484255054412392853, 2800700506464137914, 11110366580313920102, 5646064147441879882, 2795616433118016579}, + {2129899893763421818, 4807666508003926776, 16472812490021449281, 7681490117554722919, 3438671827454179974, 13557284264475208066}, + }, + { + {5975319400755341093, 1124738826642685970, 16753728698306033686, 16494353205423996145, 18061430851006650946, 12807029835851374145}, + {14925084576890361984, 2612771955533652816, 8242017343741157450, 7403436780273402474, 14211525852367133182, 18439046101355433515}, + }, + { + {12522140250931309228, 2650365165363684707, 17266707117780681001, 17646854366183132476, 8242359948852550575, 4320679156333325465}, + {15229476123325427164, 422299931396282295, 12793864739684453285, 14299923645240128941, 9978405170065329096, 832960934203122298}, + }, + { + {518871060412814841, 15562218878203565824, 8980911201550345823, 11524613147177454714, 8894386144833336880, 8282385053468266803}, + {11036310375799843604, 11631323855952279243, 9204542676358250227, 9017637584223443028, 3369721496038149573, 15595900417339550003}, + }, + { + {4591440636846949512, 6036488867281859201, 16533349215338691556, 3133742230803728901, 2571899330106231363, 1631909183838142939}, + {8989734436763331330, 5978410296483257172, 2006955146568177692, 7522769147634649601, 10220842932346919807, 15597809501020248076}, + }, + { + {13439894621213745503, 9146006640549707854, 5648702331867490349, 11405536749919113563, 12230345710914827865, 10071652654740622079}, + {12555953518900584840, 14800100043573333557, 9904134836732167291, 7181207832363950334, 12514588099534090508, 15307927244603231548}, + }, + { + {13605621509983689364, 10781859117898335879, 13538880269705946725, 8371044748813843478, 3462400909078782886, 890871523695605067}, + {16499951906767373988, 10661436183202627477, 10666398637960730939, 12471664467090838807, 1750972772377056241, 7518131157858325250}, + }, + { + {10247949599901648714, 14190196306159090329, 11216722499720804306, 3590282982469992444, 4633227070625809035, 9190116695797697665}, + {15939242820763354667, 16077413183961690083, 6355653157022204783, 8580010924979501748, 7153725479094108372, 1357680516578643501}, + }, + { + {66627260421700178, 981976094061062611, 14088629719356601159, 18087879346236428983, 2519331146402108878, 14689662575392662258}, + {12195986880010891308, 68431921015150749, 3127083875017010141, 3161714979740429833, 12839293036406001550, 7341433216159877049}, + }, + { + {1065953584516863039, 15096288182389718648, 4172454286491200670, 18026295242507833531, 5078063585310882257, 7268157657978060289}, + {7875776889204835546, 10627478238674063372, 8099037147030128002, 3027823377924903270, 14915487051934001991, 15228458635498084487}, + }, + { + {18435525997497788188, 2784122541135616216, 9899619044143187449, 10187065183348144288, 14659596985883743461, 15442370538955392962}, + {17895314255123528958, 5201907198851189607, 3321003244006213256, 12358309570578006578, 16348924419530434982, 11908899161823776291}, + }, + { + {2996337363285490304, 5920778534715228229, 6118912118872553172, 15730295041050666050, 4957216697404822003, 5536648704019369663}, + {17046266803691791611, 2824215581505967575, 8261255744418562057, 9146405379237138408, 14347950681302095310, 16755353354313831572}, + }, + { + {2023775850404636364, 10364798591267796992, 16581829103891111877, 4554451792573593634, 725404179839321971, 11768827269800328280}, + {3438461944423664753, 5207909560991353292, 4151502141621601136, 9129240992387993021, 10289852383205392490, 4419823091950629536}, + }, + }, + { + { + {12192276596816111129, 11439584366963014783, 2713946508948792470, 12156092371372338197, 5082916671545533837, 9910663863905945351}, + {2895173316336063022, 8340424674337499647, 11728516556339912814, 7593958655663885127, 14349406256224440438, 10167298094102276396}, + }, + { + {9604776696424199962, 3890505023889250408, 17042346157821590641, 9813252657656690957, 3258804089827867072, 9204267042383472101}, + {7747649746653076093, 14320851129876639286, 3963186726043119688, 8387428722722708424, 10944959183156131923, 12376934458606855405}, + }, + { + {6374660930662569399, 12346634963964714147, 9701085914647913938, 10287390907227015944, 13392157278046428293, 12147807827670963406}, + {7192397644093650214, 11565761799483254133, 8650181311221997306, 17210098121268283770, 13830241999240110878, 5113645900809384231}, + }, + { + {15158945955863226945, 8229963785033500122, 807836554855297163, 1605387028888366737, 7953194974476541404, 9367206363171169167}, + {189311819502508835, 8213700212546178990, 6170317059714889580, 2177468661830227636, 15110619070491538357, 5283152492368065731}, + }, + { + {16607045468719296517, 2927802433169566022, 8424681719366218084, 17419326047422606150, 5999905625970770911, 6190744183228192436}, + {12634495609470650905, 7990399520412760153, 351497963881822847, 9308418808757913317, 15411526673945299267, 12287423269457077297}, + }, + { + {13180158784974106865, 9942520119447471544, 5134405864152878608, 4720032172529013059, 15879568571954680415, 12977824023383269741}, + {13377925830416234380, 6393639184729793137, 5830766798694674856, 18039280938728751023, 12060628440735138632, 7991124073272328857}, + }, + { + {2644049280934582490, 10000276111558865661, 304722485028140043, 11735908257972102216, 2166515612050129815, 13377192353750901582}, + {14726585142314469382, 16602322022612937022, 4257344852211444460, 18080317473257477535, 2135517644863233373, 17513835768414110554}, + }, + { + {8724634927100459054, 8808563927836495504, 7987949369395724856, 16530109834509215943, 3846892622369353218, 5202324697033273279}, + {6850156471545519811, 15616657543406258924, 5319309874170900032, 16821994765034133697, 11207249294481864848, 9072369915476840210}, + }, + { + {4789875659742294869, 2967870937886378114, 5039716748733970466, 13024655282622758546, 13532935784717493836, 9347203783138386205}, + {8437277641527033147, 7455819464204777750, 3981495148880689532, 17282508695124259106, 13046846599571196113, 911227421359412761}, + }, + { + {14260224171888129031, 18038330451640326075, 15187295489695980501, 6762914031777041371, 6164418084043959767, 2811459417788208737}, + {17735002493861412727, 14516376847997846647, 9469431640063725785, 13958475411167704800, 14313946757521744683, 820863393193999746}, + }, + { + {4594187992219349224, 10516014328076789329, 9634144629372521799, 12811929681753256189, 1612050195000098012, 10578937287722203100}, + {10753937463348294286, 3603138206444261394, 9977000596369528886, 12918098041632842426, 7822977537561576313, 9364821144993035825}, + }, + { + {18090855139103467087, 5666769360330456887, 11220391310171813836, 5925748024381680440, 4640306010653470273, 18420049688662192498}, + {1059075524163100205, 9669195064815845119, 15313725541560391108, 5852840239013352895, 13002771717222269682, 4779511585836627626}, + }, + { + {241470604732582689, 8576671504524153099, 225652023678227074, 12435872718858072551, 13214352155330021296, 13114666440706969044}, + {16229486748212187548, 17546920563101641584, 2680822621869368005, 9315236640170012245, 14213661658286924384, 16853567802071195844}, + }, + { + {9323859950832044295, 15243140817228794442, 16338128914658363502, 12809819155289324786, 11997169044878679089, 9354840640666247977}, + {8822752410054480907, 1693710795906789185, 3728007655785421863, 5709205642332505842, 12656439228195873274, 12902472130882922605}, + }, + { + {14607278468875625959, 7672085385893969446, 11489053104399436980, 9874730896233758251, 8525538217421482215, 13557027426716988643}, + {11011646714046465719, 5278340269600204139, 1189175061902172835, 15246577042271755274, 5610476507823471218, 643296281309723962}, + }, + }, + { + { + {6162274162111650349, 9370977122090552413, 4694677321413743677, 15950549144746715137, 9635784431169384220, 6961808095841628377}, + {2163304554817059286, 8135281500465815472, 15429903319242318055, 11931312695286905498, 8894858811936530766, 995355997076750921}, + }, + { + {12678890939214435529, 17417003843916143348, 13742839322904008361, 10152726179915321290, 734923888530823747, 1110609374259636082}, + {13691542854487986519, 14664730400527454719, 8718834560598843193, 7133813452251675747, 16781599914305742325, 8788103601345715167}, + }, + { + {17797423961269151165, 15688097913738577129, 7587009064470741374, 9652300434517855281, 10128814085960764645, 13054349291137249827}, + {13667863971566990101, 10673432944181115990, 5827094206620143396, 6099167371319575207, 14812954584184361536, 9860618325640310042}, + }, + { + {589591245000469796, 8979433141915604381, 9021800314668643791, 3750105644114233003, 15670991254808140563, 9806671408565926028}, + {2465691143012527725, 4510267491638521072, 7232653231694705753, 14855984652990117558, 12634578316903510172, 1228039410348310529}, + }, + { + {9068020286559576826, 12618713895631873814, 11722393205397692351, 1086070536693193852, 17324321200170762004, 611028187223175838}, + {11651577700459617322, 11901409630642456359, 2085390425394188987, 490403321567849835, 14654293622476130790, 1298964209197946604}, + }, + { + {11322550018095596102, 3527572794553440421, 6339011792028948225, 5151642471735201045, 2959990528935484190, 9272589623358955444}, + {1016320821529073770, 16888052482282045242, 17688112620024597894, 3719928857894020285, 10396159054756858238, 3233119903385274118}, + }, + { + {15749902098907230753, 17763545669244090771, 9755900373517498480, 4320948179558902844, 10566924725356292516, 6116336473010794202}, + {15545737137436862310, 17240371706149670924, 11955643308605230982, 5932841340555536241, 15279500761826801442, 4179996491012197595}, + }, + { + {1552613943182547753, 10840747323421940067, 17328467336775183521, 6802521766845552195, 8626607143686909840, 540795511127208201}, + {15256703109378673438, 5812944466862532241, 6124501523506740441, 513175402986879460, 17434632082742815254, 16069187481501759225}, + }, + { + {8244487053073823419, 3868641351473260462, 2153712666785000554, 6957836165836180397, 500618765615109373, 1238832243704171799}, + {9603490361093858122, 246830756783484378, 2787086006655910133, 3907320948968255488, 14281263422468298103, 939723834433893649}, + }, + { + {6284765599251061063, 16534676857694838737, 3061690289969396130, 9626162384711348108, 1365881874432943624, 14727198041537453743}, + {8889264123676562961, 9777083175236297205, 13215028356698003407, 6986347484245421817, 11678122634649892302, 2435055587926500790}, + }, + { + {10396608653122814276, 17008484250005639146, 6318409447149262851, 7802099541170520164, 5574615603329953919, 16385780123891961969}, + {11134920568042011673, 12640687912091679512, 1146490453403655245, 3102249330058753539, 4095988337115400384, 17335158718433609549}, + }, + { + {12864499821393802475, 11788119049228790088, 977799416909835541, 15499421488379367188, 163390536177699522, 6804786504683418696}, + {3095872826752058595, 7223570057465222827, 1387121623948247335, 15122489364022134171, 10885423363329551545, 6434450333953245952}, + }, + { + {6653769292986613967, 9168736013794357965, 2104630911670700434, 8244457909216763431, 13703714178493743166, 8218306853052367309}, + {7189028979195471657, 5692750993768367394, 6844269123871604359, 17538650433906843042, 2579405218304322009, 2297663885759252861}, + }, + { + {12692054479125812992, 4320705081611888724, 14008964009638233826, 5334393314224233638, 2696459947028270454, 8328775412419649518}, + {5889525878366957250, 11336536538831724301, 12024875252935715642, 3494686190602179160, 9253138142565030267, 3528435954014636439}, + }, + { + {12648684265556130294, 2074783917548245950, 8308495191421783004, 15790318216073206594, 387051048726917672, 10990928722025444053}, + {15969688555016198304, 13762652978883154272, 12850841387412245400, 4825302074606748639, 2432583894467418376, 9326934178392716656}, + }, + }, + { + { + {18031089708973353209, 2245200960251079511, 480259352579296652, 5296730028561240923, 13672097544022918942, 12074013283516969918}, + {695570325720907777, 12417118176840300328, 11125216762475259777, 7694756262905475485, 6389856663806076935, 2023651462558938155}, + }, + { + {3716913865293623832, 9519939044782302522, 1190311626040433621, 4122386088785812252, 9998628051763276281, 6762269968937642429}, + {9861199249890354064, 1243120329240608977, 12074892082479307233, 11448174216179350137, 16878357486848010894, 14263124486707469927}, + }, + { + {4032144724607143660, 17323710612966320098, 4113668299203613008, 17685219225377287708, 13802533048264874636, 2291580023602316722}, + {5991918412653581128, 9413531453038680232, 12039010584036849554, 12779724028748234268, 9334132880061582927, 854018423284649885}, + }, + { + {4279036817315949205, 10908936013777057682, 5459140224800461056, 5336329855941119274, 13817174543987505002, 5803329503585048266}, + {3098013773573646382, 794466548882446711, 10937734087173941890, 10649767122328016589, 672512432710857443, 4439506334562330966}, + }, + { + {6150189972540442038, 17499024099306121191, 973920649937779980, 10819201450198182582, 14435306386254208142, 15898445937302462823}, + {17016479119212840445, 1987134867235671218, 3749994341137487979, 15521454315121012289, 12198185585065236535, 11161746347726704041}, + }, + { + {4108277248035082323, 4763145889189955538, 4083190563033592079, 13055163363599987027, 5746298306966204683, 895046093136418450}, + {4049236010637090060, 13099192881343834296, 8562023198967118756, 13994928855290033576, 12876191625337022672, 15993047528545202523}, + }, + { + {9330745605186235732, 4222579288142143178, 15252637539981899624, 7567380934463081549, 12741264148440889833, 15828019440897091920}, + {12723327006361657486, 4018078838231227180, 2560766106207278510, 13929068044020554063, 4759749660422617144, 1918410964088436476}, + }, + { + {1401229371513852474, 3725211280317699620, 15262967864528722679, 8998318469575212442, 14884830350906617811, 1500695608507126549}, + {629292347007891015, 4795086203008477332, 14482270326941440934, 17180742059572498031, 14991047340345822048, 7320414524005582285}, + }, + { + {3761423041074020566, 9183947159053999516, 17327960252130032123, 17936746435648093112, 4957874135698491906, 18381419405600408140}, + {2021552462092061162, 18293561973713757720, 807095291604235614, 10694367035762253443, 12210621028072312159, 14157551998029009312}, + }, + { + {8253770234288769934, 1748567047436239326, 15113806840556405352, 9849305728745472726, 9352106351313265444, 12676746928135649012}, + {15910355313240486455, 18316120463051771221, 15406553262270712153, 14120304384949032181, 10235649054584170863, 9663403668634321464}, + }, + { + {17566890036357409279, 8153035355283482148, 13497394635071743235, 9324980713264281675, 1855752933438317130, 17353271655839803714}, + {16210618120406652642, 1994646251130732955, 5626798068584404507, 5598549692563786678, 13865783001414878683, 14643387061407936303}, + }, + { + {6501357512501439891, 12176708815869008686, 11994352389570659317, 16086293893515238232, 6781571500932791296, 7749985836495590529}, + {7267769773480576098, 10519122498445425561, 12426530300337493483, 16904464207183051533, 9655317422890141240, 9006359300493534956}, + }, + { + {2379896081555791674, 7529087855981939465, 17515505484370387645, 11992060160533269066, 9874426908749159085, 9612679919749306188}, + {8727002423244992491, 11651910302226593854, 14317531382092040616, 7148921073820945054, 11509981879876620492, 241425876025527115}, + }, + { + {3957931629992459039, 14626193761179440029, 8968065435170182499, 18306857838363825356, 15388760608247994094, 7556220454574081940}, + {2830354800601290284, 6007093254955226710, 5776847166084925815, 17411399255750975735, 12948871637122999099, 10619688187202777033}, + }, + { + {18019620613881262245, 8668018235864297559, 5360445581416845868, 541567173296101055, 17792105755090691444, 11386151880811930327}, + {14234180784132089596, 11582267640018556498, 13014702559444465145, 3629111073015327967, 14739462952187775393, 10310644470035819364}, + }, + }, + { + { + {17403833916326762122, 9740094979480827357, 14548670989847645635, 15707508983563938391, 17654070414772907819, 7410646283891180823}, + {12088151802847404486, 13751887120986972745, 7133572866312957805, 6984144881486426141, 11478362218013196569, 397100930473218000}, + }, + { + {3572843614659695767, 13917566193783723224, 10106991008395751890, 14776064316406512486, 3973284575540205963, 1393548331195253411}, + {17728418700244338613, 3569943135321046585, 15310934114440659327, 7534966422523126315, 6695235484066733707, 10654160843179249647}, + }, + { + {3916524477947621683, 11443354393618774115, 11759119305556384367, 5213174624675660124, 7949463549546931828, 12092151641941435863}, + {62263562580411942, 12003780754220372116, 17593048334196024065, 1486928429974104945, 2382231722092886579, 2435498065565847060}, + }, + { + {12823154059116108213, 7988070353263431872, 5238951896699939370, 8132043978344570215, 9775088878106588256, 1118856390259997431}, + {18065172735230934036, 16325872707906562424, 13000039721574339202, 4312637592102231069, 4902470028754124204, 4272784360331042739}, + }, + { + {6433126302697049134, 14546898608004289942, 5143458349243895500, 2287546739351655153, 15996486027454642710, 8035174736863426329}, + {18381568106804023303, 503934132851985517, 5955511571426124170, 11588909349656865672, 2539783010592793715, 2517368635804605002}, + }, + { + {9688220347159635445, 3779168584047736134, 3386170765747188013, 10056695776861610791, 4230378171552673912, 13380959223891516403}, + {6821607274732022337, 8369692960524296435, 17556137452703259897, 9913246146396765840, 18385056826905781741, 595789229862790596}, + }, + { + {3376198520685928255, 11401697177155390480, 3837907196036866447, 7783605697094735953, 6911185458281008352, 16661582556490022446}, + {8898449499666876128, 12720029146151254358, 9180900453839682688, 16904557421585200609, 3231736335575648393, 13582984509377915948}, + }, + { + {6335991962752687896, 13799946527490837369, 12932853903574384992, 15301891419692833364, 7117580415677557079, 1638243357400401907}, + {12691541233696549250, 13069535028987414972, 1561175855442316177, 15953947983175737946, 17433282081462277288, 17805588449174971002}, + }, + { + {14830787803333713689, 11568262452331360318, 15414418121287856547, 291893575140657361, 8537715289723658891, 895041535012667546}, + {8735575073330490257, 7904711333758081192, 7705478766063086839, 14966128571780877610, 510498342305674002, 5375842717792934507}, + }, + { + {14017553865950425970, 3203585385790093320, 5960504993013900991, 14499792127339543400, 1042520134310564369, 9007730864681746336}, + {8155955287049316865, 1168268403444813838, 8223462980864298646, 7046058388874344827, 3806799754540117714, 14310126916845550569}, + }, + { + {18101015319769141333, 10981175585883985115, 11076843211911188635, 1865376526114106685, 7691555534771124483, 12825758162850881889}, + {12705759021631065468, 13425295730593551151, 2454066834990145158, 7398456861539482216, 17965437387228755239, 4549246519638273011}, + }, + { + {3564216727206350471, 11502367821276581491, 10888792934596534614, 3218935969765398418, 12592775041500777408, 11647588572015935744}, + {2922640897322707689, 8613211193560218045, 2230968453901036138, 14376635144218060540, 16773708514752577950, 17553690068355938998}, + }, + { + {12898296153065645455, 16720692735856066113, 327172655540413761, 13227218237345565511, 8519416956666328535, 9006180558080542517}, + {1264713729050345984, 9103896317460059276, 10413898570640954633, 3676401446977680326, 2935706012419574846, 9423939538748482172}, + }, + { + {2350781039643192469, 1693506343823609927, 11077706501162430667, 16417164483905858926, 13333764386693653370, 12097153330368571478}, + {10940849199388401790, 10597622934633620124, 4717517384091986088, 2104650762579463668, 9840374844871408095, 3483317510992532499}, + }, + { + {4767861261398259198, 15300499894768898507, 8688456959068450491, 16604170046623753993, 38066602101631568, 8293371963850926780}, + {17963446985501477796, 18444654321008564037, 11760177315245860872, 1435879756649854235, 12050871655191687758, 17344630493039043282}, + }, + }, + { + { + {3096485884016777148, 12376984002139145052, 5480443619638874966, 10095208486451434692, 3492940022953765146, 15299835252568625902}, + {6007593829256808804, 9692621867284256874, 13254638193058937432, 11707277530365540634, 16923342671634580125, 10732664863951753047}, + }, + { + {13872582197972895881, 17193014938795396512, 15971767134700759136, 131681455406226309, 15729877667343662624, 15250608391374424092}, + {6602138623471383700, 7643740135412054049, 17664951607321499035, 14599694205978771523, 8340737952520919285, 10584728957567182276}, + }, + { + {4029925504600209836, 9230486924650579139, 12709630435517017856, 16752856913747515048, 16091176512252055807, 5654615991864890349}, + {16213912518103095615, 17398694063688948608, 6470301373189861265, 12049558432878948403, 15731102283993311220, 1974808235304593120}, + }, + { + {4216082854210318654, 13783625863031842952, 14228148352427104722, 798223135284158372, 17371302655925227458, 3868945640945033607}, + {14496156719528803963, 835017877332649412, 15738356549194558199, 11268806386543436865, 1609600006680937174, 15189642421218057250}, + }, + { + {2100911419510810891, 11709730967811792326, 11070968852465741080, 15167667469791505342, 6990446430502772064, 2979739266982579384}, + {9729924531656485522, 14538459181363709770, 8953107760739874488, 15399265283602391297, 2640851218253403446, 397493120169971392}, + }, + { + {15302726863134446614, 13492823216891695902, 1527459733416593466, 3780183339959616960, 646805679119326182, 3572065085993834296}, + {2086050242579936958, 16097128196674610398, 11110917184928300297, 15215051174675736281, 8638996858467536364, 17498051884481561986}, + }, + { + {7442054194398722761, 5899037616301380264, 3602141627092495462, 12455087214158437405, 3316146807961356474, 1301937084617765443}, + {10089073892535620144, 14190065028184329721, 1808236899842351791, 4533062878686621914, 9993862131126637828, 2297009856133766352}, + }, + { + {16801618217516611581, 12059439895460656350, 8598727314831164546, 9586649536512297470, 10941296402181826520, 18191582771052788270}, + {500755738669776861, 12757213489859603192, 5140871938904556861, 9617812594256568652, 14076395917678039824, 9994140370794675736}, + }, + { + {5850038450443732235, 6375066279442420119, 15818683872880571739, 723472722199022174, 9333015052679795537, 16719493839402031559}, + {10024247267249865137, 5868800923297915890, 8041157937570474814, 7928686841256858707, 3370105934450681139, 17883122805284898817}, + }, + { + {5382144947237128088, 1043006451545558226, 1681467077957939654, 9517495454378300520, 7036177533948513894, 13161967355521737889}, + {12219093509482945494, 7442193295382785217, 277712888488640722, 13947546222291113300, 12611485840092686485, 9710833655025677113}, + }, + { + {12502549552167234190, 8232125533311903390, 839854118279680892, 9485775732822833984, 17663390734822952749, 9394764657882708830}, + {9000572432647298775, 6908017511163909222, 6513180860770299323, 1139498172110369417, 14568474154258358741, 5050171222169492187}, + }, + { + {3993332219625203427, 16865359864205374644, 18194512585980505134, 9613014347311695262, 16860790576951889934, 15221161996871384983}, + {15637827171909035878, 12174768900796615919, 10654832940369855667, 2582700277462133737, 6776356767890276075, 15022166989559684534}, + }, + { + {10674226674222713381, 6640126227278302401, 5685415511245921812, 18111307322717025760, 17086035813631913574, 15847356748945327676}, + {15174476977121907079, 17856987969624827110, 16167616169413150302, 1944283930257068430, 2453038170129818707, 1469204933482392249}, + }, + { + {18275102898719666599, 12983079761412852970, 8388106129782060896, 10209355387576245223, 14538158393256278017, 7560687135426084382}, + {10553905131472339745, 11398173317153206213, 13617408055623208259, 11532011743299529667, 11538247191420015587, 5623160693645531170}, + }, + { + {8940662681574827513, 18164959107927468123, 18046552638532109884, 14155453048592004567, 5584625548584318353, 4723581324777545689}, + {11184722677308218083, 3999406699031629777, 4988145712425592916, 12203913929517294737, 9784288473101397226, 128198380995960707}, + }, + }, + { + { + {3863173275874957588, 7607368433346418538, 3446917342117543093, 3102805528911016504, 5796298790620582886, 4845029410873700374}, + {3364570708230969314, 4211843997911050357, 955735840518088540, 4382952718350579495, 11151776336025623039, 3248067064518007812}, + }, + { + {10979154959051140455, 17057489977844809380, 4636877136932368853, 13173423356700842378, 6427295314745268682, 16166484199425823600}, + {13947498680098198587, 9565058221523432140, 6724059640029046123, 2606510272316346451, 14817173045790080526, 17921662463284944192}, + }, + { + {8834547168849238776, 12415387183251468175, 1535769784386765604, 1355498814697642747, 11825072756645717040, 10331067826681906891}, + {8890584623925299707, 550918406340532812, 7338316217644779781, 17543638401057055929, 4365113997542215090, 2411169740153090294}, + }, + { + {10112129279069371496, 11405549101446425766, 12461696963021780427, 1134289511017689360, 9417819820453596293, 7597522379563535727}, + {2074398209324320962, 961715655667925180, 5962000230359126827, 8547804373478236252, 13432658671807283680, 9718385789307084154}, + }, + { + {16080785183875764467, 4017135721666879597, 8974124072605099690, 6665445735103434589, 14756638402029436542, 4331542523722303717}, + {1702503223444440164, 14189603650236390274, 971810312712682183, 8049986845378060800, 7330150922533173899, 16296166314284869572}, + }, + { + {9526769721404560092, 11775998161420767448, 16356632323651128085, 8008696501724706815, 6341629823262057063, 8523528728189280635}, + {18166074208498206728, 2229400479403638901, 5403004557542136690, 8487804674759640484, 3159160659687043477, 5700251865341103945}, + }, + { + {16822522037639219170, 3266418131057286997, 16472577174486956897, 15819423733871391528, 17594326634646650876, 4931927040440301796}, + {999336285551238701, 3401843156036868997, 11496979962939320412, 15550337525570953734, 15845745790852081340, 3342897350949791243}, + }, + { + {5808162251213383712, 18156856773531164983, 1937517322940695286, 11625411969327328360, 9824825636580723903, 12658592751635829899}, + {10492457110340784150, 15080267389153378243, 2728353556631119200, 14320292562386508753, 13490107143925758180, 6274827431709058227}, + }, + { + {14860895913867154489, 10080650032026459432, 12807414385133112117, 847324989654678215, 13613905648479118356, 12400016944146011293}, + {8776013302541032016, 9925887754260000908, 10894174981766535805, 15297900474855663929, 7442689517452234839, 171834335047382038}, + }, + { + {9117588627465418641, 11168331531349603535, 6924358652074850811, 10618700262994212668, 4103627941911888613, 15694811739383802290}, + {9844066545684783246, 18166608448724723735, 15930623463970128522, 16725459693529035690, 2783599048829322892, 441632469097465516}, + }, + { + {499123733301815599, 16274441320546608446, 8669188578438459973, 14214738178860124031, 12485272536092776327, 6746102886227516887}, + {3968023548712012438, 9154853401879925537, 13974983377028591333, 10516947431089663290, 933442150807932151, 1500788281533481018}, + }, + { + {4586047615512747332, 2505846476262500922, 3826876063100299053, 15762019359435942125, 11799323381173767446, 3568265576213353380}, + {12738065238480311575, 4804303397040398585, 6942032723664133680, 14301007503455957988, 184861059208060790, 2126913780868224063}, + }, + { + {1985910238562893230, 14542760065878644523, 16833470122497892859, 6947656477689970299, 16592512648364063018, 6357361689814456051}, + {13200391207691971905, 2310116023035377028, 5508896705935951006, 10187259410896817897, 3059013399060322780, 5209073312162680293}, + }, + { + {2550642766496181772, 11278535109027313473, 3879516477095166631, 5651059749761693924, 6360530625026542850, 8678055154702639383}, + {9895197927639380575, 10283962157020530930, 15939637088764924497, 8554801996782490495, 7371475446643610469, 3583344374097517208}, + }, + { + {17371412619585132655, 4718601666750293258, 15975408209741840969, 7108377055663708997, 17338928230506045982, 14627100588346057122}, + {13528723931279394499, 12515391311856549312, 14781282577544396450, 7264023353215685261, 3375932768360087636, 13881393850792083407}, + }, + }, + { + { + {1721448973177947457, 17542277325179447353, 17937558459976980552, 11205040461324106686, 51740205411633326, 17489989809778293662}, + {15829483165674242202, 2621026715167601087, 12151982072969161717, 14118259735069082779, 16359059099859035748, 2645875010407964904}, + }, + { + {13044315376543176345, 3791987176391770853, 7257315148468660254, 7615181808332653921, 34885173241256032, 13076418563936506107}, + {2024041865836120065, 343217496537691538, 6758070881563975561, 12527712552092021226, 9130227670558521871, 15869156873791479522}, + }, + { + {16624820076559004073, 3290961180687832086, 1505111348777534793, 15451932960818385994, 4885700112405367154, 502473235663078197}, + {9023344755595914819, 1119495374695090045, 13125353132125365621, 4582328460786968359, 13153243053399805058, 7243196921351431637}, + }, + { + {16660609005075089706, 11456541224374281812, 13813535856291553219, 14877518040804369021, 15861475260704681751, 3089740386917625556}, + {5892458763715639755, 15267181778302530854, 3988849050539397794, 10518710330883699493, 17431760984824214042, 12598607198625858948}, + }, + { + {7886366245642682083, 10962884476823348220, 6709711326774074595, 4572918043062220701, 12755952895112236674, 4061495514143300363}, + {7306556391215449886, 9599795224615892204, 459890930081394149, 13715832153540946078, 14440301411429777271, 16495857007705672763}, + }, + { + {265852797146271341, 11386341344328950606, 2823304281998980676, 3128543525090347743, 9711211560804927151, 11699179803002767366}, + {913811348561539832, 4079387039854771378, 5786553996132212662, 4783085098376699354, 11850032584026193104, 2507234732008509693}, + }, + { + {1681054977850769931, 14671156085086914970, 16232677545813708023, 10037013912612964578, 12655886518994362601, 17930493853619313277}, + {4261930640340402336, 16291971428751843912, 14124714297167598319, 7116061430830749554, 5140259185669271312, 9521500824814628533}, + }, + { + {2133204265371102168, 7738424860559779443, 9132973083464203079, 3624293757540177213, 16855385106148764582, 2981904660819867362}, + {2221031423918751149, 12840489442672309770, 12668245131095936710, 2439831201753391314, 19103421409345804, 5682831538477921588}, + }, + { + {2740210992007145962, 10621702461750253547, 10508827636006320761, 8248704461968714321, 6168928611394207164, 14048196011297482761}, + {11562029679319191839, 10199382699007278950, 3360092486992146320, 1463128897560010163, 6976632107921480266, 2129873557666907110}, + }, + { + {1100325675403567262, 673625074442631877, 8514591637299607269, 2345202943752109744, 7167639158345336267, 17342690971659777406}, + {4862595967217912581, 156590070960043410, 1115171684358334313, 6101500075575877531, 4062560666972498140, 5927929705820198011}, + }, + { + {364176692174332883, 7738711573998977497, 3727117924922648734, 17488404453005608305, 8507877372628529188, 7821485339424482447}, + {3407079555113142839, 2821844621824294453, 7117735201903766861, 2746395978318799182, 16096929564195692367, 443983083263483317}, + }, + { + {9618959095759532752, 5009109919584887941, 13273663751866897132, 10020142088235002186, 8463814795688208512, 5854890718933975039}, + {549447413377699602, 13361664826453471360, 4381643613995465702, 11048937580044016933, 356464625333949552, 10426821157046820998}, + }, + { + {18186037674911124153, 9266904366881705693, 1746212978216662911, 16297025199546965112, 12372897714118201342, 8586503557066603618}, + {10659723169179230020, 8331742669536916843, 17458121139259655844, 3918785045029490546, 10947551116738566182, 9999088208920405141}, + }, + { + {8354650412119672244, 17175305374472306433, 2829972105586097490, 10426050169628830453, 17159563166759848715, 58591768570097984}, + {18406299714417692335, 12546352398212878156, 2495694500244923448, 12073608360379166377, 6610894508561660367, 11682997196017168294}, + }, + { + {3210207744299112648, 13875413666800710915, 11640078075030694173, 10454397255148356013, 17880871075693128223, 7359039635726487892}, + {4853115095464004720, 7976333879782734047, 7694722857965415540, 6036769361724001263, 14076311434771587877, 7283323370969754879}, + }, + }, + { + { + {2614353155557682937, 14058591604861440576, 8309144349698829255, 10106897547146685772, 183429285024450792, 7660674933291714098}, + {17722010084076500734, 2099112471522046187, 3527281458003781480, 14209273751181102104, 17230024122478409574, 10483334506136982748}, + }, + { + {6047132184189720819, 4426654828692160218, 4329633098905519796, 14236543825083707690, 14077477151979085718, 1291177900283865316}, + {12977722282683448473, 17497194838527230928, 5763750732808676924, 9844068727688186332, 650882686296875205, 16353023628194028517}, + }, + { + {3571331741751811067, 18233407145253967397, 2182689380490249825, 9862956875499357585, 4101378667203447553, 2434938326871008100}, + {4975383754309760613, 3934729624717234976, 18322513804399478400, 4995364561535811634, 4754224073033422626, 18130942841051642409}, + }, + { + {13897652105647445247, 15549865991927044469, 17587166399757083359, 645157568514571702, 756205085560500677, 14733833165754071077}, + {913239358738001609, 2071269782500914614, 17073597609159000389, 944355324501816969, 4767516640133819639, 7180502768526971577}, + }, + { + {11871454882320947778, 4076335602405372571, 4747500308730376335, 18397169244778911221, 7987453080975894942, 6950688158372586713}, + {17368720469534992117, 11740301568583332137, 15177273953729130117, 18421847781159349697, 505562344182069757, 3704550989049269178}, + }, + { + {11672240582589566888, 1108540908548515402, 3338717371374145046, 10460877846984614452, 9211584971186313940, 11952076760337213457}, + {7672641505116403277, 13764930264603220483, 3744578737514393421, 15724456999421097869, 13506821640767565708, 13538891648668593334}, + }, + { + {1050281222231361612, 8994982763868301024, 12355411974171252835, 11306931529620801092, 5865750322856587361, 15613850005955819172}, + {14398943333497272142, 15112832726445460775, 9983052759258731406, 16935356055040242837, 14203640081769534446, 9130644307291338833}, + }, + { + {4953908352693126534, 5062976277743240918, 16505639315575105155, 14534500310766348303, 17944736498552318640, 4792459954642443738}, + {18252334781095086320, 13063263503472794652, 13198172387261578292, 1616650596611064703, 15181924039569157445, 5150232158682339336}, + }, + { + {5624679813550782251, 2451770210293674414, 13240746159856752674, 903265396767255440, 11078214582152861563, 7261508578820008638}, + {9752563467317727618, 7386516386070528758, 14793037822648488271, 5090452706673272192, 15308894744012067286, 8130767753744452857}, + }, + { + {6918549675326654825, 8356548187098615599, 18110842889094676823, 3963339850475613373, 6987554242330845710, 2982471659740542895}, + {12669841747723635164, 12626688679931160789, 9018528450701894905, 9726597985776847011, 11318736602457760788, 14025138192598645150}, + }, + { + {17505324765173267460, 7096407019104498095, 15924951709972151945, 16257204011042132345, 4971672139719859625, 2321621670487320814}, + {17594404375116307560, 4647612677109579503, 3901300263702871151, 16326292626815115333, 6831256398102532757, 627750677080250535}, + }, + { + {18076088553817290385, 17349449293663683793, 11642446393364288036, 10122513438385611555, 16537537641493131433, 14156371894700831240}, + {10743408581678488725, 8483948758453680699, 12243160245743380209, 1500764398487579885, 13614004849488464930, 5994785415308094372}, + }, + { + {6122565183919808230, 1008209506550806598, 15249625726527344206, 5096898832984665512, 10958457055229538950, 14428643543814058899}, + {17024506398778167044, 1989641393139458938, 3538068469415906392, 7351031458262333307, 18232141335489091166, 101299571031811981}, + }, + { + {12540548462618170712, 208754347981855850, 5755714353878203428, 13810850252670464562, 2144696743162115760, 15602160948740024567}, + {18186995987441524090, 17284490982574717647, 6768470157308652643, 9315159601737265015, 15486248506383436092, 4135862452814063276}, + }, + { + {7062558030802288283, 4151046583133123194, 17296845417413488570, 2939642080257680057, 10681059010204949305, 5154176607283576645}, + {4961584994822815984, 6524971500046141586, 9968235534650293072, 14236553626523573525, 11581675440714217403, 10779043421926068031}, + }, + }, + { + { + {5704148093399535513, 1982201820910068915, 2015300701102890863, 4938678016782651685, 4225735698935095441, 380627551509963002}, + {12290756922107972790, 14689334170111259003, 17081591129898655804, 12725711463684644427, 14355859294197921899, 4833292303349912353}, + }, + { + {1199430367393420777, 7844876978855113240, 8362429417006246806, 18405301817567609597, 2010437614964189103, 15790163337826190044}, + {13172944002680008407, 7545247538771827356, 8799495964430321755, 1636508240176095806, 3688223623562214043, 5001180399862075810}, + }, + { + {9236682024243624347, 1097419180975135931, 16930071776861614326, 9425037863420681425, 1897777030645415141, 14923573308348753100}, + {9048832771935393542, 16495423457575818894, 14651297528469675829, 14681410364817210043, 6270262408162655998, 3202527036040014714}, + }, + { + {12148128553462546338, 14272886082678845161, 1998189262058231244, 3290638835546848685, 10974691513020291898, 11300741189288469923}, + {12102666221723151731, 15168969616238080084, 7571411875816772674, 6708095321534436923, 13842254475238776074, 11645310689961969980}, + }, + { + {15206355933923800488, 1526822957768928677, 18444342976893277734, 18290836660807940588, 14597401039689350006, 2191517853826363150}, + {6631276040465224272, 9608830307927194622, 13173894809175192722, 3447459865798044953, 7473450899969070648, 17538173612935114726}, + }, + { + {2545753328201935179, 1541411216554356934, 12430899315303981226, 16873953755863768968, 16122659417628515478, 11719197339014743998}, + {15840812009819945279, 5620933673682798071, 11726809338101868835, 10020394952939578101, 6417033277605415646, 1193962146484927818}, + }, + { + {12699385012539356648, 1074729856826138284, 11360834127412011973, 11614291784573969284, 4629063743007127923, 6826004983002907114}, + {5533842397602974776, 5380622214800401295, 8077909061924689270, 9153034190848608609, 6198536077171060590, 10840145921066532009}, + }, + { + {16250603474235152690, 753654051241256788, 2265085864511952533, 7827038858733068367, 4327850715387046187, 11399515242612634708}, + {10497059724291403883, 4688252136426618327, 18024770225850104963, 15437873549837467773, 8363336228498661948, 7727493073571533637}, + }, + { + {12358979317647022406, 2405166324543341567, 1131516171615394739, 5450907798304034460, 6666818116269349649, 5855256214551082397}, + {10663129043987590669, 4887396919880469663, 2298289197437656441, 5676069638451158212, 11906248580355770142, 9562940725527931031}, + }, + { + {14844739915543480162, 13246961953132764518, 15443922107017863339, 17591911221252177558, 14809121152752475646, 14938006221572424065}, + {18293125953571441775, 3365272595752907779, 17552372285854513998, 17235054008682833997, 8690722712832570147, 13050282119073535772}, + }, + { + {15776540266747032014, 14852977882697304855, 12442551787887075800, 16222199462276877546, 1348770173344153190, 18330160582494566789}, + {4685257266073614758, 17629760902250811736, 1099686978395867610, 5720148750089389598, 8752939799218942652, 12653117413452417188}, + }, + { + {1928524914772854786, 8132034417591551586, 7951059682269625334, 2812108933072612507, 1596610641421367938, 3496321797212562056}, + {9864359450003079695, 13827098275898780935, 7851275574239236550, 148489084772098078, 14414610826237061088, 6221005392878728474}, + }, + { + {10231841021413400882, 6416526412762119350, 428961125681723016, 5443671154306564465, 6515481304725718135, 7472109697629360236}, + {4053824519380499109, 9856627631912166862, 8808287978132340097, 3494734447997642012, 13122490218403354627, 1586718502175528539}, + }, + { + {6260407175309061893, 14850337727743664854, 15585408845772003227, 7077264422349275731, 8392418541009408758, 443622451095627013}, + {11824794477049100598, 12322457178558060770, 7174368023614892223, 18169994008863893305, 1353822949072228703, 10638226122523854578}, + }, + { + {4765938320248439052, 8363686885434148155, 11304264598901869535, 14452099896297485497, 14813989444275511579, 11997113422384802221}, + {6448271325447843219, 636006309719920128, 9686816723717740028, 9631232081121088634, 8102244673875044160, 3189426959171768223}, + }, + }, + { + { + {2463818565041698203, 8022820688029070207, 4888356879458026368, 11629790905165524278, 16555714206595898330, 13627886481857856688}, + {16335710071193906987, 6321854959216334024, 13113326664056241925, 11554351464078489040, 794805091959363175, 12545188758454015719}, + }, + { + {156113733862257116, 12812294601068672576, 3563267346091688314, 3001452181277921772, 15607483360571672694, 17299258115284201469}, + {981410215374975479, 10842895849914354733, 4019626280262303535, 3964525883133678208, 11449335357635141837, 7447803780571143247}, + }, + { + {3449274165036362414, 4918853138124055081, 1547983020534099669, 8313761980678241388, 12236549001847065606, 8919544181940646346}, + {7959615711717924349, 1998441664630865730, 15662251542753222396, 878616613737147225, 10921558209848383451, 14643587960617282503}, + }, + { + {10030195466513813736, 7264007409425871486, 13572379319575545436, 5989173427119562900, 9714898089014614002, 16719526588489259967}, + {14134732214629887880, 12965589590960717029, 12056814709100630613, 13827802528787563910, 2927559054475015091, 12475732844535894680}, + }, + { + {14808325747134274433, 8057826914079617564, 5525954727355605916, 5290214223388727378, 1085748056393626543, 12252253028550111114}, + {5922977969674250041, 2448526450681685329, 2926522479362225384, 13034339434060413522, 14285788618705740240, 14224616444852968120}, + }, + { + {14468289541178842512, 12201944999920129159, 12698876919717580942, 6936204399773360929, 8336457280891506998, 14054191262205054108}, + {7985103068695070111, 11634744794544986495, 3492551865016082791, 12866518520735982455, 12992402881058061256, 5203085761453373334}, + }, + { + {2744232347627720169, 13383652591074198984, 11038998560267305871, 13459807200627641401, 4723235801697844775, 6052210961441690931}, + {8015232138170246714, 12079252961549472414, 13192819517464270060, 14584389580251977550, 17833236661373150481, 3761490117360962633}, + }, + { + {10639242284018919836, 15769134811853365977, 2764713995390457156, 2939983068560561484, 7744415034623844491, 9862924824634167441}, + {5812124348561302205, 16914325820321413839, 4446235265737737774, 5136338484784530512, 467458589733891477, 2630304324972701607}, + }, + { + {6832719395023449163, 2033508612951663629, 3511592613860178255, 981472589675863291, 12626082291731102761, 966591436305020179}, + {13733382109710953302, 1434291421752039220, 17971214388752092375, 7561304859414785821, 17294534194238094519, 6834714320288858574}, + }, + { + {2420226340788279821, 12053022832331502898, 15086319486305540754, 14384436305396163060, 7162949585624069622, 2339283057144054658}, + {16555809395586932014, 16575909670975005732, 12006449181862665382, 10896691971361895576, 3873458976101713782, 4179351799128456450}, + }, + { + {4772589731323745937, 17591537228186096278, 7733169684400774683, 7943142157971243776, 2600580496982037708, 12240688438179106242}, + {1682995002150080423, 8105112813163255258, 14679869015350748762, 10615354182892733709, 1101044368915518409, 5335546289827620815}, + }, + { + {2820596099556415173, 2594358308517525622, 3833328115443141899, 1838617013547370473, 10703662474010707679, 6132526521387027976}, + {2504146752328209083, 10365161708998346132, 18378027908391206958, 5944023165464852345, 17106626712229962048, 8325422024401372832}, + }, + { + {11789842430665850017, 6421202279499314143, 11573596254910462066, 4537895385523862063, 4377931158374724860, 12552031527611086863}, + {15504318552571625652, 3707368681645487345, 15001785752614913702, 11705782900778611709, 11949053603484681481, 18195922704834165941}, + }, + { + {15421742936087622130, 10159987354101918308, 5370406297439414101, 18048469588184356347, 15077974257262174351, 4171587624627671421}, + {14084050992809485269, 6539059918771085671, 1374789379818515594, 3838078018577862594, 17679614135822761449, 15474878493731691411}, + }, + { + {12693451959622797980, 13290565128275588854, 7361758586005248557, 16075093967835316398, 7087112768596951545, 11543822053453504948}, + {5902482308820286139, 7353185101342606440, 4571190498315407690, 7730145317036018296, 3643250411451134315, 10481041494035321174}, + }, + }, + { + { + {11379922315523310195, 6620262071143097557, 10733110307157784360, 2455420994718286142, 4941160012966559203, 12036389373766931776}, + {2004451758092625142, 4014199760272071819, 15292911034143935666, 17687179513796035433, 1569516718335592017, 12444236748783362218}, + }, + { + {1200397030012372876, 6457491138111915023, 11531993623745349026, 17899861472742612738, 14124733664835562044, 10645792077218180283}, + {13099261645024141037, 10440696952297433984, 1918236772154249849, 9506923430535157418, 17499444799293611002, 1509670397443280998}, + }, + { + {4465757364835631722, 10965936787556583155, 14540946401148103030, 4584421538084028348, 13594362137297692686, 8844279558284617491}, + {5111359204171112465, 12790060720198863411, 4014742787506192452, 6614930013636115085, 11730197034873324635, 8776100629808369100}, + }, + { + {3790258798970833100, 15996801276739271696, 3464398440425134039, 15326814870706418920, 14448492169636125498, 3231159483392005876}, + {3705423779579747953, 11372348237300277088, 8069222225331107027, 2700528497189769719, 13555552327194442702, 410730686168183967}, + }, + { + {6826832086550914049, 17351671830508265713, 10661972945889099645, 12894337943034505815, 9813078142757356629, 782908000516993322}, + {12769245099971286736, 4882620828121265763, 9488137564983431475, 12539028776281802034, 14846786398874564444, 9073776363026222135}, + }, + { + {11362886301924370650, 6443575479653887522, 351000858570459150, 915347620832419895, 12517886863027987115, 12886465789602176705}, + {13102667374276139057, 6893636638757694468, 4158135635197259073, 17014006099419646155, 2886247550772729453, 14342905125501493077}, + }, + { + {3750785743865695174, 16184496891679274640, 4508484768462328620, 12569830003082072446, 4338678566828661049, 15769546354414324906}, + {3809488443136531987, 3433818606509958865, 2864343169319087118, 3035827594190654155, 4283767959137064887, 1597329211670760111}, + }, + { + {6735976130349257678, 16303412525749538849, 16400428130291037330, 3771855351047356253, 8461011934077951901, 9862709568546362072}, + {6948691434839126085, 15094238067058818238, 11970945255041716883, 8357516122660935053, 11312726144884161679, 13888868066934144152}, + }, + { + {8552971979382238094, 14893844762756755755, 15247853217772454969, 7990879378400788049, 1337495408598927433, 4927592820371154426}, + {11318355400818989979, 14034508604918932131, 850449205422148972, 8707631597140933770, 9005290700503315458, 11206135773816655778}, + }, + { + {11717560420962665146, 16036488489927426530, 1073385780093662141, 5605091585524991500, 11567805488139392367, 6960929895827554242}, + {3185029102977538829, 2880896879639691851, 3758583862703327606, 2607528607094689740, 6140415866307855875, 12833322601936456641}, + }, + { + {2487173712779352607, 4163293746622453413, 15225064953453124837, 4745691426593935280, 15916414889134198240, 1934042257062059048}, + {6574682739913942887, 13440408571236322143, 18076013925783648472, 6693474681185919321, 6987178681680099301, 8824321410010451056}, + }, + { + {663297042995494661, 14801753841371941556, 8727539546491979133, 232708169718659428, 1190547424093432076, 10001731533557757135}, + {10564965587834524294, 10882077754824824235, 18044231443793420173, 16047844267187742404, 15237359807179541598, 12335098732141186268}, + }, + { + {4522044229514984187, 12692311112090809521, 5174544620399081630, 15624956610993361290, 17499804740829372070, 14159780115181988400}, + {6980473429664507297, 16919669078262269987, 2419328464610134620, 7279187746594254030, 12270975978407595756, 12652404087215952443}, + }, + { + {3097250801852684058, 7529383389734329429, 8943150468940937789, 8684872219957364714, 1510282680805138697, 1736664582387906156}, + {8559488977052206069, 5218002957160199868, 16129363866527754916, 3419381639187625321, 7406388656339306496, 733912006552345760}, + }, + { + {5051832488018112348, 2845773093799720531, 4269756063941307164, 11932175332287301151, 15864531947553285757, 6880993309378786007}, + {17221326993540037993, 7339003944245759506, 1709954257215636952, 3058564762936670215, 1381289108584710274, 10818101921467782182}, + }, + }, + { + { + {11909603028098105071, 1433304974993906210, 8596793362628962403, 17840341647275356595, 17335910880809706217, 14496938254816120063}, + {9718444168237729680, 97136308719864699, 385208539784578137, 3982687391919868715, 16704940770194925306, 549720452261507487}, + }, + { + {2694843761758977903, 18124804948268586954, 3810124062407334761, 815390255307793990, 14032033031902943311, 4699208123402406172}, + {12100023268807134280, 12092656330344745210, 13856900984407365162, 10791000625265461807, 10537408988523295901, 1213148431505044944}, + }, + { + {5564129609030186650, 661399315027471445, 6227812982018710887, 12211259814675657270, 12640363533246661095, 4250662369482871640}, + {13995602364293455479, 12559572490607005689, 4555992709769317618, 10656755099067169486, 5466266601354190684, 18303706146826818496}, + }, + { + {15368142834518355591, 387732588739217687, 17906815839192787578, 2458368923948318521, 1213186515140052771, 18119735955342268000}, + {1464255699774805313, 15706302797823747047, 11515240128938376809, 3345743489851301863, 4182988989553146063, 5822101833208111449}, + }, + { + {16987042022725647034, 319232815210787283, 4458381292742179195, 17988503646508966180, 11158143875082860346, 11504863432259964894}, + {1973834314893704871, 17030914264131630067, 4911299812763134293, 5430690367398180217, 2557726880455581905, 12434521041073812213}, + }, + { + {545462916220339990, 3584698686781184519, 5328421879230100723, 366775970831948805, 4024338021516994343, 1533516434617926006}, + {15759296396039088968, 1165424695035321437, 4856582709870659258, 12896943835426779442, 14754955776815298193, 410556923033083573}, + }, + { + {4186087526910663586, 6165136419336713660, 12136818299454961122, 3405693470185967536, 3648773103438697505, 6515981208652058927}, + {3752988438485155801, 16815658448321902855, 2796662867929732032, 5824574038203643621, 9332750850995495618, 14417469253846871647}, + }, + { + {5370314366938532279, 9877969370138171231, 13966511470431609240, 15877758322148217369, 773982613756465354, 2790333076733361805}, + {15260338585394597865, 6297024182872652719, 12048909513493364581, 12444492358042311467, 4022686688297847278, 17410241858326791474}, + }, + { + {3482292231700676468, 8908690623157180028, 16288460904525269506, 5959395600638297217, 360588989624002344, 4420646335976102398}, + {15326491091968545497, 9102573345895719113, 11981331366781021439, 11438298421566869030, 11986315544156148772, 9586987921414184090}, + }, + { + {12658775917959337138, 7321726641436322889, 8904085691599899669, 6181173455344381785, 16990799257112339793, 6589370949402051563}, + {152076730697639797, 6292489939246750855, 2631558763335345129, 2400788177969090289, 3082489011322585694, 5460755211051411481}, + }, + { + {16026468164120587616, 3890624441511373656, 13608676030619425331, 10074131329717815957, 10336173319596529425, 15010101088827254127}, + {16066548767291218138, 346765727064293714, 3034008750782532770, 10634970483280908770, 11696186401772501910, 992070167768548909}, + }, + { + {16700357690267037996, 2280486417700678036, 12292705505251502979, 17433319339816222360, 3180311752818744080, 12556842763675232270}, + {7431081179990995973, 11626745676061745617, 925792030195302151, 7573296302591880847, 7111534405851948348, 7418370979279348359}, + }, + { + {16126038235581718523, 4590472232521394945, 15667737325175661395, 3234185470951996453, 6433453928669282028, 15899702540931522631}, + {4961512606010997533, 7075023696164954837, 1926349877304076748, 15847449820251106944, 12103289522218620655, 11755646081940303532}, + }, + { + {2815793807577222685, 3974873120030374430, 14070231706868366483, 14914212937861260775, 11217571411566683403, 13488284407258074738}, + {2447044301855977709, 1991486381221843561, 10306272153518153979, 13012982641746076783, 7500759912363127296, 9368569895638129462}, + }, + { + {16633917127904484128, 766128895880122918, 12296015683476921956, 12780904198992336027, 1747119835730230715, 11648694124739687510}, + {6931300612490207931, 11673373686239852450, 18176687859595005370, 16590940298368519075, 10350216104129322491, 4313019598947936772}, + }, + }, + { + { + {18436559208253217538, 10052692439679361295, 13914661242043605922, 5303216763167780904, 10320619132458662262, 764916138455538204}, + {9742933872987685981, 10626539639975944361, 8938199719602528282, 3118400879731019025, 17486614403295685962, 8194019942137487488}, + }, + { + {16848715567479381646, 3965484758491433728, 17553116401134175918, 266130778949555493, 15612913147808127901, 2452271039599659592}, + {12112647027603191858, 9836632132933298138, 7150220004740389636, 6080952109208447401, 12794151692277391601, 11339774216918951773}, + }, + { + {15370271492241639789, 13865842581349159076, 14645993961035890521, 8096824553138062253, 17815019169532343171, 12197261930135611113}, + {13843017114364404011, 5010421400581829489, 17814230270064460774, 687861654752340118, 17009006702144007774, 10314843449915140883}, + }, + { + {2744318910620647716, 5603184151316605771, 11257624090959454283, 13185449267405233716, 13751271304022947910, 357227629545275976}, + {6629711137100856610, 2708216448052728946, 13226058796854087226, 1788986271084080906, 9168817775042008469, 11922427675226424552}, + }, + { + {14454843566511544351, 12858454059009483825, 6952579439068010126, 7733931976949613017, 2531905974818570751, 2340234299628817285}, + {4064406969820346920, 11776091497743820272, 8329625521872996607, 17793038299121088064, 8268289814329664881, 6179727598715947755}, + }, + { + {13248035145811273019, 7752115389537037710, 3783507151237115160, 7998022990884122769, 16933952266389620556, 9525578126304597588}, + {17660710021706978693, 7887275263336665238, 1823257268190340929, 16929028893372651088, 5606633925842000055, 17725594627635071001}, + }, + { + {10717942541841401668, 5062492223707666521, 2874099965260778327, 2111658619166071126, 11668640869427564697, 129797271043653095}, + {9692221446048485432, 1712242857382255473, 4838248139231811400, 4970058966083233108, 16360347161442205136, 3339445137046433520}, + }, + { + {11766141551615199913, 8685320933099257575, 12025130600585049936, 11062435310323182587, 10065203967214956664, 17179026247686360724}, + {973705476571001605, 12336450041607754348, 874536885921370264, 3620964755713794319, 3600247557571996978, 3539695373337548386}, + }, + { + {6671466056512719629, 16184392602500878537, 13956944166874842510, 3115630032774258951, 1843095648852176408, 8229461234479287588}, + {9459156799383170558, 575562900712226104, 1461784124210182226, 9743344326188849649, 8264467109834156287, 14855166366987863706}, + }, + { + {14443662408692449290, 7664862287740722890, 17649339370312940977, 2156776012545551339, 15768456150480100232, 14346672920916515716}, + {8113778989714113681, 15635297215600657635, 3026622243462570848, 9983527114455639519, 495493109210132335, 1825135321586189570}, + }, + { + {3948205964039691358, 9147407127214526584, 7561468478346924639, 10897363606469824992, 703934561704031911, 11244219452628483166}, + {9517458047229537628, 17195327556556691064, 15691063270835772767, 9438705527839014294, 9695368154409603795, 3649704513354366568}, + }, + { + {8298214822826346584, 16160788589831391317, 17819994725843440833, 1024306577659159521, 1852010738280183503, 16583513376689890736}, + {3373755007779392878, 15683692594403040997, 13166508057783939533, 11523709082285599828, 5437988652322971796, 18109256413139496795}, + }, + { + {12923777389997376805, 9977718769355025596, 13018161749708349740, 14360291996204235159, 9575337711644144758, 9974219793575670651}, + {10424562739975667006, 3563632038522075692, 3672552713411869989, 13884443527418224724, 6155373509257036382, 3207888628018922232}, + }, + { + {11930174348010923271, 1348949055337526798, 726415247102229584, 5055400198081198789, 11015209320490555612, 9833582750989675305}, + {9700597556714543589, 2992217892752165914, 13783701793319444227, 11374474240057387342, 10199414602968931098, 17127353744132587534}, + }, + { + {9563065141641954290, 14665066342222635705, 9884992491626869089, 5974715562776845322, 573036282426832215, 11499375779477883827}, + {3206285674430939161, 12354004793799927731, 5478655966737394286, 7263281183196607046, 8288729282303345591, 18029234498520921275}, + }, + }, + { + { + {2992157424964359003, 10438615318402196118, 255815347996375468, 4465802505310361450, 1438013292054608859, 2462444921683526793}, + {6885574398590377060, 1301114469257389079, 2687344453450416312, 14090513069242834662, 17764663004285116999, 8889109452874431564}, + }, + { + {3947928161712886286, 6283937438203374232, 1924037281168554481, 16154924465225066172, 1172742291383405274, 4266561696255722724}, + {7000612604942850536, 7659188878730526073, 17637356804126820843, 16975720578569227612, 4896458553166174167, 2686308470754372836}, + }, + { + {9432182594949608034, 7182179915820505304, 7710800442508848674, 13288492478214648407, 12461818323948657464, 5572387091938177662}, + {277315655080978560, 8486149812061624297, 17273407137514060442, 15942854874670749371, 11686164309797544370, 5909985884404360345}, + }, + { + {16367186110059925561, 346226761199691539, 11243569651429838414, 15633495530019237469, 16343973985917329298, 10134611081598971563}, + {15093301170509003037, 1008194724710082237, 3218608412640277159, 7159496834485052730, 10712235151472906025, 4198145441405858657}, + }, + { + {5131609251652718207, 86776758092331267, 11360734888319180911, 3469913385423048534, 18100684383471212679, 325475210458359248}, + {3689757001346201628, 1730954327037278569, 3788507424874318707, 10512008196941777061, 11932764492105480931, 8036637367681551485}, + }, + { + {16591185232690243721, 6455242289394723746, 6695217017042848759, 4941824958829892109, 10112600357660465319, 18308711553066796539}, + {8438656634392593423, 4958573399768303703, 11140056576272524422, 1895853887747460679, 7283324369187624339, 16195252249773926894}, + }, + { + {823375075601828122, 17327350242456001950, 1349893857168950396, 8412958507213802615, 948019923217166776, 7456308766971274642}, + {17370437399496312157, 8520389823586348238, 15411367408205754799, 13174837180834440525, 9274060964565734577, 14571182742247634669}, + }, + { + {1082395577808637743, 8147865335545732038, 1404461702912200930, 4993236329065838796, 17484910947541357459, 6852232223602019945}, + {8965634425630211893, 4255349305144782529, 5448760775922504263, 708413774782466570, 11280134104493101923, 6100170211777061175}, + }, + { + {625515264652475732, 3039989026588849470, 417945613321369841, 17093374707175198551, 13237189962567875668, 2311750606403861433}, + {8005856008273673581, 6479389764331986131, 14555228340786648758, 7247893743936400741, 1374541774474051599, 11227441366009495338}, + }, + { + {4181002734489236543, 470999966911862785, 15476804201865281857, 9087684620614573993, 18304567027803637491, 15731747090499402793}, + {2010012731370719240, 2998664217104214076, 1961508652389190300, 6950362691421142338, 15681741907839112240, 17447712985298987779}, + }, + { + {11768357416958608825, 7645918167071842001, 16228882427244007654, 1745696721312212486, 11721695430734972091, 7273899982161219731}, + {8266026594340198219, 15717218685429720821, 14112476118090358572, 17888013578946462203, 13290175546249368751, 17734414485500127553}, + }, + { + {5326868799317243470, 16458483939729073751, 14887970960607081992, 5039987544340497966, 14821797247198942090, 3950630707728288537}, + {17597412384190391301, 5520789045820740828, 8226360244407437775, 16657311355689665307, 5224094771449505848, 16756747441122548551}, + }, + { + {598869525170933512, 6677154916771020677, 12401580674393252457, 9920987208485925499, 13800670572914405529, 9707555292166940171}, + {3223483868032463832, 3631710847850758369, 11358667894316546298, 3754511562356210854, 1701568866431315786, 5919933616663414779}, + }, + { + {11490856134015076232, 5025125213251421660, 17087480468251353943, 3675626333374651640, 15669324372624095816, 5288578761594490376}, + {13849647572526881715, 390378562422129603, 5286372605531545224, 634678992498468192, 16814060184007219837, 16839035721991946110}, + }, + { + {5403383155926395805, 125221686724158846, 16200173587003585891, 1190332142773424609, 15217396669374393068, 2578745759049575066}, + {13475383798014306998, 6424876294380300114, 14191098580567931628, 5890095616593589345, 2936173359172605332, 17487060099266163274}, + }, + }, + { + { + {12719214741013613290, 5114617959251923035, 10751915446782581763, 2484828566956964312, 14343803650946049216, 14801299356022205455}, + {3016813884715770290, 17891349667893557724, 15777676062783188811, 1712819799097224132, 12168613974393954998, 13986990585905126288}, + }, + { + {8023010081509653349, 5335670617918622683, 1846902627262622829, 11994486113849390341, 6538926236372175318, 4814731736716894207}, + {16304448710578682702, 9349072176363267816, 9186691613158664419, 17103823355609391752, 3916770392270698134, 9012943127536839823}, + }, + { + {5275622406326687551, 6112584237967786501, 265405289314185926, 1412958831727264346, 7651126186628822932, 5834995389479500713}, + {13122792515707256985, 2550947875326289463, 7066444771311187962, 4421293422025492021, 10767771791627962866, 14226728638256751184}, + }, + { + {11448691464520706664, 15675985285202273608, 3655079521218996928, 15936388576359819252, 13208918369662918590, 9516984219307854927}, + {11597611792829772123, 7713221738127008948, 7961786708858212519, 16353817233799898756, 14783345852732475068, 10250761950603958774}, + }, + { + {2625594970679028763, 2169078556432423136, 13021097165593667190, 10791106227007710714, 2690189788129576822, 5484825642511489488}, + {16273557857984121953, 12145090445512587769, 16101739928864380638, 2643908061410998004, 12729107251027632439, 7695556167491532786}, + }, + { + {11157440928684545360, 3046840632242460591, 11426877095892198900, 8918480588279063509, 8787952932779849223, 9027816580501160769}, + {9128814207932650961, 7203341616721124638, 8182325905700299211, 13427506527593902897, 18140725933956453022, 5063665298842103866}, + }, + { + {13658301013561762689, 2849842635737133681, 9794505509330850697, 4574981021203185846, 8209746334820554465, 5056236831081348743}, + {16624206083233762319, 2806783205419280334, 4722899220782250386, 6951333432373876775, 16586996273337609315, 4087561966128175843}, + }, + { + {3878852889783645167, 5400481924475044908, 13648745681887805278, 16385969341835471642, 8474668593315413480, 17072114360268111657}, + {15909524935314055264, 12962656664337915873, 16045825205726727428, 17668445836324789204, 9582515111403822925, 8311229418367164498}, + }, + { + {16750713536855692337, 12158883093332386860, 869753891367085490, 15605303972493341694, 12313210121941258747, 13916691409490803616}, + {11444860648717627512, 2835105424184438282, 10913132759099776850, 1412948777401255586, 769776732776506316, 1165176872145242057}, + }, + { + {3136155720816959363, 176782515877232633, 15898658221137319414, 5945945464575269676, 9144428244947354059, 15406556014273518710}, + {9716246750324542500, 1672303908580126879, 11063634686713475813, 5077145573933036029, 9745467858439955753, 6968865545502175550}, + }, + { + {2495713660630230645, 1185980555358051965, 14406641941666869071, 13418195026575315332, 5357639127530659925, 1493186117020140399}, + {15828121188984359229, 8349485267934650396, 7613912943850760152, 18030871967540857146, 8018837622665199635, 15135626352960024679}, + }, + { + {17168709744073976774, 17815617756406029920, 7562176203824291435, 12623565445431123456, 18154939934834134345, 7536657795057385488}, + {1403539525163296919, 18383425392072061037, 3301314769729806667, 6468401011400515937, 17613786701601511597, 14867910979962040781}, + }, + { + {5676915880842387064, 10055846762720957031, 11806698128040651823, 5264306477430907541, 8384892015115220698, 78358395066300931}, + {1150314427301408206, 5063901896663115767, 638613414256407118, 8689364962315350092, 16590905670553712162, 18128165591184340257}, + }, + { + {7752905958520447175, 14603722115727539325, 9781506285327318406, 13087529078766636510, 14023569057475503528, 6019746498716519160}, + {1031759345651315039, 13964338843948005473, 6689558506286989216, 14220086196735492654, 8688284060108936168, 11830821814034764828}, + }, + { + {13480780456478148129, 17091116390541906595, 5942938816814828424, 476503073112423896, 17958436423709724523, 12898659138199048553}, + {2131038254379659612, 12525642025600402532, 3081067260990044234, 2822022238840761302, 7062264661943515613, 5905091641833394361}, + }, + }, + { + { + {13440622283766006421, 9484751676577363406, 9905947788244365184, 9616606862630155221, 9253691280381130230, 310805699197692105}, + {15857119177216089006, 10322980288919041083, 18373416554700920525, 6657775287925290320, 3666256939083168698, 439429372311506210}, + }, + { + {1597897383029505429, 10525228828887910120, 4933923276776716663, 10152243689983019623, 15301370315971850890, 4214213542732825860}, + {897349283246619198, 5660938796941340389, 3717921090959741165, 5280841632073610594, 17979019565907796206, 11519275321457511404}, + }, + { + {3291527771490538711, 12694342940653469057, 13203683462309390985, 1193899784465090270, 659621542292721066, 1071462121865719293}, + {9590655863442234173, 337930243762610616, 6432199645357122456, 10260314756660590323, 14326008875664555298, 3522995246882448014}, + }, + { + {4644598969538718139, 12193860868892577984, 12250306904140467019, 5407962404963080644, 4485091644169226191, 16089382217006835007}, + {920589308924763406, 7142202226709964624, 11524080200370440713, 8450954286780755403, 4635718750704941162, 1486085287263603581}, + }, + { + {14187921230404535350, 11346105716295753707, 18142765952006405051, 4300086759963317261, 1825347314279603037, 4246997353784727565}, + {10550338330776677777, 11915257613511762166, 465865811699731787, 14525465801670139106, 4190035864475007181, 15697268699718129928}, + }, + { + {16520532307875617691, 6478110846501161864, 12009144890567102539, 6639996996037161221, 10346745057146969014, 545026149668689158}, + {12347224953633676077, 13721884389953920858, 16613557823182647213, 8719051450883594518, 1657296232801227258, 9195723469582730377}, + }, + { + {10672379303837372508, 1178915066578644658, 7318232521602719432, 4586807728983065460, 9645130800550409989, 10469349993209561384}, + {6164577485020507700, 14774782349604625747, 1175325949885081731, 7503981034527378970, 6665905526100319746, 14115807008378187235}, + }, + { + {10537591092984195751, 14902777188358201211, 1609682826674157693, 1415112203205414973, 2121292735488271251, 9730644628099641048}, + {1561907835543757283, 17295199465882003505, 6244864773422006269, 14104758566372328508, 5172569374976915040, 10911149041876998445}, + }, + { + {4142743472397546820, 3389473658987681872, 10678200230732012359, 11202709549973179279, 9306523242271834336, 12282962716364438596}, + {9003120795952620535, 14330038165744890298, 10145599770735328847, 16631175899061725823, 6362275304129962702, 314787489785924267}, + }, + { + {11721097912057176600, 465843171488534090, 3822319191955558577, 15208224590212643113, 11095623855521247100, 6466436977520978591}, + {10032477427078550098, 14389677632018329866, 7463855252587484514, 9538679795516955542, 2432362658144624282, 3283104727441149351}, + }, + { + {12785913170846555661, 16504696481298824206, 18387430512449781784, 11501522553203007302, 17453226662032435648, 72841124322579339}, + {10340092917595603421, 18425536899827803529, 3390279596984649469, 104139025934621284, 14389540744379448736, 13185495434887927728}, + }, + { + {13047319551312062583, 13069113474868968778, 14400534570791996729, 2940176026787857058, 3476131159454733686, 4052732675176402643}, + {3639915650884140037, 3373696894468266675, 5954677702497869028, 12219029297141994717, 14767012055233408577, 4804879819244591749}, + }, + { + {5743319169894187724, 3403171851694334648, 4433580132084214877, 13890862639937427160, 10419362266230633172, 2859349082979398226}, + {8742566305870816529, 13813314196081988405, 13904410987635691727, 16614452833957126689, 13707357634780610178, 1642839273094370920}, + }, + { + {14027248214112167925, 1719835930921678207, 18418332983139545900, 3720933284960441366, 602535342330473807, 561868717519919310}, + {12719483106586196278, 10935152826803494465, 1856788292694114055, 11401362997997198554, 16655766755327767076, 16749664986736295564}, + }, + { + {4746163886620296056, 16195921656868907520, 8331686623103669412, 560576196003183117, 12094183225971951844, 16935771085543970093}, + {9464520802091612215, 10072288040788029476, 13937774116306076245, 4650247287489763753, 7901567587026209939, 5944125224832984247}, + }, + }, + { + { + {9018413310491937545, 7479211580165592007, 4723343534675309263, 13895454120971208439, 13937115985645404601, 11554040025799661497}, + {5480952972697767947, 2914963179369015982, 10162636262303291625, 11296982831055708826, 17035403260442020132, 11311386309034106855}, + }, + { + {10287403934820058638, 140061018296065973, 4609836502448609974, 12833794578281306273, 7013376274017941064, 3171002103636180619}, + {17411865245980625367, 17830137832122912415, 9926615308142487378, 10170594699632265376, 9289903336520035955, 295986264357752633}, + }, + { + {2353717779065485542, 7849736054356737745, 16353139566092721807, 12477191479637934527, 611225681162111976, 2348028862004420825}, + {9785747690717484735, 17418090343401958851, 12038755953887168101, 16958893033340106984, 13647755196440313762, 12405018904475572776}, + }, + { + {5298494778929819598, 3924508621232171971, 8749972845037533540, 1931716910689763937, 11971817937790329025, 8597404460835479112}, + {14699754936537593409, 3124307020702767627, 15973366477384098168, 12480586491719897520, 7671564839409689125, 13926805082785871387}, + }, + { + {15204999194234914607, 8349634193664955592, 6009098602331648241, 6924706367035510132, 11252627761006599356, 18041169172716666620}, + {17789359299204781079, 5727817029324871017, 8859671792757355400, 522069605866675301, 11189207261261388877, 11232767462102509610}, + }, + { + {16139497738710238126, 4157146187414349131, 5487114022641721563, 1063383115530797038, 2906599717299719710, 5276015474524600486}, + {9269825514681515477, 16775312150546041513, 14582957882487299154, 15170954478995084883, 2499812420501884408, 10945713424572036595}, + }, + { + {5089807051541807662, 7157200325468149470, 2937849588731584444, 9354845172055266578, 5631696405995964524, 2214323534299283665}, + {9722628493150662989, 17918792662316048829, 3417043373414897775, 17679083211095336242, 16808346554886232447, 13289844996223351707}, + }, + { + {11269874526592562906, 16500978216603335212, 10118738127249413871, 3659452648579232998, 5141018253691260035, 16117724868471222014}, + {11347815034616287201, 7709514744105498479, 14118984237650181458, 12026134955404838277, 9335436582353087685, 369430838816330654}, + }, + { + {1585139051234805814, 404691396436142113, 11444293817557480245, 5830770104023383537, 12277306276048209251, 10642326551634509497}, + {13792665542662432081, 6208000577113784638, 15717378408394080413, 7820469524198781038, 14389089922028942421, 8582404818280480446}, + }, + { + {70981166460121239, 5563408652468244620, 614683176526977757, 2781152952815547101, 12029155884278293318, 17760250353211832620}, + {3187755494407378069, 17888395113661363276, 13412285944510495080, 11584741820870126887, 15965393589757423852, 18040989847530826793}, + }, + { + {5405473909442890818, 14666994240588619109, 12458304673324386647, 11008174367296119903, 14582036957337795851, 17282661739787817063}, + {14222078674054535548, 11008919174943325660, 11819167351245959209, 18134905895138035484, 13162976610859867356, 7513570547713034700}, + }, + { + {14503898932310678540, 10872534209513960811, 10769539085938900258, 950968100788102293, 2593957957211394429, 9325054429337127538}, + {8794306083750832982, 1021791833181379560, 9826075936615091843, 3550496685357100718, 10181274077023686988, 1708403758287646690}, + }, + { + {2114324794753920008, 9126128083829835556, 16280212870402563277, 13283686190256525376, 3251349600931694719, 14483424206972436627}, + {10572754008401154275, 8633764455629405737, 6588424944597437957, 1571954989152470825, 8516883611989669014, 11640306975729561230}, + }, + { + {4109007533450828692, 2356386509806748446, 9041152461761446992, 16218546554098405589, 14154709222330366952, 9392453621407519648}, + {17770577554690365656, 10932372374411174377, 12600690631485435764, 7948622706571305677, 8660221260057720358, 4747684946643246411}, + }, + { + {8540558873947276350, 3622540825228765451, 16650849354810540513, 11226397583292742086, 4705379347219803579, 12325233166887290731}, + {15619140333232072725, 8608337299420394261, 2163342765639233276, 15744964703433685214, 5280747802181153134, 17233894809548258880}, + }, + }, + { + { + {13115213709675436794, 10299123692547567131, 9429245948262081969, 13047795122467758935, 13812575189117105527, 2948332115489926339}, + {2744672569127744094, 4815622797427999112, 859178603639156086, 11576446289001159839, 9958253466657519480, 16703064241036892748}, + }, + { + {9659930467403989932, 17321718087937017122, 3615409075768522018, 6398728174042229488, 8382474392298007936, 16868018560156882295}, + {15394153985344325633, 18233056749369336201, 2786261003208561400, 14117307321540249886, 9686181390715937042, 8956691786907318249}, + }, + { + {12469663383430832235, 13312156986621640537, 11912360761178303017, 11804219970133303678, 18138791436343161493, 2154714404896772973}, + {8464860256859883443, 14324425897255227015, 11075246616197014103, 11084846688464899884, 14026644252332359919, 6402389694082745611}, + }, + { + {1664247920632234678, 10050469124529404545, 13550912777105883578, 5684389909240961711, 18262622312373628010, 5992040147885225610}, + {3886052343944693110, 7794548519566311969, 5328743476861022198, 3557155954099235264, 3684795529791949842, 17691405542438413688}, + }, + { + {9667044915797468497, 5187341894386544411, 9007932748072503962, 8968805127439822005, 4693907985120651307, 1280923431871955632}, + {6721231714391543602, 12198545097663757759, 4397005010009650381, 1422329781944115833, 125099025124551420, 12942840780107155582}, + }, + { + {9559600762660458657, 2654878193132084429, 6142683421157333426, 8600628541895281085, 2720194395607941256, 11800628992463553487}, + {4425191657353376240, 6088099402960722641, 115029919295524541, 12646988404583673832, 13384863624367861501, 18364682859012250550}, + }, + { + {4532078693830769620, 718394906501818236, 3877201007259789143, 760257150764070663, 16650468445415199734, 14938394407466859533}, + {13647198668172065265, 8150502240122876834, 14693081828320862132, 7303871211541846858, 9083743247615337146, 14627695013907233453}, + }, + { + {15736758467123642408, 9706701086221383807, 2559832927730153795, 7692171838583389170, 10835849209926253466, 2290935724211630501}, + {7110948153091501836, 12491488884744421116, 17194507769433100343, 12871741772449719665, 13293932181017940663, 15615371283128275924}, + }, + { + {10561525560550219871, 8873205184226519024, 7699063686607517061, 13635014797737384505, 14667176363819822811, 3925937510121565786}, + {10228456892890207582, 14846438160606646653, 5315480697106497650, 5122456725957472423, 6204140834106767339, 673047575978292150}, + }, + { + {13827793037997042902, 2372112433190900987, 4942678787760432958, 17946455618542608613, 15396054321262292130, 11511518053778317681}, + {11160017347470886464, 13664803594602056362, 8669936965482088617, 17765994223101087455, 14455539200673473573, 7079780915049059206}, + }, + { + {8033984515178450060, 16378670770570801979, 1548095437408110789, 11401360828210390234, 8750170757194679057, 4561487363432466918}, + {9995552829545286346, 4476962116767664929, 5764765679815373569, 15487395691041270870, 2323841776203994300, 2856618876814473844}, + }, + { + {11531868239432263786, 5277805717080096397, 11682853637330501925, 5733978770749385591, 17364192273085890197, 7500286843970580511}, + {86794299821863973, 4596156132784169023, 4785356555999800565, 10872734824615120105, 3047769721102166199, 10829425068529251522}, + }, + { + {16664987869819734811, 12973908345922045971, 4703076108718901177, 14075270048770461650, 104815219486926864, 892782843371503265}, + {10458459649338308428, 10668999312407153052, 13704561636334771166, 4635417240676718572, 5106553366947462575, 3703456388087747221}, + }, + { + {2751721731474885326, 16084898094744997319, 12429196417254737907, 6088459822127419367, 6900842023460552142, 12211266007254795824}, + {7744071277950462535, 2084549072065931478, 9120649345176753774, 4812104275201077076, 657496594162312754, 3182353075430185403}, + }, + { + {8755422501308001479, 10142307435936727265, 11064770721673029308, 18425843187034865157, 13347285302222173760, 3708437028689637787}, + {14876728210989151093, 7705511398925586068, 14248821016296346136, 17806364092565886021, 5124212170718863197, 16198455889993493512}, + }, + }, + { + { + {11131309769818983841, 14973020341004185634, 8446856854308327009, 89059453523509986, 9172267203688134801, 11760494578717306152}, + {5073673248942080292, 1012148470051943223, 11336947344365930468, 9256490203060408704, 15345366488712852356, 4777703526474964085}, + }, + { + {6785992801663327967, 18012758086365480538, 11715768358595862309, 15278468386670997865, 7557494802091764967, 3226512940013553265}, + {10651059331535692113, 11605693566797492518, 7683257465728908366, 1028223626866438466, 16313431221531990341, 6758261315736790700}, + }, + { + {11449545682029299204, 6596199629139963480, 963551988680601724, 698978766831128675, 17425132333529601498, 13413146748170623416}, + {1714656874981820009, 4296884965902036208, 2990962557113972989, 10577651126385226151, 14576461165238503913, 6650017187571610816}, + }, + { + {6245777462138705770, 602174165006002688, 9651995753732157494, 6180859913470161771, 12820839311740267213, 10236566947582409415}, + {11884174684151318817, 15241119462662846032, 6907037784685500586, 8001533132847243248, 3670287336361099984, 3392433665095714529}, + }, + { + {13912308898779395548, 3788232904773170505, 13510110594291767173, 8520990689262136399, 5635271140287576080, 7032476081565599191}, + {3050147342057890882, 5226316271430966932, 11412499390577871486, 11913706106456146646, 4829447444602840419, 14235552292854028654}, + }, + { + {17312195306081130163, 12680842068822272296, 11528293990644984223, 14726421452780975383, 11447257867816650567, 762807127447733227}, + {11172211697797188525, 8517884001168098535, 18342273006866963779, 17586041278289316668, 4779448404822225420, 9813346493235742371}, + }, + { + {9286929404285814938, 8816346852883562511, 7466996584964541958, 5933279471984750642, 1644469041072153982, 11834454051429614839}, + {11689018037377144292, 9302324005187580531, 5409758949060136366, 4109111569593553253, 16829865226968878273, 6434426298631595957}, + }, + { + {16596404332021807148, 11395037243930999642, 6230660960102828038, 14208272099018002212, 8705581668959309002, 7133705014266607355}, + {14252633600291674542, 17382067068187300207, 18138192466898743511, 6530204006214324897, 18284169711456293177, 4900989821334366705}, + }, + { + {5965502925766151340, 3801830478050084251, 6152884788276000974, 10584299273681935132, 2524731521663531672, 15776417203522871638}, + {6285082299497166915, 15290822150488384424, 5578747051433926469, 5845296506012538407, 4823217512374723890, 7213090796321328136}, + }, + { + {1838054042722947491, 18012783215465657741, 1258715365050436512, 7913577973454740911, 7384511648712781941, 4158912753329944154}, + {14299503727251690236, 8238664371507527991, 5075150254794639881, 11556112057563955850, 9196908777829742547, 1421651284198415569}, + }, + { + {7653294651845234281, 297639109833143896, 4336984993054011825, 16447737956972905656, 1714050270655945931, 15452230596345454363}, + {15076547011376710685, 7524806307535928719, 7795256374139730227, 10089448010239318836, 7023465550055784134, 6968423688937605957}, + }, + { + {13092365251897461865, 18278882827386367428, 14555338542207092484, 6910907828139278038, 4543230946116571027, 5044543664197618202}, + {6650151637454194021, 6834808965400326944, 16365723935359292167, 14827804062568090126, 13707520293209424632, 6325303435642990801}, + }, + { + {343357558658755796, 6940253811840342433, 12914150358606642695, 17231336963809853008, 11079943205463705734, 12473223889867436019}, + {15215091930162368566, 11521732813165590119, 4432843582148093137, 2750024527657999932, 9405241261008362249, 10288224084277755975}, + }, + { + {10358507458667546506, 4836195114970556281, 4009596827146315911, 11256224974885245252, 5176303767964952564, 111134394063583597}, + {6393513946378868409, 17037805604945819779, 10171688558016965768, 7858522891516850377, 1914205856134346186, 16973629294504183772}, + }, + { + {10256813334907479264, 17555541259591449755, 10506400127843286281, 3802242808788493442, 16997535067306771110, 8902379766095587425}, + {1036044043924340639, 17424237503082033211, 12387965860513794582, 2930816639468217614, 10629728210657646483, 15009855708899356359}, + }, + }, + { + { + {4454189113653900584, 2369870743683386936, 9771750146904378734, 7229551204834152191, 9308930686126579243, 5564951339003155731}, + {2523209505731486974, 11655219901025790380, 10064955099576512592, 14322381509056856025, 15960759442596276288, 3132442392059561449}, + }, + { + {14421263046720478865, 10262735078638179312, 3820432306672060577, 15745169881456738128, 11281698473866736902, 15822191634431631555}, + {4821811912616493018, 16782915424867765464, 1577651352486052440, 716633372221422297, 508136038908094084, 16377700646398062786}, + }, + { + {424706049021067379, 14217487990368728988, 7719227939353578736, 4199843265846733886, 16388456301404529776, 15169247696432251820}, + {9090595157644861783, 10581077201944372077, 1379900013445280838, 7494321123029536948, 17787926264007537465, 5067787616258265775}, + }, + { + {769698236917518124, 3483900225503109603, 3336909192235363398, 541374049706836141, 18104741290431601017, 14983166848044339752}, + {6121492399965995954, 16666617093809949054, 10249737155929975505, 1473067211573216915, 16575421339110736253, 5806380672117240601}, + }, + { + {13499925512737386719, 13944763802764915814, 9159954083757191227, 6979221481184822758, 14300821660040225990, 16265637021317828603}, + {3128114568639019553, 2504404013570803046, 9274630379913042841, 5414311569178493969, 16628860202352780141, 5598477736550720675}, + }, + { + {9130425033956973272, 14637917817606979898, 17028834835152328690, 3041045091819937813, 5696889246846210875, 14160128160963955776}, + {4567408060924985859, 8330188839918063054, 10075889358467904432, 10649295639077482245, 6371906135676507546, 14525834287139954362}, + }, + { + {16074395804418777643, 5541188270073279665, 8295310521928755861, 6864072771162821613, 17911901316631945045, 10605026599429014107}, + {690935445353571870, 1392537891789610105, 7325904616956299332, 1149398686564874112, 17689896955892401926, 15639337629880458046}, + }, + { + {2591269655907388346, 11399575915049212026, 2043559396265943823, 2133276679198333751, 2052339475550725155, 6752287291455887793}, + {949413463927904836, 9470431435117911687, 8077017638133728996, 16830570160974576546, 8072941217145343758, 4326954112402321249}, + }, + { + {3412919337711024431, 16383399630678254841, 2740801234954712157, 15867621577894919999, 2797972073741634922, 6677462884297174122}, + {17474301298337562800, 3996912168590289455, 2877907669270439874, 12028178698733277400, 9048903683242829652, 16676938495979746758}, + }, + { + {9535591367797480450, 3032516458384811911, 16858722241492443043, 6099583463893158590, 14048493063580960236, 12185142455189643566}, + {13517307410699214798, 262669939477440604, 6425159725529082877, 9337681168995712285, 4468475772573169834, 7978572861495407848}, + }, + { + {14371139353492294781, 4986055967754386106, 994283350302316111, 124059366184412674, 17931249617405877625, 11248278814950278199}, + {8524946062048541221, 6940016701900868483, 4388778906010249088, 3316636379456104494, 4720367297793042554, 11143646688813775128}, + }, + { + {4447383188862483936, 15286779289485640736, 264847228943597281, 17761832039421017475, 5925682522537768028, 7096337516750811757}, + {18071896252632882904, 9283619734214567194, 10122267390711497388, 4667499764407784879, 227971306242715406, 895727107492327229}, + }, + { + {11203525951412289019, 12852755217270479509, 9978444356559295662, 15803698066139233622, 15160649502708391831, 13050401346945170580}, + {17641607277129335085, 15629899850899448002, 8690304923168739299, 13258223666573053280, 9366850728951877315, 5050696512039385569}, + }, + { + {6369749042849981516, 14997591469096472735, 14585781473609538602, 4957906834847789414, 9248310387962593481, 5103185051386294714}, + {13712135472859015397, 6056087516321847761, 2219295526440778687, 8233797578211440273, 7240984299223714420, 4911601582698376693}, + }, + { + {4929990821929415849, 3130583257788034008, 9497231337826843444, 6435653863924772981, 1134942105434085779, 18114272026645693035}, + {2524774042677381563, 7016780555346498950, 5414403864902656268, 15986697199444096112, 9742407776110139287, 6514675658717406998}, + }, + }, + } +} diff --git a/core/crypto/_weierstrass/tools/ecc_gen_tables.odin b/core/crypto/_weierstrass/tools/ecc_gen_tables.odin index e69927a90..609c19cd0 100644 --- a/core/crypto/_weierstrass/tools/ecc_gen_tables.odin +++ b/core/crypto/_weierstrass/tools/ecc_gen_tables.odin @@ -13,41 +13,62 @@ GENERATED :: `/* */` main :: proc() { - gen_p256r1_tables() + gen_tables("p256r1") + gen_tables("p384r1") } -gen_p256r1_tables :: proc() { - Affine_Point_p256r1 :: struct { - x: secec.Field_Element_p256r1, - y: secec.Field_Element_p256r1, - } - Multiply_Table_p256r1_hi: [32][15]Affine_Point_p256r1 - Multiply_Table_p256r1_lo: [32][15]Affine_Point_p256r1 +gen_tables :: proc($CURVE: string) { + when CURVE == "p256r1" { + Affine_Point_p256r1 :: struct { + x: secec.Field_Element_p256r1, + y: secec.Field_Element_p256r1, + } + + Multiply_Table_hi: [32][15]Affine_Point_p256r1 + Multiply_Table_lo: [32][15]Affine_Point_p256r1 + + SC_LEN :: 32 + + g, p: secec.Point_p256r1 + } else when CURVE == "p384r1" { + Affine_Point_p384r1 :: struct { + x: secec.Field_Element_p384r1, + y: secec.Field_Element_p384r1, + } + Multiply_Table_hi: [48][15]Affine_Point_p384r1 + Multiply_Table_lo: [48][15]Affine_Point_p384r1 + + SC_LEN :: 48 + + g, p: secec.Point_p384r1 + } else { + #panic("weistrass/tools: invalid curve") + } - g, p: secec.Point_p256r1 secec.pt_generator(&g) // Precompute ([1,15] << n) * G multiples of G, MSB->LSB - for i in 0..<32 { - b: [32]byte + for i in 0.. Date: Tue, 3 Feb 2026 18:21:50 +0900 Subject: [PATCH 331/766] core/crypto/ecdh: Add secp384r1 --- core/crypto/ecdh/ecdh.odin | 71 ++++++++++++++++++++ tests/core/crypto/test_core_crypto_ecdh.odin | 13 ++++ 2 files changed, 84 insertions(+) diff --git a/core/crypto/ecdh/ecdh.odin b/core/crypto/ecdh/ecdh.odin index 3e97ebdc7..80ef3f704 100644 --- a/core/crypto/ecdh/ecdh.odin +++ b/core/crypto/ecdh/ecdh.odin @@ -18,6 +18,7 @@ X448_Buf :: [x448.SCALAR_SIZE]byte Curve :: enum { Invalid, SECP256R1, + SECP384R1, X25519, X448, } @@ -26,6 +27,7 @@ Curve :: enum { CURVE_NAMES := [Curve]string { .Invalid = "Invalid", .SECP256R1 = "secp256r1", + .SECP384R1 = "secp384r1", .X25519 = "X25519", .X448 = "X448", } @@ -34,6 +36,7 @@ CURVE_NAMES := [Curve]string { PRIVATE_KEY_SIZES := [Curve]int { .Invalid = 0, .SECP256R1 = secec.SC_SIZE_P256R1, + .SECP384R1 = secec.SC_SIZE_P384R1, .X25519 = x25519.SCALAR_SIZE, .X448 = x448.SCALAR_SIZE, } @@ -42,6 +45,7 @@ PRIVATE_KEY_SIZES := [Curve]int { PUBLIC_KEY_SIZES := [Curve]int { .Invalid = 0, .SECP256R1 = 1 + 2 * secec.FE_SIZE_P256R1, + .SECP384R1 = 1 + 2 * secec.FE_SIZE_P384R1, .X25519 = x25519.POINT_SIZE, .X448 = x448.POINT_SIZE, } @@ -50,6 +54,7 @@ PUBLIC_KEY_SIZES := [Curve]int { SHARED_SECRET_SIZES := [Curve]int { .Invalid = 0, .SECP256R1 = secec.FE_SIZE_P256R1, + .SECP384R1 = secec.FE_SIZE_P384R1, .X25519 = x25519.POINT_SIZE, .X448 = x448.POINT_SIZE, } @@ -58,6 +63,7 @@ SHARED_SECRET_SIZES := [Curve]int { _PRIV_IMPL_IDS := [Curve]typeid { .Invalid = nil, .SECP256R1 = typeid_of(secec.Scalar_p256r1), + .SECP384R1 = typeid_of(secec.Scalar_p384r1), .X25519 = typeid_of(X25519_Buf), .X448 = typeid_of(X448_Buf), } @@ -66,6 +72,7 @@ _PRIV_IMPL_IDS := [Curve]typeid { _PUB_IMPL_IDS := [Curve]typeid { .Invalid = nil, .SECP256R1 = typeid_of(secec.Point_p256r1), + .SECP384R1 = typeid_of(secec.Point_p384r1), .X25519 = typeid_of(X25519_Buf), .X448 = typeid_of(X448_Buf), } @@ -77,6 +84,7 @@ Private_Key :: struct { _curve: Curve, _impl: union { secec.Scalar_p256r1, + secec.Scalar_p384r1, X25519_Buf, X448_Buf, }, @@ -90,6 +98,7 @@ Public_Key :: struct { _curve: Curve, _impl: union { secec.Point_p256r1, + secec.Point_p384r1, X25519_Buf, X448_Buf, }, @@ -124,6 +133,18 @@ private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { break } } + case .SECP384R1: + sc := &priv_key._impl.(secec.Scalar_p384r1) + + b: [48]byte = --- + defer (mem.zero_explicit(&b, size_of(b))) + for { + crypto.rand_bytes(b[:]) + did_reduce := secec.sc_set_bytes(sc, b[:]) + if !did_reduce && secec.sc_is_zero(sc) == 0 { // Likely + break + } + } case .X25519: sc := &priv_key._impl.(X25519_Buf) crypto.rand_bytes(sc[:]) @@ -160,6 +181,17 @@ private_key_set_bytes :: proc(priv_key: ^Private_Key, curve: Curve, b: []byte) - did_reduce := secec.sc_set_bytes(sc, b) is_zero := secec.sc_is_zero(sc) == 1 + // Reject `0` and scalars that are not less than the + // curve order. + if did_reduce || is_zero { + private_key_clear(priv_key) + return false + } + case .SECP384R1: + sc := &priv_key._impl.(secec.Scalar_p384r1) + did_reduce := secec.sc_set_bytes(sc, b) + is_zero := secec.sc_is_zero(sc) == 1 + // Reject `0` and scalars that are not less than the // curve order. if did_reduce || is_zero { @@ -190,6 +222,11 @@ private_key_generate_public :: proc(priv_key: ^Private_Key) { secec.pt_scalar_mul_generator(&pub_key, &sc) secec.pt_rescale(&pub_key, &pub_key) priv_key._pub_key._impl = pub_key + case secec.Scalar_p384r1: + pub_key: secec.Point_p384r1 = --- + secec.pt_scalar_mul_generator(&pub_key, &sc) + secec.pt_rescale(&pub_key, &pub_key) + priv_key._pub_key._impl = pub_key case X25519_Buf: pub_key: X25519_Buf = --- x25519.scalarmult_basepoint(pub_key[:], sc[:]) @@ -214,6 +251,9 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { case .SECP256R1: sc := &priv_key._impl.(secec.Scalar_p256r1) secec.sc_bytes(dst, sc) + case .SECP384R1: + sc := &priv_key._impl.(secec.Scalar_p384r1) + secec.sc_bytes(dst, sc) case .X25519: sc := &priv_key._impl.(X25519_Buf) copy(dst, sc[:]) @@ -236,6 +276,9 @@ private_key_equal :: proc(p, q: ^Private_Key) -> bool { case .SECP256R1: sc_p, sc_q := &p._impl.(secec.Scalar_p256r1), &q._impl.(secec.Scalar_p256r1) return secec.sc_equal(sc_p, sc_q) == 1 + case .SECP384R1: + sc_p, sc_q := &p._impl.(secec.Scalar_p384r1), &q._impl.(secec.Scalar_p384r1) + return secec.sc_equal(sc_p, sc_q) == 1 case .X25519: b_p, b_q := &p._impl.(X25519_Buf), &q._impl.(X25519_Buf) return crypto.compare_constant_time(b_p[:], b_q[:]) == 1 @@ -277,6 +320,16 @@ public_key_set_bytes :: proc(pub_key: ^Public_Key, curve: Curve, b: []byte) -> b if !ok || secec.pt_is_identity(pt) == 1 { return false } + case .SECP384R1: + if b[0] != secec.SEC_PREFIX_UNCOMPRESSED { + return false + } + + pt := &pub_key._impl.(secec.Point_p384r1) + ok := secec.pt_set_sec_bytes(pt, b) + if !ok || secec.pt_is_identity(pt) == 1 { + return false + } case .X25519: pt := &pub_key._impl.(X25519_Buf) copy(pt[:], b) @@ -313,6 +366,14 @@ public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { dst[0] = secec.SEC_PREFIX_UNCOMPRESSED secec.fe_bytes(dst[1:1+secec.FE_SIZE_P256R1], &pt.x) secec.fe_bytes(dst[1+secec.FE_SIZE_P256R1:], &pt.y) + case .SECP384R1: + // Invariant: Unless the caller is manually building pub_key + // `Z = 1`, so we can skip the rescale. + pt := &pub_key._impl.(secec.Point_p384r1) + + dst[0] = secec.SEC_PREFIX_UNCOMPRESSED + secec.fe_bytes(dst[1:1+secec.FE_SIZE_P384R1], &pt.x) + secec.fe_bytes(dst[1+secec.FE_SIZE_P384R1:], &pt.y) case .X25519: pt := &pub_key._impl.(X25519_Buf) copy(dst, pt[:]) @@ -335,6 +396,9 @@ public_key_equal :: proc(p, q: ^Public_Key) -> bool { case .SECP256R1: pt_p, pt_q := &p._impl.(secec.Point_p256r1), &q._impl.(secec.Point_p256r1) return secec.pt_equal(pt_p, pt_q) == 1 + case .SECP384R1: + pt_p, pt_q := &p._impl.(secec.Point_p384r1), &q._impl.(secec.Point_p384r1) + return secec.pt_equal(pt_p, pt_q) == 1 case .X25519: b_p, b_q := &p._impl.(X25519_Buf), &q._impl.(X25519_Buf) return crypto.compare_constant_time(b_p[:], b_q[:]) == 1 @@ -367,6 +431,13 @@ ecdh :: proc(priv_key: ^Private_Key, pub_key: ^Public_Key, dst: []byte) -> bool ss: secec.Point_p256r1 defer secec.pt_clear(&ss) + secec.pt_scalar_mul(&ss, pt, sc) + return secec.pt_bytes(dst, nil, &ss) + case .SECP384R1: + sc, pt := &priv_key._impl.(secec.Scalar_p384r1), &pub_key._impl.(secec.Point_p384r1) + ss: secec.Point_p384r1 + defer secec.pt_clear(&ss) + secec.pt_scalar_mul(&ss, pt, sc) return secec.pt_bytes(dst, nil, &ss) case .X25519: diff --git a/tests/core/crypto/test_core_crypto_ecdh.odin b/tests/core/crypto/test_core_crypto_ecdh.odin index 87c9e8a4d..e34671c84 100644 --- a/tests/core/crypto/test_core_crypto_ecdh.odin +++ b/tests/core/crypto/test_core_crypto_ecdh.odin @@ -52,6 +52,19 @@ test_ecdh :: proc(t: ^testing.T) { "04809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7aeb29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3", "057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67", }, + // secp384r1 Test vectors (subset) from NIST CAVP + { + .SECP384R1, + "3cc3122a68f0d95027ad38c067916ba0eb8c38894d22e1b15618b6818a661774ad463b205da88cf699ab4d43c9cf98a1", + "04a7c76b970c3b5fe8b05d2838ae04ab47697b9eaf52e764592efda27fe7513272734466b400091adbf2d68c58e0c50066ac68f19f2e1cb879aed43a9969b91a0839c4c38a49749b661efedf243451915ed0905a32b060992b468c64766fc8437a", + "5f9d29dc5e31a163060356213669c8ce132e22f57c9a04f40ba7fcead493b457e5621e766c40a2e3d4d6a04b25e533f1", + }, + { + .SECP384R1, + "92860c21bde06165f8e900c687f8ef0a05d14f290b3f07d8b3a8cc6404366e5d5119cd6d03fb12dc58e89f13df9cd783", + "0430f43fcf2b6b00de53f624f1543090681839717d53c7c955d1d69efaf0349b7363acb447240101cbb3af6641ce4b88e025e46c0c54f0162a77efcc27b6ea792002ae2ba82714299c860857a68153ab62e525ec0530d81b5aa15897981e858757", + "a23742a2c267d7425fda94b93f93bbcc24791ac51cd8fd501a238d40812f4cbfc59aac9520d758cf789c76300c69d2ff", + }, } for v, _ in test_vectors { From e6a62c4bb0df7e3d0d3b964237fe111073a748ea Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 3 Feb 2026 12:19:20 +0000 Subject: [PATCH 332/766] Minor optimization to `map_probe_distance` --- base/runtime/dynamic_map_internal.odin | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/base/runtime/dynamic_map_internal.odin b/base/runtime/dynamic_map_internal.odin index 298b586f5..73a152845 100644 --- a/base/runtime/dynamic_map_internal.odin +++ b/base/runtime/dynamic_map_internal.odin @@ -283,7 +283,9 @@ map_desired_position :: #force_inline proc "contextless" (m: Raw_Map, hash: Map_ map_probe_distance :: #force_inline proc "contextless" (m: Raw_Map, hash: Map_Hash, slot: uintptr) -> uintptr { // We do not use map_cap since we know the capacity will not be zero here. capacity := uintptr(1) << map_log2_cap(m) - return (slot + capacity - map_desired_position(m, hash)) & (capacity - 1) + + // return (slot + capacity - map_desired_position(m, hash)) & (capacity - 1) + return (slot - uintptr(hash)) & (capacity - 1) // NOTE(bill): this is equivalent to the above, but less operations } // When working with the type-erased structure at runtime we need information From 37e82c9387e87ec4d74762e5ed1a88bc75b9db16 Mon Sep 17 00:00:00 2001 From: Nahuel2998 Date: Tue, 3 Feb 2026 17:17:33 -0300 Subject: [PATCH 333/766] vendor/x11/xlib: Fix returntype of some procs Returntype of a few procs was incorrectly set to i32 rather than a proc that returns i32. --- vendor/x11/xlib/xlib_procs.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 3886bbead..70cd327fd 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -1112,15 +1112,15 @@ foreign xlib { SetAfterFunction :: proc( display: ^Display, procedure: #type proc "c" (display: ^Display) -> i32, - ) -> i32 --- + ) -> proc "c" (display: ^Display) -> i32 --- Synchronize :: proc( display: ^Display, onoff: b32, - ) -> i32 --- + ) -> proc "c" (display: ^Display) -> i32 --- // Error handling SetErrorHandler :: proc( handler: #type proc "c" (display: ^Display, event: ^XErrorEvent) -> i32, - ) -> i32 --- + ) -> proc "c" (display: ^Display, event: ^XErrorEvent) -> i32 --- GetErrorText :: proc( display: ^Display, code: i32, @@ -1138,7 +1138,7 @@ foreign xlib { DisplayName :: proc(string: cstring) -> cstring --- SetIOErrorHandler :: proc( handler: #type proc "c" (display: ^Display) -> i32, - ) -> i32 --- + ) -> proc "c" (display: ^Display) -> i32 --- // Pointer grabbing GrabPointer :: proc( display: ^Display, From 43ad4a1d9f18a89822e1b9f554adef1a228136db Mon Sep 17 00:00:00 2001 From: Jesse Meyer Date: Sun, 1 Feb 2026 09:04:53 -0500 Subject: [PATCH 334/766] Add ThinLTO support via -lto:thin and -lto:thin-files flags - Add -lto:thin and -lto:thin-files CLI flags with validation - Emit LLVM bitcode (.bc) instead of object files when LTO is enabled - Pass -flto=thin and -flto-jobs to clang/lld linkers - Guard linkage corrections to skip declarations without definitions (required for LTO where declarations appear across modules) - Allow module-per-file with LTO even at higher optimization levels Co-Authored-By: Claude Opus 4.5 --- src/build_settings.cpp | 30 ++++++++++++++++++++++++++++++ src/linker.cpp | 16 +++++++++++++++- src/llvm_backend.cpp | 23 ++++++++++++++++++----- src/llvm_backend_general.cpp | 2 +- src/main.cpp | 14 ++++++++++++++ 5 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 6b8fefa59..e0017baea 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -420,6 +420,12 @@ struct BuildCacheData { }; +enum LTOKind : i32 { + LTO_None, + LTO_Thin, + LTO_Thin_Files, +}; + enum LinkerChoice : i32 { Linker_Invalid = -1, Linker_Default = 0, @@ -560,6 +566,7 @@ struct BuildContext { bool use_single_module; bool use_separate_modules; + LTOKind lto_kind; bool module_per_file; bool cached; BuildCacheData build_cache_data; @@ -2030,6 +2037,29 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta bc->use_separate_modules = false; } + if (bc->lto_kind == LTO_Thin || bc->lto_kind == LTO_Thin_Files) { +#if LLVM_VERSION_MAJOR < 17 + gb_printf_err("-lto:thin requires LLVM 17 or later\n"); + gb_exit(1); +#endif + if (bc->build_mode == BuildMode_Assembly || bc->build_mode == BuildMode_LLVM_IR) { + gb_printf_err("-lto:thin is incompatible with -build-mode:asm and -build-mode:llvm-ir\n"); + gb_exit(1); + } +#if defined(GB_SYSTEM_WINDOWS) + if (bc->linker_choice != Linker_lld) { + gb_printf_err("-lto:thin on Windows requires -linker:lld\n"); + gb_exit(1); + } +#endif + if (bc->use_single_module) { + gb_printf_err("Warning: -lto:thin overrides -use-single-module; separate modules will be used\n"); + } + bc->use_separate_modules = true; + if (bc->lto_kind == LTO_Thin_Files) { + bc->module_per_file = true; + } + } bc->ODIN_VALGRIND_SUPPORT = false; if (build_context.metrics.os != TargetOs_windows) { diff --git a/src/linker.cpp b/src/linker.cpp index bc6268049..f369a5a38 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -328,6 +328,12 @@ try_cross_linking:; String windows_sdk_bin_path = path_to_string(heap_allocator(), build_context.build_paths[BuildPath_Win_SDK_Bin_Path]); defer (gb_free(heap_allocator(), windows_sdk_bin_path.text)); + gbString lld_lto_flags = gb_string_make(heap_allocator(), ""); + defer (gb_string_free(lld_lto_flags)); + if (build_context.lto_kind != LTO_None) { + lld_lto_flags = gb_string_append_fmt(lld_lto_flags, "/lldltojobs:%d ", build_context.thread_count); + } + switch (build_context.linker_choice) { case Linker_lld: result = system_exec_command_line_app("msvc-lld-link", @@ -336,13 +342,15 @@ try_cross_linking:; "%.*s " "%.*s " "%s " + "%s " "", LIT(build_context.ODIN_ROOT), object_files, LIT(output_filename), link_settings, LIT(windows_subsystem_names[build_context.ODIN_WINDOWS_SUBSYSTEM]), LIT(build_context.link_flags), LIT(build_context.extra_linker_flags), - lib_str + lib_str, + lld_lto_flags ); if (result) { @@ -966,6 +974,12 @@ try_cross_linking:; link_command_line = gb_string_appendc(link_command_line, clang_path); } link_command_line = gb_string_appendc(link_command_line, " -Wno-unused-command-line-argument "); + + if (build_context.lto_kind != LTO_None) { + link_command_line = gb_string_appendc(link_command_line, " -flto=thin"); + link_command_line = gb_string_append_fmt(link_command_line, " -flto-jobs=%d ", build_context.thread_count); + } + link_command_line = gb_string_appendc(link_command_line, object_files); link_command_line = gb_string_append_fmt(link_command_line, " -o \"%.*s\" ", LIT(output_filename)); link_command_line = gb_string_append_fmt(link_command_line, " %s ", platform_lib_str); diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index c15f326f8..43f6f8f03 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -171,7 +171,7 @@ gb_internal void lb_correct_entity_linkage(lbGenerator *gen) { LLVMValueRef other_global = nullptr; if (ec.e->kind == Entity_Variable) { other_global = LLVMGetNamedGlobal(ec.other_module->mod, ec.cname); - if (other_global) { + if (other_global && (LLVMGetInitializer(other_global) != nullptr || LLVMIsExternallyInitialized(other_global))) { LLVM_SET_INTERNAL_WEAK_LINKAGE(other_global); if (!ec.e->Variable.is_export && !ec.e->Variable.is_foreign) { LLVMSetVisibility(other_global, LLVMHiddenVisibility); @@ -179,7 +179,7 @@ gb_internal void lb_correct_entity_linkage(lbGenerator *gen) { } } else if (ec.e->kind == Entity_Procedure) { other_global = LLVMGetNamedFunction(ec.other_module->mod, ec.cname); - if (other_global) { + if (other_global && LLVMCountBasicBlocks(other_global) != 0) { LLVM_SET_INTERNAL_WEAK_LINKAGE(other_global); if (!ec.e->Procedure.is_export && !ec.e->Procedure.is_foreign) { LLVMSetVisibility(other_global, LLVMHiddenVisibility); @@ -2332,7 +2332,12 @@ gb_internal WORKER_TASK_PROC(lb_llvm_emit_worker_proc) { auto wd = cast(lbLLVMEmitWorker *)data; - if (LLVMTargetMachineEmitToFile(wd->target_machine, wd->m->mod, cast(char *)wd->filepath_obj.text, wd->code_gen_file_type, &llvm_error)) { + if (build_context.lto_kind != LTO_None) { + if (LLVMWriteBitcodeToFile(wd->m->mod, cast(char *)wd->filepath_obj.text)) { + gb_printf_err("Failed to write bitcode file: %.*s\n", LIT(wd->filepath_obj)); + exit_with_errors(); + } + } else if (LLVMTargetMachineEmitToFile(wd->target_machine, wd->m->mod, cast(char *)wd->filepath_obj.text, wd->code_gen_file_type, &llvm_error)) { gb_printf_err("LLVM Error: %s\n", llvm_error); exit_with_errors(); } @@ -2701,7 +2706,9 @@ gb_internal String lb_filepath_obj_for_module(lbModule *m) { String ext = {}; - if (build_context.build_mode == BuildMode_Assembly) { + if (build_context.lto_kind != LTO_None) { + ext = STR_LIT("bc"); + } else if (build_context.build_mode == BuildMode_Assembly) { ext = STR_LIT("S"); } else if (build_context.build_mode == BuildMode_Object) { // Allow a user override for the object extension. @@ -2776,7 +2783,13 @@ gb_internal bool lb_llvm_object_generation(lbGenerator *gen, bool do_threading) TIME_SECTION_WITH_LEN(section_name, gb_string_length(section_name)); - if (LLVMTargetMachineEmitToFile(m->target_machine, m->mod, cast(char *)filepath_obj.text, code_gen_file_type, &llvm_error)) { + if (build_context.lto_kind != LTO_None) { + if (LLVMWriteBitcodeToFile(m->mod, cast(char *)filepath_obj.text)) { + gb_printf_err("Failed to write bitcode file: %.*s\n", LIT(filepath_obj)); + exit_with_errors(); + return false; + } + } else if (LLVMTargetMachineEmitToFile(m->target_machine, m->mod, cast(char *)filepath_obj.text, code_gen_file_type, &llvm_error)) { gb_printf_err("LLVM Error: %s\n", llvm_error); exit_with_errors(); return false; diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index c0e57143d..572e3990c 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -163,7 +163,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { map_init(&gen->modules_through_ctx, gen->info->packages.count*2); if (USE_SEPARATE_MODULES) { - bool module_per_file = build_context.module_per_file && build_context.optimization_level <= 0; + bool module_per_file = build_context.module_per_file && (build_context.optimization_level <= 0 || build_context.lto_kind != LTO_None); for (auto const &entry : gen->info->packages) { AstPackage *pkg = entry.value; auto m = gb_alloc_item(permanent_allocator(), lbModule); diff --git a/src/main.cpp b/src/main.cpp index 624869e65..feaf55f4b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -413,6 +413,7 @@ enum BuildFlagKind { BuildFlag_Tilde, BuildFlag_Sanitize, + BuildFlag_LTO, #if defined(GB_SYSTEM_WINDOWS) BuildFlag_IgnoreVsSearch, @@ -643,6 +644,7 @@ gb_internal bool parse_build_flags(Array args) { #endif add_flag(&build_flags, BuildFlag_Sanitize, str_lit("sanitize"), BuildFlagParam_String, Command__does_build, true); + add_flag(&build_flags, BuildFlag_LTO, str_lit("lto"), BuildFlagParam_String, Command__does_build); #if defined(GB_SYSTEM_WINDOWS) @@ -1636,6 +1638,18 @@ gb_internal bool parse_build_flags(Array args) { } break; + case BuildFlag_LTO: + GB_ASSERT(value.kind == ExactValue_String); + if (str_eq_ignore_case(value.value_string, str_lit("thin"))) { + build_context.lto_kind = LTO_Thin; + } else if (str_eq_ignore_case(value.value_string, str_lit("thin-files"))) { + build_context.lto_kind = LTO_Thin_Files; + } else { + gb_printf_err("-lto: options are 'thin' and 'thin-files'\n"); + bad_flags = true; + } + break; + #if defined(GB_SYSTEM_WINDOWS) case BuildFlag_IgnoreVsSearch: { From 9eba12948a8e0c1b41cb5a63a4c781025ee61def Mon Sep 17 00:00:00 2001 From: Jesse Meyer Date: Mon, 2 Feb 2026 13:34:36 -0500 Subject: [PATCH 335/766] Skip sanitizer IR passes when LTO is enabled With ThinLTO, the linker runs sanitizer passes at link time via -fsanitize= flags, where it has whole-program visibility. Running them at bitcode emission too double-instruments every module, producing hundreds of "Redundant instrumentation detected" warnings. Per-function sanitize/no_sanitize attributes are preserved in the bitcode and respected by the linker's pass. Co-Authored-By: Claude Opus 4.5 --- src/llvm_backend.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 43f6f8f03..931813f42 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2454,14 +2454,21 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) { // tsan - Linux, Darwin // ubsan - Linux, Darwin, Windows (NOT SUPPORTED WITH LLVM C-API) - if (build_context.sanitizer_flags & SanitizerFlag_Address) { - array_add(&passes, "asan"); - } - if (build_context.sanitizer_flags & SanitizerFlag_Memory) { - array_add(&passes, "msan"); - } - if (build_context.sanitizer_flags & SanitizerFlag_Thread) { - array_add(&passes, "tsan"); + // With LTO, sanitizer passes run at link time (via -fsanitize= linker flags) + // where the linker has whole-program visibility. Running them here too would + // double-instrument every module, producing "Redundant instrumentation" warnings. + // Per-function sanitize attributes in the bitcode are preserved and respected + // by the linker's sanitizer pass. + if (build_context.lto_kind == LTO_None) { + if (build_context.sanitizer_flags & SanitizerFlag_Address) { + array_add(&passes, "asan"); + } + if (build_context.sanitizer_flags & SanitizerFlag_Memory) { + array_add(&passes, "msan"); + } + if (build_context.sanitizer_flags & SanitizerFlag_Thread) { + array_add(&passes, "tsan"); + } } if (passes.count == 0) { From a0562dfd6e5cd47217f6cdf5cee2c767a7ba8318 Mon Sep 17 00:00:00 2001 From: Jesse Meyer Date: Mon, 2 Feb 2026 15:23:06 -0500 Subject: [PATCH 336/766] Fix lld-link LTO jobs flag syntax on Windows lld-link doesn't recognize /lldltojobs:N as a standalone flag and treats it as a file path. Use /opt:lldltojobs=N instead. Co-Authored-By: Claude Opus 4.5 --- src/linker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linker.cpp b/src/linker.cpp index f369a5a38..7969d776e 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -331,7 +331,7 @@ try_cross_linking:; gbString lld_lto_flags = gb_string_make(heap_allocator(), ""); defer (gb_string_free(lld_lto_flags)); if (build_context.lto_kind != LTO_None) { - lld_lto_flags = gb_string_append_fmt(lld_lto_flags, "/lldltojobs:%d ", build_context.thread_count); + lld_lto_flags = gb_string_append_fmt(lld_lto_flags, "/opt:lldltojobs=%d ", build_context.thread_count); } switch (build_context.linker_choice) { From bd6148dd6b77920cf64fea8804b205e8257e8a66 Mon Sep 17 00:00:00 2001 From: Jesse Meyer Date: Tue, 3 Feb 2026 20:16:44 -0500 Subject: [PATCH 337/766] Fix Windows LTO: preserve required procedures with llvm.used On Windows with LTO, required procedures with external linkage need to be added to @llvm.used to survive linker-level dead code elimination. LLVM may generate implicit calls to runtime builtins (e.g., __extendhfsf2 for f16 conversions) during instruction lowering, after the IR is finalized. Without @llvm.used, the linker discards these procedures before the implicit calls are generated. This adds required procedures to @llvm.used at creation time. The fix is Windows-specific; other platforms handle this correctly. Co-Authored-By: Claude Opus 4.5 --- src/llvm_backend_opt.cpp | 29 ++++++++++++++++++++--------- src/llvm_backend_proc.cpp | 13 +++++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp index 4131f32bf..cb7fe1c75 100644 --- a/src/llvm_backend_opt.cpp +++ b/src/llvm_backend_opt.cpp @@ -512,8 +512,9 @@ gb_internal void llvm_delete_function(LLVMValueRef func) { LLVMDeleteFunction(func); } -gb_internal void lb_append_to_compiler_used(lbModule *m, LLVMValueRef value) { - LLVMValueRef global = LLVMGetNamedGlobal(m->mod, "llvm.compiler.used"); +// Helper to append a value to an llvm metadata array global (llvm.used or llvm.compiler.used) +gb_internal void lb_append_to_llvm_used_list(lbModule *m, LLVMValueRef value, char const *list_name) { + LLVMValueRef global = LLVMGetNamedGlobal(m->mod, list_name); LLVMValueRef *constants; int operands = 1; @@ -543,33 +544,43 @@ gb_internal void lb_append_to_compiler_used(lbModule *m, LLVMValueRef value) { constants[operands - 1] = LLVMConstBitCast(value, Int8PtrTy); LLVMValueRef initializer = LLVMConstArray(Int8PtrTy, constants, operands); - global = LLVMAddGlobal(m->mod, ATy, "llvm.compiler.used"); + global = LLVMAddGlobal(m->mod, ATy, list_name); LLVMSetLinkage(global, LLVMAppendingLinkage); LLVMSetSection(global, "llvm.metadata"); LLVMSetInitializer(global, initializer); } +gb_internal void lb_append_to_compiler_used(lbModule *m, LLVMValueRef value) { + lb_append_to_llvm_used_list(m, value, "llvm.compiler.used"); +} + +// llvm.used survives LTO linker optimizations (unlike llvm.compiler.used) +gb_internal void lb_append_to_used(lbModule *m, LLVMValueRef value) { + lb_append_to_llvm_used_list(m, value, "llvm.used"); +} + gb_internal void lb_run_remove_unused_function_pass(lbModule *m) { isize removal_count = 0; isize pass_count = 0; isize const max_pass_count = 10; - // Custom remove dead function pass + + // Custom remove dead function pass (for internal linkage functions) for (; pass_count < max_pass_count; pass_count++) { - bool was_dead = false; + bool was_dead = false; for (LLVMValueRef func = LLVMGetFirstFunction(m->mod); func != nullptr; /**/ ) { LLVMValueRef curr_func = func; func = LLVMGetNextFunction(func); - + LLVMUseRef first_use = LLVMGetFirstUse(curr_func); if (first_use != nullptr) { continue; } String name = {}; name.text = cast(u8 *)LLVMGetValueName2(curr_func, cast(size_t *)&name.len); - + if (LLVMIsDeclaration(curr_func)) { // Ignore for the time being continue; @@ -578,7 +589,7 @@ gb_internal void lb_run_remove_unused_function_pass(lbModule *m) { if (linkage != LLVMInternalLinkage) { continue; } - + Entity **found = map_get(&m->procedure_values, curr_func); if (found && *found) { Entity *e = *found; @@ -588,7 +599,7 @@ gb_internal void lb_run_remove_unused_function_pass(lbModule *m) { continue; } } - + llvm_delete_function(curr_func); was_dead = true; removal_count += 1; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 837d7ce48..cb8ffcf91 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -289,6 +289,19 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i lb_set_linkage_from_entity_flags(p->module, p->value, entity->flags); + // With LTO on Windows, required procedures with external linkage need to be added to + // llvm.used to survive linker-level dead code elimination. This is necessary because + // LLVM may generate implicit calls to runtime builtins (e.g., __extendhfsf2 for f16 + // conversions) during instruction lowering, after the IR is finalized. + if (build_context.lto_kind != LTO_None && build_context.metrics.os == TargetOs_windows) { + if (entity->flags & EntityFlag_Require) { + LLVMLinkage linkage = LLVMGetLinkage(p->value); + if (linkage != LLVMInternalLinkage) { + lb_append_to_used(m, p->value); + } + } + } + if (m->debug_builder) { // Debug Information Type *bt = base_type(p->type); From b942f72cb085f79b214a596c0628984298358eaa Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 4 Feb 2026 12:45:26 +0000 Subject: [PATCH 338/766] Add docs for `-lto:`; remove `-lld` and `-radlink` flags docs; with `-lto` default to `-use-separate-modules` and `-linker:lld` --- src/main.cpp | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index feaf55f4b..0b642e9a8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1642,8 +1642,28 @@ gb_internal bool parse_build_flags(Array args) { GB_ASSERT(value.kind == ExactValue_String); if (str_eq_ignore_case(value.value_string, str_lit("thin"))) { build_context.lto_kind = LTO_Thin; + if (build_context.linker_choice == Linker_Invalid) { + build_context.linker_choice = Linker_lld; + } + if (!build_context.use_separate_modules) { + build_context.use_separate_modules = true; + if (build_context.use_single_module) { + gb_printf_err("-linker: cannot be used with -use-single-module\n"); + bad_flags = true; + } + } } else if (str_eq_ignore_case(value.value_string, str_lit("thin-files"))) { build_context.lto_kind = LTO_Thin_Files; + if (build_context.linker_choice == Linker_Invalid) { + build_context.linker_choice = Linker_lld; + } + if (!build_context.use_separate_modules) { + build_context.use_separate_modules = true; + if (build_context.use_single_module) { + gb_printf_err("-linker: cannot be used with -use-single-module\n"); + bad_flags = true; + } + } } else { gb_printf_err("-lto: options are 'thin' and 'thin-files'\n"); bad_flags = true; @@ -2729,8 +2749,12 @@ gb_internal int print_show_help(String const arg0, String command, String option } } - if (print_flag("-lld")) { - print_usage_line(2, "Uses the LLD linker rather than the default."); + if (print_flag("-lto:")) { + print_usage_line(2, "States that the project is to be build with link-time optimizations."); + print_usage_line(2, "This also enables '-use-separate-modules' (if not already set) and `-linker:lld"); + print_usage_line(2, "Choices:"); + print_usage_line(3, "thin"); + print_usage_line(3, "thin-files"); } } @@ -2858,10 +2882,6 @@ gb_internal int print_show_help(String const arg0, String command, String option } if (run_or_build) { - if (print_flag("-radlink")) { - print_usage_line(2, "Uses the RAD linker rather than the default."); - } - if (print_flag("-reloc-mode:")) { print_usage_line(2, "Specifies the reloc mode."); print_usage_line(2, "Available options:"); From 6f7a64a47d87f3e61908be5102ba31756f26c8b0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 4 Feb 2026 17:15:48 +0000 Subject: [PATCH 339/766] Change LTO rules for all platforms --- src/llvm_backend_proc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 7897e17cd..018f47c54 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -289,11 +289,11 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i lb_set_linkage_from_entity_flags(p->module, p->value, entity->flags); - // With LTO on Windows, required procedures with external linkage need to be added to + // With LTO on all platforms, required procedures with external linkage need to be added to // llvm.used to survive linker-level dead code elimination. This is necessary because // LLVM may generate implicit calls to runtime builtins (e.g., __extendhfsf2 for f16 // conversions) during instruction lowering, after the IR is finalized. - if (build_context.lto_kind != LTO_None && build_context.metrics.os == TargetOs_windows) { + if (build_context.lto_kind != LTO_None) { if (entity->flags & EntityFlag_Require) { LLVMLinkage linkage = LLVMGetLinkage(p->value); if (linkage != LLVMInternalLinkage) { From 7ef562b51ef697890bd61d363e2cb14e49def827 Mon Sep 17 00:00:00 2001 From: Nahuel2998 Date: Wed, 4 Feb 2026 17:29:10 -0300 Subject: [PATCH 340/766] vendor/x11/xlib: Fix signature of XChangeWindowAttributes Actually fixes #5139 --- vendor/x11/xlib/xlib_procs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 70cd327fd..a7aa7a770 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -234,7 +234,7 @@ foreign xlib { display: ^Display, window: Window, attr_mask: WindowAttributeMask, - attr: ^XWindowAttributes, + attr: ^XSetWindowAttributes, ) --- SetWindowBackground :: proc( display: ^Display, From b7afb68a8eef1164b23d492ea76bafa2deed2bf3 Mon Sep 17 00:00:00 2001 From: lucy Date: Thu, 5 Feb 2026 01:48:43 -0300 Subject: [PATCH 341/766] Fix typo in atomic.odin documentation Changed "guaranties" to "guarantees" in the memory ordering documentation. Also added missing newline at end of file. Co-Authored-By: Claude Opus 4.5 --- core/sync/atomic.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/sync/atomic.odin b/core/sync/atomic.odin index 7e514a6b4..f680c7aa3 100644 --- a/core/sync/atomic.odin +++ b/core/sync/atomic.odin @@ -27,7 +27,7 @@ multiple memory locations between two cores. Which is why CPU's allow for stronger memory ordering guarantees if certain instructions or instruction variants are used. -In Odin there are 5 different memory ordering guaranties that can be provided +In Odin there are 5 different memory ordering guarantees that can be provided to an atomic operation: - `Relaxed`: The memory access (load or store) is unordered with respect to @@ -450,4 +450,4 @@ the load operation, if the comparison fails. The memory ordering for these operations is as specified by the `success` and `failure` parameters respectively. */ -atomic_compare_exchange_weak_explicit :: intrinsics.atomic_compare_exchange_weak_explicit \ No newline at end of file +atomic_compare_exchange_weak_explicit :: intrinsics.atomic_compare_exchange_weak_explicit From a6ad74cea6c533acf12a3d7fd376bfccd16e470e Mon Sep 17 00:00:00 2001 From: Ignacy Koper Date: Wed, 4 Feb 2026 14:43:11 +0100 Subject: [PATCH 342/766] vendor:directx/d3d12: added `IGraphicsCommandList7` with enhanced barriers Signed-off-by: Ignacy Koper --- vendor/directx/d3d12/d3d12.odin | 166 ++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) diff --git a/vendor/directx/d3d12/d3d12.odin b/vendor/directx/d3d12/d3d12.odin index efa323733..af803f85f 100644 --- a/vendor/directx/d3d12/d3d12.odin +++ b/vendor/directx/d3d12/d3d12.odin @@ -5325,6 +5325,172 @@ IGraphicsCommandList6_VTable :: struct { DispatchMesh: proc "system" (this: ^IGraphicsCommandList6, ThreadGroupCountX: u32, ThreadGroupCountY: u32, ThreadGroupCountZ: u32), } + +BARRIER_LAYOUT :: enum i64 { + UNDEFINED = 0xffffffff, + COMMON = 0, + PRESENT = 0, + GENERIC_READ = 1, + RENDER_TARGET = 2, + UNORDERED_ACCESS = 3, + DEPTH_STENCIL_WRITE = 4, + DEPTH_STENCIL_READ = 5, + SHADER_RESOURCE = 6, + COPY_SOURCE = 7, + COPY_DEST = 8, + RESOLVE_SOURCE = 9, + RESOLVE_DEST = 10, + SHADING_RATE_SOURCE = 11, + VIDEO_DECODE_READ = 12, + VIDEO_DECODE_WRITE = 13, + VIDEO_PROCESS_READ = 14, + VIDEO_PROCESS_WRITE = 15, + VIDEO_ENCODE_READ = 16, + VIDEO_ENCODE_WRITE = 17, + DIRECT_QUEUE_COMMON = 18, + DIRECT_QUEUE_GENERIC_READ = 19, + DIRECT_QUEUE_UNORDERED_ACCESS = 20, + DIRECT_QUEUE_SHADER_RESOURCE = 21, + DIRECT_QUEUE_COPY_SOURCE = 22, + DIRECT_QUEUE_COPY_DEST = 23, + COMPUTE_QUEUE_COMMON = 24, + COMPUTE_QUEUE_GENERIC_READ = 25, + COMPUTE_QUEUE_UNORDERED_ACCESS = 26, + COMPUTE_QUEUE_SHADER_RESOURCE = 27, + COMPUTE_QUEUE_COPY_SOURCE = 28, + COMPUTE_QUEUE_COPY_DEST = 29, + DIRECT_QUEUE_GENERIC_READ_COMPUTE_QUEUE_ACCESSIBLE = 31, +} + +BARRIER_SYNC_FLAG :: enum i64 { + ALL = 0, // 0x1 + DRAW = 1, // 0x2 + INDEX_INPUT = 2, // 0x4 + VERTEX_SHADING = 3, // 0x8 + PIXEL_SHADING = 4, // 0x10 + DEPTH_STENCIL = 5, // 0x20 + RENDER_TARGET = 6, // 0x40 + COMPUTE_SHADING = 7, // 0x80 + RAYTRACING = 8, // 0x100 + COPY = 9, // 0x200 + RESOLVE = 10, // 0x400 + EXECUTE_INDIRECT = 11, // 0x800 + PREDICATION = 11, // 0x800 + ALL_SHADING = 12, // 0x1000 + NON_PIXEL_SHADING = 13, // 0x2000 + EMIT_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO = 14, // 0x4000 + CLEAR_UNORDERED_ACCESS_VIEW = 15, // 0x8000 + VIDEO_DECODE = 20, // 0x100000 + VIDEO_PROCESS = 21, // 0x200000 + VIDEO_ENCODE = 22, // 0x400000 + BUILD_RAYTRACING_ACCELERATION_STRUCTURE = 23, // 0x800000 + COPY_RAYTRACING_ACCELERATION_STRUCTURE = 24, // 0x1000000 + SPLIT = 31, // 0x80000000 +} + +BARRIER_SYNC_FLAGS :: bit_set[BARRIER_SYNC_FLAG; i64] + +BARRIER_ACCESS_FLAG :: enum i64 { + VERTEX_BUFFER = 0, // 0x1 + CONSTANT_BUFFER = 1, // 0x2 + INDEX_BUFFER = 2, // 0x4 + RENDER_TARGET = 3, // 0x8 + UNORDERED_ACCESS = 4, // 0x10 + DEPTH_STENCIL_WRITE = 5, // 0x20 + DEPTH_STENCIL_READ = 6, // 0x40 + SHADER_RESOURCE = 7, // 0x80 + STREAM_OUTPUT = 8, // 0x100 + INDIRECT_ARGUMENT = 9, // 0x200 + PREDICATION = 9, // 0x200 + COPY_DEST = 10, // 0x400 + COPY_SOURCE = 11, // 0x800 + RESOLVE_DEST = 12, // 0x1000 + RESOLVE_SOURCE = 13, // 0x2000 + RAYTRACING_ACCELERATION_STRUCTURE_READ = 14, // 0x4000 + RAYTRACING_ACCELERATION_STRUCTURE_WRITE = 15, // 0x8000 + SHADING_RATE_SOURCE = 16, // 0x10000 + VIDEO_DECODE_READ = 17, // 0x20000 + VIDEO_DECODE_WRITE = 18, // 0x40000 + VIDEO_PROCESS_READ = 19, // 0x80000 + VIDEO_PROCESS_WRITE = 20, // 0x100000 + VIDEO_ENCODE_READ = 21, // 0x200000 + VIDEO_ENCODE_WRITE = 22, // 0x400000 + NO_ACCESS = 31, // 0x80000000 +} + +BARRIER_ACCESS_FLAGS :: bit_set[BARRIER_ACCESS_FLAG; i64] + +BARRIER_TYPE :: enum i32 { + GLOBAL, + TEXTURE, + BUFFER, +} + +TEXTURE_BARRIER_FLAGS :: enum i32 { + NONE = 0x0, + DISCARD = 0x1, +} + +BARRIER_SUBRESOURCE_RANGE :: struct { + IndexOrFirstMipLevel: uint, + NumMipLevels: uint, + FirstArraySlice: uint, + NumArraySlices: uint, + FirstPlane: uint, + NumPlanes: uint, +} + +GLOBAL_BARRIER :: struct { + SyncBefore: BARRIER_SYNC_FLAGS, + SyncAfter: BARRIER_SYNC_FLAGS, + AccessBefore: BARRIER_ACCESS_FLAGS, + AccessAfter: BARRIER_ACCESS_FLAGS, +} + +TEXTURE_BARRIER :: struct { + SyncBefore: BARRIER_SYNC_FLAGS, + SyncAfter: BARRIER_SYNC_FLAGS, + AccessBefore: BARRIER_ACCESS_FLAGS, + AccessAfter: BARRIER_ACCESS_FLAGS, + LayoutBefore: BARRIER_LAYOUT, + LayoutAfter: BARRIER_LAYOUT, + pResource: ^IResource, + Subresources: BARRIER_SUBRESOURCE_RANGE, +} + +BUFFER_BARRIER :: struct { + SyncBefore: BARRIER_SYNC_FLAGS, + SyncAfter: BARRIER_SYNC_FLAGS, + AccessBefore: BARRIER_ACCESS_FLAGS, + AccessAfter: BARRIER_ACCESS_FLAGS, + pRessource: ^IResource, + Offset: u64, + Size: u64, +} + +BARRIER_GROUP :: struct { + Type: BARRIER_TYPE, + NumBarriers: u32, + using _: struct #raw_union { + pGlobalBarriers: [^]GLOBAL_BARRIER `raw_union_tag:"Type=GLOBAL"`, + pTextureBarriers: [^]TEXTURE_BARRIER `raw_union_tag:"Type=TEXTURE"`, + pBufferBarriers: [^]BUFFER_BARRIER `raw_union_tag:"Type=BARRIER"`, + }, +} + + +IGraphicsCommandList7_UUID_STRING :: "dd171223-8b61-4769-90e3-160ccde4e2c1" +IGraphicsCommandList7_UUID := &IID{0xdd171223, 0x8b61, 0x4769, {0x90, 0xe3, 0x16, 0x0c, 0xcd, 0xe4, 0xe2, 0xc1}} +IGraphicsCommandList7 :: struct #raw_union { + #subtype id3d12graphicscommandlist6: IGraphicsCommandList6, + using id3d12graphicscommandlist7_vtable: ^IGraphicsCommandList7_VTable, +} +IGraphicsCommandList7_VTable :: struct { + using id3d12graphicscommandlist6_vtable: IGraphicsCommandList6_VTable, + Barrier: proc "system" (this: ^IGraphicsCommandList7, NumBarrierGroups: u32, pBarrierGroups: [^]BARRIER_GROUP), +} + + SHADER_VERSION_TYPE :: enum u32 { PIXEL_SHADER = 0, VERTEX_SHADER = 1, From dcbbb5792b1d2baaa3635b43799aa5aa167e768e Mon Sep 17 00:00:00 2001 From: Ignacy Koper Date: Sat, 7 Feb 2026 09:58:42 +0100 Subject: [PATCH 343/766] vendor:directx/d3d12: changed backing integers of `BARRIER*` enums and bit-sets to u32 from i64 and added missing `Flags` field to `TEXTURE_BARRIER` struct Signed-off-by: Ignacy Koper --- vendor/directx/d3d12/d3d12.odin | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/vendor/directx/d3d12/d3d12.odin b/vendor/directx/d3d12/d3d12.odin index af803f85f..fba1c6e26 100644 --- a/vendor/directx/d3d12/d3d12.odin +++ b/vendor/directx/d3d12/d3d12.odin @@ -5326,7 +5326,7 @@ IGraphicsCommandList6_VTable :: struct { } -BARRIER_LAYOUT :: enum i64 { +BARRIER_LAYOUT :: enum u32 { UNDEFINED = 0xffffffff, COMMON = 0, PRESENT = 0, @@ -5362,7 +5362,7 @@ BARRIER_LAYOUT :: enum i64 { DIRECT_QUEUE_GENERIC_READ_COMPUTE_QUEUE_ACCESSIBLE = 31, } -BARRIER_SYNC_FLAG :: enum i64 { +BARRIER_SYNC_FLAG :: enum u32 { ALL = 0, // 0x1 DRAW = 1, // 0x2 INDEX_INPUT = 2, // 0x4 @@ -5388,9 +5388,9 @@ BARRIER_SYNC_FLAG :: enum i64 { SPLIT = 31, // 0x80000000 } -BARRIER_SYNC_FLAGS :: bit_set[BARRIER_SYNC_FLAG; i64] +BARRIER_SYNC_FLAGS :: bit_set[BARRIER_SYNC_FLAG; u32] -BARRIER_ACCESS_FLAG :: enum i64 { +BARRIER_ACCESS_FLAG :: enum u32 { VERTEX_BUFFER = 0, // 0x1 CONSTANT_BUFFER = 1, // 0x2 INDEX_BUFFER = 2, // 0x4 @@ -5418,7 +5418,7 @@ BARRIER_ACCESS_FLAG :: enum i64 { NO_ACCESS = 31, // 0x80000000 } -BARRIER_ACCESS_FLAGS :: bit_set[BARRIER_ACCESS_FLAG; i64] +BARRIER_ACCESS_FLAGS :: bit_set[BARRIER_ACCESS_FLAG; u32] BARRIER_TYPE :: enum i32 { GLOBAL, @@ -5456,6 +5456,7 @@ TEXTURE_BARRIER :: struct { LayoutAfter: BARRIER_LAYOUT, pResource: ^IResource, Subresources: BARRIER_SUBRESOURCE_RANGE, + Flags: TEXTURE_BARRIER_FLAGS, } BUFFER_BARRIER :: struct { From 7b18a08d566d7cc48630090354d53e829c2324bf Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sat, 7 Feb 2026 15:45:25 +0100 Subject: [PATCH 344/766] add vendor:curl to docs --- examples/all/all_vendor.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/all/all_vendor.odin b/examples/all/all_vendor.odin index fc2a401b3..1605ea8a7 100644 --- a/examples/all/all_vendor.odin +++ b/examples/all/all_vendor.odin @@ -2,6 +2,7 @@ package all @(require) import "vendor:cgltf" +@(require) import "vendor:curl" @(require) import "vendor:ENet" @(require) import "vendor:OpenEXRCore" @(require) import "vendor:ggpo" From ec314c8324469e188d4568029cba8950377fabc5 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 12:42:17 +0100 Subject: [PATCH 345/766] fix conflict --- core/crypto/hash/hash_os.odin | 41 +++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/core/crypto/hash/hash_os.odin b/core/crypto/hash/hash_os.odin index d54e657ad..32347c452 100644 --- a/core/crypto/hash/hash_os.odin +++ b/core/crypto/hash/hash_os.odin @@ -2,25 +2,25 @@ package crypto_hash import "core:io" -import "core:os" +import os "core:os/os2" -// hash_file will read the file provided by the given handle and return the +// `hash_file` will read the file provided by the given handle and return the // computed digest in a newly allocated slice. -hash_file :: proc( - algorithm: Algorithm, - hd: os.Handle, +hash_file_by_handle :: proc( + algorithm: Algorithm, + handle: ^os.File, load_at_once := false, - allocator := context.allocator, + allocator := context.allocator, ) -> ( []byte, io.Error, ) { if !load_at_once { - return hash_stream(algorithm, os.stream_from_handle(hd), allocator) + return hash_stream(algorithm, handle.stream, allocator) } - buf, ok := os.read_entire_file(hd, allocator) - if !ok { + buf, err := os.read_entire_file(handle, allocator) + if err != nil { return nil, io.Error.Unknown } defer delete(buf, allocator) @@ -28,11 +28,30 @@ hash_file :: proc( return hash_bytes(algorithm, buf, allocator), io.Error.None } +hash_file_by_name :: proc( + algorithm: Algorithm, + filename: string, + load_at_once := false, + allocator := context.allocator, +) -> ( + []byte, + io.Error, +) { + handle, err := os.open(filename) + defer os.close(handle) + + if err != nil { + return {}, io.Error.Unknown + } + return hash_file_by_handle(algorithm, handle, load_at_once, allocator) +} + + hash :: proc { hash_stream, - hash_file, + hash_file_by_handle, hash_bytes, hash_string, hash_bytes_to_buffer, hash_string_to_buffer, -} +} \ No newline at end of file From 3303d3c98f54164ef9a2130c12f12ea6980cea88 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 27 Oct 2025 23:08:56 +0100 Subject: [PATCH 346/766] Stub out `core:os/os2` for js_wasm --- core/os/os2/dir_js.odin | 24 ++++++++ core/os/os2/env_js.odin | 42 +++++++++++++ core/os/os2/errors_js.odin | 13 +++++ core/os/os2/file_js.odin | 107 ++++++++++++++++++++++++++++++++++ core/os/os2/heap_js.odin | 7 +++ core/os/os2/path_js.odin | 85 +++++++++++++++++++++++++++ core/os/os2/pipe_js.odin | 14 +++++ core/os/os2/process_js.odin | 87 +++++++++++++++++++++++++++ core/os/os2/stat_js.odin | 21 +++++++ core/os/os2/temp_file_js.odin | 9 +++ 10 files changed, 409 insertions(+) create mode 100644 core/os/os2/dir_js.odin create mode 100644 core/os/os2/env_js.odin create mode 100644 core/os/os2/errors_js.odin create mode 100644 core/os/os2/file_js.odin create mode 100644 core/os/os2/heap_js.odin create mode 100644 core/os/os2/path_js.odin create mode 100644 core/os/os2/pipe_js.odin create mode 100644 core/os/os2/process_js.odin create mode 100644 core/os/os2/stat_js.odin create mode 100644 core/os/os2/temp_file_js.odin diff --git a/core/os/os2/dir_js.odin b/core/os/os2/dir_js.odin new file mode 100644 index 000000000..d8f7c6202 --- /dev/null +++ b/core/os/os2/dir_js.odin @@ -0,0 +1,24 @@ +#+build js wasm32, js wasm64p32 +#+private +package os2 + +import "base:intrinsics" + +Read_Directory_Iterator_Impl :: struct { + fullpath: [dynamic]byte, + buf: []byte, + off: int, +} + +@(require_results) +_read_directory_iterator :: proc(it: ^Read_Directory_Iterator) -> (fi: File_Info, index: int, ok: bool) { + return {}, -1, false +} + +_read_directory_iterator_init :: proc(it: ^Read_Directory_Iterator, f: ^File) { + +} + +_read_directory_iterator_destroy :: proc(it: ^Read_Directory_Iterator) { + +} diff --git a/core/os/os2/env_js.odin b/core/os/os2/env_js.odin new file mode 100644 index 000000000..c1d94ba4a --- /dev/null +++ b/core/os/os2/env_js.odin @@ -0,0 +1,42 @@ +#+build js wasm32, js wasm64p32 +#+private +package os2 + +import "base:runtime" + +build_env :: proc() -> (err: Error) { + return +} + +// delete_string_if_not_original :: proc(str: string) { + +// } + +@(require_results) +_lookup_env_alloc :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) { + return +} + +_lookup_env_buf :: proc(buf: []u8, key: string) -> (value: string, error: Error) { + return "", .Unsupported +} +_lookup_env :: proc{_lookup_env_alloc, _lookup_env_buf} + +@(require_results) +_set_env :: proc(key, value: string) -> (err: Error) { + return .Unsupported +} + +@(require_results) +_unset_env :: proc(key: string) -> bool { + return true +} + +_clear_env :: proc() { + +} + +@(require_results) +_environ :: proc(allocator: runtime.Allocator) -> (environ: []string, err: Error) { + return {}, .Unsupported +} diff --git a/core/os/os2/errors_js.odin b/core/os/os2/errors_js.odin new file mode 100644 index 000000000..c92d36736 --- /dev/null +++ b/core/os/os2/errors_js.odin @@ -0,0 +1,13 @@ +#+build js wasm32, js wasm64p32 +#+private +package os2 + +_Platform_Error :: enum i32 {} + +_error_string :: proc(errno: i32) -> string { + return "" +} + +_get_platform_error :: proc(errno: _Platform_Error) -> Error { + return Platform_Error(errno) +} diff --git a/core/os/os2/file_js.odin b/core/os/os2/file_js.odin new file mode 100644 index 000000000..fd4bf347c --- /dev/null +++ b/core/os/os2/file_js.odin @@ -0,0 +1,107 @@ +#+build js wasm32, js wasm64p32 +#+private +package os2 + +import "base:runtime" + +import "core:io" +import "core:time" + +File_Impl :: distinct rawptr + +_open :: proc(name: string, flags: File_Flags, perm: int) -> (f: ^File, err: Error) { + return nil, .Unsupported +} + +_new_file :: proc(handle: uintptr, name: string, allocator: runtime.Allocator) -> (f: ^File, err: Error) { + return nil, .Unsupported +} + +_clone :: proc(f: ^File) -> (clone: ^File, err: Error) { + return nil, .Unsupported +} + +_close :: proc(f: ^File_Impl) -> (err: Error) { + return .Unsupported +} + +_fd :: proc(f: ^File) -> uintptr { + return 0 +} + + +_name :: proc(f: ^File) -> string { + return "" +} + +_sync :: proc(f: ^File) -> Error { + return .Unsupported +} + +_truncate :: proc(f: ^File, size: i64) -> Error { + return .Unsupported +} + +_remove :: proc(name: string) -> Error { + return .Unsupported +} + +_rename :: proc(old_path, new_path: string) -> Error { + return .Unsupported +} + +_link :: proc(old_name, new_name: string) -> Error { + return .Unsupported +} + +_symlink :: proc(old_name, new_name: string) -> Error { + return .Unsupported +} + +_read_link :: proc(name: string, allocator: runtime.Allocator) -> (s: string, err: Error) { + return "", .Unsupported +} + +_chdir :: proc(name: string) -> Error { + return .Unsupported +} + +_fchdir :: proc(f: ^File) -> Error { + return .Unsupported +} + +_fchmod :: proc(f: ^File, mode: int) -> Error { + return .Unsupported +} + +_chmod :: proc(name: string, mode: int) -> Error { + return .Unsupported +} + +_fchown :: proc(f: ^File, uid, gid: int) -> Error { + return .Unsupported +} + +_chown :: proc(name: string, uid, gid: int) -> Error { + return .Unsupported +} + +_lchown :: proc(name: string, uid, gid: int) -> Error { + return .Unsupported +} + +_chtimes :: proc(name: string, atime, mtime: time.Time) -> Error { + return .Unsupported +} + +_fchtimes :: proc(f: ^File, atime, mtime: time.Time) -> Error { + return .Unsupported +} + +_exists :: proc(path: string) -> bool { + return false +} + +_file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) { + return 0, .Empty +} \ No newline at end of file diff --git a/core/os/os2/heap_js.odin b/core/os/os2/heap_js.odin new file mode 100644 index 000000000..15990b517 --- /dev/null +++ b/core/os/os2/heap_js.odin @@ -0,0 +1,7 @@ +#+build js wasm32, js wasm64p32 +#+private +package os2 + +import "base:runtime" + +_heap_allocator_proc :: runtime.wasm_allocator_proc diff --git a/core/os/os2/path_js.odin b/core/os/os2/path_js.odin new file mode 100644 index 000000000..0c0d1424b --- /dev/null +++ b/core/os/os2/path_js.odin @@ -0,0 +1,85 @@ +#+build js wasm32, js wasm64p32 +#+private +package os2 + +import "base:runtime" + +_Path_Separator :: '/' +_Path_Separator_String :: "/" +_Path_List_Separator :: ':' + +_is_path_separator :: proc(c: byte) -> (ok: bool) { + return c == _Path_Separator +} + +_mkdir :: proc(name: string, perm: int) -> (err: Error) { + return .Unsupported +} + +_mkdir_all :: proc(path: string, perm: int) -> (err: Error) { + return .Unsupported +} + +_remove_all :: proc(path: string) -> (err: Error) { + return .Unsupported +} + +_get_working_directory :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) { + return "", .Unsupported +} + +_set_working_directory :: proc(dir: string) -> (err: Error) { + return .Unsupported +} + +_get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) { + return "", .Unsupported +} + +_are_paths_identical :: proc(a, b: string) -> bool { + return false +} + +_clean_path_handle_start :: proc(path: string, buffer: []u8) -> (rooted: bool, start: int) { + return +} + +_is_absolute_path :: proc(path: string) -> bool { + return false +} + +_get_absolute_path :: proc(path: string, allocator: runtime.Allocator) -> (absolute_path: string, err: Error) { + return "", .Unsupported +} + +_get_relative_path_handle_start :: proc(base, target: string) -> bool { + return false +} + +_get_common_path_len :: proc(base, target: string) -> int { + i := 0 + end := min(len(base), len(target)) + for j in 0..=end { + if j == end || _is_path_separator(base[j]) { + if base[i:j] == target[i:j] { + i = j + } else { + break + } + } + } + return i +} + +_split_path :: proc(path: string) -> (dir, file: string) { + i := len(path) - 1 + for i >= 0 && !_is_path_separator(path[i]) { + i -= 1 + } + if i == 0 { + return path[:i+1], path[i+1:] + } else if i > 0 { + return path[:i], path[i+1:] + } + return "", path +} \ No newline at end of file diff --git a/core/os/os2/pipe_js.odin b/core/os/os2/pipe_js.odin new file mode 100644 index 000000000..253228f86 --- /dev/null +++ b/core/os/os2/pipe_js.odin @@ -0,0 +1,14 @@ +#+build js wasm32, js wasm64p32 +#+private +package os2 + +_pipe :: proc() -> (r, w: ^File, err: Error) { + err = .Unsupported + return +} + +@(require_results) +_pipe_has_data :: proc(r: ^File) -> (ok: bool, err: Error) { + err = .Unsupported + return +} diff --git a/core/os/os2/process_js.odin b/core/os/os2/process_js.odin new file mode 100644 index 000000000..a2db3d56e --- /dev/null +++ b/core/os/os2/process_js.odin @@ -0,0 +1,87 @@ +#+build js wasm32, js wasm64p32 +#+private +package os2 + +import "base:runtime" +import "core:time" + + +_exit :: proc "contextless" (code: int) -> ! { + runtime.panic_contextless("exit") +} + +_get_uid :: proc() -> int { + return 0 +} + +_get_euid :: proc() -> int { + return 0 +} + +_get_gid :: proc() -> int { + return 0 +} + +_get_egid :: proc() -> int { + return 0 +} + +_get_pid :: proc() -> int { + return 0 +} + +_get_ppid :: proc() -> int { + return 0 +} + +_process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) { + err = .Unsupported + return +} + +_current_process_info :: proc(selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) { + err = .Unsupported + return +} + +_process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { + err = .Unsupported + return +} + +_process_wait :: proc(process: Process, timeout: time.Duration) -> (process_state: Process_State, err: Error) { + err = .Unsupported + return +} + +_process_close :: proc(process: Process) -> Error { + return .Unsupported +} + +_process_kill :: proc(process: Process) -> (err: Error) { + return .Unsupported +} + +_process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) { + err = .Unsupported + return +} + +_process_list :: proc(allocator: runtime.Allocator) -> (list: []int, err: Error) { + err = .Unsupported + return +} + +_process_open :: proc(pid: int, flags: Process_Open_Flags) -> (process: Process, err: Error) { + process.pid = pid + err = .Unsupported + return +} + +_process_handle_still_valid :: proc(p: Process) -> Error { + return nil +} + +_process_state_update_times :: proc(p: Process, state: ^Process_State) { + return +} diff --git a/core/os/os2/stat_js.odin b/core/os/os2/stat_js.odin new file mode 100644 index 000000000..439226490 --- /dev/null +++ b/core/os/os2/stat_js.odin @@ -0,0 +1,21 @@ +#+build js wasm32, js wasm64p32 +#+private +package os2 + +import "base:runtime" + +_fstat :: proc(f: ^File, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { + return {}, .Unsupported +} + +_stat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { + return {}, .Unsupported +} + +_lstat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { + return {}, .Unsupported +} + +_same_file :: proc(fi1, fi2: File_Info) -> bool { + return fi1.fullpath == fi2.fullpath +} \ No newline at end of file diff --git a/core/os/os2/temp_file_js.odin b/core/os/os2/temp_file_js.odin new file mode 100644 index 000000000..e1f2b3d95 --- /dev/null +++ b/core/os/os2/temp_file_js.odin @@ -0,0 +1,9 @@ +#+build js wasm32, js wasm64p32 +#+private +package os2 + +import "base:runtime" + +_temp_dir :: proc(allocator: runtime.Allocator) -> (string, runtime.Allocator_Error) { + return "", .Mode_Not_Implemented +} \ No newline at end of file From 304f22c8af635124357c5f62772f6f09676aa761 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 00:16:42 +0100 Subject: [PATCH 347/766] `core:os` -> `core:os/os` for CSV, INI, and XML Also had to vendor `core:encoding/ini` into `core:os/os2` for the user directories on *nix, as it used that package to read `~/.config/user-dirs.dirs`, causing an import cycle. --- core/encoding/csv/doc.odin | 34 +++++++++++++++++-------------- core/encoding/ini/ini.odin | 21 +++++++++++-------- core/encoding/xml/xml_reader.odin | 18 ++++++++-------- core/os/os2/user_posix.odin | 1 + 4 files changed, 41 insertions(+), 33 deletions(-) diff --git a/core/encoding/csv/doc.odin b/core/encoding/csv/doc.odin index 50b8e3d1a..58e2a7ac5 100644 --- a/core/encoding/csv/doc.odin +++ b/core/encoding/csv/doc.odin @@ -6,7 +6,7 @@ Example: import "core:fmt" import "core:encoding/csv" - import "core:os" + import os "core:os/os2" // Requires keeping the entire CSV file in memory at once iterate_csv_from_string :: proc(filename: string) { @@ -16,14 +16,15 @@ Example: r.reuse_record_buffer = true // Without it you have to each of the fields within it defer csv.reader_destroy(&r) - csv_data, ok := os.read_entire_file(filename) - if ok { + csv_data, csv_err := os.read_entire_file(filename, context.allocator) + defer delete(csv_data) + + if csv_err == nil { csv.reader_init_with_string(&r, string(csv_data)) } else { - fmt.printfln("Unable to open file: %v", filename) + fmt.printfln("Unable to open file: %v. Error: %v", filename, csv_err) return } - defer delete(csv_data) for r, i, err in csv.iterator_next(&r) { if err != nil { /* Do something with error */ } @@ -39,16 +40,16 @@ Example: r: csv.Reader r.trim_leading_space = true r.reuse_record = true // Without it you have to delete(record) - r.reuse_record_buffer = true // Without it you have to each of the fields within it + r.reuse_record_buffer = true // Without it you have to delete each of the fields within it defer csv.reader_destroy(&r) handle, err := os.open(filename) + defer os.close(handle) if err != nil { - fmt.eprintfln("Error opening file: %v", filename) + fmt.eprintfln("Error %v opening file: %v", err, filename) return } - defer os.close(handle) - csv.reader_init(&r, os.stream_from_handle(handle)) + csv.reader_init(&r, handle.stream) for r, i in csv.iterator_next(&r) { for f, j in r { @@ -64,21 +65,24 @@ Example: r.trim_leading_space = true defer csv.reader_destroy(&r) - csv_data, ok := os.read_entire_file(filename) - if ok { + csv_data, csv_err := os.read_entire_file(filename, context.allocator) + defer delete(csv_data, context.allocator) + if csv_err == nil { csv.reader_init_with_string(&r, string(csv_data)) } else { - fmt.printfln("Unable to open file: %v", filename) + fmt.printfln("Unable to open file: %v. Error: %v", filename, csv_err) return } - defer delete(csv_data) records, err := csv.read_all(&r) if err != nil { /* Do something with CSV parse error */ } defer { - for rec in records { - delete(rec) + for record in records { + for field in record { + delete(field) + } + delete(record) } delete(records) } diff --git a/core/encoding/ini/ini.odin b/core/encoding/ini/ini.odin index a119b0f2e..644ce8937 100644 --- a/core/encoding/ini/ini.odin +++ b/core/encoding/ini/ini.odin @@ -1,13 +1,13 @@ // Reader and writer for a variant of the `.ini` file format with `key = value` entries in `[sections]`. package encoding_ini -import "base:runtime" -import "base:intrinsics" -import "core:strings" -import "core:strconv" -import "core:io" -import "core:os" -import "core:fmt" +import "base:runtime" +import "base:intrinsics" +import "core:strings" +import "core:strconv" +import "core:io" +import os "core:os/os2" +import "core:fmt" _ :: fmt Options :: struct { @@ -121,8 +121,11 @@ load_map_from_string :: proc(src: string, allocator: runtime.Allocator, options } load_map_from_path :: proc(path: string, allocator: runtime.Allocator, options := DEFAULT_OPTIONS) -> (m: Map, err: runtime.Allocator_Error, ok: bool) { - data := os.read_entire_file(path, allocator) or_return + data, data_err := os.read_entire_file(path, allocator) defer delete(data, allocator) + if data_err != nil { + return + } m, err = load_map_from_string(string(data), allocator, options) ok = err == nil defer if !ok { @@ -191,4 +194,4 @@ write_map :: proc(w: io.Writer, m: Map) -> (n: int, err: io.Error) { section_index += 1 } return -} +} \ No newline at end of file diff --git a/core/encoding/xml/xml_reader.odin b/core/encoding/xml/xml_reader.odin index 8f8fffe14..798eb3f87 100644 --- a/core/encoding/xml/xml_reader.odin +++ b/core/encoding/xml/xml_reader.odin @@ -9,13 +9,13 @@ package encoding_xml - Jeroen van Rijn: Initial implementation. */ -import "core:bytes" -import "core:encoding/entity" -import "base:intrinsics" -import "core:mem" -import "core:os" -import "core:strings" -import "base:runtime" +import "base:runtime" +import "core:bytes" +import "core:encoding/entity" +import "base:intrinsics" +import "core:mem" +import os "core:os/os2" +import "core:strings" likely :: intrinsics.expect @@ -378,8 +378,8 @@ load_from_file :: proc(filename: string, options := DEFAULT_OPTIONS, error_handl context.allocator = allocator options := options - data, data_ok := os.read_entire_file(filename) - if !data_ok { return {}, .File_Error } + data, data_err := os.read_entire_file(filename, allocator) + if data_err != nil { return {}, .File_Error } options.flags += { .Input_May_Be_Modified } diff --git a/core/os/os2/user_posix.odin b/core/os/os2/user_posix.odin index 09134d847..fa173f129 100644 --- a/core/os/os2/user_posix.odin +++ b/core/os/os2/user_posix.odin @@ -1,6 +1,7 @@ #+build !windows package os2 +import "base:intrinsics" import "base:runtime" import "core:strings" From 1cbd60f40e974eead2b46bc5fdd732c6357dfdfb Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 00:31:54 +0100 Subject: [PATCH 348/766] Reenable `core:encoding/ini` tests --- tests/core/encoding/ini/test_core_ini.odin | 5 ++--- tests/core/normal.odin | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/core/encoding/ini/test_core_ini.odin b/tests/core/encoding/ini/test_core_ini.odin index 6e6c8152e..8c554c6b5 100644 --- a/tests/core/encoding/ini/test_core_ini.odin +++ b/tests/core/encoding/ini/test_core_ini.odin @@ -1,8 +1,7 @@ +#+feature dynamic-literals package test_core_ini -import "base:runtime" import "core:encoding/ini" -import "core:mem/virtual" import "core:strings" import "core:testing" @@ -64,7 +63,7 @@ ini_to_string :: proc(t: ^testing.T) { testing.expectf( t, - strings.contains(str, "[LEVEL]LOG = debug"), + strings.contains(str, "[LEVEL]\nLOG = debug"), "Expected `ini.save_map_to_string` to return a string equal to \"[LEVEL]LOG = debug\", got %v", str, ) diff --git a/tests/core/normal.odin b/tests/core/normal.odin index d0889bf89..bb2e59f62 100644 --- a/tests/core/normal.odin +++ b/tests/core/normal.odin @@ -18,6 +18,7 @@ download_assets :: proc "contextless" () { @(require) import "encoding/cbor" @(require) import "encoding/hex" @(require) import "encoding/hxa" +@(require) import "encoding/ini" @(require) import "encoding/json" @(require) import "encoding/uuid" @(require) import "encoding/varint" From f63c2094784849ab1ebe1688558e90410af83152 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 00:40:07 +0100 Subject: [PATCH 349/766] Convert `core:encoding/hxa` --- core/encoding/hxa/read.odin | 8 ++++---- core/encoding/hxa/write.odin | 6 +++--- tests/core/encoding/hxa/test_core_hxa.odin | 6 ++---- tests/core/normal.odin | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/core/encoding/hxa/read.odin b/core/encoding/hxa/read.odin index 6dde16848..04dcab817 100644 --- a/core/encoding/hxa/read.odin +++ b/core/encoding/hxa/read.odin @@ -1,7 +1,7 @@ package encoding_hxa import "core:fmt" -import "core:os" +import os "core:os/os2" import "core:mem" Read_Error :: enum { @@ -14,13 +14,13 @@ Read_Error :: enum { read_from_file :: proc(filename: string, print_error := false, allocator := context.allocator, loc := #caller_location) -> (file: File, err: Read_Error) { context.allocator = allocator - data, ok := os.read_entire_file(filename, allocator, loc) - if !ok { + data, data_err := os.read_entire_file(filename, allocator) + if data_err != nil { err = .Unable_To_Read_File delete(data, allocator, loc) return } - file, err = read(data, filename, print_error, allocator, loc) + file, err = read(data, filename, print_error, allocator) file.backing = data return } diff --git a/core/encoding/hxa/write.odin b/core/encoding/hxa/write.odin index 5bb950e81..e8ef9a139 100644 --- a/core/encoding/hxa/write.odin +++ b/core/encoding/hxa/write.odin @@ -1,7 +1,7 @@ package encoding_hxa -import "core:os" -import "core:mem" +import os "core:os/os2" +import "core:mem" Write_Error :: enum { None, @@ -18,7 +18,7 @@ write_to_file :: proc(filepath: string, file: File) -> (err: Write_Error) { defer delete(buf) write_internal(&Writer{data = buf}, file) - if !os.write_entire_file(filepath, buf) { + if os.write_entire_file(filepath, buf) != nil { err =.Failed_File_Write } return diff --git a/tests/core/encoding/hxa/test_core_hxa.odin b/tests/core/encoding/hxa/test_core_hxa.odin index a8f3e94f6..7f495e161 100644 --- a/tests/core/encoding/hxa/test_core_hxa.odin +++ b/tests/core/encoding/hxa/test_core_hxa.odin @@ -9,17 +9,15 @@ import "core:testing" TEAPOT_PATH :: ODIN_ROOT + "tests/core/assets/HXA/teapot.hxa" -import "core:os" +import os "core:os/os2" @test test_read :: proc(t: ^testing.T) { - data, _ := os.read_entire_file(TEAPOT_PATH) - // file, err := hxa.read_from_file(TEAPOT_PATH) + data, _ := os.read_entire_file(TEAPOT_PATH, context.allocator) file, err := hxa.read(data) file.backing = data file.allocator = context.allocator hxa.file_destroy(file) - // fmt.printfln("%#v", file) e :: hxa.Read_Error.None testing.expectf(t, err == e, "read_from_file(%v) -> %v != %v", TEAPOT_PATH, err, e) diff --git a/tests/core/normal.odin b/tests/core/normal.odin index bb2e59f62..696510ac1 100644 --- a/tests/core/normal.odin +++ b/tests/core/normal.odin @@ -54,4 +54,4 @@ download_assets :: proc "contextless" () { @(require) import "text/regex" @(require) import "thread" @(require) import "time" -@(require) import "unicode" +@(require) import "unicode" \ No newline at end of file From 170e314f839f013fe58e0c91a61a34c1dbcfecd2 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 01:42:45 +0100 Subject: [PATCH 350/766] core:os -> core:os/os for core:image --- core/image/bmp/bmp_os.odin | 14 +- core/image/general_os.odin | 8 +- core/image/jpeg/jpeg_os.odin | 8 +- core/image/netpbm/netpbm_os.odin | 14 +- core/image/png/doc.odin | 348 ------------------------------- core/image/png/png_os.odin | 10 +- core/image/qoi/qoi_os.odin | 41 ++-- core/image/tga/tga_os.odin | 38 ++-- 8 files changed, 63 insertions(+), 418 deletions(-) delete mode 100644 core/image/png/doc.odin diff --git a/core/image/bmp/bmp_os.odin b/core/image/bmp/bmp_os.odin index 70a85a784..971750fda 100644 --- a/core/image/bmp/bmp_os.odin +++ b/core/image/bmp/bmp_os.odin @@ -1,18 +1,18 @@ #+build !js package core_image_bmp -import "core:os" -import "core:bytes" +import os "core:os/os2" +import "core:bytes" load :: proc{load_from_file, load_from_bytes, load_from_context} load_from_file :: proc(filename: string, options := Options{}, allocator := context.allocator) -> (img: ^Image, err: Error) { context.allocator = allocator - data, ok := os.read_entire_file(filename) - defer delete(data) + data, data_err := os.read_entire_file(filename, allocator) + defer delete(data, allocator) - if ok { + if data_err == nil { return load_from_bytes(data, options) } else { return nil, .Unable_To_Read_File @@ -28,7 +28,7 @@ save_to_file :: proc(output: string, img: ^Image, options := Options{}, allocato defer bytes.buffer_destroy(out) save_to_buffer(out, img, options) or_return - write_ok := os.write_entire_file(output, out.buf[:]) + write_err := os.write_entire_file(output, out.buf[:]) - return nil if write_ok else .Unable_To_Write_File + return nil if write_err == nil else .Unable_To_Write_File } \ No newline at end of file diff --git a/core/image/general_os.odin b/core/image/general_os.odin index 98eb5bdbe..e4de1c9a6 100644 --- a/core/image/general_os.odin +++ b/core/image/general_os.odin @@ -1,25 +1,23 @@ #+build !js package image -import "core:os" +import os "core:os/os2" load :: proc{ load_from_bytes, load_from_file, } - load_from_file :: proc(filename: string, options := Options{}, allocator := context.allocator) -> (img: ^Image, err: Error) { - data, ok := os.read_entire_file(filename, allocator) + data, data_err := os.read_entire_file(filename, allocator) defer delete(data, allocator) - if ok { + if data_err == nil { return load_from_bytes(data, options, allocator) } else { return nil, .Unable_To_Read_File } } - which :: proc{ which_bytes, which_file, diff --git a/core/image/jpeg/jpeg_os.odin b/core/image/jpeg/jpeg_os.odin index 92c0bb447..aad172c91 100644 --- a/core/image/jpeg/jpeg_os.odin +++ b/core/image/jpeg/jpeg_os.odin @@ -1,17 +1,17 @@ #+build !js package jpeg -import "core:os" +import os "core:os/os2" load :: proc{load_from_file, load_from_bytes, load_from_context} load_from_file :: proc(filename: string, options := Options{}, allocator := context.allocator) -> (img: ^Image, err: Error) { context.allocator = allocator - data, ok := os.read_entire_file(filename) - defer delete(data) + data, data_err := os.read_entire_file(filename, allocator) + defer delete(data, allocator) - if ok { + if data_err == nil { return load_from_bytes(data, options) } else { return nil, .Unable_To_Read_File diff --git a/core/image/netpbm/netpbm_os.odin b/core/image/netpbm/netpbm_os.odin index 2cf2439ac..82ad55f35 100644 --- a/core/image/netpbm/netpbm_os.odin +++ b/core/image/netpbm/netpbm_os.odin @@ -1,27 +1,25 @@ #+build !js package netpbm -import "core:os" +import os "core:os/os2" load :: proc { load_from_file, load_from_bytes, } - load_from_file :: proc(filename: string, allocator := context.allocator) -> (img: ^Image, err: Error) { context.allocator = allocator - data, ok := os.read_entire_file(filename); defer delete(data) - if !ok { + data, data_err := os.read_entire_file(filename, allocator); defer delete(data) + if data_err == nil { + return load_from_bytes(data) + } else { err = .Unable_To_Read_File return } - - return load_from_bytes(data) } - save :: proc { save_to_file, save_to_buffer, @@ -33,7 +31,7 @@ save_to_file :: proc(filename: string, img: ^Image, custom_info: Info = {}, allo data: []byte; defer delete(data) data = save_to_buffer(img, custom_info) or_return - if ok := os.write_entire_file(filename, data); !ok { + if save_err := os.write_entire_file(filename, data); save_err != nil { return .Unable_To_Write_File } diff --git a/core/image/png/doc.odin b/core/image/png/doc.odin deleted file mode 100644 index 034a6775f..000000000 --- a/core/image/png/doc.odin +++ /dev/null @@ -1,348 +0,0 @@ -/* -Reader for `PNG` images. - -The PNG specification is at [[ https://www.w3.org/TR/PNG/ ]]. - -Example: - package main - - import "core:image" - // import "core:image/png" - import "core:bytes" - import "core:fmt" - - // For PPM writer - import "core:mem" - import "core:os" - - main :: proc() { - track := mem.Tracking_Allocator{} - mem.tracking_allocator_init(&track, context.allocator) - - context.allocator = mem.tracking_allocator(&track) - - demo() - - if len(track.allocation_map) > 0 { - fmt.println("Leaks:") - for _, v in track.allocation_map { - fmt.printf("\t%v\n\n", v) - } - } - } - - demo :: proc() { - file: string - - options := image.Options{.return_metadata} - err: image.Error - img: ^image.Image - - file = "../../../misc/logo-slim.png" - - img, err = load(file, options) - defer destroy(img) - - if err != nil { - fmt.printf("Trying to read PNG file %v returned %v\n", file, err) - } else { - fmt.printf("Image: %vx%vx%v, %v-bit.\n", img.width, img.height, img.channels, img.depth) - - if v, ok := img.metadata.(^image.PNG_Info); ok { - // Handle ancillary chunks as you wish. - // We provide helper functions for a few types. - for c in v.chunks { - #partial switch c.header.type { - case .tIME: - if t, t_ok := core_time(c); t_ok { - fmt.printf("[tIME]: %v\n", t) - } - case .gAMA: - if gama, gama_ok := gamma(c); gama_ok { - fmt.printf("[gAMA]: %v\n", gama) - } - case .pHYs: - if phys, phys_ok := phys(c); phys_ok { - if phys.unit == .Meter { - xm := f32(img.width) / f32(phys.ppu_x) - ym := f32(img.height) / f32(phys.ppu_y) - dpi_x, dpi_y := phys_to_dpi(phys) - fmt.printf("[pHYs] Image resolution is %v x %v pixels per meter.\n", phys.ppu_x, phys.ppu_y) - fmt.printf("[pHYs] Image resolution is %v x %v DPI.\n", dpi_x, dpi_y) - fmt.printf("[pHYs] Image dimensions are %v x %v meters.\n", xm, ym) - } else { - fmt.printf("[pHYs] x: %v, y: %v pixels per unknown unit.\n", phys.ppu_x, phys.ppu_y) - } - } - case .iTXt, .zTXt, .tEXt: - res, ok_text := text(c) - if ok_text { - if c.header.type == .iTXt { - fmt.printf("[iTXt] %v (%v:%v): %v\n", res.keyword, res.language, res.keyword_localized, res.text) - } else { - fmt.printf("[tEXt/zTXt] %v: %v\n", res.keyword, res.text) - } - } - defer text_destroy(res) - case .bKGD: - fmt.printf("[bKGD] %v\n", img.background) - case .eXIf: - if res, ok_exif := exif(c); ok_exif { - /* - Other than checking the signature and byte order, we don't handle Exif data. - If you wish to interpret it, pass it to an Exif parser. - */ - fmt.printf("[eXIf] %v\n", res) - } - case .PLTE: - if plte, plte_ok := plte(c); plte_ok { - fmt.printf("[PLTE] %v\n", plte) - } else { - fmt.printf("[PLTE] Error\n") - } - case .hIST: - if res, ok_hist := hist(c); ok_hist { - fmt.printf("[hIST] %v\n", res) - } - case .cHRM: - if res, ok_chrm := chrm(c); ok_chrm { - fmt.printf("[cHRM] %v\n", res) - } - case .sPLT: - res, ok_splt := splt(c) - if ok_splt { - fmt.printf("[sPLT] %v\n", res) - } - splt_destroy(res) - case .sBIT: - if res, ok_sbit := sbit(c); ok_sbit { - fmt.printf("[sBIT] %v\n", res) - } - case .iCCP: - res, ok_iccp := iccp(c) - if ok_iccp { - fmt.printf("[iCCP] %v\n", res) - } - iccp_destroy(res) - case .sRGB: - if res, ok_srgb := srgb(c); ok_srgb { - fmt.printf("[sRGB] Rendering intent: %v\n", res) - } - case: - type := c.header.type - name := chunk_type_to_name(&type) - fmt.printf("[%v]: %v\n", name, c.data) - } - } - } - } - - fmt.printf("Done parsing metadata.\n") - - if err == nil && .do_not_decompress_image not_in options && .info not_in options { - if ok := write_image_as_ppm("out.ppm", img); ok { - fmt.println("Saved decoded image.") - } else { - fmt.println("Error saving out.ppm.") - fmt.println(img) - } - } - } - - // Crappy PPM writer used during testing. Don't use in production. - write_image_as_ppm :: proc(filename: string, image: ^image.Image) -> (success: bool) { - - _bg :: proc(bg: Maybe([3]u16), x, y: int, high := true) -> (res: [3]u16) { - if v, ok := bg.?; ok { - res = v - } else { - if high { - l := u16(30 * 256 + 30) - - if (x & 4 == 0) ~ (y & 4 == 0) { - res = [3]u16{l, 0, l} - } else { - res = [3]u16{l >> 1, 0, l >> 1} - } - } else { - if (x & 4 == 0) ~ (y & 4 == 0) { - res = [3]u16{30, 30, 30} - } else { - res = [3]u16{15, 15, 15} - } - } - } - return - } - - // profiler.timed_proc(); - using image - using os - - flags: int = O_WRONLY|O_CREATE|O_TRUNC - - img := image - - // PBM 16-bit images are big endian - when ODIN_ENDIAN == .Little { - if img.depth == 16 { - // The pixel components are in Big Endian. Let's byteswap back. - input := mem.slice_data_cast([]u16, img.pixels.buf[:]) - output := mem.slice_data_cast([]u16be, img.pixels.buf[:]) - #no_bounds_check for v, i in input { - output[i] = u16be(v) - } - } - } - - pix := bytes.buffer_to_bytes(&img.pixels) - - if len(pix) == 0 || len(pix) < image.width * image.height * int(image.channels) { - return false - } - - mode: int = 0 - when ODIN_OS == .Linux || ODIN_OS == .Darwin { - // NOTE(justasd): 644 (owner read, write; group read; others read) - mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH - } - - fd, err := open(filename, flags, mode) - if err != nil { - return false - } - defer close(fd) - - write_string(fd, - fmt.tprintf("P6\n%v %v\n%v\n", width, height, uint(1 << uint(depth) - 1)), - ) - - if channels == 3 { - // We don't handle transparency here... - write_ptr(fd, raw_data(pix), len(pix)) - } else { - bpp := depth == 16 ? 2 : 1 - bytes_needed := width * height * 3 * bpp - - op := bytes.Buffer{} - bytes.buffer_init_allocator(&op, bytes_needed, bytes_needed) - defer bytes.buffer_destroy(&op) - - if channels == 1 { - if depth == 16 { - assert(len(pix) == width * height * 2) - p16 := mem.slice_data_cast([]u16, pix) - o16 := mem.slice_data_cast([]u16, op.buf[:]) - #no_bounds_check for len(p16) != 0 { - r := u16(p16[0]) - o16[0] = r - o16[1] = r - o16[2] = r - p16 = p16[1:] - o16 = o16[3:] - } - } else { - o := 0 - for i := 0; i < len(pix); i += 1 { - r := pix[i] - op.buf[o ] = r - op.buf[o+1] = r - op.buf[o+2] = r - o += 3 - } - } - write_ptr(fd, raw_data(op.buf), len(op.buf)) - } else if channels == 2 { - if depth == 16 { - p16 := mem.slice_data_cast([]u16, pix) - o16 := mem.slice_data_cast([]u16, op.buf[:]) - - bgcol := img.background - - #no_bounds_check for len(p16) != 0 { - r := f64(u16(p16[0])) - bg: f64 - if bgcol != nil { - v := bgcol.([3]u16)[0] - bg = f64(v) - } - a := f64(u16(p16[1])) / 65535.0 - l := (a * r) + (1 - a) * bg - - o16[0] = u16(l) - o16[1] = u16(l) - o16[2] = u16(l) - - p16 = p16[2:] - o16 = o16[3:] - } - } else { - o := 0 - for i := 0; i < len(pix); i += 2 { - r := pix[i]; a := pix[i+1]; a1 := f32(a) / 255.0 - c := u8(f32(r) * a1) - op.buf[o ] = c - op.buf[o+1] = c - op.buf[o+2] = c - o += 3 - } - } - write_ptr(fd, raw_data(op.buf), len(op.buf)) - } else if channels == 4 { - if depth == 16 { - p16 := mem.slice_data_cast([]u16be, pix) - o16 := mem.slice_data_cast([]u16be, op.buf[:]) - - #no_bounds_check for len(p16) != 0 { - - bg := _bg(img.background, 0, 0) - r := f32(p16[0]) - g := f32(p16[1]) - b := f32(p16[2]) - a := f32(p16[3]) / 65535.0 - - lr := (a * r) + (1 - a) * f32(bg[0]) - lg := (a * g) + (1 - a) * f32(bg[1]) - lb := (a * b) + (1 - a) * f32(bg[2]) - - o16[0] = u16be(lr) - o16[1] = u16be(lg) - o16[2] = u16be(lb) - - p16 = p16[4:] - o16 = o16[3:] - } - } else { - o := 0 - - for i := 0; i < len(pix); i += 4 { - - x := (i / 4) % width - y := i / width / 4 - - _b := _bg(img.background, x, y, false) - bgcol := [3]u8{u8(_b[0]), u8(_b[1]), u8(_b[2])} - - r := f32(pix[i]) - g := f32(pix[i+1]) - b := f32(pix[i+2]) - a := f32(pix[i+3]) / 255.0 - - lr := u8(f32(r) * a + (1 - a) * f32(bgcol[0])) - lg := u8(f32(g) * a + (1 - a) * f32(bgcol[1])) - lb := u8(f32(b) * a + (1 - a) * f32(bgcol[2])) - op.buf[o ] = lr - op.buf[o+1] = lg - op.buf[o+2] = lb - o += 3 - } - } - write_ptr(fd, raw_data(op.buf), len(op.buf)) - } else { - return false - } - } - return true - } -*/ -package png diff --git a/core/image/png/png_os.odin b/core/image/png/png_os.odin index 8e0706206..c6a88fa52 100644 --- a/core/image/png/png_os.odin +++ b/core/image/png/png_os.odin @@ -1,19 +1,19 @@ #+build !js package png -import "core:os" +import os "core:os/os2" load :: proc{load_from_file, load_from_bytes, load_from_context} load_from_file :: proc(filename: string, options := Options{}, allocator := context.allocator) -> (img: ^Image, err: Error) { context.allocator = allocator - data, ok := os.read_entire_file(filename) - defer delete(data) + data, data_err := os.read_entire_file(filename, allocator) + defer delete(data, allocator) - if ok { + if data_err == nil { return load_from_bytes(data, options) } else { return nil, .Unable_To_Read_File } -} +} \ No newline at end of file diff --git a/core/image/qoi/qoi_os.odin b/core/image/qoi/qoi_os.odin index c85fdd839..a65527d09 100644 --- a/core/image/qoi/qoi_os.odin +++ b/core/image/qoi/qoi_os.odin @@ -1,12 +1,26 @@ #+build !js package qoi -import "core:os" -import "core:bytes" +import os "core:os/os2" +import "core:bytes" + +load :: proc{load_from_file, load_from_bytes, load_from_context} + +load_from_file :: proc(filename: string, options := Options{}, allocator := context.allocator) -> (img: ^Image, err: Error) { + context.allocator = allocator + + data, data_err := os.read_entire_file(filename, allocator) + defer delete(data, allocator) + + if data_err == nil { + return load_from_bytes(data, options) + } else { + return nil, .Unable_To_Read_File + } +} save :: proc{save_to_buffer, save_to_file} - save_to_file :: proc(output: string, img: ^Image, options := Options{}, allocator := context.allocator) -> (err: Error) { context.allocator = allocator @@ -14,24 +28,7 @@ save_to_file :: proc(output: string, img: ^Image, options := Options{}, allocato defer bytes.buffer_destroy(out) save_to_buffer(out, img, options) or_return - write_ok := os.write_entire_file(output, out.buf[:]) + write_err := os.write_entire_file(output, out.buf[:]) - return nil if write_ok else .Unable_To_Write_File -} - - -load :: proc{load_from_file, load_from_bytes, load_from_context} - - -load_from_file :: proc(filename: string, options := Options{}, allocator := context.allocator) -> (img: ^Image, err: Error) { - context.allocator = allocator - - data, ok := os.read_entire_file(filename) - defer delete(data) - - if ok { - return load_from_bytes(data, options) - } else { - return nil, .Unable_To_Read_File - } + return nil if write_err == nil else .Unable_To_Write_File } \ No newline at end of file diff --git a/core/image/tga/tga_os.odin b/core/image/tga/tga_os.odin index a78998105..2c103b34a 100644 --- a/core/image/tga/tga_os.odin +++ b/core/image/tga/tga_os.odin @@ -1,8 +1,23 @@ #+build !js package tga -import "core:os" -import "core:bytes" +import os "core:os/os2" +import "core:bytes" + +load :: proc{load_from_file, load_from_bytes, load_from_context} + +load_from_file :: proc(filename: string, options := Options{}, allocator := context.allocator) -> (img: ^Image, err: Error) { + context.allocator = allocator + + data, data_err := os.read_entire_file(filename, allocator) + defer delete(data) + + if data_err == nil { + return load_from_bytes(data, options) + } else { + return nil, .Unable_To_Read_File + } +} save :: proc{save_to_buffer, save_to_file} @@ -13,22 +28,7 @@ save_to_file :: proc(output: string, img: ^Image, options := Options{}, allocato defer bytes.buffer_destroy(out) save_to_buffer(out, img, options) or_return - write_ok := os.write_entire_file(output, out.buf[:]) + write_err := os.write_entire_file(output, out.buf[:]) - return nil if write_ok else .Unable_To_Write_File -} - -load :: proc{load_from_file, load_from_bytes, load_from_context} - -load_from_file :: proc(filename: string, options := Options{}, allocator := context.allocator) -> (img: ^Image, err: Error) { - context.allocator = allocator - - data, ok := os.read_entire_file(filename) - defer delete(data) - - if ok { - return load_from_bytes(data, options) - } else { - return nil, .Unable_To_Read_File - } + return nil if write_err == nil else .Unable_To_Write_File } \ No newline at end of file From 9c1a9c80f8cd16b7ad57ca672eccf8f020cecbb5 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 02:07:03 +0100 Subject: [PATCH 351/766] core:os -> core:os/os for core:math/big --- core/math/big/radix.odin | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/core/math/big/radix.odin b/core/math/big/radix.odin index 9c87440fc..c0ea8cb79 100644 --- a/core/math/big/radix.odin +++ b/core/math/big/radix.odin @@ -15,9 +15,9 @@ package math_big - Also look at extracting and splatting several digits at once. */ -import "base:intrinsics" -import "core:mem" -import "core:os" +import "base:intrinsics" +import "core:mem" +import os "core:os/os2" /* This version of `itoa` allocates on behalf of the caller. The caller must free the string. @@ -407,11 +407,10 @@ internal_int_read_from_ascii_file :: proc(a: ^Int, filename: string, radix := i8 For now, we'll read the entire file. Eventually we'll replace this with a copy that duplicates the logic of `atoi` so we don't need to read the entire file. */ - - res, ok := os.read_entire_file(filename, allocator) + res, res_err := os.read_entire_file(filename, allocator) defer delete(res, allocator) - if !ok { + if res_err != nil { return .Cannot_Read_File } @@ -441,8 +440,8 @@ internal_int_write_to_ascii_file :: proc(a: ^Int, filename: string, radix := i8( len = l, } - ok := os.write_entire_file(filename, data, truncate=true) - return nil if ok else .Cannot_Write_File + write_err := os.write_entire_file(filename, data, truncate=true) + return nil if write_err == nil else .Cannot_Write_File } /* From a86ec959441dc9433074dba03373f53b6f05622a Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 02:39:19 +0100 Subject: [PATCH 352/766] Address wasi errors --- core/os/os2/dir_wasi.odin | 1 - core/os/os2/file_wasi.odin | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/core/os/os2/dir_wasi.odin b/core/os/os2/dir_wasi.odin index 61c005674..9804f07fd 100644 --- a/core/os/os2/dir_wasi.odin +++ b/core/os/os2/dir_wasi.odin @@ -1,7 +1,6 @@ #+private package os2 -import "base:runtime" import "core:slice" import "base:intrinsics" import "core:sys/wasm/wasi" diff --git a/core/os/os2/file_wasi.odin b/core/os/os2/file_wasi.odin index fc37ef9f2..31153ae31 100644 --- a/core/os/os2/file_wasi.odin +++ b/core/os/os2/file_wasi.odin @@ -1,3 +1,4 @@ +#+feature global-context #+private package os2 From 4eab15130f1462f564f13f9a98ea54545088b411 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 12:43:55 +0100 Subject: [PATCH 353/766] Add updated PNG example --- core/image/png/example.odin | 136 ++++++++++++++++++++++++++++++++++++ core/image/png/png.odin | 2 + 2 files changed, 138 insertions(+) create mode 100644 core/image/png/example.odin diff --git a/core/image/png/example.odin b/core/image/png/example.odin new file mode 100644 index 000000000..cab6e4de1 --- /dev/null +++ b/core/image/png/example.odin @@ -0,0 +1,136 @@ +#+build ignore +package png_example + +import "core:image" +import "core:image/png" +import "core:image/tga" +import "core:fmt" +import "core:mem" + +demo :: proc() { + options := image.Options{.return_metadata} + err: image.Error + img: ^image.Image + + PNG_FILE :: ODIN_ROOT + "misc/logo-slim.png" + + img, err = png.load(PNG_FILE, options) + defer png.destroy(img) + + if err != nil { + fmt.eprintfln("Trying to read PNG file %v returned %v.", PNG_FILE, err) + } else { + fmt.printfln("Image: %vx%vx%v, %v-bit.", img.width, img.height, img.channels, img.depth) + + if v, ok := img.metadata.(^image.PNG_Info); ok { + // Handle ancillary chunks as you wish. + // We provide helper functions for a few types. + for c in v.chunks { + #partial switch c.header.type { + case .tIME: + if t, t_ok := png.core_time(c); t_ok { + fmt.printfln("[tIME]: %v", t) + } + case .gAMA: + if gama, gama_ok := png.gamma(c); gama_ok { + fmt.printfln("[gAMA]: %v", gama) + } + case .pHYs: + if phys, phys_ok := png.phys(c); phys_ok { + if phys.unit == .Meter { + xm := f32(img.width) / f32(phys.ppu_x) + ym := f32(img.height) / f32(phys.ppu_y) + dpi_x, dpi_y := png.phys_to_dpi(phys) + fmt.printfln("[pHYs] Image resolution is %v x %v pixels per meter.", phys.ppu_x, phys.ppu_y) + fmt.printfln("[pHYs] Image resolution is %v x %v DPI.", dpi_x, dpi_y) + fmt.printfln("[pHYs] Image dimensions are %v x %v meters.", xm, ym) + } else { + fmt.printfln("[pHYs] x: %v, y: %v pixels per unknown unit.", phys.ppu_x, phys.ppu_y) + } + } + case .iTXt, .zTXt, .tEXt: + res, ok_text := png.text(c) + if ok_text { + if c.header.type == .iTXt { + fmt.printfln("[iTXt] %v (%v:%v): %v", res.keyword, res.language, res.keyword_localized, res.text) + } else { + fmt.printfln("[tEXt/zTXt] %v: %v", res.keyword, res.text) + } + } + defer png.text_destroy(res) + case .bKGD: + fmt.printfln("[bKGD] %v", img.background) + case .eXIf: + if res, ok_exif := png.exif(c); ok_exif { + /* + Other than checking the signature and byte order, we don't handle Exif data. + If you wish to interpret it, pass it to an Exif parser. + */ + fmt.printfln("[eXIf] %v", res) + } + case .PLTE: + if plte, plte_ok := png.plte(c); plte_ok { + fmt.printfln("[PLTE] %v", plte) + } else { + fmt.printfln("[PLTE] Error") + } + case .hIST: + if res, ok_hist := png.hist(c); ok_hist { + fmt.printfln("[hIST] %v", res) + } + case .cHRM: + if res, ok_chrm := png.chrm(c); ok_chrm { + fmt.printfln("[cHRM] %v", res) + } + case .sPLT: + res, ok_splt := png.splt(c) + if ok_splt { + fmt.printfln("[sPLT] %v", res) + } + png.splt_destroy(res) + case .sBIT: + if res, ok_sbit := png.sbit(c); ok_sbit { + fmt.printfln("[sBIT] %v", res) + } + case .iCCP: + res, ok_iccp := png.iccp(c) + if ok_iccp { + fmt.printfln("[iCCP] %v", res) + } + png.iccp_destroy(res) + case .sRGB: + if res, ok_srgb := png.srgb(c); ok_srgb { + fmt.printfln("[sRGB] Rendering intent: %v", res) + } + case: + type := c.header.type + name := png.chunk_type_to_name(&type) + fmt.printfln("[%v]: %v", name, c.data) + } + } + } + } + + fmt.printfln("Done parsing metadata.") + + if err == nil && .do_not_decompress_image not_in options && .info not_in options { + if err = tga.save("out.tga", img); err == nil { + fmt.println("Saved decoded image.") + } else { + fmt.eprintfln("Error %v saving out.ppm.", err) + } + } +} + +main :: proc() { + track: mem.Tracking_Allocator + mem.tracking_allocator_init(&track, context.allocator) + defer mem.tracking_allocator_destroy(&track) + context.allocator = mem.tracking_allocator(&track) + + demo() + + for _, leak in track.allocation_map { + fmt.printf("%v leaked %m", leak.location, leak.size) + } +} \ No newline at end of file diff --git a/core/image/png/png.odin b/core/image/png/png.odin index 0170d3168..5a0913cff 100644 --- a/core/image/png/png.odin +++ b/core/image/png/png.odin @@ -1,4 +1,6 @@ #+feature using-stmt +// Reader for `PNG` images. +// The PNG specification is at [[ https://www.w3.org/TR/PNG/ ]]. package png /* From e094de58746e2d982b6a23e28c5db2870b45d43d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 11:13:34 +0100 Subject: [PATCH 354/766] Add `loc := #caller_location` to `read_entire_file` --- core/encoding/hxa/read.odin | 4 ++-- core/os/os2/file_util.odin | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/core/encoding/hxa/read.odin b/core/encoding/hxa/read.odin index 04dcab817..1f1c3633e 100644 --- a/core/encoding/hxa/read.odin +++ b/core/encoding/hxa/read.odin @@ -14,10 +14,10 @@ Read_Error :: enum { read_from_file :: proc(filename: string, print_error := false, allocator := context.allocator, loc := #caller_location) -> (file: File, err: Read_Error) { context.allocator = allocator - data, data_err := os.read_entire_file(filename, allocator) + data, data_err := os.read_entire_file(filename, allocator, loc) if data_err != nil { err = .Unable_To_Read_File - delete(data, allocator, loc) + delete(data, allocator) return } file, err = read(data, filename, print_error, allocator) diff --git a/core/os/os2/file_util.odin b/core/os/os2/file_util.odin index c2cf7c121..f81dc2190 100644 --- a/core/os/os2/file_util.odin +++ b/core/os/os2/file_util.odin @@ -156,9 +156,12 @@ read_entire_file :: proc{ */ @(require_results) read_entire_file_from_path :: proc(name: string, allocator: runtime.Allocator, loc := #caller_location) -> (data: []byte, err: Error) { - f := open(name) or_return + f, ferr := open(name) + if ferr != nil { + return nil, ferr + } defer close(f) - return read_entire_file_from_file(f, allocator, loc) + return read_entire_file_from_file(f=f, allocator=allocator, loc=loc) } /* From 02477b25264659f10889ce84e57a6603d9d613a2 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 11:16:56 +0100 Subject: [PATCH 355/766] eprintf --- core/encoding/csv/doc.odin | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/encoding/csv/doc.odin b/core/encoding/csv/doc.odin index 58e2a7ac5..c6dae3005 100644 --- a/core/encoding/csv/doc.odin +++ b/core/encoding/csv/doc.odin @@ -22,7 +22,7 @@ Example: if csv_err == nil { csv.reader_init_with_string(&r, string(csv_data)) } else { - fmt.printfln("Unable to open file: %v. Error: %v", filename, csv_err) + fmt.eprintfln("Unable to open file: %v. Error: %v", filename, csv_err) return } @@ -46,7 +46,7 @@ Example: handle, err := os.open(filename) defer os.close(handle) if err != nil { - fmt.eprintfln("Error %v opening file: %v", err, filename) + fmt.eprintfln("Unable to open file: %v. Error: %v", filename, err) return } csv.reader_init(&r, handle.stream) @@ -67,12 +67,11 @@ Example: csv_data, csv_err := os.read_entire_file(filename, context.allocator) defer delete(csv_data, context.allocator) - if csv_err == nil { - csv.reader_init_with_string(&r, string(csv_data)) - } else { - fmt.printfln("Unable to open file: %v. Error: %v", filename, csv_err) + if err != nil { + fmt.eprintfln("Unable to open file: %v. Error: %v", filename, csv_err) return } + csv.reader_init_with_string(&r, string(csv_data)) records, err := csv.read_all(&r) if err != nil { /* Do something with CSV parse error */ } From 456f9b17edd7104ebd6d938aa565b59023be7f2d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 14:20:28 +0100 Subject: [PATCH 356/766] `core:os` -> `core:os/os2` in `core:terminal` --- core/terminal/terminal.odin | 8 ++++---- core/terminal/terminal_js.odin | 4 +--- core/terminal/terminal_posix.odin | 13 ++++++++----- core/terminal/terminal_windows.odin | 12 +++++++----- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/core/terminal/terminal.odin b/core/terminal/terminal.odin index 37fdaff36..d24b963d3 100644 --- a/core/terminal/terminal.odin +++ b/core/terminal/terminal.odin @@ -1,7 +1,7 @@ // Interaction with the command line interface (`CLI`) of the system. package terminal -import "core:os" +import os "core:os/os2" /* This describes the range of colors that a terminal is capable of supporting. @@ -15,14 +15,14 @@ Color_Depth :: enum { } /* -Returns true if the file `handle` is attached to a terminal. +Returns true if the `File` is attached to a terminal. This is normally true for `os.stdout` and `os.stderr` unless they are redirected to a file. */ @(require_results) -is_terminal :: proc(handle: os.Handle) -> bool { - return _is_terminal(handle) +is_terminal :: proc(f: ^os.File) -> bool { + return _is_terminal(f) } /* diff --git a/core/terminal/terminal_js.odin b/core/terminal/terminal_js.odin index 4dcd4465e..78c6c240f 100644 --- a/core/terminal/terminal_js.odin +++ b/core/terminal/terminal_js.odin @@ -2,9 +2,7 @@ #+build js package terminal -import "core:os" - -_is_terminal :: proc "contextless" (handle: os.Handle) -> bool { +_is_terminal :: proc "contextless" (handle: any) -> bool { return true } diff --git a/core/terminal/terminal_posix.odin b/core/terminal/terminal_posix.odin index 8d96dd256..341b9084b 100644 --- a/core/terminal/terminal_posix.odin +++ b/core/terminal/terminal_posix.odin @@ -2,12 +2,15 @@ #+build linux, darwin, netbsd, openbsd, freebsd, haiku package terminal -import "base:runtime" -import "core:os" -import "core:sys/posix" +import "base:runtime" +import os "core:os/os2" +import "core:sys/posix" -_is_terminal :: proc "contextless" (handle: os.Handle) -> bool { - return bool(posix.isatty(posix.FD(handle))) +_is_terminal :: proc "contextless" (f: ^os.File) -> bool { + context = runtime.default_context() + fd := os.fd(f) + is_tty := posix.isatty(posix.FD(fd)) + return bool(is_tty) } _init_terminal :: proc "contextless" () { diff --git a/core/terminal/terminal_windows.odin b/core/terminal/terminal_windows.odin index 6d5f98a1f..d1ade13f3 100644 --- a/core/terminal/terminal_windows.odin +++ b/core/terminal/terminal_windows.odin @@ -1,12 +1,14 @@ #+private package terminal -import "base:runtime" -import "core:os" -import "core:sys/windows" +import "base:runtime" +import os "core:os/os2" +import "core:sys/windows" -_is_terminal :: proc "contextless" (handle: os.Handle) -> bool { - is_tty := windows.GetFileType(windows.HANDLE(handle)) == windows.FILE_TYPE_CHAR +_is_terminal :: proc "contextless" (f: ^os.File) -> bool { + context = runtime.default_context() + fd := os.fd(f) + is_tty := windows.GetFileType(windows.HANDLE(fd)) == windows.FILE_TYPE_CHAR return is_tty } From 47786deddc32f00243779995ff3a9e8f52713cf2 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 19:01:25 +0100 Subject: [PATCH 357/766] In the middle of porting core:testing --- core/fmt/fmt_js.odin | 30 +++++++++++------------ core/fmt/fmt_os.odin | 34 ++++++++++++++------------- core/log/file_console_logger.odin | 34 +++++++++++++-------------- core/os/os2/file.odin | 7 +++++- core/os/os2/file_js.odin | 3 +++ core/os/os2/file_linux.odin | 12 ++++++++++ core/os/os2/file_posix.odin | 6 +++++ core/os/os2/file_posix_darwin.odin | 2 +- core/os/os2/file_wasi.odin | 4 ++++ core/os/os2/file_windows.odin | 5 ++++ core/os/os2/process.odin | 15 ++++++++++++ core/os/os2/process_freebsd.odin | 33 ++++++++++++++++++++++++++ core/os/os2/process_js.odin | 8 +++++++ core/os/os2/process_linux.odin | 18 ++++++++++++++ core/os/os2/process_netbsd.odin | 28 ++++++++++++++++++++++ core/os/os2/process_openbsd.odin | 20 ++++++++++++++++ core/os/os2/process_posix_darwin.odin | 29 +++++++++++++++++++++-- core/os/os2/process_wasi.odin | 8 +++++++ core/os/os2/process_windows.odin | 30 +++++++++++++++++++++++ core/os/os_darwin.odin | 2 +- core/terminal/internal.odin | 8 +++---- core/terminal/terminal_posix.odin | 6 +---- core/terminal/terminal_windows.odin | 5 +--- core/testing/runner.odin | 8 +++---- core/testing/signal_handler_libc.odin | 10 ++++---- 25 files changed, 289 insertions(+), 76 deletions(-) create mode 100644 core/os/os2/process_freebsd.odin create mode 100644 core/os/os2/process_netbsd.odin create mode 100644 core/os/os2/process_openbsd.odin diff --git a/core/fmt/fmt_js.odin b/core/fmt/fmt_js.odin index 4ec6bd9a8..de9e12cdc 100644 --- a/core/fmt/fmt_js.odin +++ b/core/fmt/fmt_js.odin @@ -1,9 +1,9 @@ #+build js package fmt -import "core:bufio" -import "core:io" -import "core:os" +import "core:bufio" +import "core:io" +import os "core:os/os2" foreign import "odin_env" @@ -34,52 +34,52 @@ stderr := io.Writer{ } @(private="file") -fd_to_writer :: proc(fd: os.Handle, loc := #caller_location) -> io.Writer { - switch fd { - case 1: return stdout - case 2: return stderr +fd_to_writer :: proc(f: ^os.File, loc := #caller_location) -> io.Writer { + switch { + case f == os.stdout: return stdout + case f == os.stderr: return stderr case: panic("`fmt.fprint` variant called with invalid file descriptor for JS, only 1 (stdout) and 2 (stderr) are supported", loc) } } // fprint formats using the default print settings and writes to fd -fprint :: proc(fd: os.Handle, args: ..any, sep := " ", flush := true, loc := #caller_location) -> int { +fprint :: proc(f: ^os.File, args: ..any, sep := " ", flush := true, loc := #caller_location) -> int { buf: [1024]byte b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, fd_to_writer(fd, loc), buf[:]) + bufio.writer_init_with_buf(&b, fd_to_writer(f, loc), buf[:]) w := bufio.writer_to_writer(&b) return wprint(w, ..args, sep=sep, flush=flush) } // fprintln formats using the default print settings and writes to fd -fprintln :: proc(fd: os.Handle, args: ..any, sep := " ", flush := true, loc := #caller_location) -> int { +fprintln :: proc(f: ^os.File, args: ..any, sep := " ", flush := true, loc := #caller_location) -> int { buf: [1024]byte b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, fd_to_writer(fd, loc), buf[:]) + bufio.writer_init_with_buf(&b, fd_to_writer(f, loc), buf[:]) w := bufio.writer_to_writer(&b) return wprintln(w, ..args, sep=sep, flush=flush) } // fprintf formats according to the specified format string and writes to fd -fprintf :: proc(fd: os.Handle, fmt: string, args: ..any, flush := true, newline := false, loc := #caller_location) -> int { +fprintf :: proc(f: ^os.File, fmt: string, args: ..any, flush := true, newline := false, loc := #caller_location) -> int { buf: [1024]byte b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, fd_to_writer(fd, loc), buf[:]) + bufio.writer_init_with_buf(&b, fd_to_writer(f, loc), buf[:]) w := bufio.writer_to_writer(&b) return wprintf(w, fmt, ..args, flush=flush, newline=newline) } // fprintfln formats according to the specified format string and writes to fd, followed by a newline. -fprintfln :: proc(fd: os.Handle, fmt: string, args: ..any, flush := true, loc := #caller_location) -> int { - return fprintf(fd, fmt, ..args, flush=flush, newline=true, loc=loc) +fprintfln :: proc(f: ^os.File, fmt: string, args: ..any, flush := true, loc := #caller_location) -> int { + return fprintf(f, fmt, ..args, flush=flush, newline=true, loc=loc) } // print formats using the default print settings and writes to stdout diff --git a/core/fmt/fmt_os.odin b/core/fmt/fmt_os.odin index a481061f1..1f292c9e4 100644 --- a/core/fmt/fmt_os.odin +++ b/core/fmt/fmt_os.odin @@ -3,64 +3,66 @@ #+build !orca package fmt -import "base:runtime" -import "core:os" -import "core:io" -import "core:bufio" +import "base:runtime" +import os "core:os/os2" +import "core:io" +import "core:bufio" + +// NOTE(Jeroen): The other option is to deprecate `fprint*` and make it an alias for `wprint*`, using File.stream directly. // fprint formats using the default print settings and writes to fd -fprint :: proc(fd: os.Handle, args: ..any, sep := " ", flush := true) -> int { +fprint :: proc(f: ^os.File, args: ..any, sep := " ", flush := true) -> int { buf: [1024]byte b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, os.stream_from_handle(fd), buf[:]) + bufio.writer_init_with_buf(&b, f.stream, buf[:]) w := bufio.writer_to_writer(&b) return wprint(w, ..args, sep=sep, flush=flush) } // fprintln formats using the default print settings and writes to fd -fprintln :: proc(fd: os.Handle, args: ..any, sep := " ", flush := true) -> int { +fprintln :: proc(f: ^os.File, args: ..any, sep := " ", flush := true) -> int { buf: [1024]byte b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, os.stream_from_handle(fd), buf[:]) + bufio.writer_init_with_buf(&b, f.stream, buf[:]) w := bufio.writer_to_writer(&b) return wprintln(w, ..args, sep=sep, flush=flush) } // fprintf formats according to the specified format string and writes to fd -fprintf :: proc(fd: os.Handle, fmt: string, args: ..any, flush := true, newline := false) -> int { +fprintf :: proc(f: ^os.File, fmt: string, args: ..any, flush := true, newline := false) -> int { buf: [1024]byte b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, os.stream_from_handle(fd), buf[:]) + bufio.writer_init_with_buf(&b, f.stream, buf[:]) w := bufio.writer_to_writer(&b) return wprintf(w, fmt, ..args, flush=flush, newline=newline) } // fprintfln formats according to the specified format string and writes to fd, followed by a newline. -fprintfln :: proc(fd: os.Handle, fmt: string, args: ..any, flush := true) -> int { - return fprintf(fd, fmt, ..args, flush=flush, newline=true) +fprintfln :: proc(f: ^os.File, fmt: string, args: ..any, flush := true) -> int { + return fprintf(f, fmt, ..args, flush=flush, newline=true) } -fprint_type :: proc(fd: os.Handle, info: ^runtime.Type_Info, flush := true) -> (n: int, err: io.Error) { +fprint_type :: proc(f: ^os.File, info: ^runtime.Type_Info, flush := true) -> (n: int, err: io.Error) { buf: [1024]byte b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, os.stream_from_handle(fd), buf[:]) + bufio.writer_init_with_buf(&b, f.stream, buf[:]) w := bufio.writer_to_writer(&b) return wprint_type(w, info, flush=flush) } -fprint_typeid :: proc(fd: os.Handle, id: typeid, flush := true) -> (n: int, err: io.Error) { +fprint_typeid :: proc(f: ^os.File, id: typeid, flush := true) -> (n: int, err: io.Error) { buf: [1024]byte b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, os.stream_from_handle(fd), buf[:]) + bufio.writer_init_with_buf(&b, f.stream, buf[:]) w := bufio.writer_to_writer(&b) return wprint_typeid(w, id, flush=flush) diff --git a/core/log/file_console_logger.odin b/core/log/file_console_logger.odin index f0acc8a22..a9b073c18 100644 --- a/core/log/file_console_logger.odin +++ b/core/log/file_console_logger.odin @@ -2,13 +2,13 @@ #+build !orca package log -import "base:runtime" -import "core:fmt" -import "core:strings" -import "core:os" -import "core:terminal" -import "core:terminal/ansi" -import "core:time" +import "base:runtime" +import "core:fmt" +import "core:strings" +import os "core:os/os2" +import "core:terminal" +import "core:terminal/ansi" +import "core:time" Level_Headers := [?]string{ 0..<10 = "[DEBUG] --- ", @@ -35,7 +35,7 @@ Default_File_Logger_Opts :: Options{ File_Console_Logger_Data :: struct { - file_handle: os.Handle, + file_handle: ^os.File, ident: string, } @@ -66,16 +66,16 @@ init_standard_stream_status :: proc "contextless" () { } } -create_file_logger :: proc(h: os.Handle, lowest := Level.Debug, opt := Default_File_Logger_Opts, ident := "", allocator := context.allocator) -> Logger { +create_file_logger :: proc(f: ^os.File, lowest := Level.Debug, opt := Default_File_Logger_Opts, ident := "", allocator := context.allocator) -> Logger { data := new(File_Console_Logger_Data, allocator) - data.file_handle = h + data.file_handle = f data.ident = ident return Logger{file_logger_proc, data, lowest, opt} } destroy_file_logger :: proc(log: Logger, allocator := context.allocator) { data := cast(^File_Console_Logger_Data)log.data - if data.file_handle != os.INVALID_HANDLE { + if data.file_handle != nil { os.close(data.file_handle) } free(data, allocator) @@ -83,7 +83,7 @@ destroy_file_logger :: proc(log: Logger, allocator := context.allocator) { create_console_logger :: proc(lowest := Level.Debug, opt := Default_Console_Logger_Opts, ident := "", allocator := context.allocator) -> Logger { data := new(File_Console_Logger_Data, allocator) - data.file_handle = os.INVALID_HANDLE + data.file_handle = nil data.ident = ident return Logger{console_logger_proc, data, lowest, opt} } @@ -93,7 +93,7 @@ destroy_console_logger :: proc(log: Logger, allocator := context.allocator) { } @(private) -_file_console_logger_proc :: proc(h: os.Handle, ident: string, level: Level, text: string, options: Options, location: runtime.Source_Code_Location) { +_file_console_logger_proc :: proc(h: ^os.File, ident: string, level: Level, text: string, options: Options, location: runtime.Source_Code_Location) { backing: [1024]byte //NOTE(Hoej): 1024 might be too much for a header backing, unless somebody has really long paths. buf := strings.builder_from_bytes(backing[:]) @@ -106,9 +106,7 @@ _file_console_logger_proc :: proc(h: os.Handle, ident: string, level: Level, tex do_location_header(options, &buf, location) if .Thread_Id in options { - // NOTE(Oskar): not using context.thread_id here since that could be - // incorrect when replacing context for a thread. - fmt.sbprintf(&buf, "[{}] ", os.current_thread_id()) + fmt.sbprintf(&buf, "[{}] ", os.get_current_thread_id()) } if ident != "" { @@ -126,7 +124,7 @@ file_logger_proc :: proc(logger_data: rawptr, level: Level, text: string, option console_logger_proc :: proc(logger_data: rawptr, level: Level, text: string, options: Options, location := #caller_location) { options := options data := cast(^File_Console_Logger_Data)logger_data - h: os.Handle = --- + h: ^os.File = nil if level < Level.Error { h = os.stdout options -= global_subtract_stdout_options @@ -216,4 +214,4 @@ do_location_header :: proc(opts: Options, buf: ^strings.Builder, location := #ca } fmt.sbprint(buf, "] ") -} +} \ No newline at end of file diff --git a/core/os/os2/file.odin b/core/os/os2/file.odin index 33446726e..bf7ebaeb5 100644 --- a/core/os/os2/file.odin +++ b/core/os/os2/file.odin @@ -538,6 +538,11 @@ is_directory :: proc(path: string) -> bool { /* `copy_file` copies a file from `src_path` to `dst_path` and returns an error if any was encountered. */ +@(require_results) +is_tty :: proc "contextless" (f: ^File) -> bool { + return _is_tty(f) +} + copy_file :: proc(dst_path, src_path: string) -> Error { when #defined(_copy_file_native) { return _copy_file_native(dst_path, src_path) @@ -562,4 +567,4 @@ _copy_file :: proc(dst_path, src_path: string) -> Error { _, err := io.copy(to_writer(dst), to_reader(src)) return err -} +} \ No newline at end of file diff --git a/core/os/os2/file_js.odin b/core/os/os2/file_js.odin index fd4bf347c..492e3557f 100644 --- a/core/os/os2/file_js.odin +++ b/core/os/os2/file_js.odin @@ -29,6 +29,9 @@ _fd :: proc(f: ^File) -> uintptr { return 0 } +_is_tty :: proc "contextless" (f: ^File) -> bool { + return true +} _name :: proc(f: ^File) -> string { return "" diff --git a/core/os/os2/file_linux.odin b/core/os/os2/file_linux.odin index 924251dfc..f5f2ebdd7 100644 --- a/core/os/os2/file_linux.odin +++ b/core/os/os2/file_linux.odin @@ -6,6 +6,7 @@ import "core:io" import "core:time" import "core:sync" import "core:sys/linux" +import "core:sys/posix" // Most implementations will EINVAL at some point when doing big writes. // In practice a read/write call would probably never read/write these big buffers all at once, @@ -174,6 +175,17 @@ _fd :: proc(f: ^File) -> uintptr { return uintptr(impl.fd) } +_is_tty :: proc "contextless" (f: ^File) -> bool { + if f == nil || f.impl == nil { + return false + } + impl := (^File_Impl)(f.impl) + + // TODO: Replace `posix.isatty` with `tcgetattr(fd, &termios) == 0` + is_tty := posix.isatty(posix.FD(impl.fd)) + return bool(is_tty) +} + _name :: proc(f: ^File) -> string { return (^File_Impl)(f.impl).name if f != nil && f.impl != nil else "" } diff --git a/core/os/os2/file_posix.odin b/core/os/os2/file_posix.odin index cdc8e491a..1830c8509 100644 --- a/core/os/os2/file_posix.odin +++ b/core/os/os2/file_posix.odin @@ -161,6 +161,12 @@ __fd :: proc(f: ^File) -> posix.FD { return -1 } +is_tty :: proc "contextless" (f: ^File) -> bool { + fd := _fd(f) + is_tty := posix.isatty(posix.FD(fd)) + return bool(is_tty) +} + _name :: proc(f: ^File) -> string { if f != nil && f.impl != nil { return (^File_Impl)(f.impl).name diff --git a/core/os/os2/file_posix_darwin.odin b/core/os/os2/file_posix_darwin.odin index aed3e56f5..521fb345b 100644 --- a/core/os/os2/file_posix_darwin.odin +++ b/core/os/os2/file_posix_darwin.odin @@ -43,4 +43,4 @@ _copy_file_native :: proc(dst_path, src_path: string) -> (err: Error) { } return -} +} \ No newline at end of file diff --git a/core/os/os2/file_wasi.odin b/core/os/os2/file_wasi.odin index 31153ae31..1333ecf20 100644 --- a/core/os/os2/file_wasi.odin +++ b/core/os/os2/file_wasi.odin @@ -274,6 +274,10 @@ __fd :: proc(f: ^File) -> wasi.fd_t { return -1 } +_is_tty :: proc "contextless" (f: ^File) -> bool { + return false +} + _name :: proc(f: ^File) -> string { if f != nil && f.impl != nil { return (^File_Impl)(f.impl).name diff --git a/core/os/os2/file_windows.odin b/core/os/os2/file_windows.odin index 6f29d151c..0e3448dd7 100644 --- a/core/os/os2/file_windows.odin +++ b/core/os/os2/file_windows.odin @@ -246,6 +246,11 @@ _fd :: proc "contextless" (f: ^File) -> uintptr { return uintptr((^File_Impl)(f.impl).fd) } +_is_tty :: proc "contextless" (f: ^File) -> bool { + fd := _fd(f) + return win32.GetFileType(win32.HANDLE(fd)) == win32.FILE_TYPE_CHAR +} + _destroy :: proc(f: ^File_Impl) -> Error { if f == nil { return nil diff --git a/core/os/os2/process.odin b/core/os/os2/process.odin index 201d4f6e7..e4fecf2a5 100644 --- a/core/os/os2/process.odin +++ b/core/os/os2/process.odin @@ -120,6 +120,21 @@ get_ppid :: proc() -> int { return _get_ppid() } +/* +Obtain the current thread id +*/ +@(require_results) +get_current_thread_id :: proc "contextless" () -> int { + return _get_current_thread_id() +} + +/* +Return the number of cores +*/ +get_processor_core_count :: proc() -> int { + return _get_processor_core_count() +} + /* Obtain ID's of all processes running in the system. */ diff --git a/core/os/os2/process_freebsd.odin b/core/os/os2/process_freebsd.odin new file mode 100644 index 000000000..77f632192 --- /dev/null +++ b/core/os/os2/process_freebsd.odin @@ -0,0 +1,33 @@ +#+private +#+build freebsd + +foreign import libc "system:c" +foreign import dl "system:dl" + +foreign libc { + @(link_name="sysctlbyname") + _sysctlbyname :: proc(path: cstring, oldp: rawptr, oldlenp: rawptr, newp: rawptr, newlen: int) -> c.int --- +} + +foreign dl { + @(link_name="pthread_getthreadid_np") + pthread_getthreadid_np :: proc() -> c.int --- +} + +@(require_results) +_get_current_thread_id :: proc "contextless" () -> int { + return int(pthread_getthreadid_np()) +} + +@(require_results) +_get_processor_core_count :: proc() -> int { + count : int = 0 + count_size := size_of(count) + if _sysctlbyname("hw.ncpu", &count, &count_size, nil, 0) == 0 { + if count > 0 { + return count + } + } + + return 1 +} \ No newline at end of file diff --git a/core/os/os2/process_js.odin b/core/os/os2/process_js.odin index a2db3d56e..a59a79d45 100644 --- a/core/os/os2/process_js.odin +++ b/core/os/os2/process_js.odin @@ -34,6 +34,14 @@ _get_ppid :: proc() -> int { return 0 } +_get_current_thread_id :: proc "contextless" () -> int { + return 0 +} + +_get_processor_core_count :: proc() -> int { + return 1 +} + _process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) { err = .Unsupported return diff --git a/core/os/os2/process_linux.odin b/core/os/os2/process_linux.odin index 197693dc3..4afd9f3fc 100644 --- a/core/os/os2/process_linux.odin +++ b/core/os/os2/process_linux.odin @@ -5,12 +5,20 @@ package os2 import "base:runtime" import "base:intrinsics" +import "core:c" import "core:time" import "core:slice" import "core:strings" import "core:strconv" +import "core:sys/unix" import "core:sys/linux" +foreign import libc "system:c" + +foreign libc { + @(link_name="get_nprocs") _unix_get_nprocs :: proc() -> c.int --- +} + PIDFD_UNASSIGNED :: ~uintptr(0) @(private="package") @@ -43,6 +51,16 @@ _get_ppid :: proc() -> int { return int(linux.getppid()) } +@(private="package") +_get_current_thread_id :: proc "contextless" () -> int { + return unix.sys_gettid() +} + +@(private="package") +_get_processor_core_count :: proc() -> int { + return int(_unix_get_nprocs()) +} + @(private="package") _process_list :: proc(allocator: runtime.Allocator) -> (list: []int, err: Error) { temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) diff --git a/core/os/os2/process_netbsd.odin b/core/os/os2/process_netbsd.odin new file mode 100644 index 000000000..53e32a68c --- /dev/null +++ b/core/os/os2/process_netbsd.odin @@ -0,0 +1,28 @@ +#+private +#+build netbsd + +@(private) +foreign libc { + @(link_name="lwp_self") + _lwp_self :: proc() -> i32 --- + + @(link_name="sysctlbyname") + _sysctlbyname :: proc(path: cstring, oldp: rawptr, oldlenp: rawptr, newp: rawptr, newlen: int) -> c.int --- +} + +@(require_results) +_get_current_thread_id :: proc "contextless" () -> int { + return int(lwp_self()) +} + +_get_processor_core_count :: proc() -> int { + count : int = 0 + count_size := size_of(count) + if _sysctlbyname("hw.ncpu", &count, &count_size, nil, 0) == 0 { + if count > 0 { + return count + } + } + + return 1 +} \ No newline at end of file diff --git a/core/os/os2/process_openbsd.odin b/core/os/os2/process_openbsd.odin new file mode 100644 index 000000000..90f2b5412 --- /dev/null +++ b/core/os/os2/process_openbsd.odin @@ -0,0 +1,20 @@ +#+private +#+build openbsd + +@(default_calling_convention="c") +foreign libc { + @(link_name="getthrid") _unix_getthrid :: proc() -> int --- + @(link_name="sysconf") _sysconf :: proc(name: c.int) -> c.long --- +} + +@(require_results) +_get_current_thread_id :: proc "contextless" () -> int { + return _unix_getthrid() +} + +_SC_NPROCESSORS_ONLN :: 503 + +@(private, require_results) +_get_processor_core_count :: proc() -> int { + return int(_sysconf(_SC_NPROCESSORS_ONLN)) +} \ No newline at end of file diff --git a/core/os/os2/process_posix_darwin.odin b/core/os/os2/process_posix_darwin.odin index f655d42a9..d0be228bb 100644 --- a/core/os/os2/process_posix_darwin.odin +++ b/core/os/os2/process_posix_darwin.odin @@ -10,14 +10,39 @@ import "core:sys/posix" import "core:sys/unix" import "core:time" -foreign import lib "system:System" +foreign import libc "system:System" -foreign lib { +foreign libc { sysctl :: proc "c" ( name: [^]i32, namelen: u32, oldp: rawptr, oldlenp: ^uint, newp: rawptr, newlen: uint, ) -> posix.result --- + + @(link_name="sysctlbyname") + _sysctlbyname :: proc(path: cstring, oldp: rawptr, oldlenp: rawptr, newp: rawptr, newlen: int) -> c.int --- +} + +_get_current_thread_id :: proc "contextless" () -> int { + tid: u64 + // NOTE(Oskar): available from OSX 10.6 and iOS 3.2. + // For older versions there is `syscall(SYS_thread_selfid)`, but not really + // the same thing apparently. + foreign pthread { pthread_threadid_np :: proc "c" (rawptr, ^u64) -> c.int --- } + pthread_threadid_np(nil, &tid) + return int(tid) +} + +_processor_core_count :: proc() -> int { + count : int = 0 + count_size := size_of(count) + if _sysctlbyname("hw.logicalcpu", &count, &count_size, nil, 0) == 0 { + if count > 0 { + return count + } + } + + return 1 } _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) { diff --git a/core/os/os2/process_wasi.odin b/core/os/os2/process_wasi.odin index 52fdb1680..efb2c0228 100644 --- a/core/os/os2/process_wasi.odin +++ b/core/os/os2/process_wasi.odin @@ -30,6 +30,14 @@ _get_ppid :: proc() -> int { return 0 } +_get_current_thread_id :: proc "contextless" () -> int { + return 0 +} + +_get_processor_core_count :: proc() -> int { + return 1 +} + _process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) { err = .Unsupported return diff --git a/core/os/os2/process_windows.odin b/core/os/os2/process_windows.odin index 05ac9da93..b2c87c4f4 100644 --- a/core/os/os2/process_windows.odin +++ b/core/os/os2/process_windows.odin @@ -1,6 +1,7 @@ #+private file package os2 +import "base:intrinsics" import "base:runtime" import "core:strings" @@ -50,6 +51,35 @@ _get_ppid :: proc() -> int { return -1 } +@(private="package") +_get_current_thread_id :: proc "contextless" () -> int { + return int(win32.GetCurrentThreadId()) +} + +@(private="package") +_get_processor_core_count :: proc() -> int { + length : win32.DWORD = 0 + result := win32.GetLogicalProcessorInformation(nil, &length) + + thread_count := 0 + if !result && win32.GetLastError() == 122 && length > 0 { + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() + processors := make([]win32.SYSTEM_LOGICAL_PROCESSOR_INFORMATION, length, context.temp_allocator) + + result = win32.GetLogicalProcessorInformation(&processors[0], &length) + if result { + for processor in processors { + if processor.Relationship == .RelationProcessorCore { + thread := intrinsics.count_ones(processor.ProcessorMask) + thread_count += int(thread) + } + } + } + } + + return thread_count +} + @(private="package") _process_list :: proc(allocator: runtime.Allocator) -> (list: []int, err: Error) { snap := win32.CreateToolhelp32Snapshot(win32.TH32CS_SNAPPROCESS, 0) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index d8f7a9577..92a636255 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -598,7 +598,7 @@ foreign libc { @(link_name="fstat64") _unix_fstat :: proc(fd: Handle, stat: ^OS_Stat) -> c.int --- @(link_name="readlink") _unix_readlink :: proc(path: cstring, buf: ^byte, bufsiz: c.size_t) -> c.ssize_t --- @(link_name="access") _unix_access :: proc(path: cstring, mask: c.int) -> c.int --- - @(link_name="fsync") _unix_fsync :: proc(handle: Handle) -> c.int --- + @(link_name="fsync") _unix_fsync :: proc(handle: Handle) -> c.int --- @(link_name="dup") _unix_dup :: proc(handle: Handle) -> Handle --- @(link_name="fdopendir$INODE64") _unix_fdopendir_amd64 :: proc(fd: Handle) -> Dir --- diff --git a/core/terminal/internal.odin b/core/terminal/internal.odin index 47ed1818f..956726b8a 100644 --- a/core/terminal/internal.odin +++ b/core/terminal/internal.odin @@ -1,9 +1,9 @@ #+private package terminal -import "base:runtime" -import "core:os" -import "core:strings" +import "base:runtime" +import os "core:os/os2" +import "core:strings" // Reference documentation: // @@ -77,4 +77,4 @@ init_terminal :: proc "contextless" () { @(fini) fini_terminal :: proc "contextless" () { _fini_terminal() -} +} \ No newline at end of file diff --git a/core/terminal/terminal_posix.odin b/core/terminal/terminal_posix.odin index 341b9084b..751ef85cf 100644 --- a/core/terminal/terminal_posix.odin +++ b/core/terminal/terminal_posix.odin @@ -4,13 +4,9 @@ package terminal import "base:runtime" import os "core:os/os2" -import "core:sys/posix" _is_terminal :: proc "contextless" (f: ^os.File) -> bool { - context = runtime.default_context() - fd := os.fd(f) - is_tty := posix.isatty(posix.FD(fd)) - return bool(is_tty) + return os.is_tty(f) } _init_terminal :: proc "contextless" () { diff --git a/core/terminal/terminal_windows.odin b/core/terminal/terminal_windows.odin index d1ade13f3..78d21952b 100644 --- a/core/terminal/terminal_windows.odin +++ b/core/terminal/terminal_windows.odin @@ -6,10 +6,7 @@ import os "core:os/os2" import "core:sys/windows" _is_terminal :: proc "contextless" (f: ^os.File) -> bool { - context = runtime.default_context() - fd := os.fd(f) - is_tty := windows.GetFileType(windows.HANDLE(fd)) == windows.FILE_TYPE_CHAR - return is_tty + return os.is_tty(f) } old_modes: [2]struct{ diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 03115b165..a184578a6 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -20,7 +20,7 @@ import "core:io" @require import "core:log" import "core:math/rand" import "core:mem" -import "core:os" +import os "core:os/os2" import "core:slice" @require import "core:strings" import "core:sync/chan" @@ -219,8 +219,8 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { } } - stdout := io.to_writer(os.stream_from_handle(os.stdout)) - stderr := io.to_writer(os.stream_from_handle(os.stderr)) + stdout := os.stdout.stream + stderr := os.stderr.stream // The animations are only ever shown through STDOUT; // STDERR is used exclusively for logging regardless of error level. @@ -317,7 +317,7 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { // -- Set thread count. when TEST_THREADS == 0 { - thread_count := os.processor_core_count() + thread_count := os.get_processor_core_count() } else { thread_count := max(1, TEST_THREADS) } diff --git a/core/testing/signal_handler_libc.odin b/core/testing/signal_handler_libc.odin index 74608bb48..593d2c285 100644 --- a/core/testing/signal_handler_libc.odin +++ b/core/testing/signal_handler_libc.odin @@ -11,11 +11,11 @@ package testing blob1807: Windows Win32 API rewrite. */ -import "base:intrinsics" -import "core:c/libc" -import "core:os" -import "core:sync" -import "core:terminal/ansi" +import "base:intrinsics" +import "core:c/libc" +import os "core:os/os2" +import "core:sync" +import "core:terminal/ansi" @(private="file") stop_runner_flag: libc.sig_atomic_t From 14021f6444248a80fdda6fb5a4e002ab94e4d9a7 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 19:34:13 +0100 Subject: [PATCH 358/766] core:testing Darwin --- core/os/os2/file_posix.odin | 3 ++- core/os/os2/process_posix_darwin.odin | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/os/os2/file_posix.odin b/core/os/os2/file_posix.odin index 1830c8509..ef53bf116 100644 --- a/core/os/os2/file_posix.odin +++ b/core/os/os2/file_posix.odin @@ -161,7 +161,8 @@ __fd :: proc(f: ^File) -> posix.FD { return -1 } -is_tty :: proc "contextless" (f: ^File) -> bool { +_is_tty :: proc "contextless" (f: ^File) -> bool { + context = runtime.default_context() fd := _fd(f) is_tty := posix.isatty(posix.FD(fd)) return bool(is_tty) diff --git a/core/os/os2/process_posix_darwin.odin b/core/os/os2/process_posix_darwin.odin index d0be228bb..934d23711 100644 --- a/core/os/os2/process_posix_darwin.odin +++ b/core/os/os2/process_posix_darwin.odin @@ -5,12 +5,14 @@ import "base:runtime" import "base:intrinsics" import "core:bytes" +import "core:c" import "core:sys/darwin" import "core:sys/posix" import "core:sys/unix" import "core:time" -foreign import libc "system:System" +foreign import libc "system:System" +foreign import pthread "system:System" foreign libc { sysctl :: proc "c" ( @@ -33,7 +35,7 @@ _get_current_thread_id :: proc "contextless" () -> int { return int(tid) } -_processor_core_count :: proc() -> int { +_get_processor_core_count :: proc() -> int { count : int = 0 count_size := size_of(count) if _sysctlbyname("hw.logicalcpu", &count, &count_size, nil, 0) == 0 { From ab0f1aa0c43c4b71ef1b57f9b53b1e9ec16878bb Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 28 Oct 2025 19:40:04 +0100 Subject: [PATCH 359/766] BSDs --- core/os/os2/process_freebsd.odin | 3 +++ core/os/os2/process_netbsd.odin | 7 +++++-- core/os/os2/process_openbsd.odin | 5 +++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/core/os/os2/process_freebsd.odin b/core/os/os2/process_freebsd.odin index 77f632192..8a31eb62c 100644 --- a/core/os/os2/process_freebsd.odin +++ b/core/os/os2/process_freebsd.odin @@ -1,5 +1,8 @@ #+private #+build freebsd +package os2 + +import "core:c" foreign import libc "system:c" foreign import dl "system:dl" diff --git a/core/os/os2/process_netbsd.odin b/core/os/os2/process_netbsd.odin index 53e32a68c..b46a58e58 100644 --- a/core/os/os2/process_netbsd.odin +++ b/core/os/os2/process_netbsd.odin @@ -1,9 +1,12 @@ #+private #+build netbsd +package os2 + +import "core:c" +foreign import libc "system:c" @(private) foreign libc { - @(link_name="lwp_self") _lwp_self :: proc() -> i32 --- @(link_name="sysctlbyname") @@ -12,7 +15,7 @@ foreign libc { @(require_results) _get_current_thread_id :: proc "contextless" () -> int { - return int(lwp_self()) + return int(_lwp_self()) } _get_processor_core_count :: proc() -> int { diff --git a/core/os/os2/process_openbsd.odin b/core/os/os2/process_openbsd.odin index 90f2b5412..9c6605952 100644 --- a/core/os/os2/process_openbsd.odin +++ b/core/os/os2/process_openbsd.odin @@ -1,5 +1,10 @@ #+private #+build openbsd +package os2 + +import "core:c" + +foreign import libc "system:c" @(default_calling_convention="c") foreign libc { From 586355f4ac7f308b8a304078fbb15191ffbba952 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 29 Oct 2025 11:29:20 +0100 Subject: [PATCH 360/766] core:text/i18n -> core:os/os2 --- core/text/i18n/gettext.odin | 36 +++++++++------------------------ core/text/i18n/i18n.odin | 13 +++++++++++- core/text/i18n/qt_linguist.odin | 12 ++--------- 3 files changed, 23 insertions(+), 38 deletions(-) diff --git a/core/text/i18n/gettext.odin b/core/text/i18n/gettext.odin index a29fdc003..4aa86a35d 100644 --- a/core/text/i18n/gettext.odin +++ b/core/text/i18n/gettext.odin @@ -14,7 +14,6 @@ package i18n List of contributors: Jeroen van Rijn: Initial implementation. */ -import "core:os" import "core:strings" import "core:bytes" @@ -28,22 +27,17 @@ parse_mo_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTIONS, plur return {}, .MO_File_Invalid } - /* - Check magic. Should be 0x950412de in native Endianness. - */ + // Check magic. Should be 0x950412de in native Endianness. native := true magic := read_u32(data, native) or_return if magic != 0x950412de { native = false - magic = read_u32(data, native) or_return - + magic = read_u32(data, native) or_return if magic != 0x950412de { return {}, .MO_File_Invalid_Signature } } - /* - We can ignore version_minor at offset 6. - */ + // We can ignore version_minor at offset 6. version_major := read_u16(data[4:]) or_return if version_major > 1 { return {}, .MO_File_Unsupported_Version } @@ -53,17 +47,13 @@ parse_mo_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTIONS, plur if count == 0 { return {}, .Empty_Translation_Catalog } - /* - Initalize Translation, interner and optional pluralizer. - */ + // Initalize Translation, interner and optional pluralizer. translation = new(Translation) translation.pluralize = pluralizer strings.intern_init(&translation.intern, allocator, allocator) for n := u32(0); n < count; n += 1 { - /* - Grab string's original length and offset. - */ + // Grab string's original length and offset. offset := original_offset + 8 * n if len(data) < int(offset + 8) { return translation, .MO_File_Invalid } @@ -82,9 +72,7 @@ parse_mo_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTIONS, plur key_data := data[o_offset:][:o_length] val_data := data[t_offset:][:t_length] - /* - Could be a pluralized string. - */ + // Could be a pluralized string. zero := []byte{0} keys := bytes.split(key_data, zero); defer delete(keys) vals := bytes.split(val_data, zero); defer delete(vals) @@ -138,21 +126,14 @@ parse_mo_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTIONS, plur } parse_mo_file :: proc(filename: string, options := DEFAULT_PARSE_OPTIONS, pluralizer: proc(int) -> int = nil, allocator := context.allocator) -> (translation: ^Translation, err: Error) { - context.allocator = allocator - - data, data_ok := os.read_entire_file(filename) + data := read_file(filename, allocator) or_return defer delete(data) - - if !data_ok { return {}, .File_Error } - return parse_mo_from_bytes(data, options, pluralizer, allocator) } parse_mo :: proc { parse_mo_file, parse_mo_from_bytes } -/* - Helpers. -*/ +@(private) read_u32 :: proc(data: []u8, native_endian := true) -> (res: u32, err: Error) { if len(data) < size_of(u32) { return 0, .Premature_EOF } @@ -169,6 +150,7 @@ read_u32 :: proc(data: []u8, native_endian := true) -> (res: u32, err: Error) { } } +@(private) read_u16 :: proc(data: []u8, native_endian := true) -> (res: u16, err: Error) { if len(data) < size_of(u16) { return 0, .Premature_EOF } diff --git a/core/text/i18n/i18n.odin b/core/text/i18n/i18n.odin index b978bffc4..8b107a8cd 100644 --- a/core/text/i18n/i18n.odin +++ b/core/text/i18n/i18n.odin @@ -8,7 +8,9 @@ package i18n List of contributors: Jeroen van Rijn: Initial implementation. */ -import "core:strings" +import "base:runtime" +import os "core:os/os2" +import "core:strings" // Currently active catalog. ACTIVE: ^Translation @@ -229,4 +231,13 @@ destroy :: proc(catalog: ^Translation = ACTIVE, allocator := context.allocator) delete(catalog.k_v) strings.intern_destroy(&catalog.intern) free(catalog) +} + +@(private) +read_file :: proc(filename: string, allocator: runtime.Allocator) -> (data: []u8, err: Error) { + file_data, file_err := os.read_entire_file(filename, allocator) + if file_err != nil { + return {}, .File_Error + } + return file_data, nil } \ No newline at end of file diff --git a/core/text/i18n/qt_linguist.odin b/core/text/i18n/qt_linguist.odin index 2fc5efe7b..78fe2712d 100644 --- a/core/text/i18n/qt_linguist.odin +++ b/core/text/i18n/qt_linguist.odin @@ -11,7 +11,6 @@ package i18n List of contributors: Jeroen van Rijn: Initial implementation. */ -import "core:os" import "core:encoding/xml" import "core:strings" @@ -56,9 +55,7 @@ parse_qt_linguist_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTI return nil, .TS_File_Parse_Error } - /* - Initalize Translation, interner and optional pluralizer. - */ + // Initalize Translation, interner and optional pluralizer. translation = new(Translation) translation.pluralize = pluralizer strings.intern_init(&translation.intern, allocator, allocator) @@ -69,7 +66,6 @@ parse_qt_linguist_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTI child_id := get_id(value) or_return // These should be s. - if ts.elements[child_id].ident != "context" { return translation, .TS_File_Expected_Context } @@ -159,11 +155,7 @@ parse_qt_linguist_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTI } parse_qt_linguist_file :: proc(filename: string, options := DEFAULT_PARSE_OPTIONS, pluralizer: proc(int) -> int = nil, allocator := context.allocator) -> (translation: ^Translation, err: Error) { - context.allocator = allocator - - data, data_ok := os.read_entire_file(filename) - if !data_ok { return {}, .File_Error } - + data := read_file(filename, allocator) or_return return parse_qt_linguist_from_bytes(data, options, pluralizer, allocator) } From a4970191724182a14a4000c60c9a0677b7fa570d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 29 Oct 2025 14:11:14 +0100 Subject: [PATCH 361/766] core:text/regex -> core:os/os2 --- core/text/regex/common/debugging.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/text/regex/common/debugging.odin b/core/text/regex/common/debugging.odin index 1a241e136..e3fcb8b7e 100644 --- a/core/text/regex/common/debugging.odin +++ b/core/text/regex/common/debugging.odin @@ -8,14 +8,14 @@ package regex_common Feoramund: Initial implementation. */ -@require import "core:os" +@require import os "core:os/os2" import "core:io" import "core:strings" ODIN_DEBUG_REGEX :: #config(ODIN_DEBUG_REGEX, false) when ODIN_DEBUG_REGEX { - debug_stream := os.stream_from_handle(os.stderr) + debug_stream := os.stderr.stream } write_padded_hex :: proc(w: io.Writer, #any_int n, zeroes: int) { From c0da9be4a9e216d1c050c8b5c000a34f87c5a004 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 29 Oct 2025 14:18:12 +0100 Subject: [PATCH 362/766] core:text/table -> core:os/os2 --- core/text/table/utility.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/text/table/utility.odin b/core/text/table/utility.odin index 0e56fd968..99fd7d7ca 100644 --- a/core/text/table/utility.odin +++ b/core/text/table/utility.odin @@ -1,11 +1,11 @@ package text_table -import "core:io" -import "core:os" -import "core:strings" +import "core:io" +import os "core:os/os2" +import "core:strings" stdio_writer :: proc() -> io.Writer { - return io.to_writer(os.stream_from_handle(os.stdout)) + return os.stdout.stream } strings_builder_writer :: proc(b: ^strings.Builder) -> io.Writer { From 5d8de5860ba6b1234facfcd5db2d83db9a551f07 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 29 Oct 2025 14:40:15 +0100 Subject: [PATCH 363/766] gzip -> os2 --- core/compress/gzip/doc.odin | 54 +++++++++++++++++------------------- core/compress/gzip/gzip.odin | 22 ++++++--------- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/core/compress/gzip/doc.odin b/core/compress/gzip/doc.odin index c20ebc33a..82eaa6f35 100644 --- a/core/compress/gzip/doc.odin +++ b/core/compress/gzip/doc.odin @@ -2,10 +2,11 @@ A small `GZIP` unpacker. Example: - import "core:bytes" - import "core:os" - import "core:compress" - import "core:fmt" + import "core:bytes" + import os "core:os/os2" + import "core:compress" + import "core:compress/gzip" + import "core:fmt" // Small GZIP file with fextra, fname and fcomment present. @private @@ -22,7 +23,8 @@ Example: main :: proc() { // Set up output buffer. - buf := bytes.Buffer{} + buf: bytes.Buffer + defer bytes.buffer_destroy(&buf) stdout :: proc(s: string) { os.write_string(os.stdout, s) @@ -31,15 +33,13 @@ Example: os.write_string(os.stderr, s) } - args := os.args - - if len(args) < 2 { + if len(os.args) < 2 { stderr("No input file specified.\n") - err := load(data=TEST, buf=&buf, known_gzip_size=len(TEST)) + err := gzip.load(data=TEST, buf=&buf, known_gzip_size=len(TEST)) if err == nil { - stdout("Displaying test vector: ") + stdout("Displaying test vector: \"") stdout(bytes.buffer_to_string(&buf)) - stdout("\n") + stdout("\"\n") } else { fmt.printf("gzip.load returned %v\n", err) } @@ -47,35 +47,31 @@ Example: os.exit(0) } - // The rest are all files. - args = args[1:] - err: Error + for file in os.args[1:] { + err: gzip.Error - for file in args { if file == "-" { // Read from stdin - s := os.stream_from_handle(os.stdin) ctx := &compress.Context_Stream_Input{ - input = s, + input = os.stdin.stream, } - err = load(ctx, &buf) + err = gzip.load(ctx, &buf) } else { - err = load(file, &buf) + err = gzip.load(file, &buf) } - if err != nil { - if err != E_General.File_Not_Found { - stderr("File not found: ") - stderr(file) - stderr("\n") - os.exit(1) - } + switch err { + case nil: + stdout(bytes.buffer_to_string(&buf)) + case gzip.E_General.File_Not_Found: + stderr("File not found: ") + stderr(file) + stderr("\n") + os.exit(1) + case: stderr("GZIP returned an error.\n") - bytes.buffer_destroy(&buf) os.exit(2) } - stdout(bytes.buffer_to_string(&buf)) } - bytes.buffer_destroy(&buf) } */ package compress_gzip diff --git a/core/compress/gzip/gzip.odin b/core/compress/gzip/gzip.odin index 7dc8120e4..644a625e7 100644 --- a/core/compress/gzip/gzip.odin +++ b/core/compress/gzip/gzip.odin @@ -14,12 +14,12 @@ package compress_gzip to be the input to a complementary TAR implementation. */ -import "core:compress/zlib" -import "core:compress" -import "core:os" -import "core:io" -import "core:bytes" -import "core:hash" +import "core:compress/zlib" +import "core:compress" +import os "core:os/os2" +import "core:io" +import "core:bytes" +import "core:hash" Magic :: enum u16le { GZIP = 0x8b << 8 | 0x1f, @@ -107,14 +107,10 @@ load :: proc{load_from_bytes, load_from_file, load_from_context} load_from_file :: proc(filename: string, buf: ^bytes.Buffer, expected_output_size := -1, allocator := context.allocator) -> (err: Error) { context.allocator = allocator - data, ok := os.read_entire_file(filename) - defer delete(data) + file_data, file_err := os.read_entire_file(filename, allocator) + defer delete(file_data) - err = E_General.File_Not_Found - if ok { - err = load_from_bytes(data, buf, len(data), expected_output_size) - } - return + return load_from_bytes(file_data, buf, len(file_data), expected_output_size) if file_err == nil else E_General.File_Not_Found } load_from_bytes :: proc(data: []byte, buf: ^bytes.Buffer, known_gzip_size := -1, expected_output_size := -1, allocator := context.allocator) -> (err: Error) { From c2647673ec503938a302bd083f42602a5a000177 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 29 Oct 2025 15:43:31 +0100 Subject: [PATCH 364/766] mem.virtual -> os2 --- core/mem/virtual/doc.odin | 15 ++++++++++++++- core/mem/virtual/file.odin | 22 ++++++++++++++-------- core/mem/virtual/virtual_linux.odin | 5 ++++- core/mem/virtual/virtual_other.odin | 7 ++++++- core/mem/virtual/virtual_posix.odin | 4 ++++ core/mem/virtual/virtual_windows.odin | 7 +++++++ 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/core/mem/virtual/doc.odin b/core/mem/virtual/doc.odin index 614e290c3..6c6ce055f 100644 --- a/core/mem/virtual/doc.odin +++ b/core/mem/virtual/doc.odin @@ -1,7 +1,6 @@ /* A platform agnostic way to reserve/commit/decommit virtual memory. - virtual.Arena usage Example: @@ -56,7 +55,21 @@ Example: vmem.arena_destroy(&arena) } +virtual.map_file usage +Example: + // Source: https://github.com/odin-lang/examples/blob/master/arena_allocator/arena_allocator.odin + import "core:fmt" + + // virtual package implements cross-platform file memory mapping + import vmem "core:mem/virtual" + + main :: proc() { + data, err := virtual.map_file_from_path(#file, {.Read}) + defer virtual.unmap_file(data) + fmt.printfln("Error: %v", err) + fmt.printfln("Data: %s", data) + } */ package mem_virtual diff --git a/core/mem/virtual/file.odin b/core/mem/virtual/file.odin index 2f852b40c..c532335c5 100644 --- a/core/mem/virtual/file.odin +++ b/core/mem/virtual/file.odin @@ -1,6 +1,6 @@ package mem_virtual -import "core:os" +import os "core:os/os2" Map_File_Error :: enum { None, @@ -19,21 +19,20 @@ Map_File_Flags :: distinct bit_set[Map_File_Flag; u32] map_file :: proc{ map_file_from_path, - map_file_from_file_descriptor, + map_file_from_file, } map_file_from_path :: proc(filename: string, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { - fd, err := os.open(filename, os.O_RDWR) + f, err := os.open(filename, os.O_RDWR) if err != nil { return nil, .Open_Failure } - defer os.close(fd) - - return map_file_from_file_descriptor(uintptr(fd), flags) + defer os.close(f) + return map_file_from_file(f, flags) } -map_file_from_file_descriptor :: proc(fd: uintptr, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { - size, os_err := os.file_size(os.Handle(fd)) +map_file_from_file :: proc(f: ^os.File, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { + size, os_err := os.file_size(f) if os_err != nil { return nil, .Stat_Failure } @@ -43,5 +42,12 @@ map_file_from_file_descriptor :: proc(fd: uintptr, flags: Map_File_Flags) -> (da if size != i64(int(size)) { return nil, .Too_Large_Size } + fd := os.fd(f) return _map_file(fd, size, flags) } + +unmap_file :: proc(data: []byte) { + if raw_data(data) != nil { + _unmap_file(data) + } +} \ No newline at end of file diff --git a/core/mem/virtual/virtual_linux.odin b/core/mem/virtual/virtual_linux.odin index f819fbf86..144a8dc59 100644 --- a/core/mem/virtual/virtual_linux.odin +++ b/core/mem/virtual/virtual_linux.odin @@ -49,7 +49,6 @@ _platform_memory_init :: proc "contextless" () { assert_contextless(DEFAULT_PAGE_SIZE != 0 && (DEFAULT_PAGE_SIZE & (DEFAULT_PAGE_SIZE-1)) == 0) } - _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { prot: linux.Mem_Protection if .Read in flags { @@ -66,3 +65,7 @@ _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) } return ([^]byte)(addr)[:size], nil } + +_unmap_file :: proc "contextless" (data: []byte) { + _release(raw_data(data), uint(len(data))) +} \ No newline at end of file diff --git a/core/mem/virtual/virtual_other.odin b/core/mem/virtual/virtual_other.odin index c6386e842..8a2e1a61d 100644 --- a/core/mem/virtual/virtual_other.odin +++ b/core/mem/virtual/virtual_other.odin @@ -26,8 +26,13 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) } _platform_memory_init :: proc "contextless" () { + } -_map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { +_map_file :: proc "contextless" (f: any, size: i64, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { return nil, .Map_Failure } + +_unmap_file :: proc "contextless" (data: []byte) { + +} \ No newline at end of file diff --git a/core/mem/virtual/virtual_posix.odin b/core/mem/virtual/virtual_posix.odin index 4bb161770..6f257c385 100644 --- a/core/mem/virtual/virtual_posix.odin +++ b/core/mem/virtual/virtual_posix.odin @@ -47,3 +47,7 @@ _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) } return ([^]byte)(addr)[:size], nil } + +_unmap_file :: proc "contextless" (data: []byte) { + _release(raw_data(data), uint(len(data))) +} \ No newline at end of file diff --git a/core/mem/virtual/virtual_windows.odin b/core/mem/virtual/virtual_windows.odin index 1d777af17..0866ebfa1 100644 --- a/core/mem/virtual/virtual_windows.odin +++ b/core/mem/virtual/virtual_windows.odin @@ -82,6 +82,8 @@ foreign Kernel32 { dwFileOffsetLow: u32, dwNumberOfBytesToMap: uint, ) -> rawptr --- + + UnmapViewOfFile :: proc(lpBaseAddress: rawptr) -> b32 --- } @(no_sanitize_address) @@ -185,3 +187,8 @@ _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) file_data := MapViewOfFile(handle, desired_access, 0, 0, uint(size)) return ([^]byte)(file_data)[:size], nil } + +@(no_sanitize_address) +_unmap_file :: proc "contextless" (data: []byte) { + UnmapViewOfFile(raw_data(data)) +} \ No newline at end of file From 8f4bcf4d31fe83f2fe9a93a0b0a8e28d11c0c882 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 12:48:41 +0100 Subject: [PATCH 365/766] More conflicts during rebase --- core/crypto/hash/hash_os.odin | 2 +- core/fmt/fmt_os.odin | 10 +++++----- core/net/dns.odin | 2 +- core/testing/runner.odin | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/crypto/hash/hash_os.odin b/core/crypto/hash/hash_os.odin index 32347c452..28db9c61f 100644 --- a/core/crypto/hash/hash_os.odin +++ b/core/crypto/hash/hash_os.odin @@ -16,7 +16,7 @@ hash_file_by_handle :: proc( io.Error, ) { if !load_at_once { - return hash_stream(algorithm, handle.stream, allocator) + return hash_stream(algorithm, os.to_stream(handle), allocator) } buf, err := os.read_entire_file(handle, allocator) diff --git a/core/fmt/fmt_os.odin b/core/fmt/fmt_os.odin index 1f292c9e4..7ce945a0f 100644 --- a/core/fmt/fmt_os.odin +++ b/core/fmt/fmt_os.odin @@ -16,7 +16,7 @@ fprint :: proc(f: ^os.File, args: ..any, sep := " ", flush := true) -> int { b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, f.stream, buf[:]) + bufio.writer_init_with_buf(&b, os.to_stream(f), buf[:]) w := bufio.writer_to_writer(&b) return wprint(w, ..args, sep=sep, flush=flush) } @@ -27,7 +27,7 @@ fprintln :: proc(f: ^os.File, args: ..any, sep := " ", flush := true) -> int { b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, f.stream, buf[:]) + bufio.writer_init_with_buf(&b, os.to_stream(f), buf[:]) w := bufio.writer_to_writer(&b) return wprintln(w, ..args, sep=sep, flush=flush) @@ -38,7 +38,7 @@ fprintf :: proc(f: ^os.File, fmt: string, args: ..any, flush := true, newline := b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, f.stream, buf[:]) + bufio.writer_init_with_buf(&b, os.to_stream(f), buf[:]) w := bufio.writer_to_writer(&b) return wprintf(w, fmt, ..args, flush=flush, newline=newline) @@ -52,7 +52,7 @@ fprint_type :: proc(f: ^os.File, info: ^runtime.Type_Info, flush := true) -> (n: b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, f.stream, buf[:]) + bufio.writer_init_with_buf(&b, os.to_stream(f), buf[:]) w := bufio.writer_to_writer(&b) return wprint_type(w, info, flush=flush) @@ -62,7 +62,7 @@ fprint_typeid :: proc(f: ^os.File, id: typeid, flush := true) -> (n: int, err: i b: bufio.Writer defer bufio.writer_flush(&b) - bufio.writer_init_with_buf(&b, f.stream, buf[:]) + bufio.writer_init_with_buf(&b, os.to_stream(f), buf[:]) w := bufio.writer_to_writer(&b) return wprint_typeid(w, id, flush=flush) diff --git a/core/net/dns.odin b/core/net/dns.odin index 983f82681..2d7a04896 100644 --- a/core/net/dns.odin +++ b/core/net/dns.odin @@ -23,7 +23,7 @@ package net @(require) import "base:runtime" - +import os "core:os/os2" import "core:bufio" import "core:io" import "core:math/rand" diff --git a/core/testing/runner.odin b/core/testing/runner.odin index a184578a6..8873bc973 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -219,8 +219,8 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { } } - stdout := os.stdout.stream - stderr := os.stderr.stream + stdout := os.to_stream(os.stdout) + stderr := os.to_stream(os.stderr) // The animations are only ever shown through STDOUT; // STDERR is used exclusively for logging regardless of error level. From ffa94764b44763dddb32e069c92b6113b506e639 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 30 Oct 2025 12:29:23 +0100 Subject: [PATCH 366/766] Fix doc tester --- tests/documentation/documentation_tester.odin | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/tests/documentation/documentation_tester.odin b/tests/documentation/documentation_tester.odin index 7b125d4e4..93246f05a 100644 --- a/tests/documentation/documentation_tester.odin +++ b/tests/documentation/documentation_tester.odin @@ -267,7 +267,7 @@ write_test_suite :: proc(example_tests: []Example_Test) { `#+private package documentation_verification -import "core:os" +import os "core:os/os2" import "core:mem" import "core:io" import "core:fmt" @@ -276,9 +276,11 @@ import "core:sync" import "base:intrinsics" @(private="file") -_read_pipe: os.Handle +_read_pipe: ^os.File @(private="file") -_write_pipe: os.Handle +_write_pipe: ^os.File +@(private="file") +_old_stdout: ^os.File @(private="file") _pipe_reader_semaphore: sync.Sema @(private="file") @@ -286,20 +288,20 @@ _out_data: string @(private="file") _out_buffer: [mem.Megabyte]byte @(private="file") -_bad_test_found: bool +_bad_count: int +@(private="file") +_good_count: int @(private="file") _spawn_pipe_reader :: proc() { thread.run(proc() { - stream := os.stream_from_handle(_read_pipe) - reader := io.to_reader(stream) sync.post(&_pipe_reader_semaphore) // notify thread is ready for { n_read := 0 read_to_null_byte := 0 finished_reading := false for ! finished_reading { - just_read, err := io.read(reader, _out_buffer[n_read:], &n_read); if err != .None { + just_read, err := io.read(_read_pipe.stream, _out_buffer[n_read:], &n_read); if err != .None { panic("We got an IO error!") } for b in _out_buffer[n_read - just_read: n_read] { @@ -328,11 +330,14 @@ _check :: proc(test_name: string, expected: string) { if expected != output { fmt.eprintf("Test %q got unexpected output:\n%q\n", test_name, output) fmt.eprintf("Expected:\n%q\n", expected) - _bad_test_found = true + _bad_count += 1 + } else { + _good_count += 1 } } main :: proc() { + _old_stdout = os.stdout _read_pipe, _write_pipe, _ = os.pipe() os.stdout = _write_pipe _spawn_pipe_reader() @@ -457,7 +462,8 @@ main :: proc() { strings.write_string(&test_runner, ` - if _bad_test_found { + fmt.wprintfln(_old_stdout.stream, "Passes: %v. Fails: %v", _good_count, _bad_count) + if _bad_count > 0 { fmt.eprintln("One or more tests failed") os.exit(1) } From 67db0fde4fbfaf34870b5f5ac3042c50df9a0c2c Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 30 Oct 2025 12:38:28 +0100 Subject: [PATCH 367/766] Port doc tester to os2 itself as well --- tests/documentation/documentation_tester.odin | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/tests/documentation/documentation_tester.odin b/tests/documentation/documentation_tester.odin index 93246f05a..55e40963d 100644 --- a/tests/documentation/documentation_tester.odin +++ b/tests/documentation/documentation_tester.odin @@ -1,12 +1,11 @@ package documentation_tester -import "core:os" -import "core:io" -import "core:fmt" -import "core:strings" -import "core:odin/ast" -import "core:odin/parser" -import "core:c/libc" +import os "core:os/os2" +import "core:fmt" +import "core:strings" +import "core:odin/ast" +import "core:odin/parser" +import "core:c/libc" import doc "core:odin/doc-format" Example_Test :: struct { @@ -63,10 +62,11 @@ main :: proc() { errorf("expected path to odin executable") } g_path_to_odin = os.args[1] - data, ok := os.read_entire_file("all.odin-doc") - if !ok { + data, data_err := os.read_entire_file("all.odin-doc", context.allocator) + if data_err != nil { errorf("unable to read file: all.odin-doc") } + defer delete(data) err: doc.Reader_Error g_header, err = doc.read_from_bytes(data) switch err { @@ -257,8 +257,8 @@ find_and_add_examples :: proc(docs: string, package_name: string, entity_name: s write_test_suite :: proc(example_tests: []Example_Test) { TEST_SUITE_DIRECTORY :: "verify" - os.remove_directory(TEST_SUITE_DIRECTORY) - os.make_directory(TEST_SUITE_DIRECTORY) + os.remove_all(TEST_SUITE_DIRECTORY) + os.mkdir(TEST_SUITE_DIRECTORY) example_build := strings.builder_make() test_runner := strings.builder_make() @@ -450,13 +450,7 @@ main :: proc() { continue } defer os.close(test_file_handle) - stream := os.stream_from_handle(test_file_handle) - writer, ok := io.to_writer(stream); if ! ok { - fmt.eprintf("We could not make the writer for the path %q\n", save_path) - g_bad_doc = true - continue - } - fmt.wprintf(writer, "%v%v_%v", code_string[:index_of_proc_name], test.package_name, code_string[index_of_proc_name:]) + fmt.wprintf(test_file_handle.stream, "%v%v_%v", code_string[:index_of_proc_name], test.package_name, code_string[index_of_proc_name:]) fmt.println("Done") } @@ -468,7 +462,7 @@ main :: proc() { os.exit(1) } }`) - os.write_entire_file("verify/main.odin", transmute([]byte)strings.to_string(test_runner)) + _ = os.write_entire_file("verify/main.odin", transmute([]byte)strings.to_string(test_runner)) } run_test_suite :: proc() -> bool { From c265d297b5c9252db391cdf43eca079d8f634791 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 30 Oct 2025 13:45:59 +0100 Subject: [PATCH 368/766] core:time/timezone -> os2 --- core/time/timezone/tz_unix.odin | 15 +++++++++------ core/time/timezone/tzif.odin | 18 ++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/core/time/timezone/tz_unix.odin b/core/time/timezone/tz_unix.odin index 542e5c4f2..e4121266d 100644 --- a/core/time/timezone/tz_unix.odin +++ b/core/time/timezone/tz_unix.odin @@ -2,16 +2,16 @@ #+private package timezone -import "core:os" -import "core:strings" -import "core:path/filepath" -import "core:time/datetime" +import os "core:os/os2" +import "core:strings" +import "core:path/filepath" +import "core:time/datetime" local_tz_name :: proc(allocator := context.allocator) -> (name: string, success: bool) { local_str, ok := os.lookup_env("TZ", allocator) if !ok { orig_localtime_path := "/etc/localtime" - path, err := os.absolute_path_from_relative(orig_localtime_path, allocator) + path, err := os.get_absolute_path(orig_localtime_path, allocator) if err != nil { // If we can't find /etc/localtime, fallback to UTC if err == .ENOENT { @@ -28,7 +28,10 @@ local_tz_name :: proc(allocator := context.allocator) -> (name: string, success: // This is a hackaround, because FreeBSD copies rather than softlinks their local timezone file, // *sometimes* and then stores the original name of the timezone in /var/db/zoneinfo instead if path == orig_localtime_path { - data := os.read_entire_file("/var/db/zoneinfo", allocator) or_return + data, data_err := os.read_entire_file("/var/db/zoneinfo", allocator) + if data_err != nil { + return "", false + } return strings.trim_right_space(string(data)), true } diff --git a/core/time/timezone/tzif.odin b/core/time/timezone/tzif.odin index 804211ef4..7a7023c6c 100644 --- a/core/time/timezone/tzif.odin +++ b/core/time/timezone/tzif.odin @@ -1,12 +1,11 @@ package timezone -import "base:intrinsics" - -import "core:slice" -import "core:strings" -import "core:os" -import "core:strconv" -import "core:time/datetime" +import "base:intrinsics" +import "core:slice" +import "core:strings" +import os "core:os/os2" +import "core:strconv" +import "core:time/datetime" // Implementing RFC8536 [https://datatracker.ietf.org/doc/html/rfc8536] @@ -70,7 +69,10 @@ tzif_data_block_size :: proc(hdr: ^TZif_Header, version: TZif_Version) -> (block load_tzif_file :: proc(filename: string, region_name: string, allocator := context.allocator) -> (out: ^datetime.TZ_Region, ok: bool) { - tzif_data := os.read_entire_file_from_filename(filename, allocator) or_return + tzif_data, tzif_err := os.read_entire_file(filename, allocator) + if tzif_err != nil { + return nil, false + } defer delete(tzif_data, allocator) return parse_tzif(tzif_data, region_name, allocator) } From 8b3ae667f449f7f013d926b5f3d9177b2483e54f Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 12:50:19 +0100 Subject: [PATCH 369/766] More conflicts during rebase --- core/unicode/tools/generate_entity_table.odin | 87 +++++++------------ 1 file changed, 31 insertions(+), 56 deletions(-) diff --git a/core/unicode/tools/generate_entity_table.odin b/core/unicode/tools/generate_entity_table.odin index 9517b632b..02958ad26 100644 --- a/core/unicode/tools/generate_entity_table.odin +++ b/core/unicode/tools/generate_entity_table.odin @@ -1,17 +1,14 @@ package xml_example -import "core:encoding/xml" -import "core:os" +import "core:encoding/xml" +import os "core:os/os2" import path "core:path/filepath" -import "core:mem" -import "core:strings" -import "core:strconv" -import "core:slice" -import "core:fmt" +import "core:strings" +import "core:strconv" +import "core:slice" +import "core:fmt" -/* - Silent error handler for the parser. -*/ +// Silent error handler for the parser. Error_Handler :: proc(pos: xml.Pos, fmt: string, args: ..any) {} OPTIONS :: xml.Options{ flags = { .Ignore_Unsupported, }, expected_doctype = "unicode", } @@ -22,7 +19,7 @@ Entity :: struct { description: string, } -generate_encoding_entity_table :: proc() { +main :: proc() { filename := path.join({ODIN_ROOT, "tests", "core", "assets", "XML", "unicode.xml"}) defer delete(filename) @@ -33,14 +30,14 @@ generate_encoding_entity_table :: proc() { defer xml.destroy(doc) if err != .None { - fmt.printf("Load/Parse error: %v\n", err) + fmt.printfln("Load/Parse error: %v", err) if err == .File_Error { - fmt.printf("\"%v\" not found. Did you run \"tests\\download_assets.py\"?", filename) + fmt.eprintfln("%q not found. Did you run \"tests\\download_assets.py\"?", filename) } os.exit(1) } - fmt.printf("\"%v\" loaded and parsed.\n", filename) + fmt.printfln("%q loaded and parsed.", filename) generated_buf: strings.Builder defer strings.builder_destroy(&generated_buf) @@ -54,7 +51,7 @@ generate_encoding_entity_table :: proc() { charlist := doc.elements[charlist_id] - fmt.printf("Found `` with %v children.\n", len(charlist.value)) + fmt.printfln("Found `` with %v children.", len(charlist.value)) entity_map: map[string]Entity defer delete(entity_map) @@ -73,7 +70,7 @@ generate_encoding_entity_table :: proc() { char := doc.elements[id] if char.ident != "character" { - fmt.eprintf("Expected ``, got `<%v>`\n", char.ident) + fmt.eprintfln("Expected ``, got `<%v>`", char.ident) os.exit(1) } @@ -90,15 +87,13 @@ generate_encoding_entity_table :: proc() { } desc, desc_ok := xml.find_child_by_ident(doc, id, "description") + assert(desc_ok) description := "" if len(doc.elements[desc].value) == 1 { description = doc.elements[desc].value[0].(string) } - /* - For us to be interested in this codepoint, it has to have at least one entity. - */ - + // For us to be interested in this codepoint, it has to have at least one entity. nth := 0 for { character_entity := xml.find_child_by_ident(doc, id, "entity", nth) or_break @@ -112,8 +107,8 @@ generate_encoding_entity_table :: proc() { } if name == "\"\"" { - fmt.printf("%#v\n", char) - fmt.printf("%#v\n", character_entity) + fmt.printfln("%#v", char) + fmt.printfln("%#v", character_entity) } if len(name) > max_name_length { longest_name = name } @@ -139,18 +134,14 @@ generate_encoding_entity_table :: proc() { } } - /* - Sort by name. - */ + // Sort by name. slice.sort(names[:]) - fmt.printf("Found %v unique `&name;` -> rune mappings.\n", count) - fmt.printf("Shortest name: %v (%v)\n", shortest_name, min_name_length) - fmt.printf("Longest name: %v (%v)\n", longest_name, max_name_length) + fmt.printfln("Found %v unique `&name;` -> rune mappings.", count) + fmt.printfln("Shortest name: %v (%v)", shortest_name, min_name_length) + fmt.printfln("Longest name: %v (%v)", longest_name, max_name_length) - /* - Generate table. - */ + // Generate table. fmt.wprintln(w, "package encoding_unicode_entity") fmt.wprintln(w, "") fmt.wprintln(w, GENERATED) @@ -158,10 +149,10 @@ generate_encoding_entity_table :: proc() { fmt.wprintf (w, TABLE_FILE_PROLOG) fmt.wprintln(w, "") - fmt.wprintf (w, "// `&%v;`\n", shortest_name) - fmt.wprintf (w, "XML_NAME_TO_RUNE_MIN_LENGTH :: %v\n", min_name_length) - fmt.wprintf (w, "// `&%v;`\n", longest_name) - fmt.wprintf (w, "XML_NAME_TO_RUNE_MAX_LENGTH :: %v\n", max_name_length) + fmt.wprintfln(w, "// `&%v;`", shortest_name) + fmt.wprintfln(w, "XML_NAME_TO_RUNE_MIN_LENGTH :: %v", min_name_length) + fmt.wprintfln(w, "// `&%v;`", longest_name) + fmt.wprintfln(w, "XML_NAME_TO_RUNE_MAX_LENGTH :: %v", max_name_length) fmt.wprintln(w, "") fmt.wprintln(w, @@ -198,7 +189,7 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: } prefix = rune(v[0]) - fmt.wprintf (w, "\tcase '%v':\n", prefix) + fmt.wprintfln(w, "\tcase '%v':", prefix) fmt.wprintln(w, "\t\tswitch name {") } @@ -214,7 +205,6 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: } else { fmt.wprintf(w, "\t\t\treturn {{%q, 0}}, 1, true\n", e.codepoints[0]) } - should_close = true } fmt.wprintln(w, "\t\t}") @@ -229,11 +219,12 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: written := os.write_entire_file(generated_filename, transmute([]byte)strings.to_string(generated_buf)) - if written { - fmt.printf("Successfully written generated \"%v\".\n", generated_filename) + if written == nil { + fmt.printfln("Successfully written generated \"%v\".", generated_filename) } else { - fmt.printf("Failed to write generated \"%v\".\n", generated_filename) + fmt.printfln("Failed to write generated \"%v\".", generated_filename) } + // Not a library, no need to clean up. } GENERATED :: `/* @@ -274,20 +265,4 @@ is_dotted_name :: proc(name: string) -> (dotted: bool) { if r == '.' { return true} } return false -} - -main :: proc() { - track: mem.Tracking_Allocator - mem.tracking_allocator_init(&track, context.allocator) - context.allocator = mem.tracking_allocator(&track) - - generate_encoding_entity_table() - - if len(track.allocation_map) > 0 { - fmt.println() - for _, v in track.allocation_map { - fmt.printf("%v Leaked %v bytes.\n", v.location, v.size) - } - } - fmt.println("Done and cleaned up!") } \ No newline at end of file From af57035fd65cda96b7ec17e965184a922fdf6e82 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 30 Oct 2025 15:07:51 +0100 Subject: [PATCH 370/766] tests/core/io -> os2 --- tests/core/encoding/hxa/test_core_hxa.odin | 3 - tests/core/io/test_core_io.odin | 66 +++++----------------- 2 files changed, 14 insertions(+), 55 deletions(-) diff --git a/tests/core/encoding/hxa/test_core_hxa.odin b/tests/core/encoding/hxa/test_core_hxa.odin index 7f495e161..17b3ca619 100644 --- a/tests/core/encoding/hxa/test_core_hxa.odin +++ b/tests/core/encoding/hxa/test_core_hxa.odin @@ -1,6 +1,3 @@ -// Tests "core:encoding:hxa". -// Must be run with `-collection:tests=` flag, e.g. -// ./odin run tests/core/encoding/hxa/test_core_hxa.odin -out=tests/core/test_core_hxa -collection:tests=./tests package test_core_hxa import "core:encoding/hxa" diff --git a/tests/core/io/test_core_io.odin b/tests/core/io/test_core_io.odin index 10c9550cb..eb4d79317 100644 --- a/tests/core/io/test_core_io.odin +++ b/tests/core/io/test_core_io.odin @@ -1,13 +1,12 @@ package test_core_io -import "core:bufio" -import "core:bytes" -import "core:io" -import "core:log" -import "core:os" -import "core:os/os2" -import "core:strings" -import "core:testing" +import "core:bufio" +import "core:bytes" +import "core:io" +import "core:log" +import os "core:os/os2" +import "core:strings" +import "core:testing" Passed_Tests :: distinct io.Stream_Mode_Set @@ -540,7 +539,7 @@ test_string_builder_stream :: proc(t: ^testing.T) { } @test -test_os_file_stream :: proc(t: ^testing.T) { +test_os2_file_stream :: proc(t: ^testing.T) { defer if !testing.failed(t) { testing.expect_value(t, os.remove(TEMPORARY_FILENAME), nil) } @@ -550,51 +549,14 @@ test_os_file_stream :: proc(t: ^testing.T) { buf[i] = 'A' + i } - TEMPORARY_FILENAME :: "test_core_io_os_file_stream" - - fd, open_err := os.open(TEMPORARY_FILENAME, os.O_RDWR | os.O_CREATE | os.O_TRUNC, 0o644) - if !testing.expectf(t, open_err == nil, "error on opening %q: %v", TEMPORARY_FILENAME, open_err) { - return - } - - stream := os.stream_from_handle(fd) - - bytes_written, write_err := io.write(stream, buf[:]) - if !testing.expectf(t, bytes_written == len(buf) && write_err == nil, - "failed to Write initial buffer: bytes_written<%v> != len_buf<%v>, %v", bytes_written, len(buf), write_err) { - return - } - - flush_err := io.flush(stream) - if !testing.expectf(t, flush_err == nil, - "failed to Flush initial buffer: %v", write_err) { - return - } - - results, _ := _test_stream(t, stream, buf[:]) - - log.debugf("%#v", results) -} - -@test -test_os2_file_stream :: proc(t: ^testing.T) { - defer if !testing.failed(t) { - testing.expect_value(t, os2.remove(TEMPORARY_FILENAME), nil) - } - - buf: [32]u8 - for i in 0.. Date: Sun, 8 Feb 2026 12:51:24 +0100 Subject: [PATCH 371/766] More conflicts during rebase --- core/mem/virtual/doc.odin | 16 ++++----- core/odin/parser/parse_files.odin | 19 +++++----- core/path/filepath/match.odin | 25 ++++++------- core/path/filepath/path_windows.odin | 52 +++------------------------- core/path/filepath/walk.odin | 8 ++--- 5 files changed, 36 insertions(+), 84 deletions(-) diff --git a/core/mem/virtual/doc.odin b/core/mem/virtual/doc.odin index 6c6ce055f..249e22ee8 100644 --- a/core/mem/virtual/doc.odin +++ b/core/mem/virtual/doc.odin @@ -5,8 +5,8 @@ virtual.Arena usage Example: // Source: https://github.com/odin-lang/examples/blob/master/arena_allocator/arena_allocator.odin - import "core:fmt" - import "core:os" + import "core:fmt" + import os "core:os/os2" // virtual package implements a multi-purpose arena allocator. If you are on a // platform that does not support virtual memory, then there is also a similar @@ -26,14 +26,14 @@ Example: // See arena_init_buffer for an arena that does not use virtual memory, // instead it relies on you feeding it a buffer. - f1, f1_ok := os.read_entire_file("file1.txt", arena_alloc) - ensure(f1_ok) + f1, f1_err := os.read_entire_file("file1.txt", arena_alloc) + ensure(f1_err == nil) - f2, f2_ok := os.read_entire_file("file2.txt", arena_alloc) - ensure(f2_ok) + f2, f2_err := os.read_entire_file("file2.txt", arena_alloc) + ensure(f2_err == nil) - f3, f3_ok := os.read_entire_file("file3.txt", arena_alloc) - ensure(f3_ok) + f3, f3_err := os.read_entire_file("file3.txt", arena_alloc) + ensure(f3_err == nil) res := make([]string, 3, arena_alloc) res[0] = string(f1) diff --git a/core/odin/parser/parse_files.odin b/core/odin/parser/parse_files.odin index d4e532ec7..5e7bee923 100644 --- a/core/odin/parser/parse_files.odin +++ b/core/odin/parser/parse_files.odin @@ -1,12 +1,12 @@ package odin_parser -import "core:odin/tokenizer" -import "core:odin/ast" -import "core:path/filepath" -import "core:fmt" -import "core:os" -import "core:slice" -import "core:strings" +import "core:odin/tokenizer" +import "core:odin/ast" +import "core:path/filepath" +import "core:fmt" +import os "core:os/os2" +import "core:slice" +import "core:strings" collect_package :: proc(path: string) -> (pkg: ^ast.Package, success: bool) { NO_POS :: tokenizer.Pos{} @@ -28,14 +28,13 @@ collect_package :: proc(path: string) -> (pkg: ^ast.Package, success: bool) { pkg.fullpath = pkg_path for match in matches { - src: []byte fullpath, ok := filepath.abs(match) if !ok { return } - src, ok = os.read_entire_file(fullpath) - if !ok { + src, src_err := os.read_entire_file(fullpath, context.allocator) + if src_err != nil { delete(fullpath) return } diff --git a/core/path/filepath/match.odin b/core/path/filepath/match.odin index 3eaa7c6fe..e474085ed 100644 --- a/core/path/filepath/match.odin +++ b/core/path/filepath/match.odin @@ -2,10 +2,10 @@ #+build !js package filepath -import "core:os" -import "core:slice" -import "core:strings" -import "core:unicode/utf8" +import os "core:os/os2" +import "core:slice" +import "core:strings" +import "core:unicode/utf8" Match_Error :: enum { None, @@ -286,28 +286,23 @@ _glob :: proc(dir, pattern: string, matches: ^[dynamic]string, allocator := cont defer os.close(d) { - file_info, ferr := os.fstat(d) - defer os.file_info_delete(file_info) + file_info, ferr := os.fstat(d, allocator) + defer os.file_info_delete(file_info, allocator) if ferr != nil { return } - if !file_info.is_dir { + if file_info.type != .Directory { return } } - fis, _ := os.read_dir(d, -1) + fis, _ := os.read_dir(d, -1, allocator) slice.sort_by(fis, proc(a, b: os.File_Info) -> bool { return a.name < b.name }) - defer { - for fi in fis { - os.file_info_delete(fi) - } - delete(fis) - } + defer os.file_info_slice_delete(fis, allocator) for fi in fis { n := fi.name @@ -359,4 +354,4 @@ clean_glob_path_windows :: proc(path: string, temp_buf: []byte) -> (prefix_len: vol_len = len(path) -1 } return vol_len, path[:len(path)-1] -} +} \ No newline at end of file diff --git a/core/path/filepath/path_windows.odin b/core/path/filepath/path_windows.odin index d7549a42c..862649532 100644 --- a/core/path/filepath/path_windows.odin +++ b/core/path/filepath/path_windows.odin @@ -1,9 +1,8 @@ package filepath -import "core:strings" -import "base:runtime" -import "core:os" -import win32 "core:sys/windows" +import "core:strings" +import "base:runtime" +import os "core:os/os2" SEPARATOR :: '\\' SEPARATOR_STRING :: `\` @@ -33,53 +32,12 @@ is_UNC :: proc(path: string) -> bool { } is_abs :: proc(path: string) -> bool { - if is_reserved_name(path) { - return true - } - if len(path) > 0 && is_slash(path[0]) { - return true - } - l := volume_name_len(path) - if l == 0 { - return false - } - - path := path - path = path[l:] - if path == "" { - return false - } - return is_slash(path[0]) -} - -@(private) -temp_full_path :: proc(name: string) -> (path: string, err: os.Error) { - ta := context.temp_allocator - - name := name - if name == "" { - name = "." - } - - p := win32.utf8_to_utf16(name, ta) - n := win32.GetFullPathNameW(cstring16(raw_data(p)), 0, nil, nil) - if n == 0 { - return "", os.get_last_error() - } - - buf := make([]u16, n, ta) - n = win32.GetFullPathNameW(cstring16(raw_data(p)), u32(len(buf)), cstring16(raw_data(buf)), nil) - if n == 0 { - delete(buf) - return "", os.get_last_error() - } - - return win32.utf16_to_utf8(buf[:n], ta) + return os.is_absolute_path(path) } abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = allocator == context.temp_allocator) - full_path, err := temp_full_path(path) + full_path, err := os.get_absolute_path(path, context.temp_allocator) if err != nil { return "", false } diff --git a/core/path/filepath/walk.odin b/core/path/filepath/walk.odin index 05d67daf0..845ba06a0 100644 --- a/core/path/filepath/walk.odin +++ b/core/path/filepath/walk.odin @@ -2,8 +2,8 @@ #+build !js package filepath -import "core:os" -import "core:slice" +import os "core:os/os2" +import "core:slice" // Walk_Proc is the type of the procedure called for each file or directory visited by 'walk' // The 'path' parameter contains the parameter to walk as a prefix (this is the same as info.fullpath except on 'root') @@ -40,7 +40,7 @@ walk :: proc(root: string, walk_proc: Walk_Proc, user_data: rawptr) -> os.Error @(private) _walk :: proc(info: os.File_Info, walk_proc: Walk_Proc, user_data: rawptr) -> (err: os.Error, skip_dir: bool) { - if !info.is_dir { + if info.type != .Directory { if info.fullpath == "" && info.name == "" { // ignore empty things return @@ -62,7 +62,7 @@ _walk :: proc(info: os.File_Info, walk_proc: Walk_Proc, user_data: rawptr) -> (e for fi in fis { err, skip_dir = _walk(fi, walk_proc, user_data) if err != nil || skip_dir { - if !fi.is_dir || !skip_dir { + if fi.type != .Directory || !skip_dir { return } } From cc50be1a6cea7587656124ad3fc0917e1ad9f737 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 30 Oct 2025 23:56:13 +0100 Subject: [PATCH 372/766] Add more `filepath` to `os2` --- core/os/os2/errors.odin | 2 + core/os/os2/path.odin | 475 ++++++++++++++++++++++++++- core/os/os2/path_windows.odin | 2 +- core/path/filepath/match.odin | 324 +----------------- core/path/filepath/path.odin | 104 +----- core/path/filepath/path_windows.odin | 5 +- 6 files changed, 493 insertions(+), 419 deletions(-) diff --git a/core/os/os2/errors.odin b/core/os/os2/errors.odin index 2d959e182..508d824b3 100644 --- a/core/os/os2/errors.odin +++ b/core/os/os2/errors.odin @@ -24,6 +24,7 @@ General_Error :: enum u32 { Invalid_Command, Pattern_Has_Separator, + Pattern_Syntax_Error, // Indicates an error in `glob` or `match` pattern. No_HOME_Variable, Env_Var_Not_Found, @@ -74,6 +75,7 @@ error_string :: proc(ferr: Error) -> string { case .Invalid_Callback: return "invalid callback" case .Invalid_Command: return "invalid command" case .Pattern_Has_Separator: return "pattern has separator" + case .Pattern_Syntax_Error: return "glob pattern syntax error" case .No_HOME_Variable: return "no $HOME variable" case .Env_Var_Not_Found: return "environment variable not found" } diff --git a/core/os/os2/path.odin b/core/os/os2/path.odin index e12aa3c9c..55659d88f 100644 --- a/core/os/os2/path.odin +++ b/core/os/os2/path.odin @@ -1,11 +1,14 @@ package os2 import "base:runtime" - +import "core:slice" import "core:strings" +import "core:unicode/utf8" + Path_Separator :: _Path_Separator // OS-Specific Path_Separator_String :: _Path_Separator_String // OS-Specific +Path_Separator_Chars :: `/\` Path_List_Separator :: _Path_List_Separator // OS-Specific #assert(_Path_Separator <= rune(0x7F), "The system-specific path separator rune is expected to be within the 7-bit ASCII character set.") @@ -315,6 +318,143 @@ split_path :: proc(path: string) -> (dir, filename: string) { return _split_path(path) } + +/* +Gets the file name and extension from a path. + +e.g. + 'path/to/name.tar.gz' -> 'name.tar.gz' + 'path/to/name.txt' -> 'name.txt' + 'path/to/name' -> 'name' + +Returns "." if the path is an empty string. +*/ +base :: proc(path: string) -> string { + if path == "" { + return "." + } + + _, file := split_path(path) + return file +} + +/* +Gets the name of a file from a path. + +The stem of a file is such that `stem(path)` + `ext(path)` = `base(path)`. + +Only the last dot is considered when splitting the file extension. +See `short_stem`. + +e.g. + 'name.tar.gz' -> 'name.tar' + 'name.txt' -> 'name' + +Returns an empty string if there is no stem. e.g: '.gitignore'. +Returns an empty string if there's a trailing path separator. +*/ +stem :: proc(path: string) -> string { + if len(path) > 0 { + if is_path_separator(path[len(path) - 1]) { + // NOTE(tetra): Trailing separator + return "" + } else if path[0] == '.' { + return "" + } + } + + // NOTE(tetra): Get the basename + path := path + if i := strings.last_index_any(path, Path_Separator_Chars); i != -1 { + path = path[i+1:] + } + + if i := strings.last_index_byte(path, '.'); i != -1 { + return path[:i] + } + return path +} + +/* +Gets the name of a file from a path. + +The short stem is such that `short_stem(path)` + `long_ext(path)` = `base(path)`, +where `long_ext` is the extension returned by `split_filename_all`. + +The first dot is used to split off the file extension, unlike `stem` which uses the last dot. + +e.g. + 'name.tar.gz' -> 'name' + 'name.txt' -> 'name' + +Returns an empty string if there is no stem. e.g: '.gitignore'. +Returns an empty string if there's a trailing path separator. +*/ +short_stem :: proc(path: string) -> string { + s := stem(path) + if i := strings.index_byte(s, '.'); i != -1 { + return s[:i] + } + return s +} + +/* +Gets the file extension from a path, including the dot. + +The file extension is such that `stem_path(path)` + `ext(path)` = `base(path)`. + +Only the last dot is considered when splitting the file extension. +See `long_ext`. + +e.g. + 'name.tar.gz' -> '.gz' + 'name.txt' -> '.txt' + +Returns an empty string if there is no dot. +Returns an empty string if there is a trailing path separator. +*/ +ext :: proc(path: string) -> string { + for i := len(path)-1; i >= 0 && !is_path_separator(path[i]); i -= 1 { + if path[i] == '.' { + return path[i:] + } + } + return "" +} + +/* +Gets the file extension from a path, including the dot. + +The long file extension is such that `short_stem(path)` + `long_ext(path)` = `base(path)`. + +The first dot is used to split off the file extension, unlike `ext` which uses the last dot. + +e.g. + 'name.tar.gz' -> '.tar.gz' + 'name.txt' -> '.txt' + +Returns an empty string if there is no dot. +Returns an empty string if there is a trailing path separator. +*/ +long_ext :: proc(path: string) -> string { + if len(path) > 0 && is_path_separator(path[len(path) - 1]) { + // NOTE(tetra): Trailing separator + return "" + } + + // NOTE(tetra): Get the basename + path := path + if i := strings.last_index_any(path, Path_Separator_Chars); i != -1 { + path = path[i+1:] + } + + if i := strings.index_byte(path, '.'); i != -1 { + return path[i:] + } + + return "" +} + /* Join all `elems` with the system's path separator and normalize the result. @@ -460,3 +600,336 @@ split_path_list :: proc(path: string, allocator: runtime.Allocator) -> (list: [] return list, nil } + +/* +`match` states whether "name" matches the shell pattern + +Pattern syntax is: + pattern: + {term} + term: + '*' matches any sequence of non-/ characters + '?' matches any single non-/ character + '[' ['^'] { character-range } ']' + character classification (cannot be empty) + c matches character c (c != '*', '?', '\\', '[') + '\\' c matches character c + + character-range + c matches character c (c != '\\', '-', ']') + '\\' c matches character c + lo '-' hi matches character c for lo <= c <= hi + +`match` requires that the pattern matches the entirety of the name, not just a substring. +The only possible error returned is `.Syntax_Error` or an allocation error. + +NOTE(bill): This is effectively the shell pattern matching system found +*/ +match :: proc(pattern, name: string) -> (matched: bool, err: Error) { + pattern, name := pattern, name + pattern_loop: for len(pattern) > 0 { + star: bool + chunk: string + star, chunk, pattern = scan_chunk(pattern) + if star && chunk == "" { + return !strings.contains(name, _Path_Separator_String), nil + } + + t, ok := match_chunk(chunk, name) or_return + + if ok && (len(t) == 0 || len(pattern) > 0) { + name = t + continue + } + + if star { + for i := 0; i < len(name) && name[i] != _Path_Separator; i += 1 { + t, ok = match_chunk(chunk, name[i+1:]) or_return + if ok { + if len(pattern) == 0 && len(t) > 0 { + continue + } + name = t + continue pattern_loop + } + } + } + + return false, nil + } + + return len(name) == 0, nil +} + +// glob returns the names of all files matching pattern or nil if there are no matching files +// The syntax of patterns is the same as "match". +// The pattern may describe hierarchical names such as /usr/*/bin (assuming '/' is a separator) +// +// glob ignores file system errors +// +glob :: proc(pattern: string, allocator := context.allocator) -> (matches: []string, err: Error) { + context.allocator = allocator + + if !has_meta(pattern) { + // TODO(bill): os.lstat on here to check for error + m := make([]string, 1) + m[0] = pattern + return m[:], nil + } + + dir, file := split_path(pattern) + + volume_len: int + temp_buf: [8]byte + volume_len, dir = _clean_glob_path(dir, temp_buf[:]) + + if !has_meta(dir[volume_len:]) { + m, e := _glob(dir, file, nil) + return m[:], e + } + + m := glob(dir) or_return + defer { + for s in m { + delete(s) + } + delete(m) + } + + dmatches := make([dynamic]string, 0, 0) + for d in m { + dmatches, err = _glob(d, file, &dmatches) + if err != nil { + break + } + } + if len(dmatches) > 0 { + matches = dmatches[:] + } + return +} + +/* + Returns leading volume name. + + e.g. + "C:\foo\bar\baz" will return "C:" on Windows. + Everything else will be "". +*/ +volume_name :: proc(path: string) -> string { + when ODIN_OS == .Windows { + return path[:_volume_name_len(path)] + } else { + return "" + } +} + +@(private="file") +scan_chunk :: proc(pattern: string) -> (star: bool, chunk, rest: string) { + pattern := pattern + for len(pattern) > 0 && pattern[0] == '*' { + pattern = pattern[1:] + star = true + } + + in_range, i := false, 0 + + scan_loop: for i = 0; i < len(pattern); i += 1 { + switch pattern[i] { + case '\\': + when ODIN_OS != .Windows { + if i+1 < len(pattern) { + i += 1 + } + } + case '[': + in_range = true + case ']': + in_range = false + case '*': + in_range or_break scan_loop + + } + } + return star, pattern[:i], pattern[i:] +} + +@(private="file") +match_chunk :: proc(chunk, s: string) -> (rest: string, ok: bool, err: Error) { + chunk, s := chunk, s + for len(chunk) > 0 { + if len(s) == 0 { + return + } + switch chunk[0] { + case '[': + r, w := utf8.decode_rune_in_string(s) + s = s[w:] + chunk = chunk[1:] + is_negated := false + if len(chunk) > 0 && chunk[0] == '^' { + is_negated = true + chunk = chunk[1:] + } + match := false + range_count := 0 + for { + if len(chunk) > 0 && chunk[0] == ']' && range_count > 0 { + chunk = chunk[1:] + break + } + lo, hi: rune + if lo, chunk, err = get_escape(chunk); err != nil { + return + } + hi = lo + if chunk[0] == '-' { + if hi, chunk, err = get_escape(chunk[1:]); err != nil { + return + } + } + + if lo <= r && r <= hi { + match = true + } + range_count += 1 + } + if match == is_negated { + return + } + + case '?': + if s[0] == _Path_Separator { + return + } + _, w := utf8.decode_rune_in_string(s) + s = s[w:] + chunk = chunk[1:] + + case '\\': + when ODIN_OS != .Windows { + chunk = chunk[1:] + if len(chunk) == 0 { + err = .Pattern_Syntax_Error + return + } + } + fallthrough + case: + if chunk[0] != s[0] { + return + } + s = s[1:] + chunk = chunk[1:] + + } + } + return s, true, nil +} + +@(private="file") +get_escape :: proc(chunk: string) -> (r: rune, next_chunk: string, err: Error) { + if len(chunk) == 0 || chunk[0] == '-' || chunk[0] == ']' { + err = .Pattern_Syntax_Error + return + } + chunk := chunk + if chunk[0] == '\\' && ODIN_OS != .Windows { + chunk = chunk[1:] + if len(chunk) == 0 { + err = .Pattern_Syntax_Error + return + } + } + + w: int + r, w = utf8.decode_rune_in_string(chunk) + if r == utf8.RUNE_ERROR && w == 1 { + err = .Pattern_Syntax_Error + } + + next_chunk = chunk[w:] + if len(next_chunk) == 0 { + err = .Pattern_Syntax_Error + } + + return +} + +// Internal implementation of `glob`, not meant to be used by the user. Prefer `glob`. +_glob :: proc(dir, pattern: string, matches: ^[dynamic]string, allocator := context.allocator) -> (m: [dynamic]string, e: Error) { + context.allocator = allocator + + if matches != nil { + m = matches^ + } else { + m = make([dynamic]string, 0, 0) + } + + + d := open(dir, O_RDONLY) or_return + defer close(d) + + file_info := fstat(d, allocator) or_return + defer file_info_delete(file_info, allocator) + + if file_info.type != .Directory { + return + } + + fis, _ := read_dir(d, -1, allocator) + slice.sort_by(fis, proc(a, b: File_Info) -> bool { + return a.name < b.name + }) + defer file_info_slice_delete(fis, allocator) + + for fi in fis { + matched := match(pattern, fi.name) or_return + if matched { + matched_path := join_path({dir, fi.name}, allocator) or_return + append(&m, matched_path) + } + } + return +} + +@(private) +has_meta :: proc(path: string) -> bool { + when ODIN_OS == .Windows { + CHARS :: `*?[` + } else { + CHARS :: `*?[\` + } + return strings.contains_any(path, CHARS) +} + +@(private) +_clean_glob_path :: proc(path: string, temp_buf: []byte) -> (prefix_len: int, cleaned: string) { + when ODIN_OS == .Windows { + vol_len := _volume_name_len(path) + + switch { + case path == "": + return 0, "." + case vol_len+1 == len(path) && is_path_separator(path[len(path)-1]): // /, \, C:\, C:/ + return vol_len+1, path + case vol_len == len(path) && len(path) == 2: // C: + copy(temp_buf[:], path) + temp_buf[2] = '.' + return vol_len, string(temp_buf[:3]) + } + + if vol_len >= len(path) { + vol_len = len(path) -1 + } + return vol_len, path[:len(path)-1] + } else { + switch path { + case "": + return 0, "." + case _Path_Separator_String: + return 0, path + } + return 0, path[:len(path)-1] + } +} \ No newline at end of file diff --git a/core/os/os2/path_windows.odin b/core/os/os2/path_windows.odin index ce3828755..f1b58c35b 100644 --- a/core/os/os2/path_windows.odin +++ b/core/os/os2/path_windows.odin @@ -355,4 +355,4 @@ _split_path :: proc(path: string) -> (dir, file: string) { return path[:i], path[i+1:] } return "", path -} +} \ No newline at end of file diff --git a/core/path/filepath/match.odin b/core/path/filepath/match.odin index e474085ed..00f5bcc3f 100644 --- a/core/path/filepath/match.odin +++ b/core/path/filepath/match.odin @@ -3,14 +3,6 @@ package filepath import os "core:os/os2" -import "core:slice" -import "core:strings" -import "core:unicode/utf8" - -Match_Error :: enum { - None, - Syntax_Error, -} // match states whether "name" matches the shell pattern // Pattern syntax is: @@ -34,183 +26,7 @@ Match_Error :: enum { // // NOTE(bill): This is effectively the shell pattern matching system found // -match :: proc(pattern, name: string) -> (matched: bool, err: Match_Error) { - pattern, name := pattern, name - pattern_loop: for len(pattern) > 0 { - star: bool - chunk: string - star, chunk, pattern = scan_chunk(pattern) - if star && chunk == "" { - return !strings.contains(name, SEPARATOR_STRING), .None - } - - t: string - ok: bool - t, ok, err = match_chunk(chunk, name) - - if ok && (len(t) == 0 || len(pattern) > 0) { - name = t - continue - } - if err != .None { - return - } - if star { - for i := 0; i < len(name) && name[i] != SEPARATOR; i += 1 { - t, ok, err = match_chunk(chunk, name[i+1:]) - if ok { - if len(pattern) == 0 && len(t) > 0 { - continue - } - name = t - continue pattern_loop - } - if err != .None { - return - } - } - } - - return false, .None - } - - return len(name) == 0, .None -} - - -@(private="file") -scan_chunk :: proc(pattern: string) -> (star: bool, chunk, rest: string) { - pattern := pattern - for len(pattern) > 0 && pattern[0] == '*' { - pattern = pattern[1:] - star = true - } - - in_range, i := false, 0 - - scan_loop: for i = 0; i < len(pattern); i += 1 { - switch pattern[i] { - case '\\': - when ODIN_OS != .Windows { - if i+1 < len(pattern) { - i += 1 - } - } - case '[': - in_range = true - case ']': - in_range = false - case '*': - in_range or_break scan_loop - - } - } - return star, pattern[:i], pattern[i:] -} - -@(private="file") -match_chunk :: proc(chunk, s: string) -> (rest: string, ok: bool, err: Match_Error) { - chunk, s := chunk, s - for len(chunk) > 0 { - if len(s) == 0 { - return - } - switch chunk[0] { - case '[': - r, w := utf8.decode_rune_in_string(s) - s = s[w:] - chunk = chunk[1:] - is_negated := false - if len(chunk) > 0 && chunk[0] == '^' { - is_negated = true - chunk = chunk[1:] - } - match := false - range_count := 0 - for { - if len(chunk) > 0 && chunk[0] == ']' && range_count > 0 { - chunk = chunk[1:] - break - } - lo, hi: rune - if lo, chunk, err = get_escape(chunk); err != .None { - return - } - hi = lo - if chunk[0] == '-' { - if hi, chunk, err = get_escape(chunk[1:]); err != .None { - return - } - } - - if lo <= r && r <= hi { - match = true - } - range_count += 1 - } - if match == is_negated { - return - } - - case '?': - if s[0] == SEPARATOR { - return - } - _, w := utf8.decode_rune_in_string(s) - s = s[w:] - chunk = chunk[1:] - - case '\\': - when ODIN_OS != .Windows { - chunk = chunk[1:] - if len(chunk) == 0 { - err = .Syntax_Error - return - } - } - fallthrough - case: - if chunk[0] != s[0] { - return - } - s = s[1:] - chunk = chunk[1:] - - } - } - return s, true, .None -} - -@(private="file") -get_escape :: proc(chunk: string) -> (r: rune, next_chunk: string, err: Match_Error) { - if len(chunk) == 0 || chunk[0] == '-' || chunk[0] == ']' { - err = .Syntax_Error - return - } - chunk := chunk - if chunk[0] == '\\' && ODIN_OS != .Windows { - chunk = chunk[1:] - if len(chunk) == 0 { - err = .Syntax_Error - return - } - } - - w: int - r, w = utf8.decode_rune_in_string(chunk) - if r == utf8.RUNE_ERROR && w == 1 { - err = .Syntax_Error - } - - next_chunk = chunk[w:] - if len(next_chunk) == 0 { - err = .Syntax_Error - } - - return -} - - +match :: os.match // glob returns the names of all files matching pattern or nil if there are no matching files // The syntax of patterns is the same as "match". @@ -218,140 +34,4 @@ get_escape :: proc(chunk: string) -> (r: rune, next_chunk: string, err: Match_Er // // glob ignores file system errors // -glob :: proc(pattern: string, allocator := context.allocator) -> (matches: []string, err: Match_Error) { - context.allocator = allocator - - if !has_meta(pattern) { - // TODO(bill): os.lstat on here to check for error - m := make([]string, 1) - m[0] = pattern - return m[:], .None - } - - dir, file := split(pattern) - volume_len := 0 - when ODIN_OS == .Windows { - temp_buf: [8]byte - volume_len, dir = clean_glob_path_windows(dir, temp_buf[:]) - - } else { - dir = clean_glob_path(dir) - } - - if !has_meta(dir[volume_len:]) { - m, e := _glob(dir, file, nil) - return m[:], e - } - - m: []string - m, err = glob(dir) - if err != .None { - return - } - defer { - for s in m { - delete(s) - } - delete(m) - } - - dmatches := make([dynamic]string, 0, 0) - for d in m { - dmatches, err = _glob(d, file, &dmatches) - if err != .None { - break - } - } - if len(dmatches) > 0 { - matches = dmatches[:] - } - return -} - -// Internal implementation of `glob`, not meant to be used by the user. Prefer `glob`. -_glob :: proc(dir, pattern: string, matches: ^[dynamic]string, allocator := context.allocator) -> (m: [dynamic]string, e: Match_Error) { - context.allocator = allocator - - if matches != nil { - m = matches^ - } else { - m = make([dynamic]string, 0, 0) - } - - - d, derr := os.open(dir, os.O_RDONLY) - if derr != nil { - return - } - defer os.close(d) - - { - file_info, ferr := os.fstat(d, allocator) - defer os.file_info_delete(file_info, allocator) - - if ferr != nil { - return - } - if file_info.type != .Directory { - return - } - } - - - fis, _ := os.read_dir(d, -1, allocator) - slice.sort_by(fis, proc(a, b: os.File_Info) -> bool { - return a.name < b.name - }) - defer os.file_info_slice_delete(fis, allocator) - - for fi in fis { - n := fi.name - matched := match(pattern, n) or_return - if matched { - append(&m, join({dir, n})) - } - } - return -} - -@(private) -has_meta :: proc(path: string) -> bool { - when ODIN_OS == .Windows { - CHARS :: `*?[` - } else { - CHARS :: `*?[\` - } - return strings.contains_any(path, CHARS) -} - -@(private) -clean_glob_path :: proc(path: string) -> string { - switch path { - case "": - return "." - case SEPARATOR_STRING: - return path - } - return path[:len(path)-1] -} - - -@(private) -clean_glob_path_windows :: proc(path: string, temp_buf: []byte) -> (prefix_len: int, cleaned: string) { - vol_len := volume_name_len(path) - switch { - case path == "": - return 0, "." - case vol_len+1 == len(path) && is_separator(path[len(path)-1]): // /, \, C:\, C:/ - return vol_len+1, path - case vol_len == len(path) && len(path) == 2: // C: - copy(temp_buf[:], path) - temp_buf[2] = '.' - return vol_len, string(temp_buf[:3]) - } - - if vol_len >= len(path) { - vol_len = len(path) -1 - } - return vol_len, path[:len(path)-1] -} \ No newline at end of file +glob :: os.glob \ No newline at end of file diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index dbad98fa1..efc1707af 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -2,19 +2,14 @@ // To process paths such as URLs that depend on forward slashes regardless of the OS, use the slashpath package. package filepath -import "base:runtime" -import "core:strings" +import "base:runtime" +import os "core:os/os2" +import "core:strings" SEPARATOR_CHARS :: `/\` // is_separator checks whether the byte is a valid separator character -is_separator :: proc(c: byte) -> bool { - switch c { - case '/': return true - case '\\': return ODIN_OS == .Windows - } - return false -} +is_separator :: os.is_path_separator @(private) is_slash :: proc(c: byte) -> bool { @@ -23,14 +18,7 @@ is_slash :: proc(c: byte) -> bool { // Splits path immediate following the last separator; separating the path into a directory and file. // If no separator is found, `dir` will be empty and `path` set to `path`. -split :: proc(path: string) -> (dir, file: string) { - vol := volume_name(path) - i := len(path) - 1 - for i >= len(vol) && !is_separator(path[i]) { - i -= 1 - } - return path[:i+1], path[i+1:] -} +split :: os.split_path /* Returns leading volume name. @@ -123,30 +111,7 @@ volume_name_len :: proc(path: string) -> int { Returns "." if the path is an empty string. */ -base :: proc(path: string) -> string { - if path == "" { - return "." - } - - path := path - for len(path) > 0 && is_separator(path[len(path)-1]) { - path = path[:len(path)-1] - } - - path = path[volume_name_len(path):] - - i := len(path)-1 - for i >= 0 && !is_separator(path[i]) { - i -= 1 - } - if i >= 0 { - path = path[i+1:] - } - if path == "" { - return SEPARATOR_STRING - } - return path -} +base :: os.base /* Gets the name of a file from a path. @@ -163,24 +128,7 @@ base :: proc(path: string) -> string { Returns an empty string if there is no stem. e.g: '.gitignore'. Returns an empty string if there's a trailing path separator. */ -stem :: proc(path: string) -> string { - if len(path) > 0 && is_separator(path[len(path) - 1]) { - // NOTE(tetra): Trailing separator - return "" - } - - // NOTE(tetra): Get the basename - path := path - if i := strings.last_index_any(path, SEPARATOR_CHARS); i != -1 { - path = path[i+1:] - } - - if i := strings.last_index_byte(path, '.'); i != -1 { - return path[:i] - } - - return path -} +stem :: os.stem /* Gets the name of a file from a path. @@ -196,13 +144,7 @@ stem :: proc(path: string) -> string { Returns an empty string if there is no stem. e.g: '.gitignore'. Returns an empty string if there's a trailing path separator. */ -short_stem :: proc(path: string) -> string { - s := stem(path) - if i := strings.index_byte(s, '.'); i != -1 { - return s[:i] - } - return s -} +short_stem :: os.short_stem /* Gets the file extension from a path, including the dot. @@ -219,14 +161,7 @@ short_stem :: proc(path: string) -> string { Returns an empty string if there is no dot. Returns an empty string if there is a trailing path separator. */ -ext :: proc(path: string) -> string { - for i := len(path)-1; i >= 0 && !is_separator(path[i]); i -= 1 { - if path[i] == '.' { - return path[i:] - } - } - return "" -} +ext :: os.ext /* Gets the file extension from a path, including the dot. @@ -242,24 +177,7 @@ ext :: proc(path: string) -> string { Returns an empty string if there is no dot. Returns an empty string if there is a trailing path separator. */ -long_ext :: proc(path: string) -> string { - if len(path) > 0 && is_separator(path[len(path) - 1]) { - // NOTE(tetra): Trailing separator - return "" - } - - // NOTE(tetra): Get the basename - path := path - if i := strings.last_index_any(path, SEPARATOR_CHARS); i != -1 { - path = path[i+1:] - } - - if i := strings.index_byte(path, '.'); i != -1 { - return path[i:] - } - - return "" -} +long_ext :: os.long_ext /* Returns the shortest path name equivalent to `path` through solely lexical processing. @@ -591,4 +509,4 @@ lazy_buffer_destroy :: proc(lb: ^Lazy_Buffer) -> runtime.Allocator_Error { err := delete(lb.b) lb^ = {} return err -} +} \ No newline at end of file diff --git a/core/path/filepath/path_windows.odin b/core/path/filepath/path_windows.odin index 862649532..5b81d57a0 100644 --- a/core/path/filepath/path_windows.odin +++ b/core/path/filepath/path_windows.odin @@ -41,7 +41,7 @@ abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { if err != nil { return "", false } - p := clean(full_path, allocator) + p, _ := clean(full_path, allocator) return p, true } @@ -68,7 +68,8 @@ join_non_empty :: proc(elems: []string, allocator := context.allocator) -> (join } s := strings.join(elems[i:], SEPARATOR_STRING, context.temp_allocator) or_return s = strings.concatenate({elems[0], s}, context.temp_allocator) or_return - return clean(s) + s, _ = clean(s) + return } p := strings.join(elems, SEPARATOR_STRING, context.temp_allocator) or_return From 691dc44719700add54f1ec86fbed9f9a93183855 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 31 Oct 2025 14:24:30 +0100 Subject: [PATCH 373/766] Add `glob` + `match` to os2 --- core/os/os2/path.odin | 30 ++++++++++++++++++++++-------- tests/core/os/os2/path.odin | 8 ++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/core/os/os2/path.odin b/core/os/os2/path.odin index 55659d88f..c3effe69e 100644 --- a/core/os/os2/path.odin +++ b/core/os/os2/path.odin @@ -22,6 +22,11 @@ is_path_separator :: proc(c: byte) -> bool { return _is_path_separator(c) } +@(private) +is_slash :: proc(c: byte) -> bool { + return c == '\\' || c == '/' +} + mkdir :: make_directory /* @@ -668,6 +673,15 @@ match :: proc(pattern, name: string) -> (matched: bool, err: Error) { // glob ignores file system errors // glob :: proc(pattern: string, allocator := context.allocator) -> (matches: []string, err: Error) { + _split :: proc(path: string) -> (dir, file: string) { + vol := volume_name(path) + i := len(path) - 1 + for i >= len(vol) && !is_path_separator(path[i]) { + i -= 1 + } + return path[:i+1], path[i+1:] + } + context.allocator = allocator if !has_meta(pattern) { @@ -677,13 +691,14 @@ glob :: proc(pattern: string, allocator := context.allocator) -> (matches: []str return m[:], nil } - dir, file := split_path(pattern) + // NOTE(Jeroen): For `glob`, we need this version of `split`, which leaves the trailing `/` on `dir`. + dir, file := _split(pattern) - volume_len: int - temp_buf: [8]byte - volume_len, dir = _clean_glob_path(dir, temp_buf[:]) + temp_buf: [8]byte + vol_len: int + vol_len, dir = clean_glob_path(dir, temp_buf[:]) - if !has_meta(dir[volume_len:]) { + if !has_meta(dir[vol_len:]) { m, e := _glob(dir, file, nil) return m[:], e } @@ -904,10 +919,9 @@ has_meta :: proc(path: string) -> bool { } @(private) -_clean_glob_path :: proc(path: string, temp_buf: []byte) -> (prefix_len: int, cleaned: string) { +clean_glob_path :: proc(path: string, temp_buf: []byte) -> (int, string) { when ODIN_OS == .Windows { vol_len := _volume_name_len(path) - switch { case path == "": return 0, "." @@ -927,7 +941,7 @@ _clean_glob_path :: proc(path: string, temp_buf: []byte) -> (prefix_len: int, cl switch path { case "": return 0, "." - case _Path_Separator_String: + case Path_Separator_String: return 0, path } return 0, path[:len(path)-1] diff --git a/tests/core/os/os2/path.odin b/tests/core/os/os2/path.odin index 7b1cb0146..1a470396b 100644 --- a/tests/core/os/os2/path.odin +++ b/tests/core/os/os2/path.odin @@ -375,3 +375,11 @@ test_split_path_list :: proc(t: ^testing.T) { } } } + +@(test) +test_glob :: proc(t: ^testing.T) { + + + + +} \ No newline at end of file From 2f587767453eb486df7395be93554e9b5029be4c Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 12:54:20 +0100 Subject: [PATCH 374/766] More conflicts during rebase --- core/time/timezone/tz_unix.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/time/timezone/tz_unix.odin b/core/time/timezone/tz_unix.odin index e4121266d..ac6a4bb50 100644 --- a/core/time/timezone/tz_unix.odin +++ b/core/time/timezone/tz_unix.odin @@ -37,10 +37,11 @@ local_tz_name :: proc(allocator := context.allocator) -> (name: string, success: // Looking for tz path (ex fmt: "UTC", "Etc/UTC" or "America/Los_Angeles") path_dir, path_file := filepath.split(path) + if path_dir == "" { return } - upper_path_dir, upper_path_chunk := filepath.split(path_dir[:len(path_dir)-1]) + upper_path_dir, upper_path_chunk := filepath.split(path_dir[:len(path_dir)]) if upper_path_dir == "" { return } @@ -79,7 +80,6 @@ _region_load :: proc(_reg_str: string, allocator := context.allocator) -> (out_r delete(local_name, allocator) return nil, true } - reg_str = local_name } defer if _reg_str == "local" { delete(reg_str, allocator) } @@ -90,7 +90,7 @@ _region_load :: proc(_reg_str: string, allocator := context.allocator) -> (out_r if tzdir_ok { region_path := filepath.join({tzdir_str, reg_str}, allocator) defer delete(region_path, allocator) - + if tz_reg, ok := load_tzif_file(region_path, reg_str, allocator); ok { return tz_reg, true } From 1c9e36b05ee5d0ad0fd867d71ccc6863ebc90e79 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 1 Nov 2025 11:01:30 +0100 Subject: [PATCH 375/766] Fix js_wasm --- core/os/os2/file_js.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/os/os2/file_js.odin b/core/os/os2/file_js.odin index 492e3557f..91ee7f02e 100644 --- a/core/os/os2/file_js.odin +++ b/core/os/os2/file_js.odin @@ -9,7 +9,7 @@ import "core:time" File_Impl :: distinct rawptr -_open :: proc(name: string, flags: File_Flags, perm: int) -> (f: ^File, err: Error) { +_open :: proc(name: string, flags: File_Flags, perm: Permissions) -> (f: ^File, err: Error) { return nil, .Unsupported } @@ -73,11 +73,11 @@ _fchdir :: proc(f: ^File) -> Error { return .Unsupported } -_fchmod :: proc(f: ^File, mode: int) -> Error { +_fchmod :: proc(f: ^File, mode: Permissions) -> Error { return .Unsupported } -_chmod :: proc(name: string, mode: int) -> Error { +_chmod :: proc(name: string, mode: Permissions) -> Error { return .Unsupported } From 5d03da8365bd17715a29e497398633fcefcbd8c7 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 1 Nov 2025 11:24:39 +0100 Subject: [PATCH 376/766] Start of glob test --- tests/core/os/os2/path.odin | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/tests/core/os/os2/path.odin b/tests/core/os/os2/path.odin index 1a470396b..26cf1c290 100644 --- a/tests/core/os/os2/path.odin +++ b/tests/core/os/os2/path.odin @@ -3,6 +3,7 @@ package tests_core_os_os2 import os "core:os/os2" import "core:log" import "core:testing" +import "core:slice" import "core:strings" @(test) @@ -376,10 +377,33 @@ test_split_path_list :: proc(t: ^testing.T) { } } +Glob_Test :: struct { + pattern: string, + matches: []string, + err: os.Error, +} + +glob_tests := []Glob_Test{ + { + pattern = ODIN_ROOT + "tests/core/os/*/*.txt", + matches = {}, + err = nil, + }, +} + @(test) test_glob :: proc(t: ^testing.T) { + for glob in glob_tests { + files, err := os.glob(glob.pattern, context.allocator) + defer { + for file in files { + delete(file) + } + delete(files) + } + testing.expect_value(t, err, glob.err) - - - + slice.sort(files) + log.infof("files: %v", files) + } } \ No newline at end of file From 5924fb448ee13deca0fe6536cdd7f76fe5d6a583 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 1 Nov 2025 12:59:35 +0100 Subject: [PATCH 377/766] Add tests for glob + match --- core/os/os2/path.odin | 10 ++++++- tests/core/os/os2/path.odin | 55 +++++++++++++++++++++++++++++++------ 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/core/os/os2/path.odin b/core/os/os2/path.odin index c3effe69e..1d3dca5c9 100644 --- a/core/os/os2/path.odin +++ b/core/os/os2/path.odin @@ -771,6 +771,14 @@ scan_chunk :: proc(pattern: string) -> (star: bool, chunk, rest: string) { @(private="file") match_chunk :: proc(chunk, s: string) -> (rest: string, ok: bool, err: Error) { + slash_equal :: proc(a, b: u8) -> bool { + switch a { + case '/': return b == '/' || b == '\\' + case '\\': return b == '/' || b == '\\' + case: return a == b + } + } + chunk, s := chunk, s for len(chunk) > 0 { if len(s) == 0 { @@ -831,7 +839,7 @@ match_chunk :: proc(chunk, s: string) -> (rest: string, ok: bool, err: Error) { } fallthrough case: - if chunk[0] != s[0] { + if !slash_equal(chunk[0], s[0]) { return } s = s[1:] diff --git a/tests/core/os/os2/path.odin b/tests/core/os/os2/path.odin index 26cf1c290..a256b3e22 100644 --- a/tests/core/os/os2/path.odin +++ b/tests/core/os/os2/path.odin @@ -1,5 +1,6 @@ package tests_core_os_os2 +import "core:fmt" import os "core:os/os2" import "core:log" import "core:testing" @@ -386,24 +387,62 @@ Glob_Test :: struct { glob_tests := []Glob_Test{ { pattern = ODIN_ROOT + "tests/core/os/*/*.txt", - matches = {}, - err = nil, + matches = { + ODIN_ROOT + "tests/core/os/dir/b.txt", + }, + err = {}, + }, + { + pattern = ODIN_ROOT + "tests/core/os/os2/*.odin", + matches = { + ODIN_ROOT + "tests/core/os/os2/dir.odin", + ODIN_ROOT + "tests/core/os/os2/file.odin", + ODIN_ROOT + "tests/core/os/os2/path.odin", + ODIN_ROOT + "tests/core/os/os2/process.odin", + }, + err = {}, }, } @(test) test_glob :: proc(t: ^testing.T) { + compare_matches :: proc(t: ^testing.T, pattern: string, globbed, expected: []string) { + glob_fold := make([]string, len(globbed), context.temp_allocator) + expect_fold := make([]string, len(globbed), context.temp_allocator) + + for glob, i in globbed { + // If `glob` returned a path in response to a pattern, + // then `match` should consider that path a match, too, + // irrespective of `/` versus `\` presence. + no_match_msg := fmt.tprintf("Expected os.match(%q, %q) to be `true`, got `false`", pattern, glob) + match, _ := os.match(pattern, glob) + + f, _ := strings.replace_all(glob, `\`, `/`, context.temp_allocator) + glob_fold[i] = f + testing.expect(t, match, no_match_msg) + } + + for exp, i in expected { + f, _ := strings.replace_all(exp, `\`, `/`, context.temp_allocator) + expect_fold[i] = f + } + + slice.sort(glob_fold) + slice.sort(expect_fold) + + not_equal_msg := fmt.tprintf("Expected os.glob(%q) to return %v, got %v", pattern, glob_fold, expect_fold) + testing.expect(t, slice.equal(glob_fold, expect_fold), not_equal_msg) + } + for glob in glob_tests { - files, err := os.glob(glob.pattern, context.allocator) + globbed, err := os.glob(glob.pattern, context.allocator) defer { - for file in files { + for file in globbed { delete(file) } - delete(files) + delete(globbed) } testing.expect_value(t, err, glob.err) - - slice.sort(files) - log.infof("files: %v", files) + compare_matches(t, glob.pattern, globbed, glob.matches) } } \ No newline at end of file From 0c341123cb7cd07db56def2be23865550bdef75a Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 12:56:00 +0100 Subject: [PATCH 378/766] More conflicts during rebase --- core/os/os2/path.odin | 28 ++-- core/os/os2/path_windows.odin | 1 + core/os/os2/stat.odin | 4 + core/os/os2/stat_js.odin | 4 + core/os/os2/stat_linux.odin | 4 + core/os/os2/stat_posix.odin | 4 + core/os/os2/stat_wasi.odin | 4 + core/path/filepath/path.odin | 186 ++++----------------------- core/path/filepath/path_js.odin | 16 --- core/path/filepath/path_unix.odin | 23 +--- core/path/filepath/path_wasi.odin | 18 +-- core/path/filepath/path_windows.odin | 72 +---------- core/time/timezone/tz_unix.odin | 12 +- 13 files changed, 75 insertions(+), 301 deletions(-) diff --git a/core/os/os2/path.odin b/core/os/os2/path.odin index 1d3dca5c9..2c6412a8f 100644 --- a/core/os/os2/path.odin +++ b/core/os/os2/path.odin @@ -328,9 +328,9 @@ split_path :: proc(path: string) -> (dir, filename: string) { Gets the file name and extension from a path. e.g. - 'path/to/name.tar.gz' -> 'name.tar.gz' - 'path/to/name.txt' -> 'name.txt' - 'path/to/name' -> 'name' + 'path/to/name.tar.gz' -> 'name.tar.gz' + 'path/to/name.txt' -> 'name.txt' + 'path/to/name' -> 'name' Returns "." if the path is an empty string. */ @@ -352,8 +352,8 @@ Only the last dot is considered when splitting the file extension. See `short_stem`. e.g. - 'name.tar.gz' -> 'name.tar' - 'name.txt' -> 'name' + 'name.tar.gz' -> 'name.tar' + 'name.txt' -> 'name' Returns an empty string if there is no stem. e.g: '.gitignore'. Returns an empty string if there's a trailing path separator. @@ -389,8 +389,8 @@ where `long_ext` is the extension returned by `split_filename_all`. The first dot is used to split off the file extension, unlike `stem` which uses the last dot. e.g. - 'name.tar.gz' -> 'name' - 'name.txt' -> 'name' + 'name.tar.gz' -> 'name' + 'name.txt' -> 'name' Returns an empty string if there is no stem. e.g: '.gitignore'. Returns an empty string if there's a trailing path separator. @@ -412,8 +412,8 @@ Only the last dot is considered when splitting the file extension. See `long_ext`. e.g. - 'name.tar.gz' -> '.gz' - 'name.txt' -> '.txt' + 'name.tar.gz' -> '.gz' + 'name.txt' -> '.txt' Returns an empty string if there is no dot. Returns an empty string if there is a trailing path separator. @@ -435,8 +435,8 @@ The long file extension is such that `short_stem(path)` + `long_ext(path)` = `ba The first dot is used to split off the file extension, unlike `ext` which uses the last dot. e.g. - 'name.tar.gz' -> '.tar.gz' - 'name.txt' -> '.txt' + 'name.tar.gz' -> '.tar.gz' + 'name.txt' -> '.txt' Returns an empty string if there is no dot. Returns an empty string if there is a trailing path separator. @@ -616,7 +616,7 @@ Pattern syntax is: '*' matches any sequence of non-/ characters '?' matches any single non-/ character '[' ['^'] { character-range } ']' - character classification (cannot be empty) + character classification (cannot be empty) c matches character c (c != '*', '?', '\\', '[') '\\' c matches character c @@ -728,8 +728,8 @@ glob :: proc(pattern: string, allocator := context.allocator) -> (matches: []str Returns leading volume name. e.g. - "C:\foo\bar\baz" will return "C:" on Windows. - Everything else will be "". + "C:\foo\bar\baz" will return "C:" on Windows. + Everything else will be "". */ volume_name :: proc(path: string) -> string { when ODIN_OS == .Windows { diff --git a/core/os/os2/path_windows.odin b/core/os/os2/path_windows.odin index f1b58c35b..275fe3e18 100644 --- a/core/os/os2/path_windows.odin +++ b/core/os/os2/path_windows.odin @@ -157,6 +157,7 @@ _get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err } } +@(private) can_use_long_paths: bool @(init) diff --git a/core/os/os2/stat.odin b/core/os/os2/stat.odin index 58df45754..0a9ac4e57 100644 --- a/core/os/os2/stat.odin +++ b/core/os/os2/stat.odin @@ -111,3 +111,7 @@ modification_time_by_path :: proc(path: string) -> (time.Time, Error) { fi, err := stat(path, temp_allocator) return fi.modification_time, err } + +is_reserved_name :: proc(path: string) -> bool { + return _is_reserved_name(path) +} \ No newline at end of file diff --git a/core/os/os2/stat_js.odin b/core/os/os2/stat_js.odin index 439226490..e37864936 100644 --- a/core/os/os2/stat_js.odin +++ b/core/os/os2/stat_js.odin @@ -18,4 +18,8 @@ _lstat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, er _same_file :: proc(fi1, fi2: File_Info) -> bool { return fi1.fullpath == fi2.fullpath +} + +_is_reserved_name :: proc(path: string) -> bool { + return false } \ No newline at end of file diff --git a/core/os/os2/stat_linux.odin b/core/os/os2/stat_linux.odin index 6185252cf..dc5bccb54 100644 --- a/core/os/os2/stat_linux.odin +++ b/core/os/os2/stat_linux.odin @@ -73,3 +73,7 @@ _lstat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, er _same_file :: proc(fi1, fi2: File_Info) -> bool { return fi1.fullpath == fi2.fullpath } + +_is_reserved_name :: proc(path: string) -> bool { + return false +} \ No newline at end of file diff --git a/core/os/os2/stat_posix.odin b/core/os/os2/stat_posix.odin index 4ed96b389..e401ffe40 100644 --- a/core/os/os2/stat_posix.odin +++ b/core/os/os2/stat_posix.odin @@ -135,3 +135,7 @@ _lstat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, er _same_file :: proc(fi1, fi2: File_Info) -> bool { return fi1.fullpath == fi2.fullpath } + +_is_reserved_name :: proc(path: string) -> bool { + return false +} \ No newline at end of file diff --git a/core/os/os2/stat_wasi.odin b/core/os/os2/stat_wasi.odin index bf18d8273..f15479e22 100644 --- a/core/os/os2/stat_wasi.odin +++ b/core/os/os2/stat_wasi.odin @@ -98,3 +98,7 @@ _lstat :: proc(name: string, allocator: runtime.Allocator) -> (fi: File_Info, er _same_file :: proc(fi1, fi2: File_Info) -> bool { return fi1.fullpath == fi2.fullpath } + +_is_reserved_name :: proc(path: string) -> bool { + return false +} \ No newline at end of file diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index efc1707af..db8269cc2 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -16,10 +16,30 @@ is_slash :: proc(c: byte) -> bool { return c == '\\' || c == '/' } +/* + In Windows, returns `true` if `path` is one of the following: + "CON", "PRN", "AUX", "NUL", + "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", + "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9", + + On other platforms, returns `false`. +*/ +is_reserved_name :: os.is_reserved_name + // Splits path immediate following the last separator; separating the path into a directory and file. // If no separator is found, `dir` will be empty and `path` set to `path`. split :: os.split_path + +/* +Join all `elems` with the system's path separator and normalize the result. + +*Allocates Using Provided Allocator* + +For example, `join_path({"/home", "foo", "bar.txt"})` will result in `"/home/foo/bar.txt"`. +*/ +join :: os.join_path + /* Returns leading volume name. @@ -27,79 +47,7 @@ split :: os.split_path "C:\foo\bar\baz" will return "C:" on Windows. Everything else will be "". */ -volume_name :: proc(path: string) -> string { - return path[:volume_name_len(path)] -} - -// Returns the length of the volume name in bytes. -volume_name_len :: proc(path: string) -> int { - if ODIN_OS == .Windows { - if len(path) < 2 { - return 0 - } - - if path[1] == ':' { - switch path[0] { - case 'a'..='z', 'A'..='Z': - return 2 - } - } - - /* - See: URL: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx - Further allowed paths can be of the form of: - - \\server\share or \\server\share\more\path - - \\?\C:\... - - \\.\PhysicalDriveX - */ - // Any remaining kind of path has to start with two slashes. - if !is_separator(path[0]) || !is_separator(path[1]) { - return 0 - } - - // Device path. The volume name is the whole string - if len(path) >= 5 && path[2] == '.' && is_separator(path[3]) { - return len(path) - } - - // We're a UNC share `\\host\share`, file namespace `\\?\C:` or UNC in file namespace `\\?\\host\share` - prefix := 2 - - // File namespace. - if len(path) >= 5 && path[2] == '?' && is_separator(path[3]) { - if is_separator(path[4]) { - // `\\?\\` UNC path in file namespace - prefix = 5 - } - - if len(path) >= 6 && path[5] == ':' { - switch path[4] { - case 'a'..='z', 'A'..='Z': - return 6 - case: - return 0 - } - } - } - - // UNC path, minimum version of the volume is `\\h\s` for host, share. - // Can also contain an IP address in the host position. - slash_count := 0 - for i in prefix.. 0 { - slash_count += 1 - - if slash_count == 2 { - return i - } - } - } - - return len(path) - } - return 0 -} +volume_name :: os.volume_name /* Gets the file name and extension from a path. @@ -194,87 +142,7 @@ long_ext :: os.long_ext If the result of the path is an empty string, the returned path with be `"."`. */ -clean :: proc(path: string, allocator := context.allocator) -> (cleaned: string, err: runtime.Allocator_Error) #optional_allocator_error { - context.allocator = allocator - - path := path - original_path := path - vol_len := volume_name_len(path) - path = path[vol_len:] - - if path == "" { - if vol_len > 1 && original_path[1] != ':' { - s, ok := from_slash(original_path) - if !ok { - s = strings.clone(s) or_return - } - return s, nil - } - return strings.concatenate({original_path, "."}) - } - - rooted := is_separator(path[0]) - - n := len(path) - out := &Lazy_Buffer{ - s = path, - vol_and_path = original_path, - vol_len = vol_len, - } - defer lazy_buffer_destroy(out) - - r, dot_dot := 0, 0 - if rooted { - lazy_buffer_append(out, SEPARATOR) or_return - r, dot_dot = 1, 1 - } - - for r < n { - switch { - case is_separator(path[r]): - r += 1 - case path[r] == '.' && (r+1 == n || is_separator(path[r+1])): - r += 1 - case path[r] == '.' && path[r+1] == '.' && (r+2 == n || is_separator(path[r+2])): - r += 2 - switch { - case out.w > dot_dot: - out.w -= 1 - for out.w > dot_dot && !is_separator(lazy_buffer_index(out, out.w)) { - out.w -= 1 - } - case !rooted: - if out.w > 0 { - lazy_buffer_append(out, SEPARATOR) or_return - } - lazy_buffer_append(out, '.') or_return - lazy_buffer_append(out, '.') or_return - dot_dot = out.w - } - case: - if rooted && out.w != 1 || !rooted && out.w != 0 { - lazy_buffer_append(out, SEPARATOR) or_return - } - for ; r < n && !is_separator(path[r]); r += 1 { - lazy_buffer_append(out, path[r]) or_return - } - - } - } - - if out.w == 0 { - lazy_buffer_append(out, '.') or_return - } - - s := lazy_buffer_string(out) or_return - - new_allocation: bool - cleaned, new_allocation = from_slash(s) - if new_allocation { - delete(s) - } - return -} +clean :: os.clean_path // Returns the result of replacing each forward slash `/` character in the path with the separate OS specific character. from_slash :: proc(path: string, allocator := context.allocator) -> (new_path: string, new_allocation: bool) { @@ -295,7 +163,6 @@ to_slash :: proc(path: string, allocator := context.allocator) -> (new_path: str Relative_Error :: enum { None, - Cannot_Relate, } @@ -308,8 +175,10 @@ Relative_Error :: enum { */ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> (string, Relative_Error) { context.allocator = allocator - base_clean := clean(base_path, allocator) - target_clean := clean(target_path, allocator) + base_clean, base_err := clean(base_path, allocator) + if base_err != nil { return "", .Cannot_Relate} + target_clean, target_err := clean(target_path, allocator) + if target_err != nil { return "", .Cannot_Relate} defer delete(base_clean, allocator) defer delete(target_clean, allocator) @@ -390,7 +259,8 @@ dir :: proc(path: string, allocator := context.allocator) -> string { for i >= len(vol) && !is_separator(path[i]) { i -= 1 } - dir := clean(path[len(vol) : i+1]) + dir, dir_err := clean(path[len(vol) : i+1], allocator) + if dir_err != nil { return "" } defer delete(dir) if dir == "." && len(vol) > 2 { return strings.clone(vol) diff --git a/core/path/filepath/path_js.odin b/core/path/filepath/path_js.odin index 3b5ac04f5..c0c85b487 100644 --- a/core/path/filepath/path_js.odin +++ b/core/path/filepath/path_js.odin @@ -1,17 +1,12 @@ package filepath import "base:runtime" - import "core:strings" SEPARATOR :: '/' SEPARATOR_STRING :: `/` LIST_SEPARATOR :: ':' -is_reserved_name :: proc(path: string) -> bool { - return false -} - is_abs :: proc(path: string) -> bool { return strings.has_prefix(path, "/") } @@ -22,15 +17,4 @@ abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { } return path, false -} - -join :: proc(elems: []string, allocator := context.allocator) -> (joined: string, err: runtime.Allocator_Error) #optional_allocator_error { - for e, i in elems { - if e != "" { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) - p := strings.join(elems[i:], SEPARATOR_STRING, context.temp_allocator) or_return - return clean(p, allocator) - } - } - return "", nil } \ No newline at end of file diff --git a/core/path/filepath/path_unix.odin b/core/path/filepath/path_unix.odin index 8bf412599..e43264961 100644 --- a/core/path/filepath/path_unix.odin +++ b/core/path/filepath/path_unix.odin @@ -1,19 +1,13 @@ #+build linux, darwin, freebsd, openbsd, netbsd, haiku package filepath -import "base:runtime" - -import "core:strings" -import "core:sys/posix" +import "core:strings" +import "core:sys/posix" SEPARATOR :: '/' SEPARATOR_STRING :: `/` LIST_SEPARATOR :: ':' -is_reserved_name :: proc(path: string) -> bool { - return false -} - is_abs :: proc(path: string) -> bool { return strings.has_prefix(path, "/") } @@ -32,15 +26,4 @@ abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { path_str := strings.clone(string(path_ptr), allocator) return path_str, true -} - -join :: proc(elems: []string, allocator := context.allocator) -> (joined: string, err: runtime.Allocator_Error) #optional_allocator_error { - for e, i in elems { - if e != "" { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) - p := strings.join(elems[i:], SEPARATOR_STRING, context.temp_allocator) or_return - return clean(p, allocator) - } - } - return "", nil -} +} \ No newline at end of file diff --git a/core/path/filepath/path_wasi.odin b/core/path/filepath/path_wasi.odin index 74cc6ca1e..c0c85b487 100644 --- a/core/path/filepath/path_wasi.odin +++ b/core/path/filepath/path_wasi.odin @@ -1,17 +1,12 @@ package filepath import "base:runtime" - import "core:strings" SEPARATOR :: '/' SEPARATOR_STRING :: `/` LIST_SEPARATOR :: ':' -is_reserved_name :: proc(path: string) -> bool { - return false -} - is_abs :: proc(path: string) -> bool { return strings.has_prefix(path, "/") } @@ -22,15 +17,4 @@ abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { } return path, false -} - -join :: proc(elems: []string, allocator := context.allocator) -> (joined: string, err: runtime.Allocator_Error) #optional_allocator_error { - for e, i in elems { - if e != "" { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) - p := strings.join(elems[i:], SEPARATOR_STRING, context.temp_allocator) or_return - return clean(p, allocator) - } - } - return "", nil -} +} \ No newline at end of file diff --git a/core/path/filepath/path_windows.odin b/core/path/filepath/path_windows.odin index 5b81d57a0..00aae8d7f 100644 --- a/core/path/filepath/path_windows.odin +++ b/core/path/filepath/path_windows.odin @@ -1,6 +1,5 @@ package filepath -import "core:strings" import "base:runtime" import os "core:os/os2" @@ -8,27 +7,8 @@ SEPARATOR :: '\\' SEPARATOR_STRING :: `\` LIST_SEPARATOR :: ';' -@(private) -reserved_names := [?]string{ - "CON", "PRN", "AUX", "NUL", - "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", - "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9", -} - -is_reserved_name :: proc(path: string) -> bool { - if len(path) == 0 { - return false - } - for reserved in reserved_names { - if strings.equal_fold(path, reserved) { - return true - } - } - return false -} - is_UNC :: proc(path: string) -> bool { - return volume_name_len(path) > 2 + return len(volume_name(path)) > 2 } is_abs :: proc(path: string) -> bool { @@ -43,52 +23,4 @@ abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { } p, _ := clean(full_path, allocator) return p, true -} - -join :: proc(elems: []string, allocator := context.allocator) -> (string, runtime.Allocator_Error) #optional_allocator_error { - for e, i in elems { - if e != "" { - return join_non_empty(elems[i:], allocator) - } - } - return "", nil -} - -join_non_empty :: proc(elems: []string, allocator := context.allocator) -> (joined: string, err: runtime.Allocator_Error) { - context.allocator = allocator - - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = allocator == context.temp_allocator) - - if len(elems[0]) == 2 && elems[0][1] == ':' { - i := 1 - for ; i < len(elems); i += 1 { - if elems[i] != "" { - break - } - } - s := strings.join(elems[i:], SEPARATOR_STRING, context.temp_allocator) or_return - s = strings.concatenate({elems[0], s}, context.temp_allocator) or_return - s, _ = clean(s) - return - } - - p := strings.join(elems, SEPARATOR_STRING, context.temp_allocator) or_return - p = clean(p) or_return - if !is_UNC(p) { - return p, nil - } - - head := clean(elems[0], context.temp_allocator) or_return - if is_UNC(head) { - return p, nil - } - delete(p) // It is not needed now - - tail := strings.join(elems[1:], SEPARATOR_STRING, context.temp_allocator) or_return - tail = clean(tail, context.temp_allocator) or_return - if head[len(head)-1] == SEPARATOR { - return strings.concatenate({head, tail}) - } - - return strings.concatenate({head, SEPARATOR_STRING, tail}) -} +} \ No newline at end of file diff --git a/core/time/timezone/tz_unix.odin b/core/time/timezone/tz_unix.odin index ac6a4bb50..6bab440d9 100644 --- a/core/time/timezone/tz_unix.odin +++ b/core/time/timezone/tz_unix.odin @@ -4,7 +4,6 @@ package timezone import os "core:os/os2" import "core:strings" -import "core:path/filepath" import "core:time/datetime" local_tz_name :: proc(allocator := context.allocator) -> (name: string, success: bool) { @@ -36,12 +35,12 @@ local_tz_name :: proc(allocator := context.allocator) -> (name: string, success: } // Looking for tz path (ex fmt: "UTC", "Etc/UTC" or "America/Los_Angeles") - path_dir, path_file := filepath.split(path) + path_dir, path_file := os.split_path(path) if path_dir == "" { return } - upper_path_dir, upper_path_chunk := filepath.split(path_dir[:len(path_dir)]) + upper_path_dir, upper_path_chunk := os.split_path(path_dir[:len(path_dir)]) if upper_path_dir == "" { return } @@ -51,8 +50,8 @@ local_tz_name :: proc(allocator := context.allocator) -> (name: string, success: if err != nil { return } return region_str, true } else { - region_str, err := filepath.join({upper_path_chunk, path_file}, allocator = allocator) - if err != nil { return } + region_str, region_str_err := os.join_path({upper_path_chunk, path_file}, allocator = allocator) + if region_str_err != nil { return } return region_str, true } } @@ -80,6 +79,7 @@ _region_load :: proc(_reg_str: string, allocator := context.allocator) -> (out_r delete(local_name, allocator) return nil, true } + reg_str = local_name } defer if _reg_str == "local" { delete(reg_str, allocator) } @@ -107,4 +107,4 @@ _region_load :: proc(_reg_str: string, allocator := context.allocator) -> (out_r } return nil, false -} +} \ No newline at end of file From 2e970db51dc6e9edaefd6e3346807d6974bd155d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 1 Nov 2025 17:19:46 +0100 Subject: [PATCH 379/766] Link some more of filepath to os2 --- core/odin/parser/parse_files.odin | 8 +- core/os/os2/dir_walker.odin | 2 +- core/os/os2/path.odin | 29 ++++- core/path/filepath/path.odin | 143 ++++--------------------- core/path/filepath/path_js.odin | 17 +-- core/path/filepath/path_unix.odin | 25 +---- core/path/filepath/path_wasi.odin | 17 +-- core/path/filepath/path_windows.odin | 17 --- core/path/filepath/walk.odin | 152 +++++++++++++++------------ 9 files changed, 139 insertions(+), 271 deletions(-) diff --git a/core/odin/parser/parse_files.odin b/core/odin/parser/parse_files.odin index 5e7bee923..93c282d35 100644 --- a/core/odin/parser/parse_files.odin +++ b/core/odin/parser/parse_files.odin @@ -11,8 +11,8 @@ import "core:strings" collect_package :: proc(path: string) -> (pkg: ^ast.Package, success: bool) { NO_POS :: tokenizer.Pos{} - pkg_path, pkg_path_ok := filepath.abs(path) - if !pkg_path_ok { + pkg_path, pkg_path_err := os.get_absolute_path(path, context.allocator) + if pkg_path_err != nil { return } @@ -28,8 +28,8 @@ collect_package :: proc(path: string) -> (pkg: ^ast.Package, success: bool) { pkg.fullpath = pkg_path for match in matches { - fullpath, ok := filepath.abs(match) - if !ok { + fullpath, fullpath_err := os.get_absolute_path(match, context.allocator) + if fullpath_err != nil { return } diff --git a/core/os/os2/dir_walker.odin b/core/os/os2/dir_walker.odin index 0af751f31..ba5342cf8 100644 --- a/core/os/os2/dir_walker.odin +++ b/core/os/os2/dir_walker.odin @@ -227,4 +227,4 @@ walker_walk :: proc(w: ^Walker) -> (fi: File_Info, ok: bool) { } return info, iter_ok -} +} \ No newline at end of file diff --git a/core/os/os2/path.odin b/core/os/os2/path.odin index 2c6412a8f..ac18b7562 100644 --- a/core/os/os2/path.odin +++ b/core/os/os2/path.odin @@ -22,9 +22,32 @@ is_path_separator :: proc(c: byte) -> bool { return _is_path_separator(c) } -@(private) -is_slash :: proc(c: byte) -> bool { - return c == '\\' || c == '/' +/* +Returns the result of replacing each path separator character in the path +with the `new_sep` rune. + +*Allocates Using Provided Allocator* +*/ +replace_path_separators :: proc(path: string, new_sep: rune, allocator: runtime.Allocator) -> (new_path: string, err: Error) { + buf := make([]u8, len(path), allocator) or_return + + i: int + for r in path { + replacement := r + if r == '/' || r == '\\' { + replacement = new_sep + } + + if replacement <= rune(0x7F) { + buf[i] = u8(replacement) + i += 1 + } else { + b, w := utf8.encode_rune(r) + copy(buf[i:], b[:w]) + i += w + } + } + return string(buf), nil } mkdir :: make_directory diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index db8269cc2..2f2f7996c 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -2,7 +2,6 @@ // To process paths such as URLs that depend on forward slashes regardless of the OS, use the slashpath package. package filepath -import "base:runtime" import os "core:os/os2" import "core:strings" @@ -11,11 +10,6 @@ SEPARATOR_CHARS :: `/\` // is_separator checks whether the byte is a valid separator character is_separator :: os.is_path_separator -@(private) -is_slash :: proc(c: byte) -> bool { - return c == '\\' || c == '/' -} - /* In Windows, returns `true` if `path` is one of the following: "CON", "PRN", "AUX", "NUL", @@ -144,22 +138,25 @@ long_ext :: os.long_ext */ clean :: os.clean_path -// Returns the result of replacing each forward slash `/` character in the path with the separate OS specific character. -from_slash :: proc(path: string, allocator := context.allocator) -> (new_path: string, new_allocation: bool) { - if SEPARATOR == '/' { - return path, false - } - return strings.replace_all(path, "/", SEPARATOR_STRING, allocator) -} +/* +Returns the result of replacing each path separator character in the path +with the specific character `new_sep`. -// Returns the result of replacing each OS specific separator with a forward slash `/` character. -to_slash :: proc(path: string, allocator := context.allocator) -> (new_path: string, new_allocation: bool) { - if SEPARATOR == '/' { - return path, false - } - return strings.replace_all(path, SEPARATOR_STRING, "/", allocator) -} +*Allocates Using Provided Allocator* +*/ +replace_path_separators := os.replace_path_separators +/* +Return true if `path` is an absolute path as opposed to a relative one. +*/ +is_abs :: os.is_absolute_path + +/* +Get the absolute path to `path` with respect to the process's current directory. + +*Allocates Using Provided Allocator* +*/ +abs :: os.get_absolute_path Relative_Error :: enum { None, @@ -275,108 +272,4 @@ dir :: proc(path: string, allocator := context.allocator) -> string { // An empty string returns nil. A non-empty string with no separators returns a 1-element array. // Any empty components will be included, e.g. `a::b` will return a 3-element array, as will `::`. // Separators within pairs of double-quotes will be ignored and stripped, e.g. `"a:b"c:d` will return []{`a:bc`, `d`}. -split_list :: proc(path: string, allocator := context.allocator) -> (list: []string, err: runtime.Allocator_Error) #optional_allocator_error { - if path == "" { - return nil, nil - } - - start: int - quote: bool - - start, quote = 0, false - count := 0 - - for i := 0; i < len(path); i += 1 { - c := path[i] - switch { - case c == '"': - quote = !quote - case c == LIST_SEPARATOR && !quote: - count += 1 - } - } - - start, quote = 0, false - list = make([]string, count + 1, allocator) or_return - index := 0 - for i := 0; i < len(path); i += 1 { - c := path[i] - switch { - case c == '"': - quote = !quote - case c == LIST_SEPARATOR && !quote: - list[index] = path[start:i] - index += 1 - start = i + 1 - } - } - assert(index == count) - list[index] = path[start:] - - for s0, i in list { - s, new := strings.replace_all(s0, `"`, ``, allocator) - if !new { - s = strings.clone(s, allocator) or_return - } - list[i] = s - } - - return list, nil -} - - - - -/* - Lazy_Buffer is a lazily made path buffer - When it does allocate, it uses the context.allocator - */ -@(private) -Lazy_Buffer :: struct { - s: string, - b: []byte, - w: int, // write index - vol_and_path: string, - vol_len: int, -} - -@(private) -lazy_buffer_index :: proc(lb: ^Lazy_Buffer, i: int) -> byte { - if lb.b != nil { - return lb.b[i] - } - return lb.s[i] -} -@(private) -lazy_buffer_append :: proc(lb: ^Lazy_Buffer, c: byte) -> (err: runtime.Allocator_Error) { - if lb.b == nil { - if lb.w < len(lb.s) && lb.s[lb.w] == c { - lb.w += 1 - return - } - lb.b = make([]byte, len(lb.s)) or_return - copy(lb.b, lb.s[:lb.w]) - } - lb.b[lb.w] = c - lb.w += 1 - return -} -@(private) -lazy_buffer_string :: proc(lb: ^Lazy_Buffer) -> (s: string, err: runtime.Allocator_Error) { - if lb.b == nil { - return strings.clone(lb.vol_and_path[:lb.vol_len+lb.w]) - } - - x := lb.vol_and_path[:lb.vol_len] - y := string(lb.b[:lb.w]) - z := make([]byte, len(x)+len(y)) or_return - copy(z, x) - copy(z[len(x):], y) - return string(z), nil -} -@(private) -lazy_buffer_destroy :: proc(lb: ^Lazy_Buffer) -> runtime.Allocator_Error { - err := delete(lb.b) - lb^ = {} - return err -} \ No newline at end of file +split_list :: os.split_path_list \ No newline at end of file diff --git a/core/path/filepath/path_js.odin b/core/path/filepath/path_js.odin index c0c85b487..e2657cb3e 100644 --- a/core/path/filepath/path_js.odin +++ b/core/path/filepath/path_js.odin @@ -1,20 +1,5 @@ package filepath -import "base:runtime" -import "core:strings" - SEPARATOR :: '/' SEPARATOR_STRING :: `/` -LIST_SEPARATOR :: ':' - -is_abs :: proc(path: string) -> bool { - return strings.has_prefix(path, "/") -} - -abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { - if is_abs(path) { - return strings.clone(string(path), allocator), true - } - - return path, false -} \ No newline at end of file +LIST_SEPARATOR :: ':' \ No newline at end of file diff --git a/core/path/filepath/path_unix.odin b/core/path/filepath/path_unix.odin index e43264961..2e1b1419e 100644 --- a/core/path/filepath/path_unix.odin +++ b/core/path/filepath/path_unix.odin @@ -1,29 +1,6 @@ #+build linux, darwin, freebsd, openbsd, netbsd, haiku package filepath -import "core:strings" -import "core:sys/posix" - SEPARATOR :: '/' SEPARATOR_STRING :: `/` -LIST_SEPARATOR :: ':' - -is_abs :: proc(path: string) -> bool { - return strings.has_prefix(path, "/") -} - -abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { - rel := path - if rel == "" { - rel = "." - } - rel_cstr := strings.clone_to_cstring(rel, context.temp_allocator) - path_ptr := posix.realpath(rel_cstr, nil) - if path_ptr == nil { - return "", posix.errno() == nil - } - defer posix.free(path_ptr) - - path_str := strings.clone(string(path_ptr), allocator) - return path_str, true -} \ No newline at end of file +LIST_SEPARATOR :: ':' \ No newline at end of file diff --git a/core/path/filepath/path_wasi.odin b/core/path/filepath/path_wasi.odin index c0c85b487..e2657cb3e 100644 --- a/core/path/filepath/path_wasi.odin +++ b/core/path/filepath/path_wasi.odin @@ -1,20 +1,5 @@ package filepath -import "base:runtime" -import "core:strings" - SEPARATOR :: '/' SEPARATOR_STRING :: `/` -LIST_SEPARATOR :: ':' - -is_abs :: proc(path: string) -> bool { - return strings.has_prefix(path, "/") -} - -abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { - if is_abs(path) { - return strings.clone(string(path), allocator), true - } - - return path, false -} \ No newline at end of file +LIST_SEPARATOR :: ':' \ No newline at end of file diff --git a/core/path/filepath/path_windows.odin b/core/path/filepath/path_windows.odin index 00aae8d7f..9b8e92bbd 100644 --- a/core/path/filepath/path_windows.odin +++ b/core/path/filepath/path_windows.odin @@ -1,26 +1,9 @@ package filepath -import "base:runtime" -import os "core:os/os2" - SEPARATOR :: '\\' SEPARATOR_STRING :: `\` LIST_SEPARATOR :: ';' is_UNC :: proc(path: string) -> bool { return len(volume_name(path)) > 2 -} - -is_abs :: proc(path: string) -> bool { - return os.is_absolute_path(path) -} - -abs :: proc(path: string, allocator := context.allocator) -> (string, bool) { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = allocator == context.temp_allocator) - full_path, err := os.get_absolute_path(path, context.temp_allocator) - if err != nil { - return "", false - } - p, _ := clean(full_path, allocator) - return p, true } \ No newline at end of file diff --git a/core/path/filepath/walk.odin b/core/path/filepath/walk.odin index 845ba06a0..00b063bc7 100644 --- a/core/path/filepath/walk.odin +++ b/core/path/filepath/walk.odin @@ -3,81 +3,103 @@ package filepath import os "core:os/os2" -import "core:slice" -// Walk_Proc is the type of the procedure called for each file or directory visited by 'walk' -// The 'path' parameter contains the parameter to walk as a prefix (this is the same as info.fullpath except on 'root') -// The 'info' parameter is the os.File_Info for the named path -// -// If there was a problem walking to the file or directory named by path, the incoming error will describe the problem -// and the procedure can decide how to handle that error (and walk will not descend into that directory) -// In the case of an error, the info argument will be 0 -// If an error is returned, processing stops -// The sole exception is if 'skip_dir' is returned as true: -// when 'skip_dir' is invoked on a directory. 'walk' skips directory contents -// when 'skip_dir' is invoked on a non-directory. 'walk' skips the remaining files in the containing directory -Walk_Proc :: #type proc(info: os.File_Info, in_err: os.Error, user_data: rawptr) -> (err: os.Error, skip_dir: bool) +Walker :: os.Walker -// walk walks the file tree rooted at 'root', calling 'walk_proc' for each file or directory in the tree, including 'root' -// All errors that happen visiting files and directories are filtered by walk_proc -// The files are walked in lexical order to make the output deterministic -// NOTE: Walking large directories can be inefficient due to the lexical sort -// NOTE: walk does not follow symbolic links -// NOTE: os.File_Info uses the 'context.temp_allocator' to allocate, and will delete when it is done -walk :: proc(root: string, walk_proc: Walk_Proc, user_data: rawptr) -> os.Error { - info, err := os.lstat(root, context.temp_allocator) - defer os.file_info_delete(info, context.temp_allocator) +/* +Initializes a walker, either using a path or a file pointer to a directory the walker will start at. - skip_dir: bool - if err != nil { - err, skip_dir = walk_proc(info, err, user_data) - } else { - err, skip_dir = _walk(info, walk_proc, user_data) - } - return nil if skip_dir else err -} +You are allowed to repeatedly call this to reuse it for later walks. +For an example on how to use the walker, see `walker_walk`. +*/ +walker_init :: os.walker_init -@(private) -_walk :: proc(info: os.File_Info, walk_proc: Walk_Proc, user_data: rawptr) -> (err: os.Error, skip_dir: bool) { - if info.type != .Directory { - if info.fullpath == "" && info.name == "" { - // ignore empty things - return - } - return walk_proc(info, nil, user_data) - } +/* +Creates a walker, either using a path or a file pointer to a directory the walker will start at. - fis: []os.File_Info - err1: os.Error - fis, err = read_dir(info.fullpath, context.temp_allocator) - defer os.file_info_slice_delete(fis, context.temp_allocator) +For an example on how to use the walker, see `walker_walk`. +*/ +walker_create :: os.walker_create - err1, skip_dir = walk_proc(info, err, user_data) - if err != nil || err1 != nil || skip_dir { - err = err1 - return - } +/* +Returns the last error that occurred during the walker's operations. - for fi in fis { - err, skip_dir = _walk(fi, walk_proc, user_data) - if err != nil || skip_dir { - if fi.type != .Directory || !skip_dir { - return +Can be called while iterating, or only at the end to check if anything failed. +*/ +walker_error :: os.walker_error + +walker_destroy :: os.walker_destroy + +// Marks the current directory to be skipped (not entered into). +walker_skip_dir :: os.walker_skip_dir + +/* +Returns the next file info in the iterator, files are iterated in breadth-first order. + +If an error occurred opening a directory, you may get zero'd info struct and +`walker_error` will return the error. + +Example: + package main + + import "core:fmt" + import "core:strings" + import os "core:os/os2" + + main :: proc() { + w := os.walker_create("core") + defer os.walker_destroy(&w) + + for info in os.walker_walk(&w) { + // Optionally break on the first error: + // _ = walker_error(&w) or_break + + // Or, handle error as we go: + if path, err := os.walker_error(&w); err != nil { + fmt.eprintfln("failed walking %s: %s", path, err) + continue } + + // Or, do not handle errors during iteration, and just check the error at the end. + + + + // Skip a directory: + if strings.has_suffix(info.fullpath, ".git") { + os.walker_skip_dir(&w) + continue + } + + fmt.printfln("%#v", info) + } + + // Handle error if one happened during iteration at the end: + if path, err := os.walker_error(&w); err != nil { + fmt.eprintfln("failed walking %s: %v", path, err) } } +*/ +walker_walk :: os.walker_walk - return -} +/* + Reads the file `f` (assuming it is a directory) and returns the unsorted directory entries. + This returns up to `n` entries OR all of them if `n <= 0`. +*/ +read_directory :: os.read_directory -@(private) -read_dir :: proc(dir_name: string, allocator := context.temp_allocator) -> (fis: []os.File_Info, err: os.Error) { - f := os.open(dir_name, os.O_RDONLY) or_return - defer os.close(f) - fis = os.read_dir(f, -1, allocator) or_return - slice.sort_by(fis, proc(a, b: os.File_Info) -> bool { - return a.name < b.name - }) - return -} +/* + Reads the file `f` (assuming it is a directory) and returns all of the unsorted directory entries. +*/ +read_all_directory :: os.read_all_directory + +/* + Reads the named directory by path (assuming it is a directory) and returns the unsorted directory entries. + This returns up to `n` entries OR all of them if `n <= 0`. +*/ +read_directory_by_path :: os.read_directory_by_path + +/* + Reads the named directory by path (assuming it is a directory) and returns all of the unsorted directory entries. +*/ +read_all_directory_by_path :: os.read_all_directory_by_path \ No newline at end of file From 062d7ae3858f1e66ba1cc36574c2c5c2d337150a Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 1 Nov 2025 17:56:26 +0100 Subject: [PATCH 380/766] Port vendor:OpenGL and vendor:fontstash --- vendor/OpenGL/helpers.odin | 38 +++++++++++++++++++----------- vendor/fontstash/fontstash_os.odin | 11 ++++----- vendor/libc-shim/stdlib.odin | 3 +-- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/vendor/OpenGL/helpers.odin b/vendor/OpenGL/helpers.odin index 84e3eae81..0610eb3ac 100644 --- a/vendor/OpenGL/helpers.odin +++ b/vendor/OpenGL/helpers.odin @@ -3,10 +3,11 @@ package vendor_gl // Helper for loading shaders into a program -import "core:os" -import "core:fmt" -import "core:strings" -import "base:runtime" +import os "core:os/os2" +import "core:fmt" +import "core:strings" +import "core:time" +import "base:runtime" _ :: fmt _ :: runtime @@ -150,7 +151,10 @@ create_and_link_program :: proc(shader_ids: []u32, binary_retrievable := false) } load_compute_file :: proc(filename: string, binary_retrievable := false) -> (program_id: u32, ok: bool) { - cs_data := os.read_entire_file(filename) or_return + cs_data, cs_data_err := os.read_entire_file(filename, context.allocator) + if cs_data_err != nil { + return 0, false + } defer delete(cs_data) // Create the shaders @@ -165,10 +169,16 @@ load_compute_source :: proc(cs_data: string, binary_retrievable := false) -> (pr } load_shaders_file :: proc(vs_filename, fs_filename: string, binary_retrievable := false) -> (program_id: u32, ok: bool) { - vs_data := os.read_entire_file(vs_filename) or_return + vs_data, vs_data_err := os.read_entire_file(vs_filename, context.allocator) + if vs_data_err != nil { + return 0, false + } defer delete(vs_data) - fs_data := os.read_entire_file(fs_filename) or_return + fs_data, fs_data_err := os.read_entire_file(fs_filename, context.allocator) + if fs_data_err != nil { + return 0, false + } defer delete(fs_data) return load_shaders_source(string(vs_data), string(fs_data), binary_retrievable) @@ -192,14 +202,14 @@ when ODIN_OS == .Windows { update_shader_if_changed :: proc( vertex_name, fragment_name: string, program: u32, - last_vertex_time, last_fragment_time: os.File_Time, + last_vertex_time, last_fragment_time: time.Time, ) -> ( old_program: u32, - current_vertex_time, current_fragment_time: os.File_Time, + current_vertex_time, current_fragment_time: time.Time, updated: bool, ) { - current_vertex_time, _ = os.last_write_time_by_name(vertex_name) - current_fragment_time, _ = os.last_write_time_by_name(fragment_name) + current_vertex_time, _ = os.modification_time_by_path(vertex_name) + current_fragment_time, _ = os.modification_time_by_path(fragment_name) old_program = program if current_vertex_time != last_vertex_time || current_fragment_time != last_fragment_time { @@ -220,13 +230,13 @@ when ODIN_OS == .Windows { update_shader_if_changed_compute :: proc( compute_name: string, program: u32, - last_compute_time: os.File_Time, + last_compute_time: time.Time, ) -> ( old_program: u32, - current_compute_time: os.File_Time, + current_compute_time: time.Time, updated: bool, ) { - current_compute_time, _ = os.last_write_time_by_name(compute_name) + current_compute_time, _ = os.modification_time_by_path(compute_name) old_program = program if current_compute_time != last_compute_time { diff --git a/vendor/fontstash/fontstash_os.odin b/vendor/fontstash/fontstash_os.odin index e510a4834..8c259412d 100644 --- a/vendor/fontstash/fontstash_os.odin +++ b/vendor/fontstash/fontstash_os.odin @@ -1,8 +1,8 @@ #+build !js package fontstash -import "core:log" -import "core:os" +import "core:log" +import os "core:os/os2" // 'fontIndex' controls which font you want to load within a multi-font format such // as TTC. Leave it as zero if you are loading a single-font format such as TTF. @@ -12,12 +12,11 @@ AddFontPath :: proc( path: string, fontIndex: int = 0, ) -> int { - data, ok := os.read_entire_file(path) + data, data_err := os.read_entire_file(path, context.allocator) - if !ok { + if data_err != nil { log.panicf("FONT: failed to read font at %s", path) } return AddFontMem(ctx, name, data, true, fontIndex) -} - +} \ No newline at end of file diff --git a/vendor/libc-shim/stdlib.odin b/vendor/libc-shim/stdlib.odin index cffc66ed2..5dd4c53c1 100644 --- a/vendor/libc-shim/stdlib.odin +++ b/vendor/libc-shim/stdlib.odin @@ -5,7 +5,6 @@ import "base:intrinsics" import "base:runtime" import "core:c" -import "core:os" import "core:slice" import "core:sort" import "core:strconv" @@ -166,7 +165,7 @@ atexit :: proc "c" (function: proc "c" ()) -> i32 { @(require, linkage="strong", link_name="exit") exit :: proc "c" (exit_code: c.int) -> ! { finish_atexit() - os.exit(int(exit_code)) + runtime.exit(int(exit_code)) } @(private, fini) From 2efefaac1add693fb49c11513ab963d5c30e2c30 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 1 Nov 2025 18:21:34 +0100 Subject: [PATCH 381/766] Update example --- core/text/table/doc.odin | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/core/text/table/doc.odin b/core/text/table/doc.odin index 4b8d76893..29b60dbe2 100644 --- a/core/text/table/doc.odin +++ b/core/text/table/doc.odin @@ -189,12 +189,13 @@ Example: import "core:fmt" import "core:io" - import "core:os" + import os "core:os/os2" import "core:text/table" scripts :: proc(w: io.Writer) { t: table.Table table.init(&t) + defer table.destroy(&t) table.caption(&t, "Tést Suite") table.padding(&t, 1, 3) table.header_of_aligned_values(&t, {{.Left, "Script"}, {.Center, "Sample"}}) @@ -224,9 +225,7 @@ Example: } main :: proc() { - stdout := os.stream_from_handle(os.stdout) - - scripts(stdout) + scripts(os.to_stream(os.stdout)) } Output: @@ -266,14 +265,15 @@ corners and dividers. Example: package main - import "core:fmt" - import "core:io" - import "core:os" - import "core:text/table" + import "core:fmt" + import "core:io" + import os "core:os/os2" + import "core:text/table" box_drawing :: proc(w: io.Writer) { t: table.Table table.init(&t) + defer table.destroy(&t) table.caption(&t, "Box Drawing Example") table.padding(&t, 2, 2) table.header_of_aligned_values(&t, {{.Left, "Operating System"}, {.Center, "Year Introduced"}}) @@ -299,9 +299,7 @@ Example: } main :: proc() { - stdout := os.stream_from_handle(os.stdout) - - box_drawing(stdout) + box_drawing(os.to_stream(os.stdout)) } While the decorations support multi-codepoint Unicode graphemes, do note that From 13228c14e86d357ceac616335526d805e3965940 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 13:04:44 +0100 Subject: [PATCH 382/766] More conflicts during rebase --- core/flags/errors.odin | 6 +-- core/flags/example/example.odin | 8 +-- core/flags/internal_rtti.odin | 54 ++++++++++--------- core/flags/internal_validation.odin | 26 ++++----- core/flags/util.odin | 12 ++--- core/time/timezone/tz_unix.odin | 7 ++- tests/core/flags/test_core_flags.odin | 10 ++-- .../path/filepath/test_core_filepath.odin | 12 ++--- 8 files changed, 70 insertions(+), 65 deletions(-) diff --git a/core/flags/errors.odin b/core/flags/errors.odin index e9b2e18c8..d0caa1427 100644 --- a/core/flags/errors.odin +++ b/core/flags/errors.odin @@ -2,7 +2,7 @@ package flags import "base:runtime" import "core:net" -import "core:os" +import os "core:os/os2" Parse_Error_Reason :: enum { None, @@ -37,8 +37,8 @@ Unified_Parse_Error_Reason :: union #shared_nil { Open_File_Error :: struct { filename: string, errno: os.Error, - mode: int, - perms: int, + flags: os.File_Flags, + perms: os.Permissions, } // Raised during parsing. diff --git a/core/flags/example/example.odin b/core/flags/example/example.odin index a3af44790..6e74c7dcc 100644 --- a/core/flags/example/example.odin +++ b/core/flags/example/example.odin @@ -4,7 +4,7 @@ import "base:runtime" import "core:flags" import "core:fmt" import "core:net" -import "core:os" +import os "core:os/os2" import "core:time/datetime" @@ -76,8 +76,8 @@ Distinct_Int :: distinct int main :: proc() { Options :: struct { - file: os.Handle `args:"pos=0,required,file=r" usage:"Input file."`, - output: os.Handle `args:"pos=1,file=cw" usage:"Output file."`, + file: ^os.File `args:"pos=0,required,file=r" usage:"Input file."`, + output: ^os.File `args:"pos=1,file=cw" usage:"Output file."`, hub: net.Host_Or_Endpoint `usage:"Internet address to contact for updates."`, schedule: datetime.DateTime `usage:"Launch tasks at this time."`, @@ -126,7 +126,7 @@ main :: proc() { fmt.printfln("%#v", opt) - if opt.output != 0 { + if opt.output != nil { os.write_string(opt.output, "Hellope!\n") } } diff --git a/core/flags/internal_rtti.odin b/core/flags/internal_rtti.odin index b3880afa0..07481a89b 100644 --- a/core/flags/internal_rtti.odin +++ b/core/flags/internal_rtti.odin @@ -6,7 +6,7 @@ import "base:runtime" import "core:fmt" import "core:mem" import "core:net" -import "core:os" +@(require) import os "core:os/os2" import "core:reflect" import "core:strconv" import "core:strings" @@ -209,7 +209,7 @@ parse_and_set_pointer_by_base_type :: proc(ptr: rawptr, str: string, type_info: parse_and_set_pointer_by_named_type :: proc(ptr: rawptr, str: string, data_type: typeid, arg_tag: string, out_error: ^Error) { // Core types currently supported: // - // - os.Handle + // - ^os.File // - time.Time // - datetime.DateTime // - net.Host_Or_Endpoint @@ -217,47 +217,44 @@ parse_and_set_pointer_by_named_type :: proc(ptr: rawptr, str: string, data_type: GENERIC_RFC_3339_ERROR :: "Invalid RFC 3339 string. Try this format: `yyyy-mm-ddThh:mm:ssZ`, for example `2024-02-29T16:30:00Z`." out_error^ = nil - - if data_type == os.Handle { + if data_type == ^os.File { // NOTE: `os` is hopefully available everywhere, even if it might panic on some calls. - wants_read := false - wants_write := false - mode: int + flags: os.File_Flags if file, ok := get_struct_subtag(arg_tag, SUBTAG_FILE); ok { for i in 0..= {.Read, .Write} { + octal_perms |= 0o200 + } else if .Write in flags { + octal_perms |= 0o200 } else { - mode |= os.O_RDONLY + flags |= {.Read} } if permstr, ok := get_struct_subtag(arg_tag, SUBTAG_PERMS); ok { if value, parse_ok := strconv.parse_u64_of_base(permstr, 8); parse_ok { - perms = int(value) + octal_perms = int(value) } } - handle, errno := os.open(str, mode, perms) - if errno != nil { + perms := os.perm(octal_perms) + + f, error := os.open(str, flags, perms) + if error != nil { // NOTE(Feoramund): os.Error is system-dependent, and there's // currently no good way to translate them all into strings. // @@ -267,14 +264,14 @@ parse_and_set_pointer_by_named_type :: proc(ptr: rawptr, str: string, data_type: // it up. out_error^ = Open_File_Error { str, - errno, - mode, + error, + flags, perms, } return } - (^os.Handle)(ptr)^ = handle + (^^os.File)(ptr)^ = f return } @@ -475,6 +472,11 @@ parse_and_set_pointer_by_type :: proc(ptr: rawptr, str: string, type_info: ^runt } case: + if type_info.id == ^os.File { + parse_and_set_pointer_by_named_type(ptr, str, type_info.id, arg_tag, &error) + return + } + if !parse_and_set_pointer_by_base_type(ptr, str, type_info) { return Parse_Error { // The caller will add more details. diff --git a/core/flags/internal_validation.odin b/core/flags/internal_validation.odin index cd903c3e5..dc19f3084 100644 --- a/core/flags/internal_validation.odin +++ b/core/flags/internal_validation.odin @@ -1,14 +1,14 @@ #+private package flags -@require import "base:runtime" -@require import "core:container/bit_array" -@require import "core:fmt" -@require import "core:mem" -@require import "core:os" -@require import "core:reflect" -@require import "core:strconv" -@require import "core:strings" +@require import "base:runtime" +@require import "core:container/bit_array" +@require import "core:fmt" +@require import "core:mem" +@require import os "core:os/os2" +@require import "core:reflect" +@require import "core:strconv" +@require import "core:strings" // This proc is used to assert that `T` meets the expectations of the library. @(optimization_mode="favor_size", disabled=ODIN_DISABLE_ASSERT) @@ -138,20 +138,20 @@ validate_structure :: proc(model_type: $T, style: Parsing_Style, loc := #caller_ allowed_to_define_file_perms: bool = --- #partial switch specific_type_info in field.type.variant { case runtime.Type_Info_Map: - allowed_to_define_file_perms = specific_type_info.value.id == os.Handle + allowed_to_define_file_perms = specific_type_info.value.id == ^os.File case runtime.Type_Info_Dynamic_Array: - allowed_to_define_file_perms = specific_type_info.elem.id == os.Handle + allowed_to_define_file_perms = specific_type_info.elem.id == ^os.File case: - allowed_to_define_file_perms = field.type.id == os.Handle + allowed_to_define_file_perms = field.type.id == ^os.File } if _, has_file := get_struct_subtag(args_tag, SUBTAG_FILE); has_file { - fmt.assertf(allowed_to_define_file_perms, "%T.%s has `%s` defined, but it is not nor does it contain an `os.Handle` type.", + fmt.assertf(allowed_to_define_file_perms, "%T.%s has `%s` defined, but it is not nor does it contain an `^os.File` type.", model_type, field.name, SUBTAG_FILE, loc = loc) } if _, has_perms := get_struct_subtag(args_tag, SUBTAG_PERMS); has_perms { - fmt.assertf(allowed_to_define_file_perms, "%T.%s has `%s` defined, but it is not nor does it contain an `os.Handle` type.", + fmt.assertf(allowed_to_define_file_perms, "%T.%s has `%s` defined, but it is not nor does it contain an `^os.File` type.", model_type, field.name, SUBTAG_PERMS, loc = loc) } diff --git a/core/flags/util.odin b/core/flags/util.odin index ce7e2e36c..20e40cab5 100644 --- a/core/flags/util.odin +++ b/core/flags/util.odin @@ -1,7 +1,7 @@ package flags import "core:fmt" -@require import "core:os" +@require import os "core:os/os2" @require import "core:path/filepath" import "core:strings" @@ -38,7 +38,7 @@ parse_or_exit :: proc( error := parse(model, args, style, true, true, allocator, loc) if error != nil { - stderr := os.stream_from_handle(os.stderr) + stderr := os.to_stream(os.stderr) if len(args) == 0 { // No arguments entered, and there was an error; show the usage, @@ -65,18 +65,18 @@ Inputs: */ @(optimization_mode="favor_size") print_errors :: proc(data_type: typeid, error: Error, program: string, style: Parsing_Style = .Odin) { - stderr := os.stream_from_handle(os.stderr) - stdout := os.stream_from_handle(os.stdout) + stderr := os.to_stream(os.stderr) + stdout := os.to_stream(os.stdout) switch specific_error in error { case Parse_Error: fmt.wprintfln(stderr, "[%T.%v] %s", specific_error, specific_error.reason, specific_error.message) case Open_File_Error: - fmt.wprintfln(stderr, "[%T#%i] Unable to open file with perms 0o%o in mode 0x%x: %s", + fmt.wprintfln(stderr, "[%T#%i] Unable to open file with perms 0o%o and flags %v: %s", specific_error, specific_error.errno, specific_error.perms, - specific_error.mode, + specific_error.flags, specific_error.filename) case Validation_Error: fmt.wprintfln(stderr, "[%T] %s", specific_error, specific_error.message) diff --git a/core/time/timezone/tz_unix.odin b/core/time/timezone/tz_unix.odin index 6bab440d9..32590f177 100644 --- a/core/time/timezone/tz_unix.odin +++ b/core/time/timezone/tz_unix.odin @@ -5,6 +5,7 @@ package timezone import os "core:os/os2" import "core:strings" import "core:time/datetime" +import "core:path/filepath" local_tz_name :: proc(allocator := context.allocator) -> (name: string, success: bool) { local_str, ok := os.lookup_env("TZ", allocator) @@ -88,7 +89,8 @@ _region_load :: proc(_reg_str: string, allocator := context.allocator) -> (out_r defer if tzdir_ok { delete(tzdir_str, allocator) } if tzdir_ok { - region_path := filepath.join({tzdir_str, reg_str}, allocator) + region_path, err := filepath.join({tzdir_str, reg_str}, allocator) + if err != nil { return nil, false } defer delete(region_path, allocator) if tz_reg, ok := load_tzif_file(region_path, reg_str, allocator); ok { @@ -98,7 +100,8 @@ _region_load :: proc(_reg_str: string, allocator := context.allocator) -> (out_r db_paths := []string{"/usr/share/zoneinfo", "/share/zoneinfo", "/etc/zoneinfo"} for db_path in db_paths { - region_path := filepath.join({db_path, reg_str}, allocator) + region_path, err := filepath.join({db_path, reg_str}, allocator) + if err != nil { return nil, false} defer delete(region_path, allocator) if tz_reg, ok := load_tzif_file(region_path, reg_str, allocator); ok { diff --git a/tests/core/flags/test_core_flags.odin b/tests/core/flags/test_core_flags.odin index 0cfcf8e75..1aee7f69c 100644 --- a/tests/core/flags/test_core_flags.odin +++ b/tests/core/flags/test_core_flags.odin @@ -7,7 +7,7 @@ import "core:fmt" @require import "core:log" import "core:math" @require import "core:net" -import "core:os" +import os "core:os/os2" import "core:strings" import "core:testing" import "core:time/datetime" @@ -1249,7 +1249,7 @@ test_os_handle :: proc(t: ^testing.T) { test_data := "Hellope!" W :: struct { - outf: os.Handle `args:"file=cw"`, + outf: ^os.File `args:"file=cw"`, } w: W @@ -1263,7 +1263,7 @@ test_os_handle :: proc(t: ^testing.T) { os.write_string(w.outf, test_data) R :: struct { - inf: os.Handle `args:"file=r"`, + inf: ^os.File `args:"file=r"`, } r: R @@ -1274,8 +1274,8 @@ test_os_handle :: proc(t: ^testing.T) { return } defer os.close(r.inf) - data, read_ok := os.read_entire_file_from_handle(r.inf, context.temp_allocator) - testing.expect_value(t, read_ok, true) + data, read_err := os.read_entire_file(r.inf, context.temp_allocator) + testing.expect_value(t, read_err, nil) file_contents_equal := 0 == bytes.compare(transmute([]u8)test_data, data) testing.expectf(t, file_contents_equal, "expected file contents to be the same, got %v", data) } diff --git a/tests/core/path/filepath/test_core_filepath.odin b/tests/core/path/filepath/test_core_filepath.odin index f0137f69b..a0de7e831 100644 --- a/tests/core/path/filepath/test_core_filepath.odin +++ b/tests/core/path/filepath/test_core_filepath.odin @@ -33,7 +33,7 @@ test_split_list_windows :: proc(t: ^testing.T) { for d, i in data { assert(i == d.i, fmt.tprintf("wrong data index: i %d != d.i %d\n", i, d.i)) - r := filepath.split_list(d.v) + r, _ := filepath.split_list(d.v, context.allocator) defer delete_split(r) testing.expect(t, len(r) == len(d.e), fmt.tprintf("i:%d %s(%s) len(r) %d != len(d.e) %d", i, #procedure, d.v, len(r), len(d.e))) if len(r) == len(d.e) { @@ -45,13 +45,13 @@ test_split_list_windows :: proc(t: ^testing.T) { { v := "" - r := filepath.split_list(v) + r, _ := filepath.split_list(v, context.allocator) defer delete_split(r) testing.expect(t, r == nil, fmt.tprintf("%s(%s) -> %v != nil", #procedure, v, r)) } { v := "a" - r := filepath.split_list(v) + r, _ := filepath.split_list(v, context.allocator) defer delete_split(r) testing.expect(t, len(r) == 1, fmt.tprintf("%s(%s) len(r) %d != 1", #procedure, v, len(r))) if len(r) == 1 { @@ -77,7 +77,7 @@ test_split_list_unix :: proc(t: ^testing.T) { } for d in data { - r := filepath.split_list(d.v) + r, _ := filepath.split_list(d.v, context.allocator) defer delete_split(r) testing.expectf(t, len(r) == len(d.e), "%s len(r) %d != len(d.e) %d", d.v, len(r), len(d.e)) if len(r) == len(d.e) { @@ -89,12 +89,12 @@ test_split_list_unix :: proc(t: ^testing.T) { { v := "" - r := filepath.split_list(v) + r, _ := filepath.split_list(v, context.allocator) testing.expectf(t, r == nil, "'%s' -> '%v' != nil", v, r) } { v := "a" - r := filepath.split_list(v) + r, _ := filepath.split_list(v, context.allocator) defer delete_split(r) testing.expectf(t, len(r) == 1, "'%s' len(r) %d != 1", v, len(r)) if len(r) == 1 { From 5644db99f08ea9a4b59be64b7cc6c96cda870ebc Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 2 Nov 2025 11:30:57 +0100 Subject: [PATCH 383/766] require --- vendor/OpenGL/helpers.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/OpenGL/helpers.odin b/vendor/OpenGL/helpers.odin index 0610eb3ac..bce60ee80 100644 --- a/vendor/OpenGL/helpers.odin +++ b/vendor/OpenGL/helpers.odin @@ -6,7 +6,7 @@ package vendor_gl import os "core:os/os2" import "core:fmt" import "core:strings" -import "core:time" +@(require) import "core:time" import "base:runtime" _ :: fmt _ :: runtime From 2c39af1581241e3e7c61d4d1f84aaecaceb712b8 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 2 Nov 2025 11:47:27 +0100 Subject: [PATCH 384/766] Fix --- tests/core/normal.odin | 1 - tests/core/os/os2/path.odin | 198 ++++++++++++++++++++++++++++-------- 2 files changed, 156 insertions(+), 43 deletions(-) diff --git a/tests/core/normal.odin b/tests/core/normal.odin index 696510ac1..6b31b9d56 100644 --- a/tests/core/normal.odin +++ b/tests/core/normal.odin @@ -38,7 +38,6 @@ download_assets :: proc "contextless" () { @(require) import "odin" @(require) import "os" @(require) import "os/os2" -@(require) import "path/filepath" @(require) import "reflect" @(require) import "runtime" @(require) import "slice" diff --git a/tests/core/os/os2/path.odin b/tests/core/os/os2/path.odin index a256b3e22..868023c86 100644 --- a/tests/core/os/os2/path.odin +++ b/tests/core/os/os2/path.odin @@ -336,48 +336,6 @@ test_join_filename :: proc(t: ^testing.T) { } } -@(test) -test_split_path_list :: proc(t: ^testing.T) { - Test_Case :: struct { - path_list: string, - expected: []string, - } - - when ODIN_OS != .Windows { - test_cases := [?]Test_Case { - {``, {}}, - {`/bin:`, {`/bin`, ``}}, - {`/usr/local/bin`, {`/usr/local/bin`}}, - {`/usr/local/bin:/usr/bin`, {`/usr/local/bin`, `/usr/bin`}}, - {`"/extra bin":/bin`, {`/extra bin`, `/bin`}}, - {`"/extra:bin":/bin`, {`/extra:bin`, `/bin`}}, - } - } else { - test_cases := [?]Test_Case { - {``, {}}, - {`C:\bin;`, {`C:\bin`, ``}}, - {`C:\usr\local\bin`, {`C:\usr\local\bin`}}, - {`C:\usr\local\bin;C:\usr\bin`, {`C:\usr\local\bin`, `C:\usr\bin`}}, - {`"C:\extra bin";C:\bin`, {`C:\extra bin`, `C:\bin`}}, - {`"C:\extra;bin";C:\bin`, {`C:\extra;bin`, `C:\bin`}}, - } - } - - for tc in test_cases { - result, err := os.split_path_list(tc.path_list, context.temp_allocator) - if testing.expectf(t, len(result) == len(tc.expected), "expected split_path_list(%q) -> %v; got %v, %v", tc.path_list, tc.expected, result, err) { - ok := true - for entry, i in result { - if entry != tc.expected[i] { - ok = false - break - } - } - testing.expectf(t, ok, "expected split_path_list(%q) -> %v; got %v, %v", tc.path_list, tc.expected, result, err) - } - } -} - Glob_Test :: struct { pattern: string, matches: []string, @@ -445,4 +403,160 @@ test_glob :: proc(t: ^testing.T) { testing.expect_value(t, err, glob.err) compare_matches(t, glob.pattern, globbed, glob.matches) } +} + + +// TODO: merge this and `test_split_list` +@(test) +test_split_path_list :: proc(t: ^testing.T) { + Test_Case :: struct { + path_list: string, + expected: []string, + } + + when ODIN_OS != .Windows { + test_cases := [?]Test_Case { + {``, {}}, + {`/bin:`, {`/bin`, ``}}, + {`/usr/local/bin`, {`/usr/local/bin`}}, + {`/usr/local/bin:/usr/bin`, {`/usr/local/bin`, `/usr/bin`}}, + {`"/extra bin":/bin`, {`/extra bin`, `/bin`}}, + {`"/extra:bin":/bin`, {`/extra:bin`, `/bin`}}, + } + } else { + test_cases := [?]Test_Case { + {``, {}}, + {`C:\bin;`, {`C:\bin`, ``}}, + {`C:\usr\local\bin`, {`C:\usr\local\bin`}}, + {`C:\usr\local\bin;C:\usr\bin`, {`C:\usr\local\bin`, `C:\usr\bin`}}, + {`"C:\extra bin";C:\bin`, {`C:\extra bin`, `C:\bin`}}, + {`"C:\extra;bin";C:\bin`, {`C:\extra;bin`, `C:\bin`}}, + } + } + + for tc in test_cases { + result, err := os.split_path_list(tc.path_list, context.temp_allocator) + if testing.expectf(t, len(result) == len(tc.expected), "expected split_path_list(%q) -> %v; got %v, %v", tc.path_list, tc.expected, result, err) { + ok := true + for entry, i in result { + if entry != tc.expected[i] { + ok = false + break + } + } + testing.expectf(t, ok, "expected split_path_list(%q) -> %v; got %v, %v", tc.path_list, tc.expected, result, err) + } + } +} + +@(test) +test_split_list :: proc(t: ^testing.T) { + when ODIN_OS == .Windows { + test_split_list_windows(t) + } else { + test_split_list_unix(t) + } +} + +test_split_list_windows :: proc(t: ^testing.T) { + Datum :: struct { + i: int, + v: string, + e: [3]string, + } + @static data := []Datum{ + { 0, "C:\\Odin;C:\\Visual Studio;\"C:\\Some Other\"", + [3]string{"C:\\Odin", "C:\\Visual Studio", "C:\\Some Other"} }, // Issue #1537 + { 1, "a;;b", [3]string{"a", "", "b"} }, + { 2, "a;b;", [3]string{"a", "b", ""} }, + { 3, ";a;b", [3]string{"", "a", "b"} }, + { 4, ";;", [3]string{"", "", ""} }, + { 5, "\"a;b\"c;d;\"f\"", [3]string{"a;bc", "d", "f"} }, + { 6, "\"a;b;c\";d\";e\";f", [3]string{"a;b;c", "d;e", "f"} }, + } + + for d, i in data { + assert(i == d.i, fmt.tprintf("wrong data index: i %d != d.i %d\n", i, d.i)) + r, err := os.split_path_list(d.v, context.allocator) + testing.expectf(t, err == nil, "Expected err to be nil, got %v", err) + defer delete_split(r) + testing.expect(t, len(r) == len(d.e), fmt.tprintf("i:%d %s(%s) len(r) %d != len(d.e) %d", i, #procedure, d.v, len(r), len(d.e))) + if len(r) == len(d.e) { + for _, j in r { + testing.expect(t, r[j] == d.e[j], fmt.tprintf("i:%d %s(%v) -> %v[%d] != %v", i, #procedure, d.v, r[j], j, d.e[j])) + } + } + } + + { + v := "" + r, err := os.split_path_list(v, context.allocator) + testing.expectf(t, err == nil, "Expected err to be nil, got %v", err) + defer delete_split(r) + testing.expect(t, r == nil, fmt.tprintf("%s(%s) -> %v != nil", #procedure, v, r)) + } + { + v := "a" + r, err := os.split_path_list(v, context.allocator) + testing.expectf(t, err == nil, "Expected err to be nil, got %v", err) + defer delete_split(r) + testing.expect(t, len(r) == 1, fmt.tprintf("%s(%s) len(r) %d != 1", #procedure, v, len(r))) + if len(r) == 1 { + testing.expect(t, r[0] == "a", fmt.tprintf("%s(%v) -> %v[0] != a", #procedure, v, r[0])) + } + } +} + +test_split_list_unix :: proc(t: ^testing.T) { + Datum :: struct { + v: string, + e: [3]string, + } + @static data := []Datum{ + { "/opt/butler:/home/fancykillerpanda/Projects/Odin/Odin:/usr/local/sbin", + [3]string{"/opt/butler", "/home/fancykillerpanda/Projects/Odin/Odin", "/usr/local/sbin"} }, // Issue #1537 + { "a::b", [3]string{"a", "", "b"} }, + { "a:b:", [3]string{"a", "b", ""} }, + { ":a:b", [3]string{"", "a", "b"} }, + { "::", [3]string{"", "", ""} }, + { "\"a:b\"c:d:\"f\"", [3]string{"a:bc", "d", "f"} }, + { "\"a:b:c\":d\":e\":f", [3]string{"a:b:c", "d:e", "f"} }, + } + + for d in data { + r, err := os.split_path_list(d.v, context.allocator) + testing.expectf(t, err == nil, "Expected err to be nil, got %v", err) + defer delete_split(r) + testing.expectf(t, len(r) == len(d.e), "%s len(r) %d != len(d.e) %d", d.v, len(r), len(d.e)) + if len(r) == len(d.e) { + for _, j in r { + testing.expectf(t, r[j] == d.e[j], "%v -> %v[%d] != %v", d.v, r[j], j, d.e[j]) + } + } + } + + { + v := "" + r, err := os.split_path_list(v, context.allocator) + testing.expectf(t, err == nil, "Expected err to be nil, got %v", err) + testing.expectf(t, r == nil, "'%s' -> '%v' != nil", v, r) + } + { + v := "a" + r, err := os.split_path_list(v, context.allocator) + testing.expectf(t, err == nil, "Expected err to be nil, got %v", err) + defer delete_split(r) + testing.expectf(t, len(r) == 1, "'%s' len(r) %d != 1", v, len(r)) + if len(r) == 1 { + testing.expectf(t, r[0] == "a", "'%v' -> %v[0] != a", v, r[0]) + } + } +} + +@(private) +delete_split :: proc(s: []string) { + for part in s { + delete(part) + } + delete(s) } \ No newline at end of file From 940105dc19f70c5ed7efc0d8957b76461616b7fa Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 2 Nov 2025 14:40:17 +0100 Subject: [PATCH 385/766] Convert fmt_js.odin to not use `core:os*` --- core/fmt/fmt_js.odin | 109 +++++++++++++++++++------------------------ 1 file changed, 47 insertions(+), 62 deletions(-) diff --git a/core/fmt/fmt_js.odin b/core/fmt/fmt_js.odin index de9e12cdc..458a6303c 100644 --- a/core/fmt/fmt_js.odin +++ b/core/fmt/fmt_js.odin @@ -1,9 +1,7 @@ #+build js package fmt -import "core:bufio" -import "core:io" -import os "core:os/os2" +import "core:strings" foreign import "odin_env" @@ -12,90 +10,77 @@ foreign odin_env { write :: proc "contextless" (fd: u32, p: []byte) --- } -@(private="file") -write_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) { - if mode == .Write { - fd := u32(uintptr(stream_data)) - write(fd, p) - return i64(len(p)), nil - } - return 0, .Unsupported -} +stdout :: u32(1) +stderr :: u32(2) @(private="file") -stdout := io.Writer{ - procedure = write_stream_proc, - data = rawptr(uintptr(1)), -} -@(private="file") -stderr := io.Writer{ - procedure = write_stream_proc, - data = rawptr(uintptr(2)), -} +BUF_SIZE :: 1024 @(private="file") -fd_to_writer :: proc(f: ^os.File, loc := #caller_location) -> io.Writer { - switch { - case f == os.stdout: return stdout - case f == os.stderr: return stderr - case: panic("`fmt.fprint` variant called with invalid file descriptor for JS, only 1 (stdout) and 2 (stderr) are supported", loc) +// TODO: Find a way to grow this if necessary +buf: [BUF_SIZE]byte + +@(private="file") +get_fd :: proc(f: any, loc := #caller_location) -> (fd: u32) { + if _fd, _ok := f.(u32); _ok { + fd = _fd } + if fd != 1 && fd != 2 { + panic("`fmt.fprint` variant called with invalid file descriptor for JS, only 1 (stdout) and 2 (stderr) are supported", loc) + } + return fd } // fprint formats using the default print settings and writes to fd -fprint :: proc(f: ^os.File, args: ..any, sep := " ", flush := true, loc := #caller_location) -> int { - buf: [1024]byte - b: bufio.Writer - defer bufio.writer_flush(&b) - - bufio.writer_init_with_buf(&b, fd_to_writer(f, loc), buf[:]) - w := bufio.writer_to_writer(&b) - return wprint(w, ..args, sep=sep, flush=flush) +// flush is ignored +fprint :: proc(f: any, args: ..any, sep := " ", flush := true, loc := #caller_location) -> (n: int) { + fd := get_fd(f) + s := bprint(buf[:], ..args, sep=sep) + n = len(s) + write(fd, transmute([]byte)s) + return n } -// fprintln formats using the default print settings and writes to fd -fprintln :: proc(f: ^os.File, args: ..any, sep := " ", flush := true, loc := #caller_location) -> int { - buf: [1024]byte - b: bufio.Writer - defer bufio.writer_flush(&b) - - bufio.writer_init_with_buf(&b, fd_to_writer(f, loc), buf[:]) - - w := bufio.writer_to_writer(&b) - return wprintln(w, ..args, sep=sep, flush=flush) +// fprintln formats using the default print settings and writes to fd, followed by a newline +// flush is ignored +fprintln :: proc(f: any, args: ..any, sep := " ", flush := true, loc := #caller_location) -> (n: int) { + fd := get_fd(f) + s := bprintln(buf[:], ..args, sep=sep) + n = len(s) + write(fd, transmute([]byte)s) + return n } // fprintf formats according to the specified format string and writes to fd -fprintf :: proc(f: ^os.File, fmt: string, args: ..any, flush := true, newline := false, loc := #caller_location) -> int { - buf: [1024]byte - b: bufio.Writer - defer bufio.writer_flush(&b) - - bufio.writer_init_with_buf(&b, fd_to_writer(f, loc), buf[:]) - - w := bufio.writer_to_writer(&b) - return wprintf(w, fmt, ..args, flush=flush, newline=newline) +// flush is ignored +fprintf :: proc(f: any, fmt: string, args: ..any, flush := true, newline := false, loc := #caller_location) -> (n: int) { + fd := get_fd(f) + s := bprintf(buf[:], fmt, ..args, newline=newline) + n = len(s) + write(fd, transmute([]byte)s) + return n } // fprintfln formats according to the specified format string and writes to fd, followed by a newline. -fprintfln :: proc(f: ^os.File, fmt: string, args: ..any, flush := true, loc := #caller_location) -> int { +// flush is ignored +fprintfln :: proc(f: any, fmt: string, args: ..any, flush := true, loc := #caller_location) -> int { return fprintf(f, fmt, ..args, flush=flush, newline=true, loc=loc) } // print formats using the default print settings and writes to stdout -print :: proc(args: ..any, sep := " ", flush := true) -> int { return wprint(w=stdout, args=args, sep=sep, flush=flush) } +print :: proc(args: ..any, sep := " ", flush := true) -> int { return fprint(stdout, ..args, sep=sep, flush=flush) } // println formats using the default print settings and writes to stdout -println :: proc(args: ..any, sep := " ", flush := true) -> int { return wprintln(w=stdout, args=args, sep=sep, flush=flush) } +println :: proc(args: ..any, sep := " ", flush := true) -> int { return fprintln(stdout, ..args, sep=sep, flush=flush) } // printf formats according to the specififed format string and writes to stdout -printf :: proc(fmt: string, args: ..any, flush := true) -> int { return wprintf(stdout, fmt, ..args, flush=flush) } +printf :: proc(fmt: string, args: ..any, flush := true) -> int { return fprintf(stdout, fmt, ..args, flush=flush) } // printfln formats according to the specified format string and writes to stdout, followed by a newline. -printfln :: proc(fmt: string, args: ..any, flush := true) -> int { return wprintf(stdout, fmt, ..args, flush=flush, newline=true) } +printfln :: proc(fmt: string, args: ..any, flush := true) -> int { return fprintf(stdout, fmt, ..args, flush=flush, newline=true) } // eprint formats using the default print settings and writes to stderr -eprint :: proc(args: ..any, sep := " ", flush := true) -> int { return wprint(w=stderr, args=args, sep=sep, flush=flush) } +eprint :: proc(args: ..any, sep := " ", flush := true) -> int { return fprint(stderr, ..args, sep=sep, flush=flush) } // eprintln formats using the default print settings and writes to stderr -eprintln :: proc(args: ..any, sep := " ", flush := true) -> int { return wprintln(w=stderr, args=args, sep=sep, flush=flush) } +eprintln :: proc(args: ..any, sep := " ", flush := true) -> int { return fprintln(stderr, ..args, sep=sep, flush=flush) } // eprintf formats according to the specififed format string and writes to stderr -eprintf :: proc(fmt: string, args: ..any, flush := true) -> int { return wprintf(stderr, fmt, ..args, flush=flush) } +eprintf :: proc(fmt: string, args: ..any, flush := true) -> int { return fprintf(stderr, fmt, ..args, flush=flush) } // eprintfln formats according to the specified format string and writes to stderr, followed by a newline. -eprintfln :: proc(fmt: string, args: ..any, flush := true) -> int { return wprintf(stdout, fmt, ..args, flush=flush, newline=true) } +eprintfln :: proc(fmt: string, args: ..any, flush := true) -> int { return fprintf(stderr, fmt, ..args, flush=flush, newline=true) } \ No newline at end of file From 876935065f51b1bb5557cd0e7604d41b0fb9e42f Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 2 Nov 2025 14:50:33 +0100 Subject: [PATCH 386/766] remove import --- core/fmt/fmt_js.odin | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/fmt/fmt_js.odin b/core/fmt/fmt_js.odin index 458a6303c..ccab15220 100644 --- a/core/fmt/fmt_js.odin +++ b/core/fmt/fmt_js.odin @@ -1,8 +1,6 @@ #+build js package fmt -import "core:strings" - foreign import "odin_env" @(private="file") From 6270b02b2c40e5f7469573ff4fecc1b092106e97 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 3 Nov 2025 10:58:09 +0100 Subject: [PATCH 387/766] Remove os2 mockup warning --- core/os/os2/doc.odin | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/os/os2/doc.odin b/core/os/os2/doc.odin index 86dcbc452..2ebdd0912 100644 --- a/core/os/os2/doc.odin +++ b/core/os/os2/doc.odin @@ -3,9 +3,4 @@ // // The package os interface is intended to be uniform across all operating systems. // Features not generally available appear in the system-specific packages under core:sys/*. -// -// -// IMPORTANT NOTE from Bill: This package is not fully complete yet but should give designers a better idea of the general -// interface and how to write things. This entire interface is subject to change, but mostly working still. -// When things are finalized, this message will be removed. package os2 From fb7ac1fb648e567d04626389b8113997fec4cae2 Mon Sep 17 00:00:00 2001 From: Laytan Date: Mon, 3 Nov 2025 19:27:02 +0100 Subject: [PATCH 388/766] new_os: vendor/libc --- vendor/libc-shim/stdio.odin | 66 ++++++----------------- vendor/libc/stdio_js.odin | 60 +++++++++++++++++++++ vendor/libc/stdio_os.odin | 104 ++++++++++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+), 49 deletions(-) create mode 100644 vendor/libc/stdio_js.odin create mode 100644 vendor/libc/stdio_os.odin diff --git a/vendor/libc-shim/stdio.odin b/vendor/libc-shim/stdio.odin index e269b8986..b47b3f166 100644 --- a/vendor/libc-shim/stdio.odin +++ b/vendor/libc-shim/stdio.odin @@ -4,93 +4,60 @@ package odin_libc import "base:runtime" import "core:c" -import "core:io" -import "core:os" import "core:strconv" import stb "vendor:stb/sprintf" -FILE :: uintptr +FILE :: rawptr EOF :: -1 @(require, linkage="strong", link_name="fopen") fopen :: proc "c" (path: cstring, mode: cstring) -> FILE { context = g_ctx - unimplemented("vendor/libc-shim: fopen") + return _fopen(path, mode) } @(require, linkage="strong", link_name="fseek") fseek :: proc "c" (file: FILE, offset: c.long, whence: i32) -> i32 { context = g_ctx - handle := os.Handle(file-1) - _, err := os.seek(handle, i64(offset), int(whence)) - if err != nil { - return -1 - } - return 0 + return _fseek(file, offset, whence) } @(require, linkage="strong", link_name="ftell") ftell :: proc "c" (file: FILE) -> c.long { context = g_ctx - handle := os.Handle(file-1) - off, err := os.seek(handle, 0, os.SEEK_CUR) - if err != nil { - return -1 - } - return c.long(off) + return _ftell(file) } @(require, linkage="strong", link_name="fclose") fclose :: proc "c" (file: FILE) -> i32 { context = g_ctx - handle := os.Handle(file-1) - if os.close(handle) != nil { - return -1 - } - return 0 + return _fclose(file) } @(require, linkage="strong", link_name="fread") fread :: proc "c" (buffer: [^]byte, size: uint, count: uint, file: FILE) -> uint { context = g_ctx - handle := os.Handle(file-1) - n, _ := os.read(handle, buffer[:min(size, count)]) - return uint(max(0, n)) + return _fread(buffer, size, count, file) } @(require, linkage="strong", link_name="fwrite") fwrite :: proc "c" (buffer: [^]byte, size: uint, count: uint, file: FILE) -> uint { context = g_ctx - handle := os.Handle(file-1) - n, _ := os.write(handle, buffer[:min(size, count)]) - return uint(max(0, n)) + return _fwrite(buffer, size, count, file) } @(require, linkage="strong", link_name="putchar") putchar :: proc "c" (char: c.int) -> c.int { context = g_ctx - - n, err := os.write_byte(os.stdout, byte(char)) - if n == 0 || err != nil { - return EOF - } - return char + return _putchar(char) } @(require, linkage="strong", link_name="getchar") getchar :: proc "c" () -> c.int { - when #defined(os.stdin) { - ret: [1]byte - n, err := os.read(os.stdin, ret[:]) - if n == 0 || err != nil { - return EOF - } - return c.int(ret[0]) - } else { - return EOF - } + context = g_ctx + return _getchar() } @(require, linkage="strong", link_name="vsnprintf") @@ -109,8 +76,6 @@ vsprintf :: proc "c" (buf: [^]byte, fmt: cstring, args: ^c.va_list) -> i32 { vfprintf :: proc "c" (file: FILE, fmt: cstring, args: ^c.va_list) -> i32 { context = g_ctx - handle := os.Handle(file-1) - MAX_STACK :: 4096 buf: []byte @@ -133,12 +98,15 @@ vfprintf :: proc "c" (file: FILE, fmt: cstring, args: ^c.va_list) -> i32 { delete(buf) } - _, err := io.write_full(os.stream_from_handle(handle), buf) - if err != nil { - return -1 + written: i32 + for len(buf) > 0 { + n := _fwrite(raw_data(buf), size_of(byte), len(buf), file) + if n == 0 { break } + buf = buf[n:] + written += i32(n) } - return i32(len(buf)) + return written } /* diff --git a/vendor/libc/stdio_js.odin b/vendor/libc/stdio_js.odin new file mode 100644 index 000000000..2382ed449 --- /dev/null +++ b/vendor/libc/stdio_js.odin @@ -0,0 +1,60 @@ +#+private +package odin_libc + +import "core:c" + +foreign import "odin_env" + +_fopen :: proc(path, mode: cstring) -> FILE { + unimplemented("vendor/libc: fopen in JS") +} + +_fseek :: proc(file: FILE, offset: c.long, whence: i32) -> i32 { + unimplemented("vendor/libc: fseek in JS") +} + +_ftell :: proc(file: FILE) -> c.long { + unimplemented("vendor/libc: ftell in JS") +} + +_fclose :: proc(file: FILE) -> i32 { + unimplemented("vendor/libc: fclose in JS") +} + +_fread :: proc(buffer: [^]byte, size: uint, count: uint, file: FILE) -> uint { + unimplemented("vendor/libc: fread in JS") +} + +_fwrite :: proc(buffer: [^]byte, size: uint, count: uint, file: FILE) -> uint { + fd, ok := __fd(file) + if !ok { + return 0 + } + + __write(fd, buffer[:size*count]) + return count +} + +_putchar :: proc(char: c.int) -> c.int { + __write(1, {byte(char)}) + return char +} + +_getchar :: proc() -> c.int { + return EOF +} + +@(private="file") +foreign odin_env { + @(link_name="write") + __write :: proc "contextless" (fd: u32, p: []byte) --- +} + +@(private="file") +__fd :: proc(file: FILE) -> (u32, bool) { + switch (uint(uintptr(file))) { + case 2: return 1, true // stdout + case 3: return 2, true // stderr + case: return 0, false + } +} diff --git a/vendor/libc/stdio_os.odin b/vendor/libc/stdio_os.odin new file mode 100644 index 000000000..db40fb250 --- /dev/null +++ b/vendor/libc/stdio_os.odin @@ -0,0 +1,104 @@ +#+build !freestanding +#+build !js +package odin_libc + +import "core:io" +import "core:c" +import os "core:os/os2" + +_fopen :: proc(path, _mode: cstring) -> FILE { + flags: os.File_Flags + + mode := string(_mode) + if len(mode) > 1 { + switch mode[0] { + case 'r': + flags += {.Read} + case 'w': + flags += {.Write, .Create, .Trunc} + case 'a': + flags += {.Write, .Create, .Append} + case: + return nil + } + + if len(mode) > 1 && mode[1] == '+' { + flags += {.Write, .Read} + } else if len(mode) > 2 && mode[1] == 'b' && mode[2] == '+' { + flags += {.Write, .Read} + } + } + + file, err := os.open(string(path), flags, os.Permissions_Read_Write_All) + if err != nil { + return nil + } + + return FILE(file) +} + +_fseek :: proc(_file: FILE, offset: c.long, whence: i32) -> i32 { + file := __file(_file) + if _, err := os.seek(file, i64(offset), io.Seek_From(whence)); err != nil { + return -1 + } + + return 0 +} + +_ftell :: proc(_file: FILE) -> c.long { + file := __file(_file) + pos, err := os.seek(file, 0, .Current) + if err != nil { + return -1 + } + + return c.long(pos) +} + +_fclose :: proc(_file: FILE) -> i32 { + file := __file(_file) + if err := os.close(file); err != nil { + return EOF + } + + return 0 +} + +_fread :: proc(buffer: [^]byte, size: uint, count: uint, _file: FILE) -> uint { + file := __file(_file) + n, _ := os.read(file, buffer[:size*count]) + return uint(max(0, n)) / size +} + +_fwrite :: proc(buffer: [^]byte, size: uint, count: uint, _file: FILE) -> uint { + file := __file(_file) + n, _ := os.write(file, buffer[:size*count]) + return uint(max(0, n)) / size +} + +_putchar :: proc(char: c.int) -> c.int { + n, err := os.write_byte(os.stdout, byte(char)) + if n == 0 || err != nil { + return EOF + } + return char +} + +_getchar :: proc() -> c.int { + ret: [1]byte + n, err := os.read(os.stdin, ret[:]) + if n == 0 || err != nil { + return EOF + } + return c.int(ret[0]) +} + +@(private="file") +__file :: proc(file: FILE) -> ^os.File { + switch (uint(uintptr(file))) { + case 2: return os.stdout + case 3: return os.stderr + case: return (^os.File)(file) + } +} From 470a245f5fc927fa9d04da0adcbcd57574d4067f Mon Sep 17 00:00:00 2001 From: Laytan Date: Mon, 3 Nov 2025 19:51:42 +0100 Subject: [PATCH 389/766] new_os: core/prof/spall --- core/prof/spall/spall.odin | 29 +++++++++++++++++------------ core/prof/spall/spall_linux.odin | 8 +++----- core/prof/spall/spall_unix.odin | 14 ++++---------- core/prof/spall/spall_windows.odin | 14 ++++---------- 4 files changed, 28 insertions(+), 37 deletions(-) diff --git a/core/prof/spall/spall.odin b/core/prof/spall/spall.odin index dc53dc3dc..b079c2eb2 100644 --- a/core/prof/spall/spall.odin +++ b/core/prof/spall/spall.odin @@ -1,8 +1,9 @@ package spall -import "core:os" -import "core:time" -import "base:intrinsics" +import "base:intrinsics" + +import os "core:os/os2" +import "core:time" // File Format @@ -64,7 +65,9 @@ NAME_EVENT_MAX :: size_of(Name_Event) + 255 Context :: struct { precise_time: bool, timestamp_scale: f64, - fd: os.Handle, + + file: ^os.File, + fd: uintptr, } Buffer :: struct { @@ -79,18 +82,20 @@ BUFFER_DEFAULT_SIZE :: 0x10_0000 context_create_with_scale :: proc(filename: string, precise_time: bool, timestamp_scale: f64) -> (ctx: Context, ok: bool) #optional_ok { - fd, err := os.open(filename, os.O_WRONLY | os.O_APPEND | os.O_CREATE | os.O_TRUNC, 0o600) + file, err := os.open(filename, {.Write, .Append, .Create, .Trunc}, {.Read_User, .Write_User}) if err != nil { return } - ctx.fd = fd + ctx.file = file + ctx.fd = os.fd(file) + ctx.precise_time = precise_time ctx.timestamp_scale = timestamp_scale temp := [size_of(Manual_Stream_Header)]u8{} _build_stream_header(temp[:], ctx.timestamp_scale) - os.write(ctx.fd, temp[:]) + write(ctx.fd, temp[:]) ok = true return } @@ -109,7 +114,7 @@ context_destroy :: proc(ctx: ^Context) { return } - os.close(ctx.fd) + os.close(ctx.file) ctx^ = Context{} } @@ -288,12 +293,12 @@ _buffer_name_process :: proc "contextless" (ctx: ^Context, buffer: ^Buffer, name buffer.head += _build_name_event(buffer.data[buffer.head:], name, .Name_Process) } -@(no_instrumentation) -write :: proc "contextless" (fd: os.Handle, buf: []byte) -> (n: int, err: os.Error) { - return _write(fd, buf) +@(no_instrumentation, private="package") +write :: proc "contextless" (fd: uintptr, buf: []byte) { + _write(fd, buf) } -@(no_instrumentation) +@(no_instrumentation, private="package") tick_now :: proc "contextless" () -> (ns: i64) { return _tick_now() } diff --git a/core/prof/spall/spall_linux.odin b/core/prof/spall/spall_linux.odin index 8060af448..207bd8471 100644 --- a/core/prof/spall/spall_linux.odin +++ b/core/prof/spall/spall_linux.odin @@ -1,19 +1,17 @@ #+private package spall -// Only for types and constants. -import "core:os" - // Package is `#+no-instrumentation`, safe to use. import "core:sys/linux" MAX_RW :: 0x7fffffff @(no_instrumentation) -_write :: proc "contextless" (fd: os.Handle, data: []byte) -> (n: int, err: os.Error) #no_bounds_check /* bounds check would segfault instrumentation */ { +_write :: proc "contextless" (fd: uintptr, data: []byte) #no_bounds_check /* bounds check would segfault instrumentation */ { + n: int for n < len(data) { chunk := data[:min(len(data), MAX_RW)] - n += linux.write(linux.Fd(fd), chunk) or_return + n += linux.write(linux.Fd(fd), chunk) or_break } return } diff --git a/core/prof/spall/spall_unix.odin b/core/prof/spall/spall_unix.odin index 455245aad..2f1e356ee 100644 --- a/core/prof/spall/spall_unix.odin +++ b/core/prof/spall/spall_unix.odin @@ -2,29 +2,23 @@ #+build darwin, freebsd, openbsd, netbsd package spall -// Only for types. -import "core:os" - import "core:sys/posix" MAX_RW :: 0x7fffffff @(no_instrumentation) -_write :: proc "contextless" (fd: os.Handle, data: []byte) -> (n: int, err: os.Error) #no_bounds_check /* bounds check would segfault instrumentation */ { - if len(data) == 0 { - return 0, nil - } - +_write :: proc "contextless" (fd: uintptr, data: []byte) #no_bounds_check /* bounds check would segfault instrumentation */ { + n: int for n < len(data) { chunk := data[:min(len(data), MAX_RW)] written := posix.write(posix.FD(fd), raw_data(chunk), len(chunk)) if written < 0 { - return n, os.get_last_error() + return } n += written } - return n, nil + return } // NOTE(tetra): "RAW" means: Not adjusted by NTP. diff --git a/core/prof/spall/spall_windows.odin b/core/prof/spall/spall_windows.odin index 11e216b63..2d059dc4d 100644 --- a/core/prof/spall/spall_windows.odin +++ b/core/prof/spall/spall_windows.odin @@ -1,20 +1,13 @@ #+private package spall -// Only for types. -import "core:os" - // Package is `#+no-instrumentation`, safe to use. import win32 "core:sys/windows" MAX_RW :: 1<<30 @(no_instrumentation) -_write :: proc "contextless" (fd: os.Handle, data: []byte) -> (int, os.Error) #no_bounds_check /* bounds check would segfault instrumentation */ { - if len(data) == 0 { - return 0, nil - } - +_write :: proc "contextless" (fd: uintptr, data: []byte) #no_bounds_check /* bounds check would segfault instrumentation */ { single_write_length: win32.DWORD total_write: i64 length := i64(len(data)) @@ -25,11 +18,12 @@ _write :: proc "contextless" (fd: os.Handle, data: []byte) -> (int, os.Error) #n e := win32.WriteFile(win32.HANDLE(fd), &data[total_write], to_write, &single_write_length, nil) if single_write_length <= 0 || !e { - return int(total_write), os.get_last_error() + return } total_write += i64(single_write_length) } - return int(total_write), nil + + return } @(no_instrumentation) From 38def33c95bec05ad5687fa074d7e26f2b1f923b Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 12:40:51 +0100 Subject: [PATCH 390/766] Fix more merge conflicts. --- core/net/dns_os.odin | 14 +++++++------- core/testing/signal_handler_libc.odin | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/net/dns_os.odin b/core/net/dns_os.odin index 19db0097a..8528dad00 100644 --- a/core/net/dns_os.odin +++ b/core/net/dns_os.odin @@ -2,12 +2,13 @@ #+private package net -import "core:os" +import os "core:os/os2" load_resolv_conf :: proc(resolv_conf_path: string, allocator := context.allocator) -> (name_servers: []Endpoint, ok: bool) { context.allocator = allocator - res := os.read_entire_file_from_filename(resolv_conf_path) or_return + res, err := os.read_entire_file(resolv_conf_path, allocator) + if err != nil { return } defer delete(res) resolv_str := string(res) @@ -15,10 +16,9 @@ load_resolv_conf :: proc(resolv_conf_path: string, allocator := context.allocato } load_hosts :: proc(hosts_file_path: string, allocator := context.allocator) -> (hosts: []DNS_Host_Entry, ok: bool) { - hosts_file, err := os.open(hosts_file_path) + handle, err := os.open(hosts_file_path) if err != nil { return } - defer os.close(hosts_file) - - return parse_hosts(os.stream_from_handle(hosts_file), allocator) -} + defer os.close(handle) + return parse_hosts(os.to_stream(handle), allocator) +} \ No newline at end of file diff --git a/core/testing/signal_handler_libc.odin b/core/testing/signal_handler_libc.odin index 593d2c285..badee802d 100644 --- a/core/testing/signal_handler_libc.odin +++ b/core/testing/signal_handler_libc.odin @@ -91,7 +91,7 @@ stop_test_callback :: proc "c" (sig: libc.int) { advisory_a := ` The test runner's main thread has caught an unrecoverable error (signal ` advisory_b := `) and will now forcibly terminate. -This is a dire bug and should be reported to the Odin developers. +Unless you terminated the tests yourself, this could be a dire bug and should be reported to the Odin developers. ` libc.fwrite(raw_data(advisory_a), size_of(byte), len(advisory_a), libc.stderr) libc.fwrite(raw_data(sigstr), size_of(byte), len(sigstr), libc.stderr) From 89fccd6056a4ff188f82ff8364aedcbf5b832bb1 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 13:17:39 +0100 Subject: [PATCH 391/766] One more fix. --- core/text/table/utility.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/text/table/utility.odin b/core/text/table/utility.odin index 99fd7d7ca..e361d0f5f 100644 --- a/core/text/table/utility.odin +++ b/core/text/table/utility.odin @@ -5,7 +5,7 @@ import os "core:os/os2" import "core:strings" stdio_writer :: proc() -> io.Writer { - return os.stdout.stream + return os.to_stream(os.stdout) } strings_builder_writer :: proc(b: ^strings.Builder) -> io.Writer { From 29b6a7ddfe39dce2b932066a12c3e69d809b7965 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 13:21:01 +0100 Subject: [PATCH 392/766] Remove unused import --- core/net/dns.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/net/dns.odin b/core/net/dns.odin index 2d7a04896..6af18798b 100644 --- a/core/net/dns.odin +++ b/core/net/dns.odin @@ -23,7 +23,6 @@ package net @(require) import "base:runtime" -import os "core:os/os2" import "core:bufio" import "core:io" import "core:math/rand" From 674f0e04745d0f679ce540ec4ae025910a612757 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 13:28:04 +0100 Subject: [PATCH 393/766] Fix doc tests --- tests/documentation/documentation_tester.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/documentation/documentation_tester.odin b/tests/documentation/documentation_tester.odin index 55e40963d..6694de709 100644 --- a/tests/documentation/documentation_tester.odin +++ b/tests/documentation/documentation_tester.odin @@ -301,7 +301,7 @@ _spawn_pipe_reader :: proc() { read_to_null_byte := 0 finished_reading := false for ! finished_reading { - just_read, err := io.read(_read_pipe.stream, _out_buffer[n_read:], &n_read); if err != .None { + just_read, err := io.read(os.to_stream(_read_pipe), _out_buffer[n_read:], &n_read); if err != .None { panic("We got an IO error!") } for b in _out_buffer[n_read - just_read: n_read] { @@ -450,13 +450,13 @@ main :: proc() { continue } defer os.close(test_file_handle) - fmt.wprintf(test_file_handle.stream, "%v%v_%v", code_string[:index_of_proc_name], test.package_name, code_string[index_of_proc_name:]) + fmt.wprintf(os.to_stream(test_file_handle), "%v%v_%v", code_string[:index_of_proc_name], test.package_name, code_string[index_of_proc_name:]) fmt.println("Done") } strings.write_string(&test_runner, ` - fmt.wprintfln(_old_stdout.stream, "Passes: %v. Fails: %v", _good_count, _bad_count) + fmt.wprintfln(os.to_stream(_old_stdout), "Passes: %v. Fails: %v", _good_count, _bad_count) if _bad_count > 0 { fmt.eprintln("One or more tests failed") os.exit(1) From b16ca5a986c129500285c238bbe1d3e0dd44e75e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 13:51:49 +0100 Subject: [PATCH 394/766] fix libc-shim --- vendor/{libc => libc-shim}/stdio_js.odin | 0 vendor/{libc => libc-shim}/stdio_os.odin | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename vendor/{libc => libc-shim}/stdio_js.odin (100%) rename vendor/{libc => libc-shim}/stdio_os.odin (100%) diff --git a/vendor/libc/stdio_js.odin b/vendor/libc-shim/stdio_js.odin similarity index 100% rename from vendor/libc/stdio_js.odin rename to vendor/libc-shim/stdio_js.odin diff --git a/vendor/libc/stdio_os.odin b/vendor/libc-shim/stdio_os.odin similarity index 100% rename from vendor/libc/stdio_os.odin rename to vendor/libc-shim/stdio_os.odin From 5bf30b2d562dd7b746a351dce333914e2ca958c8 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 14:13:20 +0100 Subject: [PATCH 395/766] Fix os2 file_wasi --- core/os/os2/file_wasi.odin | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/os/os2/file_wasi.odin b/core/os/os2/file_wasi.odin index 1333ecf20..78aa90699 100644 --- a/core/os/os2/file_wasi.odin +++ b/core/os/os2/file_wasi.odin @@ -41,7 +41,6 @@ init_std_files :: proc "contextless" () { data = impl, procedure = _file_stream_proc, } - impl.file.fstat = _fstat return &impl.file } @@ -222,7 +221,6 @@ _new_file :: proc(handle: uintptr, name: string, allocator: runtime.Allocator) - data = impl, procedure = _file_stream_proc, } - impl.file.fstat = _fstat return &impl.file, nil } @@ -434,7 +432,7 @@ _exists :: proc(path: string) -> bool { return true } -_file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) { +_file_stream_proc :: proc(stream_data: rawptr, mode: File_Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From, allocator: runtime.Allocator) -> (n: i64, err: Error) { f := (^File_Impl)(stream_data) fd := f.fd @@ -562,6 +560,10 @@ _file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, case .Query: return io.query_utility({.Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Flush, .Close, .Destroy, .Query}) + case .Fstat: + err = file_stream_fstat_utility(f, p, allocator) + return + case: return 0, .Unsupported } From 8018604f8309e6af95ffa3886f9a0768bd720834 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 8 Feb 2026 22:58:44 +0000 Subject: [PATCH 396/766] Fix handle_map index on `dynamic_add` --- core/container/handle_map/dynamic_handle_map.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/container/handle_map/dynamic_handle_map.odin b/core/container/handle_map/dynamic_handle_map.odin index 067212a54..72273873b 100644 --- a/core/container/handle_map/dynamic_handle_map.odin +++ b/core/container/handle_map/dynamic_handle_map.odin @@ -48,7 +48,8 @@ dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc := xar.append(&m.items, T{}, loc) or_return } - i := xar.append(&m.items, item, loc) or_return + _ = xar.append(&m.items, item, loc) or_return + i := len(m.items)-1 ptr := xar.get_ptr_unsafe(&m.items, i) ptr^ = item From 8ed264680b1f3f94b6aa5176824d4ccadfc30322 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Feb 2026 16:39:56 +0100 Subject: [PATCH 397/766] Remove all `core:os` imports from JS targets Fix `local_tz_name` on FreeBSD. --- core/crypto/hash/hash_js.odin | 10 +++ core/crypto/hash/hash_os.odin | 1 + core/encoding/hxa/hxa_os.odin | 34 ++++++++ core/encoding/hxa/read.odin | 15 ---- core/encoding/hxa/write.odin | 16 ---- core/encoding/ini/ini.odin | 15 ---- core/encoding/ini/ini_os.odin | 20 +++++ core/encoding/xml/xml_os.odin | 18 +++++ core/encoding/xml/xml_reader.odin | 14 ---- core/log/file_console_logger.odin | 1 + core/math/big/radix.odin | 57 ------------- core/math/big/radix_os.odin | 79 +++++++++++++++++++ core/mem/virtual/common.odin | 16 ++++ core/mem/virtual/file.odin | 17 +--- .../{internal.odin => internal_os.odin} | 2 + core/terminal/terminal.odin | 4 +- core/text/i18n/gettext.odin | 8 -- core/text/i18n/i18_js.odin | 18 +++++ core/text/i18n/i18n.odin | 11 --- core/text/i18n/i18n_os.odin | 38 +++++++++ core/text/i18n/qt_linguist.odin | 6 -- core/text/regex/common/common.odin | 2 + core/text/regex/common/debugging.odin | 7 -- core/text/regex/common/os.odin | 17 ++++ core/text/table/utility.odin | 2 + core/time/timezone/tz_os.odin | 19 +++++ core/time/timezone/tz_unix.odin | 2 +- core/time/timezone/tzdate.odin | 4 - core/time/timezone/tzif.odin | 11 --- examples/all/all_js.odin | 7 +- tests/core/time/test_core_time.odin | 4 +- 31 files changed, 288 insertions(+), 187 deletions(-) create mode 100644 core/crypto/hash/hash_js.odin create mode 100644 core/encoding/hxa/hxa_os.odin create mode 100644 core/encoding/ini/ini_os.odin create mode 100644 core/encoding/xml/xml_os.odin create mode 100644 core/math/big/radix_os.odin create mode 100644 core/mem/virtual/common.odin rename core/terminal/{internal.odin => internal_os.odin} (98%) create mode 100644 core/text/i18n/i18_js.odin create mode 100644 core/text/i18n/i18n_os.odin create mode 100644 core/text/regex/common/os.odin create mode 100644 core/time/timezone/tz_os.odin diff --git a/core/crypto/hash/hash_js.odin b/core/crypto/hash/hash_js.odin new file mode 100644 index 000000000..99309b944 --- /dev/null +++ b/core/crypto/hash/hash_js.odin @@ -0,0 +1,10 @@ +#+build js +package crypto_hash + +hash :: proc { + hash_stream, + hash_bytes, + hash_string, + hash_bytes_to_buffer, + hash_string_to_buffer, +} diff --git a/core/crypto/hash/hash_os.odin b/core/crypto/hash/hash_os.odin index 28db9c61f..5155623cb 100644 --- a/core/crypto/hash/hash_os.odin +++ b/core/crypto/hash/hash_os.odin @@ -1,4 +1,5 @@ #+build !freestanding +#+build !js package crypto_hash import "core:io" diff --git a/core/encoding/hxa/hxa_os.odin b/core/encoding/hxa/hxa_os.odin new file mode 100644 index 000000000..c033bdca8 --- /dev/null +++ b/core/encoding/hxa/hxa_os.odin @@ -0,0 +1,34 @@ +#+build !freestanding +#+build !js +package encoding_hxa + +import os "core:os/os2" + +read_from_file :: proc(filename: string, print_error := false, allocator := context.allocator, loc := #caller_location) -> (file: File, err: Read_Error) { + context.allocator = allocator + + data, data_err := os.read_entire_file(filename, allocator, loc) + if data_err != nil { + err = .Unable_To_Read_File + delete(data, allocator) + return + } + file, err = read(data, filename, print_error, allocator) + file.backing = data + return +} + +write_to_file :: proc(filepath: string, file: File) -> (err: Write_Error) { + required := required_write_size(file) + buf, alloc_err := make([]byte, required) + if alloc_err == .Out_Of_Memory { + return .Failed_File_Write + } + defer delete(buf) + + write_internal(&Writer{data = buf}, file) + if os.write_entire_file(filepath, buf) != nil { + err =.Failed_File_Write + } + return +} diff --git a/core/encoding/hxa/read.odin b/core/encoding/hxa/read.odin index 1f1c3633e..1721bf7fc 100644 --- a/core/encoding/hxa/read.odin +++ b/core/encoding/hxa/read.odin @@ -1,7 +1,6 @@ package encoding_hxa import "core:fmt" -import os "core:os/os2" import "core:mem" Read_Error :: enum { @@ -11,20 +10,6 @@ Read_Error :: enum { Unable_To_Read_File, } -read_from_file :: proc(filename: string, print_error := false, allocator := context.allocator, loc := #caller_location) -> (file: File, err: Read_Error) { - context.allocator = allocator - - data, data_err := os.read_entire_file(filename, allocator, loc) - if data_err != nil { - err = .Unable_To_Read_File - delete(data, allocator) - return - } - file, err = read(data, filename, print_error, allocator) - file.backing = data - return -} - read :: proc(data: []byte, filename := "", print_error := false, allocator := context.allocator, loc := #caller_location) -> (file: File, err: Read_Error) { Reader :: struct { filename: string, diff --git a/core/encoding/hxa/write.odin b/core/encoding/hxa/write.odin index e8ef9a139..cbf9c7cb6 100644 --- a/core/encoding/hxa/write.odin +++ b/core/encoding/hxa/write.odin @@ -1,6 +1,5 @@ package encoding_hxa -import os "core:os/os2" import "core:mem" Write_Error :: enum { @@ -9,21 +8,6 @@ Write_Error :: enum { Failed_File_Write, } -write_to_file :: proc(filepath: string, file: File) -> (err: Write_Error) { - required := required_write_size(file) - buf, alloc_err := make([]byte, required) - if alloc_err == .Out_Of_Memory { - return .Failed_File_Write - } - defer delete(buf) - - write_internal(&Writer{data = buf}, file) - if os.write_entire_file(filepath, buf) != nil { - err =.Failed_File_Write - } - return -} - write :: proc(buf: []byte, file: File) -> (n: int, err: Write_Error) { required := required_write_size(file) if len(buf) < required { diff --git a/core/encoding/ini/ini.odin b/core/encoding/ini/ini.odin index 644ce8937..8bf6c6c9a 100644 --- a/core/encoding/ini/ini.odin +++ b/core/encoding/ini/ini.odin @@ -6,7 +6,6 @@ import "base:intrinsics" import "core:strings" import "core:strconv" import "core:io" -import os "core:os/os2" import "core:fmt" _ :: fmt @@ -120,20 +119,6 @@ load_map_from_string :: proc(src: string, allocator: runtime.Allocator, options return } -load_map_from_path :: proc(path: string, allocator: runtime.Allocator, options := DEFAULT_OPTIONS) -> (m: Map, err: runtime.Allocator_Error, ok: bool) { - data, data_err := os.read_entire_file(path, allocator) - defer delete(data, allocator) - if data_err != nil { - return - } - m, err = load_map_from_string(string(data), allocator, options) - ok = err == nil - defer if !ok { - delete_map(m) - } - return -} - save_map_to_string :: proc(m: Map, allocator: runtime.Allocator) -> (data: string) { b := strings.builder_make(allocator) _, _ = write_map(strings.to_writer(&b), m) diff --git a/core/encoding/ini/ini_os.odin b/core/encoding/ini/ini_os.odin new file mode 100644 index 000000000..619a0e2a6 --- /dev/null +++ b/core/encoding/ini/ini_os.odin @@ -0,0 +1,20 @@ +#+build !freestanding +#+build !js +package encoding_ini + +import "base:runtime" +import os "core:os/os2" + +load_map_from_path :: proc(path: string, allocator: runtime.Allocator, options := DEFAULT_OPTIONS) -> (m: Map, err: runtime.Allocator_Error, ok: bool) { + data, data_err := os.read_entire_file(path, allocator) + defer delete(data, allocator) + if data_err != nil { + return + } + m, err = load_map_from_string(string(data), allocator, options) + ok = err == nil + defer if !ok { + delete_map(m) + } + return +} diff --git a/core/encoding/xml/xml_os.odin b/core/encoding/xml/xml_os.odin new file mode 100644 index 000000000..8c7f6cccf --- /dev/null +++ b/core/encoding/xml/xml_os.odin @@ -0,0 +1,18 @@ +#+build !freestanding +#+build !js +package encoding_xml + +import os "core:os/os2" + +// Load an XML file +load_from_file :: proc(filename: string, options := DEFAULT_OPTIONS, error_handler := default_error_handler, allocator := context.allocator) -> (doc: ^Document, err: Error) { + context.allocator = allocator + options := options + + data, data_err := os.read_entire_file(filename, allocator) + if data_err != nil { return {}, .File_Error } + + options.flags += { .Input_May_Be_Modified } + + return parse_bytes(data, options, filename, error_handler, allocator) +} diff --git a/core/encoding/xml/xml_reader.odin b/core/encoding/xml/xml_reader.odin index 798eb3f87..6d068466b 100644 --- a/core/encoding/xml/xml_reader.odin +++ b/core/encoding/xml/xml_reader.odin @@ -14,7 +14,6 @@ import "core:bytes" import "core:encoding/entity" import "base:intrinsics" import "core:mem" -import os "core:os/os2" import "core:strings" likely :: intrinsics.expect @@ -373,19 +372,6 @@ parse_string :: proc(data: string, options := DEFAULT_OPTIONS, path := "", error parse :: proc { parse_string, parse_bytes } -// Load an XML file -load_from_file :: proc(filename: string, options := DEFAULT_OPTIONS, error_handler := default_error_handler, allocator := context.allocator) -> (doc: ^Document, err: Error) { - context.allocator = allocator - options := options - - data, data_err := os.read_entire_file(filename, allocator) - if data_err != nil { return {}, .File_Error } - - options.flags += { .Input_May_Be_Modified } - - return parse_bytes(data, options, filename, error_handler, allocator) -} - destroy :: proc(doc: ^Document, allocator := context.allocator) { context.allocator = allocator if doc == nil { return } diff --git a/core/log/file_console_logger.odin b/core/log/file_console_logger.odin index a9b073c18..819d494e9 100644 --- a/core/log/file_console_logger.odin +++ b/core/log/file_console_logger.odin @@ -1,5 +1,6 @@ #+build !freestanding #+build !orca +#+build !js package log import "base:runtime" diff --git a/core/math/big/radix.odin b/core/math/big/radix.odin index c0ea8cb79..0d57bc071 100644 --- a/core/math/big/radix.odin +++ b/core/math/big/radix.odin @@ -17,7 +17,6 @@ package math_big import "base:intrinsics" import "core:mem" -import os "core:os/os2" /* This version of `itoa` allocates on behalf of the caller. The caller must free the string. @@ -386,63 +385,7 @@ radix_size :: proc(a: ^Int, radix: i8, zero_terminate := false, allocator := con return size, nil } -/* - We might add functions to read and write byte-encoded Ints from/to files, using `int_to_bytes_*` functions. - LibTomMath allows exporting/importing to/from a file in ASCII, but it doesn't support a much more compact representation in binary, even though it has several pack functions int_to_bytes_* (which I expanded upon and wrote Python interoperable versions of as well), and (un)pack, which is GMP compatible. - Someone could implement their own read/write binary int procedures, of course. - - Could be worthwhile to add a canonical binary file representation with an optional small header that says it's an Odin big.Int, big.Rat or Big.Float, byte count for each component that follows, flag for big/little endian and a flag that says a checksum exists at the end of the file. - For big.Rat and big.Float the header couldn't be optional, because we'd have no way to distinguish where the components end. -*/ - -/* - Read an Int from an ASCII file. -*/ -internal_int_read_from_ascii_file :: proc(a: ^Int, filename: string, radix := i8(10), allocator := context.allocator) -> (err: Error) { - context.allocator = allocator - - /* - We can either read the entire file at once, or read a bunch at a time and keep multiplying by the radix. - For now, we'll read the entire file. Eventually we'll replace this with a copy that duplicates the logic - of `atoi` so we don't need to read the entire file. - */ - res, res_err := os.read_entire_file(filename, allocator) - defer delete(res, allocator) - - if res_err != nil { - return .Cannot_Read_File - } - - as := string(res) - return atoi(a, as, radix) -} - -/* - Write an Int to an ASCII file. -*/ -internal_int_write_to_ascii_file :: proc(a: ^Int, filename: string, radix := i8(10), allocator := context.allocator) -> (err: Error) { - context.allocator = allocator - - /* - For now we'll convert the Int using itoa and writing the result in one go. - If we want to preserve memory we could duplicate the itoa logic and write backwards. - */ - - as := itoa(a, radix) or_return - defer delete(as) - - l := len(as) - assert(l > 0) - - data := transmute([]u8)mem.Raw_Slice{ - data = raw_data(as), - len = l, - } - - write_err := os.write_entire_file(filename, data, truncate=true) - return nil if write_err == nil else .Cannot_Write_File -} /* Calculate the size needed for `internal_int_pack`. diff --git a/core/math/big/radix_os.odin b/core/math/big/radix_os.odin new file mode 100644 index 000000000..8269a4338 --- /dev/null +++ b/core/math/big/radix_os.odin @@ -0,0 +1,79 @@ +#+build !freestanding +#+build !js +package math_big + +/* + Copyright 2021 Jeroen van Rijn . + Made available under Odin's license. + + An arbitrary precision mathematics implementation in Odin. + For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3. + The code started out as an idiomatic source port of libTomMath, which is in the public domain, with thanks. + + This file contains radix conversions, `string_to_int` (atoi) and `int_to_string` (itoa). + + TODO: + - Use Barrett reduction for non-powers-of-two. + - Also look at extracting and splatting several digits at once. +*/ + +import "core:mem" +import os "core:os/os2" + +/* + We might add functions to read and write byte-encoded Ints from/to files, using `int_to_bytes_*` functions. + + LibTomMath allows exporting/importing to/from a file in ASCII, but it doesn't support a much more compact representation in binary, even though it has several pack functions int_to_bytes_* (which I expanded upon and wrote Python interoperable versions of as well), and (un)pack, which is GMP compatible. + Someone could implement their own read/write binary int procedures, of course. + + Could be worthwhile to add a canonical binary file representation with an optional small header that says it's an Odin big.Int, big.Rat or Big.Float, byte count for each component that follows, flag for big/little endian and a flag that says a checksum exists at the end of the file. + For big.Rat and big.Float the header couldn't be optional, because we'd have no way to distinguish where the components end. +*/ + +/* + Read an Int from an ASCII file. +*/ +internal_int_read_from_ascii_file :: proc(a: ^Int, filename: string, radix := i8(10), allocator := context.allocator) -> (err: Error) { + context.allocator = allocator + + /* + We can either read the entire file at once, or read a bunch at a time and keep multiplying by the radix. + For now, we'll read the entire file. Eventually we'll replace this with a copy that duplicates the logic + of `atoi` so we don't need to read the entire file. + */ + res, res_err := os.read_entire_file(filename, allocator) + defer delete(res, allocator) + + if res_err != nil { + return .Cannot_Read_File + } + + as := string(res) + return atoi(a, as, radix) +} + +/* + Write an Int to an ASCII file. +*/ +internal_int_write_to_ascii_file :: proc(a: ^Int, filename: string, radix := i8(10), allocator := context.allocator) -> (err: Error) { + context.allocator = allocator + + /* + For now we'll convert the Int using itoa and writing the result in one go. + If we want to preserve memory we could duplicate the itoa logic and write backwards. + */ + + as := itoa(a, radix) or_return + defer delete(as) + + l := len(as) + assert(l > 0) + + data := transmute([]u8)mem.Raw_Slice{ + data = raw_data(as), + len = l, + } + + write_err := os.write_entire_file(filename, data, truncate=true) + return nil if write_err == nil else .Cannot_Write_File +} \ No newline at end of file diff --git a/core/mem/virtual/common.odin b/core/mem/virtual/common.odin new file mode 100644 index 000000000..ad8505c89 --- /dev/null +++ b/core/mem/virtual/common.odin @@ -0,0 +1,16 @@ +package mem_virtual + +Map_File_Error :: enum { + None, + Open_Failure, + Stat_Failure, + Negative_Size, + Too_Large_Size, + Map_Failure, +} + +Map_File_Flag :: enum u32 { + Read, + Write, +} +Map_File_Flags :: distinct bit_set[Map_File_Flag; u32] \ No newline at end of file diff --git a/core/mem/virtual/file.odin b/core/mem/virtual/file.odin index c532335c5..b156f2af4 100644 --- a/core/mem/virtual/file.odin +++ b/core/mem/virtual/file.odin @@ -1,22 +1,9 @@ +#+build !freestanding +#+build !js package mem_virtual import os "core:os/os2" -Map_File_Error :: enum { - None, - Open_Failure, - Stat_Failure, - Negative_Size, - Too_Large_Size, - Map_Failure, -} - -Map_File_Flag :: enum u32 { - Read, - Write, -} -Map_File_Flags :: distinct bit_set[Map_File_Flag; u32] - map_file :: proc{ map_file_from_path, map_file_from_file, diff --git a/core/terminal/internal.odin b/core/terminal/internal_os.odin similarity index 98% rename from core/terminal/internal.odin rename to core/terminal/internal_os.odin index 956726b8a..841803766 100644 --- a/core/terminal/internal.odin +++ b/core/terminal/internal_os.odin @@ -1,3 +1,5 @@ +#+build !freestanding +#+build !js #+private package terminal diff --git a/core/terminal/terminal.odin b/core/terminal/terminal.odin index d24b963d3..86d928649 100644 --- a/core/terminal/terminal.odin +++ b/core/terminal/terminal.odin @@ -1,8 +1,6 @@ // Interaction with the command line interface (`CLI`) of the system. package terminal -import os "core:os/os2" - /* This describes the range of colors that a terminal is capable of supporting. */ @@ -21,7 +19,7 @@ This is normally true for `os.stdout` and `os.stderr` unless they are redirected to a file. */ @(require_results) -is_terminal :: proc(f: ^os.File) -> bool { +is_terminal :: proc(f: $T) -> bool { return _is_terminal(f) } diff --git a/core/text/i18n/gettext.odin b/core/text/i18n/gettext.odin index 4aa86a35d..b0e3dae67 100644 --- a/core/text/i18n/gettext.odin +++ b/core/text/i18n/gettext.odin @@ -125,14 +125,6 @@ parse_mo_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTIONS, plur return } -parse_mo_file :: proc(filename: string, options := DEFAULT_PARSE_OPTIONS, pluralizer: proc(int) -> int = nil, allocator := context.allocator) -> (translation: ^Translation, err: Error) { - data := read_file(filename, allocator) or_return - defer delete(data) - return parse_mo_from_bytes(data, options, pluralizer, allocator) -} - -parse_mo :: proc { parse_mo_file, parse_mo_from_bytes } - @(private) read_u32 :: proc(data: []u8, native_endian := true) -> (res: u32, err: Error) { if len(data) < size_of(u32) { return 0, .Premature_EOF } diff --git a/core/text/i18n/i18_js.odin b/core/text/i18n/i18_js.odin new file mode 100644 index 000000000..743718942 --- /dev/null +++ b/core/text/i18n/i18_js.odin @@ -0,0 +1,18 @@ +#+build freestanding +#+build js +package i18n +/* + Internationalization helpers. + + Copyright 2021-2022 Jeroen van Rijn . + Made available under Odin's license. + + List of contributors: + Jeroen van Rijn: Initial implementation. +*/ +import os "core:os/os2" + +@(private) +parse_qt :: proc { parse_qt_linguist_from_bytes } + +parse_mo :: proc { parse_mo_from_bytes } \ No newline at end of file diff --git a/core/text/i18n/i18n.odin b/core/text/i18n/i18n.odin index 8b107a8cd..148fe229f 100644 --- a/core/text/i18n/i18n.odin +++ b/core/text/i18n/i18n.odin @@ -8,8 +8,6 @@ package i18n List of contributors: Jeroen van Rijn: Initial implementation. */ -import "base:runtime" -import os "core:os/os2" import "core:strings" // Currently active catalog. @@ -231,13 +229,4 @@ destroy :: proc(catalog: ^Translation = ACTIVE, allocator := context.allocator) delete(catalog.k_v) strings.intern_destroy(&catalog.intern) free(catalog) -} - -@(private) -read_file :: proc(filename: string, allocator: runtime.Allocator) -> (data: []u8, err: Error) { - file_data, file_err := os.read_entire_file(filename, allocator) - if file_err != nil { - return {}, .File_Error - } - return file_data, nil } \ No newline at end of file diff --git a/core/text/i18n/i18n_os.odin b/core/text/i18n/i18n_os.odin new file mode 100644 index 000000000..db82a9cf6 --- /dev/null +++ b/core/text/i18n/i18n_os.odin @@ -0,0 +1,38 @@ +#+build !freestanding +#+build !js +package i18n +/* + Internationalization helpers. + + Copyright 2021-2022 Jeroen van Rijn . + Made available under Odin's license. + + List of contributors: + Jeroen van Rijn: Initial implementation. +*/ +import "base:runtime" +import os "core:os/os2" + +@(private) +read_file :: proc(filename: string, allocator: runtime.Allocator) -> (data: []u8, err: Error) { + file_data, file_err := os.read_entire_file(filename, allocator) + if file_err != nil { + return {}, .File_Error + } + return file_data, nil +} + +parse_qt_linguist_file :: proc(filename: string, options := DEFAULT_PARSE_OPTIONS, pluralizer: proc(int) -> int = nil, allocator := context.allocator) -> (translation: ^Translation, err: Error) { + data := read_file(filename, allocator) or_return + return parse_qt_linguist_from_bytes(data, options, pluralizer, allocator) +} + +parse_qt :: proc { parse_qt_linguist_file, parse_qt_linguist_from_bytes } + +parse_mo_file :: proc(filename: string, options := DEFAULT_PARSE_OPTIONS, pluralizer: proc(int) -> int = nil, allocator := context.allocator) -> (translation: ^Translation, err: Error) { + data := read_file(filename, allocator) or_return + defer delete(data) + return parse_mo_from_bytes(data, options, pluralizer, allocator) +} + +parse_mo :: proc { parse_mo_file, parse_mo_from_bytes } \ No newline at end of file diff --git a/core/text/i18n/qt_linguist.odin b/core/text/i18n/qt_linguist.odin index 78fe2712d..9c5791b67 100644 --- a/core/text/i18n/qt_linguist.odin +++ b/core/text/i18n/qt_linguist.odin @@ -154,9 +154,3 @@ parse_qt_linguist_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTI return } -parse_qt_linguist_file :: proc(filename: string, options := DEFAULT_PARSE_OPTIONS, pluralizer: proc(int) -> int = nil, allocator := context.allocator) -> (translation: ^Translation, err: Error) { - data := read_file(filename, allocator) or_return - return parse_qt_linguist_from_bytes(data, options, pluralizer, allocator) -} - -parse_qt :: proc { parse_qt_linguist_file, parse_qt_linguist_from_bytes } \ No newline at end of file diff --git a/core/text/regex/common/common.odin b/core/text/regex/common/common.odin index 24b44833f..cfbbe53ba 100644 --- a/core/text/regex/common/common.odin +++ b/core/text/regex/common/common.odin @@ -14,6 +14,8 @@ MAX_CAPTURE_GROUPS :: max(#config(ODIN_REGEX_MAX_CAPTURE_GROUPS, 10), 10) MAX_PROGRAM_SIZE :: int(max(i16)) MAX_CLASSES :: int(max(u8)) +ODIN_DEBUG_REGEX :: #config(ODIN_DEBUG_REGEX, false) + Flag :: enum u8 { // Multiline: treat `^` and `$` as if they also match newlines. Multiline, diff --git a/core/text/regex/common/debugging.odin b/core/text/regex/common/debugging.odin index e3fcb8b7e..055bbd20d 100644 --- a/core/text/regex/common/debugging.odin +++ b/core/text/regex/common/debugging.odin @@ -8,16 +8,9 @@ package regex_common Feoramund: Initial implementation. */ -@require import os "core:os/os2" import "core:io" import "core:strings" -ODIN_DEBUG_REGEX :: #config(ODIN_DEBUG_REGEX, false) - -when ODIN_DEBUG_REGEX { - debug_stream := os.stderr.stream -} - write_padded_hex :: proc(w: io.Writer, #any_int n, zeroes: int) { sb := strings.builder_make() defer strings.builder_destroy(&sb) diff --git a/core/text/regex/common/os.odin b/core/text/regex/common/os.odin new file mode 100644 index 000000000..1d38d687c --- /dev/null +++ b/core/text/regex/common/os.odin @@ -0,0 +1,17 @@ +#+build !freestanding +#+build !js +package regex_common + +/* + (c) Copyright 2024 Feoramund . + Made available under Odin's license. + + List of contributors: + Feoramund: Initial implementation. +*/ + +@require import os "core:os/os2" + +when ODIN_DEBUG_REGEX { + debug_stream := os.stderr.stream +} \ No newline at end of file diff --git a/core/text/table/utility.odin b/core/text/table/utility.odin index e361d0f5f..db5ae4602 100644 --- a/core/text/table/utility.odin +++ b/core/text/table/utility.odin @@ -1,3 +1,5 @@ +#+build !freestanding +#+build !js package text_table import "core:io" diff --git a/core/time/timezone/tz_os.odin b/core/time/timezone/tz_os.odin new file mode 100644 index 000000000..2ab7cfa6c --- /dev/null +++ b/core/time/timezone/tz_os.odin @@ -0,0 +1,19 @@ +#+build !freestanding +#+build !js +package timezone + +import os "core:os/os2" +import "core:time/datetime" + +load_tzif_file :: proc(filename: string, region_name: string, allocator := context.allocator) -> (out: ^datetime.TZ_Region, ok: bool) { + tzif_data, tzif_err := os.read_entire_file(filename, allocator) + if tzif_err != nil { + return nil, false + } + defer delete(tzif_data, allocator) + return parse_tzif(tzif_data, region_name, allocator) +} + +region_load_from_file :: proc(file_path, reg: string, allocator := context.allocator) -> (out_reg: ^datetime.TZ_Region, ok: bool) { + return load_tzif_file(file_path, reg, allocator) +} \ No newline at end of file diff --git a/core/time/timezone/tz_unix.odin b/core/time/timezone/tz_unix.odin index 32590f177..60a20e57c 100644 --- a/core/time/timezone/tz_unix.odin +++ b/core/time/timezone/tz_unix.odin @@ -14,7 +14,7 @@ local_tz_name :: proc(allocator := context.allocator) -> (name: string, success: path, err := os.get_absolute_path(orig_localtime_path, allocator) if err != nil { // If we can't find /etc/localtime, fallback to UTC - if err == .ENOENT { + if err == .Not_Exist { str, err2 := strings.clone("UTC", allocator) if err2 != nil { return } return str, true diff --git a/core/time/timezone/tzdate.odin b/core/time/timezone/tzdate.odin index f01553573..29e8ad25c 100644 --- a/core/time/timezone/tzdate.odin +++ b/core/time/timezone/tzdate.odin @@ -10,10 +10,6 @@ region_load :: proc(reg: string, allocator := context.allocator) -> (out_reg: ^ return _region_load(reg, allocator) } -region_load_from_file :: proc(file_path, reg: string, allocator := context.allocator) -> (out_reg: ^datetime.TZ_Region, ok: bool) { - return load_tzif_file(file_path, reg, allocator) -} - region_load_from_buffer :: proc(buffer: []u8, reg: string, allocator := context.allocator) -> (out_reg: ^datetime.TZ_Region, ok: bool) { return parse_tzif(buffer, reg, allocator) } diff --git a/core/time/timezone/tzif.odin b/core/time/timezone/tzif.odin index 7a7023c6c..3b92364ac 100644 --- a/core/time/timezone/tzif.odin +++ b/core/time/timezone/tzif.odin @@ -3,7 +3,6 @@ package timezone import "base:intrinsics" import "core:slice" import "core:strings" -import os "core:os/os2" import "core:strconv" import "core:time/datetime" @@ -67,16 +66,6 @@ tzif_data_block_size :: proc(hdr: ^TZif_Header, version: TZif_Version) -> (block int(hdr.isutcnt), true } - -load_tzif_file :: proc(filename: string, region_name: string, allocator := context.allocator) -> (out: ^datetime.TZ_Region, ok: bool) { - tzif_data, tzif_err := os.read_entire_file(filename, allocator) - if tzif_err != nil { - return nil, false - } - defer delete(tzif_data, allocator) - return parse_tzif(tzif_data, region_name, allocator) -} - @private is_alphabetic :: proc(ch: u8) -> bool { // ('A' -> 'Z') || ('a' -> 'z') diff --git a/examples/all/all_js.odin b/examples/all/all_js.odin index ee006ae86..bb7ed7fa1 100644 --- a/examples/all/all_js.odin +++ b/examples/all/all_js.odin @@ -10,7 +10,7 @@ package all @(require) import "core:compress" @(require) import "core:compress/shoco" -@(require) import "core:compress/gzip" +// @(require) import "core:compress/gzip" @(require) import "core:compress/zlib" @(require) import "core:container/avl" @@ -99,13 +99,13 @@ package all @(require) import "core:mem" @(require) import "core:mem/tlsf" -@(require) import "core:mem/virtual" +// Not supported on JS +// @(require) import "core:mem/virtual" @(require) import "core:odin/ast" @(require) import doc_format "core:odin/doc-format" @(require) import "core:odin/tokenizer" -@(require) import "core:os" @(require) import "core:path/slashpath" @(require) import "core:relative" @@ -130,6 +130,7 @@ package all @(require) import "core:text/match" @(require) import "core:text/regex" @(require) import "core:text/scanner" +// Not supported on JS, uses `core:mem/virtual`. @(require) import "core:text/table" @(require) import "core:thread" diff --git a/tests/core/time/test_core_time.odin b/tests/core/time/test_core_time.odin index cd2b19fb8..6e5e47696 100644 --- a/tests/core/time/test_core_time.odin +++ b/tests/core/time/test_core_time.odin @@ -2,6 +2,7 @@ package test_core_time import "core:testing" import "core:time" +@(require) import "core:log" import dt "core:time/datetime" import tz "core:time/timezone" @@ -364,9 +365,10 @@ test_convert_timezone_roundtrip :: proc(t: ^testing.T) { std_dt, _ := dt.components_to_datetime(2024, 11, 4, 23, 47, 0) local_tz, local_load_ok := tz.region_load("local") - testing.expectf(t, local_load_ok, "Failed to load local timezone") defer tz.region_destroy(local_tz) + testing.expectf(t, local_load_ok, "Failed to load local timezone") + edm_tz, edm_load_ok := tz.region_load("America/Edmonton") testing.expectf(t, edm_load_ok, "Failed to load America/Edmonton timezone") defer tz.region_destroy(edm_tz) From e7dbabf6681e4e6bcae33398e939c2c9c3cdc879 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Feb 2026 15:50:21 +0100 Subject: [PATCH 398/766] core:os -> core:os/old && core:os/os2 -> core:os --- core/compress/gzip/doc.odin | 10 +- core/compress/gzip/gzip.odin | 12 +- core/crypto/hash/hash_os.odin | 2 +- core/encoding/csv/doc.odin | 2 +- core/encoding/hxa/hxa_os.odin | 2 +- core/encoding/ini/ini_os.odin | 2 +- core/encoding/xml/xml_os.odin | 2 +- core/flags/errors.odin | 2 +- core/flags/example/example.odin | 2 +- core/flags/internal_rtti.odin | 24 +- core/flags/internal_validation.odin | 16 +- core/flags/util.odin | 6 +- core/fmt/fmt_os.odin | 8 +- core/image/bmp/bmp_os.odin | 4 +- core/image/general_os.odin | 2 +- core/image/jpeg/jpeg_os.odin | 2 +- core/image/netpbm/netpbm_os.odin | 2 +- core/image/png/png_os.odin | 2 +- core/image/qoi/qoi_os.odin | 4 +- core/image/tga/tga_os.odin | 4 +- core/log/file_console_logger.odin | 14 +- core/math/big/radix_os.odin | 2 +- core/mem/virtual/doc.odin | 4 +- core/mem/virtual/file.odin | 2 +- core/net/dns_os.odin | 2 +- core/odin/parser/parse_files.odin | 14 +- core/os/{os2 => }/allocators.odin | 0 core/os/{os2 => }/dir.odin | 4 +- core/os/{os2 => }/dir_js.odin | 0 core/os/{os2 => }/dir_linux.odin | 0 core/os/{os2 => }/dir_posix.odin | 0 core/os/{os2 => }/dir_posix_darwin.odin | 0 core/os/{os2 => }/dir_walker.odin | 6 +- core/os/{os2 => }/dir_wasi.odin | 0 core/os/dir_windows.odin | 196 ++++---- core/os/{os2 => }/doc.odin | 0 core/os/{os2 => }/env.odin | 0 core/os/{os2 => }/env_js.odin | 0 core/os/{os2 => }/env_linux.odin | 0 core/os/{os2 => }/env_posix.odin | 0 core/os/{os2 => }/env_wasi.odin | 0 core/os/env_windows.odin | 162 +++---- core/os/errors.odin | 257 ++--------- core/os/{os2 => }/errors_js.odin | 0 core/os/{os2 => }/errors_linux.odin | 0 core/os/{os2 => }/errors_posix.odin | 0 core/os/{os2 => }/errors_wasi.odin | 0 core/os/{os2 => }/errors_windows.odin | 0 core/os/{os2 => }/file.odin | 0 core/os/{os2 => }/file_js.odin | 0 core/os/{os2 => }/file_linux.odin | 0 core/os/{os2 => }/file_posix.odin | 0 core/os/{os2 => }/file_posix_darwin.odin | 0 core/os/{os2 => }/file_posix_freebsd.odin | 0 core/os/{os2 => }/file_posix_netbsd.odin | 0 core/os/{os2 => }/file_posix_other.odin | 0 core/os/{os2 => }/file_stream.odin | 0 core/os/{os2 => }/file_util.odin | 0 core/os/{os2 => }/file_wasi.odin | 0 core/os/{os2 => }/file_windows.odin | 0 core/os/{os2 => }/heap.odin | 0 core/os/{os2 => }/heap_js.odin | 0 core/os/{os2 => }/heap_linux.odin | 0 core/os/{os2 => }/heap_posix.odin | 0 core/os/{os2 => }/heap_wasi.odin | 0 core/os/{os2 => }/heap_windows.odin | 0 core/os/{os2 => }/internal_util.odin | 0 core/os/{ => old}/dir_unix.odin | 0 core/os/old/dir_windows.odin | 114 +++++ core/os/old/env_windows.odin | 140 ++++++ core/os/old/errors.odin | 318 +++++++++++++ core/os/{ => old}/os.odin | 0 core/os/{ => old}/os_darwin.odin | 0 core/os/{ => old}/os_essence.odin | 0 core/os/{ => old}/os_freebsd.odin | 0 core/os/{ => old}/os_freestanding.odin | 0 core/os/{ => old}/os_haiku.odin | 0 core/os/{ => old}/os_js.odin | 0 core/os/{ => old}/os_linux.odin | 0 core/os/{ => old}/os_netbsd.odin | 0 core/os/{ => old}/os_openbsd.odin | 0 core/os/{ => old}/os_wasi.odin | 0 core/os/{ => old}/os_windows.odin | 0 core/os/old/stat.odin | 33 ++ core/os/{ => old}/stat_unix.odin | 0 core/os/old/stat_windows.odin | 303 ++++++++++++ core/os/{ => old}/stream.odin | 0 core/os/os2/dir_windows.odin | 144 ------ core/os/os2/env_windows.odin | 142 ------ core/os/os2/errors.odin | 147 ------ core/os/os2/stat.odin | 117 ----- core/os/os2/stat_windows.odin | 393 ---------------- core/os/{os2 => }/path.odin | 0 core/os/{os2 => }/path_darwin.odin | 0 core/os/{os2 => }/path_freebsd.odin | 0 core/os/{os2 => }/path_js.odin | 0 core/os/{os2 => }/path_linux.odin | 0 core/os/{os2 => }/path_netbsd.odin | 0 core/os/{os2 => }/path_openbsd.odin | 0 core/os/{os2 => }/path_posix.odin | 0 core/os/{os2 => }/path_posixfs.odin | 0 core/os/{os2 => }/path_wasi.odin | 0 core/os/{os2 => }/path_windows.odin | 0 core/os/{os2 => }/pipe.odin | 0 core/os/{os2 => }/pipe_js.odin | 0 core/os/{os2 => }/pipe_linux.odin | 0 core/os/{os2 => }/pipe_posix.odin | 0 core/os/{os2 => }/pipe_wasi.odin | 0 core/os/{os2 => }/pipe_windows.odin | 0 core/os/{os2 => }/process.odin | 0 core/os/{os2 => }/process_freebsd.odin | 0 core/os/{os2 => }/process_js.odin | 0 core/os/{os2 => }/process_linux.odin | 0 core/os/{os2 => }/process_netbsd.odin | 0 core/os/{os2 => }/process_openbsd.odin | 0 core/os/{os2 => }/process_posix.odin | 0 core/os/{os2 => }/process_posix_darwin.odin | 0 core/os/{os2 => }/process_posix_other.odin | 0 core/os/{os2 => }/process_wasi.odin | 0 core/os/{os2 => }/process_windows.odin | 0 core/os/stat.odin | 116 ++++- core/os/{os2 => }/stat_js.odin | 0 core/os/{os2 => }/stat_linux.odin | 0 core/os/{os2 => }/stat_posix.odin | 0 core/os/{os2 => }/stat_wasi.odin | 0 core/os/stat_windows.odin | 432 +++++++++++------- core/os/{os2 => }/temp_file.odin | 0 core/os/{os2 => }/temp_file_js.odin | 0 core/os/{os2 => }/temp_file_linux.odin | 0 core/os/{os2 => }/temp_file_posix.odin | 0 core/os/{os2 => }/temp_file_wasi.odin | 0 core/os/{os2 => }/temp_file_windows.odin | 0 core/os/{os2 => }/user.odin | 0 core/os/{os2 => }/user_posix.odin | 0 core/os/{os2 => }/user_windows.odin | 0 core/path/filepath/match.odin | 2 +- core/path/filepath/path.odin | 4 +- core/path/filepath/walk.odin | 8 +- core/prof/spall/spall.odin | 4 +- core/terminal/internal_os.odin | 6 +- core/terminal/terminal_posix.odin | 4 +- core/terminal/terminal_windows.odin | 6 +- core/testing/runner.odin | 36 +- core/testing/signal_handler_libc.odin | 10 +- core/text/i18n/i18_js.odin | 2 - core/text/i18n/i18n_os.odin | 2 +- core/text/regex/common/os.odin | 2 +- core/text/table/doc.odin | 10 +- core/text/table/utility.odin | 6 +- core/time/timezone/tz_os.odin | 2 +- core/time/timezone/tz_unix.odin | 8 +- core/unicode/tools/generate_entity_table.odin | 2 +- examples/all/all_main.odin | 2 +- tests/core/encoding/hxa/test_core_hxa.odin | 2 +- tests/core/flags/test_core_flags.odin | 22 +- tests/core/io/test_core_io.odin | 14 +- tests/core/nbio/fs.odin | 8 +- tests/core/nbio/nbio.odin | 12 +- tests/core/normal.odin | 2 +- tests/core/os/{os2 => }/dir.odin | 22 +- tests/core/os/{os2 => }/file.odin | 6 +- tests/core/os/{ => old}/os.odin | 4 +- tests/core/os/{os2 => }/path.odin | 24 +- tests/core/os/{os2 => }/process.odin | 8 +- tests/core/sys/kqueue/structs.odin | 6 +- tests/documentation/documentation_tester.odin | 4 +- vendor/OpenGL/helpers.odin | 2 +- vendor/fontstash/fontstash_os.odin | 4 +- vendor/libc-shim/stdio_os.odin | 6 +- 169 files changed, 1716 insertions(+), 1718 deletions(-) rename core/os/{os2 => }/allocators.odin (100%) rename core/os/{os2 => }/dir.odin (99%) rename core/os/{os2 => }/dir_js.odin (100%) rename core/os/{os2 => }/dir_linux.odin (100%) rename core/os/{os2 => }/dir_posix.odin (100%) rename core/os/{os2 => }/dir_posix_darwin.odin (100%) rename core/os/{os2 => }/dir_walker.odin (98%) rename core/os/{os2 => }/dir_wasi.odin (100%) rename core/os/{os2 => }/doc.odin (100%) rename core/os/{os2 => }/env.odin (100%) rename core/os/{os2 => }/env_js.odin (100%) rename core/os/{os2 => }/env_linux.odin (100%) rename core/os/{os2 => }/env_posix.odin (100%) rename core/os/{os2 => }/env_wasi.odin (100%) rename core/os/{os2 => }/errors_js.odin (100%) rename core/os/{os2 => }/errors_linux.odin (100%) rename core/os/{os2 => }/errors_posix.odin (100%) rename core/os/{os2 => }/errors_wasi.odin (100%) rename core/os/{os2 => }/errors_windows.odin (100%) rename core/os/{os2 => }/file.odin (100%) rename core/os/{os2 => }/file_js.odin (100%) rename core/os/{os2 => }/file_linux.odin (100%) rename core/os/{os2 => }/file_posix.odin (100%) rename core/os/{os2 => }/file_posix_darwin.odin (100%) rename core/os/{os2 => }/file_posix_freebsd.odin (100%) rename core/os/{os2 => }/file_posix_netbsd.odin (100%) rename core/os/{os2 => }/file_posix_other.odin (100%) rename core/os/{os2 => }/file_stream.odin (100%) rename core/os/{os2 => }/file_util.odin (100%) rename core/os/{os2 => }/file_wasi.odin (100%) rename core/os/{os2 => }/file_windows.odin (100%) rename core/os/{os2 => }/heap.odin (100%) rename core/os/{os2 => }/heap_js.odin (100%) rename core/os/{os2 => }/heap_linux.odin (100%) rename core/os/{os2 => }/heap_posix.odin (100%) rename core/os/{os2 => }/heap_wasi.odin (100%) rename core/os/{os2 => }/heap_windows.odin (100%) rename core/os/{os2 => }/internal_util.odin (100%) rename core/os/{ => old}/dir_unix.odin (100%) create mode 100644 core/os/old/dir_windows.odin create mode 100644 core/os/old/env_windows.odin create mode 100644 core/os/old/errors.odin rename core/os/{ => old}/os.odin (100%) rename core/os/{ => old}/os_darwin.odin (100%) rename core/os/{ => old}/os_essence.odin (100%) rename core/os/{ => old}/os_freebsd.odin (100%) rename core/os/{ => old}/os_freestanding.odin (100%) rename core/os/{ => old}/os_haiku.odin (100%) rename core/os/{ => old}/os_js.odin (100%) rename core/os/{ => old}/os_linux.odin (100%) rename core/os/{ => old}/os_netbsd.odin (100%) rename core/os/{ => old}/os_openbsd.odin (100%) rename core/os/{ => old}/os_wasi.odin (100%) rename core/os/{ => old}/os_windows.odin (100%) create mode 100644 core/os/old/stat.odin rename core/os/{ => old}/stat_unix.odin (100%) create mode 100644 core/os/old/stat_windows.odin rename core/os/{ => old}/stream.odin (100%) delete mode 100644 core/os/os2/dir_windows.odin delete mode 100644 core/os/os2/env_windows.odin delete mode 100644 core/os/os2/errors.odin delete mode 100644 core/os/os2/stat.odin delete mode 100644 core/os/os2/stat_windows.odin rename core/os/{os2 => }/path.odin (100%) rename core/os/{os2 => }/path_darwin.odin (100%) rename core/os/{os2 => }/path_freebsd.odin (100%) rename core/os/{os2 => }/path_js.odin (100%) rename core/os/{os2 => }/path_linux.odin (100%) rename core/os/{os2 => }/path_netbsd.odin (100%) rename core/os/{os2 => }/path_openbsd.odin (100%) rename core/os/{os2 => }/path_posix.odin (100%) rename core/os/{os2 => }/path_posixfs.odin (100%) rename core/os/{os2 => }/path_wasi.odin (100%) rename core/os/{os2 => }/path_windows.odin (100%) rename core/os/{os2 => }/pipe.odin (100%) rename core/os/{os2 => }/pipe_js.odin (100%) rename core/os/{os2 => }/pipe_linux.odin (100%) rename core/os/{os2 => }/pipe_posix.odin (100%) rename core/os/{os2 => }/pipe_wasi.odin (100%) rename core/os/{os2 => }/pipe_windows.odin (100%) rename core/os/{os2 => }/process.odin (100%) rename core/os/{os2 => }/process_freebsd.odin (100%) rename core/os/{os2 => }/process_js.odin (100%) rename core/os/{os2 => }/process_linux.odin (100%) rename core/os/{os2 => }/process_netbsd.odin (100%) rename core/os/{os2 => }/process_openbsd.odin (100%) rename core/os/{os2 => }/process_posix.odin (100%) rename core/os/{os2 => }/process_posix_darwin.odin (100%) rename core/os/{os2 => }/process_posix_other.odin (100%) rename core/os/{os2 => }/process_wasi.odin (100%) rename core/os/{os2 => }/process_windows.odin (100%) rename core/os/{os2 => }/stat_js.odin (100%) rename core/os/{os2 => }/stat_linux.odin (100%) rename core/os/{os2 => }/stat_posix.odin (100%) rename core/os/{os2 => }/stat_wasi.odin (100%) rename core/os/{os2 => }/temp_file.odin (100%) rename core/os/{os2 => }/temp_file_js.odin (100%) rename core/os/{os2 => }/temp_file_linux.odin (100%) rename core/os/{os2 => }/temp_file_posix.odin (100%) rename core/os/{os2 => }/temp_file_wasi.odin (100%) rename core/os/{os2 => }/temp_file_windows.odin (100%) rename core/os/{os2 => }/user.odin (100%) rename core/os/{os2 => }/user_posix.odin (100%) rename core/os/{os2 => }/user_windows.odin (100%) rename tests/core/os/{os2 => }/dir.odin (82%) rename tests/core/os/{os2 => }/file.odin (90%) rename tests/core/os/{ => old}/os.odin (97%) rename tests/core/os/{os2 => }/path.odin (97%) rename tests/core/os/{os2 => }/process.odin (84%) diff --git a/core/compress/gzip/doc.odin b/core/compress/gzip/doc.odin index 82eaa6f35..e4b1929dd 100644 --- a/core/compress/gzip/doc.odin +++ b/core/compress/gzip/doc.odin @@ -2,11 +2,11 @@ A small `GZIP` unpacker. Example: - import "core:bytes" - import os "core:os/os2" - import "core:compress" - import "core:compress/gzip" - import "core:fmt" + import "core:bytes" + import "core:os" + import "core:compress" + import "core:compress/gzip" + import "core:fmt" // Small GZIP file with fextra, fname and fcomment present. @private diff --git a/core/compress/gzip/gzip.odin b/core/compress/gzip/gzip.odin index 644a625e7..aedbe3a83 100644 --- a/core/compress/gzip/gzip.odin +++ b/core/compress/gzip/gzip.odin @@ -14,12 +14,12 @@ package compress_gzip to be the input to a complementary TAR implementation. */ -import "core:compress/zlib" -import "core:compress" -import os "core:os/os2" -import "core:io" -import "core:bytes" -import "core:hash" +import "core:compress/zlib" +import "core:compress" +import "core:os" +import "core:io" +import "core:bytes" +import "core:hash" Magic :: enum u16le { GZIP = 0x8b << 8 | 0x1f, diff --git a/core/crypto/hash/hash_os.odin b/core/crypto/hash/hash_os.odin index 5155623cb..49c1a0ff8 100644 --- a/core/crypto/hash/hash_os.odin +++ b/core/crypto/hash/hash_os.odin @@ -3,7 +3,7 @@ package crypto_hash import "core:io" -import os "core:os/os2" +import "core:os" // `hash_file` will read the file provided by the given handle and return the // computed digest in a newly allocated slice. diff --git a/core/encoding/csv/doc.odin b/core/encoding/csv/doc.odin index c6dae3005..1fb685602 100644 --- a/core/encoding/csv/doc.odin +++ b/core/encoding/csv/doc.odin @@ -6,7 +6,7 @@ Example: import "core:fmt" import "core:encoding/csv" - import os "core:os/os2" + import "core:os" // Requires keeping the entire CSV file in memory at once iterate_csv_from_string :: proc(filename: string) { diff --git a/core/encoding/hxa/hxa_os.odin b/core/encoding/hxa/hxa_os.odin index c033bdca8..17ad94819 100644 --- a/core/encoding/hxa/hxa_os.odin +++ b/core/encoding/hxa/hxa_os.odin @@ -2,7 +2,7 @@ #+build !js package encoding_hxa -import os "core:os/os2" +import "core:os" read_from_file :: proc(filename: string, print_error := false, allocator := context.allocator, loc := #caller_location) -> (file: File, err: Read_Error) { context.allocator = allocator diff --git a/core/encoding/ini/ini_os.odin b/core/encoding/ini/ini_os.odin index 619a0e2a6..22c6bf7b3 100644 --- a/core/encoding/ini/ini_os.odin +++ b/core/encoding/ini/ini_os.odin @@ -3,7 +3,7 @@ package encoding_ini import "base:runtime" -import os "core:os/os2" +import "core:os" load_map_from_path :: proc(path: string, allocator: runtime.Allocator, options := DEFAULT_OPTIONS) -> (m: Map, err: runtime.Allocator_Error, ok: bool) { data, data_err := os.read_entire_file(path, allocator) diff --git a/core/encoding/xml/xml_os.odin b/core/encoding/xml/xml_os.odin index 8c7f6cccf..1e94572c6 100644 --- a/core/encoding/xml/xml_os.odin +++ b/core/encoding/xml/xml_os.odin @@ -2,7 +2,7 @@ #+build !js package encoding_xml -import os "core:os/os2" +import "core:os" // Load an XML file load_from_file :: proc(filename: string, options := DEFAULT_OPTIONS, error_handler := default_error_handler, allocator := context.allocator) -> (doc: ^Document, err: Error) { diff --git a/core/flags/errors.odin b/core/flags/errors.odin index d0caa1427..efe4cb6c4 100644 --- a/core/flags/errors.odin +++ b/core/flags/errors.odin @@ -2,7 +2,7 @@ package flags import "base:runtime" import "core:net" -import os "core:os/os2" +import "core:os" Parse_Error_Reason :: enum { None, diff --git a/core/flags/example/example.odin b/core/flags/example/example.odin index 6e74c7dcc..6ace3d852 100644 --- a/core/flags/example/example.odin +++ b/core/flags/example/example.odin @@ -4,7 +4,7 @@ import "base:runtime" import "core:flags" import "core:fmt" import "core:net" -import os "core:os/os2" +import "core:os" import "core:time/datetime" diff --git a/core/flags/internal_rtti.odin b/core/flags/internal_rtti.odin index 07481a89b..d5e8726e2 100644 --- a/core/flags/internal_rtti.odin +++ b/core/flags/internal_rtti.odin @@ -1,18 +1,18 @@ #+private package flags -import "base:intrinsics" -import "base:runtime" -import "core:fmt" -import "core:mem" -import "core:net" -@(require) import os "core:os/os2" -import "core:reflect" -import "core:strconv" -import "core:strings" -@require import "core:time" -@require import "core:time/datetime" -import "core:unicode/utf8" +import "base:intrinsics" +import "base:runtime" +import "core:fmt" +import "core:mem" +import "core:net" +@(require) import "core:os" +import "core:reflect" +import "core:strconv" +import "core:strings" +@(require) import "core:time" +@(require) import "core:time/datetime" +import "core:unicode/utf8" @(optimization_mode="favor_size") parse_and_set_pointer_by_base_type :: proc(ptr: rawptr, str: string, type_info: ^runtime.Type_Info) -> bool { diff --git a/core/flags/internal_validation.odin b/core/flags/internal_validation.odin index dc19f3084..6f9016a21 100644 --- a/core/flags/internal_validation.odin +++ b/core/flags/internal_validation.odin @@ -1,14 +1,14 @@ #+private package flags -@require import "base:runtime" -@require import "core:container/bit_array" -@require import "core:fmt" -@require import "core:mem" -@require import os "core:os/os2" -@require import "core:reflect" -@require import "core:strconv" -@require import "core:strings" +@require import "base:runtime" +@require import "core:container/bit_array" +@require import "core:fmt" +@require import "core:mem" +@require import "core:os" +@require import "core:reflect" +@require import "core:strconv" +@require import "core:strings" // This proc is used to assert that `T` meets the expectations of the library. @(optimization_mode="favor_size", disabled=ODIN_DISABLE_ASSERT) diff --git a/core/flags/util.odin b/core/flags/util.odin index 20e40cab5..0d18fa196 100644 --- a/core/flags/util.odin +++ b/core/flags/util.odin @@ -1,9 +1,9 @@ package flags -import "core:fmt" -@require import os "core:os/os2" +import "core:fmt" +@require import "core:os" @require import "core:path/filepath" -import "core:strings" +import "core:strings" /* Parse any arguments into an annotated struct or exit if there was an error. diff --git a/core/fmt/fmt_os.odin b/core/fmt/fmt_os.odin index 7ce945a0f..0305b5bac 100644 --- a/core/fmt/fmt_os.odin +++ b/core/fmt/fmt_os.odin @@ -3,10 +3,10 @@ #+build !orca package fmt -import "base:runtime" -import os "core:os/os2" -import "core:io" -import "core:bufio" +import "base:runtime" +import "core:os" +import "core:io" +import "core:bufio" // NOTE(Jeroen): The other option is to deprecate `fprint*` and make it an alias for `wprint*`, using File.stream directly. diff --git a/core/image/bmp/bmp_os.odin b/core/image/bmp/bmp_os.odin index 971750fda..1aa1d63de 100644 --- a/core/image/bmp/bmp_os.odin +++ b/core/image/bmp/bmp_os.odin @@ -1,8 +1,8 @@ #+build !js package core_image_bmp -import os "core:os/os2" -import "core:bytes" +import "core:os" +import "core:bytes" load :: proc{load_from_file, load_from_bytes, load_from_context} diff --git a/core/image/general_os.odin b/core/image/general_os.odin index e4de1c9a6..63d7c8d43 100644 --- a/core/image/general_os.odin +++ b/core/image/general_os.odin @@ -1,7 +1,7 @@ #+build !js package image -import os "core:os/os2" +import "core:os" load :: proc{ load_from_bytes, diff --git a/core/image/jpeg/jpeg_os.odin b/core/image/jpeg/jpeg_os.odin index aad172c91..6ba301d80 100644 --- a/core/image/jpeg/jpeg_os.odin +++ b/core/image/jpeg/jpeg_os.odin @@ -1,7 +1,7 @@ #+build !js package jpeg -import os "core:os/os2" +import "core:os" load :: proc{load_from_file, load_from_bytes, load_from_context} diff --git a/core/image/netpbm/netpbm_os.odin b/core/image/netpbm/netpbm_os.odin index 82ad55f35..ae9029b54 100644 --- a/core/image/netpbm/netpbm_os.odin +++ b/core/image/netpbm/netpbm_os.odin @@ -1,7 +1,7 @@ #+build !js package netpbm -import os "core:os/os2" +import "core:os" load :: proc { load_from_file, diff --git a/core/image/png/png_os.odin b/core/image/png/png_os.odin index c6a88fa52..5fc10cec4 100644 --- a/core/image/png/png_os.odin +++ b/core/image/png/png_os.odin @@ -1,7 +1,7 @@ #+build !js package png -import os "core:os/os2" +import "core:os" load :: proc{load_from_file, load_from_bytes, load_from_context} diff --git a/core/image/qoi/qoi_os.odin b/core/image/qoi/qoi_os.odin index a65527d09..f2bf83cfc 100644 --- a/core/image/qoi/qoi_os.odin +++ b/core/image/qoi/qoi_os.odin @@ -1,8 +1,8 @@ #+build !js package qoi -import os "core:os/os2" -import "core:bytes" +import "core:os" +import "core:bytes" load :: proc{load_from_file, load_from_bytes, load_from_context} diff --git a/core/image/tga/tga_os.odin b/core/image/tga/tga_os.odin index 2c103b34a..ba50439de 100644 --- a/core/image/tga/tga_os.odin +++ b/core/image/tga/tga_os.odin @@ -1,8 +1,8 @@ #+build !js package tga -import os "core:os/os2" -import "core:bytes" +import "core:os" +import "core:bytes" load :: proc{load_from_file, load_from_bytes, load_from_context} diff --git a/core/log/file_console_logger.odin b/core/log/file_console_logger.odin index 819d494e9..47174719f 100644 --- a/core/log/file_console_logger.odin +++ b/core/log/file_console_logger.odin @@ -3,13 +3,13 @@ #+build !js package log -import "base:runtime" -import "core:fmt" -import "core:strings" -import os "core:os/os2" -import "core:terminal" -import "core:terminal/ansi" -import "core:time" +import "base:runtime" +import "core:fmt" +import "core:strings" +import "core:os" +import "core:terminal" +import "core:terminal/ansi" +import "core:time" Level_Headers := [?]string{ 0..<10 = "[DEBUG] --- ", diff --git a/core/math/big/radix_os.odin b/core/math/big/radix_os.odin index 8269a4338..50454b679 100644 --- a/core/math/big/radix_os.odin +++ b/core/math/big/radix_os.odin @@ -18,7 +18,7 @@ package math_big */ import "core:mem" -import os "core:os/os2" +import "core:os" /* We might add functions to read and write byte-encoded Ints from/to files, using `int_to_bytes_*` functions. diff --git a/core/mem/virtual/doc.odin b/core/mem/virtual/doc.odin index 249e22ee8..b5f0944c7 100644 --- a/core/mem/virtual/doc.odin +++ b/core/mem/virtual/doc.odin @@ -5,8 +5,8 @@ virtual.Arena usage Example: // Source: https://github.com/odin-lang/examples/blob/master/arena_allocator/arena_allocator.odin - import "core:fmt" - import os "core:os/os2" + import "core:fmt" + import "core:os" // virtual package implements a multi-purpose arena allocator. If you are on a // platform that does not support virtual memory, then there is also a similar diff --git a/core/mem/virtual/file.odin b/core/mem/virtual/file.odin index b156f2af4..660210bbf 100644 --- a/core/mem/virtual/file.odin +++ b/core/mem/virtual/file.odin @@ -2,7 +2,7 @@ #+build !js package mem_virtual -import os "core:os/os2" +import "core:os" map_file :: proc{ map_file_from_path, diff --git a/core/net/dns_os.odin b/core/net/dns_os.odin index 8528dad00..ad9724d37 100644 --- a/core/net/dns_os.odin +++ b/core/net/dns_os.odin @@ -2,7 +2,7 @@ #+private package net -import os "core:os/os2" +import "core:os" load_resolv_conf :: proc(resolv_conf_path: string, allocator := context.allocator) -> (name_servers: []Endpoint, ok: bool) { context.allocator = allocator diff --git a/core/odin/parser/parse_files.odin b/core/odin/parser/parse_files.odin index 93c282d35..2ea47ca89 100644 --- a/core/odin/parser/parse_files.odin +++ b/core/odin/parser/parse_files.odin @@ -1,12 +1,12 @@ package odin_parser -import "core:odin/tokenizer" -import "core:odin/ast" -import "core:path/filepath" -import "core:fmt" -import os "core:os/os2" -import "core:slice" -import "core:strings" +import "core:odin/tokenizer" +import "core:odin/ast" +import "core:path/filepath" +import "core:fmt" +import "core:os" +import "core:slice" +import "core:strings" collect_package :: proc(path: string) -> (pkg: ^ast.Package, success: bool) { NO_POS :: tokenizer.Pos{} diff --git a/core/os/os2/allocators.odin b/core/os/allocators.odin similarity index 100% rename from core/os/os2/allocators.odin rename to core/os/allocators.odin diff --git a/core/os/os2/dir.odin b/core/os/dir.odin similarity index 99% rename from core/os/os2/dir.odin rename to core/os/dir.odin index f63754273..9ad5f451e 100644 --- a/core/os/os2/dir.odin +++ b/core/os/dir.odin @@ -160,8 +160,8 @@ extend its lifetime. Example: package main - import "core:fmt" - import os "core:os/os2" + import "core:fmt" + import "core:os" main :: proc() { f, oerr := os.open("core") diff --git a/core/os/os2/dir_js.odin b/core/os/dir_js.odin similarity index 100% rename from core/os/os2/dir_js.odin rename to core/os/dir_js.odin diff --git a/core/os/os2/dir_linux.odin b/core/os/dir_linux.odin similarity index 100% rename from core/os/os2/dir_linux.odin rename to core/os/dir_linux.odin diff --git a/core/os/os2/dir_posix.odin b/core/os/dir_posix.odin similarity index 100% rename from core/os/os2/dir_posix.odin rename to core/os/dir_posix.odin diff --git a/core/os/os2/dir_posix_darwin.odin b/core/os/dir_posix_darwin.odin similarity index 100% rename from core/os/os2/dir_posix_darwin.odin rename to core/os/dir_posix_darwin.odin diff --git a/core/os/os2/dir_walker.odin b/core/os/dir_walker.odin similarity index 98% rename from core/os/os2/dir_walker.odin rename to core/os/dir_walker.odin index ba5342cf8..4dce884a8 100644 --- a/core/os/os2/dir_walker.odin +++ b/core/os/dir_walker.odin @@ -136,9 +136,9 @@ If an error occurred opening a directory, you may get zero'd info struct and Example: package main - import "core:fmt" - import "core:strings" - import os "core:os/os2" + import "core:fmt" + import "core:strings" + import "core:os" main :: proc() { w := os.walker_create("core") diff --git a/core/os/os2/dir_wasi.odin b/core/os/dir_wasi.odin similarity index 100% rename from core/os/os2/dir_wasi.odin rename to core/os/dir_wasi.odin diff --git a/core/os/dir_windows.odin b/core/os/dir_windows.odin index 40f4b9e9b..a4dadca75 100644 --- a/core/os/dir_windows.odin +++ b/core/os/dir_windows.odin @@ -1,114 +1,144 @@ -package os +#+private +package os2 -import win32 "core:sys/windows" -import "core:strings" import "base:runtime" +import "core:time" +import win32 "core:sys/windows" + +@(private="file") +find_data_to_file_info :: proc(base_path: string, d: ^win32.WIN32_FIND_DATAW, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { + // Ignore "." and ".." + if d.cFileName[0] == '.' && d.cFileName[1] == 0 { + return + } + if d.cFileName[0] == '.' && d.cFileName[1] == '.' && d.cFileName[2] == 0 { + return + } + + temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) + path := concatenate({base_path, `\`, win32_wstring_to_utf8(cstring16(raw_data(d.cFileName[:])), temp_allocator) or_else ""}, allocator) or_return + + handle := win32.HANDLE(_open_internal(path, {.Read}, Permissions_Read_Write_All) or_else 0) + defer win32.CloseHandle(handle) + + fi.fullpath = path + fi.name = basename(path) + fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) + + fi.type, fi.mode = _file_type_mode_from_file_attributes(d.dwFileAttributes, handle, d.dwReserved0) + + fi.creation_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftCreationTime)) + fi.modification_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastWriteTime)) + fi.access_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastAccessTime)) + + if file_id_info: win32.FILE_ID_INFO; handle != nil && win32.GetFileInformationByHandleEx(handle, .FileIdInfo, &file_id_info, size_of(file_id_info)) { + #assert(size_of(fi.inode) == size_of(file_id_info.FileId)) + #assert(size_of(fi.inode) == 16) + runtime.mem_copy_non_overlapping(&fi.inode, &file_id_info.FileId, 16) + } + + return +} + +Read_Directory_Iterator_Impl :: struct { + find_data: win32.WIN32_FIND_DATAW, + find_handle: win32.HANDLE, + path: string, + prev_fi: File_Info, + no_more_files: bool, +} + @(require_results) -read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []File_Info, err: Error) { - @(require_results) - find_data_to_file_info :: proc(base_path: string, d: ^win32.WIN32_FIND_DATAW) -> (fi: File_Info) { - // Ignore "." and ".." - if d.cFileName[0] == '.' && d.cFileName[1] == 0 { +_read_directory_iterator :: proc(it: ^Read_Directory_Iterator) -> (fi: File_Info, index: int, ok: bool) { + for !it.impl.no_more_files { + err: Error + file_info_delete(it.impl.prev_fi, file_allocator()) + it.impl.prev_fi = {} + + fi, err = find_data_to_file_info(it.impl.path, &it.impl.find_data, file_allocator()) + if err != nil { + read_directory_iterator_set_error(it, it.impl.path, err) return } - if d.cFileName[0] == '.' && d.cFileName[1] == '.' && d.cFileName[2] == 0 { - return - } - path := strings.concatenate({base_path, `\`, win32.utf16_to_utf8(d.cFileName[:]) or_else ""}) - fi.fullpath = path - fi.name = basename(path) - fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) - if d.dwFileAttributes & win32.FILE_ATTRIBUTE_READONLY != 0 { - fi.mode |= 0o444 - } else { - fi.mode |= 0o666 + if fi.name != "" { + it.impl.prev_fi = fi + ok = true + index = it.index + it.index += 1 } - is_sym := false - if d.dwFileAttributes & win32.FILE_ATTRIBUTE_REPARSE_Point == 0 { - is_sym = false - } else { - is_sym = d.dwReserved0 == win32.IO_REPARSE_TAG_SYMLINK || d.dwReserved0 == win32.IO_REPARSE_TAG_MOUNT_POINT - } - - if is_sym { - fi.mode |= File_Mode_Sym_Link - } else { - if d.dwFileAttributes & win32.FILE_ATTRIBUTE_DIRECTORY != 0 { - fi.mode |= 0o111 | File_Mode_Dir + if !win32.FindNextFileW(it.impl.find_handle, &it.impl.find_data) { + e := _get_platform_error() + if pe, _ := is_platform_error(e); pe != i32(win32.ERROR_NO_MORE_FILES) { + read_directory_iterator_set_error(it, it.impl.path, e) } - - // fi.mode |= file_type_mode(h); + it.impl.no_more_files = true } + if ok { + return + } + } + return +} - windows_set_file_info_times(&fi, d) +_read_directory_iterator_init :: proc(it: ^Read_Directory_Iterator, f: ^File) { + it.impl.no_more_files = false - fi.is_dir = fi.mode & File_Mode_Dir != 0 + if f == nil || f.impl == nil { + read_directory_iterator_set_error(it, "", .Invalid_File) return } - if fd == 0 { - return nil, ERROR_INVALID_HANDLE + it.f = f + impl := (^File_Impl)(f.impl) + + // NOTE: Allow calling `init` to target a new directory with the same iterator - reset idx. + if it.impl.find_handle != nil { + win32.FindClose(it.impl.find_handle) + } + if it.impl.path != "" { + delete(it.impl.path, file_allocator()) } - context.allocator = allocator - - h := win32.HANDLE(fd) - - dir_fi, _ := file_info_from_get_file_information_by_handle("", h) - if !dir_fi.is_dir { - return nil, .Not_Dir - } - - n := n - size := n - if n <= 0 { - n = -1 - size = 100 - } - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) - - wpath := cleanpath_from_handle_u16(fd, context.temp_allocator) or_return - if len(wpath) == 0 { + if !is_directory(impl.name) { + read_directory_iterator_set_error(it, impl.name, .Invalid_Dir) return } - dfi := make([dynamic]File_Info, 0, size) or_return + wpath := string16(impl.wname) + temp_allocator := TEMP_ALLOCATOR_GUARD({}) - wpath_search := make([]u16, len(wpath)+3, context.temp_allocator) or_return + wpath_search := make([]u16, len(wpath)+3, temp_allocator) copy(wpath_search, wpath) wpath_search[len(wpath)+0] = '\\' wpath_search[len(wpath)+1] = '*' wpath_search[len(wpath)+2] = 0 - path := cleanpath_from_buf(wpath) - defer delete(path) - - find_data := &win32.WIN32_FIND_DATAW{} - find_handle := win32.FindFirstFileW(cstring16(raw_data(wpath_search)), find_data) - if find_handle == win32.INVALID_HANDLE_VALUE { - err = get_last_error() - return dfi[:], err + it.impl.find_handle = win32.FindFirstFileW(cstring16(raw_data(wpath_search)), &it.impl.find_data) + if it.impl.find_handle == win32.INVALID_HANDLE_VALUE { + read_directory_iterator_set_error(it, impl.name, _get_platform_error()) + return } - defer win32.FindClose(find_handle) - for n != 0 { - fi: File_Info - fi = find_data_to_file_info(path, find_data) - if fi.name != "" { - append(&dfi, fi) - n -= 1 - } - - if !win32.FindNextFileW(find_handle, find_data) { - e := get_last_error() - if e == ERROR_NO_MORE_FILES { - break - } - return dfi[:], e - } + defer if it.err.err != nil { + win32.FindClose(it.impl.find_handle) } - return dfi[:], nil + err: Error + it.impl.path, err = _cleanpath_from_buf(wpath, file_allocator()) + if err != nil { + read_directory_iterator_set_error(it, impl.name, err) + } + + return +} + +_read_directory_iterator_destroy :: proc(it: ^Read_Directory_Iterator) { + if it.f == nil { + return + } + file_info_delete(it.impl.prev_fi, file_allocator()) + delete(it.impl.path, file_allocator()) + win32.FindClose(it.impl.find_handle) } diff --git a/core/os/os2/doc.odin b/core/os/doc.odin similarity index 100% rename from core/os/os2/doc.odin rename to core/os/doc.odin diff --git a/core/os/os2/env.odin b/core/os/env.odin similarity index 100% rename from core/os/os2/env.odin rename to core/os/env.odin diff --git a/core/os/os2/env_js.odin b/core/os/env_js.odin similarity index 100% rename from core/os/os2/env_js.odin rename to core/os/env_js.odin diff --git a/core/os/os2/env_linux.odin b/core/os/env_linux.odin similarity index 100% rename from core/os/os2/env_linux.odin rename to core/os/env_linux.odin diff --git a/core/os/os2/env_posix.odin b/core/os/env_posix.odin similarity index 100% rename from core/os/os2/env_posix.odin rename to core/os/env_posix.odin diff --git a/core/os/os2/env_wasi.odin b/core/os/env_wasi.odin similarity index 100% rename from core/os/os2/env_wasi.odin rename to core/os/env_wasi.odin diff --git a/core/os/env_windows.odin b/core/os/env_windows.odin index ef658b0a1..d389f8860 100644 --- a/core/os/env_windows.odin +++ b/core/os/env_windows.odin @@ -1,30 +1,37 @@ -package os +#+private +package os2 import win32 "core:sys/windows" import "base:runtime" -// lookup_env gets the value of the environment variable named by the key -// If the variable is found in the environment the value (which can be empty) is returned and the boolean is true -// Otherwise the returned value will be empty and the boolean will be false -// NOTE: the value will be allocated with the supplied allocator -@(require_results) -lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) { +_lookup_env_alloc :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) { if key == "" { return } - wkey := win32.utf8_to_wstring(key) - n := win32.GetEnvironmentVariableW(wkey, nil, 0) - if n == 0 && get_last_error() == ERROR_ENVVAR_NOT_FOUND { - return "", false - } - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) + temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) + wkey, _ := win32_utf8_to_wstring(key, temp_allocator) + + n := win32.GetEnvironmentVariableW(wkey, nil, 0) + if n == 0 { + err := win32.GetLastError() + if err == win32.ERROR_ENVVAR_NOT_FOUND { + return "", false + } + return "", true + } + + b := make([]u16, n+1, temp_allocator) - b, _ := make([dynamic]u16, n, context.temp_allocator) n = win32.GetEnvironmentVariableW(wkey, raw_data(b), u32(len(b))) - if n == 0 && get_last_error() == ERROR_ENVVAR_NOT_FOUND { + if n == 0 { + err := win32.GetLastError() + if err == win32.ERROR_ENVVAR_NOT_FOUND { + return "", false + } return "", false } - value, _ = win32.utf16_to_utf8(b[:n], allocator) + + value = win32_utf16_to_utf8(string16(b[:n]), allocator) or_else "" found = true return } @@ -33,7 +40,7 @@ lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: // Note that it is limited to environment names and values of 512 utf-16 values each // due to the necessary utf-8 <> utf-16 conversion. @(require_results) -lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) { +_lookup_env_buf :: proc(buf: []u8, key: string) -> (value: string, err: Error) { key_buf: [513]u16 wkey := win32.utf8_to_wstring(key_buf[:], key) if wkey == nil { @@ -57,78 +64,28 @@ lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) return value, nil } -lookup_env :: proc{lookup_env_alloc, lookup_env_buffer} +_lookup_env :: proc{_lookup_env_alloc, _lookup_env_buf} -// get_env retrieves the value of the environment variable named by the key -// It returns the value, which will be empty if the variable is not present -// To distinguish between an empty value and an unset value, use lookup_env -// NOTE: the value will be allocated with the supplied allocator -@(require_results) -get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) { - value, _ = lookup_env(key, allocator) - return -} - -@(require_results) -get_env_buf :: proc(buf: []u8, key: string) -> (value: string) { - value, _ = lookup_env(buf, key) - return -} -get_env :: proc{get_env_alloc, get_env_buf} - - -// set_env sets the value of the environment variable named by the key -set_env :: proc(key, value: string) -> Error { - k := win32.utf8_to_wstring(key) - v := win32.utf8_to_wstring(value) +_set_env :: proc(key, value: string) -> Error { + temp_allocator := TEMP_ALLOCATOR_GUARD({}) + k := win32_utf8_to_wstring(key, temp_allocator) or_return + v := win32_utf8_to_wstring(value, temp_allocator) or_return if !win32.SetEnvironmentVariableW(k, v) { - return get_last_error() + return _get_platform_error() } return nil } -// unset_env unsets a single environment variable -unset_env :: proc(key: string) -> Error { - k := win32.utf8_to_wstring(key) - if !win32.SetEnvironmentVariableW(k, nil) { - return get_last_error() - } - return nil +_unset_env :: proc(key: string) -> bool { + temp_allocator := TEMP_ALLOCATOR_GUARD({}) + k, _ := win32_utf8_to_wstring(key, temp_allocator) + return bool(win32.SetEnvironmentVariableW(k, nil)) } -// environ returns a copy of strings representing the environment, in the form "key=value" -// NOTE: the slice of strings and the strings with be allocated using the supplied allocator -@(require_results) -environ :: proc(allocator := context.allocator) -> []string { - envs := ([^]win32.WCHAR)(win32.GetEnvironmentStringsW()) - if envs == nil { - return nil - } - defer win32.FreeEnvironmentStringsW(envs) - - r, err := make([dynamic]string, 0, 50, allocator) - if err != nil { - return nil - } - for from, i := 0, 0; true; i += 1 { - if c := envs[i]; c == 0 { - if i <= from { - break - } - append(&r, win32.utf16_to_utf8(envs[from:i], allocator) or_else "") - from = i + 1 - } - } - - return r[:] -} - - -// clear_env deletes all environment variables -clear_env :: proc() { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - envs := environ(context.temp_allocator) +_clear_env :: proc() { + temp_allocator := TEMP_ALLOCATOR_GUARD({}) + envs, _ := environ(temp_allocator) for env in envs { for j in 1.. string where intrinsics.type_is_enum(Platform_Error) { - if e == nil { - return "" - } - when ODIN_OS == .Darwin { - if s := string(_darwin_string_error(i32(e))); s != "" { - return s - } - } - - when ODIN_OS != .Linux { - @(require_results) - binary_search :: proc "contextless" (array: $A/[]$T, key: T) -> (index: int, found: bool) #no_bounds_check { - n := len(array) - left, right := 0, n - for left < right { - mid := int(uint(left+right) >> 1) - if array[mid] < key { - left = mid+1 - } else { - // equal or greater - right = mid - } - } - return left, left < n && array[left] == key - } - - err := runtime.Type_Info_Enum_Value(e) - - ti := &runtime.type_info_base(type_info_of(Platform_Error)).variant.(runtime.Type_Info_Enum) - if idx, ok := binary_search(ti.values, err); ok { - return ti.names[idx] - } - } else { - @(rodata, static) - pe_strings := [Platform_Error]string{ - .NONE = "", - .EPERM = "Operation not permitted", - .ENOENT = "No such file or directory", - .ESRCH = "No such process", - .EINTR = "Interrupted system call", - .EIO = "Input/output error", - .ENXIO = "No such device or address", - .E2BIG = "Argument list too long", - .ENOEXEC = "Exec format error", - .EBADF = "Bad file descriptor", - .ECHILD = "No child processes", - .EAGAIN = "Resource temporarily unavailable", - .ENOMEM = "Cannot allocate memory", - .EACCES = "Permission denied", - .EFAULT = "Bad address", - .ENOTBLK = "Block device required", - .EBUSY = "Device or resource busy", - .EEXIST = "File exists", - .EXDEV = "Invalid cross-device link", - .ENODEV = "No such device", - .ENOTDIR = "Not a directory", - .EISDIR = "Is a directory", - .EINVAL = "Invalid argument", - .ENFILE = "Too many open files in system", - .EMFILE = "Too many open files", - .ENOTTY = "Inappropriate ioctl for device", - .ETXTBSY = "Text file busy", - .EFBIG = "File too large", - .ENOSPC = "No space left on device", - .ESPIPE = "Illegal seek", - .EROFS = "Read-only file system", - .EMLINK = "Too many links", - .EPIPE = "Broken pipe", - .EDOM = "Numerical argument out of domain", - .ERANGE = "Numerical result out of range", - .EDEADLK = "Resource deadlock avoided", - .ENAMETOOLONG = "File name too long", - .ENOLCK = "No locks available", - .ENOSYS = "Function not implemented", - .ENOTEMPTY = "Directory not empty", - .ELOOP = "Too many levels of symbolic links", - .EUNKNOWN_41 = "Unknown Error (41)", - .ENOMSG = "No message of desired type", - .EIDRM = "Identifier removed", - .ECHRNG = "Channel number out of range", - .EL2NSYNC = "Level 2 not synchronized", - .EL3HLT = "Level 3 halted", - .EL3RST = "Level 3 reset", - .ELNRNG = "Link number out of range", - .EUNATCH = "Protocol driver not attached", - .ENOCSI = "No CSI structure available", - .EL2HLT = "Level 2 halted", - .EBADE = "Invalid exchange", - .EBADR = "Invalid request descriptor", - .EXFULL = "Exchange full", - .ENOANO = "No anode", - .EBADRQC = "Invalid request code", - .EBADSLT = "Invalid slot", - .EUNKNOWN_58 = "Unknown Error (58)", - .EBFONT = "Bad font file format", - .ENOSTR = "Device not a stream", - .ENODATA = "No data available", - .ETIME = "Timer expired", - .ENOSR = "Out of streams resources", - .ENONET = "Machine is not on the network", - .ENOPKG = "Package not installed", - .EREMOTE = "Object is remote", - .ENOLINK = "Link has been severed", - .EADV = "Advertise error", - .ESRMNT = "Srmount error", - .ECOMM = "Communication error on send", - .EPROTO = "Protocol error", - .EMULTIHOP = "Multihop attempted", - .EDOTDOT = "RFS specific error", - .EBADMSG = "Bad message", - .EOVERFLOW = "Value too large for defined data type", - .ENOTUNIQ = "Name not unique on network", - .EBADFD = "File descriptor in bad state", - .EREMCHG = "Remote address changed", - .ELIBACC = "Can not access a needed shared library", - .ELIBBAD = "Accessing a corrupted shared library", - .ELIBSCN = ".lib section in a.out corrupted", - .ELIBMAX = "Attempting to link in too many shared libraries", - .ELIBEXEC = "Cannot exec a shared library directly", - .EILSEQ = "Invalid or incomplete multibyte or wide character", - .ERESTART = "Interrupted system call should be restarted", - .ESTRPIPE = "Streams pipe error", - .EUSERS = "Too many users", - .ENOTSOCK = "Socket operation on non-socket", - .EDESTADDRREQ = "Destination address required", - .EMSGSIZE = "Message too long", - .EPROTOTYPE = "Protocol wrong type for socket", - .ENOPROTOOPT = "Protocol not available", - .EPROTONOSUPPORT = "Protocol not supported", - .ESOCKTNOSUPPORT = "Socket type not supported", - .EOPNOTSUPP = "Operation not supported", - .EPFNOSUPPORT = "Protocol family not supported", - .EAFNOSUPPORT = "Address family not supported by protocol", - .EADDRINUSE = "Address already in use", - .EADDRNOTAVAIL = "Cannot assign requested address", - .ENETDOWN = "Network is down", - .ENETUNREACH = "Network is unreachable", - .ENETRESET = "Network dropped connection on reset", - .ECONNABORTED = "Software caused connection abort", - .ECONNRESET = "Connection reset by peer", - .ENOBUFS = "No buffer space available", - .EISCONN = "Transport endpoint is already connected", - .ENOTCONN = "Transport endpoint is not connected", - .ESHUTDOWN = "Cannot send after transport endpoint shutdown", - .ETOOMANYREFS = "Too many references: cannot splice", - .ETIMEDOUT = "Connection timed out", - .ECONNREFUSED = "Connection refused", - .EHOSTDOWN = "Host is down", - .EHOSTUNREACH = "No route to host", - .EALREADY = "Operation already in progress", - .EINPROGRESS = "Operation now in progress", - .ESTALE = "Stale file handle", - .EUCLEAN = "Structure needs cleaning", - .ENOTNAM = "Not a XENIX named type file", - .ENAVAIL = "No XENIX semaphores available", - .EISNAM = "Is a named type file", - .EREMOTEIO = "Remote I/O error", - .EDQUOT = "Disk quota exceeded", - .ENOMEDIUM = "No medium found", - .EMEDIUMTYPE = "Wrong medium type", - .ECANCELED = "Operation canceled", - .ENOKEY = "Required key not available", - .EKEYEXPIRED = "Key has expired", - .EKEYREVOKED = "Key has been revoked", - .EKEYREJECTED = "Key was rejected by service", - .EOWNERDEAD = "Owner died", - .ENOTRECOVERABLE = "State not recoverable", - .ERFKILL = "Operation not possible due to RF-kill", - .EHWPOISON = "Memory page has hardware error", - } - if Platform_Error.NONE <= e && e <= max(Platform_Error) { - return pe_strings[e] - } - } - return "" -} - -@(private, require_results) +// Attempts to convert an `Error` `ferr` into an `io.Error` +@(private) error_to_io_error :: proc(ferr: Error) -> io.Error { if ferr == nil { return .None diff --git a/core/os/os2/errors_js.odin b/core/os/errors_js.odin similarity index 100% rename from core/os/os2/errors_js.odin rename to core/os/errors_js.odin diff --git a/core/os/os2/errors_linux.odin b/core/os/errors_linux.odin similarity index 100% rename from core/os/os2/errors_linux.odin rename to core/os/errors_linux.odin diff --git a/core/os/os2/errors_posix.odin b/core/os/errors_posix.odin similarity index 100% rename from core/os/os2/errors_posix.odin rename to core/os/errors_posix.odin diff --git a/core/os/os2/errors_wasi.odin b/core/os/errors_wasi.odin similarity index 100% rename from core/os/os2/errors_wasi.odin rename to core/os/errors_wasi.odin diff --git a/core/os/os2/errors_windows.odin b/core/os/errors_windows.odin similarity index 100% rename from core/os/os2/errors_windows.odin rename to core/os/errors_windows.odin diff --git a/core/os/os2/file.odin b/core/os/file.odin similarity index 100% rename from core/os/os2/file.odin rename to core/os/file.odin diff --git a/core/os/os2/file_js.odin b/core/os/file_js.odin similarity index 100% rename from core/os/os2/file_js.odin rename to core/os/file_js.odin diff --git a/core/os/os2/file_linux.odin b/core/os/file_linux.odin similarity index 100% rename from core/os/os2/file_linux.odin rename to core/os/file_linux.odin diff --git a/core/os/os2/file_posix.odin b/core/os/file_posix.odin similarity index 100% rename from core/os/os2/file_posix.odin rename to core/os/file_posix.odin diff --git a/core/os/os2/file_posix_darwin.odin b/core/os/file_posix_darwin.odin similarity index 100% rename from core/os/os2/file_posix_darwin.odin rename to core/os/file_posix_darwin.odin diff --git a/core/os/os2/file_posix_freebsd.odin b/core/os/file_posix_freebsd.odin similarity index 100% rename from core/os/os2/file_posix_freebsd.odin rename to core/os/file_posix_freebsd.odin diff --git a/core/os/os2/file_posix_netbsd.odin b/core/os/file_posix_netbsd.odin similarity index 100% rename from core/os/os2/file_posix_netbsd.odin rename to core/os/file_posix_netbsd.odin diff --git a/core/os/os2/file_posix_other.odin b/core/os/file_posix_other.odin similarity index 100% rename from core/os/os2/file_posix_other.odin rename to core/os/file_posix_other.odin diff --git a/core/os/os2/file_stream.odin b/core/os/file_stream.odin similarity index 100% rename from core/os/os2/file_stream.odin rename to core/os/file_stream.odin diff --git a/core/os/os2/file_util.odin b/core/os/file_util.odin similarity index 100% rename from core/os/os2/file_util.odin rename to core/os/file_util.odin diff --git a/core/os/os2/file_wasi.odin b/core/os/file_wasi.odin similarity index 100% rename from core/os/os2/file_wasi.odin rename to core/os/file_wasi.odin diff --git a/core/os/os2/file_windows.odin b/core/os/file_windows.odin similarity index 100% rename from core/os/os2/file_windows.odin rename to core/os/file_windows.odin diff --git a/core/os/os2/heap.odin b/core/os/heap.odin similarity index 100% rename from core/os/os2/heap.odin rename to core/os/heap.odin diff --git a/core/os/os2/heap_js.odin b/core/os/heap_js.odin similarity index 100% rename from core/os/os2/heap_js.odin rename to core/os/heap_js.odin diff --git a/core/os/os2/heap_linux.odin b/core/os/heap_linux.odin similarity index 100% rename from core/os/os2/heap_linux.odin rename to core/os/heap_linux.odin diff --git a/core/os/os2/heap_posix.odin b/core/os/heap_posix.odin similarity index 100% rename from core/os/os2/heap_posix.odin rename to core/os/heap_posix.odin diff --git a/core/os/os2/heap_wasi.odin b/core/os/heap_wasi.odin similarity index 100% rename from core/os/os2/heap_wasi.odin rename to core/os/heap_wasi.odin diff --git a/core/os/os2/heap_windows.odin b/core/os/heap_windows.odin similarity index 100% rename from core/os/os2/heap_windows.odin rename to core/os/heap_windows.odin diff --git a/core/os/os2/internal_util.odin b/core/os/internal_util.odin similarity index 100% rename from core/os/os2/internal_util.odin rename to core/os/internal_util.odin diff --git a/core/os/dir_unix.odin b/core/os/old/dir_unix.odin similarity index 100% rename from core/os/dir_unix.odin rename to core/os/old/dir_unix.odin diff --git a/core/os/old/dir_windows.odin b/core/os/old/dir_windows.odin new file mode 100644 index 000000000..40f4b9e9b --- /dev/null +++ b/core/os/old/dir_windows.odin @@ -0,0 +1,114 @@ +package os + +import win32 "core:sys/windows" +import "core:strings" +import "base:runtime" + +@(require_results) +read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []File_Info, err: Error) { + @(require_results) + find_data_to_file_info :: proc(base_path: string, d: ^win32.WIN32_FIND_DATAW) -> (fi: File_Info) { + // Ignore "." and ".." + if d.cFileName[0] == '.' && d.cFileName[1] == 0 { + return + } + if d.cFileName[0] == '.' && d.cFileName[1] == '.' && d.cFileName[2] == 0 { + return + } + path := strings.concatenate({base_path, `\`, win32.utf16_to_utf8(d.cFileName[:]) or_else ""}) + fi.fullpath = path + fi.name = basename(path) + fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) + + if d.dwFileAttributes & win32.FILE_ATTRIBUTE_READONLY != 0 { + fi.mode |= 0o444 + } else { + fi.mode |= 0o666 + } + + is_sym := false + if d.dwFileAttributes & win32.FILE_ATTRIBUTE_REPARSE_Point == 0 { + is_sym = false + } else { + is_sym = d.dwReserved0 == win32.IO_REPARSE_TAG_SYMLINK || d.dwReserved0 == win32.IO_REPARSE_TAG_MOUNT_POINT + } + + if is_sym { + fi.mode |= File_Mode_Sym_Link + } else { + if d.dwFileAttributes & win32.FILE_ATTRIBUTE_DIRECTORY != 0 { + fi.mode |= 0o111 | File_Mode_Dir + } + + // fi.mode |= file_type_mode(h); + } + + windows_set_file_info_times(&fi, d) + + fi.is_dir = fi.mode & File_Mode_Dir != 0 + return + } + + if fd == 0 { + return nil, ERROR_INVALID_HANDLE + } + + context.allocator = allocator + + h := win32.HANDLE(fd) + + dir_fi, _ := file_info_from_get_file_information_by_handle("", h) + if !dir_fi.is_dir { + return nil, .Not_Dir + } + + n := n + size := n + if n <= 0 { + n = -1 + size = 100 + } + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) + + wpath := cleanpath_from_handle_u16(fd, context.temp_allocator) or_return + if len(wpath) == 0 { + return + } + + dfi := make([dynamic]File_Info, 0, size) or_return + + wpath_search := make([]u16, len(wpath)+3, context.temp_allocator) or_return + copy(wpath_search, wpath) + wpath_search[len(wpath)+0] = '\\' + wpath_search[len(wpath)+1] = '*' + wpath_search[len(wpath)+2] = 0 + + path := cleanpath_from_buf(wpath) + defer delete(path) + + find_data := &win32.WIN32_FIND_DATAW{} + find_handle := win32.FindFirstFileW(cstring16(raw_data(wpath_search)), find_data) + if find_handle == win32.INVALID_HANDLE_VALUE { + err = get_last_error() + return dfi[:], err + } + defer win32.FindClose(find_handle) + for n != 0 { + fi: File_Info + fi = find_data_to_file_info(path, find_data) + if fi.name != "" { + append(&dfi, fi) + n -= 1 + } + + if !win32.FindNextFileW(find_handle, find_data) { + e := get_last_error() + if e == ERROR_NO_MORE_FILES { + break + } + return dfi[:], e + } + } + + return dfi[:], nil +} diff --git a/core/os/old/env_windows.odin b/core/os/old/env_windows.odin new file mode 100644 index 000000000..ef658b0a1 --- /dev/null +++ b/core/os/old/env_windows.odin @@ -0,0 +1,140 @@ +package os + +import win32 "core:sys/windows" +import "base:runtime" + +// lookup_env gets the value of the environment variable named by the key +// If the variable is found in the environment the value (which can be empty) is returned and the boolean is true +// Otherwise the returned value will be empty and the boolean will be false +// NOTE: the value will be allocated with the supplied allocator +@(require_results) +lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) { + if key == "" { + return + } + wkey := win32.utf8_to_wstring(key) + n := win32.GetEnvironmentVariableW(wkey, nil, 0) + if n == 0 && get_last_error() == ERROR_ENVVAR_NOT_FOUND { + return "", false + } + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) + + b, _ := make([dynamic]u16, n, context.temp_allocator) + n = win32.GetEnvironmentVariableW(wkey, raw_data(b), u32(len(b))) + if n == 0 && get_last_error() == ERROR_ENVVAR_NOT_FOUND { + return "", false + } + value, _ = win32.utf16_to_utf8(b[:n], allocator) + found = true + return +} + +// This version of `lookup_env` doesn't allocate and instead requires the user to provide a buffer. +// Note that it is limited to environment names and values of 512 utf-16 values each +// due to the necessary utf-8 <> utf-16 conversion. +@(require_results) +lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) { + key_buf: [513]u16 + wkey := win32.utf8_to_wstring(key_buf[:], key) + if wkey == nil { + return "", .Buffer_Full + } + + n2 := win32.GetEnvironmentVariableW(wkey, nil, 0) + if n2 == 0 { + return "", .Env_Var_Not_Found + } + + val_buf: [513]u16 + n2 = win32.GetEnvironmentVariableW(wkey, raw_data(val_buf[:]), u32(len(val_buf[:]))) + if n2 == 0 { + return "", .Env_Var_Not_Found + } else if int(n2) > len(buf) { + return "", .Buffer_Full + } + + value = win32.utf16_to_utf8(buf, val_buf[:n2]) + + return value, nil +} +lookup_env :: proc{lookup_env_alloc, lookup_env_buffer} + +// get_env retrieves the value of the environment variable named by the key +// It returns the value, which will be empty if the variable is not present +// To distinguish between an empty value and an unset value, use lookup_env +// NOTE: the value will be allocated with the supplied allocator +@(require_results) +get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) { + value, _ = lookup_env(key, allocator) + return +} + +@(require_results) +get_env_buf :: proc(buf: []u8, key: string) -> (value: string) { + value, _ = lookup_env(buf, key) + return +} +get_env :: proc{get_env_alloc, get_env_buf} + + +// set_env sets the value of the environment variable named by the key +set_env :: proc(key, value: string) -> Error { + k := win32.utf8_to_wstring(key) + v := win32.utf8_to_wstring(value) + + if !win32.SetEnvironmentVariableW(k, v) { + return get_last_error() + } + return nil +} + +// unset_env unsets a single environment variable +unset_env :: proc(key: string) -> Error { + k := win32.utf8_to_wstring(key) + if !win32.SetEnvironmentVariableW(k, nil) { + return get_last_error() + } + return nil +} + +// environ returns a copy of strings representing the environment, in the form "key=value" +// NOTE: the slice of strings and the strings with be allocated using the supplied allocator +@(require_results) +environ :: proc(allocator := context.allocator) -> []string { + envs := ([^]win32.WCHAR)(win32.GetEnvironmentStringsW()) + if envs == nil { + return nil + } + defer win32.FreeEnvironmentStringsW(envs) + + r, err := make([dynamic]string, 0, 50, allocator) + if err != nil { + return nil + } + for from, i := 0, 0; true; i += 1 { + if c := envs[i]; c == 0 { + if i <= from { + break + } + append(&r, win32.utf16_to_utf8(envs[from:i], allocator) or_else "") + from = i + 1 + } + } + + return r[:] +} + + +// clear_env deletes all environment variables +clear_env :: proc() { + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() + envs := environ(context.temp_allocator) + for env in envs { + for j in 1.. string where intrinsics.type_is_enum(Platform_Error) { + if e == nil { + return "" + } + + when ODIN_OS == .Darwin { + if s := string(_darwin_string_error(i32(e))); s != "" { + return s + } + } + + when ODIN_OS != .Linux { + @(require_results) + binary_search :: proc "contextless" (array: $A/[]$T, key: T) -> (index: int, found: bool) #no_bounds_check { + n := len(array) + left, right := 0, n + for left < right { + mid := int(uint(left+right) >> 1) + if array[mid] < key { + left = mid+1 + } else { + // equal or greater + right = mid + } + } + return left, left < n && array[left] == key + } + + err := runtime.Type_Info_Enum_Value(e) + + ti := &runtime.type_info_base(type_info_of(Platform_Error)).variant.(runtime.Type_Info_Enum) + if idx, ok := binary_search(ti.values, err); ok { + return ti.names[idx] + } + } else { + @(rodata, static) + pe_strings := [Platform_Error]string{ + .NONE = "", + .EPERM = "Operation not permitted", + .ENOENT = "No such file or directory", + .ESRCH = "No such process", + .EINTR = "Interrupted system call", + .EIO = "Input/output error", + .ENXIO = "No such device or address", + .E2BIG = "Argument list too long", + .ENOEXEC = "Exec format error", + .EBADF = "Bad file descriptor", + .ECHILD = "No child processes", + .EAGAIN = "Resource temporarily unavailable", + .ENOMEM = "Cannot allocate memory", + .EACCES = "Permission denied", + .EFAULT = "Bad address", + .ENOTBLK = "Block device required", + .EBUSY = "Device or resource busy", + .EEXIST = "File exists", + .EXDEV = "Invalid cross-device link", + .ENODEV = "No such device", + .ENOTDIR = "Not a directory", + .EISDIR = "Is a directory", + .EINVAL = "Invalid argument", + .ENFILE = "Too many open files in system", + .EMFILE = "Too many open files", + .ENOTTY = "Inappropriate ioctl for device", + .ETXTBSY = "Text file busy", + .EFBIG = "File too large", + .ENOSPC = "No space left on device", + .ESPIPE = "Illegal seek", + .EROFS = "Read-only file system", + .EMLINK = "Too many links", + .EPIPE = "Broken pipe", + .EDOM = "Numerical argument out of domain", + .ERANGE = "Numerical result out of range", + .EDEADLK = "Resource deadlock avoided", + .ENAMETOOLONG = "File name too long", + .ENOLCK = "No locks available", + .ENOSYS = "Function not implemented", + .ENOTEMPTY = "Directory not empty", + .ELOOP = "Too many levels of symbolic links", + .EUNKNOWN_41 = "Unknown Error (41)", + .ENOMSG = "No message of desired type", + .EIDRM = "Identifier removed", + .ECHRNG = "Channel number out of range", + .EL2NSYNC = "Level 2 not synchronized", + .EL3HLT = "Level 3 halted", + .EL3RST = "Level 3 reset", + .ELNRNG = "Link number out of range", + .EUNATCH = "Protocol driver not attached", + .ENOCSI = "No CSI structure available", + .EL2HLT = "Level 2 halted", + .EBADE = "Invalid exchange", + .EBADR = "Invalid request descriptor", + .EXFULL = "Exchange full", + .ENOANO = "No anode", + .EBADRQC = "Invalid request code", + .EBADSLT = "Invalid slot", + .EUNKNOWN_58 = "Unknown Error (58)", + .EBFONT = "Bad font file format", + .ENOSTR = "Device not a stream", + .ENODATA = "No data available", + .ETIME = "Timer expired", + .ENOSR = "Out of streams resources", + .ENONET = "Machine is not on the network", + .ENOPKG = "Package not installed", + .EREMOTE = "Object is remote", + .ENOLINK = "Link has been severed", + .EADV = "Advertise error", + .ESRMNT = "Srmount error", + .ECOMM = "Communication error on send", + .EPROTO = "Protocol error", + .EMULTIHOP = "Multihop attempted", + .EDOTDOT = "RFS specific error", + .EBADMSG = "Bad message", + .EOVERFLOW = "Value too large for defined data type", + .ENOTUNIQ = "Name not unique on network", + .EBADFD = "File descriptor in bad state", + .EREMCHG = "Remote address changed", + .ELIBACC = "Can not access a needed shared library", + .ELIBBAD = "Accessing a corrupted shared library", + .ELIBSCN = ".lib section in a.out corrupted", + .ELIBMAX = "Attempting to link in too many shared libraries", + .ELIBEXEC = "Cannot exec a shared library directly", + .EILSEQ = "Invalid or incomplete multibyte or wide character", + .ERESTART = "Interrupted system call should be restarted", + .ESTRPIPE = "Streams pipe error", + .EUSERS = "Too many users", + .ENOTSOCK = "Socket operation on non-socket", + .EDESTADDRREQ = "Destination address required", + .EMSGSIZE = "Message too long", + .EPROTOTYPE = "Protocol wrong type for socket", + .ENOPROTOOPT = "Protocol not available", + .EPROTONOSUPPORT = "Protocol not supported", + .ESOCKTNOSUPPORT = "Socket type not supported", + .EOPNOTSUPP = "Operation not supported", + .EPFNOSUPPORT = "Protocol family not supported", + .EAFNOSUPPORT = "Address family not supported by protocol", + .EADDRINUSE = "Address already in use", + .EADDRNOTAVAIL = "Cannot assign requested address", + .ENETDOWN = "Network is down", + .ENETUNREACH = "Network is unreachable", + .ENETRESET = "Network dropped connection on reset", + .ECONNABORTED = "Software caused connection abort", + .ECONNRESET = "Connection reset by peer", + .ENOBUFS = "No buffer space available", + .EISCONN = "Transport endpoint is already connected", + .ENOTCONN = "Transport endpoint is not connected", + .ESHUTDOWN = "Cannot send after transport endpoint shutdown", + .ETOOMANYREFS = "Too many references: cannot splice", + .ETIMEDOUT = "Connection timed out", + .ECONNREFUSED = "Connection refused", + .EHOSTDOWN = "Host is down", + .EHOSTUNREACH = "No route to host", + .EALREADY = "Operation already in progress", + .EINPROGRESS = "Operation now in progress", + .ESTALE = "Stale file handle", + .EUCLEAN = "Structure needs cleaning", + .ENOTNAM = "Not a XENIX named type file", + .ENAVAIL = "No XENIX semaphores available", + .EISNAM = "Is a named type file", + .EREMOTEIO = "Remote I/O error", + .EDQUOT = "Disk quota exceeded", + .ENOMEDIUM = "No medium found", + .EMEDIUMTYPE = "Wrong medium type", + .ECANCELED = "Operation canceled", + .ENOKEY = "Required key not available", + .EKEYEXPIRED = "Key has expired", + .EKEYREVOKED = "Key has been revoked", + .EKEYREJECTED = "Key was rejected by service", + .EOWNERDEAD = "Owner died", + .ENOTRECOVERABLE = "State not recoverable", + .ERFKILL = "Operation not possible due to RF-kill", + .EHWPOISON = "Memory page has hardware error", + } + if Platform_Error.NONE <= e && e <= max(Platform_Error) { + return pe_strings[e] + } + } + return "" +} + +@(private, require_results) +error_to_io_error :: proc(ferr: Error) -> io.Error { + if ferr == nil { + return .None + } + return ferr.(io.Error) or_else .Unknown +} diff --git a/core/os/os.odin b/core/os/old/os.odin similarity index 100% rename from core/os/os.odin rename to core/os/old/os.odin diff --git a/core/os/os_darwin.odin b/core/os/old/os_darwin.odin similarity index 100% rename from core/os/os_darwin.odin rename to core/os/old/os_darwin.odin diff --git a/core/os/os_essence.odin b/core/os/old/os_essence.odin similarity index 100% rename from core/os/os_essence.odin rename to core/os/old/os_essence.odin diff --git a/core/os/os_freebsd.odin b/core/os/old/os_freebsd.odin similarity index 100% rename from core/os/os_freebsd.odin rename to core/os/old/os_freebsd.odin diff --git a/core/os/os_freestanding.odin b/core/os/old/os_freestanding.odin similarity index 100% rename from core/os/os_freestanding.odin rename to core/os/old/os_freestanding.odin diff --git a/core/os/os_haiku.odin b/core/os/old/os_haiku.odin similarity index 100% rename from core/os/os_haiku.odin rename to core/os/old/os_haiku.odin diff --git a/core/os/os_js.odin b/core/os/old/os_js.odin similarity index 100% rename from core/os/os_js.odin rename to core/os/old/os_js.odin diff --git a/core/os/os_linux.odin b/core/os/old/os_linux.odin similarity index 100% rename from core/os/os_linux.odin rename to core/os/old/os_linux.odin diff --git a/core/os/os_netbsd.odin b/core/os/old/os_netbsd.odin similarity index 100% rename from core/os/os_netbsd.odin rename to core/os/old/os_netbsd.odin diff --git a/core/os/os_openbsd.odin b/core/os/old/os_openbsd.odin similarity index 100% rename from core/os/os_openbsd.odin rename to core/os/old/os_openbsd.odin diff --git a/core/os/os_wasi.odin b/core/os/old/os_wasi.odin similarity index 100% rename from core/os/os_wasi.odin rename to core/os/old/os_wasi.odin diff --git a/core/os/os_windows.odin b/core/os/old/os_windows.odin similarity index 100% rename from core/os/os_windows.odin rename to core/os/old/os_windows.odin diff --git a/core/os/old/stat.odin b/core/os/old/stat.odin new file mode 100644 index 000000000..21a4961d1 --- /dev/null +++ b/core/os/old/stat.odin @@ -0,0 +1,33 @@ +package os + +import "core:time" + +File_Info :: struct { + fullpath: string, // allocated + name: string, // uses `fullpath` as underlying data + size: i64, + mode: File_Mode, + is_dir: bool, + creation_time: time.Time, + modification_time: time.Time, + access_time: time.Time, +} + +file_info_slice_delete :: proc(infos: []File_Info, allocator := context.allocator) { + for i := len(infos)-1; i >= 0; i -= 1 { + file_info_delete(infos[i], allocator) + } + delete(infos, allocator) +} + +file_info_delete :: proc(fi: File_Info, allocator := context.allocator) { + delete(fi.fullpath, allocator) +} + +File_Mode :: distinct u32 + +File_Mode_Dir :: File_Mode(1<<16) +File_Mode_Named_Pipe :: File_Mode(1<<17) +File_Mode_Device :: File_Mode(1<<18) +File_Mode_Char_Device :: File_Mode(1<<19) +File_Mode_Sym_Link :: File_Mode(1<<20) diff --git a/core/os/stat_unix.odin b/core/os/old/stat_unix.odin similarity index 100% rename from core/os/stat_unix.odin rename to core/os/old/stat_unix.odin diff --git a/core/os/old/stat_windows.odin b/core/os/old/stat_windows.odin new file mode 100644 index 000000000..662c9f9e6 --- /dev/null +++ b/core/os/old/stat_windows.odin @@ -0,0 +1,303 @@ +package os + +import "core:time" +import "base:runtime" +import win32 "core:sys/windows" + +@(private, require_results) +full_path_from_name :: proc(name: string, allocator := context.allocator) -> (path: string, err: Errno) { + context.allocator = allocator + + name := name + if name == "" { + name = "." + } + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) + p := win32.utf8_to_utf16(name, context.temp_allocator) + buf := make([dynamic]u16, 100) + defer delete(buf) + for { + n := win32.GetFullPathNameW(cstring16(raw_data(p)), u32(len(buf)), cstring16(raw_data(buf)), nil) + if n == 0 { + return "", get_last_error() + } + if n <= u32(len(buf)) { + return win32.utf16_to_utf8(buf[:n], allocator) or_else "", nil + } + resize(&buf, len(buf)*2) + } + + return +} + +@(private, require_results) +_stat :: proc(name: string, create_file_attributes: u32, allocator := context.allocator) -> (fi: File_Info, e: Errno) { + if len(name) == 0 { + return {}, ERROR_PATH_NOT_FOUND + } + + context.allocator = allocator + + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) + + wname := win32.utf8_to_wstring(fix_long_path(name), context.temp_allocator) + fa: win32.WIN32_FILE_ATTRIBUTE_DATA + ok := win32.GetFileAttributesExW(wname, win32.GetFileExInfoStandard, &fa) + if ok && fa.dwFileAttributes & win32.FILE_ATTRIBUTE_REPARSE_POINT == 0 { + // Not a symlink + return file_info_from_win32_file_attribute_data(&fa, name) + } + + err := 0 if ok else win32.GetLastError() + + if err == win32.ERROR_SHARING_VIOLATION { + fd: win32.WIN32_FIND_DATAW + sh := win32.FindFirstFileW(wname, &fd) + if sh == win32.INVALID_HANDLE_VALUE { + e = get_last_error() + return + } + win32.FindClose(sh) + + return file_info_from_win32_find_data(&fd, name) + } + + h := win32.CreateFileW(wname, 0, 0, nil, win32.OPEN_EXISTING, create_file_attributes, nil) + if h == win32.INVALID_HANDLE_VALUE { + e = get_last_error() + return + } + defer win32.CloseHandle(h) + return file_info_from_get_file_information_by_handle(name, h) +} + + +@(require_results) +lstat :: proc(name: string, allocator := context.allocator) -> (File_Info, Errno) { + attrs := win32.FILE_FLAG_BACKUP_SEMANTICS + attrs |= win32.FILE_FLAG_OPEN_REPARSE_POINT + return _stat(name, attrs, allocator) +} + +@(require_results) +stat :: proc(name: string, allocator := context.allocator) -> (File_Info, Errno) { + attrs := win32.FILE_FLAG_BACKUP_SEMANTICS + return _stat(name, attrs, allocator) +} + +@(require_results) +fstat :: proc(fd: Handle, allocator := context.allocator) -> (fi: File_Info, err: Errno) { + if fd == 0 { + err = ERROR_INVALID_HANDLE + } + context.allocator = allocator + + path := cleanpath_from_handle(fd) or_return + defer if err != nil { + delete(path) + } + + h := win32.HANDLE(fd) + switch win32.GetFileType(h) { + case win32.FILE_TYPE_PIPE, win32.FILE_TYPE_CHAR: + fi.name = basename(path) + fi.mode |= file_type_mode(h) + err = nil + case: + fi = file_info_from_get_file_information_by_handle(path, h) or_return + } + fi.fullpath = path + return +} + + +@(private, require_results) +cleanpath_strip_prefix :: proc(buf: []u16) -> []u16 { + buf := buf + N := 0 + for c, i in buf { + if c == 0 { break } + N = i+1 + } + buf = buf[:N] + + if len(buf) >= 4 && buf[0] == '\\' && buf[1] == '\\' && buf[2] == '?' && buf[3] == '\\' { + buf = buf[4:] + + /* + NOTE(Jeroen): Properly handle UNC paths. + We need to turn `\\?\UNC\synology.local` into `\\synology.local`. + */ + if len(buf) >= 3 && buf[0] == 'U' && buf[1] == 'N' && buf[2] == 'C' { + buf = buf[2:] + buf[0] = '\\' + } + } + return buf +} + +@(private, require_results) +cleanpath_from_handle :: proc(fd: Handle) -> (s: string, err: Errno) { + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == context.allocator) + buf := cleanpath_from_handle_u16(fd, context.temp_allocator) or_return + return win32.utf16_to_utf8(buf, context.allocator) +} +@(private, require_results) +cleanpath_from_handle_u16 :: proc(fd: Handle, allocator: runtime.Allocator) -> ([]u16, Errno) { + if fd == 0 { + return nil, ERROR_INVALID_HANDLE + } + h := win32.HANDLE(fd) + + n := win32.GetFinalPathNameByHandleW(h, nil, 0, 0) + if n == 0 { + return nil, get_last_error() + } + buf := make([]u16, max(n, win32.DWORD(260))+1, allocator) + buf_len := win32.GetFinalPathNameByHandleW(h, cstring16(raw_data(buf)), n, 0) + return buf[:buf_len], nil +} +@(private, require_results) +cleanpath_from_buf :: proc(buf: []u16) -> string { + buf := buf + buf = cleanpath_strip_prefix(buf) + return win32.utf16_to_utf8(buf, context.allocator) or_else "" +} + +@(private, require_results) +basename :: proc(name: string) -> (base: string) { + name := name + if len(name) > 3 && name[:3] == `\\?` { + name = name[3:] + } + + if len(name) == 2 && name[1] == ':' { + return "." + } else if len(name) > 2 && name[1] == ':' { + name = name[2:] + } + i := len(name)-1 + + for ; i > 0 && (name[i] == '/' || name[i] == '\\'); i -= 1 { + name = name[:i] + } + for i -= 1; i >= 0; i -= 1 { + if name[i] == '/' || name[i] == '\\' { + name = name[i+1:] + break + } + } + return name +} + +@(private, require_results) +file_type_mode :: proc(h: win32.HANDLE) -> File_Mode { + switch win32.GetFileType(h) { + case win32.FILE_TYPE_PIPE: + return File_Mode_Named_Pipe + case win32.FILE_TYPE_CHAR: + return File_Mode_Device | File_Mode_Char_Device + } + return 0 +} + + +@(private, require_results) +file_mode_from_file_attributes :: proc(FileAttributes: win32.DWORD, h: win32.HANDLE, ReparseTag: win32.DWORD) -> (mode: File_Mode) { + if FileAttributes & win32.FILE_ATTRIBUTE_READONLY != 0 { + mode |= 0o444 + } else { + mode |= 0o666 + } + + is_sym := false + if FileAttributes & win32.FILE_ATTRIBUTE_REPARSE_POINT == 0 { + is_sym = false + } else { + is_sym = ReparseTag == win32.IO_REPARSE_TAG_SYMLINK || ReparseTag == win32.IO_REPARSE_TAG_MOUNT_POINT + } + + if is_sym { + mode |= File_Mode_Sym_Link + } else { + if FileAttributes & win32.FILE_ATTRIBUTE_DIRECTORY != 0 { + mode |= 0o111 | File_Mode_Dir + } + + if h != nil { + mode |= file_type_mode(h) + } + } + + return +} + +@(private) +windows_set_file_info_times :: proc(fi: ^File_Info, d: ^$T) { + fi.creation_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftCreationTime)) + fi.modification_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastWriteTime)) + fi.access_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastAccessTime)) +} + +@(private, require_results) +file_info_from_win32_file_attribute_data :: proc(d: ^win32.WIN32_FILE_ATTRIBUTE_DATA, name: string) -> (fi: File_Info, e: Errno) { + fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) + + fi.mode |= file_mode_from_file_attributes(d.dwFileAttributes, nil, 0) + fi.is_dir = fi.mode & File_Mode_Dir != 0 + + windows_set_file_info_times(&fi, d) + + fi.fullpath, e = full_path_from_name(name) + fi.name = basename(fi.fullpath) + + return +} + +@(private, require_results) +file_info_from_win32_find_data :: proc(d: ^win32.WIN32_FIND_DATAW, name: string) -> (fi: File_Info, e: Errno) { + fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) + + fi.mode |= file_mode_from_file_attributes(d.dwFileAttributes, nil, 0) + fi.is_dir = fi.mode & File_Mode_Dir != 0 + + windows_set_file_info_times(&fi, d) + + fi.fullpath, e = full_path_from_name(name) + fi.name = basename(fi.fullpath) + + return +} + +@(private, require_results) +file_info_from_get_file_information_by_handle :: proc(path: string, h: win32.HANDLE) -> (File_Info, Errno) { + d: win32.BY_HANDLE_FILE_INFORMATION + if !win32.GetFileInformationByHandle(h, &d) { + err := get_last_error() + return {}, err + + } + + ti: win32.FILE_ATTRIBUTE_TAG_INFO + if !win32.GetFileInformationByHandleEx(h, .FileAttributeTagInfo, &ti, size_of(ti)) { + err := get_last_error() + if err != ERROR_INVALID_PARAMETER { + return {}, err + } + // Indicate this is a symlink on FAT file systems + ti.ReparseTag = 0 + } + + fi: File_Info + + fi.fullpath = path + fi.name = basename(path) + fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) + + fi.mode |= file_mode_from_file_attributes(ti.FileAttributes, h, ti.ReparseTag) + fi.is_dir = fi.mode & File_Mode_Dir != 0 + + windows_set_file_info_times(&fi, &d) + + return fi, nil +} diff --git a/core/os/stream.odin b/core/os/old/stream.odin similarity index 100% rename from core/os/stream.odin rename to core/os/old/stream.odin diff --git a/core/os/os2/dir_windows.odin b/core/os/os2/dir_windows.odin deleted file mode 100644 index a4dadca75..000000000 --- a/core/os/os2/dir_windows.odin +++ /dev/null @@ -1,144 +0,0 @@ -#+private -package os2 - -import "base:runtime" -import "core:time" -import win32 "core:sys/windows" - -@(private="file") -find_data_to_file_info :: proc(base_path: string, d: ^win32.WIN32_FIND_DATAW, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { - // Ignore "." and ".." - if d.cFileName[0] == '.' && d.cFileName[1] == 0 { - return - } - if d.cFileName[0] == '.' && d.cFileName[1] == '.' && d.cFileName[2] == 0 { - return - } - - temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) - path := concatenate({base_path, `\`, win32_wstring_to_utf8(cstring16(raw_data(d.cFileName[:])), temp_allocator) or_else ""}, allocator) or_return - - handle := win32.HANDLE(_open_internal(path, {.Read}, Permissions_Read_Write_All) or_else 0) - defer win32.CloseHandle(handle) - - fi.fullpath = path - fi.name = basename(path) - fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) - - fi.type, fi.mode = _file_type_mode_from_file_attributes(d.dwFileAttributes, handle, d.dwReserved0) - - fi.creation_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftCreationTime)) - fi.modification_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastWriteTime)) - fi.access_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastAccessTime)) - - if file_id_info: win32.FILE_ID_INFO; handle != nil && win32.GetFileInformationByHandleEx(handle, .FileIdInfo, &file_id_info, size_of(file_id_info)) { - #assert(size_of(fi.inode) == size_of(file_id_info.FileId)) - #assert(size_of(fi.inode) == 16) - runtime.mem_copy_non_overlapping(&fi.inode, &file_id_info.FileId, 16) - } - - return -} - -Read_Directory_Iterator_Impl :: struct { - find_data: win32.WIN32_FIND_DATAW, - find_handle: win32.HANDLE, - path: string, - prev_fi: File_Info, - no_more_files: bool, -} - - -@(require_results) -_read_directory_iterator :: proc(it: ^Read_Directory_Iterator) -> (fi: File_Info, index: int, ok: bool) { - for !it.impl.no_more_files { - err: Error - file_info_delete(it.impl.prev_fi, file_allocator()) - it.impl.prev_fi = {} - - fi, err = find_data_to_file_info(it.impl.path, &it.impl.find_data, file_allocator()) - if err != nil { - read_directory_iterator_set_error(it, it.impl.path, err) - return - } - - if fi.name != "" { - it.impl.prev_fi = fi - ok = true - index = it.index - it.index += 1 - } - - if !win32.FindNextFileW(it.impl.find_handle, &it.impl.find_data) { - e := _get_platform_error() - if pe, _ := is_platform_error(e); pe != i32(win32.ERROR_NO_MORE_FILES) { - read_directory_iterator_set_error(it, it.impl.path, e) - } - it.impl.no_more_files = true - } - if ok { - return - } - } - return -} - -_read_directory_iterator_init :: proc(it: ^Read_Directory_Iterator, f: ^File) { - it.impl.no_more_files = false - - if f == nil || f.impl == nil { - read_directory_iterator_set_error(it, "", .Invalid_File) - return - } - - it.f = f - impl := (^File_Impl)(f.impl) - - // NOTE: Allow calling `init` to target a new directory with the same iterator - reset idx. - if it.impl.find_handle != nil { - win32.FindClose(it.impl.find_handle) - } - if it.impl.path != "" { - delete(it.impl.path, file_allocator()) - } - - if !is_directory(impl.name) { - read_directory_iterator_set_error(it, impl.name, .Invalid_Dir) - return - } - - wpath := string16(impl.wname) - temp_allocator := TEMP_ALLOCATOR_GUARD({}) - - wpath_search := make([]u16, len(wpath)+3, temp_allocator) - copy(wpath_search, wpath) - wpath_search[len(wpath)+0] = '\\' - wpath_search[len(wpath)+1] = '*' - wpath_search[len(wpath)+2] = 0 - - it.impl.find_handle = win32.FindFirstFileW(cstring16(raw_data(wpath_search)), &it.impl.find_data) - if it.impl.find_handle == win32.INVALID_HANDLE_VALUE { - read_directory_iterator_set_error(it, impl.name, _get_platform_error()) - return - } - defer if it.err.err != nil { - win32.FindClose(it.impl.find_handle) - } - - err: Error - it.impl.path, err = _cleanpath_from_buf(wpath, file_allocator()) - if err != nil { - read_directory_iterator_set_error(it, impl.name, err) - } - - return -} - -_read_directory_iterator_destroy :: proc(it: ^Read_Directory_Iterator) { - if it.f == nil { - return - } - file_info_delete(it.impl.prev_fi, file_allocator()) - delete(it.impl.path, file_allocator()) - win32.FindClose(it.impl.find_handle) -} diff --git a/core/os/os2/env_windows.odin b/core/os/os2/env_windows.odin deleted file mode 100644 index d389f8860..000000000 --- a/core/os/os2/env_windows.odin +++ /dev/null @@ -1,142 +0,0 @@ -#+private -package os2 - -import win32 "core:sys/windows" -import "base:runtime" - -_lookup_env_alloc :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) { - if key == "" { - return - } - temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) - wkey, _ := win32_utf8_to_wstring(key, temp_allocator) - - n := win32.GetEnvironmentVariableW(wkey, nil, 0) - if n == 0 { - err := win32.GetLastError() - if err == win32.ERROR_ENVVAR_NOT_FOUND { - return "", false - } - return "", true - } - - b := make([]u16, n+1, temp_allocator) - - n = win32.GetEnvironmentVariableW(wkey, raw_data(b), u32(len(b))) - if n == 0 { - err := win32.GetLastError() - if err == win32.ERROR_ENVVAR_NOT_FOUND { - return "", false - } - return "", false - } - - value = win32_utf16_to_utf8(string16(b[:n]), allocator) or_else "" - found = true - return -} - -// This version of `lookup_env` doesn't allocate and instead requires the user to provide a buffer. -// Note that it is limited to environment names and values of 512 utf-16 values each -// due to the necessary utf-8 <> utf-16 conversion. -@(require_results) -_lookup_env_buf :: proc(buf: []u8, key: string) -> (value: string, err: Error) { - key_buf: [513]u16 - wkey := win32.utf8_to_wstring(key_buf[:], key) - if wkey == nil { - return "", .Buffer_Full - } - - n2 := win32.GetEnvironmentVariableW(wkey, nil, 0) - if n2 == 0 { - return "", .Env_Var_Not_Found - } - - val_buf: [513]u16 - n2 = win32.GetEnvironmentVariableW(wkey, raw_data(val_buf[:]), u32(len(val_buf[:]))) - if n2 == 0 { - return "", .Env_Var_Not_Found - } else if int(n2) > len(buf) { - return "", .Buffer_Full - } - - value = win32.utf16_to_utf8(buf, val_buf[:n2]) - - return value, nil -} -_lookup_env :: proc{_lookup_env_alloc, _lookup_env_buf} - -_set_env :: proc(key, value: string) -> Error { - temp_allocator := TEMP_ALLOCATOR_GUARD({}) - k := win32_utf8_to_wstring(key, temp_allocator) or_return - v := win32_utf8_to_wstring(value, temp_allocator) or_return - - if !win32.SetEnvironmentVariableW(k, v) { - return _get_platform_error() - } - return nil -} - -_unset_env :: proc(key: string) -> bool { - temp_allocator := TEMP_ALLOCATOR_GUARD({}) - k, _ := win32_utf8_to_wstring(key, temp_allocator) - return bool(win32.SetEnvironmentVariableW(k, nil)) -} - -_clear_env :: proc() { - temp_allocator := TEMP_ALLOCATOR_GUARD({}) - envs, _ := environ(temp_allocator) - for env in envs { - for j in 1.. io.Error { - if ferr == nil { - return .None - } - return ferr.(io.Error) or_else .Unknown -} diff --git a/core/os/os2/stat.odin b/core/os/os2/stat.odin deleted file mode 100644 index 0a9ac4e57..000000000 --- a/core/os/os2/stat.odin +++ /dev/null @@ -1,117 +0,0 @@ -package os2 - -import "base:runtime" -import "core:strings" -import "core:time" - -Fstat_Callback :: proc(f: ^File, allocator: runtime.Allocator) -> (File_Info, Error) - -/* - `File_Info` describes a file and is returned from `stat`, `fstat`, and `lstat`. -*/ -File_Info :: struct { - fullpath: string, // fullpath of the file - name: string, // base name of the file - - inode: u128, // might be zero if cannot be determined - size: i64 `fmt:"M"`, // length in bytes for regular files; system-dependent for other file types - mode: Permissions, // file permission flags - type: File_Type, - - creation_time: time.Time, - modification_time: time.Time, - access_time: time.Time, -} - -@(require_results) -file_info_clone :: proc(fi: File_Info, allocator: runtime.Allocator) -> (cloned: File_Info, err: runtime.Allocator_Error) { - cloned = fi - cloned.fullpath = strings.clone(fi.fullpath, allocator) or_return - _, cloned.name = split_path(cloned.fullpath) - return -} - -file_info_slice_delete :: proc(infos: []File_Info, allocator: runtime.Allocator) { - #reverse for info in infos { - file_info_delete(info, allocator) - } - delete(infos, allocator) -} - -file_info_delete :: proc(fi: File_Info, allocator: runtime.Allocator) { - delete(fi.fullpath, allocator) -} - -@(require_results) -fstat :: proc(f: ^File, allocator: runtime.Allocator) -> (File_Info, Error) { - if f == nil { - return {}, nil - } else if f.stream.procedure != nil { - fi: File_Info - data := ([^]byte)(&fi)[:size_of(fi)] - _, err := f.stream.procedure(f, .Fstat, data, 0, nil, allocator) - return fi, err - } - return {}, .Invalid_Callback -} - -/* - `stat` returns a `File_Info` describing the named file from the file system. - The resulting `File_Info` must be deleted with `file_info_delete`. -*/ -@(require_results) -stat :: proc(name: string, allocator: runtime.Allocator) -> (File_Info, Error) { - return _stat(name, allocator) -} - -lstat :: stat_do_not_follow_links - -/* - Returns a `File_Info` describing the named file from the file system. - If the file is a symbolic link, the `File_Info` returns describes the symbolic link, - rather than following the link. - The resulting `File_Info` must be deleted with `file_info_delete`. -*/ -@(require_results) -stat_do_not_follow_links :: proc(name: string, allocator: runtime.Allocator) -> (File_Info, Error) { - return _lstat(name, allocator) -} - - -/* - Returns true if two `File_Info`s are equivalent. -*/ -@(require_results) -same_file :: proc(fi1, fi2: File_Info) -> bool { - return _same_file(fi1, fi2) -} - - -last_write_time :: modification_time -last_write_time_by_name :: modification_time_by_path - -/* - Returns the modification time of the file `f`. - The resolution of the timestamp is system-dependent. -*/ -@(require_results) -modification_time :: proc(f: ^File) -> (time.Time, Error) { - temp_allocator := TEMP_ALLOCATOR_GUARD({}) - fi, err := fstat(f, temp_allocator) - return fi.modification_time, err -} - -/* - Returns the modification time of the named file `path`. - The resolution of the timestamp is system-dependent. -*/ -@(require_results) -modification_time_by_path :: proc(path: string) -> (time.Time, Error) { - temp_allocator := TEMP_ALLOCATOR_GUARD({}) - fi, err := stat(path, temp_allocator) - return fi.modification_time, err -} - -is_reserved_name :: proc(path: string) -> bool { - return _is_reserved_name(path) -} \ No newline at end of file diff --git a/core/os/os2/stat_windows.odin b/core/os/os2/stat_windows.odin deleted file mode 100644 index 651029ac3..000000000 --- a/core/os/os2/stat_windows.odin +++ /dev/null @@ -1,393 +0,0 @@ -#+private -package os2 - -import "base:runtime" -import "core:time" -import "core:strings" -import win32 "core:sys/windows" - -_fstat :: proc(f: ^File, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { - if f == nil || (^File_Impl)(f.impl).fd == nil { - return - } - - path := _cleanpath_from_handle(f, allocator) or_return - - h := _handle(f) - switch win32.GetFileType(h) { - case win32.FILE_TYPE_PIPE, win32.FILE_TYPE_CHAR: - fi = File_Info { - fullpath = path, - name = basename(path), - type = file_type(h), - } - return - } - - return _file_info_from_get_file_information_by_handle(path, h, allocator) -} - -_stat :: proc(name: string, allocator: runtime.Allocator) -> (File_Info, Error) { - return internal_stat(name, win32.FILE_FLAG_BACKUP_SEMANTICS, allocator) -} - -_lstat :: proc(name: string, allocator: runtime.Allocator) -> (File_Info, Error) { - return internal_stat(name, win32.FILE_FLAG_BACKUP_SEMANTICS|win32.FILE_FLAG_OPEN_REPARSE_POINT, allocator) -} - -_same_file :: proc(fi1, fi2: File_Info) -> bool { - return fi1.fullpath == fi2.fullpath -} - -full_path_from_name :: proc(name: string, allocator: runtime.Allocator) -> (path: string, err: Error) { - name := name - if name == "" { - name = "." - } - - temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) - - p := win32_utf8_to_utf16(name, temp_allocator) or_return - - n := win32.GetFullPathNameW(cstring16(raw_data(p)), 0, nil, nil) - if n == 0 { - return "", _get_platform_error() - } - buf := make([]u16, n+1, temp_allocator) - n = win32.GetFullPathNameW(cstring16(raw_data(p)), u32(len(buf)), cstring16(raw_data(buf)), nil) - if n == 0 { - return "", _get_platform_error() - } - return win32_utf16_to_utf8(buf[:n], allocator) -} - -internal_stat :: proc(name: string, create_file_attributes: u32, allocator: runtime.Allocator) -> (fi: File_Info, e: Error) { - if len(name) == 0 { - return {}, .Not_Exist - } - temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) - - wname := _fix_long_path(name, temp_allocator) or_return - fa: win32.WIN32_FILE_ATTRIBUTE_DATA - ok := win32.GetFileAttributesExW(wname, win32.GetFileExInfoStandard, &fa) - if ok && fa.dwFileAttributes & win32.FILE_ATTRIBUTE_REPARSE_POINT == 0 { - // Not a symlink - fi = _file_info_from_win32_file_attribute_data(&fa, name, allocator) or_return - if fi.type == .Undetermined { - fi.type = _file_type_from_create_file(wname, create_file_attributes) - } - return - } - - err := 0 if ok else win32.GetLastError() - - if err == win32.ERROR_SHARING_VIOLATION { - fd: win32.WIN32_FIND_DATAW - sh := win32.FindFirstFileW(wname, &fd) - if sh == win32.INVALID_HANDLE_VALUE { - e = _get_platform_error() - return - } - win32.FindClose(sh) - - fi = _file_info_from_win32_find_data(&fd, name, allocator) or_return - if fi.type == .Undetermined { - fi.type = _file_type_from_create_file(wname, create_file_attributes) - } - return - } - - h := win32.CreateFileW(wname, 0, 0, nil, win32.OPEN_EXISTING, create_file_attributes, nil) - if h == win32.INVALID_HANDLE_VALUE { - e = _get_platform_error() - return - } - defer win32.CloseHandle(h) - return _file_info_from_get_file_information_by_handle(name, h, allocator) -} - -_cleanpath_strip_prefix :: proc(buf: []u16) -> []u16 { - buf := buf - N := 0 - for c, i in buf { - if c == 0 { break } - N = i+1 - } - buf = buf[:N] - - if len(buf) >= 4 { - if buf[0] == '\\' && - buf[1] == '\\' && - buf[2] == '?' && - buf[3] == '\\' { - buf = buf[4:] - } - } - return buf -} - -_cleanpath_from_handle :: proc(f: ^File, allocator: runtime.Allocator) -> (string, Error) { - if f == nil { - return "", nil - } - h := _handle(f) - - n := win32.GetFinalPathNameByHandleW(h, nil, 0, 0) - if n == 0 { - return "", _get_platform_error() - } - - temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) - - buf := make([]u16, max(n, 260)+1, temp_allocator) - n = win32.GetFinalPathNameByHandleW(h, cstring16(raw_data(buf)), u32(len(buf)), 0) - return _cleanpath_from_buf(string16(buf[:n]), allocator) -} - -_cleanpath_from_handle_u16 :: proc(f: ^File) -> ([]u16, Error) { - if f == nil { - return nil, nil - } - h := _handle(f) - - n := win32.GetFinalPathNameByHandleW(h, nil, 0, 0) - if n == 0 { - return nil, _get_platform_error() - } - - temp_allocator := TEMP_ALLOCATOR_GUARD({}) - - buf := make([]u16, max(n, 260)+1, temp_allocator) - n = win32.GetFinalPathNameByHandleW(h, cstring16(raw_data(buf)), u32(len(buf)), 0) - return _cleanpath_strip_prefix(buf[:n]), nil -} - -_cleanpath_from_buf :: proc(buf: string16, allocator: runtime.Allocator) -> (string, runtime.Allocator_Error) { - buf := transmute([]u16)buf - buf = _cleanpath_strip_prefix(buf) - return win32_utf16_to_utf8(buf, allocator) -} - -basename :: proc(name: string) -> (base: string) { - name := name - if len(name) > 3 && name[:3] == `\\?` { - name = name[3:] - } - - if len(name) == 2 && name[1] == ':' { - return "." - } else if len(name) > 2 && name[1] == ':' { - name = name[2:] - } - i := len(name)-1 - - for ; i > 0 && (name[i] == '/' || name[i] == '\\'); i -= 1 { - name = name[:i] - } - for i -= 1; i >= 0; i -= 1 { - if name[i] == '/' || name[i] == '\\' { - name = name[i+1:] - break - } - } - return name -} - -file_type :: proc(h: win32.HANDLE) -> File_Type { - switch win32.GetFileType(h) { - case win32.FILE_TYPE_PIPE: return .Named_Pipe - case win32.FILE_TYPE_CHAR: return .Character_Device - case win32.FILE_TYPE_DISK: return .Regular - } - return .Undetermined -} - -_file_type_from_create_file :: proc(wname: win32.wstring, create_file_attributes: u32) -> File_Type { - h := win32.CreateFileW(wname, 0, 0, nil, win32.OPEN_EXISTING, create_file_attributes, nil) - if h == win32.INVALID_HANDLE_VALUE { - return .Undetermined - } - defer win32.CloseHandle(h) - return file_type(h) -} - -_file_type_mode_from_file_attributes :: proc(file_attributes: win32.DWORD, h: win32.HANDLE, ReparseTag: win32.DWORD) -> (type: File_Type, mode: Permissions) { - if file_attributes & win32.FILE_ATTRIBUTE_READONLY != 0 { - mode += Permissions_Write_All - } else { - mode += Permissions_Read_Write_All - } - - is_sym := false - if file_attributes & win32.FILE_ATTRIBUTE_REPARSE_POINT == 0 { - is_sym = false - } else { - is_sym = ReparseTag == win32.IO_REPARSE_TAG_SYMLINK || ReparseTag == win32.IO_REPARSE_TAG_MOUNT_POINT - } - - if is_sym { - type = .Symlink - } else if file_attributes & win32.FILE_ATTRIBUTE_DIRECTORY != 0 { - type = .Directory - mode += Permissions_Execute_All - } else if h != nil { - type = file_type(h) - } - return -} - -// a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC) -time_as_filetime :: #force_inline proc(t: time.Time) -> (ft: win32.LARGE_INTEGER) { - win := u64(t._nsec / 100) + 116444736000000000 - return win32.LARGE_INTEGER(win) -} - -filetime_as_time_li :: #force_inline proc(ft: win32.LARGE_INTEGER) -> (t: time.Time) { - return {_nsec=(i64(ft) - 116444736000000000) * 100} -} - -filetime_as_time_ft :: #force_inline proc(ft: win32.FILETIME) -> (t: time.Time) { - return filetime_as_time_li(win32.LARGE_INTEGER(ft.dwLowDateTime) + win32.LARGE_INTEGER(ft.dwHighDateTime) << 32) -} - -filetime_as_time :: proc{filetime_as_time_ft, filetime_as_time_li} - -_file_info_from_win32_file_attribute_data :: proc(d: ^win32.WIN32_FILE_ATTRIBUTE_DATA, name: string, allocator: runtime.Allocator) -> (fi: File_Info, e: Error) { - fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) - type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, nil, 0) - fi.type = type - fi.mode |= mode - fi.creation_time = filetime_as_time(d.ftCreationTime) - fi.modification_time = filetime_as_time(d.ftLastWriteTime) - fi.access_time = filetime_as_time(d.ftLastAccessTime) - fi.fullpath, e = full_path_from_name(name, allocator) - fi.name = basename(fi.fullpath) - return -} - -_file_info_from_win32_find_data :: proc(d: ^win32.WIN32_FIND_DATAW, name: string, allocator: runtime.Allocator) -> (fi: File_Info, e: Error) { - fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) - type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, nil, 0) - fi.type = type - fi.mode |= mode - fi.creation_time = filetime_as_time(d.ftCreationTime) - fi.modification_time = filetime_as_time(d.ftLastWriteTime) - fi.access_time = filetime_as_time(d.ftLastAccessTime) - fi.fullpath, e = full_path_from_name(name, allocator) - fi.name = basename(fi.fullpath) - return -} - -_file_info_from_get_file_information_by_handle :: proc(path: string, h: win32.HANDLE, allocator: runtime.Allocator) -> (File_Info, Error) { - d: win32.BY_HANDLE_FILE_INFORMATION - if !win32.GetFileInformationByHandle(h, &d) { - return {}, _get_platform_error() - - } - - ti: win32.FILE_ATTRIBUTE_TAG_INFO - if !win32.GetFileInformationByHandleEx(h, .FileAttributeTagInfo, &ti, size_of(ti)) { - err := _get_platform_error() - if perr, ok := is_platform_error(err); ok && perr != i32(win32.ERROR_INVALID_PARAMETER) { - return {}, err - } - // Indicate this is a symlink on FAT file systems - ti.ReparseTag = 0 - } - fi: File_Info - fi.fullpath = path - fi.name = basename(path) - fi.inode = u128(u64(d.nFileIndexHigh)<<32 + u64(d.nFileIndexLow)) - fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) - type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, h, 0) - fi.type = type - fi.mode |= mode - fi.creation_time = filetime_as_time(d.ftCreationTime) - fi.modification_time = filetime_as_time(d.ftLastWriteTime) - fi.access_time = filetime_as_time(d.ftLastAccessTime) - return fi, nil -} - -reserved_names := [?]string{ - "CON", "PRN", "AUX", "NUL", - "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", - "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9", -} - -_is_reserved_name :: proc(path: string) -> bool { - if len(path) == 0 { - return false - } - for reserved in reserved_names { - if strings.equal_fold(path, reserved) { - return true - } - } - return false -} - -_volume_name_len :: proc(path: string) -> (length: int) { - if len(path) < 2 { - return 0 - } - - if path[1] == ':' { - switch path[0] { - case 'a'..='z', 'A'..='Z': - return 2 - } - } - - /* - See: URL: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx - Further allowed paths can be of the form of: - - \\server\share or \\server\share\more\path - - \\?\C:\... - - \\.\PhysicalDriveX - */ - // Any remaining kind of path has to start with two slashes. - if !_is_path_separator(path[0]) || !_is_path_separator(path[1]) { - return 0 - } - - // Device path. The volume name is the whole string - if len(path) >= 5 && path[2] == '.' && _is_path_separator(path[3]) { - return len(path) - } - - // We're a UNC share `\\host\share`, file namespace `\\?\C:` or UNC in file namespace `\\?\\host\share` - prefix := 2 - - // File namespace. - if len(path) >= 5 && path[2] == '?' && _is_path_separator(path[3]) { - if _is_path_separator(path[4]) { - // `\\?\\` UNC path in file namespace - prefix = 5 - } - - if len(path) >= 6 && path[5] == ':' { - switch path[4] { - case 'a'..='z', 'A'..='Z': - return 6 - case: - return 0 - } - } - } - - // UNC path, minimum version of the volume is `\\h\s` for host, share. - // Can also contain an IP address in the host position. - slash_count := 0 - for i in prefix.. 0 { - slash_count += 1 - - if slash_count == 2 { - return i - } - } - } - - return len(path) -} \ No newline at end of file diff --git a/core/os/os2/path.odin b/core/os/path.odin similarity index 100% rename from core/os/os2/path.odin rename to core/os/path.odin diff --git a/core/os/os2/path_darwin.odin b/core/os/path_darwin.odin similarity index 100% rename from core/os/os2/path_darwin.odin rename to core/os/path_darwin.odin diff --git a/core/os/os2/path_freebsd.odin b/core/os/path_freebsd.odin similarity index 100% rename from core/os/os2/path_freebsd.odin rename to core/os/path_freebsd.odin diff --git a/core/os/os2/path_js.odin b/core/os/path_js.odin similarity index 100% rename from core/os/os2/path_js.odin rename to core/os/path_js.odin diff --git a/core/os/os2/path_linux.odin b/core/os/path_linux.odin similarity index 100% rename from core/os/os2/path_linux.odin rename to core/os/path_linux.odin diff --git a/core/os/os2/path_netbsd.odin b/core/os/path_netbsd.odin similarity index 100% rename from core/os/os2/path_netbsd.odin rename to core/os/path_netbsd.odin diff --git a/core/os/os2/path_openbsd.odin b/core/os/path_openbsd.odin similarity index 100% rename from core/os/os2/path_openbsd.odin rename to core/os/path_openbsd.odin diff --git a/core/os/os2/path_posix.odin b/core/os/path_posix.odin similarity index 100% rename from core/os/os2/path_posix.odin rename to core/os/path_posix.odin diff --git a/core/os/os2/path_posixfs.odin b/core/os/path_posixfs.odin similarity index 100% rename from core/os/os2/path_posixfs.odin rename to core/os/path_posixfs.odin diff --git a/core/os/os2/path_wasi.odin b/core/os/path_wasi.odin similarity index 100% rename from core/os/os2/path_wasi.odin rename to core/os/path_wasi.odin diff --git a/core/os/os2/path_windows.odin b/core/os/path_windows.odin similarity index 100% rename from core/os/os2/path_windows.odin rename to core/os/path_windows.odin diff --git a/core/os/os2/pipe.odin b/core/os/pipe.odin similarity index 100% rename from core/os/os2/pipe.odin rename to core/os/pipe.odin diff --git a/core/os/os2/pipe_js.odin b/core/os/pipe_js.odin similarity index 100% rename from core/os/os2/pipe_js.odin rename to core/os/pipe_js.odin diff --git a/core/os/os2/pipe_linux.odin b/core/os/pipe_linux.odin similarity index 100% rename from core/os/os2/pipe_linux.odin rename to core/os/pipe_linux.odin diff --git a/core/os/os2/pipe_posix.odin b/core/os/pipe_posix.odin similarity index 100% rename from core/os/os2/pipe_posix.odin rename to core/os/pipe_posix.odin diff --git a/core/os/os2/pipe_wasi.odin b/core/os/pipe_wasi.odin similarity index 100% rename from core/os/os2/pipe_wasi.odin rename to core/os/pipe_wasi.odin diff --git a/core/os/os2/pipe_windows.odin b/core/os/pipe_windows.odin similarity index 100% rename from core/os/os2/pipe_windows.odin rename to core/os/pipe_windows.odin diff --git a/core/os/os2/process.odin b/core/os/process.odin similarity index 100% rename from core/os/os2/process.odin rename to core/os/process.odin diff --git a/core/os/os2/process_freebsd.odin b/core/os/process_freebsd.odin similarity index 100% rename from core/os/os2/process_freebsd.odin rename to core/os/process_freebsd.odin diff --git a/core/os/os2/process_js.odin b/core/os/process_js.odin similarity index 100% rename from core/os/os2/process_js.odin rename to core/os/process_js.odin diff --git a/core/os/os2/process_linux.odin b/core/os/process_linux.odin similarity index 100% rename from core/os/os2/process_linux.odin rename to core/os/process_linux.odin diff --git a/core/os/os2/process_netbsd.odin b/core/os/process_netbsd.odin similarity index 100% rename from core/os/os2/process_netbsd.odin rename to core/os/process_netbsd.odin diff --git a/core/os/os2/process_openbsd.odin b/core/os/process_openbsd.odin similarity index 100% rename from core/os/os2/process_openbsd.odin rename to core/os/process_openbsd.odin diff --git a/core/os/os2/process_posix.odin b/core/os/process_posix.odin similarity index 100% rename from core/os/os2/process_posix.odin rename to core/os/process_posix.odin diff --git a/core/os/os2/process_posix_darwin.odin b/core/os/process_posix_darwin.odin similarity index 100% rename from core/os/os2/process_posix_darwin.odin rename to core/os/process_posix_darwin.odin diff --git a/core/os/os2/process_posix_other.odin b/core/os/process_posix_other.odin similarity index 100% rename from core/os/os2/process_posix_other.odin rename to core/os/process_posix_other.odin diff --git a/core/os/os2/process_wasi.odin b/core/os/process_wasi.odin similarity index 100% rename from core/os/os2/process_wasi.odin rename to core/os/process_wasi.odin diff --git a/core/os/os2/process_windows.odin b/core/os/process_windows.odin similarity index 100% rename from core/os/os2/process_windows.odin rename to core/os/process_windows.odin diff --git a/core/os/stat.odin b/core/os/stat.odin index 21a4961d1..0a9ac4e57 100644 --- a/core/os/stat.odin +++ b/core/os/stat.odin @@ -1,33 +1,117 @@ -package os +package os2 +import "base:runtime" +import "core:strings" import "core:time" +Fstat_Callback :: proc(f: ^File, allocator: runtime.Allocator) -> (File_Info, Error) + +/* + `File_Info` describes a file and is returned from `stat`, `fstat`, and `lstat`. +*/ File_Info :: struct { - fullpath: string, // allocated - name: string, // uses `fullpath` as underlying data - size: i64, - mode: File_Mode, - is_dir: bool, + fullpath: string, // fullpath of the file + name: string, // base name of the file + + inode: u128, // might be zero if cannot be determined + size: i64 `fmt:"M"`, // length in bytes for regular files; system-dependent for other file types + mode: Permissions, // file permission flags + type: File_Type, + creation_time: time.Time, modification_time: time.Time, access_time: time.Time, } -file_info_slice_delete :: proc(infos: []File_Info, allocator := context.allocator) { - for i := len(infos)-1; i >= 0; i -= 1 { - file_info_delete(infos[i], allocator) +@(require_results) +file_info_clone :: proc(fi: File_Info, allocator: runtime.Allocator) -> (cloned: File_Info, err: runtime.Allocator_Error) { + cloned = fi + cloned.fullpath = strings.clone(fi.fullpath, allocator) or_return + _, cloned.name = split_path(cloned.fullpath) + return +} + +file_info_slice_delete :: proc(infos: []File_Info, allocator: runtime.Allocator) { + #reverse for info in infos { + file_info_delete(info, allocator) } delete(infos, allocator) } -file_info_delete :: proc(fi: File_Info, allocator := context.allocator) { +file_info_delete :: proc(fi: File_Info, allocator: runtime.Allocator) { delete(fi.fullpath, allocator) } -File_Mode :: distinct u32 +@(require_results) +fstat :: proc(f: ^File, allocator: runtime.Allocator) -> (File_Info, Error) { + if f == nil { + return {}, nil + } else if f.stream.procedure != nil { + fi: File_Info + data := ([^]byte)(&fi)[:size_of(fi)] + _, err := f.stream.procedure(f, .Fstat, data, 0, nil, allocator) + return fi, err + } + return {}, .Invalid_Callback +} -File_Mode_Dir :: File_Mode(1<<16) -File_Mode_Named_Pipe :: File_Mode(1<<17) -File_Mode_Device :: File_Mode(1<<18) -File_Mode_Char_Device :: File_Mode(1<<19) -File_Mode_Sym_Link :: File_Mode(1<<20) +/* + `stat` returns a `File_Info` describing the named file from the file system. + The resulting `File_Info` must be deleted with `file_info_delete`. +*/ +@(require_results) +stat :: proc(name: string, allocator: runtime.Allocator) -> (File_Info, Error) { + return _stat(name, allocator) +} + +lstat :: stat_do_not_follow_links + +/* + Returns a `File_Info` describing the named file from the file system. + If the file is a symbolic link, the `File_Info` returns describes the symbolic link, + rather than following the link. + The resulting `File_Info` must be deleted with `file_info_delete`. +*/ +@(require_results) +stat_do_not_follow_links :: proc(name: string, allocator: runtime.Allocator) -> (File_Info, Error) { + return _lstat(name, allocator) +} + + +/* + Returns true if two `File_Info`s are equivalent. +*/ +@(require_results) +same_file :: proc(fi1, fi2: File_Info) -> bool { + return _same_file(fi1, fi2) +} + + +last_write_time :: modification_time +last_write_time_by_name :: modification_time_by_path + +/* + Returns the modification time of the file `f`. + The resolution of the timestamp is system-dependent. +*/ +@(require_results) +modification_time :: proc(f: ^File) -> (time.Time, Error) { + temp_allocator := TEMP_ALLOCATOR_GUARD({}) + fi, err := fstat(f, temp_allocator) + return fi.modification_time, err +} + +/* + Returns the modification time of the named file `path`. + The resolution of the timestamp is system-dependent. +*/ +@(require_results) +modification_time_by_path :: proc(path: string) -> (time.Time, Error) { + temp_allocator := TEMP_ALLOCATOR_GUARD({}) + fi, err := stat(path, temp_allocator) + return fi.modification_time, err +} + +is_reserved_name :: proc(path: string) -> bool { + return _is_reserved_name(path) +} \ No newline at end of file diff --git a/core/os/os2/stat_js.odin b/core/os/stat_js.odin similarity index 100% rename from core/os/os2/stat_js.odin rename to core/os/stat_js.odin diff --git a/core/os/os2/stat_linux.odin b/core/os/stat_linux.odin similarity index 100% rename from core/os/os2/stat_linux.odin rename to core/os/stat_linux.odin diff --git a/core/os/os2/stat_posix.odin b/core/os/stat_posix.odin similarity index 100% rename from core/os/os2/stat_posix.odin rename to core/os/stat_posix.odin diff --git a/core/os/os2/stat_wasi.odin b/core/os/stat_wasi.odin similarity index 100% rename from core/os/os2/stat_wasi.odin rename to core/os/stat_wasi.odin diff --git a/core/os/stat_windows.odin b/core/os/stat_windows.odin index 662c9f9e6..651029ac3 100644 --- a/core/os/stat_windows.odin +++ b/core/os/stat_windows.odin @@ -1,51 +1,82 @@ -package os +#+private +package os2 -import "core:time" import "base:runtime" +import "core:time" +import "core:strings" import win32 "core:sys/windows" -@(private, require_results) -full_path_from_name :: proc(name: string, allocator := context.allocator) -> (path: string, err: Errno) { - context.allocator = allocator - +_fstat :: proc(f: ^File, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { + if f == nil || (^File_Impl)(f.impl).fd == nil { + return + } + + path := _cleanpath_from_handle(f, allocator) or_return + + h := _handle(f) + switch win32.GetFileType(h) { + case win32.FILE_TYPE_PIPE, win32.FILE_TYPE_CHAR: + fi = File_Info { + fullpath = path, + name = basename(path), + type = file_type(h), + } + return + } + + return _file_info_from_get_file_information_by_handle(path, h, allocator) +} + +_stat :: proc(name: string, allocator: runtime.Allocator) -> (File_Info, Error) { + return internal_stat(name, win32.FILE_FLAG_BACKUP_SEMANTICS, allocator) +} + +_lstat :: proc(name: string, allocator: runtime.Allocator) -> (File_Info, Error) { + return internal_stat(name, win32.FILE_FLAG_BACKUP_SEMANTICS|win32.FILE_FLAG_OPEN_REPARSE_POINT, allocator) +} + +_same_file :: proc(fi1, fi2: File_Info) -> bool { + return fi1.fullpath == fi2.fullpath +} + +full_path_from_name :: proc(name: string, allocator: runtime.Allocator) -> (path: string, err: Error) { name := name if name == "" { name = "." } - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) - p := win32.utf8_to_utf16(name, context.temp_allocator) - buf := make([dynamic]u16, 100) - defer delete(buf) - for { - n := win32.GetFullPathNameW(cstring16(raw_data(p)), u32(len(buf)), cstring16(raw_data(buf)), nil) - if n == 0 { - return "", get_last_error() - } - if n <= u32(len(buf)) { - return win32.utf16_to_utf8(buf[:n], allocator) or_else "", nil - } - resize(&buf, len(buf)*2) - } - return + temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) + + p := win32_utf8_to_utf16(name, temp_allocator) or_return + + n := win32.GetFullPathNameW(cstring16(raw_data(p)), 0, nil, nil) + if n == 0 { + return "", _get_platform_error() + } + buf := make([]u16, n+1, temp_allocator) + n = win32.GetFullPathNameW(cstring16(raw_data(p)), u32(len(buf)), cstring16(raw_data(buf)), nil) + if n == 0 { + return "", _get_platform_error() + } + return win32_utf16_to_utf8(buf[:n], allocator) } -@(private, require_results) -_stat :: proc(name: string, create_file_attributes: u32, allocator := context.allocator) -> (fi: File_Info, e: Errno) { +internal_stat :: proc(name: string, create_file_attributes: u32, allocator: runtime.Allocator) -> (fi: File_Info, e: Error) { if len(name) == 0 { - return {}, ERROR_PATH_NOT_FOUND + return {}, .Not_Exist } + temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) - context.allocator = allocator - - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) - - wname := win32.utf8_to_wstring(fix_long_path(name), context.temp_allocator) + wname := _fix_long_path(name, temp_allocator) or_return fa: win32.WIN32_FILE_ATTRIBUTE_DATA ok := win32.GetFileAttributesExW(wname, win32.GetFileExInfoStandard, &fa) if ok && fa.dwFileAttributes & win32.FILE_ATTRIBUTE_REPARSE_POINT == 0 { // Not a symlink - return file_info_from_win32_file_attribute_data(&fa, name) + fi = _file_info_from_win32_file_attribute_data(&fa, name, allocator) or_return + if fi.type == .Undetermined { + fi.type = _file_type_from_create_file(wname, create_file_attributes) + } + return } err := 0 if ok else win32.GetLastError() @@ -54,65 +85,28 @@ _stat :: proc(name: string, create_file_attributes: u32, allocator := context.al fd: win32.WIN32_FIND_DATAW sh := win32.FindFirstFileW(wname, &fd) if sh == win32.INVALID_HANDLE_VALUE { - e = get_last_error() + e = _get_platform_error() return } win32.FindClose(sh) - return file_info_from_win32_find_data(&fd, name) + fi = _file_info_from_win32_find_data(&fd, name, allocator) or_return + if fi.type == .Undetermined { + fi.type = _file_type_from_create_file(wname, create_file_attributes) + } + return } h := win32.CreateFileW(wname, 0, 0, nil, win32.OPEN_EXISTING, create_file_attributes, nil) if h == win32.INVALID_HANDLE_VALUE { - e = get_last_error() + e = _get_platform_error() return } defer win32.CloseHandle(h) - return file_info_from_get_file_information_by_handle(name, h) + return _file_info_from_get_file_information_by_handle(name, h, allocator) } - -@(require_results) -lstat :: proc(name: string, allocator := context.allocator) -> (File_Info, Errno) { - attrs := win32.FILE_FLAG_BACKUP_SEMANTICS - attrs |= win32.FILE_FLAG_OPEN_REPARSE_POINT - return _stat(name, attrs, allocator) -} - -@(require_results) -stat :: proc(name: string, allocator := context.allocator) -> (File_Info, Errno) { - attrs := win32.FILE_FLAG_BACKUP_SEMANTICS - return _stat(name, attrs, allocator) -} - -@(require_results) -fstat :: proc(fd: Handle, allocator := context.allocator) -> (fi: File_Info, err: Errno) { - if fd == 0 { - err = ERROR_INVALID_HANDLE - } - context.allocator = allocator - - path := cleanpath_from_handle(fd) or_return - defer if err != nil { - delete(path) - } - - h := win32.HANDLE(fd) - switch win32.GetFileType(h) { - case win32.FILE_TYPE_PIPE, win32.FILE_TYPE_CHAR: - fi.name = basename(path) - fi.mode |= file_type_mode(h) - err = nil - case: - fi = file_info_from_get_file_information_by_handle(path, h) or_return - } - fi.fullpath = path - return -} - - -@(private, require_results) -cleanpath_strip_prefix :: proc(buf: []u16) -> []u16 { +_cleanpath_strip_prefix :: proc(buf: []u16) -> []u16 { buf := buf N := 0 for c, i in buf { @@ -121,50 +115,59 @@ cleanpath_strip_prefix :: proc(buf: []u16) -> []u16 { } buf = buf[:N] - if len(buf) >= 4 && buf[0] == '\\' && buf[1] == '\\' && buf[2] == '?' && buf[3] == '\\' { - buf = buf[4:] - - /* - NOTE(Jeroen): Properly handle UNC paths. - We need to turn `\\?\UNC\synology.local` into `\\synology.local`. - */ - if len(buf) >= 3 && buf[0] == 'U' && buf[1] == 'N' && buf[2] == 'C' { - buf = buf[2:] - buf[0] = '\\' + if len(buf) >= 4 { + if buf[0] == '\\' && + buf[1] == '\\' && + buf[2] == '?' && + buf[3] == '\\' { + buf = buf[4:] } } return buf } -@(private, require_results) -cleanpath_from_handle :: proc(fd: Handle) -> (s: string, err: Errno) { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == context.allocator) - buf := cleanpath_from_handle_u16(fd, context.temp_allocator) or_return - return win32.utf16_to_utf8(buf, context.allocator) -} -@(private, require_results) -cleanpath_from_handle_u16 :: proc(fd: Handle, allocator: runtime.Allocator) -> ([]u16, Errno) { - if fd == 0 { - return nil, ERROR_INVALID_HANDLE +_cleanpath_from_handle :: proc(f: ^File, allocator: runtime.Allocator) -> (string, Error) { + if f == nil { + return "", nil } - h := win32.HANDLE(fd) + h := _handle(f) n := win32.GetFinalPathNameByHandleW(h, nil, 0, 0) if n == 0 { - return nil, get_last_error() + return "", _get_platform_error() } - buf := make([]u16, max(n, win32.DWORD(260))+1, allocator) - buf_len := win32.GetFinalPathNameByHandleW(h, cstring16(raw_data(buf)), n, 0) - return buf[:buf_len], nil -} -@(private, require_results) -cleanpath_from_buf :: proc(buf: []u16) -> string { - buf := buf - buf = cleanpath_strip_prefix(buf) - return win32.utf16_to_utf8(buf, context.allocator) or_else "" + + temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) + + buf := make([]u16, max(n, 260)+1, temp_allocator) + n = win32.GetFinalPathNameByHandleW(h, cstring16(raw_data(buf)), u32(len(buf)), 0) + return _cleanpath_from_buf(string16(buf[:n]), allocator) +} + +_cleanpath_from_handle_u16 :: proc(f: ^File) -> ([]u16, Error) { + if f == nil { + return nil, nil + } + h := _handle(f) + + n := win32.GetFinalPathNameByHandleW(h, nil, 0, 0) + if n == 0 { + return nil, _get_platform_error() + } + + temp_allocator := TEMP_ALLOCATOR_GUARD({}) + + buf := make([]u16, max(n, 260)+1, temp_allocator) + n = win32.GetFinalPathNameByHandleW(h, cstring16(raw_data(buf)), u32(len(buf)), 0) + return _cleanpath_strip_prefix(buf[:n]), nil +} + +_cleanpath_from_buf :: proc(buf: string16, allocator: runtime.Allocator) -> (string, runtime.Allocator_Error) { + buf := transmute([]u16)buf + buf = _cleanpath_strip_prefix(buf) + return win32_utf16_to_utf8(buf, allocator) } -@(private, require_results) basename :: proc(name: string) -> (base: string) { name := name if len(name) > 3 && name[:3] == `\\?` { @@ -190,114 +193,201 @@ basename :: proc(name: string) -> (base: string) { return name } -@(private, require_results) -file_type_mode :: proc(h: win32.HANDLE) -> File_Mode { +file_type :: proc(h: win32.HANDLE) -> File_Type { switch win32.GetFileType(h) { - case win32.FILE_TYPE_PIPE: - return File_Mode_Named_Pipe - case win32.FILE_TYPE_CHAR: - return File_Mode_Device | File_Mode_Char_Device + case win32.FILE_TYPE_PIPE: return .Named_Pipe + case win32.FILE_TYPE_CHAR: return .Character_Device + case win32.FILE_TYPE_DISK: return .Regular } - return 0 + return .Undetermined } +_file_type_from_create_file :: proc(wname: win32.wstring, create_file_attributes: u32) -> File_Type { + h := win32.CreateFileW(wname, 0, 0, nil, win32.OPEN_EXISTING, create_file_attributes, nil) + if h == win32.INVALID_HANDLE_VALUE { + return .Undetermined + } + defer win32.CloseHandle(h) + return file_type(h) +} -@(private, require_results) -file_mode_from_file_attributes :: proc(FileAttributes: win32.DWORD, h: win32.HANDLE, ReparseTag: win32.DWORD) -> (mode: File_Mode) { - if FileAttributes & win32.FILE_ATTRIBUTE_READONLY != 0 { - mode |= 0o444 +_file_type_mode_from_file_attributes :: proc(file_attributes: win32.DWORD, h: win32.HANDLE, ReparseTag: win32.DWORD) -> (type: File_Type, mode: Permissions) { + if file_attributes & win32.FILE_ATTRIBUTE_READONLY != 0 { + mode += Permissions_Write_All } else { - mode |= 0o666 + mode += Permissions_Read_Write_All } is_sym := false - if FileAttributes & win32.FILE_ATTRIBUTE_REPARSE_POINT == 0 { + if file_attributes & win32.FILE_ATTRIBUTE_REPARSE_POINT == 0 { is_sym = false } else { is_sym = ReparseTag == win32.IO_REPARSE_TAG_SYMLINK || ReparseTag == win32.IO_REPARSE_TAG_MOUNT_POINT } if is_sym { - mode |= File_Mode_Sym_Link - } else { - if FileAttributes & win32.FILE_ATTRIBUTE_DIRECTORY != 0 { - mode |= 0o111 | File_Mode_Dir - } - - if h != nil { - mode |= file_type_mode(h) - } + type = .Symlink + } else if file_attributes & win32.FILE_ATTRIBUTE_DIRECTORY != 0 { + type = .Directory + mode += Permissions_Execute_All + } else if h != nil { + type = file_type(h) } - return } -@(private) -windows_set_file_info_times :: proc(fi: ^File_Info, d: ^$T) { - fi.creation_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftCreationTime)) - fi.modification_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastWriteTime)) - fi.access_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastAccessTime)) +// a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC) +time_as_filetime :: #force_inline proc(t: time.Time) -> (ft: win32.LARGE_INTEGER) { + win := u64(t._nsec / 100) + 116444736000000000 + return win32.LARGE_INTEGER(win) } -@(private, require_results) -file_info_from_win32_file_attribute_data :: proc(d: ^win32.WIN32_FILE_ATTRIBUTE_DATA, name: string) -> (fi: File_Info, e: Errno) { +filetime_as_time_li :: #force_inline proc(ft: win32.LARGE_INTEGER) -> (t: time.Time) { + return {_nsec=(i64(ft) - 116444736000000000) * 100} +} + +filetime_as_time_ft :: #force_inline proc(ft: win32.FILETIME) -> (t: time.Time) { + return filetime_as_time_li(win32.LARGE_INTEGER(ft.dwLowDateTime) + win32.LARGE_INTEGER(ft.dwHighDateTime) << 32) +} + +filetime_as_time :: proc{filetime_as_time_ft, filetime_as_time_li} + +_file_info_from_win32_file_attribute_data :: proc(d: ^win32.WIN32_FILE_ATTRIBUTE_DATA, name: string, allocator: runtime.Allocator) -> (fi: File_Info, e: Error) { fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) - - fi.mode |= file_mode_from_file_attributes(d.dwFileAttributes, nil, 0) - fi.is_dir = fi.mode & File_Mode_Dir != 0 - - windows_set_file_info_times(&fi, d) - - fi.fullpath, e = full_path_from_name(name) + type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, nil, 0) + fi.type = type + fi.mode |= mode + fi.creation_time = filetime_as_time(d.ftCreationTime) + fi.modification_time = filetime_as_time(d.ftLastWriteTime) + fi.access_time = filetime_as_time(d.ftLastAccessTime) + fi.fullpath, e = full_path_from_name(name, allocator) fi.name = basename(fi.fullpath) - return } -@(private, require_results) -file_info_from_win32_find_data :: proc(d: ^win32.WIN32_FIND_DATAW, name: string) -> (fi: File_Info, e: Errno) { +_file_info_from_win32_find_data :: proc(d: ^win32.WIN32_FIND_DATAW, name: string, allocator: runtime.Allocator) -> (fi: File_Info, e: Error) { fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) - - fi.mode |= file_mode_from_file_attributes(d.dwFileAttributes, nil, 0) - fi.is_dir = fi.mode & File_Mode_Dir != 0 - - windows_set_file_info_times(&fi, d) - - fi.fullpath, e = full_path_from_name(name) + type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, nil, 0) + fi.type = type + fi.mode |= mode + fi.creation_time = filetime_as_time(d.ftCreationTime) + fi.modification_time = filetime_as_time(d.ftLastWriteTime) + fi.access_time = filetime_as_time(d.ftLastAccessTime) + fi.fullpath, e = full_path_from_name(name, allocator) fi.name = basename(fi.fullpath) - return } -@(private, require_results) -file_info_from_get_file_information_by_handle :: proc(path: string, h: win32.HANDLE) -> (File_Info, Errno) { +_file_info_from_get_file_information_by_handle :: proc(path: string, h: win32.HANDLE, allocator: runtime.Allocator) -> (File_Info, Error) { d: win32.BY_HANDLE_FILE_INFORMATION if !win32.GetFileInformationByHandle(h, &d) { - err := get_last_error() - return {}, err + return {}, _get_platform_error() } ti: win32.FILE_ATTRIBUTE_TAG_INFO if !win32.GetFileInformationByHandleEx(h, .FileAttributeTagInfo, &ti, size_of(ti)) { - err := get_last_error() - if err != ERROR_INVALID_PARAMETER { + err := _get_platform_error() + if perr, ok := is_platform_error(err); ok && perr != i32(win32.ERROR_INVALID_PARAMETER) { return {}, err } // Indicate this is a symlink on FAT file systems ti.ReparseTag = 0 } - fi: File_Info - fi.fullpath = path fi.name = basename(path) - fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) - - fi.mode |= file_mode_from_file_attributes(ti.FileAttributes, h, ti.ReparseTag) - fi.is_dir = fi.mode & File_Mode_Dir != 0 - - windows_set_file_info_times(&fi, &d) - + fi.inode = u128(u64(d.nFileIndexHigh)<<32 + u64(d.nFileIndexLow)) + fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) + type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, h, 0) + fi.type = type + fi.mode |= mode + fi.creation_time = filetime_as_time(d.ftCreationTime) + fi.modification_time = filetime_as_time(d.ftLastWriteTime) + fi.access_time = filetime_as_time(d.ftLastAccessTime) return fi, nil } + +reserved_names := [?]string{ + "CON", "PRN", "AUX", "NUL", + "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", + "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9", +} + +_is_reserved_name :: proc(path: string) -> bool { + if len(path) == 0 { + return false + } + for reserved in reserved_names { + if strings.equal_fold(path, reserved) { + return true + } + } + return false +} + +_volume_name_len :: proc(path: string) -> (length: int) { + if len(path) < 2 { + return 0 + } + + if path[1] == ':' { + switch path[0] { + case 'a'..='z', 'A'..='Z': + return 2 + } + } + + /* + See: URL: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx + Further allowed paths can be of the form of: + - \\server\share or \\server\share\more\path + - \\?\C:\... + - \\.\PhysicalDriveX + */ + // Any remaining kind of path has to start with two slashes. + if !_is_path_separator(path[0]) || !_is_path_separator(path[1]) { + return 0 + } + + // Device path. The volume name is the whole string + if len(path) >= 5 && path[2] == '.' && _is_path_separator(path[3]) { + return len(path) + } + + // We're a UNC share `\\host\share`, file namespace `\\?\C:` or UNC in file namespace `\\?\\host\share` + prefix := 2 + + // File namespace. + if len(path) >= 5 && path[2] == '?' && _is_path_separator(path[3]) { + if _is_path_separator(path[4]) { + // `\\?\\` UNC path in file namespace + prefix = 5 + } + + if len(path) >= 6 && path[5] == ':' { + switch path[4] { + case 'a'..='z', 'A'..='Z': + return 6 + case: + return 0 + } + } + } + + // UNC path, minimum version of the volume is `\\h\s` for host, share. + // Can also contain an IP address in the host position. + slash_count := 0 + for i in prefix.. 0 { + slash_count += 1 + + if slash_count == 2 { + return i + } + } + } + + return len(path) +} \ No newline at end of file diff --git a/core/os/os2/temp_file.odin b/core/os/temp_file.odin similarity index 100% rename from core/os/os2/temp_file.odin rename to core/os/temp_file.odin diff --git a/core/os/os2/temp_file_js.odin b/core/os/temp_file_js.odin similarity index 100% rename from core/os/os2/temp_file_js.odin rename to core/os/temp_file_js.odin diff --git a/core/os/os2/temp_file_linux.odin b/core/os/temp_file_linux.odin similarity index 100% rename from core/os/os2/temp_file_linux.odin rename to core/os/temp_file_linux.odin diff --git a/core/os/os2/temp_file_posix.odin b/core/os/temp_file_posix.odin similarity index 100% rename from core/os/os2/temp_file_posix.odin rename to core/os/temp_file_posix.odin diff --git a/core/os/os2/temp_file_wasi.odin b/core/os/temp_file_wasi.odin similarity index 100% rename from core/os/os2/temp_file_wasi.odin rename to core/os/temp_file_wasi.odin diff --git a/core/os/os2/temp_file_windows.odin b/core/os/temp_file_windows.odin similarity index 100% rename from core/os/os2/temp_file_windows.odin rename to core/os/temp_file_windows.odin diff --git a/core/os/os2/user.odin b/core/os/user.odin similarity index 100% rename from core/os/os2/user.odin rename to core/os/user.odin diff --git a/core/os/os2/user_posix.odin b/core/os/user_posix.odin similarity index 100% rename from core/os/os2/user_posix.odin rename to core/os/user_posix.odin diff --git a/core/os/os2/user_windows.odin b/core/os/user_windows.odin similarity index 100% rename from core/os/os2/user_windows.odin rename to core/os/user_windows.odin diff --git a/core/path/filepath/match.odin b/core/path/filepath/match.odin index 00f5bcc3f..178d5f986 100644 --- a/core/path/filepath/match.odin +++ b/core/path/filepath/match.odin @@ -2,7 +2,7 @@ #+build !js package filepath -import os "core:os/os2" +import "core:os" // match states whether "name" matches the shell pattern // Pattern syntax is: diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index 2f2f7996c..58dc06103 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -2,8 +2,8 @@ // To process paths such as URLs that depend on forward slashes regardless of the OS, use the slashpath package. package filepath -import os "core:os/os2" -import "core:strings" +import "core:os" +import "core:strings" SEPARATOR_CHARS :: `/\` diff --git a/core/path/filepath/walk.odin b/core/path/filepath/walk.odin index 00b063bc7..2e2a4ff54 100644 --- a/core/path/filepath/walk.odin +++ b/core/path/filepath/walk.odin @@ -2,7 +2,7 @@ #+build !js package filepath -import os "core:os/os2" +import "core:os" Walker :: os.Walker @@ -43,9 +43,9 @@ If an error occurred opening a directory, you may get zero'd info struct and Example: package main - import "core:fmt" - import "core:strings" - import os "core:os/os2" + import "core:fmt" + import "core:strings" + import "core:os" main :: proc() { w := os.walker_create("core") diff --git a/core/prof/spall/spall.odin b/core/prof/spall/spall.odin index b079c2eb2..281eaa82d 100644 --- a/core/prof/spall/spall.odin +++ b/core/prof/spall/spall.odin @@ -2,8 +2,8 @@ package spall import "base:intrinsics" -import os "core:os/os2" -import "core:time" +import "core:os" +import "core:time" // File Format diff --git a/core/terminal/internal_os.odin b/core/terminal/internal_os.odin index 841803766..127cbae54 100644 --- a/core/terminal/internal_os.odin +++ b/core/terminal/internal_os.odin @@ -3,9 +3,9 @@ #+private package terminal -import "base:runtime" -import os "core:os/os2" -import "core:strings" +import "base:runtime" +import "core:os" +import "core:strings" // Reference documentation: // diff --git a/core/terminal/terminal_posix.odin b/core/terminal/terminal_posix.odin index 751ef85cf..83e64c6d8 100644 --- a/core/terminal/terminal_posix.odin +++ b/core/terminal/terminal_posix.odin @@ -2,8 +2,8 @@ #+build linux, darwin, netbsd, openbsd, freebsd, haiku package terminal -import "base:runtime" -import os "core:os/os2" +import "base:runtime" +import "core:os" _is_terminal :: proc "contextless" (f: ^os.File) -> bool { return os.is_tty(f) diff --git a/core/terminal/terminal_windows.odin b/core/terminal/terminal_windows.odin index 78d21952b..6c77330b5 100644 --- a/core/terminal/terminal_windows.odin +++ b/core/terminal/terminal_windows.odin @@ -1,9 +1,9 @@ #+private package terminal -import "base:runtime" -import os "core:os/os2" -import "core:sys/windows" +import "base:runtime" +import "core:os" +import "core:sys/windows" _is_terminal :: proc "contextless" (f: ^os.File) -> bool { return os.is_tty(f) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 8873bc973..8f26aa6c6 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -10,24 +10,24 @@ package testing Feoramund: Total rewrite. */ -import "base:intrinsics" -import "base:runtime" -import "core:bytes" -@require import "core:encoding/base64" -@require import "core:encoding/json" -import "core:fmt" -import "core:io" -@require import "core:log" -import "core:math/rand" -import "core:mem" -import os "core:os/os2" -import "core:slice" -@require import "core:strings" -import "core:sync/chan" -import "core:terminal" -import "core:terminal/ansi" -import "core:thread" -import "core:time" +import "base:intrinsics" +import "base:runtime" +import "core:bytes" +@(require) import "core:encoding/base64" +@(require) import "core:encoding/json" +import "core:fmt" +import "core:io" +@(require) import "core:log" +import "core:math/rand" +import "core:mem" +import "core:os" +import "core:slice" +@(require) import "core:strings" +import "core:sync/chan" +import "core:terminal" +import "core:terminal/ansi" +import "core:thread" +import "core:time" // Specify how many threads to use when running tests. TEST_THREADS : int : #config(ODIN_TEST_THREADS, 0) diff --git a/core/testing/signal_handler_libc.odin b/core/testing/signal_handler_libc.odin index badee802d..fb19a0115 100644 --- a/core/testing/signal_handler_libc.odin +++ b/core/testing/signal_handler_libc.odin @@ -11,11 +11,11 @@ package testing blob1807: Windows Win32 API rewrite. */ -import "base:intrinsics" -import "core:c/libc" -import os "core:os/os2" -import "core:sync" -import "core:terminal/ansi" +import "base:intrinsics" +import "core:c/libc" +import "core:os" +import "core:sync" +import "core:terminal/ansi" @(private="file") stop_runner_flag: libc.sig_atomic_t diff --git a/core/text/i18n/i18_js.odin b/core/text/i18n/i18_js.odin index 743718942..73e8535a5 100644 --- a/core/text/i18n/i18_js.odin +++ b/core/text/i18n/i18_js.odin @@ -10,8 +10,6 @@ package i18n List of contributors: Jeroen van Rijn: Initial implementation. */ -import os "core:os/os2" - @(private) parse_qt :: proc { parse_qt_linguist_from_bytes } diff --git a/core/text/i18n/i18n_os.odin b/core/text/i18n/i18n_os.odin index db82a9cf6..7a7995612 100644 --- a/core/text/i18n/i18n_os.odin +++ b/core/text/i18n/i18n_os.odin @@ -11,7 +11,7 @@ package i18n Jeroen van Rijn: Initial implementation. */ import "base:runtime" -import os "core:os/os2" +import "core:os" @(private) read_file :: proc(filename: string, allocator: runtime.Allocator) -> (data: []u8, err: Error) { diff --git a/core/text/regex/common/os.odin b/core/text/regex/common/os.odin index 1d38d687c..bde57f77f 100644 --- a/core/text/regex/common/os.odin +++ b/core/text/regex/common/os.odin @@ -10,7 +10,7 @@ package regex_common Feoramund: Initial implementation. */ -@require import os "core:os/os2" +@require import "core:os" when ODIN_DEBUG_REGEX { debug_stream := os.stderr.stream diff --git a/core/text/table/doc.odin b/core/text/table/doc.odin index 29b60dbe2..d91763661 100644 --- a/core/text/table/doc.odin +++ b/core/text/table/doc.odin @@ -189,7 +189,7 @@ Example: import "core:fmt" import "core:io" - import os "core:os/os2" + import "core:os" import "core:text/table" scripts :: proc(w: io.Writer) { @@ -265,10 +265,10 @@ corners and dividers. Example: package main - import "core:fmt" - import "core:io" - import os "core:os/os2" - import "core:text/table" + import "core:fmt" + import "core:io" + import "core:os" + import "core:text/table" box_drawing :: proc(w: io.Writer) { t: table.Table diff --git a/core/text/table/utility.odin b/core/text/table/utility.odin index db5ae4602..675fa6b10 100644 --- a/core/text/table/utility.odin +++ b/core/text/table/utility.odin @@ -2,9 +2,9 @@ #+build !js package text_table -import "core:io" -import os "core:os/os2" -import "core:strings" +import "core:io" +import "core:os" +import "core:strings" stdio_writer :: proc() -> io.Writer { return os.to_stream(os.stdout) diff --git a/core/time/timezone/tz_os.odin b/core/time/timezone/tz_os.odin index 2ab7cfa6c..fae4980c3 100644 --- a/core/time/timezone/tz_os.odin +++ b/core/time/timezone/tz_os.odin @@ -2,7 +2,7 @@ #+build !js package timezone -import os "core:os/os2" +import "core:os" import "core:time/datetime" load_tzif_file :: proc(filename: string, region_name: string, allocator := context.allocator) -> (out: ^datetime.TZ_Region, ok: bool) { diff --git a/core/time/timezone/tz_unix.odin b/core/time/timezone/tz_unix.odin index 60a20e57c..3939b3265 100644 --- a/core/time/timezone/tz_unix.odin +++ b/core/time/timezone/tz_unix.odin @@ -2,10 +2,10 @@ #+private package timezone -import os "core:os/os2" -import "core:strings" -import "core:time/datetime" -import "core:path/filepath" +import "core:os" +import "core:strings" +import "core:time/datetime" +import "core:path/filepath" local_tz_name :: proc(allocator := context.allocator) -> (name: string, success: bool) { local_str, ok := os.lookup_env("TZ", allocator) diff --git a/core/unicode/tools/generate_entity_table.odin b/core/unicode/tools/generate_entity_table.odin index 02958ad26..54f73370c 100644 --- a/core/unicode/tools/generate_entity_table.odin +++ b/core/unicode/tools/generate_entity_table.odin @@ -1,7 +1,7 @@ package xml_example import "core:encoding/xml" -import os "core:os/os2" +import "core:os" import path "core:path/filepath" import "core:strings" import "core:strconv" diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index c5f627653..3576fc027 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -117,7 +117,7 @@ package all @(require) import "core:prof/spall" @(require) import "core:os" -@(require) import "core:os/os2" +@(require) import "core:os/old" @(require) import "core:path/slashpath" @(require) import "core:path/filepath" diff --git a/tests/core/encoding/hxa/test_core_hxa.odin b/tests/core/encoding/hxa/test_core_hxa.odin index 17b3ca619..a4fee030c 100644 --- a/tests/core/encoding/hxa/test_core_hxa.odin +++ b/tests/core/encoding/hxa/test_core_hxa.odin @@ -6,7 +6,7 @@ import "core:testing" TEAPOT_PATH :: ODIN_ROOT + "tests/core/assets/HXA/teapot.hxa" -import os "core:os/os2" +import "core:os" @test test_read :: proc(t: ^testing.T) { diff --git a/tests/core/flags/test_core_flags.odin b/tests/core/flags/test_core_flags.odin index 1aee7f69c..834f6b630 100644 --- a/tests/core/flags/test_core_flags.odin +++ b/tests/core/flags/test_core_flags.odin @@ -1,16 +1,16 @@ package test_core_flags -import "base:runtime" -import "core:bytes" -import "core:flags" -import "core:fmt" -@require import "core:log" -import "core:math" -@require import "core:net" -import os "core:os/os2" -import "core:strings" -import "core:testing" -import "core:time/datetime" +import "base:runtime" +import "core:bytes" +import "core:flags" +import "core:fmt" +@(require) import "core:log" +import "core:math" +@(require) import "core:net" +import "core:os" +import "core:strings" +import "core:testing" +import "core:time/datetime" Custom_Data :: struct { a: int, diff --git a/tests/core/io/test_core_io.odin b/tests/core/io/test_core_io.odin index eb4d79317..301e7bb94 100644 --- a/tests/core/io/test_core_io.odin +++ b/tests/core/io/test_core_io.odin @@ -1,12 +1,12 @@ package test_core_io -import "core:bufio" -import "core:bytes" -import "core:io" -import "core:log" -import os "core:os/os2" -import "core:strings" -import "core:testing" +import "core:bufio" +import "core:bytes" +import "core:io" +import "core:log" +import "core:os" +import "core:strings" +import "core:testing" Passed_Tests :: distinct io.Stream_Mode_Set diff --git a/tests/core/nbio/fs.odin b/tests/core/nbio/fs.odin index 6e079f96e..1b10c03c9 100644 --- a/tests/core/nbio/fs.odin +++ b/tests/core/nbio/fs.odin @@ -1,9 +1,9 @@ package tests_nbio -import "core:nbio" -import "core:testing" -import "core:time" -import os "core:os/os2" +import "core:nbio" +import "core:testing" +import "core:time" +import "core:os" @(test) close_invalid_handle :: proc(t: ^testing.T) { diff --git a/tests/core/nbio/nbio.odin b/tests/core/nbio/nbio.odin index 2f454f55b..6c3fd0e8c 100644 --- a/tests/core/nbio/nbio.odin +++ b/tests/core/nbio/nbio.odin @@ -1,11 +1,11 @@ package tests_nbio -import "core:log" -import "core:nbio" -import "core:testing" -import "core:thread" -import "core:time" -import os "core:os/os2" +import "core:log" +import "core:nbio" +import "core:testing" +import "core:thread" +import "core:time" +import "core:os" ev :: testing.expect_value e :: testing.expect diff --git a/tests/core/normal.odin b/tests/core/normal.odin index 6b31b9d56..4708ed700 100644 --- a/tests/core/normal.odin +++ b/tests/core/normal.odin @@ -37,7 +37,7 @@ download_assets :: proc "contextless" () { @(require) import "net" @(require) import "odin" @(require) import "os" -@(require) import "os/os2" +@(require) import "os/old" @(require) import "reflect" @(require) import "runtime" @(require) import "slice" diff --git a/tests/core/os/os2/dir.odin b/tests/core/os/dir.odin similarity index 82% rename from tests/core/os/os2/dir.odin rename to tests/core/os/dir.odin index 8ef333219..464abed98 100644 --- a/tests/core/os/os2/dir.odin +++ b/tests/core/os/dir.odin @@ -1,14 +1,14 @@ -package tests_core_os_os2 +package tests_core_os -import os "core:os/os2" -import "core:log" -import "core:slice" -import "core:testing" -import "core:strings" +import "core:os" +import "core:log" +import "core:slice" +import "core:testing" +import "core:strings" @(test) test_read_dir :: proc(t: ^testing.T) { - path, err_join := os.join_path({#directory, "../dir"}, context.allocator) + path, err_join := os.join_path({#directory, "dir"}, context.allocator) defer delete(path) fis, err_read := os.read_all_directory_by_path(path, context.allocator) @@ -17,7 +17,7 @@ test_read_dir :: proc(t: ^testing.T) { slice.sort_by_key(fis, proc(fi: os.File_Info) -> string { return fi.name }) if err_read == .Unsupported { - log.warn("os2 directory functionality is unsupported, skipping test") + log.warn("core:os directory functionality is unsupported, skipping test") return } @@ -34,7 +34,7 @@ test_read_dir :: proc(t: ^testing.T) { @(test) test_walker :: proc(t: ^testing.T) { - path, err := os.join_path({#directory, "../dir"}, context.allocator) + path, err := os.join_path({#directory, "dir"}, context.allocator) defer delete(path) testing.expect_value(t, err, nil) @@ -46,7 +46,7 @@ test_walker :: proc(t: ^testing.T) { @(test) test_walker_file :: proc(t: ^testing.T) { - path, err_join := os.join_path({#directory, "../dir"}, context.allocator) + path, err_join := os.join_path({#directory, "dir"}, context.allocator) defer delete(path) testing.expect_value(t, err_join, nil) @@ -95,7 +95,7 @@ test_walker_internal :: proc(t: ^testing.T, w: ^os.Walker) { } if _, err := os.walker_error(w); err == .Unsupported { - log.warn("os2 directory functionality is unsupported, skipping test") + log.warn("core:os directory functionality is unsupported, skipping test") return } diff --git a/tests/core/os/os2/file.odin b/tests/core/os/file.odin similarity index 90% rename from tests/core/os/os2/file.odin rename to tests/core/os/file.odin index 0152a2008..aed57c26c 100644 --- a/tests/core/os/os2/file.odin +++ b/tests/core/os/file.odin @@ -1,7 +1,7 @@ -package tests_core_os_os2 +package tests_core_os -import os "core:os/os2" -import "core:testing" +import "core:os" +import "core:testing" @(test) test_clone :: proc(t: ^testing.T) { diff --git a/tests/core/os/os.odin b/tests/core/os/old/os.odin similarity index 97% rename from tests/core/os/os.odin rename to tests/core/os/old/os.odin index 1510bad31..9925cf708 100644 --- a/tests/core/os/os.odin +++ b/tests/core/os/old/os.odin @@ -1,8 +1,8 @@ -package test_core_os +package test_core_os_old import "core:c/libc" import win32 "core:sys/windows" -import "core:os" +import os "core:os/old" import "core:slice" import "core:testing" import "core:log" diff --git a/tests/core/os/os2/path.odin b/tests/core/os/path.odin similarity index 97% rename from tests/core/os/os2/path.odin rename to tests/core/os/path.odin index 868023c86..cdfaed56f 100644 --- a/tests/core/os/os2/path.odin +++ b/tests/core/os/path.odin @@ -1,11 +1,11 @@ -package tests_core_os_os2 +package tests_core_os -import "core:fmt" -import os "core:os/os2" -import "core:log" -import "core:testing" -import "core:slice" -import "core:strings" +import "core:fmt" +import "core:os" +import "core:log" +import "core:testing" +import "core:slice" +import "core:strings" @(test) test_executable :: proc(t: ^testing.T) { @@ -351,12 +351,12 @@ glob_tests := []Glob_Test{ err = {}, }, { - pattern = ODIN_ROOT + "tests/core/os/os2/*.odin", + pattern = ODIN_ROOT + "tests/core/os/*.odin", matches = { - ODIN_ROOT + "tests/core/os/os2/dir.odin", - ODIN_ROOT + "tests/core/os/os2/file.odin", - ODIN_ROOT + "tests/core/os/os2/path.odin", - ODIN_ROOT + "tests/core/os/os2/process.odin", + ODIN_ROOT + "tests/core/os/dir.odin", + ODIN_ROOT + "tests/core/os/file.odin", + ODIN_ROOT + "tests/core/os/path.odin", + ODIN_ROOT + "tests/core/os/process.odin", }, err = {}, }, diff --git a/tests/core/os/os2/process.odin b/tests/core/os/process.odin similarity index 84% rename from tests/core/os/os2/process.odin rename to tests/core/os/process.odin index c530b4c79..adb65e95f 100644 --- a/tests/core/os/os2/process.odin +++ b/tests/core/os/process.odin @@ -1,9 +1,9 @@ #+build !windows -package tests_core_os_os2 +package tests_core_os -import os "core:os/os2" -import "core:log" -import "core:testing" +import "core:os" +import "core:log" +import "core:testing" @(test) test_process_exec :: proc(t: ^testing.T) { diff --git a/tests/core/sys/kqueue/structs.odin b/tests/core/sys/kqueue/structs.odin index edf1fdd1e..15ec3f841 100644 --- a/tests/core/sys/kqueue/structs.odin +++ b/tests/core/sys/kqueue/structs.odin @@ -1,9 +1,9 @@ #+build darwin, freebsd, openbsd, netbsd package tests_core_sys_kqueue -import "core:strings" -import "core:testing" -import os "core:os/os2" +import "core:strings" +import "core:testing" +import "core:os" @(test) structs :: proc(t: ^testing.T) { diff --git a/tests/documentation/documentation_tester.odin b/tests/documentation/documentation_tester.odin index 6694de709..be59d9b4d 100644 --- a/tests/documentation/documentation_tester.odin +++ b/tests/documentation/documentation_tester.odin @@ -1,6 +1,6 @@ package documentation_tester -import os "core:os/os2" +import "core:os" import "core:fmt" import "core:strings" import "core:odin/ast" @@ -267,7 +267,7 @@ write_test_suite :: proc(example_tests: []Example_Test) { `#+private package documentation_verification -import os "core:os/os2" +import "core:os" import "core:mem" import "core:io" import "core:fmt" diff --git a/vendor/OpenGL/helpers.odin b/vendor/OpenGL/helpers.odin index bce60ee80..9c9c74d09 100644 --- a/vendor/OpenGL/helpers.odin +++ b/vendor/OpenGL/helpers.odin @@ -3,7 +3,7 @@ package vendor_gl // Helper for loading shaders into a program -import os "core:os/os2" +import "core:os" import "core:fmt" import "core:strings" @(require) import "core:time" diff --git a/vendor/fontstash/fontstash_os.odin b/vendor/fontstash/fontstash_os.odin index 8c259412d..d04df044c 100644 --- a/vendor/fontstash/fontstash_os.odin +++ b/vendor/fontstash/fontstash_os.odin @@ -1,8 +1,8 @@ #+build !js package fontstash -import "core:log" -import os "core:os/os2" +import "core:log" +import "core:os" // 'fontIndex' controls which font you want to load within a multi-font format such // as TTC. Leave it as zero if you are loading a single-font format such as TTF. diff --git a/vendor/libc-shim/stdio_os.odin b/vendor/libc-shim/stdio_os.odin index db40fb250..f6d30a227 100644 --- a/vendor/libc-shim/stdio_os.odin +++ b/vendor/libc-shim/stdio_os.odin @@ -2,9 +2,9 @@ #+build !js package odin_libc -import "core:io" -import "core:c" -import os "core:os/os2" +import "core:io" +import "core:c" +import "core:os" _fopen :: proc(path, _mode: cstring) -> FILE { flags: os.File_Flags From 8366e7094a976b9d7646e3f6eada7e5e1820f117 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Feb 2026 16:27:53 +0100 Subject: [PATCH 399/766] Fix up ABI name for core:os and core:os/old --- core/flags/internal_rtti.odin | 2 +- core/os/allocators.odin | 2 +- core/os/dir.odin | 2 +- core/os/dir_js.odin | 2 +- core/os/dir_linux.odin | 2 +- core/os/dir_posix.odin | 2 +- core/os/dir_posix_darwin.odin | 2 +- core/os/dir_walker.odin | 2 +- core/os/dir_wasi.odin | 2 +- core/os/dir_windows.odin | 2 +- core/os/doc.odin | 6 +++--- core/os/env.odin | 2 +- core/os/env_js.odin | 2 +- core/os/env_linux.odin | 2 +- core/os/env_posix.odin | 2 +- core/os/env_wasi.odin | 2 +- core/os/env_windows.odin | 2 +- core/os/errors.odin | 2 +- core/os/errors_js.odin | 2 +- core/os/errors_linux.odin | 2 +- core/os/errors_posix.odin | 2 +- core/os/errors_wasi.odin | 2 +- core/os/errors_windows.odin | 2 +- core/os/file.odin | 2 +- core/os/file_js.odin | 2 +- core/os/file_linux.odin | 2 +- core/os/file_posix.odin | 2 +- core/os/file_posix_darwin.odin | 2 +- core/os/file_posix_freebsd.odin | 2 +- core/os/file_posix_netbsd.odin | 2 +- core/os/file_posix_other.odin | 2 +- core/os/file_stream.odin | 2 +- core/os/file_util.odin | 2 +- core/os/file_wasi.odin | 2 +- core/os/file_windows.odin | 2 +- core/os/heap.odin | 2 +- core/os/heap_js.odin | 2 +- core/os/heap_linux.odin | 2 +- core/os/heap_posix.odin | 2 +- core/os/heap_wasi.odin | 2 +- core/os/heap_windows.odin | 2 +- core/os/internal_util.odin | 2 +- core/os/old/dir_unix.odin | 2 +- core/os/old/dir_windows.odin | 2 +- core/os/old/env_windows.odin | 2 +- core/os/old/errors.odin | 2 +- core/os/old/os.odin | 2 +- core/os/old/os_darwin.odin | 2 +- core/os/old/os_essence.odin | 2 +- core/os/old/os_freebsd.odin | 2 +- core/os/old/os_freestanding.odin | 4 ++-- core/os/old/os_haiku.odin | 2 +- core/os/old/os_js.odin | 2 +- core/os/old/os_linux.odin | 17 +++-------------- core/os/old/os_netbsd.odin | 2 +- core/os/old/os_openbsd.odin | 2 +- core/os/old/os_wasi.odin | 2 +- core/os/old/os_windows.odin | 2 +- core/os/old/stat.odin | 2 +- core/os/old/stat_unix.odin | 2 +- core/os/old/stat_windows.odin | 2 +- core/os/old/stream.odin | 2 +- core/os/path.odin | 2 +- core/os/path_darwin.odin | 2 +- core/os/path_freebsd.odin | 2 +- core/os/path_js.odin | 2 +- core/os/path_linux.odin | 2 +- core/os/path_netbsd.odin | 2 +- core/os/path_openbsd.odin | 2 +- core/os/path_posix.odin | 2 +- core/os/path_posixfs.odin | 2 +- core/os/path_wasi.odin | 2 +- core/os/path_windows.odin | 2 +- core/os/pipe.odin | 4 ++-- core/os/pipe_js.odin | 2 +- core/os/pipe_linux.odin | 2 +- core/os/pipe_posix.odin | 2 +- core/os/pipe_wasi.odin | 2 +- core/os/pipe_windows.odin | 2 +- core/os/process.odin | 2 +- core/os/process_freebsd.odin | 2 +- core/os/process_js.odin | 2 +- core/os/process_linux.odin | 2 +- core/os/process_netbsd.odin | 2 +- core/os/process_openbsd.odin | 2 +- core/os/process_posix.odin | 2 +- core/os/process_posix_darwin.odin | 2 +- core/os/process_posix_other.odin | 2 +- core/os/process_wasi.odin | 2 +- core/os/process_windows.odin | 2 +- core/os/stat.odin | 2 +- core/os/stat_js.odin | 2 +- core/os/stat_linux.odin | 2 +- core/os/stat_posix.odin | 2 +- core/os/stat_wasi.odin | 2 +- core/os/stat_windows.odin | 2 +- core/os/temp_file.odin | 2 +- core/os/temp_file_js.odin | 2 +- core/os/temp_file_linux.odin | 2 +- core/os/temp_file_posix.odin | 2 +- core/os/temp_file_wasi.odin | 2 +- core/os/temp_file_windows.odin | 2 +- core/os/user.odin | 2 +- core/os/user_posix.odin | 2 +- core/os/user_windows.odin | 2 +- tests/core/io/test_core_io.odin | 12 ++++++------ 106 files changed, 117 insertions(+), 128 deletions(-) diff --git a/core/flags/internal_rtti.odin b/core/flags/internal_rtti.odin index d5e8726e2..1d86f4bce 100644 --- a/core/flags/internal_rtti.odin +++ b/core/flags/internal_rtti.odin @@ -258,7 +258,7 @@ parse_and_set_pointer_by_named_type :: proc(ptr: rawptr, str: string, data_type: // NOTE(Feoramund): os.Error is system-dependent, and there's // currently no good way to translate them all into strings. // - // The upcoming `os2` package will hopefully solve this. + // The upcoming `core:os` package will hopefully solve this. // // We can at least provide the number for now, so the user can look // it up. diff --git a/core/os/allocators.odin b/core/os/allocators.odin index 36a7d72be..e49d416e1 100644 --- a/core/os/allocators.odin +++ b/core/os/allocators.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/dir.odin b/core/os/dir.odin index 9ad5f451e..a2fba81e4 100644 --- a/core/os/dir.odin +++ b/core/os/dir.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" import "core:slice" diff --git a/core/os/dir_js.odin b/core/os/dir_js.odin index d8f7c6202..8c45cf63b 100644 --- a/core/os/dir_js.odin +++ b/core/os/dir_js.odin @@ -1,6 +1,6 @@ #+build js wasm32, js wasm64p32 #+private -package os2 +package os import "base:intrinsics" diff --git a/core/os/dir_linux.odin b/core/os/dir_linux.odin index 34346c02f..1ca2ef9b4 100644 --- a/core/os/dir_linux.odin +++ b/core/os/dir_linux.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "core:sys/linux" diff --git a/core/os/dir_posix.odin b/core/os/dir_posix.odin index d9fa16f8d..c67a37430 100644 --- a/core/os/dir_posix.odin +++ b/core/os/dir_posix.odin @@ -1,6 +1,6 @@ #+private #+build darwin, netbsd, freebsd, openbsd -package os2 +package os import "core:sys/posix" diff --git a/core/os/dir_posix_darwin.odin b/core/os/dir_posix_darwin.odin index 3cae50d25..e67c917b4 100644 --- a/core/os/dir_posix_darwin.odin +++ b/core/os/dir_posix_darwin.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "core:sys/darwin" diff --git a/core/os/dir_walker.odin b/core/os/dir_walker.odin index 4dce884a8..b510b7a2a 100644 --- a/core/os/dir_walker.odin +++ b/core/os/dir_walker.odin @@ -1,4 +1,4 @@ -package os2 +package os import "core:container/queue" diff --git a/core/os/dir_wasi.odin b/core/os/dir_wasi.odin index 9804f07fd..05d74be31 100644 --- a/core/os/dir_wasi.odin +++ b/core/os/dir_wasi.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "core:slice" import "base:intrinsics" diff --git a/core/os/dir_windows.odin b/core/os/dir_windows.odin index a4dadca75..1168fe18b 100644 --- a/core/os/dir_windows.odin +++ b/core/os/dir_windows.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" import "core:time" diff --git a/core/os/doc.odin b/core/os/doc.odin index 2ebdd0912..effb5582c 100644 --- a/core/os/doc.odin +++ b/core/os/doc.odin @@ -1,6 +1,6 @@ -// Package os provides a platform-independent interface to operating system functionality. +// package os_old provides a platform-independent interface to operating system functionality. // The design is UNIX-like but with Odin-like error handling. Failing calls return values with a specific error type rather than error number. // -// The package os interface is intended to be uniform across all operating systems. +// The package os_old interface is intended to be uniform across all operating systems. // Features not generally available appear in the system-specific packages under core:sys/*. -package os2 +package os diff --git a/core/os/env.odin b/core/os/env.odin index 310d45af1..0b8138e6b 100644 --- a/core/os/env.odin +++ b/core/os/env.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" import "core:strings" diff --git a/core/os/env_js.odin b/core/os/env_js.odin index c1d94ba4a..644af61bd 100644 --- a/core/os/env_js.odin +++ b/core/os/env_js.odin @@ -1,6 +1,6 @@ #+build js wasm32, js wasm64p32 #+private -package os2 +package os import "base:runtime" diff --git a/core/os/env_linux.odin b/core/os/env_linux.odin index 7855fbfed..e55c59293 100644 --- a/core/os/env_linux.odin +++ b/core/os/env_linux.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" import "base:intrinsics" diff --git a/core/os/env_posix.odin b/core/os/env_posix.odin index 72a1daf18..5d46cf7fc 100644 --- a/core/os/env_posix.odin +++ b/core/os/env_posix.odin @@ -1,6 +1,6 @@ #+private #+build darwin, netbsd, freebsd, openbsd -package os2 +package os import "base:runtime" diff --git a/core/os/env_wasi.odin b/core/os/env_wasi.odin index cb40667cf..03a56421d 100644 --- a/core/os/env_wasi.odin +++ b/core/os/env_wasi.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/env_windows.odin b/core/os/env_windows.odin index d389f8860..dfbc5c454 100644 --- a/core/os/env_windows.odin +++ b/core/os/env_windows.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import win32 "core:sys/windows" import "base:runtime" diff --git a/core/os/errors.odin b/core/os/errors.odin index 508d824b3..a60233f09 100644 --- a/core/os/errors.odin +++ b/core/os/errors.odin @@ -1,4 +1,4 @@ -package os2 +package os import "core:io" import "base:runtime" diff --git a/core/os/errors_js.odin b/core/os/errors_js.odin index c92d36736..34779807d 100644 --- a/core/os/errors_js.odin +++ b/core/os/errors_js.odin @@ -1,6 +1,6 @@ #+build js wasm32, js wasm64p32 #+private -package os2 +package os _Platform_Error :: enum i32 {} diff --git a/core/os/errors_linux.odin b/core/os/errors_linux.odin index a7556c306..891b4177c 100644 --- a/core/os/errors_linux.odin +++ b/core/os/errors_linux.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "core:sys/linux" diff --git a/core/os/errors_posix.odin b/core/os/errors_posix.odin index 8a9ca07df..5233fec1a 100644 --- a/core/os/errors_posix.odin +++ b/core/os/errors_posix.odin @@ -1,6 +1,6 @@ #+private #+build darwin, netbsd, freebsd, openbsd -package os2 +package os import "core:sys/posix" diff --git a/core/os/errors_wasi.odin b/core/os/errors_wasi.odin index b88e5b81e..a0377ce96 100644 --- a/core/os/errors_wasi.odin +++ b/core/os/errors_wasi.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/errors_windows.odin b/core/os/errors_windows.odin index 404560f98..639780337 100644 --- a/core/os/errors_windows.odin +++ b/core/os/errors_windows.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" import "core:slice" diff --git a/core/os/file.odin b/core/os/file.odin index bf7ebaeb5..61582c528 100644 --- a/core/os/file.odin +++ b/core/os/file.odin @@ -1,4 +1,4 @@ -package os2 +package os import "core:io" import "core:time" diff --git a/core/os/file_js.odin b/core/os/file_js.odin index 91ee7f02e..5d921c9b0 100644 --- a/core/os/file_js.odin +++ b/core/os/file_js.odin @@ -1,6 +1,6 @@ #+build js wasm32, js wasm64p32 #+private -package os2 +package os import "base:runtime" diff --git a/core/os/file_linux.odin b/core/os/file_linux.odin index f5f2ebdd7..d4223ba5d 100644 --- a/core/os/file_linux.odin +++ b/core/os/file_linux.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" import "core:io" diff --git a/core/os/file_posix.odin b/core/os/file_posix.odin index ef53bf116..006f25e11 100644 --- a/core/os/file_posix.odin +++ b/core/os/file_posix.odin @@ -1,6 +1,6 @@ #+private #+build darwin, netbsd, freebsd, openbsd -package os2 +package os import "base:runtime" diff --git a/core/os/file_posix_darwin.odin b/core/os/file_posix_darwin.odin index 521fb345b..5522124ae 100644 --- a/core/os/file_posix_darwin.odin +++ b/core/os/file_posix_darwin.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/file_posix_freebsd.odin b/core/os/file_posix_freebsd.odin index 05d031930..4ed9ecc1e 100644 --- a/core/os/file_posix_freebsd.odin +++ b/core/os/file_posix_freebsd.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/file_posix_netbsd.odin b/core/os/file_posix_netbsd.odin index f96c227ba..791836c00 100644 --- a/core/os/file_posix_netbsd.odin +++ b/core/os/file_posix_netbsd.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/file_posix_other.odin b/core/os/file_posix_other.odin index 8871a0062..6430c9fb6 100644 --- a/core/os/file_posix_other.odin +++ b/core/os/file_posix_other.odin @@ -1,6 +1,6 @@ #+private #+build openbsd -package os2 +package os import "base:runtime" diff --git a/core/os/file_stream.odin b/core/os/file_stream.odin index af6e50921..cee1bef47 100644 --- a/core/os/file_stream.odin +++ b/core/os/file_stream.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:intrinsics" import "base:runtime" diff --git a/core/os/file_util.odin b/core/os/file_util.odin index f81dc2190..505432338 100644 --- a/core/os/file_util.odin +++ b/core/os/file_util.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" import "core:strconv" diff --git a/core/os/file_wasi.odin b/core/os/file_wasi.odin index 78aa90699..116c237d6 100644 --- a/core/os/file_wasi.odin +++ b/core/os/file_wasi.odin @@ -1,6 +1,6 @@ #+feature global-context #+private -package os2 +package os import "base:runtime" diff --git a/core/os/file_windows.odin b/core/os/file_windows.odin index 0e3448dd7..3a9e90fed 100644 --- a/core/os/file_windows.odin +++ b/core/os/file_windows.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/heap.odin b/core/os/heap.odin index b1db54dc7..356e60b4d 100644 --- a/core/os/heap.odin +++ b/core/os/heap.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" diff --git a/core/os/heap_js.odin b/core/os/heap_js.odin index 15990b517..5f8d9bd35 100644 --- a/core/os/heap_js.odin +++ b/core/os/heap_js.odin @@ -1,6 +1,6 @@ #+build js wasm32, js wasm64p32 #+private -package os2 +package os import "base:runtime" diff --git a/core/os/heap_linux.odin b/core/os/heap_linux.odin index 1d1f12726..69c2b6edf 100644 --- a/core/os/heap_linux.odin +++ b/core/os/heap_linux.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/heap_posix.odin b/core/os/heap_posix.odin index 1b52aed75..5bff96de6 100644 --- a/core/os/heap_posix.odin +++ b/core/os/heap_posix.odin @@ -1,6 +1,6 @@ #+private #+build darwin, netbsd, freebsd, openbsd -package os2 +package os import "base:runtime" diff --git a/core/os/heap_wasi.odin b/core/os/heap_wasi.odin index 7da3c4845..066a43f85 100644 --- a/core/os/heap_wasi.odin +++ b/core/os/heap_wasi.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/heap_windows.odin b/core/os/heap_windows.odin index 7fd4529a0..e0e62a91f 100644 --- a/core/os/heap_windows.odin +++ b/core/os/heap_windows.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "core:mem" import win32 "core:sys/windows" diff --git a/core/os/internal_util.odin b/core/os/internal_util.odin index 9616af8b0..a279e9bee 100644 --- a/core/os/internal_util.odin +++ b/core/os/internal_util.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:intrinsics" import "base:runtime" diff --git a/core/os/old/dir_unix.odin b/core/os/old/dir_unix.odin index c3dd844ef..6d2a44626 100644 --- a/core/os/old/dir_unix.odin +++ b/core/os/old/dir_unix.odin @@ -1,5 +1,5 @@ #+build darwin, linux, netbsd, freebsd, openbsd, haiku -package os +package os_old_old import "core:strings" diff --git a/core/os/old/dir_windows.odin b/core/os/old/dir_windows.odin index 40f4b9e9b..b81787872 100644 --- a/core/os/old/dir_windows.odin +++ b/core/os/old/dir_windows.odin @@ -1,4 +1,4 @@ -package os +package os_old import win32 "core:sys/windows" import "core:strings" diff --git a/core/os/old/env_windows.odin b/core/os/old/env_windows.odin index ef658b0a1..f9480340c 100644 --- a/core/os/old/env_windows.odin +++ b/core/os/old/env_windows.odin @@ -1,4 +1,4 @@ -package os +package os_old import win32 "core:sys/windows" import "base:runtime" diff --git a/core/os/old/errors.odin b/core/os/old/errors.odin index fcf70ec74..a6632fe1e 100644 --- a/core/os/old/errors.odin +++ b/core/os/old/errors.odin @@ -1,4 +1,4 @@ -package os +package os_old import "base:intrinsics" import "base:runtime" diff --git a/core/os/old/os.odin b/core/os/old/os.odin index da7b0c151..01e93126d 100644 --- a/core/os/old/os.odin +++ b/core/os/old/os.odin @@ -1,5 +1,5 @@ // Cross-platform `OS` interactions like file `I/O`. -package os +package os_old import "base:intrinsics" import "base:runtime" diff --git a/core/os/old/os_darwin.odin b/core/os/old/os_darwin.odin index 92a636255..6a6efe4e2 100644 --- a/core/os/old/os_darwin.odin +++ b/core/os/old/os_darwin.odin @@ -1,4 +1,4 @@ -package os +package os_old foreign import dl "system:dl" foreign import libc "system:System" diff --git a/core/os/old/os_essence.odin b/core/os/old/os_essence.odin index 75c4c1156..8156bb496 100644 --- a/core/os/old/os_essence.odin +++ b/core/os/old/os_essence.odin @@ -1,4 +1,4 @@ -package os +package os_old import "core:sys/es" diff --git a/core/os/old/os_freebsd.odin b/core/os/old/os_freebsd.odin index 82b5a2f0f..a1ecf2aff 100644 --- a/core/os/old/os_freebsd.odin +++ b/core/os/old/os_freebsd.odin @@ -1,4 +1,4 @@ -package os +package os_old foreign import dl "system:dl" foreign import libc "system:c" diff --git a/core/os/old/os_freestanding.odin b/core/os/old/os_freestanding.odin index c22a6d7d5..def000aae 100644 --- a/core/os/old/os_freestanding.odin +++ b/core/os/old/os_freestanding.odin @@ -1,4 +1,4 @@ #+build freestanding -package os +package os_old -#panic("package os does not support a freestanding target") +#panic("package os_old does not support a freestanding target") diff --git a/core/os/old/os_haiku.odin b/core/os/old/os_haiku.odin index ad984e33c..a85f2d5c1 100644 --- a/core/os/old/os_haiku.odin +++ b/core/os/old/os_haiku.odin @@ -1,4 +1,4 @@ -package os +package os_old foreign import lib "system:c" diff --git a/core/os/old/os_js.odin b/core/os/old/os_js.odin index 1870218d3..cefabbf4d 100644 --- a/core/os/old/os_js.odin +++ b/core/os/old/os_js.odin @@ -1,5 +1,5 @@ #+build js -package os +package os_old foreign import "odin_env" diff --git a/core/os/old/os_linux.odin b/core/os/old/os_linux.odin index 4c32676c6..504f6f5b3 100644 --- a/core/os/old/os_linux.odin +++ b/core/os/old/os_linux.odin @@ -1,4 +1,4 @@ -package os +package os_old foreign import dl "system:dl" foreign import libc "system:c" @@ -7,19 +7,8 @@ import "base:runtime" import "core:strings" import "core:c" import "core:strconv" - -// NOTE(flysand): For compatibility we'll make core:os package -// depend on the old (scheduled for removal) linux package. -// Seeing that there are plans for os2, I'm imagining that *that* -// package should inherit the new sys functionality. -// The reasons for these are as follows: -// 1. It's very hard to update this package without breaking *a lot* of code. -// 2. os2 is not stable anyways, so we can break compatibility all we want -// It might be weird to bring up compatibility when Odin in it's nature isn't -// all that about compatibility. But we don't want to push experimental changes -// and have people's code break while it's still work in progress. -import unix "core:sys/unix" -import linux "core:sys/linux" +import "core:sys/unix" +import "core:sys/linux" Handle :: distinct i32 Pid :: distinct i32 diff --git a/core/os/old/os_netbsd.odin b/core/os/old/os_netbsd.odin index 640ea46cd..601e42199 100644 --- a/core/os/old/os_netbsd.odin +++ b/core/os/old/os_netbsd.odin @@ -1,4 +1,4 @@ -package os +package os_old foreign import dl "system:dl" foreign import libc "system:c" diff --git a/core/os/old/os_openbsd.odin b/core/os/old/os_openbsd.odin index bf89a21f4..95d431134 100644 --- a/core/os/old/os_openbsd.odin +++ b/core/os/old/os_openbsd.odin @@ -1,4 +1,4 @@ -package os +package os_old foreign import libc "system:c" diff --git a/core/os/old/os_wasi.odin b/core/os/old/os_wasi.odin index fe0a1fb3e..287034957 100644 --- a/core/os/old/os_wasi.odin +++ b/core/os/old/os_wasi.odin @@ -1,4 +1,4 @@ -package os +package os_old import "core:sys/wasm/wasi" import "base:runtime" diff --git a/core/os/old/os_windows.odin b/core/os/old/os_windows.odin index cb7e42f67..8081d9726 100644 --- a/core/os/old/os_windows.odin +++ b/core/os/old/os_windows.odin @@ -1,5 +1,5 @@ #+build windows -package os +package os_old import win32 "core:sys/windows" import "base:runtime" diff --git a/core/os/old/stat.odin b/core/os/old/stat.odin index 21a4961d1..fad8ff755 100644 --- a/core/os/old/stat.odin +++ b/core/os/old/stat.odin @@ -1,4 +1,4 @@ -package os +package os_old import "core:time" diff --git a/core/os/old/stat_unix.odin b/core/os/old/stat_unix.odin index 648987a07..0f7be62e2 100644 --- a/core/os/old/stat_unix.odin +++ b/core/os/old/stat_unix.odin @@ -1,5 +1,5 @@ #+build linux, darwin, freebsd, openbsd, netbsd, haiku -package os +package os_old import "core:time" diff --git a/core/os/old/stat_windows.odin b/core/os/old/stat_windows.odin index 662c9f9e6..34e5e1695 100644 --- a/core/os/old/stat_windows.odin +++ b/core/os/old/stat_windows.odin @@ -1,4 +1,4 @@ -package os +package os_old import "core:time" import "base:runtime" diff --git a/core/os/old/stream.odin b/core/os/old/stream.odin index f4e9bcdde..d94505505 100644 --- a/core/os/old/stream.odin +++ b/core/os/old/stream.odin @@ -1,4 +1,4 @@ -package os +package os_old import "core:io" diff --git a/core/os/path.odin b/core/os/path.odin index ac18b7562..e0353e43d 100644 --- a/core/os/path.odin +++ b/core/os/path.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" import "core:slice" diff --git a/core/os/path_darwin.odin b/core/os/path_darwin.odin index 65aaf1e95..dbfdb584b 100644 --- a/core/os/path_darwin.odin +++ b/core/os/path_darwin.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" diff --git a/core/os/path_freebsd.odin b/core/os/path_freebsd.odin index e7e4f63c9..5ec43466e 100644 --- a/core/os/path_freebsd.odin +++ b/core/os/path_freebsd.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" diff --git a/core/os/path_js.odin b/core/os/path_js.odin index 0c0d1424b..6ac845560 100644 --- a/core/os/path_js.odin +++ b/core/os/path_js.odin @@ -1,6 +1,6 @@ #+build js wasm32, js wasm64p32 #+private -package os2 +package os import "base:runtime" diff --git a/core/os/path_linux.odin b/core/os/path_linux.odin index 1c9927843..ca68fffb1 100644 --- a/core/os/path_linux.odin +++ b/core/os/path_linux.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/path_netbsd.odin b/core/os/path_netbsd.odin index 815102dea..a9ceb13df 100644 --- a/core/os/path_netbsd.odin +++ b/core/os/path_netbsd.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" diff --git a/core/os/path_openbsd.odin b/core/os/path_openbsd.odin index cbc0346d4..55b6b7d1f 100644 --- a/core/os/path_openbsd.odin +++ b/core/os/path_openbsd.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" diff --git a/core/os/path_posix.odin b/core/os/path_posix.odin index 173cb6b6d..a877af3e6 100644 --- a/core/os/path_posix.odin +++ b/core/os/path_posix.odin @@ -1,6 +1,6 @@ #+private #+build darwin, netbsd, freebsd, openbsd -package os2 +package os import "base:runtime" diff --git a/core/os/path_posixfs.odin b/core/os/path_posixfs.odin index 0736e73d1..aea89c60a 100644 --- a/core/os/path_posixfs.odin +++ b/core/os/path_posixfs.odin @@ -1,6 +1,6 @@ #+private #+build linux, darwin, netbsd, freebsd, openbsd, wasi -package os2 +package os // This implementation is for all systems that have POSIX-compliant filesystem paths. diff --git a/core/os/path_wasi.odin b/core/os/path_wasi.odin index f26e16158..aa7740497 100644 --- a/core/os/path_wasi.odin +++ b/core/os/path_wasi.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/path_windows.odin b/core/os/path_windows.odin index 275fe3e18..6ccab1dab 100644 --- a/core/os/path_windows.odin +++ b/core/os/path_windows.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" import "core:strings" diff --git a/core/os/pipe.odin b/core/os/pipe.odin index 5d3e8368e..5254f9469 100644 --- a/core/os/pipe.odin +++ b/core/os/pipe.odin @@ -1,4 +1,4 @@ -package os2 +package os /* Create an anonymous pipe. @@ -15,7 +15,7 @@ process, that end of the pipe needs to be closed by the parent, before any data is attempted to be read. Although pipes look like files and is compatible with most file APIs in package -os2, the way it's meant to be read is different. Due to asynchronous nature of +os, the way it's meant to be read is different. Due to asynchronous nature of the communication channel, the data may not be present at the time of a read request. The other scenario is when a pipe has no data because the other end of the pipe was closed by the child process. diff --git a/core/os/pipe_js.odin b/core/os/pipe_js.odin index 253228f86..aea5e9a83 100644 --- a/core/os/pipe_js.odin +++ b/core/os/pipe_js.odin @@ -1,6 +1,6 @@ #+build js wasm32, js wasm64p32 #+private -package os2 +package os _pipe :: proc() -> (r, w: ^File, err: Error) { err = .Unsupported diff --git a/core/os/pipe_linux.odin b/core/os/pipe_linux.odin index bb4456e1c..561f82f80 100644 --- a/core/os/pipe_linux.odin +++ b/core/os/pipe_linux.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "core:sys/linux" diff --git a/core/os/pipe_posix.odin b/core/os/pipe_posix.odin index 7c07bc068..e811e306f 100644 --- a/core/os/pipe_posix.odin +++ b/core/os/pipe_posix.odin @@ -1,6 +1,6 @@ #+private #+build darwin, netbsd, freebsd, openbsd -package os2 +package os import "core:sys/posix" import "core:strings" diff --git a/core/os/pipe_wasi.odin b/core/os/pipe_wasi.odin index 19c11b51d..e27c9419e 100644 --- a/core/os/pipe_wasi.odin +++ b/core/os/pipe_wasi.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os _pipe :: proc() -> (r, w: ^File, err: Error) { err = .Unsupported diff --git a/core/os/pipe_windows.odin b/core/os/pipe_windows.odin index d6dc47c9c..4e627e26a 100644 --- a/core/os/pipe_windows.odin +++ b/core/os/pipe_windows.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import win32 "core:sys/windows" diff --git a/core/os/process.odin b/core/os/process.odin index e4fecf2a5..9cdaf0457 100644 --- a/core/os/process.odin +++ b/core/os/process.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" diff --git a/core/os/process_freebsd.odin b/core/os/process_freebsd.odin index 8a31eb62c..ccc2549db 100644 --- a/core/os/process_freebsd.odin +++ b/core/os/process_freebsd.odin @@ -1,6 +1,6 @@ #+private #+build freebsd -package os2 +package os import "core:c" diff --git a/core/os/process_js.odin b/core/os/process_js.odin index a59a79d45..6283d270c 100644 --- a/core/os/process_js.odin +++ b/core/os/process_js.odin @@ -1,6 +1,6 @@ #+build js wasm32, js wasm64p32 #+private -package os2 +package os import "base:runtime" import "core:time" diff --git a/core/os/process_linux.odin b/core/os/process_linux.odin index 4afd9f3fc..cfdb6774a 100644 --- a/core/os/process_linux.odin +++ b/core/os/process_linux.odin @@ -1,6 +1,6 @@ #+build linux #+private file -package os2 +package os import "base:runtime" import "base:intrinsics" diff --git a/core/os/process_netbsd.odin b/core/os/process_netbsd.odin index b46a58e58..45ca03178 100644 --- a/core/os/process_netbsd.odin +++ b/core/os/process_netbsd.odin @@ -1,6 +1,6 @@ #+private #+build netbsd -package os2 +package os import "core:c" foreign import libc "system:c" diff --git a/core/os/process_openbsd.odin b/core/os/process_openbsd.odin index 9c6605952..5195261ff 100644 --- a/core/os/process_openbsd.odin +++ b/core/os/process_openbsd.odin @@ -1,6 +1,6 @@ #+private #+build openbsd -package os2 +package os import "core:c" diff --git a/core/os/process_posix.odin b/core/os/process_posix.odin index a48e44900..d3ec543f4 100644 --- a/core/os/process_posix.odin +++ b/core/os/process_posix.odin @@ -1,6 +1,6 @@ #+private #+build darwin, netbsd, freebsd, openbsd -package os2 +package os import "base:runtime" diff --git a/core/os/process_posix_darwin.odin b/core/os/process_posix_darwin.odin index 934d23711..a75b4ef96 100644 --- a/core/os/process_posix_darwin.odin +++ b/core/os/process_posix_darwin.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" import "base:intrinsics" diff --git a/core/os/process_posix_other.odin b/core/os/process_posix_other.odin index 65da3e9e2..85ed6cdd8 100644 --- a/core/os/process_posix_other.odin +++ b/core/os/process_posix_other.odin @@ -1,6 +1,6 @@ #+private #+build netbsd, openbsd, freebsd -package os2 +package os import "base:runtime" diff --git a/core/os/process_wasi.odin b/core/os/process_wasi.odin index efb2c0228..e18fc0524 100644 --- a/core/os/process_wasi.odin +++ b/core/os/process_wasi.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/process_windows.odin b/core/os/process_windows.odin index b2c87c4f4..e6db5b4e9 100644 --- a/core/os/process_windows.odin +++ b/core/os/process_windows.odin @@ -1,5 +1,5 @@ #+private file -package os2 +package os import "base:intrinsics" import "base:runtime" diff --git a/core/os/stat.odin b/core/os/stat.odin index 0a9ac4e57..fa92e8a8e 100644 --- a/core/os/stat.odin +++ b/core/os/stat.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" import "core:strings" diff --git a/core/os/stat_js.odin b/core/os/stat_js.odin index e37864936..bad75486b 100644 --- a/core/os/stat_js.odin +++ b/core/os/stat_js.odin @@ -1,6 +1,6 @@ #+build js wasm32, js wasm64p32 #+private -package os2 +package os import "base:runtime" diff --git a/core/os/stat_linux.odin b/core/os/stat_linux.odin index dc5bccb54..082279e8d 100644 --- a/core/os/stat_linux.odin +++ b/core/os/stat_linux.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "core:time" import "base:runtime" diff --git a/core/os/stat_posix.odin b/core/os/stat_posix.odin index e401ffe40..924860744 100644 --- a/core/os/stat_posix.odin +++ b/core/os/stat_posix.odin @@ -1,6 +1,6 @@ #+private #+build darwin, netbsd, freebsd, openbsd -package os2 +package os import "base:runtime" diff --git a/core/os/stat_wasi.odin b/core/os/stat_wasi.odin index f15479e22..5f5e6fe45 100644 --- a/core/os/stat_wasi.odin +++ b/core/os/stat_wasi.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/stat_windows.odin b/core/os/stat_windows.odin index 651029ac3..51bd57d5b 100644 --- a/core/os/stat_windows.odin +++ b/core/os/stat_windows.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" import "core:time" diff --git a/core/os/temp_file.odin b/core/os/temp_file.odin index 2c0236428..be10eb22e 100644 --- a/core/os/temp_file.odin +++ b/core/os/temp_file.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" diff --git a/core/os/temp_file_js.odin b/core/os/temp_file_js.odin index e1f2b3d95..32ce1c484 100644 --- a/core/os/temp_file_js.odin +++ b/core/os/temp_file_js.odin @@ -1,6 +1,6 @@ #+build js wasm32, js wasm64p32 #+private -package os2 +package os import "base:runtime" diff --git a/core/os/temp_file_linux.odin b/core/os/temp_file_linux.odin index 310720cbe..30f2169ad 100644 --- a/core/os/temp_file_linux.odin +++ b/core/os/temp_file_linux.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/temp_file_posix.odin b/core/os/temp_file_posix.odin index b44ea13a7..a72dc2fab 100644 --- a/core/os/temp_file_posix.odin +++ b/core/os/temp_file_posix.odin @@ -1,6 +1,6 @@ #+private #+build darwin, netbsd, freebsd, openbsd -package os2 +package os import "base:runtime" diff --git a/core/os/temp_file_wasi.odin b/core/os/temp_file_wasi.odin index d5628d300..d3fa941f7 100644 --- a/core/os/temp_file_wasi.odin +++ b/core/os/temp_file_wasi.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" diff --git a/core/os/temp_file_windows.odin b/core/os/temp_file_windows.odin index 91ea284a1..4c927134d 100644 --- a/core/os/temp_file_windows.odin +++ b/core/os/temp_file_windows.odin @@ -1,5 +1,5 @@ #+private -package os2 +package os import "base:runtime" import win32 "core:sys/windows" diff --git a/core/os/user.odin b/core/os/user.odin index e2a4ec4d0..8e952477d 100644 --- a/core/os/user.odin +++ b/core/os/user.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" diff --git a/core/os/user_posix.odin b/core/os/user_posix.odin index fa173f129..355a2e3cd 100644 --- a/core/os/user_posix.odin +++ b/core/os/user_posix.odin @@ -1,5 +1,5 @@ #+build !windows -package os2 +package os import "base:intrinsics" import "base:runtime" diff --git a/core/os/user_windows.odin b/core/os/user_windows.odin index 75d0ba6ac..6f7b74d6d 100644 --- a/core/os/user_windows.odin +++ b/core/os/user_windows.odin @@ -1,4 +1,4 @@ -package os2 +package os import "base:runtime" @(require) import win32 "core:sys/windows" diff --git a/tests/core/io/test_core_io.odin b/tests/core/io/test_core_io.odin index 301e7bb94..728771b1b 100644 --- a/tests/core/io/test_core_io.odin +++ b/tests/core/io/test_core_io.odin @@ -539,7 +539,7 @@ test_string_builder_stream :: proc(t: ^testing.T) { } @test -test_os2_file_stream :: proc(t: ^testing.T) { +test_os_file_stream :: proc(t: ^testing.T) { defer if !testing.failed(t) { testing.expect_value(t, os.remove(TEMPORARY_FILENAME), nil) } @@ -549,7 +549,7 @@ test_os2_file_stream :: proc(t: ^testing.T) { buf[i] = 'A' + i } - TEMPORARY_FILENAME :: "test_core_io_os2_file_stream" + TEMPORARY_FILENAME :: "test_core_io_os_file_stream" fd, open_err := os.open(TEMPORARY_FILENAME, {.Read, .Write, .Create, .Trunc}) if !testing.expectf(t, open_err == nil, "error on opening %q: %v", TEMPORARY_FILENAME, open_err) { @@ -570,7 +570,7 @@ test_os2_file_stream :: proc(t: ^testing.T) { return } - // os2 file stream proc close and destroy are the same. + // os file stream proc close and destroy are the same. results, _ := _test_stream(t, stream, buf[:], do_destroy = false) log.debugf("%#v", results) @@ -638,7 +638,7 @@ test_bufio_buffered_reader :: proc(t: ^testing.T) { @test test_bufio_buffered_read_writer :: proc(t: ^testing.T) { - // Using an os2.File as the backing stream for both reader & writer. + // Using an os.File as the backing stream for both reader & writer. defer if !testing.failed(t) { testing.expect_value(t, os.remove(TEMPORARY_FILENAME), nil) @@ -649,7 +649,7 @@ test_bufio_buffered_read_writer :: proc(t: ^testing.T) { buf[i] = 'A' + i } - TEMPORARY_FILENAME :: "test_core_io_bufio_read_writer_os2_file_stream" + TEMPORARY_FILENAME :: "test_core_io_bufio_read_writer_os_file_stream" fd, open_err := os.open(TEMPORARY_FILENAME, {.Read, .Write, .Create, .Trunc}) if !testing.expectf(t, open_err == nil, "error on opening %q: %v", TEMPORARY_FILENAME, open_err) { @@ -671,7 +671,7 @@ test_bufio_buffered_read_writer :: proc(t: ^testing.T) { return } - // bufio.Read_Writer isn't capable of seeking, so we have to reset the os2 + // bufio.Read_Writer isn't capable of seeking, so we have to reset the os // stream back to the start here. pos, seek_err := io.seek(stream, 0, .Start) if !testing.expectf(t, pos == 0 && seek_err == nil, From 7a7127aa13e86c29f2783e79732332edad8c514e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Feb 2026 16:34:24 +0100 Subject: [PATCH 400/766] Fix package line --- core/os/old/dir_unix.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/os/old/dir_unix.odin b/core/os/old/dir_unix.odin index 6d2a44626..95cc887d6 100644 --- a/core/os/old/dir_unix.odin +++ b/core/os/old/dir_unix.odin @@ -1,5 +1,5 @@ #+build darwin, linux, netbsd, freebsd, openbsd, haiku -package os_old_old +package os_old import "core:strings" From ec05bb57dcde41428b27003dec674dcce87446af Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Feb 2026 18:16:16 +0100 Subject: [PATCH 401/766] Implement `get_processor_core_count` without libc for Linux. --- core/os/process_linux.odin | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/os/process_linux.odin b/core/os/process_linux.odin index cfdb6774a..7f5608a51 100644 --- a/core/os/process_linux.odin +++ b/core/os/process_linux.odin @@ -57,8 +57,15 @@ _get_current_thread_id :: proc "contextless" () -> int { } @(private="package") -_get_processor_core_count :: proc() -> int { - return int(_unix_get_nprocs()) +_get_processor_core_count :: proc() -> (core_count: int) { + cpu_set: [128]u64 + + if err := linux.sched_getaffinity(0, size_of(cpu_set), &cpu_set); err != linux.Errno(-1) { + for set in cpu_set { + core_count += int(intrinsics.count_ones(set)) + } + } + return } @(private="package") From fa44c64c42c6f627f27c9b42cf2d79061d483946 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Feb 2026 18:29:31 +0100 Subject: [PATCH 402/766] != nil --- core/os/process_linux.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/os/process_linux.odin b/core/os/process_linux.odin index 7f5608a51..0f387f01f 100644 --- a/core/os/process_linux.odin +++ b/core/os/process_linux.odin @@ -60,7 +60,7 @@ _get_current_thread_id :: proc "contextless" () -> int { _get_processor_core_count :: proc() -> (core_count: int) { cpu_set: [128]u64 - if err := linux.sched_getaffinity(0, size_of(cpu_set), &cpu_set); err != linux.Errno(-1) { + if err := linux.sched_getaffinity(0, size_of(cpu_set), &cpu_set); err != nil { for set in cpu_set { core_count += int(intrinsics.count_ones(set)) } From 454ad1f4b82abd781e44bf10e149d8f1ea468a79 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Feb 2026 19:01:43 +0100 Subject: [PATCH 403/766] Unwrap cpu affinity syscalls. --- core/os/process_linux.odin | 2 +- core/sys/linux/sys.odin | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/os/process_linux.odin b/core/os/process_linux.odin index 0f387f01f..1d14c4b1f 100644 --- a/core/os/process_linux.odin +++ b/core/os/process_linux.odin @@ -60,7 +60,7 @@ _get_current_thread_id :: proc "contextless" () -> int { _get_processor_core_count :: proc() -> (core_count: int) { cpu_set: [128]u64 - if err := linux.sched_getaffinity(0, size_of(cpu_set), &cpu_set); err != nil { + if _, err := linux.sched_getaffinity(0, size_of(cpu_set), &cpu_set); err == nil { for set in cpu_set { core_count += int(intrinsics.count_ones(set)) } diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index 392761e1d..6e9c8ab91 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -2616,9 +2616,9 @@ futex :: proc{ If you are running on a system with less than 128 cores you can use `linux.Cpu_Set` as the type for the mask argument. Otherwise use an array of integers. */ -sched_setaffinity :: proc "contextless" (pid: Pid, cpusetsize: uint, mask: rawptr) -> (Errno) { +sched_setaffinity :: proc "contextless" (pid: Pid, cpusetsize: uint, mask: rawptr) -> (int, Errno) { ret := syscall(SYS_sched_setaffinity, pid, cpusetsize, mask) - return Errno(-ret) + return errno_unwrap(ret, int) } /* @@ -2628,9 +2628,9 @@ sched_setaffinity :: proc "contextless" (pid: Pid, cpusetsize: uint, mask: rawpt If you are running on a system with less than 128 cores you can use `linux.Cpu_Set` as the type for the mask argument. Otherwise use an array of integers. */ -sched_getaffinity :: proc "contextless" (pid: Pid, cpusetsize: uint, mask: rawptr) -> (Errno) { +sched_getaffinity :: proc "contextless" (pid: Pid, cpusetsize: uint, mask: rawptr) -> (int, Errno) { ret := syscall(SYS_sched_getaffinity, pid, cpusetsize, mask) - return Errno(-ret) + return errno_unwrap(ret, int) } // TODO(flysand): set_thread_area From 1a37f4eb0cc792783784fca216c79e3f02a3234e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Feb 2026 19:13:32 +0100 Subject: [PATCH 404/766] Only count bits in touched array members. --- core/os/process_linux.odin | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/os/process_linux.odin b/core/os/process_linux.odin index 1d14c4b1f..7041e16b7 100644 --- a/core/os/process_linux.odin +++ b/core/os/process_linux.odin @@ -59,9 +59,8 @@ _get_current_thread_id :: proc "contextless" () -> int { @(private="package") _get_processor_core_count :: proc() -> (core_count: int) { cpu_set: [128]u64 - - if _, err := linux.sched_getaffinity(0, size_of(cpu_set), &cpu_set); err == nil { - for set in cpu_set { + if n, err := linux.sched_getaffinity(0, size_of(cpu_set), &cpu_set); err == nil { + for set in cpu_set[:n / 8] { core_count += int(intrinsics.count_ones(set)) } } From 5a02132ac31696e5b6422939bd60a36f823f7ffb Mon Sep 17 00:00:00 2001 From: laytan Date: Mon, 9 Feb 2026 19:48:27 +0100 Subject: [PATCH 405/766] fix box2d build and try git LFS --- .gitattributes | 5 +++-- vendor/box2d/lib/box2d_windows_amd64_avx2.lib | Bin 1000940 -> 131 bytes vendor/box2d/lib/box2d_windows_amd64_sse2.lib | Bin 1000416 -> 131 bytes 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index e58996311..cf3203d4a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,7 @@ *.odin linguist-language=Odin * text=auto - # These files must always have *nix line-endings Makefile text eol=lf -*.sh text eol=lf \ No newline at end of file +*.sh text eol=lf +vendor/box2d/lib/box2d_windows_amd64_avx2.lib filter=lfs diff=lfs merge=lfs -text +vendor/box2d/lib/box2d_windows_amd64_sse2.lib filter=lfs diff=lfs merge=lfs -text diff --git a/vendor/box2d/lib/box2d_windows_amd64_avx2.lib b/vendor/box2d/lib/box2d_windows_amd64_avx2.lib index e8a92b0653401160bea1324aa735aeb9ede2a94e..05e5b90a3907cdc62b3cad4df90e19d06f49eb94 100644 GIT binary patch literal 131 zcmXR*Eh^5;&r`@KDJdwn($`PVEYZzLE7nWTEXgQM(o4?I)h{kcP1Y|n#8hHa0LZ;Q|0ax+v`c literal 1000940 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 z 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

      (lZGPi`7{+z&{>Z=mgm3o` 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 >dmTsDL&ZKzRd8I|1%2 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

      O!5 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 z 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 literal 1000416 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

      Q6cMNe1MXYq(2}*gc-48sHZ~1h; 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

      ;W}m5or*l1Ed(_H;8E< zw?J5+@PL>LG842~4Wtr;A@ZntKs{v8OyUC5vTv(@hk4vPUhWccbLEDG(jPZ{{M2!@ z|M-e?Es;?RUnkCavj0HNq}9n`YSH`WUdVZIX4Wm1!s3mU7i`)8Z@#_DRCW5C*j3Y$ zx>yxsO{ChxHpl2#Om8~w7;OC~@b>dpZC-Y~8}@yjlPqL^y7Mxtr2kwP-J~Qn)9300 zQ`7BAKcC91s9)d}7@9Tr>rrz)hR8yp8JBWTyQ_&G39R1E5PHb*e(7Erwb<}z-@pU; zO24`o%Pu#Vrqo>Qk^JHjwXy2k+%Hv1RsAkgmCJSKp3d-|{^9u4_13amlJ&xbk}O?g zRD3R9xpz7G$o@H7{%wZw+1DHXvxtrQ`?}prH$2QDUz4%v!l%CrC&A>!Hny5SAN&*ow2J_$)oM|zoc1{rs>S{_sw_v<-4Kx#NJia z&-EP^vF?`E-_u*RH15a|bJyz%xpiI7Ra&+v+kYrJZlJL!&iU_TZUyD2V=m4=CkcL( zQEYvqqy1FJ`hm(?zu1{oU%K6Y_ugi|lJkJ2=*8{h!tN^aK~Fl*JbB@^`~}Rt9J4(n z)vrF9maQ*av(07gB()pXH+A!VJjg1Xxzzt*s6^5$>xYw6Pw~V28@Wx~jPqhUD>^@A z^)=3ORhs_)!i#lc)SFHjJ(nqlx>+ALEUc@B`C-Kf=p*-1eGlyHNtbB`GaT(2IWQ&3#^@SQbm})>ZI5Q(?g)~Ub=I

      A?rku&0z<*i4oM20J&om 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%0AYdb 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 Date: Mon, 9 Feb 2026 20:08:22 +0100 Subject: [PATCH 406/766] import cleanup --- core/math/math_sincos.odin | 28 +++++++++++++---- core/slice/slice.odin | 4 +-- core/sort/sort.odin | 4 +-- core/sys/wasm/js/memory_all_targets.odin | 6 ++-- core/sys/wasm/js/memory_js.odin | 12 ++++---- core/sys/windows/gdi32.odin | 4 +-- vendor/raylib/raylib.odin | 39 +++++++++++------------- 7 files changed, 52 insertions(+), 45 deletions(-) diff --git a/core/math/math_sincos.odin b/core/math/math_sincos.odin index 9b4d3de40..a17f39fe5 100644 --- a/core/math/math_sincos.odin +++ b/core/math/math_sincos.odin @@ -1,6 +1,6 @@ package math -import "core:math/bits" +import "base:intrinsics" // The original C code, the long comment, and the constants // below were from http://netlib.sandia.gov/cephes/cmath/sin.c, @@ -280,16 +280,16 @@ _trig_reduce_f64 :: proc "contextless" (x: f64) -> (j: u64, z: f64) #no_bounds_c z1 := (bd_pi4[digit+1] << bitshift) | (bd_pi4[digit+2] >> (64 - bitshift)) z2 := (bd_pi4[digit+2] << bitshift) | (bd_pi4[digit+3] >> (64 - bitshift)) // Multiply mantissa by the digits and extract the upper two digits (hi, lo). - z2hi, _ := bits.mul(z2, ix) - z1hi, z1lo := bits.mul(z1, ix) + z2hi, _ := mul_u64(z2, ix) + z1hi, z1lo := mul_u64(z1, ix) z0lo := z0 * ix - lo, c := bits.add(z1lo, z2hi, 0) - hi, _ := bits.add(z0lo, z1hi, c) + lo, c := add_u64(z1lo, z2hi, 0) + hi, _ := add_u64(z0lo, z1hi, c) // The top 3 bits are j. j = hi >> 61 // Extract the fraction and find its magnitude. hi = hi<<3 | lo>>61 - lz := uint(bits.leading_zeros(hi)) + lz := uint(intrinsics.count_leading_zeros(hi)) e := u64(BIAS - (lz + 1)) // Clear implicit mantissa bit and shift into place. hi = (hi << (lz + 1)) | (lo >> (64 - (lz + 1))) @@ -305,4 +305,20 @@ _trig_reduce_f64 :: proc "contextless" (x: f64) -> (j: u64, z: f64) #no_bounds_c } // Multiply the fractional part by pi/4. return j, z * PI4 + + @(require_results) + add_u64 :: proc "contextless" (x, y, carry: u64) -> (sum, carry_out: u64) { + tmp_carry, tmp_carry2: bool + sum, tmp_carry = intrinsics.overflow_add(x, y) + sum, tmp_carry2 = intrinsics.overflow_add(sum, carry) + carry_out = u64(tmp_carry | tmp_carry2) + return + } + + @(require_results) + mul_u64 :: proc "contextless" (x, y: u64) -> (hi, lo: u64) { + prod_wide := u128(x) * u128(y) + hi, lo = u64(prod_wide>>64), u64(prod_wide) + return + } } diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 12ebfce3b..0df55320b 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -3,12 +3,10 @@ package slice import "base:intrinsics" import "base:builtin" -import "core:math/bits" import "base:runtime" _ :: intrinsics _ :: builtin -_ :: bits _ :: runtime /* @@ -933,7 +931,7 @@ If `elems` is out of bounds (more than the total) this will trigger a bounds che Example: import "core:fmt" import "core:slice" - + advance_slices_example :: proc() { slices := [][]byte { {1, 2, 3, 4}, diff --git a/core/sort/sort.odin b/core/sort/sort.odin index 63cb50490..30abc5336 100644 --- a/core/sort/sort.odin +++ b/core/sort/sort.odin @@ -2,11 +2,9 @@ package sort import "core:mem" -import _slice "core:slice" import "base:intrinsics" _ :: intrinsics -_ :: _slice ORD :: intrinsics.type_is_ordered Interface :: struct { @@ -639,7 +637,7 @@ compare_f64s :: proc(a, b: f64) -> int { compare_strings :: proc(a, b: string) -> int { x := transmute(mem.Raw_String)a y := transmute(mem.Raw_String)b - + ret := mem.compare_byte_ptrs(x.data, y.data, min(x.len, y.len)) if ret == 0 && x.len != y.len { return -1 if x.len < y.len else +1 diff --git a/core/sys/wasm/js/memory_all_targets.odin b/core/sys/wasm/js/memory_all_targets.odin index e80d13c0b..69a789145 100644 --- a/core/sys/wasm/js/memory_all_targets.odin +++ b/core/sys/wasm/js/memory_all_targets.odin @@ -1,14 +1,14 @@ #+build !js package wasm_js_interface -import "core:mem" +import "base:runtime" PAGE_SIZE :: 64 * 1024 -page_alloc :: proc(page_count: int) -> (data: []byte, err: mem.Allocator_Error) { +page_alloc :: proc(page_count: int) -> (data: []byte, err: runtime.Allocator_Error) { panic("vendor:wasm/js not supported on non-js targets") } -page_allocator :: proc() -> mem.Allocator { +page_allocator :: proc() -> runtime.Allocator { panic("vendor:wasm/js not supported on non-js targets") } diff --git a/core/sys/wasm/js/memory_js.odin b/core/sys/wasm/js/memory_js.odin index 8232cd0c9..df3191b29 100644 --- a/core/sys/wasm/js/memory_js.odin +++ b/core/sys/wasm/js/memory_js.odin @@ -1,11 +1,11 @@ #+build js wasm32, js wasm64p32 package wasm_js_interface -import "core:mem" +import "base:runtime" import "base:intrinsics" PAGE_SIZE :: 64 * 1024 -page_alloc :: proc(page_count: int) -> (data: []byte, err: mem.Allocator_Error) { +page_alloc :: proc(page_count: int) -> (data: []byte, err: runtime.Allocator_Error) { prev_page_count := intrinsics.wasm_memory_grow(0, uintptr(page_count)) if prev_page_count < 0 { return nil, .Out_Of_Memory @@ -15,11 +15,11 @@ page_alloc :: proc(page_count: int) -> (data: []byte, err: mem.Allocator_Error) return ptr[:page_count * PAGE_SIZE], nil } -page_allocator :: proc() -> mem.Allocator { - procedure :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode, +page_allocator :: proc() -> runtime.Allocator { + procedure :: proc(allocator_data: rawptr, mode: runtime.Allocator_Mode, size, alignment: int, old_memory: rawptr, old_size: int, - location := #caller_location) -> ([]byte, mem.Allocator_Error) { + location := #caller_location) -> ([]byte, runtime.Allocator_Error) { switch mode { case .Alloc, .Alloc_Non_Zeroed: assert(size % PAGE_SIZE == 0) @@ -27,7 +27,7 @@ page_allocator :: proc() -> mem.Allocator { case .Resize, .Free, .Free_All, .Query_Info, .Resize_Non_Zeroed: return nil, .Mode_Not_Implemented case .Query_Features: - set := (^mem.Allocator_Mode_Set)(old_memory) + set := (^runtime.Allocator_Mode_Set)(old_memory) if set != nil { set^ = {.Alloc, .Query_Features} } diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index ad2243b56..e607aafcc 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -1,8 +1,6 @@ #+build windows package sys_windows -import "core:math/fixed" - foreign import gdi32 "system:Gdi32.lib" @(default_calling_convention="system") @@ -100,7 +98,7 @@ PALETTEINDEX :: #force_inline proc "contextless" (#any_int i: int) -> COLORREF { return COLORREF(DWORD(0x01000000) | DWORD(WORD(i))) } -FXPT2DOT30 :: distinct fixed.Fixed(i32, 30) +FXPT2DOT30 :: distinct i32 // fixed.Fixed(i32, 30) CIEXYZ :: struct { ciexyzX, ciexyzY, ciexyzZ: FXPT2DOT30, diff --git a/vendor/raylib/raylib.odin b/vendor/raylib/raylib.odin index 37589f165..b051f1885 100644 --- a/vendor/raylib/raylib.odin +++ b/vendor/raylib/raylib.odin @@ -91,9 +91,6 @@ import "core:c" import "core:fmt" import "core:mem" -import "core:math/linalg" -_ :: linalg - MAX_TEXTFORMAT_BUFFERS :: #config(RAYLIB_MAX_TEXTFORMAT_BUFFERS, 4) MAX_TEXT_BUFFER_LENGTH :: #config(RAYLIB_MAX_TEXT_BUFFER_LENGTH, 1024) MAX_MATERIAL_MAPS :: #config(RAYLIB_MAX_MATERIAL_MAPS, 12) @@ -128,7 +125,7 @@ when ODIN_OS == .Windows { "system:Cocoa.framework", "system:OpenGL.framework", "system:IOKit.framework", - } + } } else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { foreign import lib { RAYLIB_WASM_LIB, @@ -142,7 +139,7 @@ VERSION_MINOR :: 5 VERSION_PATCH :: 0 VERSION :: "5.5" -PI :: 3.14159265358979323846 +PI :: 3.14159265358979323846 DEG2RAD :: PI/180.0 RAD2DEG :: 180.0/PI @@ -235,7 +232,7 @@ RenderTexture :: struct { id: c.uint, // OpenGL framebuffer object id texture: Texture, // Color buffer attachment texture depth: Texture, // Depth buffer attachment texture -} +} // RenderTexture2D type, same as RenderTexture RenderTexture2D :: RenderTexture @@ -257,7 +254,7 @@ GlyphInfo :: struct { offsetY: c.int, // Character offset Y when drawing advanceX: c.int, // Character advance position X image: Image, // Character image data -} +} // Font type, includes texture and charSet array data Font :: struct { @@ -851,7 +848,7 @@ Gesture :: enum c.uint { } Gestures :: distinct bit_set[Gesture; c.uint] -// Camera speed values +// Camera speed values CAMERA_MOVE_SPEED :: 5.4 CAMERA_ROTATION_SPEED :: 0.03 CAMERA_PAN_SPEED :: 0.2 @@ -1029,7 +1026,7 @@ foreign lib { GetScreenToWorld2D :: proc(position: Vector2, camera: Camera2D) -> Vector2 --- // Get the world space position for a 2d camera screen space position GetCameraMatrix :: proc(camera: Camera) -> Matrix --- // Get camera transform matrix (view matrix) GetCameraMatrix2D :: proc(camera: Camera2D) -> Matrix --- // Get camera 2d transform matrix - + // Timing-related functions SetTargetFPS :: proc(fps: c.int) --- // Set target FPS (maximum) @@ -1110,7 +1107,7 @@ foreign lib { ComputeMD5 :: proc (data: rawptr, dataSize: c.int) -> [^]c.uint --- // Compute MD5 hash code, returns static int[4] (16 bytes) ComputeSHA1 :: proc(data: rawptr, dataSize: c.int) -> [^]c.uint --- // Compute SHA1 hash code, returns static int[5] (20 bytes) - + // Automation events functionality LoadAutomationEventList :: proc(fileName: cstring) -> AutomationEventList --- // Load automation events list from file, NULL for empty list, capacity = MAX_AUTOMATION_EVENTS @@ -1151,14 +1148,14 @@ foreign lib { SetGamepadMappings :: proc(mappings: cstring) -> c.int --- // Set internal gamepad mappings (SDL_GameControllerDB) SetGamepadVibration :: proc(gamepad: c.int, leftMotor: f32, rightMotor: f32, duration: f32) --- // Set gamepad vibration for both motors (duration in seconds) - + // Input-related functions: mouse IsMouseButtonPressed :: proc(button: MouseButton) -> bool --- // Detect if a mouse button has been pressed once IsMouseButtonDown :: proc(button: MouseButton) -> bool --- // Detect if a mouse button is being pressed IsMouseButtonReleased :: proc(button: MouseButton) -> bool --- // Detect if a mouse button has been released once IsMouseButtonUp :: proc(button: MouseButton) -> bool --- - + GetMouseX :: proc() -> c.int --- // Returns mouse position X GetMouseY :: proc() -> c.int --- // Returns mouse position Y GetMousePosition :: proc() -> Vector2 --- // Returns mouse position XY @@ -1226,7 +1223,7 @@ foreign lib { GetShapesTexture :: proc() -> Texture2D --- // Get texture that is used for shapes drawing GetShapesTextureRectangle :: proc() -> Rectangle --- // Get texture source rectangle that is used for shapes drawing - + // Basic shapes drawing functions DrawPixel :: proc(posX, posY: c.int, color: Color) --- // Draw a pixel using geometry [Can be slow, use with care] @@ -1422,7 +1419,7 @@ foreign lib { DrawTextureNPatch :: proc(texture: Texture2D, nPatchInfo: NPatchInfo, dest: Rectangle, origin: Vector2, rotation: f32, tint: Color) --- // Draws a texture (or part of it) that stretches or shrinks nicely // Color/pixel related functions - + @(deprecated="Prefer col1 == col2") ColorIsEqual :: proc(col1, col2: Color) --- // Check if two colors are equal Fade :: proc(color: Color, alpha: f32) -> Color --- // Get color with alpha applied, alpha goes from 0.0f to 1.0f @@ -1730,15 +1727,15 @@ IsGestureDetected :: proc "c" (gesture: Gesture) -> bool { TextFormat :: proc(text: cstring, args: ..any) -> cstring { @static buffers: [MAX_TEXTFORMAT_BUFFERS][MAX_TEXT_BUFFER_LENGTH]byte @static index: u32 - + buffer := buffers[index][:] mem.zero_slice(buffer) - + index = (index+1)%MAX_TEXTFORMAT_BUFFERS - + str := fmt.bprintf(buffer[:len(buffer)-1], string(text), ..args) buffer[len(str)] = 0 - + return cstring(raw_data(buffer)) } @@ -1785,7 +1782,7 @@ MemAllocatorProc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode, case .Free: MemFree(old_memory) return nil, nil - + case .Resize, .Resize_Non_Zeroed: ptr := MemRealloc(old_memory, c.uint(size)) if ptr == nil { @@ -1794,10 +1791,10 @@ MemAllocatorProc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode, } data = mem.byte_slice(ptr, size) return - + case .Free_All, .Query_Features, .Query_Info: return nil, .Mode_Not_Implemented - } + } return nil, .Mode_Not_Implemented } From 204dee162d014ee82d3bb00b4c66f8e90c04ba54 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 10 Feb 2026 18:31:43 +0100 Subject: [PATCH 407/766] remove xxhash core:mem dependency --- core/hash/xxhash/streaming.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/hash/xxhash/streaming.odin b/core/hash/xxhash/streaming.odin index d34206fdb..22d99be1d 100644 --- a/core/hash/xxhash/streaming.odin +++ b/core/hash/xxhash/streaming.odin @@ -10,7 +10,7 @@ package xxhash Jeroen van Rijn: Initial implementation. */ -import "core:mem" +import "base:runtime" import "base:intrinsics" /* @@ -121,7 +121,7 @@ XXH3_init_state :: proc(state: ^XXH3_state) { } XXH3_create_state :: proc(allocator := context.allocator) -> (res: ^XXH3_state, err: Error) { - state, mem_error := mem.new_aligned(XXH3_state, 64, allocator) + state, mem_error := runtime.new_aligned(XXH3_state, 64, allocator) err = nil if mem_error == nil else .Error XXH3_init_state(state) From 53cb56cc2196cc435567a0293a639f59ffc2bc1c Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 10 Feb 2026 18:48:22 +0100 Subject: [PATCH 408/766] remove core:mem dependency from core:bytes --- core/bytes/bytes.odin | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/core/bytes/bytes.odin b/core/bytes/bytes.odin index 79de89d2f..911c62d5d 100644 --- a/core/bytes/bytes.odin +++ b/core/bytes/bytes.odin @@ -1,8 +1,8 @@ // Procedures for manipulation of `[]byte` slices. package bytes +import "base:runtime" import "base:intrinsics" -import "core:mem" import "core:simd" import "core:unicode" import "core:unicode/utf8" @@ -40,7 +40,7 @@ clone :: proc(s: []byte, allocator := context.allocator, loc := #caller_location return c[:len(s)] } -clone_safe :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: mem.Allocator_Error) { +clone_safe :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: runtime.Allocator_Error) { c := make([]byte, len(s), allocator, loc) or_return copy(c, s) return c[:len(s)], nil @@ -48,7 +48,7 @@ clone_safe :: proc(s: []byte, allocator := context.allocator, loc := #caller_loc ptr_from_slice :: ptr_from_bytes ptr_from_bytes :: proc(str: []byte) -> ^byte { - d := transmute(mem.Raw_String)str + d := transmute(runtime.Raw_String)str return d.data } @@ -70,7 +70,13 @@ truncate_to_rune :: proc(str: []byte, r: rune) -> []byte { // Compares two strings, returning a value representing which one comes first lexiographically. // -1 for `a`; 1 for `b`, or 0 if they are equal. compare :: proc(lhs, rhs: []byte) -> int { - return mem.compare(lhs, rhs) + res := runtime.memory_compare(raw_data(lhs), raw_data(rhs), min(len(lhs), len(rhs))) + if res == 0 && len(lhs) != len(rhs) { + return len(lhs) <= len(rhs) ? -1 : +1 + } else if len(lhs) == 0 && len(rhs) == 0 { + return 0 + } + return res } contains_rune :: proc(s: []byte, r: rune) -> int { @@ -176,7 +182,7 @@ join :: proc(a: [][]byte, sep: []byte, allocator := context.allocator) -> []byte return b } -join_safe :: proc(a: [][]byte, sep: []byte, allocator := context.allocator) -> (data: []byte, err: mem.Allocator_Error) { +join_safe :: proc(a: [][]byte, sep: []byte, allocator := context.allocator) -> (data: []byte, err: runtime.Allocator_Error) { if len(a) == 0 { return nil, nil } @@ -212,7 +218,7 @@ concatenate :: proc(a: [][]byte, allocator := context.allocator) -> []byte { return b } -concatenate_safe :: proc(a: [][]byte, allocator := context.allocator) -> (data: []byte, err: mem.Allocator_Error) { +concatenate_safe :: proc(a: [][]byte, allocator := context.allocator) -> (data: []byte, err: runtime.Allocator_Error) { if len(a) == 0 { return nil, nil } From 874ffa0385046efdab5b03f2bfc04bb735968400 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 10 Feb 2026 19:19:30 +0100 Subject: [PATCH 409/766] remove core:fmt dependency from core:debug/trace --- core/debug/trace/trace.odin | 30 +++++++++++++++++++++++++++++ core/debug/trace/trace_cpp.odin | 2 +- core/debug/trace/trace_windows.odin | 4 ++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/core/debug/trace/trace.odin b/core/debug/trace/trace.odin index 134609b05..79c10b67f 100644 --- a/core/debug/trace/trace.odin +++ b/core/debug/trace/trace.odin @@ -44,4 +44,34 @@ resolve :: proc(ctx: ^Context, frame: Frame, allocator: runtime.Allocator) -> (r @(require_results) in_resolve :: proc "contextless" (ctx: ^Context) -> bool { return intrinsics.atomic_load(&ctx.in_resolve) +} + +_format_hex :: proc(buf: []byte, val: uintptr, allocator: runtime.Allocator) -> int { + _digits := "0123456789abcdef" + + shift := (size_of(uintptr) * 8) - 4 + offs := 0 + + for shift >= 0 { + d := (val >> uint(shift)) & 0xf + buf[offs] = _digits[d] + shift -= 4 + offs += 1 + } + + return offs +} + +_format_missing_proc :: proc(addr: uintptr, allocator: runtime.Allocator) -> string { + PREFIX :: "proc:0x" + buf, buf_err := make([]byte, len(PREFIX) + 16, allocator) + copy(buf, PREFIX) + + if buf_err != nil { + return "OUT_OF_MEMORY" + } + + offs := len(PREFIX) + offs += _format_hex(buf[offs:], uintptr(addr), allocator) + return string(buf[:offs]) } \ No newline at end of file diff --git a/core/debug/trace/trace_cpp.odin b/core/debug/trace/trace_cpp.odin index 8ef377cef..49a5a9055 100644 --- a/core/debug/trace/trace_cpp.odin +++ b/core/debug/trace/trace_cpp.odin @@ -164,7 +164,7 @@ _resolve :: proc(ctx: ^Context, frame: Frame, allocator: runtime.Allocator) -> F } else if info: Dl_info; dladdr(rawptr(address), &info) != 0 && info.dli_sname != "" { frame.procedure = strings.clone_from_cstring(info.dli_sname, btc.allocator) } else { - frame.procedure = fmt.aprintf("(procedure: 0x%x)", allocator=btc.allocator) + fl.procedure = _format_missing_proc(address, allocator) } frame.line = i32(line) return 0 diff --git a/core/debug/trace/trace_windows.odin b/core/debug/trace/trace_windows.odin index 04e92f125..d4f5d08cc 100644 --- a/core/debug/trace/trace_windows.odin +++ b/core/debug/trace/trace_windows.odin @@ -6,7 +6,7 @@ import "base:intrinsics" import "base:runtime" import win32 "core:sys/windows" -import "core:fmt" +import "core:strconv" _Context :: struct { hProcess: win32.HANDLE, @@ -56,7 +56,7 @@ _resolve :: proc(ctx: ^Context, frame: Frame, allocator: runtime.Allocator) -> ( if win32.SymFromAddrW(ctx.impl.hProcess, win32.DWORD64(frame), &{}, symbol) { fl.procedure, _ = win32.wstring_to_utf8(cstring16(&symbol.Name[0]), -1, allocator) } else { - fl.procedure = fmt.aprintf("(procedure: 0x%x)", frame, allocator=allocator) + fl.procedure = _format_missing_proc(uintptr(frame), allocator) } line: win32.IMAGEHLP_LINE64 From 0e2f5b7d7007df27f4a9f4a7eaa4b1166dd45f3a Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 10 Feb 2026 19:45:18 +0100 Subject: [PATCH 410/766] remove strconv --- core/debug/trace/trace_windows.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/debug/trace/trace_windows.odin b/core/debug/trace/trace_windows.odin index d4f5d08cc..b27b0ee29 100644 --- a/core/debug/trace/trace_windows.odin +++ b/core/debug/trace/trace_windows.odin @@ -6,7 +6,6 @@ import "base:intrinsics" import "base:runtime" import win32 "core:sys/windows" -import "core:strconv" _Context :: struct { hProcess: win32.HANDLE, From 77be6a1f1837253c66eaaec2e5009ec9e52a23e3 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 10 Feb 2026 19:46:51 +0100 Subject: [PATCH 411/766] fix tabs --- core/debug/trace/trace.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/debug/trace/trace.odin b/core/debug/trace/trace.odin index 79c10b67f..8561d72c2 100644 --- a/core/debug/trace/trace.odin +++ b/core/debug/trace/trace.odin @@ -49,15 +49,15 @@ in_resolve :: proc "contextless" (ctx: ^Context) -> bool { _format_hex :: proc(buf: []byte, val: uintptr, allocator: runtime.Allocator) -> int { _digits := "0123456789abcdef" - shift := (size_of(uintptr) * 8) - 4 + shift := (size_of(uintptr) * 8) - 4 offs := 0 - for shift >= 0 { - d := (val >> uint(shift)) & 0xf + for shift >= 0 { + d := (val >> uint(shift)) & 0xf buf[offs] = _digits[d] - shift -= 4 + shift -= 4 offs += 1 - } + } return offs } From edd960905a043ad08bb6bc3cfcc6234f9c9baa3c Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 10 Feb 2026 19:48:12 +0100 Subject: [PATCH 412/766] fix typo in the trace cpp backend --- core/debug/trace/trace.odin | 2 +- core/debug/trace/trace_cpp.odin | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/debug/trace/trace.odin b/core/debug/trace/trace.odin index 8561d72c2..6a9ba9dab 100644 --- a/core/debug/trace/trace.odin +++ b/core/debug/trace/trace.odin @@ -74,4 +74,4 @@ _format_missing_proc :: proc(addr: uintptr, allocator: runtime.Allocator) -> str offs := len(PREFIX) offs += _format_hex(buf[offs:], uintptr(addr), allocator) return string(buf[:offs]) -} \ No newline at end of file +} diff --git a/core/debug/trace/trace_cpp.odin b/core/debug/trace/trace_cpp.odin index 49a5a9055..5c2c381d2 100644 --- a/core/debug/trace/trace_cpp.odin +++ b/core/debug/trace/trace_cpp.odin @@ -164,7 +164,7 @@ _resolve :: proc(ctx: ^Context, frame: Frame, allocator: runtime.Allocator) -> F } else if info: Dl_info; dladdr(rawptr(address), &info) != 0 && info.dli_sname != "" { frame.procedure = strings.clone_from_cstring(info.dli_sname, btc.allocator) } else { - fl.procedure = _format_missing_proc(address, allocator) + frame.procedure = _format_missing_proc(address, allocator) } frame.line = i32(line) return 0 From 26e4af28adbdfef1d751bae22c847568b602ebb3 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 10 Feb 2026 19:55:50 +0100 Subject: [PATCH 413/766] remove the actual fmt import from trace_cpp --- core/debug/trace/trace_cpp.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/debug/trace/trace_cpp.odin b/core/debug/trace/trace_cpp.odin index 5c2c381d2..afa065474 100644 --- a/core/debug/trace/trace_cpp.odin +++ b/core/debug/trace/trace_cpp.odin @@ -5,7 +5,6 @@ package debug_trace import "base:intrinsics" import "base:runtime" import "core:strings" -import "core:fmt" import "core:c" // NOTE: Relies on C++23 which adds and becomes ABI and that can be used From 83489c07f1123e1994e40a08a32206d8d78414a9 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 10 Feb 2026 19:56:49 +0100 Subject: [PATCH 414/766] fix allocator error --- core/debug/trace/trace_cpp.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/debug/trace/trace_cpp.odin b/core/debug/trace/trace_cpp.odin index afa065474..1a96ee112 100644 --- a/core/debug/trace/trace_cpp.odin +++ b/core/debug/trace/trace_cpp.odin @@ -163,7 +163,7 @@ _resolve :: proc(ctx: ^Context, frame: Frame, allocator: runtime.Allocator) -> F } else if info: Dl_info; dladdr(rawptr(address), &info) != 0 && info.dli_sname != "" { frame.procedure = strings.clone_from_cstring(info.dli_sname, btc.allocator) } else { - frame.procedure = _format_missing_proc(address, allocator) + frame.procedure = _format_missing_proc(address, btc.allocator) } frame.line = i32(line) return 0 From bd70ac47cad856fdd8dd023681fb0d5ee3c42a50 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 10 Feb 2026 20:23:08 +0100 Subject: [PATCH 415/766] use core:c instead of libc in miniaudio --- vendor/miniaudio/logging.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/miniaudio/logging.odin b/vendor/miniaudio/logging.odin index afddf8e68..135c6a9b1 100644 --- a/vendor/miniaudio/logging.odin +++ b/vendor/miniaudio/logging.odin @@ -1,6 +1,6 @@ package miniaudio -import "core:c/libc" +import "core:c" foreign import lib { LIB } @@ -48,12 +48,12 @@ log :: struct { @(default_calling_convention="c", link_prefix="ma_") foreign lib { log_callback_init :: proc(onLog: log_callback_proc, pUserData: rawptr) -> log_callback --- - + log_init :: proc(pAllocationCallbacks: ^allocation_callbacks, pLog: ^log) -> result --- log_uninit :: proc(pLog: ^log) --- log_register_callback :: proc(pLog: ^log, callback: log_callback) -> result --- log_unregister_callback :: proc(pLog: ^log, callback: log_callback) -> result --- log_post :: proc(pLog: ^log, level: u32, pMessage: cstring) -> result --- - log_postv :: proc(pLog: ^log, level: u32, pFormat: cstring, args: libc.va_list) -> result --- + log_postv :: proc(pLog: ^log, level: u32, pFormat: cstring, args: c.va_list) -> result --- log_postf :: proc(pLog: ^log, level: u32, pFormat: cstring, #c_vararg args: ..any) -> result --- } From 3eaa11044c7d3141693bf74071fba98f0dffb23b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 10 Feb 2026 20:20:02 +0000 Subject: [PATCH 416/766] Add `user_data: rawptr` to `time.Benchmark_Options` --- core/time/perf.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/time/perf.odin b/core/time/perf.odin index c2d3890ff..2db1f4034 100644 --- a/core/time/perf.odin +++ b/core/time/perf.odin @@ -194,6 +194,8 @@ Benchmark_Options :: struct { // `benchmark()` procedure will output the average number of megabytes // processed per second, using the `processed` field of this struct. megabytes_per_second: f64, + // For user specified data in the callbacks + user_data: rawptr, } /* From ae91b9b3693f1ee5b39f14e38a67af5f502bc829 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 10 Feb 2026 22:16:15 +0000 Subject: [PATCH 417/766] Add `-show-import-graph` --- src/build_settings.cpp | 1 + src/main.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index a7928721a..40c1c86c4 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -538,6 +538,7 @@ struct BuildContext { bool different_os; bool keep_object_files; bool disallow_do; + bool show_import_graph; IntegerDivisionByZeroKind integer_division_by_zero_behaviour; diff --git a/src/main.cpp b/src/main.cpp index 0b642e9a8..009281d4e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -302,6 +302,7 @@ enum BuildFlagKind { BuildFlag_ShowUnused, BuildFlag_ShowUnusedWithLocation, BuildFlag_ShowMoreTimings, + BuildFlag_ShowImportGraph, BuildFlag_ExportTimings, BuildFlag_ExportTimingsFile, BuildFlag_ExportDependencies, @@ -530,6 +531,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_OptimizationMode, str_lit("o"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ShowMoreTimings, str_lit("show-more-timings"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_ShowImportGraph, str_lit("show-import-graph"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ExportTimings, str_lit("export-timings"), BuildFlagParam_String, Command__does_check); add_flag(&build_flags, BuildFlag_ExportTimingsFile, str_lit("export-timings-file"), BuildFlagParam_String, Command__does_check); add_flag(&build_flags, BuildFlag_ExportDependencies, str_lit("export-dependencies"), BuildFlagParam_String, Command__does_build); @@ -870,6 +872,10 @@ gb_internal bool parse_build_flags(Array args) { build_context.show_timings = true; build_context.show_more_timings = true; break; + case BuildFlag_ShowImportGraph: + GB_ASSERT(value.kind == ExactValue_Invalid); + build_context.show_import_graph = true; + break; case BuildFlag_ExportTimings: { GB_ASSERT(value.kind == ExactValue_String); /* @@ -2071,6 +2077,73 @@ gb_internal void show_defineables(Checker *c) { } } +gb_internal void show_import_graph(Checker *c) { + Parser *p = c->parser; + + gb_printf("\nDOT Import graph:\n\n"); + gb_printf("digraph odin_import_graph {\n\tnode [shape=box];\n"); + + int cluster_counter = 0; + for (LibraryCollections coll : library_collections) { + gb_printf("\tsubgraph cluster_%i {\n", cluster_counter); + gb_printf("\t\tlabel = \"%.*s\";\n", LIT(coll.name)); + gb_printf("\t\tnode [style=filled, fillcolor=white];\n"); + if (coll.name =="core") { + gb_printf("\t\tbgcolor = lightsalmon;\n"); + } else if (coll.name =="vendor") { + gb_printf("\t\tbgcolor = lightblue;\n"); + } else if (coll.name =="base") { + gb_printf("\t\tbgcolor = lightcoral;\n"); + gb_printf("\t\tintrinsics;\n"); + gb_printf("\t\tbuiltin;\n"); + } + for (AstPackage *pkg : p->packages) { + if (string_starts_with(pkg->fullpath, coll.path)) { + gb_printf("\t\t\"%.*s\";\n", LIT(pkg->fullpath)); + } + } + gb_printf("\t}\n"); + cluster_counter += 1; + } + + for (AstPackage *pkg : p->packages) { + for (int i = 0; i < pkg->files.count; i++) { + AstFile *file = pkg->files[i]; + for(Ast *imp : file->imports) { + GB_ASSERT(imp->kind == Ast_ImportDecl); + + bool exists = false; + for (int j = i + 1; j < pkg->files.count; j++) { + AstFile *other_file = pkg->files[j]; + for(Ast *other_imp : other_file->imports) { + GB_ASSERT(other_imp->kind == Ast_ImportDecl); + if (0 == string_compare(imp->ImportDecl.fullpath, other_imp->ImportDecl.fullpath)) { + exists = true; + break; + } + } + if (exists) { + break; + } + } + + if (exists) { + continue; + } + + String path = imp->ImportDecl.fullpath; + if (imp->ImportDecl.package != nullptr) { + path = imp->ImportDecl.package->fullpath; + } + + gb_printf("\t\"%.*s\" -> \"%.*s\";\n", LIT(pkg->fullpath), LIT(path)); + } + } + } + + gb_printf("}\n\n"); +} + gb_internal void show_timings(Checker *c, Timings *t) { Parser *p = c->parser; isize lines = p->total_line_count; @@ -2928,6 +3001,10 @@ gb_internal int print_show_help(String const arg0, String command, String option print_usage_line(2, "Prints the whole command and arguments for calls to external tools like linker and assembler."); } + if (print_flag("-show-import-graph")) { + print_usage_line(2, "Shows dot graph text format of the import graph of a project."); + } + if (print_flag("-show-timings")) { print_usage_line(2, "Shows basic overview of the timings of different stages within the compiler in milliseconds."); } @@ -3976,6 +4053,9 @@ int main(int arg_count, char const **arg_ptr) { if (build_context.show_timings) { show_timings(checker, &global_timings); } + if (build_context.show_import_graph) { + show_import_graph(checker); + } return 0; } @@ -3987,6 +4067,9 @@ int main(int arg_count, char const **arg_ptr) { if (build_context.show_timings) { show_timings(checker, &global_timings); } + if (build_context.show_import_graph) { + show_import_graph(checker); + } if (global_error_collector.count != 0) { return 1; @@ -4020,6 +4103,9 @@ int main(int arg_count, char const **arg_ptr) { if (build_context.show_timings) { show_timings(checker, &global_timings); } + if (build_context.show_import_graph) { + show_import_graph(checker); + } if (build_context.export_dependencies_format != DependenciesExportUnspecified) { export_dependencies(checker); @@ -4051,6 +4137,9 @@ int main(int arg_count, char const **arg_ptr) { if (build_context.show_timings) { show_timings(checker, &global_timings); } + if (build_context.show_import_graph) { + show_import_graph(checker); + } if (build_context.export_dependencies_format != DependenciesExportUnspecified) { export_dependencies(checker); @@ -4096,6 +4185,9 @@ end_of_code_gen:; if (build_context.show_timings) { show_timings(checker, &global_timings); } + if (build_context.show_import_graph) { + show_import_graph(checker); + } if (run_output) { String exe_name = path_to_string(heap_allocator(), build_context.build_paths[BuildPath_Output]); From 264029b2d6a02fe928aff1247f96dc1b55e3d35a Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Tue, 10 Feb 2026 21:13:33 -0500 Subject: [PATCH 418/766] Remove core:mem dependency from core:container/xar --- core/container/xar/xar.odin | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index 556f93ee5..b2f1a5499 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -26,7 +26,6 @@ */ package container_xar -@(require) import "core:mem" @(require) import "base:intrinsics" @(require) import "base:runtime" @@ -73,7 +72,7 @@ MAX_SHIFT :: PLATFORM_BITS>>1 Array :: struct($T: typeid, $SHIFT: uint) where 0 < SHIFT, SHIFT <= MAX_SHIFT { chunks: [(1 << (_LOG2_PLATFORM_BITS - intrinsics.constant_log2(SHIFT))) + 1][^]T, len: int, - allocator: mem.Allocator, + allocator: runtime.Allocator, } @@ -99,7 +98,7 @@ destroy :: proc(x: ^$X/Array($T, $SHIFT)) { if c != nil { n := 1 << (SHIFT + uint(i if i > 0 else 1) - 1) size_in_bytes := n * size_of(T) - mem.free_with_size(c, size_in_bytes, x.allocator) + runtime.mem_free_with_size(c, size_in_bytes, x.allocator) } } x^ = {} @@ -257,7 +256,7 @@ Example: fmt.println(xar.get(&x, 1)) // world } */ -push_back_elem :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { +push_back_elem :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: runtime.Allocator_Error) { if x.allocator.procedure == nil { // to minic `[dynamic]T` behaviour x.allocator = context.allocator @@ -284,7 +283,7 @@ Append multiple elements to the end of the exponential array. - number of elements successfully added - allocation error if chunk allocation failed (partial append possible) */ -push_back_elems :: proc(x: ^$X/Array($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { +push_back_elems :: proc(x: ^$X/Array($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: runtime.Allocator_Error) { for value in values { n += push_back_elem(x, value, loc) or_return } @@ -318,7 +317,7 @@ Example: } */ @(require_results) -push_back_elem_and_get_ptr :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: mem.Allocator_Error) { +push_back_elem_and_get_ptr :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: runtime.Allocator_Error) { if x.allocator.procedure == nil { // to minic `[dynamic]T` behaviour x.allocator = context.allocator From 6cc6f06d4d29d681abc447825ed86018aae610ca Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Wed, 11 Feb 2026 13:22:13 +0100 Subject: [PATCH 419/766] Stop silently ignoring unknown directives on an inline asm expression --- src/parser.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index 360537ab7..0efe2714a 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -3130,6 +3130,8 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { } else { dialect = InlineAsmDialect_Intel; } + } else { + syntax_error(token, "Invalid directive on inline asm expression: '#%.*s'", LIT(token.string)); } } else { syntax_error(f->curr_token, "Expected an identifier after hash"); From 16a6c969719c1b269a881095a0355bae873f7ed9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Feb 2026 13:01:35 +0000 Subject: [PATCH 420/766] Add `VirtualAlloc2` and `MapViewOfFile3` --- core/sys/windows/kernel32.odin | 73 ++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index f66698dd8..7d4ba76e0 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -1195,6 +1195,79 @@ foreign kernel32 { ) -> BOOL --- } + +MEM_REPLACE_PLACEHOLDER :: 0x00004000 +MEM_RESERVE_PLACEHOLDER :: 0x00040000 +MEM_PRESERVE_PLACEHOLDER :: 0x00000002 +MEM_RESET_UNDO :: 0x1000000 +MEM_64K_PAGES :: 0x20400000 +MEM_PHYSICAL :: 0x00400000 + +MEM_EXTENDED_PARAMETER_TYPE :: enum c_int { + MemExtendedParameterInvalidType = 0, + MemExtendedParameterAddressRequirements, + MemExtendedParameterNumaNode, + MemExtendedParameterPartitionHandle, + MemExtendedParameterUserPhysicalHandle, + MemExtendedParameterAttributeFlags, + MemExtendedParameterImageMachine, +} + +MEM_EXTENDED_PARAMETER_NONPAGED :: 0x02 +MEM_EXTENDED_PARAMETER_NONPAGED_LARGE :: 0x08 +MEM_EXTENDED_PARAMETER_NONPAGED_HUGE :: 0x10 +MEM_EXTENDED_PARAMETER_EC_CODE :: 0x40 + +MEM_ADDRESS_REQUIREMENTS :: struct { + LowestStartingAddress: PVOID, + HighestEndingAddress: PVOID, + Alignment: SIZE_T, +} +PMEM_ADDRESS_REQUIREMENTS :: ^MEM_ADDRESS_REQUIREMENTS + +MEM_EXTENDED_PARAMETER_TYPE_BITS :: 8 + +MEM_EXTENDED_PARAMETER :: struct { + using DUMMYSTRUCTNAME: bit_field DWORD64 { + Type: MEM_EXTENDED_PARAMETER_TYPE | MEM_EXTENDED_PARAMETER_TYPE_BITS, + Reserved: DWORD64 | 64 - MEM_EXTENDED_PARAMETER_TYPE_BITS, + }, + using DUMMYUNIONNAME: struct #raw_union { + ULong64: DWORD64, + Pointer: PVOID, + Size: SIZE_T, + Handle: HANDLE, + ULong: DWORD, + }, +} + + +@(default_calling_convention="system") +foreign one_core { + VirtualAlloc2 :: proc( + Process: HANDLE, + BaseAddress: LPVOID, + Size: SIZE_T, + AllocationType: ULONG, + PageProtection: ULONG, + ExtendedParameters: ^MEM_EXTENDED_PARAMETER, + ParameterCount: ULONG, + ) -> LPVOID --- + + MapViewOfFile3 :: proc( + FileMappingHandle: HANDLE, + ProcessHandle: HANDLE, + BaseAddress: PVOID, + Offset: ULONG64, + ViewSize: SIZE_T, + AllocationType: ULONG, + PageProtection: ULONG, + ExtendedParameters: ^MEM_EXTENDED_PARAMETER, + ParameterCount: ULONG, + ) -> PVOID --- +} + + HandlerRoutine :: proc "system" (dwCtrlType: DWORD) -> BOOL PHANDLER_ROUTINE :: HandlerRoutine From b1633b9ebb68cb682a656f1026056f77afcdfb45 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Feb 2026 14:05:06 +0000 Subject: [PATCH 421/766] Require all values from a procedure iterator if the procedure is marked with `@(require_results)` --- src/check_stmt.cpp | 19 +++++++++++++++++-- src/parser.cpp | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 1f433df36..66283d3da 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1724,6 +1724,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) bool is_range = false; bool is_possibly_addressable = true; isize max_val_count = 2; + if (is_ast_range(expr)) { ast_node(ie, BinaryExpr, expr); Operand x = {}; @@ -1884,7 +1885,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) error_line("\tMultiple return valued parameters in a range statement are limited to a minimum of 1 usable values with a trailing boolean for the conditional, got %td\n", count); break; } - enum : isize {MAXIMUM_COUNT = 100}; + enum : isize {MAXIMUM_COUNT = 20}; if (count > MAXIMUM_COUNT) { ERROR_BLOCK(); check_not_tuple(ctx, &operand); @@ -1900,7 +1901,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) break; } - max_val_count = count; + max_val_count = count-1; for (Entity *e : t->Tuple.variables) { array_add(&vals, e->type); @@ -1920,6 +1921,20 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) if (is_reverse) { error(node, "#reverse for is not supported for multiple return valued parameters"); } + + Ast *expr = unparen_expr(operand.expr); + if (expr->kind == Ast_CallExpr) { + Type *p = base_type(type_of_expr(expr->CallExpr.proc)); + if (p != nullptr && p->kind == Type_Proc) { + if (p->Proc.require_results) { + if (rs->vals.count < max_val_count) { + TokenPos start = ast_token(rs->vals[0]).pos; + TokenPos end = ast_end_pos(rs->vals[rs->vals.count-1]); + error_range(start, end, "Expected a %td identifier%s, got %td", max_val_count, max_val_count == 1 ? "" : "s", rs->vals.count); + } + } + } + } } break; diff --git a/src/parser.cpp b/src/parser.cpp index 0efe2714a..159eb65f8 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -514,6 +514,22 @@ gb_internal void error(Ast *node, char const *fmt, ...) { } } +gb_internal void error_range(TokenPos start, TokenPos end, char const *fmt, ...) { + GB_ASSERT(start.file_id == end.file_id); + GB_ASSERT(start.line == end.line); + GB_ASSERT(start.column <= end.column); + GB_ASSERT(start.offset <= end.offset); + + va_list va; + va_start(va, fmt); + error_va(start, end, fmt, va); + va_end(va); + if (start.file_id != 0) { + AstFile *f = thread_safe_get_ast_file_from_id(start.file_id); + f->error_count += 1; + } +} + gb_internal void syntax_error_with_verbose(Ast *node, char const *fmt, ...) { Token token = {}; TokenPos end_pos = {}; From 2e58c62a80745c12c9bc8fa62ad4002fc4bae82e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 11 Feb 2026 15:13:24 +0100 Subject: [PATCH 422/766] Clarify -lto help text --- src/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 009281d4e..1fb0ead09 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1648,7 +1648,7 @@ gb_internal bool parse_build_flags(Array args) { GB_ASSERT(value.kind == ExactValue_String); if (str_eq_ignore_case(value.value_string, str_lit("thin"))) { build_context.lto_kind = LTO_Thin; - if (build_context.linker_choice == Linker_Invalid) { + if (build_context.linker_choice == Linker_Invalid || build_context.linker_choice == Linker_Default) { build_context.linker_choice = Linker_lld; } if (!build_context.use_separate_modules) { @@ -2826,8 +2826,8 @@ gb_internal int print_show_help(String const arg0, String command, String option print_usage_line(2, "States that the project is to be build with link-time optimizations."); print_usage_line(2, "This also enables '-use-separate-modules' (if not already set) and `-linker:lld"); print_usage_line(2, "Choices:"); - print_usage_line(3, "thin"); - print_usage_line(3, "thin-files"); + print_usage_line(3, "thin (one module per package)"); + print_usage_line(3, "thin-files (one module file)"); } } From 8cb7965aa592615afb50a9395390fae51b890712 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Feb 2026 15:33:14 +0000 Subject: [PATCH 423/766] `for init; x in y {}` style loops --- src/check_stmt.cpp | 8 +++++++- src/llvm_backend_stmt.cpp | 19 +++++++++++++++++++ src/parser.cpp | 29 +++++++++++++++++++++++------ src/parser.hpp | 2 ++ 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 66283d3da..ab1cc1033 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1705,11 +1705,17 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) TEMPORARY_ALLOCATOR_GUARD(); - u32 new_flags = mod_flags | Stmt_BreakAllowed | Stmt_ContinueAllowed; check_open_scope(ctx, node); check_label(ctx, rs->label, node); + Operand init = {}; + if (rs->init != nullptr) { + check_stmt(ctx, rs->init, mod_flags); + } + + u32 new_flags = mod_flags | Stmt_BreakAllowed | Stmt_ContinueAllowed; + auto vals = array_make(temporary_allocator(), 0, 2); auto entities = array_make(temporary_allocator(), 0, 2); bool is_map = false; diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 05ec10cda..98b45f646 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -756,6 +756,10 @@ gb_internal void lb_build_range_interval(lbProcedure *p, AstBinaryExpr *node, lb_open_scope(p, scope); + if (rs->init != nullptr) { + lb_build_stmt(p, rs->init); + } + Ast *val0 = rs->vals.count > 0 ? lb_strip_and_prefix(rs->vals[0]) : nullptr; Ast *val1 = rs->vals.count > 1 ? lb_strip_and_prefix(rs->vals[1]) : nullptr; Type *val0_type = nullptr; @@ -948,6 +952,10 @@ gb_internal void lb_build_range_tuple(lbProcedure *p, AstRangeStmt *rs, Scope *s lb_open_scope(p, scope); + if (rs->init != nullptr) { + lb_build_stmt(p, rs->init); + } + lbBlock *loop = lb_create_block(p, "for.tuple.loop"); lb_emit_jump(p, loop); lb_start_block(p, loop); @@ -1002,6 +1010,9 @@ gb_internal void lb_build_range_stmt_struct_soa(lbProcedure *p, AstRangeStmt *rs lb_open_scope(p, scope); + if (rs->init != nullptr) { + lb_build_stmt(p, rs->init); + } Ast *val0 = rs->vals.count > 0 ? lb_strip_and_prefix(rs->vals[0]) : nullptr; Ast *val1 = rs->vals.count > 1 ? lb_strip_and_prefix(rs->vals[1]) : nullptr; @@ -1153,6 +1164,10 @@ gb_internal void lb_build_range_stmt(lbProcedure *p, AstRangeStmt *rs, Scope *sc lb_open_scope(p, scope); + if (rs->init != nullptr) { + lb_build_stmt(p, rs->init); + } + Ast *val0 = rs->vals.count > 0 ? lb_strip_and_prefix(rs->vals[0]) : nullptr; Ast *val1 = rs->vals.count > 1 ? lb_strip_and_prefix(rs->vals[1]) : nullptr; Type *val0_type = nullptr; @@ -1352,6 +1367,10 @@ gb_internal void lb_build_unroll_range_stmt(lbProcedure *p, AstUnrollRangeStmt * lb_open_scope(p, scope); // Open scope here + if (rs->init != nullptr) { + lb_build_stmt(p, rs->init); + } + Ast *val0 = lb_strip_and_prefix(rs->val0); Ast *val1 = lb_strip_and_prefix(rs->val1); Type *val0_type = nullptr; diff --git a/src/parser.cpp b/src/parser.cpp index 159eb65f8..42c69cd4c 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -353,12 +353,14 @@ gb_internal Ast *clone_ast(Ast *node, AstFile *f) { break; case Ast_RangeStmt: n->RangeStmt.label = clone_ast(n->RangeStmt.label, f); + n->RangeStmt.init = clone_ast(n->RangeStmt.init, f); n->RangeStmt.vals = clone_ast_array(n->RangeStmt.vals, f); n->RangeStmt.expr = clone_ast(n->RangeStmt.expr, f); n->RangeStmt.body = clone_ast(n->RangeStmt.body, f); break; case Ast_UnrollRangeStmt: n->UnrollRangeStmt.args = clone_ast_array(n->UnrollRangeStmt.args, f); + n->UnrollRangeStmt.init = clone_ast(n->UnrollRangeStmt.init, f); n->UnrollRangeStmt.val0 = clone_ast(n->UnrollRangeStmt.val0, f); n->UnrollRangeStmt.val1 = clone_ast(n->UnrollRangeStmt.val1, f); n->UnrollRangeStmt.expr = clone_ast(n->UnrollRangeStmt.expr, f); @@ -1055,9 +1057,10 @@ gb_internal Ast *ast_for_stmt(AstFile *f, Token token, Ast *init, Ast *cond, Ast return result; } -gb_internal Ast *ast_range_stmt(AstFile *f, Token token, Slice vals, Token in_token, Ast *expr, Ast *body) { +gb_internal Ast *ast_range_stmt(AstFile *f, Token token, Ast *init, Slice vals, Token in_token, Ast *expr, Ast *body) { Ast *result = alloc_ast_node(f, Ast_RangeStmt); result->RangeStmt.token = token; + result->RangeStmt.init = init; result->RangeStmt.vals = vals; result->RangeStmt.in_token = in_token; result->RangeStmt.expr = expr; @@ -1065,9 +1068,10 @@ gb_internal Ast *ast_range_stmt(AstFile *f, Token token, Slice vals, Toke return result; } -gb_internal Ast *ast_unroll_range_stmt(AstFile *f, Token unroll_token, Slice args, Token for_token, Ast *val0, Ast *val1, Token in_token, Ast *expr, Ast *body) { +gb_internal Ast *ast_unroll_range_stmt(AstFile *f, Token unroll_token, Ast *init, Slice args, Token for_token, Ast *val0, Ast *val1, Token in_token, Ast *expr, Ast *body) { Ast *result = alloc_ast_node(f, Ast_UnrollRangeStmt); result->UnrollRangeStmt.unroll_token = unroll_token; + result->UnrollRangeStmt.init = init; result->UnrollRangeStmt.args = args; result->UnrollRangeStmt.for_token = for_token; result->UnrollRangeStmt.val0 = val0; @@ -4883,7 +4887,7 @@ gb_internal Ast *parse_for_stmt(AstFile *f) { body = parse_block_stmt(f, false); } - return ast_range_stmt(f, token, {}, in_token, rhs, body); + return ast_range_stmt(f, token, init, {}, in_token, rhs, body); } if (f->curr_token.kind != Token_Semicolon) { @@ -4898,9 +4902,20 @@ gb_internal Ast *parse_for_stmt(AstFile *f) { cond = nullptr; if (f->curr_token.kind == Token_OpenBrace || f->curr_token.kind == Token_do) { - syntax_error(f->curr_token, "Expected ';', followed by a condition expression and post statement, got %.*s", LIT(token_strings[f->curr_token.kind])); + syntax_error(f->curr_token, "Expected ';', followed by a condition expression and post statement, or 'x in y' style loop, got %.*s", LIT(token_strings[f->curr_token.kind])); } else { if (f->curr_token.kind != Token_Semicolon) { + if (f->curr_token.kind == Token_Ident) { + // for init; x in y { } + Token next_token = peek_token(f); + if (next_token.kind == Token_in || next_token.kind == Token_Comma) { + cond = parse_simple_stmt(f, StmtAllowFlag_In); + GB_ASSERT(cond->kind == Ast_AssignStmt && cond->AssignStmt.op.kind == Token_in); + is_range = true; + goto range_skip; + } + } + cond = parse_simple_stmt(f, StmtAllowFlag_None); } @@ -4918,6 +4933,7 @@ gb_internal Ast *parse_for_stmt(AstFile *f) { } } +range_skip:; if (allow_token(f, Token_do)) { body = parse_do_body(f, token, "the for statement"); @@ -4933,7 +4949,7 @@ gb_internal Ast *parse_for_stmt(AstFile *f) { if (cond->AssignStmt.rhs.count > 0) { rhs = cond->AssignStmt.rhs[0]; } - return ast_range_stmt(f, token, vals, in_token, rhs, body); + return ast_range_stmt(f, token, init, vals, in_token, rhs, body); } cond = convert_stmt_to_expr(f, cond, str_lit("boolean expression")); @@ -5267,6 +5283,7 @@ gb_internal Ast *parse_unrolled_for_loop(AstFile *f, Token unroll_token) { } Token for_token = expect_token(f, Token_for); + Ast *init = nullptr; Ast *val0 = nullptr; Ast *val1 = nullptr; Token in_token = {}; @@ -5309,7 +5326,7 @@ gb_internal Ast *parse_unrolled_for_loop(AstFile *f, Token unroll_token) { if (bad_stmt) { return ast_bad_stmt(f, unroll_token, f->curr_token); } - return ast_unroll_range_stmt(f, unroll_token, slice_from_array(args), for_token, val0, val1, in_token, expr, body); + return ast_unroll_range_stmt(f, unroll_token, init, slice_from_array(args), for_token, val0, val1, in_token, expr, body); } gb_internal Ast *parse_stmt(AstFile *f) { diff --git a/src/parser.hpp b/src/parser.hpp index 1026433d0..d3527285d 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -587,6 +587,7 @@ AST_KIND(_ComplexStmtBegin, "", bool) \ Scope *scope; \ Token token; \ Ast *label; \ + Ast *init; \ Slice vals; \ Token in_token; \ Ast *expr; \ @@ -596,6 +597,7 @@ AST_KIND(_ComplexStmtBegin, "", bool) \ AST_KIND(UnrollRangeStmt, "#unroll range statement", struct { \ Scope *scope; \ Token unroll_token; \ + Ast *init; \ Slice args; \ Token for_token; \ Ast *val0; \ From bd3cf2a1e6430e916bc9721296a2b18675e89dab Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 11 Feb 2026 16:33:52 +0100 Subject: [PATCH 424/766] Remove -show-import-graph header This allows you to pipe the output to a file and have a working graph without any editing. (Provided you don't also use additional -flags like `-show-timings`.) --- src/main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 1fb0ead09..bba9ffe13 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2080,7 +2080,6 @@ gb_internal void show_defineables(Checker *c) { gb_internal void show_import_graph(Checker *c) { Parser *p = c->parser; - gb_printf("\nDOT Import graph:\n\n"); gb_printf("digraph odin_import_graph {\n\tnode [shape=box];\n"); int cluster_counter = 0; From 9c47ca73063fa0e335f39d52774b2bbf28e6c6b7 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Feb 2026 19:00:11 +0100 Subject: [PATCH 425/766] checkout with LFS binaries in nightly CI --- .github/workflows/nightly.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 48ea93ded..c7858c82c 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -12,6 +12,8 @@ jobs: runs-on: windows-2022 steps: - uses: actions/checkout@v4 + with: + lfs: true - name: build Odin shell: cmd run: | @@ -47,6 +49,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + lfs: true - name: (Linux) Download LLVM and Build Odin run: | docker run --rm -v "$PWD:/src" -w /src alpine sh -c ' @@ -87,6 +91,8 @@ jobs: runs-on: ubuntu-24.04-arm steps: - uses: actions/checkout@v4 + with: + lfs: true - name: (Linux ARM) Download LLVM and Build Odin run: | docker run --rm -v "$PWD:/src" -w /src arm64v8/alpine sh -c ' @@ -127,6 +133,8 @@ jobs: runs-on: macos-15-intel steps: - uses: actions/checkout@v4 + with: + lfs: true - name: Download LLVM and setup PATH run: | brew update @@ -166,6 +174,8 @@ jobs: runs-on: macos-latest # ARM machine steps: - uses: actions/checkout@v4 + with: + lfs: true - name: Download LLVM and setup PATH run: | brew update From 8468d269dcd3166861dc49f50b0e42a0dce4b61e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 11 Feb 2026 19:15:32 +0100 Subject: [PATCH 426/766] Remove @(require_results) from `os.read_directory_iterator` --- .gitignore | 3 +++ core/os/dir.odin | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4efb5d73e..00dbcc2a5 100644 --- a/.gitignore +++ b/.gitignore @@ -279,6 +279,9 @@ demo.bin libLLVM*.so* *.a +# WASM +*.wasm + # shared collection shared/ diff --git a/core/os/dir.odin b/core/os/dir.odin index a2fba81e4..2548480c2 100644 --- a/core/os/dir.odin +++ b/core/os/dir.odin @@ -195,7 +195,6 @@ Example: } } */ -@(require_results) read_directory_iterator :: proc(it: ^Read_Directory_Iterator) -> (fi: File_Info, index: int, ok: bool) { if it.f == nil { return From 23019020a1f4c3205e624b26f256865fa2a7210a Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Mon, 19 Jan 2026 10:51:59 -0500 Subject: [PATCH 427/766] Add runtime options for test runner via command line --- core/testing/runner.odin | 64 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 8f26aa6c6..f3dcc8a1b 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -196,6 +196,57 @@ run_test_task :: proc(task: thread.Task) { }) } +Options :: struct { + // Equivalent to the TEST_NAMES compile-time definition, but used dynamically at runtime. + test_names: string, +} + +parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Writer) { + argv:=argv[1:] + test_names: strings.Builder + + for i := 0; i < len(argv); i+=1 { + arg := argv[i] + if strings.starts_with(arg, "-tests:") { + tests := arg[strings.index(arg, ":")+1:] + if len(tests) < 1 { + fmt.wprintln(stderr, "No test names specified for '-tests:'") + os.exit(-1) + } + + if len(test_names.buf) > 0 { + strings.write_byte(&test_names, ',') + } + strings.write_bytes(&test_names, transmute([]u8)tests) + } + else if arg == "-help" { + exe_name := "test" + if path, err := os2.get_executable_path(context.temp_allocator); err == nil { + exe_name = slashpath.base(path) + } + + fmt.wprintfln(stdout, "Usage: %v [OPTIONS]", exe_name) + fmt.wprintfln(stdout, "OPTIONS:") + fmt.wprintfln(stdout, " -help:") + fmt.wprintfln(stdout, " Display this help text and exit.") + fmt.wprintln(stdout) + fmt.wprintfln(stdout, " -tests:") + fmt.wprintfln(stdout, " Specify a specific set of tests to run by name.\n" + + " Each test is separated by a comma and may optionally include the package name.\n" + + " This may be useful when running tests on multiple packages with `-all-packages`.\n" + + " The format is: `package.test_name,test_name_only,...`") + fmt.wprintln(stdout) + os.exit(0) + } + else { + fmt.wprintfln(stderr, "Unknown argument encountered '%v'", arg) + os.exit(-1) + } + } + + opts.test_names = string(test_names.buf[:]) +} + runner :: proc(internal_tests: []Internal_Test) -> bool { BATCH_BUFFER_SIZE :: 32 * mem.Kilobyte POOL_BLOCK_SIZE :: 16 * mem.Kilobyte @@ -229,16 +280,25 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { should_show_animations := FANCY_OUTPUT && terminal.color_enabled && !global_ansi_disabled + // -- Parse CLI options + opts: Options + parse_cli_options(os.args, &opts, stdout, stderr) + + test_names: string = TEST_NAMES + if len(opts.test_names) > 0 { + test_names = opts.test_names + } + // -- Prepare test data. alloc_error: mem.Allocator_Error - when TEST_NAMES != "" { + if test_names != "" { select_internal_tests: [dynamic]Internal_Test defer delete(select_internal_tests) { - index_list := TEST_NAMES + index_list := test_names for selector in strings.split_iterator(&index_list, ",") { // Temp allocator is fine since we just need to identify which test it's referring to. split_selector := strings.split(selector, ".", context.temp_allocator) From d56e655be73acb534c3636930980a4918af79284 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Mon, 19 Jan 2026 11:17:32 -0500 Subject: [PATCH 428/766] Fix scoping issues caused by switching from `when` to `if` --- core/testing/runner.odin | 76 ++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index f3dcc8a1b..e267d13c4 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -202,7 +202,6 @@ Options :: struct { } parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Writer) { - argv:=argv[1:] test_names: strings.Builder for i := 0; i < len(argv); i+=1 { @@ -270,6 +269,12 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { } } + + // `-vet` needs parameters to be shadowed by themselves first as an + // explicit declaration, to allow the next line to work. + // NOTE(@harold): Moved out of scope below as it's no longer under a `when` block, but under `if`. + internal_tests := internal_tests + stdout := os.to_stream(os.stdout) stderr := os.to_stream(os.stderr) @@ -282,7 +287,7 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { // -- Parse CLI options opts: Options - parse_cli_options(os.args, &opts, stdout, stderr) + parse_cli_options(os.args[1:], &opts, stdout, stderr) test_names: string = TEST_NAMES if len(opts.test_names) > 0 { @@ -293,50 +298,45 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { alloc_error: mem.Allocator_Error + select_internal_tests: [dynamic]Internal_Test + defer delete(select_internal_tests) + if test_names != "" { - select_internal_tests: [dynamic]Internal_Test - defer delete(select_internal_tests) + index_list := test_names + for selector in strings.split_iterator(&index_list, ",") { + // Temp allocator is fine since we just need to identify which test it's referring to. + split_selector := strings.split(selector, ".", context.temp_allocator) - { - index_list := test_names - for selector in strings.split_iterator(&index_list, ",") { - // Temp allocator is fine since we just need to identify which test it's referring to. - split_selector := strings.split(selector, ".", context.temp_allocator) - - found := false - switch len(split_selector) { - case 1: - // Only the test name? - #no_bounds_check name := split_selector[0] - find_test_by_name: for it in internal_tests { - if it.name == name { - found = true - _, alloc_error = append(&select_internal_tests, it) - fmt.assertf(alloc_error == nil, "Error appending to select internal tests: %v", alloc_error) - break find_test_by_name - } - } - case 2: - #no_bounds_check pkg := split_selector[0] - #no_bounds_check name := split_selector[1] - find_test_by_pkg_and_name: for it in internal_tests { - if it.pkg == pkg && it.name == name { - found = true - _, alloc_error = append(&select_internal_tests, it) - fmt.assertf(alloc_error == nil, "Error appending to select internal tests: %v", alloc_error) - break find_test_by_pkg_and_name - } + found := false + switch len(split_selector) { + case 1: + // Only the test name? + #no_bounds_check name := split_selector[0] + find_test_by_name: for it in internal_tests { + if it.name == name { + found = true + _, alloc_error = append(&select_internal_tests, it) + fmt.assertf(alloc_error == nil, "Error appending to select internal tests: %v", alloc_error) + break find_test_by_name } } - if !found { - fmt.wprintfln(stderr, "No test found for the name: %q", selector) + case 2: + #no_bounds_check pkg := split_selector[0] + #no_bounds_check name := split_selector[1] + find_test_by_pkg_and_name: for it in internal_tests { + if it.pkg == pkg && it.name == name { + found = true + _, alloc_error = append(&select_internal_tests, it) + fmt.assertf(alloc_error == nil, "Error appending to select internal tests: %v", alloc_error) + break find_test_by_pkg_and_name + } } } + if !found { + fmt.wprintfln(stderr, "No test found for the name: %q", selector) + } } - // `-vet` needs parameters to be shadowed by themselves first as an - // explicit declaration, to allow the next line to work. - internal_tests := internal_tests // Intentional shadow with user-specified tests. internal_tests = select_internal_tests[:] } From 167afbc75d1e451a3cbf3b9739af6696a33d56d7 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Thu, 5 Feb 2026 10:34:20 -0500 Subject: [PATCH 429/766] Fix formatting --- core/testing/runner.odin | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index e267d13c4..8e1689df5 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -217,8 +217,7 @@ parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Wri strings.write_byte(&test_names, ',') } strings.write_bytes(&test_names, transmute([]u8)tests) - } - else if arg == "-help" { + } else if arg == "-help" { exe_name := "test" if path, err := os2.get_executable_path(context.temp_allocator); err == nil { exe_name = slashpath.base(path) @@ -236,8 +235,7 @@ parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Wri " The format is: `package.test_name,test_name_only,...`") fmt.wprintln(stdout) os.exit(0) - } - else { + } else { fmt.wprintfln(stderr, "Unknown argument encountered '%v'", arg) os.exit(-1) } From 3aed99093b32f8733692146ec015952b72e2b1c0 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Wed, 11 Feb 2026 13:46:19 -0500 Subject: [PATCH 430/766] Rebase and update to reflect `os2` -> `os` --- core/testing/runner.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 8e1689df5..97f17b199 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -219,7 +219,7 @@ parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Wri strings.write_bytes(&test_names, transmute([]u8)tests) } else if arg == "-help" { exe_name := "test" - if path, err := os2.get_executable_path(context.temp_allocator); err == nil { + if path, err := os.get_executable_path(context.temp_allocator); err == nil { exe_name = slashpath.base(path) } From 557a1911085240184c39816f8de83fd7802fa943 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Wed, 11 Feb 2026 13:51:51 -0500 Subject: [PATCH 431/766] Fix missing import after rebase --- core/testing/runner.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 97f17b199..a2e21235f 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -28,6 +28,7 @@ import "core:terminal" import "core:terminal/ansi" import "core:thread" import "core:time" +import "core:path/slashpath" // Specify how many threads to use when running tests. TEST_THREADS : int : #config(ODIN_TEST_THREADS, 0) From f755839877b2c565f8087d22c13e475b145829c3 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Feb 2026 20:02:42 +0100 Subject: [PATCH 432/766] fix wrong allocator in `endpoint_to_string` Fixes #6251 --- core/net/addr.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/net/addr.odin b/core/net/addr.odin index d29b46b65..b75a10562 100644 --- a/core/net/addr.odin +++ b/core/net/addr.odin @@ -608,13 +608,13 @@ address_to_string :: proc(addr: Address, allocator := context.temp_allocator) -> return strings.to_string(b) } -// Returns a temporarily-allocated string representation of the endpoint. +// Returns a temporarily-allocated string representation of the endpoint (if allocator isn't overwritten). // If there's a port, uses the `ip4address:port` or `[ip6address]:port` format, respectively. endpoint_to_string :: proc(ep: Endpoint, allocator := context.temp_allocator) -> string { if ep.port == 0 { return address_to_string(ep.address, allocator) } else { - s := address_to_string(ep.address, context.temp_allocator) + s := address_to_string(ep.address, allocator) b := strings.builder_make(allocator) switch a in ep.address { case IP4_Address: From d49ab07d35d59aef5be659be4e9e0d80dbff1e41 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Feb 2026 20:05:45 +0100 Subject: [PATCH 433/766] fix typo --- src/check_stmt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 66283d3da..bae95b7c7 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1930,7 +1930,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) if (rs->vals.count < max_val_count) { TokenPos start = ast_token(rs->vals[0]).pos; TokenPos end = ast_end_pos(rs->vals[rs->vals.count-1]); - error_range(start, end, "Expected a %td identifier%s, got %td", max_val_count, max_val_count == 1 ? "" : "s", rs->vals.count); + error_range(start, end, "Expected %td identifier%s, got %td", max_val_count, max_val_count == 1 ? "" : "s", rs->vals.count); } } } From cac90a84fcc8c587724494ab6cd0295b1b3aadc4 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Wed, 11 Feb 2026 14:09:33 -0500 Subject: [PATCH 434/766] Update core/testing/runner.odin for each style loop Co-authored-by: Laytan --- core/testing/runner.odin | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index a2e21235f..f4cab2815 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -205,8 +205,7 @@ Options :: struct { parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Writer) { test_names: strings.Builder - for i := 0; i < len(argv); i+=1 { - arg := argv[i] + for arg in argv { if strings.starts_with(arg, "-tests:") { tests := arg[strings.index(arg, ":")+1:] if len(tests) < 1 { From ea6867ed613433640523333146d4a77d23059cf7 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Feb 2026 20:11:35 +0100 Subject: [PATCH 435/766] Revert "fix wrong allocator in `endpoint_to_string`" This reverts commit f755839877b2c565f8087d22c13e475b145829c3. --- core/net/addr.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/net/addr.odin b/core/net/addr.odin index b75a10562..d29b46b65 100644 --- a/core/net/addr.odin +++ b/core/net/addr.odin @@ -608,13 +608,13 @@ address_to_string :: proc(addr: Address, allocator := context.temp_allocator) -> return strings.to_string(b) } -// Returns a temporarily-allocated string representation of the endpoint (if allocator isn't overwritten). +// Returns a temporarily-allocated string representation of the endpoint. // If there's a port, uses the `ip4address:port` or `[ip6address]:port` format, respectively. endpoint_to_string :: proc(ep: Endpoint, allocator := context.temp_allocator) -> string { if ep.port == 0 { return address_to_string(ep.address, allocator) } else { - s := address_to_string(ep.address, allocator) + s := address_to_string(ep.address, context.temp_allocator) b := strings.builder_make(allocator) switch a in ep.address { case IP4_Address: From f50dd2f639bf92f746067dca891a4c6fbfe92650 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Wed, 11 Feb 2026 14:13:49 -0500 Subject: [PATCH 436/766] Update core/testing/runner.odin Remove formatting `wprintln` variant where it is not needed Co-authored-by: Laytan --- core/testing/runner.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index f4cab2815..880c21327 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -225,11 +225,11 @@ parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Wri fmt.wprintfln(stdout, "Usage: %v [OPTIONS]", exe_name) fmt.wprintfln(stdout, "OPTIONS:") - fmt.wprintfln(stdout, " -help:") - fmt.wprintfln(stdout, " Display this help text and exit.") + fmt.wprintln(stdout, " -help:") + fmt.wprintln(stdout, " Display this help text and exit.") fmt.wprintln(stdout) - fmt.wprintfln(stdout, " -tests:") - fmt.wprintfln(stdout, " Specify a specific set of tests to run by name.\n" + + fmt.wprintln(stdout, " -tests:") + fmt.wprintln(stdout, " Specify a specific set of tests to run by name.\n" + " Each test is separated by a comma and may optionally include the package name.\n" + " This may be useful when running tests on multiple packages with `-all-packages`.\n" + " The format is: `package.test_name,test_name_only,...`") From 7ea074a2486084f5ea058d401af55fd73ca66c7a Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Wed, 11 Feb 2026 14:14:27 -0500 Subject: [PATCH 437/766] Update core/testing/runner.odin Write string directly Co-authored-by: Laytan --- core/testing/runner.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 880c21327..d4dc2408c 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -216,7 +216,7 @@ parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Wri if len(test_names.buf) > 0 { strings.write_byte(&test_names, ',') } - strings.write_bytes(&test_names, transmute([]u8)tests) + strings.write_string(&test_names, tests) } else if arg == "-help" { exe_name := "test" if path, err := os.get_executable_path(context.temp_allocator); err == nil { From 3b8cb7fc619bc857e6c98edc34326b46af92b6bc Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Wed, 11 Feb 2026 14:14:58 -0500 Subject: [PATCH 438/766] Update core/testing/runner.odin Use `strings.to_string` Co-authored-by: Laytan --- core/testing/runner.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index d4dc2408c..b3ac03483 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -241,7 +241,7 @@ parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Wri } } - opts.test_names = string(test_names.buf[:]) + opts.test_names = strings.to_string(test_names) } runner :: proc(internal_tests: []Internal_Test) -> bool { From 2899d09003f3e56b31225c9761970ba3a7dea395 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Wed, 11 Feb 2026 14:15:34 -0500 Subject: [PATCH 439/766] Use `strings.partition` instead of raw slicing Co-authored-by: Laytan --- core/testing/runner.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index b3ac03483..020c40d0f 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -207,7 +207,7 @@ parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Wri for arg in argv { if strings.starts_with(arg, "-tests:") { - tests := arg[strings.index(arg, ":")+1:] + _, _, tests := strings.partition(arg, ":") if len(tests) < 1 { fmt.wprintln(stderr, "No test names specified for '-tests:'") os.exit(-1) From 0ee15453e7fbb0de59a2983343538f540c9e0fd2 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Wed, 11 Feb 2026 14:16:25 -0500 Subject: [PATCH 440/766] Use `builder_len` instead of `len` on the underlying dynamic array Co-authored-by: Laytan --- core/testing/runner.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 020c40d0f..6fd243cd0 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -213,7 +213,7 @@ parse_cli_options :: proc(argv: []string, opts: ^Options, stdout, stderr: io.Wri os.exit(-1) } - if len(test_names.buf) > 0 { + if strings.builder_len(test_names) > 0 { strings.write_byte(&test_names, ',') } strings.write_string(&test_names, tests) From 43f4b2187cc362a3abba71efc73d05a085c57f04 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 11 Feb 2026 21:21:48 +0100 Subject: [PATCH 441/766] Fix #6251 Introduces `strings.Builder` versions of the various `to_string` procedures. These are used using a stack buffer for `address_to_string` as called by `endpoint_to_string`, requiring no temp allocation for the address that's then written into the endpoint's builder. --- core/net/addr.odin | 122 ++++++++++++++++++++++++++++----------------- 1 file changed, 76 insertions(+), 46 deletions(-) diff --git a/core/net/addr.odin b/core/net/addr.odin index d29b46b65..888744841 100644 --- a/core/net/addr.odin +++ b/core/net/addr.odin @@ -459,38 +459,63 @@ split_port :: proc(endpoint_str: string) -> (addr_or_host: string, port: int, ok return } -// Joins an address or hostname with a port. -join_port :: proc(address_or_host: string, port: int, allocator := context.allocator) -> string { +// Joins an address or hostname with a port, allocated using an Allocator. +join_port_allocator :: proc(address_or_host: string, port: int, allocator := context.allocator) -> string { addr_or_host, _, ok := split_port(address_or_host) if !ok { return addr_or_host } b := strings.builder_make(allocator) - addr := parse_address(addr_or_host) if addr == nil { // hostname strings.write_string(&b, addr_or_host) strings.write_string(&b, ":") strings.write_int(&b, port) + return strings.to_string(b) } else { - switch _ in addr { - case IP4_Address: - strings.write_string(&b, address_to_string(addr)) - strings.write_string(&b, ":") - strings.write_int(&b, port) - case IP6_Address: - strings.write_string(&b, "[") - strings.write_string(&b, address_to_string(addr)) - strings.write_string(&b, "]:") - strings.write_int(&b, port) - } + return _join_port_internal(addr, port, &b) } - return strings.to_string(b) } +// Joins an address or hostname with a port, allocated using a `strings.Builder`. +join_port_builder :: proc(address_or_host: string, port: int, b: ^strings.Builder) -> string { + addr_or_host, _, ok := split_port(address_or_host) + if !ok { + return addr_or_host + } + addr := parse_address(addr_or_host) + if addr == nil { + // hostname + strings.write_string(b, addr_or_host) + strings.write_string(b, ":") + strings.write_int(b, port) + return strings.to_string(b^) + } else { + return _join_port_internal(addr, port, b) + } +} + +join_port :: proc{join_port_allocator, join_port_builder} + +// Also used in `endpoint_to_string_builder`. +@(private) +_join_port_internal :: proc(addr: Address, port: int, b: ^strings.Builder) -> string { + switch a in addr { + case IP4_Address: + address_to_string_builder(addr, b) + strings.write_string(b, ":") + strings.write_int(b, port) + case IP6_Address: + strings.write_string(b, "[") + address_to_string_builder(addr, b) + strings.write_string(b, "]:") + strings.write_int(b, port) + } + return strings.to_string(b^) +} // TODO(tetra): Do we need this? map_to_ip6 :: proc(addr: Address) -> Address { @@ -510,17 +535,26 @@ map_to_ip6 :: proc(addr: Address) -> Address { See RFC 5952 section 4 for IPv6 representation recommendations. */ -address_to_string :: proc(addr: Address, allocator := context.temp_allocator) -> string { +address_to_string_allocator :: proc(addr: Address, allocator := context.temp_allocator) -> string { b := strings.builder_make(allocator) + return address_to_string_builder(addr, &b) +} + +/* + Returns a string representation of the address using a `strings.Builder`. + + See RFC 5952 section 4 for IPv6 representation recommendations. +*/ +address_to_string_builder :: proc(addr: Address, b: ^strings.Builder) -> string { switch v in addr { case IP4_Address: - strings.write_uint(&b, uint(v[0])) - strings.write_byte(&b, '.') - strings.write_uint(&b, uint(v[1])) - strings.write_byte(&b, '.') - strings.write_uint(&b, uint(v[2])) - strings.write_byte(&b, '.') - strings.write_uint(&b, uint(v[3])) + strings.write_uint(b, uint(v[0])) + strings.write_byte(b, '.') + strings.write_uint(b, uint(v[1])) + strings.write_byte(b, '.') + strings.write_uint(b, uint(v[2])) + strings.write_byte(b, '.') + strings.write_uint(b, uint(v[3])) case IP6_Address: // First find the longest run of zeroes. Zero_Run :: struct { @@ -574,7 +608,7 @@ address_to_string :: proc(addr: Address, allocator := context.temp_allocator) -> for val, i in v { if best.start == i || best.end == i { // For the left and right side of the best zero run, print a `:`. - strings.write_string(&b, ":") + strings.write_string(b, ":") } else if i < best.start { /* If we haven't made it to the best run yet, print the digit. @@ -584,10 +618,10 @@ address_to_string :: proc(addr: Address, allocator := context.temp_allocator) -> buf: [32]byte str := strconv.write_bits(buf[:], u64(val), 16, false, size_of(val), strconv.digits, {}) - strings.write_string(&b, str) + strings.write_string(b, str) if i < best.start - 1 { - strings.write_string(&b, ":") + strings.write_string(b, ":") } } else if i > best.end { /* @@ -597,42 +631,38 @@ address_to_string :: proc(addr: Address, allocator := context.temp_allocator) -> buf: [32]byte str := strconv.write_bits(buf[:], u64(val), 16, false, size_of(val), strconv.digits, {}) - strings.write_string(&b, str) + strings.write_string(b, str) if i != 7 { - strings.write_string(&b, ":") + strings.write_string(b, ":") } } } } - return strings.to_string(b) + return strings.to_string(b^) } +address_to_string :: proc{address_to_string_allocator, address_to_string_builder} // Returns a temporarily-allocated string representation of the endpoint. // If there's a port, uses the `ip4address:port` or `[ip6address]:port` format, respectively. -endpoint_to_string :: proc(ep: Endpoint, allocator := context.temp_allocator) -> string { +endpoint_to_string_allocator :: proc(ep: Endpoint, allocator := context.temp_allocator) -> string { + b := strings.builder_make(allocator) + return endpoint_to_string_builder(ep, &b) +} + +// Returns a string representation of the endpoint using a `strings.Builder`. +// If there's a port, uses the `ip4address:port` or `[ip6address]:port` format, respectively. +endpoint_to_string_builder :: proc(ep: Endpoint, b: ^strings.Builder) -> string { if ep.port == 0 { - return address_to_string(ep.address, allocator) + return address_to_string(ep.address, b) } else { - s := address_to_string(ep.address, context.temp_allocator) - b := strings.builder_make(allocator) - switch a in ep.address { - case IP4_Address: - strings.write_string(&b, s) - strings.write_string(&b, ":") - strings.write_int(&b, ep.port) - case IP6_Address: - strings.write_string(&b, "[") - strings.write_string(&b, s) - strings.write_string(&b, "]:") - strings.write_int(&b, ep.port) - } - return strings.to_string(b) + return _join_port_internal(ep.address, ep.port, b) } } -to_string :: proc{address_to_string, endpoint_to_string} +endpoint_to_string :: proc{endpoint_to_string_allocator, endpoint_to_string_builder} +to_string :: proc{address_to_string_allocator, address_to_string_builder, endpoint_to_string_allocator, endpoint_to_string_builder} family_from_address :: proc(addr: Address) -> Address_Family { switch _ in addr { From b82512b4cfca4f5e357d1510696f6665755df6f9 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 11 Feb 2026 22:15:15 +0100 Subject: [PATCH 442/766] Restrict `math.wrap` to floats. --- core/math/math.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/math/math.odin b/core/math/math.odin index 7afb32db6..1ecb1da00 100644 --- a/core/math/math.odin +++ b/core/math/math.odin @@ -418,7 +418,7 @@ remap_clamped :: proc "contextless" (old_value, old_min, old_max, new_min, new_m } @(require_results) -wrap :: proc "contextless" (x, y: $T) -> T where intrinsics.type_is_numeric(T), !intrinsics.type_is_array(T) { +wrap :: proc "contextless" (x, y: $T) -> T where intrinsics.type_is_numeric(T), intrinsics.type_is_float(T), !intrinsics.type_is_array(T) { tmp := mod(x, y) return y + tmp if tmp < 0 else tmp } From b18f75c41c4a78c1e368908ee0bfbba8efa1c494 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 11 Feb 2026 22:52:24 +0100 Subject: [PATCH 443/766] Make `core:flags` file open errors more readable If it fails because the file doesn't exist: [Open_File_Error#2] Unable to open "foo.file". File not found. If it does exist and the flags are simple (.Read, .Write or both), it'll say this: [Open_File_Error#2] Unable to open "foo.file" with perms 0o444 as read-only It it does exist but fails to open for other reasons, it'll print: [Open_File_Error#2] Unable to open "foo.file" with perms 0o444 and flags File_Flags{....} Future work: Translate permissions from octal to `ls -al` format (e.g. `-rwxrwxrwx`). --- core/flags/util.odin | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/core/flags/util.odin b/core/flags/util.odin index 0d18fa196..b5e557cf6 100644 --- a/core/flags/util.odin +++ b/core/flags/util.odin @@ -72,12 +72,37 @@ print_errors :: proc(data_type: typeid, error: Error, program: string, style: Pa case Parse_Error: fmt.wprintfln(stderr, "[%T.%v] %s", specific_error, specific_error.reason, specific_error.message) case Open_File_Error: - fmt.wprintfln(stderr, "[%T#%i] Unable to open file with perms 0o%o and flags %v: %s", - specific_error, - specific_error.errno, - specific_error.perms, - specific_error.flags, - specific_error.filename) + if os.exists(specific_error.filename) { + flags: string + if specific_error.flags == {.Read} { + flags = "read-only" + } else if specific_error.flags == {.Write} { + flags = "write-only" + } else if specific_error.flags == {.Read, .Write} { + flags = "read/write" + } + + if flags != "" { + fmt.wprintfln(stderr, "[%T#%i] Unable to open %q with perms 0o%o as %s", + specific_error, + specific_error.errno, + specific_error.filename, + u16(transmute(u32)specific_error.perms), + flags) + } else { + fmt.wprintfln(stderr, "[%T#%i] Unable to open %q with perms 0o%o and flags %v", + specific_error, + specific_error.errno, + specific_error.filename, + u16(transmute(u32)specific_error.perms), + specific_error.flags) + } + } else { + fmt.wprintfln(stderr, "[%T#%i] Unable to open %q. File not found", + specific_error, + specific_error.errno, + specific_error.filename) + } case Validation_Error: fmt.wprintfln(stderr, "[%T] %s", specific_error, specific_error.message) case Help_Request: From edcefaac12c2ca9e3b3483fb793fa6920b90cebc Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Wed, 11 Feb 2026 13:45:10 -0500 Subject: [PATCH 444/766] Remove core:mem dependency from core:strings --- core/strings/strings.odin | 75 +++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/core/strings/strings.odin b/core/strings/strings.odin index cda12f9dc..75c7154af 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -5,7 +5,6 @@ import "base:intrinsics" import "base:runtime" import "core:bytes" import "core:io" -import "core:mem" import "core:unicode" import "core:unicode/utf8" @@ -23,7 +22,7 @@ Returns: - res: The cloned string - err: An optional allocator error if one occured, `nil` otherwise */ -clone :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +clone :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { c := make([]byte, len(s), allocator, loc) or_return copy(c, s) return string(c), nil @@ -43,7 +42,7 @@ Returns: - res: A cloned cstring with an appended null-byte - err: An optional allocator error if one occured, `nil` otherwise */ -clone_to_cstring :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: cstring, err: mem.Allocator_Error) #optional_allocator_error { +clone_to_cstring :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: cstring, err: runtime.Allocator_Error) #optional_allocator_error { c := make([]byte, len(s)+1, allocator, loc) or_return copy(c, s) c[len(s)] = 0 @@ -63,7 +62,7 @@ Returns: - res: A string created from the byte pointer and length */ string_from_ptr :: proc(ptr: ^byte, len: int) -> (res: string) { - return transmute(string)mem.Raw_String{ptr, len} + return transmute(string)runtime.Raw_String{ptr, len} } /* @@ -97,7 +96,7 @@ Returns: - res: The converted cstring */ unsafe_string_to_cstring :: proc(str: string) -> (res: cstring) { - d := transmute(mem.Raw_String)str + d := transmute(runtime.Raw_String)str return cstring(d.data) } @@ -153,7 +152,7 @@ Returns: - res: The cloned string from the byte array with a null-byte - err: An optional allocator error if one occured, `nil` otherwise */ -clone_from_bytes :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +clone_from_bytes :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { c := make([]byte, len(s)+1, allocator, loc) or_return copy(c, s) c[len(s)] = 0 @@ -174,7 +173,7 @@ Returns: - res: The cloned string from the cstring - err: An optional allocator error if one occured, `nil` otherwise */ -clone_from_cstring :: proc(s: cstring, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +clone_from_cstring :: proc(s: cstring, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { return clone(string(s), allocator, loc) } @@ -195,7 +194,7 @@ Returns: - res: The cloned string from the byte pointer and length - err: An optional allocator error if one occured, `nil` otherwise */ -clone_from_ptr :: proc(ptr: ^byte, len: int, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +clone_from_ptr :: proc(ptr: ^byte, len: int, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { s := string_from_ptr(ptr, len) return clone(s, allocator, loc) } @@ -225,7 +224,7 @@ Returns: - res: The cloned string from the null-terminated cstring and byte length - err: An optional allocator error if one occured, `nil` otherwise */ -clone_from_cstring_bounded :: proc(ptr: cstring, len: int, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +clone_from_cstring_bounded :: proc(ptr: cstring, len: int, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { s := string_from_ptr((^u8)(ptr), len) s = truncate_to_byte(s, 0) return clone(s, allocator, loc) @@ -242,8 +241,16 @@ Inputs: Returns: - result: `-1` if `lhs` comes first, `1` if `rhs` comes first, or `0` if they are equal */ -compare :: proc "contextless" (lhs, rhs: string) -> (result: int) { - return mem.compare(transmute([]byte)lhs, transmute([]byte)rhs) +compare :: proc "contextless" (lhs, rhs: string) -> (res: int) { + a := transmute([]byte)lhs + b := transmute([]byte)rhs + res = runtime.memory_compare(raw_data(a), raw_data(b), min(len(a), len(b))) + if res == 0 && len(a) != len(b) { + return len(a) <= len(b) ? -1 : +1 + } else if len(a) == 0 && len(b) == 0 { + return 0 + } + return res } /* @@ -634,7 +641,7 @@ Output: a...b...c */ -join :: proc(a: []string, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +join :: proc(a: []string, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { if len(a) == 0 { return "", nil } @@ -681,7 +688,7 @@ Output: abc */ -concatenate :: proc(a: []string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +concatenate :: proc(a: []string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { if len(a) == 0 { return "", nil } @@ -788,7 +795,7 @@ Output: example */ -cut_clone :: proc(s: string, rune_offset := int(0), rune_length := int(0), allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +cut_clone :: proc(s: string, rune_offset := int(0), rune_length := int(0), allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { res = cut(s, rune_offset, rune_length) return clone(res, allocator, loc) } @@ -815,7 +822,7 @@ Returns: - err: An optional allocator error if one occured, `nil` otherwise */ @private -_split :: proc(s_, sep: string, sep_save, n_: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) { +_split :: proc(s_, sep: string, sep_save, n_: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) { s, n := s_, n_ if n == 0 { @@ -895,7 +902,7 @@ Output: ["aaa", "bbb", "ccc", "ddd", "eee"] */ -split :: proc(s, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split :: proc(s, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error { return _split(s, sep, 0, -1, allocator, loc) } @@ -933,7 +940,7 @@ Output: ["aaa", "bbb", "ccc.ddd.eee"] */ -split_n :: proc(s, sep: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_n :: proc(s, sep: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error { return _split(s, sep, 0, n, allocator, loc) } @@ -970,7 +977,7 @@ Output: ["aaa.", "bbb.", "ccc.", "ddd.", "eee"] */ -split_after :: proc(s, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_after :: proc(s, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error { return _split(s, sep, len(sep), -1, allocator, loc) } @@ -1008,7 +1015,7 @@ Output: ["aaa.", "bbb.", "ccc.ddd.eee"] */ -split_after_n :: proc(s, sep: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_after_n :: proc(s, sep: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error { return _split(s, sep, len(sep), n, allocator, loc) } @@ -1224,7 +1231,7 @@ Output: ["a", "b", "c", "d", "e"] */ -split_lines :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_lines :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error { sep :: "\n" lines := _split(s, sep, 0, -1, allocator, loc) or_return for &line in lines { @@ -1266,7 +1273,7 @@ Output: ["a", "b", "c\nd\ne"] */ -split_lines_n :: proc(s: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_lines_n :: proc(s: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error { sep :: "\n" lines := _split(s, sep, 0, n, allocator, loc) or_return for &line in lines { @@ -1307,7 +1314,7 @@ Output: ["a\n", "b\n", "c\n", "d\n", "e"] */ -split_lines_after :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_lines_after :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error { sep :: "\n" lines := _split(s, sep, len(sep), -1, allocator, loc) or_return for &line in lines { @@ -1350,7 +1357,7 @@ Output: ["a\n", "b\n", "c\nd\ne"] */ -split_lines_after_n :: proc(s: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error { +split_lines_after_n :: proc(s: string, n: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error { sep :: "\n" lines := _split(s, sep, len(sep), n, allocator, loc) or_return for &line in lines { @@ -2008,7 +2015,7 @@ Output: abcabc */ -repeat :: proc(s: string, count: int, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +repeat :: proc(s: string, count: int, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { if count < 0 { panic("strings: negative repeat count") } else if count > 0 && (len(s)*count)/count != len(s) { @@ -2711,7 +2718,7 @@ Output: ["testing", "this", "out", "nice", "done", "last"] */ -split_multi :: proc(s: string, substrs: []string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error #no_bounds_check { +split_multi :: proc(s: string, substrs: []string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { if s == "" || len(substrs) <= 0 { return nil, nil } @@ -2842,7 +2849,7 @@ Output: Hello? */ -scrub :: proc(s: string, replacement: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +scrub :: proc(s: string, replacement: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { str := s b: Builder builder_init(&b, 0, len(s), allocator, loc) or_return @@ -2904,7 +2911,7 @@ Output: abcxyz zyxcba */ -reverse :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +reverse :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { str := s n := len(str) buf := make([]byte, n, allocator, loc) or_return @@ -2951,7 +2958,7 @@ Output: abc1 abc2 abc3 */ -expand_tabs :: proc(s: string, tab_size: int, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +expand_tabs :: proc(s: string, tab_size: int, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { if tab_size <= 0 { panic("tab size must be positive") } @@ -3063,7 +3070,7 @@ Returns: - res: A new string centered within a field of the specified length - err: An optional allocator error if one occured, `nil` otherwise */ -centre_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +centre_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { n := rune_count(str) if n >= length || pad == "" { return clone(str, allocator, loc) @@ -3100,7 +3107,7 @@ Returns: - res: A new string left-justified within a field of the specified length - err: An optional allocator error if one occured, `nil` otherwise */ -left_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +left_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { n := rune_count(str) if n >= length || pad == "" { return clone(str, allocator, loc) @@ -3136,7 +3143,7 @@ Returns: - res: A new string right-justified within a field of the specified length - err: An optional allocator error if one occured, `nil` otherwise */ -right_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +right_justify :: proc(str: string, length: int, pad: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { n := rune_count(str) if n >= length || pad == "" { return clone(str, allocator, loc) @@ -3197,7 +3204,7 @@ Returns: - res: A slice of substrings of the input string, or an empty slice if the input string only contains white space - err: An optional allocator error if one occured, `nil` otherwise */ -fields :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error #no_bounds_check { +fields :: proc(s: string, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { n := 0 was_space := 1 set_bits := u8(0) @@ -3263,7 +3270,7 @@ Returns: - res: A slice of substrings of the input string, or an empty slice if all code points in the input string satisfy the predicate or if the input string is empty - err: An optional allocator error if one occured, `nil` otherwise */ -fields_proc :: proc(s: string, f: proc(rune) -> bool, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: mem.Allocator_Error) #optional_allocator_error #no_bounds_check { +fields_proc :: proc(s: string, f: proc(rune) -> bool, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { substrings := make([dynamic]string, 0, 32, allocator, loc) or_return start, end := -1, -1 @@ -3347,7 +3354,7 @@ Returns: NOTE: This implementation is a single-row-version of the Wagner–Fischer algorithm, based on C code by Martin Ettl. */ -levenshtein_distance :: proc(a, b: string, allocator := context.allocator, loc := #caller_location) -> (res: int, err: mem.Allocator_Error) #optional_allocator_error { +levenshtein_distance :: proc(a, b: string, allocator := context.allocator, loc := #caller_location) -> (res: int, err: runtime.Allocator_Error) #optional_allocator_error { LEVENSHTEIN_DEFAULT_COSTS: []int : { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, From 97683ae0146e6668d56e701c1d54a4e1737e41c8 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 10:48:26 +0100 Subject: [PATCH 445/766] Simplify --- core/os/path.odin | 4 ++-- tests/core/os/file.odin | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/core/os/path.odin b/core/os/path.odin index e0353e43d..3c22852bf 100644 --- a/core/os/path.odin +++ b/core/os/path.odin @@ -145,7 +145,7 @@ This will remove duplicate separators and unneeded references to the current or parent directory. */ @(require_results) -clean_path :: proc(path: string, allocator: runtime.Allocator) -> (cleaned: string, err: Error) { +clean_path :: proc(path: string, allocator: runtime.Allocator) -> (cleaned: string, err: runtime.Allocator_Error) { if path == "" || path == "." { return strings.clone(".", allocator) } @@ -491,7 +491,7 @@ Join all `elems` with the system's path separator and normalize the result. For example, `join_path({"/home", "foo", "bar.txt"})` will result in `"/home/foo/bar.txt"`. */ @(require_results) -join_path :: proc(elems: []string, allocator: runtime.Allocator) -> (joined: string, err: Error) { +join_path :: proc(elems: []string, allocator: runtime.Allocator) -> (joined: string, err: runtime.Allocator_Error) { for e, i in elems { if e != "" { temp_allocator := TEMP_ALLOCATOR_GUARD({ allocator }) diff --git a/tests/core/os/file.odin b/tests/core/os/file.odin index aed57c26c..99ae5b928 100644 --- a/tests/core/os/file.odin +++ b/tests/core/os/file.odin @@ -5,10 +5,9 @@ import "core:testing" @(test) test_clone :: proc(t: ^testing.T) { - joined, err := os.join_path({#directory, "file.odin"}, context.temp_allocator) - testing.expect_value(t, err, nil) - f: ^os.File - f, err = os.open(joined) + joined, j_err := os.join_path({#directory, "file.odin"}, context.temp_allocator) + testing.expect_value(t, j_err, nil) + f, err := os.open(joined) testing.expect_value(t, err, nil) testing.expect(t, f != nil) From 658e6b9d9fabe0b249f552257fe8918b010003b0 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 12:02:11 +0100 Subject: [PATCH 446/766] Add `core:log` support for js/wasm Also add #panic when importing `core:os` on wasm. --- core/log/console_logger_js.odin | 119 ++++++++++++++++++++++++++++++++ core/os/dir_js.odin | 6 +- core/os/env_js.odin | 10 +-- core/os/errors_js.odin | 6 +- core/os/file_js.odin | 9 ++- core/os/heap_js.odin | 6 +- core/os/path_js.odin | 4 ++ core/os/pipe_js.odin | 6 +- core/os/process_js.odin | 4 ++ core/os/stat_js.odin | 4 ++ core/os/temp_file_js.odin | 4 ++ core/os/wasm.odin | 4 ++ 12 files changed, 171 insertions(+), 11 deletions(-) create mode 100644 core/log/console_logger_js.odin create mode 100644 core/os/wasm.odin diff --git a/core/log/console_logger_js.odin b/core/log/console_logger_js.odin new file mode 100644 index 000000000..1e07b6cdc --- /dev/null +++ b/core/log/console_logger_js.odin @@ -0,0 +1,119 @@ +#+build js +package log + +import "core:fmt" +import "core:strings" +import "core:time" + +Level_Headers := [?]string{ + 0..<10 = "[DEBUG] --- ", + 10..<20 = "[INFO ] --- ", + 20..<30 = "[WARN ] --- ", + 30..<40 = "[ERROR] --- ", + 40..<50 = "[FATAL] --- ", +} + +Default_Console_Logger_Opts :: Options{ + .Level, + .Short_File_Path, + .Line, + .Procedure, +} | Full_Timestamp_Opts + +Console_Logger_Data :: struct { + ident: string, +} + +create_console_logger :: proc(lowest := Level.Debug, opt := Default_Console_Logger_Opts, ident := "", allocator := context.allocator) -> Logger { + data := new(Console_Logger_Data, allocator) + data.ident = strings.clone(ident) + return Logger{console_logger_proc, data, lowest, opt} +} + +destroy_console_logger :: proc(log: Logger, allocator := context.allocator) { + data := cast(^Console_Logger_Data)log.data + delete(data.ident) + free(log.data, allocator) +} + +console_logger_proc :: proc(logger_data: rawptr, level: Level, text: string, options: Options, location := #caller_location) { + options := options + data := cast(^Console_Logger_Data)logger_data + + backing: [1024]byte //NOTE(Hoej): 1024 might be too much for a header backing, unless somebody has really long paths. + buf := strings.builder_from_bytes(backing[:]) + + if .Level in options { + fmt.sbprint(&buf, Level_Headers[level]) + } + + when time.IS_SUPPORTED { + do_time_header(options, &buf, time.now()) + } + + do_location_header(options, &buf, location) + + if data.ident != "" { + fmt.sbprintf(&buf, "[%s] ", data.ident) + } + + h := fmt.stderr if level >= .Error else fmt.stdout + + //TODO(Hoej): When we have better atomics and such, make this thread-safe + fmt.fprintf(h, "%s%s\n", strings.to_string(buf), text) +} + +do_time_header :: proc(opts: Options, buf: ^strings.Builder, t: time.Time) { + when time.IS_SUPPORTED { + if Full_Timestamp_Opts & opts != nil { + fmt.sbprint(buf, "[") + y, m, d := time.date(t) + h, min, s := time.clock(t) + if .Date in opts { + fmt.sbprintf(buf, "%d-%02d-%02d", y, m, d) + if .Time in opts { + fmt.sbprint(buf, " ") + } + } + if .Time in opts { fmt.sbprintf(buf, "%02d:%02d:%02d", h, min, s) } + fmt.sbprint(buf, "] ") + } + } +} + +do_location_header :: proc(opts: Options, buf: ^strings.Builder, location := #caller_location) { + if Location_Header_Opts & opts == nil { + return + } + fmt.sbprint(buf, "[") + + file := location.file_path + if .Short_File_Path in opts { + last := 0 + for r, i in location.file_path { + if r == '/' { + last = i+1 + } + } + file = location.file_path[last:] + } + + if Location_File_Opts & opts != nil { + fmt.sbprint(buf, file) + } + if .Line in opts { + if Location_File_Opts & opts != nil { + fmt.sbprint(buf, ":") + } + fmt.sbprint(buf, location.line) + } + + if .Procedure in opts { + if (Location_File_Opts | {.Line}) & opts != nil { + fmt.sbprint(buf, ":") + } + fmt.sbprintf(buf, "%s()", location.procedure) + } + + fmt.sbprint(buf, "] ") +} \ No newline at end of file diff --git a/core/os/dir_js.odin b/core/os/dir_js.odin index 8c45cf63b..cd6227507 100644 --- a/core/os/dir_js.odin +++ b/core/os/dir_js.odin @@ -2,6 +2,10 @@ #+private package os +// None of this does anything on js/wasm. +// It's only here so importing `core:os` on wasm panics cleanly, +// without spamming about all sorts of missing procs and types. + import "base:intrinsics" Read_Directory_Iterator_Impl :: struct { @@ -21,4 +25,4 @@ _read_directory_iterator_init :: proc(it: ^Read_Directory_Iterator, f: ^File) { _read_directory_iterator_destroy :: proc(it: ^Read_Directory_Iterator) { -} +} \ No newline at end of file diff --git a/core/os/env_js.odin b/core/os/env_js.odin index 644af61bd..55ffce593 100644 --- a/core/os/env_js.odin +++ b/core/os/env_js.odin @@ -2,16 +2,16 @@ #+private package os +// None of this does anything on js/wasm. +// It's only here so importing `core:os` on wasm panics cleanly, +// without spamming about all sorts of missing procs and types. + import "base:runtime" build_env :: proc() -> (err: Error) { return } -// delete_string_if_not_original :: proc(str: string) { - -// } - @(require_results) _lookup_env_alloc :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) { return @@ -39,4 +39,4 @@ _clear_env :: proc() { @(require_results) _environ :: proc(allocator: runtime.Allocator) -> (environ: []string, err: Error) { return {}, .Unsupported -} +} \ No newline at end of file diff --git a/core/os/errors_js.odin b/core/os/errors_js.odin index 34779807d..368b94d68 100644 --- a/core/os/errors_js.odin +++ b/core/os/errors_js.odin @@ -2,6 +2,10 @@ #+private package os +// None of this does anything on js/wasm. +// It's only here so importing `core:os` on wasm panics cleanly, +// without spamming about all sorts of missing procs and types. + _Platform_Error :: enum i32 {} _error_string :: proc(errno: i32) -> string { @@ -10,4 +14,4 @@ _error_string :: proc(errno: i32) -> string { _get_platform_error :: proc(errno: _Platform_Error) -> Error { return Platform_Error(errno) -} +} \ No newline at end of file diff --git a/core/os/file_js.odin b/core/os/file_js.odin index 5d921c9b0..aef811c11 100644 --- a/core/os/file_js.odin +++ b/core/os/file_js.odin @@ -2,12 +2,17 @@ #+private package os -import "base:runtime" +// None of this does anything on js/wasm. +// It's only here so importing `core:os` on wasm panics cleanly, +// without spamming about all sorts of missing procs and types. +import "base:runtime" import "core:io" import "core:time" -File_Impl :: distinct rawptr +File_Impl :: struct { + file: File, +} _open :: proc(name: string, flags: File_Flags, perm: Permissions) -> (f: ^File, err: Error) { return nil, .Unsupported diff --git a/core/os/heap_js.odin b/core/os/heap_js.odin index 5f8d9bd35..ebc8f902d 100644 --- a/core/os/heap_js.odin +++ b/core/os/heap_js.odin @@ -2,6 +2,10 @@ #+private package os +// None of this does anything on js/wasm. +// It's only here so importing `core:os` on wasm panics cleanly, +// without spamming about all sorts of missing procs and types. + import "base:runtime" -_heap_allocator_proc :: runtime.wasm_allocator_proc +_heap_allocator_proc :: runtime.wasm_allocator_proc \ No newline at end of file diff --git a/core/os/path_js.odin b/core/os/path_js.odin index 6ac845560..874b45c89 100644 --- a/core/os/path_js.odin +++ b/core/os/path_js.odin @@ -2,6 +2,10 @@ #+private package os +// None of this does anything on js/wasm. +// It's only here so importing `core:os` on wasm panics cleanly, +// without spamming about all sorts of missing procs and types. + import "base:runtime" _Path_Separator :: '/' diff --git a/core/os/pipe_js.odin b/core/os/pipe_js.odin index aea5e9a83..5e724ea00 100644 --- a/core/os/pipe_js.odin +++ b/core/os/pipe_js.odin @@ -2,6 +2,10 @@ #+private package os +// None of this does anything on js/wasm. +// It's only here so importing `core:os` on wasm panics cleanly, +// without spamming about all sorts of missing procs and types. + _pipe :: proc() -> (r, w: ^File, err: Error) { err = .Unsupported return @@ -11,4 +15,4 @@ _pipe :: proc() -> (r, w: ^File, err: Error) { _pipe_has_data :: proc(r: ^File) -> (ok: bool, err: Error) { err = .Unsupported return -} +} \ No newline at end of file diff --git a/core/os/process_js.odin b/core/os/process_js.odin index 6283d270c..9b682da0c 100644 --- a/core/os/process_js.odin +++ b/core/os/process_js.odin @@ -2,6 +2,10 @@ #+private package os +// None of this does anything on js/wasm. +// It's only here so importing `core:os` on wasm panics cleanly, +// without spamming about all sorts of missing procs and types. + import "base:runtime" import "core:time" diff --git a/core/os/stat_js.odin b/core/os/stat_js.odin index bad75486b..a304435d9 100644 --- a/core/os/stat_js.odin +++ b/core/os/stat_js.odin @@ -2,6 +2,10 @@ #+private package os +// None of this does anything on js/wasm. +// It's only here so importing `core:os` on wasm panics cleanly, +// without spamming about all sorts of missing procs and types. + import "base:runtime" _fstat :: proc(f: ^File, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { diff --git a/core/os/temp_file_js.odin b/core/os/temp_file_js.odin index 32ce1c484..53158d843 100644 --- a/core/os/temp_file_js.odin +++ b/core/os/temp_file_js.odin @@ -2,6 +2,10 @@ #+private package os +// None of this does anything on js/wasm. +// It's only here so importing `core:os` on wasm panics cleanly, +// without spamming about all sorts of missing procs and types. + import "base:runtime" _temp_dir :: proc(allocator: runtime.Allocator) -> (string, runtime.Allocator_Error) { diff --git a/core/os/wasm.odin b/core/os/wasm.odin new file mode 100644 index 000000000..5153a3f93 --- /dev/null +++ b/core/os/wasm.odin @@ -0,0 +1,4 @@ +#+build wasm32, wasm64p32 +package os + +#panic("core:os is unsupported on js/wasm") \ No newline at end of file From 62cfa9e8e35ddc0c175ac5c1b429108c19b60b71 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 12:21:01 +0100 Subject: [PATCH 447/766] Narrowly tailor panic. --- core/os/wasm.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/os/wasm.odin b/core/os/wasm.odin index 5153a3f93..79c00f694 100644 --- a/core/os/wasm.odin +++ b/core/os/wasm.odin @@ -1,4 +1,4 @@ -#+build wasm32, wasm64p32 +#+build js wasm32, js wasm64p32 package os #panic("core:os is unsupported on js/wasm") \ No newline at end of file From 1159110e735ba84d651f4bbc4e9883fd83e9eddc Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 13:55:17 +0100 Subject: [PATCH 448/766] Fix #6265 --- core/path/filepath/path.odin | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index 58dc06103..a325ce4cd 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -251,15 +251,22 @@ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> ( */ dir :: proc(path: string, allocator := context.allocator) -> string { context.allocator = allocator - vol := volume_name(path) + vol_len := len(volume_name(path)) + when ODIN_OS == .Windows { + if len(path) >= 3 && is_separator(path[2]) { + vol_len += 1 + } + } + vol := path[:vol_len] + i := len(path) - 1 - for i >= len(vol) && !is_separator(path[i]) { + for i >= vol_len && !is_separator(path[i]) { i -= 1 } - dir, dir_err := clean(path[len(vol) : i+1], allocator) + dir, dir_err := clean(path[vol_len : i+1], allocator) if dir_err != nil { return "" } defer delete(dir) - if dir == "." && len(vol) > 2 { + if dir == "." && vol_len > 2 { return strings.clone(vol) } return strings.concatenate({vol, dir}) From 71f343bc85d9e0e6e87438611c5025796a1eefbc Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 13:04:58 +0100 Subject: [PATCH 449/766] Remove `core:mem` import from `core:math/big`. --- core/math/big/internal.odin | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/core/math/big/internal.odin b/core/math/big/internal.odin index 333fee3ad..02d7b4544 100644 --- a/core/math/big/internal.odin +++ b/core/math/big/internal.odin @@ -29,7 +29,7 @@ package math_big import "base:builtin" import "base:intrinsics" -import "core:mem" +import "base:runtime" import rnd "core:math/rand" /* @@ -989,7 +989,8 @@ internal_int_mod_bits :: proc(remainder, numerator: ^Int, bits: int, allocator : Zero remainder. Special case, can't use `internal_zero_unused`. */ if zero_count > 0 { - mem.zero_slice(remainder.digit[zero_count:]) + data := remainder.digit[zero_count:] + _zero(data) } /* @@ -1015,7 +1016,7 @@ internal_int_mod_bits :: proc(remainder, numerator: ^Int, bits: int, allocator : Assumes `a` not to be `nil`. */ internal_int_allocated_cap :: #force_inline proc(a: ^Int) -> (cap: int) { - raw := transmute(mem.Raw_Dynamic_Array)a.digit + raw := transmute(runtime.Raw_Dynamic_Array)a.digit return raw.cap } @@ -1845,7 +1846,7 @@ internal_int_destroy :: proc(integers: ..^Int) { for &a in integers { if internal_int_allocated_cap(a) > 0 { - mem.zero_slice(a.digit[:]) + _zero(a.digit[:]) free(&a.digit[0]) } a = &Int{} @@ -2177,7 +2178,7 @@ internal_int_grow :: proc(a: ^Int, digits: int, allow_shrink := false, allocator If not yet initialized, initialize the `digit` backing with the allocator we were passed. */ if cap == 0 { - mem_err: mem.Allocator_Error + mem_err: runtime.Allocator_Error a.digit, mem_err = make([dynamic]DIGIT, needed, allocator) if mem_err != nil { return cast(Error)mem_err @@ -2208,9 +2209,9 @@ internal_grow :: proc { internal_int_grow, } Assumes `a` not to be `nil`. */ internal_int_clear :: proc(a: ^Int, minimize := false, allocator := context.allocator) -> (err: Error) { - raw := transmute(mem.Raw_Dynamic_Array)a.digit + raw := transmute(runtime.Raw_Dynamic_Array)a.digit if raw.cap != 0 { - mem.zero_slice(a.digit[:a.used]) + _zero(a.digit[:a.used]) } a.sign = .Zero_or_Positive a.used = 0 @@ -2273,7 +2274,7 @@ internal_int_power_of_two :: proc(a: ^Int, power: int, allocator := context.allo /* Zero the entirety. */ - mem.zero_slice(a.digit[:]) + _zero(a.digit[:]) /* Set the bit. @@ -2944,11 +2945,15 @@ internal_int_zero_unused :: #force_inline proc(dest: ^Int, old_used := -1) { Zero remainder. */ if zero_count > 0 && dest.used < len(dest.digit) { - mem.zero_slice(dest.digit[dest.used:][:zero_count]) + _zero(dest.digit[dest.used:][:zero_count]) } } internal_zero_unused :: proc { internal_int_zero_unused, } +_zero :: proc(data: []DIGIT) { + intrinsics.mem_zero(raw_data(data), size_of(DIGIT)*len(data)) +} + /* ========================== End of low-level routines ========================== */ From 76c866686ce0b1051507caab56b0d21b8d348e29 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 13:15:34 +0100 Subject: [PATCH 450/766] Remove `core:mem` import from `core:sys/darwin/Foundation`. --- core/sys/darwin/Foundation/NSBlock.odin | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/sys/darwin/Foundation/NSBlock.odin b/core/sys/darwin/Foundation/NSBlock.odin index 8e65391f4..34e562d75 100644 --- a/core/sys/darwin/Foundation/NSBlock.odin +++ b/core/sys/darwin/Foundation/NSBlock.odin @@ -2,13 +2,13 @@ package objc_Foundation import "base:intrinsics" import "base:builtin" -import "core:mem" +import "base:runtime" @(objc_class="NSBlock") Block :: struct {using _: Object} @(objc_type=Block, objc_name="createGlobal", objc_is_class_method=true) -Block_createGlobal :: proc (user_data: rawptr, user_proc: proc "c" (user_data: rawptr), allocator := context.allocator) -> (^Block, mem.Allocator_Error) #optional_allocator_error { +Block_createGlobal :: proc (user_data: rawptr, user_proc: proc "c" (user_data: rawptr), allocator := context.allocator) -> (^Block, runtime.Allocator_Error) #optional_allocator_error { return Block_createInternal(true, user_data, user_proc, allocator) } @(objc_type=Block, objc_name="createLocal", objc_is_class_method=true) @@ -17,7 +17,7 @@ Block_createLocal :: proc (user_data: rawptr, user_proc: proc "c" (user_data: ra return b } @(objc_type=Block, objc_name="createGlobalWithParam", objc_is_class_method=true) -Block_createGlobalWithParam :: proc (user_data: rawptr, user_proc: proc "c" (user_data: rawptr, t: $T), allocator := context.allocator) -> (^Block, mem.Allocator_Error) #optional_allocator_error { +Block_createGlobalWithParam :: proc (user_data: rawptr, user_proc: proc "c" (user_data: rawptr, t: $T), allocator := context.allocator) -> (^Block, runtime.Allocator_Error) #optional_allocator_error { return Block_createInternalWithParam(true, user_data, user_proc, allocator) } @(objc_type=Block, objc_name="createLocalWithParam", objc_is_class_method=true) @@ -69,7 +69,7 @@ foreign libSystem { } @(private="file") -internal_block_literal_make :: proc (is_global: bool, user_data: rawptr, user_proc: rawptr, invoke: rawptr, allocator: mem.Allocator) -> (b: ^Block, err: mem.Allocator_Error) { +internal_block_literal_make :: proc (is_global: bool, user_data: rawptr, user_proc: rawptr, invoke: rawptr, allocator: runtime.Allocator) -> (b: ^Block, err: runtime.Allocator_Error) { _init :: proc(bl: ^Internal_Block_Literal, is_global: bool, user_data: rawptr, user_proc: rawptr, invoke: rawptr) { // Set to true on blocks that have captures (and thus are not true // global blocks) but are known not to escape for various other @@ -105,7 +105,7 @@ internal_block_literal_make :: proc (is_global: bool, user_data: rawptr, user_pr } @(private="file") -Block_createInternal :: proc (is_global: bool, user_data: rawptr, user_proc: proc "c" (user_data: rawptr), allocator: mem.Allocator) -> (b: ^Block, err: mem.Allocator_Error) { +Block_createInternal :: proc (is_global: bool, user_data: rawptr, user_proc: proc "c" (user_data: rawptr), allocator: runtime.Allocator) -> (b: ^Block, err: runtime.Allocator_Error) { invoke :: proc "c" (bl: ^Internal_Block_Literal) { user_proc := (proc "c" (rawptr))(bl.user_proc) user_proc(bl.user_data) @@ -114,7 +114,7 @@ Block_createInternal :: proc (is_global: bool, user_data: rawptr, user_proc: pro } @(private="file") -Block_createInternalWithParam :: proc (is_global: bool, user_data: rawptr, user_proc: proc "c" (user_data: rawptr, t: $T), allocator: mem.Allocator) -> (b: ^Block, err: mem.Allocator_Error) { +Block_createInternalWithParam :: proc (is_global: bool, user_data: rawptr, user_proc: proc "c" (user_data: rawptr, t: $T), allocator: runtime.Allocator) -> (b: ^Block, err: runtime.Allocator_Error) { invoke :: proc "c" (bl: ^Internal_Block_Literal, t: T) { user_proc := (proc "c" (rawptr, T))(bl.user_proc) user_proc(bl.user_data, t) From 2b2b5aeefb428abd2f8cf401f40c0f580e7747a8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Feb 2026 13:24:35 +0000 Subject: [PATCH 451/766] Support `for init; x in y {}` in `core:odin/parser` --- core/odin/ast/ast.odin | 1 + core/odin/ast/clone.odin | 1 + core/odin/ast/walk.odin | 3 +++ core/odin/parser/parser.odin | 14 +++++++++++++- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index ec22db434..2cee6e385 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -432,6 +432,7 @@ For_Stmt :: struct { Range_Stmt :: struct { using node: Stmt, label: ^Expr, // possibly nil + init: ^Stmt, for_pos: tokenizer.Pos, vals: []^Expr, in_pos: tokenizer.Pos, diff --git a/core/odin/ast/clone.odin b/core/odin/ast/clone.odin index b7501e6ca..df3e1df0d 100644 --- a/core/odin/ast/clone.odin +++ b/core/odin/ast/clone.odin @@ -239,6 +239,7 @@ clone_node :: proc(node: ^Node) -> ^Node { r.body = clone(r.body) case ^Range_Stmt: r.label = clone(r.label) + r.init = clone(r.init) r.vals = clone(r.vals) r.expr = clone(r.expr) r.body = clone(r.body) diff --git a/core/odin/ast/walk.odin b/core/odin/ast/walk.odin index cba040875..24c90c13b 100644 --- a/core/odin/ast/walk.odin +++ b/core/odin/ast/walk.odin @@ -222,6 +222,9 @@ walk :: proc(v: ^Visitor, node: ^Node) { if n.label != nil { walk(v, n.label) } + if n.init != nil { + walk(v, n.init) + } for val in n.vals { if val != nil { walk(v, val) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index a18942e6b..643673c69 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -881,7 +881,7 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt { body: ^ast.Stmt is_range := false - if p.curr_tok.kind != .Open_Brace && p.curr_tok.kind != .Do { + general_conds: if p.curr_tok.kind != .Open_Brace && p.curr_tok.kind != .Do { prev_level := p.expr_level defer p.expr_level = prev_level p.expr_level = -1 @@ -929,6 +929,17 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt { error(p, p.curr_tok.pos, "Expected ';', followed by a condition expression and post statement, got %s", tokenizer.tokens[p.curr_tok.kind]) } else { if p.curr_tok.kind != .Semicolon { + if p.curr_tok.kind == .Ident { + next_token := peek_token(p) + if next_token.kind == .In || next_token.kind == .Comma { + cond = parse_simple_stmt(p, {.In}) + as := cond.derived_stmt.(^ast.Assign_Stmt) + assert(as.op.kind == .In) + is_range = true + break general_conds + } + } + cond = parse_simple_stmt(p, nil) } @@ -967,6 +978,7 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt { range_stmt := ast.new(ast.Range_Stmt, tok.pos, body) range_stmt.for_pos = tok.pos + range_stmt.init = init range_stmt.vals = vals range_stmt.in_pos = assign_stmt.op.pos range_stmt.expr = rhs From d8f2eb271758e7ddedece6b8010b2bae6843b112 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 14:37:28 +0100 Subject: [PATCH 452/766] Remove `core:mem` import from `core:math/big`. --- core/math/big/private.odin | 15 +++++++-------- core/math/big/radix.odin | 13 ++++++------- core/math/big/radix_os.odin | 4 ++-- core/math/rand/rand.odin | 7 +++---- 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/core/math/big/private.odin b/core/math/big/private.odin index caed8c8b9..8cf7a2a77 100644 --- a/core/math/big/private.odin +++ b/core/math/big/private.odin @@ -19,7 +19,6 @@ package math_big */ import "base:intrinsics" -import "core:mem" /* Multiplies |a| * |b| and only computes upto digs digits of result. @@ -817,7 +816,7 @@ _private_int_sqr_karatsuba :: proc(dest, src: ^Int, allocator := context.allocat x1.used = src.used - B #force_inline internal_copy_digits(x0, src, x0.used) - #force_inline mem.copy_non_overlapping(&x1.digit[0], &src.digit[B], size_of(DIGIT) * x1.used) + intrinsics.mem_copy_non_overlapping(&x1.digit[0], &src.digit[B], size_of(DIGIT) * x1.used) #force_inline internal_clamp(x0) /* @@ -882,9 +881,9 @@ _private_int_sqr_toom :: proc(dest, src: ^Int, allocator := context.allocator) - a1.used = B a2.used = src.used - 2 * B - #force_inline mem.copy_non_overlapping(&a0.digit[0], &src.digit[ 0], size_of(DIGIT) * a0.used) - #force_inline mem.copy_non_overlapping(&a1.digit[0], &src.digit[ B], size_of(DIGIT) * a1.used) - #force_inline mem.copy_non_overlapping(&a2.digit[0], &src.digit[2 * B], size_of(DIGIT) * a2.used) + intrinsics.mem_copy_non_overlapping(&a0.digit[0], &src.digit[ 0], size_of(DIGIT) * a0.used) + intrinsics.mem_copy_non_overlapping(&a1.digit[0], &src.digit[ B], size_of(DIGIT) * a1.used) + intrinsics.mem_copy_non_overlapping(&a2.digit[0], &src.digit[2 * B], size_of(DIGIT) * a2.used) internal_clamp(a0) internal_clamp(a1) @@ -2340,7 +2339,7 @@ _private_int_dr_reduce :: proc(x, n: ^Int, k: DIGIT, allocator := context.alloca /* Zero words above m. */ - mem.zero_slice(x.digit[m + 1:][:x.used - m]) + _zero(x.digit[m + 1:][:x.used - m]) /* Clamp, sub and return. @@ -3137,7 +3136,7 @@ _private_copy_digits :: proc(dest, src: ^Int, digits: int, offset := int(0)) -> } digits = min(digits, len(src.digit), len(dest.digit)) - mem.copy_non_overlapping(&dest.digit[0], &src.digit[offset], size_of(DIGIT) * digits) + intrinsics.mem_copy_non_overlapping(&dest.digit[0], &src.digit[offset], size_of(DIGIT) * digits) return nil } @@ -3175,7 +3174,7 @@ _private_int_shl_leg :: proc(quotient: ^Int, digits: int, allocator := context.a } quotient.used += digits - mem.zero_slice(quotient.digit[:digits]) + _zero(quotient.digit[:digits]) return nil } diff --git a/core/math/big/radix.odin b/core/math/big/radix.odin index 0d57bc071..b4f5f875e 100644 --- a/core/math/big/radix.odin +++ b/core/math/big/radix.odin @@ -15,8 +15,7 @@ package math_big - Also look at extracting and splatting several digits at once. */ -import "base:intrinsics" -import "core:mem" +import "base:intrinsics" /* This version of `itoa` allocates on behalf of the caller. The caller must free the string. @@ -143,7 +142,7 @@ int_itoa_raw :: proc(a: ^Int, radix: i8, buffer: []u8, size := int(-1), zero_ter written = len(buffer) - available if written < size { diff := size - written - mem.copy(&buffer[0], &buffer[diff], written) + intrinsics.mem_copy(&buffer[0], &buffer[diff], written) } return written, nil } @@ -176,7 +175,7 @@ int_itoa_raw :: proc(a: ^Int, radix: i8, buffer: []u8, size := int(-1), zero_ter written = len(buffer) - available if written < size { diff := size - written - mem.copy(&buffer[0], &buffer[diff], written) + intrinsics.mem_copy(&buffer[0], &buffer[diff], written) } return written, nil } @@ -217,7 +216,7 @@ int_itoa_raw :: proc(a: ^Int, radix: i8, buffer: []u8, size := int(-1), zero_ter written = len(buffer) - available if written < size { diff := size - written - mem.copy(&buffer[0], &buffer[diff], written) + intrinsics.mem_copy(&buffer[0], &buffer[diff], written) } return written, nil } @@ -640,7 +639,7 @@ _itoa_raw_full :: proc(a: ^Int, radix: i8, buffer: []u8, zero_terminate := false written = len(buffer) - available if written < len(buffer) { diff := len(buffer) - written - mem.copy(&buffer[0], &buffer[diff], written) + intrinsics.mem_copy(&buffer[0], &buffer[diff], written) } return written, nil } @@ -688,7 +687,7 @@ _itoa_raw_old :: proc(a: ^Int, radix: i8, buffer: []u8, zero_terminate := false, written = len(buffer) - available if written < len(buffer) { diff := len(buffer) - written - mem.copy(&buffer[0], &buffer[diff], written) + intrinsics.mem_copy(&buffer[0], &buffer[diff], written) } return written, nil } \ No newline at end of file diff --git a/core/math/big/radix_os.odin b/core/math/big/radix_os.odin index 50454b679..793a6c88a 100644 --- a/core/math/big/radix_os.odin +++ b/core/math/big/radix_os.odin @@ -17,7 +17,7 @@ package math_big - Also look at extracting and splatting several digits at once. */ -import "core:mem" +import "base:runtime" import "core:os" /* @@ -69,7 +69,7 @@ internal_int_write_to_ascii_file :: proc(a: ^Int, filename: string, radix := i8( l := len(as) assert(l > 0) - data := transmute([]u8)mem.Raw_Slice{ + data := transmute([]u8)runtime.Raw_Slice{ data = raw_data(as), len = l, } diff --git a/core/math/rand/rand.odin b/core/math/rand/rand.odin index 2ed2c9e70..738de07e5 100644 --- a/core/math/rand/rand.odin +++ b/core/math/rand/rand.odin @@ -4,7 +4,6 @@ package rand import "base:intrinsics" import "base:runtime" import "core:math" -import "core:mem" Generator :: runtime.Random_Generator @@ -1031,11 +1030,11 @@ Returns: - err: An allocator error if one occured, `nil` otherwise Example: + import "base:runtime" import "core:math/rand" - import "core:mem" import "core:fmt" - perm_example :: proc() -> (err: mem.Allocator_Error) { + perm_example :: proc() -> (err: runtime.Allocator_Error) { data := rand.perm(4) or_return fmt.println(data) defer delete(data, context.allocator) @@ -1050,7 +1049,7 @@ Possible Output: */ @(require_results) -perm :: proc(n: int, allocator := context.allocator, gen := context.random_generator) -> (res: []int, err: mem.Allocator_Error) #optional_allocator_error { +perm :: proc(n: int, allocator := context.allocator, gen := context.random_generator) -> (res: []int, err: runtime.Allocator_Error) #optional_allocator_error { m := make([]int, n, allocator) or_return for i := 0; i < n; i += 1 { j := int_max(i+1, gen) From af80dfe9953cae85b37ec9c0e80e278976f1aff9 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 14:56:24 +0100 Subject: [PATCH 453/766] Remove `core:mem` import from `core:sync/chan`. --- core/sync/chan/chan.odin | 44 ++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/core/sync/chan/chan.odin b/core/sync/chan/chan.odin index 17618763f..5daabe2eb 100644 --- a/core/sync/chan/chan.odin +++ b/core/sync/chan/chan.odin @@ -3,7 +3,6 @@ package sync_chan import "base:builtin" import "base:intrinsics" import "base:runtime" -import "core:mem" import "core:sync" import "core:math/rand" @@ -255,20 +254,20 @@ Example: } */ @(require_results) -create_raw_unbuffered :: proc(#any_int msg_size, msg_alignment: int, allocator: runtime.Allocator) -> (c: ^Raw_Chan, err: runtime.Allocator_Error) { +create_raw_unbuffered :: proc(#any_int msg_size, msg_alignment: int, allocator: runtime.Allocator, loc := #caller_location) -> (c: ^Raw_Chan, err: runtime.Allocator_Error) { assert(msg_size <= int(max(u16))) align := max(align_of(Raw_Chan), msg_alignment) - size := mem.align_forward_int(size_of(Raw_Chan), align) + size := runtime.align_forward_int(size_of(Raw_Chan), align) offset := size size += msg_size - size = mem.align_forward_int(size, align) + size = runtime.align_forward_int(size, align) - ptr := mem.alloc(size, align, allocator) or_return - c = (^Raw_Chan)(ptr) + data := runtime.mem_alloc(size, align, allocator, loc) or_return + c = (^Raw_Chan)(raw_data(data)) c.allocator = allocator c.allocation_size = size - c.unbuffered_data = ([^]byte)(ptr)[offset:] + c.unbuffered_data = raw_data(data[offset:]) c.msg_size = u16(msg_size) return } @@ -300,7 +299,7 @@ Example: } */ @(require_results) -create_raw_buffered :: proc(#any_int msg_size, msg_alignment: int, #any_int cap: int, allocator: runtime.Allocator) -> (c: ^Raw_Chan, err: runtime.Allocator_Error) { +create_raw_buffered :: proc(#any_int msg_size, msg_alignment: int, #any_int cap: int, allocator: runtime.Allocator, loc := #caller_location) -> (c: ^Raw_Chan, err: runtime.Allocator_Error) { assert(msg_size <= int(max(u16))) if cap <= 0 { return create_raw_unbuffered(msg_size, msg_alignment, allocator) @@ -308,15 +307,16 @@ create_raw_buffered :: proc(#any_int msg_size, msg_alignment: int, #any_int cap: align := max(align_of(Raw_Chan), msg_alignment, align_of(Raw_Queue)) - size := mem.align_forward_int(size_of(Raw_Chan), align) + size := runtime.align_forward_int(size_of(Raw_Chan), align) q_offset := size - size = mem.align_forward_int(q_offset + size_of(Raw_Queue), msg_alignment) + size = runtime.align_forward_int(q_offset + size_of(Raw_Queue), msg_alignment) offset := size size += msg_size * cap - size = mem.align_forward_int(size, align) + size = runtime.align_forward_int(size, align) - ptr := mem.alloc(size, align, allocator) or_return - c = (^Raw_Chan)(ptr) + data := runtime.mem_alloc(size, align, allocator, loc) or_return + ptr := raw_data(data) + c = (^Raw_Chan)(raw_data(data)) c.allocator = allocator c.allocation_size = size @@ -339,10 +339,10 @@ Destroys the Channel. **Returns**: - An `Allocator_Error` */ -destroy :: proc(c: ^Raw_Chan) -> (err: runtime.Allocator_Error) { +destroy :: proc(c: ^Raw_Chan, loc := #caller_location) -> (err: runtime.Allocator_Error) { if c != nil { allocator := c.allocator - err = mem.free_with_size(c, c.allocation_size, allocator) + err = runtime.mem_free_with_size(c, c.allocation_size, allocator, loc) } return } @@ -633,7 +633,7 @@ send_raw :: proc "contextless" (c: ^Raw_Chan, msg_in: rawptr) -> (ok: bool) { c.did_read = false defer c.did_read = false - mem.copy(c.unbuffered_data, msg_in, int(c.msg_size)) + intrinsics.mem_copy(c.unbuffered_data, msg_in, int(c.msg_size)) c.w_waiting += 1 @@ -711,7 +711,7 @@ recv_raw :: proc "contextless" (c: ^Raw_Chan, msg_out: rawptr) -> (ok: bool) { msg := raw_queue_pop(c.queue) if msg != nil { - mem.copy(msg_out, msg, int(c.msg_size)) + intrinsics.mem_copy(msg_out, msg, int(c.msg_size)) } if c.w_waiting > 0 { @@ -731,7 +731,7 @@ recv_raw :: proc "contextless" (c: ^Raw_Chan, msg_out: rawptr) -> (ok: bool) { return } - mem.copy(msg_out, c.unbuffered_data, int(c.msg_size)) + intrinsics.mem_copy(msg_out, c.unbuffered_data, int(c.msg_size)) c.w_waiting -= 1 c.did_read = true @@ -798,7 +798,7 @@ try_send_raw :: proc "contextless" (c: ^Raw_Chan, msg_in: rawptr) -> (ok: bool) return false } - mem.copy(c.unbuffered_data, msg_in, int(c.msg_size)) + intrinsics.mem_copy(c.unbuffered_data, msg_in, int(c.msg_size)) c.w_waiting += 1 if c.r_waiting > 0 { sync.signal(&c.r_cond) @@ -848,7 +848,7 @@ try_recv_raw :: proc "contextless" (c: ^Raw_Chan, msg_out: rawptr) -> bool { msg := raw_queue_pop(c.queue) if msg != nil { - mem.copy(msg_out, msg, int(c.msg_size)) + intrinsics.mem_copy(msg_out, msg, int(c.msg_size)) } if c.w_waiting > 0 { @@ -862,7 +862,7 @@ try_recv_raw :: proc "contextless" (c: ^Raw_Chan, msg_out: rawptr) -> bool { return false } - mem.copy(msg_out, c.unbuffered_data, int(c.msg_size)) + intrinsics.mem_copy(msg_out, c.unbuffered_data, int(c.msg_size)) c.w_waiting -= 1 sync.signal(&c.w_cond) @@ -1359,7 +1359,7 @@ raw_queue_push :: proc "contextless" (q: ^Raw_Queue, data: rawptr) -> bool { } val_ptr := q.data[pos*q.size:] - mem.copy(val_ptr, data, q.size) + intrinsics.mem_copy(val_ptr, data, q.size) q.len += 1 return true } From a484937fb7b29a9ef7b5087cf11f5104a1825dfc Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Thu, 12 Feb 2026 10:43:27 -0500 Subject: [PATCH 454/766] strings.compare() can wrap runtime.string_cmp() --- core/strings/strings.odin | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/core/strings/strings.odin b/core/strings/strings.odin index 75c7154af..9b75c558b 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -242,15 +242,7 @@ Returns: - result: `-1` if `lhs` comes first, `1` if `rhs` comes first, or `0` if they are equal */ compare :: proc "contextless" (lhs, rhs: string) -> (res: int) { - a := transmute([]byte)lhs - b := transmute([]byte)rhs - res = runtime.memory_compare(raw_data(a), raw_data(b), min(len(a), len(b))) - if res == 0 && len(a) != len(b) { - return len(a) <= len(b) ? -1 : +1 - } else if len(a) == 0 && len(b) == 0 { - return 0 - } - return res + return runtime.string_cmp(lhs, rhs) } /* From cde6dc1f20cab725959713a24b87ef7e0bd35d24 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 16:52:25 +0100 Subject: [PATCH 455/766] Remove `core:mem` import from `core:crypto`. --- core/crypto/_aes/ct64/api.odin | 7 ++- core/crypto/_aes/ct64/ct64_dec.odin | 2 - core/crypto/_aes/ct64/ct64_keysched.odin | 8 ++-- .../_aes/hw_intel/hw_intel_keysched.odin | 26 ++++++++++- core/crypto/_blake2/blake2.odin | 30 +++++++++++-- core/crypto/_chacha20/chacha20.odin | 8 ++-- core/crypto/_edwards25519/edwards25519.odin | 15 ++++--- .../_edwards25519/edwards25519_scalar.odin | 5 +-- .../edwards25519_scalar_mul.odin | 9 ++-- .../edwards25519_scalar_mul_base.odin | 7 ++- core/crypto/_fiat/field_curve25519/field.odin | 17 ++++---- core/crypto/_fiat/field_curve448/field.odin | 4 +- core/crypto/_fiat/field_p256r1/field.odin | 10 ++--- core/crypto/_fiat/field_p384r1/field.odin | 10 ++--- core/crypto/_fiat/field_poly1305/field.odin | 4 +- .../crypto/_fiat/field_scalar25519/field.odin | 12 +++--- .../_fiat/field_scalarp256r1/field.odin | 14 +++--- .../_fiat/field_scalarp384r1/field.odin | 18 ++++---- core/crypto/_sha3/sha3.odin | 4 +- core/crypto/_weierstrass/point_s11n_sec.odin | 4 +- core/crypto/_weierstrass/scalar_mul.odin | 7 ++- core/crypto/aegis/aegis.odin | 9 ++-- core/crypto/aegis/aegis_impl_ct64.odin | 8 ++-- core/crypto/aegis/aegis_impl_hw_intel.odin | 8 ++-- core/crypto/aes/aes_ctr.odin | 5 +-- core/crypto/aes/aes_ctr_hw_intel.odin | 5 +-- core/crypto/aes/aes_gcm.odin | 21 +++++---- core/crypto/aes/aes_gcm_hw_intel.odin | 21 +++++---- core/crypto/aes/aes_impl.odin | 8 ++-- core/crypto/chacha20/chacha20.odin | 4 +- .../chacha20poly1305/chacha20poly1305.odin | 9 ++-- core/crypto/crypto.odin | 43 +++++++++++++++++-- core/crypto/deoxysii/deoxysii.odin | 6 +-- core/crypto/deoxysii/deoxysii_impl_ct64.odin | 27 ++++++------ .../deoxysii/deoxysii_impl_hw_intel.odin | 5 +-- core/crypto/ecdh/ecdh.odin | 9 ++-- core/crypto/ed25519/ed25519.odin | 3 +- core/crypto/hash/hash.odin | 4 +- core/crypto/hkdf/hkdf.odin | 6 +-- core/crypto/hmac/hmac.odin | 5 +-- core/crypto/legacy/md5/md5.odin | 6 +-- core/crypto/legacy/sha1/sha1.odin | 6 +-- core/crypto/pbkdf2/pbkdf2.odin | 6 +-- core/crypto/poly1305/poly1305.odin | 9 ++-- core/crypto/ristretto255/ristretto255.odin | 4 +- core/crypto/sha2/sha2.odin | 4 +- core/crypto/sm3/sm3.odin | 4 +- core/crypto/x25519/x25519.odin | 3 +- core/crypto/x448/x448.odin | 6 +-- 49 files changed, 270 insertions(+), 205 deletions(-) diff --git a/core/crypto/_aes/ct64/api.odin b/core/crypto/_aes/ct64/api.odin index f57a630b1..08acd37ed 100644 --- a/core/crypto/_aes/ct64/api.odin +++ b/core/crypto/_aes/ct64/api.odin @@ -1,7 +1,6 @@ package aes_ct64 -import "base:intrinsics" -import "core:mem" +import "core:crypto" STRIDE :: 4 @@ -82,5 +81,5 @@ decrypt_blocks :: proc(ctx: ^Context, dst, src: [][]byte) { // reset sanitizes the Context. The Context must be re-initialized to // be used again. reset :: proc(ctx: ^Context) { - mem.zero_explicit(ctx, size_of(ctx)) -} + crypto.zero_explicit(ctx, size_of(ctx)) +} \ No newline at end of file diff --git a/core/crypto/_aes/ct64/ct64_dec.odin b/core/crypto/_aes/ct64/ct64_dec.odin index 408ee6002..6fca7a5f2 100644 --- a/core/crypto/_aes/ct64/ct64_dec.odin +++ b/core/crypto/_aes/ct64/ct64_dec.odin @@ -22,8 +22,6 @@ package aes_ct64 -import "base:intrinsics" - inv_sub_bytes :: proc "contextless" (q: ^[8]u64) { // AES S-box is: // S(x) = A(I(x)) ^ 0x63 diff --git a/core/crypto/_aes/ct64/ct64_keysched.odin b/core/crypto/_aes/ct64/ct64_keysched.odin index 0f00bba57..d0004dd5a 100644 --- a/core/crypto/_aes/ct64/ct64_keysched.odin +++ b/core/crypto/_aes/ct64/ct64_keysched.odin @@ -22,9 +22,9 @@ package aes_ct64 +import "core:crypto" import "core:crypto/_aes" import "core:encoding/endian" -import "core:mem" @(private, require_results) sub_word :: proc "contextless" (x: u32) -> u32 { @@ -35,7 +35,7 @@ sub_word :: proc "contextless" (x: u32) -> u32 { orthogonalize(&q) ret := u32(q[0]) - mem.zero_explicit(&q[0], size_of(u64)) + crypto.zero_explicit(&q[0], size_of(u64)) return ret } @@ -97,8 +97,8 @@ keysched :: proc "contextless" (comp_skey: []u64, key: []byte) -> int { (q[7] & 0x8888888888888888) } - mem.zero_explicit(&skey, size_of(skey)) - mem.zero_explicit(&q, size_of(q)) + crypto.zero_explicit(&skey, size_of(skey)) + crypto.zero_explicit(&q, size_of(q)) return num_rounds } diff --git a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin b/core/crypto/_aes/hw_intel/hw_intel_keysched.odin index bdf0d3066..96108442d 100644 --- a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin +++ b/core/crypto/_aes/hw_intel/hw_intel_keysched.odin @@ -25,7 +25,6 @@ package aes_hw_intel import "base:intrinsics" import "core:crypto/_aes" -import "core:mem" import "core:simd/x86" // Intel AES-NI based implementation. Inspiration taken from BearSSL. @@ -174,5 +173,28 @@ keysched :: proc(ctx: ^Context, key: []byte) { ctx._num_rounds = num_rounds - mem.zero_explicit(&sks, size_of(sks)) + zero_explicit(&sks, size_of(sks)) } + +/* +Set each byte of a memory range to zero. + +This procedure copies the value `0` into the `len` bytes of a memory range, +starting at address `data`. + +This procedure returns the pointer to `data`. + +Unlike the `zero()` procedure, which can be optimized away or reordered by the +compiler under certain circumstances, `zero_explicit()` procedure can not be +optimized away or reordered with other memory access operations, and the +compiler assumes volatile semantics of the memory. +*/ +zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { + // This routine tries to avoid the compiler optimizing away the call, + // so that it is always executed. It is intended to provide + // equivalent semantics to those provided by the C11 Annex K 3.7.4.1 + // memset_s call. + intrinsics.mem_zero_volatile(data, len) // Use the volatile mem_zero + intrinsics.atomic_thread_fence(.Seq_Cst) // Prevent reordering + return data +} \ No newline at end of file diff --git a/core/crypto/_blake2/blake2.odin b/core/crypto/_blake2/blake2.odin index 487e93b83..4e8fd0a6a 100644 --- a/core/crypto/_blake2/blake2.odin +++ b/core/crypto/_blake2/blake2.odin @@ -10,8 +10,8 @@ package _blake2 Implementation of the BLAKE2 hashing algorithm, as defined in and */ +import "base:intrinsics" import "core:encoding/endian" -import "core:mem" BLAKE2S_BLOCK_SIZE :: 64 BLAKE2S_SIZE :: 32 @@ -145,7 +145,7 @@ init :: proc "contextless" (ctx: ^$T, cfg: ^Blake2_Config) { } } - mem.zero(&ctx.x, size_of(ctx.x)) // Done with the scratch space, no barrier. + intrinsics.mem_zero(&ctx.x, size_of(ctx.x)) // Done with the scratch space, no barrier. if cfg.tree != nil && cfg.tree.(Blake2_Tree).is_last_node { ctx.is_last_node = true @@ -222,7 +222,7 @@ reset :: proc "contextless" (ctx: ^$T) { return } - mem.zero_explicit(ctx, size_of(ctx^)) + zero_explicit(ctx, size_of(ctx^)) } @(private) @@ -2877,3 +2877,27 @@ blake2b_blocks :: #force_inline proc "contextless" (ctx: ^Blake2b_Context, p: [] ctx.h[0], ctx.h[1], ctx.h[2], ctx.h[3], ctx.h[4], ctx.h[5], ctx.h[6], ctx.h[7] = h0, h1, h2, h3, h4, h5, h6, h7 } + +/* +Set each byte of a memory range to zero. + +This procedure copies the value `0` into the `len` bytes of a memory range, +starting at address `data`. + +This procedure returns the pointer to `data`. + +Unlike the `zero()` procedure, which can be optimized away or reordered by the +compiler under certain circumstances, `zero_explicit()` procedure can not be +optimized away or reordered with other memory access operations, and the +compiler assumes volatile semantics of the memory. +*/ +@(private) +zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { + // This routine tries to avoid the compiler optimizing away the call, + // so that it is always executed. It is intended to provide + // equivalent semantics to those provided by the C11 Annex K 3.7.4.1 + // memset_s call. + intrinsics.mem_zero_volatile(data, len) // Use the volatile mem_zero + intrinsics.atomic_thread_fence(.Seq_Cst) // Prevent reordering + return data +} \ No newline at end of file diff --git a/core/crypto/_chacha20/chacha20.odin b/core/crypto/_chacha20/chacha20.odin index 1a4b5a507..7d94d8a95 100644 --- a/core/crypto/_chacha20/chacha20.odin +++ b/core/crypto/_chacha20/chacha20.odin @@ -1,8 +1,8 @@ package _chacha20 +import "core:crypto" import "core:encoding/endian" import "core:math/bits" -import "core:mem" // KEY_SIZE is the (X)ChaCha20 key size in bytes. KEY_SIZE :: 32 @@ -88,8 +88,8 @@ seek :: proc(ctx: ^Context, block_nr: u64) { // reset sanitizes the Context. The Context must be re-initialized to // be used again. reset :: proc(ctx: ^Context) { - mem.zero_explicit(&ctx._s, size_of(ctx._s)) - mem.zero_explicit(&ctx._buffer, size_of(ctx._buffer)) + crypto.zero_explicit(&ctx._s, size_of(ctx._s)) + crypto.zero_explicit(&ctx._buffer, size_of(ctx._buffer)) ctx._is_initialized = false } @@ -116,4 +116,4 @@ check_counter_limit :: proc(ctx: ^Context, nr_blocks: int) { } ensure(ctr_ok, "crypto/chacha20: maximum (X)ChaCha20 keystream per IV reached") -} +} \ No newline at end of file diff --git a/core/crypto/_edwards25519/edwards25519.odin b/core/crypto/_edwards25519/edwards25519.odin index 12192102d..dddfaef02 100644 --- a/core/crypto/_edwards25519/edwards25519.odin +++ b/core/crypto/_edwards25519/edwards25519.odin @@ -13,7 +13,8 @@ See: import "core:crypto" import field "core:crypto/_fiat/field_curve25519" -import "core:mem" + +zero_explicit :: crypto.zero_explicit // Group_Element is an edwards25519 group element, as extended homogenous // coordinates, which represents the affine point `(x, y)` as `(X, Y, Z, T)`, @@ -96,7 +97,7 @@ Group_Element :: struct { } ge_clear :: proc "contextless" (ge: ^Group_Element) { - mem.zero_explicit(ge, size_of(Group_Element)) + zero_explicit(ge, size_of(Group_Element)) } ge_set :: proc "contextless" (ge, a: ^Group_Element) { @@ -159,7 +160,7 @@ ge_set_bytes :: proc "contextless" (ge: ^Group_Element, b: []byte) -> bool { ge_cond_assign(ge, &tmp, is_canonical) - mem.zero_explicit(&buf, size_of(buf)) + zero_explicit(&buf, size_of(buf)) return is_canonical == 1 } @@ -231,8 +232,8 @@ ge_add :: proc "contextless" (ge, a, b: ^Group_Element) { scratch: Add_Scratch = --- ge_add_addend(ge, a, &b_, &scratch) - mem.zero_explicit(&b_, size_of(Addend_Group_Element)) - mem.zero_explicit(&scratch, size_of(Add_Scratch)) + zero_explicit(&b_, size_of(Addend_Group_Element)) + zero_explicit(&scratch, size_of(Add_Scratch)) } @(private) @@ -352,7 +353,7 @@ ge_double :: proc "contextless" (ge, a: ^Group_Element, scratch: ^Double_Scratch field.fe_carry_mul(&ge.z, F, G_) if sanitize { - mem.zero_explicit(scratch, size_of(Double_Scratch)) + zero_explicit(scratch, size_of(Double_Scratch)) } } @@ -420,4 +421,4 @@ ge_in_prime_order_subgroup_vartime :: proc "contextless" (ge: ^Group_Element) -> tmp: Group_Element = --- ge_scalarmult_raw(&tmp, ge, &SC_ELL, true) return ge_equal(&tmp, &GE_IDENTITY) == 1 -} +} \ No newline at end of file diff --git a/core/crypto/_edwards25519/edwards25519_scalar.odin b/core/crypto/_edwards25519/edwards25519_scalar.odin index 68c79a6e8..5dff03f67 100644 --- a/core/crypto/_edwards25519/edwards25519_scalar.odin +++ b/core/crypto/_edwards25519/edwards25519_scalar.odin @@ -1,7 +1,6 @@ package _edwards25519 import field "core:crypto/_fiat/field_scalar25519" -import "core:mem" Scalar :: field.Montgomery_Domain_Field_Element @@ -19,7 +18,7 @@ sc_set_u64 :: proc "contextless" (sc: ^Scalar, i: u64) { tmp := field.Non_Montgomery_Domain_Field_Element{i, 0, 0, 0} field.fe_to_montgomery(sc, &tmp) - mem.zero_explicit(&tmp, size_of(tmp)) + zero_explicit(&tmp, size_of(tmp)) } @(require_results) @@ -36,7 +35,7 @@ sc_set_bytes_rfc8032 :: proc "contextless" (sc: ^Scalar, b: []byte) { } sc_clear :: proc "contextless" (sc: ^Scalar) { - mem.zero_explicit(sc, size_of(Scalar)) + zero_explicit(sc, size_of(Scalar)) } sc_set :: field.fe_set diff --git a/core/crypto/_edwards25519/edwards25519_scalar_mul.odin b/core/crypto/_edwards25519/edwards25519_scalar_mul.odin index d4ffa1075..548062c78 100644 --- a/core/crypto/_edwards25519/edwards25519_scalar_mul.odin +++ b/core/crypto/_edwards25519/edwards25519_scalar_mul.odin @@ -3,7 +3,6 @@ package _edwards25519 import "core:crypto" import field "core:crypto/_fiat/field_scalar25519" import subtle "core:crypto/_subtle" -import "core:mem" ge_scalarmult :: proc "contextless" (ge, p: ^Group_Element, sc: ^Scalar) { tmp: field.Non_Montgomery_Domain_Field_Element @@ -11,7 +10,7 @@ ge_scalarmult :: proc "contextless" (ge, p: ^Group_Element, sc: ^Scalar) { ge_scalarmult_raw(ge, p, &tmp) - mem.zero_explicit(&tmp, size_of(tmp)) + zero_explicit(&tmp, size_of(tmp)) } ge_scalarmult_vartime :: proc "contextless" (ge, p: ^Group_Element, sc: ^Scalar) { @@ -134,9 +133,9 @@ ge_scalarmult_raw :: proc "contextless" ( if !unsafe_is_vartime { ge_clear(&tmp) - mem.zero_explicit(&tmp_add, size_of(Add_Scratch)) - mem.zero_explicit(&tmp_addend, size_of(Addend_Group_Element)) - mem.zero_explicit(&tmp_dbl, size_of(Double_Scratch)) + zero_explicit(&tmp_add, size_of(Add_Scratch)) + zero_explicit(&tmp_addend, size_of(Addend_Group_Element)) + zero_explicit(&tmp_dbl, size_of(Double_Scratch)) } } diff --git a/core/crypto/_edwards25519/edwards25519_scalar_mul_base.odin b/core/crypto/_edwards25519/edwards25519_scalar_mul_base.odin index 6820d618e..51305af2a 100644 --- a/core/crypto/_edwards25519/edwards25519_scalar_mul_base.odin +++ b/core/crypto/_edwards25519/edwards25519_scalar_mul_base.odin @@ -4,7 +4,6 @@ import "core:crypto" import field "core:crypto/_fiat/field_curve25519" import scalar "core:crypto/_fiat/field_scalar25519" import subtle "core:crypto/_subtle" -import "core:mem" ge_scalarmult_basepoint :: proc "contextless" (ge: ^Group_Element, sc: ^Scalar) { when crypto.COMPACT_IMPLS == true { @@ -27,9 +26,9 @@ ge_scalarmult_basepoint :: proc "contextless" (ge: ^Group_Element, sc: ^Scalar) mul_bp_tbl_add(ge, &Gen_Multiply_Table_edwards25519_hi[i], hi, &tmp_add, &tmp_addend, false) } - mem.zero_explicit(&tmp_sc, size_of(tmp_sc)) - mem.zero_explicit(&tmp_add, size_of(Add_Scratch)) - mem.zero_explicit(&tmp_addend, size_of(Basepoint_Addend_Group_Element)) + zero_explicit(&tmp_sc, size_of(tmp_sc)) + zero_explicit(&tmp_add, size_of(Add_Scratch)) + zero_explicit(&tmp_addend, size_of(Basepoint_Addend_Group_Element)) } } diff --git a/core/crypto/_fiat/field_curve25519/field.odin b/core/crypto/_fiat/field_curve25519/field.odin index 04fc87659..ac6e284b7 100644 --- a/core/crypto/_fiat/field_curve25519/field.odin +++ b/core/crypto/_fiat/field_curve25519/field.odin @@ -1,7 +1,8 @@ package field_curve25519 import "core:crypto" -import "core:mem" + +zero_explicit :: crypto.zero_explicit fe_relax_cast :: #force_inline proc "contextless" ( arg1: ^Tight_Field_Element, @@ -18,7 +19,7 @@ fe_tighten_cast :: #force_inline proc "contextless" ( fe_clear :: proc "contextless" ( arg1: $T, ) where T == ^Tight_Field_Element || T == ^Loose_Field_Element { - mem.zero_explicit(arg1, size_of(arg1^)) + zero_explicit(arg1, size_of(arg1^)) } fe_clear_vec :: proc "contextless" ( @@ -38,7 +39,7 @@ fe_from_bytes :: proc "contextless" (out1: ^Tight_Field_Element, arg1: ^[32]byte _fe_from_bytes(out1, &tmp1) - mem.zero_explicit(&tmp1, size_of(tmp1)) + zero_explicit(&tmp1, size_of(tmp1)) } fe_is_negative :: proc "contextless" (arg1: ^Tight_Field_Element) -> int { @@ -47,7 +48,7 @@ fe_is_negative :: proc "contextless" (arg1: ^Tight_Field_Element) -> int { fe_to_bytes(&tmp1, arg1) ret := tmp1[0] & 1 - mem.zero_explicit(&tmp1, size_of(tmp1)) + zero_explicit(&tmp1, size_of(tmp1)) return int(ret) } @@ -59,8 +60,8 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Tight_Field_Element) -> int { fe_to_bytes(&tmp2, arg2) ret := crypto.compare_constant_time(tmp1[:], tmp2[:]) - mem.zero_explicit(&tmp1, size_of(tmp1)) - mem.zero_explicit(&tmp2, size_of(tmp2)) + zero_explicit(&tmp1, size_of(tmp1)) + zero_explicit(&tmp2, size_of(tmp2)) return ret } @@ -72,7 +73,7 @@ fe_equal_bytes :: proc "contextless" (arg1: ^Tight_Field_Element, arg2: ^[32]byt ret := crypto.compare_constant_time(tmp1[:], arg2[:]) - mem.zero_explicit(&tmp1, size_of(tmp1)) + zero_explicit(&tmp1, size_of(tmp1)) return ret } @@ -175,7 +176,7 @@ fe_carry_sqrt_ratio_m1 :: proc "contextless" ( fe_carry_abs(out1, r) fe_clear_vec([]^Tight_Field_Element{&w, &tmp1, &tmp2, &tmp3}) - mem.zero_explicit(&b, size_of(b)) + zero_explicit(&b, size_of(b)) return correct_sign_sqrt | flipped_sign_sqrt } diff --git a/core/crypto/_fiat/field_curve448/field.odin b/core/crypto/_fiat/field_curve448/field.odin index 540d88f28..bb077cb1e 100644 --- a/core/crypto/_fiat/field_curve448/field.odin +++ b/core/crypto/_fiat/field_curve448/field.odin @@ -1,6 +1,6 @@ package field_curve448 -import "core:mem" +import "core:crypto" fe_relax_cast :: #force_inline proc "contextless" ( arg1: ^Tight_Field_Element, @@ -17,7 +17,7 @@ fe_tighten_cast :: #force_inline proc "contextless" ( fe_clear :: proc "contextless" ( arg1: $T, ) where T == ^Tight_Field_Element || T == ^Loose_Field_Element { - mem.zero_explicit(arg1, size_of(arg1^)) + crypto.zero_explicit(arg1, size_of(arg1^)) } fe_clear_vec :: proc "contextless" ( diff --git a/core/crypto/_fiat/field_p256r1/field.odin b/core/crypto/_fiat/field_p256r1/field.odin index c2e2044aa..f39bee4a9 100644 --- a/core/crypto/_fiat/field_p256r1/field.odin +++ b/core/crypto/_fiat/field_p256r1/field.odin @@ -1,12 +1,12 @@ package field_p256r1 +import "core:crypto" import subtle "core:crypto/_subtle" import "core:encoding/endian" import "core:math/bits" -import "core:mem" fe_clear :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) { - mem.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) + crypto.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) } fe_clear_vec :: proc "contextless" ( @@ -31,7 +31,7 @@ fe_from_bytes :: proc "contextless" ( endian.unchecked_get_u64be(arg1[8:]), endian.unchecked_get_u64be(arg1[0:]), } - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) // Check that tmp is in the the range [0, ELL). if !unsafe_assume_canonical { @@ -61,7 +61,7 @@ fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_ endian.unchecked_put_u64be(out1[8:], tmp[2]) endian.unchecked_put_u64be(out1[0:], tmp[3]) - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tmp, size_of(tmp)) } @(require_results) @@ -81,7 +81,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> @(require_results) fe_is_odd :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> int { tmp: Non_Montgomery_Domain_Field_Element = --- - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) fe_from_montgomery(&tmp, arg1) return int(tmp[0] & 1) diff --git a/core/crypto/_fiat/field_p384r1/field.odin b/core/crypto/_fiat/field_p384r1/field.odin index 65affc38c..5cb5cd05e 100644 --- a/core/crypto/_fiat/field_p384r1/field.odin +++ b/core/crypto/_fiat/field_p384r1/field.odin @@ -1,12 +1,12 @@ package field_p384r1 +import "core:crypto" import subtle "core:crypto/_subtle" import "core:encoding/endian" import "core:math/bits" -import "core:mem" fe_clear :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) { - mem.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) + crypto.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) } fe_clear_vec :: proc "contextless" ( @@ -33,7 +33,7 @@ fe_from_bytes :: proc "contextless" ( endian.unchecked_get_u64be(arg1[8:]), endian.unchecked_get_u64be(arg1[0:]), } - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) // Check that tmp is in the the range [0, ELL). if !unsafe_assume_canonical { @@ -67,7 +67,7 @@ fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_ endian.unchecked_put_u64be(out1[8:], tmp[4]) endian.unchecked_put_u64be(out1[0:], tmp[5]) - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tmp, size_of(tmp)) } @(require_results) @@ -87,7 +87,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> @(require_results) fe_is_odd :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> int { tmp: Non_Montgomery_Domain_Field_Element = --- - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) fe_from_montgomery(&tmp, arg1) return int(tmp[0] & 1) diff --git a/core/crypto/_fiat/field_poly1305/field.odin b/core/crypto/_fiat/field_poly1305/field.odin index caaece98e..244ddceb8 100644 --- a/core/crypto/_fiat/field_poly1305/field.odin +++ b/core/crypto/_fiat/field_poly1305/field.odin @@ -1,7 +1,7 @@ package field_poly1305 +import "core:crypto" import "core:encoding/endian" -import "core:mem" fe_relax_cast :: #force_inline proc "contextless" ( arg1: ^Tight_Field_Element, @@ -57,7 +57,7 @@ fe_from_u64s :: proc "contextless" (out1: ^Tight_Field_Element, lo, hi: u64) { _fe_from_bytes(out1, &tmp) // This routine is only used to deserialize `r` which is confidential. - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tmp, size_of(tmp)) } fe_zero :: proc "contextless" (out1: ^Tight_Field_Element) { diff --git a/core/crypto/_fiat/field_scalar25519/field.odin b/core/crypto/_fiat/field_scalar25519/field.odin index 96b279ce7..181a6ce8d 100644 --- a/core/crypto/_fiat/field_scalar25519/field.odin +++ b/core/crypto/_fiat/field_scalar25519/field.odin @@ -1,9 +1,9 @@ package field_scalar25519 +import "core:crypto" import subtle "core:crypto/_subtle" import "core:encoding/endian" import "core:math/bits" -import "core:mem" @(private, rodata) _TWO_168 := Montgomery_Domain_Field_Element { @@ -21,7 +21,7 @@ _TWO_336 := Montgomery_Domain_Field_Element { } fe_clear :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) { - mem.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) + crypto.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) } fe_from_bytes :: proc "contextless" ( @@ -35,7 +35,7 @@ fe_from_bytes :: proc "contextless" ( endian.unchecked_get_u64le(arg1[16:]), endian.unchecked_get_u64le(arg1[24:]), } - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) // Check that tmp is in the the range [0, ELL). if !unsafe_assume_canonical { @@ -67,7 +67,7 @@ fe_from_bytes_rfc8032 :: proc "contextless" ( fe_from_bytes_wide(out1, &tmp) - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tmp, size_of(tmp)) } fe_from_bytes_wide :: proc "contextless" ( @@ -101,7 +101,7 @@ _fe_from_bytes_short :: proc "contextless" (out1: ^Montgomery_Domain_Field_Eleme copy(tmp[:], arg1) _ = fe_from_bytes(out1, &tmp, true) - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tmp, size_of(tmp)) } fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_Element) { @@ -115,7 +115,7 @@ fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_ endian.unchecked_put_u64le(out1[16:], tmp[2]) endian.unchecked_put_u64le(out1[24:], tmp[3]) - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tmp, size_of(tmp)) } fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> int { diff --git a/core/crypto/_fiat/field_scalarp256r1/field.odin b/core/crypto/_fiat/field_scalarp256r1/field.odin index 0dfedb442..70e55d9e3 100644 --- a/core/crypto/_fiat/field_scalarp256r1/field.odin +++ b/core/crypto/_fiat/field_scalarp256r1/field.odin @@ -1,9 +1,9 @@ package field_scalarp256r1 +import "core:crypto" import subtle "core:crypto/_subtle" import "core:encoding/endian" import "core:math/bits" -import "core:mem" @(private, rodata) TWO_192 := Montgomery_Domain_Field_Element{ @@ -23,7 +23,7 @@ TWO_384 := Montgomery_Domain_Field_Element{ // 0x431905529c0166ce652e96b7ccca0a99679b73e19ad16947f01cf013fc632551 fe_clear :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) { - mem.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) + crypto.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) } fe_clear_vec :: proc "contextless" ( @@ -67,7 +67,7 @@ fe_from_bytes :: proc "contextless" ( // Zero extend to 512-bits. src_512: [64]byte copy(src_512[64-s_len:], arg1) - defer mem.zero_explicit(&src_512, size_of(src_512)) + defer crypto.zero_explicit(&src_512, size_of(src_512)) fe_unchecked_set(out1, src_512[40:]) // a b: Montgomery_Domain_Field_Element @@ -102,7 +102,7 @@ fe_is_canonical :: proc "contextless" (arg1: []byte) -> bool { @(private) fe_unchecked_set :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element, arg1: []byte) { arg1_256: [32]byte - defer mem.zero_explicit(&arg1_256, size_of(arg1_256)) + defer crypto.zero_explicit(&arg1_256, size_of(arg1_256)) copy(arg1_256[32-len(arg1):], arg1) tmp := Non_Montgomery_Domain_Field_Element { @@ -111,7 +111,7 @@ fe_unchecked_set :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element, endian.unchecked_get_u64be(arg1_256[8:]), endian.unchecked_get_u64be(arg1_256[0:]), } - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) fe_to_montgomery(out1, &tmp) } @@ -128,7 +128,7 @@ fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_ endian.unchecked_put_u64be(out1[8:], tmp[2]) endian.unchecked_put_u64be(out1[0:], tmp[3]) - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tmp, size_of(tmp)) } fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> int { @@ -144,7 +144,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> fe_is_odd :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> int { tmp: Non_Montgomery_Domain_Field_Element = --- - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) fe_from_montgomery(&tmp, arg1) return int(tmp[0] & 1) diff --git a/core/crypto/_fiat/field_scalarp384r1/field.odin b/core/crypto/_fiat/field_scalarp384r1/field.odin index f8af5e0f5..9b9e5d350 100644 --- a/core/crypto/_fiat/field_scalarp384r1/field.odin +++ b/core/crypto/_fiat/field_scalarp384r1/field.odin @@ -1,9 +1,9 @@ package field_scalarp384r1 +import "core:crypto" import subtle "core:crypto/_subtle" import "core:encoding/endian" import "core:math/bits" -import "core:mem" @(private, rodata) TWO_256 := Montgomery_Domain_Field_Element{ @@ -16,7 +16,7 @@ TWO_256 := Montgomery_Domain_Field_Element{ } fe_clear :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) { - mem.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) + crypto.zero_explicit(arg1, size_of(Montgomery_Domain_Field_Element)) } fe_clear_vec :: proc "contextless" ( @@ -50,8 +50,8 @@ fe_from_bytes :: proc "contextless" ( tmp: Non_Montgomery_Domain_Field_Element = --- fe_unchecked_set_saturated(&tmp, arg1) reduced := tmp - defer mem.zero_explicit(&tmp, size_of(tmp)) - defer mem.zero_explicit(&reduced, size_of(reduced)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&reduced, size_of(reduced)) borrow: u64 reduced[0], borrow = bits.sub_u64(tmp[0], ELL[0], borrow) @@ -78,7 +78,7 @@ fe_from_bytes :: proc "contextless" ( // Zero extend to 512-bits. src_512: [64]byte copy(src_512[64-s_len:], arg1) - defer mem.zero_explicit(&src_512, size_of(src_512)) + defer crypto.zero_explicit(&src_512, size_of(src_512)) fe_unchecked_set(out1, src_512[32:]) // a b: Montgomery_Domain_Field_Element @@ -117,12 +117,12 @@ fe_unchecked_set_saturated :: proc "contextless" (out1: ^Non_Montgomery_Domain_F @(private) fe_unchecked_set :: proc "contextless" (out1: ^Montgomery_Domain_Field_Element, arg1: []byte) { arg1_384: [48]byte - defer mem.zero_explicit(&arg1_384, size_of(arg1_384)) + defer crypto.zero_explicit(&arg1_384, size_of(arg1_384)) copy(arg1_384[48-len(arg1):], arg1) tmp: Non_Montgomery_Domain_Field_Element = --- fe_unchecked_set_saturated(&tmp, arg1_384[:]) - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) fe_to_montgomery(out1, &tmp) } @@ -141,7 +141,7 @@ fe_to_bytes :: proc "contextless" (out1: []byte, arg1: ^Montgomery_Domain_Field_ endian.unchecked_put_u64be(out1[8:], tmp[4]) endian.unchecked_put_u64be(out1[0:], tmp[5]) - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tmp, size_of(tmp)) } fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> int { @@ -157,7 +157,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> fe_is_odd :: proc "contextless" (arg1: ^Montgomery_Domain_Field_Element) -> int { tmp: Non_Montgomery_Domain_Field_Element = --- - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) fe_from_montgomery(&tmp, arg1) return int(tmp[0] & 1) diff --git a/core/crypto/_sha3/sha3.odin b/core/crypto/_sha3/sha3.odin index 02b0b6578..b2d032b31 100644 --- a/core/crypto/_sha3/sha3.odin +++ b/core/crypto/_sha3/sha3.odin @@ -16,7 +16,7 @@ package _sha3 */ import "core:math/bits" -import "core:mem" +import "core:crypto" ROUNDS :: 24 @@ -179,7 +179,7 @@ reset :: proc "contextless" (ctx: ^Context) { return } - mem.zero_explicit(ctx, size_of(ctx^)) + crypto.zero_explicit(ctx, size_of(ctx^)) } shake_xof :: proc "contextless" (ctx: ^Context) { diff --git a/core/crypto/_weierstrass/point_s11n_sec.odin b/core/crypto/_weierstrass/point_s11n_sec.odin index 53dd4002f..56d017e5e 100644 --- a/core/crypto/_weierstrass/point_s11n_sec.odin +++ b/core/crypto/_weierstrass/point_s11n_sec.odin @@ -1,6 +1,6 @@ package _weierstrass -@(require) import "core:mem" +@(require) import "core:crypto" @(private) SEC_PREFIX_IDENTITY :: 0x00 @@ -92,7 +92,7 @@ pt_sec_bytes :: proc "contextless" (b: []byte, p: ^$T, compressed: bool) -> bool // 1 redundant rescale call. y_is_odd := byte(y[FE_SZ-1] & 1) b[0] = SEC_PREFIX_COMPRESSED_EVEN + y_is_odd - mem.zero_explicit(&y_, size_of(y_)) + crypto.zero_explicit(&y_, size_of(y_)) } return true diff --git a/core/crypto/_weierstrass/scalar_mul.odin b/core/crypto/_weierstrass/scalar_mul.odin index 108dc5d74..ac0d81a26 100644 --- a/core/crypto/_weierstrass/scalar_mul.odin +++ b/core/crypto/_weierstrass/scalar_mul.odin @@ -2,7 +2,6 @@ package _weierstrass import "core:crypto" @(require) import subtle "core:crypto/_subtle" -@(require) import "core:mem" pt_scalar_mul :: proc "contextless" ( p, a: ^$T, @@ -23,7 +22,7 @@ pt_scalar_mul :: proc "contextless" ( pt_scalar_mul_bytes(p, a, b[:], unsafe_is_vartime) if !unsafe_is_vartime { - mem.zero_explicit(&b, size_of(b)) + crypto.zero_explicit(&b, size_of(b)) } } @@ -69,7 +68,7 @@ pt_scalar_mul_bytes :: proc "contextless" ( pt_set(p, &q) if !unsafe_is_vartime { - mem.zero_explicit(&p_tbl, size_of(p_tbl)) + crypto.zero_explicit(&p_tbl, size_of(p_tbl)) pt_clear_vec([]^T{&q, &tmp}) } } @@ -116,7 +115,7 @@ when crypto.COMPACT_IMPLS == true { } if !unsafe_is_vartime { - mem.zero_explicit(&b, size_of(b)) + crypto.zero_explicit(&b, size_of(b)) pt_clear(&tmp) } } diff --git a/core/crypto/aegis/aegis.odin b/core/crypto/aegis/aegis.odin index 41b7ad5be..fbb19f1ae 100644 --- a/core/crypto/aegis/aegis.odin +++ b/core/crypto/aegis/aegis.odin @@ -11,7 +11,6 @@ package aegis import "core:bytes" import "core:crypto" import "core:crypto/aes" -import "core:mem" // KEY_SIZE_128L is the AEGIS-128L key size in bytes. KEY_SIZE_128L :: 16 @@ -197,8 +196,8 @@ open :: proc(ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte) -> bool { } if crypto.compare_constant_time(tag, derived_tag) != 1 { - mem.zero_explicit(raw_data(derived_tag), len(derived_tag)) - mem.zero_explicit(raw_data(dst), ct_len) + crypto.zero_explicit(raw_data(derived_tag), len(derived_tag)) + crypto.zero_explicit(raw_data(dst), ct_len) return false } @@ -208,7 +207,7 @@ open :: proc(ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte) -> bool { // reset sanitizes the Context. The Context must be // re-initialized to be used again. reset :: proc "contextless" (ctx: ^Context) { - mem.zero_explicit(&ctx._key, len(ctx._key)) + crypto.zero_explicit(&ctx._key, len(ctx._key)) ctx._key_len = 0 ctx._is_initialized = false -} +} \ No newline at end of file diff --git a/core/crypto/aegis/aegis_impl_ct64.odin b/core/crypto/aegis/aegis_impl_ct64.odin index 4813b37ec..15a9b4b3d 100644 --- a/core/crypto/aegis/aegis_impl_ct64.odin +++ b/core/crypto/aegis/aegis_impl_ct64.odin @@ -1,8 +1,8 @@ package aegis +import "core:crypto" import aes "core:crypto/_aes/ct64" import "core:encoding/endian" -import "core:mem" // This uses the bitlsiced 64-bit general purpose register SWAR AES // round function. The intermediate state is stored in interleaved @@ -324,7 +324,7 @@ dec_sw_256 :: #force_inline proc "contextless" (st: ^State_SW, xi, ci: []byte) # @(private = "file") dec_partial_sw_128l :: proc "contextless" (st: ^State_SW, xn, cn: []byte) #no_bounds_check { tmp: [_RATE_128L]byte - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) z0_0, z0_1, z1_0, z1_1 := z_sw_128l(st) copy(tmp[:], cn) @@ -349,7 +349,7 @@ dec_partial_sw_128l :: proc "contextless" (st: ^State_SW, xn, cn: []byte) #no_bo @(private = "file") dec_partial_sw_256 :: proc "contextless" (st: ^State_SW, xn, cn: []byte) #no_bounds_check { tmp: [_RATE_256]byte - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) z_0, z_1 := z_sw_256(st) copy(tmp[:], cn) @@ -448,5 +448,5 @@ finalize_sw :: proc "contextless" (st: ^State_SW, tag: []byte, ad_len, msg_len: @(private) reset_state_sw :: proc "contextless" (st: ^State_SW) { - mem.zero_explicit(st, size_of(st^)) + crypto.zero_explicit(st, size_of(st^)) } diff --git a/core/crypto/aegis/aegis_impl_hw_intel.odin b/core/crypto/aegis/aegis_impl_hw_intel.odin index 5334f3258..7673b6b28 100644 --- a/core/crypto/aegis/aegis_impl_hw_intel.odin +++ b/core/crypto/aegis/aegis_impl_hw_intel.odin @@ -2,9 +2,9 @@ package aegis import "base:intrinsics" +import "core:crypto" import "core:crypto/aes" import "core:encoding/endian" -import "core:mem" import "core:simd/x86" @(private) @@ -261,7 +261,7 @@ dec_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, xi, ci: []byte) # @(private = "file", enable_target_feature = "sse2,aes") dec_partial_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: []byte) #no_bounds_check { tmp: [_RATE_128L]byte - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) z0, z1 := z_hw_128l(st) copy(tmp[:], cn) @@ -286,7 +286,7 @@ dec_partial_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: @(private = "file", enable_target_feature = "sse2,aes") dec_partial_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: []byte) #no_bounds_check { tmp: [_RATE_256]byte - defer mem.zero_explicit(&tmp, size_of(tmp)) + defer crypto.zero_explicit(&tmp, size_of(tmp)) z := z_hw_256(st) copy(tmp[:], cn) @@ -385,5 +385,5 @@ finalize_hw :: proc "contextless" (st: ^State_HW, tag: []byte, ad_len, msg_len: @(private) reset_state_hw :: proc "contextless" (st: ^State_HW) { - mem.zero_explicit(st, size_of(st^)) + crypto.zero_explicit(st, size_of(st^)) } diff --git a/core/crypto/aes/aes_ctr.odin b/core/crypto/aes/aes_ctr.odin index a74133235..9d7a0b80b 100644 --- a/core/crypto/aes/aes_ctr.odin +++ b/core/crypto/aes/aes_ctr.odin @@ -4,7 +4,6 @@ import "core:bytes" import "core:crypto/_aes/ct64" import "core:encoding/endian" import "core:math/bits" -import "core:mem" // CTR_IV_SIZE is the size of the CTR mode IV in bytes. CTR_IV_SIZE :: 16 @@ -117,7 +116,7 @@ reset_ctr :: proc "contextless" (ctx: ^Context_CTR) { ctx._off = 0 ctx._ctr_hi = 0 ctx._ctr_lo = 0 - mem.zero_explicit(&ctx._buffer, size_of(ctx._buffer)) + zero_explicit(&ctx._buffer, size_of(ctx._buffer)) ctx._is_initialized = false } @@ -172,7 +171,7 @@ ctr_blocks :: proc(ctx: ^Context_CTR, dst, src: []byte, nr_blocks: int) #no_boun // Write back the counter. ctx._ctr_hi, ctx._ctr_lo = ctr_hi, ctr_lo - mem.zero_explicit(&tmp, size_of(tmp)) + zero_explicit(&tmp, size_of(tmp)) } @(private) diff --git a/core/crypto/aes/aes_ctr_hw_intel.odin b/core/crypto/aes/aes_ctr_hw_intel.odin index 415758b24..f30122c86 100644 --- a/core/crypto/aes/aes_ctr_hw_intel.odin +++ b/core/crypto/aes/aes_ctr_hw_intel.odin @@ -4,7 +4,6 @@ package aes import "base:intrinsics" import "core:crypto/_aes" import "core:math/bits" -import "core:mem" import "core:simd/x86" @(private) @@ -130,8 +129,8 @@ ctr_blocks_hw :: proc(ctx: ^Context_CTR, dst, src: []byte, nr_blocks: int) #no_b // Write back the counter. ctx._ctr_hi, ctx._ctr_lo = ctr_hi, ctr_lo - mem.zero_explicit(&blks, size_of(blks)) - mem.zero_explicit(&sks, size_of(sks)) + zero_explicit(&blks, size_of(blks)) + zero_explicit(&sks, size_of(sks)) } @(private, enable_target_feature = "sse2") diff --git a/core/crypto/aes/aes_gcm.odin b/core/crypto/aes/aes_gcm.odin index d349aa353..bb87788ac 100644 --- a/core/crypto/aes/aes_gcm.odin +++ b/core/crypto/aes/aes_gcm.odin @@ -5,7 +5,6 @@ import "core:crypto" import "core:crypto/_aes" import "core:crypto/_aes/ct64" import "core:encoding/endian" -import "core:mem" // GCM_IV_SIZE is the default size of the GCM IV in bytes. GCM_IV_SIZE :: 12 @@ -59,9 +58,9 @@ seal_gcm :: proc(ctx: ^Context_GCM, dst, tag, iv, aad, plaintext: []byte) { final_ghash_ct64(&s, &h, &j0_enc, len(aad), len(plaintext)) copy(tag, s[:]) - mem.zero_explicit(&h, len(h)) - mem.zero_explicit(&j0, len(j0)) - mem.zero_explicit(&j0_enc, len(j0_enc)) + zero_explicit(&h, len(h)) + zero_explicit(&j0, len(j0)) + zero_explicit(&j0_enc, len(j0_enc)) } // open_gcm authenticates the aad and ciphertext, and decrypts the ciphertext, @@ -94,13 +93,13 @@ open_gcm :: proc(ctx: ^Context_GCM, dst, iv, aad, ciphertext, tag: []byte) -> bo ok := crypto.compare_constant_time(s[:], tag) == 1 if !ok { - mem.zero_explicit(raw_data(dst), len(dst)) + zero_explicit(raw_data(dst), len(dst)) } - mem.zero_explicit(&h, len(h)) - mem.zero_explicit(&j0, len(j0)) - mem.zero_explicit(&j0_enc, len(j0_enc)) - mem.zero_explicit(&s, len(s)) + zero_explicit(&h, len(h)) + zero_explicit(&j0, len(j0)) + zero_explicit(&j0_enc, len(j0_enc)) + zero_explicit(&s, len(s)) return ok } @@ -249,6 +248,6 @@ gctr_ct64 :: proc( } } - mem.zero_explicit(&tmp, size_of(tmp)) - mem.zero_explicit(&tmp2, size_of(tmp2)) + zero_explicit(&tmp, size_of(tmp)) + zero_explicit(&tmp2, size_of(tmp2)) } diff --git a/core/crypto/aes/aes_gcm_hw_intel.odin b/core/crypto/aes/aes_gcm_hw_intel.odin index 3982d1452..c6e564773 100644 --- a/core/crypto/aes/aes_gcm_hw_intel.odin +++ b/core/crypto/aes/aes_gcm_hw_intel.odin @@ -6,7 +6,6 @@ import "core:crypto" import "core:crypto/_aes" import "core:crypto/_aes/hw_intel" import "core:encoding/endian" -import "core:mem" import "core:simd/x86" @(private) @@ -23,9 +22,9 @@ gcm_seal_hw :: proc(ctx: ^Context_Impl_Hardware, dst, tag, iv, aad, plaintext: [ final_ghash_hw(&s, &h, &j0_enc, len(aad), len(plaintext)) copy(tag, s[:]) - mem.zero_explicit(&h, len(h)) - mem.zero_explicit(&j0, len(j0)) - mem.zero_explicit(&j0_enc, len(j0_enc)) + zero_explicit(&h, len(h)) + zero_explicit(&j0, len(j0)) + zero_explicit(&j0_enc, len(j0_enc)) } @(private) @@ -42,13 +41,13 @@ gcm_open_hw :: proc(ctx: ^Context_Impl_Hardware, dst, iv, aad, ciphertext, tag: ok := crypto.compare_constant_time(s[:], tag) == 1 if !ok { - mem.zero_explicit(raw_data(dst), len(dst)) + zero_explicit(raw_data(dst), len(dst)) } - mem.zero_explicit(&h, len(h)) - mem.zero_explicit(&j0, len(j0)) - mem.zero_explicit(&j0_enc, len(j0_enc)) - mem.zero_explicit(&s, len(s)) + zero_explicit(&h, len(h)) + zero_explicit(&j0, len(j0)) + zero_explicit(&j0_enc, len(j0_enc)) + zero_explicit(&s, len(s)) return ok } @@ -228,8 +227,8 @@ gctr_hw :: proc( n -= l } - mem.zero_explicit(&blks, size_of(blks)) - mem.zero_explicit(&sks, size_of(sks)) + zero_explicit(&blks, size_of(blks)) + zero_explicit(&sks, size_of(sks)) } // BUG: Sticking this in gctr_hw (like the other implementations) crashes diff --git a/core/crypto/aes/aes_impl.odin b/core/crypto/aes/aes_impl.odin index f26874809..b95abfaf0 100644 --- a/core/crypto/aes/aes_impl.odin +++ b/core/crypto/aes/aes_impl.odin @@ -1,9 +1,11 @@ package aes +import "core:crypto" import "core:crypto/_aes/ct64" -import "core:mem" import "core:reflect" +zero_explicit :: crypto.zero_explicit + @(private) Context_Impl :: union { ct64.Context, @@ -41,5 +43,5 @@ init_impl :: proc(ctx: ^Context_Impl, key: []byte, impl: Implementation) { @(private) reset_impl :: proc "contextless" (ctx: ^Context_Impl) { - mem.zero_explicit(ctx, size_of(Context_Impl)) -} + zero_explicit(ctx, size_of(Context_Impl)) +} \ No newline at end of file diff --git a/core/crypto/chacha20/chacha20.odin b/core/crypto/chacha20/chacha20.odin index a91c6a24a..91f22f744 100644 --- a/core/crypto/chacha20/chacha20.odin +++ b/core/crypto/chacha20/chacha20.odin @@ -8,8 +8,8 @@ See: package chacha20 import "core:bytes" +import "core:crypto" import "core:crypto/_chacha20" -import "core:mem" // KEY_SIZE is the (X)ChaCha20 key size in bytes. KEY_SIZE :: _chacha20.KEY_SIZE @@ -50,7 +50,7 @@ init :: proc(ctx: ^Context, key, iv: []byte, impl := DEFAULT_IMPLEMENTATION) { // The sub-key is stored in the keystream buffer. While // this will be overwritten in most circumstances, explicitly // clear it out early. - mem.zero_explicit(&ctx._state._buffer, KEY_SIZE) + crypto.zero_explicit(&ctx._state._buffer, KEY_SIZE) } } diff --git a/core/crypto/chacha20poly1305/chacha20poly1305.odin b/core/crypto/chacha20poly1305/chacha20poly1305.odin index 9840d357e..0504acab0 100644 --- a/core/crypto/chacha20poly1305/chacha20poly1305.odin +++ b/core/crypto/chacha20poly1305/chacha20poly1305.odin @@ -13,7 +13,6 @@ import "core:crypto" import "core:crypto/chacha20" import "core:crypto/poly1305" import "core:encoding/endian" -import "core:mem" // KEY_SIZE is the chacha20poly1305 key size in bytes. KEY_SIZE :: chacha20.KEY_SIZE @@ -103,7 +102,7 @@ seal :: proc(ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) { chacha20.keystream_bytes(&stream_ctx, otk[:]) mac_ctx: poly1305.Context = --- poly1305.init(&mac_ctx, otk[:]) - mem.zero_explicit(&otk, size_of(otk)) + crypto.zero_explicit(&otk, size_of(otk)) aad_len, ciphertext_len := len(aad), len(ciphertext) @@ -164,7 +163,7 @@ open :: proc(ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte) -> bool { mac_ctx: poly1305.Context = --- poly1305.init(&mac_ctx, otk[:]) - defer mem.zero_explicit(&otk, size_of(otk)) + defer crypto.zero_explicit(&otk, size_of(otk)) aad_len, ciphertext_len := len(aad), len(ciphertext) @@ -188,7 +187,7 @@ open :: proc(ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte) -> bool { // Validate the tag in constant time. if crypto.compare_constant_time(tag, derived_tag) != 1 { // Zero out the plaintext, as a defense in depth measure. - mem.zero_explicit(raw_data(plaintext), ciphertext_len) + crypto.zero_explicit(raw_data(plaintext), ciphertext_len) return false } @@ -202,7 +201,7 @@ open :: proc(ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte) -> bool { // reset sanitizes the Context. The Context must be // re-initialized to be used again. reset :: proc "contextless" (ctx: ^Context) { - mem.zero_explicit(&ctx._key, len(ctx._key)) + crypto.zero_explicit(&ctx._key, len(ctx._key)) ctx._is_xchacha = false ctx._is_initialized = false } diff --git a/core/crypto/crypto.odin b/core/crypto/crypto.odin index 3fb369a54..b36bc2004 100644 --- a/core/crypto/crypto.odin +++ b/core/crypto/crypto.odin @@ -1,9 +1,9 @@ // A selection of cryptography algorithms and useful helper routines. package crypto +import "base:intrinsics" import "base:runtime" import subtle "core:crypto/_subtle" -import "core:mem" // Omit large precomputed tables, trading off performance for size. COMPACT_IMPLS: bool : #config(ODIN_CRYPTO_COMPACT, false) @@ -38,8 +38,8 @@ compare_constant_time :: proc "contextless" (a, b: []byte) -> int { // contents of the memory being compared. @(optimization_mode="none") compare_byte_ptrs_constant_time :: proc "contextless" (a, b: ^byte, n: int) -> int { - x := mem.slice_ptr(a, n) - y := mem.slice_ptr(b, n) + x := ([^]byte)(a)[:n] + y := ([^]byte)(b)[:n] v: byte for i in 0.. int { return subtle.byte_eq(0, v) } +/* +Set each byte of a memory range to zero. + +This procedure copies the value `0` into the `len` bytes of a memory range, +starting at address `data`. + +This procedure returns the pointer to `data`. + +Unlike the `zero()` procedure, which can be optimized away or reordered by the +compiler under certain circumstances, `zero_explicit()` procedure can not be +optimized away or reordered with other memory access operations, and the +compiler assumes volatile semantics of the memory. +*/ +zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { + // This routine tries to avoid the compiler optimizing away the call, + // so that it is always executed. It is intended to provide + // equivalent semantics to those provided by the C11 Annex K 3.7.4.1 + // memset_s call. + intrinsics.mem_zero_volatile(data, len) // Use the volatile mem_zero + intrinsics.atomic_thread_fence(.Seq_Cst) // Prevent reordering + return data +} + +/* +Set each byte of a memory range to a specific value. + +This procedure copies value specified by the `value` parameter into each of the +`len` bytes of a memory range, located at address `data`. + +This procedure returns the pointer to `data`. +*/ +set :: proc "contextless" (data: rawptr, value: byte, len: int) -> rawptr { + return runtime.memset(data, i32(value), len) +} + // rand_bytes fills the dst buffer with cryptographic entropy taken from // the system entropy source. This routine will block if the system entropy // source is not ready yet. All system entropy source failures are treated @@ -70,7 +105,7 @@ is_zero_constant_time :: proc "contextless" (b: []byte) -> int { // `HAS_RAND_BYTES` boolean constant. rand_bytes :: proc (dst: []byte) { // zero-fill the buffer first - mem.zero_explicit(raw_data(dst), len(dst)) + zero_explicit(raw_data(dst), len(dst)) runtime.rand_bytes(dst) } diff --git a/core/crypto/deoxysii/deoxysii.odin b/core/crypto/deoxysii/deoxysii.odin index 3ebcfea30..829d3d3ad 100644 --- a/core/crypto/deoxysii/deoxysii.odin +++ b/core/crypto/deoxysii/deoxysii.odin @@ -8,8 +8,8 @@ package deoxysii import "base:intrinsics" import "core:bytes" +import "core:crypto" import "core:crypto/aes" -import "core:mem" import "core:simd" // KEY_SIZE is the Deoxys-II-256 key size in bytes. @@ -142,7 +142,7 @@ open :: proc(ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte) -> bool { ok = d_ref(ctx, dst, iv, aad, ciphertext, tag) } if !ok { - mem.zero_explicit(raw_data(dst), len(ciphertext)) + crypto.zero_explicit(raw_data(dst), len(ciphertext)) } return ok @@ -151,7 +151,7 @@ open :: proc(ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte) -> bool { // reset sanitizes the Context. The Context must be // re-initialized to be used again. reset :: proc "contextless" (ctx: ^Context) { - mem.zero_explicit(&ctx._subkeys, len(ctx._subkeys)) + crypto.zero_explicit(&ctx._subkeys, len(ctx._subkeys)) ctx._is_initialized = false } diff --git a/core/crypto/deoxysii/deoxysii_impl_ct64.odin b/core/crypto/deoxysii/deoxysii_impl_ct64.odin index c4d0edb03..e95eaa678 100644 --- a/core/crypto/deoxysii/deoxysii_impl_ct64.odin +++ b/core/crypto/deoxysii/deoxysii_impl_ct64.odin @@ -4,7 +4,6 @@ import "base:intrinsics" import "core:crypto" import aes "core:crypto/_aes/ct64" import "core:encoding/endian" -import "core:mem" import "core:simd" // This uses the bitlsiced 64-bit general purpose register SWAR AES @@ -149,8 +148,8 @@ bc_absorb :: proc "contextless" ( intrinsics.unaligned_store((^simd.u8x16)(raw_data(dst)), dst_) - mem.zero_explicit(&tweaks, size_of(tweaks)) - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tweaks, size_of(tweaks)) + crypto.zero_explicit(&tmp, size_of(tmp)) return stk_block_nr } @@ -214,8 +213,8 @@ bc_encrypt :: proc "contextless" ( nr_blocks -= n } - mem.zero_explicit(&tweaks, size_of(tweaks)) - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tweaks, size_of(tweaks)) + crypto.zero_explicit(&tmp, size_of(tmp)) return stk_block_nr } @@ -295,13 +294,13 @@ e_ref :: proc "contextless" (ctx: ^Context, dst, tag, iv, aad, plaintext: []byte copy(dst[n*BLOCK_SIZE:], m_star[:]) - mem.zero_explicit(&m_star, size_of(m_star)) + crypto.zero_explicit(&m_star, size_of(m_star)) } copy(tag, auth[:]) - mem.zero_explicit(&st.q_stk, size_of(st.q_stk)) - mem.zero_explicit(&st.q_b, size_of(st.q_b)) + crypto.zero_explicit(&st.q_stk, size_of(st.q_stk)) + crypto.zero_explicit(&st.q_b, size_of(st.q_b)) } @(private, require_results) @@ -336,7 +335,7 @@ d_ref :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byt copy(dst[n*BLOCK_SIZE:], m_star[:]) - mem.zero_explicit(&m_star, size_of(m_star)) + crypto.zero_explicit(&m_star, size_of(m_star)) } // Associated data @@ -382,7 +381,7 @@ d_ref :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byt _ = bc_absorb(&st, auth[:], m_star[:], PREFIX_MSG_FINAL, n) - mem.zero_explicit(&m_star, size_of(m_star)) + crypto.zero_explicit(&m_star, size_of(m_star)) } bc_final(&st, auth[:], iv) @@ -391,9 +390,9 @@ d_ref :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byt // else return false ok := crypto.compare_constant_time(auth[:], tag) == 1 - mem.zero_explicit(&auth, size_of(auth)) - mem.zero_explicit(&st.q_stk, size_of(st.q_stk)) - mem.zero_explicit(&st.q_b, size_of(st.q_b)) + crypto.zero_explicit(&auth, size_of(auth)) + crypto.zero_explicit(&st.q_stk, size_of(st.q_stk)) + crypto.zero_explicit(&st.q_b, size_of(st.q_b)) return ok -} +} \ No newline at end of file diff --git a/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin b/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin index d268009a2..cdad16f42 100644 --- a/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin +++ b/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin @@ -4,7 +4,6 @@ package deoxysii import "base:intrinsics" import "core:crypto" import "core:crypto/aes" -import "core:mem" import "core:simd" import "core:simd/x86" @@ -374,7 +373,7 @@ d_hw :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte copy(dst[n*BLOCK_SIZE:], m_star[:]) - mem.zero_explicit(&m_star, size_of(m_star)) + crypto.zero_explicit(&m_star, size_of(m_star)) } // Associated data @@ -428,7 +427,7 @@ d_hw :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte intrinsics.unaligned_store((^x86.__m128i)(raw_data(&tmp)), auth) ok := crypto.compare_constant_time(tmp[:], tag) == 1 - mem.zero_explicit(&tmp, size_of(tmp)) + crypto.zero_explicit(&tmp, size_of(tmp)) return ok } diff --git a/core/crypto/ecdh/ecdh.odin b/core/crypto/ecdh/ecdh.odin index 80ef3f704..15dba335c 100644 --- a/core/crypto/ecdh/ecdh.odin +++ b/core/crypto/ecdh/ecdh.odin @@ -4,7 +4,6 @@ import "core:crypto" import secec "core:crypto/_weierstrass" import "core:crypto/x25519" import "core:crypto/x448" -import "core:mem" import "core:reflect" // Note: For these primitives scalar size = point size @@ -125,7 +124,7 @@ private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { // 384-bits reduced makes the modulo bias insignificant b: [48]byte = --- - defer (mem.zero_explicit(&b, size_of(b))) + defer (crypto.zero_explicit(&b, size_of(b))) for { crypto.rand_bytes(b[:]) _ = secec.sc_set_bytes(sc, b[:]) @@ -137,7 +136,7 @@ private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { sc := &priv_key._impl.(secec.Scalar_p384r1) b: [48]byte = --- - defer (mem.zero_explicit(&b, size_of(b))) + defer (crypto.zero_explicit(&b, size_of(b))) for { crypto.rand_bytes(b[:]) did_reduce := secec.sc_set_bytes(sc, b[:]) @@ -292,7 +291,7 @@ private_key_equal :: proc(p, q: ^Private_Key) -> bool { // private_key_clear clears priv_key to the uninitialized state. private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { - mem.zero_explicit(priv_key, size_of(Private_Key)) + crypto.zero_explicit(priv_key, size_of(Private_Key)) } // public_key_set_bytes decodes a byte-encoded public key, and returns @@ -412,7 +411,7 @@ public_key_equal :: proc(p, q: ^Public_Key) -> bool { // public_key_clear clears pub_key to the uninitialized state. public_key_clear :: proc "contextless" (pub_key: ^Public_Key) { - mem.zero_explicit(pub_key, size_of(Public_Key)) + crypto.zero_explicit(pub_key, size_of(Public_Key)) } // ecdh performs an Elliptic Curve Diffie-Hellman key exchange betwween diff --git a/core/crypto/ed25519/ed25519.odin b/core/crypto/ed25519/ed25519.odin index f6a71d888..90875c207 100644 --- a/core/crypto/ed25519/ed25519.odin +++ b/core/crypto/ed25519/ed25519.odin @@ -11,7 +11,6 @@ package ed25519 import "core:crypto" import grp "core:crypto/_edwards25519" import "core:crypto/sha2" -import "core:mem" // PRIVATE_KEY_SIZE is the byte-encoded private key size. PRIVATE_KEY_SIZE :: 32 @@ -89,7 +88,7 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { // private_key_clear clears priv_key to the uninitialized state. private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { - mem.zero_explicit(priv_key, size_of(Private_Key)) + crypto.zero_explicit(priv_key, size_of(Private_Key)) } // sign writes the signature by priv_key over msg to sig. diff --git a/core/crypto/hash/hash.odin b/core/crypto/hash/hash.odin index ecb33b9d0..31f07ac72 100644 --- a/core/crypto/hash/hash.odin +++ b/core/crypto/hash/hash.odin @@ -8,8 +8,8 @@ package crypto_hash zhibog, dotbmp: Initial implementation. */ +import "core:crypto" import "core:io" -import "core:mem" // hash_bytes will hash the given input and return the computed digest // in a newly allocated slice. @@ -61,7 +61,7 @@ hash_stream :: proc( ctx: Context buf: [MAX_BLOCK_SIZE * 4]byte - defer mem.zero_explicit(&buf, size_of(buf)) + defer crypto.zero_explicit(&buf, size_of(buf)) init(&ctx, algorithm) diff --git a/core/crypto/hkdf/hkdf.odin b/core/crypto/hkdf/hkdf.odin index b3a6bf303..b2b515676 100644 --- a/core/crypto/hkdf/hkdf.odin +++ b/core/crypto/hkdf/hkdf.odin @@ -5,9 +5,9 @@ See: [[ https://www.rfc-editor.org/rfc/rfc5869 ]] */ package hkdf +import "core:crypto" import "core:crypto/hash" import "core:crypto/hmac" -import "core:mem" // extract_and_expand derives output keying material (OKM) via the // HKDF-Extract and HKDF-Expand algorithms, with the specified has @@ -18,7 +18,7 @@ extract_and_expand :: proc(algorithm: hash.Algorithm, salt, ikm, info, dst: []by tmp: [hash.MAX_DIGEST_SIZE]byte prk := tmp[:h_len] - defer mem.zero_explicit(raw_data(prk), h_len) + defer crypto.zero_explicit(raw_data(prk), h_len) extract(algorithm, salt, ikm, prk) expand(algorithm, prk, info, dst) @@ -83,7 +83,7 @@ expand :: proc(algorithm: hash.Algorithm, prk, info, dst: []byte) { if r > 0 { tmp: [hash.MAX_DIGEST_SIZE]byte blk := tmp[:h_len] - defer mem.zero_explicit(raw_data(blk), h_len) + defer crypto.zero_explicit(raw_data(blk), h_len) _F(&base, prev, info, n + 1, blk) copy(dst_blk, blk) diff --git a/core/crypto/hmac/hmac.odin b/core/crypto/hmac/hmac.odin index 1427baf34..d28c03b5b 100644 --- a/core/crypto/hmac/hmac.odin +++ b/core/crypto/hmac/hmac.odin @@ -8,7 +8,6 @@ package hmac import "core:crypto" import "core:crypto/hash" -import "core:mem" // sum will compute the HMAC with the specified algorithm and key // over msg, and write the computed tag to dst. It requires that @@ -126,7 +125,7 @@ _init_hashes :: proc(ctx: ^Context, algorithm: hash.Algorithm, key: []byte) { kLen := len(key) B := hash.BLOCK_SIZES[algorithm] K0 := K0_buf[:B] - defer mem.zero_explicit(raw_data(K0), B) + defer crypto.zero_explicit(raw_data(K0), B) switch { case kLen == B, kLen < B: @@ -157,7 +156,7 @@ _init_hashes :: proc(ctx: ^Context, algorithm: hash.Algorithm, key: []byte) { hash.init(&ctx._i_hash, algorithm) kPad := kPad_buf[:B] - defer mem.zero_explicit(raw_data(kPad), B) + defer crypto.zero_explicit(raw_data(kPad), B) for v, i in K0 { kPad[i] = v ~ _I_PAD diff --git a/core/crypto/legacy/md5/md5.odin b/core/crypto/legacy/md5/md5.odin index d9d74d498..399a789ed 100644 --- a/core/crypto/legacy/md5/md5.odin +++ b/core/crypto/legacy/md5/md5.odin @@ -18,9 +18,9 @@ package md5 zhibog, dotbmp: Initial implementation. */ +import "core:crypto" import "core:encoding/endian" import "core:math/bits" -import "core:mem" // DIGEST_SIZE is the MD5 digest size in bytes. DIGEST_SIZE :: 16 @@ -100,7 +100,7 @@ final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { i += 1 } transform(ctx, ctx.data[:]) - mem.set(&ctx.data, 0, 56) + crypto.set(&ctx.data, 0, 56) } ctx.bitlen += u64(ctx.datalen * 8) @@ -124,7 +124,7 @@ reset :: proc(ctx: ^$T) { return } - mem.zero_explicit(ctx, size_of(ctx^)) + crypto.zero_explicit(ctx, size_of(ctx^)) } /* diff --git a/core/crypto/legacy/sha1/sha1.odin b/core/crypto/legacy/sha1/sha1.odin index 35b228f69..f9adcc3d1 100644 --- a/core/crypto/legacy/sha1/sha1.odin +++ b/core/crypto/legacy/sha1/sha1.odin @@ -19,9 +19,9 @@ package sha1 zhibog, dotbmp: Initial implementation. */ +import "core:crypto" import "core:encoding/endian" import "core:math/bits" -import "core:mem" // DIGEST_SIZE is the SHA1 digest size in bytes. DIGEST_SIZE :: 20 @@ -107,7 +107,7 @@ final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { i += 1 } transform(ctx, ctx.data[:]) - mem.set(&ctx.data, 0, 56) + crypto.set(&ctx.data, 0, 56) } ctx.bitlen += u64(ctx.datalen * 8) @@ -131,7 +131,7 @@ reset :: proc(ctx: ^$T) { return } - mem.zero_explicit(ctx, size_of(ctx^)) + crypto.zero_explicit(ctx, size_of(ctx^)) } /* diff --git a/core/crypto/pbkdf2/pbkdf2.odin b/core/crypto/pbkdf2/pbkdf2.odin index c96855b9c..9d8394031 100644 --- a/core/crypto/pbkdf2/pbkdf2.odin +++ b/core/crypto/pbkdf2/pbkdf2.odin @@ -5,10 +5,10 @@ See: [[ https://www.rfc-editor.org/rfc/rfc2898 ]] */ package pbkdf2 +import "core:crypto" import "core:crypto/hash" import "core:crypto/hmac" import "core:encoding/endian" -import "core:mem" // derive invokes PBKDF2-HMAC with the specified hash algorithm, password, // salt, iteration count, and outputs the derived key to dst. @@ -71,7 +71,7 @@ derive :: proc( if r > 0 { tmp: [hash.MAX_DIGEST_SIZE]byte blk := tmp[:h_len] - defer mem.zero_explicit(raw_data(blk), h_len) + defer crypto.zero_explicit(raw_data(blk), h_len) _F(&base, salt, iterations, u32(l + 1), blk) copy(dst_blk, blk) @@ -84,7 +84,7 @@ _F :: proc(base: ^hmac.Context, salt: []byte, c: u32, i: u32, dst_blk: []byte) { tmp: [hash.MAX_DIGEST_SIZE]byte u := tmp[:h_len] - defer mem.zero_explicit(raw_data(u), h_len) + defer crypto.zero_explicit(raw_data(u), h_len) // F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c // diff --git a/core/crypto/poly1305/poly1305.odin b/core/crypto/poly1305/poly1305.odin index d90f2ad54..69e2e3ad3 100644 --- a/core/crypto/poly1305/poly1305.odin +++ b/core/crypto/poly1305/poly1305.odin @@ -10,7 +10,6 @@ import "core:crypto" import field "core:crypto/_fiat/field_poly1305" import "core:encoding/endian" import "core:math/bits" -import "core:mem" // KEY_SIZE is the Poly1305 key size in bytes. KEY_SIZE :: 32 @@ -155,10 +154,10 @@ final :: proc(ctx: ^Context, dst: []byte) { // reset sanitizes the Context. The Context must be re-initialized to // be used again. reset :: proc(ctx: ^Context) { - mem.zero_explicit(&ctx._r, size_of(ctx._r)) - mem.zero_explicit(&ctx._a, size_of(ctx._a)) - mem.zero_explicit(&ctx._s, size_of(ctx._s)) - mem.zero_explicit(&ctx._buffer, size_of(ctx._buffer)) + crypto.zero_explicit(&ctx._r, size_of(ctx._r)) + crypto.zero_explicit(&ctx._a, size_of(ctx._a)) + crypto.zero_explicit(&ctx._s, size_of(ctx._s)) + crypto.zero_explicit(&ctx._buffer, size_of(ctx._buffer)) ctx._is_initialized = false } diff --git a/core/crypto/ristretto255/ristretto255.odin b/core/crypto/ristretto255/ristretto255.odin index 78bf45c28..3724aee7a 100644 --- a/core/crypto/ristretto255/ristretto255.odin +++ b/core/crypto/ristretto255/ristretto255.odin @@ -6,9 +6,9 @@ See: */ package ristretto255 +import "core:crypto" import grp "core:crypto/_edwards25519" import field "core:crypto/_fiat/field_curve25519" -import "core:mem" // ELEMENT_SIZE is the size of a byte-encoded ristretto255 group element. ELEMENT_SIZE :: 32 @@ -71,7 +71,7 @@ Group_Element :: struct { // ge_clear clears ge to the uninitialized state. ge_clear :: proc "contextless" (ge: ^Group_Element) { - mem.zero_explicit(ge, size_of(Group_Element)) + crypto.zero_explicit(ge, size_of(Group_Element)) } // ge_set sets `ge = a`. diff --git a/core/crypto/sha2/sha2.odin b/core/crypto/sha2/sha2.odin index 0b34cd6a1..36fa4aa02 100644 --- a/core/crypto/sha2/sha2.odin +++ b/core/crypto/sha2/sha2.odin @@ -15,9 +15,9 @@ package sha2 zhibog, dotbmp: Initial implementation. */ +@(require) import "core:crypto" @(require) import "core:encoding/endian" import "core:math/bits" -@(require) import "core:mem" // DIGEST_SIZE_224 is the SHA-224 digest size in bytes. DIGEST_SIZE_224 :: 28 @@ -260,7 +260,7 @@ reset :: proc(ctx: ^$T) { return } - mem.zero_explicit(ctx, size_of(ctx^)) + crypto.zero_explicit(ctx, size_of(ctx^)) } /* diff --git a/core/crypto/sm3/sm3.odin b/core/crypto/sm3/sm3.odin index 186331d92..ac38ca417 100644 --- a/core/crypto/sm3/sm3.odin +++ b/core/crypto/sm3/sm3.odin @@ -14,9 +14,9 @@ package sm3 zhibog, dotbmp: Initial implementation. */ +import "core:crypto" import "core:encoding/endian" import "core:math/bits" -import "core:mem" // DIGEST_SIZE is the SM3 digest size in bytes. DIGEST_SIZE :: 32 @@ -126,7 +126,7 @@ reset :: proc(ctx: ^Context) { return } - mem.zero_explicit(ctx, size_of(ctx^)) + crypto.zero_explicit(ctx, size_of(ctx^)) } /* diff --git a/core/crypto/x25519/x25519.odin b/core/crypto/x25519/x25519.odin index 2d7aa4153..6268a882d 100644 --- a/core/crypto/x25519/x25519.odin +++ b/core/crypto/x25519/x25519.odin @@ -9,7 +9,6 @@ package x25519 import "core:crypto" import ed "core:crypto/_edwards25519" import field "core:crypto/_fiat/field_curve25519" -import "core:mem" // SCALAR_SIZE is the size of a X25519 scalar (private key) in bytes. SCALAR_SIZE :: 32 @@ -119,7 +118,7 @@ scalarmult :: proc(dst, scalar, point: []byte) { d := (^[32]byte)(raw_data(dst)) _scalarmult(d, &e, p) - mem.zero_explicit(&e, size_of(e)) + crypto.zero_explicit(&e, size_of(e)) } // scalarmult_basepoint "multiplies" the provided scalar with the X25519 diff --git a/core/crypto/x448/x448.odin b/core/crypto/x448/x448.odin index 75693e055..f2cbaadec 100644 --- a/core/crypto/x448/x448.odin +++ b/core/crypto/x448/x448.odin @@ -6,8 +6,8 @@ See: */ package x448 +import "core:crypto" import field "core:crypto/_fiat/field_curve448" -import "core:mem" // SCALAR_SIZE is the size of a X448 scalar (private key) in bytes. SCALAR_SIZE :: 56 @@ -143,8 +143,8 @@ scalarmult :: proc(dst, scalar, point: []byte) { _scalarmult(&d, &e, &p) copy_slice(dst, d[:]) - mem.zero_explicit(&e, size_of(e)) - mem.zero_explicit(&d, size_of(d)) + crypto.zero_explicit(&e, size_of(e)) + crypto.zero_explicit(&d, size_of(d)) } // scalarmult_basepoint "multiplies" the provided scalar with the X448 From 871ad165015f61f2225eb5f58db135984f65fade Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Thu, 12 Feb 2026 10:54:59 -0500 Subject: [PATCH 456/766] Add the length checks back to string.compare() --- core/strings/strings.odin | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/strings/strings.odin b/core/strings/strings.odin index 9b75c558b..c19bf8c37 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -242,7 +242,13 @@ Returns: - result: `-1` if `lhs` comes first, `1` if `rhs` comes first, or `0` if they are equal */ compare :: proc "contextless" (lhs, rhs: string) -> (res: int) { - return runtime.string_cmp(lhs, rhs) + res = runtime.string_cmp(lhs, rhs) + if res == 0 && len(lhs) != len(rhs) { + return len(lhs) <= len(rhs) ? -1 : +1 + } else if len(lhs) == 0 && len(rhs) == 0 { + return 0 + } + return res } /* From 8a2a0c5a93c73310ec6d41cb38ca524d37fc07e7 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Thu, 12 Feb 2026 11:05:23 -0500 Subject: [PATCH 457/766] Remove core:mem dependency from strings intern.odin --- core/strings/intern.odin | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/strings/intern.odin b/core/strings/intern.odin index 909510c7c..9b816ff8d 100644 --- a/core/strings/intern.odin +++ b/core/strings/intern.odin @@ -1,7 +1,6 @@ package strings import "base:runtime" -import "core:mem" // Custom string entry struct Intern_Entry :: struct { @@ -35,7 +34,7 @@ Inputs: Returns: - err: An allocator error if one occured, `nil` otherwise */ -intern_init :: proc(m: ^Intern, allocator := context.allocator, map_allocator := context.allocator, loc := #caller_location) -> (err: mem.Allocator_Error) { +intern_init :: proc(m: ^Intern, allocator := context.allocator, map_allocator := context.allocator, loc := #caller_location) -> (err: runtime.Allocator_Error) { m.allocator = allocator m.entries = make(map[string]^Intern_Entry, 16, map_allocator, loc) or_return return nil From 51183268b7518c3875079813fc8c5cc234f440bf Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 17:44:36 +0100 Subject: [PATCH 458/766] Remove `core:mem` import from `core:container/pool`. --- core/container/pool/pool.odin | 10 +++++----- core/container/pool/pool_arena_others.odin | 4 +--- core/container/pool/pool_arena_virtual.odin | 4 +--- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/core/container/pool/pool.odin b/core/container/pool/pool.odin index 01fb29f2d..55ea57d55 100644 --- a/core/container/pool/pool.odin +++ b/core/container/pool/pool.odin @@ -1,12 +1,12 @@ package container_pool import "base:intrinsics" +import "base:runtime" import "base:sanitizer" - -import "core:mem" import "core:sync" _ :: sanitizer +_ :: sync DEFAULT_BLOCK_SIZE :: _DEFAULT_BLOCK_SIZE @@ -33,7 +33,7 @@ Pool :: struct($T: typeid) { } @(require_results) -init :: proc(p: ^Pool($T), $link_field: string, block_size: uint = DEFAULT_BLOCK_SIZE) -> (err: mem.Allocator_Error) +init :: proc(p: ^Pool($T), $link_field: string, block_size: uint = DEFAULT_BLOCK_SIZE) -> (err: runtime.Allocator_Error) where intrinsics.type_has_field(T, link_field), intrinsics.type_field_type(T, link_field) == ^T { p.link_off = offset_of_by_string(T, link_field) @@ -58,7 +58,7 @@ destroy :: proc(p: ^Pool($T)) { } @(require_results) -get :: proc(p: ^Pool($T)) -> (elem: ^T, err: mem.Allocator_Error) #optional_allocator_error { +get :: proc(p: ^Pool($T)) -> (elem: ^T, err: runtime.Allocator_Error) #optional_allocator_error { defer sync.atomic_add_explicit(&p.num_outstanding, 1, .Relaxed) for { @@ -78,7 +78,7 @@ get :: proc(p: ^Pool($T)) -> (elem: ^T, err: mem.Allocator_Error) #optional_allo } put :: proc(p: ^Pool($T), elem: ^T) { - mem.zero_item(elem) + intrinsics.mem_zero(elem, size_of(T)) _poison_elem(p, elem) defer sync.atomic_sub_explicit(&p.num_outstanding, 1, .Relaxed) diff --git a/core/container/pool/pool_arena_others.odin b/core/container/pool/pool_arena_others.odin index 3069076f7..d2e01ffb7 100644 --- a/core/container/pool/pool_arena_others.odin +++ b/core/container/pool/pool_arena_others.odin @@ -9,11 +9,9 @@ package container_pool import "base:runtime" -import "core:mem" - _Pool_Arena :: runtime.Arena -_DEFAULT_BLOCK_SIZE :: mem.Megabyte +_DEFAULT_BLOCK_SIZE :: runtime.Megabyte _pool_arena_init :: proc(arena: ^Pool_Arena, block_size: uint = DEFAULT_BLOCK_SIZE) -> (err: runtime.Allocator_Error) { runtime.arena_init(arena, block_size, runtime.default_allocator()) or_return diff --git a/core/container/pool/pool_arena_virtual.odin b/core/container/pool/pool_arena_virtual.odin index 192e60260..d622990fd 100644 --- a/core/container/pool/pool_arena_virtual.odin +++ b/core/container/pool/pool_arena_virtual.odin @@ -2,13 +2,11 @@ package container_pool import "base:runtime" - -import "core:mem" import "core:mem/virtual" _Pool_Arena :: virtual.Arena -_DEFAULT_BLOCK_SIZE :: mem.Gigabyte +_DEFAULT_BLOCK_SIZE :: runtime.Gigabyte _pool_arena_init :: proc(arena: ^Pool_Arena, block_size: uint = DEFAULT_BLOCK_SIZE) -> (err: runtime.Allocator_Error) { virtual.arena_init_growing(arena, block_size) or_return From d1927e4eba67b309696899536de6279894fbcad6 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Thu, 12 Feb 2026 11:52:55 -0500 Subject: [PATCH 459/766] strings.compare() can be an alias of runtime.string_cmp() --- core/strings/strings.odin | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/core/strings/strings.odin b/core/strings/strings.odin index c19bf8c37..d40b81b3d 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -241,15 +241,7 @@ Inputs: Returns: - result: `-1` if `lhs` comes first, `1` if `rhs` comes first, or `0` if they are equal */ -compare :: proc "contextless" (lhs, rhs: string) -> (res: int) { - res = runtime.string_cmp(lhs, rhs) - if res == 0 && len(lhs) != len(rhs) { - return len(lhs) <= len(rhs) ? -1 : +1 - } else if len(lhs) == 0 && len(rhs) == 0 { - return 0 - } - return res -} +compare :: runtime.string_cmp /* Checks if rune `r` in the string `s` From 8cb22d9685c6fb59784514b36e91991ca759b847 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 17:58:10 +0100 Subject: [PATCH 460/766] Remove `core:mem` import from `core:container/bit_array`. --- core/container/bit_array/bit_array.odin | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index 85b941d12..7d74d9ba7 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -2,7 +2,6 @@ package container_dynamic_bit_array import "base:builtin" import "base:intrinsics" -import "core:mem" /* Note that these constants are dependent on the backing being a u64. @@ -329,7 +328,7 @@ Inputs: */ clear :: proc(ba: ^Bit_Array) { if ba == nil { return } - mem.zero_slice(ba.bits[:]) + intrinsics.mem_zero(raw_data(ba.bits), builtin.len(ba.bits) * NUM_BITS / 8) } /* Gets the length of set and unset valid bits in the Bit_Array. From c0300a33039ab003cbf105c082fe43de4b17ab96 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 12 Feb 2026 18:19:24 +0100 Subject: [PATCH 461/766] Remove `core:mem` imports from `core:encoding`. --- core/encoding/base64/base64.odin | 6 +++--- core/encoding/hxa/hxa.odin | 4 ++-- core/encoding/hxa/read.odin | 3 +-- core/encoding/hxa/write.odin | 6 ++---- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/core/encoding/base64/base64.odin b/core/encoding/base64/base64.odin index 0677fdfb7..1488e2201 100644 --- a/core/encoding/base64/base64.odin +++ b/core/encoding/base64/base64.odin @@ -9,8 +9,8 @@ truncate it from the encoded output. */ package encoding_base64 +import "base:runtime" import "core:io" -import "core:mem" import "core:strings" ENC_TABLE := [64]byte { @@ -110,7 +110,7 @@ DEC_URL_TABLE := [256]u8 { } -encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> (encoded: string, err: mem.Allocator_Error) #optional_allocator_error { +encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> (encoded: string, err: runtime.Allocator_Error) #optional_allocator_error { out_length := encoded_len(data) if out_length == 0 { return @@ -161,7 +161,7 @@ encoded_len :: proc(data: []byte) -> int { return ((4 * length / 3) + 3) &~ 3 } -decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> (decoded: []byte, err: mem.Allocator_Error) #optional_allocator_error { +decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> (decoded: []byte, err: runtime.Allocator_Error) #optional_allocator_error { out_length := decoded_len(data) out := strings.builder_make(0, out_length, allocator) or_return diff --git a/core/encoding/hxa/hxa.odin b/core/encoding/hxa/hxa.odin index 9d0c58196..4ed2001d9 100644 --- a/core/encoding/hxa/hxa.odin +++ b/core/encoding/hxa/hxa.odin @@ -1,6 +1,6 @@ package encoding_hxa -import "core:mem" +import "base:runtime" LATEST_VERSION :: 3 VERSION_API :: "0.3" @@ -16,7 +16,7 @@ Header :: struct #packed { File :: struct { using header: Header, backing: []byte, - allocator: mem.Allocator, + allocator: runtime.Allocator, nodes: []Node, } diff --git a/core/encoding/hxa/read.odin b/core/encoding/hxa/read.odin index 1721bf7fc..29d57838c 100644 --- a/core/encoding/hxa/read.odin +++ b/core/encoding/hxa/read.odin @@ -1,7 +1,6 @@ package encoding_hxa import "core:fmt" -import "core:mem" Read_Error :: enum { None, @@ -45,7 +44,7 @@ read :: proc(data: []byte, filename := "", print_error := false, allocato } ptr := raw_data(r.data[r.offset:]) - value = mem.slice_ptr((^T)(ptr), count) + value = ([^]T)(ptr)[:count] r.offset += size_of(T)*count return } diff --git a/core/encoding/hxa/write.odin b/core/encoding/hxa/write.odin index cbf9c7cb6..0716131f5 100644 --- a/core/encoding/hxa/write.odin +++ b/core/encoding/hxa/write.odin @@ -1,7 +1,5 @@ package encoding_hxa -import "core:mem" - Write_Error :: enum { None, Buffer_Too_Small, @@ -50,7 +48,7 @@ write_internal :: proc(w: ^Writer, file: File) { remaining := len(w.data) - w.offset assert(size_of(T)*len(array) <= remaining) ptr := raw_data(w.data[w.offset:]) - dst := mem.slice_ptr((^T)(ptr), len(array)) + dst := ([^]T)(ptr)[:len(array)] copy(dst, array) } w.offset += size_of(T)*len(array) @@ -60,7 +58,7 @@ write_internal :: proc(w: ^Writer, file: File) { remaining := len(w.data) - w.offset assert(size_of(byte)*len(str) <= remaining) ptr := raw_data(w.data[w.offset:]) - dst := mem.slice_ptr((^byte)(ptr), len(str)) + dst := ([^]byte)(ptr)[:len(str)] copy(dst, str) } w.offset += size_of(byte)*len(str) From 671c46235aa776296e5114acc07ffe34e5c53190 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Thu, 12 Feb 2026 13:21:19 -0500 Subject: [PATCH 462/766] Remove core:mem dependency from strings builder --- core/strings/builder.odin | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/core/strings/builder.odin b/core/strings/builder.odin index ce636a2a1..5adced779 100644 --- a/core/strings/builder.odin +++ b/core/strings/builder.odin @@ -3,7 +3,6 @@ package strings import "base:runtime" import "core:unicode/utf8" import "core:strconv" -import "core:mem" import "core:io" /* Type definition for a procedure that flushes a Builder @@ -35,7 +34,7 @@ Returns: - res: The new Builder - err: An optional allocator error if one occured, `nil` otherwise */ -builder_make_none :: proc(allocator := context.allocator, loc := #caller_location) -> (res: Builder, err: mem.Allocator_Error) #optional_allocator_error { +builder_make_none :: proc(allocator := context.allocator, loc := #caller_location) -> (res: Builder, err: runtime.Allocator_Error) #optional_allocator_error { return Builder{buf=make([dynamic]byte, allocator, loc) or_return }, nil } /* @@ -51,7 +50,7 @@ Returns: - res: The new Builder - err: An optional allocator error if one occured, `nil` otherwise */ -builder_make_len :: proc(len: int, allocator := context.allocator, loc := #caller_location) -> (res: Builder, err: mem.Allocator_Error) #optional_allocator_error { +builder_make_len :: proc(len: int, allocator := context.allocator, loc := #caller_location) -> (res: Builder, err: runtime.Allocator_Error) #optional_allocator_error { return Builder{buf=make([dynamic]byte, len, allocator, loc) or_return }, nil } /* @@ -68,7 +67,7 @@ Returns: - res: The new Builder - err: An optional allocator error if one occured, `nil` otherwise */ -builder_make_len_cap :: proc(len, cap: int, allocator := context.allocator, loc := #caller_location) -> (res: Builder, err: mem.Allocator_Error) #optional_allocator_error { +builder_make_len_cap :: proc(len, cap: int, allocator := context.allocator, loc := #caller_location) -> (res: Builder, err: runtime.Allocator_Error) #optional_allocator_error { return Builder{buf=make([dynamic]byte, len, cap, allocator, loc) or_return }, nil } /* @@ -116,7 +115,7 @@ Returns: - res: A pointer to the initialized Builder - err: An optional allocator error if one occured, `nil` otherwise */ -builder_init_none :: proc(b: ^Builder, allocator := context.allocator, loc := #caller_location) -> (res: ^Builder, err: mem.Allocator_Error) #optional_allocator_error { +builder_init_none :: proc(b: ^Builder, allocator := context.allocator, loc := #caller_location) -> (res: ^Builder, err: runtime.Allocator_Error) #optional_allocator_error { b.buf = make([dynamic]byte, allocator, loc) or_return return b, nil } @@ -135,7 +134,7 @@ Returns: - res: A pointer to the initialized Builder - err: An optional allocator error if one occured, `nil` otherwise */ -builder_init_len :: proc(b: ^Builder, len: int, allocator := context.allocator, loc := #caller_location) -> (res: ^Builder, err: mem.Allocator_Error) #optional_allocator_error { +builder_init_len :: proc(b: ^Builder, len: int, allocator := context.allocator, loc := #caller_location) -> (res: ^Builder, err: runtime.Allocator_Error) #optional_allocator_error { b.buf = make([dynamic]byte, len, allocator, loc) or_return return b, nil } @@ -153,7 +152,7 @@ Returns: - res: A pointer to the initialized Builder - err: An optional allocator error if one occured, `nil` otherwise */ -builder_init_len_cap :: proc(b: ^Builder, len, cap: int, allocator := context.allocator, loc := #caller_location) -> (res: ^Builder, err: mem.Allocator_Error) #optional_allocator_error { +builder_init_len_cap :: proc(b: ^Builder, len, cap: int, allocator := context.allocator, loc := #caller_location) -> (res: ^Builder, err: runtime.Allocator_Error) #optional_allocator_error { b.buf = make([dynamic]byte, len, cap, allocator, loc) or_return return b, nil } @@ -269,8 +268,22 @@ Output: */ builder_from_bytes :: proc(backing: []byte) -> (res: Builder) { - return Builder{ buf = mem.buffer_from_slice(backing) } + return Builder{ buf = buffer_from_slice(backing) } } + +@(private) +buffer_from_slice :: proc "contextless" (backing: $T/[]$E) -> [dynamic]E { + return transmute([dynamic]E)runtime.Raw_Dynamic_Array{ + data = raw_data(backing), + len = 0, + cap = len(backing), + allocator = runtime.Allocator{ + procedure = runtime.nil_allocator_proc, + data = nil, + }, + } +} + // Alias to `builder_from_bytes` builder_from_slice :: builder_from_bytes /* @@ -311,7 +324,7 @@ Returns: - res: A cstring of the Builder's buffer upon success - err: An optional allocator error if one occured, `nil` otherwise */ -to_cstring :: proc(b: ^Builder, loc := #caller_location) -> (res: cstring, err: mem.Allocator_Error) #optional_allocator_error { +to_cstring :: proc(b: ^Builder, loc := #caller_location) -> (res: cstring, err: runtime.Allocator_Error) #optional_allocator_error { n := append(&b.buf, 0, loc) or_return if n != 1 { return nil, .Out_Of_Memory @@ -851,7 +864,7 @@ Returns: - replaced: The number of replacements - err: if any allocation errors occurred */ -builder_replace_all :: proc(b: ^Builder, old, new: string) -> (replaced: int, err: mem.Allocator_Error) { +builder_replace_all :: proc(b: ^Builder, old, new: string) -> (replaced: int, err: runtime.Allocator_Error) { return builder_replace(b, old, new, -1) } @@ -870,7 +883,7 @@ Returns: - replaced: The number of replacements - err: if any allocation errors occurred */ -builder_replace :: proc(b: ^Builder, old, new: string, n: int, loc := #caller_location) -> (replaced: int, err: mem.Allocator_Error) { +builder_replace :: proc(b: ^Builder, old, new: string, n: int, loc := #caller_location) -> (replaced: int, err: runtime.Allocator_Error) { if old == new || n == 0 { return } From bb9d45867f5c6d0b3801caf3e865aa857db4926e Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Thu, 12 Feb 2026 13:35:34 -0500 Subject: [PATCH 463/766] Remove core:mem dependency from strings conversion.odin --- core/strings/conversion.odin | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/strings/conversion.odin b/core/strings/conversion.odin index 2e82fff58..2e6bee573 100644 --- a/core/strings/conversion.odin +++ b/core/strings/conversion.odin @@ -1,7 +1,7 @@ package strings +import "base:runtime" import "core:io" -import "core:mem" import "core:unicode" import "core:unicode/utf8" @@ -21,7 +21,7 @@ Returns: - res: A valid UTF-8 string with invalid sequences replaced by `replacement`. - err: An optional allocator error if one occured, `nil` otherwise */ -to_valid_utf8 :: proc(s, replacement: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +to_valid_utf8 :: proc(s, replacement: string, allocator := context.allocator) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { if len(s) == 0 { return "", nil } @@ -101,7 +101,7 @@ Output: test */ -to_lower :: proc(s: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +to_lower :: proc(s: string, allocator := context.allocator) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { b: Builder builder_init(&b, 0, len(s), allocator) or_return for r in s { @@ -136,7 +136,7 @@ Output: TEST */ -to_upper :: proc(s: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +to_upper :: proc(s: string, allocator := context.allocator) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { b: Builder builder_init(&b, 0, len(s), allocator) or_return for r in s { @@ -260,7 +260,7 @@ Returns: - res: The converted string - err: An optional allocator error if one occured, `nil` otherwise */ -to_camel_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +to_camel_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { s := s s = trim_space(s) b: Builder @@ -296,7 +296,7 @@ Returns: - res: The converted string - err: An optional allocator error if one occured, `nil` otherwise */ -to_pascal_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +to_pascal_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { s := s s = trim_space(s) b: Builder @@ -355,7 +355,7 @@ to_delimiter_case :: proc( delimiter: rune, all_upper_case: bool, allocator := context.allocator, -) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { s := s s = trim_space(s) b: Builder @@ -422,7 +422,7 @@ Output: hello_world */ -to_snake_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +to_snake_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { return to_delimiter_case(s, '_', false, allocator) } // Alias for `to_upper_snake_case` @@ -454,7 +454,7 @@ Output: HELLO_WORLD */ -to_upper_snake_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +to_upper_snake_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { return to_delimiter_case(s, '_', true, allocator) } /* @@ -484,7 +484,7 @@ Output: hello-world */ -to_kebab_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +to_kebab_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { return to_delimiter_case(s, '-', false, allocator) } /* @@ -514,7 +514,7 @@ Output: HELLO-WORLD */ -to_upper_kebab_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +to_upper_kebab_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { return to_delimiter_case(s, '-', true, allocator) } /* @@ -544,7 +544,7 @@ Output: Hello_World */ -to_ada_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: mem.Allocator_Error) #optional_allocator_error { +to_ada_case :: proc(s: string, allocator := context.allocator) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { s := s s = trim_space(s) b: Builder From ce2a1f5d022f04932f9b3093807881d1668d148c Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Thu, 12 Feb 2026 14:04:38 -0500 Subject: [PATCH 464/766] Remove core:mem dependency from strings builder --- core/strings/builder.odin | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/core/strings/builder.odin b/core/strings/builder.odin index 5adced779..79ba6108f 100644 --- a/core/strings/builder.odin +++ b/core/strings/builder.odin @@ -268,20 +268,17 @@ Output: */ builder_from_bytes :: proc(backing: []byte) -> (res: Builder) { - return Builder{ buf = buffer_from_slice(backing) } -} - -@(private) -buffer_from_slice :: proc "contextless" (backing: $T/[]$E) -> [dynamic]E { - return transmute([dynamic]E)runtime.Raw_Dynamic_Array{ - data = raw_data(backing), - len = 0, - cap = len(backing), - allocator = runtime.Allocator{ - procedure = runtime.nil_allocator_proc, - data = nil, - }, - } + return Builder{ + buf = transmute([dynamic]byte)runtime.Raw_Dynamic_Array{ + data = raw_data(backing), + len = 0, + cap = len(backing), + allocator = runtime.Allocator{ + procedure = runtime.nil_allocator_proc, + data = nil, + }, + }, + } } // Alias to `builder_from_bytes` From b906412f47a54bf044ee545235168952b352c118 Mon Sep 17 00:00:00 2001 From: imlodinu Date: Fri, 13 Feb 2026 15:46:28 +0800 Subject: [PATCH 465/766] use xar.len instead of len for accessing length of items --- core/container/handle_map/dynamic_handle_map.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/container/handle_map/dynamic_handle_map.odin b/core/container/handle_map/dynamic_handle_map.odin index 72273873b..053bbdc43 100644 --- a/core/container/handle_map/dynamic_handle_map.odin +++ b/core/container/handle_map/dynamic_handle_map.odin @@ -49,7 +49,7 @@ dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc := } _ = xar.append(&m.items, item, loc) or_return - i := len(m.items)-1 + i := xar.len(m.items)-1 ptr := xar.get_ptr_unsafe(&m.items, i) ptr^ = item From f8767e58c588643fa51b4dc899a4281fcaabe0e5 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 13 Feb 2026 11:10:37 +0100 Subject: [PATCH 466/766] Fix #6267 --- core/bytes/bytes.odin | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/bytes/bytes.odin b/core/bytes/bytes.odin index 911c62d5d..bde02259c 100644 --- a/core/bytes/bytes.odin +++ b/core/bytes/bytes.odin @@ -997,16 +997,18 @@ trim_left :: proc(s: []byte, cutset: []byte) -> []byte { if s == nil || cutset == nil { return s } - state := cutset - return trim_left_proc_with_state(s, is_in_cutset, &state) + begin := 0; end := len(s) + for ; begin < end && index_byte(cutset, s[begin]) >= 0; begin += 1 {} + return s[begin:] } trim_right :: proc(s: []byte, cutset: []byte) -> []byte { if s == nil || cutset == nil { return s } - state := cutset - return trim_right_proc_with_state(s, is_in_cutset, &state) + begin := 0; end := len(s) + for ; end > begin && index_byte(cutset, s[end - 1]) >= 0; end -= 1 {} + return s[:end] } trim :: proc(s: []byte, cutset: []byte) -> []byte { From faca11d5938c810fc6d448e9b89b47f48577b088 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 13 Feb 2026 12:36:15 +0100 Subject: [PATCH 467/766] Fix `os.stem`, `os.short_stem`. --- core/os/path.odin | 24 ++++++++----------- .../path/filepath/test_core_filepath.odin | 23 ++++++++++++++++++ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/core/os/path.odin b/core/os/path.odin index 3c22852bf..d3525b504 100644 --- a/core/os/path.odin +++ b/core/os/path.odin @@ -382,25 +382,21 @@ Returns an empty string if there is no stem. e.g: '.gitignore'. Returns an empty string if there's a trailing path separator. */ stem :: proc(path: string) -> string { - if len(path) > 0 { - if is_path_separator(path[len(path) - 1]) { - // NOTE(tetra): Trailing separator - return "" - } else if path[0] == '.' { - return "" - } + // If the last character is a path separator, there is no file. + if is_path_separator(path[len(path) - 1]) { + return "" } - // NOTE(tetra): Get the basename - path := path - if i := strings.last_index_any(path, Path_Separator_Chars); i != -1 { - path = path[i+1:] + // Get the base path. + p := base(path) + if i := strings.last_index_any(p, Path_Separator_Chars); i != -1 { + p = p[i+1:] } - if i := strings.last_index_byte(path, '.'); i != -1 { - return path[:i] + if i := strings.last_index_byte(p, '.'); i != -1 { + return p[:i] } - return path + return p } /* diff --git a/tests/core/path/filepath/test_core_filepath.odin b/tests/core/path/filepath/test_core_filepath.odin index a0de7e831..688259e9c 100644 --- a/tests/core/path/filepath/test_core_filepath.odin +++ b/tests/core/path/filepath/test_core_filepath.odin @@ -109,4 +109,27 @@ delete_split :: proc(s: []string) { delete(part) } delete(s) +} + +@(test) +test_stem :: proc(t: ^testing.T) { + @static stem := [][2]string{ + {"builder.tar.gz", "builder.tar"}, + {"./builder.tar.gz", "builder.tar"}, + {"./builder/", ""}, + } + + @static short_stem := [][2]string{ + {"builder.tar", "builder"}, + {"./builder.tar", "builder"}, + {"./builder/", ""}, + } + + for d in stem { + testing.expect_value(t, filepath.stem(d[0]), d[1]) + } + + for d in short_stem { + testing.expect_value(t, filepath.stem(d[0]), d[1]) + } } \ No newline at end of file From 57653dd363859048d0004b9e69293727394782b8 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 13 Feb 2026 12:37:55 +0100 Subject: [PATCH 468/766] short_stem --- tests/core/path/filepath/test_core_filepath.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/path/filepath/test_core_filepath.odin b/tests/core/path/filepath/test_core_filepath.odin index 688259e9c..9ca1b676f 100644 --- a/tests/core/path/filepath/test_core_filepath.odin +++ b/tests/core/path/filepath/test_core_filepath.odin @@ -130,6 +130,6 @@ test_stem :: proc(t: ^testing.T) { } for d in short_stem { - testing.expect_value(t, filepath.stem(d[0]), d[1]) + testing.expect_value(t, filepath.short_stem(d[0]), d[1]) } } \ No newline at end of file From 6386b395de7e0e537e092601ff0ac4d353806ebb Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 13 Feb 2026 15:15:03 +0100 Subject: [PATCH 469/766] Add `-did-you-mean-limit:N` ``` -did-you-mean-limit: Sets the maximum number of suggestions the compiler provides. Must be an integer >0. If not set, the default limit is 10. ``` e.g. with a limit of 5 ``` W:/Scratch/main.odin(44:7) Error: Undeclared name 'B1' for type 'E' e = .B1 ^^ Suggestion: Did you mean? A23 A02 A19 A20 A21 ... and 25 more ... ``` --- src/build_settings.cpp | 3 +++ src/check_expr.cpp | 6 ++++++ src/main.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 40c1c86c4..f46b7d247 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -9,6 +9,7 @@ // #endif #define DEFAULT_MAX_ERROR_COLLECTOR_COUNT (36) +#define DEFAULT_DID_YOU_MEAN_LIMIT (10) enum TargetOsKind : u16 { TargetOs_Invalid, @@ -581,6 +582,8 @@ struct BuildContext { bool show_debug_messages; + int did_you_mean_limit; + bool copy_file_contents; bool no_rtti; diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 1c09ad908..f2cdcc2ea 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -153,13 +153,19 @@ gb_internal bool is_load_directive_call(Ast *call) { gb_internal LoadDirectiveResult check_load_directive(CheckerContext *c, Operand *operand, Ast *call, Type *type_hint, bool err_on_not_found); gb_internal void check_did_you_mean_print(DidYouMeanAnswers *d, char const *prefix = "") { + int limit = build_context.did_you_mean_limit; auto results = did_you_mean_results(d); + int count = 0; if (results.count != 0) { error_line("\tSuggestion: Did you mean?\n"); for (auto const &result : results) { String const &target = result.target; error_line("\t\t%s%.*s\n", prefix, LIT(target)); // error_line("\t\t%.*s %td\n", LIT(target), results[i].distance); + if (limit > 0 && ++count == limit) { + error_line("\t\t... and %td more ...", results.count - limit); + break; + } } } } diff --git a/src/main.cpp b/src/main.cpp index bba9ffe13..fdafa0cf2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -330,6 +330,7 @@ enum BuildFlagKind { BuildFlag_UseSingleModule, BuildFlag_NoThreadedChecker, BuildFlag_ShowDebugMessages, + BuildFlag_DidYouMeanLimit, BuildFlag_ShowDefineables, BuildFlag_ExportDefineables, @@ -562,6 +563,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_UseSingleModule, str_lit("use-single-module"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_NoThreadedChecker, str_lit("no-threaded-checker"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ShowDebugMessages, str_lit("show-debug-messages"), BuildFlagParam_None, Command_all); + add_flag(&build_flags, BuildFlag_DidYouMeanLimit, str_lit("did-you-mean-limit"), BuildFlagParam_Integer, Command__does_check); add_flag(&build_flags, BuildFlag_ShowDefineables, str_lit("show-defineables"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ExportDefineables, str_lit("export-defineables"), BuildFlagParam_String, Command__does_check); @@ -1305,6 +1307,20 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_ShowDebugMessages: build_context.show_debug_messages = true; break; + + case BuildFlag_DidYouMeanLimit: + { + GB_ASSERT(value.kind == ExactValue_Integer); + isize count = cast(isize)big_int_to_i64(&value.value_integer); + if (count <= 0) { + gb_printf_err("%.*s expected a positive non-zero number, got %.*s\n", LIT(name), LIT(param)); + build_context.did_you_mean_limit = DEFAULT_DID_YOU_MEAN_LIMIT; + } else { + build_context.did_you_mean_limit = (int)count; + } + } + break; + case BuildFlag_Vet: build_context.vet_flags |= VetFlag_All; break; @@ -1853,6 +1869,8 @@ gb_internal bool parse_build_flags(Array args) { bad_flags = true; } + if (build_context.did_you_mean_limit == 0) build_context.did_you_mean_limit = DEFAULT_DID_YOU_MEAN_LIMIT; + return !bad_flags; } @@ -2836,6 +2854,12 @@ gb_internal int print_show_help(String const arg0, String command, String option print_usage_line(2, "Must be an integer >0."); print_usage_line(2, "If not set, the default max error count is %d.", DEFAULT_MAX_ERROR_COLLECTOR_COUNT); } + + if (print_flag("-did-you-mean-limit:")) { + print_usage_line(2, "Sets the maximum number of suggestions the compiler provides."); + print_usage_line(2, "Must be an integer >0."); + print_usage_line(2, "If not set, the default limit is %d.", DEFAULT_DID_YOU_MEAN_LIMIT); + } } if (run_or_build) { From 6fc3a8fb2a09b4c05d4c2c3d3437c04bdcad8baf Mon Sep 17 00:00:00 2001 From: oxSleep Date: Fri, 13 Feb 2026 16:59:22 +0100 Subject: [PATCH 470/766] Use when-block for sanitizer poisoning Replace @disabled attribute with when-statement to conditionally compile address sanitizer poisoning in pool elements --- core/container/pool/pool.odin | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/core/container/pool/pool.odin b/core/container/pool/pool.odin index 55ea57d55..34a9e0683 100644 --- a/core/container/pool/pool.odin +++ b/core/container/pool/pool.odin @@ -113,28 +113,30 @@ _set_next :: proc(p: ^Pool($T), elem: ^T, next: ^T) { (^^T)(uintptr(elem) + p.link_off)^ = next } -@(disabled=.Address not_in ODIN_SANITIZER_FLAGS) _poison_elem :: proc(p: ^Pool($T), elem: ^T) { - if p.link_off > 0 { - sanitizer.address_poison_rawptr(elem, int(p.link_off)) - } + when .Address in ODIN_SANITIZER_FLAGS { + if p.link_off > 0 { + sanitizer.address_poison_rawptr(elem, int(p.link_off)) + } - len := size_of(T) - p.link_off - size_of(rawptr) - if len > 0 { - ptr := rawptr(uintptr(elem) + p.link_off + size_of(rawptr)) - sanitizer.address_poison_rawptr(ptr, int(len)) + len := size_of(T) - p.link_off - size_of(rawptr) + if len > 0 { + ptr := rawptr(uintptr(elem) + p.link_off + size_of(rawptr)) + sanitizer.address_poison_rawptr(ptr, int(len)) + } } } -@(disabled=.Address not_in ODIN_SANITIZER_FLAGS) _unpoison_elem :: proc(p: ^Pool($T), elem: ^T) { - if p.link_off > 0 { - sanitizer.address_unpoison_rawptr(elem, int(p.link_off)) - } + when .Address in ODIN_SANITIZER_FLAGS { + if p.link_off > 0 { + sanitizer.address_unpoison_rawptr(elem, int(p.link_off)) + } - len := size_of(T) - p.link_off - size_of(rawptr) - if len > 0 { - ptr := rawptr(uintptr(elem) + p.link_off + size_of(rawptr)) - sanitizer.address_unpoison_rawptr(ptr, int(len)) + len := size_of(T) - p.link_off - size_of(rawptr) + if len > 0 { + ptr := rawptr(uintptr(elem) + p.link_off + size_of(rawptr)) + sanitizer.address_unpoison_rawptr(ptr, int(len)) + } } } From d26ad6a0e51a3e02b6d0676eaafda278c39e3197 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 14 Feb 2026 00:55:21 +0100 Subject: [PATCH 471/766] Update doc line for `core:os` and `core:os/old`. --- core/os/doc.odin | 7 ++----- core/os/old/doc.odin | 2 ++ 2 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 core/os/old/doc.odin diff --git a/core/os/doc.odin b/core/os/doc.odin index effb5582c..10087a5e1 100644 --- a/core/os/doc.odin +++ b/core/os/doc.odin @@ -1,6 +1,3 @@ -// package os_old provides a platform-independent interface to operating system functionality. -// The design is UNIX-like but with Odin-like error handling. Failing calls return values with a specific error type rather than error number. -// -// The package os_old interface is intended to be uniform across all operating systems. -// Features not generally available appear in the system-specific packages under core:sys/*. +// A cross-platform API for things like `I/O`, intended to be uniform across all operating systems. +// Features not generally available appear in the system-specific packages under `core:sys`. package os diff --git a/core/os/old/doc.odin b/core/os/old/doc.odin new file mode 100644 index 000000000..525c0b96d --- /dev/null +++ b/core/os/old/doc.odin @@ -0,0 +1,2 @@ +// The original implementation of `core:os`, to be removed in Q2 2026. +package os_old \ No newline at end of file From 666c64051ab5ed7a2589efce77781893638a77c2 Mon Sep 17 00:00:00 2001 From: Ribiveer <55600063+Ribiveer@users.noreply.github.com> Date: Sat, 14 Feb 2026 02:11:05 +0100 Subject: [PATCH 472/766] Fix cross_3d in demo.odin Not a very significant or meaningful change, but it did irk me that the equation was wrong... --- examples/demo/demo.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index 294668f14..a5455846d 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -1606,7 +1606,7 @@ where_clauses :: proc() { where intrinsics.type_is_numeric(E) { x := a.y*b.z - a.z*b.y y := a.z*b.x - a.x*b.z - z := a.x*b.y - a.y*b.z + z := a.x*b.y - a.y*b.x return T{x, y, z} } From dcd93579f05e2e99c4c55ab8935716db1feafef3 Mon Sep 17 00:00:00 2001 From: blob1807 <12388588+blob1807@users.noreply.github.com> Date: Sat, 14 Feb 2026 20:31:51 +1000 Subject: [PATCH 473/766] Add more Windows endpoints --- core/sys/windows/kernel32.odin | 1 + core/sys/windows/ole32.odin | 2 +- core/sys/windows/shell32.odin | 2 ++ core/sys/windows/types.odin | 1 + core/sys/windows/user32.odin | 34 ++++++++++++++++++++++++++++------ 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 7d4ba76e0..670484489 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -470,6 +470,7 @@ foreign kernel32 { GlobalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID --- GlobalReAlloc :: proc(mem: LPVOID, bytes: SIZE_T, flags: UINT) -> LPVOID --- GlobalFree :: proc(mem: LPVOID) -> LPVOID --- + GlobalSize :: proc(Mem: LPVOID) -> SIZE_T --- GlobalLock :: proc(hMem: HGLOBAL) -> LPVOID --- GlobalUnlock :: proc(hMem: HGLOBAL) -> BOOL --- diff --git a/core/sys/windows/ole32.odin b/core/sys/windows/ole32.odin index 12cf40b81..d314eb343 100644 --- a/core/sys/windows/ole32.odin +++ b/core/sys/windows/ole32.odin @@ -1,6 +1,6 @@ package sys_windows -foreign import "system:Ole32.lib" +foreign import Ole32 "system:Ole32.lib" //objbase.h // Note(Dragos): https://learn.microsoft.com/en-us/windows/win32/api/objbase/ne-objbase-coinit makes you believe that MULTITHREADED == 3. That is wrong. See definition of objbase.h diff --git a/core/sys/windows/shell32.odin b/core/sys/windows/shell32.odin index c7d83f9f6..1a0844b39 100644 --- a/core/sys/windows/shell32.odin +++ b/core/sys/windows/shell32.odin @@ -31,6 +31,8 @@ foreign shell32 { SHSetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, pszPath: PCWSTR ) -> HRESULT --- SHGetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, ppszPath: ^LPWSTR) -> HRESULT --- + SHCreateItemFromParsingName :: proc(pszPath: PCWSTR, pbc: ^IBindCtx, riid: REFIID, ppv: ^rawptr) -> HRESULT --- + ExtractIconExW :: proc(pszFile: LPCWSTR, nIconIndex: INT, phiconLarge: ^HICON, phiconSmall: ^HICON, nIcons: UINT) -> UINT --- DragAcceptFiles :: proc(hWnd: HWND, fAccept: BOOL) --- DragQueryPoint :: proc(hDrop: HDROP, ppt: ^POINT) -> BOOL --- diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 06156c912..b5621f621 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -4279,6 +4279,7 @@ CLSID_FileOpenDialog := &GUID{0xDC1C5A9C, 0xE88A, 0x4DDE, {0xA5, 0xA1, 0x60, 0xF CLSID_FileSaveDialog := &GUID{0xC0B4E2F3, 0xBA21, 0x4773, {0x8D, 0xBA, 0x33, 0x5E, 0xC9, 0x46, 0xEB, 0x8B}} CLSID_TaskbarList := &GUID{0x56FDF344, 0xFD6D, 0x11d0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}} +IID_IShellItem := &GUID{0x43826d1e, 0xe718, 0x42ee, {0xbc, 0x55, 0xa1, 0xe2, 0x61, 0xc3, 0x7b, 0xfe}} IID_IFileDialog := &GUID{0x42F85136, 0xDB7E, 0x439C, {0x85, 0xF1, 0xE4, 0x07, 0x5D, 0x13, 0x5F, 0xC8}} IID_IFileSaveDialog := &GUID{0x84BCCD23, 0x5FDE, 0x4CDB, {0xAE, 0xA4, 0xAF, 0x64, 0xB8, 0x3D, 0x78, 0xAB}} IID_IFileOpenDialog := &GUID{0xD57C7288, 0xD4AD, 0x4768, {0xBE, 0x02, 0x9D, 0x96, 0x95, 0x32, 0xD9, 0x60}} diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index e2ed1726b..ede920004 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -318,12 +318,26 @@ foreign user32 { GetProcessWindowStation :: proc() -> HWINSTA --- GetUserObjectInformationW :: proc(hObj: HANDLE, nIndex: GetUserObjectInformationFlags, pvInfo: PVOID, nLength: DWORD, lpnLengthNeeded: LPDWORD) -> BOOL --- - OpenClipboard :: proc(hWndNewOwner: HWND) -> BOOL --- - CloseClipboard :: proc() -> BOOL --- - GetClipboardData :: proc(uFormat: UINT) -> HANDLE --- - SetClipboardData :: proc(uFormat: UINT, hMem: HANDLE) -> HANDLE --- - IsClipboardFormatAvailable :: proc(format: UINT) -> BOOL --- - EmptyClipboard :: proc() -> BOOL --- + OpenClipboard :: proc(hWndNewOwner: HWND) -> BOOL --- + CloseClipboard :: proc() -> BOOL --- + GetClipboardData :: proc(uFormat: UINT) -> HANDLE --- + SetClipboardData :: proc(uFormat: UINT, hMem: HANDLE) -> HANDLE --- + IsClipboardFormatAvailable :: proc(format: UINT) -> BOOL --- + EmptyClipboard :: proc() -> BOOL --- + AddClipboardFormatListener :: proc(hwnd: HWND) -> BOOL --- + ChangeClipboardChain :: proc(hWndRemove: HWND, hWndNewNext: HWND) -> BOOL --- + CountClipboardFormats :: proc() -> c_int --- + EnumClipboardFormats :: proc(format: UINT) -> UINT --- + GetClipboardFormatNameW :: proc(format: UINT, lpszFormatName: LPWSTR, cchMaxCount: c_int) -> c_int --- + GetClipboardOwner :: proc() -> HWND--- + GetClipboardSequenceNumber :: proc() -> DWORD --- + GetClipboardViewer :: proc() -> HWND --- + GetOpenClipboardWindow :: proc() -> HWND --- + GetPriorityClipboardFormat :: proc(paFormatPriorityList: ^UINT, cFormats: c_int) -> c_int --- + GetUpdatedClipboardFormats :: proc(lpuiFormats: ^UINT, cFormats: UINT, pcFormatsOut: ^UINT) -> BOOL --- + RegisterClipboardFormatW :: proc(lpszFormat: LPCWSTR ) -> UINT --- + RemoveClipboardFormatListener :: proc(hwnd: HWND) -> BOOL --- + SetClipboardViewer :: proc(hWndNewViewer: HWND) -> HWND --- SetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO, redraw: BOOL) -> c_int --- GetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO) -> BOOL --- @@ -962,3 +976,11 @@ GW_OWNER :: 4 GW_CHILD :: 5 GW_ENABLEDPOPUP :: 6 GW_MAX :: 6 + +COPYDATASTRUCT :: struct { + dwData: ULONG_PTR, + cbData: DWORD, + lpData: PVOID, +} + +PCOPYDATASTRUCT :: ^COPYDATASTRUCT From 1af1beb248fe8796023f77c1a4b4a326e772ea5c Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 14 Feb 2026 12:52:51 +0100 Subject: [PATCH 474/766] Fix filepath.dir --- core/path/filepath/path.odin | 20 ++++--------------- .../path/filepath/test_core_filepath.odin | 19 ++++++++++++++++++ 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index a325ce4cd..e383e756c 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -250,26 +250,14 @@ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> ( then `"."` is returned. */ dir :: proc(path: string, allocator := context.allocator) -> string { - context.allocator = allocator - vol_len := len(volume_name(path)) - when ODIN_OS == .Windows { - if len(path) >= 3 && is_separator(path[2]) { - vol_len += 1 - } - } - vol := path[:vol_len] - i := len(path) - 1 - for i >= vol_len && !is_separator(path[i]) { + for i > 0 && !is_separator(path[i]) { i -= 1 } - dir, dir_err := clean(path[vol_len : i+1], allocator) + res, dir_err := clean(path[:i], allocator) + if dir_err != nil { return "" } - defer delete(dir) - if dir == "." && vol_len > 2 { - return strings.clone(vol) - } - return strings.concatenate({vol, dir}) + return res } diff --git a/tests/core/path/filepath/test_core_filepath.odin b/tests/core/path/filepath/test_core_filepath.odin index 9ca1b676f..61f87ad02 100644 --- a/tests/core/path/filepath/test_core_filepath.odin +++ b/tests/core/path/filepath/test_core_filepath.odin @@ -132,4 +132,23 @@ test_stem :: proc(t: ^testing.T) { for d in short_stem { testing.expect_value(t, filepath.short_stem(d[0]), d[1]) } +} + +@(test) +test_dir :: proc(t: ^testing.T) { + when ODIN_OS == .Windows { + @static dirs := [][2]string{ + {"../bin/css", "..\\bin"}, + {"W:/Odin/odin", "W:\\Odin"}, + } + } else { + @static dirs := [][2]string{ + {"../bin/css", "../bin"}, + {"/bin/usr/", "/bin/usr"}, + } + } + + for d in dirs { + testing.expect_value(t, filepath.dir(d[0], context.temp_allocator), d[1]) + } } \ No newline at end of file From 2da1befe0483cf3d96db5af3934c29dbc3cac42a Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 14 Feb 2026 13:11:36 +0100 Subject: [PATCH 475/766] Add missing platform guards. --- core/sys/windows/ole32.odin | 1 + core/sys/windows/types.odin | 1 + 2 files changed, 2 insertions(+) diff --git a/core/sys/windows/ole32.odin b/core/sys/windows/ole32.odin index d314eb343..519304521 100644 --- a/core/sys/windows/ole32.odin +++ b/core/sys/windows/ole32.odin @@ -1,3 +1,4 @@ +#+build windows package sys_windows foreign import Ole32 "system:Ole32.lib" diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index b5621f621..70fd7e958 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -1,3 +1,4 @@ +#+build windows package sys_windows import "core:c" From 1d38b715c3aa7fc066ae3c0d1f923b61d5c4003e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 14 Feb 2026 13:14:33 +0100 Subject: [PATCH 476/766] Revert "Add missing platform guards." This reverts commit 2da1befe0483cf3d96db5af3934c29dbc3cac42a. --- core/sys/windows/ole32.odin | 1 - core/sys/windows/types.odin | 1 - 2 files changed, 2 deletions(-) diff --git a/core/sys/windows/ole32.odin b/core/sys/windows/ole32.odin index 519304521..d314eb343 100644 --- a/core/sys/windows/ole32.odin +++ b/core/sys/windows/ole32.odin @@ -1,4 +1,3 @@ -#+build windows package sys_windows foreign import Ole32 "system:Ole32.lib" diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 70fd7e958..b5621f621 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -1,4 +1,3 @@ -#+build windows package sys_windows import "core:c" From 4c9466e3ea6943911971c62dd57c59bba886cfef Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 14 Feb 2026 13:17:28 +0100 Subject: [PATCH 477/766] Add comment to ole32.odin and types.odin. --- core/sys/windows/ole32.odin | 2 ++ core/sys/windows/types.odin | 2 ++ 2 files changed, 4 insertions(+) diff --git a/core/sys/windows/ole32.odin b/core/sys/windows/ole32.odin index d314eb343..f93ecc820 100644 --- a/core/sys/windows/ole32.odin +++ b/core/sys/windows/ole32.odin @@ -1,5 +1,7 @@ package sys_windows +// Don't add a `#+build windows` guard to this file. It's used for `dxgi` on non-Windows platforms, for example. + foreign import Ole32 "system:Ole32.lib" //objbase.h diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index b5621f621..54ebd9481 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -1,5 +1,7 @@ package sys_windows +// Don't add a `#+build windows` guard to this file. It's used for `dxgi` on non-Windows platforms, for example. + import "core:c" c_char :: c.char From 2622c1ab993cdc422fee96a99beb33c73dafa1d1 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 14 Feb 2026 13:57:02 +0100 Subject: [PATCH 478/766] Fix #6229 Fixes #6229 by adding `encode_upper` and `encode_upper_into_writer`. Also updated the documentation to be more like the rest of `core`. --- core/encoding/hex/hex.odin | 126 ++++++++++++++++++++++++++++++++----- 1 file changed, 111 insertions(+), 15 deletions(-) diff --git a/core/encoding/hex/hex.odin b/core/encoding/hex/hex.odin index 318e52ace..c4726d9e9 100644 --- a/core/encoding/hex/hex.odin +++ b/core/encoding/hex/hex.odin @@ -1,35 +1,115 @@ // Encoding and decoding of hex-encoded binary, e.g. `0x23` -> `#`. package encoding_hex +import "base:runtime" import "core:io" import "core:strings" -encode :: proc(src: []byte, allocator := context.allocator, loc := #caller_location) -> []byte #no_bounds_check { - dst := make([]byte, len(src) * 2, allocator, loc) - for i, j := 0, 0; i < len(src); i += 1 { +/* +Encodes a byte slice into a lowercase hex sequence + +*Allocates Using Provided Allocator* + +Inputs: +- src: The `[]byte` to be hex-encoded +- allocator: (default: context.allocator) +- loc: The caller location for debugging purposes (default: #caller_location) + +Returns: +- res: The hex-encoded result +- err: An optional allocator error if one occured, `.None` otherwise +*/ +encode :: proc(src: []byte, allocator := context.allocator, loc := #caller_location) -> (res: []byte, err: runtime.Allocator_Error) #optional_allocator_error { + res, err = make([]byte, len(src) * 2, allocator, loc) + #no_bounds_check for i, j := 0, 0; i < len(src); i += 1 { v := src[i] - dst[j] = HEXTABLE[v>>4] - dst[j+1] = HEXTABLE[v&0x0f] + res[j] = LOWER[v>>4] + res[j+1] = LOWER[v&0x0f] j += 2 } - - return dst + return } -encode_into_writer :: proc(dst: io.Writer, src: []byte) -> io.Error { +/* +Encodes a byte slice as a lowercase hex sequence into an `io.Writer` + +Inputs: +- dst: The `io.Writer` to encode into +- src: The `[]byte` to be hex-encoded + +Returns: +- err: An `io.Error` if one occured, `.None` otherwise +*/ +encode_into_writer :: proc(dst: io.Writer, src: []byte) -> (err: io.Error) { for v in src { - io.write(dst, {HEXTABLE[v>>4], HEXTABLE[v&0x0f]}) or_return + io.write(dst, {LOWER[v>>4], LOWER[v&0x0f]}) or_return } - return nil + return } -decode :: proc(src: []byte, allocator := context.allocator, loc := #caller_location) -> (dst: []byte, ok: bool) #no_bounds_check { +/* +Encodes a byte slice into an uppercase hex sequence + +*Allocates Using Provided Allocator* + +Inputs: +- src: The `[]byte` to be hex-encoded +- allocator: (default: context.allocator) +- loc: The caller location for debugging purposes (default: #caller_location) + +Returns: +- res: The hex-encoded result +- err: An optional allocator error if one occured, `.None` otherwise +*/ +encode_upper :: proc(src: []byte, allocator := context.allocator, loc := #caller_location) -> (res: []byte, err: runtime.Allocator_Error) #optional_allocator_error { + res, err = make([]byte, len(src) * 2, allocator, loc) + #no_bounds_check for i, j := 0, 0; i < len(src); i += 1 { + v := src[i] + res[j] = UPPER[v>>4] + res[j+1] = UPPER[v&0x0f] + j += 2 + } + return +} + +/* +Encodes a byte slice as an uppercase hex sequence into an `io.Writer` + +Inputs: +- dst: The `io.Writer` to encode into +- src: The `[]byte` to be hex-encoded + +Returns: +- err: An `io.Error` if one occured, `.None` otherwise +*/ +encode_upper_into_writer :: proc(dst: io.Writer, src: []byte) -> (err: io.Error) { + for v in src { + io.write(dst, {UPPER[v>>4], UPPER[v&0x0f]}) or_return + } + return +} + +/* +Decodes a hex sequence into a byte slice + +*Allocates Using Provided Allocator* + +Inputs: +- dst: The hex sequence decoded into bytes +- src: The `[]byte` to be hex-decoded +- allocator: (default: context.allocator) +- loc: The caller location for debugging purposes (default: #caller_location) + +Returns: +- ok: A bool, `true` if decoding succeeded, `false` otherwise +*/ +decode :: proc(src: []byte, allocator := context.allocator, loc := #caller_location) -> (dst: []byte, ok: bool) { if len(src) % 2 == 1 { return } dst = make([]byte, len(src) / 2, allocator, loc) - for i, j := 0, 1; j < len(src); j += 2 { + #no_bounds_check for i, j := 0, 1; j < len(src); j += 2 { p := src[j-1] q := src[j] @@ -43,8 +123,16 @@ decode :: proc(src: []byte, allocator := context.allocator, loc := #caller_locat return dst, true } -// Decodes the given sequence into one byte. -// Should be called with one byte worth of the source, eg: 0x23 -> '#'. +/* +Decodes the first byte in a hex sequence to a byte + +Inputs: +- str: A hex-encoded `string`, e.g. `"0x23"` + +Returns: +- res: The decoded byte, e.g. `'#'` +- ok: A bool, `true` if decoding succeeded, `false` otherwise +*/ decode_sequence :: proc(str: string) -> (res: byte, ok: bool) { str := str if strings.has_prefix(str, "0x") || strings.has_prefix(str, "0X") { @@ -62,13 +150,21 @@ decode_sequence :: proc(str: string) -> (res: byte, ok: bool) { } @(private) -HEXTABLE := [16]byte { +LOWER := [16]byte { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', } +@(private) +UPPER := [16]byte { + '0', '1', '2', '3', + '4', '5', '6', '7', + '8', '9', 'A', 'B', + 'C', 'D', 'E', 'F', +} + @(private) hex_digit :: proc(char: byte) -> (u8, bool) { switch char { From 4fce910973c2557e1a148e2a57ef94ce4882c27e Mon Sep 17 00:00:00 2001 From: tpat7187 Date: Sat, 14 Feb 2026 15:51:03 +0000 Subject: [PATCH 479/766] Minor Spelling mistake in Using error line --- src/check_stmt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index bae95b7c7..8f17e66c4 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -2965,7 +2965,7 @@ gb_internal void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) if ((feature_flags & OptInFeatureFlag_UsingStmt) == 0) { ERROR_BLOCK(); error(node, "'using' has been disallowed as it is considered bad practice to use as a statement outside of immediate refactoring"); - error_line("\tIt you do require it for refactoring purposes or legacy code, it can be enabled on a per-file basis with '#+feature using-stmt'\n"); + error_line("\tIf you do require it for refactoring purposes or legacy code, it can be enabled on a per-file basis with '#+feature using-stmt'\n"); } for (Ast *expr : us->list) { From 9d439bd630113fd4064ecb88b379b28549066bf0 Mon Sep 17 00:00:00 2001 From: ske Date: Sat, 14 Feb 2026 16:23:51 -0300 Subject: [PATCH 480/766] Add broadcasting to strings (fix #1837) --- src/llvm_backend_const.cpp | 72 ++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 57c07f5c9..9f2052960 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -678,6 +678,22 @@ LLVMValueRef llvm_const_pad_to_size(lbModule *m, LLVMValueRef val, LLVMTypeRef d } #endif +gb_internal void lb_const_array_spread(lbModule *m, lbConstContext cc, Type *array, ExactValue value, lbValue *res) { + GB_ASSERT(array->kind == Type_Array); + + i64 count = array->Array.count; + Type *elem = array->Array.elem; + + lbValue single_elem = lb_const_value(m, elem, value, cc); + + LLVMValueRef *elems = gb_alloc_array(permanent_allocator(), LLVMValueRef, cast(isize)count); + for (i64 i = 0; i < count; i++) { + elems[i] = single_elem.value; + } + + res->value = llvm_const_array(m, lb_type(m, elem), elems, cast(unsigned)count); +} + gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lbConstContext cc, Type *value_type) { if (cc.allow_local) { cc.is_rodata = false; @@ -967,34 +983,29 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb } - } else if (is_type_array(type) && value.kind == ExactValue_String && !is_type_u8(core_array_type(type))) { - if (is_type_rune_array(type)) { - i64 count = type->Array.count; - Type *elem = type->Array.elem; - LLVMTypeRef et = lb_type(m, elem); + } else if (is_type_rune_array(type) && value.kind == ExactValue_String && !is_type_u8(core_array_type(type))) { + i64 count = type->Array.count; + Type *elem = type->Array.elem; + LLVMTypeRef et = lb_type(m, elem); - Rune rune; - isize offset = 0; - isize width = 1; - String s = value.value_string; + Rune rune; + isize offset = 0; + isize width = 1; + String s = value.value_string; - LLVMValueRef *elems = gb_alloc_array(permanent_allocator(), LLVMValueRef, cast(isize)count); + LLVMValueRef *elems = gb_alloc_array(permanent_allocator(), LLVMValueRef, cast(isize)count); - for (i64 i = 0; i < count && offset < s.len; i++) { - width = utf8_decode(s.text+offset, s.len-offset, &rune); - offset += width; + for (i64 i = 0; i < count && offset < s.len; i++) { + width = utf8_decode(s.text+offset, s.len-offset, &rune); + offset += width; - elems[i] = LLVMConstInt(et, rune, true); + elems[i] = LLVMConstInt(et, rune, true); - } - GB_ASSERT(offset == s.len); - - res.value = llvm_const_array(m, et, elems, cast(unsigned)count); - return res; } - // NOTE(bill, 2021-10-07): Allow for array programming value constants - Type *core_elem = core_array_type(type); - return lb_const_value(m, core_elem, value, cc); + GB_ASSERT(offset == s.len); + + res.value = llvm_const_array(m, et, elems, cast(unsigned)count); + return res; } else if (is_type_u8_array(type) && value.kind == ExactValue_String) { GB_ASSERT(type->Array.count == value.value_string.len); LLVMValueRef data = LLVMConstStringInContext(ctx, @@ -1005,21 +1016,9 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb return res; } else if (is_type_array(type) && value.kind != ExactValue_Invalid && - value.kind != ExactValue_String && value.kind != ExactValue_Compound) { - - i64 count = type->Array.count; - Type *elem = type->Array.elem; - - - lbValue single_elem = lb_const_value(m, elem, value, cc); - - LLVMValueRef *elems = gb_alloc_array(permanent_allocator(), LLVMValueRef, cast(isize)count); - for (i64 i = 0; i < count; i++) { - elems[i] = single_elem.value; - } - - res.value = llvm_const_array(m, lb_type(m, elem), elems, cast(unsigned)count); + + lb_const_array_spread(m, cc, type, value, &res); return res; } else if (is_type_matrix(type) && value.kind != ExactValue_Invalid && @@ -2009,4 +2008,3 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb return lb_const_nil(m, original_type); } - From 3d9441c394f70091051ab8362e96300d4fcc1e20 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Sat, 14 Feb 2026 14:52:21 -0500 Subject: [PATCH 481/766] Update the comment on core:bytes.compare() to match the proc signature --- core/bytes/bytes.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/bytes/bytes.odin b/core/bytes/bytes.odin index bde02259c..08dcd6113 100644 --- a/core/bytes/bytes.odin +++ b/core/bytes/bytes.odin @@ -67,8 +67,8 @@ truncate_to_rune :: proc(str: []byte, r: rune) -> []byte { return str[:n] } -// Compares two strings, returning a value representing which one comes first lexiographically. -// -1 for `a`; 1 for `b`, or 0 if they are equal. +// Compares two []byte, returning a value representing which one comes first lexiographically. +// Returns: -1 for `lhs`, 1 for `rhs`, or 0 if they are equal. compare :: proc(lhs, rhs: []byte) -> int { res := runtime.memory_compare(raw_data(lhs), raw_data(rhs), min(len(lhs), len(rhs))) if res == 0 && len(lhs) != len(rhs) { From 95c82e0f76c3166cb7ac1156d451ef7fdbb47943 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 15 Feb 2026 12:42:55 +0100 Subject: [PATCH 482/766] Fix #6279 If the replacement rune was multi-byte, `os.replace_path_separators` would silently fail to replace anything. Now it properly handles non-ASCII separator. Additionally added a fast path for when all runes in the input path as well as the replacement separator are simple ASCII. Test added. --- core/os/path.odin | 39 ++++++++++++++++++++++++++++----------- tests/core/os/path.odin | 11 +++++++++++ 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/core/os/path.odin b/core/os/path.odin index d3525b504..7ee95c1c2 100644 --- a/core/os/path.odin +++ b/core/os/path.odin @@ -29,22 +29,39 @@ with the `new_sep` rune. *Allocates Using Provided Allocator* */ replace_path_separators :: proc(path: string, new_sep: rune, allocator: runtime.Allocator) -> (new_path: string, err: Error) { - buf := make([]u8, len(path), allocator) or_return + length := len(path) + rep_b, rep_w := utf8.encode_rune(new_sep) + + byte_oriented := rep_w == 1 - i: int for r in path { - replacement := r if r == '/' || r == '\\' { - replacement = new_sep + length += rep_w - 1 } + if r > rune(0x7f) { + byte_oriented = false + } + } - if replacement <= rune(0x7F) { - buf[i] = u8(replacement) - i += 1 - } else { - b, w := utf8.encode_rune(r) - copy(buf[i:], b[:w]) - i += w + buf := make([]u8, length, allocator) or_return + + if byte_oriented { + // Neither replacement rune or any other rune in the path takes up more than 1 byte + str := transmute([]byte)path + #no_bounds_check for b, i in str { + buf[i] = u8(new_sep) if b == '/' || b == '\\' else b + } + } else { + i: int + for r in path { + if r == '/' || r == '\\' { + copy(buf[i:], rep_b[:rep_w]) + i += rep_w + } else { + r_b, r_w := utf8.encode_rune(r) + copy(buf[i:], r_b[:r_w]) + i += r_w + } } } return string(buf), nil diff --git a/tests/core/os/path.odin b/tests/core/os/path.odin index cdfaed56f..19fe15049 100644 --- a/tests/core/os/path.odin +++ b/tests/core/os/path.odin @@ -99,6 +99,17 @@ test_clean_path :: proc(t: ^testing.T) { } } +@(test) +replace_path_separators :: proc(t: ^testing.T) { + P :: "W:/Odin/core/os/path.odin" + + p1, _ := os.replace_path_separators(P, '😀', context.temp_allocator) + testing.expect_value(t, p1, "W:😀Odin😀core😀os😀path.odin") + + p2, _ := os.replace_path_separators(P, '|', context.temp_allocator) + testing.expect_value(t, p2, "W:|Odin|core|os|path.odin") +} + @(test) test_is_absolute_path :: proc(t: ^testing.T) { when ODIN_OS == .Windows { From c66059dd0385babc346a9a3c5797284a8ecf9871 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 15 Feb 2026 13:00:34 +0100 Subject: [PATCH 483/766] One more test, unicode path elements --- tests/core/os/path.odin | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/tests/core/os/path.odin b/tests/core/os/path.odin index 19fe15049..3a7611757 100644 --- a/tests/core/os/path.odin +++ b/tests/core/os/path.odin @@ -101,13 +101,22 @@ test_clean_path :: proc(t: ^testing.T) { @(test) replace_path_separators :: proc(t: ^testing.T) { - P :: "W:/Odin/core/os/path.odin" + { + P :: "W:/Odin/core/os/path.odin" - p1, _ := os.replace_path_separators(P, '😀', context.temp_allocator) - testing.expect_value(t, p1, "W:😀Odin😀core😀os😀path.odin") + p1, _ := os.replace_path_separators(P, '😀', context.temp_allocator) + testing.expect_value(t, p1, "W:😀Odin😀core😀os😀path.odin") - p2, _ := os.replace_path_separators(P, '|', context.temp_allocator) - testing.expect_value(t, p2, "W:|Odin|core|os|path.odin") + p2, _ := os.replace_path_separators(P, '|', context.temp_allocator) + testing.expect_value(t, p2, "W:|Odin|core|os|path.odin") + } + + { + P :: "W:/恥知らずなフクロウ/path.odin" + + p1, _ := os.replace_path_separators(P, '😀', context.temp_allocator) + testing.expect_value(t, p1, "W:😀恥知らずなフクロウ😀path.odin") + } } @(test) From 03a8526cf0258f89bfcec970c4827412626b49f1 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 15 Feb 2026 14:54:31 +0100 Subject: [PATCH 484/766] Add tests Add tests for `core:container/xar` and `core:container/handle_map` (static + dynamic). --- core/container/small_array/small_array.odin | 10 +- .../core/container/test_core_handle_map.odin | 141 ++++++++++++++++++ .../{queue.odin => test_core_queue.odin} | 0 tests/core/container/test_core_xar.odin | 39 +++++ 4 files changed, 185 insertions(+), 5 deletions(-) create mode 100644 tests/core/container/test_core_handle_map.odin rename tests/core/container/{queue.odin => test_core_queue.odin} (100%) create mode 100644 tests/core/container/test_core_xar.odin diff --git a/core/container/small_array/small_array.odin b/core/container/small_array/small_array.odin index b1674566d..8498da852 100644 --- a/core/container/small_array/small_array.odin +++ b/core/container/small_array/small_array.odin @@ -386,7 +386,7 @@ Attempts to add the given element at the beginning. This operation assumes that the small-array is not empty. Note: Performing this operation will cause pointers obtained -through get_ptr(_save) to reference incorrect elements. +through get_ptr(_safe) to reference incorrect elements. **Inputs** - `a`: A pointer to the small-array @@ -466,7 +466,7 @@ Removes and returns the first element of the small-array. This operation assumes that the small-array is not empty. Note: Performing this operation will cause pointers obtained -through get_ptr(_save) to reference incorrect elements. +through get_ptr(_safe) to reference incorrect elements. **Inputs** - `a`: A pointer to the small-array @@ -542,7 +542,7 @@ Attempts to remove and return the first element of the small array. Unlike `pop_front`, it does not assume that the array is non-empty. Note: Performing this operation will cause pointers obtained -through get_ptr(_save) to reference incorrect elements. +through get_ptr(_safe) to reference incorrect elements. **Inputs** - `a`: A pointer to the small-array @@ -616,7 +616,7 @@ consume :: proc "odin" (a: ^$A/Small_Array($N, $T), count: int, loc := #caller_l Removes the element at the specified index while retaining order. Note: Performing this operation will cause pointers obtained -through get_ptr(_save) to reference incorrect elements. +through get_ptr(_safe) to reference incorrect elements. **Inputs** - `a`: A pointer to the small-array @@ -754,7 +754,7 @@ push_back_elems :: proc "contextless" (a: ^$A/Small_Array($N, $T), items: ..T) - Tries to insert an element at the specified position. Note: Performing this operation will cause pointers obtained -through get_ptr(_save) to reference incorrect elements. +through get_ptr(_safe) to reference incorrect elements. **Inputs** - `a`: A pointer to the small-array diff --git a/tests/core/container/test_core_handle_map.odin b/tests/core/container/test_core_handle_map.odin new file mode 100644 index 000000000..1753ee91b --- /dev/null +++ b/tests/core/container/test_core_handle_map.odin @@ -0,0 +1,141 @@ +package test_core_container + +import hm "core:container/handle_map" +import "core:container/xar" +import "core:testing" + +Item :: struct { + v: int, + p: ^Item, + handle: hm.Handle32, + my_idx: u16, +} + +@test +test_dynamic_handle_map :: proc(t: ^testing.T) { + dhm: hm.Dynamic_Handle_Map(Item, hm.Handle32) + hm.dynamic_init(&dhm, context.allocator) + defer hm.dynamic_destroy(&dhm) + + items: [dynamic]Item + defer delete(items) + + N :: 512 + for i in 1..=N { + h, add_err := hm.dynamic_add(&dhm, Item{v = i * 10 + 1}) + assert(add_err == nil) + + item := hm.dynamic_get(&dhm, h) + item.handle = h + item.p = item + item.my_idx = h.idx + + append(&items, item^) + } + + testing.expect(t, hm.dynamic_len(dhm) == N) + testing.expect(t, hm.dynamic_cap(dhm) >= N) + + for v in items { + item := hm.dynamic_get(&dhm, v.handle) + assert(item^ == v) + + // Remove half of the items + if item.handle.idx & 1 == 0 { + found, found_err := hm.dynamic_remove(&dhm, v.handle) + assert(found && found_err == nil) + + // These removed handles should no longer be valid + assert(!hm.dynamic_is_valid(&dhm, v.handle)) + } else { + // Non-removed handles should still be valid + assert(hm.dynamic_is_valid(&dhm, v.handle)) + } + } + + testing.expect(t, hm.dynamic_len(dhm) == N / 2) + testing.expect(t, hm.dynamic_cap(dhm) >= N / 2) + testing.expect(t, xar.len(dhm.unused_items) == N / 2) + + it := hm.dynamic_iterator_make(&dhm) + for v, handle in hm.iterate(&it) { + assert(v.handle.idx & 1 == 1) + assert(hm.dynamic_is_valid(&dhm, handle)) + + item := hm.dynamic_get(&dhm, handle) + assert(item.my_idx == v.handle.idx) + } + + for i in 1..=N / 2 { + h, add_err := hm.dynamic_add(&dhm, Item{v = i * 10 + 1}) + assert(add_err == nil) + assert(h.gen == 2) + } + + hm.dynamic_clear(&dhm) + testing.expect(t, hm.dynamic_len(dhm) == 0) + testing.expect(t, hm.dynamic_cap(dhm) >= N) +} + +test_static_handle_map :: proc(t: ^testing.T) { + N :: 512 + + shm: hm.Static_Handle_Map(N, Item, hm.Handle32) + + items: [dynamic]Item + defer delete(items) + + + for i in 1..=N { + h, add_ok := hm.static_add(&shm, Item{v = i * 10 + 1}) + assert(add_ok) + + item := hm.static_get(&shm, h) + item.handle = h + item.p = item + item.my_idx = h.idx + + append(&items, item^) + } + + testing.expect(t, hm.static_len(shm) == N) + testing.expect(t, hm.static_cap(shm) >= N) + + for v in items { + item := hm.static_get(&shm, v.handle) + assert(item^ == v) + + // Remove half of the items + if item.handle.idx & 1 == 0 { + assert(hm.static_remove(&shm, v.handle)) + + // These removed handles should no longer be valid + assert(!hm.static_is_valid(shm, v.handle)) + } else { + // Non-removed handles should still be valid + assert(hm.static_is_valid(shm, v.handle)) + } + } + + testing.expect(t, hm.static_len(shm) == N / 2) + testing.expect(t, hm.static_cap(shm) >= N / 2) + + it := hm.static_iterator_make(&shm) + for v, handle in hm.iterate(&it) { + assert(v.handle.idx & 1 == 1) + assert(hm.static_is_valid(shm, handle)) + + item := hm.static_get(&shm, handle) + assert(item.my_idx == v.handle.idx) + } + + for i in 1..=N / 2 { + h, add_ok := hm.static_add(&shm, Item{v = i * 10 + 1}) + assert(add_ok) + assert(h.gen == 2) + } + + hm.static_clear(&shm) + testing.expect(t, hm.static_len(shm) == 0) + testing.expect(t, hm.static_cap(shm) == N) +} \ No newline at end of file diff --git a/tests/core/container/queue.odin b/tests/core/container/test_core_queue.odin similarity index 100% rename from tests/core/container/queue.odin rename to tests/core/container/test_core_queue.odin diff --git a/tests/core/container/test_core_xar.odin b/tests/core/container/test_core_xar.odin new file mode 100644 index 000000000..a58b369df --- /dev/null +++ b/tests/core/container/test_core_xar.odin @@ -0,0 +1,39 @@ +package test_core_container + +import "core:container/xar" +import "core:testing" + +Value :: struct { + v: int, + p: ^int, +} + +@test +test_xar_pointer_stability :: proc(t: ^testing.T) { + x: xar.Array(int, 4) + defer xar.destroy(&x) + + values: [dynamic]Value + defer delete(values) + + N :: 512 + for i in 1..=N { + v := i * 10 + 1 + xar.push_back(&x, v) + ptr := xar.get_ptr(&x, i - 1) + append(&values, Value{v = v, p = ptr}) + } + + assert(xar.len(x) == N) + assert(xar.cap(x) >= N) + + for value, i in values { + ptr := xar.get_ptr(&x, i) + assert(ptr == value.p) + assert(ptr^ == value.v) + } + + xar.clear(&x) + assert(xar.len(x) == 0) + assert(xar.cap(x) >= N) +} \ No newline at end of file From c1df42d991cae038f942b1aad9ae3bcb5a2e6982 Mon Sep 17 00:00:00 2001 From: DuchGhast Date: Sun, 15 Feb 2026 14:49:50 +0000 Subject: [PATCH 485/766] Fix utf8 validation --- core/unicode/utf8/utf8.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/unicode/utf8/utf8.odin b/core/unicode/utf8/utf8.odin index 78cefa8b4..0b48a0cd8 100644 --- a/core/unicode/utf8/utf8.odin +++ b/core/unicode/utf8/utf8.odin @@ -314,7 +314,7 @@ valid_string :: proc "contextless" (s: string) -> bool { return false } else if size == 3 { // Okay - } else if d := s[i+3]; b < 0x80 || 0xbf < d { + } else if d := s[i+3]; d < 0x80 || 0xbf < d { return false } i += size From a84179de1fdf9674bd25a9cebb672bf190d4bade Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Sun, 15 Feb 2026 16:37:14 +0100 Subject: [PATCH 486/766] Do not allow duplicate #partial directives on switch statement --- src/parser.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index 159eb65f8..fe42739b8 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5427,9 +5427,15 @@ gb_internal Ast *parse_stmt(AstFile *f) { s = parse_stmt(f); switch (s->kind) { case Ast_SwitchStmt: + if (s->SwitchStmt.partial) { + syntax_error(token, "#partial already applied to a switch statement"); + } s->SwitchStmt.partial = true; break; case Ast_TypeSwitchStmt: + if (s->TypeSwitchStmt.partial) { + syntax_error(token, "#partial already applied to a switch statement"); + } s->TypeSwitchStmt.partial = true; break; case Ast_EmptyStmt: From 2b985e900cec3c3ca5b18cdc84f8e0e0369c00b5 Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Sun, 15 Feb 2026 16:57:32 +0100 Subject: [PATCH 487/766] Fix build errors in the sys/es package --- core/sys/es/api.odin | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/core/sys/es/api.odin b/core/sys/es/api.odin index ae1a1a8bb..42fadff1a 100644 --- a/core/sys/es/api.odin +++ b/core/sys/es/api.odin @@ -566,7 +566,7 @@ ECHO_REQUEST_MAX_LENGTH :: (48) CONNECTION_OPEN_WAIT :: (1 << 0) FILE_CONTROL_NOTIFY_MONITORS :: (1 << 0) FILE_CONTROL_FLUSH :: (1 << 1) -using StandardIcon :: enum i32 { +StandardIcon :: enum i32 { ICON_NONE, ICON_ACTION_UNAVAILABLE_SYMBOLIC, ICON_ADDRESS_BOOK_NEW, @@ -1632,7 +1632,7 @@ using StandardIcon :: enum i32 { ICON_WEATHER_STORM_TORNADO_SYMBOLIC, ICON_WEATHER_WINDY_SYMBOLIC, } -using FatalError :: enum i32 { +FatalError :: enum i32 { FATAL_ERROR_INVALID_BUFFER, FATAL_ERROR_UNKNOWN_SYSCALL, FATAL_ERROR_INVALID_MEMORY_REGION, @@ -1657,7 +1657,7 @@ using FatalError :: enum i32 { FATAL_ERROR_ABORT, FATAL_ERROR_COUNT, } -using SyscallType :: enum i32 { +SyscallType :: enum i32 { SYSCALL_ALLOCATE, SYSCALL_FREE, SYSCALL_SHARE_MEMORY, @@ -1768,7 +1768,7 @@ using SyscallType :: enum i32 { SYSCALL_DEBUG_COMMAND, SYSCALL_COUNT, } -using MessageType :: enum i32 { +MessageType :: enum i32 { MSG_WM_START = 0x1000, MSG_MOUSE_MOVED = 0x1001, MSG_WINDOW_ACTIVATED = 0x1002, @@ -1880,18 +1880,18 @@ using MessageType :: enum i32 { MSG_USER_START = 0x8000, MSG_USER_END = 0xBFFF, } -using DrawMode :: enum i32 { +DrawMode :: enum i32 { DRAW_MODE_REPEAT_FIRST = 1 , DRAW_MODE_STRECH, DRAW_MODE_REPEAT, DRAW_MODE_NONE, } -using ClipboardFormat :: enum i32 { +ClipboardFormat :: enum i32 { CLIPBOARD_FORMAT_EMPTY, CLIPBOARD_FORMAT_TEXT, CLIPBOARD_FORMAT_FILE_LIST, } -using CursorStyle :: enum i32 { +CursorStyle :: enum i32 { CURSOR_NORMAL, CURSOR_TEXT, CURSOR_RESIZE_VERTICAL, @@ -1923,30 +1923,30 @@ using CursorStyle :: enum i32 { CURSOR_BLANK, CURSOR_COUNT, } -using WindowStyle :: enum i32 { +WindowStyle :: enum i32 { WINDOW_NORMAL, WINDOW_CONTAINER, WINDOW_MENU, WINDOW_TIP, WINDOW_PLAIN, } -using FormatValueType :: enum i32 { +FormatValueType :: enum i32 { FORMAT_VALUE_INVALID, FORMAT_VALUE_STRING, FORMAT_VALUE_NUMBER, FORMAT_VALUE_TIME, } -using CheckState :: enum i32 { +CheckState :: enum i32 { CHECK_UNCHECKED = 0, CHECK_CHECKED = 1, CHECK_INDETERMINATE = 2, } -using DocumentState :: enum i32 { +DocumentState :: enum i32 { DOCUMENT_STATE_EMPTY, DOCUMENT_STATE_UNSAVED, DOCUMENT_STATE_FILE, } -using TransitionType :: enum i32 { +TransitionType :: enum i32 { TRANSITION_NONE, TRANSITION_SLIDE_UP, TRANSITION_SLIDE_DOWN, @@ -1963,7 +1963,7 @@ using TransitionType :: enum i32 { TRANSITION_FADE_IN, TRANSITION_FADE_OUT, } -using MemoryProtection :: enum i32 { +MemoryProtection :: enum i32 { MEMORY_PROTECTION_READ_ONLY, MEMORY_PROTECTION_READ_WRITE, MEMORY_PROTECTION_EXECUTABLE, @@ -2675,7 +2675,7 @@ MemoryDecommit :: #force_inline proc "c" (pointer_ : rawptr, bytes_ : int MemoryFill :: #force_inline proc "c" (from_ : rawptr, to_ : rawptr, byte_ : u8 ){ addr := 0x1000 + 86 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); ((proc "c" ( rawptr, rawptr, u8 )) (fp))(from_, to_, byte_)} MemoryMove :: #force_inline proc "c" (_start_ : rawptr, _end_ : rawptr, amount_ : int , zeroEmptySpace_ : bool){ addr := 0x1000 + 88 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); ((proc "c" ( rawptr, rawptr, int , bool)) (fp))(_start_, _end_, amount_, zeroEmptySpace_)} MemoryOpen :: #force_inline proc "c" (size_ : int , name_ : string, flags_ : u32 ) -> Handle{ addr := 0x1000 + 89 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); return ((proc "c" ( int , ^u8, int, u32 ) -> Handle) (fp))(size_, raw_data(name_), len(name_), flags_)} -MemoryReserve :: #force_inline proc "c" (size_ : int , protection_ : MemoryProtection = MEMORY_PROTECTION_READ_WRITE, commitAll_ : bool = true) -> rawptr{ addr := 0x1000 + 25 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); return ((proc "c" ( int , MemoryProtection, bool) -> rawptr) (fp))(size_, protection_, commitAll_)} +MemoryReserve :: #force_inline proc "c" (size_ : int , protection_ : MemoryProtection = .MEMORY_PROTECTION_READ_WRITE, commitAll_ : bool = true) -> rawptr{ addr := 0x1000 + 25 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); return ((proc "c" ( int , MemoryProtection, bool) -> rawptr) (fp))(size_, protection_, commitAll_)} MemoryShare :: #force_inline proc "c" (sharedMemoryRegion_ : Handle, targetProcess_ : Handle, readOnly_ : bool) -> Handle{ addr := 0x1000 + 90 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); return ((proc "c" ( Handle, Handle, bool) -> Handle) (fp))(sharedMemoryRegion_, targetProcess_, readOnly_)} MemorySumBytes :: #force_inline proc "c" (data_ : ^u8 , bytes_ : int ) -> u8 { addr := 0x1000 + 91 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); return ((proc "c" ( ^u8 , int ) -> u8 ) (fp))(data_, bytes_)} MemoryUnreserve :: #force_inline proc "c" (pointer_ : rawptr, size_ : int = 0){ addr := 0x1000 + 319 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); ((proc "c" ( rawptr, int )) (fp))(pointer_, size_)} @@ -2858,7 +2858,7 @@ WindowSetIcon :: #force_inline proc "c" (window_ : ^Window, iconID_ : u32 WindowSetTitle :: #force_inline proc "c" (window_ : ^Window, title_ : string = ""){ addr := 0x1000 + 268 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); ((proc "c" ( ^Window, ^u8, int)) (fp))(window_, raw_data(title_), len(title_))} MenuGetSource :: #force_inline proc "c" (menu_ : ^Menu) -> ^Element{ addr := 0x1000 + 269 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); return ((proc "c" ( ^Menu) -> ^Element) (fp))(menu_)} ButtonSetIcon :: #force_inline proc "c" (button_ : ^Button, iconID_ : u32 ){ addr := 0x1000 + 270 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); ((proc "c" ( ^Button, u32 )) (fp))(button_, iconID_)} -ButtonSetCheck :: #force_inline proc "c" (button_ : ^Button, checkState_ : CheckState = CHECK_CHECKED, sendUpdatedMessage_ : bool = true){ addr := 0x1000 + 271 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); ((proc "c" ( ^Button, CheckState, bool)) (fp))(button_, checkState_, sendUpdatedMessage_)} +ButtonSetCheck :: #force_inline proc "c" (button_ : ^Button, checkState_ : CheckState = .CHECK_CHECKED, sendUpdatedMessage_ : bool = true){ addr := 0x1000 + 271 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); ((proc "c" ( ^Button, CheckState, bool)) (fp))(button_, checkState_, sendUpdatedMessage_)} ButtonGetCheck :: #force_inline proc "c" (button_ : ^Button) -> CheckState{ addr := 0x1000 + 272 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); return ((proc "c" ( ^Button) -> CheckState) (fp))(button_)} ButtonOnCommand :: #force_inline proc "c" (button_ : ^Button, callback_ : CommandCallbackFunction, command_ : ^Command = nil){ addr := 0x1000 + 273 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); ((proc "c" ( ^Button, CommandCallbackFunction, ^Command)) (fp))(button_, callback_, command_)} ButtonSetCheckBuddy :: #force_inline proc "c" (button_ : ^Button, checkBuddy_ : ^Element){ addr := 0x1000 + 274 * size_of(int); fp := (rawptr(((^uintptr)(uintptr(addr)))^)); ((proc "c" ( ^Button, ^Element)) (fp))(button_, checkBuddy_)} From 5c95a48bc7bfb2754a8c62d0230906243498be2c Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 15 Feb 2026 17:00:53 +0100 Subject: [PATCH 488/766] Clean up `core:math/big` - Deprecate the u64/u32 implementation so we can use fewer nails and have an easier time of maintaining and optimizing the package going forward. The remaining implementation still works on 32-bit targets, it's just a smidge less efficient. - Use only 1 nail instead of 4. The tests now run 3.5% faster as a result. Future optimizations may including using fully packed backing (no nails) using `intrinsics.overflow_*` to handle borrow and carry safely. --- core/math/big/common.odin | 63 +++++---------------- core/math/big/helpers.odin | 13 +---- core/math/big/internal.odin | 9 ++- core/math/big/private.odin | 32 +---------- core/math/big/radix.odin | 2 +- tests/core/math/big/test_core_math_big.odin | 18 +++--- 6 files changed, 34 insertions(+), 103 deletions(-) diff --git a/core/math/big/common.odin b/core/math/big/common.odin index 944d1cfa1..acf32749e 100644 --- a/core/math/big/common.odin +++ b/core/math/big/common.odin @@ -14,21 +14,10 @@ import "base:runtime" This allows to benchmark and/or setting optimized values for a certain CPU without recompiling. */ -/* - There is a bug with DLL globals. They don't get set. - To allow tests to run we add `-define:MATH_BIG_EXE=false` to hardcode the cutoffs for now. -*/ -when #config(MATH_BIG_EXE, true) { - MUL_KARATSUBA_CUTOFF := _DEFAULT_MUL_KARATSUBA_CUTOFF - SQR_KARATSUBA_CUTOFF := _DEFAULT_SQR_KARATSUBA_CUTOFF - MUL_TOOM_CUTOFF := _DEFAULT_MUL_TOOM_CUTOFF - SQR_TOOM_CUTOFF := _DEFAULT_SQR_TOOM_CUTOFF -} else { - MUL_KARATSUBA_CUTOFF := _DEFAULT_MUL_KARATSUBA_CUTOFF - SQR_KARATSUBA_CUTOFF := _DEFAULT_SQR_KARATSUBA_CUTOFF - MUL_TOOM_CUTOFF := _DEFAULT_MUL_TOOM_CUTOFF - SQR_TOOM_CUTOFF := _DEFAULT_SQR_TOOM_CUTOFF -} +MUL_KARATSUBA_CUTOFF := _DEFAULT_MUL_KARATSUBA_CUTOFF +SQR_KARATSUBA_CUTOFF := _DEFAULT_SQR_KARATSUBA_CUTOFF +MUL_TOOM_CUTOFF := _DEFAULT_MUL_TOOM_CUTOFF +SQR_TOOM_CUTOFF := _DEFAULT_SQR_TOOM_CUTOFF /* These defaults were tuned on an AMD A8-6600K (64-bit) using libTomMath's `make tune`. @@ -38,9 +27,6 @@ when #config(MATH_BIG_EXE, true) { It would also be cool if we collected some data across various processor families. This would let uss set reasonable defaults at runtime as this library initializes itself by using `cpuid` or the ARM equivalent. - - IMPORTANT: The 32_BIT path has largely gone untested. It needs to be tested and - debugged where necessary. */ _DEFAULT_MUL_KARATSUBA_CUTOFF :: #config(MATH_BIG_MUL_KARATSUBA_CUTOFF, 80) @@ -54,7 +40,7 @@ MAX_ITERATIONS_ROOT_N := 500 /* Largest `N` for which we'll compute `N!` */ -FACTORIAL_MAX_N := 1_000_000 +FACTORIAL_MAX_N := 1_000_000 /* Cutoff to switch to int_factorial_binary_split, and its max recursion level. @@ -86,22 +72,10 @@ MAX_ITERATIONS_RANDOM_PRIME := 1_000_000 */ @thread_local RANDOM_PRIME_ITERATIONS_USED: int -/* - We don't allow these to be switched at runtime for two reasons: - - 1) 32-bit and 64-bit versions of procedures use different types for their storage, - so we'd have to double the number of procedures, and they couldn't interact. - - 2) Optimizations thanks to precomputed masks wouldn't work. -*/ -MATH_BIG_FORCE_64_BIT :: #config(MATH_BIG_FORCE_64_BIT, false) -MATH_BIG_FORCE_32_BIT :: #config(MATH_BIG_FORCE_32_BIT, false) -when (MATH_BIG_FORCE_32_BIT && MATH_BIG_FORCE_64_BIT) { #panic("Cannot force 32-bit and 64-bit big backend simultaneously.") } - /* Trade a smaller memory footprint for more processing overhead? */ -_LOW_MEMORY :: #config(MATH_BIG_SMALL_MEMORY, false) +_LOW_MEMORY :: #config(MATH_BIG_SMALL_MEMORY, false) when _LOW_MEMORY { _DEFAULT_DIGIT_COUNT :: 8 _TAB_SIZE :: 32 @@ -217,28 +191,19 @@ _MIN_DIGIT_COUNT :: max(3, ((size_of(u128) + _DIGIT_BITS) - 1) / _DIGIT_BITS) _MAX_BIT_COUNT :: (max(int) - 2) _MAX_DIGIT_COUNT :: _MAX_BIT_COUNT / _DIGIT_BITS -when MATH_BIG_FORCE_64_BIT || (!MATH_BIG_FORCE_32_BIT && size_of(rawptr) == 8) { - /* - We can use u128 as an intermediary. - */ - DIGIT :: distinct u64 - _WORD :: distinct u128 - // Base 10 extraction constants - ITOA_DIVISOR :: DIGIT(1_000_000_000_000_000_000) - ITOA_COUNT :: 18 -} else { - DIGIT :: distinct u32 - _WORD :: distinct u64 - // Base 10 extraction constants - ITOA_DIVISOR :: DIGIT(100_000_000) - ITOA_COUNT :: 8 -} +// We use u128 as an intermediary. +DIGIT :: distinct u64 +_WORD :: distinct u128 + +// Base 10 extraction constants +ITOA_DIVISOR :: DIGIT(1_000_000_000_000_000_000) +ITOA_COUNT :: 18 #assert(size_of(_WORD) == 2 * size_of(DIGIT)) _DIGIT_TYPE_BITS :: 8 * size_of(DIGIT) _WORD_TYPE_BITS :: 8 * size_of(_WORD) -_DIGIT_NAILS :: 4 +_DIGIT_NAILS :: 1 _DIGIT_BITS :: _DIGIT_TYPE_BITS - _DIGIT_NAILS _WORD_BITS :: 2 * _DIGIT_BITS diff --git a/core/math/big/helpers.odin b/core/math/big/helpers.odin index b922881b4..21a5bdc35 100644 --- a/core/math/big/helpers.odin +++ b/core/math/big/helpers.odin @@ -7,7 +7,6 @@ package math_big import "base:intrinsics" import "base:runtime" -import rnd "core:math/rand" /* TODO: Int.flags and Constants like ONE, NAN, etc, are not yet properly handled everywhere. @@ -362,17 +361,7 @@ platform_count_lsb :: #force_inline proc(a: $T) -> (count: int) count_lsb :: proc { int_count_lsb, platform_count_lsb, } -int_random_digit :: proc() -> (res: DIGIT) { - when _DIGIT_BITS == 60 { // DIGIT = u64 - return DIGIT(rnd.uint64()) & _MASK - } else when _DIGIT_BITS == 28 { // DIGIT = u32 - return DIGIT(rnd.uint32()) & _MASK - } else { - panic("Unsupported DIGIT size.") - } - - return 0 // We shouldn't get here. -} +int_random_digit :: internal_int_random_digit int_random :: proc(dest: ^Int, bits: int, allocator := context.allocator) -> (err: Error) { /* diff --git a/core/math/big/internal.odin b/core/math/big/internal.odin index 02d7b4544..5b75a8f7b 100644 --- a/core/math/big/internal.odin +++ b/core/math/big/internal.odin @@ -30,7 +30,7 @@ package math_big import "base:builtin" import "base:intrinsics" import "base:runtime" -import rnd "core:math/rand" +@(require) import rnd "core:math/rand" /* Low-level addition, unsigned. Handbook of Applied Cryptography, algorithm 14.7. @@ -1178,6 +1178,8 @@ internal_cmp_digit :: internal_compare_digit */ internal_int_compare_magnitude :: #force_inline proc(a, b: ^Int) -> (comparison: int) { assert_if_nil(a, b) + internal_clamp(a) + internal_clamp(b) // Compare based on used digits. if a.used != b.used { @@ -1450,6 +1452,7 @@ internal_int_log :: proc(a: ^Int, base: DIGIT) -> (res: int, err: Error) { /* Fast path for `Int`s that fit within a single `DIGIT`. */ + internal_clamp(a) if a.used == 1 { return internal_log(a.digit[0], DIGIT(base)) } return _private_int_log(a, base) @@ -2820,9 +2823,9 @@ internal_platform_count_lsb :: #force_inline proc(a: $T) -> (count: int) internal_count_lsb :: proc { internal_int_count_lsb, internal_platform_count_lsb, } internal_int_random_digit :: proc() -> (res: DIGIT) { - when _DIGIT_BITS == 60 { // DIGIT = u64 + when _DIGIT_TYPE_BITS == 64 { // DIGIT = u64 return DIGIT(rnd.uint64()) & _MASK - } else when _DIGIT_BITS == 28 { // DIGIT = u32 + } else when _DIGIT_TYPE_BITS == 32 { // DIGIT = u32 return DIGIT(rnd.uint32()) & _MASK } else { panic("Unsupported DIGIT size.") diff --git a/core/math/big/private.odin b/core/math/big/private.odin index 8cf7a2a77..506f68165 100644 --- a/core/math/big/private.odin +++ b/core/math/big/private.odin @@ -3282,9 +3282,8 @@ _private_prime_table := [_PRIME_TAB_SIZE]DIGIT{ } #assert(_PRIME_TAB_SIZE * size_of(DIGIT) == size_of(_private_prime_table)) -when MATH_BIG_FORCE_64_BIT || (!MATH_BIG_FORCE_32_BIT && size_of(rawptr) == 8) { - @(rodata) - _factorial_table := [35]_WORD{ +@(rodata) +_factorial_table := [35]_WORD{ /* f(00): */ 1, /* f(01): */ 1, /* f(02): */ 2, @@ -3320,34 +3319,9 @@ when MATH_BIG_FORCE_64_BIT || (!MATH_BIG_FORCE_32_BIT && size_of(rawptr) == 8) { /* f(32): */ 263_130_836_933_693_530_167_218_012_160_000_000, /* f(33): */ 8_683_317_618_811_886_495_518_194_401_280_000_000, /* f(34): */ 295_232_799_039_604_140_847_618_609_643_520_000_000, - } -} else { - @(rodata) - _factorial_table := [21]_WORD{ -/* f(00): */ 1, -/* f(01): */ 1, -/* f(02): */ 2, -/* f(03): */ 6, -/* f(04): */ 24, -/* f(05): */ 120, -/* f(06): */ 720, -/* f(07): */ 5_040, -/* f(08): */ 40_320, -/* f(09): */ 362_880, -/* f(10): */ 3_628_800, -/* f(11): */ 39_916_800, -/* f(12): */ 479_001_600, -/* f(13): */ 6_227_020_800, -/* f(14): */ 87_178_291_200, -/* f(15): */ 1_307_674_368_000, -/* f(16): */ 20_922_789_888_000, -/* f(17): */ 355_687_428_096_000, -/* f(18): */ 6_402_373_705_728_000, -/* f(19): */ 121_645_100_408_832_000, -/* f(20): */ 2_432_902_008_176_640_000, - } } + /* ========================= End of private tables ======================== */ \ No newline at end of file diff --git a/core/math/big/radix.odin b/core/math/big/radix.odin index b4f5f875e..1a80fdf88 100644 --- a/core/math/big/radix.odin +++ b/core/math/big/radix.odin @@ -226,7 +226,7 @@ int_itoa_raw :: proc(a: ^Int, radix: i8, buffer: []u8, size := int(-1), zero_ter // If we optimize `itoa` further, this needs to be evaluated. itoa_method := _itoa_raw_full - when !MATH_BIG_FORCE_32_BIT && ODIN_OPTIMIZATION_MODE >= .Size { + when ODIN_OPTIMIZATION_MODE >= .Size { if count >= 32768 { itoa_method = _itoa_raw_old } diff --git a/tests/core/math/big/test_core_math_big.odin b/tests/core/math/big/test_core_math_big.odin index 1fde85093..ed9d1c206 100644 --- a/tests/core/math/big/test_core_math_big.odin +++ b/tests/core/math/big/test_core_math_big.odin @@ -151,7 +151,7 @@ test_big_math_vectors :: proc(t: ^testing.T) { err := big.pow(res, a, int(power)) testing.expect(t, err == vec.err) - expect_ab(t, "Expected pow(%v, %v) to be '%v', got %v", a, b, expected, res, err) + expect_ab(t, "Expected pow(%v, %v) to be %q, got %q", a, b, expected, res, err) case .Root: n, n_ok := strconv.parse_i64_of_base(vec.b, 16) @@ -160,7 +160,7 @@ test_big_math_vectors :: proc(t: ^testing.T) { err := big.root_n(res, a, int(n)) testing.expect(t, err == vec.err) - expect_ab(t, "Expected root_n(%v, %v) to be '%v', got %v", a, b, expected, res, err) + expect_ab(t, "Expected root_n(%v, %v) to be %q, got %q", a, b, expected, res, err) case .Shl: bits, bits_ok := strconv.parse_i64_of_base(vec.b, 16) @@ -169,7 +169,7 @@ test_big_math_vectors :: proc(t: ^testing.T) { err := big.internal_int_shl(res, a, int(bits)) testing.expect(t, err == vec.err) - expect_ab(t, "Expected internal_int_shl(%v, %v) to be '%v', got %v", a, b, expected, res, err) + expect_ab(t, "Expected internal_int_shl(%v, %v) to be %q, got %q", a, b, expected, res, err) case .Shr: bits, bits_ok := strconv.parse_i64_of_base(vec.b, 16) @@ -178,7 +178,7 @@ test_big_math_vectors :: proc(t: ^testing.T) { err := big.internal_int_shr(res, a, int(bits)) testing.expect(t, err == vec.err) - expect_ab(t, "Expected internal_int_shr(%v, %v) to be '%v', got %v", a, b, expected, res, err) + expect_ab(t, "Expected internal_int_shr(%v, %v) to be %q, got %q", a, b, expected, res, err) case .Shr_Signed: bits, bits_ok := strconv.parse_i64_of_base(vec.b, 16) @@ -188,7 +188,7 @@ test_big_math_vectors :: proc(t: ^testing.T) { err := big.internal_int_shr_signed(res, res, int(bits)) testing.expect(t, err == vec.err) - expect_ab(t, "Expected internal_int_shr_signed(%v, %v) to be '%v', got %v", a, b, expected, res, err) + expect_ab(t, "Expected internal_int_shr_signed(%v, %v) to be %q, got %q", a, b, expected, res, err) case .Factorial: n, n_ok := strconv.parse_i64_of_base(vec.a, 16) @@ -197,26 +197,26 @@ test_big_math_vectors :: proc(t: ^testing.T) { err := big.factorial(res, int(n)) testing.expect(t, err == vec.err) - expect_a(t, "Expected factorial(%v) to be '%v', got %v", a, expected, res, err) + expect_a(t, "Expected factorial(%v) to be %q, got %q", a, expected, res, err) case .Gcd: err := big.internal_int_gcd_lcm(res, nil, a, b) testing.expect(t, err == vec.err) - expect_ab(t, "Expected gcd(%v, %v) to be '%v', got %v", a, b, expected, res, err) + expect_ab(t, "Expected gcd(%v, %v) to be %q, got %q", a, b, expected, res, err) case .Lcm: err := big.internal_int_gcd_lcm(nil, res, a, b) testing.expect(t, err == vec.err) - expect_ab(t, "Expected lcm(%v, %v) to be '%v', got %v", a, b, expected, res, err) + expect_ab(t, "Expected lcm(%v, %v) to be %q, got %q", a, b, expected, res, err) case .Is_Square: square, err := big.internal_int_is_square(a) testing.expect(t, err == vec.err) big.set(res, 1 if square else 0) - expect_a(t, "Expected is_square(%v) to be '%v', got %v", a, expected, res, err) + expect_a(t, "Expected is_square(%v) to be %q, got %q", a, expected, res, err) case: log.assertf(false, "Unhandled op: %v", vec.op) From a7bf06eb5fd2d65a86c870a736d8b51790263165 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 15 Feb 2026 17:15:48 +0100 Subject: [PATCH 489/766] Fix cast. --- core/math/big/internal.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/math/big/internal.odin b/core/math/big/internal.odin index 5b75a8f7b..e2bfa8f50 100644 --- a/core/math/big/internal.odin +++ b/core/math/big/internal.odin @@ -1688,7 +1688,7 @@ internal_int_root_n :: proc(dest, src: ^Int, n: int, allocator := context.alloca */ if n == 2 { return #force_inline internal_sqrt(dest, src) } - if n < 0 || n > int(_DIGIT_MAX) { return .Invalid_Argument } + if n < 0 || _WORD(n) > _WORD(_DIGIT_MAX) { return .Invalid_Argument } if n & 1 == 0 && #force_inline internal_is_negative(src) { return .Invalid_Argument } From 5c5e337172c122a98bea7f787938dad2b5678987 Mon Sep 17 00:00:00 2001 From: Wrath Date: Sun, 15 Feb 2026 22:27:30 -0500 Subject: [PATCH 490/766] Propagate allocator errors from certain unicode functions --- core/unicode/utf16/utf16.odin | 5 +++-- core/unicode/utf8/utf8.odin | 13 ++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/core/unicode/utf16/utf16.odin b/core/unicode/utf16/utf16.odin index 5cc996f8b..95e7c1436 100644 --- a/core/unicode/utf16/utf16.odin +++ b/core/unicode/utf16/utf16.odin @@ -1,6 +1,7 @@ // Procedures and constants to support text-encoding in the `UTF-16` character encoding. package utf16 +@(require) import "base:runtime" import "core:unicode/utf8" REPLACEMENT_CHAR :: '\ufffd' @@ -127,10 +128,10 @@ decode_rune_in_string :: proc "contextless" (s: string16) -> (r: rune, width: in return } -string_to_runes :: proc "odin" (s: string16, allocator := context.allocator) -> (runes: []rune) { +string_to_runes :: proc "odin" (s: string16, allocator := context.allocator) -> (runes: []rune, err: runtime.Allocator_Error) { n := rune_count(s) - runes = make([]rune, n, allocator) + runes = make([]rune, n, allocator) or_return i := 0 for r in s { runes[i] = r diff --git a/core/unicode/utf8/utf8.odin b/core/unicode/utf8/utf8.odin index 78cefa8b4..a5ada646d 100644 --- a/core/unicode/utf8/utf8.odin +++ b/core/unicode/utf8/utf8.odin @@ -1,6 +1,8 @@ // Procedures and constants to support text-encoding in the `UTF-8` character encoding. package utf8 +@(require) import "base:runtime" + RUNE_ERROR :: '\ufffd' RUNE_SELF :: 0x80 RUNE_BOM :: 0xfeff @@ -145,10 +147,10 @@ decode_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { } @(require_results) -string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (runes: []rune) { +string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (runes: []rune, err: runtime.Allocator_Error) { n := rune_count_in_string(s) - runes = make([]rune, n, allocator) + runes = make([]rune, n, allocator) or_return i := 0 for r in s { runes[i] = r @@ -158,14 +160,14 @@ string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (r } @(require_results) -runes_to_string :: proc "odin" (runes: []rune, allocator := context.allocator) -> string { +runes_to_string :: proc "odin" (runes: []rune, allocator := context.allocator) -> (s: string, err: runtime.Allocator_Error) { byte_count := 0 for r in runes { _, w := encode_rune(r) byte_count += w } - bytes := make([]byte, byte_count, allocator) + bytes := make([]byte, byte_count, allocator) or_return offset := 0 for r in runes { b, w := encode_rune(r) @@ -173,7 +175,8 @@ runes_to_string :: proc "odin" (runes: []rune, allocator := context.allocator) - offset += w } - return string(bytes) + s = string(bytes) + return } From 69831da51fc89c9c081bfba5185d549e428ef951 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 16 Feb 2026 17:40:58 +0100 Subject: [PATCH 491/766] Vendor Yawning Angel's `odin-wycheproof` into `tests/crypto/wycheproof` Upstream test vectors from [wycheproof](https://github.com/C2SP/wycheproof) have been vendored into the [Odin test-assets](https://github.com/odin-lang/test-assets) repository, and will be downloaded and verified using `tests/core/download_assets.py`. --- .github/workflows/ci.yml | 35 +- tests/core/assets/Wycheproof/.gitignore | 1 + tests/core/crypto/wycheproof/README.md | 13 + tests/core/crypto/wycheproof/helpers.odin | 76 + .../crypto/wycheproof/helpers_generic.odin | 10 + .../core/crypto/wycheproof/helpers_linux.odin | 71 + tests/core/crypto/wycheproof/main.odin | 1269 +++++++++++++++++ tests/core/crypto/wycheproof/schemas.odin | 200 +++ tests/core/download_assets.py | 348 ++++- 9 files changed, 2006 insertions(+), 17 deletions(-) create mode 100644 tests/core/assets/Wycheproof/.gitignore create mode 100644 tests/core/crypto/wycheproof/README.md create mode 100644 tests/core/crypto/wycheproof/helpers.odin create mode 100644 tests/core/crypto/wycheproof/helpers_generic.odin create mode 100644 tests/core/crypto/wycheproof/helpers_linux.odin create mode 100644 tests/core/crypto/wycheproof/main.odin create mode 100644 tests/core/crypto/wycheproof/schemas.odin diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d2f3f1ca..aee4c1c20 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -139,6 +139,8 @@ jobs: run: ./odin test tests/core/normal.odin -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Optimized Core library tests run: ./odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address + - name: Wycheproof tests + run: ./odin test tests/core/crypto/wycheproof vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed -microarch:native - name: Vendor library tests run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Internals tests @@ -187,7 +189,7 @@ jobs: - name: build Odin shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" ./build.bat 1 - name: Odin version run: ./odin version @@ -196,70 +198,75 @@ jobs: - name: Odin check shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" odin check examples/demo -vet - name: Odin run shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" odin run examples/demo - name: Odin run -debug shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" odin run examples/demo -debug -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do - name: Odin check examples/all shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" odin check examples/all -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do - name: Odin check examples/all/sdl3 shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" odin check examples/all/sdl3 -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -no-entry-point - name: Core library tests shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" odin test tests/core/normal.odin -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Optimized core library tests shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address + - name: Wycheproof tests + shell: cmd + run: | + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" + odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed -microarch:native - name: Vendor library tests shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" copy vendor\lua\5.4\windows\*.dll . odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Odin internals tests shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" odin test tests/internal -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Check issues shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" cd tests/issues call run.bat - name: Check benchmarks shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" odin check tests/benchmark -vet -strict-style -no-entry-point - name: Odin documentation tests shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" cd tests\documentation call build.bat - name: Odin check examples/all for Windows 32bits shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" odin check examples/all -strict-style -target:windows_i386 build_linux_riscv64: diff --git a/tests/core/assets/Wycheproof/.gitignore b/tests/core/assets/Wycheproof/.gitignore new file mode 100644 index 000000000..94a2dd146 --- /dev/null +++ b/tests/core/assets/Wycheproof/.gitignore @@ -0,0 +1 @@ +*.json \ No newline at end of file diff --git a/tests/core/crypto/wycheproof/README.md b/tests/core/crypto/wycheproof/README.md new file mode 100644 index 000000000..29381c9c0 --- /dev/null +++ b/tests/core/crypto/wycheproof/README.md @@ -0,0 +1,13 @@ +### odin-wycheproof - Odin core/crypto tests +#### Yawning Angel (yawning at schwanenlied dot me) + +This is a test harness that exercises the [Odin][1] `core/crypto` +library with corpus from [Wycheproof][2]. + +``` +$ odin build . -o:speed +$ ./odin-wycheproof ../wycheproof +``` + +[1]: https://odin-lang.org +[2]: https://github.com/C2SP/wycheproof diff --git a/tests/core/crypto/wycheproof/helpers.odin b/tests/core/crypto/wycheproof/helpers.odin new file mode 100644 index 000000000..fb6b3ddf9 --- /dev/null +++ b/tests/core/crypto/wycheproof/helpers.odin @@ -0,0 +1,76 @@ +package test_wycheproof + +import "core:crypto/hash" +import "core:fmt" +import "core:strings" + +panic_fn :: proc(arg: any) + +hash_name_to_algorithm :: proc(alg_str: string) -> (hash.Algorithm, bool) { + alg_enums := [][hash.Algorithm]string { + hash.ALGORITHM_NAMES, + // The HMAC test vectors omit `-`. + #partial [hash.Algorithm]string { + .SHA224 = "SHA224", + .SHA256 = "SHA256", + .SHA384 = "SHA384", + .SHA512 = "SHA512", + .SHA512_256 = "SHA512/256", + .Insecure_SHA1 = "SHA1", + }, + } + for &e in alg_enums { + for n, alg in e { + if n == alg_str { + return alg, true + } + } + } + + return .Invalid, false +} + +MAC_ALGORITHM :: enum { + Invalid, + HMAC, + KMAC128, + KMAC256, + SIPHASH_1_3, + SIPHASH_2_4, + SIPHASH_4_8, +} + +mac_algorithm :: proc(alg_str: string) -> (MAC_ALGORITHM, hash.Algorithm, string, bool) { + PREFIX_HMAC :: "HMAC" + + if strings.has_prefix(alg_str, PREFIX_HMAC) { + alg_str_ := strings.trim_prefix(alg_str, PREFIX_HMAC) + alg, ok := hash_name_to_algorithm(alg_str_) + alg_str_ = fmt.aprintf("hmac/%s", strings.to_lower(alg_str_)) + return .HMAC, alg, alg_str_, ok + } + + ALG_KMAC128 :: "KMAC128" + ALG_KMAC256 :: "KMAC256" + ALG_SIPHASH_1_3 :: "SipHash-1-3" + ALG_SIPHASH_2_4 :: "SipHash-2-4" + ALG_SIPHASH_4_8 :: "SipHash-4-8" + + mac_alg := MAC_ALGORITHM.Invalid + ok := true + switch alg_str { + case ALG_KMAC128: + mac_alg = .KMAC128 + case ALG_KMAC256: + mac_alg = .KMAC256 + case ALG_SIPHASH_1_3: + mac_alg = .SIPHASH_1_3 + case ALG_SIPHASH_2_4: + mac_alg = .SIPHASH_2_4 + case ALG_SIPHASH_4_8: + mac_alg = .SIPHASH_4_8 + case: + ok = false + } + return mac_alg, .Invalid, strings.to_lower(alg_str), ok +} \ No newline at end of file diff --git a/tests/core/crypto/wycheproof/helpers_generic.odin b/tests/core/crypto/wycheproof/helpers_generic.odin new file mode 100644 index 000000000..381005dfa --- /dev/null +++ b/tests/core/crypto/wycheproof/helpers_generic.odin @@ -0,0 +1,10 @@ +#+build !linux +package test_wycheproof + +case_should_panic :: proc(fn: panic_fn, fn_arg: any, panic_str: string) -> bool { + panic("helpers: testing for panic is unsupported on this target") +} + +can_test_panic :: proc() -> bool { + return false +} diff --git a/tests/core/crypto/wycheproof/helpers_linux.odin b/tests/core/crypto/wycheproof/helpers_linux.odin new file mode 100644 index 000000000..b9f1c0632 --- /dev/null +++ b/tests/core/crypto/wycheproof/helpers_linux.odin @@ -0,0 +1,71 @@ +#+build linux +package test_wycheproof + +import "core:log" +import "core:os" +import "core:strings" +import "core:sys/linux" + +@(private) +PIPE_BUF :: 4096 + +case_should_panic :: proc(fn: panic_fn, fn_arg: any, panic_str: string) -> bool { + stderr_pipe: [2]linux.Fd + + if err := linux.pipe2(&stderr_pipe, linux.Open_Flags{}); err != .NONE { + log.errorf("panic_case: failed to create pipe: %v", err) + return false + } + + pid, err := linux.fork() + switch { + case err != .NONE: + log.errorf("panic_case: failed to fork: %v", err) + return false + case pid == 0: + // In the child, redirect stderr to the pipe, run the function that + // is supposed to panic, and exit normally. + linux.dup2(stderr_pipe[1], 2) + fn(fn_arg) + os.exit(0) + } + + // Parent. + defer linux.close(stderr_pipe[0]) + defer linux.close(stderr_pipe[1]) + + // Wait for the child to terminate, and ensure it terminated + // abnormally (SIGILL/SIGTRAP). + wait_status: u32 + linux.wait4(pid, &wait_status, linux.Wait_Options{}, nil) + if !linux.WIFSIGNALED(wait_status) { + log.errorf("panic_case: child did not terminate via signal: %x", wait_status) + return false + } + term_sig := linux.Signal(linux.WTERMSIG(wait_status)) + if term_sig != .SIGILL && term_sig != .SIGTRAP { + log.errorf("panic_case: child terminated via wrong signal: %v", term_sig) + return false + } + + // Consume the child's stderr output from the pipe buffer. + // + // Note: POSIX requires PIPE_BUF be >= 512 bytes, Linux defaults + // to 4096 bytes. Either is sufficient to buffer output for our + // test cases. + buf: [PIPE_BUF]byte + n, _ := linux.read(stderr_pipe[0], buf[:]) + if n == 0 { + log.errorf("panic_case: child stderr empty") + return false + } + s := string(buf[:n]) + + log.debugf("panic case: child stderr: '%s'", s) + + return strings.contains(s, panic_str) +} + +can_test_panic :: proc() -> bool { + return true +} diff --git a/tests/core/crypto/wycheproof/main.odin b/tests/core/crypto/wycheproof/main.odin new file mode 100644 index 000000000..c859bc8f6 --- /dev/null +++ b/tests/core/crypto/wycheproof/main.odin @@ -0,0 +1,1269 @@ +package test_wycheproof + +import "core:encoding/hex" +import "core:log" +import "core:mem" +import "core:os" +import "core:slice" +import "core:strings" +import "core:testing" + +import chacha_simd128 "core:crypto/_chacha20/simd128" +import chacha_simd256 "core:crypto/_chacha20/simd256" +import "core:crypto/aegis" +import "core:crypto/aes" +import "core:crypto/chacha20" +import "core:crypto/chacha20poly1305" +import "core:crypto/ecdh" +import "core:crypto/ed25519" +import "core:crypto/hkdf" +import "core:crypto/hmac" +import "core:crypto/kmac" +import "core:crypto/pbkdf2" +import "core:crypto/siphash" +import "core:crypto/deoxysii" + +// Covered: +// - crypto/aegis +// - aegis128L_test.json +// - aegis256_test.json +// - crypto/aes +// - aes_gcm_test.json +// - crypto/chacha20poly1305 +// - chacha20_poly1305_test.json +// - xchacha20_poly1305_test.json +// - crypto/ed25519 +// - ed25519_test.json +// - crypto/hkdf +// - hkdf_sha1_test.json +// - hkdf_sha256_test.json +// - hkdf_sha384_test.json +// - hkdf_sha512_test.json +// - crypto/hmac (Note: We do not implement SHA-512/224) +// - hmac_sha1_test.json +// - hmac_sha224_test.json +// - hmac_sha256_test.json +// - hmac_sha3_224_test.json +// - hmac_sha3_256_test.json +// - hmac_sha3_384_test.json +// - hmac_sha3_512_test.json +// - hmac_sha384_test.json +// - hmac_sha512_224_test.json +// - hmac_sha512_256_test.json +// - hmac_sha512_test.json +// - hmac_sm3_test.json +// - crypto/kmac +// - kmac128_no_customization_test.json +// - kmac256_no_customization_test.json +// - crypto/pbkdf2 +// - pbkdf2_hmacsha1_test.json +// - pbkdf2_hmacsha224_test.json +// - pbkdf2_hmacsha256_test.json +// - pbkdf2_hmacsha384_test.json +// - pbkdf2_hmacsha512_test.json +// - crypto/siphash +// - siphash_1_3_test.json +// - siphash_2_4_test.json +// - siphash_4_8_test.json +// - crypto/x25519 +// - x25519_test.json +// - crypto/x448 +// - x448_test.json +// - crypto/_weierstrass +// - ecdh_secp256r1_ecpoint_test.json +// - ecdh_secp384r1_ecpoint_test.json +// +// Not covered (not in wycheproof): +// - crypto/blake2b +// - crypto/blake2s +// - crypto/legacy/keccak +// - crypto/legacy/md5 +// - crypto/tuplehash + +ARENA_SIZE :: 4 * 1024 * 1024 // There is no kill like overkill. + +BASE_PATH :: ODIN_ROOT + "tests/core/assets/Wycheproof" +SUFFIX_TEST_JSON :: "_test.json" + +@(test) +print_test_vector_path :: proc(t: ^testing.T) { + log.infof("wycheproof path: %s", BASE_PATH) +} + +test_proc :: proc(_: string) -> bool + +supported_aegis_impls :: proc() -> [dynamic]aes.Implementation { + impls := make([dynamic]aes.Implementation, 0, 2, context.temp_allocator) + append(&impls, aes.Implementation.Portable) + if aegis.is_hardware_accelerated() { + append(&impls, aes.Implementation.Hardware) + } + + return impls +} + +@(test) +test_aead_aegis :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + files := []string { + "aegis128L_test.json", + "aegis256_test.json", + } + + log.debug("aead/aegis: starting") + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Aead_Test_Group) + load_ok := load(&test_vectors, fn) + testing.expectf(t, load_ok, "Unable to load {}", f) + if !load_ok { + continue + } + + for impl in supported_aegis_impls() { + testing.expectf(t, test_aead_aegis_impl(&test_vectors, impl), "impl {} failed", impl) + } + } +} + +test_aead_aegis_impl :: proc( + test_vectors: ^Test_Vectors(Aead_Test_Group), + impl: aes.Implementation, +) -> bool { + log.debug("aead/aegis/%v: starting", impl) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "aead/aegis/%v/%d: %s: %+v", + impl, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("aead/aegis/%v/%d: %+v", + impl, + test_vector.tc_id, + test_vector.flags, + ) + } + + key := hexbytes_decode(test_vector.key) + iv := hexbytes_decode(test_vector.iv) + aad := hexbytes_decode(test_vector.aad) + msg := hexbytes_decode(test_vector.msg) + ct := hexbytes_decode(test_vector.ct) + tag := hexbytes_decode(test_vector.tag) + + if len(iv) == 0 { + log.infof( + "aead/aegis/%v/%d: skipped, invalid IVs panic", + impl, + test_vector.tc_id, + ) + num_skipped += 1 + continue + } + + ctx: aegis.Context + aegis.init(&ctx, key, impl) + + if result_is_valid(test_vector.result) { + ct_ := make([]byte, len(ct)) + tag_ := make([]byte, len(tag)) + aegis.seal(&ctx, ct_, tag_, iv, aad, msg) + + ok := hexbytes_compare(test_vector.ct, ct_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(ct_)) + log.errorf( + "aead/aegis/%v/%d: ciphertext: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.ct, + x, + ) + num_failed += 1 + continue + } + + ok = hexbytes_compare(test_vector.tag, tag_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(tag_)) + log.errorf( + "aead/aegis/%v/%d: tag: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.tag, + x, + ) + num_failed += 1 + continue + } + } + + msg_ := make([]byte, len(msg)) + ok := aegis.open(&ctx, msg_, iv, aad, ct, tag) + if !result_check(test_vector.result, ok) { + log.errorf("aead/aegis/%v/%d: decrypt failed", impl, test_vector.tc_id) + num_failed += 1 + continue + } + + if ok && !hexbytes_compare(test_vector.msg, msg_) { + x := transmute(string)(hex.encode(msg_)) + log.errorf( + "aead/aegis/%v/%d: decrypt msg: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.msg, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "aead/aegis: ran %d, passed %d, failed %d, skipped %d", + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +supported_aes_impls :: proc() -> [dynamic]aes.Implementation { + impls := make([dynamic]aes.Implementation, 0, 2) + append(&impls, aes.Implementation.Portable) + if aes.is_hardware_accelerated() { + append(&impls, aes.Implementation.Hardware) + } + + return impls +} + +@(test) +test_aead_aes_gcm :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + fn, _ := os.join_path([]string{BASE_PATH, "aes_gcm_test.json"}, context.allocator) + + log.debug("aead/aes-gcm: starting") + + test_vectors: Test_Vectors(Aead_Test_Group) + assert(load(&test_vectors, fn)) + + for impl in supported_aes_impls() { + testing.expectf(t, test_aead_aes_gcm_impl(&test_vectors, impl), "impl {} failed", impl) + } +} + +test_aead_aes_gcm_impl :: proc( + test_vectors: ^Test_Vectors(Aead_Test_Group), + impl: aes.Implementation, +) -> bool { + log.debug("aead/aes-gcm/%v: starting", impl) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "aead/aes-gcm/%v/%d: %s: %+v", + impl, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("aead/aes-gcm/%v/%d: %+v", + impl, + test_vector.tc_id, + test_vector.flags, + ) + } + + key := hexbytes_decode(test_vector.key) + iv := hexbytes_decode(test_vector.iv) + aad := hexbytes_decode(test_vector.aad) + msg := hexbytes_decode(test_vector.msg) + ct := hexbytes_decode(test_vector.ct) + tag := hexbytes_decode(test_vector.tag) + + if len(iv) == 0 { + log.infof( + "aead/aes-gcm/%v/%d: skipped, invalid IVs panic", + impl, + test_vector.tc_id, + ) + num_skipped += 1 + continue + } + + ctx: aes.Context_GCM + aes.init_gcm(&ctx, key, impl) + + if result_is_valid(test_vector.result) { + ct_ := make([]byte, len(ct)) + tag_ := make([]byte, len(tag)) + aes.seal_gcm(&ctx, ct_, tag_, iv, aad, msg) + + ok := hexbytes_compare(test_vector.ct, ct_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(ct_)) + log.errorf( + "aead/aes-gcm/%v/%d: ciphertext: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.ct, + x, + ) + num_failed += 1 + continue + } + + ok = hexbytes_compare(test_vector.tag, tag_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(tag_)) + log.errorf( + "aead/aes-gcm/%v/%d: tag: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.tag, + x, + ) + num_failed += 1 + continue + } + } + + msg_ := make([]byte, len(msg)) + ok := aes.open_gcm(&ctx, msg_, iv, aad, ct, tag) + if !result_check(test_vector.result, ok) { + log.errorf("aead/aes-gcm/%v/%d: decrypt failed", impl, test_vector.tc_id) + num_failed += 1 + continue + } + + if ok && !hexbytes_compare(test_vector.msg, msg_) { + x := transmute(string)(hex.encode(msg_)) + log.errorf( + "aead/aes-gcm/%v/%d: decrypt msg: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.msg, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "aead/aes-gcm: ran %d, passed %d, failed %d, skipped %d", + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +supported_chacha_impls :: proc() -> [dynamic]chacha20.Implementation { + impls := make([dynamic]chacha20.Implementation, 0, 3) + append(&impls, chacha20.Implementation.Portable) + if chacha_simd128.is_performant() { + append(&impls, chacha20.Implementation.Simd128) + } + if chacha_simd256.is_performant() { + append(&impls, chacha20.Implementation.Simd256) + } + + return impls +} + +@(test) +test_aead_chacha20_poly1305 :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + files := []string { + "chacha20_poly1305_test.json", + "xchacha20_poly1305_test.json", + } + + log.debug("aead/(x)chacha20poly1305: starting") + + for f, i in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Aead_Test_Group) + load_ok := load(&test_vectors, fn) + testing.expectf(t, load_ok, "Unable to load {}", f) + if !load_ok { + continue + } + + for impl in supported_chacha_impls() { + testing.expectf(t, test_aead_chacha20_poly1305_impl(&test_vectors, i == 1, impl), "impl {} failed", impl) + } + } +} + +test_aead_chacha20_poly1305_impl :: proc( + test_vectors: ^Test_Vectors(Aead_Test_Group), + is_xchacha: bool, + impl: chacha20.Implementation, +) -> bool { + FLAG_INVALID_NONCE_SIZE :: "InvalidNonceSize" + + alg_str := is_xchacha ? "xchacha20poly1305" : "chacha20poly1305" + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "aead/%s/%v/%d: %s: %+v", + alg_str, + impl, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("aead/%s/%v/%d: %+v", + alg_str, + impl, + test_vector.tc_id, + test_vector.flags, + ) + } + + key := hexbytes_decode(test_vector.key) + iv := hexbytes_decode(test_vector.iv) + aad := hexbytes_decode(test_vector.aad) + msg := hexbytes_decode(test_vector.msg) + ct := hexbytes_decode(test_vector.ct) + tag := hexbytes_decode(test_vector.tag) + + if slice.contains(test_vector.flags, FLAG_INVALID_NONCE_SIZE) { + log.infof( + "aead/%s/%v/%d: skipped, invalid nonces panic", + alg_str, + impl, + test_vector.tc_id, + ) + num_skipped += 1 + continue + } + + ctx: chacha20poly1305.Context + switch is_xchacha { + case true: + chacha20poly1305.init_xchacha(&ctx, key, impl) + case false: + chacha20poly1305.init(&ctx, key, impl) + } + + if result_is_valid(test_vector.result) { + ct_ := make([]byte, len(ct)) + tag_ := make([]byte, len(tag)) + chacha20poly1305.seal(&ctx, ct_, tag_, iv, aad, msg) + + ok := hexbytes_compare(test_vector.ct, ct_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(ct_)) + log.errorf( + "aead/%s/%v/%d: ciphertext: expected %s actual %s", + alg_str, + impl, + test_vector.tc_id, + test_vector.ct, + x, + ) + num_failed += 1 + continue + } + + ok = hexbytes_compare(test_vector.tag, tag_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(tag_)) + log.errorf( + "aead/%s/%v/%d: tag: expected %s actual %s", + alg_str, + impl, + test_vector.tc_id, + test_vector.tag, + x, + ) + num_failed += 1 + continue + } + } + + msg_ := make([]byte, len(msg)) + ok := chacha20poly1305.open(&ctx, msg_, iv, aad, ct, tag) + if !result_check(test_vector.result, ok) { + log.errorf("aead/%s/%v/%d: decrypt failed", + alg_str, + impl, + test_vector.tc_id, + ) + num_failed += 1 + continue + } + + if ok && !hexbytes_compare(test_vector.msg, msg_) { + x := transmute(string)(hex.encode(msg_)) + log.errorf( + "aead/%s/%v/%d: decrypt msg: expected %s actual %s", + alg_str, + impl, + test_vector.tc_id, + test_vector.msg, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "aead/%s/%v: ran %d, passed %d, failed %d, skipped %d", + alg_str, + impl, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +@(test) +test_aead_deoxysii :: proc(t: ^testing.T) { + ctx: deoxysii.Context + + key: [deoxysii.KEY_SIZE]byte + iv: [deoxysii.IV_SIZE]byte + tag: [deoxysii.TAG_SIZE]byte + buf: [4096]byte + + deoxysii.init(&ctx, key[:]) + deoxysii.seal(&ctx, buf[:], tag[:], iv[:], nil, buf[:]) + assert(deoxysii.open(&ctx, buf[:], iv[:], nil, buf[:], tag[:])) +} + +@(test) +test_eddsa_ed25519 :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + fn_, _ := os.join_path([]string{BASE_PATH, "ed25519_test.json"}, context.allocator) + + log.debug("eddsa/ed25519: starting") + + test_vectors: Test_Vectors(Eddsa_Test_Group) + assert(load(&test_vectors, fn_)) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group, i in test_vectors.test_groups { + mem.free_all() // Probably don't need this, but be safe. + pk_bytes := hexbytes_decode(test_group.public_key.pk) + + pk: ed25519.Public_Key + pk_ok := ed25519.public_key_set_bytes(&pk, pk_bytes) + testing.expectf(t, pk_ok, "eddsa/ed25519/%d: invalid public key: %s", i, test_group.public_key.pk) + if !pk_ok { + num_failed += len(test_group.tests) + continue + } + + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "eddsa/ed25519/%d: %s: %+v", + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("eddsa/ed25519/%d: %+v", test_vector.tc_id, test_vector.flags) + } + + msg := hexbytes_decode(test_vector.msg) + sig := hexbytes_decode(test_vector.sig) + + verify_ok := ed25519.verify(&pk, msg, sig) + result_ok := result_check(test_vector.result, verify_ok) + testing.expectf( + t, + result_ok, + "eddsa/ed25519/%d: verify failed: expected %s actual %v", + test_vector.tc_id, + test_vector.result, + verify_ok, + ) + if !result_ok { + num_failed += 1 + continue + } + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "eddsa/ed25519: ran %d, passed %d, failed %d, skipped %d", + num_ran, + num_passed, + num_failed, + num_skipped, + ) +} + +@(test) +test_hkdf :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + log.debug("hkdf: starting") + + files := []string { + "hkdf_sha1_test.json", + "hkdf_sha256_test.json", + "hkdf_sha384_test.json", + "hkdf_sha512_test.json", + } + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Hkdf_Test_Group) + load_ok := load(&test_vectors, fn) + testing.expectf(t, load_ok, "Unable to load {}", f) + if !load_ok { + continue + } + + testing.expectf(t, test_hkdf_impl(&test_vectors), "hkdf failed") + } +} + +test_hkdf_impl :: proc(test_vectors: ^Test_Vectors(Hkdf_Test_Group)) -> bool { + PREFIX_HKDF :: "HKDF-" + FLAG_SIZE_TOO_LARGE :: "SizeTooLarge" + + alg_str := strings.trim_prefix(test_vectors.algorithm, PREFIX_HKDF) + alg, ok := hash_name_to_algorithm(alg_str) + if !ok { + return false + } + alg_str = strings.to_lower(alg_str) + + log.debugf("hkdf/%s: starting", alg_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "hkdf/%s/%d: %s: %+v", + alg_str, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("hkdf/%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) + } + + ikm := hexbytes_decode(test_vector.ikm) + salt := hexbytes_decode(test_vector.salt) + info := hexbytes_decode(test_vector.info) + + if slice.contains(test_vector.flags, FLAG_SIZE_TOO_LARGE) { + log.infof( + "hkdf/%s/%d: skipped, oversized outputs panic", + alg_str, + test_vector.tc_id, + ) + num_skipped += 1 + continue + } + + okm_ := make([]byte, test_vector.size) + hkdf.extract_and_expand(alg, salt, ikm, info, okm_) + + ok = hexbytes_compare(test_vector.okm, okm_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(okm_)) + log.errorf( + "hkdf/%s/%d: shared: expected %s actual %s", + alg_str, + test_vector.tc_id, + test_vector.okm, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "hkdf/%s: ran %d, passed %d, failed %d, skipped %d", + alg_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +@(test) +test_mac :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + log.debug("mac: starting") + + files := []string { + "hmac_sha1_test.json", + "hmac_sha224_test.json", + "hmac_sha256_test.json", + "hmac_sha3_224_test.json", + "hmac_sha3_256_test.json", + "hmac_sha3_384_test.json", + "hmac_sha3_512_test.json", + "hmac_sha384_test.json", + // "hmac_sha512_224_test.json", + "hmac_sha512_256_test.json", + "hmac_sha512_test.json", + "hmac_sm3_test.json", + "kmac128_no_customization_test.json", + "kmac256_no_customization_test.json", + "siphash_1_3_test.json", + "siphash_2_4_test.json", + "siphash_4_8_test.json", + } + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Mac_Test_Group) + load_ok := load(&test_vectors, fn) + testing.expectf(t, load_ok, "Unable to load {}", f) + if !load_ok { + continue + } + + testing.expectf(t, test_mac_impl(&test_vectors), "hkdf failed") + } +} + +test_mac_impl :: proc(test_vectors: ^Test_Vectors(Mac_Test_Group)) -> bool { + PREFIX_HMAC :: "HMAC" + PREFIX_KMAC :: "KMAC" + + mac_alg, hmac_alg, alg_str, ok := mac_algorithm(test_vectors.algorithm) + if !ok { + log.errorf("mac: unsupported algorith: %s", test_vectors.algorithm) + return false + } + + log.debugf("%s: starting", alg_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "%s/%d: %s: %+v", + alg_str, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) + } + + key := hexbytes_decode(test_vector.key) + msg := hexbytes_decode(test_vector.msg) + + tag_ := make([]byte, len(test_vector.tag) / 2) + + #partial switch mac_alg { + case .HMAC: + ctx: hmac.Context + hmac.init(&ctx, hmac_alg, key) + hmac.update(&ctx, msg) + if l := hmac.tag_size(&ctx); l == len(tag_) { + hmac.final(&ctx, tag_) + } else { + // Our hmac package does not support truncation. + tmp := make([]byte, l) + hmac.final(&ctx, tmp) + copy(tag_, tmp) + } + case .KMAC128, .KMAC256: + ctx: kmac.Context + #partial switch mac_alg { + case .KMAC128: + kmac.init_128(&ctx, key, nil) + case .KMAC256: + kmac.init_256(&ctx, key, nil) + } + kmac.update(&ctx, msg) + kmac.final(&ctx, tag_) + case .SIPHASH_1_3: + siphash.sum_1_3(msg, key, tag_) + case .SIPHASH_2_4: + siphash.sum_2_4(msg, key, tag_) + case .SIPHASH_4_8: + siphash.sum_4_8(msg, key, tag_) + } + + ok = hexbytes_compare(test_vector.tag, tag_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(tag_)) + log.errorf( + "%s/%d: tag: expected %s actual %s", + alg_str, + test_vector.tc_id, + test_vector.tag, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "%s: ran %d, passed %d, failed %d, skipped %d", + alg_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +@(test) +test_pbkdf2 :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + log.debug("pbkdf2: starting") + + files := []string { + "pbkdf2_hmacsha1_test.json", + "pbkdf2_hmacsha224_test.json", + "pbkdf2_hmacsha256_test.json", + "pbkdf2_hmacsha384_test.json", + "pbkdf2_hmacsha512_test.json", + } + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Pbkdf_Test_Group) + load_ok := load(&test_vectors, fn) + testing.expectf(t, load_ok, "Unable to load {}", f) + if !load_ok { + continue + } + + testing.expectf(t, test_pbkdf2_impl(&test_vectors), "pbkdf2 failed") + } +} + +test_pbkdf2_impl :: proc( + test_vectors: ^Test_Vectors(Pbkdf_Test_Group), +) -> bool { + PREFIX_PBKDF_HMAC :: "PBKDF2-HMAC" + FLAG_LARGE_ITERATION_COUNT :: "LargeIterationCount" + + alg_str := strings.trim_prefix(test_vectors.algorithm, PREFIX_PBKDF_HMAC) + alg, ok := hash_name_to_algorithm(alg_str) + if !ok { + return false + } + alg_str = strings.to_lower(alg_str) + + log.debugf("pbkdf2/hmac-%s: starting", alg_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "pbkdf2/hmac-%s/%d: %s: %+v", + alg_str, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("pbkdf2/hmac-%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) + } + + if slice.contains(test_vector.flags, FLAG_LARGE_ITERATION_COUNT) { + log.infof( + "pbkdf2/hmac-%s/%d: skipped, takes fucking forever", + alg_str, + test_vector.tc_id, + ) + num_skipped += 1 + continue + } + + password := hexbytes_decode(test_vector.password) + salt := hexbytes_decode(test_vector.salt) + + dk_ := make([]byte, test_vector.dk_len) + pbkdf2.derive(alg, password, salt, test_vector.iteration_count, dk_) + + ok = hexbytes_compare(test_vector.dk, dk_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(dk_)) + log.errorf( + "pbkdf2/hmac-%s/%d: shared: expected %s actual %s", + alg_str, + test_vector.tc_id, + test_vector.dk, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "pbkdf2/%s: ran %d, passed %d, failed %d, skipped %d", + alg_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +@(test) +test_ecdh :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + PREFIX_TEST_ECDH :: "ecdh_" + SUFFIX_TEST_ECPOINT :: "_ecpoint" + + files := []string { + "ecdh_secp256r1_ecpoint_test.json", + "ecdh_secp384r1_ecpoint_test.json", + "x25519_test.json", + "x448_test.json", + } + + log.debug("ecdh: starting") + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Ecdh_Test_Group) + load_ok := load(&test_vectors, fn) + testing.expectf(t, load_ok, "Unable to load {}", f) + if !load_ok { + continue + } + + alg_str := strings.trim_suffix(f, SUFFIX_TEST_JSON) + alg_str = strings.trim_suffix(alg_str, SUFFIX_TEST_ECPOINT) + alg_str = strings.trim_prefix(alg_str, PREFIX_TEST_ECDH) + testing.expectf(t, test_ecdh_impl(&test_vectors, alg_str), "alg {} failed", alg_str) + } +} + +test_ecdh_impl :: proc( + test_vectors: ^Test_Vectors(Ecdh_Test_Group), + alg_str: string, +) -> bool { + ALG_P256 :: "secp256r1" + ALG_P384 :: "secp384r1" + ALG_X25519 :: "x25519" + ALG_X448 :: "x448" + + // XDH exceptions + FLAG_PUBLIC_KEY_TOO_LONG :: "PublicKeyTooLong" + FLAG_ZERO_SHARED_SECRET :: "ZeroSharedSecret" + + // ECDH exceptions + FLAG_COMPRESSED_POINT :: "CompressedPoint" + FLAG_INVALID_CURVE :: "InvalidCurveAttack" + FLAG_INVALID_ENCODING :: "InvalidEncoding" + + log.debugf("ecdh/%s: starting", alg_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf("ecdh/%s/%d: %s: %+v", alg_str, test_vector.tc_id, comment, test_vector.flags) + } else { + log.debugf("ecdh/%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) + } + + raw_pub := hexbytes_decode(test_vector.public) + raw_priv := hexbytes_decode(test_vector.private) + + curve: ecdh.Curve + priv_key: ecdh.Private_Key + pub_key: ecdh.Public_Key + + is_nist, is_xdh: bool + switch alg_str { + case ALG_P256: + curve = .SECP256R1 + // Ugh, ASN.1 :( + l := len(raw_priv) + if l == 33 { + if raw_priv[0] == 0 { + raw_priv = raw_priv[1:] + } + } else if l < 32 { + // left-pad.odin + tmp := make([]byte, 32) + copy(tmp[32-l:], raw_priv) + raw_priv = tmp + } + is_nist = true + case ALG_P384: + curve = .SECP384R1 + // Ugh, ASN.1 :( + l := len(raw_priv) + if l == 49 { + if raw_priv[0] == 0 { + raw_priv = raw_priv[1:] + } + } else if l < 48 { + // left-pad.odin + tmp := make([]byte, 48) + copy(tmp[48-l:], raw_priv) + raw_priv = tmp + } + is_nist = true + case ALG_X25519: + curve = .X25519 + is_xdh = true + case ALG_X448: + curve = .X448 + is_xdh = true + case: + log.errorf("ecdh: unsupported algorithm: %s", alg_str) + return false + } + + if ok := ecdh.private_key_set_bytes(&priv_key, curve, raw_priv); !ok { + log.errorf( + "ecdh/%s/%d: failed to deserialize private_key: %s %d %x", + alg_str, + test_vector.tc_id, + test_vector.private, + len(raw_priv), + raw_priv, + ) + num_failed += 1 + continue + } + + if ok := ecdh.public_key_set_bytes(&pub_key, curve, raw_pub); !ok { + if is_nist { + if slice.contains(test_vector.flags, FLAG_COMPRESSED_POINT) { + num_passed += 1 + continue + } + if slice.contains(test_vector.flags, FLAG_INVALID_CURVE) { + num_passed += 1 + continue + } + if slice.contains(test_vector.flags, FLAG_INVALID_ENCODING) { + num_passed += 1 + continue + } + } + if slice.contains(test_vector.flags, FLAG_PUBLIC_KEY_TOO_LONG) { + num_passed += 1 + continue + } + + log.errorf( + "ecdh/%s/%d: failed to deserialize public_key: %s", + alg_str, + test_vector.tc_id, + test_vector.public, + ) + num_failed += 1 + continue + } + + shared := make([]byte, ecdh.SHARED_SECRET_SIZES[curve]) + + ok := ecdh.ecdh(&priv_key, &pub_key, shared) + if !ok { + if is_xdh && slice.contains(test_vector.flags, FLAG_ZERO_SHARED_SECRET) { + num_passed += 1 + continue + } + // unused: x := transmute(string)(hex.encode(shared)) + log.errorf( + "ecdh/%s/%d: ecdh failed", + alg_str, + test_vector.tc_id, + ) + num_failed += 1 + continue + } + + ok = hexbytes_compare(test_vector.shared, shared) + // "acceptable" results are fine from here because we have + // checked for the all-zero shared secret XDH case already. + if !result_check(test_vector.result, ok, false) { + x := transmute(string)(hex.encode(shared)) + log.errorf( + "ecdh/%s/%d: shared: expected %s actual %s", + alg_str, + test_vector.tc_id, + test_vector.shared, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "ecdh/%s: ran %d, passed %d, failed %d, skipped %d", + alg_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} diff --git a/tests/core/crypto/wycheproof/schemas.odin b/tests/core/crypto/wycheproof/schemas.odin new file mode 100644 index 000000000..754ca06b2 --- /dev/null +++ b/tests/core/crypto/wycheproof/schemas.odin @@ -0,0 +1,200 @@ +package test_wycheproof + +import "core:bytes" +import "core:encoding/hex" +@(require) import "core:encoding/json" +@(require) import "core:log" +@(require) import "core:os" + +Hex_Bytes :: string + +hexbytes_compare :: proc(x: Hex_Bytes, b: []byte, allocator := context.allocator) -> bool { + dst := hexbytes_decode(x) + defer delete(dst) + + return bytes.equal(dst, b) +} + +hexbytes_decode :: proc(x: Hex_Bytes, allocator := context.allocator) -> []byte { + dst, ok := hex.decode(transmute([]byte)(x), allocator) + if !ok { + panic("wycheproof/common/Hex_Bytes: invalid hex encoding") + } + + return dst +} + +Result :: string + +result_check :: proc(r: Result, ok: bool, is_strict := true) -> bool { + switch r { + case "valid": + return ok + case "invalid": + return !ok + case "acceptable": + return !is_strict && ok + case: + panic("wycheproof/common/Result: invalid result string") + } +} + +result_is_valid :: proc(r: Result) -> bool { + return r == "valid" +} + +result_is_invalid :: proc(r: Result) -> bool { + return r == "invalid" +} + + +// The type namings are not following Odin convention, to better match +// the schema, though the fields do. + +load :: proc(tvs: ^$T/Test_Vectors, fn: string) -> bool { + raw_json, err := os.read_entire_file_from_path(fn, context.allocator) + if err != os.ERROR_NONE { + log.error("failed to load raw JSON") + return false + } + + if err := json.unmarshal(raw_json, tvs); err != nil { + log.errorf("failed to parse JSON: %v", err) + return false + } + + return true +} + +Test_Vectors :: struct($Test_Group: typeid) { + algorithm: string `json:"algorithm"`, + generator_version: string `json:"generatorVersion"`, + number_of_tests: int `json:"numberOfTests"`, + header: []string `json:"header"`, + notes: map[string]Test_Vectors_Note `json:"notes"`, + schema: string `json:"schema"`, + test_groups: []Test_Group `json:"testGroups"`, +} + +Test_Vectors_Note :: struct { + bug_type: string `json:"bugType"`, + description: string `json:"description"`, + links: []string `json:"links"`, +} + +Aead_Test_Group :: struct { + iv_size: int `json:"ivSize"`, + key_size: int `json:"keySize"`, + tag_size: int `json:"tagSize"`, + tests: []Aead_Test_Vector `json:"tests"`, +} + +Aead_Test_Vector :: struct { + tc_id: int `json:"tcId"`, + comment: string `json:"comment"`, + key: Hex_Bytes `json:"key"`, + iv: Hex_Bytes `json:"iv"`, + aad: Hex_Bytes `json:"aad"`, + msg: Hex_Bytes `json:"msg"`, + ct: Hex_Bytes `json:"ct"`, + tag: Hex_Bytes `json:"tag"`, + result: Result `json:"result"`, + flags: []string `json:"flags"`, +} + +Hkdf_Test_Group :: struct { + key_size: int `json:"keySize"`, + tests: []Hkdf_Test_Vector `json:"tests"`, +} + +Hkdf_Test_Vector :: struct { + tc_id: int `json:"tcId"`, + comment: string `json:"comment"`, + ikm: Hex_Bytes `json:"ikm"`, + salt: Hex_Bytes `json:"salt"`, + info: Hex_Bytes `json:"info"`, + size: int `json:"size"`, + okm: Hex_Bytes `json:"okm"`, + result: Result `json:"result"`, + flags: []string `json:"flags"`, +} + +Mac_Test_Group :: struct { + key_size: int `json:"keySize"`, + tag_size: int `json:"tagSize"`, + tests: []Mac_Test_Vector `json:"tests"`, +} + +Mac_Test_Vector :: struct { + tc_id: int `json:"tcId"`, + comment: string `json:"comment"`, + key: Hex_Bytes `json:"key"`, + msg: Hex_Bytes `json:"msg"`, + tag: Hex_Bytes `json:"tag"`, + result: Result `json:"result"`, + flags: []string `json:"flags"`, +} + +Ecdh_Test_Group :: struct { + curve: string `json:"curve"`, + tests: []Ecdh_Test_Vector `json:"tests"`, +} + +Ecdh_Test_Vector :: struct { + tc_id: int `json:"tcId"`, + comment: string `json:"comment"`, + public: Hex_Bytes `json:"public"`, + private: Hex_Bytes `json:"private"`, + shared: Hex_Bytes `json:"shared"`, + result: Result `json:"result"`, + flags: []string `json:"flags"`, +} + +Eddsa_Test_Group :: struct { + public_key: Eddsa_Key `json:"publicKey"`, + public_key_der: Hex_Bytes `json:"publicKeyDer"`, + public_key_pem: string `json:"publicKeyPem"`, + public_key_jwk: Eddsa_Jwk `json:"publicKeyJwk"`, + type: string `json:"type"`, + tests: []Dsa_Test_Vector `json:"tests"`, +} + +Eddsa_Key :: struct { + type: string `json:"type"`, + curve: string `json:"curve"`, + key_size: int `json:"keySize"`, + pk: Hex_Bytes `json:"pk"`, +} + +Eddsa_Jwk :: struct { + kid: string `json:"kid"`, + crv: string `json:"crv"`, + kty: string `json:"kty"`, + x: string `json:"x"`, +} + +Dsa_Test_Vector :: struct { + tc_id: int `json:"tcId"`, + comment: string `json:"comment"`, + msg: Hex_Bytes `json:"msg"`, + sig: Hex_Bytes `json:"sig"`, + result: Result `json:"result"`, + flags: []string `json:"flags"`, +} + +Pbkdf_Test_Group :: struct { + type: string `json:"type"`, + tests: []Pbkdf_Test_Vector `json:"tests"`, +} + +Pbkdf_Test_Vector :: struct { + tc_id: int `json:"tcId"`, + comment: string `json:"comment"`, + password: Hex_Bytes `json:"password"`, + salt: Hex_Bytes `json:"salt"`, + iteration_count: u32 `json:"iterationCount"`, + dk_len: int `json:"dkLen"`, + dk: Hex_Bytes `json:"dk"`, + result: Result `json:"result"`, + flags: []string `json:"flags"`, +} diff --git a/tests/core/download_assets.py b/tests/core/download_assets.py index b39aa059e..c280bb9c2 100644 --- a/tests/core/download_assets.py +++ b/tests/core/download_assets.py @@ -6,8 +6,11 @@ import os import zipfile import hashlib import hmac +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') -TEST_SUITES = ['PNG', 'XML', 'BMP', 'JPG'] +TEST_SUITES = ['PNG', 'XML', 'BMP', 'JPG', 'Wycheproof'] DOWNLOAD_BASE_PATH = sys.argv[1] + "/{}" ASSETS_BASE_URL = "https://raw.githubusercontent.com/odin-lang/test-assets/master/{}/{}" HMAC_KEY = "https://odin-lang.org" @@ -285,6 +288,344 @@ HMAC_DIGESTS = { 'emblem-1024-gray.jpg': "4c25aaab92451e0452cdb165833b2b5a51978c2571de9d053950944667847666ba198d3001291615acda098ebe45b7d2d53c210c492f077b04a6bfe386f8a5fd", 'unicode.xml': "e0cdc94f07fdbb15eea811ed2ae6dcf494a83d197dafe6580c740270feb0d8f5f7146d4a7d4c2d2ea25f8bd9678bc986123484b39399819a6b7262687959d1ae", + + 'a128cbc_hs256_test.json': "4d2c8e5c9c669dba8f4ca88398efaa03003a1f0350a50df6ad94fbc5d93cb9b9ab6f96b727e1bf85298e98b5d5cf2538d38fab745ceca65cd35bf8dd7562ce87", + 'a192cbc_hs384_test.json': "3de5725108dc43dfe49571de089488de035631ff378c7708bd51fcdc854f306ca47cf731c65e45662759c8aed232f5111101d6c33836d9c2f8f700e775b8aa82", + 'a256cbc_hs512_test.json': "ea178a43c0bdf5ba8be435364424829e6d507bd90d5fd946b7c0f95190377f97de9b54c000049ca380d71d64b5e28e3d8977132143243e05559d878311c84c02", + 'aead_aes_siv_cmac_test.json': "b6de9c2559952f0eef286c1d28fd03c2cad4b73f006d3f74fc9f3de9a2c6d213c1851e126d29aa2d40ead31a01caaf301e00bacda7febbf303eabc76097396b4", + 'aegis128L_test.json': "be6f45c99c7814626c108f668aff5577196e8f9500074b3bef2541b16396c6444116108aecb61f0a1fa043a45e9216319fe4e82794eed93c95838e491b1d5571", + 'aegis128_test.json': "334996ec6b297bcb3410d13cfe10d63d884c8e90219a958d50b05adb0ff45acf80a215ca34de92756964f4cadf487734bd8443d67f668e292edd24228e55a8cc", + 'aegis256_test.json': "e134580630fa642024f7b8666f05d53b7e013c6f34614f9e5df1fa272348c8cf30e9ec34d1c7fffcb0c40f13e6a2ac1273e54670ecb6a6851e1ae59f0b6dc623", + 'aes_cbc_pkcs5_test.json': "42ad3d7ccc3409521db3b7d4bcc812b56d5656b0425f93a8d22ada118ee5a1b55c644b162d8074db36dd69b97dce27c8099b0571724eacf0b34bbbb59b4d9e79", + 'aes_ccm_test.json': "ad1585b5fe8a5ba90f5ae825f7c318da47d82ad63e98440ecb981ebad9746fdb2139e7801f6f714b3971e5f97a917714d857cda38e66d5b19eb718c404419c8c", + 'aes_cmac_test.json': "dfcf3e6effe5c7e2a44c4bd7c39fbff2b3537064f39e1407c28e47e5d4ee7fa29ef4225e44ed83b6b4ef24b87e4cecb84342528ff4d0ec28db529a8d3a1b47e4", + 'aes_eax_test.json': "b6ed02c28bd5945feef804ce9af8145f4313bbe6e5c0c4bd09e4138a1b618fe4a48f4fb80359f4dec41e26657840f3e8a9a333fd5edc8a0201924ee49a9b1d37", + 'aes_ff1_base10_test.json': "24c3d89a097b993902fe7913d92d1250f11a4371d2376c6715db1f7ca5e958a4bf52bff70b86c0cd6001acd7d12737d67e8ce78548a9c5b8e628bf7cff004a49", + 'aes_ff1_base16_test.json': "cd4eb61faee16b09f6f6fc99bfbe29439dec618a710b2a4de291ae44c1c8692f6084910abcc0e1445f022942c22b1078cc860b4696b2aab6e4379e8e63dc6188", + 'aes_ff1_base26_test.json': "6f3e6239ce0c0e5213d1c706082989a31519e9198d4f72f2cce8029e2b91aefd5bc522e2040fe807581bc026da659a7cd1c93095382441c3f40bbbeb4ada7f74", + 'aes_ff1_base32_test.json': "84b725e1b89ef9e6e28dd3915b5dd5a6d8858cb119cc5e5c91a94311ebe6c68b833005af227ef50987347a1b9f853ede7aa3b250ba9127ee74cbe0f1ee3d8c31", + 'aes_ff1_base36_test.json': "f1189ce66cfb610520eb0d9383d2dddf39a2ba04b82eae803c31b59cbddab42bd82f18a1aaacc8206f3ff7bb1dd9a75095534d6f3295baa3a9560f85f279dac2", + 'aes_ff1_base45_test.json': "bf370df32834cafe7e71e638d1c034f4540221f052d1a57d8e4ed7e0cbce0dc04d9752246909befcaef8bde6bd43c4336af9d36b2899bfb158becc60bd1b3e35", + 'aes_ff1_base62_test.json': "2f74c4f052e9eb70fbc52229a9e7d73313cf7ffa8ece832d4bbe6923a662e2efe549f1c6959440e2aef32cb682d44dbc3d25afe9f46cf60f3cb49494b94cecc9", + 'aes_ff1_base64_test.json': "284ce27d4903d94d6e5216290460388749e959f34ab7a4cc5080634f1067fe6c2fadcc9f65aa716793a21e3828b5fa364b5172428b48ae08a38b74c217a89053", + 'aes_ff1_base85_test.json': "81c67c4547a39b95db863fe6115d5258d59b345c29f9714f863666b578092a985a1c3af6e140b811c0a501fb70fb5ff23fb3688cd4f31bb47b471a8e4a46ca6e", + 'aes_ff1_radix10_test.json': "121ffd39b271aa4ba33d0cca7c8d53a5854825c6c03d91c115b8c0072f50219e60ccfc039297693b2f38cb0878a2198847f212d4f6401c56adc58c2b3b4693d3", + 'aes_ff1_radix16_test.json': "d77f9ca3f0e31192c932e8efe2995ce08ae29c214f811220ca817937643d44c71f66ee3775a7b28a5f6cfcff087d864e91077dcec1294c8e7e56a5913c824c67", + 'aes_ff1_radix255_test.json': "59201883feddf63968ba6cb685704345ef4a265451e617059df854089e299b6540e32f02171ed84a4d3321eb68da3730f3e2fc0c42d694dd3570f4e3c6ccdf9f", + 'aes_ff1_radix256_test.json': "d89f6b91c278af43634db849a981551aad2b8ec9012cb787cb37cf08a5c0e37569202220cbbc9f68857c01f2b307b3ec6a9c255bb5349dd733a5262d402601c5", + 'aes_ff1_radix26_test.json': "e21360f98d3bb6fb3e810a844a71e7870dc9892d14c9aa72e9e1c2158a7bae0f2458cc430aca4143f5fdd801a3d0ba256503a7e39a0aba9829e12a6fc4c6135a", + 'aes_ff1_radix32_test.json': "b5c74059593c85e902b76eca70bb43683503c7a510f964548830fefb07c71875a79ed0d8bc57df3ff19d3fc0aa6ca383d7a640419c00827bd9a3a44bbc38a541", + 'aes_ff1_radix36_test.json': "ca8e530579bcdbba9edad518bf9487bc8cecdbb0f41a523e292cbf1edbd4d48135b04cbc956b46bcdc2ce4749af3a1d223a69622cd1897ae28c03b4a42cf5f3b", + 'aes_ff1_radix45_test.json': "6711c5ec7e5bb9d855d12f8dc2b2f863b1d22de03322fda7878ad9350834985e134fda6157adbf87f3284111ff34bde9ca325e155e2f779ac5f32f0ec86d01d1", + 'aes_ff1_radix62_test.json': "ded71ce5521e8603b7cefeeadbf448dca6d80394bb73e037e31c7f2018b55c2d1fad727a0969d94d40a3ab3d4d080ce0617b28bc7f2acdfd239e0e281d6420a2", + 'aes_ff1_radix64_test.json': "8f663baf03b24e4d81441a5bee3421c268054c4ae175683698e7410a031275d42f25c13e0d0843c6da53e71abd201ce2e53ad4a928e82ff3eaffa2011ba967ef", + 'aes_ff1_radix65535_test.json': "9260f514add588a56391bd485b8ce97ebb0592e86bc09b050572368681be7f737f1aedd6ab4ad4bb72fb1a5c2168658243d12da0c167eb16c92e361301393721", + 'aes_ff1_radix65536_test.json': "2ffe5c12f6f55c363a3fc5d030d5c2eb7d8d71c14184f069bed0b3d349321831043eb23a35e5a9b79e3f04a8de196bd37438824534a1ba9afeb5ecf29aaa5869", + 'aes_ff1_radix85_test.json': "ba5be98fdf9154ac0d7c1369ea7bdd570c7959e45a1be960e6681974f52e4c77ad71eafe68a86c35974e5ec42accdafb35e638a522298fa4ed146f5c3b31cfbb", + 'aes_gcm_siv_test.json': "fbd2c29f40d396a247f1c5aa2e8823a6d00e1ceaa390bf0900fa99b793801fa2f3b44a8558d8b178a720fdd003a31ecab8598c7d4c709b783cf29d4a1f1c1fee", + 'aes_gcm_test.json': "5a41e50d865cf2e4a206bf96e05bb4f67d74ecd519480ca372d662c64d26dbc954f530c65fd477992de3600c978d3a6447b9e9dbf511a9b2c2ffdac28fbb1d95", + 'aes_gmac_test.json': "3226a4f531c8427a9604591e4486e4fb706ab0b57488ef53415303a503b5409c0f4852add453895434cc94771f59a87604dd15d47c861fd904d4bee0e0921b5c", + 'aes_kwp_test.json': "f9473060ba0e4e24c0b1938a38d1aed9333ae32109132c0c69701d9e706a8c21579444c046546e218d6982d3d90d5cafc2a99d31e3be432b13dda0b9f627a635", + 'aes_siv_cmac_test.json': "a5025be2398884ef5d6b2431db6bb90b9096dbde77f06c353b78d1b35e82f6d5a8e701a025685f95d8412998800293498643017ddc792cee3360c943bbe6590c", + 'aes_wrap_test.json': "b569c6aaac4e01df7e91f2ec942f4a32ea17ec789efe50ba640be5596519e1533dd15aba1dfd3aa2ff29077cfd800caf76adc15e1d8e5f31b10492a96a06175e", + 'aes_xts_test.json': "66ba73b3270436f8706f32e8d7fdb7e47f5638d10db83cf9311feecf70ac3ff1d66ff9aea528250b92e01177786f90fd06e8df72404de2e5c14ecf4aabc6e790", + 'aria_cbc_pkcs5_test.json': "9e8c33fc364d6fec2b541c542d6f822354c3deab61afc37b3c0881388e82e9b1e9c87f28fb6caa639edc765ba362fb98324a232c7f2f7492f6cc794bf57d66a0", + 'aria_ccm_test.json': "28bf6139961f41c8bfedf130cf327ac3012c1116f4dbf820416a912f4928ac8e1e4bf9aa0d7681f9ea43de264125fcd3fdb29d4f9ab9d27a0a72287a85d890bd", + 'aria_cmac_test.json': "1de6a919708adf65b96ade5dbb29a95e894e904f7f6f1a58cba08da927460982bae16ae8fa167f89a3a2889458b6adfba2a39e07990b0c589db06dbea26b6941", + 'aria_gcm_test.json': "663770e79111916abc82309245e64d90a2a75e409aefc17e6965cd183dc843fd810d61f49a3ae8ceaa216cfb9d44782130796f579c5eac75efbe43875678d891", + 'aria_kwp_test.json': "65db98e93fc0a7f4bedb3d8056c5bebf35de24e7bf7059299298e520791e232799e5b8dd733d928c349d6345f74b45c5c44f207a3cf1027d2c7c172ca8eeacb5", + 'aria_wrap_test.json': "4f1ad34ef5819383d5b999abf3fdaaf66c5801d851e83425162aa77d9873478fbab30be31a23955a1e279052e147ab6984de9c48f63d4d5c9732defb5f15e9a6", + 'ascon128a_test.json': "6ee774046ff065ad60c56bffe644ee97b6c617b62a8e291c476854895eb5c49e8c83bcf85fe86a0ad0656e0564bd90bf4ce812e0870c463c2fa50e6fe5672fec", + 'ascon128_test.json': "73d81b184dd53fee8f479d99478943349e5a2dbb997c4aa37482fa17d128e4f8664f8f06a0c2ac7f9668b0ab12b2d1378808c6d2b3b96f01225dc41a83366b0d", + 'ascon80pq_test.json': "dc2d8093cc93537e11d2672508035b4a366878a8b1e3b2d6bdd6bcd87915cff4835c704ced257e841dbc459e223ad8b5e3db21862626263fe9666e7bdfdc6841", + 'camellia_cbc_pkcs5_test.json': "01951132ec42955ce8eb74c1f431f7104212be90e345d16cc01a3cd4639e882f00947fa1009d8500d5b73a76b288cff2ebed7e176662cc862fbe8ddeb3a0fae8", + 'camellia_ccm_test.json': "1ac5a769ace83143ec341d4205e42c8dca037c6242af631c04f6590ecf6895420a14ed70910119bdbe1a9272fb703a7cf4df97943087b2db42775cc78fb189a5", + 'camellia_cmac_test.json': "ce8ca04c8b8316c56076ea913befa8d468d5a92266d3f381930b5fba4832d7be72046ce9c988ef8103ac0c350187ec8c146ef090a21540df6933dd1c31bab78a", + 'camellia_wrap_test.json': "6d261b753a88a10cb813ed9b4ebb25265306582f36998a6761dfa930293d4d3508df609b117aa0d278167fa9ab2e4327165adeff57835935964ecfec5c07307e", + 'chacha20_poly1305_test.json': "4edc434f10a9b026c98901aa7a48933e0de03d24f2445ecd9cb30c2e063390f97ff7e0b58b12135a231845e5771cc38c22b07ae814f85cee14f62d6a68ceeaac", + 'dsa_2048_224_sha224_p1363_test.json': "3de70432fb46585a0d980b124f33fb15ad5bb700d417ee2d051d00a1521507454ee9d1c41ccac04d79a3a76ae4442f4511cfbbfee66c092348d7c9762309d83c", + 'dsa_2048_224_sha224_test.json': "27149b08174f990da4152ff6efefe12c0008e8d24d3385c743d7d5bcaaa97b948da14703156c4142aacdfb324a276f87c1ccffd051fc6261ebc3deec4e9fa101", + 'dsa_2048_224_sha256_p1363_test.json': "7605f35381b9802104810b95e34835de72863ed4898cb56d004d55e7523fa5e12552460594ab0bd62c69ac8156113bffccb3118bfeb78f22566e3a210d96bf75", + 'dsa_2048_224_sha256_test.json': "c57b50d45969cfbe3ec80fb315179887e48e3b743e4d0c9c0384fb4a19220a7159c4033fc077d98266dde50424a0e186faec875408bfbe80d8c63b5bf00bfece", + 'dsa_2048_256_sha256_p1363_test.json': "4ca9c67c5bd4f220025d5725e06b63fb66f2b761f47fac94c84dfb97d433097c6138bd0868ccefa53f5da73d1020e1287dc7152143b125ca141ad27cb5b46c07", + 'dsa_2048_256_sha256_test.json': "67d1860659160aee1d13a2008f370db7afdea022278733b6c64e5204efe6aeefb175cb2e4b4f02fbcb845c010e1041757c37386016fc30143c9f13bc55ff8330", + 'dsa_3072_256_sha256_p1363_test.json': "806d22e4676f4890be78517f64279ba94b2a4d723985ec6002ed05deddda8610518588422a424410d32f3ed4c93b6ea7b0e8b2dfdc0eab8658b88e47041f9374", + 'dsa_3072_256_sha256_test.json': "2a24217dd91e159657c7ab24e26b6f9869a77208ef1c898433d9e10bbb5fd1f00b69e6a3b0ba4c336a8c02fa9208723b5ff782395baf1cd9d7556897cce93975", + 'ecdh_brainpoolP224r1_test.json': "0b654d630ad6bf1faf177631daea94b6d68a17fce1e5da0ab0e12702e206b7fc982aff4d331c6b0e55da536f2b648f06dfea0f10cec7b9d5c7845b1da0591732", + 'ecdh_brainpoolP256r1_test.json': "3df7d06433c5f85bcc834e598d63ba7ca611f859b1102bcdb0363421f0e8bb60154b13dd3639020504dc80ef44ec1aaa72529467ed503d646ec49b3d566b8b0d", + 'ecdh_brainpoolP320r1_test.json': "e3a8cc1e2e028d0cf5926dd507825c863c24ebcbfee685430d80277300bcaca3eb37a1a937b47007e4479bac69bdcd80e83cf3ab583566024b2c15add713311d", + 'ecdh_brainpoolP384r1_test.json': "8161986b7d3d061647a051b176306ca7f5f6a7ed55af77a676e3711b8ce9b4c036ddb65aac3a1789c5366fcb4b048946f4c8611fa0fc8af7deb37ec24ea97fa7", + 'ecdh_brainpoolP512r1_test.json': "0cec6745113ff9e5b79649470dbfaa95e059cf46cce4cc4ebf5f41ec93bd10974ca17e12aba54f75ea9691ccc50a1f8a031f7dc22cc03c17606e2a9258d8b3bc", + 'ecdh_secp224r1_ecpoint_test.json': "63ffedb647198fd97a2aa532175472442169d2c002aac88c8327625fcbe85631614431b5b24172a069311ebbe6ae0aff55f71ac601ec706066caf5268dcd639c", + 'ecdh_secp224r1_pem_test.json': "50e094fde7bb6077e7f378be72b03067ab9509aad6e4d473e982d5d3e710236889e81f10158240d9ea74a835b3f4c1cc6a17ef2deaa8715e1b23b77296f1567b", + 'ecdh_secp224r1_test.json': "ed1d7c38f5203df529252f01ad7a29c91beb1ea8724d46b7e5c819f9447f9dd28575b97802e17fb12ed9b65f72c10aacdb83e10c5b30c43486a4f37b6440a365", + 'ecdh_secp256k1_test.json': "efdde98724a6aa908fb588d79c0ad0dee83534105368b281964223c12e775f947adca5e910dfe457d3da84d8393549c0d753763f4a9461589b60d8adc1b88943", + 'ecdh_secp256k1_webcrypto_test.json': "d019b26616a43bbcb9ae42057b6526cdea94025572d141a0644d20547175b845326328dcfef320a9b66b6a6d18e644932336d958372a7be6cc6677c06a3393bd", + 'ecdh_secp256r1_ecpoint_test.json': "08a3a91f8269082f1557275e14ddd10270d03d04a2e394a1951c7364042f1ab66c7679df4e86869444fa7704d4f546d8ccae597992532539e53e405a080be7cc", + 'ecdh_secp256r1_pem_test.json': "adda0a1ba574fa2e27279d2ab796816dc57c2479ac389c83db2e9467ec3a727d10cb8f05e04741e7cbfcc4966c075ed56ee6f038d3afc09b6e5377b7b035a27d", + 'ecdh_secp256r1_test.json': "89eeee692fe4b898530e25c07d4417287cf326f1cafd0a4f1b3e3a206f4faba8a571a6805d31c7106424c597d8131b5201a5f4e0fd64dfa2cb73775f657066be", + 'ecdh_secp256r1_webcrypto_test.json': "ab289f42fa6a031ee8569f0a67bba6035f43616a369ae3ea88b5b43356a629b739e8fad3b01fe3055d0f8ba1322f25f94fbfbc8942eaa1a69e0766911dd77401", + 'ecdh_secp384r1_ecpoint_test.json': "fc8568f074fa963489d205db2ae25061b725128755b822821d52b2995750882ae1b9be9f5c5daf53b1ff6ae8de223d22d96a64ec5e336c4e671300ad6450cbc0", + 'ecdh_secp384r1_pem_test.json': "b9560104ddb35aa7d2454d140dbf71266af689b0298a77d86092766e950fc1a6c99adeaa875be8c5c27fc0ebaf9d4d97f2dc77c45032f7b1d4de030a8f552eb5", + 'ecdh_secp384r1_test.json': "60c50e940f92bad9b6ceb4e8cb98cba97774e6bbe62490b4fef53a81a8bf1eac0e8ff18b8250413e7b395dd607bf3946f296adc3e2274747c04481a0ace8158f", + 'ecdh_secp384r1_webcrypto_test.json': "db910d22b74b63b0a94f5ce4cf5231d80fde50410a7c118c2ca23f1ef41bf29bb43045d48890871df8ac6a90de0fd58133277acf63ab0524ffacc447e113616e", + 'ecdh_secp521r1_ecpoint_test.json': "54cfaa89c2c7716fdb89e38734ab1300496bb4b1794f789a837553f1c4112c65c2498572f101ce16d0000e4ee5e1f1d39a1e1135749101a7c165df8c502b1a2a", + 'ecdh_secp521r1_pem_test.json': "076b10984795e5e74da179f5d33807707ce305f877c27dbb67cc7009d09ab678ffa2eb730d445121a152566481a040e6a2f8c6b371262694e95ee632268eb8ca", + 'ecdh_secp521r1_test.json': "2c578c3588b0dded23bc1f6b2c3c5cd44824d1d955e92eab77c4d107bfa60965991cc74424a2270a182f92e1c0bd22dd30c1e9dede574eae78f7ee1c17d396d6", + 'ecdh_secp521r1_webcrypto_test.json': "3e9c1d6dcf3cfde667a6a0d4c389a7bcb8308095d0f062fb5a633c0a78695789d79f5f8e637dde866cbaa49a7038e690ae7516aa707fd65320feb2b959c32c80", + 'ecdh_sect283k1_test.json': "54607e398d77eccf7526d8aff7d5243b238dc00c06c072a1c30c9ad2226d8d6da659b83194a2e4dd0a62369f27f8f44c9a50bc716780bf26bb5869a529835df7", + 'ecdh_sect283r1_test.json': "295c73b9daba0acc13fca624d2210c5247b704396b2fe8004d8c62bc5e5434dbda478b547b8b9a7176132de88aba46e1917efb45291561bf8251e284bbf3f257", + 'ecdh_sect409k1_test.json': "161840a74cdb562acf49e3e389f743779aac773f2ea3a4e2920b427617211532514cc83788513533cae8487e486787c89e5fe50066e104b43af15aaf46dddc6a", + 'ecdh_sect409r1_test.json': "f43791e15318478221f6692558115c31590567a8b969d55e648711023e4164ce60b1998585fc89a1b07f8922722203cc36c48069565710f0d7897d5c8dcc7d0d", + 'ecdh_sect571k1_test.json': "b944b9de3b6d3954aeeea4b3ef6b9c7e12cbb25bff6acb385062ec8a35c4e7052384d4c14285f8feb870e9b1042237fbc2e7138db013b5b65edd78f795fb695e", + 'ecdh_sect571r1_test.json': "3baa06212ebaef756daee791abbec499ea145dcdbc54758519503550efa2836ea89717b740e59cfc044a61e88ddc2e3892a168f27c27679a1f89701a66999283", + 'ecdsa_brainpoolP224r1_sha224_p1363_test.json': "b5f9fec57916ab49d1373cbf55ef441edc481825993fae3b07c42a38c3646e90d28075b8b1cc35157928be74b875fdc990bfda582f83ac8a68009bb9804890f6", + 'ecdsa_brainpoolP224r1_sha224_test.json': "f352487bb90f666b6adca5e9c41d48f09c28c69404a884fbff3c6780ded73681e31fdaaf0da1d53a9d8fe964ab4678170ab4f5085e5f551f5e56adab2c9a8e2e", + 'ecdsa_brainpoolP224r1_sha3_224_test.json': "ca83567e3e2d62417974066b5cad977b12627418baccdf4dfe9c9a1972af83de6d3869e25a66a986a062862e5cbdfcef2642b72bcc5deb9b78cbbfa3e8d5cef9", + 'ecdsa_brainpoolP256r1_sha256_p1363_test.json': "9a41d67ee9f2353bf9d54928564db3f0804c4704838bc67af33eb70a1dbce4af70e449fcc74f98192bca9ab2eb0879604bac34bb87e832a7984fcb12c6d4cdfd", + 'ecdsa_brainpoolP256r1_sha256_test.json': "94a6da4a541efc83e29758a2f321d4acc937dff585a9f33ce170f66c0f46c8459db12643e56b41bdbe388d0ea0ad3f6b9a7d3d0cbd58aadc81e66eca4ca68210", + 'ecdsa_brainpoolP256r1_sha3_256_test.json': "efca09da2c39791e634fa5910d9ed4fedf9ec22f6858bc65976e4bdfdcf9eb4af2efe793cc39273d2001ed1f5b394826df91a4ee30d37e4f50aec3451b167aff", + 'ecdsa_brainpoolP320r1_sha384_p1363_test.json': "a3483693f6dbaf99e0c7669602b64a5f19a14e3451b84558f8aff6a73988b48b46c02c9b95cd17263dad25e32721f602898eb2369c607dd6debf64eb294dfa36", + 'ecdsa_brainpoolP320r1_sha384_test.json': "bd2b3290124ca707ac214d0ab0b2f7df44cbe33910f5c690485814333c0fb9df95de39eee99ae392e89dfd151aa1389c89248c5e89e5c9fb9002d159159068e7", + 'ecdsa_brainpoolP320r1_sha3_384_test.json': "02ecf9b37ed128edc759b5ee0530960d719bd724fe7ea7f02fd70486e5cb01d9a51e50f9a7cce9e33ac6c053d7b3b6949011863dad17442e5d642825a2004f71", + 'ecdsa_brainpoolP384r1_sha384_p1363_test.json': "05b23eb103e9d9ad92e015db8871edc6f0ae88ac02a2f7e9a582328a75779ee09dbc5e30aadf3f0bc8f6ae28ddbda90d4bd2502fd33e4bc60cf6ce99b5e76c97", + 'ecdsa_brainpoolP384r1_sha384_test.json': "62c3d506c42a25915cfa8ccc3a7a4d17efe4c725ec95caa94973b30257b08009622035d751d676f857f2e8a2923360db1cfc63c5fcc00963ba877d077d39b2fb", + 'ecdsa_brainpoolP384r1_sha3_384_test.json': "91bdc6d6b1374d688ab0da4be495a8b3ffa5e7834422ce9f27a7256dd9ec1b76488c9a1b3949713784a531a06bd49692b721ecd36f88431b90ea03313f07682a", + 'ecdsa_brainpoolP512r1_sha3_512_test.json': "5ddb3f9b65409291a26567ebf28953f788d6dd5f70b0af39153cb7f20e8cd80a23db9c11362bc86a92697f0d9a77903ad528b16fe23b8cfcf310730d71ba24b2", + 'ecdsa_brainpoolP512r1_sha512_p1363_test.json': "e5383f4df48561e5ff91fe87c67a0a002b14c4d0fd70f345933acd6bed23f9dce35ec92c4cfc5c7d4be5bab2b64780e2de3c8147e00b8ce9140e4c2b39e587c6", + 'ecdsa_brainpoolP512r1_sha512_test.json': "bdacf47247e475e0a259c87b96a77032be653c2fc9489534197a80fc736f16ef0f48f4736c45eafbb875f266a4ef0cfd08f0566d6382ba1abb16ffb4ac741dfc", + 'ecdsa_secp160k1_sha256_p1363_test.json': "56b607a6e9faf19e14c27f4f70d64f9786e3c0de50924ad6715bef65bfd5156b1cd401695ca1c3486227a4d3b9de49d81d70900e07169ad36170c38d2e8a53f1", + 'ecdsa_secp160k1_sha256_test.json': "e48c03f62d45e39d2572097282574421447953bed47168928b930b32680bd68be5aaf7ef0ac6c7632c7ef3887985f0bc1788167299c42e5cbabe5925fb5eeaa5", + 'ecdsa_secp160r1_sha256_p1363_test.json': "0ba341b6a70732017971c0ab38c48b264808bb5aab563bb3c66ef31e685f2491abebe3a3f114d541ac3bcc503b59e7f02e8f35536b9ce781b8f6b9c57c72a731", + 'ecdsa_secp160r1_sha256_test.json': "70b593c449b671b3da62d1224a1c7fc372cc34d5a067fb87f70a65d14a236a47121bef499b072acc9ab2c4c70d3a4305c90b89059719ad41dd2473d5fcb7a14b", + 'ecdsa_secp160r2_sha256_p1363_test.json': "277067478dd5b6f3d81da3bdd706a68429d7d8b0ad85d3c0843ab7bf022a0857df05ca628c61e92358162e75c4a505fedf7c0c643382279bf6ac47e7cf2864c0", + 'ecdsa_secp160r2_sha256_test.json': "2f1b0d917d703e0acdfe863078d46f5dd0a51d9e2fa07b2fa34180aa6ca4b175e6a14f6972b9a2eab3523b5c1d11adacec8c92c969671b379f30ef0b9185ba67", + 'ecdsa_secp192k1_sha256_p1363_test.json': "dc703ac1ee295c20df496009c8beaf6b1f1ebf00654c76f335dcd983ce0a19d3e8c2136be3f78ef2294a58b4f953dba53c8da97786064d66ea8e7d85ec77ff0b", + 'ecdsa_secp192k1_sha256_test.json': "132c2a1656a03397d1334048be3bf3d4825c6e08096196b8d5d1c11843b4e543f0a8c898bb7812355ea8774a979f749c8b8f9e5062e1d91c22d7220c678f8846", + 'ecdsa_secp192r1_sha256_p1363_test.json': "4669db3e1921dacab450e901612cc219ea681941f2b18a0f8c874a018dbccb30edfd421ff167b685180cd6e9ba87c684cb6f0a18d6da467b5f2167fcffc94b5a", + 'ecdsa_secp192r1_sha256_test.json': "9d03dc6a28e9e131ec37a2dbcc66b0d7beabd8b8e43af314b2a1bd5b8e731fb4d0706233d17a4a9b5260e638c1c4b5b7e5cd69357eadd1f02ac19f47b82f7cbf", + 'ecdsa_secp224k1_sha224_p1363_test.json': "28417835fc6237dea10e8f747b2a12d3276409a1746994771562d66d80374c571408eb27dcf907adde920748dded41b00482a26ba1b1a00b07efa4b6939467e9", + 'ecdsa_secp224k1_sha224_test.json': "693254ce147e24c082e913862231c2dec907ef280c95543de17cd22893bb5ba47f5fa0b83854848e583941e60e93bf24d925af26f020e743a6ab6a63e73076b6", + 'ecdsa_secp224k1_sha256_p1363_test.json': "971a6632780defc1022a4138b3df8a8335e2b92e91ecf8971404dc4e71a35ac136b2eb1f4d54fa8474bbaff7a67d918a52fb34ab6101cf7d775766d024f06221", + 'ecdsa_secp224k1_sha256_test.json': "79b739ae824a532c5eedd62de60ce14e11a7b7f5ad0550bc7f97bea21e2db9492c0b0538edfa170e40493ae6dca0fa9b0f9f7e182c5bb503405b246de3d06c2a", + 'ecdsa_secp224r1_sha224_p1363_test.json': "5014189fd6535307640f56df4bb4b11ecc040c95cfde90e8d0da92a55fbd6861257566849b899874106171ed40579981a98f1dfa482b72d021c9dbb409bef254", + 'ecdsa_secp224r1_sha224_test.json': "d81458ba50f06d0157e42abb441f12b0be4c409b1430bdee9d6cf8aba2985d596534b606ec17caa3f176d4c2c9a95fea3aa52a3b3dfa136f287c30348f429c5b", + 'ecdsa_secp224r1_sha256_p1363_test.json': "7b8e4264ce143ada9ab97576c63000629701e602a94ca47045b750f55876a68b9502ee6d4adcb03533c58bf9cb78b3ef4ae8c91361543dc02d29acc210c3804e", + 'ecdsa_secp224r1_sha256_test.json': "6e6aca400c5b5c49a9412aec7263fa75b76577abe19a9decdbe350e580211b9ad08b8a757c74b5674f4d3427f95e452fdac1e8551056c8cc37fc0622be3375ba", + 'ecdsa_secp224r1_sha3_224_test.json': "0468c5c71ff3a7a1e8942e570552f718077a54d83e698cffe7635342fe121935358ad70c7c6f8b69bdfc8454204cc3d772367fdb42302262418d867d8683dee8", + 'ecdsa_secp224r1_sha3_256_test.json': "e423747bd477797d04b3196b4d1690751e045e737b4030010a3662a584eef0ce213562e8c204883a5b8901a970d2d6a736a740161793f6ca73bb5d8469f95381", + 'ecdsa_secp224r1_sha3_512_test.json': "094d0d96b38b87f7060cc28cae6158a0a14092648eab4c85b9e701f5c08e0c9a312a500c452cc0cffdfe46482e5c65ee9973643f3a144902557adca00962d5b4", + 'ecdsa_secp224r1_sha512_p1363_test.json': "02c1d323331ad22eb82ddb44d3f29b48285b3cfcfca43d28a2694f912762188f5dbecd968c0bd3ce7a552641e49502db679eba8044c1a0c5fa9c054273384f5c", + 'ecdsa_secp224r1_sha512_test.json': "9bd69463d1e24c9a086cddba4323a1eed6fe34ebc6d0b087c5e40d067260bda62c07250bf4ab8069b95eff2826fdf4abadc01f5f34d9c37a218bb0f77625d151", + 'ecdsa_secp224r1_shake128_p1363_test.json': "4d675b55466f79ae3308a082b07c3631296ffb947c2cbe8033cb52a3ac3f8a83db484f2f22b4c70d5aa345e1140fcab48ab1067d75e3feb2de260a3bc4ef2baa", + 'ecdsa_secp224r1_shake128_test.json': "4b9ea752fce41061c8de045b33127f665d7a53f627c687c82462775f7b2d9e1fc5e531fb3bdf735218a309afa40d4894ac092c2c8620e3ca1c50f300eb26f6d4", + 'ecdsa_secp256k1_sha256_bitcoin_test.json': "88f6be4d25f879097e12cfdad377c2d77a20189e4b5effd8ea866092e2477e8b48e51e4ba8ce55332ca223edecb30fea69b3a3d8748976d28aed98869e80cf21", + 'ecdsa_secp256k1_sha256_p1363_test.json': "38adcb33ea8cd18ceec78a1c0a7c36d3d8ef47303906751fedea0207f4c3cb1fc57fefc109612c30b61c75b3f9eb91cfb56713a745175d0834841cd660cae327", + 'ecdsa_secp256k1_sha256_test.json': "86a211d21b7bd9d6db3e8aa81ad769373f6e18c3fd05c519af217a5a4304c02abc36b70dd306094c7fddfa6489a9c9b5a3e9cedcea28c4081441db1800ff6aec", + 'ecdsa_secp256k1_sha3_256_test.json': "7d649655e9a1aa67b6c275e2547a7dbee605ec487ab292f2f1c67fa8881cdeca841a82a8093217c521ec2bba36cc9c6e05c0cdc4ce64679fa6654a68c76c3782", + 'ecdsa_secp256k1_sha3_512_test.json': "38e1a39e8aa538f33d4facbef07b9fd9793a95c9c5270c2c41dd9a0da9d2b32cd84dd525fd379de94348794cbd82c8feae1a925b0ff323d260cb01f58eb16f3f", + 'ecdsa_secp256k1_sha512_p1363_test.json': "7bfa57b2accc0071db8c849685769eaa0e20c0a35f18469a284d0e27e340a3f7f1198898d5268500b053b60a0e019308a3b9c536a27c95dde581490a5215c438", + 'ecdsa_secp256k1_sha512_test.json': "1c1b635cbd9a56e910959f3a4551247d1c8a42930a418cf0fa8a686d6370c8730a274ff56cfa4b3e338c9321fb94ee5adaf76dd30ac312db0c7ce74c0457c55a", + 'ecdsa_secp256k1_shake128_p1363_test.json': "ddf80ba820144a9d55775d4ef2ff65117f462943988d0e9be4cdf0dc9a013604d8ad0f638866caa66643f6bb3837480270d528eb4c86ca3233d7b70ac1089e03", + 'ecdsa_secp256k1_shake128_test.json': "da83dc544d289622eede109b35c148715e92e36cedf8146b5c5856431302c0bf2696179122e0d4eda54e8cd2447b78d2198c4dd7a1e38ce436a57e6b9298323c", + 'ecdsa_secp256k1_shake256_p1363_test.json': "d3b27fadc3e13ce29c285d50b579f0552175bb7af62b7982fabd4185c114da01581bde46652beb0c5374ad6fa63217d85a3686fdfcd8a04ac524f5779c995bee", + 'ecdsa_secp256k1_shake256_test.json': "f6a04a4e3706be7c85f5186842c193b030d4e4f7359c71e8b3ce3d78f33b62513f68e76aa841caef9c2de4140755cc5227572bab1d5c978b1585036b2c08d4e3", + 'ecdsa_secp256r1_sha256_p1363_test.json': "b69438a1c52b7848c14d42b5497864e028a00ab2b6bd9535c7ccdda8250a71d4fa6aa8efa133de9d04b2f7e8d4e882955dda5b818a87748a6c42e105deb7a9d7", + 'ecdsa_secp256r1_sha256_test.json': "f3bf0aa82757e24bc0a7ff310d070b41beed993fd6ca83712761a398914783c86d76f4a4aad5bac678f980425ce5f4c1cab05c48de5fdaa22261682789ede7b5", + 'ecdsa_secp256r1_sha3_256_test.json': "c95bd5bf590fec6e7e942dde5ef9736cdaa1f4751bb7ef3898e4cd36fba2f27425ca59d239e653cba9757f531e9ba057966d016f30a0b569b24bd5190cdabbc4", + 'ecdsa_secp256r1_sha3_512_test.json': "3f77e25e3d2c0a9ad73d67ed499adce02b98521acb1bcf4b51c8fda545e849bdca0625789ad635846e1691a175101f6749e0c3885f657e8dd34eb416e3935fe0", + 'ecdsa_secp256r1_sha512_p1363_test.json': "4f0e573b4f56cf770cc64e552b86aeee9503a65aa51f6e6faafef5b81646fa773be21b0bdd0e055bfd607c81dc07ad813860461e3bedde9b7b31be33c16d2f71", + 'ecdsa_secp256r1_sha512_test.json': "542bfa5f83b4a44b497859e114f4d326548743d7955ce627fa8583af1ab704f5ba4e219a87154e41bc43cd4896d375070e95b2f76f5292a28ab6947b92d79254", + 'ecdsa_secp256r1_shake128_p1363_test.json': "91d7684cdf93f62aadcbbceab1f925d0fe383081f99232a6894235c662bfbab7142f097593c290e6a2fd6528d5ba6db9c1a0960f81e5481c89e99a27bee19a1b", + 'ecdsa_secp256r1_shake128_test.json': "5a42bb44f2e5a1671a584110f1664806050ad644631e6f1a67ed3beb6c788e5ba8e9e4933e58a11ddad2006d86d4ab02795b6d58236df15e92d4b268ea995336", + 'ecdsa_secp384r1_sha256_test.json': "b19291081e85e8d5411c01feafa3cd75abfea1e81a12ad90ea5f8d54f0c116c1e79b79be9175e8c9ada21aef5826349e417a0ef93a092339c42562b6192c137f", + 'ecdsa_secp384r1_sha384_p1363_test.json': "fe2204047f88ae726ed5188916110296e59930787b5db8b243cc296b96e449b6e4336ca16c20ef464add1a7712d8775aa9eb149e2460b56ebd73d674ef115984", + 'ecdsa_secp384r1_sha384_test.json': "b34934d80b603f5f1c56eeb341015f91e36ace086479aa677e7e32f5cecc5e25d6e2b8e5901968d9c041173bd828e23e06fa264f1ec5d8c7a242b3bdc7dd060f", + 'ecdsa_secp384r1_sha3_384_test.json': "146a5ff3d62dd4a8a75822e435c55913b7b9c8e40fb93447e65c11471034068783dfe4e5af600280a367988aa1b4b73212d98da6e3f720741b03011829afcda0", + 'ecdsa_secp384r1_sha3_512_test.json': "514de7b81e7b466adc3e255583543eb039d9a9254ce112df48509bae2819d77ab828ead9072484f699c7c0343a6688ec69c1764c3a90b15b4d83c23c99649a95", + 'ecdsa_secp384r1_sha512_p1363_test.json': "1e199e57c2c9529e9b719c63791387b0ce58977603853e10a6ebc77b1a8bae38977d6149a5b9ec8a2d34e99aa6be96c0fefae141250410018d0ccc9241bf46f7", + 'ecdsa_secp384r1_sha512_test.json': "e168ce7aa71cb3456a412ba4dcf370ec0d85b683e588e3aaf43e400a374f848fc508c8a6cccf667e64aa6db5811d7bf7614dbb6b20feee0bab410236c730516b", + 'ecdsa_secp384r1_shake256_p1363_test.json': "9c1e9d8f2366c8a166754bb5966829b97bcf7ce24a138df5af98a5f9b9d1cabd8fcaa5588600fe550362b3a43a0eab01b8d240020bbfffeda1b3cf3954c79709", + 'ecdsa_secp384r1_shake256_test.json': "216fc6a38b2cd11c72dbca9a0c91033bfcd08b9d644d2890aabc56f75993928b1d1be42f9d2e516b8e7f91a76c7284ee9a0a7e3cd3a72a2724cfe262021f88b3", + 'ecdsa_secp521r1_sha3_512_test.json': "1d22bd1409174eca101e466bd145b72d24f7d0a3581b748517d7bf715534f6d785cbaf1c5f3f8c340cc3e3577c23e7e34cb0051d6e45690225e0e91cdcf4ab3d", + 'ecdsa_secp521r1_sha512_p1363_test.json': "d69715e60aecc95138071d9d1f3465aa37a98cd8b2d5eb3a7e49a8dd5a9dcd96ff04e61e45eed576eb391aa4eaec48381cd497b85588a11b2f6d6db5222b2eb9", + 'ecdsa_secp521r1_sha512_test.json': "1014452d732f9a33b6acf340a6fd6ad37457059ce97b0e1c3b2f0f6f39bcf2590cbad459a201571da14305b02fcc847c756afd389cd76103fd99ed973dec693c", + 'ecdsa_secp521r1_shake256_p1363_test.json': "b3aa4a85832cdba635d0b55204e71612af4055ab6eccbff575a16ae9645dd8b70da988c8e176ea9f951c157b48c92f04594e9d61a56eeebbf87b80066ad2ab26", + 'ecdsa_secp521r1_shake256_test.json': "26a3cdc7a24e31efd1d5a6818617d6b68865c04b1ecae8214805b1440d0b691564bb0042cce9635fbdc8d3ef6536a175cd6feea883fdd4bc44cabb07f0486a8a", + 'ec_prime_order_curves_test.json': "e736e7353d810e499290d340ac922faa7f1906018279f3127f4383265f6fbe97f84b4c334b20807666a20608bdb6182ab289cef4ddbf192fbc2a2f49d3e71e73", + 'ed25519_test.json': "c3429b58132268803f3766b686a2e15ef52d9e59a3b1d0462c9d8c2ece0ae8d6d9b41d051ab37ea72388519bab78312500ea7e2052b7fce00271c2a86adf9645", + 'ed448_test.json': "63d02608e45125f3b9e72235a465cc4b050e30ac9914befb17f2cd0478791cef2fb5ac5c36773b836b51c1dac3ce3688b90f69e8dd3a404388cc18379ba447be", + 'hkdf_sha1_test.json': "037187bfb616b1938eb11a0b9afcc0152aa806d9fe1dd944d2524660a9d2c6474059d38265e838de0677bb6b993ab40e1a6ad18c70ca0efaf1cbefde7bfe588c", + 'hkdf_sha256_test.json': "b8d9854b418d79a265b890aec7436f9a6856bed22d7a31506699874e0505b251f5547cf064f9960f56c955a0f95f73ce39011a3ac9e2787a9beb3f5049b3414a", + 'hkdf_sha384_test.json': "424ca85042c09305ff0ff7c1c95ae8bc621a135ff28da42792ea8ec7758d4d3d096fb4a9c01dac8a0359717a4e1f043ff28992e7b19f5d6b2fd4c13e4a5dd0c0", + 'hkdf_sha512_test.json': "ad0988cd4d049284694686c32f350c39ea18c20c4b926d0b5653432d463e3183847387e37fd612cd65376301fad9b8755dc1de577262715adf46869321ebc97a", + 'hmac_sha1_test.json': "b99d895f358207ebca2d9109162d848d94b32ea4eeb71a7a5b10841695020bd2656c9f413b2d42b3fa1926a7edc6330f240d55463e674942e0dfe17ee37116fa", + 'hmac_sha224_test.json': "c3e3d603df286caa065111875550b6713a5e35b7756aafd491b537b5330304293005f62ed535e30ab5f8970803b85e8f1436a6ac4c0d49db33550804cb0b5185", + 'hmac_sha256_test.json': "f763fb3cc36280c67abde9d8cd7182e4762d4eb27708e213dd09f37ef4a88b371169f4b8675b0c4a6ec72fabc6c07823ec9c05e51a36c24eb408e71526123ea4", + 'hmac_sha384_test.json': "c263583f6775713024323e3b2d0ad5f7da811476b002bc835131b5d36f86d9a1271309a2fb06371b451ef08ff65380188fcec4508f829c61d75b25518d03d631", + 'hmac_sha3_224_test.json': "96b3e8b2f1687256c29d781f413eae5566b9769289f78b93676d57ab224cd2e70ff03f1ffefeb6fe5877b75d92609d5dcb6e5ca7331e24d12c3f88f25577890d", + 'hmac_sha3_256_test.json': "ed3d16591015756c72ff09823d87dc36221fbc483190387f129816653b9c96d8797d134e50ad7765197913b04a60a301418f12040b55c51947ca75f0392af745", + 'hmac_sha3_384_test.json': "5bb6387eabfb602060f4e2a7483111a83e0be37d5507b443c5f484ef91c717d2b5af71d8316eada168ebe81a47c0d399e503050928093f424000f92899c73d95", + 'hmac_sha3_512_test.json': "b40c162f68e2878b39c8ee15a7cb381f99e2103346b115d73830cd15531f19c6d607a0327d78cca46788db37e2936b1bcade6739515e951e7e0e79e38e51f7f1", + 'hmac_sha512_224_test.json': "88278c017075ff186dce6aa9a3500cb40a2053cef4bae8ff634aabce422125a199909f50f2dcbdc213098307c8a81fee9efce193d909de213b7342955c411a32", + 'hmac_sha512_256_test.json': "eec3fa84e6bb73505f9e4e76f06443ed6d6c4874fd495f3bc038a04c56e74c5b8e070542c2360a7db383468e15e9479413665113fd7fd10001f77cbaf528f468", + 'hmac_sha512_test.json': "47a25df89a8030c5f9845fadfee5e22fb17902488f85f32e90eed2d87b4251c78b1c98494a1a563d89c52a9312c06f13fdecff6f4db6fa191a47fe5cd887165a", + 'hmac_sm3_test.json': "d3299c5d21c99f2f9da28ee4e348fac2c5fbd69f23f224db74f77db1972f4a2a6813c00cea22a9472cc5a2944b3560a44320eb11b4a6a66a930f5c614cb424f6", + 'json_web_crypto_test.json': "6e7f5c6218b460255560f547bd5f730e9be43d64702f1f42bfbda74eb8b043f9da51a0c8569b5433305793aa6942bbb8af3f83ee33e5677b0adcce911dc2c9bc", + 'json_web_encryption_test.json': "ba8f4ce4c48102e32662e655ccace79ab6413be8c6292df85c7be32978892f5e280ecbb23c2f5bebbf18d2581458e2ddcf0d38a92513a4482f779b28da0a80a7", + 'json_web_key_test.json': "35ce8c596fdede766bbf60bcf3cd2be5e8cc2a874fb5545722374817234da3a4dd2e5462645dbbddd7ca346884c5c9064e13ee12eb57dd013c87874e029c24af", + 'json_web_signature_test.json': "f57e6dd1ec52fe8f4412a5622310813d44c2c5b0ecc12c58ec68527fe433b4d4096a314319aee90b981a0a350676f186a25ca059fc35ed6ead30b3b6dfe20677", + 'kmac128_no_customization_test.json': "f746e985e40d65cb05f16b27dcb89749cc8aa8789a1eb298acd27bab186c5c4e2214806b1b31cb4eedb7bd9fbec5c58cf506988e1838d36d3489d4b46890f35d", + 'kmac256_no_customization_test.json': "93c31894cbe055881484ee79da9b64f79314d91edcf139c58395c7550ea92ff0fb8928b583f9967da850e01abcc49f651f78d10732cc67f0791cd9cd4fab4d3b", + 'LICENSE': "8cf5c2279c45d0b1215be0b06a332782695ffaa810f93ee90a60c9aba8694dcb5ae798ea8e58743b82e60f134db0e2d91fd9c5ccb29417150368ab61c6f0af60", + 'mldsa_44_sign_noseed_test.json': "5e06e259dd15cde1ce7fd724ed22e15701e772f7a7e14aece0917b03862cec5a9302111adcf2f7e9d3e6e87ff50dcd577c1d3acbb8924dc0287a33861cd3c7bf", + 'mldsa_44_sign_seed_test.json': "fbbd614f6550b55da045eb28f6e91db41e9f184d8c79de5b8eb83e61641a916c8fe530a96ca3bdb48eabd4748c682d95f4652e4e3b02a538f7b0eefd01cffa1f", + 'mldsa_44_verify_test.json': "0d883abc079a4a984407f339ff2eb0e8d98ab640e00fb92c941d1179ed9e36a5835572dd2a6fa8a998f60a253b7253b5ae27b7f12bc461cdd4a2e1c3dc08fa69", + 'mldsa_65_sign_noseed_test.json': "c189879c24a3e30df55c987ae902499a582d00514e1e512b421ef1a1f1615c651bbd7e58c12c6fb2f59c3c918170c1d6f04511fbd13b78fad1df422f14f6ca0a", + 'mldsa_65_sign_seed_test.json': "459251fd096b4c93f2ae7dfcc99464da1704ed969a9c929a6b48a1e8ee709bee77b2d275b3333278a52d881011ed4d7af129f92dc94f4d2a37a34a369c0fd717", + 'mldsa_65_verify_test.json': "6e34eec8e7604e77d18d23e418089ddc2b650d44584e62a57ec9353ce0a305933ef34a1a60f196e5d1ce190241800e74a10a94ce93818170bc2144cce8ff929c", + 'mldsa_87_sign_noseed_test.json': "82ea848426d521804cddffd8cb9a9ec1834a039e2363111fb5996ce3a82709670119dc5ef55f18e4e0b65896d054176c69fa555133d629f6bb2a75cfedf4be27", + 'mldsa_87_sign_seed_test.json': "aeef0e74488b1b0625853fa87b9f1021180352d674203bdfa505f1ad40322ec8a30a8545405c3a5a8976c77375220fd434e3fb7f20b895271bb4695029dfe850", + 'mldsa_87_verify_test.json': "e0fdbdb42b5936a92fe9c0a61ecfda7d10e78f991b66b6a9c3a1409cccbe544023444a8db338086ed8015bf0078f7f7769bc244a404ba2473c54be9b5f5018be", + 'mlkem_1024_encaps_test.json': "40e081ea7406909aeb38b4ecf7469c546036d15a1f7d3709420fefafbea2895ba1eddf6e568b220507bb1888047e8c8f1729d34252ffbeed056f6f17d996c05e", + 'mlkem_1024_keygen_seed_test.json': "fb401e343275356717a7a0ee6d6f2d9c68ebb5ed16726c25daf42aab88cab4daad51ae025b9fb5483e7582d70cc7e3c0167968d351f8a8a386e2b54eeed18f9d", + 'mlkem_1024_semi_expanded_decaps_test.json': "75b300e5a60151b46469c6aaaf24910db60bd463cec418fb699fcdb45ecb01bbf8febfc66c7e725073564934435d3a4e6f79ce0f1cb7e6bb96e5b94c8b7e28ad", + 'mlkem_1024_test.json': "610ccae8443178f81dbf3e73d53710daf9935a6179cf19208c5083a9def2bf37e99988822bba2956e9fd8bcaf5947b3ab0636272c1798c9ca2fc734d74a568a8", + 'mlkem_512_encaps_test.json': "c1a658f023b982063868f0bf8c3d7b63f7835d8312c07d92f35eadc8010fc48bed541d95903275cfc9d77199e375c7aed2ef6f79e256e5da0361bc289d9dff68", + 'mlkem_512_keygen_seed_test.json': "7b69a209c5489bd99b5b4c18af14a1a1c23d4e6d92c7ad9ca159043a80a28095114bd6411c20676fc377a516562c17e11559d4859dc8f2a6e3a0d15347199226", + 'mlkem_512_semi_expanded_decaps_test.json': "aa7005a88e19fa6e32235324774fd1b4511fa6c5d57c661258d9aaa259b74138b02b5ab6bf5caaa73282279ace6952896c0e501b274172742ad65a488d842498", + 'mlkem_512_test.json': "69b6ac80f6e9a342177ccfcd89cf9e63859319e8e00239789f694bd1d66232bb983acd738d4b09220f595e703ceb515901fa683d3740ad6a3fdfff05478a31b5", + 'mlkem_768_encaps_test.json': "fa4bf9229ea60af13175c37f729d59cdcb6429e489b75d4f63e892f57f4e6e03533f2e2e0d7e019f4822ed16b0aed453490558a836a64e1a6c1a821853f33677", + 'mlkem_768_keygen_seed_test.json': "238d5a7e0d7177df2976e8ea0ceb5261caaf02966cd6b0cb828567678b13b6daf2f73fa48eab6b8597b1e4b237f40d82e0c2411d834d156f852a128852d6dd27", + 'mlkem_768_semi_expanded_decaps_test.json': "34472ce67ee1bf722e887baf6aa64510dd89b71cd58b98abf19dbb63993a8a40800fcbdffae1eef6993390a8a96ad082fe82bd241520bfb9ea62393a40d95bf9", + 'mlkem_768_test.json': "33c51ac42f702b0d8258184fbd7b8716e2cce53efcf19a408596f1b406c2fdbd4b80e638e869289794253264ad29c253b0bb57f10471dcee911e6b5a36949cca", + 'morus1280_test.json': "1bd1c271807b26e06cf33b7f50de1c7406efa38dd91966838400e296076451f1dd3ada4308098aa185b3962a91be3286d62344472305472def5fe0aefd5b5695", + 'morus640_test.json': "2619a079189ca8c4ad79071a80f9cb0dc5af4330b25490b03432af12997be48b046cd6949a1dc4f76ca1d93159d2b0229de89ce1bf19055a47e38a06789cd05d", + 'pbes2_hmacsha1_aes_128_test.json': "4dcd8511a36a39cf8ebf36dfc921c1bbb79b0d5dff179dddd2a37ed79b58bb8f45aa1bcb3fd7a02024580458df1813c7d1c87a63df46c9285ba99c3318d479fc", + 'pbes2_hmacsha1_aes_192_test.json': "65e072bc0faea0d0ef649c1eaf82984a241a139d91414b636679c661f4539c16aa4e9ba3852ea22e42da366450507fc3c1ee61b0c78263a59897de1b003617dd", + 'pbes2_hmacsha1_aes_256_test.json': "8a56690029fa28e8df80bb5a95389a72d1c5d23fb76ccadeb767f3e40cf2b06fa7506e7a01abe63912c13bc94123aba540aa0e0c92a43b8e6dc48ca972b5ab72", + 'pbes2_hmacsha224_aes_128_test.json': "98a5c1f874d4e85c964d23be4c46ead32f157c6231002ae0b9aa03b1a4d7833fee2719715ecae31ecd4265b44237beb409fcda197422cb6d25ef3bfce88d55a3", + 'pbes2_hmacsha224_aes_192_test.json': "f3e099e0e0f8fc8b3bfe3a6c67b28c54567f50d2d35fc845e7cc34d6c7366eaa78a48074290714a01213faf57407eb24a3b2d614823d49458dd63d4900aa0e45", + 'pbes2_hmacsha224_aes_256_test.json': "fb149363b319dfff8bd9b44453f62620af662e7e59d12e37d01c65c1504f0ab076414c475634525d6549f362da208e6dc1c0f445a92d1020af4d020b29d8f04d", + 'pbes2_hmacsha256_aes_128_test.json': "9791d10cac4cfe6aa13e955d9a1f606231455d27b13a48184eedd1cec587b4c20fec516a969b8fe82de1ed6e653d325b1d230c926e0365230e8321a535fff164", + 'pbes2_hmacsha256_aes_192_test.json': "ee31846af4512fc081c2a520a6900abfe70488341ed3b94c591dd65ebbf75c806b2d362b6d3aea04985a7b55515da07e52208aff5684be4108a0a40a5444223b", + 'pbes2_hmacsha256_aes_256_test.json': "3319746609c74a8678e2c02393da33b7b8e4f5cc9f122a79aced3d3f829d12368fd667d273b90ea3be3abf27eaf12b3ff7034f5a2c124b647d2ade0709212d65", + 'pbes2_hmacsha384_aes_128_test.json': "4734268d3045cd6c1c3d001152bceb91045ca367e998e94c2b8123bae1c0bc6e40a646b05566ebb8e27ff21c07f96a2d34b71b29cf7ba47a41af1327a12a0817", + 'pbes2_hmacsha384_aes_192_test.json': "5c415d4a16b3b0646ef2e288ce230fde3b41016b3d2ffdd42f1dab576c519087ba89cbe087abd1dc6841ed3e86e87f8e0896ccc55fb37aa4d8b91dde47e97612", + 'pbes2_hmacsha384_aes_256_test.json': "7499b1e8faa06f155dedd282d49baaf1c3103d92a90d9fd9ea9d43342ee7f037cd61ec6db11c758eefc8a2ab37aaac0c0cad946979dd90d89b0cab05c3e2e4f5", + 'pbes2_hmacsha512_aes_128_test.json': "ae7a8419b4080d1edcf051791dd162b21fbbde87671c692042d090fa7b0a3a50e740ad1ff600efe16b669e29a0a8cc76c70168ac595fddfa15358f44ffed2b43", + 'pbes2_hmacsha512_aes_192_test.json': "018312ddd664d54d1f61887c5b2eca6c53445ad687c541a112f4e01214f4bdfca3c1c040a4f58073e25bab81f9cc16594b325126ed094f25947d6736cf2dae68", + 'pbes2_hmacsha512_aes_256_test.json': "88a6744e681e932bc88cba92707dd4175d7628b28722650e583bb88996a4359cd3bfd9bf6e7d7251bacb6f6ec3f373c89a8726a7941b0fddf80950ae3853be29", + 'pbkdf2_hmacsha1_test.json': "ef7f30803bb875100f03243a4ecdaa828c931727d987b02ccdf5e11c016a9d39b701a104f139249070c0c9608bfa21094f12c1288a154146a4d5d445d6a414d4", + 'pbkdf2_hmacsha224_test.json': "c76b458adb68d4298d4488c9298e22660b88d339663bd916d4a4dca16a6c45b3deece24670f93822893fd82f1ed4fcd83320a2bd17dbd01eab4b6bd424f421c1", + 'pbkdf2_hmacsha256_test.json': "68266130cf691a7de55812ffe8467c5af0d925dd7e51a1bf7bf37920dfabb63ebbf4d63e7726c6e7c0d62267391d73225af3788d63c2aa4108d34d53ebb774b2", + 'pbkdf2_hmacsha384_test.json': "7258ded76df3f3afa2ae644fabb61ca31e2adff87a3dfb7735ffa269fdc4c84154c561292a1bcf0a604e8757390243cab30b021b65bef0a61ee368dfc0c340f3", + 'pbkdf2_hmacsha512_test.json': "acf31741f9fd073b2de96fcc054d2740b05a72d5bf28e96238bf7eaf74e036ebf1920bfa97060b572ea625ed243d62e6586f31a6e6fe79a18d7e82cc677283fd", + 'primality_test.json': "f67b59682c44c867b39ad8de4db11ae3cec54903d3ae5664665d0176c09d6247a9a759e3ddaf74557a0d463aef33e096c3c3bafb0d86ec9e84a42372d47be228", + 'rsa_oaep_2048_sha1_mgf1sha1_test.json': "11b5bdfe2e8b182188f5afc85ba9f2a90805f47f9160e9a7a09e7cbacbd09dcd50034b64cf4586f3c1dc8a5740f6961a654849f33e83843a243a8db90320efed", + 'rsa_oaep_2048_sha224_mgf1sha1_test.json': "25d839c8e212bc5c4edb42ffe782e7047d96720a5de72939e2a1ade18c6a1b7fc65aea03568c6343dd193e97c3220232c6a2ad482bd553a87a9c10f5391690a2", + 'rsa_oaep_2048_sha224_mgf1sha224_test.json': "ee36d3b23f5b30e6e2b53de9f96eb21642011dbe43082ea68f6f367e640ad278f6fb315d0159f6cfa9dfb7d65ffff3934ef97c80f83f6732dc8542afee373cc6", + 'rsa_oaep_2048_sha256_mgf1sha1_test.json': "afc711f13ff6e5b34630031fbc302eece309f132e3d31310cd43ef05f36605bc3a006a12412bca8ddff984fa358656a4a2666f2e1fcd0d6669a7be5b4c225adf", + 'rsa_oaep_2048_sha256_mgf1sha256_test.json': "3830a5ed60d6234996dd8fa336e7973c371ad5d6a3916d6e641e8bb2d1fce620db0aa68ad2a46747970a49d4215c09d649bb70fb0b67bc497c5e2c332c2bdc38", + 'rsa_oaep_2048_sha384_mgf1sha1_test.json': "8cffeb10a6b0ad360d0cb9fc598d6dbfe3e36ce905b2e5e11548b487b12cfbd962799bc58f31b106b1d4609ab7e36d1c4dda081a9f7b4c121b9c718b1ccffc96", + 'rsa_oaep_2048_sha384_mgf1sha384_test.json': "3b4295e01d8ecc5f3977639d6e83926bbeb718a5539223840eba3509f65ca03812ae704edc82b7b6b78322ce013ddc9e7f4c877b9609afdc4f50bd39ee59f5d2", + 'rsa_oaep_2048_sha512_224_mgf1sha1_test.json': "a2692a73b9f7106a6187fbee744bc95700afae8726c214b9e010f587df17cc7e15ee3a650335646c066311e948862d68b427d791f134f74acaab3af8684609c2", + 'rsa_oaep_2048_sha512_224_mgf1sha512_224_test.json': "fddfe64945f4658eaf2e2ab37dbc57684eb41374ab76634c74a9944612e0e12f18a31d82b45d47a106a5a48ff0cf5656248b09fdb05c45b8c9f8510b30e59d55", + 'rsa_oaep_2048_sha512_mgf1sha1_test.json': "06b6d80b295d82c298e7017a748ef40de6a2d7158d6720fbcf939d8402e1219e657dc78486b6a51f74ed5c1a24a8d9bae33a9a752afb86b68ac2a657734eae4f", + 'rsa_oaep_2048_sha512_mgf1sha512_test.json': "5f66c09045781395b6b0d0f34f6ed5a6a794536c6883f2e198c24ea4d2cb6fef12d96e5551ef36e9a6c09b3a5b97809a1d9d996072c65e9dbdf28690ee1f10ba", + 'rsa_oaep_3072_sha256_mgf1sha1_test.json': "6202abfba2b997f3d3f7601317bba95938230078a2edd4012ebf353169975ed788f273c841c18ed88399c167a2d089b383c0f16de6777cfa68c2d131e967a7ca", + 'rsa_oaep_3072_sha256_mgf1sha256_test.json': "893470dd1ae0fc4d943eae9f2f7bb3518ed2e075cae7817962e75e0892540ffc40c6a1eae937f0a4fa8bf26a0a0ff59b08842c30e02813dbaff32a8c7c16eaa4", + 'rsa_oaep_3072_sha512_256_mgf1sha1_test.json': "e8a98b51883b223923daf500ac36d97b727e146c877d37e70ded077e2158c320535ee9fa06faefc4139b87288def292b95738a20cbada659dc32b113f7688a68", + 'rsa_oaep_3072_sha512_256_mgf1sha512_256_test.json': "8553b7ae98101c4f01f916e4523684611ef03f94ffa069ad4361cad6f7e0603a1d7327488b5aa60c7a85f044228f97b7396e318014d274028c62f74e6faf5ae3", + 'rsa_oaep_3072_sha512_mgf1sha1_test.json': "6373311f8465bb8b93086a2fee08e80221b26fec6727e2e758f54645a7ec19642c5d16340d581cdecf0e90bb34d13412e8e3a3c020b6fbcb3fbb3263a5a025e2", + 'rsa_oaep_3072_sha512_mgf1sha512_test.json': "16e04b37123ef54cfac757e5654176f90a9b085ea822116221edbd3ad5afc7d8352dc4c18f4d60abdca6ba0d050872f5f9bcddbb45862839c998876e746cc800", + 'rsa_oaep_4096_sha256_mgf1sha1_test.json': "48ea4b20873c1bea93bb9e322ef038d805000b1d54a24f387f825c42544c204bd2a4ae2e7bf6c368443505611e9fb5ab0d524461dc94e4432c0016a450f88762", + 'rsa_oaep_4096_sha256_mgf1sha256_test.json': "b490d0aea765ae739715a91f4adccd6ab75822eeea2aa77ea25961a5b11208b77b20a445d6cd5833fb4a384bf490a3f37472492219e7d638f2101757529e555c", + 'rsa_oaep_4096_sha512_mgf1sha1_test.json': "b9849c95be878f3b5b1831f42c45a56d8a46b92e2b187dee3f2be87c376a5c3d4e9fd3c6f0242ebbc2944c62740f56aca21b508a19c8d1915cffb91deb82292c", + 'rsa_oaep_4096_sha512_mgf1sha512_test.json': "3d6dfcf28380a6395fa7908344e5e2bc6bdfadbebc64fe1d11fa2d519bfbd78f603f27a36e5310d4e76ebe7378d90f5965870ea2a542d966e58717f149410f4e", + 'rsa_oaep_misc_test.json': "c6b1b8563ee47e4079c8f1273242021fc61a2190b7f8d9d4facecff8905164235b28e64490bba35cdc2a80eaafc7a92f1d1c367f2e26bfee7b7318e03ee25f7a", + 'rsa_pkcs1_1024_sig_gen_test.json': "41f2989c6508e330f57c94fa336873734c90ce608e9bb884bdc58232db230dbd1ef10740ccbde8ce5d60251a307d9b47a9bc3d255f7775565fb3d38f72867186", + 'rsa_pkcs1_1536_sig_gen_test.json': "94aacc899097a50d0cdf361b36e7c8d94bdd115bcf9e8eb03fee0fdaf4380576ff9922f3d382208661234f3d515d763e7dfabce2aa50010dbda311cd37061a00", + 'rsa_pkcs1_2048_sig_gen_test.json': "94b8e6c8c215d66f467fc2b475982be0743fd7f9018277eaeddf231a34a1ef9fdf55b13d512ab15a6a0da1905e6c4b08fd2866b9953a2cd1f9712d5a7c06aa01", + 'rsa_pkcs1_2048_test.json': "e4afbe133355c2a726d4f2c5fefd4dfbd3318c6b337be32af129eaf0af4bab233c83f9314332cab919327a6d76a1819f15e6a0a33484fa11cfa4b9315a2ce50f", + 'rsa_pkcs1_3072_sig_gen_test.json': "662d1d04eb6ed436ea1eef20cf9ba05ed45aed7e45266e847f2fcd999bddfd465458ec352fe2355d806ce7b347324b3d8a13b74dabd37aa88989368926a4cbfe", + 'rsa_pkcs1_3072_test.json': "7164db87ed34cbc0dddfbddb3e1449b569ed48a9c53dd76f2c64cf38101c8c5d54bf1244c37ac0d94b7d11c1cc31fc7c76cc1d85801355bcc9a7eee17e95e0db", + 'rsa_pkcs1_4096_sig_gen_test.json': "709437bdd819439ea8c354bf15d894ef10b07db1da159e14b1d35d4a1c4c47e5d7b67e39d11be8b2b012517eacb609596939f652a78670ebaae12242f4958f3a", + 'rsa_pkcs1_4096_test.json': "e36e0d26558ea8f7b5f640d4b18cb6d2cd9758b5dacda1fe28f91032f6015ee8e03cf49d59e9c6d41eac691c37e330db862412e7fd7221f4c580f5aa7e452fa7", + 'rsa_pss_2048_sha1_mgf1_20_params_test.json': "cdbcefd215211d7dde12fc7c27de31cb2b771fb34f6a171ae902336525241e4685eba6150a773e669e845a7e8269b65ecd7e8e46e7350715abe838330cea2088", + 'rsa_pss_2048_sha1_mgf1_20_test.json': "e6469899ca6bc76ef2073a43b94ed3884aa76a3d9cba3cd49c32bf5ec0ca5e1a08c457fd4cd61a4d67dc837402024be37fa32338fb91261b9ebb0e81f6d73af9", + 'rsa_pss_2048_sha256_mgf1sha1_20_test.json': "fea4d48e541a65a1afd222f333961f78aa7bdc360cc702fce35d09a92f637103483e1bbae5d0c52de25fa19c979984803f82e22c29aa6ec5530611ed325a4196", + 'rsa_pss_2048_sha256_mgf1_0_params_test.json': "f5a8830bbaf9bb72f1e4efc695e8a34efcfe498f4602c0ea254f346c1ce8c278c33c3fdff2cc4a3c041100ef89aa675f57573df2a5c3a538dd367e6bbed6a3a1", + 'rsa_pss_2048_sha256_mgf1_0_test.json': "c847a70a03ba42f1e114fcc3f721d7aedd9dda5d4b792e617a329432da7a6c38f2e5910ee9477dafda0780a8a829de5d7a549e08ca4abdacfe3b801dd05f98d0", + 'rsa_pss_2048_sha256_mgf1_32_params_test.json': "833fbb7b9259401df2308eade2cb3d1351caee834c1cf68c8d51f152a049cbc31638e2c00d5c74ef85109f048b83ecba0d45d5ecbeeb342f496dd2aad0df2da6", + 'rsa_pss_2048_sha256_mgf1_32_test.json': "7baf1f5ddaffcd00f61cffb0c51ab65d4d2e1264609f1fcadf6d1f291b352c05b308ceb1e4cf9a7b8579858f816b47fe74220c9f8efddfdebfd8d2e2bfce8ca8", + 'rsa_pss_2048_sha384_mgf1_48_test.json': "b883cf86afc1a4b3ca926bea1279b5176926290c14e5e035c2d8f7cb5d3515b2077edec725ed2706c0f354f1fbe58ed3c850dab1969b6a52ceb8c56e3d0f5e5c", + 'rsa_pss_2048_sha512_224_mgf1_28_test.json': "d7aee7bcfabf5f9e2840ce29f56e7bb9674020a965c2825068caa7ed4ef2c0bf6b3f363530148f52081df339a954b62dd037a889980bd5b6db79f812fff921b5", + 'rsa_pss_2048_sha512_256_mgf1_32_test.json': "87b67c07d2246381774d8655ba55800cf1df881111e322312fb91f4c0138d70945bb664790ca9c8c29f267974d2d9278c7172aa22115760c9580e3bf13cd332b", + 'rsa_pss_2048_sha512_mgf1sha256_32_params_test.json': "84cc291697b82aad164b1cb39dd1a827355f962df606097f528d1c1fc55c9c965d56976c1eecfc83b04ffa7377fcb8ff5c59bef5d213b95a9f1791fa40a35eae", + 'rsa_pss_2048_shake128_test.json': "87e89755102a90496314e7daf254071486c222d3880b6dbf9f0600cc5325b96f0a405de46bcf4424605799fccb24414a929f0200fb9e98103cb273c10a406cc3", + 'rsa_pss_2048_shake256_test.json': "ac0ed3c4beb5ce6c3ece709bfc28a5ac8d189b622f59ee3920d6eb30f862b03128003b15fb814c05400570deafa8e91dcc6781dee424b9cc0615fa2a5b020082", + 'rsa_pss_3072_sha256_mgf1_32_params_test.json': "a15a20bc37a2090bfd47382510e8fda94e32819bab8b1f1c2a797786968845f1c840038e8852fdbaae5bb003e519acfbc5059913925fd4a6f4a2a386dfaea536", + 'rsa_pss_3072_sha256_mgf1_32_test.json': "308cf529b12f39e97b2ec10dacecdc06eace7a94dbec1f1aefac717a7da6d43375c9273b400ff3fdc392bd136920943012c3917069d0c4e99215202a4be70f9f", + 'rsa_pss_3072_shake128_test.json': "6417d966ddfb9e0862bcc9b02ab967421ff7aad2d2b13011cca1070c3281b5109a0c6ce1dd6ac0aa6e5ece4be5d2ce91bd40508403dd10a0dfe9268df937705e", + 'rsa_pss_3072_shake256_test.json': "ead39cf4877b98a79583ade599c7e0e118d3dd69ec6c82ef1590122f3621f6cf0f6d569df3d58c6bbe086102889feb685f964554aed2defd3f05639184231cc6", + 'rsa_pss_4096_sha256_mgf1_32_test.json': "1812b9988cb867f67bd975f940560751bd7317279bc6a08769b6060c453ce464ce420c6c5fdbb02df90e036ed3474b8f052eaf351c67cab0a21f911f156c69d2", + 'rsa_pss_4096_sha384_mgf1_48_test.json': "edcf2757d25e8824a33bf64fcc8622071ef510cd4ef21878002cb3b79c88d69a03e77dfa73d083cbdc62e8eb7accc12fcea447c9c2a805bac2492e7df7dea615", + 'rsa_pss_4096_sha512_mgf1_32_params_test.json': "fb5c743dafffae4fa96564d50be5decb8712d8247e4066f0e2eee040bc0fd0d458a803e72327151dc7eae93223455f162c6ef46d7c5650a1abc9e483c5f262ac", + 'rsa_pss_4096_sha512_mgf1_32_test.json': "b1e6ee3d4a7be1562237e8362450319df027318042111eb11add1bb0cc5e35db274962dc6f61718fcb83165a8ed8fe0adaf3d446b2e2b75486ddb948574e0d08", + 'rsa_pss_4096_sha512_mgf1_64_params_test.json': "61109281f59667eaec913bd98ba9dd5b84418fe697331a6dc9b53720833f98da64c8b561b57c853c797f7d5de8ae212554eb6836087d62d016f9208835844b05", + 'rsa_pss_4096_sha512_mgf1_64_test.json': "fb3632478e0d261741443865f5cbe7954103186ecf8098d5c52f88b2f85c870961a3c90599e256fe46185f8b6ab8b1c36b326aa30fea4090f5e55eb6b9ff3544", + 'rsa_pss_4096_shake256_test.json': "5add00e096f35b72f062f169a4c6cb11ea8f93235d9ff7ea72b4ab4d226fd8a470368dfd5335b4f7abf3a5cb3f81759a8c99ca8209c4891e0d7bc08ffaa4ab5a", + 'rsa_pss_misc_params_test.json': "aa871f1dcd047e116f67edf398a839ee9e93f301ba746592a4f718d1f351e1dfaa731501ae18881217ce48086258a7c0a107a85c900bf3ecff4d64f639f98a17", + 'rsa_pss_misc_test.json': "2ad28380f1455adf0048369df811c7c6d6a3c7002945e3f30ef889243f94b62f8602ad7f461f616dfbe0b75c96269eac86f99ad6288d842ddc3c9cc4fd7b3dd6", + 'rsa_signature_2048_sha224_test.json': "6601b34eaf82d03c3c3b1b4041a7009de8aaf2c4e3bf527519ce237ba94b38b848e3bbf04eaacd3d084d3bef9126f2f4ff9b678126fc3fdfa5429503a028f546", + 'rsa_signature_2048_sha256_test.json': "d5150fe23f6215406edc768682ea71070f49c8f4a718b2f3da113e9a5213577f2c79e1eff1d4506c8ba89fc42ecbb5fd301a47c26030490f4ac06f2feabc936e", + 'rsa_signature_2048_sha384_test.json': "cb045c76ad23f9fdb3abb38bcfa7a78cea1e13a7f512e777cd44b21f644d96ebe780d042435b4ed32f16582745c895fff4ddf9071b7f7c4bbbd0a71631b4f57d", + 'rsa_signature_2048_sha3_224_test.json': "527f64300e61defd85cbe2d4c4f4eab2c2a6baa0ea16ba918ecf399c51ea530bf3b63f4322b3e7a0eee15aaf50d1cc851cc076b30219c2bb0b2d28348006e3fb", + 'rsa_signature_2048_sha3_256_test.json': "1038614b3760b2d57017c266985e17527002eac224945c4584da572611c46d0ca2b58293b663b7709bbb27646802634dab8d4fb123f36fad01f5a74b1324e23d", + 'rsa_signature_2048_sha3_384_test.json': "d386a2a69d558f9a4f5d09795486d628044c5b56fe34c4d5d66063533133541594b4f5f9330541cdeebd1c1ab7a11488d96a852e5fd69ba9fa08c9157d102fd6", + 'rsa_signature_2048_sha3_512_test.json': "f5ea0d29bb0887f9401bafff3cdc35a45c0196070616df75e5ac8a12caaf5e238080eceb4265962aae4e299f991be73eb0e4fddead0bc795e32b023547160761", + 'rsa_signature_2048_sha512_224_test.json': "96e0032b3af2ae3a8d5626a79488a112926b599f1f9fc4e47d5d7941898a5dbb0afe689de16bc79dcf13656e0b32e052b6704bdec673ae2b99383b68285cdbd5", + 'rsa_signature_2048_sha512_256_test.json': "fe54c5821e526f3374d03e7c1313e3783cd986b07a4c9858bcf3aa20d8c85b27d898394b4c37c1483fc16ca1ac5b59681ace58fba625f84feb9af7455d38ab20", + 'rsa_signature_2048_sha512_test.json': "2b9f6c3da08266a40b7529443aa42738bf7fd23842ad3792cdee9a587fd6056bf7eb1ec72867d3006f1a98728a3e528575ffdd7229325e13fafd6f363edda0a7", + 'rsa_signature_3072_sha256_test.json': "17999b3add8f853b07d6ca9e24fd58b275abb725bca8f7203787f57d8af0c03f7bdc15a6eacee1337d9621b2d53a8cac86de7b2e6a444abe81da8139838a8c7e", + 'rsa_signature_3072_sha384_test.json': "9f9a8ee0d78bb6481d94c1f9e41eb77438f33308c163c1634ec122dffe133fdef9c5cf1eb8c7ce4b0161df651f2d04a0250fa25d7fc82deb9eea105fe69121f2", + 'rsa_signature_3072_sha3_256_test.json': "6f4b2e8ba2436fe4c21e3d19e4a8572227bae64e9860a55462fc1b439900e9f443fbea4c5294cf262805d35ff8360ce48ea6c80ec5e4d82ad70c193680c8e28e", + 'rsa_signature_3072_sha3_384_test.json': "05b4a8736086dd21af73e84240ecf2ae217d45aab051f5c65744ac95777e82ca45bd0026881e08b1d817e7e015ccd8372e7d4c83356e896914307242eabab0b0", + 'rsa_signature_3072_sha3_512_test.json': "f188eb1849e68f30fb8d7e925ec6c575702ef0b1b06db618db558f35a01c4e541e8dedcb10e4eeec416cff82a4136a086cb2fc3b9e37434e4a5d8b5d11004d4e", + 'rsa_signature_3072_sha512_256_test.json': "d9e04c0bb74c874f1a51219b1dcba0b23780f64fb552d810683a48d1e47809acb84a4b2ce54e17f77be15b1798bbef64eb44c0722920dd96deff9472f5262093", + 'rsa_signature_3072_sha512_test.json': "23b528243e764425738dcafdd598845c59a3d8bbaeeefe432fb25f8ade7fd611f4f336d3fa91e079b149ea125c1d9d889317606a351827fb73b93a2dc8301e09", + 'rsa_signature_4096_sha256_test.json': "13c86fcb11277e72dbb54cd1e4c4cfadbc5605eeba3672130827a593b6bb703d927138bafee5daa03ae30bae15a352bf22abcdf518cebacd0f5b55c08bdaeccb", + 'rsa_signature_4096_sha384_test.json': "8881628f3b4015a729d88167fa98b3be5eb9cbda23e6766d5ba45a4a00dfa684d60cd269662e6df54771b7393cf01ce0fecdd572395606ad2e9d129e0b992a0f", + 'rsa_signature_4096_sha512_256_test.json': "6cd08b03cba8779ac57782d4030dff7fe277393aa1e308a647c5be1a64066eb0faf43a3e5f526bc76706e8e0d808c5b37ee4a4e0046e61aa68b41f1b80306a43", + 'rsa_signature_4096_sha512_test.json': "021cb140c1f7f7f87c22cf891c40ae5544f1c92926e9c8ea7af838ea496bb4dba646c120fe6fe75d81808cdbb515799bcfc8df1b1c3cbb4f9561821891a6d92b", + 'rsa_signature_8192_sha256_test.json': "8dbea635f9123af876287f583849b29186030cd270b709dd08b272f03acf4cec0c3cc3e77d45542ad606d101e59cb7feafe8af094f2bc2b38bc3cf08d8169266", + 'rsa_signature_8192_sha384_test.json': "c518417449709d88f3ad7aa1307b60a5d17fb575754674523a848b5030fa89a0501b396fb5fdc77902eec3f000272cb28458efe3473a80a407dcea0de6a06a8f", + 'rsa_signature_8192_sha512_test.json': "1cd1800f716214697507df8c099c3c01f512491ef8c008003da8f83326e3d08476365c96c03f91e0f22395f99fc01aa750aeee254fa22f81dc903418f41784bb", + 'rsa_three_primes_oaep_2048_sha1_mgf1sha1_test.json': "c629e7997fcec21d05891d944ab5fffcd673e5f2eb26b3931885f900081d9cfd63dfc09e009e95972118e1f1096803ca108c425b996ae0f83b90e9ecf3277247", + 'rsa_three_primes_oaep_3072_sha224_mgf1sha224_test.json': "d74d361bae2e5516ae5595afd929dbab2dcb03802c89899a6d097b86b1a815cb2237a55cf5e54df6179f08ebff573a03f59815fe2869308b752f52812ce7f6b0", + 'rsa_three_primes_oaep_4096_sha256_mgf1sha256_test.json': "214c700242fc7bad97b8086b13b4c607c7a51e4fa6eb0ba0263741c97ecd7969cbdb85bf0359254080da13e112af458b8fd0a100178b10ef5881162ec3658345", + 'seed_ccm_test.json': "b9d61c16f439b9547ce15344b806d98f36da7030f31d4eab1c558029d4e3410470b97e8d471a27dc75eb74ecec99cdcfb7911b605e5f700b665e50d6a7ad42be", + 'seed_gcm_test.json': "422745f91d72d71d3d1238269ba1dc6234f2a5445d637988acd86d9a383bdfde5391bf5c3c3d4fa0f9fc415d371a9724b2f76f0535229eadc29bda0c01d2c812", + 'seed_wrap_test.json': "a87be3d6c8127970b617d67f35b95be529808273a078bf82f2d8b2bbde2a6608e21559c2a2ee276552745da6cb1f0a253eca67991af2b05b57ed7487ff2fed4f", + 'siphashx_2_4_test.json': "72d16dcd5b56f08079146c79918f3b80a442a17cdc62b2097c8c2956f799e90ba9cca9d80cc8b0220b7f1fb83b4a1e27b6658cc5cd24e2f5c42a57fc47e4cd64", + 'siphashx_4_8_test.json': "d183ba80de092cd66ff8443286b9d22d838d79214827d02aa5323081d578d9dab21485cdeb6c0dda59d151bb6d0596d50d8254836fd25d9278f1a795f5d807d4", + 'siphash_1_3_test.json': "ac056415a0d4e45d802179b7efeebd034a7fc2110fee14b293e16af1edf95448a12160a6e6c2d95b36fe937102ba33264b29c2b1eb452df2ac766fe29b368436", + 'siphash_2_4_test.json': "d7cff2d63f881285567f9aeaca23fc2c94ea465fb442687b0ea94e9647eddcfc05d1b36c2435482b1d492c32b21fc50636a258e2e9c62d9ae6ddbabc93564ca9", + 'siphash_4_8_test.json': "6e49e401186510df582b68df50f8b331ad67609e18fbffe4adb359eb8d9e8f727a6abf3f4d5de1f33f4efb82b86a07f004f49c52d2c5e775e9319fd2c7d969e7", + 'sm4_ccm_test.json': "e963c49fab1e0d8ee050658e797d8c5b2d80cce39fa338833d46a2d7bc5e54036a41610063c0c74644e56589d1697396e1bfa4925e7a5592fa2247cb983441f0", + 'sm4_gcm_test.json': "9f64992c6c5469827d281a55c1612b0029fe344322c8cd7a7f2cefecc597dfb0f3f7b6cf85153f79e12c3539d553d591a8e9a1d0d714a58fb967e6fdfdfebc30", + 'vmac_128_test.json': "9fc97358a5ad56d4badc2b2ba35c07cd4872cf3687da667fddc3f628765330e6a9fc179e55c9a28b87cc02c92b80461d4db99073637fb17b1cf2a74bd5347a68", + 'vmac_64_test.json': "835e384b5d53bef8680520fc2ddb94ecc5d30e8aa65cdf0c6a48615e93273850d6333e19670d0ad40eeee645ebfd5c139f377518987e37ea6f6e6b28a22d0bde", + 'x25519_asn_test.json': "d43e2003c96c50c616cb093b8bcc4f70ca8931d2be83b1ca860900acaf65cd25ab347100c1a6fcb2561f1f29eedb52ff3e1bde70b29a757d4f814daf3cad35db", + 'x25519_jwk_test.json': "2f7f54dccb9c0882ec4a5e9da7c7779d18b7551729e805d2db51bd84a16abd07dcc3b0d7c922dc322b2da05708f0e00c612cea1b2d0c6f567aca09d846629b7e", + 'x25519_pem_test.json': "73530bc171e3a9ab5d82236a8c9c2fa4e565d8e1c83169036920ed22aa29f1122dbda9cae1c33dc5366b2b21aeec377930d6c305e6f00404bf25c4e679572841", + 'x25519_test.json': "857144ffa55ca421df7231594b23a5ed5b83f0f04ac1a707177c6d80d3cf1f69f42436abd3d7b2551788064cdbf01a2e2e25e0272d1ca8bc4a943b981dccefd5", + 'x448_asn_test.json': "b4fe61c5b1a57a887e539afe815ed970afba6eca055b674cb615945df39da911aeb41092570fcf480b5ad347520cc678aa0baf93ae574b272ce2457b802d4dcd", + 'x448_jwk_test.json': "402813856f68470b39df34e160211b53f90cfeba63c6b32c8b49d4d4bfa60b68c94cd1a04fdc09f07676a8f2942bc227ef75165456f6055cc0df3cc1e4381cd4", + 'x448_pem_test.json': "718ef327a5e8cc3a34467974193a051efe89323352f32f248c874457f28f6a2836cb6c2c15f40044df96428051591766fc0b44771236145a17835e714360ca51", + 'x448_test.json': "ca811349ede46fc253d656c26b058e2fe903aae8a225d7f6703bef3dec122df4c48af190a070df4c4066690f50ed4996d69089794b5484b57f2c4233216f98f5", + 'xchacha20_poly1305_test.json': "5debf381018af54fa2f9041044a257f8faff85b9a2eda314f21a05a55de2aacd2767a4962ecc58f69ed65404dc7d2b1eb8526038e7641610ce3a988456838fce", } def try_download_file(url, out_file): @@ -324,11 +665,12 @@ def try_download_and_unpack_zip(suite): digest = hashlib.sha3_512(file_data).hexdigest() hmac_digest = hmac.new(HMAC_KEY.encode(), file_data, HMAC_HASH).hexdigest() - print("{} *{}".format(hmac_digest, file.filename)) if not hmac.compare_digest(hmac_digest, HMAC_DIGESTS[file.filename]): - print("FAIL! Expected: {}".format(HMAC_DIGESTS[file.filename])) + print("❌ Expected {}, got {} for {}".format(HMAC_DIGESTS[file.filename], hmac_digest, file.filename)) return 4 + else: + print("✅ {} *{}".format(hmac_digest, file.filename)) #except: # print("Could not extract ZIP file") From 06b10f9ae800f478c643fb8fc8b6443f54b01224 Mon Sep 17 00:00:00 2001 From: Wrath Date: Mon, 16 Feb 2026 14:40:37 -0500 Subject: [PATCH 492/766] Add #optional_allocator_error --- core/unicode/utf16/utf16.odin | 2 +- core/unicode/utf8/utf8.odin | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/unicode/utf16/utf16.odin b/core/unicode/utf16/utf16.odin index 95e7c1436..edd48e0f3 100644 --- a/core/unicode/utf16/utf16.odin +++ b/core/unicode/utf16/utf16.odin @@ -128,7 +128,7 @@ decode_rune_in_string :: proc "contextless" (s: string16) -> (r: rune, width: in return } -string_to_runes :: proc "odin" (s: string16, allocator := context.allocator) -> (runes: []rune, err: runtime.Allocator_Error) { +string_to_runes :: proc "odin" (s: string16, allocator := context.allocator) -> (runes: []rune, err: runtime.Allocator_Error) #optional_allocator_error { n := rune_count(s) runes = make([]rune, n, allocator) or_return diff --git a/core/unicode/utf8/utf8.odin b/core/unicode/utf8/utf8.odin index 04ba3e619..85687b749 100644 --- a/core/unicode/utf8/utf8.odin +++ b/core/unicode/utf8/utf8.odin @@ -147,7 +147,7 @@ decode_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { } @(require_results) -string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (runes: []rune, err: runtime.Allocator_Error) { +string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (runes: []rune, err: runtime.Allocator_Error) #optional_allocator_error { n := rune_count_in_string(s) runes = make([]rune, n, allocator) or_return @@ -160,7 +160,7 @@ string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (r } @(require_results) -runes_to_string :: proc "odin" (runes: []rune, allocator := context.allocator) -> (s: string, err: runtime.Allocator_Error) { +runes_to_string :: proc "odin" (runes: []rune, allocator := context.allocator) -> (s: string, err: runtime.Allocator_Error) #optional_allocator_error { byte_count := 0 for r in runes { _, w := encode_rune(r) From 3adc5291131459ac1de03c2000c9adb7eb67fda6 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 16 Feb 2026 20:50:13 +0100 Subject: [PATCH 493/766] -vet --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aee4c1c20..67c047472 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -140,7 +140,7 @@ jobs: - name: Optimized Core library tests run: ./odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Wycheproof tests - run: ./odin test tests/core/crypto/wycheproof vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed -microarch:native + run: ./odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed -microarch:native - name: Vendor library tests run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Internals tests From 6da4a6746f98a55b544d6d8e9cdaecd94d4e8743 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Feb 2026 09:41:22 +0000 Subject: [PATCH 494/766] Add `linalg.to_f16` --- core/math/linalg/general.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/math/linalg/general.odin b/core/math/linalg/general.odin index 4a0150972..ea3a4e84a 100644 --- a/core/math/linalg/general.odin +++ b/core/math/linalg/general.odin @@ -376,6 +376,7 @@ matrix_cast :: proc "contextless" (v: $A/matrix[$M, $N]$T, $Elem_Type: typeid) - return } +@(require_results) to_f16 :: #force_inline proc(v: $A/[$N]$T) -> [N]f16 { return array_cast(v, f16) } @(require_results) to_f32 :: #force_inline proc(v: $A/[$N]$T) -> [N]f32 { return array_cast(v, f32) } @(require_results) to_f64 :: #force_inline proc(v: $A/[$N]$T) -> [N]f64 { return array_cast(v, f64) } From 58deab46a3e2423789f2af5e6ec7a4ef69ce810e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Feb 2026 10:47:14 +0000 Subject: [PATCH 495/766] Add `xar.Freelist_Array` --- core/container/xar/freelist.odin | 154 +++++++++++++++++++++++++++++++ core/container/xar/xar.odin | 100 ++++++++++++++------ 2 files changed, 227 insertions(+), 27 deletions(-) create mode 100644 core/container/xar/freelist.odin diff --git a/core/container/xar/freelist.odin b/core/container/xar/freelist.odin new file mode 100644 index 000000000..ab2895881 --- /dev/null +++ b/core/container/xar/freelist.odin @@ -0,0 +1,154 @@ +package container_xar + +@(require) import "base:runtime" + +Freelist_Array :: struct($T: typeid, $SHIFT: uint) where + 0 < SHIFT, + SHIFT <= MAX_SHIFT, + size_of(T) >= size_of(^T) { + array: Array(T, SHIFT), + freelist: ^T, +} + +freelist_init :: proc(x: ^$X/Freelist_Array($T, $SHIFT), allocator := context.allocator) { + init(&x.array, allocator) + x.freelist = nil +} + +freelist_destroy :: proc(x: ^$X/Freelist_Array($T, $SHIFT)) { + destroy(&x.array) + x.freelist = nil +} + +freelist_clear :: proc(x: ^$X/Freelist_Array($T, $SHIFT)) { + clear(&x.array) + x.freelist = nil +} + +@(require_results) +freelist_push_with_index :: proc(x: ^$X/Freelist_Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, index: int, err: runtime.Allocator_Error) { + if x.freelist != nil { + slot := x.freelist + idx := freelist_index_of(x, slot) + x.freelist = (^^T)(slot)^ + slot^ = value + return slot, idx, nil + } + idx := x.array.len + ptr = array_push_back_elem_and_get_ptr(&x.array, value, loc) or_return + return ptr, idx, nil +} + +@(require_results) +freelist_push :: proc(x: ^$X/Freelist_Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: runtime.Allocator_Error) { + ptr, _, err = freelist_push_with_index(x, value, loc) + return +} + +freelist_pop :: proc(x: ^$X/Freelist_Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> T { + item := array_get_ptr(&x.array, index, loc) + result := item^ + (^^T)(item)^ = x.freelist + x.freelist = item + return result +} + +freelist_release :: proc(x: ^$X/Freelist_Array($T, $SHIFT), #any_int index: int, loc := #caller_location) { + item := array_get_ptr(&x.array, index, loc) + (^^T)(item)^ = x.freelist + x.freelist = item +} + +@(require_results) +freelist_linear_search :: proc(x: ^$X/Freelist_Array($T, $SHIFT), ptr: ^T) -> (index: int, found: bool) { + base := 0 + for chunk, c in x.array.chunks { + if chunk == nil { + break + } + chunk_cap := 1 << (SHIFT + uint(c if c > 0 else 1) - 1) + ptr_addr := uintptr(ptr) + chunk_start_addr := uintptr(chunk) + chunk_end_addr := chunk_start_addr + uintptr(chunk_cap * size_of(T)) + if chunk_start_addr <= ptr_addr && ptr_addr < chunk_end_addr { + offset := int(ptr_addr - chunk_start_addr) / size_of(T) + return base + offset, true + } + base += chunk_cap + } + return -1, false +} + +@(require_results) +freelist_get :: proc(x: ^$X/Freelist_Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> T { + return array_get(&x.array, index, loc) +} + +@(require_results) +freelist_get_ptr :: proc(x: ^$X/Freelist_Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> ^T { + return array_get_ptr(&x.array, index, loc) +} + +freelist_set :: proc(x: ^$X/Freelist_Array($T, $SHIFT), #any_int index: int, value: T, loc := #caller_location) { + array_set(&x.array, index, value, loc) +} + +@(require_results) +freelist_len :: proc(x: $X/Freelist_Array($T, $SHIFT)) -> int { + return x.array.len +} + +@(require_results) +freelist_cap :: proc(x: $X/Freelist_Array($T, $SHIFT)) -> int { + return array_cap(x.array) +} + +@(require_results) +freelist_is_freed :: proc(x: ^$X/Freelist_Array($T, $SHIFT), #any_int index: int) -> bool { + ptr := array_get_ptr(&x.array, index) + current := x.freelist + for current != nil { + if current == ptr { + return true + } + current = (^^T)(current)^ + } + return false +} + +Freelist_Iterator :: struct($T: typeid, $SHIFT: uint) { + freelist_array: ^Freelist_Array(T, SHIFT), + idx: int, +} + +freelist_iterator :: proc(x: ^$X/Freelist_Array($T, $SHIFT)) -> Freelist_Iterator(T, SHIFT) { + return {freelist_array = x, idx = 0} +} + +@(require_results) +freelist_iterate_by_val :: proc(it: ^Freelist_Iterator($T, $SHIFT)) -> (val: T, idx: int, ok: bool) { + for it.idx < it.freelist_array.array.len { + if !freelist_is_freed(it.freelist_array, it.idx) { + val = array_get(&it.freelist_array.array, it.idx) + idx = it.idx + it.idx += 1 + return val, idx, true + } + it.idx += 1 + } + return +} + +@(require_results) +freelist_iterate_by_ptr :: proc(it: ^Freelist_Iterator($T, $SHIFT)) -> (val: ^T, idx: int, ok: bool) { + for it.idx < it.freelist_array.array.len { + if !freelist_is_freed(it.freelist_array, it.idx) { + val = array_get_ptr(&it.freelist_array.array, it.idx) + idx = it.idx + it.idx += 1 + return val, idx, true + } + it.idx += 1 + } + return +} diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index b2f1a5499..b200df0e6 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -83,7 +83,7 @@ Initializes an exponential array with the given allocator. - `x`: Pointer to the exponential array to initialize - `allocator`: Allocator to use for chunk allocations (defaults to context.allocator) */ -init :: proc(x: ^$X/Array($T, $SHIFT), allocator := context.allocator) { +array_init :: proc(x: ^$X/Array($T, $SHIFT), allocator := context.allocator) { x^ = {allocator = allocator} } @@ -93,7 +93,7 @@ Frees all allocated chunks and resets the exponential array. **Inputs** - `x`: Pointer to the exponential array to destroy */ -destroy :: proc(x: ^$X/Array($T, $SHIFT)) { +array_destroy :: proc(x: ^$X/Array($T, $SHIFT)) { #reverse for c, i in x.chunks { if c != nil { n := 1 << (SHIFT + uint(i if i > 0 else 1) - 1) @@ -108,19 +108,19 @@ destroy :: proc(x: ^$X/Array($T, $SHIFT)) { Resets the array's length to zero without freeing memory. Allocated chunks are retained for reuse. */ -clear :: proc "contextless" (x: ^$X/Array($T, $SHIFT)) { +array_clear :: proc "contextless" (x: ^$X/Array($T, $SHIFT)) { x.len = 0 } // Returns the length of the exponential-array @(require_results) -len :: proc "contextless" (x: $X/Array($T, $SHIFT)) -> int { +array_len :: proc "contextless" (x: $X/Array($T, $SHIFT)) -> int { return x.len } // Returns the number of allocated elements @(require_results) -cap :: proc "contextless" (x: $X/Array($T, $SHIFT)) -> int { +array_cap :: proc "contextless" (x: $X/Array($T, $SHIFT)) -> int { #reverse for c, i in x.chunks { if c != nil { return 1 << (SHIFT + uint(i if i > 0 else 1)) @@ -160,7 +160,7 @@ Get a copy of the element at the specified index. - a copy of the element */ @(require_results) -get :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: T) #no_bounds_check { +array_get :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: T) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) return x.chunks[chunk_idx][elem_idx] @@ -199,7 +199,7 @@ Example: } */ @(require_results) -get_ptr :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: ^T) #no_bounds_check { +array_get_ptr :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: ^T) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) return &x.chunks[chunk_idx][elem_idx] @@ -207,7 +207,7 @@ get_ptr :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_lo // No bounds checking @(require_results) -get_ptr_unsafe :: proc "contextless" (x: ^$X/Array($T, $SHIFT), #any_int index: int) -> (val: ^T) #no_bounds_check { +array_get_ptr_unsafe :: proc "contextless" (x: ^$X/Array($T, $SHIFT), #any_int index: int) -> (val: ^T) #no_bounds_check { chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) return &x.chunks[chunk_idx][elem_idx] } @@ -220,14 +220,15 @@ Set the element at the specified index to the given value. - `index`: Position of the element (0-indexed) - `value`: The value to set */ -set :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, value: T, loc := #caller_location) #no_bounds_check { +array_set :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, value: T, loc := #caller_location) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) x.chunks[chunk_idx][elem_idx] = value } -append :: proc{push_back_elem, push_back_elems} -push_back :: proc{push_back_elem, push_back_elems} +array_append :: proc{array_push_back_elem, array_push_back_elems} +array_push_back :: proc{array_push_back_elem, array_push_back_elems} + /* Append an element to the end of the exponential array. @@ -256,7 +257,7 @@ Example: fmt.println(xar.get(&x, 1)) // world } */ -push_back_elem :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: runtime.Allocator_Error) { +array_push_back_elem :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: runtime.Allocator_Error) { if x.allocator.procedure == nil { // to minic `[dynamic]T` behaviour x.allocator = context.allocator @@ -283,14 +284,16 @@ Append multiple elements to the end of the exponential array. - number of elements successfully added - allocation error if chunk allocation failed (partial append possible) */ -push_back_elems :: proc(x: ^$X/Array($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: runtime.Allocator_Error) { +array_push_back_elems :: proc(x: ^$X/Array($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: runtime.Allocator_Error) { for value in values { - n += push_back_elem(x, value, loc) or_return + n += array_push_back_elem(x, value, loc) or_return } return } -append_and_get_ptr :: push_back_elem_and_get_ptr +array_append_and_get_ptr :: array_push_back_elem_and_get_ptr +append_and_get_ptr :: array_push_back_elem_and_get_ptr + /* Append an element and return a stable pointer to it. This is useful when you need to initialize a complex struct in-place or @@ -317,7 +320,7 @@ Example: } */ @(require_results) -push_back_elem_and_get_ptr :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: runtime.Allocator_Error) { +array_push_back_elem_and_get_ptr :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: runtime.Allocator_Error) { if x.allocator.procedure == nil { // to minic `[dynamic]T` behaviour x.allocator = context.allocator @@ -336,7 +339,7 @@ push_back_elem_and_get_ptr :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #c // `pop` will remove and return the end value of an exponential array `x` and reduces the length of the array by 1. // // Note: If the exponential array has no elements (`xar.len(x) == 0`), this procedure will panic. -pop :: proc(x: ^$X/Array($T, $SHIFT), loc := #caller_location) -> (val: T) { +array_pop :: proc(x: ^$X/Array($T, $SHIFT), loc := #caller_location) -> (val: T) { assert(x.len > 0, loc=loc) index := uint(x.len-1) chunk_idx, elem_idx, _ := _meta_get(SHIFT, index) @@ -347,7 +350,7 @@ pop :: proc(x: ^$X/Array($T, $SHIFT), loc := #caller_location) -> (val: T) { // `pop_safe` trys to remove and return the end value of dynamic array `x` and reduces the length of the array by 1. // If the operation is not possible, it will return false. @(require_results) -pop_safe :: proc(x: ^$X/Array($T, $SHIFT)) -> (val: T, ok: bool) { +array_pop_safe :: proc(x: ^$X/Array($T, $SHIFT)) -> (val: T, ok: bool) { if x.len == 0 { return } @@ -389,16 +392,27 @@ pop_safe :: proc(x: ^$X/Array($T, $SHIFT)) -> (val: T, ok: bool) { fmt.println(xar.get(&x, 1)) // 20 } */ -unordered_remove :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) { +array_unordered_remove :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) { runtime.bounds_check_error_loc(loc, index, x.len) n := x.len-1 if index != n { - end := get(x, n) - set(x, index, end) + end := array_get(x, n) + array_set(x, index, end) } x.len -= 1 } +@(require_results) +array_linear_search :: proc(x: ^$X/Array($T, $SHIFT), elem: T) -> (index: int, found: bool) where intrinsics.type_is_comparable(T) { + it := array_iterator(x) + for val, i in array_iterate_by_val(it) { + if val == elem { + return i, true + } + } + return -1, flase +} + /* Iterator state for traversing a `Xar`. @@ -407,7 +421,7 @@ Fields: - `xar`: Pointer to the exponential array being iterated - `idx`: Current iteration index */ -Iterator :: struct($T: typeid, $SHIFT: uint) { +Array_Iterator :: struct($T: typeid, $SHIFT: uint) { xar: ^Array(T, SHIFT), idx: int, } @@ -446,7 +460,7 @@ Output: 20 30 */ -iterator :: proc(xar: ^$X/Array($T, $SHIFT)) -> Iterator(T, SHIFT) { +array_iterator :: proc(xar: ^$X/Array($T, $SHIFT)) -> Array_Iterator(T, SHIFT) { return {xar = auto_cast xar, idx = 0} } @@ -460,11 +474,12 @@ Advance the iterator and returns the next element. - current element - `true` if an element was returned, `false` if iteration is complete */ -iterate_by_val :: proc(it: ^Iterator($T, $SHIFT)) -> (val: T, ok: bool) { +array_iterate_by_val :: proc(it: ^Array_Iterator($T, $SHIFT)) -> (val: T, idx: int, ok: bool) { if it.idx >= it.xar.len { return } - val = get(it.xar, it.idx) + val = array_get(it.xar, it.idx) + idx = it.idx it.idx += 1 return val, true } @@ -480,11 +495,42 @@ Advance the iterator and returns a pointer to the next element. - pointer to the current element - `true` if an element was returned, `false` if iteration is complete */ -iterate_by_ptr :: proc(it: ^Iterator($T, $SHIFT)) -> (val: ^T, ok: bool) { +array_iterate_by_ptr :: proc(it: ^Array_Iterator($T, $SHIFT)) -> (val: ^T, idx: int, ok: bool) { if it.idx >= it.xar.len { return } - val = get_ptr(it.xar, it.idx) + val = array_get_ptr(it.xar, it.idx) + idx = it.idx it.idx += 1 return val, true } + + + + +init :: proc{array_init, freelist_init} +destroy :: proc{array_destroy, freelist_destroy} +clear :: proc{array_clear, freelist_clear} +len :: proc{array_len, freelist_len} +cap :: proc{array_cap, freelist_cap} +get :: proc{array_get, freelist_get} +get_ptr_unsafe :: proc{array_get_ptr_unsafe} +get_ptr :: proc{array_get_ptr, freelist_get_ptr} +set :: proc{array_set, freelist_set} +append :: proc{array_push_back_elem, array_push_back_elems} +push_back :: proc{array_push_back_elem, array_push_back_elems} +push_back_elem :: proc{array_push_back_elem} +push_back_elems :: proc{array_push_back_elems} +push_back_elem_and_get_ptr:: proc{array_push_back_elem_and_get_ptr} +pop :: proc{array_pop, freelist_pop} +pop_safe :: proc{array_pop_safe} +unordered_remove :: proc{array_unordered_remove} +iterator :: proc{array_iterator, freelist_iterator} +iterate_by_val :: proc{array_iterate_by_val, freelist_iterate_by_val} +iterate_by_ptr :: proc{array_iterate_by_ptr, freelist_iterate_by_ptr} + +push_with_index :: proc{freelist_push_with_index} +push :: proc{freelist_push} +release :: proc{freelist_release} +linear_search :: proc{array_linear_search, freelist_linear_search} +is_freed :: proc{freelist_is_freed} \ No newline at end of file From 966b76c4cba2d121ccf65d1a69e4bcbdbc23855c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Feb 2026 14:34:28 +0000 Subject: [PATCH 496/766] Add `write_slice`/`read_slice` utility procedures to `core:bytes`, `core:io`, and `core:os` --- core/bytes/buffer.odin | 11 +++++++++++ core/io/util.odin | 11 +++++++++++ core/os/file_util.odin | 19 +++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/core/bytes/buffer.odin b/core/bytes/buffer.odin index dd4b378c0..5fd3145b7 100644 --- a/core/bytes/buffer.odin +++ b/core/bytes/buffer.odin @@ -176,6 +176,11 @@ buffer_write_ptr :: proc(b: ^Buffer, ptr: rawptr, size: int, loc := #caller_loca return buffer_write(b, ([^]byte)(ptr)[:size], loc=loc) } +buffer_write_slice :: proc(b: ^Buffer, slice: $S/[]$T, loc := #caller_location) -> (n: int, err: io.Error) { + size := len(slice)*size_of(T) + return buffer_write(b, ([^]byte)(raw_data(slice))[:size], loc=loc) +} + buffer_write_string :: proc(b: ^Buffer, s: string, loc := #caller_location) -> (n: int, err: io.Error) { b.last_read = .Invalid m, ok := _buffer_try_grow(b, len(s), loc=loc) @@ -248,6 +253,12 @@ buffer_read_ptr :: proc(b: ^Buffer, ptr: rawptr, size: int) -> (n: int, err: io. return buffer_read(b, ([^]byte)(ptr)[:size]) } +buffer_read_slice :: proc(b: ^Buffer, slice: $S/[]$T) -> (n: int, err: io.Error) { + size := len(slice)*size_of(T) + return buffer_read(b, ([^]byte)(raw_data(slice))[:size]) +} + + buffer_read_at :: proc(b: ^Buffer, p: []byte, offset: int) -> (n: int, err: io.Error) { if len(p) == 0 { return 0, nil diff --git a/core/io/util.odin b/core/io/util.odin index a82a80be0..c1d8d2808 100644 --- a/core/io/util.odin +++ b/core/io/util.odin @@ -8,6 +8,11 @@ read_ptr :: proc(r: Reader, p: rawptr, byte_size: int, n_read: ^int = nil) -> (n return read(r, ([^]byte)(p)[:byte_size], n_read) } +read_slice :: proc(r: Reader, p: rawptr, byte_size: int, n_read: ^int = nil) -> (n: int, err: Error) { + size := len(slice)*size_of(T) + return read_ptr(w, raw_data(slice), size, n_read) +} + write_ptr :: proc(w: Writer, p: rawptr, byte_size: int, n_written: ^int = nil) -> (n: int, err: Error) { return write(w, ([^]byte)(p)[:byte_size], n_written) } @@ -20,6 +25,12 @@ write_ptr_at :: proc(w: Writer_At, p: rawptr, byte_size: int, offset: i64, n_wri return write_at(w, ([^]byte)(p)[:byte_size], offset, n_written) } +write_slice :: proc(w: Writer, slice: $S/[]$T, n_written: ^int = nil) -> (n: int, err: Error) { + size := len(slice)*size_of(T) + return write_ptr(w, raw_data(slice), size, n_written) +} + + write_u64 :: proc(w: Writer, i: u64, base: int = 10, n_written: ^int = nil) -> (n: int, err: Error) { buf: [64]byte s := strconv.write_bits(buf[:], i, base, false, 64, strconv.digits, nil) diff --git a/core/os/file_util.odin b/core/os/file_util.odin index 505432338..235362e04 100644 --- a/core/os/file_util.odin +++ b/core/os/file_util.odin @@ -111,6 +111,25 @@ read_ptr :: proc(f: ^File, data: rawptr, len: int) -> (n: int, err: Error) { } +/* + `write_slice` is a utility procedure that writes the bytes points at `slice`. + + It is equivalent to: `write(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0]))])` +*/ +write_slice :: proc(f: ^File, slice: $S/[]$T) -> (n: int, err: Error) { + return write(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0]))]) +} + +/* + `read_slice` is a utility procedure that writes the bytes points at `slice`. + + It is equivalent to: `read(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0]))])` +*/ +read_slice :: proc(f: ^File, slice: $S/[]$T) -> (n: int, err: Error) { + return read(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0]))]) +} + + /* `read_at_least` reads from `f` into `buf` until it has read at least `min` bytes. From 442b163871b2198f2ec411519d2932086e9272bc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Feb 2026 14:41:09 +0000 Subject: [PATCH 497/766] Fix typos --- core/io/util.odin | 2 +- core/os/file_util.odin | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/io/util.odin b/core/io/util.odin index c1d8d2808..c6ad8f525 100644 --- a/core/io/util.odin +++ b/core/io/util.odin @@ -8,7 +8,7 @@ read_ptr :: proc(r: Reader, p: rawptr, byte_size: int, n_read: ^int = nil) -> (n return read(r, ([^]byte)(p)[:byte_size], n_read) } -read_slice :: proc(r: Reader, p: rawptr, byte_size: int, n_read: ^int = nil) -> (n: int, err: Error) { +read_slice :: proc(r: Reader, slice: $S/[]$T, n_read: ^int = nil) -> (n: int, err: Error) { size := len(slice)*size_of(T) return read_ptr(w, raw_data(slice), size, n_read) } diff --git a/core/os/file_util.odin b/core/os/file_util.odin index 235362e04..854977b01 100644 --- a/core/os/file_util.odin +++ b/core/os/file_util.odin @@ -114,19 +114,19 @@ read_ptr :: proc(f: ^File, data: rawptr, len: int) -> (n: int, err: Error) { /* `write_slice` is a utility procedure that writes the bytes points at `slice`. - It is equivalent to: `write(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0]))])` + It is equivalent to: `write(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0])])` */ write_slice :: proc(f: ^File, slice: $S/[]$T) -> (n: int, err: Error) { - return write(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0]))]) + return write(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0])]) } /* `read_slice` is a utility procedure that writes the bytes points at `slice`. - It is equivalent to: `read(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0]))])` + It is equivalent to: `read(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0])])` */ read_slice :: proc(f: ^File, slice: $S/[]$T) -> (n: int, err: Error) { - return read(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0]))]) + return read(f, ([^]byte)(raw_data(slice))[:len(slice)*size_of(slice[0])]) } From 96d6eec8e568e359176816f86236a9153ffede63 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Feb 2026 14:55:59 +0000 Subject: [PATCH 498/766] Add `reader_read_slice` and `reader_read_slice_at` --- core/bytes/reader.odin | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/bytes/reader.odin b/core/bytes/reader.odin index 184f93835..1f2f8f9d0 100644 --- a/core/bytes/reader.odin +++ b/core/bytes/reader.odin @@ -61,6 +61,17 @@ reader_read_at :: proc(r: ^Reader, p: []byte, off: i64) -> (n: int, err: io.Erro } return } +reader_read_slice :: proc(r: ^Reader, slice: $T/[]$S) -> (n: int, err: io.Error) { + b := ([^]byte)(raw_data(slice))[:len(slice)*size_of(S)] + return reader_read(r, b) +} + +reader_read_slice_at :: proc(r: ^Reader, slice: $T/[]$S, off: i64) -> (n: int, err: io.Error) { + b := ([^]byte)(raw_data(slice))[:len(slice)*size_of(S)] + return reader_read_at(r, b, offset) +} + + reader_read_byte :: proc(r: ^Reader) -> (byte, io.Error) { r.prev_rune = -1 if r.i >= i64(len(r.s)) { From ad6cde0b3c4653ad524e69846cfc96b8b2f36e43 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Feb 2026 14:57:50 +0000 Subject: [PATCH 499/766] Add `reader_read_*` utilities for slices and `rawptr` --- core/bytes/reader.odin | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/bytes/reader.odin b/core/bytes/reader.odin index 1f2f8f9d0..189a269ed 100644 --- a/core/bytes/reader.odin +++ b/core/bytes/reader.odin @@ -68,7 +68,17 @@ reader_read_slice :: proc(r: ^Reader, slice: $T/[]$S) -> (n: int, err: io.Error) reader_read_slice_at :: proc(r: ^Reader, slice: $T/[]$S, off: i64) -> (n: int, err: io.Error) { b := ([^]byte)(raw_data(slice))[:len(slice)*size_of(S)] - return reader_read_at(r, b, offset) + return reader_read_at(r, b, off) +} + +reader_read_ptr :: proc(r: ^Reader, data: rawptr, len: int) -> (n: int, err: io.Error) { + b := ([^]byte)(data)[:len] + return reader_read(r, b) +} + +reader_read_ptr_at :: proc(r: ^Reader, data: rawptr, len: int, off: i64) -> (n: int, err: io.Error) { + b := ([^]byte)(data)[:len] + return reader_read_at(r, b, off) } From 97e09b19d14528a216b502d46b3ea8090a1d1887 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 17 Feb 2026 18:27:34 +0100 Subject: [PATCH 500/766] refactor d3d11/d3d12/d3dcompiler dependencies --- vendor/directx/d3d11/d3d11.odin | 34 +++++++++-- vendor/directx/d3d12/d3d12.odin | 12 ++-- vendor/directx/d3d_common/d3d_common.odin | 25 ++++++++ vendor/directx/d3d_compiler/d3d_compiler.odin | 57 +++---------------- 4 files changed, 67 insertions(+), 61 deletions(-) create mode 100644 vendor/directx/d3d_common/d3d_common.odin diff --git a/vendor/directx/d3d11/d3d11.odin b/vendor/directx/d3d11/d3d11.odin index 517146c8a..51e27ba21 100644 --- a/vendor/directx/d3d11/d3d11.odin +++ b/vendor/directx/d3d11/d3d11.odin @@ -4,7 +4,7 @@ package directx_d3d11 foreign import "system:d3d11.lib" import "../dxgi" -import "../d3d_compiler" +import "../d3d_common" import "core:sys/windows" IUnknown :: dxgi.IUnknown @@ -26,9 +26,7 @@ LPCWSTR :: windows.LPCWSTR RECT :: dxgi.RECT SIZE :: dxgi.SIZE -IModuleInstance :: d3d_compiler.ID3D11ModuleInstance -IBlob :: d3d_compiler.ID3DBlob -IModule :: d3d_compiler.ID3D11Module +IBlob :: d3d_common.ID3DBlob @(default_calling_convention="system", link_prefix="D3D11") foreign d3d11 { @@ -3569,6 +3567,34 @@ PARAMETER_DESC :: struct { FirstOutComponent: u32, } +IModule :: struct #raw_union { + #subtype iunknown: IUnknown, + using id3d11module_vtable: ^IModule_VTable, +} +IModule_VTable :: struct { + using iunknown_vtable: IUnknown_VTable, + CreateInstance: proc "system" (this: ^IModule, pNamespace: LPCSTR, ppModuleInstance: ^^IModuleInstance) -> HRESULT, +} + +IModuleInstance :: struct #raw_union { + #subtype iunknown: IUnknown, + using id3d11moduleinstance_vtable: ^IModuleInstance_VTable, +} +IModuleInstance_VTable :: struct { + using iunknown_vtable: IUnknown_VTable, + BindConstantBuffer: proc "system" (this: ^IModuleInstance, uSrcSlot: u32, uDstSlot: u32, cbDstOffset: u32) -> HRESULT, + BindConstantBufferByName: proc "system" (this: ^IModuleInstance, pName: LPCSTR, uDstSlot: u32, cbDstOffset: u32) -> HRESULT, + BindResource: proc "system" (this: ^IModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, + BindResourceByName: proc "system" (this: ^IModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, + BindSampler: proc "system" (this: ^IModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, + BindSamplerByName: proc "system" (this: ^IModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, + BindUnorderedAccessView: proc "system" (this: ^IModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, + BindUnorderedAccessViewByName: proc "system" (this: ^IModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, + BindResourceAsUnorderedAccessView: proc "system" (this: ^IModuleInstance, uSrcSrvSlot: u32, uDstUavSlot: u32, uCount: u32) -> HRESULT, + BindResourceAsUnorderedAccessViewByName: proc "system" (this: ^IModuleInstance, pSrvName: LPCSTR, uDstUavSlot: u32, uCount: u32) -> HRESULT, +} + + ID3D11ShaderReflectionType_UUID_STRING :: "6E6FFA6A-9BAE-4613-A51E-91652D508C21" ID3D11ShaderReflectionType_UUID := &IID{0x6E6FFA6A, 0x9BAE, 0x4613, {0xA5, 0x1E, 0x91, 0x65, 0x2D, 0x50, 0x8C, 0x21}} IShaderReflectionType :: struct { diff --git a/vendor/directx/d3d12/d3d12.odin b/vendor/directx/d3d12/d3d12.odin index fba1c6e26..8611172f8 100644 --- a/vendor/directx/d3d12/d3d12.odin +++ b/vendor/directx/d3d12/d3d12.odin @@ -4,7 +4,7 @@ package directx_d3d12 foreign import "system:d3d12.lib" import "../dxgi" -import "../d3d_compiler" +import "../d3d_common" import win32 "core:sys/windows" IUnknown :: dxgi.IUnknown @@ -26,9 +26,7 @@ RECT :: dxgi.RECT LPCSTR :: win32.LPCSTR LPCWSTR :: win32.LPCWSTR -IModuleInstance :: d3d_compiler.ID3D11ModuleInstance -IBlob :: d3d_compiler.ID3DBlob -IModule :: d3d_compiler.ID3D11Module +IBlob :: d3d_common.ID3DBlob @(default_calling_convention="system", link_prefix="D3D12") foreign d3d12 { @@ -1236,7 +1234,7 @@ TRI_STATE :: enum i32 { UNKNOWN = -1, FALSE = 0, TRUE = 1, -} +} FEATURE_DATA_OPTIONS12 :: struct { MSPrimitivesPipelineStatisticIncludesCulledPrimitives: TRI_STATE, @@ -2597,7 +2595,7 @@ IDescriptorHeap_VTable :: struct { GetDesc: proc "system" (this: ^IDescriptorHeap, desc: ^DESCRIPTOR_HEAP_DESC), GetCPUDescriptorHandleForHeapStart: proc "system" (this: ^IDescriptorHeap, handle: ^CPU_DESCRIPTOR_HANDLE), GetGPUDescriptorHandleForHeapStart: proc "system" (this: ^IDescriptorHeap, handle: ^GPU_DESCRIPTOR_HANDLE), -} +} IQueryHeap_UUID_STRING :: "0d9658ae-ed45-469e-a61d-970ec583cab4" IQueryHeap_UUID := &IID{0x0d9658ae, 0xed45, 0x469e, {0xa6, 0x1d, 0x97, 0x0e, 0xc5, 0x83, 0xca, 0xb4}} @@ -5495,7 +5493,7 @@ IGraphicsCommandList7_VTable :: struct { SHADER_VERSION_TYPE :: enum u32 { PIXEL_SHADER = 0, VERTEX_SHADER = 1, - GEOMETRY_SHADER = 2, + GEOMETRY_SHADER = 2, HULL_SHADER = 3, DOMAIN_SHADER = 4, diff --git a/vendor/directx/d3d_common/d3d_common.odin b/vendor/directx/d3d_common/d3d_common.odin new file mode 100644 index 000000000..af3d09ec9 --- /dev/null +++ b/vendor/directx/d3d_common/d3d_common.odin @@ -0,0 +1,25 @@ +// Declarations shared between D3D versions. +// Based on d3dcommon.h +package d3d_common + +import "core:sys/windows" + +IID :: windows.IID +SIZE_T :: windows.SIZE_T +IUnknown :: windows.IUnknown +IUnknown_VTable :: windows.IUnknown_VTable + +ID3D10Blob_UUID_STRING :: "8BA5FB08-5195-40E2-AC58-0D989C3A0102" +ID3D10Blob_UUID := &IID{0x8BA5FB08, 0x5195, 0x40E2, {0xAC, 0x58, 0x0D, 0x98, 0x9C, 0x3A, 0x01, 0x02}} +ID3D10Blob :: struct #raw_union { + #subtype iunknown: IUnknown, + using id3d10blob_vtable: ^ID3D10Blob_VTable, +} +ID3D10Blob_VTable :: struct { + using iunknown_vtable: IUnknown_VTable, + GetBufferPointer: proc "system" (this: ^ID3D10Blob) -> rawptr, + GetBufferSize: proc "system" (this: ^ID3D10Blob) -> SIZE_T, +} + +ID3DBlob :: ID3D10Blob +ID3DBlob_VTable :: ID3D10Blob_VTable diff --git a/vendor/directx/d3d_compiler/d3d_compiler.odin b/vendor/directx/d3d_compiler/d3d_compiler.odin index 17a835f23..0274ce638 100644 --- a/vendor/directx/d3d_compiler/d3d_compiler.odin +++ b/vendor/directx/d3d_compiler/d3d_compiler.odin @@ -7,8 +7,9 @@ import win32 "core:sys/windows" D3DCOMPILER_DLL_A :: "d3dcompiler_47.dll" COMPILER_VERSION :: 47 - import "../dxgi" +import "../d3d11" +import "../d3d_common" BOOL :: dxgi.BOOL IID :: dxgi.IID @@ -17,6 +18,8 @@ HRESULT :: dxgi.HRESULT IUnknown :: dxgi.IUnknown IUnknown_VTable :: dxgi.IUnknown_VTable +ID3DBlob :: d3d_common.ID3DBlob + LPCSTR :: win32.LPCSTR LPCWSTR :: win32.LPCWSTR @@ -34,7 +37,7 @@ foreign d3dcompiler { Disassemble :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: LPCSTR, ppDisassembly: ^^ID3DBlob) -> HRESULT --- DisassembleRegion :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: LPCSTR, StartByteOffset: SIZE_T, NumInsts: SIZE_T, pFinishByteOffset: ^SIZE_T, ppDisassembly: ^^ID3DBlob) -> HRESULT --- CreateLinker :: proc(ppLinker: ^^ID3D11Linker) -> HRESULT --- - LoadModule :: proc(pSrcData: rawptr, cbSrcDataSize: SIZE_T, ppModule: ^^ID3D11Module) -> HRESULT --- + LoadModule :: proc(pSrcData: rawptr, cbSrcDataSize: SIZE_T, ppModule: ^^d3d11.IModule) -> HRESULT --- GetTraceInstructionOffsets :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, StartInstIndex: SIZE_T, NumInsts: SIZE_T, pOffsets: ^SIZE_T, pTotalInsts: ^SIZE_T) -> HRESULT --- GetInputSignatureBlob :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, ppSignatureBlob: ^^ID3DBlob) -> HRESULT --- GetOutputSignatureBlob :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, ppSignatureBlob: ^^ID3DBlob) -> HRESULT --- @@ -121,23 +124,6 @@ SHADER_MACRO :: struct { Definition: LPCSTR, } -ID3D10Blob_UUID_STRING :: "8BA5FB08-5195-40E2-AC58-0D989C3A0102" -ID3D10Blob_UUID := &IID{0x8BA5FB08, 0x5195, 0x40E2, {0xAC, 0x58, 0x0D, 0x98, 0x9C, 0x3A, 0x01, 0x02}} -ID3D10Blob :: struct #raw_union { - #subtype iunknown: IUnknown, - using id3d10blob_vtable: ^ID3D10Blob_VTable, -} -ID3D10Blob_VTable :: struct { - using iunknown_vtable: IUnknown_VTable, - GetBufferPointer: proc "system" (this: ^ID3D10Blob) -> rawptr, - GetBufferSize: proc "system" (this: ^ID3D10Blob) -> SIZE_T, -} - - -ID3DBlob :: ID3D10Blob -ID3DBlob_VTable :: ID3D10Blob_VTable - - INCLUDE_TYPE :: enum i32 { INCLUDE_LOCAL = 0, INCLUDE_SYSTEM = 1, @@ -158,43 +144,14 @@ ID3DInclude_VTable :: struct { D3DCOMPILE_STANDARD_FILE_INCLUDE :: (^ID3DInclude)(uintptr(1)) -ID3D11Module :: struct #raw_union { - #subtype iunknown: IUnknown, - using id3d11module_vtable: ^ID3D11Module_VTable, -} -ID3D11Module_VTable :: struct { - using iunknown_vtable: IUnknown_VTable, - CreateInstance: proc "system" (this: ^ID3D11Module, pNamespace: LPCSTR, ppModuleInstance: ^^ID3D11ModuleInstance) -> HRESULT, -} - - -ID3D11ModuleInstance :: struct #raw_union { - #subtype iunknown: IUnknown, - using id3d11moduleinstance_vtable: ^ID3D11ModuleInstance_VTable, -} -ID3D11ModuleInstance_VTable :: struct { - using iunknown_vtable: IUnknown_VTable, - BindConstantBuffer: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, cbDstOffset: u32) -> HRESULT, - BindConstantBufferByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, cbDstOffset: u32) -> HRESULT, - BindResource: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, - BindResourceByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, - BindSampler: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, - BindSamplerByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, - BindUnorderedAccessView: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, - BindUnorderedAccessViewByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, - BindResourceAsUnorderedAccessView: proc "system" (this: ^ID3D11ModuleInstance, uSrcSrvSlot: u32, uDstUavSlot: u32, uCount: u32) -> HRESULT, - BindResourceAsUnorderedAccessViewByName: proc "system" (this: ^ID3D11ModuleInstance, pSrvName: LPCSTR, uDstUavSlot: u32, uCount: u32) -> HRESULT, -} - - ID3D11Linker :: struct #raw_union { #subtype iunknown: IUnknown, using id3d11linker_vtable: ^ID3D11Linker_VTable, } ID3D11Linker_VTable :: struct { using iunknown_vtable: IUnknown_VTable, - Link: proc "system" (this: ^ID3D11Linker, pEntry: ^ID3D11ModuleInstance, pEntryName: LPCSTR, pTargetName: LPCSTR, uFlags: u32, ppShaderBlob: ^^ID3DBlob, ppErrorBuffer: ^^ID3DBlob) -> HRESULT, - UseLibrary: proc "system" (this: ^ID3D11Linker, pLibraryMI: ^ID3D11ModuleInstance) -> HRESULT, + Link: proc "system" (this: ^ID3D11Linker, pEntry: ^d3d11.IModuleInstance, pEntryName: LPCSTR, pTargetName: LPCSTR, uFlags: u32, ppShaderBlob: ^^ID3DBlob, ppErrorBuffer: ^^ID3DBlob) -> HRESULT, + UseLibrary: proc "system" (this: ^ID3D11Linker, pLibraryMI: ^d3d11.IModuleInstance) -> HRESULT, AddClipPlaneFromCBuffer: proc "system" (this: ^ID3D11Linker, uCBufferSlot: u32, uCBufferEntry: u32) -> HRESULT, } From e8aac50f8b244eed0fc872010788c19a12f8a87b Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 17 Feb 2026 18:34:37 +0100 Subject: [PATCH 501/766] math/rand math/bits dependency --- core/math/rand/rand_xoshiro256.odin | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/math/rand/rand_xoshiro256.odin b/core/math/rand/rand_xoshiro256.odin index 7326ba8d5..6f5dbe545 100644 --- a/core/math/rand/rand_xoshiro256.odin +++ b/core/math/rand/rand_xoshiro256.odin @@ -3,8 +3,6 @@ package rand import "base:intrinsics" import "base:runtime" -import "core:math/bits" - /* The state for a xoshiro256** pseudorandom generator. */ @@ -17,7 +15,7 @@ xoshiro256_random_generator_proc :: proc(data: rawptr, mode: runtime.Random_Gene read_u64 :: proc "contextless" (r: ^Xoshiro256_Random_State) -> u64 { // xoshiro256** output function and state transition - result := bits.rotate_left64(r.s[1] * 5, 7) * 9 + result := rotate_left64(r.s[1] * 5, 7) * 9 t := r.s[1] << 17 r.s[2] = r.s[2] ~ r.s[0] @@ -25,9 +23,15 @@ xoshiro256_random_generator_proc :: proc(data: rawptr, mode: runtime.Random_Gene r.s[1] = r.s[1] ~ r.s[2] r.s[0] = r.s[0] ~ r.s[3] r.s[2] = r.s[2] ~ t - r.s[3] = bits.rotate_left64(r.s[3], 45) + r.s[3] = rotate_left64(r.s[3], 45) return result + + rotate_left64 :: proc "contextless" (x: u64, k: int) -> u64 { + n :: 64 + s := uint(k) & (n-1) + return x << s | x >> (n-s) + } } @(thread_local) From 8a7fb8bd4e85405b241be75412ca99392262d596 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 17 Feb 2026 18:51:41 +0100 Subject: [PATCH 502/766] net: generate DNS ID with context.random_generator directly --- core/net/dns.odin | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/net/dns.odin b/core/net/dns.odin index 6af18798b..54cc57c38 100644 --- a/core/net/dns.odin +++ b/core/net/dns.odin @@ -25,7 +25,6 @@ package net import "base:runtime" import "core:bufio" import "core:io" -import "core:math/rand" import "core:mem" import "core:strings" import "core:time" @@ -192,7 +191,10 @@ get_dns_records_from_nameservers :: proc(hostname: string, type: DNS_Record_Type init_dns_configuration() context.allocator = allocator - id := u16be(rand.uint32()) + id: u16be + rand_ok := runtime.random_generator_read_ptr(context.random_generator, &id, size_of(id)) + assert(rand_ok, "uninitialized gen/context.random_generator") + dns_packet_buf: [DNS_PACKET_MIN_LEN]byte = --- dns_packet := make_dns_packet(dns_packet_buf[:], id, hostname, type) or_return From cd3ba3c3d5a97bffce6a9741806fca8ff180c981 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 17 Feb 2026 18:56:39 +0100 Subject: [PATCH 503/766] unused intrinsics import in core:hash --- core/hash/crc32.odin | 2 -- core/hash/hash.odin | 9 ++++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/core/hash/crc32.odin b/core/hash/crc32.odin index 0a4617f6d..777209bed 100644 --- a/core/hash/crc32.odin +++ b/core/hash/crc32.odin @@ -1,7 +1,5 @@ package hash -import "base:intrinsics" - @(optimization_mode="favor_size") crc32 :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 #no_bounds_check { crc := ~seed diff --git a/core/hash/hash.odin b/core/hash/hash.odin index 6c048c05b..b495fd30d 100644 --- a/core/hash/hash.odin +++ b/core/hash/hash.odin @@ -1,7 +1,6 @@ package hash import "core:mem" -import "base:intrinsics" @(optimization_mode="favor_size") adler32 :: proc "contextless" (data: []byte, seed := u32(1)) -> u32 #no_bounds_check { @@ -57,14 +56,14 @@ djb2 :: proc "contextless" (data: []byte, seed := u32(5381)) -> u32 { djbx33a :: proc "contextless" (data: []byte, seed := u32(5381)) -> (result: [16]byte) #no_bounds_check { state := [4]u32{seed, seed, seed, seed} - + s: u32 = 0 for p in data { state[s] = (state[s] << 5) + state[s] + u32(p) // hash * 33 + u32(b) s = (s + 1) & 3 } - - + + (^u32le)(&result[0])^ = u32le(state[0]) (^u32le)(&result[4])^ = u32le(state[1]) (^u32le)(&result[8])^ = u32le(state[2]) @@ -160,7 +159,7 @@ murmur32 :: proc "contextless" (data: []byte, seed := u32(0x9747b28c)) -> u32 { case 1: k1 ~= u32(tail[0]) k1 *= c1_32 - k1 = (k1 << 15) | (k1 >> 17) + k1 = (k1 << 15) | (k1 >> 17) k1 *= c2_32 h1 ~= k1 } From 111c2506d5dae2fbfa74d94fcaa9f436fcda35e7 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Tue, 17 Feb 2026 14:40:15 -0500 Subject: [PATCH 504/766] Fix typo in xar.array_linear_search() return --- core/container/xar/xar.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index b200df0e6..e7215af71 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -410,7 +410,7 @@ array_linear_search :: proc(x: ^$X/Array($T, $SHIFT), elem: T) -> (index: int, f return i, true } } - return -1, flase + return -1, false } From 0deacb687114ccd113eefe69c7dd93355301764e Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Tue, 17 Feb 2026 15:31:17 -0500 Subject: [PATCH 505/766] In handle_map.dynamic_add(), 'item' has been appended to the xar so this additional assignment is unneeded. --- core/container/handle_map/dynamic_handle_map.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/container/handle_map/dynamic_handle_map.odin b/core/container/handle_map/dynamic_handle_map.odin index 053bbdc43..4024ac5b6 100644 --- a/core/container/handle_map/dynamic_handle_map.odin +++ b/core/container/handle_map/dynamic_handle_map.odin @@ -52,7 +52,6 @@ dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc := i := xar.len(m.items)-1 ptr := xar.get_ptr_unsafe(&m.items, i) - ptr^ = item ptr.handle.idx = auto_cast i ptr.handle.gen = 1 From 47775214d6287537d6e148c37e0c49aa8228b81b Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Tue, 17 Feb 2026 21:51:01 +0100 Subject: [PATCH 506/766] Fix some tools and examples after core:os update and using-stmt feature --- .../tools/edwards_gen_tables.odin | 8 +++++-- .../_weierstrass/tools/ecc_gen_tables.odin | 8 +++++-- core/encoding/xml/example/xml_example.odin | 22 ++++++++----------- core/unicode/tools/generate_entity_table.odin | 18 +++++++++++---- 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/core/crypto/_edwards25519/tools/edwards_gen_tables.odin b/core/crypto/_edwards25519/tools/edwards_gen_tables.odin index d05534d9d..15df478ea 100644 --- a/core/crypto/_edwards25519/tools/edwards_gen_tables.odin +++ b/core/crypto/_edwards25519/tools/edwards_gen_tables.odin @@ -1,4 +1,4 @@ -package weistrass_tools +package edwards_tools import ed "core:crypto/_edwards25519" import field "core:crypto/_fiat/field_curve25519" @@ -78,7 +78,11 @@ main :: proc() { } } - fn := path.join({ODIN_ROOT, "core", "crypto", "_edwards25519", "edwards25519_table.odin"}) + fn, err := path.join({ODIN_ROOT, "core", "crypto", "_edwards25519", "edwards25519_table.odin"}, context.allocator) + if err != .None { + fmt.printfln("Join path error for edwards25519_table.odin: %v", err); + os.exit(1); + } bld: strings.Builder w := strings.to_writer(&bld) diff --git a/core/crypto/_weierstrass/tools/ecc_gen_tables.odin b/core/crypto/_weierstrass/tools/ecc_gen_tables.odin index 609c19cd0..33f6d7510 100644 --- a/core/crypto/_weierstrass/tools/ecc_gen_tables.odin +++ b/core/crypto/_weierstrass/tools/ecc_gen_tables.odin @@ -1,4 +1,4 @@ -package weistrass_tools +package weierstrass_tools import secec "core:crypto/_weierstrass" import "core:fmt" @@ -68,7 +68,11 @@ gen_tables :: proc($CURVE: string) { } fn_ := "sec" + CURVE + "_table.odin" - fn := path.join({ODIN_ROOT, "core", "crypto", "_weierstrass", fn_}) + fn, err := path.join({ODIN_ROOT, "core", "crypto", "_weierstrass", fn_}, context.allocator) + if err != .None { + fmt.printfln("Join path error for %s: %v", fn_, err); + os.exit(1); + } bld: strings.Builder w := strings.to_writer(&bld) diff --git a/core/encoding/xml/example/xml_example.odin b/core/encoding/xml/example/xml_example.odin index 9648143db..267ae2ca9 100644 --- a/core/encoding/xml/example/xml_example.odin +++ b/core/encoding/xml/example/xml_example.odin @@ -10,8 +10,6 @@ import "core:hash" N :: 1 example :: proc() { - using fmt - docs: [N]^xml.Document errs: [N]xml.Error times: [N]time.Duration @@ -59,23 +57,23 @@ example :: proc() { fmt.printf("[Average]: %v bytes in %.2f ms (%.2f MiB/s).\n", len(input), average_ms, average_speed) if errs[0] != .None { - printf("Load/Parse error: %v\n", errs[0]) + fmt.printf("Load/Parse error: %v\n", errs[0]) if errs[0] == .File_Error { - println("\"unicode.xml\" not found. Did you run \"tests\\download_assets.py\"?") + fmt.println("\"unicode.xml\" not found. Did you run \"tests\\download_assets.py\"?") } return } charlist, charlist_ok := xml.find_child_by_ident(docs[0], 0, "charlist") if !charlist_ok { - eprintln("Could not locate top-level `` tag.") - return + fmt.eprintln("Could not locate top-level `` tag.") + return } - printf("Found `` with %v children, %v elements total\n", len(docs[0].elements[charlist].value), docs[0].element_count) + fmt.printf("Found `` with %v children, %v elements total\n", len(docs[0].elements[charlist].value), docs[0].element_count) crc32 := doc_hash(docs[0], false) - printf("[%v] CRC32: 0x%08x\n", "🎉" if crc32 == 0x420dbac5 else "🤬", crc32) + fmt.printf("[%v] CRC32: 0x%08x\n", "🎉" if crc32 == 0x420dbac5 else "🤬", crc32) for round in 0.. (crc32: u32) { } main :: proc() { - using fmt - track: mem.Tracking_Allocator mem.tracking_allocator_init(&track, context.allocator) context.allocator = mem.tracking_allocator(&track) @@ -103,10 +99,10 @@ main :: proc() { example() if len(track.allocation_map) > 0 { - println() + fmt.println() for _, v in track.allocation_map { - printf("%v Leaked %v bytes.\n", v.location, v.size) + fmt.printf("%v Leaked %v bytes.\n", v.location, v.size) } } - println("Done and cleaned up!") + fmt.println("Done and cleaned up!") } diff --git a/core/unicode/tools/generate_entity_table.odin b/core/unicode/tools/generate_entity_table.odin index 54f73370c..116bc433f 100644 --- a/core/unicode/tools/generate_entity_table.odin +++ b/core/unicode/tools/generate_entity_table.odin @@ -1,4 +1,4 @@ -package xml_example +package xml_tools import "core:encoding/xml" import "core:os" @@ -20,12 +20,22 @@ Entity :: struct { } main :: proc() { - filename := path.join({ODIN_ROOT, "tests", "core", "assets", "XML", "unicode.xml"}) + filename, err_xml := path.join({ODIN_ROOT, "tests", "core", "assets", "XML", "unicode.xml"}, context.allocator) defer delete(filename) - generated_filename := path.join({ODIN_ROOT, "core", "encoding", "entity", "generated.odin"}) + if err_xml != .None { + fmt.printfln("Join path error for unicode.xml: %v", err_xml); + os.exit(1); + } + + generated_filename, err_generated := path.join({ODIN_ROOT, "core", "encoding", "entity", "generated.odin"}, context.allocator) defer delete(generated_filename) + if err_generated != .None { + fmt.printfln("Join path error for generated.odin: %v", err_generated); + os.exit(1); + } + doc, err := xml.load_from_file(filename, OPTIONS, Error_Handler) defer xml.destroy(doc) @@ -265,4 +275,4 @@ is_dotted_name :: proc(name: string) -> (dotted: bool) { if r == '.' { return true} } return false -} \ No newline at end of file +} From a48a4b98ce63a4aa928cda6c8057f86276758da3 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:51:23 +0100 Subject: [PATCH 507/766] remove FORCE_DWORD enum elements --- vendor/directx/d3d_compiler/d3d_compiler.odin | 1 - vendor/directx/dxc/dxcapi.odin | 5 ++--- vendor/directx/dxgi/dxgi.odin | 1 - 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/vendor/directx/d3d_compiler/d3d_compiler.odin b/vendor/directx/d3d_compiler/d3d_compiler.odin index 0274ce638..85c5cb46c 100644 --- a/vendor/directx/d3d_compiler/d3d_compiler.odin +++ b/vendor/directx/d3d_compiler/d3d_compiler.odin @@ -129,7 +129,6 @@ INCLUDE_TYPE :: enum i32 { INCLUDE_SYSTEM = 1, _10_INCLUDE_LOCAL = 0, _10_INCLUDE_SYSTEM = 1, - INCLUDE_FORCE_DWORD = 2147483647, } ID3DInclude :: struct { diff --git a/vendor/directx/dxc/dxcapi.odin b/vendor/directx/dxc/dxcapi.odin index 1d3155feb..326d3b3f3 100644 --- a/vendor/directx/dxc/dxcapi.odin +++ b/vendor/directx/dxc/dxcapi.odin @@ -194,7 +194,7 @@ ICompiler :: struct #raw_union { ICompiler_VTable :: struct { using iunknown_vtable: IUnknown_VTable, Compile: proc "system" ( - this: ^ICompiler, + this: ^ICompiler, pSource: ^IBlob, pSourceName: wstring, pEntryPoint: wstring, @@ -206,7 +206,7 @@ ICompiler_VTable :: struct { pIncludeHandler: ^IIncludeHandler, ppResult: ^^IOperationResult) -> HRESULT, Preprocess: proc "system" ( - this: ^ICompiler, + this: ^ICompiler, pSource: ^IBlob, pSourceName: wstring, pArguments: [^]wstring, @@ -303,7 +303,6 @@ DXC_OUT_KIND :: enum u32 { REFLECTION = 8, ROOT_SIGNATURE = 9, EXTRA_OUTPUTS = 10, - FORCE_DWORD = 0xFFFFFFFF, } IResult_UUID_STRING :: "58346CDA-DDE7-4497-9461-6F87AF5E0659" diff --git a/vendor/directx/dxgi/dxgi.odin b/vendor/directx/dxgi/dxgi.odin index 05b3925ff..8865a5f7c 100644 --- a/vendor/directx/dxgi/dxgi.odin +++ b/vendor/directx/dxgi/dxgi.odin @@ -752,7 +752,6 @@ ALPHA_MODE :: enum i32 { PREMULTIPLIED = 1, STRAIGHT = 2, IGNORE = 3, - FORCE_DWORD = -1, } From a90f2ad3a0233803f220a4d2b132a474f8044781 Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Tue, 17 Feb 2026 23:08:32 +0100 Subject: [PATCH 508/766] Print errors in tools and examples to stderr --- core/crypto/_edwards25519/tools/edwards_gen_tables.odin | 2 +- core/crypto/_weierstrass/tools/ecc_gen_tables.odin | 2 +- core/encoding/xml/example/xml_example.odin | 4 ++-- core/unicode/tools/generate_entity_table.odin | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/crypto/_edwards25519/tools/edwards_gen_tables.odin b/core/crypto/_edwards25519/tools/edwards_gen_tables.odin index 15df478ea..a204e6ac6 100644 --- a/core/crypto/_edwards25519/tools/edwards_gen_tables.odin +++ b/core/crypto/_edwards25519/tools/edwards_gen_tables.odin @@ -80,7 +80,7 @@ main :: proc() { fn, err := path.join({ODIN_ROOT, "core", "crypto", "_edwards25519", "edwards25519_table.odin"}, context.allocator) if err != .None { - fmt.printfln("Join path error for edwards25519_table.odin: %v", err); + fmt.eprintfln("Join path error for edwards25519_table.odin: %v", err); os.exit(1); } bld: strings.Builder diff --git a/core/crypto/_weierstrass/tools/ecc_gen_tables.odin b/core/crypto/_weierstrass/tools/ecc_gen_tables.odin index 33f6d7510..3211c65f3 100644 --- a/core/crypto/_weierstrass/tools/ecc_gen_tables.odin +++ b/core/crypto/_weierstrass/tools/ecc_gen_tables.odin @@ -70,7 +70,7 @@ gen_tables :: proc($CURVE: string) { fn_ := "sec" + CURVE + "_table.odin" fn, err := path.join({ODIN_ROOT, "core", "crypto", "_weierstrass", fn_}, context.allocator) if err != .None { - fmt.printfln("Join path error for %s: %v", fn_, err); + fmt.eprintfln("Join path error for %s: %v", fn_, err); os.exit(1); } bld: strings.Builder diff --git a/core/encoding/xml/example/xml_example.odin b/core/encoding/xml/example/xml_example.odin index 267ae2ca9..5ea689069 100644 --- a/core/encoding/xml/example/xml_example.odin +++ b/core/encoding/xml/example/xml_example.odin @@ -57,9 +57,9 @@ example :: proc() { fmt.printf("[Average]: %v bytes in %.2f ms (%.2f MiB/s).\n", len(input), average_ms, average_speed) if errs[0] != .None { - fmt.printf("Load/Parse error: %v\n", errs[0]) + fmt.eprintf("Load/Parse error: %v\n", errs[0]) if errs[0] == .File_Error { - fmt.println("\"unicode.xml\" not found. Did you run \"tests\\download_assets.py\"?") + fmt.eprintln("\"unicode.xml\" not found. Did you run \"tests\\download_assets.py\"?") } return } diff --git a/core/unicode/tools/generate_entity_table.odin b/core/unicode/tools/generate_entity_table.odin index 116bc433f..2fe127caf 100644 --- a/core/unicode/tools/generate_entity_table.odin +++ b/core/unicode/tools/generate_entity_table.odin @@ -24,7 +24,7 @@ main :: proc() { defer delete(filename) if err_xml != .None { - fmt.printfln("Join path error for unicode.xml: %v", err_xml); + fmt.eprintfln("Join path error for unicode.xml: %v", err_xml); os.exit(1); } @@ -32,7 +32,7 @@ main :: proc() { defer delete(generated_filename) if err_generated != .None { - fmt.printfln("Join path error for generated.odin: %v", err_generated); + fmt.eprintfln("Join path error for generated.odin: %v", err_generated); os.exit(1); } @@ -40,7 +40,7 @@ main :: proc() { defer xml.destroy(doc) if err != .None { - fmt.printfln("Load/Parse error: %v", err) + fmt.eprintfln("Load/Parse error: %v", err) if err == .File_Error { fmt.eprintfln("%q not found. Did you run \"tests\\download_assets.py\"?", filename) } From 45ac9669017cabc6ffe873fbb52c45c1265d1e38 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Tue, 17 Feb 2026 22:44:35 -0500 Subject: [PATCH 509/766] Add missing return values on xar iterators --- core/container/xar/xar.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index e7215af71..32dcf13d3 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -481,7 +481,7 @@ array_iterate_by_val :: proc(it: ^Array_Iterator($T, $SHIFT)) -> (val: T, idx: i val = array_get(it.xar, it.idx) idx = it.idx it.idx += 1 - return val, true + return val, idx, true } @@ -502,7 +502,7 @@ array_iterate_by_ptr :: proc(it: ^Array_Iterator($T, $SHIFT)) -> (val: ^T, idx: val = array_get_ptr(it.xar, it.idx) idx = it.idx it.idx += 1 - return val, true + return val, idx, true } From e87e3fba1b71632e4c2219fee52739ecb1bd62e2 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 18 Feb 2026 20:03:52 +0100 Subject: [PATCH 510/766] os: remove `process_close` and add `process_terminate` `process_wait` (optionally prefaced with a `process_kill`) can be used to properly close and free resources of the process. `process_terminate` was added because `process_kill` is a forceful exit, we were missing a way to request the process to terminate. --- core/os/process.odin | 34 +++++++++++----------- core/os/process_freebsd.odin | 8 ++---- core/os/process_js.odin | 4 +-- core/os/process_linux.odin | 22 ++++++++------ core/os/process_netbsd.odin | 5 ++-- core/os/process_openbsd.odin | 2 +- core/os/process_posix.odin | 14 ++++++--- core/os/process_posix_darwin.odin | 22 +++++++------- core/os/process_wasi.odin | 4 +-- core/os/process_windows.odin | 48 ++++++++++++++++++++++++++++++- 10 files changed, 109 insertions(+), 54 deletions(-) diff --git a/core/os/process.odin b/core/os/process.odin index 9cdaf0457..9a720af87 100644 --- a/core/os/process.odin +++ b/core/os/process.odin @@ -311,7 +311,8 @@ This procedure obtains a process handle of a process specified by `pid`. This procedure can be subject to race conditions. See the description of `Process`. -Use `process_close()` function to close the process handle. +Use the `process_wait()` procedure (optionally prefaced with a `process_kill()`) +to close and free the process handle. */ @(require_results) process_open :: proc(pid: int, flags := Process_Open_Flags {}) -> (Process, Error) { @@ -360,10 +361,8 @@ be created. It contains information such as the command line, the environment of the process, the starting directory and many other options. Most of the fields in the struct can be set to `nil` or an empty value. -Use `process_close` to close the handle to the process. Note, that this -is not the same as terminating the process. One can terminate the process -and not close the handle, in which case the handle would be leaked. In case -the function returns an error, an invalid handle is returned. +Use the `process_wait()` procedure (optionally prefaced with a `process_kill()`) +to close and free the process handle. This procedure is not thread-safe. It may alter the inheritance properties of file handles in an unpredictable manner. In case multiple threads change @@ -495,7 +494,7 @@ Process_State :: struct { // Will also store the number of the exception or signal that has crashed the // process. exit_code: int, - // Specifies whether the termination of the process was successfull or not, + // Specifies whether the termination of the process was successful or not, // i.e. whether it has crashed or not. // **Note(windows)**: On windows `true` is always returned, as there is no // reliable way to obtain information about whether the process has crashed. @@ -511,7 +510,9 @@ Wait for a process event. This procedure blocks the execution until the process has exited or the timeout (if specified) has reached zero. If the timeout is `TIMEOUT_INFINITE`, -no timeout restriction is imposed and the procedure can block indefinately. +no timeout restriction is imposed and the procedure can block indefinitely. + +If the timeout is 0, no blocking will be done and the current state is returned. If the timeout has expired, the `General_Error.Timeout` is returned as the error. @@ -525,24 +526,25 @@ process_wait :: proc(process: Process, timeout := TIMEOUT_INFINITE) -> (Process_ } /* -Close the handle to a process. +Kill a process. -This procedure closes the handle associated with a process. It **does not** -terminate a process, in case it was running. In case a termination is -desired, kill the process first, wait for the process to finish, -then close the handle. +This procedure kills a process, specified by it's handle, `process`. + +The process is forced to exit and can't ignore the request. */ @(require_results) -process_close :: proc(process: Process) -> (Error) { - return _process_close(process) +process_kill :: proc(process: Process) -> (Error) { + return _process_kill(process) } /* Terminate a process. This procedure terminates a process, specified by it's handle, `process`. + +The process is requested to exit and can ignore the request. */ @(require_results) -process_kill :: proc(process: Process) -> (Error) { - return _process_kill(process) +process_terminate :: proc(process: Process) -> (Error) { + return _process_terminate(process) } diff --git a/core/os/process_freebsd.odin b/core/os/process_freebsd.odin index ccc2549db..794991ae5 100644 --- a/core/os/process_freebsd.odin +++ b/core/os/process_freebsd.odin @@ -2,19 +2,17 @@ #+build freebsd package os -import "core:c" - foreign import libc "system:c" foreign import dl "system:dl" foreign libc { @(link_name="sysctlbyname") - _sysctlbyname :: proc(path: cstring, oldp: rawptr, oldlenp: rawptr, newp: rawptr, newlen: int) -> c.int --- + _sysctlbyname :: proc(path: cstring, oldp: rawptr, oldlenp: rawptr, newp: rawptr, newlen: int) -> i32 --- } foreign dl { @(link_name="pthread_getthreadid_np") - pthread_getthreadid_np :: proc() -> c.int --- + pthread_getthreadid_np :: proc() -> i32 --- } @(require_results) @@ -33,4 +31,4 @@ _get_processor_core_count :: proc() -> int { } return 1 -} \ No newline at end of file +} diff --git a/core/os/process_js.odin b/core/os/process_js.odin index 9b682da0c..7aa6bb1b8 100644 --- a/core/os/process_js.odin +++ b/core/os/process_js.odin @@ -66,11 +66,11 @@ _process_wait :: proc(process: Process, timeout: time.Duration) -> (process_stat return } -_process_close :: proc(process: Process) -> Error { +_process_kill :: proc(process: Process) -> (err: Error) { return .Unsupported } -_process_kill :: proc(process: Process) -> (err: Error) { +_process_terminate :: proc(process: Process) -> (err: Error) { return .Unsupported } diff --git a/core/os/process_linux.odin b/core/os/process_linux.odin index 7041e16b7..b0c9aadc6 100644 --- a/core/os/process_linux.odin +++ b/core/os/process_linux.odin @@ -5,7 +5,6 @@ package os import "base:runtime" import "base:intrinsics" -import "core:c" import "core:time" import "core:slice" import "core:strings" @@ -13,12 +12,6 @@ import "core:strconv" import "core:sys/unix" import "core:sys/linux" -foreign import libc "system:c" - -foreign libc { - @(link_name="get_nprocs") _unix_get_nprocs :: proc() -> c.int --- -} - PIDFD_UNASSIGNED :: ~uintptr(0) @(private="package") @@ -682,6 +675,8 @@ _reap_terminated :: proc(process: Process) -> (state: Process_State, err: Error) state.exit_code = int(info.status) state.success = false } + + _process_close(process) return } @@ -723,6 +718,8 @@ _timed_wait_on_handle :: proc(process: Process, timeout: time.Duration) -> (proc start_tick = time.tick_now() continue } + + _process_close(process) return process_state, _get_platform_error(errno) } @@ -733,6 +730,7 @@ _timed_wait_on_handle :: proc(process: Process, timeout: time.Duration) -> (proc } if errno = linux.waitid(.PIDFD, linux.Id(process.handle), &info, {.WEXITED, .WNOHANG, .WNOWAIT}, nil); errno != .NONE { + _process_close(process) return process_state, _get_platform_error(errno) } @@ -767,6 +765,8 @@ _timed_wait_on_handle :: proc(process: Process, timeout: time.Duration) -> (proc process_state.success = false } } + + _process_close(process) return } @@ -783,6 +783,7 @@ _timed_wait_on_pid :: proc(process: Process, timeout: time.Duration) -> (process org_sigset: linux.Sig_Set errno := linux.rt_sigprocmask(.SIG_BLOCK, &sigchld_set, &org_sigset) if errno != .NONE { + _process_close(process) return process_state, _get_platform_error(errno) } defer linux.rt_sigprocmask(.SIG_SETMASK, &org_sigset, nil) @@ -814,6 +815,7 @@ _timed_wait_on_pid :: proc(process: Process, timeout: time.Duration) -> (process timeout -= time.tick_since(start_tick) start_tick = time.tick_now() case .EINVAL: + _process_close(process) return process_state, _get_platform_error(errno) } } @@ -852,13 +854,13 @@ _process_wait :: proc(process: Process, timeout: time.Duration) -> (Process_Stat return process_state, .Timeout } if errno != .NONE { + _process_close(process) return process_state, _get_platform_error(errno) } return _reap_terminated(process) } -@(private="package") _process_close :: proc(process: Process) -> Error { if process.handle == 0 || process.handle == PIDFD_UNASSIGNED { return nil @@ -872,3 +874,7 @@ _process_kill :: proc(process: Process) -> Error { return _get_platform_error(linux.kill(linux.Pid(process.pid), .SIGKILL)) } +@(private="package") +_process_terminate :: proc(process: Process) -> Error { + return _get_platform_error(linux.kill(linux.Pid(process.pid), .SIGTERM)) +} diff --git a/core/os/process_netbsd.odin b/core/os/process_netbsd.odin index 45ca03178..af65e1371 100644 --- a/core/os/process_netbsd.odin +++ b/core/os/process_netbsd.odin @@ -2,7 +2,6 @@ #+build netbsd package os -import "core:c" foreign import libc "system:c" @(private) @@ -10,7 +9,7 @@ foreign libc { _lwp_self :: proc() -> i32 --- @(link_name="sysctlbyname") - _sysctlbyname :: proc(path: cstring, oldp: rawptr, oldlenp: rawptr, newp: rawptr, newlen: int) -> c.int --- + _sysctlbyname :: proc(path: cstring, oldp: rawptr, oldlenp: rawptr, newp: rawptr, newlen: int) -> i32 --- } @(require_results) @@ -28,4 +27,4 @@ _get_processor_core_count :: proc() -> int { } return 1 -} \ No newline at end of file +} diff --git a/core/os/process_openbsd.odin b/core/os/process_openbsd.odin index 5195261ff..cab562aaf 100644 --- a/core/os/process_openbsd.odin +++ b/core/os/process_openbsd.odin @@ -22,4 +22,4 @@ _SC_NPROCESSORS_ONLN :: 503 @(private, require_results) _get_processor_core_count :: proc() -> int { return int(_sysconf(_SC_NPROCESSORS_ONLN)) -} \ No newline at end of file +} diff --git a/core/os/process_posix.odin b/core/os/process_posix.odin index d3ec543f4..f41779290 100644 --- a/core/os/process_posix.odin +++ b/core/os/process_posix.odin @@ -329,10 +329,6 @@ _process_wait :: proc(process: Process, timeout: time.Duration) -> (process_stat return } -_process_close :: proc(process: Process) -> Error { - return nil -} - _process_kill :: proc(process: Process) -> (err: Error) { _process_handle_still_valid(process) or_return @@ -342,3 +338,13 @@ _process_kill :: proc(process: Process) -> (err: Error) { return } + +_process_terminate :: proc(process: Process) -> (err: Error) { + _process_handle_still_valid(process) or_return + + if posix.kill(posix.pid_t(process.pid), .SIGTERM) != .OK { + err = _get_platform_error() + } + + return +} diff --git a/core/os/process_posix_darwin.odin b/core/os/process_posix_darwin.odin index a75b4ef96..ea621eea8 100644 --- a/core/os/process_posix_darwin.odin +++ b/core/os/process_posix_darwin.odin @@ -2,19 +2,16 @@ package os import "base:runtime" -import "base:intrinsics" import "core:bytes" -import "core:c" import "core:sys/darwin" import "core:sys/posix" import "core:sys/unix" import "core:time" -foreign import libc "system:System" -foreign import pthread "system:System" +foreign import libsystem "system:System" -foreign libc { +foreign libsystem { sysctl :: proc "c" ( name: [^]i32, namelen: u32, oldp: rawptr, oldlenp: ^uint, @@ -22,23 +19,24 @@ foreign libc { ) -> posix.result --- @(link_name="sysctlbyname") - _sysctlbyname :: proc(path: cstring, oldp: rawptr, oldlenp: rawptr, newp: rawptr, newlen: int) -> c.int --- + _sysctlbyname :: proc(path: cstring, oldp: rawptr, oldlenp: rawptr, newp: rawptr, newlen: int) -> posix.result --- + + // NOTE(Oskar): available from OSX 10.6 and iOS 3.2. + // For older versions there is `syscall(SYS_thread_selfid)`, but not really + // the same thing apparently. + pthread_threadid_np :: proc "c" (rawptr, ^u64) -> i32 --- } _get_current_thread_id :: proc "contextless" () -> int { tid: u64 - // NOTE(Oskar): available from OSX 10.6 and iOS 3.2. - // For older versions there is `syscall(SYS_thread_selfid)`, but not really - // the same thing apparently. - foreign pthread { pthread_threadid_np :: proc "c" (rawptr, ^u64) -> c.int --- } pthread_threadid_np(nil, &tid) return int(tid) } _get_processor_core_count :: proc() -> int { - count : int = 0 + count: int = 0 count_size := size_of(count) - if _sysctlbyname("hw.logicalcpu", &count, &count_size, nil, 0) == 0 { + if _sysctlbyname("hw.logicalcpu", &count, &count_size, nil, 0) == .OK { if count > 0 { return count } diff --git a/core/os/process_wasi.odin b/core/os/process_wasi.odin index e18fc0524..09c12a600 100644 --- a/core/os/process_wasi.odin +++ b/core/os/process_wasi.odin @@ -58,11 +58,11 @@ _process_wait :: proc(process: Process, timeout: time.Duration) -> (process_stat return } -_process_close :: proc(process: Process) -> Error { +_process_kill :: proc(process: Process) -> (err: Error) { return .Unsupported } -_process_kill :: proc(process: Process) -> (err: Error) { +_process_terminate :: proc(process: Process) -> (err: Error) { return .Unsupported } diff --git a/core/os/process_windows.odin b/core/os/process_windows.odin index e6db5b4e9..e1ed4f3c0 100644 --- a/core/os/process_windows.odin +++ b/core/os/process_windows.odin @@ -539,6 +539,7 @@ _process_wait :: proc(process: Process, timeout: time.Duration) -> (process_stat exit_code: u32 if !win32.GetExitCodeProcess(handle, &exit_code) { err =_get_platform_error() + _process_close(process) return } time_created: win32.FILETIME @@ -547,6 +548,7 @@ _process_wait :: proc(process: Process, timeout: time.Duration) -> (process_stat time_user: win32.FILETIME if !win32.GetProcessTimes(handle, &time_created, &time_exited, &time_kernel, &time_user) { err = _get_platform_error() + _process_close(process) return } process_state = { @@ -557,17 +559,18 @@ _process_wait :: proc(process: Process, timeout: time.Duration) -> (process_stat system_time = _filetime_to_duration(time_kernel), user_time = _filetime_to_duration(time_user), } + _process_close(process) return case win32.WAIT_TIMEOUT: err = General_Error.Timeout return case: err = _get_platform_error() + _process_close(process) return } } -@(private="package") _process_close :: proc(process: Process) -> Error { if !win32.CloseHandle(win32.HANDLE(process.handle)) { return _get_platform_error() @@ -587,6 +590,49 @@ _process_kill :: proc(process: Process) -> Error { return nil } +@(private="package") +_process_terminate :: proc(process: Process) -> Error { + Enum_Windows_State :: struct { + has_windows: bool, + pid: int, + } + state: Enum_Windows_State + state.pid = process.pid + ok := win32.EnumWindows( + proc "system" (hwnd: win32.HWND, lParam: win32.LPARAM) -> win32.BOOL { + #assert(size_of(win32.LPARAM) == size_of(^Enum_Windows_State)) + state := (^Enum_Windows_State)(rawptr(uintptr(lParam))) + + dwPid: win32.DWORD + win32.GetWindowThreadProcessId(hwnd, &dwPid) + if (dwPid == win32.DWORD(state.pid)) { + state.has_windows = true + win32.PostMessageW(hwnd, win32.WM_CLOSE, 0, 0) + } + + return true + }, + win32.LPARAM(uintptr(&state)), + ) + if state.has_windows { + if ok { + return nil + } + + err := _get_platform_error() + kill_err := _process_kill(process) + return kill_err == nil ? nil : err + } + + if !win32.GenerateConsoleCtrlEvent(win32.CTRL_C_EVENT, win32.DWORD(process.pid)) { + err := _get_platform_error() + kill_err := _process_kill(process) + return kill_err == nil ? nil : err + } + + return nil +} + _filetime_to_duration :: proc(filetime: win32.FILETIME) -> time.Duration { ticks := u64(filetime.dwHighDateTime)<<32 | u64(filetime.dwLowDateTime) return time.Duration(ticks * 100) From 7a7d7560b6fe3f22b47cb19a99bf52e8029de661 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 18 Feb 2026 20:16:55 +0100 Subject: [PATCH 511/766] os: remove sys/unix dep on Linux --- core/os/process_linux.odin | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/os/process_linux.odin b/core/os/process_linux.odin index b0c9aadc6..5e6eff335 100644 --- a/core/os/process_linux.odin +++ b/core/os/process_linux.odin @@ -9,7 +9,6 @@ import "core:time" import "core:slice" import "core:strings" import "core:strconv" -import "core:sys/unix" import "core:sys/linux" PIDFD_UNASSIGNED :: ~uintptr(0) @@ -46,7 +45,7 @@ _get_ppid :: proc() -> int { @(private="package") _get_current_thread_id :: proc "contextless" () -> int { - return unix.sys_gettid() + return int(linux.gettid()) } @(private="package") From 686cba8ca2ff1d66d2de9de42075aecf01e84ece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Stormo?= Date: Thu, 19 Feb 2026 02:32:00 +0100 Subject: [PATCH 512/766] Fix to_string_hms_12 --- core/time/time.odin | 5 ++++- tests/core/time/test_core_time.odin | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/time/time.odin b/core/time/time.odin index 542e4d242..438d74569 100644 --- a/core/time/time.odin +++ b/core/time/time.odin @@ -526,6 +526,9 @@ to_string_hms_12 :: proc(t: Time, buf: []u8, ampm: [2]string = {" am", " pm"}) - h, m, s := clock(t) _h := h % 12 + if _h == 0 { + _h = 12 + } buf[7] = '0' + u8(s % 10); s /= 10 buf[6] = '0' + u8(s) buf[5] = ':' @@ -535,7 +538,7 @@ to_string_hms_12 :: proc(t: Time, buf: []u8, ampm: [2]string = {" am", " pm"}) - buf[1] = '0' + u8(_h% 10); _h /= 10 buf[0] = '0' + u8(_h) - if h < 13 { + if h < 12 { copy(buf[8:], ampm[0]) return string(buf[:MIN_HMS_LEN+len(ampm[0])]) } else { diff --git a/tests/core/time/test_core_time.odin b/tests/core/time/test_core_time.odin index 6e5e47696..d1f83c0dc 100644 --- a/tests/core/time/test_core_time.odin +++ b/tests/core/time/test_core_time.odin @@ -16,8 +16,8 @@ test_time_and_date_formatting :: proc(t: ^testing.T) { d := time.Duration(now._nsec) testing.expect_value(t, time.to_string_hms (now, buf[:]), "00:12:44") - testing.expect_value(t, time.to_string_hms_12 (now, buf[:]), "00:12:44 am") - testing.expect_value(t, time.to_string_hms_12 (now, buf[:], {"㏂", "㏘"}), "00:12:44㏂") + testing.expect_value(t, time.to_string_hms_12 (now, buf[:]), "12:12:44 am") + testing.expect_value(t, time.to_string_hms_12 (now, buf[:], {"㏂", "㏘"}), "12:12:44㏂") testing.expect_value(t, time.to_string_hms (d, buf[:]), "00:12:44") testing.expect_value(t, time.to_string_yyyy_mm_dd(now, buf[:]), "1677-09-21") From 7c9ac5a7771b3aab159adfa68df05e7cd4f89765 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Feb 2026 13:51:20 +0000 Subject: [PATCH 513/766] Try to improve the error handling for procedure groups --- src/check_expr.cpp | 119 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 108 insertions(+), 11 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index f2cdcc2ea..14967482f 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -7255,18 +7255,45 @@ gb_internal CallArgumentData check_call_arguments_proc_group(CheckerContext *c, } } + // auto print_argument_types = [&]() { + // error_line("\tGiven argument types: ("); + // isize i = 0; + // for (Operand const &o : positional_operands) { + // if (i++ > 0) error_line(", "); + // gbString type = type_to_string(o.type); + // defer (gb_string_free(type)); + // error_line("%s", type); + // } + // for (Operand const &o : named_operands) { + // if (i++ > 0) error_line(", "); + + // gbString type = type_to_string(o.type); + // defer (gb_string_free(type)); + + // if (i < ce->split_args->named.count) { + // Ast *named_field = ce->split_args->named[i]; + // ast_node(fv, FieldValue, named_field); + + // gbString field = expr_to_string(fv->field); + // defer (gb_string_free(field)); + + // error_line("%s = %s", field, type); + // } else { + // error_line("%s", type); + // } + // } + // error_line(")\n"); + // }; + auto print_argument_types = [&]() { - error_line("\tGiven argument types: ("); + error_line("\tGiven argument types:\n"); isize i = 0; for (Operand const &o : positional_operands) { - if (i++ > 0) error_line(", "); gbString type = type_to_string(o.type); defer (gb_string_free(type)); - error_line("%s", type); + error_line("\t • %s\n", type); } for (Operand const &o : named_operands) { - if (i++ > 0) error_line(", "); - gbString type = type_to_string(o.type); defer (gb_string_free(type)); @@ -7277,12 +7304,11 @@ gb_internal CallArgumentData check_call_arguments_proc_group(CheckerContext *c, gbString field = expr_to_string(fv->field); defer (gb_string_free(field)); - error_line("%s = %s", field, type); + error_line("\t • %s = %s\n", field, type); } else { - error_line("%s", type); + error_line("\t • %s\n", type); } } - error_line(")\n"); }; if (valids.count == 0) { @@ -7298,9 +7324,6 @@ gb_internal CallArgumentData check_call_arguments_proc_group(CheckerContext *c, if (procs.count == 0) { procs = proc_group_entities_cloned(c, *operand); } - if (procs.count > 0) { - error_line("Did you mean to use one of the following:\n"); - } // Try to reduce the list further for `$T: typeid` like parameters bool *possibly_ignore = temporary_alloc_array(procs.count); @@ -7397,6 +7420,80 @@ gb_internal CallArgumentData check_call_arguments_proc_group(CheckerContext *c, } spaces[max_spaces] = 0; + { + bool try_addr = false; + isize try_addr_idx = -1; + + for_array(i, procs) { + if (possibly_ignore_set != 0 && possibly_ignore[i]) { + continue; + } + Entity *proc = procs[i]; + TokenPos pos = proc->token.pos; + Type *t = base_type(proc->type); + if (t == t_invalid) continue; + GB_ASSERT(t->kind == Type_Proc); + if (t->Proc.params && t->Proc.params->Tuple.variables.count > 0) { + isize n = gb_min(t->Proc.params->Tuple.variables.count, positional_operands.count); + for (isize i = 0; i < n; i++) { + Type *dst = t->Proc.params->Tuple.variables[i]->type; + Operand src = positional_operands[i]; + if (check_is_assignable_to(c, &src, dst)) { + // okay + } else if (check_is_assignable_to(c, &src, type_deref(dst))) { + try_addr = true; + if (try_addr_idx < 0) { + try_addr_idx = i; + } + } + } + } + } + + if (try_addr) { + error_line(" \n"); + error_line("\tSuggestion:\n"); + error_line("\t\t%s(", expr_name); + isize i = 0; + for (Operand const &o : positional_operands) { + if (i++ > 0) error_line(", "); + gbString expr = expr_to_string(o.expr); + defer (gb_string_free(expr)); + + if (i-1 == try_addr_idx) { + error_line("&"); + } + error_line("%s", expr); + } + for (Operand const &o : named_operands) { + if (i++ > 0) error_line(", "); + + gbString expr = expr_to_string(o.expr); + defer (gb_string_free(expr)); + + if (i < ce->split_args->named.count) { + Ast *named_field = ce->split_args->named[i]; + ast_node(fv, FieldValue, named_field); + + gbString field = expr_to_string(fv->field); + defer (gb_string_free(field)); + + error_line("%s = %s", field, expr); + } else { + error_line("%s", expr); + } + } + error_line(")\n"); + + error_line(" \n"); // extra spaces to prevent newlines being consumed by the error handling syste, + } + } + + + if (procs.count > 0) { + error_line("Did you mean one of the following overloads?\n"); + } + for_array(i, procs) { if (possibly_ignore_set != 0 && possibly_ignore[i]) { continue; From 26a4b2bfef2babb34106ecae2514ec39451325dd Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Feb 2026 13:58:02 +0000 Subject: [PATCH 514/766] Fix `perm: int` to `perm: Permissions` --- core/os/path.odin | 4 ++-- core/os/path_js.odin | 4 ++-- core/os/path_linux.odin | 10 +++++----- core/os/path_posix.odin | 8 ++++---- core/os/path_wasi.odin | 4 ++-- core/os/path_windows.odin | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/core/os/path.odin b/core/os/path.odin index 7ee95c1c2..766adcaa9 100644 --- a/core/os/path.odin +++ b/core/os/path.odin @@ -74,7 +74,7 @@ Make a new directory. If `path` is relative, it will be relative to the process's current working directory. */ -make_directory :: proc(name: string, perm: int = 0o755) -> Error { +make_directory :: proc(name: string, perm := Permissions_Default_Directory) -> Error { return _mkdir(name, perm) } @@ -85,7 +85,7 @@ Make a new directory, creating new intervening directories when needed. If `path` is relative, it will be relative to the process's current working directory. */ -make_directory_all :: proc(path: string, perm: int = 0o755) -> Error { +make_directory_all :: proc(path: string, perm := Permissions_Default_Directory) -> Error { return _mkdir_all(path, perm) } diff --git a/core/os/path_js.odin b/core/os/path_js.odin index 874b45c89..556d93b16 100644 --- a/core/os/path_js.odin +++ b/core/os/path_js.odin @@ -16,11 +16,11 @@ _is_path_separator :: proc(c: byte) -> (ok: bool) { return c == _Path_Separator } -_mkdir :: proc(name: string, perm: int) -> (err: Error) { +_mkdir :: proc(name: string, perm: Permissions) -> (err: Error) { return .Unsupported } -_mkdir_all :: proc(path: string, perm: int) -> (err: Error) { +_mkdir_all :: proc(path: string, perm: Permissions) -> (err: Error) { return .Unsupported } diff --git a/core/os/path_linux.odin b/core/os/path_linux.odin index ca68fffb1..cba4b4e98 100644 --- a/core/os/path_linux.odin +++ b/core/os/path_linux.odin @@ -17,14 +17,14 @@ _is_path_separator :: proc(c: byte) -> bool { return c == _Path_Separator } -_mkdir :: proc(path: string, perm: int) -> Error { +_mkdir :: proc(path: string, perm: Permissions) -> Error { temp_allocator := TEMP_ALLOCATOR_GUARD({}) path_cstr := clone_to_cstring(path, temp_allocator) or_return - return _get_platform_error(linux.mkdir(path_cstr, transmute(linux.Mode)u32(perm))) + return _get_platform_error(linux.mkdir(path_cstr, transmute(linux.Mode)transmute(u32)perm)) } -_mkdir_all :: proc(path: string, perm: int) -> Error { - mkdirat :: proc(dfd: linux.Fd, path: []u8, perm: int, has_created: ^bool) -> Error { +_mkdir_all :: proc(path: string, perm: Permissions) -> Error { + mkdirat :: proc(dfd: linux.Fd, path: []u8, perm: Permissions, has_created: ^bool) -> Error { i: int for ; i < len(path) - 1 && path[i] != '/'; i += 1 {} if i == 0 { @@ -34,7 +34,7 @@ _mkdir_all :: proc(path: string, perm: int) -> Error { new_dfd, errno := linux.openat(dfd, cstring(&path[0]), _OPENDIR_FLAGS) #partial switch errno { case .ENOENT: - if errno = linux.mkdirat(dfd, cstring(&path[0]), transmute(linux.Mode)u32(perm)); errno != .NONE { + if errno = linux.mkdirat(dfd, cstring(&path[0]), transmute(linux.Mode)transmute(u32)perm); errno != .NONE { return _get_platform_error(errno) } has_created^ = true diff --git a/core/os/path_posix.odin b/core/os/path_posix.odin index a877af3e6..6f383903a 100644 --- a/core/os/path_posix.odin +++ b/core/os/path_posix.odin @@ -14,16 +14,16 @@ _is_path_separator :: proc(c: byte) -> bool { return c == _Path_Separator } -_mkdir :: proc(name: string, perm: int) -> (err: Error) { +_mkdir :: proc(name: string, perm: Permissions) -> (err: Error) { temp_allocator := TEMP_ALLOCATOR_GUARD({}) cname := clone_to_cstring(name, temp_allocator) or_return - if posix.mkdir(cname, transmute(posix.mode_t)posix._mode_t(perm)) != .OK { + if posix.mkdir(cname, transmute(posix.mode_t)posix._mode_t(transmute(u32)perm)) != .OK { return _get_platform_error() } return nil } -_mkdir_all :: proc(path: string, perm: int) -> Error { +_mkdir_all :: proc(path: string, perm: Permissions) -> Error { if path == "" { return .Invalid_Path } @@ -37,7 +37,7 @@ _mkdir_all :: proc(path: string, perm: int) -> Error { clean_path := clean_path(path, temp_allocator) or_return return internal_mkdir_all(clean_path, perm) - internal_mkdir_all :: proc(path: string, perm: int) -> Error { + internal_mkdir_all :: proc(path: string, perm: Permissions) -> Error { dir, file := split_path(path) if file != path && dir != "/" { if len(dir) > 1 && dir[len(dir) - 1] == '/' { diff --git a/core/os/path_wasi.odin b/core/os/path_wasi.odin index aa7740497..b12c14193 100644 --- a/core/os/path_wasi.odin +++ b/core/os/path_wasi.odin @@ -14,7 +14,7 @@ _is_path_separator :: proc(c: byte) -> bool { return c == _Path_Separator } -_mkdir :: proc(name: string, perm: int) -> Error { +_mkdir :: proc(name: string, perm: Permissions) -> Error { dir_fd, relative, ok := match_preopen(name) if !ok { return .Invalid_Path @@ -23,7 +23,7 @@ _mkdir :: proc(name: string, perm: int) -> Error { return _get_platform_error(wasi.path_create_directory(dir_fd, relative)) } -_mkdir_all :: proc(path: string, perm: int) -> Error { +_mkdir_all :: proc(path: string, perm: Permissions) -> Error { if path == "" { return .Invalid_Path } diff --git a/core/os/path_windows.odin b/core/os/path_windows.odin index 6ccab1dab..1a0245c52 100644 --- a/core/os/path_windows.odin +++ b/core/os/path_windows.odin @@ -13,7 +13,7 @@ _is_path_separator :: proc(c: byte) -> bool { return c == '\\' || c == '/' } -_mkdir :: proc(name: string, perm: int) -> Error { +_mkdir :: proc(name: string, perm: Permissions) -> Error { temp_allocator := TEMP_ALLOCATOR_GUARD({}) if !win32.CreateDirectoryW(_fix_long_path(name, temp_allocator) or_return, nil) { return _get_platform_error() @@ -21,7 +21,7 @@ _mkdir :: proc(name: string, perm: int) -> Error { return nil } -_mkdir_all :: proc(path: string, perm: int) -> Error { +_mkdir_all :: proc(path: string, perm: Permissions) -> Error { fix_root_directory :: proc(p: string) -> (s: string, allocated: bool, err: runtime.Allocator_Error) { if len(p) == len(`\\?\c:`) { if is_path_separator(p[0]) && is_path_separator(p[1]) && p[2] == '?' && is_path_separator(p[3]) && p[5] == ':' { From cf3ac07a7e000f949cfe29895b543939e94e7d7f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Feb 2026 14:00:38 +0000 Subject: [PATCH 515/766] Fix `copy_directory_all` --- core/os/dir.odin | 4 ++-- core/os/temp_file.odin | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/os/dir.odin b/core/os/dir.odin index 2548480c2..02dcb87af 100644 --- a/core/os/dir.odin +++ b/core/os/dir.odin @@ -208,7 +208,7 @@ read_directory_iterator :: proc(it: ^Read_Directory_Iterator) -> (fi: File_Info, } // Recursively copies a directory to `dst` from `src` -copy_directory_all :: proc(dst, src: string, dst_perm := 0o755) -> Error { +copy_directory_all :: proc(dst, src: string, dst_perm := Permissions_Default) -> Error { when #defined(_copy_directory_all_native) { return _copy_directory_all_native(dst, src, dst_perm) } else { @@ -217,7 +217,7 @@ copy_directory_all :: proc(dst, src: string, dst_perm := 0o755) -> Error { } @(private) -_copy_directory_all :: proc(dst, src: string, dst_perm := 0o755) -> Error { +_copy_directory_all :: proc(dst, src: string, dst_perm := Permissions_Default) -> Error { err := make_directory(dst, dst_perm) if err != nil && err != .Exist { return err diff --git a/core/os/temp_file.odin b/core/os/temp_file.odin index be10eb22e..9068b6590 100644 --- a/core/os/temp_file.odin +++ b/core/os/temp_file.odin @@ -58,7 +58,7 @@ make_directory_temp :: proc(dir, pattern: string, allocator: runtime.Allocator) attempts := 0 for { name := concatenate_strings_from_buffer(name_buf[:], prefix, random_string(rand_buf[:]), suffix) - err = make_directory(name, 0o700) + err = make_directory(name) if err == nil { return clone_string(name, allocator) } From b643b0b1a9948e8d788d9de71bca18b9ef41be5a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Feb 2026 14:05:49 +0000 Subject: [PATCH 516/766] Fix `_copy_directory_all_native` --- core/os/dir_posix_darwin.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/os/dir_posix_darwin.odin b/core/os/dir_posix_darwin.odin index e67c917b4..ddd25c1fc 100644 --- a/core/os/dir_posix_darwin.odin +++ b/core/os/dir_posix_darwin.odin @@ -3,7 +3,7 @@ package os import "core:sys/darwin" -_copy_directory_all_native :: proc(dst, src: string, dst_perm := 0o755) -> (err: Error) { +_copy_directory_all_native :: proc(dst, src: string, dst_perm := Permissions_Default) -> (err: Error) { temp_allocator := TEMP_ALLOCATOR_GUARD({}) csrc := clone_to_cstring(src, temp_allocator) or_return From aea6274a101de8b11377dfd3b8c56550aa4bf9d9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Feb 2026 14:54:34 +0000 Subject: [PATCH 517/766] Fix `_mkdir_all` for wasi --- core/os/path_wasi.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/os/path_wasi.odin b/core/os/path_wasi.odin index b12c14193..e7c003001 100644 --- a/core/os/path_wasi.odin +++ b/core/os/path_wasi.odin @@ -46,7 +46,7 @@ _mkdir_all :: proc(path: string, perm: Permissions) -> Error { internal_mkdir_all(dir) or_return } - err := _mkdir(path, 0) + err := _mkdir(path, Permissions_Default) if err == .Exist { err = nil } return err } From ffa6fc2a67e3c2bd2c225a8089045bdeeb90d9e1 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Fri, 13 Feb 2026 07:36:15 +0900 Subject: [PATCH 518/766] core/crypto/_weierstrass: Add scalar field inversion --- .../_fiat/field_scalarp256r1/field.odin | 270 ++++++++++++- .../_fiat/field_scalarp384r1/field.odin | 370 +++++++++++++++++- core/crypto/_weierstrass/sc.odin | 7 +- .../crypto/test_core_crypto_weierstrass.odin | 35 +- 4 files changed, 677 insertions(+), 5 deletions(-) diff --git a/core/crypto/_fiat/field_scalarp256r1/field.odin b/core/crypto/_fiat/field_scalarp256r1/field.odin index 70e55d9e3..802f3382e 100644 --- a/core/crypto/_fiat/field_scalarp256r1/field.odin +++ b/core/crypto/_fiat/field_scalarp256r1/field.odin @@ -135,7 +135,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> tmp: Montgomery_Domain_Field_Element = --- fe_sub(&tmp, arg1, arg2) - is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) + is_eq := subtle.eq(fe_non_zero(&tmp), 0) fe_clear(&tmp) @@ -208,3 +208,271 @@ fe_cond_negate :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Eleme fe_clear(&tmp1) } + +fe_pow2k :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: ^Montgomery_Domain_Field_Element, + arg2: uint, +) { + // Special case: `arg1^(2 * 0) = 1`, though this should never happen. + if arg2 == 0 { + fe_one(out1) + return + } + + fe_square(out1, arg1) + for _ in 1 ..< arg2 { + fe_square(out1, out1) + } +} + +fe_inv :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + // Inversion computation is derived from the addition chain: + // + // _10 = 2*1 + // _100 = 2*_10 + // _101 = 1 + _100 + // _110 = 1 + _101 + // _1001 = _100 + _101 + // _1111 = _110 + _1001 + // _10010 = 2*_1001 + // _10101 = _110 + _1111 + // _11000 = _110 + _10010 + // _11010 = _10 + _11000 + // _101111 = _10101 + _11010 + // _111000 = _1001 + _101111 + // _111101 = _101 + _111000 + // _111111 = _10 + _111101 + // _1001111 = _10010 + _111101 + // _1100001 = _10010 + _1001111 + // _1100011 = _10 + _1100001 + // _1110011 = _10010 + _1100001 + // _1110111 = _100 + _1110011 + // _1111101 = _110 + _1110111 + // _10010101 = _11000 + _1111101 + // _10100111 = _10010 + _10010101 + // _10101101 = _110 + _10100111 + // _11100101 = _111000 + _10101101 + // _11111111 = _11010 + _11100101 + // x16 = _11111111 << 8 + _11111111 + // x32 = x16 << 16 + x16 + // i133 = ((x32 << 48 + x16) << 16 + x16) << 16 + // i158 = ((x16 + i133) << 16 + x16) << 6 + _101111 + // i186 = ((i158 << 9 + _1110011) << 8 + _1111101) << 9 + // i206 = ((_10101101 + i186) << 8 + _10100111) << 9 + _101111 + // i236 = ((i206 << 8 + _111101) << 11 + _1001111) << 9 + // i257 = ((_1110111 + i236) << 10 + _11100101) << 8 + _1100001 + // i286 = ((i257 << 7 + _111111) << 10 + _1100011) << 10 + // return (_10010101 + i286) << 6 + _1111 + // + // Operations: 251 squares 43 multiplies + // + // Generated by github.com/mmcloughlin/addchain v0.4.0. + + // Note: Need to stash `arg1` (`xx`) in the case that `out1`/`arg1` alias, + // as `arg1` is used after `out1` has been altered. + t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, xx: Montgomery_Domain_Field_Element = ---, ---, ---, ---, ---, ---, ---, ---, ---, ---, ---, ---, ---, ---, ---, arg1^ + + // Step 1: t1 = x^0x2 + fe_square(&t1, arg1) + + // Step 2: t5 = x^0x4 + fe_square(&t5, &t1) + + // Step 3: t2 = x^0x5 + fe_mul(&t2, arg1, &t5) + + // Step 4: t10 = x^0x6 + fe_mul(&t10, arg1, &t2) + + // Step 5: t3 = x^0x9 + fe_mul(&t3, &t5, &t2) + + // Step 6: z = x^0xf + fe_mul(out1, &t10, &t3) + + // Step 7: t9 = x^0x12 + fe_square(&t9, &t3) + + // Step 8: t4 = x^0x15 + fe_mul(&t4, &t10, out1) + + // Step 9: t0 = x^0x18 + fe_mul(&t0, &t10, &t9) + + // Step 10: t13 = x^0x1a + fe_mul(&t13, &t1, &t0) + + // Step 11: t8 = x^0x2f + fe_mul(&t8, &t4, &t13) + + // Step 12: t4 = x^0x38 + fe_mul(&t4, &t3, &t8) + + // Step 13: t7 = x^0x3d + fe_mul(&t7, &t2, &t4) + + // Step 14: t2 = x^0x3f + fe_mul(&t2, &t1, &t7) + + // Step 15: t6 = x^0x4f + fe_mul(&t6, &t9, &t7) + + // Step 16: t3 = x^0x61 + fe_mul(&t3, &t9, &t6) + + // Step 17: t1 = x^0x63 + fe_mul(&t1, &t1, &t3) + + // Step 18: t12 = x^0x73 + fe_mul(&t12, &t9, &t3) + + // Step 19: t5 = x^0x77 + fe_mul(&t5, &t5, &t12) + + // Step 20: t11 = x^0x7d + fe_mul(&t11, &t10, &t5) + + // Step 21: t0 = x^0x95 + fe_mul(&t0, &t0, &t11) + + // Step 22: t9 = x^0xa7 + fe_mul(&t9, &t9, &t0) + + // Step 23: t10 = x^0xad + fe_mul(&t10, &t10, &t9) + + // Step 24: t4 = x^0xe5 + fe_mul(&t4, &t4, &t10) + + // Step 25: t13 = x^0xff + fe_mul(&t13, &t13, &t4) + + // Step 33: t14 = x^0xff00 + fe_pow2k(&t14, &t13, 8) + + // Step 34: t13 = x^0xffff + fe_mul(&t13, &t13, &t14) + + // Step 50: t14 = x^0xffff0000 + fe_pow2k(&t14, &t13, 16) + + // Step 51: t14 = x^0xffffffff + fe_mul(&t14, &t13, &t14) + + // Step 99: t14 = x^0xffffffff000000000000 + fe_pow2k(&t14, &t14, 48) + + // Step 100: t14 = x^0xffffffff00000000ffff + fe_mul(&t14, &t13, &t14) + + // Step 116: t14 = x^0xffffffff00000000ffff0000 + fe_pow2k(&t14, &t14, 16) + + // Step 117: t14 = x^0xffffffff00000000ffffffff + fe_mul(&t14, &t13, &t14) + + // Step 133: t14 = x^0xffffffff00000000ffffffff0000 + fe_pow2k(&t14, &t14, 16) + + // Step 134: t14 = x^0xffffffff00000000ffffffffffff + fe_mul(&t14, &t13, &t14) + + // Step 150: t14 = x^0xffffffff00000000ffffffffffff0000 + fe_pow2k(&t14, &t14, 16) + + // Step 151: t13 = x^0xffffffff00000000ffffffffffffffff + fe_mul(&t13, &t13, &t14) + + // Step 157: t13 = x^0x3fffffffc00000003fffffffffffffffc0 + fe_pow2k(&t13, &t13, 6) + + // Step 158: t13 = x^0x3fffffffc00000003fffffffffffffffef + fe_mul(&t13, &t8, &t13) + + // Step 167: t13 = x^0x7fffffff800000007fffffffffffffffde00 + fe_pow2k(&t13, &t13, 9) + + // Step 168: t12 = x^0x7fffffff800000007fffffffffffffffde73 + fe_mul(&t12, &t12, &t13) + + // Step 176: t12 = x^0x7fffffff800000007fffffffffffffffde7300 + fe_pow2k(&t12, &t12, 8) + + // Step 177: t11 = x^0x7fffffff800000007fffffffffffffffde737d + fe_mul(&t11, &t11, &t12) + + // Step 186: t11 = x^0xffffffff00000000ffffffffffffffffbce6fa00 + fe_pow2k(&t11, &t11, 9) + + // Step 187: t10 = x^0xffffffff00000000ffffffffffffffffbce6faad + fe_mul(&t10, &t10, &t11) + + // Step 195: t10 = x^0xffffffff00000000ffffffffffffffffbce6faad00 + fe_pow2k(&t10, &t10, 8) + + // Step 196: t9 = x^0xffffffff00000000ffffffffffffffffbce6faada7 + fe_mul(&t9, &t9, &t10) + + // Step 205: t9 = x^0x1fffffffe00000001ffffffffffffffff79cdf55b4e00 + fe_pow2k(&t9, &t9, 9) + + // Step 206: t8 = x^0x1fffffffe00000001ffffffffffffffff79cdf55b4e2f + fe_mul(&t8, &t8, &t9) + + // Step 214: t8 = x^0x1fffffffe00000001ffffffffffffffff79cdf55b4e2f00 + fe_pow2k(&t8, &t8, 8) + + // Step 215: t7 = x^0x1fffffffe00000001ffffffffffffffff79cdf55b4e2f3d + fe_mul(&t7, &t7, &t8) + + // Step 226: t7 = x^0xffffffff00000000ffffffffffffffffbce6faada7179e800 + fe_pow2k(&t7, &t7, 11) + + // Step 227: t6 = x^0xffffffff00000000ffffffffffffffffbce6faada7179e84f + fe_mul(&t6, &t6, &t7) + + // Step 236: t6 = x^0x1fffffffe00000001ffffffffffffffff79cdf55b4e2f3d09e00 + fe_pow2k(&t6, &t6, 9) + + // Step 237: t5 = x^0x1fffffffe00000001ffffffffffffffff79cdf55b4e2f3d09e77 + fe_mul(&t5, &t5, &t6) + + // Step 247: t5 = x^0x7fffffff800000007fffffffffffffffde737d56d38bcf4279dc00 + fe_pow2k(&t5, &t5, 10) + + // Step 248: t4 = x^0x7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5 + fe_mul(&t4, &t4, &t5) + + // Step 256: t4 = x^0x7fffffff800000007fffffffffffffffde737d56d38bcf4279dce500 + fe_pow2k(&t4, &t4, 8) + + // Step 257: t3 = x^0x7fffffff800000007fffffffffffffffde737d56d38bcf4279dce561 + fe_mul(&t3, &t3, &t4) + + // Step 264: t3 = x^0x3fffffffc00000003fffffffffffffffef39beab69c5e7a13cee72b080 + fe_pow2k(&t3, &t3, 7) + + // Step 265: t2 = x^0x3fffffffc00000003fffffffffffffffef39beab69c5e7a13cee72b0bf + fe_mul(&t2, &t2, &t3) + + // Step 275: t2 = x^0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc00 + fe_pow2k(&t2, &t2, 10) + + // Step 276: t1 = x^0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63 + fe_mul(&t1, &t1, &t2) + + // Step 286: t1 = x^0x3fffffffc00000003fffffffffffffffef39beab69c5e7a13cee72b0bf18c00 + fe_pow2k(&t1, &t1, 10) + + // Step 287: t0 = x^0x3fffffffc00000003fffffffffffffffef39beab69c5e7a13cee72b0bf18c95 + fe_mul(&t0, &t0, &t1) + + // Step 293: t0 = x^0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 + fe_pow2k(&t0, &t0, 6) + + // Step 294: z = x^0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f + fe_mul(out1, out1, &t0) + + fe_clear_vec([]^Montgomery_Domain_Field_Element{&t0, &t1, &t2, &t3, &t4, &t5, &t6, &t7, &t8, &t9, &t10, &t11, &t12, &t13, &t14, &xx}) +} diff --git a/core/crypto/_fiat/field_scalarp384r1/field.odin b/core/crypto/_fiat/field_scalarp384r1/field.odin index 9b9e5d350..cfc27f322 100644 --- a/core/crypto/_fiat/field_scalarp384r1/field.odin +++ b/core/crypto/_fiat/field_scalarp384r1/field.odin @@ -148,7 +148,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> tmp: Montgomery_Domain_Field_Element = --- fe_sub(&tmp, arg1, arg2) - is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) + is_eq := subtle.eq(fe_non_zero(&tmp), 0) fe_clear(&tmp) @@ -237,3 +237,371 @@ fe_cond_negate :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Eleme fe_clear(&tmp1) } + +fe_pow2k :: proc "contextless" ( + out1: ^Montgomery_Domain_Field_Element, + arg1: ^Montgomery_Domain_Field_Element, + arg2: uint, +) { + // Special case: `arg1^(2 * 0) = 1`, though this should never happen. + if arg2 == 0 { + fe_one(out1) + return + } + + fe_square(out1, arg1) + for _ in 1 ..< arg2 { + fe_square(out1, out1) + } +} + +fe_inv :: proc "contextless" (out1, arg1: ^Montgomery_Domain_Field_Element) { + // Inversion computation is derived from the addition chain: + // + // _10 = 2*1 + // _11 = 1 + _10 + // _101 = _10 + _11 + // _111 = _10 + _101 + // _1001 = _10 + _111 + // _1011 = _10 + _1001 + // _1101 = _10 + _1011 + // _1111 = _10 + _1101 + // _11110 = 2*_1111 + // _11111 = 1 + _11110 + // _1111100 = _11111 << 2 + // i14 = _1111100 << 2 + // i26 = (i14 << 3 + _1111100) << 7 + i14 + // i42 = i26 << 15 + i26 + // x64 = i42 << 30 + i42 + _1111 + // x128 = x64 << 64 + x64 + // x192 = x128 << 64 + x64 + // x194 = x192 << 2 + _11 + // i225 = ((x194 << 6 + _111) << 3 + _11) << 7 + // i235 = 2*((_1101 + i225) << 6 + _1101) + 1 + // i258 = ((i235 << 11 + _11111) << 2 + 1) << 8 + // i269 = ((_1101 + i258) << 2 + _11) << 6 + _1011 + // i286 = ((i269 << 4 + _111) << 6 + _11111) << 5 + // i308 = ((_1011 + i286) << 10 + _1101) << 9 + _1101 + // i323 = ((i308 << 4 + _1011) << 6 + _1001) << 3 + // i340 = ((1 + i323) << 7 + _1011) << 7 + _101 + // i357 = ((i340 << 5 + _111) << 5 + _1111) << 5 + // i369 = ((_1011 + i357) << 4 + _1011) << 5 + _111 + // i387 = ((i369 << 3 + _11) << 7 + _11) << 6 + // i397 = ((_1011 + i387) << 4 + _101) << 3 + _11 + // i413 = ((i397 << 4 + _11) << 4 + _11) << 6 + // i427 = ((_101 + i413) << 5 + _101) << 6 + _1011 + // return (2*i427 + 1) << 4 + 1 + // + // Operations: 381 squares 53 multiplies + // + // Generated by github.com/mmcloughlin/addchain v0.4.0. + + // Note: Need to stash `arg1` (`xx`) in the case that `out1`/`arg1` alias, + // as `arg1` is used after `out1` has been altered. + t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, xx: Montgomery_Domain_Field_Element = ---, ---, ---, ---, ---, ---, ---, ---, ---, ---, arg1^ + + // Step 1: t3 = x^0x2 + fe_square(&t3, arg1) + + // Step 2: t1 = x^0x3 + fe_mul(&t1, arg1, &t3) + + // Step 3: t0 = x^0x5 + fe_mul(&t0, &t3, &t1) + + // Step 4: t2 = x^0x7 + fe_mul(&t2, &t3, &t0) + + // Step 5: t4 = x^0x9 + fe_mul(&t4, &t3, &t2) + + // Step 6: z = x^0xb + fe_mul(out1, &t3, &t4) + + // Step 7: t5 = x^0xd + fe_mul(&t5, &t3, out1) + + // Step 8: t3 = x^0xf + fe_mul(&t3, &t3, &t5) + + // Step 9: t6 = x^0x1e + fe_square(&t6, &t3) + + // Step 10: t6 = x^0x1f + fe_mul(&t6, &xx, &t6) + + // Step 12: t8 = x^0x7c + fe_pow2k(&t8, &t6, 2) + + // Step 14: t7 = x^0x1f0 + fe_pow2k(&t7, &t8, 2) + + // Step 17: t9 = x^0xf80 + fe_pow2k(&t9, &t7, 3) + + // Step 18: t8 = x^0xffc + fe_mul(&t8, &t8, &t9) + + // Step 25: t8 = x^0x7fe00 + fe_pow2k(&t8, &t8, 7) + + // Step 26: t7 = x^0x7fff0 + fe_mul(&t7, &t7, &t8) + + // Step 41: t8 = x^0x3fff80000 + fe_pow2k(&t8, &t7, 15) + + // Step 42: t7 = x^0x3fffffff0 + fe_mul(&t7, &t7, &t8) + + // Step 72: t8 = x^0xfffffffc00000000 + fe_pow2k(&t8, &t7, 30) + + // Step 73: t7 = x^0xfffffffffffffff0 + fe_mul(&t7, &t7, &t8) + + // Step 74: t7 = x^0xffffffffffffffff + fe_mul(&t7, &t3, &t7) + + // Step 138: t8 = x^0xffffffffffffffff0000000000000000 + fe_pow2k(&t8, &t7, 64) + + // Step 139: t8 = x^0xffffffffffffffffffffffffffffffff + fe_mul(&t8, &t7, &t8) + + // Step 203: t8 = x^0xffffffffffffffffffffffffffffffff0000000000000000 + fe_pow2k(&t8, &t8, 64) + + // Step 204: t7 = x^0xffffffffffffffffffffffffffffffffffffffffffffffff + fe_mul(&t7, &t7, &t8) + + // Step 206: t7 = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffc + fe_pow2k(&t7, &t7, 2) + + // Step 207: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff + fe_mul(&t7, &t1, &t7) + + // Step 213: t7 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc0 + fe_pow2k(&t7, &t7, 6) + + // Step 214: t7 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7 + fe_mul(&t7, &t2, &t7) + + // Step 217: t7 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe38 + fe_pow2k(&t7, &t7, 3) + + // Step 218: t7 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b + fe_mul(&t7, &t1, &t7) + + // Step 225: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d80 + fe_pow2k(&t7, &t7, 7) + + // Step 226: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d + fe_mul(&t7, &t5, &t7) + + // Step 232: t7 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc76340 + fe_pow2k(&t7, &t7, 6) + + // Step 233: t7 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d + fe_mul(&t7, &t5, &t7) + + // Step 234: t7 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69a + fe_square(&t7, &t7) + + // Step 235: t7 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b + fe_mul(&t7, &xx, &t7) + + // Step 246: t7 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d800 + fe_pow2k(&t7, &t7, 11) + + // Step 247: t7 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f + fe_mul(&t7, &t6, &t7) + + // Step 249: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607c + fe_pow2k(&t7, &t7, 2) + + // Step 250: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d + fe_mul(&t7, &xx, &t7) + + // Step 258: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d00 + fe_pow2k(&t7, &t7, 8) + + // Step 259: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0d + fe_mul(&t7, &t5, &t7) + + // Step 261: t7 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f434 + fe_pow2k(&t7, &t7, 2) + + // Step 262: t7 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f437 + fe_mul(&t7, &t1, &t7) + + // Step 268: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dc0 + fe_pow2k(&t7, &t7, 6) + + // Step 269: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb + fe_mul(&t7, out1, &t7) + + // Step 273: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb0 + fe_pow2k(&t7, &t7, 4) + + // Step 274: t7 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb7 + fe_mul(&t7, &t2, &t7) + + // Step 280: t7 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372dc0 + fe_pow2k(&t7, &t7, 6) + + // Step 281: t6 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf + fe_mul(&t6, &t6, &t7) + + // Step 286: t6 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b03e86e5bbe0 + fe_pow2k(&t6, &t6, 5) + + // Step 287: t6 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b03e86e5bbeb + fe_mul(&t6, out1, &t6) + + // Step 297: t6 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac00 + fe_pow2k(&t6, &t6, 10) + + // Step 298: t6 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d + fe_mul(&t6, &t5, &t6) + + // Step 307: t6 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a00 + fe_pow2k(&t6, &t6, 9) + + // Step 308: t5 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0d + fe_mul(&t5, &t5, &t6) + + // Step 312: t5 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0d0 + fe_pow2k(&t5, &t5, 4) + + // Step 313: t5 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db + fe_mul(&t5, out1, &t5) + + // Step 319: t5 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c0 + fe_pow2k(&t5, &t5, 6) + + // Step 320: t4 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c9 + fe_mul(&t4, &t4, &t5) + + // Step 323: t4 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b03e86e5bbeb0341b648 + fe_pow2k(&t4, &t4, 3) + + // Step 324: t4 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b03e86e5bbeb0341b649 + fe_mul(&t4, &xx, &t4) + + // Step 331: t4 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db2480 + fe_pow2k(&t4, &t4, 7) + + // Step 332: t4 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b + fe_mul(&t4, out1, &t4) + + // Step 339: t4 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d924580 + fe_pow2k(&t4, &t4, 7) + + // Step 340: t4 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d924585 + fe_mul(&t4, &t0, &t4) + + // Step 345: t4 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a0 + fe_pow2k(&t4, &t4, 5) + + // Step 346: t4 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a7 + fe_mul(&t4, &t2, &t4) + + // Step 351: t4 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b03e86e5bbeb0341b6491614e0 + fe_pow2k(&t4, &t4, 5) + + // Step 352: t3 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b03e86e5bbeb0341b6491614ef + fe_mul(&t3, &t3, &t4) + + // Step 357: t3 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29de0 + fe_pow2k(&t3, &t3, 5) + + // Step 358: t3 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29deb + fe_mul(&t3, out1, &t3) + + // Step 362: t3 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29deb0 + fe_pow2k(&t3, &t3, 4) + + // Step 363: t3 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29debb + fe_mul(&t3, out1, &t3) + + // Step 368: t3 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd760 + fe_pow2k(&t3, &t3, 5) + + // Step 369: t2 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd767 + fe_mul(&t2, &t2, &t3) + + // Step 372: t2 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29debb38 + fe_pow2k(&t2, &t2, 3) + + // Step 373: t2 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29debb3b + fe_mul(&t2, &t1, &t2) + + // Step 380: t2 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b03e86e5bbeb0341b6491614ef5d9d80 + fe_pow2k(&t2, &t2, 7) + + // Step 381: t2 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b03e86e5bbeb0341b6491614ef5d9d83 + fe_mul(&t2, &t1, &t2) + + // Step 387: t2 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760c0 + fe_pow2k(&t2, &t2, 6) + + // Step 388: t2 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb + fe_mul(&t2, out1, &t2) + + // Step 392: t2 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb0 + fe_pow2k(&t2, &t2, 4) + + // Step 393: t2 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5 + fe_mul(&t2, &t0, &t2) + + // Step 396: t2 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29debb3b065a8 + fe_pow2k(&t2, &t2, 3) + + // Step 397: t2 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29debb3b065ab + fe_mul(&t2, &t1, &t2) + + // Step 401: t2 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29debb3b065ab0 + fe_pow2k(&t2, &t2, 4) + + // Step 402: t2 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29debb3b065ab3 + fe_mul(&t2, &t1, &t2) + + // Step 406: t2 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29debb3b065ab30 + fe_pow2k(&t2, &t2, 4) + + // Step 407: t1 = x^0x3ffffffffffffffffffffffffffffffffffffffffffffffff1d8d3607d0dcb77d606836c922c29debb3b065ab33 + fe_mul(&t1, &t1, &t2) + + // Step 413: t1 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc0 + fe_pow2k(&t1, &t1, 6) + + // Step 414: t1 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5 + fe_mul(&t1, &t0, &t1) + + // Step 419: t1 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b03e86e5bbeb0341b6491614ef5d9d832d5998a0 + fe_pow2k(&t1, &t1, 5) + + // Step 420: t0 = x^0x1ffffffffffffffffffffffffffffffffffffffffffffffff8ec69b03e86e5bbeb0341b6491614ef5d9d832d5998a5 + fe_mul(&t0, &t0, &t1) + + // Step 426: t0 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb56662940 + fe_pow2k(&t0, &t0, 6) + + // Step 427: z = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b + fe_mul(out1, out1, &t0) + + // Step 428: z = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296 + fe_square(out1, out1) + + // Step 429: z = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5297 + fe_mul(out1, &xx, out1) + + // Step 433: z = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 + fe_pow2k(out1, out1, 4) + + // Step 434: z = x^0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971 + fe_mul(out1, &xx, out1) + + fe_clear_vec([]^Montgomery_Domain_Field_Element{&t0, &t1, &t2, &t3, &t4, &t5, &t6, &t7, &t8, &t9, &xx}) +} diff --git a/core/crypto/_weierstrass/sc.odin b/core/crypto/_weierstrass/sc.odin index e119eec2e..0fc64e028 100644 --- a/core/crypto/_weierstrass/sc.odin +++ b/core/crypto/_weierstrass/sc.odin @@ -40,7 +40,7 @@ sc_zero :: proc { p384r1.fe_zero, } -sc_one_p256r1 :: proc { +sc_one :: proc { p256r1.fe_one, p384r1.fe_one, } @@ -70,6 +70,11 @@ sc_square :: proc { p384r1.fe_square, } +sc_inv :: proc { + p256r1.fe_inv, + p384r1.fe_inv, +} + sc_cond_assign :: proc { p256r1.fe_cond_assign, p384r1.fe_cond_assign, diff --git a/tests/core/crypto/test_core_crypto_weierstrass.odin b/tests/core/crypto/test_core_crypto_weierstrass.odin index ac5acac21..dcb17aa3d 100644 --- a/tests/core/crypto/test_core_crypto_weierstrass.odin +++ b/tests/core/crypto/test_core_crypto_weierstrass.odin @@ -1,5 +1,6 @@ package test_core_crypto +import "core:crypto" import ec "core:crypto/_weierstrass" import "core:encoding/hex" import "core:math/big" @@ -881,7 +882,7 @@ test_p384_scalar_mul :: proc(t: ^testing.T) { } @(test) -test_p256_s11n_sec_identity ::proc(t: ^testing.T) { +test_p256_s11n_sec_identity :: proc(t: ^testing.T) { p: ec.Point_p256r1 ec.pt_generator(&p) @@ -901,7 +902,7 @@ test_p256_s11n_sec_identity ::proc(t: ^testing.T) { } @(test) -test_p256_s11n_sec_generator ::proc(t: ^testing.T) { +test_p256_s11n_sec_generator :: proc(t: ^testing.T) { p, g: ec.Point_p256r1 ec.pt_generator(&g) @@ -917,3 +918,33 @@ test_p256_s11n_sec_generator ::proc(t: ^testing.T) { testing.expectf(t, ok, "%s", s) testing.expect(t, ec.pt_equal(&g, &p) == 1) } + +@(test) +test_p256_sc_inv :: proc(t: ^testing.T) { + if crypto.HAS_RAND_BYTES == false { + return + } + + sc, sc_inv, sc_prod, sc_one: ec.Scalar_p256r1 + ec.sc_set_random(&sc) + ec.sc_inv(&sc_inv, &sc) + ec.sc_one(&sc_one) + + ec.sc_mul(&sc_prod, &sc, &sc_inv) + testing.expect(t, ec.sc_equal(&sc_prod, &sc_one) == 1) +} + +@(test) +test_p384_sc_inv :: proc(t: ^testing.T) { + if crypto.HAS_RAND_BYTES == false { + return + } + + sc, sc_inv, sc_prod, sc_one: ec.Scalar_p384r1 + ec.sc_set_random(&sc) + ec.sc_inv(&sc_inv, &sc) + ec.sc_one(&sc_one) + + ec.sc_mul(&sc_prod, &sc, &sc_inv) + testing.expect(t, ec.sc_equal(&sc_prod, &sc_one) == 1) +} \ No newline at end of file From 49ab240c451543c16f90e273c37125a0647c5cb2 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Fri, 13 Feb 2026 19:24:23 +0900 Subject: [PATCH 519/766] core/crypto/_weierstrass: Add Shamir-Strauss --- core/crypto/_weierstrass/scalar_mul.odin | 75 ++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/core/crypto/_weierstrass/scalar_mul.odin b/core/crypto/_weierstrass/scalar_mul.odin index ac0d81a26..eb3fa1459 100644 --- a/core/crypto/_weierstrass/scalar_mul.odin +++ b/core/crypto/_weierstrass/scalar_mul.odin @@ -73,6 +73,81 @@ pt_scalar_mul_bytes :: proc "contextless" ( } } +pt_double_scalar_mul_generator_vartime :: proc "contextless" ( + p, q: ^$T, + sc_g, sc_q: ^$Q, +) { + // Strauss-Shamir, commonly referred to as the "Shamir trick", + // saves half the doublings, relative to doing this the naive way. + // + // Note: In the unlikely event where we support curves with an + // efficent endomorphism (secp256k1), scalarmul + GLV is faster. + when T == Point_p256r1 && Q == Scalar_p256r1 { + q_tbl: Multiply_Table_p256r1 = --- + SC_SZ :: SC_SIZE_P256R1 + } else when T == Point_p384r1 && Q == Scalar_p384r1 { + q_tbl: Multiply_Table_p384r1 = --- + SC_SZ :: SC_SIZE_P384R1 + } else { + #panic("weierstrass: invalid curve") + } + + sc_q_bytes, sc_g_bytes: [SC_SZ]byte = ---, --- + sc_bytes(sc_q_bytes[:], sc_q) + sc_bytes(sc_g_bytes[:], sc_g) + + r, tmp: T = ---, --- + when crypto.COMPACT_IMPLS == true { + pt_generator(&r) + when T == Point_p256r1 { + g_tbl: Multiply_Table_p256r1 = --- + } else when T == Point_p384r1 { + g_tbl: Multiply_Table_p384r1 = --- + } + mul_tbl_set(&g_tbl, &r, true) + } else { + when T == Point_p256r1 { + g_tbl := &Gen_Multiply_Table_p256r1_lo[31] + } else when T == Point_p384r1 { + g_tbl := &Gen_Multiply_Table_p384r1_lo[47] + } + } + mul_tbl_set(&q_tbl, q, true) + + pt_identity(&r) + for i in 0..> 4) & 0x0f, limb_byte_q & 0x0f + hi_g, lo_g := (limb_byte_g >> 4) & 0x0f, limb_byte_g & 0x0f + + if i != 0 { + pt_double(&r, &r) + pt_double(&r, &r) + pt_double(&r, &r) + pt_double(&r, &r) + } + mul_tbl_lookup_add(&r, &tmp, &q_tbl, u64(hi_q), true) + when crypto.COMPACT_IMPLS == true { + mul_tbl_lookup_add(&r, &tmp, &g_tbl, u64(hi_g), true) + } else { + mul_affine_tbl_lookup_add(&r, &tmp, g_tbl, u64(hi_g), true) + } + + pt_double(&r, &r) + pt_double(&r, &r) + pt_double(&r, &r) + pt_double(&r, &r) + mul_tbl_lookup_add(&r, &tmp, &q_tbl, u64(lo_q), true) + when crypto.COMPACT_IMPLS == true { + mul_tbl_lookup_add(&r, &tmp, &g_tbl, u64(lo_g), true) + } else { + mul_affine_tbl_lookup_add(&r, &tmp, g_tbl, u64(lo_g), true) + } + } + + pt_set(p, &r) +} + when crypto.COMPACT_IMPLS == true { pt_scalar_mul_generator :: proc "contextless" ( p: ^$T, From 7e7515d7d9284a6a14c296f58491373e2670d3ce Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 5 Feb 2026 19:20:12 +0900 Subject: [PATCH 520/766] core/crypto/ecdsa: Add ECDSA support --- core/crypto/_weierstrass/sc.odin | 36 ++ core/crypto/ecdh/ecdh.odin | 23 +- core/crypto/ecdsa/doc.odin | 7 + core/crypto/ecdsa/ecdsa.odin | 321 ++++++++++ core/crypto/ecdsa/ecdsa_asn1.odin | 183 ++++++ core/crypto/ecdsa/ecdsa_k_rfc6979.odin | 98 +++ core/crypto/ecdsa/ecdsa_sign.odin | 201 +++++++ core/crypto/ecdsa/ecdsa_verify.odin | 148 +++++ examples/all/all_js.odin | 1 + examples/all/all_main.odin | 1 + tests/benchmark/crypto/benchmark_ecc.odin | 59 +- .../core/crypto/test_core_crypto_edwards.odin | 308 +--------- tests/core/crypto/test_core_crypto_exdsa.odin | 568 ++++++++++++++++++ tests/core/crypto/wycheproof/main.odin | 145 ++++- tests/core/crypto/wycheproof/schemas.odin | 18 + 15 files changed, 1779 insertions(+), 338 deletions(-) create mode 100644 core/crypto/ecdsa/doc.odin create mode 100644 core/crypto/ecdsa/ecdsa.odin create mode 100644 core/crypto/ecdsa/ecdsa_asn1.odin create mode 100644 core/crypto/ecdsa/ecdsa_k_rfc6979.odin create mode 100644 core/crypto/ecdsa/ecdsa_sign.odin create mode 100644 core/crypto/ecdsa/ecdsa_verify.odin create mode 100644 tests/core/crypto/test_core_crypto_exdsa.odin diff --git a/core/crypto/_weierstrass/sc.odin b/core/crypto/_weierstrass/sc.odin index 0fc64e028..1ecfea6f9 100644 --- a/core/crypto/_weierstrass/sc.odin +++ b/core/crypto/_weierstrass/sc.odin @@ -1,5 +1,6 @@ package _weierstrass +@(require) import "core:crypto" import p256r1 "core:crypto/_fiat/field_scalarp256r1" import p384r1 "core:crypto/_fiat/field_scalarp384r1" import subtle "core:crypto/_subtle" @@ -9,6 +10,41 @@ Scalar_p384r1 :: p384r1.Montgomery_Domain_Field_Element SC_SIZE_P256R1 :: 32 SC_SIZE_P384R1 :: 48 +SC_SIZE_MAX :: SC_SIZE_P384R1 + +sc_size :: proc "contextless" (sc: ^$T) -> int where T == Scalar_p256r1 || T == Scalar_p384r1 { + when T == Scalar_p256r1 { + return SC_SIZE_P256R1 + } else when T == Scalar_p384r1 { + return SC_SIZE_P384R1 + } +} + +sc_set_random :: proc(sc: ^$T) where T == Scalar_p256r1 || T == Scalar_p384r1 { + ensure(crypto.HAS_RAND_BYTES, "weierstrass: entropy source required") + + b: [48]byte = --- + defer crypto.zero_explicit(&b, size_of(b)) + + when T == Scalar_p256r1 { + // 384-bits reduced makes the modulo bias insignificant + for { + crypto.rand_bytes(b[:]) + _ = sc_set_bytes(sc, b[:]) + if sc_is_zero(sc) == 0 { // Likely + break + } + } + } else when T == Scalar_p384r1 { + for { + crypto.rand_bytes(b[:]) + did_reduce := sc_set_bytes(sc, b[:]) + if !did_reduce && sc_is_zero(sc) == 0 { // Likely + break + } + } + } +} sc_clear :: proc { p256r1.fe_clear, diff --git a/core/crypto/ecdh/ecdh.odin b/core/crypto/ecdh/ecdh.odin index 15dba335c..af60f5649 100644 --- a/core/crypto/ecdh/ecdh.odin +++ b/core/crypto/ecdh/ecdh.odin @@ -121,29 +121,10 @@ private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { #partial switch curve { case .SECP256R1: sc := &priv_key._impl.(secec.Scalar_p256r1) - - // 384-bits reduced makes the modulo bias insignificant - b: [48]byte = --- - defer (crypto.zero_explicit(&b, size_of(b))) - for { - crypto.rand_bytes(b[:]) - _ = secec.sc_set_bytes(sc, b[:]) - if secec.sc_is_zero(sc) == 0 { // Likely - break - } - } + secec.sc_set_random(sc) case .SECP384R1: sc := &priv_key._impl.(secec.Scalar_p384r1) - - b: [48]byte = --- - defer (crypto.zero_explicit(&b, size_of(b))) - for { - crypto.rand_bytes(b[:]) - did_reduce := secec.sc_set_bytes(sc, b[:]) - if !did_reduce && secec.sc_is_zero(sc) == 0 { // Likely - break - } - } + secec.sc_set_random(sc) case .X25519: sc := &priv_key._impl.(X25519_Buf) crypto.rand_bytes(sc[:]) diff --git a/core/crypto/ecdsa/doc.odin b/core/crypto/ecdsa/doc.odin new file mode 100644 index 000000000..8d60f3c52 --- /dev/null +++ b/core/crypto/ecdsa/doc.odin @@ -0,0 +1,7 @@ +/* +Elliptic Curve Digital Signature Algorithm per SEC 2.0 section 4.1. + +See: +- [[ https://secg.org/sec1-v2.pdf ]] +*/ +package ecdsa diff --git a/core/crypto/ecdsa/ecdsa.odin b/core/crypto/ecdsa/ecdsa.odin new file mode 100644 index 000000000..241d50987 --- /dev/null +++ b/core/crypto/ecdsa/ecdsa.odin @@ -0,0 +1,321 @@ +package ecdsa + +import "core:crypto" +import secec "core:crypto/_weierstrass" +import "core:mem" +import "core:reflect" + +// Curve the curve identifier associated with a given Private_Key +// or Public_Key +Curve :: enum { + Invalid, + SECP256R1, + SECP384R1, +} + +// CURVE_NAMES is the Curve to curve name string. +CURVE_NAMES := [Curve]string { + .Invalid = "Invalid", + .SECP256R1 = "secp256r1", + .SECP384R1 = "secp384r1", +} + +// PRIVATE_KEY_SIZES is the Curve to private key size in bytes. +PRIVATE_KEY_SIZES := [Curve]int { + .Invalid = 0, + .SECP256R1 = secec.SC_SIZE_P256R1, + .SECP384R1 = secec.SC_SIZE_P384R1, +} + +// PUBLIC_KEY_SIZES is the Curve to public key size in bytes. +PUBLIC_KEY_SIZES := [Curve]int { + .Invalid = 0, + .SECP256R1 = 1 + 2 * secec.FE_SIZE_P256R1, + .SECP384R1 = 1 + 2 * secec.FE_SIZE_P384R1, +} + +// RAW_SIGNATURE_SIZES is the Curve to "raw" signature size in bytes. +RAW_SIGNATURE_SIZES := [Curve]int { + .Invalid = 0, + .SECP256R1 = 2 * secec.SC_SIZE_P256R1, + .SECP384R1 = 2 * secec.SC_SIZE_P384R1, +} + +@(private="file") +_PRIV_IMPL_IDS := [Curve]typeid { + .Invalid = nil, + .SECP256R1 = typeid_of(secec.Scalar_p256r1), + .SECP384R1 = typeid_of(secec.Scalar_p384r1), +} + +@(private="file") +_PUB_IMPL_IDS := [Curve]typeid { + .Invalid = nil, + .SECP256R1 = typeid_of(secec.Point_p256r1), + .SECP384R1 = typeid_of(secec.Point_p384r1), +} + +// Private_Key is an ECDSA private key. +Private_Key :: struct { + // WARNING: All of the members are to be treated as internal (ie: + // the Private_Key structure is intended to be opaque). + _curve: Curve, + _impl: union { + secec.Scalar_p256r1, + secec.Scalar_p384r1, + }, + _pub_key: Public_Key, +} + +// Public_Key is an ECDSA public key. +Public_Key :: struct { + // WARNING: All of the members are to be treated as internal (ie: + // the Public_Key structure is intended to be opaque). + _curve: Curve, + _impl: union { + secec.Point_p256r1, + secec.Point_p384r1, + }, +} + +// private_key_generate uses the system entropy source to generate a new +// Private_Key. This will only fail iff the system entropy source is +// missing or broken. +private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { + private_key_clear(priv_key) + + if !crypto.HAS_RAND_BYTES { + return false + } + + reflect.set_union_variant_typeid( + priv_key._impl, + _PRIV_IMPL_IDS[curve], + ) + + #partial switch curve { + case .SECP256R1: + sc := &priv_key._impl.(secec.Scalar_p256r1) + secec.sc_set_random(sc) + case .SECP384R1: + sc := &priv_key._impl.(secec.Scalar_p384r1) + secec.sc_set_random(sc) + case: + panic("crypto/ecdsa: invalid curve") + } + + priv_key._curve = curve + private_key_generate_public(priv_key) + + return true +} + +// private_key_set_bytes decodes a byte-encoded private key, and returns +// true iff the operation was successful. +private_key_set_bytes :: proc(priv_key: ^Private_Key, curve: Curve, b: []byte) -> bool { + private_key_clear(priv_key) + + if len(b) != PRIVATE_KEY_SIZES[curve] { + return false + } + + reflect.set_union_variant_typeid( + priv_key._impl, + _PRIV_IMPL_IDS[curve], + ) + + #partial switch curve { + case .SECP256R1: + sc := &priv_key._impl.(secec.Scalar_p256r1) + did_reduce := secec.sc_set_bytes(sc, b) + is_zero := secec.sc_is_zero(sc) == 1 + + // Reject `0` and scalars that are not less than the + // curve order. + if did_reduce || is_zero { + private_key_clear(priv_key) + return false + } + case .SECP384R1: + sc := &priv_key._impl.(secec.Scalar_p384r1) + did_reduce := secec.sc_set_bytes(sc, b) + is_zero := secec.sc_is_zero(sc) == 1 + + // Reject `0` and scalars that are not less than the + // curve order. + if did_reduce || is_zero { + private_key_clear(priv_key) + return false + } + case: + panic("crypto/esa: invalid curve") + } + + priv_key._curve = curve + private_key_generate_public(priv_key) + + return true +} + +@(private="file") +private_key_generate_public :: proc(priv_key: ^Private_Key) { + switch &sc in priv_key._impl { + case secec.Scalar_p256r1: + pub_key: secec.Point_p256r1 = --- + secec.pt_scalar_mul_generator(&pub_key, &sc) + secec.pt_rescale(&pub_key, &pub_key) + priv_key._pub_key._impl = pub_key + case secec.Scalar_p384r1: + pub_key: secec.Point_p384r1 = --- + secec.pt_scalar_mul_generator(&pub_key, &sc) + secec.pt_rescale(&pub_key, &pub_key) + priv_key._pub_key._impl = pub_key + case: + panic("crypto/ecdsa: invalid curve") + } + + priv_key._pub_key._curve = priv_key._curve +} + +// private_key_bytes sets dst to byte-encoding of priv_key. +private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { + ensure(priv_key._curve != .Invalid, "crypto/ecdsa: uninitialized private key") + ensure(len(dst) == PRIVATE_KEY_SIZES[priv_key._curve], "crypto/ecdsa: invalid destination size") + + #partial switch priv_key._curve { + case .SECP256R1: + sc := &priv_key._impl.(secec.Scalar_p256r1) + secec.sc_bytes(dst, sc) + case .SECP384R1: + sc := &priv_key._impl.(secec.Scalar_p384r1) + secec.sc_bytes(dst, sc) + case: + panic("crypto/ecdsa: invalid curve") + } +} + +// private_key_equal returns true iff the private keys are equal, +// in constant time. +private_key_equal :: proc(p, q: ^Private_Key) -> bool { + if p._curve != q._curve { + return false + } + + #partial switch p._curve { + case .SECP256R1: + sc_p, sc_q := &p._impl.(secec.Scalar_p256r1), &q._impl.(secec.Scalar_p256r1) + return secec.sc_equal(sc_p, sc_q) == 1 + case .SECP384R1: + sc_p, sc_q := &p._impl.(secec.Scalar_p384r1), &q._impl.(secec.Scalar_p384r1) + return secec.sc_equal(sc_p, sc_q) == 1 + case: + return false + } +} + +// private_key_clear clears priv_key to the uninitialized state. +private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { + mem.zero_explicit(priv_key, size_of(Private_Key)) +} + +// public_key_set_bytes decodes a byte-encoded public key, and returns +// true iff the operation was successful. +public_key_set_bytes :: proc(pub_key: ^Public_Key, curve: Curve, b: []byte) -> bool { + public_key_clear(pub_key) + + if len(b) != PUBLIC_KEY_SIZES[curve] { + return false + } + + reflect.set_union_variant_typeid( + pub_key._impl, + _PUB_IMPL_IDS[curve], + ) + + #partial switch curve { + case .SECP256R1: + if b[0] != secec.SEC_PREFIX_UNCOMPRESSED { + return false + } + + pt := &pub_key._impl.(secec.Point_p256r1) + ok := secec.pt_set_sec_bytes(pt, b) + if !ok || secec.pt_is_identity(pt) == 1 { + return false + } + case .SECP384R1: + if b[0] != secec.SEC_PREFIX_UNCOMPRESSED { + return false + } + + pt := &pub_key._impl.(secec.Point_p384r1) + ok := secec.pt_set_sec_bytes(pt, b) + if !ok || secec.pt_is_identity(pt) == 1 { + return false + } + case: + panic("crypto/ecdsa: invalid curve") + } + + pub_key._curve = curve + + return true +} + +// public_key_set_priv sets pub_key to the public component of priv_key. +public_key_set_priv :: proc(pub_key: ^Public_Key, priv_key: ^Private_Key) { + ensure(priv_key._curve != .Invalid, "crypto/ecdsa: uninitialized private key") + public_key_clear(pub_key) + pub_key^ = priv_key._pub_key +} + +// public_key_bytes sets dst to byte-encoding of pub_key. +public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { + ensure(pub_key._curve != .Invalid, "crypto/ecdsa: uninitialized public key") + ensure(len(dst) == PUBLIC_KEY_SIZES[pub_key._curve], "crypto/ecdsa: invalid destination size") + + #partial switch pub_key._curve { + case .SECP256R1: + // Invariant: Unless the caller is manually building pub_key + // `Z = 1`, so we can skip the rescale. + pt := &pub_key._impl.(secec.Point_p256r1) + + dst[0] = secec.SEC_PREFIX_UNCOMPRESSED + secec.fe_bytes(dst[1:1+secec.FE_SIZE_P256R1], &pt.x) + secec.fe_bytes(dst[1+secec.FE_SIZE_P256R1:], &pt.y) + case .SECP384R1: + // Invariant: Unless the caller is manually building pub_key + // `Z = 1`, so we can skip the rescale. + pt := &pub_key._impl.(secec.Point_p384r1) + + dst[0] = secec.SEC_PREFIX_UNCOMPRESSED + secec.fe_bytes(dst[1:1+secec.FE_SIZE_P384R1], &pt.x) + secec.fe_bytes(dst[1+secec.FE_SIZE_P384R1:], &pt.y) + case: + panic("crypto/ecdsa: invalid curve") + } +} + +// public_key_equal returns true iff the public keys are equal, +// in constant time. +public_key_equal :: proc(p, q: ^Public_Key) -> bool { + if p._curve != q._curve { + return false + } + + #partial switch p._curve { + case .SECP256R1: + pt_p, pt_q := &p._impl.(secec.Point_p256r1), &q._impl.(secec.Point_p256r1) + return secec.pt_equal(pt_p, pt_q) == 1 + case .SECP384R1: + pt_p, pt_q := &p._impl.(secec.Point_p384r1), &q._impl.(secec.Point_p384r1) + return secec.pt_equal(pt_p, pt_q) == 1 + case: + panic("crypto/ecdsa: invalid curve") + } +} + +// public_key_clear clears pub_key to the uninitialized state. +public_key_clear :: proc "contextless" (pub_key: ^Public_Key) { + mem.zero_explicit(pub_key, size_of(Public_Key)) +} diff --git a/core/crypto/ecdsa/ecdsa_asn1.odin b/core/crypto/ecdsa/ecdsa_asn1.odin new file mode 100644 index 000000000..0b423286d --- /dev/null +++ b/core/crypto/ecdsa/ecdsa_asn1.odin @@ -0,0 +1,183 @@ +package ecdsa + +import secec "core:crypto/_weierstrass" + +// ASN.1 format ECDSA signatures are`SEQUENCE { r INTEGER, s INTEGER }` +// this implements enough to generate/parse signatures. Eventually when +// we have a full ASN.1 DER library, these routines will be removed. + +@(private="file") +TAG_SEQUENCE :: 0x30 +@(private="file") +TAG_INTEGER :: 0x02 + +@(private,require_results) +generate_asn1_sig :: proc(r, s: ^$T, allocator := context.allocator) -> []byte { + when T == secec.Scalar_p256r1 { + SC_SZ :: secec.SC_SIZE_P256R1 + } else when T == secec.Scalar_p384r1 { + SC_SZ :: secec.SC_SIZE_P384R1 + } else { + #panic("crypto/ecdsa: invalid curve") + } + + INT_TLP :: 3 // tag, tength, (optional) leading zero-byte + encode_uint :: proc(b: []byte) -> []byte { + b := b + + // DER requires minimal encoding. + off := INT_TLP + for v in b[off:] { + if v != 0 { + break + } + off += 1 + } + // If the sign big is set, add a leading zero. + if b[off] & 0x80 == 0x80 { + off -= 1 + b[off] = 0 + } + + // Encode the length (up to 127 octets, adequate for ECDSA). + l := len(b[off:]) + off -= 1 + b[off] = byte(l) + + // Encode the tag + off -= 1 + b[off] = TAG_INTEGER + + return b[off:] + } + + r_buf, s_buf: [INT_TLP+SC_SZ]byte = ---, --- + secec.sc_bytes(r_buf[INT_TLP:], r) + secec.sc_bytes(s_buf[INT_TLP:], s) + + r_bytes, s_bytes := encode_uint(r_buf[:]), encode_uint(s_buf[:]) + seq_len := len(r_bytes) + len(s_bytes) + + // WARNING: If secp521r1 support is added, this needs to support + // long-form length encoding. + ensure(seq_len <= 127, "BUG: crypto/ecdsa: signature length too large") + b := make([]byte, seq_len + 2, allocator) + b[0] = TAG_SEQUENCE + b[1] = byte(seq_len) + copy(b[2:], r_bytes) + copy(b[2+len(r_bytes):], s_bytes) + + return b +} + +@(private,require_results) +parse_asn1_sig :: proc(sig: []byte) -> (r, s: []byte, ok: bool) { + read_seq :: proc(b: []byte) -> (v: []byte, rest: []byte, ok: bool) { + b_len := len(b) + if b_len < 3 { + return nil, nil, false + } + if b[0] != TAG_SEQUENCE { + return nil, nil, false + } + seq_len, off: int + if b[1] & 0x80 == 0x80 { + if b[1] != 0x81 || b_len < 4 { // 2-length octets is sufficient for ecdsa. + return nil, nil, false + } + if b[2] & 0x80 == 0x80 || b[3] & 0x80 == 80 { + return nil, nil, false + } + seq_len = int(b[2]) * 127 + int(b[3]) + off = 4 + } else { + seq_len = int(b[1]) + off = 2 + } + if b_len - off < seq_len { + return nil, nil, false + } + return b[off:off+seq_len], b[off+seq_len:], true + } + + read_int :: proc(b: []byte) -> (v: []byte, rest: []byte, ok: bool) { + b_len := len(b) + if b_len < 3 { + return nil, nil, false + } + if b[0] != TAG_INTEGER { + return nil, nil, false + } + v_len := int(b[1]) + if v_len > 0x80 || b_len - 2 < v_len { // 127-bytes max. + return nil, nil, false + } + + return b[2:2+v_len], b[2+v_len:], true + } + + // SEQUENCE + seq_bytes, rest: []byte + seq_bytes, rest, ok = read_seq(sig) + if !ok { + return nil, nil, false + } + if len(rest) != 0 { + return nil, nil, false + } + + // INTEGER (r) + r, rest, ok = read_int(seq_bytes) + if !ok { + return nil, nil, false + } + + // INTEGER (s) + s, rest, ok = read_int(rest) + if !ok { + return nil, nil, false + } + if len(rest) != 0 { + return nil, nil, false + } + + // DER requires a leading 0 iff the sign bit of the leading byte + // is set to distinguish between positive and negative integers, + // and the minimal length representation. `r` and `s` are always + // going to be unsigned, so we validate malformed DER and strip + // the leading 0 as needed. + fixup_der_uint :: proc(b: []byte) -> ([]byte, bool) { + switch len(b) { + case 0: + // 0 length is invalid + return nil, false + case 1: + // Missing leading zero + if b[0] & 0x80 == 0x80 { + return nil, false + } + case: + if b[0] == 0 { + // Sign bit not set + if b[1] & 0x80 != 0x80 { + return nil, false + } + return b[1:], true + } else if b[0] & 0x80 == 0x80 { + // Missing leading zero + return nil, false + } + } + + return b, true + } + + if r, ok = fixup_der_uint(r); !ok { + return nil, nil, false + } + if s, ok = fixup_der_uint(s); !ok { + return nil, nil, false + } + + return r, s, true +} diff --git a/core/crypto/ecdsa/ecdsa_k_rfc6979.odin b/core/crypto/ecdsa/ecdsa_k_rfc6979.odin new file mode 100644 index 000000000..01d2bb911 --- /dev/null +++ b/core/crypto/ecdsa/ecdsa_k_rfc6979.odin @@ -0,0 +1,98 @@ +package ecdsa + +import "core:crypto" +import "core:crypto/hash" +import "core:crypto/hmac" +import secec "core:crypto/_weierstrass" + +@(private) +Drbg_RFC6979 :: struct { + v: [hash.MAX_DIGEST_SIZE]byte, + k: [hash.MAX_DIGEST_SIZE]byte, + + algorithm: hash.Algorithm, + sz: int, + need_update: bool, +} + +@(private) +init_drbg_rfc6979 :: proc(rng: ^Drbg_RFC6979, algorithm: hash.Algorithm, x_bytes, e_bytes: []byte, deterministic: bool) { + rng.algorithm = algorithm + rng.sz = hash.DIGEST_SIZES[algorithm] + rng.need_update = false + for i in 0.. bool { + // Extremely unlikely, so avoid unless the rejection + // sampling triggers. + if rng.need_update { + drbg_update_k(rng) + drbg_update_v(rng) + } + + drbg_update_v(rng) + rng.need_update = true + + return secec.sc_set_bytes(sc, rng.v[:secec.sc_size(sc)]) +} + +@(private) +drbg_clear_rfc6979 :: proc(rng: ^Drbg_RFC6979) { + crypto.zero_explicit(rng, size_of(Drbg_RFC6979)) +} + +@(private="file") +drbg_update_v :: proc(rng: ^Drbg_RFC6979) { + // V = HMAC_K(V) + k, v := rng.k[:rng.sz], rng.v[:rng.sz] + hmac.sum(rng.algorithm, v, v, k) +} + +@(private="file") +drbg_update_k :: proc(rng: ^Drbg_RFC6979) { + // K = HMAC_K(V || 0x00) + k, v := rng.k[:rng.sz], rng.v[:rng.sz] + + ctx: hmac.Context + hmac.init(&ctx, rng.algorithm, k) + hmac.update(&ctx, v) + hmac.update(&ctx, []byte{0x00}) + hmac.final(&ctx, k) +} + +@(private="file") +drbg_init_update_k :: proc(rng: ^Drbg_RFC6979, i2o_b, b2o_h1: []byte, internal_octet: byte, additional_input: []byte) { + k, v := rng.k[:rng.sz], rng.v[:rng.sz] + + ctx: hmac.Context + hmac.init(&ctx, rng.algorithm, k) + hmac.update(&ctx, v) + hmac.update(&ctx, []byte{internal_octet}) + hmac.update(&ctx, i2o_b) + hmac.update(&ctx, b2o_h1) + if additional_input != nil { + hmac.update(&ctx, additional_input) + } + hmac.final(&ctx, k) +} diff --git a/core/crypto/ecdsa/ecdsa_sign.odin b/core/crypto/ecdsa/ecdsa_sign.odin new file mode 100644 index 000000000..c6fec56dc --- /dev/null +++ b/core/crypto/ecdsa/ecdsa_sign.odin @@ -0,0 +1,201 @@ +package ecdsa + +import "base:runtime" +import "core:crypto" +import "core:crypto/hash" +import secec "core:crypto/_weierstrass" + +// sign_asn1 returns the signature by priv_key over msg hased using hash_algo +// using the signing procedure as specified in SEC 1, Version 2.0, Section +// 4.1.3. ASN.1 DER requires minimal encoding, and the format is clunky +// and variable-length so for simplicity we allocate the signature. +// +// The signature format is ASN1. `SEQUECE `{ r INTEGER, s INTEGER }`. +@(require_results) +sign_asn1 :: proc(priv_key: ^Private_Key, hash_algo: hash.Algorithm, msg: []byte, allocator: runtime.Allocator, deterministic := !crypto.HAS_RAND_BYTES) -> ([]byte, bool) { + ensure(hash_algo != .Invalid, "crypto/edsa: invalid hash algorithm") + ensure(priv_key._curve != .Invalid, "crypto/edsa: invalid curve") + + if !deterministic && !crypto.HAS_RAND_BYTES { + return nil, false + } + + #partial switch priv_key._curve { + case .SECP256R1: + SC_SZ :: secec.SC_SIZE_P256R1 + RAW_SIG_SZ :: 2 * SC_SZ + r, s: secec.Scalar_p256r1 = ---, --- + sk := &priv_key._impl.(secec.Scalar_p256r1) + sign_internal(sk, &r, &s, hash_algo, msg, deterministic) + + return generate_asn1_sig(&r, &s, allocator), true + case .SECP384R1: + SC_SZ :: secec.SC_SIZE_P384R1 + RAW_SIG_SZ :: 2 * SC_SZ + r, s: secec.Scalar_p384r1 = ---, --- + sk := &priv_key._impl.(secec.Scalar_p384r1) + sign_internal(sk, &r, &s, hash_algo, msg, deterministic) + + return generate_asn1_sig(&r, &s, allocator), true + } + + return nil, false +} + +// sign_raw writes the signature by priv_key over msg hased using hash_algo +// to sig, using the signing procedure as specified in SEC 1, Version 2.0, +// Section 4.1.3. +// +// The signature format is `r | s`. +@(require_results) +sign_raw :: proc(priv_key: ^Private_Key, hash_algo: hash.Algorithm, msg, sig: []byte, deterministic := !crypto.HAS_RAND_BYTES) -> bool { + ensure(hash_algo != .Invalid, "crypto/edsa: invalid hash algorithm") + ensure(priv_key._curve != .Invalid, "crypto/edsa: invalid curve") + ensure(len(sig) == RAW_SIGNATURE_SIZES[priv_key._curve], "crypto/ecdsa: invalid destination size") + + if !deterministic && !crypto.HAS_RAND_BYTES { + return false + } + + #partial switch priv_key._curve { + case .SECP256R1: + SC_SZ :: secec.SC_SIZE_P256R1 + r, s: secec.Scalar_p256r1 = ---, --- + sk := &priv_key._impl.(secec.Scalar_p256r1) + sign_internal(sk, &r, &s, hash_algo, msg, deterministic) + + r_bytes, s_bytes := sig[:SC_SZ], sig[SC_SZ:] + secec.sc_bytes(r_bytes, &r) + secec.sc_bytes(s_bytes, &s) + case .SECP384R1: + SC_SZ :: secec.SC_SIZE_P384R1 + r, s: secec.Scalar_p384r1 = ---, --- + sk := &priv_key._impl.(secec.Scalar_p384r1) + sign_internal(sk, &r, &s, hash_algo, msg, deterministic) + + r_bytes, s_bytes := sig[:SC_SZ], sig[SC_SZ:] + secec.sc_bytes(r_bytes, &r) + secec.sc_bytes(s_bytes, &s) + case: + panic("crypto/ecdsa: invalid curve") + } + + return true +} + +@(private) +sign_internal :: proc(priv_key, sig_r, sig_s: ^$T, hash_algo: hash.Algorithm, msg: []byte, deterministic: bool) { + when T == secec.Scalar_p256r1 { + SC_SZ :: secec.SC_SIZE_P256R1 + FE_SZ :: secec.FE_SIZE_P256R1 + MIN_DRBG_HASH :: hash.Algorithm.SHA256 + r_pt: secec.Point_p256r1 = --- + } else when T == secec.Scalar_p384r1 { + SC_SZ :: secec.SC_SIZE_P384R1 + FE_SZ :: secec.FE_SIZE_P384R1 + MIN_DRBG_HASH :: hash.Algorithm.SHA384 + r_pt: secec.Point_p384r1 = --- + } else { + #panic("crypto/ecdsa: invalid curve") + } + + // Note: `e` (derived from `hash`) in steps 4 and 5, is + // unchanged throughout the process even if a different `k` + // needs to be selected, thus, the value is derived first + // before the rejection sampling loop. + + // 4. Use the hash function selected during the setup procedure + // to compute the hash value: + // H = Hash(M) + // of length hashlen octets as specified in Section 3.5. If the + // hash function outputs “invalid”, output “invalid” and stop. + + // 5. Derive an integer e from H as follows: + // 5.1. Convert the octet string H to a bit string H using the + // conversion routine specified in Section 2.3.2. + // 5.2. Set E = H if ceil(log2(n)) >= 8(hashlen), and set E equal + // to the leftmost ceil(log2(n)) bits of H if ceil(log2(n)) < + // 8(hashlen). + // 5.3. Convert the bit string E to an octet string E using the + // conversion routine specified in Section 2.3.1. + // 5.4. Convert the octet string E to an integer e using the + // conversion routine specified in Section 2.3.8. + + e: T = --- + h_bytes: [hash.MAX_DIGEST_SIZE]byte = --- + e_bytes := hash.hash_bytes_to_buffer(hash_algo, msg, h_bytes[:]) + if len(e_bytes) > SC_SZ { + e_bytes = e_bytes[:SC_SZ] + } + if did_reduce := secec.sc_set_bytes(&e, e_bytes); did_reduce { + // RFC 6979 wants the reduced value + secec.sc_bytes(e_bytes, &e) + } + + x_bytes: [SC_SZ]byte = --- + defer crypto.zero_explicit(&x_bytes, size_of(x_bytes)) + secec.sc_bytes(x_bytes[:], priv_key) + + // While I normally will be content to let idiots compromise + // their signing keys, past precident (eg: Sony Computer + // Entertainment America, Inc v. Hotz) shows that "idiots" + // are also litigatious asshats. By default we use the hedged + // ("with additional input") variant of RFC 6979, with the option + // to disable the added entropy for RFC 6979 compatible deterministic + // signatures. + // + // For implementation simplicity, we will use a hash function that + // has a digest size that is greater than or equal to that of the + // curve order. Using a separate hash is allowed per section 3.6 + // of the RFC, and we only ever use a more secure hash. + + rng: Drbg_RFC6979 = --- + drbg_hash := hash_algo + if hash.DIGEST_SIZES[hash_algo] < SC_SZ { + drbg_hash = MIN_DRBG_HASH + } + init_drbg_rfc6979(&rng, drbg_hash, x_bytes[:], e_bytes, deterministic) + + k: T = --- + defer secec.sc_clear(&k) + for { + // 1. Select an ephemeral elliptic curve key pair (k, R) with + // R = (xR, yR) associated with the elliptic curve domain parameters + // T established during the setup procedure using the key pair + // generation primitive specified in Section 3.2.1. + + if did_reduce := drbg_read_rfc6979(&rng, &k); did_reduce || secec.sc_is_zero(&k) == 1 { + continue + } + secec.pt_scalar_mul_generator(&r_pt, &k) + + // 2. Convert the field element xR to an integer xR using the + // conversion routine specified in Section 2.3.9. + + rx_bytes: [FE_SZ]byte = --- + _ = secec.pt_bytes(rx_bytes[:], nil, &r_pt) + + // 3. Set r = xR mod n. If r = 0, or optionally r fails to meet + // other publicly verifiable criteria (see below), return to Step 1. + + _ = secec.sc_set_bytes(sig_r, rx_bytes[:]) + if secec.sc_is_zero(sig_r) == 1 { + // This is essentially totally untestable since the odds + // of generating `r = 0` is astronomically unlikely. + continue + } + + // (Steps 4/5 done prior to loop.) + + // 6. Compute: s = k^−1 (e + r * dU) mod n. + // If s = 0, return to Step 1. + + secec.sc_inv(&k, &k) + secec.sc_mul(sig_s, sig_r, priv_key) + secec.sc_add(sig_s, sig_s, &e) + secec.sc_mul(sig_s, sig_s, &k) + if secec.sc_is_zero(sig_s) == 0 { + return + } + } +} diff --git a/core/crypto/ecdsa/ecdsa_verify.odin b/core/crypto/ecdsa/ecdsa_verify.odin new file mode 100644 index 000000000..6b4e3dd4a --- /dev/null +++ b/core/crypto/ecdsa/ecdsa_verify.odin @@ -0,0 +1,148 @@ +package ecdsa + +import "core:crypto/hash" +import secec "core:crypto/_weierstrass" + +// verify_raw returns true iff sig is a valid signature by pub_key over +// msg, hased using hash_algo, per the verification procedure specifed +// in SEC 1, Version 2.0, Section 4.1.4. +// +// The signature format is `r | s`. +@(require_results) +verify_raw :: proc(pub_key: ^Public_Key, hash_algo: hash.Algorithm, msg, sig: []byte) -> bool { + ensure(hash_algo != .Invalid, "crypto/edsa: invalid hash algorithm") + ensure(pub_key._curve != .Invalid, "crypto/edsa: invalid curve") + + if len(sig) != RAW_SIGNATURE_SIZES[pub_key._curve] { + return false + } + + #partial switch pub_key._curve { + case .SECP256R1: + SC_SZ :: secec.SC_SIZE_P256R1 + r_bytes, s_bytes := sig[:SC_SZ], sig[SC_SZ:] + pk := &pub_key._impl.(secec.Point_p256r1) + return verify_internal(pk, hash_algo, r_bytes, s_bytes, msg) + case .SECP384R1: + SC_SZ :: secec.SC_SIZE_P384R1 + r_bytes, s_bytes := sig[:SC_SZ], sig[SC_SZ:] + pk := &pub_key._impl.(secec.Point_p384r1) + return verify_internal(pk, hash_algo, r_bytes, s_bytes, msg) + } + + panic("crypto/ecdsa: invalid curve") +} + +// verify_asn1 returns true iff sig is a valid signature by pub_key over +// msg, hased using hash_algo, per the verification procedure specifed +// in SEC 1, Version 2.0, Section 4.1.4. +// +// The signature format is ASN.1 `SEQUENCE { r INTEGER, s INTEGER }`. +@(require_results) +verify_asn1 :: proc(pub_key: ^Public_Key, hash_algo: hash.Algorithm, msg, sig: []byte) -> bool { + ensure(hash_algo != .Invalid, "crypto/edsa: invalid hash algorithm") + ensure(pub_key._curve != .Invalid, "crypto/edsa: invalid curve") + + r_bytes, s_bytes, ok := parse_asn1_sig(sig) + if !ok { + return false + } + + #partial switch pub_key._curve { + case .SECP256R1: + pk := &pub_key._impl.(secec.Point_p256r1) + return verify_internal(pk, hash_algo, r_bytes, s_bytes, msg) + case .SECP384R1: + pk := &pub_key._impl.(secec.Point_p384r1) + return verify_internal(pk, hash_algo, r_bytes, s_bytes, msg) + } + + panic("crypto/ecdsa: invalid curve") +} + +@(private,require_results) +verify_internal :: proc(pub_key: ^$T, hash_algo: hash.Algorithm, sig_r, sig_s, msg: []byte) -> bool { + when T == secec.Point_p256r1 { + r, s, e, v: secec.Scalar_p256r1 = ---, ---, ---, --- + u1, u2, s_inv: secec.Scalar_p256r1 = ---, ---, --- + SC_SZ :: secec.SC_SIZE_P256R1 + } else when T == secec.Point_p384r1 { + r, s, e, v: secec.Scalar_p384r1 = ---, ---, ---, --- + u1, u2, s_inv: secec.Scalar_p384r1 = ---, ---, --- + SC_SZ :: secec.SC_SIZE_P384R1 + } else { + #panic("crypto/ecdsa: invalid curve") + } + + if len(sig_r) > SC_SZ || len(sig_s) > SC_SZ { + return false + } + + // 1. If r and s are not both integers in the interval [1, n − 1], + // output “invalid” and stop. + + if did_reduce := secec.sc_set_bytes(&r, sig_r); did_reduce { + return false + } + if did_reduce := secec.sc_set_bytes(&s, sig_s); did_reduce { + return false + } + if secec.sc_is_zero(&r) == 1 || secec.sc_is_zero(&s) == 1 { + return false + } + + // 2. Use the hash function established during the setup procedure + // to compute the hash value: + // H = Hash(M) + // of length hashlen octets as specified in Section 3.5. If the + // hash function outputs “invalid”, output “invalid” and stop. + + // 3. Derive an integer e from H as follows: + // 3.1. Convert the octet string H to a bit string H using the + // conversion routine specified in Section 2.3.2. + // 3.2. Set E = H if ceil(log2(n)) >= 8(hashlen), and set E equal + // to the leftmost ceil(log2(n)) bits of H if ceil(log2(n)) < + // 8(hashlen). + // 3.3. Convert the bit string E to an octet string E using the + // conversion routine specified in Section 2.3.1. + // 3.4. Convert the octet string E to an integer e using the + // conversion routine specified in Section 2.3.8. + + h_bytes: [hash.MAX_DIGEST_SIZE]byte = --- + e_bytes := hash.hash_bytes_to_buffer(hash_algo, msg, h_bytes[:]) + if len(e_bytes) > SC_SZ { + e_bytes = e_bytes[:SC_SZ] + } + _ = secec.sc_set_bytes(&e, e_bytes) + + // 4. Compute: u1 = e(s^−1) mod n and u2 = r(s^-1) mod n. + + secec.sc_inv(&s_inv, &s) + secec.sc_mul(&u1, &e, &s_inv) + secec.sc_mul(&u2, &r, &s_inv) + + // 5. Compute: R = (xR, yR) = u1 * G + u2 * QU. + + r_pt: T = --- + secec.pt_double_scalar_mul_generator_vartime(&r_pt, pub_key, &u1, &u2) + + // If R = O, output “invalid” and stop. + + if secec.pt_is_identity(&r_pt) == 1 { + return false + } + + // 6. Convert the field element xR to an integer xR using the + // conversion routine specified in Section 2.3.9. + // + // 7. Set v = xR mod n. + + r_x: [SC_SZ]byte = --- + _ = secec.pt_bytes(r_x[:], nil, &r_pt) + _ = secec.sc_set_bytes(&v, r_x[:]) + + // 8. Compare v and r — if v = r, output “valid”, and if + // v != r, output “invalid”. + + return secec.sc_equal(&r, &v) == 1 +} diff --git a/examples/all/all_js.odin b/examples/all/all_js.odin index bb7ed7fa1..3a234ee4a 100644 --- a/examples/all/all_js.odin +++ b/examples/all/all_js.odin @@ -34,6 +34,7 @@ package all @(require) import chash "core:crypto/hash" @(require) import "core:crypto/deoxysii" @(require) import "core:crypto/ecdh" +@(require) import "core:crypto/ecdsa" @(require) import "core:crypto/ed25519" @(require) import "core:crypto/hkdf" @(require) import "core:crypto/hmac" diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 3576fc027..4e98048bf 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -39,6 +39,7 @@ package all @(require) import chash "core:crypto/hash" @(require) import "core:crypto/deoxysii" @(require) import "core:crypto/ecdh" +@(require) import "core:crypto/ecdsa" @(require) import "core:crypto/ed25519" @(require) import "core:crypto/hkdf" @(require) import "core:crypto/hmac" diff --git a/tests/benchmark/crypto/benchmark_ecc.odin b/tests/benchmark/crypto/benchmark_ecc.odin index 52a1a4ac1..c1809c6ba 100644 --- a/tests/benchmark/crypto/benchmark_ecc.odin +++ b/tests/benchmark/crypto/benchmark_ecc.odin @@ -9,12 +9,16 @@ import "core:time" import "core:crypto" import "core:crypto/ecdh" +import "core:crypto/ecdsa" import "core:crypto/ed25519" +import "core:crypto/hash" @(private = "file") ECDH_ITERS :: 10000 @(private = "file") DSA_ITERS :: 10000 +@(private = "file") +MSG : string : "Got a job for you, 621." @(test) benchmark_crypto_ecc :: proc(t: ^testing.T) { @@ -24,7 +28,7 @@ benchmark_crypto_ecc :: proc(t: ^testing.T) { bench_dsa() } -@(private = "file") +@(private="file") bench_ecdh :: proc() { if !crypto.HAS_RAND_BYTES { log.warnf("ECDH benchmarks skipped, no system entropy source") @@ -78,7 +82,7 @@ bench_ecdh :: proc() { log_table(&tbl) } -@(private = "file") +@(private="file") bench_dsa :: proc() { tbl: table.Table table.init(&tbl) @@ -102,6 +106,20 @@ bench_dsa :: proc() { append_tbl(&tbl, "ed25519", "sign", sig) append_tbl(&tbl, "ed25519", "verify", verif) + table.row(&tbl) + + sk, sig, verif = bench_ecdsa(.SECP256R1, .SHA256) + append_tbl(&tbl, "secp256r1/SHA256/RFC6979", "private_key_set_bytes", sk) + append_tbl(&tbl, "secp256r1/SHA256/RFC6979", "sign", sig) + append_tbl(&tbl, "secp256r1/SHA256/RFC6979", "verify", verif) + + table.row(&tbl) + + sk, sig, verif = bench_ecdsa(.SECP384R1, .SHA384) + append_tbl(&tbl, "secp384r1/SHA384/RFC6979", "private_key_set_bytes", sk) + append_tbl(&tbl, "secp384r1/SHA384/RFC6979", "sign", sig) + append_tbl(&tbl, "secp384r1/SHA384/RFC6979", "verify", verif) + log_table(&tbl) } @@ -122,9 +140,8 @@ bench_ed25519 :: proc() -> (sk, sig, verif: time.Duration) { ok := ed25519.public_key_set_bytes(&pub_key, pub_bytes[:]) assert(ok, "public key should deserialize") - msg := "Got a job for you, 621." sig_bytes: [ed25519.SIGNATURE_SIZE]byte - msg_bytes := transmute([]byte)(msg) + msg_bytes := transmute([]byte)(MSG) start = time.tick_now() for _ in 0 ..< DSA_ITERS { ed25519.sign(&priv_key, msg_bytes, sig_bytes[:]) @@ -140,3 +157,37 @@ bench_ed25519 :: proc() -> (sk, sig, verif: time.Duration) { return } + +@(private="file") +bench_ecdsa :: proc(curve: ecdsa.Curve, hash: hash.Algorithm) -> (sk, sig, verif: time.Duration) { + priv_bytes := make([]byte, ecdsa.PRIVATE_KEY_SIZES[curve], context.temp_allocator) + crypto.set(raw_data(priv_bytes), 0x69, len(priv_bytes)) + priv_key: ecdsa.Private_Key + start := time.tick_now() + for _ in 0 ..< DSA_ITERS { + ok := ecdsa.private_key_set_bytes(&priv_key, curve, priv_bytes) + assert(ok, "private key should deserialize") + } + sk = time.tick_since(start) / DSA_ITERS + + pub_key: ecdsa.Public_Key + ecdsa.public_key_set_priv(&pub_key, &priv_key) + + sig_bytes := make([]byte, ecdsa.RAW_SIGNATURE_SIZES[curve], context.temp_allocator) + msg_bytes := transmute([]byte)(MSG) + start = time.tick_now() + for _ in 0 ..< DSA_ITERS { + ok := ecdsa.sign_raw(&priv_key, hash, msg_bytes, sig_bytes, true) + assert(ok, "signing should succeed") + } + sig = time.tick_since(start) / DSA_ITERS + + start = time.tick_now() + for _ in 0 ..< DSA_ITERS { + ok := ecdsa.verify_raw(&pub_key, hash, msg_bytes, sig_bytes) + assert(ok, "signature should validate") + } + verif = time.tick_since(start) / DSA_ITERS + + return +} diff --git a/tests/core/crypto/test_core_crypto_edwards.odin b/tests/core/crypto/test_core_crypto_edwards.odin index 2da98000c..2983e6cbb 100644 --- a/tests/core/crypto/test_core_crypto_edwards.odin +++ b/tests/core/crypto/test_core_crypto_edwards.odin @@ -4,7 +4,6 @@ import "core:encoding/hex" import "core:testing" import field "core:crypto/_fiat/field_curve25519" -import "core:crypto/ed25519" import "core:crypto/ristretto255" @(test) @@ -318,311 +317,6 @@ test_ristretto255 :: proc(t: ^testing.T) { } } -@(test) -test_ed25519 :: proc(t: ^testing.T) { - test_vectors_rfc := []struct { - priv_key: string, - pub_key: string, - msg: string, - sig: string, - } { - // Test vectors from RFC 8032 - { - "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", - "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", - "", - "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", - }, - { - "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb", - "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", - "72", - "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00", - }, - { - "c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7", - "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025", - "af82", - "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a", - }, - // TEST 1024 omitted for brevity, because all that does is add more to SHA-512 - { - "833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42", - "ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf", - "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f", - "dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b58909351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704", - }, - } - for v, _ in test_vectors_rfc { - priv_bytes, _ := hex.decode(transmute([]byte)(v.priv_key), context.temp_allocator) - pub_bytes, _ := hex.decode(transmute([]byte)(v.pub_key), context.temp_allocator) - msg_bytes, _ := hex.decode(transmute([]byte)(v.msg), context.temp_allocator) - sig_bytes, _ := hex.decode(transmute([]byte)(v.sig), context.temp_allocator) - - priv_key: ed25519.Private_Key - ok := ed25519.private_key_set_bytes(&priv_key, priv_bytes) - testing.expectf( - t, - ok, - "Expected %s to be a valid private key", - v.priv_key, - ) - - key_bytes: [32]byte - ed25519.private_key_bytes(&priv_key, key_bytes[:]) - testing.expectf( - t, - ok, - "Expected private key %s round-trip, got %s", - v.priv_key, - string(hex.encode(key_bytes[:], context.temp_allocator)), - ) - - pub_key: ed25519.Public_Key - ok = ed25519.public_key_set_bytes(&pub_key, pub_bytes) - testing.expectf( - t, - ok, - "Expected %s to be a valid public key (priv->pub: %s)", - v.pub_key, - string(hex.encode(priv_key._pub_key._b[:], context.temp_allocator)), - ) - - ed25519.public_key_bytes(&pub_key, key_bytes[:]) - testing.expectf( - t, - ok, - "Expected public key %s round-trip, got %s", - v.pub_key, - string(hex.encode(key_bytes[:], context.temp_allocator)), - ) - - sig: [ed25519.SIGNATURE_SIZE]byte - ed25519.sign(&priv_key, msg_bytes, sig[:]) - x := string(hex.encode(sig[:], context.temp_allocator)) - testing.expectf( - t, - x == v.sig, - "Expected %s for sign(%s, %s), got %s", - v.sig, - v.priv_key, - v.msg, - x, - ) - - ok = ed25519.verify(&pub_key, msg_bytes, sig_bytes) - testing.expectf( - t, - ok, - "Expected true for verify(%s, %s, %s)", - v.pub_key, - v.msg, - v.sig, - ) - - ok = ed25519.verify(&priv_key._pub_key, msg_bytes, sig_bytes) - testing.expectf( - t, - ok, - "Expected true for verify(pub(%s), %s %s)", - v.priv_key, - v.msg, - v.sig, - ) - - // Corrupt the message and make sure verification fails. - switch len(msg_bytes) { - case 0: - tmp_msg := []byte{69} - msg_bytes = tmp_msg[:] - case: - msg_bytes[0] = msg_bytes[0] ~ 69 - } - ok = ed25519.verify(&pub_key, msg_bytes, sig_bytes) - testing.expectf( - t, - ok == false, - "Expected false for verify(%s, %s (corrupted), %s)", - v.pub_key, - v.msg, - v.sig, - ) - } - - // Test cases from "Taming the many EdDSAs", which aim to exercise - // all of the ed25519 edge cases/implementation differences. - // - // - https://eprint.iacr.org/2020/1244 - // - https://github.com/novifinancial/ed25519-speccheck - test_vectors_speccheck := []struct { - pub_key: string, - msg: string, - sig: string, - pub_key_ok: bool, - sig_ok: bool, - sig_ok_relaxed: bool, // Ok if the small-order A check is relaxed. - } { - // S = 0, small-order A, small-order R - { - "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", - "8c93255d71dcab10e8f379c26200f3c7bd5f09d9bc3068d3ef4edeb4853022b6", - "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a0000000000000000000000000000000000000000000000000000000000000000", - true, - false, - true, - }, - // 0 < S < L, small-order A, mixed-order R - { - "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", - "9bd9f44f4dcc75bd531b56b2cd280b0bb38fc1cd6d1230e14861d861de092e79", - "f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43a5bb704786be79fc476f91d3f3f89b03984d8068dcf1bb7dfc6637b45450ac04", - true, - false, - true, - }, - // 0 < S < L, mixed-order A, small-order R - { - "f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43", - "aebf3f2601a0c8c5d39cc7d8911642f740b78168218da8471772b35f9d35b9ab", - "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa8c4bd45aecaca5b24fb97bc10ac27ac8751a7dfe1baff8b953ec9f5833ca260e", - true, - true, - true, - }, - // 0 < S < L, mixed-order A, mixed-order R - { - "cdb267ce40c5cd45306fa5d2f29731459387dbf9eb933b7bd5aed9a765b88d4d", - "9bd9f44f4dcc75bd531b56b2cd280b0bb38fc1cd6d1230e14861d861de092e79", - "9046a64750444938de19f227bb80485e92b83fdb4b6506c160484c016cc1852f87909e14428a7a1d62e9f22f3d3ad7802db02eb2e688b6c52fcd6648a98bd009", - true, - true, - true, - }, - // 0 < S < L, mixed-order A, mixed-order R - { - "cdb267ce40c5cd45306fa5d2f29731459387dbf9eb933b7bd5aed9a765b88d4d", - "e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec4011eaccd55b53f56c", - "160a1cb0dc9c0258cd0a7d23e94d8fa878bcb1925f2c64246b2dee1796bed5125ec6bc982a269b723e0668e540911a9a6a58921d6925e434ab10aa7940551a09", - true, - true, // cofactored-only - true, - }, - // 0 < S < L, mixed-order A, L-order R - { - "cdb267ce40c5cd45306fa5d2f29731459387dbf9eb933b7bd5aed9a765b88d4d", - "e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec4011eaccd55b53f56c", - "21122a84e0b5fca4052f5b1235c80a537878b38f3142356b2c2384ebad4668b7e40bc836dac0f71076f9abe3a53f9c03c1ceeeddb658d0030494ace586687405", - true, - true, // cofactored only, (fail if 8h is pre-reduced) - true, - }, - // S > L, L-order A, L-order R - { - "442aad9f089ad9e14647b1ef9099a1ff4798d78589e66f28eca69c11f582a623", - "85e241a07d148b41e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec40", - "e96f66be976d82e60150baecff9906684aebb1ef181f67a7189ac78ea23b6c0e547f7690a0e2ddcd04d87dbc3490dc19b3b3052f7ff0538cb68afb369ba3a514", - true, - false, - false, - }, - // S >> L, L-order A, L-order R - { - "442aad9f089ad9e14647b1ef9099a1ff4798d78589e66f28eca69c11f582a623", - "85e241a07d148b41e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec40", - "8ce5b96c8f26d0ab6c47958c9e68b937104cd36e13c33566acd2fe8d38aa19427e71f98a473474f2f13f06f97c20d58cc3f54b8bd0d272f42b695dd7e89a8c22", - true, - false, - false, - }, - // 0 < S < L, mixed-order A, small-order R (non-canonical R, reduced for hash) - { - "f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43", - "9bedc267423725d473888631ebf45988bad3db83851ee85c85e241a07d148b41", - "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03be9678ac102edcd92b0210bb34d7428d12ffc5df5f37e359941266a4e35f0f", - true, - false, - false, - }, - // 0 < S < L, mixed-order A, small-order R (non-canonical R, not reduced for hash) - { - "f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43", - "9bedc267423725d473888631ebf45988bad3db83851ee85c85e241a07d148b41", - "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffca8c5b64cd208982aa38d4936621a4775aa233aa0505711d8fdcfdaa943d4908", - true, - false, - false, - }, - // 0 < S < L, small-order A, mixed-order R (non-canonical A, reduced for hash) - { - "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "e96b7021eb39c1a163b6da4e3093dcd3f21387da4cc4572be588fafae23c155b", - "a9d55260f765261eb9b84e106f665e00b867287a761990d7135963ee0a7d59dca5bb704786be79fc476f91d3f3f89b03984d8068dcf1bb7dfc6637b45450ac04", - false, - false, - false, - }, - // 0 < S < L, small-order A, mixed-order R (non-canonical A, not reduced for hash) - { - "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "39a591f5321bbe07fd5a23dc2f39d025d74526615746727ceefd6e82ae65c06f", - "a9d55260f765261eb9b84e106f665e00b867287a761990d7135963ee0a7d59dca5bb704786be79fc476f91d3f3f89b03984d8068dcf1bb7dfc6637b45450ac04", - false, - false, - false, - }, - } - for v, i in test_vectors_speccheck { - pub_bytes, _ := hex.decode(transmute([]byte)(v.pub_key), context.temp_allocator) - msg_bytes, _ := hex.decode(transmute([]byte)(v.msg), context.temp_allocator) - sig_bytes, _ := hex.decode(transmute([]byte)(v.sig), context.temp_allocator) - - pub_key: ed25519.Public_Key - ok := ed25519.public_key_set_bytes(&pub_key, pub_bytes) - testing.expectf( - t, - ok == v.pub_key_ok, - "speccheck/%d: Expected %s to be a (in)valid public key, got %v", - i, - v.pub_key, - ok, - ) - - // If A is rejected for being non-canonical, skip signature check. - if !v.pub_key_ok { - continue - } - - ok = ed25519.verify(&pub_key, msg_bytes, sig_bytes) - testing.expectf( - t, - ok == v.sig_ok, - "speccheck/%d Expected %v for verify(%s, %s, %s)", - i, - v.sig_ok, - v.pub_key, - v.msg, - v.sig, - ) - - // If the signature is accepted, skip the relaxed signature check. - if v.sig_ok { - continue - } - - ok = ed25519.verify(&pub_key, msg_bytes, sig_bytes, true) - testing.expectf( - t, - ok == v.sig_ok_relaxed, - "speccheck/%d Expected %v for verify(%s, %s, %s, true)", - i, - v.sig_ok_relaxed, - v.pub_key, - v.msg, - v.sig, - ) - } -} - @(private="file") ge_str :: proc(ge: ^ristretto255.Group_Element) -> string { b: [ristretto255.ELEMENT_SIZE]byte @@ -635,4 +329,4 @@ fe_str :: proc(fe: ^field.Tight_Field_Element) -> string { b: [32]byte field.fe_to_bytes(&b, fe) return string(hex.encode(b[:], context.temp_allocator)) -} \ No newline at end of file +} diff --git a/tests/core/crypto/test_core_crypto_exdsa.odin b/tests/core/crypto/test_core_crypto_exdsa.odin new file mode 100644 index 000000000..944f8747a --- /dev/null +++ b/tests/core/crypto/test_core_crypto_exdsa.odin @@ -0,0 +1,568 @@ +package test_core_crypto + +import "core:bytes" +import "core:encoding/hex" +import "core:testing" + +import "core:crypto" +import "core:crypto/ecdsa" +import "core:crypto/ed25519" +import "core:crypto/hash" + +@(test) +test_ecdsa :: proc(t: ^testing.T) { + test_vectors_deterministic := []struct{ + curve: ecdsa.Curve, + hash: hash.Algorithm, + priv_key: string, + pub_key: string, + msg: string, + sig_raw: string, + } { + // Test vectors from RFC 6979 + { + .SECP256R1, + .SHA256, + "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721", + "0460fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb67903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299", + "sample", + "efd48b2aacb6a8fd1140dd9cd45e81d69d2c877b56aaf991c34d0ea84eaf3716f7cb1c942d657c41d436c7a1b6e29f65f3e900dbb9aff4064dc4ab2f843acda8", + }, + { + .SECP256R1, + .SHA384, + "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721", + "0460fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb67903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299", + "sample", + "0eafea039b20e9b42309fb1d89e213057cbf973dc0cfc8f129edddc800ef77194861f0491e6998b9455193e34e7b0d284ddd7149a74b95b9261f13abde940954", + }, + { + .SECP256R1, + .SHA512, + "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721", + "0460fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb67903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299", + "sample", + "8496a60b5e9b47c825488827e0495b0e3fa109ec4568fd3f8d1097678eb97f002362ab1adbe2b8adf9cb9edab740ea6049c028114f2460f96554f61fae3302fe", + }, + { + .SECP256R1, + .SHA256, + "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721", + "0460fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb67903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299", + "test", + "f1abb023518351cd71d881567b1ea663ed3efcf6c5132b354f28d3b0b7d38367019f4113742a2b14bd25926b49c649155f267e60d3814b4c0cc84250e46f0083", + }, + { + .SECP256R1, + .SHA384, + "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721", + "0460fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb67903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299", + "test", + "83910e8b48bb0c74244ebdf7f07a1c5413d61472bd941ef3920e623fbccebeb68ddbec54cf8cd5874883841d712142a56a8d0f218f5003cb0296b6b509619f2c", + }, + { + .SECP256R1, + .SHA512, + "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721", + "0460fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb67903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299", + "test", + "461d93f31b6540894788fd206c07cfa0cc35f46fa3c91816fff1040ad1581a0439af9f15de0db8d97e72719c74820d304ce5226e32dedae67519e840d1194e55", + }, + { + .SECP384R1, + .SHA384, + "6b9d3dad2e1b8c1c05b19875b6659f4de23c3b667bf297ba9aa47740787137d896d5724e4c70a825f872c9ea60d2edf5", + "04ec3a4e415b4e19a4568618029f427fa5da9a8bc4ae92e02e06aae5286b300c64def8f0ea9055866064a254515480bc138015d9b72d7d57244ea8ef9ac0c621896708a59367f9dfb9f54ca84b3f1c9db1288b231c3ae0d4fe7344fd2533264720", + "sample", + "94edbb92a5ecb8aad4736e56c691916b3f88140666ce9fa73d64c4ea95ad133c81a648152e44acf96e36dd1e80fabe4699ef4aeb15f178cea1fe40db2603138f130e740a19624526203b6351d0a3a94fa329c145786e679e7b82c71a38628ac8", + }, + { + .SECP384R1, + .SHA512, + "6b9d3dad2e1b8c1c05b19875b6659f4de23c3b667bf297ba9aa47740787137d896d5724e4c70a825f872c9ea60d2edf5", + "04ec3a4e415b4e19a4568618029f427fa5da9a8bc4ae92e02e06aae5286b300c64def8f0ea9055866064a254515480bc138015d9b72d7d57244ea8ef9ac0c621896708a59367f9dfb9f54ca84b3f1c9db1288b231c3ae0d4fe7344fd2533264720", + "sample", + "ed0959d5880ab2d869ae7f6c2915c6d60f96507f9cb3e047c0046861da4a799cfe30f35cc900056d7c99cd7882433709512c8cceee3890a84058ce1e22dbc2198f42323ce8aca9135329f03c068e5112dc7cc3ef3446defceb01a45c2667fdd5", + }, + { + .SECP384R1, + .SHA384, + "6b9d3dad2e1b8c1c05b19875b6659f4de23c3b667bf297ba9aa47740787137d896d5724e4c70a825f872c9ea60d2edf5", + "04ec3a4e415b4e19a4568618029f427fa5da9a8bc4ae92e02e06aae5286b300c64def8f0ea9055866064a254515480bc138015d9b72d7d57244ea8ef9ac0c621896708a59367f9dfb9f54ca84b3f1c9db1288b231c3ae0d4fe7344fd2533264720", + "test", + "8203b63d3c853e8d77227fb377bcf7b7b772e97892a80f36ab775d509d7a5feb0542a7f0812998da8f1dd3ca3cf023dbddd0760448d42d8a43af45af836fce4de8be06b485e9b61b827c2f13173923e06a739f040649a667bf3b828246baa5a5", + }, + { + .SECP384R1, + .SHA512, + "6b9d3dad2e1b8c1c05b19875b6659f4de23c3b667bf297ba9aa47740787137d896d5724e4c70a825f872c9ea60d2edf5", + "04ec3a4e415b4e19a4568618029f427fa5da9a8bc4ae92e02e06aae5286b300c64def8f0ea9055866064a254515480bc138015d9b72d7d57244ea8ef9ac0c621896708a59367f9dfb9f54ca84b3f1c9db1288b231c3ae0d4fe7344fd2533264720", + "test", + "a0d5d090c9980faf3c2ce57b7ae951d31977dd11c775d314af55f76c676447d06fb6495cd21b4b6e340fc236584fb277976984e59b4c77b0e8e4460dca3d9f20e07b9bb1f63beefaf576f6b2e8b224634a2092cd3792e0159ad9cee37659c736", + }, + // Special case that exercises the rejection sampling. + // https://github.com/C2SP/CCTV/tree/main/RFC6979 + { + .SECP256R1, + .SHA256, + "c9afa9d845ba75166b5c215767b1d6934e50c3db36e89b127b8a622b120f6721", + "0460fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb67903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299", + "wv[vnX", + "efd9073b652e76da1b5a019c0e4a2e3fa529b035a6abb91ef67f0ed7a1f212343db4706c9d9f4a4fe13bb5e08ef0fab53a57dbab2061c83a35fa411c68d2ba33", + }, + } + for v, _ in test_vectors_deterministic { + priv_bytes, _ := hex.decode(transmute([]byte)(v.priv_key), context.temp_allocator) + pub_bytes, _ := hex.decode(transmute([]byte)(v.pub_key), context.temp_allocator) + msg_bytes := bytes.clone(transmute([]byte)(v.msg), context.temp_allocator) + sig_bytes, _ := hex.decode(transmute([]byte)(v.sig_raw), context.temp_allocator) + + priv_key: ecdsa.Private_Key + ok := ecdsa.private_key_set_bytes(&priv_key, v.curve, priv_bytes) + testing.expectf( + t, + ok, + "Expected %s to be a valid %v private key", + v.priv_key, + v.curve, + ) + + priv_key_bytes := make([]byte, ecdsa.PRIVATE_KEY_SIZES[v.curve], context.temp_allocator) + ecdsa.private_key_bytes(&priv_key, priv_key_bytes) + priv_s := string(hex.encode(priv_key_bytes, context.temp_allocator)) + testing.expectf( + t, + priv_s == v.priv_key, + "Expected private key %s round-trip, got %s", + v.priv_key, + priv_s, + ) + + pub_key: ecdsa.Public_Key + ok = ecdsa.public_key_set_bytes(&pub_key, v.curve, pub_bytes) + testing.expectf( + t, + ok, + "Expected %s to be a valid %s public key", + v.pub_key, + v.curve, + ) + + pub_key_bytes := make([]byte, ecdsa.PUBLIC_KEY_SIZES[v.curve], context.temp_allocator) + ecdsa.public_key_bytes(&pub_key, pub_key_bytes) + pub_s := string(hex.encode(pub_key_bytes, context.temp_allocator)) + testing.expectf( + t, + pub_s == v.pub_key, + "Expected public key %s round-trip, got %s", + v.pub_key, + pub_s, + ) + + priv_pub_key: ecdsa.Public_Key + ecdsa.public_key_set_priv(&priv_pub_key, &priv_key) + ok = ecdsa.public_key_equal(&pub_key, &priv_pub_key) + testing.expectf( + t, + ok, + "Expected %v to be %s's public key", + &priv_pub_key, + v.priv_key, + ) + + ok = ecdsa.verify_raw(&pub_key, v.hash, msg_bytes, sig_bytes) + testing.expectf( + t, + ok, + "Expected true for verify(%s, %v, %s, %s)", + v.pub_key, + v.hash, + v.msg, + v.sig_raw, + ) + + // Signatures are deterministic for these test cases. + sig := make([]byte, ecdsa.RAW_SIGNATURE_SIZES[v.curve], context.temp_allocator) + ok = ecdsa.sign_raw(&priv_key, v.hash, msg_bytes, sig, true) + x := string(hex.encode(sig[:], context.temp_allocator)) + testing.expectf( + t, + ok && x == v.sig_raw, + "Expected %s for sign(%s, %v, %s), got %s", + v.sig_raw, + v.priv_key, + v.hash, + v.msg, + x, + ) + + // But when possible, we also add entropy by default. + when crypto.HAS_RAND_BYTES { + ok = ecdsa.sign_raw(&priv_key, v.hash, msg_bytes, sig) + x = string(hex.encode(sig[:], context.temp_allocator)) + testing.expectf( + t, + ok && x != v.sig_raw, + "Expected not %s for sign(%s, %v, %s), got %s", + v.sig_raw, + v.priv_key, + v.hash, + v.msg, + x, + ) + } + + // Corrupt the message and make sure verification fails. + msg_bytes[0] ~= 0x69 + ok = ecdsa.verify_raw(&pub_key, v.hash, msg_bytes, sig_bytes) + testing.expectf( + t, + ok == false, + "Expected false for verify(%s, %v %s (corrupted), %s)", + v.pub_key, + v.hash, + v.msg, + v.sig_raw, + ) + } + + // ASN.1 tests requires entorpy. + when crypto.HAS_RAND_BYTES == false { + return + } + msg_str : string : "Feed the Fire. Let the Last Cinders Burn." + for _ in 0 ..< 1000 { + msg := transmute([]byte)(msg_str) + + priv_key: ecdsa.Private_Key + ok := ecdsa.private_key_generate(&priv_key, .SECP256R1) + testing.expectf(t, ok, "Failed to generate private key") + + sig: []byte + sig, ok = ecdsa.sign_asn1(&priv_key, .SHA256, msg, context.temp_allocator) + testing.expectf( + t, + ok && len(sig) > 0, + "Failed for sign(%v, secp256r1/SHA256, %s)", + priv_key, + msg, + ) + + pub_key := &priv_key._pub_key + ok = ecdsa.verify_asn1(pub_key, .SHA256, msg, sig) + testing.expectf( + t, + ok, + "Expected true for verify(%v, SHA256, %s, %x)", + pub_key, + msg, + sig, + ) + } +} + +@(test) +test_ed25519 :: proc(t: ^testing.T) { + test_vectors_rfc := []struct { + priv_key: string, + pub_key: string, + msg: string, + sig: string, + } { + // Test vectors from RFC 8032 + { + "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", + "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "", + "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b", + }, + { + "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb", + "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", + "72", + "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00", + }, + { + "c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7", + "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025", + "af82", + "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a", + }, + // TEST 1024 omitted for brevity, because all that does is add more to SHA-512 + { + "833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42", + "ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf", + "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f", + "dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b58909351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704", + }, + } + for v, _ in test_vectors_rfc { + priv_bytes, _ := hex.decode(transmute([]byte)(v.priv_key), context.temp_allocator) + pub_bytes, _ := hex.decode(transmute([]byte)(v.pub_key), context.temp_allocator) + msg_bytes, _ := hex.decode(transmute([]byte)(v.msg), context.temp_allocator) + sig_bytes, _ := hex.decode(transmute([]byte)(v.sig), context.temp_allocator) + + priv_key: ed25519.Private_Key + ok := ed25519.private_key_set_bytes(&priv_key, priv_bytes) + testing.expectf( + t, + ok, + "Expected %s to be a valid private key", + v.priv_key, + ) + + key_bytes: [32]byte + ed25519.private_key_bytes(&priv_key, key_bytes[:]) + priv_s := string(hex.encode(key_bytes[:], context.temp_allocator)) + testing.expectf( + t, + priv_s == v.priv_key, + "Expected private key %s round-trip, got %s", + v.priv_key, + priv_s, + ) + + pub_key: ed25519.Public_Key + ok = ed25519.public_key_set_bytes(&pub_key, pub_bytes) + testing.expectf( + t, + ok, + "Expected %s to be a valid public key (priv->pub: %s)", + v.pub_key, + ) + + ed25519.public_key_bytes(&pub_key, key_bytes[:]) + pub_s := string(hex.encode(priv_key._pub_key._b[:], context.temp_allocator)) + testing.expectf( + t, + pub_s == v.pub_key, + "Expected public key %s round-trip, got %s", + v.pub_key, + pub_s, + ) + + sig: [ed25519.SIGNATURE_SIZE]byte + ed25519.sign(&priv_key, msg_bytes, sig[:]) + x := string(hex.encode(sig[:], context.temp_allocator)) + testing.expectf( + t, + x == v.sig, + "Expected %s for sign(%s, %s), got %s", + v.sig, + v.priv_key, + v.msg, + x, + ) + + ok = ed25519.verify(&pub_key, msg_bytes, sig_bytes) + testing.expectf( + t, + ok, + "Expected true for verify(%s, %s, %s)", + v.pub_key, + v.msg, + v.sig, + ) + + ok = ed25519.verify(&priv_key._pub_key, msg_bytes, sig_bytes) + testing.expectf( + t, + ok, + "Expected true for verify(pub(%s), %s %s)", + v.priv_key, + v.msg, + v.sig, + ) + + // Corrupt the message and make sure verification fails. + switch len(msg_bytes) { + case 0: + tmp_msg := []byte{69} + msg_bytes = tmp_msg[:] + case: + msg_bytes[0] = msg_bytes[0] ~ 69 + } + ok = ed25519.verify(&pub_key, msg_bytes, sig_bytes) + testing.expectf( + t, + ok == false, + "Expected false for verify(%s, %s (corrupted), %s)", + v.pub_key, + v.msg, + v.sig, + ) + } + + // Test cases from "Taming the many EdDSAs", which aim to exercise + // all of the ed25519 edge cases/implementation differences. + // + // - https://eprint.iacr.org/2020/1244 + // - https://github.com/novifinancial/ed25519-speccheck + test_vectors_speccheck := []struct { + pub_key: string, + msg: string, + sig: string, + pub_key_ok: bool, + sig_ok: bool, + sig_ok_relaxed: bool, // Ok if the small-order A check is relaxed. + } { + // S = 0, small-order A, small-order R + { + "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "8c93255d71dcab10e8f379c26200f3c7bd5f09d9bc3068d3ef4edeb4853022b6", + "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a0000000000000000000000000000000000000000000000000000000000000000", + true, + false, + true, + }, + // 0 < S < L, small-order A, mixed-order R + { + "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", + "9bd9f44f4dcc75bd531b56b2cd280b0bb38fc1cd6d1230e14861d861de092e79", + "f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43a5bb704786be79fc476f91d3f3f89b03984d8068dcf1bb7dfc6637b45450ac04", + true, + false, + true, + }, + // 0 < S < L, mixed-order A, small-order R + { + "f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43", + "aebf3f2601a0c8c5d39cc7d8911642f740b78168218da8471772b35f9d35b9ab", + "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa8c4bd45aecaca5b24fb97bc10ac27ac8751a7dfe1baff8b953ec9f5833ca260e", + true, + true, + true, + }, + // 0 < S < L, mixed-order A, mixed-order R + { + "cdb267ce40c5cd45306fa5d2f29731459387dbf9eb933b7bd5aed9a765b88d4d", + "9bd9f44f4dcc75bd531b56b2cd280b0bb38fc1cd6d1230e14861d861de092e79", + "9046a64750444938de19f227bb80485e92b83fdb4b6506c160484c016cc1852f87909e14428a7a1d62e9f22f3d3ad7802db02eb2e688b6c52fcd6648a98bd009", + true, + true, + true, + }, + // 0 < S < L, mixed-order A, mixed-order R + { + "cdb267ce40c5cd45306fa5d2f29731459387dbf9eb933b7bd5aed9a765b88d4d", + "e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec4011eaccd55b53f56c", + "160a1cb0dc9c0258cd0a7d23e94d8fa878bcb1925f2c64246b2dee1796bed5125ec6bc982a269b723e0668e540911a9a6a58921d6925e434ab10aa7940551a09", + true, + true, // cofactored-only + true, + }, + // 0 < S < L, mixed-order A, L-order R + { + "cdb267ce40c5cd45306fa5d2f29731459387dbf9eb933b7bd5aed9a765b88d4d", + "e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec4011eaccd55b53f56c", + "21122a84e0b5fca4052f5b1235c80a537878b38f3142356b2c2384ebad4668b7e40bc836dac0f71076f9abe3a53f9c03c1ceeeddb658d0030494ace586687405", + true, + true, // cofactored only, (fail if 8h is pre-reduced) + true, + }, + // S > L, L-order A, L-order R + { + "442aad9f089ad9e14647b1ef9099a1ff4798d78589e66f28eca69c11f582a623", + "85e241a07d148b41e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec40", + "e96f66be976d82e60150baecff9906684aebb1ef181f67a7189ac78ea23b6c0e547f7690a0e2ddcd04d87dbc3490dc19b3b3052f7ff0538cb68afb369ba3a514", + true, + false, + false, + }, + // S >> L, L-order A, L-order R + { + "442aad9f089ad9e14647b1ef9099a1ff4798d78589e66f28eca69c11f582a623", + "85e241a07d148b41e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec40", + "8ce5b96c8f26d0ab6c47958c9e68b937104cd36e13c33566acd2fe8d38aa19427e71f98a473474f2f13f06f97c20d58cc3f54b8bd0d272f42b695dd7e89a8c22", + true, + false, + false, + }, + // 0 < S < L, mixed-order A, small-order R (non-canonical R, reduced for hash) + { + "f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43", + "9bedc267423725d473888631ebf45988bad3db83851ee85c85e241a07d148b41", + "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03be9678ac102edcd92b0210bb34d7428d12ffc5df5f37e359941266a4e35f0f", + true, + false, + false, + }, + // 0 < S < L, mixed-order A, small-order R (non-canonical R, not reduced for hash) + { + "f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43", + "9bedc267423725d473888631ebf45988bad3db83851ee85c85e241a07d148b41", + "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffca8c5b64cd208982aa38d4936621a4775aa233aa0505711d8fdcfdaa943d4908", + true, + false, + false, + }, + // 0 < S < L, small-order A, mixed-order R (non-canonical A, reduced for hash) + { + "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "e96b7021eb39c1a163b6da4e3093dcd3f21387da4cc4572be588fafae23c155b", + "a9d55260f765261eb9b84e106f665e00b867287a761990d7135963ee0a7d59dca5bb704786be79fc476f91d3f3f89b03984d8068dcf1bb7dfc6637b45450ac04", + false, + false, + false, + }, + // 0 < S < L, small-order A, mixed-order R (non-canonical A, not reduced for hash) + { + "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "39a591f5321bbe07fd5a23dc2f39d025d74526615746727ceefd6e82ae65c06f", + "a9d55260f765261eb9b84e106f665e00b867287a761990d7135963ee0a7d59dca5bb704786be79fc476f91d3f3f89b03984d8068dcf1bb7dfc6637b45450ac04", + false, + false, + false, + }, + } + for v, i in test_vectors_speccheck { + pub_bytes, _ := hex.decode(transmute([]byte)(v.pub_key), context.temp_allocator) + msg_bytes, _ := hex.decode(transmute([]byte)(v.msg), context.temp_allocator) + sig_bytes, _ := hex.decode(transmute([]byte)(v.sig), context.temp_allocator) + + pub_key: ed25519.Public_Key + ok := ed25519.public_key_set_bytes(&pub_key, pub_bytes) + testing.expectf( + t, + ok == v.pub_key_ok, + "speccheck/%d: Expected %s to be a (in)valid public key, got %v", + i, + v.pub_key, + ok, + ) + + // If A is rejected for being non-canonical, skip signature check. + if !v.pub_key_ok { + continue + } + + ok = ed25519.verify(&pub_key, msg_bytes, sig_bytes) + testing.expectf( + t, + ok == v.sig_ok, + "speccheck/%d Expected %v for verify(%s, %s, %s)", + i, + v.sig_ok, + v.pub_key, + v.msg, + v.sig, + ) + + // If the signature is accepted, skip the relaxed signature check. + if v.sig_ok { + continue + } + + ok = ed25519.verify(&pub_key, msg_bytes, sig_bytes, true) + testing.expectf( + t, + ok == v.sig_ok_relaxed, + "speccheck/%d Expected %v for verify(%s, %s, %s, true)", + i, + v.sig_ok_relaxed, + v.pub_key, + v.msg, + v.sig, + ) + } +} diff --git a/tests/core/crypto/wycheproof/main.odin b/tests/core/crypto/wycheproof/main.odin index c859bc8f6..a75a6cd54 100644 --- a/tests/core/crypto/wycheproof/main.odin +++ b/tests/core/crypto/wycheproof/main.odin @@ -15,7 +15,9 @@ import "core:crypto/aes" import "core:crypto/chacha20" import "core:crypto/chacha20poly1305" import "core:crypto/ecdh" +import "core:crypto/ecdsa" import "core:crypto/ed25519" +import "core:crypto/hash" import "core:crypto/hkdf" import "core:crypto/hmac" import "core:crypto/kmac" @@ -72,6 +74,9 @@ import "core:crypto/deoxysii" // - crypto/_weierstrass // - ecdh_secp256r1_ecpoint_test.json // - ecdh_secp384r1_ecpoint_test.json +// - ecdsa_secp256r1_sha256_test.json +// - ecdsa_secp256r1_sha512_test.json +// - ecdsa_secp384r1_sha384_test.json // // Not covered (not in wycheproof): // - crypto/blake2b @@ -653,12 +658,12 @@ test_eddsa_ed25519 :: proc(t: ^testing.T) { verify_ok := ed25519.verify(&pk, msg, sig) result_ok := result_check(test_vector.result, verify_ok) testing.expectf( - t, - result_ok, - "eddsa/ed25519/%d: verify failed: expected %s actual %v", - test_vector.tc_id, - test_vector.result, - verify_ok, + t, + result_ok, + "eddsa/ed25519/%d: verify failed: expected %s actual %v", + test_vector.tc_id, + test_vector.result, + verify_ok, ) if !result_ok { num_failed += 1 @@ -680,6 +685,134 @@ test_eddsa_ed25519 :: proc(t: ^testing.T) { ) } +@(test) +test_ecdsa :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + log.debug("ecdsa: starting") + + files := []string { + "ecdsa_secp256r1_sha256_test.json", + "ecdsa_secp256r1_sha512_test.json", + "ecdsa_secp384r1_sha384_test.json", + } + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Ecdsa_Test_Group) + load_ok := load(&test_vectors, fn) + testing.expectf(t, load_ok, "Unable to load {}", f) + if !load_ok { + continue + } + + testing.expectf(t, test_ecdsa_impl(t, &test_vectors), "ecdsa failed") + } +} + +test_ecdsa_impl :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Ecdsa_Test_Group)) -> bool { + curve_str := test_vectors.test_groups[0].public_key.curve + hash_str := test_vectors.test_groups[0].sha + + curve_alg: ecdsa.Curve + switch curve_str { + case "secp256r1": + curve_alg = .SECP256R1 + case "secp384r1": + curve_alg = .SECP384R1 + case: + log.errorf("ecdsa: unsupported curve: %s", curve_str) + } + + hash_alg: hash.Algorithm + switch hash_str { + case "SHA-256": + hash_alg = .SHA256 + case "SHA-384": + hash_alg = .SHA384 + case "SHA-512": + hash_alg = .SHA512 + case: + log.errorf("ecdsa: unsupported hash: %s", hash_str) + } + + log.debugf("ecdsa/%s/%s: starting", curve_str, hash_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group, i in test_vectors.test_groups { + pk_bytes := hexbytes_decode(test_group.public_key.uncompressed) + + pk: ecdsa.Public_Key + pk_ok := ecdsa.public_key_set_bytes(&pk, curve_alg, pk_bytes) + testing.expectf(t, pk_ok, "ecdsa/%s/%s/%d: invalid public key: %s", curve_str, hash_str, i, test_group.public_key.uncompressed) + if !pk_ok { + num_failed += len(test_group.tests) + continue + } + + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "ecda/%s/%s/%d: %s: %+v", + curve_str, + hash_str, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("ecdsa/%s/%s/%d: %+v", curve_str, hash_str, test_vector.tc_id, test_vector.flags) + } + + msg := hexbytes_decode(test_vector.msg) + sig := hexbytes_decode(test_vector.sig) + + verify_ok := ecdsa.verify_asn1(&pk, hash_alg, msg, sig) + result_ok := result_check(test_vector.result, verify_ok) + testing.expectf( + t, + result_ok, + "ecdsa/%s/%s/%d: verify failed: expected %s actual %v", + curve_str, + hash_str, + test_vector.tc_id, + test_vector.result, + verify_ok, + ) + if !result_ok { + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "ecdsa/%s/%s: ran %d, passed %d, failed %d, skipped %d", + curve_str, + hash_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + @(test) test_hkdf :: proc(t: ^testing.T) { arena: mem.Arena diff --git a/tests/core/crypto/wycheproof/schemas.odin b/tests/core/crypto/wycheproof/schemas.odin index 754ca06b2..a07186dcc 100644 --- a/tests/core/crypto/wycheproof/schemas.odin +++ b/tests/core/crypto/wycheproof/schemas.odin @@ -173,6 +173,24 @@ Eddsa_Jwk :: struct { x: string `json:"x"`, } +Ecdsa_Key :: struct { + type: string `json:"type"`, + curve: string `json:"curve"`, + key_size: int `json:"keySize"`, + uncompressed: Hex_Bytes `json:"uncompressed"`, + wx: Hex_Bytes `json:"wx"`, + wy: Hex_Bytes `json:"wy"`, +} + +Ecdsa_Test_Group :: struct { + public_key: Ecdsa_Key `json:"publicKey"`, + public_key_der: Hex_Bytes `json:"publicKeyDer"`, + public_key_pem: string `json:"publicKeyPem"`, + type: string `json:"type"`, + sha: string `json:"sha"`, + tests: []Dsa_Test_Vector `json:"tests"`, +} + Dsa_Test_Vector :: struct { tc_id: int `json:"tcId"`, comment: string `json:"comment"`, From 4ef6300eb35c35f6b4e24f15ebe09b722ea2e329 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Fri, 20 Feb 2026 04:10:26 +0900 Subject: [PATCH 521/766] core/crypto/ed25519: Add `private_key_generate` --- core/crypto/ed25519/ed25519.odin | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/crypto/ed25519/ed25519.odin b/core/crypto/ed25519/ed25519.odin index 90875c207..817c8d34b 100644 --- a/core/crypto/ed25519/ed25519.odin +++ b/core/crypto/ed25519/ed25519.odin @@ -47,6 +47,25 @@ Public_Key :: struct { _is_initialized: bool, } +// private_key_generate uses the system entropy source to generate a new +// Private_Key. This will only fail iff the system entropy source is +// missing or broken. +private_key_generate :: proc(priv_key: ^Private_Key) -> bool { + private_key_clear(priv_key) + + if !crypto.HAS_RAND_BYTES { + return false + } + + b: [PRIVATE_KEY_SIZE]byte + defer crypto.zero_explicit(&b, size_of(b)) + + crypto.rand_bytes(b[:]) + private_key_set_bytes(priv_key, b[:]) + + return true +} + // private_key_set_bytes decodes a byte-encoded private key, and returns // true iff the operation was successful. private_key_set_bytes :: proc(priv_key: ^Private_Key, b: []byte) -> bool { From a0692cd40bf147dc2193f33ae993f4211d6dfe77 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 19 Feb 2026 21:43:01 +0100 Subject: [PATCH 522/766] improve llvm version picking In arch, the `llvm` package points to the latest version of LLVM, this installs `llvm-config` but not a `llvm-config-21` link. This meant that we would check all our lower supported versions before falling back to the default `llvm-config`. This change makes sure that if `llvm-config` exists we check against the major version (by using `llvm-config --version`) and make sure we have the highest llvm version we support. --- build_odin.sh | 56 ++++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/build_odin.sh b/build_odin.sh index b9545a6b5..64bb4c799 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -26,36 +26,42 @@ error() { exit 1 } +SUPPORTED_LLVM_VERSIONS="21 20 19 18 17 14" + # Brew advises people not to add llvm to their $PATH, so try and use brew to find it. if [ -z "$LLVM_CONFIG" ] && [ -n "$(command -v brew)" ]; then - if [ -n "$(command -v $(brew --prefix llvm@21)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@21)/bin/llvm-config" - elif [ -n "$(command -v $(brew --prefix llvm@20)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@20)/bin/llvm-config" - elif [ -n "$(command -v $(brew --prefix llvm@19)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@19)/bin/llvm-config" - elif [ -n "$(command -v $(brew --prefix llvm@18)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@18)/bin/llvm-config" - elif [ -n "$(command -v $(brew --prefix llvm@17)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@17)/bin/llvm-config" - elif [ -n "$(command -v $(brew --prefix llvm@14)/bin/llvm-config)" ]; then LLVM_CONFIG="$(brew --prefix llvm@14)/bin/llvm-config" - fi + for V in $SUPPORTED_LLVM_VERSIONS; do + if [ -n "$(command -v $(brew --prefix llvm@$V)/bin/llvm-config)" ]; then + LLVM_CONFIG="$(brew --prefix llvm@$V)/bin/llvm-config" + break + fi + done fi if [ -z "$LLVM_CONFIG" ]; then - # darwin, linux, openbsd - if [ -n "$(command -v llvm-config-21)" ]; then LLVM_CONFIG="llvm-config-21" - elif [ -n "$(command -v llvm-config-20)" ]; then LLVM_CONFIG="llvm-config-20" - elif [ -n "$(command -v llvm-config-19)" ]; then LLVM_CONFIG="llvm-config-19" - elif [ -n "$(command -v llvm-config-18)" ]; then LLVM_CONFIG="llvm-config-18" - elif [ -n "$(command -v llvm-config-17)" ]; then LLVM_CONFIG="llvm-config-17" - elif [ -n "$(command -v llvm-config-14)" ]; then LLVM_CONFIG="llvm-config-14" - # freebsd - elif [ -n "$(command -v llvm-config21)" ]; then LLVM_CONFIG="llvm-config21" - elif [ -n "$(command -v llvm-config20)" ]; then LLVM_CONFIG="llvm-config20" - elif [ -n "$(command -v llvm-config19)" ]; then LLVM_CONFIG="llvm-config19" - elif [ -n "$(command -v llvm-config18)" ]; then LLVM_CONFIG="llvm-config18" - elif [ -n "$(command -v llvm-config17)" ]; then LLVM_CONFIG="llvm-config17" - elif [ -n "$(command -v llvm-config14)" ]; then LLVM_CONFIG="llvm-config14" - # fallback - elif [ -n "$(command -v llvm-config)" ]; then LLVM_CONFIG="llvm-config" - else - error "No llvm-config command found. Set LLVM_CONFIG to proceed." + DEFAULT_VERSION="" + + if [ -n "$(command -v llvm-config)" ]; then + DEFAULT_VERSION=$(llvm-config --version | awk -F. '{print $1}') + fi + + for V in $SUPPORTED_LLVM_VERSIONS; do + if [ "$DEFAULT_VERSION" = "$V" ]; then + LLVM_CONFIG="llvm-config" + break + # darwin, linux, openbsd + elif [ -n "$(command -v "llvm-config-$V")" ]; then + LLVM_CONFIG="llvm-config-$V" + break + # freebsd + elif [ -n "$(command -v "llvm-config$V")" ]; then + LLVM_CONFIG="llvm-config$V" + break + fi + done + + if [ -z "$LLVM_CONFIG" ]; then + error "No supported llvm-config command found. Set LLVM_CONFIG to proceed." fi fi From 91d5b5539ca5f3b078462ff344c4929b432efdea Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 19 Feb 2026 22:03:01 +0100 Subject: [PATCH 523/766] Make download_assets.py less spammy. --- tests/core/download_assets.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/core/download_assets.py b/tests/core/download_assets.py index c280bb9c2..f060a0775 100644 --- a/tests/core/download_assets.py +++ b/tests/core/download_assets.py @@ -636,7 +636,7 @@ def try_download_file(url, out_file): print("Could not download", url) return 1 -def try_download_and_unpack_zip(suite): +def try_download_and_unpack_zip(suite, debug): url = ASSETS_BASE_URL.format(suite, "{}.zip".format(suite)) out_file = DOWNLOAD_BASE_PATH.format(suite) + "/{}.zip".format(suite) @@ -670,13 +670,18 @@ def try_download_and_unpack_zip(suite): print("❌ Expected {}, got {} for {}".format(HMAC_DIGESTS[file.filename], hmac_digest, file.filename)) return 4 else: - print("✅ {} *{}".format(hmac_digest, file.filename)) + if debug: + print("✅ {} *{}".format(hmac_digest, file.filename)) #except: # print("Could not extract ZIP file") # return 2 def main(): + debug = False + if len(sys.argv) >= 3 and sys.argv[2] == "debug": + debug = True + for suite in TEST_SUITES: print("Downloading {} assets".format(suite)) @@ -688,7 +693,7 @@ def main(): pass # Try downloading and unpacking the assets - r = try_download_and_unpack_zip(suite) + r = try_download_and_unpack_zip(suite, debug) if r is not None: return r From be8c3a82b0716bd001b967a096d48cf82e2c0be5 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 20 Feb 2026 14:16:05 +0100 Subject: [PATCH 524/766] Tweak asset downloader output --- tests/core/download_assets.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/tests/core/download_assets.py b/tests/core/download_assets.py index f060a0775..f51d50ea4 100644 --- a/tests/core/download_assets.py +++ b/tests/core/download_assets.py @@ -11,7 +11,6 @@ import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') TEST_SUITES = ['PNG', 'XML', 'BMP', 'JPG', 'Wycheproof'] -DOWNLOAD_BASE_PATH = sys.argv[1] + "/{}" ASSETS_BASE_URL = "https://raw.githubusercontent.com/odin-lang/test-assets/master/{}/{}" HMAC_KEY = "https://odin-lang.org" HMAC_HASH = hashlib.sha3_512 @@ -636,29 +635,26 @@ def try_download_file(url, out_file): print("Could not download", url) return 1 -def try_download_and_unpack_zip(suite, debug): +def try_download_and_unpack_zip(base_path, suite, debug): url = ASSETS_BASE_URL.format(suite, "{}.zip".format(suite)) - out_file = DOWNLOAD_BASE_PATH.format(suite) + "/{}.zip".format(suite) + out_file = base_path + "/{}.zip".format(suite) - print("\tDownloading {} to {}".format(url, out_file)) + print("Downloading {} to {}".format(url, out_file)) - if try_download_file(url, out_file) is not None: - print("Could not download ZIP file") - return 1 + try_download_file(url, out_file) # Try opening the ZIP file and extracting the test images #try: with zipfile.ZipFile(out_file) as z: - print("\tUnpacking and verifying using HMAC(\"{}\", data, {}):\n".format(HMAC_KEY, HMAC_HASH.__name__)) + print("Unpacking and verifying using HMAC(\"{}\", data, {}):\n".format(HMAC_KEY, HMAC_HASH.__name__)) for file in z.filelist: if file.filename not in HMAC_DIGESTS: print("Missing digest for {}".format(file.filename)) return 3 - extract_path = DOWNLOAD_BASE_PATH.format(suite) - z.extract(file, extract_path) + z.extract(file, base_path) - file_path = "{}/{}".format(extract_path, file.filename) + file_path = "{}/{}".format(base_path, file.filename) with open(file_path, "rb") as f: file_data = f.read() @@ -673,32 +669,37 @@ def try_download_and_unpack_zip(suite, debug): if debug: print("✅ {} *{}".format(hmac_digest, file.filename)) + if debug: + print("\n") + #except: # print("Could not extract ZIP file") # return 2 def main(): + if len(sys.argv) < 2: + print("Usage: {} [debug]".format(sys.argv[0])) + return 1 + debug = False if len(sys.argv) >= 3 and sys.argv[2] == "debug": debug = True for suite in TEST_SUITES: - print("Downloading {} assets".format(suite)) - + base_path = sys.argv[1] + "/{}".format(suite) # Make assets path try: - path = DOWNLOAD_BASE_PATH.format(suite) - os.makedirs(path) + os.makedirs(base_path) except FileExistsError: pass # Try downloading and unpacking the assets - r = try_download_and_unpack_zip(suite, debug) + r = try_download_and_unpack_zip(base_path, suite, debug) if r is not None: return r # We could fall back on downloading the PNG files individually, but it's slow - print("\nDone downloading {} assets.".format(suite)) + print("Done downloading {} assets.\n".format(suite)) return 0 From baaea5c1e6f82f44baa2e9eda6572eaaea2258f0 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Fri, 20 Feb 2026 11:28:50 -0500 Subject: [PATCH 525/766] Reset the xar iterator index to 0 for easy reuse --- core/container/xar/xar.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index 32dcf13d3..08b2b2d32 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -476,6 +476,7 @@ Advance the iterator and returns the next element. */ array_iterate_by_val :: proc(it: ^Array_Iterator($T, $SHIFT)) -> (val: T, idx: int, ok: bool) { if it.idx >= it.xar.len { + it.idx = 0 return } val = array_get(it.xar, it.idx) @@ -497,6 +498,7 @@ Advance the iterator and returns a pointer to the next element. */ array_iterate_by_ptr :: proc(it: ^Array_Iterator($T, $SHIFT)) -> (val: ^T, idx: int, ok: bool) { if it.idx >= it.xar.len { + it.idx = 0 return } val = array_get_ptr(it.xar, it.idx) From 94fa423cacaad6fcdf427474eb68a9211c7b711a Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Fri, 20 Feb 2026 12:06:38 -0500 Subject: [PATCH 526/766] Reset the xar freelist iterators' index to 0 for easy reuse --- core/container/xar/freelist.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/container/xar/freelist.odin b/core/container/xar/freelist.odin index ab2895881..d6bdffe22 100644 --- a/core/container/xar/freelist.odin +++ b/core/container/xar/freelist.odin @@ -136,6 +136,7 @@ freelist_iterate_by_val :: proc(it: ^Freelist_Iterator($T, $SHIFT)) -> (val: T, } it.idx += 1 } + it.idx = 0 return } @@ -150,5 +151,6 @@ freelist_iterate_by_ptr :: proc(it: ^Freelist_Iterator($T, $SHIFT)) -> (val: ^T, } it.idx += 1 } + it.idx = 0 return } From 3299981433f4c15964e22ecaaae8ab1ef2737642 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 20 Feb 2026 19:25:17 +0100 Subject: [PATCH 527/766] core:sys/info: Fix GPU enumeration loop --- core/sys/info/platform_windows.odin | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/core/sys/info/platform_windows.odin b/core/sys/info/platform_windows.odin index c28170919..95584b316 100644 --- a/core/sys/info/platform_windows.odin +++ b/core/sys/info/platform_windows.odin @@ -289,10 +289,10 @@ init_gpu_info :: proc "contextless" () { defer sys.RegCloseKey(gpu_key) gpu: ^GPU - gpu_count := 0 - index := sys.DWORD(0) - gpu_loop: for { + index := sys.DWORD(0) + gpu_count := 0 + gpu_loop: for index < MAX_GPUS { defer index += 1 buf_wstring: [100]u16 @@ -307,13 +307,13 @@ init_gpu_info :: proc "contextless" () { &buf_wstring[0], &buf_len, ); status != i32(sys.ERROR_SUCCESS) { - break + break gpu_loop } utf16.decode_to_utf8(buf_leaf[:], buf_wstring[:]) leaf := string(cstring(&buf_leaf[0])) - // Skip leafs that are not of the form 000x + // Skip leaves that are not of the form 000x if !is_integer(leaf) { continue } @@ -350,11 +350,7 @@ init_gpu_info :: proc "contextless" () { if vram, ok := read_reg_i64(sys.HKEY_LOCAL_MACHINE, key, "HardwareInformation.qwMemorySize"); ok { gpu.total_ram = int(vram) } - gpu_count += 1 - if gpu_count > MAX_GPUS { - break gpu_loop - } } gpus = _gpus[:gpu_count] } From 11d2d3727795bc37f6b36e611f3dfd749d401790 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 20 Feb 2026 19:31:50 +0100 Subject: [PATCH 528/766] Better. --- core/sys/info/platform_windows.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/sys/info/platform_windows.odin b/core/sys/info/platform_windows.odin index 95584b316..393549f8f 100644 --- a/core/sys/info/platform_windows.odin +++ b/core/sys/info/platform_windows.odin @@ -292,7 +292,7 @@ init_gpu_info :: proc "contextless" () { index := sys.DWORD(0) gpu_count := 0 - gpu_loop: for index < MAX_GPUS { + gpu_loop: for gpu_count < MAX_GPUS { defer index += 1 buf_wstring: [100]u16 @@ -350,7 +350,7 @@ init_gpu_info :: proc "contextless" () { if vram, ok := read_reg_i64(sys.HKEY_LOCAL_MACHINE, key, "HardwareInformation.qwMemorySize"); ok { gpu.total_ram = int(vram) } - gpu_count += 1 + gpu_count += 1 // not deferred at the top because it only increments if we get this far. } gpus = _gpus[:gpu_count] } From 98b65f2c2ef9123a59e67fc9f0f94e0bfd20357b Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 21 Feb 2026 01:54:17 +0100 Subject: [PATCH 529/766] Update unicode generator + test --- core/unicode/tools/generate_entity_table.odin | 12 ++++++------ tests/core/encoding/xml/test_core_xml.odin | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/unicode/tools/generate_entity_table.odin b/core/unicode/tools/generate_entity_table.odin index 2fe127caf..69849d6ff 100644 --- a/core/unicode/tools/generate_entity_table.odin +++ b/core/unicode/tools/generate_entity_table.odin @@ -24,16 +24,16 @@ main :: proc() { defer delete(filename) if err_xml != .None { - fmt.eprintfln("Join path error for unicode.xml: %v", err_xml); - os.exit(1); + fmt.eprintfln("Join path error for unicode.xml: %v", err_xml) + os.exit(1) } generated_filename, err_generated := path.join({ODIN_ROOT, "core", "encoding", "entity", "generated.odin"}, context.allocator) defer delete(generated_filename) if err_generated != .None { - fmt.eprintfln("Join path error for generated.odin: %v", err_generated); - os.exit(1); + fmt.eprintfln("Join path error for generated.odin: %v", err_generated) + os.exit(1) } doc, err := xml.load_from_file(filename, OPTIONS, Error_Handler) @@ -245,12 +245,12 @@ TABLE_FILE_PROLOG :: `/* This file is generated from "https://github.com/w3c/xml-entities/blob/gh-pages/unicode.xml". UPDATE: - - Ensure the XML file was downloaded using "tests\core\download_assets.py". + - Ensure the XML file was downloaded using "tests\core\download_assets.py", given the path to the "tests\assets" directory. - Run "core/unicode/tools/generate_entity_table.odin" Odin unicode generated tables: https://github.com/odin-lang/Odin/tree/master/core/encoding/entity - Copyright David Carlisle 1999-2023 + Copyright David Carlisle 1999-2025 Use and distribution of this code are permitted under the terms of the W3C Software Notice and License. diff --git a/tests/core/encoding/xml/test_core_xml.odin b/tests/core/encoding/xml/test_core_xml.odin index 09cca4a63..c03dfe29d 100644 --- a/tests/core/encoding/xml/test_core_xml.odin +++ b/tests/core/encoding/xml/test_core_xml.odin @@ -186,7 +186,7 @@ xml_test_unicode :: proc(t: ^testing.T) { expected_doctype = "", }, err = .None, - crc32 = 0x73070b55, + crc32 = 0x738664b1, }) } From ac114919792961894e5385e71d06390dccf2943d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 21 Feb 2026 01:55:07 +0100 Subject: [PATCH 530/766] Update generated table --- core/encoding/entity/generated.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/encoding/entity/generated.odin b/core/encoding/entity/generated.odin index 0096c8199..97f7aef6d 100644 --- a/core/encoding/entity/generated.odin +++ b/core/encoding/entity/generated.odin @@ -8,12 +8,12 @@ package encoding_unicode_entity This file is generated from "https://github.com/w3c/xml-entities/blob/gh-pages/unicode.xml". UPDATE: - - Ensure the XML file was downloaded using "tests\core\download_assets.py". + - Ensure the XML file was downloaded using "tests\core\download_assets.py", given the path to the "tests\assets" directory. - Run "core/unicode/tools/generate_entity_table.odin" Odin unicode generated tables: https://github.com/odin-lang/Odin/tree/master/core/encoding/entity - Copyright David Carlisle 1999-2023 + Copyright David Carlisle 1999-2025 Use and distribution of this code are permitted under the terms of the W3C Software Notice and License. From 9359cfa39e07c27477255992f95cb6f923c2dc83 Mon Sep 17 00:00:00 2001 From: Alex Davis Date: Sat, 21 Feb 2026 10:15:31 +0000 Subject: [PATCH 531/766] added 2 user32 functions --- core/sys/windows/user32.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index ede920004..615d7a84d 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -76,6 +76,7 @@ foreign user32 { EnumPropsW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW) -> INT --- EnumPropsExW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW, lParam: LPARAM) -> INT --- GetMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT) -> INT --- + GetMessageExtraInfo :: proc() -> LPARAM --- TranslateMessage :: proc(lpMsg: ^MSG) -> BOOL --- DispatchMessageW :: proc(lpMsg: ^MSG) -> LRESULT --- @@ -210,6 +211,7 @@ foreign user32 { EnumDisplayDevicesW :: proc(lpDevice: LPCWSTR, iDevNum: DWORD, lpDisplayDevice: PDISPLAY_DEVICEW, dwFlags: DWORD) -> BOOL --- EnumDisplaySettingsW :: proc(lpszDeviceName: LPCWSTR, iModeNum: DWORD, lpDevMode: ^DEVMODEW) -> BOOL --- + WindowFromPoint :: proc(pt: POINT) -> HWND --- MonitorFromPoint :: proc(pt: POINT, dwFlags: Monitor_From_Flags) -> HMONITOR --- MonitorFromRect :: proc(lprc: LPRECT, dwFlags: Monitor_From_Flags) -> HMONITOR --- MonitorFromWindow :: proc(hwnd: HWND, dwFlags: Monitor_From_Flags) -> HMONITOR --- From 82b39173006a80a0d5c745383d8087c2a6a36ee3 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 21 Feb 2026 14:02:41 +0100 Subject: [PATCH 532/766] Update unicode.xml to 17 --- core/encoding/entity/generated.odin | 2 +- core/unicode/tools/generate_entity_table.odin | 316 +++++++++++------- tests/core/download_assets.py | 2 +- 3 files changed, 204 insertions(+), 116 deletions(-) diff --git a/core/encoding/entity/generated.odin b/core/encoding/entity/generated.odin index 97f7aef6d..fda8e5c2a 100644 --- a/core/encoding/entity/generated.odin +++ b/core/encoding/entity/generated.odin @@ -6,7 +6,7 @@ package encoding_unicode_entity /* This file is generated from "https://github.com/w3c/xml-entities/blob/gh-pages/unicode.xml". - + UPDATE: - Ensure the XML file was downloaded using "tests\core\download_assets.py", given the path to the "tests\assets" directory. - Run "core/unicode/tools/generate_entity_table.odin" diff --git a/core/unicode/tools/generate_entity_table.odin b/core/unicode/tools/generate_entity_table.odin index 69849d6ff..7d53e5497 100644 --- a/core/unicode/tools/generate_entity_table.odin +++ b/core/unicode/tools/generate_entity_table.odin @@ -8,14 +8,53 @@ import "core:strconv" import "core:slice" import "core:fmt" +GENERATED :: `/* + ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ +*/` + +TABLE_FILE_PROLOG :: `/* + This file is generated from "https://github.com/w3c/xml-entities/blob/gh-pages/unicode.xml". + + UPDATE: + - Ensure the XML file was downloaded using "tests\core\download_assets.py", given the path to the "tests\assets" directory. + - Run "core/unicode/tools/generate_entity_table.odin" + + Odin unicode generated tables: https://github.com/odin-lang/Odin/tree/master/core/encoding/entity + + Copyright David Carlisle 1999-2025 + + Use and distribution of this code are permitted under the terms of the + W3C Software Notice and License. + http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html + + + + This file is a collection of information about how to map + Unicode entities to LaTeX, and various SGML/XML entity + sets (ISO and MathML/HTML). A Unicode character may be mapped + to several entities. + + Originally designed by Sebastian Rahtz in conjunction with + Barbara Beeton for the STIX project + + See also: LICENSE_table.md +*/ +` + // Silent error handler for the parser. Error_Handler :: proc(pos: xml.Pos, fmt: string, args: ..any) {} OPTIONS :: xml.Options{ flags = { .Ignore_Unsupported, }, expected_doctype = "unicode", } Entity :: struct { - name: string, codepoints: [2]rune, + name: string, // &name; + description: string, +} + +Character :: struct { + codepoint: rune, + category: string, description: string, } @@ -28,14 +67,6 @@ main :: proc() { os.exit(1) } - generated_filename, err_generated := path.join({ODIN_ROOT, "core", "encoding", "entity", "generated.odin"}, context.allocator) - defer delete(generated_filename) - - if err_generated != .None { - fmt.eprintfln("Join path error for generated.odin: %v", err_generated) - os.exit(1) - } - doc, err := xml.load_from_file(filename, OPTIONS, Error_Handler) defer xml.destroy(doc) @@ -49,10 +80,6 @@ main :: proc() { fmt.printfln("%q loaded and parsed.", filename) - generated_buf: strings.Builder - defer strings.builder_destroy(&generated_buf) - w := strings.to_writer(&generated_buf) - charlist_id, charlist_ok := xml.find_child_by_ident(doc, 0, "charlist") if !charlist_ok { fmt.eprintln("Could not locate top-level `` tag.") @@ -63,94 +90,130 @@ main :: proc() { fmt.printfln("Found `` with %v children.", len(charlist.value)) + // These are for `core:encoding/entity`, and only keep track of codepoints which have + // one or more children pointing to it. + // + // This means that this array can have the same codepoint appear more than once, e.g. + // `Aring` and `angst` are both a capital A with a circle. The latter is the Angstrom symbol. + entities: [dynamic]Entity + defer delete(entities) entity_map: map[string]Entity defer delete(entity_map) - names: [dynamic]string - defer delete(names) - min_name_length := max(int) max_name_length := min(int) shortest_name: string longest_name: string - count := 0 + // This is for `core:unicode`'s tables and has all children of `` + characters: [dynamic]Character + defer delete(characters) + for char_id in charlist.value { id := char_id.(xml.Element_ID) char := doc.elements[id] if char.ident != "character" { - fmt.eprintfln("Expected ``, got `<%v>`", char.ident) + fmt.eprintfln("Expected `` child to be ``, got `<%v>`", char.ident) os.exit(1) } - if codepoint_string, ok := xml.find_attribute_val_by_key(doc, id, "dec"); !ok { - fmt.eprintln("`` attribute not found.") + // `dec` is the codepoint, or codepoints separated by a `-`. + codepoint_string, ok := xml.find_attribute_val_by_key(doc, id, "dec") + if !ok { + fmt.eprintln("`` attribute not found.") os.exit(1) - } else { - r1, _, r2 := strings.partition(codepoint_string, "-") + } - codepoint, codepoint2: int - codepoint, _ = strconv.parse_int(r1) - if r2 != "" { - codepoint2, _ = strconv.parse_int(r2) - } + r1, _, r2 := strings.partition(codepoint_string, "-") - desc, desc_ok := xml.find_child_by_ident(doc, id, "description") - assert(desc_ok) - description := "" - if len(doc.elements[desc].value) == 1 { - description = doc.elements[desc].value[0].(string) - } + codepoint, codepoint2: int + codepoint, _ = strconv.parse_int(r1) + if r2 != "" { + codepoint2, _ = strconv.parse_int(r2) + } - // For us to be interested in this codepoint, it has to have at least one entity. - nth := 0 - for { - character_entity := xml.find_child_by_ident(doc, id, "entity", nth) or_break - nth += 1 - name := xml.find_attribute_val_by_key(doc, character_entity, "id") or_continue - if len(name) == 0 { - /* - Invalid name. Skip. - */ - continue - } + // This is the description we add to `core:encoding/entity`'s generated table + desc, desc_ok := xml.find_child_by_ident(doc, id, "description") + assert(desc_ok) + description := "" + if len(doc.elements[desc].value) == 1 { + description = doc.elements[desc].value[0].(string) + } - if name == "\"\"" { - fmt.printfln("%#v", char) - fmt.printfln("%#v", character_entity) - } - - if len(name) > max_name_length { longest_name = name } - if len(name) < min_name_length { shortest_name = name } - - min_name_length = min(min_name_length, len(name)) - max_name_length = max(max_name_length, len(name)) - - e := Entity{ - name = name, - codepoints = {rune(codepoint), rune(codepoint2)}, + // For us to be interested in a character for `core:unicode`, it has to have `` + // + // Not present for e.g. MULTIPLE CHARACTER OPERATOR: arccos + // and some maths characters without a character category + if unicodedata, unicodedata_ok := xml.find_child_by_ident(doc, id, "unicodedata"); unicodedata_ok { + // Not present for some math characters, e.g. codepoint: 10913-824, desc: "DOUBLE NESTED LESS-THAN with slash" + if category_string, category_ok := xml.find_attribute_val_by_key(doc, unicodedata, "category"); category_ok { + // These should only consist of a single rune. + assert(codepoint2 == 0) + append(&characters, Character{ + codepoint = rune(codepoint), description = description, - } - - if name in entity_map { - continue - } - - entity_map[name] = e - append(&names, name) - count += 1 + category = category_string, + }) } } + + // For us to be interested in this codepoint for `core:encoding/entity`, it has to have at least one ``. + nth := 0 + for { + character_entity := xml.find_child_by_ident(doc, id, "entity", nth) or_break + nth += 1 + name := xml.find_attribute_val_by_key(doc, character_entity, "id") or_continue + if len(name) == 0 { + // Invalid name. Skip. + continue + } + + if len(name) > max_name_length { longest_name = name } + if len(name) < min_name_length { shortest_name = name } + + min_name_length = min(min_name_length, len(name)) + max_name_length = max(max_name_length, len(name)) + + if name in entity_map { + continue + } + + e := Entity{ + name = name, + codepoints = {rune(codepoint), rune(codepoint2)}, + description = description, + } + + entity_map[name] = e + append(&entities, e) + } } - // Sort by name. - slice.sort(names[:]) + write_encoding_entitities_table(entities[:], shortest_name, longest_name, min_name_length, max_name_length) + fmt.println() + write_unicode_category_tables(characters[:]) - fmt.printfln("Found %v unique `&name;` -> rune mappings.", count) + // Not a library, no need to clean up. +} + +write_encoding_entitities_table :: proc(entities: []Entity, shortest_name, longest_name: string, min_name_length, max_name_length: int) { + fmt.printfln("Found %v unique `&name;` -> rune mappings.", len(entities)) fmt.printfln("Shortest name: %v (%v)", shortest_name, min_name_length) fmt.printfln("Longest name: %v (%v)", longest_name, max_name_length) + generated_filename, err_generated := path.join({ODIN_ROOT, "core", "encoding", "entity", "generated.odin"}, context.allocator) + defer delete(generated_filename) + + if err_generated != .None { + fmt.eprintfln("Join path error for generated.odin: %v", err_generated) + os.exit(1) + } + + generated_buf: strings.Builder + defer strings.builder_destroy(&generated_buf) + w := strings.to_writer(&generated_buf) + // Generate table. fmt.wprintln(w, "package encoding_unicode_entity") fmt.wprintln(w, "") @@ -192,19 +255,21 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: prefix := '?' should_close := false - for v in names { - if rune(v[0]) != prefix { + slice.sort_by(entities, proc(a, b: Entity) -> bool { + return a.name < b.name + }) + + for e in entities { + if rune(e.name[0]) != prefix { if should_close { fmt.wprintln(w, "\t\t}\n") } - prefix = rune(v[0]) + prefix = rune(e.name[0]) fmt.wprintfln(w, "\tcase '%v':", prefix) fmt.wprintln(w, "\t\tswitch name {") } - e := entity_map[v] - fmt.wprintf(w, "\t\tcase \"%v\":", e.name) for i := len(e.name); i < max_name_length; i += 1 { fmt.wprintf(w, " ") @@ -224,8 +289,10 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: fmt.wprintln(w, GENERATED) fmt.println() - fmt.println(strings.to_string(generated_buf)) - fmt.println() + when ODIN_DEBUG { + fmt.println(strings.to_string(generated_buf)) + fmt.println() + } written := os.write_entire_file(generated_filename, transmute([]byte)strings.to_string(generated_buf)) @@ -234,45 +301,66 @@ named_xml_entity_to_rune :: proc(name: string) -> (decoded: [2]rune, rune_count: } else { fmt.printfln("Failed to write generated \"%v\".", generated_filename) } - // Not a library, no need to clean up. } -GENERATED :: `/* - ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ -*/` +write_unicode_category_tables :: proc(characters: []Character) { + fmt.printfln("Found %v codepoints with a category.", len(characters)) -TABLE_FILE_PROLOG :: `/* - This file is generated from "https://github.com/w3c/xml-entities/blob/gh-pages/unicode.xml". - - UPDATE: - - Ensure the XML file was downloaded using "tests\core\download_assets.py", given the path to the "tests\assets" directory. - - Run "core/unicode/tools/generate_entity_table.odin" + // Sort by `category`, then `codepoints` + slice.sort_by(characters, proc(a, b: Character) -> bool { + return a.category < b.category && a.codepoint < b.codepoint + }) - Odin unicode generated tables: https://github.com/odin-lang/Odin/tree/master/core/encoding/entity + nd_range_start := rune(-1) + nd_range_end := rune(-1) + nd_last: rune + for c in characters { + // Find contiguous ranges for the `Nd` category + if c.category == "Nd" { + defer nd_last = c.codepoint - Copyright David Carlisle 1999-2025 - - Use and distribution of this code are permitted under the terms of the - W3C Software Notice and License. - http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html - - - - This file is a collection of information about how to map - Unicode entities to LaTeX, and various SGML/XML entity - sets (ISO and MathML/HTML). A Unicode character may be mapped - to several entities. - - Originally designed by Sebastian Rahtz in conjunction with - Barbara Beeton for the STIX project - - See also: LICENSE_table.md -*/ -` - -is_dotted_name :: proc(name: string) -> (dotted: bool) { - for r in name { - if r == '.' { return true} + // New range start + if c.codepoint != nd_last + 1 { + nd_range_end = nd_last + if nd_range_start != rune(-1) { + // Found a range + // fmt.printfln("%r (%d) - %r (%d) // %s", nd_range_start, nd_range_start, nd_range_end, nd_range_end, c.description) + } + nd_range_start = c.codepoint + } + } } - return false -} + + /* + Lu Letter, Uppercase + Ll Letter, Lowercase + Lt Letter, Titlecase + Lm Letter, Modifier + Lo Letter, Other + Mn Mark, Nonspacing + Mc Mark, Spacing Combining + Me Mark, Enclosing + Nd Number, Decimal Digit + Nl Number, Letter + No Number, Other + Pc Punctuation, Connector + Pd Punctuation, Dash + Ps Punctuation, Open + Pe Punctuation, Close + Pi Punctuation, Initial quote (may behave like Ps or Pe depending on usage) + Pf Punctuation, Final quote (may behave like Ps or Pe depending on usage) + Po Punctuation, Other + Sm Symbol, Math + Sc Symbol, Currency + Sk Symbol, Modifier + So Symbol, Other + Zs Separator, Space + Zl Separator, Line + Zp Separator, Paragraph + Cc Other, Control + Cf Other, Format + Cs Other, Surrogate + Co Other, Private Use + Cn Other, Not Assigned (no characters in the file have this property) + */ +} \ No newline at end of file diff --git a/tests/core/download_assets.py b/tests/core/download_assets.py index f51d50ea4..46a6c0e86 100644 --- a/tests/core/download_assets.py +++ b/tests/core/download_assets.py @@ -286,7 +286,7 @@ HMAC_DIGESTS = { 'emblem-1024-progressive.jpg': "7a6f4b112bd7189320c58dcddb9129968bcf268798c1e0c4f2243c10b3e3d9a6962c9f142d9fd65f8fb31e9a1e899008cae22b3ffde713250d315499b412e160", 'emblem-1024-gray.jpg': "4c25aaab92451e0452cdb165833b2b5a51978c2571de9d053950944667847666ba198d3001291615acda098ebe45b7d2d53c210c492f077b04a6bfe386f8a5fd", - 'unicode.xml': "e0cdc94f07fdbb15eea811ed2ae6dcf494a83d197dafe6580c740270feb0d8f5f7146d4a7d4c2d2ea25f8bd9678bc986123484b39399819a6b7262687959d1ae", + 'unicode.xml': "ba3a0f730efd6cbb89a54dafddf8902ace1b4e22e96d5c8e47cfcd1b9b79705d1985ea4abd25c5ede1c47a5a7d9456b25b093c1ec9d7705f0c6bf52a515c9aa9", 'a128cbc_hs256_test.json': "4d2c8e5c9c669dba8f4ca88398efaa03003a1f0350a50df6ad94fbc5d93cb9b9ab6f96b727e1bf85298e98b5d5cf2538d38fab745ceca65cd35bf8dd7562ce87", 'a192cbc_hs384_test.json': "3de5725108dc43dfe49571de089488de035631ff378c7708bd51fcdc854f306ca47cf731c65e45662759c8aed232f5111101d6c33836d9c2f8f700e775b8aa82", From 5d94c01e47fcdb7d0938a9125d17a08bde4f041b Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 21 Feb 2026 23:29:32 +0100 Subject: [PATCH 533/766] Disable LLVMTailCallKindMustTail under LLVM 18 --- src/llvm_backend_proc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 018f47c54..f72726af1 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -996,7 +996,7 @@ gb_internal lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue break; case ProcTailing_must_tail: LLVMSetTailCall(ret, true); - #if LLVM_VERSION_MAJOR > 14 + #if LLVM_VERSION_MAJOR > 17 LLVMSetTailCallKind(ret, LLVMTailCallKindMustTail); #endif break; From 0ffd740583d86bc0ff8dc7db585551cc2c251062 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Sun, 22 Feb 2026 01:23:33 -0500 Subject: [PATCH 534/766] core:bytes add loc := #caller_location --- core/bytes/bytes.odin | 130 +++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/core/bytes/bytes.odin b/core/bytes/bytes.odin index 08dcd6113..33978b3df 100644 --- a/core/bytes/bytes.odin +++ b/core/bytes/bytes.odin @@ -35,13 +35,13 @@ SCANNER_SENTINEL_MIN_128: simd.u8x16 : u8(0xff) SIMD_REG_SIZE_128 :: 16 clone :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> []byte { - c := make([]byte, len(s), allocator, loc) + c := make([]byte, len(s), allocator, loc=loc) copy(c, s) return c[:len(s)] } clone_safe :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: runtime.Allocator_Error) { - c := make([]byte, len(s), allocator, loc) or_return + c := make([]byte, len(s), allocator, loc=loc) or_return copy(c, s) return c[:len(s)], nil } @@ -163,7 +163,7 @@ has_suffix :: proc(s, suffix: []byte) -> bool { } -join :: proc(a: [][]byte, sep: []byte, allocator := context.allocator) -> []byte { +join :: proc(a: [][]byte, sep: []byte, allocator := context.allocator, loc := #caller_location) -> []byte { if len(a) == 0 { return nil } @@ -173,7 +173,7 @@ join :: proc(a: [][]byte, sep: []byte, allocator := context.allocator) -> []byte n += len(s) } - b := make([]byte, n, allocator) + b := make([]byte, n, allocator, loc=loc) i := copy(b, a[0]) for s in a[1:] { i += copy(b[i:], sep) @@ -182,7 +182,7 @@ join :: proc(a: [][]byte, sep: []byte, allocator := context.allocator) -> []byte return b } -join_safe :: proc(a: [][]byte, sep: []byte, allocator := context.allocator) -> (data: []byte, err: runtime.Allocator_Error) { +join_safe :: proc(a: [][]byte, sep: []byte, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: runtime.Allocator_Error) { if len(a) == 0 { return nil, nil } @@ -192,7 +192,7 @@ join_safe :: proc(a: [][]byte, sep: []byte, allocator := context.allocator) -> ( n += len(s) } - b := make([]byte, n, allocator) or_return + b := make([]byte, n, allocator, loc=loc) or_return i := copy(b, a[0]) for s in a[1:] { i += copy(b[i:], sep) @@ -201,7 +201,7 @@ join_safe :: proc(a: [][]byte, sep: []byte, allocator := context.allocator) -> ( return b, nil } -concatenate :: proc(a: [][]byte, allocator := context.allocator) -> []byte { +concatenate :: proc(a: [][]byte, allocator := context.allocator, loc := #caller_location) -> []byte { if len(a) == 0 { return nil } @@ -210,7 +210,7 @@ concatenate :: proc(a: [][]byte, allocator := context.allocator) -> []byte { for s in a { n += len(s) } - b := make([]byte, n, allocator) + b := make([]byte, n, allocator, loc=loc) i := 0 for s in a { i += copy(b[i:], s) @@ -218,7 +218,7 @@ concatenate :: proc(a: [][]byte, allocator := context.allocator) -> []byte { return b } -concatenate_safe :: proc(a: [][]byte, allocator := context.allocator) -> (data: []byte, err: runtime.Allocator_Error) { +concatenate_safe :: proc(a: [][]byte, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: runtime.Allocator_Error) { if len(a) == 0 { return nil, nil } @@ -227,7 +227,7 @@ concatenate_safe :: proc(a: [][]byte, allocator := context.allocator) -> (data: for s in a { n += len(s) } - b := make([]byte, n, allocator) or_return + b := make([]byte, n, allocator, loc=loc) or_return i := 0 for s in a { i += copy(b[i:], s) @@ -237,7 +237,7 @@ concatenate_safe :: proc(a: [][]byte, allocator := context.allocator) -> (data: @private -_split :: proc(s, sep: []byte, sep_save, n: int, allocator := context.allocator) -> [][]byte { +_split :: proc(s, sep: []byte, sep_save, n: int, allocator := context.allocator, loc := #caller_location) -> [][]byte { s, n := s, n if n == 0 { @@ -250,7 +250,7 @@ _split :: proc(s, sep: []byte, sep_save, n: int, allocator := context.allocator) n = l } - res := make([dynamic][]byte, n, allocator) + res := make([dynamic][]byte, n, allocator, loc=loc) for i := 0; i < n-1; i += 1 { _, w := utf8.decode_rune(s) res[i] = s[:w] @@ -266,7 +266,7 @@ _split :: proc(s, sep: []byte, sep_save, n: int, allocator := context.allocator) n = count(s, sep) + 1 } - res := make([dynamic][]byte, n, allocator) + res := make([dynamic][]byte, n, allocator, loc=loc) n -= 1 @@ -284,20 +284,20 @@ _split :: proc(s, sep: []byte, sep_save, n: int, allocator := context.allocator) return res[:i+1] } -split :: proc(s, sep: []byte, allocator := context.allocator) -> [][]byte { - return _split(s, sep, 0, -1, allocator) +split :: proc(s, sep: []byte, allocator := context.allocator, loc := #caller_location) -> [][]byte { + return _split(s, sep, 0, -1, allocator, loc) } -split_n :: proc(s, sep: []byte, n: int, allocator := context.allocator) -> [][]byte { - return _split(s, sep, 0, n, allocator) +split_n :: proc(s, sep: []byte, n: int, allocator := context.allocator, loc := #caller_location) -> [][]byte { + return _split(s, sep, 0, n, allocator, loc) } -split_after :: proc(s, sep: []byte, allocator := context.allocator) -> [][]byte { - return _split(s, sep, len(sep), -1, allocator) +split_after :: proc(s, sep: []byte, allocator := context.allocator, loc := #caller_location) -> [][]byte { + return _split(s, sep, len(sep), -1, allocator, loc) } -split_after_n :: proc(s, sep: []byte, n: int, allocator := context.allocator) -> [][]byte { - return _split(s, sep, len(sep), n, allocator) +split_after_n :: proc(s, sep: []byte, n: int, allocator := context.allocator, loc := #caller_location) -> [][]byte { + return _split(s, sep, len(sep), n, allocator, loc) } @@ -774,14 +774,14 @@ count :: proc(s, substr: []byte) -> int { } -repeat :: proc(s: []byte, count: int, allocator := context.allocator) -> []byte { +repeat :: proc(s: []byte, count: int, allocator := context.allocator, loc := #caller_location) -> []byte { if count < 0 { panic("bytes: negative repeat count") } else if count > 0 && (len(s)*count)/count != len(s) { panic("bytes: repeat count will cause an overflow") } - b := make([]byte, len(s)*count, allocator) + b := make([]byte, len(s)*count, allocator, loc=loc) i := copy(b, s) for i < len(b) { // 2^N trick to reduce the need to copy copy(b[i:], b[:i]) @@ -790,12 +790,12 @@ repeat :: proc(s: []byte, count: int, allocator := context.allocator) -> []byte return b } -replace_all :: proc(s, old, new: []byte, allocator := context.allocator) -> (output: []byte, was_allocation: bool) { - return replace(s, old, new, -1, allocator) +replace_all :: proc(s, old, new: []byte, allocator := context.allocator, loc := #caller_location) -> (output: []byte, was_allocation: bool) { + return replace(s, old, new, -1, allocator, loc) } // if n < 0, no limit on the number of replacements -replace :: proc(s, old, new: []byte, n: int, allocator := context.allocator) -> (output: []byte, was_allocation: bool) { +replace :: proc(s, old, new: []byte, n: int, allocator := context.allocator, loc := #caller_location) -> (output: []byte, was_allocation: bool) { if string(old) == string(new) || n == 0 { was_allocation = false output = s @@ -811,7 +811,7 @@ replace :: proc(s, old, new: []byte, n: int, allocator := context.allocator) -> } - t := make([]byte, len(s) + byte_count*(len(new) - len(old)), allocator) + t := make([]byte, len(s) + byte_count*(len(new) - len(old)), allocator, loc=loc) was_allocation = true w := 0 @@ -835,12 +835,12 @@ replace :: proc(s, old, new: []byte, n: int, allocator := context.allocator) -> return } -remove :: proc(s, key: []byte, n: int, allocator := context.allocator) -> (output: []byte, was_allocation: bool) { - return replace(s, key, {}, n, allocator) +remove :: proc(s, key: []byte, n: int, allocator := context.allocator, loc := #caller_location) -> (output: []byte, was_allocation: bool) { + return replace(s, key, {}, n, allocator, loc) } -remove_all :: proc(s, key: []byte, allocator := context.allocator) -> (output: []byte, was_allocation: bool) { - return remove(s, key, -1, allocator) +remove_all :: proc(s, key: []byte, allocator := context.allocator, loc := #caller_location) -> (output: []byte, was_allocation: bool) { + return remove(s, key, -1, allocator, loc) } @(private) _ascii_space := [256]u8{'\t' = 1, '\n' = 1, '\v' = 1, '\f' = 1, '\r' = 1, ' ' = 1} @@ -1054,7 +1054,7 @@ trim_suffix :: proc(s, suffix: []byte) -> []byte { return s } -split_multi :: proc(s: []byte, substrs: [][]byte, skip_empty := false, allocator := context.allocator) -> [][]byte #no_bounds_check { +split_multi :: proc(s: []byte, substrs: [][]byte, skip_empty := false, allocator := context.allocator, loc := #caller_location) -> [][]byte #no_bounds_check { if s == nil || len(substrs) <= 0 { return nil } @@ -1102,7 +1102,7 @@ split_multi :: proc(s: []byte, substrs: [][]byte, skip_empty := false, allocator return nil } - buf := make([][]byte, n, allocator) + buf := make([][]byte, n, allocator, loc=loc) n, i, l = 0, 0, 0 @@ -1189,10 +1189,10 @@ split_multi_iterator :: proc(s: ^[]byte, substrs: [][]byte, skip_empty := false) // Scrubs invalid utf-8 characters and replaces them with the replacement string // Adjacent invalid bytes are only replaced once -scrub :: proc(s: []byte, replacement: []byte, allocator := context.allocator) -> []byte { +scrub :: proc(s: []byte, replacement: []byte, allocator := context.allocator, loc := #caller_location) -> []byte { str := s b: Buffer - buffer_init_allocator(&b, 0, len(s), allocator) + buffer_init_allocator(&b, 0, len(s), allocator, loc) has_error := false cursor := 0 @@ -1204,11 +1204,11 @@ scrub :: proc(s: []byte, replacement: []byte, allocator := context.allocator) -> if r == utf8.RUNE_ERROR { if !has_error { has_error = true - buffer_write(&b, origin[:cursor]) + buffer_write(&b, origin[:cursor], loc) } } else if has_error { has_error = false - buffer_write(&b, replacement) + buffer_write(&b, replacement, loc) origin = origin[cursor:] cursor = 0 @@ -1222,10 +1222,10 @@ scrub :: proc(s: []byte, replacement: []byte, allocator := context.allocator) -> } -reverse :: proc(s: []byte, allocator := context.allocator) -> []byte { +reverse :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> []byte { str := s n := len(str) - buf := make([]byte, n) + buf := make([]byte, n, loc=loc) i := n for len(str) > 0 { @@ -1237,7 +1237,7 @@ reverse :: proc(s: []byte, allocator := context.allocator) -> []byte { return buf } -expand_tabs :: proc(s: []byte, tab_size: int, allocator := context.allocator) -> []byte { +expand_tabs :: proc(s: []byte, tab_size: int, allocator := context.allocator, loc := #caller_location) -> []byte { if tab_size <= 0 { panic("tab size must be positive") } @@ -1248,7 +1248,7 @@ expand_tabs :: proc(s: []byte, tab_size: int, allocator := context.allocator) -> } b: Buffer - buffer_init_allocator(&b, 0, len(s), allocator) + buffer_init_allocator(&b, 0, len(s), allocator, loc=loc) str := s column: int @@ -1260,7 +1260,7 @@ expand_tabs :: proc(s: []byte, tab_size: int, allocator := context.allocator) -> expand := tab_size - column%tab_size for i := 0; i < expand; i += 1 { - buffer_write_byte(&b, ' ') + buffer_write_byte(&b, ' ', loc) } column += expand @@ -1271,7 +1271,7 @@ expand_tabs :: proc(s: []byte, tab_size: int, allocator := context.allocator) -> column += w } - buffer_write_rune(&b, r) + buffer_write_rune(&b, r, loc) } str = str[w:] @@ -1296,59 +1296,59 @@ partition :: proc(str, sep: []byte) -> (head, match, tail: []byte) { center_justify :: centre_justify // NOTE(bill): Because Americans exist // centre_justify returns a byte slice with a pad byte slice at boths sides if the str's rune length is smaller than length -centre_justify :: proc(str: []byte, length: int, pad: []byte, allocator := context.allocator) -> []byte { +centre_justify :: proc(str: []byte, length: int, pad: []byte, allocator := context.allocator, loc := #caller_location) -> []byte { n := rune_count(str) if n >= length || pad == nil { - return clone(str, allocator) + return clone(str, allocator, loc) } remains := length-1 pad_len := rune_count(pad) b: Buffer - buffer_init_allocator(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator) + buffer_init_allocator(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator, loc) write_pad_string(&b, pad, pad_len, remains/2) - buffer_write(&b, str) + buffer_write(&b, str, loc) write_pad_string(&b, pad, pad_len, (remains+1)/2) return buffer_to_bytes(&b) } // left_justify returns a byte slice with a pad byte slice at left side if the str's rune length is smaller than length -left_justify :: proc(str: []byte, length: int, pad: []byte, allocator := context.allocator) -> []byte { +left_justify :: proc(str: []byte, length: int, pad: []byte, allocator := context.allocator, loc := #caller_location) -> []byte { n := rune_count(str) if n >= length || pad == nil { - return clone(str, allocator) + return clone(str, allocator, loc) } remains := length-1 pad_len := rune_count(pad) b: Buffer - buffer_init_allocator(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator) + buffer_init_allocator(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator, loc) - buffer_write(&b, str) + buffer_write(&b, str, loc) write_pad_string(&b, pad, pad_len, remains) return buffer_to_bytes(&b) } // right_justify returns a byte slice with a pad byte slice at right side if the str's rune length is smaller than length -right_justify :: proc(str: []byte, length: int, pad: []byte, allocator := context.allocator) -> []byte { +right_justify :: proc(str: []byte, length: int, pad: []byte, allocator := context.allocator, loc := #caller_location) -> []byte { n := rune_count(str) if n >= length || pad == nil { - return clone(str, allocator) + return clone(str, allocator, loc) } remains := length-1 pad_len := rune_count(pad) b: Buffer - buffer_init_allocator(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator) + buffer_init_allocator(&b, 0, len(str) + (remains/pad_len + 1)*len(pad), allocator, loc) write_pad_string(&b, pad, pad_len, remains) - buffer_write(&b, str) + buffer_write(&b, str, loc) return buffer_to_bytes(&b) } @@ -1357,11 +1357,11 @@ right_justify :: proc(str: []byte, length: int, pad: []byte, allocator := contex @private -write_pad_string :: proc(b: ^Buffer, pad: []byte, pad_len, remains: int) { +write_pad_string :: proc(b: ^Buffer, pad: []byte, pad_len, remains: int, loc := #caller_location) { repeats := remains / pad_len for i := 0; i < repeats; i += 1 { - buffer_write(b, pad) + buffer_write(b, pad, loc) } n := remains % pad_len @@ -1369,7 +1369,7 @@ write_pad_string :: proc(b: ^Buffer, pad: []byte, pad_len, remains: int) { for i := 0; i < n; i += 1 { r, width := utf8.decode_rune(p) - buffer_write_rune(b, r) + buffer_write_rune(b, r, loc) p = p[width:] } } @@ -1377,7 +1377,7 @@ write_pad_string :: proc(b: ^Buffer, pad: []byte, pad_len, remains: int) { // fields splits the byte slice s around each instance of one or more consecutive white space character, defined by unicode.is_space // returning a slice of subslices of s or an empty slice if s only contains white space -fields :: proc(s: []byte, allocator := context.allocator) -> [][]byte #no_bounds_check { +fields :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> [][]byte #no_bounds_check { n := 0 was_space := 1 set_bits := u8(0) @@ -1392,14 +1392,14 @@ fields :: proc(s: []byte, allocator := context.allocator) -> [][]byte #no_bounds } if set_bits >= utf8.RUNE_SELF { - return fields_proc(s, unicode.is_space, allocator) + return fields_proc(s, unicode.is_space, allocator, loc) } if n == 0 { return nil } - a := make([][]byte, n, allocator) + a := make([][]byte, n, allocator, loc=loc) na := 0 field_start := 0 i := 0 @@ -1433,15 +1433,15 @@ fields :: proc(s: []byte, allocator := context.allocator) -> [][]byte #no_bounds // // fields_proc makes no guarantee about the order in which it calls f(ch) // it assumes that `f` always returns the same value for a given ch -fields_proc :: proc(s: []byte, f: proc(rune) -> bool, allocator := context.allocator) -> [][]byte #no_bounds_check { - subslices := make([dynamic][]byte, 0, 32, allocator) +fields_proc :: proc(s: []byte, f: proc(rune) -> bool, allocator := context.allocator, loc := #caller_location) -> [][]byte #no_bounds_check { + subslices := make([dynamic][]byte, 0, 32, allocator, loc=loc) start, end := -1, -1 for r, offset in string(s) { end = offset if f(r) { if start >= 0 { - append(&subslices, s[start : end]) + append(&subslices, s[start : end], loc=loc) // -1 could be used, but just speed it up through bitwise not // gotta love 2's complement start = ~start @@ -1454,7 +1454,7 @@ fields_proc :: proc(s: []byte, f: proc(rune) -> bool, allocator := context.alloc } if start >= 0 { - append(&subslices, s[start : len(s)]) + append(&subslices, s[start : len(s)], loc=loc) } return subslices[:] From ae4545819389c81c8ece3e47a38124af88f9a980 Mon Sep 17 00:00:00 2001 From: fnky Date: Sun, 22 Feb 2026 19:31:09 +0100 Subject: [PATCH 535/766] Remove pointer from part arg --- vendor/curl/curl_urlapi.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/curl/curl_urlapi.odin b/vendor/curl/curl_urlapi.odin index c11f75c70..0b8171e34 100644 --- a/vendor/curl/curl_urlapi.odin +++ b/vendor/curl/curl_urlapi.odin @@ -130,7 +130,7 @@ foreign lib { * error code. The passed in string will be copied. Passing a NULL instead of * a part string, clears that part. */ - url_set :: proc(handle: ^CURLU, what: ^UPart, part: cstring, flags: UFlags) -> Ucode --- + url_set :: proc(handle: ^CURLU, what: UPart, part: cstring, flags: UFlags) -> Ucode --- /* * curl_url_strerror() turns a CURLUcode value into the equivalent human @@ -138,4 +138,4 @@ foreign lib { * messages. */ url_strerror :: proc(Ucode) -> cstring --- -} \ No newline at end of file +} From a0c375dd02e93f6e2baa6f0b645cdccbddaf01e5 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Mon, 23 Feb 2026 01:34:13 -0500 Subject: [PATCH 536/766] A small optimization for dynamic arrays. Move assert(a.allocator.procedure != nil) out of the common path into the if check --- base/runtime/core_builtin.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 02278a356..6e0fe931a 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -893,8 +893,8 @@ _reserve_dynamic_array :: #force_no_inline proc(a: ^Raw_Dynamic_Array, size_of_e if a.allocator.procedure == nil { a.allocator = context.allocator + assert(a.allocator.procedure != nil) } - assert(a.allocator.procedure != nil) old_size := a.cap * size_of_elem new_size := capacity * size_of_elem @@ -953,8 +953,8 @@ _resize_dynamic_array :: #force_no_inline proc(a: ^Raw_Dynamic_Array, size_of_el if a.allocator.procedure == nil { a.allocator = context.allocator + assert(a.allocator.procedure != nil) } - assert(a.allocator.procedure != nil) old_size := a.cap * size_of_elem new_size := length * size_of_elem @@ -1023,8 +1023,8 @@ _shrink_dynamic_array :: proc(a: ^Raw_Dynamic_Array, size_of_elem, align_of_elem if a.allocator.procedure == nil { a.allocator = context.allocator + assert(a.allocator.procedure != nil) } - assert(a.allocator.procedure != nil) old_size := a.cap * size_of_elem new_size := new_cap * size_of_elem From 25fde8a03abb71722c8094fdbba8405fe9467d09 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Mon, 23 Feb 2026 11:35:16 -0500 Subject: [PATCH 537/766] For #soa dynamic arrays. Move assert(a.allocator.procedure != nil) out of the common path into the if check --- base/runtime/core_builtin_soa.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/base/runtime/core_builtin_soa.odin b/base/runtime/core_builtin_soa.odin index 5078b85d0..e9a284a04 100644 --- a/base/runtime/core_builtin_soa.odin +++ b/base/runtime/core_builtin_soa.odin @@ -105,8 +105,8 @@ make_soa_aligned :: proc($T: typeid/#soa[]$E, #any_int length, alignment: int, a allocator := allocator if allocator.procedure == nil { allocator = context.allocator + assert(allocator.procedure != nil) } - assert(allocator.procedure != nil) new_bytes: []byte new_bytes, err = allocator.procedure( @@ -240,8 +240,8 @@ _reserve_soa :: proc(array: ^$T/#soa[dynamic]$E, capacity: int, zero_memory: boo if array.allocator.procedure == nil { array.allocator = context.allocator + assert(array.allocator.procedure != nil) } - assert(array.allocator.procedure != nil) footer := raw_soa_footer(array) if size_of(E) == 0 { From 3fd9c915ed093f88a7deb4b923e282d544478476 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Mon, 23 Feb 2026 12:19:38 -0500 Subject: [PATCH 538/766] Move assert(a.allocator.procedure != nil) out of the common path into the if check --- base/runtime/dynamic_array_internal.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/base/runtime/dynamic_array_internal.odin b/base/runtime/dynamic_array_internal.odin index 267ee0785..514e0e782 100644 --- a/base/runtime/dynamic_array_internal.odin +++ b/base/runtime/dynamic_array_internal.odin @@ -18,8 +18,8 @@ __dynamic_array_reserve :: proc(array_: rawptr, elem_size, elem_align: int, cap: // assuming that appending/reserving will set the allocator, if it is not already set. if array.allocator.procedure == nil { array.allocator = context.allocator + assert(array.allocator.procedure != nil) } - assert(array.allocator.procedure != nil) if cap <= array.cap { return true @@ -52,8 +52,8 @@ __dynamic_array_shrink :: proc(array_: rawptr, elem_size, elem_align: int, new_c // assuming that appending/reserving will set the allocator, if it is not already set. if array.allocator.procedure == nil { array.allocator = context.allocator + assert(array.allocator.procedure != nil) } - assert(array.allocator.procedure != nil) if new_cap > array.cap { return From 20e3237da1232cad6658ad5138ab4d519ca7977f Mon Sep 17 00:00:00 2001 From: nowhereware <113222579+nowhereware@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:14:08 -0500 Subject: [PATCH 539/766] Update SDL3 to 3.4.2 --- vendor/sdl3/include/SDL.h | 4 +- vendor/sdl3/include/SDL_assert.h | 10 +- vendor/sdl3/include/SDL_asyncio.h | 6 +- vendor/sdl3/include/SDL_atomic.h | 2 +- vendor/sdl3/include/SDL_audio.h | 2 +- vendor/sdl3/include/SDL_begin_code.h | 2 +- vendor/sdl3/include/SDL_bits.h | 2 +- vendor/sdl3/include/SDL_blendmode.h | 2 +- vendor/sdl3/include/SDL_camera.h | 2 +- vendor/sdl3/include/SDL_clipboard.h | 2 +- vendor/sdl3/include/SDL_close_code.h | 2 +- vendor/sdl3/include/SDL_copying.h | 2 +- vendor/sdl3/include/SDL_cpuinfo.h | 2 +- vendor/sdl3/include/SDL_dialog.h | 2 +- vendor/sdl3/include/SDL_dlopennote.h | 2 +- vendor/sdl3/include/SDL_egl.h | 2 +- vendor/sdl3/include/SDL_endian.h | 2 +- vendor/sdl3/include/SDL_error.h | 2 +- vendor/sdl3/include/SDL_events.h | 10 +- vendor/sdl3/include/SDL_filesystem.h | 9 +- vendor/sdl3/include/SDL_gamepad.h | 2 +- vendor/sdl3/include/SDL_gpu.h | 42 +++++- vendor/sdl3/include/SDL_guid.h | 2 +- vendor/sdl3/include/SDL_haptic.h | 2 +- vendor/sdl3/include/SDL_hidapi.h | 2 +- vendor/sdl3/include/SDL_hints.h | 146 ++++++++++++++++----- vendor/sdl3/include/SDL_init.h | 12 +- vendor/sdl3/include/SDL_intrin.h | 2 +- vendor/sdl3/include/SDL_iostream.h | 2 +- vendor/sdl3/include/SDL_joystick.h | 2 +- vendor/sdl3/include/SDL_keyboard.h | 2 +- vendor/sdl3/include/SDL_keycode.h | 2 +- vendor/sdl3/include/SDL_loadso.h | 2 +- vendor/sdl3/include/SDL_locale.h | 4 +- vendor/sdl3/include/SDL_log.h | 2 +- vendor/sdl3/include/SDL_main.h | 12 +- vendor/sdl3/include/SDL_main_impl.h | 2 +- vendor/sdl3/include/SDL_messagebox.h | 6 +- vendor/sdl3/include/SDL_metal.h | 8 +- vendor/sdl3/include/SDL_misc.h | 4 +- vendor/sdl3/include/SDL_mouse.h | 2 +- vendor/sdl3/include/SDL_mutex.h | 44 ++++++- vendor/sdl3/include/SDL_oldnames.h | 2 +- vendor/sdl3/include/SDL_opengl.h | 2 +- vendor/sdl3/include/SDL_opengles.h | 2 +- vendor/sdl3/include/SDL_opengles2.h | 2 +- vendor/sdl3/include/SDL_pen.h | 2 +- vendor/sdl3/include/SDL_pixels.h | 2 +- vendor/sdl3/include/SDL_platform.h | 4 +- vendor/sdl3/include/SDL_platform_defines.h | 2 +- vendor/sdl3/include/SDL_power.h | 4 +- vendor/sdl3/include/SDL_process.h | 2 +- vendor/sdl3/include/SDL_properties.h | 4 +- vendor/sdl3/include/SDL_rect.h | 20 ++- vendor/sdl3/include/SDL_render.h | 8 +- vendor/sdl3/include/SDL_revision.h | 39 +++--- vendor/sdl3/include/SDL_scancode.h | 2 +- vendor/sdl3/include/SDL_sensor.h | 2 +- vendor/sdl3/include/SDL_stdinc.h | 24 +++- vendor/sdl3/include/SDL_storage.h | 2 +- vendor/sdl3/include/SDL_surface.h | 2 +- vendor/sdl3/include/SDL_system.h | 24 +++- vendor/sdl3/include/SDL_test.h | 2 +- vendor/sdl3/include/SDL_test_assert.h | 2 +- vendor/sdl3/include/SDL_test_common.h | 2 +- vendor/sdl3/include/SDL_test_compare.h | 2 +- vendor/sdl3/include/SDL_test_crc32.h | 2 +- vendor/sdl3/include/SDL_test_font.h | 2 +- vendor/sdl3/include/SDL_test_fuzzer.h | 2 +- vendor/sdl3/include/SDL_test_harness.h | 2 +- vendor/sdl3/include/SDL_test_log.h | 2 +- vendor/sdl3/include/SDL_test_md5.h | 2 +- vendor/sdl3/include/SDL_test_memory.h | 2 +- vendor/sdl3/include/SDL_thread.h | 25 +++- vendor/sdl3/include/SDL_time.h | 20 ++- vendor/sdl3/include/SDL_timer.h | 2 +- vendor/sdl3/include/SDL_touch.h | 2 +- vendor/sdl3/include/SDL_tray.h | 2 +- vendor/sdl3/include/SDL_version.h | 18 ++- vendor/sdl3/include/SDL_video.h | 2 +- vendor/sdl3/sdl3_gpu.odin | 3 + vendor/sdl3/sdl3_hints.odin | 1 + vendor/sdl3/sdl3_render.odin | 2 +- vendor/sdl3/sdl3_version.odin | 4 +- 84 files changed, 468 insertions(+), 159 deletions(-) diff --git a/vendor/sdl3/include/SDL.h b/vendor/sdl3/include/SDL.h index 04a05d257..fd13b8340 100644 --- a/vendor/sdl3/include/SDL.h +++ b/vendor/sdl3/include/SDL.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -20,7 +20,7 @@ */ /** - * Main include header for the SDL library, version 3.4.0 + * Main include header for the SDL library, version 3.4.2 * * It is almost always best to include just this one header instead of * picking out individual headers included here. There are exceptions to diff --git a/vendor/sdl3/include/SDL_assert.h b/vendor/sdl3/include/SDL_assert.h index f0c4637b9..fb6746235 100644 --- a/vendor/sdl3/include/SDL_assert.h +++ b/vendor/sdl3/include/SDL_assert.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -136,7 +136,7 @@ extern "C" { #define SDL_TriggerBreakpoint() __builtin_debugtrap() #elif SDL_HAS_BUILTIN(__builtin_trap) #define SDL_TriggerBreakpoint() __builtin_trap() -#elif (defined(__GNUC__) || defined(__clang__) || defined(__TINYC__)) && (defined(__i386__) || defined(__x86_64__)) +#elif (defined(__GNUC__) || defined(__clang__) || defined(__TINYC__) || defined(__slimcc__)) && (defined(__i386__) || defined(__x86_64__)) #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) #elif (defined(__GNUC__) || defined(__clang__)) && defined(__riscv) #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "ebreak\n\t" ) @@ -160,7 +160,7 @@ extern "C" { #ifdef SDL_WIKI_DOCUMENTATION_SECTION /** - * A macro that reports the current function being compiled. + * A constant that contains the current function being compiled. * * If SDL can't figure how the compiler reports this, it will use "???". * @@ -168,13 +168,15 @@ extern "C" { */ #define SDL_FUNCTION __FUNCTION__ -#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ +#elif !defined(SDL_FUNCTION) +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ # define SDL_FUNCTION __func__ #elif ((defined(__GNUC__) && (__GNUC__ >= 2)) || defined(_MSC_VER) || defined (__WATCOMC__)) # define SDL_FUNCTION __FUNCTION__ #else # define SDL_FUNCTION "???" #endif +#endif #ifdef SDL_WIKI_DOCUMENTATION_SECTION diff --git a/vendor/sdl3/include/SDL_asyncio.h b/vendor/sdl3/include/SDL_asyncio.h index b36cb071b..3c894d696 100644 --- a/vendor/sdl3/include/SDL_asyncio.h +++ b/vendor/sdl3/include/SDL_asyncio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -213,6 +213,8 @@ typedef struct SDL_AsyncIOQueue SDL_AsyncIOQueue; * \returns a pointer to the SDL_AsyncIO structure that is created or NULL on * failure; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CloseAsyncIO @@ -531,6 +533,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_SignalAsyncIOQueue(SDL_AsyncIOQueue *queue) * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_LoadFile_IO diff --git a/vendor/sdl3/include/SDL_atomic.h b/vendor/sdl3/include/SDL_atomic.h index bfcf81ee0..1ec0753da 100644 --- a/vendor/sdl3/include/SDL_atomic.h +++ b/vendor/sdl3/include/SDL_atomic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_audio.h b/vendor/sdl3/include/SDL_audio.h index 4c362e738..da797c6a8 100644 --- a/vendor/sdl3/include/SDL_audio.h +++ b/vendor/sdl3/include/SDL_audio.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_begin_code.h b/vendor/sdl3/include/SDL_begin_code.h index 675cd7f09..94f79099b 100644 --- a/vendor/sdl3/include/SDL_begin_code.h +++ b/vendor/sdl3/include/SDL_begin_code.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_bits.h b/vendor/sdl3/include/SDL_bits.h index 7435ce6d9..ddb5cdbab 100644 --- a/vendor/sdl3/include/SDL_bits.h +++ b/vendor/sdl3/include/SDL_bits.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_blendmode.h b/vendor/sdl3/include/SDL_blendmode.h index 8f00cbcaf..84cf622cb 100644 --- a/vendor/sdl3/include/SDL_blendmode.h +++ b/vendor/sdl3/include/SDL_blendmode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_camera.h b/vendor/sdl3/include/SDL_camera.h index 59ce73fe8..14ea647a7 100644 --- a/vendor/sdl3/include/SDL_camera.h +++ b/vendor/sdl3/include/SDL_camera.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_clipboard.h b/vendor/sdl3/include/SDL_clipboard.h index 7480eb284..696825376 100644 --- a/vendor/sdl3/include/SDL_clipboard.h +++ b/vendor/sdl3/include/SDL_clipboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_close_code.h b/vendor/sdl3/include/SDL_close_code.h index da1dea7fa..ad9daa6d4 100644 --- a/vendor/sdl3/include/SDL_close_code.h +++ b/vendor/sdl3/include/SDL_close_code.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_copying.h b/vendor/sdl3/include/SDL_copying.h index 747bd3570..dd9dbc7ee 100644 --- a/vendor/sdl3/include/SDL_copying.h +++ b/vendor/sdl3/include/SDL_copying.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_cpuinfo.h b/vendor/sdl3/include/SDL_cpuinfo.h index b1e125b55..5669c2373 100644 --- a/vendor/sdl3/include/SDL_cpuinfo.h +++ b/vendor/sdl3/include/SDL_cpuinfo.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_dialog.h b/vendor/sdl3/include/SDL_dialog.h index 395b7e8c9..1e01347bf 100644 --- a/vendor/sdl3/include/SDL_dialog.h +++ b/vendor/sdl3/include/SDL_dialog.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_dlopennote.h b/vendor/sdl3/include/SDL_dlopennote.h index e866d2a20..299435a5d 100644 --- a/vendor/sdl3/include/SDL_dlopennote.h +++ b/vendor/sdl3/include/SDL_dlopennote.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_egl.h b/vendor/sdl3/include/SDL_egl.h index 65d4e967a..1371c4d01 100644 --- a/vendor/sdl3/include/SDL_egl.h +++ b/vendor/sdl3/include/SDL_egl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_endian.h b/vendor/sdl3/include/SDL_endian.h index 6b1b4cbcf..957ea20c3 100644 --- a/vendor/sdl3/include/SDL_endian.h +++ b/vendor/sdl3/include/SDL_endian.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_error.h b/vendor/sdl3/include/SDL_error.h index 934967c1c..3453818cb 100644 --- a/vendor/sdl3/include/SDL_error.h +++ b/vendor/sdl3/include/SDL_error.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_events.h b/vendor/sdl3/include/SDL_events.h index 4c06e45b1..d82a615f8 100644 --- a/vendor/sdl3/include/SDL_events.h +++ b/vendor/sdl3/include/SDL_events.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -1256,15 +1256,13 @@ extern SDL_DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType) * Poll for currently pending events. * * If `event` is not NULL, the next event is removed from the queue and stored - * in the SDL_Event structure pointed to by `event`. The 1 returned refers to - * this event, immediately stored in the SDL Event structure -- not an event - * to follow. + * in the SDL_Event structure pointed to by `event`. * - * If `event` is NULL, it simply returns 1 if there is an event in the queue, + * If `event` is NULL, it simply returns true if there is an event in the queue, * but will not remove it from the queue. * * As this function may implicitly call SDL_PumpEvents(), you can only call - * this function in the thread that set the video mode. + * this function in the thread that initialized the video subsystem. * * SDL_PollEvent() is the favored way of receiving system events since it can * be done from the main loop and does not suspend the main loop while waiting diff --git a/vendor/sdl3/include/SDL_filesystem.h b/vendor/sdl3/include/SDL_filesystem.h index 67f6d7ac8..006293554 100644 --- a/vendor/sdl3/include/SDL_filesystem.h +++ b/vendor/sdl3/include/SDL_filesystem.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -242,8 +242,7 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetUserFolder(SDL_Folder folder); * Types of filesystem entries. * * Note that there may be other sorts of items on a filesystem: devices, - * symlinks, named pipes, etc. They are currently reported as - * SDL_PATHTYPE_OTHER. + * named pipes, etc. They are currently reported as SDL_PATHTYPE_OTHER. * * \since This enum is available since SDL 3.2.0. * @@ -457,6 +456,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_CopyFile(const char *oldpath, const char *n /** * Get information about a filesystem path. * + * Symlinks, on filesystems that support them, are always followed, so you will + * always get information on what the symlink eventually points to, and not the + * symlink itself. + * * \param path the path to query. * \param info a pointer filled in with information about the path, or NULL to * check for the existence of a file. diff --git a/vendor/sdl3/include/SDL_gamepad.h b/vendor/sdl3/include/SDL_gamepad.h index 0102f1544..113452535 100644 --- a/vendor/sdl3/include/SDL_gamepad.h +++ b/vendor/sdl3/include/SDL_gamepad.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_gpu.h b/vendor/sdl3/include/SDL_gpu.h index d35104a7d..b9e19ab54 100644 --- a/vendor/sdl3/include/SDL_gpu.h +++ b/vendor/sdl3/include/SDL_gpu.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -1398,11 +1398,12 @@ typedef struct SDL_GPUViewport * SDL_DownloadFromGPUTexture are used as default values respectively and data * is considered to be tightly packed. * - * **WARNING**: Direct3D 12 requires texture data row pitch to be 256 byte - * aligned, and offsets to be aligned to 512 bytes. If they are not, SDL will - * make a temporary copy of the data that is properly aligned, but this adds - * overhead to the transfer process. Apps can avoid this by aligning their - * data appropriately, or using a different GPU backend than Direct3D 12. + * **WARNING**: On some older/integrated hardware, Direct3D 12 requires texture + * data row pitch to be 256 byte aligned, and offsets to be aligned to 512 bytes. + * If they are not, SDL will make a temporary copy of the data that is properly + * aligned, but this adds overhead to the transfer process. Apps can avoid this + * by aligning their data appropriately, or using a different GPU backend than + * Direct3D 12. * * \since This struct is available since SDL 3.2.0. * @@ -2306,6 +2307,21 @@ extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDevice( * useful for targeting Intel Haswell and Broadwell GPUs; other hardware * either supports Tier 2 Resource Binding or does not support D3D12 in any * capacity. Defaults to false. + * - `SDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER`: Certain + * feature checks are only possible on Windows 11 by default. By setting + * this alongside `SDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING` + * and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make + * those feature checks possible on older platforms. The version you provide + * must match the one given in the DLL. + * - `SDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING`: Certain + * feature checks are only possible on Windows 11 by default. By setting + * this alongside + * `SDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER` and + * vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those + * feature checks possible on older platforms. The path you provide must be + * relative to the executable path of your app. Be sure not to put the DLL + * in the same directory as the exe; Microsoft strongly advises against + * this! * * With the Vulkan backend: * @@ -2321,6 +2337,15 @@ extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDevice( * increasing the API version and opting into extensions aside from the * minimal set SDL requires. * + * With the Metal backend: - + * `SDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN`: By default, + * macOS support requires what Apple calls "MTLGPUFamilyMac2" hardware or + * newer. However, an application can set this property to true to enable + * support for "MTLGPUFamilyMac1" hardware, if (and only if) the application + * does not write to sRGB textures. (For history's sake: MacFamily1 also does + * not support indirect command buffers, MSAA depth resolve, and stencil + * resolve/feedback, but these are not exposed features in SDL_GPU.) + * * \param props the properties to use. * \returns a GPU context on success or NULL on failure; call SDL_GetError() * for more information. @@ -2351,8 +2376,11 @@ extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDeviceWithProperties( #define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN "SDL.gpu.device.create.shaders.metallib" #define SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN "SDL.gpu.device.create.d3d12.allowtier1resourcebinding" #define SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING "SDL.gpu.device.create.d3d12.semantic" -#define SDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN "SDL.gpu.device.create.vulkan.requirehardwareacceleration" +#define SDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER "SDL.gpu.device.create.d3d12.agility_sdk_version" +#define SDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING "SDL.gpu.device.create.d3d12.agility_sdk_path" +#define SDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN "SDL.gpu.device.create.vulkan.requirehardwareacceleration" #define SDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER "SDL.gpu.device.create.vulkan.options" +#define SDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN "SDL.gpu.device.create.metal.allowmacfamily1" /** diff --git a/vendor/sdl3/include/SDL_guid.h b/vendor/sdl3/include/SDL_guid.h index 312c42c03..cf9df31ce 100644 --- a/vendor/sdl3/include/SDL_guid.h +++ b/vendor/sdl3/include/SDL_guid.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_haptic.h b/vendor/sdl3/include/SDL_haptic.h index 9a20396d3..1cd9ddc0d 100644 --- a/vendor/sdl3/include/SDL_haptic.h +++ b/vendor/sdl3/include/SDL_haptic.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_hidapi.h b/vendor/sdl3/include/SDL_hidapi.h index 67e29c2a1..90e574c41 100644 --- a/vendor/sdl3/include/SDL_hidapi.h +++ b/vendor/sdl3/include/SDL_hidapi.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_hints.h b/vendor/sdl3/include/SDL_hints.h index 474e97f04..857dfcec1 100644 --- a/vendor/sdl3/include/SDL_hints.h +++ b/vendor/sdl3/include/SDL_hints.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -1095,7 +1095,7 @@ extern "C" { * * This hint should be set before SDL is initialized. * - * \since This hint is available since SDL 3.2.0. + * \since This hint is available since SDL 3.4.0. */ #define SDL_HINT_HIDAPI_LIBUSB_GAMECUBE "SDL_HIDAPI_LIBUSB_GAMECUBE" @@ -1778,10 +1778,16 @@ extern "C" { * A variable controlling whether the HIDAPI driver for HORI licensed Steam * controllers should be used. * - * This variable can be set to the following values: "0" - HIDAPI driver is - * not used "1" - HIDAPI driver is used + * The variable can be set to the following values: * - * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + * - "0": HIDAPI driver is not used. + * - "1": HIDAPI driver is used. + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. + * + * This hint should be set before initializing joysticks and gamepads. + * + * \since This hint is available since SDL 3.2.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_STEAM_HORI "SDL_JOYSTICK_HIDAPI_STEAM_HORI" @@ -1789,12 +1795,16 @@ extern "C" { * A variable controlling whether the HIDAPI driver for some Logitech wheels * should be used. * - * This variable can be set to the following values: + * The variable can be set to the following values: * - * - "0": HIDAPI driver is not used - * - "1": HIDAPI driver is used + * - "0": HIDAPI driver is not used. + * - "1": HIDAPI driver is used. * - * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. + * + * This hint should be set before initializing joysticks and gamepads. + * + * \since This hint is available since SDL 3.4.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_LG4FF "SDL_JOYSTICK_HIDAPI_LG4FF" @@ -1802,11 +1812,16 @@ extern "C" { * A variable controlling whether the HIDAPI driver for 8BitDo controllers * should be used. * - * This variable can be set to the following values: + * The variable can be set to the following values: * - * "0" - HIDAPI driver is not used. "1" - HIDAPI driver is used. + * - "0": HIDAPI driver is not used. + * - "1": HIDAPI driver is used. * - * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. + * + * This hint should be set before initializing joysticks and gamepads. + * + * \since This hint is available since SDL 3.4.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_8BITDO "SDL_JOYSTICK_HIDAPI_8BITDO" @@ -1816,11 +1831,16 @@ extern "C" { * * More info - https://github.com/HandHeldLegend/SInput-HID * - * This variable can be set to the following values: + * The variable can be set to the following values: * - * "0" - HIDAPI driver is not used. "1" - HIDAPI driver is used. + * - "0": HIDAPI driver is not used. + * - "1": HIDAPI driver is used. * - * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. + * + * This hint should be set before initializing joysticks and gamepads. + * + * \since This hint is available since SDL 3.4.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_SINPUT "SDL_JOYSTICK_HIDAPI_SINPUT" @@ -1828,11 +1848,16 @@ extern "C" { * A variable controlling whether the HIDAPI driver for ZUIKI controllers * should be used. * - * This variable can be set to the following values: + * The variable can be set to the following values: * - * "0" - HIDAPI driver is not used. "1" - HIDAPI driver is used. + * - "0": HIDAPI driver is not used. + * - "1": HIDAPI driver is used. * - * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. + * + * This hint should be set before initializing joysticks and gamepads. + * + * \since This hint is available since SDL 3.4.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_ZUIKI "SDL_JOYSTICK_HIDAPI_ZUIKI" @@ -1840,11 +1865,16 @@ extern "C" { * A variable controlling whether the HIDAPI driver for Flydigi controllers * should be used. * - * This variable can be set to the following values: + * The variable can be set to the following values: * - * "0" - HIDAPI driver is not used. "1" - HIDAPI driver is used. + * - "0": HIDAPI driver is not used. + * - "1": HIDAPI driver is used. * - * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI. + * + * This hint should be set before initializing joysticks and gamepads. + * + * \since This hint is available since SDL 3.4.0. */ #define SDL_HINT_JOYSTICK_HIDAPI_FLYDIGI "SDL_JOYSTICK_HIDAPI_FLYDIGI" @@ -2619,8 +2649,8 @@ extern "C" { * * The variable can be set to the following values: * - * - "0": Holding a key will open the accents menu for that key. - * - "1": Holding a key will repeat the pressed key. (default) + * - "0": Holding a key will repeat the pressed key. + * - "1": Holding a key will open the accents menu for that key. (default) * * This hint needs to be set before SDL_Init(). * @@ -2976,6 +3006,46 @@ extern "C" { */ #define SDL_HINT_OPENGL_ES_DRIVER "SDL_OPENGL_ES_DRIVER" +/** + * A variable controlling whether to force an sRGB-capable OpenGL context. + * + * At OpenGL context creation time, some platforms can request an sRGB-capable + * context. However, sometimes any form of the request can cause surprising + * results on some drivers, platforms, and hardware. Usually the surprise is + * in the form of rendering that is either a little darker or a little + * brighter than intended. + * + * This hint allows the user to override the app's sRGB requests and either + * force a specific value, or avoid requesting anything at all, depending on + * what makes things work correctly for their system. + * + * This is meant as a fail-safe; apps should probably not explicitly set this, + * and most users should not, either. + * + * Note that some platforms cannot make this request at all, and on all + * platforms this request can be denied by the operating system. + * + * In addition to attempting to obtain the type of sRGB-capable OpenGL context + * requested by this hint, SDL will try to force the state of + * GL_FRAMEBUFFER_SRGB on the new context, if appropriate. + * + * The variable can be set to the following values: + * + * - "0": Force a request for an OpenGL context that is _not_ sRGB-capable. + * - "1": Force a request for an OpenGL context that _is_ sRGB-capable. + * - "skip": Don't make any request for an sRGB-capable context + * (don't specify the attribute at all during context creation time). + * - any other string is undefined behavior. + * + * If unset, or set to an empty string, SDL will make a request using the + * value the app specified with the SDL_GL_FRAMEBUFFER_SRGB_CAPABLE attribute. + * + * This hint should be set before an OpenGL context is created. + * + * \since This hint is available since SDL 3.4.2. + */ +#define SDL_HINT_OPENGL_FORCE_SRGB_FRAMEBUFFER "SDL_OPENGL_FORCE_SRGB_FRAMEBUFFER" + /** * Mechanism to specify openvr_api library location * @@ -3300,33 +3370,45 @@ extern "C" { #define SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED "SDL_ROG_GAMEPAD_MICE_EXCLUDED" /** - * Variable controlling the width of the PS2's framebuffer in pixels + * A variable controlling the width of the PS2's framebuffer in pixels. * - * By default, this variable is "640" + * By default, the variable is "640". + * + * \since This hint is available since SDL 3.4.0. */ #define SDL_HINT_PS2_GS_WIDTH "SDL_PS2_GS_WIDTH" /** - * Variable controlling the height of the PS2's framebuffer in pixels + * A variable controlling the height of the PS2's framebuffer in pixels. * - * By default, this variable is "448" + * By default, the variable is "448". + * + * \since This hint is available since SDL 3.4.0. */ #define SDL_HINT_PS2_GS_HEIGHT "SDL_PS2_GS_HEIGHT" /** - * Variable controlling whether the signal is interlaced or progressive + * A variable controlling whether the signal is interlaced or progressive. + * + * The variable can be set to the following values: * * - "0": Image is interlaced. (default) - * - "1": Image is progressive + * - "1": Image is progressive. + * + * \since This hint is available since SDL 3.4.0. */ #define SDL_HINT_PS2_GS_PROGRESSIVE "SDL_PS2_GS_PROGRESSIVE" /** - * Variable controlling the video mode of the console + * A variable controlling the video mode of the console. + * + * The variable can be set to the following values: * * - "": Console-native. (default) - * - "NTSC": 60hz region - * - "PAL": 50hz region + * - "NTSC": 60hz region. + * - "PAL": 50hz region. + * + * \since This hint is available since SDL 3.4.0. */ #define SDL_HINT_PS2_GS_MODE "SDL_PS2_GS_MODE" diff --git a/vendor/sdl3/include/SDL_init.h b/vendor/sdl3/include/SDL_init.h index 557f2b995..d75ccc31d 100644 --- a/vendor/sdl3/include/SDL_init.h +++ b/vendor/sdl3/include/SDL_init.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -224,6 +224,8 @@ typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate, SDL_AppResult result); * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SetAppMetadata @@ -244,6 +246,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_Init(SDL_InitFlags flags); * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_Init @@ -260,6 +264,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_InitSubSystem(SDL_InitFlags flags); * * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_InitSubSystem @@ -274,6 +280,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_QuitSubSystem(SDL_InitFlags flags); * \returns a mask of all initialized subsystems if `flags` is 0, otherwise it * returns the initialization status of the specified subsystems. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_Init @@ -292,6 +300,8 @@ extern SDL_DECLSPEC SDL_InitFlags SDLCALL SDL_WasInit(SDL_InitFlags flags); * application is shutdown, but it is not wise to do this from a library or * other dynamically loaded code. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_Init diff --git a/vendor/sdl3/include/SDL_intrin.h b/vendor/sdl3/include/SDL_intrin.h index 802c1953b..59a3831e2 100644 --- a/vendor/sdl3/include/SDL_intrin.h +++ b/vendor/sdl3/include/SDL_intrin.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_iostream.h b/vendor/sdl3/include/SDL_iostream.h index dfe6f6a9c..f369fde17 100644 --- a/vendor/sdl3/include/SDL_iostream.h +++ b/vendor/sdl3/include/SDL_iostream.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_joystick.h b/vendor/sdl3/include/SDL_joystick.h index af04f0979..c93b35210 100644 --- a/vendor/sdl3/include/SDL_joystick.h +++ b/vendor/sdl3/include/SDL_joystick.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_keyboard.h b/vendor/sdl3/include/SDL_keyboard.h index eb984de58..d14ab6fb2 100644 --- a/vendor/sdl3/include/SDL_keyboard.h +++ b/vendor/sdl3/include/SDL_keyboard.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_keycode.h b/vendor/sdl3/include/SDL_keycode.h index c43660eef..1818ee3e4 100644 --- a/vendor/sdl3/include/SDL_keycode.h +++ b/vendor/sdl3/include/SDL_keycode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_loadso.h b/vendor/sdl3/include/SDL_loadso.h index f8649d758..51d0d8811 100644 --- a/vendor/sdl3/include/SDL_loadso.h +++ b/vendor/sdl3/include/SDL_loadso.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_locale.h b/vendor/sdl3/include/SDL_locale.h index 902843e81..9f03aa90d 100644 --- a/vendor/sdl3/include/SDL_locale.h +++ b/vendor/sdl3/include/SDL_locale.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -102,6 +102,8 @@ typedef struct SDL_Locale * allocation that should be freed with SDL_free() when it is no * longer needed. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Locale ** SDLCALL SDL_GetPreferredLocales(int *count); diff --git a/vendor/sdl3/include/SDL_log.h b/vendor/sdl3/include/SDL_log.h index aceaabe77..2ae0963c2 100644 --- a/vendor/sdl3/include/SDL_log.h +++ b/vendor/sdl3/include/SDL_log.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_main.h b/vendor/sdl3/include/SDL_main.h index ff497a4c3..ee4d9ca71 100644 --- a/vendor/sdl3/include/SDL_main.h +++ b/vendor/sdl3/include/SDL_main.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -333,6 +333,8 @@ extern "C" { * \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to * terminate with success, SDL_APP_CONTINUE to continue. * + * \threadsafety This function is called once by SDL, at startup, on a single thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_AppIterate @@ -537,6 +539,8 @@ extern SDLMAIN_DECLSPEC int SDLCALL SDL_main(int argc, char *argv[]); * will not be changed it is necessary to define SDL_MAIN_HANDLED before * including SDL.h. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_Init @@ -629,6 +633,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_EnterAppMainCallbacks(int argc, char *argv[] * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst); @@ -646,6 +652,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, * deregistered when the registration counter in SDL_RegisterApp decrements to * zero through calls to this function. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_UnregisterApp(void); @@ -658,6 +666,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnregisterApp(void); * This function is only needed for Xbox GDK support; all other platforms will * do nothing and set an "unsupported" error message. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void); diff --git a/vendor/sdl3/include/SDL_main_impl.h b/vendor/sdl3/include/SDL_main_impl.h index 14ebb4291..bf5f58363 100644 --- a/vendor/sdl3/include/SDL_main_impl.h +++ b/vendor/sdl3/include/SDL_main_impl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_messagebox.h b/vendor/sdl3/include/SDL_messagebox.h index 365ae36a5..af604e2c7 100644 --- a/vendor/sdl3/include/SDL_messagebox.h +++ b/vendor/sdl3/include/SDL_messagebox.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -168,6 +168,8 @@ typedef struct SDL_MessageBoxData * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowSimpleMessageBox @@ -210,6 +212,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *me * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_ShowMessageBox diff --git a/vendor/sdl3/include/SDL_metal.h b/vendor/sdl3/include/SDL_metal.h index 14b1bc87a..6b0e171b4 100644 --- a/vendor/sdl3/include/SDL_metal.h +++ b/vendor/sdl3/include/SDL_metal.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -65,6 +65,8 @@ typedef void *SDL_MetalView; * \param window the window. * \returns handle NSView or UIView. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_Metal_DestroyView @@ -80,6 +82,8 @@ extern SDL_DECLSPEC SDL_MetalView SDLCALL SDL_Metal_CreateView(SDL_Window *windo * * \param view the SDL_MetalView object. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_Metal_CreateView @@ -92,6 +96,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_Metal_DestroyView(SDL_MetalView view); * \param view the SDL_MetalView object. * \returns a pointer. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void * SDLCALL SDL_Metal_GetLayer(SDL_MetalView view); diff --git a/vendor/sdl3/include/SDL_misc.h b/vendor/sdl3/include/SDL_misc.h index 3dd6fcddd..654c00558 100644 --- a/vendor/sdl3/include/SDL_misc.h +++ b/vendor/sdl3/include/SDL_misc.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -65,6 +65,8 @@ extern "C" { * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_OpenURL(const char *url); diff --git a/vendor/sdl3/include/SDL_mouse.h b/vendor/sdl3/include/SDL_mouse.h index d502005a7..fb03c0178 100644 --- a/vendor/sdl3/include/SDL_mouse.h +++ b/vendor/sdl3/include/SDL_mouse.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_mutex.h b/vendor/sdl3/include/SDL_mutex.h index 024ce0b37..e477e2d30 100644 --- a/vendor/sdl3/include/SDL_mutex.h +++ b/vendor/sdl3/include/SDL_mutex.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -308,6 +308,8 @@ typedef struct SDL_Mutex SDL_Mutex; * \returns the initialized and unlocked mutex or NULL on failure; call * SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyMutex @@ -334,6 +336,8 @@ extern SDL_DECLSPEC SDL_Mutex * SDLCALL SDL_CreateMutex(void); * * \param mutex the mutex to lock. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_TryLockMutex @@ -355,6 +359,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockMutex(SDL_Mutex *mutex) SDL_ACQUIRE(mut * \param mutex the mutex to try to lock. * \returns true on success, false if the mutex would block. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_LockMutex @@ -374,6 +380,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ACQU * * \param mutex the mutex to unlock. * + * \threadsafety This call must be paired with a previous locking call on the same thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_LockMutex @@ -392,6 +400,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockMutex(SDL_Mutex *mutex) SDL_RELEASE(m * * \param mutex the mutex to destroy. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateMutex @@ -457,6 +467,8 @@ typedef struct SDL_RWLock SDL_RWLock; * \returns the initialized and unlocked read/write lock or NULL on failure; * call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroyRWLock @@ -497,6 +509,8 @@ extern SDL_DECLSPEC SDL_RWLock * SDLCALL SDL_CreateRWLock(void); * * \param rwlock the read/write lock to lock. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForWriting @@ -528,6 +542,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForReading(SDL_RWLock *rwlock) SD * * \param rwlock the read/write lock to lock. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading @@ -553,6 +569,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForWriting(SDL_RWLock *rwlock) SD * \param rwlock the rwlock to try to lock. * \returns true on success, false if the lock would block. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading @@ -583,6 +601,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwlock) * \param rwlock the rwlock to try to lock. * \returns true on success, false if the lock would block. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForWriting @@ -607,6 +627,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock) * * \param rwlock the rwlock to unlock. * + * \threadsafety This call must be paired with a previous locking call on the same thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_LockRWLockForReading @@ -627,6 +649,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_UnlockRWLock(SDL_RWLock *rwlock) SDL_RELEAS * * \param rwlock the rwlock to destroy. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateRWLock @@ -670,6 +694,8 @@ typedef struct SDL_Semaphore SDL_Semaphore; * \returns a new semaphore or NULL on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_DestroySemaphore @@ -689,6 +715,8 @@ extern SDL_DECLSPEC SDL_Semaphore * SDLCALL SDL_CreateSemaphore(Uint32 initial_v * * \param sem the semaphore to destroy. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateSemaphore @@ -707,6 +735,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_Semaphore *sem); * * \param sem the semaphore wait on. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore @@ -726,6 +756,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitSemaphore(SDL_Semaphore *sem); * \param sem the semaphore to wait on. * \returns true if the wait succeeds, false if the wait would block. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore @@ -746,6 +778,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TryWaitSemaphore(SDL_Semaphore *sem); * indefinitely. * \returns true if the wait succeeds or false if the wait times out. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SignalSemaphore @@ -759,6 +793,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_WaitSemaphoreTimeout(SDL_Semaphore *sem, Si * * \param sem the semaphore to increment. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_TryWaitSemaphore @@ -773,6 +809,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_SignalSemaphore(SDL_Semaphore *sem); * \param sem the semaphore to query. * \returns the current value of the semaphore. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetSemaphoreValue(SDL_Semaphore *sem); @@ -806,6 +844,8 @@ typedef struct SDL_Condition SDL_Condition; * \returns a new condition variable or NULL on failure; call SDL_GetError() * for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_BroadcastCondition @@ -821,6 +861,8 @@ extern SDL_DECLSPEC SDL_Condition * SDLCALL SDL_CreateCondition(void); * * \param cond the condition variable to destroy. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateCondition diff --git a/vendor/sdl3/include/SDL_oldnames.h b/vendor/sdl3/include/SDL_oldnames.h index c93607e3f..b9f88b295 100644 --- a/vendor/sdl3/include/SDL_oldnames.h +++ b/vendor/sdl3/include/SDL_oldnames.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_opengl.h b/vendor/sdl3/include/SDL_opengl.h index d1b8b02a3..733f2b51a 100644 --- a/vendor/sdl3/include/SDL_opengl.h +++ b/vendor/sdl3/include/SDL_opengl.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_opengles.h b/vendor/sdl3/include/SDL_opengles.h index 4fb9a4b70..227f51be4 100644 --- a/vendor/sdl3/include/SDL_opengles.h +++ b/vendor/sdl3/include/SDL_opengles.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_opengles2.h b/vendor/sdl3/include/SDL_opengles2.h index 365898a65..2c746143f 100644 --- a/vendor/sdl3/include/SDL_opengles2.h +++ b/vendor/sdl3/include/SDL_opengles2.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_pen.h b/vendor/sdl3/include/SDL_pen.h index 97c22e506..978e0b6fd 100644 --- a/vendor/sdl3/include/SDL_pen.h +++ b/vendor/sdl3/include/SDL_pen.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_pixels.h b/vendor/sdl3/include/SDL_pixels.h index 54ef954ed..475e5f9c3 100644 --- a/vendor/sdl3/include/SDL_pixels.h +++ b/vendor/sdl3/include/SDL_pixels.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_platform.h b/vendor/sdl3/include/SDL_platform.h index e40f009ba..9ad380bab 100644 --- a/vendor/sdl3/include/SDL_platform.h +++ b/vendor/sdl3/include/SDL_platform.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -51,6 +51,8 @@ extern "C" { * \returns the name of the platform. If the correct platform name is not * available, returns a string beginning with the text "Unknown". * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetPlatform(void); diff --git a/vendor/sdl3/include/SDL_platform_defines.h b/vendor/sdl3/include/SDL_platform_defines.h index 7de110e03..79631491d 100644 --- a/vendor/sdl3/include/SDL_platform_defines.h +++ b/vendor/sdl3/include/SDL_platform_defines.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_power.h b/vendor/sdl3/include/SDL_power.h index bc2d9d53e..0616cc275 100644 --- a/vendor/sdl3/include/SDL_power.h +++ b/vendor/sdl3/include/SDL_power.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -93,6 +93,8 @@ typedef enum SDL_PowerState * \returns the current battery state or `SDL_POWERSTATE_ERROR` on failure; * call SDL_GetError() for more information. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetPowerInfo(int *seconds, int *percent); diff --git a/vendor/sdl3/include/SDL_process.h b/vendor/sdl3/include/SDL_process.h index 57e3afd94..b797890d8 100644 --- a/vendor/sdl3/include/SDL_process.h +++ b/vendor/sdl3/include/SDL_process.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_properties.h b/vendor/sdl3/include/SDL_properties.h index 8e87dfce4..abd7b2aa5 100644 --- a/vendor/sdl3/include/SDL_properties.h +++ b/vendor/sdl3/include/SDL_properties.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -111,6 +111,8 @@ typedef enum SDL_PropertyType * \returns a valid property ID on success or 0 on failure; call * SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGlobalProperties(void); diff --git a/vendor/sdl3/include/SDL_rect.h b/vendor/sdl3/include/SDL_rect.h index 56eb6ffe6..883ca8d6c 100644 --- a/vendor/sdl3/include/SDL_rect.h +++ b/vendor/sdl3/include/SDL_rect.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -237,6 +237,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasRectIntersection(const SDL_Rect *A, cons * rectangles `A` and `B`. * \returns true if there is an intersection, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_HasRectIntersection @@ -253,6 +255,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectIntersection(const SDL_Rect *A, cons * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result); @@ -272,6 +276,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const SDL_R * \returns true if any points were enclosed or false if all the points were * outside of the clipping rectangle. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point *points, int count, const SDL_Rect *clip, SDL_Rect *result); @@ -292,6 +298,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point *poi * \param Y2 a pointer to the ending Y-coordinate of the line. * \returns true if there is an intersection, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersection(const SDL_Rect *rect, int *X1, int *Y1, int *X2, int *Y2); @@ -423,6 +431,8 @@ SDL_FORCE_INLINE bool SDL_RectsEqualFloat(const SDL_FRect *a, const SDL_FRect *b * \param B an SDL_FRect structure representing the second rectangle. * \returns true if there is an intersection, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRectIntersection @@ -440,6 +450,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasRectIntersectionFloat(const SDL_FRect *A * rectangles `A` and `B`. * \returns true if there is an intersection, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_HasRectIntersectionFloat @@ -456,6 +468,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectIntersectionFloat(const SDL_FRect *A * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result); @@ -476,6 +490,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, const * \returns true if any points were enclosed or false if all the points were * outside of the clipping rectangle. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_FPoint *points, int count, const SDL_FRect *clip, SDL_FRect *result); @@ -497,6 +513,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_FPoin * \param Y2 a pointer to the ending Y-coordinate of the line. * \returns true if there is an intersection, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersectionFloat(const SDL_FRect *rect, float *X1, float *Y1, float *X2, float *Y2); diff --git a/vendor/sdl3/include/SDL_render.h b/vendor/sdl3/include/SDL_render.h index 3d5139f59..87257d115 100644 --- a/vendor/sdl3/include/SDL_render.h +++ b/vendor/sdl3/include/SDL_render.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -2509,6 +2509,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.4.0. * * \sa SDL_RenderGeometry @@ -2530,6 +2532,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetRenderTextureAddressMode(SDL_Renderer *r * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.4.0. * * \sa SDL_SetRenderTextureAddressMode @@ -2963,7 +2967,7 @@ typedef struct SDL_GPURenderState SDL_GPURenderState; * \sa SDL_SetGPURenderState * \sa SDL_DestroyGPURenderState */ -extern SDL_DECLSPEC SDL_GPURenderState * SDLCALL SDL_CreateGPURenderState(SDL_Renderer *renderer, SDL_GPURenderStateCreateInfo *createinfo); +extern SDL_DECLSPEC SDL_GPURenderState * SDLCALL SDL_CreateGPURenderState(SDL_Renderer *renderer, const SDL_GPURenderStateCreateInfo *createinfo); /** * Set fragment shader uniform variables in a custom GPU render state. diff --git a/vendor/sdl3/include/SDL_revision.h b/vendor/sdl3/include/SDL_revision.h index d4e850ece..3441b119c 100644 --- a/vendor/sdl3/include/SDL_revision.h +++ b/vendor/sdl3/include/SDL_revision.h @@ -1,22 +1,22 @@ /* - Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Simple DirectMedia Layer + Copyright (C) 1997-2026 Sam Lantinga - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. */ /* WIKI CATEGORY: Version */ @@ -44,16 +44,13 @@ * clue in debugging forensics and not something the app will parse in any * way. * - * SDL_revision.h must be included in your program explicitly if you want - * access to the SDL_REVISION constant. - * - * \since This macro is available since SDL 3.2.0. + * \since This macro is available since SDL 3.0.0. */ #define SDL_REVISION "Some arbitrary string decided at SDL build time" #elif defined(SDL_VENDOR_INFO) -#define SDL_REVISION SDL_VENDOR_INFO +#define SDL_REVISION "SDL-release-3.4.2-0-g683181b47 (" SDL_VENDOR_INFO ")" #else -#define SDL_REVISION "" +#define SDL_REVISION "SDL-release-3.4.2-0-g683181b47" #endif #endif /* SDL_revision_h_ */ diff --git a/vendor/sdl3/include/SDL_scancode.h b/vendor/sdl3/include/SDL_scancode.h index 6e9be47e6..cd5a1376a 100644 --- a/vendor/sdl3/include/SDL_scancode.h +++ b/vendor/sdl3/include/SDL_scancode.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_sensor.h b/vendor/sdl3/include/SDL_sensor.h index 43366f135..bf890472f 100644 --- a/vendor/sdl3/include/SDL_sensor.h +++ b/vendor/sdl3/include/SDL_sensor.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_stdinc.h b/vendor/sdl3/include/SDL_stdinc.h index f15ab727b..1c4d8da63 100644 --- a/vendor/sdl3/include/SDL_stdinc.h +++ b/vendor/sdl3/include/SDL_stdinc.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -254,12 +254,6 @@ void *alloca(size_t); /** * Macro useful for building other macros with strings in them. * - * For example: - * - * ```c - * #define LOG_ERROR(X) OutputDebugString(SDL_STRINGIFY_ARG(__FUNCTION__) ": " X "\n")` - * ``` - * * \param arg the text to turn into a string literal. * * \since This macro is available since SDL 3.2.0. @@ -5821,6 +5815,8 @@ typedef struct SDL_iconv_data_t *SDL_iconv_t; * \returns a handle that must be freed with SDL_iconv_close, or * SDL_ICONV_ERROR on failure. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv @@ -5836,6 +5832,8 @@ extern SDL_DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, * \param cd The character set conversion handle. * \returns 0 on success, or -1 on failure. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv @@ -5874,6 +5872,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); * \param outbytesleft The number of bytes in the output buffer. * \returns the number of conversions on success, or a negative error code. * + * \threadsafety Do not use the same SDL_iconv_t from two threads at once. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv_open @@ -5909,6 +5909,8 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, * \param inbytesleft the size of the input string _in bytes_. * \returns a new string, converted to the new encoding, or NULL on error. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_iconv_open @@ -5932,6 +5934,8 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * \param S the string to convert. * \returns a new string, converted to the new encoding, or NULL on error. * + * \threadsafety It is safe to call this macro from any thread. + * * \since This macro is available since SDL 3.2.0. */ #define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) @@ -5946,6 +5950,8 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * \param S the string to convert. * \returns a new string, converted to the new encoding, or NULL on error. * + * \threadsafety It is safe to call this macro from any thread. + * * \since This macro is available since SDL 3.2.0. */ #define SDL_iconv_utf8_ucs2(S) SDL_reinterpret_cast(Uint16 *, SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1)) @@ -5960,6 +5966,8 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * \param S the string to convert. * \returns a new string, converted to the new encoding, or NULL on error. * + * \threadsafety It is safe to call this macro from any thread. + * * \since This macro is available since SDL 3.2.0. */ #define SDL_iconv_utf8_ucs4(S) SDL_reinterpret_cast(Uint32 *, SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1)) @@ -5974,6 +5982,8 @@ extern SDL_DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, * \param S the string to convert. * \returns a new string, converted to the new encoding, or NULL on error. * + * \threadsafety It is safe to call this macro from any thread. + * * \since This macro is available since SDL 3.2.0. */ #define SDL_iconv_wchar_utf8(S) SDL_iconv_string("UTF-8", "WCHAR_T", SDL_reinterpret_cast(const char *, S), (SDL_wcslen(S)+1)*sizeof(wchar_t)) diff --git a/vendor/sdl3/include/SDL_storage.h b/vendor/sdl3/include/SDL_storage.h index 1b20b34ad..71d403c74 100644 --- a/vendor/sdl3/include/SDL_storage.h +++ b/vendor/sdl3/include/SDL_storage.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_surface.h b/vendor/sdl3/include/SDL_surface.h index 717aeb89a..885f8f5d9 100644 --- a/vendor/sdl3/include/SDL_surface.h +++ b/vendor/sdl3/include/SDL_surface.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_system.h b/vendor/sdl3/include/SDL_system.h index 625db182e..ec23a1fe7 100644 --- a/vendor/sdl3/include/SDL_system.h +++ b/vendor/sdl3/include/SDL_system.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -86,6 +86,8 @@ typedef bool (SDLCALL *SDL_WindowsMessageHook)(void *userdata, MSG *msg); * \param callback the SDL_WindowsMessageHook function to call. * \param userdata a pointer to pass to every iteration of `callback`. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_WindowsMessageHook @@ -169,6 +171,8 @@ typedef bool (SDLCALL *SDL_X11EventHook)(void *userdata, XEvent *xevent); * \param callback the SDL_X11EventHook function to call. * \param userdata a pointer to pass to every iteration of `callback`. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_SetX11EventHook(SDL_X11EventHook callback, void *userdata); @@ -186,6 +190,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_SetX11EventHook(SDL_X11EventHook callback, * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriority(Sint64 threadID, int priority); @@ -202,6 +208,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriority(Sint64 threadID, int * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetLinuxThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy); @@ -264,6 +272,8 @@ typedef void (SDLCALL *SDL_iOSAnimationCallback)(void *userdata); * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SetiOSEventPump @@ -277,6 +287,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetiOSAnimationCallback(SDL_Window *window, * * \param enabled true to enable the event pump, false to disable it. * + * \threadsafety This function should only be called on the main thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_SetiOSAnimationCallback @@ -370,6 +382,8 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetAndroidActivity(void); * * \returns the Android API level. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetAndroidSDKVersion(void); @@ -379,6 +393,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetAndroidSDKVersion(void); * * \returns true if this is a Chromebook, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_IsChromebook(void); @@ -388,6 +404,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsChromebook(void); * * \returns true if this is a DeX docking station, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_IsDeXMode(void); @@ -605,6 +623,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SendAndroidMessage(Uint32 command, int para * * \returns true if the device is a tablet, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_IsTablet(void); @@ -616,6 +636,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_IsTablet(void); * * \returns true if the device is a TV, false otherwise. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_IsTV(void); diff --git a/vendor/sdl3/include/SDL_test.h b/vendor/sdl3/include/SDL_test.h index 8b285807c..59a3dd846 100644 --- a/vendor/sdl3/include/SDL_test.h +++ b/vendor/sdl3/include/SDL_test.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_test_assert.h b/vendor/sdl3/include/SDL_test_assert.h index c067608a5..ff41b31b9 100644 --- a/vendor/sdl3/include/SDL_test_assert.h +++ b/vendor/sdl3/include/SDL_test_assert.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_test_common.h b/vendor/sdl3/include/SDL_test_common.h index 81cea7788..6afd85779 100644 --- a/vendor/sdl3/include/SDL_test_common.h +++ b/vendor/sdl3/include/SDL_test_common.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_test_compare.h b/vendor/sdl3/include/SDL_test_compare.h index 1903549c5..58e55134e 100644 --- a/vendor/sdl3/include/SDL_test_compare.h +++ b/vendor/sdl3/include/SDL_test_compare.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_test_crc32.h b/vendor/sdl3/include/SDL_test_crc32.h index 94fe1a345..f563d5dd2 100644 --- a/vendor/sdl3/include/SDL_test_crc32.h +++ b/vendor/sdl3/include/SDL_test_crc32.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_test_font.h b/vendor/sdl3/include/SDL_test_font.h index fb4079497..f5b567454 100644 --- a/vendor/sdl3/include/SDL_test_font.h +++ b/vendor/sdl3/include/SDL_test_font.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_test_fuzzer.h b/vendor/sdl3/include/SDL_test_fuzzer.h index caf11f252..e8ebc45c9 100644 --- a/vendor/sdl3/include/SDL_test_fuzzer.h +++ b/vendor/sdl3/include/SDL_test_fuzzer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_test_harness.h b/vendor/sdl3/include/SDL_test_harness.h index 5d4963e77..37710455b 100644 --- a/vendor/sdl3/include/SDL_test_harness.h +++ b/vendor/sdl3/include/SDL_test_harness.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_test_log.h b/vendor/sdl3/include/SDL_test_log.h index 718baa5b7..13933da95 100644 --- a/vendor/sdl3/include/SDL_test_log.h +++ b/vendor/sdl3/include/SDL_test_log.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_test_md5.h b/vendor/sdl3/include/SDL_test_md5.h index e9d96398a..7b86b05f7 100644 --- a/vendor/sdl3/include/SDL_test_md5.h +++ b/vendor/sdl3/include/SDL_test_md5.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_test_memory.h b/vendor/sdl3/include/SDL_test_memory.h index 1bd946674..f07f1cba9 100644 --- a/vendor/sdl3/include/SDL_test_memory.h +++ b/vendor/sdl3/include/SDL_test_memory.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_thread.h b/vendor/sdl3/include/SDL_thread.h index bde1bbcd7..f74317cc6 100644 --- a/vendor/sdl3/include/SDL_thread.h +++ b/vendor/sdl3/include/SDL_thread.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -208,6 +208,8 @@ typedef int (SDLCALL *SDL_ThreadFunction) (void *data); * new thread could not be created; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThreadWithProperties @@ -274,6 +276,8 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(SDL_ThreadFunction fn, * new thread could not be created; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread @@ -329,6 +333,8 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithProperties(SDL_Prop * new thread could not be created; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadRuntime(SDL_ThreadFunction fn, const char *name, void *data, SDL_FunctionPointer pfnBeginThread, SDL_FunctionPointer pfnEndThread); @@ -343,6 +349,8 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadRuntime(SDL_ThreadFunct * new thread could not be created; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithPropertiesRuntime(SDL_PropertiesID props, SDL_FunctionPointer pfnBeginThread, SDL_FunctionPointer pfnEndThread); @@ -363,6 +371,8 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithPropertiesRuntime(S * \returns a pointer to a UTF-8 string that names the specified thread, or * NULL if it doesn't have a name. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC const char * SDLCALL SDL_GetThreadName(SDL_Thread *thread); @@ -379,6 +389,8 @@ extern SDL_DECLSPEC const char * SDLCALL SDL_GetThreadName(SDL_Thread *thread); * * \returns the ID of the current thread. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetThreadID @@ -396,6 +408,8 @@ extern SDL_DECLSPEC SDL_ThreadID SDLCALL SDL_GetCurrentThreadID(void); * \returns the ID of the specified thread, or the ID of the current thread if * `thread` is NULL. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetCurrentThreadID @@ -413,6 +427,8 @@ extern SDL_DECLSPEC SDL_ThreadID SDLCALL SDL_GetThreadID(SDL_Thread *thread); * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_SetCurrentThreadPriority(SDL_ThreadPriority priority); @@ -445,6 +461,9 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetCurrentThreadPriority(SDL_ThreadPriority * function by its 'return', or -1 if the thread has been * detached or isn't valid, may be NULL. * + * \threadsafety It is safe to call this function from any thread, but only + * a single thread can wait any specific thread to finish. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_CreateThread @@ -459,6 +478,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status) * \returns the current state of a thread, or SDL_THREAD_UNKNOWN if the thread * isn't valid. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_ThreadState @@ -491,6 +512,8 @@ extern SDL_DECLSPEC SDL_ThreadState SDLCALL SDL_GetThreadState(SDL_Thread *threa * * It is safe to pass NULL to this function; it is a no-op. * + * \threadsafety It is safe to call this function from any thread. + * * \param thread the SDL_Thread pointer that was returned from the * SDL_CreateThread() call that started this thread. * diff --git a/vendor/sdl3/include/SDL_time.h b/vendor/sdl3/include/SDL_time.h index b6d3f6d0d..2ae6022f9 100644 --- a/vendor/sdl3/include/SDL_time.h +++ b/vendor/sdl3/include/SDL_time.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer -Copyright (C) 1997-2025 Sam Lantinga +Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -106,6 +106,8 @@ typedef enum SDL_TimeFormat * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety This function is not thread safe. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetDateTimeLocalePreferences(SDL_DateFormat *dateFormat, SDL_TimeFormat *timeFormat); @@ -118,6 +120,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetDateTimeLocalePreferences(SDL_DateFormat * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_GetCurrentTime(SDL_Time *ticks); @@ -134,6 +138,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_GetCurrentTime(SDL_Time *ticks); * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_TimeToDateTime(SDL_Time ticks, SDL_DateTime *dt, bool localTime); @@ -149,6 +155,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_TimeToDateTime(SDL_Time ticks, SDL_DateTime * \returns true on success or false on failure; call SDL_GetError() for more * information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC bool SDLCALL SDL_DateTimeToTime(const SDL_DateTime *dt, SDL_Time *ticks); @@ -165,6 +173,8 @@ extern SDL_DECLSPEC bool SDLCALL SDL_DateTimeToTime(const SDL_DateTime *dt, SDL_ * \param dwHighDateTime a pointer filled in with the high portion of the * Windows FILETIME value. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC void SDLCALL SDL_TimeToWindows(SDL_Time ticks, Uint32 *dwLowDateTime, Uint32 *dwHighDateTime); @@ -180,6 +190,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_TimeToWindows(SDL_Time ticks, Uint32 *dwLow * \param dwHighDateTime the high portion of the Windows FILETIME value. * \returns the converted SDL time. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC SDL_Time SDLCALL SDL_TimeFromWindows(Uint32 dwLowDateTime, Uint32 dwHighDateTime); @@ -192,6 +204,8 @@ extern SDL_DECLSPEC SDL_Time SDLCALL SDL_TimeFromWindows(Uint32 dwLowDateTime, U * \returns the number of days in the requested month or -1 on failure; call * SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDaysInMonth(int year, int month); @@ -205,6 +219,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDaysInMonth(int year, int month); * \returns the day of year [0-365] if the date is valid or -1 on failure; * call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfYear(int year, int month, int day); @@ -218,6 +234,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfYear(int year, int month, int day); * \returns a value between 0 and 6 (0 being Sunday) if the date is valid or * -1 on failure; call SDL_GetError() for more information. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. */ extern SDL_DECLSPEC int SDLCALL SDL_GetDayOfWeek(int year, int month, int day); diff --git a/vendor/sdl3/include/SDL_timer.h b/vendor/sdl3/include/SDL_timer.h index 490d13562..dfeec31f2 100644 --- a/vendor/sdl3/include/SDL_timer.h +++ b/vendor/sdl3/include/SDL_timer.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_touch.h b/vendor/sdl3/include/SDL_touch.h index 64845a156..e5576a5bc 100644 --- a/vendor/sdl3/include/SDL_touch.h +++ b/vendor/sdl3/include/SDL_touch.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_tray.h b/vendor/sdl3/include/SDL_tray.h index 1780b0ba5..688278a1d 100644 --- a/vendor/sdl3/include/SDL_tray.h +++ b/vendor/sdl3/include/SDL_tray.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/include/SDL_version.h b/vendor/sdl3/include/SDL_version.h index 3aa1605b6..7587a6e69 100644 --- a/vendor/sdl3/include/SDL_version.h +++ b/vendor/sdl3/include/SDL_version.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -62,7 +62,7 @@ extern "C" { * * \since This macro is available since SDL 3.2.0. */ -#define SDL_MICRO_VERSION 0 +#define SDL_MICRO_VERSION 2 /** * This macro turns the version numbers into a numeric value. @@ -85,6 +85,8 @@ extern "C" { * * \param version the version number. * + * \threadsafety It is safe to call this macro from any thread. + * * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MAJOR(version) ((version) / 1000000) @@ -96,6 +98,8 @@ extern "C" { * * \param version the version number. * + * \threadsafety It is safe to call this macro from any thread. + * * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MINOR(version) (((version) / 1000) % 1000) @@ -107,6 +111,8 @@ extern "C" { * * \param version the version number. * + * \threadsafety It is safe to call this macro from any thread. + * * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSIONNUM_MICRO(version) ((version) % 1000) @@ -114,6 +120,8 @@ extern "C" { /** * This is the version number macro for the current SDL version. * + * \threadsafety It is safe to call this macro from any thread. + * * \since This macro is available since SDL 3.2.0. * * \sa SDL_GetVersion @@ -124,6 +132,8 @@ extern "C" { /** * This macro will evaluate to true if compiled with SDL at least X.Y.Z. * + * \threadsafety It is safe to call this macro from any thread. + * * \since This macro is available since SDL 3.2.0. */ #define SDL_VERSION_ATLEAST(X, Y, Z) \ @@ -141,6 +151,8 @@ extern "C" { * * \returns the version of the linked library. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetRevision @@ -168,6 +180,8 @@ extern SDL_DECLSPEC int SDLCALL SDL_GetVersion(void); * \returns an arbitrary string, uniquely identifying the exact revision of * the SDL library in use. * + * \threadsafety It is safe to call this function from any thread. + * * \since This function is available since SDL 3.2.0. * * \sa SDL_GetVersion diff --git a/vendor/sdl3/include/SDL_video.h b/vendor/sdl3/include/SDL_video.h index 31dac5f7a..2f062959f 100644 --- a/vendor/sdl3/include/SDL_video.h +++ b/vendor/sdl3/include/SDL_video.h @@ -1,6 +1,6 @@ /* Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga + Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/vendor/sdl3/sdl3_gpu.odin b/vendor/sdl3/sdl3_gpu.odin index 551b23947..18b872e95 100644 --- a/vendor/sdl3/sdl3_gpu.odin +++ b/vendor/sdl3/sdl3_gpu.odin @@ -781,8 +781,11 @@ PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN :: "SDL.gpu. PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN :: "SDL.gpu.device.create.shaders.metallib" PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN :: "SDL.gpu.device.create.d3d12.allowtier1resourcebinding" PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING :: "SDL.gpu.device.create.d3d12.semantic" +PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER :: "SDL.gpu.device.create.d3d12.agility_sdk_version" +PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING :: "SDL.gpu.device.create.d3d12.agility_sdk_path" PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN :: "SDL.gpu.device.create.vulkan.requirehardwareacceleration" PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER :: "SDL.gpu.device.create.vulkan.options" +PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN :: "SDL.gpu.device.create.metal.allowmacfamily1" GPUVulkanOptions :: struct { vulkan_api_version: Uint32, /**< The Vulkan API version to request for the instance. Use Vulkan's VK_MAKE_VERSION or VK_MAKE_API_VERSION. */ diff --git a/vendor/sdl3/sdl3_hints.odin b/vendor/sdl3/sdl3_hints.odin index 8ef09295e..ba7e55d3d 100644 --- a/vendor/sdl3/sdl3_hints.odin +++ b/vendor/sdl3/sdl3_hints.odin @@ -163,6 +163,7 @@ HINT_NO_SIGNAL_HANDLERS :: "SDL_NO_SIGNAL_HANDLERS" HINT_OPENGL_LIBRARY :: "SDL_OPENGL_LIBRARY" HINT_EGL_LIBRARY :: "SDL_EGL_LIBRARY" HINT_OPENGL_ES_DRIVER :: "SDL_OPENGL_ES_DRIVER" +HINT_OPENGL_FORCE_SRGB_FRAMEBUFFER :: "SDL_OPENGL_FORCE_SRGB_FRAMEBUFFER" HINT_OPENVR_LIBRARY :: "SDL_OPENVR_LIBRARY" HINT_ORIENTATIONS :: "SDL_ORIENTATIONS" HINT_POLL_SENTINEL :: "SDL_POLL_SENTINEL" diff --git a/vendor/sdl3/sdl3_render.odin b/vendor/sdl3/sdl3_render.odin index 51abbf777..fd5b0705e 100644 --- a/vendor/sdl3/sdl3_render.odin +++ b/vendor/sdl3/sdl3_render.odin @@ -273,7 +273,7 @@ GPURenderState :: struct {} @(default_calling_convention="c", link_prefix="SDL_", require_results) foreign lib { - CreateGPURenderState :: proc(renderer: ^Renderer, createinfo: ^GPURenderStateCreateInfo) -> ^GPURenderState --- + CreateGPURenderState :: proc(renderer: ^Renderer, #by_ptr createinfo: GPURenderStateCreateInfo) -> ^GPURenderState --- SetGPURenderStateFragmentUniforms :: proc(state: ^GPURenderState, slot_index: Uint32, data: rawptr, length: Uint32) -> bool --- SetGPURenderState :: proc(renderer: ^Renderer, state: ^GPURenderState) -> bool --- DestroyGPURenderState :: proc(renderer: ^Renderer) --- diff --git a/vendor/sdl3/sdl3_version.odin b/vendor/sdl3/sdl3_version.odin index fbc90e220..271771a4b 100644 --- a/vendor/sdl3/sdl3_version.odin +++ b/vendor/sdl3/sdl3_version.odin @@ -3,8 +3,8 @@ package sdl3 import "core:c" MAJOR_VERSION :: 3 -MINOR_VERSION :: 2 -MICRO_VERSION :: 16 +MINOR_VERSION :: 4 +MICRO_VERSION :: 2 @(require_results) VERSIONNUM :: #force_inline proc "c" (major, minor, patch: c.int) -> c.int { return (major * 1000000) + (minor * 1000) + patch } @(require_results) VERSIONNUM_MAJOR :: #force_inline proc "c" (version: c.int) -> c.int { return version / 1000000 } From 509ae9c45c92d1b533c332ca6fdcfff7be32a36a Mon Sep 17 00:00:00 2001 From: nowhereware <113222579+nowhereware@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:17:23 -0500 Subject: [PATCH 540/766] Update LICENSE --- vendor/sdl3/LICENSE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/sdl3/LICENSE.txt b/vendor/sdl3/LICENSE.txt index 23abb73f2..e9adee448 100644 --- a/vendor/sdl3/LICENSE.txt +++ b/vendor/sdl3/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (C) 1997-2025 Sam Lantinga +Copyright (C) 1997-2026 Sam Lantinga This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages From ea80eab75a9b281d13f6904580e4ab06a36fd859 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 21 Feb 2026 21:53:23 +0100 Subject: [PATCH 541/766] [core:sys/info] Remove @(init) where practical --- base/runtime/os_specific_essence.odin | 14 ++ core/crypto/_aes/hw_intel/api.odin | 5 +- .../_chacha20/simd128/chacha20_simd128.odin | 5 +- .../_chacha20/simd256/chacha20_simd256.odin | 7 +- core/crypto/sha2/sha2_impl_hw_intel.odin | 5 +- core/sys/info/cpu_arm.odin | 45 ++-- core/sys/info/cpu_darwin.odin | 16 +- core/sys/info/cpu_darwin_arm64.odin | 94 ++++---- core/sys/info/cpu_intel.odin | 138 ++++++------ core/sys/info/cpu_linux_arm.odin | 94 +++++--- core/sys/info/cpu_linux_intel.odin | 20 +- core/sys/info/cpu_linux_riscv64.odin | 53 ++++- core/sys/info/cpu_other.odin | 14 ++ core/sys/info/cpu_riscv64.odin | 12 +- core/sys/info/cpu_wasm.odin | 20 ++ core/sys/info/cpu_windows.odin | 34 +-- core/sys/info/doc.odin | 115 ++++++---- core/sys/info/platform_bsd.odin | 52 ++--- core/sys/info/platform_darwin.odin | 55 +++-- core/sys/info/platform_freebsd.odin | 54 ++--- core/sys/info/platform_linux.odin | 88 ++++---- core/sys/info/platform_other.odin | 14 ++ core/sys/info/platform_wasm.odin | 14 ++ core/sys/info/platform_windows.odin | 170 +++++++-------- core/sys/info/sysinfo.odin | 202 ++++++++++++++---- core/sys/unix/sysctl_openbsd.odin | 3 +- 26 files changed, 792 insertions(+), 551 deletions(-) create mode 100644 base/runtime/os_specific_essence.odin create mode 100644 core/sys/info/cpu_other.odin create mode 100644 core/sys/info/cpu_wasm.odin create mode 100644 core/sys/info/platform_other.odin create mode 100644 core/sys/info/platform_wasm.odin diff --git a/base/runtime/os_specific_essence.odin b/base/runtime/os_specific_essence.odin new file mode 100644 index 000000000..9d4b0c968 --- /dev/null +++ b/base/runtime/os_specific_essence.odin @@ -0,0 +1,14 @@ +#+build essence +#+private +package runtime + +_HAS_RAND_BYTES :: false + +// TODO(bill): reimplement `os.write` +_stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { + return 0, -1 +} + +_exit :: proc "contextless" (code: int) -> ! { + trap() +} \ No newline at end of file diff --git a/core/crypto/_aes/hw_intel/api.odin b/core/crypto/_aes/hw_intel/api.odin index 502d56213..e2da09f12 100644 --- a/core/crypto/_aes/hw_intel/api.odin +++ b/core/crypto/_aes/hw_intel/api.odin @@ -6,10 +6,7 @@ import "core:sys/info" // is_supported returns true iff hardware accelerated AES // is supported. is_supported :: proc "contextless" () -> bool { - features, ok := info.cpu.features.? - if !ok { - return false - } + features := info.cpu_features() or_return // Note: Everything with AES-NI and PCLMULQDQ has support for // the required SSE extxtensions. diff --git a/core/crypto/_chacha20/simd128/chacha20_simd128.odin b/core/crypto/_chacha20/simd128/chacha20_simd128.odin index 4bf40e240..e477954d2 100644 --- a/core/crypto/_chacha20/simd128/chacha20_simd128.odin +++ b/core/crypto/_chacha20/simd128/chacha20_simd128.odin @@ -227,10 +227,7 @@ is_performant :: proc "contextless" () -> bool { req_features :: info.CPU_Features{.V} } - features, ok := info.cpu.features.? - if !ok { - return false - } + features := info.cpu_features() or_return return features >= req_features } else when ODIN_ARCH == .wasm64p32 || ODIN_ARCH == .wasm32 { diff --git a/core/crypto/_chacha20/simd256/chacha20_simd256.odin b/core/crypto/_chacha20/simd256/chacha20_simd256.odin index 12fffeb2f..ebc294590 100644 --- a/core/crypto/_chacha20/simd256/chacha20_simd256.odin +++ b/core/crypto/_chacha20/simd256/chacha20_simd256.odin @@ -39,12 +39,9 @@ _VEC_TWO: simd.u64x4 : {2, 0, 2, 0} // is_performant returns true iff the target and current host both support // "enough" SIMD to make this implementation performant. is_performant :: proc "contextless" () -> bool { - req_features :: info.CPU_Features{.avx, .avx2} + features := info.cpu_features() or_return - features, ok := info.cpu.features.? - if !ok { - return false - } + req_features :: info.CPU_Features{.avx, .avx2} return features >= req_features } diff --git a/core/crypto/sha2/sha2_impl_hw_intel.odin b/core/crypto/sha2/sha2_impl_hw_intel.odin index cb29a3a20..594edf0dc 100644 --- a/core/crypto/sha2/sha2_impl_hw_intel.odin +++ b/core/crypto/sha2/sha2_impl_hw_intel.odin @@ -52,10 +52,7 @@ K_15 :: simd.u64x2{0xa4506ceb90befffa, 0xc67178f2bef9a3f7} // is_hardware_accelerated_256 returns true iff hardware accelerated // SHA-224/SHA-256 is supported. is_hardware_accelerated_256 :: proc "contextless" () -> bool { - features, ok := info.cpu.features.? - if !ok { - return false - } + features := info.cpu_features() or_return req_features :: info.CPU_Features{ .sse2, diff --git a/core/sys/info/cpu_arm.odin b/core/sys/info/cpu_arm.odin index 8f5143394..c254432e3 100644 --- a/core/sys/info/cpu_arm.odin +++ b/core/sys/info/cpu_arm.odin @@ -40,35 +40,34 @@ CPU_Feature :: enum u64 { } CPU_Features :: distinct bit_set[CPU_Feature; u64] -CPU :: struct { - name: Maybe(string), - features: Maybe(CPU_Features), - physical_cores: int, - logical_cores: int, -} -cpu: CPU + +// Retrieving CPU features on ARM is even more expensive than on Intel, so we're doing this lookup only once, before `main()` +@(private) _features: CPU_Features +@(private) _features_ok: bool + + +@(private) _name_buf: [256]u8 +@(private) _name: string @(private) -cpu_name_buf: [128]byte +_cpu_name :: proc() -> (name: string) { + return _name +} @(init, private) -init_cpu_name :: proc "contextless" () { - generic := true - +_init_cpu_name :: proc "contextless" () { when ODIN_OS == .Darwin { - if unix.sysctlbyname("machdep.cpu.brand_string", &cpu_name_buf) { - cpu.name = string(cstring(rawptr(&cpu_name_buf))) - generic = false + if unix.sysctlbyname("machdep.cpu.brand_string", &_name_buf) { + _name = string(cstring(rawptr(&_name_buf))) + return } } - if generic { - when ODIN_ARCH == .arm64 { - copy(cpu_name_buf[:], "ARM64") - cpu.name = string(cpu_name_buf[:len("ARM64")]) - } else { - copy(cpu_name_buf[:], "ARM") - cpu.name = string(cpu_name_buf[:len("ARM")]) - } + when ODIN_ARCH == .arm64 { + copy(_name_buf[:], "ARM64") + _name = string(_name_buf[:len("ARM64")]) + } else { + copy(_name_buf[:], "ARM") + _name = string(_name_buf[:len("ARM")]) } -} +} \ No newline at end of file diff --git a/core/sys/info/cpu_darwin.odin b/core/sys/info/cpu_darwin.odin index c4a209f6d..06a44227c 100644 --- a/core/sys/info/cpu_darwin.odin +++ b/core/sys/info/cpu_darwin.odin @@ -2,11 +2,11 @@ package sysinfo import "core:sys/unix" -@(init, private) -init_cpu_core_count :: proc "contextless" () { - physical, logical: i64 - unix.sysctlbyname("hw.physicalcpu", &physical) - unix.sysctlbyname("hw.logicalcpu", &logical) - cpu.physical_cores = int(physical) - cpu.logical_cores = int(logical) -} +@(private) +_cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: bool) { + _physical, _logical: i64 + unix.sysctlbyname("hw.physicalcpu", &_physical) + unix.sysctlbyname("hw.logicalcpu", &_logical) + + return int(_physical), int(_logical), true +} \ No newline at end of file diff --git a/core/sys/info/cpu_darwin_arm64.odin b/core/sys/info/cpu_darwin_arm64.odin index aaeef9ad9..45f1d4082 100644 --- a/core/sys/info/cpu_darwin_arm64.odin +++ b/core/sys/info/cpu_darwin_arm64.odin @@ -2,15 +2,17 @@ package sysinfo import "core:sys/unix" -@(init, private) -init_cpu_features :: proc "contextless" () { - @(static) features: CPU_Features - defer cpu.features = features +@(private) +_cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { + return _features, true +} - try_set :: proc "contextless" (name: cstring, feature: CPU_Feature) -> (ok: bool) { +@(init, private) +_init_cpu_features :: proc "contextless" () -> () { + try_set :: proc "contextless" (features: ^CPU_Features, name: cstring, feature: CPU_Feature) -> (ok: bool) { support: b32 if ok = unix.sysctlbyname(name, &support); ok && support { - features += { feature } + features^ += { feature } } return } @@ -20,79 +22,79 @@ init_cpu_features :: proc "contextless" () { // Advanced SIMD & floating-point capabilities: { - if !try_set("hw.optional.AdvSIMD", .asimd) { - try_set("hw.optional.neon", .asimd) + if !try_set(&_features, "hw.optional.AdvSIMD", .asimd) { + try_set(&_features, "hw.optional.neon", .asimd) } - try_set("hw.optional.floatingpoint", .floatingpoint) + try_set(&_features, "hw.optional.floatingpoint", .floatingpoint) - if !try_set("hw.optional.AdvSIMD_HPFPCvt", .asimdhp) { - try_set("hw.optional.neon_hpfp", .asimdhp) + if !try_set(&_features, "hw.optional.AdvSIMD_HPFPCvt", .asimdhp) { + try_set(&_features, "hw.optional.neon_hpfp", .asimdhp) } - try_set("hw.optional.arm.FEAT_BF16", .bf16) - // try_set("hw.optional.arm.FEAT_DotProd", .dotprod) + try_set(&_features, "hw.optional.arm.FEAT_BF16", .bf16) + // try_set(&_features, "hw.optional.arm.FEAT_DotProd", .dotprod) - if !try_set("hw.optional.arm.FEAT_FCMA", .fcma) { - try_set("hw.optional.armv8_3_compnum", .fcma) + if !try_set(&_features, "hw.optional.arm.FEAT_FCMA", .fcma) { + try_set(&_features, "hw.optional.armv8_3_compnum", .fcma) } - if !try_set("hw.optional.arm.FEAT_FHM", .fhm) { - try_set("hw.optional.armv8_2_fhm", .fhm) + if !try_set(&_features, "hw.optional.arm.FEAT_FHM", .fhm) { + try_set(&_features, "hw.optional.armv8_2_fhm", .fhm) } - if !try_set("hw.optional.arm.FEAT_FP16", .fp16) { - try_set("hw.optional.neon_fp16", .fp16) + if !try_set(&_features, "hw.optional.arm.FEAT_FP16", .fp16) { + try_set(&_features, "hw.optional.neon_fp16", .fp16) } - try_set("hw.optional.arm.FEAT_FRINTTS", .frint) - try_set("hw.optional.arm.FEAT_I8MM", .i8mm) - try_set("hw.optional.arm.FEAT_JSCVT", .jscvt) - try_set("hw.optional.arm.FEAT_RDM", .rdm) + try_set(&_features, "hw.optional.arm.FEAT_FRINTTS", .frint) + try_set(&_features, "hw.optional.arm.FEAT_I8MM", .i8mm) + try_set(&_features, "hw.optional.arm.FEAT_JSCVT", .jscvt) + try_set(&_features, "hw.optional.arm.FEAT_RDM", .rdm) } // Integer capabilities: { - try_set("hw.optional.arm.FEAT_FlagM", .flagm) - try_set("hw.optional.arm.FEAT_FlagM2", .flagm2) - try_set("hw.optional.armv8_crc32", .crc32) + try_set(&_features, "hw.optional.arm.FEAT_FlagM", .flagm) + try_set(&_features, "hw.optional.arm.FEAT_FlagM2", .flagm2) + try_set(&_features, "hw.optional.armv8_crc32", .crc32) } // Atomic and memory ordering instruction capabilities: { - try_set("hw.optional.arm.FEAT_LRCPC", .lrcpc) - try_set("hw.optional.arm.FEAT_LRCPC2", .lrcpc2) + try_set(&_features, "hw.optional.arm.FEAT_LRCPC", .lrcpc) + try_set(&_features, "hw.optional.arm.FEAT_LRCPC2", .lrcpc2) - if !try_set("hw.optional.arm.FEAT_LSE", .lse) { - try_set("hw.optional.armv8_1_atomics", .lse) + if !try_set(&_features, "hw.optional.arm.FEAT_LSE", .lse) { + try_set(&_features, "hw.optional.armv8_1_atomics", .lse) } - // try_set("hw.optional.arm.FEAT_LSE2", .lse2) + // try_set(&_features, "hw.optional.arm.FEAT_LSE2", .lse2) } // Encryption capabilities: { - try_set("hw.optional.arm.FEAT_AES", .aes) - try_set("hw.optional.arm.FEAT_PMULL", .pmull) - try_set("hw.optional.arm.FEAT_SHA1", .sha1) - try_set("hw.optional.arm.FEAT_SHA256", .sha256) + try_set(&_features, "hw.optional.arm.FEAT_AES", .aes) + try_set(&_features, "hw.optional.arm.FEAT_PMULL", .pmull) + try_set(&_features, "hw.optional.arm.FEAT_SHA1", .sha1) + try_set(&_features, "hw.optional.arm.FEAT_SHA256", .sha256) - if !try_set("hw.optional.arm.FEAT_SHA512", .sha512) { - try_set("hw.optional.armv8_2_sha512", .sha512) + if !try_set(&_features, "hw.optional.arm.FEAT_SHA512", .sha512) { + try_set(&_features, "hw.optional.armv8_2_sha512", .sha512) } - if !try_set("hw.optional.arm.FEAT_SHA3", .sha3) { - try_set("hw.optional.armv8_2_sha3", .sha3) + if !try_set(&_features, "hw.optional.arm.FEAT_SHA3", .sha3) { + try_set(&_features, "hw.optional.armv8_2_sha3", .sha3) } } // General capabilities: { - // try_set("hw.optional.arm.FEAT_BTI", .bti) - // try_set("hw.optional.arm.FEAT_DPB", .dpb) - // try_set("hw.optional.arm.FEAT_DPB2", .dpb2) - // try_set("hw.optional.arm.FEAT_ECV", .ecv) - try_set("hw.optional.arm.FEAT_SB", .sb) - try_set("hw.optional.arm.FEAT_SSBS", .ssbs) + // try_set(&_features, "hw.optional.arm.FEAT_BTI", .bti) + // try_set(&_features, "hw.optional.arm.FEAT_DPB", .dpb) + // try_set(&_features, "hw.optional.arm.FEAT_DPB2", .dpb2) + // try_set(&_features, "hw.optional.arm.FEAT_ECV", .ecv) + try_set(&_features, "hw.optional.arm.FEAT_SB", .sb) + try_set(&_features, "hw.optional.arm.FEAT_SSBS", .ssbs) } -} +} \ No newline at end of file diff --git a/core/sys/info/cpu_intel.odin b/core/sys/info/cpu_intel.odin index e8f07c732..01cee1b3e 100644 --- a/core/sys/info/cpu_intel.odin +++ b/core/sys/info/cpu_intel.odin @@ -3,6 +3,12 @@ package sysinfo import "base:intrinsics" +// cpuid :: proc(ax, cx: u32) -> (eax, ebc, ecx, edx: u32) --- +cpuid :: intrinsics.x86_cpuid + +// xgetbv :: proc(cx: u32) -> (eax, edx: u32) --- +xgetbv :: intrinsics.x86_xgetbv + CPU_Feature :: enum u64 { aes, // AES hardware implementation (AES NI) adx, // Multi-precision add-carry instruction extensions @@ -43,16 +49,14 @@ CPU_Feature :: enum u64 { } CPU_Features :: distinct bit_set[CPU_Feature; u64] -CPU :: struct { - name: Maybe(string), - features: Maybe(CPU_Features), - physical_cores: int, // Initialized by cpu_.odin - logical_cores: int, // Initialized by cpu_.odin -} -cpu: CPU + +// `cpuid` is a barrier so we try not performing this query this more than necessary. +// `atomic_load_explicit` is also a barrier, so we're doing this lookup only once, before `main()` +@(private) _features: CPU_Features +@(private) _features_ok: bool @(init, private) -init_cpu_features :: proc "contextless" () { +_init_cpu_features :: proc "contextless" () { is_set :: #force_inline proc "c" (bit: u32, value: u32) -> bool { return (value>>bit) & 0x1 != 0 } @@ -64,29 +68,30 @@ init_cpu_features :: proc "contextless" () { max_id, _, _, _ := cpuid(0, 0) if max_id < 1 { + _features = {} + _features_ok = false return } - set: CPU_Features - _, _, ecx1, edx1 := cpuid(1, 0) - try_set(&set, .sse2, 26, edx1) - try_set(&set, .sse3, 0, ecx1) - try_set(&set, .pclmulqdq, 1, ecx1) - try_set(&set, .ssse3, 9, ecx1) - try_set(&set, .fma, 12, ecx1) - try_set(&set, .sse41, 19, ecx1) - try_set(&set, .sse42, 20, ecx1) - try_set(&set, .popcnt, 23, ecx1) - try_set(&set, .aes, 25, ecx1) - try_set(&set, .os_xsave, 27, ecx1) - try_set(&set, .rdrand, 30, ecx1) + try_set(&_features, .sse2, 26, edx1) + try_set(&_features, .sse3, 0, ecx1) + try_set(&_features, .pclmulqdq, 1, ecx1) + try_set(&_features, .ssse3, 9, ecx1) + try_set(&_features, .fma, 12, ecx1) + try_set(&_features, .sse41, 19, ecx1) + try_set(&_features, .sse42, 20, ecx1) + try_set(&_features, .popcnt, 23, ecx1) + try_set(&_features, .aes, 25, ecx1) + try_set(&_features, .os_xsave, 27, ecx1) + try_set(&_features, .rdrand, 30, ecx1) + + _features_ok = true when ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD { // xgetbv is an illegal instruction under FreeBSD 13, OpenBSD 7.1 and NetBSD 10 // return before probing further - cpu.features = set return } @@ -97,15 +102,15 @@ init_cpu_features :: proc "contextless" () { // after they started checking both OSXSAVE and XSAVE. // // See: crbug.com/375968 - os_supports_avx := false + os_supports_avx := false os_supports_avx512 := false - if .os_xsave in set && is_set(26, ecx1) { + if .os_xsave in _features && is_set(26, ecx1) { eax, _ := xgetbv(0) - os_supports_avx = is_set(1, eax) && is_set(2, eax) + os_supports_avx = is_set(1, eax) && is_set(2, eax) os_supports_avx512 = is_set(5, eax) && is_set(6, eax) && is_set(7, eax) } if os_supports_avx { - try_set(&set, .avx, 28, ecx1) + try_set(&_features, .avx, 28, ecx1) } if max_id < 7 { @@ -113,56 +118,61 @@ init_cpu_features :: proc "contextless" () { } _, ebx7, ecx7, edx7 := cpuid(7, 0) - try_set(&set, .bmi1, 3, ebx7) - try_set(&set, .sha, 29, ebx7) + try_set(&_features, .bmi1, 3, ebx7) + try_set(&_features, .sha, 29, ebx7) if os_supports_avx { - try_set(&set, .avx2, 5, ebx7) + try_set(&_features, .avx2, 5, ebx7) } if os_supports_avx512 { - try_set(&set, .avx512f, 16, ebx7) - try_set(&set, .avx512dq, 17, ebx7) - try_set(&set, .avx512ifma, 21, ebx7) - try_set(&set, .avx512pf, 26, ebx7) - try_set(&set, .avx512er, 27, ebx7) - try_set(&set, .avx512cd, 28, ebx7) - try_set(&set, .avx512bw, 30, ebx7) + try_set(&_features, .avx512f, 16, ebx7) + try_set(&_features, .avx512dq, 17, ebx7) + try_set(&_features, .avx512ifma, 21, ebx7) + try_set(&_features, .avx512pf, 26, ebx7) + try_set(&_features, .avx512er, 27, ebx7) + try_set(&_features, .avx512cd, 28, ebx7) + try_set(&_features, .avx512bw, 30, ebx7) // XMM/YMM are also required for 128/256-bit instructions if os_supports_avx { - try_set(&set, .avx512vl, 31, ebx7) + try_set(&_features, .avx512vl, 31, ebx7) } - try_set(&set, .avx512vbmi, 1, ecx7) - try_set(&set, .avx512vbmi2, 6, ecx7) - try_set(&set, .avx512vnni, 11, ecx7) - try_set(&set, .avx512bitalg, 12, ecx7) - try_set(&set, .avx512vpopcntdq, 14, ecx7) + try_set(&_features, .avx512vbmi, 1, ecx7) + try_set(&_features, .avx512vbmi2, 6, ecx7) + try_set(&_features, .avx512vnni, 11, ecx7) + try_set(&_features, .avx512bitalg, 12, ecx7) + try_set(&_features, .avx512vpopcntdq, 14, ecx7) - try_set(&set, .avx512vp2intersect, 8, edx7) - try_set(&set, .avx512fp16, 23, edx7) + try_set(&_features, .avx512vp2intersect, 8, edx7) + try_set(&_features, .avx512fp16, 23, edx7) eax7_1, _, _, _ := cpuid(7, 1) - try_set(&set, .avx512bf16, 5, eax7_1) + try_set(&_features, .avx512bf16, 5, eax7_1) } - try_set(&set, .bmi2, 8, ebx7) - try_set(&set, .erms, 9, ebx7) - try_set(&set, .rdseed, 18, ebx7) - try_set(&set, .adx, 19, ebx7) - - cpu.features = set + try_set(&_features, .bmi2, 8, ebx7) + try_set(&_features, .erms, 9, ebx7) + try_set(&_features, .rdseed, 18, ebx7) + try_set(&_features, .adx, 19, ebx7) } @(private) -_cpu_name_buf: [72]u8 +_cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { + return _features, _features_ok +} + +// `cpuid` is a barrier so we try not performing this query this more than necessary. +// `atomic_load_explicit` is also a barrier, so we're doing this lookup only once, before `main()` +@(private) _name_buf: [72]u8 +@(private) _name: string @(init, private) -init_cpu_name :: proc "contextless" () { +_init_cpu_name :: proc "contextless" () { number_of_extended_ids, _, _, _ := cpuid(0x8000_0000, 0) if number_of_extended_ids < 0x8000_0004 { return } - _buf := (^[0x12]u32)(&_cpu_name_buf) + _buf := (^[0x12]u32)(&_name_buf) _buf[ 0], _buf[ 1], _buf[ 2], _buf[ 3] = cpuid(0x8000_0002, 0) _buf[ 4], _buf[ 5], _buf[ 6], _buf[ 7] = cpuid(0x8000_0003, 0) _buf[ 8], _buf[ 9], _buf[10], _buf[11] = cpuid(0x8000_0004, 0) @@ -170,18 +180,16 @@ init_cpu_name :: proc "contextless" () { // Some CPUs like may include leading or trailing spaces. Trim them. // e.g. ` Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz` - brand := string(_cpu_name_buf[:]) - for len(brand) > 0 && brand[0] == 0 || brand[0] == ' ' { - brand = brand[1:] + _name = string(_name_buf[:]) + for len(_name) > 0 && _name[0] == 0 || _name[0] == ' ' { + _name = _name[1:] } - for len(brand) > 0 && brand[len(brand) - 1] == 0 || brand[len(brand) - 1] == ' ' { - brand = brand[:len(brand) - 1] + for len(_name) > 0 && _name[len(_name) - 1] == 0 || _name[len(_name) - 1] == ' ' { + _name = _name[:len(_name) - 1] } - cpu.name = brand } -// cpuid :: proc(ax, cx: u32) -> (eax, ebc, ecx, edx: u32) --- -cpuid :: intrinsics.x86_cpuid - -// xgetbv :: proc(cx: u32) -> (eax, edx: u32) --- -xgetbv :: intrinsics.x86_xgetbv \ No newline at end of file +@(private) +_cpu_name :: proc "contextless" () -> (name: string) { + return _name +} \ No newline at end of file diff --git a/core/sys/info/cpu_linux_arm.odin b/core/sys/info/cpu_linux_arm.odin index 6e8b1a634..cfdcbaf75 100644 --- a/core/sys/info/cpu_linux_arm.odin +++ b/core/sys/info/cpu_linux_arm.odin @@ -4,10 +4,16 @@ package sysinfo import "base:runtime" import "core:sys/linux" +import "core:strconv" import "core:strings" +@(private) +_cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { + return _features, _features_ok +} + @(init, private) -init_cpu_features :: proc "contextless" () { +_init_cpu_features :: proc "contextless" () { context = runtime.default_context() fd, err := linux.open("/proc/cpuinfo", {}) if err != .NONE { return } @@ -18,9 +24,6 @@ init_cpu_features :: proc "contextless" () { n, rerr := linux.read(fd, buf[:]) if rerr != .NONE || n == 0 { return } - features: CPU_Features - defer cpu.features = features - str := string(buf[:n]) for line in strings.split_lines_iterator(&str) { key, _, value := strings.partition(line, ":") @@ -29,39 +32,72 @@ init_cpu_features :: proc "contextless" () { if key != "Features" { continue } + _features_ok = true + for feature in strings.split_by_byte_iterator(&value, ' ') { switch feature { - case "asimd", "neon": features += { .asimd } - case "fp": features += { .floatingpoint } - case "asimdhp": features += { .asimdhp } - case "asimdbf16": features += { .bf16 } - case "fcma": features += { .fcma } - case "asimdfhm": features += { .fhm } - case "fphp", "half": features += { .fp16 } - case "frint": features += { .frint } - case "i8mm": features += { .i8mm } - case "jscvt": features += { .jscvt } - case "asimdrdm": features += { .rdm } + case "asimd", "neon": _features += { .asimd } + case "fp": _features += { .floatingpoint } + case "asimdhp": _features += { .asimdhp } + case "asimdbf16": _features += { .bf16 } + case "fcma": _features += { .fcma } + case "asimdfhm": _features += { .fhm } + case "fphp", "half": _features += { .fp16 } + case "frint": _features += { .frint } + case "i8mm": _features += { .i8mm } + case "jscvt": _features += { .jscvt } + case "asimdrdm": _features += { .rdm } - case "flagm": features += { .flagm } - case "flagm2": features += { .flagm2 } - case "crc32": features += { .crc32 } + case "flagm": _features += { .flagm } + case "flagm2": _features += { .flagm2 } + case "crc32": _features += { .crc32 } - case "atomics": features += { .lse } - case "lrcpc": features += { .lrcpc } - case "ilrcpc": features += { .lrcpc2 } + case "atomics": _features += { .lse } + case "lrcpc": _features += { .lrcpc } + case "ilrcpc": _features += { .lrcpc2 } - case "aes": features += { .aes } - case "pmull": features += { .pmull } - case "sha1": features += { .sha1 } - case "sha2": features += { .sha256 } - case "sha3": features += { .sha3 } - case "sha512": features += { .sha512 } + case "aes": _features += { .aes } + case "pmull": _features += { .pmull } + case "sha1": _features += { .sha1 } + case "sha2": _features += { .sha256 } + case "sha3": _features += { .sha3 } + case "sha512": _features += { .sha512 } - case "sb": features += { .sb } - case "ssbs": features += { .ssbs } + case "sb": _features += { .sb } + case "ssbs": _features += { .ssbs } } } break } } + +@(private) +_cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: bool) { + context = runtime.default_context() + fd, err := linux.open("/proc/cpuinfo", {}) + if err != .NONE { return } + defer linux.close(fd) + + // This is probably enough right? + buf: [4096]byte + n, rerr := linux.read(fd, buf[:]) + if rerr != .NONE || n == 0 { return } + + physical_ok, logical_ok: bool + + str := string(buf[:n]) + for line in strings.split_lines_iterator(&str) { + key, _, value := strings.partition(line, ":") + key = strings.trim_space(key) + value = strings.trim_space(value) + + if key == "cpu cores" && !physical_ok{ + physical, physical_ok = strconv.parse_int(value) + } + + if key == "siblings" && !logical_ok{ + logical, logical_ok = strconv.parse_int(value) + } + } + return physical, logical, physical_ok || logical_ok +} \ No newline at end of file diff --git a/core/sys/info/cpu_linux_intel.odin b/core/sys/info/cpu_linux_intel.odin index af76a75e4..1823678ee 100644 --- a/core/sys/info/cpu_linux_intel.odin +++ b/core/sys/info/cpu_linux_intel.odin @@ -7,10 +7,9 @@ import "core:sys/linux" import "core:strings" import "core:strconv" -@(init, private) -init_cpu_core_count :: proc "contextless" () { +@(private) +_cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: bool) { context = runtime.default_context() - fd, err := linux.open("/proc/cpuinfo", {}) if err != .NONE { return } defer linux.close(fd) @@ -20,22 +19,21 @@ init_cpu_core_count :: proc "contextless" () { n, rerr := linux.read(fd, buf[:]) if rerr != .NONE || n == 0 { return } + physical_ok, logical_ok: bool + str := string(buf[:n]) for line in strings.split_lines_iterator(&str) { key, _, value := strings.partition(line, ":") key = strings.trim_space(key) value = strings.trim_space(value) - if key == "cpu cores" { - if num_physical_cores, ok := strconv.parse_int(value); ok { - cpu.physical_cores = num_physical_cores - } + if key == "cpu cores" && !physical_ok{ + physical, physical_ok = strconv.parse_int(value) } - if key == "siblings" { - if num_logical_cores, ok := strconv.parse_int(value); ok { - cpu.logical_cores = num_logical_cores - } + if key == "siblings" && !logical_ok{ + logical, logical_ok = strconv.parse_int(value) } } + return physical, logical, physical_ok || logical_ok } \ No newline at end of file diff --git a/core/sys/info/cpu_linux_riscv64.odin b/core/sys/info/cpu_linux_riscv64.odin index e65e8a3d2..612456ff0 100644 --- a/core/sys/info/cpu_linux_riscv64.odin +++ b/core/sys/info/cpu_linux_riscv64.odin @@ -3,14 +3,13 @@ package sysinfo import "base:intrinsics" - +import "base:runtime" import "core:sys/linux" +import "core:strconv" +import "core:strings" @(init, private) -init_cpu_features :: proc "contextless" () { - _features: CPU_Features - defer cpu.features = _features - +_init_cpu_features :: proc "contextless" () { HWCAP_Bits :: enum u64 { I = 'I' - 'A', M = 'M' - 'A', @@ -72,6 +71,8 @@ init_cpu_features :: proc "contextless" () { } } + _features_ok = true + // hwprobe for other features. { pairs := []linux.RISCV_HWProbe{ @@ -107,7 +108,43 @@ init_cpu_features :: proc "contextless" () { } } -@(init, private) -init_cpu_name :: proc "contextless" () { - cpu.name = "RISCV64" +@(private) +_cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { + return _features, _features_ok } + +@(private) +_cpu_name :: proc() -> (name: string) { + return "RISCV64" +} + +@(private) +_cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: bool) { + context = runtime.default_context() // No allocations, only needed because `core:strings` wants it. + fd, err := linux.open("/proc/cpuinfo", {}) + if err != .NONE { return } + defer linux.close(fd) + + // This is probably enough right? + buf: [4096]byte + n, rerr := linux.read(fd, buf[:]) + if rerr != .NONE || n == 0 { return } + + physical_ok, logical_ok: bool + + str := string(buf[:n]) + for line in strings.split_lines_iterator(&str) { + key, _, value := strings.partition(line, ":") + key = strings.trim_space(key) + value = strings.trim_space(value) + + if key == "cpu cores" && !physical_ok{ + physical, physical_ok = strconv.parse_int(value) + } + + if key == "siblings" && !logical_ok{ + logical, logical_ok = strconv.parse_int(value) + } + } + return physical, logical, physical_ok || logical_ok +} \ No newline at end of file diff --git a/core/sys/info/cpu_other.odin b/core/sys/info/cpu_other.odin new file mode 100644 index 000000000..6b7f78e19 --- /dev/null +++ b/core/sys/info/cpu_other.odin @@ -0,0 +1,14 @@ +#+build openbsd, freebsd, netbsd, essence, haiku +package sysinfo + +@(private) +_cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: bool) { + return 0, 0, false +} + +when ODIN_ARCH == .arm32 || ODIN_ARCH == .arm64 { + @(private) + _cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { + return {}, false + } +} \ No newline at end of file diff --git a/core/sys/info/cpu_riscv64.odin b/core/sys/info/cpu_riscv64.odin index 64f2edfd3..f67f15ebd 100644 --- a/core/sys/info/cpu_riscv64.odin +++ b/core/sys/info/cpu_riscv64.odin @@ -95,10 +95,8 @@ CPU_Feature :: enum u64 { } CPU_Features :: distinct bit_set[CPU_Feature; u64] -CPU :: struct { - name: Maybe(string), - features: Maybe(CPU_Features), - physical_cores: int, - logical_cores: int, -} -cpu: CPU \ No newline at end of file + +// Looking up CPU features is expensive on RISCV, and `atomic_load_explicit` +// is also a barrier, so we're doing this lookup only once, before `main()` +@(private) _features: CPU_Features +@(private) _features_ok: bool \ No newline at end of file diff --git a/core/sys/info/cpu_wasm.odin b/core/sys/info/cpu_wasm.odin new file mode 100644 index 000000000..9fc99b98c --- /dev/null +++ b/core/sys/info/cpu_wasm.odin @@ -0,0 +1,20 @@ +#+build wasm32, wasm64p32 +package sysinfo + +@(private) +_cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: bool) { + return 0, 0, false +} + +CPU_Feature :: enum u64 {} +CPU_Features :: distinct bit_set[CPU_Feature; u64] + +@(private) +_cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { + return {}, false +} + +@(private) +_cpu_name :: proc() -> (name: string) { + return "wasm32" when ODIN_ARCH == .wasm32 else "wasm64p32" +} \ No newline at end of file diff --git a/core/sys/info/cpu_windows.odin b/core/sys/info/cpu_windows.odin index 72d79f9a7..604ec3641 100644 --- a/core/sys/info/cpu_windows.odin +++ b/core/sys/info/cpu_windows.odin @@ -2,30 +2,34 @@ package sysinfo import sys "core:sys/windows" import "base:intrinsics" -import "base:runtime" -@(init, private) -init_cpu_core_count :: proc "contextless" () { - context = runtime.default_context() +@(private) +_cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: bool) { + // Reportedly, Windows Server supports a maximum of 256 logical cores. + // The most scratch memory we need therefore is 8192 bytes = 256 * size_of(sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION) + infos: [256]sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION - infos: []sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION - defer delete(infos) - - returned_length: sys.DWORD // Query for the required buffer size. - if ok := sys.GetLogicalProcessorInformation(raw_data(infos), &returned_length); !ok { - infos = make([]sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION, returned_length / size_of(sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION)) + returned_length: sys.DWORD + sys.GetLogicalProcessorInformation(nil, &returned_length) + + if int(returned_length) > size_of(infos) { + return 0, 0, false } + count := int(returned_length) / size_of(sys.SYSTEM_LOGICAL_PROCESSOR_INFORMATION) + // If it still doesn't work, return - if ok := sys.GetLogicalProcessorInformation(raw_data(infos), &returned_length); !ok { - return + if ok := sys.GetLogicalProcessorInformation(raw_data(infos[:]), &returned_length); !ok { + return 0, 0, false } - for info in infos { + for info in infos[:count] { #partial switch info.Relationship { - case .RelationProcessorCore: cpu.physical_cores += 1 - case .RelationNumaNode: cpu.logical_cores += int(intrinsics.count_ones(info.ProcessorMask)) + case .RelationProcessorCore: physical += 1 + case .RelationNumaNode: logical += int(intrinsics.count_ones(info.ProcessorMask)) } } + + return physical, logical, true } \ No newline at end of file diff --git a/core/sys/info/doc.odin b/core/sys/info/doc.odin index 10ad7a127..b93fcc694 100644 --- a/core/sys/info/doc.odin +++ b/core/sys/info/doc.odin @@ -16,66 +16,93 @@ Example: import si "core:sys/info" main :: proc() { - fmt.printfln("Odin: %v", ODIN_VERSION) - fmt.printfln("OS: %v", si.os_version.as_string) - fmt.printfln("OS: %#v", si.os_version) - fmt.printfln("CPU: %v", si.cpu.name) - fmt.printfln("CPU cores: %vc/%vt", si.cpu.physical_cores, si.cpu.logical_cores) - fmt.printfln("RAM: %#.1M", si.ram.total_ram) + fmt.printfln("Odin: %v", ODIN_VERSION) + if version, version_ok := si.os_version(context.allocator); version_ok { + defer si.destroy_os_version(version, context.allocator) + fmt.printfln("OS (full): %v", version.full) + fmt.printfln("OS (rel): %v", version.release) + fmt.printfln("OS: %v", version.os) + fmt.printfln("Kernel: %v", version.kernel) + } + fmt.printfln("CPU: %v", si.cpu_name()) - fmt.println() - for gpu, i in si.gpus { - fmt.printfln("GPU #%v:", i) - fmt.printfln("\tVendor: %v", gpu.vendor_name) - fmt.printfln("\tModel: %v", gpu.model_name) - fmt.printfln("\tVRAM: %#.1M", gpu.total_ram) + if features, features_ok := si.cpu_features(); features_ok { + fmt.printfln(" %v", features) + } + if physical, logical, cores_ok := si.cpu_core_count(); cores_ok { + fmt.printfln("CPU cores: %vc/%vt", physical, logical) + } + + if total_ram, free_ram, total_swap, free_swap, ram_ok := si.ram_stats(); ram_ok { + fmt.printfln("RAM: %#.1M/%#.1M", free_ram, total_ram) + fmt.printfln("SWAP: %#.1M/%#.1M", free_swap, total_swap) + } + + it: si.GPU_Iterator + for gpu, i in si.iterate_gpus(&it) { + fmt.printfln("%d:", i) + fmt.printfln("\tVendor: %v", gpu.vendor) + fmt.printfln("\tModel: %v", gpu.model) + fmt.printfln("\tVRAM: %#.1M", gpu.vram) + fmt.printfln("\tDriver: %v", gpu.driver) } } - Example Windows output: - Odin: dev-2025-10 - OS: Windows 10 Professional (version: 22H2), build: 19045.6396 - OS: OS_Version{ - platform = "Windows", - _ = Version{ - major = 10, - minor = 0, - patch = 0, - }, - build = [ - 19045, - 6396, - ], - version = "22H2", - as_string = "Windows 10 Professional (version: 22H2), build: 19045.6396", - } + Odin: dev-2026-02 + OS (full): Windows 10 Professional (version: 22H2), build: 19045.6575 + OS (rel): 22H2 + OS: Version{major = 10, minor = 0, patch = 0} + Kernel: Version{major = 10, minor = 19045, patch = 6575} CPU: AMD Ryzen 9 5950X 16-Core Processor + CPU_Features{aes, adx, avx, avx2, bmi1, bmi2, erms, fma, os_xsave, pclmulqdq, popcnt, rdrand, rdseed, sha, sse2, sse3, ssse3, sse41, sse42} CPU cores: 16c/32t - RAM: 63.9 GiB + RAM: 32.1 GiB/63.9 GiB + SWAP: 21.6 GiB/73.4 GiB GPU #0: Vendor: Advanced Micro Devices, Inc. Model: AMD Radeon RX 9070 VRAM: 15.9 GiB +- Example Linux output: + + Odin: dev-2026-02 + OS (full): Ubuntu 24.04.3 LTS, Linux 6.6.87.2-microsoft-standard-WSL2 + OS (rel): microsoft-standard-WSL2 + OS: Version{major = 24, minor = 4, patch = 3} + Kernel: Version{major = 6, minor = 6, patch = 87} + CPU: AMD Ryzen 9 5950X 16-Core Processor + CPU_Features{aes, adx, avx, avx2, bmi1, bmi2, erms, fma, os_xsave, pclmulqdq, popcnt, rdrand, rdseed, sha, sse2, sse3, ssse3, sse41, sse42} + CPU cores: 16c/32t + RAM: 29.2 GiB/31.3 GiB + SWAP: 8.0 GiB/8.0 GiB + - Example macOS output: - ODIN: dev-2022-09 - OS: OS_Version{ - platform = "MacOS", - major = 21, - minor = 5, - patch = 0, - build = [ - 0, - 0, - ], - version = "21F79", - as_string = "macOS Monterey 12.4 (build 21F79, kernel 21.5.0)", - } - CPU: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz - RAM: 8.0 GiB + Odin: dev-2026-02 + OS (full): macOS Tahoe 26.3.0 (build 25D125, kernel 25.3.0) + OS (rel): 25D125 + OS: Version{major = 26, minor = 3, patch = 0} + Kernel: Version{major = 25, minor = 3, patch = 0} + CPU: Apple M4 Pro + CPU_Features{asimd, floatingpoint, asimdhp, bf16, fcma, fhm, fp16, frint, i8mm, jscvt, rdm, flagm, flagm2, crc32, lse, lrcpc, lrcpc2, aes, pmull, sha1, sha256, sha512, sha3, sb} + CPU cores: 12c/12t + RAM: 0.0 B/24.0 GiB + SWAP: 0.0 B/0.0 B + +- Example FreeBSD output: + + Odin: dev-2026-02 + OS (full): FreeBSD 15.0-RELEASE-p2 releng/15.0-n281005-5fb0f8e9e61d GENERIC, revision 199506 + OS (rel): + OS: Version{major = 15, minor = 0, patch = 199506} + Kernel: Version{major = 15, minor = 0, patch = 199506} + CPU: AMD Ryzen 9 5950X 16-Core Processor + CPU_Features{aes, fma, os_xsave, pclmulqdq, popcnt, rdrand, sse2, sse3, ssse3, sse41, sse42} + RAM: 7.6 GiB/7.9 GiB + SWAP: 0.0 B/0.0 B */ package sysinfo diff --git a/core/sys/info/platform_bsd.odin b/core/sys/info/platform_bsd.odin index 349b74002..431b48200 100644 --- a/core/sys/info/platform_bsd.odin +++ b/core/sys/info/platform_bsd.odin @@ -1,24 +1,20 @@ #+build openbsd, netbsd package sysinfo -import sys "core:sys/unix" -import "core:strings" -import "core:strconv" import "base:runtime" +import "core:strings" +import sys "core:sys/unix" -@(init, private) -init_os_version :: proc "contextless" () { - context = runtime.default_context() - +_os_version :: proc (allocator: runtime.Allocator, loc := #caller_location) -> (res: OS_Version, ok: bool) { when ODIN_OS == .NetBSD { - os_version.platform = .NetBSD + res.platform = .NetBSD } else { - os_version.platform = .OpenBSD + res.platform = .OpenBSD } kernel_version_buf: [1024]u8 - b := strings.builder_from_bytes(version_string_buf[:]) + b := strings.builder_make_none(allocator = allocator, loc = loc) // Retrieve kernel info using `sysctl`, e.g. OpenBSD and NetBSD mib := []i32{sys.CTL_KERN, sys.KERN_OSTYPE} if !sys.sysctl(mib, &kernel_version_buf) { @@ -36,19 +32,8 @@ init_os_version :: proc "contextless" () { version := string(cstring(raw_data(kernel_version_buf[:]))) strings.write_string(&b, version) - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - // Parse kernel version - triplet := strings.split(version, ".", context.temp_allocator) - if len(triplet) == 2 { - major, major_ok := strconv.parse_int(triplet[0]) - minor, minor_ok := strconv.parse_int(triplet[1]) - - if major_ok && minor_ok { - os_version.major = major - os_version.minor = minor - } - } + res.kernel = _parse_version(version) // Retrieve kernel revision using `sysctl`, e.g. 199506 mib = []i32{sys.CTL_KERN, sys.KERN_OSREV} @@ -56,20 +41,27 @@ init_os_version :: proc "contextless" () { if !sys.sysctl(mib, &revision) { return } - os_version.patch = revision + res.kernel.patch = revision strings.write_string(&b, ", build ") strings.write_int(&b, revision) // Finalize pretty name. - os_version.as_string = strings.to_string(b) + res.full = strings.to_string(b) + + return res, true } -@(init, private) -init_ram :: proc "contextless" () { +@(private) +_ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { // Retrieve RAM info using `sysctl` mib := []i32{sys.CTL_HW, sys.HW_PHYSMEM64} - mem_size: u64 - if sys.sysctl(mib, &mem_size) { - ram.total_ram = int(mem_size) + if sys.sysctl(mib, &total_ram) { + ok = true } -} + + mib = []i32{sys.CTL_HW, sys.HW_USERMEM64} + if sys.sysctl(mib, &free_ram) { + ok = true + } + return +} \ No newline at end of file diff --git a/core/sys/info/platform_darwin.odin b/core/sys/info/platform_darwin.odin index 498c21846..fe0b5ab2b 100644 --- a/core/sys/info/platform_darwin.odin +++ b/core/sys/info/platform_darwin.odin @@ -1,19 +1,16 @@ package sysinfo -import "base:runtime" - -import "core:strconv" +import "base:runtime" import "core:strings" import "core:sys/unix" import NS "core:sys/darwin/Foundation" -@(init, private) -init_platform :: proc "contextless" () { - context = runtime.default_context() +@(private) +_os_version :: proc (allocator: runtime.Allocator, loc := #caller_location) -> (res: OS_Version, ok: bool) { ws :: strings.write_string wi :: strings.write_int - b := strings.builder_from_bytes(version_string_buf[:]) + b := strings.builder_make_none(allocator = allocator, loc = loc) version: NS.OperatingSystemVersion { @@ -21,18 +18,15 @@ init_platform :: proc "contextless" () { info := NS.ProcessInfo.processInfo() version = info->operatingSystemVersion() - mem := info->physicalMemory() - - ram.total_ram = int(mem) } - macos_version = {int(version.majorVersion), int(version.minorVersion), int(version.patchVersion)} + res.os = {int(version.majorVersion), int(version.minorVersion), int(version.patchVersion)} when ODIN_PLATFORM_SUBTARGET_IOS { - os_version.platform = .iOS + res.platform = .iOS ws(&b, "iOS") } else { - os_version.platform = .MacOS + res.platform = .MacOS switch version.majorVersion { case 26: ws(&b, "macOS Tahoe") case 15: ws(&b, "macOS Sequoia") @@ -69,34 +63,37 @@ init_platform :: proc "contextless" () { { build_buf: [12]u8 mib := []i32{unix.CTL_KERN, unix.KERN_OSVERSION} - ok := unix.sysctl(mib, &build_buf) - build := string(cstring(raw_data(build_buf[:]))) if ok else "Unknown" - + build := "Unknown" + if unix.sysctl(mib, &build_buf) { + build = string(cstring(raw_data(build_buf[:]))) + } ws(&b, " (build ") - build_start := len(b.buf) ws(&b, build) - os_version.version = string(b.buf[build_start:][:len(build)]) + res.release = string(b.buf[build_start:][:len(build)]) } { // Match on XNU kernel version version_bits: [12]u8 // enough for 999.999.999\x00 mib := []i32{unix.CTL_KERN, unix.KERN_OSRELEASE} - ok := unix.sysctl(mib, &version_bits) - kernel := string(cstring(raw_data(version_bits[:]))) if ok else "Unknown" - - major, _, tail := strings.partition(kernel, ".") - minor, _, patch := strings.partition(tail, ".") - - os_version.major, _ = strconv.parse_int(major, 10) - os_version.minor, _ = strconv.parse_int(minor, 10) - os_version.patch, _ = strconv.parse_int(patch, 10) - + kernel := "Unknown" + if unix.sysctl(mib, &version_bits) { + kernel = string(cstring(raw_data(version_bits[:]))) + res.kernel = _parse_version(kernel) + } ws(&b, ", kernel ") ws(&b, kernel) ws(&b, ")") } - os_version.as_string = string(b.buf[:]) + res.full = strings.to_string(b) + return res, true } + +@(private) +_ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { + NS.scoped_autoreleasepool() + info := NS.ProcessInfo.processInfo() + return i64(info->physicalMemory()), 0, 0, 0, true +} \ No newline at end of file diff --git a/core/sys/info/platform_freebsd.odin b/core/sys/info/platform_freebsd.odin index ed5db6243..6f32d4232 100644 --- a/core/sys/info/platform_freebsd.odin +++ b/core/sys/info/platform_freebsd.odin @@ -2,18 +2,15 @@ package sysinfo import sys "core:sys/unix" import "core:strings" -import "core:strconv" import "base:runtime" -@(init, private) -init_os_version :: proc "contextless" () { - context = runtime.default_context() - - os_version.platform = .FreeBSD +@(private) +_os_version :: proc (allocator: runtime.Allocator, loc := #caller_location) -> (res: OS_Version, ok: bool) { + res.platform = .FreeBSD kernel_version_buf: [1024]u8 - b := strings.builder_from_bytes(version_string_buf[:]) + b := strings.builder_make_none(allocator = allocator, loc = loc) // Retrieve kernel info using `sysctl`, e.g. FreeBSD 13.1-RELEASE-p2 GENERIC mib := []i32{sys.CTL_KERN, sys.KERN_VERSION} if !sys.sysctl(mib, &kernel_version_buf) { @@ -24,21 +21,18 @@ init_os_version :: proc "contextless" () { pretty_name = strings.trim(pretty_name, "\n") strings.write_string(&b, pretty_name) - // l := strings.builder_len(b) - // Retrieve kernel revision using `sysctl`, e.g. 199506 mib = []i32{sys.CTL_KERN, sys.KERN_OSREV} revision: int if !sys.sysctl(mib, &revision) { return } - os_version.patch = revision strings.write_string(&b, ", revision ") strings.write_int(&b, revision) // Finalize pretty name. - os_version.as_string = strings.to_string(b) + res.full = strings.to_string(b) // Retrieve kernel release using `sysctl`, e.g. 13.1-RELEASE-p2 mib = []i32{sys.CTL_KERN, sys.KERN_OSRELEASE} @@ -46,32 +40,28 @@ init_os_version :: proc "contextless" () { return } - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - // Parse kernel version release := string(cstring(raw_data(kernel_version_buf[:]))) - version_bits := strings.split_n(release, "-", 2, context.temp_allocator) - if len(version_bits) > 1 { - // Parse major, minor from KERN_OSRELEASE - triplet := strings.split(version_bits[0], ".", context.temp_allocator) - if len(triplet) == 2 { - major, major_ok := strconv.parse_int(triplet[0]) - minor, minor_ok := strconv.parse_int(triplet[1]) + version_bits, _, _ := strings.partition(release, "-") + res.kernel = _parse_version(version_bits) + res.kernel.patch = revision - if major_ok && minor_ok { - os_version.major = major - os_version.minor = minor - } - } - } + res.os = res.kernel + + return res, true } -@(init, private) -init_ram :: proc "contextless" () { +@(private) +_ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { // Retrieve RAM info using `sysctl` mib := []i32{sys.CTL_HW, sys.HW_PHYSMEM} - mem_size: u64 - if sys.sysctl(mib, &mem_size) { - ram.total_ram = int(mem_size) + if sys.sysctl(mib, &total_ram) { + ok = true } -} \ No newline at end of file + + mib = []i32{sys.CTL_HW, sys.HW_USERMEM} + if sys.sysctl(mib, &free_ram) { + ok = true + } + return +} diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index 671600640..7886b6243 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -2,18 +2,14 @@ package sysinfo import "base:intrinsics" import "base:runtime" - -import "core:strconv" import "core:strings" import "core:sys/linux" -@(init, private) -init_os_version :: proc "contextless" () { - context = runtime.default_context() +@(private) +_os_version :: proc (allocator: runtime.Allocator, loc := #caller_location) -> (res: OS_Version, ok: bool) { + res.platform = .Linux - os_version.platform = .Linux - - b := strings.builder_from_bytes(version_string_buf[:]) + b := strings.builder_make_none(allocator = allocator, loc = loc) // Try to parse `/etc/os-release` for `PRETTY_NAME="Ubuntu 20.04.3 LTS` pretty_parse: { @@ -23,10 +19,7 @@ init_os_version :: proc "contextless" () { break pretty_parse } - defer { - cerrno := linux.close(fd) - assert(cerrno == .NONE, "Failed to close the file descriptor") - } + defer linux.close(fd) os_release_buf: [2048]u8 n, read_errno := linux.read(fd, os_release_buf[:]) @@ -36,17 +29,27 @@ init_os_version :: proc "contextless" () { } release := string(os_release_buf[:n]) - // Search the line in the file until we find "PRETTY_NAME=" - NEEDLE :: "PRETTY_NAME=\"" - _, _, post := strings.partition(release, NEEDLE) - if len(post) > 0 { - end := strings.index_any(post, "\"\n") - if end > -1 && post[end] == '"' { - strings.write_string(&b, post[:end]) + { + // Search the line in the file until we find "PRETTY_NAME=" + _, _, post := strings.partition(release, `PRETTY_NAME="`) + if len(post) > 0 { + end := strings.index_any(post, "\"\n") + if end > -1 && post[end] == '"' { + strings.write_string(&b, post[:end]) + } + } + if strings.builder_len(b) == 0 { + strings.write_string(&b, "Unknown Linux Distro") } } - if strings.builder_len(b) == 0 { - strings.write_string(&b, "Unknown Linux Distro") + + { + // Search the line in the file until we find "VERSION=" + _, _, post := strings.partition(release, `VERSION="`) + if len(post) > 0 { + pre, _, _ := strings.partition(post, ` `) + res.os = _parse_version(pre) + } } } @@ -63,43 +66,30 @@ init_os_version :: proc "contextless" () { strings.write_string(&b, string(cstring(&uts.release[0]))) release_str := string(b.buf[release_i:]) - os_version.as_string = strings.to_string(b) + res.full = strings.to_string(b) // Parse the Linux version out of the release string version_loop: { version_num, _, version_suffix := strings.partition(release_str, "-") - os_version.version = version_suffix + res.release = version_suffix + res.kernel = _parse_version(version_num) - i: int - for part in strings.split_iterator(&version_num, ".") { - defer i += 1 - - dst: ^int - switch i { - case 0: dst = &os_version.major - case 1: dst = &os_version.minor - case 2: dst = &os_version.patch - case: break version_loop - } - - num, ok := strconv.parse_int(part) - if !ok { break version_loop } - - dst^ = num - } } + return res, true } -@(init, private) -init_ram :: proc "contextless" () { +@(private) +_ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { // Retrieve RAM info using `sysinfo` sys_info: linux.Sys_Info errno := linux.sysinfo(&sys_info) assert_contextless(errno == .NONE, "Good luck to whoever's debugging this, something's seriously cucked up!") - ram = RAM{ - total_ram = int(sys_info.totalram) * int(sys_info.mem_unit), - free_ram = int(sys_info.freeram) * int(sys_info.mem_unit), - total_swap = int(sys_info.totalswap) * int(sys_info.mem_unit), - free_swap = int(sys_info.freeswap) * int(sys_info.mem_unit), - } -} + + total_ram = i64(sys_info.totalram) * i64(sys_info.mem_unit) + free_ram = i64(sys_info.freeram) * i64(sys_info.mem_unit) + total_swap = i64(sys_info.totalswap) * i64(sys_info.mem_unit) + free_swap = i64(sys_info.freeswap) * i64(sys_info.mem_unit) + ok = true + + return +} \ No newline at end of file diff --git a/core/sys/info/platform_other.odin b/core/sys/info/platform_other.odin new file mode 100644 index 000000000..86325ee72 --- /dev/null +++ b/core/sys/info/platform_other.odin @@ -0,0 +1,14 @@ +#+build essence, haiku +package sysinfo + +import "base:runtime" + +@(private) +_ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { + return +} + +@(private) +_os_version :: proc(allocator: runtime.Allocator, loc := #caller_location) -> (res: OS_Version, ok: bool) { + return {}, false +} \ No newline at end of file diff --git a/core/sys/info/platform_wasm.odin b/core/sys/info/platform_wasm.odin new file mode 100644 index 000000000..2778862e9 --- /dev/null +++ b/core/sys/info/platform_wasm.odin @@ -0,0 +1,14 @@ +#+build wasm32, wasm64p32 +package sysinfo + +import "base:runtime" + +@(private) +_ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { + return +} + +@(private) +_os_version :: proc(allocator: runtime.Allocator, loc := #caller_location) -> (res: OS_Version, ok: bool) { + return {}, false +} \ No newline at end of file diff --git a/core/sys/info/platform_windows.odin b/core/sys/info/platform_windows.odin index 393549f8f..e7d3baa83 100644 --- a/core/sys/info/platform_windows.odin +++ b/core/sys/info/platform_windows.odin @@ -1,33 +1,27 @@ package sysinfo +import "base:intrinsics" +import "base:runtime" +import "core:strings" +import "core:unicode/utf16" import sys "core:sys/windows" -import "base:intrinsics" -import "core:strings" -import "core:unicode/utf16" -import "base:runtime" - -@(init, private) -init_os_version :: proc "contextless" () { - // NOTE(Jeroen): Only needed for the string builder. - context = runtime.default_context() +@(private) +_os_version :: proc (allocator: runtime.Allocator, loc := #caller_location) -> (res: OS_Version, ok: bool) { /* - NOTE(Jeroen): - `GetVersionEx` will return 6.2 for Windows 10 unless the program is manifested for Windows 10. - `RtlGetVersion` will return the true version. - - Rather than include the WinDDK, we ask the kernel directly. - `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion` is for the minor build version (Update Build Release) + NOTE(Jeroen): + `GetVersionEx` will return 6.2 for Windows 10 unless the program is manifested for Windows 10. + `RtlGetVersion` will return the true version. + Rather than include the WinDDK, we ask the kernel directly. + `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion` is for the minor build version (Update Build Release) */ - os_version.platform = .Windows + res.platform = .Windows osvi: sys.OSVERSIONINFOEXW osvi.dwOSVersionInfoSize = size_of(osvi) - status := sys.RtlGetVersion(&osvi) - - if status != 0 { - return + if status := sys.RtlGetVersion(&osvi); status != 0 { + return res, false } product_type: sys.Windows_Product_Type @@ -37,12 +31,13 @@ init_os_version :: proc "contextless" () { &product_type, ) - os_version.major = int(osvi.dwMajorVersion) - os_version.minor = int(osvi.dwMinorVersion) - os_version.build[0] = int(osvi.dwBuildNumber) + res.os.major = int(osvi.dwMajorVersion) + res.os.minor = int(osvi.dwMinorVersion) + res.kernel.major = int(osvi.dwMajorVersion) + res.kernel.minor = int(osvi.dwBuildNumber) + b := strings.builder_make_none(allocator = allocator, loc = loc) - b := strings.builder_from_bytes(version_string_buf[:]) strings.write_string(&b, "Windows ") switch osvi.dwMajorVersion { @@ -120,13 +115,13 @@ init_os_version :: proc "contextless" () { } // Grab DisplayVersion - os_version.version = format_display_version(&b) + res.release = format_display_version(&b) // Grab build number and UBR - os_version.build[1] = format_build_number(&b, int(osvi.dwBuildNumber)) + res.kernel.patch = format_build_number(&b, int(osvi.dwBuildNumber)) // Finish the string - os_version.as_string = strings.to_string(b) + res.full = strings.to_string(b) format_windows_product_type :: proc (b: ^strings.Builder, prod_type: sys.Windows_Product_Type) { #partial switch prod_type { @@ -253,29 +248,33 @@ init_os_version :: proc "contextless" () { } return } + + return res, true } -@(init, private) -init_ram :: proc "contextless" () { +@(private) +_ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { state: sys.MEMORYSTATUSEX state.dwLength = size_of(state) - ok := sys.GlobalMemoryStatusEx(&state) - if !ok { + if ok := sys.GlobalMemoryStatusEx(&state); !ok { return } - ram = RAM{ - total_ram = int(state.ullTotalPhys), - free_ram = int(state.ullAvailPhys), - total_swap = int(state.ullTotalPageFil), - free_swap = int(state.ullAvailPageFil), - } + + total_ram = i64(state.ullTotalPhys) + free_ram = i64(state.ullAvailPhys) + total_swap = i64(state.ullTotalPageFil) + free_swap = i64(state.ullAvailPageFil) + ok = true + + return } -@(init, private) -init_gpu_info :: proc "contextless" () { +_iterate_gpus :: proc(it: ^GPU_Iterator, minimum_vram := i64(256 * 1024 * 1024)) -> (gpu: GPU, index: int, ok: bool) { GPU_ROOT_KEY :: `SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}` + defer it.index += 1 + gpu_key: sys.HKEY if status := sys.RegOpenKeyExW( sys.HKEY_LOCAL_MACHINE, @@ -284,75 +283,64 @@ init_gpu_info :: proc "contextless" () { sys.KEY_ENUMERATE_SUB_KEYS, &gpu_key, ); status != i32(sys.ERROR_SUCCESS) { - return + return {}, it.index, false } defer sys.RegCloseKey(gpu_key) - gpu: ^GPU + buf_wstring: [100]u16 + buf_len := u32(len(buf_wstring)) + buf_key: [4 * len(buf_wstring)]u8 + buf_leaf: [100]u8 + leaf: string - index := sys.DWORD(0) - gpu_count := 0 - gpu_loop: for gpu_count < MAX_GPUS { - defer index += 1 - - buf_wstring: [100]u16 - buf_len := u32(len(buf_wstring)) - buf_key: [4 * len(buf_wstring)]u8 - buf_leaf: [100]u8 - buf_scratch: [100]u8 + gpu_loop: { + defer it._index += 1 if status := sys.RegEnumKeyW( gpu_key, - index, + auto_cast it._index, &buf_wstring[0], &buf_len, ); status != i32(sys.ERROR_SUCCESS) { - break gpu_loop + return {}, it.index, false } utf16.decode_to_utf8(buf_leaf[:], buf_wstring[:]) - leaf := string(cstring(&buf_leaf[0])) + leaf = string(cstring(&buf_leaf[0])) // Skip leaves that are not of the form 000x - if !is_integer(leaf) { - continue + if is_integer(leaf) { + break gpu_loop } - - n := copy(buf_key[:], GPU_ROOT_KEY) - buf_key[n] = '\\' - copy(buf_key[n+1:], leaf) - - key_len := len(GPU_ROOT_KEY) + len(leaf) + 1 - - utf16.encode_string(buf_wstring[:], string(buf_key[:key_len])) - key := cstring16(&buf_wstring[0]) - - if res, ok := read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "ProviderName", buf_scratch[:]); ok { - if vendor, s_ok := intern_gpu_string(res); s_ok { - gpu = &_gpus[gpu_count] - gpu.vendor_name = vendor - } else { - break gpu_loop - } - } else { - continue - } - - if res, ok := read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "DriverDesc", buf_scratch[:]); ok { - if model_name, s_ok := intern_gpu_string(res); s_ok { - gpu = &_gpus[gpu_count] - gpu.model_name = model_name - } else { - break gpu_loop - } - } - - if vram, ok := read_reg_i64(sys.HKEY_LOCAL_MACHINE, key, "HardwareInformation.qwMemorySize"); ok { - gpu.total_ram = int(vram) - } - gpu_count += 1 // not deferred at the top because it only increments if we get this far. } - gpus = _gpus[:gpu_count] + + n := copy(buf_key[:], GPU_ROOT_KEY) + buf_key[n] = '\\' + copy(buf_key[n+1:], leaf) + + key_len := len(GPU_ROOT_KEY) + len(leaf) + 1 + + utf16.encode_string(buf_wstring[:], string(buf_key[:key_len])) + key := cstring16(&buf_wstring[0]) + + // Determine if this is a real GPU, or perhaps a screen mirroring or RDP driver + // Real devices tend to have more than 256 MiB of VRAM + gpu.vram, _ = read_reg_i64 (sys.HKEY_LOCAL_MACHINE, key, "HardwareInformation.qwMemorySize") + if gpu.vram < minimum_vram { + return + } + + // Real devices tend to have a matching PCI device + matching, _ := read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "MatchingDeviceId", it._buffer[:100]) + if !strings.has_prefix(matching, "PCI\\VEN") { + return + } + + gpu.vendor, _ = read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "ProviderName", it._buffer[ 0:][:100]) + gpu.model, _ = read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "DriverDesc", it._buffer[100:][:100]) + gpu.driver, _ = read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "DriverVersion", it._buffer[200:][:100]) + + return gpu, it.index, true } @(private) diff --git a/core/sys/info/sysinfo.odin b/core/sys/info/sysinfo.odin index 07f8f0c81..fa4847158 100644 --- a/core/sys/info/sysinfo.odin +++ b/core/sys/info/sysinfo.odin @@ -1,15 +1,110 @@ package sysinfo -when !(ODIN_ARCH == .amd64 || ODIN_ARCH == .i386 || ODIN_ARCH == .arm32 || ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 || ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32) { - #assert(false, "This package is unsupported on this architecture.") +import "base:runtime" +import "core:strings" +import "core:strconv" + +#assert( + ODIN_ARCH == .amd64 || ODIN_ARCH == .i386 || \ + ODIN_ARCH == .arm32 || ODIN_ARCH == .arm64 || \ + ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 || \ + ODIN_ARCH == .riscv64, + "This package is unsupported on this architecture.") + +/* +Retrieves the number of physical and logical CPU cores + +Returns: +- physical: The number of physical cores +- logical: The number of logical cores +- ok: `true` when we could retrieve the CPU information, `false` otherwise +*/ +cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: bool) { + return _cpu_core_count() } -os_version: OS_Version -ram: RAM -gpus: []GPU +/* +Retrieves CPU features where available -// Only on MacOS, contains the actual MacOS version, while the `os_version` contains the kernel version. -macos_version: Version +The results are cached + +Returns: +- features: An architecture-specific `bit_set` +- ok: `true` when we could retrieve the CPU features, `false` otherwise +*/ +cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { + return _cpu_features() +} + +/* +Retrieves the CPU's name + +The results are cached + +Returns: +- name: A `string` containing the CPU model name, empty if the lookup failed +*/ +cpu_name :: proc() -> (name: string) { + return _cpu_name() +} + +/* +Retrieves RAM statistics + +Unavailable stats will be returned as `0` bytes + +Returns: +- total_ram: Total RAM reported by the operating system, in bytes +- free_ram: Free RAM reported by the operating system, in bytes +- total_swap: Total SWAP reported by the operating system, in bytes +- free_swap: Free SWAP reported by the operating system, in bytes +- ok: `true` when we could retrieve RAM statistics, `false` otherwise +*/ +ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { + return _ram_stats() +} + +/* +Retrieves OS version information + +*Allocates Using Provided Allocator* + +You can use `destroy_os_version` to free the results + +Inputs: +- allocator: A `runtime.Allocator` on which the version strings will be allocated +- loc: The caller location + +Returns: +- res: An `OS_Version` struct +- ok: `true` when we could retrieve OS version information, `false` otherwise +*/ +os_version :: proc(allocator: runtime.Allocator, loc := #caller_location) -> (res: OS_Version, ok: bool) { + return _os_version(allocator = allocator, loc = loc) +} + +/* +Releases an `OS_Version`'s strings + +*Frees Using Provided Allocator* + +Inputs: +- version: An `OS_Version` struct +- allocator: A `runtime.Allocator` on which the version strings will be freed +*/ +destroy_os_version :: proc(version: OS_Version, allocator: runtime.Allocator) { + delete(version.full, allocator) + // `version.release` is part of `version.full` and does not need to be freed separately. +} + +OS_Version :: struct { + platform: OS_Version_Platform, // Windows, Linux, MacOS, iOS, etc. + full: string, // e.g. Windows 10 Professional (version: 22H2), build: 19045.6575 + release: string, // e.g. 22H2 + + os: Version, // e.g. {major = 10, minor = 10, patch = 0} + kernel: Version, // e.g. {major = 10, minor = 19045, patch = 6575} +} OS_Version_Platform :: enum { Unknown, @@ -26,54 +121,69 @@ Version :: struct { major, minor, patch: int, } -OS_Version :: struct { - platform: OS_Version_Platform, +/* +Iterates over GPU adapters - using _: Version, - build: [2]int, - version: string, +On Windows: Enumerates `Computer\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}` +Elsewhere: Unsupported at the moment, returns `{}, 0, false` - as_string: string, -} +Important: The `vendor` name, `model` name and `driver` version strings are backed by the `GPU_Iterator`. +Clone them if you want to these to persist. -RAM :: struct { - total_ram: int, - free_ram: int, - total_swap: int, - free_swap: int, +Inputs: +- it: A pointer to a `GPU_Iterator` +- minimum_vram: The number of bytes of VRAM an adapter has to have to be considered, default 256 MiB + (This excludes most screen mirroring / remote desktop drivers) + +Returns: + gpu: A `GPU` struct which contains `vendor` name, `model` name, `driver` version and `vram` in bytes + index: Loop index, optional + ok: `true` if this was a success and we should continue, `false` otherwise +*/ +iterate_gpus :: proc(it: ^GPU_Iterator, minimum_vram := i64(256 * 1024 * 1024)) -> (gpu: GPU, index: int, ok: bool) { + when ODIN_OS == .Windows { + return _iterate_gpus(it, minimum_vram) + } else { + // Not implemented on another OS, yet + return {}, 0, false + } } GPU :: struct { - vendor_name: string, - model_name: string, - total_ram: int, + vendor: string, + model: string, + driver: string, + vram: i64, +} + +GPU_Iterator :: struct { + // Public iterator index + index: int, + + // Internal buffer + index + _buffer: [512]u8, + _index: int, } @(private) -version_string_buf: [1024]u8 +_parse_version :: proc (str: string) -> (res: Version) { + str := str + i: int + for part in strings.split_iterator(&str, ".") { + defer i += 1 + dst: ^int + switch i { + case 0: dst = &res.major + case 1: dst = &res.minor + case 2: dst = &res.patch + case: return + } -@(private) -MAX_GPUS :: 16 - -@(private) -_gpus: [MAX_GPUS]GPU - -@(private) -_gpu_string_buf: [MAX_GPUS * 256 * 2]u8 // Reserve up to 256 bytes for each GPU's vendor and model name - -@(private) -_gpu_string_offset: int - -@(private) -intern_gpu_string :: proc "contextless" (str: string) -> (res: string, ok: bool) { - if _gpu_string_offset + len(str) + 1 > size_of(_gpu_string_buf) { - return "", false + if num, num_ok := strconv.parse_int(part); !num_ok { + return + } else { + dst^ = num + } } - - n := copy(_gpu_string_buf[_gpu_string_offset:], str) - _gpu_string_buf[_gpu_string_offset + len(str)] = 0 - res = string(_gpu_string_buf[_gpu_string_offset:][:len(str)]) - _gpu_string_offset += n + 1 - - return res, true + return } \ No newline at end of file diff --git a/core/sys/unix/sysctl_openbsd.odin b/core/sys/unix/sysctl_openbsd.odin index e71b743f8..a18b334c5 100644 --- a/core/sys/unix/sysctl_openbsd.odin +++ b/core/sys/unix/sysctl_openbsd.odin @@ -46,4 +46,5 @@ CTL_HW :: 6 HW_VERSION :: 16 HW_SERIALNO :: 17 HW_UUID :: 18 - HW_PHYSMEM64 :: 19 \ No newline at end of file + HW_PHYSMEM64 :: 19 + HW_USERMEM64 :: 20 \ No newline at end of file From af43e6851bdbf5a2c484fbf145ca7a1a12a22dd1 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 23 Feb 2026 23:55:36 +0100 Subject: [PATCH 542/766] [core:sys/info] Remove `, ok` --- core/crypto/_aes/hw_intel/api.odin | 4 +--- core/crypto/_chacha20/simd128/chacha20_simd128.odin | 4 +--- core/crypto/_chacha20/simd256/chacha20_simd256.odin | 4 +--- core/crypto/sha2/sha2_impl_hw_intel.odin | 4 +--- core/sys/info/cpu_arm.odin | 1 - core/sys/info/cpu_darwin_arm64.odin | 4 ++-- core/sys/info/cpu_intel.odin | 8 ++------ core/sys/info/cpu_linux_arm.odin | 6 ++---- core/sys/info/cpu_linux_riscv64.odin | 6 ++---- core/sys/info/cpu_other.odin | 4 ++-- core/sys/info/cpu_riscv64.odin | 3 +-- core/sys/info/cpu_wasm.odin | 4 ++-- core/sys/info/doc.odin | 11 +++++------ core/sys/info/sysinfo.odin | 13 ++++++------- 14 files changed, 28 insertions(+), 48 deletions(-) diff --git a/core/crypto/_aes/hw_intel/api.odin b/core/crypto/_aes/hw_intel/api.odin index e2da09f12..ce769fc10 100644 --- a/core/crypto/_aes/hw_intel/api.odin +++ b/core/crypto/_aes/hw_intel/api.odin @@ -6,8 +6,6 @@ import "core:sys/info" // is_supported returns true iff hardware accelerated AES // is supported. is_supported :: proc "contextless" () -> bool { - features := info.cpu_features() or_return - // Note: Everything with AES-NI and PCLMULQDQ has support for // the required SSE extxtensions. req_features :: info.CPU_Features{ @@ -17,7 +15,7 @@ is_supported :: proc "contextless" () -> bool { .aes, .pclmulqdq, } - return features >= req_features + return info.cpu_features() >= req_features } // Context is a keyed AES (ECB) instance. diff --git a/core/crypto/_chacha20/simd128/chacha20_simd128.odin b/core/crypto/_chacha20/simd128/chacha20_simd128.odin index e477954d2..9da0a54ea 100644 --- a/core/crypto/_chacha20/simd128/chacha20_simd128.odin +++ b/core/crypto/_chacha20/simd128/chacha20_simd128.odin @@ -227,9 +227,7 @@ is_performant :: proc "contextless" () -> bool { req_features :: info.CPU_Features{.V} } - features := info.cpu_features() or_return - - return features >= req_features + return info.cpu_features() >= req_features } else when ODIN_ARCH == .wasm64p32 || ODIN_ARCH == .wasm32 { return intrinsics.has_target_feature("simd128") } else { diff --git a/core/crypto/_chacha20/simd256/chacha20_simd256.odin b/core/crypto/_chacha20/simd256/chacha20_simd256.odin index ebc294590..407fbac56 100644 --- a/core/crypto/_chacha20/simd256/chacha20_simd256.odin +++ b/core/crypto/_chacha20/simd256/chacha20_simd256.odin @@ -39,11 +39,9 @@ _VEC_TWO: simd.u64x4 : {2, 0, 2, 0} // is_performant returns true iff the target and current host both support // "enough" SIMD to make this implementation performant. is_performant :: proc "contextless" () -> bool { - features := info.cpu_features() or_return - req_features :: info.CPU_Features{.avx, .avx2} - return features >= req_features + return info.cpu_features() >= req_features } @(private = "file") diff --git a/core/crypto/sha2/sha2_impl_hw_intel.odin b/core/crypto/sha2/sha2_impl_hw_intel.odin index 594edf0dc..83ef58a12 100644 --- a/core/crypto/sha2/sha2_impl_hw_intel.odin +++ b/core/crypto/sha2/sha2_impl_hw_intel.odin @@ -52,15 +52,13 @@ K_15 :: simd.u64x2{0xa4506ceb90befffa, 0xc67178f2bef9a3f7} // is_hardware_accelerated_256 returns true iff hardware accelerated // SHA-224/SHA-256 is supported. is_hardware_accelerated_256 :: proc "contextless" () -> bool { - features := info.cpu_features() or_return - req_features :: info.CPU_Features{ .sse2, .ssse3, .sse41, .sha, } - return features >= req_features + return info.cpu_features() >= req_features } @(private, enable_target_feature="sse2,ssse3,sse4.1,sha") diff --git a/core/sys/info/cpu_arm.odin b/core/sys/info/cpu_arm.odin index c254432e3..439007e24 100644 --- a/core/sys/info/cpu_arm.odin +++ b/core/sys/info/cpu_arm.odin @@ -43,7 +43,6 @@ CPU_Features :: distinct bit_set[CPU_Feature; u64] // Retrieving CPU features on ARM is even more expensive than on Intel, so we're doing this lookup only once, before `main()` @(private) _features: CPU_Features -@(private) _features_ok: bool @(private) _name_buf: [256]u8 diff --git a/core/sys/info/cpu_darwin_arm64.odin b/core/sys/info/cpu_darwin_arm64.odin index 45f1d4082..7f4c7dda2 100644 --- a/core/sys/info/cpu_darwin_arm64.odin +++ b/core/sys/info/cpu_darwin_arm64.odin @@ -3,8 +3,8 @@ package sysinfo import "core:sys/unix" @(private) -_cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { - return _features, true +_cpu_features :: proc "contextless" () -> (features: CPU_Features) { + return _features } @(init, private) diff --git a/core/sys/info/cpu_intel.odin b/core/sys/info/cpu_intel.odin index 01cee1b3e..0a75e2475 100644 --- a/core/sys/info/cpu_intel.odin +++ b/core/sys/info/cpu_intel.odin @@ -53,7 +53,6 @@ CPU_Features :: distinct bit_set[CPU_Feature; u64] // `cpuid` is a barrier so we try not performing this query this more than necessary. // `atomic_load_explicit` is also a barrier, so we're doing this lookup only once, before `main()` @(private) _features: CPU_Features -@(private) _features_ok: bool @(init, private) _init_cpu_features :: proc "contextless" () { @@ -69,7 +68,6 @@ _init_cpu_features :: proc "contextless" () { max_id, _, _, _ := cpuid(0, 0) if max_id < 1 { _features = {} - _features_ok = false return } @@ -87,8 +85,6 @@ _init_cpu_features :: proc "contextless" () { try_set(&_features, .os_xsave, 27, ecx1) try_set(&_features, .rdrand, 30, ecx1) - _features_ok = true - when ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD { // xgetbv is an illegal instruction under FreeBSD 13, OpenBSD 7.1 and NetBSD 10 // return before probing further @@ -156,8 +152,8 @@ _init_cpu_features :: proc "contextless" () { } @(private) -_cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { - return _features, _features_ok +_cpu_features :: proc "contextless" () -> (features: CPU_Features) { + return _features } // `cpuid` is a barrier so we try not performing this query this more than necessary. diff --git a/core/sys/info/cpu_linux_arm.odin b/core/sys/info/cpu_linux_arm.odin index cfdcbaf75..492b51c8b 100644 --- a/core/sys/info/cpu_linux_arm.odin +++ b/core/sys/info/cpu_linux_arm.odin @@ -8,8 +8,8 @@ import "core:strconv" import "core:strings" @(private) -_cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { - return _features, _features_ok +_cpu_features :: proc "contextless" () -> (features: CPU_Features) { + return _features } @(init, private) @@ -32,8 +32,6 @@ _init_cpu_features :: proc "contextless" () { if key != "Features" { continue } - _features_ok = true - for feature in strings.split_by_byte_iterator(&value, ' ') { switch feature { case "asimd", "neon": _features += { .asimd } diff --git a/core/sys/info/cpu_linux_riscv64.odin b/core/sys/info/cpu_linux_riscv64.odin index 612456ff0..519c6b315 100644 --- a/core/sys/info/cpu_linux_riscv64.odin +++ b/core/sys/info/cpu_linux_riscv64.odin @@ -71,8 +71,6 @@ _init_cpu_features :: proc "contextless" () { } } - _features_ok = true - // hwprobe for other features. { pairs := []linux.RISCV_HWProbe{ @@ -109,8 +107,8 @@ _init_cpu_features :: proc "contextless" () { } @(private) -_cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { - return _features, _features_ok +_cpu_features :: proc "contextless" () -> (features: CPU_Features) { + return _features } @(private) diff --git a/core/sys/info/cpu_other.odin b/core/sys/info/cpu_other.odin index 6b7f78e19..cb190a3c4 100644 --- a/core/sys/info/cpu_other.odin +++ b/core/sys/info/cpu_other.odin @@ -8,7 +8,7 @@ _cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: bo when ODIN_ARCH == .arm32 || ODIN_ARCH == .arm64 { @(private) - _cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { - return {}, false + _cpu_features :: proc "contextless" () -> (features: CPU_Features) { + return {} } } \ No newline at end of file diff --git a/core/sys/info/cpu_riscv64.odin b/core/sys/info/cpu_riscv64.odin index f67f15ebd..9303e6e79 100644 --- a/core/sys/info/cpu_riscv64.odin +++ b/core/sys/info/cpu_riscv64.odin @@ -98,5 +98,4 @@ CPU_Features :: distinct bit_set[CPU_Feature; u64] // Looking up CPU features is expensive on RISCV, and `atomic_load_explicit` // is also a barrier, so we're doing this lookup only once, before `main()` -@(private) _features: CPU_Features -@(private) _features_ok: bool \ No newline at end of file +@(private) _features: CPU_Features \ No newline at end of file diff --git a/core/sys/info/cpu_wasm.odin b/core/sys/info/cpu_wasm.odin index 9fc99b98c..f33f7cbb4 100644 --- a/core/sys/info/cpu_wasm.odin +++ b/core/sys/info/cpu_wasm.odin @@ -10,8 +10,8 @@ CPU_Feature :: enum u64 {} CPU_Features :: distinct bit_set[CPU_Feature; u64] @(private) -_cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { - return {}, false +_cpu_features :: proc "contextless" () -> (features: CPU_Features) { + return {} } @(private) diff --git a/core/sys/info/doc.odin b/core/sys/info/doc.odin index b93fcc694..b881bef86 100644 --- a/core/sys/info/doc.odin +++ b/core/sys/info/doc.odin @@ -7,7 +7,9 @@ and CPU information. On Windows, GPUs will also be enumerated using the registry. CPU feature flags can be tested against `cpu_features`, where applicable, e.g. -`if .aes in info.cpu_features.? { ... }` +```odin +if .aes in info.cpu_features() { ... } +``` Example: package main @@ -24,11 +26,8 @@ Example: fmt.printfln("OS: %v", version.os) fmt.printfln("Kernel: %v", version.kernel) } - fmt.printfln("CPU: %v", si.cpu_name()) - - if features, features_ok := si.cpu_features(); features_ok { - fmt.printfln(" %v", features) - } + fmt.printfln("CPU: %v", si.cpu_name()) + fmt.printfln(" %v", si.cpu_features()) if physical, logical, cores_ok := si.cpu_core_count(); cores_ok { fmt.printfln("CPU cores: %vc/%vt", physical, logical) } diff --git a/core/sys/info/sysinfo.odin b/core/sys/info/sysinfo.odin index fa4847158..ad120b264 100644 --- a/core/sys/info/sysinfo.odin +++ b/core/sys/info/sysinfo.odin @@ -24,22 +24,21 @@ cpu_core_count :: proc "contextless" () -> (physical: int, logical: int, ok: boo } /* -Retrieves CPU features where available +Returns CPU features where available -The results are cached +The results are looked up before `main` enters and cached Returns: -- features: An architecture-specific `bit_set` -- ok: `true` when we could retrieve the CPU features, `false` otherwise +- features: An architecture-specific `bit_set`, empty if we couldn't retrieve them */ -cpu_features :: proc "contextless" () -> (features: CPU_Features, ok: bool) { +cpu_features :: proc "contextless" () -> (features: CPU_Features) { return _cpu_features() } /* -Retrieves the CPU's name +Returns the CPU's name -The results are cached +The results are looked up before `main` enters and cached Returns: - name: A `string` containing the CPU model name, empty if the lookup failed From 4321efacc321965c5390a2f0e01de56e8b673d5e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 24 Feb 2026 13:05:26 +0100 Subject: [PATCH 543/766] [core:container/priority_queue] Add example and tests --- core/container/priority_queue/doc.odin | 50 ++++++++ .../priority_queue/priority_queue.odin | 4 +- .../container/test_core_priority_queue.odin | 113 ++++++++++++++++++ tests/core/container/test_core_xar.odin | 10 +- 4 files changed, 171 insertions(+), 6 deletions(-) create mode 100644 core/container/priority_queue/doc.odin create mode 100644 tests/core/container/test_core_priority_queue.odin diff --git a/core/container/priority_queue/doc.odin b/core/container/priority_queue/doc.odin new file mode 100644 index 000000000..e499afac9 --- /dev/null +++ b/core/container/priority_queue/doc.odin @@ -0,0 +1,50 @@ +// A priority queue data structure. +package container_priority_queue + +/* +import "base:runtime" +import pq "core:container/priority_queue" + +main :: proc() { + Printer_Job :: struct { + user_id: u64, + weight: enum u8 {Highest, High, Normal, Low, Idle}, + } + + q: pq.Priority_Queue(Printer_Job) + pq.init( + pq = &q, + less = proc(a, b: Printer_Job) -> bool { + // Jobs will be sorted in order of increasing weight + return a.weight < b.weight + }, + swap = pq.default_swap_proc(Printer_Job), + ) + defer pq.destroy(&q) + + // Add jobs with random weights + for _ in 0..<100 { + job: Printer_Job = --- + assert(runtime.random_generator_read_ptr(context.random_generator, &job, size_of(job))) + pq.push(&q, job) + } + + last: Printer_Job + for pq.len(q) > 0 { + // Drain jobs + v := pq.pop(&q) + assert(v.weight >= last.weight) + last = v + } + + // Queue empty? + assert(pq.len(q) == 0) + + // Add one more job + pq.push(&q, Printer_Job{user_id = 42, weight = .Idle}) + + // Cancel all jobs + pq.clear(&q) + assert(pq.len(q) == 0) +} +*/ \ No newline at end of file diff --git a/core/container/priority_queue/priority_queue.odin b/core/container/priority_queue/priority_queue.odin index c9ef807c5..d83750673 100644 --- a/core/container/priority_queue/priority_queue.odin +++ b/core/container/priority_queue/priority_queue.odin @@ -1,9 +1,11 @@ -// A priority queue data structure. package container_priority_queue import "base:builtin" import "base:runtime" +// Priority Queue. +// +// Important: Must be `init`ialized with `less` and `swap` procedures before use. See `doc.odin` for an example. Priority_Queue :: struct($T: typeid) { queue: [dynamic]T, diff --git a/tests/core/container/test_core_priority_queue.odin b/tests/core/container/test_core_priority_queue.odin new file mode 100644 index 000000000..417056d48 --- /dev/null +++ b/tests/core/container/test_core_priority_queue.odin @@ -0,0 +1,113 @@ +package test_core_container + +import "base:runtime" +import pq "core:container/priority_queue" +import "core:math/rand" +import "core:testing" + +@test +test_priority_queue :: proc(t: ^testing.T) { + q: pq.Priority_Queue(int) + pq.init(&q, proc(a, b: int) -> bool { + return a < b + }, pq.default_swap_proc(int)) + defer pq.destroy(&q) + + assert(pq.cap(q) == pq.DEFAULT_CAPACITY) + + pq.push(&q, 42) + assert(pq.len(q) == 1) + assert(pq.peek(q) == 42) + + v := pq.pop(&q) + assert(v == 42) + assert(pq.len(q) == 0) + + ok: bool + v, ok = pq.peek_safe(q) + assert(v == 0 && ok == false) + + v, ok = pq.pop_safe(&q) + assert(v == 0 && ok == false) + + N :: 15 + for _ in 0.. 0 { + v = pq.pop(&q) + assert(v >= last) + last = v + } + + vals := []int{6, 15, 3, 9, 12} + for _v in vals { + pq.push(&q, _v) + } + // Break ordering and fix it + q.queue[3] = 42 + pq.fix(&q, 3) + + last = 0 + for pq.len(q) > 0 { + v = pq.pop(&q) + assert(v >= last) + last = v + } + + assert(pq.len(q) == 0) + + for _v in vals { + pq.push(&q, _v) + } + + // Break ordering again, but this time delete that index + q.queue[3] = 42 + v, ok = pq.remove(&q, 3) + assert(v == 42 && ok == true) + + last = 0 + for pq.len(q) > 0 { + v = pq.pop(&q) + assert(v >= last && v != 42) + last = v + } +} + +@(test) +test_pq_init_from_dynamic_array :: proc(t: ^testing.T) { + N :: 50_000 + + arr := make_dynamic_array_len_cap([dynamic]u64, N, N, context.allocator) + assert(runtime.random_generator_read_ptr(context.random_generator, raw_data(arr), N * size_of(u64))) + + q: pq.Priority_Queue(u64) + pq.init_from_dynamic_array( + pq = &q, + queue = arr, + less = proc(a, b: u64) -> bool { return a < b }, + swap = pq.default_swap_proc(u64), + ) + defer pq.destroy(&q) + + assert(pq.len(q) == N) + + last: u64 + for pq.len(q) > 0 { + v := pq.pop(&q) + assert(v >= last) + last = v + } + + assert(pq.len(q) == 0) + assert(pq.cap(q) == N) + + pq.reserve(&q, N + 12) + assert(pq.cap(q) == N + 12) + +} \ No newline at end of file diff --git a/tests/core/container/test_core_xar.odin b/tests/core/container/test_core_xar.odin index a58b369df..ee9318097 100644 --- a/tests/core/container/test_core_xar.odin +++ b/tests/core/container/test_core_xar.odin @@ -3,13 +3,13 @@ package test_core_container import "core:container/xar" import "core:testing" -Value :: struct { - v: int, - p: ^int, -} - @test test_xar_pointer_stability :: proc(t: ^testing.T) { + Value :: struct { + v: int, + p: ^int, + } + x: xar.Array(int, 4) defer xar.destroy(&x) From 853afea0c7cd5152f22862ed1ad1a2acecff439e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 24 Feb 2026 13:18:56 +0100 Subject: [PATCH 544/766] [core:container/priority_queue] Make example visible on package overview --- core/container/priority_queue/doc.odin | 97 ++++++++++--------- .../priority_queue/priority_queue.odin | 3 +- 2 files changed, 52 insertions(+), 48 deletions(-) diff --git a/core/container/priority_queue/doc.odin b/core/container/priority_queue/doc.odin index e499afac9..7779e6e0a 100644 --- a/core/container/priority_queue/doc.odin +++ b/core/container/priority_queue/doc.odin @@ -1,50 +1,53 @@ -// A priority queue data structure. -package container_priority_queue - /* -import "base:runtime" -import pq "core:container/priority_queue" +A priority queue data structure. -main :: proc() { - Printer_Job :: struct { - user_id: u64, - weight: enum u8 {Highest, High, Normal, Low, Idle}, +Important: It needs to be initialized with `less` and `swap` procedures, see `init` and `init_from_dynamic_array`. + +Example: + import "base:runtime" + import pq "core:container/priority_queue" + + main :: proc() { + Printer_Job :: struct { + user_id: u64, + weight: enum u8 {Highest, High, Normal, Low, Idle}, + } + + q: pq.Priority_Queue(Printer_Job) + pq.init( + pq = &q, + less = proc(a, b: Printer_Job) -> bool { + // Jobs will be sorted in order of increasing weight + return a.weight < b.weight + }, + swap = pq.default_swap_proc(Printer_Job), + ) + defer pq.destroy(&q) + + // Add jobs with random weights + for _ in 0..<100 { + job: Printer_Job = --- + assert(runtime.random_generator_read_ptr(context.random_generator, &job, size_of(job))) + pq.push(&q, job) + } + + // Drain jobs in order of importance + last: Printer_Job + for pq.len(q) > 0 { + v := pq.pop(&q) + assert(v.weight >= last.weight) + last = v + } + + // Queue empty? + assert(pq.len(q) == 0) + + // Add one more job + pq.push(&q, Printer_Job{user_id = 42, weight = .Idle}) + + // Cancel all jobs + pq.clear(&q) + assert(pq.len(q) == 0) } - - q: pq.Priority_Queue(Printer_Job) - pq.init( - pq = &q, - less = proc(a, b: Printer_Job) -> bool { - // Jobs will be sorted in order of increasing weight - return a.weight < b.weight - }, - swap = pq.default_swap_proc(Printer_Job), - ) - defer pq.destroy(&q) - - // Add jobs with random weights - for _ in 0..<100 { - job: Printer_Job = --- - assert(runtime.random_generator_read_ptr(context.random_generator, &job, size_of(job))) - pq.push(&q, job) - } - - last: Printer_Job - for pq.len(q) > 0 { - // Drain jobs - v := pq.pop(&q) - assert(v.weight >= last.weight) - last = v - } - - // Queue empty? - assert(pq.len(q) == 0) - - // Add one more job - pq.push(&q, Printer_Job{user_id = 42, weight = .Idle}) - - // Cancel all jobs - pq.clear(&q) - assert(pq.len(q) == 0) -} -*/ \ No newline at end of file +*/ +package container_priority_queue \ No newline at end of file diff --git a/core/container/priority_queue/priority_queue.odin b/core/container/priority_queue/priority_queue.odin index d83750673..c7e9f61dc 100644 --- a/core/container/priority_queue/priority_queue.odin +++ b/core/container/priority_queue/priority_queue.odin @@ -5,7 +5,8 @@ import "base:runtime" // Priority Queue. // -// Important: Must be `init`ialized with `less` and `swap` procedures before use. See `doc.odin` for an example. +// Important: It needs to be initialized with `less` and `swap` procedures, see `init` and `init_from_dynamic_array`. +// See `doc.odin` for an example. Priority_Queue :: struct($T: typeid) { queue: [dynamic]T, From 2cc7fe6d16969b09bfffee8e0e2ed831fc350489 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 24 Feb 2026 14:46:30 +0100 Subject: [PATCH 545/766] [core:sys/info] Fix small doc render issue --- core/sys/info/doc.odin | 102 ++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/core/sys/info/doc.odin b/core/sys/info/doc.odin index b881bef86..1f4668146 100644 --- a/core/sys/info/doc.odin +++ b/core/sys/info/doc.odin @@ -6,10 +6,8 @@ and CPU information. On Windows, GPUs will also be enumerated using the registry. -CPU feature flags can be tested against `cpu_features`, where applicable, e.g. -```odin -if .aes in info.cpu_features() { ... } -``` +CPU feature flags can be tested against `cpu_features`, where applicable, e.g.: +`if .aes in info.cpu_features() { ... }` Example: package main @@ -47,61 +45,63 @@ Example: } } -- Example Windows output: + /* + Example Windows output: - Odin: dev-2026-02 - OS (full): Windows 10 Professional (version: 22H2), build: 19045.6575 - OS (rel): 22H2 - OS: Version{major = 10, minor = 0, patch = 0} - Kernel: Version{major = 10, minor = 19045, patch = 6575} - CPU: AMD Ryzen 9 5950X 16-Core Processor - CPU_Features{aes, adx, avx, avx2, bmi1, bmi2, erms, fma, os_xsave, pclmulqdq, popcnt, rdrand, rdseed, sha, sse2, sse3, ssse3, sse41, sse42} - CPU cores: 16c/32t - RAM: 32.1 GiB/63.9 GiB - SWAP: 21.6 GiB/73.4 GiB + Odin: dev-2026-02 + OS (full): Windows 10 Professional (version: 22H2), build: 19045.6575 + OS (rel): 22H2 + OS: Version{major = 10, minor = 0, patch = 0} + Kernel: Version{major = 10, minor = 19045, patch = 6575} + CPU: AMD Ryzen 9 5950X 16-Core Processor + CPU_Features{aes, adx, avx, avx2, bmi1, bmi2, erms, fma, os_xsave, pclmulqdq, popcnt, rdrand, rdseed, sha, sse2, sse3, ssse3, sse41, sse42} + CPU cores: 16c/32t + RAM: 32.1 GiB/63.9 GiB + SWAP: 21.6 GiB/73.4 GiB - GPU #0: - Vendor: Advanced Micro Devices, Inc. - Model: AMD Radeon RX 9070 - VRAM: 15.9 GiB + GPU #0: + Vendor: Advanced Micro Devices, Inc. + Model: AMD Radeon RX 9070 + VRAM: 15.9 GiB -- Example Linux output: + Example Linux output: - Odin: dev-2026-02 - OS (full): Ubuntu 24.04.3 LTS, Linux 6.6.87.2-microsoft-standard-WSL2 - OS (rel): microsoft-standard-WSL2 - OS: Version{major = 24, minor = 4, patch = 3} - Kernel: Version{major = 6, minor = 6, patch = 87} - CPU: AMD Ryzen 9 5950X 16-Core Processor - CPU_Features{aes, adx, avx, avx2, bmi1, bmi2, erms, fma, os_xsave, pclmulqdq, popcnt, rdrand, rdseed, sha, sse2, sse3, ssse3, sse41, sse42} - CPU cores: 16c/32t - RAM: 29.2 GiB/31.3 GiB - SWAP: 8.0 GiB/8.0 GiB + Odin: dev-2026-02 + OS (full): Ubuntu 24.04.3 LTS, Linux 6.6.87.2-microsoft-standard-WSL2 + OS (rel): microsoft-standard-WSL2 + OS: Version{major = 24, minor = 4, patch = 3} + Kernel: Version{major = 6, minor = 6, patch = 87} + CPU: AMD Ryzen 9 5950X 16-Core Processor + CPU_Features{aes, adx, avx, avx2, bmi1, bmi2, erms, fma, os_xsave, pclmulqdq, popcnt, rdrand, rdseed, sha, sse2, sse3, ssse3, sse41, sse42} + CPU cores: 16c/32t + RAM: 29.2 GiB/31.3 GiB + SWAP: 8.0 GiB/8.0 GiB -- Example macOS output: + Example macOS output: - Odin: dev-2026-02 - OS (full): macOS Tahoe 26.3.0 (build 25D125, kernel 25.3.0) - OS (rel): 25D125 - OS: Version{major = 26, minor = 3, patch = 0} - Kernel: Version{major = 25, minor = 3, patch = 0} - CPU: Apple M4 Pro - CPU_Features{asimd, floatingpoint, asimdhp, bf16, fcma, fhm, fp16, frint, i8mm, jscvt, rdm, flagm, flagm2, crc32, lse, lrcpc, lrcpc2, aes, pmull, sha1, sha256, sha512, sha3, sb} - CPU cores: 12c/12t - RAM: 0.0 B/24.0 GiB - SWAP: 0.0 B/0.0 B + Odin: dev-2026-02 + OS (full): macOS Tahoe 26.3.0 (build 25D125, kernel 25.3.0) + OS (rel): 25D125 + OS: Version{major = 26, minor = 3, patch = 0} + Kernel: Version{major = 25, minor = 3, patch = 0} + CPU: Apple M4 Pro + CPU_Features{asimd, floatingpoint, asimdhp, bf16, fcma, fhm, fp16, frint, i8mm, jscvt, rdm, flagm, flagm2, crc32, lse, lrcpc, lrcpc2, aes, pmull, sha1, sha256, sha512, sha3, sb} + CPU cores: 12c/12t + RAM: 0.0 B/24.0 GiB + SWAP: 0.0 B/0.0 B -- Example FreeBSD output: + Example FreeBSD output: - Odin: dev-2026-02 - OS (full): FreeBSD 15.0-RELEASE-p2 releng/15.0-n281005-5fb0f8e9e61d GENERIC, revision 199506 - OS (rel): - OS: Version{major = 15, minor = 0, patch = 199506} - Kernel: Version{major = 15, minor = 0, patch = 199506} - CPU: AMD Ryzen 9 5950X 16-Core Processor - CPU_Features{aes, fma, os_xsave, pclmulqdq, popcnt, rdrand, sse2, sse3, ssse3, sse41, sse42} - RAM: 7.6 GiB/7.9 GiB - SWAP: 0.0 B/0.0 B + Odin: dev-2026-02 + OS (full): FreeBSD 15.0-RELEASE-p2 releng/15.0-n281005-5fb0f8e9e61d GENERIC, revision 199506 + OS (rel): + OS: Version{major = 15, minor = 0, patch = 199506} + Kernel: Version{major = 15, minor = 0, patch = 199506} + CPU: AMD Ryzen 9 5950X 16-Core Processor + CPU_Features{aes, fma, os_xsave, pclmulqdq, popcnt, rdrand, sse2, sse3, ssse3, sse41, sse42} + RAM: 7.6 GiB/7.9 GiB + SWAP: 0.0 B/0.0 B + */ */ package sysinfo From 1e1e00c68e912f0f21034a779d4bda02eba1cbe0 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 24 Feb 2026 14:48:09 +0100 Subject: [PATCH 546/766] [core:sys/info] One more thing --- core/sys/info/doc.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/sys/info/doc.odin b/core/sys/info/doc.odin index 1f4668146..b235eb5f4 100644 --- a/core/sys/info/doc.odin +++ b/core/sys/info/doc.odin @@ -63,6 +63,7 @@ Example: Vendor: Advanced Micro Devices, Inc. Model: AMD Radeon RX 9070 VRAM: 15.9 GiB + Driver: 32.0.22029.1019 Example Linux output: From c0468446f6bafd13b168c8eb6918dd1ce704b5e6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 24 Feb 2026 18:52:42 +0000 Subject: [PATCH 547/766] Ignore const nil "optimization" and fix `c: Maybe(string); c == ""` bug. --- src/check_expr.cpp | 2 ++ src/llvm_backend_expr.cpp | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 14967482f..1cf133f38 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -7421,6 +7421,8 @@ gb_internal CallArgumentData check_call_arguments_proc_group(CheckerContext *c, spaces[max_spaces] = 0; { + // TODO(bill): This is absolutely awful code, that needs improving a lot + bool try_addr = false; isize try_addr_idx = -1; diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index d4acfa196..81d7a4e36 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2971,6 +2971,7 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left return nil_check; } + if (are_types_identical(a, b)) { // NOTE(bill): No need for a conversion } else if ((lb_is_const(left) && !is_type_array(left.type)) || lb_is_const_nil(left)) { @@ -2983,15 +2984,20 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left if (internal_check_is_assignable_to(right.type, left.type)) { right = lb_emit_conv(p, right, left.type); } - return lb_emit_comp_against_nil(p, op_kind, right); + if (LLVMTypeOf(left.value) == LLVMTypeOf(right.value)) { + return lb_emit_comp_against_nil(p, op_kind, right); + } } left = lb_emit_conv(p, left, right.type); } else if ((lb_is_const(right) && !is_type_array(right.type)) || lb_is_const_nil(right)) { + if (lb_is_const_nil(right)) { if (internal_check_is_assignable_to(left.type, right.type)) { left = lb_emit_conv(p, left, right.type); } - return lb_emit_comp_against_nil(p, op_kind, left); + if (LLVMTypeOf(left.value) == LLVMTypeOf(right.value)) { + return lb_emit_comp_against_nil(p, op_kind, left); + } } right = lb_emit_conv(p, right, left.type); } else { From 545d17fd8d3f36cacdeaf47518886dcf9ad28cd3 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 24 Feb 2026 22:40:32 +0100 Subject: [PATCH 548/766] Fix `core:sys/regex` debug output --- core/text/regex/common/os.odin | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/core/text/regex/common/os.odin b/core/text/regex/common/os.odin index bde57f77f..75d84a5d3 100644 --- a/core/text/regex/common/os.odin +++ b/core/text/regex/common/os.odin @@ -10,8 +10,16 @@ package regex_common Feoramund: Initial implementation. */ -@require import "core:os" +@(require) import "base:runtime" +@(require) import "core:io" +@(require) import "core:os" + +debug_stream: io.Stream when ODIN_DEBUG_REGEX { - debug_stream := os.stderr.stream + @(init) + init_debug_stream :: proc "contextless" () { + context = runtime.default_context() + debug_stream = os.to_stream(os.stderr) + } } \ No newline at end of file From e696073d7b0466c48190658c6104f2e25a34fbf2 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 25 Feb 2026 10:49:27 +0100 Subject: [PATCH 549/766] [core:text/regex] Fix #6323 and add test case Thanks to @GPotoshin for the fix. --- .../virtual_machine/virtual_machine.odin | 22 +++++++++++-------- .../core/text/regex/test_core_text_regex.odin | 10 +++++++++ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/text/regex/virtual_machine/virtual_machine.odin b/core/text/regex/virtual_machine/virtual_machine.odin index 169d8132d..e90a27e63 100644 --- a/core/text/regex/virtual_machine/virtual_machine.odin +++ b/core/text/regex/virtual_machine/virtual_machine.odin @@ -203,18 +203,22 @@ add_thread :: proc(vm: ^Machine, saved: ^[2 * common.MAX_CAPTURE_GROUPS]int, pc: } case .Assert_Word_Boundary: sp := vm.string_pointer+vm.current_rune_size - if sp == 0 || sp == len(vm.memory) { + + left_is_wc := false + if sp > 0 { + left_is_wc = is_word_class(vm.current_rune) + } + + right_is_wc := false + if sp < len(vm.memory) { + right_is_wc = is_word_class(vm.next_rune) + } + + if left_is_wc != right_is_wc { pc += size_of(Opcode) continue - } else { - last_rune_is_wc := is_word_class(vm.current_rune) - this_rune_is_wc := is_word_class(vm.next_rune) - - if last_rune_is_wc && !this_rune_is_wc || !last_rune_is_wc && this_rune_is_wc { - pc += size_of(Opcode) - continue - } } + case .Assert_Non_Word_Boundary: sp := vm.string_pointer+vm.current_rune_size if sp != 0 && sp != len(vm.memory) { diff --git a/tests/core/text/regex/test_core_text_regex.odin b/tests/core/text/regex/test_core_text_regex.odin index 8369444b9..15b5504e4 100644 --- a/tests/core/text/regex/test_core_text_regex.odin +++ b/tests/core/text/regex/test_core_text_regex.odin @@ -1270,6 +1270,16 @@ iterator_vectors := []Iterator_Test{ {pos = {{0, 2}}, groups = {"a\n"}}, }, }, + // https://github.com/odin-lang/Odin/issues/6323 + // Test `\b` in iterator + { + "can, can't, 'can't'", `\b[a-z0-9']+\b`, {}, + { + {pos = {{0, 3}}, groups = {"can"}}, + {pos = {{5, 10}}, groups = {"can't"}}, + {pos = {{13, 18}}, groups = {"can't"}}, + }, + } } @test From 3bcddb43c7bc5c7cc78dc422a01e08d2312a04a3 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 25 Feb 2026 10:55:30 +0100 Subject: [PATCH 550/766] missing , --- tests/core/text/regex/test_core_text_regex.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/text/regex/test_core_text_regex.odin b/tests/core/text/regex/test_core_text_regex.odin index 15b5504e4..578ebc242 100644 --- a/tests/core/text/regex/test_core_text_regex.odin +++ b/tests/core/text/regex/test_core_text_regex.odin @@ -1279,7 +1279,7 @@ iterator_vectors := []Iterator_Test{ {pos = {{5, 10}}, groups = {"can't"}}, {pos = {{13, 18}}, groups = {"can't"}}, }, - } + }, } @test From 5335bdbe34528ef92997a752280457133255a55c Mon Sep 17 00:00:00 2001 From: George Potoshin Date: Wed, 25 Feb 2026 14:33:09 +0100 Subject: [PATCH 551/766] [core:text/regex] Follow up to fix #6323 and add test case. As was said in the issue discussion I had suspicion that there may be a sibling bug in .Assert_Non_Word_Boundary implementation and I was able to confirm that with `re.findall(rB", ")` python code. Odin implementation outputed an empty string wherase python gave "'". That is the same bug related to incorrect logic on string ends. This commit makes implementation of those 2 instructions cleaner and adds a test case. --- .../virtual_machine/virtual_machine.odin | 24 +++++++------------ .../core/text/regex/test_core_text_regex.odin | 4 ++++ 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/core/text/regex/virtual_machine/virtual_machine.odin b/core/text/regex/virtual_machine/virtual_machine.odin index e90a27e63..ab2e9515c 100644 --- a/core/text/regex/virtual_machine/virtual_machine.odin +++ b/core/text/regex/virtual_machine/virtual_machine.odin @@ -204,15 +204,8 @@ add_thread :: proc(vm: ^Machine, saved: ^[2 * common.MAX_CAPTURE_GROUPS]int, pc: case .Assert_Word_Boundary: sp := vm.string_pointer+vm.current_rune_size - left_is_wc := false - if sp > 0 { - left_is_wc = is_word_class(vm.current_rune) - } - - right_is_wc := false - if sp < len(vm.memory) { - right_is_wc = is_word_class(vm.next_rune) - } + left_is_wc := sp > 0 && is_word_class(vm.current_rune) + right_is_wc := sp < len(vm.memory) && is_word_class(vm.next_rune) if left_is_wc != right_is_wc { pc += size_of(Opcode) @@ -221,14 +214,13 @@ add_thread :: proc(vm: ^Machine, saved: ^[2 * common.MAX_CAPTURE_GROUPS]int, pc: case .Assert_Non_Word_Boundary: sp := vm.string_pointer+vm.current_rune_size - if sp != 0 && sp != len(vm.memory) { - last_rune_is_wc := is_word_class(vm.current_rune) - this_rune_is_wc := is_word_class(vm.next_rune) - if last_rune_is_wc && this_rune_is_wc || !last_rune_is_wc && !this_rune_is_wc { - pc += size_of(Opcode) - continue - } + left_is_wc := sp > 0 && is_word_class(vm.current_rune) + right_is_wc := sp < len(vm.memory) && is_word_class(vm.next_rune) + + if left_is_wc == right_is_wc { + pc += size_of(Opcode) + continue } case .Wait_For_Byte: diff --git a/tests/core/text/regex/test_core_text_regex.odin b/tests/core/text/regex/test_core_text_regex.odin index 578ebc242..732a3d321 100644 --- a/tests/core/text/regex/test_core_text_regex.odin +++ b/tests/core/text/regex/test_core_text_regex.odin @@ -564,6 +564,10 @@ test_non_word_boundaries :: proc(t: ^testing.T) { EXPR :: `.+\B` check_expression(t, EXPR, "abc", "ab") } + { + EXPR :: `\B'` + check_expression(t, EXPR, "'", "'") + } } @test From 2a56a943d2d6be67a921912033de2a72ddf890e9 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Sun, 22 Feb 2026 22:45:00 -0500 Subject: [PATCH 552/766] core:bufio remove core:mem dependency --- core/bufio/reader.odin | 4 ++-- core/bufio/scanner.odin | 18 +++++++++++++----- core/bufio/writer.odin | 4 ++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/core/bufio/reader.odin b/core/bufio/reader.odin index 7ab7da5b7..8e30542f1 100644 --- a/core/bufio/reader.odin +++ b/core/bufio/reader.odin @@ -1,14 +1,14 @@ package bufio +import "base:runtime" import "core:io" -import "core:mem" import "core:unicode/utf8" import "core:bytes" // Reader is a buffered wrapper for an io.Reader Reader :: struct { buf: []byte, - buf_allocator: mem.Allocator, + buf_allocator: runtime.Allocator, rd: io.Reader, // reader r, w: int, // read and write positions for buf diff --git a/core/bufio/scanner.odin b/core/bufio/scanner.odin index 27d29c685..b03437866 100644 --- a/core/bufio/scanner.odin +++ b/core/bufio/scanner.odin @@ -1,10 +1,10 @@ package bufio -import "core:bytes" -import "core:io" -import "core:mem" -import "core:unicode/utf8" +import "base:runtime" import "base:intrinsics" +import "core:io" +import "core:bytes" +import "core:unicode/utf8" // Extra errors returns by scanning procedures Scanner_Extra_Error :: enum i32 { @@ -60,7 +60,15 @@ scanner_init_with_buffer :: proc(s: ^Scanner, r: io.Reader, buf: []byte) -> ^Sca s.r = r s.split = scan_lines s.max_token_size = DEFAULT_MAX_SCAN_TOKEN_SIZE - s.buf = mem.buffer_from_slice(buf) + s.buf = transmute([dynamic]byte)runtime.Raw_Dynamic_Array{ + data = raw_data(buf), + len = 0, + cap = len(buf), + allocator = runtime.Allocator{ + procedure = runtime.nil_allocator_proc, + data = nil, + }, + } resize(&s.buf, cap(s.buf)) return s } diff --git a/core/bufio/writer.odin b/core/bufio/writer.odin index 618264933..666c05b67 100644 --- a/core/bufio/writer.odin +++ b/core/bufio/writer.odin @@ -1,14 +1,14 @@ package bufio +import "base:runtime" import "core:io" -import "core:mem" import "core:unicode/utf8" // import "core:bytes" // Writer is a buffered wrapper for an io.Writer Writer :: struct { buf: []byte, - buf_allocator: mem.Allocator, + buf_allocator: runtime.Allocator, wr: io.Writer, n: int, From a7b2471a264ff4f5cb1d4bb62baee297f33beeb4 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 25 Feb 2026 17:33:33 +0100 Subject: [PATCH 553/766] Update handle_map doc string --- core/container/handle_map/doc.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/container/handle_map/doc.odin b/core/container/handle_map/doc.odin index c1949ffdd..fe4154774 100644 --- a/core/container/handle_map/doc.odin +++ b/core/container/handle_map/doc.odin @@ -1,5 +1,5 @@ /* -Handle-based map using fixed-length arrays. +Handle-based map using either fixed-length arrays, or exponential arrays from "core:container/xar". Example: import hm "core:container/handle_map" From 60c3898a139617f262a34230d416fe186b9e3a84 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 25 Feb 2026 19:40:28 +0100 Subject: [PATCH 554/766] vendor/miniaudio: update to 0.11.24 --- vendor/miniaudio/common.odin | 8 +- vendor/miniaudio/device_io_procs.odin | 2 +- vendor/miniaudio/device_io_types.odin | 2 + vendor/miniaudio/doc.odin | 19 +- vendor/miniaudio/engine.odin | 22 +- vendor/miniaudio/node_graph.odin | 15 +- vendor/miniaudio/resource_manager.odin | 1 + vendor/miniaudio/src/miniaudio.h | 6910 ++++++++++++++++-------- 8 files changed, 4689 insertions(+), 2290 deletions(-) diff --git a/vendor/miniaudio/common.odin b/vendor/miniaudio/common.odin index e675cb7f6..1a3806734 100644 --- a/vendor/miniaudio/common.odin +++ b/vendor/miniaudio/common.odin @@ -20,9 +20,9 @@ foreign import lib { LIB } BINDINGS_VERSION_MAJOR :: 0 BINDINGS_VERSION_MINOR :: 11 -BINDINGS_VERSION_REVISION :: 22 +BINDINGS_VERSION_REVISION :: 24 BINDINGS_VERSION :: [3]u32{BINDINGS_VERSION_MAJOR, BINDINGS_VERSION_MINOR, BINDINGS_VERSION_REVISION} -BINDINGS_VERSION_STRING :: "0.11.22" +BINDINGS_VERSION_STRING :: "0.11.24" @(init) version_check :: proc "contextless" () { @@ -114,9 +114,9 @@ channel :: enum u8 { AUX_29 = 49, AUX_30 = 50, AUX_31 = 51, + POSITION_COUNT, LEFT = FRONT_LEFT, RIGHT = FRONT_RIGHT, - POSITION_COUNT = AUX_31 + 1, } result :: enum c.int { @@ -296,7 +296,7 @@ allocation_callbacks :: struct { } lcg :: struct { - state: i32, + state: u32, } diff --git a/vendor/miniaudio/device_io_procs.odin b/vendor/miniaudio/device_io_procs.odin index a14de807c..ced6e7403 100644 --- a/vendor/miniaudio/device_io_procs.odin +++ b/vendor/miniaudio/device_io_procs.odin @@ -1606,7 +1606,7 @@ foreign lib { ---------- pBackends (out, optional) A pointer to the buffer that will receive the enabled backends. Set to NULL to retrieve the backend count. Setting - the capacity of the buffer to `MA_BUFFER_COUNT` will guarantee it's large enough for all backends. + the capacity of the buffer to `MA_BACKEND_COUNT` will guarantee it's large enough for all backends. backendCap (in) The capacity of the `pBackends` buffer. diff --git a/vendor/miniaudio/device_io_types.odin b/vendor/miniaudio/device_io_types.odin index f9b8ecb40..924bcda59 100644 --- a/vendor/miniaudio/device_io_types.odin +++ b/vendor/miniaudio/device_io_types.odin @@ -698,6 +698,7 @@ context_type :: struct { snd_pcm_hw_params_set_rate_resample: proc "system" (), snd_pcm_hw_params_set_rate: proc "system" (), snd_pcm_hw_params_set_rate_near: proc "system" (), + snd_pcm_hw_params_set_rate_minmax: proc "system" (), snd_pcm_hw_params_set_buffer_size_near: proc "system" (), snd_pcm_hw_params_set_periods_near: proc "system" (), snd_pcm_hw_params_set_access: proc "system" (), @@ -1202,6 +1203,7 @@ device :: struct { /*AAudioStream**/ pStreamPlayback: rawptr, /*AAudioStream**/ pStreamCapture: rawptr, rerouteLock: mutex, + isTearingDown: b32, usage: aaudio_usage, contentType: aaudio_content_type, inputPreset: aaudio_input_preset, diff --git a/vendor/miniaudio/doc.odin b/vendor/miniaudio/doc.odin index 58b13b845..32c83cb46 100644 --- a/vendor/miniaudio/doc.odin +++ b/vendor/miniaudio/doc.odin @@ -2,7 +2,7 @@ Bindings for [[ miniaudio ; https://miniaud.io/docs ]] audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file. -miniaudio - v0.11.21 - 2023-11-15 +miniaudio - v0.11.24 - 2025-09-11 David Reid - mackron@gmail.com @@ -300,7 +300,7 @@ The engine encapsulates both the resource manager and the node graph to create a use high level API. The resource manager and node graph APIs are covered in more later sections of this manual. -The code below shows how you can initialize an engine using it's default configuration. +The code below shows how you can initialize an engine using its default configuration. ```c ma_result result; @@ -388,7 +388,7 @@ Sounds are not started by default. Start a sound with `ma_sound_start()` and sto `ma_sound_stop()`. When a sound is stopped, it is not rewound to the start. Use `ma_sound_seek_to_pcm_frame(&sound, 0)` to seek back to the start of a sound. By default, starting and stopping sounds happens immediately, but sometimes it might be convenient to schedule the sound -the be started and/or stopped at a specific time. This can be done with the following functions: +to be started and/or stopped at a specific time. This can be done with the following functions: ```c ma_sound_set_start_time_in_pcm_frames() @@ -460,6 +460,11 @@ is at the end, use `ma_sound_at_end()`. Looping of a sound can be controlled wit miniaudio should work cleanly out of the box without the need to download or install any dependencies. See below for platform-specific details. +This library has been designed to be added directly to your source tree which is the preferred way +of using it, but you can compile it as a normal library if that's your preference. Be careful if +compiling as a shared object because miniaudio is not ABI compatible between any release, including +bug fix releases. It's recommended you link statically + Note that GCC and Clang require `-msse2`, `-mavx2`, etc. for SIMD optimizations. If you get errors about undefined references to `__sync_val_compare_and_swap_8`, `__atomic_load_8`, @@ -529,7 +534,7 @@ you'll need to disable run-time linking with `MA_NO_RUNTIME_LINKING` and link wi The Emscripten build emits Web Audio JavaScript directly and should compile cleanly out of the box. You cannot use `-std=c*` compiler flags, nor `-ansi`. -You can enable the use of AudioWorkets by defining `MA_ENABLE_AUDIO_WORKLETS` and then compiling +You can enable the use of AudioWorklets by defining `MA_ENABLE_AUDIO_WORKLETS` and then compiling with the following options: -sAUDIO_WORKLET=1 -sWASM_WORKERS=1 -sASYNCIFY @@ -878,7 +883,7 @@ read data within a certain range of the underlying data. To do this you can use This is useful if you have a sound bank where many sounds are stored in the same file and you want the data source to only play one of those sub-sounds. Note that once the range is set, everything -that takes a position, such as cursors and loop points, should always be relatvie to the start of +that takes a position, such as cursors and loop points, should always be relative to the start of the range. When the range is set, any previously defined loop point will be reset. Custom loop points can also be used with data sources. By default, data sources will loop after @@ -886,7 +891,7 @@ they reach the end of the data source, but if you need to loop at a specific loc the following: ```c - result = ma_data_set_loop_point_in_pcm_frames(pDataSource, loopBegInFrames, loopEndInFrames); + result = ma_data_source_set_loop_point_in_pcm_frames(pDataSource, loopBegInFrames, loopEndInFrames); if (result != MA_SUCCESS) { return result; // Failed to set the loop point. } @@ -3734,4 +3739,4 @@ See below for some tips on improving performance. - When compiling with VC6 and earlier, decoding is restricted to files less than 2GB in size. This is due to 64-bit file APIs not being available. */ -package miniaudio \ No newline at end of file +package miniaudio diff --git a/vendor/miniaudio/engine.odin b/vendor/miniaudio/engine.odin index e5364d782..0a3887d4b 100644 --- a/vendor/miniaudio/engine.odin +++ b/vendor/miniaudio/engine.odin @@ -48,6 +48,7 @@ engine_node_config :: struct { isPitchDisabled: b8, /* Pitching can be explicitly disable with MA_SOUND_FLAG_NO_PITCH to optimize processing. */ isSpatializationDisabled: b8, /* Spatialization can be explicitly disabled with MA_SOUND_FLAG_NO_SPATIALIZATION. */ pinnedListenerIndex: u8, /* The index of the listener this node should always use for spatialization. If set to MA_LISTENER_INDEX_CLOSEST the engine will use the closest listener. */ + resampling: resampler_config, } /* Base node object for both ma_sound and ma_sound_group. */ @@ -58,7 +59,7 @@ engine_node :: struct { volumeSmoothTimeInPCMFrames: u32, monoExpansionMode: mono_expansion_mode, fader: fader, - resampler: linear_resampler, /* For pitch shift. */ + resampler: resampler, /* For pitch shift. */ spatializer: spatializer, panner: panner, volumeGainer: gainer, /* This will only be used if volumeSmoothTimeInPCMFrames is > 0. */ @@ -117,6 +118,7 @@ sound_config :: struct { endCallback: sound_end_proc, /* Fired when the sound reaches the end. Will be fired from the audio thread. Do not restart, uninitialize or otherwise change the state of the sound from here. Instead fire an event or set a variable to indicate to a different thread to change the start of the sound. Will not be fired in response to a scheduled stop with ma_sound_set_stop_time_*(). */ pEndCallbackUserData: rawptr, + pitchResampling: resampler_config, initNotifications: resource_manager_pipeline_notifications, @@ -134,6 +136,10 @@ sound :: struct { endCallback: sound_end_proc, pEndCallbackUserData: rawptr, + pProcessingCache: ^f32, + processingCacheFramesRemaining: u32, + processingCacheMap: u32, + ownsDataSource: b8, /* @@ -166,8 +172,12 @@ foreign lib { sound_get_data_source :: proc(pSound: ^sound) -> ^data_source --- sound_start :: proc(pSound: ^sound) -> result --- sound_stop :: proc(pSound: ^sound) -> result --- - sound_stop_with_fade_in_pcm_frames :: proc(pSound: ^sound, fadeLengthInFrames: u64) --- /* Will overwrite any scheduled stop and fade. */ - sound_stop_with_fade_in_milliseconds :: proc(pSound: ^sound, fadeLengthInFrames: u64) --- /* Will overwrite any scheduled stop and fade. */ + sound_stop_with_fade_in_pcm_frames :: proc(pSound: ^sound, fadeLengthInFrames: u64) --- /* Will overwrite any scheduled stop and fade. If you want to restart the sound, first reset it with `ma_sound_reset_stop_time_and_fade()`. There are plans to make this less awkward in the future. */ + sound_stop_with_fade_in_milliseconds :: proc(pSound: ^sound, fadeLengthInFrames: u64) --- /* Will overwrite any scheduled stop and fade. If you want to restart the sound, first reset it with `ma_sound_reset_stop_time_and_fade()`. There are plans to make this less awkward in the future. */ + sound_reset_start_time :: proc(pSound: ^sound) --- + sound_reset_stop_time :: proc(pSound: ^sound) --- + sound_reset_fade :: proc(pSound: ^sound) --- + sound_reset_stop_time_and_fade :: proc(pSound: ^sound) --- /* Resets fades and scheduled stop time. Does not seek back to the start. */ sound_set_volume :: proc(pSound: ^sound, volume: f32) --- sound_get_volume :: proc(pSound: ^sound) -> f32 --- sound_set_pan :: proc(pSound: ^sound, pan: f32) --- @@ -319,7 +329,7 @@ engine_config :: struct { pLog: ^log, /* When set to NULL, will use the context's log. */ listenerCount: u32, /* Must be between 1 and MA_ENGINE_MAX_LISTENERS. */ channels: u32, /* The number of channels to use when mixing and spatializing. When set to 0, will use the native channel count of the device. */ - sampleRate: u32, /* The sample rate. When set to 0 will use the native channel count of the device. */ + sampleRate: u32, /* The sample rate. When set to 0 will use the native sample rate of the device. */ periodSizeInFrames: u32, /* If set to something other than 0, updates will always be exactly this size. The underlying device may be a different size, but from the perspective of the mixer that won't matter.*/ periodSizeInMilliseconds: u32, /* Used if periodSizeInFrames is unset. */ gainSmoothTimeInFrames: u32, /* The number of frames to interpolate the gain of spatialized sounds across. If set to 0, will use gainSmoothTimeInMilliseconds. */ @@ -335,6 +345,8 @@ engine_config :: struct { pResourceManagerVFS: ^vfs, /* A pointer to a pre-allocated VFS object to use with the resource manager. This is ignored if pResourceManager is not NULL. */ onProcess: engine_process_proc, /* Fired at the end of each call to ma_engine_read_pcm_frames(). For engine's that manage their own internal device (the default configuration), this will be fired from the audio thread, and you do not need to call ma_engine_read_pcm_frames() manually in order to trigger this. */ pProcessUserData: rawptr, /* User data that's passed into onProcess. */ + resourceManagerResampling: resampler_config, /* The resampling config to use with the resource manager. */ + pitchResampling: resampler_config, /* The resampling config for the pitch and Doppler effects. You will typically want this to be a fast resampler. For high quality stuff, it's recommended that you pre-sample. */ } engine :: struct { @@ -358,6 +370,8 @@ engine :: struct { monoExpansionMode: mono_expansion_mode, onProcess: engine_process_proc, pProcessUserData: rawptr, + + pitchResamplingConfig: resampler_config, } @(default_calling_convention="c", link_prefix="ma_") diff --git a/vendor/miniaudio/node_graph.odin b/vendor/miniaudio/node_graph.odin index 496d566f4..96138eeed 100644 --- a/vendor/miniaudio/node_graph.odin +++ b/vendor/miniaudio/node_graph.odin @@ -221,13 +221,14 @@ node_graph :: struct { foreign lib { node_graph_config_init :: proc(channels: u32) -> node_graph_config --- - node_graph_init :: proc(pConfig: ^node_graph_config, pAllocationCallbacks: ^allocation_callbacks, pNodeGraph: ^node_graph) -> result --- - node_graph_uninit :: proc(pNodeGraph: ^node_graph, pAllocationCallbacks: ^allocation_callbacks) --- - node_graph_get_endpoint :: proc(pNodeGraph: ^node_graph) -> ^node --- - node_graph_read_pcm_frames :: proc(pNodeGraph: ^node_graph, pFramesOut: rawptr, frameCount: u64, pFramesRead: ^u64) -> result --- - node_graph_get_channels :: proc(pNodeGraph: ^node_graph) -> u32 --- - node_graph_get_time :: proc(pNodeGraph: ^node_graph) -> u64 --- - node_graph_set_time :: proc(pNodeGraph: ^node_graph, globalTime: u64) -> result --- + node_graph_init :: proc(pConfig: ^node_graph_config, pAllocationCallbacks: ^allocation_callbacks, pNodeGraph: ^node_graph) -> result --- + node_graph_uninit :: proc(pNodeGraph: ^node_graph, pAllocationCallbacks: ^allocation_callbacks) --- + node_graph_get_endpoint :: proc(pNodeGraph: ^node_graph) -> ^node --- + node_graph_read_pcm_frames :: proc(pNodeGraph: ^node_graph, pFramesOut: rawptr, frameCount: u64, pFramesRead: ^u64) -> result --- + node_graph_get_channels :: proc(pNodeGraph: ^node_graph) -> u32 --- + node_graph_get_time :: proc(pNodeGraph: ^node_graph) -> u64 --- + node_graph_set_time :: proc(pNodeGraph: ^node_graph, globalTime: u64) -> result --- + node_graph_get_processing_size_in_frames :: proc(pNodeGraph: ^node_graph) -> u32 --- } diff --git a/vendor/miniaudio/resource_manager.odin b/vendor/miniaudio/resource_manager.odin index 4ef5778a9..1bc65227b 100644 --- a/vendor/miniaudio/resource_manager.odin +++ b/vendor/miniaudio/resource_manager.odin @@ -198,6 +198,7 @@ resource_manager_config :: struct { ppCustomDecodingBackendVTables: ^[^]decoding_backend_vtable, customDecodingBackendCount: u32, pCustomDecodingBackendUserData: rawptr, + resampling: resampler_config, } resource_manager :: struct { diff --git a/vendor/miniaudio/src/miniaudio.h b/vendor/miniaudio/src/miniaudio.h index c74bebeb3..24e676bb2 100644 --- a/vendor/miniaudio/src/miniaudio.h +++ b/vendor/miniaudio/src/miniaudio.h @@ -1,6 +1,6 @@ /* Audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file. -miniaudio - v0.11.22 - 2025-02-24 +miniaudio - v0.11.24 - 2026-01-17 David Reid - mackron@gmail.com @@ -12,18 +12,10 @@ GitHub: https://github.com/mackron/miniaudio /* 1. Introduction =============== -To use miniaudio, include "miniaudio.h": - - ```c - #include "miniaudio.h" - ``` - -The implementation is contained in "miniaudio.c". Just compile this like any other source file. You -can include miniaudio.c if you want to compile your project as a single translation unit: - - ```c - #include "miniaudio.c" - ``` +To use miniaudio, just include "miniaudio.h" like any other header and add "miniaudio.c" to your +source tree. If you don't want to add it to your source tree you can compile and link to it like +any other library. Note that ABI compatibility is not guaranteed between versions, even with bug +fix releases, so take care if compiling as a shared object. miniaudio includes both low level and high level APIs. The low level API is good for those who want to do all of their mixing themselves and only require a light weight interface to the underlying @@ -303,7 +295,7 @@ The engine encapsulates both the resource manager and the node graph to create a use high level API. The resource manager and node graph APIs are covered in more later sections of this manual. -The code below shows how you can initialize an engine using it's default configuration. +The code below shows how you can initialize an engine using its default configuration. ```c ma_result result; @@ -391,7 +383,7 @@ Sounds are not started by default. Start a sound with `ma_sound_start()` and sto `ma_sound_stop()`. When a sound is stopped, it is not rewound to the start. Use `ma_sound_seek_to_pcm_frame(&sound, 0)` to seek back to the start of a sound. By default, starting and stopping sounds happens immediately, but sometimes it might be convenient to schedule the sound -the be started and/or stopped at a specific time. This can be done with the following functions: +to be started and/or stopped at a specific time. This can be done with the following functions: ```c ma_sound_set_start_time_in_pcm_frames() @@ -463,6 +455,11 @@ is at the end, use `ma_sound_at_end()`. Looping of a sound can be controlled wit miniaudio should work cleanly out of the box without the need to download or install any dependencies. See below for platform-specific details. +This library has been designed to be added directly to your source tree which is the preferred way +of using it, but you can compile it as a normal library if that's your preference. Be careful if +compiling as a shared object because miniaudio is not ABI compatible between any release, including +bug fix releases. It's recommended you link statically. + Note that GCC and Clang require `-msse2`, `-mavx2`, etc. for SIMD optimizations. If you get errors about undefined references to `__sync_val_compare_and_swap_8`, `__atomic_load_8`, @@ -532,7 +529,7 @@ you'll need to disable run-time linking with `MA_NO_RUNTIME_LINKING` and link wi The Emscripten build emits Web Audio JavaScript directly and should compile cleanly out of the box. You cannot use `-std=c*` compiler flags, nor `-ansi`. -You can enable the use of AudioWorkets by defining `MA_ENABLE_AUDIO_WORKLETS` and then compiling +You can enable the use of AudioWorklets by defining `MA_ENABLE_AUDIO_WORKLETS` and then compiling with the following options: -sAUDIO_WORKLET=1 -sWASM_WORKERS=1 -sASYNCIFY @@ -881,7 +878,7 @@ read data within a certain range of the underlying data. To do this you can use This is useful if you have a sound bank where many sounds are stored in the same file and you want the data source to only play one of those sub-sounds. Note that once the range is set, everything -that takes a position, such as cursors and loop points, should always be relatvie to the start of +that takes a position, such as cursors and loop points, should always be relative to the start of the range. When the range is set, any previously defined loop point will be reset. Custom loop points can also be used with data sources. By default, data sources will loop after @@ -889,7 +886,7 @@ they reach the end of the data source, but if you need to loop at a specific loc the following: ```c - result = ma_data_set_loop_point_in_pcm_frames(pDataSource, loopBegInFrames, loopEndInFrames); + result = ma_data_source_set_loop_point_in_pcm_frames(pDataSource, loopBegInFrames, loopEndInFrames); if (result != MA_SUCCESS) { return result; // Failed to set the loop point. } @@ -3750,7 +3747,7 @@ extern "C" { #define MA_VERSION_MAJOR 0 #define MA_VERSION_MINOR 11 -#define MA_VERSION_REVISION 22 +#define MA_VERSION_REVISION 24 #define MA_VERSION_STRING MA_XSTRINGIFY(MA_VERSION_MAJOR) "." MA_XSTRINGIFY(MA_VERSION_MINOR) "." MA_XSTRINGIFY(MA_VERSION_REVISION) #if defined(_MSC_VER) && !defined(__clang__) @@ -3857,37 +3854,65 @@ typedef ma_uint16 wchar_t; #define MA_SIZE_MAX 0xFFFFFFFF /* When SIZE_MAX is not defined by the standard library just default to the maximum 32-bit unsigned integer. */ #endif +#define MA_UINT64_MAX (((ma_uint64)0xFFFFFFFF << 32) | (ma_uint64)0xFFFFFFFF) /* Weird shifting syntax is for VC6 compatibility. */ + /* Platform/backend detection. */ -#if defined(_WIN32) || defined(__COSMOPOLITAN__) +#if defined(_WIN32) #define MA_WIN32 #if defined(MA_FORCE_UWP) || (defined(WINAPI_FAMILY) && ((defined(WINAPI_FAMILY_PC_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PC_APP) || (defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP))) #define MA_WIN32_UWP #elif defined(WINAPI_FAMILY) && (defined(WINAPI_FAMILY_GAMES) && WINAPI_FAMILY == WINAPI_FAMILY_GAMES) #define MA_WIN32_GDK + #elif defined(NXDK) + #define MA_WIN32_NXDK #else #define MA_WIN32_DESKTOP #endif + + /* The original Xbox. */ + #if defined(NXDK) /* <-- Add other Xbox compiler toolchains here, and then add a toolchain-specific define in case we need to discriminate between them later. */ + #define MA_XBOX + + #if defined(NXDK) + #define MA_XBOX_NXDK + #endif + #endif #endif -#if !defined(_WIN32) /* If it's not Win32, assume POSIX. */ +#if defined(__MSDOS__) || defined(MSDOS) || defined(_MSDOS) || defined(__DOS__) + #define MA_DOS + + /* No threading allowed on DOS. */ + #ifndef MA_NO_THREADING + #define MA_NO_THREADING + #endif + + /* No runtime linking allowed on DOS. */ + #ifndef MA_NO_RUNTIME_LINKING + #define MA_NO_RUNTIME_LINKING + #endif +#endif +#if !defined(MA_WIN32) && !defined(MA_DOS) /* If it's not Win32, assume POSIX. */ #define MA_POSIX - /* - Use the MA_NO_PTHREAD_IN_HEADER option at your own risk. This is intentionally undocumented. - You can use this to avoid including pthread.h in the header section. The downside is that it - results in some fixed sized structures being declared for the various types that are used in - miniaudio. The risk here is that these types might be too small for a given platform. This - risk is yours to take and no support will be offered if you enable this option. - */ - #ifndef MA_NO_PTHREAD_IN_HEADER - #include /* Unfortunate #include, but needed for pthread_t, pthread_mutex_t and pthread_cond_t types. */ - typedef pthread_t ma_pthread_t; - typedef pthread_mutex_t ma_pthread_mutex_t; - typedef pthread_cond_t ma_pthread_cond_t; - #else - typedef ma_uintptr ma_pthread_t; - typedef union ma_pthread_mutex_t { char __data[40]; ma_uint64 __alignment; } ma_pthread_mutex_t; - typedef union ma_pthread_cond_t { char __data[48]; ma_uint64 __alignment; } ma_pthread_cond_t; + #if !defined(MA_NO_THREADING) + /* + Use the MA_NO_PTHREAD_IN_HEADER option at your own risk. This is intentionally undocumented. + You can use this to avoid including pthread.h in the header section. The downside is that it + results in some fixed sized structures being declared for the various types that are used in + miniaudio. The risk here is that these types might be too small for a given platform. This + risk is yours to take and no support will be offered if you enable this option. + */ + #ifndef MA_NO_PTHREAD_IN_HEADER + #include /* Unfortunate #include, but needed for pthread_t, pthread_mutex_t and pthread_cond_t types. */ + typedef pthread_t ma_pthread_t; + typedef pthread_mutex_t ma_pthread_mutex_t; + typedef pthread_cond_t ma_pthread_cond_t; + #else + typedef ma_uintptr ma_pthread_t; + typedef union ma_pthread_mutex_t { char __data[40]; ma_uint64 __alignment; } ma_pthread_mutex_t; + typedef union ma_pthread_cond_t { char __data[48]; ma_uint64 __alignment; } ma_pthread_cond_t; + #endif #endif #if defined(__unix__) @@ -3914,8 +3939,11 @@ typedef ma_uint16 wchar_t; #if defined(__PROSPERO__) #define MA_PROSPERO #endif - #if defined(__NX__) - #define MA_NX + #if defined(__3DS__) + #define MA_3DS + #endif + #if defined(__SWITCH__) || defined(__NX__) + #define MA_SWITCH #endif #if defined(__BEOS__) || defined(__HAIKU__) #define MA_BEOS @@ -3925,12 +3953,13 @@ typedef ma_uint16 wchar_t; #endif #endif -#if defined(__has_c_attribute) - #if __has_c_attribute(fallthrough) - #define MA_FALLTHROUGH [[fallthrough]] - #endif +#if !defined(MA_FALLTHROUGH) && defined(__cplusplus) && __cplusplus >= 201703L + #define MA_FALLTHROUGH [[fallthrough]] #endif -#if !defined(MA_FALLTHROUGH) && defined(__has_attribute) && (defined(__clang__) || defined(__GNUC__)) +#if !defined(MA_FALLTHROUGH) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202000L + #define MA_FALLTHROUGH [[fallthrough]] +#endif +#if !defined(MA_FALLTHROUGH) && defined(__has_attribute) #if __has_attribute(fallthrough) #define MA_FALLTHROUGH __attribute__((fallthrough)) #endif @@ -3967,7 +3996,7 @@ typedef ma_uint16 wchar_t; #define MA_NO_INLINE __attribute__((noinline)) #else #define MA_INLINE MA_GNUC_INLINE_HINT - #define MA_NO_INLINE __attribute__((noinline)) + #define MA_NO_INLINE #endif #elif defined(__WATCOMC__) #define MA_INLINE __inline @@ -4153,9 +4182,13 @@ typedef enum MA_CHANNEL_AUX_29 = 49, MA_CHANNEL_AUX_30 = 50, MA_CHANNEL_AUX_31 = 51, + + /* Count. */ + MA_CHANNEL_POSITION_COUNT, + + /* Aliases. */ MA_CHANNEL_LEFT = MA_CHANNEL_FRONT_LEFT, MA_CHANNEL_RIGHT = MA_CHANNEL_FRONT_RIGHT, - MA_CHANNEL_POSITION_COUNT = (MA_CHANNEL_AUX_31 + 1) } _ma_channel_position; /* Do not use `_ma_channel_position` directly. Use `ma_channel` instead. */ typedef enum @@ -4350,7 +4383,7 @@ typedef struct typedef struct { - ma_int32 state; + ma_uint32 state; } ma_lcg; @@ -6569,22 +6602,18 @@ This section contains the APIs for device playback and capture. Here is where yo ************************************************************************************************************************************************************/ #ifndef MA_NO_DEVICE_IO /* Some backends are only supported on certain platforms. */ -#if defined(MA_WIN32) +#if defined(MA_WIN32) && !defined(MA_XBOX) #define MA_SUPPORT_WASAPI #if defined(MA_WIN32_DESKTOP) /* DirectSound and WinMM backends are only supported on desktops. */ #define MA_SUPPORT_DSOUND #define MA_SUPPORT_WINMM - - /* Don't enable JACK here if compiling with Cosmopolitan. It'll be enabled in the Linux section below. */ - #if !defined(__COSMOPOLITAN__) - #define MA_SUPPORT_JACK /* JACK is technically supported on Windows, but I don't know how many people use it in practice... */ - #endif + #define MA_SUPPORT_JACK /* JACK is technically supported on Windows, but I don't know how many people use it in practice... */ #endif #endif #if defined(MA_UNIX) && !defined(MA_ORBIS) && !defined(MA_PROSPERO) #if defined(MA_LINUX) - #if !defined(MA_ANDROID) && !defined(__COSMOPOLITAN__) /* ALSA is not supported on Android. */ + #if !defined(MA_ANDROID) && !defined(MA_EMSCRIPTEN) /* ALSA is not supported on Android. */ #define MA_SUPPORT_ALSA #endif #endif @@ -7426,6 +7455,7 @@ struct ma_context ma_proc snd_pcm_hw_params_set_rate_resample; ma_proc snd_pcm_hw_params_set_rate; ma_proc snd_pcm_hw_params_set_rate_near; + ma_proc snd_pcm_hw_params_set_rate_minmax; ma_proc snd_pcm_hw_params_set_buffer_size_near; ma_proc snd_pcm_hw_params_set_periods_near; ma_proc snd_pcm_hw_params_set_access; @@ -7986,6 +8016,7 @@ struct ma_device /*AAudioStream**/ ma_ptr pStreamPlayback; /*AAudioStream**/ ma_ptr pStreamCapture; ma_mutex rerouteLock; + ma_atomic_bool32 isTearingDown; ma_aaudio_usage usage; ma_aaudio_content_type contentType; ma_aaudio_input_preset inputPreset; @@ -9644,7 +9675,7 @@ Parameters ---------- pBackends (out, optional) A pointer to the buffer that will receive the enabled backends. Set to NULL to retrieve the backend count. Setting - the capacity of the buffer to `MA_BUFFER_COUNT` will guarantee it's large enough for all backends. + the capacity of the buffer to `MA_BACKEND_COUNT` will guarantee it's large enough for all backends. backendCap (in) The capacity of the `pBackends` buffer. @@ -10489,6 +10520,7 @@ typedef struct ma_decoding_backend_vtable** ppCustomDecodingBackendVTables; ma_uint32 customDecodingBackendCount; void* pCustomDecodingBackendUserData; + ma_resampler_config resampling; } ma_resource_manager_config; MA_API ma_resource_manager_config ma_resource_manager_config_init(void); @@ -10816,6 +10848,7 @@ MA_API ma_result ma_node_graph_read_pcm_frames(ma_node_graph* pNodeGraph, void* MA_API ma_uint32 ma_node_graph_get_channels(const ma_node_graph* pNodeGraph); MA_API ma_uint64 ma_node_graph_get_time(const ma_node_graph* pNodeGraph); MA_API ma_result ma_node_graph_set_time(ma_node_graph* pNodeGraph, ma_uint64 globalTime); +MA_API ma_uint32 ma_node_graph_get_processing_size_in_frames(const ma_node_graph* pNodeGraph); @@ -11123,6 +11156,7 @@ typedef struct ma_bool8 isPitchDisabled; /* Pitching can be explicitly disabled with MA_SOUND_FLAG_NO_PITCH to optimize processing. */ ma_bool8 isSpatializationDisabled; /* Spatialization can be explicitly disabled with MA_SOUND_FLAG_NO_SPATIALIZATION. */ ma_uint8 pinnedListenerIndex; /* The index of the listener this node should always use for spatialization. If set to MA_LISTENER_INDEX_CLOSEST the engine will use the closest listener. */ + ma_resampler_config resampling; } ma_engine_node_config; MA_API ma_engine_node_config ma_engine_node_config_init(ma_engine* pEngine, ma_engine_node_type type, ma_uint32 flags); @@ -11137,7 +11171,7 @@ typedef struct ma_uint32 volumeSmoothTimeInPCMFrames; ma_mono_expansion_mode monoExpansionMode; ma_fader fader; - ma_linear_resampler resampler; /* For pitch shift. */ + ma_resampler resampler; /* For pitch shift. */ ma_spatializer spatializer; ma_panner panner; ma_gainer volumeGainer; /* This will only be used if volumeSmoothTimeInPCMFrames is > 0. */ @@ -11193,6 +11227,7 @@ typedef struct ma_uint64 loopPointEndInPCMFrames; ma_sound_end_proc endCallback; /* Fired when the sound reaches the end. Will be fired from the audio thread. Do not restart, uninitialize or otherwise change the state of the sound from here. Instead fire an event or set a variable to indicate to a different thread to change the start of the sound. Will not be fired in response to a scheduled stop with ma_sound_set_stop_time_*(). */ void* pEndCallbackUserData; + ma_resampler_config pitchResampling; #ifndef MA_NO_RESOURCE_MANAGER ma_resource_manager_pipeline_notifications initNotifications; #endif @@ -11211,7 +11246,10 @@ struct ma_sound MA_ATOMIC(4, ma_bool32) atEnd; ma_sound_end_proc endCallback; void* pEndCallbackUserData; - ma_bool8 ownsDataSource; + float* pProcessingCache; /* Will be null if pDataSource is null. */ + ma_uint32 processingCacheFramesRemaining; + ma_uint32 processingCacheCap; + ma_bool8 ownsDataSource; /* We're declaring a resource manager data source object here to save us a malloc when loading a @@ -11255,7 +11293,7 @@ typedef struct ma_log* pLog; /* When set to NULL, will use the context's log. */ ma_uint32 listenerCount; /* Must be between 1 and MA_ENGINE_MAX_LISTENERS. */ ma_uint32 channels; /* The number of channels to use when mixing and spatializing. When set to 0, will use the native channel count of the device. */ - ma_uint32 sampleRate; /* The sample rate. When set to 0 will use the native channel count of the device. */ + ma_uint32 sampleRate; /* The sample rate. When set to 0 will use the native sample rate of the device. */ ma_uint32 periodSizeInFrames; /* If set to something other than 0, updates will always be exactly this size. The underlying device may be a different size, but from the perspective of the mixer that won't matter.*/ ma_uint32 periodSizeInMilliseconds; /* Used if periodSizeInFrames is unset. */ ma_uint32 gainSmoothTimeInFrames; /* The number of frames to interpolate the gain of spatialized sounds across. If set to 0, will use gainSmoothTimeInMilliseconds. */ @@ -11269,6 +11307,8 @@ typedef struct ma_vfs* pResourceManagerVFS; /* A pointer to a pre-allocated VFS object to use with the resource manager. This is ignored if pResourceManager is not NULL. */ ma_engine_process_proc onProcess; /* Fired at the end of each call to ma_engine_read_pcm_frames(). For engine's that manage their own internal device (the default configuration), this will be fired from the audio thread, and you do not need to call ma_engine_read_pcm_frames() manually in order to trigger this. */ void* pProcessUserData; /* User data that's passed into onProcess. */ + ma_resampler_config resourceManagerResampling; /* The resampling config to use with the resource manager. */ + ma_resampler_config pitchResampling; /* The resampling config for the pitch and Doppler effects. You will typically want this to be a fast resampler. For high quality stuff, it's recommended that you pre-resample. */ } ma_engine_config; MA_API ma_engine_config ma_engine_config_init(void); @@ -11298,6 +11338,7 @@ struct ma_engine ma_mono_expansion_mode monoExpansionMode; ma_engine_process_proc onProcess; void* pProcessUserData; + ma_resampler_config pitchResamplingConfig; }; MA_API ma_result ma_engine_init(const ma_engine_config* pConfig, ma_engine* pEngine); @@ -11358,8 +11399,12 @@ MA_API ma_engine* ma_sound_get_engine(const ma_sound* pSound); MA_API ma_data_source* ma_sound_get_data_source(const ma_sound* pSound); MA_API ma_result ma_sound_start(ma_sound* pSound); MA_API ma_result ma_sound_stop(ma_sound* pSound); -MA_API ma_result ma_sound_stop_with_fade_in_pcm_frames(ma_sound* pSound, ma_uint64 fadeLengthInFrames); /* Will overwrite any scheduled stop and fade. */ -MA_API ma_result ma_sound_stop_with_fade_in_milliseconds(ma_sound* pSound, ma_uint64 fadeLengthInFrames); /* Will overwrite any scheduled stop and fade. */ +MA_API ma_result ma_sound_stop_with_fade_in_pcm_frames(ma_sound* pSound, ma_uint64 fadeLengthInFrames); /* Will overwrite any scheduled stop and fade. If you want to restart the sound, first reset it with `ma_sound_reset_stop_time_and_fade()`. There are plans to make this less awkward in the future. */ +MA_API ma_result ma_sound_stop_with_fade_in_milliseconds(ma_sound* pSound, ma_uint64 fadeLengthInFrames); /* Will overwrite any scheduled stop and fade. If you want to restart the sound, first reset it with `ma_sound_reset_stop_time_and_fade()`. There are plans to make this less awkward in the future. */ +MA_API void ma_sound_reset_start_time(ma_sound* pSound); +MA_API void ma_sound_reset_stop_time(ma_sound* pSound); +MA_API void ma_sound_reset_fade(ma_sound* pSound); +MA_API void ma_sound_reset_stop_time_and_fade(ma_sound* pSound); /* Resets fades and scheduled stop time. Does not seek back to the start. */ MA_API void ma_sound_set_volume(ma_sound* pSound, float volume); MA_API float ma_sound_get_volume(const ma_sound* pSound); MA_API void ma_sound_set_pan(ma_sound* pSound, float pan); @@ -11419,11 +11464,11 @@ MA_API ma_bool32 ma_sound_is_looping(const ma_sound* pSound); MA_API ma_bool32 ma_sound_at_end(const ma_sound* pSound); MA_API ma_result ma_sound_seek_to_pcm_frame(ma_sound* pSound, ma_uint64 frameIndex); /* Just a wrapper around ma_data_source_seek_to_pcm_frame(). */ MA_API ma_result ma_sound_seek_to_second(ma_sound* pSound, float seekPointInSeconds); /* Abstraction to ma_sound_seek_to_pcm_frame() */ -MA_API ma_result ma_sound_get_data_format(ma_sound* pSound, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_sound_get_cursor_in_pcm_frames(ma_sound* pSound, ma_uint64* pCursor); -MA_API ma_result ma_sound_get_length_in_pcm_frames(ma_sound* pSound, ma_uint64* pLength); -MA_API ma_result ma_sound_get_cursor_in_seconds(ma_sound* pSound, float* pCursor); -MA_API ma_result ma_sound_get_length_in_seconds(ma_sound* pSound, float* pLength); +MA_API ma_result ma_sound_get_data_format(const ma_sound* pSound, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); +MA_API ma_result ma_sound_get_cursor_in_pcm_frames(const ma_sound* pSound, ma_uint64* pCursor); +MA_API ma_result ma_sound_get_length_in_pcm_frames(const ma_sound* pSound, ma_uint64* pLength); +MA_API ma_result ma_sound_get_cursor_in_seconds(const ma_sound* pSound, float* pCursor); +MA_API ma_result ma_sound_get_length_in_seconds(const ma_sound* pSound, float* pLength); MA_API ma_result ma_sound_set_end_callback(ma_sound* pSound, ma_sound_end_proc callback, void* pUserData); MA_API ma_result ma_sound_group_init(ma_engine* pEngine, ma_uint32 flags, ma_sound_group* pParentGroup, ma_sound_group* pGroup); @@ -11544,17 +11589,23 @@ IMPLEMENTATION #endif #if !defined(MA_WIN32) -#include -#include /* select() (used for ma_sleep()). */ -#include + #if !defined(MA_NO_THREADING) + #include + #include /* For pthreads. */ + #endif + + #include /* select() (used for ma_sleep()). */ + #include /* For nanosleep() */ + #include #endif -#ifdef MA_NX -#include /* For nanosleep() */ +/* For fstat(), etc. */ +#if defined(MA_XBOX_NXDK) + #include /* Suggestion for NXDK: Add a sys/stat.h wrapper for compatibility. */ +#else + #include #endif -#include /* For fstat(), etc. */ - #ifdef MA_EMSCRIPTEN #include #endif @@ -11606,7 +11657,7 @@ IMPLEMENTATION #endif /* Intrinsics Support */ -#if (defined(MA_X64) || defined(MA_X86)) && !defined(__COSMOPOLITAN__) +#if defined(MA_X64) || defined(MA_X86) #if defined(_MSC_VER) && !defined(__clang__) /* MSVC. */ #if _MSC_VER >= 1400 && !defined(MA_NO_SSE2) /* 2005 */ @@ -11861,7 +11912,7 @@ static MA_INLINE ma_bool32 ma_has_neon(void) #endif #ifndef MA_RESTRICT - #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER) + #if defined(__clang__) || defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))) #define MA_RESTRICT __restrict #else #define MA_RESTRICT @@ -11955,7 +12006,7 @@ static void ma_sleep__posix(ma_uint32 milliseconds) (void)milliseconds; MA_ASSERT(MA_FALSE); /* The Emscripten build should never sleep. */ #else - #if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L) || defined(MA_NX) + #if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L) || defined(MA_SWITCH) struct timespec ts; ts.tv_sec = milliseconds / 1000; ts.tv_nsec = milliseconds % 1000 * 1000000; @@ -11997,7 +12048,7 @@ static MA_INLINE void ma_yield(void) #endif #endif #else - __asm__ __volatile__ ("pause"); + __asm__ __volatile__ ("rep; nop"); #endif #elif (defined(__arm__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(_M_ARM64) || (defined(_M_ARM) && _M_ARM >= 7) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) /* ARM */ @@ -12020,7 +12071,7 @@ static MA_INLINE unsigned int ma_disable_denormals(void) { unsigned int prevState; - #if defined(_MSC_VER) + #if defined(_MSC_VER) && !defined(MA_XBOX_NXDK) { /* Older versions of Visual Studio don't support the "safe" versions of _controlfp_s(). I don't @@ -12043,7 +12094,7 @@ static MA_INLINE unsigned int ma_disable_denormals(void) } #elif defined(MA_X86) || defined(MA_X64) { - #if defined(__SSE2__) && !(defined(__TINYC__) || defined(__WATCOMC__) || defined(__COSMOPOLITAN__)) /* <-- Add compilers that lack support for _mm_getcsr() and _mm_setcsr() to this list. */ + #if defined(MA_SUPPORT_SSE2) && defined(__SSE2__) && !(defined(__TINYC__) || defined(__WATCOMC__)) /* <-- Add compilers that lack support for _mm_getcsr() and _mm_setcsr() to this list. */ { prevState = _mm_getcsr(); _mm_setcsr(prevState | MA_MM_DENORMALS_ZERO_MASK | MA_MM_FLUSH_ZERO_MASK); @@ -12067,7 +12118,7 @@ static MA_INLINE unsigned int ma_disable_denormals(void) static MA_INLINE void ma_restore_denormals(unsigned int prevState) { - #if defined(_MSC_VER) + #if defined(_MSC_VER) && !defined(MA_XBOX_NXDK) { /* Older versions of Visual Studio do not support _controlfp_s(). See ma_disable_denormals(). */ #if _MSC_VER <= 1200 @@ -12083,7 +12134,7 @@ static MA_INLINE void ma_restore_denormals(unsigned int prevState) } #elif defined(MA_X86) || defined(MA_X64) { - #if defined(__SSE2__) && !(defined(__TINYC__) || defined(__WATCOMC__) || defined(__COSMOPOLITAN__)) /* <-- Add compilers that lack support for _mm_getcsr() and _mm_setcsr() to this list. */ + #if defined(MA_SUPPORT_SSE2) && defined(__SSE2__) && !(defined(__TINYC__) || defined(__WATCOMC__)) /* <-- Add compilers that lack support for _mm_getcsr() and _mm_setcsr() to this list. */ { _mm_setcsr(prevState); } @@ -12719,6 +12770,29 @@ MA_API MA_NO_INLINE int ma_strcmp(const char* str1, const char* str2) return ((unsigned char*)str1)[0] - ((unsigned char*)str2)[0]; } +MA_API MA_NO_INLINE int ma_wcscmp(const wchar_t* str1, const wchar_t* str2) +{ + if (str1 == str2) return 0; + + /* These checks differ from the standard implementation. It's not important, but I prefer it just for sanity. */ + if (str1 == NULL) return -1; + if (str2 == NULL) return 1; + + for (;;) { + if (str1[0] == L'\0') { + break; + } + if (str1[0] != str2[0]) { + break; + } + + str1 += 1; + str2 += 1; + } + + return ((unsigned short*)str1)[0] - ((unsigned short*)str2)[0]; +} + MA_API MA_NO_INLINE int ma_strappend(char* dst, size_t dstSize, const char* srcA, const char* srcB) { int result; @@ -12736,6 +12810,22 @@ MA_API MA_NO_INLINE int ma_strappend(char* dst, size_t dstSize, const char* srcA return result; } +MA_API MA_NO_INLINE size_t ma_wcslen(const wchar_t* str) +{ + const wchar_t* end; + + if (str == NULL) { + return 0; + } + + end = str; + while (end[0] != '\0') { + end += 1; + } + + return end - str; +} + MA_API MA_NO_INLINE char* ma_copy_string(const char* src, const ma_allocation_callbacks* pAllocationCallbacks) { size_t sz; @@ -12758,7 +12848,7 @@ MA_API MA_NO_INLINE char* ma_copy_string(const char* src, const ma_allocation_ca MA_API MA_NO_INLINE wchar_t* ma_copy_string_w(const wchar_t* src, const ma_allocation_callbacks* pAllocationCallbacks) { - size_t sz = wcslen(src)+1; + size_t sz = ma_wcslen(src)+1; wchar_t* dst = (wchar_t*)ma_malloc(sz * sizeof(*dst), pAllocationCallbacks); if (dst == NULL) { return NULL; @@ -13189,7 +13279,7 @@ MA_API ma_result ma_fopen(FILE** ppFile, const char* pFilePath, const char* pOpe return MA_INVALID_ARGS; } -#if defined(_MSC_VER) && _MSC_VER >= 1400 +#if (defined(_MSC_VER) && _MSC_VER >= 1400) && !defined(MA_XBOX_NXDK) err = fopen_s(ppFile, pFilePath, pOpenMode); if (err != 0) { return ma_result_from_errno(err); @@ -13231,7 +13321,7 @@ _wfopen() isn't always available in all compilation environments. This can be reviewed as compatibility issues arise. The preference is to use _wfopen_s() and _wfopen() as opposed to the wcsrtombs() fallback, so if you notice your compiler not detecting this properly I'm happy to look at adding support. */ -#if defined(_WIN32) +#if defined(_WIN32) && !defined(MA_XBOX_NXDK) #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS)) #define MA_HAS_WFOPEN #endif @@ -13247,29 +13337,34 @@ MA_API ma_result ma_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_ return MA_INVALID_ARGS; } -#if defined(MA_HAS_WFOPEN) + #if defined(MA_HAS_WFOPEN) { /* Use _wfopen() on Windows. */ - #if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return ma_result_from_errno(err); + #if defined(_MSC_VER) && _MSC_VER >= 1400 + { + errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode); + if (err != 0) { + return ma_result_from_errno(err); + } } - #else - *ppFile = _wfopen(pFilePath, pOpenMode); - if (*ppFile == NULL) { - return ma_result_from_errno(errno); + #else + { + *ppFile = _wfopen(pFilePath, pOpenMode); + if (*ppFile == NULL) { + return ma_result_from_errno(errno); + } } - #endif + #endif + (void)pAllocationCallbacks; } -#else - /* - Use fopen() on anything other than Windows. Requires a conversion. This is annoying because fopen() is locale specific. The only real way I can - think of to do this is with wcsrtombs(). Note that wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for - maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler error I'll look into improving compatibility. - */ + #elif !defined(MA_XBOX_NXDK) && !defined(MA_DOS) /* If your compiler does not support wcsrtombs(), add it here. */ { + /* + Use fopen() on anything other than Windows. Requires a conversion. This is annoying because fopen() is locale specific. The only real way I can + think of to do this is with wcsrtombs(). Note that wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for + maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler error I'll look into improving compatibility. + */ mbstate_t mbs; size_t lenMB; const wchar_t* pFilePathTemp = pFilePath; @@ -13310,11 +13405,16 @@ MA_API ma_result ma_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_ ma_free(pFilePathMB, pAllocationCallbacks); } + #else + { + /* Getting here means there is no way to open the file with a wide character string. */ + *ppFile = NULL; + } + #endif if (*ppFile == NULL) { return MA_ERROR; } -#endif return MA_SUCCESS; } @@ -13323,7 +13423,7 @@ MA_API ma_result ma_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_ static MA_INLINE void ma_copy_memory_64(void* dst, const void* src, ma_uint64 sizeInBytes) { -#if 0xFFFFFFFFFFFFFFFF <= MA_SIZE_MAX +#if MA_SIZE_MAX > 0xFFFFFFFF MA_COPY_MEMORY(dst, src, (size_t)sizeInBytes); #else while (sizeInBytes > 0) { @@ -13343,7 +13443,7 @@ static MA_INLINE void ma_copy_memory_64(void* dst, const void* src, ma_uint64 si static MA_INLINE void ma_zero_memory_64(void* dst, ma_uint64 sizeInBytes) { -#if 0xFFFFFFFFFFFFFFFF <= MA_SIZE_MAX +#if MA_SIZE_MAX > 0xFFFFFFFF MA_ZERO_MEMORY(dst, (size_t)sizeInBytes); #else while (sizeInBytes > 0) { @@ -13472,6 +13572,18 @@ static ma_result ma_allocation_callbacks_init_copy(ma_allocation_callbacks* pDst Logging **************************************************************************************************************************************************************/ +#ifndef ma_va_copy + #if !defined(_MSC_VER) || _MSC_VER >= 1800 + #if (defined(__GNUC__) && __GNUC__ < 3) + #define ma_va_copy(dst, src) ((dst) = (src)) /* This is untested. Not sure if this is correct for old GCC. */ + #else + #define ma_va_copy(dst, src) va_copy((dst), (src)) + #endif + #else + #define ma_va_copy(dst, src) ((dst) = (src)) + #endif +#endif + MA_API const char* ma_log_level_to_string(ma_uint32 logLevel) { switch (logLevel) @@ -13712,9 +13824,15 @@ MA_API ma_result ma_log_postv(ma_log* pLog, ma_uint32 level, const char* pFormat int length; char pFormattedMessageStack[1024]; char* pFormattedMessageHeap = NULL; + va_list args2; /* First try formatting into our fixed sized stack allocated buffer. If this is too small we'll fallback to a heap allocation. */ - length = vsnprintf(pFormattedMessageStack, sizeof(pFormattedMessageStack), pFormat, args); + ma_va_copy(args2, args); + { + length = vsnprintf(pFormattedMessageStack, sizeof(pFormattedMessageStack), pFormat, args2); + } + va_end(args2); + if (length < 0) { return MA_INVALID_OPERATION; /* An error occurred when trying to convert the buffer. */ } @@ -13755,17 +13873,10 @@ MA_API ma_result ma_log_postv(ma_log* pLog, ma_uint32 level, const char* pFormat char* pFormattedMessage = NULL; va_list args2; - #if _MSC_VER >= 1800 + ma_va_copy(args2, args); { - va_copy(args2, args); + formattedLen = ma_vscprintf(&pLog->allocationCallbacks, pFormat, args2); } - #else - { - args2 = args; - } - #endif - - formattedLen = ma_vscprintf(&pLog->allocationCallbacks, pFormat, args2); va_end(args2); if (formattedLen <= 0) { @@ -13964,7 +14075,7 @@ miniaudio's purposes. #define MA_LCG_A 48271 #define MA_LCG_C 0 -static ma_lcg g_maLCG = {MA_DEFAULT_LCG_SEED}; /* Non-zero initial seed. Use ma_seed() to use an explicit seed. */ +static ma_lcg g_maLCG = {MA_DEFAULT_LCG_SEED}; /* Non-zero initial seed. Use ma_lcg_seed() to use an explicit seed. */ static MA_INLINE void ma_lcg_seed(ma_lcg* pLCG, ma_int32 seed) { @@ -14013,7 +14124,7 @@ static MA_INLINE ma_int32 ma_lcg_rand_range_s32(ma_lcg* pLCG, ma_int32 lo, ma_in } - +#if 0 /* Currently unused. */ static MA_INLINE void ma_seed(ma_int32 seed) { ma_lcg_seed(&g_maLCG, seed); @@ -14038,6 +14149,7 @@ static MA_INLINE float ma_rand_f32(void) { return ma_lcg_rand_f32(&g_maLCG); } +#endif static MA_INLINE float ma_rand_range_f32(float lo, float hi) { @@ -14097,6 +14209,7 @@ Atomics **************************************************************************************************************************************************************/ /* c89atomic.h begin */ #ifndef ma_atomic_h +#define ma_atomic_h #if defined(__cplusplus) extern "C" { #endif @@ -14108,11 +14221,63 @@ extern "C" { #endif #endif typedef int ma_atomic_memory_order; -#define MA_ATOMIC_HAS_8 -#define MA_ATOMIC_HAS_16 -#define MA_ATOMIC_HAS_32 -#define MA_ATOMIC_HAS_64 -#if (defined(_MSC_VER) ) || defined(__WATCOMC__) || defined(__DMC__) +#if !defined(MA_ATOMIC_MODERN_MSVC) && \ + !defined(MA_ATOMIC_LEGACY_MSVC) && \ + !defined(MA_ATOMIC_LEGACY_MSVC_ASM) && \ + !defined(MA_ATOMIC_MODERN_GCC) && \ + !defined(MA_ATOMIC_LEGACY_GCC) && \ + !defined(MA_ATOMIC_LEGACY_GCC_ASM) + #if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__) || defined(__BORLANDC__) + #if (defined(_MSC_VER) && _MSC_VER > 1600) + #define MA_ATOMIC_MODERN_MSVC + #else + #if defined(MA_X64) + #define MA_ATOMIC_LEGACY_MSVC + #else + #define MA_ATOMIC_LEGACY_MSVC_ASM + #endif + #endif + #elif (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) || defined(__clang__) + #define MA_ATOMIC_MODERN_GCC + #else + #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) + #define MA_ATOMIC_LEGACY_GCC + #else + #define MA_ATOMIC_LEGACY_GCC_ASM + #endif + #endif +#endif +#if defined(MA_ATOMIC_MODERN_MSVC) || defined(MA_ATOMIC_LEGACY_MSVC) + #include + #define ma_atomic_memory_order_relaxed 1 + #define ma_atomic_memory_order_consume 2 + #define ma_atomic_memory_order_acquire 3 + #define ma_atomic_memory_order_release 4 + #define ma_atomic_memory_order_acq_rel 5 + #define ma_atomic_memory_order_seq_cst 6 + #define MA_ATOMIC_MSVC_ARM_INTRINSIC_NORETURN(dst, src, order, intrin, ma_atomicType, msvcType) \ + switch (order) \ + { \ + case ma_atomic_memory_order_relaxed: \ + { \ + intrin##_nf((volatile msvcType*)dst, (msvcType)src); \ + } break; \ + case ma_atomic_memory_order_consume: \ + case ma_atomic_memory_order_acquire: \ + { \ + intrin##_acq((volatile msvcType*)dst, (msvcType)src); \ + } break; \ + case ma_atomic_memory_order_release: \ + { \ + intrin##_rel((volatile msvcType*)dst, (msvcType)src); \ + } break; \ + case ma_atomic_memory_order_acq_rel: \ + case ma_atomic_memory_order_seq_cst: \ + default: \ + { \ + intrin((volatile msvcType*)dst, (msvcType)src); \ + } break; \ + } #define MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, intrin, ma_atomicType, msvcType) \ ma_atomicType result; \ switch (order) \ @@ -14138,720 +14303,1501 @@ typedef int ma_atomic_memory_order; } break; \ } \ return result; - #define MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, expected, desired, order, intrin, ma_atomicType, msvcType) \ + typedef ma_uint32 ma_atomic_flag; + static MA_INLINE ma_atomic_flag ma_atomic_flag_test_and_set_explicit(volatile ma_atomic_flag* dst, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, 1, order, _InterlockedExchange, ma_atomic_flag, long); + } + #else + { + (void)order; + return (ma_atomic_flag)_InterlockedExchange((volatile long*)dst, (long)1); + } + #endif + } + static MA_INLINE void ma_atomic_flag_clear_explicit(volatile ma_atomic_flag* dst, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC_NORETURN(dst, 0, order, _InterlockedExchange, ma_atomic_flag, long); + } + #else + { + (void)order; + _InterlockedExchange((volatile long*)dst, (long)0); + } + #endif + } + static MA_INLINE ma_atomic_flag ma_atomic_flag_load_explicit(volatile const ma_atomic_flag* dst, ma_atomic_memory_order order) + { + (void)order; + return (ma_uint32)_InterlockedCompareExchange((volatile long*)dst, 0, 0); + } +#endif +#if defined(MA_ATOMIC_LEGACY_MSVC_ASM) + #define ma_atomic_memory_order_relaxed 1 + #define ma_atomic_memory_order_consume 2 + #define ma_atomic_memory_order_acquire 3 + #define ma_atomic_memory_order_release 4 + #define ma_atomic_memory_order_acq_rel 5 + #define ma_atomic_memory_order_seq_cst 6 + typedef ma_uint32 ma_atomic_flag; + static MA_INLINE ma_atomic_flag ma_atomic_flag_test_and_set_explicit(volatile ma_atomic_flag* dst, ma_atomic_memory_order order) + { + ma_atomic_flag result = 0; + (void)order; + __asm { + mov ecx, dst + mov eax, 1 + xchg [ecx], eax + mov result, eax + } + return result; + } + static MA_INLINE void ma_atomic_flag_clear_explicit(volatile ma_atomic_flag* dst, ma_atomic_memory_order order) + { + if (order == ma_atomic_memory_order_relaxed) { + __asm { + mov esi, dst + mov dword ptr [esi], 0 + } + } else { + __asm { + mov esi, dst + mov eax, 0 + xchg [esi], eax + } + } + } + static MA_INLINE ma_atomic_flag ma_atomic_flag_load_explicit(volatile const ma_atomic_flag* dst, ma_atomic_memory_order order) + { + ma_atomic_flag result = 0; + if (order == ma_atomic_memory_order_relaxed) { + __asm { + mov esi, dst + mov eax, [esi] + mov result, eax + } + } else if (order <= ma_atomic_memory_order_release) { + __asm { + mov esi, dst + mov eax, [esi] + lock add dword ptr [esp], 0 + mov result, eax + } + } else { + __asm { + lock add dword ptr [esp], 0 + mov esi, dst + mov eax, [esi] + mov result, eax + lock add dword ptr [esp], 0 + } + } + return result; + } +#endif +#if defined(MA_ATOMIC_MODERN_GCC) + #define ma_atomic_memory_order_relaxed __ATOMIC_RELAXED + #define ma_atomic_memory_order_consume __ATOMIC_CONSUME + #define ma_atomic_memory_order_acquire __ATOMIC_ACQUIRE + #define ma_atomic_memory_order_release __ATOMIC_RELEASE + #define ma_atomic_memory_order_acq_rel __ATOMIC_ACQ_REL + #define ma_atomic_memory_order_seq_cst __ATOMIC_SEQ_CST + typedef ma_uint32 ma_atomic_flag; + #define ma_atomic_flag_test_and_set_explicit(dst, order) __atomic_exchange_n(dst, 1, order) + #define ma_atomic_flag_clear_explicit(dst, order) __atomic_store_n(dst, 0, order) + #define ma_atomic_flag_load_explicit(dst, order) __atomic_load_n(dst, order) +#endif +#if defined(MA_ATOMIC_LEGACY_GCC) + #define ma_atomic_memory_order_relaxed 1 + #define ma_atomic_memory_order_consume 2 + #define ma_atomic_memory_order_acquire 3 + #define ma_atomic_memory_order_release 4 + #define ma_atomic_memory_order_acq_rel 5 + #define ma_atomic_memory_order_seq_cst 6 + typedef ma_uint32 ma_atomic_flag; + static MA_INLINE ma_atomic_flag ma_atomic_flag_test_and_set_explicit(volatile ma_atomic_flag* dst, ma_atomic_memory_order order) + { + if (order > ma_atomic_memory_order_acquire) { + __sync_synchronize(); + } + return __sync_lock_test_and_set(dst, 1); + } + static MA_INLINE void ma_atomic_flag_clear_explicit(volatile ma_atomic_flag* dst, ma_atomic_memory_order order) + { + if (order > ma_atomic_memory_order_release) { + __sync_synchronize(); + } + __sync_lock_release(dst); + } + static MA_INLINE ma_atomic_flag ma_atomic_flag_load_explicit(volatile const ma_atomic_flag* dst, ma_atomic_memory_order order) + { + (void)order; + return __sync_val_compare_and_swap((ma_atomic_flag*)dst, 0, 0); + } +#endif +#if defined(MA_ATOMIC_LEGACY_GCC_ASM) + #define ma_atomic_memory_order_relaxed 1 + #define ma_atomic_memory_order_consume 2 + #define ma_atomic_memory_order_acquire 3 + #define ma_atomic_memory_order_release 4 + #define ma_atomic_memory_order_acq_rel 5 + #define ma_atomic_memory_order_seq_cst 6 + #if defined(MA_X86) + #define ma_atomic_thread_fence(order) __asm__ __volatile__("lock; addl $0, (%%esp)" ::: "memory") + #elif defined(MA_X64) + #define ma_atomic_thread_fence(order) __asm__ __volatile__("lock; addq $0, (%%rsp)" ::: "memory") + #else + #error Unsupported architecture. + #endif + #define MA_ATOMIC_XCHG_GCC_X86(instructionSizeSuffix, result, dst, src) \ + __asm__ __volatile__( \ + "xchg"instructionSizeSuffix" %0, %1" \ + : "=r"(result), \ + "=m"(*dst) \ + : "0"(src), \ + "m"(*dst) \ + : "memory" \ + ) + #define MA_ATOMIC_LOAD_RELAXED_GCC_X86(instructionSizeSuffix, result, dst) \ + __asm__ __volatile__( \ + "mov"instructionSizeSuffix" %1, %0" \ + : "=r"(result) \ + : "m"(*dst) \ + ) + #define MA_ATOMIC_LOAD_RELEASE_GCC_X86(instructionSizeSuffix, result, dst) \ + ma_atomic_thread_fence(ma_atomic_memory_order_release); \ + __asm__ __volatile__( \ + "mov"instructionSizeSuffix" %1, %0" \ + : "=r"(result) \ + : "m"(*dst) \ + : "memory" \ + ) + #define MA_ATOMIC_LOAD_SEQ_CST_GCC_X86(instructionSizeSuffix, result, dst) \ + ma_atomic_thread_fence(ma_atomic_memory_order_seq_cst); \ + __asm__ __volatile__( \ + "mov"instructionSizeSuffix" %1, %0" \ + : "=r"(result) \ + : "m"(*dst) \ + : "memory" \ + ); \ + ma_atomic_thread_fence(ma_atomic_memory_order_seq_cst) + typedef ma_uint32 ma_atomic_flag; + static MA_INLINE ma_atomic_flag ma_atomic_flag_test_and_set_explicit(volatile ma_atomic_flag* dst, ma_atomic_memory_order order) + { + ma_atomic_flag result; + #if defined(MA_X86) || defined(MA_X64) + { + (void)order; + MA_ATOMIC_XCHG_GCC_X86("l", result, dst, 1); + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + static MA_INLINE void ma_atomic_flag_clear_explicit(volatile ma_atomic_flag* dst, ma_atomic_memory_order order) + { + #if defined(MA_X86) || defined(MA_X64) + { + if (order == ma_atomic_memory_order_relaxed) { + __asm__ __volatile__( + "movl $0, %0" + : "=m"(*dst) + ); + } else if (order == ma_atomic_memory_order_release) { + __asm__ __volatile__( + "movl $0, %0" + : "=m"(*dst) + : + : "memory" + ); + } else { + ma_atomic_flag tmp = 0; + __asm__ __volatile__( + "xchgl %0, %1" + : "=r"(tmp), + "=m"(*dst) + : "0"(tmp), + "m"(*dst) + : "memory" + ); + } + } + #else + { + #error Unsupported architecture. + } + #endif + } + static MA_INLINE ma_atomic_flag ma_atomic_flag_load_explicit(volatile const ma_atomic_flag* dst, ma_atomic_memory_order order) + { + #if defined(MA_X86) || defined(MA_X64) + { + ma_atomic_flag result; + if (order == ma_atomic_memory_order_relaxed) { + MA_ATOMIC_LOAD_RELAXED_GCC_X86("l", result, dst); + } else if (order <= ma_atomic_memory_order_release) { + MA_ATOMIC_LOAD_RELEASE_GCC_X86("l", result, dst); + } else { + MA_ATOMIC_LOAD_SEQ_CST_GCC_X86("l", result, dst); + } + return result; + } + #else + { + #error Unsupported architecture. + } + #endif + } +#endif +#define ma_atomic_flag_test_and_set(dst) ma_atomic_flag_test_and_set_explicit(dst, ma_atomic_memory_order_acquire) +#define ma_atomic_flag_clear(dst) ma_atomic_flag_clear_explicit(dst, ma_atomic_memory_order_release) +typedef ma_atomic_flag ma_atomic_spinlock; +static MA_INLINE void ma_atomic_spinlock_lock(volatile ma_atomic_spinlock* pSpinlock) +{ + for (;;) { + if (ma_atomic_flag_test_and_set_explicit(pSpinlock, ma_atomic_memory_order_acquire) == 0) { + break; + } + while (ma_atomic_flag_load_explicit(pSpinlock, ma_atomic_memory_order_relaxed) == 1) { + } + } +} +static MA_INLINE void ma_atomic_spinlock_unlock(volatile ma_atomic_spinlock* pSpinlock) +{ + ma_atomic_flag_clear_explicit(pSpinlock, ma_atomic_memory_order_release); +} +ma_atomic_spinlock ma_atomic_global_lock; +#if defined(MA_ATOMIC_MODERN_MSVC) || defined(MA_ATOMIC_LEGACY_MSVC) || defined(MA_ATOMIC_LEGACY_MSVC_ASM) || defined(MA_ATOMIC_LEGACY_GCC) || defined(MA_ATOMIC_LEGACY_GCC_ASM) + #if defined(MA_X64) || (defined(MA_X86) && ((defined(__GNUC__) && defined(__i486__)) || (defined(_M_IX86) && _M_IX86 >= 400))) + #if defined(MA_ATOMIC_LEGACY_MSVC) && defined(MA_X64) + #else + #define MA_ATOMIC_IS_LOCK_FREE_8 1 + #define MA_ATOMIC_IS_LOCK_FREE_16 1 + #endif + #define MA_ATOMIC_IS_LOCK_FREE_32 1 + #if defined(MA_X64) || (defined(MA_X86) && ((defined(__GNUC__) && defined(__i586__)) || (defined(_M_IX86) && _M_IX86 >= 500))) + #define MA_ATOMIC_IS_LOCK_FREE_64 1 + #else + #endif + #else + #endif + #if defined(MA_ARM32) || defined(MA_ARM64) + #define MA_ATOMIC_IS_LOCK_FREE_8 1 + #define MA_ATOMIC_IS_LOCK_FREE_16 1 + #define MA_ATOMIC_IS_LOCK_FREE_32 1 + #if defined(MA_ARM64) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) + #define MA_ATOMIC_IS_LOCK_FREE_64 1 + #endif + #endif + #if defined(MA_ATOMIC_PPC32) || defined(MA_ATOMIC_PPC64) + #if (defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7))) && !defined(__clang__) + #else + #define MA_ATOMIC_IS_LOCK_FREE_8 1 + #define MA_ATOMIC_IS_LOCK_FREE_16 1 + #endif + #define MA_ATOMIC_IS_LOCK_FREE_32 1 + #if defined(MA_ATOMIC_PPC64) + #define MA_ATOMIC_IS_LOCK_FREE_64 1 + #endif + #endif + static MA_INLINE ma_bool32 ma_atomic_is_lock_free_8(volatile void* ptr) + { + (void)ptr; + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + return 1; + #else + return 0; + #endif + } + static MA_INLINE ma_bool32 ma_atomic_is_lock_free_16(volatile void* ptr) + { + (void)ptr; + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + return 1; + #else + return 0; + #endif + } + static MA_INLINE ma_bool32 ma_atomic_is_lock_free_32(volatile void* ptr) + { + (void)ptr; + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + return 1; + #else + return 0; + #endif + } + static MA_INLINE ma_bool32 ma_atomic_is_lock_free_64(volatile void* ptr) + { + (void)ptr; + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + return 1; + #else + return 0; + #endif + } +#endif +#define MA_ATOMIC_COMPARE_AND_SWAP_LOCK(sizeInBits, dst, expected, replacement) \ + ma_uint##sizeInBits result; \ + ma_atomic_spinlock_lock(&ma_atomic_global_lock); \ + { \ + result = *dst; \ + if (result == expected) { \ + *dst = replacement; \ + } \ + } \ + ma_atomic_spinlock_unlock(&ma_atomic_global_lock); \ + return result +#define MA_ATOMIC_LOAD_EXPLICIT_LOCK(sizeInBits, ptr, order) \ + ma_uint##sizeInBits result; \ + ma_atomic_spinlock_lock(&ma_atomic_global_lock); \ + { \ + result = *ptr; \ + (void)order; \ + } \ + ma_atomic_spinlock_unlock(&ma_atomic_global_lock); \ + return result +#define MA_ATOMIC_STORE_EXPLICIT_LOCK(sizeInBits, dst, src, order) \ + ma_atomic_spinlock_lock(&ma_atomic_global_lock); \ + { \ + *dst = src; \ + (void)order; \ + } \ + ma_atomic_spinlock_unlock(&ma_atomic_global_lock) +#define MA_ATOMIC_STORE_EXPLICIT_CAS(sizeInBits, dst, src, order) \ + ma_uint##sizeInBits oldValue; \ + do { \ + oldValue = ma_atomic_load_explicit_##sizeInBits(dst, ma_atomic_memory_order_relaxed); \ + } while (ma_atomic_compare_and_swap_##sizeInBits(dst, oldValue, src) != oldValue); \ + (void)order +#define MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(sizeInBits, dst, src, order) \ + ma_uint##sizeInBits result; \ + ma_atomic_spinlock_lock(&ma_atomic_global_lock); \ + { \ + result = *dst; \ + *dst = src; \ + (void)order; \ + } \ + ma_atomic_spinlock_unlock(&ma_atomic_global_lock); \ + return result +#define MA_ATOMIC_EXCHANGE_EXPLICIT_CAS(sizeInBits, dst, src, order) \ + ma_uint##sizeInBits oldValue; \ + do { \ + oldValue = ma_atomic_load_explicit_##sizeInBits(dst, ma_atomic_memory_order_relaxed); \ + } while (ma_atomic_compare_and_swap_##sizeInBits(dst, oldValue, src) != oldValue); \ + (void)order; \ + return oldValue +#define MA_ATOMIC_FETCH_ADD_LOCK(sizeInBits, dst, src, order) \ + ma_uint##sizeInBits result; \ + ma_atomic_spinlock_lock(&ma_atomic_global_lock); \ + { \ + result = *dst; \ + *dst += src; \ + (void)order; \ + } \ + ma_atomic_spinlock_unlock(&ma_atomic_global_lock); \ + return result +#define MA_ATOMIC_FETCH_ADD_CAS(sizeInBits, dst, src, order) \ + ma_uint##sizeInBits oldValue; \ + ma_uint##sizeInBits newValue; \ + do { \ + oldValue = ma_atomic_load_explicit_##sizeInBits(dst, ma_atomic_memory_order_relaxed); \ + newValue = oldValue + src; \ + } while (ma_atomic_compare_and_swap_##sizeInBits(dst, oldValue, newValue) != oldValue); \ + (void)order; \ + return oldValue +#define MA_ATOMIC_FETCH_AND_CAS(sizeInBits, dst, src, order) \ + ma_uint##sizeInBits oldValue; \ + ma_uint##sizeInBits newValue; \ + do { \ + oldValue = ma_atomic_load_explicit_##sizeInBits(dst, ma_atomic_memory_order_relaxed); \ + newValue = (ma_uint##sizeInBits)(oldValue & src); \ + } while (ma_atomic_compare_and_swap_##sizeInBits(dst, oldValue, newValue) != oldValue); \ + (void)order; \ + return oldValue +#define MA_ATOMIC_FETCH_OR_CAS(sizeInBits, dst, src, order) \ + ma_uint##sizeInBits oldValue; \ + ma_uint##sizeInBits newValue; \ + do { \ + oldValue = ma_atomic_load_explicit_##sizeInBits(dst, ma_atomic_memory_order_relaxed); \ + newValue = (ma_uint##sizeInBits)(oldValue | src); \ + } while (ma_atomic_compare_and_swap_##sizeInBits(dst, oldValue, newValue) != oldValue); \ + (void)order; \ + return oldValue +#define MA_ATOMIC_FETCH_XOR_CAS(sizeInBits, dst, src, order) \ + ma_uint##sizeInBits oldValue; \ + ma_uint##sizeInBits newValue; \ + do { \ + oldValue = ma_atomic_load_explicit_##sizeInBits(dst, ma_atomic_memory_order_relaxed); \ + newValue = (ma_uint##sizeInBits)(oldValue ^ src); \ + } while (ma_atomic_compare_and_swap_##sizeInBits(dst, oldValue, newValue) != oldValue); \ + (void)order; \ + return oldValue +#if defined(MA_ATOMIC_MODERN_MSVC) || defined(MA_ATOMIC_LEGACY_MSVC) + #define MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, expected, replacement, order, intrin, ma_atomicType, msvcType) \ ma_atomicType result; \ switch (order) \ { \ case ma_atomic_memory_order_relaxed: \ { \ - result = (ma_atomicType)intrin##_nf((volatile msvcType*)ptr, (msvcType)expected, (msvcType)desired); \ + result = (ma_atomicType)intrin##_nf((volatile msvcType*)ptr, (msvcType)expected, (msvcType)replacement); \ } break; \ case ma_atomic_memory_order_consume: \ case ma_atomic_memory_order_acquire: \ { \ - result = (ma_atomicType)intrin##_acq((volatile msvcType*)ptr, (msvcType)expected, (msvcType)desired); \ + result = (ma_atomicType)intrin##_acq((volatile msvcType*)ptr, (msvcType)expected, (msvcType)replacement); \ } break; \ case ma_atomic_memory_order_release: \ { \ - result = (ma_atomicType)intrin##_rel((volatile msvcType*)ptr, (msvcType)expected, (msvcType)desired); \ + result = (ma_atomicType)intrin##_rel((volatile msvcType*)ptr, (msvcType)expected, (msvcType)replacement); \ } break; \ case ma_atomic_memory_order_acq_rel: \ case ma_atomic_memory_order_seq_cst: \ default: \ { \ - result = (ma_atomicType)intrin((volatile msvcType*)ptr, (msvcType)expected, (msvcType)desired); \ + result = (ma_atomicType)intrin((volatile msvcType*)ptr, (msvcType)expected, (msvcType)replacement); \ } break; \ } \ return result; - #define ma_atomic_memory_order_relaxed 0 - #define ma_atomic_memory_order_consume 1 - #define ma_atomic_memory_order_acquire 2 - #define ma_atomic_memory_order_release 3 - #define ma_atomic_memory_order_acq_rel 4 - #define ma_atomic_memory_order_seq_cst 5 - #if _MSC_VER < 1600 && defined(MA_X86) - #define MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY - #endif - #if _MSC_VER < 1600 - #undef MA_ATOMIC_HAS_8 - #undef MA_ATOMIC_HAS_16 - #endif - #if !defined(MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY) - #include - #endif - #if defined(MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY) - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_uint8 __stdcall ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 desired) - { - ma_uint8 result = 0; - __asm { - mov ecx, dst - mov al, expected - mov dl, desired - lock cmpxchg [ecx], dl - mov result, al - } - return result; - } - #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_uint16 __stdcall ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 desired) - { - ma_uint16 result = 0; - __asm { - mov ecx, dst - mov ax, expected - mov dx, desired - lock cmpxchg [ecx], dx - mov result, ax - } - return result; - } - #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_uint32 __stdcall ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 desired) - { - ma_uint32 result = 0; - __asm { - mov ecx, dst - mov eax, expected - mov edx, desired - lock cmpxchg [ecx], edx - mov result, eax - } - return result; - } - #endif - #if defined(MA_ATOMIC_HAS_64) - static MA_INLINE ma_uint64 __stdcall ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 desired) - { - ma_uint32 resultEAX = 0; - ma_uint32 resultEDX = 0; - __asm { - mov esi, dst - mov eax, dword ptr expected - mov edx, dword ptr expected + 4 - mov ebx, dword ptr desired - mov ecx, dword ptr desired + 4 - lock cmpxchg8b qword ptr [esi] - mov resultEAX, eax - mov resultEDX, edx - } - return ((ma_uint64)resultEDX << 32) | resultEAX; - } - #endif + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + #define ma_atomic_compare_and_swap_8( dst, expected, replacement) (ma_uint8 )_InterlockedCompareExchange8((volatile char*)dst, (char)replacement, (char)expected) #else - #if defined(MA_ATOMIC_HAS_8) - #define ma_atomic_compare_and_swap_8( dst, expected, desired) (ma_uint8 )_InterlockedCompareExchange8((volatile char*)dst, (char)desired, (char)expected) - #endif - #if defined(MA_ATOMIC_HAS_16) - #define ma_atomic_compare_and_swap_16(dst, expected, desired) (ma_uint16)_InterlockedCompareExchange16((volatile short*)dst, (short)desired, (short)expected) - #endif - #if defined(MA_ATOMIC_HAS_32) - #define ma_atomic_compare_and_swap_32(dst, expected, desired) (ma_uint32)_InterlockedCompareExchange((volatile long*)dst, (long)desired, (long)expected) - #endif - #if defined(MA_ATOMIC_HAS_64) - #define ma_atomic_compare_and_swap_64(dst, expected, desired) (ma_uint64)_InterlockedCompareExchange64((volatile ma_int64*)dst, (ma_int64)desired, (ma_int64)expected) - #endif + static MA_INLINE ma_uint8 __stdcall ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 replacement) + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(8, dst, expected, replacement); + } #endif - #if defined(MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY) - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_uint8 __stdcall ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) - { - ma_uint8 result = 0; - (void)order; - __asm { - mov ecx, dst - mov al, src - lock xchg [ecx], al - mov result, al - } - return result; - } - #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_uint16 __stdcall ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) - { - ma_uint16 result = 0; - (void)order; - __asm { - mov ecx, dst - mov ax, src - lock xchg [ecx], ax - mov result, ax - } - return result; - } - #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_uint32 __stdcall ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) - { - ma_uint32 result = 0; - (void)order; - __asm { - mov ecx, dst - mov eax, src - lock xchg [ecx], eax - mov result, eax - } - return result; - } - #endif + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + #define ma_atomic_compare_and_swap_16(dst, expected, replacement) (ma_uint16)_InterlockedCompareExchange16((volatile short*)dst, (short)replacement, (short)expected) #else - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_uint8 __stdcall ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) - { + static MA_INLINE ma_uint16 __stdcall ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 replacement) + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(16, dst, expected, replacement); + } + #endif + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + #define ma_atomic_compare_and_swap_32(dst, expected, replacement) (ma_uint32)_InterlockedCompareExchange((volatile long*)dst, (long)replacement, (long)expected) + #else + static MA_INLINE ma_uint32 __stdcall ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 replacement) + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(32, dst, expected, replacement); + } + #endif + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + #define ma_atomic_compare_and_swap_64(dst, expected, replacement) (ma_uint64)_InterlockedCompareExchange64((volatile ma_int64*)dst, (ma_int64)replacement, (ma_int64)expected) + #else + static MA_INLINE ma_uint64 __stdcall ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 replacement) + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(64, dst, expected, replacement); + } + #endif + static MA_INLINE ma_uint8 ma_atomic_load_explicit_8(volatile const ma_uint8* ptr, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchange8, ma_uint8, char); + { + MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange8, ma_uint8, char); + } #else + { + (void)order; + return ma_atomic_compare_and_swap_8((volatile ma_uint8*)ptr, 0, 0); + } + #endif + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(8, ptr, order); + } + #endif + } + static MA_INLINE ma_uint16 ma_atomic_load_explicit_16(volatile const ma_uint16* ptr, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange16, ma_uint16, short); + } + #else + { + (void)order; + return ma_atomic_compare_and_swap_16((volatile ma_uint16*)ptr, 0, 0); + } + #endif + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(16, ptr, order); + } + #endif + } + static MA_INLINE ma_uint32 ma_atomic_load_explicit_32(volatile const ma_uint32* ptr, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange, ma_uint32, long); + } + #else + { + (void)order; + return ma_atomic_compare_and_swap_32((volatile ma_uint32*)ptr, 0, 0); + } + #endif + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(32, ptr, order); + } + #endif + } + static MA_INLINE ma_uint64 ma_atomic_load_explicit_64(volatile const ma_uint64* ptr, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange64, ma_uint64, long long); + } + #else + { + (void)order; + return ma_atomic_compare_and_swap_64((volatile ma_uint64*)ptr, 0, 0); + } + #endif + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(64, ptr, order); + } + #endif + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchange8, ma_uint8, char); + } + #else + { (void)order; return (ma_uint8)_InterlockedExchange8((volatile char*)dst, (char)src); - #endif } + #endif + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(8, dst, src, order); + } #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_uint16 __stdcall ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) - { + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { #if defined(MA_ARM) + { MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchange16, ma_uint16, short); + } #else + { (void)order; return (ma_uint16)_InterlockedExchange16((volatile short*)dst, (short)src); - #endif } + #endif + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(16, dst, src, order); + } #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_uint32 __stdcall ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) - { + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { #if defined(MA_ARM) + { MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchange, ma_uint32, long); + } #else + { (void)order; return (ma_uint32)_InterlockedExchange((volatile long*)dst, (long)src); - #endif } - #endif - #if defined(MA_ATOMIC_HAS_64) && defined(MA_64BIT) - static MA_INLINE ma_uint64 __stdcall ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) - { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchange64, ma_uint64, long long); - #else - (void)order; - return (ma_uint64)_InterlockedExchange64((volatile long long*)dst, (long long)src); #endif - } - #else - #endif - #endif - #if defined(MA_ATOMIC_HAS_64) && !defined(MA_64BIT) - static MA_INLINE ma_uint64 __stdcall ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) - { - ma_uint64 oldValue; - do { - oldValue = *dst; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, src) != oldValue); - (void)order; - return oldValue; } - #endif - #if defined(MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY) - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) - { - ma_uint8 result = 0; - (void)order; - __asm { - mov ecx, dst - mov al, src - lock xadd [ecx], al - mov result, al - } - return result; - } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(32, dst, src, order); + } #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + #if defined(MA_32BIT) { - ma_uint16 result = 0; - (void)order; - __asm { - mov ecx, dst - mov ax, src - lock xadd [ecx], ax - mov result, ax - } - return result; + MA_ATOMIC_EXCHANGE_EXPLICIT_CAS(64, dst, src, order); } - #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) - { - ma_uint32 result = 0; - (void)order; - __asm { - mov ecx, dst - mov eax, src - lock xadd [ecx], eax - mov result, eax - } - return result; - } - #endif - #else - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) - { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchangeAdd8, ma_uint8, char); #else + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchange64, ma_uint64, long long); + } + #else + { + (void)order; + return (ma_uint64)_InterlockedExchange64((volatile long long*)dst, (long long)src); + } + #endif + } + #endif + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(64, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchangeAdd8, ma_uint8, char); + } + #else + { (void)order; return (ma_uint8)_InterlockedExchangeAdd8((volatile char*)dst, (char)src); - #endif } + #endif + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(8, dst, src, order); + } #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) - { + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { #if defined(MA_ARM) + { MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchangeAdd16, ma_uint16, short); + } #else + { (void)order; return (ma_uint16)_InterlockedExchangeAdd16((volatile short*)dst, (short)src); - #endif } + #endif + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(16, dst, src, order); + } #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) - { + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { #if defined(MA_ARM) + { MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchangeAdd, ma_uint32, long); + } #else + { (void)order; return (ma_uint32)_InterlockedExchangeAdd((volatile long*)dst, (long)src); - #endif } - #endif - #if defined(MA_ATOMIC_HAS_64) && defined(MA_64BIT) - static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) - { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchangeAdd64, ma_uint64, long long); - #else - (void)order; - return (ma_uint64)_InterlockedExchangeAdd64((volatile long long*)dst, (long long)src); #endif - } + } #else - #endif - #endif - #if defined(MA_ATOMIC_HAS_64) && !defined(MA_64BIT) - static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) { - ma_uint64 oldValue; - ma_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue + src; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + MA_ATOMIC_FETCH_ADD_LOCK(32, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + #if defined(MA_32BIT) + { + MA_ATOMIC_FETCH_ADD_CAS(64, dst, src, order); + } + #else + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchangeAdd64, ma_uint64, long long); + } + #else + { + (void)order; + return (ma_uint64)_InterlockedExchangeAdd64((volatile long long*)dst, (long long)src); + } + #endif + } + #endif + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(64, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_sub_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + return ma_atomic_fetch_add_explicit_8(dst, (ma_uint8)(-(ma_int8)src), order); + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_sub_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + return ma_atomic_fetch_add_explicit_16(dst, (ma_uint16)(-(ma_int16)src), order); + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_sub_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + return ma_atomic_fetch_add_explicit_32(dst, (ma_uint32)(-(ma_int32)src), order); + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_sub_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + return ma_atomic_fetch_add_explicit_64(dst, (ma_uint64)(-(ma_int64)src), order); + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_and_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd8, ma_uint8, char); + } + #else + { + MA_ATOMIC_FETCH_AND_CAS(8, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_and_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd16, ma_uint16, short); + } + #else + { + MA_ATOMIC_FETCH_AND_CAS(16, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_and_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd, ma_uint32, long); + } + #else + { + MA_ATOMIC_FETCH_AND_CAS(32, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_and_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd64, ma_uint64, long long); + } + #else + { + MA_ATOMIC_FETCH_AND_CAS(64, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_or_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr8, ma_uint8, char); + } + #else + { + MA_ATOMIC_FETCH_OR_CAS(8, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_or_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr16, ma_uint16, short); + } + #else + { + MA_ATOMIC_FETCH_OR_CAS(16, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_or_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr, ma_uint32, long); + } + #else + { + MA_ATOMIC_FETCH_OR_CAS(32, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_or_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr64, ma_uint64, long long); + } + #else + { + MA_ATOMIC_FETCH_OR_CAS(64, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_xor_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor8, ma_uint8, char); + } + #else + { + MA_ATOMIC_FETCH_XOR_CAS(8, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_xor_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor16, ma_uint16, short); + } + #else + { + MA_ATOMIC_FETCH_XOR_CAS(16, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_xor_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor, ma_uint32, long); + } + #else + { + MA_ATOMIC_FETCH_XOR_CAS(32, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_xor_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ARM) + { + MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor64, ma_uint64, long long); + } + #else + { + MA_ATOMIC_FETCH_XOR_CAS(64, dst, src, order); + } + #endif + } + #define ma_atomic_store_explicit_8( dst, src, order) (void)ma_atomic_exchange_explicit_8 (dst, src, order) + #define ma_atomic_store_explicit_16(dst, src, order) (void)ma_atomic_exchange_explicit_16(dst, src, order) + #define ma_atomic_store_explicit_32(dst, src, order) (void)ma_atomic_exchange_explicit_32(dst, src, order) + #define ma_atomic_store_explicit_64(dst, src, order) (void)ma_atomic_exchange_explicit_64(dst, src, order) + #if defined(MA_X64) + #define ma_atomic_thread_fence(order) __faststorefence(), (void)order + #elif defined(MA_ARM64) + #define ma_atomic_thread_fence(order) __dmb(_ARM64_BARRIER_ISH), (void)order + #else + static MA_INLINE void ma_atomic_thread_fence(ma_atomic_memory_order order) + { + volatile ma_uint32 barrier = 0; + ma_atomic_fetch_add_explicit_32(&barrier, 0, order); } #endif - #if defined(MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY) - static MA_INLINE void __stdcall ma_atomic_thread_fence(ma_atomic_memory_order order) + #define ma_atomic_signal_fence(order) _ReadWriteBarrier(), (void)order +#endif +#if defined(MA_ATOMIC_LEGACY_MSVC_ASM) + static MA_INLINE ma_uint8 __stdcall ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 replacement) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) { + ma_uint8 result = 0; + __asm { + mov ecx, dst + mov al, expected + mov dl, replacement + lock cmpxchg [ecx], dl + mov result, al + } + return result; + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(8, dst, expected, replacement); + } + #endif + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 replacement) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + ma_uint16 result = 0; + __asm { + mov ecx, dst + mov ax, expected + mov dx, replacement + lock cmpxchg [ecx], dx + mov result, ax + } + return result; + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(16, dst, expected, replacement); + } + #endif + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 replacement) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + ma_uint32 result = 0; + __asm { + mov ecx, dst + mov eax, expected + mov edx, replacement + lock cmpxchg [ecx], edx + mov result, eax + } + return result; + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(32, dst, expected, replacement); + } + #endif + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 replacement) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + ma_uint32 resultEAX = 0; + ma_uint32 resultEDX = 0; + __asm { + mov esi, dst + mov eax, dword ptr expected + mov edx, dword ptr expected + 4 + mov ebx, dword ptr replacement + mov ecx, dword ptr replacement + 4 + lock cmpxchg8b qword ptr [esi] + mov resultEAX, eax + mov resultEDX, edx + } + return ((ma_uint64)resultEDX << 32) | resultEAX; + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(64, dst, expected, replacement); + } + #endif + } + static MA_INLINE ma_uint8 ma_atomic_load_explicit_8(volatile const ma_uint8* dst, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + ma_uint8 result = 0; + if (order == ma_atomic_memory_order_relaxed) { + __asm { + mov esi, dst + mov al, [esi] + mov result, al + } + } else if (order <= ma_atomic_memory_order_release) { + __asm { + mov esi, dst + mov al, [esi] + lock add dword ptr [esp], 0 + mov result, al + } + } else { + __asm { + lock add dword ptr [esp], 0 + mov esi, dst + mov al, [esi] + mov result, al + lock add dword ptr [esp], 0 + } + } + return result; + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(8, dst, order); + } + #endif + } + static MA_INLINE ma_uint16 ma_atomic_load_explicit_16(volatile const ma_uint16* dst, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + ma_uint16 result = 0; + if (order == ma_atomic_memory_order_relaxed) { + __asm { + mov esi, dst + mov ax, [esi] + mov result, ax + } + } else if (order <= ma_atomic_memory_order_release) { + __asm { + mov esi, dst + mov ax, [esi] + lock add dword ptr [esp], 0 + mov result, ax + } + } else { + __asm { + lock add dword ptr [esp], 0 + mov esi, dst + mov ax, [esi] + mov result, ax + lock add dword ptr [esp], 0 + } + } + return result; + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(16, dst, order); + } + #endif + } + static MA_INLINE ma_uint32 ma_atomic_load_explicit_32(volatile const ma_uint32* dst, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + ma_uint32 result = 0; + if (order == ma_atomic_memory_order_relaxed) { + __asm { + mov esi, dst + mov eax, [esi] + mov result, eax + } + } else if (order <= ma_atomic_memory_order_release) { + __asm { + mov esi, dst + mov eax, [esi] + lock add dword ptr [esp], 0 + mov result, eax + } + } else { + __asm { + lock add dword ptr [esp], 0 + mov esi, dst + mov eax, [esi] + mov result, eax + lock add dword ptr [esp], 0 + } + } + return result; + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(32, dst, order); + } + #endif + } + static MA_INLINE ma_uint64 ma_atomic_load_explicit_64(volatile const ma_uint64* dst, ma_atomic_memory_order order) + { + (void)order; + return ma_atomic_compare_and_swap_64((volatile ma_uint64*)dst, 0, 0); + } + static MA_INLINE void __stdcall ma_atomic_store_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + if (order == ma_atomic_memory_order_relaxed) { + __asm { + mov esi, dst + mov al, src + mov [esi], al + } + } else { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + __asm { + mov esi, dst + mov al, src + xchg [esi], al + } + } + #else + { + MA_ATOMIC_STORE_EXPLICIT_LOCK(8, dst, src, order); + } + #endif + } + } + static MA_INLINE void __stdcall ma_atomic_store_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + if (order == ma_atomic_memory_order_relaxed) { + __asm { + mov esi, dst + mov ax, src + mov [esi], ax + } + } else { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + __asm { + mov esi, dst + mov ax, src + xchg [esi], ax + } + } + #else + { + MA_ATOMIC_STORE_EXPLICIT_LOCK(16, dst, src, order); + } + #endif + } + } + static MA_INLINE void __stdcall ma_atomic_store_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + if (order == ma_atomic_memory_order_relaxed) { + __asm { + mov esi, dst + mov eax, src + mov [esi], eax + } + } else { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + __asm { + mov esi, dst + mov eax, src + xchg [esi], eax + } + } + #else + { + MA_ATOMIC_STORE_EXPLICIT_LOCK(32, dst, src, order); + } + #endif + } + } + static MA_INLINE void __stdcall ma_atomic_store_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + MA_ATOMIC_STORE_EXPLICIT_CAS(64, dst, src, order); + } + #else + { + MA_ATOMIC_STORE_EXPLICIT_LOCK(64, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + ma_uint8 result = 0; (void)order; __asm { - lock add [esp], 0 + mov ecx, dst + mov al, src + lock xchg [ecx], al + mov result, al } + return result; } - #else - #if defined(MA_X64) - #define ma_atomic_thread_fence(order) __faststorefence(), (void)order - #elif defined(MA_ARM64) - #define ma_atomic_thread_fence(order) __dmb(_ARM64_BARRIER_ISH), (void)order #else - static MA_INLINE void ma_atomic_thread_fence(ma_atomic_memory_order order) - { - volatile ma_uint32 barrier = 0; - ma_atomic_fetch_add_explicit_32(&barrier, 0, order); + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(8, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + ma_uint16 result = 0; + (void)order; + __asm { + mov ecx, dst + mov ax, src + lock xchg [ecx], ax + mov result, ax } - #endif - #endif - #define ma_atomic_compiler_fence() ma_atomic_thread_fence(ma_atomic_memory_order_seq_cst) - #define ma_atomic_signal_fence(order) ma_atomic_thread_fence(order) - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_uint8 ma_atomic_load_explicit_8(volatile const ma_uint8* ptr, ma_atomic_memory_order order) - { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange8, ma_uint8, char); + return result; + } #else - (void)order; - return ma_atomic_compare_and_swap_8((volatile ma_uint8*)ptr, 0, 0); - #endif - } - #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_uint16 ma_atomic_load_explicit_16(volatile const ma_uint16* ptr, ma_atomic_memory_order order) { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange16, ma_uint16, short); + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(16, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + ma_uint32 result = 0; + (void)order; + __asm { + mov ecx, dst + mov eax, src + xchg [ecx], eax + mov result, eax + } + return result; + } #else - (void)order; - return ma_atomic_compare_and_swap_16((volatile ma_uint16*)ptr, 0, 0); - #endif - } - #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_uint32 ma_atomic_load_explicit_32(volatile const ma_uint32* ptr, ma_atomic_memory_order order) { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange, ma_uint32, long); + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(32, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + MA_ATOMIC_EXCHANGE_EXPLICIT_CAS(64, dst, src, order); + } #else - (void)order; - return ma_atomic_compare_and_swap_32((volatile ma_uint32*)ptr, 0, 0); - #endif - } - #endif - #if defined(MA_ATOMIC_HAS_64) - static MA_INLINE ma_uint64 ma_atomic_load_explicit_64(volatile const ma_uint64* ptr, ma_atomic_memory_order order) { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange64, ma_uint64, long long); + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(64, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + ma_uint8 result = 0; + (void)order; + __asm { + mov ecx, dst + mov al, src + lock xadd [ecx], al + mov result, al + } + return result; + } #else - (void)order; - return ma_atomic_compare_and_swap_64((volatile ma_uint64*)ptr, 0, 0); + { + MA_ATOMIC_FETCH_ADD_LOCK(8, dst, src, order); + } #endif - } - #endif - #if defined(MA_ATOMIC_HAS_8) - #define ma_atomic_store_explicit_8( dst, src, order) (void)ma_atomic_exchange_explicit_8 (dst, src, order) - #endif - #if defined(MA_ATOMIC_HAS_16) - #define ma_atomic_store_explicit_16(dst, src, order) (void)ma_atomic_exchange_explicit_16(dst, src, order) - #endif - #if defined(MA_ATOMIC_HAS_32) - #define ma_atomic_store_explicit_32(dst, src, order) (void)ma_atomic_exchange_explicit_32(dst, src, order) - #endif - #if defined(MA_ATOMIC_HAS_64) - #define ma_atomic_store_explicit_64(dst, src, order) (void)ma_atomic_exchange_explicit_64(dst, src, order) - #endif - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_sub_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) { - ma_uint8 oldValue; - ma_uint8 newValue; - do { - oldValue = *dst; - newValue = (ma_uint8)(oldValue - src); - } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); + ma_uint16 result = 0; (void)order; - return oldValue; + __asm { + mov ecx, dst + mov ax, src + lock xadd [ecx], ax + mov result, ax + } + return result; } - #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_sub_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) - { - ma_uint16 oldValue; - ma_uint16 newValue; - do { - oldValue = *dst; - newValue = (ma_uint16)(oldValue - src); - } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_sub_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) - { - ma_uint32 oldValue; - ma_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue - src; - } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(MA_ATOMIC_HAS_64) - static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_sub_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) - { - ma_uint64 oldValue; - ma_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue - src; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_and_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) - { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd8, ma_uint8, char); #else - ma_uint8 oldValue; - ma_uint8 newValue; - do { - oldValue = *dst; - newValue = (ma_uint8)(oldValue & src); - } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - #endif - } - #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_and_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd16, ma_uint16, short); - #else - ma_uint16 oldValue; - ma_uint16 newValue; - do { - oldValue = *dst; - newValue = (ma_uint16)(oldValue & src); - } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - #endif + MA_ATOMIC_FETCH_ADD_LOCK(16, dst, src, order); } - #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_and_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + #endif + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd, ma_uint32, long); - #else - ma_uint32 oldValue; - ma_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue & src; - } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); + ma_uint32 result = 0; (void)order; - return oldValue; - #endif + __asm { + mov ecx, dst + mov eax, src + lock xadd [ecx], eax + mov result, eax + } + return result; } - #endif - #if defined(MA_ATOMIC_HAS_64) - static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_and_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + #else { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd64, ma_uint64, long long); - #else - ma_uint64 oldValue; - ma_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue & src; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - #endif + MA_ATOMIC_FETCH_ADD_LOCK(32, dst, src, order); } - #endif - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_xor_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + #endif + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor8, ma_uint8, char); - #else - ma_uint8 oldValue; - ma_uint8 newValue; - do { - oldValue = *dst; - newValue = (ma_uint8)(oldValue ^ src); - } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - #endif + MA_ATOMIC_FETCH_ADD_CAS(64, dst, src, order); } - #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_xor_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + #else { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor16, ma_uint16, short); - #else - ma_uint16 oldValue; - ma_uint16 newValue; - do { - oldValue = *dst; - newValue = (ma_uint16)(oldValue ^ src); - } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - #endif + MA_ATOMIC_FETCH_ADD_LOCK(64, dst, src, order); } - #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_xor_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + #endif + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_sub_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor, ma_uint32, long); - #else - ma_uint32 oldValue; - ma_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue ^ src; - } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); + ma_uint8 result = 0; (void)order; - return oldValue; - #endif + __asm { + mov ecx, dst + mov al, src + neg al + lock xadd [ecx], al + mov result, al + } + return result; } - #endif - #if defined(MA_ATOMIC_HAS_64) - static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_xor_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + #else { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor64, ma_uint64, long long); - #else - ma_uint64 oldValue; - ma_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue ^ src; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - #endif + MA_ATOMIC_FETCH_ADD_LOCK(8, dst, (ma_uint8)(-(ma_int8)src), order); } - #endif - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_or_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + #endif + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_sub_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr8, ma_uint8, char); - #else - ma_uint8 oldValue; - ma_uint8 newValue; - do { - oldValue = *dst; - newValue = (ma_uint8)(oldValue | src); - } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); + ma_uint16 result = 0; (void)order; - return oldValue; - #endif + __asm { + mov ecx, dst + mov ax, src + neg ax + lock xadd [ecx], ax + mov result, ax + } + return result; } - #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_or_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + #else { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr16, ma_uint16, short); - #else - ma_uint16 oldValue; - ma_uint16 newValue; - do { - oldValue = *dst; - newValue = (ma_uint16)(oldValue | src); - } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - #endif + MA_ATOMIC_FETCH_ADD_LOCK(16, dst, (ma_uint16)(-(ma_int16)src), order); } - #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_or_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + #endif + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_sub_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr, ma_uint32, long); - #else - ma_uint32 oldValue; - ma_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue | src; - } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); + ma_uint32 result = 0; (void)order; - return oldValue; - #endif + __asm { + mov ecx, dst + mov eax, src + neg eax + lock xadd [ecx], eax + mov result, eax + } + return result; } - #endif - #if defined(MA_ATOMIC_HAS_64) - static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_or_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + #else { - #if defined(MA_ARM) - MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr64, ma_uint64, long long); - #else - ma_uint64 oldValue; - ma_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue | src; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - #endif + MA_ATOMIC_FETCH_ADD_LOCK(32, dst, (ma_uint32)(-(ma_int32)src), order); } - #endif - #if defined(MA_ATOMIC_HAS_8) - #define ma_atomic_test_and_set_explicit_8( dst, order) ma_atomic_exchange_explicit_8 (dst, 1, order) - #endif - #if defined(MA_ATOMIC_HAS_16) - #define ma_atomic_test_and_set_explicit_16(dst, order) ma_atomic_exchange_explicit_16(dst, 1, order) - #endif - #if defined(MA_ATOMIC_HAS_32) - #define ma_atomic_test_and_set_explicit_32(dst, order) ma_atomic_exchange_explicit_32(dst, 1, order) - #endif - #if defined(MA_ATOMIC_HAS_64) - #define ma_atomic_test_and_set_explicit_64(dst, order) ma_atomic_exchange_explicit_64(dst, 1, order) - #endif - #if defined(MA_ATOMIC_HAS_8) - #define ma_atomic_clear_explicit_8( dst, order) ma_atomic_store_explicit_8 (dst, 0, order) - #endif - #if defined(MA_ATOMIC_HAS_16) - #define ma_atomic_clear_explicit_16(dst, order) ma_atomic_store_explicit_16(dst, 0, order) - #endif - #if defined(MA_ATOMIC_HAS_32) - #define ma_atomic_clear_explicit_32(dst, order) ma_atomic_store_explicit_32(dst, 0, order) - #endif - #if defined(MA_ATOMIC_HAS_64) - #define ma_atomic_clear_explicit_64(dst, order) ma_atomic_store_explicit_64(dst, 0, order) - #endif - #if defined(MA_ATOMIC_HAS_8) - typedef ma_uint8 ma_atomic_flag; - #define ma_atomic_flag_test_and_set_explicit(ptr, order) (ma_bool32)ma_atomic_test_and_set_explicit_8(ptr, order) - #define ma_atomic_flag_clear_explicit(ptr, order) ma_atomic_clear_explicit_8(ptr, order) - #define ma_atomic_flag_load_explicit(ptr, order) ma_atomic_load_explicit_8(ptr, order) - #else - typedef ma_uint32 ma_atomic_flag; - #define ma_atomic_flag_test_and_set_explicit(ptr, order) (ma_bool32)ma_atomic_test_and_set_explicit_32(ptr, order) - #define ma_atomic_flag_clear_explicit(ptr, order) ma_atomic_clear_explicit_32(ptr, order) - #define ma_atomic_flag_load_explicit(ptr, order) ma_atomic_load_explicit_32(ptr, order) - #endif -#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) + #endif + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_sub_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_ADD_CAS(64, dst, (ma_uint64)(-(ma_int64)src), order); + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_and_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_AND_CAS(8, dst, src, order); + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_and_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_AND_CAS(16, dst, src, order); + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_and_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_AND_CAS(32, dst, src, order); + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_and_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_AND_CAS(64, dst, src, order); + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_or_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_OR_CAS(8, dst, src, order); + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_or_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_OR_CAS(16, dst, src, order); + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_or_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_OR_CAS(32, dst, src, order); + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_or_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_OR_CAS(64, dst, src, order); + } + static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_xor_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_XOR_CAS(8, dst, src, order); + } + static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_xor_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_XOR_CAS(16, dst, src, order); + } + static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_xor_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_XOR_CAS(32, dst, src, order); + } + static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_xor_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_XOR_CAS(64, dst, src, order); + } + static MA_INLINE void __stdcall ma_atomic_thread_fence(ma_atomic_memory_order order) + { + (void)order; + __asm { + lock add dword ptr [esp], 0 + } + } + #define ma_atomic_signal_fence(order) __asm {}; (void)order +#endif +#if defined(MA_ATOMIC_MODERN_GCC) #define MA_ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE - #define MA_ATOMIC_HAS_NATIVE_IS_LOCK_FREE - #define ma_atomic_memory_order_relaxed __ATOMIC_RELAXED - #define ma_atomic_memory_order_consume __ATOMIC_CONSUME - #define ma_atomic_memory_order_acquire __ATOMIC_ACQUIRE - #define ma_atomic_memory_order_release __ATOMIC_RELEASE - #define ma_atomic_memory_order_acq_rel __ATOMIC_ACQ_REL - #define ma_atomic_memory_order_seq_cst __ATOMIC_SEQ_CST - #define ma_atomic_compiler_fence() __asm__ __volatile__("":::"memory") #define ma_atomic_thread_fence(order) __atomic_thread_fence(order) #define ma_atomic_signal_fence(order) __atomic_signal_fence(order) #define ma_atomic_is_lock_free_8(ptr) __atomic_is_lock_free(1, ptr) #define ma_atomic_is_lock_free_16(ptr) __atomic_is_lock_free(2, ptr) #define ma_atomic_is_lock_free_32(ptr) __atomic_is_lock_free(4, ptr) #define ma_atomic_is_lock_free_64(ptr) __atomic_is_lock_free(8, ptr) - #define ma_atomic_test_and_set_explicit_8( dst, order) __atomic_exchange_n(dst, 1, order) - #define ma_atomic_test_and_set_explicit_16(dst, order) __atomic_exchange_n(dst, 1, order) - #define ma_atomic_test_and_set_explicit_32(dst, order) __atomic_exchange_n(dst, 1, order) - #define ma_atomic_test_and_set_explicit_64(dst, order) __atomic_exchange_n(dst, 1, order) - #define ma_atomic_clear_explicit_8( dst, order) __atomic_store_n(dst, 0, order) - #define ma_atomic_clear_explicit_16(dst, order) __atomic_store_n(dst, 0, order) - #define ma_atomic_clear_explicit_32(dst, order) __atomic_store_n(dst, 0, order) - #define ma_atomic_clear_explicit_64(dst, order) __atomic_store_n(dst, 0, order) #define ma_atomic_store_explicit_8( dst, src, order) __atomic_store_n(dst, src, order) #define ma_atomic_store_explicit_16(dst, src, order) __atomic_store_n(dst, src, order) #define ma_atomic_store_explicit_32(dst, src, order) __atomic_store_n(dst, src, order) @@ -14864,14 +15810,14 @@ typedef int ma_atomic_memory_order; #define ma_atomic_exchange_explicit_16(dst, src, order) __atomic_exchange_n(dst, src, order) #define ma_atomic_exchange_explicit_32(dst, src, order) __atomic_exchange_n(dst, src, order) #define ma_atomic_exchange_explicit_64(dst, src, order) __atomic_exchange_n(dst, src, order) - #define ma_atomic_compare_exchange_strong_explicit_8( dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder) - #define ma_atomic_compare_exchange_strong_explicit_16(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder) - #define ma_atomic_compare_exchange_strong_explicit_32(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder) - #define ma_atomic_compare_exchange_strong_explicit_64(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder) - #define ma_atomic_compare_exchange_weak_explicit_8( dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder) - #define ma_atomic_compare_exchange_weak_explicit_16(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder) - #define ma_atomic_compare_exchange_weak_explicit_32(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder) - #define ma_atomic_compare_exchange_weak_explicit_64(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder) + #define ma_atomic_compare_exchange_strong_explicit_8( dst, expected, replacement, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, replacement, 0, successOrder, failureOrder) + #define ma_atomic_compare_exchange_strong_explicit_16(dst, expected, replacement, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, replacement, 0, successOrder, failureOrder) + #define ma_atomic_compare_exchange_strong_explicit_32(dst, expected, replacement, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, replacement, 0, successOrder, failureOrder) + #define ma_atomic_compare_exchange_strong_explicit_64(dst, expected, replacement, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, replacement, 0, successOrder, failureOrder) + #define ma_atomic_compare_exchange_weak_explicit_8( dst, expected, replacement, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, replacement, 1, successOrder, failureOrder) + #define ma_atomic_compare_exchange_weak_explicit_16(dst, expected, replacement, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, replacement, 1, successOrder, failureOrder) + #define ma_atomic_compare_exchange_weak_explicit_32(dst, expected, replacement, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, replacement, 1, successOrder, failureOrder) + #define ma_atomic_compare_exchange_weak_explicit_64(dst, expected, replacement, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, replacement, 1, successOrder, failureOrder) #define ma_atomic_fetch_add_explicit_8( dst, src, order) __atomic_fetch_add(dst, src, order) #define ma_atomic_fetch_add_explicit_16(dst, src, order) __atomic_fetch_add(dst, src, order) #define ma_atomic_fetch_add_explicit_32(dst, src, order) __atomic_fetch_add(dst, src, order) @@ -14892,19 +15838,19 @@ typedef int ma_atomic_memory_order; #define ma_atomic_fetch_and_explicit_16(dst, src, order) __atomic_fetch_and(dst, src, order) #define ma_atomic_fetch_and_explicit_32(dst, src, order) __atomic_fetch_and(dst, src, order) #define ma_atomic_fetch_and_explicit_64(dst, src, order) __atomic_fetch_and(dst, src, order) - static MA_INLINE ma_uint8 ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 desired) + static MA_INLINE ma_uint8 ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 replacement) { - __atomic_compare_exchange_n(dst, &expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); + __atomic_compare_exchange_n(dst, &expected, replacement, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); return expected; } - static MA_INLINE ma_uint16 ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 desired) + static MA_INLINE ma_uint16 ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 replacement) { - __atomic_compare_exchange_n(dst, &expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); + __atomic_compare_exchange_n(dst, &expected, replacement, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); return expected; } - static MA_INLINE ma_uint32 ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 desired) + static MA_INLINE ma_uint32 ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 replacement) { - __atomic_compare_exchange_n(dst, &expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); + __atomic_compare_exchange_n(dst, &expected, replacement, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); return expected; } #if defined(__clang__) @@ -14913,636 +15859,1134 @@ typedef int ma_atomic_memory_order; #pragma clang diagnostic ignored "-Watomic-alignment" #endif #endif - static MA_INLINE ma_uint64 ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 desired) + static MA_INLINE ma_uint64 ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 replacement) { - __atomic_compare_exchange_n(dst, &expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); + __atomic_compare_exchange_n(dst, &expected, replacement, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); return expected; } #if defined(__clang__) #pragma clang diagnostic pop #endif - typedef ma_uint8 ma_atomic_flag; - #define ma_atomic_flag_test_and_set_explicit(dst, order) (ma_bool32)__atomic_test_and_set(dst, order) - #define ma_atomic_flag_clear_explicit(dst, order) __atomic_clear(dst, order) - #define ma_atomic_flag_load_explicit(ptr, order) ma_atomic_load_explicit_8(ptr, order) -#else - #define ma_atomic_memory_order_relaxed 1 - #define ma_atomic_memory_order_consume 2 - #define ma_atomic_memory_order_acquire 3 - #define ma_atomic_memory_order_release 4 - #define ma_atomic_memory_order_acq_rel 5 - #define ma_atomic_memory_order_seq_cst 6 - #define ma_atomic_compiler_fence() __asm__ __volatile__("":::"memory") - #if defined(__GNUC__) +#endif +#if defined(MA_ATOMIC_LEGACY_GCC) || defined(MA_ATOMIC_LEGACY_GCC_ASM) + #define ma_atomic_signal_fence(order) __asm__ __volatile__("":::"memory") + #if defined(MA_ATOMIC_LEGACY_GCC) #define ma_atomic_thread_fence(order) __sync_synchronize(), (void)order - static MA_INLINE ma_uint8 ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + static MA_INLINE ma_uint8 ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 replacement) { - if (order > ma_atomic_memory_order_acquire) { - __sync_synchronize(); + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + return __sync_val_compare_and_swap(dst, expected, replacement); } - return __sync_lock_test_and_set(dst, src); + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(8, dst, expected, replacement); + } + #endif } - static MA_INLINE ma_uint16 ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + static MA_INLINE ma_uint16 ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 replacement) { - ma_uint16 oldValue; - do { - oldValue = *dst; - } while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + return __sync_val_compare_and_swap(dst, expected, replacement); + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(16, dst, expected, replacement); + } + #endif } - static MA_INLINE ma_uint32 ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + static MA_INLINE ma_uint32 ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 replacement) { - ma_uint32 oldValue; - do { - oldValue = *dst; - } while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + return __sync_val_compare_and_swap(dst, expected, replacement); + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(32, dst, expected, replacement); + } + #endif } - static MA_INLINE ma_uint64 ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + static MA_INLINE ma_uint64 ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 replacement) { - ma_uint64 oldValue; - do { - oldValue = *dst; - } while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + return __sync_val_compare_and_swap(dst, expected, replacement); + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(64, dst, expected, replacement); + } + #endif } - static MA_INLINE ma_uint8 ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + static MA_INLINE ma_uint8 ma_atomic_load_explicit_8(volatile const ma_uint8* ptr, ma_atomic_memory_order order) { - (void)order; - return __sync_fetch_and_add(dst, src); + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + (void)order; + return ma_atomic_compare_and_swap_8((ma_uint8*)ptr, 0, 0); + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(8, ptr, order); + } + #endif } - static MA_INLINE ma_uint16 ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + static MA_INLINE ma_uint16 ma_atomic_load_explicit_16(volatile const ma_uint16* ptr, ma_atomic_memory_order order) { - (void)order; - return __sync_fetch_and_add(dst, src); + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + (void)order; + return ma_atomic_compare_and_swap_16((ma_uint16*)ptr, 0, 0); + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(16, ptr, order); + } + #endif } - static MA_INLINE ma_uint32 ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + static MA_INLINE ma_uint32 ma_atomic_load_explicit_32(volatile const ma_uint32* ptr, ma_atomic_memory_order order) { - (void)order; - return __sync_fetch_and_add(dst, src); + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + (void)order; + return ma_atomic_compare_and_swap_32((ma_uint32*)ptr, 0, 0); + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(32, ptr, order); + } + #endif } - static MA_INLINE ma_uint64 ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + static MA_INLINE ma_uint64 ma_atomic_load_explicit_64(volatile const ma_uint64* ptr, ma_atomic_memory_order order) { - (void)order; - return __sync_fetch_and_add(dst, src); - } - static MA_INLINE ma_uint8 ma_atomic_fetch_sub_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_sub(dst, src); - } - static MA_INLINE ma_uint16 ma_atomic_fetch_sub_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_sub(dst, src); - } - static MA_INLINE ma_uint32 ma_atomic_fetch_sub_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_sub(dst, src); - } - static MA_INLINE ma_uint64 ma_atomic_fetch_sub_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_sub(dst, src); - } - static MA_INLINE ma_uint8 ma_atomic_fetch_or_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_or(dst, src); - } - static MA_INLINE ma_uint16 ma_atomic_fetch_or_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_or(dst, src); - } - static MA_INLINE ma_uint32 ma_atomic_fetch_or_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_or(dst, src); - } - static MA_INLINE ma_uint64 ma_atomic_fetch_or_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_or(dst, src); - } - static MA_INLINE ma_uint8 ma_atomic_fetch_xor_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_xor(dst, src); - } - static MA_INLINE ma_uint16 ma_atomic_fetch_xor_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_xor(dst, src); - } - static MA_INLINE ma_uint32 ma_atomic_fetch_xor_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_xor(dst, src); - } - static MA_INLINE ma_uint64 ma_atomic_fetch_xor_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_xor(dst, src); - } - static MA_INLINE ma_uint8 ma_atomic_fetch_and_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_and(dst, src); - } - static MA_INLINE ma_uint16 ma_atomic_fetch_and_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_and(dst, src); - } - static MA_INLINE ma_uint32 ma_atomic_fetch_and_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_and(dst, src); - } - static MA_INLINE ma_uint64 ma_atomic_fetch_and_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_and(dst, src); - } - #define ma_atomic_compare_and_swap_8( dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #define ma_atomic_compare_and_swap_16(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #define ma_atomic_compare_and_swap_32(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #define ma_atomic_compare_and_swap_64(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #else - #if defined(MA_X86) - #define ma_atomic_thread_fence(order) __asm__ __volatile__("lock; addl $0, (%%esp)" ::: "memory", "cc") - #elif defined(MA_X64) - #define ma_atomic_thread_fence(order) __asm__ __volatile__("lock; addq $0, (%%rsp)" ::: "memory", "cc") - #else - #error Unsupported architecture. Please submit a feature request. - #endif - static MA_INLINE ma_uint8 ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 desired) - { - ma_uint8 result; - #if defined(MA_X86) || defined(MA_X64) - __asm__ __volatile__("lock; cmpxchg %3, %0" : "+m"(*dst), "=a"(result) : "a"(expected), "d"(desired) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static MA_INLINE ma_uint16 ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 desired) - { - ma_uint16 result; - #if defined(MA_X86) || defined(MA_X64) - __asm__ __volatile__("lock; cmpxchg %3, %0" : "+m"(*dst), "=a"(result) : "a"(expected), "d"(desired) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static MA_INLINE ma_uint32 ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 desired) - { - ma_uint32 result; - #if defined(MA_X86) || defined(MA_X64) - __asm__ __volatile__("lock; cmpxchg %3, %0" : "+m"(*dst), "=a"(result) : "a"(expected), "d"(desired) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static MA_INLINE ma_uint64 ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 desired) - { - volatile ma_uint64 result; - #if defined(MA_X86) - ma_uint32 resultEAX; - ma_uint32 resultEDX; - __asm__ __volatile__("push %%ebx; xchg %5, %%ebx; lock; cmpxchg8b %0; pop %%ebx" : "+m"(*dst), "=a"(resultEAX), "=d"(resultEDX) : "a"(expected & 0xFFFFFFFF), "d"(expected >> 32), "r"(desired & 0xFFFFFFFF), "c"(desired >> 32) : "cc"); - result = ((ma_uint64)resultEDX << 32) | resultEAX; - #elif defined(MA_X64) - __asm__ __volatile__("lock; cmpxchg %3, %0" : "+m"(*dst), "=a"(result) : "a"(expected), "d"(desired) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + (void)order; + return ma_atomic_compare_and_swap_64((ma_uint64*)ptr, 0, 0); + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(64, ptr, order); + } + #endif } static MA_INLINE ma_uint8 ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) { - ma_uint8 result = 0; - (void)order; - #if defined(MA_X86) || defined(MA_X64) - __asm__ __volatile__("lock; xchg %1, %0" : "+m"(*dst), "=a"(result) : "a"(src)); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + if (order > ma_atomic_memory_order_acquire) { + __sync_synchronize(); + } + return __sync_lock_test_and_set(dst, src); + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(8, dst, src, order); + } + #endif } static MA_INLINE ma_uint16 ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) { - ma_uint16 result = 0; - (void)order; - #if defined(MA_X86) || defined(MA_X64) - __asm__ __volatile__("lock; xchg %1, %0" : "+m"(*dst), "=a"(result) : "a"(src)); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + if (order > ma_atomic_memory_order_acquire) { + __sync_synchronize(); + } + return __sync_lock_test_and_set(dst, src); + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(16, dst, src, order); + } + #endif } static MA_INLINE ma_uint32 ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) { - ma_uint32 result; - (void)order; - #if defined(MA_X86) || defined(MA_X64) - __asm__ __volatile__("lock; xchg %1, %0" : "+m"(*dst), "=a"(result) : "a"(src)); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + if (order > ma_atomic_memory_order_acquire) { + __sync_synchronize(); + } + return __sync_lock_test_and_set(dst, src); + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(32, dst, src, order); + } + #endif } static MA_INLINE ma_uint64 ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) { - ma_uint64 result; - (void)order; - #if defined(MA_X86) - do { - result = *dst; - } while (ma_atomic_compare_and_swap_64(dst, result, src) != result); - #elif defined(MA_X64) - __asm__ __volatile__("lock; xchg %1, %0" : "+m"(*dst), "=a"(result) : "a"(src)); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + if (order > ma_atomic_memory_order_acquire) { + __sync_synchronize(); + } + return __sync_lock_test_and_set(dst, src); + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(64, dst, src, order); + } + #endif } + #define ma_atomic_store_explicit_8( dst, src, order) (void)ma_atomic_exchange_explicit_8 (dst, src, order) + #define ma_atomic_store_explicit_16(dst, src, order) (void)ma_atomic_exchange_explicit_16(dst, src, order) + #define ma_atomic_store_explicit_32(dst, src, order) (void)ma_atomic_exchange_explicit_32(dst, src, order) + #define ma_atomic_store_explicit_64(dst, src, order) (void)ma_atomic_exchange_explicit_64(dst, src, order) static MA_INLINE ma_uint8 ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) { - ma_uint8 result; - (void)order; - #if defined(MA_X86) || defined(MA_X64) - __asm__ __volatile__("lock; xadd %1, %0" : "+m"(*dst), "=a"(result) : "a"(src) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + (void)order; + return __sync_fetch_and_add(dst, src); + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(8, dst, src, order); + } + #endif } static MA_INLINE ma_uint16 ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) { - ma_uint16 result; - (void)order; - #if defined(MA_X86) || defined(MA_X64) - __asm__ __volatile__("lock; xadd %1, %0" : "+m"(*dst), "=a"(result) : "a"(src) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + (void)order; + return __sync_fetch_and_add(dst, src); + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(16, dst, src, order); + } + #endif } static MA_INLINE ma_uint32 ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) { - ma_uint32 result; - (void)order; - #if defined(MA_X86) || defined(MA_X64) - __asm__ __volatile__("lock; xadd %1, %0" : "+m"(*dst), "=a"(result) : "a"(src) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + (void)order; + return __sync_fetch_and_add(dst, src); + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(32, dst, src, order); + } + #endif } static MA_INLINE ma_uint64 ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) { - #if defined(MA_X86) - ma_uint64 oldValue; - ma_uint64 newValue; - (void)order; - do { - oldValue = *dst; - newValue = oldValue + src; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - return oldValue; - #elif defined(MA_X64) - ma_uint64 result; - (void)order; - __asm__ __volatile__("lock; xadd %1, %0" : "+m"(*dst), "=a"(result) : "a"(src) : "cc"); - return result; - #endif + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + (void)order; + return __sync_fetch_and_add(dst, src); + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(64, dst, src, order); + } + #endif } static MA_INLINE ma_uint8 ma_atomic_fetch_sub_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) { - ma_uint8 oldValue; - ma_uint8 newValue; - do { - oldValue = *dst; - newValue = (ma_uint8)(oldValue - src); - } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + (void)order; + return __sync_fetch_and_sub(dst, src); + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(8, dst, (ma_uint8)(-(ma_int8)src), order); + } + #endif } static MA_INLINE ma_uint16 ma_atomic_fetch_sub_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) { - ma_uint16 oldValue; - ma_uint16 newValue; - do { - oldValue = *dst; - newValue = (ma_uint16)(oldValue - src); - } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + (void)order; + return __sync_fetch_and_sub(dst, src); + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(16, dst, (ma_uint16)(-(ma_int16)src), order); + } + #endif } static MA_INLINE ma_uint32 ma_atomic_fetch_sub_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) { - ma_uint32 oldValue; - ma_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue - src; - } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + (void)order; + return __sync_fetch_and_sub(dst, src); + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(32, dst, (ma_uint32)(-(ma_int32)src), order); + } + #endif } static MA_INLINE ma_uint64 ma_atomic_fetch_sub_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) { - ma_uint64 oldValue; - ma_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue - src; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + (void)order; + return __sync_fetch_and_sub(dst, src); + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(64, dst, (ma_uint64)(-(ma_int64)src), order); + } + #endif } static MA_INLINE ma_uint8 ma_atomic_fetch_and_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) { - ma_uint8 oldValue; - ma_uint8 newValue; - do { - oldValue = *dst; - newValue = (ma_uint8)(oldValue & src); - } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + (void)order; + return __sync_fetch_and_and(dst, src); + } + #else + { + MA_ATOMIC_FETCH_AND_CAS(8, dst, src, order); + } + #endif } static MA_INLINE ma_uint16 ma_atomic_fetch_and_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) { - ma_uint16 oldValue; - ma_uint16 newValue; - do { - oldValue = *dst; - newValue = (ma_uint16)(oldValue & src); - } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + (void)order; + return __sync_fetch_and_and(dst, src); + } + #else + { + MA_ATOMIC_FETCH_AND_CAS(16, dst, src, order); + } + #endif } static MA_INLINE ma_uint32 ma_atomic_fetch_and_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) { - ma_uint32 oldValue; - ma_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue & src; - } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + (void)order; + return __sync_fetch_and_and(dst, src); + } + #else + { + MA_ATOMIC_FETCH_AND_CAS(32, dst, src, order); + } + #endif } static MA_INLINE ma_uint64 ma_atomic_fetch_and_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) { - ma_uint64 oldValue; - ma_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue & src; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static MA_INLINE ma_uint8 ma_atomic_fetch_xor_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) - { - ma_uint8 oldValue; - ma_uint8 newValue; - do { - oldValue = *dst; - newValue = (ma_uint8)(oldValue ^ src); - } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static MA_INLINE ma_uint16 ma_atomic_fetch_xor_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) - { - ma_uint16 oldValue; - ma_uint16 newValue; - do { - oldValue = *dst; - newValue = (ma_uint16)(oldValue ^ src); - } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static MA_INLINE ma_uint32 ma_atomic_fetch_xor_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) - { - ma_uint32 oldValue; - ma_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue ^ src; - } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static MA_INLINE ma_uint64 ma_atomic_fetch_xor_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) - { - ma_uint64 oldValue; - ma_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue ^ src; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + (void)order; + return __sync_fetch_and_and(dst, src); + } + #else + { + MA_ATOMIC_FETCH_AND_CAS(64, dst, src, order); + } + #endif } static MA_INLINE ma_uint8 ma_atomic_fetch_or_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) { - ma_uint8 oldValue; - ma_uint8 newValue; - do { - oldValue = *dst; - newValue = (ma_uint8)(oldValue | src); - } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + (void)order; + return __sync_fetch_and_or(dst, src); + } + #else + { + MA_ATOMIC_FETCH_OR_CAS(8, dst, src, order); + } + #endif } static MA_INLINE ma_uint16 ma_atomic_fetch_or_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) { - ma_uint16 oldValue; - ma_uint16 newValue; - do { - oldValue = *dst; - newValue = (ma_uint16)(oldValue | src); - } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + (void)order; + return __sync_fetch_and_or(dst, src); + } + #else + { + MA_ATOMIC_FETCH_OR_CAS(16, dst, src, order); + } + #endif } static MA_INLINE ma_uint32 ma_atomic_fetch_or_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) { - ma_uint32 oldValue; - ma_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue | src; - } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + (void)order; + return __sync_fetch_and_or(dst, src); + } + #else + { + MA_ATOMIC_FETCH_OR_CAS(32, dst, src, order); + } + #endif } static MA_INLINE ma_uint64 ma_atomic_fetch_or_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) { - ma_uint64 oldValue; - ma_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue | src; - } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + (void)order; + return __sync_fetch_and_or(dst, src); + } + #else + { + MA_ATOMIC_FETCH_OR_CAS(64, dst, src, order); + } + #endif } + static MA_INLINE ma_uint8 ma_atomic_fetch_xor_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) + { + (void)order; + return __sync_fetch_and_xor(dst, src); + } + #else + { + MA_ATOMIC_FETCH_XOR_CAS(8, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint16 ma_atomic_fetch_xor_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) + { + (void)order; + return __sync_fetch_and_xor(dst, src); + } + #else + { + MA_ATOMIC_FETCH_XOR_CAS(16, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint32 ma_atomic_fetch_xor_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) + { + (void)order; + return __sync_fetch_and_xor(dst, src); + } + #else + { + MA_ATOMIC_FETCH_XOR_CAS(32, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint64 ma_atomic_fetch_xor_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) + { + (void)order; + return __sync_fetch_and_xor(dst, src); + } + #else + { + MA_ATOMIC_FETCH_XOR_CAS(64, dst, src, order); + } + #endif + } + #elif defined(MA_ATOMIC_LEGACY_GCC_ASM) + #define MA_ATOMIC_CMPXCHG_GCC_X86(instructionSizeSuffix, result, dst, expected, replacement) \ + __asm__ __volatile__( \ + "lock; cmpxchg"instructionSizeSuffix" %2, %1" \ + : "=a"(result), \ + "=m"(*dst) \ + : "r"(replacement), \ + "0"(expected), \ + "m"(*dst) \ + : "cc", "memory") + #define MA_ATOMIC_XADD_GCC_X86(instructionSizeSuffix, result, dst, src) \ + __asm__ __volatile__( \ + "lock; xadd"instructionSizeSuffix" %0, %1" \ + : "=a"(result), \ + "=m"(*dst) \ + : "0"(src), \ + "m"(*dst) \ + : "cc", "memory") + static MA_INLINE ma_uint8 ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 replacement) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint8 result; + #if defined(MA_X86) || defined(MA_X64) + { + MA_ATOMIC_CMPXCHG_GCC_X86("b", result, dst, expected, replacement); + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(8, dst, expected, replacement); + } + #endif + } + static MA_INLINE ma_uint16 ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 replacement) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint16 result; + #if defined(MA_X86) || defined(MA_X64) + { + MA_ATOMIC_CMPXCHG_GCC_X86("w", result, dst, expected, replacement); + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(16, dst, expected, replacement); + } + #endif + } + static MA_INLINE ma_uint32 ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 replacement) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint32 result; + #if defined(MA_X86) || defined(MA_X64) + { + MA_ATOMIC_CMPXCHG_GCC_X86("l", result, dst, expected, replacement); + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(32, dst, expected, replacement); + } + #endif + } + static MA_INLINE ma_uint64 ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 replacement) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint64 result; + #if defined(MA_X86) + { + ma_uint32 resultEAX; + ma_uint32 resultEDX; + __asm__ __volatile__( + "pushl %%ebx\n" + "movl %4, %%ebx\n" + "lock cmpxchg8b (%%edi)\n" + "popl %%ebx\n" + : "=a"(resultEAX), + "=d"(resultEDX) + : "a"((ma_uint32)(expected & 0xFFFFFFFF)), + "d"((ma_uint32)(expected >> 32)), + "r"((ma_uint32)(replacement & 0xFFFFFFFF)), + "c"((ma_uint32)(replacement >> 32)), + "D"(dst) + : "memory", "cc"); + result = ((ma_uint64)resultEDX << 32) | resultEAX; + } + #elif defined(MA_X64) + { + MA_ATOMIC_CMPXCHG_GCC_X86("q", result, dst, expected, replacement); + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_COMPARE_AND_SWAP_LOCK(64, dst, expected, replacement); + } + #endif + } + static MA_INLINE ma_uint8 ma_atomic_load_explicit_8(volatile const ma_uint8* dst, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint8 result; + #if defined(MA_X86) || defined(MA_X64) + { + if (order == ma_atomic_memory_order_relaxed) { + MA_ATOMIC_LOAD_RELAXED_GCC_X86("b", result, dst); + } else if (order <= ma_atomic_memory_order_release) { + MA_ATOMIC_LOAD_RELEASE_GCC_X86("b", result, dst); + } else { + MA_ATOMIC_LOAD_SEQ_CST_GCC_X86("b", result, dst); + } + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(8, dst, order); + } + #endif + } + static MA_INLINE ma_uint16 ma_atomic_load_explicit_16(volatile const ma_uint16* dst, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint16 result; + #if defined(MA_X86) || defined(MA_X64) + { + if (order == ma_atomic_memory_order_relaxed) { + MA_ATOMIC_LOAD_RELAXED_GCC_X86("w", result, dst); + } else if (order <= ma_atomic_memory_order_release) { + MA_ATOMIC_LOAD_RELEASE_GCC_X86("w", result, dst); + } else { + MA_ATOMIC_LOAD_SEQ_CST_GCC_X86("w", result, dst); + } + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(16, dst, order); + } + #endif + } + static MA_INLINE ma_uint32 ma_atomic_load_explicit_32(volatile const ma_uint32* dst, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint32 result; + #if defined(MA_X86) || defined(MA_X64) + { + if (order == ma_atomic_memory_order_relaxed) { + MA_ATOMIC_LOAD_RELAXED_GCC_X86("l", result, dst); + } else if (order <= ma_atomic_memory_order_release) { + MA_ATOMIC_LOAD_RELEASE_GCC_X86("l", result, dst); + } else { + MA_ATOMIC_LOAD_SEQ_CST_GCC_X86("l", result, dst); + } + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(32, dst, order); + } + #endif + } + static MA_INLINE ma_uint64 ma_atomic_load_explicit_64(volatile const ma_uint64* dst, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint64 result; + #if defined(MA_X64) + { + if (order == ma_atomic_memory_order_relaxed) { + MA_ATOMIC_LOAD_RELAXED_GCC_X86("q", result, dst); + } else if (order <= ma_atomic_memory_order_release) { + MA_ATOMIC_LOAD_RELEASE_GCC_X86("q", result, dst); + } else { + MA_ATOMIC_LOAD_SEQ_CST_GCC_X86("q", result, dst); + } + } + #elif defined(MA_X86) + { + (void)order; + return ma_atomic_compare_and_swap_64((volatile ma_uint64*)dst, 0, 0); + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_LOAD_EXPLICIT_LOCK(64, dst, order); + } + #endif + } + static MA_INLINE ma_uint8 ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint8 result; + (void)order; + #if defined(MA_X86) || defined(MA_X64) + { + MA_ATOMIC_XCHG_GCC_X86("b", result, dst, src); + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(8, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint16 ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint16 result; + (void)order; + #if defined(MA_X86) || defined(MA_X64) + { + MA_ATOMIC_XCHG_GCC_X86("w", result, dst, src); + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(16, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint32 ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint32 result; + (void)order; + #if defined(MA_X86) || defined(MA_X64) + { + MA_ATOMIC_XCHG_GCC_X86("l", result, dst, src); + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(32, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint64 ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) && (defined(MA_X86) || defined(MA_X64)) + { + ma_uint64 result; + (void)order; + #if defined(MA_X86) + { + MA_ATOMIC_EXCHANGE_EXPLICIT_CAS(64, dst, src, order); + } + #elif defined(MA_X64) + { + MA_ATOMIC_XCHG_GCC_X86("q", result, dst, src); + } + #else + { + #error Unsupported architecture. + } + #endif + return result; + } + #else + { + MA_ATOMIC_EXCHANGE_EXPLICIT_LOCK(64, dst, src, order); + } + #endif + } + static MA_INLINE void ma_atomic_store_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) && (defined(MA_X86) || defined(MA_X64)) + { + #if defined(MA_X86) || defined(MA_X64) + { + if (order == ma_atomic_memory_order_relaxed) { + __asm__ __volatile__ ( + "movb %1, %0" + : "=m"(*dst) + : "r"(src) + ); + } else { + __asm__ __volatile__ ( + "xchgb %1, %0" + : "=m"(*dst) + : "r"(src) + : "memory" + ); + } + } + #else + { + #error Unsupported architecture. + } + #endif + } + #else + { + MA_ATOMIC_STORE_EXPLICIT_LOCK(8, dst, src, order); + } + #endif + } + static MA_INLINE void ma_atomic_store_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) && (defined(MA_X86) || defined(MA_X64)) + { + #if defined(MA_X86) || defined(MA_X64) + { + if (order == ma_atomic_memory_order_relaxed) { + __asm__ __volatile__ ( + "movw %1, %0" + : "=m"(*dst) + : "r"(src) + ); + } else { + __asm__ __volatile__ ( + "xchgw %1, %0" + : "=m"(*dst) + : "r"(src) + : "memory" + ); + } + } + #else + { + #error Unsupported architecture. + } + #endif + } + #else + { + MA_ATOMIC_STORE_EXPLICIT_LOCK(16, dst, src, order); + } + #endif + } + static MA_INLINE void ma_atomic_store_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) && (defined(MA_X86) || defined(MA_X64)) + { + #if defined(MA_X86) || defined(MA_X64) + { + if (order == ma_atomic_memory_order_relaxed) { + __asm__ __volatile__ ( + "movl %1, %0" + : "=m"(*dst) + : "r"(src) + ); + } else { + __asm__ __volatile__ ( + "xchgl %1, %0" + : "=m"(*dst) + : "r"(src) + : "memory" + ); + } + } + #else + { + #error Unsupported architecture. + } + #endif + } + #else + { + MA_ATOMIC_STORE_EXPLICIT_LOCK(32, dst, src, order); + } + #endif + } + static MA_INLINE void ma_atomic_store_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) && (defined(MA_X86) || defined(MA_X64)) + { + #if defined(MA_X64) + { + if (order == ma_atomic_memory_order_relaxed) { + __asm__ __volatile__ ( + "movq %1, %0" + : "=m"(*dst) + : "r"(src) + ); + } else { + __asm__ __volatile__ ( + "xchgq %1, %0" + : "=m"(*dst) + : "r"(src) + : "memory" + ); + } + } + #else + { + MA_ATOMIC_STORE_EXPLICIT_CAS(64, dst, src, order); + } + #endif + } + #else + { + MA_ATOMIC_STORE_EXPLICIT_LOCK(64, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint8 ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_8) && (defined(MA_X86) || defined(MA_X64)) + { + #if defined(MA_X86) || defined(MA_X64) + { + ma_uint8 result; + (void)order; + MA_ATOMIC_XADD_GCC_X86("b", result, dst, src); + return result; + } + #else + { + #error Unsupported architecture. + } + #endif + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(8, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint16 ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_16) && (defined(MA_X86) || defined(MA_X64)) + { + #if defined(MA_X86) || defined(MA_X64) + { + ma_uint16 result; + (void)order; + MA_ATOMIC_XADD_GCC_X86("w", result, dst, src); + return result; + } + #else + { + #error Unsupported architecture. + } + #endif + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(16, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint32 ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_32) && (defined(MA_X86) || defined(MA_X64)) + { + #if defined(MA_X86) || defined(MA_X64) + { + ma_uint32 result; + (void)order; + MA_ATOMIC_XADD_GCC_X86("l", result, dst, src); + return result; + } + #else + { + #error Unsupported architecture. + } + #endif + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(32, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint64 ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + #if defined(MA_ATOMIC_IS_LOCK_FREE_64) && (defined(MA_X86) || defined(MA_X64)) + { + #if defined(MA_X86) + { + MA_ATOMIC_FETCH_ADD_CAS(64, dst, src, order); + } + #elif defined(MA_X64) + { + ma_uint64 result; + MA_ATOMIC_XADD_GCC_X86("q", result, dst, src); + (void)order; + return result; + } + #else + { + #error Unsupported architecture. + } + #endif + } + #else + { + MA_ATOMIC_FETCH_ADD_LOCK(64, dst, src, order); + } + #endif + } + static MA_INLINE ma_uint8 ma_atomic_fetch_sub_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + return ma_atomic_fetch_add_explicit_8(dst, (ma_uint8)(-(ma_int8)src), order); + } + static MA_INLINE ma_uint16 ma_atomic_fetch_sub_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + return ma_atomic_fetch_add_explicit_16(dst, (ma_uint16)(-(ma_int16)src), order); + } + static MA_INLINE ma_uint32 ma_atomic_fetch_sub_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + return ma_atomic_fetch_add_explicit_32(dst, (ma_uint32)(-(ma_int32)src), order); + } + static MA_INLINE ma_uint64 ma_atomic_fetch_sub_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + return ma_atomic_fetch_add_explicit_64(dst, (ma_uint64)(-(ma_int64)src), order); + } + static MA_INLINE ma_uint8 ma_atomic_fetch_and_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_AND_CAS(8, dst, src, order); + } + static MA_INLINE ma_uint16 ma_atomic_fetch_and_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_AND_CAS(16, dst, src, order); + } + static MA_INLINE ma_uint32 ma_atomic_fetch_and_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_AND_CAS(32, dst, src, order); + } + static MA_INLINE ma_uint64 ma_atomic_fetch_and_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_AND_CAS(64, dst, src, order); + } + static MA_INLINE ma_uint8 ma_atomic_fetch_or_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_OR_CAS(8, dst, src, order); + } + static MA_INLINE ma_uint16 ma_atomic_fetch_or_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_OR_CAS(16, dst, src, order); + } + static MA_INLINE ma_uint32 ma_atomic_fetch_or_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_OR_CAS(32, dst, src, order); + } + static MA_INLINE ma_uint64 ma_atomic_fetch_or_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_OR_CAS(64, dst, src, order); + } + static MA_INLINE ma_uint8 ma_atomic_fetch_xor_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_XOR_CAS(8, dst, src, order); + } + static MA_INLINE ma_uint16 ma_atomic_fetch_xor_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_XOR_CAS(16, dst, src, order); + } + static MA_INLINE ma_uint32 ma_atomic_fetch_xor_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_XOR_CAS(32, dst, src, order); + } + static MA_INLINE ma_uint64 ma_atomic_fetch_xor_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order) + { + MA_ATOMIC_FETCH_XOR_CAS(64, dst, src, order); + } + #else + #error Unsupported compiler. #endif - #define ma_atomic_signal_fence(order) ma_atomic_thread_fence(order) - static MA_INLINE ma_uint8 ma_atomic_load_explicit_8(volatile const ma_uint8* ptr, ma_atomic_memory_order order) - { - (void)order; - return ma_atomic_compare_and_swap_8((ma_uint8*)ptr, 0, 0); - } - static MA_INLINE ma_uint16 ma_atomic_load_explicit_16(volatile const ma_uint16* ptr, ma_atomic_memory_order order) - { - (void)order; - return ma_atomic_compare_and_swap_16((ma_uint16*)ptr, 0, 0); - } - static MA_INLINE ma_uint32 ma_atomic_load_explicit_32(volatile const ma_uint32* ptr, ma_atomic_memory_order order) - { - (void)order; - return ma_atomic_compare_and_swap_32((ma_uint32*)ptr, 0, 0); - } - static MA_INLINE ma_uint64 ma_atomic_load_explicit_64(volatile const ma_uint64* ptr, ma_atomic_memory_order order) - { - (void)order; - return ma_atomic_compare_and_swap_64((ma_uint64*)ptr, 0, 0); - } - #define ma_atomic_store_explicit_8( dst, src, order) (void)ma_atomic_exchange_explicit_8 (dst, src, order) - #define ma_atomic_store_explicit_16(dst, src, order) (void)ma_atomic_exchange_explicit_16(dst, src, order) - #define ma_atomic_store_explicit_32(dst, src, order) (void)ma_atomic_exchange_explicit_32(dst, src, order) - #define ma_atomic_store_explicit_64(dst, src, order) (void)ma_atomic_exchange_explicit_64(dst, src, order) - #define ma_atomic_test_and_set_explicit_8( dst, order) ma_atomic_exchange_explicit_8 (dst, 1, order) - #define ma_atomic_test_and_set_explicit_16(dst, order) ma_atomic_exchange_explicit_16(dst, 1, order) - #define ma_atomic_test_and_set_explicit_32(dst, order) ma_atomic_exchange_explicit_32(dst, 1, order) - #define ma_atomic_test_and_set_explicit_64(dst, order) ma_atomic_exchange_explicit_64(dst, 1, order) - #define ma_atomic_clear_explicit_8( dst, order) ma_atomic_store_explicit_8 (dst, 0, order) - #define ma_atomic_clear_explicit_16(dst, order) ma_atomic_store_explicit_16(dst, 0, order) - #define ma_atomic_clear_explicit_32(dst, order) ma_atomic_store_explicit_32(dst, 0, order) - #define ma_atomic_clear_explicit_64(dst, order) ma_atomic_store_explicit_64(dst, 0, order) - typedef ma_uint8 ma_atomic_flag; - #define ma_atomic_flag_test_and_set_explicit(ptr, order) (ma_bool32)ma_atomic_test_and_set_explicit_8(ptr, order) - #define ma_atomic_flag_clear_explicit(ptr, order) ma_atomic_clear_explicit_8(ptr, order) - #define ma_atomic_flag_load_explicit(ptr, order) ma_atomic_load_explicit_8(ptr, order) #endif #if !defined(MA_ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE) - #if defined(MA_ATOMIC_HAS_8) - static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_8(volatile ma_uint8* dst, ma_uint8* expected, ma_uint8 desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) - { - ma_uint8 expectedValue; - ma_uint8 result; - (void)successOrder; - (void)failureOrder; - expectedValue = ma_atomic_load_explicit_8(expected, ma_atomic_memory_order_seq_cst); - result = ma_atomic_compare_and_swap_8(dst, expectedValue, desired); - if (result == expectedValue) { - return 1; - } else { - ma_atomic_store_explicit_8(expected, result, failureOrder); - return 0; - } - } - #endif - #if defined(MA_ATOMIC_HAS_16) - static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_16(volatile ma_uint16* dst, ma_uint16* expected, ma_uint16 desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) - { - ma_uint16 expectedValue; - ma_uint16 result; - (void)successOrder; - (void)failureOrder; - expectedValue = ma_atomic_load_explicit_16(expected, ma_atomic_memory_order_seq_cst); - result = ma_atomic_compare_and_swap_16(dst, expectedValue, desired); - if (result == expectedValue) { - return 1; - } else { - ma_atomic_store_explicit_16(expected, result, failureOrder); - return 0; - } - } - #endif - #if defined(MA_ATOMIC_HAS_32) - static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_32(volatile ma_uint32* dst, ma_uint32* expected, ma_uint32 desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) - { - ma_uint32 expectedValue; - ma_uint32 result; - (void)successOrder; - (void)failureOrder; - expectedValue = ma_atomic_load_explicit_32(expected, ma_atomic_memory_order_seq_cst); - result = ma_atomic_compare_and_swap_32(dst, expectedValue, desired); - if (result == expectedValue) { - return 1; - } else { - ma_atomic_store_explicit_32(expected, result, failureOrder); - return 0; - } - } - #endif - #if defined(MA_ATOMIC_HAS_64) - static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_64(volatile ma_uint64* dst, volatile ma_uint64* expected, ma_uint64 desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) - { - ma_uint64 expectedValue; - ma_uint64 result; - (void)successOrder; - (void)failureOrder; - expectedValue = ma_atomic_load_explicit_64(expected, ma_atomic_memory_order_seq_cst); - result = ma_atomic_compare_and_swap_64(dst, expectedValue, desired); - if (result == expectedValue) { - return 1; - } else { - ma_atomic_store_explicit_64(expected, result, failureOrder); - return 0; - } - } - #endif - #define ma_atomic_compare_exchange_weak_explicit_8( dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_8 (dst, expected, desired, successOrder, failureOrder) - #define ma_atomic_compare_exchange_weak_explicit_16(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_16(dst, expected, desired, successOrder, failureOrder) - #define ma_atomic_compare_exchange_weak_explicit_32(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_32(dst, expected, desired, successOrder, failureOrder) - #define ma_atomic_compare_exchange_weak_explicit_64(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_64(dst, expected, desired, successOrder, failureOrder) -#endif -#if !defined(MA_ATOMIC_HAS_NATIVE_IS_LOCK_FREE) - static MA_INLINE ma_bool32 ma_atomic_is_lock_free_8(volatile void* ptr) + static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_8(volatile ma_uint8* dst, ma_uint8* expected, ma_uint8 replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) { - (void)ptr; - return 1; - } - static MA_INLINE ma_bool32 ma_atomic_is_lock_free_16(volatile void* ptr) - { - (void)ptr; - return 1; - } - static MA_INLINE ma_bool32 ma_atomic_is_lock_free_32(volatile void* ptr) - { - (void)ptr; - return 1; - } - static MA_INLINE ma_bool32 ma_atomic_is_lock_free_64(volatile void* ptr) - { - (void)ptr; - #if defined(MA_64BIT) - return 1; - #else - #if defined(MA_X86) || defined(MA_X64) + ma_uint8 result; + (void)successOrder; + (void)failureOrder; + result = ma_atomic_compare_and_swap_8(dst, *expected, replacement); + if (result == *expected) { return 1; - #else + } else { + *expected = result; return 0; - #endif - #endif + } } + static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_16(volatile ma_uint16* dst, ma_uint16* expected, ma_uint16 replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) + { + ma_uint16 result; + (void)successOrder; + (void)failureOrder; + result = ma_atomic_compare_and_swap_16(dst, *expected, replacement); + if (result == *expected) { + return 1; + } else { + *expected = result; + return 0; + } + } + static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_32(volatile ma_uint32* dst, ma_uint32* expected, ma_uint32 replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) + { + ma_uint32 result; + (void)successOrder; + (void)failureOrder; + result = ma_atomic_compare_and_swap_32(dst, *expected, replacement); + if (result == *expected) { + return 1; + } else { + *expected = result; + return 0; + } + } + static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_64(volatile ma_uint64* dst, volatile ma_uint64* expected, ma_uint64 replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) + { + ma_uint64 result; + (void)successOrder; + (void)failureOrder; + result = ma_atomic_compare_and_swap_64(dst, *expected, replacement); + if (result == *expected) { + return 1; + } else { + *expected = result; + return 0; + } + } + #define ma_atomic_compare_exchange_weak_explicit_8( dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_8 (dst, expected, replacement, successOrder, failureOrder) + #define ma_atomic_compare_exchange_weak_explicit_16(dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_16(dst, expected, replacement, successOrder, failureOrder) + #define ma_atomic_compare_exchange_weak_explicit_32(dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_32(dst, expected, replacement, successOrder, failureOrder) + #define ma_atomic_compare_exchange_weak_explicit_64(dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_64(dst, expected, replacement, successOrder, failureOrder) #endif #if defined(MA_64BIT) static MA_INLINE ma_bool32 ma_atomic_is_lock_free_ptr(volatile void** ptr) @@ -15561,17 +17005,17 @@ typedef int ma_atomic_memory_order; { return (void*)ma_atomic_exchange_explicit_64((volatile ma_uint64*)dst, (ma_uint64)src, order); } - static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_ptr(volatile void** dst, void** expected, void* desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) + static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_ptr(volatile void** dst, void** expected, void* replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) { - return ma_atomic_compare_exchange_strong_explicit_64((volatile ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)desired, successOrder, failureOrder); + return ma_atomic_compare_exchange_strong_explicit_64((volatile ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)replacement, successOrder, failureOrder); } - static MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_ptr(volatile void** dst, void** expected, void* desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) + static MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_ptr(volatile void** dst, void** expected, void* replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) { - return ma_atomic_compare_exchange_weak_explicit_64((volatile ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)desired, successOrder, failureOrder); + return ma_atomic_compare_exchange_weak_explicit_64((volatile ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)replacement, successOrder, failureOrder); } - static MA_INLINE void* ma_atomic_compare_and_swap_ptr(volatile void** dst, void* expected, void* desired) + static MA_INLINE void* ma_atomic_compare_and_swap_ptr(volatile void** dst, void* expected, void* replacement) { - return (void*)ma_atomic_compare_and_swap_64((volatile ma_uint64*)dst, (ma_uint64)expected, (ma_uint64)desired); + return (void*)ma_atomic_compare_and_swap_64((volatile ma_uint64*)dst, (ma_uint64)expected, (ma_uint64)replacement); } #elif defined(MA_32BIT) static MA_INLINE ma_bool32 ma_atomic_is_lock_free_ptr(volatile void** ptr) @@ -15590,36 +17034,26 @@ typedef int ma_atomic_memory_order; { return (void*)ma_atomic_exchange_explicit_32((volatile ma_uint32*)dst, (ma_uint32)src, order); } - static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_ptr(volatile void** dst, void** expected, void* desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) + static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_ptr(volatile void** dst, void** expected, void* replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) { - return ma_atomic_compare_exchange_strong_explicit_32((volatile ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)desired, successOrder, failureOrder); + return ma_atomic_compare_exchange_strong_explicit_32((volatile ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)replacement, successOrder, failureOrder); } - static MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_ptr(volatile void** dst, void** expected, void* desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) + static MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_ptr(volatile void** dst, void** expected, void* replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) { - return ma_atomic_compare_exchange_weak_explicit_32((volatile ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)desired, successOrder, failureOrder); + return ma_atomic_compare_exchange_weak_explicit_32((volatile ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)replacement, successOrder, failureOrder); } - static MA_INLINE void* ma_atomic_compare_and_swap_ptr(volatile void** dst, void* expected, void* desired) + static MA_INLINE void* ma_atomic_compare_and_swap_ptr(volatile void** dst, void* expected, void* replacement) { - return (void*)ma_atomic_compare_and_swap_32((volatile ma_uint32*)dst, (ma_uint32)expected, (ma_uint32)desired); + return (void*)ma_atomic_compare_and_swap_32((volatile ma_uint32*)dst, (ma_uint32)expected, (ma_uint32)replacement); } #else #error Unsupported architecture. #endif -#define ma_atomic_flag_test_and_set(ptr) ma_atomic_flag_test_and_set_explicit(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_flag_clear(ptr) ma_atomic_flag_clear_explicit(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_store_ptr(dst, src) ma_atomic_store_explicit_ptr((volatile void**)dst, (void*)src, ma_atomic_memory_order_seq_cst) -#define ma_atomic_load_ptr(ptr) ma_atomic_load_explicit_ptr((volatile void**)ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_exchange_ptr(dst, src) ma_atomic_exchange_explicit_ptr((volatile void**)dst, (void*)src, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_ptr(dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_ptr((volatile void**)dst, (void**)expected, (void*)desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_ptr(dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_ptr((volatile void**)dst, (void**)expected, (void*)desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_test_and_set_8( ptr) ma_atomic_test_and_set_explicit_8( ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_test_and_set_16(ptr) ma_atomic_test_and_set_explicit_16(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_test_and_set_32(ptr) ma_atomic_test_and_set_explicit_32(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_test_and_set_64(ptr) ma_atomic_test_and_set_explicit_64(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_clear_8( ptr) ma_atomic_clear_explicit_8( ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_clear_16(ptr) ma_atomic_clear_explicit_16(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_clear_32(ptr) ma_atomic_clear_explicit_32(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_clear_64(ptr) ma_atomic_clear_explicit_64(ptr, ma_atomic_memory_order_seq_cst) +#define ma_atomic_store_ptr(dst, src) ma_atomic_store_explicit_ptr((volatile void**)dst, (void*)src, ma_atomic_memory_order_seq_cst) +#define ma_atomic_load_ptr(ptr) ma_atomic_load_explicit_ptr((volatile void**)ptr, ma_atomic_memory_order_seq_cst) +#define ma_atomic_exchange_ptr(dst, src) ma_atomic_exchange_explicit_ptr((volatile void**)dst, (void*)src, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_ptr(dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_ptr((volatile void**)dst, (void**)expected, (void*)replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_ptr(dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_ptr((volatile void**)dst, (void**)expected, (void*)replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) #define ma_atomic_store_8( dst, src) ma_atomic_store_explicit_8( dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_store_16(dst, src) ma_atomic_store_explicit_16(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_store_32(dst, src) ma_atomic_store_explicit_32(dst, src, ma_atomic_memory_order_seq_cst) @@ -15632,14 +17066,14 @@ typedef int ma_atomic_memory_order; #define ma_atomic_exchange_16(dst, src) ma_atomic_exchange_explicit_16(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_exchange_32(dst, src) ma_atomic_exchange_explicit_32(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_exchange_64(dst, src) ma_atomic_exchange_explicit_64(dst, src, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_8( dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_8( dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_16(dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_16(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_32(dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_64(dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_8( dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_8( dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_16( dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_16(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_32( dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_64( dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_8( dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_8( dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_16(dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_16(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_32(dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_32(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_64(dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_64(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_8( dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_8( dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_16( dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_16(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_32( dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_32(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_64( dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_64(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_add_8( dst, src) ma_atomic_fetch_add_explicit_8( dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_add_16(dst, src) ma_atomic_fetch_add_explicit_16(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_add_32(dst, src) ma_atomic_fetch_add_explicit_32(dst, src, ma_atomic_memory_order_seq_cst) @@ -15660,14 +17094,6 @@ typedef int ma_atomic_memory_order; #define ma_atomic_fetch_and_16(dst, src) ma_atomic_fetch_and_explicit_16(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_and_32(dst, src) ma_atomic_fetch_and_explicit_32(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_and_64(dst, src) ma_atomic_fetch_and_explicit_64(dst, src, ma_atomic_memory_order_seq_cst) -#define ma_atomic_test_and_set_explicit_i8( ptr, order) (ma_int8 )ma_atomic_test_and_set_explicit_8( (ma_uint8* )ptr, order) -#define ma_atomic_test_and_set_explicit_i16(ptr, order) (ma_int16)ma_atomic_test_and_set_explicit_16((ma_uint16*)ptr, order) -#define ma_atomic_test_and_set_explicit_i32(ptr, order) (ma_int32)ma_atomic_test_and_set_explicit_32((ma_uint32*)ptr, order) -#define ma_atomic_test_and_set_explicit_i64(ptr, order) (ma_int64)ma_atomic_test_and_set_explicit_64((ma_uint64*)ptr, order) -#define ma_atomic_clear_explicit_i8( ptr, order) ma_atomic_clear_explicit_8( (ma_uint8* )ptr, order) -#define ma_atomic_clear_explicit_i16(ptr, order) ma_atomic_clear_explicit_16((ma_uint16*)ptr, order) -#define ma_atomic_clear_explicit_i32(ptr, order) ma_atomic_clear_explicit_32((ma_uint32*)ptr, order) -#define ma_atomic_clear_explicit_i64(ptr, order) ma_atomic_clear_explicit_64((ma_uint64*)ptr, order) #define ma_atomic_store_explicit_i8( dst, src, order) ma_atomic_store_explicit_8( (ma_uint8* )dst, (ma_uint8 )src, order) #define ma_atomic_store_explicit_i16(dst, src, order) ma_atomic_store_explicit_16((ma_uint16*)dst, (ma_uint16)src, order) #define ma_atomic_store_explicit_i32(dst, src, order) ma_atomic_store_explicit_32((ma_uint32*)dst, (ma_uint32)src, order) @@ -15680,14 +17106,14 @@ typedef int ma_atomic_memory_order; #define ma_atomic_exchange_explicit_i16(dst, src, order) (ma_int16)ma_atomic_exchange_explicit_16((ma_uint16*)dst, (ma_uint16)src, order) #define ma_atomic_exchange_explicit_i32(dst, src, order) (ma_int32)ma_atomic_exchange_explicit_32((ma_uint32*)dst, (ma_uint32)src, order) #define ma_atomic_exchange_explicit_i64(dst, src, order) (ma_int64)ma_atomic_exchange_explicit_64((ma_uint64*)dst, (ma_uint64)src, order) -#define ma_atomic_compare_exchange_strong_explicit_i8( dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_8( (ma_uint8* )dst, (ma_uint8* )expected, (ma_uint8 )desired, successOrder, failureOrder) -#define ma_atomic_compare_exchange_strong_explicit_i16(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_16((ma_uint16*)dst, (ma_uint16*)expected, (ma_uint16)desired, successOrder, failureOrder) -#define ma_atomic_compare_exchange_strong_explicit_i32(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_32((ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)desired, successOrder, failureOrder) -#define ma_atomic_compare_exchange_strong_explicit_i64(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_64((ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)desired, successOrder, failureOrder) -#define ma_atomic_compare_exchange_weak_explicit_i8( dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_weak_explicit_8( (ma_uint8* )dst, (ma_uint8* )expected, (ma_uint8 )desired, successOrder, failureOrder) -#define ma_atomic_compare_exchange_weak_explicit_i16(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_weak_explicit_16((ma_uint16*)dst, (ma_uint16*)expected, (ma_uint16)desired, successOrder, failureOrder) -#define ma_atomic_compare_exchange_weak_explicit_i32(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_weak_explicit_32((ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)desired, successOrder, failureOrder) -#define ma_atomic_compare_exchange_weak_explicit_i64(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_weak_explicit_64((ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)desired, successOrder, failureOrder) +#define ma_atomic_compare_exchange_strong_explicit_i8( dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_8( (ma_uint8* )dst, (ma_uint8* )expected, (ma_uint8 )replacement, successOrder, failureOrder) +#define ma_atomic_compare_exchange_strong_explicit_i16(dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_16((ma_uint16*)dst, (ma_uint16*)expected, (ma_uint16)replacement, successOrder, failureOrder) +#define ma_atomic_compare_exchange_strong_explicit_i32(dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_32((ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)replacement, successOrder, failureOrder) +#define ma_atomic_compare_exchange_strong_explicit_i64(dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_64((ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)replacement, successOrder, failureOrder) +#define ma_atomic_compare_exchange_weak_explicit_i8( dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_weak_explicit_8( (ma_uint8* )dst, (ma_uint8* )expected, (ma_uint8 )replacement, successOrder, failureOrder) +#define ma_atomic_compare_exchange_weak_explicit_i16(dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_weak_explicit_16((ma_uint16*)dst, (ma_uint16*)expected, (ma_uint16)replacement, successOrder, failureOrder) +#define ma_atomic_compare_exchange_weak_explicit_i32(dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_weak_explicit_32((ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)replacement, successOrder, failureOrder) +#define ma_atomic_compare_exchange_weak_explicit_i64(dst, expected, replacement, successOrder, failureOrder) ma_atomic_compare_exchange_weak_explicit_64((ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)replacement, successOrder, failureOrder) #define ma_atomic_fetch_add_explicit_i8( dst, src, order) (ma_int8 )ma_atomic_fetch_add_explicit_8( (ma_uint8* )dst, (ma_uint8 )src, order) #define ma_atomic_fetch_add_explicit_i16(dst, src, order) (ma_int16)ma_atomic_fetch_add_explicit_16((ma_uint16*)dst, (ma_uint16)src, order) #define ma_atomic_fetch_add_explicit_i32(dst, src, order) (ma_int32)ma_atomic_fetch_add_explicit_32((ma_uint32*)dst, (ma_uint32)src, order) @@ -15708,14 +17134,6 @@ typedef int ma_atomic_memory_order; #define ma_atomic_fetch_and_explicit_i16(dst, src, order) (ma_int16)ma_atomic_fetch_and_explicit_16((ma_uint16*)dst, (ma_uint16)src, order) #define ma_atomic_fetch_and_explicit_i32(dst, src, order) (ma_int32)ma_atomic_fetch_and_explicit_32((ma_uint32*)dst, (ma_uint32)src, order) #define ma_atomic_fetch_and_explicit_i64(dst, src, order) (ma_int64)ma_atomic_fetch_and_explicit_64((ma_uint64*)dst, (ma_uint64)src, order) -#define ma_atomic_test_and_set_i8( ptr) ma_atomic_test_and_set_explicit_i8( ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_test_and_set_i16(ptr) ma_atomic_test_and_set_explicit_i16(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_test_and_set_i32(ptr) ma_atomic_test_and_set_explicit_i32(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_test_and_set_i64(ptr) ma_atomic_test_and_set_explicit_i64(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_clear_i8( ptr) ma_atomic_clear_explicit_i8( ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_clear_i16(ptr) ma_atomic_clear_explicit_i16(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_clear_i32(ptr) ma_atomic_clear_explicit_i32(ptr, ma_atomic_memory_order_seq_cst) -#define ma_atomic_clear_i64(ptr) ma_atomic_clear_explicit_i64(ptr, ma_atomic_memory_order_seq_cst) #define ma_atomic_store_i8( dst, src) ma_atomic_store_explicit_i8( dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_store_i16(dst, src) ma_atomic_store_explicit_i16(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_store_i32(dst, src) ma_atomic_store_explicit_i32(dst, src, ma_atomic_memory_order_seq_cst) @@ -15728,14 +17146,14 @@ typedef int ma_atomic_memory_order; #define ma_atomic_exchange_i16(dst, src) ma_atomic_exchange_explicit_i16(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_exchange_i32(dst, src) ma_atomic_exchange_explicit_i32(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_exchange_i64(dst, src) ma_atomic_exchange_explicit_i64(dst, src, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_i8( dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_i8( dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_i16(dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_i16(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_i32(dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_i32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_i64(dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_i64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_i8( dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_i8( dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_i16(dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_i16(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_i32(dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_i32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_i64(dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_i64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_i8( dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_i8( dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_i16(dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_i16(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_i32(dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_i32(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_i64(dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_i64(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_i8( dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_i8( dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_i16(dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_i16(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_i32(dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_i32(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_i64(dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_i64(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_add_i8( dst, src) ma_atomic_fetch_add_explicit_i8( dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_add_i16(dst, src) ma_atomic_fetch_add_explicit_i16(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_add_i32(dst, src) ma_atomic_fetch_add_explicit_i32(dst, src, ma_atomic_memory_order_seq_cst) @@ -15812,28 +17230,28 @@ static MA_INLINE double ma_atomic_exchange_explicit_f64(volatile double* dst, do r.i = ma_atomic_exchange_explicit_64((volatile ma_uint64*)dst, x.i, order); return r.f; } -static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_f32(volatile float* dst, float* expected, float desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) +static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_f32(volatile float* dst, float* expected, float replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) { ma_atomic_if32 d; - d.f = desired; + d.f = replacement; return ma_atomic_compare_exchange_strong_explicit_32((volatile ma_uint32*)dst, (ma_uint32*)expected, d.i, successOrder, failureOrder); } -static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_f64(volatile double* dst, double* expected, double desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) +static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_f64(volatile double* dst, double* expected, double replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) { ma_atomic_if64 d; - d.f = desired; + d.f = replacement; return ma_atomic_compare_exchange_strong_explicit_64((volatile ma_uint64*)dst, (ma_uint64*)expected, d.i, successOrder, failureOrder); } -static MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_f32(volatile float* dst, float* expected, float desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) +static MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_f32(volatile float* dst, float* expected, float replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) { ma_atomic_if32 d; - d.f = desired; + d.f = replacement; return ma_atomic_compare_exchange_weak_explicit_32((volatile ma_uint32*)dst, (ma_uint32*)expected, d.i, successOrder, failureOrder); } -static MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_f64(volatile double* dst, double* expected, double desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) +static MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_f64(volatile double* dst, double* expected, double replacement, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder) { ma_atomic_if64 d; - d.f = desired; + d.f = replacement; return ma_atomic_compare_exchange_weak_explicit_64((volatile ma_uint64*)dst, (ma_uint64*)expected, d.i, successOrder, failureOrder); } static MA_INLINE float ma_atomic_fetch_add_explicit_f32(volatile float* dst, float src, ma_atomic_memory_order order) @@ -15924,10 +17342,10 @@ static MA_INLINE double ma_atomic_fetch_and_explicit_f64(volatile double* dst, d #define ma_atomic_load_f64(ptr) (double)ma_atomic_load_explicit_f64(ptr, ma_atomic_memory_order_seq_cst) #define ma_atomic_exchange_f32(dst, src) (float )ma_atomic_exchange_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_exchange_f64(dst, src) (double)ma_atomic_exchange_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_f32(dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_f32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_strong_f64(dst, expected, desired) ma_atomic_compare_exchange_strong_explicit_f64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_f32(dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_f32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) -#define ma_atomic_compare_exchange_weak_f64(dst, expected, desired) ma_atomic_compare_exchange_weak_explicit_f64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_f32(dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_f32(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_strong_f64(dst, expected, replacement) ma_atomic_compare_exchange_strong_explicit_f64(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_f32(dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_f32(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) +#define ma_atomic_compare_exchange_weak_f64(dst, expected, replacement) ma_atomic_compare_exchange_weak_explicit_f64(dst, expected, replacement, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_add_f32(dst, src) ma_atomic_fetch_add_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_add_f64(dst, src) ma_atomic_fetch_add_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_sub_f32(dst, src) ma_atomic_fetch_sub_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst) @@ -15938,39 +17356,24 @@ static MA_INLINE double ma_atomic_fetch_and_explicit_f64(volatile double* dst, d #define ma_atomic_fetch_xor_f64(dst, src) ma_atomic_fetch_xor_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_and_f32(dst, src) ma_atomic_fetch_and_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst) #define ma_atomic_fetch_and_f64(dst, src) ma_atomic_fetch_and_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst) -static MA_INLINE float ma_atomic_compare_and_swap_f32(volatile float* dst, float expected, float desired) +static MA_INLINE float ma_atomic_compare_and_swap_f32(volatile float* dst, float expected, float replacement) { ma_atomic_if32 r; ma_atomic_if32 e, d; e.f = expected; - d.f = desired; + d.f = replacement; r.i = ma_atomic_compare_and_swap_32((volatile ma_uint32*)dst, e.i, d.i); return r.f; } -static MA_INLINE double ma_atomic_compare_and_swap_f64(volatile double* dst, double expected, double desired) +static MA_INLINE double ma_atomic_compare_and_swap_f64(volatile double* dst, double expected, double replacement) { ma_atomic_if64 r; ma_atomic_if64 e, d; e.f = expected; - d.f = desired; + d.f = replacement; r.i = ma_atomic_compare_and_swap_64((volatile ma_uint64*)dst, e.i, d.i); return r.f; } -typedef ma_atomic_flag ma_atomic_spinlock; -static MA_INLINE void ma_atomic_spinlock_lock(volatile ma_atomic_spinlock* pSpinlock) -{ - for (;;) { - if (ma_atomic_flag_test_and_set_explicit(pSpinlock, ma_atomic_memory_order_acquire) == 0) { - break; - } - while (ma_atomic_flag_load_explicit(pSpinlock, ma_atomic_memory_order_relaxed) == 1) { - } - } -} -static MA_INLINE void ma_atomic_spinlock_unlock(volatile ma_atomic_spinlock* pSpinlock) -{ - ma_atomic_flag_clear_explicit(pSpinlock, ma_atomic_memory_order_release); -} #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) #pragma GCC diagnostic pop #endif @@ -16176,7 +17579,7 @@ static ma_result ma_thread_create__posix(ma_thread* pThread, ma_thread_priority int result; pthread_attr_t* pAttr = NULL; -#if !defined(__EMSCRIPTEN__) && !defined(__3DS__) +#if !defined(MA_EMSCRIPTEN) && !defined(MA_3DS) && !defined(MA_SWITCH) /* Try setting the thread priority. It's not critical if anything fails here. */ pthread_attr_t attr; if (pthread_attr_init(&attr) == 0) { @@ -16208,9 +17611,18 @@ static ma_result ma_thread_create__posix(ma_thread* pThread, ma_thread_priority } #endif - if (stackSize > 0) { - pthread_attr_setstacksize(&attr, stackSize); + #if defined(_POSIX_THREAD_ATTR_STACKSIZE) && _POSIX_THREAD_ATTR_STACKSIZE >= 0 + { + if (stackSize > 0) { + pthread_attr_setstacksize(&attr, stackSize); + } } + #else + { + (void)stackSize; /* Suppress unused parameter warning. */ + } + #endif + if (scheduler != -1) { int priorityMin = sched_get_priority_min(scheduler); @@ -16218,7 +17630,7 @@ static ma_result ma_thread_create__posix(ma_thread* pThread, ma_thread_priority int priorityStep = (priorityMax - priorityMin) / 7; /* 7 = number of priorities supported by miniaudio. */ struct sched_param sched; - if (pthread_attr_getschedparam(&attr, &sched) == 0) { + if (priorityMin != -1 && priorityMax != -1 && pthread_attr_getschedparam(&attr, &sched) == 0) { if (priority == ma_thread_priority_idle) { sched.sched_priority = priorityMin; } else if (priority == ma_thread_priority_realtime) { @@ -16267,6 +17679,21 @@ static ma_result ma_thread_create__posix(ma_thread* pThread, ma_thread_priority } if (result != 0) { + /* + There have been reports that attempting to create a realtime thread can sometimes fail. In this case, + fall back to a normal priority thread. + + I'm including a compile-time option here to disable this functionality for those who have a hard + requirement on realtime threads and would rather an explicit failure. + */ + #ifndef MA_NO_PTHREAD_REALTIME_PRIORITY_FALLBACK + { + if(result == EPERM && priority == ma_thread_priority_realtime) { + return ma_thread_create__posix(pThread, ma_thread_priority_normal, stackSize, entryProc, pData); + } + } + #endif + return ma_result_from_errno(result); } @@ -16538,7 +17965,7 @@ static ma_result ma_event_signal__win32(ma_event* pEvent) static ma_result ma_semaphore_init__win32(int initialValue, ma_semaphore* pSemaphore) { - *pSemaphore = CreateSemaphoreW(NULL, (LONG)initialValue, LONG_MAX, NULL); + *pSemaphore = CreateSemaphore(NULL, (LONG)initialValue, LONG_MAX, NULL); if (*pSemaphore == NULL) { return ma_result_from_GetLastError(GetLastError()); } @@ -17432,10 +18859,12 @@ static MA_INLINE ma_uint16 ma_job_extract_slot(ma_uint64 toc) return (ma_uint16)(toc & 0x0000FFFF); } +#if 0 /* Currently unused, but might make use of this later. */ static MA_INLINE ma_uint16 ma_job_extract_code(ma_uint64 toc) { return (ma_uint16)((toc & 0xFFFF0000) >> 16); } +#endif static MA_INLINE ma_uint64 ma_job_toc_to_allocation(ma_uint64 toc) { @@ -17900,6 +19329,13 @@ MA_API ma_result ma_job_queue_next(ma_job_queue* pQueue, ma_job* pJob) Dynamic Linking *******************************************************************************/ +/* Disable run-time linking on certain backends and platforms. */ +#ifndef MA_NO_RUNTIME_LINKING + #if defined(MA_EMSCRIPTEN) || defined(MA_ORBIS) || defined(MA_PROSPERO) || defined(MA_SWITCH) || defined(MA_DOS) + #define MA_NO_RUNTIME_LINKING + #endif +#endif + #ifdef MA_POSIX /* No need for dlfcn.h if we're not using runtime linking. */ #ifndef MA_NO_RUNTIME_LINKING @@ -17909,104 +19345,124 @@ Dynamic Linking MA_API ma_handle ma_dlopen(ma_log* pLog, const char* filename) { -#ifndef MA_NO_RUNTIME_LINKING - ma_handle handle; + #ifndef MA_NO_RUNTIME_LINKING + { + ma_handle handle; - ma_log_postf(pLog, MA_LOG_LEVEL_DEBUG, "Loading library: %s\n", filename); + ma_log_postf(pLog, MA_LOG_LEVEL_DEBUG, "Loading library: %s\n", filename); - #ifdef MA_WIN32 - /* From MSDN: Desktop applications cannot use LoadPackagedLibrary; if a desktop application calls this function it fails with APPMODEL_ERROR_NO_PACKAGE.*/ - #if !defined(MA_WIN32_UWP) || !(defined(WINAPI_FAMILY) && ((defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP))) - handle = (ma_handle)LoadLibraryA(filename); + #ifdef MA_WIN32 + /* From MSDN: Desktop applications cannot use LoadPackagedLibrary; if a desktop application calls this function it fails with APPMODEL_ERROR_NO_PACKAGE.*/ + #if !defined(MA_WIN32_UWP) || !(defined(WINAPI_FAMILY) && ((defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP))) + handle = (ma_handle)LoadLibraryA(filename); + #else + /* *sigh* It appears there is no ANSI version of LoadPackagedLibrary()... */ + WCHAR filenameW[4096]; + if (MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, sizeof(filenameW)) == 0) { + handle = NULL; + } else { + handle = (ma_handle)LoadPackagedLibrary(filenameW, 0); + } + #endif #else - /* *sigh* It appears there is no ANSI version of LoadPackagedLibrary()... */ - WCHAR filenameW[4096]; - if (MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, sizeof(filenameW)) == 0) { - handle = NULL; - } else { - handle = (ma_handle)LoadPackagedLibrary(filenameW, 0); - } + handle = (ma_handle)dlopen(filename, RTLD_NOW); #endif - #else - handle = (ma_handle)dlopen(filename, RTLD_NOW); - #endif - /* - I'm not considering failure to load a library an error nor a warning because seamlessly falling through to a lower-priority - backend is a deliberate design choice. Instead I'm logging it as an informational message. - */ - if (handle == NULL) { - ma_log_postf(pLog, MA_LOG_LEVEL_INFO, "Failed to load library: %s\n", filename); + /* + I'm not considering failure to load a library an error nor a warning because seamlessly falling through to a lower-priority + backend is a deliberate design choice. Instead I'm logging it as an informational message. + */ + if (handle == NULL) { + ma_log_postf(pLog, MA_LOG_LEVEL_INFO, "Failed to load library: %s\n", filename); + } + + return handle; } - - return handle; -#else - /* Runtime linking is disabled. */ - (void)pLog; - (void)filename; - return NULL; -#endif + #else + { + /* Runtime linking is disabled. */ + (void)pLog; + (void)filename; + return NULL; + } + #endif } MA_API void ma_dlclose(ma_log* pLog, ma_handle handle) { -#ifndef MA_NO_RUNTIME_LINKING - #ifdef MA_WIN32 - FreeLibrary((HMODULE)handle); - #else - /* Hack for Android bug (see https://github.com/android/ndk/issues/360). Calling dlclose() pre-API 28 may segfault. */ - #if !defined(MA_ANDROID) || (defined(__ANDROID_API__) && __ANDROID_API__ >= 28) + #ifndef MA_NO_RUNTIME_LINKING + { + #ifdef MA_WIN32 { - dlclose((void*)handle); + FreeLibrary((HMODULE)handle); } #else { - (void)handle; + /* Hack for Android bug (see https://github.com/android/ndk/issues/360). Calling dlclose() pre-API 28 may segfault. */ + #if !defined(MA_ANDROID) || (defined(__ANDROID_API__) && __ANDROID_API__ >= 28) + { + dlclose((void*)handle); + } + #else + { + (void)handle; + } + #endif } #endif - #endif - (void)pLog; -#else - /* Runtime linking is disabled. */ - (void)pLog; - (void)handle; -#endif + (void)pLog; + } + #else + { + /* Runtime linking is disabled. */ + (void)pLog; + (void)handle; + } + #endif } MA_API ma_proc ma_dlsym(ma_log* pLog, ma_handle handle, const char* symbol) { -#ifndef MA_NO_RUNTIME_LINKING - ma_proc proc; + #ifndef MA_NO_RUNTIME_LINKING + { + ma_proc proc; - ma_log_postf(pLog, MA_LOG_LEVEL_DEBUG, "Loading symbol: %s\n", symbol); + ma_log_postf(pLog, MA_LOG_LEVEL_DEBUG, "Loading symbol: %s\n", symbol); -#ifdef _WIN32 - proc = (ma_proc)GetProcAddress((HMODULE)handle, symbol); -#else -#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || defined(__clang__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpedantic" -#endif - proc = (ma_proc)dlsym((void*)handle, symbol); -#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || defined(__clang__) - #pragma GCC diagnostic pop -#endif -#endif + #ifdef _WIN32 + { + proc = (ma_proc)GetProcAddress((HMODULE)handle, symbol); + } + #else + { + #if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpedantic" + #endif + proc = (ma_proc)dlsym((void*)handle, symbol); + #if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || defined(__clang__) + #pragma GCC diagnostic pop + #endif + } + #endif - if (proc == NULL) { - ma_log_postf(pLog, MA_LOG_LEVEL_WARNING, "Failed to load symbol: %s\n", symbol); + if (proc == NULL) { + ma_log_postf(pLog, MA_LOG_LEVEL_WARNING, "Failed to load symbol: %s\n", symbol); + } + + (void)pLog; /* It's possible for pContext to be unused. */ + return proc; } - - (void)pLog; /* It's possible for pContext to be unused. */ - return proc; -#else - /* Runtime linking is disabled. */ - (void)pLog; - (void)handle; - (void)symbol; - return NULL; -#endif + #else + { + /* Runtime linking is disabled. */ + (void)pLog; + (void)handle; + (void)symbol; + return NULL; + } + #endif } @@ -18020,13 +19476,6 @@ DEVICE I/O ************************************************************************************************************************************************************* ************************************************************************************************************************************************************/ -/* Disable run-time linking on certain backends and platforms. */ -#ifndef MA_NO_RUNTIME_LINKING - #if defined(MA_EMSCRIPTEN) || defined(MA_ORBIS) || defined(MA_PROSPERO) - #define MA_NO_RUNTIME_LINKING - #endif -#endif - #ifdef MA_APPLE #include #endif @@ -18039,12 +19488,6 @@ DEVICE I/O #ifdef MA_POSIX #include - #include - - /* No need for dlfcn.h if we're not using runtime linking. */ - #ifndef MA_NO_RUNTIME_LINKING - #include - #endif #endif /* This must be set to at least 26. */ @@ -18299,7 +19742,7 @@ MA_API ma_bool32 ma_is_loopback_supported(ma_backend backend) -#if defined(MA_WIN32) +#if defined(MA_WIN32) && !defined(MA_XBOX) /* WASAPI error codes. */ #define MA_AUDCLNT_E_NOT_INITIALIZED ((HRESULT)0x88890001) #define MA_AUDCLNT_E_ALREADY_INITIALIZED ((HRESULT)0x88890002) @@ -18514,6 +19957,11 @@ typedef LONG (WINAPI * MA_PFN_RegCloseKey)(HKEY hKey); typedef LONG (WINAPI * MA_PFN_RegQueryValueExA)(HKEY hKey, const char* lpValueName, DWORD* lpReserved, DWORD* lpType, BYTE* lpData, DWORD* lpcbData); #endif /* MA_WIN32_DESKTOP */ +static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_PCM = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; +static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = {0x00000003, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; +/*static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_ALAW = {0x00000006, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/ +/*static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_MULAW = {0x00000007, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/ + MA_API size_t ma_strlen_WCHAR(const WCHAR* str) { size_t len = 0; @@ -18577,7 +20025,7 @@ Timing *******************************************************************************/ #if defined(MA_WIN32) && !defined(MA_POSIX) static LARGE_INTEGER g_ma_TimerFrequency; /* <-- Initialized to zero since it's static. */ - static void ma_timer_init(ma_timer* pTimer) + static MA_INLINE void ma_timer_init(ma_timer* pTimer) { LARGE_INTEGER counter; @@ -18589,7 +20037,7 @@ Timing pTimer->counter = counter.QuadPart; } - static double ma_timer_get_time_in_seconds(ma_timer* pTimer) + static MA_INLINE double ma_timer_get_time_in_seconds(ma_timer* pTimer) { LARGE_INTEGER counter; if (!QueryPerformanceCounter(&counter)) { @@ -18600,7 +20048,7 @@ Timing } #elif defined(MA_APPLE) && (MAC_OS_X_VERSION_MIN_REQUIRED < 101200) static ma_uint64 g_ma_TimerFrequency = 0; - static void ma_timer_init(ma_timer* pTimer) + static MA_INLINE void ma_timer_init(ma_timer* pTimer) { mach_timebase_info_data_t baseTime; mach_timebase_info(&baseTime); @@ -18609,7 +20057,7 @@ Timing pTimer->counter = mach_absolute_time(); } - static double ma_timer_get_time_in_seconds(ma_timer* pTimer) + static MA_INLINE double ma_timer_get_time_in_seconds(ma_timer* pTimer) { ma_uint64 newTimeCounter = mach_absolute_time(); ma_uint64 oldTimeCounter = pTimer->counter; @@ -18634,15 +20082,15 @@ Timing #define MA_CLOCK_ID CLOCK_REALTIME #endif - static void ma_timer_init(ma_timer* pTimer) + static MA_INLINE void ma_timer_init(ma_timer* pTimer) { struct timespec newTime; clock_gettime(MA_CLOCK_ID, &newTime); - pTimer->counter = (newTime.tv_sec * 1000000000) + newTime.tv_nsec; + pTimer->counter = ((ma_int64)newTime.tv_sec * 1000000000) + newTime.tv_nsec; } - static double ma_timer_get_time_in_seconds(ma_timer* pTimer) + static MA_INLINE double ma_timer_get_time_in_seconds(ma_timer* pTimer) { ma_uint64 newTimeCounter; ma_uint64 oldTimeCounter; @@ -18650,21 +20098,21 @@ Timing struct timespec newTime; clock_gettime(MA_CLOCK_ID, &newTime); - newTimeCounter = (newTime.tv_sec * 1000000000) + newTime.tv_nsec; + newTimeCounter = ((ma_uint64)newTime.tv_sec * 1000000000) + newTime.tv_nsec; oldTimeCounter = pTimer->counter; return (newTimeCounter - oldTimeCounter) / 1000000000.0; } #else - static void ma_timer_init(ma_timer* pTimer) + static MA_INLINE void ma_timer_init(ma_timer* pTimer) { struct timeval newTime; gettimeofday(&newTime, NULL); - pTimer->counter = (newTime.tv_sec * 1000000) + newTime.tv_usec; + pTimer->counter = ((ma_int64)newTime.tv_sec * 1000000) + newTime.tv_usec; } - static double ma_timer_get_time_in_seconds(ma_timer* pTimer) + static MA_INLINE double ma_timer_get_time_in_seconds(ma_timer* pTimer) { ma_uint64 newTimeCounter; ma_uint64 oldTimeCounter; @@ -18672,7 +20120,7 @@ Timing struct timeval newTime; gettimeofday(&newTime, NULL); - newTimeCounter = (newTime.tv_sec * 1000000) + newTime.tv_usec; + newTimeCounter = ((ma_uint64)newTime.tv_sec * 1000000) + newTime.tv_usec; oldTimeCounter = pTimer->counter; return (newTimeCounter - oldTimeCounter) / 1000000.0; @@ -19248,14 +20696,6 @@ static MA_INLINE void ma_device__set_state(ma_device* pDevice, ma_device_state n } -#if defined(MA_WIN32) - static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_PCM = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; - static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = {0x00000003, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; - /*static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_ALAW = {0x00000006, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/ - /*static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_MULAW = {0x00000007, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/ -#endif - - MA_API ma_uint32 ma_get_format_priority_index(ma_format format) /* Lower = better. */ { @@ -19967,7 +21407,7 @@ static ma_result ma_context_init__null(ma_context* pContext, const ma_context_co WIN32 COMMON *******************************************************************************/ -#if defined(MA_WIN32) +#if defined(MA_WIN32) && !defined(MA_XBOX) #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) #define ma_CoInitializeEx(pContext, pvReserved, dwCoInit) ((pContext->win32.CoInitializeEx) ? ((MA_PFN_CoInitializeEx)pContext->win32.CoInitializeEx)(pvReserved, dwCoInit) : ((MA_PFN_CoInitialize)pContext->win32.CoInitialize)(pvReserved)) #define ma_CoUninitialize(pContext) ((MA_PFN_CoUninitialize)pContext->win32.CoUninitialize)() @@ -19982,7 +21422,7 @@ WIN32 COMMON #define ma_PropVariantClear(pContext, pvar) PropVariantClear(pvar) #endif -#if !defined(MAXULONG_PTR) && !defined(__WATCOMC__) +#if !defined(MAXULONG_PTR) && !defined(__WATCOMC__) && !defined(MA_XBOX_NXDK) typedef size_t DWORD_PTR; #endif @@ -20409,11 +21849,21 @@ typedef enum MA_AudioCategory_Other = 0 /* <-- miniaudio is only caring about Other. */ } MA_AUDIO_STREAM_CATEGORY; +typedef enum +{ + MA_AUDCLNT_STREAMOPTIONS_NONE, + MA_AUDCLNT_STREAMOPTIONS_RAW, + MA_AUDCLNT_STREAMOPTIONS_MATCH_FORMAT, + MA_AUDCLNT_STREAMOPTIONS_AMBISONICS, + MA_AUDCLNT_STREAMOPTIONS_POST_VOLUME_LOOPBACK +} MA_AUDCLNT_STREAMOPTIONS; + typedef struct { ma_uint32 cbSize; BOOL bIsOffload; MA_AUDIO_STREAM_CATEGORY eCategory; + MA_AUDCLNT_STREAMOPTIONS Options; } ma_AudioClientProperties; /* IUnknown */ @@ -21588,6 +23038,7 @@ static ma_result ma_context_get_MMDevice__wasapi(ma_context* pContext, ma_device { ma_IMMDeviceEnumerator* pDeviceEnumerator; HRESULT hr; + HRESULT CoInitializeResult; MA_ASSERT(pContext != NULL); MA_ASSERT(ppMMDevice != NULL); @@ -21601,12 +23052,17 @@ static ma_result ma_context_get_MMDevice__wasapi(ma_context* pContext, ma_device The community has reported that this seems to fix the crash. There are future plans to move all WASAPI operation over to a single thread to make everything safer, but in the meantime while we wait for that to come online I'm happy enough to use this hack instead. + + CoUninitialize should only be called if we successfully initialized. S_OK and S_FALSE both mean that we need to + call CoUninitialize since the internal ref count was increased. RPC_E_CHANGED_MODE means that CoInitializeEx was + called with a different COINIT value, and we don't call CoUninitialize in that case. Other errors are possible, + so we check for S_OK and S_FALSE specifically. */ - ma_CoInitializeEx(pContext, NULL, MA_COINIT_VALUE); + CoInitializeResult = ma_CoInitializeEx(pContext, NULL, MA_COINIT_VALUE); { hr = ma_CoCreateInstance(pContext, &MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, &MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator); - } - ma_CoUninitialize(pContext); + } + if (CoInitializeResult == S_OK || CoInitializeResult == S_FALSE) { ma_CoUninitialize(pContext); } if (FAILED(hr)) { /* <-- This is checking the call above to ma_CoCreateInstance(). */ ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to create IMMDeviceEnumerator.\n"); @@ -21950,7 +23406,7 @@ static ma_result ma_context_get_IAudioClient__wasapi(ma_context* pContext, ma_de pActivationParams = &activationParams; /* When requesting a specific device ID we need to use a special device ID. */ - MA_COPY_MEMORY(virtualDeviceID.wasapi, MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK, (wcslen(MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK) + 1) * sizeof(wchar_t)); /* +1 for the null terminator. */ + MA_COPY_MEMORY(virtualDeviceID.wasapi, MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK, (ma_wcslen(MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK) + 1) * sizeof(wchar_t)); /* +1 for the null terminator. */ pDeviceID = &virtualDeviceID; } else { pActivationParams = NULL; /* No activation parameters required. */ @@ -26679,6 +28135,9 @@ typedef snd_pcm_channel_area_t ma_snd_pcm_channel_area_t; typedef snd_pcm_chmap_t ma_snd_pcm_chmap_t; typedef snd_pcm_state_t ma_snd_pcm_state_t; +/* snd_pcm_state_t */ +#define MA_SND_PCM_STATE_XRUN SND_PCM_STATE_XRUN + /* snd_pcm_stream_t */ #define MA_SND_PCM_STREAM_PLAYBACK SND_PCM_STREAM_PLAYBACK #define MA_SND_PCM_STREAM_CAPTURE SND_PCM_STREAM_CAPTURE @@ -26874,6 +28333,7 @@ typedef int (* ma_snd_pcm_hw_params_set_channels_minmax_proc) ( typedef int (* ma_snd_pcm_hw_params_set_rate_resample_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val); typedef int (* ma_snd_pcm_hw_params_set_rate_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val, int dir); typedef int (* ma_snd_pcm_hw_params_set_rate_near_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir); +typedef int (* ma_snd_pcm_hw_params_set_rate_minmax_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir); typedef int (* ma_snd_pcm_hw_params_set_buffer_size_near_proc)(ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_uframes_t *val); typedef int (* ma_snd_pcm_hw_params_set_periods_near_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir); typedef int (* ma_snd_pcm_hw_params_set_access_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_access_t _access); @@ -28640,8 +30100,9 @@ static ma_result ma_context_init__alsa(ma_context* pContext, const ma_context_co ma_snd_pcm_hw_params_get_format_mask_proc _snd_pcm_hw_params_get_format_mask = snd_pcm_hw_params_get_format_mask; ma_snd_pcm_hw_params_set_channels_proc _snd_pcm_hw_params_set_channels = snd_pcm_hw_params_set_channels; ma_snd_pcm_hw_params_set_channels_near_proc _snd_pcm_hw_params_set_channels_near = snd_pcm_hw_params_set_channels_near; + ma_snd_pcm_hw_params_set_channels_minmax_proc _snd_pcm_hw_params_set_channels_minmax = snd_pcm_hw_params_set_channels_minmax; ma_snd_pcm_hw_params_set_rate_resample_proc _snd_pcm_hw_params_set_rate_resample = snd_pcm_hw_params_set_rate_resample; - ma_snd_pcm_hw_params_set_rate_near _snd_pcm_hw_params_set_rate = snd_pcm_hw_params_set_rate; + ma_snd_pcm_hw_params_set_rate_proc _snd_pcm_hw_params_set_rate = snd_pcm_hw_params_set_rate; ma_snd_pcm_hw_params_set_rate_near_proc _snd_pcm_hw_params_set_rate_near = snd_pcm_hw_params_set_rate_near; ma_snd_pcm_hw_params_set_rate_minmax_proc _snd_pcm_hw_params_set_rate_minmax = snd_pcm_hw_params_set_rate_minmax; ma_snd_pcm_hw_params_set_buffer_size_near_proc _snd_pcm_hw_params_set_buffer_size_near = snd_pcm_hw_params_set_buffer_size_near; @@ -28693,9 +30154,9 @@ static ma_result ma_context_init__alsa(ma_context* pContext, const ma_context_co ma_snd_pcm_info_proc _snd_pcm_info = snd_pcm_info; ma_snd_pcm_info_sizeof_proc _snd_pcm_info_sizeof = snd_pcm_info_sizeof; ma_snd_pcm_info_get_name_proc _snd_pcm_info_get_name = snd_pcm_info_get_name; - ma_snd_pcm_poll_descriptors _snd_pcm_poll_descriptors = snd_pcm_poll_descriptors; - ma_snd_pcm_poll_descriptors_count _snd_pcm_poll_descriptors_count = snd_pcm_poll_descriptors_count; - ma_snd_pcm_poll_descriptors_revents _snd_pcm_poll_descriptors_revents = snd_pcm_poll_descriptors_revents; + ma_snd_pcm_poll_descriptors_proc _snd_pcm_poll_descriptors = snd_pcm_poll_descriptors; + ma_snd_pcm_poll_descriptors_count_proc _snd_pcm_poll_descriptors_count = snd_pcm_poll_descriptors_count; + ma_snd_pcm_poll_descriptors_revents_proc _snd_pcm_poll_descriptors_revents = snd_pcm_poll_descriptors_revents; ma_snd_config_update_free_global_proc _snd_config_update_free_global = snd_config_update_free_global; pContext->alsa.snd_pcm_open = (ma_proc)_snd_pcm_open; @@ -28711,6 +30172,7 @@ static ma_result ma_context_init__alsa(ma_context* pContext, const ma_context_co pContext->alsa.snd_pcm_hw_params_set_rate_resample = (ma_proc)_snd_pcm_hw_params_set_rate_resample; pContext->alsa.snd_pcm_hw_params_set_rate = (ma_proc)_snd_pcm_hw_params_set_rate; pContext->alsa.snd_pcm_hw_params_set_rate_near = (ma_proc)_snd_pcm_hw_params_set_rate_near; + pContext->alsa.snd_pcm_hw_params_set_rate_minmax = (ma_proc)_snd_pcm_hw_params_set_rate_minmax; pContext->alsa.snd_pcm_hw_params_set_buffer_size_near = (ma_proc)_snd_pcm_hw_params_set_buffer_size_near; pContext->alsa.snd_pcm_hw_params_set_periods_near = (ma_proc)_snd_pcm_hw_params_set_periods_near; pContext->alsa.snd_pcm_hw_params_set_access = (ma_proc)_snd_pcm_hw_params_set_access; @@ -29436,7 +30898,7 @@ typedef void (* ma_pa_threaded_mainloop_unlock_proc) ( typedef void (* ma_pa_threaded_mainloop_wait_proc) (ma_pa_threaded_mainloop* m); typedef void (* ma_pa_threaded_mainloop_signal_proc) (ma_pa_threaded_mainloop* m, int wait_for_accept); typedef void (* ma_pa_threaded_mainloop_accept_proc) (ma_pa_threaded_mainloop* m); -typedef int (* ma_pa_threaded_mainloop_get_retval_proc) (ma_pa_threaded_mainloop* m); +typedef int (* ma_pa_threaded_mainloop_get_retval_proc) (const ma_pa_threaded_mainloop* m); typedef ma_pa_mainloop_api* (* ma_pa_threaded_mainloop_get_api_proc) (ma_pa_threaded_mainloop* m); typedef int (* ma_pa_threaded_mainloop_in_thread_proc) (ma_pa_threaded_mainloop* m); typedef void (* ma_pa_threaded_mainloop_set_name_proc) (ma_pa_threaded_mainloop* m, const char* name); @@ -29445,13 +30907,13 @@ typedef void (* ma_pa_context_unref_proc) ( typedef int (* ma_pa_context_connect_proc) (ma_pa_context* c, const char* server, ma_pa_context_flags_t flags, const ma_pa_spawn_api* api); typedef void (* ma_pa_context_disconnect_proc) (ma_pa_context* c); typedef void (* ma_pa_context_set_state_callback_proc) (ma_pa_context* c, ma_pa_context_notify_cb_t cb, void* userdata); -typedef ma_pa_context_state_t (* ma_pa_context_get_state_proc) (ma_pa_context* c); +typedef ma_pa_context_state_t (* ma_pa_context_get_state_proc) (const ma_pa_context* c); typedef ma_pa_operation* (* ma_pa_context_get_sink_info_list_proc) (ma_pa_context* c, ma_pa_sink_info_cb_t cb, void* userdata); typedef ma_pa_operation* (* ma_pa_context_get_source_info_list_proc) (ma_pa_context* c, ma_pa_source_info_cb_t cb, void* userdata); typedef ma_pa_operation* (* ma_pa_context_get_sink_info_by_name_proc) (ma_pa_context* c, const char* name, ma_pa_sink_info_cb_t cb, void* userdata); typedef ma_pa_operation* (* ma_pa_context_get_source_info_by_name_proc)(ma_pa_context* c, const char* name, ma_pa_source_info_cb_t cb, void* userdata); typedef void (* ma_pa_operation_unref_proc) (ma_pa_operation* o); -typedef ma_pa_operation_state_t (* ma_pa_operation_get_state_proc) (ma_pa_operation* o); +typedef ma_pa_operation_state_t (* ma_pa_operation_get_state_proc) (const ma_pa_operation* o); typedef ma_pa_channel_map* (* ma_pa_channel_map_init_extend_proc) (ma_pa_channel_map* m, unsigned channels, ma_pa_channel_map_def_t def); typedef int (* ma_pa_channel_map_valid_proc) (const ma_pa_channel_map* m); typedef int (* ma_pa_channel_map_compatible_proc) (const ma_pa_channel_map* m, const ma_pa_sample_spec* ss); @@ -29460,12 +30922,12 @@ typedef void (* ma_pa_stream_unref_proc) ( typedef int (* ma_pa_stream_connect_playback_proc) (ma_pa_stream* s, const char* dev, const ma_pa_buffer_attr* attr, ma_pa_stream_flags_t flags, const ma_pa_cvolume* volume, ma_pa_stream* sync_stream); typedef int (* ma_pa_stream_connect_record_proc) (ma_pa_stream* s, const char* dev, const ma_pa_buffer_attr* attr, ma_pa_stream_flags_t flags); typedef int (* ma_pa_stream_disconnect_proc) (ma_pa_stream* s); -typedef ma_pa_stream_state_t (* ma_pa_stream_get_state_proc) (ma_pa_stream* s); +typedef ma_pa_stream_state_t (* ma_pa_stream_get_state_proc) (const ma_pa_stream* s); typedef const ma_pa_sample_spec* (* ma_pa_stream_get_sample_spec_proc) (ma_pa_stream* s); typedef const ma_pa_channel_map* (* ma_pa_stream_get_channel_map_proc) (ma_pa_stream* s); typedef const ma_pa_buffer_attr* (* ma_pa_stream_get_buffer_attr_proc) (ma_pa_stream* s); typedef ma_pa_operation* (* ma_pa_stream_set_buffer_attr_proc) (ma_pa_stream* s, const ma_pa_buffer_attr* attr, ma_pa_stream_success_cb_t cb, void* userdata); -typedef const char* (* ma_pa_stream_get_device_name_proc) (ma_pa_stream* s); +typedef const char* (* ma_pa_stream_get_device_name_proc) (const ma_pa_stream* s); typedef void (* ma_pa_stream_set_write_callback_proc) (ma_pa_stream* s, ma_pa_stream_request_cb_t cb, void* userdata); typedef void (* ma_pa_stream_set_read_callback_proc) (ma_pa_stream* s, ma_pa_stream_request_cb_t cb, void* userdata); typedef void (* ma_pa_stream_set_suspended_callback_proc) (ma_pa_stream* s, ma_pa_stream_notify_cb_t cb, void* userdata); @@ -29473,15 +30935,15 @@ typedef void (* ma_pa_stream_set_moved_callback_proc) ( typedef int (* ma_pa_stream_is_suspended_proc) (const ma_pa_stream* s); typedef ma_pa_operation* (* ma_pa_stream_flush_proc) (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata); typedef ma_pa_operation* (* ma_pa_stream_drain_proc) (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata); -typedef int (* ma_pa_stream_is_corked_proc) (ma_pa_stream* s); +typedef int (* ma_pa_stream_is_corked_proc) (const ma_pa_stream* s); typedef ma_pa_operation* (* ma_pa_stream_cork_proc) (ma_pa_stream* s, int b, ma_pa_stream_success_cb_t cb, void* userdata); typedef ma_pa_operation* (* ma_pa_stream_trigger_proc) (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata); typedef int (* ma_pa_stream_begin_write_proc) (ma_pa_stream* s, void** data, size_t* nbytes); typedef int (* ma_pa_stream_write_proc) (ma_pa_stream* s, const void* data, size_t nbytes, ma_pa_free_cb_t free_cb, int64_t offset, ma_pa_seek_mode_t seek); typedef int (* ma_pa_stream_peek_proc) (ma_pa_stream* s, const void** data, size_t* nbytes); typedef int (* ma_pa_stream_drop_proc) (ma_pa_stream* s); -typedef size_t (* ma_pa_stream_writable_size_proc) (ma_pa_stream* s); -typedef size_t (* ma_pa_stream_readable_size_proc) (ma_pa_stream* s); +typedef size_t (* ma_pa_stream_writable_size_proc) (const ma_pa_stream* s); +typedef size_t (* ma_pa_stream_readable_size_proc) (const ma_pa_stream* s); typedef struct { @@ -29777,9 +31239,10 @@ static ma_result ma_init_pa_mainloop_and_pa_context__pulse(ma_context* pContext, } /* Now we need to connect to the context. Everything is asynchronous so we need to wait for it to connect before returning. */ - result = ma_result_from_pulse(((ma_pa_context_connect_proc)pContext->pulse.pa_context_connect)((ma_pa_context*)pPulseContext, pServerName, (tryAutoSpawn) ? 0 : MA_PA_CONTEXT_NOAUTOSPAWN, NULL)); + result = ma_result_from_pulse(((ma_pa_context_connect_proc)pContext->pulse.pa_context_connect)((ma_pa_context*)pPulseContext, pServerName, (tryAutoSpawn) ? MA_PA_CONTEXT_NOFLAGS : MA_PA_CONTEXT_NOAUTOSPAWN, NULL)); if (result != MA_SUCCESS) { ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to connect PulseAudio context."); + ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)((ma_pa_context*)(pPulseContext)); ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)(pMainLoop)); return result; } @@ -29788,6 +31251,7 @@ static ma_result ma_init_pa_mainloop_and_pa_context__pulse(ma_context* pContext, result = ma_wait_for_pa_context_to_connect__pulse(pContext, pMainLoop, pPulseContext); if (result != MA_SUCCESS) { ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[PulseAudio] Waiting for connection failed."); + ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)((ma_pa_context*)(pPulseContext)); ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)(pMainLoop)); return result; } @@ -30510,7 +31974,7 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi const ma_pa_buffer_attr* pActualAttr = NULL; const ma_pa_channel_map* pActualChannelMap = NULL; ma_uint32 iChannel; - ma_pa_stream_flags_t streamFlags; + int streamFlags; MA_ASSERT(pDevice != NULL); MA_ZERO_OBJECT(&pDevice->pulse); @@ -30568,8 +32032,13 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi ss.channels = pDescriptorCapture->channels; } + /* PulseAudio has a maximum channel count of 32. We'll get a crash if this is exceeded. */ + if (ss.channels > 32) { + ss.channels = 32; + } + /* Use a default channel map. */ - ((ma_pa_channel_map_init_extend_proc)pDevice->pContext->pulse.pa_channel_map_init_extend)(&cmap, ss.channels, pConfig->pulse.channelMap); + ((ma_pa_channel_map_init_extend_proc)pDevice->pContext->pulse.pa_channel_map_init_extend)(&cmap, ss.channels, (ma_pa_channel_map_def_t)pConfig->pulse.channelMap); /* Use the requested sample rate if one was specified. */ if (pDescriptorCapture->sampleRate != 0) { @@ -30626,7 +32095,7 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi streamFlags |= MA_PA_STREAM_DONT_MOVE; } - error = ((ma_pa_stream_connect_record_proc)pDevice->pContext->pulse.pa_stream_connect_record)((ma_pa_stream*)pDevice->pulse.pStreamCapture, devCapture, &attr, streamFlags); + error = ((ma_pa_stream_connect_record_proc)pDevice->pContext->pulse.pa_stream_connect_record)((ma_pa_stream*)pDevice->pulse.pStreamCapture, devCapture, &attr, (ma_pa_stream_flags_t)streamFlags); if (error != MA_PA_OK) { ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to connect PulseAudio capture stream."); result = ma_result_from_pulse(error); @@ -30720,8 +32189,13 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi ss.channels = pDescriptorPlayback->channels; } + /* PulseAudio has a maximum channel count of 32. We'll get a crash if this is exceeded. */ + if (ss.channels > 32) { + ss.channels = 32; + } + /* Use a default channel map. */ - ((ma_pa_channel_map_init_extend_proc)pDevice->pContext->pulse.pa_channel_map_init_extend)(&cmap, ss.channels, pConfig->pulse.channelMap); + ((ma_pa_channel_map_init_extend_proc)pDevice->pContext->pulse.pa_channel_map_init_extend)(&cmap, ss.channels, (ma_pa_channel_map_def_t)pConfig->pulse.channelMap); /* Use the requested sample rate if one was specified. */ @@ -30783,7 +32257,7 @@ static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_confi streamFlags |= MA_PA_STREAM_DONT_MOVE; } - error = ((ma_pa_stream_connect_playback_proc)pDevice->pContext->pulse.pa_stream_connect_playback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, devPlayback, &attr, streamFlags, NULL, NULL); + error = ((ma_pa_stream_connect_playback_proc)pDevice->pContext->pulse.pa_stream_connect_playback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, devPlayback, &attr, (ma_pa_stream_flags_t)streamFlags, NULL, NULL); if (error != MA_PA_OK) { ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to connect PulseAudio playback stream."); result = ma_result_from_pulse(error); @@ -31338,6 +32812,7 @@ typedef JackProcessCallback ma_JackProcessCallback; typedef JackBufferSizeCallback ma_JackBufferSizeCallback; typedef JackShutdownCallback ma_JackShutdownCallback; #define MA_JACK_DEFAULT_AUDIO_TYPE JACK_DEFAULT_AUDIO_TYPE +#define ma_JackNullOption JackNullOption #define ma_JackNoStartServer JackNoStartServer #define ma_JackPortIsInput JackPortIsInput #define ma_JackPortIsOutput JackPortIsOutput @@ -31352,6 +32827,7 @@ typedef int (* ma_JackProcessCallback) (ma_jack_nframes_t nframes, void* arg) typedef int (* ma_JackBufferSizeCallback)(ma_jack_nframes_t nframes, void* arg); typedef void (* ma_JackShutdownCallback) (void* arg); #define MA_JACK_DEFAULT_AUDIO_TYPE "32 bit float mono audio" +#define ma_JackNullOption 0 #define ma_JackNoStartServer 1 #define ma_JackPortIsInput 1 #define ma_JackPortIsOutput 2 @@ -31392,7 +32868,7 @@ static ma_result ma_context_open_client__jack(ma_context* pContext, ma_jack_clie maxClientNameSize = ((ma_jack_client_name_size_proc)pContext->jack.jack_client_name_size)(); /* Includes null terminator. */ ma_strncpy_s(clientName, ma_min(sizeof(clientName), maxClientNameSize), (pContext->jack.pClientName != NULL) ? pContext->jack.pClientName : "miniaudio", (size_t)-1); - pClient = ((ma_jack_client_open_proc)pContext->jack.jack_client_open)(clientName, (pContext->jack.tryStartServer) ? 0 : ma_JackNoStartServer, &status, NULL); + pClient = ((ma_jack_client_open_proc)pContext->jack.jack_client_open)(clientName, (pContext->jack.tryStartServer) ? ma_JackNullOption : ma_JackNoStartServer, &status, NULL); if (pClient == NULL) { return MA_FAILED_TO_OPEN_BACKEND_DEVICE; } @@ -36994,7 +38470,7 @@ OSS Backend #define MA_OSS_DEFAULT_DEVICE_NAME "/dev/dsp" -static int ma_open_temp_device__oss() +static int ma_open_temp_device__oss(void) { /* The OSS sample code uses "/dev/mixer" as the device for getting system properties so I'm going to do the same. */ int fd = open("/dev/mixer", O_RDONLY, 0); @@ -37834,25 +39310,30 @@ static void ma_stream_error_callback__aaudio(ma_AAudioStream* pStream, void* pUs (void)error; ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[AAudio] ERROR CALLBACK: error=%d, AAudioStream_getState()=%d\n", error, ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream)); + /* When we get an error, we'll assume that the stream is in an erroneous state and needs to be restarted. From the documentation, we cannot do this from the error callback. Therefore we are going to use an event thread for the AAudio backend to do this cleanly and safely. */ - job = ma_job_init(MA_JOB_TYPE_DEVICE_AAUDIO_REROUTE); - job.data.device.aaudio.reroute.pDevice = pDevice; - - if (pStream == pDevice->aaudio.pStreamCapture) { - job.data.device.aaudio.reroute.deviceType = ma_device_type_capture; + if (ma_atomic_bool32_get(&pDevice->aaudio.isTearingDown)) { + ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[AAudio] Device Disconnected. Tearing down device.\n"); } else { - job.data.device.aaudio.reroute.deviceType = ma_device_type_playback; - } - - result = ma_device_job_thread_post(&pDevice->pContext->aaudio.jobThread, &job); - if (result != MA_SUCCESS) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[AAudio] Device Disconnected. Failed to post job for rerouting.\n"); - return; + job = ma_job_init(MA_JOB_TYPE_DEVICE_AAUDIO_REROUTE); + job.data.device.aaudio.reroute.pDevice = pDevice; + + if (pStream == pDevice->aaudio.pStreamCapture) { + job.data.device.aaudio.reroute.deviceType = ma_device_type_capture; + } else { + job.data.device.aaudio.reroute.deviceType = ma_device_type_playback; + } + + result = ma_device_job_thread_post(&pDevice->pContext->aaudio.jobThread, &job); + if (result != MA_SUCCESS) { + ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[AAudio] Device Disconnected. Failed to post job for rerouting.\n"); + return; + } } } @@ -38169,7 +39650,7 @@ static ma_result ma_close_streams__aaudio(ma_device* pDevice) { MA_ASSERT(pDevice != NULL); - /* When re-routing, streams may have been closed and never re-opened. Hence the extra checks below. */ + /* When rerouting, streams may have been closed and never re-opened. Hence the extra checks below. */ if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture); pDevice->aaudio.pStreamCapture = NULL; @@ -38186,6 +39667,12 @@ static ma_result ma_device_uninit__aaudio(ma_device* pDevice) { MA_ASSERT(pDevice != NULL); + /* + Note: Closing the streams may cause a timeout error, which would then trigger rerouting in our error callback. + We must not schedule a reroute when device is getting destroyed. + */ + ma_atomic_bool32_set(&pDevice->aaudio.isTearingDown, MA_TRUE); + /* Wait for any rerouting to finish before attempting to close the streams. */ ma_mutex_lock(&pDevice->aaudio.rerouteLock); { @@ -38193,7 +39680,7 @@ static ma_result ma_device_uninit__aaudio(ma_device* pDevice) } ma_mutex_unlock(&pDevice->aaudio.rerouteLock); - /* Destroy re-routing lock. */ + /* Destroy rerouting lock. */ ma_mutex_uninit(&pDevice->aaudio.rerouteLock); return MA_SUCCESS; @@ -38429,17 +39916,22 @@ static ma_result ma_device_stop__aaudio(ma_device* pDevice) static ma_result ma_device_reinit__aaudio(ma_device* pDevice, ma_device_type deviceType) { + const ma_int32 maxAttempts = 4; /* Reasonable retry limit. */ + ma_result result; - int32_t retries = 0; + ma_int32 iAttempt; MA_ASSERT(pDevice != NULL); - /* - TODO: Stop retrying if main thread is about to uninit device. - */ - ma_mutex_lock(&pDevice->aaudio.rerouteLock); - { -error_disconnected: + /* We got disconnected! Retry a few times, until we find a connected device! */ + iAttempt = 0; + while (iAttempt++ < maxAttempts) { + /* Device tearing down? No need to reroute! */ + if (ma_atomic_bool32_get(&pDevice->aaudio.isTearingDown)) { + result = MA_SUCCESS; /* Caller should continue as normal. */ + break; + } + /* The first thing to do is close the streams. */ ma_close_streams__aaudio(pDevice); @@ -38495,14 +39987,16 @@ error_disconnected: result = ma_device_init_streams__aaudio(pDevice, &deviceConfig, &descriptorPlayback, &descriptorCapture); if (result != MA_SUCCESS) { ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, "[AAudio] Failed to create stream after route change."); - goto done; + /* Reroute failed! */ + break; } result = ma_device_post_init(pDevice, deviceType, &descriptorPlayback, &descriptorCapture); if (result != MA_SUCCESS) { ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, "[AAudio] Failed to initialize device after route change."); ma_close_streams__aaudio(pDevice); - goto done; + /* Reroute failed! */ + break; } /* We'll only ever do this in response to a reroute. */ @@ -38513,26 +40007,23 @@ error_disconnected: if (pDevice->aaudio.noAutoStartAfterReroute == MA_FALSE) { result = ma_device_start__aaudio(pDevice); if (result != MA_SUCCESS) { - /* We got disconnected! Retry a few times, until we find a connected device! */ - retries += 1; - if (retries <= 3) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[AAudio] Failed to start stream after route change, retrying(%d)", retries); - goto error_disconnected; + if (iAttempt < maxAttempts) { + ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[AAudio] Failed to start stream after route change, retrying(%d)", iAttempt); + } else { + ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[AAudio] Failed to start stream after route change, giving up."); } - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[AAudio] Failed to start stream after route change."); - goto done; } } else { - ma_device_stop(pDevice); /* Do a full device stop so we set internal state correctly. */ + ma_device_stop(pDevice); /* Do a full device stop so we set internal state correctly. */ } } - - result = MA_SUCCESS; - } -done: - /* Re-routing done */ - ma_mutex_unlock(&pDevice->aaudio.rerouteLock); + if (result == MA_SUCCESS) { + /* Reroute successful! */ + break; + } + } + return result; } @@ -38698,7 +40189,7 @@ static ma_result ma_context_init__aaudio(ma_context* pContext, const ma_context_ static ma_result ma_job_process__device__aaudio_reroute(ma_job* pJob) { - ma_result result; + ma_result result = MA_SUCCESS; ma_device* pDevice; MA_ASSERT(pJob != NULL); @@ -38706,19 +40197,22 @@ static ma_result ma_job_process__device__aaudio_reroute(ma_job* pJob) pDevice = (ma_device*)pJob->data.device.aaudio.reroute.pDevice; MA_ASSERT(pDevice != NULL); - /* Here is where we need to reroute the device. To do this we need to uninitialize the stream and reinitialize it. */ - result = ma_device_reinit__aaudio(pDevice, (ma_device_type)pJob->data.device.aaudio.reroute.deviceType); - if (result != MA_SUCCESS) { - /* - Getting here means we failed to reroute the device. The best thing I can think of here is to - just stop the device. - */ - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[AAudio] Stopping device due to reroute failure."); - ma_device_stop(pDevice); - return result; + ma_mutex_lock(&pDevice->aaudio.rerouteLock); + { + /* Here is where we need to reroute the device. To do this we need to uninitialize the stream and reinitialize it. */ + result = ma_device_reinit__aaudio(pDevice, (ma_device_type)pJob->data.device.aaudio.reroute.deviceType); + if (result != MA_SUCCESS) { + /* + Getting here means we failed to reroute the device. The best thing I can think of here is to + just stop the device. + */ + ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[AAudio] Stopping device due to reroute failure."); + ma_device_stop(pDevice); + } } + ma_mutex_unlock(&pDevice->aaudio.rerouteLock); - return MA_SUCCESS; + return result; } #else /* Getting here means there is no AAudio backend so we need a no-op job implementation. */ @@ -40269,8 +41763,11 @@ static EM_BOOL ma_audio_worklet_process_callback__webaudio(int inputCount, const frameCount = pDevice->capture.internalPeriodSizeInFrames; } + /* + If this is called by the device has not yet been started we need to return early, making sure we output silence to + the output buffer. + */ if (ma_device_get_state(pDevice) != ma_device_state_started) { - /* Fill the output buffer with zero to avoid a noise sound */ for (int i = 0; i < outputCount; i += 1) { MA_ZERO_MEMORY(pOutputs[i].data, pOutputs[i].numberOfChannels * frameCount * sizeof(float)); } @@ -40292,7 +41789,9 @@ static EM_BOOL ma_audio_worklet_process_callback__webaudio(int inputCount, const if (outputCount > 0) { /* If it's a capture-only device, we'll need to output silence. */ if (pDevice->type == ma_device_type_capture) { - MA_ZERO_MEMORY(pOutputs[0].data, frameCount * pDevice->playback.internalChannels * sizeof(float)); + for (int i = 0; i < outputCount; i += 1) { + MA_ZERO_MEMORY(pOutputs[i].data, pOutputs[i].numberOfChannels * frameCount * sizeof(float)); + } } else { ma_device_process_pcm_frames_playback__webaudio(pDevice, frameCount, pDevice->webaudio.pIntermediaryBuffer); @@ -40302,6 +41801,14 @@ static EM_BOOL ma_audio_worklet_process_callback__webaudio(int inputCount, const pOutputs[0].data[frameCount*iChannel + iFrame] = pDevice->webaudio.pIntermediaryBuffer[iFrame*pDevice->playback.internalChannels + iChannel]; } } + + /* + Just above we output data to the first output buffer. Here we just make sure we're putting silence into any + remaining output buffers. + */ + for (int i = 1; i < outputCount; i += 1) { /* <-- Note that the counter starts at 1 instead of 0. */ + MA_ZERO_MEMORY(pOutputs[i].data, pOutputs[i].numberOfChannels * frameCount * sizeof(float)); + } } } @@ -40782,8 +42289,8 @@ static ma_result ma_context_uninit__webaudio(ma_context* pContext) /* Remove the global miniaudio object from window if there are no more references to it. */ EM_ASM({ if (typeof(window.miniaudio) !== 'undefined') { - miniaudio.unlock_event_types.map(function(event_type) { - document.removeEventListener(event_type, miniaudio.unlock, true); + window.miniaudio.unlock_event_types.map(function(event_type) { + document.removeEventListener(event_type, window.miniaudio.unlock, true); }); window.miniaudio.referenceCount -= 1; @@ -41236,13 +42743,13 @@ MA_API ma_result ma_device_post_init(ma_device* pDevice, ma_device_type deviceTy static ma_thread_result MA_THREADCALL ma_worker_thread(void* pData) { ma_device* pDevice = (ma_device*)pData; -#ifdef MA_WIN32 +#if defined(MA_WIN32) && !defined(MA_XBOX) HRESULT CoInitializeResult; #endif MA_ASSERT(pDevice != NULL); -#ifdef MA_WIN32 +#if defined(MA_WIN32) && !defined(MA_XBOX) CoInitializeResult = ma_CoInitializeEx(pDevice->pContext, NULL, MA_COINIT_VALUE); #endif @@ -41333,8 +42840,8 @@ static ma_thread_result MA_THREADCALL ma_worker_thread(void* pData) ma_event_signal(&pDevice->stopEvent); } -#ifdef MA_WIN32 - if (CoInitializeResult == S_OK) { +#if defined(MA_WIN32) && !defined(MA_XBOX) + if (CoInitializeResult == S_OK || CoInitializeResult == S_FALSE) { ma_CoUninitialize(pDevice->pContext); } #endif @@ -41358,67 +42865,92 @@ static ma_bool32 ma_device__is_initialized(ma_device* pDevice) static ma_result ma_context_uninit_backend_apis__win32(ma_context* pContext) { /* For some reason UWP complains when CoUninitialize() is called. I'm just not going to call it on UWP. */ -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - if (pContext->win32.CoInitializeResult == S_OK) { - ma_CoUninitialize(pContext); + #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) + { + /* TODO: Remove this once the new single threaded backend system is in place in 0.12. */ + #if !defined(MA_XBOX) + { + if (pContext->win32.CoInitializeResult == S_OK || pContext->win32.CoInitializeResult == S_FALSE) { + ma_CoUninitialize(pContext); /* TODO: Remove this once the new single threaded backend system is in place in 0.12. */ + } + } + #endif + + #if defined(MA_WIN32_DESKTOP) + ma_dlclose(ma_context_get_log(pContext), pContext->win32.hUser32DLL); + ma_dlclose(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL); + #endif + + ma_dlclose(ma_context_get_log(pContext), pContext->win32.hOle32DLL); + } + #else + { + (void)pContext; } - - #if defined(MA_WIN32_DESKTOP) - ma_dlclose(ma_context_get_log(pContext), pContext->win32.hUser32DLL); - ma_dlclose(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL); #endif - ma_dlclose(ma_context_get_log(pContext), pContext->win32.hOle32DLL); -#else - (void)pContext; -#endif - return MA_SUCCESS; } static ma_result ma_context_init_backend_apis__win32(ma_context* pContext) { -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - #if defined(MA_WIN32_DESKTOP) - /* User32.dll */ - pContext->win32.hUser32DLL = ma_dlopen(ma_context_get_log(pContext), "user32.dll"); - if (pContext->win32.hUser32DLL == NULL) { + /* + TODO: Reassess all of this stuff and move everything to the relevant backends. For example, I think + GetForegroundWindow() and GetDesktopWindow() are only used by the DirectSound backend. + */ + #if (defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)) && !defined(MA_XBOX) + { + #if defined(MA_WIN32_DESKTOP) + { + /* User32.dll */ + pContext->win32.hUser32DLL = ma_dlopen(ma_context_get_log(pContext), "user32.dll"); + if (pContext->win32.hUser32DLL == NULL) { + return MA_FAILED_TO_INIT_BACKEND; + } + + pContext->win32.GetForegroundWindow = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hUser32DLL, "GetForegroundWindow"); + pContext->win32.GetDesktopWindow = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hUser32DLL, "GetDesktopWindow"); + + + /* Advapi32.dll */ + pContext->win32.hAdvapi32DLL = ma_dlopen(ma_context_get_log(pContext), "advapi32.dll"); + if (pContext->win32.hAdvapi32DLL == NULL) { + return MA_FAILED_TO_INIT_BACKEND; + } + + pContext->win32.RegOpenKeyExA = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegOpenKeyExA"); + pContext->win32.RegCloseKey = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegCloseKey"); + pContext->win32.RegQueryValueExA = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegQueryValueExA"); + } + #endif + + /* Ole32.dll */ + pContext->win32.hOle32DLL = ma_dlopen(ma_context_get_log(pContext), "ole32.dll"); + if (pContext->win32.hOle32DLL == NULL) { return MA_FAILED_TO_INIT_BACKEND; } - pContext->win32.GetForegroundWindow = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hUser32DLL, "GetForegroundWindow"); - pContext->win32.GetDesktopWindow = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hUser32DLL, "GetDesktopWindow"); - - - /* Advapi32.dll */ - pContext->win32.hAdvapi32DLL = ma_dlopen(ma_context_get_log(pContext), "advapi32.dll"); - if (pContext->win32.hAdvapi32DLL == NULL) { - return MA_FAILED_TO_INIT_BACKEND; - } - - pContext->win32.RegOpenKeyExA = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegOpenKeyExA"); - pContext->win32.RegCloseKey = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegCloseKey"); - pContext->win32.RegQueryValueExA = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, "RegQueryValueExA"); + pContext->win32.CoInitialize = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoInitialize"); + pContext->win32.CoInitializeEx = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoInitializeEx"); + pContext->win32.CoUninitialize = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoUninitialize"); + pContext->win32.CoCreateInstance = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoCreateInstance"); + pContext->win32.CoTaskMemFree = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoTaskMemFree"); + pContext->win32.PropVariantClear = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "PropVariantClear"); + pContext->win32.StringFromGUID2 = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "StringFromGUID2"); + } + #else + { + (void)pContext; /* Unused. */ + } #endif - /* Ole32.dll */ - pContext->win32.hOle32DLL = ma_dlopen(ma_context_get_log(pContext), "ole32.dll"); - if (pContext->win32.hOle32DLL == NULL) { - return MA_FAILED_TO_INIT_BACKEND; + /* TODO: Remove this once the new single threaded backend system is in place in 0.12. */ + #if !defined(MA_XBOX) + { + pContext->win32.CoInitializeResult = ma_CoInitializeEx(pContext, NULL, MA_COINIT_VALUE); } + #endif - pContext->win32.CoInitialize = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoInitialize"); - pContext->win32.CoInitializeEx = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoInitializeEx"); - pContext->win32.CoUninitialize = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoUninitialize"); - pContext->win32.CoCreateInstance = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoCreateInstance"); - pContext->win32.CoTaskMemFree = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "CoTaskMemFree"); - pContext->win32.PropVariantClear = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "PropVariantClear"); - pContext->win32.StringFromGUID2 = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, "StringFromGUID2"); -#else - (void)pContext; /* Unused. */ -#endif - - pContext->win32.CoInitializeResult = ma_CoInitializeEx(pContext, NULL, MA_COINIT_VALUE); return MA_SUCCESS; } #else @@ -44016,7 +45548,7 @@ static MA_INLINE void ma_pcm_s16_to_s32__reference(void* dst, const void* src, m ma_uint64 i; for (i = 0; i < count; i += 1) { - dst_s32[i] = src_s16[i] << 16; + dst_s32[i] = (ma_int32)src_s16[i] << 16; } (void)ditherMode; @@ -49347,15 +50879,15 @@ static /*__attribute__((noinline))*/ ma_result ma_gainer_process_pcm_frames_inte a += d; } } + + pFramesOut = ma_offset_ptr(pFramesOut, interpolatedFrameCount * sizeof(float)); + pFramesIn = ma_offset_ptr(pFramesIn, interpolatedFrameCount * sizeof(float)); } + frameCount -= interpolatedFrameCount; + /* Make sure the timer is updated. */ pGainer->t = (ma_uint32)ma_min(pGainer->t + interpolatedFrameCount, pGainer->config.smoothTimeInFrames); - - /* Adjust our arguments so the next part can work normally. */ - frameCount -= interpolatedFrameCount; - pFramesOut = ma_offset_ptr(pFramesOut, interpolatedFrameCount * sizeof(float)); - pFramesIn = ma_offset_ptr(pFramesIn, interpolatedFrameCount * sizeof(float)); } /* All we need to do here is apply the new gains using an optimized path. */ @@ -50783,13 +52315,16 @@ static float ma_calculate_angular_gain(ma_vec3f dirA, ma_vec3f dirB, float coneI MA_API ma_result ma_spatializer_process_pcm_frames(ma_spatializer* pSpatializer, ma_spatializer_listener* pListener, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) { - ma_channel* pChannelMapIn = pSpatializer->pChannelMapIn; - ma_channel* pChannelMapOut = pListener->config.pChannelMapOut; + ma_channel* pChannelMapIn; + ma_channel* pChannelMapOut; - if (pSpatializer == NULL) { + if (pSpatializer == NULL || pListener == NULL) { return MA_INVALID_ARGS; } + pChannelMapIn = pSpatializer->pChannelMapIn; + pChannelMapOut = pListener->config.pChannelMapOut; + /* If we're not spatializing we need to run an optimized path. */ if (ma_atomic_load_i32(&pSpatializer->attenuationModel) == ma_attenuation_model_none) { if (ma_spatializer_listener_is_enabled(pListener)) { @@ -50834,23 +52369,17 @@ MA_API ma_result ma_spatializer_process_pcm_frames(ma_spatializer* pSpatializer, We'll need the listener velocity for doppler pitch calculations. The speed of sound is defined by the listener, so we'll grab that here too. */ - if (pListener != NULL) { - listenerVel = ma_spatializer_listener_get_velocity(pListener); - speedOfSound = pListener->config.speedOfSound; - } else { - listenerVel = ma_vec3f_init_3f(0, 0, 0); - speedOfSound = MA_DEFAULT_SPEED_OF_SOUND; - } + listenerVel = ma_spatializer_listener_get_velocity(pListener); + speedOfSound = pListener->config.speedOfSound; - if (pListener == NULL || ma_spatializer_get_positioning(pSpatializer) == ma_positioning_relative) { - /* There's no listener or we're using relative positioning. */ + if (ma_spatializer_get_positioning(pSpatializer) == ma_positioning_relative) { relativePos = ma_spatializer_get_position(pSpatializer); relativeDir = ma_spatializer_get_direction(pSpatializer); } else { /* - We've found a listener and we're using absolute positioning. We need to transform the - sound's position and direction so that it's relative to listener. Later on we'll use - this for determining the factors to apply to each channel to apply the panning effect. + We're using absolute positioning. We need to transform the sound's position and + direction so that it's relative to listener. Later on we'll use this for determining + the factors to apply to each channel to apply the panning effect. */ ma_spatializer_get_relative_position_and_direction(pSpatializer, pListener, &relativePos, &relativeDir); } @@ -52885,7 +54414,7 @@ static ma_bool32 ma_is_spatial_channel_position(ma_channel channelPosition) return MA_FALSE; } - if (channelPosition >= MA_CHANNEL_AUX_0 && channelPosition <= MA_CHANNEL_AUX_31) { + if (channelPosition >= MA_CHANNEL_AUX_0) { return MA_FALSE; } @@ -56408,8 +57937,12 @@ MA_API size_t ma_channel_map_to_string(const ma_channel* pChannelMap, ma_uint32 } /* Null terminate. Don't increment the length here. */ - if (pBufferOut != NULL && bufferCap > len + 1) { - pBufferOut[len] = '\0'; + if (pBufferOut != NULL) { + if (bufferCap > len) { + pBufferOut[len] = '\0'; + } else if (bufferCap > 0) { + pBufferOut[bufferCap - 1] = '\0'; + } } return len; @@ -56620,7 +58153,7 @@ MA_API ma_result ma_rb_init_ex(size_t subbufferSizeInBytes, size_t subbufferCoun Here is where we allocate our own buffer. We always want to align this to MA_SIMD_ALIGNMENT for future SIMD optimization opportunity. To do this we need to make sure the stride is a multiple of MA_SIMD_ALIGNMENT. */ - pRB->subbufferStrideInBytes = (pRB->subbufferSizeInBytes + (MA_SIMD_ALIGNMENT-1)) & ~MA_SIMD_ALIGNMENT; + pRB->subbufferStrideInBytes = ma_align(pRB->subbufferSizeInBytes, MA_SIMD_ALIGNMENT); bufferSizeInBytes = (size_t)pRB->subbufferCount*pRB->subbufferStrideInBytes; pRB->pBuffer = ma_aligned_malloc(bufferSizeInBytes, MA_SIMD_ALIGNMENT, &pRB->allocationCallbacks); @@ -59515,7 +61048,7 @@ MA_API ma_result ma_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo } -#if !defined(MA_USE_WIN32_FILEIO) && (defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) && !defined(MA_POSIX)) +#if !defined(MA_USE_WIN32_FILEIO) && (defined(MA_WIN32) && (defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_NXDK)) && !defined(MA_NO_WIN32_FILEIO) && !defined(MA_POSIX)) #define MA_USE_WIN32_FILEIO #endif @@ -59592,25 +61125,34 @@ static ma_result ma_default_vfs_open__win32(ma_vfs* pVFS, const char* pFilePath, static ma_result ma_default_vfs_open_w__win32(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) { - HANDLE hFile; - DWORD dwDesiredAccess; - DWORD dwShareMode; - DWORD dwCreationDisposition; + #if !defined(MA_XBOX_NXDK) + { + HANDLE hFile; + DWORD dwDesiredAccess; + DWORD dwShareMode; + DWORD dwCreationDisposition; - (void)pVFS; + (void)pVFS; - /* Load some Win32 symbols dynamically so we can dynamically check for the existence of SetFilePointerEx. */ - ma_win32_fileio_init(); + /* Load some Win32 symbols dynamically so we can dynamically check for the existence of SetFilePointerEx. */ + ma_win32_fileio_init(); - ma_default_vfs__get_open_settings_win32(openMode, &dwDesiredAccess, &dwShareMode, &dwCreationDisposition); + ma_default_vfs__get_open_settings_win32(openMode, &dwDesiredAccess, &dwShareMode, &dwCreationDisposition); - hFile = CreateFileW(pFilePath, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) { - return ma_result_from_GetLastError(GetLastError()); + hFile = CreateFileW(pFilePath, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) { + return ma_result_from_GetLastError(GetLastError()); + } + + *pFile = hFile; + return MA_SUCCESS; } - - *pFile = hFile; - return MA_SUCCESS; + #else + { + /* No CreateFileW() available. */ + return MA_NOT_IMPLEMENTED; + } + #endif } static ma_result ma_default_vfs_close__win32(ma_vfs* pVFS, ma_vfs_file file) @@ -59781,19 +61323,28 @@ static ma_result ma_default_vfs_tell__win32(ma_vfs* pVFS, ma_vfs_file file, ma_i static ma_result ma_default_vfs_info__win32(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo) { - BY_HANDLE_FILE_INFORMATION fi; - BOOL result; - (void)pVFS; - result = GetFileInformationByHandle((HANDLE)file, &fi); - if (result == 0) { - return ma_result_from_GetLastError(GetLastError()); + #if !defined(MA_XBOX_NXDK) + { + BY_HANDLE_FILE_INFORMATION fi; + BOOL result; + + result = GetFileInformationByHandle((HANDLE)file, &fi); + if (result == 0) { + return ma_result_from_GetLastError(GetLastError()); + } + + pInfo->sizeInBytes = ((ma_uint64)fi.nFileSizeHigh << 32) | ((ma_uint64)fi.nFileSizeLow); + + return MA_SUCCESS; } - - pInfo->sizeInBytes = ((ma_uint64)fi.nFileSizeHigh << 32) | ((ma_uint64)fi.nFileSizeLow); - - return MA_SUCCESS; + #else + { + /* GetFileInformationByHandle() is unavailable. */ + return MA_NOT_IMPLEMENTED; + } + #endif } #else static ma_result ma_default_vfs_open__stdio(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) @@ -60131,6 +61682,8 @@ static ma_result ma_default_vfs_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* p static ma_result ma_default_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo) { + ma_result result; + if (pInfo == NULL) { return MA_INVALID_ARGS; } @@ -60142,10 +61695,42 @@ static ma_result ma_default_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_inf } #if defined(MA_USE_WIN32_FILEIO) - return ma_default_vfs_info__win32(pVFS, file, pInfo); + result = ma_default_vfs_info__win32(pVFS, file, pInfo); #else - return ma_default_vfs_info__stdio(pVFS, file, pInfo); + result = ma_default_vfs_info__stdio(pVFS, file, pInfo); #endif + + if (result == MA_NOT_IMPLEMENTED) { + /* Not implemented. Fall back to seek/tell/seek. */ + ma_int64 cursor; + ma_int64 sizeInBytes; + + result = ma_default_vfs_tell(pVFS, file, &cursor); + if (result != MA_SUCCESS) { + return result; + } + + result = ma_default_vfs_seek(pVFS, file, 0, ma_seek_origin_end); + if (result != MA_SUCCESS) { + return result; + } + + result = ma_default_vfs_tell(pVFS, file, &sizeInBytes); + if (result != MA_SUCCESS) { + return result; + } + + pInfo->sizeInBytes = sizeInBytes; + + result = ma_default_vfs_seek(pVFS, file, cursor, ma_seek_origin_start); + if (result != MA_SUCCESS) { + return result; + } + + MA_ASSERT(result == MA_SUCCESS); + } + + return result; } @@ -60324,6 +61909,8 @@ Decoding and Encoding Headers. These are auto-generated from a tool. **************************************************************************************************************************************************************/ #if !defined(MA_NO_WAV) && (!defined(MA_NO_DECODING) || !defined(MA_NO_ENCODING)) +#define MA_HAS_WAV + /* dr_wav_h begin */ #ifndef ma_dr_wav_h #define ma_dr_wav_h @@ -60333,8 +61920,8 @@ extern "C" { #define MA_DR_WAV_STRINGIFY(x) #x #define MA_DR_WAV_XSTRINGIFY(x) MA_DR_WAV_STRINGIFY(x) #define MA_DR_WAV_VERSION_MAJOR 0 -#define MA_DR_WAV_VERSION_MINOR 13 -#define MA_DR_WAV_VERSION_REVISION 18 +#define MA_DR_WAV_VERSION_MINOR 14 +#define MA_DR_WAV_VERSION_REVISION 4 #define MA_DR_WAV_VERSION_STRING MA_DR_WAV_XSTRINGIFY(MA_DR_WAV_VERSION_MAJOR) "." MA_DR_WAV_XSTRINGIFY(MA_DR_WAV_VERSION_MINOR) "." MA_DR_WAV_XSTRINGIFY(MA_DR_WAV_VERSION_REVISION) #include #define MA_DR_WAVE_FORMAT_PCM 0x1 @@ -60350,8 +61937,9 @@ MA_API void ma_dr_wav_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* p MA_API const char* ma_dr_wav_version_string(void); typedef enum { - ma_dr_wav_seek_origin_start, - ma_dr_wav_seek_origin_current + MA_DR_WAV_SEEK_SET, + MA_DR_WAV_SEEK_CUR, + MA_DR_WAV_SEEK_END } ma_dr_wav_seek_origin; typedef enum { @@ -60388,6 +61976,7 @@ MA_API ma_uint16 ma_dr_wav_fmt_get_format(const ma_dr_wav_fmt* pFMT); typedef size_t (* ma_dr_wav_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); typedef size_t (* ma_dr_wav_write_proc)(void* pUserData, const void* pData, size_t bytesToWrite); typedef ma_bool32 (* ma_dr_wav_seek_proc)(void* pUserData, int offset, ma_dr_wav_seek_origin origin); +typedef ma_bool32 (* ma_dr_wav_tell_proc)(void* pUserData, ma_int64* pCursor); typedef ma_uint64 (* ma_dr_wav_chunk_proc)(void* pChunkUserData, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pReadSeekUserData, const ma_dr_wav_chunk_header* pChunkHeader, ma_dr_wav_container container, const ma_dr_wav_fmt* pFMT); typedef struct { @@ -60432,6 +62021,11 @@ typedef enum ma_dr_wav_metadata_type_list_info_genre = 1 << 15, ma_dr_wav_metadata_type_list_info_album = 1 << 16, ma_dr_wav_metadata_type_list_info_tracknumber = 1 << 17, + ma_dr_wav_metadata_type_list_info_location = 1 << 18, + ma_dr_wav_metadata_type_list_info_organization = 1 << 19, + ma_dr_wav_metadata_type_list_info_keywords = 1 << 20, + ma_dr_wav_metadata_type_list_info_medium = 1 << 21, + ma_dr_wav_metadata_type_list_info_description = 1 << 22, ma_dr_wav_metadata_type_list_all_info_strings = ma_dr_wav_metadata_type_list_info_software | ma_dr_wav_metadata_type_list_info_copyright | ma_dr_wav_metadata_type_list_info_title @@ -60440,7 +62034,12 @@ typedef enum | ma_dr_wav_metadata_type_list_info_date | ma_dr_wav_metadata_type_list_info_genre | ma_dr_wav_metadata_type_list_info_album - | ma_dr_wav_metadata_type_list_info_tracknumber, + | ma_dr_wav_metadata_type_list_info_tracknumber + | ma_dr_wav_metadata_type_list_info_location + | ma_dr_wav_metadata_type_list_info_organization + | ma_dr_wav_metadata_type_list_info_keywords + | ma_dr_wav_metadata_type_list_info_medium + | ma_dr_wav_metadata_type_list_info_description, ma_dr_wav_metadata_type_list_all_adtl = ma_dr_wav_metadata_type_list_label | ma_dr_wav_metadata_type_list_note | ma_dr_wav_metadata_type_list_labelled_cue_region, @@ -60457,8 +62056,8 @@ typedef struct { ma_uint32 cuePointId; ma_uint32 type; - ma_uint32 firstSampleByteOffset; - ma_uint32 lastSampleByteOffset; + ma_uint32 firstSampleOffset; + ma_uint32 lastSampleOffset; ma_uint32 sampleFraction; ma_uint32 playCount; } ma_dr_wav_smpl_loop; @@ -60493,7 +62092,7 @@ typedef struct ma_uint8 dataChunkId[4]; ma_uint32 chunkStart; ma_uint32 blockStart; - ma_uint32 sampleByteOffset; + ma_uint32 sampleOffset; } ma_dr_wav_cue_point; typedef struct { @@ -60595,6 +62194,7 @@ typedef struct ma_dr_wav_read_proc onRead; ma_dr_wav_write_proc onWrite; ma_dr_wav_seek_proc onSeek; + ma_dr_wav_tell_proc onTell; void* pUserData; ma_allocation_callbacks allocationCallbacks; ma_dr_wav_container container; @@ -60637,9 +62237,9 @@ typedef struct ma_bool8 isUnsigned; } aiff; } ma_dr_wav; -MA_API ma_bool32 ma_dr_wav_init(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_bool32 ma_dr_wav_init_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_bool32 ma_dr_wav_init_with_metadata(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_bool32 ma_dr_wav_init(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_bool32 ma_dr_wav_init_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, ma_dr_wav_chunk_proc onChunk, void* pReadSeekTellUserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_bool32 ma_dr_wav_init_with_metadata(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_write(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_dr_wav_write_proc onWrite, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_write_sequential(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, ma_dr_wav_write_proc onWrite, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_write_sequential_pcm_frames(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, ma_dr_wav_write_proc onWrite, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); @@ -60711,9 +62311,9 @@ MA_API ma_bool32 ma_dr_wav_init_memory_write(ma_dr_wav* pWav, void** ppData, siz MA_API ma_bool32 ma_dr_wav_init_memory_write_sequential(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_memory_write_sequential_pcm_frames(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); #ifndef MA_DR_WAV_NO_CONVERSION_API -MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); #ifndef MA_DR_WAV_NO_STDIO MA_API ma_int16* ma_dr_wav_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); MA_API float* ma_dr_wav_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); @@ -60744,6 +62344,8 @@ MA_API ma_bool32 ma_dr_wav_fourcc_equal(const ma_uint8* a, const char* b); #endif /* MA_NO_WAV */ #if !defined(MA_NO_FLAC) && !defined(MA_NO_DECODING) +#define MA_HAS_FLAC + /* dr_flac_h begin */ #ifndef ma_dr_flac_h #define ma_dr_flac_h @@ -60753,8 +62355,8 @@ extern "C" { #define MA_DR_FLAC_STRINGIFY(x) #x #define MA_DR_FLAC_XSTRINGIFY(x) MA_DR_FLAC_STRINGIFY(x) #define MA_DR_FLAC_VERSION_MAJOR 0 -#define MA_DR_FLAC_VERSION_MINOR 12 -#define MA_DR_FLAC_VERSION_REVISION 43 +#define MA_DR_FLAC_VERSION_MINOR 13 +#define MA_DR_FLAC_VERSION_REVISION 3 #define MA_DR_FLAC_VERSION_STRING MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_MAJOR) "." MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_MINOR) "." MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_REVISION) #include #if defined(_MSC_VER) && _MSC_VER >= 1700 @@ -60817,8 +62419,9 @@ typedef enum } ma_dr_flac_container; typedef enum { - ma_dr_flac_seek_origin_start, - ma_dr_flac_seek_origin_current + MA_DR_FLAC_SEEK_SET, + MA_DR_FLAC_SEEK_CUR, + MA_DR_FLAC_SEEK_END } ma_dr_flac_seek_origin; typedef struct { @@ -60841,8 +62444,9 @@ typedef struct typedef struct { ma_uint32 type; - const void* pRawData; ma_uint32 rawDataSize; + ma_uint64 rawDataOffset; + const void* pRawData; union { ma_dr_flac_streaminfo streaminfo; @@ -60888,12 +62492,14 @@ typedef struct ma_uint32 colorDepth; ma_uint32 indexColorCount; ma_uint32 pictureDataSize; + ma_uint64 pictureDataOffset; const ma_uint8* pPictureData; } picture; } data; } ma_dr_flac_metadata; typedef size_t (* ma_dr_flac_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); typedef ma_bool32 (* ma_dr_flac_seek_proc)(void* pUserData, int offset, ma_dr_flac_seek_origin origin); +typedef ma_bool32 (* ma_dr_flac_tell_proc)(void* pUserData, ma_int64* pCursor); typedef void (* ma_dr_flac_meta_proc)(void* pUserData, ma_dr_flac_metadata* pMetadata); typedef struct { @@ -60905,6 +62511,7 @@ typedef struct { ma_dr_flac_read_proc onRead; ma_dr_flac_seek_proc onSeek; + ma_dr_flac_tell_proc onTell; void* pUserData; size_t unalignedByteCount; ma_dr_flac_cache_t unalignedCache; @@ -60964,10 +62571,10 @@ typedef struct ma_dr_flac_bs bs; ma_uint8 pExtraData[1]; } ma_dr_flac; -MA_API ma_dr_flac* ma_dr_flac_open(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_dr_flac* ma_dr_flac_open_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_dr_flac* ma_dr_flac_open_with_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_dr_flac* ma_dr_flac_open_with_metadata_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_dr_flac* ma_dr_flac_open(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_dr_flac* ma_dr_flac_open_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_dr_flac* ma_dr_flac_open_with_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_dr_flac* ma_dr_flac_open_with_metadata_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API void ma_dr_flac_close(ma_dr_flac* pFlac); MA_API ma_uint64 ma_dr_flac_read_pcm_frames_s32(ma_dr_flac* pFlac, ma_uint64 framesToRead, ma_int32* pBufferOut); MA_API ma_uint64 ma_dr_flac_read_pcm_frames_s16(ma_dr_flac* pFlac, ma_uint64 framesToRead, ma_int16* pBufferOut); @@ -60981,9 +62588,9 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata_w(const wchar_t* pFileName #endif MA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_t dataSize, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); #ifndef MA_DR_FLAC_NO_STDIO MA_API ma_int32* ma_dr_flac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_int16* ma_dr_flac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); @@ -61031,6 +62638,14 @@ MA_API ma_bool32 ma_dr_flac_next_cuesheet_track(ma_dr_flac_cuesheet_track_iterat #endif /* MA_NO_FLAC */ #if !defined(MA_NO_MP3) && !defined(MA_NO_DECODING) +#define MA_HAS_MP3 + +#ifndef MA_DR_MP3_NO_SIMD + #if (defined(MA_NO_NEON) && defined(MA_ARM)) || (defined(MA_NO_SSE2) && (defined(MA_X86) || defined(MA_X64))) + #define MA_DR_MP3_NO_SIMD + #endif +#endif + /* dr_mp3_h begin */ #ifndef ma_dr_mp3_h #define ma_dr_mp3_h @@ -61040,31 +62655,57 @@ extern "C" { #define MA_DR_MP3_STRINGIFY(x) #x #define MA_DR_MP3_XSTRINGIFY(x) MA_DR_MP3_STRINGIFY(x) #define MA_DR_MP3_VERSION_MAJOR 0 -#define MA_DR_MP3_VERSION_MINOR 6 -#define MA_DR_MP3_VERSION_REVISION 40 +#define MA_DR_MP3_VERSION_MINOR 7 +#define MA_DR_MP3_VERSION_REVISION 3 #define MA_DR_MP3_VERSION_STRING MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_MAJOR) "." MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_MINOR) "." MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_REVISION) #include #define MA_DR_MP3_MAX_PCM_FRAMES_PER_MP3_FRAME 1152 #define MA_DR_MP3_MAX_SAMPLES_PER_FRAME (MA_DR_MP3_MAX_PCM_FRAMES_PER_MP3_FRAME*2) MA_API void ma_dr_mp3_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision); MA_API const char* ma_dr_mp3_version_string(void); +#define MA_DR_MP3_MAX_BITRESERVOIR_BYTES 511 +#define MA_DR_MP3_MAX_FREE_FORMAT_FRAME_SIZE 2304 +#define MA_DR_MP3_MAX_L3_FRAME_PAYLOAD_BYTES MA_DR_MP3_MAX_FREE_FORMAT_FRAME_SIZE typedef struct { - int frame_bytes, channels, hz, layer, bitrate_kbps; + int frame_bytes, channels, sample_rate, layer, bitrate_kbps; } ma_dr_mp3dec_frame_info; typedef struct +{ + const ma_uint8 *buf; + int pos, limit; +} ma_dr_mp3_bs; +typedef struct +{ + const ma_uint8 *sfbtab; + ma_uint16 part_23_length, big_values, scalefac_compress; + ma_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb; + ma_uint8 table_select[3], region_count[3], subblock_gain[3]; + ma_uint8 preflag, scalefac_scale, count1_table, scfsi; +} ma_dr_mp3_L3_gr_info; +typedef struct +{ + ma_dr_mp3_bs bs; + ma_uint8 maindata[MA_DR_MP3_MAX_BITRESERVOIR_BYTES + MA_DR_MP3_MAX_L3_FRAME_PAYLOAD_BYTES]; + ma_dr_mp3_L3_gr_info gr_info[4]; + float grbuf[2][576], scf[40], syn[18 + 15][2*32]; + ma_uint8 ist_pos[2][39]; +} ma_dr_mp3dec_scratch; +typedef struct { float mdct_overlap[2][9*32], qmf_state[15*2*32]; int reserv, free_format_bytes; ma_uint8 header[4], reserv_buf[511]; + ma_dr_mp3dec_scratch scratch; } ma_dr_mp3dec; MA_API void ma_dr_mp3dec_init(ma_dr_mp3dec *dec); MA_API int ma_dr_mp3dec_decode_frame(ma_dr_mp3dec *dec, const ma_uint8 *mp3, int mp3_bytes, void *pcm, ma_dr_mp3dec_frame_info *info); MA_API void ma_dr_mp3dec_f32_to_s16(const float *in, ma_int16 *out, size_t num_samples); typedef enum { - ma_dr_mp3_seek_origin_start, - ma_dr_mp3_seek_origin_current + MA_DR_MP3_SEEK_SET, + MA_DR_MP3_SEEK_CUR, + MA_DR_MP3_SEEK_END } ma_dr_mp3_seek_origin; typedef struct { @@ -61073,8 +62714,24 @@ typedef struct ma_uint16 mp3FramesToDiscard; ma_uint16 pcmFramesToDiscard; } ma_dr_mp3_seek_point; +typedef enum +{ + MA_DR_MP3_METADATA_TYPE_ID3V1, + MA_DR_MP3_METADATA_TYPE_ID3V2, + MA_DR_MP3_METADATA_TYPE_APE, + MA_DR_MP3_METADATA_TYPE_XING, + MA_DR_MP3_METADATA_TYPE_VBRI +} ma_dr_mp3_metadata_type; +typedef struct +{ + ma_dr_mp3_metadata_type type; + const void* pRawData; + size_t rawDataSize; +} ma_dr_mp3_metadata; typedef size_t (* ma_dr_mp3_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); typedef ma_bool32 (* ma_dr_mp3_seek_proc)(void* pUserData, int offset, ma_dr_mp3_seek_origin origin); +typedef ma_bool32 (* ma_dr_mp3_tell_proc)(void* pUserData, ma_int64* pCursor); +typedef void (* ma_dr_mp3_meta_proc)(void* pUserData, const ma_dr_mp3_metadata* pMetadata); typedef struct { ma_uint32 channels; @@ -61087,7 +62744,9 @@ typedef struct ma_uint32 sampleRate; ma_dr_mp3_read_proc onRead; ma_dr_mp3_seek_proc onSeek; + ma_dr_mp3_meta_proc onMeta; void* pUserData; + void* pUserDataMeta; ma_allocation_callbacks allocationCallbacks; ma_uint32 mp3FrameChannels; ma_uint32 mp3FrameSampleRate; @@ -61096,13 +62755,20 @@ typedef struct ma_uint8 pcmFrames[sizeof(float)*MA_DR_MP3_MAX_SAMPLES_PER_FRAME]; ma_uint64 currentPCMFrame; ma_uint64 streamCursor; + ma_uint64 streamLength; + ma_uint64 streamStartOffset; ma_dr_mp3_seek_point* pSeekPoints; ma_uint32 seekPointCount; + ma_uint32 delayInPCMFrames; + ma_uint32 paddingInPCMFrames; + ma_uint64 totalPCMFrameCount; + ma_bool32 isVBR; + ma_bool32 isCBR; size_t dataSize; size_t dataCapacity; size_t dataConsumed; ma_uint8* pData; - ma_bool32 atEnd : 1; + ma_bool32 atEnd; struct { const ma_uint8* pData; @@ -61110,9 +62776,12 @@ typedef struct size_t currentReadPos; } memory; } ma_dr_mp3; -MA_API ma_bool32 ma_dr_mp3_init(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_bool32 ma_dr_mp3_init(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, ma_dr_mp3_tell_proc onTell, ma_dr_mp3_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_bool32 ma_dr_mp3_init_memory_with_metadata(ma_dr_mp3* pMP3, const void* pData, size_t dataSize, ma_dr_mp3_meta_proc onMeta, void* pUserDataMeta, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_mp3_init_memory(ma_dr_mp3* pMP3, const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks); #ifndef MA_DR_MP3_NO_STDIO +MA_API ma_bool32 ma_dr_mp3_init_file_with_metadata(ma_dr_mp3* pMP3, const char* pFilePath, ma_dr_mp3_meta_proc onMeta, void* pUserDataMeta, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_bool32 ma_dr_mp3_init_file_with_metadata_w(ma_dr_mp3* pMP3, const wchar_t* pFilePath, ma_dr_mp3_meta_proc onMeta, void* pUserDataMeta, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_mp3_init_file(ma_dr_mp3* pMP3, const char* pFilePath, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_mp3_init_file_w(ma_dr_mp3* pMP3, const wchar_t* pFilePath, const ma_allocation_callbacks* pAllocationCallbacks); #endif @@ -61125,8 +62794,8 @@ MA_API ma_uint64 ma_dr_mp3_get_mp3_frame_count(ma_dr_mp3* pMP3); MA_API ma_bool32 ma_dr_mp3_get_mp3_and_pcm_frame_count(ma_dr_mp3* pMP3, ma_uint64* pMP3FrameCount, ma_uint64* pPCMFrameCount); MA_API ma_bool32 ma_dr_mp3_calculate_seek_points(ma_dr_mp3* pMP3, ma_uint32* pSeekPointCount, ma_dr_mp3_seek_point* pSeekPoints); MA_API ma_bool32 ma_dr_mp3_bind_seek_table(ma_dr_mp3* pMP3, ma_uint32 seekPointCount, ma_dr_mp3_seek_point* pSeekPoints); -MA_API float* ma_dr_mp3_open_and_read_pcm_frames_f32(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_int16* ma_dr_mp3_open_and_read_pcm_frames_s16(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API float* ma_dr_mp3_open_and_read_pcm_frames_f32(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, ma_dr_mp3_tell_proc onTell, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); +MA_API ma_int16* ma_dr_mp3_open_and_read_pcm_frames_s16(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, ma_dr_mp3_tell_proc onTell, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API float* ma_dr_mp3_open_memory_and_read_pcm_frames_f32(const void* pData, size_t dataSize, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_int16* ma_dr_mp3_open_memory_and_read_pcm_frames_s16(const void* pData, size_t dataSize, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); #ifndef MA_DR_MP3_NO_STDIO @@ -61591,7 +63260,6 @@ static ma_result ma_decoder_init_custom_from_memory__internal(const void* pData, /* WAV */ #ifdef ma_dr_wav_h -#define MA_HAS_WAV typedef struct { @@ -61679,8 +63347,10 @@ static ma_bool32 ma_wav_dr_callback__seek(void* pUserData, int offset, ma_dr_wav MA_ASSERT(pWav != NULL); maSeekOrigin = ma_seek_origin_start; - if (origin == ma_dr_wav_seek_origin_current) { - maSeekOrigin = ma_seek_origin_current; + if (origin == MA_DR_WAV_SEEK_CUR) { + maSeekOrigin = ma_seek_origin_current; + } else if (origin == MA_DR_WAV_SEEK_END) { + maSeekOrigin = ma_seek_origin_end; } result = pWav->onSeek(pWav->pReadSeekTellUserData, offset, maSeekOrigin); @@ -61690,6 +63360,26 @@ static ma_bool32 ma_wav_dr_callback__seek(void* pUserData, int offset, ma_dr_wav return MA_TRUE; } + +static ma_bool32 ma_wav_dr_callback__tell(void* pUserData, ma_int64* pCursor) +{ + ma_wav* pWav = (ma_wav*)pUserData; + ma_result result; + + MA_ASSERT(pWav != NULL); + MA_ASSERT(pCursor != NULL); + + if (pWav->onTell == NULL) { + return MA_FALSE; /* Not implemented. */ + } + + result = pWav->onTell(pWav->pReadSeekTellUserData, pCursor); + if (result != MA_SUCCESS) { + return MA_FALSE; /* Failed to tell. */ + } + + return MA_TRUE; +} #endif static ma_result ma_wav_init_internal(const ma_decoding_backend_config* pConfig, ma_wav* pWav) @@ -61784,7 +63474,7 @@ MA_API ma_result ma_wav_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_p { ma_bool32 wavResult; - wavResult = ma_dr_wav_init(&pWav->dr, ma_wav_dr_callback__read, ma_wav_dr_callback__seek, pWav, pAllocationCallbacks); + wavResult = ma_dr_wav_init(&pWav->dr, ma_wav_dr_callback__read, ma_wav_dr_callback__seek, ma_wav_dr_callback__tell, pWav, pAllocationCallbacks); if (wavResult != MA_TRUE) { return MA_INVALID_FILE; } @@ -62275,7 +63965,6 @@ static ma_result ma_decoder_init_wav_from_memory__internal(const void* pData, si /* FLAC */ #ifdef ma_dr_flac_h -#define MA_HAS_FLAC typedef struct { @@ -62363,8 +64052,10 @@ static ma_bool32 ma_flac_dr_callback__seek(void* pUserData, int offset, ma_dr_fl MA_ASSERT(pFlac != NULL); maSeekOrigin = ma_seek_origin_start; - if (origin == ma_dr_flac_seek_origin_current) { - maSeekOrigin = ma_seek_origin_current; + if (origin == MA_DR_FLAC_SEEK_CUR) { + maSeekOrigin = ma_seek_origin_current; + } else if (origin == MA_DR_FLAC_SEEK_END) { + maSeekOrigin = ma_seek_origin_end; } result = pFlac->onSeek(pFlac->pReadSeekTellUserData, offset, maSeekOrigin); @@ -62374,6 +64065,26 @@ static ma_bool32 ma_flac_dr_callback__seek(void* pUserData, int offset, ma_dr_fl return MA_TRUE; } + +static ma_bool32 ma_flac_dr_callback__tell(void* pUserData, ma_int64* pCursor) +{ + ma_flac* pFlac = (ma_flac*)pUserData; + ma_result result; + + MA_ASSERT(pFlac != NULL); + MA_ASSERT(pCursor != NULL); + + if (pFlac->onTell == NULL) { + return MA_FALSE; /* Not implemented. */ + } + + result = pFlac->onTell(pFlac->pReadSeekTellUserData, pCursor); + if (result != MA_SUCCESS) { + return MA_FALSE; /* Failed to tell. */ + } + + return MA_TRUE; +} #endif static ma_result ma_flac_init_internal(const ma_decoding_backend_config* pConfig, ma_flac* pFlac) @@ -62425,7 +64136,7 @@ MA_API ma_result ma_flac_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_ #if !defined(MA_NO_FLAC) { - pFlac->dr = ma_dr_flac_open(ma_flac_dr_callback__read, ma_flac_dr_callback__seek, pFlac, pAllocationCallbacks); + pFlac->dr = ma_dr_flac_open(ma_flac_dr_callback__read, ma_flac_dr_callback__seek, ma_flac_dr_callback__tell, pFlac, pAllocationCallbacks); if (pFlac->dr == NULL) { return MA_INVALID_FILE; } @@ -62897,7 +64608,6 @@ static ma_result ma_decoder_init_flac_from_memory__internal(const void* pData, s /* MP3 */ #ifdef ma_dr_mp3_h -#define MA_HAS_MP3 typedef struct { @@ -62986,9 +64696,12 @@ static ma_bool32 ma_mp3_dr_callback__seek(void* pUserData, int offset, ma_dr_mp3 MA_ASSERT(pMP3 != NULL); - maSeekOrigin = ma_seek_origin_start; - if (origin == ma_dr_mp3_seek_origin_current) { - maSeekOrigin = ma_seek_origin_current; + if (origin == MA_DR_MP3_SEEK_SET) { + maSeekOrigin = ma_seek_origin_start; + } else if (origin == MA_DR_MP3_SEEK_END) { + maSeekOrigin = ma_seek_origin_end; + } else { + maSeekOrigin = ma_seek_origin_current; } result = pMP3->onSeek(pMP3->pReadSeekTellUserData, offset, maSeekOrigin); @@ -62998,6 +64711,21 @@ static ma_bool32 ma_mp3_dr_callback__seek(void* pUserData, int offset, ma_dr_mp3 return MA_TRUE; } + +static ma_bool32 ma_mp3_dr_callback__tell(void* pUserData, ma_int64* pCursor) +{ + ma_mp3* pMP3 = (ma_mp3*)pUserData; + ma_result result; + + MA_ASSERT(pMP3 != NULL); + + result = pMP3->onTell(pMP3->pReadSeekTellUserData, pCursor); + if (result != MA_SUCCESS) { + return MA_FALSE; + } + + return MA_TRUE; +} #endif static ma_result ma_mp3_init_internal(const ma_decoding_backend_config* pConfig, ma_mp3* pMP3) @@ -63098,7 +64826,7 @@ MA_API ma_result ma_mp3_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_p { ma_bool32 mp3Result; - mp3Result = ma_dr_mp3_init(&pMP3->dr, ma_mp3_dr_callback__read, ma_mp3_dr_callback__seek, pMP3, pAllocationCallbacks); + mp3Result = ma_dr_mp3_init(&pMP3->dr, ma_mp3_dr_callback__read, ma_mp3_dr_callback__seek, ma_mp3_dr_callback__tell, NULL, pMP3, pAllocationCallbacks); if (mp3Result != MA_TRUE) { return MA_INVALID_FILE; } @@ -64557,11 +66285,9 @@ static ma_result ma_decoder_init__internal(ma_decoder_read_proc onRead, ma_decod We use trial and error to open a decoder. We prioritize custom decoders so that if they implement the same encoding format they take priority over the built-in decoders. */ + result = ma_decoder_init_custom__internal(pConfig, pDecoder); if (result != MA_SUCCESS) { - result = ma_decoder_init_custom__internal(pConfig, pDecoder); - if (result != MA_SUCCESS) { - onSeek(pDecoder, 0, ma_seek_origin_start); - } + onSeek(pDecoder, 0, ma_seek_origin_start); } /* @@ -64825,14 +66551,6 @@ MA_API ma_result ma_decoder_init_memory(const void* pData, size_t dataSize, cons /* Initialization was successful. Finish up. */ result = ma_decoder__postinit(&config, pDecoder); if (result != MA_SUCCESS) { - /* - The backend was initialized successfully, but for some reason post-initialization failed. This is most likely - due to an out of memory error. We're going to abort with an error here and not try to recover. - */ - if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) { - pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, &pDecoder->pBackend, &pDecoder->allocationCallbacks); - } - return result; } } else { @@ -64997,14 +66715,16 @@ static ma_bool32 ma_path_extension_equal_w(const wchar_t* path, const wchar_t* e ext1 = extension; ext2 = ma_path_extension_w(path); -#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__) - return _wcsicmp(ext1, ext2) == 0; -#else - /* - I'm not aware of a wide character version of strcasecmp(). I'm therefore converting the extensions to multibyte strings and comparing those. This - isn't the most efficient way to do it, but it should work OK. - */ + #if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__)) && !defined(MA_XBOX_NXDK) { + return _wcsicmp(ext1, ext2) == 0; + } + #elif !defined(MA_XBOX_NXDK) && !defined(MA_DOS) + { + /* + I'm not aware of a wide character version of strcasecmp(). I'm therefore converting the extensions to multibyte strings and comparing those. This + isn't the most efficient way to do it, but it should work OK. + */ char ext1MB[4096]; char ext2MB[4096]; const wchar_t* pext1 = ext1; @@ -65024,7 +66744,13 @@ static ma_bool32 ma_path_extension_equal_w(const wchar_t* path, const wchar_t* e return strcasecmp(ext1MB, ext2MB) == 0; } -#endif + #else + { + /* Getting here means we don't have a way to do a case-sensitive comparison for wide strings. Fall back to a simple case-sensitive comparison. */ + /* TODO: Implement our own wchar_t-to-char conversion routine and then use the char* version for comparing. */ + return ma_wcscmp(ext1, ext2) == 0; + } + #endif } #endif /* MA_HAS_PATH_API */ @@ -65125,11 +66851,9 @@ MA_API ma_result ma_decoder_init_vfs(ma_vfs* pVFS, const char* pFilePath, const We use trial and error to open a decoder. We prioritize custom decoders so that if they implement the same encoding format they take priority over the built-in decoders. */ + result = ma_decoder_init_custom__internal(&config, pDecoder); if (result != MA_SUCCESS) { - result = ma_decoder_init_custom__internal(&config, pDecoder); - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); } /* @@ -65258,11 +66982,9 @@ MA_API ma_result ma_decoder_init_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, c We use trial and error to open a decoder. We prioritize custom decoders so that if they implement the same encoding format they take priority over the built-in decoders. */ + result = ma_decoder_init_custom__internal(&config, pDecoder); if (result != MA_SUCCESS) { - result = ma_decoder_init_custom__internal(&config, pDecoder); - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } + ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); } /* @@ -65444,14 +67166,6 @@ MA_API ma_result ma_decoder_init_file(const char* pFilePath, const ma_decoder_co /* Initialization was successful. Finish up. */ result = ma_decoder__postinit(&config, pDecoder); if (result != MA_SUCCESS) { - /* - The backend was initialized successfully, but for some reason post-initialization failed. This is most likely - due to an out of memory error. We're going to abort with an error here and not try to recover. - */ - if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) { - pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, &pDecoder->pBackend, &pDecoder->allocationCallbacks); - } - return result; } } else { @@ -65594,14 +67308,6 @@ MA_API ma_result ma_decoder_init_file_w(const wchar_t* pFilePath, const ma_decod /* Initialization was successful. Finish up. */ result = ma_decoder__postinit(&config, pDecoder); if (result != MA_SUCCESS) { - /* - The backend was initialized successfully, but for some reason post-initialization failed. This is most likely - due to an out of memory error. We're going to abort with an error here and not try to recover. - */ - if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) { - pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, &pDecoder->pBackend, &pDecoder->allocationCallbacks); - } - return result; } } else { @@ -66119,10 +67825,18 @@ static ma_bool32 ma_encoder__internal_on_seek_wav(void* pUserData, int offset, m { ma_encoder* pEncoder = (ma_encoder*)pUserData; ma_result result; + ma_seek_origin maSeekOrigin; MA_ASSERT(pEncoder != NULL); - result = pEncoder->onSeek(pEncoder, offset, (origin == ma_dr_wav_seek_origin_start) ? ma_seek_origin_start : ma_seek_origin_current); + maSeekOrigin = ma_seek_origin_start; + if (origin == MA_DR_WAV_SEEK_CUR) { + maSeekOrigin = ma_seek_origin_current; + } else if (origin == MA_DR_WAV_SEEK_END) { + maSeekOrigin = ma_seek_origin_end; + } + + result = pEncoder->onSeek(pEncoder, offset, maSeekOrigin); if (result != MA_SUCCESS) { return MA_FALSE; } else { @@ -67644,7 +69358,7 @@ static MA_INLINE ma_uint32 ma_hash_getblock(const ma_uint32* blocks, int i) ma_uint32 block; /* Try silencing a sanitization warning about unaligned access by doing a memcpy() instead of assignment. */ - MA_COPY_MEMORY(&block, ma_offset_ptr(blocks, i * sizeof(block)), sizeof(block)); + MA_COPY_MEMORY(&block, ma_offset_ptr(blocks, i * (int) sizeof(block)), sizeof(block)); if (ma_is_little_endian()) { return block; @@ -67720,7 +69434,7 @@ static ma_uint32 ma_hash_string_32(const char* str) static ma_uint32 ma_hash_string_w_32(const wchar_t* str) { - return ma_hash_32(str, (int)wcslen(str) * sizeof(*str), MA_DEFAULT_HASH_SEED); + return ma_hash_32(str, (int)ma_wcslen(str) * sizeof(*str), MA_DEFAULT_HASH_SEED); } @@ -67880,6 +69594,7 @@ static MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_ return ma_resource_manager_data_buffer_node_find_min(pDataBufferNode->pChildHi); } +#if 0 /* Currently unused, but might make use of this later. */ static MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_buffer_node_find_inorder_predecessor(ma_resource_manager_data_buffer_node* pDataBufferNode) { MA_ASSERT(pDataBufferNode != NULL); @@ -67887,6 +69602,7 @@ static MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_ return ma_resource_manager_data_buffer_node_find_max(pDataBufferNode->pChildLo); } +#endif static ma_result ma_resource_manager_data_buffer_node_remove(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode) { @@ -68237,6 +69953,7 @@ MA_API ma_resource_manager_config ma_resource_manager_config_init(void) config.decodedSampleRate = 0; config.jobThreadCount = 1; /* A single miniaudio-managed job thread by default. */ config.jobQueueCapacity = MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_CAPACITY; + config.resampling = ma_resampler_config_init(ma_format_unknown, 0, 0, 0, ma_resample_algorithm_linear); /* Format/channels/rate doesn't matter here. */ /* Flags. */ config.flags = 0; @@ -68490,6 +70207,7 @@ static ma_decoder_config ma_resource_manager__init_decoder_config(ma_resource_ma config.ppCustomBackendVTables = pResourceManager->config.ppCustomDecodingBackendVTables; config.customBackendCount = pResourceManager->config.customDecodingBackendCount; config.pCustomBackendUserData = pResourceManager->config.pCustomDecodingBackendUserData; + config.resampling = pResourceManager->config.resampling; return config; } @@ -69009,16 +70727,19 @@ static ma_result ma_resource_manager_data_buffer_node_acquire_critical_section(m /* Failed to post job. Probably ran out of memory. */ ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, "Failed to post MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE job. %s.\n", ma_result_description(result)); - /* - Fences were acquired before posting the job, but since the job was not able to - be posted, we need to make sure we release them so nothing gets stuck waiting. - */ - if (pInitFence != NULL) { ma_fence_release(pInitFence); } - if (pDoneFence != NULL) { ma_fence_release(pDoneFence); } - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { ma_resource_manager_inline_notification_uninit(pInitNotification); } else { + /* + Fences were acquired before posting the job, but since the job was not able to + be posted, we need to make sure we release them so nothing gets stuck waiting. + + In the WAIT_INIT case, these will have already been released in ma_job_process() + so we should only release fences in this branch. + */ + if (pInitFence != NULL) { ma_fence_release(pInitFence); } + if (pDoneFence != NULL) { ma_fence_release(pDoneFence); } + /* These will have been freed by the job thread, but with WAIT_INIT they will already have happened since the job has already been handled. */ ma_free(pFilePathCopy, &pResourceManager->config.allocationCallbacks); ma_free(pFilePathWCopy, &pResourceManager->config.allocationCallbacks); @@ -69812,13 +71533,13 @@ MA_API ma_result ma_resource_manager_data_buffer_get_data_format(ma_resource_man MA_API ma_result ma_resource_manager_data_buffer_get_cursor_in_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pCursor) { - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE); - if (pDataBuffer == NULL || pCursor == NULL) { return MA_INVALID_ARGS; } + /* We cannot be using the data source after it's been uninitialized. */ + MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE); + *pCursor = 0; switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode)) @@ -69852,13 +71573,13 @@ MA_API ma_result ma_resource_manager_data_buffer_get_cursor_in_pcm_frames(ma_res MA_API ma_result ma_resource_manager_data_buffer_get_length_in_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pLength) { - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE); - if (pDataBuffer == NULL || pLength == NULL) { return MA_INVALID_ARGS; } + /* We cannot be using the data source after it's been uninitialized. */ + MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE); + if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode) == ma_resource_manager_data_supply_type_unknown) { return MA_BUSY; /* Still loading. */ } @@ -71213,8 +72934,6 @@ static ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* return ma_resource_manager_post_job(pResourceManager, pJob); /* Out of order. */ } - ma_resource_manager_data_buffer_node_free(pResourceManager, pDataBufferNode); - /* The event needs to be signalled last. */ if (pJob->data.resourceManager.freeDataBufferNode.pDoneNotification != NULL) { ma_async_notification_signal(pJob->data.resourceManager.freeDataBufferNode.pDoneNotification); @@ -71225,6 +72944,9 @@ static ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* } ma_atomic_fetch_add_32(&pDataBufferNode->executionPointer, 1); + + ma_resource_manager_data_buffer_node_free(pResourceManager, pDataBufferNode); + return MA_SUCCESS; } @@ -72097,6 +73819,15 @@ MA_API ma_result ma_node_graph_set_time(ma_node_graph* pNodeGraph, ma_uint64 glo return ma_node_set_time(&pNodeGraph->endpoint, globalTime); /* Global time is just the local time of the endpoint. */ } +MA_API ma_uint32 ma_node_graph_get_processing_size_in_frames(const ma_node_graph* pNodeGraph) +{ + if (pNodeGraph == NULL) { + return 0; + } + + return pNodeGraph->processingSizeInFrames; +} + #define MA_NODE_OUTPUT_BUS_FLAG_HAS_READ 0x01 /* Whether or not this bus ready to read more data. Only used on nodes with multiple output buses. */ @@ -73256,12 +74987,12 @@ MA_API ma_node_state ma_node_get_state_by_time_range(const ma_node* pNode, ma_ui its start time not having been reached yet. Also, the stop time may have also been reached in which case it'll be considered stopped. */ - if (ma_node_get_state_time(pNode, ma_node_state_started) > globalTimeBeg) { - return ma_node_state_stopped; /* Start time has not yet been reached. */ + if (ma_node_get_state_time(pNode, ma_node_state_stopped) < globalTimeBeg) { + return ma_node_state_stopped; /* End time is before the start of the range. */ } - if (ma_node_get_state_time(pNode, ma_node_state_stopped) <= globalTimeEnd) { - return ma_node_state_stopped; /* Stop time has been reached. */ + if (ma_node_get_state_time(pNode, ma_node_state_started) > globalTimeEnd) { + return ma_node_state_stopped; /* Start time is after the end of the range. */ } /* Getting here means the node is marked as started and is within its start/stop times. */ @@ -73341,14 +75072,14 @@ static ma_result ma_node_read_pcm_frames(ma_node* pNode, ma_uint32 outputBusInde return MA_INVALID_ARGS; /* Invalid output bus index. */ } + globalTimeBeg = globalTime; + globalTimeEnd = globalTime + frameCount; + /* Don't do anything if we're in a stopped state. */ - if (ma_node_get_state_by_time_range(pNode, globalTime, globalTime + frameCount) != ma_node_state_started) { + if (ma_node_get_state_by_time_range(pNode, globalTimeBeg, globalTimeEnd) != ma_node_state_started) { return MA_SUCCESS; /* We're in a stopped state. This is not an error - we just need to not read anything. */ } - - globalTimeBeg = globalTime; - globalTimeEnd = globalTime + frameCount; startTime = ma_node_get_state_time(pNode, ma_node_state_started); stopTime = ma_node_get_state_time(pNode, ma_node_state_stopped); @@ -73361,11 +75092,16 @@ static ma_result ma_node_read_pcm_frames(ma_node* pNode, ma_uint32 outputBusInde therefore need to offset it by a number of frames to accommodate. The same thing applies for the stop time. */ - timeOffsetBeg = (globalTimeBeg < startTime) ? (ma_uint32)(globalTimeEnd - startTime) : 0; + timeOffsetBeg = (globalTimeBeg < startTime) ? (ma_uint32)(startTime - globalTimeBeg) : 0; timeOffsetEnd = (globalTimeEnd > stopTime) ? (ma_uint32)(globalTimeEnd - stopTime) : 0; /* Trim based on the start offset. We need to silence the start of the buffer. */ if (timeOffsetBeg > 0) { + MA_ASSERT(timeOffsetBeg <= frameCount); + if (timeOffsetBeg > frameCount) { + timeOffsetBeg = frameCount; + } + ma_silence_pcm_frames(pFramesOut, timeOffsetBeg, ma_format_f32, ma_node_get_output_channels(pNode, outputBusIndex)); pFramesOut += timeOffsetBeg * ma_node_get_output_channels(pNode, outputBusIndex); frameCount -= timeOffsetBeg; @@ -73373,6 +75109,11 @@ static ma_result ma_node_read_pcm_frames(ma_node* pNode, ma_uint32 outputBusInde /* Trim based on the end offset. We don't need to silence the tail section because we'll just have a reduced value written to pFramesRead. */ if (timeOffsetEnd > 0) { + MA_ASSERT(timeOffsetEnd <= frameCount); + if (timeOffsetEnd > frameCount) { + timeOffsetEnd = frameCount; + } + frameCount -= timeOffsetEnd; } @@ -74787,12 +76528,20 @@ static void ma_sound_set_at_end(ma_sound* pSound, ma_bool32 atEnd) MA_ASSERT(pSound != NULL); ma_atomic_exchange_32(&pSound->atEnd, atEnd); + /* + When this function is called the state of the sound will not yet be in a stopped state. This makes it confusing + because an end callback will intuitively expect ma_sound_is_playing() to return false from inside the callback. + I'm therefore no longer firing the callback here and will instead fire it manually in the *next* processing step + when the state should be set to stopped as expected. + */ + #if 0 /* Fire any callbacks or events. */ if (atEnd) { if (pSound->endCallback != NULL) { pSound->endCallback(pSound->pEndCallbackUserData, pSound); } } + #endif } static ma_bool32 ma_sound_get_at_end(const ma_sound* pSound) @@ -74812,6 +76561,7 @@ MA_API ma_engine_node_config ma_engine_node_config_init(ma_engine* pEngine, ma_e config.isPitchDisabled = (flags & MA_SOUND_FLAG_NO_PITCH) != 0; config.isSpatializationDisabled = (flags & MA_SOUND_FLAG_NO_SPATIALIZATION) != 0; config.monoExpansionMode = pEngine->monoExpansionMode; + config.resampling = pEngine->pitchResamplingConfig; return config; } @@ -74838,7 +76588,7 @@ static void ma_engine_node_update_pitch_if_required(ma_engine_node* pEngineNode) if (isUpdateRequired) { float basePitch = (float)pEngineNode->sampleRate / ma_engine_get_sample_rate(pEngineNode->pEngine); - ma_linear_resampler_set_rate_ratio(&pEngineNode->resampler, basePitch * pEngineNode->oldPitch * pEngineNode->oldDopplerPitch); + ma_resampler_set_rate_ratio(&pEngineNode->resampler, basePitch * pEngineNode->oldPitch * pEngineNode->oldDopplerPitch); } } @@ -74857,22 +76607,6 @@ static ma_bool32 ma_engine_node_is_spatialization_enabled(const ma_engine_node* return !ma_atomic_load_explicit_32(&pEngineNode->isSpatializationDisabled, ma_atomic_memory_order_acquire); } -static ma_uint64 ma_engine_node_get_required_input_frame_count(const ma_engine_node* pEngineNode, ma_uint64 outputFrameCount) -{ - ma_uint64 inputFrameCount = 0; - - if (ma_engine_node_is_pitching_enabled(pEngineNode)) { - ma_result result = ma_linear_resampler_get_required_input_frame_count(&pEngineNode->resampler, outputFrameCount, &inputFrameCount); - if (result != MA_SUCCESS) { - inputFrameCount = 0; - } - } else { - inputFrameCount = outputFrameCount; /* No resampling, so 1:1. */ - } - - return inputFrameCount; -} - static ma_result ma_engine_node_set_volume(ma_engine_node* pEngineNode, float volume) { if (pEngineNode == NULL) { @@ -75014,7 +76748,7 @@ static void ma_engine_node_process_pcm_frames__general(ma_engine_node* pEngineNo ma_uint64 resampleFrameCountIn = framesAvailableIn; ma_uint64 resampleFrameCountOut = framesAvailableOut; - ma_linear_resampler_process_pcm_frames(&pEngineNode->resampler, pRunningFramesIn, &resampleFrameCountIn, pWorkingBuffer, &resampleFrameCountOut); + ma_resampler_process_pcm_frames(&pEngineNode->resampler, pRunningFramesIn, &resampleFrameCountIn, pWorkingBuffer, &resampleFrameCountOut); isWorkingBufferValid = MA_TRUE; framesJustProcessedIn = (ma_uint32)resampleFrameCountIn; @@ -75138,6 +76872,11 @@ static void ma_engine_node_process_pcm_frames__sound(ma_node* pNode, const float /* If we're marked at the end we need to stop the sound and do nothing. */ if (ma_sound_at_end(pSound)) { ma_sound_stop(pSound); + + if (pSound->endCallback != NULL) { + pSound->endCallback(pSound->pEndCallbackUserData, pSound); + } + *pFrameCountOut = 0; return; } @@ -75175,55 +76914,74 @@ static void ma_engine_node_process_pcm_frames__sound(ma_node* pNode, const float /* Keep reading until we've read as much as was requested or we reach the end of the data source. */ while (totalFramesRead < frameCount) { ma_uint32 framesRemaining = frameCount - totalFramesRead; - ma_uint32 framesToRead; ma_uint64 framesJustRead; ma_uint32 frameCountIn; ma_uint32 frameCountOut; const float* pRunningFramesIn; float* pRunningFramesOut; - /* - The first thing we need to do is read into the temporary buffer. We can calculate exactly - how many input frames we'll need after resampling. - */ - framesToRead = (ma_uint32)ma_engine_node_get_required_input_frame_count(&pSound->engineNode, framesRemaining); - if (framesToRead > tempCapInFrames) { - framesToRead = tempCapInFrames; - } + /* If there's any input frames sitting in the cache get those processed first. */ + if (pSound->processingCacheFramesRemaining > 0) { + pRunningFramesIn = pSound->pProcessingCache; + frameCountIn = pSound->processingCacheFramesRemaining; - result = ma_data_source_read_pcm_frames(pSound->pDataSource, temp, framesToRead, &framesJustRead); + pRunningFramesOut = ma_offset_pcm_frames_ptr_f32(ppFramesOut[0], totalFramesRead, ma_node_get_output_channels(pNode, 0)); + frameCountOut = framesRemaining; - /* If we reached the end of the sound we'll want to mark it as at the end and stop it. This should never be returned for looping sounds. */ - if (result == MA_AT_END) { - ma_sound_set_at_end(pSound, MA_TRUE); /* This will be set to false in ma_sound_start(). */ - } - - pRunningFramesOut = ma_offset_pcm_frames_ptr_f32(ppFramesOut[0], totalFramesRead, ma_node_get_output_channels(pNode, 0)); - - frameCountIn = (ma_uint32)framesJustRead; - frameCountOut = framesRemaining; - - /* Convert if necessary. */ - if (dataSourceFormat == ma_format_f32) { - /* Fast path. No data conversion necessary. */ - pRunningFramesIn = (float*)temp; ma_engine_node_process_pcm_frames__general(&pSound->engineNode, &pRunningFramesIn, &frameCountIn, &pRunningFramesOut, &frameCountOut); + + MA_ASSERT(frameCountIn <= pSound->processingCacheFramesRemaining); + pSound->processingCacheFramesRemaining -= frameCountIn; + + /* Move any remaining data in the cache down. */ + if (pSound->processingCacheFramesRemaining > 0) { + MA_MOVE_MEMORY(pSound->pProcessingCache, ma_offset_pcm_frames_ptr_f32(pSound->pProcessingCache, frameCountIn, dataSourceChannels), pSound->processingCacheFramesRemaining * ma_get_bytes_per_frame(ma_format_f32, dataSourceChannels)); + } + + totalFramesRead += (ma_uint32)frameCountOut; /* Safe cast. */ + + if (result != MA_SUCCESS || ma_sound_at_end(pSound)) { + break; /* Might have reached the end. */ + } } else { - /* Slow path. Need to do sample format conversion to f32. If we give the f32 buffer the same count as the first temp buffer, we're guaranteed it'll be large enough. */ - float tempf32[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* Do not do `MA_DATA_CONVERTER_STACK_BUFFER_SIZE/sizeof(float)` here like we've done in other places. */ - ma_convert_pcm_frames_format(tempf32, ma_format_f32, temp, dataSourceFormat, framesJustRead, dataSourceChannels, ma_dither_mode_none); + /* Getting here means there's nothing in the cache. Read more data from the data source. */ + if (dataSourceFormat == ma_format_f32) { + /* Fast path. No conversion to f32 necessary. */ + result = ma_data_source_read_pcm_frames(pSound->pDataSource, pSound->pProcessingCache, pSound->processingCacheCap, &framesJustRead); + } else { + /* Slow path. Need to convert to f32. */ + ma_uint64 totalFramesConverted = 0; - /* Now that we have our samples in f32 format we can process like normal. */ - pRunningFramesIn = tempf32; - ma_engine_node_process_pcm_frames__general(&pSound->engineNode, &pRunningFramesIn, &frameCountIn, &pRunningFramesOut, &frameCountOut); - } + while (totalFramesConverted < pSound->processingCacheCap) { + ma_uint64 framesConverted; + ma_uint32 framesToConvertThisIteration = pSound->processingCacheCap - (ma_uint32)totalFramesConverted; + if (framesToConvertThisIteration > tempCapInFrames) { + framesToConvertThisIteration = tempCapInFrames; + } - /* We should have processed all of our input frames since we calculated the required number of input frames at the top. */ - MA_ASSERT(frameCountIn == framesJustRead); - totalFramesRead += (ma_uint32)frameCountOut; /* Safe cast. */ + result = ma_data_source_read_pcm_frames(pSound->pDataSource, temp, framesToConvertThisIteration, &framesConverted); + if (result != MA_SUCCESS) { + break; + } - if (result != MA_SUCCESS || ma_sound_at_end(pSound)) { - break; /* Might have reached the end. */ + ma_convert_pcm_frames_format(ma_offset_pcm_frames_ptr_f32(pSound->pProcessingCache, totalFramesConverted, dataSourceChannels), ma_format_f32, temp, dataSourceFormat, framesConverted, dataSourceChannels, ma_dither_mode_none); + totalFramesConverted += framesConverted; + } + + framesJustRead = totalFramesConverted; + } + + MA_ASSERT(framesJustRead <= pSound->processingCacheCap); + pSound->processingCacheFramesRemaining = (ma_uint32)framesJustRead; + + /* If we reached the end of the sound we'll want to mark it as at the end and stop it. This should never be returned for looping sounds. */ + if (result == MA_AT_END) { + ma_sound_set_at_end(pSound, MA_TRUE); /* This will be set to false in ma_sound_start(). */ + } + + if (result != MA_SUCCESS || ma_sound_at_end(pSound)) { + break; + } } } } @@ -75246,25 +77004,6 @@ static void ma_engine_node_process_pcm_frames__group(ma_node* pNode, const float ma_engine_node_process_pcm_frames__general((ma_engine_node*)pNode, ppFramesIn, pFrameCountIn, ppFramesOut, pFrameCountOut); } -static ma_result ma_engine_node_get_required_input_frame_count__group(ma_node* pNode, ma_uint32 outputFrameCount, ma_uint32* pInputFrameCount) -{ - ma_uint64 inputFrameCount; - - MA_ASSERT(pInputFrameCount != NULL); - - /* Our pitch will affect this calculation. We need to update it. */ - ma_engine_node_update_pitch_if_required((ma_engine_node*)pNode); - - inputFrameCount = ma_engine_node_get_required_input_frame_count((ma_engine_node*)pNode, outputFrameCount); - if (inputFrameCount > 0xFFFFFFFF) { - inputFrameCount = 0xFFFFFFFF; /* Will never happen because miniaudio will only ever process in relatively small chunks. */ - } - - *pInputFrameCount = (ma_uint32)inputFrameCount; - - return MA_SUCCESS; -} - static ma_node_vtable g_ma_engine_node_vtable__sound = { @@ -75278,7 +77017,7 @@ static ma_node_vtable g_ma_engine_node_vtable__sound = static ma_node_vtable g_ma_engine_node_vtable__group = { ma_engine_node_process_pcm_frames__group, - ma_engine_node_get_required_input_frame_count__group, + NULL, /* onGetRequiredInputFrameCount */ 1, /* Groups have one input bus. */ 1, /* Groups have one output bus. */ MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES /* The engine node does resampling so should let miniaudio know about it. */ @@ -75324,9 +77063,10 @@ static ma_result ma_engine_node_get_heap_layout(const ma_engine_node_config* pCo ma_result result; size_t tempHeapSize; ma_node_config baseNodeConfig; - ma_linear_resampler_config resamplerConfig; + ma_resampler_config resamplerConfig; ma_spatializer_config spatializerConfig; ma_gainer_config gainerConfig; + ma_uint32 sampleRate; ma_uint32 channelsIn; ma_uint32 channelsOut; ma_channel defaultStereoChannelMap[2] = {MA_CHANNEL_SIDE_LEFT, MA_CHANNEL_SIDE_RIGHT}; /* <-- Consistent with the default channel map of a stereo listener. Means channel conversion can run on a fast path. */ @@ -75345,6 +77085,7 @@ static ma_result ma_engine_node_get_heap_layout(const ma_engine_node_config* pCo pHeapLayout->sizeInBytes = 0; + sampleRate = (pConfig->sampleRate > 0) ? pConfig->sampleRate : ma_engine_get_sample_rate(pConfig->pEngine); channelsIn = (pConfig->channelsIn != 0) ? pConfig->channelsIn : ma_engine_get_channels(pConfig->pEngine); channelsOut = (pConfig->channelsOut != 0) ? pConfig->channelsOut : ma_engine_get_channels(pConfig->pEngine); @@ -75364,10 +77105,13 @@ static ma_result ma_engine_node_get_heap_layout(const ma_engine_node_config* pCo /* Resmapler. */ - resamplerConfig = ma_linear_resampler_config_init(ma_format_f32, channelsIn, 1, 1); /* Input and output sample rates don't affect the calculation of the heap size. */ - resamplerConfig.lpfOrder = 0; + resamplerConfig = pConfig->resampling; + resamplerConfig.format = ma_format_f32; + resamplerConfig.channels = channelsIn; + resamplerConfig.sampleRateIn = sampleRate; + resamplerConfig.sampleRateOut = ma_engine_get_sample_rate(pConfig->pEngine); - result = ma_linear_resampler_get_heap_size(&resamplerConfig, &tempHeapSize); + result = ma_resampler_get_heap_size(&resamplerConfig, &tempHeapSize); if (result != MA_SUCCESS) { return result; /* Failed to retrieve the size of the heap for the resampler. */ } @@ -75435,7 +77179,7 @@ MA_API ma_result ma_engine_node_init_preallocated(const ma_engine_node_config* p ma_result result; ma_engine_node_heap_layout heapLayout; ma_node_config baseNodeConfig; - ma_linear_resampler_config resamplerConfig; + ma_resampler_config resamplerConfig; ma_fader_config faderConfig; ma_spatializer_config spatializerConfig; ma_panner_config pannerConfig; @@ -75510,10 +77254,13 @@ MA_API ma_result ma_engine_node_init_preallocated(const ma_engine_node_config* p */ /* We'll always do resampling first. */ - resamplerConfig = ma_linear_resampler_config_init(ma_format_f32, baseNodeConfig.pInputChannels[0], pEngineNode->sampleRate, ma_engine_get_sample_rate(pEngineNode->pEngine)); - resamplerConfig.lpfOrder = 0; /* <-- Need to disable low-pass filtering for pitch shifting for now because there's cases where the biquads are becoming unstable. Need to figure out a better fix for this. */ + resamplerConfig = pConfig->resampling; + resamplerConfig.format = ma_format_f32; + resamplerConfig.channels = baseNodeConfig.pInputChannels[0]; + resamplerConfig.sampleRateIn = pEngineNode->sampleRate; + resamplerConfig.sampleRateOut = ma_engine_get_sample_rate(pEngineNode->pEngine); - result = ma_linear_resampler_init_preallocated(&resamplerConfig, ma_offset_ptr(pHeap, heapLayout.resamplerOffset), &pEngineNode->resampler); + result = ma_resampler_init_preallocated(&resamplerConfig, ma_offset_ptr(pHeap, heapLayout.resamplerOffset), &pEngineNode->resampler); if (result != MA_SUCCESS) { goto error1; } @@ -75572,7 +77319,7 @@ MA_API ma_result ma_engine_node_init_preallocated(const ma_engine_node_config* p /* No need for allocation callbacks here because we use a preallocated heap. */ error3: ma_spatializer_uninit(&pEngineNode->spatializer, NULL); -error2: ma_linear_resampler_uninit(&pEngineNode->resampler, NULL); +error2: ma_resampler_uninit(&pEngineNode->resampler, NULL); error1: ma_node_uninit(&pEngineNode->baseNode, NULL); error0: return result; } @@ -75621,7 +77368,7 @@ MA_API void ma_engine_node_uninit(ma_engine_node* pEngineNode, const ma_allocati } ma_spatializer_uninit(&pEngineNode->spatializer, pAllocationCallbacks); - ma_linear_resampler_uninit(&pEngineNode->resampler, pAllocationCallbacks); + ma_resampler_uninit(&pEngineNode->resampler, pAllocationCallbacks); /* Free the heap last. */ if (pEngineNode->_ownsHeap) { @@ -75643,8 +77390,12 @@ MA_API ma_sound_config ma_sound_config_init_2(ma_engine* pEngine) if (pEngine != NULL) { config.monoExpansionMode = pEngine->monoExpansionMode; + config.pitchResampling = pEngine->pitchResamplingConfig; } else { config.monoExpansionMode = ma_mono_expansion_mode_default; + + config.pitchResampling = ma_resampler_config_init(ma_format_f32, 0, 0, 0, ma_resample_algorithm_linear); + config.pitchResampling.linear.lpfOrder = 0; /* <-- Need to disable low-pass filtering for pitch shifting for now because there's cases where the biquads are becoming unstable. Need to figure out a better fix for this. */ } config.rangeEndInPCMFrames = ~((ma_uint64)0); @@ -75666,8 +77417,12 @@ MA_API ma_sound_group_config ma_sound_group_config_init_2(ma_engine* pEngine) if (pEngine != NULL) { config.monoExpansionMode = pEngine->monoExpansionMode; + config.pitchResampling = pEngine->pitchResamplingConfig; } else { config.monoExpansionMode = ma_mono_expansion_mode_default; + + config.pitchResampling = ma_resampler_config_init(ma_format_f32, 0, 0, 0, ma_resample_algorithm_linear); + config.pitchResampling.linear.lpfOrder = 0; /* <-- Need to disable low-pass filtering for pitch shifting for now because there's cases where the biquads are becoming unstable. Need to figure out a better fix for this. */ } return config; @@ -75679,8 +77434,12 @@ MA_API ma_engine_config ma_engine_config_init(void) ma_engine_config config; MA_ZERO_OBJECT(&config); - config.listenerCount = 1; /* Always want at least one listener. */ - config.monoExpansionMode = ma_mono_expansion_mode_default; + config.listenerCount = 1; /* Always want at least one listener. */ + config.monoExpansionMode = ma_mono_expansion_mode_default; + config.resourceManagerResampling = ma_resampler_config_init(ma_format_unknown, 0, 0, 0, ma_resample_algorithm_linear); + + config.pitchResampling = ma_resampler_config_init(ma_format_f32, 0, 0, 0, ma_resample_algorithm_linear); + config.pitchResampling.linear.lpfOrder = 0; /* <-- Need to disable low-pass filtering for pitch shifting for now because there's cases where the biquads are becoming unstable. Need to figure out a better fix for this. */ return config; } @@ -75761,6 +77520,7 @@ MA_API ma_result ma_engine_init(const ma_engine_config* pConfig, ma_engine* pEng pEngine->defaultVolumeSmoothTimeInPCMFrames = engineConfig.defaultVolumeSmoothTimeInPCMFrames; pEngine->onProcess = engineConfig.onProcess; pEngine->pProcessUserData = engineConfig.pProcessUserData; + pEngine->pitchResamplingConfig = engineConfig.pitchResampling; ma_allocation_callbacks_init_copy(&pEngine->allocationCallbacks, &engineConfig.allocationCallbacks); #if !defined(MA_NO_RESOURCE_MANAGER) @@ -75943,6 +77703,7 @@ MA_API ma_result ma_engine_init(const ma_engine_config* pConfig, ma_engine* pEng resourceManagerConfig.decodedSampleRate = ma_engine_get_sample_rate(pEngine); ma_allocation_callbacks_init_copy(&resourceManagerConfig.allocationCallbacks, &pEngine->allocationCallbacks); resourceManagerConfig.pVFS = engineConfig.pResourceManagerVFS; + resourceManagerConfig.resampling = engineConfig.resourceManagerResampling; /* The Emscripten build cannot use threads unless it's targeting pthreads. */ #if defined(MA_EMSCRIPTEN) && !defined(__EMSCRIPTEN_PTHREADS__) @@ -76668,13 +78429,32 @@ static ma_result ma_sound_init_from_data_source_internal(ma_engine* pEngine, con } + /* + When pulling data from a data source we need a processing cache to hold onto unprocessed input data from the data source + after doing resampling. + */ + if (pSound->pDataSource != NULL) { + pSound->processingCacheFramesRemaining = 0; + pSound->processingCacheCap = ma_node_graph_get_processing_size_in_frames(&pEngine->nodeGraph); + if (pSound->processingCacheCap == 0) { + pSound->processingCacheCap = 512; + } + + pSound->pProcessingCache = (float*)ma_calloc(pSound->processingCacheCap * ma_get_bytes_per_frame(ma_format_f32, engineNodeConfig.channelsIn), &pEngine->allocationCallbacks); + if (pSound->pProcessingCache == NULL) { + ma_engine_node_uninit(&pSound->engineNode, &pEngine->allocationCallbacks); + return MA_OUT_OF_MEMORY; + } + } + + /* Apply initial range and looping state to the data source if applicable. */ if (pConfig->rangeBegInPCMFrames != 0 || pConfig->rangeEndInPCMFrames != ~((ma_uint64)0)) { ma_data_source_set_range_in_pcm_frames(ma_sound_get_data_source(pSound), pConfig->rangeBegInPCMFrames, pConfig->rangeEndInPCMFrames); } if (pConfig->loopPointBegInPCMFrames != 0 || pConfig->loopPointEndInPCMFrames != ~((ma_uint64)0)) { - ma_data_source_set_range_in_pcm_frames(ma_sound_get_data_source(pSound), pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames); + ma_data_source_set_loop_point_in_pcm_frames(ma_sound_get_data_source(pSound), pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames); } ma_sound_set_looping(pSound, pConfig->isLooping || ((pConfig->flags & MA_SOUND_FLAG_LOOPING) != 0)); @@ -76736,6 +78516,7 @@ MA_API ma_result ma_sound_init_from_file_internal(ma_engine* pEngine, const ma_s result = ma_resource_manager_data_source_init_ex(pEngine->pResourceManager, &resourceManagerDataSourceConfig, pSound->pResourceManagerDataSource); if (result != MA_SUCCESS) { + ma_free(pSound->pResourceManagerDataSource, &pEngine->allocationCallbacks); goto done; } @@ -76904,6 +78685,11 @@ MA_API void ma_sound_uninit(ma_sound* pSound) */ ma_engine_node_uninit(&pSound->engineNode, &pSound->engineNode.pEngine->allocationCallbacks); + if (pSound->pProcessingCache != NULL) { + ma_free(pSound->pProcessingCache, &pSound->engineNode.pEngine->allocationCallbacks); + pSound->pProcessingCache = NULL; + } + /* Once the sound is detached from the group we can guarantee that it won't be referenced by the mixer thread which means it's safe for us to destroy the data source. */ #ifndef MA_NO_RESOURCE_MANAGER if (pSound->ownsDataSource) { @@ -76999,6 +78785,27 @@ MA_API ma_result ma_sound_stop_with_fade_in_milliseconds(ma_sound* pSound, ma_ui return ma_sound_stop_with_fade_in_pcm_frames(pSound, (fadeLengthInMilliseconds * sampleRate) / 1000); } +MA_API void ma_sound_reset_start_time(ma_sound* pSound) +{ + ma_sound_set_start_time_in_pcm_frames(pSound, 0); +} + +MA_API void ma_sound_reset_stop_time(ma_sound* pSound) +{ + ma_sound_set_stop_time_in_pcm_frames(pSound, ~(ma_uint64)0); +} + +MA_API void ma_sound_reset_fade(ma_sound* pSound) +{ + ma_sound_set_fade_in_pcm_frames(pSound, 0, 1, 0); +} + +MA_API void ma_sound_reset_stop_time_and_fade(ma_sound* pSound) +{ + ma_sound_reset_stop_time(pSound); + ma_sound_reset_fade(pSound); +} + MA_API void ma_sound_set_volume(ma_sound* pSound, float volume) { if (pSound == NULL) { @@ -77541,7 +79348,12 @@ MA_API ma_uint64 ma_sound_get_time_in_pcm_frames(const ma_sound* pSound) MA_API ma_uint64 ma_sound_get_time_in_milliseconds(const ma_sound* pSound) { - return ma_sound_get_time_in_pcm_frames(pSound) * 1000 / ma_engine_get_sample_rate(ma_sound_get_engine(pSound)); + ma_uint32 sampleRate = ma_engine_get_sample_rate(ma_sound_get_engine(pSound)); + if (sampleRate == 0) { + return 0; /* Prevent a division by zero. */ + } + + return ma_sound_get_time_in_pcm_frames(pSound) * 1000 / sampleRate; } MA_API void ma_sound_set_looping(ma_sound* pSound, ma_bool32 isLooping) @@ -77625,7 +79437,7 @@ MA_API ma_result ma_sound_seek_to_second(ma_sound* pSound, float seekPointInSeco return ma_sound_seek_to_pcm_frame(pSound, frameIndex); } -MA_API ma_result ma_sound_get_data_format(ma_sound* pSound, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) +MA_API ma_result ma_sound_get_data_format(const ma_sound* pSound, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) { if (pSound == NULL) { return MA_INVALID_ARGS; @@ -77645,7 +79457,7 @@ MA_API ma_result ma_sound_get_data_format(ma_sound* pSound, ma_format* pFormat, } if (pSampleRate != NULL) { - *pSampleRate = pSound->engineNode.resampler.config.sampleRateIn; + *pSampleRate = pSound->engineNode.resampler.sampleRateIn; } if (pChannelMap != NULL) { @@ -77658,7 +79470,7 @@ MA_API ma_result ma_sound_get_data_format(ma_sound* pSound, ma_format* pFormat, } } -MA_API ma_result ma_sound_get_cursor_in_pcm_frames(ma_sound* pSound, ma_uint64* pCursor) +MA_API ma_result ma_sound_get_cursor_in_pcm_frames(const ma_sound* pSound, ma_uint64* pCursor) { ma_uint64 seekTarget; @@ -77680,7 +79492,7 @@ MA_API ma_result ma_sound_get_cursor_in_pcm_frames(ma_sound* pSound, ma_uint64* } } -MA_API ma_result ma_sound_get_length_in_pcm_frames(ma_sound* pSound, ma_uint64* pLength) +MA_API ma_result ma_sound_get_length_in_pcm_frames(const ma_sound* pSound, ma_uint64* pLength) { if (pSound == NULL) { return MA_INVALID_ARGS; @@ -77694,7 +79506,7 @@ MA_API ma_result ma_sound_get_length_in_pcm_frames(ma_sound* pSound, ma_uint64* return ma_data_source_get_length_in_pcm_frames(pSound->pDataSource, pLength); } -MA_API ma_result ma_sound_get_cursor_in_seconds(ma_sound* pSound, float* pCursor) +MA_API ma_result ma_sound_get_cursor_in_seconds(const ma_sound* pSound, float* pCursor) { ma_result result; ma_uint64 cursorInPCMFrames; @@ -77720,7 +79532,7 @@ MA_API ma_result ma_sound_get_cursor_in_seconds(ma_sound* pSound, float* pCursor return MA_SUCCESS; } -MA_API ma_result ma_sound_get_length_in_seconds(ma_sound* pSound, float* pLength) +MA_API ma_result ma_sound_get_length_in_seconds(const ma_sound* pSound, float* pLength) { if (pSound == NULL) { return MA_INVALID_ARGS; @@ -78539,12 +80351,12 @@ MA_PRIVATE ma_bool32 ma_dr_wav__seek_forward(ma_dr_wav_seek_proc onSeek, ma_uint ma_uint64 bytesRemainingToSeek = offset; while (bytesRemainingToSeek > 0) { if (bytesRemainingToSeek > 0x7FFFFFFF) { - if (!onSeek(pUserData, 0x7FFFFFFF, ma_dr_wav_seek_origin_current)) { + if (!onSeek(pUserData, 0x7FFFFFFF, MA_DR_WAV_SEEK_CUR)) { return MA_FALSE; } bytesRemainingToSeek -= 0x7FFFFFFF; } else { - if (!onSeek(pUserData, (int)bytesRemainingToSeek, ma_dr_wav_seek_origin_current)) { + if (!onSeek(pUserData, (int)bytesRemainingToSeek, MA_DR_WAV_SEEK_CUR)) { return MA_FALSE; } bytesRemainingToSeek = 0; @@ -78555,17 +80367,17 @@ MA_PRIVATE ma_bool32 ma_dr_wav__seek_forward(ma_dr_wav_seek_proc onSeek, ma_uint MA_PRIVATE ma_bool32 ma_dr_wav__seek_from_start(ma_dr_wav_seek_proc onSeek, ma_uint64 offset, void* pUserData) { if (offset <= 0x7FFFFFFF) { - return onSeek(pUserData, (int)offset, ma_dr_wav_seek_origin_start); + return onSeek(pUserData, (int)offset, MA_DR_WAV_SEEK_SET); } - if (!onSeek(pUserData, 0x7FFFFFFF, ma_dr_wav_seek_origin_start)) { + if (!onSeek(pUserData, 0x7FFFFFFF, MA_DR_WAV_SEEK_SET)) { return MA_FALSE; } offset -= 0x7FFFFFFF; for (;;) { if (offset <= 0x7FFFFFFF) { - return onSeek(pUserData, (int)offset, ma_dr_wav_seek_origin_current); + return onSeek(pUserData, (int)offset, MA_DR_WAV_SEEK_CUR); } - if (!onSeek(pUserData, 0x7FFFFFFF, ma_dr_wav_seek_origin_current)) { + if (!onSeek(pUserData, 0x7FFFFFFF, MA_DR_WAV_SEEK_CUR)) { return MA_FALSE; } offset -= 0x7FFFFFFF; @@ -78588,7 +80400,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav__on_seek(ma_dr_wav_seek_proc onSeek, void* pUserD if (!onSeek(pUserData, offset, origin)) { return MA_FALSE; } - if (origin == ma_dr_wav_seek_origin_start) { + if (origin == MA_DR_WAV_SEEK_SET) { *pCursor = offset; } else { *pCursor += offset; @@ -78707,12 +80519,12 @@ MA_PRIVATE ma_uint64 ma_dr_wav__read_smpl_to_metadata_obj(ma_dr_wav__metadata_pa ma_uint8 smplLoopData[MA_DR_WAV_SMPL_LOOP_BYTES]; bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, smplLoopData, sizeof(smplLoopData), &totalBytesRead); if (bytesJustRead == sizeof(smplLoopData)) { - pMetadata->data.smpl.pLoops[iSampleLoop].cuePointId = ma_dr_wav_bytes_to_u32(smplLoopData + 0); - pMetadata->data.smpl.pLoops[iSampleLoop].type = ma_dr_wav_bytes_to_u32(smplLoopData + 4); - pMetadata->data.smpl.pLoops[iSampleLoop].firstSampleByteOffset = ma_dr_wav_bytes_to_u32(smplLoopData + 8); - pMetadata->data.smpl.pLoops[iSampleLoop].lastSampleByteOffset = ma_dr_wav_bytes_to_u32(smplLoopData + 12); - pMetadata->data.smpl.pLoops[iSampleLoop].sampleFraction = ma_dr_wav_bytes_to_u32(smplLoopData + 16); - pMetadata->data.smpl.pLoops[iSampleLoop].playCount = ma_dr_wav_bytes_to_u32(smplLoopData + 20); + pMetadata->data.smpl.pLoops[iSampleLoop].cuePointId = ma_dr_wav_bytes_to_u32(smplLoopData + 0); + pMetadata->data.smpl.pLoops[iSampleLoop].type = ma_dr_wav_bytes_to_u32(smplLoopData + 4); + pMetadata->data.smpl.pLoops[iSampleLoop].firstSampleOffset = ma_dr_wav_bytes_to_u32(smplLoopData + 8); + pMetadata->data.smpl.pLoops[iSampleLoop].lastSampleOffset = ma_dr_wav_bytes_to_u32(smplLoopData + 12); + pMetadata->data.smpl.pLoops[iSampleLoop].sampleFraction = ma_dr_wav_bytes_to_u32(smplLoopData + 16); + pMetadata->data.smpl.pLoops[iSampleLoop].playCount = ma_dr_wav_bytes_to_u32(smplLoopData + 20); } else { break; } @@ -78756,7 +80568,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav__read_cue_to_metadata_obj(ma_dr_wav__metadata_par pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId[3] = cuePointData[11]; pMetadata->data.cue.pCuePoints[iCuePoint].chunkStart = ma_dr_wav_bytes_to_u32(cuePointData + 12); pMetadata->data.cue.pCuePoints[iCuePoint].blockStart = ma_dr_wav_bytes_to_u32(cuePointData + 16); - pMetadata->data.cue.pCuePoints[iCuePoint].sampleByteOffset = ma_dr_wav_bytes_to_u32(cuePointData + 20); + pMetadata->data.cue.pCuePoints[iCuePoint].sampleOffset = ma_dr_wav_bytes_to_u32(cuePointData + 20); } else { break; } @@ -79096,7 +80908,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) { ma_uint8 buffer[4]; size_t bytesJustRead; - if (!pParser->onSeek(pParser->pReadSeekUserData, 28, ma_dr_wav_seek_origin_current)) { + if (!pParser->onSeek(pParser->pReadSeekUserData, 28, MA_DR_WAV_SEEK_CUR)) { return bytesRead; } bytesRead += 28; @@ -79191,7 +81003,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse return bytesRead; } allocSizeNeeded += ma_dr_wav__strlen(buffer) + 1; - allocSizeNeeded += (size_t)pChunkHeader->sizeInBytes - MA_DR_WAV_BEXT_BYTES; + allocSizeNeeded += (size_t)pChunkHeader->sizeInBytes - MA_DR_WAV_BEXT_BYTES + 1; ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, allocSizeNeeded, 1); pParser->metadataCount += 1; } else { @@ -79274,6 +81086,16 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_album); } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_tracknumber, "ITRK")) { subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_tracknumber); + } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_location, "IARL")) { + subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_location); + } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_organization, "ICMS")) { + subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_organization); + } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_keywords, "IKEY")) { + subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_keywords); + } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_medium, "IMED")) { + subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_medium); + } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_description, "ISBJ")) { + subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_description); } else if ((allowedMetadataTypes & ma_dr_wav_metadata_type_unknown) != 0) { subchunkBytesRead = ma_dr_wav__metadata_process_unknown_chunk(pParser, subchunkId, subchunkDataSize, listType); } @@ -79281,13 +81103,13 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse MA_DR_WAV_ASSERT(subchunkBytesRead <= subchunkDataSize); if (subchunkBytesRead < subchunkDataSize) { ma_uint64 bytesToSeek = subchunkDataSize - subchunkBytesRead; - if (!pParser->onSeek(pParser->pReadSeekUserData, (int)bytesToSeek, ma_dr_wav_seek_origin_current)) { + if (!pParser->onSeek(pParser->pReadSeekUserData, (int)bytesToSeek, MA_DR_WAV_SEEK_CUR)) { break; } bytesRead += bytesToSeek; } if ((subchunkDataSize % 2) == 1) { - if (!pParser->onSeek(pParser->pReadSeekUserData, 1, ma_dr_wav_seek_origin_current)) { + if (!pParser->onSeek(pParser->pReadSeekUserData, 1, MA_DR_WAV_SEEK_CUR)) { break; } bytesRead += 1; @@ -79324,7 +81146,7 @@ MA_API ma_uint16 ma_dr_wav_fmt_get_format(const ma_dr_wav_fmt* pFMT) return ma_dr_wav_bytes_to_u16(pFMT->subFormat); } } -MA_PRIVATE ma_bool32 ma_dr_wav_preinit(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pReadSeekUserData, const ma_allocation_callbacks* pAllocationCallbacks) +MA_PRIVATE ma_bool32 ma_dr_wav_preinit(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pReadSeekTellUserData, const ma_allocation_callbacks* pAllocationCallbacks) { if (pWav == NULL || onRead == NULL || onSeek == NULL) { return MA_FALSE; @@ -79332,7 +81154,8 @@ MA_PRIVATE ma_bool32 ma_dr_wav_preinit(ma_dr_wav* pWav, ma_dr_wav_read_proc onRe MA_DR_WAV_ZERO_MEMORY(pWav, sizeof(*pWav)); pWav->onRead = onRead; pWav->onSeek = onSeek; - pWav->pUserData = pReadSeekUserData; + pWav->onTell = onTell; + pWav->pUserData = pReadSeekTellUserData; pWav->allocationCallbacks = ma_dr_wav_copy_allocation_callbacks_or_defaults(pAllocationCallbacks); if (pWav->allocationCallbacks.onFree == NULL || (pWav->allocationCallbacks.onMalloc == NULL && pWav->allocationCallbacks.onRealloc == NULL)) { return MA_FALSE; @@ -79546,14 +81369,14 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p fmt.channelMask = ma_dr_wav_bytes_to_u32_ex(fmtext + 2, pWav->container); ma_dr_wav_bytes_to_guid(fmtext + 6, fmt.subFormat); } else { - if (pWav->onSeek(pWav->pUserData, fmt.extendedSize, ma_dr_wav_seek_origin_current) == MA_FALSE) { + if (pWav->onSeek(pWav->pUserData, fmt.extendedSize, MA_DR_WAV_SEEK_CUR) == MA_FALSE) { return MA_FALSE; } } cursor += fmt.extendedSize; bytesReadSoFar += fmt.extendedSize; } - if (pWav->onSeek(pWav->pUserData, (int)(header.sizeInBytes - bytesReadSoFar), ma_dr_wav_seek_origin_current) == MA_FALSE) { + if (pWav->onSeek(pWav->pUserData, (int)(header.sizeInBytes - bytesReadSoFar), MA_DR_WAV_SEEK_CUR) == MA_FALSE) { return MA_FALSE; } cursor += (header.sizeInBytes - bytesReadSoFar); @@ -79704,15 +81527,26 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p return MA_FALSE; } offset = ma_dr_wav_bytes_to_u32_ex(offsetAndBlockSizeData + 0, pWav->container); - if (ma_dr_wav__seek_forward(pWav->onSeek, offset, pWav->pUserData) == MA_FALSE) { - return MA_FALSE; - } - cursor += offset; - pWav->dataChunkDataPos = cursor; + pWav->dataChunkDataPos = cursor + offset; dataChunkSize = chunkSize; - if (sequential || !isProcessingMetadata) { - break; + if (dataChunkSize > offset) { + dataChunkSize -= offset; } else { + dataChunkSize = 0; + } + if (sequential) { + if (foundChunk_fmt) { + if (ma_dr_wav__seek_forward(pWav->onSeek, offset, pWav->pUserData) == MA_FALSE) { + return MA_FALSE; + } + cursor += offset; + break; + } else { + return MA_FALSE; + } + } else { + chunkSize += header.paddingSize; + chunkSize -= sizeof(offsetAndBlockSizeData); if (ma_dr_wav__seek_forward(pWav->onSeek, chunkSize, pWav->pUserData) == MA_FALSE) { break; } @@ -79776,6 +81610,17 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p pWav->pMetadata = metadataParser.pMetadata; pWav->metadataCount = metadataParser.metadataCount; } + if (pWav->onTell != NULL && pWav->onSeek != NULL) { + if (pWav->onSeek(pWav->pUserData, 0, MA_DR_WAV_SEEK_END) == MA_TRUE) { + ma_int64 fileSize; + if (pWav->onTell(pWav->pUserData, &fileSize)) { + if (dataChunkSize + pWav->dataChunkDataPos > (ma_uint64)fileSize) { + dataChunkSize = (ma_uint64)fileSize - pWav->dataChunkDataPos; + } + } + } else { + } + } if (dataChunkSize == 0xFFFFFFFF && (pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx) && pWav->isSequentialWrite == MA_FALSE) { dataChunkSize = 0; for (;;) { @@ -79795,8 +81640,14 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p pWav->sampleRate = fmt.sampleRate; pWav->channels = fmt.channels; pWav->bitsPerSample = fmt.bitsPerSample; - pWav->bytesRemaining = dataChunkSize; pWav->translatedFormatTag = translatedFormatTag; + if (!ma_dr_wav__is_compressed_format_tag(translatedFormatTag)) { + ma_uint32 bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav); + if (bytesPerFrame > 0) { + dataChunkSize -= (dataChunkSize % bytesPerFrame); + } + } + pWav->bytesRemaining = dataChunkSize; pWav->dataChunkDataSize = dataChunkSize; if (sampleCountFromFactChunk != 0) { pWav->totalPCMFrameCount = sampleCountFromFactChunk; @@ -79851,20 +81702,20 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p #endif return MA_TRUE; } -MA_API ma_bool32 ma_dr_wav_init(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_bool32 ma_dr_wav_init(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) { - return ma_dr_wav_init_ex(pWav, onRead, onSeek, NULL, pUserData, NULL, 0, pAllocationCallbacks); + return ma_dr_wav_init_ex(pWav, onRead, onSeek, onTell, NULL, pUserData, NULL, 0, pAllocationCallbacks); } -MA_API ma_bool32 ma_dr_wav_init_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_bool32 ma_dr_wav_init_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, ma_dr_wav_chunk_proc onChunk, void* pReadSeekTellUserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks) { - if (!ma_dr_wav_preinit(pWav, onRead, onSeek, pReadSeekUserData, pAllocationCallbacks)) { + if (!ma_dr_wav_preinit(pWav, onRead, onSeek, onTell, pReadSeekTellUserData, pAllocationCallbacks)) { return MA_FALSE; } return ma_dr_wav_init__internal(pWav, onChunk, pChunkUserData, flags); } -MA_API ma_bool32 ma_dr_wav_init_with_metadata(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_bool32 ma_dr_wav_init_with_metadata(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks) { - if (!ma_dr_wav_preinit(pWav, onRead, onSeek, pUserData, pAllocationCallbacks)) { + if (!ma_dr_wav_preinit(pWav, onRead, onSeek, onTell, pUserData, pAllocationCallbacks)) { return MA_FALSE; } return ma_dr_wav_init__internal(pWav, NULL, NULL, flags | MA_DR_WAV_WITH_METADATA); @@ -80026,8 +81877,8 @@ MA_PRIVATE size_t ma_dr_wav__write_or_count_metadata(ma_dr_wav* pWav, ma_dr_wav_ for (iLoop = 0; iLoop < pMetadata->data.smpl.sampleLoopCount; ++iLoop) { bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].cuePointId); bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].type); - bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].firstSampleByteOffset); - bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].lastSampleByteOffset); + bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].firstSampleOffset); + bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].lastSampleOffset); bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].sampleFraction); bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].playCount); } @@ -80061,7 +81912,7 @@ MA_PRIVATE size_t ma_dr_wav__write_or_count_metadata(ma_dr_wav* pWav, ma_dr_wav_ bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId, 4); bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].chunkStart); bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].blockStart); - bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].sampleByteOffset); + bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].sampleOffset); } } break; case ma_dr_wav_metadata_type_acid: @@ -80147,15 +81998,20 @@ MA_PRIVATE size_t ma_dr_wav__write_or_count_metadata(ma_dr_wav* pWav, ma_dr_wav_ if (pMetadata->type & ma_dr_wav_metadata_type_list_all_info_strings) { const char* pID = NULL; switch (pMetadata->type) { - case ma_dr_wav_metadata_type_list_info_software: pID = "ISFT"; break; - case ma_dr_wav_metadata_type_list_info_copyright: pID = "ICOP"; break; - case ma_dr_wav_metadata_type_list_info_title: pID = "INAM"; break; - case ma_dr_wav_metadata_type_list_info_artist: pID = "IART"; break; - case ma_dr_wav_metadata_type_list_info_comment: pID = "ICMT"; break; - case ma_dr_wav_metadata_type_list_info_date: pID = "ICRD"; break; - case ma_dr_wav_metadata_type_list_info_genre: pID = "IGNR"; break; - case ma_dr_wav_metadata_type_list_info_album: pID = "IPRD"; break; - case ma_dr_wav_metadata_type_list_info_tracknumber: pID = "ITRK"; break; + case ma_dr_wav_metadata_type_list_info_software: pID = "ISFT"; break; + case ma_dr_wav_metadata_type_list_info_copyright: pID = "ICOP"; break; + case ma_dr_wav_metadata_type_list_info_title: pID = "INAM"; break; + case ma_dr_wav_metadata_type_list_info_artist: pID = "IART"; break; + case ma_dr_wav_metadata_type_list_info_comment: pID = "ICMT"; break; + case ma_dr_wav_metadata_type_list_info_date: pID = "ICRD"; break; + case ma_dr_wav_metadata_type_list_info_genre: pID = "IGNR"; break; + case ma_dr_wav_metadata_type_list_info_album: pID = "IPRD"; break; + case ma_dr_wav_metadata_type_list_info_tracknumber: pID = "ITRK"; break; + case ma_dr_wav_metadata_type_list_info_location: pID = "IARL"; break; + case ma_dr_wav_metadata_type_list_info_organization: pID = "ICMS"; break; + case ma_dr_wav_metadata_type_list_info_keywords: pID = "IKEY"; break; + case ma_dr_wav_metadata_type_list_info_medium: pID = "IMED"; break; + case ma_dr_wav_metadata_type_list_info_description: pID = "ISBJ"; break; default: break; } MA_DR_WAV_ASSERT(pID != NULL); @@ -80370,7 +82226,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init_write__internal(ma_dr_wav* pWav, const ma_dr } pWav->dataChunkDataSizeTargetWrite = initialDataChunkSize; if (pFormat->container == ma_dr_wav_container_riff) { - ma_uint32 chunkSizeRIFF = 28 + (ma_uint32)initialDataChunkSize; + ma_uint32 chunkSizeRIFF = 36 + (ma_uint32)initialDataChunkSize; runningPos += ma_dr_wav__write(pWav, "RIFF", 4); runningPos += ma_dr_wav__write_u32ne_to_le(pWav, chunkSizeRIFF); runningPos += ma_dr_wav__write(pWav, "WAVE", 4); @@ -80493,7 +82349,31 @@ MA_PRIVATE size_t ma_dr_wav__on_write_stdio(void* pUserData, const void* pData, } MA_PRIVATE ma_bool32 ma_dr_wav__on_seek_stdio(void* pUserData, int offset, ma_dr_wav_seek_origin origin) { - return fseek((FILE*)pUserData, offset, (origin == ma_dr_wav_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; + int whence = SEEK_SET; + if (origin == MA_DR_WAV_SEEK_CUR) { + whence = SEEK_CUR; + } else if (origin == MA_DR_WAV_SEEK_END) { + whence = SEEK_END; + } + return fseek((FILE*)pUserData, offset, whence) == 0; +} +MA_PRIVATE ma_bool32 ma_dr_wav__on_tell_stdio(void* pUserData, ma_int64* pCursor) +{ + FILE* pFileStdio = (FILE*)pUserData; + ma_int64 result; + MA_DR_WAV_ASSERT(pFileStdio != NULL); + MA_DR_WAV_ASSERT(pCursor != NULL); +#if defined(_WIN32) && !defined(NXDK) + #if defined(_MSC_VER) && _MSC_VER > 1200 + result = _ftelli64(pFileStdio); + #else + result = ftell(pFileStdio); + #endif +#else + result = ftell(pFileStdio); +#endif + *pCursor = result; + return MA_TRUE; } MA_API ma_bool32 ma_dr_wav_init_file(ma_dr_wav* pWav, const char* filename, const ma_allocation_callbacks* pAllocationCallbacks) { @@ -80502,7 +82382,7 @@ MA_API ma_bool32 ma_dr_wav_init_file(ma_dr_wav* pWav, const char* filename, cons MA_PRIVATE ma_bool32 ma_dr_wav_init_file__internal_FILE(ma_dr_wav* pWav, FILE* pFile, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks) { ma_bool32 result; - result = ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_stdio, ma_dr_wav__on_seek_stdio, (void*)pFile, pAllocationCallbacks); + result = ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_stdio, ma_dr_wav__on_seek_stdio, ma_dr_wav__on_tell_stdio, (void*)pFile, pAllocationCallbacks); if (result != MA_TRUE) { fclose(pFile); return result; @@ -80639,25 +82519,26 @@ MA_PRIVATE size_t ma_dr_wav__on_read_memory(void* pUserData, void* pBufferOut, s MA_PRIVATE ma_bool32 ma_dr_wav__on_seek_memory(void* pUserData, int offset, ma_dr_wav_seek_origin origin) { ma_dr_wav* pWav = (ma_dr_wav*)pUserData; + ma_int64 newCursor; MA_DR_WAV_ASSERT(pWav != NULL); - if (origin == ma_dr_wav_seek_origin_current) { - if (offset > 0) { - if (pWav->memoryStream.currentReadPos + offset > pWav->memoryStream.dataSize) { - return MA_FALSE; - } - } else { - if (pWav->memoryStream.currentReadPos < (size_t)-offset) { - return MA_FALSE; - } - } - pWav->memoryStream.currentReadPos += offset; + if (origin == MA_DR_WAV_SEEK_SET) { + newCursor = 0; + } else if (origin == MA_DR_WAV_SEEK_CUR) { + newCursor = (ma_int64)pWav->memoryStream.currentReadPos; + } else if (origin == MA_DR_WAV_SEEK_END) { + newCursor = (ma_int64)pWav->memoryStream.dataSize; } else { - if ((ma_uint32)offset <= pWav->memoryStream.dataSize) { - pWav->memoryStream.currentReadPos = offset; - } else { - return MA_FALSE; - } + MA_DR_WAV_ASSERT(!"Invalid seek origin"); + return MA_FALSE; } + newCursor += offset; + if (newCursor < 0) { + return MA_FALSE; + } + if ((size_t)newCursor > pWav->memoryStream.dataSize) { + return MA_FALSE; + } + pWav->memoryStream.currentReadPos = (size_t)newCursor; return MA_TRUE; } MA_PRIVATE size_t ma_dr_wav__on_write_memory(void* pUserData, const void* pDataIn, size_t bytesToWrite) @@ -80691,25 +82572,34 @@ MA_PRIVATE size_t ma_dr_wav__on_write_memory(void* pUserData, const void* pDataI MA_PRIVATE ma_bool32 ma_dr_wav__on_seek_memory_write(void* pUserData, int offset, ma_dr_wav_seek_origin origin) { ma_dr_wav* pWav = (ma_dr_wav*)pUserData; + ma_int64 newCursor; MA_DR_WAV_ASSERT(pWav != NULL); - if (origin == ma_dr_wav_seek_origin_current) { - if (offset > 0) { - if (pWav->memoryStreamWrite.currentWritePos + offset > pWav->memoryStreamWrite.dataSize) { - offset = (int)(pWav->memoryStreamWrite.dataSize - pWav->memoryStreamWrite.currentWritePos); - } - } else { - if (pWav->memoryStreamWrite.currentWritePos < (size_t)-offset) { - offset = -(int)pWav->memoryStreamWrite.currentWritePos; - } - } - pWav->memoryStreamWrite.currentWritePos += offset; + if (origin == MA_DR_WAV_SEEK_SET) { + newCursor = 0; + } else if (origin == MA_DR_WAV_SEEK_CUR) { + newCursor = (ma_int64)pWav->memoryStreamWrite.currentWritePos; + } else if (origin == MA_DR_WAV_SEEK_END) { + newCursor = (ma_int64)pWav->memoryStreamWrite.dataSize; } else { - if ((ma_uint32)offset <= pWav->memoryStreamWrite.dataSize) { - pWav->memoryStreamWrite.currentWritePos = offset; - } else { - pWav->memoryStreamWrite.currentWritePos = pWav->memoryStreamWrite.dataSize; - } + MA_DR_WAV_ASSERT(!"Invalid seek origin"); + return MA_FALSE; } + newCursor += offset; + if (newCursor < 0) { + return MA_FALSE; + } + if ((size_t)newCursor > pWav->memoryStreamWrite.dataSize) { + return MA_FALSE; + } + pWav->memoryStreamWrite.currentWritePos = (size_t)newCursor; + return MA_TRUE; +} +MA_PRIVATE ma_bool32 ma_dr_wav__on_tell_memory(void* pUserData, ma_int64* pCursor) +{ + ma_dr_wav* pWav = (ma_dr_wav*)pUserData; + MA_DR_WAV_ASSERT(pWav != NULL); + MA_DR_WAV_ASSERT(pCursor != NULL); + *pCursor = (ma_int64)pWav->memoryStream.currentReadPos; return MA_TRUE; } MA_API ma_bool32 ma_dr_wav_init_memory(ma_dr_wav* pWav, const void* data, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks) @@ -80721,7 +82611,7 @@ MA_API ma_bool32 ma_dr_wav_init_memory_ex(ma_dr_wav* pWav, const void* data, siz if (data == NULL || dataSize == 0) { return MA_FALSE; } - if (!ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_memory, ma_dr_wav__on_seek_memory, pWav, pAllocationCallbacks)) { + if (!ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_memory, ma_dr_wav__on_seek_memory, ma_dr_wav__on_tell_memory, pWav, pAllocationCallbacks)) { return MA_FALSE; } pWav->memoryStream.data = (const ma_uint8*)data; @@ -80734,7 +82624,7 @@ MA_API ma_bool32 ma_dr_wav_init_memory_with_metadata(ma_dr_wav* pWav, const void if (data == NULL || dataSize == 0) { return MA_FALSE; } - if (!ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_memory, ma_dr_wav__on_seek_memory, pWav, pAllocationCallbacks)) { + if (!ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_memory, ma_dr_wav__on_seek_memory, ma_dr_wav__on_tell_memory, pWav, pAllocationCallbacks)) { return MA_FALSE; } pWav->memoryStream.data = (const ma_uint8*)data; @@ -80793,30 +82683,30 @@ MA_API ma_result ma_dr_wav_uninit(ma_dr_wav* pWav) } if (pWav->onSeek && !pWav->isSequentialWrite) { if (pWav->container == ma_dr_wav_container_riff) { - if (pWav->onSeek(pWav->pUserData, 4, ma_dr_wav_seek_origin_start)) { + if (pWav->onSeek(pWav->pUserData, 4, MA_DR_WAV_SEEK_SET)) { ma_uint32 riffChunkSize = ma_dr_wav__riff_chunk_size_riff(pWav->dataChunkDataSize, pWav->pMetadata, pWav->metadataCount); ma_dr_wav__write_u32ne_to_le(pWav, riffChunkSize); } - if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 4, ma_dr_wav_seek_origin_start)) { + if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 4, MA_DR_WAV_SEEK_SET)) { ma_uint32 dataChunkSize = ma_dr_wav__data_chunk_size_riff(pWav->dataChunkDataSize); ma_dr_wav__write_u32ne_to_le(pWav, dataChunkSize); } } else if (pWav->container == ma_dr_wav_container_w64) { - if (pWav->onSeek(pWav->pUserData, 16, ma_dr_wav_seek_origin_start)) { + if (pWav->onSeek(pWav->pUserData, 16, MA_DR_WAV_SEEK_SET)) { ma_uint64 riffChunkSize = ma_dr_wav__riff_chunk_size_w64(pWav->dataChunkDataSize); ma_dr_wav__write_u64ne_to_le(pWav, riffChunkSize); } - if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 8, ma_dr_wav_seek_origin_start)) { + if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 8, MA_DR_WAV_SEEK_SET)) { ma_uint64 dataChunkSize = ma_dr_wav__data_chunk_size_w64(pWav->dataChunkDataSize); ma_dr_wav__write_u64ne_to_le(pWav, dataChunkSize); } } else if (pWav->container == ma_dr_wav_container_rf64) { int ds64BodyPos = 12 + 8; - if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 0, ma_dr_wav_seek_origin_start)) { + if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 0, MA_DR_WAV_SEEK_SET)) { ma_uint64 riffChunkSize = ma_dr_wav__riff_chunk_size_rf64(pWav->dataChunkDataSize, pWav->pMetadata, pWav->metadataCount); ma_dr_wav__write_u64ne_to_le(pWav, riffChunkSize); } - if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 8, ma_dr_wav_seek_origin_start)) { + if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 8, MA_DR_WAV_SEEK_SET)) { ma_uint64 dataChunkSize = ma_dr_wav__data_chunk_size_rf64(pWav->dataChunkDataSize); ma_dr_wav__write_u64ne_to_le(pWav, dataChunkSize); } @@ -80863,7 +82753,7 @@ MA_API size_t ma_dr_wav_read_raw(ma_dr_wav* pWav, size_t bytesToRead, void* pBuf if (bytesToSeek > 0x7FFFFFFF) { bytesToSeek = 0x7FFFFFFF; } - if (pWav->onSeek(pWav->pUserData, (int)bytesToSeek, ma_dr_wav_seek_origin_current) == MA_FALSE) { + if (pWav->onSeek(pWav->pUserData, (int)bytesToSeek, MA_DR_WAV_SEEK_CUR) == MA_FALSE) { break; } bytesRead += bytesToSeek; @@ -80962,7 +82852,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav_seek_to_first_pcm_frame(ma_dr_wav* pWav) if (pWav->onWrite != NULL) { return MA_FALSE; } - if (!pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos, ma_dr_wav_seek_origin_start)) { + if (!pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos, MA_DR_WAV_SEEK_SET)) { return MA_FALSE; } if (ma_dr_wav__is_compressed_format_tag(pWav->translatedFormatTag)) { @@ -81043,7 +82933,7 @@ MA_API ma_bool32 ma_dr_wav_seek_to_pcm_frame(ma_dr_wav* pWav, ma_uint64 targetFr } while (offset > 0) { int offset32 = ((offset > INT_MAX) ? INT_MAX : (int)offset); - if (!pWav->onSeek(pWav->pUserData, offset32, ma_dr_wav_seek_origin_current)) { + if (!pWav->onSeek(pWav->pUserData, offset32, MA_DR_WAV_SEEK_CUR)) { return MA_FALSE; } pWav->readCursorInPCMFrames += offset32 / bytesPerFrame; @@ -81169,12 +83059,12 @@ MA_API ma_uint64 ma_dr_wav_write_pcm_frames(ma_dr_wav* pWav, ma_uint64 framesToW MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__msadpcm(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut) { ma_uint64 totalFramesRead = 0; - static ma_int32 adaptationTable[] = { + static const ma_int32 adaptationTable[] = { 230, 230, 230, 230, 307, 409, 512, 614, 768, 614, 512, 409, 307, 230, 230, 230 }; - static ma_int32 coeff1Table[] = { 256, 512, 0, 192, 240, 460, 392 }; - static ma_int32 coeff2Table[] = { 0, -256, 0, 64, 0, -208, -232 }; + static const ma_int32 coeff1Table[] = { 256, 512, 0, 192, 240, 460, 392 }; + static const ma_int32 coeff2Table[] = { 0, -256, 0, 64, 0, -208, -232 }; MA_DR_WAV_ASSERT(pWav != NULL); MA_DR_WAV_ASSERT(framesToRead > 0); while (pWav->readCursorInPCMFrames < pWav->totalPCMFrameCount) { @@ -81193,7 +83083,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__msadpcm(ma_dr_wav* pWav, ma_ pWav->msadpcm.cachedFrames[2] = pWav->msadpcm.prevFrames[0][0]; pWav->msadpcm.cachedFrames[3] = pWav->msadpcm.prevFrames[0][1]; pWav->msadpcm.cachedFrameCount = 2; - if (pWav->msadpcm.predictor[0] >= ma_dr_wav_countof(coeff1Table)) { + if (pWav->msadpcm.predictor[0] >= ma_dr_wav_countof(coeff1Table) || pWav->msadpcm.predictor[0] >= ma_dr_wav_countof(coeff2Table)) { return totalFramesRead; } } else { @@ -81215,7 +83105,8 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__msadpcm(ma_dr_wav* pWav, ma_ pWav->msadpcm.cachedFrames[2] = pWav->msadpcm.prevFrames[0][1]; pWav->msadpcm.cachedFrames[3] = pWav->msadpcm.prevFrames[1][1]; pWav->msadpcm.cachedFrameCount = 2; - if (pWav->msadpcm.predictor[0] >= ma_dr_wav_countof(coeff1Table) || pWav->msadpcm.predictor[1] >= ma_dr_wav_countof(coeff2Table)) { + if (pWav->msadpcm.predictor[0] >= ma_dr_wav_countof(coeff1Table) || pWav->msadpcm.predictor[0] >= ma_dr_wav_countof(coeff2Table) || + pWav->msadpcm.predictor[1] >= ma_dr_wav_countof(coeff1Table) || pWav->msadpcm.predictor[1] >= ma_dr_wav_countof(coeff2Table)) { return totalFramesRead; } } @@ -81252,6 +83143,9 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__msadpcm(ma_dr_wav* pWav, ma_ if (pWav->channels == 1) { ma_int32 newSample0; ma_int32 newSample1; + if (pWav->msadpcm.predictor[0] >= ma_dr_wav_countof(coeff1Table) || pWav->msadpcm.predictor[0] >= ma_dr_wav_countof(coeff2Table)) { + return totalFramesRead; + } newSample0 = ((pWav->msadpcm.prevFrames[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevFrames[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8; newSample0 += nibble0 * pWav->msadpcm.delta[0]; newSample0 = ma_dr_wav_clamp(newSample0, -32768, 32767); @@ -81276,6 +83170,9 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__msadpcm(ma_dr_wav* pWav, ma_ } else { ma_int32 newSample0; ma_int32 newSample1; + if (pWav->msadpcm.predictor[0] >= ma_dr_wav_countof(coeff1Table) || pWav->msadpcm.predictor[0] >= ma_dr_wav_countof(coeff2Table)) { + return totalFramesRead; + } newSample0 = ((pWav->msadpcm.prevFrames[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevFrames[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8; newSample0 += nibble0 * pWav->msadpcm.delta[0]; newSample0 = ma_dr_wav_clamp(newSample0, -32768, 32767); @@ -81285,6 +83182,9 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__msadpcm(ma_dr_wav* pWav, ma_ } pWav->msadpcm.prevFrames[0][0] = pWav->msadpcm.prevFrames[0][1]; pWav->msadpcm.prevFrames[0][1] = newSample0; + if (pWav->msadpcm.predictor[1] >= ma_dr_wav_countof(coeff1Table) || pWav->msadpcm.predictor[1] >= ma_dr_wav_countof(coeff2Table)) { + return totalFramesRead; + } newSample1 = ((pWav->msadpcm.prevFrames[1][1] * coeff1Table[pWav->msadpcm.predictor[1]]) + (pWav->msadpcm.prevFrames[1][0] * coeff2Table[pWav->msadpcm.predictor[1]])) >> 8; newSample1 += nibble1 * pWav->msadpcm.delta[1]; newSample1 = ma_dr_wav_clamp(newSample1, -32768, 32767); @@ -81307,11 +83207,11 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ima(ma_dr_wav* pWav, ma_uint { ma_uint64 totalFramesRead = 0; ma_uint32 iChannel; - static ma_int32 indexTable[16] = { + static const ma_int32 indexTable[16] = { -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8 }; - static ma_int32 stepTable[89] = { + static const ma_int32 stepTable[89] = { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, @@ -81334,7 +83234,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ima(ma_dr_wav* pWav, ma_uint } pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); if (header[2] >= ma_dr_wav_countof(stepTable)) { - pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, ma_dr_wav_seek_origin_current); + pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, MA_DR_WAV_SEEK_CUR); pWav->ima.bytesRemainingInBlock = 0; return totalFramesRead; } @@ -81349,7 +83249,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ima(ma_dr_wav* pWav, ma_uint } pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); if (header[2] >= ma_dr_wav_countof(stepTable) || header[6] >= ma_dr_wav_countof(stepTable)) { - pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, ma_dr_wav_seek_origin_current); + pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, MA_DR_WAV_SEEK_CUR); pWav->ima.bytesRemainingInBlock = 0; return totalFramesRead; } @@ -81424,7 +83324,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ima(ma_dr_wav* pWav, ma_uint return totalFramesRead; } #ifndef MA_DR_WAV_NO_CONVERSION_API -static unsigned short g_ma_dr_wavAlawTable[256] = { +static const unsigned short ma_dr_wav_gAlawTable[256] = { 0xEA80, 0xEB80, 0xE880, 0xE980, 0xEE80, 0xEF80, 0xEC80, 0xED80, 0xE280, 0xE380, 0xE080, 0xE180, 0xE680, 0xE780, 0xE480, 0xE580, 0xF540, 0xF5C0, 0xF440, 0xF4C0, 0xF740, 0xF7C0, 0xF640, 0xF6C0, 0xF140, 0xF1C0, 0xF040, 0xF0C0, 0xF340, 0xF3C0, 0xF240, 0xF2C0, 0xAA00, 0xAE00, 0xA200, 0xA600, 0xBA00, 0xBE00, 0xB200, 0xB600, 0x8A00, 0x8E00, 0x8200, 0x8600, 0x9A00, 0x9E00, 0x9200, 0x9600, @@ -81442,7 +83342,7 @@ static unsigned short g_ma_dr_wavAlawTable[256] = { 0x0560, 0x0520, 0x05E0, 0x05A0, 0x0460, 0x0420, 0x04E0, 0x04A0, 0x0760, 0x0720, 0x07E0, 0x07A0, 0x0660, 0x0620, 0x06E0, 0x06A0, 0x02B0, 0x0290, 0x02F0, 0x02D0, 0x0230, 0x0210, 0x0270, 0x0250, 0x03B0, 0x0390, 0x03F0, 0x03D0, 0x0330, 0x0310, 0x0370, 0x0350 }; -static unsigned short g_ma_dr_wavMulawTable[256] = { +static const unsigned short ma_dr_wav_gMulawTable[256] = { 0x8284, 0x8684, 0x8A84, 0x8E84, 0x9284, 0x9684, 0x9A84, 0x9E84, 0xA284, 0xA684, 0xAA84, 0xAE84, 0xB284, 0xB684, 0xBA84, 0xBE84, 0xC184, 0xC384, 0xC584, 0xC784, 0xC984, 0xCB84, 0xCD84, 0xCF84, 0xD184, 0xD384, 0xD584, 0xD784, 0xD984, 0xDB84, 0xDD84, 0xDF84, 0xE104, 0xE204, 0xE304, 0xE404, 0xE504, 0xE604, 0xE704, 0xE804, 0xE904, 0xEA04, 0xEB04, 0xEC04, 0xED04, 0xEE04, 0xEF04, 0xF004, @@ -81462,11 +83362,11 @@ static unsigned short g_ma_dr_wavMulawTable[256] = { }; static MA_INLINE ma_int16 ma_dr_wav__alaw_to_s16(ma_uint8 sampleIn) { - return (short)g_ma_dr_wavAlawTable[sampleIn]; + return (short)ma_dr_wav_gAlawTable[sampleIn]; } static MA_INLINE ma_int16 ma_dr_wav__mulaw_to_s16(ma_uint8 sampleIn) { - return (short)g_ma_dr_wavMulawTable[sampleIn]; + return (short)ma_dr_wav_gMulawTable[sampleIn]; } MA_PRIVATE void ma_dr_wav__pcm_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t totalSampleCount, unsigned int bytesPerSample) { @@ -82529,6 +84429,10 @@ MA_PRIVATE ma_int16* ma_dr_wav__read_pcm_frames_and_close_s16(ma_dr_wav* pWav, u ma_int16* pSampleData; ma_uint64 framesRead; MA_DR_WAV_ASSERT(pWav != NULL); + if (pWav->channels == 0 || pWav->totalPCMFrameCount > MA_SIZE_MAX / pWav->channels / sizeof(ma_int16)) { + ma_dr_wav_uninit(pWav); + return NULL; + } sampleDataSize = pWav->totalPCMFrameCount * pWav->channels * sizeof(ma_int16); if (sampleDataSize > MA_SIZE_MAX) { ma_dr_wav_uninit(pWav); @@ -82563,6 +84467,10 @@ MA_PRIVATE float* ma_dr_wav__read_pcm_frames_and_close_f32(ma_dr_wav* pWav, unsi float* pSampleData; ma_uint64 framesRead; MA_DR_WAV_ASSERT(pWav != NULL); + if (pWav->channels == 0 || pWav->totalPCMFrameCount > MA_SIZE_MAX / pWav->channels / sizeof(float)) { + ma_dr_wav_uninit(pWav); + return NULL; + } sampleDataSize = pWav->totalPCMFrameCount * pWav->channels * sizeof(float); if (sampleDataSize > MA_SIZE_MAX) { ma_dr_wav_uninit(pWav); @@ -82597,6 +84505,10 @@ MA_PRIVATE ma_int32* ma_dr_wav__read_pcm_frames_and_close_s32(ma_dr_wav* pWav, u ma_int32* pSampleData; ma_uint64 framesRead; MA_DR_WAV_ASSERT(pWav != NULL); + if (pWav->channels == 0 || pWav->totalPCMFrameCount > MA_SIZE_MAX / pWav->channels / sizeof(ma_int32)) { + ma_dr_wav_uninit(pWav); + return NULL; + } sampleDataSize = pWav->totalPCMFrameCount * pWav->channels * sizeof(ma_int32); if (sampleDataSize > MA_SIZE_MAX) { ma_dr_wav_uninit(pWav); @@ -82625,7 +84537,7 @@ MA_PRIVATE ma_int32* ma_dr_wav__read_pcm_frames_and_close_s32(ma_dr_wav* pWav, u } return pSampleData; } -MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) { ma_dr_wav wav; if (channelsOut) { @@ -82637,12 +84549,12 @@ MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRe if (totalFrameCountOut) { *totalFrameCountOut = 0; } - if (!ma_dr_wav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) { + if (!ma_dr_wav_init(&wav, onRead, onSeek, onTell, pUserData, pAllocationCallbacks)) { return NULL; } return ma_dr_wav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut); } -MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) { ma_dr_wav wav; if (channelsOut) { @@ -82654,12 +84566,12 @@ MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, if (totalFrameCountOut) { *totalFrameCountOut = 0; } - if (!ma_dr_wav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) { + if (!ma_dr_wav_init(&wav, onRead, onSeek, onTell, pUserData, pAllocationCallbacks)) { return NULL; } return ma_dr_wav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); } -MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) { ma_dr_wav wav; if (channelsOut) { @@ -82671,7 +84583,7 @@ MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRe if (totalFrameCountOut) { *totalFrameCountOut = 0; } - if (!ma_dr_wav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) { + if (!ma_dr_wav_init(&wav, onRead, onSeek, onTell, pUserData, pAllocationCallbacks)) { return NULL; } return ma_dr_wav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); @@ -83979,7 +85891,7 @@ static MA_INLINE ma_uint32 ma_dr_flac__clz_lzcnt(ma_dr_flac_cache_t x) { ma_uint64 r; __asm__ __volatile__ ( - "lzcnt{ %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc" + "rep; bsr{q %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc" ); return (ma_uint32)r; } @@ -83987,11 +85899,11 @@ static MA_INLINE ma_uint32 ma_dr_flac__clz_lzcnt(ma_dr_flac_cache_t x) { ma_uint32 r; __asm__ __volatile__ ( - "lzcnt{l %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc" + "rep; bsr{l %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc" ); return r; } - #elif defined(MA_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) && !defined(__ARM_ARCH_6M__) && !defined(MA_64BIT) + #elif defined(MA_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) && !defined(__ARM_ARCH_6M__) && !(defined(__thumb__) && !defined(__thumb2__)) && !defined(MA_64BIT) { unsigned int r; __asm__ __volatile__ ( @@ -84106,23 +86018,23 @@ static ma_bool32 ma_dr_flac__seek_to_byte(ma_dr_flac_bs* bs, ma_uint64 offsetFro MA_DR_FLAC_ASSERT(offsetFromStart > 0); if (offsetFromStart > 0x7FFFFFFF) { ma_uint64 bytesRemaining = offsetFromStart; - if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_start)) { + if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, MA_DR_FLAC_SEEK_SET)) { return MA_FALSE; } bytesRemaining -= 0x7FFFFFFF; while (bytesRemaining > 0x7FFFFFFF) { - if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_current)) { + if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, MA_DR_FLAC_SEEK_CUR)) { return MA_FALSE; } bytesRemaining -= 0x7FFFFFFF; } if (bytesRemaining > 0) { - if (!bs->onSeek(bs->pUserData, (int)bytesRemaining, ma_dr_flac_seek_origin_current)) { + if (!bs->onSeek(bs->pUserData, (int)bytesRemaining, MA_DR_FLAC_SEEK_CUR)) { return MA_FALSE; } } } else { - if (!bs->onSeek(bs->pUserData, (int)offsetFromStart, ma_dr_flac_seek_origin_start)) { + if (!bs->onSeek(bs->pUserData, (int)offsetFromStart, MA_DR_FLAC_SEEK_SET)) { return MA_FALSE; } } @@ -86600,6 +88512,7 @@ typedef struct { ma_dr_flac_read_proc onRead; ma_dr_flac_seek_proc onSeek; + ma_dr_flac_tell_proc onTell; ma_dr_flac_meta_proc onMeta; ma_dr_flac_container container; void* pUserData; @@ -86728,11 +88641,12 @@ static void ma_dr_flac__free_from_callbacks(void* p, const ma_allocation_callbac pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData); } } -static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, void* pUserDataMD, ma_uint64* pFirstFramePos, ma_uint64* pSeektablePos, ma_uint32* pSeekpointCount, ma_allocation_callbacks* pAllocationCallbacks) +static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, void* pUserData, void* pUserDataMD, ma_uint64* pFirstFramePos, ma_uint64* pSeektablePos, ma_uint32* pSeekpointCount, ma_allocation_callbacks* pAllocationCallbacks) { ma_uint64 runningFilePos = 42; ma_uint64 seektablePos = 0; ma_uint32 seektableSize = 0; + (void)onTell; for (;;) { ma_dr_flac_metadata metadata; ma_uint8 isLastBlock = 0; @@ -86743,8 +88657,9 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea } runningFilePos += 4; metadata.type = blockType; - metadata.pRawData = NULL; metadata.rawDataSize = 0; + metadata.rawDataOffset = runningFilePos; + metadata.pRawData = NULL; switch (blockType) { case MA_DR_FLAC_METADATA_BLOCK_TYPE_APPLICATION: @@ -86944,53 +88859,124 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea return MA_FALSE; } if (onMeta) { - void* pRawData; - const char* pRunningData; - const char* pRunningDataEnd; - pRawData = ma_dr_flac__malloc_from_callbacks(blockSize, pAllocationCallbacks); - if (pRawData == NULL) { + ma_bool32 result = MA_TRUE; + ma_uint32 blockSizeRemaining = blockSize; + char* pMime = NULL; + char* pDescription = NULL; + void* pPictureData = NULL; + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.type, 4) != 4) { + result = MA_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.type = ma_dr_flac__be2host_32(metadata.data.picture.type); + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.mimeLength, 4) != 4) { + result = MA_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.mimeLength = ma_dr_flac__be2host_32(metadata.data.picture.mimeLength); + pMime = (char*)ma_dr_flac__malloc_from_callbacks(metadata.data.picture.mimeLength + 1, pAllocationCallbacks); + if (pMime == NULL) { + result = MA_FALSE; + goto done_flac; + } + if (blockSizeRemaining < metadata.data.picture.mimeLength || onRead(pUserData, pMime, metadata.data.picture.mimeLength) != metadata.data.picture.mimeLength) { + result = MA_FALSE; + goto done_flac; + } + blockSizeRemaining -= metadata.data.picture.mimeLength; + pMime[metadata.data.picture.mimeLength] = '\0'; + metadata.data.picture.mime = (const char*)pMime; + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.descriptionLength, 4) != 4) { + result = MA_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.descriptionLength = ma_dr_flac__be2host_32(metadata.data.picture.descriptionLength); + pDescription = (char*)ma_dr_flac__malloc_from_callbacks(metadata.data.picture.descriptionLength + 1, pAllocationCallbacks); + if (pDescription == NULL) { + result = MA_FALSE; + goto done_flac; + } + if (blockSizeRemaining < metadata.data.picture.descriptionLength || onRead(pUserData, pDescription, metadata.data.picture.descriptionLength) != metadata.data.picture.descriptionLength) { + result = MA_FALSE; + goto done_flac; + } + blockSizeRemaining -= metadata.data.picture.descriptionLength; + pDescription[metadata.data.picture.descriptionLength] = '\0'; + metadata.data.picture.description = (const char*)pDescription; + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.width, 4) != 4) { + result = MA_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.width = ma_dr_flac__be2host_32(metadata.data.picture.width); + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.height, 4) != 4) { + result = MA_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.height = ma_dr_flac__be2host_32(metadata.data.picture.height); + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.colorDepth, 4) != 4) { + result = MA_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.colorDepth = ma_dr_flac__be2host_32(metadata.data.picture.colorDepth); + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.indexColorCount, 4) != 4) { + result = MA_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.indexColorCount = ma_dr_flac__be2host_32(metadata.data.picture.indexColorCount); + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.pictureDataSize, 4) != 4) { + result = MA_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.pictureDataSize = ma_dr_flac__be2host_32(metadata.data.picture.pictureDataSize); + if (blockSizeRemaining < metadata.data.picture.pictureDataSize) { + result = MA_FALSE; + goto done_flac; + } + metadata.data.picture.pictureDataOffset = runningFilePos + (blockSize - blockSizeRemaining); + #ifndef MA_DR_FLAC_NO_PICTURE_METADATA_MALLOC + pPictureData = ma_dr_flac__malloc_from_callbacks(metadata.data.picture.pictureDataSize, pAllocationCallbacks); + if (pPictureData != NULL) { + if (onRead(pUserData, pPictureData, metadata.data.picture.pictureDataSize) != metadata.data.picture.pictureDataSize) { + result = MA_FALSE; + goto done_flac; + } + } else + #endif + { + if (!onSeek(pUserData, metadata.data.picture.pictureDataSize, MA_DR_FLAC_SEEK_CUR)) { + result = MA_FALSE; + goto done_flac; + } + } + blockSizeRemaining -= metadata.data.picture.pictureDataSize; + (void)blockSizeRemaining; + metadata.data.picture.pPictureData = (const ma_uint8*)pPictureData; + if (metadata.data.picture.pictureDataOffset != 0 || metadata.data.picture.pPictureData != NULL) { + onMeta(pUserDataMD, &metadata); + } else { + } + done_flac: + ma_dr_flac__free_from_callbacks(pMime, pAllocationCallbacks); + ma_dr_flac__free_from_callbacks(pDescription, pAllocationCallbacks); + ma_dr_flac__free_from_callbacks(pPictureData, pAllocationCallbacks); + if (result != MA_TRUE) { return MA_FALSE; } - if (onRead(pUserData, pRawData, blockSize) != blockSize) { - ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks); - return MA_FALSE; - } - metadata.pRawData = pRawData; - metadata.rawDataSize = blockSize; - pRunningData = (const char*)pRawData; - pRunningDataEnd = (const char*)pRawData + blockSize; - metadata.data.picture.type = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.mimeLength = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - if ((pRunningDataEnd - pRunningData) - 24 < (ma_int64)metadata.data.picture.mimeLength) { - ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks); - return MA_FALSE; - } - metadata.data.picture.mime = pRunningData; pRunningData += metadata.data.picture.mimeLength; - metadata.data.picture.descriptionLength = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - if ((pRunningDataEnd - pRunningData) - 20 < (ma_int64)metadata.data.picture.descriptionLength) { - ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks); - return MA_FALSE; - } - metadata.data.picture.description = pRunningData; pRunningData += metadata.data.picture.descriptionLength; - metadata.data.picture.width = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.height = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.colorDepth = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.indexColorCount = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.pictureDataSize = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.pPictureData = (const ma_uint8*)pRunningData; - if (pRunningDataEnd - pRunningData < (ma_int64)metadata.data.picture.pictureDataSize) { - ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks); - return MA_FALSE; - } - onMeta(pUserDataMD, &metadata); - ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks); } } break; case MA_DR_FLAC_METADATA_BLOCK_TYPE_PADDING: { if (onMeta) { metadata.data.padding.unused = 0; - if (!onSeek(pUserData, blockSize, ma_dr_flac_seek_origin_current)) { + if (!onSeek(pUserData, blockSize, MA_DR_FLAC_SEEK_CUR)) { isLastBlock = MA_TRUE; } else { onMeta(pUserDataMD, &metadata); @@ -87000,7 +88986,7 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea case MA_DR_FLAC_METADATA_BLOCK_TYPE_INVALID: { if (onMeta) { - if (!onSeek(pUserData, blockSize, ma_dr_flac_seek_origin_current)) { + if (!onSeek(pUserData, blockSize, MA_DR_FLAC_SEEK_CUR)) { isLastBlock = MA_TRUE; } } @@ -87009,12 +88995,15 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea { if (onMeta) { void* pRawData = ma_dr_flac__malloc_from_callbacks(blockSize, pAllocationCallbacks); - if (pRawData == NULL) { - return MA_FALSE; - } - if (onRead(pUserData, pRawData, blockSize) != blockSize) { - ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks); - return MA_FALSE; + if (pRawData != NULL) { + if (onRead(pUserData, pRawData, blockSize) != blockSize) { + ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks); + return MA_FALSE; + } + } else { + if (!onSeek(pUserData, blockSize, MA_DR_FLAC_SEEK_CUR)) { + return MA_FALSE; + } } metadata.pRawData = pRawData; metadata.rawDataSize = blockSize; @@ -87024,7 +89013,7 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea } break; } if (onMeta == NULL && blockSize > 0) { - if (!onSeek(pUserData, blockSize, ma_dr_flac_seek_origin_current)) { + if (!onSeek(pUserData, blockSize, MA_DR_FLAC_SEEK_CUR)) { isLastBlock = MA_TRUE; } } @@ -87288,6 +89277,7 @@ typedef struct { ma_dr_flac_read_proc onRead; ma_dr_flac_seek_proc onSeek; + ma_dr_flac_tell_proc onTell; void* pUserData; ma_uint64 currentBytePos; ma_uint64 firstBytePos; @@ -87306,29 +89296,29 @@ static size_t ma_dr_flac_oggbs__read_physical(ma_dr_flac_oggbs* oggbs, void* buf } static ma_bool32 ma_dr_flac_oggbs__seek_physical(ma_dr_flac_oggbs* oggbs, ma_uint64 offset, ma_dr_flac_seek_origin origin) { - if (origin == ma_dr_flac_seek_origin_start) { + if (origin == MA_DR_FLAC_SEEK_SET) { if (offset <= 0x7FFFFFFF) { - if (!oggbs->onSeek(oggbs->pUserData, (int)offset, ma_dr_flac_seek_origin_start)) { + if (!oggbs->onSeek(oggbs->pUserData, (int)offset, MA_DR_FLAC_SEEK_SET)) { return MA_FALSE; } oggbs->currentBytePos = offset; return MA_TRUE; } else { - if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_start)) { + if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, MA_DR_FLAC_SEEK_SET)) { return MA_FALSE; } oggbs->currentBytePos = offset; - return ma_dr_flac_oggbs__seek_physical(oggbs, offset - 0x7FFFFFFF, ma_dr_flac_seek_origin_current); + return ma_dr_flac_oggbs__seek_physical(oggbs, offset - 0x7FFFFFFF, MA_DR_FLAC_SEEK_CUR); } } else { while (offset > 0x7FFFFFFF) { - if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_current)) { + if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, MA_DR_FLAC_SEEK_CUR)) { return MA_FALSE; } oggbs->currentBytePos += 0x7FFFFFFF; offset -= 0x7FFFFFFF; } - if (!oggbs->onSeek(oggbs->pUserData, (int)offset, ma_dr_flac_seek_origin_current)) { + if (!oggbs->onSeek(oggbs->pUserData, (int)offset, MA_DR_FLAC_SEEK_CUR)) { return MA_FALSE; } oggbs->currentBytePos += offset; @@ -87354,7 +89344,7 @@ static ma_bool32 ma_dr_flac_oggbs__goto_next_page(ma_dr_flac_oggbs* oggbs, ma_dr continue; } if (header.serialNumber != oggbs->serialNumber) { - if (pageBodySize > 0 && !ma_dr_flac_oggbs__seek_physical(oggbs, pageBodySize, ma_dr_flac_seek_origin_current)) { + if (pageBodySize > 0 && !ma_dr_flac_oggbs__seek_physical(oggbs, pageBodySize, MA_DR_FLAC_SEEK_CUR)) { return MA_FALSE; } continue; @@ -87416,7 +89406,7 @@ static ma_bool32 ma_dr_flac_oggbs__seek_to_next_packet(ma_dr_flac_oggbs* oggbs) } bytesToEndOfPacketOrPage += segmentSize; } - ma_dr_flac_oggbs__seek_physical(oggbs, bytesToEndOfPacketOrPage, ma_dr_flac_seek_origin_current); + ma_dr_flac_oggbs__seek_physical(oggbs, bytesToEndOfPacketOrPage, MA_DR_FLAC_SEEK_CUR); oggbs->bytesRemainingInPage -= bytesToEndOfPacketOrPage; if (atEndOfPage) { if (!ma_dr_flac_oggbs__goto_next_page(oggbs)) { @@ -87469,36 +89459,44 @@ static ma_bool32 ma_dr_flac__on_seek_ogg(void* pUserData, int offset, ma_dr_flac int bytesSeeked = 0; MA_DR_FLAC_ASSERT(oggbs != NULL); MA_DR_FLAC_ASSERT(offset >= 0); - if (origin == ma_dr_flac_seek_origin_start) { - if (!ma_dr_flac_oggbs__seek_physical(oggbs, (int)oggbs->firstBytePos, ma_dr_flac_seek_origin_start)) { + if (origin == MA_DR_FLAC_SEEK_SET) { + if (!ma_dr_flac_oggbs__seek_physical(oggbs, (int)oggbs->firstBytePos, MA_DR_FLAC_SEEK_SET)) { return MA_FALSE; } if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_fail_on_crc_mismatch)) { return MA_FALSE; } - return ma_dr_flac__on_seek_ogg(pUserData, offset, ma_dr_flac_seek_origin_current); - } - MA_DR_FLAC_ASSERT(origin == ma_dr_flac_seek_origin_current); - while (bytesSeeked < offset) { - int bytesRemainingToSeek = offset - bytesSeeked; - MA_DR_FLAC_ASSERT(bytesRemainingToSeek >= 0); - if (oggbs->bytesRemainingInPage >= (size_t)bytesRemainingToSeek) { - bytesSeeked += bytesRemainingToSeek; - (void)bytesSeeked; - oggbs->bytesRemainingInPage -= bytesRemainingToSeek; - break; - } - if (oggbs->bytesRemainingInPage > 0) { - bytesSeeked += (int)oggbs->bytesRemainingInPage; - oggbs->bytesRemainingInPage = 0; - } - MA_DR_FLAC_ASSERT(bytesRemainingToSeek > 0); - if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_fail_on_crc_mismatch)) { - return MA_FALSE; + return ma_dr_flac__on_seek_ogg(pUserData, offset, MA_DR_FLAC_SEEK_CUR); + } else if (origin == MA_DR_FLAC_SEEK_CUR) { + while (bytesSeeked < offset) { + int bytesRemainingToSeek = offset - bytesSeeked; + MA_DR_FLAC_ASSERT(bytesRemainingToSeek >= 0); + if (oggbs->bytesRemainingInPage >= (size_t)bytesRemainingToSeek) { + bytesSeeked += bytesRemainingToSeek; + (void)bytesSeeked; + oggbs->bytesRemainingInPage -= bytesRemainingToSeek; + break; + } + if (oggbs->bytesRemainingInPage > 0) { + bytesSeeked += (int)oggbs->bytesRemainingInPage; + oggbs->bytesRemainingInPage = 0; + } + MA_DR_FLAC_ASSERT(bytesRemainingToSeek > 0); + if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_fail_on_crc_mismatch)) { + return MA_FALSE; + } } + } else if (origin == MA_DR_FLAC_SEEK_END) { + return MA_FALSE; } return MA_TRUE; } +static ma_bool32 ma_dr_flac__on_tell_ogg(void* pUserData, ma_int64* pCursor) +{ + (void)pUserData; + (void)pCursor; + return MA_FALSE; +} static ma_bool32 ma_dr_flac_ogg__seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64 pcmFrameIndex) { ma_dr_flac_oggbs* oggbs = (ma_dr_flac_oggbs*)pFlac->_oggbs; @@ -87515,7 +89513,7 @@ static ma_bool32 ma_dr_flac_ogg__seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64 runningGranulePosition = 0; for (;;) { if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_recover_on_crc_mismatch)) { - ma_dr_flac_oggbs__seek_physical(oggbs, originalBytePos, ma_dr_flac_seek_origin_start); + ma_dr_flac_oggbs__seek_physical(oggbs, originalBytePos, MA_DR_FLAC_SEEK_SET); return MA_FALSE; } runningFrameBytePos = oggbs->currentBytePos - ma_dr_flac_ogg__get_page_header_size(&oggbs->currentPageHeader) - oggbs->pageDataSize; @@ -87534,7 +89532,7 @@ static ma_bool32 ma_dr_flac_ogg__seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64 } } } - if (!ma_dr_flac_oggbs__seek_physical(oggbs, runningFrameBytePos, ma_dr_flac_seek_origin_start)) { + if (!ma_dr_flac_oggbs__seek_physical(oggbs, runningFrameBytePos, MA_DR_FLAC_SEEK_SET)) { return MA_FALSE; } if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_recover_on_crc_mismatch)) { @@ -87629,7 +89627,7 @@ static ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_d if (mappingVersion[0] != 1) { return MA_FALSE; } - if (!onSeek(pUserData, 2, ma_dr_flac_seek_origin_current)) { + if (!onSeek(pUserData, 2, MA_DR_FLAC_SEEK_CUR)) { return MA_FALSE; } if (onRead(pUserData, sig, 4) != 4) { @@ -87674,17 +89672,17 @@ static ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_d return MA_FALSE; } } else { - if (!onSeek(pUserData, bytesRemainingInPage, ma_dr_flac_seek_origin_current)) { + if (!onSeek(pUserData, bytesRemainingInPage, MA_DR_FLAC_SEEK_CUR)) { return MA_FALSE; } } } else { - if (!onSeek(pUserData, bytesRemainingInPage, ma_dr_flac_seek_origin_current)) { + if (!onSeek(pUserData, bytesRemainingInPage, MA_DR_FLAC_SEEK_CUR)) { return MA_FALSE; } } } else { - if (!onSeek(pUserData, pageBodySize, ma_dr_flac_seek_origin_current)) { + if (!onSeek(pUserData, pageBodySize, MA_DR_FLAC_SEEK_CUR)) { return MA_FALSE; } } @@ -87698,7 +89696,7 @@ static ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_d return MA_TRUE; } #endif -static ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, void* pUserDataMD) +static ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, void* pUserDataMD) { ma_bool32 relaxed; ma_uint8 id[4]; @@ -87708,12 +89706,14 @@ static ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_fla MA_DR_FLAC_ZERO_MEMORY(pInit, sizeof(*pInit)); pInit->onRead = onRead; pInit->onSeek = onSeek; + pInit->onTell = onTell; pInit->onMeta = onMeta; pInit->container = container; pInit->pUserData = pUserData; pInit->pUserDataMD = pUserDataMD; pInit->bs.onRead = onRead; pInit->bs.onSeek = onSeek; + pInit->bs.onTell = onTell; pInit->bs.pUserData = pUserData; ma_dr_flac__reset_cache(&pInit->bs); relaxed = container != ma_dr_flac_container_unknown; @@ -87736,7 +89736,7 @@ static ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_fla if (flags & 0x10) { headerSize += 10; } - if (!onSeek(pUserData, headerSize, ma_dr_flac_seek_origin_current)) { + if (!onSeek(pUserData, headerSize, MA_DR_FLAC_SEEK_CUR)) { return MA_FALSE; } pInit->runningFilePos += headerSize; @@ -87779,7 +89779,7 @@ static void ma_dr_flac__init_from_info(ma_dr_flac* pFlac, const ma_dr_flac_init_ pFlac->totalPCMFrameCount = pInit->totalPCMFrameCount; pFlac->container = pInit->container; } -static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, void* pUserDataMD, const ma_allocation_callbacks* pAllocationCallbacks) +static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, void* pUserDataMD, const ma_allocation_callbacks* pAllocationCallbacks) { ma_dr_flac_init_info init; ma_uint32 allocationSize; @@ -87794,7 +89794,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on ma_allocation_callbacks allocationCallbacks; ma_dr_flac* pFlac; ma_dr_flac__init_cpu_caps(); - if (!ma_dr_flac__init_private(&init, onRead, onSeek, onMeta, container, pUserData, pUserDataMD)) { + if (!ma_dr_flac__init_private(&init, onRead, onSeek, onTell, onMeta, container, pUserData, pUserDataMD)) { return NULL; } if (pAllocationCallbacks != NULL) { @@ -87827,6 +89827,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on MA_DR_FLAC_ZERO_MEMORY(pOggbs, sizeof(*pOggbs)); pOggbs->onRead = onRead; pOggbs->onSeek = onSeek; + pOggbs->onTell = onTell; pOggbs->pUserData = pUserData; pOggbs->currentBytePos = init.oggFirstBytePos; pOggbs->firstBytePos = init.oggFirstBytePos; @@ -87841,15 +89842,17 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on if (init.hasMetadataBlocks) { ma_dr_flac_read_proc onReadOverride = onRead; ma_dr_flac_seek_proc onSeekOverride = onSeek; + ma_dr_flac_tell_proc onTellOverride = onTell; void* pUserDataOverride = pUserData; #ifndef MA_DR_FLAC_NO_OGG if (init.container == ma_dr_flac_container_ogg) { onReadOverride = ma_dr_flac__on_read_ogg; onSeekOverride = ma_dr_flac__on_seek_ogg; + onTellOverride = ma_dr_flac__on_tell_ogg; pUserDataOverride = (void*)pOggbs; } #endif - if (!ma_dr_flac__read_and_decode_metadata(onReadOverride, onSeekOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seekpointCount, &allocationCallbacks)) { + if (!ma_dr_flac__read_and_decode_metadata(onReadOverride, onSeekOverride, onTellOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seekpointCount, &allocationCallbacks)) { #ifndef MA_DR_FLAC_NO_OGG ma_dr_flac__free_from_callbacks(pOggbs, &allocationCallbacks); #endif @@ -87875,6 +89878,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on pOggbs = NULL; pFlac->bs.onRead = ma_dr_flac__on_read_ogg; pFlac->bs.onSeek = ma_dr_flac__on_seek_ogg; + pFlac->bs.onTell = ma_dr_flac__on_tell_ogg; pFlac->bs.pUserData = (void*)pInternalOggbs; pFlac->_oggbs = (void*)pInternalOggbs; } @@ -87894,7 +89898,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on pFlac->pSeekpoints = (ma_dr_flac_seekpoint*)((ma_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize); MA_DR_FLAC_ASSERT(pFlac->bs.onSeek != NULL); MA_DR_FLAC_ASSERT(pFlac->bs.onRead != NULL); - if (pFlac->bs.onSeek(pFlac->bs.pUserData, (int)seektablePos, ma_dr_flac_seek_origin_start)) { + if (pFlac->bs.onSeek(pFlac->bs.pUserData, (int)seektablePos, MA_DR_FLAC_SEEK_SET)) { ma_uint32 iSeekpoint; for (iSeekpoint = 0; iSeekpoint < seekpointCount; iSeekpoint += 1) { if (pFlac->bs.onRead(pFlac->bs.pUserData, pFlac->pSeekpoints + iSeekpoint, MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES) == MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES) { @@ -87907,7 +89911,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on break; } } - if (!pFlac->bs.onSeek(pFlac->bs.pUserData, (int)pFlac->firstFLACFramePosInBytes, ma_dr_flac_seek_origin_start)) { + if (!pFlac->bs.onSeek(pFlac->bs.pUserData, (int)pFlac->firstFLACFramePosInBytes, MA_DR_FLAC_SEEK_SET)) { ma_dr_flac__free_from_callbacks(pFlac, &allocationCallbacks); return NULL; } @@ -87950,8 +89954,31 @@ static size_t ma_dr_flac__on_read_stdio(void* pUserData, void* bufferOut, size_t } static ma_bool32 ma_dr_flac__on_seek_stdio(void* pUserData, int offset, ma_dr_flac_seek_origin origin) { - MA_DR_FLAC_ASSERT(offset >= 0); - return fseek((FILE*)pUserData, offset, (origin == ma_dr_flac_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; + int whence = SEEK_SET; + if (origin == MA_DR_FLAC_SEEK_CUR) { + whence = SEEK_CUR; + } else if (origin == MA_DR_FLAC_SEEK_END) { + whence = SEEK_END; + } + return fseek((FILE*)pUserData, offset, whence) == 0; +} +static ma_bool32 ma_dr_flac__on_tell_stdio(void* pUserData, ma_int64* pCursor) +{ + FILE* pFileStdio = (FILE*)pUserData; + ma_int64 result; + MA_DR_FLAC_ASSERT(pFileStdio != NULL); + MA_DR_FLAC_ASSERT(pCursor != NULL); +#if defined(_WIN32) && !defined(NXDK) + #if defined(_MSC_VER) && _MSC_VER > 1200 + result = _ftelli64(pFileStdio); + #else + result = ftell(pFileStdio); + #endif +#else + result = ftell(pFileStdio); +#endif + *pCursor = result; + return MA_TRUE; } MA_API ma_dr_flac* ma_dr_flac_open_file(const char* pFileName, const ma_allocation_callbacks* pAllocationCallbacks) { @@ -87960,7 +89987,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file(const char* pFileName, const ma_allocati if (ma_fopen(&pFile, pFileName, "rb") != MA_SUCCESS) { return NULL; } - pFlac = ma_dr_flac_open(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, (void*)pFile, pAllocationCallbacks); + pFlac = ma_dr_flac_open(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, ma_dr_flac__on_tell_stdio, (void*)pFile, pAllocationCallbacks); if (pFlac == NULL) { fclose(pFile); return NULL; @@ -87975,7 +90002,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_w(const wchar_t* pFileName, const ma_all if (ma_wfopen(&pFile, pFileName, L"rb", pAllocationCallbacks) != MA_SUCCESS) { return NULL; } - pFlac = ma_dr_flac_open(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, (void*)pFile, pAllocationCallbacks); + pFlac = ma_dr_flac_open(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, ma_dr_flac__on_tell_stdio, (void*)pFile, pAllocationCallbacks); if (pFlac == NULL) { fclose(pFile); return NULL; @@ -87990,7 +90017,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata(const char* pFileName, ma_ if (ma_fopen(&pFile, pFileName, "rb") != MA_SUCCESS) { return NULL; } - pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, onMeta, ma_dr_flac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); + pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, ma_dr_flac__on_tell_stdio, onMeta, ma_dr_flac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); if (pFlac == NULL) { fclose(pFile); return pFlac; @@ -88005,7 +90032,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata_w(const wchar_t* pFileName if (ma_wfopen(&pFile, pFileName, L"rb", pAllocationCallbacks) != MA_SUCCESS) { return NULL; } - pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, onMeta, ma_dr_flac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); + pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, ma_dr_flac__on_tell_stdio, onMeta, ma_dr_flac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); if (pFlac == NULL) { fclose(pFile); return pFlac; @@ -88033,24 +90060,34 @@ static size_t ma_dr_flac__on_read_memory(void* pUserData, void* bufferOut, size_ static ma_bool32 ma_dr_flac__on_seek_memory(void* pUserData, int offset, ma_dr_flac_seek_origin origin) { ma_dr_flac__memory_stream* memoryStream = (ma_dr_flac__memory_stream*)pUserData; + ma_int64 newCursor; MA_DR_FLAC_ASSERT(memoryStream != NULL); - MA_DR_FLAC_ASSERT(offset >= 0); - if (offset > (ma_int64)memoryStream->dataSize) { + if (origin == MA_DR_FLAC_SEEK_SET) { + newCursor = 0; + } else if (origin == MA_DR_FLAC_SEEK_CUR) { + newCursor = (ma_int64)memoryStream->currentReadPos; + } else if (origin == MA_DR_FLAC_SEEK_END) { + newCursor = (ma_int64)memoryStream->dataSize; + } else { + MA_DR_FLAC_ASSERT(!"Invalid seek origin"); return MA_FALSE; } - if (origin == ma_dr_flac_seek_origin_current) { - if (memoryStream->currentReadPos + offset <= memoryStream->dataSize) { - memoryStream->currentReadPos += offset; - } else { - return MA_FALSE; - } - } else { - if ((ma_uint32)offset <= memoryStream->dataSize) { - memoryStream->currentReadPos = offset; - } else { - return MA_FALSE; - } + newCursor += offset; + if (newCursor < 0) { + return MA_FALSE; } + if ((size_t)newCursor > memoryStream->dataSize) { + return MA_FALSE; + } + memoryStream->currentReadPos = (size_t)newCursor; + return MA_TRUE; +} +static ma_bool32 ma_dr_flac__on_tell_memory(void* pUserData, ma_int64* pCursor) +{ + ma_dr_flac__memory_stream* memoryStream = (ma_dr_flac__memory_stream*)pUserData; + MA_DR_FLAC_ASSERT(memoryStream != NULL); + MA_DR_FLAC_ASSERT(pCursor != NULL); + *pCursor = (ma_int64)memoryStream->currentReadPos; return MA_TRUE; } MA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks) @@ -88060,7 +90097,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, co memoryStream.data = (const ma_uint8*)pData; memoryStream.dataSize = dataSize; memoryStream.currentReadPos = 0; - pFlac = ma_dr_flac_open(ma_dr_flac__on_read_memory, ma_dr_flac__on_seek_memory, &memoryStream, pAllocationCallbacks); + pFlac = ma_dr_flac_open(ma_dr_flac__on_read_memory, ma_dr_flac__on_seek_memory, ma_dr_flac__on_tell_memory, &memoryStream, pAllocationCallbacks); if (pFlac == NULL) { return NULL; } @@ -88085,7 +90122,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_ memoryStream.data = (const ma_uint8*)pData; memoryStream.dataSize = dataSize; memoryStream.currentReadPos = 0; - pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_memory, ma_dr_flac__on_seek_memory, onMeta, ma_dr_flac_container_unknown, &memoryStream, pUserData, pAllocationCallbacks); + pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_memory, ma_dr_flac__on_seek_memory, ma_dr_flac__on_tell_memory, onMeta, ma_dr_flac_container_unknown, &memoryStream, pUserData, pAllocationCallbacks); if (pFlac == NULL) { return NULL; } @@ -88103,21 +90140,21 @@ MA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_ } return pFlac; } -MA_API ma_dr_flac* ma_dr_flac_open(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_dr_flac* ma_dr_flac_open(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) { - return ma_dr_flac_open_with_metadata_private(onRead, onSeek, NULL, ma_dr_flac_container_unknown, pUserData, pUserData, pAllocationCallbacks); + return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onTell, NULL, ma_dr_flac_container_unknown, pUserData, pUserData, pAllocationCallbacks); } -MA_API ma_dr_flac* ma_dr_flac_open_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_dr_flac* ma_dr_flac_open_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) { - return ma_dr_flac_open_with_metadata_private(onRead, onSeek, NULL, container, pUserData, pUserData, pAllocationCallbacks); + return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onTell, NULL, container, pUserData, pUserData, pAllocationCallbacks); } -MA_API ma_dr_flac* ma_dr_flac_open_with_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_dr_flac* ma_dr_flac_open_with_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) { - return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onMeta, ma_dr_flac_container_unknown, pUserData, pUserData, pAllocationCallbacks); + return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onTell, onMeta, ma_dr_flac_container_unknown, pUserData, pUserData, pAllocationCallbacks); } -MA_API ma_dr_flac* ma_dr_flac_open_with_metadata_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_dr_flac* ma_dr_flac_open_with_metadata_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) { - return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onMeta, container, pUserData, pUserData, pAllocationCallbacks); + return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onTell, onMeta, container, pUserData, pUserData, pAllocationCallbacks); } MA_API void ma_dr_flac_close(ma_dr_flac* pFlac) { @@ -90345,56 +92382,41 @@ static type* ma_dr_flac__full_read_and_close_ ## extension (ma_dr_flac* pFlac, u { \ type* pSampleData = NULL; \ ma_uint64 totalPCMFrameCount; \ + type buffer[4096]; \ + ma_uint64 pcmFramesRead; \ + size_t sampleDataBufferSize = sizeof(buffer); \ \ MA_DR_FLAC_ASSERT(pFlac != NULL); \ \ - totalPCMFrameCount = pFlac->totalPCMFrameCount; \ + totalPCMFrameCount = 0; \ \ - if (totalPCMFrameCount == 0) { \ - type buffer[4096]; \ - ma_uint64 pcmFramesRead; \ - size_t sampleDataBufferSize = sizeof(buffer); \ + pSampleData = (type*)ma_dr_flac__malloc_from_callbacks(sampleDataBufferSize, &pFlac->allocationCallbacks); \ + if (pSampleData == NULL) { \ + goto on_error; \ + } \ \ - pSampleData = (type*)ma_dr_flac__malloc_from_callbacks(sampleDataBufferSize, &pFlac->allocationCallbacks); \ - if (pSampleData == NULL) { \ - goto on_error; \ - } \ + while ((pcmFramesRead = (ma_uint64)ma_dr_flac_read_pcm_frames_##extension(pFlac, sizeof(buffer)/sizeof(buffer[0])/pFlac->channels, buffer)) > 0) { \ + if (((totalPCMFrameCount + pcmFramesRead) * pFlac->channels * sizeof(type)) > sampleDataBufferSize) { \ + type* pNewSampleData; \ + size_t newSampleDataBufferSize; \ \ - while ((pcmFramesRead = (ma_uint64)ma_dr_flac_read_pcm_frames_##extension(pFlac, sizeof(buffer)/sizeof(buffer[0])/pFlac->channels, buffer)) > 0) { \ - if (((totalPCMFrameCount + pcmFramesRead) * pFlac->channels * sizeof(type)) > sampleDataBufferSize) { \ - type* pNewSampleData; \ - size_t newSampleDataBufferSize; \ - \ - newSampleDataBufferSize = sampleDataBufferSize * 2; \ - pNewSampleData = (type*)ma_dr_flac__realloc_from_callbacks(pSampleData, newSampleDataBufferSize, sampleDataBufferSize, &pFlac->allocationCallbacks); \ - if (pNewSampleData == NULL) { \ - ma_dr_flac__free_from_callbacks(pSampleData, &pFlac->allocationCallbacks); \ - goto on_error; \ - } \ - \ - sampleDataBufferSize = newSampleDataBufferSize; \ - pSampleData = pNewSampleData; \ + newSampleDataBufferSize = sampleDataBufferSize * 2; \ + pNewSampleData = (type*)ma_dr_flac__realloc_from_callbacks(pSampleData, newSampleDataBufferSize, sampleDataBufferSize, &pFlac->allocationCallbacks); \ + if (pNewSampleData == NULL) { \ + ma_dr_flac__free_from_callbacks(pSampleData, &pFlac->allocationCallbacks); \ + goto on_error; \ } \ \ - MA_DR_FLAC_COPY_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), buffer, (size_t)(pcmFramesRead*pFlac->channels*sizeof(type))); \ - totalPCMFrameCount += pcmFramesRead; \ + sampleDataBufferSize = newSampleDataBufferSize; \ + pSampleData = pNewSampleData; \ } \ \ + MA_DR_FLAC_COPY_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), buffer, (size_t)(pcmFramesRead*pFlac->channels*sizeof(type))); \ + totalPCMFrameCount += pcmFramesRead; \ + } \ + \ \ - MA_DR_FLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type))); \ - } else { \ - ma_uint64 dataSize = totalPCMFrameCount*pFlac->channels*sizeof(type); \ - if (dataSize > (ma_uint64)MA_SIZE_MAX) { \ - goto on_error; \ - } \ - \ - pSampleData = (type*)ma_dr_flac__malloc_from_callbacks((size_t)dataSize, &pFlac->allocationCallbacks); \ - if (pSampleData == NULL) { \ - goto on_error; \ - } \ - \ - totalPCMFrameCount = ma_dr_flac_read_pcm_frames_##extension(pFlac, pFlac->totalPCMFrameCount, pSampleData); \ - } \ + MA_DR_FLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type))); \ \ if (sampleRateOut) *sampleRateOut = pFlac->sampleRate; \ if (channelsOut) *channelsOut = pFlac->channels; \ @@ -90410,7 +92432,7 @@ on_error: MA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(s32, ma_int32) MA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(s16, ma_int16) MA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(f32, float) -MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) { ma_dr_flac* pFlac; if (channelsOut) { @@ -90422,13 +92444,13 @@ MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc on if (totalPCMFrameCountOut) { *totalPCMFrameCountOut = 0; } - pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks); + pFlac = ma_dr_flac_open(onRead, onSeek, onTell, pUserData, pAllocationCallbacks); if (pFlac == NULL) { return NULL; } return ma_dr_flac__full_read_and_close_s32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); } -MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) { ma_dr_flac* pFlac; if (channelsOut) { @@ -90440,13 +92462,13 @@ MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc on if (totalPCMFrameCountOut) { *totalPCMFrameCountOut = 0; } - pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks); + pFlac = ma_dr_flac_open(onRead, onSeek, onTell, pUserData, pAllocationCallbacks); if (pFlac == NULL) { return NULL; } return ma_dr_flac__full_read_and_close_s16(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); } -MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) { ma_dr_flac* pFlac; if (channelsOut) { @@ -90458,7 +92480,7 @@ MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRea if (totalPCMFrameCountOut) { *totalPCMFrameCountOut = 0; } - pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks); + pFlac = ma_dr_flac_open(onRead, onSeek, onTell, pUserData, pAllocationCallbacks); if (pFlac == NULL) { return NULL; } @@ -90680,12 +92702,9 @@ MA_API const char* ma_dr_mp3_version_string(void) #define MA_DR_MP3_NO_SIMD #endif #define MA_DR_MP3_OFFSET_PTR(p, offset) ((void*)((ma_uint8*)(p) + (offset))) -#define MA_DR_MP3_MAX_FREE_FORMAT_FRAME_SIZE 2304 #ifndef MA_DR_MP3_MAX_FRAME_SYNC_MATCHES #define MA_DR_MP3_MAX_FRAME_SYNC_MATCHES 10 #endif -#define MA_DR_MP3_MAX_L3_FRAME_PAYLOAD_BYTES MA_DR_MP3_MAX_FREE_FORMAT_FRAME_SIZE -#define MA_DR_MP3_MAX_BITRESERVOIR_BYTES 511 #define MA_DR_MP3_SHORT_BLOCK_TYPE 2 #define MA_DR_MP3_STOP_BLOCK_TYPE 3 #define MA_DR_MP3_MODE_MONO 3 @@ -90735,7 +92754,7 @@ MA_API const char* ma_dr_mp3_version_string(void) #define MA_DR_MP3_VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s)) #define MA_DR_MP3_VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3)) typedef __m128 ma_dr_mp3_f4; -#if defined(_MSC_VER) || defined(MA_DR_MP3_ONLY_SIMD) +#if (defined(_MSC_VER) || defined(MA_DR_MP3_ONLY_SIMD)) && !defined(__clang__) #define ma_dr_mp3_cpuid __cpuid #else static __inline__ __attribute__((always_inline)) void ma_dr_mp3_cpuid(int CPUInfo[], const int InfoType) @@ -90851,11 +92870,6 @@ static __inline__ __attribute__((always_inline)) ma_int32 ma_dr_mp3_clip_int16_a #define MA_DR_MP3_FREE(p) free((p)) #endif typedef struct -{ - const ma_uint8 *buf; - int pos, limit; -} ma_dr_mp3_bs; -typedef struct { float scf[3*64]; ma_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64]; @@ -90864,22 +92878,6 @@ typedef struct { ma_uint8 tab_offset, code_tab_width, band_count; } ma_dr_mp3_L12_subband_alloc; -typedef struct -{ - const ma_uint8 *sfbtab; - ma_uint16 part_23_length, big_values, scalefac_compress; - ma_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb; - ma_uint8 table_select[3], region_count[3], subblock_gain[3]; - ma_uint8 preflag, scalefac_scale, count1_table, scfsi; -} ma_dr_mp3_L3_gr_info; -typedef struct -{ - ma_dr_mp3_bs bs; - ma_uint8 maindata[MA_DR_MP3_MAX_BITRESERVOIR_BYTES + MA_DR_MP3_MAX_L3_FRAME_PAYLOAD_BYTES]; - ma_dr_mp3_L3_gr_info gr_info[4]; - float grbuf[2][576], scf[40], syn[18 + 15][2*32]; - ma_uint8 ist_pos[2][39]; -} ma_dr_mp3dec_scratch; static void ma_dr_mp3_bs_init(ma_dr_mp3_bs *bs, const ma_uint8 *data, int bytes) { bs->buf = data; @@ -91262,6 +93260,10 @@ static float ma_dr_mp3_L3_ldexp_q2(float y, int exp_q2) } while ((exp_q2 -= e) > 0); return y; } +#if (defined(__GNUC__) && (__GNUC__ >= 13)) && !defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif static void ma_dr_mp3_L3_decode_scalefactors(const ma_uint8 *hdr, ma_uint8 *ist_pos, ma_dr_mp3_bs *bs, const ma_dr_mp3_L3_gr_info *gr, float *scf, int ch) { static const ma_uint8 g_scf_partitions[3][28] = { @@ -91320,7 +93322,10 @@ static void ma_dr_mp3_L3_decode_scalefactors(const ma_uint8 *hdr, ma_uint8 *ist_ scf[i] = ma_dr_mp3_L3_ldexp_q2(gain, iscf[i] << scf_shift); } } -static const float g_ma_dr_mp3_pow43[129 + 16] = { +#if (defined(__GNUC__) && (__GNUC__ >= 13)) && !defined(__clang__) + #pragma GCC diagnostic pop +#endif +static const float ma_dr_mp3_g_pow43[129 + 16] = { 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f, 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f }; @@ -91330,7 +93335,7 @@ static float ma_dr_mp3_L3_pow_43(int x) int sign, mult = 256; if (x < 129) { - return g_ma_dr_mp3_pow43[16 + x]; + return ma_dr_mp3_g_pow43[16 + x]; } if (x < 1024) { @@ -91339,7 +93344,7 @@ static float ma_dr_mp3_L3_pow_43(int x) } sign = 2*x & 64; frac = (float)((x & 63) - sign) / ((x & ~63) + sign); - return g_ma_dr_mp3_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult; + return ma_dr_mp3_g_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult; } static void ma_dr_mp3_L3_huffman(float *dst, ma_dr_mp3_bs *bs, const ma_dr_mp3_L3_gr_info *gr_info, const float *scf, int layer3gr_limit) { @@ -91409,7 +93414,7 @@ static void ma_dr_mp3_L3_huffman(float *dst, ma_dr_mp3_bs *bs, const ma_dr_mp3_L *dst = one*ma_dr_mp3_L3_pow_43(lsb)*((ma_int32)bs_cache < 0 ? -1: 1); } else { - *dst = g_ma_dr_mp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; + *dst = ma_dr_mp3_g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; } MA_DR_MP3_FLUSH_BITS(lsb ? 1 : 0); } @@ -91437,7 +93442,7 @@ static void ma_dr_mp3_L3_huffman(float *dst, ma_dr_mp3_bs *bs, const ma_dr_mp3_L for (j = 0; j < 2; j++, dst++, leaf >>= 4) { int lsb = leaf & 0x0F; - *dst = g_ma_dr_mp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; + *dst = ma_dr_mp3_g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; MA_DR_MP3_FLUSH_BITS(lsb ? 1 : 0); } MA_DR_MP3_CHECK_BITS; @@ -92245,7 +94250,6 @@ MA_API int ma_dr_mp3dec_decode_frame(ma_dr_mp3dec *dec, const ma_uint8 *mp3, int int i = 0, igr, frame_size = 0, success = 1; const ma_uint8 *hdr; ma_dr_mp3_bs bs_frame[1]; - ma_dr_mp3dec_scratch scratch; if (mp3_bytes > 4 && dec->header[0] == 0xff && ma_dr_mp3_hdr_compare(dec->header, mp3)) { frame_size = ma_dr_mp3_hdr_frame_bytes(mp3, dec->free_format_bytes) + ma_dr_mp3_hdr_padding(mp3); @@ -92268,7 +94272,7 @@ MA_API int ma_dr_mp3dec_decode_frame(ma_dr_mp3dec *dec, const ma_uint8 *mp3, int MA_DR_MP3_COPY_MEMORY(dec->header, hdr, MA_DR_MP3_HDR_SIZE); info->frame_bytes = i + frame_size; info->channels = MA_DR_MP3_HDR_IS_MONO(hdr) ? 1 : 2; - info->hz = ma_dr_mp3_hdr_sample_rate_hz(hdr); + info->sample_rate = ma_dr_mp3_hdr_sample_rate_hz(hdr); info->layer = 4 - MA_DR_MP3_HDR_GET_LAYER(hdr); info->bitrate_kbps = ma_dr_mp3_hdr_bitrate_kbps(hdr); ma_dr_mp3_bs_init(bs_frame, hdr + MA_DR_MP3_HDR_SIZE, frame_size - MA_DR_MP3_HDR_SIZE); @@ -92278,23 +94282,23 @@ MA_API int ma_dr_mp3dec_decode_frame(ma_dr_mp3dec *dec, const ma_uint8 *mp3, int } if (info->layer == 3) { - int main_data_begin = ma_dr_mp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr); + int main_data_begin = ma_dr_mp3_L3_read_side_info(bs_frame, dec->scratch.gr_info, hdr); if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit) { ma_dr_mp3dec_init(dec); return 0; } - success = ma_dr_mp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin); + success = ma_dr_mp3_L3_restore_reservoir(dec, bs_frame, &dec->scratch, main_data_begin); if (success && pcm != NULL) { for (igr = 0; igr < (MA_DR_MP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = MA_DR_MP3_OFFSET_PTR(pcm, sizeof(ma_dr_mp3d_sample_t)*576*info->channels)) { - MA_DR_MP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float)); - ma_dr_mp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels); - ma_dr_mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (ma_dr_mp3d_sample_t*)pcm, scratch.syn[0]); + MA_DR_MP3_ZERO_MEMORY(dec->scratch.grbuf[0], 576*2*sizeof(float)); + ma_dr_mp3_L3_decode(dec, &dec->scratch, dec->scratch.gr_info + igr*info->channels, info->channels); + ma_dr_mp3d_synth_granule(dec->qmf_state, dec->scratch.grbuf[0], 18, info->channels, (ma_dr_mp3d_sample_t*)pcm, dec->scratch.syn[0]); } } - ma_dr_mp3_L3_save_reservoir(dec, &scratch); + ma_dr_mp3_L3_save_reservoir(dec, &dec->scratch); } else { #ifdef MA_DR_MP3_ONLY_MP3 @@ -92305,15 +94309,15 @@ MA_API int ma_dr_mp3dec_decode_frame(ma_dr_mp3dec *dec, const ma_uint8 *mp3, int return ma_dr_mp3_hdr_frame_samples(hdr); } ma_dr_mp3_L12_read_scale_info(hdr, bs_frame, sci); - MA_DR_MP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float)); + MA_DR_MP3_ZERO_MEMORY(dec->scratch.grbuf[0], 576*2*sizeof(float)); for (i = 0, igr = 0; igr < 3; igr++) { - if (12 == (i += ma_dr_mp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1))) + if (12 == (i += ma_dr_mp3_L12_dequantize_granule(dec->scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1))) { i = 0; - ma_dr_mp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]); - ma_dr_mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (ma_dr_mp3d_sample_t*)pcm, scratch.syn[0]); - MA_DR_MP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float)); + ma_dr_mp3_L12_apply_scf_384(sci, sci->scf + igr, dec->scratch.grbuf[0]); + ma_dr_mp3d_synth_granule(dec->qmf_state, dec->scratch.grbuf[0], 12, info->channels, (ma_dr_mp3d_sample_t*)pcm, dec->scratch.syn[0]); + MA_DR_MP3_ZERO_MEMORY(dec->scratch.grbuf[0], 576*2*sizeof(float)); pcm = MA_DR_MP3_OFFSET_PTR(pcm, sizeof(ma_dr_mp3d_sample_t)*384*info->channels); } if (bs_frame->pos > bs_frame->limit) @@ -92491,19 +94495,41 @@ static ma_allocation_callbacks ma_dr_mp3_copy_allocation_callbacks_or_defaults(c } static size_t ma_dr_mp3__on_read(ma_dr_mp3* pMP3, void* pBufferOut, size_t bytesToRead) { - size_t bytesRead = pMP3->onRead(pMP3->pUserData, pBufferOut, bytesToRead); + size_t bytesRead; + MA_DR_MP3_ASSERT(pMP3 != NULL); + MA_DR_MP3_ASSERT(pMP3->onRead != NULL); + if (bytesToRead == 0) { + return 0; + } + bytesRead = pMP3->onRead(pMP3->pUserData, pBufferOut, bytesToRead); pMP3->streamCursor += bytesRead; return bytesRead; } +static size_t ma_dr_mp3__on_read_clamped(ma_dr_mp3* pMP3, void* pBufferOut, size_t bytesToRead) +{ + MA_DR_MP3_ASSERT(pMP3 != NULL); + MA_DR_MP3_ASSERT(pMP3->onRead != NULL); + if (pMP3->streamLength == MA_UINT64_MAX) { + return ma_dr_mp3__on_read(pMP3, pBufferOut, bytesToRead); + } else { + ma_uint64 bytesRemaining; + bytesRemaining = (pMP3->streamLength - pMP3->streamCursor); + if (bytesToRead > bytesRemaining) { + bytesToRead = (size_t)bytesRemaining; + } + return ma_dr_mp3__on_read(pMP3, pBufferOut, bytesToRead); + } +} static ma_bool32 ma_dr_mp3__on_seek(ma_dr_mp3* pMP3, int offset, ma_dr_mp3_seek_origin origin) { MA_DR_MP3_ASSERT(offset >= 0); + MA_DR_MP3_ASSERT(origin == MA_DR_MP3_SEEK_SET || origin == MA_DR_MP3_SEEK_CUR); if (!pMP3->onSeek(pMP3->pUserData, offset, origin)) { return MA_FALSE; } - if (origin == ma_dr_mp3_seek_origin_start) { + if (origin == MA_DR_MP3_SEEK_SET) { pMP3->streamCursor = (ma_uint64)offset; - } else { + } else{ pMP3->streamCursor += offset; } return MA_TRUE; @@ -92513,18 +94539,18 @@ static ma_bool32 ma_dr_mp3__on_seek_64(ma_dr_mp3* pMP3, ma_uint64 offset, ma_dr_ if (offset <= 0x7FFFFFFF) { return ma_dr_mp3__on_seek(pMP3, (int)offset, origin); } - if (!ma_dr_mp3__on_seek(pMP3, 0x7FFFFFFF, ma_dr_mp3_seek_origin_start)) { + if (!ma_dr_mp3__on_seek(pMP3, 0x7FFFFFFF, MA_DR_MP3_SEEK_SET)) { return MA_FALSE; } offset -= 0x7FFFFFFF; while (offset > 0) { if (offset <= 0x7FFFFFFF) { - if (!ma_dr_mp3__on_seek(pMP3, (int)offset, ma_dr_mp3_seek_origin_current)) { + if (!ma_dr_mp3__on_seek(pMP3, (int)offset, MA_DR_MP3_SEEK_CUR)) { return MA_FALSE; } offset = 0; } else { - if (!ma_dr_mp3__on_seek(pMP3, 0x7FFFFFFF, ma_dr_mp3_seek_origin_current)) { + if (!ma_dr_mp3__on_seek(pMP3, 0x7FFFFFFF, MA_DR_MP3_SEEK_CUR)) { return MA_FALSE; } offset -= 0x7FFFFFFF; @@ -92532,7 +94558,18 @@ static ma_bool32 ma_dr_mp3__on_seek_64(ma_dr_mp3* pMP3, ma_uint64 offset, ma_dr_ } return MA_TRUE; } -static ma_uint32 ma_dr_mp3_decode_next_frame_ex__callbacks(ma_dr_mp3* pMP3, ma_dr_mp3d_sample_t* pPCMFrames) +static void ma_dr_mp3__on_meta(ma_dr_mp3* pMP3, ma_dr_mp3_metadata_type type, const void* pRawData, size_t rawDataSize) +{ + if (pMP3->onMeta) { + ma_dr_mp3_metadata metadata; + MA_DR_MP3_ZERO_OBJECT(&metadata); + metadata.type = type; + metadata.pRawData = pRawData; + metadata.rawDataSize = rawDataSize; + pMP3->onMeta(pMP3->pUserDataMeta, &metadata); + } +} +static ma_uint32 ma_dr_mp3_decode_next_frame_ex__callbacks(ma_dr_mp3* pMP3, ma_dr_mp3d_sample_t* pPCMFrames, ma_dr_mp3dec_frame_info* pMP3FrameInfo, const ma_uint8** ppMP3FrameData) { ma_uint32 pcmFramesRead = 0; MA_DR_MP3_ASSERT(pMP3 != NULL); @@ -92559,7 +94596,7 @@ static ma_uint32 ma_dr_mp3_decode_next_frame_ex__callbacks(ma_dr_mp3* pMP3, ma_d pMP3->pData = pNewData; pMP3->dataCapacity = newDataCap; } - bytesRead = ma_dr_mp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize)); + bytesRead = ma_dr_mp3__on_read_clamped(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize)); if (bytesRead == 0) { if (pMP3->dataSize == 0) { pMP3->atEnd = MA_TRUE; @@ -92578,16 +94615,20 @@ static ma_uint32 ma_dr_mp3_decode_next_frame_ex__callbacks(ma_dr_mp3* pMP3, ma_d return 0; } pcmFramesRead = ma_dr_mp3dec_decode_frame(&pMP3->decoder, pMP3->pData + pMP3->dataConsumed, (int)pMP3->dataSize, pPCMFrames, &info); - if (info.frame_bytes > 0) { - pMP3->dataConsumed += (size_t)info.frame_bytes; - pMP3->dataSize -= (size_t)info.frame_bytes; - } + pMP3->dataConsumed += (size_t)info.frame_bytes; + pMP3->dataSize -= (size_t)info.frame_bytes; if (pcmFramesRead > 0) { pcmFramesRead = ma_dr_mp3_hdr_frame_samples(pMP3->decoder.header); pMP3->pcmFramesConsumedInMP3Frame = 0; pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead; pMP3->mp3FrameChannels = info.channels; - pMP3->mp3FrameSampleRate = info.hz; + pMP3->mp3FrameSampleRate = info.sample_rate; + if (pMP3FrameInfo != NULL) { + *pMP3FrameInfo = info; + } + if (ppMP3FrameData != NULL) { + *ppMP3FrameData = pMP3->pData + pMP3->dataConsumed - (size_t)info.frame_bytes; + } break; } else if (info.frame_bytes == 0) { size_t bytesRead; @@ -92604,7 +94645,7 @@ static ma_uint32 ma_dr_mp3_decode_next_frame_ex__callbacks(ma_dr_mp3* pMP3, ma_d pMP3->pData = pNewData; pMP3->dataCapacity = newDataCap; } - bytesRead = ma_dr_mp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize)); + bytesRead = ma_dr_mp3__on_read_clamped(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize)); if (bytesRead == 0) { pMP3->atEnd = MA_TRUE; return 0; @@ -92614,7 +94655,7 @@ static ma_uint32 ma_dr_mp3_decode_next_frame_ex__callbacks(ma_dr_mp3* pMP3, ma_d }; return pcmFramesRead; } -static ma_uint32 ma_dr_mp3_decode_next_frame_ex__memory(ma_dr_mp3* pMP3, ma_dr_mp3d_sample_t* pPCMFrames) +static ma_uint32 ma_dr_mp3_decode_next_frame_ex__memory(ma_dr_mp3* pMP3, ma_dr_mp3d_sample_t* pPCMFrames, ma_dr_mp3dec_frame_info* pMP3FrameInfo, const ma_uint8** ppMP3FrameData) { ma_uint32 pcmFramesRead = 0; ma_dr_mp3dec_frame_info info; @@ -92630,36 +94671,44 @@ static ma_uint32 ma_dr_mp3_decode_next_frame_ex__memory(ma_dr_mp3* pMP3, ma_dr_m pMP3->pcmFramesConsumedInMP3Frame = 0; pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead; pMP3->mp3FrameChannels = info.channels; - pMP3->mp3FrameSampleRate = info.hz; + pMP3->mp3FrameSampleRate = info.sample_rate; + if (pMP3FrameInfo != NULL) { + *pMP3FrameInfo = info; + } + if (ppMP3FrameData != NULL) { + *ppMP3FrameData = pMP3->memory.pData + pMP3->memory.currentReadPos; + } break; } else if (info.frame_bytes > 0) { pMP3->memory.currentReadPos += (size_t)info.frame_bytes; + pMP3->streamCursor += (size_t)info.frame_bytes; } else { break; } } pMP3->memory.currentReadPos += (size_t)info.frame_bytes; + pMP3->streamCursor += (size_t)info.frame_bytes; return pcmFramesRead; } -static ma_uint32 ma_dr_mp3_decode_next_frame_ex(ma_dr_mp3* pMP3, ma_dr_mp3d_sample_t* pPCMFrames) +static ma_uint32 ma_dr_mp3_decode_next_frame_ex(ma_dr_mp3* pMP3, ma_dr_mp3d_sample_t* pPCMFrames, ma_dr_mp3dec_frame_info* pMP3FrameInfo, const ma_uint8** ppMP3FrameData) { if (pMP3->memory.pData != NULL && pMP3->memory.dataSize > 0) { - return ma_dr_mp3_decode_next_frame_ex__memory(pMP3, pPCMFrames); + return ma_dr_mp3_decode_next_frame_ex__memory(pMP3, pPCMFrames, pMP3FrameInfo, ppMP3FrameData); } else { - return ma_dr_mp3_decode_next_frame_ex__callbacks(pMP3, pPCMFrames); + return ma_dr_mp3_decode_next_frame_ex__callbacks(pMP3, pPCMFrames, pMP3FrameInfo, ppMP3FrameData); } } static ma_uint32 ma_dr_mp3_decode_next_frame(ma_dr_mp3* pMP3) { MA_DR_MP3_ASSERT(pMP3 != NULL); - return ma_dr_mp3_decode_next_frame_ex(pMP3, (ma_dr_mp3d_sample_t*)pMP3->pcmFrames); + return ma_dr_mp3_decode_next_frame_ex(pMP3, (ma_dr_mp3d_sample_t*)pMP3->pcmFrames, NULL, NULL); } #if 0 static ma_uint32 ma_dr_mp3_seek_next_frame(ma_dr_mp3* pMP3) { ma_uint32 pcmFrameCount; MA_DR_MP3_ASSERT(pMP3 != NULL); - pcmFrameCount = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL); + pcmFrameCount = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL, NULL, NULL); if (pcmFrameCount == 0) { return 0; } @@ -92669,33 +94718,252 @@ static ma_uint32 ma_dr_mp3_seek_next_frame(ma_dr_mp3* pMP3) return pcmFrameCount; } #endif -static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) +static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, ma_dr_mp3_tell_proc onTell, ma_dr_mp3_meta_proc onMeta, void* pUserData, void* pUserDataMeta, const ma_allocation_callbacks* pAllocationCallbacks) { + ma_dr_mp3dec_frame_info firstFrameInfo; + const ma_uint8* pFirstFrameData; + ma_uint32 firstFramePCMFrameCount; + ma_uint32 detectedMP3FrameCount = 0xFFFFFFFF; MA_DR_MP3_ASSERT(pMP3 != NULL); MA_DR_MP3_ASSERT(onRead != NULL); ma_dr_mp3dec_init(&pMP3->decoder); pMP3->onRead = onRead; pMP3->onSeek = onSeek; + pMP3->onMeta = onMeta; pMP3->pUserData = pUserData; + pMP3->pUserDataMeta = pUserDataMeta; pMP3->allocationCallbacks = ma_dr_mp3_copy_allocation_callbacks_or_defaults(pAllocationCallbacks); if (pMP3->allocationCallbacks.onFree == NULL || (pMP3->allocationCallbacks.onMalloc == NULL && pMP3->allocationCallbacks.onRealloc == NULL)) { return MA_FALSE; } - if (ma_dr_mp3_decode_next_frame(pMP3) == 0) { + pMP3->streamCursor = 0; + pMP3->streamLength = MA_UINT64_MAX; + pMP3->streamStartOffset = 0; + pMP3->delayInPCMFrames = 0; + pMP3->paddingInPCMFrames = 0; + pMP3->totalPCMFrameCount = MA_UINT64_MAX; + #if 1 + if (onSeek != NULL && onTell != NULL) { + if (onSeek(pUserData, 0, MA_DR_MP3_SEEK_END)) { + ma_int64 streamLen; + int streamEndOffset = 0; + if (onTell(pUserData, &streamLen)) { + if (streamLen > 128) { + char id3[3]; + if (onSeek(pUserData, streamEndOffset - 128, MA_DR_MP3_SEEK_END)) { + if (onRead(pUserData, id3, 3) == 3 && id3[0] == 'T' && id3[1] == 'A' && id3[2] == 'G') { + streamEndOffset -= 128; + streamLen -= 128; + if (onMeta != NULL) { + ma_uint8 tag[128]; + tag[0] = 'T'; tag[1] = 'A'; tag[2] = 'G'; + if (onRead(pUserData, tag + 3, 125) == 125) { + ma_dr_mp3__on_meta(pMP3, MA_DR_MP3_METADATA_TYPE_ID3V1, tag, 128); + } + } + } else { + } + } else { + } + } else { + } + if (streamLen > 32) { + char ape[32]; + if (onSeek(pUserData, streamEndOffset - 32, MA_DR_MP3_SEEK_END)) { + if (onRead(pUserData, ape, 32) == 32 && ape[0] == 'A' && ape[1] == 'P' && ape[2] == 'E' && ape[3] == 'T' && ape[4] == 'A' && ape[5] == 'G' && ape[6] == 'E' && ape[7] == 'X') { + ma_uint32 tagSize = + ((ma_uint32)ape[24] << 0) | + ((ma_uint32)ape[25] << 8) | + ((ma_uint32)ape[26] << 16) | + ((ma_uint32)ape[27] << 24); + if (32 + tagSize < streamLen) { + streamEndOffset -= 32 + tagSize; + streamLen -= 32 + tagSize; + if (onMeta != NULL) { + if (onSeek(pUserData, streamEndOffset, MA_DR_MP3_SEEK_END)) { + size_t apeTagSize = (size_t)tagSize + 32; + ma_uint8* pTagData = (ma_uint8*)ma_dr_mp3_malloc(apeTagSize, pAllocationCallbacks); + if (pTagData != NULL) { + if (onRead(pUserData, pTagData, apeTagSize) == apeTagSize) { + ma_dr_mp3__on_meta(pMP3, MA_DR_MP3_METADATA_TYPE_APE, pTagData, apeTagSize); + } + ma_dr_mp3_free(pTagData, pAllocationCallbacks); + } + } + } + } else { + } + } + } + } else { + } + if (!onSeek(pUserData, 0, MA_DR_MP3_SEEK_SET)) { + return MA_FALSE; + } + pMP3->streamLength = (ma_uint64)streamLen; + if (pMP3->memory.pData != NULL) { + pMP3->memory.dataSize = (size_t)pMP3->streamLength; + } + } else { + if (!onSeek(pUserData, 0, MA_DR_MP3_SEEK_SET)) { + return MA_FALSE; + } + } + } else { + } + } else { + } + #endif + #if 1 + { + char header[10]; + if (onRead(pUserData, header, 10) == 10) { + if (header[0] == 'I' && header[1] == 'D' && header[2] == '3') { + ma_uint32 tagSize = + (((ma_uint32)header[6] & 0x7F) << 21) | + (((ma_uint32)header[7] & 0x7F) << 14) | + (((ma_uint32)header[8] & 0x7F) << 7) | + (((ma_uint32)header[9] & 0x7F) << 0); + if (header[5] & 0x10) { + tagSize += 10; + } + if (onMeta != NULL) { + size_t tagSizeWithHeader = 10 + tagSize; + ma_uint8* pTagData = (ma_uint8*)ma_dr_mp3_malloc(tagSizeWithHeader, pAllocationCallbacks); + if (pTagData != NULL) { + MA_DR_MP3_COPY_MEMORY(pTagData, header, 10); + if (onRead(pUserData, pTagData + 10, tagSize) == tagSize) { + ma_dr_mp3__on_meta(pMP3, MA_DR_MP3_METADATA_TYPE_ID3V2, pTagData, tagSizeWithHeader); + } + ma_dr_mp3_free(pTagData, pAllocationCallbacks); + } + } else { + if (onSeek != NULL) { + if (!onSeek(pUserData, tagSize, MA_DR_MP3_SEEK_CUR)) { + return MA_FALSE; + } + } else { + char discard[1024]; + while (tagSize > 0) { + size_t bytesToRead = tagSize; + if (bytesToRead > sizeof(discard)) { + bytesToRead = sizeof(discard); + } + if (onRead(pUserData, discard, bytesToRead) != bytesToRead) { + return MA_FALSE; + } + tagSize -= (ma_uint32)bytesToRead; + } + } + } + pMP3->streamStartOffset += 10 + tagSize; + pMP3->streamCursor = pMP3->streamStartOffset; + } else { + if (onSeek != NULL) { + if (!onSeek(pUserData, 0, MA_DR_MP3_SEEK_SET)) { + return MA_FALSE; + } + } else { + } + } + } else { + return MA_FALSE; + } + } + #endif + firstFramePCMFrameCount = ma_dr_mp3_decode_next_frame_ex(pMP3, (ma_dr_mp3d_sample_t*)pMP3->pcmFrames, &firstFrameInfo, &pFirstFrameData); + if (firstFramePCMFrameCount > 0) { + MA_DR_MP3_ASSERT(pFirstFrameData != NULL); + #if 1 + MA_DR_MP3_ASSERT(firstFrameInfo.frame_bytes > 0); + { + ma_dr_mp3_bs bs; + ma_dr_mp3_L3_gr_info grInfo[4]; + ma_dr_mp3_bs_init(&bs, pFirstFrameData + MA_DR_MP3_HDR_SIZE, firstFrameInfo.frame_bytes - MA_DR_MP3_HDR_SIZE); + if (MA_DR_MP3_HDR_IS_CRC(pFirstFrameData)) { + ma_dr_mp3_bs_get_bits(&bs, 16); + } + if (ma_dr_mp3_L3_read_side_info(&bs, grInfo, pFirstFrameData) >= 0) { + ma_bool32 isXing = MA_FALSE; + ma_bool32 isInfo = MA_FALSE; + const ma_uint8* pTagData; + const ma_uint8* pTagDataBeg; + pTagDataBeg = pFirstFrameData + MA_DR_MP3_HDR_SIZE + (bs.pos/8); + pTagData = pTagDataBeg; + isXing = (pTagData[0] == 'X' && pTagData[1] == 'i' && pTagData[2] == 'n' && pTagData[3] == 'g'); + isInfo = (pTagData[0] == 'I' && pTagData[1] == 'n' && pTagData[2] == 'f' && pTagData[3] == 'o'); + if (isXing || isInfo) { + ma_uint32 bytes = 0; + ma_uint32 flags = pTagData[7]; + pTagData += 8; + if (flags & 0x01) { + detectedMP3FrameCount = (ma_uint32)pTagData[0] << 24 | (ma_uint32)pTagData[1] << 16 | (ma_uint32)pTagData[2] << 8 | (ma_uint32)pTagData[3]; + pTagData += 4; + } + if (flags & 0x02) { + bytes = (ma_uint32)pTagData[0] << 24 | (ma_uint32)pTagData[1] << 16 | (ma_uint32)pTagData[2] << 8 | (ma_uint32)pTagData[3]; + (void)bytes; + pTagData += 4; + } + if (flags & 0x04) { + pTagData += 100; + } + if (flags & 0x08) { + pTagData += 4; + } + if (pTagData[0]) { + pTagData += 21; + if (pTagData - pFirstFrameData + 14 < firstFrameInfo.frame_bytes) { + int delayInPCMFrames; + int paddingInPCMFrames; + delayInPCMFrames = (( (ma_uint32)pTagData[0] << 4) | ((ma_uint32)pTagData[1] >> 4)) + (528 + 1); + paddingInPCMFrames = ((((ma_uint32)pTagData[1] & 0xF) << 8) | ((ma_uint32)pTagData[2] )) - (528 + 1); + if (paddingInPCMFrames < 0) { + paddingInPCMFrames = 0; + } + pMP3->delayInPCMFrames = (ma_uint32)delayInPCMFrames; + pMP3->paddingInPCMFrames = (ma_uint32)paddingInPCMFrames; + } + } + if (isXing) { + pMP3->isVBR = MA_TRUE; + } else if (isInfo) { + pMP3->isCBR = MA_TRUE; + } + if (onMeta != NULL) { + ma_dr_mp3_metadata_type metadataType = isXing ? MA_DR_MP3_METADATA_TYPE_XING : MA_DR_MP3_METADATA_TYPE_VBRI; + size_t tagDataSize; + tagDataSize = (size_t)firstFrameInfo.frame_bytes; + tagDataSize -= (size_t)(pTagDataBeg - pFirstFrameData); + ma_dr_mp3__on_meta(pMP3, metadataType, pTagDataBeg, tagDataSize); + } + pMP3->pcmFramesRemainingInMP3Frame = 0; + pMP3->streamStartOffset += (ma_uint32)(firstFrameInfo.frame_bytes); + pMP3->streamCursor = pMP3->streamStartOffset; + ma_dr_mp3dec_init(&pMP3->decoder); + } + } else { + } + } + #endif + } else { ma_dr_mp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks); return MA_FALSE; } + if (detectedMP3FrameCount != 0xFFFFFFFF) { + pMP3->totalPCMFrameCount = detectedMP3FrameCount * firstFramePCMFrameCount; + } pMP3->channels = pMP3->mp3FrameChannels; pMP3->sampleRate = pMP3->mp3FrameSampleRate; return MA_TRUE; } -MA_API ma_bool32 ma_dr_mp3_init(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_bool32 ma_dr_mp3_init(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, ma_dr_mp3_tell_proc onTell, ma_dr_mp3_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) { if (pMP3 == NULL || onRead == NULL) { return MA_FALSE; } MA_DR_MP3_ZERO_OBJECT(pMP3); - return ma_dr_mp3_init_internal(pMP3, onRead, onSeek, pUserData, pAllocationCallbacks); + return ma_dr_mp3_init_internal(pMP3, onRead, onSeek, onTell, onMeta, pUserData, pUserData, pAllocationCallbacks); } static size_t ma_dr_mp3__on_read_memory(void* pUserData, void* pBufferOut, size_t bytesToRead) { @@ -92716,29 +94984,39 @@ static size_t ma_dr_mp3__on_read_memory(void* pUserData, void* pBufferOut, size_ static ma_bool32 ma_dr_mp3__on_seek_memory(void* pUserData, int byteOffset, ma_dr_mp3_seek_origin origin) { ma_dr_mp3* pMP3 = (ma_dr_mp3*)pUserData; + ma_int64 newCursor; MA_DR_MP3_ASSERT(pMP3 != NULL); - if (origin == ma_dr_mp3_seek_origin_current) { - if (byteOffset > 0) { - if (pMP3->memory.currentReadPos + byteOffset > pMP3->memory.dataSize) { - byteOffset = (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos); - } - } else { - if (pMP3->memory.currentReadPos < (size_t)-byteOffset) { - byteOffset = -(int)pMP3->memory.currentReadPos; - } - } - pMP3->memory.currentReadPos += byteOffset; + if (origin == MA_DR_MP3_SEEK_SET) { + newCursor = 0; + } else if (origin == MA_DR_MP3_SEEK_CUR) { + newCursor = (ma_int64)pMP3->memory.currentReadPos; + } else if (origin == MA_DR_MP3_SEEK_END) { + newCursor = (ma_int64)pMP3->memory.dataSize; } else { - if ((ma_uint32)byteOffset <= pMP3->memory.dataSize) { - pMP3->memory.currentReadPos = byteOffset; - } else { - pMP3->memory.currentReadPos = pMP3->memory.dataSize; - } + MA_DR_MP3_ASSERT(!"Invalid seek origin"); + return MA_FALSE; } + newCursor += byteOffset; + if (newCursor < 0) { + return MA_FALSE; + } + if ((size_t)newCursor > pMP3->memory.dataSize) { + return MA_FALSE; + } + pMP3->memory.currentReadPos = (size_t)newCursor; return MA_TRUE; } -MA_API ma_bool32 ma_dr_mp3_init_memory(ma_dr_mp3* pMP3, const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks) +static ma_bool32 ma_dr_mp3__on_tell_memory(void* pUserData, ma_int64* pCursor) { + ma_dr_mp3* pMP3 = (ma_dr_mp3*)pUserData; + MA_DR_MP3_ASSERT(pMP3 != NULL); + MA_DR_MP3_ASSERT(pCursor != NULL); + *pCursor = (ma_int64)pMP3->memory.currentReadPos; + return MA_TRUE; +} +MA_API ma_bool32 ma_dr_mp3_init_memory_with_metadata(ma_dr_mp3* pMP3, const void* pData, size_t dataSize, ma_dr_mp3_meta_proc onMeta, void* pUserDataMeta, const ma_allocation_callbacks* pAllocationCallbacks) +{ + ma_bool32 result; if (pMP3 == NULL) { return MA_FALSE; } @@ -92749,7 +95027,21 @@ MA_API ma_bool32 ma_dr_mp3_init_memory(ma_dr_mp3* pMP3, const void* pData, size_ pMP3->memory.pData = (const ma_uint8*)pData; pMP3->memory.dataSize = dataSize; pMP3->memory.currentReadPos = 0; - return ma_dr_mp3_init_internal(pMP3, ma_dr_mp3__on_read_memory, ma_dr_mp3__on_seek_memory, pMP3, pAllocationCallbacks); + result = ma_dr_mp3_init_internal(pMP3, ma_dr_mp3__on_read_memory, ma_dr_mp3__on_seek_memory, ma_dr_mp3__on_tell_memory, onMeta, pMP3, pUserDataMeta, pAllocationCallbacks); + if (result == MA_FALSE) { + return MA_FALSE; + } + if (pMP3->streamLength <= (ma_uint64)MA_SIZE_MAX) { + pMP3->memory.dataSize = (size_t)pMP3->streamLength; + } + if (pMP3->streamStartOffset > (ma_uint64)MA_SIZE_MAX) { + return MA_FALSE; + } + return MA_TRUE; +} +MA_API ma_bool32 ma_dr_mp3_init_memory(ma_dr_mp3* pMP3, const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks) +{ + return ma_dr_mp3_init_memory_with_metadata(pMP3, pData, dataSize, NULL, NULL, pAllocationCallbacks); } #ifndef MA_DR_MP3_NO_STDIO #include @@ -92760,36 +95052,76 @@ static size_t ma_dr_mp3__on_read_stdio(void* pUserData, void* pBufferOut, size_t } static ma_bool32 ma_dr_mp3__on_seek_stdio(void* pUserData, int offset, ma_dr_mp3_seek_origin origin) { - return fseek((FILE*)pUserData, offset, (origin == ma_dr_mp3_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; + int whence = SEEK_SET; + if (origin == MA_DR_MP3_SEEK_CUR) { + whence = SEEK_CUR; + } else if (origin == MA_DR_MP3_SEEK_END) { + whence = SEEK_END; + } + return fseek((FILE*)pUserData, offset, whence) == 0; } -MA_API ma_bool32 ma_dr_mp3_init_file(ma_dr_mp3* pMP3, const char* pFilePath, const ma_allocation_callbacks* pAllocationCallbacks) +static ma_bool32 ma_dr_mp3__on_tell_stdio(void* pUserData, ma_int64* pCursor) +{ + FILE* pFileStdio = (FILE*)pUserData; + ma_int64 result; + MA_DR_MP3_ASSERT(pFileStdio != NULL); + MA_DR_MP3_ASSERT(pCursor != NULL); +#if defined(_WIN32) && !defined(NXDK) + #if defined(_MSC_VER) && _MSC_VER > 1200 + result = _ftelli64(pFileStdio); + #else + result = ftell(pFileStdio); + #endif +#else + result = ftell(pFileStdio); +#endif + *pCursor = result; + return MA_TRUE; +} +MA_API ma_bool32 ma_dr_mp3_init_file_with_metadata(ma_dr_mp3* pMP3, const char* pFilePath, ma_dr_mp3_meta_proc onMeta, void* pUserDataMeta, const ma_allocation_callbacks* pAllocationCallbacks) { ma_bool32 result; FILE* pFile; + if (pMP3 == NULL) { + return MA_FALSE; + } + MA_DR_MP3_ZERO_OBJECT(pMP3); if (ma_fopen(&pFile, pFilePath, "rb") != MA_SUCCESS) { return MA_FALSE; } - result = ma_dr_mp3_init(pMP3, ma_dr_mp3__on_read_stdio, ma_dr_mp3__on_seek_stdio, (void*)pFile, pAllocationCallbacks); + result = ma_dr_mp3_init_internal(pMP3, ma_dr_mp3__on_read_stdio, ma_dr_mp3__on_seek_stdio, ma_dr_mp3__on_tell_stdio, onMeta, (void*)pFile, pUserDataMeta, pAllocationCallbacks); if (result != MA_TRUE) { fclose(pFile); return result; } return MA_TRUE; } -MA_API ma_bool32 ma_dr_mp3_init_file_w(ma_dr_mp3* pMP3, const wchar_t* pFilePath, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_bool32 ma_dr_mp3_init_file_with_metadata_w(ma_dr_mp3* pMP3, const wchar_t* pFilePath, ma_dr_mp3_meta_proc onMeta, void* pUserDataMeta, const ma_allocation_callbacks* pAllocationCallbacks) { ma_bool32 result; FILE* pFile; + if (pMP3 == NULL) { + return MA_FALSE; + } + MA_DR_MP3_ZERO_OBJECT(pMP3); if (ma_wfopen(&pFile, pFilePath, L"rb", pAllocationCallbacks) != MA_SUCCESS) { return MA_FALSE; } - result = ma_dr_mp3_init(pMP3, ma_dr_mp3__on_read_stdio, ma_dr_mp3__on_seek_stdio, (void*)pFile, pAllocationCallbacks); + result = ma_dr_mp3_init_internal(pMP3, ma_dr_mp3__on_read_stdio, ma_dr_mp3__on_seek_stdio, ma_dr_mp3__on_tell_stdio, onMeta, (void*)pFile, pUserDataMeta, pAllocationCallbacks); if (result != MA_TRUE) { fclose(pFile); return result; } return MA_TRUE; } +MA_API ma_bool32 ma_dr_mp3_init_file(ma_dr_mp3* pMP3, const char* pFilePath, const ma_allocation_callbacks* pAllocationCallbacks) +{ + return ma_dr_mp3_init_file_with_metadata(pMP3, pFilePath, NULL, NULL, pAllocationCallbacks); +} +MA_API ma_bool32 ma_dr_mp3_init_file_w(ma_dr_mp3* pMP3, const wchar_t* pFilePath, const ma_allocation_callbacks* pAllocationCallbacks) +{ + return ma_dr_mp3_init_file_with_metadata_w(pMP3, pFilePath, NULL, NULL, pAllocationCallbacks); +} #endif MA_API void ma_dr_mp3_uninit(ma_dr_mp3* pMP3) { @@ -92859,17 +95191,38 @@ static ma_uint64 ma_dr_mp3_read_pcm_frames_raw(ma_dr_mp3* pMP3, ma_uint64 frames MA_DR_MP3_ASSERT(pMP3 != NULL); MA_DR_MP3_ASSERT(pMP3->onRead != NULL); while (framesToRead > 0) { - ma_uint32 framesToConsume = (ma_uint32)MA_DR_MP3_MIN(pMP3->pcmFramesRemainingInMP3Frame, framesToRead); + ma_uint32 framesToConsume; + if (pMP3->currentPCMFrame < pMP3->delayInPCMFrames) { + ma_uint32 framesToSkip = (ma_uint32)MA_DR_MP3_MIN(pMP3->pcmFramesRemainingInMP3Frame, pMP3->delayInPCMFrames - pMP3->currentPCMFrame); + pMP3->currentPCMFrame += framesToSkip; + pMP3->pcmFramesConsumedInMP3Frame += framesToSkip; + pMP3->pcmFramesRemainingInMP3Frame -= framesToSkip; + } + framesToConsume = (ma_uint32)MA_DR_MP3_MIN(pMP3->pcmFramesRemainingInMP3Frame, framesToRead); + if (pMP3->totalPCMFrameCount != MA_UINT64_MAX && pMP3->totalPCMFrameCount > pMP3->paddingInPCMFrames) { + if (pMP3->currentPCMFrame < (pMP3->totalPCMFrameCount - pMP3->paddingInPCMFrames)) { + ma_uint64 framesRemainigToPadding = (pMP3->totalPCMFrameCount - pMP3->paddingInPCMFrames) - pMP3->currentPCMFrame; + if (framesToConsume > framesRemainigToPadding) { + framesToConsume = (ma_uint32)framesRemainigToPadding; + } + } else { + break; + } + } if (pBufferOut != NULL) { - #if defined(MA_DR_MP3_FLOAT_OUTPUT) - float* pFramesOutF32 = (float*)MA_DR_MP3_OFFSET_PTR(pBufferOut, sizeof(float) * totalFramesRead * pMP3->channels); - float* pFramesInF32 = (float*)MA_DR_MP3_OFFSET_PTR(&pMP3->pcmFrames[0], sizeof(float) * pMP3->pcmFramesConsumedInMP3Frame * pMP3->mp3FrameChannels); - MA_DR_MP3_COPY_MEMORY(pFramesOutF32, pFramesInF32, sizeof(float) * framesToConsume * pMP3->channels); - #else - ma_int16* pFramesOutS16 = (ma_int16*)MA_DR_MP3_OFFSET_PTR(pBufferOut, sizeof(ma_int16) * totalFramesRead * pMP3->channels); - ma_int16* pFramesInS16 = (ma_int16*)MA_DR_MP3_OFFSET_PTR(&pMP3->pcmFrames[0], sizeof(ma_int16) * pMP3->pcmFramesConsumedInMP3Frame * pMP3->mp3FrameChannels); - MA_DR_MP3_COPY_MEMORY(pFramesOutS16, pFramesInS16, sizeof(ma_int16) * framesToConsume * pMP3->channels); - #endif + #if defined(MA_DR_MP3_FLOAT_OUTPUT) + { + float* pFramesOutF32 = (float*)MA_DR_MP3_OFFSET_PTR(pBufferOut, sizeof(float) * totalFramesRead * pMP3->channels); + float* pFramesInF32 = (float*)MA_DR_MP3_OFFSET_PTR(&pMP3->pcmFrames[0], sizeof(float) * pMP3->pcmFramesConsumedInMP3Frame * pMP3->mp3FrameChannels); + MA_DR_MP3_COPY_MEMORY(pFramesOutF32, pFramesInF32, sizeof(float) * framesToConsume * pMP3->channels); + } + #else + { + ma_int16* pFramesOutS16 = (ma_int16*)MA_DR_MP3_OFFSET_PTR(pBufferOut, sizeof(ma_int16) * totalFramesRead * pMP3->channels); + ma_int16* pFramesInS16 = (ma_int16*)MA_DR_MP3_OFFSET_PTR(&pMP3->pcmFrames[0], sizeof(ma_int16) * pMP3->pcmFramesConsumedInMP3Frame * pMP3->mp3FrameChannels); + MA_DR_MP3_COPY_MEMORY(pFramesOutS16, pFramesInS16, sizeof(ma_int16) * framesToConsume * pMP3->channels); + } + #endif } pMP3->currentPCMFrame += framesToConsume; pMP3->pcmFramesConsumedInMP3Frame += framesToConsume; @@ -92879,6 +95232,9 @@ static ma_uint64 ma_dr_mp3_read_pcm_frames_raw(ma_dr_mp3* pMP3, ma_uint64 frames if (framesToRead == 0) { break; } + if (pMP3->totalPCMFrameCount != MA_UINT64_MAX && pMP3->totalPCMFrameCount > pMP3->paddingInPCMFrames && pMP3->currentPCMFrame >= (pMP3->totalPCMFrameCount - pMP3->paddingInPCMFrames)) { + break; + } MA_DR_MP3_ASSERT(pMP3->pcmFramesRemainingInMP3Frame == 0); if (ma_dr_mp3_decode_next_frame(pMP3) == 0) { break; @@ -92958,7 +95314,7 @@ static ma_bool32 ma_dr_mp3_seek_to_start_of_stream(ma_dr_mp3* pMP3) { MA_DR_MP3_ASSERT(pMP3 != NULL); MA_DR_MP3_ASSERT(pMP3->onSeek != NULL); - if (!ma_dr_mp3__on_seek(pMP3, 0, ma_dr_mp3_seek_origin_start)) { + if (!ma_dr_mp3__on_seek_64(pMP3, pMP3->streamStartOffset, MA_DR_MP3_SEEK_SET)) { return MA_FALSE; } ma_dr_mp3_reset(pMP3); @@ -93024,7 +95380,7 @@ static ma_bool32 ma_dr_mp3_seek_to_pcm_frame__seek_table(ma_dr_mp3* pMP3, ma_uin seekPoint.mp3FramesToDiscard = 0; seekPoint.pcmFramesToDiscard = 0; } - if (!ma_dr_mp3__on_seek_64(pMP3, seekPoint.seekPosInBytes, ma_dr_mp3_seek_origin_start)) { + if (!ma_dr_mp3__on_seek_64(pMP3, seekPoint.seekPosInBytes, MA_DR_MP3_SEEK_SET)) { return MA_FALSE; } ma_dr_mp3_reset(pMP3); @@ -93035,7 +95391,7 @@ static ma_bool32 ma_dr_mp3_seek_to_pcm_frame__seek_table(ma_dr_mp3* pMP3, ma_uin if (iMP3Frame == seekPoint.mp3FramesToDiscard-1) { pPCMFrames = (ma_dr_mp3d_sample_t*)pMP3->pcmFrames; } - pcmFramesRead = ma_dr_mp3_decode_next_frame_ex(pMP3, pPCMFrames); + pcmFramesRead = ma_dr_mp3_decode_next_frame_ex(pMP3, pPCMFrames, NULL, NULL); if (pcmFramesRead == 0) { return MA_FALSE; } @@ -93077,7 +95433,7 @@ MA_API ma_bool32 ma_dr_mp3_get_mp3_and_pcm_frame_count(ma_dr_mp3* pMP3, ma_uint6 totalMP3FrameCount = 0; for (;;) { ma_uint32 pcmFramesInCurrentMP3Frame; - pcmFramesInCurrentMP3Frame = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL); + pcmFramesInCurrentMP3Frame = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL, NULL, NULL); if (pcmFramesInCurrentMP3Frame == 0) { break; } @@ -93101,10 +95457,26 @@ MA_API ma_bool32 ma_dr_mp3_get_mp3_and_pcm_frame_count(ma_dr_mp3* pMP3, ma_uint6 MA_API ma_uint64 ma_dr_mp3_get_pcm_frame_count(ma_dr_mp3* pMP3) { ma_uint64 totalPCMFrameCount; - if (!ma_dr_mp3_get_mp3_and_pcm_frame_count(pMP3, NULL, &totalPCMFrameCount)) { + if (pMP3 == NULL) { return 0; } - return totalPCMFrameCount; + if (pMP3->totalPCMFrameCount != MA_UINT64_MAX) { + totalPCMFrameCount = pMP3->totalPCMFrameCount; + if (totalPCMFrameCount >= pMP3->delayInPCMFrames) { + totalPCMFrameCount -= pMP3->delayInPCMFrames; + } else { + } + if (totalPCMFrameCount >= pMP3->paddingInPCMFrames) { + totalPCMFrameCount -= pMP3->paddingInPCMFrames; + } else { + } + return totalPCMFrameCount; + } else { + if (!ma_dr_mp3_get_mp3_and_pcm_frame_count(pMP3, NULL, &totalPCMFrameCount)) { + return 0; + } + return totalPCMFrameCount; + } } MA_API ma_uint64 ma_dr_mp3_get_mp3_frame_count(ma_dr_mp3* pMP3) { @@ -93174,7 +95546,7 @@ MA_API ma_bool32 ma_dr_mp3_calculate_seek_points(ma_dr_mp3* pMP3, ma_uint32* pSe MA_DR_MP3_ASSERT(pMP3->streamCursor >= pMP3->dataSize); mp3FrameInfo[iMP3Frame].bytePos = pMP3->streamCursor - pMP3->dataSize; mp3FrameInfo[iMP3Frame].pcmFrameIndex = runningPCMFrameCount; - pcmFramesInCurrentMP3FrameIn = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL); + pcmFramesInCurrentMP3FrameIn = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL, NULL, NULL); if (pcmFramesInCurrentMP3FrameIn == 0) { return MA_FALSE; } @@ -93198,7 +95570,7 @@ MA_API ma_bool32 ma_dr_mp3_calculate_seek_points(ma_dr_mp3* pMP3, ma_uint32* pSe } mp3FrameInfo[MA_DR_MP3_COUNTOF(mp3FrameInfo)-1].bytePos = pMP3->streamCursor - pMP3->dataSize; mp3FrameInfo[MA_DR_MP3_COUNTOF(mp3FrameInfo)-1].pcmFrameIndex = runningPCMFrameCount; - pcmFramesInCurrentMP3FrameIn = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL); + pcmFramesInCurrentMP3FrameIn = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL, NULL, NULL); if (pcmFramesInCurrentMP3FrameIn == 0) { pSeekPoints[iSeekPoint].seekPosInBytes = mp3FrameInfo[0].bytePos; pSeekPoints[iSeekPoint].pcmFrameIndex = nextTargetPCMFrame; @@ -93264,6 +95636,8 @@ static float* ma_dr_mp3__full_read_and_close_f32(ma_dr_mp3* pMP3, ma_dr_mp3_conf pNewFrames = (float*)ma_dr_mp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks); if (pNewFrames == NULL) { ma_dr_mp3__free_from_callbacks(pFrames, &pMP3->allocationCallbacks); + pFrames = NULL; + totalFramesRead = 0; break; } pFrames = pNewFrames; @@ -93315,6 +95689,8 @@ static ma_int16* ma_dr_mp3__full_read_and_close_s16(ma_dr_mp3* pMP3, ma_dr_mp3_c pNewFrames = (ma_int16*)ma_dr_mp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks); if (pNewFrames == NULL) { ma_dr_mp3__free_from_callbacks(pFrames, &pMP3->allocationCallbacks); + pFrames = NULL; + totalFramesRead = 0; break; } pFrames = pNewFrames; @@ -93336,18 +95712,18 @@ static ma_int16* ma_dr_mp3__full_read_and_close_s16(ma_dr_mp3* pMP3, ma_dr_mp3_c } return pFrames; } -MA_API float* ma_dr_mp3_open_and_read_pcm_frames_f32(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API float* ma_dr_mp3_open_and_read_pcm_frames_f32(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, ma_dr_mp3_tell_proc onTell, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks) { ma_dr_mp3 mp3; - if (!ma_dr_mp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) { + if (!ma_dr_mp3_init(&mp3, onRead, onSeek, onTell, NULL, pUserData, pAllocationCallbacks)) { return NULL; } return ma_dr_mp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount); } -MA_API ma_int16* ma_dr_mp3_open_and_read_pcm_frames_s16(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks) +MA_API ma_int16* ma_dr_mp3_open_and_read_pcm_frames_s16(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, ma_dr_mp3_tell_proc onTell, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks) { ma_dr_mp3 mp3; - if (!ma_dr_mp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) { + if (!ma_dr_mp3_init(&mp3, onRead, onSeek, onTell, NULL, pUserData, pAllocationCallbacks)) { return NULL; } return ma_dr_mp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount); From 4ce6b7653f75cd26cf2fb4e77a541f4021a02abf Mon Sep 17 00:00:00 2001 From: laytan Date: Wed, 25 Feb 2026 18:53:08 +0100 Subject: [PATCH 555/766] vendor/miniaudio: update .lib to 0.11.24 and use LFS --- .gitattributes | 1 + vendor/miniaudio/lib/miniaudio.lib | Bin 2907722 -> 132 bytes 2 files changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index cf3203d4a..527697c7a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,3 +5,4 @@ Makefile text eol=lf *.sh text eol=lf vendor/box2d/lib/box2d_windows_amd64_avx2.lib filter=lfs diff=lfs merge=lfs -text vendor/box2d/lib/box2d_windows_amd64_sse2.lib filter=lfs diff=lfs merge=lfs -text +vendor/miniaudio/lib/miniaudio.lib filter=lfs diff=lfs merge=lfs -text diff --git a/vendor/miniaudio/lib/miniaudio.lib b/vendor/miniaudio/lib/miniaudio.lib index c9ee60979ff6bb8e4ec63361e9faeb8656a4d9b7..cbba9b7c86bea41787916845747c0f1dcf6427cc 100644 GIT binary patch literal 132 zcmXR*Eh^5;&r`@KDJdwn($`PVEYZzLE7nWTEXgQM(o4?I)h{kcP1Y|nG%_?dOii>j jGBvSCGPW>EOt!R4G&3?y;wsLpN>wnlurRPNH{k*RD8MH~ literal 2907722 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

      }dzf$Oy8Fz`b?c-UmzLh$gTc`rrbF*`QV)xQ~J! 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�MsCazQi=c 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%0A3Le6({^ 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

      ;hA{l`XnxIDdJ1gZ|KlFa2Yi@sfPHY>)A~r! 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�Bttm05?xS1p}lx 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%0AaMg)PD;8Rh782(gV+Px zc7abPD1M3=Q1cL`+lV(QfFU2;PDb8ugKSc7J?=e*&Edu zun0C&K$gX$83l0$ST(v7*c>$F!JaOzsJ4Mc!203N3-J#?Hwz>Lu?pk}6qOKRGB$|;;4o=hDO92z}*1i8KUrvPY{(Gm=k4bo?#EDovTGZZ4V}Q7*g=g-Ld_sl zy|67fZs3imgvYr3@*(4`4A9NfP@ZRASz=CRib7&hdMRk`kpU(ES!kGtnU#U%*w#2nB{h)M;p za4|zje!fC(VqPU=gIii=PHHjS2_PO=0eBArLqK9lhC)d`X#aR#I(S+YiI-oZ09wxs zT6vjYRLS63jKYP?FoPxn!7j=zD5+#{EKx|!OJVTKS12w>Oio2CKw*IHZ2>RIh59C` zw78PN6Eqj7pI=%6ni2#LUNd-t)}I%Z7L=r>AiP+b2VcyB5QOTsVF}?HBX@+vmlkhB{eYxv+s9%N-R z)RPLJonN5+C7>OoCHcwuISS=P`FZK!O}F6bS*YHCqI`%nD5enMh$0N1MnM>smYAEF zQwbijL&!Qp0$2g7B-9U}P(st@44JS1?GXddzcM&N(=2rG930{$pdDkNd5zQ*1{4ix zrNv+c3K{vuB@F%r&~<4Fnc)4K>EIYgh$e%^VRLd)Qy6?9Gu5zk0$Je003Bok1qQ-j z&;*Lb>EP`(Smv8R@eZ0$f~I)LFeig!fG61NX`m5mcv68#g1ncOnGVYgAO|4EJX4T` z!IRplDM;J&5ei|$vq+MlITe^NbVwFS7Hk+k>HGq8SqojzOkrqVab`MbqcF zV1WmoNq`�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

    1. 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

      oe);`XZG6Rez5 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 z z!@}udm-yNhQ(~=oLd`Go@OV0?OHX9G-R8%pdFJz*vOg~+Ja#acJS#AmbKvRP`kvFx z7LRvoO$(oAq9t?xyLHo^6+Ax|GrGwfswuv^r=TS8)Bglm`etg+E|y*7{BVm4YurQ; z%P`pb?B)emb_vDaSv5x`Gx^9FopWCgw0~IiE8+?NtAhC5;;r!cpC(g*^LrLC9)XR= z!^RV@b_d*B)yF2$8J80C=|y&^_OU;vckBQBT4oJJ9%O0 z^rbfB9tTbr7aRh(hz61`l%8T+OxAZt-7Z2lYloIzMVMXw*w#bN0ZHqUsaIL=Bf zPV61*oas+9D`oCpzLvJ)*727+nMyj-Af4Ifj(tAn~6ea+__Z%CaryeG5l9QRSTgpP@vlh1~zsrmk? zsaYJ&c+J?}?NSmfd|>ThSUkbTeYl(pTF>`ZU52e=m^S_V>rU6_WM%;lfJcgNv=Ks{i>Wa9mdl+5NU?>p~-*yH8@G=3VDpa08yY=QxxVZ-tdd zu=N)IgBYf0t`u3T@b7GcOpgC8o32)abwWADy9LtbKU|ydJf+^1zq?ItK6`G}97mIG zxt-4r94lvgdpdD>ec-&jn>S(U9oF84@nPpY!p6s7{SlZvj1O}U>>NUvdf5IE@6*CL zjB%HC!S1gqe0wp?vAd-2sQW%YUY#xKtjon*F2&rOQ7N%0|Jca~;>%S6CJP)$WEIq% zUv=m3wSL(BHu_)Ut}o8FEq+w3^2v$ea3gHLtiXgxPG{zP;@JGaUOt=0ODyxET66np zFJ-rcV!bCJ#|7J0u0L|xx#o;=>Yjt#=hr-j?Wet6nw#?cg<8%n%fsKZ3n#pVwZF7V z>u*?QHm!hG@Y8t*=I=kzpPpvfm!Y9-^KjGgc{R(Y z`&7f`8;X{$Tg;<)G6S|B+|Z4&-Fiy$O>vJ2LcI!&pC9{iPn2;fShZt?!gcf1{K~yM zJ9cvIIrg`s-f{NU_`m?Dp;9uw+<$+DmZ=Rn=j9H!`gAM@sJrF z@-rouImGhh9DT3Ape+4@%du;%cJ}IXVJF`)_RM!XU@#+PUx4hb7#`l+&LNK%!R}vx zwZHcrxyr<_>K(_U(#Qi%4vDkcZsko?^>*IW>$t?H_=|qI-?381fT_WTDql1<&zWua z`>Ts#-a2ltSwGKQeZD8GS{xR>u>OwFtNZJg`Z-Jr%8p6sRx0g+^>-e4*6@En-nU`4 z{`UPjti8xlv^%Tm${|l! z{}DF6(5^qLD)GB^I!qo`U!%*z+DU=X{m3x$Vdr_k`~#c+hw)+d!}zfD1v4-H%e^U9 zLh;MYpz9T3=Q$-CpK>sr9RFm(Rp|#y*mwPfo!69|n7}n_*^yhvUQYQW_PtLWc7E<@ zb@jGdwvUIE?%q4DvExgv(fwBpJ)x|P6I@TP`4ObV7IFLKt0_HC_rIQY`%Qc4LcQ?+Cp|2ew`f zR=%S1Vc`jDXTtcf{df^6i(4O-rOkSOVS5n7_-kaO( zVD5vBcMC2~+FT}~cA@s#)!7S;jrHF;)Q4RcZWHUA@O5g{otz`V$K@wv9trNd*0zFs zO4+5>SJq(~rc!FYu=D67|*c^_eLx({>Je?Pnm~9K77i>Iy>)z zZwHQ7F<(<^zr`2#rm)fQ%Gcbln$o)AoqltogQPYxrayk3Hl-kjAnwx@l8*#|4%nFS~6X3kz*7 zo_|v~ZECU@+x3=z{4wbEc{u+`J9sw32WH^opvw_xGK=r>zc!s^tD z&)dN4Gn;j{n(?7yG0eU-@f#L%Gt#WIXYnHiZg9{994KOWJ>$j z=-cOBKNHcoShq>xtu)W?_&}dKg1aWC_&xN5SQ#@9Ml?vdsTJO|@6~k$-7gl0)}4v)q7n4&UGYk#mi{Q1NK;%RR~Y zg-jJ@J7KTKbLy81!%`$Iw(E(u0)K6YGjVE66Q&wl1C zRN5Y!(zi+ctJkiwhlvM#IsO%0xfMrk^CT}m2&nMgcff_k`RJbS^LCbGZMrRgcUR@~ zeV>fwHawbjQ7(Gc(f^l~eK&Idd3NG`B)!8=)6&f7z2>|k*!e?q;=EF2o(XVoskj@n z$;>aw?V99P;Y(Z!a~qO!w7xs+k3RD#d}hYtN?3S{be{Qs>tb3cEWBF+FBVMj z;asW5f);JC@c!V~yIb`#=Ob8nvrJB|JF+vg&c9%%%a{AxzroByk3X{skD|6JsVqL& zztLJLbIX00c^%)?Cxw|5|Av`o|9J6x|H8{{)HcuXQcTq5GY9YI$RtVyxvl zG`A7~*m$$rhLtr_-M!zz?kj?=?}n{6hTU@m%RlyWCF;M6sLX`T@3Z#UEoeB_IDg+) zrQq$8vLZN`oUYEh_EnI;~YqXvn}mb;k`{T<`oJ!3H!xmvj|<~po>rgXQ9S zfvJb>2Vs`)%DWL?DrR%>#?qafhZjbkde17m;iJoJzt*a4dFDmv{liy@k~jZ4=$Xv= zV8%C7ZtE>$!!7&umaP8!TlLJ{wykYfVeMNf=)OEy`?urtr_x^{a+P0SDLFQtQ|3!; zi1?OtTWdBCw*fC6H+G4@rpR2mP3Zt{; zuFHMJW>*^<%<$olc+Z`E(~8-mQZ1e2t(p(U*pzMJXnwNz?*e}5Ny|kG@~-b&x#>nq64I)~dZ} zaxnSDyRNw_h-{94$%p=#$B=ot@-R%Exy!?N`j=8MnEZ}}H$@kw#Cwxq9yF0-7xR_#td z`ut44qTRBZbN}y$z~qgZI)9mz9n*!$|9#}PzdXBd;f}>x9CPz-{tuBidvhbrNwY(2 zS1j9fE*04P*nw(pS+@03LgxcEda&Aq_Z>z>7&&3utZKV~Y&v5DEAHLCP)6?cEny6}gj-ZAHplcqm+ ze|!4ckYj7ZVX@Y4hi%`TTC2tV=h32%>l!LqGOxdx1l#Wbn_qj>V;R%6W7gD7+uiS1 z$y`6A#x-3%>E>N0SpU^i*Jk0K>Aaf%j$YXOJ?#A3hbJY( zE>xbdfTh=F#mL{;OPVaR7OysG+wQse@Y^o$nZJxI_v9Ks`~9)FfIZn!aaB_H$4!eS ziEMbsw>qb&u6@r|hj4EXmjF9W{{$G{;dqvJTWjPu*gjKN!^O&P?OuHpyJykrrTuZ1 zt)S=43(qea%!t|AD7NlKF8z8&@|LX_2h4n!dD$svj^!H2=);{-DKh$r?b-aAVe0S3t?dqFT z81)~2V{0lua6y{g4d!21f67zjW}0(>wGnLnFRXlk^#|Iyt9O<=Ebp6leuYnPSM^7+qVo`|LLh>wB*yT-p5|kbW=A`8xnI?Ot}-+Ay8dxR&!X%a`u|;=O>MB z#rIr2+Z487v(TfPF!?uLliBUrt^UEvOW6AS6K0te`%Z1ne>;8hMB|2Ub4n(rX?OpA zlcu?)O6%f`$C*xoH@1~8aq^QXzjQ?Dmg+57dV#f9uO@Y7^1R(?09#MKVUM)<(Yj=5 zqaAnpUw65f!@?UjUj~aG*gdc?K5Tsb_utosjjSA(VdqVF)%E`TBmN>VT+#TvUmAnc z)l)$g>~Gv-Pu!O~E|t`_x^8>xq0RRT{&3HHGhxQB$M&%ED6YQEoIm4np2ZF5`R}lM zAls_e%xblExfE)MyYHw_^#4dNM$9!DJpyA8G_Wy21Pi}2#j7p~l%)PMvNzP|}R`Hz)c6b+h-jX-HWs-uC3sGPxfgbx z$Oe(Dr(a9I2*cdF@w8P`ZS~rJF!#FgKYuYtX@Sd|hx$QJey-dNb8oVi^M39nKV8w? zyTXB~LpFYOJZ%0jrmd- z`3)2QYFX|6@wcR3`ToIq$4e#EYplyBrt~s*@7I2Rb7A#Iqb~m7_uKBX&V-GpZR3hE z57}RH`AF}bt9yD{ieckr?_Qa&R{gnkF6_Kk*nXGxvu9Y`>tnaU))Qu@`mVTLo~>T@ zM(4%j7yNY_7rU+9)t{3OyDypXg!ljL*O;BegeLDh8DDA`vY@WT=I_id4V(Jry-)HN zbf-1%=Wsm&AK$1D`%o36Bqn9xd_e9+R-7zs{9>y_fc6Z&#X+$AB<(PJ=J)e!4x6R< zxQNbVS^-=Cux&a=?`_{AhE=j5>8q2gGW4FAFLheEfAmX_u@RcccMMbValoYhuf7m^MxFP?Pu!OQmy$me>tP^O^-!sYWI)A_9xAo zKmWULpobvLJy}zYADAnQJ1hrM4aN{P63|$r|jLvDWXM@>V)B z{!O)&UY1bFF(<9ATHYhm{MoC3B;*WB0$~txos#C6zuNoqX%`mx>8mmm~VLcQS725KO)?(3Ylg;=ljU z5rVA`g|(+n6<%Fpx5+9gh&eov%V0%w(|uW?xNCo=uDH!VuR7^y;?qs_n`WdfWVsh; znbos2?dt?J>uHV_JpM8a(WM{13jI>w%22zVTgyE9M$^TX*MX6Ki++^{)rhNmo&CnR zvM%T4ksDKHy*_eV^>Osyeg>&CzKdUEu>Jq=Sf!zSzoXorhrLM(I!be%6#Pr%_c}dq z%L`3*ro>>|H{0z4mfXyBv%DDSUcvAae0M&Ek*w#Q6vB zEzeou8mK-aMsV%RB{SyTmw9<$QOvsS;!0h)+ZlA?CVCehu{8+IQh7TIHh+BQb?Um< zMRTUV%==)^H!CJ2SoN;U+ei_uIiW30j99?Fr%%O z{jmA3q`fd|>a`PpSf7TyGoGz*>%;nwY$h{)|16%9e3n0Nf6k}A42D=GL*Gl@vNapc zexKx+uwU$#TIQpauea{BFIYJ3zh`%#EdSPZ2kKz;Ic)vwu1djO3U*7iGUay3_AaPt zUUaZeHZ)=K6IlCj`*j8WK7guTUh%E zcF&c}bpw$d-D|sG<>x803)1$&%13-f59_};SoR85elF-vnce;K*?ybr{Fip5@NGSm zIj8)2pkQjvQH{jO^L$Uj#=kXA+*-N8PQ<(>$zlO>+iWH)1BR3e$EVu%ojKXpS-$Xc zDJ@A}`D=d7hW*}O8kLSe`Rf(bn{f8$QrJDUovxu94&A(V{*O%g0f}n`J}+(`7j{>X z4?4>J(rCq1{bpGC4V%w|wf|uA8L;*}Y`;~~m`R>^kEVwrxt zbKiZKd9d~fj1OBc4m-aBHb2~`kuSA**EI79*Cm!IG+*h2&Ht`qkhTAw?kWijADDia zf7+q*V{doIFD(%{dkD5acNO0q&Hn+pOgE$S^lr8J^hGxxTF9BTrxvEa_D=fpN#b{^ zVdpa(jC;%2aZ)E;@BBmOEAH04H#hG|*B9eC7?>w^{Fus@N$0aO50)GD=*L@d9@XDc zqu_gHhj#wOzV0`-jC5M!OBG<}IsB15{@=IzV4bsmiqPFTD;#PX^g`C0m|u2FgK7WU zlV5#d_UU}#?@C&7v$UXfl2T*lftALm3>}sw&SOq~U{#U1_WA2~4I3f@_p>DA-jUM# zeBSsI%zTao4FURGubj?Iyb}IW{G!-nZif?!Cz4jc))~R}Loeq1cuS%%vC&>xZi7V{ z_n{XWb}Jee#52qPE1x)J@g8ZIdf0v%!QD0+|Mn-E?s)f3H0{)`Qql99LIbCCD#P}N z3OJffTPW4P23G$a6)^a<<-OqM6K@peuJY5oT0ePB@%*l1LW#|D=FZTvyDcr(FHjMw_h5UkEd)KONdk9-sxZ=nDZar&riB076 zuqt`((ABG9IHpi|*yG`PU6}nL=dT|7AU%<7o`UjfmdgkC!ORa`EoI=R^W2uL_UOH@ z-1ZZ~YPKnrJ{0whaq`;pM*X<)ozH3kJbvbDD-5R!?fwzC{M&jHpFOkqUu0j7p2aG* zrS7J6vgyLFuBZ1@GpJwD+j1MW-x!vDVdvYy(xc2C34@3QyfrZXD*2D{&+h)Mgz;hP zlVJK`{b3j%Hh-9$;@zxqL&T z{RDI6r|tIZVEt(+q1*5DQwqId>%(B>4dc2gELT21E@Z_mP6t&g{?UfkXLBRezY zlGeN0{}*O;sAq7z2$G3)W4};&GuyK)3}f6dFbI{xW%bT2S9-+#E`*3@?n zzdEHK@o}sPJit}%5X3aklY8qr>F4Igu=x40RImH@v6E-~Z(Wu9$=fLjO3qNA|Y~#(GiLmoT|2yrf*?(d2MA&+%Y0H+IuQ=MdT-I~$oX90l*1*oQ z+2wxBMee?|MP#^1&J%mp{>w7g7cZFl+Kb2eXNbPKm7$%JZ}gHo zZ&Hn`O)~a~!p?hgiaf!b6`d5awY+-$_8(Qz(x*3w^4#BlUDHCcZbp#v(w_dsrlL$6 z%mW|nD9}6{lOkS@U4$Qy5%2b9%9Q-Wu5XS3aAkd-`3y(e&={ncY8(E>>|D zpDun7DzRQ~`qX8Q?*7|bp(apibmwBsx5Ur?J3ny%*!4}f?y|P}zp} z*JI+h%VlhoWLaW0A$J|CNKAgIf{65uYjf{@**n>b;ljady)7L5tk2V;p9?*L?eB)Q z{{(+3aOD^8^x0{9``^bqt5><4Y)sWVJ6-Efi&awoVV|`R9{jy@=+O%Ky@iJJ&)Pja zwU=}03Wn&?RiUpK?5_JvVdR~!SoCAU?1zo}mlwjy1DO9?7dJ5<L z=I;%kuAFpdf%~-Pxw}Ko8eF|=VkDZ{vV=+WN^RD*m(%(W^jvkVUF7_Nd#?_Ab4wV{ zt5a9*!OoM&no@RfnkQGK@?E`__CKwKu<>x%_%p1%pX)JYqelvVg)Db>$U~&*m#fKnW`Qa$#2>HWbQ_X{hPO1I=uC>-L=s5JKqk; zHTP~^oc?Qr-*t!&?jxGqjY;nFr+ zZ;>|-cNt_>RursbSnhn?IaKe827k}DzqL_}EdLoZb~@y}v47It%&cJ)%K!z}f1BpM z^m*F6-RFSr#`CR-KfilfRaoas-VrTuQ!xnk-jsc~Vy5Bgee3>J{XINu@g1i43kqB* zhfQj@6dz`CCC!vOQIxz;S^4}^t_c$tU46JuJK$v9aVM*`NqOJR|Nh&Sb!gqcDe5Qh z-I?UgBBt2NFL0HKi|6>|3AgXc`$s<9=capd_uUA6A-C;4Csw3OhtK_KY#Dyey?;i4 z{@kkxlc%yA6M0n}eJ*@@;hFu$Hp-dPPOiB+=kiCTgCP+C(c)it-hS8GtGj6BTX$>! z)Jc275B{E(9yo`mY4!glVIosM?r|1eCs9~9Q_o&i%>8Cq%nj2M7EX(A#BDmxFe#W* zQ0C(^-kFgvW{Z}J9N%}vGU!}j9^(QZR>Pp>Kh^$R*kQ5x;DjBMJvA+21Wv_e_gwjM zX>GZ)o5I$$>-Ty3oWJ~wTYFKX;l*2?vlf01EZ2`-af3O=|6Q4t;Cuu9=099Y_vYSl z?R|Cjwqbef-qkmYuAe$=(Ww^`{PjTL%5_>3)L`qgA1s(3?pL(~_zC zT)$YKWb%3#`Dz05y@%fy?dp9Il9p;SW5Uma-`2JSwrAbRou0j-GA@+2`SLd&hApL0 za;)95@7OHoFp2zaeo=N*T|D)~1Me&1vA09pPTf$tY`QR@{u7m<(_QI>VL%F6cmZCL-;_CnWro#a$u@4ZV7Ic|NlYHi3#m&~dAz9^hA zG2C{-Mee=H?myNd85OpbEV+d<&7ON*edQ9dbd!ng4gPf}xN3gY&Rw@Jt8$8Z!q(9E zfB(K_uA22YM&nVPm-{R0ZPUs*XT`a0H&)#?VTRZx*Hbfm6{E#IJq>ea`Nqy?$5dtZ zarU}rlQmWJn*A2-;8}lTw)a0K&DG5JFDL)X;F$0$_twfeZ`U#%m~z)+b#~LFmTMhh zY=Q~focp-7wT^n^c?n!l<`h!zIAgrLQd&lMkFhy-&fEKEZ!TWTW}fjS;>?t3eB$DF zYidP)XxE%qs@G`{erXy~%yw1g(-oQ4gj*8FA6>rvU~}1)cdBo;c*ozK&HQckI<6he zPLo?xJ}di`@Bf}r8gX<(adq2c^9=5=$dM;2T4opBjo5Y2?_Wcw^m$&J9!}HXDc|Sw1@|3~IAL@& z{L%&i->q%3U-O^--7hP|cl7Vl@-(ANjw6d+h1z$%dgv25`EdB7=oud;Oh~$W_`|(j zp4B&4O_zV0_q=L;$zBE*{}Pj32W`DhDPMVWy7>8*MPApr1qGHp_;AZujcdV&s-M9h zpKG*Vu@8y(Tv`51Xj+X#g0W_lparAg{f3smx3imdHeE|#UwkCYa;xZrGv6vhY?dEp z4W96P^&y$0jW;EBstFrB_n6XiQAcrIYIVxHXniaD*`Z(Wx1?>e%c#3Ot6Seg0)KvyNL${C+nP-Ef0|F`aX6u~K;Zq~3vL=~1wQ=nI^4BR{nXGn0sRXWTMoS?GSRej=--TK>7q!S%ix*v|~|Ni#DV@a{QKCEJE zZB}Vm>j+IKH0KrTIsWH;PkxyV`-^2$))cvExa?m$V{Y>Kn@9eBDYWM1oE~7mL}guA zSlP_K@zQ^s=2@1^k~c0ED>(ky>$bhy1E1%gUp=g4xY{GUI%>ktm7P{#)5H*%4(EofhThCfWJ(ZT~Egu@O#;=;FTv{H+DQSxu9r!?d1aQS6j_>w4U6~TRU~xB8~R*cWp1u`gQ8D zQJnR(r$>SspTy6N?zVp6Qm7%e@rZVbZ=!T&fR8qplykhW62pc23~}rn2M;gnd2wp@ z^vDBh84az4k&EwGM_4~lG5mUxSu|4Qb3nA9tFrC+?FC%v5i)iyx0g0gTeVlO=s@#p z<9!_l%@aIB?@bqv3b9zYMB?T~0pGRF>1i|E{EsEPf06k8<3_JL`M0N4by~ezb*d}- zSWRJ2K;bm|n>u3QOtQx#TIOH7Zeu?6!A0(44Sf@3W=x!{IHM!N^S-o|>CM%T79X^n zcIf#}CjG*+wOP}o1WVTYY?yJz;aKX8S5fP%44*M1-%Kz0C71d0Z=ys_csQjiQgX9(x{I9vNx#J?TdQ$IY2n?%nm%?X2mFeZP36W7>t#M83HbrhVXHEqtCD zsOY?{Nb}f!+1Ay0m2d zxv4wNokCO7wpcE#>$==*t~`Ui>*j^9Wo9fBCZ3*~pkQ07(0yg=LiY*38{<80d4+3O25V>EQ<4`-V4Py8(ZbESq1ehNAcP}`k9()SS^425 zd%x+XOuLnQ-|qQ*Aq~Z)GREbn7k-Km{;DLnx0q*jQ?`Ju!geoB=PMQ>eC9!Yu@_JD zt9yw4UFGNV$orYa+{^l^KVF}iz;$iYgFsuU_;c3B7QEi<+uO=;adN|gn>lg|3fINi z?vT1X@oVny4|Uz8^S%|;JU>*m=JZR=w9KzMQEw_a1C70P{m+P8U-&caRQ1f2JDzd7 zFt6}-XjEtU@oDZ7p-qcct)o`ozEYlQe9QH-759}GULPb zyJa0*)(?5&&i`6#aP)clyYNoctBykM2OT&)j=#AeZ`L2aVPlfp&J}CFuJ;OQnzi&H z55JD<*=fCv&nL&Wmae+IEnpwp!++cL;wNvPFw<$zr1-Xmhj%vB+?C0(N@ep5HH=sv z_`uU4_rJ-uezu^ElXGrVys9{0HdA!YcjnE@ro3pJZ}z(BY-P>s7wqN5yP6jjCC4wY z@?%*j)px(%ZtJNx=UWmFUOmH_8F1FfV&ZMPo=W3$FXzsY_1F4w+h=ch$>i#`{GE%p zIj{9IeO=eeeeG?vdHIzptEA(TCiiWAw>8$K%AjZdx4j;=-@fk=)|=1!|A?=Rxazuh z@$zzx(V^{A`Wod$vo_&p8{Mhh*qFc-6^e`irXK%Lp zvYeS(5dPLKYo_nY3oA3u&wXh1X7gY9ofh({6aCr)T$aC2wQOxLQ)*P}YoE+7aQ_OlOH<>wYJ@j4`@b;0CHs^8Q3`?|lMmslE^DYLWtLgi+G87Df={r#&^KL4(d z+Z^NnXL~=H1U%0jbdf`>tp5)-B5NF)f(Z$kHS@Ti)YM zoKf_yb^BaJZLeg`XEa>mZI{%hD!%sk^h1qrv)H;~0_Qb)a_}y56cv@U-FJMBvEGTS zZQg~4A9k28JFp_}fLy8C|Ja#JXXt!dFWxZqT;GOCuhtwsoV}>&U%}LJzLfXELWK=E zQ7&3mZp$MwDz?SwXO!%T;SsjG#Cv^?P5hSa-cH+2d#vy)*|$mR`_y$miWS#yVr^J> zYlrTP)(_3!uKe0HCDfXMH~z_niPaxZa$R*koZg%mG4XKzO%>t)X7-$Zi-a`Af_S_) zu(9jE{Wty8{KQtnc}|A@QXB7zC394-%Xwe;>_}kw^&JLZ(kw4%hzB-{AIPl#{l&_4 z+C+~hT2p-12Q_>;ez?Y^EB)HG&Jcsz5b+o>`_C3puT7?H{&wD4_t#U7+jA}!thH@9 zwqM`z=k|*plHc1cr+-ZD^yxZ#tw(&HdztISl895!)I5IAE3%*U{?n=56W^Z}d9ip? z=%c?b3vPY%sK|S0$rAD8>9K{YXKXp-^+V~~oXg2wjqx(7D^90$Ud`)Is9ifLDQT{Q zP>=4H11~of|CcaI?0Yap-YJ9AeCqFxV{yl)FPNS+EvD7L>RzSChF+QD4rI{v?T%RJf8$qja_;qmj2`n@PwKw6 zyBwe^um9j^*GeJtC2>4w<`i*%Y1Gr3F+(!T(&lQlSkR-crQ5Fa*UQ$)#{BRy^FL{^ zdy}4c^5@7)MLO613noX)eeS>QqwugVdAlV0^@HJw>SvOSOmDBs5_nU!{g*?W_rrG+ zCAL}Y=#xm8GV^nyoVC@2swLAFO}nJ>srA@g!Id{p9kyC8?s}^t8WN5Z$%gbD{J{{~5Nqu?LJ?V%iz&&1No6S$-$s zN#KE5f|WN`&%K`OD)o4wQqR#H!f&=+IM1u;y42!jjnAAc>G1oEFOR65a0q&QBUi15 zdUg8L4Ir<~cKFEe+!@9J%asdMreB_;{w9}6pf=)dLJ{(`MmMl+W#)?aopaZx-E z*MWb6eCd|f#(Ao_H$(HpGD;t-9PKad?J;fozb3$9;iVwqyFGE6vst{q{x)#l$0y7o z|E#y_-U=qJ zuzw2E{aqPLm(N#UzIm z{j^VPaa_CfYX z4{twh<)s?HkX!k((9GP$&-Gi!*DF(+)pXb_D_S_1bUlrduy)Csxdgil}MLxx^vSvm*Dcnj+GtGEV z8x~t$w_yL(>}k^LSl4`A7WnG0#vQ{x$HT^5dgof078jHU^8DBT9wGcT@=98a$$i0V zPQRsD_RMa4cjQ%8#-W%$GYyQdYlteFEq3tP|6;bMuGp<#PofNOz0vt7wJwE!<+cq~ z-8EZ^*6z{%^`~ovgm*!{xOJi-hbm)l^xor~hC;jVTC+Dt3Ug&;bn7vhJ!J*ZDQ}%FOUb-XK z)$GiPt4mh=a`0;jmHU3|vHdqW>1*F#FdHsz$}fDd%YE%vjS7xmA$#n9&3h>3Zs^|6 zps~MO&mmIDRIl)Iy3js z)B3J^*Cg7f{Nvmq|8Ev!+13tsztp)F=i5@Y8Ok#3@{ReR;(K{g>D%8^Ei-N(Q4Bc! z!Pl_;*x%=S{z<=KefKc}A3U5h(r|A>2fXtV9sg`4yqMBm=_Wp!$C=Og>=JSQH> z_0GAT7WAp;sncb_rK`8MUF3`N*SM6e#_?HQQS}*1x2t~cu|kd)KVnz$*DC`vhbLmyzgy^sO^&qv&n)xqL*XP5vBe%Qo+{TW9vl0$-fq!!$LBw*b{)HW zHiX&ma>}1;dL;=T3-WinJ(A|KX#BM3+tNMnmL>05bF-zZ@rF`&w&+nA|Fy|i>qXyJ z>~ApNRX&S5;`yXas+O#4CoZeoaCP1K=j$u^(?g9`EqiAb#9VvwhM>Ludt)_$)eHBh zb1nU#al^XMHQsoFJI}GrExE5`N)~FG+&lXsAfi(8s`2_OJqqqc3pXo;-21xXRmGvl z9P`R=S6u$fA@uNZ_lwGS^+~F$r_JvX+WAO-;B(E|FNb@S^ygCW+8$(kUGg$A9&8^jo)dC05#vbQ zE1M?jZF7@(<-^Vpu5(AX9c-8RKfk%ibd~yUm*jX;kIyTt^uk(>$Vy3acF$gLHQ4sm zfm}7sdoOhZ9tAwP@@(a#kBx`^v?&C{tkQ_fG`XER(K&4KnU5+L4X=ydt_-}_!Y61Z zc>lnxcO0Almv2p%=&@it^Kh-s_o<2DbGI2Omfz$*mag_ACbi%>zuw_Z>o!iV^4h?( z{IRd=S^G2JGaM|S!>9~8l7Ec4|D4+CcJB16<@Ykue%$l)P2z9esN#R@K=V1TLJrfV zC#n~4O}@Nl-y@FO%xVnna?e?kl6_|EoDyW7&iB)BTkWozzj?arULV=|;0VvDwD?nnbisW;Zp^~_WWkp{`*WvkI%1Yr&DQ@HJWBk^Us`iy*S6lGVj{f!?~3y z<$lj3`s3tRT~A!!d`jW)N8xLyUobiDl8ViX5q+v|U&wW!I`cd+E~TG>x`EXq25 zs&H3T6wZiIQ`JnEq_XkL`?PHV|5@W|ukIj9;4kcsq^v-b>YUcii;m2O6%J&y;K8awgC&`-RPNzlF;M=U)%`{kPfP z?3~)N4bt&q!W-)EXBM#RWIq;@#+1VSKceF6dKLMJlUORRs4&j3lAKzW$KL<;?8H;- z9VU%i54yYA>{YJ%bxeI?V&tEb`?gMM3Y+u%|IyXP&Wk-c-da5|@(& z=_OgGTDP3y3oWs861nK|$k|;%=@skKQvVDyxg}HFNOKweO~#+oqEv{(9q;-?Y&UL&rJ{76q{^n9qLBJI`oeYDtst(j|@*09J_{BsT7>GVwDci!RK{o4aR+Sl#3 zPB=Epu6=)uzh7R8X1wXFH0jRTyH^edKHBv*McJ}3>;Gko)cFpAJ-$lHF@$BzDm>gXsU)neSjmf`* zlMUkdXY};12=dud%ir>U%D!`ZwuI~N^XNb3)v3_5R3YKsg%gK;pBsq2jNp3v;)$#4Tp<9{-{A(yp(%Ry?0R zs(GGwWRv!3KG3DAxmeiQF@65pkIEhOc|R-i?l#NKbu<=~_J5mmcTvpE&C21K{=EwK zb~RmyI<|C5yjTDytXy+Q&d)8-%S`cTWnujPpMimy!67X*u|&_nU;-m!15~6eKSwV& zg@KuYfdL|-mr|6PTvC<_GKGL4r)U)Rd%Fl&Iw9fz*IZ zXJ%w&U|;~5xNhkYRR{|t#{wciW-ur)Ff-^O=>o|xGpa*%U0J+)5<-_SR2K_|E|4wE zjGq`77(g!beIs3l(4_>`#fqVe4denwEvS51dFdB~E*q#Q8-^}+ur81bK}rPQ-w;RW z3Iqu;Ffg!V=;8qD3TI$o0QqoYRk#^KR~l3o2Zkrw$F7X}6fUJPA)V7qEr7#P$T7#LRm3H^_-%NMGP4?`C} zSQmD?YN5LLF?0!lb%`^9T+hI;QfAsVgk5W)x&$zE34(Q%GcquMVys*Ac(@2HR{%6g{jJ~tB@u`eLj+V8SPfXLjfsIFfq{VmA+m{yfguM)YNVhoH9Aw)iz`A}xLri{ybT&fQ9;odS7`i0Ey0k$?GB7Z3$-BfN zbX|w)k_77lDS6Axz_0+To29_!Xn+(kFfbh8>rzITqX;TW7#J9&;O3aKFfcSQB8Pl2 z3j@Og6p#gT3kL&30*c6O4hDu5C?ZUp3=9Y0BFG`83iib< z5D98)_`7o>++zT$co-NMRKe~+)&;6FnHkqYbxrxFu?V5d52{NILl-DsaOo<9>Qcwh z1uCzY84pA4Vp+WZ4#KW!P+b~eU7+yU&B?$JAPoy2WH)PqOklhLZ8c>}Fik<2a~Eok zCfuCAoD2*bu$lvE>e2!00{K0Ii-Dm)9_DwDNEa6aLjzm{**&^olR>Ewr0#?1uWJaC*Fa6y1)Gel zOAo9IR7!wqy%#&Rx)HjLLv`t4=+X!4dJ9eS$9A5sN9cM4)uoT2%K)q^6k4)vJijOk zp^FVvc{4CD7+~l!1nbI$>Y95;^AtjtK2(<>hAtzpt~JoK@o2W3K0;R%RF@HkE@QAR zP_+aK4b)yq15}qWhAtC4x)wlnnPBKL1?!Sy1ogrg7^?gqL?T>x0IJIrLzfv?7c7?F zd})4!(DfRs%M3%8Ian8Ve+hyb=?n}E<`}v_!(q&f7L1U7lbjMaQY*zAs>=dHmnGOP z6DCM`D5Ck{1Hy&LP+gW7x~#yuoS?Bh^k3qtBZe*~ur5#;4oX#V+RsH0x_&@)IbrB>2J3=_ z;abiAJ_ucspbi`Z1A{Y$E*G$_bZD<%iDkAZLYEa(mkWk2SFkQnNP=Q{&Xc>g2wiDV zU9K3q+`zg(egf%2EdhF=y4)~yxr22<8}1CK{oK`1UG5mVJixjlq5k4lSo#p*!jn*4 z9vHej!Md=!@Do&*Cx$LBJi63ConQtA1}_X<-gtDyKy`Uz=<>m%YXVf44~8yZJi5+8 zb@^iG@&oH?hn4^=)7h;MVaNsQrZX@w_+jV*EKZdRVuwB?gJ`buZ07DmO z)Q6d|osj|D$aQpY=s~z}2~<}ghAvQz%*?nQWFrFuLz&;i6ojrDP+dV7x-=n4hvDrIJ10ELL8 z>0dpB3!9+2LNRoOfpr~+*2@A#Dc=yf7D9D}Vdw&lj3LJTUVVCx)M`2n)fJARD*|j6 zXmkoxJXaa7n}e|HBUD!ehAvQkWCn)@s07f6&O3|HB@G&kVPIg0#LyK5whJ^G04hii z@ae5X=yHMTio(zp4c3LdWXpx>ipJ0t1J(s?W-&Ax>a`*4S_st@gP{wwNr0IVrfbWs zMY0H87ofUgF?7X&?E=LxC^S&Z!~alSaTvPd!MdJn&7QGKQ`cur6>t3mWa1D$s(^#RM91V_;xN z!O#U7Zf9oP%mV6rFfgo&wAp~rB?;A)ilGZMTFlI-z{J1+8qeCsux~j+S0GeZ8ip=V zm@_jvL&ts2Ov>Ad(A5dmm5!k+1MIH`CI$vjLU_02_HTr)gHT-=7`igSx|MV;BK3uPp}KM~bmfBWVup_Ht~<%S2VvI%sIFWLU7*Pj zW=8BO>N8YV9)_-buw9^0HPGniMlrut2)m>}LJSNH`4C-5^$j!<17HB1b8NV*Eac7aMzkh*^<+e{F;qM*7!YEX3*fptNLs~Bc99Zg2)s)XtS zsX^6M4Auqh#xOkN-NJ;>H4&-{qy|-230N1*t_y*acOi6bfa(INLDf|X)&)v~Ab-v6 z%zB2l3=9k)HK@8OQFJ}OwJQK&moZcqNDZp4DzGkC+R)I?Wkcxl zg6aaPLDf|a)&;9m#HKIjMd(U~>H?`@LYc(_^-!1@Pea>mn_}MDAyRJ>R96i~>a9hw zD|K4j7ld8Qpt?Y6P+eFD)&=v|*5kjQBXk{x>H?`j)m0DH1q=Di1zl zGsjbet{+fc9T>Vg!MY|eGcbUfknv7+UlF<_K@&R+3=EwZy1Kx+K)o=~xF759M5G$l z3973LLsvIg7pRvFO2H21E1-zfN-;1Ppoq+r zVqkE9iy)6of_pKHpaFDH%ky%8q$4EfBCF{IhYx7159HfVnu)t0ae=G`G!qVK&x6!N z7qCHl0my3l!R8!*_DW7|T8>4{1hAS#&^GCVwaQ_WA-Z)3a}a-=m>DjkKK8gYF2{PfJ$IcT&(MU4qYdMY}YEV8qnApC=4HaN5){9 zvl^@h7S7%cpz&LfYGiXja|g_fpilz2xqhR238p#V`7*|0=sd{Ychj(h4`@vdGvg!Z z47k~Kbu4Aeda!#yGk2geDzQkP3Dd3(U^S3dA_K#gAWf!0mP z{@Mgq14@mcFf^O!#)@gqX0V!rpdevjU}#yWhox)*jk+^4x`HB|fq}s#D1RQNIa|Tz z1T#ZY)-f(&=sFo>_iO{Jxd)vGng7)px<&|D4R{=k5j+kITIaCQE)~-*kgu5;K?|rr zoydm;<FwNPAqQ>)N<1$P&`%%<9{Tb1K zsRmTLA$otx3NM~wsyPTY2jpImd(;zVuEtbz2t|$Uzw{tXHJ}y?VytNno6jOlHAlea z!2FKgUq?~YVE5NC6g7=6-_OOg3pCn*@cZ5wub}-e&3E#~RC5N!9PHt97DY|zj+Sqj=A1)O<8BcD15*uXj1&<* zH#=f4V5$MtqzE;y8QSh)s=0__SG8l*3QRSZP}E@e*JTtn*yH^Q5o)fYsJUL)+=uBN z&^QmmU;P4xhcVS$M=@vaw#5f9)qvI^Ak4uY7dKJN!R~kP$_@A^4fgoDjbaY=w0Z}u z29}q1m^b{!bn{&lHJ7eko{p*J9#{=5pJI=T`zUI#hw}pzHK+B?U&gfSA&MI8;qwSZ z4fgnYjG_j6dVYeU278=7MNxx2JwHQHgFSpeBjJd&f!$v(P|U$@*Gm*N*zJ0Sq6T|e z_ZmeFcK5tNQG>l)eT$+7yPMyksKM^$_b6(xy9czI3lWCc?fQsf4tBdhH8R2+>}mBg ziaFTb^94l>_PXFJiW=;8fqG{M_h5JPcNBB5yXOar8tiucL{Wp?oL^uy;MGkG3=9iu zw6L@{euLG3+QpzIB4SnuxjqGrt1vTy=1f6t3GO@MZ!p_Ypmk8#=3$Y|`A39Z|G{cN zH65s&+B{_{mT>^kMgwL>&>BCGo7b?UKt~;s?P3JALK#7Glpr-MxmpJ?-OL1510KT! z%@Ev5K8dLYGz-AY2wv;Oz`$_fm(6@kH7sCrK>c8lUDr-OfzD_ky9YFWz|06*F9%YS zc!KLSra5e2b3ha1AT=U)-kiZy!%l=64kFZW5}}5R2sPYbHTeC`LxdV$BGm8^p@tu< z29%ybY4u^0*b~gUNdT+{R-amL*?^_ZF9=oxUH-yw>MOr0ra3}Hs1Zg{Gta+bC#E?f zU^SrCARu=ibp+MHpcH_deni1)Kx2=fd~rZ7P#ZICh=J9BX4paP(dCnG_hG6L2de?i zQh{u^8aowBUX}o>0nNC9%!z)&4qfSl>>f$58qk;?D4b0=933(3k^-v%tzHJ%WupCW zE~Xl3uo~E$R2{=A=pGhiyJWy>Kr2*1c0J8AaKSW37OVy~zG3Y#BMvj1!7KFOyHVu# zp4*D4MjmVqXl*&jt`I39R!lVtU^Sps;vhA*ve}^XXvl6>1gim!OMukKADe)s526HC zgWt`{U^SpMAYgN_x*4>S22%Ed)ZFh|^cU03s$g?KX$Pdnl6gZSrW!S{8tC)}!yjEi z=!_V$ztq8M@SCH7qQ+{q<$g@NG{I_Mey`msX%99Bv??3q_uL7h z&~=r_{&E1Tft5dZ_wQ-Kw964i%`6|#nifzfAe#ePqYD|^0m*Ehw+Fhn0$GhS*c?#$ z0jUwXa|XJ44Oxu~SdAofo$%ANtO!i^xPsMyMrJ_%;>xeYGN<4MRs*xE+Ja>!raA6l zHTc6BG~&n1h(8QH!REl$8U?<0#xkeig`!6IqU8%r_jrTVfYK@`eEzQbt%#|{2doA( zI|K52^R5fwm})@#8krfTpmRxjN>iabDUie24{Q!}I+LNUs}svyfInCbtlnAZ{R+!i zWdK+WtWME$(#A4(69`rVTB8nfGt=-v}#_XL5}z}#~xTYWvIzksR56$@4aG7VHWUq94}Wlky%tOhi4 z1!`w5@jH#B4-yYn1De4Bx##YlLS@+o*`vmV8{)bh^2j)3|3C`jdFnel_K7*hiOh4 z5o*%GYW!Fsdp&MHWRSr0R|Z%OsHOvj%6(r4=x!$D@W}+Lfz?gFH@04pjNz1Y9Uw+EZ)5oH(O!) zs|c(H7N;jO0+cY-fM)cVLDNK_YL_8}Az%S!IG2FU0kud${h8o6SLmu~WWSe!)!>h> zGO!x(${Yp;h7-*YQSnhs~tdg-Q50|57Qjb ztU5CztW40~)3`#&^^w`;am?^0~%=rl^Yvo+hJ+5fp$JKGiI|v z=EQjxoX1jEHiFH8mCsA}-cZAIPZLk_p1cmc_pSjQ-bI9%itvF?71g*sdnX~;s2bOu^F0eVExB#iyZPAUT z4bTl%0~*lIL8k7>>Xuo_s}xa6#hWlV1(SPjTDP(D=)t;Djvk zXkQp8ob_ARVi`Z23|0eKZ^^*0XTxMH^VCyN)adE&hVF?#_SaOf8qka_C|~r*>S1y7 zG_aahZUzR>uIUT6)=tOt`*g4x7U*dbmZC4#V5*q`R-?xZDWCN_WTCq|k=-*BtY#() zM9twE6X>onWHqzEYCxlHpt@=DEki8rD9}n9$O>&xeEgCK!_s${12#vT6|(l*^K}fC zFq{ik11q21=6k%t^w&JF8qh2=D6OtLHC+Q!&3v#L&@HA9#qR@3|DL2G$2@>XN;PY1cBa8qjPt$eg=&YBrc^mV?!R*8hOic(Z*{ z!Bn#XtOk@%L2CT=DbL1K1Ip>ljGz$}kk<-KPGM=Ut^%6_8ixesui&KI8ccImgVlig zARsm8{2yTH%d7#bfvh%XVA#XwiKQJ5I_rg*5wyY(WX{T(KUn4+)`86dE!G67VS2eA z%lfGGU^So=3(BW4e;#FFx_JXw4QM15)ZU1`a}-Oy*a%hwTK@vFYr*p!So%$yz-mDI zUqEWMf0V?M<~M`Yd|+c>0L|zhe7yooI@|(Q1L_rm=2W_)gR%6@w}RDxde$H{o2RUL zj_EJZDn4dLP-_aLM(5MzP)s%3!RCNw{6Sma3KF_LVXD~yRs%|hAT=v4Un|E{vlFZa z=AKKj^Pqb|k;|W5U^Sr8B#?VTCo{-knzI|M1~#@l$2=CgHwW3AJzzDU)kL7QT51!8 zWu508HAv0PrKhp1>DmWY1KOhpimyB=HY{muKUfWD#2Zxpm|2uySwD6FtOh)5 z3EC@d+X!8cjqGO7iZ5nHQ0oO`SLV}+SiK0?1!{ zyLyZ;+t{F$tIUj9OrR5L7#N~-&KP2b^HH!lAU}c1g!Zq#=P}JW237-W+ax5}Ou|$H z>NOzRKgqX_r(vo&0XByNx(-(6{N(SL?l}oo16r*Is^9y1nkz8XoC2!>t$YKiIb8P! z%UBBNv?pdpP=6Vu=HUx$eb_T#b1pMN&NZ58zM~b>uCrh@u(qGNp)rf?j# zVq;$Ig=r3G6(}>~Y$njzHw+BhizECo)m#9Z0~$L8l~MMuOt8!)T?DHEt&#$@qcR-> zv5YZZ0;>VdI)V1XIJSJoGL{SSH8Uf~9FQ8px1Lz~GFQOnfM!TR<>3jw|5(hq3RVMJ z83K%|>!M`SB$%A*mYCyRIls;a6 z_zm3`iJaf>g4Nt-g4p$wBWydSzrZUq89}oKpzx82n1H2ScOPsHXp9InC&wbC&w*(U z=$t8LM$l>*P}<1Svw`m7M|RIcusJY)iBEb1J@)`v4QM4TGb5;_4YG?ndncCq6g2A2 z%s7FIfdOu^;57K&}vvv-bsA9AImuQGq4&^D1r8a z6e=CWGPd&^tOhhQ4vMeW=QE+F9U}Yd1y~JeB?Cy!iIw-T^kH9u)!b!aU;x!kWr`M9 z>Wf!kH9Sm^wfd2sd$II$UxU@;u`qxJq8KE1i`HVs*Bh`J&}v3d_`HZ%iDg{@=mZ#M zMwps~H8EJy2I!1BW=7Bm1}NS?By7R5&fz`SF3`v@sBD>2^aFb46>|7|0ILD5HwKjn zTvIc7Fx~tStOnF40M!>cn*=vus`&&~Q^Cf-0IE|tm|kANRP!0E<|z{c188r__jYS6 z?XfRlHCx#k7(io@@ylj4V4Cw4tOm4(9OR~j5AR}0Ki|M=&a*NwfKCedb*36iID zm>H+AGcbU5ECjEU$3+PM)28Jog`>?c0eu341ccwEi zFkI3-TY%}W-(WT1Qxq5&7)qZ`z|vO#16BhX8wBNxIT=}4%7njQHK6tesLdMvdr2Lp zUH`ypK&x&*{lOO#KVb>y|6nzs(iPOsuA8>V1k)VQ;h%^#w+FUzT*p+y$OJmw6tn^p zln1x3_QTR9VFIfGg%3zgGD|6z@&|P8A~Pc>U4ZHx?^bMkYCyedW=7EY6`-z)s>iPKrJ6;M*M0x z!RCPGCO~P-D#jJdI3yQXjRhM6185D||EsK6<{h}fYCv<5Aams9gt3%kpc0Ik(UO&c z0d%5}wQnevIOPSK11b|hY2*H-M_ByM2UY`GaSe*E-OS&i=eQ!5E&O0Lp#B9&&C&y# z`7y&s0IUWy7YR~hdH4sG@dQDz8c-?%m6_}-PC(C&K(1I(P)QAzG26WOXGb4VxB#1BvG~3I} z2pXjamCxR1XJFY|0h-NZ2A}E%QnO2TJ(hWVX|P?ORw78vi`yr#^ao|YYC!cnNX@Bp zhP;^JBMVjoT5S$eBg~zJWlf+QSPf`*KPa4owBMCr_8sKGYCyYzKx#HVy^kf0fzD)L zW(4h21@(!fmic0-D;2@!Kz0^0Fg)2C-ihgEC9oP$c?mM-su6o0rhAmZYCvrSkiR1I z6`^~;k<+0HSPf{r1yugL@|%Zc3||$j2DDEfWX@@0=CzpaQ3I<1mGhvo#jZjROP#9@ zRs-6T1yVCrXbP6Tl?GT1s7?miW%c-c6{cO9U^So-6;OWveQ`aOww4xH4QzaM0qX`V z^_MnS4Jh70?y0lcj%6%G2doBkA{@v)tCZ$o*^j0RRs%EVsQ2k}m~PestAUxL%2JPI z9~o%B7c(Qw?|+hKEygs*0BjCyEZ6u;?r}^thF~?9nIL1HN6x;*GAC{XR&xM)lCyl$ zQ7m%`#$YuD?2vY5lJ$Y3n0A3qcw=T%VTX(xC$2EY(zh}Nn*$oF1l5Ck9zVfSW}1Q3 zfJQYzYPM8{V%ghe4pwuA4Rm5D1H*yDFf8>2=zL;kMo<|JYC|$qfB%K)W=pU+A6Ot` zu+x5@#L{oF0;>U?8wQH^6Z76SZkDybV|lsNMmo5%CDYGDmL< zRs&wS&A`AQ(YXkE5*>0rwF9dGrBjf55NC@atFZ^G0kttfY7A0~4`BM;0jvhRs}ZyZ z_3&RT^F)qdHK5gcpfW+xwG_)3krP-AXk{rVoC6;>Vc9PXI!T6^5!6-%xm!{CHJ0_F zE?{#&t35$>&A4(K%eo6t&CbjSIyVyJudCS?v8>^A1DgZ$d*)qu(tP`T0eYR6PeHz$JC zfL6nT)O2V+$Fde839JUR+6tuRAv5Sg0#FJ-_E$1k4JZeJ^3JFG?9kJ_kkzDs)qr+A zfW{@hxZlDu-jWJd^PYu)0o2~QbbAe!JeUSn1KL>(a*w1Lwz?@DtOnFS1=)2da}Sm> zDg&$rG*$@;=kI6Lu*_*@g4KY=mO*xHNY}*fS@vA(sLdI%=pR$s{ySX0FBAG^q$3%2lK#cKxrNnOBxR& zv6S=qU^TEd+y8aKSoUrgfYpFzXF%hSfihF`G2K%LRs(8vfbxcg;vMMuhsb^}0;>VF zC_rj_bnat0Tca4P1~iuhO80;DXG70KMK%XC$HL4A-sR1}z;Jl}3oPrSO2Ouof$Ce( zIj*nEv8)#@1FHeGu|eVEy>}&+wrDw64eZq4r7owTC%YoMrvjn|G!g{aK1*-w=_63;}ob8Y0EDO+m8qAEK^)?{CFPmSDWlo_TYz|D# z^*NK1G5ys6Rs-5m1v2N0ixTv#A!PS-g4KY^Oi;O+BN+?5?E+a%7g!Bwv=4NiMUj^$ zma)oiup0bf*aKFBKMZ?O)L;)o&?*RKM*Lye4>m`MlYs#=zqQ=$9hUKy31Bt4+z>Sr znO0(1<2n(n2EV^1fz{ym*JKnm*!?vHtOmcorh?Vrch5Ai8vO2=j-m#;dq6Y7gu;0y z*c{M#YoM}a+xsU=Fw@~Iuo}?0h#)lus}Er5TY+XOnHfQCB#@dgeN8ND$mf8~0iUAD zz`$_yhccG7@m#Q)C0q;)pfx}XvRt4iJtC*)d0;i*({33U7|!1-!%~0E2de?i#)9h8 zyO)hGVEPMms|qtCXgwRKPTBp!8_SxCgh#0oA7Qwu=lDzgwbmU)?#U^So>E`WVHK29`C_Quje}!cnUL|0Z7e8KYc7|19Wm7Gb2pRUdCBi%ID)K=IlK34NH1H0agQB)1EY&8O!>F zlVCNVO#z^?&OL$|%lfEOU^SpQPmr6xMJ>WI7Izw~hM$#z0kl?a%abWs))t-ttI1$z zU;y2K;;etE6f+FZg4JwchtyxMQ~I&2b2tZ91B+9Y8#!3~bsnq+H1i8;`>{T1#S#}6 zz-mCg1EsNysBA22-Y$aGfYw}q$`*z@4Oq^~y98EK0_{_Cu4KnDjszOPW@ZGP_67>) zw@1>jj7MDon*%=ao`HeE^?ELr{>4?W8ql5yP&&L3bq>o~nrmP+pf&9vHFv(hy^I;o z*THIF=G>1Hz%m|n1FXh}6LgCe1B1`(GrpMS+ytuu-Ny-<4@kObg=H`2EwCC7Rt5%8 ze~*b~bEbXypU~@ooqaZhLYwN-?cJUmn1~gv)Qd1gt4a=DM3$PmS zodpaG3|BgReqhE0=w3u-M$pb;kl*iSEH}bb^9pPZ$loBlyuQmNVyXeP(IEK?l;*Pz zV_TQ<25b&!4+|)5969wI%Xr;euo}?qLLj^DOby0TzrO>k0o_>uQq!x|jAi}md$5{( zVaVN#6Iv9o%(Z<0t9io1zyLZ)Unw@j0@Gg~!D_y+L)Yz0I)h~#;1gKQZs`2i`D1&r ztcUyzRujh!x+#r;VU@>pEdKfeR@2D|nIn_oGshCAU%_fXs~tdP=1flkEbG<3fz>E* zGcbVe)Y)Q|j-_Al9jpe_p9Y2DlyBNt)_XKpz2QwpRR|v>1Nxd^z#?_gaL2HD%pysT&3|jLFay_z}nZas6wGSvCGFzl$ zNrx<8H3!%rw+vK9|Habw1KoE3$?u@{jlZ`6mi*2JHV1Uh5-6X3D&4XGvpi%6tAUk2 zTE(Dq?a|%L0agR62S0Of!*ZqyCqxZ&+^;Ap${I6Hxxi{bD-1z(_X}@(EPY{auo}>f zKOi?Z>wLxHFCMTO(C#EqTk4?8HY|Hsc)@BwYk)!hN}XCEENuWjuo}>6Mo_(??UIOP z%$y&r2DI7%bZ$uWm0m1mivU;+s7(tR4;MPxf@RN$AXp9PoKld#TsB_7Qojp<)qwhF zpt-A<#9}P#9E8DYs-d^8elaV_mqFp9np%Qojvh3&4Y`>P6z|;1u2}Zb%Ye;+jc1RzOd8M~({xuo_U? z7?ge{z2^FZnNJnLYCz)&puEHBFKp1u8A(Z{otT-bM|q26TQ4sJ^I{WQE==b5Qs^NZg90zoQ9O14{3pdaz340g8rXRbpV>R+VXDyqs{zFW$ein+KxE<<*+E?5m{B^9V{p34h6of%mT zXh$S7BdB)(QnQ8a-E&O4^ugwU$|q1bYqhD0W2!L#s{zFo$UXW6Z}wrTF$AlD_4T}y zrQ9&pfM)O^=iq_NfvgP!*^2CDW3V}(ybe-h&apxP(;O49ngwi-_SpGtTd}MsF$Jpu z?E?bYz;Ia`OWVc_tOm3W7Nq9<$BkIpe&%2`pfUlJ=F`ISv8)NS0INC047vH}$A<-2 z#%(OYYCtoIp!wX#K}J~Crdom3G;=`KonHC;6pLM;69yo6x`FCtc|I>Jb%71ooGIZ9 z49l4r81h#MVp)4&3s#fE4!ZS_f#LH$CoE&0ppu7~5p)t4sEjgx3ECYB3Mu6HvIm=U z!-jzYbb`h$MqVuQ-40+iJ~|8xpuKiitXE@MW9A4}bAuJKHh#v`i&)xYPGB{l6|%;xPYCxx~gUU^5aepjr34gE}&F#CXV=sGxY?xM$-HOf?~3b6{oo z>9?=3+?5atR)atNgn`w7)~bWtbD+Hf%iLc$SPdvGgVdxR0IlOeuL~l;YCv@*NX?<= zmmXufITEY}H0A*E*Os+hSlk>1Rs$P1Ug0zs%NZuoU^SrjJjfhjZRQ?KyJEmlgMr^0;>VVIVe42uTzS_YCz+nAT{h8UtyUqC;_Ya!_2?{YTraQ zc3~MO0o{(u%m_NM6O>j>w)g8}`n?Qn4rq)Pq((WQ4oe%m9IOU*e%X|Y#f=>|#-PwN4 z^Z}-OYQW~)U}Ina-O?>}ei4>-cr92B=%gS}J?D}qh-H0C9as%$7d&W;)jf<0OWjlt zRs&m0tbF(Ymh~+SU^SrICqZ%Va={Qw+oln$2GmCbl|N!9x?M5-)dW@pI#C%^)?KKd zhh=|3Ggu9177SD$e45uUgc;5)U^So<8$kIzJ0cRx+;J;d4X8B*>R0~!@f=H=qz$YF z6z8DygS}7G4psy5H%JZkK2Zl)4XCaFslndg=>)5RoqHhaJOfL;+yzzxT3rCj%Qy1w zRbqx=H&_j5egkAzB=4K0m}+{!YCty-f!q|rQHrIF-3wL&TK^2nr&oT62V$Dj2UY_* zeGXLqeAzlZ9#c&}SPkeja*#QBec@R8)Sw&Rm>EHHaUeDJKNOTP&6x-`2UH$_)L_5A zX%bis==4-j+StZ^@Dipulfi00=^bQ_dEs&_{lO_WnA16Bje7nL%dc9`Kj7pw+$AN}I`++Ub# z=7H6K)}?^L`Qx58EaS%W!D>J=Wgz>k_`hLUzp((U1~iHQ>R)VD48t-{v=FQYH2Vq4 ztF4IwSk|wCZlGgk1l55czfTnUf@Ll7Vz4=&y)Ym(&YfOZ*2*pctAULr8Q2{BYCt_;LguUhn*+KH6O`ZkQ)95SH&%kxfNpgGh4a%l z=2*t-RuQ2Fbh-jFBYtz%fX%`0p0!{#pfi*}Zr;wEjb;9Q9T95QgVlh}SpxM3H5mJ_ z?4{ZORs&k|28s*ywFj|`nQtUQ%_bt$YzC_V-}(o-WA^h+EN$a0U^TGy5;FUIvCLO) zMNyM~N(M`M-Ue3V$PStB-ZJk7mb!a8SPiJ&0p&sUd)U^>?f|RF)rRan(P;gKWj<~v zSPcg!=J#D-HH)FW6Q#*dv7F%#nmuG@1nouy#f9L*4ds~T>;aq81huPb zvmTbakoJPr=saX5|XBT3sISf|w7#fDwX*02$ zv3Ufn1~e82@|U*X?%SB=90jW><%itY<|xaBWj)C;uo}<`XHeRR{Iv;s2QhM+|2S9; z=+r?_c^DG;^BtyLC%|ezH^_k0@NVCD2vf~Tuo}>+QIK7R2Nq$uQwcNz$;=4a&j>Q- z-p=$LnC6@Yn*%#zlWkfCma&2}U^P#mXT}zu4StAe&RMV;P`?Re*M+$sv9!m|fz^Ok zX@bJpH!20oSnheS8qg|VkiU*t-NSM>!3D4yQ2zpC*9;+jFHHAb1gim`pbk1aVyhCC ze!(TMngzU&I9)SCECaJ`d>O0;v`ZJ{o@MXZu$&uz1*`^iQZ&dt*WZP7V!G!lSPiJ0 z2dQbA%~FJ^<{DTHXa^j~uGS#X-bGNZMovH1!D>LKr-IBmmbCvfra3pjYQQ&KFfcHr zrDn2Xs<{bPV+)Pb6JiIj+i2eYcS2Z2Q~+E?i{FY`nfyoDyEwIU^SrKK%joyrK5>h z<}@FG)quvVKz6wa#$Y+y`5{;hsBQ_V0jXwq(7)GG_i5tOm4e z4`f&DM_nxQuus5hK=b&ZarKG0zM0Ltg7VEN7U!0;>Uy z-hkSfl|TO9!^~f=!D>J&G(dgNfUG50_HDfZtMO)ooFlZ7Wh$2S;cvleK>d4Aj+taQ5Y%!7g#vQCe*miiwY5Nf^NXE)So*>r z!D>LW!yv!6YdyfS1_pF;FEb-(jXfwm-^_Y|WgYBiusNU`nn3Ai`7Q-4Ycsxp)%Za7 zb{#F*kLB#yuV6Kx9RwhAjGn#2a`w?Tuo}>kW>0ScdRpQTvr`Uh46zJ-~Af#G07EtYYT z|6nzs@B{e^`wHWOG4XapWKCX;iT8_Sp# zGgu9N_ppG~;GcJ31*?ITnX{Qnv7~u6uo}>f#-O&}i^*|V?$~7qtHD2p&jD5giVIL0 zV>(}pWeq3jMrme7(2ZlDJgCTf7t2}*F0eVEb1y;WY&xTk0NP#uY4Q^NNGjfX<2m#p%}6Em+p` zOMunjACHm*s{!rr2Bp>IQ_f>qXAW{LGb8BMKaiStngUq%q)UU%fvv;$+A|f)o(LJR z8q~2bQ0ahNr^tfUfWjFh^XqyjmT`VLuo}=j5h!{1{+fVgoL?TS2Gq_3g-?LQXDnkW z3Sc#$G!HU|;rlNvoswbvgj@3EbHRzz-mA{2tZ*dp5lt7F0coy z0i8<>a`U~@B3SmYIDpl_)_%X4!i%LYa0IJ)&C0+4YKJ?^pT=_Dg%el}s0;_Wr*VD@ zmh)RcCrmOkf=wK-mXn1bb;Ko_t%#jKDsNdG^dh-E*KD_9NaY+g{>$oS%krR;SB zs{w^GsLZ^S#D*pPxP#Sz+H0V=V7k$Xr4Q=?Rs%B!`#hQ_SPiH=0NI6o9?c7^2IO9l z8tn6E-e5JLHUdbEP4B1cn0;y=up0dC@dc{^l`9}~RHpl0#5BhbtOmcE{lRMRyEy=? z26O@>NS&qm-L;r@1%lOp&W8lK=jizvSnf*-0;>Uy8-vs+&Mv?*mmLgN16s2TQseTb z;vlA7Az(GIv(tah+wYC3CKRj&bngHtU)Zx+U|DYy237+)=LBR|hWLFf>)yk`YCvTM zNR33^0W9T41d5s?hO4oZ^O0aRpnL-|XWK^~EMwhKU^SpJ9;C);RvebK8PQ-husA(6 zab6o{`4aliQ>R&K)1|*%<(#3f~Efz4^{)3_XO1!>?@nG zoR5?MRs$+CL26e1EW@%UClRa$H17#=PpO{BY0NlH0;_?=1@<}3WUv}g_<-Du-R~)2 zHTe5qsbDp*b*Jrnw_{l^3R)G<%m}(w9F#9K+c!PIjEi)zIiS4*AivwM*^6aAQ3hBI zEH1WWdtuqPl?hf;3++3^m`%g7$1n@5CX0uG0aVsUw`X8ES0o#(26mR&!nGYNk4^PHJ~~NtAX`l^;;HT*~0?b z!OF}CYR`l0!rq511)BrfPXsE*A58y%<&63=up0bsE(fatowEe0m)9@4(1_{g3a}c` zXe21z|5{;!Wv-+WtOhg#2vU>2Bo50ut17S>&@Fo)HLbm0u&nc}2CF&1&cFcLcf_<% z8OvC14Ok86tRYa@JDblG%NpQXuo}=#a8UaAGszmum}ebW4X6zXa!=X)*;vlIs0XV7 z?GXdjh0AX@W7!|q09FG!aT;Wo+BFF*<$NPp4Jgfn(&6Qeldzl-)C5)oy4?fR#uhN* z!Lrw*8LS30UI*&$7^g{N+2h;-Rs(ANg7Qy*L=Kia4qCx#K>h}$G3@178(0ngF_3n! z8qithAaiCG%)=629Vlv!`6puu!%nao(AX*{zpqYd!J-BN+HL$g^?w;vb+|vhE16m^uiql<5`dHSl z_Jh@c#xp@`qMiz1nNyemRs*`v4wMH?4(`Qrp3FqBngVFq@|(#7%Xr-+uo~ETGV535 zVc8cs8LS4hmkQ*bYR@%T){0C4tI1Jh0NU%f7ZnU^Sq%YM`=iU-?8VV^)j7Y6KY}>z{AmIe_IH#U)@hpncgO_go3H$8rwL zQm`6WJG^=411w|0%fM=2XQJ*sse$FL)#YF{pmG!tBd1AN&PCr2Rs%Y@ z2xOPz!dZ2g=Ij8gf!Sq~z6r~m!cMRn&^|nnU7qLPV_9Ri3#|Kt&LA1=YcKbJ)qwIl$eg<~o3NDOd%tIWs{>L)TwhycZHYU7ei7j+h4RRXW z4^{)J-$8a|`0-*{`*Z-T26XQ&s6BC&*#yhD@jBtp$8uo}>L%OG>YrTnn8u}_25;P=-Vuo}=! z&7i)+>8Z=H7fW|yQ?g>~j3(Gz7=ZR2r0jvhUT^GS>@caD| zSPje^>~VS-tOj%+D=5D&{}zX3jq4S#8ev9AU8!Oag5{pat6(*JP&Id4{IRsvuYuKo z#w9>`*@tx&7iQUV9jpelrVHerABsU(&ilFnRs))61er7CG#8e6y_;Y)pz}*WYX0ta z$5MaY0;>VtjtGfI?H!gm@%vykpmY8~YTji9U^z$e0ay)a-z}(& zYFAl_WzY3Pup0brwntz!pn4e;hS=L|kHKp2x7nV6)qrkZ0QJ%A3R?}M(g)5B7Re*&ukmGhuBNx~d9 zEb|wi!D>LKeu3h>H0daovz@u-qH?4Xg%q z`W#4&uHQ2(b2s0?YCt!@g4+C_%j~g?KmP!$f!URQx*W^7sXxJLK(jNTF^4tjPqB<6 z{Q|22od*kwNptq8Sn99eU^Sq;4pM`CT;dN{4d}iJkQ$k=dy_HC)xTghpz%ylx%%pM z29~t(53B}sk`gFMtOj&PJgDz!nsOCO8-N|G26W;XXzV6dJPga-1RP*BpfnG1 zbK^}OENe43!D@P;_gALZS72GY%LP^gv&+wO`w>jPbA#2u(!AlK94zY!c))7DF)}cK z@}TIVU0Ci);03Dz?QsVAozH1DmVGyTU^Sq-l|lX7uTz7tj5&Z#Vq|6n-KY*K6G~^Z zhG4o`0BjCuECp15ef%*6OIuVBtOj&*Jt)oZKD-XgS|cH_8dzIBkyQoDom0YKHQpeL zKx>vNg0P&qCjwT}#R%yI7Mxjx<%~N~uo}=^2_U0*^*yny84v@j0o`8!QX{zO2bO#a zx<#Ft5p=HyXv}kQx(JrKQUYuaY)-R&?RhL~9VNkPK>J2PW%!Dn0a)(Ik^-v%-O375 z!*oyt%Ur)SSPkg@0#G=+mnL8-!)3r~Kx4TeHE9WdvF!Jh1*-v_s0{KKpOy=jGiT($ zYC!EnQ22aeIE|%mB@b2uN~a*Zu+Q}?fYpG`_5r0s=Q+(-=3ErPYCyXcK>1WK)d$NR z5K3S*520g>pN}Gc8qk;n$X`Fi z^s(ISt_D^ET1N!(*Nq)*SnfDb2de?CsQ{^oedCLztkVFi0i7!X3P&S#KP+oSG{I^> zbG0D%#FaW@NrzfsHJ~yR)UUi}_zBDULv64cO-9H%hr6@yW4W(H2dqXLdY^)HLk*Vm zTXex{Dxh(}-L?>mIeK6eXtr(9}QFw?g(nYvOdZHti}O4rss1j z56d}VdC4t%!t~KIV<{gZ|YC55IW&50&gPAr=z-mC{At+AwodxwqK(T_{ z_A>>m0ga1-)GU82j%7U446FvW2lH6c^}m>QnS<4U=9)ld!oid2SjHtRz-q#v>#;>Q zYhjri1>Gje%vb}TJ*@4XgwS7S5d_JXuWuKirSPkq90p_qTSk`AcfYpG) z4`dGZwFi!1H86h_X31dL%isi719OjY&JryBN@uVd(B4vzUDLI+u#EeGT4KzMo*)IF zy+RUFSi;bi2y@)PYC!#NkWoiNda$f#a|f%rE6BhQ$-uy%s2PD}oDFp1E;A!+4X~Y( zDVB4aJ;COH&VvP|^u^ZCu(Vsez-mDEzJc7Ma4_g2W*YNGQN#CT4wgFC2doBkUM|S4 zSM1eT)|mN%)xgr~@$^P4Z8kr!8d!UyPml@AoRmLU4QRh7$j$BIy;#;K1c24R#vwmG zdWU6>ED)>)W=?jAGM2R~K`3g3w=-dxcL)Znfw`GUNfJvr9|BfW$pC5pG%`KJau!o4 zSPf{b2~__4Xp_YJfbc6m;D zjK%MfU^TFOu}0(-mb(t4z-nM?Gc@KnU|Dw>4OVlC4SLquLv1YUC1Sv8KyC)P=aRKQ zmh%r|QPgb9;KFiOOB`6uT{Z>=(0L9U_hex?han!U29z&A=||-Db}Z-8B!Jbx&J~ej zx`m}ZmIzh@>QjTp3Ko4{fn^Rc39JS*?g#3Bde5%IGJl#3Rs*VUL3wA&%&S=X?B2JZmj+e?>x0B?jlpuJK{{9sXnhnYd_or9!D3ei zSPke5V2~Q8h1OWg1kj#BW=8zxWP!~Aoeu{Z#-~16q>| zGDkBf4$IlRgW$dd0tR@bcR`ct$u#{t!U^TG$ud~+EvCP9(fz^P{umz>Vlw4aZd$Ov*YCt!9 zf!Y%VM58uo_-yn!n_% zJ0H@5LC)`!!D>Kx5aedV&FNUiK&F7zXhFvhSywb+Q8N{+2Go`S^((cb?qS&*I1Q`@ zHkW-hRuoG=Wja_5s4W3XKYuunV>zRB23QSf9sr~U`@K{%!D<#WK+aNL*tHMKKGs=a zHK1??nbR6Aj^z&7*Dpn1({gV#xk%P*ct}Gv0JXsf_#U~~OmYRgt)#@A}F8qho}$QkW701BUy z)LJZK4qL!#Kqp><^4F;;ept?4+X_|#k_VXsxw{+`yU1y58(0mf4FytzeLeqnu$nC( z1)#Fy_Yo}jzwZF60oC0gWgZF^LYQ&76RZYQ7J}4lkNb+{+@4)vHK4u@D14My-(guR zyBn+qR7Qc+oVWSFgPF$mfYpHR9RQUbhK6E`Fx|5ktOhg}2@0br*R8RfueA@XCIdRg z_;{+!H%zJ3;=LY2F$vXRDq7s{!3P4vLH1kcn8vMNfj&fX?6o zsfqfUie(SNDX<#QI$=${sHwdvX)=Ma^A&xu$ohhkQi`t?8wGUs~5m(K=~cy z=5=S5)?li+2v!5SH2~E1b2+*LOFQZkSj`D&dcGT?izVJKgVn&&#)AdESjK;@fYpG` z=m5q0k{hqPFx_(%tY#|It_{b;v9vRke2A z{(O2DtVRbq4^r_@0Lxjg_rPjkae+Ob-Uq9J-PwBX=qoJiE*^l@fYx<`^3I9o8(7vP zKLo4cVuZA#et&+CWxd2Buo_Uk49ZmtST|tVNB${?qXR>^9-y8l;1&dadZ1)K1eP?&hO8`YCz*!pfr>xB!J}( z>la`(GSGg(u?>^3%uT!mtFdE*obj@yCmzcj*(jt%L+CO!=V20rbuo}=j5vT?6%EM*~W`6$&Rs$+`L2-e-E%6Dg2ESdO!D>L` z37~i{Ji&owecczZnhzk07#J8tJr-k`?*^Tu2RX+cr0jRC7nXZizJbjFm6sqj$9n%^ zIm_!iSWP~(9IKa*z|yY!0agQQhlAW4$5M!;%=`&f1FCmG@s*dQg~eaLz-mD4Ly&up z&dI?tR`46F27h1g4_FOoOc)d&_4oX-><#=2Rs*`X3uKpcjXst;gZ_cl{D%7dli5Bj zd%*vL)qw7t0@VffGt#lF-(X+^o$Ui!-vV-ve(QcL_lPlq)g&`P=7p!bT*A`VV*;z$ z4sAzuR7+wR6J`dhK@A^JszojnSiovv>m`iMAI4#(XI8Kp&=?UYP9I;~IUQ3C8(0mj z58`uB5KCW%9jwM3TDAnHEyrRG2UtxAC?Xgb7);#X3u4;E309*6RTH#x5|%v?Ttukh z2CD(N2b2zX#D3j~X%`PzjRDlI;^Y6Zl)b!QHK6`7$ec886D;G{d|)-8HOU~OW?TQl za?S}qSWO@!q|B^){sl{#7XYilU+)Nl)qu(SDSdBO620aD_hB}v- zSk8?X2djadul|iy6iYi(0<5MQnos$Uby#D@DQIOKGb896JWzX8YtI2J?J+5^IiNLx zp!O>7pI;4_b%8WkO)NVD1E`;?c3d6H{#+Tbnkc9mksD1|&cKlctAW{d(_=1{y;O2w zHJ}q?Kz#?c6O~x*n3D&q0i8w#QgiRuN-SlR0$2^Gy#b2TQ~MaOl+TJ_HK6%iP<}tv z_7BV6NhPqFI_SET>5mPujQ=Qu)qu{X1C=^O(QWH7!%zjR#tFI>;_f_OEa&a0g4KZ5 zih|6s(L03Y>{&Ii8qk~+NR3J1w>HdpR|l&Bt=|CU(=**-Smt3hz-k1bZP9C1CRpa6 zHNk2?dul-S<VFS3zo~Y-`4{hgTb{26S&AX#BaPv=U1jNe8S3bWR{> z9_UulX)OJ2U9g(jj0_AQH4^GavGl3+z-mD84zlaiB~dJWSbeY>P&k9)y|-=0E6n&Z z0ILDj-5`JMooI^X-cm!b8qj_RkX_#|24Xpn+6b%$l(#^3VV`d@2CIRMU0h1!|A85& zCSW!A$1Y64YG8e_YCvff6sOq7H(bDKVDXN9e8Uy22LJem8(0ng@eOyd8rb+o=OQyKcLsTY z)xgF#mN(Aw#7y&^U^TGu4W~nbSk4yn0;|D4z5zN_6>*Lk_VEoLusNW8cA&B)nPXlg zrh9zBYC!!nP&ns35c!Q67k*$h_{Tu}!D?Xn)KR<^OB*QwtOgce*z;*1SPd+nTGY#7 zIb$jatOj&01gL$S`*tgqc6cyY4gN8Z5U?8jV<4emHTd&;7+4MHemxEb28MRMCs_7Y zgoD-K&+idnHLx*|U~6|Q`}HEhYG7&XMVKU(woMdR4gPVGXs{aCILSPhVk~=IW58Ms@s1_tcoB=KN1_{T{Sz-mC{1}Lp!A16r!tHD1`k_1+Rf1D&4 ztOox$NeWmEXl4pj7fL4VsKv}*sbDp_Opr06z}`FEm}=6%YK%A`YhX$l1hCAbrGwSr zA8*M3s{xI-fZ9@8&*x(~%OVr32LE_V7FZ4F93fEMG+9jq%UYUjuo_qxt~&X)9@Aer zU^Sq;1B$P>1L;`Cdvn2RKsQ){>=Myjj%EK&9#{=*4TID90xV-q`Cv7$H4M!nRjrui zSOHj#I<$Rgt0;?Q4QC-(4QLDmR#uJ}d^Sv4GC4C$gJi z*%wd(Rs*`l8`KA3ytWI=d_gH#4XEA$m75mf53#J7ECZ_nnFGp)llFYXvYxFRtY#C` z%~tDQVwuma0IN9<4WHAmB(d}>E5T~;haqSdo0$yc`~YSN)&DY7xwu&kk~1FHd*V<2HJ~&PO3&EWhBblJfWii(2K(BuX0RI2dK-{? znC_)vxo@-utOmb1tzb2veE}f5TJ3IOSrga>Rs))^1f_YcsfOP%^G-Wh4eYFsoexf9 zS+~;xRs*}|XyaV-y_n{7g4JAy?m5z%G6_pRw+pNWw4Vs%=Eq5KwV38~gVlh}7zf2E ztoGFT04 zop90v3oPTbQ^0Cq?peKRGL}7JQ^9IrZT{uwEU=6@OarR{o%I3o`}FURv8=0{4psvi zhXkpSKlK938rKbIXW+~Ps{!RNkU5^c@3G8(%>t_d?KuL)JOAouSjN6) zgVlh>NkHac-=i@HtOhin08*2*=?0d0qPbu-u(9q>+I3jQ6Xt={fKH$Vjny75`h+D; z=Y!Q`FhR~DsFlsYvabzvQ#LarC>?_QmA`f)mU3(%*c?#(4{|g1b;66lYGC)ar(H@5_In4RvoFZw&r87OfZ9Kxbe8!1I+p#6OTlU;L+2}fwyw^^%*)Hb zYMK}s7(nU%|FMl&_DL-Vs{!?eL4IGscnZrL{R*%eP+JV-_x!!ASmp;;g4KY^Opuxj z;jgf?kye4#fX)d7)w$v~zhId+Ukz3RYO90X6aH^Cma&vIU^SpSZ9!_xJ~UxT8*9O8 zU~XPDZ#I@T$vUtaSe%~o4Z4Yq^Tz{bqg_pHa#KHLFT1FCO9=0x=w zV<``Jg4MvrAs;O|g=H-3tvy%($objCO+P7P9Yu&mYJ2UY_s$1ZQWj%6Rvey|!?8^BH72TQ&<09FH9 z*8}pGEQ<}6`&sELaUMFJvE3_40dI&Nn^> zRwK&^xyL7N7egqfIp@J@3ZeBy=AET(m})M7)qu{|0_8D&yIm2OYA%A+fa-2g+UT0_ zz64XvC9oP$Uk4P_zxKFc*|UEctOl0m8Sh-ca$dm|uo^RHT-4uD!m_94Dp(C@z5tXq z*qZyX^g*tH)qvIjgVMafF~3=uZoUpy0~D0zD7YVxQn3)kahIV<=ek^U{n_zQ5 z_JI73eGKguSd9Y{0|Tg?^hN74mbsGKU^NpNA!|wvM1-)+d)@)70hs~vJN9*YcOhz^ z{oEIPtFe@0_rPlKkA2+-tLcXJ2lw79!BSs50IO+*+9mrIbixtHWyo!khhR0Jv*kha zgVr8XusP>PEa#lO0;_QYSp>S9 zTf-4cJK;504d}jlPz-#oJcec8=o_#aSUW-e(IqTx+P7depmU}{)=l5~7|Z_UcVIQJ zwuHs|RanMX--Fe_&f>mU`v=SUQ6Io+Kx0H8H#^4955+7qKZ4c3_NWS9w0wc7<`Y;A zXzc;W&F}wT#@mvIumK>N{U7 z`**&9)qv_ikTN|dZ7lKi9jpel9ss1SVE0KZ<7_{`YCvspkU4b>tFWAJ{1dDO)LsLr ziP3P$!VI5ZU^V(61)#lBn}o2m6Mlo$fc7|p()90}pRn|W|A5uN%DPjDbFl2A{|iNA4U{EPQ z?qJ5UcbkzNv_@zjR83ECJeIq?n80d4`|LnLq^uHxrA^BWRs&kE1yZ9}-i~F?mj$dQ zk{wdcs}%ZTnLB0$s{ysKLFTl_c4Ju|&PIe9b|TbpfYpH703f@Lb#iUQOdFh7)PQ0R zIh?tOP{R#Y0~*f++12t*5KDUI!J-D;E?y$k@PXC9;^NMca4h>K__3%#w+l3`&&-Hw z4!RmausNXfpF#d=tyILaKSc=R~S0OjWw z(uc5&KZ}9Y?BHNv0IfgJHM4(-Sr3YX)u5V#?q&(F8c_WXDx>D?Z^N>0LK2G_baSML zP$Nx*8X2$}(7CdpvB8T>3*<4=vn&=h=RbGW4XIr1B)7T zziSeqMhmQF9n`MN=NDtCm$k8|LAMKZD>pMEsyXOtbiwAp^84$e#aPbm(Ziw!-5h-) z)EI!(fa(HJl---dfn~3vAr>|0b{T=yc!CUJU|@*VK8xjSC}XgiNzk=n91;Oo_RyJt z)qvK)f`VGsO9{(fPE)WN&^;O;HI5w2SlT~kU^TG4T~YsRu=LT)QPj-%ZHDEJCkwC| zQ27ihe^ywuJ7Jb%mS8oo_D}!Sax86ZD-<>U#ow{a4_c$B;aQ)KrCzoHs{yS|1^NBZ z&B<8WQMO<;u<_>$8!ND^$*}{g0kwNU=B(IjgXP>Xd$1bNo=1=xyJ`t6b~%96m_pk& z>*I^DjO{pr)r2rX_7_aeGQhG|$O)`w1IQu<28Lbs@35R@>I_x`9?N84V5q+N7fZam zfYpHdG9aTk-j-wOH?SI5yVu&H2TMEC9jpd4_6|z++G)?Q zv{yaAYVhA@=ZQrPdj9evLX9^OYJ9+IK=BT8^C7GBT+I5*7pw+$P7c@9jac@d`e9Ln z?q+`?)C3TrCJ?L!G;a=yGUo;Ju$)C1ghdUydxD8j6GDWVP_UXVCdhuGJD)dUX^(|r zQG@QDa3a)15TORt+Gl2rhVHWy_8V=^gwkJ z_A^Xsz-nOo@dNH&$Fj$#7OV!;9|C3PQ;e6e%-z(1)xhfamnT2TW47z+!D?e7gQ^DIJ*`BjX(K{SJ6H{93?CHEvcc=I z?7Qi}q6XbPokXbVB0^0!SPf{b8IYooeWk38#~25Pc#Lr z2DaAv`K=3B&U>EbvNm#oJj~; zxr$iRj(tzWOt3kNpnZ@_Uru1Dn`VL4lrll?u6nY^7fYXdHdsv~)IA)X-?6OwngdpY zf1YSASPf{s1jz5$_rlBrtAVYjebsaXOT5nqtHHk)W&v0YXv`ecKTUi%1moU6YS ztOnL^`fIZQ%N)=$uo}=jHptDt@AF_e8*@2W4anahyRgr3tN^R=h31_nhkc%6mh&sY zYC!viK_!9RvIXBU)vN-m0mUiEF7bV5f-%*s2CD&`;{h5QJXWN<7gNm|uo}=jB*>gy z|3Pb4K(->ck=BCM!1C!DwukR9%~=Ol13Lro@dj=z_1Ah7HBatjcww5e0jvg;#z5|Q z7XN-XW?OwDSPf_%1k@IdUKxqytny7@HPIkL7#JAtoxh6Zp4rV{HK4PULCQF7KjDnNN&#7bc^WCSwYC!jzfzppjmFFJJ z_&N<%qX*q@9wcXoWo+jRSPf{M6(~-5*5_dvuR9A?16ubEQllSLj^%Ezb6_=~wHY8a zs^(|0>~%d4Rs*_k6co-Kr$B37K`i9-d;zQmw08+46TfCNmbkbGRuc}b-&Y$~U|IKm z39JUxRtK#`TP5L)B`;qFs{x%82(qgzH3Z8U3s=BuvY_=v+__I!*7sfotLcHp*M2n{ zEbh4mRs$+mLF*KcKh(oAu6`Y?W*;=auZxzo$Bfe(U^SpSWI?rrd>A{Hb2x8;)yP2i z<8QUvj-`CQ1y)l4y<0&Hr<=qCW0j-S(x!HZy6D)g1?ts;RtYt`<8 z)qu_}28Hv+yX9EwlzU(`{wxd(pz{`Ee;Q(0AATRK1~g6!O7o`md|1}BKLD$Nm6Sr~ z|6o}M`w*-Kbiy;J-x#`*4NG0{2&@L?=C~VIu$0e_!D>M13*>j(C!LQl5yaTI|VPRkZwOQNup2so= z{T{3aRAz$aW+t3HhGjj#2e6vQ43IM)PW+mU#hi~|HLIZOJhz%LU|CE239JSd??0}d z!?Ks^Gg!?&CPO{eu341 z&PD*my{qXvEMvmI!D>M5XHXimZr_1rp6Cx)4d`4EP#+`ulrEO_Hh;ltZZSa4T{-;p zG?sO+|G;W4GeFMdIT+=N%Vkr+9 zIY8@wKzHka;^Xlxe=OxHXhk%LCEG%a+af8)>&IbV1l?zy> zU>OJC0jmL>u?cd|v#D`d#z}a=YC!9wLFT;jzK5kQ-~+3HooS%haR$rUcz&>&w~Uay zqwXw+Kmibe0 zuo@nyzc}Asz|xMA0INxcmc0{}rC>SNQ4*{M)K3A0;pJC>Sk4KQ0;>Vt1`g_n*oyAN za-WMdSPjgac|OKi%4Zp{8qmHHP`+4l{w$XB7-hj~VC@8tMZ#G20m*^YWJ1&Y$&#a3 z+Vk>YHCE8LF#fXyOWC3TR&$LRa$lsD<54Va5=F2YP&*40?}lnKu$---1Xcs{mvMU* zmNkmXU^SroB0=TPja#``(xD1i4Xoc3t(1qQ-=qpwgTI_t1FJdB2wBH?=29`1a$X&* z<|i}^Un*>e&VVA9&l+Gg!B92pR3ca~)3YX64QSp06h7G35^I6gfKFEf?Y}+h>4jzg zg*I4?95lZ#dSQuW4~q_14JZ$S#(+wrW@1@Wp$k?6YKMc|q||&J%e;dgSWOkQj@vwQ z6_&AOeXtr>o8V7MF*J^ z7Hl~M(;RECnlxxXcRsf#mi%P{Rs%cJTWO0BmUe}=bRR5azXM3kw7c!|Fx~6`Hpd!jS8gmDmbm~&uo_UDg3KvdS%#%h4`!VDg4OVXGAU@C)xB3(?m+hgs{!pr17*Xx z%}!YMfBA#efXWq+8poE1kC=WB0IPwGRc>ZFW`L zo6qTbnEna|s{!5B2I@CWZ!pHPW;+C|29yp#<|wXtj^!+!P_P`zzN}abX#khy$wur9n{I zXw9Db9y8wK!D>M908*3E_y)_K;smf7(0L#rH8Q{Cu(Y)j!D@Cx+mJiBw__O_OaiNc z%{w$5EW$GHnG99~+ds(4eSRILn^VAQlAwP7{Z$ytctR>z%_V4A_v`F$EaOpWU^Sq* zbx`QqHEzPPpC}!y2DHxw8?p4?Gr(#<_oIQ#;cdHvWqdvptOm4>8kC-|8~S0{ z|CI$+18X17VX?+Cwv!E30~%ukxhI9q5=)yl2doB^2SI9z)1tA|gSlWep!Lt7`ZTL_ zJ(l__53B}s9}p;gynn!n<&LL(uo}=^#-RMgW_U^yvrH%etCjiTn!)8AOePHRxqd|94_Wt~+miW(Co zXDs`q>cDDXeWFbgK3LLxJ&KyOrl1j0P>3U!bqy$Lwwb-aGG5mRRs-sHg8bg%WP#-@ zohGmvQ2GI>anV%6vYxFOtOl09idY)@CqbE%fq@~% ze=(NxpXY+rz|x`agl<#Ja&;b94J@3o=hOLMHL!IBKe~5e=~FKNtAV-aN{T9$JRD|U0B)@tHI`g?tlQ9Q_TO08#CV5fYrd(2|r}t zi{<>5wO}%Nea(z-mC_;h-?&+V%m<+}2jG8d#hP zy_dzZ?sOYi4a_}n{vW||2E}%;8dx|>Z}7l!wkl``D>EZ34?el!fu(-m2{s3|#-n{7 zXssc7eC-0O0rdw#{(ACuI+lCDcZ1cy%;`6A#uBG{z-nOTyh#W3!_n>93swUQAMZ7W zSk7nL2UY`GHwbbM_g^(EYXe(`OR3)VK@U;16u0{N;Pvuo3PyZau%!x)FuJBCqjD# zmUhcIuo_VR3)HqL&*#RHFV2J2fW}2ZVQ9rQ0n2)u3t%;{e2TrCzX(=?zns4WRs&1( z*vt9LU^TG(j=h|}f}#d{Ie!(b1~euN3ZKmfL$UPHu7TCyuM4h&)!?rSZh+N*dLAIV zme2Z&C7f@9)qwiuAT@?p)v)yAZh_T++yjaWu8HAT&T+jBRs#zk?Dfta6gAlEox3P% zu-7~HP}E?rckYAL;IDTcfYrd#5B7TJAy^Imdgl>X4J;30uXi4U)xgpi_Id|&&Nnk7 z%straou^=PVBw6t-gyRAgTLN+4psxJFR<4;FTiSG^#%5N=OtJT%pC0X&MUAQm^s+% zo!4MBpm8=(I%Mf`!E&a`8?YK!-}Cz;Wh`~vTd*2fIAgEB-htKNufN`d)qwVrgUY&P z`aiLZ(|!P}!C!xU1glvA@)QFD!`h8pSo+JKz-mBu(Snq<|F((7Z2Nr%t2qr_gLfe| z6HEX73s}uo=$K4RR6UkH^;fVO*t{^0t5pT2UEjcJVB@P^-{r83M|}sYfz6}++GCI9 z4DBCaHT@t@F)%R1tF@V6+VvBx29%yb;T&!ih2?&SUnpwce&2=V4#(eMHK29opz*p+ zZ9^>e=^wBf&^Q3dNsgZ~izo8GyT9JQXHL!VV({e*B=komrs{zd+ zg3NJOkj8Re0Rtxk12ZE`jn*O$EN7H4qNuTXa1%@VVM0;!C-noC{rJpaHK4V1Aompc z%VRk|iUq6&7GH(aow2MXW(BK(r42u$B38^eWdp0xVuzej-*aacmh&pv!D?WB4@~O9 za{dMfSPjfQHlKE389U_!t5JdWJv$$VGOjKIRs$zsvU9f%f+n!l#3SlayBU^TGt`Mu~Pmi6j7U^TF~SmJGhMU5_44a{GB z%+6TGF7&`^V0P_L?!&U~LLaPVB6MEH`oVH6<531+HK4X1s9)g2I|0kSNJFq1&>lKa z-Z9*7hGmQqbW;g4BW(Wk-I=G?G3Q2&!REmFI|p<>U}*!GfYrd(&Z$LkVY#c$6s!g` zUjTA*gorMdykiDd16nf)TBC5LBM8f0U~{k<&|VnOxEA&^hb_QrKyd+T+xWBc9K!S$ z=vG{2Mpzl1?Z?NDnJ=us=D_x(A966o(iXJ_s{x%03bO0^eFH3WQZ`^UpnL&Rb2V0U z38r1PU^TF|P07>$Sk4c(1FQK6O&jyoU9gNt*@M-%KKh774412vfj@dtOmb1K43MV zyN5t_%|9Q5Wu1dBSPdw@gVYFen`60K*$=EH3REC~_It`t!?HfyAFRd!swS3WJC=KR z1Hfuv>#-lj?Zq-z5(riU%BLWsmV7;oW$Y^mtOhi`0aCN2Q8IYQ_{vWZdPY4C8=>jQWU|_hk^aGYQNf=lSC{KWtS#JNi1rl?}b8X>Z zH9pY&AX{|~U|Ek80ao*b0WvQ7)?$IwIkf#_J7%nh!VTt#2uo}=>HIO;t`u$kSs0^^0xlnUXRqevE&n^?J1{4<{WfME) zv8|LY--6t8IY1Ii-#iDb1~xZ(Hog(d-nU$^8rb-1gjxrd zwqG7t4eX4vMyumk?s&=vs{y$g_cH-goG z>MxKQZ{9ap?yGGAs{x%A15&e3vJcBWN6lb0us&LFxI310?=4_8ptJ!hGk<5xPQ|P* zTES{S{dBg)~mOH)xhp4Ui{Mt%XmvWSPdvnL1QwL6^*g9{W^$H(+O6y8CvhW zFzm&$-@FT~26T=hXbifp)eK8H)(utz8#m^$h{j@04_FNsbiKM(uNjuP>|U@MSenOv z4_zNv4QRXtlrM}e)v)v{`@w2J?G2EcKU)@J*%vthtOk^xL2C9CrD7TPn+R3|+Uo&I z8*$qtu#87d0;>Vtg#?QCICWnvYuYD+)quv#LG2Q~-Jw{{!J7hB!@>&Lchgj9gQagZ z6|AP51=8*{c=;2{zP4##HG)uc7&x%)ADj+W6U)lL02&9;6g-5b{Fwn(1Ik~Z@Nw!s ziDf)tCRh!qE&%y`!rMDo&O4n2Rs)*@!hXKZY_J+oTOO1zu-_pv2doA(7YTAtkEjcl z^8x09)xgSdy~7+>?#rGBRs&m0EHPUbOFLmcSPiIO3G$czx_4O8&jPR-*j&Jro)=i| zL0AY@0}I366`WZ1e=P#5frX*ABpa6g;9{^EP&)yX4yRqH!P19a0#*asR|2Y=$|dcv z^sSbH)quTb|s{xH&fWpVt z`VE$|eb$22fZ7ruHS*zXD>2Pk2UY{?oJzQ&o+S7fcD~n zf_mfsdMxGqMz9(N=$Z-%nT1&L`zEj&SR3F$&o3BW2dW&WiRkfuo_Ug0V)%sW16w_iFSe2fcCzD)Vz{gk7X=wH&_j*i~_0gySE+7 z9Q_`!8c-etsd<`hjb(geFIY`H)XnR!`eAAN?E|X;)dQe#UXaa;W&UD6Sj{vQ28R8h zc~6ffEOqVyuo~E%$T^p4u=HgPg4KZH0%YIbm)uz92M>YOXfi?8(xmSCjb$9*Fjx(! z-2%$*CcT%i?29}CRucog!-&=3ES53GqhK|QnIL=r3%o91Imhf6SPkgBCQzQ2dMJfu zf5CCE8c_QX6oyhC^|0J+dIGElc4qa_%iplfO`HU)fz<`sGE!LPiB5slfW}Ti@vgIc z{VU9N-D$9z0B9SVY2HIDW2a}pYCz}qfWmN!S~HeC;Ag>VK<5#G${&+pUo7pzb6_=~ zx(Vd>idAt~=1R_k)xhS~&CGkSwD~W9)f|Mn*?7AFmVLe#!D?lXD+$@A4_}e23QR!e}UTAwbJca_6y$xs{!rV2buGv zDHKaOyaiU%zzn(5jqgi7mc78Y!D<4b;j`@E2Q2e(cfe|Rq3!2wm!@Dz&v(IUK>c@6 zTFw2Jhh=W!9#{=5U(64~+E$Q!5#sEx(Mkd|MNnimgib%1oGCFkT9gSJ9~3+OHVBUo%;Y5fQS^O zCW1yVkwl79Q$c&7kwi*Tb3mhbNFwD$nI$MDgXF%UxCbP{2kNLXFfhF01i1$!A^{aS z2N%(SikyIpI73BF!bKvWB8TB3nNX4QaFI5s$SJtULa4|MxX3Q3$Wge+ZK%j`xX4$i z$Pu`R04Vt~Ffbg0i)cbcuERwfpd#1cB9Ty$D{zrKsK`~gNHoP~=7LPgHNMRK4b7vUmPp&}RHBAcKhm*FC} zp(2;yB0r!aS#S|%=rX`;xQHlJM4b(mHngB38gLOasE9sX#04s%2N#KjiWtI0Dxf0T zaFG_Mh%Q`YB2+{NE;0`)62S;_&ladiG+g8iR3r{A@&YOn3m5qg70HB)aDa*d1_p)< zxQHZFBpfcH4;4v=i}*lAV&Ec4P!UJCo6DdgesGa4sE9LMWC2vf4KA_^D&h(kISv)^ zhKpQ-ig>|Ao4k{847hwlYm@qIf#KA>` zp(2@Z5k;s-I$T5_DiR47ae|7Z!9`-ABC&9he5lAtR#-Z0hKgK;i%f@#oQ8|6g^HYm ziyViFoP~>Afr?y)i#&#kT!M>yf{I*(i|~R5(ij*R&cHn%uV zF0v3RQUVv*02L{Qi=2jvt%D=paWmTtopXQUw>$fr>Q4MXaDA zjc^eUs7M1`Bnc`~2^T4aid=`M@NTHc4Yci}^*h$&p;H&ny|E+PpUdSqZ=Fo%n1K}D?LBDPQwE4WAi zRKyZ4k`EOzgNw97MfSo|_DTuA1>kw71_oFi?1lC$S$}@22|t(T%-ajas)0i1uAkJF0vFVvJ)<{4JvXB zE^-_yvI8!111fS9F7g^GvK=n+4=OSP?h6s<^3Pdt5gn+=T)2n_RAdfZBpfQT6fTkh z6`2PYX@!a`gp168iY$hUtbvLwfs34gip++KJb{XQho^*JP?2A75l-m9%x}1e8dT&D zT*MM8@&hj70~PrT7m0(4{Dg}XKt;;o?rDXJRKZ0iLq)3LBI}_dm2i<0P>~wA$StTy zEnMV1RHOnf!VMY#V_;z5hPO`jp&|lskx;0J7+jV>8ZP1m6%mAsUy;UZI^B7AU>-B1x(xX1&jh%j7)6*Q>8z`!5_ z7cqc}2*E|7p(1i{kp`%U2wY?-R746cauO;c4i|X?75Tye%ggN0snqT!V^e!9_knMVR0se9(b>4Y-IFRD=O8;szDb zgo~s>MHt~CZBP+)xX3c7$bY!MjzL9~;A-wcMZUw;e1nRp!qrF^fO`5248P!Nte_$) za5Xtlk)Loi^PnQya5cN2A}nx`YfuqoxX5Ry$Pc(V0-#Ak1_lN_xEdX(2nSrm11iD> z7paDd@WM-^*-#MyxX50ph$vj-F;qkZF7gK|q5>BY2TcGnFfd5MMeLv=ig1x=sE9IL zqz)<~2p3rb6%m4qoQ8@B!$tl4UdLA45eZ!A00W*DNqFFieAs=t4!N!bRMnB6Hy)$xxB$a1qdX z6d-?0hKp>2s+j^8c?1$ibTRi9zjLQ;Ub@*B6)BTR?ze#0|P@5Ttply zk_8vhgo-G@MXaDAqHqx(sE7nyBn~Pf0~aZPim<>%>Y*as@VJ-*71;_G*$x$X2X8f9 zfQqbxr|{QMk&SQ>R?spE1_p*ra1kY_$ZEKV8B}BqTqG1KvJWnj3l-S|7ioox?1qcX zg^H|#iyVWBtc8obhKd}3i?Dzu06~2axQG%|gcI&}6Q~FmT*MP9Vh0yVfr@y-MJk{o zad447s7L@@WGz%A1TJz0DiQ`4c?%T@g^O_7fXW&MhH$uuI#k37F5(6iae#~DK}DS5 zBGaHEj&PCPP!Sin$OEWI6kOytRKyD|A_`sf7Yi4$fr@y*MUtT+k#LcIsE8|EWH(eK z0xoh5Dq;^8`3Mz>hKq25mPIo#Fu1`*6rmz9a1ke{h&x;)87krpkM|m=NB~@9I#k3T zF0utG;tLnK0TuCsi~NI%_`pTPK%0RW7#ITKA_h_9 z&Ot@&;3BV}B2I9T|4Wc-iiE&L@}VMbaFKqfNDy3PBUHo{ zE^-tq5(XE!4HdD4i+qBLIKV}u9U&>)5ia5a6|sklWI{#W!`n8UP>~OCk=0OnMV3QFKEXwvVAT*MJ7vK1~80u|W@7fFGN?1zh#LPhq#MS7qj zo8Te~p(2~%BHN)NJK!Q0pdvfrBCnw$+u$N>pe1z-3=G@hB63g>N4SUqRKx);VhP2MV#Rx2~ZIuxJWrv#0)Od3l%Yji!6nTn8QW(Kt){OA{U?{u5gj3P!T7%2m|ye z2ot!7Bvix{E@BK7v4e{QKt=4~BKc4e8@NaxRKyl8vI;6<1sB;56|sbiT!V^O!$m$o zMcm*bT%fIE3=9k^@YaP4R74dnVgMEKg!lE_pdwlDG#>yJ>4BFLQBaYCV7qb?# zAye1W;3lU+)iAyfpd!I=k@rxMdbr7dp(2fN z5nfM7?NA37k%Njfz(w?-B291+Td0T(Jiel!B2sXXDyWDwTx1bcL=-M^7%CzT7kLI1 zk${V^gSMP9FffS0MYNzI@o=AdKt+<^BB0wOK|V``i}XO%q`*ZMLq*cyB72}Bv2c+q zP>}?<$ZM#`cX()ghl>1wi?Dfv>}Fv24HuDziu{F(SV2Yp!$l&YBLCnb*-#NCcp9sR ziZH@OCPGCR;3A8mB0u3Rv?EZF-*Az8P?3LdkzY`ezi<%|ABZphz(w?+B5&a$j!=;c z@YsofihP2LWI#n2;kv4zA`Ebm9;nDixUTt7kt=YKJy4N%aFNSUkwij>Gi-b{94hhzt|k{M@(eCg4;6U|7nuYVc?lO; z3Kijmo4ge&!VecY0u}iV*L4#r@(M2U7AnF3*To3B0F8lxfgLU)3l(_|*JTM6;ee}& zfQr0;t0{+yyn&0%gNn4mL-it5WCc8}K81=bhl~7!ioA!5i1fW4MR_^hkhbY_K{-7b@}uE)oD0 zIRm#n87guTE>aE^IRzK#hKihqi_C|LoPdjLhKd}4iyVWB$in^g5-K7E7vTjhfn;D{ zkcNvGLPccYBB4+bA-G5-RD=(1*JP*&H(X>LRD=gEauO=S3m16;6=8vk{D+E2!0plv zg2b{YTqFi6A_f=fhKh*8MRq|&MBpMXp(4U?5fRWfV$jW&aN8}RBJ6OHc&G>mT%;8$ z!U-2y4HaR7i(G_?u);+?Lq#OvwkwA~{3Qq%34n_5!A0tzBK&ZXHBb=&xX3N22rpcO z19aUh0|NsOT*MSA(g1Iz_&`PK;UdXUkz9Csu7rx@!PT@vMT+1elc6FxaFGR2k!rZe z8mLGeTx2Iyqy{c>6e>~+7r6)($%TvDg^J|EML;JSfkJTw+^5{oE0-6+MYN$J#c&ZP zs7NVXBoQi71s5rVigdw6I-nx`aFIDskqK~-O;C{rxX5v+NF!Y29#mu@T;u~(WG-BU z8*~9I0|Uc+xQGT+qyjGD3>7Jdi=;zED&ZpCP?0jY$ZDuaB3xu2R3rf|auzC*1Q)pn z714#4t6!ladT)aMHawC`k^Ar;UbHnA`9Un2cRO0;3D^-B8%Z7zn~&Z;Uc2Y!zz}+ zMU0>#OW-1YP?5v%{GJRIIRO``f{L7ii%f-zoP>)khKgK;i)@C9oQ8{>fr?y$i#&#k zT!xE$g^FB(i?BnlST}~(!sbws|8QRBB3G=;C^p}irj^ZEQ5+Xf{UDmirj~be20qsfs4q+fl@33!w_z`*bmF5(Fl`3)B-g^E0ei!6YOT!)KXg^EbQ zL*p-0L=rBd1l>|84Hxl*im1Uw3ZNniaFGR25oNf@C8&rfT!bkR57c?1}xQIGbWI9~L9V#*tE)oG1IRF>Qgo@09i!?(;=D|g#K}8n9MOH&a=D%KX2V7PLq+DoMZ_{7xqBg8L>DUJ4Q~xrrF5&0Mc>ot_fQmeXi%f-zJc5g?f{M(9*E@%yBD3Hk zSD_-a;UX`gB6Hv(f1x5aaFZpWTe)oEB6?5}JGh7|RKy-G5(5=E3Jfr}VHMO@(`!B7zwxJVgPBoi(&9V(Im7uf|BafXYWg^HxZ zMIJy!tl%Qwp(0Lj5kb%vPX-2tY`BObR3ry3VgMD%f{VC9Mcm*bQBaXIxJUt1#1<~n z1{JY`i!6qUSi(gPLq!7NB9EaWUT_g+(A8KB3=IBo5f!M2CtSo8DiQ=2Nrj4d!$n%5 zB7Sg@g-{U>xX50pNHARFE>y$^F7g*D5&##Gfga%J3m371ilo3rf}kSFaFKMV$T4_& zu7`@8fQx|ctO3plXi5MNUISKnK5ocGNO3+<}UGhO2o46)A&@Fn}&#WME(@ zgo{W*Mc%_jG@v3M;38&Fkxy`u7^uicxJV0BouA0u`x;i~NF$Jc5hxLbv%g!bKFIBG2F=E>MxvaFKMV$V0eD7gVGHF0vLXQVAD1 z2^A@Zi@bq~Jcf%fm4M=pfuRX5A^{b-1Q*eViWI>`+@K^94gWW z7YTui?1hUIKt&e7MS7qj%itm#p(5RIk!w(qZE%sVP?5QC5s_Mmd$z+x^r0g2;38g7 zkqvN>G^ogQxJVOJWF1^&9#mv1Tx1tiWIbHu7F1*!T;vy2WG!4ost)49DR2=hsK|1- zNDx${2QHEY64Az&go~_$imZf-Jb;Q!fQty#Lu_9I7qNhftcHsuKt+1tBJEI- zU2u`jP?4Q*k%v%`J#Y~o=!G`B;Ubn$ktJ}EV5rD^ut%CtE(KpvfnAuJ7@w05I>Zn(V+dXyk((G_kY5f_GnXA?7s#B#q7tx>1=wVeU4Ni< z`NK?3&MyWlVNimHDqAy1B?E&hlF5+4%6VXuL9zl+HELirAQ363NFaQiO${ot3@%~> z6$yol*h5A9;3D2okr22@1XSb;y#JL174e6w$$^Ua!bK{fA`0+Pkq)ScB3xu9RKyn+ z8sOuGK)#s_w`(0#&2qTOJD?(R@DMu%6Q z4BT*&#i1gca1nK=2p3$$94f*F7jcJ*u);;cp(5;XkzA+<2VA5XDzXBe=BGkMR>DP= zLq(L}xqClUL>Vq}4Jx7t7kL5|QGttmf{DPxSrBwUFK7=PT*Lq>q5&5PfQo3sMGBxI z`f!nMsE7evWEoUM2QG39Dxw7!c?K2HhKsO54@;JZix@*i6yPF>P!S`zNG()E9WF8# zDxwG%IRzClhKoFhiWtI0m^&aTK@BdV3>7hfi&#KKOyMHFP!V0YNFr234=z#)6_JID zbU{Vr;3D&(B1&+PT~HBaxX4wgNGE(0{XbO13!V$4L5I15N^E#3p$`>_f{S=VMIzuL z$xx9PxJV^bqz;}|`=BCCaFL}@kp{TPE~rQgT;w8DBp;sRoVr~s7Mgpr%q6jFt|u8R3ri}QU(33Kv-p6}b!-IRF*81Q)ps6*&zT z`3x1g2^SIT1BE05!!5XoIaK5fTqF@HauzPq0~NUq7g-1u*#vJ(?1PHjfUCI)6?q63 z`3@Di0~b*O9Z1Q*z#s|_LrbX0W4M|ysK{%$NHbLAIy@IFgNi(biyViFNWo3M2Nn4Q zH|H}{gd47g6MD(8AY4QaD)Ixa%MvOg3s>V06=8&nq(DVj;JRv{B46PyoCFn_2Nzij z6`2ngIRX{g4;Og_6*&kO5dd9o#=yYv0iM4UpdwS?A~sMFR=5kppd!EEEwoIi$Y;1n z2UO$(Tx1hee&!xJWouMee~xPC-Q;!bN^UMP9*0v}Qo; zx&;>rhl<>Ri!?(;?!rZuLq%@DMb1D)p20=lLq(+F{^FPkvFjT=d^DgUEO0fBP?67Y zH4#velW>s+s0c4y*LEx5>AsK{-&2=5$-d+xwRG@v4P;Ucb3 zk>_xc6sX8kxJW-#Rk+AY zsK^Vri0FKXU60`+7Elohcv=mFikyS1DTa!4!9~_VMLxh&?@_48eYnU&s0b5W!P>~jR_&7mDHp4~Ypdu^bBArl?sc?~vP?6VgyKX^6-oi!L7eZ`* z0~axdirj>YghNH1!$m5gA~Nt0n+O%@hO0RZ75M`9`$MP*A6(ZDsE7z$gl`eVJ@Rl7 zRj3FvT*MkG!Ui`v1S;|!ZhJOVC>YcW*h3*3b}p(20a`Rfu?k)@xH(x+ksol8cBlwDT-P$F$S=6aL8!=kxUT0= z5n;Fp%TkDY1mGe{P!U16hyzqa2rd!_72$`A)Ide5;iF+wp(1r~k!?_s8o0;}s7Nhb z~k6h!a$#4K5N173qYFltM*1;35;DB3*Ei6;P30xX2Nx zNDo}(0aT<9F7h2J(g+t323@Maz`)P|7tx1`G{HsOpdyBFku<1?0o?D^P!VCcnz>LB zA-KqXsE8n3*EOg}I9$yqs7M%Ggl`2TR3qRbs!$OhxH;xf5r4Rv5U7YBT%-^x5&#$J zgo*^iMV3KDg5V;Dp&}u0k=sxaFSy7LsE8+AM06#@&E9YkU8smAT*MD5q5&7lhl;4f z{nZK;;exAK0Ttndi=2jvaKLpvhKgjs)%=Hwq{Bs|S3z8u2^TSfip0Z3{GlRoaFHCS zNCI4>1uBvVw|yE^Bn7T!GgKrQE^+}Xk_s1j0Tqdci?FVSxG)MXq68I*fs0r{MRedI z(NGa>xJV6DL<{c1Nl+19xSFj{5gxe64X6k=T-OJvNF`hi&l-peE8rp;P?0LQh&@!K z04@>(70HK-R6<1x;UW{EA|-H4b{t!tI(56%l}|IRq8qhl@Ogitxd8{e_As!PQ8vgSb!; zE@BE5QHG27Kt;shBAHMTakxk$R746cG7l;u2^ZN76_JLET!xCs!9_kmMP%V3yz3z@ zl!uF`LPbR2{xXM(sKM1lKt)vHB9%}P6}YZ`s0ce;%_gV_8(icnRD>0->n&6y5?;qK zZ-BTk3N9iG6-j}MghNG=;UeWwkum$bGoT1*phFxX5#;$Q!uGf2c?{ zJmjT7*N1}6B!r7tKt&4SB4JRGa=1t?RHO+m(h3#11`mxzP>~7nG`0^aVhmSv7b>y` z?!rG%k(qE2u`Q5LoemcOUhuZ)PN;|{T;v*5#0M_& z87krp7vb3oaZd_-E!3KxloiX_2Ba-kv_ zaFGV6NFrRMA1Y!FpM6^b6|sPe?0|}x!9~tMMHay0^eI&2Gdv7gKo|Of?zDr8$U;S| z;JQqpBGzybFQ|wmTqG4Lq597zgq68P24i({ti|mGqNWev|Lq){lB8)pAwu`|aDtP?27^$OWj#M7YRTsK_k1h}Is6?X%$`(NK{Y zaFHIU$V|A%KB&kXxX62`h&sG~DhIlP40IkET*M73(ht|w1Qj_9kHKwF5ly(R8&DB5 zxCqxih?`B}A~sMFOSniARKx-~?G$a$!U z3)~map(3Gh5ynFh_pE@Ibz)GF#c*@%pdzc_B9Ty$HE@wKsK`>d$Rw!9I=IMMsK^$$ z$VsTk2Dr!*sK_R`$bYEFa=3`pVThYo!bS9;BCFvdE>MvraFIx;$Xd8aE>vVQTm*Ed zD#+~haFJH z71;+Dxd|0fhUP^D71;{6{Wer&2VCR>RAe4pgbj3M zE&~I@W4MScROB#R#1JZS6fWWc6*&$UiGzw9gNu|yMNYs)WE|L!wIS&_E2o<>u7ugOKxdIot02R3k7x@Aexds;z z09|&?z`$?=E@BQ9xd|7^go-?ci%fuuJb{aBhl)Idi`;{Xyo8HzorU=HIb6gHD)JgG zk^~ib1s9nB6?p*{*#{MQ0~dJ%6?q32kva#l>n&Ww11jZ>+*$o$Ig^H|#i_C$F zEQgD1hKj6%i=2XrtbmI=god$ULaXYPiU0sK_d~$PcKvAVUMN;8vHbX^b!bPq_MP|W8enUlO!$st;L)_d67jcD(w82F(p(5>Yk$$L12V7(; zRHOzjat$g{3m0L$0kNwNE}{n&sfUY1Lq*!)?fG=5NIP7l0xHr07wLwIbiqaDK}GuD zB5R-`J#dl3P?27^$Q`Ii3tZ$gRHPX$B776#i&nUZF;t`x-YfBeiZsDRQlTQ9aFHsg zNH<)h8!9pt9vUm5BGcd^7oj54;Ud4GA~WD3s<$96?1Hz)jG!Xja1j@%NDo{j0xHr6 z7s-K&OoWS6Lq+=GB9oya6W}6ip&}h{k)u$NcDTqhs7NPVg#9+e&8_h9Ohu?j8(hR1 zD$)xV351F?!TnwU6={Zx%!G=xz(tNgMOxt^@1Y_k@Y8;NLq$sAB0P5>E-ZtK$U{Xc z;37s)ks7#&15~66E)otEsfLRbKt+n+BJEI-Lb%9ss7Ntf)@% z{Dq3Rz(vIFL0sqo7tw->xWPr-p(5^Zku<1?9bBXtDq;&4SqT-fhl`wtia5dZ;47$z zD_n%}KEyrFa1l+Y$V9kLy`UnK;3B0^k;!n8MNp9`aFO#+krcSdSExuXT!ixh#P%Gx zh#XX;8ZKf16-k4O1VcqK;39cYku11KCsd>WF0uwH!UP|k+Xoe4hKpQ+iu{A8mM2gV zM!1?EP?7&|H3APIzF>f>(SnMk!)lRc*6E5-zD$);6hk}nGE}Q@t(S?f4hl@BtMHawC!l5Dy;UalZkwtKk zR;b8gxX3)H$P&27cBse~~W z5j&{JdALXjROAd?q#P<@3ZHA+4HYqhi~NL&n7~EMpFwQ*gNryqMRvl|Mi5kF2V5i( zDzY6ek^>dl1sADvDpMXuw5^p(2;zy5>Md zF2P0iK}GJsMczO~ZooyPUPJ7<2N&^#iu{F(R6#{P!9}(}Mc%_j-aGKumrP z7m0z2JcEnOf{HwaiyViFe20sCgNi(Xi)g=vnEVhf5(5?a2N&sqidexzY#mg@1}^dt zDq;^85qSqOSspIp2^Eoni&R5Jl;9#Opdu=8kvmWk3Al*Jdx**6a1k%4h#*{~1S%o~ z7nu(gk%NmIhKi`eMP5QhxZom!A0T#df=@mHu}z^O0&tONsE9SZWXpt#*uX_9p(2)W zkq)Sc6iHG++uR%o?z}0+)ifn<4aDN23lYwCyTtpcvvI{O^3l-T2 z7m0<6Y=?`~LPa*iMP@=pcECmUKt;B~MQ%eycEUw|LPa*gMZ`ZrT(}A@q6ZaO4Ht2R zifn+3#6d;Y!bPf~BJ1EH)1V?N;UYVsA}in`H=rWR;3BM_A?{fU7m)|5#P?0vc$aJVkCtPGTRHPd&asn#S0~dJ)6*&kOVg3SfVJ}=n8Y;3IE@BTA zIS)_0!BCMbxJWuwBne*c^g~5r;3Au#BC&9h+fb1RxCrN0h4%Dh!bR3VMZDo62caT?aFKgZkpQ^Jcc{n%xQO5n zh@02KMYN$JtKlN9P?0rok$9-cMz}~NRAfC|WHMA_16*V+RAe?>wvH&i!3M#S$E^-_yvJfuv1S+x!F2ed3;=;vn5jChtHC)6S zDpC&@se_6%z(ux0MY7={kD($ta1q{r5WB+QB5F{PEVzgVRAdiaBnv9?0WMMl6*&kO znFn&h6Dpzu7ZG5GxG)4RVhR=Mgo^|~MJB^VQlTP~;3B0^kzTk+H&mn_F0u$J(gzpW z2^A@ai(G_?biqYlK}B5PB1{|*HSp*fShl}iniWI^{?mSjbP!T=2NE}oo3ocR% z6{&%X%!G>A!bNUDMQq?Ag4__hqTnJHP?1QuNFY=s94?X#6^Ve0v_eIq;Ue>)BKB~R z8&DAkxQHMR#CAKlh&xoo8ZJ@>6-k4O%!i6N!bL7aMXcZ=f1o0%a1nW4h+SrI5f`Y4 zC0ryEDq;>7>4u6}z(rO=MKa+cm!Tp#aFH)i5hu8a03XEmTDXW7RKyD|k^mJkfs52Z zMJnMUv!Eg=aFJtB5pTH2AE-zJTttQ+VtXT8!~rT&1s6$&inPE*CP78&;37w%BBpQ= zCIN`a&2SM5s7MoBBo!*s3K!{ziWtL1)-;37AmBH3_}FHn(CxCp->#P%Y%h&EKj z6)xfe6$yijq(McB;Ub+-5jVKVN~lOOT;v>7Bmge*9x5^sF2X7VanA&}h%8iOE?mR` zDl!Kyk_r`>4HxNvip+V&Ni@P>}?< zNFh{Y0bFD*Pg^FB&i@b-5 zT!f3LOF&FM4;P7qikyXuOoWP@gNq!8ikyLqe20o0hl^NBLQFmZ7pa7b9D|E&hKlTk zi@bq~?1PIaOF_)p0~ZN_iX4WE^g%_Az(tNhMGnD5en3SIz(owCAtoP$i=;tC_QOS{ zK}B}KMQ%VvcEd#^WFY43go^}0MLgjmWl#|hxX3K1h&x$pe6kSt$iYQapdzwx5qqeJ5?mw(Dxv@vsep>e!$l@RMHJy8E1)9J;J!Eo z6?qC5c?A`D0vF+sgShZ9TtpKp@(3>C3KjVQ7fFPQe20rPKt;a5MW#VTUc*JULq)#9 zMNUIS-oQm3Kt;a7MgBlVKEp-idr*;gaFNeYk&kc@9tDV-U%*9Fp&}pPBGyom-*Ay|sK_t4 zNEuY*6j|yl|0qP!R^W$XTd}5M1OhRD=~SBA^6uAqQMU z87jgF7qNtjh{8pZp(0{%kuIo+2wY?(R74mqauh0}4i~u#6=8#me20o~!9@g>AueQx zi)cYbxZxtsP!SWjNCZ^G5H3;%6)}d3v_VBI;UX)bBBpSWTTl^mxCpZf#69A05ml&& z1zf}zD)J8=gVj(GM!1@JP!T4uNNQ10KJ-E-hNbZHkq$!Dtb@-^UV@73f{WaTitL1o zyn>4Cfs6csitL7q@Tfw3u>fwDI8I63P?0%skbuXHAslil9g_^trE@BH6=?Ciq zsqux19D=LKf{Gl3iU;-Mm2;CAIgMV7$TltV?f!PT@uMHa!;OofVUgNv+zifo399EFN(0gGgoq!z`S znt(jaup2A_V%~$Q*$Nl=3l-T37va)?_O{mCrxGsCB$R@Z*FjQndTvq~AWCmQM04g#I zF47JanFkk{3l*6Q7dZeGf!uc!AD^6&U0edarxdoY_9BX!pSaH@^&8Kr?`J<)-Eqr$XrTN$j7*_wZoov$ z%%CDiVIrmmP>~}TBFA7N#xOP4;UX{xU4w}j!A!ma7lEm{3KKCjfhxKM7lD<=H(?@{ zQ0Fk*hKZP(Lxt|ZL|_Ip+=Yq2U3eNMVhHp5S(pese9pi{U}`SHMBt%u0VZMuv+Od4 z$R(JFAuN2<*`Tpw0<%m5CSnBhm>x{T1m<@`n20enco?){BBn4AUAPF$937Yl-1Z1Y zsO`ouH^;$5EMVru!bHqrE=-4sz|C=ln+yvdKbQ#IWH*=y++hq?(u|) zz-wWDn20INt{|9*8B8P)CSnM4a~NC%7V=Rr5ttH&7?_ADET_c5M9g8KkqHwqGJ+bE z1`~mY#z|IasKQg!RhS4oG|s_9;GuCACISzQOE3|5Xk3Jez(eC2OavYpH(?_1(6|8; zfrrLjxCqn}3=d!;@X&Y!6M=`u6PO4*G~U8Qj0}w-S?(1~1n&17SZaa0ITt1ZPpbtm z5xAT4VIpuhm%v3}ZZ3m~n88v@1x&=y5Smr0U?T8*+6)shgk_!vxCku$T!+Oe+|4&& zBJgm&4HGdmgeHz#a1mG_-i3?6OrFRNO&jo(FbO6CFSVw^M9g62*c6xuEYUGchl#*b zoe9h?W0>uxFcG*p7BCTWSPD0XiNMQ4E0_q}%&CM z%%MUGFcD*zSJ_}9aJzV6{(=P%)ns8#K6D|YUzP9Qx@pnC72p;2{nNc zq6XX=1ZiTJ!-OOPcF#^^5wL3JV7feDB8IRgS{jB(EKCGm@<+l% z;C7Y6MPQMU2NQucR~fQkB8C=F7b?I-44|c^C``l@8iWiI7$Pz-5o4IqEHDvEn69m` zFth+iDgy(?pu?P{6dqLN_Aw)oq23;+L z5CJ(FbhQUu1YEy^4(&&XfZPl^+8QAOax>`QR)h%1&7gw{5h9>~1|7DB5CORvbZ`(t z1mtGW@frvbkefkU;1MDqH-k2KB1AxL25owRi-7BQ&;}5M2*}N#CC~^Fkefk^5)mRG zH-nb z9z_J?W_J`3kemHcL_ls1M-c(JIUYp>ooXiLj0f)00C{#iI0;z$BfLu5mMGYuaIhc@jfn2DGEMf%e6e%FvWeAF}g~)0Q zO$-?rRx=}+V+g7&7qg&<7&9;&M-?$)U@&JzQDe%$5P>XW4C@!bePIYrKnx5F0kF`3 zw-3W$BJgrG6fOetJE&I_4i^FW9VFre6M^?`9N;3L6b@433=@GhJQ*C}BA^fhsd0gc zz}*uC6M>iEu`m&ME7uoRKErMIfr-F8%3uc*F$cvd$Sxb02rPIQLSQ2BHk&I<1YQ?> zfVBqUA}?Vg@E+o8n1~rDMS<*k0T%(KOpwSIm|D+0?th!p^Y#RxZn4~L=0gbbA*Y2vJOZSg9A(i)&yWMf{DOG-V7!J4?|;^2waUh zOa$I;ae<4#Lf#c70&jUb!9?KxGJ%W0(vK-j1Rl24-_1esRe~%6?$v^7YLFUmnE-ATfNE-l2*`F&O$`?T z+YYL!5h9@61gfbKBB0y^s;LnopnL(UsSzTe2m{sB2oaDAK{Yi(1QZ&eni?Sj@+qjM zMu>n?Ca9)Hh=AM-s;S{3;GRMSGg4@PEN1{6*#uVuvWfw8_z7GDWEBHwBR^aOWEBHw zLoQqdWEBHwGay_9+_nL2nL&tv!Uwdh9U%e=AJD>1ga{~nKnunYA|NM%mcbxIK;Z+L zbVi7P91R*0M~HwNZO91mDL78SC5a`92*}Zn$RgmjjVFo-$jyN$A|N+MqKJUpoQNU< za&sn%2*}NaC?X&?SE7i3+}wyF0t)C(6cLb{CnAf0+cq;%L_ls{h#~@V^GXyEkefH6 zh=AO@6Ga5%=7T6AAUB^x5dpdRB8mve%{Ng*KyH4BECQ-38D64@fZY5MMFiyLpC}?A zH#0(WE;vrX{V!1c507^fkedZj)PUS9i6R1Wvm%NJ$jzYo9bpd0&7eLmTm)PiTO#WM zmxrJl51|I+W=|9~AU6l1h=9U55=8{$=0s!>aA};0ECMU$8G2y#7kmr^l%v3*0j^;~ z7#J8fvO>!`kW~!QP!X^ikW~!I$ReQNVbDev0R;~O$lV}wz`8)e!(ff91{6FD&d4J0 zay|>@La^OB;}yaF_^O zS1?QjoV!74>fz>qy~@DA&mN)6KEJ~Rj~#H~!oa}52p6${n!^AWf%)qvtQBVjv;H?s z1U};W4<-VS!3(g|VrXv8z+l71!0-vy6E_4!;T!5KQNzy(~lxl1Y$DC7oaf*kQ%UvAy^Ru1H)Zd7+SyvW!}R?EJ3~i#pzd=h%qeQ z#hKyby&we)3=B_UYCxS5u-HqOh#|}yoG@L6u+ZR#ix_}Q4hB$B1DU;rmr)!rHSiJg z7ci6IeULXW5pXPntX~dGhv1S;g@J+LJ**r9TMjD6Kq8RP0HqC3h`~j`BeyjS3=A7! zy1;Ew7pMqW7bs8}0+2;u9tG=yr~#!YknNvf=716lxD*A6fYpHA46+?A0w2YahxrTa z9+1BxVYw1qih@L*!txGWFQwuCkLG>=!c5p5LnR5z5&1skjeBKH)wguJ& z8{}g+0#gHbvozezFuP=6BH)%V$Sxt62skuABB1SLV3XnHA*hyxh``b+s3r!Bz-Nm2 zVCH~x0mvMFxCkgtK_UV$5xDKVFcCvo66b-7z{;Nn*t`QgRO?|Pu*nLBTv#}RQxwRq zYM2_hzw%)s@ElhRvkR`K6ea>Hv_Qr%RKY}yVM1MS5pV~Cfq|hPCSn2_sQ_u402eWU zdZPg*Vrl_Stqcr}FcCvojsuM{fJ4<7q^pFBfnhFe!~WFG)h#H6p zD0Zq@kVQa2HXlU<6c_5ONNT`s5)Wh%BTGvLh8|?w4MD@k>)DZX8G<^@=^Q8`mJAFV zQA9vSUqKZyWMByAMAl_)1UmU1NyHdd6Ty87pYxp$3o&@jSOF6;1JwnfkgtS^fX7Zj zB4scUc>V&l$-p57&nXFTHL#?R1QUT(dJMYoatvmd9!vzjKEVh>#279D(`A4mVh9s~ zRm%*fFcG-z6JeG5uEq`~0$1Yz7lDP(U6>2uBa@HdBCrs<4;O*? z;txy&R%|f*fQi6c4!>X`@R`tCFcEm0?IuhFuIn~T1fIfw!$iPk0?6~%VIsx`(9%W< z?k`Y12vQ@7AtDVEfwv*mU?PSV&P9VIoG*C}j|Vi@ zp$Zd$>tch6z-uBF3=wvi2)NG(at|v^1YSGv!$qK;U|@oYz-J5@VIuJQiy0;Y?>q3p zMBr{Vhl{{cizQqHW>-5bU%*pcA56pu7R^gwBJeibVwecH)dcd_A(#l!s%_lwVnhUt0^6M^e`2@`?qs)5-KcXKUF z1m3p-&CP(_3~rr*Y`+h)9j@yEOavaw4`CwUkrR-vM=%k%IWu9UgduqHhJk@$7EA=5 z3uePa;O5MMiNJjU>fJ$H2p#}pU|_I?*#*zJb}$jRIrcCSxH(7R;R7@07)%6i&T*Is z+?*3I5m>-8?1rZ(Sn0PPCIT~<;V?`DmYf+vVdlW|X*f*87*;?>!$jceCkiHF2y3?_ z!bM<6M>sE2ScO} zLu3I=1m5xtg_W!D6#fMkgRtV6!55|mUK%UFa}z9)fyQAWX%$rVfbe9PIdGBXFmu2o zoFFxzF>$aiaMN!B0|SE>Y<>q^N~9o*fHR6JR0OOG92gqNB49V`A&Y=*2WbVF4Aup9 zvK6u#aGBtMA_7WcZYUz4{N;lp0*bF76cLa;5hx;{7GoTW2uPO)0|P@8Cuqn8wtij? zDgt&PND~8S>;j|)ECTka7P1t_JKckV3c!*k3lty1?1g2}J~?19U-B1k63) zFl=OCU;v4LZ3o-cfh+>H3p8&9R|7VA8nPO2EYC#|0r`CiiU=sgKo@_*%>j>ifYzXa z`i z%b+y_aC1NggOVzP8f-KSE}{+-0gstaVqjqKhUG7Ce!s&A5dr%Gw9tTI1F{HsmK<~h zJzN*K6$d)V8X*Gm1?YHQxCnTT6?E7mTm)PZfyP%sA`rVkp$b}Y2NwaizD%LEgF^$H zzpPP2Kz4!V(LlPuYQQxtXr&551Qb4?S$%{E$gW^ybHFROKr?FyH6W8g?KQXvxco^) z)&=hGWFw1!$MisRZE#)S^(~-PA8--y+zqG=g%AO`X9lu4;Kt4pWDz6KYE00I*PF2M z7H~-m8ixakfc*|`fq-}*3=sik%ahCu3%z9Bwjr#W-j!0FsC~14Ao2L>JgShM=Lz6{sSX3=BFP$Z9}|-UmelRON%l zByPd{4sJt&*1Us6z$Sys`DP{t280MGRP&gTML?l35k&+P8WJqXYCxf3fg%DjI)I&l z;S9`naGMr1HV+a3+YTB=Vqj;6sDX%p^67UJ5l}jmWID`fNcj2k1_mUK^6h|3$)h(qzj@3}VDF{nu5 z;fCk}+inP&cSvK0h=5Ht1TA^t=0FiKWnl0}6)|G~w^`usF$9f^f>y61iC8c&7;+++ z18&9jFfcHHR*Zpd2RWHR3MvA&9pq#N1!NIWFf*tji-3Ze0W{|VG6$>+6wC~u)BqO& z*Lom@2oX^Fu|qZoTsMK{6cB1a;p~N?1{BVqSq6j}kfXy;)PNivgCYWQbP|dP$SoNt zA|OYD_SV5o2A8y;?RW?gkejQJb%FC~1F{IXi~?N~wjVYF1u_^s!wV7thYvV3Ks7!> z1Z1)&0|Ns>1mt&+PZ1&@zk^oAAVffZ2eo7nA|Stm_7oySKz`3bF&X4{(5^;=8juq~ z{(_5u{SInxAVfee1hqF1BA^%swKotVAUA{B8we4Qn?dajgb2vZp!Nnr1mxz`$Swr8 z-a!}H!_|O$0icW8*TH6vK$;jpJ^_hPAjMw%r&sRJxS| z$sA))Gvyv9iii;d!#yq(5n~31|EMA+3=B=&C~8a@7#1LlfJY`laR#d6!R0C_v4G1} zkOJhjIIIU_Ts{utj188kLTn(tv#L&XXz`(~0?YV#l+IJv} zfD!_DMJGrN*mh8qGJx8U2oX>^41nqas{xOBh9ZlA0+j*OhJ@<^w|hYi@qXBN6u74V z5;1^@fLop*5kZ&;ID9}NJ}?ou8g&d24wwjBS0YRV>@ScxT5u6i-T{el!$jb^%3vaJ zyL2%`_+TP%T_P|M@O(GOWEBh%R+tFPa)vaFK6NTw1e7j7<|M&Iz=?x_fguAX0yifS zCSn3=1Ay8#n_*=OSPiJ;0*Qd*%LLSNFkoR|0EvK89k~7M$^a38r~%pKi!1_ehle7I zn1F;rkj()Z%mCUX4>B2S4tV|vRD-}pOhCCQ2U!=m-_(h0GH3#mVIs1K2`E=~AnO9J zAO+P0aFfCFdYh4Tf%DF8WDyfkX|n>^9Pm^&Xm}Z6G+e|4w6OaQiY`!B zDg)VMP$Q0^62i)tG>Kb{|m8v9w?S_le-TOhCm1XqN;?1neGT(7FOeW~A^j0S%OZc3Z;LfJbSp zQPr3-Fu1TmbV1Ak#j-!L8e>pC1+6^*nFDsS38?7_nmGZ9fOUcEi?ztQOhDmWfo!q~ zC>I<=Rb#}!Fb7qQB?H54R5gYS3|mmtfQAddqN*`qV7P#+2Hdv-9UZ?7R*r#d8C?bj z29OBY7vL5(C>G%&;ITCP|*fjF%A*|n*$y*2VD^h7Xh!02kp{Ah=A$=P|1c60ku~_*AyZ|KqWuu zk~@S5D11Oyg>Hex1vs2RE3ZHzVB5jH0MM8xTm)RdgY1KgfCdj3K&Hb*zM6Vx(?i-1E6lzu=W;1C0k474yXFn~nBZU)yf zpo2F-B49P3i~^29kO)`}xJH|eq6<`^8Zbi4f#?GDQ$YLd5V}CI1L~C^L_lG<6~!D- z%H4q?0tziqZ3Wi_PGg{y02cveZiWR63=E)MSYX@1Eh|v_5F`S2GkCNR)Dwq`fXCuM z?L)W-I0ivIakvPm&|(0MtHVXW@ns9O3v4o|SOu@#L#P3Td@!;aa84;i76FI+9;gV| z&7gvfp%p3uHW^eLGJyJwaFaoWF+(@98gTyVLlyz&9Z(N?D@Mu$iGWRpr%bpAIMsnl z61WK1r=a+Ni-7A>(3k^U1e`J*85kJgBH$Db8gqb)fKw)@)dUv-=Rr^}8!iG4XV7>8 zTm+m}L1V%o5pei`LkzTv5+nll1vssOj)?||fYpF&BG8-*NCd0~oK`0zyAa$;0Uf>s zQUlQiN~@qH}vLe>Q?A=e^{fSM8v8&E_*B_yb=1vdvA7Y7&^7p{o z&`uJtUEurI}5pZ09@&#N3oOeL^ z0xklM3sAm*i-6+-lrP{S;J5(g3%Ce4E0weFJh%QiEfbs=G1Qe>Ed;u2$=WbBGK#0Kd1zZGN zVuM-*pq@6^E_jIz5&_!`U!3hD6N9j{DFyp$M8WSpJ5{4(ikKn4l@Vl z2?k}D2t4E!;3A;-0_jqMi5S9`lqn)apeC`vMBqM^hKayU7KMp`>lBd5TVO7P`*b@@ z#29AK7q|$h>;dWe1rq`H0ze{yFq7eN3Yt9vr%brWL%1&3niC$FE_fO{3{wNnl^~Ok z!bL#kGe`uqGaPI(T+K1K8dzMMzz{hJ7lD~`3Pa>9Oa$()b1)IO3ol}bT!4wdb)AQc z!0fsV7lFC(3Wms4m98icofr-G?JcEgVdq5yH zFJU6!aT}1xbC?KR&1(#iS1=K{t`{&7xUM%a5pXFAGWi`$1YD~5JPH#r15fQUFfi;uh=2@X zU|_fp69Lx+AVJV+K9H0N&6Esl;A&tI2I|#A)WAg6!PLMsF|3D)z?3j-hKayOIG1CH zEW;343KM~4W$?)hVB6s$t1#58go%JhAwd4xgdwsKLu3P71m@_Oa1qds43If4usDSk z*bFK#5qP|7z(hbpgCI=|su&__FcEmjTfs!YW8ENapb=GwPhsvc!%!oQAtD760k`Kt z=78qK!RCO+20uqf<;mEqvl7swmk z7$Q9|5qRy{2NwZlZ%}WvA2vS-jxNxeE|3V=r(mlhL3@Q@y1+RFbW#>v4S3FF7P1=f z=mE$*a5Zp$fkr36Cd2*J0W%rAh5@Eh9ugHFX&S z0|Pm+Y81ObYKmYY z;JzM6q!=awb`K~FL48YbdlhUKC=5X&VE4eo5Fr8zLr|L^E&^I)0Wz4u0VCBp!bITt z)CDF2FWEd`B8IR~b%Tk3$1_1jyTe4lZU%|i!9+mQ1t0+id$? z9!M8h1l+exWHTp-Y)|>p%5ejRs%K%H0qBK z0ht5ZIgJnj1^rh>h&d2lpr99HLKXo9y*Y{qDCi?lL_mHA?eK$}YymP^fCXX>IG=)R z5YRd`xEgS&{sY+@aGIBd`U~tH@Q8;MiU`OTpz{V1=78*~K~V$p#at8-kT3Qji$GRm zGBYrgpoAglv}2G6*miIjg7$(SL_oIBWrXO0r~%myTG5J71G4=-iW-pZ3{1$nKw$`4 zi;d6)3PaE-P^coH6r~GuA;>BQ&{}Jd2-tRzRp5D8xCq!P&}?>Dik3C zax>^^JcJ0y&7dLI^b=Hy=h(19I~vWD#(R0-gT@*9A^dA5heQ-25L!1mtGWX#ogbAUDf0A%zdP zeW-&h0zLtC0UHBD7A!@9Ppk!l1_lWx6cHl^2GD6gNV<#} z7(i#&A&HnUFjS-JGGzdtSc{~_jDcY149lIiaDkX485o#W(*AL zP((mp-GS^va2SHtKf_H1hoKlNlF8sUKWJ|pLJcSkK_@FBL_q1e5=9p%3>PAcfWr{9 zS_7^N+)nt3ti}-3?ABptV6cU!L(m8e=tN|Y2sFgZ85p9OAZnl@77PqEs3Mk-GY=5D zKt%v(WeAdpA!Mx|k_ad}F(aD{8WIAn@j$2nEfD~%ZUc#cV;Ss=cvd7`;MPtpiU=rI z&O;Fa<;wjiBA}84bXq^iWU#-$vmT%`gb*U2kXK?uwhI*U&d4H$7G_2aApr~wHt;Y6 zRaZ}#AR=Is4MBwq6Elj4Ap?Uls)!M!-3KxUs>_&xAr)1P2?IkLs)#8A18C$4NtYP| z!wD2M7G{PFCCDxW4_b4vA-M;3>c;$yU+xb5{x*JTxbFswhllQF=b!?&0WAs&p z2aTO>KozlMV7Q1P0?N6cP(=(G7=#6o%>gYfGC>tFW?%?K6)|C8C_@%8v@kVi_=4<0 z@VW7)g^)}(11-9Ji7H~kz`!MpqQ;bgK^s-XjDf)iRm7ZuAs1D|f`OqARm75kVLh^l zp@pd#gGeC6E^ujMXkci_@JSRR0?CyIhDHnmVyGg<42EbTCJaGnBBl(*Xd-3|Q_w`r z8MdN{STI~e5wS2eWiUZ@p(UuokdZ`kk0q$?wn7!LU|@(w6|rPss6i0{RTy(oMGP4j z_MwUxF)-Xm6#*5sQb@KNT9}$Jgdn@n(8$1mAw(Kkjgf&NLjszJ5ko$jh%rMQnurNQ zFPexc!yGgbGltb@BIXRc&_pa4PNIoeGTcBFF*IO!jwWKr@C{AGh=ElG#b1WT3?gVE zCJf4GBBl&RXd-3|j%Xt03;}2&77X!dB9;t!s3JxN47F$?h73JuB1R0e(L{_HR-uWQ zFziGVF=aS`CSt~L9ZkfX;Tf8U1;bY~5laRZS(FenHee7&6ES2^LJneo6$rp7!IL{STbBh6)`hlcz`Bi$nYLb#E9V^nusw2uRKbKnVB%ipoy3=Xrqak zF<7CAm@{~yiC8d1pomzQ8Zm?fLF|H*^G4<-4BJuE7@3!+%r}3j+o|1&HmCI>pGskU>?5fZ+$4h#>>JGD?UU8!?EXi5N4eqKTL=n4pQ6GB~4&m@x#QiI_7aqKQ~A6rhP% zGSs7rm>4khp@|qW%s~?|VpxqLVqt2)5E2aW7r2Zv0(Hr@s6s@*<%SXHIJQfuA{Gn` zpHW3D85l&=kadB&WTvPhh71g0s3M?~3{gdl85m|Dix^s%STdBLxDYhVcS{4=E>KV5 z2daoM1B0X{iW(CJ1}jt%QwD};R1q@EL@h!F#WBdUlo149z3hzSEjGpdLw1H%$j5ie}hbm&mz)+7YVrXGv!XOd?F$bKN4M9V|hb$l>;Jj=I8qj=zDq?29 zz-Wo0#>|jG2~EU^!5K}&m>~sC#Dt+0O~jO88H$L7i7|r-stXN_8Qxf<*lu9Lz-5Cf zV#=V6CSu0mgC=6mkc%c_!O({$V#%-`Rm9MM;R1??g^3YE2#O1hO)MBx?2z4KY+}iv zgDPTbz+i?ZV#wftCSt_kg(hOm5P~LR!VrfhV#<(#CSt}=geGFnP=h97!O(^#V#zQ8 zRm9AIVHTQ*A;S_h5hI3mXd=c8JJ3W-7!IL{m@=F}6ES1Bh9+Xp@BmH3g5edKh$X`p zR1tFnhJR=xh726`D6wO1#2|zwV$2|eCSt;%h9+XlV1OoK#$bgeV$R@#CSt+hhbCgl z5P>3MVPeQ|1vN!km@*tdQ3E>GtVoka8Y0v>l2j zV!{xQCSuBvi6&ykP>d#G&QOacV!_akCSu7j5mm(4fMGV8h#|vLG!Y|)^=Kl-3_H<8 zOc)NMiI_5+MH4Y&xQ-@b&hQXT#Dd{9nusOCS5y%b1BU--B8Ci{PAH*jV#FYfCSuGW zizZ^ippGVD%3z2lV#Z*NCSuOuiY8*g;EyI^$qr!7u?$#FAkas)&UF!xA(RLxy!|B1Q~5&_s+G4xx#dFq}aXF=e=hCSu0$ z08PZ4;T4*Q1;ZCK5le=@s3MjI4D2q*acW^~!4MJ#5rLFZW(I}~PHqqpNEu~jV8oDy zCSuIcizZ^iumw%Tl;Jj-h#7-`JF>~3&VvJ*h$%xUs)(^ULkWrtO-;-getIICV+tBg z^+FY~U~oYbv1G_b6)`nnn1mu?VP?*75>3Q{;SZXKC4-$evRxL&W(-qMTxe!$%Fy70 ztj5gLjG+fj#GGL^nurC%Dl`#GhMlM)W(Eu=&_oOwuA_+97hweV7P`RV#)9nRm8%8;R~9GAp^4?N{Cq)F$kfF7&9oMiI^}L zpoy3=*rSPneE@&ba41Q=LmJAW7B8CPGNoXR53^`~bMhs1i#K?f*7@CM7!v!=EBZgaOBE}3)kVPy(V;~aN3=H=0 zbt#|?7@!?>AQ4D>fi@X}_K+com@qJab^#)Zm@QdyGK4 zE!0p&%orHlQANxd7&1^rEEpI%QAI2n7*?T(fHr%aMint+V0eQpVrgK?z%T>Zh2V3R zganaX2tL8d09C|-fguo8#FBxb2t@>B`(#uR&{;aDB1Q}hS5ZZb85q7Hi&%no^z1-( zp)u&pB3%(A7aD^uwDU$4F=k-MK@~A!VCY2^F=b#_hbm&mz;GT_#GHZQ1FDDx1B0L_ zlI@nD`_XP7yU-MLX}z~Nk{VOcss5R$BBl%sU8o{v3=FGLMa&r(&Y+4|FfhDD6|rPs z;FCbI%M6s`^pQm@L1!QRKye{x1AMj=k}gxwhM7(j5zvO2Rj49{3=F4HMT{62-k^#Y zGcfQ^&x1+oi46+VNG3X)xBpjZw-6)|OC zC`T1BV_=wvDq_ySa1>PpG*5&oV#&auqKagfC1{gR2(pL;sPK(IcA+`wriM5*WL=;W z$tI|yh!`?3Y}P;#F<@XgtBEWEN*njIP(&;k7@ldPh?p}lJk>!FF=Jr3t&1XJ%D`|! z4@Ja;fnkk4iij}-L%RWrh!F!rq#=rkAp?Vw5sHWb1H&T}5zso%na0R!K!-=To1lo8 zGcdeC6)|IA=rBc5W6HoFZH6LZ!oaW;Rm7NqLCqXRjS&OGJX8@w1_oXW6g37648^l7*s5gb%E9m=A(+3F)(aI6)|OCc#bM!!oVP6g<_5|1A_&sh!F!rFp3B$ zSH@^DFn~^F1?Ngb(CRhN?sJd`I9GzEN*K6VA!?u^pp(E+L_n+8d{IRV85ltKwIa*` zEffarJw*~RhTO!6Bx1tAa1q%YaIUODaUrOz6XZa452$?BM-?$)UzMa&r(8c{_o z7#J3zidZr*97YiV&8$5^6)|LBVC6xw-2&8%+k@;v@ZC&Cd`N1HKqYMes)!*2Lm{e& z5d*^{R1sqahRvuVCJYQ$P(@4`7`~#4m@zPj@gv!80cv{QL3Sbd98O5erK*28KV#E;I&-q=_Ku zG6wmg1y#g?fnh1Ch$REVF=P?YFh9d{R1rf41`bgqlfh>jYNCo5Gcb4|i&%h;Ymw20 z=mO_uQ&7Cuh(kocIoA|agUmt}0k^Rm%(l zvPkBDJj$SoEMfs_<@O-kZVuYkds!YympQ1l^AA1cB}r28n>nRYOpl4YZ35NyGxO ziw#M{60(a8Ap%+v1lq-hBw`5J#fBte#K3T#31U0ME>OIK&ca8i0j<)BKz1Q`mlo*W zSGXEb2*UFaqC~1UCn~+Z1$5140C}J?A3>fZPl^!2qrXT&K7ps{x;G5sD%La&rob2*}N#yQvZ8fZW`K zq6XyVi6|lP#1)u2w4p{7gVB%fWoH^wBZOU`IAvf#3PaHHRR&HJ5s;gOP((m(2AvB9 zHwUzQ6?{$=LIf12pp%&pA|N+|&X+=nfZS}4Y%=(?4G$C%kedThL_ltiLJI7?7O zK(-%25dql_+J6ey1dnsp2+C?cQ`1Dy_n&;<&y6l67qpms|G8^j!Nng?x6 zWY~_Z2E3E>3W^BG7hh0BKw${Fg#m6C_)H!X7Kq7UpMowqVF2Bp09ON!_Y!0^7N9T$ zoxTHC1Kw$Sg_VH;l2*}N?C?X&?FGUdn zh5S(z5m3lKMHT^vJS#JjU520*8t4{EkbA%`1n0O=WHsiXxB!(TAT?kYg72`NgrWwN z<3Q)YA=H3;0XjJkAp-IR=x#5B2*?+p{Dlw!`ND_=$%V$C)x0iT3=GMzbZ87JZd8y( zz_lmn{2!1SunR#$Ukso-0pTLxb6{>ULCgWG0oNB9EXX3D5Ch%D4A%u3{$be1fusgp zih^!Kg{uKAKxUBUL{eh{noAPoVPJR!KN|{kjVl`)1H%)rh+aiXVo4(CWGDuP*Py!~ z8ATu*hLf_Am9IEip}d!xj9?a64TD|*Lf0FxE*|hHWDE?8R_fhC==u%S1y;j=Y}Z?` zE)KAn3=G*j4$B^f+r^^=u?wsQ#jbZ?T`;@m)osf_=u(C10;@r>>pfT(%&x^NZhkoh zx62l)3#N`UGDt3k2rBUqOV0|V#)5r!Vif6h1Hb~QnDfz_bc z^$DyCX4h{o12crK#ZX;fH7Is{hU)?aqro1QKS$wq9fs-xt3k2r3tSg70|P^Qd2td# z*BhuVuo@J*K>NU%!D$1eOQB4r1EEVq8xmh&H7Is{L$T|Twb3zzE<30$uo@J*zJqm1 zKvUEjJ+|2hT^UeaU^OUq{Q&ENg<*=xQX7P>Nl;y2H7Iud1nUB&d62&xcPls|bnSua z0;@r>>lauT%&vROobMoXJ%j23t3k2rH&~Yd)L$Lw?);e8~JMLRULf7g!C7 zUH`$lKxrNnhU-hSULbU>gz5sTL9vU0i-Cce5oXucC7;<4y3Rs%fz_bc#R%2~v&(66 ziWx%JN2o5a8Wg*jz`9^|ab7!)WS1!D&>jW`2Cy0wyO`m+Kw;=q^(OfkJPa+Ny1;5s z>|%lI0)@uB5GQVgt|+K3uo@J*Si!pB{(3CWhR{_7)dg0AViy}&7tCKBy)qvVy5>N2 zfz_bc#SYd5vui!8;0=VXeNbIsH7Is*fOWy_IyToJ2BGT#R2Ntcid~#wT_C$a>ASZ6 zf6R4w7&7UB#26UBYEbOr0_%d=HSzzwT7)h|s4lP?6uY>=x#)!?XrjJ z0;@r>iwCR=W|!kH&&dc~2~b^NH7IuRf_1^ljSE{}lp}OCKy`uDpxDI+)&;ZcWIX$M zgsw$UU0^jRcJYIC!R%Vm+B^rL>j+dASPhC@0$^P*yO=}@-y(E9gX#jSL9t5^tP50b zfKspO)_^jEE)IQAxH2$+)u7lV1l9$!>%puWObA_CP+ed(D0T^hb;0~4Wgf+g(B%Ww z1y+M%mk3xF%&y3Yb3zDRc~D(oH7It8f_1_CwN^k*3!!TQR2Ntcid~?yP7r0(-G3IM z2wj_?y1;5s>=Fmt1v(uR6kZ*1E#g<;>F^3v7g!C7T@qkjFn_u3|K5qv^%1HItOms{ zNw6+h{%YcRrhgS~7cc0#83qOhuo@J*q`bs5w2wf|oy1;5s?2-rTLT(@4hTC-jstc?J#V!S~E|^^rpL=E^blrpM z0;@r>OA)LK6o#O*u`GtIHxjLGkpxl*9PQ&dI zGzO(j1_rPi6ub1`x8LN91q00oS3#R)b=f0azEz zUq=MKE=B07g6aaRL9xpatP5t>!joGx5xV9tgJPEnSQpH$4Spy0AaseEKtdj@2E{H@ur5$u2HCZ8 z-MZ*AaJ!tLy1;5s>@oxEg4xwGGmsCVD-Eg(tOms{bFeO$zi!G!=3a!`)dAH7R)b=f z1y~o%uD6HgY9e&)gz5sTL9xpctPA8XP>Q^k~O^bkUq zv?(ME!D>+KvIgsd0;@r>%MPpyX4izHJF*eFu0eHy)u7mA57q^0Z-Bz^+~zq85xRas zb%E8O*yRA$1+z=ym*o?LE(J447=qQH*yRY;1@afjt{VOKmk_$#pt`_nQ0#I7>w?*( zxp#*xLRSt{7g!C7UCv-#uylAUUR>}pJPap6b%E8O*aaG)L)2ft3c?f+x(-8ifz_bc zw?+UGG}u!LRTkL7g!C7U7lcFurRC$xU=jMJPdb3b%E8O*yRP*1+xn@ z&W6zS0ICbD2E{IKur82YpfLOs{W%n&iv@I5B?AKkSPhC@K44uiyD~24Ng;G;L3M%E zpxEUL)&&d0qA3qAB6I~nb%E8O*yRV-1+(kpOS_v0U1d;RU^OUq`Ga+V>;mQG<&FMt z)!AUH@1lu`3X)3)Tj>XnB-h18&zw!e+g^#`g8tOmud5U?(oUG3)K$_QP8mXI_L zR)bljoQSPhC@$zWYDyH2r3{zm9}1=R&sgJM?-SQpH$B-M8f2wi;Eko*N! zgJM@ISQjY1Kw)@8oOOaWJPeJXy1;5s>`DXcg4xATC$j{h%MGdvtOmudbg(X1n~kOO z-z|bvU2CDbz-mzJ$^q+w*>%_^^)bS(Lr`5{H7IuFf^~u7 z3zT}_O!1aQ=(-No1y+M%R~}dw%r4KF)2<+Ny@Bcit3k0VAFK-$U!c^ZU|;~NL9wdH@1lv8xEI z3uf2GhrTihT@FxPU^OUq6@zub!f?JuLJUGz7*rQn4T@bQU|le~64$P1Lg>nY>H@1l zv8xoU3+Ar{2WP%U=xT!M0;@r>s|>6QX4i~uXS)%)W|3}7`VcGZA&!R)d;yZ0wTmn2jdSPhC@wP0N^ zyN+8|{6px{hw1{WL9we2tP5tBm#*I*gf3U8F0dLDyXwKZVEwP#t2;Rnx}u@Fz-mzJ zY5?nk+2vzZCxXyb2-O8vgJM@BSQjj9JkocSL+EOU>H@1lv8xHJ3uf1u$W&{DuDMWM zU^OUqHG_45!Vpxa^vqio8UecK0K{R~4AlizgJM?;SQpH$TkFpoAaq@X>H@1lv8xrV z3zQB)#&5}bCL0I0>m5`VSPhC@ZD3t6yUcTgBoVrV>>w!$tOmudcCap(zw*lT&c(v* zGKJ~_t3k1=1FQ>X*Nc~HA0c%4Ky`uDpxD(3)&;T)R34`4EIfnIl?2rVR)b65xOQpb%E8O*wq8p1+y#t?dk-Cu2oQ7U^OUq z^}=<5;!Drn+aw(xhKHcKz-mzJ>VxY7g$AfjLFjr8)dg0AVpl&{mj-m+-1e}14MG>U zJtUUFYEbN&0M-TbS4Z;Cg9u%QP+ed(D0WQ*>w@Lw5T>sa5W2#ly1;5s?3x7D1+&Yg zyqE={s}`yYtOmud$zWZu_)6(qSAo#A7^(}b2F0!^U|le~{5l`oB6OXC>H@1lv1=+= z7c2}#OaD0`bbW;C0;@r>YZ_P=%&wgq_!tqoBtX}$F)%QI)u7ll9jpuHFHpUV&}9$R z1y+M%*9@>Om|gzAj#eUcr9pLp)u7ll6RZoAzd-4*-8uP-BfS3Vh3W#UL9uHVSQpGL zo92R2gszoPU0^jRcFhLsLbl5fZr2g0F0dLDyXJs(!R(s4Dj6|3SPhC@bHTb` zc3rw$S?C70>o-&vSPhC@^T4`bc3pAM{DROW>j=pyU^OUq%?Im(mA%`fH}7$U+hqsU z1y+M%*8;FEm|ctChGZag1w(a#)u7n55UvXpU#e##RlVSLr9*Xr)u7n52(AlMZZyR> zuSDpogX#jSL9uHwTo=f$%9TwUJ>hmuf$9RQL9uHITo=eL&>ROs*LJ8buo@J*mV$Mu zK+C8sH(@J;uA5L@U^OUqEd%RcZ8w?*J?ng-gLYFI47g!C7T`R%5V0l?R&@Kz1D-)^+kYEbOj1lI*hQGC1k zm=U^GLUn=FpxCt;tP7M5L3Z_qdUOZD?K%e41y+M%*A}oYn7*EX;&m|e-Da<>q=bfCJxYEbOj4%P+o7brBg#qd@j zbooPdfz_bcwF9gRW*4iSqANmI5mXmg4T@bm!Mb2+W3AOIPlT?iP+ed(D0b}v>w?+! zZ?ASELe~zcF0dLDyLN+hf&2xEuZACDy@Bxfx((F@R)b>K98|qyI5Qy@dZ|cV%I*fE|^^mAuo<2bV);Xfz_bcwI8etmNr&5 zi#jL=;ls4Y%+h2#!l?c@ZR)b>K zA+Ro(UFPb)mmqXiLUn=FpxAX7tP2)jptemEJPap7b%E8O*mVS~3uc#P)0VpkU2CAa zz-mzJIttbWn|DZ7b#94)+jR`83#h;R1)A4G=n8=90;@r>>kL>I%r5BKIk+y63s0Dtd_w4&0M!LngJRctur62_ z`mX6WKU54rct3k2r z5?B|^t`nI(2NAknL3M%EpxAX8tP2)jQXlhG5xN-NAt?&12F0!`U|le~&M7VtKH@1lvFj>W7tAh|JIUS%UHVX6U^OUqT?6Za+4bD~?m2`mH>fVK8Wg*(gLQ%0HlVbj zu|K3M4W2e)p}N3oQ0%$^)&;Z6PyeJNLRURh7g!C7T{pqHKz4yr)Ji>}XoRi>P+ed( zD0bZf>w?+EuzQUtLf2uaF0dLDyKaMZ!NPFS(Rn`*x}HIGfz_bcbqA~qW*75@rbP%{ zTpo~E2CG4_>n>OqC>?^r5LEV_WQEQ7>OpmZ)u7mQ53CDjSMjv_N(fzEP+ed(D0bZk z>q55cD%`GAs4lP?6uTaPb;0Zc^(zs&8lk$tYEbNY2-XF&3)HVX2e)euR2Ntcid~Pu zx?pyJ`jrS>`=GkOYEbNY4AzC*uRII4>poN$SPhC@Pr$lhc7ghp2wh*Gy1;5s?0O2< z1&S|FyY~{@E)GvfEQ8gc*!2vq3zT|6{Yr!`d8jV18Wg*p!*zk|0`)5|!tFAJ>H@1l zvFim~7sxJ9zY?J<0;&tF2F0$IU|q2M1?pEKbX7rhfz_bc^$M&D7KWgHB|_Ics4lP? z6uVx7b%D|b$c3POB|_IBs4lP?6uaJlb;0Zc^(zs&oH@1lvFig^7tAhDzY?LV z45|yP2F0$AU|q2I0`)5qx@JLjfz_bc^$DyCW*4YmiO{tVstc?J#jej_U9d0&^(zs& z9zk`1)u7n*1*{8Z7pPx}(8UhAoSK1w0jvhauCH)ipfnH4U)SJiUI(fRtOmudZ*X0p z6b0&6B6N8{b%E8O*!3N(3zQB)c7ghpH{o`rLv?}GpxE^TtPAEZP`?tPs}rgVtOmud zpI}|Ez5}RViO{tQstc?J#jamqT`;>$IZN6Ry3Rs%fz_bc^&6}UbRDE;Fbuuo@J*{-M|v z_2TqGgsw=aF0dLDyZ(c9f&2xEFHpbo20XrMpt`_nQ0!vhM&ADg>Q^FkO@!(Kt3k1g z5v&X3FOXfJe&t=bT}z?5z-mzJVgl=eg(0Y4iO{tNstc?J#V%&BE?C+C^(zs&EjL=;lr}*9N`x*ZUr7B0R)b;}8(0_2uEN)> zS_oZIP+ed(D0Z=fb;05b)V6s54?`oUF0dLDyEwqQV0MA}l?YwFP+ed(D0Xpzbs_gF zAHnTPhw1{WL9vSqtP5rrs9%ZD)dJN8R)b;}H&_=a3_)oF)USL3w`&1Z7g!C7T|8i2 zFuOqgN`$U0P+ed(D0cCJb%DYV6knizB|_J6s4lP?6ubDqx?pyJ`jrS>cc8k!YEbOr z2kQd)3uG6lUy0E55vmKU2E{G`ur8QgpnfGn7n>g>MS<0z*d++p1qwq@zw#|S45gvE zz-mzJ5`yajxe(N^MCdYv>H@1lu}c`N3l@f;ekDSe8&nrq4T@bNU|leOf%=sQU9nJI zU^OUqiGp>(>;m;G5xPpCy1;5s>=Fa(g4qS?S0Z$ELv?}Gpx7l2)&+|%sgL=p2wjVy zy1;5s?2-WMg4qS?S0Z%ngz5sTL9t5`tP5rrs9%ZDbpfgitOms{DX=b>U7&s?Lf3Ps zF0dLDyQIOoKy4dP+F;O<4tfPo8~>oXz-mzJk^$?2*`*b4x)z~J!5@+i!D>+Kk_GDm z*#$~bXXD;&N9b~d>H@1lu}coD3uf2s2Z@OYU8zuAU^OUq$%A#l!tmJEBoTzJPN*)h z8Wg(}z`9^|1N2-7j73v03_tWYEbM_f$IW=JgCiv(4_{|1y+M%mnv8nD1U+M z`oUlDw*YRJGgKE?4T@cAU|p~<6hCu)Ekai+R2Ntcie2hpT_C$aE}XUBY9c~c8&nrq z4T@bFU|le~OoAr4BXq5V>H@1lu}c%I3)TkMvOhB(q3aA(7g!C7U0PsWFuPWo{^dgG zdJokFR)b=fHdq%d9p2b+^dCZ(P#`3}z-mzJ(gEv&*|ls}Y7s)0DO49&4T@d5U|le~ zeycTzAaq4Qb%E8O*rf;71+&X=fzeHbu4S)dg0AVwWLU7tF5z|B}}rbUlIU0;@r>%LuFsW|xG;iwJ}+_8>^e zgVmteWenDZJq)#=y1;5s>@orCg4q>t=r&SL@rCLFt3k2L6s!y6FHrshwXyTz`Kth` z3#;kp1OW=0Rgz5sTL9xpMtP5tBfA;3j z2wfYXy1;5s?6L&wg5|GmQ9^MDUB{rhz-mzJvI6UZ*~QKO$^xP59#j`t4T@dXU|k@8 zfy#}=jZeG~y1qemfz_bc1-h{Sv7d-_lG`tYF1}z$+5oFTvC9^07c9O&<$M`D4Ar2z zz-mzJvIFaa`3uy>M(A>c>H@1lu?uv5F*75qjs5YHkb4E(u4t$(uo@J*98m1~vel&> zp{oL_3#J9k+M)OJn+>5$Bm|P8z-mzJ@&N0C*>!ZT z=zD}NZKy7=8Wg)c!MZ^0C{P$axN@Sp0Um})b;0avQi|tA=t_a=0;@r> z%Nwi=Nna4oB$v3DpHwgJM@WSQp4&pwQS}E^`o}OAd69DFXuoSPhC@5nx>~yLMGS zoq^Eh4AlizgJM@CSQjiEg4$6CT^UeaU^OUqMS*p}?D{{=$^xOQ7pe=a2F0#uur83l zKxxDA&o{YS@c7yU)dg0AVpj}U7tAizd$BtZx=uoMfz_bc1-g}onGrO10}4Y~(OzqW zuKQ43U^OUq#i7`Bb;-?#2wmTyy1;5s?1~5Lf~Ac!six-;y7NfRzcgsyz3F0dLDyHdcqV0L{LJ=>4a)ehAKR)bPM4wb|~%)5d(L zF0dLDyVAhAV0MApYzSRDpt`_nQ0z(v>w?AC|M36!5V|fvb%E8O*p&g+1+(j`6%!Le z*DI(luo@J*GQqk){sN^#P@4^*izNb*Ho$67?8*Y`g4y-TrmO^^OAe|FtOmudY_Kj^ z{sNWr6WL*Nz7|kjU^OUq<$!g;?CN>$y9%Kz6silX2F0#ixGqq9fy((waJvejy1;5s z?8<}d0)+;soJZ)I0M!LngJM@cSQpG+y2kaBro!!72h{~ugJM?!SQpG+pmH9e>mpPa zSPhC@gs|>6Q zW|zvYfAbN#mP2)c)u7l_4%P+o7btCj`g&8~@pT%i3#;jb=2wi+pkoW?tL9weEtP7SlR0OYm zMCek5>H@1lv8x8G3uf2s2g?i)y6m93z-mzJss-x;`3sabK;;HPS2$D`SPhC@pqu9q zbxPkCD?x;=0;n#q8Wg+g!FIvo3si2Hz{}oFs4lP?6uTP0x?uh~-19FIp=%{n7g!C7 zU7&ktAT9*O7pUAYh1+!kstc?J#jYk4yFldzLf0#(F0dLDyPCneVE#HhNB5Zp+%E2D zNGyZZpxD&{)&=tysN6v4GKA^^t3k1=6|4(3M_*Lb5{u9k2Gs>tgJM@3SQpGL#VJ#h z5V~riy1;5s>}m(=0{IJ+Ha-F8Wg)GfOWy_+N-j&6rt-7R2Ntcid_@IxO0%qPu==ufK1y+M%*JQ9RSbTxXjlJ;s6tP%HEQ8gc z*fj;L3uYIn+(76ugX#jSL9uHpTo)+5K;_0hxLu)8U0^jRc1?rp0)+;s+(76mhw1{W zL9uH(SQpG+pmO6N+^!i=U0^jRcFh3mg82(nZXk5+gX#jSL9uHlSQjj9fXWSouE$Va zU^OUq%>wI!*##;$5W2YHAR!M{gJRcgur83lK%oIDHxRlEp}N3oQ0$rm)&;W*RBj-2 zML>0d)u7ll7px1G4ngGxLRURh7g!C7UGu=YV0MAZ4TP>`P+ed(D0YEvS4GT8fy#{o z@c23l)dg0AV%Gu`yFldzLf12>F0dLDyB30Vf&2wZhoExfFx;+xP+ed(D0YGFT7%Sj zppXZZ8wg#J@sRiet3k1AG1x9x+5nXs2wlcdU0^jRb}a$xf`uWd+(78^hw1{WL9uHo zSQp4&AQytl4TP?2s4lP?6uXvzb;0Zcl^Y0M?ND7{H7Is12kQc*Lr@rk%8hMIuzt#7 zs4lP?6uVY{b;0bKI$;V6Le~MPF0dLDyH>(=f$Rd68@u3k-GS-?t3k1A6jA{=7lx(uV2+t3k1A zEm#*Q3_&ie{c89Yq00}d3#$=k{4*DxzaBw#fz_bcwF#^X zX4m}-;x-6fY>AMN2dhD`Ycp6EEDVp7WR@XxX+m{@)u7n51*{8Zm(R>8M-aOFpt`_n zQ0&?Y)&;Zc>ShK>gsx(!F0dLDyS9OK!R*@oTdxSAYX(#oSPhC@+rhd(VF*ea3yKfd zB6RJA>H@1lv1YbRJ2%r0XqhgO6x_9RHigVmtewF|5Z zW>;0s+H@1lv1>nA7tAi-AF9g` zy4FE;fz_bc1-d~TQKxKEv|ESJbquNttOmudgJ8QrVF*ea*>hEHBXr$^>H@1lvFi|6 z7tCJ~eIL9Ky1qemfz_bc1-efZvW62BU!Zg6zQfzte94fs0ak-z*AW!ERKKjejnJh7 z)dg0AV%JfyE?C)XSl?m(8*Y~;R2Ntcie1ORx?uiFj6S1|(3J<(1y+M%*Kx2eP<(;> z1**Tw;puP^R2Ntcid`qbx?pyRKT|%3(6t__3#KDX=b>U0Dy=dJwwaLv?}GpxAX9tPA8XP};CkxMh#fC6oe*FR&UEyUu`h!R$(1 zv}7tmmpN1ySPhC@XTiE)>9CDE&=jF72C56J2F0#(U|le~Hm0>jH%#$gYUFEFxlX zyZ%CTfz_bcbqTBsX4g824}l0>`k;&I7#JA9Y8dp&@^ea(azKVNTn6jn0<#$yo*xx? z4bc@}mYfZ7FCgW|%gU|ld5%9P2nA#}Aub%E8O zxbPZS7aPPW3=QU)+oZvEA-fQ)21VC(6kV4N?DZAI&;?e5qU#2VE|6W47`nh}P;}iy z(Y2DH-ii-H7g!C7u3IR&Kz7Mu=mM)j(RCX|7sy}27`nh}P~z(jSQjk5K&8zW4p?h> zB{by0YEa_qE?5^Vz7F3In}^VK2C56J2F0#>a9yA%Q?!te;{v-7#Cr$T1y+M%*L}Dy zP`Lp*6$hb9JPlHAfYqSb^#H63RI-6|t?lhdL+G-H>H@1lvFjmN7tCLWIQwQHbY((y zfz_bc^$4sBW|#c#l9LEslcBo6YEbNY4Aup+YfJsI*9cvEp}N3oQ0xNTnGLD+K>pHu zd{Y^r>p4^xSPhC@Pf_fuSsYe`&?T4-2}7_N6uX{*b-_lYi~dEXB6L|pb%E8O*!3K& z3+AudEA#six>BLKz-mzJdI8o23&VG_$}b~y^+R=m)u7n*608em*C+AMGZ4CVLUn=F zpxE^atP50PgTfGW0uMshW2i2$8Wg);gLT2|GP}I20-=jH0}_T{H7L3A4Okbf6rFS| z^c_SOav23ygW|%sU|q<$k`ta&%%OIH)u6cW9atC4g%auBw-LI6p}N3oQ0#gS*9FRl z=KGH3>%;BJgX#jSL9y!tTo)(|^S5X{M(FB+>H@1lvFjsP7tCMRFWr$+fZMeastc?J z#ja0aT`+&u*gA(GbX|t(0;@r>>oZuF4)n|!SL4a=5xV|Bb%E8O*!2ah3uc#s#OGFo zF7-@EEQ8gc*!2~x3pVHLr}yFuLRSz}7g!C7UEjdEV0QTm_HRPys)gzTt3k2rJ6IPe z3_&5!y<9Z_p=$+H7g!C7T|dCOV0P&XxXK`OU4iNXt3k2rCs-FOSMDm~x{1)mkOc`1 zuo@J*et~tt>=N25mWa@$1JwmqgJRcjur63>bMcMWZG^4}s4lP?6ubU_b;0bqnd^WQ z%Pmk{U^OUq{RQhXfToRDU6pMJyEZ^|fz_bc^$)BIX4lc+vjqrUcc8k!YEbO@57uP^ zwM*3ey*EM^M>Zr3!D>+KV&FmE|JDCrj18g71gZA6Le>RVgQANAMHk2}9Spm`YEX1>qUZwI#fqT|tOi9F7mBWlvim3KV(0>^LD9vH zqHAx>#yWNkU0^jRx_D4@f$Y-4&;?e5qKg+r7sxIq3|(L~D7yGibb;*Bz|aL&gQANc zMHk2}1`J(bH7L3SP;`Op(!|gOR)eAobXO=dBP>OM>|(^w1y+NiO9;a*bqrl#H7L4- zQFMXq`j3$g!D>)+iGX#1Y6ehd;c1$=UJ1i4uo@IyqA0p_OHVU@$FK{m21S<`SQjib zKw+qgVHa2piY{>!T^@xyKmWq83#h0|ZG!3ot3k0#1FQ?yCz7cxe1XvQ9;yqh2E{H-ur9b= z8X9{Mx^(g&{sOB(u}cfA3)X@?W!1k1p(_)r3#czYEbOb z0qcVK%g;9TI6~KBs4lP?6uWf6x?px$W!oG;=u*gs_zSECC8y|tbvb~NI0FNNT(-Xm zL>F?)0jvhah5BG!pwIwm1dYJ(!pD|lp>~1Qpt#TgtPAGCOsW{FRa4*CYzJ>pxT% zSPhC@CSYAKyH2VtYe(qPEr5hPSPhC@reIw#yFh!}Mc{TtL3M%Epx9*w)&;W*w6`6h zs~V~ctOms{bFeN@e1U3N(B5{0uGvssU^OUqS%7uH?DCqk`3pkVUZ^gx8Wg)M!MZ^H z0@(%H+m6t6AF2zi2E{Hbur8Qg%hS29$$#i z)dST9R)b=fJy;jaE_v&kWQ48_P+ed(D0Vr3b;0aqr5hT9AYEbNQ2J3>Q4Q>s+^$1-KP+ed(D0aDk zb;0bC{L7wz(3Jw!1y+M%mn&Eo%&s!;2@(ih9Z+3hH7Itufpx*``g2BRB0|?1s4lP? z6uaEPx?pzMUR~yh&~*W-3#*3_Tn z2wk(Fy1;5s?D7TcLbgj8Zr47jF0dLDyZpeqV0M98UkF_jIS zD+sI$<}XluA#|;V>H@1lu`3v?3zQB)c2&%N_V6^^uG3ImU^OUqg@ARz>;j#$gwXW~ zstc?J#ja4WE?7&i)aS){gf59vNEm|Epx6}#)&;X`o9ohOgf0iDF0dLDyTZY`V0In& zwnYk|D+8(vtOmud2(T`gT_^RXu^@C!fa(IPL9r_mtP2!|pjZZ-vxLyK1F8$G2F0!@ zur8QgwZ+ITd;rx2R)bw?(@xpoN$SPhC@$#7jDyFhE_&cp5c1JwmqgJM?-To)(|Kh7)hLFiH_hr}{i4T@c`Djgg2mV2uM2f2!R?v?)dg0AVpj%O z7tAhD8ylf(KU5c34T@cvU|leONlf;)o(8w;B~%w!4T@b^U|le~Zol5zgwQ2X0SQB} z8Wg*-!MZ?pfkHmaWsM6$mm5?USPhC@IbdBdyUOj8E+cf6L3M%EpxBiQ)&)w3AiK;N zA0hc`8B`Zo4T@cPU|le~Jg)B&Mc8!>stc?J#jbp?E?9Z!DLkzap^L2&5*lDND0UTq zb;0b)uf0%>&}9bI1y+M%S0Pvz%&y4?IIbadr9pLp)u7l_1l9$!OUoxZ7@=z#R2Ntc zie1HEUD)k92Gs>tgJM?+SQpH$iybDv5q5op>H@1lv8xoU3l?8XY~QXy=u)eKgdtcB zid|)3T`;>iOx6n_bcI26fz_bcRSwn#vI|shXnO~1PKBrWHmEMJ8Wg)Kz`9^|f%s}`&aw?+EGWA9YLf1;DF0dLDyIR4zu>0#4R2Ntcid}7BT`;@S zjylX@8Wg)az`9^|Mf6UvMd-?h>H@1l zv8xlT3)!wIaJv>lb%E8O*wqErg=`l>*Hx%4uo@J*y1}}T?NWoUpXaE9ga%j*id{Wm zT`;>qdwdYO%%Hl!YEbOz1?z&@)%uRJTNQ3sGE^5>4T@cTU|le~-cBohhtSmt)dg0A zVpl&{7tAiun4T8gu60mdU^OUqO#thH*#&BEAaq@W>H@1lv1=k&7bqQq%8f&xX4@OW z?fMJV1y+M%*Cenmm|dW|o)Nk<>meZzR)b>KWUwySnhGYVi|hzpAy8dlH7IsX0qcU< z#m(A&8=!7;8YEbN&2G#|$tK&s%GD6pFs4lP? z6uYK_b%E>xg&}CH(f}TY91W1r0INZs%q~#Qi2(3J|+1y+M%*KDvZkiS4-2&%sjx>}*Sz-mzJngiAavkO#z zA#^Q;>H@1lv1=||7bpxT<<4AU3lGDiP+ed(D0a<*>jJq@J2iMWLf12>F0dLDyXJ#+ z!NRaU&VMUH7h5AFzQAfw>{H@1lv1=(<7wDWNkgnXk`6UQl&!M`&YEbN22G#}h*WH5ZP=qegCP>JG)u7n5 z9IOi#hF|CQi6eA5Lv?}GpxCtntP5tB@6WI`2wjCxU0^jRcC7^Kf|b3X`{-@pVK^VE z3#w?+!<(KbbgswcOF0dLDyViqs z!R(5f9%F&fH3O;(tOmud4Pad`yP`C2B_MPig6aaRL9uHiSQmD?-avJM)u7n539Jid z7uV}u>Il2US|DKvR)b>KX0R?;+5okqwBc#P0jdkE2F0!|U|le~{ufT_KH@1l zv1=<>7qVTtaJ%M1b%E8O*tHF;3)wD&t_x6IU^OUqZ3pXu*#+8%*bE=HVQ7Vf23QS> zT|2H@1lv1>P27p&Y^e3hpcp(_=t3#KUa&6YFzkkh z;Y_G5uo@J*_JMW5>@spox`fcR391XM2F0%ZU|p~<)IPlaGD6oWs4lP?6uS<9b;0a1 zEC|_-(DekW3#mO7XSPhC@hrqgEc5(jHa6{;lXoI9Euo@J* z4uf^U!jPBg@4b3>7#cx!fz_bcbp)&nW|wSQe=$OrH&ho`4T@by!MZ^H0@an9U3IEM z;dUiMb%E8O*mVr73uc#fM@lF{R}EAbSPhC@$HBT_{sQH%K)78~pt`_nQ0zJZ)&;Zc z%jpPZgsyc^U0^jRcAW(4f~AeOep8hYx{gD2fz_bcbqcHtX4iSEW3v&u9zk`1)u7mQ z8mtQxhM+cpgd+begs#6(U0^jRcAWw1g4y-(W%)gXE{S$X+5oFTvFj{Y7c2}xX~P2^ zhQ?4`U^OUqodfHF+4b`B=`RRfzEE9YH7ItS2kQd)3zjz0;C7`!b%E8O*mVJ{3uc$M z9`8$pu6n30uo@J*E`oI-+Z7A9YdTaHSPhC@m%zGUc5N3ljYjC&2-O8vgJRcZur62_ za=z!5i-g;C3aSgN2F0!`U|le~B$W*_5xSm0b%E8O*mV`G3ziNgIUZXfbp3_u0;@r> z>l#=W%q|Az1GNZU5*?7V0ak-z*LAQiP#A*J;n$OC7ZAFPp}N3oQ0%$^)&;Yx-D6rm zLYE&@7g!C7T{pqHKz4!BM&UO5Ipy#$%!KL!t3k2r7FZX|u04(1lM%X_pt`_nQ0%%5 z)&;W*R7T~&?V1JE1y+M%*B!7fm|d?P*JdGfZGq|nt3k2rE?5^VZGg(CEVx}~p}N3o zQ0%$~)&;W*H0FTN^&F}TtOmud`(RzLv=MfsYa&7yLnkDb!D>+KdH~i1vuoAri;f6g z(okJsH7IsH1nUBYAt-GuUM--B&}9bI1y+M%*CVhlm|bBH@1lvFj;V7sxJ>jhXB%&z_X zz4ZuPuc5lYYEbNY3DyORuj^rHuMoOeyC7);tOmudS72Q*yYikn&PC{whw1{WL9y#K zSQpH$lU`y=5xOj)y1;5s?0N&%1+%L>_3}Z4u3)Gxuo@J*-hy?RfD#4+14F#kCtFc? z+Q^0K0;@r>>m67Z%r4NH3WTn9s4lP?6uaJob;05*;(pP4gsufpU0^jRc6|Wrg4tze zWb_=NYd2IESPhC@AHlj{Vc1;KX^GHv4XO*Q2F0#VU|le~_V4U^fY9|3stc?J#jej_ zT`+%5iajtDp^K**k~Y9U0^jRc6|lwg7qsG7V#AzbU8tF zfz_bc^$n~GX4fYF-*XYVVxhXgYEbO@4%US|3@f0zz-mzJ`T^Djvn%x%YYM`y$xvNj zH7Iud1nYu@;a3KWK7_7yP+ed(D0ck<>w?*}`L$ygLf1*CF0dLDyMBXp!Ti-J5Of!z z>j_jBSPhC@f55t6b~PWiiA3o757qStqz1*VzaSCNMksI&1Fcz-fafo%9!S~%t3k2r zA6yrx6y<7IvlpSu1gZw?)et94lw zLf1B^F0dLDyI8=wV0Qf%<*Y^Mx(L+;R)b;}D_9pSZR}hgz=_cH2C56J2E{Hmur8Qg zAFJ365xUrWA+ZcrgJKsuSQpGL{^L3!2wh50U0^jRc5#4p!R!j!_Wc|}mn~EmSPhC@ zoN!&Bgg7zsq6`Z>ZA3tIfz_bc#Rb;|N{6+&7Znk@@}auGYEbOr2J3>w*W%+7LJ+!I zp}N3oQ0(FX>w@`UTecuB}jAU^OUq@qu;0>@w0g zpNPcpSLFjr4)dg0AVwV6|7tAi^WCw=}j zDZh8$Md*_1hr}0H4T@b-U|le~N&`aHAavP5b%E8O*d-0t1+z99EH1s_6}$V5oUgVmter2*Cjv&(aFehEUCB~%w!4T@cwU|pav1eH-QtlQ$> z!OxG1gX#jSL9t5ok!Thzgv~U4J*LaP+ed(D0bIccQQi}wOC72UtOms{1F$ZbU7_+*lo7f-p}N3oQ0y`U>w?+EKl#XH zgsyC;F0dLDyNtlPV0L*kHQht#>V@h8t3k2L7_18xU(41gy+r6*57h-$gJPEnSQpH$ zl~YzNMd-Q+)dg0AVwWjc7j}PrhUx;VL9xpWtP5t>wuNSv2)jflL*fgp2E{IOur82Y zpfo@C_!`zt@HI>3P+ed(D0W$Zb;0a9w*1^AgsvEy7igXND!5(VP+ed(D0Vr(b%Db0?ViS7gsvK>F0dLDyBxu~U}*!iets?7t~F3y zU^OUqIe~S-{Pkk`MmL16n^0X~H7IsD!*zlDrP(8Q=m6X<)~S#%1gk-@%LT3rghORb8==uQF1y+M%mp51!%&y}fC6*y{2~C5<7g!C7T|Qu4FuR=o ztT~6!WdhX&R)b=fFI*QWZTvYJ*~SU)JA^@Xfz_bct;C6LFb%E8O*cAZQ1@l+N)Kd!(x|Tt8fz_bc6$sV^tC!zA7Dz|v zIt0}PR)bc1?lm0;@r>D-x^=6o#O5c!ImgJpi6I zHbHfP)u7lF1=a<#OX#dHD?-;zs4lP?6uY9qxw?*}gRxZzp{pFK3#; z5V}r4b%E8O*p&p<1quz2UB8#vtqXjVs4lP?6uUCuxGg(1kU^0LE6o#1wf&4PqHSPhC@*>WK>jkynYIz3Ycf<9SPhC@d0<^2e}QxfY-?3Q z=sE<|1y+M%S3X!5%wMyud>0{feTM1+t3k1=0IUmU*Pdr#X$V~^vms#!R)bnT(hSPhC@rEpy!yFjZx5W0lsKtcno2F0#2ur62_GPV0FBXrq8 zb%E8O*i{bJ1q(y(O4VS5t{kW?uo@J*D!{s6cCEWUCmo?{7E~8l4T@crU|le~(w8r~ zj?i@istc?J#jYx_F6?%FgX#jSL9weEtP5tB`uF^Dgk36gAz=tsgJM?=To)+5!q*?% z>jICjAgC^|8Wg)~;ksb)h0s+G)dg0AVpknl7tCL0eYdSa=vocc1y+M%S3Ou4%wI*n zC-xz9-Gu4_t3k1=0jvvVSE6j{3xqEAd63Wmt3k1=5v&Vl*W+1#HzIVILUn=FpxD&} z)`i`!WT-B%8Wg*l!Mb2}U9oy`8e!K&s4lP?6uVmBx zD84{FdW5b=P+ed(C@qIJur5egF);jX<-G*ah1_xgt3lD#j-m^6CZQMDg~+nT(hSPhC@ePCUnFa){KVa@#I2wg%8AYlkrgJM@dSQpH$r!DGx5W4K4 zy1;5s?3w`9#Q_RH1_lPuXpav(40E8mz-mzJnh4efv#V_H`H7IsX0_y_x z=t0(jMtkhwcCCi$0;@r>Ycg0D%&slm<;xJd&O>#9)u7ll1*{8{mqB(pvi^T$1GnoF zR2Ntcid|E|x?py#W!kg`p-XZhB;>(rQ0$rp)&;T)6kmcph4Bbo_E245H7IsX2kU~_ zJiZ(A5vs1y+M%*G#Z3m|Z4m>Tw8N+o8I^YEbN& z1=a;ihif?9!+|P&=n5V1y+M%*F3N;SQy^sJFJS(RS(q#R)b>Ke6TKH@1lv1=(< z7tAiut}%qJE~qZB8Wg*hfpx*+i|O+6CkS0jp}N3oQ0!U`)&;Xm#jo8Tq3aM-7g!C7 zT`R!4V0Nu*E?I!kbswq=tOmudm0(>kyCm&a-$Us71JwmqgJRbzur62_{{AVS{Q-Vr zlH?Lde1X-V*tHt03ue~|nFA9Mx}2f9z-mzJS_9Sv^Vh3mmzfZ{a-h1vYEbN23)Tg* zYh~B#`v_grp}N3oQ0!U<)&;Zcd}v-gLf0XvF0dLDyViqs!R!h&h!RBTdJEMBR)b>K z2Cyzz{&G#&lZMbGu@n-9U^OUqZ3OFr*_G_B>x|Il4AlizgJRbvur8QgD&MASAavzH zb%E8O*tHp~3uf2jDcg`-I1{Q1tOlj^wFRt;2~>G8FffEa@xKDG3%T_LR)eBzD~hg) zI`-1H;1q?d3#@ERPY}9PmqFqStOmudonT!syEKiCWg&EhLv?}GpxCtwtP2)j zHG!YY5V|^{y1;5s?Ai_11+#1OhQ%`xx^_c#fz_bcwFj&V=C6bAj^0G*dJEMBR)b>K zUa&5hU5qncl^}GK z0kAGu83o$e`Wl`#wnBA*)u7mQ5UdMkSH#VVUkF`~pt`_nP*U$9urAoGGtV<8K7IwZ z3pw?I)u6cWFjyC?Rk?EAy66{RU7*y^ce71+&XVw|gT(7yn8~7=qQH*mVl53pC>c z%FBy1J|0ErvV-aZt3k2rG*}nRuK5M66$o9qP+ed(D0ZCz>jH%#$gUN~?{FY=&4KCy zt3k2rELa!JuA`q086b3>hUx;VL9y!`SQpGLE#uaHgsxvuU0^jRcAW?7g4q=!p!NZw zOLG+@48dwpQq%>oE?7CAdh3imL>F?30;@rB;YF}6Sgr)^yZH)FQ4vtPz-mxjcnPcv z=E7ep`<^3obwG82)u7mQ8LSJIq8=|SeumJs9jXhg2F0!`U|le~vi9xUkI?l3stc?J z#jdMhT`;@a9%$W0=#pFw2}7_N6uYj0b;0Z^-zg}7(B%cy1y+L+^4Gz-K&c6oD>K7; zy&<}gLmsRKMb{0mE?9g`Ym1-s2^{jsy1;5s{B;wo3l?9X*79!n`rc}&3&Cno{B;Yg z3+AtV_l@r$bWMcn0;@r>>o!;yEDV=c`%XjXS_ahxR)b>K9k4E#T^5&*1R`|ph3W#U zL9y#DSQpGLPVIS@5W22Fb%E8O*mV!A3uafGp4&f!uGdgqU^OUq-3RN!ZWq%UNZJ6a zL9y!rSQpH$E$oUc2)iVqy1;5s?0N{+g&beI;PGVu)dg0AV%H9wG^rgtOmud7hqj5yOzEa-h;4f zCsY?$4N9(j3DyP6l}X=AZtMle7jmuyt3h$$E3htDEQ3nX4PafM^587gF0dLD7rqAT zg1L}E>q|01*9)jFuo@J*-hg$%LPK)BWfDRc(^^RC1*<`^>n&Ip%r2eaC(97JH@1l3Hc9TU9eL0+FpHO zh%V%i2dhER^%1NK7GKP{aot z>l;`XEWSXiF%h~RLv?}GpxE^ttP5t>mTQfd5V{!FK~fZ04NA!W0PBLqmq~e}EkqY` z$b;3O==urPg&bd7!6A>V3#B9fOWw_W9qJibc8N5s4lP?6c_#l>w<+wNxsD?h%RJ*fz_bs`Ulnp z3ynIvOMH94E=1M^R)eDJKZ>rrmHqmgFm!>{py*=Y1MUBU*=4o-#QV({y1;5s!jKWH z3l@gq+tryI!MZ?U=m!lAuo{#wWCH7gh2gFB=M50LGN8J^YEbNA2I~U#zd+&m;H}VH zgsw)YF0dLDyI8=wV0Ojb-0z0aH3zB-tOms{RH@1lNm1NjU9c2oF-23< z8EhAF>IJJoaUl;_7tDp;%*jGVU|paT6#%shtOmt}ykK207lKZ$N9f9j>H@1lv5OC^ z3l_^O%M2?Jx_Y6yz-mzJ;s@)3*>$k`p*}*_TBt6t8Wg((z`9^|6+FFMkI;1%stc?J z#V$dxE|^_GC2B|SecsD@O23QS>UBX~pFuPW~FkXYu zr3=*sR)Z4DB4AyhlnaU>{r|2U5M9Wz3|52ULQ$|TSS*8TSTlGm`$Fvkt3h$07+4p~ zg|RpG1R-=~Lv?}Gptw*RtP7S7Id~HnLv$g#5Ud8pg%V(0AiF^Ra$2xi$r$d!4yavV zH7G8WgzEx@$h;6IZiKECP+ed(D0WGKb-~ic?AghT2wlgay1;5s?2-oS0=W=m7i0F+ zPY7Kvpt`_nQ0$Tc>w>j6-n_eDh0w*h5t25*YEbNw1?z&@_2~J|4G3LYP+ed(C?PKg z)&+7MC=B=2Oyz^k5VWQOp=$|L7g!C7T`FK* zu(WZkQ(h3EYd=&MSPhC@s$g9(yRtP56d%&+N~jnMTIstc?J z#V&QQE|^`xQ?GqN=n~rmNl{=mC?T%_)&)x&@fMyD5M9V24_1TXLQSwPQ0fJxsE{>x zR9)dAZw$2ytOmt}T3}r;7oL@6u|((!fa(IPL2;orSQpHNLj8a1Ai9uU2v&pQLLIO! z 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 z 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

      ^cb61>o8as$SzPA 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%0DZk*=ef zapYxK((4?!zaUykvKHDuC?=z-L(>Y03v4Y^Y)vjS&5#^Vre=uE#1wnI)+>^dZTiYD`H@&d)0@DJo4aiO)|`Ibx7G5uR4f%;G~aN9mG7s>LBKU zD?K92Bdm^K;DJUGz?lcqxFZ~n7#c9F0I5hSNW(M=E`iVjwi+6jMXAO4Ic2Hw$)!a_ zsd>mr1FtGvhJliGaxP@eP;oqXfC#!`5y@q!Cgalri5Wz`gF70ZCP=iCs0m^dcmjoZ z=Rs^DQ4_=_aBd*gCK5G4Y(i8{B!nJ`nutpdpw2{QUVKqvUOMvXE_|VYss-X9f-#G# z2@**pYJ%8AFubwZM4~2$O$5Umn@uEYLPSzxX-Z~(d{SvzS}JHuUs^m$@s3%#6RDmA z3qYk3INmWzK!SE*XvJYIc!)Z+0;$|VF&Zuni2!h{VOIc2KzI~DOaRw2_)Nf~0Ad2T zX2E9y9tAi80lHopcQ7C+Kp0Vwn4X#vkKz*a6jGd;nvE2+MC*X~6r3B0)&q$E()2*= z0Y@5%_K>EBq(H++x)7g%ZsZ^w;ux9{R+ney85_l?W#*)2=A-Wp$07#_8*q4Hk%hPk zmn=jtIE--W#U%^T3of;A>cu6C@GR_{g0i&Y`22#@y!d#qVMvJ)rwTlVloMeLLJf9< zl5_HlQ}LUFssy_+pr$o`Q&3buLKPh5$R0;g1Bp}oY9Qu-3n>ET;8z1N2V7JUFbBUH zh&hnK9_Y~&peV=UFZ^n-2Qs9)gg5D+DuFl$BM4Cy;Rt6`MG%v~2^~3rP!&N;BA^Ij z5=L}jGl_sAh)Ea`g3TlXim(SasJg(PrcqR2H>4yrCkMYFC@QcUl9`v5kKYg!71#{{ zl{BS;dvjo^XfhO=)_3f$U1RILUdxJW@Mc>B(Vn%IECW~AE+F}N{ldo%Hjwis4PS;q=$%9 zh(To`dU44@^kRe{ie6l@5WN^-h@uylEcSo`p1d)PRi4jZ?Nr+EzNJ4aCcm-J} z4oQekj0i{8i9-^*Cqd;04o^a)uxkUA7&x>+q!8LbRakyeJS?YyN(3aGSY`2Q29+3) zz|BpJ$D$o1kJA8X!GTLZR2rvt9-<$d z)bZ%YEf3KTPDFV05gmsLzm?mjWKb26vj`QM$)q7h+cf@dqNX zv8#eOhL9?VS%_fAXBHt<1U-n{=D^{Z ziqB0gNd%1tA(e&5y3y3&FbFg|g3ADi93GAF#i@m*7>D|yI09q_iZbGiLpoCwpX-oJ zM$v)K60~rEq`ch3cuZ%bsl+g}B(VrIzyQwC@!&20NtGq3$ftoq&BUn?!$`=`5~i17 z;z&6FYBo#;;tz1DN0Wi*0T(rBG7vr3WFUILMKo4D*kmAjzy%UkJ=kP00svIQ#TO+a zXFjN52pNb);Q9|k4&o*3au9vUL4+_9q7Sx( zUpbZp1~wO20U;yeQTB=>ha$ohuo{8}C8119KuS9_=fs25U>F2yaK@M9Bl0a~s>h-P z!x%{J!UG<<;xwiIF-L1l!!2}-9B!|-?$qzK|L zNnvj{4KmuCVmP(f*a)Xvk>wy(BD)7!7SpxJvJkzT(S_o$R!J=UR<)64mLBv8Nz8uau7?A!vR?q z;$U2|5WOhgK{6Sl7ndxCgV9qt(w106I>xF9;tb?Of>jyBJp`3OOha}y9@7XagP4XK zYj{i}s0?Bna-D(4G=j>Ai2`EEqcme9kTMM8ijBZY5Nkvt%VB6t%tA`Q`voVrn@A-Zu&V>mmv6ra0MWg%80I~-LWVmEGih<;?ZVbhOW9>ekI z38@$osStPI&VW#57{-AYB!K2{F`I8lQn_kzC-+35H@wpT<1b`=g;=zp_93v@^u_mwzq`p2u z(@@kBavPFjL}vs`CkrX0KwiS7ji7b-lMUEtTmwtkgM&a^flWk=)PPhIbR&{-L=On0 z6L*qDk0hk91Zl)>Wo~M2ei6!sFGvFz9M&*Nd|JVI6sw~ky20{z4M0iDI8qkWEHtI~ zjRgfe0plP_2pfZx)QB(mw zXa*{4NVEu|iA1YFohB?LIl-U;xm!3Ld*cfGRp*U zA5!pPQ3G)rO38&q6~rV$svu^eI3A~2gj7MyLMgRynng$z#4OkZ1~?(%G>ecbh*^-W z-q2zMr&)wlVMZdn-G!y#K$63w5!5h)#1>M#!?l8B@oL6B9s>?GB!f^@5^X5R1^C>D zY%EAE4uc_0D_o%jlf|nUa>51n!6$@gAx5FA#bGekmMD533t=`+<)j#oD0a~!9INpl z|-O@ufD z0=rd&bdg~hC@@I345W*6%fJCbvSnahn3m2rSF%atn;1qF5EjLn0HyF0dZBBzCQ!jE6%b zL<+YyPzj721u$1aM{v=GyFs$33%MX=2C_JYU3l6-2;Eo}L8@X{qXc9LR%HZSX5Yu3@iUdp}s0?BntZ72PG=j=7q5x+D1`z>RlwcSGT15yS7L7;0c_XDL z9^`PWim)05QVm`yhR-MrML3ND6`n-74rC-&#TZ5-u2%&IPeFcW9?C(YP%q<928mSU zbcsVDW&*~c5Mm;%-vaUn4uudCiBO2)WpD!!6gqga8Y0!;S53U(7$fW;zu`0-tQx!F zkWv)uC_cF2fCLPh2MB2**($IDNwo^B3A;3NlngA z0iQ^am=ce%{1}TQrdDtk#HAHk5>qQ^uK-S4ktH#;A|EZAoL_)42MBdGrV>nJAk{c% z89el?y%Llw*CEY~qIm4ekh4A1PV5RHQ3T2McojlSgj8~P6+%oTLLtONNJU44i9{%b zm6|uT*SE@I+7?_Kr&b~K|%qWJun%FCs2F_?+9b@ zHCzs&55=EwIfy>&a;T0(YyYA-6hjtOGq{w*v1tSpI9TLS4FL6`z^w(0LzF<;F=SCS zrxc@X&CX2(@A!j@VkpKi4iZWTeHaSRj3|mvPRz*xody>V-g=1^SSgtDcnkoA4L$=P z@~8%Y*I{8PxIux1CWp`nZge4EybD$d3M(Y*@hO5NG;jjNrwkIB1eHNd11C+wrV&&| z$eZBOjwrt(sU*r!&`~;xWdwr|Y%EMIA%h`BLOfCKMNtb0R6JpiqMBe#p{RzKjVC5h zR71=rRyCdgfegSA3=0%xXvU=$LHZA%>_M<9MpJ~xD6F+L#NX%@FUU}=%84=_rIsef z0u&8|tbj!umhuFgF_A+L><3H@2rIyoL7;*KDMKKMLDCR7eIkiMyo4?aQ45||#ZZeb zip2rY`Ws?)ZX#q^56ERu35fBimO`Z7Sloipi9-^bQy~$KEk@xD4K!^S?FEQyVZOwWM$-)z~WDM6#?-CiqGJ3SbPnagXlx?CtMDq54#+yBOy5h z&3!OIh!x) z%kb(R;v#4)!9_6?gCYPeiD4Or067&~{f=%4$U7*5A{h38R6v3d(^h0TNI1b0GSqTZ zow#Hndco5TNDfEUi%S;G!I*o|>0h zlvt7q9%za$NlZdHs0E}Qs|r*@3i69fz#UPv$U+iFXaLt}n2oF40%IiI_!JQ`3Q}DY zV;+)9q6{sM2URizoe4G;rk0Swkm`jvgHhDtF&I*C6EqV=86-D=^9n}bqbP)=Y$6mw zOaxaO#F$8gLNqVKnnj>gN^tZ8O%WcW5DhG%48^LPDC1GuZ;)U`A6@~u8esv720~WA z5(}160URC3p$E1CQv{J zflmdtzRvQUx&!ye5L6S%g$U%mS~5AZQjLRS>hl zJDdobMMxFIEJL(}h9mF^DubGamiTa)Mo1a9#0qNC;p+b&0t1UGh||#giA5bGX%JQi zF%QiPIL#xh4x48|?RS*cKg4k;ITJ$-E`uP=b)5Y+MBsr;#I6{d(a??rA!lM!hQ~OF z{aA}ns7Wvt*bG5xO=Af$Bw1{lQ91$8Rq;jf1*OFqSe=7UIl_2wI|8#Q4-a%CqX{b| zWGuKy z6njVNf;HEB#_K>CrOCl&JN(I%9==BdMMB!4{wB;9<;M50~ z!_)}ULwHULsl#irNQ9iOSdOy(laN9JMuO7?5hfzkVKFd257K7CVGfEkcI}X$LR*0f_ga2lJhB4p zMnD1wzJ{w9k73xABIQhEo3Sf~BoJ^eC9D`?GPointQcZ4k%}QEgPTvpnoOi(%s|Fo zz2_#z!)!)ZfN2CG5u=tBFcZ+^A-)6G3OH0i0t=rCh#BBI0k0YOR6xuC7wUM;z^4LY z295-S6dL$cAOf^Ju`CtTUBT#>fCfO3N*n^}h%gXGPY1Gn0lOP8v|zEOI5RIb9(B_& z+^q;XTpGdqUm=3XZ_DNZae$l zAhAMN9mG6*Ap@}&Vjf|25cBW`3$lSkD1@2_?iLW?Wymq6cohVmSz^E zf+phP(^B)2QLZT^)AoOsX3{M#S}UPn<03d0L)A!zm5Im|IAPC0?E~o|#j>=_yp;IdOyqKl zuw4jEBwLl4mtO=r?y9&nIXShsIKPObKm}Wj#RyWIQIwjSUxwVMA?#n67DzD#ZnqGx z2~u*CsEHI0W#%OprRJvQmBbgNrjZn!XgW!;G$oZ>OVMPf{V@j3Y@XD4IWhh04h7L?|ZY6VOO z9!s+Flc1>_Us6C;g~zaz)ST23NYfA5x1c5&@(es?(BRbvDQ|ETgm`u0Ekg0?gxHCr zSj4LnVkbE|@dPZmSb)wz7lDq#Ov_Bi7hl-b6Kes{CL^D7jTxzlC5iFSMmcD3DLFqc zFEzP@_(mO?COoc3PHf=0N|NnD*F~gdkm3*&A*6W?Qy-BQg0fOP_&D~|iqzy%@RCb# zn;Bo6AqNj014wZKIJ}BW3kq^7p|iwzt40hLVAW5q10V~2$aer-Ki*uAl$^nVi0lQp z33ziqQ6@m#Kx9)1j~gg4fs}}VcpZ`^3lh^wYl35HCdF#lfJJgqW=UppVorQ{- zh@=bRF(P}?Nctc-mUMj(`-lvF4Espe2eFUHD8R6fbbS!}h%7}g>?2(tv55tAVF|f) zA6C6YTAZ8|A77jbYUbw`Wai;*eIeI&7}|)m4qURQR=`&Y!ty(zY=Nnd*oef`3CS9S zqY_gm#7^*JE8a|usS{!+IXWSBf+t|fvXdO0L`EjGxrb%*4PKXGXv1S&QEGZ-aY9yD6k57VM@#+(LXb zV>boj7D`QlxP|y=#^)AFO(7w%kkT4NO71Ayh_nt=c7i(B@x_@{si33@z5opWm@23< z2elTbc2cbe7mVQPZsIEpxaFvtiL^Q`Gbbk=6u63x>%= zDn(YBDJ1ueMpOG^q$OX8DCG0r#yy8%NQ zw{}o_sw_XJG#5FUp&Np%2+gR>JbVs8m&K_WZEhay0EA|UEKbd^iF!!v!BPl9J4_y@ z0V$~^iOCu9@p<|2NI?g&6_=s-^x(88u>@ohdR9TW6ef?;0MO(mZtW0RoSM@zi;9sK zlAwh$R2rvt0;N5|7Z?iB^9UZLkl;q-4LnLArXq@ZJW3&^5~UQ)`_O0x?Mz1xcN8f! zZJ=g*a$<5uYDzrBSp_A?%Q3+rk6jJKSBL<>t_tEILaHEUA-s*xEJCVqdk~ss@cR&1 z5yV+o9gnOGj~|hhK}^Hyd}L)1(+Da<^JYm=VqS3$=*($QSqmQQL+Q2;RkHI%WKfJXtE7ceVjY{S{$Ai=8?VJx^$ z3*9<^LmyJ6BT6;G@Zy4;%o5O;K4FsyD@6)S!iphL0}fciiXkS0(2#*p_ zhcK`pH8GnA^YAM}7?+b@oROMCR8$aBi7+%HlUPFuszex?lA4oPNrcY{sDoq|aIr@~ zB_yv9qY`2!IKL8QCNU}z9xu)>%}W7yzc41IFs0D7fvOE0+K{CX+EVkkO@k|nQ8Gwso;H1$Wvp)DaUSnW--KQ>Fg-54oWN`2uNVd+_QY-V$)S z!r>KcRzTH5@&P!<5ONe$2PlChs*s`sVh1<}kz@xcI*1Rb^rHMy9C z8xHa^mi8!?fI(3ONkAA$4u@%k)j`a|NM1P1BdiW$9=M5y9PT*GBdiW$9(XX32=fT5 zgO~?iu0w=*gwqW1NU?zg4Y;EjbbKMU zt|+=g(9}Vk49?L6R6=5u7?lt+vBo``?GQ7GQHk()N)c#60DRp!=*;MNa3Y6gHRN## zLJBdAL>sb;FE%ubkIyYmOesjtMQTVu&Bd>pIKwk@6Nxk!tP;aeaJGdULWnKyp)SR) z3d1n)1@iI98KrsIpi!0-l=*q6QP|XA8U$Y8m6l&ro>+w3&W4$RDve8fQGRZGaYQ)&o;;6 z5Of82j3`JfDo!l|hdw@oP?TXB2l94&ac)5l=;{)^np@Ti95 zabi_N%m$YTM4L^lYKYn38iQ!FiB%0T8(dcqZ8ov0aYSTtX)3Yth*c@X$(Rv?RWYtu z#Htu#GG?@3RSYqiNW~D7F(UVA&$oMB6iid0tCBih}oE4#I71*HnFNP z0|Z_;C+8Pb#ut|qp)OZ|MK^Y35T~L919pWFR}!HRVj_xn@R>-2LWqedxgMX1L@0!q zh?3j!nMi~}jA(&wMFv%N&`TOHD^6@`2pEJqX$Xy5RCB;e2p9uuRuOU!L=6FhK>j0S z5JU|T2E~^enh|3dL>*BE8XFO3AV?jCf#5b&d=h9MS4n<6JcZzC1YuVTNp2{42NWiF zO(s?~#B7ulO3-X#RYT0ith%uK5>i4Cs~Tc9xH}6?#e_qfSk(}-!S@>yZ8ov0A!dWm zU?tjYVpT)T2A>>BwAsX}#*w&lGC^mFBqpWi#OH%fGb4$_UW?mxR1W2l;!~}>NQ0h5w4kgtMl$d}S5%AIsHouXXmzE!20xIjk z-FnPo6Hx%-)B^D;N?;Ld4~d!}HlYLwu{M#Y31SoWMg`7*fTS7{H9>4bDL{$!6N#FL zNDifW*?IZpd5|$4ViE(I28d_y$10i@NT89V1!4>S7{zJ}Nm_^qE~4`cR3V0unCtSP zRRCN9LkoDUj?h>hl01e1@!;V=ERhQp$DtuUsS@QRW~f6Ura>ifX)QH0%L7+2C?~h0 znt-APr$NR>gbhMggVP{06T$`|tHEVZ8nSJWv<$j^2s#i54pPuf6$s048I%v2JS@$_ zHkb)91)+eD5zyGc;To7ZP*nsCLx~tdW}+x2Y%~#p2X}5MvSNZp6B93RqfrzSG#b*` z1~psKGAmM3Ap7N#N|8^#L`~XodvNQ76lo}>AZn~byZE?mB~LHJUX*f?M0?58OE8dO zbs(;C3e<1~uSJ13P*Bde!4U!Irs8uvLM;t^*kXj%$2IpeVrV3W(S6 znSrVTt073%;7Yn^&V?z%Fb*7!5a&SDV83=2(pbT(7{h3=D@*d@!P{XF8{9Ax2~LF= zMuJT#$p_7Lgo^umbgTgnTm26Ike4#)ddix5a$w1IuOM~rZb3Qh{*&K4@5D#SoJTrXpmMiBt?RnP4hHHknAp5R(a}B4m?^R17hhU@Ag3nMlPDlL@9G zWRrOfVfmRTG)&psFEe6HG}^)ey6ZRShwlU|K>kn^@Hlvk9gq z6tjs{4KbTwdO|UqSk(}-38p9%vx!xWkpMyMHt-M&Xl57^cZgmIiX_BY*jkB5_tN5& zhUi9)IuyepHsh4Wa5j3CpJr@CWD^vj65=F$DHWj>;y&WkLd?aNlF-d1PA$Y-e5nZC zT;kM1%*B_2(9I=IEpd?sT}&JgUd;;$W<&zS8qFv=AdW{KeIl#}Vhd?{Aod{lu!yyX zG(E%x8ggrgKxjdfLY$AUegMZYL@^|Mh*S(QnPAR9HknAp5R;M11gt@hY%-CGAtn>d zb;u?YsTg81!F-2oGLecQCKJqg$R-o1n7AZ|+}a_KOWLrf+ZBgiHbsTg81!5Bd{nMlRNMITCQfk6C0)k2(1FixPViHt$0YKYkcV+E=j zVm7g=A!ZYd7ZkIJRShwlV9cPHO{{8+h=jF}it)A0z>*MWA=flm^x~9;=*HG`0~-zr zeVo!5&PFe#i-~TVAyh(~gs%!hsD-$XIJFRS@ug{WbBR+6F&AI;gKjQyY9Z$0OZn*L z5~mhoF1}QcZZ2_ZA?D&s@#y9frqMg82fX7~*as6+=uWm@|+~CQ>oPWP*7E*<>OW zLrf-^JCIE#QZaGShumTy5PcA(5C;>C5r|?UqYt7OVlu%PfhdNUOr&Cn$pm8r*<>OW zLrf+ZBgiHbshGIvLun}xh(D-Wh?5CMAXGIZoQYKpF`HnlpqNdpYKYkc;|0ZRVpT)T zCKxj)W)rI#BO)Oy_>m?+6Z2BylXLQmQ$bUqn3DyB)RSTX(pVcJwcxP;tezALkeYl% zSpZg#VnJF?VsdN_2}~^+iN*27#i=HSs38c}g(Qcm5q$Uv$in#K!~(SK z?qJ>M3LvQk)?&n}1d?s=DuI{+%UO6#!K(z*JIO`K7FdD+B8;g#J}sxTI3qr}C>ecM z5yVL-(pa>S4N)c&sTg-4gF_fg+{Q!w50!^F4K>-Is(|iWLqZQd6+rz4QUD1&JPIHtz#7|V zE<~7sM*%)BV9VT)5**|M3)reo9PWeb#x0N6`EdO>TyKH4SPaScnRz8}-H^HgLlTR> z!ONkNGE1-)%t(@0w5Da|rGPJv1}iJchg>67T$z^~pPZk9d@^-PQ9Q&g1hrtX25fpk zVsQ!7{M3^8B$S)A;iltKiObNEeCV2UNRmSiG_X-{c`OD%(sW6h1=z1C@p+}WN$BT~ zK>UnLB^E=I6LXSF!ROW%6s4wQf-m-r$6g%ZR7$L|psbAPZ>+|GlwvU!?6IOu&~*-p zMJ2`Y71){vkgS8I3X5Uj07odpRtjS%!D0;ba@FF*+=86cV#tyFMXAM^DW!=y@$q2u zd(XSDPCnfUCp~yklyiB|^u$Bu%X$Q6Ga3nI)^kXa7NHYPF9#M-v z(oBH30ktJSnh6j$P+|ha4X}O}q!1v-4V0JwaRaP>M!p*;F#+NRSU-+@H&9{%#0{`f zO!D18i3t!lSgIh`FXW^LN=zWPWC9lspz2TT2@p4sTf`yUK#2*IWK6PK z44_<1W`lt|J7K*hQgbiNHq!M$;+E8$3bT)NeGvOd%@HvBNY@9kkJQu;vyXIrSkfuD z{SO*kg*41jTG=p*kSh%Q>akdWzickegI;=!%`T#~l4vcdc45tB*aHHa(YRC+c6EGm zeqM1&BKrPqtSulUwL}e)2sKa6)ETEu9;`2IO2^M3(`59&( zHbc-9U@-!89BFb!VqRWq4&;b_$iOvBD6zOWGd(Xi6?^g|K{FPsp@9I75^%_3^8pq` zkP;PZO@nC`L1hrrP=|oASPE&>5>y5;4Qs80={ADOAf{ohb1+RKs0?Bn);18PX#|x) zOvBpc!!(VcGAzjhoOUsdLawMVlt3JX8cP_8utg8tvg1$o2J*1m~#UU_1AO~1xUSd&Yd~s@GQE~?S zj0S8OlmyLWSWS+N*gKDe+zGP@wWcPl3z8+UWFfRPiyWXZyGYeVTmVAcoS1}uSQR*- z!4oV}WFu?9Vg-7cp9H!xl~A)5saio*kIMqc?c|{I{9vJjoX){+Kvsg?7=rgDK*FFX z6?|enw2hgVlarK~oQ-l%J$zyZY%!8&&`-+2a3of>SX>J}uA-nQvkX+$#OEcJWR_tq z&9JM(G%!Cs9dz$hNqj+KdTM-9eo7_yNEzPF(tJqJ~0h+;bL-P zK}l&*YJ5Q==>Ek#Tow_l8%sU{JCs=ckg^daN0Fo-Vn0e%MUsAq{p9N>GVqBFW^4lq z`RVCN#o&8IQsN6TDvL9d6OpedgQa=w%CNc*WE{BkAZ#3(GMvVx=fhS8fRY?`?}DsF zSBGgJ=#&|7>d8+}$6^kuG$i^_3xC+LJ4pKRD1exNk^oVyfTR#S3Lqw+Bq3}j;86fE z0d=e&i!bmfz#fd?$U_PSg+vn|(MO315I3L{2V}W{ z5)&Y9Kp8e7%MFy60C5A#EC*R`pu`076J&8Jw)MTldH}4OOv}m51+Xp}O3_1@P zz}m^R9+n$PwwUC?72#%>okW+e$XX$>O-8bX*-DmHh^=HKQ<$w}X@%HIMzVz2N|sjA zl2UFa=xlGYo2;1HA)Y2WmM{%~6+2cB&W!aTU>}7GYOW#V9I7AGlP3 z1Qd}u1gqb`#!%`USk@uiA+Rh&bl$`C3(O4^839QxMAtC5T|to%5LXc0$iVFiij07` z0%Z*kzCsPRD=0F8h@=U+2c43UKK%M2!GJ$i;Wq)2NhvV_;s*TXAu(>C#02sq0$jvE z0s&tEfx`n}-DFx0D-%ey7FHaQ9$qjT$Ffth_{I@2Cx|c$wU+x0dWP<$rHCLC^CYA=m3`okbodE zTch{^tesrzVL6Rti(v%{8BqtblPs-}*e1GQK!g;`R0Ln9=1i7tE4Z6re@#72@6B+QRwXoT2Easq_eNQOqz zk_~3hip=5zpFxm7AUeMA83oBvR51$TDx%|*u&bzI6cwTmTzWtPipWv`tKY!JKmv)f z@CF+MaSs&?g1CsXutstb6%3*@%3ztD?8t%@-W2!+<_3z4fJ6<^Wfo?tgSmntBOtCI zx|xUD6%-i(aRt%MKHRRL$Oyto6MP>81tVMp^h1IHZ{vV~36O$=5)&Y9z+3bX zEJ6lAyiIg~;dTQ>MnGIabP(cp1w}@Xmd;Te0nR6oqK3%ij;Wno>tQL7WQ$48Xb3mM z>?9-BVYZSHRWMu0(h5mqcpE6#GYiaCva~{M#oHjkZ!1|^NlQwwo-vul3Z{0lttUMj zAz2RA3<+^x6=6h|eh7__1V)BNNbr)JGGRU>LnCQHirE7pvpB(L5Q%|+&nQSl5FIS| zjDom|=xmG6D2S`5ViXmk4_u-`oJ3>}!Rj}#F_1u_EWE)6LEJ+HgCH)VEUb}SLR8|DV0i#TjXK%$0%IEJ}`A|oKKpdemhuAs;Wh%1P$mazpVB+F1_ z1ZL8VPby=8`bcRTy9+={i8K~`>j@-q2pJ1jiehYT zfpL5WXlr{>Vs0w<{C2ccb+9VHFv7>sD89HfDG3yYki#QNFi+S38HH0JRwKa!37`YU zQ_~WYOY)1bxD8|=7Ggp&DinM6Pl#3b0n12llq9S(650Y%t?J2S5&HLp0cq%s~7;PIfM z6KkmBP>Ib@s8J>P1-OmFP=m*yf};H7)M9Lft})Ena3zr7f~`b`1{c&axFSe!5l{p% z33eDEUXutY!sa#f;3O){(FVDpZYoN}a^VHK9K<(hUPjZ2OBSLR&68+)amixydrESN zal9o~AH$@uY0Jz7$(mu+2bY7m6?U*cG!)>nkch`63(*TZkRQ8VT(USFY>2k&AK6%t z98Qh##TofUCAfVHlgI69m!X5do+F#{z+(0mK= z3qBQ?0h*gwlAI9_KGhOSJfO&8Y6jo>g-b88B)V4c*=7XK00fnjpf);Ig_uS{&(Ff} zMm+3XA}n<$ND6e?5Oz%v8LT#eq~Z}bMIgE!FcZO&7+N7&8FJwnIN;(_E8^pm5hoi$ z;t*jRK@CJ&f$h8{Q21guAEufp!!g4So1s_&A43@tCSfrKd~6q}F;$d@eoP+7hiK9m zUIIlJxHk^-Geu0!0CCBcSJRVRHo71gJcQ0mX)9pyO}B<0|Nyk>xNn zg8hzknpRO_Ic7XyRRk%KkZUrm${?;Gs0?Bna_xr4G=j>oc(XVaOH&HexG2GrsK8-e zk{@4Ol2}v%It3eYrYUB~;8cj=0(sD{_nw ztrcP`Sz56NFY?ia#Dppy^%xd_D>U%1Y;g(XB*lXKO!SKmK=FlBA%>CQfI@WxL(4NQE!SvJ*GI+@p-A4=^05#^U6p9P$lW9h8Y3hnEGN_~WKY%)+y;2VRAQ`3=e zJ3|$NDg;GVJjB>|q~0}#Fs5>t-;k8TJqM0xsIf@ujE&%8Q1jAqN{ch#f{=8MDh5>u zy22?bvjkqiBlu7S1x2X^=yesU7$o%@pov24L>GmqHN>hGT@>m7P&J#BpP!99`<+;X z9H{tIKr94RAStQ%O~J1QVvdmtKD!`Z#;*pKr$DI|7NZz;KqRqi#i0qd3Jp}eqxc-A z9*YFTkD!VUs}3v@*qsELorM=Pn4U>3fH@9JP?dmWaRww<7UE1$J%{2<6kBo0;&5y)Qi}}YbMo`yQHo0zo94W{ z)S~!e+}cs(VFrM1urY-%@c}s?9>j%7gC>N*v27fmiKIV1C&dh;3=*s;j>Mu064Dkb zgw#PyBdiW$o+Xjy5mpEDY#zAj6%X<=EYdPj#GndO^5fHT^7G*nrU*X7WrivU5s06V zMIdTSG1MT7K-8FFs6iHis4>S-gDe7da9Ms)Qf4tU@q%ya$V3d~LkCh)LIK|E{#^Ds7j zI3yuD;US4lCk{!7PIxF{(}_b8qSFMQYjH@ThHF7-Zb5unW>Iko>KrFDh%lw0+B1ve z%QNzGK$m8L8jA4+pm_qsSSC(ssCGyr6H=hUb0L}_R4LRYpsFMjGu>q7fdnC;0goP3 zwHU$>)$rg!RgEDGQEdhbX;jr1!VuNw*i~Z)LsVN}SB)VIQEiD`HHI)mwIPP@A^9Ft z95uKh;R;a;jRA-dsxs)cifQ>pklWe{N{cg65=#=%awu+PsK$XO1|U5Y6swWMp&CF< zZ}8AQNHuh2Ekp}88Aw_Ha#G`y^AnNA5^zXDwHBnN!rT3zxI(HSuu4I-CFd7Z#utOFgLiCD#o!7d zLwOi#(S#v^25K^+NkBpxiv&amsL6~~2Nnr*Cqd3}#^o|JS%`I@Rxi{#GRt zuQ<3QzbG+1)xqA--abA)CqFqcCmuYT4!XlDuOux#AEM5|!P3E!Aw51fF}Nf#FD0=k zB^aE1f)Yzo1Bx>9i!w_xQ;We0-13WZ6HAZ;?d{{89pVkl-Ml*V9&=L)t1ti1}P(%uwIs<`-}&|pymm>UgDz5RXM++AH9 z9b8iD4t`uNh1>7s@8It08Q|^j2XR3XNGsT-VEz6eZW^2b#}?QDU|E>y zF1{cY5FR+W7&$Pc$7kgyg@u6Uf1&Bi+0((_&(YP_&&>znCohmzu&cpVLkzK3p+eBQ zc{_Ny_&d2fxj2EX%LUm44ykw$D+@#*EC!2#y;cE|0Q(P|z`;6_;bQTypfhlCb8ztr zaPf0@^>*;dPfW?oOSd=8$xJFrEUL6O26@EUt=QfSq2AZQ#oaN$(bdJ-!7VW}CpE?1 zv?Sl&G$%hX1;0jD2OmFwS8rcWPlQFqmAOgzIauxSad36=4e)pLb;4o~7JcbXiOJci zc`2TGY5CByz`)$k$=Th}#mmtlG%q_ZzdR2Vqq&LkA(^?UMQ%l@g{7%^$(2ymhR*&D zZl3<`9s%9~;GhPlOczj?fkPCW2f&F69FAZyQ201Hk`mFdfHZXVbntWW^z?Id^atCP z2eJqpli*kbTLezCU>4X)a3msR!HU7!>`g$LA?}4+;NtHP;O*+}?C9@^ml<2gkT3F5*#?Of^7pAJ75FB*&6I> zuuoti2(c2vLn=UA9Xy@9ecgPVTo8V61340#CE$z=b~@M+6!URqMYva7yd9i}<8>0SYsm|&lQ!wc;1GPwD!-VQDS{!Z?$&c4KY1*?G|&m)pVD%^Z$cL!$|Ur^EH zjW9n5q#9Db!^(9CkBrhDWR$&%vp38}0~ZemH&<_WKQB+zESi{HSejXsYHtdif3PL@h&-^K)}EOEB~m!897W`a5`f`nWkd`$6h!GQxVlfW!+`3Ck!0LbCskOVgg@F%bUco4aIJGi+9ID2_H zL(B&!2Cy+;OK?XBN)o~rh#=qQmFDE6mu9Ab+t;~?@tMW(AZ|QJ9MYtQHBj6goP7N~ zoIJgdGD$edOJI+X6d@p8V8??~J+#>e5=1EoT>Tw<9DQ88yj|TK>{Z-+!X1Mh13c|j z-2CiKgG-816LalNi&Bg7OH075i$u^4I9R9|xcfW!_<09-1bBh!K@v5)IXn2cy108e zx`PT;QZ;)x_yz=cdpr4qnpVVW26bHg@=G$)GLsWQ{T}Dc)Vz|glB67HzBDlP@bPeT zad&fba8JxlErxs4(#^}w#n~~y*CC)N-`>=*G$k`1CJAb=2l#n7db$K4MH)Emfa_4y zkSDtcM_A|W;OiIQ;o{~6skgyN6;VKf>ppP2Q<7TXwz+sZxca-f`Z{`n(uboX*fvK{ zG6L7rV9$XQ7}!d%ufh2cECw#85qSsGK`?6!T%8?Uoje^~oLxZHpvEV1Q?)3yq$o4B zEY;pLH?snv+uOm})63fr)bT=3#K^iqgGu(L#if}giAgyK-EIyZ{w{8QPT-n@7`sza z;cWwu%YA&^oPGT~G4lYj-Jm*yy1F_9xVZT``S`gbYJPASSvY$-_&E7{db{}Gk7GpY^z`+GS#9Xz?BL<(5#Z+R zisVcD-U4T5uoAde2oxO1wz<1{xcd7!Ar%kckOUK8L%}HpYbS!pmL|+L15o;P_jdO4 z_W_lCxbse8a!FQ z?k?y}XK=d;(ZV7&F@nMfoV>t(1y==#NOy5`aCY85A0JOgXCF}3LbV&&>DYCvnT>@bUtsb{9}OM72Al zs1n>b^8~j`oO3{}8sm6G*#{b8b8~m~@C$Hrus4Okl+?7u(wvfj)S}G%6wf?2(8)5z z_Ta9ivs((%ppmn)gRiTvlWTyZCtPz{Xu(4Cu^ zhg}!4wNBm+P60l?Zk{gwaBFiDD~QnO@8Iw4Dt6s2-VW|=j^3_Le)wB8;Cdqw)L6GSO-3~M zoc$a;+`PT~oIEkZ8`W@oIR>~ofx9iJ1FX(|4gsDX0ghfi_(K%d%1A9s&4agw z44nNPyaQZaot^za)fw*iz^WTGUhnPV<>}<>4bly5OSyqcVsOO-F3EF2TyVt%Zm5Gx zXK?!w+>!*B^SFw5czSd4a&Y(e^7V8F7r>yo5-2ux_Hgub_w;kOH+69h^K^Cv83mOC zl`DvGXcr#`Cs$8zCtpWUeS_-Jpj3F2gYzo5L7Iw~uP|`(bntg~^!9WF&k-S+54RQU z4p$eP*1I}7xVU@z_<1>lLJHM-s5}0;)%(*x_xO)3LJG(oBhJo<8 z9IM?f4t~BK&Tg*m`12fgyWM;py#2gf-F$s9TY4^uC5iT?DVfE|`FSOod8L^pm7sP@ zGTh;A{tli2zJC4zSlT-THM@8?xV!myyEr?6hT2elO;EF&r-P5bldrR@3ubf?)a>c& z;N|A!?BeDDnv+1a89ALHdJUOKrGcl9Lx7{3s~coYn?&89(N^j&ReQ9UVZ?>geba;NVym z1lqcROA|~FsKepn<`>}Zgxr$@cR0YE0dPYXT-t)mSa3H0T&MKrJy`7ys+`S<=#U-;SHMt}>zceoeGAf58;0*4y!?n8lJGeVJIr@8pN0r@t zkW@mndLoI$gTfi66*Qye?Cs*~9ssr#T6<99GjIiiD7jo+9b8@AoI!J;;Bg2fhd`W$ zBmfx$MmWvg!O7DNROExQ5!7j9hBw4jpx8j^6S#Qz1-STmL5f8rmq46`9BN>5QeL9Cp&j12VZ~CL>j1Xq=Lm(WGCk)7TB96l_F;FyuBT~-Tb`$og8rl7ia;A zOKCw)YK6TaeCkHU*$eJ#ZyyIwCodN#a7z=5^#l!Yadhx@@pkw3^~K=?WWPI=rllb| zE$+?^{vOUwz5$@VEXjU%4{&hy^K^Ff#T9Y{o$l`B;O^(+;qKuIs#vjj9y#nw^K$Z& zvymFF?#>Q=o=%S5PJTGDCSKict`2@4PR{QBpw2Wlzk^&4&d^1v_A1U^pp_lT*}<7r z@R)P)aqw{R^7r@hgf!wX5}hL?Yl55Jprs*2NRuFLUJh>V9xlFq-k@I7 ze(vth?yl}Q{0(wBa#{l|D*^G5!p_^(!PVKz+sDP31T(^mGLgo&x1@O1PD@N)JgqLx5OvY@sYcu>LF6%^>u3JhEmftv(~z8ARFfHc`l z)Z8MZE#~9k>f`6<<>lp&QVeb?pf<#u9o)S=-CdkqJsgny3@SyDLdVG+G?L)q6acC~ z5Umc^ywY6oUTj3$$;r#X!^OqN-^a@f#XQL5ExNIO4xa9g&Q4ySp;Uyi;NUGv#WWo> z92wx^Nop(I=c8d zdVf_?$5F8mC;_7Q}?v@ng=LDyg*c&KpT5_1uSpkaWwyQ7D*Kgh*M%5* zIJtPaJ9&Wzkx?vn&M(bLfeyz)hIJDQKoem_h#@d%4+j@#FE3v&Pw3DpcBexo(co)S z;Fh}vICwky`TO`dL5e0EPRHeQXHN%bXLm18AJ}LVKHCeRs~O;yy97A6__{dz_2T{TkIWiMVN)nSZ zKygt}T7ndr&Ylh~{vKYQj|TP7ae!tFQuC0;=$#xqJ)C{r!DCz~c0*UOg34!P zXMlSBa4)$yJ9zqfIy-uUvlOY?4P9IvJX}28-5s4lJ$7i01W&Pm3r+Ae7S4e!q6!AM zOPvB7oV}S0Io=1XQ7>L6%LLz)Uc7b$0M^c6WDoaRXH; zj*j5|9=Kcwv%n=5ctRY%i@|F=z+FdhS%Wkv=(x z33s83uYHv*3_tX-<(p;C+GDLoIa&ho? z_VRG`_jW{5<&s+FoLGP~Ea2A1=j0b7 zN@gcF2UmBm0Cy)hxc-2m)PlsKRFBlelvG5w!^y+J#mU3V-__j%W>RP#Xu~+BQa=Y@ z4?iD|0Ji{`N^qitMX-UNgNv(cK!B&8GfX}xwKx@#gq)llyj(rqef^!h!3sR{umz8^ zgPWU+yN{2b8$uCA=ztpj?rx60z7XGe=Ai_RuY-@Dv#+O*yBE|5w6Jk?@bhwXbo29r zxdTVgxI4J`dis0&d%&E6D`cD;9lTr|9i5y5ATf`W8{nbi>)__=?eFg64Kpklv`rjI z+S$v|$Jy7<1?py$urqXVba3@@cJ%Uh0@bz9#0_qNfKxa)XM=MrIB_G=I=m4=VA>ws zG=V$DGQiQz-`CO4+aWhIFB3d*0he>~ckpxb_I3_{u0il}boR!q+o2UCcnZ)SUP^%m zD%`yNyq$eryc~>;>`jw0OYBX-=l0l}=H}<++nb_V=Ir6%@8;<1=I#qBg57+uTUJ<_ zT2yIoT98p$oSB@M19K{9F?N8Li@%?%3rIIK(7@q^C=tLdCveE6gTjEM@B(Q-G?AQL z9bDagoE*VZj4H@(MV||Y&j%xQ|DAmtTpeBgU7W$w8OXZ*^KvRds}8{Pq#y=p>0+_H zDe@GWvzvpvM}UW?KSrduf@brJ!PC)@iFkzNuy8VP_HgiU^Y`#~gEl*`hcbA?0(v+* zXnie0yN`pLqo0SrizB2v>b8-*xbaruowxE+eH;RuTwML#y&x@2>;@y& zij-ue+M6QA9h|)#eEfa<0(`w7tvu}75$#iO!bJGW(ZSWv+u6?-ypjz$rjZ*m$@zJC zsmUc!Pa$O?7heYtUw>C0e@FB{am=$fO)V`jqsNpA;V zFLy6bUw_b?BlbK&X)OsF$@2CDjTt)RWF}=LCTF8ol>QDr9xmR_p6>oIc{3AK6;4hL zo^Fm_u1+rg4j}#U$>5SC9#pKr1JVh!o+%)}-^s@VMG^S?M}#VO2Ol^0fB<)IKNMAY zpet-Zrw}1jdONuK`g-|!d%8kYf)3PyCV2SyzX;X-4ql!CUT$74?g-V8^c@c}7K;ui zhX7|6PwxP4h=%;U_~MMxk`(Zs63D_^(4u88e-}sp0B=W#BJh4u@ZPp~&^crX>)jkY z0zg|~Ts;vAk*tR+3~+FD@pg3$@OMF|L(M4u4sJd!9{!H*&JY!_bPqSe$ol zQ%6Ve>^#_3@M1CW1QEDdfo%)|tOQ(jf|Y>70xX6oho00&ohUw=1W7gq=8{Lno3LIs2w zPEMdDHGbZH{{9Zm`H+Dy&%EN2#5|;35B?6mo=ySYpiv#?{E)=rY~R#eH>7-G05Zkd z)6>t%)djTPydW&GC^Ipy#5pH55uVaPNzB95$u+>m#l<1Gq$o2l-K{7;7qm+SvDekb z)xqD((b+k`1=K=-<_5I=jv=7dR0fCucR#_Y37iPQ>5ovm3>JEzjOXL-0e2?{e}5krA5U+T-H6D#a!X56E9_0vKy^6GO9t+q4qlG_{=T5) zk&tdbc()`$eNOHU9)4c#&K~|g4#AbhC8@dgrjA9)8JQ)i$t9&lsrJT5YtD=UTwNUf zy&Sz9d|cr+`#ZRLd;5C3`@4YGzPaY5WG3c;hFt7bK)yq)q%rmk@bGeW^6+qobPa}U zH}Z4y@pJR{bMQm#L-u#@cJ=f23h;-l!wU{}H3Az5S`LV2sK0|hxQYX{vP|tw9m68< zDD`mi^6~TY@CG~7&(+@#m#I!(4*os?&c5Dmpbd>tVJM-WGV zcFiCn$K2K3(aYPz4OUCQoMzzT;Oy_^?c@R4s|pW)Q|S1OTQPX*24ReokAthTv!|Co zXmub+xv9M=WOF?{s3D@@Xfy>?nJ)gYjDTW{TR?!TqnocUIIcj;K%FxZ^YT)2ijfRb z0j>T-F$85*rjLV@i?g%8uM;F0feeA10AOzlIs*V~5CJ3n9Natu{9M561|beNg$`hu zf|gk#j8Fk}a3RhCZ)pcHL9<#&esXdMaCG)@_i{n<6ZrT9&?*y@eCF)z;Nj%q4$6}t zN5gOcXzCprnx@XkT0u@zadv}8nzOTmzl)!fn+IqiI7kwT1M)#DlyMk=W`Lh(fLnl< zyAwPDK+b?hg1u=Fbdwcm=Qh-EkUS(Rk=+sC=Hcn#7Z8AAOi(KL3=GiB9i{;Y z>FDq1=o^5DO^}TNiN(bw8AbV}=^5bIK*C=EDz%~2I(Rt~xU~ST)~RTn3+SK$UsqQbZ%F8YTjSte6X5ZG z@EE!w$cc#2Bya}++@2uH@9=cs;_Be*;^XV+;|N;n0`(c1Rp3KKs9+VSWA5bX?HB+W zI>2rfsMrR@8DuX#cytWhAOZ(7A`zkZ5w!Rftj7=GD_;kHe}6A;FMr5%1hxRAmQ}6} zzK&il&i>w@X)ma+JV22{i@5Uf_xEvk2QL`LZWWc{%Guw+$KT&205lE`@(VZs!Dp_3 z+p*vgOK@s~v`;}wNKgNeqb#6>8e~EqbP5l27pkF)uS0;pm#@D+sH#?hdKa7w!R>Ug zL%?nT6JUpcd#vD@F|aJy)&3yIfwKoR)xcAUv!jEjo2!$fpCf1-&e0L92j&gvSt_6< z+bZa@>EOI)uL4&Bwh>(LfL#U-9dO!(*od@f2sEqb?GfPN`V4gxuDuE3Fy91oq z!5#p63hX^_E`T|Z@Np2%4xY}AZZ7W7{qA7Hz-0&69E2@kvoV4R6l{dI*uw+U#oNKj z-QO|5%LmjHgvJ(5+rZHX&e`CY0mmRXu)sYZFc;xZgdM&PZl3P`ZvNoafMnZ&;Z;aN z1fRtUIx85`gh(xlFDn7H#o_7E(ZSm_z}+tZ)B=S?9XL?IyWzmSH*lbW2TBmJhVTd^ zNTKBwY>y$>$Be`;%YvPY%Ng)kb@F!b zcl2|2b906)32fRxSnpVKB2PZqQo53SWV26Wq z1UTprT!@LdvjE%!pdAIC{!VTI-jF^P*xPQP7y%m#4hnE~2Ad6bJ2=w8ZXjd}$QV%S zfZOKo>frC<ckFXuy4juuXPQL!G z=*f%d2qI{QtG9!{ua~E{J7|jw<=#LfO8D@ip_{XVpSPE%3up!j6j$KLCoP?!cmtaq zuC5L)?q0s0p5RFrM@Mkof-`M_+Z|w8a6p3N7m@P7$q&p$nw9Z%aQAZa^>c^j6>6LB z2}(}h9?qbx4b%uDu;;*jK*WQWtAme^tE-c8^0s{Q~J^UU0 z;f6v~gH6Ry?&{#{>*?p?;pG8W4t4{&vCa;De%=8tjvk1J2=;Vw#q?2thr5%npBLOT zuqv?K@W69&ad7hR_V9A?Mz}G=KLEpR9u8if?g1{IzOHc7K*}KAL5*K82cG~BM-MM| zR1+ae(ftD2OyKYB>gvgJ9o^tz1X5rK z4{U!2&_J`hi?2J10{Fa#fj{Vk9CtToPecj;nP7}$f~T{Ohp($EA~Ay$AQsH{J9znc z`v$l-Pak#4T!Nxe+O?bFK;goPeir@nP86O24{aqXHOqj zUlbE8kQBIpM%TR^5qSw@f+bu*fP;5{pNpe2nhA!8pbT*EargCfaX~Y}5D}IE4qkr# zZtjl0h*So$#1Ijf0S=z70sd}Io&hNCG(?1EfP=4(Pk^t7D!u@Op``nq}ef%YB4$`O!Xj8VeW&DGc6 z!yPrV7$d^e+|SL?&(F`**&!4(y&8@(Hq4#PqzMgTIrfm#>G53qnazVqQAZ)VQ;Qhnt_9 zpSPo@LqKX#Ze}rfj>a@4H7_$2-XaIBRP^w3bq@&e^mPbIEd~dSy=h8*YB6*JL25;2 zG1A&rPX{lL0B1jc4;Limi8-LHzm@i;V8!sJGN{eu>F4C->+SCD5R#v7Z+j&_fi}lo(P&sMOOnlXwli%*#mT#Gi1CmAGC54ye1K}6%!GWW?ue2 zpiO2T4vr=ErpS8&K)bn}{5^a@$2#WQn-&)&Ca2n)CYB{;=70u^;2v}GbO>P7I_Oe!r#Sm@;9;O*__=I`X>;^3JF+QeX(Us?j9A&ctZ=K4Cg`Fr@d zxwv>Zc;=O)78R8ilprS@H_%dk7e{XwH>8wMnupba{=S~hULcbYNerH5GV|FMw5;8c{K4O$mikXeAp85XVqE}q^VUak%@B{&|%P(NX~L{1nm=b^>+0`$^uY*a0fa$J9xXexq&JGu(_ZcAh0D0KL>w*KW8U5 zA5i2$izAR)xIyN=pkwNsT)Z4W2R!GOB4u$`2M<>-SJ2t64t}X6<@rU~_NLh4)yKi# z4Ya<%#~Bh1rFof!rHEj53UKgscJ^`f4e)RX&Iesx0?zqG;Ihu%G(Qhiz~tFm7K7#B z4s!w>7US&c3Tm>uq!yQC=0P<;(*fwH3hrNq%yEj=gDl zQ9kH=?vl!aROm_*belXJJOVttU3?vpbb+%dmNe|);N|D!?c?L|Jv z9bBE9ot=D~krk&U=4OIcID>7#qRG#}-50bF)Wh4s5t8KXO$q7ocJT3a^z?A@frl`} zySVIda`5){^!E;Ma&~ZrEWFJG#RF(J5mEwhc5wIf^>Fd>@o{j3mF&=!j!3@rckp)i z_I3C2@`pq}rV1w)2fqLp(AMDqH0#nzi;+w+_wn%Y@N{zmr|67)ygVE|J^j5LU~3L=1+KS)lb5rfr+vyh|O(m<;Z;Yys`9o+of+&!FpeGye~3g~=F&>?{Nd1;x5%GAlj z!Og?h#m~cqNCwdw?6NV(?}-T z22P-}YMgz1ynTF8RxCl<7|<}n2o9$J2RBD2Keqrc)HP~g7r`yT)aLKt@ZD0B+KQC-1kR~v|odfU?B*ILv z!Qj3Kc%}s0HNov3xcM&r4qlEP&HKqGr=tU;e^wCH&92zHNe};18F3iitcxDckuTD-P_=UH2Mqfmw^Ku z>~ys0D#QdeSQflwm0&!(yE}lUMFLzw>o-Aj=$2a z5Fcz9*acv}foJf+DI6S2UAR5m}u8+y`}i;oYe10S4P;+C0{3NC3< zi!eo8E1;9g1_2Hp-X7lW&OUw)sG4Ao1}*z`cX4-ga(DJeQ-WB74%(3D;o|HCZUBHX zFd~nGBL|#|!SM$UIj|Tw!eFTiy>J4V0h(n+rV(@T&Y;@N)7{zC7iof*ij)2zTl1j_ zs64SOKBX8f&4RYEdw}+nfzS4VrdjZ2X>dXTPxq4KHL#5!0-Vypfdm@r0i6sFxnnak zFFhVwb3)w`U!GV7zS1f_EhjM zYjEBJ7m;9>fG4ma*ZIH-MO@JZ4*^JkfR&{d;VHX4{T*C=oqaq!!CNw+0RyfY!C4%f zyud*OPSId7aA2XX^#eEa*Y?gLu>3tMOeHW?hs;5rCQAUp^jhy}}n zy+kNAz-%`#cJg#~@%8X_0&V+-i<-E3d3n3}_wDbm@E9dM6S>6M7IZ}}TGv3hL#nUsuH^2jFMKU<(;Z_+K z`+56$`+In}IOM0pdp(Bc&W=v*?#_OYVh0>4;F=Sm!UeRI-rdc^6}kxm>;!PcfnADd z?0{n#Yyvne5zS8U;x4cRm<84gAG`zAMggAQo?einPoT*XaW?_(WJyZ0ffjwBqa8pe zdt=Kb;Nm+kKeIR$n=E9Hr=hE(gSUsLwi30QM)?`QW4mE-Jx61`Zi8 z3mnw&;U$piuHLQz-fsR#jZ1Jeg0m@D3pj~_S@;t*_yR(3pu>BuptC3aJiPq8+>onc zu=(INCD>hHPkICjG)Pp+~7ei>fvGJ>g(X`;pFM>i+nF4mF;kI zc5rue_jK~1Q8;-xJ9zl{IlFlvpAJjKyx{Kc;Oy+`;Q~2R5gHE&^TDYWsUQR=5)gqX zj}XZeDS5!-z}?fq*VotA%LRGuJ{8S(^>y&^@%0LD0Usv?bw83rKyD>18-sKp@_~!D zgNKK|pPM&wPYjXi!Pyg>TfyZum<2A2z;+^J!MPe7Qdsh`v$KPnv z1THGT29R0ax%)c!cscnyyZ9k3{|C2v!R`e|FSsZI7eEM?Lt05hmjAFAHvk>f6yW6V z>hJ1m8uz*`J>V85;&}~KmPJWK4`w6iblLOj_hr=9K zHwPDY4>vCl&@e30-cZEZ6QI5?_}tC3)FM#J7+MFpxI2KZ%kuPbM_T(ydddR%4ewBs zr=x?Dr@z0Czb|AT2smefBOxA?6v5R4ICk)-1F&L*Uig$S=uR6qSAQorPvoH>aJ~k6 z25dAq$%2y@xZMdB16z#C^&poa_eJ5c@8Sl!7ues`)6v@@G%vNHAT_xJG*$@-WYF9N zXe1FbxD7GD*$rNE8o2s8xCZ$61UR|5proAw@XkG7$9OM)r+Dy9enGCmh#j+@-VRRQ zetw`+rJQr}^S~pD5DOurEuiTl(C9eiNHCaNLG`q!myfTrmp9TN7Pv_SKKcrrIlzIA z$j9I;3~o+<0}mWcU|BE=5n3=iKtA&J_VaM^b3)AxxO@a|9>L~c<8u@964PP54TxW$ zJzdyX1?ZSae_wZ3HxJZ7Y+U9;6SteIgNKJ}fDd^09<2FJiPs^mB$&4iycY@Cx<$FdiuEggU`!>mf_ga2muG7G-V(u5FV(m&JLbl z{;uBcu1G^XV9$V4Bse?~%^O5c2B&72SD{`+8LKn^`yRd;$fWr!G z5ja8+AxUQJxqCY}yZbu(L6?eyOCLn^Ba8> zkh}r13*1Nm6JSSxor7phKw=DLKIk4a&@O04Uw==O!Vq~*3sTB~i&ca^C(!X3?q2>b zs6_%HeXc$Z0q%~DPM#j9b7=UB5(5`E2Oq}(e_wY$cbv|IPVj=(mcX0|N@Sjn-cHVL z;3JZ0P(-*oxVd=yxT4%*iyqjZNC9sd1V;rpQGlyPqMAOSQX(%uB{e?1D6t?T9?V4D zj^*s_5a8$I=7Tc0jm-_1$qeK&xF|SRL#j(hNAO50xX1*T5AfR4(9O}o&Ck=(2h`L7 zX-CVp;M@e(2T5okCE)yw$Wq`W4;BL(4b}laejl`r#MjB)-3_$J38a}4^TF-_=Qa51 z0Yfie2VZwrcUNcd{frnX0_+;FK2qJE4v8B`G^OUH6o6(M(F$-ER|gk2FGojjsO8{f zfHq_W7K1n%rTj1pH;O61s=;{L9_y;b*!FdLpg}}}O6X0SFT$-W;5p-87 zxN8C44Gd<%7rTPmtiCSZ-T{8#8*HGpDZ=OYLx@m3fT9kRm*Bw#I(x?@z}?Xad3!WY z+sMhjaI0LM9lZS9T>PAohqg#dWhgBKa7aL01h>P()xq7@$*nw3 z;|RXd(9w~kT#40aa2O$)ZO)z!?mpg50bY>iAuY@g@bmTy@P*z1OOgeMm_nor^m5D9 z(ILRi!{6H#I+z1)DIscRaKZ&AL!6<3umx5MAlkc#hyY#f;OpY%PiQM4PHWIo1;Q@4 z9iZK*p1%Gbe&9Rz2yKT157>i)6Wq`Rdl}3H7p!0}gOf3QDJiJ$>g(v^=I;!?Vu1$c z`#X4p76^il#RDZXa6yBuaSQIxfZYntZD6M(T#a5Dz{AJQ(*ZPD?GfMt>0(gZe0Ns| zS3fU5XFqSq=nXjSfQuk-^9EcwfnAMAjbI64+d}T{4(mY%O}9a$r*g6JT!j63c(?a@D8}ihDd;*xI%4uAe4eV2+mWmiF{D^0k#4KOY_yu z6SRB5)iuBg>(CVWfe0SuC@#p!EGbDXf;7&c4QH@SQf6UkVhW~sPC*)`Uoe;*fTZ}92A(AErE zz5$0NI4#2B64B!X$0@A31eb82iV-A=)D?i|EEjhNch>+{cMs&HQ{bT;upQt8j%eM3 z%NF!p3Njj(GZ6OpJ9vUN-+Q}5CN;qc3!FH?*$kZQz^3CYMZsPHI|^nQw!+%c!OP3p z**5@uZ8bFT5IVu-1|;u*T#Y^^020IM2vFZGH!(gnFFi9a6*1bng%*j8{zfSm~5X9VVgw=jWoGQ`>N0CfhRGVAXFzLmq# z5gbQgZD1C-{0C=tu*u+H1GB(E4h~~*I~!~=STR@@QDZp!JNUY}`nkD+Z*ztQB>r>( zix%ROBFr-e=6*h)Lvftl91QGD42|tg5L^2UoqZjAT|B-0eZbdRK^sC~4;0uDxSNW=XPjs^%1tPUI_Rp7)0^D*c+F%K7K z=Kv4zt-{do1y|=_zks6&tQj0HU@q#C53nTIUa$smMg^-yZliiS_&K`!c{(FUA~^EF zy)Ur)!66Agz!NPYf`b!mBE)uBkpgZjgDMS#Uz{C4OM9H%!N;9L{Q{m@2Wv+-5^N;c zxd<^-U!kjj+u`Qx06L)6*%>*!sBDKb$c_L%Pe<@wHI9y8e}laM4s396VTo>dfPi8c z678^51EaB(yw3g(0Zxt{e%{C(2(VdTi@*gWm;k!~>=wA;U}c~&x{G9zAoIE^y zU7V0dgAwT&94X+yr;2TEjt+kA9!{=K;LF^gDT07)C_Pnhn-ClhV2^{tA6!j#l;BA?@QJ!0 zbKt?~?(X32J34wGo$5X4LL0dM{rm;^Zc2Y5SsyE^!I1|v=g zG4XNn@bPnY_jO22DM5CMtCzovm$RP(Xn!XxX&achc=&sIcm=pQ9%tg^7~taU z=n>$MQ-W-zQ-G^`0O%+x&tRm(OH7DUe`+!ap_eBT? z_$IZ{(!P7a&1!0Jnr-!RAXal*Y zyC34z6B9RICx2HzZx0900A$r}uKupR?k)iio*_ZrFhf9h9r^pYxj6YjPX+@QIN%}z zJgx;Uj-f)rfpft7(vSa3;*@B^ZzfqB8u+1($m?& z%f-dl1#%rMv?>I<6kHd9!veJp1g@ySDGAI1#}?QXU_XOS$w!o1=rPw`YJ0bdncmBp?Q-z@7v<94&Eym4I^-=$^pDl*ED(@YdT9@OE>1Lwoz& z#Q2mV(DM9v(0>2;g5=!zw4%h^)Z+MJL$mn!+~UNPg5+EW2TKP_2K(gv)U-51N;Dgh zsTq7lr=c?_hCO|}Tmm42N8m;q*x%q721g<|I>7}4*z@2xg%lB>8~|2_k_})d06H+( zXXd4(RuJvL%-lq1uoRc17LcwDJjMYDd&iu_aW{l08Fx}Sh6!(nsf4Z2=MiFcX5aAjUd(v@Yn{}gAhmCtH4TFQ1l?Y;Oq#x6UW8V z4LW{Ef%y>6fKwToC!GBq+#Nk#z5Jj@$%C6x_#+zTYFsf3@&zmhftwWYYxF>|;_l?` z=jIA2ZHe^}%tmMtj#3bqfvkf!R}Gzf9b7yE-2MD~ARApswgM?Np#_zbzk`nx=nMr9 z$gnZVMnhr&#r5E`t`VyTK(2Rkb@uUsHvOq#1){EV_H^*}1>KtG2WiBDa}~JY0~6p( z4KB988P5$Au;8WxSRJ_OfN1c6n+af9c-Ie9Xt=q$I=ebKBdtmWkI;j&F4zRHkHD6I zHG@MNEDN?17SXtp7QE1K1|5Fn>+a;_i8N*aE-Juj7tA8jY>;2QC%B^&!|yv@uw4n1e$RO#&Qt z;E`TLR&#N8@bvU_cXjcC^c}z%8ytTKW58nI5*%zDH~|nDYVeqF@^tWV^KkNZgkGc$ zPAp*0kPtTDY=EfEUA!Hf9lZlw+@MpG-~<9L`N8f4v%sMQwhUnpm<8?zg98#AEMQN8 z!wa!B0+f^eyg*$i$fh}Pq6CKn*g&w+;9+QRc!AAAG#6lTj4h2K3U3$C`H`-mGld`x zad1$Bd#7M8fUN*q26i)849o)Ch&zTH80>QjlAS@ljLhWB)Vz{ntZgpHF5}dA@NF%r z#qsfJnH8xiD6KGOUk6VY4>u<_S4i^(+y?@?18h6kF<>q@F7bI9mT6!#q|66pCqyI0 z$=|`(33Sh(3#4cuE5xDIBuW8_NHk9V4&MHruKq4=NF_h1k&4XX)slMzyvs*fmvW@fTI$u1e`3u1URC> z@eben0$POU8Q|{f>H(eN0y`fq34nbAwi9eZF35%8xJB5BV1aFikI{l=xcxodJY0QT zAf-Gww7{+b6JVpkrh-!pEXc4WHbk-R=Ir3&>+bCB=8M#X0{aW>46qBpEO2nZ&BPMP z2(N&rfWYM~B2l}zI=H&}xjXszLrNNIhmDJ~gO8)XzZ3Ls7HS(0y3Nqt$JN&v+GhnP z9dJh+94_DxLJ4)s5~`zvi=&snw~G@bu)wx~o3G$f5u9GYr55VgCfL*9Q~)_o0h~U- z?gN*2;G}_QGk`aCySuwNAump$#1cfRhEEn5x_CNxIQzN#I3ch70y_kpT)-{_r#5gl z0Xq{Mj9@XaIr3#=Zj9n2!l8kFIDMCsw?>EH{x zHP|2dm<6hbm%D>AXpNVj2h#K;k(MA5Avg^{nuwtC1ss_0i!MP2clmnzy8D4n9S2F1 zlDder!@$hlEx_L~z|je`=ETh2!~{{|xOh5vy7_oId$~eN9I*A^iVEyvaE*eRuEEg< zPRB?|4CHcf8G|QTfcA|BxcPawLJMTVR)JN3TeaYH2TqG%7N#vA2Oup6arSrc^znCe z@^*z3&R~=9dJF7&u;B=6z||{Q46Gl_g5Svs9-;H~clY*mg)}?d%Z04Hp47=gvW z{zR;@a`AL0~{b=!=X#B!RZM$a)#0+Ky3Q~9W~+WHvg4K-YD8x_h`FUlxQn$cT0U+zuCK2XAjLKQGwuFW3aUc7TgBa8Q8>aAaWhAlwco zZwGHjS63f@NV5`b0603p2?$(@fRhb4NWdWk4l7s;Lz_(C;YCEj1->1~C%_MM7$PXL zh;%sE4zT55*Msc^Cs%M@2RAE=92k;|l3}gzocwg7coXofLuO8XI!Y(k+tI-VbeXD$ zC!~}Cn_&+rGr_xeLP0JA`xk5**j_N#9xRP$KY%M-u-m{cvPbkgok8cBc>1^nKnE+p zVTM{FgG~en8Q21_F<|?^sT$n=19K7S4y+ET`|Ro9=j7_=u}MsR?^J7y>)4Czq}_l}Fd zgRdj#_(>Y$k z5(Tpy^c6E0PfR1I8!u)N>_$+{{~ z8k~@;92he5%2JC!hgT)RicZJ?2B`G+b#-T?f_x zCLk#X&*q;@Xo; z$l?|T7KTWCLjxlN6F5H=q63`|5k;~u)xb2-BGCe&&e$-;AO*=BGh>TXV@rfQ)B{k1 z5aNkxhAAdU`jU-P(+o}F@@Wta2)?1ErKM#e5UsPeI}* z8Cn`6>`OCENit3`N64EcTNs;y;;$$*F~`9;&D_8uEy)NWZ=P(JY?_S3Pf1QQMRG61 zp9uLx5I}NIlBt17nlVBiHKGvWDM`sm=1GR8MrNs|21xFKMi3-e5b>XuYL;kVnVOQ6 zW|3rx?0;wgVyI6uFf=hwOob8%d(&{4V`*fVmSk#TVq%nHh=}*JG_bfCn)%S=3l&AA z8xsQquzGZJVB(nO7~)WGgklBE{U!#+IK)kGiCY?^rNHCI#K7DV?q~yKcPD~{5%wgd zAsdJgPX?I>Pmd-BDPVmt0`??i8LSh* zPfG$77*%9(fH6OBpTrHl9UEf09TKrd`N;sKPZa97^WU-9Nat@AFK$;-ed#p`7_x7d;Ul^ z0HtR{8iCtq2J#-*|HY}vrA3(~mGQ~>`PrGE5UR+{b%0q6qe04%F++SjvN96`NIrzo z#)$AhQf3G>4TDBC4OTgWbB2L|0Zch4bdXGgCJ_Tz83s+V;K~(ASrXJzQ1S*bVdV{| zOhqU&gyd5LLugnTLKB1$s-@;oVN4pu3y{QM0LmdCE0JgvWw6A6NyC+aOu~)f%0MRI z#xP|T29^ei21y3V1}O%q1|YA18Y9LACI+SkW(J^285|%mX_#`TG&m-V3_x`$SXr6@ zUI?|+m;it&gO=`);?n?Lt-$y&WuUMyFfcI2LBo_KgTmgz5L8-%nqTNNOc^w?!EppK z6^##9W|EYcmY8Ooik*flgS4fLQ?b)9WoZUR7KUl&#yDt%vP6rd6cgh#1FSS$nW1Hx zVN!~58g?44%oyAbGET!z!eBX;mRPv56k7~G+bGtxp9iQsc{;18m#1E_mU(D*QA#)(OZ zW@fOG$N*Lh!f2Q>P^p`0U|@oShAD%VY$iBpm@;Uv!Rj(}8mi2c0Dvlk)p+P}3H3NE z79iCkq9#D+LrsIE513w1W<;<-EHq^><>)k$GLRH53|D4hfDb~I!Rl&UG+Y@pd_nFt zFfhPUb%TmQ^cohO4>c_r6y<3K2DoULGH8@1j)#55Y%M29rjo8Mpw3MAIn% From 8bb8344ad624e5c57c65215c94a43de6e39b2aab Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 25 Feb 2026 19:01:30 +0100 Subject: [PATCH 556/766] xar: fix freelist_push_with_index using freelist_index_of which doesn't exist --- core/container/xar/freelist.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/container/xar/freelist.odin b/core/container/xar/freelist.odin index d6bdffe22..c2afca0d0 100644 --- a/core/container/xar/freelist.odin +++ b/core/container/xar/freelist.odin @@ -29,7 +29,7 @@ freelist_clear :: proc(x: ^$X/Freelist_Array($T, $SHIFT)) { freelist_push_with_index :: proc(x: ^$X/Freelist_Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, index: int, err: runtime.Allocator_Error) { if x.freelist != nil { slot := x.freelist - idx := freelist_index_of(x, slot) + idx, _ := freelist_linear_search(x, slot) x.freelist = (^^T)(slot)^ slot^ = value return slot, idx, nil From 61d53212dd3ffd45a04999bb9223bc325e51a47e Mon Sep 17 00:00:00 2001 From: Faker-09 Date: Wed, 25 Feb 2026 15:41:00 -0500 Subject: [PATCH 557/766] Handle map iterator reset for reuse + fix example (#6335) * Reset the handle_map iterators for reuse * Make the handle_map example more compilable --- core/container/handle_map/doc.odin | 4 ++++ core/container/handle_map/dynamic_handle_map.odin | 3 ++- core/container/handle_map/static_handle_map.odin | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/container/handle_map/doc.odin b/core/container/handle_map/doc.odin index fe4154774..16b285982 100644 --- a/core/container/handle_map/doc.odin +++ b/core/container/handle_map/doc.odin @@ -24,9 +24,11 @@ Example: hm.remove(&entities, h1) h3 := hm.add(&entities, Entity{pos = {6, 7}}) + assert(hm.is_valid(entities, h3)) it := hm.iterator_make(&entities) for e, h in hm.iterate(&it) { + assert(hm.is_valid(entities, h)) e.pos += {1, 2} } } @@ -46,9 +48,11 @@ Example: hm.remove(&entities, h1) h3 := hm.add(&entities, Entity{pos = {6, 7}}) + assert(hm.is_valid(entities, h3)) it := hm.iterator_make(&entities) for e, h in hm.iterate(&it) { + assert(hm.is_valid(entities, h)) e.pos += {1, 2} } } diff --git a/core/container/handle_map/dynamic_handle_map.odin b/core/container/handle_map/dynamic_handle_map.odin index 4024ac5b6..09ea92f82 100644 --- a/core/container/handle_map/dynamic_handle_map.odin +++ b/core/container/handle_map/dynamic_handle_map.odin @@ -31,7 +31,7 @@ dynamic_destroy :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) { } @(require_results) -dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc := #caller_location) -> (handle: Handle_Type, err: runtime.Allocator_Error) { +dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc := #caller_location) -> (handle: Handle_Type, err: runtime.Allocator_Error) #optional_allocator_error { if xar.len(m.unused_items) > 0 { i := xar.pop(&m.unused_items) ptr := xar.get_ptr_unsafe(&m.items, i) @@ -137,5 +137,6 @@ dynamic_iterate :: proc "contextless" (it: ^$DHI/Dynamic_Handle_Map_Iterator($D/ return e, e.handle, true } } + it.index = 0 return } \ No newline at end of file diff --git a/core/container/handle_map/static_handle_map.odin b/core/container/handle_map/static_handle_map.odin index f308c5e95..fec1e0662 100644 --- a/core/container/handle_map/static_handle_map.odin +++ b/core/container/handle_map/static_handle_map.odin @@ -170,6 +170,7 @@ static_iterate :: proc "contextless" (it: ^$HI/Static_Handle_Map_Iterator($H/Sta return e, e.handle, true } } + it.index = 0 return } From 730f417ecbbd01b9fb9d1550d061d4ea225b415c Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Wed, 25 Feb 2026 23:02:14 +0100 Subject: [PATCH 558/766] Fix MultiByteToWideChar usage in utf8_to_wstring_buf --- core/sys/windows/util.odin | 48 ++++++++++++----- tests/core/sys/windows/util.odin | 93 +++++++++++++++++++++++++++++++- 2 files changed, 127 insertions(+), 14 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 8cabdeb04..467bab214 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -117,23 +117,27 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ return text[:n] } +// Does not null-terminate the result. @(require_results) utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { - n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), nil, 0) - if n1 == 0 { - return nil - } else if int(n1) > len(buf) { + buf_length := len(buf) + if buf_length == 0 { + // This case must be handled separately because MultiByteToWideChar would interpret + // a buffer length of 0 as a request to calculate the required buffer size. return nil } - - n1 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), raw_data(buf[:]), n1) - if n1 == 0 { - return nil - } else if int(n1) > len(buf) { + if buf_length > cast(int)max(c_int) { + // Unsupported. return nil } - return buf[:n1] + elements_written := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), raw_data(buf[:]), cast(c_int)buf_length) + if elements_written == 0 { + // Insufficient buffer size or invalid characters. Contents of the buffer may have been modified. + return nil + } + return buf[:elements_written] } + utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf} @(require_results) @@ -146,10 +150,28 @@ utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> @(require_results) utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { - if res := utf8_to_utf16(buf, s); len(res) > 0 { - return wstring(raw_data(res)) + buf_length := len(buf) + if buf_length == 0 { + // We cannot even provide an empty string with a terminating null character. + return nil } - return nil + if len(s) == 0 { + // Empty string. Needs special care here because here, an empty string + // is different from conversion failure. + buf[0] = 0 + return wstring(raw_data(buf)) + } + // We will need to append the terminating null character. + // utf8_to_utf16 does not do that. + res := utf8_to_utf16(buf[:buf_length-1], s) + res_length := len(res) + if res_length == 0 { + // Conversion failure. + return nil + } + assert(res_length < buf_length) + buf[res_length] = 0 + return wstring(raw_data(res)) } utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf} diff --git a/tests/core/sys/windows/util.odin b/tests/core/sys/windows/util.odin index e2ab9cde0..2d1bcc0a6 100644 --- a/tests/core/sys/windows/util.odin +++ b/tests/core/sys/windows/util.odin @@ -31,4 +31,95 @@ utf16_to_utf8_buf_test :: proc(t: ^testing.T) { res := win32.utf16_to_utf8_buf(buf[:], transmute([]u16)wstr) testing.expect_value(t, res, test.ustr) } -} \ No newline at end of file +} + +@(test) +utf8_to_utf16_buf_test :: proc(t: ^testing.T) { + buf : [100]u16 = --- + // Test everything with a dirty buffer! + reset_buffer :: proc(buf : []u16) { + for i in 0 ..< len(buf) do buf[i] = cast(u16)(i + 1) + } + + result : []u16 + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:], "Hello\x00, World!") + testing.expect_value(t, len(result), 14) + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:], "你好,世界!") + testing.expect_value(t, len(result), 6) + testing.expect_value(t, result[0], 0x4F60) + testing.expect_value(t, result[1], 0x597D) + testing.expect_value(t, result[2], 0xFF0C) + testing.expect_value(t, result[3], 0x4E16) + testing.expect_value(t, result[4], 0x754C) + testing.expect_value(t, result[5], 0xFF01) + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:4], "Hello") + // Buffer too short. + testing.expect(t, result == nil) + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:], "") + // Valid, but indistinguishable from an error. + testing.expect_value(t, len(result), 0) + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:0], "Hello") + // Buffer too short. + testing.expect(t, result == nil) +} + +@(test) +utf8_to_wstring_buf_test :: proc(t : ^testing.T) { + buf : [100]u16 = --- + // Test everything with a dirty buffer! + reset_buffer :: proc(buf : []u16) { + for i in 0 ..< len(buf) do buf[i] = cast(u16)(i + 1) + } + + result : win32.wstring + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:], "Hello\x00, World!") + testing.expect(t, result != nil) + testing.expect_value(t, buf[13], '!') + testing.expect_value(t, buf[14], 0) + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:], "你好,世界!") + testing.expect(t, result != nil) + testing.expect_value(t, buf[0], 0x4F60) + testing.expect_value(t, buf[1], 0x597D) + testing.expect_value(t, buf[2], 0xFF0C) + testing.expect_value(t, buf[3], 0x4E16) + testing.expect_value(t, buf[4], 0x754C) + testing.expect_value(t, buf[5], 0xFF01) + testing.expect_value(t, buf[6], 0) + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:5], "Hello") + // Buffer too short. + testing.expect_value(t, result, nil) + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:6], "Hello") + // Buffer *just* long enough. + testing.expect(t, result != nil) + testing.expect_value(t, buf[4], 'o') + testing.expect_value(t, buf[5], 0) + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:], "") + // Valid, and distinguishable from an error. + testing.expect(t, result != nil) + testing.expect_value(t, buf[0], 0) + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:0], "Hello") + // Buffer too short. + testing.expect(t, result == nil) +} From 334a554de314ff1926dea35e9045ef7796f1414b Mon Sep 17 00:00:00 2001 From: andzdroid Date: Thu, 26 Feb 2026 00:30:27 +0000 Subject: [PATCH 559/766] nbio: fix op re-use --- core/nbio/impl_posix.odin | 2 ++ tests/core/nbio/nbio.odin | 75 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index f76cf2849..5a16efbf4 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -1154,6 +1154,8 @@ stat_exec :: proc(op: ^Operation) { add_pending :: proc(op: ^Operation, filter: kq.Filter, ident: uintptr) { debug("adding pending", op.type) + op._impl.next = nil + op._impl.prev = nil op._impl.flags += {.For_Kernel} _, val, just_inserted, err := map_entry(&op.l.submitted, Queue_Identifier{ ident = ident, filter = filter }) diff --git a/tests/core/nbio/nbio.odin b/tests/core/nbio/nbio.odin index 6c3fd0e8c..2fbfc8894 100644 --- a/tests/core/nbio/nbio.odin +++ b/tests/core/nbio/nbio.odin @@ -256,3 +256,78 @@ wake_up :: proc(t: ^testing.T) { } } } + +@(test) +reused_ops :: proc(t: ^testing.T) { + if event_loop_guard(t) { + testing.set_fail_timeout(t, time.Minute) + + @static payload := [4]byte{'P', 'I', 'N', 'G'} + sock, ep := open_next_available_local_port(t) + + State :: struct { + listener: nbio.TCP_Socket, + accepts: [4]^nbio.Operation, + client: nbio.TCP_Socket, + server_client: nbio.TCP_Socket, + recv_buf: [4]byte, + recv_done: bool, + } + + state := State{ + listener = sock, + } + + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State, slot: int) { + if state.recv_done { + nbio.close(op.accept.client) + return + } + + ev(t, op.accept.err, nil) + if state.server_client == 0 { + state.server_client = op.accept.client + nbio.recv_poly2(state.server_client, {state.recv_buf[:]}, t, state, on_recv, timeout=0) + } + + state.accepts[slot] = nbio.accept_poly3(op.accept.socket, t, state, slot, on_accept, timeout=nbio.NO_TIMEOUT) + } + + on_recv :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { + ev(t, op.recv.err, nil) + ev(t, op.recv.received, 4) + ev(t, state.recv_buf, payload) + state.recv_done = true + + for accept in state.accepts { + if accept != nil { + nbio.remove(accept) + } + } + + nbio.close(state.server_client) + nbio.close(state.client) + nbio.close(state.listener) + } + + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { + ev(t, op.dial.err, nil) + state.client = op.dial.socket + nbio.send_poly2(state.client, {payload[:]}, t, state, on_send) + } + + on_send :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { + ev(t, op.send.err, nil) + ev(t, op.send.sent, (4)) + } + + for slot in 0 ..< 4 { + state.accepts[slot] = nbio.accept_poly3(sock, t, &state, slot, on_accept, timeout=nbio.NO_TIMEOUT) + } + ev(t, nbio.tick(0), nil) + + nbio.dial_poly2(ep, t, &state, on_dial) + ev(t, nbio.run(), nil) + e(t, state.recv_done) + } + } From ffcaa3830c4375d20983bd5fc41b07aae897f706 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 26 Feb 2026 13:44:14 +0100 Subject: [PATCH 560/766] Update miniaudio.lib --- vendor/miniaudio/lib/miniaudio.lib | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/miniaudio/lib/miniaudio.lib b/vendor/miniaudio/lib/miniaudio.lib index cbba9b7c8..f63ddf09d 100644 --- a/vendor/miniaudio/lib/miniaudio.lib +++ b/vendor/miniaudio/lib/miniaudio.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b164c6fd0ac696fc72a8f25a099b24550e2d50192171ea92548b382ac99a625b -size 1880874 +oid sha256:6225bc2e766dd477a5f06081db81027cb0666f5c20feaffb0ecc382376ac6c3b +size 2948310 From 275ffa1a0e4cf890b0619978c24b96652b5fa675 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 26 Feb 2026 14:12:30 +0100 Subject: [PATCH 561/766] Update SDL3 libs --- .gitattributes | 2 ++ vendor/sdl3/SDL3.dll | Bin 2788352 -> 132 bytes vendor/sdl3/SDL3.lib | Bin 283572 -> 131 bytes 3 files changed, 2 insertions(+) diff --git a/.gitattributes b/.gitattributes index 527697c7a..864b73592 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,3 +6,5 @@ Makefile text eol=lf vendor/box2d/lib/box2d_windows_amd64_avx2.lib filter=lfs diff=lfs merge=lfs -text vendor/box2d/lib/box2d_windows_amd64_sse2.lib filter=lfs diff=lfs merge=lfs -text vendor/miniaudio/lib/miniaudio.lib filter=lfs diff=lfs merge=lfs -text +vendor/sdl3/SDL3.dll filter=lfs diff=lfs merge=lfs -text +vendor/sdl3/SDL3.lib filter=lfs diff=lfs merge=lfs -text diff --git a/vendor/sdl3/SDL3.dll b/vendor/sdl3/SDL3.dll index 510825b26ac432445d6b5bc39d54d4bd115132ed..080cd755da1eda2041cfb8bee4806122d82f46d8 100644 GIT binary patch literal 132 zcmXR*Eh^5;&r`@KDJdwn($`PVEYZzLE7nWTEXgQM(o4?I)h{kcP1Y|ns#GBh+WurM}Fwm2w=^&@FyI0JU1%s& literal 2788352 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 z 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

      QB!lU(ni61Ea8-UuE7RGNuU13nOLIdop`H&)! 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 z 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

        UG0WC@uVt7%zfE9F5 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≠jlop!GhG>Y95XYeBg|p%bhf+e&8CT` zB?29NAQu0&gHVMn2TGN?+x~!tuzF)uGQj0g8-p?n=sckk(BLol00M}EJbL?{fE0FL ze(^H|=AQd6Ans{oW?@FAZ?at@$JouLN zGrxc#=B536%1I#98?DTr^m!m`a>L3D5$vj|WuX8F+SI2MK9- zcAo+9L6g8QzOyhe>;hG0e!VQ(F5Ra*yU)CM{OtdK&xaqgRfik=&fS}l^G5mplQML9tR(=dK`QR@+*r5 zzaEQbm0&49DCjgmKGX#H(9gByTd9FZcMrIq5Ai9;hZdk~6+t7UAdUvyuiT)tw~Y~| z-mjNMAMACP?o%(`KmGsTgSlA1qdPhPv=E+w0pzPzEl^tobZCiZ_kU1f32IpRbpP57 zs*{WlfVLihR;jzFfYwieECiia44RJi>^=jUD0nf08FXyHIp6N1pd)Y3yy$rP|NqNx z;DsFd9G>0o0idAtm+d`+BJr=(1m)7f%@&7E#W3`uV?acYOe;G-{ps8`RI=0$vyZs)Rtr5NL!E)ZPJaiv|^+j`5J9@G!qTL!lTC z!wxYXhE-BL4EEwY409!U7*2>o_#iP528n?>6rjF0w7(BtCjnbbSY+Sg;1+n|5 zXZJqH$kzW-(3tPC%|Z+>91pQDyj%mS5qo_=2YAg<0d=)}yN|s9ZLxFdc9(G62`VSS zOJKUsy+{PFxNsMMERqAsfY-XZbo<)4bh}zOc8h^R&Y{~C)MQb3@#x9_|KL4^_Mm#c zn*k&l;o02=4yx7zB~c#T5dtt9&bf3u3wU%3zxV@QJ>|>+N%zN{1wi&dMp(g@{B@rL zjogCb0i0Z4)WB@H3CfiaTM`=T0~lPoKbOS1bh~H3tN?X;&b^oeHs3t~BI?o&UXJF` zeXjfR|HH@KGeEX^bh=z|@aPV&c##iQ+zu7IbHF1|p556Rp54W;Mf%X$5$OB@sD!|A=t|=oP$WZ#g&aZC!Y@3!Z@t+12-Kbp z)&X5K0Lk(fT)N#8TtR1B%?C9@UN}Ge_TQ!ZgR9Y#?iLl$+IH)9P#3#YqV+(XIB0|~ z102o$pbj_a0(oY~EsWhQDxj8^tI=EQc2E}_rnpB1)DZLNZU=YBEg4Ig9k()ibhm># zJfM<+#iiT905kw4ZfEr91P37KgfjzI{%y})`M14y1m_$N>*=6oT!}fT5e`ZR2B5Jj33Q=@0aPPo?0 z+LR0>jvl?!K}`YI?$aRaEI?iL*^eNdA<+GVFn3shYY^}#0eq^q9c+Ya%af7s`A_M-nFC@lRwdc&A}x*2`DJ3z7I(|y44|Hc2u z9Ie09T=eKZ>e9I!l#oECfab0|KzX-txDAx)>o@*B z(2_RKZV?se@Z1ZTga7|KHos#mk#lVR$5;X??0(jWGQ0@c%fj%ooRNWH7wCS**R0?x zP{960b6E2~#yTUFxsgVi#z{$npQh&h4Ot{hA9xw|=YR z_UvX+@#q96ZP%9nC6W9B?HS;f8ff7W==cVK{t6`)2GE9A(Eb$Ah*JQ+KzoN03us#@ zXmuO|XbK~NU!Z@65(@)JzJOn|2V8xCqXfLJ3DhNPeOs#G(LF^4G%D-U3tJ%713qll z)%d^*@Hv9LYru;STwDHwMwo(G9Cs9eOUkn^4tjylbBc$A!dY;f!xP^Q8L%owAILH) z$N!f=tuuZ>XBK_|UjcqWZxMb0R|S4SXBB<{Uju$YZxen2R|kGUXBU0}-vE9=?+|_g z*93k+=M>l?$vG;Ztt}pnM?k>`S`Y;pzXmOe2UTQHjJlqq^-`&`NB3k%xp1jO#iiRx z0#b5&bO&*OCMM2+vnY7k$8iTpDSI5u17#ubw7x?0VUO-f;M%XbN&~W2?A;n6&^=lT z(JyUwgJzGxHbAJ3wbQ@cW(E!06cNfpm5N$PiH55UoE6TKnPIebbR&kP&>w8tBFo zM*)xSmyY~`jtU^c07N)|hyW0g@Zy*p69fM?&@IphKvPoug3R4+5}nRG;9>gnpkWSn zkM8N9F!;>=+;-3WZQz)gOnJ9m*|#=ffwwS7I^eJvm9q&V0hs0 zay=+LfVj>a3=9qqAkhO3FTpjOp9M%=>&X&1&@vD~@IjiOEkhtR3mjh8gXji_*X1DE z!Qpj2NHvIkz~OZaWF@^fcqM&_OLLtC6G*m{m0#oFYi53p!=L#D8M^%?8h?ULWhv!6 z4ziuW;k9<-PtfKZsDOjRYbl5f!)rm1evs)5j$ok%`_KFW4E%bmTx*3Gs+dZI`1M$s zAxw5qYtp3DD2+eQpM_uJFhA%5Z9#8|H2%DB4$xKF{Lz>AHBN)(b_722$ALOJ!7`v} z9FcB!nNDXNkM3637zX=iet`gm*Bqbu1*Qrxf#>Yp75McJmFa>;T=XxLsUCL*Wo-w3 zjYFUL1^g90^GAYi>%IlD<}<%wG2-ypYOi$Vj7qMI%-1)%KGsl z3C!w#@xl_q`0(PxK}Lq|(=OcyUW5sOm$}+HcAtCU1z{UHcAtOoPY^7w+I{wgF+^CZ z``il+2$LVQbL9?L1^?6okd@NtBMZ<|pFlYQf<2nwc(__0EV1?I_VfVt8ADVwz$Fu? zjy3_+S_+^h5@@N24QSxY0(62YXyYBYXzT!WWk4gm&9EylJ-Uy;_JD;#_l1GVALw!l zpYDs$aSKq#sHGRQVxl^L!K1T+gTHkOhzDCg0XlL8v^vn$_<&DmfdF)P3p|_*8pZ7m zeGXduZVWp4;JZhst2k%@JnB-3Zdb_sxKDEP5zxY=AGSW7uHV7a{N0m5Z3}*v^PQpp zLDvzl?*^&p3|$T$7j)??-R#p@I=$0%zDuX;;?CODFRn3s{qNBo%;C5bG#={G?JVKZ zeGas-WbeQK|M>-cmmhZq?_%-j4c+e2S$dcsycE~VsB#8}JMI+JnZ7T)MkK!{{#E&5*?hpsE4X z7V_wIl?O$M2B`fC8t(-;2UbW2gYPU+{|Bl;&mDIL7tk+e+yQaXS6cdX7F&S2N1&D0 zps_gtaL)wN>P2izeH?qZo6Dyc>;@_usl zh7a=xk6yP7kIohq@cd@4TLdUf0=kcam##QA+NglGUUjyBS4->w4TyC^4j6OccfHZ; z$mqj-Z>CRYjEaZ$q0Sf;hl@X4x-Wno*X_>n{{Sdx4ZtS3bRXz;XPF5OR?woD?i1bY zGeMEBeaN%>{KX%;DnR3tQ0rW}PwW64#l-J=0X*C+V)P<}5#lE;kT2YM{vQCF3R=Q{ zfq(sJkK~g+%pYN{1)W$4J~;!)TNMy*fgAg4#z#0knS+G^N*afWHMa%m9kEhJB#%1%{IJZhs!6UDZgg z-2C*)dtW?*X|tfEtK#Sc=!ycOjiJT z3DSQJ4F;!Y_%Q(;9*u86O@E){rJ!P*Kl}jbTCZQAvuAv|KYDaCd3K-Y7j)g>(HpwM zu^TiCc7k8f^@dM3cyztn^@c}sFKFVq`M}KXsh~cZN2l+J&d>|ZKN!oA_b8r#?NPko z2|kP^bO(5C6KD_?)Jb75{sv-3fF{U5Gr9?&#crLY4KCe>J8M+HyJ&Ji6K0@=oh6+$ zDmCER2|8N_8W!yYUBA=oIsudlEIfK!K_x4Q4VrfWS8y62V?m{G)ua8Oq*e$Hu zETF6Db3sE?9-XC2j=L@Z4cvM5iX7{#T>~1sv;dvX(^e(OvU)}&6QVO%zw*x%<;@RB;UaIEN={o~#FnDSQydKiQ6SCIL z6Z={>m~7{kbD(L8?#rNiZ>Qk2qQ%b?iRN?{=c~TZz6)_fOC`0POq` zU(k%fWzfRVp)h4xZh99>-lleK`iubR8)EL3J-|2pv>c z^n#}UTvRkVOH@Ef!=;-UQqMx1_~O8~|NoDJS8h1|2QM#lYzEKyD3pR`gO1V9bgE^?h6S#Gq0cu!-7NQ5hht|OLJ*YfHoL3nDZAXIpY2dL| z(9jZSmdj-xBzzJ;=45~`OM7`?4QK^*Fo#F4vjoVg9-whYNO*yKK}^ux{RIjd{uaDZN`w;jf^X?w-el$@1aRVf8(d`auih-)Y7!_C*cmYxc zhNx(O>K#xO#15_z6|@h5>$%_vkp2@d(xJA34jTsB+6}6+5f+1bfk+mE>Kl+o3M{Sw z=|Az}-A|BrOSC+?+aQtV430D~2NG$Zo)A(P9|rRw%Tgerj@CW`#UFUVngqCFfi#p1 zpxb0zjh}#9NWVOiH-lzfK?f!zfCvQ;p#i@87qqj@#bPmNHns$O0OP5Ppq2BLppmBI zbA%XPyjsP=@DempX$pvA*weBjy3YoJk!Z%09A@okZXv~hhvS0A{5 z&VU0Qa12_o0WMqN)8;2KMHyZwpZM|rbrI-9o&=xnn|g$T~%Ip9og04_FS;=x-p;rRhlUVt`gf>x|A@MwGkG94PGFLs^z|KFo` zH)vYZrTYWu_}`WnObiUoyBU;O7#R3lZZk1}7o~$H3A-=28vh5)&w?she$74Lp{(Xt zjQlO2;e9Xz6tZ9jXaiOAFUArZk6zwq8KMj?3Rki)@M~;Q0qfO(=mkywgA4`@n}ZzX z*&PiZHjj&sJ^Yzp!1Uo9AqIYpV=o#FSQ+>=et?+IbXXbq!@;{sHTVTmRA8sG3goC5 zeC8K;z^`$hKb+T~Qiy>+{L*KBftUQpo;>6~_V(dteu3wo`2}9U`22!k9rYn9KKz0y zDhjXNKsHv-5n_1V17g*JSWWzhQ)9skeLzRWf)9=b+sz+-5_&i+#QJ&{6`wTzylznV z`SiLrr19smd-R4L01fRJ&Jkkp==B8+?}+k({1pxMgbwVeS<&-{X*l{C=@Aj3p1phYx-J}N2jJkf7I{$<|Z|No5+ysZC==mk1}R*XQmm4Mc;^0$DBQjhNG;ATbZrIH$t=KY|? z1Vc#?IHy8ZrGZYY^Xc}$zwpfiv?P!8)o-3rh}Cc4WqII?4J8__*qIm@O1Yu?;Ep+@ zFrt*GpbIm?3} z+hOHTeE#3v)1+g;1KkD-n&*RQf*1fAgoPOl8iGH(gOh=Q;V}60hr>JA!E8`0gEq;& zHRoaYY|g{*)0~Ilzc~*Bs|61Ow*?P_pal|$R6jt@9|zaz z;QK8+F0g=(VJ*?~=mwp6dN2ZXn#OUTZcdNx6X3&VDn+_4fLlB%5SOabLIK0CG6qIMq47huBpzf7}x>pQ` zd(%Pg1rG?Iq)(6JgP{9_@BMpPj1OoZHt)K883teG z176)M2R%BOyt-WuLZ#1u6DF@2SU*ccH_Jg3)6an9eR^5H<-yE%IUxYGKmu$5C_PDp zhC{Es=v|}Y09t&}_y)A%%%}UKWA_h_?o&S9zl?9cc({)na^RB!Kjgrt3ui&Q@Lqsc zIDlFgjWMDOFM1ZSFuc6M!oUFTmAuGRVq$P?+y`1X2R^+Vr0(QYA%+(zAaxsHSD<-x zZczaZRd=7?1zOVfVwwPGo&N_9(7vB$(3+>-01nU^#~7gz(Uk~!#b`fZ?{yq=wGp55m_=YQ*i#N0sVk1Ml*nFSubtR9A7 zCg}X}yPO~<_=r)DURHf}5YG*C{2|D~!3Uu&dryJIpmRY$qc^S{ z$6Z0iPs5AQ<)F0pB5o2d1L$ODpI+Yyoo*5?pw6?PPj^s3_XXrdxACt;8D1<>XJB|~ z$Hc(!-E|FU90Yu)$ZpUm5WmZfZr3v_m`Zs0cRk=J&UEb92kNgFgYJs%0cllV3+f2@ zarpGs3HWsTs1$TxZa&2VYLghW8~|I&$nSC)dM+twZA1Xbvl^gdRlCC^ATCh>k6FZm zjFSMlWD6+i_VWIDDa!C7eLf4r%f+BUjBb8VfP27(>p}G={77j-kls6L3=A(p9b!<+ z8hlc20Jz!(?+yoxfrmI`JwP+RPN1!O;PDGqklqC#y*40wL9_p$b6G&`n*fjA&7Z20Z5{NU(n5gU&FV7U(gR~i3MmOf$tkj-xvH&zAw6Of(~$8wTlr_ z3@A<#VsPm`{Nm?%7KZPx8yFav7)n?iI_i?Z`wqbaico)bfQE=c(;nUDJdT6&5U6wX zB7h6D;E%uix<~SH$U(U*$6oAi0ZrLd@_~ad3=~>7RT&umA8-E8Qgo@?RipU_Q;~{C z^FB~+V85zI|nZXJ{S&yMaY8Pl+79>5Zk&$5+=wK`m zr?-)j!LwT)#Jsc<>aU+KK=tS07mgQL7&b71Ci5Z14y1?zjSYh4OFbHofXYa4ha(np zb_S?|29>9X{8$c% z)p~A*6^td^9^GeO#BBf-3?D$dOaeSwzm+H-clH29b+;eOi%o_M44uvzpZNvcL|$B# zhh=zyH2@kHiM(Aqf`|%fHqMAG{9TR3BDdmBOWxZ?v0|h^#Hgb)XTg7F=PvVeDup2Wd??0 z&WWJAd7F=bG(mzDPNK%A19V}MNB5^)paux|z`7SNI6<`)Xh}|qtw*Pufa6Y3E6JnV zU%=HEblnCh^)q;MUjQGB#t6Q@O#yVU!3)qv)RqIK;Hw)RbHXkp3jhttKriI-=xztE z0dGA}!tc@PYyjhTMreRlZ2&Fb0jubaQ2}k|aX>WXz^deq5 zC^1074QY}G8eTb|^K(m7B*Gm-piPVBHx54CD?zofNB6H?prKJn;H?H-DgZrVA2f;S z(#`K`{G_>Fg~_q|q(^5vXn4<&f69>;Mfwa3-ToY|-A6!!`ySnwyZu=}18APzz5?J8 zv_j~Vha)2cL!&*YH1O%I=kVywXDJQ+%r781wHMU)1Wh118}Mr!I_?Y_^;%9!rV4F1lJa_O$T7E%i2ZXGkw@WuWWOV@SoITK_=rLyx#%^~G z@D#;N$L^Dmfh*8J7IX>*G+n)14^;5^3V8Ge2O!OnbRPlxV``3 z>@ZP=7w2ZMFuZ1i&4k3L6o7Ja1!w_R1897=`G^CgymO3!B{OJzm#Bcxa|wVBuln=` zNp#NvkMKEm{{S5>1sePF0JSGix^y~mbXM^kV`AuxVsYv866kaic`;QNl-v0riLLvx zPxnkvk_4Ti-~;OThp2!iJ`F&V$e`in8Wjb{|Cd`2R6@#4h6j*x6KS07=mwn+1li-(db`96H13rLT2RyLt>IxgAC##|c|E$F4Lmx*dGNIW zX!AwuCD2`wAVDVskM3XtkJd{i?4a#>olc;k+!r#in+ZV^tnr7>IDqethZVP=HQN`# z6*72)64XvIF#ZqP*#Rl2Ky|c7CwRuuqq`d%W@y_IcY_7HyFo*m82Z41-QA$75kn3v z*bSa6#*hQmpdOH^W(+w{Ja|B+)Zj2IXRp?rv}k6twLS6b|5X$~-!Eg9W?0 z!R=9WIj~@NH@J0*E(aFu?gq70G3)~ic6Wm&$S~x5a@u~2+;nF|Dc^{pb7=n zrh>K}JS^9Nf(3MV1Gv5cj}3vFh_LnrsNG%SV3F+sI>rr`8c1b@wAlt~Ja{o`i76;^ z1cHiyUhjYxpeo&?*Sq3{JxBzS7GEecgDSz(FQh><>?|m7TL#N2AaKj33ANOXWrgQkB_sKaGIwcv606!03Z&H(08Kj!PP!Jk|hOUdni^As2Ko`mqMks6XTJ2GGLf z|NsBjdvt=`(%AvY{T-m(4>ALsoRvy%@}opo}&uJY)<{6hCD zXu_?O#puB698llcN5uft8U#h21G7Je@uf~56$?ni(1h8ar_)Ep#-rO?0k$d$TrN%k z4ckB(w2)IlIc|XN%NA!~cr5{1#O?u_s|0z{vlDbLu|p?xmI>Ot=&k`zH3c|=Cz+t} zlcRz>Uk93M2$JyWzWAA6fcILBFavm1Wu%jgXZH=yaJZ;P}iR>7>B@;ovh4&+hA=`6Dla z41p-xc7ppOh;``TGY)ac)ff#b0>SZGfSsCOJ_Mxw=)Om$_8hiPIsBka+PjpflhaW zZfB8BcazR?n{H=`PIr%PXBp6`2c7Odo#i1O&BqfwnqM-O?y$aEtK!jooJadr_t|b{ zkKSmGPWLY!z4a2^&VM@HA9R+#0IPcfYOaBLGSHPb;PscFwO^pT0ID!RbMp$Iu8Tx) zD5z)Q(flT(y9Io%4ERnC$Wb$%-7i5Q?A!W{-?asNC=6&_WbzBpSd@ZSuLwB6J(;h1 z9DKz5;${&eXg(@g!l(NLXe^W4qxnb%=v3U;=)>Jpz-!1{jW2cgsDPSDzOA6MUUXd> zK~rnDUHDz6fRE4t^)KF52{V8OGC?i0?k(Wmai9iXg7JUQ>}&*RAOX~v0u3VtfTs~l zK+{5+WlGk?s{ z&!7e1{2E6<2kKa|I39Nd^)DDc^T(V8$#}AW51vs1Z?*K`*E#UniC@4)i3h}Y;oo)u zluQqRbUX1!x+t+6e8AzteZUctybqyDf|9Ze_d!(2Z6{o~4}y+e0wrk%*G@;C5@{Fy z^>e_%?wNeLn?=&G(@_Alby1S#HMiq&N6=;l2GELa(2{f!csTrdEr$q)f3F1*;qd=8 zi)(M}e~`~X0nq}Ef27cWoLmGtSqM2u93?=$;*azJhY7fu0uK`zI){l0wlD#Wz_>ue z1U%pZ3lkl1n6SEb%e|IC1PQ}yesGYmx$tk31Eq|+qy~rqa)5wFO%RF1gw6qCgDpTD zkP?Xls3e93hzmGCK$(RFIgv0SClW?*B4H#oOgxaoBmiV7Jdya&IZQ&Zg$Za}9+pTz zb9JDM11$?3n~$?V3q!}|qb#7z?il0Qd`!Tz`Cx)a^HC0u=3^`#&1+OZ1rZ~EYu9g3 zU#Uh#19XG7f~WOg{$4N8(rM_aV6c+1dkwgd^6ib}00+CEYd6on*BZX9Z~6PA7#SE| zKZT@8SN`ohb+F>fjei@DIVe${ckDh0K3@x7Tpi?x6jz!^#g+39Xs~OtI6@8phK0KK zANq#6GfRn>3;+6ap2;V{C6zO1X9hID!COd>1N{GSXn2DTD0Ac&bmsAFJ}dzW$)1a# z_4FDwphI0iM|C-X?f?n!=}u9J@aV1qZExQKUX+GZqk$?>Bn)o9fci@c@Xjf?vkK}o z27)@KpjH=X2Djxvi3z9~Sz-+q?F|li0m>{b2SBTg{6Rxm6)*I`Lr(lt!FRnvW||L! z);fW@f#8{Y@CpEwDQ8&!&r1Sy*=y^`5+QIK%>gu%;eplx1WAF;A8!D)79IazIK~WW znZbJA5Kn>q18y&aJcV?=SVMgxL#YVZ?V#C^37}Ot|1W{t>yX90u66*8 zu|kg)w#@_$G=tWtf!B+J41!$n4O)Z(F6Ke4Dn_5~37`cNkme<1cxvZ)$nX@BX)js9 zCq~DpIDpzaB`Q!mpyzwSh7KCvfLfu5A!m>7`JlE1sEN<+(LEnz59qRV(2aWFev(6i zBj`%gO2~2Pzs`v=yqL?wz+imfWjwg2>M!8Z?W2<5(hWL5CIozOBFORJvxlMk=sbEM zs~ACDC-8YTpjHLMGZ0g^fJ}9Vn92z?)dMtO2h|5UDFnQY(((UA@XVAts5K3CHtGyj zH^`uW++gQ{#*w=Dz>Rp&$TVo)A%NMB!*M65&hGS4@#yvg4fVP(`+-{YJ_r**7bIpl zLXSOFL5K_bbR*`%G|z}KyqE&E>2)M10A3t__Wyr(80h$xZWomR$DN?5>25#JdQS~d z2LQaJU*W|eGep8!F}Y>eHgTY3lv?R-O&=B-Ng!?-H$Z*bk<#r!;oeg4pbbtKJUk^G*bUld6FW@`3jc6H2CEm7(fH{pz{~H&y}*j`2Xhr|JST9R)9J2~&USl0!^nr{o`gHDQ0H-r7!;C(V zVMd?M-JpqR4{W22KApQkqm4eDyFqIiJ+KWr`gHCF4LbUCf-kT3z&7^i)43ZISw5Y+ zA;+y^8G`ib+zlFn^y%CUnpW_@HWKO6xf?VR>C?FzG$Z7JZ9vkeb2oTEvNu@4r*k)G z?gJ8FpkY8z>Vjl&IdCb(-vV+rcuFSiv?#-ijT{UNFF`vCJ-Xp>qyUPaQa^)%4Z43Oq}ZqT6mxfkm1LBiewKE1B& z&><7hb-BvDcU*X{g*uE+TWU9W?7qwx#6et)4o z8`M2L@q&3OH)v&Gd#CI47t_ms{olX{%2A+DM{KUba_1i?e?j_#pq&K*pryndq2Q&n z@I4tfp?9sp_ZZ#u>0Su(l5h71pYB&aovHUdx<7g*?+0yC2VcF&z`*e0GIZZLFX%98 z(71gtBLjnP_niNr!pf&J_PVF#od2MdSzP4Xdb@5Sh`;K z;CDR?5&_xg(;a)=rTZ|*(p=AOW}jZ)=f;=70~`vVS*6oH-2o9`11sD;x_zJffG#h& z_JTz~5Ohh{b;vMw!v9OH2P)J-MuE&xb^PBB^1Nd+I1D(7vK)_t1wakc*Rig~w?Q6u zY}gOF4v?WVz@t}m$#GHWx!b2^v4HOWz6}@H2@&`N7gzxiFgyX%GJO^cgX6JwkZFt{ zH-N&+)%c`u_hFDfK)2RG)8YgL@X+@qP%E&d5p-L!CghwFk6zJ93qJn`^_mMjcdT9o z0iXE=Y}2!a8TiA$@yoY>9M9m`UCYqx4mmwZ33T7sjP9N$hE(VRKF1xP8pg9XRKT;h zA5>nw@ZkYnK_zOs;PZckxu8+6r=W9e_yt@A9Qg&?K}sEuwS!0W9FMhw$MRkt2CLZS z%He3y4%#(R!tdAtW;h;e2M_weZR7Fm?FSt^@!}pg*tX;I(QPXSn+2 zNax`iLC3ste*_DA@ar6eaD7{!fNp*OpM%z2!O~s8@tVW2yI#SuyIjSw8C--glqxtj z@AqM3U|=W}bF|zKs$xoc9WA$mwx5-9J9Z4T1!(Hr{S`1WyEW>9Si zx;nKp_J3#X_s-Ja;EdJ)S~UYY;sP2^pe3pxZIC&}&-{WVDxeLEpldu!R20BkCV=d6 z{D0}?eb5O|-M$>2-3L6oYXv;MKlJJ~G4$*{@6-Lrv-_&&!8a@~oCHC)J^W`Xk^jsu zz~<4*QqQmFa_j~4L?}1Vc}d6KR56wKdNkKwX8_sk(Jfda<)x-itOmqi^s)b05H zgiH6S{}*1Xdi1*ghoygyUKR()z0plGUiw6X`2mma29PN}ki%&}`3oxf8@vW7Ho&#JR0q7n7<6A2 z@_|y5K-)?|6^{qxK&dA1fl|dfr8OSC?upvk!C0FVn? z!B^;jLKNYUwyk>4Lsllh-J3h1Yg2-G{*J*9u@|;7~0QL{@wH|Ap7$;7c+aK@soUeHIa# zzTNM9x>N7_beEQUbeE=k^on}SMlODQyK@74I&YoPNf zPB#9M;3(^;k0^0y{8htP)={F=_)CVVtb@N*5VVK5`=U=T>)-w0yCaLdgcx3GR&{FUsHvz6K-)Bq|IMeX|!P>IM@1Th7AJckLuP#j z-)wXuodiY}??FWW!$k!_q9-7tKjEUkJ%kuuZi0v+%zX+HodXel3s-v{B-#cM zMYwk-NVEVViZFLENHhu}iZHhqBQPCJ`hmQO3e>AeD#V zS}G62n^YbKrZgS~i8LMty)+&Mmoy%Rs5Bmif;1k6wlp4wIcYo$o6>j~PNeZL+)LwO z_>#uMz?II!ppeePV3y9q;FHe7kd)5Dz`)4F%)-hh%+4V!EX>IzOcCJb;pO8O5EO#; z?;-2=J-UB+bl-fDeFHqB#SI=Bfh-yU_oq%H1YUxskD(a`)ZRs%3fu{rYWC>91w9VP zr@I`ymO%v4(i8Z9$>TWq_C!!~2sCt{3mUor4WodM3Io@Buxn~TnH#*D3Ngjy(LEd7 z3u(PwD&x`1%bNz-Hkbh#UIK4Fbc}mBqlAT_!I}Xy>XN|UvJf<7-(0Q0z~3?r!jxd} z=q;8gjqUapc(DewFu5DL(8s0QnWH7EFhApxz`2HouktL{N-(Yl>^ zK&zU-4O{5Zx}1AJ`+%?Qs3?ALy5oC!lxNsDRd5LMIvzBgaqk8w2>D=r3qA`E*|d zHA7k$L1#r&dob{~%mg)wx|u*1Tsb;+A3!>8*$8yFGU!4QCD?Jxk{}V#amxa*Css#0S!El&RPY}nQ&J=l5uS_`#$5;EP#H_!vC2ANur$s5tnxUINek zSGu+ysB`n}b!7DIKINl*It_k*fFu7lhyRZJ+dP0;#k1Q_05ok}0GhI{09}d%YJGujR{@nlE}b(79NKKnEk0G;IoUBU{QajF2#h7^GJ*@A1MBhUbc zE+}va4tE626a+YS-*g0>KJ)9v$xGlGnG>`r-Z4Ht`mkrWzXIqgTZ7IT6$8j9b&QG$ zXvJQRN5p>7VL677f@XQ+MKwbXzN39Q* zN?RW)mGMbF06Hf*`Irav;EG3o1sGnt^ZOsPKE&^TsP$W&HRw!gP^tr+T$21E4ZME9 zr~4>KTle`FoBj$gcqF^1ICwJO^I-k~zUJZ~=zt`U7Eq9(l{@gNa^)6Lh8HYf{{Mf? z=6H-9G=k8YW1K=U+19uz>a}6oAT^ zZa>f>aSPZP1_q!!hMspm`~^ikf6FCMj&bJchMZ~m{{SetTY&c3R6x=@_}l=4Zf6cq z(eeMlOwihE=m`ZEK)C~yY84<#A*t1)HynIY&Vd)bU@JZ*UTA}DfX=}og$DTKfdJ6FRtdPmgKiYS*gu342`ZIsaW>8t&db@-Z+CY8H?Ad+K zqcgVNwfmh*XKA``_cNc)((Ry4DDocNZQwR+^FaZRPS#@2iE`U`k=9|O&Y>UeawgB@eJ0HhZ*-ogo5stFqY0@s#^ z#iS5h*jy|UJW6drdM#Wml08a5w;Y4)0$2KIS|BTPp@SJn3s76XmFT#3yIXklx^DOB z^-Twj8!LEpU-Rfb|00eBwB?1r#S(JlPP$Kb>UI}v@CxD*D^NS%Gx;jGA28)QsP^~i zhSlfrO=dM4MHya{fB66Zqr4bFnD!C<$=v4!3}3g5f((h^fc^5wO$DQyv?)o2W{&81s5PjU09elKe zt1yW7nO}f4CsK$3bj=>Wpzrn1{Begq^9#DZhU8{Ya(DcH(WL|IJ&)dUf!E9)-Je}7 zwu1(~K?lWfgU7sGEVhHj#2xvk9s_O3>OSVv-2sYe(518Bfp3O}{h(O|hLU)fZgB8) zgJ%r7r~uX0c4I>Xc*Xby$g~A$16Sh_P=SjW$U{DH31ce*_`D_X+3g=eEm_c6LO()5buY>? z|CcQ(EDViSpiNky8r+~%!1#b;^AAS;DF^-^aO`A!&D&7#!BE2Pc$^V3dhKrjo}+Y8 z2>{jBo#3kV#rk8Q3b`cCqkAf>P!Iwf*1J^Nja!+ zg(J9C^dbT*jMPqq47GHl_yF2I1RWT`1#VM;PK{uN91{U*m_RYecd-6^^P7MMD+cgT z%t!u~O`u#4+Ih#{vK+z$je}H4lqPn23A|YH12lz-It~II{($a!0(GsCcRitufIwE3 zu&;)!EP<{}Zaxwa|8n&!kil#opaXZ;TDU7M1vt)e@D87*U@XbfS-FKw*7I61@G`|6D z!UYYFz4Yj{*$QfxTZizcl!Ur;pK85S!s7^v;aEq|-OzTRiU?ZPgKt~|RkEN)JJhWZ zDUWVn0mzOBH0jP5{S=VP3_zm`$Oqp-j0JfIa*-RFK1e0s0D3;_vjU!e^wB5FX9XT9`L~*-~-Q?r6Fmd0JLTa)R0byfB8Rwg#mP>)ae&b zA22d>H-nlrwxGo>B}%potPDaWpxkQ}0?NIhT@KI|ctZTkV+kw_yC$$OFo0L=zhFNP z+7Ay|LOzj+fdT0}ApY=^upJigqk$l2^K_pE3xMtcj{%jOpgUS%=M)Jx_<+t<67W$m z00}$r3wFeS1Oyv$K$L)wN&vrLM-8Zs?`4g20bTd88#J)w(aG%5%erGZ=yE$}0gqnR zSkRphoz9?B9Fj~x%A7%`IH-$&n9ZP$h(|B$PtaPcPG`_54*$SvnkRtrV=wCg8?Z7^ z;pfrI+63C54cY17(aXvr1(pM?H1p_XJ!S;vffj&!^s<81xp_eDt@Y?-jbi%#-=ou6 z!K2ez!=slq`tLUo*TAFG*}|ij^-L$&t)Md<5+y-~ID^h~Xanu)?sNv7>0k}IgtxO9 zw5q_PmsM90qy~KHyGJkUdtopSRKI%kvTlU%K#M*+dRZ6igXKWw;tO_=$=$3Mv}G7} zLAD;B_ULS8U}Ru;vBrrJBvvK{+QBs+%#jcSb0&c~3guul9q-QA~O zWP>=MK0Qb#4#WZNodj5haEuH=9CHu{wB-ZD(Q;yBFg|eH-32sm>Cx$K z1Ky*vSpwubJ|@s+{|X0?xkC zZj|&2?%NbV`ZkcH4=ueR_e}_ZDlrMrkcI+cKXT(61Mn(T@Rnqk?nm9HUN~fch9J*$ z|9Bw=VYzhwc(FPiBKYCOLn!OUi|tU>ix;`+j10z?JdQ)IoB$Orjyphi;)1Rzas{7X z{Z#gU|ibc`+NrJO?_O_C>&U(6wTqLrYCww19-qf`$)X zRDy*;N^D-}ZvX!uw7Zv7Zn$N(0Vxq&u(AHBz6a=r4Jd%hV0k=xk{AbMN8F> z|HcPimwP6I&-L)^?gg)h`hUpd;3Jk7+fIWr_yy4J2Px2!H&8PMH1>el?P+}AwY6t* zD|nq1^8uGml|!IAH9+b-lflP;crc&z=yW;7;rJh{$g^`Q*aGNf9H7x;P3-?c zS#ZLmm)BZQlmXOF?5t6V@aZhI@aZfy0387v03s5OyQpL^Yy@w)&tcfW!0^H+6SP`| z_w6}Bh7MN+{%tp2+_C}XP&Sa?x%RUAo!TNbGf@EvJrn_+<87}~q7Cp2QWc(8F_7RWn z6E8klgN%QGr0_ndcXu1ob%I#9OhA+YG+yhf@#3&GsGbKMIsmg4)P3^lb(1hY>Cr2C zWrZli|I6U3z99om*&x@{Rs8t>vIBJcSg)%FSlu3Ub&t)qe+jy(=D3>;DDQc8_kxQR@my{O z5B^;b8uQTu?#-)%u{K z6+Bc|!P{J`!BD~uvV{Y*0?r4tyc%?&r@;S9;8SDDR){jZ_?X7R&~kvkWg@7fvyT-t z09&iT;L*!#u|$+%2WW}#ZYA)ES2v6=y*QG_!r;<<8dOdMfEKNJI5wYT^yv1rXgT1~ z+Xm_zId)$I6&4OI{H~`xdR@WoV^DeE(d(j;0h$^E%?g5!lmIm>Kq?g+|6c)zkUMxy zpb^MTy=6cCznl)9M)wo&>2u9>s#rM|1ZI( zsC0v@0G&A8D|&G$b~`jdI*x#JoC9~LeN++<<0s%X&qxlk0V$piQoInnw&g5%|6BJ7 zk6zJ2Zy^T99SjZ(3@_X|LFJvFf=4fSw85v>E#k$aFi>ZMza{Zh^oDNmIPSUu)UI$fK5*O>x<%CwQt$>yfL0>^fDefDuA}z2)?{i%J2cV+1uEcFzrxSHb45Df#jL zCFq*BQ798T?xJD=^4D<}70_W#pj&o8i!nhoXoV!h ziw-LW(BuyI^d}3D(?Oko2IIG&W=)Jw_vy|Yl@L&RbWw=_x3NH1O@nfHfCjkug2wnH zP>k0W{rLYnsvBWB$P9xQWtLzY6nuKUIl5g`96%+eLZ^$04#+kY&`h%j*id0aw8Dq; zi$Lb8g3M(Ct=WxHDS%8FXCp6z2ls721n9nD=sg#pb_(?Fiw_>%;QNJLjo*T<7>3T5 zb$5co2z#M`tYiaaVp&5q#WL7*t-qxRU+jzhn2=)&u-g4|e*Bdvy1KYmU2V z(3+!|&8IV09AuOdRvAy8O|Cg7+i`e`Gz{|Wq>w0~BYeThL`SyFsUuI`X^T_2~9Z_vv-bhhFdnTOHDR zphEwfYd&L%CP)EPvH{ep1Dz5ED)-dDl}IDVi6R9*{=YVE{tda}>KZ8R7Y4B~>}O%9 z>hSEAQSs+6ey0} zCtgT^P7Z9YQvlrv3))M+!BL3e#pXa3hL=B>85mk`mr8i_itYy0R=vDeKyuSTa(6&y z$8_!i?-Jbw>S2Nl1<=ebXidwD!}~#n11M$ix6Ef|VCeP(-9G`o!U8-y(aqNBd!aM* z%5hiF>GllAUGIQWZ)fZSkK?XSKuniT*B{{9kV^Q#w;z?TgYQBr75sk?bQ!?If1q0s zd@ppmUg_j_+z%=Ux?Qhyy0dhX#HG{qjZ3HNm*cJ< zK#iZ~A50}IE}gX>e0tqE9J|kW^oo7}MdWW2$P~kCQ2pLq&%sct=-KV3;M4058pZbL z4ZQ$LvE9(JhQH$psNn042XB;;2M;ZK^op`Ag+%bXCKiTnHq=v-{xL8x9CNo|^yzhX z=ytu}(JT66i73PW1CHHiF23k=z0mD?<^KT?>&lCKs9WM8ZgF5Jm4&*+0aPEMxuqh; zqdVRKl+dPwhowDwMUO!fT3QomHJp0@#Ge;H{uG9q%?vR+fT7d?YIXn?v!P3nzAYAI zc%hm5_XI}p(Ws4fpuV(Aw;M-y7>f(P%a3k93D@rPFAjvl4FTVpd4ork;RUxp3&TrL z{o&X>6_lWjZ+G)~bjF@|G0B*Lq0@DTPp`i~x9bg`Ue_I+u17qMyY2xM?;x*2?$HF* z>7Z)6^#FgzTm}XPi+GC?8<4b5ufK;!cen#cCnU-t$||a$vJoEL;Q<)3F&6O&CF%SE zt~@n!D1)w)WIyh@zz|ZxfznzA$Z~FJ!X08D1B{L}xqboWU2riovU&L_pj0 zBDzCV0y;xfB0x8e1ia=1i3N0rfVv<4;MR^Ac=q6gOZOqr`m}(IZg(5dtTyOsPEfsZ zqxC?g0k}|hnGag;mG$HQ%U9qGdhSKhkN^KcJM{QFzzwhFdIJXjma|aFR7D1c7aLN* zgD+;y^%l&a8-M)`x~GGj2oAjlkS>rQ zvQHR%7F6rW66AI#WS_1F>@FpxT`X7*B!Za_y`189iO`FapdCdpU2k@x>H;Mf@KI`r z{kXrt3(g?X<_(@}FfjfGs`!wPt19LI?c~A`1s!4qK2`}uE$Ezm@R3R=q6!|}-k>AD zOHf1|z~_gzoRIw|Bvdw>v&coSq%$nH6k!5e86D<3nXyBdV(&B{o&E=tpP~`pnMAMdU$KNbRUO~ zw|iuOOf>+Fk3)?1{QvL_^n4zVZV#|`SUkE99`@*V@BpO^kgYKJ=86D@5;pKe(BbX| zP%eO|0J{g2;}cv#;|4!nTMvMbw{hvd)jb8=NOa_%a>)3Ai}gu*zF zznJ)44*GCk@amPh?$He1ddR@vDhUbz*!m%U@Ui=#%9+8j`vj;dt^;a|g2vk!8Ng#& z7NBbWxQmJpX!HVf2>$>7_4VLkcN@@pL|f3@h9YRVtDb=g9S8*1Rg?d zK9UfB7<8u64iF3E z#O_ldo!p>Fm6M%5DjHxJ4Uh~Zk2ixF+n@pv(sS+rm9OA2nM!G}JHJg9Wq5Hh6*OcC ziZjqc4;9XmY@_@sJ4%1H%i?fB*kCzhLBV*~q}a(ENh2 zqz*(lH~(NP0gWZiVgw&wsqylmI}1a%6N_UfL$?zTGl=29;n?lOq3y(>&E(kWzyjug zSUlh@>l%l_0uWgSFdHNZ(!-1!B zbW6E*N`R7;L3b1fvy@|J1P5p;P@%hu#j&%3rQ3_AJBWq(qGM+Ok8A765;ezeE=T6m zj-4Ei-CQ8rgTt}gi-q~TW2XlTn03mr(}M>Tj0T{U$u%kp9?eHIAgLEJKF$&D(f9_` zT=wX`>0tE#1t_9GW9)}enA%%0}$Z=A_71}0*EN!7la)81foIh z=NAHrkgcIFqCi_ieN;d_QiB&&w!i*^>S9pc?7+Vb)LRF+9W?oO<_s)9gXT~>zynO3 z;6*teogD&93=EwepzTnd9iSVKJUTl#SU^GopmEO54ha?phGPv1EDQ{c#~Q$O2Plj{ z5doP$2nz=vzEuES5)3|k3p{xMzI+H&NP`<;ug!!Qz~S=}wDPf`+Jb?<6|`v>e9mqw zXe7u3v^XBTs{1)eZImku1L)!uZw?R85?4@%0pxpdLFNzus$tzYe0se>o_7GN=yv0A zH9pYkqT&MDz=ZG@As7w0sAJm=!S>V$P z>8fjZc4vdH>5hw!JM7Wzs{xsh1Wg^o>tOH&;0B=4Dh<%mQ_$s3-7i`XR4Rei7lVp+ zJ`ea_c%RN{h3=~!y}S=+i!!|K0WHXf9G%qZtO2_F2y`#0i;4l{a4iea;aV><|AU6U zy$gI>PnK$RJF#>+SD>Fmc4ZUj9$e=F$Qe!iEq4Dw7fG`53p&?y^S7QXvFkpFwDQ`Z z@hA8sGKI#U;FHKC8h?UMA`@u*32I80a6qP`U-Lj#1iWT(;oo+!+l_^Py>o>N|9Upi zIb;VtlTUa+jv@mkHPBIH-W8o38yH_6`iHnL1DZZcR3t!^0I1mq-X0G+nGIYsfi}I1 zgO)UOpL?MI8ei)MZ=3`zop=eZ*Uy4dAE@H$%uxZ?zB1qiTN6OTfB!E*t2B@92^Gu? z3?P0tXh72VEhx~DS}C2YLBby0-QdALlui8}ovXou-QA$s8Vr44!EW$PJQ#A|Qo6ev zlzcJdz=GY~pdk$mIj~@NH)v=8Lk=w1-3_kk(cK9a?Cu8jUNH251-rXJJ8v=Mz=GY~ zpd~;Uav(v=)u2XUT|)O)kM6&qQwtF5#XY*4A@fu|>>MDyqTtX6pTi23>C9p0_8*`z3O0~y7HpG}G)2U-S(bQA!J9Awn9 z8#FiwavO>qSg^ZW0n}YZ4@aquaXzL$t!9yBpNq0!g6Q2^NH$V}T(D z8c@S=e(q{e(dW_K4IV^7_di$=OA|I5)P(f_S%czYP$L-J3quh#0Owh>26MIstfWLy z3uYEWa-amNEt%dj&$z@u|Dq+VMM>fL*Et_Ig@t3mbJ zi~ZLGz&o2dS3@ee)!+(lHKc-D4XWTkelQ0m@!k*>1%3h6vpu2=kVPpz-5wI)dyv5E zUcE6o4cVYh12~ItzDQR9O_^qMKzmCZFT%hA+MtCm4xp9>bZ<@b5d&zo3~EY)F-m_3 za)1t~-3)8EgEAPT;SLUNl$Tc7F$*8gm@F^^oB+XbKs8<{@ZAb7cp3 zkL|7wQHB>sZCDsyP6s8qZqT$>x=*(Q=q?D4Zr^l|)|21?&?<=X!yx6;K*}Mt45LSH z=zpJXNXx~Y!>8A`ywmkRNU+--+-`AY_Biee9#r=@?y3yBH3BqH0}gmtiv=>AFcD<( znaCgiU-B_BFo2G&?{z&6u1Zh8VEqCLasHMsps5ts-kRC&)u%4 zJ6&IQyI$^e{qE9P`~J8qXtO(mCwOWLG`$NtO~Iqr^*N|jC%4xdyzS#iLiWKj!m)&~cgx;F%tN%@UOW$8Nh`=y4xOAjP2LJ~Wm? zH+RDh;0P1&?CntjcNSw#fYyVEy2gC|4?5*T545bEU%(A?%0~-W1>Auk2Do?dk`t_G zn;VCtMT?3e#5)}j7F-eBDjtwkpeeK$ACH5rx)lwv>M&>-F28^q4?+*9=L1suayj_? ziL)>I<}!lL?R66Y6;=){2THg=3kDoss3|crfDZcz6Y%Ul3p&0Ke3Gb-ii>Y|h>8a2 zjLpydk*7X`b%CWlAYy_(DlTAAj~C3~Gkh+9h9Vt2LH81$^6BmX9n<9a|Kdwf1H!kv zj>FaXq-S>>Xvcyla~X$c_chQU1bDjDv->QF4W3{HEkXd5k01fi92~Hc7b{| zKHcYiyN`oX1@pWA|6hWZM0<9}1%UisCgIqf2RXF@bk?ck9#Ddt06DyZz4-@oY1Zp_ z@TnE0iI&+qr7@rR1)L@L^^R2qfex?$*&Sx!+U=&}+U;lI+8t)&+8yWM*&Qd~aqulGXimT#ajt~TYeNsq z0E1E!7fTO|Qau;T0Gm<`7t08TQY9Bl2c1%x&-?-o68w4xtAt9yhfH`N4w=~LYJ30` zQ>~XgyRVh7zW^P#@>BnFzFhMb279t3d=0WUai zd;@8678&?KWS~Iw z=xzhMp!GnBxktBy0HlI|Ou~bDMxZ;hz+1CDx&t^sCsTPCUwU!jHN=<%Pz+}`)LVeA zPb!h|=yvz$4QA{<-5bT|(dlx=!K2$9bOhZMhu6Xl^$851Lf$>2`}F_AU|G;Cu?1)m z5J-)RflK#k(ByyyNCZ4@UjU9v570X6b1!s3b16)q<^|N#y>nDR4)^TN*6{2uHt_7O zwt%g}i-C=INPsVX0l6C7vVh&-()b3{R{;$lfNFZr?ibLr>wLOj`nLWrW%udb4O-Rv zV&yB)iti*HSL53bM*l&s@$l$A+gYRH;M)D!r~AN*4k-o(qe~viCp@x0g6{fq@n}2- zDseidsDMoNVE*i4-3@BNmP)#|o~)AvtuzF6<2<^%K@D0DOO6uGO^i_0-7PAh)lx1U zb5uZGOY3G(YqwOQ^+25rd?jOdGq~+*$yma1tOcx$vE@>UDyX3jY6=GUbjGLzpsrkT zaQuJC2Xw`ek99Ms{Ri5*;jIBGEwN8Gc!1P`7Tq#2Ft}K3232XGtLD$X$QA+BW)A$@ z{)2NAzv~ZBNW5kR^IR-8gQ}F0Ko^V6iYyEarR?CF30`Y@^iBp<1TNhtKvo8TvY*gv zNRtP&%m*w8o%4V;ojX852i|%DHqxWF8Pv0fnp?u|(c27C;L&a2VZ9sF1OXk<57G)* zIRHMK9(1%}Cs@+>ziaE067TNGp!Rt8@zzUq8a~~dK^_UN9X0?Nuhy^wvFkfQ7bcpkcUjS9H`*K7y60<1TT z!*NFec*^PQi|zv~44|5P6`0QlY7X&$Iy}&ON$f!VFmUjJ%99+>fLcOljY^46_c>7Y zl>jmZv}hDGP!CcO0V;q3AWc5d`mWXk(Bn0kYegAe==p=%?k~49GJq~mXW$ofGE z;$jW%#g(Lc^xC}kXx~2<9r*>=!G7s&1}X69o(yVGyBgni(cJ_}mmb|75}>{i zk4G=BouUxK%Zd6d44$1HASK|gE|>t#PeA98S}#?C<{zZq34nUB8ZQ&|SwOouS}!^B z`(5Y^aCq^78G4@{e!#Q)Cg}Ke$h{As1I-0Ix?h55kdGZf zo^^BpaRWd^!V9;_j12tS4y5tt9pH~X@R?tbx!X;m)0xMk^*?{hc}50?Zg!9E=^$T$ zE@{qD5(2f{ctJFHlD@vOB-<7=Jyc>0o~ADm15etQ7I^eJvw%*VeBkhMJt)6{xS(lK z2M3Vo0f(2MMp3t)1xQ`%$r3rxtdL;yPe%UMcF+VC0|UbXhu8HWwG9rh%R#h*!|QyI zY7qN?!|NExS`lws(58bDm*zSPCXj3?E5F9U*UX@Uy7>h`*I7YUgq3n02ieZx@LId^ zCum6%RKUUEwG>2#;k6)0Kge_jN3c+X{b$gH&U&m}ib4!kOeI46daTV5COfE6Wm0Mc zy7Y^MU*jgj)ZPx3`OGiqEz<2S(+L{q zZUv=PP;JltnO`74;Wg-#=c%A_@G~fJ^6MWe(*>RUs(+zO^|&*r>FfZ$=t00=;WK|E z=t{C%AZtGJ3r1^zY*F#(b^8yenqO*u69L+S=+w&s z>UA)9ba#U09>IGuKzEOT%VZ(Y@@!Cd1l%%n1TPbYP3peL0*%-BngA8h^I*@l6Gf#J9_c>7EVXmHU0RB0K2tN>yJhHYtD?IzYSwxsNQsr~8sG=rEE=pe*kJN&=U_&1F3qaCbf+`sEQV7KVl@(AALr z44`e%T-2Fkaqb1Jgo4cTIrawpXTI?LhVli+?gNhe>z#Q(=dO5mgIb23pxq=sDxfRX zKw+rh3tBG>>d!YH35Y)2P-VdYxtJQXsRwf1Z1)~;lc3j~5qy{k=mZkbAqyu!+8y}U zpZ7@q=*j#Me0!c}_oa(J9QoHD05w6G&p9?)f%Z3*>VXWi0I4?st;pB#?LG`T_60O( zHx1lR03Yg9qXNE5F8VM?4NP^3ipJ{;j@?uWBt+HU zeR9aB`=Li~=y}iX6F%JmpbER&^}g{pm+svB<^wZbx=YhtI!n*Hbmm_6IPUry)IIk& z?)n)t=h*y%v0TKl*Nw6H!M{$|^Nzi)5Y}bSZXXo|pI+bfpk&$`dLGh{g04%J2aj}0 z)rm5^c%sTp@`5a@aQ*TBWgd8NGZu6P;(nKI*W-@->;Hk~UO_dM zPjYR&qxJt%1<<)sN}kD}BTv9>p>sa`>kquxu|t3Xq~*1TBftB9N9!Ms{O&(oTi@1M zxO6}F?fwdyVS=4M>)U+nLl_ozhf+Y`4>z(1Q@zqk9#uT_kf<(^4PQ62Yd#qM|bFY zaLj;9b+D-MC6{jBa8RsuhNw7nhNxJ86+nx0*Y%)aH|Tba?+gKD(olDJvF^Jb)I$V? zA}9_JBax7%7O0Jd5zmm63L!!5H;K^TaK{i(3I!eA3|bok?P+>;|Lo@S1*J}K3(Tj} z^|(i8?0zzeCh%a3>EDN-d$2%5np)yQ3@?tVvM_iw9s$|y7!w~2N{b#G z9=)OWK^Oe|0GEh`96p_Ez^i@1Yw$98K*!~P5^!g!zYlc$+x5Mx@wes!GdoM~yL9G0 z_BihP8=7sHVcA9)mTT^VVji4-9z&Y^kl+W|2`b-F$Hu2ti!!{};Pm7FOUR*A-iUkx zjx?|iQ2qdKIMi@K&miHT$U({=KAolE;0)3OGB_M$a5*T0B>U!r5>V`Umu}bVj{NJ7 zz_N(-K~U~EP^t(%sNy;}kDLbQj#*p5x#Rk4SAO?{j@Abp`P~nIGKZN9Xc+mYCwl%k z1|8B*g6i{R{_n|r1ALs&qwZ3FkM7#?UN^>W-+FMaaOpk)3a6Q_{Oiwv&dTY&;L3cm zx%PcVseohiLFVRz%#O_u|1>}R^P2Vl!RCkHO!C;V`-TT|?D^J9b-J#gnfXsX$v^q! zL7gE6aQ?UsD&rq*0p*YDp3MI}pw>V3=#JeF$^zY?;h-)EI0t~Uh)=g~JgCD2ZvKD< zN-%RsI5>wmc001Tc5^~=$#GCF0Tt`u29R$!uABl|?G7Gd>)xUQN^GE0l|U&AB}GE= z3#e-#0o#Qi;L*JbRHK6rHizy}`334s%X;+k28n?7dBZx+M*=`yo%ok`lvo(Lxj;2v z#XeArrS)WqHOf*7UFcE@S?E##<;R^RKs^}O&T0-{&;X1dXu!2Q=5T^fugPJL?jOFOL-awXv-nuH90tWnQ93A7 zLH1mN2X`)mGgttY#YXTwb$81}8D8wL{qg@L=vX_@;$8zEPyu!Ih4M!5+&8E{;@KUR z05%GoS6`PSAI42_`1my`2 z<{ywXmW&Lb>}CMc2dNIhTmInleiJ~BleYcw|8=-Wr^#=S??Bd|4#9xeAM`@92&jnA z0A0BP3JwqlG>zB|4$l7vI>B`F4~`;sm(JawAcj<-p!5s6ViKHx5fgck;@}J@D?x?| zLP6`*dUI43cr?BNjmbdc?Sa2|=2wjTEjK}HD?yB7FveyO;}>IzjYlu==y;TI?YU3*;vn%0ZE2^yG$oT+i# zMI{8J9JJIId?=BN3gm1J4bVv%(FgdCoqYJ2Kkfp*h6^Z+1WrQ)1P<|Qf)r@_Uf|aN zovoqiqN2dB>3RU9&VgUk_XEFXY6HJ!?gW0#(gpmQwHx>~T_3yAJlvHKi&tf6@W zc#P9SfM2j1bc!})#Gx6~`hW~Nbb}VCys&i!EfXyf?(PQ7uI>QsDC?eV!2-Hkv%4Ea zd-Q_SS@&eHJZSlH8h_pt2@nr7Dw~kTpC=ERP%i-OmIZk=jX&=YxKE$PpLY^8;1YfN zGrwSnO2%h?!5Ebs{^$dcVHp>dgwOnfJ}N1oYzNN$;0sk9|6km|=+dzpG$8*n@9+Qr zMh9Nj|3!4^q37T6LC5HhHGt-=k&eIvCt@x+zGD~>AnEk7tkG}0=Wh2C9CC+|DeGQ&=OqmO<2(EdInM#l$Vv{ zHU0#jrxye{NUy{UM3;$y&)HKb7b^jsvj^JL*!UB4Ob7U!JAU-Oshq?*X{!oy~P#F~08Xo|e zS|(P)52DM(c7ePJ@-IX&)SuvuQHL8}f|qmZG`{?&%E(wE2laK_usNXYb29M-RKHVJw%%BtgMJ{>%e+ZI>jK3&&bl>vq zzVPBb>zDtabOIXbdHJZFh2hMZ|0kP&a+U{qBp>wX681l11EEyIT=#2(>cNIt^Dka>iM zA^!*uL+KG7hUz0c42?&47}}5UF!UbbVVHb`hXL$Z(0Erj=gSw8AeTWzKoub9s$0+r zw+f&Jz;PE9(2zX?X!^Amv~?J?72~2uH>YR!&lmqB!AByrb~7+A>;$zAK-tOT1$#Sa zMHXnIbV)G306Tc;$5ju|ok0wsfqc;D{fon(@nq1j8ff@b*Rz`sv;e3ZbY|&`6H*{k zLB}t;fDSv3QSksRJPQDA7jc9vVm|$1N*l-ukbLWblG`4j{CMs~J#s^-X0ZrC{ z&yParf%xtWBz_D)O?uE_K7Ri|E2M6Mt7hX%KE1rU`@jA-KIzlT3Thv`;Fkaw1RkBt zpz}7Hj~GNB_UJwZIua7(*OvkyZ+6D0K=!MEW|JgBAsbO0!$G~<4IYpaz#Y2{T#es? zk0$N@+4{|;Ge^a*`&=4`4&tBcqT&l`Gy8UbIOd|_!|&7m=*4#hMuy#>_}mZbO@eke z7=j2@5FrC11VEb|Sh^3tmIEh;*W%!G@>-z#_-h_;@`27jc7slp@p$oE0kjeKMZ@3! z|G^?IFGLl=BA@~jEaLEDu>vD_Glee5d_@o;0U~%ndrReZvx4TC#UW>s3v}Oq&9fWS zih9ku8`OU4KGzweV)J4l#1<)-Efz1%Lqs_K{{L@$snbQp#G}`Df#VKPSLem&wE_%| zpzX1}E-D6|-Df;HT{Vuof~I&GUMx2O4M~QvK!g{(Xb16|>o}M|S5I}iuHX+p>DcWi z(CK;sv;sz<+eJmC(?uo6r8D<~OGoYxpU&JXE}gk|j=8>N1O;*mh$uTf{&}1O^+@BIo$75`aFAKqo7!P>#idrxT zGIXDN;b;w>|MTb-^#=>^Z~O5=*P4aFfq&a|k6vD-Qc(ub`9!l6SQz-XUH0hZ)c}k9 zc+sK2!r%hh`O+);_P+o__c@TV$2~yDEFP`0gp!?Qe_#FKFzvTdb z%WBXd1tiCTT3;pN;3E`Dxg3wXfp%^%yykQ4tSflU0pf!S09WG!j-7QS9=)PX#iAe= zFScd@t?uOT?e!~h0bMh7{RL=p+_l@U#1nJ`yjuat$`^kazx)R=z)j#6@BV%M4{9a{ zfXa;C5S5Gkas{UazO6=4LT!(MZrwWqx0cNac7cu_0dcy(9PpuVXJ6DpIALIA1z-;Ngt)UWl0h6$(-Wj848&pNU=RjzJV6}L z3<`*21LA-tYe5`+5C?KX+}RgO5Dw^sxU(-rK^#!q4Wx|Y3uqPA*%tvipi0N1SM)fu z5bUI$IgXHEa_rm(8VPee-Uhn73Dhxo@o>rK|DN4(93I_gJv-Y#MaBz0ms8 z7qw0-46u72YCt2^F)9(D10_Iv;J`&9+HeQB|I7huI{xAK_wAlPF)2wr!E4XQ{N7qQ-9#_5;PG>mI2WY4zEQJq6`kN*+8NV_TB!V(^yy;grHOI#LdAgpv}QAD-Z>Bm1SQs zg6HBD`Sn<*7l?wU<;D2*SnohYx%u^2?}C^ngKKKO9W?aXP~pH(%GOX3!BC>?(d}RX z?mUw-Q4ej9B9bDgwpIXdK~(Sr4Pt{eRlUj;YHKnuCL55KTs`|{ryRHC`u@BR($p?2DV#+l$} z;da-6Zzoo8j00yCkQr$CBf$7TXNZbU_btfic3^}@_fL;*PY%eDu%NcH4R}%&G!+RR zNr5(}K*0q%{F) zRKnT36I9tVma@KBqXz1))q41J?*pj-ZQo<_=}s4T&FpIY1hnkfRiZnz9=wLy0ko17 zR4BDx;%}V?UgaBW0N&Hr1?szWgYHN5o$u3q__!-LRz1drHv zht|K==nk!S1P>=WcAtAK1(pMK4M1`{;1=F%CgYQ?#@~EfpOkPp?gNeV`E;gvICi`0 zbh?20Pi>$E7-Uq6fuYk!B>*&K1R8FR@aarZ0k2pU@aS#;#aXupXca}sYxZupgiaTg z5T9;04iE4-eSQI;<&+*Tu7CUwiaq|8D9{Ro?hBwc2lGbITH#a!r(T>JSyI7vG;|6}HFy#|hn7Vt7xP~XwWqdNj~eJ*JB=G+TDB?jo3hM;6>;nB_P z*nRPJxMM@D14D^}XSb^d*jms*eV{&A_hpbzIM;&e9aqT6F-!`)-UKB3dd=tmyFp?9 zI>51^HiDr<*R$I-0kps4GT1DTMFt>+hd>HJO#_tqT8Qt!Dj~MbUi10?|HI9{nTwwI zbmyjn7wdqQ=(u$IOMq6#^7(YTD?pSMtO3>k{u(f01LI2|iz?TFg)Lyh4iMp>wV(et z*LyJ3CA%7bGrkR-4+EXy;?dm)s!d(GeS`&kx?O}hxEiL)95y0tI|2kK<0z;z^%g*ZHrxA*1>rZ#cYI`3aP>+d#FAPp@mcN2hDM@$GKc za)?)rFLk>1dv>4ijGg>~e*-9FK_dY#TtM;OeeOjKs7n!=4_e~~?ks^$HUW9+$}Nzg zbHLMM9*svpnHn@8jI8zb){7UVps@z7ptZg)X1x9U zztcrU1+;EQ0W_2hDgZq|$G(9WpxqNtS_k9}(83-NA9Rh^3)@rBa*!D`!q5#~h*bhv zfdV=Y0hJH(FVwy8^RMCK4b5)?;0xt{`E-AD+zYbAvHR>U(0G_@_k$OTaBuLpfbN0n z=HCkn3y)54#Rj?v#L%c-vBUy;5r_d~=(2X&p2$$p$Rns7S)%9I{r0uyJ`>PD#OBs-rR%%-U&J$WGJuAD zdU@}riZZ4$^2f3J7-%5F#F5|iDCjUbPyaqK<=I^3_@9W)DT z0J`$Y;RUk+*m}@GwI!@B9ony@J>j+S_T!&HXIg{g_*+1m^+8u^IH@u+_<%0K=@mVn zBFfNxqWi@QK64g^ZvK6stO1H1L!%NNNHXAW1)YlQ(vj`p(JQ(Gq})YC$JH2g836d0 zFBcV^ZWk2;@IhZLDh4k~^}(+302SbDE*;s9$j;G#I0q!j-*W38XrVc%TippV_Uwx; zGg!BJMv5qdWA~XC8W6(*V1_v%8+Q8`*l!?7{+3>_Va^^Ny`s$!(`?K@3)b8@T)NM7 zhqHA1OT6&n0-d_$YypZV&=!-VgCYzsrZTfIybS#J|39>aUm^rvAzQ)?UN6hv3R;cs zYJ9+@BO7!Otvl3V{d!%Zb0R5MhV-p~94f0iqo|6ztON&e0vt!te5-+h4+^``n8PPPmWw zTeSZF2i>1`^kp-6mc$_#bb`J|H{^UI1?X}|k8WX53-86g_n=bvG-%{C`lVta>QP3Z z;t0~80{5bz^N*m$A!sHTl+8W5yFnEVXf2Asi=vI6|9c#71_^+=Cm!9C!GlY!mq2&? zcyqk?^bTa#WYF#!(Csjspd*=H+=U2&4;+B2JOL2|jTItPZiWbg8ZZdKc@RPH*#dCw zoe)9L8hC`t5{MvZYz`q94;BoLK!~gbi%f^PoDbwkkoQ<$d{rX_pq5=Jx5x2z5Ca^vt+z|k8>|^hc|E#=IY5o>7hm6g{@+mT2odrC z3q1l0IYER1z(VK2LXi-m1hCMaw;)$~OT179JM;7lX%KxJe54`RF7O;!cZmw*$fd*Z zc{b2y5{AQPe7eDFP#yUN7##Tpom9YUC@Ed?>)7o8TI}nj09x@2TI8902z-)pdJ-c7{bbs>b{s|sPe(^7vk-?)^ zBpNgXb?_0hZ?7MRNB4Ob{%t=zx<9{|@B}oD0cr>Ew}1|DbZr6cbm;X_QFu}M0=yYg zl=rhBgYikv&N2ay=6@{wJ)xjQR=r_=JPy8M^67Qu@c4hoqnBqYDC8jbt%1564nIEg zM}TgbVFvL${(R<-0IfCmW&v;QQ~<3E2Q4i3QBeUcKIZ|8g4c@+eC8MMQPBa3ih#5- zK+SQM0P#FnUM)RWB}rN@W4zm0qX%f3DkRm znq&hO1v|+BVUi0-tAhZ{Bo7eRL&UTBfC9`kAFw{KX#rq;U=N0XMZu;;fJMO`jPYnb zoZtako6vd!G;3pht~L~;@GQ*J%pkRASv>w9gc(m#_<1xRmhiAXSF;+_I|gm+@6G`o z!v|Uu+V9?Rs6;q+e*>*H19g8v z`=>$Cvjx08l3%k1ytZNwxQX5Tm!*`=vD;?*Yw6~{Or`9O{M&8HU-LKrWh`ZP;@@Ut z_nO(U`(O8QevRY&>s!E!m_Yfiy9K;{=`(*M3nOUP3BSg%&-{@tj4a(?WuWo)hCN_! zGk{Vt3setiP@i9bg%OOh7wu+^?Ou6!(txE z=bgG)G&`A{x?MC`I-OZOnh$e;dM*Etd0Kzr?=c0P8l+L9V!*EfT3`W+LeOX+=tu?F zJ&w&s5**_}8-O6I<{d(V!E<#xJsRJD2L!q&f(v)h5C?Qe1hfvj#NPtmM9}M+?$hg= z59;SB`1HD#gZn=%2TCPh1pH!V@aYCMRsO|@LQl==5eJp-;BEW-Euix@J-VGEJbFW) zgZ708x_;*ubQR|p1f5dg`n=mYrPK9)w{u3PD|5GNKEI$Vd#9^>w`;mbr!PCSF69?= zRqu3F<`;A|KkljyYQG*`G2=_ilu9QDMz<+hNWvdXlDVW z+UoY^cron(sLSY@4jM=f%?GWHWO?`h|7#woB`@5-m6j_+GZ(xMp2oG8= z3$2|%^Qqtx6%u&R4v0_pC*N*xZRFc}pd{22GOXa*&EU}uI_qo>IQf8vwklBX)6E1m z&O!I-M#ApX4FHLN?$dRLwzNy^z&*FuPM+QF5suyd2_Bu0)c9gE*h>dm50tL*=;d{d z7G-$x;3qTaAUwo9_R)tSlcOw-{M!!rCi`(1-v+Js1sx{?8U?B7{s200O&xUM#{tj| zM$hjbJ-bhOSbr!39ri2;GP4J4=1XSqz{hD1{`DU{ll^#FPnIBbd3^r}T4)c|bvsIw z;YAok*I7`m?0(#R5tNHTnZU98B&g|L;KRTE*^7r$xfp!9Ux4=@Phn(W0Im1~cPT*) zc+kKasA1NGAl96^(< z-9JE^Z9!9Poj#z#!H=cWM(U?;pVe*O7BWCQ>dMWB)Zf!FIo}KL=U%gOx@cF-Ia;Shu z_YcqRTnP{BYo!9<_4gM*vkXj~0t~MW94+H`>a-B&KY>>dUI)oP>JVV?Om-FUVE*U9 z{Nn#%N9#DAng^g=sGv{;+b{nH;vl%dyC)z4$j%eb?xU}nKo?%DQ2|9A=gi5Vseon=P*njbTR@q_A=oh#ase$gb9jQ*INb8-e(3=oH}ma2_(DS%G$mEa1sd*j zjCYKUKJ0kB9pna3Gr_YPzR8RiIzZ>q?ZNSy#k1Q#!n3m2GZG%ZJ~X8NkDpi$ICB6LbeF=n`94;sB+151(FDEy>USLA8kkzq|_rL$|O`_vK!v z|II%*`P&^p8fQ3m_q0rT$;05ueCGedH2yqi0ni>pM}9%@p4Bw|JZ}-u5-mr5!TvW4 z3=AL@5-=5@{Qw{pGB6dO16^K%j!^sT$gcx7fZ3VHv9q0lkpXn#g-$!j2xeyi$If;Z z&_IE+h+}6vc$c!Xgkxtr4NCGUhzh6)6Qg4BnLqLbG?+of=V$)N3!nKTZ}1DafUCuW{KpP} zRu>-PKX%~QXMTah{KpQQ1e*@>I4A+UR07}B=PcmT9nIm`{DY~C9lU1eb*x9XGpIS^ zEzupUc^HiL&x8`Ihud6m9RJeWG*#$t?JQSA;46sZW*9cssumgL84U5$I`>2 zRKTPAhGX*qCXa3hQ17+$2)OWa1>Y;A;Molx`+NK1|Nobu8_Gd;dUXH(%rD?A;nVGH z;L;te5Wr0np zu4RS;==cdt7ZrGv3b-&kfN~$qMO$6Ey*WTKK1Cn%TH0fiOr6lpmq} z6OYabpx)93q?Ldm*)!n&EYj4VM|UHnIq(tMy#A&Dv1Kk+iwCbO^yL= zp#iNkZa$(A|1#w>Gw7%;4$y$PflK!x&?L3MGthi=iDh?C9&jFLS5t{d z^E<{8eh|S0B3PUMF_s!QcAtNt09U8z*nRGWAe<`%I(0wj71T`7#f;E3>fl9M9-uS; zS*aE87zb`;L*fENf~p_z`b-0tZYJ=4R!FzE8*~zHi6d$Q!U)t{05u?#U=0XKkO-&& zApmPYu!CpXUvq;8^k0Ko0v8;+y%l_WomCw9*9WVB_mVnmbo!_$cyyolLE1;^%j_-j z0(651Xd2A{e8%+QGalVXJisToW(at67D#w>Rwy`zfSW{!i$t7yWkB=63_jge0A4v+3@FS4G3G(jrebzPtTgIWvV*%S}Z5Hx7$g8@{L8-VtJ7`Pgr z?92h(Rel3h{0D&4CU|!9gZ2)3cyylt2}X40sHA|7NB|X!u=@T*%QKKIr(gUz0-_-{ zU%31EKjKOd1)OJ&fZ`E`LGdX8?nHqOHG@svHG>AP!H2E-c0Yt}a)F#m<=Nc}uKTZa ze*W*;E#}kx!?pENiL+z(sm6y43=AI{e=;yI2$UE(HvR&i2&&}R_zQd_s3b@P8uPzE zLu)1M`$0Z>%?+M61;_laZZ{s6?(^M{7O7|Vb)Rlm4$tnhoiQpNprCN*bWySB2JdAt zfNW*a=w<^?Tct8FFo0%%T==&=;BNsHN{-M|{Cj!qUAoc%sOrLJo1km1&?i-*i81B-20AxDI)7>Y!*=A}Vf*!fu83L+6rhwf7ng(|8?7j|mC}?8X zz^B_4l%6#_yU#+y2DEUZE7I0JN;7R(t3U6dYz=DF4!1m&kW;Et{%|F$F0Hej41 z^pFbhPy@)10>PnS;HD(xf)kJAHQ;`=Pxnig?mggP1mlyQ$v0cymgvL#FCO2&`gEW5 zu)a|y=h4gi(^r(?#hEwEppB29-T|no85bLU*r)rXC;$4Jp2^=`TmP5nAnE=F(h9mm zbRS6TL`K?{*uL%af1hs9)pz_YpcWiR zCAevS;f2o?kpCgqrhvBmfLfvjKFQF1an_$pML{ieP%{$Tl0Wf6x>kVUwH2u04H9&1 z{a>f++5H~AAJ(V)F!b*9Pc;Gz9?ZWznZJ27zhx|a)(r_Tklmi$S6&!D09o7vY0LMz zsCXD306EqGl;uHQ0x?`byZt*|R029dH<)#|fO{&Sjz6dq1sad&bWw@uZczb^@^reW z#DF$7IDpDmP!S5^fbMYv_m^I{JOuSA zcAxX@cIEKsz5puDJV47+{dqtox&!EF1V_*bhdwF>j@|yCUZsX(H$S8nJ^RA!@Bjb4 z-L47ly*y^%!PK*k-R?ZlJP+E?=FS1-fVa1~vq1CS1;=i7NVW%60vOreqx%}@Bnr?* zK7)%tKqUb9_=y+C|A2Zf)25G>Ddjbz~45(1KXwhEP7!3AqTb} z2dLO}>;`w?H5|M7K!FV^QcnK<{~x+7l7Aa$^B~Xv1CaRY0hgFFwGV;HM~90)z{jFp z0PT?ce*hGEunOk{bblncSa$&xqu}EfK)ViIR5X0MT|Gc$GAQ&x4gJX9|NrxE`vKbH z`2T=|(r<9wfg%;D5Cu5{DN>b!O z)1~_sxFZ9tW?(lvoa1*n2ENq6`Woy`2b;?t-R)58W}QP6=S zkTqGIB`PK_YL|lsmLNVua~Grq2hJa$L2rldU!5T;DjwZ8K?@wfU7~JJh)FPqzp$SP zG7WN1bL)W;JMe5-Z-|NkXl(>YOJ|LW39Lu;V&VpnYUc`2Csnv}H)vc1(ggzb4ICiL zAp(pJcz{p&g}CO-8K3SuphHbR^9!)fy(!4x+v~jJGk;tosBSPm;CbBn0ca_y<4({P z7SB%SJ;s+jJDrbsb~<11>~y~2dEEI8NFIH=-DiFQ-t?P-44?VqIza;#9^IXw@&~*s z3^ZHeqhj)+_`>J^9?eHG&?fBQ;iKTuJrPurLrz}-&2f5iyzsjSs&s-YKy!kSS-_r4 zpZ_0k2Kf~f9-y8DWJejySO@6*>`jmEPEa!wGTA7$3uF#>tkW{6SUU{`}?yg_*vBn}$k0WFsSu|e?! zI-e5628A>zwZ7PK8D=&ElG$MAg7dEcXw(sW9=`*4)7~qO?wg>~9fTmsB?2^@06JyJ zA^vc8BPeJ=U7r9C>mOy}FJeG*_@MIuy1&0L_zUijJHKY?{_fEoT;T}P@6GXI$7xXg zeB7h^D(K$cRVARlR&WI<@xJ(b9Uky69BV;rP}8N9#pu9mXOC{@3eZTa0_buI7tkFy zkdzNf@Spcwb?V!FCq$k`R1DbitQGxma;&CVmjxUgZ z!1v=o?vMWfI^(qa*NX`!K7%gPu3o`Z!s^j|`ZdQ2j*=wM%(L-<&Jq~h;cG&p5_`4Y7XZYrF z@bxkty}W$dVhk?|AAyEEVpIx1gQTFX=U`c=yI~aA{h;y#eDYMU=o>9D2FR@>LR_Hb z|0N=zSm+hiIVZr-efq^*Ar=OQ?TnztVz1~6klNEPUUDKU42CEyL00%2qVND%VX3-9 z%l}eih_P4Cf{k?(Vqt&?h(NTP3c(hYXhQ^4gh2B)n6vU8$%j0;T@FgXG7*^1auCJ^ zr%$Bz1MK7m1>@U3y|(+AKmYIk?EyW=^do3tphxm?&))tAD#{EV-B*2jSsJ{0c@Ba$ zp$da0IXgkuR+o7HKkm_djHCHKbI}FQ-a3iq-z+5>9?6Fxmt267X)jNMM=#IW1XX1Q zPv-M4uKxucM9K~-NcsOC_GmuN(fpgW=)?xb*SyekLqT_GfCiFcKm-0cpx#u83aFS> z0F7QF55a)r3!dIU8yi6jJh}xzb4CScKmRxW2HN1*X%0Fa>_z-pP|;J)0TSvC7kJ?h z;R`_c5-;o_d&isHnJf{{`K+>Cyesp#w5|>T2}l#in>h2FQA~1*{B0 zC7`7~{Fen8UaY#$%<$5I1GI`GL`7jIcq8Dl%Us~ApEaSvDmy`kF}>)A3JXDnHFgRy zFfhERfC~R+2aRE#dr{#4+QV_~MZzcW1kVbl5>e0@+bkuZv%FN8O4*xhR5Tb%0*o&m zgY?fCA+~O~!^Hp|rh?eE5X1$Q;t*RV-2ojRe$})4oJZrM|NsA=_h>%F^x_ORH`t}h z>W-0JmPmf;KelD;CXw%mbGZ3>4QrNRDvj+1(V+9_)tP)mW z9;gcS=w*GS0Oo-zEstK-KPF%vs3qvp%Nl0{=7EOSJ$hLmG=MgJxhZ&bf^M8tG_v;jR%UK&}*2$xnbq<6F8fo_E zWwitE7Hb1_4IrMo0UCMhWt{|Z3us>d#WGRQZn$lr1|KNAyIEUTfwqFRfvZBv zb6gA_ouJ&t-?9jF_d94}=iG~;8;~^94;DKA;*cn4mWRKk9>nj39Q?6U7?fT-E`n5+ z@O^{KrZbkX9CPPjbg;iGLQjK zjmO+|7Aw2Jo%n*5?HoK(|#3^MZWAYXh>% z9b%PomDfxZ})xrIsD@AsJmg~Nd z@d2f}5=GaRCndbQKqnA@d|w8(MFO-9?A(jYeGK4ZGeu|Uh(T8^upt=(HutJG*cfS# zZiv~S6`(H;Km^&2xpOgs&fOHPhZ}GdH1`Nq3tFV`VhTj92h0G_3f33(5JBUHdM<_% zQJ55H^TLZ1h?GS0eozoI)$s3vY)3oyV%J`%b1mVvg(KMp+7kal4We5WqMNx!W*2A( z66Eumy$lSyKns6CoP3y3VsN8)kc> z6XXS{oC6Vrx`e4lW*2A)G05^ydl(pYftC@2I8XOLJ+(#~76(mVnHfBKd3S@FR@+X4 zQVM^IIe0l4?{RH02JmX0WA1v4FE}r8ffSz776T;^(1{%{zFhIx|B9 z`o&jQ(AsX$?Hu4buo-e37i>@$))NQ3b2{U?wcOn7B8-x=VI`%K3*c{0lmAc z`}zxoOQ2Lx$_?riL3@dyW>_RBQGi-W;5ktRfOGde>$ihcIiIQdY~i}G~5fe&giX2 z>+KR&2Mg^|c8^}!yhWfx1WvpV(_vt60j-_(=;gg756TDNaVoGIKu6=bcAt51=_)e= zlA)#BK%K1uP!xf>hz|VQj)F!OK!f6rG4asRBGCFK$ogpTTCj#{4u+EQhH6fRlE`jn zp4I~;S)c(z3*-N-2kKNntz^*6t=--N9^E{KFFrc6F#JF6(Obr0UCmST0%RR%v_;^> z4QEgdTBBld+!<7GFnAny761hvq<8Moyc^_mh7vwdxc;9E;_ULp2ZI<@wZU!}Yz-qdSH9U?tgH9+1Il%G% z1)pwbhwgLT;-ItQyPH8rIf3Q_pl5(M?gTY>K!Z1oA`A?UJ0cpux0D)iNP>1}!^VMN z!#|+9kadfq7=z})gW_Q38E70}h80Z2(6lnNw3X^tZpoa#ZRDKx$T#V~ZN+_C!x zWW}#bcdEvV+CTsQyBhyL)(V=?WAy3V3knLy<~kLoQY9CQTD?*kk6zvgkh2?)fD8e3 zk3h*I`epNFW(LrNWN#06_}{Vn6sYeHzV$ie#W8D8rBSNx*nR57t_vK{O)3`H%(1@A z%m7-12Fe1vKm=$(SOqw8Kt+7Qi!4V_YJp4&Ujt3@HP@*y^0&SOA5zIj`T@#dqhE7@ zZ?Of9J)d;sU+>4#>F3~?9LC|=&F9m7$Rqh6=%`0W=pGMYN603R5-ykCAV!zoNXFNy zAQHrL>^=+`??v7)!+g>MG^u#d5wvy4&D|R zJbGmn6vP->50qFOa|5kT6)-J1D#+m4oyX$Yxec^*-o>I;hrb2X4{_{{HY?BKYzzD0p{*QU$07tl-nj$^TZ6C?|PzUjw`Q{{_dL z>7XT3piOK(y{s4H#27$_U-t5@lLw8DK#n75E&LDC>1Xlcf;}i^&%HQd52`Fc3(6`$ z1sy06fU3a+541FQ*u|n&w?q!)+B8T0yrcZlphFEK()ja0XOz2f@JF9~?cvyc_655j z3xi{~ABRi#ix}po6nG~_=XbjvvI2A)1U z?glz)oWY~J71VP9wHsU=9J|kSi~YaQ4atA5-Df?zTOs9@OE+lODrjpSXj-bDd=z=Aba~D{$<-;?nJw16p3V*o=X}v6~ID-<})1-=4p<4YY)<2eNdzSJXmI40IvD zF}D!L7cD=T89Ln}S`U=49dnCed@bbB4M|JAVG+>8)D73D4$=6+AFL?>qA3MMQvy_z zM>iy7!XiLr`BYGV^g1(wLu97*A<*G-4i|rbg6;?Sm{sjV#+NSs=)M69co)$8^=Z%< z6QJ4@5?(dnvzJ}Ekpn=~3?l#*nSzAeK>MHO%OWCv_kU1}2!PjiZnL&q%fpWVW3#b_mx-KH_1SqS^fCR%h_@gg<=8yaInP0F>0VLwa z0xl5*-Bdt4a1jAgt--&|Eu`f@DVK{yU1&)~%YhOO$Niwr*J}&oOCG(v$}(aMj*WJp zFfSE+vGpc1L(2h2{;9_un~!t77JaegCNqQMeoz;w$feWTaVMx}2`cA7 zg}h_8pTvt@mpB+aK*K(*2TDPMbeB3s7+$cRVP<%F3Q`1vTG)==XF#O_WG%5rFRQ8) zC~xzCPLu~tJNWdnI!lUydP!fV2r#^O{^kGwmp#8grvy4c=T{*6-_+oZ@XO%*&>_$uA7}v7rLG5z~CcAP#x#71WIZ z`5$?_8`4@v+obkF?DPNs#&10=w}YBjrFp={U&h;Lk>e6yM=ys@5c8|{WAO<-2 zK=)NxYL|#RSY)%53VL+6gW|!X8xk%5FF06ahm;sNSY*eP3c)0MgJC77gGF`6bAly^_}ow@aRNtiYs_@I~q84 z{{XkdK|@7CmIkG)mK7`|KA>B~K#NA-?UVqe4A5!BFYcRzECUavsdpN9^agNrROnbz7M|}> z0fnY(_lNFJE})GrGeAAU#$P^73=E~t9-xCQKxaa@bSLvT{y*ZGe8uD7Bjy)HAjh^I zD3SF5EpSTa@#u6GcyTs@g~1~^mSK*yM_IQ?-OQ**Q_tZo`5Qm z7?ljr)LsFoCshIMtYNGdh1}<3eDYWW=vpsE56G499-SQ;ObiUi8w{8j7(feKk2jb= zSpSbT1TcZ`gbxBy#~VOxKF}!pv4%{Lz_ErJ5Cw~HaC!%Iq!mCN=k1_D%T7Tth8Had zKtqI(UBhxO+>XI^0_6yTi=AAMntE6PjdUOYGov&9Xfg&m~k)iIbY4j}I9{a}ZISCGrSSPR#p4AF8$K#bwV zcDNQ*kd_?~Euh=*O66Wu!L@Kev@8T^X@P6`1>&|sw174!m&(0xhikbj0QPT7{iMla4leW?gVRr%-yygD3yCr0oUaR(KR2Ws|l{l17uM% zL>DMyL7e9V*QEi`l?l@21J|Vm(&Y=$1Iz$&}BnRRzHMp)l z5M90?T?TMn+d#SuA-X^lP!L@o4#GlX8bp^kNY}4JFn>(|>H57J9LwOD53mb&!F3ft zbUow|V|Z}{t}6?q>nKDQcpeF?s|Bvh3!-Z^NLL?RmkUT&KSUR3{s`hiKe#Rxh^|tQ zt_Zj;IgqYMh%V4j5=55-T-QHda2VQybSc4g{Q!AW8KMh33JrGQqXV$exB=0{3DWiE zAS^U4fpopy1r80+7&gSNHE>;|2G_L)q-#4w7ihWJ@;1W*}uWj`!5gdn^07zFcL>J_g1&|Ak;JOw-bVY)6*}!#80_n1a z=z<)>0MhkmAIx7x5M9b3U2Je&IUrr^5MAIiPr?2=2G`{S(e;*7jN!$F{jkt*1L?ZB z0~{KlW9lLPngG|O2GO-0q-z#jmjX!FY=|!KWt(8TqTsq1Ai5esx>De}eu1Jd6`~6? ziUF}p1+MEBH#p?ILAvzdy6%8<=|gl?fCl)%cD>sR3ynPxU7{deKlZ`=wGE`}=XS8a zKwW=`T|3~qra^Sw=MZCfaR{z!0!Y_kh^`K}T}^OZ1rS{;LArY2y0SpJdLg<%_ew+T z@`3B}g6Jv+=?a7EaslZIhv=FCw@VDJO9i6K7Nko7u1gN2OA(@L0bJLEJ+RRD#{~{U zc95=DdtssR1C&%=Zv%(M3b?LSa9uYbx-PPdF}&CU*L4Y`Yb!(-=umu+zf@n8z;$hc z=$g$A>QuoN2)!)X3u&PmIPh;f4jQV5j!C1Pf8j#a^Di8*o_}EhIsd`|>-iTRknIDW z$uA*?75Maefwvg-io6BQ0K8bU5H#rr>XPucfJ^Akd;!oV`_KFWVJt5Enm#HHpI!I` z_+0okLsSevOi{@Vf()NsL1$Jt@<&|y?7}a|@tI#RfW@QvFC%~7TF`;?nk6a);N3T% zQwI`U_%&Tr0$lhtV^kDCCdh7Q6JmhwkNnIpVDk?o=<<){vm<}RFObQH_%+Tu@@pLU z?8qN;@-u(Tp%CZ0w5$9i+JF_r=+`-MSapAKg zf8=G4|HnawUHHr|7z{o$z{C1)%@h}YjTjXL7tkdM0sI;@DhZ%b*8&%QjSv-s4U8_J zs}vl3dgp-eo%8ID7VzxOmhkK@R`Be842@mL{2Ju^Z*Zr;Gx?`S_a{)GdUoG%H9pYG zV(*cB!Qh-+%;EX}pjR(XFDQyW^9wkE4h%W?nIE)5Rlo^!UI>We06Oo2=`()>n8N{52RZ=+ z%mW=7;siR>1Iz=R8{z~y(*w*C0jUHX(*fp5fOsMv&4)mzbbv)u6Eu8V5BMa1 z>;4UzmjpGu`C;d0Tzm0k9w;4OfNZ8`Wnl1a{a?cF*}WfJ_jR{`&2{NM3|dOjSt{Vd z@7e<1PSg60zb}~;ylJ=xe455*egViK9iY2IGE#Tt|9GibILKc3zbk70r3-RfO zY@+I31K!L7P0ud;+gK#{H4cIIejW8lJ^^MN`|QLY$)e~n<1@b?6Tikm5Z6VK^1!)ZSplbR7Y?3ICs1@rfPAP8x_6Yr6|~DN`2fgJ76FhA zpPl#xTm)D?^GCY#fb9T{5`jhp!0p)ohdr(D@%IG%|NsAGItv4XPxl<~_<&FMXV?Yr z(Cq}E3(-Kc6E59rz+U!j{>{SQ6T!^D;L{ty;t1YY=h0ih0WumCA0EvI{&*aG!Q}D( z0B8t6!Kc>*vJtYgL`4HM?+fbpI5z)aDP?o%_WSW#0JM#|l--qoyZ4{h%r4!h9lHx?MC7A@{8W9&%?rlflt} zC*WoN)jjy9C zETeY{cuU(0X&LZTy;Aq-7Xlk$GxdFpVhk@9Ze|7@AJcp!19DstctZ7XcNmXH=Nj-v zD$sJ42%p|Eju&bHps{ku(JjWHmS*#QklPqQbNP^K$XvSXSW0z3wu55Xqx(E)A-=~xeR}ga9JPLy7@qbxIs6h zWb1TM(SRQR1e#%S{C^3wE|(cJ?UKU=st{N&{uc%BAy5F#FZA*%F^e(0$h{3p0HABI zx^q+#S`L)*faXrq1GpHB54@K0fCgJBFL>EANNP?9C}fXfAu|pKN#0$CcnltM}AO)`#5M}pCH&6P+J>p#%F#(umKhx2&!c84%AFucgJ11;ng4Zig0KgeuGkZu8Y9%xMQ3pRsPy?h1Qz`q+b zv`GA9B1}!wKQY}>mg%@b4VU=X5IKSRz&|1SPzEU0+e!XtcYQrj~5?haM=LBqF z1u_B@G|eFWps)gI1_^+59%}|Wr(rk9n+&C#4ZA@;WGIpL=xzq3{hg4NmHgYl{_g<$ z-=o_(Vkd(GXvO7A(7p5UZD620*M0g$t`MkngWQYZ)9uf(iw$&hN_R7;JM7DR)}y;z z0K5>$5q!DS{|g??|Cq`oJi41fWu!~@G2=@+K`V9tUwF9*RIGKo2Xy=EfF`yypzYgc z3${`j$T2pemL58wLu-C`G#`T>T5})8EYQ5l{|hhEpl11WKlkabH|X})=?=GW>2|kq z>GpR3xd~*0DL?2uB1?@@9UsdIgHkoi0E<#Z7fT15QfU`U4~J5yb<70}L34)No03GAz(_PL1J{H=S`K$5&=D)1I-RHo80}c*;*B>Bv zGcqug%EE&NDNwr4|G)4Obanv9B3s8Dpc{cer6zdN0CZ|3#3;~8W+X|_=#Ou&p9I(n zi1=$c#~q;gKorg3J*W_IusL8!c!YrL_ULvl_{=Xb8 zWtgMG%Wy`Qm%&q?mtnphFT*wi1O|!0=kE;QN2%U=QGVtB|Au-!hEmYPd=|*MZqUZ4 z<|792FK4d?4eYdoR!8r2=mjnG2N(Pvt+z`BjW7Mb0P5hv6d(5Jo(<_>23K?kae(5j z9kkMV*MlC=Vh(Pw0WRI{8lWYTpuRj<1*oL}mid3d_G%9UL&+MCUfwysMUgf?z7$=} z47sum(mv`w1-q85`__w{t3bddU?At1sGmjUB%1* z8kLGZ3|S-`eHgrvRsnHP8E7&eI)98jpAVfshMXt#e+&5Zpc^l)K^QMy2l<78j}U0KCY64ZV6#S1tObUN`YIL{1pYS3voR~>Yw&>lEf z0(6K_E}YBhX#Js-1$Kf0Ce1DYYvZI)@XS_29R3m&!S-Z zGDwd{FY9I~4Hj?w$qLdb+4$420kmsFR25`VFRR#RQ3elwSFmN9KpLQ-4IMuM4IR<; zd?N?nUS}6a{`J8wkn@c|Eha4I8(F*n-M#}FxPfly#kHR?0GfL|LCXoE1YE&af4|Vb z`2T-*xkmRnk8XDdkK^s2MINAJ-YpDH=%BXcE>IP)^DAtR07%HO``XS=Fagj=GWgVu z92Eyw;{&jzRK}M;OQ;a*j6tS=j>lF2ujFh03Mww7AuIW!zQT(O&`Q4Muc8buzFh$I zCBWNOb5!7qEMaG@zz6f7>0bgeJcV@1#zs*8!ngaOOSh13_Ya@$O^{p;YF>8dX}Gpt z0-Z#42&pwr)OkeUOD$gWLax$dbL8K4D{X>DFKgs?QHIvrrD~2l#la&htODObWdUes zkywc|!;6)RnHgFSlw1Yf%*S{JbhP~T^C0iJIdq@(INk;ebVtzYNRRF|P!J=BdN<_2 zOmL9T{Qeu%>IbX&4>|}!#Q2g=_cTx>bf0zY_GfYJW(W1Dzy~3LuiSG1o$uk!18V&{ zLe7^5E#Po$s0(4}h8&~R>&yr}CWyZU)O+xOIANytA+VJfe{^4f9zz6P-QwoZecF+K zy+03l$?(JOvyJwky*i-NXu}d-vp9BxRx*N43vulB6ZwAt>N@aR#uOC?(Aq`NB2SQ8 zy3b-gL*#@b_zV%yI!Ev+7H$HdrH!D&H9;p!fL-71&I8vB8e;-?(PsECKk(>wb3k%W z1lT;@gb0tylEQf}B0Ea2b)S?1D>7KY%y z-li|0Oy>znqEA19G94skL8@u)PoP8#IoJr6(V+WZUZ$S~ExiMmf#CWWv|dR7v|b7M zrhC}QHXhx(K)DTk9N15n?oy2xC(eM9J7`JiIgjJ5u=L(74k~0?(UZGJH&_T9a?o=< z{$J>J2PgEYpoH$&ea@xZkHw{%4dfPZO7C_Dr;%U+8w@aqK?l(+xHsnkYf1cp)8f13TEt1$wd-=#(RHGYfPC3b?eh0PV53 z_yZP6F5RHT-WuRYfpoSLL6r(DEA8xtL`2L7Q3g-&D)p`ppa{TO=DmD$8Wag2KVzxy zVHcrzcHe}ScAlVe?`LIQ*dnjZ3#bi%T~<$SL69 zhZQv4ka7l5%%B+t>dk`!9^@2I(g(#W4|19ZCEo5E;M5I{F3?eG@Uw+ZfQto`aChtu z6X^_5vA|PSpg94wzy-+(p!Ln5vILRsh;#y|bq_k_3zUTkI-!@nHU&K5%*++Te*kNfZ9MtAOhol z9ZnB)SJY#{Q?nKO|4j{PC`9q&K%33T6ak1ce-0(5gTs3t$W zgMk@j45+Vucn1@h%?u{lz$81EWC4?`U=nP(uPrY_fGsaWm@O|uj4dxik}WSohAl5c zo-Hp!i7hWfl`StrgDo$l;SBcenKKTMx*fD)SHY({$-txgl}mS_hDY~L&+aYYE2><& z-6VXv{R}`uFS(!(7 zv;fFpcL$Iq!v8Nc><8^-W+>r!S14eVZHmX zbiW2|2nYa2sSC&v@KA98hYC9=P_jY8c-=7fyL9^^$@xR&AdY`+0uC}gkVz2VqN-Lz zQSH-RqY~iReHR{DB^n5gkb}9wjyMQ%#53>!A5thGIpP#(=&qZ+(=Dgl)uGd^0Az5+ z21d|!r36q<0VUYb`wO7+Bo!dLPa(6t1}@!IIa|e!RM0@I_EgZQmo`|;qq`Nf zUc;rk7bND=-O9tnz|h?b8d3azp?fNb*LtZW5F*`rvc&xpzW{5@dr=0D)^FVhKYaxL7O&joy{0gGcRLES7=>^*}ejfNw&6%?{tn0`MR6c8nR-BTl&7#Ntretazf^EXILdujp`1A{hLrn?t3uE`Acu19w(Xf2dW zcP~iZrMoo-wALBqG?39Q)_Xy#p!r*-fNpJn#Ld9q+WH@~s~GIG{}*0Yz#Rwbfv;Ku zIw|3W@vr~?9lOtWe|T{dBA^5n`0-)|L_iQKaO1^whycSc&|rUPK=`2|aQbb_T^ES7@SZkLLCc9$9OZ);5f?Ja2i209Vd#ri>sv1fCg0YkU1 zMk%jHH`J>}2VQf-J-dOi1FQ$K8I%EJietB3^MBS7zFzlVD}Vq0|G$LA==N)-&5X_e zxg7bY9QOd5e#~kvXw0ib5j+IeavOBk7x=1aa4bU_DIH)XE>?R%<6kApJ3+%?&HuT; z2?8{lhNRS`1FXo!YAa|otVDSyXmHG<^&2*0T{^&uJU|!6fd-;-Kr7@Sn_|INmVg`F zu%+wZ8W2?NAgx#N=>F;0ebce~ME9o`pyM}Px)1DP(f}=;Xzu{+T|4*xLigzxpz<9g z!;CBgvJ~l19*_SIKo)?_2aRVafGphEmhlNrnm;3`txqq`Ao_4!?l8Vn4MjXyvKKa|Kh?qE~{6$KFbwG31lSW)+R z#~ln%SrF~f-3&5f7lQ_9yb6>=oF0-b&!miScyD{A0}4neVhrj9eM+!<8cPiIECYJMoHwLy^j1I)(6YEJa&8lU7hj&Kfg!wgAXtE zoZ@Bh(0<_28>6D|n)}6D78Zu?&;pO{8y=ub!nzq47<{|K4Sc#!gD%kSJ_qjEh?eug z4#AM!#LVE^`lLhzbk9StXwe@5=m{k(n?T2_d@B(F9Shql8VQ$py^)y#boxNAs4HCT z`bN+~LD1FdhH$aN8<`m(jxPe8SM|b~1+)qGH4`Ws#YT8^mnL|0*JgP1rh<>e0%aud znE;^qXOHGL4j#$3zzgVpwq7db0*|RWK(6P>QAq&J3ul0;{(}F44f{di!{E`&6YbH< z3R?f{(JONnG$`iLtGgbwRF~i7g-@?-Ns=^!SGS9`fKRV!K%4+*rI-)D>xcj05}j;2 z4ZA@((p};Ig-$mXpI%=5H~|K)ZXRo&URD*5TF_=fP*?Q)i@V_6^!zQ0Kzoe3-4%8k zbb~TYryGY)_gSxQA8QWZ?qlG=KZyFZVD%+s9-uqp!dSZbK$*pzqdSZP%JhKJ6(HL9 z_5_#i)1b3wc*PiYfsRK3jX4{b@< zSXwWEnx^dCr~Y3!?hKk^Vd(beXgyiN z4&eQNyFiOd!5gn${AL9C1+oCL4pf8m@}77i%J9Ot4K%J^s_xOtdjrH*hVVg$`Mdz} zg~9w1_G92VAke;`NYHZOKdm5b{4LrLqhdi~FQ8)L5V1^<*cGT4Xy>L!FK;eL>;P2k zJ!rbDmv`blQHB>XJ>ZjFQb9|NJDFebLb!Qgt~1ArzujQzG6-Mb#ajr!4Z@draTmhx zgYXqzoQ3eGLHHUk_M-3&UaW=imqFw$Ud)B?*FpFWFM1*TZ4kc4i&_YOAA}$9A{T`p z@gf$5pYXyLg`e@l7KLB%LKnnuwr23?bgtlUc?L?=&D9(X{4KX3OaTV|7SQq;kLGF# z2L6_#5K#pN{+3-3rUnCl%X$dYfPued3500@IvO3qbYS3b>4Pvm82DS7A| zGlHR{(4)CJfuSVJqq#bRp(GhJI~nKEnWF+eQ{Td)`!jfO&GKt_8p=@Vlpc2m7G)Qi-r@_i<1FERcgN4*-oKgN(8U8)XXW4tw;9 zg4SV!t!q6{q4=3!z?rA}ghzKcXkIj$<1@cNFlad}H{{IL|CgHoaq{;-`WNmFKE36j zdrBL)Ku6N#sARy5k@4sb&*(n!nO^|Og#VX(dh;Ei>v2HGAOv!Wfvz3>f1&k2g(N}; zXyI%yXf3U`!2e4~%C(S`OCgklmeB@-uHf@l_SU+$ZS@aVo>)gqxC?AI6?>L z!o6V7?KR#8p!RYPG`vohN`TtblmCLw5ov)4cAo&HQEs1Z&YuO0c|!G0Ucu5e1O}dm&Kvkrjen9c?08NqXXb#5^}$VfJbMB1X2QUa5aA7(f!J? z`+`en!U>no1O*T9O%`WdjsCxgti;M4CyR16?T9Qrmvibv4q zbdTOC;B}{v(+-WHGA}{B+TIWq6UeEDGEm`5AmQ$_FJ#_>)(4$^!Lkr^w&I5sOeKQN zH7W)yrCiOBU9L>E-jE}4KnFQGZfATE)y>5KUS6~le1@ZUHy4BPC5Ykn-Jo-wu6cBy z^*}mOv2qv0jSMUd47((lVMi)n`VE>GhMcbR0Nj5*=h4{)nkae^4mvrjmsPXyy61pfrpHHS;L&cJWyZ5qnEWq8O#HZDfY5Tfz56MjZ}K{vdY+i<#vF|wqDjc zeUuXx@2i3&-9RTS9s!#HK4EdCI#?8R!eX5mmN0A*kZ)KL5gA3^JgU2<7{8K=`1(HmEI906AarMLkGc3HLV_l>+GDilB>6 z3cyM{y4yjH1D_ZOIwBC9P0qbovK-Xw_2?Cqt_N*PKK$bI9#C|H)q?a{>|E9ZIumj^ zXw&`w3*9a%7O-RdI>B@PFNE@uPV!>~b0oyXK!?5k$OFkhPv3hD;()q1Aenn04ruxd z#JLFKz>car0^)!UQvk_qhj5GxL7Y{2pqXag-JrcMeYIep>g*C_U|;~94e7W8)Bpqx z@qkvfw;bSaF=b?6*yZmEI&4yZ!0~p_I5Y!8!~Wy#ptB=DCjq^v zat8IoUZ;U>dyRjQ(*a5bCth5U1fLfNDaJtO#WA;YF?1srV4vE+2gpIottV};qUFU- z&_1T_%O1VFi{A?{ys+v7nRxoeq3_HLkb%ew&{`W%fWr2;LyBr}gBVmFqx9dQM=jj+ z=r(^bzY%n3+_4fpkK^qJzbRPs&AX1hYETx>55ghz2cR&S8cLUhyd zi9odkLpL9P>ol;7-7`R1{0d%JgB^J8g)xZkpWtu#11izG zCqO)Tsf5F$+oQsx)2qUxI{e z!4lwAN8n{F;4>y*$GCQjZVQ!W0J%?eYp66sryCDc2I4u<6<|RDRKeL`K@n8JKCqw! zs$e5n5Ok>N2hf=~;4YwO30P18Rb@I@Pz6a4bTV&uJ7_Z`$SvJ|63svVgF0vJpf(%0 zmi>RB+fM{V6g1-l5|zO!DgYAY_UHzi0E+N#KOT^fs7H4@sG;c7>j%169v<_MkZV0q zBI4261`h3Rh)`!i#cOtt&h4OK*#F?G44e0ZE;Quu=-dtp?K(q`?)e}|(7Ej%o$U~& zdqy`mD5Sj$UKoCXWK7L3%nbkgL0Ub!kAYgq7NDUo=+$N5hyv$K2mzg60%eu}kM5t{ zuZ+KSpMo4g_~S*qCunyK=pLL>36Eah0MN!m>sIi}EYMYUG4XM+hhfWrU5&qabVBx? zfewpi;BR#U4al8+(d7lIZCz9}z{^Lv4?8yg2bJ-q%C4>7N;$gw1(+EaUbBMN5WbM} zVqgF-F9FR=7<3=@=}b8SI(Gwf66gO5KHbwnv*o?PjIPEfLAgVt`$YE#&=5>_ctH2L z|CfBa`$7B2K~f6faUswE%|*xm#~hpgG4c1L{Qv(S>b6zjOawj^7qrG5)GPrH79EEy zWdMzLfCia7k|F%o19kqOv-R(N0tGRsvt45E(>)#35`by%hFtID(|rPD=_Q};(;mH| zW^7^%F5O4LXN0^kTmaI1`bFm_W`@@yF5O2xdPQy7#GnI2!eCkV0+6-fb%RQ5Vhk_N zHZwE4=Iq?E{s|+fR0o~@2ud@sMUT*h3gC!<#3#7C1;wUs3HOy_7JVP3o21T1ui(LfRc^@WbGYzC=zTw zsDB0N&w)CU3XY)J$pH8w_E#R=A0bUxP|kS~^%3N4NW1ejDA+q)p{F{68g<5R!R4$+ z=W5W}P|$&ny`~EPK(oagA*(4L{}qLt!wI@3sh3ygpD4qN={Asd(;Sd--Od_2K?g8H z)>AZtHl`b20=duuEDT$b1wRYY06f~c14M#OSqCj`1i2G*2+=l>m7v7$)61Iu7c|~` z4b+}EFUs&j1#D%BE@Z-P7sx_TH8j^1cJd=w2zvOVx+^HMK;uQA;6pzAvAaeEbP`N} zBkW)z@cECRtFmC1@MS>HeFX0l`S@bbkN=`3heO=qO@@VlJoj2Gzi=jdjG zoFUh;kb!{#e5xFO3#h7cH9GlnA_D`1i$yJGiMng|bI0!cufw`eK?juepaaTkpaEq? z=zy}MM=x*mAMo9<8IZj;ak0@a4>m9}KphVnV(x@E9vUF6=KufyhYGn^)~WEfsDX|x z?BzAaFsHJCnZa=*qf3XsN;jJ=sErCeWUYk7=+bMZO^hAks-V;S+&zxF`+x%ExI1Wn zKSMM4981vbM>jQ&vE*Ox$KunQ$Kuf&$IEcc9#I{*VO{Go>kvL8fP^s380=iXwDN6l80f|di1h}{08MU zV|MTknDSqsl^HH73ZQEndwDB71Q=duTQY#pWAp{>I}m+XB**~T;TV1LGk+Xt|E#-3 z8h;))=(b$`xQn0p1;cGXr>?m&K+a%ucYwvV-*RMBn@p1)VYY zLS-d0L#Mk&>wyx<77x%iBgnkB zN4Kj+ceqBkKga(I-OR4tM|`@cf=ZYF2Ve*1UHk!BY39lR+FuIl5&SsBVrvEz0m>n>onM{4E~;|NnRC z_V@7UKI_uW)*a6ALdOxbGTT1@EaL715&~To)E%z@>RZ{(gZ2XV{uE_!=|248?K)nKFv8XyAK4D8Sdh(jZPpakxuAEFE| zc%crRPbf$s3jiQNY5)#W59t15M8JZkARNE}*v$yK;44MNU?%wVLGYra6QEsspeTX{ zWj6zOr5a@I6X-lbk6zZcAE1Cugt&JlXc;PKuNNdWGo2D;coAy`3E204(F69fJx0JL z*fTJ6#~XkG_URmGz^?fL3D_xXLB%8F0tCn*fZcu)F5L_;M|KOm*x1AYnik=2?FTo% z{Uu)XzXEAG|Dqj4_ww$r6k&Mrx|*5cW$>T>|6MHVRry<@L5(JOgvI@UL>SvLj0khW z8ey&9K><(-34j&fP$KN%H&KQcF{Y3Jcn2O}brpcFLqU$1Zf3|akQm7wR+WO1J#3ku zW49{cKdUHVheUgq(?97r*9x9)j^yjit41i6QT?+PMScR6b%Xll*Ddt zhY=@dY~gVdI2#%#3Ev@c!mx&!!KK@c0}>yO-JuNKeiARV8X?ipQVBj56|&nMkte*r zLxOnm5@v=@_SOR>yvN*G7(IGrt-gseymo|za`$z3u8>s#`)CTpN6z5o+cB^*vj(($ z`@1p3N1eYx14jEm%R#{d44}dV)L3`b=oSa(0Z3(964mX-fyf4+u=8W-_UAz42XJu$ z&I+LP3|f`2b3Qw$Sseo&GuZzHw1^VaR*^j}%J8BBYW?q@=!yKD4Mu=g+b}S6%Y)K5 z<1AQseuISPhE>cA-SHeCxu-Lsaw$-`DXW-46(Uoq7%0TM!&p4K`@my~)u0t(-9J2f zS$}>3wcP3>9Cxk*yA?9NAq;n`q>}){i!(+H3@<}|!q@jXfakY7x*_LVDr1~)=}-ag zZbJ{Zw0jQjj37-ofZC@Lp&rd|5a(OI1P|K(2elPDK^IYX)~I;ANO}MNzen$GP_ufU z7^oY`-+Hoy4YW@Qw5bfV0s0+d=_`-!&7iIqXf=Z#r2XvC?VQog=h3|n)C>p3rC-5| z9nV17`rL~RVEVg9>;KXl9-yNzYdpFqgT~uHr(tGz^qT5_7G(e(lAe|ZzyA~YJWTNU zGSKrdr-0AHECEOF1Mt#h&|acv4gw4>W`YJRySqUKzpw>a*|{6U2JIwk{a?DyqnrE1 zu}sh?^XV6IAZf@cnINCTPQ?Vz3?uayK&@p+dmh?zfDY1p^5_QNUj4%C9rQd*P$Lw4 z9wvz4(YgKv69a>X<#y0ULGXE)AO>i`UXrDDiHHN}EKEMoEUE|mAWX|_4UgVnjS>ON zY#q=V9(Tym;r}mKW*d0)1{;7ROi&~|y1gY{ggylY@#z=7AR6B>ml$4Y1ceROBQAZh z9dY^R2{YshB9HDH@FOmLx?4fb6>!Sy1(^q$0Rta!ITykMb(gRoxCu?bpz|F;o83U? zJA#7lcmrrFCFo$sV+}o^^BRve^g*bF5NZpE^62c?0Se&G4$$Zrczy$xKW>7~dH*8H z@M3o!Xz1Bl0MztTcu`vdS~+mQqgT}Wizw*)SQiilnxcEzR0_VIBO0Ws4WbF$UQ~GD z0oP;)Qr*kT52C=Dd?A|5K$-#}niL>53Bxr>f>ihN-U2P}25XXlXbRj9n*W7p(tv2X zR}6EW$$qf&mclhXE&)65$!Af97teFSelmb)S_#*59HhFJw*W+eZCVG>#167)6GRi} z5cX1q7bS2_ul9j$vW9D_glGbZzo><10-tHA@WLLh=`2JO8(fnMMAP1Vq6{xQAez9Z zS}MHYf@@j;(R2}%UBS-dhiK9O`AHa}34E@l!i%d#uz=tOS<%Zo2d?Q>F*qQYL7ML6 zfCB=2vZca{1#nHzK&pFr(?Jy2rlk-~_dba-yjTg*1U}nR;YBuF(?O8xUS1;*1=dsm z(X5X+{(^(}(v zi-zl)3DL&{a^YNvKJcJ!>w!{*7cp>sk3brFd6hvFI5-j^`l>+or9$+9mZ(GQQ-SM? zg4p-^11v-|A^MU)`g9@sK;uaeeQye2{&Rxp+YHzDu@LOPs*j=!FTQ4h{RiqqK=f^a z>x%+8u$Q+Qu5TwqUlK^)UWh($F9z(t8n`|uh(2eyzD9^XE0Dfch(1uM2C>ftu1^Z0 zj~lMf6QXa^9#MuDz7Tz&W;jG24_x1*J>dAe3|gQH4o^XdzEdE5q7Z$c&ND>cm3&yZ ztb*v94cB+G030qsAbod16&d2xONAG6;QEXp`jX-L7DDt{f%Gkf=mX7^LF`L`>yv`$ z(}wHIgzEbs%J3o=q7O9u4$-HB&<6^TUf$23y$WFe8A9|4f%KU|^nnHhA^N`L!Tk3L zWKl2gZn(am`C$Kn#9#c)0LMFM)Dog^4_x0Rh`wgHzJm~br{0S)yf_Nc2O0o}=xc%N zTLsbQ4cFHR(FYQL(F@TBI{{PSg%4a`7et>hTwfqWU(jw*h8Lj_eW1xPh^hJU6$wKr&RzrjG-<@1oxL85-Er#oRmELhyty6~Bw*;r9|3@_F~^ns_a!TBKvu5TB}W4*k_aD9akeVah~N+J3{!^;r+OyK$^ zLG=B81M{CHMBlGnq6{x=A^JeW0uX(Fa$x?uwF?|BhvE7dA^I+X^sz$pK~|7}!sQ5D z-zJE@Zn(aax!`bF1=4pm4ID0@9tFg{9=N_Ph`wOBzKIZhkKT$hyqF5n2b$%8=nH}C zI|K@lUS4UqzDS6^T_An25Ph&yF%@3O!1c|7=zIJc7A}eqeUm`?R3Z96<7N>1o@B$q zr3j*LHC*4z9I*egK>FUMg8c_tj04fP2CmNwqOTaPZzDt>Nc_cCh(6GS3q)TDT%Q(1 zpEX=xB}5-c{6#H9A80}dqR$4dj|-xY8LrO}qK^sWPFILN&w?%94c9jlq7NkgVlG4IDsX*X5Ph#- z!u+QR(H8`Ar!GVvxF-Y7e{V8j{xgE;+YHzDF$?TJkob$Q$zcD1mNi1`+XB}o1kqOw z*S8a*44V$*#PX^XgC<4^E`P4bOD!3Q>pH~s`4*u>xX6Lerx2|IX-^EDTE z78P_+(?!Q_2Np;E^-c;{kNuQ@9Q&yNKK2vR89f7;zen2N37cPnos-lEI()*n`-4aK zC-8J4XxW%ZH-jyBx`W*oH2YD?(*621lkr>64^8+CI;4|7^6+Q=$jjg}L<2ta z3xZV&f>jDaRHmpHw7x9?9ab0uGDXlwMFVuAk?7iJ(7n`k0v^2u5}#f91^7NYf(|AH z9TIv9bi(H)7k+^h@TsEELr7it1rswIxY3kXGeZP z2G8aL37`1|JV8gMp5hmj_{=Zp@#izY0OM!=h(n+G1sy;qqk4i)O+Cdg7y*_Bt>|>* zfXRbaZF+)EP6f#ufVAs?Yyh2}3fAucGF`-@`5@@@RFE1EkQx_{<^u^H&94~wTXR6O zXx8^@4Lo}tK&w<)?!k=y@tI%1=N^m4|HGg8BjAqnXg&Z=5?3Iz$k0^>-JsjLyKBHl zp&6jWutO;LfIP=g$1soXH{hKL-Qalj?f%HGS)u|O11J$gi&wT|t`3Z^S&q3nF!*#Y z1$ELu*}QuzsGH~8`s6deK#>H$>sC-N%=or%>l2^kcc4R8_khna<9FQ)N_sw>xgI{9 zSpvSGL$@4Q85lgfueur^@HqI0^+h;%-2>!!JQr35hSqQVeV~(EKJyFA1$CJ|^9w8m zb-9}V!_QQm3K|de>Gk07>5i@Ft}XEBF3oW1u1)ai&h-Ed`SHtxmK-xMIPz~3k>S@k z(tU_u19XnWai8P^-G}(sA9v(mf2pC?f#I_=eSMsd zFBtmZGrxfA6Hw{^r3wMx7oYhf&wb{Py!M$t^4Mp7L687gm7wdB5-yOy15jRl!7t$Y zz~ld6M}9#@r*0NW$4*DkX{?egj-8Gop3MgpJgx8Y_r(4G|NkZEraGVQP!FH(-!9#A zLH_dSF0JVHE$9wS@NE9Y!rx=d%)sE=8>7PF2rleBdrMR}e7aLTJe!aF@#%Ho@I3g2 z$@Bjazh0ZApfv5%SsUQOzpd7RU!I})KkV>S{^tKo7-y#*;a?957?0!&j@<`c_}BM> ztmj`3IpNgEBl(0!w`&H!fC!^!@<|V7-wIGTxH5cp;*az(LJb{oJ^=*=&d>oZkV6X~ zP@d~%bnJ8x=yqgr>~s);IrqL4o*G7zuq;0U*j~y!Tjr83t)~0xrqgb ziyb6DvKTIw`OJ?$KC!#lK>_S!1BjDNKu!i9n#u=qF&pg6)KlQIN6B=r1y=Xkkm+6r zuzLd_?hOIC7jj-IB8Ztl$EA8fj!Pxe$q`tc97BeayF(Mer=lKW@oawE;K(oNkkHKt zIv~}t)1kn#`7lSfBTKh$fn%pbiD&bR2G8aa4`M2}bAP!1J$rAkQ54!TNKMgJ@K!+})B`{ESaQK1M=b&l> zZ+1X0EV@Gz{vY=Ie;k}ASPa3L!o?8kQxVVR0}3Et^w@!li~tq}2CrU`Tu^RzH9p|U zd==c@;&%b99|JA@DP=c0@KT2bQj{vOfSX~MMd^IdI+1SQ0#F&^(;b@O(jA-N$iIyT zTworA6qtt{`PZKW`5$ynIrQjbBPV_V5dms?9#T?*>R$ z(T722ZEGCiUk~!CEC2eV5O1FFOg`Y#?V16KRu)5$S3&I-L3R+|#}KL1;}`TIIhOea znPBcgD&ri%Wt`K0n1jG&9DWz^3pxp4a}lULLQ=Zp7j%*UIf>P^oB1`o3}XbH`wTvn z927vrxkm$=dqC|UQr%+!au1tpw=)Z(8gK-cQBI7c1(5?bC%F(RlrXX;DCHf8l}h}A zP97f3hY~!S4-0rUALM`(K-0hl5TtR`?d#!b{gJ;Hw1C;S*Bw&gIChI{frKx+BmZ`h zlGjY#mqD!(X!>*HUw;*v{y^Jpxy)J6?eY>K)-TYK zLFyw&Za205QFZS2CcaRtuzF!x`V6%T6`U}EaC|Vc;VH*E6|l1pzUwHyvtXKGQ8LX z+I!NSqf*dvpi~01rt9N(PSF0k?ilbALI=mV__)I!P-ntVAU^*>>JP{#AVuAvi#;If zAf2f*p!>lg8?wWp7i&O+$QR@V@CjBP-M2v7v0D$6h@!Q+Ssk~4a-q?a7wQ+l`ve6% z8jpb5XOKI{V?n1Bw}S%Bqq7w<4}751&$GK96hEL}=j(0gqnrNfa;6f#%P9 zMYmUd0-w!W&jdR6*I9sHuoZMr1*$t=f_C-rZ*%6bXzc}ggSP`rA8Q5A@50UI@#yWH z06O=#2x4|L)NEyl**s8R^9#0uRJ{b90`i$(pjg0>f7=m$jejoClaZZ4CnMJ!7V+qH z7IAHPQp)1d>nzi-7c_0m@R>i-05tmGtx&4RueTSp&jfl9a4TqE3FIK)t)N{c(1U<` zK^saS2LZc!U^xgFYy@a90IdHrzaUsMNC2$!SS#4thP@zvGn8^R>;-uld=PLeD1CsB z6#0LFe;YVJI=}$}x{(%k5U?U6XjlDNN6@Gm11JY{pMAjs-73Y(2x>w&3wSpFU@8;! z=xzn|_7JE1J_BXdZs&k*Z}2Isk)1$1NeYn4;#<{zX6~Fegi<~ z2{Ts+_<#ne9Kch(=Ry8yJz2u*+kMot`}_+YK?a7`g1+5w-=2LTDGFLGR3dGB5`5TF z^FLOX?&JKfC*Yn19d>ZfqgT|R0(3HNbO0z9v>Jm}uz|090S~(%T?hkO91h9^9^H^k z0Xh*El2=&kE`SQ1e9$uIUe?YF&_V}t2v?V!0K*Ggeg+2gTs=Xjm6svEm6zc{J1@hL zR$d0Rc3y@RZ4f?441_^qphCtW%rV3fwEm{R)%b~P_XVHsm!Q=zoF3hiEEpj-pkMLm zZiJQ(CF0#2jX%MIcOY6qOstgEaRa!NIRIM!35smTUMKKbZc@|J)4?=i!%yQgVG4=;l!=#+8rJw7ilGlGtdIay-w*!+^QM9i`I zCnJArF(U)Re$e&8;DCS4wV#cFfdPC7)^5=DUyt4*3)hwdF5REIU-P^CcnKQS_U-=S z+5N_|`;KeNffBC$pgW3Rf=1={gLd(}ECb(n|C0%n9g8d+yZ<=wPdVOvoDXcAWAjfY zuvxzRu3tR)UEg@}yWV-}j9m-Q>(e0hXa;e--ik$(>-Bu-dN#<)H&^2W#+UYkeDFdy z3UoyPX!}x0?QX~(=Fi=)U!G%NU;y8Gth-p0;l+sr_##mx1NgVyc=0Y0uHCNXHrPK? zk2fC|e7za0`~4zOh8JBpb#H*{E_DR0qZbfic=0EQnZdVnDQG>5(E-pI3JK676(F$+ z+DQhAXwXInP~>|wA1MIU`EiGltQUT1`2YX^{h|z@L7O|C-EVxmzqoeq1+C=*oeU&l ze93W#VK+$f>IE?-O z|G#HQ~w8mEFLle#(n zU-D@E#@`~%2y#bw0Vop)`*a@$EvBn@06GwrzXh};t@*zIe-mgd$+6pC1+;HS+_SqC zG~M=@Um%VHe2dj*egQtv`I!D1%|HM1gV)!8<`-}i@agqY0o^_1Cj#nnL5@(`1uE3Q zd&ogDZlDoC7ZuP(Y&R9~h$Uz{wx0r60chyY4KyU^qXO#4`+=^YaZ&LA8EpYp3u>17 znSj+o2EBd$UwEwslIQX4ZUs&4p}Ntr+aF@G0;s@p2d@ed^yohOV#R)D2G35gKnWk{ zJP*)uXD41TKH_Ka?c56r=M9W6Km7dCojY9PF{wKoxBXs zJ9!zTx_B8Px_B9Gb@77Rdf@T~v|Nj;r1WS1i)}kEMjQ`5$X3TSF}uLkW(PtD$4MkTYju4xc&W0$QC7-qg|= zq9On~xrHOt5q2_hg-zo7a!xdnWi6=-bs zEr{O<-sTKF5D>Io#k2db2mksXpu>J6e3F-_fL2iWSU)ex@Jv4E!N30e3uEvVeV~k4 zDh)cd0(|yc0qDAC&}N7V@V1iJ*u$W$o*ACq-(6e3)v0)Pzw-edW4EJ%Z?~reXtD5%TcGf3KH>phK8Swa9c+HB`3>TP?2n+; zw~nC0?moV-JpwxN%pJ1B%Hw!DXzd~>GeA$s1~~(KLQ@Hj)30}eHcEjzK%l*|IVzCz zuhUO}njxnk%@C#&@MZ{T1#|N((EbO|>Q~SqVW3k!GC+G63qWy*x^)U1CZI3|pMMQG z=_3J}qddEBBA>(i$*240i^9YI|2NlhF!1+*D(mJt9tQrtt)Naox2uN7@m9FkKufbh zn@&LW5UAWGW3vyqCHtBS)U9CvO@$r=?GOQVb->#;z=!vChl8Rjpxa#llngvT{s12) z+wBfI#Mc1zEZ-MP|NQ^oP_M$k-(myWAmGp8*nO0Ly&I2DC-l~X86M0xK#TYt8|@;) z42?=zyTdhJGk1p@{J+rcFW}hg$~g15iwdaFW&o|vcjB|&{@_n$IS#Sb@$Ld1a=b05<)H!03Cpf+d(PJlqX~$;{orE z!1Dy?O!)liq6{wdoTP&DlSNmY$-NVSh0159VY~if|@h~{NL1hOtyg@BINO;5Zsxxw4b!Gu)JoJDBZA=2S zGeJA69lF7X%3DAR83Rz7hUQ<}AE5HyRihhMY$I&P9ota*!4ZosPI214|2x!nYQ=RP z$iQCK=Z8UY9RP{zNe5BlT6l^m!wWYCV&WQ9;WS!tBA+|$@qYm*P$6|INFJ0Ppj#;% zAytxtNB1t!&KTG3kG|bMJi2c>Y-4Pw=U^zw_&*)gP4B+YdY~i*G|rgdVDt^t0RoMg zfHqOEI#?K&vU~K(nhOaqbf0;Ghsvsw?7eghpqiFV^k z>&X)P#+RVutV{GkJ!#mbBg`eBOGlpV5&&N|Qr8E$bR-T++d*kHC|w4kLBVwf?DDX1 z@D_3fpY9?9U(l&o;1vKKpz}Jw!?uuvsXe>FJEh!5HueIK-M8MJ_? zgd4n^h`$wNmLqs*;3ep+QSj=bl6PRql6qUv;4yzIXr(aZ9PO8&Qxd^y_*+13vt^M8 z6D!#dRR_wzP_sajKoCQYy}ku;cfCi69rV0TJ&?P^#7g8q?lKeOZ>jqK|3649Osr%Y zNUTh()ckdd;||c!!|NDFNE;)>aR=yl!`D90ZPj+rZPj|{+p1$gdlb5Jz$-BnKtsqc zvz(b39Cv_5L0c=Rl2Yj~7Ku3=A&(+aCB>Zv!=zAU8aK+9V~C z9^GLAkh8xpd33wMH_g6g168&qN}xg+y3epX9JKipqzKf3a)X__{M26DDE$OPyfI-gFkd%E2{z-N1J2A%C)ufkBG3|0==$_qM2+oSs& z=u*INju$V$$7q+-L*1tXR(KG6W;m)s(C|*nfs!z=0*J+)&HF$uWdI!=?graE*&WUS zITrxbZ|H)Uu85=w)znO|0`QC|Xmk^Fa<{ujx4Vx=Z>$Yy%U^&cbE#0bdjR;TZczFH z9p3$#*{AzAIJDit2E+a3-~l?Rm>IMYcmw#1F}SNhr)?u7C&MHm{&;N&jvH;TVQ{}A z8J3Ky-n08Y-0NCMn!3X|Acu2IQxm28M3tPIn*B$=vP%py8hY z*On*zQxAa7NpJvl&OAUR7N~~?PMn9)`zxR`{b0RGgNB`;EduorZF0Az-N0XCqn4jp0#52%-NdUS(_*TH8ogW6sHFF+<67@*2Zk{kAdrcfA4 zqCBAP0-eqc3JK<^Q$UW8=$;A=kEtLr?WuFXr*ng3y1{c4%-~rNk8bdJ;V#|1AbFSW z)*0Z_xgir33=MlhJJuLVh55I&f+oU^Pl7IPn|jdtM2SB5AS}>!NYDw^pv77LFF;SQ z2CcvXjmLC=^&D#jo8i&=AAGr-<37;+bT0fZA4-foL6-o6nwTEUCqO;T?pDy6Yft90 zp!TJP;||dMfZeA+-D!pY7rNagUbF64z{()x+U;-Q0y_QXI;al}8iY!I37WIwZ^;5T zwYGvroto=-{+9%M^v(svoZ}AA@F-}szSmFZ#nm&QA-WPXkM35`nsT4+)1W&=jSqmw z*ZyDN7hvWWbkpG%@D|_~^t0g?a8}?Kbo1dC@HXHV^owz^UJBaY$KSFHbf(55@QLM5 zKqnA@L(9)}e|Vwd0T#%G3jBES8KNQvDsbb4 z5=4dfTu=um)B<#LEz+UoXI>;hG`yYzG4jTXLWsbvIUo(L2HhvRFFXFf;L-_pt7msS zs0{Ofh3{QZLq-Fd`AYk6D1h zqnEWGbV3B^nmce)6ih(d!@a!SpyMshxr0&x_`IhGk6zLFpc62Is`kUjvKlLX6w$BH0^fam8un%^jR zbWemF?{yP2Z(!`v?G)hA*$5Uo?i2tTfb-~XhU`o~P-5uO84%#neaNG8GFS*~>aGY- z(F5wOy|}p?E|15u?Bw9z=JmhfArqM6!2;p2KzL9&4hWA2A}0Xh2|#!X5S|Ex z=K$eJKzI!ho{R_cQP1XAjHRuPy&jC9<$j=(-+LVyn}6~-^7|Zg0pacw9?h>A`CIis ztEIcaTkWrd8Zs81-RE9JYJ*NS1ScX9aDfUsNz7$C1A}MhJW$O8TH7Id4HUFBDxk~2 z!37zpP1Jlu0cEW;IDVSncsTYt-uLOg*!&~5Ou(`6C+NVXVs`MTvBzP@#-E^&E#h$8 zxfj%_6>x0+SzpZN*nIH*YZk}mgL_@OL5&q36$S8>A%Y<)Dmzp?C#itW_F!OOaCH3s z@VE=;uqy^f7x3+C8eq|jFI<=p9d}XD0r5P$CxP7Uc<=?YWA*_)7wr?ESnTBi$KPiU zeyxMx=!5VOkY1+lG{%;1|N8;1j3^FUtrL%b=sCU!RJQ>`EI|AAX0}AakXFR$EyPH62Egd;ZIXt>g zy^I2{O#&AtXU?4IZUjp@aqzb|qDVlrpYiAp6o484u1p|ih{2UY>%STm3776eKHWDP zfBAX^xbwGy&h_?5o(LL}Grr`~eaN--Qk|7gcPD6lQTHLoMw>?P!BxJF{||WlKj3M7 zsOGgt_bJcrgN+uTj%kU~|3e=C4|+5oVDYp*RrAWTyBVw#e5yPLDDz4j_DDYE*v--j zN^VdQ&*TG+-7JkrB97fB4*ryBe#r0IdY~i;bmc^>XL2*dRjmi=R)CJXI|VhIA9Q}V zizNe!-6w0_LZ!Qr?S_hZB%kVL=|Hm2wfltQ!JiV2%@6rO>y=M{?uutC6?W`Cpvu6& z&tS{Iz|O$m62=6Yz6LpowfQGwX(~)t_d&46=AT^rEui5$$L62h{4Jo1(BWz=n;-Bu z|6nQMXg=_}`3GaU3dHCSAfpW!N^)!&7#tW%Qf(O+3K&Y_Y#A6D7)ruHy7?gr86el! zm)b+Q{2&*ym+*jk<3CpZ|Ns9_DVmXzwhRmk3?)Lg3=9bjCET_Q3;_%!EZx6evw~M9 zU@=?Uu@ThA%fP_E0W$RunyEN~<vh^{+<{AKy&<$d^lVjXakZH56mKHdD(ihj;q)4f9t_g(5*5X7}2E9cr?G!X#S;8uI|&zs}TI@ zfA=9r{%tLc3Tt^8T)SHuCD!sX_%a`K{Qm%4XJ~+`4Dk9bw*MDe4wSwEpJb_VIBmku zHM|TAYk5IUDMkiHMlfbXqCspBhA%XLy3ZpSe9u?wfjU{A?h~L|r@Il9$t(p*_&xt0 z02R2t)(2}o7#%nac09Cv&jHPam#9b}HLpCof4Fpi^60+l+j^jc%dtB{!?U-*;5Bde zO3+1N9=#i7m>3uwoBwfv?g_c};xQ+9m6%q;?n$8Ta48Sy_{n`-U_sG_-Jpt#0d!RI z=@*<}m8C4k2VR$f6s`OU8dV3i|4PzaIt@IIJAj&73?9cFKud%ex|>0_`E@!;@C&eY zX6blzRvGXMI>~sn{x4zccGu~2vN-Mpnsj71?gZLC&fwAAZ2_t!JH0$Sx|_jF&_QzD z-JpuF(}M%l5(OR13~v8`rfwZT)eWqz2&><3z7T>ttCS7Ykc>Wj9CTtm$X#If!Q3UV zfstRJ859`&f=(h3mC(q*yif;lN(O@C0%f9Q6oNH1~r$;f|o?i?3Xb59|W1hXVzh8N%7JKHcFKE}&pL ziX+4fkYXOxmqy9L`0WGLq9FT@flsFc2NTFX14`_JFGB&}2LTy8gl;G9U84dDQ;+US z2cPawyFg>$9-XlT;GuNK?i;Q~Pryr||MR^6C>&EY4eXN|>v->Fcx+&iT z=yg+&J+rU5K_kc&vp^lTAH6Km9-Xxu%m;juKX@K|#?-e8v<21j<1<~H#6%gs60VWMVWPk~nv;mP0Iv_H_qSH&F(@Dm$*O8^uNukq8!?D+qwbMz*vDcBk z(@Vv%*OLw8t!R+r1)ODI_9?*Z1KSbd05Z$L1w?vyfXM(584v;{V?d;X4~UG2==3t^ zbTV=5b>!%DvgmYjaO`#D>~wPJ^a8m`AR6Ra0cRbUJq9p)z%GwS0GZ*C0wO&!z+?f4 zbjSgb0VR&To?IYSM1^CoBPiqr18O{*4?A>vd4Tq*bvpStHXj#o>~-Yn^a|;83g~o- zaO`#D?R1K9Y(6Le+EL=s{Em^oRTErhmI}CZ)>im**Cx1FKj!ZRUD)N)?OOrbkLlQa zkO{P%+4JBd79Zvdj@oxzx^IKRDGHPj{()FdXbA!2u!taV>`Qny9|FaqpaYmoC^3LG zo^^6T(*qKs1r0)Y zbjM2gc85oJbYJ%A_T>QgLJPoT#&H*w1keRtojxiN-M%cKlaK>CeN;R=yU%yls5pRX zZ;Q?v&^<~nDjJ}LfuNeo@&6^zyjaVDQl?I8kM3FyXm$tP({}#F>}kxfY+J+uT58%g zjTy8H_=rb$Yyt9hZJ_lVt+)C6Kxe-CbYFkD2;4+bie^s(CO^Z-2z#3*Bu@Ku9Px5T~rdfTfler zcDkrUfEFBpX0Jel!~xwcDxkBNz$-LbR6uhxoh~X4ASDMtc635k$AMOR-hdj*FTf5KItCt1VdNKV2DuhV z0azA^4{g5*fYv7&H0%U7Y{BsZ?sM=9I7mR^N5i9cB50})IZli>gW?3{F;Mf;AP#g5 z87K!hyx95*nkR(SM+u2Jjm1f@xjUhqki9-Y1lKE1u5 zr6oSSt)R&=P*zaz=$#6h=X2?{bg`~v;TLd}aN+l>WHJ8c(d(<>c+213@ryr**7r01YQ2o4K_-<7o__|b{}f3o`sg+EQi)$339oSL+)! zk}kb046fa89J_zGbh@%=|L#7geb}Y@^K0>59%+~E58XdIeOa`BxOBhMzTwz?ru#7S zflgnBPFE4f-Y`bUq*kY^fORX#^>sXs-|rrG zhFfogC*;qAN~6}3bxAJWpkuv51zfsgSzNknIbi2EfKE3*1R_rIM;`!B{tB{u296>_bHD-(pw2bF-oYx>QsvM50u7)(Hi#=$D&o=I3zBpN&1YVIvFpqK|F4Bm z#nPA=82GpSfCdAo;yL|7X#z8Y1OK+;9=)j^p!GhWZ4@Y5C&4My1F=jSIaxNo=>UZU zBxQngqie6nf8$I1nxzh&$tN9*{(BsJ$l_}B_A|f029V<%wlVT+)*3i=-}uZgumj}y z&Z(e?bm-U$N@*^gz6_v5?a}xXRCMFMf7K=w8c{AP2CunaB<3K z_X8^NT)KaOM@#I$hYimKrL^Y5|2kt?e7X;Kbh--o_6D=~bcRa!c7Fo3KK%ZGNH-RK zy%SYzr7Rm6Uo#n<1PO_Oh&T>@y~`l+4IuFYF4n(Gr5sxRmk2oW>oHexm2x=p>q%8H zm54fSWqd8ra+1HLjRDl{=5Os~WMF7HSyIKXaR_t@hiCT*NB(U`Kl8^P{(tB*fBa=g z5O_8p5cte5$oZLHu#m&2(^Y_9&-{XlpB?!l**^0NR`Pu27j$HS zJ1FADXa2~0pZNtNIlyk2#{fAl$L$ZuF)aLTy&wVp2(Te9L6OR@arlMqGG>O){5l^% z;p)cnLJq?H0phZ~5P!18R%>VxX zZ@p9^Ur=-I)aXnaX0~0^8};@w2&p@ z3P{ZvsG1ibb8bM@yaA~J>52fU_P7I8^8us=bYhL?7mxxFHv+`+c;ngpf|0)!bpDK| z_4QhNkM2{T0>%Thot^m{zs4btUQdC~{E;k|!6pehf(-Gw%;EvcXo7(tgCao&dA{+q zzFu?Qwfned_cc&!`_KFT|M|DwfCfFN1%B=YM>jJA|F**(-JrND)$r)9HSp=qweaYE z3W{sQ-f~a@32Kiatxo_C*m*$aWjr9WF&@1lQ$gK;7mVGY^bBfqfX3lKlcC^CQo%zY z9*{|sPLp+1&59)C+fOeL5?&e@*V0dxE9JKbsqgOQifhdDd_wg6* zejt+}cY-6#1UV05eH3W+*t7emXZHut>dBiPttU&u8*Eu$OEEB%@PTI^Uqps7GqfBi zacJ0m1JuAQ;q&O_jeRW2@FGE)nc=mKM|U%*4*;4j2Fd)s$95evQ=h5r_-$VIe39E%Z z--G$Kr}d4ZA3hNE9^IE;ID#&=Yduh6>C^3_5&<>Yqq7ZUhDYZ-ki8zQZ%bHwI%^p` zy4yhZdN3dNWIpK8$>`b5=E-~xB_KAZJSsb}f zyp%FyKpNBrg(A4WVE`(|x_^4Kp5$*aXJTMzu)XjClxTz?iAE(DlxX-{K;7tu{g8wM zx~50vp(w)(bxBy%gB#89hr78Oe}Y22G@;vD;6;TF=$gNF&^ZA7t>?gXm_V?CN3S!e z{o^g;)9Wqc(S07=!hJEv0em)0u!cvkGwAR#Zxx?jZxy(-ZZ+s;B~a)>ZR&0O|NH;{ z<{ymwZJ_Dr#-GeA3=E~}AZr#YJZ7i8p1(7h+UjSN3Qx|z$$8-KD1GcZ7A zih3LWy#Wa`^0$Gyz`c!sU|i6QQ{zu|u*$0p3=F-Ef8T>umhtyCGJF6t`P*NCy4BtS zFY2|CJPuO+nP0$L#G}_)!l&0;tB=tIQ^%}U;->gIn zQ&8X?(Skd@R1V~98BlzIqUtlhfB?+i7jNy*^m_D)F1!OS6pZfhGrZsxhm>3%;E5N5 z_`{I&4?4omqxB@2;6gxJM7VVyHvrWS2T|W zv@VFZ{5C(siy#a|&DIR1pfs=W6m-8jx^#CR_%eiE(Z~uB&@j^rM@ME*Mh0u)1!-YG z*8*Oo1M09suH1Q{-vSCPPz}Q00_vA}bQ*YcGkbKp3wR_ubF?0)Gw|p>u?sY7^MVDW zw9_4QfMrR6Pcmqq%?Xe0U;)pA4_IC-U&hY>+V0{m;gRet0n-Prq|P*hZ;ApRt7qYp z>@48{T5lh$;Cb)?^NW12K8a3u4Uc4Jjn)HoULgCx`ldkife*@;0zI?G``7i-#g0-^Zv} z7#{$|IOK*jP<$iRzmU<87t<_3%_7jUs+=+rhVB#HA6_WCgM^NI^on}k5@qN<_d*CH z(92rQD8SHt&ZAef=$0tMi&}SPkenJQgP!x~zVX7x3S=qh0#VT3Y*5_=uCGB!4U9W| zR5(D_vw@B@hyYFZ^@_f{Daz3O@!Kxq}M=p;x{2$~{LDh=560o32>Oi}Rwuk!?Nw0cq12ns<+q6IB&cig}T zt};NYobG`dF1@_-K_)gSFoUg7ZLnY{QP{-j(aYNo68BO7oj|$`bZ5o)5)p>(vo9=M zKq|kLIDqa*1nm_+|KjQjCI-;ne9*=dpU(B5s^rB&&;cr)?LR;pBHcJT!546Xb~LrS zFfuT_oDMqh!RQGzXY-nXtokpH5(VJyqz@AVgM)=Je~UBNZ#60wKHa|^8|)eQTR1^R zv^?Q&1q~qW(g7bgaQ;QsB8VZNrZ*_sIDEQ4_-cO#&A6O@v34;i6@KvOmi_!dioy6T z=%|hs&}EbS(DNTXy1hAGw1ZSxe<-a5@qD|Fd3IlaadQl<3~-gOr?q zAu0}9G2^%c6oH`JtGbe(!Q=l?k6u>q2T}|k-7+sgE(N#0eY*F6=O2Ar|CexiHXmo? zZ+-jk|Nm~tTp4K1z6EH_ev2XK7@qFwps?}i3sn%^%X&|c znZX0JJsC6==F`jj4panzR*d`fvQ82L4Lum2e6bT0%$@C^;a+fxsR6Z)_KSc_Ki(d} z!~hBbhLSAsvX$2v9^I@z?n!}CI)958Xr0n+pI*~v_oP5a^tym7XK(?X1as8`G@1{I zO8(Z>;3<~#FY-iDqp5B=KZ9qt%RLT{|A#>h@`EoM|NZ~}V!8t8T2IiK2FKe$$5}v} z0y-)P;&TB|yB-`+B5)RHI2R=A+xoV|3sfvLDRD7)@b7vcSImA4e4{iYNHj-@i(!RF ziH1k_`D5*%=#@QE_v_Q>gk6zKpYoI)E{DmOMCderr z*B*0%&O7No|H7sN+KR{kJfJ|sxK%FgUodB-7zy$XCGt3B7Vu0#Tnakkl{P5zj zJxB-?FrFZxb1#A%z*Xh%AOHV%gR4qKW02jrt4gqakoFyD5Wn>#Xf8#Rd7dEX9wL=X z{0uMt^FXUE&{|H=Jlc!1h9Fx(4%vJO?2sQXqU@O&y3fC82HATaR7I~e0@(|0IvfTy z3_#r+uw5Vmy2;YQryI1#AKV(8%?@e}3f)0!4W_w4T7wPj3=EF2?hELy_*78fX26_f z0qXxB2F;v5z03(3KbQ0973I1PZlWY#Vv8=$?E){`aRMP&>hz$?H6N<$#-0h;rfKngIiU3uv4O zq)&kXG7Sh~Cou50fOaQ>*Z~auEi=JY-nkd$mq4Mx-_i+M{oC!v0^a3V>gbu=4qCU? zdVs$Vw9&<*`-1UF&+c~67{*@EnNFaU0hSv4Em@#-5|G8H9@eL7-hiA59x()Oku1%H zn^TvBW=5G9NWT^q{jZ%7x^x`7!$2dyP`iy!S_+i#!B@YYsQK`ktNT^!CH~fj%nS@5 z%Rzly(A~7)K!>hhO0ldZ zJTBdbx-Wv*Y^7>o4?{CWNfkIlloW$ALrIQf_XWsG)Fh02;Lv>tWG6TlQS*RW<0A%! z4-AdJ7#Iu~N;E*U0z-)ch)!TAkpR&F3?%}f5}^4!D9x9$7~Ou&w3*Sf+s|V^xFTvj zSt14Mq$hxmG7Na}=Q}$?LybxR1OK+${4Vz)sjCDvEcKD%fU!gZ9F{yK0$`e{gab@7 zmvXk;E@gG;zWb}mu?XdNQQcqBk2#!!#5+i9fuknG`Ox?#Ftq+$7A(qba_q_Y}|Nm=VXo3SRZPn=j zMc%hHoDAI`x^I9^MG`6z=swZ-@BuSulQ^gmS8CXO6toZu6u_W#0!f?vtsbC`#8Hq4 zIOTBhw|-_|VA##T${_SYRU6bk0o7Bx&qM2}N#@K9)}KqILF3HlUZ`x~WZ>7h;L$6( z3#8!u3ubd>28h(mH882;5UCetAj3e{zuTP?1=V%#=FHG`hc86H%$%9QH`xu;qK}4% zs6a$`JbFblAtFK`3$BBvGC|8Jy1`Xtoi?PZQ~(XWYJk?^8GsHFko4_7W_$^>dSPuB zXy&Rk3&eKh12souR3gCrZAje*_dPd%3)BDq|6AXdm~?}~1QJT6Y7ibcgxE?Yz&vOn zRLZrRL5)G^<@taA|L+EE!hCrY+^hw!bO3GXg;?RyD_VaFT%`(};%9jAng!Y>fXF%o zLk5RK!E@sZE}+#9A04~Td-RG5o)ra!(u<#Zu+Wk}3z`-_@6r9^#S^F?Xc3A>uc#_a z=EjRtP?=s)1Bjqc_k$N(;eysM!51$kfI3T^E-D3}Zh6a8a5LicWhn-Ry`WZfiBR`d zP`^yd4$_tYU9t-sS(5eW<&`=k%J4!K<{Qw7Sh3)t-{`}w|4Vs2y4ygxx7(uie~D4| zaZorzLbODs@jv)p6^X|G;CodB8vlduRpDs-54u;Sw7&c3YZeFoZO2;=l!EM81+r%= zGc?pt?J40yHoDXW!UIPZV~HrJROKn*15r#R>>!G{RMGk_*wh@5sqxrMb!~mZ- zIzI6&e_s;#WTta3Oyr?+6sx}pfMX?D7u0_((Q&bUP|xaO{i06ErTc(KFK_Z0QHJgd zFIcb{-F+T3gpl#V{Tn;OE>K_4C;0<-WZ{J>=wm32B6N*ac2_< zWdWgVKve7h5*b8%lzJcq8rHU&GFSnuS^{m0a9}6_ZHp*iD2am9Nx`lE(W1f@tcd{} z6{vL*s&Ux2MHnA|Zj0!2*63~nb@@7-bzC}=9b7uIT|ACE2Y@=!$D2VL_CP*5-V7R? zfUrR8s~{}Ug)$HpXekzibp_P%WoWSX=qwiS=x%$#2)b0b8B`L&c&!IY*gZODfIIBH z!44js^T3L_&%FTMzw7}L>OS{kDd_HCZ;2PVOJHT)=2MVJ`K`&!(CrO6h|pQ)g&kaa z4^;Y&CTPM~&{@GUMAnnFob(dZ<$Y1A%FF;(1v)ct#;O1RUAjLs{s(QXDiw5W{O1QcB8$Uu z$1xTLrPo@ZL-US&W@qq74wmRXWenQ!^z9&jDS!7VpYB7(C%zv9)g2|wKFOdls@*3c z{+etEDxyJM*hLab&!&sSv-101EE5a5Ft?I5C;`vGh}9P1pD{J?q8t&-se3!!LxWT za#TSzLN{ba?<9Wp7QFHGtf7(lZ|peQPd>OOez zhYYBd4jRf+;kRKd5$_I`aP2I4y5tp^bT?ce0rzfi{K(JSf>k(!_fip9gAv49LvM;UT1cRXm27%7-| z_*-uN`~M$Q{4?>loP#o%`CAVE`~SbWMkRrfzx5hu?Zp2QQ~oIDe3z;l(O! zYCuB+U<~SdVR zi~yalA?wjAss%dNs+V^+NLhCcWI`tTWe-?wiHd<|_eam>lN`;@I9^0N0_6*4(14;a zsG(@!(a8=n3Ot7seHheIJn`c2ThQJ0>>x#opex0NpMrKMm#7#R9e}8XZjk}+Huq@# z2HM!l{o-!~7i3u|XuT=S5y%@rKnoJ;p?AFBd@=9H|NqU^9t?FZprI23u&0dwcYjCh zC-CU@4)EyqG30m=l*!ES|F}nQnS^z#_FOqb)7#eni zhmA`(K<#hA!=N>)r(Z}igUXR^(3WcB{~!x^UMvHT9qtARd2}~}E8NxtC6fH|44W81 zZJ#huJq?!t-BaHU>e)avpZo<%9=pK;-Ob=7*sTXjSi!3{K*cRcZ|lhto)-z{Kr0oiN0Azb3#NZ1Mad11f8#LM3da{K31(!TCL+5S~7c`-204jKp zR(!zHGiW6WWIC(Cw)_NWXpRp&OZ4Kj5vVy`k_TOl0!l`wU!;MH1Xg=~X$H`FG6zbG zJgg6w2!dx88^8mrtp`fqyp{n44k)NvPnK|cbT)!yUbB02va<0@gCYoQ11PA&Oh8d_ z8sxU1t0_eHqcJJ5_aQDFStq> z7`nSbs|Q~2%Ylro7I0|!Rx0aZJs))WK`9R?|D1o3oX5cM8XV6*5B~oT+Dyd^p6);W z;v{$+wHsVVf?5k6-Ob>-vlCjcLTXZIH4OC`NHNG~?clTksWU;5!s)=j?b-`>P?6c) z4XP1Af~+sD%>XAUP)xm$N&`8v9n|Inoo)k~cJS!#233l%)HY)(s65yW67uNo28}g< zOyPOa01*cZbf1RAE`0gX%R{N4V~&yIw?x0ecJ?ty+=4v&;=KVlZYBPE^MKAdtXBsG z4Kx-egQB=sG~^k$aAVyAi-p_Ym>|U*q|^ZI_w?wV2tL@N`=Cd6CwO;%>!lKI5AYWM z4$y9X(BTskz!IGkz$!Z@fP_6dCx92}w4N-H1LboCet8Cu?#O@_?5Ut2ISrZ{d=K)L zf=BZa4Tybk|GX&L4{Bb*_9l9CJA*F&0G(L`PDK#aXTbYWUo2;0U^w_fp!oqm!XQZT z0+DZLVqm}~30e=;{6^zNI#|C1HYFhcziSO|qA22(1GJuw2Wm>TAIU)sLNG6~Uj^1F{fV!MVFRuvb7Ig8i zObnoE0yLctPcVl)y8A&>bf5`NmTtyQHjv4z-Ht4s%%I8wO>M7e)Glxx|9U4s!;52I zn82Gc!Icka1_C}w4~ka~X!(5$>T0&*OyE{@>;IDA23yV}kQ52(!@r2t13TFU=48-v zjzrLf;VEAbP6iteaveuEczO-tK!{AQ=sw6@z5XD#X(71{EDw!&2nA11pe&WvU|W3{ z$u;M7!LIR#mVG569=*JmLDyej`wVOMfDXMl{o)uuw88#2R0LG8y?6>Ld0G#YYI^kY z-UR7bf~=!gR2JgEbvyVOUUVW!ooPK;%Cp9f53$Y=@hF3V=i*Or}z{ z9f3@OOoy9)Du6^GOqNo%9fHh)Oow+AvI#OZ|K#9zInjOa@R=Q;)giFV07}oG^aPEM zU*Kt=OC@al;RpBy!6_-S!M5@cQV5*Y0f&GSECfLDaS?RU^_5Q;@$tWe547Q!5p)NO zg9g7K=*ScBMq_ZOd-RHG>;R{jo!j{tUQGFfNHJh}NOVBTcc}Z2(hI0J3`*g_4YoHA zBDqf&;y#r0VhD1d38wpQmvD5qgL7{Qw*k$q{m;L&P-DMC5;z-Z`|NpOty3Z2X zeZAV?@I!ImM9@XkQ$AvZAJ~1Mz2%thd$$ejzWQza3@@SxyANx78dP+E)}8u**2sb{ z{Q#F9-%4Pm2eV@*BdD|mHEc_mI+;O>Df2B@vko9ilzm!Y??g821vSJNz)MpP?EuYx zeqdsF9m+4z3tE5Z+xo496|}RF4^)DlZ2#k2c|XQ%TGkM2*tz1|;ud!65S_6EOraql0v&M*VHi>U+b9Oh%}3?OGP z9|P4n&@LqNF$QP>831a4g9b+(;tzvP|FgI&$NmWc!WuAD!T+7VR{DQGW4n*)b|6nW?0Uuoot}(%DC%`Q5STwXQ2AfB)Jki{T zlwWH#zzGPYJZan}%J8D)9U`W|XN6<=Na8~#a%?h_cG$SaM!!1~|_ac)2es!?x9UGtv7D4N; z4{sG^cya746T@p;kM2HD1qw?3Y~79#j-V>^e+g^1V@xMFC9rlohJf-mIGIaB9KU80 zKf{amw+PRJ>*H?FW>#nl2Zb^ML(>E3p0txC5e>Gd_aKF?Jj{L2mE)lLN*UxnwYP}0 z0J@S4G^$vl3u<}mYy)+2AY(Aykfxu<{|6quqSc$gfy)DO-}5&J?FgrUS?KPuMs`oX z8Z^9++%p-J@}?mf=+V3zbU6eA#65Gig53iW0j;vKpm4YclX;Hm&=Hvq1@{Xz# zG@??VPY3zTA9JkJo#llQvINM&&-^jRJKZ^6NJ1q*;Q`vB z-09BqqLdlrz!F1HTIdC>9Pd8=Vj&lJPbld4a5YeoSoo5OfnNg@tQs{cpv?-PSO5zc z9pFb7+Q5h`1Ue=koSQ4+qhE4@#xHtBSFHo5BkOhi3@^l9B1J4B^T67N;PMibjucRO z8*IlxE9>k*wI#dbanL!=_MlQayTR6V2PjEFM+{~vfs#~72&@ec%06>9h%&rb@B(Zr zdJ;!;J6O9NeL#igZBU^Z04gd$?Gf-u9C++29+V#*tp)p|cr8D}3%?hH^8;wd4Y;9u zvLvp-cJ_88m%dj7yVM<)(Lv?q=k=ltFTOoT6nGxpvq9qqAYU7T5=<2bw5`8$BY1Eg z+}(WnMTnWfqgT`w;<#&T_!(YoL^1>(#%SdeczX?K=mMNokAtRk|AWF56uzK2Bap3G z4Yp6WA-UQT;_6_St3lyw3v#u?bFAUp`mKbcyV-z=fdLe@|3MrR5C`5qN0cNUy`s%) zz`-j5^1=IOgn}1$dmXf1`F}}TgRLgA+iMlTA?^=L8=(F~<2q3N{|w=FP?-r@@?Rni zTG*Gx1PyP)t&sWUnF7oVh_nGw+$(x|HQ3!TtN9sTm?OCxEDsNU?Cyp2fBr*G1a7b` z-3khCXc2i*9^__z@SP;c?moFzl;Ophr&!z_?$Ny;)Dq}+=jdbxUBcqb((NwLdZ1Dw zjX#eayq`3#9W({_;%^41kkL8N>CDmXF4B6SQZkJ{&z%LT1hi}L#VxoJ9#GQ|RBM3! zHi6G z`fmo0tb(dyQ2tATSo(P-Kf{Z2Nb0cIr`TYt4YdzE-c%2Ds#vu2bA(`U=9e4w||K(Xwzr0s;-b!%5>4WU#LQ)H= zKat7{{|4J^Wc&8Zg2T%K*}lW8LG8cCi16xe293409w=3N(a*um&BN3W>fYH*SVwY*6f@VnO@QO!=;X_EvzekqwGrXAp5W~M<`w;zga7cstu%K<1 zpFAL!b0UQ|s9pet0m$p@j>kcbHhWM%-L=8?;07dji9+0^$1mV(0P4uFeC8MA163^0 z-Z!W>4(^k1@EWag9-zgWs&J_hY_rn83*@ozSBNZ;7_Cog&kIo1VkIn*c|2x35 z`zOC<#f{JW0=A)71Q>jJJuY~5e>m=N0_^JUTgM&FfLK1g4rh)#TmUgWdIL_p_zLNm z%Y*y{ic*l9nUAr7>q6#Z?Ej4pyqpC(kXW-s#eqNk8%UWJIFc3k^*@%e@`oRI%?{o> zAA9gKeyXTohnOeb-3*%k02e_# zETAF?#Dy0@jS$m~K&JDenhw363Y-d2@;jt00?zM|$TqH(0Q&%z-*vF0e~4{I7K76N zJzVLZxbbZ-3)VYp!QF9iVPgQX+yoT8JcxP|G|Y6n1T4S-u1E#34`5fG1&6X0$YrcZ zE<-ejKwU*M%; zk|2?=$j}l2$Hrfv#bPDwyFgv2*WBQluh%S&{M#;dJG1bw2OnC=zg`&B-sJ$DsGWSs zgZYFfGx&g5&rS}rwYry?#a9p*Bff5RT%WcpkTkC)DZqANeLD0nc%7y$4 zFIw(Ek_KpDgahcPt!`%)@TpVaTfuBVB_y~Y69TR6HShrK7z|M{c#->;odI-$HE8Y! zBvS$EWEs5J1~~wv1$1%*=oWa;j`0f6Wn>{LHr+ld7N9LeFBHo_(`u02*{ugk#X*hx z*f`k0AKW1x-IGC6jGzWO2WW10)yFW_f*vFD8mb_+e{3vLA~-)DdPhky`X&>oh~W{XyMzu z8{`boDF>h>e*q;XFCHxc)v_fyKG3ryuYSJ}X$`y(jKJv_QQ!EN2n8kK+-ir=8Eu!>nMZfu0qE?uz>CR`{{Qzl-Ubo?c@$JB`+0O<1;r=m)}9xi&;0)n zUU383&IT$3T)Izsbb{5pbRPtrRR`K`vI|6jHq~6&|NnpY1yGQ$3IWX(gD%AFTnDn( zqk9_263`-#08j*YfKsL~{C*>k<|77iFHNl&K(n+4kWIR`h%&r*b^{d9&>93hu%HnA^5RO+#fYLo^T2KC$8-4^UVz3$!AV^K+MI%o zUqi+#T^nqrk?qTe*oV@7F9z9HhGJhcs4vC8%>i_z0BC1YujswGU_0|cc6uSHMXJ9X zKn+L(aC4+aMS)-AC%*=ypM8?Q1w3|PJ7GD<>(EZ#6G4#I`CHb2vKDk4Owgm3_sM)w zh8NGTGcmjbZMhm_XhA01~Hqrfa%EHpexTo zD%ODcal1k7^w0cpn?dJzrSa!A`#{7ugYGN_*HbYcKrJ-s&-`(_L3=GhYC!7>AaXxG z^9$O;*SLY&a|X}}lZ$h}fsr(apW%h=b#O#=$EXB=8YTvy#t5ik44O&+rvgxV1kcA3 z4xfT$Na1rt0DJfxnJ3Ed;`lYx@JZv(123Nd`2gfg{%Fu?T%Y+tCnH51`^+EN4f5Y- z{>WyK-$9`l*$oMu$YxOJeCChqhJ;>RGbHpPx*?$((F_UQxMonegMy0(q!FZ~>j!13jL>4b+XWZCrvB-B*iyK!!fe1=p2`>B^pmQRdj}*im_GsP*S`Y<3<@(%<;Mt(+gTDoI zNuNiri;9s)=NxblfCgbf^)h&P7gT2(cyvN`G=u7HL(s}$^(X)TyYO%80q?2i-*&@= zf18Vn0spoT6+@5iK9D6Zo&+#3fCP;AxBY;MIVk;p5$g{UzTu#B-vhc$y5TWni4S;S z8q_CAT`bA~+V+;lFAv&I2HMT*(F-}*`NhHnP;8b+xqyxd)40G78XrFQLVFJAn9_*v zN;gU`gTgrgd@>QlE0{shE9yKGoZ7C;;AeQT{xWm~*XRIpKp|oWsk}0P4cVV8$!W0t zvIrCz&|=wx7Ze#Kp|D{G(4d*mY*B_6{+B@!0ji2YdrLuQR<`~x6#@mL0w^UuSO_Yh zYg7~*L79sIGAR7Q3Y>~S^-1#)kd|K22{XV>Rs=cu&m~BU#Q|K58-V*T$nM2`z82^x z=1$Q0TB#Pk$q&FgJweAyHrQ%_{Q@m#Yj{9@;csyS?M8!*rhy9DYS6vXb(feJURr|d z)Z5^-m1pOJoz^y;pW#I!NKy`@ulWz;>@Gnj1_s~mFP`0hJP$r&fgQfA<_SG~8U6UK z1~%~VT^^9*yFmMp)`8A^0G$^7jlbm(`0TEBP+enu$wT`d`te;J&7kAEKzlqrdwo>? zcpQAmG5CBiXxxHMfjjr&g&i~Kd@%4d>XoVB1d=+HpW%hW1xR*?Rq*JB z9UGQvfqHBh_`FY_P8ZNo|B$0Y!W|(;#zBtc_37RMK1LUuV?eipgPO&@t=}BGzj}7R z;CJ1k0$LyK)BVe*`(pPG&<>cB{4Hs$pi+m`VZIdT;4VdQ=kCQMPDo1kgh(pSmtyeg zo}vQU@8Q_63$lJf*rS)X33PdM>v@pVUxqS*4gvpP;@5JZ#2DPL2kjs80Gm`Q<Rf61r-kl=b0E@f|go&w7v!BrrVH~f(1yo zFi7$#_y#G+nZUlS2f&JUK@pw1=e&9zw*!j|Nl!_n}0Hwf)<5@g7ozA)`8SVg4F97fAi^F0zRqOxAmJ# z_cIrM*N2{#MG>WH9=*KJdiWV$7@lKd@acxA@n}2(s&hd5#~owAEAAbe|1#II@^3r* z`nGTDe@KA@3hdJv;F-B&p55)B9t$kWJX#O<@VowS_b$*33sjur#TAG+yJPn(&}2*N{}PVY+x)Fh!EHVPQOkn@4BgjUy61q;bLJ1f z?b!U6g}(=M3YKH{VYgl$(9AT$_Z#lLEYdE$BA~-5AoZ1VFAI}L@`=y<0xX*R`k-+( zA5E5WR(}0MWrCo6Z2Lh2z95^@L6frjH$hUT$^=_)m-6lgOa13>^M4XA50u)5|Zs8NL7HTxJCK(~xZ5apJM$ma02-Y(^Y`l__5`4Ed^ zuj^k|=7ZK3_~SsPXQMnt(WS& z`QipT*FuiXf0#34>F!Yh4QaS^rl>@8hNuL1c3%he`aN7ab5tBaw~bqXdcy{tE-D(JqEZ3m z3DElF7jgOw3@=yw0o~2h1ga>J4C{HyebK#+q-Si z|Nk$+*E{rzJ_22>-OF3t51Riy1uiz_{=f$SJeuER__iJ>3Gaq1GVtvUkT~w55&=5H z(YH4Obj5rC==gHb>>H>B>H(?{92|FoW=24Ftbu5s&JYy?P&XaIiBVB_aTIhZee;nF z(CBREba0jPsSms)I^*TZlT3&M`#hT8SbPSZNe$kAt^m3I8SHr-u;)Rid4{N{eC8L7 zQPFt82WpEoAF+UqMu6IbJ}MlrEw-Qw${XK+%3TlWy%8Rrb3v!}`gA|y*DOu&>3+$t zSsUQ6ozXM-2Drs_ffaPN#Yh2vLFM5K#qI@EL>PbBjIq!|v;Vom&jO$ioAEeTRbw?A8qr#PuD=!Pj^6{o!Ho z(0%|~0s_iyp!NReUhFhuX6WU)?a}Ef(aYoe1vH|S{1J44hfimz2ehG4tORRBGJAGI z%yNR5<7;;oE(^(^sI=RmE{PsK)c@{#_+mDh@h<*F}W|tmjV^M=6^N|F+|= znO%(zxOB9Fwv+RRKRNEI07}&0%f-Mom>n|%!w%43E9fxieW1d=)0LyMl*Og{1Aq8! z&+ea&d;k9b|DPY!Q+@y0kv~!dbnJ3u&L7ZVf)KdD2I`y(21)R1oc+u%n8gC=u?uE_ zjvjUbUBuu7Iw;vodI+BRi{I^_BlBU$PA9OH-3MRp2i0YIx2jS~llb-DfYm^Bc7qJ!cfSk{ zPOyPsSGXN^?Bs$N!2%9j$Ic)Q$4)PvouI?$`Sss8b_NNc+Oh+5w%1G04j_L0H~ej< z!8O)p*WPL-$KGI8*IsAlG9K4nZ+6G-@2=fnK{drE$KGN#$L`CZYx25pL#h@xR|T-O zOvVQsJA+ujAbGw*T3x8 z8_ehmiq&3k_A*1)PASJ;XC}waC>BugyLLu_gWs_;NW`%-NW!txOUAX+Nx`u*NX50& zN#nJ#YbO&TeK<3N0@StBi3b#ruANaLj-6f-uANRYuANZ|j-6gAuANaDj-5_Ap3R30 zcJP4C(eM@U=nl1DKGEqb;KIKRoE;pS53)2LV*w?6$L3=!ouw=u|Bt(LmU1{YA7*iE zKFY$c@swZVmZ$Z9{+>U7KttGTL8qRBFRU(g0LQsccc};HI+FR@1sFVgTS4oXeY$Hk zj4%0gyGnp7w-`|6Cg`F9s>NJX5@5ATr;kcNx33E5W_Zw5PY#~lXF+v}1!&~O0L0R8 z+zFav2h}zTFWx{(K96o!323ne>eHNfA!3Ab4axZz%tqj&u8)IzIqy2ag>rodX#MwL zP@U(|4Xz0IHA)lsHEIJqdQ%G^ja%@U21xZu^BWCF_a9vScz^~6JU;UahN$?w0Id}8 zfbXn<^zy;ugP>7&@N}+%BdBbHkDERR4UXDIOhT$%*8E`tFYh}8l7fz#f)*sL=@Mml zvHlRmsh~A0h*>qzW<({AUeQEIMZT(?AF_7@Gd!ZqPb2h7u!>=G~yK5CdpR3bJXeS2P5)Y;S%bc!Ua6dH(?g9!TFyuY*hs z4ZAmh%6rJZMa}1+>5kJc0=qzTGpM=%?=5WDtppmpF6C)CP%2>24C*&RG-x=24~Yet z25R3lwt@XE)W*;7;_U&11HlOdls+UtgQJM?D*hHt(7HfdhY3jDp7IOgZ9b3`G+ltk zt)_H{GQ60606eD+8l?tJSAZvuK)p=J@vWNm{0uKjFqCwkeo@~E_7SM%3BP; z8b(wA9eUdvqN4C3;vqZea4?W{p?#tZFElXCY6e*c$_t=@vi}!6x*_Ld27y+#f*Qe~ zos69&DjqN9WP)bpi;9dholR=$7n0_hQlqh&1RNTedz?&@rd=AD9@r-C1l|6wJg*6&ioDNQjA* zl!7L896UfNw?xGQG`I&^`)Lq=*p@}X4XR8{ti%tGvNEW$Ffq`DyE&kXe2#;17n*5p zVx>_aOVh+kgSt<5#{wXPW@qqV;b(q<$vmLpxn5D_Ua%MTya)Sg zGU!M{k6uw-i0HESpzH#+7-SB}FK{zFdPU`1z$t7)Ge5(N?tLJoF)9Jzodp;Jj-d1g zp07xNkB{=VTn804wikMl(woW;NO}Vu#th45pah`O20H(GA2=0v$EXx|G#^QbKMZQK zAjU~|^nmhvjS6VFkvu3-7<}dz2xsBfIQ*GE!kxo$2dF6kZm}D9be{$no+e<@1}y0D znLma#VoUWkjpz^S5<;CA*6hM1)9DDoyM>g94~P`NI1O5r z06K0Ea`^O3$oSjhZt&ooBxG>z>sLsy?14zObxSe8cXfce*l(Lf8D4zY4GNx@@vNY= ztl#)sDp<>wE-&9Avd z1=N@0*W3fXgv*6rvju$XmJ7e;6ctc=#D!mT4tOQI3%}+P@FA}*{F;z+U0wJ!OF+AZ z{+Ftz@#ndL?g8-wt!@GBY6(R%M{j65sHbun zRCe~pwtwaqaLwn}zftVKugAJ+od81>Q;F$keu2_-M}CcypI!I`T;pB%HLiW;7pM() z<=433!msiCvkQOZ1rTuqL_GM+A9><6D7WC%#IJGig{&Ru@L-J>j{F)&UI;)q4;(=^ zkuXCz9~}8L4!!th%gg|>I<_7(Rb=1-I;jh^M&mQTfIAPUa0gx47jppYLjDMTM}Cdl z;PK&epvCv#hK++G_|}#Pe^6(}Ma9RFU*qU!{s?BUq|0Z10e{f-g)t|=xz4~5yc{qB zbdq@t=(ZLY6%)`A=U^pA!CFA~0>*$w=v`Dm{ds556^Jp%K0ETq90D6*^Fl}*lp6S3 z;+Vm`Rd&!a6i~t8&jN8U=xQtnk8V&vGJAq<5Eb+RWqJW`hzkwC)|h;D;TQB#@c>aS zDn1}8N5uj}m8jUf$d`gx@tX;3g*yk#4sQ;q9TDuG`6IZ&wg}d!c!2D2;TKE+xjE)I z$hDw}1Q!(tuw@1>i zJ}M?JPD?`E7!ENK9t_-I7eb72QE>nn1M;Z>$Zt>&=crh`=z(en9e)doB_41B0J;1G zxWVkmuW!Sw~S znwSEs9p-@N$X)m~Q&b9E_%%U`@LKa9^J9^unJ;6 zsDjwk3~B|%&IeTx<**83;tE6skq<6@K@~(gtb&LqSV7>^1gaqZm?KpX?;#vW1@Q>N zxdE;qu0l8$K;;#v;(^o(plf0gwE|j=04n59eCCJL2(H~o6@qUwsH6dBBS?Lq0IHEb z^CQ;>Dk$}VZ#yWfc7wpTxMFUpi zXtaQvs-W^5R49SUb5J1#D$hZUTNi$f9F+u6c@8RKahB)vJ$gld&Igz0t4jG9UbJoi z6`kPnoT&_4o=*k|=Rt&#%X83rZ1DILsO2jGnzjOU0&-Licr?BN9n<64{SkbvF68it zll(0n;JX)D7uO?~=U-n!%5!aqWLv!y1M*^&cjclCFFvkkVt6SF+C15Mo4@4;6DYb% zV2%INFE&AqxDVV1E@;w4Q+UldmcQr0lK)Z z6=Xqg=mgLnxo@?gPUPtqd|n_&^0$BvtbyJW2I_TyW&}N24}dEWP^AlMYP(MH;CH>z z4Za}3gj2Ah;s~N&p}OCrkh(PZ#Jdc;F4aw?Fg8efrEFcla~EU@2%- zj4NnSiz{gLO6iTy{Bf^8^T$2<%rBS=DsodnOJj0DX+HG=XsJKwFIc?g7=FJ3wQY zpu2rar9E0tmV&OSjCct$5wyA`cLT^*TV6|j=8rh_nLh$_qvPq%{NUb%FG$XH%W)T# z3eZ@bM=$U1LQ#g}E-D2Ot~0oO9HWxq)9bnbRDOr3BtV9bVZ+U!t2kU#0zi`tpy6f@ zk6zyc$6Zt$SQr>U=2$?6ntecZ&3VuqCTNi%xS{!?uobkbPGb(V^Qkcf+|Y30*MP*m z3%^DSq^qj2M+FpcpsWpw{@0*W_I>8?GrVT^=oL*a0%y-Jh5QUJ&aVOGT2N+(Slj^e zR3Hx|hC!;6TR>!S2Z+q>0g=@cKxFn55a~PzM0zg(k=wVNKYQvvdqu?f{?pxz?irC4LP=a!Ms?iT|fil;Oqy zl}rpT^T5X3=5O(20Trf5CH{fO5F-pgDqto4=TgxAPmo4)kT80QuTw6{@M1YgT7m_9 z?Hi)R2NjD*B|a#fxXyu<_!A%{{)89RC*dXjHE><@trRq-vj9}=|1SqM*-ICI7JCZ2 zfLzPpvL2)edYCJ?$e*GD%ADX58I+qrrM^dZD`@=(xMcjqFTn7LU(mJVHK@t!#sS(s zH+>FxFw?c;Grxcv4@jgHD$)a~Fd+4U2gtLqdccKW0Ii^J1#MIK#2;yT!b6Y&R2qZI zIB*@5z{tP=u5&J419MD+}Y&xLrcmlo?_``35hTx~T@N0bh%r9WaAO7Sszd-H`7k-UjpZNvK zKrPyrpsH*Rcvy>H(6s?nO1toDyaR6^)QV>L%&(Qq@!5qxBDDiV=JtH%j{pTr+?mfV z{BfT_#2-)<<@oJ5V+orJzs8Bz>@NHo=lL~$Kt`3^cpSeSX97zd081T%RGVPees<-L zIRh)YK%ArS^2?Dw<_{=`#i(R}ny_C%>=2a%k6zyE+2A??yokl4*BR8axd1E6KJ!Oj z@ac8E0ILi(fQIY%1#@?N=8t^9uW=7jw!q4(&-{@$AT50#-{1InB{IehyXw1#^0yqX@4uRDAzWB@^^BYvv zUIB4k?|_sZ0TF*d4Wk>7kOtXY``|Nw#8;5aQ4sMJBn?{WTKeWiLmjxn+XJiTwt(9> zF8ms6!1bI9zXmM9Y4oUok|MYY1SL*T>lTz+UxUZzKx?IYT|ucqFhs?|r`L6Y3+Qqj zAION12ISPnPoO~*g%>^LU_0lifbyCPzXl}tfvZr?sn9A^AsbwUZp`9mc+s;IR)vDf zLeK7K1<&qc4bSdsP$UWk;SALC$ov!7egq6(U${&6SJlqCt{D1;I z@;t}|ulWU-KlAH=Ht-0#s91n*vH?x-q#@=TK-QNsICkF$4`OMw{;#t|S>Nx|>!YIK z(R~fn`?3HHb7X%9E!gC5`3Gv0@<)9Ce;A_E`hLyjZr5^Ge*IHr&R|_2N2jPbfOUe{ z;5OAYkQwSwGj@TNZ*{xoLmkgA;K0%CS`HqTbO0sm!;b&K$sOc%>j(Tj{{R2~cjecA z#oq?5R~`8UN*N%wgUl~&29Y@`CawSLjA8o|z%D^{|LSib_m?<*=8yR9`2RRWyNmVz znyX-^>wz_Z48rd89I$r&sRv%O869}dw1E*k02ctN%0Y#xXLmGcB)u4v!K)vDD)tND zaX43gjo=Ng{2I{^&e=7&NkN1g@_6oG$Rw8CCcz3ZV@QAyu1$zcTlGc zv{t6&08$k#3pHduXd)L@MF-@GGQ3b;#KiCtbPW<{A|-)8{2Rai_ae~J;!XMB+^C$+ z&+y{kLMDdS^=bTh&Y(7?H;2b@7ZuR18wUR91CY@(@N|HnkBSXwgCF>!83WKHZ!c&w z>V<>gs+wg3<7;b=&Mn}PIgf70*+ifY19-;K0aS6j6@V&k(9Bl%=@*eUpqjf>1*8 zfOgI39jhuYEd{ShG~w4fR+Uwn0q%H$MJzx)PQ8Owp{2nfK@PAW=

        ?XB#vBwqizb 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

        ed4|GR&HPVas(8MMgx z2WV&-zNp-zm-lTYJHv|~KS1dzM#TZL6${(=bF=Ly5qN!<5e@bys44;_*OJ@@Tayz= z^<9S%*l%HA2iK?=yf`ib%9p3Rf4rE>4jSGNjcW(Z-GY3}<^{LS&*0I`$)${_8B z7pWi>;IUX(`PJ=E0m?Biyk$UV)mMPqB8Q>l;fV7|Ji2dn|9qhi)(u*agS-4N&H*QG zn?0E22gmmx|6eq-FfdsEDCGf_o9ZY2|8G4|s^Zbj%OeafR16qOG>{7w1CQ=&phBfY z2sCVpR$_sMWx$03Xagps7<v<>>`&B!0o13Yz2wmGC7gKHaP(AnmQUOE?|7!Rk7>jW0P`P5^1CGjKIN>Dzr7 zynfgdvY*tq*OTM_A>ZC07SC=U#vk2`j-5__9Ie6XYi@faA96g-0$Qrd;0Zo;2sHiC zdb@-TGUN{z1FdHW1x+Stcy#}Iu@SsV?**v7WIN6do-$~CTgnN}G#c@-he1WX18Dto zXNigj=*Xr3&^3ArFJ4A4F!&_big@1evj_cp!Fj!3fov2j8D3@{;!h(trZ3>&H^p&mpKNSoX8<`(z@^jvH8+R_b)-)>`1HqPpvdt6)zSf=xB{&^0Xw?;h)46AjOI!X2L3)d zMh1rFO3*!4psgqri`2*e|9AVSC>Y;%>Hhqp9Mq?Tu4M-;NCPzp6Fj<4fWjx> z#mR66hVI{%aUykgX%jrU!z3Ibdk~Y4d-U=&`1IO72SCvt#9k}Ji5yy!0W3IgADQLwK)fx7w83TxYNu8t#T~k z0IwRq|C-sS`#WgYUi1z3Rx=pt@#WTV{2-OYLve9}+{ zc>O`^$r54E#`Bd7i~#ebUYP?79F$>jC~w(EelNOCFY@TdxZ+bc&w8F2De}CJ~et4M4?)1t_c?AdPPi zpI+0R>jDg*U{~<${^rwbtIH4Cq3zN7zfLO+ntw#@d35u6bPIWObH0#k28XpDXsdwr z{hCMJqB++E7(BY!Jd#iSKh!B2cU^$Nvy1TF`=Mb)kgFuXnmDlkF*_vmJw$_J`M50pqX?*L_K2G9~D$j0z)25776 z#m5k6X@T4V^XO)cgz9DQZkWN$z;GD3IR~k)K>-16e>K}`@(F@g>_P4ax>+jzVrB@q z`v#hTg*X+w%Mdg-?Al-(eGsW)TdxhS*z`d2UtIhG%{HK8O9a99195aW`!F&vbh2Y9 zAA5P*ir5)mO#BF`W(`2oUsw-wg06RXQU3oO=pu&_MUUc$r4dW{D4}P-JMXu z(vRTq1cf6EdvvpU@(RM27l7--7teoy%J)i8I}lt0cJr$8f;QJ)@PMrT@#tm&FJM5N zSI}(B#0#(QD}tc`4=E=3TW&HiFf`aY8~_CkbP3fIEl|+#x9kJ$nS@r{{H;qsJm(D1 zoynl>0{q*+*H1g{0L^0ZZ<`E0`{*Pn+ZybY0L?UXmZ(_l0PU4>E0(`LG zF;E5dg6RNQi1kG$Xt)yGn(od4^jmr#FCM+e)xLP~{2Ta` zMbJ3=9OT0%K=lP=JR&Xh)7k+>KgH{QG&U!e^4XXcGZhC-|Gbki`MW=6J1x+N* z*uu*2q8O`nSkiAMH(L6=8Hg+W+BVqE-Uo^#=s?7K4NxSNsDaWiYqzsSCphV{c01eP zNVn(m*%@Bke1|99f(jaN|3)GldQ>}j32Oo9T!K6%VZkNkN>Y#LAA1m zPxm>W?&IJ>5WME>HAvBuJa&c`@85z)Q@X)dN|vZ3fOeOH7S|%Rh@tJ7X4^-c(EP#o zA|il+0n*a}MQiKr5~T)PWv~;W;a;u|4tH))mmSm%0x9d|Ed*Iv^Y+JoxL#2H2koB* z4=yne9;D&X-J$iZjbJ-bQ%zA^IkD%rKQVvkWg65Z` zVTNlQZarC|;L+UxUNHwct^`znTXKMAHNev#pr+#ok6zx3bvz6&TwtamR|bgu*KF&= z0gWHt7d!k=-5=Xv+p-(U{Wny>?sxM5tvZ6N^a17AmsLCrFYdfXxPApAXo#*G)GGlu z&tLBU_W!>}Z#TF}1MZ)!0}Jp@&tYeHu?R^gtaOIV$N6-h1g(E(2Nej7pwk{fJ_GGL zkYB~h@FEMQPvfvp_aV>ji=Z+dz9s}7KS}Ix|K0FK^`Cr$?UG$c{`;W<_8&(#GuYXn z#WG*B*%@9iz-&V5K|#&$W@QFD58PhoeNpBME@D7_1o!xC8f=}wHi$w-IHy5uQ1$3$ zJv zQeWFP*sk7*PsaJbJ7z!U8awa_a!1l*C+d9GQ7k;tB3v`%(0PBy3 z&^csq8dhzvt=o>2SS~4o!+`HIzd$o+w+TG2oXlWncyZ2x>mRW{HXc=wi8N zx7Zj;g21+>M{rD=qqfz)}z^W6B9gqG(1tm$E3mb%T^@EdO#ctKFP1-uDe79G+Jx`nlb** z-*OF9o7$#>9RqFH?v@9I9DmDh2GAImyT=N~k{Hm|(r+b9pzM0Pgb8%q%lQ|V-+-Ez z{4Jn+=s|%1S_0L50<>{X;l=ltAlH8@Ve58LQGn=*?RHU70WA;$)x_W~64V_lI7)aM z_Jdl+3?(cZ8DBFQodh-4L|RUQ+q}CZzzyF+-7MhN+wBsN1gP=53)B+kcL7U4ZzV-G z)}xn~F^!$!1Dm!;5lMB_MaeFx)*w z3{dw7zj)yW$Dj2kRt4E56|&&Kk?w8=ZQp1;P%8f- zmE-6CPB0gqnv*~_<~~MA%}DvD2w~p~S8xJ`1Yzs#614`~Et`;h&H=HHALR3cFZf~S ztb*24C9^ZU;Czf!ZiDj+xRnV#uc!4=3FO*fCXZ&@zyAan7)pg+ltF9+SGn-saax0| zEwZ%}Wx(F_2aP@1dh~+NF#(n3s?ED~Kt*_+O!IEgZV!e!VSWJy(2c_Epu`Uo)l=~lxOz~k8WOZ3Mo{n}7ET|N26+Xxz>fF(Uyxyq zGeAW^>o-up)Bx1K@$lex{pZp8)}t3xitxLB1^HG9(!BupEI`8_;F%IMi@Q(1Sn}fk zf1mDSph2nb)7>v#fI7XP@%$1o(15HN=!RI(hLY~HFSwrm|Nol3`|OK}PeBWQz$2o1 zY5aNYpt(=}NC$xzD^fsf^K}k%f^OJhg9tkdyqE|RX2a!MTc7ehd+`ogjcV7MxKpj7cbcTg4cvBx_02mayCAJN=(i=b_3$5t$r9i<7?|*`e z!v7_#ph(9)ZsG@WUL@3cpoj-|+Yzx39Uq6L-<#kh%o7qjLjYfj4)FmXvCdo$D~&70;QP)rMxe?9bl0W ze;C>s1s$dZx_bXx{!(4u~X0kyi>dNKnb%;Cj)Z$d35u>`~eE9lO>>4Bn^;}Yw*S- z@G0G({ZC-|10}p3%{xGSdC2B9u`T>w@H+Rq|p56-CI{NmC2pTFfCxFL3L zH7EhViskb!^u<7FfWKt}C=9xJ6MhIVd~^5UDB(ZW&IPJrAU(`@@Jx(>NB4a2Vv^R| zB^uwHJvd51(}*u>{{R1ftQn-5(W84dXi1_+>+RC}9^Je`KLi-ML0igWR18!PG72zw zbh-x|YX@D4%m`Y&2(lBr3mi1P{+iGD1Q_y3JgzF7I?-G5i(lMtn#Z8E!Az5_n>3(A>QicZHQrKc+q_uR{MfSm0DFC;P5!N z3OPJZzmNxy^gs?>@#y9a0OooE4B8oPETG|#>K zeCx;m6$;?xNfCLlrBe4mf*d6R9*y1spa~I307oD8=)UX-+8}iL#TjeFJ-{BlymLW& z#a7&cc`^Dhvi~-GgZWR*7M97N{sRr6G}yjdiRwRl@Yof93+R{_k8a)qkpAYKkTVlN zBQ)=4urj=`x`imQz#};PyB^3EIjmqR5%Fk#@Ykc$+2h4C@Le;!`XB>90mQ%SflRTe z2mh`QGGO^-zM!@oFF#1W(c6Q8fkDBeyAfm&tU!aTx!M=S&hX;oO@xJKzzd&wuYCpk ztV9HKU?(VF7=Tg$DEoN)e}J5Qz~k`{J&T}vj6i2_L6xh4CaghA8;%z9fJTPv=CLxo zh=kb(T0L<@1LBf3pmwZ1LIzsA!rG_Zp!DPbv7war#WriS^wbJYPjxFm;f<&V&kKR_ zS4p-c@CAdk27S zZU7g;h%__95+%)KMzS-!C_yq8<`)pnzYTl-hx~8MjM}J-TOu${$c|q7JGH89stDD(Lt?(0#%nA>9zrUhUbCLiTp) zO-O4TWHA))1l@-Ga@i$R`#id3AAg3}VuECgV%h}gUT{uOgm#~PaTc^Mx*Kl(L*tV# zsy@8?zmpl(*Ldj-HyUi?PF9fr%;17M89{tCI3JduWRpSmBRq)MpMLtqi#4EzBHYq9 z$ewz++mZpknE)|f+AS*#GOzVE=vMdH0?Z5yFCKxeD6>9X3O{%nvO5vpvj;mDlHLp& zcJhMCU(ju3E#Da!7`{1rFhVwuY-052<-MQH!|>wM;~)P)TX+^RFfcUl25nbkDCKS5 zy#`dF@wb5Hb3h{yoi!>BFQ(u54;pM~2AA`_yFml4pZNu5Z((3yFgnSv&-(f#8-q)C zGe|3V{E>g#Nl>F)gWvsB_hgXC9X=`w-6vk?U;qEVH3WH~|_ywCm>D;5U8GOe7HfIkNPa8(i?E>2l z>;fI&0!m5BmY^c!G-%2o`eoT#$m)kP(DGs1M^I(om;j1()KUQ!pEq9|5`GUJ;t*`u zaS#+HkTb~F=z$U_$XJEwm*;Iz;tmu82>qLEzz%o;I?$~JRQtj%!Fc%_d=ejIkhj|r zbR3i_Xq3YEk_V?_z{@NPWJ3|=CB1qD3OqsMlP}C)zxoeOL@#AegR{^s7A6J;$OUX5 zzdsLn50(FW3YJkojyrSa3@9a(aJd>EFuwGX!2+@G87h6|rS&RUP=SSxfd|A9O%8;6 zgjRu4_30N<;M9HkMbaA38Z{5l;Idq?yGJ)`;0FN)kLDd2pp;l**4+*2Y}7?rw(pawYVeSYBe$>8#M!+TJX0c!84nW2=&B@PX?pBAB(#m>CovKVw;XT^H~ z25<`obS?)dGk{w180T^*g|IWc(7lW(p26V>?!Q6XythCbN43E_WJ^Us6&vVi7SLKA zPy^*<5-4$kdian^9^5*C_OH<9qddBQIvBn6=;pouPJqF|=$l9LPSAM>4E!xWL5(C( zBMNk)1%DH0znTZ=`XK}UR?szj9^JPZL3g4Uc=S5|_h^Nzc)pdw!|i_>= z*MX#E!P210n*lukcNZk>0+NmgZIGR{>;M06hnY%vj8DGMI|I6#;Kge}5B^<`Wr{(K zy5BCK``SPoQ}jXmzu$rq%3+W0>ptC`AWu5}zu0o1R2y{44C{;jOaK3au5n_0k%}}x z0y;_%)FcNFGsGYE;Eea!!1($xI67eSxjE2FFv8*Y4>!M2@aaBeblb7<0q8Ui_?jFFjJ4gO0 z$2?jOIPy*3<98QJ_J0hPk@y>@J~4kQGOhx{A3Bc z!&XKY{%wCd*E8-S9`Hh1k8a){ zuLT%fTb`6i7@vIc=Om~~;co%eJs#b>cV7!IY-V(A`ClSwd=fm~0IK5p!P$WKz-s{p z$E}PW-N%kWj->)0X@z`zRdb~WLrDq5x{_}98du{3o$fgv-Pb{fVzq->+@0#Y{I^9(~x*a`0%koOqTW*(dz4(6~RMMw={B>=4Tf+O|f)fJ+ zQlLce{{heD100Ul2Wvh+Y9Pm6&;Qm3YgM{We81?(e9|ZRV6O+G zNAg9)*;1E0dwEX1@Qq_-_}>jO8=~(FqNoP7h@eM(c_degxEg=+=za+rn>7a22?id$ zGW$IaK4$jl_LcDHjlSX0?IWr1q85DUkgJ4GXNiP@NAr6|P}dk#MRfa0yhs2`g4PQ3 zx`NwD9v+>p9zLC=5i3jmNXdy^9?}iuf`cEIF{)3zj&|v#+ zHmKl0^hfO3z;$4rM>lT?NH1!C#50KAJF3G10{0&0u1~D9s=Nbs89R?4#<~R zycU7Ba$QsuK!<^Xuh%f}=nV9LthC%P6I9lfNV;@;@pyKha_M&B*cAq9B{Uz2c)5A* zJ5ZZ10wp&=+6&;J;(&(A6bA5s>`new@Zv84M+MLTT7pM!A?Rua0grA^u#F0zKo>56 z@9A)WT&nTi;^%*U0rqZY575z*Y@jVE{DOYa9Vz^RZVH`jFPOpA#Wjda*&r@8aOw8v z*%b=9ySv*Rd{7K8$d#7G9;KpSDUj=3pi-aafO?Cd!l63`eC00Tsbq2&PNW>DxP z5~NZ4;`<*^R{`sdt{&a2nqbQgln7gQfYytaaCd^~mxYJl{Ra;nBF}ep-*oK$;nB_e zp_OJek)<+7hrqM3d(%{ z`30Lnt4KR{`+zc5>q*c7{f*FrA3&jX8C1Q4u6aVU3^qlEm=N*k<(2nfXLzA?95Dfb zkOdcBu=Qoo__+zbf|6Gf>?+U(mVQlyzrg7fbXt1LbOz9B&!B0j-dfB6_7>aV?dQB(~!;AUHz$GZy>0t95TK;=H8KHWVT)PO^? z;N^P>(8LFCh8sJ>i{hiu6%zRz86F_q`f6|AHEi4Yr#mqxzQ_;@>onZeEKA z0u0^G9u6)4p(#%k;t^Yq?ncmYub^Va5IkYqa-hT!G=}WZ^1npPgMZfxQPA)(YLesM z^#O}$FYh83c7_*g52N`ERI+lQ#^1{OF#pJ7_0ME*etR?t)j!66!SPq=(aoCyGN3yc z*67Dxk1NdwMBs2=a- z-S5oK@Z!`VG%v#Q8i;}9-)7r=p!3KeZGcjt7lx|XVh=RF*_KwgEM zPv7nA0lB{qeE3>eAP>U}&qHXb6jX(|gQ_U~v!Hc0kXhT{K*(Vkkeu;SF3%G+CMa`faMG@nEU{!*U5y(!k9KQfW>o#W(egUvn6;FOa@BrZ_ zegTLQ!EVq%A?O|`Q0li~ER}TOM;asiuL2pOo2~?IZ6eA=k6zwnCw7Jxc?Z$M79~9M z?h1egC&1@%2)%fyj4eFBg5ukD$pobE{P7DCo{-~$Py&=SfQRA5j{|4{x`Lxb-J{z( z0JPbl`6Q!9^Miko6mwz&qemx59MmNMClNjS>ewsD9&o!ZR1tJ&&$i>pWnV9^yd$XoJAfXBpmYht4q@St z!@WN93p9cbm2>6a_5oTweEiHWVDyQSblFOz0=q@SnfXulUDb}EI;vAI%)H=p7E4mMS|u?a-K>{xfrno~J#vOp zX^&psz*^Y43AhLEys!gWAqyWH&A z8D0c}^n&sXXqgJm{WFO6XS1!{E$|uxkjF}eUTjoA_zIkM!L6H#;QUh33-T0ny~T;| zU{6(nu9FAdBVG~!o{an01oIC__sc_jK~du^@Zx3k|NpyK6wJgxMbMgX(0U7J0nq4j z>wyv{k8a+bH$lxK@E8hsJ&9!viaAwab1)W@1lzGQyodwK#i$?_lYo*Jv_5IJjk}3l z9$b{i=0DJeoCez|Js|%<%hwm*K>p)zSqvVgLTv|p@#bN8@q7cqpb`O83c$+*&@jg-kAp8onjbQPZY-aA!1`dxT~J%0`!rZ1sF4TN4Q}7P z_@>MNx|6kJ2dKC|_(DX55t0l*0S#J>=Vl9v|2?1pM-B{FdluA*0(Uw=>%SoFb(b3g z4BgP?`VKinz`zq0Xn_)c3uxM^!M3a$6gseV2B%*f{|X79_uv5H{Q=r-_pK7NEB~$^ zI4L}9fJGtPyqBAH|M=hfAFOIWMAZQ-s(L`GzLl_A7i-jTw*D_su&&mr1?85>AU&Ye zjp$LljNkp^e`m2lXSIn(wYP{4R%fff|}F z-7FH|eN>1AiUlQ3UiIlY8{Vm zNASodEX*~!t93{Yb3a6w`(X?7H$31jK&llx!;6BQ*uxxFcY$c6{ND}jzeQe!wI|O@ zBLW_hbwK@rOW+c2QU_|7KmG&>bI_!!M>nqs$PiHOgUt7Xx^OSuc^F>Y*@0FRcr@<> zHJcc~MOj`sEM7p?y4)pR;%z~Zah2nNZasq`sxE%lr4*}5Cs|Ft3tn!yZHPa_h$GG)C zsnCmlNmz)0hLH@QOJui#(@#(vC`2T|t-BY?K0rcb7C6JQUcUsc`azc=GL(WAeutH^ zGQ3#04PrmcEYQ@xM{hT1iwAgtJZM{b>o>@?h@biEL4%N>^|amBUp#jKj|>TcN0%V6 z4mE^dfZd~;HyvbO_ho)T$bOM-@HLE}`HC9QeU34ZCH--rii6jjo#BN9%pu?;Vt~>h z0*_BSfEF%*1_V61dATov#s|RT0zxn9BtQXz)E@^o89>dv23yBgP=Fu?t0%n&g-Hph z!+HE7C|nyseF#v4O3b5|*QEq`wg-00!#V_%|ZY2=;qY~xejzb zR0w#;={A3h5ojOtHqn9>0fv@KCCcD92F>g5e+Tjse~S=EVK?uG3!njPQO_1|cN)?y z<8QqKN&~I`OM*Q>W`a(WYq?Yct4q(nsD_#WTG8jx&Aa9TWR)GbnBi{)ov7qteIHzy z?DRnCu_bK*t+VX}t=aHxJqcFvzX+wcao7SX+rcXUc#1)RydKpAg)Kk+dsu=?BG}o4 zklx^7$ogH!{}(}Xl&4z`fO=^j{I1tuyp>^KaOB^10JZsX--(Ce#ih+?ncSn7cby44 z!;78h5-;4vK>a+lmI@?B9D>6@qXD2DJqti*ggJKq=murLQvMf$VxYtZx*st<4!SH3 zbntA0?e!*5N`n?g+HWCoat9n|;QiFQNauR%&6|Cy_>C90n0PT6T0N?%x z+VX1P0XlqD2eO@--{p`?w~E9I@m>G_cfUC948Gm9`g zfBP{|ecb)xwFFc(NbERNjHUH$33vC|7e>248)_=qU)l9 z-R5rrWw8d^$qk@11k0AEUp#pQNk*WBKpx$^qGyrvG;K(!b|~F zmxIe^&{<2M(o(^rn>YImsC@niS`sbv;+_!5$DpziRIVC8a}8+vy}@>2J;=w1^7+$C zkdI4BJ-T_-&!GGEuN@D=ix2BTzC|((befy~F>v9`TD}-uI3N4WFW3y;DTLMgNSZe= zB5^!=d7BK_8D8|R2lf9;pv5)F!N~p9zSGF<6GpJ-kV~T0+x#t{=6!?hkvfp)p#4<| zh|h9geoRP zeFQ0b0aIjj0Cep*lKqgH7?fue;z5<`27Pvh7rWO%YI#H#6;jYaNl<$O(qHxI=3RdZ zRDpoHDEg3W09UV|+|ywDs21cyXnVu#1t{(y3xR#QdDBmU>Q`_05_V8) z)!G(x|KmDP3?dl_>V9rJ2paZ1@PZXG>TBZJyc0Bv!cd|GYOAt&G@n#>&BHI?T;tLF z@IJqwa}LDYmp!{1LFzoaPht*ZZ`EUGcyVAYrq@CKg?2@oZTFo-9)BuK=s>mH%JW$(f`r`Z2xIc@7Lf(GU%wU53L7E za(1yOw1LMW6x>16V4#D%OTt0p5xt`Gs<|1u&%Idw0AvApa6;xJC@34j!!WG}N@O85 zBd9G^qGHf;05nqr-ZlkpK!Uoa@cm2(5zu%HXonL-q?dPwE<3}E#cLpe1KLysmVhJ( zQ1~E^KQ-IV1RWg)uLi|maPh-}32i$Oe+%f8`3Bn))kt9_^9HU;juNf8IU*=-X-h zdFT0~Px5PA1|8N|Cc>|Op^X1Cf8@azCyc=RuRgq%|I9DoZNaa9rc9Jy|5Ta4Xa2aG z{2GT}EQcug(e13!dZ2{W`UAhu2S}$B#P(?6EhsxR)Y)O_uA|X zFMh3pL=-3kBQ!!{3p!p1YO#QZR>1Ymt7EYGCV>|bQ{X5DjSz-4*s527A_!6PRy+a4 zQ3+^!)mo6|?ndz4)zIx#T5$J)%y^l->c@ZVH>fy*T zN}%>?gRM#>C8*8|WZhkM4<}o_)6yY+6PEbV^5B z8oxZKVgfaLC!xrfzVqmAngHrQSRX18PMhFieGs&92(shI`cUcn4UC74V2fMe@dsLU z>(PC)B)MTH=ms{1(kPE!-h-eL{>)ZL3~D!6Fo3UzmY%`R0J^bW z!gjFKZ2j@Sp*ohKM8cz+SO16r!;4ktL9Iqy%i3K)8>k=~r#uh7;B;(wz=*V0%5egS z!@ujHe34MY4$#&hhEmRk9bh+trmw-?a&0+K%Hz`Q;DKpC=>d;UCQ$zZo@^bEZ#-{& z1L|6O^ya82xEek2=$s2mOg`ZL0jRwLIu5_Y0bFdQ=CCrna9IB1|H}ks28QNJ1%_JC zLd`S>9)=g1AYo6?Dx+>s0po8j9ZNwSQJ3y_E*(q3Lo40?JUUAmJUUCkd-k$kbXb7y zBC25YX#5YdpMO#-NJFufN3T1-hxPGtE{`3c6Q@C^$a*wC`0zsGHWPz~_5&Y~JAFEH zL8}S7&%X!~1s&M;!lTob!54H{1;{9m?qC6*?&F}#j2D}OiXm?a&?2e27or$ef?S5% z%B{DcR@SH}_;l8CyygcDw%->4S^2}G)0M-w^?#{^gT+>m%S$;x7H$#&9pe7d0X#tx zECF`L`4=+gtPGI;Z7;9JApwRLt4m-1f5Eop-G9(7KUakpw;92kx|aNZ_y5KG2k-uO zw1SRtd+~(f{r?yIJKz217hv{n{pQij`znu>fnUH|0Mx$ftrhU(cl`(Qx1g_uC%@}a z-`4-1_yxQT_yt`xJo#PEdvw-H@C!IAcy#(YeBu}Mjo=q_1udVmcww~!l=*lk9|RYx zC2}6!jUPa6Zaq*U1gedDLpA;A3NXO(qho^|1Ahx>2*W9^vrl{@|(o z?KL+@yuu7rihS_s=8fwVU@*Q7in0{X?*E{i?$KN+0iO8hd=UszX8i%Q0EyqH`IOBq2&LAN^o2W^qg1uebhZ+*zX!01MW>I7foHGx4$n^K2Ohnwi*0xqJUfF=7+>=2bl%|G>3qSr)BAwuac9su_zW*5 zKsJI@zzZKd^Cv9(5##w4tgwm>twmN+(O_#;1ghx}m3{XeaAgm=hxEWcK*bYiGlom|aZtKBjc8&c+8`diyu68^QUf%z1Q&kkx#$PzWpZKXCsM)OG>gf3^=4S)lzF%UHlZf-C|B^{S48Tj6uoB z>ovHwy}aT|>uzaj0pW?MPXA!VRO-OW;=7n7L5VFC(Fq|pP= zE#eKfp#`9Tfi`DW-hzY*XeSEfuF}?%CHyZY9sBYBcr)ngQqbW@ z0$t|-J`C_e_xTqUM<51(7P^4WKi&iGg3JH~LhFGN4oK_o|AiL^@<25;Xeq+!7cEyn zY|tKF-b{%44yby5n0k+HUcWs83=O+2KwEW6FL34Sb7R$0*4(qtU-<7@&;R_d{B@f@GMD?#jgRM~>s(+hrfc*>FzqA9Sue%Z43WVHj4Zmsu$>B-z>p!>v& zl7-+Dq~_6jyOft-!$rj)4Ls%YS_E?V6G$0kEp^s`zyG^k=CgSGKiqntbU(;h0iecK z5;v$-!1{UzXhpe;iUPl2g9WG*2aQZ3O5Em35r$Gpk8ak(JHR!e1*j(E1n+o0;rai; zVV4dU70CS(p<#|8j-Zmr!4-6lI%vak{|*7r==+QAPp;k1L9GVi7k~c!hjh#w9OE5h z;$p!u&fl_(nSsH@LUmuZ00Vrk;q(jsYoIj8-_ikcS2wT24p27;bT>g~j*10n9NfUA zBRSTkV=-vj-^F4vsNG(w>|(JP)RHfiYW)UkeVu;s1H97^G;YG*@}H4`;kBz{_ji}h z8kGv4s&$`!F-`0}=n82@kKSUBk{pk2-cpb)o$(nj zcp$yE2;bHxB|NU(B`O?_-8m{euen^h%QbwupLgf$ICk@>fF}T6)X)3>-^H?6p)}Sq zTctF@rQ1hEWfvxzB+XQ97~h83NV1ewAjaTCnzvW+(GJCeY%go76)lhUIA(i9{`0h z=$!VHt?*!XH9iRsZqC*NrCKioK=TLPybfCh7+y0wZes+6afuXkYq|t9jEzJ=jSXJu zt>8utIH>ts|AG#{ZT(-u;?r55@nZg2P+ar3KL7Xsze~4w0W|EKb3hLIBmxS$Z~QF> zA+i-T-92+IYQ@9-x(T z7NBtt2XLti+C;#=>j5W!Gw90J7xS*Y`w!h7UCP(Z3|c?HQN-$C^zAjX!!|~bZe~@` z{ZMnd3W-Jq zP!4E4P$KNnJrShH)%XCYyypG68LUqOhx9FwbSLEcagbGt4o2S~+hY%aWGullrQ9CJ z8$pJG+D0DTaJ!^k__u)$fdX4JVY2{eLj$` z2kMl0b~b@156I2HKD}TCKHZ%lb)bYO;?vmyW*-NiGz0S6YbEHhGd`Ui;C3vM6g$)e z&={7sM<;k7$)mdoq|CFE3CaSQ%kI(H0k*ia3nYoCU7+KUp!5M9l!NWh2-yURB*f6|%FghDZ7MV~8lWBL03Po|jL!#nbl(E64LuFA$pB=NiDUQA7j2tB zW!C8z?>0aOSW^`t1FU!VgF**%Mj3w#s3YysT*1M>-!c_6@)@FH;L+=%V$toRV&c<% z4%8$ET^R7fa_3)AjS|r9qGAEE!GeFivy4l(w*+Wt(e*Fp(mGbE3ei3@T6ILl zM=!6GA`iohuaiOUj!{9DgOpF5J}Ml+psTQ&-xz?dF?{J^Df@iA0E0{S?-JG*XF-K& zXNgJ#sI*D|PridD-8Dds4TTr;%YOdf$>6}i@Itf+l*ss7a+nwxUUV!5wIumlLO~qw zTM&*jh~vi&nv&yhF$8fOzd&Rlx3+%vXnk8M>(R?QDT|xo#nA* zpe~I?ECYXwKB$=L{_E4Ly0Bb;VM2pF1LSsakJfMet)M~_bUp+FsNykHMhyS>bbs*C z{{EU9Bwnck5(f?c#FvBp>Cycf)Fklt?7lOhp;CdN)BtohKoCfo^@mbrk8W;X=t*{* zFM3o!!#|~b9^K6U0|Y$4mp+sVd;CA@`2VZB6;IIZ54?xuc^EvqMUHs(${g|N7J9*V1{6)q9-XEs>p=OP!=sb$ zg=OAP@Zen=bR)dyIst~x4$!q{9-SQ$tPBh<+WSDsmDd2Q$B_dx?o{gj0<;$K!Y} z&3a?400Z>if>PlZyFe!P@*2zYFua&I@yGwywUG0>n?Uz<_VRjz#LMRX_zxbaP6hF9 z%mXEkQq~v$Yyba$vFrM~{~H)zyMyke2=HiqTO#Puebu9v*9&xqw=c**(D2t5IUa@= z_7i{ne_{3M-TxP%tndH75P0PmTXu?gYgZND=&QQhsoK*sw-`p%W}= zxwC+kfdQ-pbnzspj({kM1uFqbdUQJqfOUC+EJ&USYUP5u;)bA6ON{oi$N$ry#wgE? zZq65-bh>$U#kTeKx4x@z=C(&{(@#$o~{OY5Y%Sr zZUpx>Ks7DMmo{KcyhlOuojbu&-Hi*_K=-42blR>134`xr0o@(Y@BuUu1X>0Mt&Bna zJal$WYCyI8aT2 z7{mH~0+hJ;TaJQ~WjC)5$OW*&Ge8MxwJ$5f%k?11)^Fg;>$yOcUN0|m2rI*jdwoCt zzXWaG^=SQHD(cZIdQ={Kv;DJRR)!Y``+od?UGD)}GzvOTtH^!@6X?u0=#g8+{h&~V z%wEeDbAlE?%7WH-8lQXtI!B}BK#7J2IQ4;&H>i?#0A&>qP&pp}I(`SVYy@0(g9y+*=x$y! zknyc2OO!wtmCAzJ9}*tjjo_AW>wyv;-|iDWprh6=p`X?TJHO}KO0e@dK&Acv2Ox7{ z7?fWic3c9fX$4)$?C}BI`~XF&Z|kK}(0N{4)xpy?>w;JrUUc??9S)L)9rtw%BHa&? z&O(yzZd3qS*?OQvz!mPsX7Cwc;E@y1iD2OSWJAH0gZ87Je*YhK5nA&OP{v>=1syHV zqt3(dg1;Afa+wC`Xu|~1{jnfd!2ANDLH+^df2eto`_IbX|Njp)ti%RX6{vgkPACDD ztbb)d#eE6rM&~9q@SK~*%auK#LYno^3IT@y4Ime6WaQrlxew2$yWt18jS0H=u9w$Z z4ywhi5|mircNw36oL|IR4>tm4z!{Hj-pm!Cvgss$%Y%3S|93ZnY-okvZwX<8@3(}N z6U?Y_>HxW)quEvoboLpfy*1+J*NP>X|Ws z7DYgY`g(cS@USzy*xn6|QOFrfpm2m?sD0h6o0o%53TfCO2^v@{;ed}{_40a3@GyXy z4+byZ&j5uSXyBp5k$)RQ%YhOr8w2nxXW<_&0ZeIK4pmn)BL2UyD(7|4u9=)Q6K^2FaG^ont-*&t80Kdykuuix>n9CtF zq^bRxUqJNLRW=5n?n|Hf1sp{@x-Wj_7w{D5_T+HvcH;QVA9?6Af8?ppF8n$-K0ERY zIEg@nbbf+_PJo33ph6$4Pn2+K9|UDriTJ~g-A+8+UOd((O5bz`v4CpI&KMPe)=MSA z-G@MDx_q!@U|!paMdm#J2Thi6Ho-m=BGhLy80(yHAud^KU!RdZ~mD*``wVgTFvp z4>@X|=!QA+;4guLKLwf}@i#x@x4u}yt$hkEwjSHx$wIl zbnHHWTp)o)6;X=zPsd$U96&uMP*=A%M8(1QB&g$gz57PitXbY{42K(k zi5R6q?Ea;|o(i)27dv+<*a&y6RFDx|%3vd`k&KXs8gU-#25}JG`0KwZL?eS4Sfip3 zX#Eo_6OzU3YklnA(&a&q32W?g5Z#l)lz|iZ+)BHn_za7*)@abiZSo!?F z#|+2ro`xOa5)7WqC;mV5=w*#kgm^d!N@qdoA}C!2rJJC%k{2YPtf2HHD6IwZKPVia z>SjU3H$mxBP+AJA?iQ2}v!4sfS5oF-Xaz0yFa!k@zsCuWZg2z@f%G-LdhlSLb%}lR zE5;Hd5TObpBpQFY7BVoDaCr2x{sskwM=$GUDBTUElcBUTlvW1OX%p zB^cDhB^czxB^boRB^da_B^cPlB^dsPNicj5lVErsCc*GLOoCy1m;}TAFbRg^VG<1I z!z384he!l+TbA@lQPf)(tMeQS+05OLvS)g7NL{ zU)>kGKf82ac5M6+85(KC-){_BPTm4K581K%MB~c<149G;maCxr^75Z5BO`yyIxw4o z;Xea^3-}1fpWOVdDvS&aj=j!|;HA` z=8vAtAK?~uf-M9c$bw`cXbn*#)IxDa28PC$5DOoH&Wr?ESOn^hbi1fz_;hl3bhm&< zuU$GNJi1*}Dm)-`fk&so%da4Z@vr}l>^N8EOCHJhJ(+L5?(KDgIM1c~g5$wQOs>|q zT>1SkJMypp4N(CyFT> z_$y&HI&gRc_g$alOWl8cyKlZ&^#A{V8^+Rl&+dDzmr7)fFL@k409v}@`TdiJ^^G!6 zU#wrAhvDUVM$qy4uY9{tdGN1)?fLzpXY)@+{-%kbc5|;2qeu5)(1_gk3mzBWc{KlE zEK>6Lf7s*VYtSVjf^b7UzJK$uzEQr~gMa z=EZje9>W)yvWfZg_Pv`nKLK(Qo}QbBl$cuVm!Wo zgzH!f(jn2y0y?6S0dxpkC-(+M@U`f_WqBB0Y^w(){}|Bjvm6y@v!=U71v18hvfm6X zy@2OG9lLLOg0=y5zkHFq`py5A11{aC`L{tbkWcsV4i^=J?rWeDuKR4Ki;4y)mAvLK{Q)#5 zRxwlikYo3$i$7eApLG9l1QnBx{OeC@A9Ceif8pW}kK_-Iy^f%w(v~_ zdUT(Cq4E~AehoAO%HIMSxbW#d>e+qGv-`}8Dt=Z5P&F0c+x^9bfBiqtu7k@@3!TyB_>57d`o1&VlFK|AWSroBs>cxcYRT_dNKL#j*R~!3QiZ z+6N%>;h*{Q1wEP%3Vi0z=kjPiB#_3Re<+PV;b0nn#>LP4^~|67>w^V6nhz^@Hos&n zz3AF{phO)sf&^Pn$G?ryy!$ls?FeuMeQ80>v39vcNU62Pk$N8E1MV zpVU6&!~F5$4{Y&u4-sGQ5b162c3*Vt z{sC)pfNysKal#@)OY)(W8-FY4XlO{`R$>e){Uby9TlawGD_m46e7g^UCU+AYyH9t5 z>gH}26>!c2-wYZ5vL1A{DPd(1qM&XExZcr+lv<^6pzKV*^oyAc3`8hfl@2x?vd2`=i$){T0-lh;^5KidLJZW;nC}Q9Kv@;% zSa*-^+T$MGrT2ZhOXGdIean4%Z7h6xRSdvQN$*}6Hc%0H_2Q3C*Z5u@a0TMneZZyL zHDCK+r|W*l?$aKK_137v(h=JYF&p}ce-LCZ@N4*GvItDZ+3ZI$+x32@>u!E|&;oA;;{&ZH z`TIaEu3pFgAhq2mm=AQi?)T{Qy$;IXj{Mu$96La3-rblyn~$+Lb~rJ5HXmZ*-^T0+ zDn*@{Jem))ICeNQdNvfcnLYm>Cc{QhnqV${ z@4@`bgE{uS5A!b{=FsmR%%6OiW54?_Kk{Mr{qMu<`ro5D_dFwi>+OI4K>^wwy8AT; zDCj_8YJH(Jr}boA05r&4x^IBOY&-t&f`m*5BRDkJz@gE>;LCi}v-ve+>4|P%_x~p? zeYckiL;cRbjoq<>5ghsq8$j2{9q{RfWCEXVNT%@UhGv#-Xy)mLWICU2NCrXVNl?QX z+?zau$j{-9p^jmW;h;?Y(xdSWIG1(TmOFO;aOwW!(*4rc`aJj)plES$?gq(2)=tOA zzHBc8t>ASnhiCIn7Zp%$0cRUfZg~&N8=x!>&Lq$*?xLd6?V1kC>WHko1d^4-K0>nc zU2s<3?$I3^@6l_*?5KUT)AfGie{imm0ntW=B_fW!u8fX*K-mUdNp`x%zlMr|@(xUl z`G8AzZn+aDDO4lwb9**7DJbFRShZIQQatP$w^B`w~TnjF=;CZ_O zeD)=Oi#^D7zWcjF%YC|I&%1PA0u?nr-LBXDdQBvKdTlJbed9fQSp>R6-FtaJn}rx$ zv@aT;?DW0f>3hE0*Z=>?|ED^Ak9UT~gYq0`4W>)C?|m0$-|aq~zS~{8eal^$PdRp< zb?MFp<-hN)%&)qAkAupP|0gfL{D07=)Azqi_etiHKApbzeY$<$clw_9>CD}4e6sZt ze_t(VAjs=KNTEyjOXicEzUBP#4E)=;9XmMqw|PSvIvpNNp3Mh98I;ShgWD67b@{h( zcJPC8E&nz?kV-#BkLF`c9Ue>`P=&tCR~$R|z?q+a8>cVx8OIKA?)Gec%UC+UJ2c*> zJ9mG#Z@KlU(kT9I+})w^U>mtX)2u|;$LI0?7!kI4bo<`-Wxngd9J}3@`Kt$W>2^=% zzo4A!3!;3#gR?9++rDJ<==8nM-})4kbA6A4vaRoXP$*jZo-eIxy;K+8>jWw4K7g_< zxR`_Qe*%{=4E)=m4Z{uxSa>mkgMk?uWQ@MdXF9++8hjt~$?j11|EDZNua`=}3}ANb zZ~zsXOpYDQj{MsgJJ=z)*aMo2J>a<&k_S8*k09qUSeEtZKH}5qq2SW#AQ24OY6Qx% z;3I+|dET@8r%&=06;R#Veak0#54g7UNPg*KeXgX)r!#@WxBH<_XT}Mi?su)1N`gVl z8a%o`d3OJUwTHoN!7HHsHiwv58GM`XnX}31p*C6HNWC6QEvS8fk{P$zg3fw zfuZ{%L}^I~L|I9F^Dpk#VxWGzkzq*@h&D7TF^BXT`CGp+Ffh1uZUI~43R=H&98{oy zLazIA_gRnTBN3odDn2eY`lTTk1H-WvaJz!hwfj6wmrwWc?#pmZs9NMc{r?Zu!a$^! z*B}4?2RYKnkiTUg1EeWuXas7Cf(9T;J&(Dl7%;eWmZ)gJoLi!z0CMY#M$jr(BnKY` zDP??p84@CfMkPg{z}gQ9tP-Oag?WGfclUq;-J|=)i=;eQn@~a!(k4VQ>*bSzA26Q~ z>-mqMg_Xnwtr;7vl?ZC7a)A1$kVz59_(=%3W@&y?07@*N_IdYDkK|j9-RD8egA$Ir zsDKWSV{q+$=-B3R-*&VIm*`2N7*T=@)%GXYNe$ z#&fRX8_z+?FDTte9qAEDYT_DixmH_g(ncfAdT} z=gE8qG?oKOEr>CKD{1`sst32TF@VN&zymry$yYu3UCvB^kLN_<9M6&d%%2Y#vq|I6 zKb^*3c$ot2_0hCk#;8h_y>jx_%C6QB9(IX#*W3Z(I;-}=m7F9jO>0gv(Q1* z!|F5sZOk2v9{&%*YVZ!wFb`~e=Qd=B2Q`G80A4N&g$xcC~B)u2K@96`sOuRrK<@x4#-3CHe3 z{Ob?;GN15BJ^_kU4`v?~4X9}spw~Di-}Yd>?UDT7gBiTv*75%-$L`CH&A&NnY<#;9 zdmenj?9|HwTFk|ueSu$|;j<%uKBFf%UFV-j<1hTck;Y$mk%K=Bp5Q$}gOfK}FO|qZ z`j^{5%9+v*p5RF9Wb|l0$khCbvGj!x^Jx#}^RBIzN_#=W!k|mvx@%MfVCUh({Xf&O z`;_(}Q2B822U5w>eZwdDCTIX&1C%;_nZYHH0Vn}_CSUSkJ_YsU2~c@6(?$Ed_90j1 zlNWzn9vSFX(L%z%he3DQ2GN0s^ zXZU}*`#R{@Ojv$(PVyDx*s)h~hy;s>A+I2Zo)H$0O+c`|?SOg`EX$B}Cp9dXp0bX*;-vXM}b8UT6 z=jxMO0~*Nu0vZ2?WNpv^5<)*%7`%FIw80{v&1o+fey}irdDlS8fIod_Ven+W?+I$n zp9E=0y!zw+>r7Dmf}Pdrq7neIAlxVUhi~@_&+b2<^aarm+C{zztp7Wxvjw_G=9y1& ziAsQH_aEQnziEi|m=N`#Rq9P(_1`?1?|XpNL*k9lfH^3F{LsXgF&c5|32M!d^?>b zKvN9Cpbe#<@eRmmq)YcFU(jG=iwbDbrUxkR^{9YWPxvN3^y%(V0WAsh=#}a0KIh!a zqS6WK9UOucY!Qy#$C@87cDksfbRPrHiC(+-qZ8VB0?V|hfY)93g0^6QMlU^kogF~! z3kT0$=NTY|g=eqx0uaN%v)6e7h@sKlq9VY^zyR(|q}&1ZT1y3xhiziwq7Q?HML>@9 z04;q0%{>KpbgoeW4Wt;qb-efjJVFl{o^|A3f6PVunB&Elp56a_I@hRx&V}OF+yY(` z13FIhU z1YObv2|`da4;)mGV8k7MFx!wq&WX*V`4ER^^D9RFR*!%G|NB@UgH+Z4?o#`kU#vu!53Vf{||tz2U&+VDsMuf@+M|f-ULS_vQutCBhjPz5R;Gfv6^n5 zUfDY?0t}waS3Q~kfEpV7tu=o^+gxK*GC<=opo{<=b@63>-tD6j@&ABN@*41v3@BIb zVrXDsxcCD!)pY_iB(B8Hz~I<@(1ZDaN2d>HPZnsQSoc@Y=D#fbJu_H9>uSDx_SXLK z)c)de@I8~q|Kpy$IVvnZy}F?;0t}A(LB{z&M{}U{l}opX9)I|g?obB)@V74AK6-!n z!*9EEyZ&(mEk6Fk&j4Dz_K@KZKLazUd9Mm#fmRfQgbq4(pE&q}2NHdbjSmC$iWv(AR`_)^|A;# zG9PecK6vnj7{A69kaWmh0g&8{&-@V=_%%+0gnaHweCCh1_?bWA+Gl>9L*OWIWImqe z*vSl%PPr=sqH^vkfT)I|^;@M|@og+vZoSC{qSwJ)5p&Vd;x^%nf zaX5CL0tE|8BRmiefF(g*ItXDMJothKbd+BBTae>kbc2?dKs*O78JJH%J?+?i0ODP+ zBs92~Pwf)338~gb%*kRLq!1WT~Me9 zKtqKGU#K{CpMs|iXuv?ccEYh6lKUWG2uc>9NQOi^zs414aDki~a#sKnWYExpCMy2$ z+lT~%l2AY?17z6^g2}@foU`$T2Y>i&SSmpa5-ykS5Iu?R5Iqr>ZeJ0{?t?Dft`gwT z83NhGqxq-;jx6KM0}6DkVS=1MkW&YrXY*kJP>+Vcb;EB^*|rC~vcVBtcEJiWU+b^@ zy)ldopbptr&;no2?)RSEUqPj!_8XsG-EH;)44&HGpd}RZx9$-AKm6fOT)M;mfKncd zJ~(V$y7~FT-#T`m;t#(KNq8R3$2mZW2s29}Cq7tu^5EBc(R~P#p3qVvGEH`d z5c>wGeCCe~xhVk3cKne(H$jE+1uUuT5V&CGk4(8K^O-*~=cdAE{>Ye{xJqS^YG)>} z=aYR@62L?BKFl#H89vNEeV8ADmb!qK(KP3%L@@HVe)#eK|7&(=I5gL&q%iQeh_He- zyqbpCf=(nk>$nG02SO^$NM;5GP;CjSDt&vyIXwO!@6~}=(aQs-`Q;g0yPbaUhd*)b z4*J6%{1S_Fq1xH5#)f!vsNAZk)O2njw%{z#X5*u&3}KQiPVH~>Ly$a}a# z@CY~r9r+_u?m?=ydyuN_9yk!8MLE`@3#8MT$+26g`;cq56U!j*2eeKi%Oh-#-9a2+ zpYRL@pFnC8JU+p!O2F~K<=7o00QQCm@!o)xUI#C}fD~q+EC|bvpqvOzN#VCWn-3{~ zGA$z2p){SqX$-yT1a=jq9>C@sEcF0b2U0z7;?Mv8zSd{?dqLY89J`M?Y9C~N;oL29 z9$Xx`oM(ZSNBrS$!EK)tkiy*a|3T)#m6>q)6R%x@z7-G>gofOHf=(e$GG(7{)bZe-&lP`L{dywQD#U*jyO>h-xN0TOt?uW=Z} zbpe$Jke2T~5pdH6v#ARTeMpT0D+r*)0;oIyHFH7DUF4=NNP{yIzXqfy4LbP;(zgb! zXjlMRl->>LkfV3qLBmmJd^$nrTY=Av2t!QHHNFA$;6by{paB4%UfZYU0u0@+e7hg` zB){}X?ok09^x~QP6V!bNErtM%OZ2kXcea2>DY~KK5|9<)-A6$q6OdgFjxY{rFv77L za%F)}@(CYM_s6mEA85@fe?MrU9)HUPO;G3P9CYQrAavzEXESJ94d@mC(3l9Q!{yQ2 z0(K5)$il<5`xxlVj)3l~Ag+UB_gN6P0>rTZu@XQm@Ub2lAQotd19XfIc!;C%G2YlQ2ik_g-(n0B?LPP7tS@X)g761!h8J-GKmNbu zFkxWm_5mGraoh(qtpmCuSwQx&GaG}W_F4Y*Uyc9!cK-$09^kn9KLZ1UC-aBaxBPt@ zK|7~AeN-}hdQHpBK(*Ujet8Cu?)RR}|5^BZ9)kBigoDR7e0zOVKm#0Jy*l7=Sfuf3 zN0jjm4*qT6!3t29_=Nz71FniVKxy&-|2FXGhRZ$7zVJO*U-88j*aT9XDD+wcLM zb<+(Rl>;pR_q2Y`-wRrt>f3$Yx0h#)kM>o^ZcfB_70tp~z_a-vi|79XAV-z+;vzVWvf{soF)=)2nN0EWqH? ztFjhUdOLQ9f!cbm-D2H`+`C=u{-`qiXJBye=CO0^KGpaT#NiKr0_wMa19fCUd`Q0m z%sL3_^>Ts6KK_FT3PD4fp!;RO<0qi~-2cHW(B|*|45-};A^vTrKsoIJ=mc%%6OR1b z4uZ);;NCH;VuuWYd;rx3{2J##wFF`a+VP`h;{ z@S%`rkZMln2o{ZQjQrtmUAx^_z-{0#4#(~T?%h6i9MB*Mv1365$v31>fQ%LWXJB9+ zl;PpVM0S8MLjnXe;N#dGCIAf(0eFD$49x(+GB`wJ3Sor=hzKNwNI(Nb0v;eDLo-0g z&obQcXc0CffFFQHMBo9u2Rt2Sxd%KJ!ruZq|H{3a`ad52pqdXHfS}&%9RXO~b_aPJ z1a}aE#zXEvIzD&6;~^z?RG>rs_(Kuw8Afp7707}}9p47jKhXM#91lV2Cr1v5k9Y=+ zk02EcIX;3^FpdHcABhYaA3+K*a(u+@*?bVGhFAd}FS*L!`TOt;0yORF(Tk-^@kkBPr9iAd0CyRh-gp>{6pP&*eR zxl9@?or^^Z@Xmz-xKIYwY@p7C45;n{buK^!Gi;6(ci{}`T!79d%()3Vw6Fv`GfTK+ z236EVbuQi^cP^}D5uJ-i@~EAQD#D!$et8B+|Kf>jH>iK{mYDv<18{?o0X&!n?WP?8 z)j=+Iz`^zct$%S9Bo}fA9EhO7ZE!b%a43TN7vQ=r=MK20D*<;*2nQs8_!HM|&?uT? zH*x(7diV!gMcpC8L(E_gf%+G39lHaG>R-^sN02&(93Qbld?WyFl?4*jzo3hcAe96; zJ|dxi@dVnx7!FwtXa8b}1o{076;Rpx0N%fl0hPkw{sm|a6&1^k3Qk9B@L+xS4~LFA z#+M&JXYU}UKtRWwSIh+M5=a2;$$(FVfM!2@*+JXHJvu`mhxcSaJ1FlVa~`0(;6R(u zK?6dNj>-ej_>RZ_qrSZrEIz$D;Bg($0&CE`flsflrj!5!e80bYw~IQYZ4eIauc$-& zE8?&b62xT4@E&+{>|g^A7P&*Z57 zh&p^WM16?PhLAfwf#yWIA(wN3TbYm|%lZX>Zv<#xM)wl%D865>&0F}K$PZ8Lx4zmB ze3;)Nl~uK(0t~~ki1PS^K3rO;ragw@DFJF0i@>e zw0_Iq`xmtROZ%;FFV7oSX3&jM{`>+A*gE5&sbJCyIx0sl8>o;24>6Dty=>qD=>IXu zsw)}rUE7dQfX{+2<_33w?9nDzdOUi0t@#8P2+XrUifY(23uv|*Jj((q%88p~0Tth% zh5k9pZ=@cOV~5?#_gtW2b_#e)D|``HH)shMXa(lMhfLN7YlXWndi3&6IL6KJ zLRkIB|Cf8Y7#Oq z#UL9FVXg+_55ELD-V(aa7qqX{lV9r!fA~p|L&4kkLT-SEVO(y2gWv@5ZVv*txMOaB zlYhz$$b{St&;aM1&-@X0Kl4Z2`^>L%7}HJgp6&l*jvbJ_;2zc`DiQoWPT-Z2IVuUD zu5*D;ca2H~JU@U>v+w5l;?t{Z%`LzH3bJhhCWK};Z@T;LA}rDG5iys$R}vPaV8E_e>` z96a*C3k6{b54&r?d+>cg8(4jrpZhXj1D#6?9&c!V%LqC%A%VYj@t^m1C$`nfMcJqGho@z^Zx#Z|(5%-DI?aGzz_d&ll=bjcjIi?%h^QaI8SZ5FL0I(&sxP|_ zg8X&q;0sXfJ^)2CDA$4NM~`0K9jpQjj=ee}(Ap7{7H_h+_nK&2d<%+nP%SwXqy$k* zdh%Bas!<7bHH^ra(PdS`caw%R6jo92i1?a!6hps5>c}#xPE*9imjXc z8b_dk1}f4(u>-0fFN2~BT+&4#ha#@}5vp7U+Fo(F3y%nJZG>zDmWV*qkKl?i1yW5? zUO$3^-377$ACX7Fg+C~df)XBf*C1z7JoV!SM$oP-@CK>IBcL5s;6pBB9b-V}wL(t3 z_36Ij*%{5@*_kci*;y=syafxS&-j2x@-5F!=M%2o;6q?QhkJHk_Uv>%;M)Dcv(tG; z_s32bl@!ovFrK~6D?B@$CwTTcukq}3?(pn&-r?El+~C>kd;qlD2z0K?2@nIc=?S#U z7PRT}opZHtA*JJmFsAM>HpLy|rDnxKK=-gTtl?0dW(=OdLptCNH zfi{4Ec3(Mmp9AeP18o!QUISjE+kF*uKxl+ZXO2n$s6h_05_D!M$dMMHaY68n1mIh9 z!27Z^VD}<{6e_&v=4N1MIl$jKAG93`bbkTZ(h!j4$3WL?q(IGg>^_IE!lg4r#Q}7O zhXu$GoMx|Y1z%U(3c9-(>=HDW5^2l~L5LIofbUR(p3uq;y8h`e=txxl77*K|*JLYb z_X+Hj)yEy66G%a4PL{-jj)?^w%?dt#v_vJsaR=xiQ;^dGx-WOPfOpn_yjP>*;nJC+ zf;emydaNrb6@XN0fZVU}V#i-lG?i+DPC?7*fE=U}vm? zlHXxan1kXB?1CJS3qURhnHkXCq5|4>13DzA8*&y=r;Cb1XO4;m=(th?P?SRK?Y`W7 z?nTVffB!wY&w~zM{n-8keE4cp<6jo=skWyKL_;|`G12>P=|1>(=+E-DJ3NPH;(I&Q3&_u6)Dh8L9*KmNa*_3!`x4U8`*qo1z| zzR$w}e5(8NmmKZ@!>AB`ZSQ)et z4|KBkLH|J{7vz2;u>0?MGXDpi;P@PJoMMJY^AYf=wDEDV zhbeNyAJ9(d2bMdeT>RXa2_D0@|(Y z(f!i5`-5-yPlSbz1TB2=Zz4DuhrxV)@Bvfnw-OW3(Ub+C)9*p40d!Dkg-7xW)bldW zzj(BSkbhqA3&PTJ?Pk#ByfG@s;r()gFz9BR7!^F{Rp#0cm-7m9K<5?afX*ufu}e2niqxnsMWA{(T z?hoC!T)IELNU;Vbgi>~+125y*pd%B8MkTzkx~A0*)IR>rA`vFW-_HaZjBnY>%D~Y0 zn@K=al)q&S=rV-gpbHR65*mNANT`XGh&28Nwbe=jK(w0}e=Dd2?{>}TzV6fQYtenq zr`y#4+(>mz05woOx?LkcEg6e$*8p%^$rZ%Y@aT30pL413;!p)6!^?xLpu4lkHbX9$ zk>O=6WoA_6Gcvri1pA#uB2A3H1|@C0A7 z`Wqactv`NKCZ?7|+P?64c_Pz#Xx!j0~^sDKLO1jFAD-HGtkq+Fb*k zi127W5)gaX0aiJ=c3*Vuz5%)*)6l4d2X>v3FDMKDg49Bw^V9iT64@9S8h=4D^)^r~ z^b1@Ir8fS8)zhI)0LGoM(gJ1#e52~!70sRY9$o^tc00p!;SR4}2GeP2zi@kZE zcWZHDKh9j50wo1CP5{G-m*~1 zpecV4Wf(K&micBb1>2y+D{p^BaZkgC5l>w<9=)>8i@6zIs~H~vUAbWa8l8(f?9nS*8^+D> zTEL@MRsS0m8r2Oi1CJbHOfyimUJ_PX8XBl#?7 zbl1SASLKB9NzdLI6^{R+Nl?8dww~SJ5%#&Zd@Gf8+{Wn9eZBki3txzZJRY5P;1h{v zcrgC}S*!}xTzbs&IExBs$^ta>Yv9X9<3+&TfkRdHUHw{Zxd%^VA$d0%fOIk$;jWz32KD7>pAY^05xen`9M+W(fqRp z6si%RF$xWr?s6rMUY*7rf*{|6qSKMz>7ZjLgGa9`pG$W=myh)i{-%u#3=H1AEao28 zhxprZr%T)tXn}T^oB?4fs#6p?h~N267XM?9V`mEf2_nGG@jcV z&Id|k1^p}xp1mUWph>J=9=#U{{UFV!|BIgA0%9Bn1$h7{Bpg7I1HLK91GJb;1GJb; z!K3+zLHuElUfz}Sxfx!xNWb~-0gBnhTUZ#354=A7Lh0}K{~q0kU+?qi<(&pn^6~HY z|HcPiZ}#ZrZ3FQig82|*Ac1@4%o&GJ&@CgOj^HfrYW&ux`;lY!SC8(O|3wYAfUZya z;L-d;gTGA#lrKP6j@76{{1;UNI~bH$`CD#+g4jU-6e9yf*0niO)TDy5blrsNzf4;QlpB&|4-R=sl2TIv@fU@G{2i-Tos+m2z?{>S3 zbn|;KANF8A0m^C#p4R8e9ejK1_&~SQ?aT%h7U0meNITBpnA4ON72~yDV=lg$jIZz;jf(3Ge z5U2oAfP}M0_fOyM4<6m8Ji0#_-+nP;*Ps6_2l!h+U5A~#3=9naMN_x4Fti>hDFsb@ zc!C!19N=#`%fP?@l}_6ZN-&V{2T##;pZG62aT7=o94;oHG$3Q1Mve3zd4d4P+I_{t^`rklmsnyIT*G>;_qUq8nlKmyIk8;Gn-emz&|mIf*y_ zUugdM|KFqab}7F{FK_7)7KRry!0K;+F3mdI^W(o~C)>*oP;%=PeKrSFNt}C;*8Ssu z>jD1Oc2E$2a_oOmXNc>>L9SB=yN?L|CrJ9W1~}*c7nKF8;%@;>Yk^e$Wd!+y zzXfzYEmVmV$S`CkKOyBZC)?P?a;mr3E-Jv%!J6 zV*@C3&wF%#_%FH#%m!UdT4DyO68B_)!WLZM2>O7M?NyMQ#kyG-JUh)iy3hX?ZQ8)X z@Z#t%P_>q$V({A0qnFow4mZP#An`Z)Q^7Z;ec1Bn zzeo2CP_g9T(R~<{MJzyB!~>E8z$G;(eRIIde~<249^I#2oY)RZ&n3pt#5!{eC?rY? zp=qZJ!c79#@#jH?8i34;e|d4+pZ^}cqMv4g;{5cBqE1k#mWqKR^uK5@M4L7^)?V-M z=oP&QRp<#(xc%U6s022pRBk61C|X5s|M>s^aPx2Gnn#ef4aCvlKrsLpU=V8@f}v%pPxrap2$f){)=k zJ?IuCsBv+K^N3*P^@?`Q1cfuiShfyOSeGbz^ollvh0neC+zu8(w&^h3rZ5I%oBoSF z+r+})*y+ac!uJPgPezSOfCK-wqmZ=HU83Ru3LD3`*l19BItgR}Xx0{VC-q*DH>fk> zp!5VTFBPDPsxbky{i+vqGktew0XQgb!CDmmFL?Bd9-0C2$7zr54=?P&ZZ1^;o&4wE z(+h57oO^NdJ18%JvJ8LAdr)Onqhjzn(W6&%21Mrz4zM=<)?=WEUi}rMIz$Ch!*~Dq zFRHi}lpP`Zdq6oKl)Y6zf~^Ni!a+OD9KaE9;zfTuNagAOqW{)_7?(lW@$g0#29MSQ zr7|A9y#6z|8D5+c22~|7D&Q6tI4i{;hKyJti+J?%9-Pk2@L~>F_38hjyVtNV7(rXr z-6bkejW2Y*e*cdt?9t168l?N(S5Q?KqhbM40@nnpmtfc-7*z9Xcywcgv%@yV{}()3 z5Ae5uh7v#vLmWUWv0JRcE3prF^ok~cYN1}<#O*8$FH{m>(vHU8$2;4@kx)?W1#Nw`uLcD(sO02t>4L-zsA%>0FWL&0xv&>h zn}W>s;or{e3$pM)iHS$|>9pn_T%|(3tp`fj(kwIom9VFEYJqNX;@{5b`Tsy#CzDq% zk2C*vMvz!q>w(hq9^L2DTsn>Zi>iPPzTSQIzv#>LAlq|PJV4Pa=F!VrFpZnx#cRPg z|6jAdnDY7ifBtPBKy}*BBv3tE0%=!+GR83vNT7h?0F>U5=1)O^1Z^aECL4Hk|LT6} z2`Yj4ePGMQdc#;=d{6rEALJ_@$4(u#UO&c8ZjVlOaA^l>u!ED410?f-^BJt{L$a?# zMF5n)0zA4IJ-R=6bo06hfR=rN7Xm7HcHit~^6dTrx@;D7L%D)yHv?$0%)qmo5ky-Y zcTv#+^&vj<*Sn}V{1^StFTl`pphTnFMMa~N4YYF30PG+a6$_6}W=P_O4#zeh35W+5 znhB6330hDPfYj)Rh6iFkF-1io6nuSp?-~_@-~a!6G`_jO%D~`i{KNya_6yXc^zHuX z32ILLa_#;CYT-MixpXeQz{J3i=F*vZz{O&z04oCne+%feJ)hoQ5a)O+h-3k!C#AmwzjOXqS#9 ztRO}IMQfLX(!vc7kY)!^n0bI}@@EPH430Y(Knr(zr-EDrZnB?15)C~77Fw$y0O}3@ z7v)*T!jR@-33h&op+|2oNY{&JeLw#D^tOW79=)O;HiMgU4?)dWSaWVk3@DL(NOQ4F zJ;2}kkAZ=KKm34W_Z@yg7nO+PE-DeAb!s3E_>}B4c>Mw@B_lw+?eqUdJywA$YSI6q z^OmzP*fN7>VL?XyKm7W-<4y-~Pbo!3!Kc@?!2@!6eZ+rJDX^{*0gv9$22d3h)c~$I zSpFY=y~v{%9MCSE;3xp49RpC{M0oVN9ysozq5%pSS5QyeMMc3CRIi@@FS=?a$QAr8 zt)QYBto`DPPB3i?YK;|f@A%KazyJ~9-|nO0ljhQy;(CC8yNik+sE{xLWmtWWUf%;R z*7t&f%@tHu?Ey7VdwJJxLTUmRMF02?a+AYr8JF&ppyjTh{;GpdFIdMSP!X0}_v62h zWr~VJsXo{){_P^=sn z@)chER{Qba6SOGy#)}7WpfVGr;aVKXp>tF~Dchs_uxEF)f@gQJhG%!Rfp2%R1$1d9 zsMig;rS1R!|F#U_f&WYS4!&gnezEx>WAjO-?t_QH%@E|we&);>-{cdntq1BvjSoQ9 z|5)=hm2i9fKj3M7u;#PTfx{aZQ8j>?Bq&q)y*Vl?JsRJD?lY55^a7B0*sQ*SAwafPulIleLvwfWeX9^;{=!Gq(VPN9+Gm3FDLhMZ*@e zFm&@4fP}h#cyzPIaSJdQU-Ia5{qE7rDk#su(CNFIKm344r|W+H@RJ^$w!R>xy}WIr z+zcL_p~uts>s_y>@z?u4_vj4$f82F@0LZzWwdY^BfI5Y(2TDR4EEq}xKyB(xH6WMq za)b7ZZNKne^cSe)@8uN+8|8Zag%DJS14xH8NJj%i$4xE)27Zu^6CfR(uK!=ldUW$1 z<^mlL>AT&hmvw~{1H&#pa6j+w5>Qt5-Tq&cdo>FKDCOGoYq)Or==Eji*YG{guj$Ip zui<)~U(;2cU&Hk~zoxG^zlQH~eoa?*eobHV7qOh61MYdtrgAg9V0`!e|7)J(tc_d( zpp3$>fzhXTjtVH^JiCh}JiDtEe8FkzF(@5@>H-k<=;U?e5@7J?6m{YfU^slnqw&oN zP{w1m=K>9>@wb2`Zkt~)cCzY$ywwWIl^)%qPdP!paRJq7ye~Ng7>vO+2Y4k##(z7KZQfq|j*Qi($IE5;Je z=3k7ZEd1LJ9royM1cgMy4$ujt4E$3L95y-t(z}V#qnEdRGB?9ZrC;CwpE=_Y?9u!t z!K3-7U}=H}|E@<8MUnqSw=V}Z&`-iv`+`a;(7=}QB~a&i)pAgIRbtfbqhir`km3LT z|KAV({{R1fse(syjf#U%sf5RO7Znc%1_s6wUdtGj0RAbUL9~SE!{EXHglLd6Kv4n4 z(E1N{#WJEj-~jGi{WQL0eDcL|?RWooii4u*!+%jJaCr&tTsiPhJ^Ejia|Ot?-_lwS zR49O#WV`ThJA2GUMT60$`xq#<#DJph{EI+V1_o$D>e_N};zLuGCYnu z2mA*u#qN$#fecy3p@c4IybFGt93c&h3=qcxMEHQ(1qCnWy?Xt><#s8rhc&A(y8r`!%YD$Us~w=>E{{%D26h1k zkKU;u13`sX;Bs)|g1==KXw60|NEp<*UIXHt@HqI8<;DF7XoUpob%W$4AdG{U18!At zEN5Zp1nY19@xN3ORKQLJ>1;d#@(6ejNlaXH>|u}2Jt`kSOL%vJLeK2?D0`C0o8#OFDCtX`yW*QfwxFRcy#}GA)x*aTt6nfSoZ4mf7k9e9j&0; zW4RUNbpAFiCeViM8kGtc{%s%lyZ)3KJDPgg(FJ<-kfA}@1N#1gx#0YvH zs*Q3f>oLZd*DN;GCA|FG92q_SA8a{L`r@^qhxO?)o`%Z*F&@2+|2_C!PPlX^`t2OALpLgkYQ89Vp`2)15m%kNsq=*M79C+VnfVS%$cIhZl zQSj`({^I%O*Y#ScYm#A+jw;q~3wXn_uXJfojDV6$i)vM_sJff>S~h`#;dlFDWYE(drDB z?iv*z(4bKP|2A-f0d++pe7e`DfYM&effCjiX0KlV_ehRWF#%oi?$K*AAKo7A_W$G2 zTmQ$k`-o@vwg0DI*g%}f`eO0VxBpvjm)-|yvuM3tVh*~0Cc&fEW+rI4JEs2Q9$@`{ zzJa~S`a;JR`?d1QHj+Y;~@NaWUb8Wp)BJbLAyVS#xfAa~C zZZ4M&r!-J!4>YP`5dYFjj*-Dd`MPV%?Ghf>)=Q;|$6Qnt7+-U_wq7a`1+f`G$*KS} z*VZlcBE}jNk1^mO8H4!4XF&aB@OX;^QdQ#!>UI9`=>Fu>{n67pAb`K+G6Sg80C_IJ z_~Z+9)p!3L__tl_%uz9Dc*F>P zjsPXq1W+0U^+g>VQELovdqBaX`=&>?r-Dc8$r85zq5=y*>B8Fs%4Gy|c`q>tFudRm z{_)@AIO`z>P!+%cntW71tKXa7Xf)XF1<9APgJ;t;4!<~l4AeYk-M|3aIDMjV!2GNwuf-$ueQj?t>oM2R*w_`Y<2x>14G}^H>@NYZh z(QB&Q%FV#jz`yN8nrrI;(1G^5n0X!&0v{G#N;TX1N~yIAZ1O-7W8x$tj4 z?9zR%`>I1n4X9W@_afjsXbQMSB?6Qf!4rW9|AQk3Jbn$nix0F9G|UlH&SW@tXY%-V zKXmMl6!7i-&^bp1lnQ*hf3?0X<#FhMTkG9D4uuzehJ{I*GsK9t#7*i;wb<=70rwQ1CQp#c{WfipY!1 zkN^KS|6t^A-2qY+9rF%U_wYD=b5Rj#;BQ^b!obk52fRy-0klgg!l!#3CZ6mAl87Jd5#UWsSNzBzd>!e zhT1d+{#H=44q@M+&-?1!ItX{QB>-#Ivb(QkW7doeaqv*w+#2^2yA%Vu<+Xb3NKmTF{vRD}-1H;Sd3=9mu z-BUrM;lACipe~|s_bJcr1D*$8DtH`xq2Q{0$Wi+s_!>9IULHor?gKNm4|QL>_=B1C z@o#0W^wm`ZqrVC>8aIGBPk6XWao3{{R2~OEys1((R&R z(XitksI)7Icp;JagbOS~P258c1y;N!l zv&W-XG^UlC0ahP^=I20tMo^FBMX>F=|J@fHJKI5ep&KrJx{qnQ$!OO}Fdv2)!TdLk zKkq;qf8KqtQ*VP)yuyoCmv{f6i3XZv(wg^xvn&HYctqa#tw*n|=23nIaBB!LzQ@1a z{a>16tBVQ?e@iJSp>LCS;onxz*zlXNQ~*=~@8$wc<&;QoW_~T+@S7P_&76C&3@ixh zO)&7g-f-mK=9|X9?ePB-{EH73i@CP^FV*GWe9*DOHw`r4w^Njn;k69R11|jAPP=v= za{(1<9^Kboyf%9G|Nl{s=Ho2Qf4TUZa{mAS?+6;JV@c!R^?-|CvqZ(ASl5w%zl#c6 z8h_pg{^)O?`QuE_ws14NxbWlufAA(@XEjf}@G^e)pI@Uy#liEqE4Z@=+6f751T-JXfOMbYW1-bHsL6vgJ`XB! z4ZtJvpSoYZh<^>*+`I!c&)52vzZG=4qD!|ki(}&tStihk^HEURVQxO~-F6Nr=-X$3 zMw@y?PyBoKpMP5mlLeC`Lw8S;2$Lj(2lJ`_4;^31YM~6TFr6i zGZ0_SaVKa~_-ir8olih~KF6KfAezl_rzY6oHqhXM$4b!PLy1|#esEn|%4d8D+z2#2 z`QpQexBt7DZ9&7Q<+=@fEI@1a8A_CowLn0&fK`C`|HxBtN@;k7{bRiEzD zKHbMaz1hc8K#d?!L$Vt*1=3vt?rH|OsFPP}aJ&sfOMuIb4d8V>CqN_J3I9cfCW6O@_*^VgR1!+qo52b> zJi6zB`c4zN+ju|)TyKaHg6C^KZE<^Lxm6Znrm!NAqEJ59XU5&5wUHAOBza_VsEX%Vi)VN(7q!|1Wj@FM7To z)F-Ygwd$S*wynDlB;9-{;l)}H$V`#~Xz`LZSQunfC)f$iV7Dc_i~vnuzvXY)1WIKP zy^h^~Kn<=8-|m0D+JC#R!uww?mWsXZjQp<0yMJ^$vUoHfWcOe`;nDo?hez`(#?psS zZ+A1d9w^m!>Fxssn(-x{Zf6e1|3|uydv>35)IQ?FeA<(L{c(@)-$C=L+9zJHfB*mg zwOsQL#!^YB9*^#8AWa~Z-RE9R|N8%bw=*;#Zh!&;bQWsqOwhWi44=+zpo1tt?NP|G z9>n1qp!QVv5yvo(#y6k}z@sxlz^D78M`wY8M`y(cpU#RK|3$s~Sr|OKr-Aag@we`K z-9J1mXMq}UB^;pAb8iF#gN5w({rn7$`$0`x{+7d_Hl^`Nmk!&TU-%hZjSqm&U;qt^ z_^25C7p<8LN)7xipw2z0sP^b)J@|zmG(%h>%1!#^0 zbX{<%L^rG4SANj4AU^Gb{|~ets5kC3<@w6b@M1Zr(FPik{4aV3lr165lT%n2dfged zT~q>E57e`RS1;5nxPs=gY9P}sAa%x<{);}J1a?$w{{R2~9Xd=EzVI^`pL~({4AcO; z;b5`hAp-+LiTX}Z82uNmngkgu6nESS5_jk*0UHJyQ+m<&=Iwt6i_K3V>KB4@gBLy5s9XvevcRdg(N^r2)3@Qps)OSXM&0s^A0TM?sLkeOisK_i) z-x&i|e{CY%jUaIp^{-yP{qNa557MQ%U83XB-3@Awf;w{|{M#He(mD&%TMm?PfQHrX z@i8)ZbkBzLZ*G@fd9n5h*sc66|3OV750HBw^6@u+1kEINE&-2U`*be=ndfM+MFq5L zk-zl}ID_|qYwQ1_)&1bGZrR4jz~I^Kqr&0QI|V8QS|11+^#dQ-(76UYbPpcp1&!N* zZv6$-mIeHpH7W`JMU^Lm8>?GXwty;`7is)?koJIQw~PvZ^f&(K|1Tzd1Pv3Na5X*& z8nN!a{Fz^{L(;Y`+^sy z6_n!mx1EPLSI%fYxqfxbjIwdcze*in&0n~n%5o%NtK<$JA(8v`i^gX&E zQ35&x4RUx&8>mzOUGLcdE*bZz%mC9{R6sKm9?js69)kz8^H9oVdegm1?>8t=AxB!oAcyxDxQadb-O$1G{cyxPmbWiF4 zt=0LjDm?*d_3oK7oxI21^D`g@+C0_+5^2 zxTn2l12Lx_hECl`_kk9%Ld*l{;A*|?$nWyjfg?Z75o980{VOa5gXCEn{L`4A(=zva z!Np_=NQ?tKN$_9vG?JKrM|T@&gQG|HIgi!@9{jE+Ui7?r`~Ssr{&)Wyc7VpR8A>Z1 z`S%|Om0_Sf(Aff>we##g11hQ<91p%107-YYsDNe%KqZ&Kf6>k^XvqZ<1D9JMtrMBh zojtxk@;LZP$ff%fxHBmO8i{o^J^*Tjv-Pkr7@urCz(3_6cu3IV@D7k}kLDv5&@AQy zI`_z@(?vz1GX%6p-$#WbG&l@2d<0ol)A$CI{5^VeKohWAL48x-?ic);dqJg4_bnHG z%~k8&}EI?Ye6cy=YkY?cDI4z9je*4`zY9+ z?#rItXI_Zff_l09tu5@J?cN}N@VAR|f%<3}Tnr4o&cAGDgDSsvLs`&#x~$qqa1V|7 zhz_WS)?A_k>Y<(f|Io9W546bp`wi(!uEr-D4>2==Rw5mEvCZq<|CjG&KsCBtn&WY| zbVkPiqMe;A48E;zJwS(|9pImO=taZt|Nmc}lmV^p&g}$Mx_oJ_t#4hr!IH@!$u(dj z__`fEJXV4WLqm`5PEb&IfOb3d$uKZhYSP5M#dM-P7Dm-ChJRc83qQ&V{WO8zTHQCy1^m8 z3zRj%(J9l#!r;;TgNeUYKn4^vz6SqAceH_Omrw(+g57N_3@-fpeN9}A4|Ka4>;g4c z9S=Sf@a#V0!+qkvsB{+#!^NX3_2~9>X+2pY+3m{FdZ0u|`_w*A!Rn}epwri-)0N{jvt##n&u+dKFYo{Rze1qY z!LyqUsoF6F9R$%ED$(hx0``f9XZM*-R|TKWT8S6WpMW;mD`>k)bh>JEyQ*lr%5*|p z+`ShRJ1?ezj8x!n0d@01RcH>s>(J@XqaCZ!eHc7!)_uaU`*`a~e!qjA?gB2_t`3kfw2MEGB}BS?HJE*UI{hWO zeI1y6Jv#kmTECUJgGF6B{T0BX9G(6up56an21tQCq0#Bi(e3Kc>COW>9>ZOvGhU$E zRio2g0xT#4W-EZ%U`^6e(1XsHD|n8(+Bq4jo&C{#TsNWGc+yZP0QkJd{i zdMg~@26BTGh=L8|gX-Y|2{F09`|o(nEt~PR+lm7vPEaYZ>gR4C>&?Eoc`%l$fz&YY zZ;SId@S3&ZG2@G@o1j6T6E6JQ4ui(Gy#F&WbjKQWmvVr-(oiDo*$uM>R64wv?FO26 z{9~UX9}@T)TP^3WfvPnivlPm-*E*61>cJ+jEoGP-F%jXDJATi7+)M^ z0dd(px@UmqbUj*c^S6L5umYW@?hGxvN<>z0lnS^SAJ_$|K|H!ozhL+aN-whyfC}^0 z+oe}t?iFWXNNWaXA;wa1k8WPKXZ#HRMFW~xpheRhaR!D4+Zh}985sCm`^CXkh2k?X zuTh+V!T99si{J)rXaG1|&O^KuwCl}(P#gQqe^JvW76$%Z4Z8ZD|1|I9Lp_fD+10mv{f6iJwOtlzh*Af@1i9PN#uF|^bFMfs{(7{Fs}FF{>o zL<$lB*&m6pzekLL;l;~q-~{;MVle~5%PKLDi`YE63p_lV|1$EoW{NQ|ID9)Mz~2%t z#=zj%@|C|eObit6b3r8)awwc^0wp;97SO)7=DnaE4l{o%Xk;H66oMevwH_!{_Uz`{ z1?uN@JLZ5gqGLg)tBFT9s3v&U0AAc)Vqkm{C_U!bP?yb6y5F~(Z5PPNJ3vh;M{s@R$iJ-vG`!VvvfG=5-{p`~w+O=y(AIDwdTL)z#<{7v&jL5XW$0;tO1Z&3m9AXTA9Z>RzP{(~L| zUkY@(f>_{s!Q{W_p?Z*y_*;I6fI`>Rz@s;m!>79qbX+Q^z1-=_;nCd&GVlL|<{zB= z?H54mW^_+!PS6FlCNBSf1RgT6W`6g-^+1W(3dT|)&}e$M{5!~S>&sjJK#3TZ6a_&^ z!O!X4{~e&Hc)1r-(hwvGTJZjI0j8t~ND{PI`eiewD9cpa#R47dek#|9=@O z%)sE;{FkMK&9nJ$VJYj2wl=VUK7XqfNYC`kkQ}wYgn{9uhA_B^2pYg||H}+&B62V@ zF!VP6{|B1pRN!yth1kyY9Nb1^TA>SSBQ|w_WAzlMjVSkDw6`8qqClHn9UuSye|b>| zluV|AGNEVp*%wo;{|6N+pn)dG?*A`$f@Q%~sZXyjgHNxk#xYk=&c2%F(pjtVVyP$t zL-&v7AGW31FK%9b`+p|`GXq0f>%kJ47gpCn?P2742V80>JG}evVo}RbDg$j7yIAZ1 z%?On6cy_ZvC!tGJ__xPuyvVo@>O7qQO%pJ>fYt^bHoo-Y@Qt_sVeRVwFD1e5gS-CP zH5AwX76kbXx9gvafXeFb4=?yGfjUtq2)e6>e|xP)^FOyz1s97-w^FGWNADp!@tjNd zapOxb6mGoz|6(;n20Y*7(hZeiy8#;G`~NaVkb%Lo@$dit3=E}Qkk+n0NT{3dMX?Gf z*!Ww(yQ_Lb4II1AzF6=7JWA|~;pt*%luPaAd zrz@9B_jwTCz@yg{v`Jb6G`6)1R7vf8392bU)j25kd0v=5dJWn}&Ixkci>zC3|EIZj z)+K-%b&a6q(!HW-H(vhtv3|whS||WYG<+{u-~Rjma{90T{~K&8@AES-l!|zEA65PE zAKY>H2ujpdzy5cJ~A+r@Oao3faF@W1sE7!G+p@jzhQ?Icu=s_2h?*A0UIvo z(d`T#+2Aae_gKl$$iPr4)Vv#XjT=K9U-Rx5PzhSc>Uhj8gVC{JA7}`aq148++l|Ac z*EhhU(>3C_Yk&l36NPICs3iL@T37=rNJ}^zkF|kRGrqWS2OQa+-Pc~cy#jJ2xL?<> z1H4p$zqOqo)Ps_)0o9!+Uc9~l%9f1$tp%VFEJ&H{Y3&!m-x3cNIOuWkg}{t7{=6Uj z`w#L*|A$U8z9@!R0%`VnfCoowz=NYDDhe;c#NPdXDbEki_J9BXw*?J4^S6tD4D1!< zd<@C>JbK`ae+H59!R|cn3Yyel@acBQ@CA+L-s1x&iL;>k!SVkEkkDy928QNZ4rcz= zgM18-&cTaf1yDoF4Afly(R!dn_Qj>!;81Yf$mr93to!;LpHDEqCNWr21Vmd@CcplmZ6zZUX15mtx=I$=NI3WkJ>iS#?&M~lH7%>#GzKKXb5yFY-u^n({vYWgrSFqCkEy2uA#2&`Z!mGkVDd%+2DjjQoV zpYFrm*IwLIe+MmDpslJsyy)(5(hPQ@#4$w%Z?2X zLF?fZz!lSfbx=Tq1K6kAqXN8r4!r-jyB9S2t*Lv!ljCtWK$G3!CqMIR z9q4vd`OL3%vfEci``~B(NRZ5Del1sn&-@WLL6;MN?o!~7feFWa=8ps2P65*SnLiTB zbana654u+)=E7@J4@joM(h&0F=yWytFS?@)JfIhAkj9@EYQi6Vn?L%JPxtZ9{DL7W z3ZT73=UyCDe)pe$TPrA}95*tmF#2>K@4nmt+6mBo?!^zqcmKPga!dzbF!^*JS78L} z1F3j%6D$py@?ODMV$|IVI?|gz`~WyT9S17|-8FIGGk+v2(>l;{96=Wqg%^)Oaoq~m z#Z;o(-TDU96b(P%2%dHTTkp|*4yqBXVG}|FONmw*e_ku-5PU~)*PTE509*@b36jE# z7KCb!5*3i@FQ6ll!Gp4xs>9^p{RgKP{?<*OL2G5PrWr<1`|q?Wytgrr3!X3Fh2I1& zP~j(64k`TJorV^Em0+cA5gwM{5jXx8(6H8v{_Ef(#MStuZ}&0J?yE2OuKoZ2(if~2 zoGRhQT7t#Qpg9**T*6jjI45&6yl{iGR-m()8lcJI?rV*|LH+1bVg7K?Diu(%`Cjnd z|CjGL!F$j6VJk0Q+ysf<-~{=_uG`(igMSxjP@I*Kf#HSTuebj_tdH}zf)+ZwnDFy0 zY*?AU6||8E+*y+<162?Ft^2_vxh7>S4BaO{X>kTdi`<}uh2e!a*bq?EF_hY-@#mGA zr19s~8hCcgK}VRYuE7EY)O7?G{D@hxSOHks^g5_v2Pn-j9BTj@hHR7_#HbS97rNK} z|91qBxxVIjp#W|b9e@m3gVw`#U;oT6SOeN^apDEDz`Or1*8PC{uoN^F5RO}d}aWnN3Xpk0ZjMVYJ zTY+P9T>&G1s~ZO>M*KkIX`nKOU(i+Jzv$5-P;ZsbqgPb;!pr~NuAu2+ZC44$9iYaz zW2ajQWb_L(mecJh;n?X`)9t9h3}Ur`h73U?J)Lc!CQP@Z3bUh(XZIP$&Nfg#?Z2o} z84JUUxo6(~e|ZLUD^znH$PouY!@s?v%g(=qjQ4ykWnp-^1|$d>I`#ndxj=i)*!Trq zIX?3XcvyVq7jUrQ*E?9nQOb7Am4Wd!tI>fDR|fv@Z~Xcni#Yl9KkzqaflTQ2mH02J z1NP9F|Du;mSQudA0^rWLR1s)m?EkJ0pgkb1w;j7dF6jQ?z(4i)f6>2%puy^Mps|te z3ohNq|BG%e1Si85CeY>Et{mE~65X)^+OZ1VwIbTJD&4+3+P*R_{M%d^I%5U2Z*%>#`Ed?5FD&eT{Qu0a^W)`u(0CC@M>SYqDVVhP0G+sE305r-V8gF}t&ERf|5O?0 zXa2~`{2GT|7k}m#2(SQ&m-FjiEGzoVA9v`*6FZ2Ruj8N^!3sn`3i!ba4#O1Kg0zE; zwcyu3^?E-LOmR{`zAovs|Npkq+_Km}3)I%%?kj1zw*71*NECH#iA8GP~7iL&i`$T{*gaIl5g%m``gT@AMS_ z>9>LD?{*c@J`NJm!mAr>L$@yv^Z8C+5pa3bRfLw1F6M&#-HA3@+XIe>{45^JBOfv|}ZFdRa3;tWp`r|3|;EJNR^`fAQgWJqRAZ zdf}uD8d%})03G?z{F||!&5>W@=WFS1_cz+E5}^J-uQRAKZ~(l{^8aW4xF5~`AgVrs zRDIBPl>zk?dfgDJKuZ%pd}C)SF#)w}4KMuv|Jeo99I)`{J^?QE4Sc#!gNu9(-|nNH z-B&>EZU%M+h8JHo-u?f^&RC)Y()i;%OrrrzqlQoSY2WUnV7&^S-B(_u=zuh^Kx{e= z*MQe1MvzV28t?vlG#@wcY<|yJqSjri(jBYt@(5_tLt`xmD53B-fm-RHrbdF&kN+?2 zL7UUNOAS1r(nTB~DOV-X{upo@0oMHM4lwwC>810V|NnPLHcK+Rw0;BX4TF}JfM+Z{ zL6gmPIp8uC(j@>jaVJ3fSB~A+!SZrBEDXI7jNPX_m`}d=s0d1kpwk;lVq8G$3J<`P zea{9Zt`a-YxjC=>L3<;Pd-RI_ECD4Z-d81{t;5h$jMmD6+{x$DeZcsVNB4~vdpke_ z45weTg3UhvqE_+8f5-pFU9A7{Hx+`%{PRV4-LC$yUMt9IpoS^|;`j|C+ejD;i_w((0c6p2bQw1`SF>=u(`;OCcQILBP^h>h zgN?W(Lyfp3!%T5WhHc`K441_v89s1R;$-pfu$#6hcl0ipFlHrS{BtxaPB*RfHNd~YTp!NA63>s=+ z@*QRNX&A(h_d=o+b^V9A1q~a+~xKFH0~OsV&KTX{m@Q^|KJl(#M6`yI`VHjmG=FH zhx7qeP?7J!ebA$qw=sa5p_`=jMKkU&t2fRYaqt}DQ1G)+dbgGI93j+gai4O$ zuY^nYvF>aCMZ+K#O1K)o1zpz#I+z8tlTZWPle^&4nFH!;-S{u623L0ys_p<-ok#a& zu%iE>EMOI<|BFtJ2laU3JsLq{d=9Ridd>9$%%uk1;-F&+`M10C@UK7N((Pl#;nMA5 z#nLTe1u{_K#g!$0{yTQEwH_#8^=Q3alCy(FLQKq~^|s@F76mgg#~q+xaO8JA?$LeT z_>yBM+Y4bAP*@#?dg=R(uYBIZ6CYAXKF!?RN!C#q4^kd^RqvlhMn##-H;gnegm{v0K(>9 z&)DfM0*Z?Nq8s8sUh$Ri?LGq@5y(-|@aVqo0bVVU13DK~9IW6xsPp#Xw zpn+o7qZ_hT&7<{Fsia3Q@9Q9Lh8NpTyart*23i*t=NJ8 z`k`Apz^nWnK*wJNcyw<9ndjPivMwEzgA+V^BX~e5Cd0A&Cuo^Ae0{q|x0`}XxATwg z;4d!S-hVv0{UnaNs5mGvoMCY3bWySB3{f!v$6GfuX#D=a=xUJVz0m?5&F>jY4}x~~ zWq@}!g4Z+#pl&t=t!M1SxKBv|bU+jM7^q&GuMn^G@Pp=&K-o_4#ViTXmeUq}kO)Nf z^own7phgquypCr1XA&i^BRr{b%_vsh0=AhU-{X!LFX?Ki@L9ZJlX#cE3XX_7e%RNU0 z^%z%hd>J(CbO6-}9^E$~=lXbbcLsozch;ylys*0qTC)dk2d29kpWG!1>i>cE5`xE2 zz3wtH`1G=JgmHt8UD5!h-d&vFlZaeY6db|hZJ=hN;9W-0GFQ-Y1JHCNNJs!|Za3JX z?&~k^-T_&2`o%8LFmHDaWCt{IQb42!h31_g-!OP|e>~O*T42Ud7X?Zd1|GdLLBR~# zG;IMo8MsEpq5H2#H}?xsanQ*P+8({p9RH77?*r+sc@Bzf2k`NCGlm z^kUK;P*W8eUhs4P4le~nc$MgSH17m?fuThC#d=UPz8m5r>u%5lc`3W`r5Buc7#WT= zJAy+Py!{sJ69|D}o;NJ)TThnQH|%x-=_=**=spe38Q_U=52)EZ9^I2c6WA|S+y)07 z#17C}T!rYD#exhNnF*A9I!ja(;5CYZ4`@a0BaiM=4o2Tzgx+RkfE;nm-{Q^)S~+(T z6siuO#f+Cg6S+aR8Nuf%^S6KwWrrLN9q{6$C@9T=(g%ObH}K&Kr@`%g&{?nww;35g zebZ~8vw6GEz1R!hxW?ZCI?AuxoyW1Wje&`QVFwFn=&UnG#l!e*nxkc#2NMHBsi*O! z7x%yihnCoN-|hZt8P8E>IHCJ+w@#9nVp8LHq7&x$bz8*4v=tpSg-yLEGsVy8U^KFLfXM{#pA}_sj0D*7+R8 z8qo75y02+pwZ2>|2^x<*=hE%cF5$y``~};e|Ns9Vvo7Z-y6@S2&S4wlizi&5svW$u z>imoCBA^hcQ3>z_^`p+b5V{45j~EpPhn8=p;C(2re?bl85*5hlwV+iKF_0=A6u`*) z*PvCsf(!rlouFXw>Hg#h+Kc_uv-=#RuLhohe6jl`BZCY7_7ldpT{`=xfFlbu;_lHo zAGFl6`zmN9`}CWP3?9iJS`XA|S#B?2WMHUO^62gdEr58z3UYC;AJYpS5TmmlB-ja7 z#^QrdmhryDE^GRW^HC>Fa<^Lw6f>}~(^`~QERhb912>>51$e7mY_|Mb&Ld`SB|0ki6uEqyElTYpfElzMXKAF}j;{kHy${Qfx zzGywb-`55nB{};-A9Mj8c#CvNnM?OspY8)-O(50PH{f3KNj}(mvQEmQ`!v5i1OGM_ zzJDiH{4L@7f7s*yK~L)wHE%qU4|iYov_4R)nKprc8xPyRliv>hE#>+TIswts`asQV z>&ta~+Ls|g-#L8_sO0QE_hO+CC{>{Ez=Pa|2#I`9e(XL1+Pc>G22@(O8h`WXe(BNO z35t0SOWy4V_!(R}3pji_3lv;B3nWU#yAOHv@~$|*4{j(n9sy}`1n<7zq5|6V#J~Nc zM<;IsNSno07e)q#679x+EG!HRrOKds9i(Ij3kw6g$8py91N;nNCc=~*EG!%kKrKK} zWdJ&y2DIGR!}>&t&JGq9&Icft(he3DE-*`C2MY@~n8mk)g@X^o;%}7#-Ndv5w1E+{ zxz6Cl-)o>y=5JvF9YtfgH3GC~qxCB&e0o`<{2?_4XtlEAP7n#ImlZ%~uNdqCm3lil zSwM3sO_89@aZLOzH$bu4%W6cVJ};O)&<+ldUREw5^$9`rmE?HzvOe=8&W-mXz-}zD z@aSbdM5LZo5Iy{@pe1FX1^S?(9K1i|1;;f;hVCDra`Pl;^U(PhX#$|61UcdqG(p)t zMFp^2b5d~@vLX%HH<4*<#CKmn{&@2Lo&CF6#1EN`2N=iU9 z18YeRh-PFhNdeJJtR*oZnt`n(1hlqr3jdG)KAom-_ws|zBI}-`0#0MydsM(_tQ(Si zJrHTJ@gJy8C_Mr)gOQ~~07NsffSSn+49u*hYr36yxX*R+&fUuoI+wANb;e$Ph8Oz$ zKmK>KcJAe8cs&PFy`J&uz7re{EmR|n5BPNd0yX!Y6&yRAB|N%+I(9m9q;)oyfF`>N zLDzkOXP?_rI`x8+B;+VGP#>q$M@0h^ z_@I#U=K97vRjr37?Q9|sdli3Nzy%);M#9ptO-_6o2;y`Vw^WJrJnc;F2* zL(ts>T1f5De8}P@wF<8@z16V-Ihz&iugFvn-(dc$c@Mu2d01}k>f54^t zK=TiQA~sk+gG1`YMJrGyYHvXGR(k=Me-7kDNQilKU-Rrf|HAhYDBjP%hyv}Cf^MIV z0QGa?ksGC;`da|h-jo1sS3)!lUwL#lfx0Z+2P52Z?qzXMmPAK1PwLg~))y?!`$InPP|xDDk{l50<&=(b)_M z^wTfavVxjT=U=?K01Dg-9-YnLa;*FOi+doE=G`DJC`Xra9s@g>;k7)3!T4e!__*%V zFHVBZIQ?QGgzwRP{YBarQ1dEA#RBBH9B|h`0WyXHiXX^$5C8U=;A*w|XX9hgs<0P< zVEyM`RDw>Q-QEt8R0T;`-vDhcJ^$k2Cy1d2kWhjYD3JaJ;|9j#ji9~)s6z*@%RwqY z_Cb%v?wtvW5RdMk4b}|&;8nb!njMr3I!jb6KqoCbfD#V47cA=0Jssrr7kAGyGI;c^ z2kCsx>;Y=Y_JbnB)%crF=XOvu`*dyxDFpQ``CsJKe){jzxgDg!qx-I7_cu_i8n{?) z2f3|I-J^FtxI5I%{X&EbRQ?)+J3z;*!SXfFJ$mPZECQt#3zrUKAMjD&-7&DktHJ*1 zzUa|-5M+uA|F$j;@XGThP@BDb63C91IqTn|91src&w$sPd34__kpPv8y}UXppaqvN zde^=Ef2g_T$Fiq|McjF1U5U^1K{p}N3W=Bx8Mi*&FI_^`7U7=zVxt;pS#t?!W_YRc1-APkYjxBcl+@$pE~Y(98|J&`absT zoeCOL@#ytEe%$pmXh^Zs_52Gnh}A0m0~%KT8;U12XOdUPXrBgl<4_%f*IiHwMLLPL8r?$ zg1p(;2=XPrU?a#C{DO@jN4Ru%`G5wkdz);)vvikUO8ol|FEbp1JsRJD+JMFfKusA1 zkIqJL>#F;vM`vRKDD-!LvM#9P1bJx9DM%|9e9Ubxs9Dvy2i%l=vA7&mbAb{o1JKsv!1yG#&xD9^NE?lz$%GH$hv=+WlD=e7X;KST}PB6of zfBS_UpqeI4`9fOrFQF2C@Bm1fi}isL7NY~NnKm$XG=qxToh&SD4~!4^SRdq{dZ4oz zJRk@zHDR%H<_u^k$D{ELsEH5Sm+hmH;J5>{ee#8~E@-Ov323sAfq@w`HfO@1z^riG zMa6=_f!X1>i;4|H0&~KPY!1-c?-wB(L1&wRN}*C7kH#Y)^Bm(GW55#vpi&3aoCJ-u zfhGk&wE?Jm2r899lLC-(GDpS0r*jXuU*ZBfYJrh~fnT1%vHOcpukA4#ZU)GCD30Co zpv_32BNUo{`|!6+f(%`BUp7AZBH`fM|NOfi$niJTfKG2X25v#BG<>_!eN6g)^Mm@v z=L`=R7`T6cPDR)fz{0@4?F48&3h0yzNB-@(44@N99lDQ#&MnnY0Zo&F4y$JPb_3L< zOz6HYbwH(|!$qZ_`{=Tu0Ga0C(JRUo1}@7#7jrTA_44?F20mZx`v+>%fzyv>a|H`S zDXU92$7?pnoqxgeOxurwcDtT?5q=m{M4o?9&-CN}Yl$@eT~GOn1VIOX@WWJ?9)A1Z zwe?9Q>xj1Nu1;Q9t!=z}YrZrR=I`58RAe|dC&Z2rwsD&x`3yKp@}!*SO6>-j-@ zDi~fwt$+K!TXxENeumcDB~m`gpiy+U_52K;2OqF_^zwSI=Vy4aOqqq@|6z|#Q(drW zB`Ox3vPocO3~2b@Ru05&KB5qR7;?TrC+MJv7av~y2epoyk06~$0LjlT-Mq@{`9VjS zci#j}LP&Y^vR+!p56ax0mJ%hx{||XK9}sY~zF6}CcJzWz@*%K`I%`x6JiBWcI9e~2 z$a-{N0FB?Q<7armtjxmT(J9-rj-SD!)3z5xbsqlV(fzXVS0iY=)SrJ_H>k(Za%Yhajc`7m*!7eQUwVPo#mpH~9cCgqCY8;l_cd*zD>O7QObFkP98pJL+3z~T` zX#B;?$iPq@Rbt=#DzHSo@fB$G8|XxD7XDUHj{)o#&&D61;SC4=DaRc6w;g*u1vD0r z0dB3=s2G5S8XYV)gWL^P@4!D5tng*V|Ns9RU-5wok(OtS3=GY$82MWw!B>G6g9KYy zL4EY*1Ajf6e{l1+>w&8NUS7V<&;C1gw={n611(%T`2T@N_vsgz;JcHc*1hBhouLB> z9{v{aR>y9T)HX(kj?D`h85lrrdie@;R4GgmsI2nnK7FhiB+URC{4IYD>KTBv@ozf@ z-s%OaB~HK42OoHF)ua1#_m3A%@BjaA{LjL|z*-(uQquSz+~-ySi7>I0$bk6ZzW09? z7G{j(5Mn5xVJHa{rl_hf6%!=plIN4S31UG*> z!A;*6ec%(5VJ4XT{r_LoSCYZXSCRol|M!t(ko1#e0MU>9BpF~BBnHCizLE@({O!>_ z6I23#cTs}x(KrsSY#Bj&Hkv`z9O!P17Zd(`{|~wh1Kcrq@d(tn?iI}zW@Ffy%D}+z z!f+qxfNs%SmfQ^BgW_H&Km=}r1VG0ez2M*X7Ixyr6%UjXFIrc^PrTR#m4TjkkqwfW z2wq#g04f7H@dDI(j(+L05?lWZ>K{{2=Nwgt`Nvp04D_Hv4o2bbkS;_Xis14EQga=LT9x#@|u{J-&F43aEt%9x3`S zdeH-Puv+VZl1R{)G`Q2-xkUw3m4OcWg3i};mVidwd{hiT)p7u6Js)UVp!+)13{kKJ zki)fDYc7EX!9fOqrsu&1c0+9RXgmUP73jPVEc3e_;0fLrj-Z9e-EELjoogQ5dqGJC z)NAaH;CS)nEvQJi?9qMxg(mo{lWU+9E(a=>K+~|0aS01hPa8Vug1!C&TXplrHSk0t z!m8O2t4@1#S8%-O1X~5pgn5raw#KL!fXpvJo7x52fRer&c7uzs5;2eN$)JD+rH|K- z|Nn;;ZQvAzGMWLsj}27yfbSzx;NSKU)UaI#UMz6}bO=4@-ZjW^_@xpr^1g!H0~)6; z;Re-p-RECO|9~7b4Vu9Og#;)FAXCsU3zok952}Ardk7xglORFd3Gs9g$BXA5;T1FZ zycEd!K#&7cn%@|JPDe5D>CR2??Ec}=8SCNE9ckd%eb%$vmEnJYhD&$7gePLfE%RZY z%nvWXV|wl!9^DSeTc7Z^fZC(rmAl{xi*DZt6+l%?NI?*$NT@HOZN+Yc^3u->)M1OQ%CE&{LQmKL;t5edPO{adPSyrcAt7Nft`WD zwVTNWbi~AU@NQ60%WBs=P&R!Hx}~<>(fV$&jcd0^k7ut)PxoPuULFS*YmvTEw*QC! zAAh|Vbork*J80!1crz)3Yxg1WlFoB4N(zE-+{|TUOEU4vv z1(ZEH_dq-Bpp_ZjdsILzTyU;pM<`qjQrOK77LGRX>0AOnd>7RB0G)~qI<9F2c*(&Y z@ckp;NH0+_@L)a+Iy=+@RBQ!!XoGG-Fa}M*f^Guw(aupRaOqBy@X7oENe!UYHrg&K z8K9mG=!^glZ6B3{QdUs^P#4tI4L=Fmjdap+Bcp5g5f9J|>v@pC0r2^ypi|pGXCCjp z3u?E2D@oZ6syjS-ZU0zsGwfprjdsg}e9hp}`ng25HAcn2wfl$*|2BS)?yLM$4|sN; z2XCc{yZiS4#lxV>1DoG5mR|PgZiQrpJt|-qb#GAt?RD`u?f^X)bqn}VV9W_$%W&fYoEZg_=i2a&qHI zMLy_4K?iJk)w7$?6LgMatOqE^f^+LhaHN$>fZ{Ck1tdn?Ib1qR1Ca7)FH4Ze!3Rtp zy&n7?)+frjJa!@$(m(v*(S7j6-(8@b`p~1dM#TWMGPMO1E*{-%KA^Vsx&HwbF5M4W z50rAf*fR6&|CgZY5RYD8hZkZ~-~M;$u5~cJ?a}?gwe^3UmrwV1aDHsCV<^#f=|1e( zeFapu+p>VpDJqq8?Phc7KHVJ};Msi^9CIeKAtr!kjgNUYALDVfzF%|5rMoo1we?Af zsYmyH&+ae$@}QyZ7bloOS&$u^kFP=V@!1!jW`Rn>!#p0n^*kP+=)Zz3kAeCF5~1PX zqs0?Ya+d)(cm4G3{(;Chkcn_uz5(^!L5UEQUqCAc{|9KecGpXI^xB4*aWi-@9|k8> zXz>V6z-bd8N%c5#QauOu@a9|Kq}p502zKmsXj=8@-U6O>0@bu2yI^S*RO5mcoO?7M zNpOshhn5zQ`UTRzfgXAV?gn~vGl7R6K^O448a??RAmP#Nui?=fui?}E;>C{0AOE|< z1w4B51ze2}v|g&y_UQJPfQ&DIF3bZj`m;1B33vQ|z@zyfhl}+g&{%iA0LXw{2H=vS zL?r;cbMVFPPv1d@wt}*Gyhn1l0LUnhUXiPy7VHbX&mc)qf4)>4Q~;j)^!@*93zv=r zS&&hVTNqy(cyzOQbf5blz~R|x_QG%9chEUH5{_FKeLM3wJd#}*d^+nTd^=5!|952o zjjsoQRwIc=f`&$8R3aStw;cfu*@MoJ2Q3VU1syvEDM-P!_n9-k-6wpyFM)1CbovIm zA_%m5_kw5lsh5YrcX~Jp7#{%LAExTj?Ii(PN8!;e2$}?A^|9nC;emMH(fUBmi^Ip9 zWEr9D8;Q^`NGSIfYIr2S0*5r;i=>Dj|6AYkcl-t26`wD_-wWC>>Cx>j0iLME%O4jtS`^SqFScJ%cI+w!2b8EFu6A>75D^fh+*z0#|?n zKAqJH9^KxcQvpj5LK+_3+z@$>Zf}7XsUJZDDW_k=g6Q6I4Tw8zUUd5lH2-8Ql>^1n z3x|*2|Nr+F*vtqDSO-u*gASDScI%8}m{bj5&2FYk9f@XB6L#DelK zWIoE(_@ra^4VUg)9^F4%FO|qc(yxE7h^JRC&-53I|NsAQeYix_@&7?r>(fQgA>DNF z-~i-;Mo^m%JcI#FDG&-|z5r;=q=QFyBd7u8VDt@C{X!4BEa3&U6l1{akR0L;@3H_* zserC-fMkYs??J&1O7A7b9^K6#{T`h=Kr_HEj6qkdbh>MRGDWOQsy+4!>|p{_!7V7wEc8MsSI6!eJYu$By!S^QH9f zs<3%{e+=r&dT8JBxcJ(G`Ig7Q*PI^OH$6Jz4ImAGZn(E0K?Nqk;RVSJkUk(dH_Qfk z8I;URK*_SRM8&}P8>shW;n5w;0m@$j9^H(NI|S4j82$%jcytzXSQZP^3GvH=hlozU znD*!Yf6HQl`j0Qx)W81k(P<1z@SHDRhy3{O(OIkkYJ1ne0|j?GB$zjV?d%4%Te?BF z&qCrBQh$O@A%w=KM>jY=K;_|!^&vn0zu49L_P?v~6OZl>;PbB21^D|efx4!hF)A6L zTx;M8It#i)r2t%?d3481cy`OkyI3U4lp4UZFONreumC6v*K7i1SZEf8i+<~P`~R4; z45N!hvTTWH_f=5*ZvvfTe%7=3J;zHIkbT|G9Nqp3tsWWtEhZp7Xz!Xf69dDyg9`jD zzreA|4;rCO@aPU!@abj-m(-W|TegGCV;>a--|iETiIM*S8m$K^BBAbeQAzOWKI{Wp zMGU$|`8;@)(2FVHo`$yqtjusxNdV0sBzSZ>D?m)~=;rt7<_0A{1@NssV3iuJ2P)Ut zGBb2Fmt=ty^!k8IXWj*xj{z%CXgyF70JhD+utnKstlL8ZH*gKv7*H4PH+HI*bBb-JSX$AmG!Ptnm`Gh7z36 z8Nmv`;nU3x>fa`STGtAW;N>HbKng)}ss_YrNcda~y$R7b|Xyd3xgG>HV7L5E(A1luN|0M98aK;i7d zzYTmci3|U>4WI*dJi2`~UX%v@`0vQS?btWaKsD@BNF{6Fr| ze2l}oR-k4ts0Zu;@{t4BDO`b|axF(C08}!AE|&q_2@GE$3huur7~gj7zL3@#qY}`4 z*aC97xSLqTvGCN#@cSqoVKvbUYQPiH0)%%#j8;N6r16oM0 zk=6-{wB8UEJske-wru}7Q`_CaX{@* z5XT7NE|VAP;9E08RE$987`%|+WMBaAwgHuyx51aF^S6Ko)EvR*@q^N}0!RwfHv)Al z&wv-GgK8O&R02rqD)>Tl{+5j>QV}4jT~MiM;38@YIMDWinyzV@L zR3bo~t4pQ&j^Go%;6_)0^_N7!gr|V}pdgbIK({}D&nX98%F=S6#0;h;1ayyC%VCdhZw^q0h}m1hqx;&6N-h=#55{TR5UPY^Z*Rg zA^i&uQ0|3{UwO1%^5~VF?+Dr;^U;If^%f|eesIEeW9V6d+JwCNR-pA69*i&EJpxtG zp!QHHMku-(A4qetWGLbF{C~is*MTXm*@B_;vtKU@=+qkq(1x4tb1!1S19|89x7~O# z=^4nZ5)}(*GZNaAg9HPd1eG?B_Mu0&ql8cQAyCulrsww$9^JoQ=re;Olp7ME;06M6 z#DN9iCP5e=^C0)fg@!wZdGxMPNdOIFHogH({TY8t>-14E17&XuP*yVoC29*$XsM)i zmZ+G3E>Z#ACGNp-fWZ;6#K*s{^ zkOF008Ji2azI+=R?q-}NAFZH)qVa2XzU)8cV)raA$b=rDGoIN zGBgApWL5bGG4m~W@eSzsbO+D~E~u7tFunx7aOJW9Ijt9-wLHw9ZzLqyCGoG-6?ZI2XyCJ%2#gm1B3Aa&?*j4EP8fFYj}1S8+djzFB~R-MMTOv|-GLHLuU;N@PfNaH3s3C}kXzQRFL;2~wf3@D zc`_gH1l>i?_oDLg_x~Qp*+7K|=tR>h5V!R}iMB^4n@8*a5;>3m=NqimO4*JvsCoQ9 zz`u>#=se05r4P4H^T7?j2G9pV|*f|FHb@)1%u{0CX6= z#%|D!WFC#b{{R2?zl_zR`_}7359`ZiF&@3M7#J8Cz?%*K|9|c7)9o$+8U+4+!NdAc zvCxaS;_v@aI%1x^G6EjoFL`QT@M!!6(pn_!VSTz-A8LX}<6)4XhxN@e8INv%4$vO! zTc9$f^+3sXk4|?EkIr}jk4|=Qh6e9AgDzWyL>~Bl8;|BU3ZNcbw-q$!dP^>9ynil zfJW4I8G|#|>DT!l&HouoQlq{Lw8{Oof=BcJlp=**_c_*%3bhiTRMvg^HJ3;0w^D^&M&Nld z2Oa3?te{|Y09AAzpnD195Bqcmu}YSeW01UUmo2z!ObQ9{ha?ry){6`oUk_Z@iXiKjcKKIGV|}} z|1WB+0rG2%ia}Z@J80quYBD0ffaZDTft=e73Xl@{T@hdxpZG7@paRl*-S{M^C~ekd zVQ9Tw%DNlW+DYTj1GiQTAXnP4E>q@aKr$TEo&Yr^p(osjgC=fXcr?BN-~W^Br~umj zauZbjD0u7)g#b|y*Tbj#QTIQW?tdQE2g^iX+{pj_-=pyeNS9+gs5bz*OSzYK=OtDK z(9kBRNA+LyG}w_RJbFcUDseOX7o83AZ>Nh&1gOR007|}~kqkbM;|D=|yZ&DQwKg0) zdU;nXaf5d{gAPUhFB%KgrQrkKMg-c-b>$^9X!fXAbfFSAXjbIEr~_0HXh@?}&=a&u z##RHgYx&B{8=#(Ww=)OGE^d$R2FP%J1&0Tyuid~1YIitGc=U>HH3T<2wi$wwsR!eW z(p#V!)ms2$E$F($7aYP+tI49i;FJx~}0Dblt-*=z4}<(De?#pzE6z0wr7?$6Z_g z{byi!Ew@4e!UMJYUkj)>d;@P<2Q6pv=yYxINOo56=`5Yn={g5A*94k8d$H^8_y67A z3O?NrJUU%7T)Mw?magdj*I63SdXm3y3j+hgH|B=!>MxTe}X!RFTh(d zSiw_7CtheX{P^z+I;cZ5(EuE#Ne0j`RlNEAzh|e53X4a#vj)g6#u9eNZWfhJ*A?B~ z3ZPmoHNz9U&Pu@gCx1^UC}VbmZ_F(X03Bx6nYsYHmN_&5l3ww9^Ii4y^eD{ zl23rV;=z1!Gowp)$q5#hPNUZ)U^o32-K`4Bq@Xz|NvJ~%UhqR%7B5)AtlA9U)^BxU z9=-7_pke6`x4-}Q=#A#_1kFCY12r`6-3HZnuT32Hfip~ZXvAhlkR|*e7l4}1piS-k z+irjc1R_9boE>Dl!~YBX+YW;!hd`MKG$R1YlIS@WQiy@ZX9PmS9KkoZIfjE8s5?N- z_{KM&3!p%kzH4q#QD6q0K9Hi4;L5-K5BO$x&`mI%DJm5&e18A`&#&=u#BVunhR#;dzJwPQAQ=~aof}Z8 zJ8~dBb0>fnoW?-qUhD)NvFy^BqZ097)LoN>VJGOY=1v!tkpH33+u&r;98@S4wYKQoAC zbKK8Z4_eOoUv!NeX!+;K} z+fQPL|C=Lz-*Z$l4*p{9KJ@?4!58w(haks_vF>l@XXti)(8;>1ouA=_=O56djGKf< zuV|eP$P(Uq9gy)Jj4$l2e*X_zpW>pTz@WnbSr7`@&J9_Oz%K}zE{o>4x@Bdx8!D+*}mq)t$ zqPCBUi%YkUii4x}MVD?D6(1L{dCUj9_kyC@k@-@ZE2tIQ?V}RHe4Y7XFAKj5^9e9{ z0n|@+0QHPLoO@aHT)IDWf*s_-zrIYtmHDfq^)(lM-%nuueBCZ80lh30F4hNJ_~$3adE>As!@y6sNGv->P) zl;(x}2XJS`6zp!#?z1l1E-Ee_-EI;f)u0BOgNyblP{pVL8uC#9DRX(@1=du`@7aC! zMcmi_|BVj3d!;w_{YN`SC8GNv|9Y@Lw85_H1P7Lj_6Jb;f1H5p2_!L^E-AQ2iFYAH$bVA!QAS5Ne^ z=#EhVooWU4T{pNK00&9W8*q>~bi1fTIQ~E0?We$e*oFB6*ex!gYQY;^Eu^R z*FdGc8@PH`gIDhk9Ixd-q2urcGzRRWlJH{MHBdSF@*ubc<)TvI*&WK@)5}}`1yp|> z05x$GK+UauMaX*b<{v3FnjXo13Ld=yb3Cjs)@FKi`)T+xAK1+3)ZKFM$WM^Dy`bws zI~iZ6csBnKDHZhS1`BLvJkAIzt6%&2wjL$A2*QGl;9{(R|<> zXf0rwglF>)Q?P`QBsarr0gqnZOb~ zh7?JlO`D*bqCrEJv5qlu@TpyJ0S{TP1G~`(T)sE_`TyUe@l68@1A}j}qHp&P&{Bm0 z&;c``l_DQs%wz!_{(fA;qx+m^_jP`a4==>QJHCGScAxj?ZN0z@y0Hj+d5{IDH_+>% z;sHL;-$lj1qt`_xz@yVe1w79L3WpcfkX>G&5tsyF28Nc~{4EB|3=GD%K~2R2EDQ{m z^E8+l80u_||3l_a+d$Hu-Pb$84SODTpYDyI1O=M@t!D)7_~378W@KRaf7k;wRt?r% zb8;7`^$VFp%en$e6QDIv{4HBR8yNTn*g^gfWN_pc@E710^bm057jReL7j#eni5U2F zW;h&o0PXE!0If3-^f2(~?gPyUfwon+3h)cMPT&`GUBEBsx`AKN^#H%1>ji#6*9ZK9 zt{?aXT^U|@f)-_Vy3PP~!=gZ&0DM&(cepS!Fubt;%M3bn6QLZ|Bkeofa69^L0YffN*UgX8BD$dRA<1xsJ>Yx*AObbaE{S<2wi87uH2 z2Nch}u5Ua+lSt=YoaJI*06TfYiy(`C|3SGo4OEz%05x3;KtlpAtaATB8*~lg+@Pxi zET@0}{}L2j4o3eSo9jH7_*+36OkAv&fg+N>*PfAq!NvMe= zFFu1Atv8q%82&SWT5$z09$W-fv|Cg_xdhaR0p(GT#v`DN>lhDN^%aep+s}aSO9S;i z6hIR{3gCMUL8FAABVr607#NPZsOT_)t~9+O14?2(DhePGkgPCx2`H!(+$jUP(h7P* z8ni#!_y#lz46WKTKuRIog+LX$3iSFq&+eNbu8BwYPY?}0`7s2R;!{pO_ z%cpw+XqlgH>!lJoke3~dFM-T5@a#SfK9;kT1GMO|^>(QpXytH?ip76XPjD*ue`4}-SxfR@UE4#(L8UPR~F-3L+#Iz2|OH9}8b04Vs<=ZP|KZ z@duRHL9=6Xz;h+9#o)TEPnU3lMi09K1pZ(8e;hOg-wToiISnCx6g*_<1RBWhhWNsx z`!MMGPmtG;y$ih`Gr*&}3lu=$;?+e(!5Dl`Cn#NlQU>@uCeZ?Q3H*Ucb|U|a1N9|FMzwhLZCvgQ`w^zytvY*GnoU_ zC{pn0OcwCy?F4z=r!!f?r`KDCU%;^eG)wN&>ny=9$iOe)IRR8B@e4RE098r+0-hWA z1w9P-1so6X3pzOP3wU1O7xW0=7jS&QFX)iKFW~rrU(o3TzW^t{AQ!)YqX564lK{Vf zrvksAmjb_lqXEC5lL5bgrvtyBmxD*QV}M7eQ$V+4gh%(;PNxXZ?n^G6$t;fDO`y9Z zI-NNjyPH6f+v&{nLV**sF0KU}0zTcRJwS))oO`j02Xx|H4|rv`Z|lhtUa-erZ02BK zaO`CC>7Jqj8u$lgK&VV7s5R2bw1M$8lM#5392C}`-O&o3-Pz#nj-Y{ZP-`Uyx*iJ4 z{^J6VZt(1?2dGJM-KYEGi^+dLZ8diX&;mi@|DcA31E^rP*bQoBfLI1T-Qcwepc!$` z?sMSj)PInX`0;AMk^YmR4&1!BZmJeBfX655_Xl z){`ZIpw#F9T0wqB|KI1#>K$k(;K5w zuz?W~5Re&zc*i(c*#=6m4$!f=Fi2ng0B9_-@r?r$s95poe&o^p(WU!y_ivZ(-<@+C zK)uDe6F_y3Wuydu%V!8nfxiXRA@Hz_)ZlNq4-)Hklkn+n1uN{G3ep8W77TpXMk{E? zEvRi(d>T{{oqv&i`uqRxR*)i(UY-LU2Ol!O$N&j}FP8)jhaG&#_96_d_=hiOjR~l| z0L}v76BfGN6nr2TQG#-w2IxL5Mo@e47-+mp0cvmak1GC_wEzD>?TuDJMg|5;uwVGw zK!Zr2RmGsDHDo;&fB1p!!=O^a1+>>%IY5)`9^GylAob81=tAoO{??hGc0+H7iVLU%q5BpKC|3UllR-EFu4Wbkp<37~nh9pNz zR6w2w#mK{xkQljn^80_!?&Gf|jZeNf3ud2taTF@I_vH8g;2H*$LcoI;G2pwvKuHOV zA?y1+LtZemf<`YGOXXZ!PnMXwXrCx?0}rC(h|#B;18i7@5lFTG z)Pm?{^yzK@HMtc3S$P)}1D25r{4JLuEDipalb}Ji@B^R? z2%v#eE)05%RD{{c&;3MW2j>kax9aJvx zx10uzH-~_BuAcEY_=wG?`^O6y3sDL2==DAE;_gRqd20Lruyt%k(G1WkbdY_Z^L&Jk zf{L*-FSw3^7WIN|K-{AO3TDK(H25mR=-9*j0&K@z0~j4ay=#5}KLJO6L0C2UmyJ(_U;o0x^E|5ztW2>xD+3b~kj23TE(`GiSOTL%Jt| znm#Vwji7c9sQPDZ{=ruFUI6W@aOo6x z?PLV4W{re2!a#Y>0W|mpX^DaIze1;rib^*-XduP0o6*(yWT%UY4k+J%>O4@d98?*C z&cX2M4)6f?b1Ha1Lj#@cpb^kcX3#`z0caf=yj+5~9^4*>^yQ#i6v38*I-;8)iyopt zQwbrU_*MWVCr~px1~dWY(d`Tx(*cbhGl13*gGS?zyQrv0fM$R}Ri9$Fi;79>ff7m3 zeM}zwS_eM!$FVYPWMzPM;Gz$I<`-a9^gt2-xd~iffacdWs&+c62Fwfp? zAlF&OGSpdmbpM8z#~}UeP?pdII z3208O`z2_+2eb&60dfHpXt$tsl|w0u@g>kPNZ0?1cJqJ=xRQL(d04F649!1&m-sdR z_)}ui{No>JO5}g3n@6uGFB><5M=!4&8#lv?i9z50zfSY$6+OWU7UTp8)_?>9J$glF zLj=FDax=V02MOAE^onkS2;K(?27v_CK~w&q7Cv~&pPvUbK6?%}qi`A2K$m7<0G)x{ z4IV87p9fl^5&&6#01l7N7*N*_?DfVspb-?$?nnhs&=EF=jyroWFw`(OHvjm~-)hMS zI_Cit@Sqi6C;p30VgXgopc6UxTVy~BelCGJ@8H3g9iZd5L3zaGMa)ZP2Jp%OP(cdn z(YkaW0_{f;J!382BbhSqwrsJ8py6*7ZnGvGH|vB z7eAo5fgIX>8Ej}CNF8YL!(V2QJ#ZWomdThJ+xC2F<| zHK5xJL5CLFGW-BBLHinQL4!=CCdb`bK*w^w)&?`e#9k}49w?OqtsC`AYyKfol9|^0 zgQKJ_t@#H_Df@AE76ujpAyDH75{%Ijp54U?;KomLJqttW)9;}0WML?|)7=bedo&;T z)BHoG{G3Ox=(i%sm4F$&;41-rdO^nnocjL|Y_FKu>s80yS(qgR#9uEw?#{v_AS(KL z28h8gEc&|txH}6Y2ZQkIwh5*aj9KYAvA?DjJ8=>FxIe53VbiMkJHcdcmHJywPnnHAsvcl(=o z^oqvcV`cE^J_b4kE2IL{nEC+f%lUJ(-mYZnzV(``oALh%>l<}U-8Vd%kMp#Ct7Pf^ z^qQ-i{r?H;4|Po4ANa!$IPwd!bu-$6hAjBEo#6L9<=Da3%?{>+V%&j$+X+y114(qc zfkvJp96Q~3HZZ0+cE+)Ql7m5-V`mu~$io(n9e#|U)i>aUaA4no>)+-#4j$c+9LAUU zH9?zAdU+ifLEAtDOj#UR8D8v;`u@M=K#ArHqaM&skP|PmLjL{lKJj95(7*ru;V1bu zK7j7_;wlAQ_GNm>ftA4ny1YdcJU+;;XHdmdlH}3tAOM<=_~6p*E#lGZ4LXxupgUON zGrwSoiUKIL2fR=O&&+_@n9-WQ?9-tVn0nG?`b9jJtoq>#Rgn4wo0Zl=H zd+#?ql0Sl0*9NA%{_oO#!sEE>4$(YNVf@YGxa$E12Sx_h){{P+r5kqq6=Y=aIPQ8v z^A0n^&K+@J&IJYr4F-PK6F!}#H#&VEfX+u_;AYs#pu)o7(pmas$5|g%5aSKM>p_>! z(l4E^FLpBg5n|YJ)<*&){)gZ7;Bi+AP|4lt`e7%-f!&Nd7#J*=j=MU5#Q0qgI_{KY zU}ETW{Q)YBdtE&|jvr)XU}ym6jQ^rC|CkwC50u7ubo+XE^txJrgf%>RMYsItV({p7 z-2f>_K%xr&MgRY0W`HVm011HcY;=tLKjnew4UT|0qt)BSr0z1 zF#@zhtg{5t8@2$AzA1pVXL5OVpLpRH_3!^{o)^=@!CB@*#J~Tb9f<`yL9>IP{$vHH zjMVt-$**G$B6L(d4n7m`IQSHlS4u=c_q0WT7Omv};bQpg!>{wB;4CupwSKf$H@pa=i@b3Xj*k9vH6>DhhIkoTq9|Rk4z?b<#_i4~YrQOGT z`PUx;t@8yXZ%`o4^!WZ06dngaf?y7RB`tktIC3J0Xh!Jvsi1o@0bwq@i*6#jduupuw0Dap-!2 zh8>{pB10*=@yQo_3*Y|#FS-Ju`pipEM+jQBgD6m3ae!KNkVXHXl2!q-=o>r?g(zno zK?f;*c(G?IsI&#mR+p%HBwq)|mq+sWY<#N!|5kB(^>;WII@R>jI_=}XY-$8de9_Vxd4b-xM6!U=R-y)B{@PNwg z3i5Pw15InVs5rbZz5#N^S^jN5UU*!4`yX`bGiWVB_t_VcH{Sl|-*#h{qqD!CNB3C= zrTZ^H_n-4``>`uAFEaxy^!vr<>kw5cpuskXss~`9564|pB0!@2;Ris|K{1XyKs*o= zyyY?CxQhztkR=9>?z6{Tz=wJ>I4FJo%wO-KlJerr)wln56(yFWdUT%!wM%-yX8v&M z71_%Gv+3W9GSJ5D=HDv(+dlA5IpCo5!9nS}Z|ncM5YW;L(DbKgZyd)begV_9Ke-q@ zyZ?7Hw;m`F<_|yc3Dnd6#2+N2e+Q)x9?gdZK>g6t z)1WD2kXgHYJcC0(T_*;JTfhPE?}gA+Sg3h`Bp+XU`+rwjQDUw~_gT>5jmy{G{k z&%f=1NB15TPz3T%g}C%H$ferdkfSXI0b+$-%(jp!C7Fw@knjbjiyd z56}uNkj#AWLYffJI!>@1{XapA2_a`(IJDdYjUItg45%SC^+3xBP_yRji&w|q{_h5@ zD`vdG%HV2z;6)^8IWi=4`Hq7U!3EF>ga)ANdmMLy&Rzudr(BH>bb}XHod%7x{1;{U z$IJj)BHMbPl*gl&ckXvCh8GW_9zGg%@4F|AVGREg<7m;PMCTCQvomda}eAQRKYv-w5&` zxUi7{pThtyZeCb`gj)}kih|0R?2Vu@22_|rH%NJOT7ViE@G=8hF+-gQDo?w+Qe+0YK)E(XxLN$*{tWs|R6b}@l? zw!6TKDb03ufq446T0xY?t~L;*xT^z1N$u(cQNp{LKorleW)Q`?s|C9FQv467opk~< zDe?04zyF{a640E5{A@`Ewb_yky0ax2OlC_mSkIPZh?_0RkUCqEA!oKEgVStD2G7}& z3<0wx8N#7*ATgLcNG&oS*cid-$9#o!R!CQ;~_aJ5@DeIXpp@vuEyVX zii4XCB`OXc-M{{eKK;wg07_mC-5>sozWB+^kj9_qqT=A#eJ+hZ4>Xzj4ODVZJ^241 zfAq=E{DRD%`33p^i>~{_%<%ml|MnNsCz}s4{TH40hnazY`v>ry;*HN38bJ3+bb-Zw z>||wNU}$^}5i0|W-Pj4*gw*&LB9`=rnc?6I?&b#qjZZ-$pb9;}k$>tjNA6?aZ-cz) zA$_v>AqV%t@Ap9rChmjZ?|~RB+y_Bf$uTZI?l5RQjK+)bI?%~*yc<9Z-#R%wdU@SI zyTdy@K+I^+YUfT5(84US3tuylbZiXdY%2XnAg@hk-{guRnMtu!n_5 zFYgslPVV#o?O0g({r`WDP7e={Ufy{SZ2=y=yw0GF)tw#@pz|hUKxa&PB)m8eazOWq z7wj|M{(o@@ly5s(t3i^WoCBIU0I%QC@aX1E1&OwvED?Ay8|1#@tN}5Q1K&Vt8j{mN zsSkPoN%yVppZ`Tgelj!k`ZIQ4{x8b;lbNCWGHAKk{~yc@|3w#mWoGDP{TacJf zXMG#Z59;PJfPxa5*P;DW1^#U}Uo7$k-DP)zf7@kHXhy$eQet3$y07(Qsr*jR7OwxI zdwzrZKP5aK-Mky4`58dFyI715ycY53cI0TTkYK1|f5G|j|9{XRB7;XKYil$=!;6So zNDGVCqno!RnxEmnXx(>a&>$WtlR~@&C&A;x1}~=8fMf6-Xo+dBY&gg!OOJ?B7LU$| z1kkD^)&(#vx8!vFvOyASgF9dfijP{(e4 zir??lYi7sp6P>(oqWD2e1VPq=R){l$hSNpGA@+gR4r{a?;GfERDGC&6CBof4Dh@uq zto2c#eMXmGtp5Nm`VHW-VUY9y-fA1*(cK7X;NAp{GdS>TeB#%vQ8D1x_}NgA$^bga zt~9oxB8{OmoL}SMi!X;E?Ja(dW1x-YFP=d8pxKB7kM8rGE-ESiMW20TX6O!4N$CbH zhG_iz|37#mYJxCsgwogHA)8;n`;CWk63)Ba6GV3YF z?w2oqKl%%ub}i)s&4_^7rm^5-l|h5wyE2pW^FV`Y5uV-WK#lbP&>X7==n_PS7Z1*Y zF2X$rYW;jY4Qm`(fE0FrcyahFsJ-~(IOO_21_mYuk6t$x#~q*|4Ai$b09`2q+FcKx z2lDJbm)6;$(gQl$Q|Y&>@!J=hPrv=Y6LPG>jTdaIK!bk|Kw~Z(u14R$M^HePD0+5Z z0Zl%%f*RS)zu6qS@A6MM=%93-f7?lq<{tw5E;m8aVW&YZ1)VbvIua0cRvG`c51^Z} zls><(It^N?*aE%_rTc{T`R?o5Au0wg-Dg3k4uD3ceLz>rUI&dq)`QPa4N)=R-}b_z z`4AiEqNnb24odG{Og#mP&kqncc^rIa4{?`A^Ebv9FHeCEKsn$6K8P4(e+F3b4bSc~ z9tU6Bdo+J$d?C6LRCk4_fI{!ZiueEjJ1E_A0ktKY{|oSMyX?a6^2$}|tBcZC&`e>+ z4N#Qjs5pR5hyZorpeM+6gAb2`UXTes#|m`!5^`z+m0zIF3aA>+Fn;UNeXFsG1=K3@ z>3-a&87;+*TxYcjb?acwoH=x756+oj%jyphPw=-z| zRHfUQhxx$4hfJVWY4<_Uyo(O#qD%hu&ODtx;L{I0yU&2eDFQ${cR-dpGK2D@$%}@Q zZ~u3D^LRA>&~V_Na=h2^KmU4X0gvPl9?ZoOttac;T)MY_4M;=mANBCqc0e@tLRfF;M3^ z0G#}Og4UxuE(guHo_}%k8Yn1pR3aSsw}DSk2A!q_4^Z^;5kMzPgPY4Q7M}PH>S&jS zSg@4@fOZ;tgVz_Ff6;LUlvu#cR147RsT(K1|My@%>|uSsgsq|azd|Vw|2B?>p9&>9 zEhkGr%e_3hPk_>009;?`3D7VSxQ7cLO9EGOpfeWWBA}E58Lx*N$d%#I{mQfZ2Kc(} z{h$VRXNZb|@we{lose_>Kqp3lW74Dh?0?awSIi8cXq$Xh|afwqPC?{%tWTCazYu_?r~L8jJb(x8xAs3K3D_5&G{7sOKn2(CJmA5c|(ZvrJ?5YOJqTb#dX5>%gqmA3?c6X-H4?GyaloP`~=PdI9y z(mv-1LTA8YB4AP!Op1X?aWE+XB3)GMnNNV$5!*p1TL@(Xp{$utI5MAgWIoS)7Bnw5 z1GM^<`LrYRN#={zAu0;R;@#gn_kfRX1jX=cewdO;4F1C3ucAIU&oivmhdKHYabJEH|WJF`Iz><~v##RQvhXT2ZD&tUw` zv$J>scqyOg{y=^P-|iotoz62nx^H@R7Eb_mSQ$DzJBvGfz@0q{P%8wyirWCh0-d%C zzCg0GnB%`_!ADTX-~wo_w)@44M+u-^DQEwSW`cx!LqLmXPJ^;VCN~2Es5r_1kLF9i zUeu=s$6^^k6wlHhMW3p$KCg%5O82!9L6Ku~=n!Uu{3*1zE9rAKEo z=->!Y#PzcN`uqF8M`ttmN`PM0HNt;DybYkPNH1$0NLObws0rcG%X&co)IVtkADZ6F z+9U*4c>$s_dk8&xS+gKK&{o42dHf((mU4ra z_kqrZj6UoM9=wONl;Wdb{^4a{Xx{w=)Gh^W*a3x03D=7>ZP3X2hu6%m#^0KEKVfEI zUO`&lQnqTY=kN`ypWC`ghkUNpnnSp2b zImiDOUTy?Q^lkRTBR%`E-M4yUaa$c|$?Q-7o~zKYx9?k3)@8 z2OGuTY7KG@IDB4!M*NHqyaXMo(%lRS0FUl#pxU6j8MMX+v|OjV8RUJ?TA7Io44^eL z8j}8HP9KmZa!98F{ewPz2-OZptb8S6PB68fNM_~#$ z{eSv@(52I*N8$fLk8Uxa?qdyAObjI|&AWeq!&e%laJm9$sWCW@{XYm201Y$#KiE*k z%uu4xy!#JGWr;XQBCLsl0dyQNSXEFH0|Q7E3qy%i_hitOm93Xb1VG9*8-ipyLqN8I z_#pGZ-4zeeH1svc{}(}HU7+zdQ0#!RS?hoP*8QNKa4+xC=Ufage)zurZ+zf2s9(+d zf{WpWgz~@t{M!z6HjA);^6PQXI3FmzMaV% zJUg9N_;w~Q@a;^V0lF^+RPuw;42X8^Ol|-TZz}v3Eqo0c!h|ePc?ce)SOb}}2aW%p z_vzdNZt}l474`o=_)LVr*Pt<-5EW2&&ZGOqi$G8a^n&?k|BEs|g47EM9^Gd_^}_0h zpkV0-`M{$aR4<$bWfV|@nZG3&WLq~>?gD6!G-&kzDCdKUJ4iio78KSnHG!bvm6?yZ z82(=Z?Na9gHJ~ndbbolw?AiUrqq`k!OE2&A$Dk~E&80)(#gVVzeV|?*-SZ)mqLaXq z=U+&HQdXz4g-5R_L_I`7_xTqL5E%!kfj*WA7A2fMmI)3e%*PlQp`sqWybWNJuDNt1 zFusU^*b{=VrwS~4{>3KHz)PpIhexkyJy-~C&kT@E_cf1BXV5?oNc{^@h%w4gOO81( zGJ^Dw__H4Fb!S z3PX%50SVcIg+PbGfIV`|ft?ZI`XZ?7rNFLd1=YD=RUV*=ejPNx(GM2z>^|?&4XJ-Y z*CPKH1ucUFr^xLuK#S|IflfM5i2$`;wm{ke-E+XpQ9$JZXo;myHzX;88eb_GwART8L;F$u*UB5FL)s`puO}`s4}0qL9TLE z@aPqlK$W=(kpV3p;6s(!50U}hRN~R;Y~axiab9zU07HqH2WT*^MBk&iLV=+~!=t%E zgP}z6f13cf1U~n|6?B+rABYF)AwiEnjXUho%e(tNC{MyfUhdHX)r~PK7LYOzzU~QB zR)R1n{K4yE6=205_&lRS9^E%f#XNd>bsj;CgA6#n%mo?Oda0D_g|qTMP;aor%%i&l zGH!Jp-dymM@aYDpsMZ5uL;gQRF=U22=;+!Q6>KN+g61Dwx(~Hps+5IR8x0kV45gs* z=px7z(8%ixO^}}&A#oDm0Xkn+!Lj?q|4ZPiqL=puOrgH}Ysf-W4N%A=f+`M>{uP?A z(e*QDK!ByBVb*DA|Mk$C!srb zIEp&*Z|gb(7WWimI>B_xk?DkEho=xo$p)~nqd15SS{Lou;V6MrNrK}WWB%ipNB7GY zg^Hk(>%$96Fnt|50cs7-z=uJl3}|BU$BR?o(lkcJz@g>82YlXwf9e6yuro^DhNUk7 zkbM%MQ9A`tT?@HM1Kb981uX&w9bg4o-&r8x(m4lwAKHsF(0yI)pdjsZQHkkp2L&i- zM6o3dv4qmhN^?Fdk=C0=4Lx4|B90 zDB(TMtPE1+%;M2}n4`NL6kQNuIb>l_%t3_Zk%d8#2oY9576!#9L|73a>|!||l+a29 zk24E_{NoI|+>Zfb>lH{E;yupnh|tj84%(3nF~8Rfli1|T`cE6039vU+X9ZJ1!O|&0q7xT;N*7x1>ZZ+5ef%d50vtG^zvS~!^QC8wd(i(uT{VeT2Q;` z+<(!HH$Ve2U=`OuDlDB}{|DU(2vmvH|3Y-;pxj+jaHC{erQ3DXZPy>2#CurZWaf|fn<8iE|3V+2}GSgH;!OS?TdEW1J7m3q-q z?rsMjOK^9ko&!>vM<0f@Xkp$t1I^#y{Z!3w6rjCc@Sdto5KrEO+_(a^5*%JX4MA4& zw?ak_PQSRx^5?%tFKZHL&h2&dC_JTV=(;V<# z@GQ`xflgR2SmqaK@~s)#3-$vU)Y%N}1s6a}f%bwAf#!}nn?b$c7uUXnT2ZA!DCZV} zoB!ZVV5h-jg`j0b;KjZ1FWEpY=$-~@e1JObpe^M{vOAvrhR&{@IrH-M8w3Y5-`Wi> zm^`{0K$;Ij!V}y-K@Q5B{4Jm{G*DphPP)y-@M5b0Bn+2<+7;cWUrc2NhoKy3su3d$ zL2mA4WdixH8z~SMf(q77SRgvT2L}{%C?OOS8Sp^74&gxqkrQMPJP@@Zra%L+7IeZi zBoHBC1PZj5?cYH2P`f99<~~a0T)IJf1wczPKy5;3Sc27^|M>eqSQ{jnfeLp}Wh)H5 z<^C7_c7>V2gO;GKxJUQL7c=$$fwrc4 z^zxeD6Oft|Wnx zfr-Jf`z>gSE#uokrV^#@qaMr$JdV2@Nnm7PWB7KErG(?S%aIh&9oaseB}X#;ABE0Z zfzDFzzWQJE;~hx(4(@`O++k*T37Poc1MYPE7kvp1))S!n8X5kJJ_hsrIR1;yyv)q- z!iEWSTKEqa3p@T+PyoU1LUP;#s@l>fICh`;FS`CFXz7ALnq%vcQU#CRFadCn-Ek)< zxLu78ID)1RvTrjpI9eYqHGA=r5oF{A5AEX~wjM7S8H)K}S3h)50Bv9c4IfT*`TzgL z0kA@l-6bv=2BkMhxPX@OgJK4}+Zg0?&_pWI zMoe((1x3YzdfV0;O5)JWJRX3(mD z{j8wd>VEv^Z`lM_;{!guyfq*p&{UdFFRR1f|No6I zf!23{%$5SB@lMuakb>?L9Cfq-Ef0 zeBi(6{)?cLQUY4!k#miU;l+Mg&;fnC9IX5dFM|Joj@|+-D~$$q26RC3{MN7kd-U?Y zVBu$YVT>dXF76z_^)*udhTM0-zwMVt^KQ^V`3xPCLFeO_D7{#|09-v;gVx(kIndDz z5{6A^fivohui)LwrII*RpcS*w*g10sw9$->fuZ$M3A53G!yeFUNnAP_v=|u}N|-k= z9)3BK0kqHqs>6kU+acpiFOR}*j>YeO4Ui#9FP_gwbw5ZL)%~EuU0V(y+>fCGr~5(k ziIDQKdnfpirrQ?tLAv>;9&XqV3MhsW{^rw64f{bJVklv5KFwl1UkBta!S2g1V!?+p zln8f%g&=)hNLLiH5)aZ20#!^<|0DeC*nQBo`vT}>wgAYbF`&Jo-Ip9e%M<3E17#F` z@I8DdOVk{}=?HZ5boa&oqLpAtqJPeNA zA6&XWfr`BVaFeO~r6YK9lE3c^s9n$rx=;nOFT6%2!?pW|{T?LG9 zdnEtxV6FvC4SP4(GnDE(HvjrxqT1`m=+b@6t(V6blvSL2MT|hjLBI<^&>|II4u}=q z2VZk{9|UPAWp?Sl?9qIj<^SRC6V^9swt@splyI4H`rrTm5F`E{1G&W7m509vbk+lC z8FmJ!W=sJ28hnQZc%PnQTwLs7@C1YbmZQ>A+tJd4qm;ATNyX99fv3c!J4gkzDzi=O#g=WL<(8n~%Muk=@Przu z&<9;03~HpDdoiW-FQ{3-59&a0?Dz{hRS$Igu1EKG&u%`C&e#tgov}Y&oYVRDe}zD) zfM>TKhevPd2hj4IGKT=_uhq0?34#dNSX{#MZK z2i<-g;KiHTpyFg`&CGLvg5~43zyCoV zhwNGcfF$!3>jX084@5l)uG+oq@rl6I{`~ zumH`P_3|oS{yhuWb$wR~(Uicxzl)+-{pm~fJ<_O_EC%G6rI@>|h87~wN!lDq> zpqc3xoCsk#h%jjO;Kir!aChlLgh4y$Uff0qTR?Oyh+PLM#y? zmhnOYAqG`f@PY*-*6CjHn)QXGD7cnQ0;MBguy8x5y#bmyF!JaXjRG0ded5KXZ=mq$ z2TS#e#(+dS+d*^6FLr=rI@>`vA--mPaY_ViTrkMEe_$DR50F{59=)P|AYI)jUbKP4 zyZu39{oWv~B-AEa_zah=O?7Zr_7QYY7e?s_nidYt+H z0;s>t3rf+>93H)_*Fg!o6EuFz`sVU;6eI%K-M-#K;+&UgLt4x5LP8G zFf+iTmsQ;b%#85pWxeALW+r&_vL5sVGc!DTS=}r^%w|w#@aSdzVF~7e61zt)Ym^(9 z2TJ1}y{tN5Q=37F)uWg7o)uUQltw*zSr^!Vd7z}}(aUON4d#JTq(?8S3PcVR-yXfJ zYIa~bP>g%@vYvqOz|qmmdddSV2MTRsbgIaqa`!c{h(3ld)J_rxI<+ztM1>#%K*p^2xE8Di0pj81sz>&gRa2m9?kkwF= zfx!c1Fn|Gcu;wL?URE=Rt)QE;J$hMh=z-l(0h+z;WtD=2I0tA#vX@l{5+0EAo>==J z0|B7LMjpMa8=isP2VSbs%ev?hm(O^$L!eGMeh1VwZ-zRh@)MW` z9W3&OI1K8PxsXv0=#mM4(D*|qY_Q1iE?6JbDaoKA9=KCXA@+fs;?c`$4&i}@t~`2K zU-B|A9B-b&%)kH|@9^ks2A%Ni(aY+n0=ikQ8PxIg=w%fKXWwSf3C$k8tg4V)1v%=O zHCz#_QUV;Eteg;)3J~7!7O+nfAiUUCFfRkb^KS$53Lw0Lbzoivgtu4%%v%BBEfoRt zHb8jg;$R-=%qEXs)=JRad1vzi5CuB64|H-u^AUsi!!P8OL6dN&U!>QA>Riwb2%tfD zluHl5O)*gW+W={^QJX5>mrt`n$~T-Upn z5mZXLe^HMCorlsH1G+X6bVw0cD`>h+(5Kr8G|}IB8`Svls8ohnEDW-E-iMFiNhTSn zo!~1@4wQf|WrQCa;nB_iVk*dm$3gc7GeECK0rg+tN}!EX@cL!Yy*`ehc?eKVVAwFW!iN$EiS9rzm;!iY`41%F4WLSC|=IB=Uog zAqN=)>RZRhMj!TV{ZIw7xBs2A!XBmW$y9FQ#JO z*8lu1Y>c2Ye)oe4MF##BaB0}N1w8&?{H@vkKY!~^&_X?V2L{jXevl&2I6J5u25t0Z zL^_^wHRveN+s*d>OYV^=#ltexhLopNvu-O$6K{vU3(|6ej4Bo49&lnTJ-P5nOxa(D~qd}vU=4&ocw zW@gYSd$G|Vou!XFdU^BCa5232$ou{OYtY2H1BmyS7bEmRvFy=(Bp4LA6)X%4-8VgY z0|Y#JJtSUy{R8gdg2GuSf`j43Qr_?X!F%sK8jpaK#z!CSKK#AcdfHrwXp1@oqt% z?jVis%Z{MsS64wx?i5%U7+$E%1%-JD$N$6D_li!vX6pV8+MpL#4YF#B3dmKU*?5RU zVOE3e1?4o59ScB)#J~Iazxy~M2tecC&2Ka|F?x2Ne9c>I6l(cJ)UdbA!W5d?Sr z|6lli;ou8-kThsppT^5j*q92;eyE8zkqnjgfZm02sr5h!H>d&wg%s$_BiM~Y`LIzK zxOc$&o1kMlNJfF&2f7Rne;>}YU*9#nrQKo6ku=>GX)xeTb@@dn)uRl@p0@(rkA z-wi4UK`X6TUvPj0ygeYiU$4Q^pi&7WfHJ{ZV3hCYY%mn9a(6LRNV4?FbEWtvhLhzX^(2(LwVNiF!SMnc$dd-VG|k8A^0Kx|_ir zg4P2i3Lf3FL874Ly%%6v;xcF(6sR$Ry4nu1AFW}h6lgUCDCaelvVv-^hX10s_kjZx zv_|y90WO9Y%p9O|;Xnx%GRX-^-iYxB1rNx0BItOFb{Wv#u?l(PlgHdy82^j59|f6J z!FJ4@mGQN#N3ZC!!(0rY!@)##k8m-#bRPh3W_-b*0*Z#yFCsu&PA_@%@`fMbVtDaN z1l;}s-$Qv1)ST-+{eo>XxcWf3NU;0#i}w|vd~o`O`|o^I_2?DV09oFB)2I8OM=!7TVJ?OjX`(Q% z*?{DFc}+p00irOkT?5St_wxFKM6KYW3m~GAAW;>#Xcj~?8zjmn`W0`*tAPrpcl#?>y1Xa8TAa)2V^^b1*N422#8#Z*7&BzjOGBm!@RcpPsB34(@e z8|qmZO1S=u1|DW+IOfjE&`{69P{R2lO6v9hWA30Mb&o#Wej z2`qF86qkQlzW;w6>C@e#0xn)bH$*}Y<9<8K8d64eABCLvcg~~RT>~U!;nD5R0b)3S zPZ}(d=sxjcY7M9vd%>fZ_b|xVWgugjK+Ucg(DKq8(B6X*70{R;`i4J`Ue=q3xfno| zDBE!+(D}LWq=4*y*m?t~hkd#)fv(`|6|Dt(`;=q%PZV#18@!DAprQ*DsNib|LCNeT zFAI3ZA6Wh($X>Lm`?t*B|AQ8Ep97UPF)9YF2S9_B7KqhH4xpNvH7Oae_agZ3!GH23zGu!1gLs!>ruEJTc+0xD$s!RmWOML`Cicnt2<@V9`9 zO^;qthJ!4iF-K5J0oBGHo$VQ*L<1Tq2d^gpEwBNNO(j%)M&zIZwbTobUl@^Ab4S`yrn z=e>E5i{Zr?u!IBuwr`I7E?@s2wvJH=DB17@1%|&!a zI0JhFq|E?NVxaQ&_ysNoPtesmpe5z!UPwrS3dT}l(0PcUk;CqDFId4sCCnb3)*j8) z3?)*a0d>$#u%H$>N|J>Xmphmo7#hGy5oLA=y1y5EsSBuRaPR~*0z}Ur0;T+)o(Eql zxO5-h3F@}K5S9mpp^HiZsHYVG@>alcP&0_ZquXENzo^PCW(Lq)Rt`)<>wywKkM3}R zZWomhPyqlsI^FmZYz~=x2fCkR_qc8DCpL{Xt z+8fY83*DeespcaN@t}YK>3h*B2XaY_N(8uB=>VVVg6DT|QKta9TOE8pr32`6#$M5? zLtG5LppAVWLH+`J3UqF>wcPjr$JrUdtsL;lA$}5I&;1t-+zIhg3X+$CJ-WlNd&wH+ zCD8Z;s+ar(pkCU472&1s5|s?lY%kbfW{0>KUTg%-27|l{ibJ?8*jESw+@1uTZwji{ z4skJn{qdp-nHn`X#qNds@qe-|wbK%vtMy4S#^`*7=lk^qlx zKhUJdqJvxv-C#xFXa^e)j(A3}TS0S#FOJE8qkSsKs5Jh(UXW!V?a*+Ve&x;o*Mc6s zqHPCZKAa*0+8oN})7uIfqIK*B?M?RS_Hc0gf6=8I)Ea4qDeb=TB3XhEI>Xu~C_bY}GF4v+v>KBYyVfhFGt#~qBI(^2nD1)VS9qvGJv8`=OVBVS1I zGBCJ+&aiXy?3B-FV4N9B%Y%J;H-|hy!{m=n) z`L=`cf6s0<(3Y~!8Wj)FT9$z0piAif|Njr-M8Fp+^LNyO_g`*z0d3jmRXGS6=n>V0 z`T9k%G&F#q*SI@)cAxX<_K*Mt5ZLuTy}a)afHhehgycT3f4XnHu#g4^R|n`+QcxEm z!=mlOMx`bkM{EBs$_ZK%>J0bO%l12BhfN zvkTHy2kpA}0ka;Io_)GMyjU*&{Xh6F3~tb{YWKMpVbdUy(JPv=83;A+zY8_WL1&`&?*&Eq8CXu;1KPOK4T|!TK+rfLD84JYK<+sJszwzc*)tC2!xv}3 zLkp1jesB&ozD@RWF}%oz8(6v-bY_5dIw(fYzfevGB@}Qf7g!Gp18^pd-3AI_KYJ)`2_&%e_YHkdg~4$Pj4m zJqfcO9EYIAljWcpZqTZ@+pyfrng)(aaM=kibW=J|qY_l;9@!0wN_e6BaRw-aK~c%y z(gn`Fpqa<+(=S$ZpvPw)%n2|4fTpcM6@T~T7XoKd<1=M97sHF$a8pY+zcdErU(mrr z;D9GC|3dSv*uVdX1U+v%I3o0S!6Kqmgm6S;LNryuppgX7;oso(Rp2}NCV}F!`vIue z1X`O7J+B>d)D5UPbN;_*{yJuc-U!C-(;mzxUpRqtHDo&`sB`VoecGq{092*xI?xDG zNiyiL7RyPHxb78o-ww(cycXM$3WwkEpjbTtN+u85kmK>JN3ZCyov;8j5e6xPRh!RF zz4;Hy$?K9q!Fuk+vgGgo{~vd>{=?q{nh$}d*N)X7>%jT&DyZJ<_7iwfbL!21(9%v& z0KUxrgEsno24#F~7GxCS7x?zCgP?+|c{ix~XDHzUEuuRAVm=qB1Jn(gGJm0*400f3 z(3b7Ls1K+N==Qb%jh3+e7kvxn21|ezEB_bW4=#5>ho*>5nGG6cI<}6Pq1)ZVgMZfp z?jjY4qOJ|h3=O;2f_i@?njYPd(PD-FqD32+8D2~HbUQnMj)CO|DF&a%^j~xW*pkyP zW+Z|3PPBtu57G_kz=4JbAbl;5@@R-$DQG!MJy`we7w!Teo&bk76@qepi$c#Q@t zXspYl*@A(;bqQ!+S1<1!P&*gYX8^U+dG8(MVsP96I$91APpt$NwJPw`@U!KK$+AQw@4WgM=Yx^hdmtWN_*3Y5Mb4lEH`hl;i)0p!Gu=!CRL= zlTp2_2FM&^WR4j!#}JvLgUnG!=BOcaRFOFv$Q*5C4vHQ{WEmA?4vIZm$TGUf93uT= ziLA#3!2vCV{JN5v!T4nB0S|uH)1X6{!8z&38%c(XZzLJ+y^&;i{YH}E#~Voo*0+)j zLT@D*8QR}UGE8|Z$*}OPB*VJ5 zk_@}wN-~^yE6H&6tt7*vw~`DDj7-cdtZeKYoLt;IynOruVsr(9Lc$^l3q|3@#Tf_C z@mrzbV{e+@BzW}Zs5tm^uLMo@_;mmD=!}g3&p&!}-}2}zP1pq*0u3g0 zpZI@?|1pfgP#{d4Ku4w{i_Jrg z3uM$)uGjxxS~D{+bUS-^bnXV1v7pMYSO;8}f%TnS0cs|&ddY$o^SC>BS|2FkL&z>( z!OXDh10-zzi^eVk?XGe5aOpnb*?q#Z`N4OO=93)!yB^5+@H-y_2_EolJ|W=I{NO#P z;9zL*;deRU$iM5MP%)cl^9hC59IYoySv;E`-1qE0;K{%11*jPLzz$L&;lu9?I+xqC z`GkW<^Mm~$FUQ?% z_Lb-kmFe_l=nM@2SMvPLa-ho$y-PZ~L5D(h23K@W2F*%$2CH;>D|~bIa45C%=nW0< z=`0NZn;f$gY_clYu#j%3F~$6y!8x75HJ#oCo!|-N&R~g7Zy8YQtp3y9y>tM_y7NYevjq{A6{&dXJqiu ze&EwvqvG(g8+0F-b4lxg5*F)&rNZ6L6`*$My?_7zTOZzGh zHNkn$ZRTR=bXWN=x^)RNL#Mj}=y0P>a9jF?H)!!B=m5d)>;FaNmV*Xu**tnhuWW|4 z{6Wnnq)QWCYO_PyhP5EO{)@6K2X%qELC$_5@EkO!2_7`?=$s4^^5_-4y%{uP&4zBw z6E=`Pyg7_7fwmM)J@jAn)IzA;tRFUWF*vmR_vz(*w;9}z`wnxA55Mb)7c0S9Q719r z6#_K8QTJ~`jzw#J13RM>e2CUhaOvgQ{Sv%}E&?=P{$F(JLS}|tZ@{J6Y0$`KE7(yF z_;)>%D`s^yKKWW0y!AkA3HYLQkJbZ@{8JBhw}4MUbnQL@x&sunWDRoqB{-B_R4hRA zTLz#L7BxU4EDA3`%W*-svj(8v&01{%KluwXHV^U?$Ul(t2OxL+fVN6DzcB#K7$rD% z|M2O41iGv??c3k~#MwNvc+I*WblHVRcPpr_gB-=)37S9zbwtmAhSW-pJbHPruH|BQk-+l$|7$gf8t@4H zng611=7Y*r@PzS2kQy718tBY!2580(G^uL<%UX~IFbDV$*3J+W0nnU9h$F1}cW~`~ z30h7O@%8V2<8L5W^1bl+3OXzjx+K!4`(Jkt^vIVr;Pd!EM?Zn9-II`A<;^b{`CHaA zFff2_B&`5lMQZK1^CY;d!Mbq`I5EBgQ@n@I@-e*F_vjnw8uvTRKNw3H&wvi92lYj} z&vlx=+yy$*u)7(wg3Gu2T=!(ixpk*OX+hz|GjY&#He{n?ck>j`nH=oh-Jk{QFG1^R zT)LY<~ZTEEPKIYiTqXMe+#6fA!pfg0pqSHsk#$%-b0}lg#>vjeP zh8NF2gEl*zc+r0cw9KR=4ZP$N;^A&kaR=&zi+Ogp!x9gdN4F=({|ntGUbF55r5?|2 za7)Rx`>0EI5BL3dJ7&tPTXg~&(Hf(}rA1)UCtT9|crgLJo^Eb#}WLMISm3L-Q>=@GO9RDC^Y{uM>j z%gK+w{fC_C_FCF;2L}TK!)swjaDV(YH)IDDXi4w^k8TE!?sFd9;T%5Q9s%IXRx4$} zUF2WuFbzG&@cMuAZjfu3YDz!z3p7KHp#xonGTWXNbZsp!|9UP4e*J?*VxReA4)W_C zEavq9t%w43j2l2blkRX1$DIP|4B!iH4tR8*^I<;V(ai?GND^xM5-hd{Fn|`pK+f4g z%zuMQMFe&Tb`14sego=2yYO#&1zNQM?nLvq^ngcZw>5&s$ajDfV`qsM$1gj8ie-bHpm=xO0m@e{-8>RIKslG+kA+%Jd1K3cv!?&j-7& zL=LiknYmJexlqQVyAz}iE?fEnBJS2}!r!YS_Tt)$zyCoK84BGeUT{78`@cIxMZ>w5 zM-4QiuHe+m!exD;j?<<4ldJX@SLTnP6t3gg%cI{NqN3v1%OYTXqK?C{`-P+Sd*)ZJ z)*oH@{m+5U*0r#H#qWO=RLCZ{XrI@<2HGrH02&#|aBX>8qU+MR8025jfyfRnox4FE z1ub_laOvy@1!w1EPzZT6AMtREjXvzsxfm33FvXzYfhzW{>6{D-T9`^i+<{o2{De}B zLk=&6_TgN+e|UhFL%ekCKJU>h`hNu%=$MBW*SSG$G|;Rr?@G`K0q0*F9D5QAq$9-R+{10vc@lFPbu&nE`YTW9xxZ(7@i(Kr|WdDm!p9yk|o5u==5;2eF2j6#r zR-}MiUv3`%MK{i1X6SYU5AMnp`}ta?MwEDfhuvL`Pj;UIZ@l-L$jso|?HU2fW1xd- zL7`XR(S75%i%JG)spoMQl^js79b|b0_@ueh|3zO;05t+Zsc`=?NGi1F1f@$*q0Zj| zx&zyz`^0}yuUR0+od8eqy_>)cy3`A_E;pn52jp00;{%{22d6zcAt$?oj-SW?5f%SM zLF@fMT|-c}o*QgTAE-J7O($i5G=a|hDV_kX?Bbw73mQA{=;iI5!o~37!>?EWU%P*E z^I$5mZ{7nVi-WH~!wDs#K9);CN0F6SfI?el2RLeUpvLuX0dY%o zKuhiBKn}}oJOax1$dw~h?ZI6jwWU{}Tp6}gfimU~D!ZY_v4CzU z18u_rWhL;r<^~?!9vtAqc|pgLx;r+%U@S3o1l^zvN^(K7nHgTpz4Prqs9-q^Y6O7x zHyZGPSD&1n2EE|H<1i?9f^re)Dq~O_f>r((U5!wIa2<5~9n{i+T=g3Yx;PMYzy#!2 z9q>w_&=26tY@t1d>S^Hcm;5jKb0RYXxF+RT3R?er=iC36pw^&AZ|DPXr{U)mn9B1o zm24oDH*bIY|FR9#;dXuE(Hkn!=_=#VeY)HAL8q(4f6>U7vLO%4qxk>16A6{h;mo z0MuV}HR$B<=ytW}_Lb1~{n5z*is%^71xY2Kg_SjsHAwi{Kj29kaDYJOVNREW@<21h z=b~5Vfcu}vK&4?Xv`gOU3NEWbC88BLt(?1>KIc9^}D8x4!)cty=T) z1SyA3ogkV4XdOyej|o(tAlhdJ@T0MAfwDH}9$v6hL3gknf`p6~I6b^L^6M37ut=uc zMMa~Nt=mOK2NXK+F?;ZSwQgsJ)&nK7&DAapCE}fI-Oesp)HH*t!A`br$YxZ?HNhn+ zpuRcS4Cwp|bXudi+Jm7q5R{({z$fu~^omOV{rCUB=u~j71|3cao^SAIJlMem8couj z3`#>Kaz5SQE8a!l{sEnpb8;tW&BK3D|0$r+NoUZ+2IO>DXnF=sr6@pi8E7c9yMm+J z30xrZ6mx*i6gb8Ox`hN>95+v91`P`CWMJTE@K8SJVave4!2mkaGDO7!G@WB@28Ngcc&u1h)&cI2zQ; z@%XQ5IEk47DtqP(=<+=1kxZ?ZO4K}>t2h`+g82h$i-lM>BZwG-~NLqeY6&GG4OAD z@#4~xZ~uL|w}C1USL3%X{M#P5cK>zkzU$dt$KlZOmcL~oxa2gR463ef{1^QMTF-OI zqx&>?u;9vMW`(2nxjL1>Z09*23 z6x0rIXn9)#+IR!?SM~(3rT;~5^+OpG!6Gp#1)!F51?VtoX!F(qUMV6X43^)WJUqI= zMdb>{QuT)FT!s>s6$eTbJ-WR)z`=UV88rUMHi4Ppm~%38AJ#GFOehPUe9pLlQcCwh z&+i97({Cjr9^DO~=A}!wg9lWs^o>Vn2WVAG%cT;rhMk$coeD(@Fn&i=42RfhQzi37uGXrP`?AgZ0|Nk4* zzc6_G|3CNPV{R#oF5L&9O3(inUD?mf&^-+j_6HhInSk~Pcb|RH1hNfWc7V@_Tf;%6o!tgZeKzsRtZnpp8!N=WsE+ zkh=Wszwv>W383Nr!=ByezTW^%X`O651ln#6s$4Yv-~NZDhI9W#je9_e#L%}&?joxbIc z{JWk=6mx=#U`PI4UnC%Cq;N4Xyab(*0N#@dRuc$T0}cd; zCI>DC1{aI^%n|_?i~6imuFZ@cvH2bGIj@z3$QL zdLGtQbL~D4s&gzrlQzAsr@`xX!8NsOIY?Z?qu2E~h@tSp`1Sw)$J{d+T5j{Vbb==Q zy4`X-dVQ~Vy1sYpb}Q&~{p{H7R@3Qv-Lbn36wRHkw_n6x2Mq)GzVE*ABINqt|JFB3 zf*=ugzxxEgpzHk?dbj@m?{Wnx;yr~YxfaEq&@3qhR)@HI+@*}-}9ts2HsQZ7yW*VPZ{ccu03oQ+%gg{-Fw#8-d}FIe;}K9+fETw&19T3^ z*{1o80%%59!KZr_sM_=G{@@7iQN%jGqd>-JM*D~ zKbSjRJ$hL>nh$9BBtPhM4e)II19D)ox@WJ83csiI5sbOBG8XXMnMZGpio$Dd(6YoO zcHbd)a{e!6H#+cAl97SoI6EjedGwZRICi^n7@zEPXL0Oy;{hEe=*|PWlBv_310>+c zzut`lJd4xmuW;}IQ>VKKNP}Z{9M8cAOs%&|41JP+@XLeRnG6j7Py2Qs2QAV#2ht|s zk$l0EIZWck)C6V*Pv-Bfw@dH&bk|1sB)fWecAxRoKC$aRs19d7|3WyOnV~y00CYJ3 ztR@Gy|D?M>)!YrJpNl{x{fpzapgEu0rDFd@MOvYqoZr*A7+%Po|Mvg2gJ-udY@JnW z7byNtdv?acqY%8fEwvjg4vteuMg@hR7q10_5!_J0AF ztDtN9UL>=DxBY?G@X7+zJ_6s@&;+Uz;Rkzra)7k+8(;b_TG|D+5TxsylLtpBH+Y%S zf6-WkII?MHVD`UA!EW6daQ$w8ToLhWmZ&K3YkczPhE_<9?T8AAgMnYqwC5lTLzPu2 zq*?-v6Y%f)APg=5L0c6-jj6H@a2cBe+V3`<3vv@3Xu(kQOPSY@YDtoR*9%lVPGCJH zXFl^snm*da%3yp6ax9!j_vz0r{5r?}i*9HKn+n=HR*P!tu~)DDW4-PU;y(q@kf{N5 ztQ)lIjn}ig0hFUaetgXYntAf)0GAg3MT6Tw>BpY~G?-|>zw3cqk(f{S;a#Bn3IB`c zbwGn3w6F)Xj%8{)LI51_;P6!N0Ci8gZ>?Y~wOMhX)BsXt3cdmjnKy&%bp#!04O%c-qZhwx;-Df-Vids76xidL#EdP zJi1qcta0uB0UCY0>9C#Ar#qG7g}*Ym0u}6b_V7G@3|w=78tp~wp2v@Y>zZCjrvbFk zTm#fG0rg|R#XYEt=Kyj>Z-|P^i}1(b%YQ(Hif8vVhmP80&+apzv0Mkx&@E`$t^u?Q z0x|&91^F+!xeXk7{2sl$2PSbbybyl*>OcRsAIDsi89cgYgAb!=y=lqJpvjJf$UF% zCUlSPU*PEWfQ)4R7maNJ)#@JI=b^Q_>P=8n5Ud8Arq7{u*FFBLPHF{pi@rH|H2QR( zDpiD<42fCK?vt>X6=Pyxcp3KZ|Nmo6pmBKQz7WWPVD~}Whu~$Epypw>7YFFR$rt=F zps@(hkyfHEJ>Y=|*B)jDpI#5f7c8cr^7#U2kPy_JIokqCwMb_szPxM!-k%RPAGyB; zNg)m%-QX(4qZ@QBIk=zIH5t@?EaiBSc^x!x5$@pvYOH=g1a7DEdw}Lc&%KZZFCq^2 z_~stKSmONckU*)ONAoFAv%;e@+yfk5|3w9wQ3LbFb+o|zFB%GRZ*#iGdvLJ%aPyte#`9=fnBViLLW4WxU`v>;k6#g3pRtMH^9a1VOaSG9k1zztS{#KFZ!kl zd;+ouXr2qyWdR?ydIoxbJ!sP>^pFf6&_zH23BIkDO2iz&_Y#APf?Z0Wl{np}L8qdC zDkD%*24j!zBcZ|Jpi#%hH=yzX=9BK94b`a({Hk&&p(*PUw0ynzxW168h_nEh(PfTo;3dAn=H&A$&=s)t4sHR zH2%5+`~uCO!EWY*{F<%{X1XxCt^l=k8C{ovG&?e%V02y6>AS$A*LTBzQMN`<3gB#rJraL${>y*L`&EWl?bHbUn}+dc>#K^#Jp!PS+Ei zzGpljwq5uy+5g-x>&Bc5?oO<=_ARUp9m0)%&l2 z+xrJRK+83pAUbnF-Mp}F-viyQN38oTm>C#KIjq}lK=&aybh@f^yPo)eqSIHwqdQc= zqZcw!=c>`|dglL$PFJ1(q9PDe)IGXGHK6kUMgP}>d|U#~1&`}dazQubTqDqQVFhea z0BB;b0MuMafF5@g9}OQN2IX7{BGSJiuJqrTqk_0D>zt$F!2~MH4uDqOf#zGvK}9)eEV-l>l-CrFx2S+l9)xTnp8{rsCuTCs z!M^tQ=8ZqtG06hjboqwFDeRl1jK2edmKO>@$AmVyu$&!^%lGp8ML0I(?^9P7`X@2_y**6 zpX50zpx(4cFYA(iE{5(oDxibiJi9--bT3f>Avc!phbiHZP(u|@@yWn4hUfU=AW z$Q;lh3~1jMtiRHI!lnBH|N8ST{Od2fbl>!V+?WYIwXV}gCBc*VRriUDFCF>UpK<9v z>D6mu2reL=g3cxAE>S6P>2+Xq>^|YzoBp4F{b?WVb3V*HDjz^~8GrZ_7yk9f9S^=? zb?JWTtNp6`qG$6_1z+vMKA5Cv~jx<;P#7iKVOJJEpY5e(DL9z!yvRrBWiB~}?4uDh~ zU`XT7`w0?f0vYlljX&{!8h^omhBO!ctLH(Qeme4R;{&^hKmQ&`-+z$4{~(j|AExmq z-b-`jPkabc`4J@h4J7-GAiu{ z1JeE&r0pqN8voy8AYCs%JM-uBNTj*&*RKJOr^C$4e+g3f1f((j0e|>`G#CDa7Z6v1 z?EozmO5@Ks0dXqS(cloM&rwN$TAY6nWaXnYestIV1%*Dy+}j9OgIYNdS3B|-K4tst z%Ae0;2zDpf12BKSNaN3UQAtSS|9d3Og+Jpo$OhiF9xeum%N_Yap`3p3Gbowx*Mn7N zoKEBa%bNsNlYbBtu8-3|vE|5r^$;k$Po(kZUrFQ7|Cq*~cqNTL@gvC06KUX(uZOI6 z0;QmrpcLpW0E)ktpv3nO5;-pX36Il24sqrG`3z*-b4Zvtf~?@rd;$vF9u?3cHc+VC z0hx3M>g&I^z}|4=FMP}falQ-x-)EqBxsk^I_byl!G?xFu-SPJzBt~HY@(>h-J`w_H z5L41`fZTQw8f6#2apcPX^BTxy*C8%*;m_X!UQYlDit```{R8QNEO!Itt-m0bo=S7& z&-e7?_z0xF1rh{~ z{P~~L_z}Lzf1k#mum-&54`eAQ!DQ@#aKRpgBy32xEsa0nGbqk)gRH&_2?ZDa^owcy z`6tr&GgvQVurj3aC-9yC)AcY-`K;T)0tpvDnjfU`CxC(|;{_;5gVWF%ka>^N_!Az0 z6kJH-&p(>RpLp;yf4wU>+a6Ej&wQE2p9nS3g+Fr-IInzm=C5bbg0wd>Kc(>}9s-HD zXeofqI}A!4px9140ugmcs0v-AXy85O00F(70{-$$3L7O@?_NaiW5f^@qE#Tol7k&*`Rigo`d^BLykp`@S z(tuT28jwniUjtIBflL9_a-hr0LA!uK6F4BNUAiHaEa>(>P<;g2r3k87tPhpOyMWI9 z1Xo>5rR0IJ6L*B^K3KIzGP)`$6=FY|RD&=N_|LJQ}EudBlsK)?m5+)o;!p7)=%GN$Fn{L1`n*w4pQ42Tk6PYZ!ADtQpOF+Y@nuo;%!iW?I&n-0Y0>m z@CPzB0vY*m;m?B(YkP%y_i^5=UC zfP!HUv@QhILHy|#AYJ?nP<`^3x1}1?y2t=`8$YJ;|5Ysp3AplK1yw7czWUWeprmmy zjsNO%SN?F&a96@1P{IIp^M4)#`3E$j^z$63as`d*Ts;dK9r&EapZ_L}zkUk1!wX7g zH`DkN-+&lD(m;b7AU`|uC*A~AgFhf4%%6WP4Kxe|9`fK%yaqDyXd3_DU*O0E#S_@$ z;Og9k|L^ZK{`4Q<0O9`&>WPB`05oLf$p05K9FTqx6g{8;4oHBxfQJ3RnqB!5UV*~( z2iza;K*Mm*)Bc3uRi<_9IT{18y={yhdsG%oyq z-@=A4UV{fHAXPbN>>?c$jro@$E>8FkZdZW43U)8pVJ`gnpm8Z!Q^18kACxaMuBY+m z{|1e(fRg4z(5PhLGf>h@2hCX=1r4{{0mYFj2gp_6K`@Z-UZ#PXJp36`praxQkR6hU z5eoi#klVpSocxKP0WWBJ%k)u609E=dS|B??!y2Gy1~)zOp+gz`iJ&x)4;~MJY%xjW zPnZKvW+0u=p$t&UfsLj(@+Te#g(J$Kh6{fJcp&8oC|x{*jFx160;PuQ;Fg6me?6$> z;f~(&2tgX`NB~7o#@96d%-?DJ`Mg^yxIm>#{$cpI3wQv;g+Fr+I4Kes1pzlVz#|~w z2GKK68w8Za>Qf=ZD-Iw9wI4ujk67p^2(--uYSlm*BZb5@Ms^Li#>mee`Zh*7dvG;I zh#CI?-Ax3Ve*sOdfbM}R1Gh&&14GdH7tnAOWc~#_aDzJkk^r86*#cT#f54?T>%VL3 zTmBYDF7W&duR$52Jpwup3p8;8nr;Ejn?Pq!C<6odLssJ4GFWj6A44|nO=!6Ss*vz%J{J&%O z3CDx)SoznV1}#GbO|yWeU|hN%`f5J{O}`w0O}_;AFh2!PzZ~P=?+u=A5e7}Puz?yE zHin=I{w64Ezu@2R&6WnPuMW>?>W zY`+L97r*dt<4$woPXx{U)R(9PfX8Vets4HsqiLYQ{sK^)2dpn!{sK+Y z@c#vsoS^a>TH^ox3F?S~n;PKi>_{3&2~-kV!n^R-Z-F*t{(=hC{1TM{Q0@2;Tp;QaX^ppXMA1~-8~gY)TE(m<66C`3b43ZOV0tBJMv%s0PgHUVgelKS6_e{f}ps(`W#e; z90s*8K;F6vYK|m=xcQ)|hfGkk{RNlVe?iIa3#cY}3o63DfViMk2TF07;OgdZ8fdl% z64?3AzyS&IemZET=zbbFI0~PzfkGG3h{!(zohtcz2&z0Cl+r+n_3t5Yn1h=j={KNN zJSc!c0S}G=aB%-T2}+Ofmc>=jh(x|9<3|<-$i&}YP)Cenl3ThjqgZ=)=kw4^n8h<@>a)v)0G#ikA%8@?= z6#0eMIY8;G`N!fH;upW3QWymP^01uxX}e}OY;|A z24&ZSj{G5@@VE%#fW~DCuW^7>es<&!xdd*p^A}#{aO4lUmBtT};!nTf$RF|u6d}jc z_|rdvwL5~;r17VNGGG2Ns8IU_L0UK1V@G+Y!f5BYy~J5(+v~>B67?9pqJ4{*X@)H-XwfV1xM!FM%Bo>VAM` zm_WYg&xd+3{aG4l04e|!hfmVL-ggD{Nchulx$=j+O5@L;0-mdK1^Ly5KmCO($e;Y6 zrU)biz+Sirw%|sZBY!%mi;(XF$~gJQq1Imp%Yu{D0jLltV8QMHMH+uPXqGVl7r3De z-ml3Y@-vM;A3k{t3St-j^v|I1y~Q7L7ZgI*K`{$Tm4~24LOcm7c=Av2hn!2}FN8)u zfBq4ul4~G6pTMyVE=oWJCsgVRD5gOc6kY&@Ge{ArAqtB7^cT=r2PemiAZbu}l@5xT z6j1q*4k~QGL6CpNg+D};^&JbSY|TH&AHw?cEeoia04agQHrVHvIH1l0g@Ge~I%oPrV#FQ?L=$pvmC?vsA4|ftMV}Y}3 z{#lSau7lFCBR^=;IsF8G$hFV>^}gWXI}UQ-IsTAi;Mh#R0BVGXD1l;S3bfwH2N?zO zYk05zIHV%Ir5dUHXO^y#nD zTtP_@oC!cGKo;^SfhHnzlmtLjijo3|Dp4}H{RG^-8{Cy=wi zxgVTKAPxn^HmJSrqXHf&1ZgO|09tjCeh6v=fA|52f(4+q|Bf6k1`szyWdexGQP}{Z zQdACrn(Hnq7d)HaG4i(tegFR-wBG=U~)YW#twDM5`v&@?4@ zb#M0;@Ts$)X-ZIA6f}njYPLCA9|g@+f|_JhoTr@H4r`->?0{K-n5Xpbo}#h?6f(Uc z4tVD%K~5zwN2%EkZl8l1+L&{c1jh?27#SEq?Q_tStw%3wOBT3&4p|fhULOT%s)N=? zfxP0A9xsHq&to9tg{%{@5bbkN+aAk zQ(z7CIk1NM5?Dih4XmNQ1=di9jJObPpMydXU;A8*4W)e!N~@^tb5O4nv;;c=)IbNd zJ(qykUgN3m6I&Aq9q+yr$6WUyduciW7z@PXZ)Mj+y&wB}KtAi?4 z7yg7F;CVX!{Hx%VRG=Y07ydlZ;+aHPAHbFW=O2*epf=vmGoX$Ec!2RLs09QXF3fz3 zvc{^uMkN5$e*6w;pk;nb11&Ie;r|P227p&X{RK7W^B;oBI%r!OqVzAQS&{e<((Ho` zCxM&mE}&ZNFL;JyI3my!l*g%?1bbQEG8sL=$fp&{de_271RKD4QiJUsZ2jX(Sw zR7*Z+_$%XF8b5eF)nDHFbkHE+U(l)?&=N0D3mDvdPrnFV4h3Ck;|Lx?18d~<2J6WO zjUI!>3a^6Zn81zPtFIB`e&9t_;8kmXq3fbRu~`pY*5t^ae-o7Qyam89>;myd;!V&3 zn`3GG8RtMlrl6p`3TjUL1P$_CJqv2ngI2bI`girvIWtH8d~ov?HXQf~9I@b5G&t~F zz|(-B&J<|W5ImI%ZmR!B65c>z>91T1gIS0A2(qPS`9Z z+-X0rfN~^gRP-u5nh;ZuV8?(**&M-Z(?G2dP|f`cG|&cGNp>)e|8EO)9`NsL#1Nqi zKPYnYV?c>5e+hIz5A21)OH66}g`Zd<(~qwF8K6=7!t0<_hK1ijqL2s$WiLnm1W?l& z+_-qe#vcZnw@e2w_yP?(I`U`0WE0M~@Q3|K<1f6(%pV5o+h*MP%wHc0TFQML)b3>l zI~QamKgfDV@G`1|V=nw*za9BQKpm@3tRUkZL9XF1yv_ts`kfV|?@Sth257YOA~Q%W z$b47+4DhI+hzQ75P@{<15yaxpzXEDj)QEr^6g48CC{6%{(iZSY9@x+X7jW|#)E>OV z1TqjD7@#JH1K2W-iPl>%wOgs2>VG+o?(ftxO% zN)WU{7*qp-nl7L^4AgW1wH07Zmmb*YBDBQ)pc)O@bOF^?RBXEJYKApkKz4wd zE+7j~n=YV6oJ+3={^eC5rxIwo_%(x@E}%9DX43_{pMzlg1++8^)P8}k?>>?UZoiPW zzIz6^{Q_U#tp;ho@Lotnv|m7NA5i-RwDJwqegVf1sQm(pFmU??+K_=QpQG#g?vKRG zcfJL+UC3MCjXK{6nt4h9tvm%)z@*Q2f?5q3p!x;WHUTwZK+CncKx0jy-VS)=kMMlw zN7#HPXyr9%{L+;ldA<{~`2t=D4w>)#2Wk|Yfizhh`LCV>kDegUcfNm7H8^+?b^RJxZ33FZ$p@_vhg8R)siX&>;Uee&6Ud91prN6^AObX! z1goJCvz+yNz~dXBo+xM$Z2nJB0qMdIUbqczuYucRpw&B${NU!;RgjOaf~s-QU<%kl ze_w&?W~kFaRT#KFbm9N|2W&33Sx)dGb5J=3o9hHmw?U^l)A;{hhBYDzAF#Rdhl5&! z8BalTnakt2Koiaxpw9DO-kBhtBWSs{3us&n)TaYg)S!7#a5E+W)XD%SfS=$-2dK>l zX>@?97w~u|Xfo^wXetzxDnLEee9+uwK4>EG>SyF;4|vV|i8RoZCv3J8G_?t7=7Hup z@lS7pT1JSm7x46E;!Q{u51#pS1h*uRn<$X={*b2Yb5Okg1$C_xK&$w{(fkuMSe_1c zD5%ED0OggRpjLgp>P2f-&>#XNp00qV6EA>T$)GvKj5(0Dh6`vm*M6h; zt)zbnY2$#m6M&n@kaPo1f`36vuG7KeB5%Mmq2R$vNMePLfP$M{57ZV+ zd<5_vVx2B360rSdsN2mzJGem25s)dMdpIJw7`oS}G=T3J`w8*`sIBAM{Q%Uq1GObU zd(if%fW~e>+s;78=Ym=mu<492BB<>-oaR_RI zfEp*Dc}!5_1d;+YA-NaaH~|&H;LT^CTnpZO1}Y|8_%)&982p-$L3{`ZciWA3$1MR0Pua z^B#ianIM`W`m#ZFS~_TLRRXBQ$iD}gECf|o3AfYuL7Rv2z?FIk%L7OLZN8v>-D%J; z3TOc16L`7@GzA43cuxekV!+d%R}aGGWACN$=Ya|^(BKMqye08c8voxLY5a*#z+Pqn zl}i89_zORPhVCzbCK5pP<{?SL2Fk)gGT&6ucq-AJONGif=Wy9yx3Jx zJqs$Z!E0dhLCa*p+wk&1%V-io+`pjZCx2h0f#+HO-U9gmB=`3Lbeayd0q!qonNlXG z!~;*-K^D(|D@0JG<;tJ_z!lVpaplhdMZ{mz(lE&K5zw|L@QRnewn-o%7yhf?K=lUL zd7zpVJkxs>+}VB#UW)^E5vYq=_!vBA=)wYu`E<|}FsNM5mtld0$Y)rvKxP}j69b^( z|I=ywiJw5Tm7s=4!ihBgpP))Q<3<|)&%5A#XZ%<1gWT{wjX&R3#spkxCxV)Upx_5Z zHh4e_G$51tA2N9hnnr}I34>M1;5kol69PQv>&TxEo*{Y$O2he}Q4COX5Hwlh$e#{! zMmng)m;l=Tm;qYP1lp;X@!Yq!6EeXKnl}Ya=z|7zGC;Eppj9^qeS6CsK$R_|7tWvY z9+cbC_%lIcJ@t;@p?pxpXM+03iAO;7k0Yqxd?bxO^ATt>6lkL6Z3tv2-x0L*_gET# z=GQd-#G_!f4?tujcoA?Wcz{0<+*dCA;L-e+k-ydW&;S3>k_}dt!HT!;9u*Hp28RC! z{-3ly$ltW{H+XcvMkT=owCTA3JgyJ&m6$oH6Y8VT=+F0 z#Tck_3@X<^onufr*S!VYX9n%51{HsxzA>oG1@AO+>Aui?qBBRu0aS2-_ZqqIufOUD z*=Xd!eA<`!st@yd=zgCP70^Z_@R1|F%tt_@#0uT#UYIn3F58%+0yeYzm}B#U2QJpf zN_@cPJN2@FcNc-IaAiKweWCf8yvM~Cp3GN0K%19*nU8c&0S5v2C=!oe9tp7VV6%OC zc`Ulmy|~fD&rs&7DBTS4`bBY!@qdc$4cJWk_J0M|F~5%tYe@TM2= zLg5V1pefe+<~wG61M1Ibf_D5s>ky3krq&OszB!u4pZPA0KM}l*))A?`Nkpn|GDk*z zQ&LOY`bMOdCiP9I4;AX0UgZ9b4zzz0>@&dijrwT+W_a~)Ktr$KrSyrQ(=GDBL&VUo zjSHw>+bReUG;Bi~X(Gafu={HdOH&ZBxWe5@=u(H0+hnyGxxFv>fXyXj~Rt8G#1(T=>&pgF1OKETAqWxVr;cA_?v8 zfTqa7{Tp~)jMT|Fo(7p{1P_TNfR^)sJ2z(`of~i`=RRmC5HwVs2gD_d4UK&RSq<;zfR9MC-Ww#_5pQK7{Tj|9YKqJ9btVJg*4FkAyPkw)dO1ZfVNwL9FhqN(?sy9CdUMj zF_GXy8!`<*>_qS;gu()7g$U{JC=uP^SuqqlJc}!7TLC#&5>)|_*x$M8N`?AIA3XgB z9bY@g1{q(w>^i{p&q?r{UXBWZ@wK-&#@Ez9#fOU$WPD8tG`{A7dwdN%ZU!2gDEa~( z`}zPTuYmhI4h+qe9Lc8 z@d_FZO9Zn(+x0G`fo3D2lR$~!xh?Rp8^nHrH2%LA!Mhwli_^j5N|2@NA2|5KL1T&+ zK#Q6)K;`FORS{=!?uik-fngeY;0Pj6?g#-_%)OO)d2M?f$uz(79 z&~lc-Paxld#wVd`gIN77bg<8FfdT@w%>d*oe$aw07yiGX1u#!QDKh^S$T{Ev z#YE6?OgBJP6KMO#Ur-&I4%)|;FROMCyu3Lbw4yBkHKgz_d<w4PIXiUPFErw455Wx(2-R`GO;V2*{b~plxs9btIq#DWK6? z(DGte{`}Lf(1p&ReJ|;t?Wg&dT|tIBf|q-{@TY@TG=r9egUkenCb(4qTC5COkOW?b z4{}@~cpWz=^uTU`7gXP9=z!Pyd!@ID8%o9Le`N#1T+u}T4nzTvWN$=9vkH1gWz2T;FbT5 zp!Nx5RWvADgBBZutOHqf2)wWfvOfYGD3?I70U9TVtk1rj#-IM3KjaF`wO}*NGg`hfzV0nt15kb#2J;FZsy zPqg9u@WJ<*@{higup^4a6$= zG9P(yzL;Pe0n|PqZt889E$HIhEzr5Qo84=`XEXYCzi{b>Ot^J_1YI}^nr;J4y`fII z?M3dA21C1~2S6tFLZ;k6(|FXMa!Z@geF8Sm2A*U~0e3>L!>8D)!BcE5-6ue2h(`D@ zKXTm-~b=-5BdR1A0$&L6#%;LM-zq6Dh#(!o<= zJW3E-5R-5&{0X25e$ez0+)_vWBG@b(Sib;h?&%~%C!~Fm4XRc0LGw=OA37bA2cI(^>`Yn!gSodUfZHb^$2tnJuz)N&MGlPYX!J7hI z`N92G$Xpv}g~VS|7HcjBklRHRKquRP_rKYGumUYd1_c7RTk66Oo@WD1K!WNF$kHKj z_2tN)4?1_?>Nn8RX0W4SyX4YAN7>|qrpprVgIo;S(3J@dBmq!_fEK|(>UDUl3EG%& ze(sa<~NZS*Z z&^iFLHs&a_MoBmas))gBT)``PGoC@#mKI(CFS~W*&o~N7U!dCM3oA&e3xCEv7tj({ z{)BU2TN92#ma}Hu14%pb7hYxtH6@r``NKeU?qz1svXl@-(3t6!H2#cdY5WPGa~cr~ zkFPL6mf3z`1)G;~lt1huf5>tEum}8Mk0F{t{bo@KOK@D*rzl>X3!AC~P2GWtQJ3xu;3@=M^g(9pI!ja>T=~~ugHPF= z_W{k?T>;e;7M(fBGj@=(0lUw=*p!c`o?dgn4DUYI{P2PGxe_1fj9f1ZC)l!Ho?g%i z+a4ERf=&hm+2_)Iz!Nn8=b~Z(Dm!~cEI}6e^zuj|S5q&%^C5KzW*AJ&0IR89Qg z3W>7yA)uBx()tk47Vul3Gkrj1GWzq9_pg7)E{+w{@ahk!a)i1i`h@l()>7o_o15ce;rngSo^3|aCDs;fXQ0j(4P z*F&H>9bEi^`+=}>9Ng1`?9XuJPd|Y=ei~|mF@EX<5&~CLj{H|agOHFDb406zNF6`r zFT^u+>H=Bg2=l z@Cp&wa58wg45YgYStkPS8-d1L(Z^3gqpKO91E3Q?o3X$nsrjJsQ_$96(4l(?pnVmf z;RdwDA};(H$D!33c>MGvs2@Yr_~}uj(eYFK3q~$yBdQ-48Y~zo&W6-G1Qv`Cs((N$ z5kcz{K}#wwYP&e!)Y|o0T_6tzA3AFUlvH9pj&}v0c z4~$wz3#^(blz9{v1c>r5SE)h-99P>zRb_MFM2c|6!2g^>!W?iNBb(s`~=XJAkb<` z&t4uQk50&mkRIJV;2qDP1)ZR!PM*xCT)QuLbpHfhJevSM%H=peXniGkIiw?hzU5~p z{(KhD_NM$0ix03RY~T^Syqo;{eL?4se+Lc6fe#t@0UBv#v49`Fa-M&`FKEMd0%&zN zXjcZjX9C(^!N1>^3sR+k*5gCg#)De;(6OU~pn3?jEuMeBFKC-q0_ZHxkMLFYAgeq; zi_SoYcjf)$2Q6d-pYi1iI@%w6tUq`p)dh6Cj4P;L40-6HM2QOCu51PVHpaZR01Zj8S{|lO> zLTuGQ+7R&)RCD_XfT9ZADS;nN2i-OZ->(6hR0AIZmjLRbAnpzL3Azg5Drk`*Xg4DG z9K9USCOgnP8p69SpuMAD@A8L(j$MJ?BLLoo3iboO zt1h@p1D#p~4da0~^!){GjRhUZ53-a$9dvpPbk6|jzgHK5S9m@|ootr|!N7ZmoHpmSP~Pv?iGk*lD?Hz1c4K)vP4pO5cQ ze#j^zL$|_jZzaLjN^z zFC6;`{pVj~r$TmZYyn@V16mRc**EZ#{3A>=Py+G}0$W=w41J1x# z20)J7%?BO$3vMBSIv1$-1;ATI&iwU0$^!6)4u3wcry}+i5>nI1MH$>+0WZG>ISqQb z0A_P2Mfn1#*9&P*fmd0R)iMH|`G<6I0D+cK2&`qKPfp9oYq+$G8j}XHWyG9Bpk)L; zZUcOuGrswY3DD!hpvP^5%7NQQkmEL9fZDf^p(N1w5vYkt()f`$a{FjGw0-0)2X7yN znt{;qBhWAwZ2Sl`mINL@f(|70!0ud}0^T78-t7uKTx<#KaIrP8!^O714j0=4K3ojT z_)!9ACqXcZ@N05RH)ImTDA^E5jfX0tNyPZL2jujvc9zhPZ!ZLm&h!{UA zK^Z^dFZ>2t76uJLLzVy?1fPfs?T;K_fq)`wu{4J}&(EpaWIGOEE#qBV0h&9)VLX z^sWQY8Ev2gl@q>$mV+Q&eBjET0XmQ*UsV}oJJK2u*s&kr@kaiH9`Gdu;3z8qHM~Gm zPYIy&Ou)Oj^FiZ2kds6bK`T%*TEHhZf-f%sZQ=!`T96XZF(04-7x0)7NFn%q570oP z3x6i)#9kME@Zlby4bYk32`|Vk1fcc{Xc!4}!J{(h01j0NQ2HY{isTM%T!D0>4JLsb zG$21fu5ZFJkQ9PGkOVrXIWq<{$_BdB0ptsOV@cqq8EA<~;xW+BQHlzr9p(r+ZxC%* zDF!~QlX0yL@ut8ZcBNuUZ6I-X<#Yc+xPN`sG71#K|~Z@q@x zHmm`w3pM7zP9cNUmm07dRHFrak1=TLHK>vWZM_Cnyr4xRkl`%YjgMPYKvshWdq9;I zRmYR6<6*5PWGfuIDH%@!HD0icCxHfyz{6UI@ua_TkX93DF3h9x2&nagx=owVcoHbw zK=W;&#*jxZtEwoty#xv+=zJR}9wGB>VCzYlZ`0;Rns3_;xfDTGS`^-10y!GmUII0Z zVC^N)$`x>X33_4~>=Zgp*tv9?u#@UEVQ1HA!cMc(gq?4v38|nk+DniM1f$8c3VHzo zfA}S$XWSr0VQ(~n3O-OSz-Tmq(j{i238Wm_Xo4O;g4ABBL1{06HY0%N+Z-Xw0}H={ z<}5(dWuUdz(AE-Ys>_i-AJSMtI)Ebqv@Zd)Y65hR0(jC5GF=D0S{6J@#-9KhOU@7Y zkjDQPRDyu+RqzGhs{lT1^)|RI1ip45|2BBbf+K(alQjOTpc6OpPJ$=jKvQhs!`i{O zJ%R5=03WmkZj-^L-rj;v8#$H++TP&EpZ_+E|0-w|I%ozW4>YU|o`3_*u7Q@zfp<@U z&SY}s2W_4JUDn_N?pTASd_dJa;>L!bpama^phKg6f@Vjqf(|je3fhzaTJ{a{Pd(`7 zK+sWKE|8TFZ=vU_g6d1?VOro5g$QIC4K&jT+Tj6Owpb52ffCeo zC{ZZ@H5(xJI}|JpH=&#=1v>T>eiZ{~Dgb&awH;4vausy<&ed0t+7pzdK=V$JI~PFr7J-^WiI>5*GdS|+ z|4oBl(E#=WD8PS$jRsXFS3#$S=7aBF0L|2ZBPJiT5+xrzI|6DJfojdfzu;JaEQ2^1Ik_n}Rbzc)eCoIC>Hwfl~sGy;h$PzV)1U;{-7=*V?& zdjx!6)lbm*pP)GtaA1RzOFn#f<|=5uFQ2!fAN3*zP_TlJ0S37Ulu%p{7cqeEU;y97 zz+b-wd^8BCwQ&%-YXRvZ2G9iu-@z9#fZI9H-pWZw{t!^Ofp%0lf?Wwdc^!1N80gjo z$UcLg;CmQA$E$9OhN3(*qHh^+tI%xaGL(nY^;BW@-?BLIb z-jl_je+K0?3D9*7`JnA2pwtZ7pa3olK(2QM-%$YC2nueQ@`HDlfK`F_JAk*Qya(^Z zbmb2LEj0$+&j2dfAU7+3E{B1fz5)sc(6tC4cV7qf9>L8;(B>DA2>4oobkJq>h`$9lV<3O!tko&jl; zpay#$d}#xClducuASBq`3@-fXpvE{jubu*}SOXs|2;S>+8GMriDE7cJ-r#!^KvyZa z@~49~^yGtc-E|Idyry3O&nUa{r#}ZzDLeAl^ZE9cfei!gqyoF`9H=`GA~OMeuLwA~ zfG$A+rv}iLIEX=@kzCOBEs*V?9n+vAysv<+Z~$rcky(%iI%NZ#j`*SXF67HjJNP=H;_0P6FB`w*bM z8@LYv?Nz|qhvb}XyhjCeEdyvy8q_uh%}Il-2K6C8Z8)m-A<83ReF$VLaP%Pp5OdPb zy&^%_=A%Il#?pTPU+923AN@B1(tiLQnC#Jb1k@WKt^WY(Z-M#`pw5p+FY8kdaQ^`^ z$O;~Bg>)rA0}QLCrW82@r|8e$NrS+8DIk16+~b0I6WH03E+@8oDMAzE;l_ zdjA8cl~g|me8B{0g&%DBAE-Eo)D@t0TA$zx^gz2*AWQZ@H%5TRZ=v_jdVsd$K!#I6 zgDd$z!7Bk>`5~=;_;Pa4Wf9;$2&h8IhI9 z0DS2xXcQK*h!3>>4%F7o1I-_!ULpY+d<75Hf=@06kIaIvorR3PW`gdP%Lfff)z?67 zUi$H{_0APs#-@J$DQL4$MP?gIEC3GfJPI>@i!la)a&NQe&5N=VSKA81Gn+W7$Y zJHX8j*upH>{R5z-e4q{wq(;wx96txXM*`GlfE*bOcCaJ=Pf#5X8l0?$Um|b_+F*vR zrUJzf=+;lrfze=_L2C&Rjso8Z3cAM%JW2? z`pfIc3aU>)7ZiZIE8uoK=m2U+vlDbx2&BghzR`jIFRvh2J!r_W9yZwuUb&YKx}5DQ zs8xIwRAXK}1Wrj1mw@IjLHBQfR_cQmWY$BC1P#c7QZA_JmJhmO78JkW3m!^yxIvcF zBMsKNfR6z{TG9tPe-V7a1-Z9KKq3-!?*MG-8MI0hG$0G^gTrr;D1au4Lhv3g@VxXV zR?xxEpvDq;mq#Rknt$;7BETnSiGg=oJMw4TfnFzZnHd}y`Jg6L0(eIHL>g$%8|dPQ zG}z@7;Qeoo{0V3H!@#@5YGgo5SuZk!FF6BM_>k>w8GpcLWgG*yr1<|=mjLP>f!b!EPYGlBtyo7*G!pJB30tx|_^eFG8kYRrMoWop1~9MI^2 z&Ub3GfM-BK!?vJtKhUr(sNn$`wuQ9#=0JyQQP=2EwaN7*1lHsNHI_iFI?zBTjwY9% zb1w^M8DRGXSM6WmgEX&!7Xb2T`1JA^bhm(=+v%bL8f5vfGDz6uF1TIt7c^1|YBPXaR^WOW&En-g?}Lq6!N0m#)CYd|8{=ea>gyn*MqG48v7 z-tqvww*quc1$g5GVut$+xY-N7n*`Dj`uhvyB*>gg8hDBuJZlY}@dif+s7V64`2yU) z0(%q`P_QX(7f>MbgQvJb!j7OliLd|w^$h<0h7I$Aq(Nf;8Ax-gC2C@Y5p6~ z80<4P@O>8G6a!x9=g6P%0c09z<`_J=3`yqTdn!O96UfucpoTFxp+h&2K)npvhymIq zl>xoD0&yV)xR;Rr5PUr{f5sHZjU1qvZg7_1PXw)e0S)(qQXgoj1$6LTJ=86r^PfPy z3ebdh8g%X&^BxRna3p|+pONOZK`j#&&@?t^C*9c6cChHL54w>0}`0jcIK}yQ3j7VQE_e?|AaPl>KoEPQY2?y+h(}TYbyuA8c3jO zAJjksjpX2HAQ8Dwg7|surGb!U5@^f_>%2B(HQ<>u2Y<4)o~&dxK5%%)e`W>->l11G z{wMgiAB3Gy?$LOVL4kq6qn9=5J12w3!Jll65C1bVFz|0fA9U&d*6YXU z!oU8xOZQ7x{`H?7`PZLz;a~sWhxvdn^Ftrz&tAPE7B1aCeVBjyGQTuF(E66YMT&`m zq1W}lXZMGTFFd+m{Xfusg84wFi;4nh2dD*-eJ=dlTp4_Nd6#_UWN_x+?=q3YqnCF& zgcCE7&9V7FgERmBnu#p#{QF}ja`A5ybLHR0qtbk+fq(rWNB;FUT>01E;9viX`Gyn! zHkOGl+9#YqrZBniuRr13%Om-s`yZ%>uO&!V;Wt8!{``@Imk}; zga~;yA7OIgKIGYal*zTzoyFt-QP1Y%93KCVc{Jy!STORp8vgtLzZ)FIB`OA>eY*zT zTfm9VqccZE!=pPyMWY*%?yQgUx4vRvU~uH$#^BS-y5ci9?rSEnKw>*)0tf##Ay_sQ0|Nsz7k5H}&-w#@Q|h1p|6PsWT7TegeGXbt+zq){9g<7G zfpRJT`tOeX>p%N2|L|dc;LH5cgZVQkBPuh3GvdV;{||J(aOu@yaOK~|?$gU_@(CQ~ zE)zMRSuAEE8z`hFazV12BmXuLP%Z;yG5+<3K)KAPm-XLAP6lvh1BLuVSN?5$=%Fw9 zLJE8q4rYd9`V9_!)8`E5V=7&uI$mqW}!HhKy~$g}wv zIMMz;?$YVT;`#rGNAocb$mw&RLCF;|XZ-)Hi}hRnR?rDIuKe5NJbGnCKXNjFa?WHY z{{23a*<7@5fQpsLOyET6$iGe8vH4(w3;+5X&4(JmG8~Tl>ksm;Kjp}LnEAvDv0wlH zgLQK8uRrC&zwLk{^XV6iFhLejxx>HyWaBANX>{-r2Q)Q;6y5m=4iXpcLoS_c9?eHQ zkfuMP51%y&RS=*$;YAjB2x;2^P;G%+S_J(7#{_bsvWEzH^zwdv2TreeDhROId^pVh_8r6Q z#}FZpUf!87v+-6CVDr~~hm>^aZl4A*4B73?5Fw9VUQ3wyxGD&+(ZM*3wuYF4Y_tYM zh+qX_0LpPhR}ile6-4`6aOB5;D+o};qf`)}mkc)9|h!D6KXY=W0{rv{y7OXV{*l1}SMl(aqK{oosSFmkhqbaT- zk`XlosF4af&kNKOBwRzN;HV*lz#av)$Urp&DAXsifr1)bL&QvEfz=R@Oa^L;{qX5! zz4IDWL)?M}J!TaFPFvrEPB=CnhE@@f7VBw8=7Y>9 zUVQ!xts+?9Rm8~`_h5otkSgLdW)*Sr#m>**P{LV7z`7z}n(p<*E}GOA%B0p8AumDM z6qb7Vw~0A}`VVZ)hZ?{s8Q#hPbsoU28(02qEGme$jf?gHP*E}w)T#tk4H7S$K7kYM z3CCU@3CDvEIbIlk0>^`6FOP)__bITD97M>Ym-osGP-+E>IyRpC&%nUo+Q|oMQGl|9 z3#c=30Mu?kGXK#>H1jWh#4vv!M98C;w*-s%ekdIZR|XetbUW(M?Z|}~i0p?bh!E6E zaL4nz@^5ox^yuaN^&FD!Ct?~ek8V64#4Kdve}4e`3Q}2|0`(?9A?NY`DAXp8|HoWA z{aL_$3uwne1C$Mkt~Wlx>kVH2=io$8GZEIYmU~1;u)u29(HJWy^w|oLAg**xpwmT^qL-c26E0emT91%1jP=> z_-U{d#{A;Jdo<(EzXyjEvhjN$Lg>cxQ`*4@K~x`aN$OzWsy;411$h>h0l|eL5m}H8 zUk*I*4iY}_9Ju}+IDC+k*BpqDM=x*CQ}i6@g2;hxjOeMC`9&hsczEmvK+Hl8ep`qT zq|P|y`Tsa58F>Cb0*z;vPCphz4+FFMm;@>ZAU%xDPaxTd%pS&;x6tYXxrZ?yCdlH* zzy2iuwhO3zi-x!0;DYrw8c%?VCG6b{aNPkS@YWv|pz){^knt#=?m6HACs*Sq-H@ST z$L>4O{;Y5JPtZ72=NuKVVyFL|Yg9Tw{anbPv2XVY(6|(6H0lTw0|V&zW%zm_(0CMR z(?a)Q(0J5m{`CiYy+MOf-@&6#AN_iDKtoS1{OkXB|K?wRihuntU*@0PA3d3WdqO(E zMUdu=XZH(mANYn#uL=Wb(~5#mud4oIP6p8UlRN)@pDCa+!kvG=%M=br{%xV){>2n7 zXdUjtzaCs2Oo0^S#i$n-ps>6-tMJQM!D=3|NG#_L0 zY(CE9`TwZL|DztwuNnDUkAq5NNNl=vr+`NFa#S=xLq4Dp9#G7>SU=@&T?a3TRgXRd z_t>Zt%8tD}f-g3|`v2dtmq(z3{ly9hQy3J=b6$Z03+`j&fC6i)fv6SeV0%#rVG4r+ zDix&7jR{4v0ISOSNpY0v?EpfOZvVuz+}>l^${pz$*68~m-! zj0_Cjhr2&te8Io|J9u>9mM8Pa?%$rwzx{emEII$@fsEIpy*T%SN?5mkYR@dpazW3R9H)9DyZWdGnETECI%iKT@Si|_=XGf31|Lo zE>jsGX=N%jeM-Hkd4K&sQ9*=V4-ybs>$xn{_>rc4yuRr0!d;-*lnyh^R)OeZ<@)Gl@7b{-C zJv0}>1p8>>3$TwonvYnZ4WfVwHYmnhz7ZU6{|Fta1C6(D0T+Luat>p>{V&pZ`%WC~ zIp?!Oo zsjwF8R9Fj^@rB$|SX41P?gys@N9F6_#K3~&OHcy~6qYaEKLPs^k{HrD#USMsxF-hf ze<7KD=n35HG?=ODo*=>wZt6@FQyn|Sz@_?eaH$R|a2@x8N_C7Ocxe9Z-hwg&4+%=^ zAN);0fByfs{=wh+6Wl!B1KwNJeH>P}JMypp?aBPnhxvmK^A8W^-=HF057P7i73r!+ zZo!Il9R|>39B6LNaW5!{z>Np=0zPI6sAvQ=n5S?-S|>ngWXl zju+D&!@^1;%~AO(I0l*?Bf<)lior3E`xqq##3APKZv(fF!7hUt%J{+&ZYVR{P+cTL z;SnGKF%(oKfD-TjV`kJ1~5iF3(ffZ6YfT~%S?ls`D6I4mOR(rnz*oV~ogCR)3H&U%LlK{XyA$ExZaLcE0w@ zb>!|H|28pjZyK6tYhYu9h(!AXoU7rb2WX}i+@gjIfPm8Di-!*&-8)c40_s-1xbOg+ zijli_dm%y|y}ZTO(Ytqe23Wx6H=>(g05J^N{8)&PM=!517W45Auz>B5MYn?oVj!{| zKktLRh0%ovjS7GUSY}>>Bzn*Q1gM#V6h!;(qXp4gh*`+S&w>bn>I@fd;s#jMLCtxh z2UtGCYY^UdSHYG`rz7E~^T!>l7#z#Sf(2eH@*CG^5;ezT9 z=oIcda1}!A6s{_)8i8~P;8VDTSHOV}ox%l=uz;fge!owdj$mw$z9RA1& z%n~Bx(aZb(GI}1wJ;VYI|9^Mj#zUg_?H#c3$l-qrA_VGsg3>SkA(oGzl#4P#4;^9w z)gA$tAsGov?IEHsyu99f?S|V18s=qP6{Z>KZ(wyxl?aF6CU0if{}P)ot1*S7f*Cxd5aHiz*y-_GO*-M4%@vv2rz7GD5$ zID9*+Pq_3}{s&#WqR?zuR|8&v4EN{kdXH1wS9I0v?#qsMFCVubjPSvI9ea)Zv_p6fchNML0#PGY%cuU zVnNF{dpY9YD50CB~l>(3EBLVSo zptT2}E;A^-E+QtqUOqoi>D3T)h%qd^`kW`6Uco68o?gMJmj#?&K_d{5CJgc#0@MTx zo^@2a0ZFjv^YDB(z)^slxPD&;3qfK9lsd2^Sg@Iwu46ZI7sLQ$GnYez@FrMhlmu&f zj<^Kt3tFQU3R(yS%IMRXz+(g3WK=-?LRhPNItL_MLnk(+u0s{jLkb$a3HBP%2^N%IXJAXO9?fqeV8v_qEl|no*;)MpRJKA&)a)A`y{vp^IT=8O ztXHqe1W+OCYJ3S&&Q1Y$Sit42WA`h^?nAKB)wTN*tax=beu7rKc0-RNgqE>B%m@8? zbvVFn7%B!3Jz`LnmryOgx>Vw0~yD^&6UXo z%}jlCGvy!#Ae+ez5rU*mP;-<8)VB9*KF$K2GjZ*NG^;(EUorBx^8Ek*-=!N8yr6>A z2XwX+cx2h7yGBL9)%rPqE2#A1-^Rwj-w$4p{&fRx$^%% z|9(H@!ZZ^i1PV#aITIg{KBNML_d5Cw!PcdNP0T zV4ebA9_$56oS@MpP~wE7%om_36n^M_Zbxw1*dGiULUQ5X@67>Dgf9I1qq#t-)rEik z1yEVRzu%e7k$?RGP-zMtzFHq%@Cnk^v{%vlMREVT&B}6GlhZFOQxe&HQhZD<-iC}G@k!co>=0j|t6o?o$a{;Hb z9F+`L>*u9eAm{P#_htb*9<;0x;`aT)9H0aR@ePveL9=VF{Od2eFkb*U3Y04#?r~&3 z@j?pX1f~wA7yJ+=GsqLnVAn8#F25&%uV96mBdC0XG#Oou|97A8VSee!{K5lTqJdhCuC3qrTO`1Bu-kvfU7#T@ zNV@sp(rd%Ozuz5Ho*}gsUHJFMgGx01{qbBbklR+li!wkfPr>m49qQuW#tu#|?y&U2 z@nZc2a1jO?Fi3M$z62iTntcJwFjw0J_&^T##k5W_kXi5o4avYbECzaEGtd-bASg|N zhPaxKuz<$6nvb%ifyQUSgR}1#`CIwGsSH{ybeE_ofQmF%>wl28A^$dZ{{8--G7M48 z^6z)YsANH5hEm0DKMyLz{85Ls7C{6-6)fICt*Z0zuz(C|5iHAI;VjEakjgShD#evP z!?2}KjQV!oQBcuUd;wp5>(LE4Wej`zbnX5GuXMphng{bmaL)$Tt%26Jpk)i7BF(4! z7bJCF0F`Q3>RT6Rh0DLcj*EYP91ExfgG9y;aO#9~r$MD4s2G4$xZt56p>vQ57nC|d zRo)B6bKum9Tsgiw3l<`#!UdbT?<|^`Yas?8n>h<21WKBq{&VwD{1q-YQW6EFPH=?_ zUaSwRa7*hEm8~xW|282P?GvE77Sa}s1y!}+MQ)(F77{YhmY@L0CHwu5+kt=2fKsj> z_RjMIkR%y(E$;M*S=Z8iyp}fWr)6MMe#DN~x*UQH7J2mYnnO5L*?IH((Eb;g*?5;vgL-N&@^P3S4lxYb z?Jf`@(E7InP`Be+J`FZn1c%XoPGUIyB}51^V2jva(|nW(vIq_|u@2c`1KMvy)(#uD z1K`-F+727DlaPo3t$0RWGcO163i2XnZio=1zw6V>x_dv!DOlG}JNNQ%zqow@yU~YF zfCCQM=nW7du+h|9KmC#_!?Tz6fjkOZ00)}NBW8!qoPD76)4w1q*FiJlSa#U#I1ULS z&@cgV=r1@94kF}a+Y1r$=;d|Z2Tr!QmrsL}Z7dF>T_NTm8*Ky;f{fE10?kx|x7aiv z0nN2T_t;<#&m!%y*|-;NcosY;M)V$=O~)YP44`!)@I5wjVS@Mu#ww11!-=Q`)O4>e z*3x8tPnOjBLSzpt^?LO3vhM*e6hPD$lULZe z2H5Dwhp`9C>BAVovI8PSM1`RTnjRr~Vh?G@jp#0L^iyxg4GY41C_8T690Gd}xmdpm z5ds(MpdB}zJ3(&2T4R9fpBF0+!9xzk=!p<>kd3Z`2!V~JxW-6CESY{qQjMX8V?uAi z4vmKC6hz3Q zmsem1IN{>1GQdV_;V@bVVh*y={||s|!&_y103}(-oE3CE2(-!o&FIx_N2@Xr>p_T_ z(W^fItum0iBv~*)P|q3H(6lSW<%FvYy4M%9Sr4L0YJKr!D{|VU#(tYi`@l&SF<^ag zA2{_O_jT7nggknAQ?`QADk=MIiqOqZgcycwz8^%$qnDQji}{doYtS4HDA!@zZ^MUf z$KSmees~2DLLUQw@3-mN0!j0r)e@jd7|3b~(5S+T^?T8RXdc8YWG{3>gdmj#X#AZC zG#KI0e3S_~{tjBEg}&oP4U`Fqt~Zc&+}zy^P6kxladUPL#D}2O10Z+5*s}*5fXE95 zRzif(0}!+x#1HHotm{FXdwG~&v1^jf>s~M zvq#!6LG1HKJP_xj&L82~bAz}3p#FZFV^rU7Qvzw+VBK%Ce?2Ys+pOFHUj7f-Z!-_V z1TX)ev;(~SAH1R!>wcR;h+?J=cjgzV5H@(fO(a+&{{1$l5cQz_Hd+uSc)yJtNGrbm zHh;H6-Rj2t;v<9&-f#1C`~UwPZm9chnvXJpifPD>o1>r-nUozj!Rx?%HY)D8aoi5y zabpHyf_L0#ft-%m*Mza-h6|z=wBzRgHn0ic9XFr1fqYDz9XIZO|NjT=xS2%KjvG*S zrx&{8Ms+P{nF#2F6cyC{XQ1_o)ZKpbYb!VjfVSVf-wNM;^JFV5wc^-*a~P)0o%zLf zm_C*lYry(IlboQn)oh?*5>!S))>zwv)_kl1-vAG4OCvVmn5_X7gjCyrqYiT$`wJNe z6PyDDz;0v0y8#Dpc}I)=H@k6+uTZf6Mh(_j#<&0G@G5AKgZAHSTg6Ge{WmK&gDXu? zix52V2VKejV&Y~jGodw`;j@3-7d?7;bygAFf8&Y6d_!#J%b=NmW+ljc!uxNYY{Kq| zGn){e0PR=+wM1TQ--POkbdV*E1oq!F;jkeK$p(<=AX{F9LTmtKCCL0P6KMZU^HCsY1)VgNl=3e?9bedNFhmR2aW^6 zZ1@fw9c-qGqnJvy9XJ8d9XRaZ^$*1Cz_EceM!-98oR-6ic=R1Opbf{c^(>(BehO%X z0`hiC3U}jhY=FfHVmHp0^@!Mjr@H&=QDOt{Zk)~QVTK}h|X~DAIQ>$L9icZACCHjvi&&lDuvkj-IOKBoj79Wp7Eqt-g~M8Kl0)wN z=|Y4&dU+o&M(_L)+K=;b4Vw86)?k=_79!-)%iD~_e7plNpj`E$7u}8;h=Is{$b<-C zbns#OaX1%452BM6j1-;Eq^O?Fa|W1ziB=sTfqlo zNE^%FyaHNlAdltGg9&0^U{t>X9AHEb#+)H=-XeGb`3um&4VnMDAvZjO)||}&U*7E7 zeZ!@@1$^R(WA_&i&^2NV3=E)ky1h>S9WTDP_|l~lBHanm>e9JH1!NfLER@bQ;9ba| zBT*iLD;QY&r2Cjl_czc=S{LwPpWl6Zb(}$Gyz#F;=m9;9z_VAx(WjTkvDc5W`yl^% z(BT0Gz{m6c_v~eH_ULp`u>kE(wt@6oJi0%DmYQ0CR>5_j03FZk09pwLJ|e{zbOyn8 zHlJQz)_Jh>?9t2nV=kBz13eE8dNi*i|8~$E%ywS}$Ad4}92*ZX{QLj^;48MqLm&od zH79hLI(UUTc+?!aOJ^dJ_WwWs zcF-9s(BoUVUi3kPK;!>&LCGCyMbUO&*d`z}@LLVaJ(aXyUGahM< z*oA*PXe$pm*`nF;Z7Fsy+*^v_h0_ork6zw|bD&;ehXf8kPA^QyVSGKrEMza_K!iLY zdznCs0>Ov(f;%tAIXs(>uz-&5bztOg6#^|p2HnO6TB2+KJ=UcJc5v?&aMA=FDPYkJ zNt@s!UVef1f^KK@=~aC+o0EZmyAY^!n*u(R1k{Y)?h8Fg=im!AR!}-P_==5x{S8Q( z;9n0u&=-EF4rI~G6zGw%Q&3aI;w9LFw0j9gkX9`D|KFqAN5z7FJ80p)YbWH~92frW zoY>8F$6>ZUrr9zOA(R2+F^1u)Ynf5&|77Z~|P!=!VVW zWJu$ecVU1ZAG4huoIgPm0#n&s`M2|ds-vmk8G)%R#AH~=*$mL|n~EGak}ud7L*fQB zAB>!1-!B5k4PpwI>%|?25M&}1Vx}wqc0W*F1yy%w2CrL$-QZ~uQ;-dAh6sUH_=7j? z9cO_qM?yM~3tAt6wmX3OIH17#fA%%AtMOa#(HQfjuR2=!Y zi#s0t4Jxr9!W@nVU$Py1#pc*}5R}G28%|&;9C{$|(}mF53Nm%D{Q&5!-wQB77XIxQ zKzj-rPci)Y|Nr14E=Uc<1yZznAvg>n0p`(sBm(6uoByhl>zNq-tF8r;^llfrMuoGm0F_<*%WMTmCLqR1F?HiBgHv&GLA}T(eF)AFs#6TFy03AeceYsdH&9U(j!w28q*$f~4|93pb%;0N%x%7iiw}^^Q zcZ>>$NAnSZ!)MNb?iUgO6)O@Rpv?!MU9SSh2aHehFKYalSCX33_$f0l)sy>T_lq5j z3=9m7pWRdQO1Urhdi>{K)cvzGPW6NRe}0eStO}cX85kNE7(9-%%5LTbovZxc_5d3r zLy3lM0vi)UiK1-*h>~L6@bl0A<{t{>Djqu-891K6)!OP%keA2P|qigp?*Y2Cmf7xps9D5zvL2m5+Ati>g@J*=`b7;`lS}t)k8alFO}q>q%@6(^ zXN}#&%K-A*an|rnyrAon7(6;zT{iJD@b7vqQY`P${NVj@Rttob<|bZ-qb3t^tU zWA|yt?!z7jUka%HXJBDye#q9zy7Cz>gGb{@O$G)=kM9>flzBxq@-ldI^73xvWw2o^ zL-)OX6DzR*S#aN;NBE*`1F_v(F6QM`*5skwyjyk>ndodtAx!vV0E zXZHmV{gNM)2U-vCPdy0cf;Pi=fbt6{i3@mi)~F~rg7!lwcyxdA>HcVZ@`V{I14GLJ z{uWS)^kOeF14Gx14i^;%hwY5bwl|;hGBEJB9%W!)IL>oz8a7j6-Z46O%BHD4@c1}j(a=oOWM$a90_--R#c*4u@VlfjmWE7fh z4?W>!U@A3xu^r^~Bqj!i7q;x65L*6(7j(Q2L)YmS4y+6e#+Mwr&cBFa1x3=07ofvw zyAQu!3~@sXD+9xX31`lDbRY5Pj8O3Dbdcx_5b)^q;0Ox`N05VO_lNFZKHVQ%FO~9J zirPHkWvFL2KJfA>C~G_YZ~nnp?%>hQDlv_d!K3v+DQj;8<7G)A(q z1e7-F59~IzDXmRmzhY@KQ6k!UU-9Nf-d31kl z{>50z`a&M;m*d@+JwS;99`Vgb6yjgb{`dbsG_EB=J-Xj`G`}(M=w>~zmY2a}x6z{e zx-+#I7(A>GmzI0<`U-d)cNG9d;eXNgY9j9ou?7$5Z5`5z1z7(A2@dh9et*yh3Sa?qob z)e7W_?iiH-kM9>eI$5(p+~y+&v4_ui^z!;X;$`souNqbZsun$Zd2Ju@GQ8yAW?%r7 z4=>gq`ug9anM37;S=u)c12om8arg{a?llYOew7l%RF7^JRReGt?7{Jx)x-KkiHPxm z4<7s*c{v{OGL*hEf|MN_7+-$}g;DbxjTh@7df8vx`|@U`G zF)+M-gQWjOc_Jgji)ma8FhfE5A!SyMiU6qKl7L3~Pf(_~<3k|%~&c3 zPKO@dXFa-){}*j*1VvnkN<_C0Xona$HRPyRfHpRQ^0Y$y%NN0nkT5*V3=Ss&k6vDm zhoCC)h{j9pct(a7x57cbEoFVNH5{b$hz87`qKOdxOA#(eJhYxHWk1Gx@BuFai7Uu6|s6f;AH@DL9|CFYw!bJhGVRsFiy7bAD|D_ck$-Fn7Jo)d@D>@ZKF`sI*3~*&&D2?C2%>+{BC{Y^XqkV{fd!UF% z^C1Zj=8OE>9oam3c^Z6rc}{tBil}&6Uo4U6_TureK3K%n?Zm-+(8u~f5r;?fA&uAf zjW2n$UIM2Kk>)BDhFVY>;o89Xn$76IYbJ2AlsF6tqpq7TKsPoRUur#2!rgMal-;9U z)ayPtwiKeFY8q_q@AEP+blogrX}MI&^TI5i5mX2Vb3l`n0(cjzM=$Hc_q+^;kF&ag zR5LIz90s=mIYK>p*QhxB{{P>j@y!8NP<-qZ2OS(KI;(<-q4husOZVxsnxMlI8D1Rt z|Np=7B~V^>+;M@0f#JpW2vC*h`{BRn(h5+*n+qC7@#vj;g9TK9opv=o@L#kUB-47J z#NMMDBHr8k03?0fMa2SC+W0^QKMZ`j4}0|Xz5q#e`lx7tYyl05C>WpoFKP}lqr3G4 zNU|4{vO8NrHi6s%7IfSJI=jrH`2dGUC;0S_7qTFiL3MPxs3aVBQ3()bU~o9@q7njX z^ZggST@EUCjZb>?x~K$z24@^RdR;$&7#{yc*Oh}j=A+{9UvzajC>Tn4n}0KwaP)dG zzt{z?2d`BEel-_^N3ZRP)m#j(g*>{MJz5Wxu>BW( zQOm^O(R`T0!}@;FOHdJS0IHhfA>}(v?_!AFIcR#<;LvM)z><~a9WMj_)B~XA6TJJt zzwMAu_d%EL3!cpnJ~$qH#L@ha--Y`EfB5a@6aQU}Pl7H<7P$N%&5=Lv&?o+a6AWqm z`G?Z@3m!70@t0gq<1abFA9g5>|M~^x3#AI4%?AWP8bFFpr16&=PU9~*!yk4cjsN<^ z)=MQ1`1f4$WWL~HA>_mFa>}zCbm^9>@kyWVgDsaz?H!vR@OyM$^k{zc!Lj>2FF#1*FJVgKzka|``9P_#NAn>8{_q1ZvDO16Z~6Be@L)c4xY>5cGF}EI{@%5q z#$ERX{%waqCU&1V_>jZ1`OydN6a3+~L5>qj|pfA48e=2Nb%w|)3sPkJ^V0(+DTa-(C(=`{Z92SI@W(sQHrK*@#f z3*T=kU-*B@QTa0e-cz2;r&=$8HFh67>}Vn2%kOf+vB83&g-*zaC zKkq=ABfnKLgF`W|Px47$X3(Y9Aa2QVP|&`91Z|Ijny3Q&+oU`|jh}-pw@W!Zx(~iQ z$;iOaY`bYGF9Va~uK)ZD46eOVANhMhmymUz<`2Jp@F55HX^`i^J_pC4XZHb5z&j}Ca zi$2UJ9lID?4wQ&kFqLw6{6FOR|KRHdp8pTL4EX>5zi0P>myf`8^>L^rY#{SrTkwY; z@aR6j3)C**-*?!h>vS4_@eRf_ek+9o{2slIj4iiIn7SlfTTX%-72PL1nqM)NUhR@c z1b{NgwH#^uR>=o>${;>|R9p_>dn6z9VLtGh8|3$rWJe2$(lCg>5uVjV1cBUV{(LTw zX@Vf#7kLUb`8%Bd|Np-O7u*{6V7}nPeB$*6kUuj)rRM=q zw&(EZu2BJX!r{3U9{=z<-!a57)G^EvR4O=lbbs{i{^{9$!n6B@Pxq@AAuOOf=h8WR zyUjhj<1Ku(zkG9JNptM3_uy~+2nxl{5)}hb-`?WoIZ&_jya)5i?)Tj;r&)YJ<6fX) zux^*r93W2fY6b>|=9<$24E!yi;hE-|(>#nN(%mknc|5zXdNLpJ==D)C_~m5<^w+6$2_~wc8eVL>~?qXWWE9_hBZ99 z-8DcAh5w>#MNAAYBAFQ&{vWrt=5Nya|NsBXeGCi?#s^-4#{N9J^A$X`-@Kg905bHv zFY`$!xNkcd7#Ki2kavsgzqzp}l-L_za&0|OV$yvI6fiEQSv;&?6v=~v#KZbUu^33T zfThc6fl_V|lgHBKG*1cp|3i+}7mChU3zvFyANTlwp!>WB^8pX$lg&1V8A=4YSq^(x zzbKUlnO~~@TD;et(X;!iW2d`^3n(l%GWs$far}Sb|8bXYW=GJerlFvO0}3dg-WU}J z&+cdg&+cps&+cLe&+fwzy#_8 zl?Z!uOMtqHQ<6Yc?_rPD+of+owF{{72engQh=V(>;8uswi&@}qX({^)Pf%wXr9HZt zi2-CFtT_wTYt000OF-I!EhkI4Ud#ve|F~G-5}WffJz0|15uzgC(fr1v z(Gr|)qM9ouSV}{>9TjX9SSL%CaIxP1mGcbRqjNL>)s*HQ$pI{_mr4XZm;)_5x;-^s zs53AyyjFNE_l-fIMAD<%QNyE~17tX_M>nHKw}Zfc(cUsp)q2F^u*d&L(6I67zWL%5 zBPcWiB3^TPSW1-$d2|PHfSO*PdYwQmc!lW0#s^-1JL8eeG!8@Kqnmfed|rm;pZ`nrUL50OVCd%Un9s{#e95Ex#*2TPphS1O zM8u<)_0ScN2{%eOJi1T6I2sQ&1looLr7vMn0oQtGf)Sp%D*q^`&{d3?AJtJi2dybSQdsUwB~;QOSSYx#Hh{&@jP0 zkM6IpdAoU+%>()Hg*?cn?$a;6$1yN;pZ_mfo(*a(9|I=~&=?p}2Mrt#&2Kb7ck})G z|NjLK2WW&aZXRfK^M8q|N3ZCj%e)NTCtjT90K1OwI4kQFUeM_G{|$_<*=^B}{t;NFl1$UaD4!}zvGujtXspi$QY9=$xXJ$iXg z?OMRk!0=)V#45r6tmiKCGW{F|}pGT1gQm~G$)f|%1SyW%o0!)sZOUetLL$`|xsGpk<4QW$@>OiDEbay2W zXwvm%>;Dq%-uVCBzhA5Z8z(Z`quU|DqnBrbN3yGc2lGMe0+u>f>jI8Cw$|IFS0Q6! z2AB~A@vjGHFymJ>wJ-R=|=_9ov6db!Vczn8Ff*TPZeY=17bU%7=haJ?82xV~T{@~Lo_Bz`$*nD+A8Q_$ZUNWUlO^Jwy#YKP$xNQshf2i$AM|KGB;sg&vgj>{U~7F_I`OrLXSXW@ z$QsXNpAG?!ZXQODPCihki16q>1{$--0EIc|FeU}08WA(EBl*+8qkE1DD6ji;|MKYm z=-Ca57|-sXuH7HHvw2>;Vq;)%HNNE1eF8L-_XHg9^&F1PXa4&nM+>-iA93w|(|xtq z=|8A1-z(L9!K0U@-_6=bf~AfdL~-!<%>mutd#UucZ}%z3?n_?1Jo3J+Crbn!yB%39 z8SCU6yB#?!9a-u{U91gj1YE2OS?al5t&g~LzjEPsIrRUKNAp1u>#Iel9lH;KPJB@S zSN|ZE0jLe&YJCLM3~=Ok1zp;!;n?fS$S>fcqTs^sdcmXnm`i7fiUq%bkBY%({(830 z{PlhU7%hfg=l>qPETDmic3qov!>o-J#_ky{uFFI2rf_7<{^Kf*XGP0v-bVf{gqE4hsB&o&x*=9tQk^jtcw& z4i5Z+o(B8^9s&GLLhkskK?ZALABg}(QE0T0@jz`!}!dL zB0DBfKON-dSXf=;(S6gSQ}D&=pa1`RSVu$@bH7*sVs?8(yk;^!>Cx%U@uD9j&>0co z(R~<{yWn{koP9mIf4;~ADX^}HC^dbN3}SW%M0m7bDpB|7j^gmJ{#C-|(S6yY^>&Ha z>$fkQKnlQyfpRQpZ1(Vrx(HCDfa`l@kTj?W0!?s$$D}k~@I%Bhz||aV%na0~`S#=g ze~-=xaJGPr0fEFpW0oGB5g-i;(T5>p>jEB~84@0y1qvWnJ9u_Sa(IF|5+6J|12{k< ziK}2{b;nw~m!9-?|*s{kJ~I-!cW%r730b?4I*I0Hh2Q#@wFP_xM{6f|`lhzTJDi zckEVS0FB_Ecih3i!NBlebZ!zTL4a!P(z^em<|#}J%|F6RbzOR$**&|@d-RGv>EUE} z@!SVA+E^myYJ32!`@d)^LZ6#w_c5Pd+vW>T{(H8!fb9k?>+rOG!{3_o|NnpA_AOv{ zL#hk#S%VRvLJS;Hi1N#$`>;>1tu3-Ctp`dtJ-Sc-7rmd##NgR|70f=I3TfD{@aR6_ z+1>*-`t?$1Tgs#RrcW=gM-L~1@kyUvR`VWEKTFgC?dpH?(Lb@WXtPqpfKqfhYR*{_snZ*On0UrNV)sPHw0viOW1HtAz z?B-193J4R+DFZcYYpo!yOU&b=&fa~J#&^Rj zT#y~jZ!~<9J!E`A6+fe6Hw$C)kAJ1yKHW^7-KSnOfod3VriO$QsM>e%?7s0L5S+z0 zJd&MdK)J}F+l7M#9LS*dm`8Guj7K-4OD78xxK0Pp(8 z-n~4hy^=))J((|gSl=q*aQuJJ)%rxy3s8kF?AYrGTFQ3HsoO;Y>e}WL|6hN7u{ju2 zltIRm!EGGSK$Zl20K>o+R1@C-&$_-e{_mSy!Q$Hbzl8h6|6l+Ad-jU3zh?I6zV6X_ ziN7Tuv>r6M8Y+JuEYAa$Kkr~sDZt<2$H>57Sj>gl*Km0xJ9Bt2vw3uX z_{Q8&V&wRZO`t@_qnkDT1TUyBTcYq^G$#X`o%mZcK^-p8QHcs5Mkkv`_lei>-TRH9T5R^0#nW5J`F&$Bm-;2_I6S-kG+tDF03F8p!6Ug$ zqV-z|=ZjyU^xZ3C;0P|4d_k>2P_BIONQi;qwErFu|K|Y`EqaNKCK(ogWz%vCskV}D*V|ltOIl2vBaQ*oIzpF>( z2Plm&9|qY1TD9ieeZIp-CBU=$8f-bKPbcUk@Xj0+ht3)m3&@b3kBWw8_gPQ{tnfnb z8>pu_2YiUENAr;cNR&Co#K*-RK6Az)G#JS{y*Vm3JR0AC2OGLs5A?&DeF7fcTR{yn zpYBIK-D^Py+=99Woh~XF9^F4dqX!k>k-0NIow*&J-4~C!s3b7>c7J@~#?Qde>7tU- zeWUrufBv2d76t}uHx~Zhd=>@<$Vdo(D`-5oxn6>WzZKMl>vo3@`0&97eE8czq3h9H zZ@|Fcx)oIV%6$0$-=n!gfq}neKWKD`2gL8LP}T}puFwEAm@{55eEh7!9MOF``J2#XhUzzk4A^EmDR zo}7B|l@C0lDGKV;UE~L``CHPN85myLF*7i9$Ec)ucDr$Sbh;k!=q%j<^EqgZ2FMxw zts6i~3$gedbTW2x9S;M4+cD7A*;dfdt4D9>4sffg*Y}2R_c>5Gs^HRn_yr&6+F=3T z8;~i9;u{=k{B;LD^Vj>Huy*~x-`vUw8uP5Zkmku>chaZRx51;^^@K+^gGX|JfMfS@ zP)EkI+mXYkm!->*Ux0685q($`0EaM9DJc*eS^Or zbSkzdvmb}6@e|O1I|oFv({~0)fk&t71kfsqp9~BP-n}eK_yt%R`2}5nbh|VPbh>hQ zbh{gPBuDVPF#QTD+dNpn0?emD^;`j1Lgp*ztZ5wy*VeanR-pAk1s=%~FWA0<@|3%Q zN3ZV>59S*l-Irf`~|M9Z|hGx{y*YkojRc;$D`YK#>=Ar z|NnP^?=bT1J_kC^x55L|e05RD@a(?Q;i3}J<)V_%0h;UUcI^Ne;?WHb_D;}{L9goq zkdTE(uj>y`OT+-g(*Q@oi(9`z?(%H_#rA7n5b4wH+W@w~@&9ob>)H?eO&y@75}WG( z|NrG}6TkOrUYH^DokPz)7$b)CTtH_3Z%X&TF3CXI_97 z`*rn#hUk2{Pk>H2&hY5I4k}TaPyYAmEK%|BfQ^!L`lwiR`luLqcAo)xPy-~P0BR<@ zxbyM<|JOF4bXjKBuoq+&1Ai;13WJ0cC|o;pR4jbEk9WF&^k3CsKMHMIu zN4|mPtI~9jZeIaV|Lczzdk{rbbnM|xj2_+RU)*>JN+iAuUKoQGJ@twn`NqxQ z(d)b5g)<)m!~ zf))>h+Xu}R0t_Y5pgHK`NKpIl#*1>06D%VHN?aT5z(c>bjdtLnU{jCo78MIn`=$G= zOJ@l*MrK0Zcvu) z%mGb;ho~g@fC_xj5$xT^JbHUnK+*Ez7w9@%0SE`ZT<}pTuxpF)eEk34lle%AG)#!=#m^65 zAy7-Cp+bP6G}iGOyF+O>QgDJQNda(Rodcah%)!XOaLh#|0z?Ebf=Gz5D1e(MCw!Ps^S6NdrXI<0EZ|lj zJE%T`wap;y+J&G3fUTi~3)Fap?AP%~&SPnPTf+U~2B==@mC*n-67Rpb_x}HX&tyLq z59Sjd);CMc;iiJ?v|b%>Tk^eUavaNx&0vke0v^m4KnuKHh}(c?=va&oytdrHG+f#AGSqb8KNRVF9Vx59%CtAAild1H=HerW`;WeGgER zF#yzS0fkmPbdCgR%oRF+8Q=lxxqS5OJ^=}$7gL`9|Nlb&1t=>+2J3cdGB7lN){DtI z?oeZ3XlSl*U???%RHr3+mg1!X&Gi!erTiX^^$DN>p4ZGSmh2^>-OS1dZIxIjOBQi` zb5>!5-2D2@oh6OG1vFRLT+PA&=}|QA0cRTq{?v+(zZfU+TI()FB2_cfpH!!M4oFfhE72lY9`OXXa;{Vg1u zfBxt1(E+Km_GaPlRRX6`e~s7Yzyr155}x_h|Nk#vfo55&c^FEq!EOds5k=x2$=M36 zZ%g=J{CEqh9*&mEfr9|70^}?Hrp=&4;S8!WRx-d_I2q0L63j(Ojr9s3MP-rT>NPoo zqxEfx?~8+PK`H!#5A)R$2mWn6;LS`v-RD4MzHj$&P}36B)Bv?IAyvSkZb%^lUUJiY z9$bq47qyROVt8!_%77r%KA^^k3%ES%ZUG0RXZJNw4dBszzN-anMF)5^C`Lu$Ma$R! z|G~)wG_V=q*&VIm*`2N7*K#cAH z1&{6^4bb3k!ix*9Kvq8h8E4^RSszg%a~x8!fQo?^d0_P(1s3#(Z&EK2Jji_ppr-fd}|WS0?=I!0Y2R+kR^{1poWqA ztN;I9TmP3@LKiL=HrGk8lxlaoLHi?!4uZG`s4KevA*gaL;Q}>J&b_dF`2YWlmdBu; zdxgS_>c{{8`*dc2+oJ{^$sRJE-E1DmSr{RcexPyU0#H%t7z^r!!Nz8Nx;Z_&Z|nq3 z4?7+QwX+x;EjddI96=M|jypibS*fyPx1)li^#P>WZ~>2QCk;;D7~b0p~-AZcyb4N`jza>@zN) zu0OP`zFxVHZ2TH=*z4zm{|9UZMgT zpz-M50&etxZs#fhB{2=qEjXPuDk?8|K{G0a5C8vfhRpG&Jp|3ufkL5#)zSJ-y$Zr{ z#vsQvAAydhKoZ4^HV4q~Ndt%kjUPhBDB*1i(7d$=XrAteXZHz@?oThw-~9g%8uat< z0sGmb`)v1(7eY@!(Q+JIb)9{&;PwCi);H>uT|lilAJFw-*I(=aw`xzrHNDvU`v3pe z0tkNgYtV{#P(5w|S#NFts?I^PrwX8Q3RDwFfVylP$W7_yHwr$WDb$bPVX&Q`eOpFP zjNe*n@%MqcBp%&v1|G>3JTI)CgSr6+SUi}2fWKk8_$$KL}QmIoCQ1&&=uK&c;*Ib#pM_-6;I zg+Tt~Kx(sq!r%CO>WpW3;R+FgBrOXt2a-B_Jvcmi zMYnbEGQ4oS19EJM;{T%_&BsKn^=md6ftP<_%p`AMeEl4>;;j3E$NvXs&Ybb=KH$@R z$)o#%YxhCV|BudiG*@ykc=WQqDB)!A;CFT801Xm@S8?E8{{fahgIgXn?*xio15kI# z0<=cN!J}Kqqx;~CLwEoG|9|1d>${)=_yp)i3JZ^JA;%q{k^L7-L871mZEWGz0CFa1 z-t{JEwJ#@VNr?FiWh2mvk_<-BJQ2GcXrAbUNB0TPz_W-?H?v3g)fXR)7#Tp5Zsy0_ zIT&ADwq;;=%>`OC+sSmyiGu+Ye;6SKn-7E7coVc%g!9ErTLy+>&KwLL$3fEt44?>y ztOG!7aSH%X)_>d&Ds@4Vb+X@>1WF`4xac>l?M28Wr9yFf)QC^2e)vMYG-zyMt8gMtb?Y3AV4 z>%{zD^q?oCSx^8*o5Q1<`GunjNb3ubdnR1X z&)q;S_m+T*aduz-FX{+#B4}BQ1Bd~$1Jo*ktab1Jl^8#FX@EBGc-?#y>fxOfd8cMAvK`XqE zxq{SqOMsF-+ka7hFA(?ii}_}Z46lVjTcb0;GTkmJ0iBE^(d-P0)^66%m7wK7%@6H8x@D(t01fQk@VI=soBzc&a0Eib z4m{-yN{EoTr0$zLL3!kb9n_F@U_)AOdvxC@74_&9wF4U@YrcV(VLvF}zZUlB6*Yti zYJmhrLACrtdymVfJ(_vZ?Ct2Z?7{) zr;Cb(XK%0sXeiLL*PG)7cn%d*%7Oa)yoT#R`$~9?Ae1qLG66XNn%1G^3)19)L-$Qk zt6s52rNVI=qf1ALNL4NrM96{&kLFj*CC<&SSW5VsU$K>NHveMeZv{;n zHos)zZ`lG0w!|) z<`e%xy)V$JQU}lOVh?D~3*0O{3>x_9=DoX~lfmQQL(m|?Yfj4umJ)7{<^uvA)(1;J z86N;8aiJGh#<1{v(Qe4d@Oq_3Zv}^|(KoPfUMqR@+G?!hWq2*=(Q7LXVhDKj+RA|# z>>jP+R|~404D=O^Kb5QQ%C;AcZ&6WyYo3fy&wb6=5!8*=HDEpK`&%27#X@91Ug+* zDnJ?a1+N7o!*K_J9#HW7<|sAv=w@XCd-VZ}Co{W8H}9WyaF2ruaSadagC(*a%?TU~ zpa6LN+M}CwVHqgC*xfWS9Ue<51?-3_Q9&fhMh;{<<0;@M!+Q=*U0qfGcP;5wuaY`KK6v`yB=bh8->q z2@L#;Pw+Q`R)8Dbb~XOy2->{jYtP6qq4_^k31{3mMdDJy2rVU~9LAmw}l*i?Bp2iw!j@3>@PQdv+gt{j~W%clqrdpv1wy z_($=@7nNq9G8nYBqvViJuc^}-P6i)KgHkn*Zr*=uI2m4S1l4k#;7vG-e7ad*t>I(< z_fk*12$uzw&)h!UtY<-j2OqHbFdux)X;}%*4+jN2txuGGGCm2O6ixwE8NGoV9^FhJ zZ}7K(>X6qWmQ{cFTm3bDikHFoHfW}cq4hv1`wq|+^w(_G$7?ydk9V@(Ud7Ack$hqoXhG+Td-~uyvy=7g zDqe;c0S1f=9+t8PSMf5G>Vp+@+O7d9?>_%x3ryu=kV-X(%IP4Ltf0C2QjhM}9=)b! zCA|_2Oujw(=0(j$(p_jB+V)TD(bqgdK~=4=F@4y?9qL+`GLJh zFV6wbZk7uk-99HYJem(Oc{KlIDrY;+2JQs^KkC_hECRgA2~59dES(2g5QE%?L)w+x zebA$qx4)Q|!6W-XgakxFj=0zZAiy4nCBZKj6k8a+}D?!U{dAMJ!14U;y>tP6= z*`xWO!GFg9dUW$HS;@=rLR}w}Usb2CkE%w$d+c0 z-q0r=y{-x#ovuGTdVM8!fbv+U>w`|$Cod-a`~Sb8R)C?~Re|5tRRgpK8#J8`E{mbf z*=9=ykM5tP4*x~p+cGgU)C+*7!VOA!JwVlx@ug$#0*tR&Ji5abh7^!t+EBJM7dqU=g|#52LalqeUWE?t3L`J8GY65DFTYC2{ufn{@)HBDDmpH z)~@DgP8MMB=q~2)=rnHqUuOmy-z&8PH3iN>h9SC7yx8f+$YA}WgzH1Iw}=3!5D@Bi z7MXDH1=9+~64npR$s&I-b0{L+fqFCo(2z~=Xih!A;L&}v+4lcBUIvC^t```NxxQdH z=K6u*nClOQQUQJe)~+I6kRan{{(9FNpyoZd@yQplpf>f7*G3+_p$A?_{0Dc8S)0%Q zf2{y<3-<~}&=!`{FLu~6f>yW7+JgEurFV`0H`KmhD&_X*c0JI%UxdVLSPNcs2we`kb3L+uZ+;1{qUsNLKdp#o}J7l1}hYE(eotOQU*Ze)CU5j5)T z(fq~&l!`q-i*DFo?EU-y|7+jwK#}f4D$JlDX8m>uoSh$W7lCR?BTz2^Jg^!8O5y>a zWbXk==MkWE4$c4ppy&o?4}}+ce?j9PM=T(7A_CyCHt=!`$c&MJC+Li_Uq0OrjsJt} zXKTIGeY_M_6PK#I*ry3^dvR-kIxirvfYww(hLU39;|{yF{;#+W>abk`t);pPig<INLCnG4`CN%%}U&`)j{iQ_u zwQvWU$NyuXj+=%JR|%`*|6{LDJ9OB2cK-osI0ss))P4MAA*5bwexm^@(+;M;xBvDcBQ`3GZ}G-xkf_eD^Bf~ZI?d-RH& zc+KqDeW{_!lA%-`rdZsw`+A8d}z59~d=Sq^*m@*ME#6*=Mf&B>OrMC8S64R{c} zP-A2OZJh>hD9|{3=4CsMeiN)r`Ti3eQ0HG9<6&R`6*Jr~KK%UuACy$!g)Xd2g7+~Y z`|v$>fKN5}|G(a&`=y8Vg)%|MV-5z4Mh6^^JLvF$7NEu$|M%!M5%RFy2|6pJl+&Z} z9|H>mLm8)s^+ph*oMi*!Yje=zEeUYv5!`T*_2}*eDSuI-0qW_`1+g8rGkSDx1!*xp z`65Pxk-?!0THUTc4B)y+~4r2i$s9Muyi$ zt#3=*9D5!9HUCg5vpwc$!02jx^0=c8sO#)%d;rwq)-XQl(VU{9z+imo#bFgt0qzaj zf5qQY2cGa^_UL4MSq$1a+GV2R+3Tai2x@NfZ#&ri!=sbSwYQGRk^8?x!#`bq*B>Qp z4h{dbOF1373_boI^yuXJe)RqS|NkKu^Y*%3u;DD{bl~52togu&*K)mX^KB$y{FSfy zdfoQhNS22}*k$0^>%i#I$qd=P$-09Jw6OmzSes8bv+vy5y zC&X3fnh#!ht&DKhx#oi_UkgKA1#$kcq2gZroF{{udq%&%v7_B#Cc=wx^NG26ukF5QkM4qdN2x^Ft}1J%op%|BTA`%f}3FqG(m`Z+D4 zpoG@^0@_`41g$2F1(EzMzZn=99GibI^0)2b%tCFrh#?m!LjAP5$t zO4vO3_Zz<6z`xz_^=gnhP&o@%=g@K-W+zDDKEv1T{M!s)H#s)HVB>Fz`Tzev#N9y< z788Gq$N&HTU+RNfe~uiWHMyXL=%DiDxC1ypdUQK-fQCvz)2-kP`NBjIRQA1`3i0rM z(6AZYeuS4xI6RUKU$TL&B`|#XA9Ubgw=;)FuXjN6qwk%;8Xn2P1~2$PXF#-mD`ja; z*0_Jn*@wZU>!?TfX;15arCc7}*Is;MWng&C-hJ(bFAD=hx3k8<7wjt-OJtj?Js3dC z*PR_2EDTEcJpOw-cyxO^9Ah;2@9eRG5ma#@hPMJhojLFrmt)*v==ndRX#kX#DMYH_ClK4xe+09s2! zl{Dbf>lonDeaf@D0o3dPjXpvLLwJ3<4|sGp27u0ex%k4fH{d^LB~xdhgHQLNZbyUG z1NE$+jR~^)L@1pqjoj(8HtC(E&7d z1|A3Z=x&T)VPNp-KIzeXFu<|vhD-M?WUE2jZs1n?^g90cVLss7>FD6weZdiK_w5q* z|0f(f9SwGzJ#*%aI)~$A-fOj$MZxyH2}w-?Fi+%%#J~Ac$4fYld|OfC$djx%f{Zi5#~2}JhxD%S01c%!zF7duLEWs!<9Q+bJzFP$&MX8S zo^aEryO6`D+XA$fLIrf-SGTtUfA|5PZf=LJ4<6l?zTKQ2-QE&D-IAcmK%Z_w&@5wf zii!h6bBc-wi0}as0Ssx)DJl^lW(Gs^(hkt{iU)X6S+9?Z!Z8;W7tmtO9ELRh`qlzw z1_qzb-UcugqM`sg($oMn%wX{Xw7bWnySDYxWGtMR*D^wB=#*u^5?@&8ZqXj%Wvn4z`iy`xp9^IK7 z9^D^3x*Y{Px_^OYm^}WU@a**d;Mp7e!lOG@$8jU0Be?(J+3C#T(S6pl)A_{E$IM{ zmqX@B!DlRDX=8z!lHh@*&IA?)hUT;XjlY40A_S0Hn=h3>^UXpZz)RFye8GJ^Zvl`h zSx_nfbrqrgL=YDo-7mj@c04p^urM(EKhO!Ln}0Czw@hSW01Y^&g>W)-7JE2!6sx#& zF?#$z_%eivfx)s^fxjn)iGjhf*WrOpRJo8R|Gonr%`X(1AJjW``M5E@W_IX0$G^>4 zg@4;g&~QQXqk2dFZ7g9O&MGz>{LL94J5PYl@dPc!Y<|he-@*erg9F5X%%L%s#DOLX z13`owh~RJj$yizk8rHba!NBl32gEuGYTzb0HvG^k;q&MXHUNp~g2pZVKsf-`lJ92h zbT()`P-)(oZSdNtv)JHe8>mA9(#7V{8?5vC1iEUS)&rHC&E6U;-*0p}>ug{It@jTC zjbt7L#TSmov17vzg%StHh9Al$hK>zCv`ds68-D1P2s<|XFyLQgGIRp=&-5tFIvPH7<~BmIa~U6pK!50T9fI~?JnWb&9Q@_fq@~-sg=dCB+R3` z8I)#xx}7!T&C|D6?HGk0by zfJVk$x)?nEAMogO7I5iswsdVdP*Mfc-W|-*?IAMZ;7guw2hmIwcjVu9!l(O?M>p8; z7yLL(?)6~w==6pe&EGov@Bjb*A&GG}C}}eBx0Zo+dO9n-tOT$9c7}Jhj87tE0C1lc zv?>5JCZ_P>gfM96!0!AM z6kw$&8Bh&eOnZX!oIZ-R-W=fkhHkB@Fe5|v(U(&|IRflqlw4Q^$%PLB&~u?JEEl?x zp9|ALc7k&uXdOK`7lP9wC>Mg35reW_5{L)|5lSFJxcMg|f2$9;zkB*cFX(Jca83lB zP5BxvCocZ=|Nm$W z0+OASJF^vD%l&s&@c0j^Tfo`UqnpE}gAtaS{xe|BZu~8vDRL^AjGo;#VP>~pNOr?h z;DPcQY{Ua!CUh3Soe5vQ{qz4ncWkAL7F-H{+P}ssON6BXB!!1Yo!QCtwP$H-_VJJOj zzon0Xfx#xDB*!MJB*rGE#KfkgM8&4OM8u|wzZE>VV%4Hh}2eBffzQD6sXWal+2c-=~;qsdFqHlX8D1$nCZIvJ*D*fbjslKd3^vB45{?ZOj7Ft`p1lrC z#~n>T!=N6WjsmYOZOkBYCZ&2%Ic`t_2Fc0lMA#^li+k*16lemk=l0-Ve5jcHxT6Ut z1N8VW(A-D!8{F|QpN*1uu;m+#2SwrskK9B@&>eS2iGm4^*IY zf(!I}pk&g0`o#)P28NfXz?vfXTegE4Q6;j?KNCwHH2+M7?D_?5Y&`wqCN~2E`1n3h zqw5O?1H((uYQ5&4`Sl?s#?3ENOV)#oUj-tTf^6e&{>fTe2~u3l!@%%5quE5t#u9e^T`$=?y)_`xEieE7e{I?Pv!Fz#`DbwnZ}ZR6l4I8AN_CAd zy_N!*cN=7$#BpZ>(0-ER&L*HV584ZG`bFT||NmW$--6C@HahTfE9d}2i);)2)|Jel zg9y_)U2k-_-tz4J+a0U{8(-D|G1yixmarXjy`lSB;+wMugsuIWr~43iJpku1*Bc7^ zLAkZd+p^bj#ftl-JRn`HD;OO&FqSgAb{*|?+`r;J|C9r+EeA?jS`L&*A9Jz2VbJh1 zqJ*{Kr(-Fz!?p;AjuP9O9?i#@T)L}uT(qk_T(tjxJH%6(;L}~q;n@8ZwB9-dS|?y> zUHMpMaFj@bx6OlFRy#o(LSJm~0If9rUn1V^tm5_#|?)3<|+rGY-($sCT|e?hKxMKzKWYGjG1Z}$<;Zn2%9J$^6Ppe_~d<^wsD z4dhOq|HmDz|JNLN&D_lQ-^C)^hrb1M9G{D2wg-Qo1GqC&&EaB^4{i8%b2BjbbSFD> zdwYQD;KmA`mw!R$|ASWA`E=&qaP0otdXm4z2c)sLS^?^B@Z~PPy(ub8KHc6NKE19t zJbHa!yx8Rent}(d&-!2D2%1Vk^#mW(6Q!&!jO?#PpaFBxB#U9&8DBHI z8l6OxjwivTqm0ur7uE;J#pCt}r;Zxdhn~#`n7WH~9JN1a7khvT$2eExlda$C!n=bN z&|AVn4V4lMB`p6By=HDc^}jP%;k9C~6Q~44ZD=23RDc$$9{(A-gB6;8{VxHXnd4%8 zu4au-?_zM#*jo+i@`87HEBJs8n+kmZ+L$(poq+*bO`(*1uEqyiztwqli+h5O+Us`Y z@BlUX1yLO&{#pv;9(Is(JiA#`Ji0lKF&cnb{~5Z)q3$@~VtuS;M?&d*1hoP^?mT-oIRqfQ-&8oNFH6u#=rnRDWTeHRCFDJD}-3^0u+)SNEWPmEsLxKR493L2Rne2DT1y( z>GoD=Jz0?rFK`lldYu&@=^zX`tl-h@#NlD-Bv2~i*?pj)3Y-oOf~WO6IbJLFIx;$T zGI;!V5`e`#DCm)rfnzrZ=#W!bGFXKuabCQ~C~+W1{l>({g6Ac=10_6qoj5!?9VL9a zxj;kbe!ks-9H0SW*X}?Qmo7(3P?lB%Wp0V)Uz{bv&6Os+C4!C(FOnU<9eB?_^}uVk z4UC{m1bjLJ9a;`J@^2UHK2#!c%+ZJO;)~ZJ9=)Q|Pcbt6H-Uy!JbMF~ zJo#NOdUSJiF?KL{{6Eyi1u~Z(_J+ndQ zJa>CLc=U!#ytwrOwAstsp^MQ*x0JWpTf+goI0q!4<7uN>F5$6Dk%55$guy*Mj^<>I z@5h`ii#?i8{rC8PsKG{%q4Yawxpu(@#?D|5P(L5ETn)6d3ABeIMg_d@#Goq>baryL zrwOPHUj%B+OEmukCF5!n-jbw-SIOTFff8}cfs#<2e4)DDA!lTz4yjV}+MUE+`04dQw=4`?ES`%Vub%00rbVyRV1Wq^n zF4sW|LqLIf+}Q)v7We4x2PxRV=+O!~TK>F8Cums%Xh}NwW+Y@kd4O^)=)6ow#`Wm7 zdJzvFl<->$Cw6W6-VBG(5bzz{kpwPnt!s^E0mbGo-FYOg%7A(RVvTF-B}^6 zll`@Nm$O0#`)dWzHW?9+G(RXHxj-yg(1>=QN3yemM<+YTx1e$d?%-}`g--U@FJSxT z(A*4K(^l`%%>~M6j?F**cL$reba`94@VguUc^p*c*n-L&DNvas+6;;;UB`x($&TL+ zLZeF#G%LXE(aU?q7PRx;+rcyW!ZBwb#up;Wj0~?q`=LrfvQo#G89*j_CSQ1wrO3$8 z=?q#T0y>!xRQ{bo0+2ac_<6aY12-$LfJ%^X&@ty8-5-1)hl~1jGWm2jfYuoMbh<0} zbh~rBxT^xHklZ;udcze!%j_&w85z3UKx;==FqQH)pJ3_)bB?)dFoDu3>c%qg5~G>m z4lMX!FwBMfpi{t-e|Ug)b>9Sy8zEKCtd5M9uU#FRIsd=5_s|B7$bI+d=Jc>W?!oW$ z!KeG!i)U{b89;l+K~*)I2V;SNXE$3z1*nE$w0_OwVg0>?wVC_>YbHixsLS9B{g9T- zgV!RXtoH*oP@CT%H_SekK{Qo`wAM>&PTG|2Tfaat;JUZjRGgRPh9iSO1@TtC_y^o>6;h>Xg4|+7d z0ga`3G^g%oIOcku;h5`lhGVYp8IHMrX8_fPY>xZ_jIRZnZ5x|F8&yE7jb+?GtBs$7 zR~ujV=mwt{Tkg~8n(xsW8t>8Rn+_^0^gMc9_aAe84?ZhK12kq1&UWCj`s1#zK`R}N zPri8hn}GqeB-zKe^+3s4k6zGew4wjOhvWA8{s$T1(HY9_(djDg)9cFb(d(M-(djDh z(HqL{(F?NARo$c4x89@IwcMlARsTiZRnR8+hT7-g<;%YNn-_wT;NOPY_u!SvuRVHw z_rF+r5xRW&J6P~DSa1SZP^J60N8=Gtc*IA?9)_Lg28!z5H7XxKi?tfx2!Ib+V14fh z?Sr&JsWoU|ug7Kx}E-E$9 z5M2HX9D*-xL7n8*+a;_Xt=~$H_;!B>-D>Qa1|oeyZtw@qrx<{;xCO|G4vx*wm`b@o zG9DhS-%44Jxu|$Bf>vAyxOAp&@aS}%;nC|m0VH7H(viBwqqFq`GXn$YjF9eDP^ZbG z({+VUXX*}@&eQ{GE}f|-Tsl*4xOAl60ZlhQ09Cx5wG(_geHXZNE(M(x_aY0lV>|f= z_=Lq4(5gYuDoK6NVs+8h1E4w9-WQ;$&*y&_7+z|Frzb$CgjpXh4Qu^h5$0k2yDaea zE#KB}CGwyZ*siSyDp_4R)Lz?obVJqYxpbr$|9`CwlHLdxmGI~W8w{3w(fNmgVLzxh z`C7oG1GGN?Ecc@54+BF(jY>WJ05T}8fY)Ef#K%QL+MA&B^j{wXE%`c7!nG3= zi7#}H|NsAumDQ1#fvH3bdK1(HKJX4OcJS?eXEh-`vR$GK3=WRH9!xLheq(@cTbulv z0d$7}s2G2#{Tt2(^Jk;+r8&U&9f0IO_~mYM6h43WZT|2}pZEoCeBu|l2s(1=CWyG; zVSKPw$OF_#W?*1oXz(yTk>k&*JpJz=VU07`NS{4Yhn(%u~+{@5#J|%odf(DB`OLY%||Q_gBQrY z0PTkYiy4Csa<@RLq|*574s{;_o%mL73pxj{Si+Wpp~1dL?BEOWogizpPh5W0e2L-m zqcr}!Lx&qdry(|gRN5E4Ydi%~`uZ8j-!KgF+yRg73mykwnRqll`VTsdrtz0C3j;&3 ztViRo|I7>wMN%He4}wHIK%3`Ycr;&N@VNW{c&d89~dZ5yx`!Xmk8N7ID0}DlIP}@Rb zCurv2MX&`U!za+8mkLT9V@UTM*4|6jlvrxmMoAp#RFGKSKW*cVy7JoZNhL@m;8gNj736JJC6`r7W z9B6w&Jt*W7_`@&pYrOcxFK~fB{2M5JT?Adj)qN0@#5|P`KoXfJG%J0m_q0Ax#s>@7V z6Mv+w3D`N2tS(?W!d3@N$FPQg>Bv8y_#=;e;*YVF0rMl!#3P{MF;M*o^*m7ZB48RM z9%1{!2;_ATJMIU66KEm?kO!5l^<|tM%||j`mN+po zH2+F17KfzCRy%NxVO4cu1|9g3ak%+ceNiR9o~VEeGeZ?uDF>*L(0nB0Fuxx7oQf*R zQm9UEsLt=sP@PC=Z@nQW!)H)}gQUIB{DL7W2B0k#2e7BRdhot*kS&@epd@z-n&QM2 zm>HUX)fFj!<`+<{b7p4v%pddkGk>INo--)bAK}+{@tHsH4Zp@+aEklPANlw*zksQa zAt+preCCg2)de%peCChj)dM>!=EG-x0ai5#``~B($S)#1{#2pTf_-al!m?srLTySpZH@A zrtwFCYQ2oZpZOzhr}5XlP-S5F{~vBj8h;)%;e6(gJoK4A;_PSsh)bXOV;+3wk9+u; zKjO(}{)juDAqfW*cZWgs?Gt^_;cmA-^GAOA%pY~@6Tg6{q5&rZf7CIs(?0RXocP2a zbMq5_%;hxxs6$|VpaQO&^;8)={n%qqKd9wj0Dt&NevJ>G_ytbzhd%)&{FB6$f1s{O z#>?0Cpz`lAGXn!Gtx1CFLk);K!R~?;eRCN=tqMKU84KBwO1M|nkP^-bxBn5CfNgPlLzl>IPD z2`Kw~0k{Ob_lZAJ_V6Ka3HTVC%fEoqBS`ojzs75Rjl-Y#BXy1RK+cF{bpq27x>{g5 zhBXLGN51~VA9?r_e~hjam>+>A9sw1Pf$B%7=Ypyi0@EPz2;FD8V7p#_;*Wb#l*=D} z(qk8>aRVyBKJg2j0Y&Bs59LEBg;&HGXaNQ)us{VEsO8970x{|7C;qsbp!D|#%!ibf zphAvcS&aY?c@5+RvEE1|r5JeeMLi?ZtF7{vv?K7zM#a--u ze$inKaw5z=NSSA&evD+cCAzW&S~q00wn$Gs?uN#n13 z04}SLi>L@tAqpy{K*bWMn7RQnlog`!>1Y19o1pgNPi;^TMBM(&A9EN~l<{jE{LCM7 z2*mshOCF#3BSA&oIf#dOjif;S0+;*n)N$raH>*?;JblDtO&=B>yFdy0|NsB>kgm=J zevKQTq&IP)+hL<9s=#S1GQf~_j52n8$b=r4xm(};Awq;zYTP;4pf{0 zsTl|E$GlXrW(4(kWVdK@GL%_>D@~Aj;xD|-A;r^YEl|M2x;-yUpu#;U!l35TBrQ;$ z6wob#(5A1zbll^Ype44D76t>uXM28)#~#)P%k)5Hin=yPON^>Km=@4whtQ_e!CE6^ z)8~N7pSZ`bOJMq+*@HBzed3Q%^#V&q$U1>(0bM7sCIQndFdg^!wLMJJ9k3>?Py7P9 zQ^ArEk3aE8$nFHQ1xyXWbd2iH*-+cq_`~1whkxVOxblfV@(RDkElA@>RsrniL!bB~ zc~!xBKux*`SwS#6f>#qvN8b9xA9)I7J|~zT!D|VoF~uSFBE%nRf!f4N&6=((CMIJ(UknPx@HW6X^U3q`k`U^*+sS z5rgCIF!);k1&N$~F&iY(%F4h1O1J^Ot^Z3kLBlVdcA$BP*4z9Y0Za@G;Pm-o zg9#*Qo_NO0@X{A#Nb8eQSr3q+o1noO(3XN1-6o6-2tPIc{Rx1)Uai%#-^7s75&e+7!zDi9Z5VztkOk z&Hsr%;xH&+4!&mb=;aafY`qIoei)(rb|qZ-afI^YAmui~AS3^$`S9l*^f>t5#N*&g zlg8(uaBO@CBDH@u|F@_!_GrCb32m5eGKTm*N}ZG8r9TTSP-a7gKdW&vytDu<+5i89 zzZY~AHYgZ7{(}w({(tWG|NpfrkWkDr2A{50$qQ=N`I>Vwykuel51PIF1-dTbKhvN8 z|M`1C^(t&Q#lQ{Z))O!;L&GQj$n&2Z`Qt!iEOn=RKsNwi^yoh2qkI754VUhd%|BDh zqmtN?=t_k|s)3=9m~2b+JG)v>yQ zmKE$w0mYowNsr5~e7Y|+KVk&Uz%gI)!lKIM}Cb1F8mtD`89s< zYrF^fNe$M@adK1Nqh3&aR+D^2-K_%|Mtm|U*N*} zouGD`&e>ka51(B51$qvD*ssFi(tV=);3p4$tq-7dd*Ty+r0HW5(7{(POjJRs&PDrx zWA}lX+J`Rw@JK%4qJ6-l@gT@-&*TFhtRRNR!G|Uu2OpS#62wb>ji(^`z$gAlkSik} zeBzIM@rgh30l&swaEBS(AUnXXam+)Nfq~%%Nb!YF{4vlTW#qX}{4qB^@kf4zwCn|V z`%S)8{I z{2GwXaLj3tAgDV7X~lxQjgsP$d)d;}d_xdr+bPjZCoeD}%yEfOoqR zCn$->fSRahUHCOl@N2vTB`>g|B(O~ayi6e4ksn3TCl~&Rv!F5sln{9ZwsSBz@@pJ) z;n(m14Um?A`lvN34zSfv@T-Si`8Av`K(|dnPKyI|y}-De)hiQT|Ezby?7ySdKcM+? z1;-HR3Gm>?ih<`IP{e?nJDN2r3ZNP|{J-aZP{STne|+YT`uUkZ>I1*Vbx@+c&aZI| zL|+D7w|wx0iAVQmkAv?Z$rn;3`E-Bx=zgvJ!B_c+fX}{2HK0{>(3MB8|W9 z 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

        !=sm1 z6y%U@*BhM^Kx@b$;vFDY_j);jdA*?;X`LOQePJMOT4%>0a7E=S0pfZzFIWKDH}*me zw4=J$_kvF^Xs9jpibt=n#EXfLQYZj)jTtySNrBT7XoDmls7u;?`o%O*dD;vbVu1PA z!2>iT*XjELGHNHQj)+5AcG#PS*#Wu1`Q+FzZ90weTlixPi>;_I=^e?OE`` z62Xahp@ZNgypTt5GF}KFI36!p5uAV*KR{bpA*NNlcn#-tf{uxPaT~!uz|6q#;`ATT z@mjtL&>#TS$PzEEfrco0eINMry8iI!4SfO*7qGjUk2pZW1=5!)Q2{RyQ1~ypnwOEG zn|G-rs0=yvzx&6FTdd&ow+@u@bf5n(>ch(j>MiH)I>F4q0N&93;^OcB|GRmMK{_Dg z9s`hS;xarBJR=4 zssVDM^@$Sh=1KvEQq~s=(?O%-^TEnmZ-Z{VIsKwx8b~XA=o?Z_8^C+L-MrlnJPgf0 z|Ch2D-+s;aVkNk@a-*BK#DRwaG`J>ieCfpsu;A$zE5MO?`h@|gb=Q2v05p&VE~~>q z$qzKq0xp|hu>Ak`A5>0(I&MfdDZ*_!@S5#~JqxISYX0%RM8u=@Kq=P?Cs6W+8e(zy z#r}U_LmWWG8p6Gx;>rQEU)y$d84p8=RyXfyd#L-nkH2Pn@ex$Ocz{gx0GZ1A;tkl% zKVDn@7hTBB$k2VGn|CHu2df8I3uwo|1h5ufh?boYEuhh5J#J8Zfd_Fw>r)Nl4`XwW zNB1w|+ugj5P;*(j55H!65f66>=zhmit`|ulV_OfDaCv0j2PHNS<{KWcK@@O12Ha

        -v&li22ibW)^P^| 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%0Dv^|gw;YFDxAbts`AO_Xd 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%0AblYFKx$#>`Uo`LfZ`cs2P|D5g^GjHHAoF|x<1Cl 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

        vlbe}WT9S$uGzPk+mS`s7 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
        DhkEwypGRa$fno((Bn@rC9~n9=tz)iuL-E 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

        =+zoqTChD00l06Rc7U95TBm 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�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 CnbwnjFg7(e;sO8*6DQ{Y literal 283572 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 z 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 From 572bebd031a6aa95c48ce11532f6d6c525492fae Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Thu, 26 Feb 2026 18:11:48 +0100 Subject: [PATCH 562/766] Add tests for win32 string conversion functions --- tests/core/sys/windows/util.odin | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tests/core/sys/windows/util.odin b/tests/core/sys/windows/util.odin index 2d1bcc0a6..638844416 100644 --- a/tests/core/sys/windows/util.odin +++ b/tests/core/sys/windows/util.odin @@ -38,7 +38,9 @@ utf8_to_utf16_buf_test :: proc(t: ^testing.T) { buf : [100]u16 = --- // Test everything with a dirty buffer! reset_buffer :: proc(buf : []u16) { - for i in 0 ..< len(buf) do buf[i] = cast(u16)(i + 1) + for i in 0 ..< len(buf) { + buf[i] = cast(u16)(i + 1) + } } result : []u16 @@ -46,6 +48,16 @@ utf8_to_utf16_buf_test :: proc(t: ^testing.T) { reset_buffer(buf[:]) result = win32.utf8_to_utf16_buf(buf[:], "Hello\x00, World!") testing.expect_value(t, len(result), 14) + testing.expect_value(t, result[4], 'o') + testing.expect_value(t, result[5], 0) + testing.expect_value(t, result[6], ',') + testing.expect_value(t, result[13], '!') + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:], "H\x00\x00") + testing.expect_value(t, len(result), 3) + testing.expect_value(t, result[1], 0) + testing.expect_value(t, result[2], 0) reset_buffer(buf[:]) result = win32.utf8_to_utf16_buf(buf[:], "你好,世界!") @@ -78,7 +90,9 @@ utf8_to_wstring_buf_test :: proc(t : ^testing.T) { buf : [100]u16 = --- // Test everything with a dirty buffer! reset_buffer :: proc(buf : []u16) { - for i in 0 ..< len(buf) do buf[i] = cast(u16)(i + 1) + for i in 0 ..< len(buf) { + buf[i] = cast(u16)(i + 1) + } } result : win32.wstring @@ -89,6 +103,11 @@ utf8_to_wstring_buf_test :: proc(t : ^testing.T) { testing.expect_value(t, buf[13], '!') testing.expect_value(t, buf[14], 0) + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:], "H\x00\x00") + testing.expect(t, result != nil) + testing.expect_value(t, buf[1], 0) + reset_buffer(buf[:]) result = win32.utf8_to_wstring_buf(buf[:], "你好,世界!") testing.expect(t, result != nil) From e75d0694ba9570e7be215243bc0b32d20026714d Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Thu, 26 Feb 2026 18:14:34 +0100 Subject: [PATCH 563/766] win32 utf8_to_utf16_buf now null-terminates because _alloc did too. utf8_to_utf16_alloc no longer truncates trailing zero characters. utf8_to_wstring adjusted accordingly, including edge cases. --- core/sys/windows/util.odin | 62 ++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 467bab214..51d12d35c 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -110,14 +110,13 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ return nil } + // null-terminate the result here, even though the null element is not + // part of the slice. This is done to prevent callers which relied on + // this behavior, and is also expected by utf8_to_wstring_alloc. text[n] = 0 - for n >= 1 && text[n-1] == 0 { - n -= 1 - } return text[:n] } -// Does not null-terminate the result. @(require_results) utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { buf_length := len(buf) @@ -127,53 +126,76 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { return nil } if buf_length > cast(int)max(c_int) { - // Unsupported. - return nil + buf_length = cast(int)max(c_int) } elements_written := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), raw_data(buf[:]), cast(c_int)buf_length) if elements_written == 0 { - // Insufficient buffer size or invalid characters. Contents of the buffer may have been modified. + // Insufficient buffer size, empty input string, or invalid characters. Contents of the buffer may have been modified. return nil } + + // To be consistent with utf8_to_utf16_alloc, the output string + // is null-terminated here in the buffer, even if the terminating null character + // is not part of the returned slice. + if buf_length < cast(int)elements_written + 1 { + // The terminating null character does not fit. + return nil + } + buf[elements_written] = 0 return buf[:elements_written] } +// Converts each UTF-8 code point to UTF-16, including any amount of null characters. +// The resulting slice utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf} @(require_results) utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> wstring { - if res := utf8_to_utf16(s, allocator); len(res) > 0 { - return wstring(raw_data(res)) + if len(s) == 0 { + // Empty string. Needs special care because an empty string + // is different from conversion failure. + buf := make([]u16, 1, allocator) + buf[0] = 0 + return wstring(raw_data(buf)) + } + // utf8_to_utf16_alloc null-terminates the result in the allocated memory block, + // however, the null character is not part of the returned slice (it is just beyond). + // The conversion to wstring will lose this implicit overrun. + res := utf8_to_utf16(s, allocator) + if len(res) > 0 { + return wstring(raw_data(res)) + } else { + // Conversion failure. + return nil } - return nil } @(require_results) utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { buf_length := len(buf) if buf_length == 0 { - // We cannot even provide an empty string with a terminating null character. + // Insufficient buffer size, even for an empty string. return nil } if len(s) == 0 { - // Empty string. Needs special care here because here, an empty string + // Empty string. Needs special care because an empty string // is different from conversion failure. buf[0] = 0 return wstring(raw_data(buf)) } - // We will need to append the terminating null character. - // utf8_to_utf16 does not do that. - res := utf8_to_utf16(buf[:buf_length-1], s) - res_length := len(res) - if res_length == 0 { + res := utf8_to_utf16(buf[:], s) + if len(res) > 0 { + return wstring(raw_data(res)) + } else { // Conversion failure. return nil } - assert(res_length < buf_length) - buf[res_length] = 0 - return wstring(raw_data(res)) } +// Returns a null-termianted wstring, or nil on conversion failure. +// Conversion failure may happen due to an invalid byte sequence in the input string, +// or an insufficient buffer size (utf8_to_wstring_buf only). +// An empty string is valid, and distinct from nil. utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf} @(require_results) From 1c09a2be55935619a6da59336e1c7e45393bcb9e Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Thu, 26 Feb 2026 20:49:36 +0100 Subject: [PATCH 564/766] Add tests for utf8_to_utf16_alloc, utf8_to_wstring_alloc --- tests/core/sys/windows/util.odin | 110 +++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/tests/core/sys/windows/util.odin b/tests/core/sys/windows/util.odin index 638844416..777f85776 100644 --- a/tests/core/sys/windows/util.odin +++ b/tests/core/sys/windows/util.odin @@ -4,6 +4,7 @@ package test_core_sys_windows import "base:intrinsics" import "core:testing" import win32 "core:sys/windows" +import runtime "base:runtime" UTF16_Vector :: struct { wstr: win32.wstring, @@ -142,3 +143,112 @@ utf8_to_wstring_buf_test :: proc(t : ^testing.T) { // Buffer too short. testing.expect(t, result == nil) } + +// Custom allocator proc that always returns dirty (non-zeroed) memory. +dirty_allocator_proc :: proc(allocator_data: rawptr, mode: runtime.Allocator_Mode, + size, alignment: int, + old_memory: rawptr, old_size: int, + location: runtime.Source_Code_Location = #caller_location) -> ([]byte, runtime.Allocator_Error) { + real_allocator := cast(^runtime.Allocator)allocator_data + bytes, error := real_allocator.procedure(real_allocator.data, mode, + size, alignment, + old_memory, old_size, + location) + if error == .None { + for i in 0 ..< len(bytes) { + // This will yield a 0 byte on overflow, but that does not matter in this test suite. + bytes[i] = cast(byte)(i + 1) + } + } + return bytes, error +} + +@(test) +utf8_to_utf16_alloc_test :: proc(t : ^testing.T) { + // We want to ensure that everything works with dirty + // (non-zeroed) memory returned from the allocator. + real_allocator := context.temp_allocator + allocator := runtime.Allocator { + procedure = dirty_allocator_proc, + data = cast(rawptr)&real_allocator, + } + + // Test the dirty allocator. + allocator_test_slice := make([]u8, 100, allocator) + testing.expect_value(t, len(allocator_test_slice), 100) + for i in 0 ..< len(allocator_test_slice) { + testing.expect_value(t, allocator_test_slice[i], cast(u8)(i + 1)) + } + + result : []u16 + + result = win32.utf8_to_utf16_alloc("Hello\x00, World!", allocator) + testing.expect_value(t, len(result), 14) + testing.expect_value(t, result[4], 'o') + testing.expect_value(t, result[5], 0) + testing.expect_value(t, result[6], ',') + testing.expect_value(t, result[13], '!') + + result = win32.utf8_to_utf16_alloc("H\x00\x00", allocator) + testing.expect_value(t, len(result), 3) + testing.expect_value(t, result[1], 0) + testing.expect_value(t, result[2], 0) + + result = win32.utf8_to_utf16_alloc("你好,世界!", allocator) + testing.expect_value(t, len(result), 6) + testing.expect_value(t, result[0], 0x4F60) + testing.expect_value(t, result[1], 0x597D) + testing.expect_value(t, result[2], 0xFF0C) + testing.expect_value(t, result[3], 0x4E16) + testing.expect_value(t, result[4], 0x754C) + testing.expect_value(t, result[5], 0xFF01) + + result = win32.utf8_to_utf16_alloc("", allocator) + // Valid, but indistinguishable from an error. + testing.expect_value(t, len(result), 0) +} + +@(test) +utf8_to_wstring_alloc_test :: proc(t : ^testing.T) { + // We want to ensure that everything works with dirty + // (non-zeroed) memory returned from the allocator. + backing_allocator := context.temp_allocator + allocator := runtime.Allocator { + procedure = dirty_allocator_proc, + data = cast(rawptr)&backing_allocator, + } + + result : win32.wstring + buf : [^]u16 + + result = win32.utf8_to_wstring_alloc("Hello\x00, World!", allocator) + buf = transmute([^]u16)result + testing.expect(t, result != nil) + testing.expect_value(t, buf[4], 'o') + testing.expect_value(t, buf[5], 0) + testing.expect_value(t, buf[6], ',') + testing.expect_value(t, buf[13], '!') + testing.expect_value(t, buf[14], 0) + + result = win32.utf8_to_wstring_alloc("H\x00\x00", allocator) + buf = transmute([^]u16)result + testing.expect(t, result != nil) + testing.expect_value(t, buf[1], 0) + + result = win32.utf8_to_wstring_alloc("你好,世界!", allocator) + buf = transmute([^]u16)result + testing.expect(t, result != nil) + testing.expect_value(t, buf[0], 0x4F60) + testing.expect_value(t, buf[1], 0x597D) + testing.expect_value(t, buf[2], 0xFF0C) + testing.expect_value(t, buf[3], 0x4E16) + testing.expect_value(t, buf[4], 0x754C) + testing.expect_value(t, buf[5], 0xFF01) + testing.expect_value(t, buf[6], 0) + + result = win32.utf8_to_wstring_alloc("", allocator) + buf = transmute([^]u16)result + // Valid, and distinguishable from an error. + testing.expect(t, result != nil) + testing.expect_value(t, buf[0], 0) +} From fa3441936cf0d3ca13295db33fca8cb217a0b6bc Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Thu, 26 Feb 2026 20:52:00 +0100 Subject: [PATCH 565/766] Fix utf8_to_utf16_alloc edge case, and improve utf8_to_* documentation --- core/sys/windows/util.odin | 44 +++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 51d12d35c..2c2b8a1e4 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -121,21 +121,27 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { buf_length := len(buf) if buf_length == 0 { - // This case must be handled separately because MultiByteToWideChar would interpret - // a buffer length of 0 as a request to calculate the required buffer size. + return nil + } + s_length := len(s) + if s_length == 0 { + return nil + } + if s_length > cast(int)max(c_int) { + // Unsupported (input string is excessively long). return nil } if buf_length > cast(int)max(c_int) { buf_length = cast(int)max(c_int) } - elements_written := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), raw_data(buf[:]), cast(c_int)buf_length) + elements_written := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(s_length), raw_data(buf), cast(c_int)buf_length) if elements_written == 0 { // Insufficient buffer size, empty input string, or invalid characters. Contents of the buffer may have been modified. return nil } // To be consistent with utf8_to_utf16_alloc, the output string - // is null-terminated here in the buffer, even if the terminating null character + // is null-terminated here in the buffer, even though the terminating null character // is not part of the returned slice. if buf_length < cast(int)elements_written + 1 { // The terminating null character does not fit. @@ -145,8 +151,16 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { return buf[:elements_written] } -// Converts each UTF-8 code point to UTF-16, including any amount of null characters. -// The resulting slice +// Converts a regular UTF-8 `string` to UTF-16. +// +// The conversion includes any null characters present in the input string. +// +// Returns `nil` on conversion failure. +// +// Conversion may fail due to an invalid byte sequence in the input string, +// or an insufficient buffer size (`utf8_to_utf16_buf` only). +// +// The result of converting an empty string is indistinguishable from conversion failure. utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf} @(require_results) @@ -158,9 +172,9 @@ utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> buf[0] = 0 return wstring(raw_data(buf)) } - // utf8_to_utf16_alloc null-terminates the result in the allocated memory block, + // utf8_to_utf16 null-terminates the result in the allocated memory block, // however, the null character is not part of the returned slice (it is just beyond). - // The conversion to wstring will lose this implicit overrun. + // The conversion to wstring will bypass this implicit overrun. res := utf8_to_utf16(s, allocator) if len(res) > 0 { return wstring(raw_data(res)) @@ -183,6 +197,9 @@ utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { buf[0] = 0 return wstring(raw_data(buf)) } + // utf8_to_utf16 null-terminates the result in the buffer, + // however, the null character is not part of the returned slice (it is just beyond). + // The conversion to wstring will bypass this implicit overrun. res := utf8_to_utf16(buf[:], s) if len(res) > 0 { return wstring(raw_data(res)) @@ -192,10 +209,13 @@ utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { } } -// Returns a null-termianted wstring, or nil on conversion failure. -// Conversion failure may happen due to an invalid byte sequence in the input string, -// or an insufficient buffer size (utf8_to_wstring_buf only). -// An empty string is valid, and distinct from nil. +// Converts a regular UTF-8 `string` to UTF-16, and returns the result as a +// null-terminated `wstring`, or `nil` on conversion failure. +// +// Conversion may fail due to an invalid byte sequence in the input string, +// or an insufficient buffer size (`utf8_to_wstring_buf` only). +// +// An empty string is valid, and results in a value distinct from `nil`. utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf} @(require_results) From e65dcd64b875253852d5e724dd432f94d3672799 Mon Sep 17 00:00:00 2001 From: Bruno Date: Sat, 21 Feb 2026 16:23:54 -0300 Subject: [PATCH 566/766] add bindings to allow custom cursors --- .../darwin/Foundation/NSBitmapImageRep.odin | 82 +++++++++++++------ core/sys/darwin/Foundation/NSColor.odin | 9 +- core/sys/darwin/Foundation/NSCursor.odin | 8 ++ core/sys/darwin/Foundation/NSImage.odin | 19 +++++ core/sys/darwin/Foundation/NSImageRep.odin | 4 + core/sys/windows/gdi32.odin | 8 ++ core/sys/windows/user32.odin | 1 + vendor/x11/xlib/xlib_procs.odin | 3 +- vendor/x11/xlib/xlib_types.odin | 13 +++ 9 files changed, 119 insertions(+), 28 deletions(-) create mode 100644 core/sys/darwin/Foundation/NSImage.odin create mode 100644 core/sys/darwin/Foundation/NSImageRep.odin diff --git a/core/sys/darwin/Foundation/NSBitmapImageRep.odin b/core/sys/darwin/Foundation/NSBitmapImageRep.odin index 059a75e43..d10043d7a 100644 --- a/core/sys/darwin/Foundation/NSBitmapImageRep.odin +++ b/core/sys/darwin/Foundation/NSBitmapImageRep.odin @@ -1,42 +1,72 @@ package objc_Foundation -import "base:intrinsics" - @(objc_class="NSBitmapImageRep") BitmapImageRep :: struct { using _: Object } +BitmapInteger :: distinct UInteger +BitmapFormatFlag :: enum BitmapInteger { + AlphaFirst = 0, + AlphaNonpremultiplied = 1, + FloatingPointSamples = 2, + SixteenBitLittleEndian = 8, + ThirtyTwoBitLittleEndian = 9, + SixteenBitBigEndian = 10, + ThirtyTwoBitBigEndian = 11, +} +BitmapFormatFlags :: bit_set[BitmapFormatFlag; BitmapInteger] + @(objc_type=BitmapImageRep, objc_name="alloc", objc_is_class_method=true) BitmapImageRep_alloc :: proc "c" () -> ^BitmapImageRep { return msgSend(^BitmapImageRep, BitmapImageRep, "alloc") } -@(objc_type=BitmapImageRep, objc_name="initWithBitmapDataPlanes") -BitmapImageRep_initWithBitmapDataPlanes :: proc "c" ( - self: ^BitmapImageRep, +BitmapImageRep_initWithBitmapDataPlanes_legacy :: proc "c" ( + self: ^BitmapImageRep, bitmapDataPlanes: ^^u8, - pixelsWide: Integer, - pixelsHigh: Integer, - bitsPerSample: Integer, + pixelsWide: Integer, + pixelsHigh: Integer, + bitsPerSample: Integer, samplesPerPixel: Integer, - hasAlpha: bool, - isPlanar: bool, - colorSpaceName: ^String, - bytesPerRow: Integer, - bitsPerPixel: Integer) -> ^BitmapImageRep { - - return msgSend(^BitmapImageRep, - self, + hasAlpha: bool, + isPlanar: bool, + colorSpaceName: ^String, + bytesPerRow: Integer, + bitsPerPixel: Integer, +) -> ^BitmapImageRep { + return msgSend( + ^BitmapImageRep, self, "initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bytesPerRow:bitsPerPixel:", - bitmapDataPlanes, - pixelsWide, - pixelsHigh, - bitsPerSample, - samplesPerPixel, - hasAlpha, - isPlanar, - colorSpaceName, - bytesPerRow, - bitsPerPixel) + bitmapDataPlanes, pixelsWide, pixelsHigh, bitsPerSample, samplesPerPixel, + hasAlpha, isPlanar, colorSpaceName, bytesPerRow, bitsPerPixel, + ) +} + +BitmapImageRep_initWithBitmapDataPlanes_bitmapFormat :: proc "c" ( + self: ^BitmapImageRep, + bitmapDataPlanes: ^^u8, + pixelsWide: Integer, + pixelsHigh: Integer, + bitsPerSample: Integer, + samplesPerPixel: Integer, + hasAlpha: bool, + isPlanar: bool, + colorSpaceName: ^String, + bitmapFormat: BitmapFormatFlags, + bytesPerRow: Integer, + bitsPerPixel: Integer, +) -> ^BitmapImageRep { + return msgSend( + ^BitmapImageRep, self, + "initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:", + bitmapDataPlanes, pixelsWide, pixelsHigh, bitsPerSample, samplesPerPixel, + hasAlpha, isPlanar, colorSpaceName, bitmapFormat, bytesPerRow, bitsPerPixel, + ) +} + +@(objc_type=BitmapImageRep, objc_name="initWithBitmapDataPlanes") +BitmapImageRep_initWithBitmapDataPlanes :: proc{ + BitmapImageRep_initWithBitmapDataPlanes_legacy, + BitmapImageRep_initWithBitmapDataPlanes_bitmapFormat, } @(objc_type=BitmapImageRep, objc_name="bitmapData") diff --git a/core/sys/darwin/Foundation/NSColor.odin b/core/sys/darwin/Foundation/NSColor.odin index 453b33144..b50e08af1 100644 --- a/core/sys/darwin/Foundation/NSColor.odin +++ b/core/sys/darwin/Foundation/NSColor.odin @@ -1,5 +1,7 @@ package objc_Foundation +foreign import "system:Foundation.framework" + @(objc_class="NSColorSpace") ColorSpace :: struct {using _: Object} @@ -146,4 +148,9 @@ Color_numberOfComponents :: proc "c" (self: ^Color) -> Integer { @(objc_type=Color, objc_name="getComponents") Color_getComponents :: proc "c" (self: ^Color, components: [^]Float) { msgSend(nil, self, "getComponents:", components) -} \ No newline at end of file +} + +@(link_prefix="NS", default_calling_convention="c") +foreign Foundation { + DeviceRGBColorSpace: ^String +} diff --git a/core/sys/darwin/Foundation/NSCursor.odin b/core/sys/darwin/Foundation/NSCursor.odin index 2bebf5362..5c43e1353 100644 --- a/core/sys/darwin/Foundation/NSCursor.odin +++ b/core/sys/darwin/Foundation/NSCursor.odin @@ -3,6 +3,14 @@ package objc_Foundation @(objc_class="NSCursor") Cursor :: struct {using _: Object} +@(objc_type=Cursor, objc_name="alloc", objc_is_class_method=true) +Cursor_alloc :: proc "c" () -> ^Cursor { + return msgSend(^Cursor, Cursor, "alloc") +} +@(objc_type=Cursor, objc_name="initWithImage") +Cursor_initWithImage :: proc "c" (self: ^Cursor, image: ^Image, hotSpot: Point) -> ^Cursor { + return msgSend(^Cursor, self, "initWithImage:hotSpot:", image, hotSpot) +} @(objc_type=Cursor, objc_name="hide", objc_is_class_method=true) Cursor_hide :: proc() { msgSend(nil, Cursor, "hide") diff --git a/core/sys/darwin/Foundation/NSImage.odin b/core/sys/darwin/Foundation/NSImage.odin new file mode 100644 index 000000000..33aae6c50 --- /dev/null +++ b/core/sys/darwin/Foundation/NSImage.odin @@ -0,0 +1,19 @@ +package objc_Foundation + +@(objc_class="NSImage") +Image :: struct { using _: Object } + +@(objc_type=Image, objc_name="alloc", objc_is_class_method=true) +Image_alloc :: proc "c" () -> ^Image { + return msgSend(^Image, Image, "alloc") +} + +@(objc_type=Image, objc_name="initWithSize") +Image_initWithSize :: proc "c" (self: ^Image, size: Size) -> ^Image { + return msgSend(^Image, self, "initWithSize:", size) +} + +@(objc_type=Image, objc_name="addRepresentation") +Image_addRepresentation :: proc(self: ^Image, rep: ^ImageRep) { + msgSend(nil, self, "addRepresentation:", rep) +} diff --git a/core/sys/darwin/Foundation/NSImageRep.odin b/core/sys/darwin/Foundation/NSImageRep.odin new file mode 100644 index 000000000..1e80cb336 --- /dev/null +++ b/core/sys/darwin/Foundation/NSImageRep.odin @@ -0,0 +1,4 @@ +package objc_Foundation + +@(objc_class="NSImageRep") +ImageRep :: struct { using _: Object } diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index e607aafcc..603eb4dd9 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -19,6 +19,7 @@ foreign gdi32 { RestoreDC :: proc(hdc: HDC, nSavedDC: INT) -> BOOL --- CreateDIBPatternBrush :: proc(h: HGLOBAL, iUsage: UINT) -> HBRUSH --- + CreateBitmap :: proc(nWidth: INT, nHeight: INT, nPlanes: UINT, nBitCount: UINT, lpBits: LPVOID) -> HBITMAP --- CreateDIBitmap :: proc(hdc: HDC, pbmih: ^BITMAPINFOHEADER, flInit: DWORD, pjBits: VOID, pbmi: ^BITMAPINFO, iUsage: UINT) -> HBITMAP --- CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: ^^VOID, hSection: HANDLE, offset: DWORD) -> HBITMAP --- StretchDIBits :: proc(hdc: HDC, xDest, yDest, DestWidth, DestHeight, xSrc, ySrc, SrcWidth, SrcHeight: INT, lpBits: VOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT --- @@ -151,6 +152,13 @@ BKMODE :: enum { OPAQUE = 2, } +ICONINFO :: struct { + fIcon: BOOL, + xHotspot, yHotspot: DWORD, + hbmMask, hbmColor: HBITMAP, +} +PICONINFO :: ^ICONINFO + ICONINFOEXW :: struct { cbSize: DWORD, fIcon: BOOL, diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 615d7a84d..d2f54b127 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -116,6 +116,7 @@ foreign user32 { CreateIcon :: proc(hInstance: HINSTANCE, nWidth, nHeight: INT, cPlanes: BYTE, cBitsPixel: BYTE, lpbANDbits: PBYTE, lpbXORbits: PBYTE) -> HICON --- CreateIconFromResource :: proc(presbits: PBYTE, dwResSize: DWORD, fIcon: BOOL, dwVer: DWORD) -> HICON --- + CreateIconIndirect :: proc(piconinfo: PICONINFO) -> HICON --- DestroyIcon :: proc(hIcon: HICON) -> BOOL --- DrawIcon :: proc(hDC: HDC, X, Y: INT, hIcon: HICON) -> BOOL --- diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index a7aa7a770..3ab4acd17 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -13,7 +13,8 @@ foreign xcursor { cursorGetDefaultSize :: proc(display: ^Display) -> i32 --- cursorLibraryLoadCursor :: proc(display: ^Display, name: cstring) -> Cursor --- cursorLibraryLoadImage :: proc(name: cstring, theme: cstring, size: i32) -> rawptr --- - cursorImageLoadCursor :: proc(display: ^Display, img: rawptr) -> Cursor --- + cursorImageCreate :: proc(width: i32, height: i32) -> ^CursorImage --- + cursorImageLoadCursor :: proc(display: ^Display, img: ^CursorImage) -> Cursor --- cursorImageDestroy :: proc(img: rawptr) --- } diff --git a/vendor/x11/xlib/xlib_types.odin b/vendor/x11/xlib/xlib_types.odin index a73b8e8b8..bdbaf441e 100644 --- a/vendor/x11/xlib/xlib_types.odin +++ b/vendor/x11/xlib/xlib_types.odin @@ -2257,3 +2257,16 @@ XIRawEvent :: struct { raw_values: [^]f64, } +CursorUInt :: u32 +CursorDim :: u32 +CursorPixel :: u32 +CursorImage :: struct { + version: CursorDim, + size: CursorDim, + width: CursorDim, + height: CursorDim, + xhot: CursorDim, + yhot: CursorDim, + delay: CursorUInt, + pixels: ^CursorPixel, // ARGB +} From 9883e4ec291e425bd1738dff40e5fb4466d4d2aa Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Fri, 27 Feb 2026 19:16:34 +0100 Subject: [PATCH 567/766] Handle edge cases: Allocation error, extremely long input --- core/sys/windows/util.odin | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 2c2b8a1e4..88ffce05a 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -91,20 +91,28 @@ LANGIDFROMLCID :: #force_inline proc "contextless" (lcid: LCID) -> LANGID { @(require_results) utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> []u16 { - if len(s) < 1 { + s_length := len(s) + if s_length < 1 { + return nil + } + if s_length > cast(int)max(c_int) { + // Unsupported (input string is excessively long). return nil } b := transmute([]byte)s cstr := raw_data(b) - n := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(len(s)), nil, 0) + n := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(s_length), nil, 0) if n == 0 { return nil } text := make([]u16, n+1, allocator) + if text == nil { + return nil + } - n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(len(s)), raw_data(text), n) + n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(s_length), raw_data(text), n) if n1 == 0 { delete(text, allocator) return nil @@ -158,7 +166,8 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { // Returns `nil` on conversion failure. // // Conversion may fail due to an invalid byte sequence in the input string, -// or an insufficient buffer size (`utf8_to_utf16_buf` only). +// or an insufficient buffer size (`utf8_to_utf16_buf` only), +// or allocation failure (`utf8_to_utf16_alloc` only). // // The result of converting an empty string is indistinguishable from conversion failure. utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf} @@ -169,6 +178,9 @@ utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> // Empty string. Needs special care because an empty string // is different from conversion failure. buf := make([]u16, 1, allocator) + if buf == nil { + return nil + } buf[0] = 0 return wstring(raw_data(buf)) } @@ -213,7 +225,8 @@ utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { // null-terminated `wstring`, or `nil` on conversion failure. // // Conversion may fail due to an invalid byte sequence in the input string, -// or an insufficient buffer size (`utf8_to_wstring_buf` only). +// or an insufficient buffer size (`utf8_to_wstring_buf` only), +// or allocation failure (`utf8_to_wstring_alloc` only). // // An empty string is valid, and results in a value distinct from `nil`. utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf} From f61a216c9ff47a15bfb0538c40996c76fe8c7dd9 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 27 Feb 2026 21:04:43 +0100 Subject: [PATCH 568/766] nbio: put clearing of list nodes in proper place and simplify test --- core/nbio/impl_posix.odin | 10 ++++- tests/core/nbio/nbio.odin | 78 +++++++++++++-------------------------- 2 files changed, 33 insertions(+), 55 deletions(-) diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index 5a16efbf4..8469c9ade 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -336,6 +336,12 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> General_Error { if .Error in event.flags { curr._impl.flags += {.Error} } if .EOF in event.flags { curr._impl.flags += {.EOF} } curr._impl.result = event.data + + // Remove refs to the list in case the operation would still block and `add_pending` + // is executed on it again. + curr._impl.prev = nil + curr._impl.next = nil + handle_completed(curr) } } @@ -1154,8 +1160,8 @@ stat_exec :: proc(op: ^Operation) { add_pending :: proc(op: ^Operation, filter: kq.Filter, ident: uintptr) { debug("adding pending", op.type) - op._impl.next = nil - op._impl.prev = nil + assert(op._impl.next == nil) + assert(op._impl.prev == nil) op._impl.flags += {.For_Kernel} _, val, just_inserted, err := map_entry(&op.l.submitted, Queue_Identifier{ ident = ident, filter = filter }) diff --git a/tests/core/nbio/nbio.odin b/tests/core/nbio/nbio.odin index 2fbfc8894..6121d1ac7 100644 --- a/tests/core/nbio/nbio.odin +++ b/tests/core/nbio/nbio.odin @@ -257,77 +257,49 @@ wake_up :: proc(t: ^testing.T) { } } +// Tests that if multiple accepts are queued, and a dial comes in which completes one of them, +// the rest are queued again properly. @(test) -reused_ops :: proc(t: ^testing.T) { +still_pending :: proc(t: ^testing.T) { if event_loop_guard(t) { testing.set_fail_timeout(t, time.Minute) - @static payload := [4]byte{'P', 'I', 'N', 'G'} sock, ep := open_next_available_local_port(t) + defer nbio.close(sock) + + N :: 3 State :: struct { - listener: nbio.TCP_Socket, - accepts: [4]^nbio.Operation, - client: nbio.TCP_Socket, - server_client: nbio.TCP_Socket, - recv_buf: [4]byte, - recv_done: bool, + accepted: int, } + state: State - state := State{ - listener = sock, - } - - on_accept :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State, slot: int) { - if state.recv_done { - nbio.close(op.accept.client) - return - } - + on_accept :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { ev(t, op.accept.err, nil) - if state.server_client == 0 { - state.server_client = op.accept.client - nbio.recv_poly2(state.server_client, {state.recv_buf[:]}, t, state, on_recv, timeout=0) - } - - state.accepts[slot] = nbio.accept_poly3(op.accept.socket, t, state, slot, on_accept, timeout=nbio.NO_TIMEOUT) + state.accepted += 1 + nbio.close(op.accept.client) } - on_recv :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { - ev(t, op.recv.err, nil) - ev(t, op.recv.received, 4) - ev(t, state.recv_buf, payload) - state.recv_done = true - - for accept in state.accepts { - if accept != nil { - nbio.remove(accept) - } - } - - nbio.close(state.server_client) - nbio.close(state.client) - nbio.close(state.listener) - } - - on_dial :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { + on_dial :: proc(op: ^nbio.Operation, t: ^testing.T) { ev(t, op.dial.err, nil) - state.client = op.dial.socket - nbio.send_poly2(state.client, {payload[:]}, t, state, on_send) + nbio.close(op.dial.socket) } - on_send :: proc(op: ^nbio.Operation, t: ^testing.T, state: ^State) { - ev(t, op.send.err, nil) - ev(t, op.send.sent, (4)) + for _ in 0.. Date: Fri, 27 Feb 2026 21:35:36 +0100 Subject: [PATCH 569/766] [core:net] Make IPv6 resolution test failure informative instead. --- tests/core/net/test_core_net.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/core/net/test_core_net.odin b/tests/core/net/test_core_net.odin index 55fe6671d..0b079f5b0 100644 --- a/tests/core/net/test_core_net.odin +++ b/tests/core/net/test_core_net.odin @@ -591,7 +591,8 @@ test_dns_resolve :: proc(t: ^testing.T) { } ip6, ip6_ok := ep6.address.(net.IP6_Address) - if !testing.expect(t, ip6_ok, "Unable to resolve IP6") { + if !ip6_ok { + log.info("Unable to resolve IP6") return } From 6a6460e82417ff39e412c4d06d88ab525bf7267a Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 27 Feb 2026 22:11:11 +0100 Subject: [PATCH 570/766] fix another old `os` use in `when` statement --- core/testing/runner.odin | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 6fd243cd0..e7a46c5cb 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -1018,11 +1018,7 @@ To partly mitigate this, redirect STDERR to a file or use the -define:ODIN_TEST_ when JSON_REPORT != "" { json_report: JSON - mode: int - when ODIN_OS != .Windows { - mode = os.S_IRUSR|os.S_IWUSR|os.S_IRGRP|os.S_IROTH - } - json_fd, err := os.open(JSON_REPORT, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, mode) + json_fd, err := os.open(JSON_REPORT, {.Write, .Create, .Trunc}, {.Read_User, .Write_User, .Read_Group, .Read_Other}) fmt.assertf(err == nil, "unable to open file %q for writing of JSON report, error: %v", JSON_REPORT, err) defer os.close(json_fd) @@ -1041,7 +1037,7 @@ To partly mitigate this, redirect STDERR to a file or use the -define:ODIN_TEST_ json_report.success = total_success_count json_report.duration = finished_in - json_err := json.marshal_to_writer(os.stream_from_handle(json_fd), json_report, &{ pretty = true }) + json_err := json.marshal_to_writer(os.to_stream(json_fd), json_report, &{ pretty = true }) fmt.assertf(json_err == nil, "Error writing JSON report: %v", json_err) } From 4ec443df9b0c6ab488e9d72037b86830c3a23470 Mon Sep 17 00:00:00 2001 From: miningape Date: Sat, 28 Feb 2026 00:26:59 +0100 Subject: [PATCH 571/766] fix: `strings.substring` not returning end of range --- core/strings/strings.odin | 4 +++- tests/core/strings/test_core_strings.odin | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/strings/strings.odin b/core/strings/strings.odin index d40b81b3d..d55fea69e 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -3420,7 +3420,9 @@ internal_substring :: proc(s: string, rune_start: int, rune_end: int) -> (sub: s } rune_i += 1 } - if !ok { return } + if !ok { + sub = sub[rune_i:] + } } if rune_end >= rune_start { diff --git a/tests/core/strings/test_core_strings.odin b/tests/core/strings/test_core_strings.odin index 140689468..a7502ab92 100644 --- a/tests/core/strings/test_core_strings.odin +++ b/tests/core/strings/test_core_strings.odin @@ -164,11 +164,16 @@ test_substring :: proc(t: ^testing.T) { {s = "Hello", end = len("Hello"), sub = "Hello", ok = true}, {s = "Hello", start = 1, end = len("Hello"), sub = "ello", ok = true}, {s = "Hello", start = 1, end = len("Hello") - 1, sub = "ell", ok = true}, + {s = "Hello", start = 0, end = 0, sub = "", ok = true}, + {s = "Hello", start = 3, end = 3, sub = "", ok = true}, + {s = "Hello", start = len("Hello"), end = len("Hello"), sub = "", ok = true}, {s = "Hello", end = len("Hello") + 1, sub = "Hello", ok = false}, {s = "小猫咪", start = 0, end = 3, sub = "小猫咪", ok = true}, {s = "小猫咪", start = 1, end = 3, sub = "猫咪", ok = true}, {s = "小猫咪", start = 1, end = 5, sub = "猫咪", ok = false}, {s = "小猫咪", start = 1, end = 1, sub = "", ok = true}, + {s = "小猫咪", start = 1, end = 1, sub = "", ok = true}, + {s = "小猫咪", start = 3, end = 3, sub = "", ok = true}, } for tc in cases { From eeb7e775f3c1ed0853c8b51e47fb602cd44f37ff Mon Sep 17 00:00:00 2001 From: fendevel Date: Sat, 28 Feb 2026 00:37:34 +0000 Subject: [PATCH 572/766] webgl: Add bindings, fix `Tex*Image*D` --- core/sys/wasm/js/odin.js | 98 +++++++++++++++++++++++++++-------- vendor/wasm/WebGL/webgl.odin | 16 ++++++ vendor/wasm/WebGL/webgl2.odin | 1 + 3 files changed, 92 insertions(+), 23 deletions(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 19ac3093e..4d19916bd 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -10,7 +10,7 @@ function getElement(name) { } function stripNewline(str) { - return str.replace(/\n/, ' ') + return str.replace(/\n/, ' ') } class WasmMemoryInterface { @@ -40,22 +40,14 @@ class WasmMemoryInterface { } - loadF32Array(addr, len) { - let array = new Float32Array(this.memory.buffer, addr, len); - return array; - } - loadF64Array(addr, len) { - let array = new Float64Array(this.memory.buffer, addr, len); - return array; - } - loadU32Array(addr, len) { - let array = new Uint32Array(this.memory.buffer, addr, len); - return array; - } - loadI32Array(addr, len) { - let array = new Int32Array(this.memory.buffer, addr, len); - return array; - } + loadF32Array(addr, len) { return new Float32Array(this.memory.buffer, addr, len); } + loadF64Array(addr, len) { return new Float64Array(this.memory.buffer, addr, len); } + loadU32Array(addr, len) { return new Uint32Array(this.memory.buffer, addr, len); } + loadI32Array(addr, len) { return new Int32Array(this.memory.buffer, addr, len); } + loadU16Array(addr, len) { return new Uint16Array(this.memory.buffer, addr, len); } + loadI16Array(addr, len) { return new Int16Array(this.memory.buffer, addr, len); } + loadU8Array(addr, len) { return new Uint8Array(this.memory.buffer, addr, len); } + loadI8Array(addr, len) { return new Int8Array(this.memory.buffer, addr, len); } loadU8(addr) { return this.mem.getUint8 (addr); } @@ -200,6 +192,7 @@ class WebGLInterface { this.transformFeedbacks = []; this.syncs = []; this.programInfos = {}; + this.extensions = []; } get mem() { @@ -225,6 +218,9 @@ class WebGLInterface { } else { this.ctxVersion = 1.0; } + + this.extensions = this.ctx.getSupportedExtensions(); + return true; } @@ -281,6 +277,30 @@ class WebGLInterface { return source; } + loadTypedArrayFromTexelType(type, size, data) { + switch (type) { + case this.ctx.SHORT: return this.mem.loadI16Array(data, size/2); + case this.ctx.UNSIGNED_SHORT_5_5_5_1: + case this.ctx.UNSIGNED_SHORT_5_6_5: + case this.ctx.UNSIGNED_SHORT_4_4_4_4: + case this.ctx.UNSIGNED_SHORT: + case this.ctx.HALF_FLOAT: return this.mem.loadU16Array(data, size/2); + case this.ctx.FLOAT: return this.mem.loadF32Array(data, size/4); + case this.ctx.INT: return this.mem.loadI32Array(data, size/4) + case this.ctx.UNSIGNED_INT_24_8: + case this.ctx.UNSIGNED_INT_5_9_9_9_REV: + case this.ctx.UNSIGNED_INT_10F_11F_11F_REV: + case this.ctx.UNSIGNED_INT_2_10_10_10_REV: + case this.ctx.UNSIGNED_INT: return this.mem.loadU32Array(data, size/4) + case this.ctx.BYTE: return this.mem.loadI8Array(data, size); + case this.ctx.UNSIGNED_BYTE: return this.mem.loadU8Array(data, size); + case this.ctx.FLOAT_32_UNSIGNED_INT_24_8_REV: + throw new Error("Source data of type FLOAT_32_UNSIGNED_INT_24_8_REV must be null"); + } + + throw new Error(`Unsupported texture data type: 0x${type.toString(16)}`); + } + getWebGL1Interface() { return { SetCurrentContextById: (name_ptr, name_len) => { @@ -327,10 +347,30 @@ class WebGLInterface { IsExtensionSupported: (name_ptr, name_len) => { let name = this.mem.loadString(name_ptr, name_len); - let extensions = this.ctx.getSupportedExtensions(); + let extensions = this.extensions; return extensions.indexOf(name) !== -1 }, + GetSupportedExtensionFromIndex: (index, buf_ptr, buf_len, length_ptr) => { + let extensions = this.extensions; + if (index < 0 || index >= extensions.length) { + return false; + } + + let ext = extensions[index]; + const n = Math.min(buf_len, ext.length); + ext = ext.substring(0, n); + this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(ext)); + + this.mem.storeInt(length_ptr, n); + + return true; + }, + + GetExtension: (name_ptr, name_len) => { + let name = this.mem.loadString(name_ptr, name_len); + this.ctx.getExtension(name); + }, GetError: () => { let err = this.lastError; @@ -628,6 +668,11 @@ class WebGLInterface { this.ctx.generateMipmap(target); }, + GetBufferParameter: (target, pname) => { + return this.ctx.getBufferParameter(target, pname); + }, + + GetActiveAttrib: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { const info = this.ctx.getActiveAttrib(this.programs[program], index); @@ -830,7 +875,8 @@ class WebGLInterface { TexImage2D: (target, level, internalformat, width, height, border, format, type, size, data) => { if (data) { - this.ctx.texImage2D(target, level, internalformat, width, height, border, format, type, this.mem.loadBytes(data, size)); + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texImage2D(target, level, internalformat, width, height, border, format, type, texelData); } else { this.ctx.texImage2D(target, level, internalformat, width, height, border, format, type, null); } @@ -842,7 +888,8 @@ class WebGLInterface { this.ctx.texParameteri(target, pname, param); }, TexSubImage2D: (target, level, xoffset, yoffset, width, height, format, type, size, data) => { - this.ctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, this.mem.loadBytes(data, size)); + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, texelData); }, @@ -976,7 +1023,10 @@ class WebGLInterface { }, /* Texture objects */ - + TexStorage2D: (target, levels, internalformat, width, height) => { + this.assertWebGL2(); + this.ctx.texStorage2D(target, levels, internalformat, width, height); + }, TexStorage3D: (target, levels, internalformat, width, height, depth) => { this.assertWebGL2(); this.ctx.texStorage3D(target, levels, internalformat, width, height, depth); @@ -984,14 +1034,16 @@ class WebGLInterface { TexImage3D: (target, level, internalformat, width, height, depth, border, format, type, size, data) => { this.assertWebGL2(); if (data) { - this.ctx.texImage3D(target, level, internalformat, width, height, depth, border, format, type, this.mem.loadBytes(data, size)); + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texImage3D(target, level, internalformat, width, height, depth, border, format, type, texelData); } else { this.ctx.texImage3D(target, level, internalformat, width, height, depth, border, format, type, null); } }, TexSubImage3D: (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, size, data) => { this.assertWebGL2(); - this.ctx.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, this.mem.loadBytes(data, size)); + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texelData); }, CompressedTexImage3D: (target, level, internalformat, width, height, depth, border, imageSize, data) => { this.assertWebGL2(); diff --git a/vendor/wasm/WebGL/webgl.odin b/vendor/wasm/WebGL/webgl.odin index d607ec743..6338d6271 100644 --- a/vendor/wasm/WebGL/webgl.odin +++ b/vendor/wasm/WebGL/webgl.odin @@ -52,6 +52,7 @@ foreign webgl { GetError :: proc() -> Enum --- IsExtensionSupported :: proc(name: string) -> bool --- + GetExtension :: proc(name: string) --- ActiveTexture :: proc(x: Enum) --- AttachShader :: proc(program: Program, shader: Shader) --- @@ -118,6 +119,7 @@ foreign webgl { GenerateMipmap :: proc(target: Enum) --- + GetBufferParameter :: proc(target, name: Enum) -> int --- GetAttribLocation :: proc(program: Program, name: string) -> i32 --- GetUniformLocation :: proc(program: Program, name: string) -> i32 --- GetVertexAttribOffset :: proc(index: i32, pname: Enum) -> uintptr --- @@ -373,7 +375,21 @@ GetShaderInfoLog :: proc "contextless" (shader: Shader, buf: []byte) -> string { return string(buf[:length]) } +IterateSupportedExtensions :: proc(index: ^int, buf: []byte) -> (string, bool) { + foreign webgl { + @(link_name="GetSupportedExtensionFromIndex") + _GetSupportedExtensionFromIndex :: proc "contextless" (index: int, buf: []byte, length: ^int) -> bool --- + } + length: int + if !_GetSupportedExtensionFromIndex(index^, buf[:], &length) { + return "", false + } + + index^ += 1 + + return string(buf[:length]), true +} BufferDataSlice :: proc "contextless" (target: Enum, slice: $S/[]$E, usage: Enum) { BufferData(target, len(slice)*size_of(E), raw_data(slice), usage) diff --git a/vendor/wasm/WebGL/webgl2.odin b/vendor/wasm/WebGL/webgl2.odin index 1e36fd0fd..677287bd1 100644 --- a/vendor/wasm/WebGL/webgl2.odin +++ b/vendor/wasm/WebGL/webgl2.odin @@ -35,6 +35,7 @@ foreign webgl2 { RenderbufferStorageMultisample :: proc(target: Enum, samples: i32, internalformat: Enum, width, height: i32) --- /* Texture objects */ + TexStorage2D :: proc(target: Enum, levels: i32, internalformat: Enum, width, height: i32) --- TexStorage3D :: proc(target: Enum, levels: i32, internalformat: Enum, width, height, depth: i32) --- TexImage3D :: proc(target: Enum, level: i32, internalformat: Enum, width, height, depth: i32, border: i32, format, type: Enum, size: int, data: rawptr) --- TexSubImage3D :: proc(target: Enum, level: i32, xoffset, yoffset, zoffset, width, height, depth: i32, format, type: Enum, size: int, data: rawptr) --- From 1e0f5a691cf4682507853e2305df213183692751 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Sat, 28 Feb 2026 11:39:12 +0100 Subject: [PATCH 573/766] Fix overflow edge cases on 32-bit systems. --- core/sys/windows/util.odin | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 88ffce05a..542d2718e 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -103,17 +103,21 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ b := transmute([]byte)s cstr := raw_data(b) n := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(s_length), nil, 0) - if n == 0 { + if n <= 0 || cast(int)n >= max(int) { + // If n is equal to or greater than max(int), then we will not be able + // to create a big enough slice with the null terminator. + // NOTE: This only affects 32-bit systems and is purely pedantic because + // the system will never be able to allocate that much memory. return nil } - text := make([]u16, n+1, allocator) + text := make([]u16, cast(int)n + 1, allocator) if text == nil { return nil } n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(s_length), raw_data(text), n) - if n1 == 0 { + if n1 <= 0 { delete(text, allocator) return nil } @@ -128,7 +132,7 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ @(require_results) utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { buf_length := len(buf) - if buf_length == 0 { + if buf_length < 1 { return nil } s_length := len(s) @@ -143,7 +147,7 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { buf_length = cast(int)max(c_int) } elements_written := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(s_length), raw_data(buf), cast(c_int)buf_length) - if elements_written == 0 { + if elements_written <= 0 { // Insufficient buffer size, empty input string, or invalid characters. Contents of the buffer may have been modified. return nil } @@ -151,8 +155,9 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { // To be consistent with utf8_to_utf16_alloc, the output string // is null-terminated here in the buffer, even though the terminating null character // is not part of the returned slice. - if buf_length < cast(int)elements_written + 1 { + if buf_length <= cast(int)elements_written { // The terminating null character does not fit. + // Need at least a length of (elements_written+1). return nil } buf[elements_written] = 0 From f01fb605bc8b6fa40ce30129197ad1cab4ff56af Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Sat, 28 Feb 2026 10:24:00 -0600 Subject: [PATCH 574/766] [vendor:stb/vorbis] don't use core:c/libc --- vendor/stb/vorbis/stb_vorbis.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/stb/vorbis/stb_vorbis.odin b/vendor/stb/vorbis/stb_vorbis.odin index 38bba4f29..fb7ff0ec2 100644 --- a/vendor/stb/vorbis/stb_vorbis.odin +++ b/vendor/stb/vorbis/stb_vorbis.odin @@ -1,7 +1,7 @@ // Bindings for [[ stb_vorbis.c ; https://github.com/nothings/stb/blob/master/stb_vorbis.c ]]. package stb_vorbis -import c "core:c/libc" +import c "core:c" @(private) LIB :: ( From c685c312c538127e5a050472e23bedc4b9d93da5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 1 Mar 2026 13:00:27 +0000 Subject: [PATCH 575/766] Make the tokenizer work with a custom hash map protected by a spinlock --- core/odin/tokenizer/tokenizer.odin | 93 ++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 6 deletions(-) diff --git a/core/odin/tokenizer/tokenizer.odin b/core/odin/tokenizer/tokenizer.odin index 9f46f2ed6..50f04ba84 100644 --- a/core/odin/tokenizer/tokenizer.odin +++ b/core/odin/tokenizer/tokenizer.odin @@ -1,6 +1,8 @@ // The tokenizer (lexer) for `Odin` files, used to create tooling. package odin_tokenizer +import "base:intrinsics" +import "base:runtime" import "core:fmt" import "core:unicode" import "core:unicode/utf8" @@ -32,6 +34,71 @@ Tokenizer :: struct { error_count: int, } + +Keyword_Hash_Entry :: struct { + hash: u32, + kind: Token_Kind, + name: string, +} + +KEYWORD_LUT_LEN :: 1<<9 +KEYWORD_LUT_MASK :: KEYWORD_LUT_LEN-1 +Keyword_LUT :: [KEYWORD_LUT_LEN]Keyword_Hash_Entry + +global_keyword_lut: Keyword_LUT // protected by `_global_keyword_lut_spinlock` +_global_keyword_lut_initialized: bool // atomic +_global_keyword_lut_spinlock: bool // atomic + +_global_keyword_spin_lock :: proc() { + for intrinsics.atomic_exchange_explicit(&_global_keyword_lut_spinlock, true, .Acquire) { + intrinsics.cpu_relax() + } +} + +_global_keyword_spin_unlock :: proc() { + intrinsics.atomic_store_explicit(&_global_keyword_lut_spinlock, false, .Release) +} + +@(require_results) +keyword_hash :: proc(text: string) -> u32 #no_bounds_check { + h := u32(0x811c9dc5) + for i in 0.. bool { + if lut == nil { + return false + } + + max_keyword_size := 0 + + ti := runtime.type_info_base(type_info_of(Token_Kind)) + e := ti.variant.(runtime.Type_Info_Enum) + + for kind in (Token_Kind.B_Keyword_Begin+Token_Kind(1)).. 1) + assert(max_keyword_size < 16) + + return true +} + + init :: proc(t: ^Tokenizer, src: string, path: string, err: Error_Handler = default_error_handler) { t.src = src t.err = err @@ -44,6 +111,13 @@ init :: proc(t: ^Tokenizer, src: string, path: string, err: Error_Handler = defa t.error_count = 0 t.path = path + if !intrinsics.atomic_load(&_global_keyword_lut_initialized) { + _global_keyword_spin_lock() + ok := keyword_lut_init(&global_keyword_lut) + intrinsics.atomic_store(&_global_keyword_lut_initialized, ok) + _global_keyword_spin_unlock() + } + advance_rune(t) if t.ch == utf8.RUNE_BOM { advance_rune(t) @@ -502,13 +576,21 @@ scan :: proc(t: ^Tokenizer) -> Token { case is_letter(ch): lit = scan_identifier(t) kind = .Ident - check_keyword: if len(lit) > 1 { - // TODO(bill): Maybe have a hash table lookup rather than this linear search - for i in Token_Kind.B_Keyword_Begin ..= Token_Kind.B_Keyword_End { - if lit == tokens[i] { - kind = Token_Kind(i) + check_keyword: if 1 < len(lit) && len(lit) < 16 { + if intrinsics.atomic_load(&_global_keyword_lut_initialized) { + entry := &global_keyword_lut[keyword_hash(lit) & KEYWORD_LUT_MASK] + if entry.kind != .Invalid && entry.name == lit { + kind = entry.kind break check_keyword } + } else { + // TODO(bill): Maybe have a hash table lookup rather than this linear search + for i in Token_Kind.B_Keyword_Begin ..= Token_Kind.B_Keyword_End { + if lit == tokens[i] { + kind = Token_Kind(i) + break check_keyword + } + } } for keyword, i in custom_keyword_tokens { if lit == keyword { @@ -516,7 +598,6 @@ scan :: proc(t: ^Tokenizer) -> Token { break check_keyword } } - break check_keyword } case '0' <= ch && ch <= '9': kind, lit = scan_number(t, false) From 05a951b338688cf343736b099b1e74de407d1997 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 1 Mar 2026 13:05:51 +0000 Subject: [PATCH 576/766] Fix name lookup --- core/odin/tokenizer/tokenizer.odin | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/odin/tokenizer/tokenizer.odin b/core/odin/tokenizer/tokenizer.odin index 50f04ba84..3f7ccc6a5 100644 --- a/core/odin/tokenizer/tokenizer.odin +++ b/core/odin/tokenizer/tokenizer.odin @@ -2,7 +2,6 @@ package odin_tokenizer import "base:intrinsics" -import "base:runtime" import "core:fmt" import "core:unicode" import "core:unicode/utf8" @@ -75,18 +74,15 @@ keyword_lut_init :: proc(lut: ^Keyword_LUT) -> bool { max_keyword_size := 0 - ti := runtime.type_info_base(type_info_of(Token_Kind)) - e := ti.variant.(runtime.Type_Info_Enum) - for kind in (Token_Kind.B_Keyword_Begin+Token_Kind(1)).. Date: Sun, 1 Mar 2026 13:06:11 +0000 Subject: [PATCH 577/766] Remove `TODO` --- core/odin/tokenizer/tokenizer.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/odin/tokenizer/tokenizer.odin b/core/odin/tokenizer/tokenizer.odin index 3f7ccc6a5..f4d50b36c 100644 --- a/core/odin/tokenizer/tokenizer.odin +++ b/core/odin/tokenizer/tokenizer.odin @@ -580,7 +580,6 @@ scan :: proc(t: ^Tokenizer) -> Token { break check_keyword } } else { - // TODO(bill): Maybe have a hash table lookup rather than this linear search for i in Token_Kind.B_Keyword_Begin ..= Token_Kind.B_Keyword_End { if lit == tokens[i] { kind = Token_Kind(i) From e8ca4a24fa8455ac42eda33ba3ab1d7c49b024e4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 1 Mar 2026 13:28:30 +0000 Subject: [PATCH 578/766] Add `assert` to `freelist_push_with_index` --- core/container/xar/freelist.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/container/xar/freelist.odin b/core/container/xar/freelist.odin index c2afca0d0..4b11014f5 100644 --- a/core/container/xar/freelist.odin +++ b/core/container/xar/freelist.odin @@ -29,7 +29,8 @@ freelist_clear :: proc(x: ^$X/Freelist_Array($T, $SHIFT)) { freelist_push_with_index :: proc(x: ^$X/Freelist_Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, index: int, err: runtime.Allocator_Error) { if x.freelist != nil { slot := x.freelist - idx, _ := freelist_linear_search(x, slot) + idx, found := freelist_linear_search(x, slot) + assert(found) x.freelist = (^^T)(slot)^ slot^ = value return slot, idx, nil From 8bdf82ac8de23f27564c5c8948a5d2c38110327e Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Sun, 1 Mar 2026 13:38:29 +0100 Subject: [PATCH 579/766] Fix separating of diverging procedure types from block statements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To avoid creating a procedure literal from a procedure type and a following block statement, one can insert a semicolon or an empty line between the two: // procedure literals p1 :: proc() {…} p2 :: proc() {…} // procedure type followed by a block statement p3 :: proc() {…} The empty line as a separator did not work if the procedure type had a diverging result: // all of these are procedure literals p4 :: proc() -> ! {…} p5 :: proc() -> ! {…} p6 :: proc() -> ! {…} The least annoying fix I came up with is to insert implicit semicolon after the "not" token. I only needed to make sure that the inserted implicit semicolon is being skipped when the "not" token is a part of unary expression to avoid breaking an oddly-formatted code like: b := get_some_bool() if ! b {…} One small side-effect of this change is that in code like below: Proc_Type :: proc() -> ! // Some comment Some_Other_Type :: enum byte {…} The "// Some comment" is not associated with "Proc_Type" anymore. In Odin's standard library this only happens in one place, in `base/runtime/core.odin`: Assertion_Failure_Proc :: #type proc(prefix, message: string, loc: Source_Code_Location) -> ! // Allocation Stuff Allocator_Mode :: enum byte { Alloc, …, } --- src/parser.cpp | 3 +++ src/tokenizer.cpp | 1 + 2 files changed, 4 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index e98832034..5ada6d298 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -3490,6 +3490,9 @@ gb_internal Ast *parse_unary_expr(AstFile *f, bool lhs) { case Token_Mul: // Used for error handling when people do C-like things { Token token = advance_token(f); + if (token.kind == Token_Not) { + skip_possible_newline(f); + } Ast *expr = parse_unary_expr(f, lhs); return ast_unary_expr(f, token, expr); } diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index ffa53abb5..2ba25b297 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -1114,6 +1114,7 @@ semicolon_check:; /*fallthrough*/ case Token_Increment: case Token_Decrement: + case Token_Not: /*fallthrough*/ t->insert_semicolon = true; break; From 579b2612b1567f98de7e68f3cdcab3e12c0834b3 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 1 Mar 2026 14:54:26 +0100 Subject: [PATCH 580/766] Fix #6347 --- src/llvm_backend.hpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index a8076d75e..0f199907d 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -620,7 +620,12 @@ gb_internal LLVMValueRef lb_mem_zero_ptr_internal(lbProcedure *p, LLVMValueRef p gb_internal LLVMValueRef lb_mem_zero_ptr_internal(lbProcedure *p, LLVMValueRef ptr, usize len, unsigned alignment, bool is_volatile); gb_internal gb_inline i64 lb_max_zero_init_size(void) { - return cast(i64)(8); + if (build_context.metrics.os == TargetOs_darwin && build_context.metrics.arch == TargetArch_arm64) { + // https://github.com/odin-lang/Odin/issues/6347 + return cast(i64)(4*build_context.int_size); + } else { + return cast(i64)(8); + } } gb_internal LLVMTypeRef OdinLLVMGetArrayElementType(LLVMTypeRef type); From 5e009f5e8354d665706a56c9a469fc783b173e2b Mon Sep 17 00:00:00 2001 From: Franz Date: Sun, 1 Mar 2026 15:43:17 +0100 Subject: [PATCH 581/766] Fix name canonicalization for typed ranges in bit_set (#6353) --- src/name_canonicalization.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index d3faefed7..efe115c89 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -838,7 +838,8 @@ gb_internal void write_type_to_canonical_string(TypeWriter *w, Type *type) { } else { type_writer_append_fmt(w, "%lld", type->BitSet.lower); type_writer_append_fmt(w, CANONICAL_RANGE_OPERATOR); - type_writer_append_fmt(w, "%lld", type->BitSet.upper); + write_type_to_canonical_string(w, type->BitSet.elem); + type_writer_append_fmt(w, "(%lld)", type->BitSet.upper); } if (type->BitSet.underlying != nullptr) { type_writer_appendc(w, ";"); From e3d6fe72f8c7c79a09e18ba089552b7f6235c52b Mon Sep 17 00:00:00 2001 From: Louis Novy <101842021+louisnovy@users.noreply.github.com> Date: Sun, 1 Mar 2026 20:58:43 -0800 Subject: [PATCH 582/766] fix broken bit_set parapoly specialization #6240 --- src/check_expr.cpp | 5 +++++ src/check_type.cpp | 1 + tests/issues/run.bat | 1 + tests/issues/run.sh | 6 ++++++ 4 files changed, 13 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 1cf133f38..7f0acb4c6 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1501,6 +1501,11 @@ gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, T case Type_BitSet: if (source->kind == Type_BitSet) { + if (!is_type_polymorphic(poly->BitSet.elem)) { + if (poly->BitSet.upper != source->BitSet.upper || poly->BitSet.lower != source->BitSet.lower) { + return false; + } + } if (!is_polymorphic_type_assignable(c, poly->BitSet.elem, source->BitSet.elem, true, modify_type)) { return false; } diff --git a/src/check_type.cpp b/src/check_type.cpp index b1d0045e9..82e70dd33 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1229,6 +1229,7 @@ gb_internal void check_bit_set_type(CheckerContext *c, Type *type, Type *named_t ast_node(bs, BitSetType, node); GB_ASSERT(type->kind == Type_BitSet); type->BitSet.node = node; + type->BitSet.elem = t_invalid; /* i64 const DEFAULT_BITS = cast(i64)(8*build_context.word_size); */ i64 const MAX_BITS = 128; diff --git a/tests/issues/run.bat b/tests/issues/run.bat index f17f646a6..de380e313 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -29,6 +29,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_6068.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6101.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6165.odin %COMMON% || exit /b +..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr "3" || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index 73d0d9587..6c6796e28 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -36,6 +36,12 @@ $ODIN test ../test_issue_5699.odin $COMMON $ODIN test ../test_issue_6068.odin $COMMON $ODIN test ../test_issue_6101.odin $COMMON $ODIN test ../test_issue_6165.odin $COMMON +if [[ $($ODIN build ../test_issue_6240.odin $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 3 ]] ; then + echo "SUCCESSFUL 1/1" +else + echo "SUCCESSFUL 0/1" + exit 1 +fi set +x popd From 1a27af515f2dc431f7593b99d30a49a952486fbb Mon Sep 17 00:00:00 2001 From: Louis Novy <101842021+louisnovy@users.noreply.github.com> Date: Sun, 1 Mar 2026 21:18:30 -0800 Subject: [PATCH 583/766] add test file --- tests/issues/test_issue_6240.odin | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tests/issues/test_issue_6240.odin diff --git a/tests/issues/test_issue_6240.odin b/tests/issues/test_issue_6240.odin new file mode 100644 index 000000000..a56f44f33 --- /dev/null +++ b/tests/issues/test_issue_6240.odin @@ -0,0 +1,14 @@ +// Tests issue #6240 https://github.com/odin-lang/Odin/issues/6240 +package test_issues + +// should error - N=10 does not match bit_set range 0..<5 +foo :: proc($N: int, b: $B/bit_set[0 ..< N]) {} + +// should error without segfaulting - undefined identifier in bit_set range +bar :: proc(b: $B/bit_set[0 ..< asdf]) {} + +main :: proc() { + b: bit_set[0 ..< 5] + foo(10, b) + bar(bit_set[0 ..< 1]{}) +} From 7732a78c089a39722d9a43cc2cb206080ac028bf Mon Sep 17 00:00:00 2001 From: Louis Novy <101842021+louisnovy@users.noreply.github.com> Date: Sun, 1 Mar 2026 21:33:14 -0800 Subject: [PATCH 584/766] harden run.bat and add missing test_issue_2395 --- tests/issues/run.bat | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/issues/run.bat b/tests/issues/run.bat index de380e313..9e722886d 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -21,6 +21,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_4210.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_4364.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_4584.odin %COMMON% || exit /b +..\..\..\odin build ..\test_issue_2395.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "2" || exit /b ..\..\..\odin build ..\test_issue_5043.odin %COMMON% || exit /b ..\..\..\odin build ..\test_issue_5097.odin %COMMON% || exit /b ..\..\..\odin build ..\test_issue_5097-2.odin %COMMON% || exit /b @@ -29,7 +30,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_6068.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6101.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6165.odin %COMMON% || exit /b -..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr "3" || exit /b +..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b @echo off From 38c61e06be1a727409b544dad32888b48e32bd02 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 2 Mar 2026 20:15:55 +0100 Subject: [PATCH 585/766] Rename GetWorldPointVelocity to Body_GetWorldPointVelocity --- vendor/box2d/box2d.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/box2d/box2d.odin b/vendor/box2d/box2d.odin index 2301ed3d0..2cdfea191 100644 --- a/vendor/box2d/box2d.odin +++ b/vendor/box2d/box2d.odin @@ -773,7 +773,7 @@ foreign lib { Body_GetLocalPointVelocity :: proc(bodyId: BodyId, localPoint: Vec2) -> Vec2 --- // Get the linear velocity of a world point attached to a body. Usually in meters per second. - GetWorldPointVelocity :: proc(bodyId: BodyId, worldPoint: Vec2) -> Vec2 --- + Body_GetWorldPointVelocity :: proc(bodyId: BodyId, worldPoint: Vec2) -> Vec2 --- // Apply a force at a world point. If the force is not applied at the center of mass, // it will generate a torque and affect the angular velocity. This optionally wakes up the body. From 2a9c35fe3ca3b029f8ed3dae45698ca5d5c3b34c Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Mon, 2 Mar 2026 21:13:08 +0100 Subject: [PATCH 586/766] Fix incorrect PVOID/VOID usage in some win32 signatures --- core/sys/windows/gdi32.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 603eb4dd9..2ff346c7e 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -20,9 +20,9 @@ foreign gdi32 { CreateDIBPatternBrush :: proc(h: HGLOBAL, iUsage: UINT) -> HBRUSH --- CreateBitmap :: proc(nWidth: INT, nHeight: INT, nPlanes: UINT, nBitCount: UINT, lpBits: LPVOID) -> HBITMAP --- - CreateDIBitmap :: proc(hdc: HDC, pbmih: ^BITMAPINFOHEADER, flInit: DWORD, pjBits: VOID, pbmi: ^BITMAPINFO, iUsage: UINT) -> HBITMAP --- - CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: ^^VOID, hSection: HANDLE, offset: DWORD) -> HBITMAP --- - StretchDIBits :: proc(hdc: HDC, xDest, yDest, DestWidth, DestHeight, xSrc, ySrc, SrcWidth, SrcHeight: INT, lpBits: VOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT --- + CreateDIBitmap :: proc(hdc: HDC, pbmih: ^BITMAPINFOHEADER, flInit: DWORD, pjBits: PVOID, pbmi: ^BITMAPINFO, iUsage: UINT) -> HBITMAP --- + CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: ^PVOID, hSection: HANDLE, offset: DWORD) -> HBITMAP --- + StretchDIBits :: proc(hdc: HDC, xDest, yDest, DestWidth, DestHeight, xSrc, ySrc, SrcWidth, SrcHeight: INT, lpBits: LPVOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT --- StretchBlt :: proc(hdcDest: HDC, xDest, yDest, wDest, hDest: INT, hdcSrc: HDC, xSrc, ySrc, wSrc, hSrc: INT, rop: DWORD) -> BOOL --- SetPixelFormat :: proc(hdc: HDC, format: INT, ppfd: ^PIXELFORMATDESCRIPTOR) -> BOOL --- @@ -54,7 +54,7 @@ foreign gdi32 { CreateCompatibleBitmap :: proc(hdc: HDC, cx, cy: INT) -> HBITMAP --- BitBlt :: proc(hdc: HDC, x, y, cx, cy: INT, hdcSrc: HDC, x1, y1: INT, rop: DWORD) -> BOOL --- GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> INT --- - SetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start: UINT, cLines: UINT, lpBits: VOID, lpbmi: ^BITMAPINFO, ColorUse: UINT) -> INT --- + SetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start: UINT, cLines: UINT, lpBits: PVOID, lpbmi: ^BITMAPINFO, ColorUse: UINT) -> INT --- SetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- GetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- From 4c981ad10ac1c23bbd74f626d96fbf44a6252d52 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Mon, 2 Mar 2026 21:21:50 +0100 Subject: [PATCH 587/766] Fix return value of FreeLibraryAndExitThread --- core/sys/windows/kernel32.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 670484489..4c4407b7b 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -539,7 +539,7 @@ foreign kernel32 { LoadLibraryW :: proc(c_str: LPCWSTR) -> HMODULE --- LoadLibraryExW :: proc(c_str: LPCWSTR, hFile: HANDLE, dwFlags: LoadLibraryEx_Flags) -> HMODULE --- FreeLibrary :: proc(h: HMODULE) -> BOOL --- - FreeLibraryAndExitThread :: proc(hLibModule: HMODULE, dwExitCode: DWORD) -> VOID --- + FreeLibraryAndExitThread :: proc(hLibModule: HMODULE, dwExitCode: DWORD) --- GetProcAddress :: proc(h: HMODULE, c_str: LPCSTR) -> rawptr --- LoadResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> HGLOBAL --- From 4ab536a85a5ddda52ae9882184fc616ffb553f7c Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Tue, 24 Feb 2026 16:39:16 +0100 Subject: [PATCH 588/766] Drop pointless code Modifies a local variable after it was stored in an out parameter, so this modification has no effect. --- src/parser.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 5ada6d298..a79e39a51 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1434,9 +1434,6 @@ gb_internal Token consume_comment(AstFile *f, isize *end_line_) { if (end_line_) *end_line_ = end_line; next_token0(f); - if (f->curr_token.pos.line > tok.pos.line || tok.kind == Token_EOF) { - end_line++; - } return tok; } From b8f2daa5b2359b349796fe0bc1f5f74dcd4fc0ec Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Mon, 2 Mar 2026 21:14:50 +0100 Subject: [PATCH 589/766] Kill deprecated file tags We had the recommended form of file tags for long enough. Also there were some issues with the deprecated file tags - they were ignored if the appeared after recommended file tags, and could possibly show up in package docs. --- src/parser.cpp | 37 ++++++------------------------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index a79e39a51..833e9ea9f 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6790,37 +6790,12 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { } f->package_name = package_name.string; - { - if (docs != nullptr && docs->list.count > 0) { - for (Token const &tok : docs->list) { - GB_ASSERT(tok.kind == Token_Comment); - String str = tok.string; - - if (!string_starts_with(str, str_lit("//"))) { - continue; - } - - String lc = string_trim_whitespace(substring(str, 2, str.len)); - if (string_starts_with(lc, str_lit("+"))) { - syntax_warning(tok, "'//+' is deprecated: Use '#+' instead"); - String lt = substring(lc, 1, lc.len); - if (parse_file_tag(lt, tok, f) == false) { - return false; - } - } - } - } - - for (Token const &tok : tags) { - GB_ASSERT(tok.kind == Token_FileTag); - String str = tok.string; - - if (string_starts_with(str, str_lit("#+"))) { - String lt = string_trim_whitespace(substring(str, 2, str.len)); - if (parse_file_tag(lt, tok, f) == false) { - return false; - } - } + for (Token const &tok : tags) { + GB_ASSERT(tok.kind == Token_FileTag); + GB_ASSERT(string_starts_with(tok.string, str_lit("#+"))); + String lt = string_trim_whitespace(substring(tok.string, 2, tok.string.len)); + if (parse_file_tag(lt, tok, f) == false) { + return false; } } From 1f00da471cc223488cf333f5361445e120c51bbf Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Tue, 24 Feb 2026 16:31:16 +0100 Subject: [PATCH 590/766] Make sure to assign proper comment as package docs So far, the first comment found was marked as package docs, which meant that for the following code, the TODO comment would be assigned to the package declaration instead of the comment directly preceding the package declaration. // TODO: drop after finished with refactoring #+ feature using-stmt // Package foo implements this and that. package foo --- src/parser.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 833e9ea9f..84fbc5130 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6725,11 +6725,6 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { String filepath = f->tokenizer.fullpath; String base_dir = dir_from_path(filepath); - if (f->curr_token.kind == Token_Comment) { - consume_comment_groups(f, f->prev_token); - } - - CommentGroup *docs = f->lead_comment; Array tags = array_make(temporary_allocator()); bool first_invalid_token_set = false; @@ -6751,6 +6746,8 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { } } + CommentGroup *docs = f->lead_comment; + if (f->curr_token.kind != Token_package) { ERROR_BLOCK(); From 47ad434d1abc470119ce9280dc39615e730a21f4 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Tue, 3 Mar 2026 20:50:07 +0900 Subject: [PATCH 591/766] core:crypto/_blake2: Fix final blocks call with partial block --- core/crypto/_blake2/blake2.odin | 35 +++++++++------------------------ 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/core/crypto/_blake2/blake2.odin b/core/crypto/_blake2/blake2.odin index 4e8fd0a6a..6c3ad0635 100644 --- a/core/crypto/_blake2/blake2.odin +++ b/core/crypto/_blake2/blake2.odin @@ -11,6 +11,7 @@ package _blake2 */ import "base:intrinsics" +import "core:crypto" import "core:encoding/endian" BLAKE2S_BLOCK_SIZE :: 64 @@ -133,7 +134,7 @@ init :: proc "contextless" (ctx: ^$T, cfg: ^Blake2_Config) { p[17] = cfg.tree.(Blake2_Tree).inner_hash_size } } else { - p[2], p[3] = 1, 1 + p[2], p[3], p[4], p[5], p[6], p[7] = 1, 1, 0, 0, 0, 0 } ctx.size = cfg.size for i := 0; i < 8; i += 1 { @@ -222,7 +223,7 @@ reset :: proc "contextless" (ctx: ^$T) { return } - zero_explicit(ctx, size_of(ctx^)) + crypto.zero_explicit(ctx, size_of(ctx^)) } @(private) @@ -244,6 +245,9 @@ blake2s_final :: proc "contextless" (ctx: ^Blake2s_Context, hash: []byte) { ctx.f[1] = 0xffffffff } + for i := ctx.nx; i < BLAKE2S_BLOCK_SIZE; i+= 1 { + ctx.x[i] = 0 + } blocks(ctx, ctx.x[:]) dst: [BLAKE2S_SIZE]byte @@ -272,6 +276,9 @@ blake2b_final :: proc "contextless" (ctx: ^Blake2b_Context, hash: []byte) { ctx.f[1] = 0xffffffffffffffff } + for i := ctx.nx; i < BLAKE2B_BLOCK_SIZE; i+= 1 { + ctx.x[i] = 0 + } blocks(ctx, ctx.x[:]) dst: [BLAKE2B_SIZE]byte @@ -2877,27 +2884,3 @@ blake2b_blocks :: #force_inline proc "contextless" (ctx: ^Blake2b_Context, p: [] ctx.h[0], ctx.h[1], ctx.h[2], ctx.h[3], ctx.h[4], ctx.h[5], ctx.h[6], ctx.h[7] = h0, h1, h2, h3, h4, h5, h6, h7 } - -/* -Set each byte of a memory range to zero. - -This procedure copies the value `0` into the `len` bytes of a memory range, -starting at address `data`. - -This procedure returns the pointer to `data`. - -Unlike the `zero()` procedure, which can be optimized away or reordered by the -compiler under certain circumstances, `zero_explicit()` procedure can not be -optimized away or reordered with other memory access operations, and the -compiler assumes volatile semantics of the memory. -*/ -@(private) -zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { - // This routine tries to avoid the compiler optimizing away the call, - // so that it is always executed. It is intended to provide - // equivalent semantics to those provided by the C11 Annex K 3.7.4.1 - // memset_s call. - intrinsics.mem_zero_volatile(data, len) // Use the volatile mem_zero - intrinsics.atomic_thread_fence(.Seq_Cst) // Prevent reordering - return data -} \ No newline at end of file From a5e1eb56abe72cc149369f4793b444fdc62431ee Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 3 Mar 2026 12:26:42 +0000 Subject: [PATCH 592/766] Add `explicit_underlying: bool` RTTI field for `bit_set`; add `runtime.type_info_underlying` --- base/runtime/core.odin | 34 ++++++++++++++++++++++++++++++---- base/runtime/print.odin | 4 ++-- core/odin/ast/walk.odin | 4 +--- core/reflect/types.odin | 17 ++++------------- src/llvm_backend_type.cpp | 20 +++++++++++++++----- 5 files changed, 52 insertions(+), 27 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 5a0b3766c..d8104b1ec 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -166,10 +166,11 @@ Type_Info_Map :: struct { map_info: ^Map_Info, } Type_Info_Bit_Set :: struct { - elem: ^Type_Info, - underlying: ^Type_Info, // Possibly nil - lower: i64, - upper: i64, + elem: ^Type_Info, + underlying: ^Type_Info, + explicit_underlying: bool, // false = bit_set[T], true = bit_set[T, U] + lower: i64, + upper: i64, } Type_Info_Simd_Vector :: struct { elem: ^Type_Info, @@ -676,6 +677,26 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { return base } +@(require_results) +type_info_underlying :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { + if info == nil { + return nil + } + + base := info + loop: for { + #partial switch i in base.variant { + case Type_Info_Named: base = i.base + case Type_Info_Enum: base = i.base + case Type_Info_Bit_Set: base = i.underlying + case Type_Info_Bit_Field: base = i.backing_type + case: + break loop + } + } + return base +} + // type_info_base_without_enum returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `^Type_Info`. // This is also aliased as `type_info_core` @@ -713,6 +734,11 @@ when !ODIN_NO_RTTI { // returns the backing integer type of an enum or bit_set `typeid`. // This is also aliased as `typeid_core` typeid_base_without_enum :: typeid_core + + typeid_underlying :: proc "contextless" (id: typeid) -> typeid { + ti := type_info_underlying(type_info_of(id)) + return ti.id + } } diff --git a/base/runtime/print.odin b/base/runtime/print.odin index 2cdde8152..6569ece6c 100644 --- a/base/runtime/print.odin +++ b/base/runtime/print.odin @@ -478,7 +478,7 @@ print_type :: #force_no_inline proc "contextless" (ti: ^Type_Info) { print_string("..") print_i64(info.upper) } - if info.underlying != nil { + if info.explicit_underlying { print_string("; ") print_type(info.underlying) } @@ -893,7 +893,7 @@ write_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, t write_string(i, buf, "..") or_return write_i64 (i, buf, info.upper) or_return } - if info.underlying != nil { + if info.explicit_underlying { write_string (i, buf, "; ") or_return write_write_type(i, buf, info.underlying) or_return } diff --git a/core/odin/ast/walk.odin b/core/odin/ast/walk.odin index 24c90c13b..5b9340c62 100644 --- a/core/odin/ast/walk.odin +++ b/core/odin/ast/walk.odin @@ -405,9 +405,7 @@ walk :: proc(v: ^Visitor, node: ^Node) { walk_expr_list(v, n.fields) case ^Bit_Set_Type: walk(v, n.elem) - if n.underlying != nil { - walk(v, n.underlying) - } + walk(v, n.underlying) case ^Map_Type: walk(v, n.key) walk(v, n.value) diff --git a/core/reflect/types.odin b/core/reflect/types.odin index 385edb19b..53561281f 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -442,10 +442,7 @@ is_endian_platform :: proc(info: ^Type_Info) -> bool { case Type_Info_Integer: return v.endianness == .Platform case Type_Info_Bit_Set: - if v.underlying != nil { - return is_endian_platform(v.underlying) - } - return true + return is_endian_platform(v.underlying) case Type_Info_Pointer: return true } @@ -467,10 +464,7 @@ is_endian_little :: proc(info: ^Type_Info) -> bool { } return v.endianness == .Little case Type_Info_Bit_Set: - if v.underlying != nil { - return is_endian_platform(v.underlying) - } - return ODIN_ENDIAN == .Little + return is_endian_little(v.underlying) case Type_Info_Pointer: return ODIN_ENDIAN == .Little } @@ -492,10 +486,7 @@ is_endian_big :: proc(info: ^Type_Info) -> bool { } return v.endianness == .Big case Type_Info_Bit_Set: - if v.underlying != nil { - return is_endian_platform(v.underlying) - } - return ODIN_ENDIAN == .Big + return is_endian_big(v.underlying) case Type_Info_Pointer: return ODIN_ENDIAN == .Big } @@ -754,7 +745,7 @@ write_type_writer :: #force_no_inline proc(w: io.Writer, ti: ^Type_Info, n_writt io.write_string(w, "..=", &n) or_return io.write_i64(w, info.upper, 10, &n) or_return } - if info.underlying != nil { + if info.explicit_underlying { io.write_string(w, "; ", &n) or_return write_type(w, info.underlying, &n) or_return } diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 382304a4e..89c671f7d 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -923,15 +923,25 @@ gb_internal void lb_setup_type_info_data_giant_array(lbModule *m, i64 global_typ GB_ASSERT(is_type_typed(t->BitSet.elem)); - LLVMValueRef vals[4] = { - get_type_info_ptr(m, t->BitSet.elem), - LLVMConstNull(lb_type(m, t_type_info_ptr)), - lb_const_int(m, t_i64, t->BitSet.lower).value, - lb_const_int(m, t_i64, t->BitSet.upper).value, + LLVMValueRef vals[5] = { + get_type_info_ptr(m, t->BitSet.elem), // ^Type_Info + nullptr, // ^Type_Info + nullptr, // bool + lb_const_int(m, t_i64, t->BitSet.lower).value, // i64 + lb_const_int(m, t_i64, t->BitSet.upper).value, // i64 }; + Type *underlying = nullptr; + bool explicit_underlying = false; if (t->BitSet.underlying != nullptr) { + underlying = t->BitSet.underlying; + explicit_underlying = true; vals[1] = get_type_info_ptr(m, t->BitSet.underlying); + vals[2] = lb_const_bool(m, t_bool, true).value; + } else { + underlying = bit_set_to_int(t); } + vals[1] = get_type_info_ptr(m, underlying); + vals[2] = lb_const_bool(m, t_bool, explicit_underlying).value; variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); } From 2cb81559461c6fb0a2a50f77231768dd7c4c14df Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 3 Mar 2026 12:27:44 +0000 Subject: [PATCH 593/766] Add missing `@(require_results)` --- base/runtime/core.odin | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index d8104b1ec..3802bd6f0 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -702,6 +702,7 @@ type_info_underlying :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { // This is also aliased as `type_info_core` type_info_base_without_enum :: type_info_core +@(require_results) __type_info_of :: proc "contextless" (id: typeid) -> ^Type_Info #no_bounds_check { n := u64(len(type_table)) i := transmute(u64)id % n @@ -717,6 +718,7 @@ __type_info_of :: proc "contextless" (id: typeid) -> ^Type_Info #no_bounds_check when !ODIN_NO_RTTI { // typeid_base returns the base-type of a `typeid` stripping the `distinct`ness from the first level + @(require_results) typeid_base :: proc "contextless" (id: typeid) -> typeid { ti := type_info_of(id) ti = type_info_base(ti) @@ -725,6 +727,7 @@ when !ODIN_NO_RTTI { // typeid_core returns the core-type of a `typeid` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `typeid`. // This is also aliased as `typeid_base_without_enum` + @(require_results) typeid_core :: proc "contextless" (id: typeid) -> typeid { ti := type_info_core(type_info_of(id)) return ti.id @@ -735,6 +738,7 @@ when !ODIN_NO_RTTI { // This is also aliased as `typeid_core` typeid_base_without_enum :: typeid_core + @(require_results) typeid_underlying :: proc "contextless" (id: typeid) -> typeid { ti := type_info_underlying(type_info_of(id)) return ti.id From afbb0b4357e2675560d5505e606ad907ca424056 Mon Sep 17 00:00:00 2001 From: IllusionMan1212 Date: Tue, 3 Mar 2026 17:50:31 +0200 Subject: [PATCH 594/766] os: return `.Permission_Denied` for `.EACCES` in posix and linux --- core/os/errors_linux.odin | 2 +- core/os/errors_posix.odin | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/os/errors_linux.odin b/core/os/errors_linux.odin index 891b4177c..713c03359 100644 --- a/core/os/errors_linux.odin +++ b/core/os/errors_linux.odin @@ -148,7 +148,7 @@ _get_platform_error :: proc(errno: linux.Errno) -> Error { #partial switch errno { case .NONE: return nil - case .EPERM: + case .EPERM, .EACCES: return .Permission_Denied case .EEXIST: return .Exist diff --git a/core/os/errors_posix.odin b/core/os/errors_posix.odin index 5233fec1a..45bac931f 100644 --- a/core/os/errors_posix.odin +++ b/core/os/errors_posix.odin @@ -16,7 +16,7 @@ _get_platform_error_from_errno :: proc() -> Error { _get_platform_error_existing :: proc(errno: posix.Errno) -> Error { #partial switch errno { - case .EPERM: + case .EPERM, .EACCES: return .Permission_Denied case .EEXIST: return .Exist From b351b58ddc5946764ad8342378add8c8b5e2d3bc Mon Sep 17 00:00:00 2001 From: Franz Hoeltermann Date: Tue, 3 Mar 2026 17:22:31 +0100 Subject: [PATCH 595/766] Fix #6270 --- src/check_expr.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 7f0acb4c6..80df35edc 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3664,6 +3664,24 @@ gb_internal void check_cast(CheckerContext *c, Operand *x, Type *type, bool forb } } + if (is_const_expr) { + Type *src = core_type(x->type); + Type *dst = core_type(type); + + if (is_type_string(src) && is_type_string(dst)) { + bool src_utf16 = is_type_string16(src) || is_type_cstring16(src); + bool dst_utf16 = is_type_string16(dst) || is_type_cstring16(dst); + + if (!src_utf16 && dst_utf16) { + x->value = exact_value_string16(string_to_string16(permanent_allocator(), x->value.value_string)); + } + + if (src_utf16 && !dst_utf16) { + x->value = exact_value_string(string16_to_string(permanent_allocator(), x->value.value_string16)); + } + } + } + x->type = type; } From 1a5126c6b793ada0290984e66eedef5377e18838 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 4 Mar 2026 00:29:37 +0100 Subject: [PATCH 596/766] Make CI less nervous. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67c047472..8735945b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -140,7 +140,7 @@ jobs: - name: Optimized Core library tests run: ./odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Wycheproof tests - run: ./odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed -microarch:native + run: ./odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed - name: Vendor library tests run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Internals tests From 058bd9a91459af449c0ff89e38e25ada0ac852a8 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Wed, 4 Mar 2026 20:07:52 +0900 Subject: [PATCH 597/766] core:crypto/_blake2: Cleanups and fixes The fixes apply to "use it as a MAC" which was not part of the documented/exposed API. It now is, and is covered by the self-test routines from the RFC. --- core/crypto/_blake2/blake2.odin | 55 ++------ core/crypto/blake2b/blake2b.odin | 13 +- core/crypto/blake2s/blake2s.odin | 13 +- tests/core/crypto/test_core_crypto_hash.odin | 140 ++++++++++++++++++- 4 files changed, 178 insertions(+), 43 deletions(-) diff --git a/core/crypto/_blake2/blake2.odin b/core/crypto/_blake2/blake2.odin index 6c3ad0635..cf7111c70 100644 --- a/core/crypto/_blake2/blake2.odin +++ b/core/crypto/_blake2/blake2.odin @@ -19,17 +19,12 @@ BLAKE2S_SIZE :: 32 BLAKE2B_BLOCK_SIZE :: 128 BLAKE2B_SIZE :: 64 -MAX_SIZE :: 255 - Blake2s_Context :: struct { h: [8]u32, t: [2]u32, f: [2]u32, x: [BLAKE2S_BLOCK_SIZE]byte, nx: int, - ih: [8]u32, - padded_key: [BLAKE2S_BLOCK_SIZE]byte, - is_keyed: bool, size: byte, is_last_node: bool, @@ -42,9 +37,6 @@ Blake2b_Context :: struct { f: [2]u64, x: [BLAKE2B_BLOCK_SIZE]byte, nx: int, - ih: [8]u64, - padded_key: [BLAKE2B_BLOCK_SIZE]byte, - is_keyed: bool, size: byte, is_last_node: bool, @@ -87,11 +79,12 @@ BLAKE2B_IV := [8]u64 { init :: proc "contextless" (ctx: ^$T, cfg: ^Blake2_Config) { when T == Blake2s_Context { - max_size :: BLAKE2S_SIZE + MAX_SIZE :: BLAKE2S_SIZE } else when T == Blake2b_Context { - max_size :: BLAKE2B_SIZE + MAX_SIZE :: BLAKE2B_SIZE } - ensure_contextless(cfg.size <= max_size, "blake2: requested output size exceeeds algorithm max") + ensure_contextless(cfg.size <= MAX_SIZE, "blake2: requested output size exceeeds algorithm max") + ensure_contextless(len(cfg.key) <= MAX_SIZE, "blake2: requested key size exceeeds algorithm max") // To save having to allocate a scratch buffer, use the internal // data buffer (`ctx.x`), as it is exactly the correct size. @@ -152,17 +145,11 @@ init :: proc "contextless" (ctx: ^$T, cfg: ^Blake2_Config) { ctx.is_last_node = true } if len(cfg.key) > 0 { - copy(ctx.padded_key[:], cfg.key) - update(ctx, ctx.padded_key[:]) - ctx.is_keyed = true + copy(ctx.x[:], cfg.key) + ctx.nx = len(ctx.x) + } else { + ctx.nx = 0 } - copy(ctx.ih[:], ctx.h[:]) - copy(ctx.h[:], ctx.ih[:]) - if ctx.is_keyed { - update(ctx, ctx.padded_key[:]) - } - - ctx.nx = 0 ctx.is_initialized = true } @@ -172,22 +159,22 @@ update :: proc "contextless" (ctx: ^$T, p: []byte) { p := p when T == Blake2s_Context { - block_size :: BLAKE2S_BLOCK_SIZE + BLOCK_SIZE :: BLAKE2S_BLOCK_SIZE } else when T == Blake2b_Context { - block_size :: BLAKE2B_BLOCK_SIZE + BLOCK_SIZE :: BLAKE2B_BLOCK_SIZE } - left := block_size - ctx.nx + left := BLOCK_SIZE - ctx.nx if len(p) > left { copy(ctx.x[ctx.nx:], p[:left]) p = p[left:] blocks(ctx, ctx.x[:]) ctx.nx = 0 } - if len(p) > block_size { - n := len(p) &~ (block_size - 1) + if len(p) > BLOCK_SIZE { + n := len(p) &~ (BLOCK_SIZE - 1) if n == len(p) { - n -= block_size + n -= BLOCK_SIZE } blocks(ctx, p[:n]) p = p[n:] @@ -228,12 +215,6 @@ reset :: proc "contextless" (ctx: ^$T) { @(private) blake2s_final :: proc "contextless" (ctx: ^Blake2s_Context, hash: []byte) { - if ctx.is_keyed { - for i := 0; i < len(ctx.padded_key); i += 1 { - ctx.padded_key[i] = 0 - } - } - dec := BLAKE2S_BLOCK_SIZE - u32(ctx.nx) if ctx.t[0] < dec { ctx.t[1] -= 1 @@ -254,17 +235,11 @@ blake2s_final :: proc "contextless" (ctx: ^Blake2s_Context, hash: []byte) { for i := 0; i < BLAKE2S_SIZE / 4; i += 1 { endian.unchecked_put_u32le(dst[i * 4:], ctx.h[i]) } - copy(hash, dst[:]) + copy(hash, dst[:ctx.size]) } @(private) blake2b_final :: proc "contextless" (ctx: ^Blake2b_Context, hash: []byte) { - if ctx.is_keyed { - for i := 0; i < len(ctx.padded_key); i += 1 { - ctx.padded_key[i] = 0 - } - } - dec := BLAKE2B_BLOCK_SIZE - u64(ctx.nx) if ctx.t[0] < dec { ctx.t[1] -= 1 diff --git a/core/crypto/blake2b/blake2b.odin b/core/crypto/blake2b/blake2b.odin index 4590ca40e..6c2c5c1e9 100644 --- a/core/crypto/blake2b/blake2b.odin +++ b/core/crypto/blake2b/blake2b.odin @@ -28,13 +28,24 @@ Context :: _blake2.Blake2b_Context // init initializes a Context with the default BLAKE2b config. init :: proc(ctx: ^Context, digest_size := DIGEST_SIZE) { - ensure(digest_size <= _blake2.MAX_SIZE, "crypto/blake2b: invalid digest size") + ensure(digest_size <= DIGEST_SIZE, "crypto/blake2b: invalid digest size") cfg: _blake2.Blake2_Config cfg.size = u8(digest_size) _blake2.init(ctx, &cfg) } +// init_mac initializes a Context with a user provided key. +init_mac :: proc(ctx: ^Context, key: []byte, digest_size := DIGEST_SIZE) { + ensure(digest_size <= DIGEST_SIZE, "crypto/blake2b: invalid digest size") + ensure(len(key) <= DIGEST_SIZE, "crypto/blake2b: invalid key size") + + cfg: _blake2.Blake2_Config + cfg.size = u8(digest_size) + cfg.key = key + _blake2.init(ctx, &cfg) +} + // update adds more data to the Context. update :: proc(ctx: ^Context, data: []byte) { _blake2.update(ctx, data) diff --git a/core/crypto/blake2s/blake2s.odin b/core/crypto/blake2s/blake2s.odin index 37da53360..902f992b3 100644 --- a/core/crypto/blake2s/blake2s.odin +++ b/core/crypto/blake2s/blake2s.odin @@ -28,13 +28,24 @@ Context :: _blake2.Blake2s_Context // init initializes a Context with the default BLAKE2s config. init :: proc(ctx: ^Context, digest_size := DIGEST_SIZE) { - ensure(digest_size <= _blake2.MAX_SIZE, "crypto/blake2s: invalid digest size") + ensure(digest_size <= DIGEST_SIZE, "crypto/blake2s: invalid digest size") cfg: _blake2.Blake2_Config cfg.size = u8(digest_size) _blake2.init(ctx, &cfg) } +// init_mac initializes a Context with a user provided key. +init_mac :: proc(ctx: ^Context, key: []byte, digest_size := DIGEST_SIZE) { + ensure(digest_size <= DIGEST_SIZE, "crypto/blake2s: invalid digest size") + ensure(len(key) <= DIGEST_SIZE, "crypto/blake2s: invalid key size") + + cfg: _blake2.Blake2_Config + cfg.size = u8(digest_size) + cfg.key = key + _blake2.init(ctx, &cfg) +} + // update adds more data to the Context. update :: proc(ctx: ^Context, data: []byte) { _blake2.update(ctx, data) diff --git a/tests/core/crypto/test_core_crypto_hash.odin b/tests/core/crypto/test_core_crypto_hash.odin index 9a9d0cc76..805f3528a 100644 --- a/tests/core/crypto/test_core_crypto_hash.odin +++ b/tests/core/crypto/test_core_crypto_hash.odin @@ -5,6 +5,9 @@ import "core:bytes" import "core:encoding/hex" import "core:strings" import "core:testing" + +import "core:crypto/blake2b" +import "core:crypto/blake2s" import "core:crypto/hash" @(test) @@ -596,4 +599,139 @@ test_hash :: proc(t: ^testing.T) { c_str, ) } -} \ No newline at end of file +} + +@(private="file") +selftest_seq :: proc(dst: []byte, seed: u32) { + a := 0xdead4bad * seed + b: u32 = 1 + + for i in 0 ..< len(dst) { + a, b = b, a + b + dst[i] = byte(b >> 24) + } +} + +@(test) +test_blake2b_self :: proc(t: ^testing.T) { + expected := []byte{ + 0xC2, 0x3A, 0x78, 0x00, 0xD9, 0x81, 0x23, 0xBD, + 0x10, 0xF5, 0x06, 0xC6, 0x1E, 0x29, 0xDA, 0x56, + 0x03, 0xD7, 0x63, 0xB8, 0xBB, 0xAD, 0x2E, 0x73, + 0x7F, 0x5E, 0x76, 0x5A, 0x7B, 0xCC, 0xD4, 0x75, + } + md_lens := []int{20, 32, 48, 64} + src_lens := []int{0, 3, 128, 129, 255, 1024} + + b2b := proc(dst, src: []byte) { + ctx: blake2b.Context + + blake2b.init(&ctx, len(dst)) + blake2b.update(&ctx, src) + blake2b.final(&ctx, dst) + } + b2b_keyed := proc(dst, key, src: []byte) { + ctx: blake2b.Context + + blake2b.init_mac(&ctx, key, len(dst)) + blake2b.update(&ctx, src) + blake2b.final(&ctx, dst) + } + + buf: [1024]byte + md, key: [64]byte + + ctx: blake2b.Context + blake2b.init(&ctx, 32) + + for md_len in md_lens { + dst := md[:md_len] + for src_len in src_lens { + src := buf[:src_len] + + selftest_seq(src, u32(src_len)) + b2b(dst, src) + blake2b.update(&ctx, dst) + + k := key[:md_len] + selftest_seq(k, u32(md_len)) + b2b_keyed(dst, k, src) + blake2b.update(&ctx, dst) + } + } + + blake2b.final(&ctx, md[:32]) + + expected_str := string(hex.encode(expected, context.temp_allocator)) + actual_str := string(hex.encode(md[:32], context.temp_allocator)) + + testing.expectf( + t, + expected_str == actual_str, + "blake2b/self-test: Expected: %s Got %s", + expected_str, + actual_str, + ) +} + +@(test) +test_blake2s_self :: proc(t: ^testing.T) { + expected := []byte{ + 0x6A, 0x41, 0x1F, 0x08, 0xCE, 0x25, 0xAD, 0xCD, + 0xFB, 0x02, 0xAB, 0xA6, 0x41, 0x45, 0x1C, 0xEC, + 0x53, 0xC5, 0x98, 0xB2, 0x4F, 0x4F, 0xC7, 0x87, + 0xFB, 0xDC, 0x88, 0x79, 0x7F, 0x4C, 0x1D, 0xFE, + } + md_lens := []int{16, 20, 28, 32} + src_lens := []int{0, 3, 64, 65, 255, 1024} + + b2s := proc(dst, src: []byte) { + ctx: blake2s.Context + + blake2s.init(&ctx, len(dst)) + blake2s.update(&ctx, src) + blake2s.final(&ctx, dst) + } + b2s_keyed := proc(dst, key, src: []byte) { + ctx: blake2s.Context + + blake2s.init_mac(&ctx, key, len(dst)) + blake2s.update(&ctx, src) + blake2s.final(&ctx, dst) + } + + buf: [1024]byte + md, key: [32]byte + + ctx: blake2s.Context + blake2s.init(&ctx) + + for md_len in md_lens { + dst := md[:md_len] + for src_len in src_lens { + src := buf[:src_len] + + selftest_seq(src, u32(src_len)) + b2s(dst, src) + blake2s.update(&ctx, dst) + + k := key[:md_len] + selftest_seq(k, u32(md_len)) + b2s_keyed(dst, k, src) + blake2s.update(&ctx, dst) + } + } + + blake2s.final(&ctx, md[:]) + + expected_str := string(hex.encode(expected, context.temp_allocator)) + actual_str := string(hex.encode(md[:], context.temp_allocator)) + + testing.expectf( + t, + expected_str == actual_str, + "blake2s/self-test: Expected: %s Got %s", + expected_str, + actual_str, + ) +} From 86b629ba8415be86ad12f6a542b3f1cb8e3d99ee Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 18 Jan 2025 11:44:21 +0900 Subject: [PATCH 598/766] core/crypto/argon2id: Initial import --- core/crypto/argon2id/argon2id.odin | 622 +++++++++++++++++++ examples/all/all_js.odin | 1 + examples/all/all_main.odin | 1 + tests/core/crypto/test_core_crypto_hash.odin | 4 +- tests/core/crypto/test_core_crypto_kdf.odin | 53 ++ 5 files changed, 679 insertions(+), 2 deletions(-) create mode 100644 core/crypto/argon2id/argon2id.odin diff --git a/core/crypto/argon2id/argon2id.odin b/core/crypto/argon2id/argon2id.odin new file mode 100644 index 000000000..3bff5a3a9 --- /dev/null +++ b/core/crypto/argon2id/argon2id.odin @@ -0,0 +1,622 @@ +/* +package argon2id implements the Argon2id password hashing algorithm. + +See: [[ https://datatracker.ietf.org/doc/rfc9106/ ]] +*/ +package argon2id + +import "core:crypto/blake2b" +import "core:encoding/endian" +import "core:math/bits" +import "core:mem" + +// Implementation based on the RFC, Monocypher (CC0-1.0), and the reference +// code (CC0-1.0). + +// MAX_INPUT_SIZE is the mamximum size of the various inputs (password, +// salt, secret, ad) in bytes. +MAX_INPUT_SIZE :: (1 << 32) - 1 + +// MIN_PARALLELISM is the minimum allowed parallelism. +MIN_PARALLELISM :: 1 +// MAX_PARALLELISM is the maximum allowed parallelism. +MAX_PARALLELISM :: (1 << 24) - 1 + +// MIN_TAG_SIZE is the minimum digest size in bytes. +MIN_TAG_SIZE :: 4 +// MAX_TAG_SIZE is the maximum digest size in bytes. +MAX_TAG_SIZE :: (1 << 32) - 1 + +// RECOMMENDED_TAG_SIZE is the recommended tag size in bytes. +RECOMMENTED_TAG_SIZE :: 32 // 256-bits +// RECOMMENDNED_SALT_SIZE is the recommended salt size in bytes. +RECOMMENDED_SALT_SIZE :: 16 // 128-bits + +@(private) +V_RFC9106 :: 0x13 +@(private) +Y_ID :: 0x02 +@(private) +BLOCK_SIZE_BYTES :: 1024 +@(private) +BLOCK_SIZE_U64 :: 128 + +// PARAMS_RFC9106 is the first recommended "uniformly safe" parameter set +// per RFC 9106. +@(rodata) +PARAMS_RFC9106 := Parameters{ + memory_size = 2 * 1024 * 1024, // 2 GiB + passes = 1, + parallelism = 4, +} + +// PARAMS_RFC9106_SMALL is the second recommended "uniformly safe" parameter +// set per RFC 9106 tailored for memory constrained environments. +@(rodata) +PARAMS_RFC9106_SMALL := Parameters{ + memory_size = 64 * 1024, // 64 MiB + passes = 3, + parallelism = 4, +} + +// PARAMS_OWASP is one of the recommended parameter set from the OWASP +// Password Storage Cheat Sheet (as of 2026/02). The cheat sheet contains +// additional variations to this parameter set with various trade-offs +// between `memory_size` and `passes` that are intended to provide +// equivalent security. +// +// See: [[ https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html ]] +@(rodata) +PARAMS_OWASP := Parameters{ + memory_size = 19 * 1024, // 19 MiB + passes = 2, + parallelism = 1, +} + +// PARAMS_OWASP_SMALL is equivalent in strength to PARAMS_OWASP, but +// trades off less memory use for more CPU usage. +@(rodata) +PARAMS_OWASP_SMALL := Parameters{ + memory_size = 7 * 1024, // 7 MiB + passes = 5, + parallelism = 1, +} + +// Parameters is an Argon2id parameter set. +Parameters :: struct { + memory_size: u32, // m (KiB) + passes: u32, // t + parallelism: u32, // p +} + +@(private) +Block :: [BLOCK_SIZE_U64]u64 + +// derive invokes Argon2id with the specified parameter set and inputs, +// and outputs the derived key to dst. +@(require_results) +derive :: proc( + parameters: ^Parameters, + password: []byte, // P + salt: []byte, // S + dst: []byte, + secret: []byte = nil, // K (aka `pepper`) + ad: []byte = nil, // X + sanitize := true, + allocator := context.allocator, // Not temp as this can be large. +) -> mem.Allocator_Error #no_bounds_check { + if u64(len(password)) > MAX_INPUT_SIZE { + panic("crypto/argon2id: invalid password size") + } + if u64(len(salt)) > MAX_INPUT_SIZE { + panic("crypto/argon2id: invalid salt size") + } + if u64(len(secret)) > MAX_INPUT_SIZE { + panic("crypto/argon2id: invalid secret size") + } + if u64(len(ad)) > MAX_INPUT_SIZE { + panic("crypto/argon2id: invalid ad size") + } + if l := u64(len(dst)); l > MAX_TAG_SIZE || l < MIN_TAG_SIZE { + panic("crypto/argon2id: invalid dst size") + } + + p, t, m := parameters.parallelism, parameters.passes, u64(parameters.memory_size) + if p < MIN_PARALLELISM || p > MAX_PARALLELISM { + panic("crypto/argon2id: invalid parallelism") + } + if t < 1 { + panic("crypto/argon2id: invalid passes") + } + if m < 8 * u64(p) { + panic("crypto/argon2id: insufficient memory size") + } + if m * BLOCK_SIZE_BYTES > u64(max(int)) { + panic("crypto/argon2id: excessive memory size") + } + + // Allocate the memory as m' 1024-byte blocks, where m' is derived as: + // m' = 4 * p * floor (m / 4p) + // + // For p lanes, the memory is organized in a matrix B[i][j] of + // blocks with p rows (lanes) and q = m' / p columns. + m_ := 4 * u64(p) * (m / u64(4 * p)) + b := mem.alloc_bytes_non_zeroed( + int(m_) * BLOCK_SIZE_BYTES, + alignment = mem.DEFAULT_PAGE_SIZE, + allocator = allocator, + ) or_return + defer delete(b, allocator) + + block_buf: [BLOCK_SIZE_BYTES]byte = --- + + blocks := ([^]Block)(raw_data(b))[:m_] + segment_size := u32(m_ / u64(p) / 4) + lane_size := segment_size * 4 + + // Establish H_0 as the 64-byte value as shown below. If K, X, or S + // has zero length, it is just absent, but its length field remains. + // + // H_0 = H^(64)(LE32(p) || LE32(T) || LE32(m) || LE32(t) || + // LE32(v) || LE32(y) || LE32(length(P)) || P || + // LE32(length(S)) || S || LE32(length(K)) || K || + // LE32(length(X)) || X) + { + ctx: blake2b.Context + blake2b.init(&ctx) + + blake2b_update_u32le(&ctx, u32(p)) + blake2b_update_u32le(&ctx, u32(len(dst))) + blake2b_update_u32le(&ctx, parameters.memory_size) + blake2b_update_u32le(&ctx, t) + blake2b_update_u32le(&ctx, V_RFC9106) + blake2b_update_u32le(&ctx, Y_ID) + blake2b_update_u32le(&ctx, u32(len(password))) + blake2b.update(&ctx, password) + blake2b_update_u32le(&ctx, u32(len(salt))) + blake2b.update(&ctx, salt) + blake2b_update_u32le(&ctx, u32(len(secret))) + blake2b.update(&ctx, secret) + blake2b_update_u32le(&ctx, u32(len(ad))) + blake2b.update(&ctx, ad) + + h_0: [blake2b.DIGEST_SIZE+8]byte + blake2b.final(&ctx, h_0[:blake2b.DIGEST_SIZE]) + + // Compute B[i][0] for all i ranging from (and including) 0 to (not + // including) p. + // + // B[i][0] = H'^(1024)(H_0 || LE32(0) || LE32(i)) + // + // Compute B[i][1] for all i ranging from (and including) 0 to (not + // including) p. + // + // B[i][1] = H'^(1024)(H_0 || LE32(1) || LE32(i)) + for l in u32(0) ..< p { + for i in u32(0) ..< 2 { + endian.unchecked_put_u32le(h_0[blake2b.DIGEST_SIZE:], i) // LE32({0,1}) + endian.unchecked_put_u32le(h_0[blake2b.DIGEST_SIZE+4:], l) // LE32(i) + h_prime(block_buf[:], h_0[:]) + blk := &blocks[l * lane_size + i] + for j in 0 ..< BLOCK_SIZE_U64 { + blk[j] = endian.unchecked_get_u64le(block_buf[j*8:]) + } + } + } + + mem.zero_explicit(&h_0, size_of(h_0)) // No longer needed. + } + + // Compute B[i][j] for all i ranging from (and including) 0 to (not + // including) p and for all j ranging from (and including) 2 to (not + // including) q. The computation MUST proceed slicewise + // (Section 3.4): first, blocks from slice 0 are computed for all + // lanes (in an arbitrary order of lanes), then blocks from slice 1 + // are computed, etc. The block indices l and z are determined for + // each i, j differently for Argon2d, Argon2i, and Argon2id. + // + // B[i][j] = G(B[i][j-1], B[l][z]) + // + // If the number of passes t is larger than 1, we repeat step 5. We + // compute B[i][0] and B[i][j] for all i raging from (and including) + // 0 to (not including) p and for all j ranging from (and including) + // 1 to (not including) q. However, blocks are computed differently + // as the old value is XORed with the new one: + // + // B[i][0] = G(B[i][q-1], B[l][z]) XOR B[i][0]; + // B[i][j] = G(B[i][j-1], B[l][z]) XOR B[i][j]. + constant_time := true // Start with constant time indexing. + tmp, index_block: Block = ---, --- + for pass in u32(0) ..< t { + for slice in u32(0) ..< 4 { + // The first slice of the first pass has blocks 0 and 1 + // pre-filled. + pass_offset: u32 = pass == 0 && slice == 0 ? 2 : 0 + slice_offset := slice * segment_size + + // 3.4.1.3. Argon2id + // + // If the pass number is 0 and the slice number is 0 or 1, then compute + // J_1 and J_2 as for Argon2i, else compute J_1 and J_2 as for Argon2d. + if slice == 2 { + constant_time = false + } + + // Each segment can be processed in parallel, as long as + // each iteration of the loop completes before proceeding + // to the next. For simplicity we do this in serial + // instead of using threads. + for segment in u32(0) ..< u32(p) { + index_ctr: u64 = 1 + for block in pass_offset ..< segment_size { + // Current and previous blocks (indexes, not pointers) + lane_offset := segment * lane_size + segment_start := lane_offset + slice_offset + current := segment_start + block + previous := segment_start - 1 + switch { + case block == 0 && slice_offset == 0: + previous += lane_size + case: + previous += block + } + + index_seed: u64 + if constant_time { + // 3.4.1.2. Argon2i + // + // For each segment, we do the following. First, we compute the value Z + // as: + // + // Z= ( LE64(r) || LE64(l) || LE64(sl) || LE64(m') || + // LE64(t) || LE64(y) ) + // + // Figure 11: Input to Compute J1,J2 in Argon2i + // + // where + // + // r: the pass number + // l: the lane number + // sl: the slice number + // m': the total number of memory blocks + // t: the total number of passes + // y: the Argon2 type (0 for Argon2d, 1 for Argon2i, 2 for Argon2id) + // + // Then we compute: + // + // q/(128*SL) 1024-byte values + // G(ZERO(1024),G(ZERO(1024), + // Z || LE64(1) || ZERO(968) )), + // G(ZERO(1024),G(ZERO(1024), + // Z || LE64(2) || ZERO(968) )),... , + // G(ZERO(1024),G(ZERO(1024), + // Z || LE64(q/(128*SL)) || ZERO(968) )), + // + // which are partitioned into q/(SL) 8-byte values X, which are viewed + // as X1||X2 and converted to J_1=int32(X1) and J_2=int32(X2). + // + // The values r, l, sl, m', t, y, and i are represented as 8 bytes in + // little endian. + if block == pass_offset || (block % 128) == 0 { + mem.zero(&index_block, size_of(index_block)) + index_block[0] = u64(pass) + index_block[1] = u64(segment) + index_block[2] = u64(slice) + index_block[3] = u64(lane_size * p) + index_block[4] = u64(t) // passes + index_block[5] = Y_ID + index_block[6] = index_ctr + index_ctr += 1 + + copy(tmp[:], index_block[:]) + g_rounds(&index_block) + xor_block(&index_block, &tmp) + copy(tmp[:], index_block[:]) + g_rounds(&index_block) + xor_block(&index_block, &tmp) + } + index_seed = index_block[block % 128] + } else { + // 3.4.1.1. Argon2d + // + // J_1 is given by the first 32 bits of block B[i][j-1], while J_2 is + // given by the next 32 bits of block B[i][j-1]: + // + // J_1 = int32(extract(B[i][j-1], 0)) + // J_2 = int32(extract(B[i][j-1], 1)) + // + // Figure 10: Deriving J1,J2 in Argon2d + index_seed = blocks[previous][0] + } + + // 3.4.2. Mapping J_1 and J_2 to Reference Block Index [l][z] + // + // The value of l = J_2 mod p gives the index of the lane from which the + // block will be taken. For the first pass (r=0) and the first slice + // (sl=0), the block is taken from the current lane. + // + // The set W contains the indices that are referenced according to the + // following rules: + // + // 1. If l is the current lane, then W includes the indices of all + // blocks in the last SL - 1 = 3 segments computed and finished, as + // well as the blocks computed in the current segment in the current + // pass excluding B[i][j-1]. + // + // 2. If l is not the current lane, then W includes the indices of all + // blocks in the last SL - 1 = 3 segments computed and finished in + // lane l. If B[i][j] is the first block of a segment, then the + // very last index from W is excluded. + // + // Then take a block from W with a nonuniform distribution over [0, |W|) + // using the following mapping: + // + // J_1 -> |W|(1 - J_1^2 / 2^(64)) + // + // Figure 12: Computing J1 + // + // To avoid floating point computation, the following approximation is + // used: + // + // x = J_1^2 / 2^(32) + // y = (|W| * x) / 2^(32) + // zz = |W| - 1 - y + // + // Figure 13: Computing J1, Part 2 + // + // Then take the zz-th index from W; it will be the z value for the + // reference block index [l][z]. + next_slice: u32 = ((slice + 1) % 4) * segment_size + window_start, nb_segments: u32 + lane := u32(index_seed >> 32) % p + switch { + case pass == 0: + nb_segments = slice + if slice == 0 { + lane = segment + } + case: + window_start = next_slice + nb_segments = 3 + } + window_size := nb_segments * segment_size + if lane == segment { + window_size += block - 1 + } else if block == 0 { + window_size += ~u32(0) + } + + j1 := index_seed & 0xffffffff + x := (j1 * j1) >> 32 + y := (u64(window_size) * x) >> 32 + z := (u64(window_size) - 1) - y + ref := u32((u64(window_start) + z) % u64(lane_size)) + reference: u32 = lane * lane_size + ref + + copy(tmp[:], blocks[previous][:]) + xor_block(&tmp, &blocks[reference]) + if pass == 0 { + copy(blocks[current][:], tmp[:]) + } else { + xor_block(&blocks[current], &tmp) + } + g_rounds(&tmp) + xor_block(&blocks[current], &tmp) + } + } + } + } + mem.zero_explicit(&tmp, size_of(tmp)) + mem.zero_explicit(&index_block, size_of(index_block)) + + // After t steps have been iterated, the final block C is computed + // as the XOR of the last column: + // + // C = B[0][q-1] XOR B[1][q-1] XOR ... XOR B[p-1][q-1] + idx := lane_size - 1 + last_block := &blocks[idx] + for _ in 1 ..< p { + idx += lane_size + next_block := &blocks[idx] + xor_block(next_block, last_block) + last_block = next_block + } + + for v, i in last_block { + endian.unchecked_put_u64le(block_buf[i*8:], v) + } + + // The output tag is computed as H'^T(C). + h_prime(dst, block_buf[:]) + mem.zero_explicit(&block_buf, size_of(block_buf)) + + // Sanitize the working memory. While the RFC implies that this is + // optional ("enable the memory-wiping option in the library call"), + // the reference code defaults to enabling it. + // + // An opt-out is provided, as this can get somewhat expensive when + // m gets large. + if sanitize { + mem.zero_explicit(raw_data(b), len(b)) + } + + return nil +} + +@(private) +xor_block :: #force_inline proc(dst, src: ^Block) { + for v, i in src { + dst[i] ~= v + } +} + +@(private) +blake2b_update_u32le :: #force_inline proc(ctx: ^blake2b.Context, i: u32) { + tmp: [4]byte = --- + endian.unchecked_put_u32le(tmp[:], i) + blake2b.update(ctx, tmp[:]) + mem.zero_explicit(&tmp, size_of(tmp)) // Probably overkill. +} + +// 3.3. Variable-Length Hash Function H' +// +// Let V_i be a 64-byte block and W_i be its first 32 bytes. Then we +// define function H' as follows: +// +// if T <= 64 +// H'^T(A) = H^T(LE32(T)||A) +// else +// r = ceil(T/32)-2 +// V_1 = H^(64)(LE32(T)||A) +// V_2 = H^(64)(V_1) +// ... +// V_r = H^(64)(V_{r-1}) +// V_{r+1} = H^(T-32*r)(V_{r}) +// H'^T(X) = W_1 || W_2 || ... || W_r || V_{r+1} +// +// Figure 8: Function H' for Tag and Initial Block Computations +@(private) +h_prime :: proc(dst, src: []byte) { + t := len(dst) + ctx: blake2b.Context + blake2b.init(&ctx, min(t, blake2b.DIGEST_SIZE)) + blake2b_update_u32le(&ctx, u32(t)) + blake2b.update(&ctx, src) + blake2b.final(&ctx, dst) + + if t > 64 { + r := u32((u64(t) + 31) >> 5) - 2 + i: u32 = 1 + off_in := 0 + off_out := 32 + for i < r { + blake2b.init(&ctx, blake2b.DIGEST_SIZE) + blake2b.update(&ctx, dst[off_in:off_in+64]) + blake2b.final(&ctx, dst[off_out:]) + i += 1 + off_in += 32 + off_out += 32 + } + blake2b.init(&ctx, t - int(32 * r)) + blake2b.update(&ctx, dst[off_in:off_in+64]) + blake2b.final(&ctx, dst[off_out:]) + } +} + +// GB(a, b, c, d) is defined as follows: +// +// a = (a + b + 2 * trunc(a) * trunc(b)) mod 2^(64) +// d = (d XOR a) >>> 32 +// c = (c + d + 2 * trunc(c) * trunc(d)) mod 2^(64) +// b = (b XOR c) >>> 24 +// +// a = (a + b + 2 * trunc(a) * trunc(b)) mod 2^(64) +// d = (d XOR a) >>> 16 +// c = (c + d + 2 * trunc(c) * trunc(d)) mod 2^(64) +// b = (b XOR c) >>> 63 +// +// Figure 19: Details of GB +// +// The modular additions in GB are combined with 64-bit multiplications. +// Multiplications are the only difference from the original BLAKE2b +// design. This choice is done to increase the circuit depth and thus +// the running time of ASIC implementations, while having roughly the +// same running time on CPUs thanks to parallelism and pipelining. +@(private,require_results) +gb :: #force_inline proc(a, b, c, d: u64) -> (u64, u64, u64, u64) { + a, b, c, d := a, b, c, d + + trunc := #force_inline proc(v: u64) -> u64 { + return u64(u32(v)) + } + + a += b + ((trunc(a) * trunc(b)) << 1) + d = bits.rotate_left64(d ~ a, 32) // >>> 32 + c += d + ((trunc(c) * trunc(d)) << 1) + b = bits.rotate_left64((b ~ c), 40) // >>> 24 + + a += b + ((trunc(a) * trunc(b)) << 1) + d = bits.rotate_left64(d ~ a, 48) // >>> 16 + c += d + ((trunc(c) * trunc(d)) << 1) + b = bits.rotate_left64((b ~ c), 1) // >>> 63 + + return a, b, c, d +} + +// 3.6. Permutation P +// +// Permutation P is based on the round function of BLAKE2b. The eight +// 16-byte inputs S_0, S_1, ... , S_7 are viewed as a 4x4 matrix of +// 64-bit words, where S_i = (v_{2*i+1} || v_{2*i}): +// +// v_0 v_1 v_2 v_3 +// v_4 v_5 v_6 v_7 +// v_8 v_9 v_10 v_11 +// v_12 v_13 v_14 v_15 +// +// Figure 17: Matrix Element Labeling +// +// It works as follows: +// +// GB(v_0, v_4, v_8, v_12) +// GB(v_1, v_5, v_9, v_13) +// GB(v_2, v_6, v_10, v_14) +// GB(v_3, v_7, v_11, v_15) +// +// GB(v_0, v_5, v_10, v_15) +// GB(v_1, v_6, v_11, v_12) +// GB(v_2, v_7, v_8, v_13) +// GB(v_3, v_4, v_9, v_14) +// +// Figure 18: Feeding Matrix Elements to GB +@(private,require_results) +perm_p :: #force_inline proc(v_0, v_1, v_2, v_3, v_4, v_5, v_6, v_7, v_8, v_9, v_10, v_11, v_12, v_13, v_14, v_15: u64) -> (u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64) { + v_0, v_1, v_2, v_3, v_4, v_5, v_6, v_7, v_8, v_9, v_10, v_11, v_12, v_13, v_14, v_15 := v_0, v_1, v_2, v_3, v_4, v_5, v_6, v_7, v_8, v_9, v_10, v_11, v_12, v_13, v_14, v_15 + + v_0, v_4, v_8, v_12 = gb(v_0, v_4, v_8, v_12) + v_1, v_5, v_9, v_13 = gb(v_1, v_5, v_9, v_13) + v_2, v_6, v_10, v_14 = gb(v_2, v_6, v_10, v_14) + v_3, v_7, v_11, v_15 = gb(v_3, v_7, v_11, v_15) + + v_0, v_5, v_10, v_15 = gb(v_0, v_5, v_10, v_15) + v_1, v_6, v_11, v_12 = gb(v_1, v_6, v_11, v_12) + v_2, v_7, v_8, v_13 = gb(v_2, v_7, v_8, v_13) + v_3, v_4, v_9, v_14 = gb(v_3, v_4, v_9, v_14) + + return v_0, v_1, v_2, v_3, v_4, v_5, v_6, v_7, v_8, v_9, v_10, v_11, v_12, v_13, v_14, v_15 +} + +// 3.5. Compression Function G +// +// The compression function G is built upon the BLAKE2b-based +// transformation P. P operates on the 128-byte input, which can be +// viewed as eight 16-byte registers: +// +// P(A_0, A_1, ... ,A_7) = (B_0, B_1, ... ,B_7) +// +// Figure 14: Blake Round Function P +// +// The compression function G(X, Y) operates on two 1024-byte blocks X +// and Y. It first computes R = X XOR Y. Then R is viewed as an 8x8 +// matrix of 16-byte registers R_0, R_1, ... , R_63. Then P is first +// applied to each row, and then to each column to get Z: +// +// ( Q_0, Q_1, Q_2, ... , Q_7) <- P( R_0, R_1, R_2, ... , R_7) +// ( Q_8, Q_9, Q_10, ... , Q_15) <- P( R_8, R_9, R_10, ... , R_15) +// ... +// (Q_56, Q_57, Q_58, ... , Q_63) <- P(R_56, R_57, R_58, ... , R_63) +// ( Z_0, Z_8, Z_16, ... , Z_56) <- P( Q_0, Q_8, Q_16, ... , Q_56) +// ( Z_1, Z_9, Z_17, ... , Z_57) <- P( Q_1, Q_9, Q_17, ... , Q_57) +// ... +// ( Z_7, Z_15, Z 23, ... , Z_63) <- P( Q_7, Q_15, Q_23, ... , Q_63) +// +// Figure 15: Core of Compression Function G +@(private) +g_rounds :: proc(b: ^Block) { + for i := 0; i < 128; i += 16 { + b[i], b[i+1], b[i+2], b[i+3], b[i+4], b[i+5], b[i+6], b[i+7], b[i+8], b[i+9], b[i+10], b[i+11], b[i+12], b[i+13], b[i+14], b[i+15] = perm_p(b[i], b[i+1], b[i+2], b[i+3], b[i+4], b[i+5], b[i+6], b[i+7], b[i+8], b[i+9], b[i+10], b[i+11], b[i+12], b[i+13], b[i+14], b[i+15]) + } + for i := 0; i < 16; i += 2 { + b[i], b[i+1], b[i+16], b[i+17], b[i+32], b[i+33], b[i+48], b[i+49], b[i+64], b[i+65], b[i+80], b[i+81], b[i+96], b[i+97], b[i+112], b[i+113] = perm_p(b[i], b[i+1], b[i+16], b[i+17], b[i+32], b[i+33], b[i+48], b[i+49], b[i+64], b[i+65], b[i+80], b[i+81], b[i+96], b[i+97], b[i+112], b[i+113]) + } +} diff --git a/examples/all/all_js.odin b/examples/all/all_js.odin index 3a234ee4a..b5016f992 100644 --- a/examples/all/all_js.odin +++ b/examples/all/all_js.odin @@ -27,6 +27,7 @@ package all @(require) import "core:crypto/aead" @(require) import "core:crypto/aegis" @(require) import "core:crypto/aes" +@(require) import "core:crypto/argon2id" @(require) import "core:crypto/blake2b" @(require) import "core:crypto/blake2s" @(require) import "core:crypto/chacha20" diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 4e98048bf..65e4b917c 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -32,6 +32,7 @@ package all @(require) import "core:crypto/aead" @(require) import "core:crypto/aegis" @(require) import "core:crypto/aes" +@(require) import "core:crypto/argon2id" @(require) import "core:crypto/blake2b" @(require) import "core:crypto/blake2s" @(require) import "core:crypto/chacha20" diff --git a/tests/core/crypto/test_core_crypto_hash.odin b/tests/core/crypto/test_core_crypto_hash.odin index 805f3528a..76c2aef6a 100644 --- a/tests/core/crypto/test_core_crypto_hash.odin +++ b/tests/core/crypto/test_core_crypto_hash.odin @@ -621,7 +621,7 @@ test_blake2b_self :: proc(t: ^testing.T) { 0x7F, 0x5E, 0x76, 0x5A, 0x7B, 0xCC, 0xD4, 0x75, } md_lens := []int{20, 32, 48, 64} - src_lens := []int{0, 3, 128, 129, 255, 1024} + src_lens := []int{0, 3, 128, 129, 255, 1024} b2b := proc(dst, src: []byte) { ctx: blake2b.Context @@ -683,7 +683,7 @@ test_blake2s_self :: proc(t: ^testing.T) { 0xFB, 0xDC, 0x88, 0x79, 0x7F, 0x4C, 0x1D, 0xFE, } md_lens := []int{16, 20, 28, 32} - src_lens := []int{0, 3, 64, 65, 255, 1024} + src_lens := []int{0, 3, 64, 65, 255, 1024} b2s := proc(dst, src: []byte) { ctx: blake2s.Context diff --git a/tests/core/crypto/test_core_crypto_kdf.odin b/tests/core/crypto/test_core_crypto_kdf.odin index c15dc2206..d0266e4d1 100644 --- a/tests/core/crypto/test_core_crypto_kdf.odin +++ b/tests/core/crypto/test_core_crypto_kdf.odin @@ -3,10 +3,63 @@ package test_core_crypto import "base:runtime" import "core:encoding/hex" import "core:testing" +import "core:crypto/argon2id" import "core:crypto/hash" import "core:crypto/hkdf" import "core:crypto/pbkdf2" +@(test) +test_argon2id :: proc(t: ^testing.T) { + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() + + test_vectors := []struct { + params: ^argon2id.Parameters, + password: string, + salt: string, + secret: string, + ad: string, + tag: string, + } { + // RFC 9106 5.3. + { + &argon2id.Parameters{ + 32, + 3, + 4, + }, + "0101010101010101010101010101010101010101010101010101010101010101", + "02020202020202020202020202020202", + "0303030303030303", + "040404040404040404040404", + "0d640df58d78766c08c037a34a8b53c9d01ef0452d75b65eb52520e96b01e659", + }, + } + for v, _ in test_vectors { + tag := make([]byte, len(v.tag)/2, context.temp_allocator) + + password, _ := hex.decode(transmute([]byte)(v.password), context.temp_allocator) + salt, _ := hex.decode(transmute([]byte)(v.salt), context.temp_allocator) + secret, _ := hex.decode(transmute([]byte)(v.secret), context.temp_allocator) + ad, _ := hex.decode(transmute([]byte)(v.ad), context.temp_allocator) + + _ = argon2id.derive(v.params, password, salt, tag, secret, ad) + + tag_str := string(hex.encode(tag, context.temp_allocator)) + + testing.expectf( + t, + tag_str == v.tag, + "argon2id: Expected: %s for input of (%s, %s, %s, %s), but got %s instead", + v.tag, + v.password, + v.salt, + v.secret, + v.ad, + tag_str, + ) + } +} + @(test) test_hkdf :: proc(t: ^testing.T) { runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() From ed74233acebc40849e40af9ca8087a47bcf547c7 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 4 Mar 2026 14:55:11 +0100 Subject: [PATCH 599/766] Add `bit_set` to `runtime.type_info_core`. --- base/runtime/core.odin | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 3802bd6f0..d3779b776 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -656,7 +656,7 @@ type_info_base :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { } -// type_info_core returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR +// `type_info_core` returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `^Type_Info`. // This is also aliased as `type_info_base_without_enum` @(require_results) @@ -670,6 +670,7 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { #partial switch i in base.variant { case Type_Info_Named: base = i.base case Type_Info_Enum: base = i.base + case Type_Info_Bit_Set: base = i.underlying case Type_Info_Bit_Field: base = i.backing_type case: break loop } @@ -677,27 +678,10 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { return base } -@(require_results) -type_info_underlying :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { - if info == nil { - return nil - } +// `type_info_underlying` returns underlying (backing) type +type_info_underlying :: type_info_core - base := info - loop: for { - #partial switch i in base.variant { - case Type_Info_Named: base = i.base - case Type_Info_Enum: base = i.base - case Type_Info_Bit_Set: base = i.underlying - case Type_Info_Bit_Field: base = i.backing_type - case: - break loop - } - } - return base -} - -// type_info_base_without_enum returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR +// `type_info_base_without_enum` returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `^Type_Info`. // This is also aliased as `type_info_core` type_info_base_without_enum :: type_info_core From 029c96ce227321b8d95614b525fe981618cd9644 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 4 Mar 2026 14:03:24 +0000 Subject: [PATCH 600/766] Separate `type_info_core` and `type_info_underlying` --- base/runtime/core.odin | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index d3779b776..97e7fa183 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -655,8 +655,7 @@ type_info_base :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { return base } - -// `type_info_core` returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR +// type_info_core returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `^Type_Info`. // This is also aliased as `type_info_base_without_enum` @(require_results) @@ -665,6 +664,27 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { return nil } + base := info + loop: for { + #partial switch i in base.variant { + case Type_Info_Named: base = i.base + case Type_Info_Enum: base = i.base + case Type_Info_Bit_Field: base = i.backing_type + case: break loop + } + } + return base +} + + + +// `type_info_underlying` returns underlying (backing) type +@(require_results) +type_info_underlying :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { + if info == nil { + return nil + } + base := info loop: for { #partial switch i in base.variant { @@ -678,9 +698,6 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { return base } -// `type_info_underlying` returns underlying (backing) type -type_info_underlying :: type_info_core - // `type_info_base_without_enum` returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `^Type_Info`. // This is also aliased as `type_info_core` From 217b4967b0769c3d9580012e3c4c923ab6b1b64d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 4 Mar 2026 14:07:24 +0000 Subject: [PATCH 601/766] Improve docs for `type_info_underlying` --- base/runtime/core.odin | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 97e7fa183..2fcc21c97 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -656,7 +656,7 @@ type_info_base :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { } // type_info_core returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR -// returns the backing integer type of an enum or bit_set `^Type_Info`. +// returns the backing integer type of an enum `^Type_Info`. // This is also aliased as `type_info_base_without_enum` @(require_results) type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { @@ -678,7 +678,8 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { -// `type_info_underlying` returns underlying (backing) type +// type_info_underlying returns the underlying (backing) type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR +// returns the backing integer type of an enum `^Type_Info` AND/OR the underlying integer type of a bit_set or bit_field. @(require_results) type_info_underlying :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { if info == nil { @@ -726,7 +727,7 @@ when !ODIN_NO_RTTI { return ti.id } // typeid_core returns the core-type of a `typeid` stripping the `distinct`ness from the first level AND/OR - // returns the backing integer type of an enum or bit_set `typeid`. + // returns the backing integer type of an enum `typeid`. // This is also aliased as `typeid_base_without_enum` @(require_results) typeid_core :: proc "contextless" (id: typeid) -> typeid { From fee99c56a644d007fb0dc11590190420d854dfe8 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 5 Mar 2026 22:06:54 +0100 Subject: [PATCH 602/766] fix MacOS CI --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8735945b1..bd799dd66 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -143,6 +143,10 @@ jobs: run: ./odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed - name: Vendor library tests run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address + if: matrix.os != 'macos-15-intel' && matrix.os != 'macos-latest' + - name: Vendor library tests (MacOS) + run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address -extra-linker-flags:"-L/opt/homebrew/opt/lua@5.4/lib" + if: matrix.os == 'macos-15-intel' || matrix.os == 'macos-latest' - name: Internals tests run: ./odin test tests/internal -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: GitHub Issue tests From 92a2270ee1228ced0341af6fb62d56321de4c7c7 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 6 Mar 2026 11:49:55 +0100 Subject: [PATCH 603/766] intel has libs at a different path --- .github/workflows/ci.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd799dd66..5db1119a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -140,13 +140,18 @@ jobs: - name: Optimized Core library tests run: ./odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Wycheproof tests + run: ./odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed - name: Vendor library tests run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address if: matrix.os != 'macos-15-intel' && matrix.os != 'macos-latest' - - name: Vendor library tests (MacOS) + - name: Vendor library tests (MacOS ARM) run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address -extra-linker-flags:"-L/opt/homebrew/opt/lua@5.4/lib" - if: matrix.os == 'macos-15-intel' || matrix.os == 'macos-latest' + if: matrix.os == 'macos-latest' + - name: Vendor library tests (MacOS Intel) + run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address -extra-linker-flags:"-L/usr/local/opt/lua@5.4/lib" + if: matrix.os == 'macos-15-intel' + - name: Internals tests run: ./odin test tests/internal -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: GitHub Issue tests From 0c0159b5b7eebe2604c7bee7e4630676b3c41b2f Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 6 Mar 2026 21:05:53 +0100 Subject: [PATCH 604/766] add more js to examples/all js --- examples/all/all_js.odin | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/all/all_js.odin b/examples/all/all_js.odin index b5016f992..3e45565e0 100644 --- a/examples/all/all_js.odin +++ b/examples/all/all_js.odin @@ -143,10 +143,12 @@ package all @(require) import "core:sys/orca" @(require) import "core:sys/info" +@(require) import "core:sys/wasm/js" +@(require) import "core:sys/wasm/wasi" @(require) import "core:unicode" @(require) import "core:unicode/utf8" @(require) import "core:unicode/utf8/utf8string" @(require) import "core:unicode/utf16" -main :: proc() {} \ No newline at end of file +main :: proc() {} From 6434bf4b659a619b767e2a90047d9904f2bd565f Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 7 Mar 2026 12:38:04 +0100 Subject: [PATCH 605/766] Limit maximum exponent in parsing of float/integer literals --- core/c/libc/math.odin | 2 +- src/big_int.cpp | 22 ++++++++++++++++++++-- src/parser.cpp | 7 ++++++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/core/c/libc/math.odin b/core/c/libc/math.odin index d0a015c70..434b67817 100644 --- a/core/c/libc/math.odin +++ b/core/c/libc/math.odin @@ -159,7 +159,7 @@ float_t :: float double_t :: double NAN := transmute(double)(_nan_bit_pattern) -INFINITY :: 1e5000 +INFINITY :: 0h7ff00000_00000000 // +Inf HUGE_VALF :: INFINITY HUGE_VAL :: double(INFINITY) diff --git a/src/big_int.cpp b/src/big_int.cpp index 0b0a9a400..7067a7c3d 100644 --- a/src/big_int.cpp +++ b/src/big_int.cpp @@ -197,8 +197,13 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success BigInt b = {}; big_int_from_u64(&b, base); + defer (big_int_dealloc(&b)); + mp_zero(dst); + BigInt digit = {}; + defer (big_int_dealloc(&digit)); + isize i = 0; for (; i < len; i++) { Rune r = cast(Rune)text[i]; @@ -224,9 +229,10 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success } break; } - BigInt val = big_int_make_u64(v); + + big_int_from_u64(&digit, v); big_int_mul_eq(dst, &b); - big_int_add_eq(dst, &val); + big_int_add_eq(dst, &digit); } if (i < len && (text[i] == 'e' || text[i] == 'E')) { i += 1; @@ -235,6 +241,7 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success if (text[i] == '+') { i += 1; } + u64 exp = 0; for (; i < len; i++) { char r = cast(char)text[i]; @@ -251,8 +258,19 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success exp *= 10; exp += v; } + + // NOTE(Jeroen): A valid integer can never have an exponent larger than 308 (per `max(f64)`). + // As an integer, not even larger than `max(u128)` which has a base 10 exponent of 38. + // But we also use this path to parse float literals like those in `core:math.pow10_f64`, + // so we have to stick with 1e308. + if (exp > 308) { + *success = false; + return; + } + BigInt tmp = {}; mp_init(&tmp); + defer (big_int_dealloc(&tmp)); big_int_exp_u64(&tmp, &b, exp, success); big_int_mul_eq(dst, &tmp); } diff --git a/src/parser.cpp b/src/parser.cpp index 84fbc5130..ca81159b4 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -804,7 +804,12 @@ gb_internal ExactValue exact_value_from_token(AstFile *f, Token const &token) { syntax_error(token, "Invalid integer literal"); break; case Token_Float: - syntax_error(token, "Invalid float literal"); + // NOTE(Jeroen): Could be an integer, see `exact_value_float_from_string` + if (!string_contains_char(s, '.') && !string_contains_char(s, '-')) { + syntax_error(token, "Invalid integer literal"); + } else { + syntax_error(token, "Invalid float literal"); + } break; default: syntax_error(token, "Invalid token literal"); From d767e1c513e9b408c6adac2ddbeea266ce2fdd1d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 7 Mar 2026 14:57:39 +0100 Subject: [PATCH 606/766] Clarify long double comment --- core/c/libc/math.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/c/libc/math.odin b/core/c/libc/math.odin index 434b67817..bc3dd9034 100644 --- a/core/c/libc/math.odin +++ b/core/c/libc/math.odin @@ -154,7 +154,7 @@ _nan_bit_pattern := ~u64(0) // On amd64 Windows and Linux, float_t and double_t are respectively both // their usual types. On x86 it's not possible to define these types correctly -// since they would be long double which Odin does have support for. +// since they would be long double which Odin does NOT have support for. float_t :: float double_t :: double From 93b1e97402c4c163db7dc497076ab24122c50cd7 Mon Sep 17 00:00:00 2001 From: Gavin Rohrer Date: Sat, 7 Mar 2026 10:07:15 -0500 Subject: [PATCH 607/766] fix documentation of assign_at --- base/runtime/core_builtin.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 6e0fe931a..974b2f048 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -804,7 +804,7 @@ inject_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, ar -// `assign_at_elem` assigns a value at a given index. If the requested index is smaller than the current +// `assign_at_elem` assigns a value at a given index. If the requested index is past the end of the current // size of the dynamic array, it will attempt to `resize` the a new length of `index+1` and then assign as `index`. @builtin assign_at_elem :: proc(array: ^$T/[dynamic]$E, #any_int index: int, arg: E, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #no_bounds_check #optional_allocator_error { @@ -820,7 +820,7 @@ assign_at_elem :: proc(array: ^$T/[dynamic]$E, #any_int index: int, arg: E, loc } -// `assign_at_elems` assigns a values at a given index. If the requested index is smaller than the current +// `assign_at_elems` assigns a values at a given index. If the requested index is past the end of the current // size of the dynamic array, it will attempt to `resize` the a new length of `index+len(args)` and then assign as `index`. @builtin assign_at_elems :: proc(array: ^$T/[dynamic]$E, #any_int index: int, #no_broadcast args: ..E, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #no_bounds_check #optional_allocator_error { @@ -838,7 +838,7 @@ assign_at_elems :: proc(array: ^$T/[dynamic]$E, #any_int index: int, #no_broadca return } -// `assign_at_elem_string` assigns a string at a given index. If the requested index is smaller than the current +// `assign_at_elem_string` assigns a string at a given index. If the requested index is past the end of the current // size of the dynamic array, it will attempt to `resize` the a new length of `index+len(arg)` and then assign as `index`. @builtin assign_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, arg: string, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #no_bounds_check #optional_allocator_error { @@ -856,7 +856,7 @@ assign_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, ar return } -// `assign_at` assigns a value at a given index. If the requested index is smaller than the current +// `assign_at` assigns a value at a given index. If the requested index is past the end of the current // size of the dynamic array, it will attempt to `resize` the a new length of `index+size_needed` and then assign as `index`. @builtin assign_at :: proc{ From e1ea3d634b13626b27ac51b28268e868017568eb Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Sat, 7 Mar 2026 11:34:15 -0500 Subject: [PATCH 608/766] core:testing remove whitespace typo --- core/testing/runner.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index e7a46c5cb..9033d078e 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -39,7 +39,7 @@ ALWAYS_REPORT_MEMORY : bool : #config(ODIN_TEST_ALWAYS_REPORT_MEMORY, false) // Treat memory leaks and bad frees as errors. FAIL_ON_BAD_MEMORY : bool : #config(ODIN_TEST_FAIL_ON_BAD_MEMORY, false) // Specify how much memory each thread allocator starts with. -PER_THREAD_MEMORY : int : #config(ODIN_TEST_THREAD_MEMORY, mem. ROLLBACK_STACK_DEFAULT_BLOCK_SIZE) +PER_THREAD_MEMORY : int : #config(ODIN_TEST_THREAD_MEMORY, mem.ROLLBACK_STACK_DEFAULT_BLOCK_SIZE) // Select a specific set of tests to run by name. // Each test is separated by a comma and may optionally include the package name. // This may be useful when running tests on multiple packages with `-all-packages`. From 7320f10de648fbb9fdf129ecb1525b951324703a Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Sun, 8 Mar 2026 12:08:49 +0100 Subject: [PATCH 609/766] Fix tokenizer init --- src/tokenizer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 2ba25b297..2bdd15a60 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -379,6 +379,7 @@ gb_internal void advance_to_next_rune(Tokenizer *t) { gb_internal void init_tokenizer_with_data(Tokenizer *t, String const &fullpath, void const *data, isize size) { t->fullpath = fullpath; + t->column_minus_one = -1; t->line_count = 1; t->start = cast(u8 *)data; From 0087d6d62e642fb9bda9ea730df68719b7abdd7e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Mar 2026 15:05:23 +0100 Subject: [PATCH 610/766] Add `preserve/*` to `base:runtime` ```odin none :: proc "preserve/none" () {} most :: proc "preserve/most" () {} all :: proc "preserve/all" () {} print_cc :: proc(type: any) { ti := type_info_of(type.id) p := ti.variant.(runtime.Type_Info_Procedure) fmt.println(p.convention) } main :: proc() { print_cc(none) print_cc(most) print_cc(all) } ``` --- base/runtime/core.odin | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 2fcc21c97..983f104e3 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -39,6 +39,10 @@ Calling_Convention :: enum u8 { Win64 = 9, SysV = 10, + + Preserve_None = 11, + Preserve_Most = 12, + Preserve_All = 13, } Type_Info_Enum_Value :: distinct i64 From e77dd887aa5780aaedda4548ea2fb7eb207bb749 Mon Sep 17 00:00:00 2001 From: connnnal <216976529+connnnal@users.noreply.github.com> Date: Sun, 8 Mar 2026 16:50:53 +0000 Subject: [PATCH 611/766] Partial 1.619.x d3d12 bindings --- vendor/directx/d3d12/d3d12.odin | 78 ++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 25 deletions(-) diff --git a/vendor/directx/d3d12/d3d12.odin b/vendor/directx/d3d12/d3d12.odin index 8611172f8..3519dafaf 100644 --- a/vendor/directx/d3d12/d3d12.odin +++ b/vendor/directx/d3d12/d3d12.odin @@ -174,19 +174,20 @@ PRIMITIVE :: enum i32 { } SRV_DIMENSION :: enum i32 { - UNKNOWN = 0, - BUFFER = 1, - TEXTURE1D = 2, - TEXTURE1DARRAY = 3, - TEXTURE2D = 4, - TEXTURE2DARRAY = 5, - TEXTURE2DMS = 6, - TEXTURE2DMSARRAY = 7, - TEXTURE3D = 8, - TEXTURECUBE = 9, - TEXTURECUBEARRAY = 10, - BUFFEREX = 11, + UNKNOWN = 0, + BUFFER = 1, + TEXTURE1D = 2, + TEXTURE1DARRAY = 3, + TEXTURE2D = 4, + TEXTURE2DARRAY = 5, + TEXTURE2DMS = 6, + TEXTURE2DMSARRAY = 7, + TEXTURE3D = 8, + TEXTURECUBE = 9, + TEXTURECUBEARRAY = 10, + BUFFEREX = 11, RAYTRACING_ACCELERATION_STRUCTURE = 11, + BUFFER_BYTE_OFFSET = 12, } PFN_DESTRUCTION_CALLBACK :: #type proc "c" (a0: rawptr) @@ -858,6 +859,8 @@ FEATURE :: enum i32 { APPLICATION_SPECIFIC_DRIVER_STATE = 56, BYTECODE_BYPASS_HASH_SUPPORTED = 57, SHADER_CACHE_ABI_SUPPORT = 61, + BARRIER_LAYOUT = 64, + OPTIONS22 = 65, } SHADER_MIN_PRECISION_SUPPORT :: distinct bit_set[SHADER_MIN_PRECISION_SUPPORT_FLAG; u32] @@ -1311,6 +1314,13 @@ FEATURE_DATA_OPTIONS21 :: struct { ExtendedCommandInfoSupported: BOOL, } +FEATURE_DATA_OPTIONS22 :: struct { + ShaderExecutionReorderingActuallyReorders: BOOL, + CreateByteOffsetViewsSupported: BOOL, + Max1DDispatchSize: u32, + Max1DDispatchMeshSize: u32, +} + TIGHT_ALIGNMENT_TIER :: enum i32 { NOT_SUPPORTED = 0, _1 = NOT_SUPPORTED + 1, @@ -1809,6 +1819,13 @@ RAYTRACING_ACCELERATION_STRUCTURE_SRV :: struct { Location: GPU_VIRTUAL_ADDRESS, } +BUFFER_SRV_BYTE_OFFSET :: struct { + Offset: u64, + Size: u64, + StructureByteStride: u32, + Flags: BUFFER_SRV_FLAGS, +} + SHADER_RESOURCE_VIEW_DESC :: struct { Format: dxgi.FORMAT, ViewDimension: SRV_DIMENSION, @@ -1825,6 +1842,7 @@ SHADER_RESOURCE_VIEW_DESC :: struct { TextureCube: TEXCUBE_SRV, TextureCubeArray: TEXCUBE_ARRAY_SRV, RaytracingAccelerationStructure: RAYTRACING_ACCELERATION_STRUCTURE_SRV, + BufferByteOffset: BUFFER_SRV_BYTE_OFFSET, }, } @@ -1946,26 +1964,36 @@ TEX3D_UAV :: struct { WSize: u32, } +BUFFER_UAV_BYTE_OFFSET :: struct { + Offset: u64, + Size: u32, + StructureByteStride: u32, + CounterOffsetInBytes: u64, + Flags: BUFFER_UAV_FLAGS, +} + UAV_DIMENSION :: enum i32 { - UNKNOWN = 0, - BUFFER = 1, - TEXTURE1D = 2, - TEXTURE1DARRAY = 3, - TEXTURE2D = 4, - TEXTURE2DARRAY = 5, - TEXTURE3D = 8, + UNKNOWN = 0, + BUFFER = 1, + TEXTURE1D = 2, + TEXTURE1DARRAY = 3, + TEXTURE2D = 4, + TEXTURE2DARRAY = 5, + TEXTURE3D = 8, + BUFFER_BYTE_OFFSET = 9, } UNORDERED_ACCESS_VIEW_DESC :: struct { Format: dxgi.FORMAT, ViewDimension: UAV_DIMENSION, using _: struct #raw_union { - Buffer: BUFFER_UAV, - Texture1D: TEX1D_UAV, - Texture1DArray: TEX1D_ARRAY_UAV, - Texture2D: TEX2D_UAV, - Texture2DArray: TEX2D_ARRAY_UAV, - Texture3D: TEX3D_UAV, + Buffer: BUFFER_UAV, + Texture1D: TEX1D_UAV, + Texture1DArray: TEX1D_ARRAY_UAV, + Texture2D: TEX2D_UAV, + Texture2DArray: TEX2D_ARRAY_UAV, + Texture3D: TEX3D_UAV, + BufferByteOffset: BUFFER_UAV_BYTE_OFFSET, }, } From 8f101af8f8ef91f97f615b4d28ab673a0382b4b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tar=C4=B1k=20B=2E?= Date: Sun, 8 Mar 2026 21:01:31 +0100 Subject: [PATCH 612/766] Add formatting flag for space between time.Duration and unit --- core/fmt/fmt.odin | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 04211b8a9..e955141fc 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2592,11 +2592,19 @@ fmt_named_buitlin_custom_formatters :: proc(fi: ^Info, v: any, verb: rune, info: prec = 6 buf[w] = 'm' } + if fi.hash { + w -= 1 + buf[w] = ' ' + } w, u = ffrac(buf[:w], u, prec) w = fint(buf[:w], u) } else { w -= 1 buf[w] = 's' + if fi.hash { + w -= 1 + buf[w] = ' ' + } w, u = ffrac(buf[:w], u, 9) w = fint(buf[:w], u%60) u /= 60 From ac6cabd5e3927b301b8048dbe35e578f5de195f0 Mon Sep 17 00:00:00 2001 From: maximusdionyssopoulos Date: Mon, 9 Mar 2026 21:17:20 +1100 Subject: [PATCH 613/766] fix NSTimer scheduledTimerWithTimeInterval:repeats:block: procedure --- core/sys/darwin/Foundation/NSTimer.odin | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/sys/darwin/Foundation/NSTimer.odin b/core/sys/darwin/Foundation/NSTimer.odin index 2edcf34c3..7e10078ca 100644 --- a/core/sys/darwin/Foundation/NSTimer.odin +++ b/core/sys/darwin/Foundation/NSTimer.odin @@ -5,11 +5,10 @@ Timer :: struct { using _: Object } @(objc_type=Timer, objc_name="scheduledTimerWithTimeIntervalRepeatsBlock", objc_is_class_method=true) Timer_scheduledTimerWithTimeIntervalRepeatsBlock :: proc(interval: TimeInterval, repeats: BOOL, block: ^Block) -> ^Timer { - return msgSend(^Timer, Timer, "scheduledTimerWithTimeInterval:repeats:block:") + return msgSend(^Timer, Timer, "scheduledTimerWithTimeInterval:repeats:block:", repeats, block) } @(objc_type=Timer, objc_name="scheduledTimerWithTimeIntervalTargetSelectorUserInfoRepeat", objc_is_class_method=true) Timer_scheduledTimerWithTimeIntervalTargetSelectorUserInfoRepeat :: proc(interval: TimeInterval, aTarget: id, aSelector: SEL, userInfo: id, repeats: BOOL) -> ^Timer { return msgSend(^Timer, Timer, "scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:", interval, aTarget, aSelector, userInfo, repeats) } - From c4f5f9e55a942c790d007e38eed7eedfadc1d1b3 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 17:12:33 -0500 Subject: [PATCH 614/766] Add files needed to generate unicode tables This commit adds the directory `/core/assets/UCD/`. This directory contains three files; `PropList.txt`, `UnicodeData.txt`, and `license.txt`. These files are from the Unicode Database (UCD). The first two are used to generate tables for `core/unicode`. The third is the license that covers the files that make up the UCD. These files are from Unicode version 17.0.0. The latest versions may be found ad [ucd](https://www.unicode.org/Public/UCD/latest/ucd/). --- tests/core/assets/UCD/PropList.txt | 1944 ++ tests/core/assets/UCD/UnicodeData.txt | 40575 ++++++++++++++++++++++++ tests/core/assets/UCD/license.txt | 39 + 3 files changed, 42558 insertions(+) create mode 100644 tests/core/assets/UCD/PropList.txt create mode 100644 tests/core/assets/UCD/UnicodeData.txt create mode 100644 tests/core/assets/UCD/license.txt diff --git a/tests/core/assets/UCD/PropList.txt b/tests/core/assets/UCD/PropList.txt new file mode 100644 index 000000000..e64b4224d --- /dev/null +++ b/tests/core/assets/UCD/PropList.txt @@ -0,0 +1,1944 @@ +# PropList-17.0.0.txt +# Date: 2025-06-30, 06:19:01 GMT +# © 2025 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use and license, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ + +# ================================================ + +0009..000D ; White_Space # Cc [5] .. +0020 ; White_Space # Zs SPACE +0085 ; White_Space # Cc +00A0 ; White_Space # Zs NO-BREAK SPACE +1680 ; White_Space # Zs OGHAM SPACE MARK +2000..200A ; White_Space # Zs [11] EN QUAD..HAIR SPACE +2028 ; White_Space # Zl LINE SEPARATOR +2029 ; White_Space # Zp PARAGRAPH SEPARATOR +202F ; White_Space # Zs NARROW NO-BREAK SPACE +205F ; White_Space # Zs MEDIUM MATHEMATICAL SPACE +3000 ; White_Space # Zs IDEOGRAPHIC SPACE + +# Total code points: 25 + +# ================================================ + +061C ; Bidi_Control # Cf ARABIC LETTER MARK +200E..200F ; Bidi_Control # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +202A..202E ; Bidi_Control # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +2066..2069 ; Bidi_Control # Cf [4] LEFT-TO-RIGHT ISOLATE..POP DIRECTIONAL ISOLATE + +# Total code points: 12 + +# ================================================ + +200C..200D ; Join_Control # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER + +# Total code points: 2 + +# ================================================ + +002D ; Dash # Pd HYPHEN-MINUS +058A ; Dash # Pd ARMENIAN HYPHEN +05BE ; Dash # Pd HEBREW PUNCTUATION MAQAF +1400 ; Dash # Pd CANADIAN SYLLABICS HYPHEN +1806 ; Dash # Pd MONGOLIAN TODO SOFT HYPHEN +2010..2015 ; Dash # Pd [6] HYPHEN..HORIZONTAL BAR +2053 ; Dash # Po SWUNG DASH +207B ; Dash # Sm SUPERSCRIPT MINUS +208B ; Dash # Sm SUBSCRIPT MINUS +2212 ; Dash # Sm MINUS SIGN +2E17 ; Dash # Pd DOUBLE OBLIQUE HYPHEN +2E1A ; Dash # Pd HYPHEN WITH DIAERESIS +2E3A..2E3B ; Dash # Pd [2] TWO-EM DASH..THREE-EM DASH +2E40 ; Dash # Pd DOUBLE HYPHEN +2E5D ; Dash # Pd OBLIQUE HYPHEN +301C ; Dash # Pd WAVE DASH +3030 ; Dash # Pd WAVY DASH +30A0 ; Dash # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +FE31..FE32 ; Dash # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE58 ; Dash # Pd SMALL EM DASH +FE63 ; Dash # Pd SMALL HYPHEN-MINUS +FF0D ; Dash # Pd FULLWIDTH HYPHEN-MINUS +10D6E ; Dash # Pd GARAY HYPHEN +10EAD ; Dash # Pd YEZIDI HYPHENATION MARK + +# Total code points: 31 + +# ================================================ + +002D ; Hyphen # Pd HYPHEN-MINUS +00AD ; Hyphen # Cf SOFT HYPHEN +058A ; Hyphen # Pd ARMENIAN HYPHEN +1806 ; Hyphen # Pd MONGOLIAN TODO SOFT HYPHEN +2010..2011 ; Hyphen # Pd [2] HYPHEN..NON-BREAKING HYPHEN +2E17 ; Hyphen # Pd DOUBLE OBLIQUE HYPHEN +30FB ; Hyphen # Po KATAKANA MIDDLE DOT +FE63 ; Hyphen # Pd SMALL HYPHEN-MINUS +FF0D ; Hyphen # Pd FULLWIDTH HYPHEN-MINUS +FF65 ; Hyphen # Po HALFWIDTH KATAKANA MIDDLE DOT + +# Total code points: 11 + +# ================================================ + +0022 ; Quotation_Mark # Po QUOTATION MARK +0027 ; Quotation_Mark # Po APOSTROPHE +00AB ; Quotation_Mark # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00BB ; Quotation_Mark # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +2018 ; Quotation_Mark # Pi LEFT SINGLE QUOTATION MARK +2019 ; Quotation_Mark # Pf RIGHT SINGLE QUOTATION MARK +201A ; Quotation_Mark # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Quotation_Mark # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Quotation_Mark # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Quotation_Mark # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Quotation_Mark # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2039 ; Quotation_Mark # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Quotation_Mark # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +2E42 ; Quotation_Mark # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +300C ; Quotation_Mark # Ps LEFT CORNER BRACKET +300D ; Quotation_Mark # Pe RIGHT CORNER BRACKET +300E ; Quotation_Mark # Ps LEFT WHITE CORNER BRACKET +300F ; Quotation_Mark # Pe RIGHT WHITE CORNER BRACKET +301D ; Quotation_Mark # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Quotation_Mark # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +FE41 ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FF02 ; Quotation_Mark # Po FULLWIDTH QUOTATION MARK +FF07 ; Quotation_Mark # Po FULLWIDTH APOSTROPHE +FF62 ; Quotation_Mark # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET + +# Total code points: 30 + +# ================================================ + +0021 ; Terminal_Punctuation # Po EXCLAMATION MARK +002C ; Terminal_Punctuation # Po COMMA +002E ; Terminal_Punctuation # Po FULL STOP +003A..003B ; Terminal_Punctuation # Po [2] COLON..SEMICOLON +003F ; Terminal_Punctuation # Po QUESTION MARK +037E ; Terminal_Punctuation # Po GREEK QUESTION MARK +0387 ; Terminal_Punctuation # Po GREEK ANO TELEIA +0589 ; Terminal_Punctuation # Po ARMENIAN FULL STOP +05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ +060C ; Terminal_Punctuation # Po ARABIC COMMA +061B ; Terminal_Punctuation # Po ARABIC SEMICOLON +061D..061F ; Terminal_Punctuation # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK +06D4 ; Terminal_Punctuation # Po ARABIC FULL STOP +0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION +070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS +07F8..07F9 ; Terminal_Punctuation # Po [2] NKO COMMA..NKO EXCLAMATION MARK +0830..0835 ; Terminal_Punctuation # Po [6] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION SHIYYAALAA +0837..083E ; Terminal_Punctuation # Po [8] SAMARITAN PUNCTUATION MELODIC QITSA..SAMARITAN PUNCTUATION ANNAAU +085E ; Terminal_Punctuation # Po MANDAIC PUNCTUATION +0964..0965 ; Terminal_Punctuation # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0E5A..0E5B ; Terminal_Punctuation # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0F08 ; Terminal_Punctuation # Po TIBETAN MARK SBRUL SHAD +0F0D..0F12 ; Terminal_Punctuation # Po [6] TIBETAN MARK SHAD..TIBETAN MARK RGYA GRAM SHAD +104A..104B ; Terminal_Punctuation # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION +1361..1368 ; Terminal_Punctuation # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR +166E ; Terminal_Punctuation # Po CANADIAN SYLLABICS FULL STOP +16EB..16ED ; Terminal_Punctuation # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +1735..1736 ; Terminal_Punctuation # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +17D4..17D6 ; Terminal_Punctuation # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17DA ; Terminal_Punctuation # Po KHMER SIGN KOOMUUT +1802..1805 ; Terminal_Punctuation # Po [4] MONGOLIAN COMMA..MONGOLIAN FOUR DOTS +1808..1809 ; Terminal_Punctuation # Po [2] MONGOLIAN MANCHU COMMA..MONGOLIAN MANCHU FULL STOP +1944..1945 ; Terminal_Punctuation # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1AA8..1AAB ; Terminal_Punctuation # Po [4] TAI THAM SIGN KAAN..TAI THAM SIGN SATKAANKUU +1B4E..1B4F ; Terminal_Punctuation # Po [2] BALINESE INVERTED CARIK SIKI..BALINESE INVERTED CARIK PAREREN +1B5A..1B5B ; Terminal_Punctuation # Po [2] BALINESE PANTI..BALINESE PAMADA +1B5D..1B5F ; Terminal_Punctuation # Po [3] BALINESE CARIK PAMUNGKAH..BALINESE CARIK PAREREN +1B7D..1B7F ; Terminal_Punctuation # Po [3] BALINESE PANTI LANTANG..BALINESE PANTI BAWAK +1C3B..1C3F ; Terminal_Punctuation # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C7E..1C7F ; Terminal_Punctuation # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +2024 ; Terminal_Punctuation # Po ONE DOT LEADER +203C..203D ; Terminal_Punctuation # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +2047..2049 ; Terminal_Punctuation # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +2CF9..2CFB ; Terminal_Punctuation # Po [3] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2E2E ; Terminal_Punctuation # Po REVERSED QUESTION MARK +2E3C ; Terminal_Punctuation # Po STENOGRAPHIC FULL STOP +2E41 ; Terminal_Punctuation # Po REVERSED COMMA +2E4C ; Terminal_Punctuation # Po MEDIEVAL COMMA +2E4E..2E4F ; Terminal_Punctuation # Po [2] PUNCTUS ELEVATUS MARK..CORNISH VERSE DIVIDER +2E53..2E54 ; Terminal_Punctuation # Po [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK +3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP +A4FE..A4FF ; Terminal_Punctuation # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +A60D..A60F ; Terminal_Punctuation # Po [3] VAI COMMA..VAI QUESTION MARK +A6F3..A6F7 ; Terminal_Punctuation # Po [5] BAMUM FULL STOP..BAMUM QUESTION MARK +A876..A877 ; Terminal_Punctuation # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD +A8CE..A8CF ; Terminal_Punctuation # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A92F ; Terminal_Punctuation # Po KAYAH LI SIGN SHYA +A9C7..A9C9 ; Terminal_Punctuation # Po [3] JAVANESE PADA PANGKAT..JAVANESE PADA LUNGSI +AA5D..AA5F ; Terminal_Punctuation # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA +AADF ; Terminal_Punctuation # Po TAI VIET SYMBOL KOI KOI +AAF0..AAF1 ; Terminal_Punctuation # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +ABEB ; Terminal_Punctuation # Po MEETEI MAYEK CHEIKHEI +FE12 ; Terminal_Punctuation # Po PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE15..FE16 ; Terminal_Punctuation # Po [2] PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE50..FE52 ; Terminal_Punctuation # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; Terminal_Punctuation # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FF01 ; Terminal_Punctuation # Po FULLWIDTH EXCLAMATION MARK +FF0C ; Terminal_Punctuation # Po FULLWIDTH COMMA +FF0E ; Terminal_Punctuation # Po FULLWIDTH FULL STOP +FF1A..FF1B ; Terminal_Punctuation # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1F ; Terminal_Punctuation # Po FULLWIDTH QUESTION MARK +FF61 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA +1039F ; Terminal_Punctuation # Po UGARITIC WORD DIVIDER +103D0 ; Terminal_Punctuation # Po OLD PERSIAN WORD DIVIDER +10857 ; Terminal_Punctuation # Po IMPERIAL ARAMAIC SECTION SIGN +1091F ; Terminal_Punctuation # Po PHOENICIAN WORD SEPARATOR +10A56..10A57 ; Terminal_Punctuation # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA +10AF0..10AF5 ; Terminal_Punctuation # Po [6] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION TWO DOTS +10B3A..10B3F ; Terminal_Punctuation # Po [6] TINY TWO DOTS OVER ONE DOT PUNCTUATION..LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B99..10B9C ; Terminal_Punctuation # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10F55..10F59 ; Terminal_Punctuation # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +10F86..10F89 ; Terminal_Punctuation # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS +11047..1104D ; Terminal_Punctuation # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +110BE..110C1 ; Terminal_Punctuation # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +11141..11143 ; Terminal_Punctuation # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK +111C5..111C6 ; Terminal_Punctuation # Po [2] SHARADA DANDA..SHARADA DOUBLE DANDA +111CD ; Terminal_Punctuation # Po SHARADA SUTRA MARK +111DE..111DF ; Terminal_Punctuation # Po [2] SHARADA SECTION MARK-1..SHARADA SECTION MARK-2 +11238..1123C ; Terminal_Punctuation # Po [5] KHOJKI DANDA..KHOJKI DOUBLE SECTION MARK +112A9 ; Terminal_Punctuation # Po MULTANI SECTION MARK +113D4..113D5 ; Terminal_Punctuation # Po [2] TULU-TIGALARI DANDA..TULU-TIGALARI DOUBLE DANDA +1144B..1144D ; Terminal_Punctuation # Po [3] NEWA DANDA..NEWA COMMA +1145A..1145B ; Terminal_Punctuation # Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK +115C2..115C5 ; Terminal_Punctuation # Po [4] SIDDHAM DANDA..SIDDHAM SEPARATOR BAR +115C9..115D7 ; Terminal_Punctuation # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +11641..11642 ; Terminal_Punctuation # Po [2] MODI DANDA..MODI DOUBLE DANDA +1173C..1173E ; Terminal_Punctuation # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +11944 ; Terminal_Punctuation # Po DIVES AKURU DOUBLE DANDA +11946 ; Terminal_Punctuation # Po DIVES AKURU END OF TEXT MARK +11A42..11A43 ; Terminal_Punctuation # Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD +11A9B..11A9C ; Terminal_Punctuation # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD +11AA1..11AA2 ; Terminal_Punctuation # Po [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2 +11C41..11C43 ; Terminal_Punctuation # Po [3] BHAIKSUKI DANDA..BHAIKSUKI WORD SEPARATOR +11C71 ; Terminal_Punctuation # Po MARCHEN MARK SHAD +11EF7..11EF8 ; Terminal_Punctuation # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F43..11F44 ; Terminal_Punctuation # Po [2] KAWI DANDA..KAWI DOUBLE DANDA +12470..12474 ; Terminal_Punctuation # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +16A6E..16A6F ; Terminal_Punctuation # Po [2] MRO DANDA..MRO DOUBLE DANDA +16AF5 ; Terminal_Punctuation # Po BASSA VAH FULL STOP +16B37..16B39 ; Terminal_Punctuation # Po [3] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN CIM CHEEM +16B44 ; Terminal_Punctuation # Po PAHAWH HMONG SIGN XAUS +16D6E..16D6F ; Terminal_Punctuation # Po [2] KIRAT RAI DANDA..KIRAT RAI DOUBLE DANDA +16E97..16E98 ; Terminal_Punctuation # Po [2] MEDEFAIDRIN COMMA..MEDEFAIDRIN FULL STOP +1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON + +# Total code points: 291 + +# ================================================ + +005E ; Other_Math # Sk CIRCUMFLEX ACCENT +03D0..03D2 ; Other_Math # L& [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL +03D5 ; Other_Math # L& GREEK PHI SYMBOL +03F0..03F1 ; Other_Math # L& [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL +03F4..03F5 ; Other_Math # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL +2016 ; Other_Math # Po DOUBLE VERTICAL LINE +2032..2034 ; Other_Math # Po [3] PRIME..TRIPLE PRIME +2040 ; Other_Math # Pc CHARACTER TIE +2061..2064 ; Other_Math # Cf [4] FUNCTION APPLICATION..INVISIBLE PLUS +207D ; Other_Math # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; Other_Math # Pe SUPERSCRIPT RIGHT PARENTHESIS +208D ; Other_Math # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; Other_Math # Pe SUBSCRIPT RIGHT PARENTHESIS +20D0..20DC ; Other_Math # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20E1 ; Other_Math # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E5..20E6 ; Other_Math # Mn [2] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING DOUBLE VERTICAL STROKE OVERLAY +20EB..20EF ; Other_Math # Mn [5] COMBINING LONG DOUBLE SOLIDUS OVERLAY..COMBINING RIGHT ARROW BELOW +2102 ; Other_Math # L& DOUBLE-STRUCK CAPITAL C +2107 ; Other_Math # L& EULER CONSTANT +210A..2113 ; Other_Math # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; Other_Math # L& DOUBLE-STRUCK CAPITAL N +2119..211D ; Other_Math # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; Other_Math # L& DOUBLE-STRUCK CAPITAL Z +2128 ; Other_Math # L& BLACK-LETTER CAPITAL Z +2129 ; Other_Math # So TURNED GREEK SMALL LETTER IOTA +212C..212D ; Other_Math # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212F..2131 ; Other_Math # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F +2133..2134 ; Other_Math # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O +2135..2138 ; Other_Math # Lo [4] ALEF SYMBOL..DALET SYMBOL +213C..213F ; Other_Math # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; Other_Math # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +2195..2199 ; Other_Math # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219C..219F ; Other_Math # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A1..21A2 ; Other_Math # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A4..21A5 ; Other_Math # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A7 ; Other_Math # So DOWNWARDS ARROW FROM BAR +21A9..21AD ; Other_Math # So [5] LEFTWARDS ARROW WITH HOOK..LEFT RIGHT WAVE ARROW +21B0..21B1 ; Other_Math # So [2] UPWARDS ARROW WITH TIP LEFTWARDS..UPWARDS ARROW WITH TIP RIGHTWARDS +21B6..21B7 ; Other_Math # So [2] ANTICLOCKWISE TOP SEMICIRCLE ARROW..CLOCKWISE TOP SEMICIRCLE ARROW +21BC..21CD ; Other_Math # So [18] LEFTWARDS HARPOON WITH BARB UPWARDS..LEFTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Other_Math # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D3 ; Other_Math # So DOWNWARDS DOUBLE ARROW +21D5..21DB ; Other_Math # So [7] UP DOWN DOUBLE ARROW..RIGHTWARDS TRIPLE ARROW +21DD ; Other_Math # So RIGHTWARDS SQUIGGLE ARROW +21E4..21E5 ; Other_Math # So [2] LEFTWARDS ARROW TO BAR..RIGHTWARDS ARROW TO BAR +2308 ; Other_Math # Ps LEFT CEILING +2309 ; Other_Math # Pe RIGHT CEILING +230A ; Other_Math # Ps LEFT FLOOR +230B ; Other_Math # Pe RIGHT FLOOR +23B4..23B5 ; Other_Math # So [2] TOP SQUARE BRACKET..BOTTOM SQUARE BRACKET +23B7 ; Other_Math # So RADICAL SYMBOL BOTTOM +23D0 ; Other_Math # So VERTICAL LINE EXTENSION +23E2 ; Other_Math # So WHITE TRAPEZIUM +25A0..25A1 ; Other_Math # So [2] BLACK SQUARE..WHITE SQUARE +25AE..25B6 ; Other_Math # So [9] BLACK VERTICAL RECTANGLE..BLACK RIGHT-POINTING TRIANGLE +25BC..25C0 ; Other_Math # So [5] BLACK DOWN-POINTING TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C6..25C7 ; Other_Math # So [2] BLACK DIAMOND..WHITE DIAMOND +25CA..25CB ; Other_Math # So [2] LOZENGE..WHITE CIRCLE +25CF..25D3 ; Other_Math # So [5] BLACK CIRCLE..CIRCLE WITH UPPER HALF BLACK +25E2 ; Other_Math # So BLACK LOWER RIGHT TRIANGLE +25E4 ; Other_Math # So BLACK UPPER LEFT TRIANGLE +25E7..25EC ; Other_Math # So [6] SQUARE WITH LEFT HALF BLACK..WHITE UP-POINTING TRIANGLE WITH DOT +2605..2606 ; Other_Math # So [2] BLACK STAR..WHITE STAR +2640 ; Other_Math # So FEMALE SIGN +2642 ; Other_Math # So MALE SIGN +2660..2663 ; Other_Math # So [4] BLACK SPADE SUIT..BLACK CLUB SUIT +266D..266E ; Other_Math # So [2] MUSIC FLAT SIGN..MUSIC NATURAL SIGN +27C5 ; Other_Math # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Other_Math # Pe RIGHT S-SHAPED BAG DELIMITER +27E6 ; Other_Math # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Other_Math # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Other_Math # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Other_Math # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Other_Math # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Other_Math # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Other_Math # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Other_Math # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; Other_Math # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; Other_Math # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +2983 ; Other_Math # Ps LEFT WHITE CURLY BRACKET +2984 ; Other_Math # Pe RIGHT WHITE CURLY BRACKET +2985 ; Other_Math # Ps LEFT WHITE PARENTHESIS +2986 ; Other_Math # Pe RIGHT WHITE PARENTHESIS +2987 ; Other_Math # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Other_Math # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Other_Math # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Other_Math # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Other_Math # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Other_Math # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Other_Math # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Other_Math # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Other_Math # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Other_Math # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Other_Math # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Other_Math # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Other_Math # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Other_Math # Pe RIGHT BLACK TORTOISE SHELL BRACKET +29D8 ; Other_Math # Ps LEFT WIGGLY FENCE +29D9 ; Other_Math # Pe RIGHT WIGGLY FENCE +29DA ; Other_Math # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Other_Math # Pe RIGHT DOUBLE WIGGLY FENCE +29FC ; Other_Math # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Other_Math # Pe RIGHT-POINTING CURVED ANGLE BRACKET +FE61 ; Other_Math # Po SMALL ASTERISK +FE63 ; Other_Math # Pd SMALL HYPHEN-MINUS +FE68 ; Other_Math # Po SMALL REVERSE SOLIDUS +FF3C ; Other_Math # Po FULLWIDTH REVERSE SOLIDUS +FF3E ; Other_Math # Sk FULLWIDTH CIRCUMFLEX ACCENT +1D400..1D454 ; Other_Math # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Other_Math # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Other_Math # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Other_Math # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Other_Math # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Other_Math # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Other_Math # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Other_Math # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Other_Math # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Other_Math # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Other_Math # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Other_Math # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Other_Math # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Other_Math # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Other_Math # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Other_Math # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; Other_Math # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; Other_Math # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C2..1D6DA ; Other_Math # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DC..1D6FA ; Other_Math # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FC..1D714 ; Other_Math # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D716..1D734 ; Other_Math # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D736..1D74E ; Other_Math # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D750..1D76E ; Other_Math # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D770..1D788 ; Other_Math # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D78A..1D7A8 ; Other_Math # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7AA..1D7C2 ; Other_Math # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C4..1D7CB ; Other_Math # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; Other_Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1EE00..1EE03 ; Other_Math # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; Other_Math # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; Other_Math # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; Other_Math # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; Other_Math # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; Other_Math # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; Other_Math # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; Other_Math # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; Other_Math # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; Other_Math # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; Other_Math # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; Other_Math # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; Other_Math # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; Other_Math # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; Other_Math # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; Other_Math # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; Other_Math # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; Other_Math # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; Other_Math # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; Other_Math # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; Other_Math # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; Other_Math # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; Other_Math # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; Other_Math # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; Other_Math # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; Other_Math # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; Other_Math # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN + +# Total code points: 1362 + +# ================================================ + +0030..0039 ; Hex_Digit # Nd [10] DIGIT ZERO..DIGIT NINE +0041..0046 ; Hex_Digit # L& [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F +0061..0066 ; Hex_Digit # L& [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F +FF10..FF19 ; Hex_Digit # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF21..FF26 ; Hex_Digit # L& [6] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER F +FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER F + +# Total code points: 44 + +# ================================================ + +0030..0039 ; ASCII_Hex_Digit # Nd [10] DIGIT ZERO..DIGIT NINE +0041..0046 ; ASCII_Hex_Digit # L& [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F +0061..0066 ; ASCII_Hex_Digit # L& [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F + +# Total code points: 22 + +# ================================================ + +0345 ; Other_Alphabetic # Mn COMBINING GREEK YPOGEGRAMMENI +0363..036F ; Other_Alphabetic # Mn [13] COMBINING LATIN SMALL LETTER A..COMBINING LATIN SMALL LETTER X +05B0..05BD ; Other_Alphabetic # Mn [14] HEBREW POINT SHEVA..HEBREW POINT METEG +05BF ; Other_Alphabetic # Mn HEBREW POINT RAFE +05C1..05C2 ; Other_Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; Other_Alphabetic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; Other_Alphabetic # Mn HEBREW POINT QAMATS QATAN +0610..061A ; Other_Alphabetic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +064B..0657 ; Other_Alphabetic # Mn [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA +0659..065F ; Other_Alphabetic # Mn [7] ARABIC ZWARAKAY..ARABIC WAVY HAMZA BELOW +0670 ; Other_Alphabetic # Mn ARABIC LETTER SUPERSCRIPT ALEF +06D6..06DC ; Other_Alphabetic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06E1..06E4 ; Other_Alphabetic # Mn [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA +06E7..06E8 ; Other_Alphabetic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06ED ; Other_Alphabetic # Mn ARABIC SMALL LOW MEEM +0711 ; Other_Alphabetic # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0730..073F ; Other_Alphabetic # Mn [16] SYRIAC PTHAHA ABOVE..SYRIAC RWAHA +07A6..07B0 ; Other_Alphabetic # Mn [11] THAANA ABAFILI..THAANA SUKUN +0816..0817 ; Other_Alphabetic # Mn [2] SAMARITAN MARK IN..SAMARITAN MARK IN-ALAF +081B..0823 ; Other_Alphabetic # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0825..0827 ; Other_Alphabetic # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0829..082C ; Other_Alphabetic # Mn [4] SAMARITAN VOWEL SIGN LONG I..SAMARITAN VOWEL SIGN SUKUN +0897 ; Other_Alphabetic # Mn ARABIC PEPET +08D4..08DF ; Other_Alphabetic # Mn [12] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH WORD WAQFA +08E3..08E9 ; Other_Alphabetic # Mn [7] ARABIC TURNED DAMMA BELOW..ARABIC CURLY KASRATAN +08F0..0902 ; Other_Alphabetic # Mn [19] ARABIC OPEN FATHATAN..DEVANAGARI SIGN ANUSVARA +0903 ; Other_Alphabetic # Mc DEVANAGARI SIGN VISARGA +093A ; Other_Alphabetic # Mn DEVANAGARI VOWEL SIGN OE +093B ; Other_Alphabetic # Mc DEVANAGARI VOWEL SIGN OOE +093E..0940 ; Other_Alphabetic # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; Other_Alphabetic # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; Other_Alphabetic # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094E..094F ; Other_Alphabetic # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0955..0957 ; Other_Alphabetic # Mn [3] DEVANAGARI VOWEL SIGN CANDRA LONG E..DEVANAGARI VOWEL SIGN UUE +0962..0963 ; Other_Alphabetic # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0981 ; Other_Alphabetic # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; Other_Alphabetic # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +09BE..09C0 ; Other_Alphabetic # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; Other_Alphabetic # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09D7 ; Other_Alphabetic # Mc BENGALI AU LENGTH MARK +09E2..09E3 ; Other_Alphabetic # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +0A01..0A02 ; Other_Alphabetic # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; Other_Alphabetic # Mc GURMUKHI SIGN VISARGA +0A3E..0A40 ; Other_Alphabetic # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4C ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU +0A51 ; Other_Alphabetic # Mn GURMUKHI SIGN UDAAT +0A70..0A71 ; Other_Alphabetic # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A75 ; Other_Alphabetic # Mn GURMUKHI SIGN YAKASH +0A81..0A82 ; Other_Alphabetic # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; Other_Alphabetic # Mc GUJARATI SIGN VISARGA +0ABE..0AC0 ; Other_Alphabetic # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; Other_Alphabetic # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; Other_Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; Other_Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0AE2..0AE3 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AFA..0AFC ; Other_Alphabetic # Mn [3] GUJARATI SIGN SUKUN..GUJARATI SIGN MADDAH +0B01 ; Other_Alphabetic # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; Other_Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B3E ; Other_Alphabetic # Mc ORIYA VOWEL SIGN AA +0B3F ; Other_Alphabetic # Mn ORIYA VOWEL SIGN I +0B40 ; Other_Alphabetic # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; Other_Alphabetic # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; Other_Alphabetic # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; Other_Alphabetic # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B56 ; Other_Alphabetic # Mn ORIYA AI LENGTH MARK +0B57 ; Other_Alphabetic # Mc ORIYA AU LENGTH MARK +0B62..0B63 ; Other_Alphabetic # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B82 ; Other_Alphabetic # Mn TAMIL SIGN ANUSVARA +0BBE..0BBF ; Other_Alphabetic # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; Other_Alphabetic # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; Other_Alphabetic # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; Other_Alphabetic # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; Other_Alphabetic # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BD7 ; Other_Alphabetic # Mc TAMIL AU LENGTH MARK +0C00 ; Other_Alphabetic # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; Other_Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; Other_Alphabetic # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C3E..0C40 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; Other_Alphabetic # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4C ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU +0C55..0C56 ; Other_Alphabetic # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C62..0C63 ; Other_Alphabetic # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C81 ; Other_Alphabetic # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; Other_Alphabetic # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0CBE ; Other_Alphabetic # Mc KANNADA VOWEL SIGN AA +0CBF ; Other_Alphabetic # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; Other_Alphabetic # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; Other_Alphabetic # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; Other_Alphabetic # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Other_Alphabetic # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC ; Other_Alphabetic # Mn KANNADA VOWEL SIGN AU +0CD5..0CD6 ; Other_Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CE2..0CE3 ; Other_Alphabetic # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CF3 ; Other_Alphabetic # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT +0D00..0D01 ; Other_Alphabetic # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; Other_Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D3E..0D40 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; Other_Alphabetic # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D57 ; Other_Alphabetic # Mc MALAYALAM AU LENGTH MARK +0D62..0D63 ; Other_Alphabetic # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D81 ; Other_Alphabetic # Mn SINHALA SIGN CANDRABINDU +0D82..0D83 ; Other_Alphabetic # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0DCF..0DD1 ; Other_Alphabetic # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; Other_Alphabetic # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; Other_Alphabetic # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; Other_Alphabetic # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DF2..0DF3 ; Other_Alphabetic # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0E31 ; Other_Alphabetic # Mn THAI CHARACTER MAI HAN-AKAT +0E34..0E3A ; Other_Alphabetic # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E4D ; Other_Alphabetic # Mn THAI CHARACTER NIKHAHIT +0EB1 ; Other_Alphabetic # Mn LAO VOWEL SIGN MAI KAN +0EB4..0EB9 ; Other_Alphabetic # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; Other_Alphabetic # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0ECD ; Other_Alphabetic # Mn LAO NIGGAHITA +0F71..0F7E ; Other_Alphabetic # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; Other_Alphabetic # Mc TIBETAN SIGN RNAM BCAD +0F80..0F83 ; Other_Alphabetic # Mn [4] TIBETAN VOWEL SIGN REVERSED I..TIBETAN SIGN SNA LDAN +0F8D..0F97 ; Other_Alphabetic # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; Other_Alphabetic # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +102B..102C ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; Other_Alphabetic # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; Other_Alphabetic # Mc MYANMAR VOWEL SIGN E +1032..1036 ; Other_Alphabetic # Mn [5] MYANMAR VOWEL SIGN AI..MYANMAR SIGN ANUSVARA +1038 ; Other_Alphabetic # Mc MYANMAR SIGN VISARGA +103B..103C ; Other_Alphabetic # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; Other_Alphabetic # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +1056..1057 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; Other_Alphabetic # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105E..1060 ; Other_Alphabetic # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1062..1064 ; Other_Alphabetic # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1067..106D ; Other_Alphabetic # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +1071..1074 ; Other_Alphabetic # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1082 ; Other_Alphabetic # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; Other_Alphabetic # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C ; Other_Alphabetic # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; Other_Alphabetic # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108F ; Other_Alphabetic # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +109A..109C ; Other_Alphabetic # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D ; Other_Alphabetic # Mn MYANMAR VOWEL SIGN AITON AI +1712..1713 ; Other_Alphabetic # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U +1732..1733 ; Other_Alphabetic # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1752..1753 ; Other_Alphabetic # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1772..1773 ; Other_Alphabetic # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +17B6 ; Other_Alphabetic # Mc KHMER VOWEL SIGN AA +17B7..17BD ; Other_Alphabetic # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; Other_Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; Other_Alphabetic # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; Other_Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +1885..1886 ; Other_Alphabetic # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +18A9 ; Other_Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA +1920..1922 ; Other_Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; Other_Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; Other_Alphabetic # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; Other_Alphabetic # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; Other_Alphabetic # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; Other_Alphabetic # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; Other_Alphabetic # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1A17..1A18 ; Other_Alphabetic # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; Other_Alphabetic # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; Other_Alphabetic # Mn BUGINESE VOWEL SIGN AE +1A55 ; Other_Alphabetic # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; Other_Alphabetic # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; Other_Alphabetic # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; Other_Alphabetic # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A61 ; Other_Alphabetic # Mc TAI THAM VOWEL SIGN A +1A62 ; Other_Alphabetic # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; Other_Alphabetic # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; Other_Alphabetic # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; Other_Alphabetic # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A74 ; Other_Alphabetic # Mn [2] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN MAI KANG +1ABF..1AC0 ; Other_Alphabetic # Mn [2] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER TURNED W BELOW +1ACC..1ACE ; Other_Alphabetic # Mn [3] COMBINING LATIN SMALL LETTER INSULAR G..COMBINING LATIN SMALL LETTER INSULAR T +1B00..1B03 ; Other_Alphabetic # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; Other_Alphabetic # Mc BALINESE SIGN BISAH +1B35 ; Other_Alphabetic # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; Other_Alphabetic # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; Other_Alphabetic # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; Other_Alphabetic # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; Other_Alphabetic # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; Other_Alphabetic # Mn BALINESE VOWEL SIGN PEPET +1B43 ; Other_Alphabetic # Mc BALINESE VOWEL SIGN PEPET TEDUNG +1B80..1B81 ; Other_Alphabetic # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; Other_Alphabetic # Mc SUNDANESE SIGN PANGWISAD +1BA1 ; Other_Alphabetic # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; Other_Alphabetic # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; Other_Alphabetic # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; Other_Alphabetic # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAC..1BAD ; Other_Alphabetic # Mn [2] SUNDANESE CONSONANT SIGN PASANGAN MA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BE7 ; Other_Alphabetic # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; Other_Alphabetic # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; Other_Alphabetic # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; Other_Alphabetic # Mn BATAK VOWEL SIGN KARO O +1BEE ; Other_Alphabetic # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; Other_Alphabetic # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1C24..1C2B ; Other_Alphabetic # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; Other_Alphabetic # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; Other_Alphabetic # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36 ; Other_Alphabetic # Mn LEPCHA SIGN RAN +1DD3..1DF4 ; Other_Alphabetic # Mn [34] COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE..COMBINING LATIN SMALL LETTER U WITH DIAERESIS +24B6..24E9 ; Other_Alphabetic # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z +2DE0..2DFF ; Other_Alphabetic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +A674..A67B ; Other_Alphabetic # Mn [8] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC LETTER OMEGA +A69E..A69F ; Other_Alphabetic # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A802 ; Other_Alphabetic # Mn SYLOTI NAGRI SIGN DVISVARA +A80B ; Other_Alphabetic # Mn SYLOTI NAGRI SIGN ANUSVARA +A823..A824 ; Other_Alphabetic # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; Other_Alphabetic # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; Other_Alphabetic # Mc SYLOTI NAGRI VOWEL SIGN OO +A880..A881 ; Other_Alphabetic # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A8B4..A8C3 ; Other_Alphabetic # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C5 ; Other_Alphabetic # Mn SAURASHTRA SIGN CANDRABINDU +A8FF ; Other_Alphabetic # Mn DEVANAGARI VOWEL SIGN AY +A926..A92A ; Other_Alphabetic # Mn [5] KAYAH LI VOWEL UE..KAYAH LI VOWEL O +A947..A951 ; Other_Alphabetic # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952 ; Other_Alphabetic # Mc REJANG CONSONANT SIGN H +A980..A982 ; Other_Alphabetic # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; Other_Alphabetic # Mc JAVANESE SIGN WIGNYAN +A9B4..A9B5 ; Other_Alphabetic # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; Other_Alphabetic # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; Other_Alphabetic # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC..A9BD ; Other_Alphabetic # Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET +A9BE..A9BF ; Other_Alphabetic # Mc [2] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE CONSONANT SIGN CAKRA +A9E5 ; Other_Alphabetic # Mn MYANMAR SIGN SHAN SAW +AA29..AA2E ; Other_Alphabetic # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; Other_Alphabetic # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; Other_Alphabetic # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; Other_Alphabetic # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; Other_Alphabetic # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA43 ; Other_Alphabetic # Mn CHAM CONSONANT SIGN FINAL NG +AA4C ; Other_Alphabetic # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; Other_Alphabetic # Mc CHAM CONSONANT SIGN FINAL H +AA7B ; Other_Alphabetic # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; Other_Alphabetic # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; Other_Alphabetic # Mc MYANMAR SIGN TAI LAING TONE-5 +AAB0 ; Other_Alphabetic # Mn TAI VIET MAI KANG +AAB2..AAB4 ; Other_Alphabetic # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB7..AAB8 ; Other_Alphabetic # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AABE ; Other_Alphabetic # Mn TAI VIET VOWEL AM +AAEB ; Other_Alphabetic # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; Other_Alphabetic # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF5 ; Other_Alphabetic # Mc MEETEI MAYEK VOWEL SIGN VISARGA +ABE3..ABE4 ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; Other_Alphabetic # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; Other_Alphabetic # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA +10376..1037A ; Other_Alphabetic # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10A01..10A03 ; Other_Alphabetic # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; Other_Alphabetic # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; Other_Alphabetic # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10D24..10D27 ; Other_Alphabetic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D69 ; Other_Alphabetic # Mn GARAY VOWEL SIGN E +10EAB..10EAC ; Other_Alphabetic # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EFA..10EFC ; Other_Alphabetic # Mn [3] ARABIC DOUBLE VERTICAL BAR BELOW..ARABIC COMBINING ALEF OVERLAY +11000 ; Other_Alphabetic # Mc BRAHMI SIGN CANDRABINDU +11001 ; Other_Alphabetic # Mn BRAHMI SIGN ANUSVARA +11002 ; Other_Alphabetic # Mc BRAHMI SIGN VISARGA +11038..11045 ; Other_Alphabetic # Mn [14] BRAHMI VOWEL SIGN AA..BRAHMI VOWEL SIGN AU +11073..11074 ; Other_Alphabetic # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O +11080..11081 ; Other_Alphabetic # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA +11082 ; Other_Alphabetic # Mc KAITHI SIGN VISARGA +110B0..110B2 ; Other_Alphabetic # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; Other_Alphabetic # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; Other_Alphabetic # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110C2 ; Other_Alphabetic # Mn KAITHI VOWEL SIGN VOCALIC R +11100..11102 ; Other_Alphabetic # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11127..1112B ; Other_Alphabetic # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; Other_Alphabetic # Mc CHAKMA VOWEL SIGN E +1112D..11132 ; Other_Alphabetic # Mn [6] CHAKMA VOWEL SIGN AI..CHAKMA AU MARK +11145..11146 ; Other_Alphabetic # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11180..11181 ; Other_Alphabetic # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; Other_Alphabetic # Mc SHARADA SIGN VISARGA +111B3..111B5 ; Other_Alphabetic # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; Other_Alphabetic # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF ; Other_Alphabetic # Mc SHARADA VOWEL SIGN AU +111CE ; Other_Alphabetic # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E +111CF ; Other_Alphabetic # Mn SHARADA SIGN INVERTED CANDRABINDU +1122C..1122E ; Other_Alphabetic # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; Other_Alphabetic # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; Other_Alphabetic # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; Other_Alphabetic # Mn KHOJKI SIGN ANUSVARA +11237 ; Other_Alphabetic # Mn KHOJKI SIGN SHADDA +1123E ; Other_Alphabetic # Mn KHOJKI SIGN SUKUN +11241 ; Other_Alphabetic # Mn KHOJKI VOWEL SIGN VOCALIC R +112DF ; Other_Alphabetic # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; Other_Alphabetic # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112E8 ; Other_Alphabetic # Mn [6] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN AU +11300..11301 ; Other_Alphabetic # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; Other_Alphabetic # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +1133E..1133F ; Other_Alphabetic # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; Other_Alphabetic # Mn GRANTHA VOWEL SIGN II +11341..11344 ; Other_Alphabetic # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; Other_Alphabetic # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134C ; Other_Alphabetic # Mc [2] GRANTHA VOWEL SIGN OO..GRANTHA VOWEL SIGN AU +11357 ; Other_Alphabetic # Mc GRANTHA AU LENGTH MARK +11362..11363 ; Other_Alphabetic # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +113B8..113BA ; Other_Alphabetic # Mc [3] TULU-TIGALARI VOWEL SIGN AA..TULU-TIGALARI VOWEL SIGN II +113BB..113C0 ; Other_Alphabetic # Mn [6] TULU-TIGALARI VOWEL SIGN U..TULU-TIGALARI VOWEL SIGN VOCALIC LL +113C2 ; Other_Alphabetic # Mc TULU-TIGALARI VOWEL SIGN EE +113C5 ; Other_Alphabetic # Mc TULU-TIGALARI VOWEL SIGN AI +113C7..113CA ; Other_Alphabetic # Mc [4] TULU-TIGALARI VOWEL SIGN OO..TULU-TIGALARI SIGN CANDRA ANUNASIKA +113CC..113CD ; Other_Alphabetic # Mc [2] TULU-TIGALARI SIGN ANUSVARA..TULU-TIGALARI SIGN VISARGA +11435..11437 ; Other_Alphabetic # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; Other_Alphabetic # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; Other_Alphabetic # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11443..11444 ; Other_Alphabetic # Mn [2] NEWA SIGN CANDRABINDU..NEWA SIGN ANUSVARA +11445 ; Other_Alphabetic # Mc NEWA SIGN VISARGA +114B0..114B2 ; Other_Alphabetic # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; Other_Alphabetic # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; Other_Alphabetic # Mc TIRHUTA VOWEL SIGN E +114BA ; Other_Alphabetic # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; Other_Alphabetic # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; Other_Alphabetic # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; Other_Alphabetic # Mc TIRHUTA SIGN VISARGA +115AF..115B1 ; Other_Alphabetic # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; Other_Alphabetic # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; Other_Alphabetic # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; Other_Alphabetic # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; Other_Alphabetic # Mc SIDDHAM SIGN VISARGA +115DC..115DD ; Other_Alphabetic # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11630..11632 ; Other_Alphabetic # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; Other_Alphabetic # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; Other_Alphabetic # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; Other_Alphabetic # Mn MODI SIGN ANUSVARA +1163E ; Other_Alphabetic # Mc MODI SIGN VISARGA +11640 ; Other_Alphabetic # Mn MODI SIGN ARDHACANDRA +116AB ; Other_Alphabetic # Mn TAKRI SIGN ANUSVARA +116AC ; Other_Alphabetic # Mc TAKRI SIGN VISARGA +116AD ; Other_Alphabetic # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; Other_Alphabetic # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; Other_Alphabetic # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +1171D ; Other_Alphabetic # Mn AHOM CONSONANT SIGN MEDIAL LA +1171E ; Other_Alphabetic # Mc AHOM CONSONANT SIGN MEDIAL RA +1171F ; Other_Alphabetic # Mn AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; Other_Alphabetic # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; Other_Alphabetic # Mc AHOM VOWEL SIGN E +11727..1172A ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN AW..AHOM VOWEL SIGN AM +1182C..1182E ; Other_Alphabetic # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; Other_Alphabetic # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; Other_Alphabetic # Mc DOGRA SIGN VISARGA +11930..11935 ; Other_Alphabetic # Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E +11937..11938 ; Other_Alphabetic # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O +1193B..1193C ; Other_Alphabetic # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU +11940 ; Other_Alphabetic # Mc DIVES AKURU MEDIAL YA +11942 ; Other_Alphabetic # Mc DIVES AKURU MEDIAL RA +119D1..119D3 ; Other_Alphabetic # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II +119D4..119D7 ; Other_Alphabetic # Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR +119DA..119DB ; Other_Alphabetic # Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI +119DC..119DF ; Other_Alphabetic # Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA +119E4 ; Other_Alphabetic # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E +11A01..11A0A ; Other_Alphabetic # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A35..11A38 ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE SIGN CANDRABINDU..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; Other_Alphabetic # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3B..11A3E ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A51..11A56 ; Other_Alphabetic # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; Other_Alphabetic # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; Other_Alphabetic # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A8A..11A96 ; Other_Alphabetic # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; Other_Alphabetic # Mc SOYOMBO SIGN VISARGA +11B60 ; Other_Alphabetic # Mn SHARADA VOWEL SIGN OE +11B61 ; Other_Alphabetic # Mc SHARADA VOWEL SIGN OOE +11B62..11B64 ; Other_Alphabetic # Mn [3] SHARADA VOWEL SIGN UE..SHARADA VOWEL SIGN SHORT E +11B65 ; Other_Alphabetic # Mc SHARADA VOWEL SIGN SHORT O +11B66 ; Other_Alphabetic # Mn SHARADA VOWEL SIGN CANDRA E +11B67 ; Other_Alphabetic # Mc SHARADA VOWEL SIGN CANDRA O +11C2F ; Other_Alphabetic # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; Other_Alphabetic # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Other_Alphabetic # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; Other_Alphabetic # Mc BHAIKSUKI SIGN VISARGA +11C92..11CA7 ; Other_Alphabetic # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; Other_Alphabetic # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; Other_Alphabetic # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; Other_Alphabetic # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; Other_Alphabetic # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; Other_Alphabetic # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; Other_Alphabetic # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D31..11D36 ; Other_Alphabetic # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Other_Alphabetic # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Other_Alphabetic # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D41 ; Other_Alphabetic # Mn [3] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI SIGN VISARGA +11D43 ; Other_Alphabetic # Mn MASARAM GONDI SIGN CANDRA +11D47 ; Other_Alphabetic # Mn MASARAM GONDI RA-KARA +11D8A..11D8E ; Other_Alphabetic # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; Other_Alphabetic # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; Other_Alphabetic # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; Other_Alphabetic # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; Other_Alphabetic # Mc GUNJALA GONDI SIGN VISARGA +11EF3..11EF4 ; Other_Alphabetic # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; Other_Alphabetic # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11F00..11F01 ; Other_Alphabetic # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F03 ; Other_Alphabetic # Mc KAWI SIGN VISARGA +11F34..11F35 ; Other_Alphabetic # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; Other_Alphabetic # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; Other_Alphabetic # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; Other_Alphabetic # Mn KAWI VOWEL SIGN EU +1611E..16129 ; Other_Alphabetic # Mn [12] GURUNG KHEMA VOWEL SIGN AA..GURUNG KHEMA VOWEL LENGTH MARK +1612A..1612C ; Other_Alphabetic # Mc [3] GURUNG KHEMA CONSONANT SIGN MEDIAL YA..GURUNG KHEMA CONSONANT SIGN MEDIAL HA +1612D..1612E ; Other_Alphabetic # Mn [2] GURUNG KHEMA SIGN ANUSVARA..GURUNG KHEMA CONSONANT SIGN MEDIAL RA +16F4F ; Other_Alphabetic # Mn MIAO SIGN CONSONANT MODIFIER BAR +16F51..16F87 ; Other_Alphabetic # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI +16F8F..16F92 ; Other_Alphabetic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16FF0..16FF1 ; Other_Alphabetic # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +1BC9E ; Other_Alphabetic # Mn DUPLOYAN DOUBLE MARK +1E000..1E006 ; Other_Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Other_Alphabetic # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Other_Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Other_Alphabetic # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Other_Alphabetic # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E08F ; Other_Alphabetic # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +1E6E3 ; Other_Alphabetic # Mn TAI YO SIGN UE +1E6E6 ; Other_Alphabetic # Mn TAI YO SIGN AU +1E6EE..1E6EF ; Other_Alphabetic # Mn [2] TAI YO SIGN AY..TAI YO SIGN ANG +1E6F5 ; Other_Alphabetic # Mn TAI YO SIGN OM +1E947 ; Other_Alphabetic # Mn ADLAM HAMZA +1F130..1F149 ; Other_Alphabetic # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z +1F150..1F169 ; Other_Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F170..1F189 ; Other_Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z + +# Total code points: 1510 + +# ================================================ + +3006 ; Ideographic # Lo IDEOGRAPHIC CLOSING MARK +3007 ; Ideographic # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +3400..4DBF ; Ideographic # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +4E00..9FFF ; Ideographic # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF +F900..FA6D ; Ideographic # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +16FE4 ; Ideographic # Mn KHITAN SMALL SCRIPT FILLER +16FF2..16FF3 ; Ideographic # Lm [2] CHINESE SMALL SIMPLIFIED ER..CHINESE SMALL TRADITIONAL ER +16FF4..16FF6 ; Ideographic # Nl [3] YANGQIN SIGN SLOW ONE BEAT..YANGQIN SIGN SLOW TWO BEATS +17000..18CD5 ; Ideographic # Lo [7382] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CD5 +18CFF..18D1E ; Ideographic # Lo [32] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D1E +18D80..18DF2 ; Ideographic # Lo [115] TANGUT COMPONENT-769..TANGUT COMPONENT-883 +1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +20000..2A6DF ; Ideographic # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A700..2B81D ; Ideographic # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEAD ; Ideographic # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD +2CEB0..2EBE0 ; Ideographic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; Ideographic # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D +2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +30000..3134A ; Ideographic # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..33479 ; Ideographic # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 + +# Total code points: 110943 + +# ================================================ + +005E ; Diacritic # Sk CIRCUMFLEX ACCENT +0060 ; Diacritic # Sk GRAVE ACCENT +00A8 ; Diacritic # Sk DIAERESIS +00AF ; Diacritic # Sk MACRON +00B4 ; Diacritic # Sk ACUTE ACCENT +00B7 ; Diacritic # Po MIDDLE DOT +00B8 ; Diacritic # Sk CEDILLA +02B0..02C1 ; Diacritic # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; Diacritic # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02D1 ; Diacritic # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02DF ; Diacritic # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +02E0..02E4 ; Diacritic # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02EB ; Diacritic # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; Diacritic # Lm MODIFIER LETTER VOICING +02ED ; Diacritic # Sk MODIFIER LETTER UNASPIRATED +02EE ; Diacritic # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; Diacritic # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0300..034E ; Diacritic # Mn [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW +0350..0357 ; Diacritic # Mn [8] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING RIGHT HALF RING ABOVE +035D..0362 ; Diacritic # Mn [6] COMBINING DOUBLE BREVE..COMBINING DOUBLE RIGHTWARDS ARROW BELOW +0374 ; Diacritic # Lm GREEK NUMERAL SIGN +0375 ; Diacritic # Sk GREEK LOWER NUMERAL SIGN +037A ; Diacritic # Lm GREEK YPOGEGRAMMENI +0384..0385 ; Diacritic # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0483..0487 ; Diacritic # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0559 ; Diacritic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0591..05BD ; Diacritic # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BF ; Diacritic # Mn HEBREW POINT RAFE +05C1..05C2 ; Diacritic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; Diacritic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; Diacritic # Mn HEBREW POINT QAMATS QATAN +064B..0652 ; Diacritic # Mn [8] ARABIC FATHATAN..ARABIC SUKUN +0657..0658 ; Diacritic # Mn [2] ARABIC INVERTED DAMMA..ARABIC MARK NOON GHUNNA +06DF..06E0 ; Diacritic # Mn [2] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO +06E5..06E6 ; Diacritic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06EA..06EC ; Diacritic # Mn [3] ARABIC EMPTY CENTRE LOW STOP..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE +0730..074A ; Diacritic # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +07A6..07B0 ; Diacritic # Mn [11] THAANA ABAFILI..THAANA SUKUN +07EB..07F3 ; Diacritic # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; Diacritic # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +0818..0819 ; Diacritic # Mn [2] SAMARITAN MARK OCCLUSION..SAMARITAN MARK DAGESH +0898..089F ; Diacritic # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA +08C9 ; Diacritic # Lm ARABIC SMALL FARSI YEH +08CA..08D2 ; Diacritic # Mn [9] ARABIC SMALL HIGH FARSI YEH..ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW +08E3..08FE ; Diacritic # Mn [28] ARABIC TURNED DAMMA BELOW..ARABIC DAMMA WITH DOT +093C ; Diacritic # Mn DEVANAGARI SIGN NUKTA +094D ; Diacritic # Mn DEVANAGARI SIGN VIRAMA +0951..0954 ; Diacritic # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT +0971 ; Diacritic # Lm DEVANAGARI SIGN HIGH SPACING DOT +09BC ; Diacritic # Mn BENGALI SIGN NUKTA +09CD ; Diacritic # Mn BENGALI SIGN VIRAMA +0A3C ; Diacritic # Mn GURMUKHI SIGN NUKTA +0A4D ; Diacritic # Mn GURMUKHI SIGN VIRAMA +0ABC ; Diacritic # Mn GUJARATI SIGN NUKTA +0ACD ; Diacritic # Mn GUJARATI SIGN VIRAMA +0AFD..0AFF ; Diacritic # Mn [3] GUJARATI SIGN THREE-DOT NUKTA ABOVE..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B3C ; Diacritic # Mn ORIYA SIGN NUKTA +0B4D ; Diacritic # Mn ORIYA SIGN VIRAMA +0B55 ; Diacritic # Mn ORIYA SIGN OVERLINE +0BCD ; Diacritic # Mn TAMIL SIGN VIRAMA +0C3C ; Diacritic # Mn TELUGU SIGN NUKTA +0C4D ; Diacritic # Mn TELUGU SIGN VIRAMA +0CBC ; Diacritic # Mn KANNADA SIGN NUKTA +0CCD ; Diacritic # Mn KANNADA SIGN VIRAMA +0D3B..0D3C ; Diacritic # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D4D ; Diacritic # Mn MALAYALAM SIGN VIRAMA +0DCA ; Diacritic # Mn SINHALA SIGN AL-LAKUNA +0E3A ; Diacritic # Mn THAI CHARACTER PHINTHU +0E47..0E4C ; Diacritic # Mn [6] THAI CHARACTER MAITAIKHU..THAI CHARACTER THANTHAKHAT +0E4E ; Diacritic # Mn THAI CHARACTER YAMAKKAN +0EBA ; Diacritic # Mn LAO SIGN PALI VIRAMA +0EC8..0ECC ; Diacritic # Mn [5] LAO TONE MAI EK..LAO CANCELLATION MARK +0F18..0F19 ; Diacritic # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F35 ; Diacritic # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F37 ; Diacritic # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F39 ; Diacritic # Mn TIBETAN MARK TSA -PHRU +0F3E..0F3F ; Diacritic # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F82..0F84 ; Diacritic # Mn [3] TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA +0F86..0F87 ; Diacritic # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0FC6 ; Diacritic # Mn TIBETAN SYMBOL PADMA GDAN +1037 ; Diacritic # Mn MYANMAR SIGN DOT BELOW +1039..103A ; Diacritic # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +1063..1064 ; Diacritic # Mc [2] MYANMAR TONE MARK SGAW KAREN HATHI..MYANMAR TONE MARK SGAW KAREN KE PHO +1069..106D ; Diacritic # Mc [5] MYANMAR SIGN WESTERN PWO KAREN TONE-1..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +1087..108C ; Diacritic # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; Diacritic # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108F ; Diacritic # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +109A..109B ; Diacritic # Mc [2] MYANMAR SIGN KHAMTI TONE-1..MYANMAR SIGN KHAMTI TONE-3 +135D..135F ; Diacritic # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1714 ; Diacritic # Mn TAGALOG SIGN VIRAMA +1715 ; Diacritic # Mc TAGALOG SIGN PAMUDPOD +1734 ; Diacritic # Mc HANUNOO SIGN PAMUDPOD +17C9..17D3 ; Diacritic # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17DD ; Diacritic # Mn KHMER SIGN ATTHACAN +1939..193B ; Diacritic # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1A60 ; Diacritic # Mn TAI THAM SIGN SAKOT +1A75..1A7C ; Diacritic # Mn [8] TAI THAM SIGN TONE-1..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; Diacritic # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1AB0..1ABD ; Diacritic # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; Diacritic # Me COMBINING PARENTHESES OVERLAY +1AC1..1ACB ; Diacritic # Mn [11] COMBINING LEFT PARENTHESIS ABOVE LEFT..COMBINING TRIPLE ACUTE ACCENT +1ACF..1ADD ; Diacritic # Mn [15] COMBINING DOUBLE CARON..COMBINING DOT-AND-RING BELOW +1AE0..1AEB ; Diacritic # Mn [12] COMBINING LEFT TACK ABOVE..COMBINING DOUBLE RIGHTWARDS ARROW ABOVE +1B34 ; Diacritic # Mn BALINESE SIGN REREKAN +1B44 ; Diacritic # Mc BALINESE ADEG ADEG +1B6B..1B73 ; Diacritic # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1BAA ; Diacritic # Mc SUNDANESE SIGN PAMAAEH +1BAB ; Diacritic # Mn SUNDANESE SIGN VIRAMA +1BE6 ; Diacritic # Mn BATAK SIGN TOMPI +1BF2..1BF3 ; Diacritic # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1C36..1C37 ; Diacritic # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C78..1C7D ; Diacritic # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1CD0..1CD2 ; Diacritic # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD3 ; Diacritic # Po VEDIC SIGN NIHSHVASA +1CD4..1CE0 ; Diacritic # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1 ; Diacritic # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2..1CE8 ; Diacritic # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CED ; Diacritic # Mn VEDIC SIGN TIRYAK +1CF4 ; Diacritic # Mn VEDIC TONE CANDRA ABOVE +1CF7 ; Diacritic # Mc VEDIC SIGN ATIKRAMA +1CF8..1CF9 ; Diacritic # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1D2C..1D6A ; Diacritic # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D9B..1DBE ; Diacritic # Lm [36] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL EZH +1DC4..1DCF ; Diacritic # Mn [12] COMBINING MACRON-ACUTE..COMBINING ZIGZAG BELOW +1DF5..1DFF ; Diacritic # Mn [11] COMBINING UP TACK ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1FBD ; Diacritic # Sk GREEK KORONIS +1FBF..1FC1 ; Diacritic # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FCD..1FCF ; Diacritic # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FDD..1FDF ; Diacritic # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FED..1FEF ; Diacritic # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FFD..1FFE ; Diacritic # Sk [2] GREEK OXIA..GREEK DASIA +2CEF..2CF1 ; Diacritic # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2E2F ; Diacritic # Lm VERTICAL TILDE +302A..302D ; Diacritic # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F ; Diacritic # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3099..309A ; Diacritic # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C ; Diacritic # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +30FC ; Diacritic # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK +A66F ; Diacritic # Mn COMBINING CYRILLIC VZMET +A67C..A67D ; Diacritic # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK +A67F ; Diacritic # Lm CYRILLIC PAYEROK +A69C..A69D ; Diacritic # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A6F0..A6F1 ; Diacritic # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A700..A716 ; Diacritic # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F ; Diacritic # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; Diacritic # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A788 ; Diacritic # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; Diacritic # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A7F1 ; Diacritic # Lm MODIFIER LETTER CAPITAL S +A7F8..A7F9 ; Diacritic # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A806 ; Diacritic # Mn SYLOTI NAGRI SIGN HASANTA +A82C ; Diacritic # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA +A8C4 ; Diacritic # Mn SAURASHTRA SIGN VIRAMA +A8E0..A8F1 ; Diacritic # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A92B..A92D ; Diacritic # Mn [3] KAYAH LI TONE PLOPHU..KAYAH LI TONE CALYA PLOPHU +A92E ; Diacritic # Po KAYAH LI SIGN CWI +A953 ; Diacritic # Mc REJANG VIRAMA +A9B3 ; Diacritic # Mn JAVANESE SIGN CECAK TELU +A9C0 ; Diacritic # Mc JAVANESE PANGKON +A9E5 ; Diacritic # Mn MYANMAR SIGN SHAN SAW +AA7B ; Diacritic # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; Diacritic # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; Diacritic # Mc MYANMAR SIGN TAI LAING TONE-5 +AABF ; Diacritic # Mn TAI VIET TONE MAI EK +AAC0 ; Diacritic # Lo TAI VIET TONE MAI NUENG +AAC1 ; Diacritic # Mn TAI VIET TONE MAI THO +AAC2 ; Diacritic # Lo TAI VIET TONE MAI SONG +AAF6 ; Diacritic # Mn MEETEI MAYEK VIRAMA +AB5B ; Diacritic # Sk MODIFIER BREVE WITH INVERTED BREVE +AB5C..AB5F ; Diacritic # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB69 ; Diacritic # Lm MODIFIER LETTER SMALL TURNED W +AB6A..AB6B ; Diacritic # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +ABEC ; Diacritic # Mc MEETEI MAYEK LUM IYEK +ABED ; Diacritic # Mn MEETEI MAYEK APUN IYEK +FB1E ; Diacritic # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FE20..FE2F ; Diacritic # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FF3E ; Diacritic # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF40 ; Diacritic # Sk FULLWIDTH GRAVE ACCENT +FF70 ; Diacritic # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF9E..FF9F ; Diacritic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFE3 ; Diacritic # Sk FULLWIDTH MACRON +102E0 ; Diacritic # Mn COPTIC EPACT THOUSANDS MARK +10780..10785 ; Diacritic # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0 ; Diacritic # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA ; Diacritic # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +10A38..10A3A ; Diacritic # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; Diacritic # Mn KHAROSHTHI VIRAMA +10AE5..10AE6 ; Diacritic # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10D22..10D23 ; Diacritic # Lo [2] HANIFI ROHINGYA MARK SAKIN..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; Diacritic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D4E ; Diacritic # Lm GARAY VOWEL LENGTH MARK +10D69..10D6D ; Diacritic # Mn [5] GARAY VOWEL SIGN E..GARAY CONSONANT NASALIZATION MARK +10EFA ; Diacritic # Mn ARABIC DOUBLE VERTICAL BAR BELOW +10EFD..10EFF ; Diacritic # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA +10F46..10F50 ; Diacritic # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F82..10F85 ; Diacritic # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW +11046 ; Diacritic # Mn BRAHMI VIRAMA +11070 ; Diacritic # Mn BRAHMI SIGN OLD TAMIL VIRAMA +110B9..110BA ; Diacritic # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +11133..11134 ; Diacritic # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA +11173 ; Diacritic # Mn MAHAJANI SIGN NUKTA +111C0 ; Diacritic # Mc SHARADA SIGN VIRAMA +111CA..111CC ; Diacritic # Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK +11235 ; Diacritic # Mc KHOJKI SIGN VIRAMA +11236 ; Diacritic # Mn KHOJKI SIGN NUKTA +112E9..112EA ; Diacritic # Mn [2] KHUDAWADI SIGN NUKTA..KHUDAWADI SIGN VIRAMA +1133B..1133C ; Diacritic # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1134D ; Diacritic # Mc GRANTHA SIGN VIRAMA +11366..1136C ; Diacritic # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; Diacritic # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +113CE ; Diacritic # Mn TULU-TIGALARI SIGN VIRAMA +113CF ; Diacritic # Mc TULU-TIGALARI SIGN LOOPED VIRAMA +113D0 ; Diacritic # Mn TULU-TIGALARI CONJOINER +113D2 ; Diacritic # Mn TULU-TIGALARI GEMINATION MARK +113D3 ; Diacritic # Lo TULU-TIGALARI SIGN PLUTA +113E1..113E2 ; Diacritic # Mn [2] TULU-TIGALARI VEDIC TONE SVARITA..TULU-TIGALARI VEDIC TONE ANUDATTA +11442 ; Diacritic # Mn NEWA SIGN VIRAMA +11446 ; Diacritic # Mn NEWA SIGN NUKTA +114C2..114C3 ; Diacritic # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +115BF..115C0 ; Diacritic # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +1163F ; Diacritic # Mn MODI SIGN VIRAMA +116B6 ; Diacritic # Mc TAKRI SIGN VIRAMA +116B7 ; Diacritic # Mn TAKRI SIGN NUKTA +1172B ; Diacritic # Mn AHOM SIGN KILLER +11839..1183A ; Diacritic # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +1193D ; Diacritic # Mc DIVES AKURU SIGN HALANTA +1193E ; Diacritic # Mn DIVES AKURU VIRAMA +11943 ; Diacritic # Mn DIVES AKURU SIGN NUKTA +119E0 ; Diacritic # Mn NANDINAGARI SIGN VIRAMA +11A34 ; Diacritic # Mn ZANABAZAR SQUARE SIGN VIRAMA +11A47 ; Diacritic # Mn ZANABAZAR SQUARE SUBJOINER +11A99 ; Diacritic # Mn SOYOMBO SUBJOINER +11C3F ; Diacritic # Mn BHAIKSUKI SIGN VIRAMA +11D42 ; Diacritic # Mn MASARAM GONDI SIGN NUKTA +11D44..11D45 ; Diacritic # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA +11D97 ; Diacritic # Mn GUNJALA GONDI VIRAMA +11DD9 ; Diacritic # Lm TOLONG SIKI SIGN SELA +11F41 ; Diacritic # Mc KAWI SIGN KILLER +11F42 ; Diacritic # Mn KAWI CONJOINER +11F5A ; Diacritic # Mn KAWI SIGN NUKTA +13447..13455 ; Diacritic # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED +1612F ; Diacritic # Mn GURUNG KHEMA SIGN THOLHOMA +16AF0..16AF4 ; Diacritic # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16B30..16B36 ; Diacritic # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16D6B..16D6C ; Diacritic # Lm [2] KIRAT RAI SIGN VIRAMA..KIRAT RAI SIGN SAAT +16F8F..16F92 ; Diacritic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; Diacritic # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FF0..16FF1 ; Diacritic # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +1AFF0..1AFF3 ; Diacritic # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 +1AFF5..1AFFB ; Diacritic # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 +1AFFD..1AFFE ; Diacritic # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 +1CF00..1CF2D ; Diacritic # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT +1CF30..1CF46 ; Diacritic # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1D167..1D169 ; Diacritic # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16D..1D172 ; Diacritic # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D17B..1D182 ; Diacritic # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; Diacritic # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; Diacritic # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1E030..1E06D ; Diacritic # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E130..1E136 ; Diacritic # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D +1E2AE ; Diacritic # Mn TOTO SIGN RISING TONE +1E2EC..1E2EF ; Diacritic # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E5EE..1E5EF ; Diacritic # Mn [2] OL ONAL SIGN MU..OL ONAL SIGN IKIR +1E8D0..1E8D6 ; Diacritic # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK +1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA + +# Total code points: 1247 + +# ================================================ + +00B7 ; Extender # Po MIDDLE DOT +02D0..02D1 ; Extender # Lm [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON +0640 ; Extender # Lm ARABIC TATWEEL +07FA ; Extender # Lm NKO LAJANYALAN +0A71 ; Extender # Mn GURMUKHI ADDAK +0AFB ; Extender # Mn GUJARATI SIGN SHADDA +0B55 ; Extender # Mn ORIYA SIGN OVERLINE +0E46 ; Extender # Lm THAI CHARACTER MAIYAMOK +0EC6 ; Extender # Lm LAO KO LA +180A ; Extender # Po MONGOLIAN NIRUGU +1843 ; Extender # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1AA7 ; Extender # Lm TAI THAM SIGN MAI YAMOK +1C36 ; Extender # Mn LEPCHA SIGN RAN +1C7B ; Extender # Lm OL CHIKI RELAA +3005 ; Extender # Lm IDEOGRAPHIC ITERATION MARK +3031..3035 ; Extender # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +309D..309E ; Extender # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +30FC..30FE ; Extender # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +A015 ; Extender # Lm YI SYLLABLE WU +A60C ; Extender # Lm VAI SYLLABLE LENGTHENER +A9CF ; Extender # Lm JAVANESE PANGRANGKEP +A9E6 ; Extender # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +AA70 ; Extender # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AADD ; Extender # Lm TAI VIET SYMBOL SAM +AAF3..AAF4 ; Extender # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +10781..10782 ; Extender # Lm [2] MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON..MODIFIER LETTER SUPERSCRIPT HALF TRIANGULAR COLON +10D4E ; Extender # Lm GARAY VOWEL LENGTH MARK +10D6A ; Extender # Mn GARAY CONSONANT GEMINATION MARK +10D6F ; Extender # Lm GARAY REDUPLICATION MARK +11237 ; Extender # Mn KHOJKI SIGN SHADDA +1135D ; Extender # Lo GRANTHA SIGN PLUTA +113D2 ; Extender # Mn TULU-TIGALARI GEMINATION MARK +113D3 ; Extender # Lo TULU-TIGALARI SIGN PLUTA +115C6..115C8 ; Extender # Po [3] SIDDHAM REPETITION MARK-1..SIDDHAM REPETITION MARK-3 +11A98 ; Extender # Mn SOYOMBO GEMINATION MARK +11DD9 ; Extender # Lm TOLONG SIKI SIGN SELA +16B42..16B43 ; Extender # Lm [2] PAHAWH HMONG SIGN VOS NRUA..PAHAWH HMONG SIGN IB YAM +16FE0..16FE1 ; Extender # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +16FE3 ; Extender # Lm OLD CHINESE ITERATION MARK +16FF2..16FF3 ; Extender # Lm [2] CHINESE SMALL SIMPLIFIED ER..CHINESE SMALL TRADITIONAL ER +1E13C..1E13D ; Extender # Lm [2] NYIAKENG PUACHUE HMONG SIGN XW XW..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER +1E5EF ; Extender # Mn OL ONAL SIGN IKIR +1E944..1E946 ; Extender # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK + +# Total code points: 62 + +# ================================================ + +00AA ; Other_Lowercase # Lo FEMININE ORDINAL INDICATOR +00BA ; Other_Lowercase # Lo MASCULINE ORDINAL INDICATOR +02B0..02B8 ; Other_Lowercase # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02C0..02C1 ; Other_Lowercase # Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP +02E0..02E4 ; Other_Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +0345 ; Other_Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI +037A ; Other_Lowercase # Lm GREEK YPOGEGRAMMENI +10FC ; Other_Lowercase # Lm MODIFIER LETTER GEORGIAN NAR +1D2C..1D6A ; Other_Lowercase # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D78 ; Other_Lowercase # Lm MODIFIER LETTER CYRILLIC EN +1D9B..1DBF ; Other_Lowercase # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +2071 ; Other_Lowercase # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; Other_Lowercase # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; Other_Lowercase # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +2170..217F ; Other_Lowercase # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND +24D0..24E9 ; Other_Lowercase # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +2C7C..2C7D ; Other_Lowercase # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +A69C..A69D ; Other_Lowercase # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A770 ; Other_Lowercase # Lm MODIFIER LETTER US +A7F1..A7F4 ; Other_Lowercase # Lm [4] MODIFIER LETTER CAPITAL S..MODIFIER LETTER CAPITAL Q +A7F8..A7F9 ; Other_Lowercase # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +AB5C..AB5F ; Other_Lowercase # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB69 ; Other_Lowercase # Lm MODIFIER LETTER SMALL TURNED W +10780 ; Other_Lowercase # Lm MODIFIER LETTER SMALL CAPITAL AA +10783..10785 ; Other_Lowercase # Lm [3] MODIFIER LETTER SMALL AE..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0 ; Other_Lowercase # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA ; Other_Lowercase # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +1E030..1E06D ; Other_Lowercase # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE + +# Total code points: 312 + +# ================================================ + +2160..216F ; Other_Uppercase # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND +24B6..24CF ; Other_Uppercase # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z +1F130..1F149 ; Other_Uppercase # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z +1F150..1F169 ; Other_Uppercase # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F170..1F189 ; Other_Uppercase # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z + +# Total code points: 120 + +# ================================================ + +FDD0..FDEF ; Noncharacter_Code_Point # Cn [32] .. +FFFE..FFFF ; Noncharacter_Code_Point # Cn [2] .. +1FFFE..1FFFF ; Noncharacter_Code_Point # Cn [2] .. +2FFFE..2FFFF ; Noncharacter_Code_Point # Cn [2] .. +3FFFE..3FFFF ; Noncharacter_Code_Point # Cn [2] .. +4FFFE..4FFFF ; Noncharacter_Code_Point # Cn [2] .. +5FFFE..5FFFF ; Noncharacter_Code_Point # Cn [2] .. +6FFFE..6FFFF ; Noncharacter_Code_Point # Cn [2] .. +7FFFE..7FFFF ; Noncharacter_Code_Point # Cn [2] .. +8FFFE..8FFFF ; Noncharacter_Code_Point # Cn [2] .. +9FFFE..9FFFF ; Noncharacter_Code_Point # Cn [2] .. +AFFFE..AFFFF ; Noncharacter_Code_Point # Cn [2] .. +BFFFE..BFFFF ; Noncharacter_Code_Point # Cn [2] .. +CFFFE..CFFFF ; Noncharacter_Code_Point # Cn [2] .. +DFFFE..DFFFF ; Noncharacter_Code_Point # Cn [2] .. +EFFFE..EFFFF ; Noncharacter_Code_Point # Cn [2] .. +FFFFE..FFFFF ; Noncharacter_Code_Point # Cn [2] .. +10FFFE..10FFFF; Noncharacter_Code_Point # Cn [2] .. + +# Total code points: 66 + +# ================================================ + +09BE ; Other_Grapheme_Extend # Mc BENGALI VOWEL SIGN AA +09D7 ; Other_Grapheme_Extend # Mc BENGALI AU LENGTH MARK +0B3E ; Other_Grapheme_Extend # Mc ORIYA VOWEL SIGN AA +0B57 ; Other_Grapheme_Extend # Mc ORIYA AU LENGTH MARK +0BBE ; Other_Grapheme_Extend # Mc TAMIL VOWEL SIGN AA +0BD7 ; Other_Grapheme_Extend # Mc TAMIL AU LENGTH MARK +0CC0 ; Other_Grapheme_Extend # Mc KANNADA VOWEL SIGN II +0CC2 ; Other_Grapheme_Extend # Mc KANNADA VOWEL SIGN UU +0CC7..0CC8 ; Other_Grapheme_Extend # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Other_Grapheme_Extend # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CD5..0CD6 ; Other_Grapheme_Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0D3E ; Other_Grapheme_Extend # Mc MALAYALAM VOWEL SIGN AA +0D57 ; Other_Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK +0DCF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA +0DDF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA +1715 ; Other_Grapheme_Extend # Mc TAGALOG SIGN PAMUDPOD +1734 ; Other_Grapheme_Extend # Mc HANUNOO SIGN PAMUDPOD +1B35 ; Other_Grapheme_Extend # Mc BALINESE VOWEL SIGN TEDUNG +1B3B ; Other_Grapheme_Extend # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3D ; Other_Grapheme_Extend # Mc BALINESE VOWEL SIGN LA LENGA TEDUNG +1B43..1B44 ; Other_Grapheme_Extend # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1BAA ; Other_Grapheme_Extend # Mc SUNDANESE SIGN PAMAAEH +1BF2..1BF3 ; Other_Grapheme_Extend # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +200C ; Other_Grapheme_Extend # Cf ZERO WIDTH NON-JOINER +302E..302F ; Other_Grapheme_Extend # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +A953 ; Other_Grapheme_Extend # Mc REJANG VIRAMA +A9C0 ; Other_Grapheme_Extend # Mc JAVANESE PANGKON +FF9E..FF9F ; Other_Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +111C0 ; Other_Grapheme_Extend # Mc SHARADA SIGN VIRAMA +11235 ; Other_Grapheme_Extend # Mc KHOJKI SIGN VIRAMA +1133E ; Other_Grapheme_Extend # Mc GRANTHA VOWEL SIGN AA +1134D ; Other_Grapheme_Extend # Mc GRANTHA SIGN VIRAMA +11357 ; Other_Grapheme_Extend # Mc GRANTHA AU LENGTH MARK +113B8 ; Other_Grapheme_Extend # Mc TULU-TIGALARI VOWEL SIGN AA +113C2 ; Other_Grapheme_Extend # Mc TULU-TIGALARI VOWEL SIGN EE +113C5 ; Other_Grapheme_Extend # Mc TULU-TIGALARI VOWEL SIGN AI +113C7..113C9 ; Other_Grapheme_Extend # Mc [3] TULU-TIGALARI VOWEL SIGN OO..TULU-TIGALARI AU LENGTH MARK +113CF ; Other_Grapheme_Extend # Mc TULU-TIGALARI SIGN LOOPED VIRAMA +114B0 ; Other_Grapheme_Extend # Mc TIRHUTA VOWEL SIGN AA +114BD ; Other_Grapheme_Extend # Mc TIRHUTA VOWEL SIGN SHORT O +115AF ; Other_Grapheme_Extend # Mc SIDDHAM VOWEL SIGN AA +116B6 ; Other_Grapheme_Extend # Mc TAKRI SIGN VIRAMA +11930 ; Other_Grapheme_Extend # Mc DIVES AKURU VOWEL SIGN AA +1193D ; Other_Grapheme_Extend # Mc DIVES AKURU SIGN HALANTA +11F41 ; Other_Grapheme_Extend # Mc KAWI SIGN KILLER +16FF0..16FF1 ; Other_Grapheme_Extend # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +1D165..1D166 ; Other_Grapheme_Extend # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D16D..1D172 ; Other_Grapheme_Extend # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +E0020..E007F ; Other_Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG + +# Total code points: 160 + +# ================================================ + +2FF0..2FF1 ; IDS_Binary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +2FF4..2FFD ; IDS_Binary_Operator # So [10] IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND..IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER RIGHT +31EF ; IDS_Binary_Operator # So IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION + +# Total code points: 13 + +# ================================================ + +2FF2..2FF3 ; IDS_Trinary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW + +# Total code points: 2 + +# ================================================ + +2FFE..2FFF ; IDS_Unary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER HORIZONTAL REFLECTION..IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION + +# Total code points: 2 + +# ================================================ + +2E80..2E99 ; Radical # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; Radical # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; Radical # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE + +# Total code points: 329 + +# ================================================ + +3400..4DBF ; Unified_Ideograph # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +4E00..9FFF ; Unified_Ideograph # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF +FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F +FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11 +FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14 +FA1F ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA1F +FA21 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA21 +FA23..FA24 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24 +FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29 +20000..2A6DF ; Unified_Ideograph # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A700..2B81D ; Unified_Ideograph # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEAD ; Unified_Ideograph # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD +2CEB0..2EBE0 ; Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; Unified_Ideograph # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D +30000..3134A ; Unified_Ideograph # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..33479 ; Unified_Ideograph # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 + +# Total code points: 101996 + +# ================================================ + +034F ; Other_Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER +115F..1160 ; Other_Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER +17B4..17B5 ; Other_Default_Ignorable_Code_Point # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +2065 ; Other_Default_Ignorable_Code_Point # Cn +3164 ; Other_Default_Ignorable_Code_Point # Lo HANGUL FILLER +FFA0 ; Other_Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER +FFF0..FFF8 ; Other_Default_Ignorable_Code_Point # Cn [9] .. +E0000 ; Other_Default_Ignorable_Code_Point # Cn +E0002..E001F ; Other_Default_Ignorable_Code_Point # Cn [30] .. +E0080..E00FF ; Other_Default_Ignorable_Code_Point # Cn [128] .. +E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600] .. + +# Total code points: 3776 + +# ================================================ + +0149 ; Deprecated # L& LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +0673 ; Deprecated # Lo ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +0F77 ; Deprecated # Mn TIBETAN VOWEL SIGN VOCALIC RR +0F79 ; Deprecated # Mn TIBETAN VOWEL SIGN VOCALIC LL +17A3..17A4 ; Deprecated # Lo [2] KHMER INDEPENDENT VOWEL QAQ..KHMER INDEPENDENT VOWEL QAA +206A..206F ; Deprecated # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES +2329 ; Deprecated # Ps LEFT-POINTING ANGLE BRACKET +232A ; Deprecated # Pe RIGHT-POINTING ANGLE BRACKET +E0001 ; Deprecated # Cf LANGUAGE TAG + +# Total code points: 15 + +# ================================================ + +0069..006A ; Soft_Dotted # L& [2] LATIN SMALL LETTER I..LATIN SMALL LETTER J +012F ; Soft_Dotted # L& LATIN SMALL LETTER I WITH OGONEK +0249 ; Soft_Dotted # L& LATIN SMALL LETTER J WITH STROKE +0268 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE +029D ; Soft_Dotted # L& LATIN SMALL LETTER J WITH CROSSED-TAIL +02B2 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J +03F3 ; Soft_Dotted # L& GREEK LETTER YOT +0456 ; Soft_Dotted # L& CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0458 ; Soft_Dotted # L& CYRILLIC SMALL LETTER JE +1D62 ; Soft_Dotted # Lm LATIN SUBSCRIPT SMALL LETTER I +1D96 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH RETROFLEX HOOK +1DA4 ; Soft_Dotted # Lm MODIFIER LETTER SMALL I WITH STROKE +1DA8 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J WITH CROSSED-TAIL +1E2D ; Soft_Dotted # L& LATIN SMALL LETTER I WITH TILDE BELOW +1ECB ; Soft_Dotted # L& LATIN SMALL LETTER I WITH DOT BELOW +2071 ; Soft_Dotted # Lm SUPERSCRIPT LATIN SMALL LETTER I +2148..2149 ; Soft_Dotted # L& [2] DOUBLE-STRUCK ITALIC SMALL I..DOUBLE-STRUCK ITALIC SMALL J +2C7C ; Soft_Dotted # Lm LATIN SUBSCRIPT SMALL LETTER J +1D422..1D423 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SMALL I..MATHEMATICAL BOLD SMALL J +1D456..1D457 ; Soft_Dotted # L& [2] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL J +1D48A..1D48B ; Soft_Dotted # L& [2] MATHEMATICAL BOLD ITALIC SMALL I..MATHEMATICAL BOLD ITALIC SMALL J +1D4BE..1D4BF ; Soft_Dotted # L& [2] MATHEMATICAL SCRIPT SMALL I..MATHEMATICAL SCRIPT SMALL J +1D4F2..1D4F3 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SCRIPT SMALL I..MATHEMATICAL BOLD SCRIPT SMALL J +1D526..1D527 ; Soft_Dotted # L& [2] MATHEMATICAL FRAKTUR SMALL I..MATHEMATICAL FRAKTUR SMALL J +1D55A..1D55B ; Soft_Dotted # L& [2] MATHEMATICAL DOUBLE-STRUCK SMALL I..MATHEMATICAL DOUBLE-STRUCK SMALL J +1D58E..1D58F ; Soft_Dotted # L& [2] MATHEMATICAL BOLD FRAKTUR SMALL I..MATHEMATICAL BOLD FRAKTUR SMALL J +1D5C2..1D5C3 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF SMALL I..MATHEMATICAL SANS-SERIF SMALL J +1D5F6..1D5F7 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD SMALL I..MATHEMATICAL SANS-SERIF BOLD SMALL J +1D62A..1D62B ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF ITALIC SMALL I..MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D65E..1D65F ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D692..1D693 ; Soft_Dotted # L& [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J +1DF1A ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK +1E04C..1E04D ; Soft_Dotted # Lm [2] MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I..MODIFIER LETTER CYRILLIC SMALL JE +1E068 ; Soft_Dotted # Lm CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I + +# Total code points: 50 + +# ================================================ + +0E40..0E44 ; Logical_Order_Exception # Lo [5] THAI CHARACTER SARA E..THAI CHARACTER SARA AI MAIMALAI +0EC0..0EC4 ; Logical_Order_Exception # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +19B5..19B7 ; Logical_Order_Exception # Lo [3] NEW TAI LUE VOWEL SIGN E..NEW TAI LUE VOWEL SIGN O +19BA ; Logical_Order_Exception # Lo NEW TAI LUE VOWEL SIGN AY +AAB5..AAB6 ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB9 ; Logical_Order_Exception # Lo TAI VIET VOWEL UEA +AABB..AABC ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL AUE..TAI VIET VOWEL AY + +# Total code points: 19 + +# ================================================ + +1885..1886 ; Other_ID_Start # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +2118 ; Other_ID_Start # Sm SCRIPT CAPITAL P +212E ; Other_ID_Start # So ESTIMATED SYMBOL +309B..309C ; Other_ID_Start # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + +# Total code points: 6 + +# ================================================ + +00B7 ; Other_ID_Continue # Po MIDDLE DOT +0387 ; Other_ID_Continue # Po GREEK ANO TELEIA +1369..1371 ; Other_ID_Continue # No [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE +19DA ; Other_ID_Continue # No NEW TAI LUE THAM DIGIT ONE +200C..200D ; Other_ID_Continue # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +30FB ; Other_ID_Continue # Po KATAKANA MIDDLE DOT +FF65 ; Other_ID_Continue # Po HALFWIDTH KATAKANA MIDDLE DOT + +# Total code points: 16 + +# ================================================ + +00B2..00B3 ; ID_Compat_Math_Continue # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B9 ; ID_Compat_Math_Continue # No SUPERSCRIPT ONE +2070 ; ID_Compat_Math_Continue # No SUPERSCRIPT ZERO +2074..2079 ; ID_Compat_Math_Continue # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE +207A..207C ; ID_Compat_Math_Continue # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; ID_Compat_Math_Continue # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; ID_Compat_Math_Continue # Pe SUPERSCRIPT RIGHT PARENTHESIS +2080..2089 ; ID_Compat_Math_Continue # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE +208A..208C ; ID_Compat_Math_Continue # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; ID_Compat_Math_Continue # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; ID_Compat_Math_Continue # Pe SUBSCRIPT RIGHT PARENTHESIS +2202 ; ID_Compat_Math_Continue # Sm PARTIAL DIFFERENTIAL +2207 ; ID_Compat_Math_Continue # Sm NABLA +221E ; ID_Compat_Math_Continue # Sm INFINITY +1D6C1 ; ID_Compat_Math_Continue # Sm MATHEMATICAL BOLD NABLA +1D6DB ; ID_Compat_Math_Continue # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6FB ; ID_Compat_Math_Continue # Sm MATHEMATICAL ITALIC NABLA +1D715 ; ID_Compat_Math_Continue # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D735 ; ID_Compat_Math_Continue # Sm MATHEMATICAL BOLD ITALIC NABLA +1D74F ; ID_Compat_Math_Continue # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D76F ; ID_Compat_Math_Continue # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D789 ; ID_Compat_Math_Continue # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D7A9 ; ID_Compat_Math_Continue # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7C3 ; ID_Compat_Math_Continue # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL + +# Total code points: 43 + +# ================================================ + +2202 ; ID_Compat_Math_Start # Sm PARTIAL DIFFERENTIAL +2207 ; ID_Compat_Math_Start # Sm NABLA +221E ; ID_Compat_Math_Start # Sm INFINITY +1D6C1 ; ID_Compat_Math_Start # Sm MATHEMATICAL BOLD NABLA +1D6DB ; ID_Compat_Math_Start # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6FB ; ID_Compat_Math_Start # Sm MATHEMATICAL ITALIC NABLA +1D715 ; ID_Compat_Math_Start # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D735 ; ID_Compat_Math_Start # Sm MATHEMATICAL BOLD ITALIC NABLA +1D74F ; ID_Compat_Math_Start # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D76F ; ID_Compat_Math_Start # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D789 ; ID_Compat_Math_Start # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D7A9 ; ID_Compat_Math_Start # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7C3 ; ID_Compat_Math_Start # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL + +# Total code points: 13 + +# ================================================ + +0021 ; Sentence_Terminal # Po EXCLAMATION MARK +002E ; Sentence_Terminal # Po FULL STOP +003F ; Sentence_Terminal # Po QUESTION MARK +0589 ; Sentence_Terminal # Po ARMENIAN FULL STOP +061D..061F ; Sentence_Terminal # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK +06D4 ; Sentence_Terminal # Po ARABIC FULL STOP +0700..0702 ; Sentence_Terminal # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP +07F9 ; Sentence_Terminal # Po NKO EXCLAMATION MARK +0837 ; Sentence_Terminal # Po SAMARITAN PUNCTUATION MELODIC QITSA +0839 ; Sentence_Terminal # Po SAMARITAN PUNCTUATION QITSA +083D..083E ; Sentence_Terminal # Po [2] SAMARITAN PUNCTUATION SOF MASHFAAT..SAMARITAN PUNCTUATION ANNAAU +0964..0965 ; Sentence_Terminal # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +104A..104B ; Sentence_Terminal # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION +1362 ; Sentence_Terminal # Po ETHIOPIC FULL STOP +1367..1368 ; Sentence_Terminal # Po [2] ETHIOPIC QUESTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +166E ; Sentence_Terminal # Po CANADIAN SYLLABICS FULL STOP +1735..1736 ; Sentence_Terminal # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +17D4..17D5 ; Sentence_Terminal # Po [2] KHMER SIGN KHAN..KHMER SIGN BARIYOOSAN +1803 ; Sentence_Terminal # Po MONGOLIAN FULL STOP +1809 ; Sentence_Terminal # Po MONGOLIAN MANCHU FULL STOP +1944..1945 ; Sentence_Terminal # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1AA8..1AAB ; Sentence_Terminal # Po [4] TAI THAM SIGN KAAN..TAI THAM SIGN SATKAANKUU +1B4E..1B4F ; Sentence_Terminal # Po [2] BALINESE INVERTED CARIK SIKI..BALINESE INVERTED CARIK PAREREN +1B5A..1B5B ; Sentence_Terminal # Po [2] BALINESE PANTI..BALINESE PAMADA +1B5E..1B5F ; Sentence_Terminal # Po [2] BALINESE CARIK SIKI..BALINESE CARIK PAREREN +1B7D..1B7F ; Sentence_Terminal # Po [3] BALINESE PANTI LANTANG..BALINESE PANTI BAWAK +1C3B..1C3C ; Sentence_Terminal # Po [2] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION NYET THYOOM TA-ROL +1C7E..1C7F ; Sentence_Terminal # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +2024 ; Sentence_Terminal # Po ONE DOT LEADER +203C..203D ; Sentence_Terminal # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +2047..2049 ; Sentence_Terminal # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +2CF9..2CFB ; Sentence_Terminal # Po [3] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2E2E ; Sentence_Terminal # Po REVERSED QUESTION MARK +2E3C ; Sentence_Terminal # Po STENOGRAPHIC FULL STOP +2E53..2E54 ; Sentence_Terminal # Po [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK +3002 ; Sentence_Terminal # Po IDEOGRAPHIC FULL STOP +A4FF ; Sentence_Terminal # Po LISU PUNCTUATION FULL STOP +A60E..A60F ; Sentence_Terminal # Po [2] VAI FULL STOP..VAI QUESTION MARK +A6F3 ; Sentence_Terminal # Po BAMUM FULL STOP +A6F7 ; Sentence_Terminal # Po BAMUM QUESTION MARK +A876..A877 ; Sentence_Terminal # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD +A8CE..A8CF ; Sentence_Terminal # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A92F ; Sentence_Terminal # Po KAYAH LI SIGN SHYA +A9C8..A9C9 ; Sentence_Terminal # Po [2] JAVANESE PADA LINGSA..JAVANESE PADA LUNGSI +AA5D..AA5F ; Sentence_Terminal # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA +AAF0..AAF1 ; Sentence_Terminal # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +ABEB ; Sentence_Terminal # Po MEETEI MAYEK CHEIKHEI +FE12 ; Sentence_Terminal # Po PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE15..FE16 ; Sentence_Terminal # Po [2] PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE52 ; Sentence_Terminal # Po SMALL FULL STOP +FE56..FE57 ; Sentence_Terminal # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK +FF01 ; Sentence_Terminal # Po FULLWIDTH EXCLAMATION MARK +FF0E ; Sentence_Terminal # Po FULLWIDTH FULL STOP +FF1F ; Sentence_Terminal # Po FULLWIDTH QUESTION MARK +FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP +10A56..10A57 ; Sentence_Terminal # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA +10F55..10F59 ; Sentence_Terminal # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +10F86..10F89 ; Sentence_Terminal # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS +11047..11048 ; Sentence_Terminal # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA +110BE..110C1 ; Sentence_Terminal # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +11141..11143 ; Sentence_Terminal # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK +111C5..111C6 ; Sentence_Terminal # Po [2] SHARADA DANDA..SHARADA DOUBLE DANDA +111CD ; Sentence_Terminal # Po SHARADA SUTRA MARK +111DE..111DF ; Sentence_Terminal # Po [2] SHARADA SECTION MARK-1..SHARADA SECTION MARK-2 +11238..11239 ; Sentence_Terminal # Po [2] KHOJKI DANDA..KHOJKI DOUBLE DANDA +1123B..1123C ; Sentence_Terminal # Po [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK +112A9 ; Sentence_Terminal # Po MULTANI SECTION MARK +113D4..113D5 ; Sentence_Terminal # Po [2] TULU-TIGALARI DANDA..TULU-TIGALARI DOUBLE DANDA +1144B..1144C ; Sentence_Terminal # Po [2] NEWA DANDA..NEWA DOUBLE DANDA +115C2..115C3 ; Sentence_Terminal # Po [2] SIDDHAM DANDA..SIDDHAM DOUBLE DANDA +115C9..115D7 ; Sentence_Terminal # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +11641..11642 ; Sentence_Terminal # Po [2] MODI DANDA..MODI DOUBLE DANDA +1173C..1173E ; Sentence_Terminal # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +11944 ; Sentence_Terminal # Po DIVES AKURU DOUBLE DANDA +11946 ; Sentence_Terminal # Po DIVES AKURU END OF TEXT MARK +11A42..11A43 ; Sentence_Terminal # Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD +11A9B..11A9C ; Sentence_Terminal # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD +11C41..11C42 ; Sentence_Terminal # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA +11EF7..11EF8 ; Sentence_Terminal # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F43..11F44 ; Sentence_Terminal # Po [2] KAWI DANDA..KAWI DOUBLE DANDA +16A6E..16A6F ; Sentence_Terminal # Po [2] MRO DANDA..MRO DOUBLE DANDA +16AF5 ; Sentence_Terminal # Po BASSA VAH FULL STOP +16B37..16B38 ; Sentence_Terminal # Po [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB +16B44 ; Sentence_Terminal # Po PAHAWH HMONG SIGN XAUS +16D6E..16D6F ; Sentence_Terminal # Po [2] KIRAT RAI DANDA..KIRAT RAI DOUBLE DANDA +16E98 ; Sentence_Terminal # Po MEDEFAIDRIN FULL STOP +1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1DA88 ; Sentence_Terminal # Po SIGNWRITING FULL STOP + +# Total code points: 170 + +# ================================================ + +180B..180D ; Variation_Selector # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180F ; Variation_Selector # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR +FE00..FE0F ; Variation_Selector # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 260 + +# ================================================ + +0009..000D ; Pattern_White_Space # Cc [5] .. +0020 ; Pattern_White_Space # Zs SPACE +0085 ; Pattern_White_Space # Cc +200E..200F ; Pattern_White_Space # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +2028 ; Pattern_White_Space # Zl LINE SEPARATOR +2029 ; Pattern_White_Space # Zp PARAGRAPH SEPARATOR + +# Total code points: 11 + +# ================================================ + +0021..0023 ; Pattern_Syntax # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Pattern_Syntax # Sc DOLLAR SIGN +0025..0027 ; Pattern_Syntax # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Pattern_Syntax # Ps LEFT PARENTHESIS +0029 ; Pattern_Syntax # Pe RIGHT PARENTHESIS +002A ; Pattern_Syntax # Po ASTERISK +002B ; Pattern_Syntax # Sm PLUS SIGN +002C ; Pattern_Syntax # Po COMMA +002D ; Pattern_Syntax # Pd HYPHEN-MINUS +002E..002F ; Pattern_Syntax # Po [2] FULL STOP..SOLIDUS +003A..003B ; Pattern_Syntax # Po [2] COLON..SEMICOLON +003C..003E ; Pattern_Syntax # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Pattern_Syntax # Po [2] QUESTION MARK..COMMERCIAL AT +005B ; Pattern_Syntax # Ps LEFT SQUARE BRACKET +005C ; Pattern_Syntax # Po REVERSE SOLIDUS +005D ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET +005E ; Pattern_Syntax # Sk CIRCUMFLEX ACCENT +0060 ; Pattern_Syntax # Sk GRAVE ACCENT +007B ; Pattern_Syntax # Ps LEFT CURLY BRACKET +007C ; Pattern_Syntax # Sm VERTICAL LINE +007D ; Pattern_Syntax # Pe RIGHT CURLY BRACKET +007E ; Pattern_Syntax # Sm TILDE +00A1 ; Pattern_Syntax # Po INVERTED EXCLAMATION MARK +00A2..00A5 ; Pattern_Syntax # Sc [4] CENT SIGN..YEN SIGN +00A6 ; Pattern_Syntax # So BROKEN BAR +00A7 ; Pattern_Syntax # Po SECTION SIGN +00A9 ; Pattern_Syntax # So COPYRIGHT SIGN +00AB ; Pattern_Syntax # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; Pattern_Syntax # Sm NOT SIGN +00AE ; Pattern_Syntax # So REGISTERED SIGN +00B0 ; Pattern_Syntax # So DEGREE SIGN +00B1 ; Pattern_Syntax # Sm PLUS-MINUS SIGN +00B6 ; Pattern_Syntax # Po PILCROW SIGN +00BB ; Pattern_Syntax # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BF ; Pattern_Syntax # Po INVERTED QUESTION MARK +00D7 ; Pattern_Syntax # Sm MULTIPLICATION SIGN +00F7 ; Pattern_Syntax # Sm DIVISION SIGN +2010..2015 ; Pattern_Syntax # Pd [6] HYPHEN..HORIZONTAL BAR +2016..2017 ; Pattern_Syntax # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE +2018 ; Pattern_Syntax # Pi LEFT SINGLE QUOTATION MARK +2019 ; Pattern_Syntax # Pf RIGHT SINGLE QUOTATION MARK +201A ; Pattern_Syntax # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Pattern_Syntax # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Pattern_Syntax # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Pattern_Syntax # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Pattern_Syntax # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2027 ; Pattern_Syntax # Po [8] DAGGER..HYPHENATION POINT +2030..2038 ; Pattern_Syntax # Po [9] PER MILLE SIGN..CARET +2039 ; Pattern_Syntax # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Pattern_Syntax # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B..203E ; Pattern_Syntax # Po [4] REFERENCE MARK..OVERLINE +2041..2043 ; Pattern_Syntax # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; Pattern_Syntax # Sm FRACTION SLASH +2045 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; Pattern_Syntax # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; Pattern_Syntax # Sm COMMERCIAL MINUS SIGN +2053 ; Pattern_Syntax # Po SWUNG DASH +2055..205E ; Pattern_Syntax # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +2190..2194 ; Pattern_Syntax # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; Pattern_Syntax # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; Pattern_Syntax # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; Pattern_Syntax # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; Pattern_Syntax # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; Pattern_Syntax # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; Pattern_Syntax # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; Pattern_Syntax # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; Pattern_Syntax # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; Pattern_Syntax # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; Pattern_Syntax # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD ; Pattern_Syntax # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; Pattern_Syntax # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Pattern_Syntax # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; Pattern_Syntax # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; Pattern_Syntax # So DOWNWARDS DOUBLE ARROW +21D4 ; Pattern_Syntax # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3 ; Pattern_Syntax # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..22FF ; Pattern_Syntax # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP +2300..2307 ; Pattern_Syntax # So [8] DIAMETER SIGN..WAVY LINE +2308 ; Pattern_Syntax # Ps LEFT CEILING +2309 ; Pattern_Syntax # Pe RIGHT CEILING +230A ; Pattern_Syntax # Ps LEFT FLOOR +230B ; Pattern_Syntax # Pe RIGHT FLOOR +230C..231F ; Pattern_Syntax # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER +2320..2321 ; Pattern_Syntax # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; Pattern_Syntax # So [7] FROWN..KEYBOARD +2329 ; Pattern_Syntax # Ps LEFT-POINTING ANGLE BRACKET +232A ; Pattern_Syntax # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; Pattern_Syntax # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; Pattern_Syntax # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; Pattern_Syntax # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; Pattern_Syntax # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23DB ; Pattern_Syntax # So [40] TOP SQUARE BRACKET..FUSE +23DC..23E1 ; Pattern_Syntax # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +23E2..2429 ; Pattern_Syntax # So [72] WHITE TRAPEZIUM..SYMBOL FOR DELETE MEDIUM SHADE FORM +242A..243F ; Pattern_Syntax # Cn [22] .. +2440..244A ; Pattern_Syntax # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +244B..245F ; Pattern_Syntax # Cn [21] .. +2500..25B6 ; Pattern_Syntax # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE +25B7 ; Pattern_Syntax # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25C0 ; Pattern_Syntax # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C1 ; Pattern_Syntax # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25F7 ; Pattern_Syntax # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; Pattern_Syntax # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..266E ; Pattern_Syntax # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN +266F ; Pattern_Syntax # Sm MUSIC SHARP SIGN +2670..2767 ; Pattern_Syntax # So [248] WEST SYRIAC CROSS..ROTATED FLORAL HEART BULLET +2768 ; Pattern_Syntax # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; Pattern_Syntax # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; Pattern_Syntax # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; Pattern_Syntax # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; Pattern_Syntax # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; Pattern_Syntax # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; Pattern_Syntax # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; Pattern_Syntax # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; Pattern_Syntax # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; Pattern_Syntax # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; Pattern_Syntax # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; Pattern_Syntax # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; Pattern_Syntax # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; Pattern_Syntax # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2794..27BF ; Pattern_Syntax # So [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP +27C0..27C4 ; Pattern_Syntax # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; Pattern_Syntax # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Pattern_Syntax # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5 ; Pattern_Syntax # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Pattern_Syntax # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Pattern_Syntax # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Pattern_Syntax # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Pattern_Syntax # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Pattern_Syntax # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Pattern_Syntax # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Pattern_Syntax # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Pattern_Syntax # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; Pattern_Syntax # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; Pattern_Syntax # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; Pattern_Syntax # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF ; Pattern_Syntax # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..2982 ; Pattern_Syntax # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; Pattern_Syntax # Ps LEFT WHITE CURLY BRACKET +2984 ; Pattern_Syntax # Pe RIGHT WHITE CURLY BRACKET +2985 ; Pattern_Syntax # Ps LEFT WHITE PARENTHESIS +2986 ; Pattern_Syntax # Pe RIGHT WHITE PARENTHESIS +2987 ; Pattern_Syntax # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Pattern_Syntax # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Pattern_Syntax # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Pattern_Syntax # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Pattern_Syntax # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Pattern_Syntax # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Pattern_Syntax # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Pattern_Syntax # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Pattern_Syntax # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Pattern_Syntax # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; Pattern_Syntax # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; Pattern_Syntax # Ps LEFT WIGGLY FENCE +29D9 ; Pattern_Syntax # Pe RIGHT WIGGLY FENCE +29DA ; Pattern_Syntax # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Pattern_Syntax # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; Pattern_Syntax # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; Pattern_Syntax # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Pattern_Syntax # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; Pattern_Syntax # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B00..2B2F ; Pattern_Syntax # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE +2B30..2B44 ; Pattern_Syntax # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B45..2B46 ; Pattern_Syntax # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +2B47..2B4C ; Pattern_Syntax # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B73 ; Pattern_Syntax # So [39] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B74..2B75 ; Pattern_Syntax # Cn [2] .. +2B76..2BFF ; Pattern_Syntax # So [138] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..HELLSCHREIBER PAUSE SYMBOL +2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; Pattern_Syntax # Pi LEFT SUBSTITUTION BRACKET +2E03 ; Pattern_Syntax # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; Pattern_Syntax # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; Pattern_Syntax # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; Pattern_Syntax # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; Pattern_Syntax # Pi LEFT TRANSPOSITION BRACKET +2E0A ; Pattern_Syntax # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; Pattern_Syntax # Po RAISED SQUARE +2E0C ; Pattern_Syntax # Pi LEFT RAISED OMISSION BRACKET +2E0D ; Pattern_Syntax # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16 ; Pattern_Syntax # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17 ; Pattern_Syntax # Pd DOUBLE OBLIQUE HYPHEN +2E18..2E19 ; Pattern_Syntax # Po [2] INVERTED INTERROBANG..PALM BRANCH +2E1A ; Pattern_Syntax # Pd HYPHEN WITH DIAERESIS +2E1B ; Pattern_Syntax # Po TILDE WITH RING ABOVE +2E1C ; Pattern_Syntax # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; Pattern_Syntax # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F ; Pattern_Syntax # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20 ; Pattern_Syntax # Pi LEFT VERTICAL BAR WITH QUILL +2E21 ; Pattern_Syntax # Pf RIGHT VERTICAL BAR WITH QUILL +2E22 ; Pattern_Syntax # Ps TOP LEFT HALF BRACKET +2E23 ; Pattern_Syntax # Pe TOP RIGHT HALF BRACKET +2E24 ; Pattern_Syntax # Ps BOTTOM LEFT HALF BRACKET +2E25 ; Pattern_Syntax # Pe BOTTOM RIGHT HALF BRACKET +2E26 ; Pattern_Syntax # Ps LEFT SIDEWAYS U BRACKET +2E27 ; Pattern_Syntax # Pe RIGHT SIDEWAYS U BRACKET +2E28 ; Pattern_Syntax # Ps LEFT DOUBLE PARENTHESIS +2E29 ; Pattern_Syntax # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2E ; Pattern_Syntax # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK +2E2F ; Pattern_Syntax # Lm VERTICAL TILDE +2E30..2E39 ; Pattern_Syntax # Po [10] RING POINT..TOP HALF SECTION SIGN +2E3A..2E3B ; Pattern_Syntax # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3F ; Pattern_Syntax # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM +2E40 ; Pattern_Syntax # Pd DOUBLE HYPHEN +2E41 ; Pattern_Syntax # Po REVERSED COMMA +2E42 ; Pattern_Syntax # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4F ; Pattern_Syntax # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER +2E50..2E51 ; Pattern_Syntax # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR +2E52..2E54 ; Pattern_Syntax # Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK +2E55 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH STROKE +2E56 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH STROKE +2E57 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE +2E58 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE +2E59 ; Pattern_Syntax # Ps TOP HALF LEFT PARENTHESIS +2E5A ; Pattern_Syntax # Pe TOP HALF RIGHT PARENTHESIS +2E5B ; Pattern_Syntax # Ps BOTTOM HALF LEFT PARENTHESIS +2E5C ; Pattern_Syntax # Pe BOTTOM HALF RIGHT PARENTHESIS +2E5D ; Pattern_Syntax # Pd OBLIQUE HYPHEN +2E5E..2E7F ; Pattern_Syntax # Cn [34] .. +3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET +3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET +300A ; Pattern_Syntax # Ps LEFT DOUBLE ANGLE BRACKET +300B ; Pattern_Syntax # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; Pattern_Syntax # Ps LEFT CORNER BRACKET +300D ; Pattern_Syntax # Pe RIGHT CORNER BRACKET +300E ; Pattern_Syntax # Ps LEFT WHITE CORNER BRACKET +300F ; Pattern_Syntax # Pe RIGHT WHITE CORNER BRACKET +3010 ; Pattern_Syntax # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; Pattern_Syntax # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; Pattern_Syntax # So [2] POSTAL MARK..GETA MARK +3014 ; Pattern_Syntax # Ps LEFT TORTOISE SHELL BRACKET +3015 ; Pattern_Syntax # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; Pattern_Syntax # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; Pattern_Syntax # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; Pattern_Syntax # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; Pattern_Syntax # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; Pattern_Syntax # Ps LEFT WHITE SQUARE BRACKET +301B ; Pattern_Syntax # Pe RIGHT WHITE SQUARE BRACKET +301C ; Pattern_Syntax # Pd WAVE DASH +301D ; Pattern_Syntax # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Pattern_Syntax # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; Pattern_Syntax # So POSTAL MARK FACE +3030 ; Pattern_Syntax # Pd WAVY DASH +FD3E ; Pattern_Syntax # Pe ORNATE LEFT PARENTHESIS +FD3F ; Pattern_Syntax # Ps ORNATE RIGHT PARENTHESIS +FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT + +# Total code points: 2760 + +# ================================================ + +0600..0605 ; Prepended_Concatenation_Mark # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +06DD ; Prepended_Concatenation_Mark # Cf ARABIC END OF AYAH +070F ; Prepended_Concatenation_Mark # Cf SYRIAC ABBREVIATION MARK +0890..0891 ; Prepended_Concatenation_Mark # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE +08E2 ; Prepended_Concatenation_Mark # Cf ARABIC DISPUTED END OF AYAH +110BD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN +110CD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN ABOVE + +# Total code points: 13 + +# ================================================ + +1F1E6..1F1FF ; Regional_Indicator # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z + +# Total code points: 26 + +# ================================================ + +0654..0655 ; Modifier_Combining_Mark # Mn [2] ARABIC HAMZA ABOVE..ARABIC HAMZA BELOW +0658 ; Modifier_Combining_Mark # Mn ARABIC MARK NOON GHUNNA +06DC ; Modifier_Combining_Mark # Mn ARABIC SMALL HIGH SEEN +06E3 ; Modifier_Combining_Mark # Mn ARABIC SMALL LOW SEEN +06E7..06E8 ; Modifier_Combining_Mark # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +08CA..08CB ; Modifier_Combining_Mark # Mn [2] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW +08CD..08CF ; Modifier_Combining_Mark # Mn [3] ARABIC SMALL HIGH ZAH..ARABIC LARGE ROUND DOT BELOW +08D3 ; Modifier_Combining_Mark # Mn ARABIC SMALL LOW WAW +08F3 ; Modifier_Combining_Mark # Mn ARABIC SMALL HIGH WAW + +# Total code points: 14 + +# EOF diff --git a/tests/core/assets/UCD/UnicodeData.txt b/tests/core/assets/UCD/UnicodeData.txt new file mode 100644 index 000000000..fca68e3e1 --- /dev/null +++ b/tests/core/assets/UCD/UnicodeData.txt @@ -0,0 +1,40575 @@ +0000;;Cc;0;BN;;;;;N;NULL;;;; +0001;;Cc;0;BN;;;;;N;START OF HEADING;;;; +0002;;Cc;0;BN;;;;;N;START OF TEXT;;;; +0003;;Cc;0;BN;;;;;N;END OF TEXT;;;; +0004;;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; +0005;;Cc;0;BN;;;;;N;ENQUIRY;;;; +0006;;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; +0007;;Cc;0;BN;;;;;N;BELL;;;; +0008;;Cc;0;BN;;;;;N;BACKSPACE;;;; +0009;;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; +000A;;Cc;0;B;;;;;N;LINE FEED (LF);;;; +000B;;Cc;0;S;;;;;N;LINE TABULATION;;;; +000C;;Cc;0;WS;;;;;N;FORM FEED (FF);;;; +000D;;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; +000E;;Cc;0;BN;;;;;N;SHIFT OUT;;;; +000F;;Cc;0;BN;;;;;N;SHIFT IN;;;; +0010;;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; +0011;;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; +0012;;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; +0013;;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; +0014;;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; +0015;;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; +0016;;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; +0017;;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; +0018;;Cc;0;BN;;;;;N;CANCEL;;;; +0019;;Cc;0;BN;;;;;N;END OF MEDIUM;;;; +001A;;Cc;0;BN;;;;;N;SUBSTITUTE;;;; +001B;;Cc;0;BN;;;;;N;ESCAPE;;;; +001C;;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; +001D;;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; +001E;;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; +001F;;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; +0020;SPACE;Zs;0;WS;;;;;N;;;;; +0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; +0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; +0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; +0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; +0026;AMPERSAND;Po;0;ON;;;;;N;;;;; +0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; +0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; +0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; +002A;ASTERISK;Po;0;ON;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; +002C;COMMA;Po;0;CS;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; +002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; +002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; +0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; +0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; +0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; +0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; +0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; +0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; +0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; +0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; +0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; +0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; +003A;COLON;Po;0;CS;;;;;N;;;;; +003B;SEMICOLON;Po;0;ON;;;;;N;;;;; +003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; +0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; +0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; +0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; +0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; +0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; +0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; +0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; +0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; +0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; +0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; +004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; +004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; +004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; +004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; +004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; +004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; +0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; +0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; +0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; +0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; +0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; +0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; +0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; +0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; +0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; +0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; +005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; +005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; +005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; +005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; +005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; +005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; +0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; +0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 +0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 +0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 +0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 +0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 +0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 +0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 +0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 +0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 +006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A +006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B +006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C +006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D +006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E +006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F +0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 +0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 +0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 +0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 +0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 +0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 +0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 +0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 +0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 +0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 +007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A +007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; +007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; +007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; +007E;TILDE;Sm;0;ON;;;;;N;;;;; +007F;;Cc;0;BN;;;;;N;DELETE;;;; +0080;;Cc;0;BN;;;;;N;;;;; +0081;;Cc;0;BN;;;;;N;;;;; +0082;;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; +0083;;Cc;0;BN;;;;;N;NO BREAK HERE;;;; +0084;;Cc;0;BN;;;;;N;;;;; +0085;;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; +0086;;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; +0087;;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; +0088;;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; +0089;;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; +008A;;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; +008B;;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; +008C;;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; +008D;;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; +008E;;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; +008F;;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; +0090;;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; +0091;;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; +0092;;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; +0093;;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; +0094;;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; +0095;;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; +0096;;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; +0097;;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; +0098;;Cc;0;BN;;;;;N;START OF STRING;;;; +0099;;Cc;0;BN;;;;;N;;;;; +009A;;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; +009B;;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; +009C;;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; +009D;;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; +009E;;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; +009F;;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; +00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; +00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; +00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; +00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; +00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; +00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;; +00A8;DIAERESIS;Sk;0;ON; 0020 0308;;;;N;SPACING DIAERESIS;;;; +00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; +00AA;FEMININE ORDINAL INDICATOR;Lo;0;L; 0061;;;;N;;;;; +00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;; +00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; +00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; +00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;; +00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; +00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; +00B2;SUPERSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;; +00B3;SUPERSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;; +00B4;ACUTE ACCENT;Sk;0;ON; 0020 0301;;;;N;SPACING ACUTE;;;; +00B5;MICRO SIGN;Ll;0;L; 03BC;;;;N;;;039C;;039C +00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;; +00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; +00B8;CEDILLA;Sk;0;ON; 0020 0327;;;;N;SPACING CEDILLA;;;; +00B9;SUPERSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; +00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L; 006F;;;;N;;;;; +00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; +00BC;VULGAR FRACTION ONE QUARTER;No;0;ON; 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; +00BD;VULGAR FRACTION ONE HALF;No;0;ON; 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; +00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON; 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; +00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; +00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; +00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; +00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; +00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; +00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; +00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; +00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6; +00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; +00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; +00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; +00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; +00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; +00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; +00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; +00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; +00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; +00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0; +00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; +00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; +00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; +00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; +00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; +00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; +00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; +00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; +00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; +00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; +00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; +00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; +00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; +00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE; +00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;; +00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 +00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 +00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 +00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 +00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 +00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 +00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6 +00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 +00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 +00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 +00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA +00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB +00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC +00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD +00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE +00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF +00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0 +00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 +00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 +00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 +00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 +00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 +00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 +00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 +00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 +00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA +00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB +00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC +00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD +00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE +00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 +0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; +0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 +0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; +0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 +0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; +0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 +0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; +0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 +0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; +0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 +010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; +010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A +010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; +010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C +010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; +010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E +0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; +0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 +0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; +0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 +0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; +0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 +0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; +0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 +0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; +0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 +011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; +011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A +011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; +011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C +011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; +011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E +0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; +0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 +0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; +0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 +0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; +0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 +0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; +0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 +0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; +0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 +012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; +012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A +012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; +012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C +012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; +012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E +0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; +0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 +0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L; 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; +0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 +0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; +0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 +0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; +0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 +0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;; +0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; +013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 +013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; +013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B +013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; +013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D +013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L; 004C 00B7;;;;N;;;;0140; +0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L; 006C 00B7;;;;N;;;013F;;013F +0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; +0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 +0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; +0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 +0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; +0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 +0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; +0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 +0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L; 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; +014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B; +014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A +014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; +014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C +014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; +014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E +0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; +0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 +0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; +0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 +0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; +0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 +0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; +0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 +0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; +0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 +015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; +015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A +015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; +015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C +015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F; +015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E +0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; +0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 +0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163; +0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162 +0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; +0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 +0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; +0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 +0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; +0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 +016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; +016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A +016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; +016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C +016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; +016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E +0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; +0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 +0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; +0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 +0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; +0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 +0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; +0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 +0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; +0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; +017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 +017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; +017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B +017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; +017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D +017F;LATIN SMALL LETTER LONG S;Ll;0;L; 0073;;;;N;;;0053;;0053 +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 +0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; +0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; +0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 +0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; +0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 +0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; +0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; +0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 +0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256; +018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; +018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; +018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B +018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; +018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; +018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; +0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; +0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; +0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 +0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; +0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; +0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6 +0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; +0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; +0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; +0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D +019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;A7DC;;A7DC +019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; +019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; +019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 +019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275; +01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; +01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 +01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3; +01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2 +01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; +01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 +01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; +01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; +01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 +01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; +01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; +01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; +01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; +01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC +01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; +01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; +01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF +01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; +01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; +01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; +01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 +01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; +01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 +01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; +01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; +01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 +01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; +01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; +01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; +01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC +01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; +01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 +01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; +01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; +01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; +01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; +01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 +01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 +01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 +01C7;LATIN CAPITAL LETTER LJ;Lu;0;L; 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 +01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L; 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8 +01C9;LATIN SMALL LETTER LJ;Ll;0;L; 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 +01CA;LATIN CAPITAL LETTER NJ;Lu;0;L; 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB +01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L; 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB +01CC;LATIN SMALL LETTER NJ;Ll;0;L; 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB +01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; +01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD +01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; +01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF +01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; +01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 +01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; +01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 +01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; +01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 +01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; +01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 +01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; +01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 +01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; +01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB +01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E +01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; +01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE +01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; +01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 +01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3; +01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2 +01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; +01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 +01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; +01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 +01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; +01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 +01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; +01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA +01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; +01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC +01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; +01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE +01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; +01F1;LATIN CAPITAL LETTER DZ;Lu;0;L; 0044 005A;;;;N;;;;01F3;01F2 +01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L; 0044 007A;;;;N;;;01F1;01F3;01F2 +01F3;LATIN SMALL LETTER DZ;Ll;0;L; 0064 007A;;;;N;;;01F1;;01F2 +01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; +01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 +01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; +01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; +01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; +01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 +01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; +01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA +01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD; +01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC +01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; +01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE +0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; +0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 +0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; +0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 +0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; +0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 +0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; +0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 +0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; +0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 +020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; +020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A +020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; +020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C +020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; +020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E +0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; +0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 +0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; +0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 +0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; +0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 +0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; +0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 +0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219; +0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218 +021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B; +021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A +021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; +021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C +021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; +021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E +0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; +0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; +0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; +0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 +0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; +0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 +0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; +0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 +0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; +0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 +022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; +022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A +022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; +022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C +022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; +022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E +0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; +0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 +0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; +0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 +0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; +0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; +0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; +0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; +0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; +0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; +023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; +023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; +023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B +023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; +023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; +023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E +0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F +0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; +0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 +0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; +0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; +0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; +0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; +0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 +0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; +0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 +024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; +024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A +024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; +024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C +024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; +024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D +0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70 +0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 +0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 +0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; +0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 +0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A +0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; +0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F +025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; +025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 +025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB +025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; +025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; +025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; +0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 +0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC +0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; +0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 +0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;A7CB;;A7CB +0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D +0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA +0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; +0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 +0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 +026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;A7AE;;A7AE +026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 +026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD +026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; +026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; +026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C +0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E +0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D +0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; +0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; +0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F +0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; +0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; +0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; +027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; +027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 +027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; +027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; +0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 +0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; +0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;A7C5;;A7C5 +0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 +0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; +0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; +0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; +0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1 +0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 +028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 +028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 +028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; +028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; +028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; +0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; +0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; +0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 +0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; +0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Lo;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; +0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; +0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; +0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; +029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; +029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; +029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2 +029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 +029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; +02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; +02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; +02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; +02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; +02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; +02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; +02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; +02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; +02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; +02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; +02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; +02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; +02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; +02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;; +02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; +02B2;MODIFIER LETTER SMALL J;Lm;0;L; 006A;;;;N;;;;; +02B3;MODIFIER LETTER SMALL R;Lm;0;L; 0072;;;;N;;;;; +02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L; 0279;;;;N;;;;; +02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L; 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; +02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L; 0281;;;;N;;;;; +02B7;MODIFIER LETTER SMALL W;Lm;0;L; 0077;;;;N;;;;; +02B8;MODIFIER LETTER SMALL Y;Lm;0;L; 0079;;;;N;;;;; +02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;; +02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;; +02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; +02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; +02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; +02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; +02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; +02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;; +02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;; +02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;; +02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;; +02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; +02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; +02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; +02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; +02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; +02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; +02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; +02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; +02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; +02D8;BREVE;Sk;0;ON; 0020 0306;;;;N;SPACING BREVE;;;; +02D9;DOT ABOVE;Sk;0;ON; 0020 0307;;;;N;SPACING DOT ABOVE;;;; +02DA;RING ABOVE;Sk;0;ON; 0020 030A;;;;N;SPACING RING ABOVE;;;; +02DB;OGONEK;Sk;0;ON; 0020 0328;;;;N;SPACING OGONEK;;;; +02DC;SMALL TILDE;Sk;0;ON; 0020 0303;;;;N;SPACING TILDE;;;; +02DD;DOUBLE ACUTE ACCENT;Sk;0;ON; 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; +02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; +02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; +02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L; 0263;;;;N;;;;; +02E1;MODIFIER LETTER SMALL L;Lm;0;L; 006C;;;;N;;;;; +02E2;MODIFIER LETTER SMALL S;Lm;0;L; 0073;;;;N;;;;; +02E3;MODIFIER LETTER SMALL X;Lm;0;L; 0078;;;;N;;;;; +02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L; 0295;;;;N;;;;; +02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; +02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; +02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; +02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; +02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; +02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; +02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; +02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; +02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; +02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; +02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; +02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; +02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;; +0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; +0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;; +0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; +0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; +0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; +0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; +0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;; +0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; +0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;; +0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; +030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; +030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; +030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; +030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; +030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; +030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; +0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; +0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; +0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; +0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;; +0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;; +0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; +0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; +0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; +0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; +0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; +031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; +031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; +031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; +031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; +031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; +031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; +0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; +0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; +0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; +0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; +0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; +0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; +0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; +0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; +0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; +0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; +032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; +032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; +032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; +032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; +032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; +032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; +0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; +0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; +0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; +0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; +0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; +0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; +0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; +0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; +0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; +0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; +033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; +033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; +033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; +033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; +033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; +033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; +0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;; +0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;; +0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; +0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; +0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; +0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 +0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; +034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; +034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; +034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; +034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; +0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; +0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; +0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; +035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; +035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; +035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; +035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; +0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; +0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; +0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; +0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; +0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; +0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; +0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; +0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; +0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; +0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; +036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; +036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; +036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; +036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; +036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; +036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; +0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; +0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 +0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; +0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 +0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;; +0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;; +0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; +0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 +037A;GREEK YPOGEGRAMMENI;Lm;0;L; 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD +037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE +037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF +037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;; +037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3; +0384;GREEK TONOS;Sk;0;ON; 0020 0301;;;;N;GREEK SPACING TONOS;;;; +0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; +0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; +0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; +0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; +0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; +038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; +038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; +038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; +038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; +0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; +0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; +0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; +0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; +0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; +0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; +0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; +0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; +0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; +0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; +039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; +039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; +039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; +039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; +039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; +039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; +03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; +03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; +03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; +03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; +03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; +03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; +03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; +03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; +03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; +03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; +03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; +03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 +03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 +03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 +03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A +03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; +03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 +03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 +03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 +03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 +03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 +03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 +03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 +03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 +03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 +03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A +03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B +03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C +03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D +03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E +03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F +03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 +03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 +03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 +03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 +03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 +03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 +03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 +03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 +03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA +03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB +03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C +03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E +03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; +03D0;GREEK BETA SYMBOL;Ll;0;L; 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 +03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 +03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L; 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; +03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; +03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; +03D5;GREEK PHI SYMBOL;Ll;0;L; 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 +03D6;GREEK PI SYMBOL;Ll;0;L; 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF +03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9; +03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8 +03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; +03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA +03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; +03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC +03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; +03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE +03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; +03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 +03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; +03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 +03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; +03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 +03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; +03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 +03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; +03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 +03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; +03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA +03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; +03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC +03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; +03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE +03F0;GREEK KAPPA SYMBOL;Ll;0;L; 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A +03F1;GREEK RHO SYMBOL;Ll;0;L; 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 +03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L; 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9 +03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F +03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8; +03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L; 03B5;;;;N;;;0395;;0395 +03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; +03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; +03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 +03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L; 03A3;;;;N;;;;03F2; +03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; +03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA +03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; +03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; +03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; +03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; +0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; +0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; +0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452; +0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; +0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; +0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; +0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; +0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457; +0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; +0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; +040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; +040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B; +040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; +040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; +040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E; +040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; +0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; +0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; +0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; +0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; +0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; +0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; +0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; +0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; +0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; +0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; +041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; +041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; +041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; +041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; +041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; +041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; +0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; +0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; +0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; +0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; +0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; +0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; +0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; +0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; +0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; +0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; +042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; +042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; +042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; +042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; +042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; +042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; +0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 +0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 +0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 +0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 +0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 +0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 +0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 +0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 +0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 +0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 +043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A +043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B +043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C +043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D +043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E +043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F +0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 +0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 +0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 +0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 +0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 +0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 +0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 +0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 +0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 +0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 +044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B +044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C +044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D +044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E +044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F +0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 +0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 +0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402 +0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 +0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 +0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 +0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 +0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407 +0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 +0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 +045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A +045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B +045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C +045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D +045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E +045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F +0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; +0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 +0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; +0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 +0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; +0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 +0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; +0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 +0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; +0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 +046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; +046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A +046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; +046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C +046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; +046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E +0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; +0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 +0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; +0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 +0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; +0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 +0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; +0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 +0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; +0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 +047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; +047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A +047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; +047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C +047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; +047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E +0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; +0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 +0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; +0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; +0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; +0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; +0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; +0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; +0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; +048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A +048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; +048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C +048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; +048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E +0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; +0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 +0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; +0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 +0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; +0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 +0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; +0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 +0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; +0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 +049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; +049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A +049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; +049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C +049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; +049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E +04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; +04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 +04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; +04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 +04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; +04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 +04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7; +04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6 +04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; +04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 +04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; +04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA +04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; +04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC +04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; +04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE +04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; +04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 +04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; +04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 +04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5; +04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4 +04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; +04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 +04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; +04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 +04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; +04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA +04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; +04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC +04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; +04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; +04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; +04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 +04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; +04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 +04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; +04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 +04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; +04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 +04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; +04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 +04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; +04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB +04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; +04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD +04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 +04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; +04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 +04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; +04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 +04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; +04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 +04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; +04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 +04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; +04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 +04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; +04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA +04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; +04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC +04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; +04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE +04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; +04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 +04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; +04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 +04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; +04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 +04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; +04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 +04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; +04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 +04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; +04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA +04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; +04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC +04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; +04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE +04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; +04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 +04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; +04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 +04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; +04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; +04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 +04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; +04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; +04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA +04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; +04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC +04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; +04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE +0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; +0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 +0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; +0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 +0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; +0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 +0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; +0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 +0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; +0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 +050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; +050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A +050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; +050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C +050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; +050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E +0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; +0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 +0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; +0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 +0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; +0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 +0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; +0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 +0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; +0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 +051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; +051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A +051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; +051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C +051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; +051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E +0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; +0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 +0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; +0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 +0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525; +0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524 +0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527; +0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526 +0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529; +0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528 +052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B; +052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A +052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D; +052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C +052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F; +052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E +0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; +0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; +0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; +0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; +0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; +0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; +0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; +0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; +0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; +053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; +053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; +053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; +053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; +053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; +053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; +0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; +0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; +0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; +0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; +0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; +0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; +0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; +0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; +0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; +0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; +054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; +054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; +054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; +054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; +054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; +054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; +0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; +0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; +0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; +0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; +0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; +0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; +0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; +0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; +055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; +055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; +055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; +055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; +055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; +0560;ARMENIAN SMALL LETTER TURNED AYB;Ll;0;L;;;;;N;;;;; +0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 +0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 +0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 +0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 +0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 +0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 +0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 +0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 +0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 +056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A +056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B +056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C +056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D +056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E +056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F +0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 +0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 +0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 +0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 +0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 +0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 +0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 +0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 +0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 +0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 +057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A +057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B +057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C +057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D +057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E +057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F +0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 +0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 +0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 +0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 +0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 +0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 +0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 +0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L; 0565 0582;;;;N;;;;; +0588;ARMENIAN SMALL LETTER YI WITH STROKE;Ll;0;L;;;;;N;;;;; +0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; +058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; +058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;; +0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; +0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; +0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; +0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; +0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; +0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;; +0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; +0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;; +0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; +059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; +059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; +059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; +059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; +059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; +059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; +05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; +05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; +05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; +05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; +05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;; +05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; +05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; +05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;; +05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; +05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;; +05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; +05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; +05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; +05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; +05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; +05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; +05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; +05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; +05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; +05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; +05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; +05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; +05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; +05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; +05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; +05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; +05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;; +05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;; +05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; +05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; +05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;; +05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; +05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; +05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;; +05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; +05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; +05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; +05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; +05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; +05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; +05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; +05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; +05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; +05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; +05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; +05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; +05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; +05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; +05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; +05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; +05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; +05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; +05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; +05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; +05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; +05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; +05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; +05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; +05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; +05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; +05EF;HEBREW YOD TRIANGLE;Lo;0;R;;;;;N;;;;; +05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; +05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; +05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; +05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; +05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; +0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; +0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; +0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; +0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; +0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;; +0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; +0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; +0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; +0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; +060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; +060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; +060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; +060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; +0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; +0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; +0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; +0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; +0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; +0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; +0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; +0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; +061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; +061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;; +061D;ARABIC END OF TEXT MARK;Po;0;AL;;;;;N;;;;; +061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; +061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; +0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;; +0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; +0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; +0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; +0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; +0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; +0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; +0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; +0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; +0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; +062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; +062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; +062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; +062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; +062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; +062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; +0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; +0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; +0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; +0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; +0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; +0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; +0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; +0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; +0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; +063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; +0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; +0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; +0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; +0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; +0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; +0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; +0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; +0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; +064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; +064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; +064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; +064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; +064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; +064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; +0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; +0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; +0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; +0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; +0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; +0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; +0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; +0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; +065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; +065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; +065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; +066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; +066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; +066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; +066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; +066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; +0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; +0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; +0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; +0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; +0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; +0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL; 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; +0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL; 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; +0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL; 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; +0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL; 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; +0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; +067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; +067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; +067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; +067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; +067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; +067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; +0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; +0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; +0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; +0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; +0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; +0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; +0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; +0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; +0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; +0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; +068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; +068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; +068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; +068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; +0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; +0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; +0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; +0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; +0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; +0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; +0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; +0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; +0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; +069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; +06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; +06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; +06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; +06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; +06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; +06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; +06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; +06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; +06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; +06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; +06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; +06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;; +06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; +06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; +06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; +06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; +06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; +06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; +06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; +06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; +06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; +06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; +06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; +06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; +06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; +06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; +06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; +06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; +06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; +06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; +06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; +06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; +06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; +06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; +06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;; +06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; +06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; +06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; +06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; +06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; +06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; +06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; +06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; +06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; +06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; +06DE;ARABIC START OF RUB EL HIZB;So;0;ON;;;;;N;;;;; +06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; +06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; +06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; +06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; +06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; +06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; +06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; +06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; +06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; +06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; +06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; +06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; +06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; +06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; +06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; +06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; +06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; +06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; +06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; +06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; +06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; +06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; +06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; +06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; +06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; +06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; +06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; +06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; +0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; +0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; +0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; +0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; +070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; +070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; +070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; +070F;SYRIAC ABBREVIATION MARK;Cf;0;AL;;;;;N;;;;; +0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; +0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; +0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; +0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; +0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; +0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; +0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; +0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; +0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; +071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; +071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; +071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; +071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; +071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; +0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; +0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; +0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; +0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; +0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; +0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; +0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; +0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; +0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; +0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; +072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; +072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; +072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; +072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; +072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; +072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;; +0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; +0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; +0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; +0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; +0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; +073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; +073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; +073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; +073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; +0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; +0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; +0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; +0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; +0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; +074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; +074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; +074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; +074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; +0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; +0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; +075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; +075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; +0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; +076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; +076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; +076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; +077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; +0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; +0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; +0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; +0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; +0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; +0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; +0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; +0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; +0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; +078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; +078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; +078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; +078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; +078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; +078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; +0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; +0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; +0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; +0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; +0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; +0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; +0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; +0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; +0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; +0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; +079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; +079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; +079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; +079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; +079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; +079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; +07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; +07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; +07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; +07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; +07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; +07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; +07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; +07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; +07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; +07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; +07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; +07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; +07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; +07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; +07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; +07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; +07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; +07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; +07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; +07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; +07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; +07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; +07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; +07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; +07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; +07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; +07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; +07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; +07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; +07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; +07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; +07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; +07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; +07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; +07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; +07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; +07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; +07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; +07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; +07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; +07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; +07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; +07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; +07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; +07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; +07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; +07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; +07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; +07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; +07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; +07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; +07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; +07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; +07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; +07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; +07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; +07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; +07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; +07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; +07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; +07FD;NKO DANTAYALAN;Mn;220;NSM;;;;;N;;;;; +07FE;NKO DOROME SIGN;Sc;0;R;;;;;N;;;;; +07FF;NKO TAMAN SIGN;Sc;0;R;;;;;N;;;;; +0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;; +0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;; +0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;; +0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;; +0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;; +0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;; +0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;; +0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;; +0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;; +0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;; +080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;; +080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;; +080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;; +080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;; +080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;; +080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;; +0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;; +0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;; +0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;; +0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;; +0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;; +0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;; +0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;; +0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;; +0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;; +0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;; +081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;; +081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;; +081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;; +081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; +081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;; +081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;; +0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;; +0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;; +0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;; +0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;; +0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;; +0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;; +0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;; +0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;; +0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;; +0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;; +082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;; +082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;; +082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;; +0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;; +0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;; +0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;; +0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;; +0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;; +0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;; +0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;; +0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;; +0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;; +0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;; +083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;; +083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;; +083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;; +083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;; +083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;; +0840;MANDAIC LETTER HALQA;Lo;0;R;;;;;N;;;;; +0841;MANDAIC LETTER AB;Lo;0;R;;;;;N;;;;; +0842;MANDAIC LETTER AG;Lo;0;R;;;;;N;;;;; +0843;MANDAIC LETTER AD;Lo;0;R;;;;;N;;;;; +0844;MANDAIC LETTER AH;Lo;0;R;;;;;N;;;;; +0845;MANDAIC LETTER USHENNA;Lo;0;R;;;;;N;;;;; +0846;MANDAIC LETTER AZ;Lo;0;R;;;;;N;;;;; +0847;MANDAIC LETTER IT;Lo;0;R;;;;;N;;;;; +0848;MANDAIC LETTER ATT;Lo;0;R;;;;;N;;;;; +0849;MANDAIC LETTER AKSA;Lo;0;R;;;;;N;;;;; +084A;MANDAIC LETTER AK;Lo;0;R;;;;;N;;;;; +084B;MANDAIC LETTER AL;Lo;0;R;;;;;N;;;;; +084C;MANDAIC LETTER AM;Lo;0;R;;;;;N;;;;; +084D;MANDAIC LETTER AN;Lo;0;R;;;;;N;;;;; +084E;MANDAIC LETTER AS;Lo;0;R;;;;;N;;;;; +084F;MANDAIC LETTER IN;Lo;0;R;;;;;N;;;;; +0850;MANDAIC LETTER AP;Lo;0;R;;;;;N;;;;; +0851;MANDAIC LETTER ASZ;Lo;0;R;;;;;N;;;;; +0852;MANDAIC LETTER AQ;Lo;0;R;;;;;N;;;;; +0853;MANDAIC LETTER AR;Lo;0;R;;;;;N;;;;; +0854;MANDAIC LETTER ASH;Lo;0;R;;;;;N;;;;; +0855;MANDAIC LETTER AT;Lo;0;R;;;;;N;;;;; +0856;MANDAIC LETTER DUSHENNA;Lo;0;R;;;;;N;;;;; +0857;MANDAIC LETTER KAD;Lo;0;R;;;;;N;;;;; +0858;MANDAIC LETTER AIN;Lo;0;R;;;;;N;;;;; +0859;MANDAIC AFFRICATION MARK;Mn;220;NSM;;;;;N;;;;; +085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;; +085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;; +0860;SYRIAC LETTER MALAYALAM NGA;Lo;0;AL;;;;;N;;;;; +0861;SYRIAC LETTER MALAYALAM JA;Lo;0;AL;;;;;N;;;;; +0862;SYRIAC LETTER MALAYALAM NYA;Lo;0;AL;;;;;N;;;;; +0863;SYRIAC LETTER MALAYALAM TTA;Lo;0;AL;;;;;N;;;;; +0864;SYRIAC LETTER MALAYALAM NNA;Lo;0;AL;;;;;N;;;;; +0865;SYRIAC LETTER MALAYALAM NNNA;Lo;0;AL;;;;;N;;;;; +0866;SYRIAC LETTER MALAYALAM BHA;Lo;0;AL;;;;;N;;;;; +0867;SYRIAC LETTER MALAYALAM RA;Lo;0;AL;;;;;N;;;;; +0868;SYRIAC LETTER MALAYALAM LLA;Lo;0;AL;;;;;N;;;;; +0869;SYRIAC LETTER MALAYALAM LLLA;Lo;0;AL;;;;;N;;;;; +086A;SYRIAC LETTER MALAYALAM SSA;Lo;0;AL;;;;;N;;;;; +0870;ARABIC LETTER ALEF WITH ATTACHED FATHA;Lo;0;AL;;;;;N;;;;; +0871;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA;Lo;0;AL;;;;;N;;;;; +0872;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE;Lo;0;AL;;;;;N;;;;; +0873;ARABIC LETTER ALEF WITH LEFT MIDDLE STROKE;Lo;0;AL;;;;;N;;;;; +0874;ARABIC LETTER ALEF WITH ATTACHED KASRA;Lo;0;AL;;;;;N;;;;; +0875;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA;Lo;0;AL;;;;;N;;;;; +0876;ARABIC LETTER ALEF WITH ATTACHED ROUND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0877;ARABIC LETTER ALEF WITH ATTACHED RIGHT ROUND DOT;Lo;0;AL;;;;;N;;;;; +0878;ARABIC LETTER ALEF WITH ATTACHED LEFT ROUND DOT;Lo;0;AL;;;;;N;;;;; +0879;ARABIC LETTER ALEF WITH ATTACHED ROUND DOT BELOW;Lo;0;AL;;;;;N;;;;; +087A;ARABIC LETTER ALEF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087B;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087C;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087D;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087E;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA AND LEFT RING;Lo;0;AL;;;;;N;;;;; +087F;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE AND LEFT RING;Lo;0;AL;;;;;N;;;;; +0880;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA AND LEFT RING;Lo;0;AL;;;;;N;;;;; +0881;ARABIC LETTER ALEF WITH ATTACHED RIGHT HAMZA;Lo;0;AL;;;;;N;;;;; +0882;ARABIC LETTER ALEF WITH ATTACHED LEFT HAMZA;Lo;0;AL;;;;;N;;;;; +0883;ARABIC TATWEEL WITH OVERSTRUCK HAMZA;Lo;0;AL;;;;;N;;;;; +0884;ARABIC TATWEEL WITH OVERSTRUCK WAW;Lo;0;AL;;;;;N;;;;; +0885;ARABIC TATWEEL WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0886;ARABIC LETTER THIN YEH;Lo;0;AL;;;;;N;;;;; +0887;ARABIC BASELINE ROUND DOT;Lo;0;AL;;;;;N;;;;; +0888;ARABIC RAISED ROUND DOT;Sk;0;AL;;;;;N;;;;; +0889;ARABIC LETTER NOON WITH INVERTED SMALL V;Lo;0;AL;;;;;N;;;;; +088A;ARABIC LETTER HAH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +088B;ARABIC LETTER TAH WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +088C;ARABIC LETTER TAH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +088D;ARABIC LETTER KEHEH WITH TWO DOTS VERTICALLY BELOW;Lo;0;AL;;;;;N;;;;; +088E;ARABIC VERTICAL TAIL;Lo;0;AL;;;;;N;;;;; +088F;ARABIC LETTER NOON WITH RING ABOVE;Lo;0;AL;;;;;N;;;;; +0890;ARABIC POUND MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0891;ARABIC PIASTRE MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0897;ARABIC PEPET;Mn;230;NSM;;;;;N;;;;; +0898;ARABIC SMALL HIGH WORD AL-JUZ;Mn;230;NSM;;;;;N;;;;; +0899;ARABIC SMALL LOW WORD ISHMAAM;Mn;220;NSM;;;;;N;;;;; +089A;ARABIC SMALL LOW WORD IMAALA;Mn;220;NSM;;;;;N;;;;; +089B;ARABIC SMALL LOW WORD TASHEEL;Mn;220;NSM;;;;;N;;;;; +089C;ARABIC MADDA WAAJIB;Mn;230;NSM;;;;;N;;;;; +089D;ARABIC SUPERSCRIPT ALEF MOKHASSAS;Mn;230;NSM;;;;;N;;;;; +089E;ARABIC DOUBLED MADDA;Mn;230;NSM;;;;;N;;;;; +089F;ARABIC HALF MADDA OVER MADDA;Mn;230;NSM;;;;;N;;;;; +08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A3;ARABIC LETTER TAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A4;ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A5;ARABIC LETTER QAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08A6;ARABIC LETTER LAM WITH DOUBLE BAR;Lo;0;AL;;;;;N;;;;; +08A7;ARABIC LETTER MEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A8;ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A9;ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +08AA;ARABIC LETTER REH WITH LOOP;Lo;0;AL;;;;;N;;;;; +08AB;ARABIC LETTER WAW WITH DOT WITHIN;Lo;0;AL;;;;;N;;;;; +08AC;ARABIC LETTER ROHINGYA YEH;Lo;0;AL;;;;;N;;;;; +08AD;ARABIC LETTER LOW ALEF;Lo;0;AL;;;;;N;;;;; +08AE;ARABIC LETTER DAL WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08AF;ARABIC LETTER SAD WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; +08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; +08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; +08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08B5;ARABIC LETTER QAF WITH DOT BELOW AND NO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08B6;ARABIC LETTER BEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;; +08B7;ARABIC LETTER PEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;; +08B8;ARABIC LETTER TEH WITH SMALL TEH ABOVE;Lo;0;AL;;;;;N;;;;; +08B9;ARABIC LETTER REH WITH SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;; +08BA;ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;; +08BB;ARABIC LETTER AFRICAN FEH;Lo;0;AL;;;;;N;;;;; +08BC;ARABIC LETTER AFRICAN QAF;Lo;0;AL;;;;;N;;;;; +08BD;ARABIC LETTER AFRICAN NOON;Lo;0;AL;;;;;N;;;;; +08BE;ARABIC LETTER PEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08BF;ARABIC LETTER TEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C0;ARABIC LETTER TTEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C1;ARABIC LETTER TCHEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C2;ARABIC LETTER KEHEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C3;ARABIC LETTER GHAIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08C4;ARABIC LETTER AFRICAN QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08C5;ARABIC LETTER JEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08C6;ARABIC LETTER JEEM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08C7;ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +08C8;ARABIC LETTER GRAF;Lo;0;AL;;;;;N;;;;; +08C9;ARABIC SMALL FARSI YEH;Lm;0;AL;;;;;N;;;;; +08CA;ARABIC SMALL HIGH FARSI YEH;Mn;230;NSM;;;;;N;;;;; +08CB;ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW;Mn;230;NSM;;;;;N;;;;; +08CC;ARABIC SMALL HIGH WORD SAH;Mn;230;NSM;;;;;N;;;;; +08CD;ARABIC SMALL HIGH ZAH;Mn;230;NSM;;;;;N;;;;; +08CE;ARABIC LARGE ROUND DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08CF;ARABIC LARGE ROUND DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08D0;ARABIC SUKUN BELOW;Mn;220;NSM;;;;;N;;;;; +08D1;ARABIC LARGE CIRCLE BELOW;Mn;220;NSM;;;;;N;;;;; +08D2;ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW;Mn;220;NSM;;;;;N;;;;; +08D3;ARABIC SMALL LOW WAW;Mn;220;NSM;;;;;N;;;;; +08D4;ARABIC SMALL HIGH WORD AR-RUB;Mn;230;NSM;;;;;N;;;;; +08D5;ARABIC SMALL HIGH SAD;Mn;230;NSM;;;;;N;;;;; +08D6;ARABIC SMALL HIGH AIN;Mn;230;NSM;;;;;N;;;;; +08D7;ARABIC SMALL HIGH QAF;Mn;230;NSM;;;;;N;;;;; +08D8;ARABIC SMALL HIGH NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;; +08D9;ARABIC SMALL LOW NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;; +08DA;ARABIC SMALL HIGH WORD ATH-THALATHA;Mn;230;NSM;;;;;N;;;;; +08DB;ARABIC SMALL HIGH WORD AS-SAJDA;Mn;230;NSM;;;;;N;;;;; +08DC;ARABIC SMALL HIGH WORD AN-NISF;Mn;230;NSM;;;;;N;;;;; +08DD;ARABIC SMALL HIGH WORD SAKTA;Mn;230;NSM;;;;;N;;;;; +08DE;ARABIC SMALL HIGH WORD QIF;Mn;230;NSM;;;;;N;;;;; +08DF;ARABIC SMALL HIGH WORD WAQFA;Mn;230;NSM;;;;;N;;;;; +08E0;ARABIC SMALL HIGH FOOTNOTE MARKER;Mn;230;NSM;;;;;N;;;;; +08E1;ARABIC SMALL HIGH SIGN SAFHA;Mn;230;NSM;;;;;N;;;;; +08E2;ARABIC DISPUTED END OF AYAH;Cf;0;AN;;;;;N;;;;; +08E3;ARABIC TURNED DAMMA BELOW;Mn;220;NSM;;;;;N;;;;; +08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; +08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; +08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; +08E7;ARABIC CURLY FATHATAN;Mn;230;NSM;;;;;N;;;;; +08E8;ARABIC CURLY DAMMATAN;Mn;230;NSM;;;;;N;;;;; +08E9;ARABIC CURLY KASRATAN;Mn;220;NSM;;;;;N;;;;; +08EA;ARABIC TONE ONE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08EB;ARABIC TONE TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +08EC;ARABIC TONE LOOP ABOVE;Mn;230;NSM;;;;;N;;;;; +08ED;ARABIC TONE ONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08EE;ARABIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +08EF;ARABIC TONE LOOP BELOW;Mn;220;NSM;;;;;N;;;;; +08F0;ARABIC OPEN FATHATAN;Mn;27;NSM;;;;;N;;;;; +08F1;ARABIC OPEN DAMMATAN;Mn;28;NSM;;;;;N;;;;; +08F2;ARABIC OPEN KASRATAN;Mn;29;NSM;;;;;N;;;;; +08F3;ARABIC SMALL HIGH WAW;Mn;230;NSM;;;;;N;;;;; +08F4;ARABIC FATHA WITH RING;Mn;230;NSM;;;;;N;;;;; +08F5;ARABIC FATHA WITH DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08F6;ARABIC KASRA WITH DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08F7;ARABIC LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F8;ARABIC RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F9;ARABIC LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FA;ARABIC RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FB;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08FC;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FD;ARABIC RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FE;ARABIC DAMMA WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FF;ARABIC MARK SIDEWAYS NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;; +0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; +0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; +0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; +0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; +090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; +090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; +090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; +0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; +0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; +0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; +0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; +092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; +0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; +0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +093A;DEVANAGARI VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +093B;DEVANAGARI VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; +093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +094F;DEVANAGARI VOWEL SIGN AW;Mc;0;L;;;;;N;;;;; +0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; +0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; +0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; +0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;; +0956;DEVANAGARI VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +0957;DEVANAGARI VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; +0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; +095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; +095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; +095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; +095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; +095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; +095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; +0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; +0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; +0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; +0973;DEVANAGARI LETTER OE;Lo;0;L;;;;;N;;;;; +0974;DEVANAGARI LETTER OOE;Lo;0;L;;;;;N;;;;; +0975;DEVANAGARI LETTER AW;Lo;0;L;;;;;N;;;;; +0976;DEVANAGARI LETTER UE;Lo;0;L;;;;;N;;;;; +0977;DEVANAGARI LETTER UUE;Lo;0;L;;;;;N;;;;; +0978;DEVANAGARI LETTER MARWARI DDA;Lo;0;L;;;;;N;;;;; +0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;; +097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;; +097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; +097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; +097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; +097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; +0980;BENGALI ANJI;Lo;0;L;;;;;N;;;;; +0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; +0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; +0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; +0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; +0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; +098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; +098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; +0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; +0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; +0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; +0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; +0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; +0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; +0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; +0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; +099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; +099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; +099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; +099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; +099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; +099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; +09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; +09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; +09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; +09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; +09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; +09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; +09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; +09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; +09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; +09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; +09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; +09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; +09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; +09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; +09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; +09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; +09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; +09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; +09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; +09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; +09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; +09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; +09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; +09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; +09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; +09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; +09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; +09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;; +09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;; +09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; +09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;; +09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;; +09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;; +09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;; +09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;; +09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; +09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; +09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; +09FC;BENGALI LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +09FD;BENGALI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +09FE;BENGALI SANDHI MARK;Mn;230;NSM;;;;;N;;;;; +0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; +0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; +0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; +0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; +0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; +0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; +0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; +0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; +0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; +0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; +0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; +0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; +0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; +0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; +0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; +0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; +0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; +0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; +0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; +0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; +0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; +0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; +0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; +0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; +0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; +0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; +0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; +0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; +0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; +0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; +0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; +0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; +0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; +0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; +0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; +0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; +0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; +0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; +0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; +0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; +0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; +0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; +0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; +0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; +0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; +0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; +0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; +0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; +0A76;GURMUKHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; +0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; +0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; +0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; +0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; +0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; +0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; +0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; +0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; +0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; +0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; +0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; +0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; +0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; +0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; +0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; +0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; +0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; +0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; +0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; +0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; +0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; +0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; +0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; +0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; +0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; +0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; +0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; +0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; +0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; +0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; +0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; +0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; +0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; +0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; +0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; +0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; +0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; +0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; +0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;; +0AFA;GUJARATI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;; +0AFB;GUJARATI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +0AFC;GUJARATI SIGN MADDAH;Mn;0;NSM;;;;;N;;;;; +0AFD;GUJARATI SIGN THREE-DOT NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0AFE;GUJARATI SIGN CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0AFF;GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; +0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; +0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; +0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; +0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; +0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; +0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; +0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; +0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; +0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; +0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; +0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; +0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; +0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; +0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; +0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; +0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; +0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; +0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; +0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; +0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; +0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; +0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; +0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; +0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; +0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; +0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; +0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; +0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; +0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; +0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; +0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; +0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; +0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; +0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; +0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; +0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; +0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;; +0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; +0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; +0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; +0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; +0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; +0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; +0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; +0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0B55;ORIYA SIGN OVERLINE;Mn;0;NSM;;;;;N;;;;; +0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; +0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; +0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; +0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; +0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;; +0B72;ORIYA FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0B73;ORIYA FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0B74;ORIYA FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0B75;ORIYA FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +0B76;ORIYA FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +0B77;ORIYA FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; +0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; +0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; +0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; +0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; +0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; +0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; +0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; +0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; +0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; +0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; +0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; +0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; +0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; +0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; +0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; +0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; +0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; +0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; +0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; +0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; +0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; +0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; +0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; +0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; +0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; +0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; +0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; +0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; +0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; +0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; +0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; +0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; +0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; +0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; +0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; +0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; +0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; +0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; +0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; +0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;; +0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;; +0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;; +0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;; +0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;; +0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;; +0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;; +0C00;TELUGU SIGN COMBINING CANDRABINDU ABOVE;Mn;0;NSM;;;;;N;;;;; +0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C04;TELUGU SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; +0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; +0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; +0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; +0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; +0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; +0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; +0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; +0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; +0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; +0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; +0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; +0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; +0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; +0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; +0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; +0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; +0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; +0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; +0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; +0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; +0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; +0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; +0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; +0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; +0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; +0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; +0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; +0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; +0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; +0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; +0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; +0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; +0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; +0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; +0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; +0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; +0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; +0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; +0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; +0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; +0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; +0C34;TELUGU LETTER LLLA;Lo;0;L;;;;;N;;;;; +0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; +0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; +0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; +0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; +0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3C;TELUGU SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; +0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; +0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; +0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; +0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;; +0C5C;TELUGU ARCHAIC SHRII;Lo;0;L;;;;;N;;;;; +0C5D;TELUGU LETTER NAKAARA POLLU;Lo;0;L;;;;;N;;;;; +0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C77;TELUGU SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; +0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; +0C80;KANNADA SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; +0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C84;KANNADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; +0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; +0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; +0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; +0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; +0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; +0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; +0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; +0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; +0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; +0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; +0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; +0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; +0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; +0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; +0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; +0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; +0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; +0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; +0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; +0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; +0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; +0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; +0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; +0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; +0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; +0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; +0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; +0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; +0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; +0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; +0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; +0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; +0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; +0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; +0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; +0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; +0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; +0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; +0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; +0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; +0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; +0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; +0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; +0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; +0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;; +0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; +0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;; +0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; +0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; +0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; +0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; +0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CDC;KANNADA ARCHAIC SHRII;Lo;0;L;;;;;N;;;;; +0CDD;KANNADA LETTER NAKAARA POLLU;Lo;0;L;;;;;N;;;;; +0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; +0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +0CF3;KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT;Mc;0;L;;;;;N;;;;; +0D00;MALAYALAM SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0D04;MALAYALAM LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; +0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; +0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; +0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; +0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; +0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; +0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; +0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; +0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; +0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; +0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; +0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; +0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; +0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; +0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; +0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; +0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; +0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; +0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; +0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; +0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; +0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; +0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; +0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; +0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; +0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; +0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; +0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; +0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; +0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; +0D29;MALAYALAM LETTER NNNA;Lo;0;L;;;;;N;;;;; +0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; +0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; +0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; +0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; +0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; +0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; +0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; +0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; +0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; +0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; +0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; +0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; +0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; +0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; +0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; +0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; +0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;; +0D3B;MALAYALAM SIGN VERTICAL BAR VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D3C;MALAYALAM SIGN CIRCULAR VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; +0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; +0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; +0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; +0D4F;MALAYALAM SIGN PARA;So;0;L;;;;;N;;;;; +0D54;MALAYALAM LETTER CHILLU M;Lo;0;L;;;;;N;;;;; +0D55;MALAYALAM LETTER CHILLU Y;Lo;0;L;;;;;N;;;;; +0D56;MALAYALAM LETTER CHILLU LLL;Lo;0;L;;;;;N;;;;; +0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D58;MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;; +0D59;MALAYALAM FRACTION ONE FORTIETH;No;0;L;;;;1/40;N;;;;; +0D5A;MALAYALAM FRACTION THREE EIGHTIETHS;No;0;L;;;;3/80;N;;;;; +0D5B;MALAYALAM FRACTION ONE TWENTIETH;No;0;L;;;;1/20;N;;;;; +0D5C;MALAYALAM FRACTION ONE TENTH;No;0;L;;;;1/10;N;;;;; +0D5D;MALAYALAM FRACTION THREE TWENTIETHS;No;0;L;;;;3/20;N;;;;; +0D5E;MALAYALAM FRACTION ONE FIFTH;No;0;L;;;;1/5;N;;;;; +0D5F;MALAYALAM LETTER ARCHAIC II;Lo;0;L;;;;;N;;;;; +0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; +0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0D76;MALAYALAM FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +0D77;MALAYALAM FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +0D78;MALAYALAM FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; +0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; +0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; +0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; +0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; +0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; +0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; +0D81;SINHALA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; +0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; +0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; +0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; +0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; +0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; +0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; +0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; +0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; +0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; +0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; +0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; +0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; +0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; +0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; +0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; +0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; +0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; +0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; +0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; +0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; +0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; +0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; +0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; +0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; +0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; +0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; +0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; +0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; +0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; +0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; +0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; +0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; +0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; +0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; +0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; +0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; +0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DE6;SINHALA LITH DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0DE7;SINHALA LITH DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0DE8;SINHALA LITH DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0DE9;SINHALA LITH DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0DEA;SINHALA LITH DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0DEB;SINHALA LITH DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0DEC;SINHALA LITH DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0DED;SINHALA LITH DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0DEE;SINHALA LITH DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0DEF;SINHALA LITH DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; +0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; +0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; +0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; +0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; +0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; +0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; +0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; +0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; +0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; +0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; +0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; +0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; +0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; +0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; +0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; +0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; +0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; +0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; +0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; +0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; +0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; +0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; +0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; +0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; +0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; +0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; +0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; +0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; +0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; +0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; +0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; +0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; +0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; +0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; +0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; +0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; +0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; +0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; +0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; +0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; +0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; +0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; +0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; +0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; +0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; +0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; +0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;; +0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; +0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; +0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; +0E33;THAI CHARACTER SARA AM;Lo;0;L; 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; +0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; +0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; +0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; +0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;; +0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; +0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; +0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; +0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; +0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; +0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; +0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; +0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;; +0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;; +0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;; +0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;; +0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;; +0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; +0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; +0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; +0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; +0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; +0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;; +0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; +0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; +0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; +0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; +0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; +0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; +0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; +0E86;LAO LETTER PALI GHA;Lo;0;L;;;;;N;;;;; +0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; +0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; +0E89;LAO LETTER PALI CHA;Lo;0;L;;;;;N;;;;; +0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; +0E8C;LAO LETTER PALI JHA;Lo;0;L;;;;;N;;;;; +0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; +0E8E;LAO LETTER PALI NYA;Lo;0;L;;;;;N;;;;; +0E8F;LAO LETTER PALI TTA;Lo;0;L;;;;;N;;;;; +0E90;LAO LETTER PALI TTHA;Lo;0;L;;;;;N;;;;; +0E91;LAO LETTER PALI DDA;Lo;0;L;;;;;N;;;;; +0E92;LAO LETTER PALI DDHA;Lo;0;L;;;;;N;;;;; +0E93;LAO LETTER PALI NNA;Lo;0;L;;;;;N;;;;; +0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; +0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; +0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; +0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; +0E98;LAO LETTER PALI DHA;Lo;0;L;;;;;N;;;;; +0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; +0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; +0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; +0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; +0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; +0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; +0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; +0EA0;LAO LETTER PALI BHA;Lo;0;L;;;;;N;;;;; +0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; +0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; +0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; +0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; +0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; +0EA8;LAO LETTER SANSKRIT SHA;Lo;0;L;;;;;N;;;;; +0EA9;LAO LETTER SANSKRIT SSA;Lo;0;L;;;;;N;;;;; +0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; +0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; +0EAC;LAO LETTER PALI LLA;Lo;0;L;;;;;N;;;;; +0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; +0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; +0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; +0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; +0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; +0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +0EB3;LAO VOWEL SIGN AM;Lo;0;L; 0ECD 0EB2;;;;N;;;;; +0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; +0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; +0EBA;LAO SIGN PALI VIRAMA;Mn;9;NSM;;;;;N;;;;; +0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; +0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; +0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; +0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; +0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; +0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; +0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; +0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; +0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; +0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; +0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; +0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; +0ECE;LAO YAMAKKAN;Mn;0;NSM;;;;;N;;;;; +0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0EDC;LAO HO NO;Lo;0;L; 0EAB 0E99;;;;N;;;;; +0EDD;LAO HO MO;Lo;0;L; 0EAB 0EA1;;;;N;;;;; +0EDE;LAO LETTER KHMU GO;Lo;0;L;;;;;N;;;;; +0EDF;LAO LETTER KHMU NYO;Lo;0;L;;;;;N;;;;; +0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; +0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;; +0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;; +0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;; +0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;; +0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;; +0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;; +0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;; +0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;; +0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;; +0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;; +0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L; 0F0B;;;;N;;;;; +0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;; +0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;; +0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;; +0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;; +0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;; +0F14;TIBETAN MARK GTER TSHEG;Po;0;L;;;;;N;TIBETAN COMMA;;;; +0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;; +0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;; +0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;; +0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;; +0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;; +0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;; +0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;; +0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;; +0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;; +0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;; +0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;; +0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; +0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; +0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; +0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; +0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; +0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; +0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; +0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; +0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; +0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; +0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;; +0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;; +0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;; +0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;; +0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;; +0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;; +0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;; +0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;; +0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; +0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; +0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; +0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; +0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; +0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; +0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; +0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; +0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; +0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; +0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; +0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; +0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; +0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; +0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; +0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; +0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; +0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; +0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; +0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; +0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; +0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; +0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; +0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; +0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; +0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; +0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; +0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; +0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; +0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; +0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; +0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; +0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;; +0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; +0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; +0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; +0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; +0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; +0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; +0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; +0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;; +0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; +0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; +0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; +0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; +0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; +0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; +0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; +0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; +0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM; 0FB2 0F81;;;;N;;;;; +0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; +0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM; 0FB3 0F81;;;;N;;;;; +0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; +0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; +0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; +0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; +0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;; +0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;; +0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; +0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; +0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;; +0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;; +0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; +0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; +0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;; +0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;; +0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;; +0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;; +0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;; +0F8C;TIBETAN SIGN INVERTED MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8D;TIBETAN SUBJOINED SIGN LCE TSA CAN;Mn;0;NSM;;;;;N;;;;; +0F8E;TIBETAN SUBJOINED SIGN MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F8F;TIBETAN SUBJOINED SIGN INVERTED MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; +0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; +0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; +0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; +0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; +0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; +0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; +0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; +0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; +0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; +0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;; +0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; +0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; +0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;; +0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;; +0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;; +0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;; +0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;; +0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; +0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; +0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;; +0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;; +0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;; +0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;; +0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;; +0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;; +0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;; +0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;; +0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;; +0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;; +0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;; +0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;; +0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; +0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;; +0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;; +0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD9;TIBETAN MARK LEADING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +0FDA;TIBETAN MARK TRAILING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; +1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; +1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; +1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; +1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; +1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; +1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; +1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; +1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; +1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; +100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; +100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; +100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; +100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; +100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; +100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; +1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; +1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; +1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; +1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; +1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; +1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; +1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; +1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; +1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; +1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; +101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; +101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; +101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; +101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; +101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; +101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; +1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; +1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; +1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; +1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; +1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; +1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; +1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; +1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; +102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; +1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; +1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; +1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; +103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; +103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; +104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; +104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; +104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; +104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; +104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; +1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; +1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; +1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; +105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; +105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; +105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; +105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; +105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; +1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; +1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; +1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; +1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; +1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; +1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; +1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; +1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; +1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; +106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; +106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; +106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; +106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; +106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; +106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; +1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; +1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; +1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; +1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; +1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; +1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; +1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; +1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; +1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; +1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; +107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; +107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; +107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; +107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; +107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; +107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; +1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; +1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; +1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; +1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; +1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; +1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; +1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; +1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; +108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; +108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; +108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; +108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; +108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; +108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; +1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;; +109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;; +109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;; +109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;; +109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; +109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25; +10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27; +10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D; +10D0;GEORGIAN LETTER AN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;1C90;;10D0 +10D1;GEORGIAN LETTER BAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;1C91;;10D1 +10D2;GEORGIAN LETTER GAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;1C92;;10D2 +10D3;GEORGIAN LETTER DON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;1C93;;10D3 +10D4;GEORGIAN LETTER EN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;1C94;;10D4 +10D5;GEORGIAN LETTER VIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;1C95;;10D5 +10D6;GEORGIAN LETTER ZEN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;1C96;;10D6 +10D7;GEORGIAN LETTER TAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;1C97;;10D7 +10D8;GEORGIAN LETTER IN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;1C98;;10D8 +10D9;GEORGIAN LETTER KAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;1C99;;10D9 +10DA;GEORGIAN LETTER LAS;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;1C9A;;10DA +10DB;GEORGIAN LETTER MAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;1C9B;;10DB +10DC;GEORGIAN LETTER NAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;1C9C;;10DC +10DD;GEORGIAN LETTER ON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;1C9D;;10DD +10DE;GEORGIAN LETTER PAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;1C9E;;10DE +10DF;GEORGIAN LETTER ZHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;1C9F;;10DF +10E0;GEORGIAN LETTER RAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;1CA0;;10E0 +10E1;GEORGIAN LETTER SAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;1CA1;;10E1 +10E2;GEORGIAN LETTER TAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;1CA2;;10E2 +10E3;GEORGIAN LETTER UN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;1CA3;;10E3 +10E4;GEORGIAN LETTER PHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;1CA4;;10E4 +10E5;GEORGIAN LETTER KHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;1CA5;;10E5 +10E6;GEORGIAN LETTER GHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;1CA6;;10E6 +10E7;GEORGIAN LETTER QAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;1CA7;;10E7 +10E8;GEORGIAN LETTER SHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;1CA8;;10E8 +10E9;GEORGIAN LETTER CHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;1CA9;;10E9 +10EA;GEORGIAN LETTER CAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;1CAA;;10EA +10EB;GEORGIAN LETTER JIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;1CAB;;10EB +10EC;GEORGIAN LETTER CIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;1CAC;;10EC +10ED;GEORGIAN LETTER CHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;1CAD;;10ED +10EE;GEORGIAN LETTER XAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;1CAE;;10EE +10EF;GEORGIAN LETTER JHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;1CAF;;10EF +10F0;GEORGIAN LETTER HAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;1CB0;;10F0 +10F1;GEORGIAN LETTER HE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;1CB1;;10F1 +10F2;GEORGIAN LETTER HIE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;1CB2;;10F2 +10F3;GEORGIAN LETTER WE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;1CB3;;10F3 +10F4;GEORGIAN LETTER HAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;1CB4;;10F4 +10F5;GEORGIAN LETTER HOE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;1CB5;;10F5 +10F6;GEORGIAN LETTER FI;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;1CB6;;10F6 +10F7;GEORGIAN LETTER YN;Ll;0;L;;;;;N;;;1CB7;;10F7 +10F8;GEORGIAN LETTER ELIFI;Ll;0;L;;;;;N;;;1CB8;;10F8 +10F9;GEORGIAN LETTER TURNED GAN;Ll;0;L;;;;;N;;;1CB9;;10F9 +10FA;GEORGIAN LETTER AIN;Ll;0;L;;;;;N;;;1CBA;;10FA +10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L; 10DC;;;;N;;;;; +10FD;GEORGIAN LETTER AEN;Ll;0;L;;;;;N;;;1CBD;;10FD +10FE;GEORGIAN LETTER HARD SIGN;Ll;0;L;;;;;N;;;1CBE;;10FE +10FF;GEORGIAN LETTER LABIAL SIGN;Ll;0;L;;;;;N;;;1CBF;;10FF +1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;; +1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;; +1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;; +1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;; +1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;; +110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; +110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;; +110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;; +1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; +1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; +1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; +112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; +112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; +112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; +1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; +1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; +113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; +113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; +113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; +1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; +1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; +1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; +1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; +114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; +114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; +114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; +114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; +114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; +1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; +1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; +1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; +1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;; +115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; +1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; +1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; +1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; +1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; +1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; +1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; +1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; +1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; +1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; +1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; +116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; +116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; +116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; +116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; +116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; +116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; +1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; +1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; +1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; +1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; +1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; +1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; +1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; +1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; +1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; +1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; +117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; +117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; +117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; +117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; +117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; +117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; +1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; +1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; +1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; +1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; +1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; +1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; +1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; +1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; +1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; +1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; +118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; +118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; +118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; +118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; +118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; +118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; +1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; +1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; +1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; +1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; +1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; +1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; +1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; +1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; +1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; +1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; +119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; +119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; +119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; +119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; +119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; +119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; +11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; +11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; +11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; +11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;; +11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;; +11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;; +11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;; +11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;; +11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;; +11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;; +11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;; +11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;; +11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;; +11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;; +11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;; +11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;; +11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;; +11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; +11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; +11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; +11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; +11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; +11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; +11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; +11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; +11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; +11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; +11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; +11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; +11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; +11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; +11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; +11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;; +11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;; +11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;; +11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;; +11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; +1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; +1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; +1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; +1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; +1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; +1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; +1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; +120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; +120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; +120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; +120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; +120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; +1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; +1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; +1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; +1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; +1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; +1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; +1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; +1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; +1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; +1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; +121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; +121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; +121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; +121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; +121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; +1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; +1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; +1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; +1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; +1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; +1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; +1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; +1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; +1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; +1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; +122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; +122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; +122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; +122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; +122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; +122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; +1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; +1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; +1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; +1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; +1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; +1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; +1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; +1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; +123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; +1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; +1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; +1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; +1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; +1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; +1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; +1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; +1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; +124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; +124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; +124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; +124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; +1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; +1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; +1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; +1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; +1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; +1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; +1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; +1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; +125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; +125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; +125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; +125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; +1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; +1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; +1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; +1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; +1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; +1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; +1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; +1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; +1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; +126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; +126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; +126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; +126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; +126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; +1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; +1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; +1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; +1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; +1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; +1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; +1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; +1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; +1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; +127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; +127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; +127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; +127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; +127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; +1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; +1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; +1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; +1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; +1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; +1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; +1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; +1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; +128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; +128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; +128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; +128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; +1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; +1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; +1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; +1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; +1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; +1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; +1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; +1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; +129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; +12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; +12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; +12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; +12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; +12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; +12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; +12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; +12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; +12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; +12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; +12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; +12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; +12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; +12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; +12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; +12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; +12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; +12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; +12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; +12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; +12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; +12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; +12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; +12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; +12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; +12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; +12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; +12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; +12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; +12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; +12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; +12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; +12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; +12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; +12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; +12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; +12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; +12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; +12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; +12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; +12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; +12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; +12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; +12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; +12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; +12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; +12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; +12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; +12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; +12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; +12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; +12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; +12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; +12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; +12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; +12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; +12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; +12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; +12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; +12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; +12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; +12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; +12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; +12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; +1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; +1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; +1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; +1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; +1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; +1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; +1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; +1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; +1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; +130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; +130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; +130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; +130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; +1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; +1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; +1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; +1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; +1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; +1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; +131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; +131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; +1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; +1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; +1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; +1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; +1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; +1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; +1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; +1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; +132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; +132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; +132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; +1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; +1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; +1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; +1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; +1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; +1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; +1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; +1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; +1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; +1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; +133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; +133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; +133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; +133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; +133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; +133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; +1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; +1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; +1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; +1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; +1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; +1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; +1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; +1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; +1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; +134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; +134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; +134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; +134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; +134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; +1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; +1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; +1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; +1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; +1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; +1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; +1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; +1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; +1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; +135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +135D;ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135E;ETHIOPIC COMBINING VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1360;ETHIOPIC SECTION MARK;Po;0;L;;;;;N;;;;; +1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; +1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; +1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; +1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; +1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; +1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; +1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; +1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; +1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; +1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; +137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; +1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; +1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; +1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; +1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; +1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; +1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; +1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; +1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; +1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; +138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; +138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; +138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; +138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; +138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; +138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; +1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; +1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; +1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; +1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; +1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; +1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; +1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; +1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; +1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; +1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; +13A0;CHEROKEE LETTER A;Lu;0;L;;;;;N;;;;AB70; +13A1;CHEROKEE LETTER E;Lu;0;L;;;;;N;;;;AB71; +13A2;CHEROKEE LETTER I;Lu;0;L;;;;;N;;;;AB72; +13A3;CHEROKEE LETTER O;Lu;0;L;;;;;N;;;;AB73; +13A4;CHEROKEE LETTER U;Lu;0;L;;;;;N;;;;AB74; +13A5;CHEROKEE LETTER V;Lu;0;L;;;;;N;;;;AB75; +13A6;CHEROKEE LETTER GA;Lu;0;L;;;;;N;;;;AB76; +13A7;CHEROKEE LETTER KA;Lu;0;L;;;;;N;;;;AB77; +13A8;CHEROKEE LETTER GE;Lu;0;L;;;;;N;;;;AB78; +13A9;CHEROKEE LETTER GI;Lu;0;L;;;;;N;;;;AB79; +13AA;CHEROKEE LETTER GO;Lu;0;L;;;;;N;;;;AB7A; +13AB;CHEROKEE LETTER GU;Lu;0;L;;;;;N;;;;AB7B; +13AC;CHEROKEE LETTER GV;Lu;0;L;;;;;N;;;;AB7C; +13AD;CHEROKEE LETTER HA;Lu;0;L;;;;;N;;;;AB7D; +13AE;CHEROKEE LETTER HE;Lu;0;L;;;;;N;;;;AB7E; +13AF;CHEROKEE LETTER HI;Lu;0;L;;;;;N;;;;AB7F; +13B0;CHEROKEE LETTER HO;Lu;0;L;;;;;N;;;;AB80; +13B1;CHEROKEE LETTER HU;Lu;0;L;;;;;N;;;;AB81; +13B2;CHEROKEE LETTER HV;Lu;0;L;;;;;N;;;;AB82; +13B3;CHEROKEE LETTER LA;Lu;0;L;;;;;N;;;;AB83; +13B4;CHEROKEE LETTER LE;Lu;0;L;;;;;N;;;;AB84; +13B5;CHEROKEE LETTER LI;Lu;0;L;;;;;N;;;;AB85; +13B6;CHEROKEE LETTER LO;Lu;0;L;;;;;N;;;;AB86; +13B7;CHEROKEE LETTER LU;Lu;0;L;;;;;N;;;;AB87; +13B8;CHEROKEE LETTER LV;Lu;0;L;;;;;N;;;;AB88; +13B9;CHEROKEE LETTER MA;Lu;0;L;;;;;N;;;;AB89; +13BA;CHEROKEE LETTER ME;Lu;0;L;;;;;N;;;;AB8A; +13BB;CHEROKEE LETTER MI;Lu;0;L;;;;;N;;;;AB8B; +13BC;CHEROKEE LETTER MO;Lu;0;L;;;;;N;;;;AB8C; +13BD;CHEROKEE LETTER MU;Lu;0;L;;;;;N;;;;AB8D; +13BE;CHEROKEE LETTER NA;Lu;0;L;;;;;N;;;;AB8E; +13BF;CHEROKEE LETTER HNA;Lu;0;L;;;;;N;;;;AB8F; +13C0;CHEROKEE LETTER NAH;Lu;0;L;;;;;N;;;;AB90; +13C1;CHEROKEE LETTER NE;Lu;0;L;;;;;N;;;;AB91; +13C2;CHEROKEE LETTER NI;Lu;0;L;;;;;N;;;;AB92; +13C3;CHEROKEE LETTER NO;Lu;0;L;;;;;N;;;;AB93; +13C4;CHEROKEE LETTER NU;Lu;0;L;;;;;N;;;;AB94; +13C5;CHEROKEE LETTER NV;Lu;0;L;;;;;N;;;;AB95; +13C6;CHEROKEE LETTER QUA;Lu;0;L;;;;;N;;;;AB96; +13C7;CHEROKEE LETTER QUE;Lu;0;L;;;;;N;;;;AB97; +13C8;CHEROKEE LETTER QUI;Lu;0;L;;;;;N;;;;AB98; +13C9;CHEROKEE LETTER QUO;Lu;0;L;;;;;N;;;;AB99; +13CA;CHEROKEE LETTER QUU;Lu;0;L;;;;;N;;;;AB9A; +13CB;CHEROKEE LETTER QUV;Lu;0;L;;;;;N;;;;AB9B; +13CC;CHEROKEE LETTER SA;Lu;0;L;;;;;N;;;;AB9C; +13CD;CHEROKEE LETTER S;Lu;0;L;;;;;N;;;;AB9D; +13CE;CHEROKEE LETTER SE;Lu;0;L;;;;;N;;;;AB9E; +13CF;CHEROKEE LETTER SI;Lu;0;L;;;;;N;;;;AB9F; +13D0;CHEROKEE LETTER SO;Lu;0;L;;;;;N;;;;ABA0; +13D1;CHEROKEE LETTER SU;Lu;0;L;;;;;N;;;;ABA1; +13D2;CHEROKEE LETTER SV;Lu;0;L;;;;;N;;;;ABA2; +13D3;CHEROKEE LETTER DA;Lu;0;L;;;;;N;;;;ABA3; +13D4;CHEROKEE LETTER TA;Lu;0;L;;;;;N;;;;ABA4; +13D5;CHEROKEE LETTER DE;Lu;0;L;;;;;N;;;;ABA5; +13D6;CHEROKEE LETTER TE;Lu;0;L;;;;;N;;;;ABA6; +13D7;CHEROKEE LETTER DI;Lu;0;L;;;;;N;;;;ABA7; +13D8;CHEROKEE LETTER TI;Lu;0;L;;;;;N;;;;ABA8; +13D9;CHEROKEE LETTER DO;Lu;0;L;;;;;N;;;;ABA9; +13DA;CHEROKEE LETTER DU;Lu;0;L;;;;;N;;;;ABAA; +13DB;CHEROKEE LETTER DV;Lu;0;L;;;;;N;;;;ABAB; +13DC;CHEROKEE LETTER DLA;Lu;0;L;;;;;N;;;;ABAC; +13DD;CHEROKEE LETTER TLA;Lu;0;L;;;;;N;;;;ABAD; +13DE;CHEROKEE LETTER TLE;Lu;0;L;;;;;N;;;;ABAE; +13DF;CHEROKEE LETTER TLI;Lu;0;L;;;;;N;;;;ABAF; +13E0;CHEROKEE LETTER TLO;Lu;0;L;;;;;N;;;;ABB0; +13E1;CHEROKEE LETTER TLU;Lu;0;L;;;;;N;;;;ABB1; +13E2;CHEROKEE LETTER TLV;Lu;0;L;;;;;N;;;;ABB2; +13E3;CHEROKEE LETTER TSA;Lu;0;L;;;;;N;;;;ABB3; +13E4;CHEROKEE LETTER TSE;Lu;0;L;;;;;N;;;;ABB4; +13E5;CHEROKEE LETTER TSI;Lu;0;L;;;;;N;;;;ABB5; +13E6;CHEROKEE LETTER TSO;Lu;0;L;;;;;N;;;;ABB6; +13E7;CHEROKEE LETTER TSU;Lu;0;L;;;;;N;;;;ABB7; +13E8;CHEROKEE LETTER TSV;Lu;0;L;;;;;N;;;;ABB8; +13E9;CHEROKEE LETTER WA;Lu;0;L;;;;;N;;;;ABB9; +13EA;CHEROKEE LETTER WE;Lu;0;L;;;;;N;;;;ABBA; +13EB;CHEROKEE LETTER WI;Lu;0;L;;;;;N;;;;ABBB; +13EC;CHEROKEE LETTER WO;Lu;0;L;;;;;N;;;;ABBC; +13ED;CHEROKEE LETTER WU;Lu;0;L;;;;;N;;;;ABBD; +13EE;CHEROKEE LETTER WV;Lu;0;L;;;;;N;;;;ABBE; +13EF;CHEROKEE LETTER YA;Lu;0;L;;;;;N;;;;ABBF; +13F0;CHEROKEE LETTER YE;Lu;0;L;;;;;N;;;;13F8; +13F1;CHEROKEE LETTER YI;Lu;0;L;;;;;N;;;;13F9; +13F2;CHEROKEE LETTER YO;Lu;0;L;;;;;N;;;;13FA; +13F3;CHEROKEE LETTER YU;Lu;0;L;;;;;N;;;;13FB; +13F4;CHEROKEE LETTER YV;Lu;0;L;;;;;N;;;;13FC; +13F5;CHEROKEE LETTER MV;Lu;0;L;;;;;N;;;;13FD; +13F8;CHEROKEE SMALL LETTER YE;Ll;0;L;;;;;N;;;13F0;;13F0 +13F9;CHEROKEE SMALL LETTER YI;Ll;0;L;;;;;N;;;13F1;;13F1 +13FA;CHEROKEE SMALL LETTER YO;Ll;0;L;;;;;N;;;13F2;;13F2 +13FB;CHEROKEE SMALL LETTER YU;Ll;0;L;;;;;N;;;13F3;;13F3 +13FC;CHEROKEE SMALL LETTER YV;Ll;0;L;;;;;N;;;13F4;;13F4 +13FD;CHEROKEE SMALL LETTER MV;Ll;0;L;;;;;N;;;13F5;;13F5 +1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; +1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; +1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; +1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; +1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; +1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; +1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; +1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; +1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; +1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; +140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; +140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; +140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; +140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; +140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; +140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; +1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; +1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; +1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; +1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; +1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; +1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; +1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; +1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; +1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; +1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; +141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; +141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; +141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; +141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; +141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; +1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; +1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; +1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; +1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; +1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; +1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; +1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; +1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; +1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; +1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; +142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; +142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; +142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; +142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; +142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; +142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; +1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; +1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; +1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; +1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; +1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; +1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; +1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; +1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; +1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; +1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; +143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; +143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; +143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; +143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; +143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; +143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; +1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; +1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; +1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; +1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; +1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; +1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; +1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; +1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; +1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; +1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; +144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; +144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; +144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; +144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; +144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; +144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; +1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; +1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; +1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; +1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; +1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; +1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; +1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; +1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; +1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; +1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; +145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; +145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; +145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; +145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; +145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; +145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; +1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; +1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; +1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; +1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; +1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; +1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; +1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; +1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; +1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; +1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; +146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; +146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; +146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; +146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; +146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; +146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; +1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; +1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; +1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; +1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; +1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; +1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; +1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; +1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; +1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; +1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; +147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; +147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; +147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; +147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; +147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; +147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; +1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; +1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; +1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; +1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; +1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; +1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; +1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; +1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; +1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; +1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; +148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; +148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; +148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; +148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; +148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; +148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; +1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; +1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; +1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; +1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; +1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; +1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; +1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; +1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; +1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; +1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; +149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; +149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; +149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; +149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; +149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; +149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; +14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; +14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; +14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; +14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; +14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; +14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; +14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; +14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; +14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; +14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; +14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; +14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; +14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; +14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; +14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; +14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; +14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; +14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; +14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; +14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; +14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; +14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; +14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; +14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; +14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; +14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; +14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; +14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; +14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; +14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; +14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; +14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; +14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; +14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; +14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; +14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; +14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; +14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; +14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; +14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; +14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; +14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; +14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; +14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; +14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; +14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; +14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; +14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; +14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; +14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; +14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; +14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; +14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; +14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; +14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; +14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; +14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; +14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; +14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; +14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; +14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; +14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; +14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; +14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; +14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; +14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; +14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; +14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; +14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; +14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; +14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; +14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; +14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; +14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; +14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; +14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; +14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; +14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; +14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; +14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; +14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; +14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; +14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; +14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; +14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; +14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; +14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; +14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; +14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; +14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; +14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; +14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; +14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; +14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; +14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; +14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; +1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; +1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; +1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; +1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; +1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; +1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; +1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; +1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; +1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; +1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; +150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; +150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; +150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; +150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; +150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; +150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; +1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; +1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; +1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; +1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; +1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; +1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; +1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; +1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; +1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; +1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; +151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; +151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; +151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; +151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; +151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; +151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; +1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; +1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; +1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; +1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; +1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; +1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; +1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; +1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; +1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; +1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; +152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; +152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; +152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; +152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; +152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; +152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; +1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; +1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; +1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; +1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; +1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; +1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; +1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; +1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; +1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; +1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; +153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; +153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; +153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; +153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; +153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; +153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; +1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; +1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; +1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; +1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; +1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; +1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; +1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; +1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; +1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; +1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; +154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; +154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; +154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; +154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; +154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; +154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; +1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; +1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; +1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; +1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; +1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; +1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; +1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; +1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; +1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; +1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; +155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; +155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; +155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; +155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; +155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; +155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; +1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; +1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; +1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; +1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; +1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; +1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; +1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; +1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; +1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; +1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; +156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; +156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; +156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; +156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; +156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; +156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; +1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; +1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; +1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; +1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; +1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; +1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; +1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; +1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; +1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; +1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; +157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; +157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; +157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; +157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; +157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; +157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; +1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; +1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; +1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; +1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; +1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; +1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; +1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; +1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; +1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; +1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; +158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; +158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; +158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; +158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; +158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; +158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; +1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; +1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; +1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; +1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; +1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; +1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; +1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; +1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; +1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; +1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; +159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; +159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; +159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; +159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; +159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; +159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; +15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; +15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; +15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; +15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; +15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; +15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; +15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; +15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; +15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; +15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; +15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; +15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; +15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; +15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; +15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; +15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; +15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; +15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; +15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; +15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; +15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; +15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; +15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; +15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; +15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; +15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; +15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; +15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; +15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; +15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; +15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; +15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; +15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; +15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; +15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; +15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; +15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; +15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; +15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; +15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; +15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; +15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; +15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; +15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; +15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; +15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; +15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; +15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; +15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; +15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; +15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; +15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; +15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; +15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; +15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; +15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; +15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; +15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; +15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; +15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; +15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; +15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; +15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; +15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; +15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; +15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; +15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; +15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; +15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; +15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; +15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; +15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; +15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; +15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; +15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; +15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; +15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; +15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; +15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; +15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; +15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; +15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; +15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; +15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; +15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; +15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; +15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; +15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; +15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; +15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; +15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; +15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; +15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; +15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; +15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; +15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; +1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; +1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; +1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; +1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; +1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; +1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; +1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; +1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; +1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; +1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; +160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; +160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; +160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; +160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; +160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; +160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; +1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; +1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; +1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; +1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; +1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; +1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; +1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; +1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; +1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; +1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; +161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; +161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; +161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; +161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; +161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; +161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; +1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; +1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; +1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; +1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; +1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; +1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; +1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; +1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; +1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; +1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; +162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; +162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; +162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; +162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; +162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; +162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; +1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; +1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; +1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; +1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; +1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; +1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; +1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; +1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; +1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; +1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; +163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; +163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; +163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; +163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; +163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; +163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; +1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; +1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; +1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; +1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; +1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; +1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; +1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; +1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; +1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; +1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; +164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; +164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; +164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; +164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; +164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; +164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; +1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; +1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; +1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; +1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; +1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; +1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; +1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; +1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; +1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; +1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; +165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; +165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; +165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; +165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; +165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; +165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; +1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; +1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; +1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; +1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; +1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; +1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; +1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; +1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; +1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; +1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; +166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; +166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; +166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; +166D;CANADIAN SYLLABICS CHI SIGN;So;0;L;;;;;N;;;;; +166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; +166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; +1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; +1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; +1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; +1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; +1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; +1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; +1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; +1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;; +1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;; +1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;; +167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;; +167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;; +167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;; +167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;; +167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;; +167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;; +1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; +1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; +1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; +1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; +1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; +1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; +1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; +1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; +1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; +1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; +168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; +168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; +168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; +168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; +168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; +168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; +1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; +1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; +1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; +1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; +1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; +1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; +1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; +1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; +1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; +1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; +169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; +16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; +16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; +16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; +16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; +16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; +16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; +16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; +16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; +16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; +16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; +16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; +16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; +16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; +16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; +16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; +16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; +16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; +16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; +16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; +16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; +16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; +16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; +16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; +16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; +16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; +16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; +16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; +16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; +16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; +16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; +16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; +16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; +16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; +16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; +16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; +16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; +16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; +16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; +16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; +16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; +16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; +16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; +16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; +16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; +16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; +16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; +16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; +16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; +16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; +16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; +16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; +16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; +16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; +16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; +16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; +16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; +16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; +16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; +16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; +16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; +16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; +16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; +16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; +16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; +16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; +16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; +16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; +16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; +16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; +16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; +16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; +16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; +16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; +16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; +16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; +16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; +16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;; +16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;; +16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;; +16F1;RUNIC LETTER K;Lo;0;L;;;;;N;;;;; +16F2;RUNIC LETTER SH;Lo;0;L;;;;;N;;;;; +16F3;RUNIC LETTER OO;Lo;0;L;;;;;N;;;;; +16F4;RUNIC LETTER FRANKS CASKET OS;Lo;0;L;;;;;N;;;;; +16F5;RUNIC LETTER FRANKS CASKET IS;Lo;0;L;;;;;N;;;;; +16F6;RUNIC LETTER FRANKS CASKET EH;Lo;0;L;;;;;N;;;;; +16F7;RUNIC LETTER FRANKS CASKET AC;Lo;0;L;;;;;N;;;;; +16F8;RUNIC LETTER FRANKS CASKET AESC;Lo;0;L;;;;;N;;;;; +1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; +1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; +1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; +1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; +1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; +1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; +1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; +1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; +1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; +1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; +170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; +170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; +170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; +170D;TAGALOG LETTER RA;Lo;0;L;;;;;N;;;;; +170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; +170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; +1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; +1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; +1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1715;TAGALOG SIGN PAMUDPOD;Mc;9;L;;;;;N;;;;; +171F;TAGALOG LETTER ARCHAIC RA;Lo;0;L;;;;;N;;;;; +1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; +1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; +1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; +1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; +1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; +1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; +1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; +1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; +1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; +1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; +172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; +172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; +172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; +172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; +172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; +172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; +1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; +1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; +1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1734;HANUNOO SIGN PAMUDPOD;Mc;9;L;;;;;N;;;;; +1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; +1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; +1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; +1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; +1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; +1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; +1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; +1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; +1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; +1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; +174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; +174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; +174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; +174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; +174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; +174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; +1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; +1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; +1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; +1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; +1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; +1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; +1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; +1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; +1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; +1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; +1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; +1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; +176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; +176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; +176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; +176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; +176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; +1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; +1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; +1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; +1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; +1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; +1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; +1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; +1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; +1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; +1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; +1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; +178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; +178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; +178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; +178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; +178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; +178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; +1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; +1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; +1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; +1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; +1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; +1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; +1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; +1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; +1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; +1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; +179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; +179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; +179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; +179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; +179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; +179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; +17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; +17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; +17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; +17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; +17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; +17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; +17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; +17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; +17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; +17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; +17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; +17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; +17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; +17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; +17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; +17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; +17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; +17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; +17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; +17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; +17B4;KHMER VOWEL INHERENT AQ;Mn;0;NSM;;;;;N;;;;; +17B5;KHMER VOWEL INHERENT AA;Mn;0;NSM;;;;;N;;;;; +17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; +17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; +17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; +17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; +17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; +17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; +17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; +17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; +17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; +17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; +17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; +17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; +17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; +17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; +17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; +17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; +17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; +17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; +17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; +17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; +17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; +17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; +17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; +17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; +17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; +17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; +17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;; +17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; +17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; +17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; +17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; +17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; +17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; +17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; +17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; +17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; +17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;; +1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; +1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; +1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; +1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; +1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; +1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; +1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; +1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; +1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; +180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; +180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; +180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; +180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; +180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; +180F;MONGOLIAN FREE VARIATION SELECTOR FOUR;Mn;0;NSM;;;;;N;;;;; +1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; +1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; +1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; +1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; +1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; +1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; +1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; +1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; +1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; +1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; +182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; +182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; +182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; +182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; +182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; +182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; +1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; +1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; +1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; +1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; +1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; +1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; +1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; +1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; +183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; +183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; +183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; +183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; +183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; +183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; +1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; +1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; +1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; +1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; +1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; +1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; +1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; +1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; +1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; +184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; +184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; +184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; +184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; +184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; +184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; +1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; +1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; +1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; +1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; +1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; +1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; +1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; +1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; +1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; +1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; +185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; +185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; +185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; +185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; +185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; +185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; +1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; +1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; +1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; +1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; +1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; +1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; +1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; +1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; +1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; +1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; +186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; +186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; +186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; +186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; +186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; +186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; +1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; +1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; +1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; +1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; +1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; +1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; +1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; +1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; +1878;MONGOLIAN LETTER CHA WITH TWO DOTS;Lo;0;L;;;;;N;;;;; +1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; +1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; +1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; +1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; +1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; +1885;MONGOLIAN LETTER ALI GALI BALUDA;Mn;0;NSM;;;;;N;;;;; +1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Mn;0;NSM;;;;;N;;;;; +1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; +1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; +1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; +188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; +188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; +188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; +188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; +188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; +188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; +1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; +1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; +1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; +1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; +1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; +1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; +1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; +1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; +1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; +189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; +189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; +189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; +189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; +189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; +18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; +18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; +18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; +18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; +18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; +18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; +18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; +18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; +18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; +18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;; +18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;; +18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;; +18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;; +18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;; +18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;; +18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;; +18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;; +18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;; +18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;; +18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;; +18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;; +18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;; +18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;; +18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;; +18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;; +18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;; +18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;; +18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;; +18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;; +18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;; +18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;; +18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;; +18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;; +18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;; +18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;; +18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;; +18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;; +18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;; +18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;; +18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;; +18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;; +18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;; +18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;; +18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;; +18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;; +18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;; +18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;; +18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;; +18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;; +18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;; +18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;; +18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;; +18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;; +18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;; +18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;; +18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;; +18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;; +18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;; +18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;; +18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;; +18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;; +18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;; +18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;; +18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;; +18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;; +18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;; +18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;; +18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;; +18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;; +18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;; +18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;; +18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;; +18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;; +18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;; +18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;; +18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;; +18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;; +18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;; +18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;; +1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; +1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; +1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; +1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; +1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; +1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; +1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; +1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; +1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; +1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; +190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; +190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; +190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; +190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; +190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; +190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; +1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; +1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; +1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; +1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; +1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; +1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; +1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; +1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; +1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; +1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; +191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; +191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; +191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; +191D;LIMBU LETTER GYAN;Lo;0;L;;;;;N;;;;; +191E;LIMBU LETTER TRA;Lo;0;L;;;;;N;;;;; +1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; +1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; +1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; +1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; +1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; +1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; +1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; +1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; +1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; +1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; +193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; +193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; +1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; +1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; +1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; +1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; +1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; +1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; +1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; +1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; +1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; +1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; +1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; +1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; +195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; +195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; +195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; +195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; +195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; +195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; +1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; +1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; +1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; +1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; +1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; +1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; +1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; +1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; +1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; +1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; +196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; +196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; +196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; +196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; +1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; +1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; +1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; +1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; +1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; +1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; +1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; +1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; +1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; +1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; +1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; +1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; +1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; +198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; +198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; +198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; +1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; +1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; +1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; +199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; +199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; +199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; +199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; +199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; +19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; +19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; +19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; +19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; +19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; +19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; +19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; +19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; +19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; +19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; +19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Lo;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Lo;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Lo;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Lo;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Lo;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Lo;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Lo;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Lo;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Lo;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Lo;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Lo;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Lo;0;L;;;;;N;;;;; +19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; +19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; +19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; +19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Lo;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Lo;0;L;;;;;N;;;;; +19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +19DA;NEW TAI LUE THAM DIGIT ONE;No;0;L;;;1;1;N;;;;; +19DE;NEW TAI LUE SIGN LAE;So;0;ON;;;;;N;;;;; +19DF;NEW TAI LUE SIGN LAEV;So;0;ON;;;;;N;;;;; +19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; +19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; +19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; +19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; +19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; +19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; +19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; +19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; +19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; +19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; +19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; +19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; +19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; +19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; +19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; +19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; +19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; +19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; +19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; +19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; +19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; +19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; +19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; +19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; +19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; +19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; +19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; +19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; +19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; +19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; +19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; +19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; +1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; +1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; +1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; +1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; +1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; +1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; +1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; +1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1A1B;BUGINESE VOWEL SIGN AE;Mn;0;NSM;;;;;N;;;;; +1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; +1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; +1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;; +1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;; +1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;; +1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;; +1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;; +1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;; +1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;; +1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;; +1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;; +1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;; +1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;; +1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;; +1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;; +1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;; +1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;; +1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;; +1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;; +1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;; +1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;; +1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;; +1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;; +1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;; +1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;; +1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;; +1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;; +1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;; +1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;; +1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;; +1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;; +1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;; +1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;; +1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;; +1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;; +1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;; +1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;; +1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;; +1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;; +1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;; +1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;; +1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;; +1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;; +1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;; +1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;; +1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;; +1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;; +1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;; +1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;; +1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;; +1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;; +1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;; +1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;; +1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;; +1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;; +1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;; +1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;; +1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;; +1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;; +1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;; +1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;; +1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;; +1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;; +1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;; +1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;; +1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;; +1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;; +1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;; +1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;; +1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;; +1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;; +1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;; +1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;; +1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;; +1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;; +1AB0;COMBINING DOUBLED CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;;;;; +1AB1;COMBINING DIAERESIS-RING;Mn;230;NSM;;;;;N;;;;; +1AB2;COMBINING INFINITY;Mn;230;NSM;;;;;N;;;;; +1AB3;COMBINING DOWNWARDS ARROW;Mn;230;NSM;;;;;N;;;;; +1AB4;COMBINING TRIPLE DOT;Mn;230;NSM;;;;;N;;;;; +1AB5;COMBINING X-X BELOW;Mn;220;NSM;;;;;N;;;;; +1AB6;COMBINING WIGGLY LINE BELOW;Mn;220;NSM;;;;;N;;;;; +1AB7;COMBINING OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB8;COMBINING DOUBLE OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB9;COMBINING LIGHT CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABA;COMBINING STRONG CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABB;COMBINING PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABC;COMBINING DOUBLE PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABD;COMBINING PARENTHESES BELOW;Mn;220;NSM;;;;;N;;;;; +1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;; +1ABF;COMBINING LATIN SMALL LETTER W BELOW;Mn;220;NSM;;;;;N;;;;; +1AC0;COMBINING LATIN SMALL LETTER TURNED W BELOW;Mn;220;NSM;;;;;N;;;;; +1AC1;COMBINING LEFT PARENTHESIS ABOVE LEFT;Mn;230;NSM;;;;;N;;;;; +1AC2;COMBINING RIGHT PARENTHESIS ABOVE RIGHT;Mn;230;NSM;;;;;N;;;;; +1AC3;COMBINING LEFT PARENTHESIS BELOW LEFT;Mn;220;NSM;;;;;N;;;;; +1AC4;COMBINING RIGHT PARENTHESIS BELOW RIGHT;Mn;220;NSM;;;;;N;;;;; +1AC5;COMBINING SQUARE BRACKETS ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC6;COMBINING NUMBER SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC7;COMBINING INVERTED DOUBLE ARCH ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC8;COMBINING PLUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC9;COMBINING DOUBLE PLUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1ACA;COMBINING DOUBLE PLUS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +1ACB;COMBINING TRIPLE ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1ACC;COMBINING LATIN SMALL LETTER INSULAR G;Mn;230;NSM;;;;;N;;;;; +1ACD;COMBINING LATIN SMALL LETTER INSULAR R;Mn;230;NSM;;;;;N;;;;; +1ACE;COMBINING LATIN SMALL LETTER INSULAR T;Mn;230;NSM;;;;;N;;;;; +1ACF;COMBINING DOUBLE CARON;Mn;230;NSM;;;;;N;;;;; +1AD0;COMBINING VERTICAL-LINE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1AD1;COMBINING GRAVE-VERTICAL-LINE;Mn;230;NSM;;;;;N;;;;; +1AD2;COMBINING VERTICAL-LINE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1AD3;COMBINING ACUTE-VERTICAL-LINE;Mn;230;NSM;;;;;N;;;;; +1AD4;COMBINING VERTICAL-LINE-MACRON;Mn;230;NSM;;;;;N;;;;; +1AD5;COMBINING MACRON-VERTICAL-LINE;Mn;230;NSM;;;;;N;;;;; +1AD6;COMBINING VERTICAL-LINE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1AD7;COMBINING VERTICAL-LINE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1AD8;COMBINING MACRON-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1AD9;COMBINING SHARP SIGN;Mn;230;NSM;;;;;N;;;;; +1ADA;COMBINING FLAT SIGN;Mn;230;NSM;;;;;N;;;;; +1ADB;COMBINING DOWN TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1ADC;COMBINING DIAERESIS WITH RAISED LEFT DOT;Mn;230;NSM;;;;;N;;;;; +1ADD;COMBINING DOT-AND-RING BELOW;Mn;220;NSM;;;;;N;;;;; +1AE0;COMBINING LEFT TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE1;COMBINING RIGHT TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE2;COMBINING MINUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE3;COMBINING INVERTED BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE4;COMBINING SQUARE ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE5;COMBINING SEAGULL ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE6;COMBINING DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;;;;; +1AE7;COMBINING DOUBLE ARCH ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE8;COMBINING EQUALS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE9;COMBINING LEFT ANGLE CENTRED ABOVE;Mn;230;NSM;;;;;N;;;;; +1AEA;COMBINING UPWARDS ARROW ABOVE;Mn;230;NSM;;;;;N;;;;; +1AEB;COMBINING DOUBLE RIGHTWARDS ARROW ABOVE;Mn;234;NSM;;;;;N;;;;; +1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;; +1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;; +1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;; +1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;; +1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;; +1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;; +1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; +1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;; +1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;; +1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;; +1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;; +1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;; +1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;; +1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;; +1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;; +1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;; +1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;; +1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;; +1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;; +1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;; +1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;; +1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;; +1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;; +1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;; +1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;; +1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;; +1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;; +1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;; +1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;; +1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;; +1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;; +1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;; +1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;; +1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;; +1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; +1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; +1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; +1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; +1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; +1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; +1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; +1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; +1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; +1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; +1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; +1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; +1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; +1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; +1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; +1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; +1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; +1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; +1B4C;BALINESE LETTER ARCHAIC JNYA;Lo;0;L;;;;;N;;;;; +1B4E;BALINESE INVERTED CARIK SIKI;Po;0;L;;;;;N;;;;; +1B4F;BALINESE INVERTED CARIK PAREREN;Po;0;L;;;;;N;;;;; +1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;; +1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;; +1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;; +1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;; +1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;; +1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;; +1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;; +1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; +1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; +1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; +1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; +1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; +1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; +1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; +1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; +1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; +1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; +1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; +1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; +1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; +1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; +1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; +1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; +1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; +1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; +1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; +1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; +1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; +1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; +1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; +1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; +1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; +1B7D;BALINESE PANTI LANTANG;Po;0;L;;;;;N;;;;; +1B7E;BALINESE PAMADA LANTANG;Po;0;L;;;;;N;;;;; +1B7F;BALINESE PANTI BAWAK;Po;0;L;;;;;N;;;;; +1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; +1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; +1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; +1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; +1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; +1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; +1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; +1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; +1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; +1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; +1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; +1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; +1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; +1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; +1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; +1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; +1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; +1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; +1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; +1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; +1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; +1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; +1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; +1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; +1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; +1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; +1BAB;SUNDANESE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1BAC;SUNDANESE CONSONANT SIGN PASANGAN MA;Mn;0;NSM;;;;;N;;;;; +1BAD;SUNDANESE CONSONANT SIGN PASANGAN WA;Mn;0;NSM;;;;;N;;;;; +1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; +1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; +1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1BBA;SUNDANESE AVAGRAHA;Lo;0;L;;;;;N;;;;; +1BBB;SUNDANESE LETTER REU;Lo;0;L;;;;;N;;;;; +1BBC;SUNDANESE LETTER LEU;Lo;0;L;;;;;N;;;;; +1BBD;SUNDANESE LETTER BHA;Lo;0;L;;;;;N;;;;; +1BBE;SUNDANESE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +1BBF;SUNDANESE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +1BC0;BATAK LETTER A;Lo;0;L;;;;;N;;;;; +1BC1;BATAK LETTER SIMALUNGUN A;Lo;0;L;;;;;N;;;;; +1BC2;BATAK LETTER HA;Lo;0;L;;;;;N;;;;; +1BC3;BATAK LETTER SIMALUNGUN HA;Lo;0;L;;;;;N;;;;; +1BC4;BATAK LETTER MANDAILING HA;Lo;0;L;;;;;N;;;;; +1BC5;BATAK LETTER BA;Lo;0;L;;;;;N;;;;; +1BC6;BATAK LETTER KARO BA;Lo;0;L;;;;;N;;;;; +1BC7;BATAK LETTER PA;Lo;0;L;;;;;N;;;;; +1BC8;BATAK LETTER SIMALUNGUN PA;Lo;0;L;;;;;N;;;;; +1BC9;BATAK LETTER NA;Lo;0;L;;;;;N;;;;; +1BCA;BATAK LETTER MANDAILING NA;Lo;0;L;;;;;N;;;;; +1BCB;BATAK LETTER WA;Lo;0;L;;;;;N;;;;; +1BCC;BATAK LETTER SIMALUNGUN WA;Lo;0;L;;;;;N;;;;; +1BCD;BATAK LETTER PAKPAK WA;Lo;0;L;;;;;N;;;;; +1BCE;BATAK LETTER GA;Lo;0;L;;;;;N;;;;; +1BCF;BATAK LETTER SIMALUNGUN GA;Lo;0;L;;;;;N;;;;; +1BD0;BATAK LETTER JA;Lo;0;L;;;;;N;;;;; +1BD1;BATAK LETTER DA;Lo;0;L;;;;;N;;;;; +1BD2;BATAK LETTER RA;Lo;0;L;;;;;N;;;;; +1BD3;BATAK LETTER SIMALUNGUN RA;Lo;0;L;;;;;N;;;;; +1BD4;BATAK LETTER MA;Lo;0;L;;;;;N;;;;; +1BD5;BATAK LETTER SIMALUNGUN MA;Lo;0;L;;;;;N;;;;; +1BD6;BATAK LETTER SOUTHERN TA;Lo;0;L;;;;;N;;;;; +1BD7;BATAK LETTER NORTHERN TA;Lo;0;L;;;;;N;;;;; +1BD8;BATAK LETTER SA;Lo;0;L;;;;;N;;;;; +1BD9;BATAK LETTER SIMALUNGUN SA;Lo;0;L;;;;;N;;;;; +1BDA;BATAK LETTER MANDAILING SA;Lo;0;L;;;;;N;;;;; +1BDB;BATAK LETTER YA;Lo;0;L;;;;;N;;;;; +1BDC;BATAK LETTER SIMALUNGUN YA;Lo;0;L;;;;;N;;;;; +1BDD;BATAK LETTER NGA;Lo;0;L;;;;;N;;;;; +1BDE;BATAK LETTER LA;Lo;0;L;;;;;N;;;;; +1BDF;BATAK LETTER SIMALUNGUN LA;Lo;0;L;;;;;N;;;;; +1BE0;BATAK LETTER NYA;Lo;0;L;;;;;N;;;;; +1BE1;BATAK LETTER CA;Lo;0;L;;;;;N;;;;; +1BE2;BATAK LETTER NDA;Lo;0;L;;;;;N;;;;; +1BE3;BATAK LETTER MBA;Lo;0;L;;;;;N;;;;; +1BE4;BATAK LETTER I;Lo;0;L;;;;;N;;;;; +1BE5;BATAK LETTER U;Lo;0;L;;;;;N;;;;; +1BE6;BATAK SIGN TOMPI;Mn;7;NSM;;;;;N;;;;; +1BE7;BATAK VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1BE8;BATAK VOWEL SIGN PAKPAK E;Mn;0;NSM;;;;;N;;;;; +1BE9;BATAK VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +1BEA;BATAK VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1BEB;BATAK VOWEL SIGN KARO I;Mc;0;L;;;;;N;;;;; +1BEC;BATAK VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1BED;BATAK VOWEL SIGN KARO O;Mn;0;NSM;;;;;N;;;;; +1BEE;BATAK VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1BEF;BATAK VOWEL SIGN U FOR SIMALUNGUN SA;Mn;0;NSM;;;;;N;;;;; +1BF0;BATAK CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +1BF1;BATAK CONSONANT SIGN H;Mn;0;NSM;;;;;N;;;;; +1BF2;BATAK PANGOLAT;Mc;9;L;;;;;N;;;;; +1BF3;BATAK PANONGONAN;Mc;9;L;;;;;N;;;;; +1BFC;BATAK SYMBOL BINDU NA METEK;Po;0;L;;;;;N;;;;; +1BFD;BATAK SYMBOL BINDU PINARBORAS;Po;0;L;;;;;N;;;;; +1BFE;BATAK SYMBOL BINDU JUDUL;Po;0;L;;;;;N;;;;; +1BFF;BATAK SYMBOL BINDU PANGOLAT;Po;0;L;;;;;N;;;;; +1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; +1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; +1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; +1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; +1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; +1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; +1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; +1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; +1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; +1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; +1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; +1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; +1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; +1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; +1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; +1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; +1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; +1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; +1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; +1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; +1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; +1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; +1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; +1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; +1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; +1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; +1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; +1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; +1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; +1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; +1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; +1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; +1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; +1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; +1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; +1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; +1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; +1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; +1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; +1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; +1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; +1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; +1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; +1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; +1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; +1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; +1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; +1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; +1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; +1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; +1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; +1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; +1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; +1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; +1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; +1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; +1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; +1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; +1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; +1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; +1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; +1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; +1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; +1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; +1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; +1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; +1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; +1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; +1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; +1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; +1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; +1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; +1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; +1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; +1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; +1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; +1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; +1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; +1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; +1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; +1C80;CYRILLIC SMALL LETTER ROUNDED VE;Ll;0;L;;;;;N;;;0412;;0412 +1C81;CYRILLIC SMALL LETTER LONG-LEGGED DE;Ll;0;L;;;;;N;;;0414;;0414 +1C82;CYRILLIC SMALL LETTER NARROW O;Ll;0;L;;;;;N;;;041E;;041E +1C83;CYRILLIC SMALL LETTER WIDE ES;Ll;0;L;;;;;N;;;0421;;0421 +1C84;CYRILLIC SMALL LETTER TALL TE;Ll;0;L;;;;;N;;;0422;;0422 +1C85;CYRILLIC SMALL LETTER THREE-LEGGED TE;Ll;0;L;;;;;N;;;0422;;0422 +1C86;CYRILLIC SMALL LETTER TALL HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +1C87;CYRILLIC SMALL LETTER TALL YAT;Ll;0;L;;;;;N;;;0462;;0462 +1C88;CYRILLIC SMALL LETTER UNBLENDED UK;Ll;0;L;;;;;N;;;A64A;;A64A +1C89;CYRILLIC CAPITAL LETTER TJE;Lu;0;L;;;;;N;;;;1C8A; +1C8A;CYRILLIC SMALL LETTER TJE;Ll;0;L;;;;;N;;;1C89;;1C89 +1C90;GEORGIAN MTAVRULI CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;10D0; +1C91;GEORGIAN MTAVRULI CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;10D1; +1C92;GEORGIAN MTAVRULI CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;10D2; +1C93;GEORGIAN MTAVRULI CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;10D3; +1C94;GEORGIAN MTAVRULI CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;10D4; +1C95;GEORGIAN MTAVRULI CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;10D5; +1C96;GEORGIAN MTAVRULI CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;10D6; +1C97;GEORGIAN MTAVRULI CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;10D7; +1C98;GEORGIAN MTAVRULI CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;10D8; +1C99;GEORGIAN MTAVRULI CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;10D9; +1C9A;GEORGIAN MTAVRULI CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;10DA; +1C9B;GEORGIAN MTAVRULI CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;10DB; +1C9C;GEORGIAN MTAVRULI CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;10DC; +1C9D;GEORGIAN MTAVRULI CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;10DD; +1C9E;GEORGIAN MTAVRULI CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;10DE; +1C9F;GEORGIAN MTAVRULI CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;10DF; +1CA0;GEORGIAN MTAVRULI CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;10E0; +1CA1;GEORGIAN MTAVRULI CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;10E1; +1CA2;GEORGIAN MTAVRULI CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;10E2; +1CA3;GEORGIAN MTAVRULI CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;10E3; +1CA4;GEORGIAN MTAVRULI CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;10E4; +1CA5;GEORGIAN MTAVRULI CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;10E5; +1CA6;GEORGIAN MTAVRULI CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;10E6; +1CA7;GEORGIAN MTAVRULI CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;10E7; +1CA8;GEORGIAN MTAVRULI CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;10E8; +1CA9;GEORGIAN MTAVRULI CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;10E9; +1CAA;GEORGIAN MTAVRULI CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;10EA; +1CAB;GEORGIAN MTAVRULI CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;10EB; +1CAC;GEORGIAN MTAVRULI CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;10EC; +1CAD;GEORGIAN MTAVRULI CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;10ED; +1CAE;GEORGIAN MTAVRULI CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;10EE; +1CAF;GEORGIAN MTAVRULI CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;10EF; +1CB0;GEORGIAN MTAVRULI CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;10F0; +1CB1;GEORGIAN MTAVRULI CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;10F1; +1CB2;GEORGIAN MTAVRULI CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;10F2; +1CB3;GEORGIAN MTAVRULI CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;10F3; +1CB4;GEORGIAN MTAVRULI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;10F4; +1CB5;GEORGIAN MTAVRULI CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;10F5; +1CB6;GEORGIAN MTAVRULI CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;10F6; +1CB7;GEORGIAN MTAVRULI CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;10F7; +1CB8;GEORGIAN MTAVRULI CAPITAL LETTER ELIFI;Lu;0;L;;;;;N;;;;10F8; +1CB9;GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN;Lu;0;L;;;;;N;;;;10F9; +1CBA;GEORGIAN MTAVRULI CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;10FA; +1CBD;GEORGIAN MTAVRULI CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;10FD; +1CBE;GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;10FE; +1CBF;GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN;Lu;0;L;;;;;N;;;;10FF; +1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;; +1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;; +1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;; +1CC3;SUNDANESE PUNCTUATION BINDU CAKRA;Po;0;L;;;;;N;;;;; +1CC4;SUNDANESE PUNCTUATION BINDU LEU SATANGA;Po;0;L;;;;;N;;;;; +1CC5;SUNDANESE PUNCTUATION BINDU KA SATANGA;Po;0;L;;;;;N;;;;; +1CC6;SUNDANESE PUNCTUATION BINDU DA SATANGA;Po;0;L;;;;;N;;;;; +1CC7;SUNDANESE PUNCTUATION BINDU BA SATANGA;Po;0;L;;;;;N;;;;; +1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;; +1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;; +1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;; +1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;; +1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;; +1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;; +1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;; +1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;; +1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;; +1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;; +1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;; +1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;; +1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;; +1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;; +1CF2;VEDIC SIGN ARDHAVISARGA;Lo;0;L;;;;;N;;;;; +1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Lo;0;L;;;;;N;;;;; +1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;; +1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +1CF7;VEDIC SIGN ATIKRAMA;Mc;0;L;;;;;N;;;;; +1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;; +1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;; +1CFA;VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; +1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; +1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; +1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; +1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; +1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; +1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; +1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; +1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; +1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; +1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; +1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; +1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; +1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; +1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; +1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; +1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; +1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; +1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; +1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; +1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; +1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; +1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; +1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; +1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; +1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; +1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; +1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; +1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; +1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; +1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; +1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; +1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; +1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; +1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; +1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; +1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; +1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; +1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; +1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; +1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; +1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; +1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; +1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; +1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; +1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L; 0041;;;;N;;;;; +1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L; 00C6;;;;N;;;;; +1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L; 0042;;;;N;;;;; +1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; +1D30;MODIFIER LETTER CAPITAL D;Lm;0;L; 0044;;;;N;;;;; +1D31;MODIFIER LETTER CAPITAL E;Lm;0;L; 0045;;;;N;;;;; +1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L; 018E;;;;N;;;;; +1D33;MODIFIER LETTER CAPITAL G;Lm;0;L; 0047;;;;N;;;;; +1D34;MODIFIER LETTER CAPITAL H;Lm;0;L; 0048;;;;N;;;;; +1D35;MODIFIER LETTER CAPITAL I;Lm;0;L; 0049;;;;N;;;;; +1D36;MODIFIER LETTER CAPITAL J;Lm;0;L; 004A;;;;N;;;;; +1D37;MODIFIER LETTER CAPITAL K;Lm;0;L; 004B;;;;N;;;;; +1D38;MODIFIER LETTER CAPITAL L;Lm;0;L; 004C;;;;N;;;;; +1D39;MODIFIER LETTER CAPITAL M;Lm;0;L; 004D;;;;N;;;;; +1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L; 004E;;;;N;;;;; +1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; +1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L; 004F;;;;N;;;;; +1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L; 0222;;;;N;;;;; +1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L; 0050;;;;N;;;;; +1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L; 0052;;;;N;;;;; +1D40;MODIFIER LETTER CAPITAL T;Lm;0;L; 0054;;;;N;;;;; +1D41;MODIFIER LETTER CAPITAL U;Lm;0;L; 0055;;;;N;;;;; +1D42;MODIFIER LETTER CAPITAL W;Lm;0;L; 0057;;;;N;;;;; +1D43;MODIFIER LETTER SMALL A;Lm;0;L; 0061;;;;N;;;;; +1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L; 0250;;;;N;;;;; +1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L; 0251;;;;N;;;;; +1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L; 1D02;;;;N;;;;; +1D47;MODIFIER LETTER SMALL B;Lm;0;L; 0062;;;;N;;;;; +1D48;MODIFIER LETTER SMALL D;Lm;0;L; 0064;;;;N;;;;; +1D49;MODIFIER LETTER SMALL E;Lm;0;L; 0065;;;;N;;;;; +1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L; 0259;;;;N;;;;; +1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L; 025B;;;;N;;;;; +1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L; 025C;;;;N;;;;; +1D4D;MODIFIER LETTER SMALL G;Lm;0;L; 0067;;;;N;;;;; +1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; +1D4F;MODIFIER LETTER SMALL K;Lm;0;L; 006B;;;;N;;;;; +1D50;MODIFIER LETTER SMALL M;Lm;0;L; 006D;;;;N;;;;; +1D51;MODIFIER LETTER SMALL ENG;Lm;0;L; 014B;;;;N;;;;; +1D52;MODIFIER LETTER SMALL O;Lm;0;L; 006F;;;;N;;;;; +1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L; 0254;;;;N;;;;; +1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L; 1D16;;;;N;;;;; +1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L; 1D17;;;;N;;;;; +1D56;MODIFIER LETTER SMALL P;Lm;0;L; 0070;;;;N;;;;; +1D57;MODIFIER LETTER SMALL T;Lm;0;L; 0074;;;;N;;;;; +1D58;MODIFIER LETTER SMALL U;Lm;0;L; 0075;;;;N;;;;; +1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L; 1D1D;;;;N;;;;; +1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L; 026F;;;;N;;;;; +1D5B;MODIFIER LETTER SMALL V;Lm;0;L; 0076;;;;N;;;;; +1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L; 1D25;;;;N;;;;; +1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L; 03B2;;;;N;;;;; +1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L; 03B3;;;;N;;;;; +1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L; 03B4;;;;N;;;;; +1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L; 03C6;;;;N;;;;; +1D61;MODIFIER LETTER SMALL CHI;Lm;0;L; 03C7;;;;N;;;;; +1D62;LATIN SUBSCRIPT SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; +1D63;LATIN SUBSCRIPT SMALL LETTER R;Lm;0;L; 0072;;;;N;;;;; +1D64;LATIN SUBSCRIPT SMALL LETTER U;Lm;0;L; 0075;;;;N;;;;; +1D65;LATIN SUBSCRIPT SMALL LETTER V;Lm;0;L; 0076;;;;N;;;;; +1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Lm;0;L; 03B2;;;;N;;;;; +1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L; 03B3;;;;N;;;;; +1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Lm;0;L; 03C1;;;;N;;;;; +1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Lm;0;L; 03C6;;;;N;;;;; +1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Lm;0;L; 03C7;;;;N;;;;; +1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; +1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; +1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L; 043D;;;;N;;;;; +1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D +1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; +1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 +1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; +1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;A7C6;;A7C6 +1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; +1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L; 0252;;;;N;;;;; +1D9C;MODIFIER LETTER SMALL C;Lm;0;L; 0063;;;;N;;;;; +1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L; 0255;;;;N;;;;; +1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L; 00F0;;;;N;;;;; +1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L; 025C;;;;N;;;;; +1DA0;MODIFIER LETTER SMALL F;Lm;0;L; 0066;;;;N;;;;; +1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L; 025F;;;;N;;;;; +1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L; 0261;;;;N;;;;; +1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L; 0265;;;;N;;;;; +1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L; 0268;;;;N;;;;; +1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L; 0269;;;;N;;;;; +1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L; 026A;;;;N;;;;; +1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L; 1D7B;;;;N;;;;; +1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L; 029D;;;;N;;;;; +1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L; 026D;;;;N;;;;; +1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L; 1D85;;;;N;;;;; +1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L; 029F;;;;N;;;;; +1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L; 0271;;;;N;;;;; +1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L; 0270;;;;N;;;;; +1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L; 0272;;;;N;;;;; +1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L; 0273;;;;N;;;;; +1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L; 0274;;;;N;;;;; +1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L; 0275;;;;N;;;;; +1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L; 0278;;;;N;;;;; +1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L; 0282;;;;N;;;;; +1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L; 0283;;;;N;;;;; +1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L; 01AB;;;;N;;;;; +1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L; 0289;;;;N;;;;; +1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L; 028A;;;;N;;;;; +1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L; 1D1C;;;;N;;;;; +1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L; 028B;;;;N;;;;; +1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L; 028C;;;;N;;;;; +1DBB;MODIFIER LETTER SMALL Z;Lm;0;L; 007A;;;;N;;;;; +1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L; 0290;;;;N;;;;; +1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L; 0291;;;;N;;;;; +1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L; 0292;;;;N;;;;; +1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L; 03B8;;;;N;;;;; +1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; +1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; +1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; +1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; +1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; +1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; +1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; +1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; +1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; +1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; +1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; +1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; +1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; +1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; +1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; +1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; +1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; +1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; +1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; +1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; +1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; +1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; +1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; +1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; +1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; +1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; +1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; +1DE7;COMBINING LATIN SMALL LETTER ALPHA;Mn;230;NSM;;;;;N;;;;; +1DE8;COMBINING LATIN SMALL LETTER B;Mn;230;NSM;;;;;N;;;;; +1DE9;COMBINING LATIN SMALL LETTER BETA;Mn;230;NSM;;;;;N;;;;; +1DEA;COMBINING LATIN SMALL LETTER SCHWA;Mn;230;NSM;;;;;N;;;;; +1DEB;COMBINING LATIN SMALL LETTER F;Mn;230;NSM;;;;;N;;;;; +1DEC;COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Mn;230;NSM;;;;;N;;;;; +1DED;COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DEE;COMBINING LATIN SMALL LETTER P;Mn;230;NSM;;;;;N;;;;; +1DEF;COMBINING LATIN SMALL LETTER ESH;Mn;230;NSM;;;;;N;;;;; +1DF0;COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DF1;COMBINING LATIN SMALL LETTER W;Mn;230;NSM;;;;;N;;;;; +1DF2;COMBINING LATIN SMALL LETTER A WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1DF6;COMBINING KAVYKA ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +1DF7;COMBINING KAVYKA ABOVE LEFT;Mn;228;NSM;;;;;N;;;;; +1DF8;COMBINING DOT ABOVE LEFT;Mn;228;NSM;;;;;N;;;;; +1DF9;COMBINING WIDE INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;;;;; +1DFA;COMBINING DOT BELOW LEFT;Mn;218;NSM;;;;;N;;;;; +1DFB;COMBINING DELETION MARK;Mn;230;NSM;;;;;N;;;;; +1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; +1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; +1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 +1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; +1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 +1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; +1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 +1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; +1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 +1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; +1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 +1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; +1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A +1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; +1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C +1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; +1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E +1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; +1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 +1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; +1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 +1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; +1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 +1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; +1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 +1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; +1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 +1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; +1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A +1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; +1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C +1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; +1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E +1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; +1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 +1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; +1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 +1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; +1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 +1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; +1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 +1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; +1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 +1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; +1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A +1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; +1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C +1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; +1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E +1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; +1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 +1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; +1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 +1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; +1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 +1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; +1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 +1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; +1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 +1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; +1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A +1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; +1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C +1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; +1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E +1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; +1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 +1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; +1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 +1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; +1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 +1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; +1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 +1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; +1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 +1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; +1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A +1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; +1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C +1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; +1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E +1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; +1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 +1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; +1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 +1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; +1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 +1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; +1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 +1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; +1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 +1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; +1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A +1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; +1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C +1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; +1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E +1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; +1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 +1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; +1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 +1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; +1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 +1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; +1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 +1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; +1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 +1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; +1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A +1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; +1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C +1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; +1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E +1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; +1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 +1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; +1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 +1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; +1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 +1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; +1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 +1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; +1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 +1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; +1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A +1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; +1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C +1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; +1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E +1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; +1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 +1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; +1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 +1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; +1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 +1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; +1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 +1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; +1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 +1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; +1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A +1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; +1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C +1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; +1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E +1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; +1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 +1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; +1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 +1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; +1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 +1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; +1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; +1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; +1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; +1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L; 0061 02BE;;;;N;;;;; +1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; +1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; +1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; +1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; +1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; +1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 +1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; +1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 +1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; +1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 +1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; +1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 +1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; +1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 +1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; +1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA +1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; +1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC +1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; +1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE +1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; +1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 +1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; +1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 +1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; +1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 +1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; +1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 +1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; +1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 +1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; +1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA +1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; +1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC +1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; +1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE +1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; +1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 +1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; +1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 +1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; +1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 +1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; +1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 +1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; +1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 +1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; +1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA +1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; +1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; +1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE +1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; +1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 +1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; +1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 +1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; +1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 +1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; +1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 +1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; +1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; +1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA +1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; +1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC +1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; +1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE +1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; +1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 +1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; +1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 +1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; +1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 +1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; +1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 +1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; +1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 +1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; +1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA +1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; +1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC +1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; +1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE +1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; +1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 +1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; +1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 +1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; +1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 +1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; +1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 +1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; +1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; +1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA +1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; +1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC +1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; +1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE +1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 +1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 +1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A +1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B +1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C +1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D +1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E +1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F +1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; +1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; +1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; +1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; +1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; +1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; +1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; +1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; +1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 +1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 +1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A +1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B +1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C +1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D +1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; +1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; +1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; +1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; +1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; +1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; +1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 +1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 +1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A +1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B +1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C +1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D +1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E +1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F +1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; +1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; +1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; +1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; +1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; +1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; +1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; +1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; +1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 +1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 +1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A +1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B +1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C +1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D +1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E +1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F +1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; +1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; +1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; +1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; +1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; +1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; +1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; +1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; +1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 +1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 +1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A +1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B +1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C +1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D +1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; +1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; +1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; +1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; +1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; +1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; +1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; +1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 +1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; +1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B +1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; +1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D +1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; +1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F +1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; +1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; +1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; +1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; +1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 +1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 +1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A +1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B +1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C +1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D +1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E +1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F +1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; +1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; +1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; +1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; +1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; +1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; +1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; +1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; +1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA +1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB +1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 +1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 +1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA +1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB +1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA +1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB +1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 +1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 +1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA +1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB +1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA +1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB +1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 +1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 +1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A +1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B +1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C +1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D +1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E +1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F +1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; +1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; +1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; +1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; +1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; +1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; +1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; +1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; +1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 +1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 +1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A +1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B +1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C +1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D +1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E +1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F +1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; +1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; +1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; +1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; +1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; +1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; +1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; +1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; +1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 +1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 +1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA +1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB +1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC +1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD +1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE +1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF +1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; +1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; +1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; +1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; +1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; +1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; +1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; +1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; +1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 +1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 +1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; +1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC +1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; +1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; +1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; +1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; +1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; +1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; +1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; +1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; +1FBD;GREEK KORONIS;Sk;0;ON; 0020 0313;;;;N;;;;; +1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 +1FBF;GREEK PSILI;Sk;0;ON; 0020 0313;;;;N;;;;; +1FC0;GREEK PERISPOMENI;Sk;0;ON; 0020 0342;;;;N;;;;; +1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; +1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; +1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC +1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; +1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; +1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; +1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; +1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; +1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; +1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; +1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; +1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; +1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; +1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; +1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 +1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 +1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; +1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; +1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; +1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; +1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; +1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; +1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; +1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; +1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; +1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; +1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; +1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 +1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 +1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; +1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; +1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; +1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC +1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; +1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; +1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; +1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; +1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; +1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; +1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; +1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; +1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; +1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; +1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; +1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC +1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; +1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; +1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; +1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; +1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; +1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; +1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; +1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; +1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; +1FFE;GREEK DASIA;Sk;0;ON; 0020 0314;;;;N;;;;; +2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; +2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; +2002;EN SPACE;Zs;0;WS; 0020;;;;N;;;;; +2003;EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2004;THREE-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2005;FOUR-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2006;SIX-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2007;FIGURE SPACE;Zs;0;WS; 0020;;;;N;;;;; +2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; +2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; +200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; +200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; +200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; +200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; +200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; +200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; +2010;HYPHEN;Pd;0;ON;;;;;N;;;;; +2011;NON-BREAKING HYPHEN;Pd;0;ON; 2010;;;;N;;;;; +2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; +2013;EN DASH;Pd;0;ON;;;;;N;;;;; +2014;EM DASH;Pd;0;ON;;;;;N;;;;; +2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; +2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; +2017;DOUBLE LOW LINE;Po;0;ON; 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; +2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; +2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; +201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; +201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; +201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; +201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; +201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; +201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; +2020;DAGGER;Po;0;ON;;;;;N;;;;; +2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; +2022;BULLET;Po;0;ON;;;;;N;;;;; +2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; +2024;ONE DOT LEADER;Po;0;ON; 002E;;;;N;;;;; +2025;TWO DOT LEADER;Po;0;ON; 002E 002E;;;;N;;;;; +2026;HORIZONTAL ELLIPSIS;Po;0;ON; 002E 002E 002E;;;;N;;;;; +2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; +2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; +2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; +202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; +202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; +202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; +202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; +202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;;;;; +2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +2032;PRIME;Po;0;ET;;;;;N;;;;; +2033;DOUBLE PRIME;Po;0;ET; 2032 2032;;;;N;;;;; +2034;TRIPLE PRIME;Po;0;ET; 2032 2032 2032;;;;N;;;;; +2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; +2036;REVERSED DOUBLE PRIME;Po;0;ON; 2035 2035;;;;N;;;;; +2037;REVERSED TRIPLE PRIME;Po;0;ON; 2035 2035 2035;;;;N;;;;; +2038;CARET;Po;0;ON;;;;;N;;;;; +2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; +203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; +203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; +203C;DOUBLE EXCLAMATION MARK;Po;0;ON; 0021 0021;;;;N;;;;; +203D;INTERROBANG;Po;0;ON;;;;;N;;;;; +203E;OVERLINE;Po;0;ON; 0020 0305;;;;N;SPACING OVERSCORE;;;; +203F;UNDERTIE;Pc;0;ON;;;;;N;;;;; +2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; +2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; +2042;ASTERISM;Po;0;ON;;;;;N;;;;; +2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; +2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; +2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; +2047;DOUBLE QUESTION MARK;Po;0;ON; 003F 003F;;;;N;;;;; +2048;QUESTION EXCLAMATION MARK;Po;0;ON; 003F 0021;;;;N;;;;; +2049;EXCLAMATION QUESTION MARK;Po;0;ON; 0021 003F;;;;N;;;;; +204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; +204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; +204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; +204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; +2050;CLOSE UP;Po;0;ON;;;;;N;;;;; +2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; +2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; +2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; +2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; +2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2057;QUADRUPLE PRIME;Po;0;ON; 2032 2032 2032 2032;;;;N;;;;; +2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; +205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; +205D;TRICOLON;Po;0;ON;;;;;N;;;;; +205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; +205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS; 0020;;;;N;;;;; +2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; +2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; +2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; +2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; +2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; +2066;LEFT-TO-RIGHT ISOLATE;Cf;0;LRI;;;;;N;;;;; +2067;RIGHT-TO-LEFT ISOLATE;Cf;0;RLI;;;;;N;;;;; +2068;FIRST STRONG ISOLATE;Cf;0;FSI;;;;;N;;;;; +2069;POP DIRECTIONAL ISOLATE;Cf;0;PDI;;;;;N;;;;; +206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +2070;SUPERSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; +2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; +2074;SUPERSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; +2075;SUPERSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; +2076;SUPERSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; +2077;SUPERSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; +2078;SUPERSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; +2079;SUPERSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; +207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; +207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; +2080;SUBSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;; +2081;SUBSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; +2082;SUBSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; +2083;SUBSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; +2084;SUBSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; +2085;SUBSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; +2086;SUBSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; +2087;SUBSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; +2088;SUBSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; +2089;SUBSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; +208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L; 0061;;;;N;;;;; +2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L; 0065;;;;N;;;;; +2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L; 006F;;;;N;;;;; +2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L; 0078;;;;N;;;;; +2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L; 0259;;;;N;;;;; +2095;LATIN SUBSCRIPT SMALL LETTER H;Lm;0;L; 0068;;;;N;;;;; +2096;LATIN SUBSCRIPT SMALL LETTER K;Lm;0;L; 006B;;;;N;;;;; +2097;LATIN SUBSCRIPT SMALL LETTER L;Lm;0;L; 006C;;;;N;;;;; +2098;LATIN SUBSCRIPT SMALL LETTER M;Lm;0;L; 006D;;;;N;;;;; +2099;LATIN SUBSCRIPT SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; +209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L; 0070;;;;N;;;;; +209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L; 0073;;;;N;;;;; +209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L; 0074;;;;N;;;;; +20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; +20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; +20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; +20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; +20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; +20A8;RUPEE SIGN;Sc;0;ET; 0052 0073;;;;N;;;;; +20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; +20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; +20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; +20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; +20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; +20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; +20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; +20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; +20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; +20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; +20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; +20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; +20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; +20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;; +20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; +20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; +20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +20BA;TURKISH LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; +20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; +20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; +20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;; +20BF;BITCOIN SIGN;Sc;0;ET;;;;;N;;;;; +20C0;SOM SIGN;Sc;0;ET;;;;;N;;;;; +20C1;SAUDI RIYAL SIGN;Sc;0;ET;;;;;N;;;;; +20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; +20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; +20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; +20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; +20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; +20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; +20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; +20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; +20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; +20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; +20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; +20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; +20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; +20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; +20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; +20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; +20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; +20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; +20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; +20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; +20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; +20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; +20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; +20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; +2100;ACCOUNT OF;So;0;ON; 0061 002F 0063;;;;N;;;;; +2101;ADDRESSED TO THE SUBJECT;So;0;ON; 0061 002F 0073;;;;N;;;;; +2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L; 0043;;;;N;DOUBLE-STRUCK C;;;; +2103;DEGREE CELSIUS;So;0;ON; 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; +2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; +2105;CARE OF;So;0;ON; 0063 002F 006F;;;;N;;;;; +2106;CADA UNA;So;0;ON; 0063 002F 0075;;;;N;;;;; +2107;EULER CONSTANT;Lu;0;L; 0190;;;;N;EULERS;;;; +2108;SCRUPLE;So;0;ON;;;;;N;;;;; +2109;DEGREE FAHRENHEIT;So;0;ON; 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; +210A;SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; +210B;SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;SCRIPT H;;;; +210C;BLACK-LETTER CAPITAL H;Lu;0;L; 0048;;;;N;BLACK-LETTER H;;;; +210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L; 0048;;;;N;DOUBLE-STRUCK H;;;; +210E;PLANCK CONSTANT;Ll;0;L; 0068;;;;N;;;;; +210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L; 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; +2110;SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;SCRIPT I;;;; +2111;BLACK-LETTER CAPITAL I;Lu;0;L; 0049;;;;N;BLACK-LETTER I;;;; +2112;SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;SCRIPT L;;;; +2113;SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; +2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L; 004E;;;;N;DOUBLE-STRUCK N;;;; +2116;NUMERO SIGN;So;0;ON; 004E 006F;;;;N;NUMERO;;;; +2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; +2118;SCRIPT CAPITAL P;Sm;0;ON;;;;;N;SCRIPT P;;;; +2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L; 0050;;;;N;DOUBLE-STRUCK P;;;; +211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L; 0051;;;;N;DOUBLE-STRUCK Q;;;; +211B;SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;SCRIPT R;;;; +211C;BLACK-LETTER CAPITAL R;Lu;0;L; 0052;;;;N;BLACK-LETTER R;;;; +211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L; 0052;;;;N;DOUBLE-STRUCK R;;;; +211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; +211F;RESPONSE;So;0;ON;;;;;N;;;;; +2120;SERVICE MARK;So;0;ON; 0053 004D;;;;N;;;;; +2121;TELEPHONE SIGN;So;0;ON; 0054 0045 004C;;;;N;T E L SYMBOL;;;; +2122;TRADE MARK SIGN;So;0;ON; 0054 004D;;;;N;TRADEMARK;;;; +2123;VERSICLE;So;0;ON;;;;;N;;;;; +2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L; 005A;;;;N;DOUBLE-STRUCK Z;;;; +2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; +2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; +2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; +2128;BLACK-LETTER CAPITAL Z;Lu;0;L; 005A;;;;N;BLACK-LETTER Z;;;; +2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; +212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; +212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; +212C;SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;SCRIPT B;;;; +212D;BLACK-LETTER CAPITAL C;Lu;0;L; 0043;;;;N;BLACK-LETTER C;;;; +212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; +212F;SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; +2130;SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;SCRIPT E;;;; +2131;SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;SCRIPT F;;;; +2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; +2133;SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;SCRIPT M;;;; +2134;SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; +2135;ALEF SYMBOL;Lo;0;L; 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; +2136;BET SYMBOL;Lo;0;L; 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; +2137;GIMEL SYMBOL;Lo;0;L; 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; +2138;DALET SYMBOL;Lo;0;L; 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; +2139;INFORMATION SOURCE;Ll;0;L; 0069;;;;N;;;;; +213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; +213B;FACSIMILE SIGN;So;0;ON; 0046 0041 0058;;;;N;;;;; +213C;DOUBLE-STRUCK SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON; 2211;;;;Y;;;;; +2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; +2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; +2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; +214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; +214C;PER SIGN;So;0;ON;;;;;N;;;;; +214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; +214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 +214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; +2150;VULGAR FRACTION ONE SEVENTH;No;0;ON; 0031 2044 0037;;;1/7;N;;;;; +2151;VULGAR FRACTION ONE NINTH;No;0;ON; 0031 2044 0039;;;1/9;N;;;;; +2152;VULGAR FRACTION ONE TENTH;No;0;ON; 0031 2044 0031 0030;;;1/10;N;;;;; +2153;VULGAR FRACTION ONE THIRD;No;0;ON; 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; +2154;VULGAR FRACTION TWO THIRDS;No;0;ON; 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; +2155;VULGAR FRACTION ONE FIFTH;No;0;ON; 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; +2156;VULGAR FRACTION TWO FIFTHS;No;0;ON; 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; +2157;VULGAR FRACTION THREE FIFTHS;No;0;ON; 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; +2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON; 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; +2159;VULGAR FRACTION ONE SIXTH;No;0;ON; 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; +215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON; 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; +215B;VULGAR FRACTION ONE EIGHTH;No;0;ON; 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; +215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON; 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; +215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON; 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; +215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON; 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; +215F;FRACTION NUMERATOR ONE;No;0;ON; 0031 2044;;;1;N;;;;; +2160;ROMAN NUMERAL ONE;Nl;0;L; 0049;;;1;N;;;;2170; +2161;ROMAN NUMERAL TWO;Nl;0;L; 0049 0049;;;2;N;;;;2171; +2162;ROMAN NUMERAL THREE;Nl;0;L; 0049 0049 0049;;;3;N;;;;2172; +2163;ROMAN NUMERAL FOUR;Nl;0;L; 0049 0056;;;4;N;;;;2173; +2164;ROMAN NUMERAL FIVE;Nl;0;L; 0056;;;5;N;;;;2174; +2165;ROMAN NUMERAL SIX;Nl;0;L; 0056 0049;;;6;N;;;;2175; +2166;ROMAN NUMERAL SEVEN;Nl;0;L; 0056 0049 0049;;;7;N;;;;2176; +2167;ROMAN NUMERAL EIGHT;Nl;0;L; 0056 0049 0049 0049;;;8;N;;;;2177; +2168;ROMAN NUMERAL NINE;Nl;0;L; 0049 0058;;;9;N;;;;2178; +2169;ROMAN NUMERAL TEN;Nl;0;L; 0058;;;10;N;;;;2179; +216A;ROMAN NUMERAL ELEVEN;Nl;0;L; 0058 0049;;;11;N;;;;217A; +216B;ROMAN NUMERAL TWELVE;Nl;0;L; 0058 0049 0049;;;12;N;;;;217B; +216C;ROMAN NUMERAL FIFTY;Nl;0;L; 004C;;;50;N;;;;217C; +216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0043;;;100;N;;;;217D; +216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0044;;;500;N;;;;217E; +216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 004D;;;1000;N;;;;217F; +2170;SMALL ROMAN NUMERAL ONE;Nl;0;L; 0069;;;1;N;;;2160;;2160 +2171;SMALL ROMAN NUMERAL TWO;Nl;0;L; 0069 0069;;;2;N;;;2161;;2161 +2172;SMALL ROMAN NUMERAL THREE;Nl;0;L; 0069 0069 0069;;;3;N;;;2162;;2162 +2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L; 0069 0076;;;4;N;;;2163;;2163 +2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L; 0076;;;5;N;;;2164;;2164 +2175;SMALL ROMAN NUMERAL SIX;Nl;0;L; 0076 0069;;;6;N;;;2165;;2165 +2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L; 0076 0069 0069;;;7;N;;;2166;;2166 +2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L; 0076 0069 0069 0069;;;8;N;;;2167;;2167 +2178;SMALL ROMAN NUMERAL NINE;Nl;0;L; 0069 0078;;;9;N;;;2168;;2168 +2179;SMALL ROMAN NUMERAL TEN;Nl;0;L; 0078;;;10;N;;;2169;;2169 +217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L; 0078 0069;;;11;N;;;216A;;216A +217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L; 0078 0069 0069;;;12;N;;;216B;;216B +217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L; 006C;;;50;N;;;216C;;216C +217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0063;;;100;N;;;216D;;216D +217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0064;;;500;N;;;216E;;216E +217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 006D;;;1000;N;;;216F;;216F +2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; +2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; +2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; +2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 +2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; +2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; +2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; +2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; +2189;VULGAR FRACTION ZERO THIRDS;No;0;ON; 0030 2044 0033;;;0;N;;;;; +218A;TURNED DIGIT TWO;So;0;ON;;;;;N;;;;; +218B;TURNED DIGIT THREE;So;0;ON;;;;;N;;;;; +2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; +2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; +2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; +2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; +2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; +2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; +2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; +2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; +2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; +219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; +219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; +219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; +219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; +219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; +219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; +21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; +21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; +21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; +21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; +21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; +21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; +21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; +21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; +21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; +21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; +21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; +21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; +21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; +21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; +21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; +21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; +21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; +21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; +21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; +21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; +21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; +21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; +21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; +21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; +21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; +21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; +21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; +21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; +21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; +21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; +21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; +21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; +21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; +21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; +21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; +21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; +21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; +21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; +21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; +21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; +21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; +21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; +21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; +21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; +21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; +21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; +21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; +21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; +21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; +21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; +21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; +21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; +21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; +21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; +21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; +21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; +21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; +21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; +21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; +21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; +21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; +21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; +21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; +21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; +21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; +21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; +21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; +21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; +21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; +21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; +21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; +21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; +21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +2200;FOR ALL;Sm;0;ON;;;;;N;;;;; +2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; +2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; +2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; +2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; +2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; +2206;INCREMENT;Sm;0;ON;;;;;N;;;;; +2207;NABLA;Sm;0;ON;;;;;N;;;;; +2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; +220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; +220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; +220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; +2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; +2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; +2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; +2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; +2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; +2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; +2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; +2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; +221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; +221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; +221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; +221E;INFINITY;Sm;0;ON;;;;;N;;;;; +221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; +2220;ANGLE;Sm;0;ON;;;;;Y;;;;; +2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; +2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; +2223;DIVIDES;Sm;0;ON;;;;;N;;;;; +2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; +2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; +2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; +2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; +222A;UNION;Sm;0;ON;;;;;N;;;;; +222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222C;DOUBLE INTEGRAL;Sm;0;ON; 222B 222B;;;;Y;;;;; +222D;TRIPLE INTEGRAL;Sm;0;ON; 222B 222B 222B;;;;Y;;;;; +222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222F;SURFACE INTEGRAL;Sm;0;ON; 222E 222E;;;;Y;;;;; +2230;VOLUME INTEGRAL;Sm;0;ON; 222E 222E 222E;;;;Y;;;;; +2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2234;THEREFORE;Sm;0;ON;;;;;N;;;;; +2235;BECAUSE;Sm;0;ON;;;;;N;;;;; +2236;RATIO;Sm;0;ON;;;;;N;;;;; +2237;PROPORTION;Sm;0;ON;;;;;N;;;;; +2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; +2239;EXCESS;Sm;0;ON;;;;;Y;;;;; +223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; +223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; +223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;; +223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; +223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; +2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; +2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; +2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; +2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; +2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; +2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; +224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; +224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; +2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; +2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; +2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; +2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; +2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; +2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; +2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; +2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; +225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; +225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; +225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; +225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; +225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; +225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; +2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; +2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; +2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; +2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; +2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; +2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; +2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; +2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; +226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; +226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; +226C;BETWEEN;Sm;0;ON;;;;;N;;;;; +226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;Y;;;;; +226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; +226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; +2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; +2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; +2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; +2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; +2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; +2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; +2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; +2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; +2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; +2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; +227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; +227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; +2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; +2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; +2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; +2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; +2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; +2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; +2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; +228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; +228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; +228C;MULTISET;Sm;0;ON;;;;;Y;;;;; +228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; +228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; +228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; +2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; +2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; +2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; +2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; +229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; +229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; +229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; +229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; +22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; +22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; +22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; +22A5;UP TACK;Sm;0;ON;;;;;N;;;;; +22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; +22A7;MODELS;Sm;0;ON;;;;;Y;;;;; +22A8;TRUE;Sm;0;ON;;;;;Y;;;;; +22A9;FORCES;Sm;0;ON;;;;;Y;;;;; +22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; +22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; +22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; +22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; +22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; +22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; +22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; +22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; +22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; +22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; +22BB;XOR;Sm;0;ON;;;;;N;;;;; +22BC;NAND;Sm;0;ON;;;;;N;;;;; +22BD;NOR;Sm;0;ON;;;;;N;;;;; +22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; +22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; +22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; +22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; +22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; +22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; +22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; +22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; +22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; +22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; +22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; +22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; +22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; +22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; +22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; +22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; +22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; +22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; +22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; +22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; +22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; +22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; +22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; +22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; +22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; +22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; +22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; +22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; +22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; +22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; +22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; +22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; +22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; +22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; +22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; +2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; +2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; +2302;HOUSE;So;0;ON;;;;;N;;;;; +2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; +2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; +2305;PROJECTIVE;So;0;ON;;;;;N;;;;; +2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; +2307;WAVY LINE;So;0;ON;;;;;N;;;;; +2308;LEFT CEILING;Ps;0;ON;;;;;Y;;;;; +2309;RIGHT CEILING;Pe;0;ON;;;;;Y;;;;; +230A;LEFT FLOOR;Ps;0;ON;;;;;Y;;;;; +230B;RIGHT FLOOR;Pe;0;ON;;;;;Y;;;;; +230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; +230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; +230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; +230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; +2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; +2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; +2312;ARC;So;0;ON;;;;;N;;;;; +2313;SEGMENT;So;0;ON;;;;;N;;;;; +2314;SECTOR;So;0;ON;;;;;N;;;;; +2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; +2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; +2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; +2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; +231A;WATCH;So;0;ON;;;;;N;;;;; +231B;HOURGLASS;So;0;ON;;;;;N;;;;; +231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; +231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; +231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; +231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; +2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2322;FROWN;So;0;ON;;;;;N;;;;; +2323;SMILE;So;0;ON;;;;;N;;;;; +2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; +2325;OPTION KEY;So;0;ON;;;;;N;;;;; +2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; +2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; +2328;KEYBOARD;So;0;ON;;;;;N;;;;; +2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; +232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; +232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; +232C;BENZENE RING;So;0;ON;;;;;N;;;;; +232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; +232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; +232F;SYMMETRY;So;0;ON;;;;;N;;;;; +2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; +2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; +2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; +2333;SLOPE;So;0;ON;;;;;N;;;;; +2334;COUNTERBORE;So;0;ON;;;;;N;;;;; +2335;COUNTERSINK;So;0;ON;;;;;N;;;;; +2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; +2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; +2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; +2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; +233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; +233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; +233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; +233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; +233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; +233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; +2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; +2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; +2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; +2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; +2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; +2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; +2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; +2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; +2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; +2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; +234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;; +234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; +234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; +234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; +234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;; +234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; +2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; +2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;; +2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; +2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; +2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; +2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;; +2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; +2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; +2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; +2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; +235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; +235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; +235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; +235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; +235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; +235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; +2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; +2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;; +2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; +2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; +2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; +2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; +2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; +2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; +2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; +2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; +236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; +236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; +236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; +236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; +236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; +236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; +2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; +2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; +2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; +2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; +2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; +2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; +2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; +2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; +2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; +2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; +237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; +237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; +237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; +237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; +237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; +237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; +2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; +2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; +2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; +2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; +2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; +2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; +2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;; +238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;; +238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;; +238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; +238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; +238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; +238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; +2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; +2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; +2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; +2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; +2398;NEXT PAGE;So;0;ON;;;;;N;;;;; +2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; +23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; +23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; +23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; +23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; +23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; +23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; +23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; +23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; +23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; +23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; +23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; +23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; +23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; +23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; +23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; +23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; +23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; +23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; +23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; +23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; +23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; +23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; +23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; +23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; +23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; +23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; +23DB;FUSE;So;0;ON;;;;;N;;;;; +23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; +23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; +23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; +23E5;FLATNESS;So;0;ON;;;;;N;;;;; +23E6;AC CURRENT;So;0;ON;;;;;N;;;;; +23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; +23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;; +23E9;BLACK RIGHT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EA;BLACK LEFT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EB;BLACK UP-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EC;BLACK DOWN-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23ED;BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EE;BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EF;BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F0;ALARM CLOCK;So;0;ON;;;;;N;;;;; +23F1;STOPWATCH;So;0;ON;;;;;N;;;;; +23F2;TIMER CLOCK;So;0;ON;;;;;N;;;;; +23F3;HOURGLASS WITH FLOWING SAND;So;0;ON;;;;;N;;;;; +23F4;BLACK MEDIUM LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F5;BLACK MEDIUM RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F6;BLACK MEDIUM UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F7;BLACK MEDIUM DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F8;DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F9;BLACK SQUARE FOR STOP;So;0;ON;;;;;N;;;;; +23FA;BLACK CIRCLE FOR RECORD;So;0;ON;;;;;N;;;;; +23FB;POWER SYMBOL;So;0;ON;;;;;N;;;;; +23FC;POWER ON-OFF SYMBOL;So;0;ON;;;;;N;;;;; +23FD;POWER ON SYMBOL;So;0;ON;;;;;N;;;;; +23FE;POWER SLEEP SYMBOL;So;0;ON;;;;;N;;;;; +23FF;OBSERVER EYE SYMBOL;So;0;ON;;;;;N;;;;; +2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; +2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; +2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; +2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; +2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; +2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; +2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; +2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; +2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; +2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; +240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; +240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; +240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; +240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; +240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; +240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; +2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; +2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; +2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; +2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; +2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; +2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; +2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; +2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; +2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; +2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; +241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; +241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; +241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; +241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; +241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; +241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; +2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; +2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; +2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; +2423;OPEN BOX;So;0;ON;;;;;N;;;;; +2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; +2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; +2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; +2427;SYMBOL FOR DELETE SQUARE CHECKER BOARD FORM;So;0;ON;;;;;N;;;;; +2428;SYMBOL FOR DELETE RECTANGULAR CHECKER BOARD FORM;So;0;ON;;;;;N;;;;; +2429;SYMBOL FOR DELETE MEDIUM SHADE FORM;So;0;ON;;;;;N;;;;; +2440;OCR HOOK;So;0;ON;;;;;N;;;;; +2441;OCR CHAIR;So;0;ON;;;;;N;;;;; +2442;OCR FORK;So;0;ON;;;;;N;;;;; +2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; +2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; +2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; +2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; +2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; +2448;OCR DASH;So;0;ON;;;;;N;;;;; +2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; +244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;ON; 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON; 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON; 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON; 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON; 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON; 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON; 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON; 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON; 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON; 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON; 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON; 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON; 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON; 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON; 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON; 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON; 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON; 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON; 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON; 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON; 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON; 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON; 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON; 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON; 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON; 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON; 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON; 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON; 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON; 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON; 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON; 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON; 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON; 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON; 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON; 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON; 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON; 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON; 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON; 0028 0032 0030 0029;;;20;N;;;;; +2488;DIGIT ONE FULL STOP;No;0;EN; 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; +2489;DIGIT TWO FULL STOP;No;0;EN; 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; +248A;DIGIT THREE FULL STOP;No;0;EN; 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; +248B;DIGIT FOUR FULL STOP;No;0;EN; 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; +248C;DIGIT FIVE FULL STOP;No;0;EN; 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; +248D;DIGIT SIX FULL STOP;No;0;EN; 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; +248E;DIGIT SEVEN FULL STOP;No;0;EN; 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; +248F;DIGIT EIGHT FULL STOP;No;0;EN; 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; +2490;DIGIT NINE FULL STOP;No;0;EN; 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; +2491;NUMBER TEN FULL STOP;No;0;EN; 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; +2492;NUMBER ELEVEN FULL STOP;No;0;EN; 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; +2493;NUMBER TWELVE FULL STOP;No;0;EN; 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; +2494;NUMBER THIRTEEN FULL STOP;No;0;EN; 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; +2495;NUMBER FOURTEEN FULL STOP;No;0;EN; 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; +2496;NUMBER FIFTEEN FULL STOP;No;0;EN; 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; +2497;NUMBER SIXTEEN FULL STOP;No;0;EN; 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; +2498;NUMBER SEVENTEEN FULL STOP;No;0;EN; 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; +2499;NUMBER EIGHTEEN FULL STOP;No;0;EN; 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; +249A;NUMBER NINETEEN FULL STOP;No;0;EN; 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; +249B;NUMBER TWENTY FULL STOP;No;0;EN; 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; +249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L; 0028 0061 0029;;;;N;;;;; +249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L; 0028 0062 0029;;;;N;;;;; +249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L; 0028 0063 0029;;;;N;;;;; +249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L; 0028 0064 0029;;;;N;;;;; +24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L; 0028 0065 0029;;;;N;;;;; +24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L; 0028 0066 0029;;;;N;;;;; +24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L; 0028 0067 0029;;;;N;;;;; +24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L; 0028 0068 0029;;;;N;;;;; +24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L; 0028 0069 0029;;;;N;;;;; +24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L; 0028 006A 0029;;;;N;;;;; +24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L; 0028 006B 0029;;;;N;;;;; +24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L; 0028 006C 0029;;;;N;;;;; +24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L; 0028 006D 0029;;;;N;;;;; +24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L; 0028 006E 0029;;;;N;;;;; +24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L; 0028 006F 0029;;;;N;;;;; +24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L; 0028 0070 0029;;;;N;;;;; +24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L; 0028 0071 0029;;;;N;;;;; +24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L; 0028 0072 0029;;;;N;;;;; +24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L; 0028 0073 0029;;;;N;;;;; +24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L; 0028 0074 0029;;;;N;;;;; +24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L; 0028 0075 0029;;;;N;;;;; +24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L; 0028 0076 0029;;;;N;;;;; +24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L; 0028 0077 0029;;;;N;;;;; +24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L; 0028 0078 0029;;;;N;;;;; +24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L; 0028 0079 0029;;;;N;;;;; +24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L; 0028 007A 0029;;;;N;;;;; +24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;24D0; +24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;24D1; +24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;24D2; +24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;24D3; +24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;24D4; +24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;24D5; +24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;24D6; +24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;24D7; +24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;24D8; +24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;24D9; +24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;24DA; +24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;24DB; +24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;24DC; +24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;24DD; +24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;24DE; +24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;24DF; +24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;24E0; +24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;24E1; +24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;24E2; +24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;24E3; +24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;24E4; +24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;24E5; +24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;24E6; +24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;24E7; +24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;24E8; +24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;24E9; +24D0;CIRCLED LATIN SMALL LETTER A;So;0;L; 0061;;;;N;;;24B6;;24B6 +24D1;CIRCLED LATIN SMALL LETTER B;So;0;L; 0062;;;;N;;;24B7;;24B7 +24D2;CIRCLED LATIN SMALL LETTER C;So;0;L; 0063;;;;N;;;24B8;;24B8 +24D3;CIRCLED LATIN SMALL LETTER D;So;0;L; 0064;;;;N;;;24B9;;24B9 +24D4;CIRCLED LATIN SMALL LETTER E;So;0;L; 0065;;;;N;;;24BA;;24BA +24D5;CIRCLED LATIN SMALL LETTER F;So;0;L; 0066;;;;N;;;24BB;;24BB +24D6;CIRCLED LATIN SMALL LETTER G;So;0;L; 0067;;;;N;;;24BC;;24BC +24D7;CIRCLED LATIN SMALL LETTER H;So;0;L; 0068;;;;N;;;24BD;;24BD +24D8;CIRCLED LATIN SMALL LETTER I;So;0;L; 0069;;;;N;;;24BE;;24BE +24D9;CIRCLED LATIN SMALL LETTER J;So;0;L; 006A;;;;N;;;24BF;;24BF +24DA;CIRCLED LATIN SMALL LETTER K;So;0;L; 006B;;;;N;;;24C0;;24C0 +24DB;CIRCLED LATIN SMALL LETTER L;So;0;L; 006C;;;;N;;;24C1;;24C1 +24DC;CIRCLED LATIN SMALL LETTER M;So;0;L; 006D;;;;N;;;24C2;;24C2 +24DD;CIRCLED LATIN SMALL LETTER N;So;0;L; 006E;;;;N;;;24C3;;24C3 +24DE;CIRCLED LATIN SMALL LETTER O;So;0;L; 006F;;;;N;;;24C4;;24C4 +24DF;CIRCLED LATIN SMALL LETTER P;So;0;L; 0070;;;;N;;;24C5;;24C5 +24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L; 0071;;;;N;;;24C6;;24C6 +24E1;CIRCLED LATIN SMALL LETTER R;So;0;L; 0072;;;;N;;;24C7;;24C7 +24E2;CIRCLED LATIN SMALL LETTER S;So;0;L; 0073;;;;N;;;24C8;;24C8 +24E3;CIRCLED LATIN SMALL LETTER T;So;0;L; 0074;;;;N;;;24C9;;24C9 +24E4;CIRCLED LATIN SMALL LETTER U;So;0;L; 0075;;;;N;;;24CA;;24CA +24E5;CIRCLED LATIN SMALL LETTER V;So;0;L; 0076;;;;N;;;24CB;;24CB +24E6;CIRCLED LATIN SMALL LETTER W;So;0;L; 0077;;;;N;;;24CC;;24CC +24E7;CIRCLED LATIN SMALL LETTER X;So;0;L; 0078;;;;N;;;24CD;;24CD +24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L; 0079;;;;N;;;24CE;;24CE +24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L; 007A;;;;N;;;24CF;;24CF +24EA;CIRCLED DIGIT ZERO;No;0;ON; 0030;;0;0;N;;;;; +24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; +24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; +24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; +24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; +24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; +24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; +24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; +24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; +24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; +24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; +24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; +24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; +24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; +24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; +24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; +24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; +24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; +24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; +24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; +24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;; +2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; +2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; +2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; +2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; +2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; +2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; +2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; +2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; +2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; +2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; +250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; +250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; +250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; +250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; +250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; +250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; +2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; +2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; +2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; +2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; +2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; +2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; +2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; +2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; +2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; +2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; +251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; +251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; +251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; +251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; +251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; +251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; +2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; +2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; +2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; +2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; +2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; +2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; +2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; +2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; +2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; +2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; +252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; +252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; +252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; +252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; +252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; +252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; +2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; +2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; +2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; +2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; +2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; +2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; +2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; +2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; +2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; +2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; +253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; +253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; +253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; +253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; +253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; +253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; +2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; +2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; +2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; +2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; +2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; +2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; +2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; +2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; +2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; +2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; +254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; +254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; +254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; +254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; +254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; +254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; +2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; +2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; +2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; +2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; +2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; +2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; +2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; +2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; +2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; +2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; +255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; +255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; +255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; +255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; +255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; +255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; +2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; +2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; +2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; +2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; +2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; +2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; +2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; +2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; +2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; +2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; +256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; +256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; +256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; +256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; +256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; +256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; +2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; +2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; +2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; +2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; +2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; +2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; +2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; +2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; +2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; +2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; +257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; +257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; +257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; +257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; +257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; +257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; +2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; +2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; +2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2588;FULL BLOCK;So;0;ON;;;;;N;;;;; +2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; +258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; +258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; +2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; +2593;DARK SHADE;So;0;ON;;;;;N;;;;; +2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; +2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; +2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; +2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; +259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; +25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; +25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; +25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; +25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; +25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; +25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; +25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; +25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; +25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; +25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; +25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; +25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; +25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; +25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; +25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; +25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; +25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; +25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; +25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; +25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; +25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; +25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; +25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; +25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; +25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; +25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +25C9;FISHEYE;So;0;ON;;;;;N;;;;; +25CA;LOZENGE;So;0;ON;;;;;N;;;;; +25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; +25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25CE;BULLSEYE;So;0;ON;;;;;N;;;;; +25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; +25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; +25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; +25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; +25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; +25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; +25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; +25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; +25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; +25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; +2601;CLOUD;So;0;ON;;;;;N;;;;; +2602;UMBRELLA;So;0;ON;;;;;N;;;;; +2603;SNOWMAN;So;0;ON;;;;;N;;;;; +2604;COMET;So;0;ON;;;;;N;;;;; +2605;BLACK STAR;So;0;ON;;;;;N;;;;; +2606;WHITE STAR;So;0;ON;;;;;N;;;;; +2607;LIGHTNING;So;0;ON;;;;;N;;;;; +2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; +2609;SUN;So;0;ON;;;;;N;;;;; +260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; +260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; +260C;CONJUNCTION;So;0;ON;;;;;N;;;;; +260D;OPPOSITION;So;0;ON;;;;;N;;;;; +260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; +260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; +2610;BALLOT BOX;So;0;ON;;;;;N;;;;; +2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; +2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; +2613;SALTIRE;So;0;ON;;;;;N;;;;; +2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; +2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; +2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2618;SHAMROCK;So;0;ON;;;;;N;;;;; +2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; +2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; +2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; +2624;CADUCEUS;So;0;ON;;;;;N;;;;; +2625;ANKH;So;0;ON;;;;;N;;;;; +2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; +2627;CHI RHO;So;0;ON;;;;;N;;;;; +2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; +2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; +262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; +262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; +262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; +262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; +262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; +262F;YIN YANG;So;0;ON;;;;;N;;;;; +2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; +2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; +2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; +2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; +2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; +2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; +2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; +2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; +2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; +263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; +263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; +263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; +263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; +263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; +263F;MERCURY;So;0;ON;;;;;N;;;;; +2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; +2641;EARTH;So;0;ON;;;;;N;;;;; +2642;MALE SIGN;So;0;ON;;;;;N;;;;; +2643;JUPITER;So;0;ON;;;;;N;;;;; +2644;SATURN;So;0;ON;;;;;N;;;;; +2645;URANUS;So;0;ON;;;;;N;;;;; +2646;NEPTUNE;So;0;ON;;;;;N;;;;; +2647;PLUTO;So;0;ON;;;;;N;;;;; +2648;ARIES;So;0;ON;;;;;N;;;;; +2649;TAURUS;So;0;ON;;;;;N;;;;; +264A;GEMINI;So;0;ON;;;;;N;;;;; +264B;CANCER;So;0;ON;;;;;N;;;;; +264C;LEO;So;0;ON;;;;;N;;;;; +264D;VIRGO;So;0;ON;;;;;N;;;;; +264E;LIBRA;So;0;ON;;;;;N;;;;; +264F;SCORPIUS;So;0;ON;;;;;N;;;;; +2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; +2651;CAPRICORN;So;0;ON;;;;;N;;;;; +2652;AQUARIUS;So;0;ON;;;;;N;;;;; +2653;PISCES;So;0;ON;;;;;N;;;;; +2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; +2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; +2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; +2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; +2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; +2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; +265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; +265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; +265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; +265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; +265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; +265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; +2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; +2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; +2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; +2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; +2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; +2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; +2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; +2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; +266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; +266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; +266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; +266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; +266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; +266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; +2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;; +2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;; +2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;; +2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;; +2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;; +2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;; +2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;; +267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; +267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; +267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; +2680;DIE FACE-1;So;0;ON;;;;;N;;;;; +2681;DIE FACE-2;So;0;ON;;;;;N;;;;; +2682;DIE FACE-3;So;0;ON;;;;;N;;;;; +2683;DIE FACE-4;So;0;ON;;;;;N;;;;; +2684;DIE FACE-5;So;0;ON;;;;;N;;;;; +2685;DIE FACE-6;So;0;ON;;;;;N;;;;; +2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; +2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; +2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; +268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; +268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; +268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; +268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; +268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; +268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; +2690;WHITE FLAG;So;0;ON;;;;;N;;;;; +2691;BLACK FLAG;So;0;ON;;;;;N;;;;; +2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; +2693;ANCHOR;So;0;ON;;;;;N;;;;; +2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; +2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; +2696;SCALES;So;0;ON;;;;;N;;;;; +2697;ALEMBIC;So;0;ON;;;;;N;;;;; +2698;FLOWER;So;0;ON;;;;;N;;;;; +2699;GEAR;So;0;ON;;;;;N;;;;; +269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; +269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; +269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; +269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;; +269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;; +26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; +26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; +26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; +26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; +26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; +26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; +26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; +26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; +26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; +26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; +26B0;COFFIN;So;0;ON;;;;;N;;;;; +26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; +26B2;NEUTER;So;0;ON;;;;;N;;;;; +26B3;CERES;So;0;ON;;;;;N;;;;; +26B4;PALLAS;So;0;ON;;;;;N;;;;; +26B5;JUNO;So;0;ON;;;;;N;;;;; +26B6;VESTA;So;0;ON;;;;;N;;;;; +26B7;CHIRON;So;0;ON;;;;;N;;;;; +26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; +26B9;SEXTILE;So;0;ON;;;;;N;;;;; +26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; +26BB;QUINCUNX;So;0;ON;;;;;N;;;;; +26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; +26BD;SOCCER BALL;So;0;ON;;;;;N;;;;; +26BE;BASEBALL;So;0;ON;;;;;N;;;;; +26BF;SQUARED KEY;So;0;ON;;;;;N;;;;; +26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;; +26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +26C6;RAIN;So;0;ON;;;;;N;;;;; +26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;; +26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;; +26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;; +26CC;CROSSING LANES;So;0;ON;;;;;N;;;;; +26CD;DISABLED CAR;So;0;ON;;;;;N;;;;; +26CE;OPHIUCHUS;So;0;ON;;;;;N;;;;; +26CF;PICK;So;0;ON;;;;;N;;;;; +26D0;CAR SLIDING;So;0;ON;;;;;N;;;;; +26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;; +26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;; +26D3;CHAINS;So;0;ON;;;;;N;;;;; +26D4;NO ENTRY;So;0;ON;;;;;N;;;;; +26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;; +26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;; +26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;; +26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;; +26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;; +26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;; +26E2;ASTRONOMICAL SYMBOL FOR URANUS;So;0;ON;;;;;N;;;;; +26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;; +26E4;PENTAGRAM;So;0;ON;;;;;N;;;;; +26E5;RIGHT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E6;LEFT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E7;INVERTED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;; +26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;; +26EA;CHURCH;So;0;ON;;;;;N;;;;; +26EB;CASTLE;So;0;ON;;;;;N;;;;; +26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;; +26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;; +26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;; +26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;; +26F0;MOUNTAIN;So;0;ON;;;;;N;;;;; +26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;; +26F2;FOUNTAIN;So;0;ON;;;;;N;;;;; +26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;; +26F4;FERRY;So;0;ON;;;;;N;;;;; +26F5;SAILBOAT;So;0;ON;;;;;N;;;;; +26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;; +26F7;SKIER;So;0;ON;;;;;N;;;;; +26F8;ICE SKATE;So;0;ON;;;;;N;;;;; +26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;; +26FA;TENT;So;0;ON;;;;;N;;;;; +26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;; +26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;; +26FD;FUEL PUMP;So;0;ON;;;;;N;;;;; +26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;; +26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;; +2700;BLACK SAFETY SCISSORS;So;0;ON;;;;;N;;;;; +2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; +2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; +2705;WHITE HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; +2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; +2708;AIRPLANE;So;0;ON;;;;;N;;;;; +2709;ENVELOPE;So;0;ON;;;;;N;;;;; +270A;RAISED FIST;So;0;ON;;;;;N;;;;; +270B;RAISED HAND;So;0;ON;;;;;N;;;;; +270C;VICTORY HAND;So;0;ON;;;;;N;;;;; +270D;WRITING HAND;So;0;ON;;;;;N;;;;; +270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +270F;PENCIL;So;0;ON;;;;;N;;;;; +2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +2711;WHITE NIB;So;0;ON;;;;;N;;;;; +2712;BLACK NIB;So;0;ON;;;;;N;;;;; +2713;CHECK MARK;So;0;ON;;;;;N;;;;; +2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2717;BALLOT X;So;0;ON;;;;;N;;;;; +2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; +2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; +271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; +271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; +271D;LATIN CROSS;So;0;ON;;;;;N;;;;; +271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; +2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; +2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; +2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2728;SPARKLES;So;0;ON;;;;;N;;;;; +2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; +272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; +272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; +272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; +2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; +2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; +2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; +273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; +273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; +273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; +2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; +2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; +2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; +2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; +2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; +2747;SPARKLE;So;0;ON;;;;;N;;;;; +2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; +2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274C;CROSS MARK;So;0;ON;;;;;N;;;;; +274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +274E;NEGATIVE SQUARED CROSS MARK;So;0;ON;;;;;N;;;;; +274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2753;BLACK QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2754;WHITE QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2755;WHITE EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; +2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;; +2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; +2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; +275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; +275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275F;HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2760;HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; +2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; +2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; +2766;FLORAL HEART;So;0;ON;;;;;N;;;;; +2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; +2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; +2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; +2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; +277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; +277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; +277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; +277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; +277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; +277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; +2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; +2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; +2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; +2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; +2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; +2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; +2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; +2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; +278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; +278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; +278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; +278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; +278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; +278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; +2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; +2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; +2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; +2795;HEAVY PLUS SIGN;So;0;ON;;;;;N;;;;; +2796;HEAVY MINUS SIGN;So;0;ON;;;;;N;;;;; +2797;HEAVY DIVISION SIGN;So;0;ON;;;;;N;;;;; +2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; +2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; +279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; +279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; +279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; +279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; +279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; +279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; +27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; +27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; +27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; +27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; +27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; +27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; +27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; +27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; +27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; +27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B0;CURLY LOOP;So;0;ON;;;;;N;;;;; +27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; +27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; +27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; +27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; +27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; +27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; +27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; +27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; +27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +27BF;DOUBLE CURLY LOOP;So;0;ON;;;;;N;;;;; +27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; +27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; +27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; +27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; +27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; +27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; +27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; +27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; +27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; +27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +27CB;MATHEMATICAL RISING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; +27CD;MATHEMATICAL FALLING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CE;SQUARED LOGICAL AND;Sm;0;ON;;;;;N;;;;; +27CF;SQUARED LOGICAL OR;Sm;0;ON;;;;;N;;;;; +27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; +27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; +27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; +27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; +27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; +27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; +27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; +27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; +27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; +27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; +27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; +27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; +27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; +27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; +2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; +2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; +2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; +2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; +2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; +293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; +293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; +2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; +2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; +297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; +297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; +2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; +2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; +2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; +2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; +2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; +2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; +2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; +2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; +298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; +298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; +298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; +298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; +298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; +298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; +2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; +2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; +2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; +2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; +299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; +299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; +299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; +299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; +299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; +29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;N;;;;; +29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; +29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; +29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; +29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; +29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; +29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; +29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; +29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; +29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; +29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; +29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; +29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; +29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; +29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; +29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; +29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; +29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; +29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; +29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; +29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; +29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; +29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; +29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; +29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; +29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; +29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; +29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; +29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; +29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; +29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; +29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; +29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; +29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +29FE;TINY;Sm;0;ON;;;;;N;;;;; +29FF;MINY;Sm;0;ON;;;;;N;;;;; +2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; +2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; +2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; +2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; +2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; +2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; +2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON; 222B 222B 222B 222B;;;;Y;;;;; +2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; +2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; +2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; +2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; +2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; +2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; +2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; +2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; +2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; +2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2A1D;JOIN;Sm;0;ON;;;;;N;;;;; +2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; +2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; +2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; +2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; +2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; +2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; +2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; +2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; +2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; +2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; +2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; +2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; +2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; +2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; +2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; +2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; +2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; +2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; +2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; +2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; +2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A74;DOUBLE COLON EQUAL;Sm;0;ON; 003A 003A 003D;;;;Y;;;;; +2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D;;;;N;;;;; +2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D 003D;;;;N;;;;; +2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; +2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; +2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; +2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; +2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; +2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; +2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; +2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; +2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; +2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; +2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; +2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; +2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;; +2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;; +2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; +2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; +2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; +2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; +2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; +2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; +2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; +2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; +2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; +2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; +2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; +2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; +2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; +2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; +2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; +2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; +2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; +2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4D;DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW;So;0;ON;;;;;N;;;;; +2B4E;SHORT SLANTED NORTH ARROW;So;0;ON;;;;;N;;;;; +2B4F;SHORT BACKSLANTED SOUTH ARROW;So;0;ON;;;;;N;;;;; +2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; +2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; +2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; +2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;; +2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;; +2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;; +2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;; +2B5A;SLANTED NORTH ARROW WITH HOOKED HEAD;So;0;ON;;;;;N;;;;; +2B5B;BACKSLANTED SOUTH ARROW WITH HOOKED TAIL;So;0;ON;;;;;N;;;;; +2B5C;SLANTED NORTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5D;BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5E;BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B5F;SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B60;LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B61;UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B62;RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B63;DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B64;LEFT RIGHT TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B65;UP DOWN TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B66;NORTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B67;NORTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B68;SOUTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B69;SOUTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B6A;LEFTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6B;UPWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6C;RIGHTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6D;DOWNWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6E;CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B6F;ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B70;LEFTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B71;UPWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B72;RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B73;DOWNWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B76;NORTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B77;NORTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B78;SOUTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B79;SOUTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7B;UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7D;DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7E;HORIZONTAL TAB KEY;So;0;ON;;;;;N;;;;; +2B7F;VERTICAL TAB KEY;So;0;ON;;;;;N;;;;; +2B80;LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B81;UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B82;RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B83;DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B84;LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B85;UPWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B86;RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B87;DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B88;LEFTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B89;UPWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8A;RIGHTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8B;DOWNWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8C;ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8D;ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8E;ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8F;ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B90;RETURN LEFT;So;0;ON;;;;;N;;;;; +2B91;RETURN RIGHT;So;0;ON;;;;;N;;;;; +2B92;NEWLINE LEFT;So;0;ON;;;;;N;;;;; +2B93;NEWLINE RIGHT;So;0;ON;;;;;N;;;;; +2B94;FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE;So;0;ON;;;;;N;;;;; +2B95;RIGHTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B96;EQUALS SIGN WITH INFINITY ABOVE;So;0;ON;;;;;N;;;;; +2B97;SYMBOL FOR TYPE A ELECTRONICS;So;0;ON;;;;;N;;;;; +2B98;THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B99;THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9A;THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9B;THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9C;BLACK LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9D;BLACK UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9E;BLACK RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9F;BLACK DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2BA0;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA1;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA2;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA3;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA4;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA5;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA6;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA7;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA8;BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BA9;BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAA;BLACK CURVED UPWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAB;BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAC;BLACK CURVED LEFTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAD;BLACK CURVED RIGHTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAE;BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAF;BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BB0;RIBBON ARROW DOWN LEFT;So;0;ON;;;;;N;;;;; +2BB1;RIBBON ARROW DOWN RIGHT;So;0;ON;;;;;N;;;;; +2BB2;RIBBON ARROW UP LEFT;So;0;ON;;;;;N;;;;; +2BB3;RIBBON ARROW UP RIGHT;So;0;ON;;;;;N;;;;; +2BB4;RIBBON ARROW LEFT UP;So;0;ON;;;;;N;;;;; +2BB5;RIBBON ARROW RIGHT UP;So;0;ON;;;;;N;;;;; +2BB6;RIBBON ARROW LEFT DOWN;So;0;ON;;;;;N;;;;; +2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;; +2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;; +2BBA;OVERLAPPING WHITE SQUARES;So;0;ON;;;;;N;;;;; +2BBB;OVERLAPPING WHITE AND BLACK SQUARES;So;0;ON;;;;;N;;;;; +2BBC;OVERLAPPING BLACK SQUARES;So;0;ON;;;;;N;;;;; +2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;; +2BBE;CIRCLED X;So;0;ON;;;;;N;;;;; +2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;; +2BC0;BLACK SQUARE CENTRED;So;0;ON;;;;;N;;;;; +2BC1;BLACK DIAMOND CENTRED;So;0;ON;;;;;N;;;;; +2BC2;TURNED BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2BC3;HORIZONTAL BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC4;BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC5;BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC9;NEPTUNE FORM TWO;So;0;ON;;;;;N;;;;; +2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCD;ROTATED LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCE;WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; +2BD2;GROUP MARK;So;0;ON;;;;;N;;;;; +2BD3;PLUTO FORM TWO;So;0;ON;;;;;N;;;;; +2BD4;PLUTO FORM THREE;So;0;ON;;;;;N;;;;; +2BD5;PLUTO FORM FOUR;So;0;ON;;;;;N;;;;; +2BD6;PLUTO FORM FIVE;So;0;ON;;;;;N;;;;; +2BD7;TRANSPLUTO;So;0;ON;;;;;N;;;;; +2BD8;PROSERPINA;So;0;ON;;;;;N;;;;; +2BD9;ASTRAEA;So;0;ON;;;;;N;;;;; +2BDA;HYGIEA;So;0;ON;;;;;N;;;;; +2BDB;PHOLUS;So;0;ON;;;;;N;;;;; +2BDC;NESSUS;So;0;ON;;;;;N;;;;; +2BDD;WHITE MOON SELENA;So;0;ON;;;;;N;;;;; +2BDE;BLACK DIAMOND ON CROSS;So;0;ON;;;;;N;;;;; +2BDF;TRUE LIGHT MOON ARTA;So;0;ON;;;;;N;;;;; +2BE0;CUPIDO;So;0;ON;;;;;N;;;;; +2BE1;HADES;So;0;ON;;;;;N;;;;; +2BE2;ZEUS;So;0;ON;;;;;N;;;;; +2BE3;KRONOS;So;0;ON;;;;;N;;;;; +2BE4;APOLLON;So;0;ON;;;;;N;;;;; +2BE5;ADMETOS;So;0;ON;;;;;N;;;;; +2BE6;VULCANUS;So;0;ON;;;;;N;;;;; +2BE7;POSEIDON;So;0;ON;;;;;N;;;;; +2BE8;LEFT HALF BLACK STAR;So;0;ON;;;;;N;;;;; +2BE9;RIGHT HALF BLACK STAR;So;0;ON;;;;;N;;;;; +2BEA;STAR WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2BEB;STAR WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BF0;ERIS FORM ONE;So;0;ON;;;;;N;;;;; +2BF1;ERIS FORM TWO;So;0;ON;;;;;N;;;;; +2BF2;SEDNA;So;0;ON;;;;;N;;;;; +2BF3;RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE;So;0;ON;;;;;N;;;;; +2BF4;RUSSIAN ASTROLOGICAL SYMBOL NOVILE;So;0;ON;;;;;N;;;;; +2BF5;RUSSIAN ASTROLOGICAL SYMBOL QUINTILE;So;0;ON;;;;;N;;;;; +2BF6;RUSSIAN ASTROLOGICAL SYMBOL BINOVILE;So;0;ON;;;;;N;;;;; +2BF7;RUSSIAN ASTROLOGICAL SYMBOL SENTAGON;So;0;ON;;;;;N;;;;; +2BF8;RUSSIAN ASTROLOGICAL SYMBOL TREDECILE;So;0;ON;;;;;N;;;;; +2BF9;EQUALS SIGN WITH INFINITY BELOW;So;0;ON;;;;;N;;;;; +2BFA;UNITED SYMBOL;So;0;ON;;;;;N;;;;; +2BFB;SEPARATED SYMBOL;So;0;ON;;;;;N;;;;; +2BFC;DOUBLED SYMBOL;So;0;ON;;;;;N;;;;; +2BFD;PASSED SYMBOL;So;0;ON;;;;;N;;;;; +2BFE;REVERSED RIGHT ANGLE;So;0;ON;;;;;Y;;;;; +2BFF;HELLSCHREIBER PAUSE SYMBOL;So;0;ON;;;;;N;;;;; +2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; +2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; +2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; +2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; +2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; +2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; +2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; +2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; +2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; +2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; +2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; +2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; +2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; +2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; +2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; +2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; +2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; +2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; +2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; +2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; +2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; +2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; +2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; +2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; +2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; +2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; +2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; +2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; +2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; +2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; +2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; +2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; +2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; +2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; +2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; +2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; +2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; +2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; +2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; +2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; +2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; +2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; +2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; +2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; +2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; +2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; +2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; +2C2F;GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI;Lu;0;L;;;;;N;;;;2C5F; +2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 +2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 +2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 +2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 +2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 +2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 +2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 +2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 +2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 +2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 +2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A +2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B +2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C +2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D +2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E +2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F +2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 +2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 +2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 +2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 +2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 +2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 +2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 +2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 +2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 +2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 +2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A +2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B +2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C +2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D +2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E +2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F +2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 +2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 +2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 +2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 +2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 +2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 +2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 +2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 +2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 +2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 +2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A +2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B +2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C +2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D +2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E +2C5F;GLAGOLITIC SMALL LETTER CAUDATE CHRIVI;Ll;0;L;;;;;N;;;2C2F;;2C2F +2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; +2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 +2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; +2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; +2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; +2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A +2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E +2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; +2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 +2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; +2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 +2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; +2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B +2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; +2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; +2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; +2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252; +2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; +2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; +2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 +2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; +2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; +2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 +2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; +2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; +2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; +2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; +2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; +2C7C;LATIN SUBSCRIPT SMALL LETTER J;Lm;0;L; 006A;;;;N;;;;; +2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L; 0056;;;;N;;;;; +2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F; +2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240; +2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; +2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 +2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; +2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 +2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; +2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 +2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; +2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 +2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; +2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 +2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; +2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A +2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; +2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C +2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; +2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E +2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; +2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 +2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; +2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 +2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; +2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 +2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; +2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 +2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; +2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 +2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; +2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A +2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; +2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C +2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; +2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E +2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; +2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 +2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; +2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 +2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; +2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 +2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; +2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 +2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; +2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 +2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; +2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA +2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; +2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC +2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; +2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE +2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; +2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 +2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; +2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 +2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; +2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 +2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; +2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 +2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; +2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 +2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; +2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA +2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; +2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC +2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; +2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE +2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; +2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 +2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; +2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 +2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; +2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 +2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; +2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 +2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; +2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 +2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; +2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA +2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; +2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC +2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; +2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE +2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; +2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 +2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; +2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 +2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; +2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 +2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; +2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 +2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; +2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 +2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; +2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA +2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; +2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC +2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; +2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE +2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; +2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 +2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; +2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 +2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; +2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; +2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; +2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; +2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; +2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; +2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; +2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC; +2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB +2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE; +2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED +2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;; +2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;; +2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;; +2CF2;COPTIC CAPITAL LETTER BOHAIRIC KHEI;Lu;0;L;;;;;N;;;;2CF3; +2CF3;COPTIC SMALL LETTER BOHAIRIC KHEI;Ll;0;L;;;;;N;;;2CF2;;2CF2 +2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; +2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; +2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; +2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; +2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0 +2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1 +2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2 +2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3 +2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4 +2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5 +2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6 +2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7 +2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8 +2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9 +2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA +2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB +2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC +2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD +2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE +2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF +2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0 +2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1 +2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2 +2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3 +2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4 +2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5 +2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6 +2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7 +2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8 +2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9 +2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA +2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB +2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC +2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD +2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE +2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF +2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0 +2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1 +2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2 +2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3 +2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4 +2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5 +2D27;GEORGIAN SMALL LETTER YN;Ll;0;L;;;;;N;;;10C7;;10C7 +2D2D;GEORGIAN SMALL LETTER AEN;Ll;0;L;;;;;N;;;10CD;;10CD +2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; +2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; +2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; +2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; +2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; +2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; +2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; +2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; +2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; +2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; +2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; +2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; +2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; +2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; +2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; +2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; +2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;; +2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; +2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; +2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; +2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; +2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; +2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; +2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; +2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; +2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; +2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; +2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; +2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; +2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; +2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; +2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; +2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; +2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; +2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; +2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;; +2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; +2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; +2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; +2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; +2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;; +2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; +2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; +2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; +2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; +2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; +2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; +2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; +2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; +2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; +2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; +2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; +2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;; +2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; +2D66;TIFINAGH LETTER YE;Lo;0;L;;;;;N;;;;; +2D67;TIFINAGH LETTER YO;Lo;0;L;;;;;N;;;;; +2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L; 2D61;;;;N;;;;; +2D70;TIFINAGH SEPARATOR MARK;Po;0;L;;;;;N;;;;; +2D7F;TIFINAGH CONSONANT JOINER;Mn;9;NSM;;;;;N;;;;; +2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; +2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; +2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; +2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; +2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; +2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; +2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; +2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; +2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; +2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; +2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; +2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; +2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; +2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; +2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; +2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; +2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; +2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; +2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; +2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; +2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; +2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; +2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; +2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; +2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; +2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; +2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; +2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; +2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; +2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; +2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; +2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; +2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; +2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; +2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; +2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; +2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; +2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; +2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; +2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; +2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; +2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; +2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; +2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; +2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; +2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; +2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; +2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; +2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; +2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; +2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; +2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; +2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; +2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; +2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; +2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; +2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; +2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; +2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; +2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; +2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; +2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; +2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; +2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; +2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; +2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; +2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; +2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; +2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; +2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; +2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; +2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; +2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; +2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; +2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; +2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; +2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; +2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; +2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; +2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; +2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; +2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; +2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; +2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; +2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; +2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; +2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; +2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; +2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; +2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; +2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; +2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; +2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; +2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; +2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; +2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; +2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; +2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; +2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; +2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; +2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; +2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; +2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; +2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; +2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; +2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; +2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; +2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; +2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; +2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; +2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; +2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; +2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; +2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; +2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; +2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; +2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; +2E30;RING POINT;Po;0;ON;;;;;N;;;;; +2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;; +2E32;TURNED COMMA;Po;0;ON;;;;;N;;;;; +2E33;RAISED DOT;Po;0;ON;;;;;N;;;;; +2E34;RAISED COMMA;Po;0;ON;;;;;N;;;;; +2E35;TURNED SEMICOLON;Po;0;ON;;;;;N;;;;; +2E36;DAGGER WITH LEFT GUARD;Po;0;ON;;;;;N;;;;; +2E37;DAGGER WITH RIGHT GUARD;Po;0;ON;;;;;N;;;;; +2E38;TURNED DAGGER;Po;0;ON;;;;;N;;;;; +2E39;TOP HALF SECTION SIGN;Po;0;ON;;;;;N;;;;; +2E3A;TWO-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3B;THREE-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3C;STENOGRAPHIC FULL STOP;Po;0;ON;;;;;N;;;;; +2E3D;VERTICAL SIX DOTS;Po;0;ON;;;;;N;;;;; +2E3E;WIGGLY VERTICAL LINE;Po;0;ON;;;;;N;;;;; +2E3F;CAPITULUM;Po;0;ON;;;;;N;;;;; +2E40;DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E41;REVERSED COMMA;Po;0;ON;;;;;N;;;;; +2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +2E43;DASH WITH LEFT UPTURN;Po;0;ON;;;;;N;;;;; +2E44;DOUBLE SUSPENSION MARK;Po;0;ON;;;;;N;;;;; +2E45;INVERTED LOW KAVYKA;Po;0;ON;;;;;N;;;;; +2E46;INVERTED LOW KAVYKA WITH KAVYKA ABOVE;Po;0;ON;;;;;N;;;;; +2E47;LOW KAVYKA;Po;0;ON;;;;;N;;;;; +2E48;LOW KAVYKA WITH DOT;Po;0;ON;;;;;N;;;;; +2E49;DOUBLE STACKED COMMA;Po;0;ON;;;;;N;;;;; +2E4A;DOTTED SOLIDUS;Po;0;ON;;;;;N;;;;; +2E4B;TRIPLE DAGGER;Po;0;ON;;;;;N;;;;; +2E4C;MEDIEVAL COMMA;Po;0;ON;;;;;N;;;;; +2E4D;PARAGRAPHUS MARK;Po;0;ON;;;;;N;;;;; +2E4E;PUNCTUS ELEVATUS MARK;Po;0;ON;;;;;N;;;;; +2E4F;CORNISH VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2E50;CROSS PATTY WITH RIGHT CROSSBAR;So;0;ON;;;;;N;;;;; +2E51;CROSS PATTY WITH LEFT CROSSBAR;So;0;ON;;;;;N;;;;; +2E52;TIRONIAN SIGN CAPITAL ET;Po;0;ON;;;;;N;;;;; +2E53;MEDIEVAL EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +2E54;MEDIEVAL QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E55;LEFT SQUARE BRACKET WITH STROKE;Ps;0;ON;;;;;Y;;;;; +2E56;RIGHT SQUARE BRACKET WITH STROKE;Pe;0;ON;;;;;Y;;;;; +2E57;LEFT SQUARE BRACKET WITH DOUBLE STROKE;Ps;0;ON;;;;;Y;;;;; +2E58;RIGHT SQUARE BRACKET WITH DOUBLE STROKE;Pe;0;ON;;;;;Y;;;;; +2E59;TOP HALF LEFT PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E5A;TOP HALF RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E5B;BOTTOM HALF LEFT PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E5C;BOTTOM HALF RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E5D;OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; +2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; +2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; +2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; +2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; +2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; +2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; +2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; +2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; +2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; +2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; +2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; +2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; +2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; +2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; +2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; +2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; +2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; +2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; +2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; +2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; +2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; +2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; +2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; +2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; +2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; +2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; +2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; +2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; +2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; +2E9F;CJK RADICAL MOTHER;So;0;ON; 6BCD;;;;N;;;;; +2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; +2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; +2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; +2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; +2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; +2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; +2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; +2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; +2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; +2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; +2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; +2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; +2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; +2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; +2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; +2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; +2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; +2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; +2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; +2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; +2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; +2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; +2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; +2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; +2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; +2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; +2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; +2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; +2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; +2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; +2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; +2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; +2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; +2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; +2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; +2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; +2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; +2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; +2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; +2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; +2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; +2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; +2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; +2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; +2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; +2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; +2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; +2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; +2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; +2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; +2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; +2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; +2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; +2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; +2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; +2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; +2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; +2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; +2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; +2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; +2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; +2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; +2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; +2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; +2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; +2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; +2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; +2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; +2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; +2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; +2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; +2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; +2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; +2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; +2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; +2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; +2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; +2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON; 9F9F;;;;N;;;;; +2F00;KANGXI RADICAL ONE;So;0;ON; 4E00;;;;N;;;;; +2F01;KANGXI RADICAL LINE;So;0;ON; 4E28;;;;N;;;;; +2F02;KANGXI RADICAL DOT;So;0;ON; 4E36;;;;N;;;;; +2F03;KANGXI RADICAL SLASH;So;0;ON; 4E3F;;;;N;;;;; +2F04;KANGXI RADICAL SECOND;So;0;ON; 4E59;;;;N;;;;; +2F05;KANGXI RADICAL HOOK;So;0;ON; 4E85;;;;N;;;;; +2F06;KANGXI RADICAL TWO;So;0;ON; 4E8C;;;;N;;;;; +2F07;KANGXI RADICAL LID;So;0;ON; 4EA0;;;;N;;;;; +2F08;KANGXI RADICAL MAN;So;0;ON; 4EBA;;;;N;;;;; +2F09;KANGXI RADICAL LEGS;So;0;ON; 513F;;;;N;;;;; +2F0A;KANGXI RADICAL ENTER;So;0;ON; 5165;;;;N;;;;; +2F0B;KANGXI RADICAL EIGHT;So;0;ON; 516B;;;;N;;;;; +2F0C;KANGXI RADICAL DOWN BOX;So;0;ON; 5182;;;;N;;;;; +2F0D;KANGXI RADICAL COVER;So;0;ON; 5196;;;;N;;;;; +2F0E;KANGXI RADICAL ICE;So;0;ON; 51AB;;;;N;;;;; +2F0F;KANGXI RADICAL TABLE;So;0;ON; 51E0;;;;N;;;;; +2F10;KANGXI RADICAL OPEN BOX;So;0;ON; 51F5;;;;N;;;;; +2F11;KANGXI RADICAL KNIFE;So;0;ON; 5200;;;;N;;;;; +2F12;KANGXI RADICAL POWER;So;0;ON; 529B;;;;N;;;;; +2F13;KANGXI RADICAL WRAP;So;0;ON; 52F9;;;;N;;;;; +2F14;KANGXI RADICAL SPOON;So;0;ON; 5315;;;;N;;;;; +2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON; 531A;;;;N;;;;; +2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON; 5338;;;;N;;;;; +2F17;KANGXI RADICAL TEN;So;0;ON; 5341;;;;N;;;;; +2F18;KANGXI RADICAL DIVINATION;So;0;ON; 535C;;;;N;;;;; +2F19;KANGXI RADICAL SEAL;So;0;ON; 5369;;;;N;;;;; +2F1A;KANGXI RADICAL CLIFF;So;0;ON; 5382;;;;N;;;;; +2F1B;KANGXI RADICAL PRIVATE;So;0;ON; 53B6;;;;N;;;;; +2F1C;KANGXI RADICAL AGAIN;So;0;ON; 53C8;;;;N;;;;; +2F1D;KANGXI RADICAL MOUTH;So;0;ON; 53E3;;;;N;;;;; +2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON; 56D7;;;;N;;;;; +2F1F;KANGXI RADICAL EARTH;So;0;ON; 571F;;;;N;;;;; +2F20;KANGXI RADICAL SCHOLAR;So;0;ON; 58EB;;;;N;;;;; +2F21;KANGXI RADICAL GO;So;0;ON; 5902;;;;N;;;;; +2F22;KANGXI RADICAL GO SLOWLY;So;0;ON; 590A;;;;N;;;;; +2F23;KANGXI RADICAL EVENING;So;0;ON; 5915;;;;N;;;;; +2F24;KANGXI RADICAL BIG;So;0;ON; 5927;;;;N;;;;; +2F25;KANGXI RADICAL WOMAN;So;0;ON; 5973;;;;N;;;;; +2F26;KANGXI RADICAL CHILD;So;0;ON; 5B50;;;;N;;;;; +2F27;KANGXI RADICAL ROOF;So;0;ON; 5B80;;;;N;;;;; +2F28;KANGXI RADICAL INCH;So;0;ON; 5BF8;;;;N;;;;; +2F29;KANGXI RADICAL SMALL;So;0;ON; 5C0F;;;;N;;;;; +2F2A;KANGXI RADICAL LAME;So;0;ON; 5C22;;;;N;;;;; +2F2B;KANGXI RADICAL CORPSE;So;0;ON; 5C38;;;;N;;;;; +2F2C;KANGXI RADICAL SPROUT;So;0;ON; 5C6E;;;;N;;;;; +2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON; 5C71;;;;N;;;;; +2F2E;KANGXI RADICAL RIVER;So;0;ON; 5DDB;;;;N;;;;; +2F2F;KANGXI RADICAL WORK;So;0;ON; 5DE5;;;;N;;;;; +2F30;KANGXI RADICAL ONESELF;So;0;ON; 5DF1;;;;N;;;;; +2F31;KANGXI RADICAL TURBAN;So;0;ON; 5DFE;;;;N;;;;; +2F32;KANGXI RADICAL DRY;So;0;ON; 5E72;;;;N;;;;; +2F33;KANGXI RADICAL SHORT THREAD;So;0;ON; 5E7A;;;;N;;;;; +2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON; 5E7F;;;;N;;;;; +2F35;KANGXI RADICAL LONG STRIDE;So;0;ON; 5EF4;;;;N;;;;; +2F36;KANGXI RADICAL TWO HANDS;So;0;ON; 5EFE;;;;N;;;;; +2F37;KANGXI RADICAL SHOOT;So;0;ON; 5F0B;;;;N;;;;; +2F38;KANGXI RADICAL BOW;So;0;ON; 5F13;;;;N;;;;; +2F39;KANGXI RADICAL SNOUT;So;0;ON; 5F50;;;;N;;;;; +2F3A;KANGXI RADICAL BRISTLE;So;0;ON; 5F61;;;;N;;;;; +2F3B;KANGXI RADICAL STEP;So;0;ON; 5F73;;;;N;;;;; +2F3C;KANGXI RADICAL HEART;So;0;ON; 5FC3;;;;N;;;;; +2F3D;KANGXI RADICAL HALBERD;So;0;ON; 6208;;;;N;;;;; +2F3E;KANGXI RADICAL DOOR;So;0;ON; 6236;;;;N;;;;; +2F3F;KANGXI RADICAL HAND;So;0;ON; 624B;;;;N;;;;; +2F40;KANGXI RADICAL BRANCH;So;0;ON; 652F;;;;N;;;;; +2F41;KANGXI RADICAL RAP;So;0;ON; 6534;;;;N;;;;; +2F42;KANGXI RADICAL SCRIPT;So;0;ON; 6587;;;;N;;;;; +2F43;KANGXI RADICAL DIPPER;So;0;ON; 6597;;;;N;;;;; +2F44;KANGXI RADICAL AXE;So;0;ON; 65A4;;;;N;;;;; +2F45;KANGXI RADICAL SQUARE;So;0;ON; 65B9;;;;N;;;;; +2F46;KANGXI RADICAL NOT;So;0;ON; 65E0;;;;N;;;;; +2F47;KANGXI RADICAL SUN;So;0;ON; 65E5;;;;N;;;;; +2F48;KANGXI RADICAL SAY;So;0;ON; 66F0;;;;N;;;;; +2F49;KANGXI RADICAL MOON;So;0;ON; 6708;;;;N;;;;; +2F4A;KANGXI RADICAL TREE;So;0;ON; 6728;;;;N;;;;; +2F4B;KANGXI RADICAL LACK;So;0;ON; 6B20;;;;N;;;;; +2F4C;KANGXI RADICAL STOP;So;0;ON; 6B62;;;;N;;;;; +2F4D;KANGXI RADICAL DEATH;So;0;ON; 6B79;;;;N;;;;; +2F4E;KANGXI RADICAL WEAPON;So;0;ON; 6BB3;;;;N;;;;; +2F4F;KANGXI RADICAL DO NOT;So;0;ON; 6BCB;;;;N;;;;; +2F50;KANGXI RADICAL COMPARE;So;0;ON; 6BD4;;;;N;;;;; +2F51;KANGXI RADICAL FUR;So;0;ON; 6BDB;;;;N;;;;; +2F52;KANGXI RADICAL CLAN;So;0;ON; 6C0F;;;;N;;;;; +2F53;KANGXI RADICAL STEAM;So;0;ON; 6C14;;;;N;;;;; +2F54;KANGXI RADICAL WATER;So;0;ON; 6C34;;;;N;;;;; +2F55;KANGXI RADICAL FIRE;So;0;ON; 706B;;;;N;;;;; +2F56;KANGXI RADICAL CLAW;So;0;ON; 722A;;;;N;;;;; +2F57;KANGXI RADICAL FATHER;So;0;ON; 7236;;;;N;;;;; +2F58;KANGXI RADICAL DOUBLE X;So;0;ON; 723B;;;;N;;;;; +2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON; 723F;;;;N;;;;; +2F5A;KANGXI RADICAL SLICE;So;0;ON; 7247;;;;N;;;;; +2F5B;KANGXI RADICAL FANG;So;0;ON; 7259;;;;N;;;;; +2F5C;KANGXI RADICAL COW;So;0;ON; 725B;;;;N;;;;; +2F5D;KANGXI RADICAL DOG;So;0;ON; 72AC;;;;N;;;;; +2F5E;KANGXI RADICAL PROFOUND;So;0;ON; 7384;;;;N;;;;; +2F5F;KANGXI RADICAL JADE;So;0;ON; 7389;;;;N;;;;; +2F60;KANGXI RADICAL MELON;So;0;ON; 74DC;;;;N;;;;; +2F61;KANGXI RADICAL TILE;So;0;ON; 74E6;;;;N;;;;; +2F62;KANGXI RADICAL SWEET;So;0;ON; 7518;;;;N;;;;; +2F63;KANGXI RADICAL LIFE;So;0;ON; 751F;;;;N;;;;; +2F64;KANGXI RADICAL USE;So;0;ON; 7528;;;;N;;;;; +2F65;KANGXI RADICAL FIELD;So;0;ON; 7530;;;;N;;;;; +2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON; 758B;;;;N;;;;; +2F67;KANGXI RADICAL SICKNESS;So;0;ON; 7592;;;;N;;;;; +2F68;KANGXI RADICAL DOTTED TENT;So;0;ON; 7676;;;;N;;;;; +2F69;KANGXI RADICAL WHITE;So;0;ON; 767D;;;;N;;;;; +2F6A;KANGXI RADICAL SKIN;So;0;ON; 76AE;;;;N;;;;; +2F6B;KANGXI RADICAL DISH;So;0;ON; 76BF;;;;N;;;;; +2F6C;KANGXI RADICAL EYE;So;0;ON; 76EE;;;;N;;;;; +2F6D;KANGXI RADICAL SPEAR;So;0;ON; 77DB;;;;N;;;;; +2F6E;KANGXI RADICAL ARROW;So;0;ON; 77E2;;;;N;;;;; +2F6F;KANGXI RADICAL STONE;So;0;ON; 77F3;;;;N;;;;; +2F70;KANGXI RADICAL SPIRIT;So;0;ON; 793A;;;;N;;;;; +2F71;KANGXI RADICAL TRACK;So;0;ON; 79B8;;;;N;;;;; +2F72;KANGXI RADICAL GRAIN;So;0;ON; 79BE;;;;N;;;;; +2F73;KANGXI RADICAL CAVE;So;0;ON; 7A74;;;;N;;;;; +2F74;KANGXI RADICAL STAND;So;0;ON; 7ACB;;;;N;;;;; +2F75;KANGXI RADICAL BAMBOO;So;0;ON; 7AF9;;;;N;;;;; +2F76;KANGXI RADICAL RICE;So;0;ON; 7C73;;;;N;;;;; +2F77;KANGXI RADICAL SILK;So;0;ON; 7CF8;;;;N;;;;; +2F78;KANGXI RADICAL JAR;So;0;ON; 7F36;;;;N;;;;; +2F79;KANGXI RADICAL NET;So;0;ON; 7F51;;;;N;;;;; +2F7A;KANGXI RADICAL SHEEP;So;0;ON; 7F8A;;;;N;;;;; +2F7B;KANGXI RADICAL FEATHER;So;0;ON; 7FBD;;;;N;;;;; +2F7C;KANGXI RADICAL OLD;So;0;ON; 8001;;;;N;;;;; +2F7D;KANGXI RADICAL AND;So;0;ON; 800C;;;;N;;;;; +2F7E;KANGXI RADICAL PLOW;So;0;ON; 8012;;;;N;;;;; +2F7F;KANGXI RADICAL EAR;So;0;ON; 8033;;;;N;;;;; +2F80;KANGXI RADICAL BRUSH;So;0;ON; 807F;;;;N;;;;; +2F81;KANGXI RADICAL MEAT;So;0;ON; 8089;;;;N;;;;; +2F82;KANGXI RADICAL MINISTER;So;0;ON; 81E3;;;;N;;;;; +2F83;KANGXI RADICAL SELF;So;0;ON; 81EA;;;;N;;;;; +2F84;KANGXI RADICAL ARRIVE;So;0;ON; 81F3;;;;N;;;;; +2F85;KANGXI RADICAL MORTAR;So;0;ON; 81FC;;;;N;;;;; +2F86;KANGXI RADICAL TONGUE;So;0;ON; 820C;;;;N;;;;; +2F87;KANGXI RADICAL OPPOSE;So;0;ON; 821B;;;;N;;;;; +2F88;KANGXI RADICAL BOAT;So;0;ON; 821F;;;;N;;;;; +2F89;KANGXI RADICAL STOPPING;So;0;ON; 826E;;;;N;;;;; +2F8A;KANGXI RADICAL COLOR;So;0;ON; 8272;;;;N;;;;; +2F8B;KANGXI RADICAL GRASS;So;0;ON; 8278;;;;N;;;;; +2F8C;KANGXI RADICAL TIGER;So;0;ON; 864D;;;;N;;;;; +2F8D;KANGXI RADICAL INSECT;So;0;ON; 866B;;;;N;;;;; +2F8E;KANGXI RADICAL BLOOD;So;0;ON; 8840;;;;N;;;;; +2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON; 884C;;;;N;;;;; +2F90;KANGXI RADICAL CLOTHES;So;0;ON; 8863;;;;N;;;;; +2F91;KANGXI RADICAL WEST;So;0;ON; 897E;;;;N;;;;; +2F92;KANGXI RADICAL SEE;So;0;ON; 898B;;;;N;;;;; +2F93;KANGXI RADICAL HORN;So;0;ON; 89D2;;;;N;;;;; +2F94;KANGXI RADICAL SPEECH;So;0;ON; 8A00;;;;N;;;;; +2F95;KANGXI RADICAL VALLEY;So;0;ON; 8C37;;;;N;;;;; +2F96;KANGXI RADICAL BEAN;So;0;ON; 8C46;;;;N;;;;; +2F97;KANGXI RADICAL PIG;So;0;ON; 8C55;;;;N;;;;; +2F98;KANGXI RADICAL BADGER;So;0;ON; 8C78;;;;N;;;;; +2F99;KANGXI RADICAL SHELL;So;0;ON; 8C9D;;;;N;;;;; +2F9A;KANGXI RADICAL RED;So;0;ON; 8D64;;;;N;;;;; +2F9B;KANGXI RADICAL RUN;So;0;ON; 8D70;;;;N;;;;; +2F9C;KANGXI RADICAL FOOT;So;0;ON; 8DB3;;;;N;;;;; +2F9D;KANGXI RADICAL BODY;So;0;ON; 8EAB;;;;N;;;;; +2F9E;KANGXI RADICAL CART;So;0;ON; 8ECA;;;;N;;;;; +2F9F;KANGXI RADICAL BITTER;So;0;ON; 8F9B;;;;N;;;;; +2FA0;KANGXI RADICAL MORNING;So;0;ON; 8FB0;;;;N;;;;; +2FA1;KANGXI RADICAL WALK;So;0;ON; 8FB5;;;;N;;;;; +2FA2;KANGXI RADICAL CITY;So;0;ON; 9091;;;;N;;;;; +2FA3;KANGXI RADICAL WINE;So;0;ON; 9149;;;;N;;;;; +2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON; 91C6;;;;N;;;;; +2FA5;KANGXI RADICAL VILLAGE;So;0;ON; 91CC;;;;N;;;;; +2FA6;KANGXI RADICAL GOLD;So;0;ON; 91D1;;;;N;;;;; +2FA7;KANGXI RADICAL LONG;So;0;ON; 9577;;;;N;;;;; +2FA8;KANGXI RADICAL GATE;So;0;ON; 9580;;;;N;;;;; +2FA9;KANGXI RADICAL MOUND;So;0;ON; 961C;;;;N;;;;; +2FAA;KANGXI RADICAL SLAVE;So;0;ON; 96B6;;;;N;;;;; +2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON; 96B9;;;;N;;;;; +2FAC;KANGXI RADICAL RAIN;So;0;ON; 96E8;;;;N;;;;; +2FAD;KANGXI RADICAL BLUE;So;0;ON; 9751;;;;N;;;;; +2FAE;KANGXI RADICAL WRONG;So;0;ON; 975E;;;;N;;;;; +2FAF;KANGXI RADICAL FACE;So;0;ON; 9762;;;;N;;;;; +2FB0;KANGXI RADICAL LEATHER;So;0;ON; 9769;;;;N;;;;; +2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON; 97CB;;;;N;;;;; +2FB2;KANGXI RADICAL LEEK;So;0;ON; 97ED;;;;N;;;;; +2FB3;KANGXI RADICAL SOUND;So;0;ON; 97F3;;;;N;;;;; +2FB4;KANGXI RADICAL LEAF;So;0;ON; 9801;;;;N;;;;; +2FB5;KANGXI RADICAL WIND;So;0;ON; 98A8;;;;N;;;;; +2FB6;KANGXI RADICAL FLY;So;0;ON; 98DB;;;;N;;;;; +2FB7;KANGXI RADICAL EAT;So;0;ON; 98DF;;;;N;;;;; +2FB8;KANGXI RADICAL HEAD;So;0;ON; 9996;;;;N;;;;; +2FB9;KANGXI RADICAL FRAGRANT;So;0;ON; 9999;;;;N;;;;; +2FBA;KANGXI RADICAL HORSE;So;0;ON; 99AC;;;;N;;;;; +2FBB;KANGXI RADICAL BONE;So;0;ON; 9AA8;;;;N;;;;; +2FBC;KANGXI RADICAL TALL;So;0;ON; 9AD8;;;;N;;;;; +2FBD;KANGXI RADICAL HAIR;So;0;ON; 9ADF;;;;N;;;;; +2FBE;KANGXI RADICAL FIGHT;So;0;ON; 9B25;;;;N;;;;; +2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON; 9B2F;;;;N;;;;; +2FC0;KANGXI RADICAL CAULDRON;So;0;ON; 9B32;;;;N;;;;; +2FC1;KANGXI RADICAL GHOST;So;0;ON; 9B3C;;;;N;;;;; +2FC2;KANGXI RADICAL FISH;So;0;ON; 9B5A;;;;N;;;;; +2FC3;KANGXI RADICAL BIRD;So;0;ON; 9CE5;;;;N;;;;; +2FC4;KANGXI RADICAL SALT;So;0;ON; 9E75;;;;N;;;;; +2FC5;KANGXI RADICAL DEER;So;0;ON; 9E7F;;;;N;;;;; +2FC6;KANGXI RADICAL WHEAT;So;0;ON; 9EA5;;;;N;;;;; +2FC7;KANGXI RADICAL HEMP;So;0;ON; 9EBB;;;;N;;;;; +2FC8;KANGXI RADICAL YELLOW;So;0;ON; 9EC3;;;;N;;;;; +2FC9;KANGXI RADICAL MILLET;So;0;ON; 9ECD;;;;N;;;;; +2FCA;KANGXI RADICAL BLACK;So;0;ON; 9ED1;;;;N;;;;; +2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON; 9EF9;;;;N;;;;; +2FCC;KANGXI RADICAL FROG;So;0;ON; 9EFD;;;;N;;;;; +2FCD;KANGXI RADICAL TRIPOD;So;0;ON; 9F0E;;;;N;;;;; +2FCE;KANGXI RADICAL DRUM;So;0;ON; 9F13;;;;N;;;;; +2FCF;KANGXI RADICAL RAT;So;0;ON; 9F20;;;;N;;;;; +2FD0;KANGXI RADICAL NOSE;So;0;ON; 9F3B;;;;N;;;;; +2FD1;KANGXI RADICAL EVEN;So;0;ON; 9F4A;;;;N;;;;; +2FD2;KANGXI RADICAL TOOTH;So;0;ON; 9F52;;;;N;;;;; +2FD3;KANGXI RADICAL DRAGON;So;0;ON; 9F8D;;;;N;;;;; +2FD4;KANGXI RADICAL TURTLE;So;0;ON; 9F9C;;;;N;;;;; +2FD5;KANGXI RADICAL FLUTE;So;0;ON; 9FA0;;;;N;;;;; +2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; +2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; +2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; +2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; +2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; +2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; +2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; +2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; +2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; +2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; +2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; +2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; +2FFC;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM RIGHT;So;0;ON;;;;;N;;;;; +2FFD;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER RIGHT;So;0;ON;;;;;N;;;;; +2FFE;IDEOGRAPHIC DESCRIPTION CHARACTER HORIZONTAL REFLECTION;So;0;ON;;;;;N;;;;; +2FFF;IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION;So;0;ON;;;;;N;;;;; +3000;IDEOGRAPHIC SPACE;Zs;0;WS; 0020;;;;N;;;;; +3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; +3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; +3003;DITTO MARK;Po;0;ON;;;;;N;;;;; +3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; +3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; +3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; +3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; +3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; +300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; +300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; +300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; +300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; +300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; +300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; +3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; +3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; +3012;POSTAL MARK;So;0;ON;;;;;N;;;;; +3013;GETA MARK;So;0;ON;;;;;N;;;;; +3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; +3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; +3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; +3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; +3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; +3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; +301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; +301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; +301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; +301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; +3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; +3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; +3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; +3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; +3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; +3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; +3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; +3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; +3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; +302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; +302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; +302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; +302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; +302E;HANGUL SINGLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +302F;HANGUL DOUBLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; +3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; +3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; +3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; +3036;CIRCLED POSTAL MARK;So;0;ON; 3012;;;;N;;;;; +3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; +3038;HANGZHOU NUMERAL TEN;Nl;0;L; 5341;;;10;N;;;;; +3039;HANGZHOU NUMERAL TWENTY;Nl;0;L; 5344;;;20;N;;;;; +303A;HANGZHOU NUMERAL THIRTY;Nl;0;L; 5345;;;30;N;;;;; +303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +303C;MASU MARK;Lo;0;L;;;;;N;;;;; +303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; +303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; +303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; +3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; +3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; +3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; +3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; +3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; +304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; +304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; +304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; +304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; +304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; +3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; +3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; +3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; +3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; +3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; +3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; +3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; +3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; +3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; +3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; +305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; +305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; +305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; +305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; +305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; +305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; +3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; +3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; +3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; +3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; +3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; +3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; +3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; +3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; +3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; +306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; +306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; +306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; +306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; +306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; +306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; +3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; +3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; +3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; +3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; +3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; +3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; +3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; +3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; +3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; +3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; +307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; +307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; +307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; +307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; +307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; +307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; +3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; +3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; +3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; +3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; +3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; +3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; +3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; +308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; +308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; +308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; +308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; +308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; +3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; +3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; +3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; +3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; +3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; +3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; +309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; +309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON; 0020 3099;;;;N;;;;; +309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON; 0020 309A;;;;N;;;;; +309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; +309F;HIRAGANA DIGRAPH YORI;Lo;0;L; 3088 308A;;;;N;;;;; +30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; +30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; +30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; +30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; +30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; +30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; +30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; +30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; +30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; +30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; +30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; +30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; +30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; +30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; +30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; +30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; +30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; +30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; +30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; +30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; +30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; +30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; +30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; +30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; +30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; +30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; +30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; +30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; +30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; +30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; +30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; +30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; +30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; +30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; +30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; +30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; +30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; +30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; +30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; +30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; +30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; +30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; +30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; +30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; +30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; +30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; +30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; +30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; +30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; +30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; +30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; +30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; +30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; +30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; +30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; +30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; +30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; +30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; +30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; +30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; +30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; +30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; +30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; +30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; +30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; +30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; +30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; +30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; +30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; +30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; +30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; +30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; +30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; +30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; +30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; +30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; +30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; +30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; +30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; +30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; +30FF;KATAKANA DIGRAPH KOTO;Lo;0;L; 30B3 30C8;;;;N;;;;; +3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; +3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; +3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; +3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; +3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; +310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; +310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; +310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; +310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; +310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; +310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; +3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; +3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; +3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; +3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; +3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; +3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; +3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; +3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; +3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; +3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; +311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; +311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; +311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; +311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; +311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; +311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; +3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; +3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; +3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; +3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; +3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; +3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; +3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; +3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; +3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; +3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; +312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; +312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; +312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; +312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; +312E;BOPOMOFO LETTER O WITH DOT ABOVE;Lo;0;L;;;;;N;;;;; +312F;BOPOMOFO LETTER NN;Lo;0;L;;;;;N;;;;; +3131;HANGUL LETTER KIYEOK;Lo;0;L; 1100;;;;N;HANGUL LETTER GIYEOG;;;; +3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L; 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; +3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; +3134;HANGUL LETTER NIEUN;Lo;0;L; 1102;;;;N;;;;; +3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; +3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; +3137;HANGUL LETTER TIKEUT;Lo;0;L; 1103;;;;N;HANGUL LETTER DIGEUD;;;; +3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L; 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; +3139;HANGUL LETTER RIEUL;Lo;0;L; 1105;;;;N;HANGUL LETTER LIEUL;;;; +313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; +313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; +313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; +313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L; 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; +313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; +313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; +3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; +3141;HANGUL LETTER MIEUM;Lo;0;L; 1106;;;;N;;;;; +3142;HANGUL LETTER PIEUP;Lo;0;L; 1107;;;;N;HANGUL LETTER BIEUB;;;; +3143;HANGUL LETTER SSANGPIEUP;Lo;0;L; 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; +3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L; 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; +3145;HANGUL LETTER SIOS;Lo;0;L; 1109;;;;N;;;;; +3146;HANGUL LETTER SSANGSIOS;Lo;0;L; 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; +3147;HANGUL LETTER IEUNG;Lo;0;L; 110B;;;;N;;;;; +3148;HANGUL LETTER CIEUC;Lo;0;L; 110C;;;;N;HANGUL LETTER JIEUJ;;;; +3149;HANGUL LETTER SSANGCIEUC;Lo;0;L; 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; +314A;HANGUL LETTER CHIEUCH;Lo;0;L; 110E;;;;N;HANGUL LETTER CIEUC;;;; +314B;HANGUL LETTER KHIEUKH;Lo;0;L; 110F;;;;N;HANGUL LETTER KIYEOK;;;; +314C;HANGUL LETTER THIEUTH;Lo;0;L; 1110;;;;N;HANGUL LETTER TIEUT;;;; +314D;HANGUL LETTER PHIEUPH;Lo;0;L; 1111;;;;N;HANGUL LETTER PIEUP;;;; +314E;HANGUL LETTER HIEUH;Lo;0;L; 1112;;;;N;;;;; +314F;HANGUL LETTER A;Lo;0;L; 1161;;;;N;;;;; +3150;HANGUL LETTER AE;Lo;0;L; 1162;;;;N;;;;; +3151;HANGUL LETTER YA;Lo;0;L; 1163;;;;N;;;;; +3152;HANGUL LETTER YAE;Lo;0;L; 1164;;;;N;;;;; +3153;HANGUL LETTER EO;Lo;0;L; 1165;;;;N;;;;; +3154;HANGUL LETTER E;Lo;0;L; 1166;;;;N;;;;; +3155;HANGUL LETTER YEO;Lo;0;L; 1167;;;;N;;;;; +3156;HANGUL LETTER YE;Lo;0;L; 1168;;;;N;;;;; +3157;HANGUL LETTER O;Lo;0;L; 1169;;;;N;;;;; +3158;HANGUL LETTER WA;Lo;0;L; 116A;;;;N;;;;; +3159;HANGUL LETTER WAE;Lo;0;L; 116B;;;;N;;;;; +315A;HANGUL LETTER OE;Lo;0;L; 116C;;;;N;;;;; +315B;HANGUL LETTER YO;Lo;0;L; 116D;;;;N;;;;; +315C;HANGUL LETTER U;Lo;0;L; 116E;;;;N;;;;; +315D;HANGUL LETTER WEO;Lo;0;L; 116F;;;;N;;;;; +315E;HANGUL LETTER WE;Lo;0;L; 1170;;;;N;;;;; +315F;HANGUL LETTER WI;Lo;0;L; 1171;;;;N;;;;; +3160;HANGUL LETTER YU;Lo;0;L; 1172;;;;N;;;;; +3161;HANGUL LETTER EU;Lo;0;L; 1173;;;;N;;;;; +3162;HANGUL LETTER YI;Lo;0;L; 1174;;;;N;;;;; +3163;HANGUL LETTER I;Lo;0;L; 1175;;;;N;;;;; +3164;HANGUL FILLER;Lo;0;L; 1160;;;;N;HANGUL CAE OM;;;; +3165;HANGUL LETTER SSANGNIEUN;Lo;0;L; 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; +3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L; 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; +3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L; 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; +3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L; 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; +3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L; 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; +316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L; 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; +316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L; 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; +316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L; 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; +316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L; 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; +316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L; 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; +316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L; 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; +3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L; 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; +3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L; 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; +3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L; 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; +3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L; 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; +3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L; 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; +3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L; 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; +3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L; 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; +3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L; 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; +3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L; 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; +3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L; 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; +317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L; 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; +317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L; 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; +317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L; 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; +317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L; 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; +317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L; 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; +317F;HANGUL LETTER PANSIOS;Lo;0;L; 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; +3180;HANGUL LETTER SSANGIEUNG;Lo;0;L; 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; +3181;HANGUL LETTER YESIEUNG;Lo;0;L; 114C;;;;N;HANGUL LETTER NGIEUNG;;;; +3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L; 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; +3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L; 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; +3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L; 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; +3185;HANGUL LETTER SSANGHIEUH;Lo;0;L; 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; +3186;HANGUL LETTER YEORINHIEUH;Lo;0;L; 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; +3187;HANGUL LETTER YO-YA;Lo;0;L; 1184;;;;N;HANGUL LETTER YOYA;;;; +3188;HANGUL LETTER YO-YAE;Lo;0;L; 1185;;;;N;HANGUL LETTER YOYAE;;;; +3189;HANGUL LETTER YO-I;Lo;0;L; 1188;;;;N;HANGUL LETTER YOI;;;; +318A;HANGUL LETTER YU-YEO;Lo;0;L; 1191;;;;N;HANGUL LETTER YUYEO;;;; +318B;HANGUL LETTER YU-YE;Lo;0;L; 1192;;;;N;HANGUL LETTER YUYE;;;; +318C;HANGUL LETTER YU-I;Lo;0;L; 1194;;;;N;HANGUL LETTER YUI;;;; +318D;HANGUL LETTER ARAEA;Lo;0;L; 119E;;;;N;HANGUL LETTER ALAE A;;;; +318E;HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; +3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;; +3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;; +3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L; 4E00;;;1;N;KAERITEN ITI;;;; +3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L; 4E8C;;;2;N;KAERITEN NI;;;; +3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L; 4E09;;;3;N;KAERITEN SAN;;;; +3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L; 56DB;;;4;N;KAERITEN SI;;;; +3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L; 4E0A;;;;N;KAERITEN ZYOU;;;; +3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L; 4E2D;;;;N;KAERITEN TYUU;;;; +3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L; 4E0B;;;;N;KAERITEN GE;;;; +3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L; 7532;;;;N;KAERITEN KOU;;;; +319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L; 4E59;;;;N;KAERITEN OTU;;;; +319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L; 4E19;;;;N;KAERITEN HEI;;;; +319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L; 4E01;;;;N;KAERITEN TEI;;;; +319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L; 5929;;;;N;KAERITEN TEN;;;; +319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L; 5730;;;;N;KAERITEN TI;;;; +319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L; 4EBA;;;;N;KAERITEN ZIN;;;; +31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; +31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; +31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; +31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; +31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; +31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; +31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; +31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; +31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; +31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; +31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; +31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; +31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; +31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; +31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; +31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; +31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; +31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; +31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; +31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; +31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; +31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; +31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; +31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;; +31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;; +31BA;BOPOMOFO LETTER ZY;Lo;0;L;;;;;N;;;;; +31BB;BOPOMOFO FINAL LETTER G;Lo;0;L;;;;;N;;;;; +31BC;BOPOMOFO LETTER GW;Lo;0;L;;;;;N;;;;; +31BD;BOPOMOFO LETTER KW;Lo;0;L;;;;;N;;;;; +31BE;BOPOMOFO LETTER OE;Lo;0;L;;;;;N;;;;; +31BF;BOPOMOFO LETTER AH;Lo;0;L;;;;;N;;;;; +31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; +31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; +31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; +31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; +31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; +31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; +31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; +31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; +31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; +31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; +31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; +31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; +31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; +31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; +31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; +31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; +31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; +31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; +31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; +31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; +31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; +31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; +31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; +31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; +31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; +31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; +31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; +31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; +31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; +31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; +31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; +31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; +31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; +31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; +31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; +31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; +31E4;CJK STROKE HXG;So;0;ON;;;;;N;;;;; +31E5;CJK STROKE SZP;So;0;ON;;;;;N;;;;; +31EF;IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION;So;0;ON;;;;;N;;;;; +31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; +31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; +31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; +31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; +31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; +31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; +31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; +31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; +31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; +31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; +31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; +31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; +31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; +31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; +31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; +31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; +3200;PARENTHESIZED HANGUL KIYEOK;So;0;L; 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; +3201;PARENTHESIZED HANGUL NIEUN;So;0;L; 0028 1102 0029;;;;N;;;;; +3202;PARENTHESIZED HANGUL TIKEUT;So;0;L; 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; +3203;PARENTHESIZED HANGUL RIEUL;So;0;L; 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; +3204;PARENTHESIZED HANGUL MIEUM;So;0;L; 0028 1106 0029;;;;N;;;;; +3205;PARENTHESIZED HANGUL PIEUP;So;0;L; 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; +3206;PARENTHESIZED HANGUL SIOS;So;0;L; 0028 1109 0029;;;;N;;;;; +3207;PARENTHESIZED HANGUL IEUNG;So;0;L; 0028 110B 0029;;;;N;;;;; +3208;PARENTHESIZED HANGUL CIEUC;So;0;L; 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; +3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L; 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; +320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L; 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; +320B;PARENTHESIZED HANGUL THIEUTH;So;0;L; 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; +320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L; 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; +320D;PARENTHESIZED HANGUL HIEUH;So;0;L; 0028 1112 0029;;;;N;;;;; +320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L; 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; +320F;PARENTHESIZED HANGUL NIEUN A;So;0;L; 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; +3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L; 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; +3211;PARENTHESIZED HANGUL RIEUL A;So;0;L; 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; +3212;PARENTHESIZED HANGUL MIEUM A;So;0;L; 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; +3213;PARENTHESIZED HANGUL PIEUP A;So;0;L; 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; +3214;PARENTHESIZED HANGUL SIOS A;So;0;L; 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; +3215;PARENTHESIZED HANGUL IEUNG A;So;0;L; 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; +3216;PARENTHESIZED HANGUL CIEUC A;So;0;L; 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; +3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L; 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; +3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L; 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; +3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L; 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; +321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L; 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; +321B;PARENTHESIZED HANGUL HIEUH A;So;0;L; 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; +321C;PARENTHESIZED HANGUL CIEUC U;So;0;L; 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; +321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON; 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; +321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON; 0028 110B 1169 1112 116E 0029;;;;N;;;;; +3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L; 0028 4E00 0029;;;1;N;;;;; +3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L; 0028 4E8C 0029;;;2;N;;;;; +3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L; 0028 4E09 0029;;;3;N;;;;; +3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L; 0028 56DB 0029;;;4;N;;;;; +3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L; 0028 4E94 0029;;;5;N;;;;; +3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L; 0028 516D 0029;;;6;N;;;;; +3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L; 0028 4E03 0029;;;7;N;;;;; +3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L; 0028 516B 0029;;;8;N;;;;; +3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L; 0028 4E5D 0029;;;9;N;;;;; +3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L; 0028 5341 0029;;;10;N;;;;; +322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L; 0028 6708 0029;;;;N;;;;; +322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L; 0028 706B 0029;;;;N;;;;; +322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L; 0028 6C34 0029;;;;N;;;;; +322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L; 0028 6728 0029;;;;N;;;;; +322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L; 0028 91D1 0029;;;;N;;;;; +322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L; 0028 571F 0029;;;;N;;;;; +3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L; 0028 65E5 0029;;;;N;;;;; +3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L; 0028 682A 0029;;;;N;;;;; +3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L; 0028 6709 0029;;;;N;;;;; +3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L; 0028 793E 0029;;;;N;;;;; +3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L; 0028 540D 0029;;;;N;;;;; +3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L; 0028 7279 0029;;;;N;;;;; +3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L; 0028 8CA1 0029;;;;N;;;;; +3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L; 0028 795D 0029;;;;N;;;;; +3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L; 0028 52B4 0029;;;;N;;;;; +3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L; 0028 4EE3 0029;;;;N;;;;; +323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L; 0028 547C 0029;;;;N;;;;; +323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L; 0028 5B66 0029;;;;N;;;;; +323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L; 0028 76E3 0029;;;;N;;;;; +323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L; 0028 4F01 0029;;;;N;;;;; +323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L; 0028 8CC7 0029;;;;N;;;;; +323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L; 0028 5354 0029;;;;N;;;;; +3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L; 0028 796D 0029;;;;N;;;;; +3241;PARENTHESIZED IDEOGRAPH REST;So;0;L; 0028 4F11 0029;;;;N;;;;; +3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L; 0028 81EA 0029;;;;N;;;;; +3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L; 0028 81F3 0029;;;;N;;;;; +3244;CIRCLED IDEOGRAPH QUESTION;So;0;L; 554F;;;;N;;;;; +3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L; 5E7C;;;;N;;;;; +3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L; 6587;;;;N;;;;; +3247;CIRCLED IDEOGRAPH KOTO;So;0;L; 7B8F;;;;N;;;;; +3248;CIRCLED NUMBER TEN ON BLACK SQUARE;No;0;L;;;;10;N;;;;; +3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;No;0;L;;;;20;N;;;;; +324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;No;0;L;;;;30;N;;;;; +324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;No;0;L;;;;40;N;;;;; +324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;No;0;L;;;;50;N;;;;; +324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;No;0;L;;;;60;N;;;;; +324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;No;0;L;;;;70;N;;;;; +324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;No;0;L;;;;80;N;;;;; +3250;PARTNERSHIP SIGN;So;0;ON; 0050 0054 0045;;;;N;;;;; +3251;CIRCLED NUMBER TWENTY ONE;No;0;ON; 0032 0031;;;21;N;;;;; +3252;CIRCLED NUMBER TWENTY TWO;No;0;ON; 0032 0032;;;22;N;;;;; +3253;CIRCLED NUMBER TWENTY THREE;No;0;ON; 0032 0033;;;23;N;;;;; +3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON; 0032 0034;;;24;N;;;;; +3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON; 0032 0035;;;25;N;;;;; +3256;CIRCLED NUMBER TWENTY SIX;No;0;ON; 0032 0036;;;26;N;;;;; +3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON; 0032 0037;;;27;N;;;;; +3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON; 0032 0038;;;28;N;;;;; +3259;CIRCLED NUMBER TWENTY NINE;No;0;ON; 0032 0039;;;29;N;;;;; +325A;CIRCLED NUMBER THIRTY;No;0;ON; 0033 0030;;;30;N;;;;; +325B;CIRCLED NUMBER THIRTY ONE;No;0;ON; 0033 0031;;;31;N;;;;; +325C;CIRCLED NUMBER THIRTY TWO;No;0;ON; 0033 0032;;;32;N;;;;; +325D;CIRCLED NUMBER THIRTY THREE;No;0;ON; 0033 0033;;;33;N;;;;; +325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON; 0033 0034;;;34;N;;;;; +325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON; 0033 0035;;;35;N;;;;; +3260;CIRCLED HANGUL KIYEOK;So;0;L; 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; +3261;CIRCLED HANGUL NIEUN;So;0;L; 1102;;;;N;;;;; +3262;CIRCLED HANGUL TIKEUT;So;0;L; 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; +3263;CIRCLED HANGUL RIEUL;So;0;L; 1105;;;;N;CIRCLED HANGUL LIEUL;;;; +3264;CIRCLED HANGUL MIEUM;So;0;L; 1106;;;;N;;;;; +3265;CIRCLED HANGUL PIEUP;So;0;L; 1107;;;;N;CIRCLED HANGUL BIEUB;;;; +3266;CIRCLED HANGUL SIOS;So;0;L; 1109;;;;N;;;;; +3267;CIRCLED HANGUL IEUNG;So;0;L; 110B;;;;N;;;;; +3268;CIRCLED HANGUL CIEUC;So;0;L; 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; +3269;CIRCLED HANGUL CHIEUCH;So;0;L; 110E;;;;N;CIRCLED HANGUL CIEUC;;;; +326A;CIRCLED HANGUL KHIEUKH;So;0;L; 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; +326B;CIRCLED HANGUL THIEUTH;So;0;L; 1110;;;;N;CIRCLED HANGUL TIEUT;;;; +326C;CIRCLED HANGUL PHIEUPH;So;0;L; 1111;;;;N;CIRCLED HANGUL PIEUP;;;; +326D;CIRCLED HANGUL HIEUH;So;0;L; 1112;;;;N;;;;; +326E;CIRCLED HANGUL KIYEOK A;So;0;L; 1100 1161;;;;N;CIRCLED HANGUL GA;;;; +326F;CIRCLED HANGUL NIEUN A;So;0;L; 1102 1161;;;;N;CIRCLED HANGUL NA;;;; +3270;CIRCLED HANGUL TIKEUT A;So;0;L; 1103 1161;;;;N;CIRCLED HANGUL DA;;;; +3271;CIRCLED HANGUL RIEUL A;So;0;L; 1105 1161;;;;N;CIRCLED HANGUL LA;;;; +3272;CIRCLED HANGUL MIEUM A;So;0;L; 1106 1161;;;;N;CIRCLED HANGUL MA;;;; +3273;CIRCLED HANGUL PIEUP A;So;0;L; 1107 1161;;;;N;CIRCLED HANGUL BA;;;; +3274;CIRCLED HANGUL SIOS A;So;0;L; 1109 1161;;;;N;CIRCLED HANGUL SA;;;; +3275;CIRCLED HANGUL IEUNG A;So;0;L; 110B 1161;;;;N;CIRCLED HANGUL A;;;; +3276;CIRCLED HANGUL CIEUC A;So;0;L; 110C 1161;;;;N;CIRCLED HANGUL JA;;;; +3277;CIRCLED HANGUL CHIEUCH A;So;0;L; 110E 1161;;;;N;CIRCLED HANGUL CA;;;; +3278;CIRCLED HANGUL KHIEUKH A;So;0;L; 110F 1161;;;;N;CIRCLED HANGUL KA;;;; +3279;CIRCLED HANGUL THIEUTH A;So;0;L; 1110 1161;;;;N;CIRCLED HANGUL TA;;;; +327A;CIRCLED HANGUL PHIEUPH A;So;0;L; 1111 1161;;;;N;CIRCLED HANGUL PA;;;; +327B;CIRCLED HANGUL HIEUH A;So;0;L; 1112 1161;;;;N;CIRCLED HANGUL HA;;;; +327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON; 110E 1161 11B7 1100 1169;;;;N;;;;; +327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON; 110C 116E 110B 1174;;;;N;;;;; +327E;CIRCLED HANGUL IEUNG U;So;0;ON; 110B 116E;;;;N;;;;; +327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; +3280;CIRCLED IDEOGRAPH ONE;No;0;L; 4E00;;;1;N;;;;; +3281;CIRCLED IDEOGRAPH TWO;No;0;L; 4E8C;;;2;N;;;;; +3282;CIRCLED IDEOGRAPH THREE;No;0;L; 4E09;;;3;N;;;;; +3283;CIRCLED IDEOGRAPH FOUR;No;0;L; 56DB;;;4;N;;;;; +3284;CIRCLED IDEOGRAPH FIVE;No;0;L; 4E94;;;5;N;;;;; +3285;CIRCLED IDEOGRAPH SIX;No;0;L; 516D;;;6;N;;;;; +3286;CIRCLED IDEOGRAPH SEVEN;No;0;L; 4E03;;;7;N;;;;; +3287;CIRCLED IDEOGRAPH EIGHT;No;0;L; 516B;;;8;N;;;;; +3288;CIRCLED IDEOGRAPH NINE;No;0;L; 4E5D;;;9;N;;;;; +3289;CIRCLED IDEOGRAPH TEN;No;0;L; 5341;;;10;N;;;;; +328A;CIRCLED IDEOGRAPH MOON;So;0;L; 6708;;;;N;;;;; +328B;CIRCLED IDEOGRAPH FIRE;So;0;L; 706B;;;;N;;;;; +328C;CIRCLED IDEOGRAPH WATER;So;0;L; 6C34;;;;N;;;;; +328D;CIRCLED IDEOGRAPH WOOD;So;0;L; 6728;;;;N;;;;; +328E;CIRCLED IDEOGRAPH METAL;So;0;L; 91D1;;;;N;;;;; +328F;CIRCLED IDEOGRAPH EARTH;So;0;L; 571F;;;;N;;;;; +3290;CIRCLED IDEOGRAPH SUN;So;0;L; 65E5;;;;N;;;;; +3291;CIRCLED IDEOGRAPH STOCK;So;0;L; 682A;;;;N;;;;; +3292;CIRCLED IDEOGRAPH HAVE;So;0;L; 6709;;;;N;;;;; +3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L; 793E;;;;N;;;;; +3294;CIRCLED IDEOGRAPH NAME;So;0;L; 540D;;;;N;;;;; +3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L; 7279;;;;N;;;;; +3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L; 8CA1;;;;N;;;;; +3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L; 795D;;;;N;;;;; +3298;CIRCLED IDEOGRAPH LABOR;So;0;L; 52B4;;;;N;;;;; +3299;CIRCLED IDEOGRAPH SECRET;So;0;L; 79D8;;;;N;;;;; +329A;CIRCLED IDEOGRAPH MALE;So;0;L; 7537;;;;N;;;;; +329B;CIRCLED IDEOGRAPH FEMALE;So;0;L; 5973;;;;N;;;;; +329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L; 9069;;;;N;;;;; +329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L; 512A;;;;N;;;;; +329E;CIRCLED IDEOGRAPH PRINT;So;0;L; 5370;;;;N;;;;; +329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L; 6CE8;;;;N;;;;; +32A0;CIRCLED IDEOGRAPH ITEM;So;0;L; 9805;;;;N;;;;; +32A1;CIRCLED IDEOGRAPH REST;So;0;L; 4F11;;;;N;;;;; +32A2;CIRCLED IDEOGRAPH COPY;So;0;L; 5199;;;;N;;;;; +32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L; 6B63;;;;N;;;;; +32A4;CIRCLED IDEOGRAPH HIGH;So;0;L; 4E0A;;;;N;;;;; +32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L; 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; +32A6;CIRCLED IDEOGRAPH LOW;So;0;L; 4E0B;;;;N;;;;; +32A7;CIRCLED IDEOGRAPH LEFT;So;0;L; 5DE6;;;;N;;;;; +32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L; 53F3;;;;N;;;;; +32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L; 533B;;;;N;;;;; +32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L; 5B97;;;;N;;;;; +32AB;CIRCLED IDEOGRAPH STUDY;So;0;L; 5B66;;;;N;;;;; +32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L; 76E3;;;;N;;;;; +32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L; 4F01;;;;N;;;;; +32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L; 8CC7;;;;N;;;;; +32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L; 5354;;;;N;;;;; +32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L; 591C;;;;N;;;;; +32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON; 0033 0036;;;36;N;;;;; +32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON; 0033 0037;;;37;N;;;;; +32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON; 0033 0038;;;38;N;;;;; +32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON; 0033 0039;;;39;N;;;;; +32B5;CIRCLED NUMBER FORTY;No;0;ON; 0034 0030;;;40;N;;;;; +32B6;CIRCLED NUMBER FORTY ONE;No;0;ON; 0034 0031;;;41;N;;;;; +32B7;CIRCLED NUMBER FORTY TWO;No;0;ON; 0034 0032;;;42;N;;;;; +32B8;CIRCLED NUMBER FORTY THREE;No;0;ON; 0034 0033;;;43;N;;;;; +32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON; 0034 0034;;;44;N;;;;; +32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON; 0034 0035;;;45;N;;;;; +32BB;CIRCLED NUMBER FORTY SIX;No;0;ON; 0034 0036;;;46;N;;;;; +32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON; 0034 0037;;;47;N;;;;; +32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON; 0034 0038;;;48;N;;;;; +32BE;CIRCLED NUMBER FORTY NINE;No;0;ON; 0034 0039;;;49;N;;;;; +32BF;CIRCLED NUMBER FIFTY;No;0;ON; 0035 0030;;;50;N;;;;; +32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L; 0031 6708;;;;N;;;;; +32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L; 0032 6708;;;;N;;;;; +32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L; 0033 6708;;;;N;;;;; +32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L; 0034 6708;;;;N;;;;; +32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L; 0035 6708;;;;N;;;;; +32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L; 0036 6708;;;;N;;;;; +32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L; 0037 6708;;;;N;;;;; +32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L; 0038 6708;;;;N;;;;; +32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L; 0039 6708;;;;N;;;;; +32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L; 0031 0030 6708;;;;N;;;;; +32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L; 0031 0031 6708;;;;N;;;;; +32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L; 0031 0032 6708;;;;N;;;;; +32CC;SQUARE HG;So;0;ON; 0048 0067;;;;N;;;;; +32CD;SQUARE ERG;So;0;ON; 0065 0072 0067;;;;N;;;;; +32CE;SQUARE EV;So;0;ON; 0065 0056;;;;N;;;;; +32CF;LIMITED LIABILITY SIGN;So;0;ON; 004C 0054 0044;;;;N;;;;; +32D0;CIRCLED KATAKANA A;So;0;L; 30A2;;;;N;;;;; +32D1;CIRCLED KATAKANA I;So;0;L; 30A4;;;;N;;;;; +32D2;CIRCLED KATAKANA U;So;0;L; 30A6;;;;N;;;;; +32D3;CIRCLED KATAKANA E;So;0;L; 30A8;;;;N;;;;; +32D4;CIRCLED KATAKANA O;So;0;L; 30AA;;;;N;;;;; +32D5;CIRCLED KATAKANA KA;So;0;L; 30AB;;;;N;;;;; +32D6;CIRCLED KATAKANA KI;So;0;L; 30AD;;;;N;;;;; +32D7;CIRCLED KATAKANA KU;So;0;L; 30AF;;;;N;;;;; +32D8;CIRCLED KATAKANA KE;So;0;L; 30B1;;;;N;;;;; +32D9;CIRCLED KATAKANA KO;So;0;L; 30B3;;;;N;;;;; +32DA;CIRCLED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; +32DB;CIRCLED KATAKANA SI;So;0;L; 30B7;;;;N;;;;; +32DC;CIRCLED KATAKANA SU;So;0;L; 30B9;;;;N;;;;; +32DD;CIRCLED KATAKANA SE;So;0;L; 30BB;;;;N;;;;; +32DE;CIRCLED KATAKANA SO;So;0;L; 30BD;;;;N;;;;; +32DF;CIRCLED KATAKANA TA;So;0;L; 30BF;;;;N;;;;; +32E0;CIRCLED KATAKANA TI;So;0;L; 30C1;;;;N;;;;; +32E1;CIRCLED KATAKANA TU;So;0;L; 30C4;;;;N;;;;; +32E2;CIRCLED KATAKANA TE;So;0;L; 30C6;;;;N;;;;; +32E3;CIRCLED KATAKANA TO;So;0;L; 30C8;;;;N;;;;; +32E4;CIRCLED KATAKANA NA;So;0;L; 30CA;;;;N;;;;; +32E5;CIRCLED KATAKANA NI;So;0;L; 30CB;;;;N;;;;; +32E6;CIRCLED KATAKANA NU;So;0;L; 30CC;;;;N;;;;; +32E7;CIRCLED KATAKANA NE;So;0;L; 30CD;;;;N;;;;; +32E8;CIRCLED KATAKANA NO;So;0;L; 30CE;;;;N;;;;; +32E9;CIRCLED KATAKANA HA;So;0;L; 30CF;;;;N;;;;; +32EA;CIRCLED KATAKANA HI;So;0;L; 30D2;;;;N;;;;; +32EB;CIRCLED KATAKANA HU;So;0;L; 30D5;;;;N;;;;; +32EC;CIRCLED KATAKANA HE;So;0;L; 30D8;;;;N;;;;; +32ED;CIRCLED KATAKANA HO;So;0;L; 30DB;;;;N;;;;; +32EE;CIRCLED KATAKANA MA;So;0;L; 30DE;;;;N;;;;; +32EF;CIRCLED KATAKANA MI;So;0;L; 30DF;;;;N;;;;; +32F0;CIRCLED KATAKANA MU;So;0;L; 30E0;;;;N;;;;; +32F1;CIRCLED KATAKANA ME;So;0;L; 30E1;;;;N;;;;; +32F2;CIRCLED KATAKANA MO;So;0;L; 30E2;;;;N;;;;; +32F3;CIRCLED KATAKANA YA;So;0;L; 30E4;;;;N;;;;; +32F4;CIRCLED KATAKANA YU;So;0;L; 30E6;;;;N;;;;; +32F5;CIRCLED KATAKANA YO;So;0;L; 30E8;;;;N;;;;; +32F6;CIRCLED KATAKANA RA;So;0;L; 30E9;;;;N;;;;; +32F7;CIRCLED KATAKANA RI;So;0;L; 30EA;;;;N;;;;; +32F8;CIRCLED KATAKANA RU;So;0;L; 30EB;;;;N;;;;; +32F9;CIRCLED KATAKANA RE;So;0;L; 30EC;;;;N;;;;; +32FA;CIRCLED KATAKANA RO;So;0;L; 30ED;;;;N;;;;; +32FB;CIRCLED KATAKANA WA;So;0;L; 30EF;;;;N;;;;; +32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; +32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; +32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; +32FF;SQUARE ERA NAME REIWA;So;0;L; 4EE4 548C;;;;N;;;;; +3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; +3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; +3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; +3303;SQUARE AARU;So;0;L; 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; +3304;SQUARE ININGU;So;0;L; 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; +3305;SQUARE INTI;So;0;L; 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; +3306;SQUARE UON;So;0;L; 30A6 30A9 30F3;;;;N;SQUARED UON;;;; +3307;SQUARE ESUKUUDO;So;0;L; 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; +3308;SQUARE EEKAA;So;0;L; 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; +3309;SQUARE ONSU;So;0;L; 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; +330A;SQUARE OOMU;So;0;L; 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; +330B;SQUARE KAIRI;So;0;L; 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; +330C;SQUARE KARATTO;So;0;L; 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; +330D;SQUARE KARORII;So;0;L; 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; +330E;SQUARE GARON;So;0;L; 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; +330F;SQUARE GANMA;So;0;L; 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; +3310;SQUARE GIGA;So;0;L; 30AE 30AC;;;;N;SQUARED GIGA;;;; +3311;SQUARE GINII;So;0;L; 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; +3312;SQUARE KYURII;So;0;L; 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; +3313;SQUARE GIRUDAA;So;0;L; 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; +3314;SQUARE KIRO;So;0;L; 30AD 30ED;;;;N;SQUARED KIRO;;;; +3315;SQUARE KIROGURAMU;So;0;L; 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; +3316;SQUARE KIROMEETORU;So;0;L; 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; +3317;SQUARE KIROWATTO;So;0;L; 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; +3318;SQUARE GURAMU;So;0;L; 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; +3319;SQUARE GURAMUTON;So;0;L; 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; +331A;SQUARE KURUZEIRO;So;0;L; 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; +331B;SQUARE KUROONE;So;0;L; 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; +331C;SQUARE KEESU;So;0;L; 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; +331D;SQUARE KORUNA;So;0;L; 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; +331E;SQUARE KOOPO;So;0;L; 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; +331F;SQUARE SAIKURU;So;0;L; 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; +3320;SQUARE SANTIIMU;So;0;L; 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; +3321;SQUARE SIRINGU;So;0;L; 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; +3322;SQUARE SENTI;So;0;L; 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; +3323;SQUARE SENTO;So;0;L; 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; +3324;SQUARE DAASU;So;0;L; 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; +3325;SQUARE DESI;So;0;L; 30C7 30B7;;;;N;SQUARED DESI;;;; +3326;SQUARE DORU;So;0;L; 30C9 30EB;;;;N;SQUARED DORU;;;; +3327;SQUARE TON;So;0;L; 30C8 30F3;;;;N;SQUARED TON;;;; +3328;SQUARE NANO;So;0;L; 30CA 30CE;;;;N;SQUARED NANO;;;; +3329;SQUARE NOTTO;So;0;L; 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; +332A;SQUARE HAITU;So;0;L; 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; +332B;SQUARE PAASENTO;So;0;L; 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; +332C;SQUARE PAATU;So;0;L; 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; +332D;SQUARE BAARERU;So;0;L; 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; +332E;SQUARE PIASUTORU;So;0;L; 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; +332F;SQUARE PIKURU;So;0;L; 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; +3330;SQUARE PIKO;So;0;L; 30D4 30B3;;;;N;SQUARED PIKO;;;; +3331;SQUARE BIRU;So;0;L; 30D3 30EB;;;;N;SQUARED BIRU;;;; +3332;SQUARE HUARADDO;So;0;L; 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; +3333;SQUARE HUIITO;So;0;L; 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; +3334;SQUARE BUSSYERU;So;0;L; 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; +3335;SQUARE HURAN;So;0;L; 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; +3336;SQUARE HEKUTAARU;So;0;L; 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; +3337;SQUARE PESO;So;0;L; 30DA 30BD;;;;N;SQUARED PESO;;;; +3338;SQUARE PENIHI;So;0;L; 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; +3339;SQUARE HERUTU;So;0;L; 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; +333A;SQUARE PENSU;So;0;L; 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; +333B;SQUARE PEEZI;So;0;L; 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; +333C;SQUARE BEETA;So;0;L; 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; +333D;SQUARE POINTO;So;0;L; 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; +333E;SQUARE BORUTO;So;0;L; 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; +333F;SQUARE HON;So;0;L; 30DB 30F3;;;;N;SQUARED HON;;;; +3340;SQUARE PONDO;So;0;L; 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; +3341;SQUARE HOORU;So;0;L; 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; +3342;SQUARE HOON;So;0;L; 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; +3343;SQUARE MAIKURO;So;0;L; 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; +3344;SQUARE MAIRU;So;0;L; 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; +3345;SQUARE MAHHA;So;0;L; 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; +3346;SQUARE MARUKU;So;0;L; 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; +3347;SQUARE MANSYON;So;0;L; 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; +3348;SQUARE MIKURON;So;0;L; 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; +3349;SQUARE MIRI;So;0;L; 30DF 30EA;;;;N;SQUARED MIRI;;;; +334A;SQUARE MIRIBAARU;So;0;L; 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; +334B;SQUARE MEGA;So;0;L; 30E1 30AC;;;;N;SQUARED MEGA;;;; +334C;SQUARE MEGATON;So;0;L; 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; +334D;SQUARE MEETORU;So;0;L; 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; +334E;SQUARE YAADO;So;0;L; 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; +334F;SQUARE YAARU;So;0;L; 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; +3350;SQUARE YUAN;So;0;L; 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; +3351;SQUARE RITTORU;So;0;L; 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; +3352;SQUARE RIRA;So;0;L; 30EA 30E9;;;;N;SQUARED RIRA;;;; +3353;SQUARE RUPII;So;0;L; 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; +3354;SQUARE RUUBURU;So;0;L; 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; +3355;SQUARE REMU;So;0;L; 30EC 30E0;;;;N;SQUARED REMU;;;; +3356;SQUARE RENTOGEN;So;0;L; 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; +3357;SQUARE WATTO;So;0;L; 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; +3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L; 0030 70B9;;;;N;;;;; +3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L; 0031 70B9;;;;N;;;;; +335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L; 0032 70B9;;;;N;;;;; +335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L; 0033 70B9;;;;N;;;;; +335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L; 0034 70B9;;;;N;;;;; +335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L; 0035 70B9;;;;N;;;;; +335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L; 0036 70B9;;;;N;;;;; +335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L; 0037 70B9;;;;N;;;;; +3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L; 0038 70B9;;;;N;;;;; +3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L; 0039 70B9;;;;N;;;;; +3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L; 0031 0030 70B9;;;;N;;;;; +3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L; 0031 0031 70B9;;;;N;;;;; +3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L; 0031 0032 70B9;;;;N;;;;; +3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L; 0031 0033 70B9;;;;N;;;;; +3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L; 0031 0034 70B9;;;;N;;;;; +3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L; 0031 0035 70B9;;;;N;;;;; +3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L; 0031 0036 70B9;;;;N;;;;; +3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L; 0031 0037 70B9;;;;N;;;;; +336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L; 0031 0038 70B9;;;;N;;;;; +336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L; 0031 0039 70B9;;;;N;;;;; +336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L; 0032 0030 70B9;;;;N;;;;; +336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L; 0032 0031 70B9;;;;N;;;;; +336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L; 0032 0032 70B9;;;;N;;;;; +336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L; 0032 0033 70B9;;;;N;;;;; +3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L; 0032 0034 70B9;;;;N;;;;; +3371;SQUARE HPA;So;0;L; 0068 0050 0061;;;;N;;;;; +3372;SQUARE DA;So;0;L; 0064 0061;;;;N;;;;; +3373;SQUARE AU;So;0;L; 0041 0055;;;;N;;;;; +3374;SQUARE BAR;So;0;L; 0062 0061 0072;;;;N;;;;; +3375;SQUARE OV;So;0;L; 006F 0056;;;;N;;;;; +3376;SQUARE PC;So;0;L; 0070 0063;;;;N;;;;; +3377;SQUARE DM;So;0;ON; 0064 006D;;;;N;;;;; +3378;SQUARE DM SQUARED;So;0;ON; 0064 006D 00B2;;;;N;;;;; +3379;SQUARE DM CUBED;So;0;ON; 0064 006D 00B3;;;;N;;;;; +337A;SQUARE IU;So;0;ON; 0049 0055;;;;N;;;;; +337B;SQUARE ERA NAME HEISEI;So;0;L; 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; +337C;SQUARE ERA NAME SYOUWA;So;0;L; 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; +337D;SQUARE ERA NAME TAISYOU;So;0;L; 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; +337E;SQUARE ERA NAME MEIZI;So;0;L; 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; +337F;SQUARE CORPORATION;So;0;L; 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; +3380;SQUARE PA AMPS;So;0;L; 0070 0041;;;;N;SQUARED PA AMPS;;;; +3381;SQUARE NA;So;0;L; 006E 0041;;;;N;SQUARED NA;;;; +3382;SQUARE MU A;So;0;L; 03BC 0041;;;;N;SQUARED MU A;;;; +3383;SQUARE MA;So;0;L; 006D 0041;;;;N;SQUARED MA;;;; +3384;SQUARE KA;So;0;L; 006B 0041;;;;N;SQUARED KA;;;; +3385;SQUARE KB;So;0;L; 004B 0042;;;;N;SQUARED KB;;;; +3386;SQUARE MB;So;0;L; 004D 0042;;;;N;SQUARED MB;;;; +3387;SQUARE GB;So;0;L; 0047 0042;;;;N;SQUARED GB;;;; +3388;SQUARE CAL;So;0;L; 0063 0061 006C;;;;N;SQUARED CAL;;;; +3389;SQUARE KCAL;So;0;L; 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; +338A;SQUARE PF;So;0;L; 0070 0046;;;;N;SQUARED PF;;;; +338B;SQUARE NF;So;0;L; 006E 0046;;;;N;SQUARED NF;;;; +338C;SQUARE MU F;So;0;L; 03BC 0046;;;;N;SQUARED MU F;;;; +338D;SQUARE MU G;So;0;L; 03BC 0067;;;;N;SQUARED MU G;;;; +338E;SQUARE MG;So;0;L; 006D 0067;;;;N;SQUARED MG;;;; +338F;SQUARE KG;So;0;L; 006B 0067;;;;N;SQUARED KG;;;; +3390;SQUARE HZ;So;0;L; 0048 007A;;;;N;SQUARED HZ;;;; +3391;SQUARE KHZ;So;0;L; 006B 0048 007A;;;;N;SQUARED KHZ;;;; +3392;SQUARE MHZ;So;0;L; 004D 0048 007A;;;;N;SQUARED MHZ;;;; +3393;SQUARE GHZ;So;0;L; 0047 0048 007A;;;;N;SQUARED GHZ;;;; +3394;SQUARE THZ;So;0;L; 0054 0048 007A;;;;N;SQUARED THZ;;;; +3395;SQUARE MU L;So;0;L; 03BC 2113;;;;N;SQUARED MU L;;;; +3396;SQUARE ML;So;0;L; 006D 2113;;;;N;SQUARED ML;;;; +3397;SQUARE DL;So;0;L; 0064 2113;;;;N;SQUARED DL;;;; +3398;SQUARE KL;So;0;L; 006B 2113;;;;N;SQUARED KL;;;; +3399;SQUARE FM;So;0;L; 0066 006D;;;;N;SQUARED FM;;;; +339A;SQUARE NM;So;0;L; 006E 006D;;;;N;SQUARED NM;;;; +339B;SQUARE MU M;So;0;L; 03BC 006D;;;;N;SQUARED MU M;;;; +339C;SQUARE MM;So;0;L; 006D 006D;;;;N;SQUARED MM;;;; +339D;SQUARE CM;So;0;L; 0063 006D;;;;N;SQUARED CM;;;; +339E;SQUARE KM;So;0;L; 006B 006D;;;;N;SQUARED KM;;;; +339F;SQUARE MM SQUARED;So;0;L; 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; +33A0;SQUARE CM SQUARED;So;0;L; 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; +33A1;SQUARE M SQUARED;So;0;L; 006D 00B2;;;;N;SQUARED M SQUARED;;;; +33A2;SQUARE KM SQUARED;So;0;L; 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; +33A3;SQUARE MM CUBED;So;0;L; 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; +33A4;SQUARE CM CUBED;So;0;L; 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; +33A5;SQUARE M CUBED;So;0;L; 006D 00B3;;;;N;SQUARED M CUBED;;;; +33A6;SQUARE KM CUBED;So;0;L; 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; +33A7;SQUARE M OVER S;So;0;L; 006D 2215 0073;;;;N;SQUARED M OVER S;;;; +33A8;SQUARE M OVER S SQUARED;So;0;L; 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; +33A9;SQUARE PA;So;0;L; 0050 0061;;;;N;SQUARED PA;;;; +33AA;SQUARE KPA;So;0;L; 006B 0050 0061;;;;N;SQUARED KPA;;;; +33AB;SQUARE MPA;So;0;L; 004D 0050 0061;;;;N;SQUARED MPA;;;; +33AC;SQUARE GPA;So;0;L; 0047 0050 0061;;;;N;SQUARED GPA;;;; +33AD;SQUARE RAD;So;0;L; 0072 0061 0064;;;;N;SQUARED RAD;;;; +33AE;SQUARE RAD OVER S;So;0;L; 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; +33AF;SQUARE RAD OVER S SQUARED;So;0;L; 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; +33B0;SQUARE PS;So;0;L; 0070 0073;;;;N;SQUARED PS;;;; +33B1;SQUARE NS;So;0;L; 006E 0073;;;;N;SQUARED NS;;;; +33B2;SQUARE MU S;So;0;L; 03BC 0073;;;;N;SQUARED MU S;;;; +33B3;SQUARE MS;So;0;L; 006D 0073;;;;N;SQUARED MS;;;; +33B4;SQUARE PV;So;0;L; 0070 0056;;;;N;SQUARED PV;;;; +33B5;SQUARE NV;So;0;L; 006E 0056;;;;N;SQUARED NV;;;; +33B6;SQUARE MU V;So;0;L; 03BC 0056;;;;N;SQUARED MU V;;;; +33B7;SQUARE MV;So;0;L; 006D 0056;;;;N;SQUARED MV;;;; +33B8;SQUARE KV;So;0;L; 006B 0056;;;;N;SQUARED KV;;;; +33B9;SQUARE MV MEGA;So;0;L; 004D 0056;;;;N;SQUARED MV MEGA;;;; +33BA;SQUARE PW;So;0;L; 0070 0057;;;;N;SQUARED PW;;;; +33BB;SQUARE NW;So;0;L; 006E 0057;;;;N;SQUARED NW;;;; +33BC;SQUARE MU W;So;0;L; 03BC 0057;;;;N;SQUARED MU W;;;; +33BD;SQUARE MW;So;0;L; 006D 0057;;;;N;SQUARED MW;;;; +33BE;SQUARE KW;So;0;L; 006B 0057;;;;N;SQUARED KW;;;; +33BF;SQUARE MW MEGA;So;0;L; 004D 0057;;;;N;SQUARED MW MEGA;;;; +33C0;SQUARE K OHM;So;0;L; 006B 03A9;;;;N;SQUARED K OHM;;;; +33C1;SQUARE M OHM;So;0;L; 004D 03A9;;;;N;SQUARED M OHM;;;; +33C2;SQUARE AM;So;0;L; 0061 002E 006D 002E;;;;N;SQUARED AM;;;; +33C3;SQUARE BQ;So;0;L; 0042 0071;;;;N;SQUARED BQ;;;; +33C4;SQUARE CC;So;0;L; 0063 0063;;;;N;SQUARED CC;;;; +33C5;SQUARE CD;So;0;L; 0063 0064;;;;N;SQUARED CD;;;; +33C6;SQUARE C OVER KG;So;0;L; 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; +33C7;SQUARE CO;So;0;L; 0043 006F 002E;;;;N;SQUARED CO;;;; +33C8;SQUARE DB;So;0;L; 0064 0042;;;;N;SQUARED DB;;;; +33C9;SQUARE GY;So;0;L; 0047 0079;;;;N;SQUARED GY;;;; +33CA;SQUARE HA;So;0;L; 0068 0061;;;;N;SQUARED HA;;;; +33CB;SQUARE HP;So;0;L; 0048 0050;;;;N;SQUARED HP;;;; +33CC;SQUARE IN;So;0;L; 0069 006E;;;;N;SQUARED IN;;;; +33CD;SQUARE KK;So;0;L; 004B 004B;;;;N;SQUARED KK;;;; +33CE;SQUARE KM CAPITAL;So;0;L; 004B 004D;;;;N;SQUARED KM CAPITAL;;;; +33CF;SQUARE KT;So;0;L; 006B 0074;;;;N;SQUARED KT;;;; +33D0;SQUARE LM;So;0;L; 006C 006D;;;;N;SQUARED LM;;;; +33D1;SQUARE LN;So;0;L; 006C 006E;;;;N;SQUARED LN;;;; +33D2;SQUARE LOG;So;0;L; 006C 006F 0067;;;;N;SQUARED LOG;;;; +33D3;SQUARE LX;So;0;L; 006C 0078;;;;N;SQUARED LX;;;; +33D4;SQUARE MB SMALL;So;0;L; 006D 0062;;;;N;SQUARED MB SMALL;;;; +33D5;SQUARE MIL;So;0;L; 006D 0069 006C;;;;N;SQUARED MIL;;;; +33D6;SQUARE MOL;So;0;L; 006D 006F 006C;;;;N;SQUARED MOL;;;; +33D7;SQUARE PH;So;0;L; 0050 0048;;;;N;SQUARED PH;;;; +33D8;SQUARE PM;So;0;L; 0070 002E 006D 002E;;;;N;SQUARED PM;;;; +33D9;SQUARE PPM;So;0;L; 0050 0050 004D;;;;N;SQUARED PPM;;;; +33DA;SQUARE PR;So;0;L; 0050 0052;;;;N;SQUARED PR;;;; +33DB;SQUARE SR;So;0;L; 0073 0072;;;;N;SQUARED SR;;;; +33DC;SQUARE SV;So;0;L; 0053 0076;;;;N;SQUARED SV;;;; +33DD;SQUARE WB;So;0;L; 0057 0062;;;;N;SQUARED WB;;;; +33DE;SQUARE V OVER M;So;0;ON; 0056 2215 006D;;;;N;;;;; +33DF;SQUARE A OVER M;So;0;ON; 0041 2215 006D;;;;N;;;;; +33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L; 0031 65E5;;;;N;;;;; +33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L; 0032 65E5;;;;N;;;;; +33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L; 0033 65E5;;;;N;;;;; +33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L; 0034 65E5;;;;N;;;;; +33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L; 0035 65E5;;;;N;;;;; +33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L; 0036 65E5;;;;N;;;;; +33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L; 0037 65E5;;;;N;;;;; +33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L; 0038 65E5;;;;N;;;;; +33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L; 0039 65E5;;;;N;;;;; +33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L; 0031 0030 65E5;;;;N;;;;; +33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L; 0031 0031 65E5;;;;N;;;;; +33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L; 0031 0032 65E5;;;;N;;;;; +33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L; 0031 0033 65E5;;;;N;;;;; +33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L; 0031 0034 65E5;;;;N;;;;; +33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L; 0031 0035 65E5;;;;N;;;;; +33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L; 0031 0036 65E5;;;;N;;;;; +33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L; 0031 0037 65E5;;;;N;;;;; +33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L; 0031 0038 65E5;;;;N;;;;; +33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L; 0031 0039 65E5;;;;N;;;;; +33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L; 0032 0030 65E5;;;;N;;;;; +33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L; 0032 0031 65E5;;;;N;;;;; +33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L; 0032 0032 65E5;;;;N;;;;; +33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L; 0032 0033 65E5;;;;N;;;;; +33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L; 0032 0034 65E5;;;;N;;;;; +33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L; 0032 0035 65E5;;;;N;;;;; +33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L; 0032 0036 65E5;;;;N;;;;; +33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L; 0032 0037 65E5;;;;N;;;;; +33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L; 0032 0038 65E5;;;;N;;;;; +33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L; 0032 0039 65E5;;;;N;;;;; +33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L; 0033 0030 65E5;;;;N;;;;; +33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L; 0033 0031 65E5;;;;N;;;;; +33FF;SQUARE GAL;So;0;ON; 0067 0061 006C;;;;N;;;;; +3400;;Lo;0;L;;;;;N;;;;; +4DBF;;Lo;0;L;;;;;N;;;;; +4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;; +4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;; +4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;; +4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; +4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; +4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; +4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; +4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; +4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; +4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; +4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; +4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; +4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; +4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; +4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; +4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; +4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; +4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; +4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; +4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; +4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; +4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; +4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; +4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; +4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; +4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; +4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; +4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; +4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; +4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; +4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; +4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; +4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; +4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; +4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; +4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; +4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; +4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; +4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; +4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; +4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; +4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; +4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; +4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; +4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; +4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; +4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; +4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; +4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; +4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; +4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; +4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; +4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; +4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; +4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; +4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; +4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; +4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; +4E00;;Lo;0;L;;;;;N;;;;; +9FFF;;Lo;0;L;;;;;N;;;;; +A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; +A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; +A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; +A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; +A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; +A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; +A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; +A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; +A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; +A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; +A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; +A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; +A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; +A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; +A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; +A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; +A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; +A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; +A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; +A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; +A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; +A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; +A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; +A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; +A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; +A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; +A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; +A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; +A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; +A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; +A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; +A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; +A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; +A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; +A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; +A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; +A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; +A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; +A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; +A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; +A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; +A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; +A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; +A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; +A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; +A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; +A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; +A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; +A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; +A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; +A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; +A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; +A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; +A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; +A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; +A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; +A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; +A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; +A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; +A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; +A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; +A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; +A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; +A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; +A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; +A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; +A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; +A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; +A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; +A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; +A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; +A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; +A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; +A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; +A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; +A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; +A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; +A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; +A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; +A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; +A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; +A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; +A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; +A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; +A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; +A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; +A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; +A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; +A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; +A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; +A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; +A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; +A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; +A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; +A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; +A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; +A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; +A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; +A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; +A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; +A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; +A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; +A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; +A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; +A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; +A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; +A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; +A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; +A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; +A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; +A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; +A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; +A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; +A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; +A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; +A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; +A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; +A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; +A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; +A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; +A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; +A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; +A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; +A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; +A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; +A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; +A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; +A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; +A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; +A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; +A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; +A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; +A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; +A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; +A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; +A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; +A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; +A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; +A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; +A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; +A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; +A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; +A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; +A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; +A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; +A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; +A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; +A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; +A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; +A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; +A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; +A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; +A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; +A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; +A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; +A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; +A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; +A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; +A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; +A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; +A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; +A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; +A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; +A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; +A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; +A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; +A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; +A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; +A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; +A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; +A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; +A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; +A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; +A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; +A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; +A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; +A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; +A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; +A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; +A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; +A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; +A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; +A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; +A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; +A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; +A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; +A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; +A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; +A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; +A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; +A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; +A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; +A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; +A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; +A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; +A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; +A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; +A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; +A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; +A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; +A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; +A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; +A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; +A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; +A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; +A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; +A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; +A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; +A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; +A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; +A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; +A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; +A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; +A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; +A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; +A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; +A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; +A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; +A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; +A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; +A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; +A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; +A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; +A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; +A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; +A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; +A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; +A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; +A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; +A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; +A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; +A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; +A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; +A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; +A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; +A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; +A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; +A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; +A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; +A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; +A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; +A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; +A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; +A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; +A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; +A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; +A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; +A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; +A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; +A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; +A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; +A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; +A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; +A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; +A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; +A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; +A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; +A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; +A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; +A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; +A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; +A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; +A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; +A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; +A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; +A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; +A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; +A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; +A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; +A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; +A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; +A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; +A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; +A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; +A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; +A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; +A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; +A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; +A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; +A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; +A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; +A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; +A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; +A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; +A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; +A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; +A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; +A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; +A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; +A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; +A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; +A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; +A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; +A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; +A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; +A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; +A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; +A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; +A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; +A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; +A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; +A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; +A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; +A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; +A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; +A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; +A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; +A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; +A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; +A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; +A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; +A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; +A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; +A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; +A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; +A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; +A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; +A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; +A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; +A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; +A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; +A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; +A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; +A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; +A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; +A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; +A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; +A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; +A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; +A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; +A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; +A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; +A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; +A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; +A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; +A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; +A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; +A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; +A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; +A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; +A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; +A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; +A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; +A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; +A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; +A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; +A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; +A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; +A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; +A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; +A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; +A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; +A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; +A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; +A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; +A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; +A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; +A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; +A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; +A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; +A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; +A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; +A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; +A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; +A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; +A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; +A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; +A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; +A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; +A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; +A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; +A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; +A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; +A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; +A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; +A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; +A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; +A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; +A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; +A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; +A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; +A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; +A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; +A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; +A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; +A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; +A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; +A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; +A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; +A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; +A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; +A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; +A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; +A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; +A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; +A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; +A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; +A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; +A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; +A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; +A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; +A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; +A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; +A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; +A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; +A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; +A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; +A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; +A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; +A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; +A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; +A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; +A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; +A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; +A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; +A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; +A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; +A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; +A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; +A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; +A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; +A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; +A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; +A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; +A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; +A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; +A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; +A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; +A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; +A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; +A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; +A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; +A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; +A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; +A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; +A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; +A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; +A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; +A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; +A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; +A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; +A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; +A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; +A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; +A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; +A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; +A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; +A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; +A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; +A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; +A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; +A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; +A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; +A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; +A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; +A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; +A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; +A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; +A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; +A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; +A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; +A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; +A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; +A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; +A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; +A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; +A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; +A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; +A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; +A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; +A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; +A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; +A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; +A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; +A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; +A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; +A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; +A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; +A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; +A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; +A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; +A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; +A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; +A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; +A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; +A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; +A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; +A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; +A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; +A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; +A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; +A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; +A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; +A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; +A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; +A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; +A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; +A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; +A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; +A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; +A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; +A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; +A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; +A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; +A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; +A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; +A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; +A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; +A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; +A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; +A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; +A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; +A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; +A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; +A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; +A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; +A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; +A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; +A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; +A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; +A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; +A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; +A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; +A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; +A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; +A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; +A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; +A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; +A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; +A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; +A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; +A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; +A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; +A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; +A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; +A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; +A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; +A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; +A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; +A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; +A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; +A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; +A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; +A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; +A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; +A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; +A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; +A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; +A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; +A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; +A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; +A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; +A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; +A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; +A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; +A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; +A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; +A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; +A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; +A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; +A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; +A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; +A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; +A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; +A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; +A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; +A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; +A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; +A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; +A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; +A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; +A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; +A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; +A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; +A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; +A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; +A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; +A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; +A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; +A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; +A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; +A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; +A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; +A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; +A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; +A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; +A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; +A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; +A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; +A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; +A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; +A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; +A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; +A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; +A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; +A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; +A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; +A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; +A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; +A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; +A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; +A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; +A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; +A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; +A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; +A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; +A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; +A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; +A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; +A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; +A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; +A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; +A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; +A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; +A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; +A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; +A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; +A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; +A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; +A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; +A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; +A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; +A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; +A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; +A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; +A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; +A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; +A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; +A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; +A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; +A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; +A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; +A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; +A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; +A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; +A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; +A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; +A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; +A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; +A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; +A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; +A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; +A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; +A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; +A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; +A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; +A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; +A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; +A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; +A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; +A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; +A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; +A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; +A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; +A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; +A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; +A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; +A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; +A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; +A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; +A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; +A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; +A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; +A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; +A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; +A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; +A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; +A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; +A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; +A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; +A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; +A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; +A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; +A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; +A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; +A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; +A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; +A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; +A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; +A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; +A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; +A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; +A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; +A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; +A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; +A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; +A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; +A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; +A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; +A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; +A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; +A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; +A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; +A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; +A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; +A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; +A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; +A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; +A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; +A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; +A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; +A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; +A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; +A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; +A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; +A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; +A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; +A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; +A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; +A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; +A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; +A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; +A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; +A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; +A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; +A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; +A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; +A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; +A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; +A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; +A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; +A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; +A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; +A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; +A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; +A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; +A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; +A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; +A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; +A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; +A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; +A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; +A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; +A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; +A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; +A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; +A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; +A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; +A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; +A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; +A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; +A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; +A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; +A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; +A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; +A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; +A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; +A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; +A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; +A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; +A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; +A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; +A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; +A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; +A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; +A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; +A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; +A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; +A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; +A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; +A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; +A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; +A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; +A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; +A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; +A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; +A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; +A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; +A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; +A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; +A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; +A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; +A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; +A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; +A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; +A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; +A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; +A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; +A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; +A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; +A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; +A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; +A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; +A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; +A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; +A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; +A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; +A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; +A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; +A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; +A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; +A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; +A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; +A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; +A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; +A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; +A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; +A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; +A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; +A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; +A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; +A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; +A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; +A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; +A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; +A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; +A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; +A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; +A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; +A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; +A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; +A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; +A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; +A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; +A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; +A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; +A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; +A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; +A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; +A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; +A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; +A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; +A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; +A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; +A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; +A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; +A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; +A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; +A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; +A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; +A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; +A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; +A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; +A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; +A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; +A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; +A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; +A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; +A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; +A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; +A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; +A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; +A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; +A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; +A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; +A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; +A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; +A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; +A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; +A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; +A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; +A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; +A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; +A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; +A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; +A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; +A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; +A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; +A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; +A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; +A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; +A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; +A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; +A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; +A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; +A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; +A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; +A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; +A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; +A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; +A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; +A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; +A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; +A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; +A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; +A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; +A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; +A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; +A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; +A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; +A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; +A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; +A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; +A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; +A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; +A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; +A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; +A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; +A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; +A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; +A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; +A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; +A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; +A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; +A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; +A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; +A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; +A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; +A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; +A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; +A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; +A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; +A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; +A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; +A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; +A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; +A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; +A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; +A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; +A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; +A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; +A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; +A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; +A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; +A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; +A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; +A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; +A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; +A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; +A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; +A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; +A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; +A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; +A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; +A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; +A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; +A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; +A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; +A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; +A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; +A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; +A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; +A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; +A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; +A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; +A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; +A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; +A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; +A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; +A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; +A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; +A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; +A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; +A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; +A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; +A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; +A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; +A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; +A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; +A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; +A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; +A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; +A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; +A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; +A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; +A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; +A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; +A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; +A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; +A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; +A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; +A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; +A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; +A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; +A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; +A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; +A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; +A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; +A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; +A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; +A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; +A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; +A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; +A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; +A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; +A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; +A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; +A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; +A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; +A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; +A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; +A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; +A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; +A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; +A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; +A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; +A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; +A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; +A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; +A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; +A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; +A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; +A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; +A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; +A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; +A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; +A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; +A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; +A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; +A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; +A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; +A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; +A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; +A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; +A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; +A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; +A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; +A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; +A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; +A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; +A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; +A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; +A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; +A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; +A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; +A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; +A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; +A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; +A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; +A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; +A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; +A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; +A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; +A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; +A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; +A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; +A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; +A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; +A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; +A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; +A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; +A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; +A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; +A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; +A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; +A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; +A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; +A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; +A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; +A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; +A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; +A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; +A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; +A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; +A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; +A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; +A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; +A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; +A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; +A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; +A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; +A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; +A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; +A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; +A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; +A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; +A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; +A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; +A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; +A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; +A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; +A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; +A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; +A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; +A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; +A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; +A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; +A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; +A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; +A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; +A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; +A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; +A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; +A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; +A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; +A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; +A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; +A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; +A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; +A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; +A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; +A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; +A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; +A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; +A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;; +A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;; +A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;; +A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;; +A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;; +A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;; +A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;; +A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;; +A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;; +A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;; +A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;; +A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;; +A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;; +A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;; +A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;; +A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;; +A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;; +A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;; +A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;; +A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;; +A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;; +A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;; +A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;; +A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;; +A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;; +A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;; +A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;; +A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;; +A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;; +A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;; +A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;; +A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;; +A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;; +A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;; +A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;; +A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;; +A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;; +A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;; +A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;; +A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;; +A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;; +A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;; +A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;; +A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;; +A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;; +A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;; +A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;; +A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;; +A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; +A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; +A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; +A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; +A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; +A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; +A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; +A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; +A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; +A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; +A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; +A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; +A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; +A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; +A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; +A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; +A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; +A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; +A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; +A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; +A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; +A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; +A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; +A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; +A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; +A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; +A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; +A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; +A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; +A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; +A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; +A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; +A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; +A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; +A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; +A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; +A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; +A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; +A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; +A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; +A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; +A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; +A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; +A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; +A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; +A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; +A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; +A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; +A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; +A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; +A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; +A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; +A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; +A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; +A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; +A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; +A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; +A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; +A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; +A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; +A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; +A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; +A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; +A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; +A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; +A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; +A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; +A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; +A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; +A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; +A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; +A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; +A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; +A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; +A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; +A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; +A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; +A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; +A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; +A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; +A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; +A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; +A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; +A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; +A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; +A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; +A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; +A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; +A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; +A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; +A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; +A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; +A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; +A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; +A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; +A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; +A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; +A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; +A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; +A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; +A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; +A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; +A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; +A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; +A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; +A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; +A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; +A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; +A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; +A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; +A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; +A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; +A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; +A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; +A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; +A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; +A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; +A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; +A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; +A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; +A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; +A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; +A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; +A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; +A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; +A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; +A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; +A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; +A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; +A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; +A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; +A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; +A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; +A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; +A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; +A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; +A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; +A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; +A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; +A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; +A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; +A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; +A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; +A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; +A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; +A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; +A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; +A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; +A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; +A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; +A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; +A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; +A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; +A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; +A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; +A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; +A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; +A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 +A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; +A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 +A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; +A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 +A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; +A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 +A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; +A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 +A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; +A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A +A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; +A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C +A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; +A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E +A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; +A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 +A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; +A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 +A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; +A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 +A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; +A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 +A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; +A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 +A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; +A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A +A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; +A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C +A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; +A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E +A660;CYRILLIC CAPITAL LETTER REVERSED TSE;Lu;0;L;;;;;N;;;;A661; +A661;CYRILLIC SMALL LETTER REVERSED TSE;Ll;0;L;;;;;N;;;A660;;A660 +A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; +A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 +A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; +A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 +A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; +A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 +A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; +A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 +A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; +A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A +A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; +A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C +A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; +A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; +A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; +A674;COMBINING CYRILLIC LETTER UKRAINIAN IE;Mn;230;NSM;;;;;N;;;;; +A675;COMBINING CYRILLIC LETTER I;Mn;230;NSM;;;;;N;;;;; +A676;COMBINING CYRILLIC LETTER YI;Mn;230;NSM;;;;;N;;;;; +A677;COMBINING CYRILLIC LETTER U;Mn;230;NSM;;;;;N;;;;; +A678;COMBINING CYRILLIC LETTER HARD SIGN;Mn;230;NSM;;;;;N;;;;; +A679;COMBINING CYRILLIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; +A67A;COMBINING CYRILLIC LETTER SOFT SIGN;Mn;230;NSM;;;;;N;;;;; +A67B;COMBINING CYRILLIC LETTER OMEGA;Mn;230;NSM;;;;;N;;;;; +A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; +A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; +A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; +A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; +A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; +A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 +A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; +A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 +A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; +A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 +A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; +A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 +A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; +A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 +A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; +A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A +A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; +A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C +A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; +A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E +A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; +A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 +A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; +A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 +A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; +A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 +A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; +A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 +A698;CYRILLIC CAPITAL LETTER DOUBLE O;Lu;0;L;;;;;N;;;;A699; +A699;CYRILLIC SMALL LETTER DOUBLE O;Ll;0;L;;;;;N;;;A698;;A698 +A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; +A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A +A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L; 044A;;;;N;;;;; +A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L; 044C;;;;N;;;;; +A69E;COMBINING CYRILLIC LETTER EF;Mn;230;NSM;;;;;N;;;;; +A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; +A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; +A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; +A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;; +A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;; +A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;; +A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;; +A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;; +A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;; +A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;; +A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;; +A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;; +A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;; +A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;; +A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;; +A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;; +A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;; +A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;; +A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;; +A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;; +A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;; +A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;; +A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;; +A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;; +A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;; +A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;; +A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;; +A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;; +A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;; +A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;; +A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;; +A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;; +A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;; +A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;; +A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;; +A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;; +A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;; +A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;; +A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;; +A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;; +A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;; +A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;; +A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;; +A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;; +A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;; +A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;; +A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;; +A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;; +A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;; +A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;; +A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;; +A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;; +A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;; +A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;; +A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;; +A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;; +A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;; +A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;; +A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;; +A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;; +A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;; +A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;; +A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;; +A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;; +A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;; +A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;; +A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;; +A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;; +A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;; +A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;; +A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;; +A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;; +A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;; +A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;; +A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;; +A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;; +A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;; +A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;; +A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;; +A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;; +A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;; +A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;; +A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;; +A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;; +A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;; +A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;; +A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;; +A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;; +A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;; +A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; +A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; +A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; +A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; +A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; +A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; +A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; +A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; +A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; +A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; +A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; +A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; +A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; +A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; +A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; +A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; +A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; +A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 +A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; +A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 +A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; +A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 +A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; +A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 +A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; +A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A +A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; +A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C +A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; +A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E +A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; +A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; +A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; +A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 +A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; +A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 +A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; +A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 +A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; +A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 +A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; +A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A +A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; +A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C +A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; +A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E +A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; +A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 +A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; +A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 +A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; +A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 +A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; +A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 +A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; +A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 +A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; +A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A +A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; +A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C +A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; +A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E +A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; +A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 +A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; +A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 +A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; +A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 +A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; +A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 +A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; +A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 +A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; +A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A +A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; +A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C +A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; +A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E +A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; +A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 +A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; +A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 +A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; +A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 +A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; +A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 +A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; +A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 +A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; +A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A +A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; +A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C +A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; +A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E +A770;MODIFIER LETTER US;Lm;0;L; A76F;;;;N;;;;; +A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; +A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; +A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; +A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; +A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; +A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; +A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; +A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; +A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; +A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 +A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; +A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B +A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; +A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; +A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E +A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; +A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 +A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; +A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 +A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; +A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 +A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; +A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 +A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; +A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; +A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; +A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; +A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B +A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; +A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; +A78F;LATIN LETTER SINOLOGICAL DOT;Lo;0;L;;;;;N;;;;; +A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; +A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 +A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; +A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792 +A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;A7C4;;A7C4 +A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797; +A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796 +A798;LATIN CAPITAL LETTER F WITH STROKE;Lu;0;L;;;;;N;;;;A799; +A799;LATIN SMALL LETTER F WITH STROKE;Ll;0;L;;;;;N;;;A798;;A798 +A79A;LATIN CAPITAL LETTER VOLAPUK AE;Lu;0;L;;;;;N;;;;A79B; +A79B;LATIN SMALL LETTER VOLAPUK AE;Ll;0;L;;;;;N;;;A79A;;A79A +A79C;LATIN CAPITAL LETTER VOLAPUK OE;Lu;0;L;;;;;N;;;;A79D; +A79D;LATIN SMALL LETTER VOLAPUK OE;Ll;0;L;;;;;N;;;A79C;;A79C +A79E;LATIN CAPITAL LETTER VOLAPUK UE;Lu;0;L;;;;;N;;;;A79F; +A79F;LATIN SMALL LETTER VOLAPUK UE;Ll;0;L;;;;;N;;;A79E;;A79E +A7A0;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A1; +A7A1;LATIN SMALL LETTER G WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A0;;A7A0 +A7A2;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A3; +A7A3;LATIN SMALL LETTER K WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A2;;A7A2 +A7A4;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A5; +A7A5;LATIN SMALL LETTER N WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A4;;A7A4 +A7A6;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A7; +A7A7;LATIN SMALL LETTER R WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A6;;A7A6 +A7A8;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A9; +A7A9;LATIN SMALL LETTER S WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A8;;A7A8 +A7AA;LATIN CAPITAL LETTER H WITH HOOK;Lu;0;L;;;;;N;;;;0266; +A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C; +A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; +A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; +A7AE;LATIN CAPITAL LETTER SMALL CAPITAL I;Lu;0;L;;;;;N;;;;026A; +A7AF;LATIN LETTER SMALL CAPITAL Q;Ll;0;L;;;;;N;;;;; +A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; +A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; +A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D; +A7B3;LATIN CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;AB53; +A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5; +A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4 +A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7; +A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6 +A7B8;LATIN CAPITAL LETTER U WITH STROKE;Lu;0;L;;;;;N;;;;A7B9; +A7B9;LATIN SMALL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;A7B8;;A7B8 +A7BA;LATIN CAPITAL LETTER GLOTTAL A;Lu;0;L;;;;;N;;;;A7BB; +A7BB;LATIN SMALL LETTER GLOTTAL A;Ll;0;L;;;;;N;;;A7BA;;A7BA +A7BC;LATIN CAPITAL LETTER GLOTTAL I;Lu;0;L;;;;;N;;;;A7BD; +A7BD;LATIN SMALL LETTER GLOTTAL I;Ll;0;L;;;;;N;;;A7BC;;A7BC +A7BE;LATIN CAPITAL LETTER GLOTTAL U;Lu;0;L;;;;;N;;;;A7BF; +A7BF;LATIN SMALL LETTER GLOTTAL U;Ll;0;L;;;;;N;;;A7BE;;A7BE +A7C0;LATIN CAPITAL LETTER OLD POLISH O;Lu;0;L;;;;;N;;;;A7C1; +A7C1;LATIN SMALL LETTER OLD POLISH O;Ll;0;L;;;;;N;;;A7C0;;A7C0 +A7C2;LATIN CAPITAL LETTER ANGLICANA W;Lu;0;L;;;;;N;;;;A7C3; +A7C3;LATIN SMALL LETTER ANGLICANA W;Ll;0;L;;;;;N;;;A7C2;;A7C2 +A7C4;LATIN CAPITAL LETTER C WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;A794; +A7C5;LATIN CAPITAL LETTER S WITH HOOK;Lu;0;L;;;;;N;;;;0282; +A7C6;LATIN CAPITAL LETTER Z WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;1D8E; +A7C7;LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY;Lu;0;L;;;;;N;;;;A7C8; +A7C8;LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY;Ll;0;L;;;;;N;;;A7C7;;A7C7 +A7C9;LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY;Lu;0;L;;;;;N;;;;A7CA; +A7CA;LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY;Ll;0;L;;;;;N;;;A7C9;;A7C9 +A7CB;LATIN CAPITAL LETTER RAMS HORN;Lu;0;L;;;;;N;;;;0264; +A7CC;LATIN CAPITAL LETTER S WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A7CD; +A7CD;LATIN SMALL LETTER S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A7CC;;A7CC +A7CE;LATIN CAPITAL LETTER PHARYNGEAL VOICED FRICATIVE;Lu;0;L;;;;;N;;;;A7CF; +A7CF;LATIN SMALL LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;;;A7CE;;A7CE +A7D0;LATIN CAPITAL LETTER CLOSED INSULAR G;Lu;0;L;;;;;N;;;;A7D1; +A7D1;LATIN SMALL LETTER CLOSED INSULAR G;Ll;0;L;;;;;N;;;A7D0;;A7D0 +A7D2;LATIN CAPITAL LETTER DOUBLE THORN;Lu;0;L;;;;;N;;;;A7D3; +A7D3;LATIN SMALL LETTER DOUBLE THORN;Ll;0;L;;;;;N;;;A7D2;;A7D2 +A7D4;LATIN CAPITAL LETTER DOUBLE WYNN;Lu;0;L;;;;;N;;;;A7D5; +A7D5;LATIN SMALL LETTER DOUBLE WYNN;Ll;0;L;;;;;N;;;A7D4;;A7D4 +A7D6;LATIN CAPITAL LETTER MIDDLE SCOTS S;Lu;0;L;;;;;N;;;;A7D7; +A7D7;LATIN SMALL LETTER MIDDLE SCOTS S;Ll;0;L;;;;;N;;;A7D6;;A7D6 +A7D8;LATIN CAPITAL LETTER SIGMOID S;Lu;0;L;;;;;N;;;;A7D9; +A7D9;LATIN SMALL LETTER SIGMOID S;Ll;0;L;;;;;N;;;A7D8;;A7D8 +A7DA;LATIN CAPITAL LETTER LAMBDA;Lu;0;L;;;;;N;;;;A7DB; +A7DB;LATIN SMALL LETTER LAMBDA;Ll;0;L;;;;;N;;;A7DA;;A7DA +A7DC;LATIN CAPITAL LETTER LAMBDA WITH STROKE;Lu;0;L;;;;;N;;;;019B; +A7F1;MODIFIER LETTER CAPITAL S;Lm;0;L; 0053;;;;N;;;;; +A7F2;MODIFIER LETTER CAPITAL C;Lm;0;L; 0043;;;;N;;;;; +A7F3;MODIFIER LETTER CAPITAL F;Lm;0;L; 0046;;;;N;;;;; +A7F4;MODIFIER LETTER CAPITAL Q;Lm;0;L; 0051;;;;N;;;;; +A7F5;LATIN CAPITAL LETTER REVERSED HALF H;Lu;0;L;;;;;N;;;;A7F6; +A7F6;LATIN SMALL LETTER REVERSED HALF H;Ll;0;L;;;;;N;;;A7F5;;A7F5 +A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;; +A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L; 0126;;;;N;;;;; +A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L; 0153;;;;N;;;;; +A7FA;LATIN LETTER SMALL CAPITAL TURNED M;Ll;0;L;;;;;N;;;;; +A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; +A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; +A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; +A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; +A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; +A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; +A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; +A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; +A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; +A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; +A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; +A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; +A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; +A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; +A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; +A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; +A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; +A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; +A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; +A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; +A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; +A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; +A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; +A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; +A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; +A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; +A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; +A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; +A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; +A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; +A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; +A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; +A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; +A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; +A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; +A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; +A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; +A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; +A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; +A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; +A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; +A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; +A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; +A82C;SYLOTI NAGRI SIGN ALTERNATE HASANTA;Mn;9;NSM;;;;;N;;;;; +A830;NORTH INDIC FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +A831;NORTH INDIC FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +A832;NORTH INDIC FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;; +A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;; +A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;; +A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;; +A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; +A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; +A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; +A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; +A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; +A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; +A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; +A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; +A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; +A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; +A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; +A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; +A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; +A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; +A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; +A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; +A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; +A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; +A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; +A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; +A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; +A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; +A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; +A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; +A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; +A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; +A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; +A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; +A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; +A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; +A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; +A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; +A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; +A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; +A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; +A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; +A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; +A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; +A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; +A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; +A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; +A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; +A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; +A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; +A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; +A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; +A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; +A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; +A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; +A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; +A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; +A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; +A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; +A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; +A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; +A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; +A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; +A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; +A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; +A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; +A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; +A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; +A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; +A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; +A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; +A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; +A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; +A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; +A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; +A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; +A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; +A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; +A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; +A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; +A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; +A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; +A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; +A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; +A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; +A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; +A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; +A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; +A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; +A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; +A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; +A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; +A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; +A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; +A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; +A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; +A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; +A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; +A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; +A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; +A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; +A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; +A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; +A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +A8C5;SAURASHTRA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; +A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;; +A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;; +A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;; +A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;; +A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;; +A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;; +A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;; +A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;; +A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;; +A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;; +A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;; +A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; +A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;; +A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;; +A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;; +A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; +A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; +A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; +A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;; +A8FE;DEVANAGARI LETTER AY;Lo;0;L;;;;;N;;;;; +A8FF;DEVANAGARI VOWEL SIGN AY;Mn;0;NSM;;;;;N;;;;; +A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; +A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; +A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; +A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; +A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; +A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; +A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; +A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; +A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; +A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; +A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; +A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; +A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; +A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; +A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; +A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; +A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; +A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; +A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; +A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; +A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; +A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; +A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; +A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; +A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; +A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; +A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; +A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; +A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; +A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; +A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; +A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; +A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; +A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; +A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; +A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; +A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; +A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; +A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; +A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; +A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; +A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; +A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; +A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; +A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; +A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; +A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; +A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; +A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; +A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; +A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; +A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; +A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; +A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; +A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; +A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; +A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; +A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; +A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; +A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; +A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; +A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; +A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; +A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;; +A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;; +A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;; +A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;; +A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;; +A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;; +A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;; +A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;; +A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;; +A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;; +A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;; +A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;; +A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;; +A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;; +A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;; +A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;; +A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;; +A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;; +A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;; +A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;; +A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;; +A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;; +A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;; +A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;; +A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;; +A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;; +A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;; +A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;; +A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;; +A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;; +A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;; +A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;; +A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;; +A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;; +A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;; +A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;; +A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;; +A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;; +A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;; +A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;; +A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;; +A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;; +A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;; +A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;; +A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;; +A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;; +A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;; +A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;; +A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;; +A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;; +A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;; +A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;; +A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;; +A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;; +A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;; +A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;; +A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;; +A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;; +A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;; +A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;; +A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;; +A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +A9BD;JAVANESE CONSONANT SIGN KERET;Mn;0;NSM;;;;;N;;;;; +A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;; +A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;; +A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;; +A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;; +A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;; +A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;; +A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;; +A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;; +A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;; +A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;; +A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;; +A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;; +A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;; +A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;; +A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;; +A9E0;MYANMAR LETTER SHAN GHA;Lo;0;L;;;;;N;;;;; +A9E1;MYANMAR LETTER SHAN CHA;Lo;0;L;;;;;N;;;;; +A9E2;MYANMAR LETTER SHAN JHA;Lo;0;L;;;;;N;;;;; +A9E3;MYANMAR LETTER SHAN NNA;Lo;0;L;;;;;N;;;;; +A9E4;MYANMAR LETTER SHAN BHA;Lo;0;L;;;;;N;;;;; +A9E5;MYANMAR SIGN SHAN SAW;Mn;0;NSM;;;;;N;;;;; +A9E6;MYANMAR MODIFIER LETTER SHAN REDUPLICATION;Lm;0;L;;;;;N;;;;; +A9E7;MYANMAR LETTER TAI LAING NYA;Lo;0;L;;;;;N;;;;; +A9E8;MYANMAR LETTER TAI LAING FA;Lo;0;L;;;;;N;;;;; +A9E9;MYANMAR LETTER TAI LAING GA;Lo;0;L;;;;;N;;;;; +A9EA;MYANMAR LETTER TAI LAING GHA;Lo;0;L;;;;;N;;;;; +A9EB;MYANMAR LETTER TAI LAING JA;Lo;0;L;;;;;N;;;;; +A9EC;MYANMAR LETTER TAI LAING JHA;Lo;0;L;;;;;N;;;;; +A9ED;MYANMAR LETTER TAI LAING DDA;Lo;0;L;;;;;N;;;;; +A9EE;MYANMAR LETTER TAI LAING DDHA;Lo;0;L;;;;;N;;;;; +A9EF;MYANMAR LETTER TAI LAING NNA;Lo;0;L;;;;;N;;;;; +A9F0;MYANMAR TAI LAING DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9F1;MYANMAR TAI LAING DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9F2;MYANMAR TAI LAING DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9F3;MYANMAR TAI LAING DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9F4;MYANMAR TAI LAING DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9F5;MYANMAR TAI LAING DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9F6;MYANMAR TAI LAING DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9F7;MYANMAR TAI LAING DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9F8;MYANMAR TAI LAING DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9F9;MYANMAR TAI LAING DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9FA;MYANMAR LETTER TAI LAING LLA;Lo;0;L;;;;;N;;;;; +A9FB;MYANMAR LETTER TAI LAING DA;Lo;0;L;;;;;N;;;;; +A9FC;MYANMAR LETTER TAI LAING DHA;Lo;0;L;;;;;N;;;;; +A9FD;MYANMAR LETTER TAI LAING BA;Lo;0;L;;;;;N;;;;; +A9FE;MYANMAR LETTER TAI LAING BHA;Lo;0;L;;;;;N;;;;; +AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; +AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; +AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; +AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; +AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; +AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; +AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; +AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; +AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; +AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; +AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; +AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; +AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; +AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; +AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; +AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; +AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; +AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; +AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; +AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; +AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; +AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; +AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; +AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; +AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; +AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; +AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; +AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; +AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; +AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; +AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; +AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; +AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; +AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; +AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; +AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; +AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; +AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; +AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; +AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; +AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; +AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; +AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; +AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; +AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; +AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; +AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; +AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; +AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; +AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; +AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; +AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;; +AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;; +AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;; +AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;; +AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;; +AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;; +AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;; +AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;; +AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;; +AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;; +AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;; +AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;; +AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;; +AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;; +AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;; +AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;; +AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;; +AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;; +AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;; +AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;; +AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;; +AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;; +AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;; +AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;; +AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;; +AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;; +AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;; +AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;; +AA7C;MYANMAR SIGN TAI LAING TONE-2;Mn;0;NSM;;;;;N;;;;; +AA7D;MYANMAR SIGN TAI LAING TONE-5;Mc;0;L;;;;;N;;;;; +AA7E;MYANMAR LETTER SHWE PALAUNG CHA;Lo;0;L;;;;;N;;;;; +AA7F;MYANMAR LETTER SHWE PALAUNG SHA;Lo;0;L;;;;;N;;;;; +AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;; +AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;; +AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;; +AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; +AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;; +AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;; +AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;; +AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;; +AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;; +AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;; +AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;; +AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;; +AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;; +AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;; +AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;; +AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;; +AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;; +AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; +AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;; +AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;; +AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;; +AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;; +AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;; +AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;; +AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;; +AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;; +AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;; +AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;; +AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;; +AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;; +AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;; +AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;; +AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;; +AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;; +AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;; +AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;; +AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;; +AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;; +AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;; +AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;; +AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;; +AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;; +AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;; +AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;; +AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;; +AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;; +AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;; +AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;; +AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;; +AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;; +AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;; +AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;; +AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;; +AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;; +AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;; +AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;; +AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;; +AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;; +AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;; +AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;; +AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;; +AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;; +AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;; +AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;; +AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;; +AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;; +AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;; +AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;; +AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;; +AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;; +AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;; +AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;; +AAE0;MEETEI MAYEK LETTER E;Lo;0;L;;;;;N;;;;; +AAE1;MEETEI MAYEK LETTER O;Lo;0;L;;;;;N;;;;; +AAE2;MEETEI MAYEK LETTER CHA;Lo;0;L;;;;;N;;;;; +AAE3;MEETEI MAYEK LETTER NYA;Lo;0;L;;;;;N;;;;; +AAE4;MEETEI MAYEK LETTER TTA;Lo;0;L;;;;;N;;;;; +AAE5;MEETEI MAYEK LETTER TTHA;Lo;0;L;;;;;N;;;;; +AAE6;MEETEI MAYEK LETTER DDA;Lo;0;L;;;;;N;;;;; +AAE7;MEETEI MAYEK LETTER DDHA;Lo;0;L;;;;;N;;;;; +AAE8;MEETEI MAYEK LETTER NNA;Lo;0;L;;;;;N;;;;; +AAE9;MEETEI MAYEK LETTER SHA;Lo;0;L;;;;;N;;;;; +AAEA;MEETEI MAYEK LETTER SSA;Lo;0;L;;;;;N;;;;; +AAEB;MEETEI MAYEK VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +AAEC;MEETEI MAYEK VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +AAED;MEETEI MAYEK VOWEL SIGN AAI;Mn;0;NSM;;;;;N;;;;; +AAEE;MEETEI MAYEK VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +AAEF;MEETEI MAYEK VOWEL SIGN AAU;Mc;0;L;;;;;N;;;;; +AAF0;MEETEI MAYEK CHEIKHAN;Po;0;L;;;;;N;;;;; +AAF1;MEETEI MAYEK AHANG KHUDAM;Po;0;L;;;;;N;;;;; +AAF2;MEETEI MAYEK ANJI;Lo;0;L;;;;;N;;;;; +AAF3;MEETEI MAYEK SYLLABLE REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF4;MEETEI MAYEK WORD REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF5;MEETEI MAYEK VOWEL SIGN VISARGA;Mc;0;L;;;;;N;;;;; +AAF6;MEETEI MAYEK VIRAMA;Mn;9;NSM;;;;;N;;;;; +AB01;ETHIOPIC SYLLABLE TTHU;Lo;0;L;;;;;N;;;;; +AB02;ETHIOPIC SYLLABLE TTHI;Lo;0;L;;;;;N;;;;; +AB03;ETHIOPIC SYLLABLE TTHAA;Lo;0;L;;;;;N;;;;; +AB04;ETHIOPIC SYLLABLE TTHEE;Lo;0;L;;;;;N;;;;; +AB05;ETHIOPIC SYLLABLE TTHE;Lo;0;L;;;;;N;;;;; +AB06;ETHIOPIC SYLLABLE TTHO;Lo;0;L;;;;;N;;;;; +AB09;ETHIOPIC SYLLABLE DDHU;Lo;0;L;;;;;N;;;;; +AB0A;ETHIOPIC SYLLABLE DDHI;Lo;0;L;;;;;N;;;;; +AB0B;ETHIOPIC SYLLABLE DDHAA;Lo;0;L;;;;;N;;;;; +AB0C;ETHIOPIC SYLLABLE DDHEE;Lo;0;L;;;;;N;;;;; +AB0D;ETHIOPIC SYLLABLE DDHE;Lo;0;L;;;;;N;;;;; +AB0E;ETHIOPIC SYLLABLE DDHO;Lo;0;L;;;;;N;;;;; +AB11;ETHIOPIC SYLLABLE DZU;Lo;0;L;;;;;N;;;;; +AB12;ETHIOPIC SYLLABLE DZI;Lo;0;L;;;;;N;;;;; +AB13;ETHIOPIC SYLLABLE DZAA;Lo;0;L;;;;;N;;;;; +AB14;ETHIOPIC SYLLABLE DZEE;Lo;0;L;;;;;N;;;;; +AB15;ETHIOPIC SYLLABLE DZE;Lo;0;L;;;;;N;;;;; +AB16;ETHIOPIC SYLLABLE DZO;Lo;0;L;;;;;N;;;;; +AB20;ETHIOPIC SYLLABLE CCHHA;Lo;0;L;;;;;N;;;;; +AB21;ETHIOPIC SYLLABLE CCHHU;Lo;0;L;;;;;N;;;;; +AB22;ETHIOPIC SYLLABLE CCHHI;Lo;0;L;;;;;N;;;;; +AB23;ETHIOPIC SYLLABLE CCHHAA;Lo;0;L;;;;;N;;;;; +AB24;ETHIOPIC SYLLABLE CCHHEE;Lo;0;L;;;;;N;;;;; +AB25;ETHIOPIC SYLLABLE CCHHE;Lo;0;L;;;;;N;;;;; +AB26;ETHIOPIC SYLLABLE CCHHO;Lo;0;L;;;;;N;;;;; +AB28;ETHIOPIC SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +AB29;ETHIOPIC SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +AB2A;ETHIOPIC SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +AB2B;ETHIOPIC SYLLABLE BBAA;Lo;0;L;;;;;N;;;;; +AB2C;ETHIOPIC SYLLABLE BBEE;Lo;0;L;;;;;N;;;;; +AB2D;ETHIOPIC SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +AB2E;ETHIOPIC SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +AB30;LATIN SMALL LETTER BARRED ALPHA;Ll;0;L;;;;;N;;;;; +AB31;LATIN SMALL LETTER A REVERSED-SCHWA;Ll;0;L;;;;;N;;;;; +AB32;LATIN SMALL LETTER BLACKLETTER E;Ll;0;L;;;;;N;;;;; +AB33;LATIN SMALL LETTER BARRED E;Ll;0;L;;;;;N;;;;; +AB34;LATIN SMALL LETTER E WITH FLOURISH;Ll;0;L;;;;;N;;;;; +AB35;LATIN SMALL LETTER LENIS F;Ll;0;L;;;;;N;;;;; +AB36;LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB37;LATIN SMALL LETTER L WITH INVERTED LAZY S;Ll;0;L;;;;;N;;;;; +AB38;LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +AB39;LATIN SMALL LETTER L WITH MIDDLE RING;Ll;0;L;;;;;N;;;;; +AB3A;LATIN SMALL LETTER M WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3B;LATIN SMALL LETTER N WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3C;LATIN SMALL LETTER ENG WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3D;LATIN SMALL LETTER BLACKLETTER O;Ll;0;L;;;;;N;;;;; +AB3E;LATIN SMALL LETTER BLACKLETTER O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB3F;LATIN SMALL LETTER OPEN O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB40;LATIN SMALL LETTER INVERTED OE;Ll;0;L;;;;;N;;;;; +AB41;LATIN SMALL LETTER TURNED OE WITH STROKE;Ll;0;L;;;;;N;;;;; +AB42;LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE;Ll;0;L;;;;;N;;;;; +AB43;LATIN SMALL LETTER TURNED O OPEN-O;Ll;0;L;;;;;N;;;;; +AB44;LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB45;LATIN SMALL LETTER STIRRUP R;Ll;0;L;;;;;N;;;;; +AB46;LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;; +AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;; +AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;; +AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;; +AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;; +AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; +AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; +AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; +AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;A7B3;;A7B3 +AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; +AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB57;LATIN SMALL LETTER X WITH LONG LEFT LEG;Ll;0;L;;;;;N;;;;; +AB58;LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB59;LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF;Ll;0;L;;;;;N;;;;; +AB5A;LATIN SMALL LETTER Y WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB5B;MODIFIER BREVE WITH INVERTED BREVE;Sk;0;L;;;;;N;;;;; +AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L; A727;;;;N;;;;; +AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L; AB37;;;;N;;;;; +AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L; 026B;;;;N;;;;; +AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L; AB52;;;;N;;;;; +AB60;LATIN SMALL LETTER SAKHA YAT;Ll;0;L;;;;;N;;;;; +AB61;LATIN SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;;; +AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;; +AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;; +AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; +AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;; +AB66;LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +AB67;LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +AB68;LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +AB69;MODIFIER LETTER SMALL TURNED W;Lm;0;L; 028D;;;;N;;;;; +AB6A;MODIFIER LETTER LEFT TACK;Sk;0;ON;;;;;N;;;;; +AB6B;MODIFIER LETTER RIGHT TACK;Sk;0;ON;;;;;N;;;;; +AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0 +AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1 +AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2 +AB73;CHEROKEE SMALL LETTER O;Ll;0;L;;;;;N;;;13A3;;13A3 +AB74;CHEROKEE SMALL LETTER U;Ll;0;L;;;;;N;;;13A4;;13A4 +AB75;CHEROKEE SMALL LETTER V;Ll;0;L;;;;;N;;;13A5;;13A5 +AB76;CHEROKEE SMALL LETTER GA;Ll;0;L;;;;;N;;;13A6;;13A6 +AB77;CHEROKEE SMALL LETTER KA;Ll;0;L;;;;;N;;;13A7;;13A7 +AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8 +AB79;CHEROKEE SMALL LETTER GI;Ll;0;L;;;;;N;;;13A9;;13A9 +AB7A;CHEROKEE SMALL LETTER GO;Ll;0;L;;;;;N;;;13AA;;13AA +AB7B;CHEROKEE SMALL LETTER GU;Ll;0;L;;;;;N;;;13AB;;13AB +AB7C;CHEROKEE SMALL LETTER GV;Ll;0;L;;;;;N;;;13AC;;13AC +AB7D;CHEROKEE SMALL LETTER HA;Ll;0;L;;;;;N;;;13AD;;13AD +AB7E;CHEROKEE SMALL LETTER HE;Ll;0;L;;;;;N;;;13AE;;13AE +AB7F;CHEROKEE SMALL LETTER HI;Ll;0;L;;;;;N;;;13AF;;13AF +AB80;CHEROKEE SMALL LETTER HO;Ll;0;L;;;;;N;;;13B0;;13B0 +AB81;CHEROKEE SMALL LETTER HU;Ll;0;L;;;;;N;;;13B1;;13B1 +AB82;CHEROKEE SMALL LETTER HV;Ll;0;L;;;;;N;;;13B2;;13B2 +AB83;CHEROKEE SMALL LETTER LA;Ll;0;L;;;;;N;;;13B3;;13B3 +AB84;CHEROKEE SMALL LETTER LE;Ll;0;L;;;;;N;;;13B4;;13B4 +AB85;CHEROKEE SMALL LETTER LI;Ll;0;L;;;;;N;;;13B5;;13B5 +AB86;CHEROKEE SMALL LETTER LO;Ll;0;L;;;;;N;;;13B6;;13B6 +AB87;CHEROKEE SMALL LETTER LU;Ll;0;L;;;;;N;;;13B7;;13B7 +AB88;CHEROKEE SMALL LETTER LV;Ll;0;L;;;;;N;;;13B8;;13B8 +AB89;CHEROKEE SMALL LETTER MA;Ll;0;L;;;;;N;;;13B9;;13B9 +AB8A;CHEROKEE SMALL LETTER ME;Ll;0;L;;;;;N;;;13BA;;13BA +AB8B;CHEROKEE SMALL LETTER MI;Ll;0;L;;;;;N;;;13BB;;13BB +AB8C;CHEROKEE SMALL LETTER MO;Ll;0;L;;;;;N;;;13BC;;13BC +AB8D;CHEROKEE SMALL LETTER MU;Ll;0;L;;;;;N;;;13BD;;13BD +AB8E;CHEROKEE SMALL LETTER NA;Ll;0;L;;;;;N;;;13BE;;13BE +AB8F;CHEROKEE SMALL LETTER HNA;Ll;0;L;;;;;N;;;13BF;;13BF +AB90;CHEROKEE SMALL LETTER NAH;Ll;0;L;;;;;N;;;13C0;;13C0 +AB91;CHEROKEE SMALL LETTER NE;Ll;0;L;;;;;N;;;13C1;;13C1 +AB92;CHEROKEE SMALL LETTER NI;Ll;0;L;;;;;N;;;13C2;;13C2 +AB93;CHEROKEE SMALL LETTER NO;Ll;0;L;;;;;N;;;13C3;;13C3 +AB94;CHEROKEE SMALL LETTER NU;Ll;0;L;;;;;N;;;13C4;;13C4 +AB95;CHEROKEE SMALL LETTER NV;Ll;0;L;;;;;N;;;13C5;;13C5 +AB96;CHEROKEE SMALL LETTER QUA;Ll;0;L;;;;;N;;;13C6;;13C6 +AB97;CHEROKEE SMALL LETTER QUE;Ll;0;L;;;;;N;;;13C7;;13C7 +AB98;CHEROKEE SMALL LETTER QUI;Ll;0;L;;;;;N;;;13C8;;13C8 +AB99;CHEROKEE SMALL LETTER QUO;Ll;0;L;;;;;N;;;13C9;;13C9 +AB9A;CHEROKEE SMALL LETTER QUU;Ll;0;L;;;;;N;;;13CA;;13CA +AB9B;CHEROKEE SMALL LETTER QUV;Ll;0;L;;;;;N;;;13CB;;13CB +AB9C;CHEROKEE SMALL LETTER SA;Ll;0;L;;;;;N;;;13CC;;13CC +AB9D;CHEROKEE SMALL LETTER S;Ll;0;L;;;;;N;;;13CD;;13CD +AB9E;CHEROKEE SMALL LETTER SE;Ll;0;L;;;;;N;;;13CE;;13CE +AB9F;CHEROKEE SMALL LETTER SI;Ll;0;L;;;;;N;;;13CF;;13CF +ABA0;CHEROKEE SMALL LETTER SO;Ll;0;L;;;;;N;;;13D0;;13D0 +ABA1;CHEROKEE SMALL LETTER SU;Ll;0;L;;;;;N;;;13D1;;13D1 +ABA2;CHEROKEE SMALL LETTER SV;Ll;0;L;;;;;N;;;13D2;;13D2 +ABA3;CHEROKEE SMALL LETTER DA;Ll;0;L;;;;;N;;;13D3;;13D3 +ABA4;CHEROKEE SMALL LETTER TA;Ll;0;L;;;;;N;;;13D4;;13D4 +ABA5;CHEROKEE SMALL LETTER DE;Ll;0;L;;;;;N;;;13D5;;13D5 +ABA6;CHEROKEE SMALL LETTER TE;Ll;0;L;;;;;N;;;13D6;;13D6 +ABA7;CHEROKEE SMALL LETTER DI;Ll;0;L;;;;;N;;;13D7;;13D7 +ABA8;CHEROKEE SMALL LETTER TI;Ll;0;L;;;;;N;;;13D8;;13D8 +ABA9;CHEROKEE SMALL LETTER DO;Ll;0;L;;;;;N;;;13D9;;13D9 +ABAA;CHEROKEE SMALL LETTER DU;Ll;0;L;;;;;N;;;13DA;;13DA +ABAB;CHEROKEE SMALL LETTER DV;Ll;0;L;;;;;N;;;13DB;;13DB +ABAC;CHEROKEE SMALL LETTER DLA;Ll;0;L;;;;;N;;;13DC;;13DC +ABAD;CHEROKEE SMALL LETTER TLA;Ll;0;L;;;;;N;;;13DD;;13DD +ABAE;CHEROKEE SMALL LETTER TLE;Ll;0;L;;;;;N;;;13DE;;13DE +ABAF;CHEROKEE SMALL LETTER TLI;Ll;0;L;;;;;N;;;13DF;;13DF +ABB0;CHEROKEE SMALL LETTER TLO;Ll;0;L;;;;;N;;;13E0;;13E0 +ABB1;CHEROKEE SMALL LETTER TLU;Ll;0;L;;;;;N;;;13E1;;13E1 +ABB2;CHEROKEE SMALL LETTER TLV;Ll;0;L;;;;;N;;;13E2;;13E2 +ABB3;CHEROKEE SMALL LETTER TSA;Ll;0;L;;;;;N;;;13E3;;13E3 +ABB4;CHEROKEE SMALL LETTER TSE;Ll;0;L;;;;;N;;;13E4;;13E4 +ABB5;CHEROKEE SMALL LETTER TSI;Ll;0;L;;;;;N;;;13E5;;13E5 +ABB6;CHEROKEE SMALL LETTER TSO;Ll;0;L;;;;;N;;;13E6;;13E6 +ABB7;CHEROKEE SMALL LETTER TSU;Ll;0;L;;;;;N;;;13E7;;13E7 +ABB8;CHEROKEE SMALL LETTER TSV;Ll;0;L;;;;;N;;;13E8;;13E8 +ABB9;CHEROKEE SMALL LETTER WA;Ll;0;L;;;;;N;;;13E9;;13E9 +ABBA;CHEROKEE SMALL LETTER WE;Ll;0;L;;;;;N;;;13EA;;13EA +ABBB;CHEROKEE SMALL LETTER WI;Ll;0;L;;;;;N;;;13EB;;13EB +ABBC;CHEROKEE SMALL LETTER WO;Ll;0;L;;;;;N;;;13EC;;13EC +ABBD;CHEROKEE SMALL LETTER WU;Ll;0;L;;;;;N;;;13ED;;13ED +ABBE;CHEROKEE SMALL LETTER WV;Ll;0;L;;;;;N;;;13EE;;13EE +ABBF;CHEROKEE SMALL LETTER YA;Ll;0;L;;;;;N;;;13EF;;13EF +ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; +ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; +ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; +ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;; +ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;; +ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;; +ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;; +ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;; +ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;; +ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;; +ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;; +ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;; +ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;; +ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;; +ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;; +ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;; +ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;; +ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;; +ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;; +ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;; +ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;; +ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;; +ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;; +ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;; +ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;; +ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;; +ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;; +ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;; +ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;; +ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;; +ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;; +ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;; +ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;; +ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;; +ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;; +ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;; +ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;; +ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;; +ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;; +ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;; +ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;; +ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;; +ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;; +ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;; +ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;; +ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;; +ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AC00;;Lo;0;L;;;;;N;;;;; +D7A3;;Lo;0;L;;;;;N;;;;; +D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; +D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;; +D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;; +D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;; +D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;; +D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;; +D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;; +D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;; +D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;; +D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;; +D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;; +D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;; +D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;; +D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;; +D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;; +D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;; +D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;; +D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;; +D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;; +D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;; +D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;; +D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;; +D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;; +D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;; +D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;; +D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;; +D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;; +D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;; +D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;; +D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;; +D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;; +D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;; +D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;; +D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;; +D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;; +D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;; +D800;;Cs;0;L;;;;;N;;;;; +DB7F;;Cs;0;L;;;;;N;;;;; +DB80;;Cs;0;L;;;;;N;;;;; +DBFF;;Cs;0;L;;;;;N;;;;; +DC00;;Cs;0;L;;;;;N;;;;; +DFFF;;Cs;0;L;;;;;N;;;;; +E000;;Co;0;L;;;;;N;;;;; +F8FF;;Co;0;L;;;;;N;;;;; +F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; +F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; +F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; +F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; +F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; +F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; +F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; +F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; +F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; +F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; +F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; +F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; +F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; +F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; +F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; +F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; +F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; +F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; +F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; +F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; +F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; +F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; +F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; +F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; +F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; +F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; +F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; +F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; +F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; +F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; +F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; +F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; +F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; +F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; +F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; +F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; +F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; +F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; +F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; +F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; +F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; +F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; +F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; +F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; +F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; +F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; +F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; +F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; +F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; +F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; +F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; +F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; +F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; +F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; +F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; +F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; +F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; +F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; +F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; +F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; +F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; +F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; +F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; +F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; +F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; +F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; +F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; +F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; +F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; +F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; +F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; +F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; +F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; +F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; +F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; +F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; +F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; +F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; +F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; +F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; +F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; +F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; +F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; +F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; +F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; +F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; +F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; +F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; +F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; +F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; +F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; +F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; +F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; +F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; +F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; +F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; +F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; +F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; +F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; +F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; +F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; +F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; +F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; +F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; +F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; +F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; +F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; +F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; +F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; +F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; +F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; +F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; +F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; +F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; +F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; +F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; +F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; +F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; +F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; +F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; +F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; +F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; +F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; +F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; +F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; +F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; +F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; +F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; +F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; +F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; +F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; +F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; +F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; +F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; +F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; +F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; +F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; +F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; +F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; +F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; +F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; +F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; +F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; +F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; +F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; +F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; +F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; +F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; +F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; +F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; +F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; +F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; +F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; +F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; +F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; +F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; +F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; +F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; +F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; +F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; +F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; +F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; +F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; +F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; +F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; +F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; +F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; +F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; +F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; +F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; +F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; +F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; +F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; +F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; +F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; +F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; +F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; +F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; +F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; +F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; +F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; +F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; +F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; +F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; +F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; +F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; +F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; +F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; +F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; +F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; +F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; +F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; +F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; +F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; +F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; +F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; +F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; +F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; +F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; +F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; +F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; +F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; +F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; +F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; +F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; +F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; +F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; +F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; +F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; +F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; +F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; +F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; +F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; +F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; +F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; +F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; +F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; +F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; +F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; +F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; +F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; +F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; +F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; +F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; +F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; +F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; +F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; +F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; +F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; +F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; +F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; +F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; +F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; +F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; +F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; +F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; +F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; +F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; +F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; +F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; +F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; +F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; +F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; +F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; +F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; +F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; +F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; +F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; +F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; +FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; +FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; +FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; +FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; +FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; +FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; +FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; +FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; +FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; +FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; +FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; +FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; +FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; +FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; +FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; +FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; +FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; +FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; +FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; +FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; +FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; +FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; +FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; +FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; +FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; +FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; +FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; +FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; +FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; +FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; +FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; +FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;; +FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; +FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; +FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; +FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;; +FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; +FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; +FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; +FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; +FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; +FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; +FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; +FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; +FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; +FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; +FA2E;CJK COMPATIBILITY IDEOGRAPH-FA2E;Lo;0;L;90DE;;;;N;;;;; +FA2F;CJK COMPATIBILITY IDEOGRAPH-FA2F;Lo;0;L;96B7;;;;N;;;;; +FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; +FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; +FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; +FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; +FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; +FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; +FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; +FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; +FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; +FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; +FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; +FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; +FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; +FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; +FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; +FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; +FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; +FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; +FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; +FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; +FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; +FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; +FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; +FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; +FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; +FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; +FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; +FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; +FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; +FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; +FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; +FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; +FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; +FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; +FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; +FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; +FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; +FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; +FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; +FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; +FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; +FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; +FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; +FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; +FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; +FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; +FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; +FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; +FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; +FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; +FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; +FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; +FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; +FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; +FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; +FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; +FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; +FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; +FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; +FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;; +FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;; +FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;; +FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; +FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; +FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; +FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; +FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; +FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; +FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; +FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; +FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; +FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; +FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; +FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; +FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; +FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; +FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; +FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; +FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; +FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; +FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; +FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; +FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; +FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; +FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; +FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; +FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; +FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; +FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; +FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; +FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; +FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; +FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; +FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; +FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; +FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; +FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; +FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; +FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; +FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; +FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; +FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; +FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; +FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; +FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; +FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; +FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; +FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; +FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; +FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; +FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; +FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; +FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; +FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; +FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; +FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; +FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; +FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; +FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; +FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; +FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; +FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; +FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; +FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; +FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; +FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; +FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; +FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; +FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; +FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; +FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; +FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; +FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; +FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; +FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; +FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; +FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; +FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; +FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; +FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; +FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; +FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; +FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; +FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; +FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; +FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; +FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; +FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; +FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; +FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; +FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; +FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; +FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; +FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; +FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; +FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; +FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; +FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; +FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; +FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; +FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; +FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; +FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; +FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; +FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; +FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; +FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; +FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; +FB00;LATIN SMALL LIGATURE FF;Ll;0;L; 0066 0066;;;;N;;;;; +FB01;LATIN SMALL LIGATURE FI;Ll;0;L; 0066 0069;;;;N;;;;; +FB02;LATIN SMALL LIGATURE FL;Ll;0;L; 0066 006C;;;;N;;;;; +FB03;LATIN SMALL LIGATURE FFI;Ll;0;L; 0066 0066 0069;;;;N;;;;; +FB04;LATIN SMALL LIGATURE FFL;Ll;0;L; 0066 0066 006C;;;;N;;;;; +FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L; 017F 0074;;;;N;;;;; +FB06;LATIN SMALL LIGATURE ST;Ll;0;L; 0073 0074;;;;N;;;;; +FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L; 0574 0576;;;;N;;;;; +FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L; 0574 0565;;;;N;;;;; +FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L; 0574 056B;;;;N;;;;; +FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L; 057E 0576;;;;N;;;;; +FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L; 0574 056D;;;;N;;;;; +FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; +FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; +FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; +FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R; 05E2;;;;N;;;;; +FB21;HEBREW LETTER WIDE ALEF;Lo;0;R; 05D0;;;;N;;;;; +FB22;HEBREW LETTER WIDE DALET;Lo;0;R; 05D3;;;;N;;;;; +FB23;HEBREW LETTER WIDE HE;Lo;0;R; 05D4;;;;N;;;;; +FB24;HEBREW LETTER WIDE KAF;Lo;0;R; 05DB;;;;N;;;;; +FB25;HEBREW LETTER WIDE LAMED;Lo;0;R; 05DC;;;;N;;;;; +FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R; 05DD;;;;N;;;;; +FB27;HEBREW LETTER WIDE RESH;Lo;0;R; 05E8;;;;N;;;;; +FB28;HEBREW LETTER WIDE TAV;Lo;0;R; 05EA;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; +FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; +FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; +FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; +FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; +FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; +FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; +FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; +FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; +FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; +FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; +FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; +FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; +FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; +FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; +FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; +FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; +FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; +FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; +FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; +FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; +FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; +FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; +FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; +FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; +FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; +FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; +FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; +FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; +FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; +FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; +FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; +FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R; 05D0 05DC;;;;N;;;;; +FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL; 0671;;;;N;;;;; +FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL; 0671;;;;N;;;;; +FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL; 067B;;;;N;;;;; +FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL; 067E;;;;N;;;;; +FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL; 067A;;;;N;;;;; +FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL; 067F;;;;N;;;;; +FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL; 0679;;;;N;;;;; +FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL; 0684;;;;N;;;;; +FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL; 0683;;;;N;;;;; +FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL; 0687;;;;N;;;;; +FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL; 068D;;;;N;;;;; +FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL; 068D;;;;N;;;;; +FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL; 068C;;;;N;;;;; +FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL; 068C;;;;N;;;;; +FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL; 068E;;;;N;;;;; +FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL; 068E;;;;N;;;;; +FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL; 0688;;;;N;;;;; +FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL; 0688;;;;N;;;;; +FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL; 0698;;;;N;;;;; +FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL; 0698;;;;N;;;;; +FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL; 0691;;;;N;;;;; +FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL; 0691;;;;N;;;;; +FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL; 06BA;;;;N;;;;; +FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL; 06BA;;;;N;;;;; +FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL; 06C0;;;;N;;;;; +FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL; 06C0;;;;N;;;;; +FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL; 06D2;;;;N;;;;; +FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL; 06D2;;;;N;;;;; +FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 06D3;;;;N;;;;; +FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 06D3;;;;N;;;;; +FBB2;ARABIC SYMBOL DOT ABOVE;Sk;0;AL;;;;;N;;;;; +FBB3;ARABIC SYMBOL DOT BELOW;Sk;0;AL;;;;;N;;;;; +FBB4;ARABIC SYMBOL TWO DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB5;ARABIC SYMBOL TWO DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB6;ARABIC SYMBOL THREE DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB7;ARABIC SYMBOL THREE DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB8;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB9;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW;Sk;0;AL;;;;;N;;;;; +FBBA;ARABIC SYMBOL FOUR DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBBB;ARABIC SYMBOL FOUR DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBBC;ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW;Sk;0;AL;;;;;N;;;;; +FBBD;ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE;Sk;0;AL;;;;;N;;;;; +FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;; +FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;; +FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;; +FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;; +FBC2;ARABIC SYMBOL WASLA ABOVE;Sk;0;AL;;;;;N;;;;; +FBC3;ARABIC LIGATURE JALLA WA-ALAA;So;0;ON;;;;;N;;;;; +FBC4;ARABIC LIGATURE DAAMAT BARAKAATUHUM;So;0;ON;;;;;N;;;;; +FBC5;ARABIC LIGATURE RAHMATU ALLAAHI TAAALAA ALAYH;So;0;ON;;;;;N;;;;; +FBC6;ARABIC LIGATURE RAHMATU ALLAAHI ALAYHIM;So;0;ON;;;;;N;;;;; +FBC7;ARABIC LIGATURE RAHMATU ALLAAHI ALAYHIMAA;So;0;ON;;;;;N;;;;; +FBC8;ARABIC LIGATURE RAHIMAHUM ALLAAHU TAAALAA;So;0;ON;;;;;N;;;;; +FBC9;ARABIC LIGATURE RAHIMAHUMAA ALLAAH;So;0;ON;;;;;N;;;;; +FBCA;ARABIC LIGATURE RAHIMAHUMAA ALLAAHU TAAALAA;So;0;ON;;;;;N;;;;; +FBCB;ARABIC LIGATURE RADI ALLAAHU TAAALAA ANHUM;So;0;ON;;;;;N;;;;; +FBCC;ARABIC LIGATURE HAFIZAHU ALLAAH;So;0;ON;;;;;N;;;;; +FBCD;ARABIC LIGATURE HAFIZAHU ALLAAHU TAAALAA;So;0;ON;;;;;N;;;;; +FBCE;ARABIC LIGATURE HAFIZAHUM ALLAAHU TAAALAA;So;0;ON;;;;;N;;;;; +FBCF;ARABIC LIGATURE HAFIZAHUMAA ALLAAHU TAAALAA;So;0;ON;;;;;N;;;;; +FBD0;ARABIC LIGATURE SALLALLAAHU TAAALAA ALAYHI WA-SALLAM;So;0;ON;;;;;N;;;;; +FBD1;ARABIC LIGATURE AJJAL ALLAAHU FARAJAHU ASH-SHAREEF;So;0;ON;;;;;N;;;;; +FBD2;ARABIC LIGATURE ALAYHI AR-RAHMAH;So;0;ON;;;;;N;;;;; +FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL; 06C7;;;;N;;;;; +FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL; 06C7;;;;N;;;;; +FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL; 06C6;;;;N;;;;; +FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL; 06C6;;;;N;;;;; +FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL; 06C8;;;;N;;;;; +FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL; 06C8;;;;N;;;;; +FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0677;;;;N;;;;; +FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL; 06CB;;;;N;;;;; +FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL; 06CB;;;;N;;;;; +FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL; 06C5;;;;N;;;;; +FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL; 06C5;;;;N;;;;; +FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL; 06C9;;;;N;;;;; +FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL; 06C9;;;;N;;;;; +FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0649;;;;N;;;;; +FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL; 0649;;;;N;;;;; +FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL; 0626 0627;;;;N;;;;; +FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL; 0626 0627;;;;N;;;;; +FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; +FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; +FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL; 0626 0648;;;;N;;;;; +FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL; 0626 0648;;;;N;;;;; +FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; +FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; +FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; +FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; +FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; +FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; +FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL; 0626 062C;;;;N;;;;; +FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL; 0626 062D;;;;N;;;;; +FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL; 0626 064A;;;;N;;;;; +FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0628 062C;;;;N;;;;; +FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL; 0628 062D;;;;N;;;;; +FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0628 062E;;;;N;;;;; +FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0628 0649;;;;N;;;;; +FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL; 0628 064A;;;;N;;;;; +FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062A 062C;;;;N;;;;; +FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL; 062A 062D;;;;N;;;;; +FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL; 062A 062E;;;;N;;;;; +FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062A 0649;;;;N;;;;; +FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL; 062A 064A;;;;N;;;;; +FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062B 062C;;;;N;;;;; +FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062B 0649;;;;N;;;;; +FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL; 062B 064A;;;;N;;;;; +FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL; 062C 062D;;;;N;;;;; +FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 062C 0645;;;;N;;;;; +FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062D 062C;;;;N;;;;; +FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062D 0645;;;;N;;;;; +FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062E 062C;;;;N;;;;; +FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL; 062E 062D;;;;N;;;;; +FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062E 0645;;;;N;;;;; +FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL; 0635 062D;;;;N;;;;; +FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0635 0645;;;;N;;;;; +FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL; 0636 062C;;;;N;;;;; +FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL; 0636 062D;;;;N;;;;; +FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL; 0636 062E;;;;N;;;;; +FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0636 0645;;;;N;;;;; +FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL; 0637 062D;;;;N;;;;; +FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL; 0639 062C;;;;N;;;;; +FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL; 0639 0645;;;;N;;;;; +FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL; 063A 062C;;;;N;;;;; +FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL; 063A 0645;;;;N;;;;; +FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0641 062C;;;;N;;;;; +FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL; 0641 062D;;;;N;;;;; +FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0641 062E;;;;N;;;;; +FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0641 0645;;;;N;;;;; +FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0641 0649;;;;N;;;;; +FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL; 0641 064A;;;;N;;;;; +FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL; 0642 062D;;;;N;;;;; +FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0642 0645;;;;N;;;;; +FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0642 0649;;;;N;;;;; +FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL; 0642 064A;;;;N;;;;; +FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL; 0643 0627;;;;N;;;;; +FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL; 0643 062C;;;;N;;;;; +FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL; 0643 062D;;;;N;;;;; +FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL; 0643 062E;;;;N;;;;; +FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0643 0649;;;;N;;;;; +FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL; 0643 064A;;;;N;;;;; +FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL; 0644 062C;;;;N;;;;; +FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL; 0644 062D;;;;N;;;;; +FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL; 0644 062E;;;;N;;;;; +FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0644 0649;;;;N;;;;; +FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL; 0644 064A;;;;N;;;;; +FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL; 0645 062C;;;;N;;;;; +FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL; 0645 062D;;;;N;;;;; +FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL; 0645 062E;;;;N;;;;; +FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0645 0649;;;;N;;;;; +FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL; 0645 064A;;;;N;;;;; +FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL; 0646 062C;;;;N;;;;; +FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL; 0646 062D;;;;N;;;;; +FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL; 0646 062E;;;;N;;;;; +FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0646 0649;;;;N;;;;; +FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL; 0646 064A;;;;N;;;;; +FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0647 062C;;;;N;;;;; +FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0647 0645;;;;N;;;;; +FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0647 0649;;;;N;;;;; +FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL; 0647 064A;;;;N;;;;; +FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL; 064A 062C;;;;N;;;;; +FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL; 064A 062D;;;;N;;;;; +FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL; 064A 062E;;;;N;;;;; +FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 064A 0649;;;;N;;;;; +FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL; 064A 064A;;;;N;;;;; +FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0630 0670;;;;N;;;;; +FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0631 0670;;;;N;;;;; +FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0649 0670;;;;N;;;;; +FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C 0651;;;;N;;;;; +FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D 0651;;;;N;;;;; +FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL; 0020 064E 0651;;;;N;;;;; +FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F 0651;;;;N;;;;; +FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL; 0020 0650 0651;;;;N;;;;; +FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0020 0651 0670;;;;N;;;;; +FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL; 0626 0631;;;;N;;;;; +FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL; 0626 0632;;;;N;;;;; +FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL; 0626 0646;;;;N;;;;; +FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL; 0626 064A;;;;N;;;;; +FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL; 0628 0631;;;;N;;;;; +FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL; 0628 0632;;;;N;;;;; +FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL; 0628 0646;;;;N;;;;; +FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0628 0649;;;;N;;;;; +FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL; 0628 064A;;;;N;;;;; +FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL; 062A 0631;;;;N;;;;; +FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL; 062A 0632;;;;N;;;;; +FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL; 062A 0646;;;;N;;;;; +FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0649;;;;N;;;;; +FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL; 062A 064A;;;;N;;;;; +FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL; 062B 0631;;;;N;;;;; +FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL; 062B 0632;;;;N;;;;; +FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL; 062B 0646;;;;N;;;;; +FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062B 0649;;;;N;;;;; +FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL; 062B 064A;;;;N;;;;; +FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0641 0649;;;;N;;;;; +FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL; 0641 064A;;;;N;;;;; +FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0642 0649;;;;N;;;;; +FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL; 0642 064A;;;;N;;;;; +FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL; 0643 0627;;;;N;;;;; +FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0643 0649;;;;N;;;;; +FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL; 0643 064A;;;;N;;;;; +FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 0649;;;;N;;;;; +FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL; 0644 064A;;;;N;;;;; +FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL; 0645 0627;;;;N;;;;; +FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL; 0646 0631;;;;N;;;;; +FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL; 0646 0632;;;;N;;;;; +FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL; 0646 0646;;;;N;;;;; +FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0649;;;;N;;;;; +FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL; 0646 064A;;;;N;;;;; +FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL; 0649 0670;;;;N;;;;; +FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL; 064A 0631;;;;N;;;;; +FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL; 064A 0632;;;;N;;;;; +FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL; 064A 0646;;;;N;;;;; +FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 064A 0649;;;;N;;;;; +FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL; 064A 064A;;;;N;;;;; +FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL; 0626 062C;;;;N;;;;; +FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL; 0626 062D;;;;N;;;;; +FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL; 0626 062E;;;;N;;;;; +FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; +FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL; 0628 062C;;;;N;;;;; +FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL; 0628 062D;;;;N;;;;; +FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL; 0628 062E;;;;N;;;;; +FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; +FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062C;;;;N;;;;; +FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL; 062A 062D;;;;N;;;;; +FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL; 062A 062E;;;;N;;;;; +FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; +FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 062D;;;;N;;;;; +FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062C 0645;;;;N;;;;; +FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062D 062C;;;;N;;;;; +FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062D 0645;;;;N;;;;; +FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 062E 062C;;;;N;;;;; +FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062E 0645;;;;N;;;;; +FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D;;;;N;;;;; +FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL; 0635 062E;;;;N;;;;; +FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645;;;;N;;;;; +FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL; 0636 062C;;;;N;;;;; +FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL; 0636 062D;;;;N;;;;; +FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL; 0636 062E;;;;N;;;;; +FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL; 0636 0645;;;;N;;;;; +FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL; 0637 062D;;;;N;;;;; +FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL; 0639 062C;;;;N;;;;; +FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645;;;;N;;;;; +FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL; 063A 062C;;;;N;;;;; +FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL; 063A 0645;;;;N;;;;; +FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL; 0641 062C;;;;N;;;;; +FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL; 0641 062D;;;;N;;;;; +FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL; 0641 062E;;;;N;;;;; +FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 0645;;;;N;;;;; +FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL; 0642 062D;;;;N;;;;; +FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL; 0642 0645;;;;N;;;;; +FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL; 0643 062C;;;;N;;;;; +FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL; 0643 062D;;;;N;;;;; +FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL; 0643 062E;;;;N;;;;; +FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C;;;;N;;;;; +FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL; 0644 062D;;;;N;;;;; +FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL; 0644 062E;;;;N;;;;; +FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL; 0644 0647;;;;N;;;;; +FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062C;;;;N;;;;; +FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062D;;;;N;;;;; +FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062E;;;;N;;;;; +FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL; 0646 062C;;;;N;;;;; +FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL; 0646 062D;;;;N;;;;; +FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL; 0646 062E;;;;N;;;;; +FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; +FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL; 0647 062C;;;;N;;;;; +FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645;;;;N;;;;; +FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL; 0647 0670;;;;N;;;;; +FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL; 064A 062C;;;;N;;;;; +FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL; 064A 062D;;;;N;;;;; +FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL; 064A 062E;;;;N;;;;; +FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; +FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; +FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; +FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; +FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL; 062B 0647;;;;N;;;;; +FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; +FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; +FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; +FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; +FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL; 0640 064E 0651;;;;N;;;;; +FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F 0651;;;;N;;;;; +FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL; 0640 0650 0651;;;;N;;;;; +FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0637 0649;;;;N;;;;; +FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL; 0637 064A;;;;N;;;;; +FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0639 0649;;;;N;;;;; +FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL; 0639 064A;;;;N;;;;; +FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 063A 0649;;;;N;;;;; +FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL; 063A 064A;;;;N;;;;; +FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0633 0649;;;;N;;;;; +FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0633 064A;;;;N;;;;; +FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0634 0649;;;;N;;;;; +FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0634 064A;;;;N;;;;; +FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062D 0649;;;;N;;;;; +FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL; 062D 064A;;;;N;;;;; +FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062C 0649;;;;N;;;;; +FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL; 062C 064A;;;;N;;;;; +FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062E 0649;;;;N;;;;; +FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL; 062E 064A;;;;N;;;;; +FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0635 0649;;;;N;;;;; +FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL; 0635 064A;;;;N;;;;; +FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0636 0649;;;;N;;;;; +FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL; 0636 064A;;;;N;;;;; +FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL; 0634 0631;;;;N;;;;; +FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL; 0633 0631;;;;N;;;;; +FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL; 0635 0631;;;;N;;;;; +FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL; 0636 0631;;;;N;;;;; +FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0637 0649;;;;N;;;;; +FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL; 0637 064A;;;;N;;;;; +FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0649;;;;N;;;;; +FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL; 0639 064A;;;;N;;;;; +FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0649;;;;N;;;;; +FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL; 063A 064A;;;;N;;;;; +FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 0649;;;;N;;;;; +FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL; 0633 064A;;;;N;;;;; +FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0634 0649;;;;N;;;;; +FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL; 0634 064A;;;;N;;;;; +FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0649;;;;N;;;;; +FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL; 062D 064A;;;;N;;;;; +FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0649;;;;N;;;;; +FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 064A;;;;N;;;;; +FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062E 0649;;;;N;;;;; +FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL; 062E 064A;;;;N;;;;; +FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0635 0649;;;;N;;;;; +FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL; 0635 064A;;;;N;;;;; +FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 0649;;;;N;;;;; +FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL; 0636 064A;;;;N;;;;; +FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL; 0634 0631;;;;N;;;;; +FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL; 0633 0631;;;;N;;;;; +FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL; 0635 0631;;;;N;;;;; +FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL; 0636 0631;;;;N;;;;; +FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; +FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; +FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL; 0627 064B;;;;N;;;;; +FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL; 0627 064B;;;;N;;;;; +FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;; +FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;; +FD40;ARABIC LIGATURE RAHIMAHU ALLAAH;So;0;ON;;;;;N;;;;; +FD41;ARABIC LIGATURE RADI ALLAAHU ANH;So;0;ON;;;;;N;;;;; +FD42;ARABIC LIGATURE RADI ALLAAHU ANHAA;So;0;ON;;;;;N;;;;; +FD43;ARABIC LIGATURE RADI ALLAAHU ANHUM;So;0;ON;;;;;N;;;;; +FD44;ARABIC LIGATURE RADI ALLAAHU ANHUMAA;So;0;ON;;;;;N;;;;; +FD45;ARABIC LIGATURE RADI ALLAAHU ANHUNNA;So;0;ON;;;;;N;;;;; +FD46;ARABIC LIGATURE SALLALLAAHU ALAYHI WA-AALIH;So;0;ON;;;;;N;;;;; +FD47;ARABIC LIGATURE ALAYHI AS-SALAAM;So;0;ON;;;;;N;;;;; +FD48;ARABIC LIGATURE ALAYHIM AS-SALAAM;So;0;ON;;;;;N;;;;; +FD49;ARABIC LIGATURE ALAYHIMAA AS-SALAAM;So;0;ON;;;;;N;;;;; +FD4A;ARABIC LIGATURE ALAYHI AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; +FD4B;ARABIC LIGATURE QUDDISA SIRRAH;So;0;ON;;;;;N;;;;; +FD4C;ARABIC LIGATURE SALLALLAHU ALAYHI WAAALIHEE WA-SALLAM;So;0;ON;;;;;N;;;;; +FD4D;ARABIC LIGATURE ALAYHAA AS-SALAAM;So;0;ON;;;;;N;;;;; +FD4E;ARABIC LIGATURE TABAARAKA WA-TAAALAA;So;0;ON;;;;;N;;;;; +FD4F;ARABIC LIGATURE RAHIMAHUM ALLAAH;So;0;ON;;;;;N;;;;; +FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062C 0645;;;;N;;;;; +FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; +FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; +FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062D 0645;;;;N;;;;; +FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062E 0645;;;;N;;;;; +FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 062A 0645 062C;;;;N;;;;; +FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062A 0645 062D;;;;N;;;;; +FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 062A 0645 062E;;;;N;;;;; +FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; +FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; +FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 0645 064A;;;;N;;;;; +FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0645 0649;;;;N;;;;; +FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062D 062C;;;;N;;;;; +FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 062C 062D;;;;N;;;;; +FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062C 0649;;;;N;;;;; +FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; +FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; +FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0633 0645 062C;;;;N;;;;; +FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; +FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; +FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; +FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; +FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; +FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; +FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; +FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0634 062C 064A;;;;N;;;;; +FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; +FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; +FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; +FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; +FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 062D 0649;;;;N;;;;; +FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; +FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; +FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; +FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; +FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645 0645;;;;N;;;;; +FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0637 0645 064A;;;;N;;;;; +FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; +FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; +FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; +FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0645 0649;;;;N;;;;; +FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 063A 0645 0645;;;;N;;;;; +FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 063A 0645 064A;;;;N;;;;; +FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0645 0649;;;;N;;;;; +FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; +FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; +FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; +FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0642 0645 0645;;;;N;;;;; +FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; +FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0644 062D 064A;;;;N;;;;; +FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 062D 0649;;;;N;;;;; +FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; +FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; +FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; +FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; +FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; +FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; +FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062D 062C;;;;N;;;;; +FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062D 0645;;;;N;;;;; +FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062D 064A;;;;N;;;;; +FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062C 062D;;;;N;;;;; +FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062C 0645;;;;N;;;;; +FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062E 062C;;;;N;;;;; +FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062E 0645;;;;N;;;;; +FD90;ARABIC LIGATURE RAHMATU ALLAAHI ALAYH;So;0;ON;;;;;N;;;;; +FD91;ARABIC LIGATURE RAHMATU ALLAAHI ALAYHAA;So;0;ON;;;;;N;;;;; +FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062C 062E;;;;N;;;;; +FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0647 0645 062C;;;;N;;;;; +FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645 0645;;;;N;;;;; +FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062D 0645;;;;N;;;;; +FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062D 0649;;;;N;;;;; +FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; +FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; +FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062C 0649;;;;N;;;;; +FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 0645 064A;;;;N;;;;; +FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0645 0649;;;;N;;;;; +FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; +FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; +FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062E 064A;;;;N;;;;; +FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 062C 064A;;;;N;;;;; +FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062C 0649;;;;N;;;;; +FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 062A 062E 064A;;;;N;;;;; +FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062E 0649;;;;N;;;;; +FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 0645 064A;;;;N;;;;; +FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0645 0649;;;;N;;;;; +FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 0645 064A;;;;N;;;;; +FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 062D 0649;;;;N;;;;; +FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0645 0649;;;;N;;;;; +FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062E 0649;;;;N;;;;; +FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0635 062D 064A;;;;N;;;;; +FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0634 062D 064A;;;;N;;;;; +FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0636 062D 064A;;;;N;;;;; +FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 062C 064A;;;;N;;;;; +FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 0645 064A;;;;N;;;;; +FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 064A 062D 064A;;;;N;;;;; +FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 062C 064A;;;;N;;;;; +FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 0645 064A;;;;N;;;;; +FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 0645 064A;;;;N;;;;; +FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0642 0645 064A;;;;N;;;;; +FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0646 062D 064A;;;;N;;;;; +FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; +FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; +FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0639 0645 064A;;;;N;;;;; +FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0643 0645 064A;;;;N;;;;; +FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; +FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062E 064A;;;;N;;;;; +FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; +FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; +FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; +FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; +FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 062C 062D 064A;;;;N;;;;; +FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 062C 064A;;;;N;;;;; +FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 062C 064A;;;;N;;;;; +FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0641 0645 064A;;;;N;;;;; +FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062D 064A;;;;N;;;;; +FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; +FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; +FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; +FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0633 062E 064A;;;;N;;;;; +FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 062C 064A;;;;N;;;;; +FDC8;ARABIC LIGATURE RAHIMAHU ALLAAH TAAALAA;So;0;ON;;;;;N;;;;; +FDC9;ARABIC LIGATURE RADI ALLAAHU TAAALAA ANH;So;0;ON;;;;;N;;;;; +FDCA;ARABIC LIGATURE RADI ALLAAHU TAAALAA ANHAA;So;0;ON;;;;;N;;;;; +FDCB;ARABIC LIGATURE RADI ALLAAHU TAAALAA ANHUMAA;So;0;ON;;;;;N;;;;; +FDCC;ARABIC LIGATURE SALLALLAHU ALAYHI WA-ALAA AALIHEE WA-SALLAM;So;0;ON;;;;;N;;;;; +FDCD;ARABIC LIGATURE AJJAL ALLAAHU TAAALAA FARAJAHU ASH-SHAREEF;So;0;ON;;;;;N;;;;; +FDCE;ARABIC LIGATURE KARRAMA ALLAAHU WAJHAH;So;0;ON;;;;;N;;;;; +FDCF;ARABIC LIGATURE SALAAMUHU ALAYNAA;So;0;ON;;;;;N;;;;; +FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0635 0644 06D2;;;;N;;;;; +FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0642 0644 06D2;;;;N;;;;; +FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL; 0627 0644 0644 0647;;;;N;;;;; +FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL; 0627 0643 0628 0631;;;;N;;;;; +FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL; 0645 062D 0645 062F;;;;N;;;;; +FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL; 0635 0644 0639 0645;;;;N;;;;; +FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL; 0631 0633 0648 0644;;;;N;;;;; +FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL; 0639 0644 064A 0647;;;;N;;;;; +FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL; 0648 0633 0644 0645;;;;N;;;;; +FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL; 0635 0644 0649;;;;N;;;;; +FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; +FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL; 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; +FDFC;RIAL SIGN;Sc;0;AL; 0631 06CC 0627 0644;;;;N;;;;; +FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;; +FDFE;ARABIC LIGATURE SUBHAANAHU WA TAAALAA;So;0;ON;;;;;N;;;;; +FDFF;ARABIC LIGATURE AZZA WA JALL;So;0;ON;;;;;N;;;;; +FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; +FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; +FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; +FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; +FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; +FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; +FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; +FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; +FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; +FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; +FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; +FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; +FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; +FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; +FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; +FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; +FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON; 002C;;;;N;;;;; +FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;;;;; +FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON; 003A;;;;N;;;;; +FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON; 3016;;;;N;;;;; +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON; 3017;;;;N;;;;; +FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON; 2026;;;;N;;;;; +FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; +FE27;COMBINING LIGATURE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE28;COMBINING LIGATURE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE29;COMBINING TILDE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; +FE2E;COMBINING CYRILLIC TITLO LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE2F;COMBINING CYRILLIC TITLO RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; +FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; +FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; +FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; +FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; +FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; +FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; +FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; +FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; +FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; +FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; +FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON; 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; +FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON; 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; +FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON; 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; +FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON; 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; +FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON; 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; +FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON; 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; +FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; +FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; +FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON; 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; +FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON; 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; +FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; +FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; +FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;N;;;;; +FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;N;;;;; +FE49;DASHED OVERLINE;Po;0;ON; 203E;;;;N;SPACING DASHED OVERSCORE;;;; +FE4A;CENTRELINE OVERLINE;Po;0;ON; 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; +FE4B;WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING WAVY OVERSCORE;;;; +FE4C;DOUBLE WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; +FE4D;DASHED LOW LINE;Pc;0;ON; 005F;;;;N;SPACING DASHED UNDERSCORE;;;; +FE4E;CENTRELINE LOW LINE;Pc;0;ON; 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; +FE4F;WAVY LOW LINE;Pc;0;ON; 005F;;;;N;SPACING WAVY UNDERSCORE;;;; +FE50;SMALL COMMA;Po;0;CS; 002C;;;;N;;;;; +FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FE52;SMALL FULL STOP;Po;0;CS; 002E;;;;N;SMALL PERIOD;;;; +FE54;SMALL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FE55;SMALL COLON;Po;0;CS; 003A;;;;N;;;;; +FE56;SMALL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FE57;SMALL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FE58;SMALL EM DASH;Pd;0;ON; 2014;;;;N;;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE5F;SMALL NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; +FE60;SMALL AMPERSAND;Po;0;ON; 0026;;;;N;;;;; +FE61;SMALL ASTERISK;Po;0;ON; 002A;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; +FE66;SMALL EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +FE68;SMALL REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;SMALL BACKSLASH;;;; +FE69;SMALL DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; +FE6A;SMALL PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; +FE6B;SMALL COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; +FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL; 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; +FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL; 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; +FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; +FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; +FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; +FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL; 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; +FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL; 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; +FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; +FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; +FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL; 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; +FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL; 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; +FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL; 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; +FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL; 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; +FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL; 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; +FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL; 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; +FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL; 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; +FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; +FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; +FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; +FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; +FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; +FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; +FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; +FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; +FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; +FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; +FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; +FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; +FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; +FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; +FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; +FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; +FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; +FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; +FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; +FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; +FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; +FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; +FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; +FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; +FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; +FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; +FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; +FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; +FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; +FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; +FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; +FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; +FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; +FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; +FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; +FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; +FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; +FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; +FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; +FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; +FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; +FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; +FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; +FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; +FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; +FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; +FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; +FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; +FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; +FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; +FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; +FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; +FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; +FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; +FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; +FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; +FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; +FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; +FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; +FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; +FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; +FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; +FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; +FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; +FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; +FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; +FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; +FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; +FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; +FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; +FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; +FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; +FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; +FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; +FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; +FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; +FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; +FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; +FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; +FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; +FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; +FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; +FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; +FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; +FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; +FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; +FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; +FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; +FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; +FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; +FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; +FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; +FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; +FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; +FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; +FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; +FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; +FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; +FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; +FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; +FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; +FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; +FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; +FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; +FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; +FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; +FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; +FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; +FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; +FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; +FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; +FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; +FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; +FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; +FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; +FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; +FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; +FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; +FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; +FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FF02;FULLWIDTH QUOTATION MARK;Po;0;ON; 0022;;;;N;;;;; +FF03;FULLWIDTH NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; +FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; +FF05;FULLWIDTH PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; +FF06;FULLWIDTH AMPERSAND;Po;0;ON; 0026;;;;N;;;;; +FF07;FULLWIDTH APOSTROPHE;Po;0;ON; 0027;;;;N;;;;; +FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; +FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; +FF0A;FULLWIDTH ASTERISK;Po;0;ON; 002A;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FF0C;FULLWIDTH COMMA;Po;0;CS; 002C;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; +FF0E;FULLWIDTH FULL STOP;Po;0;CS; 002E;;;;N;FULLWIDTH PERIOD;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;CS; 002F;;;;N;FULLWIDTH SLASH;;;; +FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +FF11;FULLWIDTH DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +FF12;FULLWIDTH DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +FF13;FULLWIDTH DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +FF16;FULLWIDTH DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +FF19;FULLWIDTH DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +FF1A;FULLWIDTH COLON;Po;0;CS; 003A;;;;N;;;;; +FF1B;FULLWIDTH SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; +FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; +FF1F;FULLWIDTH QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; +FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L; 0041;;;;N;;;;FF41; +FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L; 0042;;;;N;;;;FF42; +FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L; 0043;;;;N;;;;FF43; +FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L; 0044;;;;N;;;;FF44; +FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L; 0045;;;;N;;;;FF45; +FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L; 0046;;;;N;;;;FF46; +FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L; 0047;;;;N;;;;FF47; +FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L; 0048;;;;N;;;;FF48; +FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L; 0049;;;;N;;;;FF49; +FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L; 004A;;;;N;;;;FF4A; +FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L; 004B;;;;N;;;;FF4B; +FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L; 004C;;;;N;;;;FF4C; +FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L; 004D;;;;N;;;;FF4D; +FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L; 004E;;;;N;;;;FF4E; +FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L; 004F;;;;N;;;;FF4F; +FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L; 0050;;;;N;;;;FF50; +FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L; 0051;;;;N;;;;FF51; +FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L; 0052;;;;N;;;;FF52; +FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L; 0053;;;;N;;;;FF53; +FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L; 0054;;;;N;;;;FF54; +FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L; 0055;;;;N;;;;FF55; +FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L; 0056;;;;N;;;;FF56; +FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L; 0057;;;;N;;;;FF57; +FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L; 0058;;;;N;;;;FF58; +FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L; 0059;;;;N;;;;FF59; +FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L; 005A;;;;N;;;;FF5A; +FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; +FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;FULLWIDTH BACKSLASH;;;; +FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; +FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON; 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; +FF3F;FULLWIDTH LOW LINE;Pc;0;ON; 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; +FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON; 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; +FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L; 0061;;;;N;;;FF21;;FF21 +FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L; 0062;;;;N;;;FF22;;FF22 +FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L; 0063;;;;N;;;FF23;;FF23 +FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L; 0064;;;;N;;;FF24;;FF24 +FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L; 0065;;;;N;;;FF25;;FF25 +FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L; 0066;;;;N;;;FF26;;FF26 +FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L; 0067;;;;N;;;FF27;;FF27 +FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L; 0068;;;;N;;;FF28;;FF28 +FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L; 0069;;;;N;;;FF29;;FF29 +FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L; 006A;;;;N;;;FF2A;;FF2A +FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L; 006B;;;;N;;;FF2B;;FF2B +FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L; 006C;;;;N;;;FF2C;;FF2C +FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L; 006D;;;;N;;;FF2D;;FF2D +FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;FF2E;;FF2E +FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L; 006F;;;;N;;;FF2F;;FF2F +FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L; 0070;;;;N;;;FF30;;FF30 +FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L; 0071;;;;N;;;FF31;;FF31 +FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L; 0072;;;;N;;;FF32;;FF32 +FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L; 0073;;;;N;;;FF33;;FF33 +FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L; 0074;;;;N;;;FF34;;FF34 +FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L; 0075;;;;N;;;FF35;;FF35 +FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L; 0076;;;;N;;;FF36;;FF36 +FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L; 0077;;;;N;;;FF37;;FF37 +FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L; 0078;;;;N;;;FF38;;FF38 +FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L; 0079;;;;N;;;FF39;;FF39 +FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L; 007A;;;;N;;;FF3A;;FF3A +FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; +FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON; 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; +FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; +FF5E;FULLWIDTH TILDE;Sm;0;ON; 007E;;;;N;FULLWIDTH SPACING TILDE;;;; +FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON; 2985;;;;Y;;;;; +FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON; 2986;;;;Y;;;;; +FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; +FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; +FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; +FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON; 30FB;;;;N;;;;; +FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L; 30F2;;;;N;;;;; +FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L; 30A1;;;;N;;;;; +FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L; 30A3;;;;N;;;;; +FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L; 30A5;;;;N;;;;; +FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L; 30A7;;;;N;;;;; +FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L; 30A9;;;;N;;;;; +FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L; 30E3;;;;N;;;;; +FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L; 30E5;;;;N;;;;; +FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L; 30E7;;;;N;;;;; +FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L; 30C3;;;;N;;;;; +FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L; 30FC;;;;N;;;;; +FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L; 30A2;;;;N;;;;; +FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L; 30A4;;;;N;;;;; +FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L; 30A6;;;;N;;;;; +FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L; 30A8;;;;N;;;;; +FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L; 30AA;;;;N;;;;; +FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L; 30AB;;;;N;;;;; +FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L; 30AD;;;;N;;;;; +FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L; 30AF;;;;N;;;;; +FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L; 30B1;;;;N;;;;; +FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L; 30B3;;;;N;;;;; +FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L; 30B5;;;;N;;;;; +FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L; 30B7;;;;N;;;;; +FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L; 30B9;;;;N;;;;; +FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L; 30BB;;;;N;;;;; +FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L; 30BD;;;;N;;;;; +FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L; 30BF;;;;N;;;;; +FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L; 30C1;;;;N;;;;; +FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L; 30C4;;;;N;;;;; +FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L; 30C6;;;;N;;;;; +FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L; 30C8;;;;N;;;;; +FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L; 30CA;;;;N;;;;; +FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L; 30CB;;;;N;;;;; +FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L; 30CC;;;;N;;;;; +FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L; 30CD;;;;N;;;;; +FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L; 30CE;;;;N;;;;; +FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L; 30CF;;;;N;;;;; +FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L; 30D2;;;;N;;;;; +FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L; 30D5;;;;N;;;;; +FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L; 30D8;;;;N;;;;; +FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L; 30DB;;;;N;;;;; +FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L; 30DE;;;;N;;;;; +FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L; 30DF;;;;N;;;;; +FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L; 30E0;;;;N;;;;; +FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L; 30E1;;;;N;;;;; +FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L; 30E2;;;;N;;;;; +FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L; 30E4;;;;N;;;;; +FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L; 30E6;;;;N;;;;; +FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L; 30E8;;;;N;;;;; +FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L; 30E9;;;;N;;;;; +FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L; 30EA;;;;N;;;;; +FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L; 30EB;;;;N;;;;; +FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L; 30EC;;;;N;;;;; +FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L; 30ED;;;;N;;;;; +FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L; 30EF;;;;N;;;;; +FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L; 30F3;;;;N;;;;; +FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; +FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; +FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L; 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; +FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L; 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; +FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L; 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; +FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; +FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L; 3134;;;;N;;;;; +FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; +FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; +FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L; 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; +FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L; 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; +FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L; 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; +FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; +FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; +FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; +FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L; 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; +FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; +FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; +FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; +FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L; 3141;;;;N;;;;; +FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L; 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; +FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L; 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; +FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L; 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; +FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L; 3145;;;;N;;;;; +FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L; 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; +FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L; 3147;;;;N;;;;; +FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L; 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; +FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L; 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; +FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L; 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; +FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L; 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; +FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L; 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; +FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L; 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; +FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L; 314E;;;;N;;;;; +FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L; 314F;;;;N;;;;; +FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L; 3150;;;;N;;;;; +FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L; 3151;;;;N;;;;; +FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L; 3152;;;;N;;;;; +FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L; 3153;;;;N;;;;; +FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L; 3154;;;;N;;;;; +FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L; 3155;;;;N;;;;; +FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L; 3156;;;;N;;;;; +FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L; 3157;;;;N;;;;; +FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L; 3158;;;;N;;;;; +FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L; 3159;;;;N;;;;; +FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L; 315A;;;;N;;;;; +FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L; 315B;;;;N;;;;; +FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L; 315C;;;;N;;;;; +FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L; 315D;;;;N;;;;; +FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L; 315E;;;;N;;;;; +FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L; 315F;;;;N;;;;; +FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L; 3160;;;;N;;;;; +FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L; 3161;;;;N;;;;; +FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L; 3162;;;;N;;;;; +FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; +FFE0;FULLWIDTH CENT SIGN;Sc;0;ET; 00A2;;;;N;;;;; +FFE1;FULLWIDTH POUND SIGN;Sc;0;ET; 00A3;;;;N;;;;; +FFE2;FULLWIDTH NOT SIGN;Sm;0;ON; 00AC;;;;N;;;;; +FFE3;FULLWIDTH MACRON;Sk;0;ON; 00AF;;;;N;FULLWIDTH SPACING MACRON;;;; +FFE4;FULLWIDTH BROKEN BAR;So;0;ON; 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; +FFE5;FULLWIDTH YEN SIGN;Sc;0;ET; 00A5;;;;N;;;;; +FFE6;FULLWIDTH WON SIGN;Sc;0;ET; 20A9;;;;N;;;;; +FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON; 2502;;;;N;;;;; +FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON; 2190;;;;N;;;;; +FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON; 2191;;;;N;;;;; +FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON; 2192;;;;N;;;;; +FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON; 2193;;;;N;;;;; +FFED;HALFWIDTH BLACK SQUARE;So;0;ON; 25A0;;;;N;;;;; +FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON; 25CB;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; +FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; +10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; +10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; +10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; +10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; +10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; +10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; +10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; +10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; +10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; +1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; +1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; +1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; +1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; +1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; +10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; +10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; +10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; +10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; +10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; +10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; +10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; +10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; +10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; +10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; +1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; +1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; +1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; +1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; +1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; +1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; +10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; +10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; +10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; +10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; +10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; +10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; +10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; +10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; +10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; +1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; +1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; +1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; +1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; +1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; +1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; +10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; +10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; +10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; +10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; +10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; +10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; +10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; +10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; +10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; +10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; +1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; +1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; +1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; +1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; +10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; +10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; +10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; +10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; +10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; +10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; +10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; +10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; +10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; +10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; +1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; +1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; +1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; +1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; +10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; +10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; +10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; +10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; +10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; +10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; +10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; +10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; +10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; +10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; +1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; +1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; +1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; +1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; +10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; +10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; +10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; +10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; +10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; +10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; +10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; +10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; +10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; +10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; +1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; +1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; +1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; +1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; +1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; +1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; +10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; +10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; +10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; +10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; +10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; +10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; +10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; +10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; +10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; +10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; +1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; +1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; +1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; +1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; +1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; +1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; +100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; +100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; +100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; +100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; +100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; +100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; +100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; +100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; +100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; +100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; +100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; +100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; +100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; +100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; +100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; +100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; +100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; +100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; +100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; +100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; +100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; +100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; +100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; +100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; +100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; +100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; +100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; +100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; +100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; +100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; +100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; +100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; +100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; +100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; +100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; +100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; +100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; +100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; +100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; +100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; +100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; +100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;; +100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; +100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;; +100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; +100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; +100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; +100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; +100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; +100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; +100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; +100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; +100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; +100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; +100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; +100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; +100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; +100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; +100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; +100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; +100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; +100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; +100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; +100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; +100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; +100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; +100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; +100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; +100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; +100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; +100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; +100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; +100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; +100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; +100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; +100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; +100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; +100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; +100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; +100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; +100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; +100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; +100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; +100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; +100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; +100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; +100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; +100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; +100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; +100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; +100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; +10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; +10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; +10102;AEGEAN CHECK MARK;Po;0;L;;;;;N;;;;; +10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; +10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; +10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; +1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; +1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; +1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; +1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; +1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; +1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; +10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; +10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; +10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; +10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; +10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; +10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; +10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; +10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; +1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; +1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; +1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; +1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; +1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; +10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; +10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; +10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; +10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; +10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; +10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; +10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; +10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; +10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; +1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; +1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; +1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; +1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; +1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; +10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; +10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; +10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; +10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; +10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; +10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; +10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; +1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; +1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; +10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; +10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; +10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; +10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; +10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; +10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; +10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; +10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; +1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; +1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; +1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; +1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; +1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; +1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; +10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; +10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; +10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; +10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; +10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; +10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; +10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; +10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; +10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; +10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; +1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; +1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; +10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; +10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; +10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; +10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; +10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; +10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; +1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; +1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; +10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; +10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; +10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; +10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; +10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; +10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; +10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; +1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; +1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; +1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; +1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; +10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; +10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; +10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; +10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; +10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; +10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; +10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; +10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; +10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; +10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; +1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; +1018B;GREEK ONE QUARTER SIGN;No;0;ON;;;;1/4;N;;;;; +1018C;GREEK SINUSOID SIGN;So;0;ON;;;;;N;;;;; +1018D;GREEK INDICTION SIGN;So;0;L;;;;;N;;;;; +1018E;NOMISMA SIGN;So;0;L;;;;;N;;;;; +10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; +10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; +10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; +10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; +10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; +10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; +10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; +10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; +1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; +1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; +1019C;ASCIA SYMBOL;So;0;ON;;;;;N;;;;; +101A0;GREEK SYMBOL TAU RHO;So;0;ON;;;;;N;;;;; +101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; +101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; +101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; +101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; +101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; +101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; +101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; +101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; +101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; +101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; +101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; +101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; +101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; +101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; +101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; +101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; +101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; +101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; +101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; +101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; +101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; +101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; +101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; +101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; +101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; +101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; +101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; +101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; +101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; +101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; +101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; +101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; +101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; +101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; +101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; +101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; +101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; +101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; +101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; +101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; +101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; +101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; +101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; +101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; +101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; +101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; +10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; +10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; +10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; +10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; +10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; +10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; +10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; +10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; +10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; +10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; +1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; +1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; +1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; +1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; +1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; +1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; +10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; +10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; +10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; +10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; +10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; +10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; +10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; +10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; +10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; +10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; +1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; +1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; +1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; +102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; +102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; +102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; +102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; +102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; +102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; +102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; +102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; +102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; +102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; +102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; +102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; +102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; +102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; +102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; +102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; +102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; +102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; +102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; +102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; +102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; +102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; +102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; +102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; +102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; +102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; +102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; +102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; +102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; +102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; +102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; +102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; +102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; +102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; +102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; +102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; +102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; +102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; +102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; +102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; +102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; +102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; +102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; +102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; +102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; +102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; +102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; +102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; +102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; +102E0;COPTIC EPACT THOUSANDS MARK;Mn;220;NSM;;;;;N;;;;; +102E1;COPTIC EPACT DIGIT ONE;No;0;EN;;;;1;N;;;;; +102E2;COPTIC EPACT DIGIT TWO;No;0;EN;;;;2;N;;;;; +102E3;COPTIC EPACT DIGIT THREE;No;0;EN;;;;3;N;;;;; +102E4;COPTIC EPACT DIGIT FOUR;No;0;EN;;;;4;N;;;;; +102E5;COPTIC EPACT DIGIT FIVE;No;0;EN;;;;5;N;;;;; +102E6;COPTIC EPACT DIGIT SIX;No;0;EN;;;;6;N;;;;; +102E7;COPTIC EPACT DIGIT SEVEN;No;0;EN;;;;7;N;;;;; +102E8;COPTIC EPACT DIGIT EIGHT;No;0;EN;;;;8;N;;;;; +102E9;COPTIC EPACT DIGIT NINE;No;0;EN;;;;9;N;;;;; +102EA;COPTIC EPACT NUMBER TEN;No;0;EN;;;;10;N;;;;; +102EB;COPTIC EPACT NUMBER TWENTY;No;0;EN;;;;20;N;;;;; +102EC;COPTIC EPACT NUMBER THIRTY;No;0;EN;;;;30;N;;;;; +102ED;COPTIC EPACT NUMBER FORTY;No;0;EN;;;;40;N;;;;; +102EE;COPTIC EPACT NUMBER FIFTY;No;0;EN;;;;50;N;;;;; +102EF;COPTIC EPACT NUMBER SIXTY;No;0;EN;;;;60;N;;;;; +102F0;COPTIC EPACT NUMBER SEVENTY;No;0;EN;;;;70;N;;;;; +102F1;COPTIC EPACT NUMBER EIGHTY;No;0;EN;;;;80;N;;;;; +102F2;COPTIC EPACT NUMBER NINETY;No;0;EN;;;;90;N;;;;; +102F3;COPTIC EPACT NUMBER ONE HUNDRED;No;0;EN;;;;100;N;;;;; +102F4;COPTIC EPACT NUMBER TWO HUNDRED;No;0;EN;;;;200;N;;;;; +102F5;COPTIC EPACT NUMBER THREE HUNDRED;No;0;EN;;;;300;N;;;;; +102F6;COPTIC EPACT NUMBER FOUR HUNDRED;No;0;EN;;;;400;N;;;;; +102F7;COPTIC EPACT NUMBER FIVE HUNDRED;No;0;EN;;;;500;N;;;;; +102F8;COPTIC EPACT NUMBER SIX HUNDRED;No;0;EN;;;;600;N;;;;; +102F9;COPTIC EPACT NUMBER SEVEN HUNDRED;No;0;EN;;;;700;N;;;;; +102FA;COPTIC EPACT NUMBER EIGHT HUNDRED;No;0;EN;;;;800;N;;;;; +102FB;COPTIC EPACT NUMBER NINE HUNDRED;No;0;EN;;;;900;N;;;;; +10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; +10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; +10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; +10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; +10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; +10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; +10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; +10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; +10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; +10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; +1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; +1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; +1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; +1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; +1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; +1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;; +10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; +10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; +10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; +10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; +10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; +10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; +10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; +10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;; +10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; +10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; +1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; +1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;; +1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;; +1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;; +1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;; +1031F;OLD ITALIC LETTER ESS;Lo;0;L;;;;;N;;;;; +10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; +10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; +10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; +10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; +1032D;OLD ITALIC LETTER YE;Lo;0;L;;;;;N;;;;; +1032E;OLD ITALIC LETTER NORTHERN TSE;Lo;0;L;;;;;N;;;;; +1032F;OLD ITALIC LETTER SOUTHERN TSE;Lo;0;L;;;;;N;;;;; +10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; +10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; +10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; +10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; +10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; +10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; +10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; +10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; +10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; +10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; +1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; +1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; +1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; +1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; +1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; +1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; +10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; +10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; +10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; +10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; +10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; +10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; +10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; +10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; +10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; +10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; +1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; +10350;OLD PERMIC LETTER AN;Lo;0;L;;;;;N;;;;; +10351;OLD PERMIC LETTER BUR;Lo;0;L;;;;;N;;;;; +10352;OLD PERMIC LETTER GAI;Lo;0;L;;;;;N;;;;; +10353;OLD PERMIC LETTER DOI;Lo;0;L;;;;;N;;;;; +10354;OLD PERMIC LETTER E;Lo;0;L;;;;;N;;;;; +10355;OLD PERMIC LETTER ZHOI;Lo;0;L;;;;;N;;;;; +10356;OLD PERMIC LETTER DZHOI;Lo;0;L;;;;;N;;;;; +10357;OLD PERMIC LETTER ZATA;Lo;0;L;;;;;N;;;;; +10358;OLD PERMIC LETTER DZITA;Lo;0;L;;;;;N;;;;; +10359;OLD PERMIC LETTER I;Lo;0;L;;;;;N;;;;; +1035A;OLD PERMIC LETTER KOKE;Lo;0;L;;;;;N;;;;; +1035B;OLD PERMIC LETTER LEI;Lo;0;L;;;;;N;;;;; +1035C;OLD PERMIC LETTER MENOE;Lo;0;L;;;;;N;;;;; +1035D;OLD PERMIC LETTER NENOE;Lo;0;L;;;;;N;;;;; +1035E;OLD PERMIC LETTER VOOI;Lo;0;L;;;;;N;;;;; +1035F;OLD PERMIC LETTER PEEI;Lo;0;L;;;;;N;;;;; +10360;OLD PERMIC LETTER REI;Lo;0;L;;;;;N;;;;; +10361;OLD PERMIC LETTER SII;Lo;0;L;;;;;N;;;;; +10362;OLD PERMIC LETTER TAI;Lo;0;L;;;;;N;;;;; +10363;OLD PERMIC LETTER U;Lo;0;L;;;;;N;;;;; +10364;OLD PERMIC LETTER CHERY;Lo;0;L;;;;;N;;;;; +10365;OLD PERMIC LETTER SHOOI;Lo;0;L;;;;;N;;;;; +10366;OLD PERMIC LETTER SHCHOOI;Lo;0;L;;;;;N;;;;; +10367;OLD PERMIC LETTER YRY;Lo;0;L;;;;;N;;;;; +10368;OLD PERMIC LETTER YERU;Lo;0;L;;;;;N;;;;; +10369;OLD PERMIC LETTER O;Lo;0;L;;;;;N;;;;; +1036A;OLD PERMIC LETTER OO;Lo;0;L;;;;;N;;;;; +1036B;OLD PERMIC LETTER EF;Lo;0;L;;;;;N;;;;; +1036C;OLD PERMIC LETTER HA;Lo;0;L;;;;;N;;;;; +1036D;OLD PERMIC LETTER TSIU;Lo;0;L;;;;;N;;;;; +1036E;OLD PERMIC LETTER VER;Lo;0;L;;;;;N;;;;; +1036F;OLD PERMIC LETTER YER;Lo;0;L;;;;;N;;;;; +10370;OLD PERMIC LETTER YERI;Lo;0;L;;;;;N;;;;; +10371;OLD PERMIC LETTER YAT;Lo;0;L;;;;;N;;;;; +10372;OLD PERMIC LETTER IE;Lo;0;L;;;;;N;;;;; +10373;OLD PERMIC LETTER YU;Lo;0;L;;;;;N;;;;; +10374;OLD PERMIC LETTER YA;Lo;0;L;;;;;N;;;;; +10375;OLD PERMIC LETTER IA;Lo;0;L;;;;;N;;;;; +10376;COMBINING OLD PERMIC LETTER AN;Mn;230;NSM;;;;;N;;;;; +10377;COMBINING OLD PERMIC LETTER DOI;Mn;230;NSM;;;;;N;;;;; +10378;COMBINING OLD PERMIC LETTER ZATA;Mn;230;NSM;;;;;N;;;;; +10379;COMBINING OLD PERMIC LETTER NENOE;Mn;230;NSM;;;;;N;;;;; +1037A;COMBINING OLD PERMIC LETTER SII;Mn;230;NSM;;;;;N;;;;; +10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; +10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; +10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; +10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; +10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; +10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; +10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; +10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; +10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; +10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; +1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; +1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; +1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; +1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; +1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; +1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; +10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; +10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; +10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; +10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; +10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; +10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; +10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; +10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; +10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; +10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; +1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; +1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; +1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; +1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; +1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; +103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; +103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; +103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; +103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; +103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; +103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; +103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; +103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; +103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; +103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; +103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; +103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; +103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; +103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; +103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; +103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; +103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; +103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; +103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; +103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; +103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; +103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; +103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; +103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; +103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; +103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; +103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; +103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; +103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; +103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; +103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; +103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; +103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; +103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; +103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; +103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; +103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; +103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; +103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; +103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; +103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; +103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; +103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; +103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; +103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; +103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; +103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; +103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; +103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; +10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; +10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; +10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; +10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; +10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; +10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; +10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; +10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; +10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; +10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; +1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; +1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; +1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; +1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; +1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; +1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; +10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; +10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; +10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; +10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; +10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; +10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; +10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; +10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; +10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; +10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; +1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; +1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; +1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; +1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; +1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; +1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; +10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; +10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; +10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; +10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; +10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; +10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; +10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; +10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; +10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 +10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 +1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 +1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 +1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 +1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 +1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 +1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 +10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 +10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 +10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A +10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B +10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C +10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D +10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E +10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F +10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 +10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 +1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 +1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 +1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 +1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 +1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 +1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 +10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 +10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 +10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A +10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B +10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C +10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D +10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E +10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F +10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 +10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 +1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 +1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 +1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 +1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 +1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 +1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 +10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; +10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; +10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; +10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; +10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; +10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; +10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; +10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; +10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; +10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; +1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; +1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; +1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; +1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; +1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; +1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; +10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; +10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; +10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; +10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; +10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; +10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; +10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; +10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; +10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; +10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; +1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; +1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; +1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; +1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; +1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; +1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; +10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; +10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; +10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; +10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; +10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; +10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; +10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; +10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; +10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; +10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; +1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; +1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; +1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; +1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; +1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; +1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; +10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; +10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; +10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; +10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; +10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; +10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; +10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; +10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; +10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; +10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; +1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; +1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; +1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; +1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; +1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; +1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; +10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; +10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; +10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; +10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; +10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; +10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; +10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; +10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; +10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; +10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; +1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; +1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; +1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; +1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; +104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104B0;OSAGE CAPITAL LETTER A;Lu;0;L;;;;;N;;;;104D8; +104B1;OSAGE CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;104D9; +104B2;OSAGE CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;104DA; +104B3;OSAGE CAPITAL LETTER AH;Lu;0;L;;;;;N;;;;104DB; +104B4;OSAGE CAPITAL LETTER BRA;Lu;0;L;;;;;N;;;;104DC; +104B5;OSAGE CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;104DD; +104B6;OSAGE CAPITAL LETTER EHCHA;Lu;0;L;;;;;N;;;;104DE; +104B7;OSAGE CAPITAL LETTER E;Lu;0;L;;;;;N;;;;104DF; +104B8;OSAGE CAPITAL LETTER EIN;Lu;0;L;;;;;N;;;;104E0; +104B9;OSAGE CAPITAL LETTER HA;Lu;0;L;;;;;N;;;;104E1; +104BA;OSAGE CAPITAL LETTER HYA;Lu;0;L;;;;;N;;;;104E2; +104BB;OSAGE CAPITAL LETTER I;Lu;0;L;;;;;N;;;;104E3; +104BC;OSAGE CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;104E4; +104BD;OSAGE CAPITAL LETTER EHKA;Lu;0;L;;;;;N;;;;104E5; +104BE;OSAGE CAPITAL LETTER KYA;Lu;0;L;;;;;N;;;;104E6; +104BF;OSAGE CAPITAL LETTER LA;Lu;0;L;;;;;N;;;;104E7; +104C0;OSAGE CAPITAL LETTER MA;Lu;0;L;;;;;N;;;;104E8; +104C1;OSAGE CAPITAL LETTER NA;Lu;0;L;;;;;N;;;;104E9; +104C2;OSAGE CAPITAL LETTER O;Lu;0;L;;;;;N;;;;104EA; +104C3;OSAGE CAPITAL LETTER OIN;Lu;0;L;;;;;N;;;;104EB; +104C4;OSAGE CAPITAL LETTER PA;Lu;0;L;;;;;N;;;;104EC; +104C5;OSAGE CAPITAL LETTER EHPA;Lu;0;L;;;;;N;;;;104ED; +104C6;OSAGE CAPITAL LETTER SA;Lu;0;L;;;;;N;;;;104EE; +104C7;OSAGE CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;104EF; +104C8;OSAGE CAPITAL LETTER TA;Lu;0;L;;;;;N;;;;104F0; +104C9;OSAGE CAPITAL LETTER EHTA;Lu;0;L;;;;;N;;;;104F1; +104CA;OSAGE CAPITAL LETTER TSA;Lu;0;L;;;;;N;;;;104F2; +104CB;OSAGE CAPITAL LETTER EHTSA;Lu;0;L;;;;;N;;;;104F3; +104CC;OSAGE CAPITAL LETTER TSHA;Lu;0;L;;;;;N;;;;104F4; +104CD;OSAGE CAPITAL LETTER DHA;Lu;0;L;;;;;N;;;;104F5; +104CE;OSAGE CAPITAL LETTER U;Lu;0;L;;;;;N;;;;104F6; +104CF;OSAGE CAPITAL LETTER WA;Lu;0;L;;;;;N;;;;104F7; +104D0;OSAGE CAPITAL LETTER KHA;Lu;0;L;;;;;N;;;;104F8; +104D1;OSAGE CAPITAL LETTER GHA;Lu;0;L;;;;;N;;;;104F9; +104D2;OSAGE CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;104FA; +104D3;OSAGE CAPITAL LETTER ZHA;Lu;0;L;;;;;N;;;;104FB; +104D8;OSAGE SMALL LETTER A;Ll;0;L;;;;;N;;;104B0;;104B0 +104D9;OSAGE SMALL LETTER AI;Ll;0;L;;;;;N;;;104B1;;104B1 +104DA;OSAGE SMALL LETTER AIN;Ll;0;L;;;;;N;;;104B2;;104B2 +104DB;OSAGE SMALL LETTER AH;Ll;0;L;;;;;N;;;104B3;;104B3 +104DC;OSAGE SMALL LETTER BRA;Ll;0;L;;;;;N;;;104B4;;104B4 +104DD;OSAGE SMALL LETTER CHA;Ll;0;L;;;;;N;;;104B5;;104B5 +104DE;OSAGE SMALL LETTER EHCHA;Ll;0;L;;;;;N;;;104B6;;104B6 +104DF;OSAGE SMALL LETTER E;Ll;0;L;;;;;N;;;104B7;;104B7 +104E0;OSAGE SMALL LETTER EIN;Ll;0;L;;;;;N;;;104B8;;104B8 +104E1;OSAGE SMALL LETTER HA;Ll;0;L;;;;;N;;;104B9;;104B9 +104E2;OSAGE SMALL LETTER HYA;Ll;0;L;;;;;N;;;104BA;;104BA +104E3;OSAGE SMALL LETTER I;Ll;0;L;;;;;N;;;104BB;;104BB +104E4;OSAGE SMALL LETTER KA;Ll;0;L;;;;;N;;;104BC;;104BC +104E5;OSAGE SMALL LETTER EHKA;Ll;0;L;;;;;N;;;104BD;;104BD +104E6;OSAGE SMALL LETTER KYA;Ll;0;L;;;;;N;;;104BE;;104BE +104E7;OSAGE SMALL LETTER LA;Ll;0;L;;;;;N;;;104BF;;104BF +104E8;OSAGE SMALL LETTER MA;Ll;0;L;;;;;N;;;104C0;;104C0 +104E9;OSAGE SMALL LETTER NA;Ll;0;L;;;;;N;;;104C1;;104C1 +104EA;OSAGE SMALL LETTER O;Ll;0;L;;;;;N;;;104C2;;104C2 +104EB;OSAGE SMALL LETTER OIN;Ll;0;L;;;;;N;;;104C3;;104C3 +104EC;OSAGE SMALL LETTER PA;Ll;0;L;;;;;N;;;104C4;;104C4 +104ED;OSAGE SMALL LETTER EHPA;Ll;0;L;;;;;N;;;104C5;;104C5 +104EE;OSAGE SMALL LETTER SA;Ll;0;L;;;;;N;;;104C6;;104C6 +104EF;OSAGE SMALL LETTER SHA;Ll;0;L;;;;;N;;;104C7;;104C7 +104F0;OSAGE SMALL LETTER TA;Ll;0;L;;;;;N;;;104C8;;104C8 +104F1;OSAGE SMALL LETTER EHTA;Ll;0;L;;;;;N;;;104C9;;104C9 +104F2;OSAGE SMALL LETTER TSA;Ll;0;L;;;;;N;;;104CA;;104CA +104F3;OSAGE SMALL LETTER EHTSA;Ll;0;L;;;;;N;;;104CB;;104CB +104F4;OSAGE SMALL LETTER TSHA;Ll;0;L;;;;;N;;;104CC;;104CC +104F5;OSAGE SMALL LETTER DHA;Ll;0;L;;;;;N;;;104CD;;104CD +104F6;OSAGE SMALL LETTER U;Ll;0;L;;;;;N;;;104CE;;104CE +104F7;OSAGE SMALL LETTER WA;Ll;0;L;;;;;N;;;104CF;;104CF +104F8;OSAGE SMALL LETTER KHA;Ll;0;L;;;;;N;;;104D0;;104D0 +104F9;OSAGE SMALL LETTER GHA;Ll;0;L;;;;;N;;;104D1;;104D1 +104FA;OSAGE SMALL LETTER ZA;Ll;0;L;;;;;N;;;104D2;;104D2 +104FB;OSAGE SMALL LETTER ZHA;Ll;0;L;;;;;N;;;104D3;;104D3 +10500;ELBASAN LETTER A;Lo;0;L;;;;;N;;;;; +10501;ELBASAN LETTER BE;Lo;0;L;;;;;N;;;;; +10502;ELBASAN LETTER CE;Lo;0;L;;;;;N;;;;; +10503;ELBASAN LETTER CHE;Lo;0;L;;;;;N;;;;; +10504;ELBASAN LETTER DE;Lo;0;L;;;;;N;;;;; +10505;ELBASAN LETTER NDE;Lo;0;L;;;;;N;;;;; +10506;ELBASAN LETTER DHE;Lo;0;L;;;;;N;;;;; +10507;ELBASAN LETTER EI;Lo;0;L;;;;;N;;;;; +10508;ELBASAN LETTER E;Lo;0;L;;;;;N;;;;; +10509;ELBASAN LETTER FE;Lo;0;L;;;;;N;;;;; +1050A;ELBASAN LETTER GE;Lo;0;L;;;;;N;;;;; +1050B;ELBASAN LETTER GJE;Lo;0;L;;;;;N;;;;; +1050C;ELBASAN LETTER HE;Lo;0;L;;;;;N;;;;; +1050D;ELBASAN LETTER I;Lo;0;L;;;;;N;;;;; +1050E;ELBASAN LETTER JE;Lo;0;L;;;;;N;;;;; +1050F;ELBASAN LETTER KE;Lo;0;L;;;;;N;;;;; +10510;ELBASAN LETTER LE;Lo;0;L;;;;;N;;;;; +10511;ELBASAN LETTER LLE;Lo;0;L;;;;;N;;;;; +10512;ELBASAN LETTER ME;Lo;0;L;;;;;N;;;;; +10513;ELBASAN LETTER NE;Lo;0;L;;;;;N;;;;; +10514;ELBASAN LETTER NA;Lo;0;L;;;;;N;;;;; +10515;ELBASAN LETTER NJE;Lo;0;L;;;;;N;;;;; +10516;ELBASAN LETTER O;Lo;0;L;;;;;N;;;;; +10517;ELBASAN LETTER PE;Lo;0;L;;;;;N;;;;; +10518;ELBASAN LETTER QE;Lo;0;L;;;;;N;;;;; +10519;ELBASAN LETTER RE;Lo;0;L;;;;;N;;;;; +1051A;ELBASAN LETTER RRE;Lo;0;L;;;;;N;;;;; +1051B;ELBASAN LETTER SE;Lo;0;L;;;;;N;;;;; +1051C;ELBASAN LETTER SHE;Lo;0;L;;;;;N;;;;; +1051D;ELBASAN LETTER TE;Lo;0;L;;;;;N;;;;; +1051E;ELBASAN LETTER THE;Lo;0;L;;;;;N;;;;; +1051F;ELBASAN LETTER U;Lo;0;L;;;;;N;;;;; +10520;ELBASAN LETTER VE;Lo;0;L;;;;;N;;;;; +10521;ELBASAN LETTER XE;Lo;0;L;;;;;N;;;;; +10522;ELBASAN LETTER Y;Lo;0;L;;;;;N;;;;; +10523;ELBASAN LETTER ZE;Lo;0;L;;;;;N;;;;; +10524;ELBASAN LETTER ZHE;Lo;0;L;;;;;N;;;;; +10525;ELBASAN LETTER GHE;Lo;0;L;;;;;N;;;;; +10526;ELBASAN LETTER GHAMMA;Lo;0;L;;;;;N;;;;; +10527;ELBASAN LETTER KHE;Lo;0;L;;;;;N;;;;; +10530;CAUCASIAN ALBANIAN LETTER ALT;Lo;0;L;;;;;N;;;;; +10531;CAUCASIAN ALBANIAN LETTER BET;Lo;0;L;;;;;N;;;;; +10532;CAUCASIAN ALBANIAN LETTER GIM;Lo;0;L;;;;;N;;;;; +10533;CAUCASIAN ALBANIAN LETTER DAT;Lo;0;L;;;;;N;;;;; +10534;CAUCASIAN ALBANIAN LETTER EB;Lo;0;L;;;;;N;;;;; +10535;CAUCASIAN ALBANIAN LETTER ZARL;Lo;0;L;;;;;N;;;;; +10536;CAUCASIAN ALBANIAN LETTER EYN;Lo;0;L;;;;;N;;;;; +10537;CAUCASIAN ALBANIAN LETTER ZHIL;Lo;0;L;;;;;N;;;;; +10538;CAUCASIAN ALBANIAN LETTER TAS;Lo;0;L;;;;;N;;;;; +10539;CAUCASIAN ALBANIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1053A;CAUCASIAN ALBANIAN LETTER YOWD;Lo;0;L;;;;;N;;;;; +1053B;CAUCASIAN ALBANIAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +1053C;CAUCASIAN ALBANIAN LETTER IRB;Lo;0;L;;;;;N;;;;; +1053D;CAUCASIAN ALBANIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1053E;CAUCASIAN ALBANIAN LETTER LAN;Lo;0;L;;;;;N;;;;; +1053F;CAUCASIAN ALBANIAN LETTER INYA;Lo;0;L;;;;;N;;;;; +10540;CAUCASIAN ALBANIAN LETTER XEYN;Lo;0;L;;;;;N;;;;; +10541;CAUCASIAN ALBANIAN LETTER DYAN;Lo;0;L;;;;;N;;;;; +10542;CAUCASIAN ALBANIAN LETTER CAR;Lo;0;L;;;;;N;;;;; +10543;CAUCASIAN ALBANIAN LETTER JHOX;Lo;0;L;;;;;N;;;;; +10544;CAUCASIAN ALBANIAN LETTER KAR;Lo;0;L;;;;;N;;;;; +10545;CAUCASIAN ALBANIAN LETTER LYIT;Lo;0;L;;;;;N;;;;; +10546;CAUCASIAN ALBANIAN LETTER HEYT;Lo;0;L;;;;;N;;;;; +10547;CAUCASIAN ALBANIAN LETTER QAY;Lo;0;L;;;;;N;;;;; +10548;CAUCASIAN ALBANIAN LETTER AOR;Lo;0;L;;;;;N;;;;; +10549;CAUCASIAN ALBANIAN LETTER CHOY;Lo;0;L;;;;;N;;;;; +1054A;CAUCASIAN ALBANIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1054B;CAUCASIAN ALBANIAN LETTER CYAY;Lo;0;L;;;;;N;;;;; +1054C;CAUCASIAN ALBANIAN LETTER MAQ;Lo;0;L;;;;;N;;;;; +1054D;CAUCASIAN ALBANIAN LETTER QAR;Lo;0;L;;;;;N;;;;; +1054E;CAUCASIAN ALBANIAN LETTER NOWC;Lo;0;L;;;;;N;;;;; +1054F;CAUCASIAN ALBANIAN LETTER DZYAY;Lo;0;L;;;;;N;;;;; +10550;CAUCASIAN ALBANIAN LETTER SHAK;Lo;0;L;;;;;N;;;;; +10551;CAUCASIAN ALBANIAN LETTER JAYN;Lo;0;L;;;;;N;;;;; +10552;CAUCASIAN ALBANIAN LETTER ON;Lo;0;L;;;;;N;;;;; +10553;CAUCASIAN ALBANIAN LETTER TYAY;Lo;0;L;;;;;N;;;;; +10554;CAUCASIAN ALBANIAN LETTER FAM;Lo;0;L;;;;;N;;;;; +10555;CAUCASIAN ALBANIAN LETTER DZAY;Lo;0;L;;;;;N;;;;; +10556;CAUCASIAN ALBANIAN LETTER CHAT;Lo;0;L;;;;;N;;;;; +10557;CAUCASIAN ALBANIAN LETTER PEN;Lo;0;L;;;;;N;;;;; +10558;CAUCASIAN ALBANIAN LETTER GHEYS;Lo;0;L;;;;;N;;;;; +10559;CAUCASIAN ALBANIAN LETTER RAT;Lo;0;L;;;;;N;;;;; +1055A;CAUCASIAN ALBANIAN LETTER SEYK;Lo;0;L;;;;;N;;;;; +1055B;CAUCASIAN ALBANIAN LETTER VEYZ;Lo;0;L;;;;;N;;;;; +1055C;CAUCASIAN ALBANIAN LETTER TIWR;Lo;0;L;;;;;N;;;;; +1055D;CAUCASIAN ALBANIAN LETTER SHOY;Lo;0;L;;;;;N;;;;; +1055E;CAUCASIAN ALBANIAN LETTER IWN;Lo;0;L;;;;;N;;;;; +1055F;CAUCASIAN ALBANIAN LETTER CYAW;Lo;0;L;;;;;N;;;;; +10560;CAUCASIAN ALBANIAN LETTER CAYN;Lo;0;L;;;;;N;;;;; +10561;CAUCASIAN ALBANIAN LETTER YAYD;Lo;0;L;;;;;N;;;;; +10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;; +10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;; +1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;; +10570;VITHKUQI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;10597; +10571;VITHKUQI CAPITAL LETTER BBE;Lu;0;L;;;;;N;;;;10598; +10572;VITHKUQI CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;10599; +10573;VITHKUQI CAPITAL LETTER CE;Lu;0;L;;;;;N;;;;1059A; +10574;VITHKUQI CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;1059B; +10575;VITHKUQI CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;1059C; +10576;VITHKUQI CAPITAL LETTER DHE;Lu;0;L;;;;;N;;;;1059D; +10577;VITHKUQI CAPITAL LETTER EI;Lu;0;L;;;;;N;;;;1059E; +10578;VITHKUQI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;1059F; +10579;VITHKUQI CAPITAL LETTER FE;Lu;0;L;;;;;N;;;;105A0; +1057A;VITHKUQI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;105A1; +1057C;VITHKUQI CAPITAL LETTER HA;Lu;0;L;;;;;N;;;;105A3; +1057D;VITHKUQI CAPITAL LETTER HHA;Lu;0;L;;;;;N;;;;105A4; +1057E;VITHKUQI CAPITAL LETTER I;Lu;0;L;;;;;N;;;;105A5; +1057F;VITHKUQI CAPITAL LETTER IJE;Lu;0;L;;;;;N;;;;105A6; +10580;VITHKUQI CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;105A7; +10581;VITHKUQI CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;105A8; +10582;VITHKUQI CAPITAL LETTER LA;Lu;0;L;;;;;N;;;;105A9; +10583;VITHKUQI CAPITAL LETTER LLA;Lu;0;L;;;;;N;;;;105AA; +10584;VITHKUQI CAPITAL LETTER ME;Lu;0;L;;;;;N;;;;105AB; +10585;VITHKUQI CAPITAL LETTER NE;Lu;0;L;;;;;N;;;;105AC; +10586;VITHKUQI CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;105AD; +10587;VITHKUQI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;105AE; +10588;VITHKUQI CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;105AF; +10589;VITHKUQI CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;105B0; +1058A;VITHKUQI CAPITAL LETTER RE;Lu;0;L;;;;;N;;;;105B1; +1058C;VITHKUQI CAPITAL LETTER SE;Lu;0;L;;;;;N;;;;105B3; +1058D;VITHKUQI CAPITAL LETTER SHE;Lu;0;L;;;;;N;;;;105B4; +1058E;VITHKUQI CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;105B5; +1058F;VITHKUQI CAPITAL LETTER THE;Lu;0;L;;;;;N;;;;105B6; +10590;VITHKUQI CAPITAL LETTER U;Lu;0;L;;;;;N;;;;105B7; +10591;VITHKUQI CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;105B8; +10592;VITHKUQI CAPITAL LETTER XE;Lu;0;L;;;;;N;;;;105B9; +10594;VITHKUQI CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;105BB; +10595;VITHKUQI CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;105BC; +10597;VITHKUQI SMALL LETTER A;Ll;0;L;;;;;N;;;10570;;10570 +10598;VITHKUQI SMALL LETTER BBE;Ll;0;L;;;;;N;;;10571;;10571 +10599;VITHKUQI SMALL LETTER BE;Ll;0;L;;;;;N;;;10572;;10572 +1059A;VITHKUQI SMALL LETTER CE;Ll;0;L;;;;;N;;;10573;;10573 +1059B;VITHKUQI SMALL LETTER CHE;Ll;0;L;;;;;N;;;10574;;10574 +1059C;VITHKUQI SMALL LETTER DE;Ll;0;L;;;;;N;;;10575;;10575 +1059D;VITHKUQI SMALL LETTER DHE;Ll;0;L;;;;;N;;;10576;;10576 +1059E;VITHKUQI SMALL LETTER EI;Ll;0;L;;;;;N;;;10577;;10577 +1059F;VITHKUQI SMALL LETTER E;Ll;0;L;;;;;N;;;10578;;10578 +105A0;VITHKUQI SMALL LETTER FE;Ll;0;L;;;;;N;;;10579;;10579 +105A1;VITHKUQI SMALL LETTER GA;Ll;0;L;;;;;N;;;1057A;;1057A +105A3;VITHKUQI SMALL LETTER HA;Ll;0;L;;;;;N;;;1057C;;1057C +105A4;VITHKUQI SMALL LETTER HHA;Ll;0;L;;;;;N;;;1057D;;1057D +105A5;VITHKUQI SMALL LETTER I;Ll;0;L;;;;;N;;;1057E;;1057E +105A6;VITHKUQI SMALL LETTER IJE;Ll;0;L;;;;;N;;;1057F;;1057F +105A7;VITHKUQI SMALL LETTER JE;Ll;0;L;;;;;N;;;10580;;10580 +105A8;VITHKUQI SMALL LETTER KA;Ll;0;L;;;;;N;;;10581;;10581 +105A9;VITHKUQI SMALL LETTER LA;Ll;0;L;;;;;N;;;10582;;10582 +105AA;VITHKUQI SMALL LETTER LLA;Ll;0;L;;;;;N;;;10583;;10583 +105AB;VITHKUQI SMALL LETTER ME;Ll;0;L;;;;;N;;;10584;;10584 +105AC;VITHKUQI SMALL LETTER NE;Ll;0;L;;;;;N;;;10585;;10585 +105AD;VITHKUQI SMALL LETTER NJE;Ll;0;L;;;;;N;;;10586;;10586 +105AE;VITHKUQI SMALL LETTER O;Ll;0;L;;;;;N;;;10587;;10587 +105AF;VITHKUQI SMALL LETTER PE;Ll;0;L;;;;;N;;;10588;;10588 +105B0;VITHKUQI SMALL LETTER QA;Ll;0;L;;;;;N;;;10589;;10589 +105B1;VITHKUQI SMALL LETTER RE;Ll;0;L;;;;;N;;;1058A;;1058A +105B3;VITHKUQI SMALL LETTER SE;Ll;0;L;;;;;N;;;1058C;;1058C +105B4;VITHKUQI SMALL LETTER SHE;Ll;0;L;;;;;N;;;1058D;;1058D +105B5;VITHKUQI SMALL LETTER TE;Ll;0;L;;;;;N;;;1058E;;1058E +105B6;VITHKUQI SMALL LETTER THE;Ll;0;L;;;;;N;;;1058F;;1058F +105B7;VITHKUQI SMALL LETTER U;Ll;0;L;;;;;N;;;10590;;10590 +105B8;VITHKUQI SMALL LETTER VE;Ll;0;L;;;;;N;;;10591;;10591 +105B9;VITHKUQI SMALL LETTER XE;Ll;0;L;;;;;N;;;10592;;10592 +105BB;VITHKUQI SMALL LETTER Y;Ll;0;L;;;;;N;;;10594;;10594 +105BC;VITHKUQI SMALL LETTER ZE;Ll;0;L;;;;;N;;;10595;;10595 +105C0;TODHRI LETTER A;Lo;0;L;;;;;N;;;;; +105C1;TODHRI LETTER AS;Lo;0;L;;;;;N;;;;; +105C2;TODHRI LETTER BA;Lo;0;L;;;;;N;;;;; +105C3;TODHRI LETTER MBA;Lo;0;L;;;;;N;;;;; +105C4;TODHRI LETTER CA;Lo;0;L;;;;;N;;;;; +105C5;TODHRI LETTER CHA;Lo;0;L;;;;;N;;;;; +105C6;TODHRI LETTER DA;Lo;0;L;;;;;N;;;;; +105C7;TODHRI LETTER NDA;Lo;0;L;;;;;N;;;;; +105C8;TODHRI LETTER DHA;Lo;0;L;;;;;N;;;;; +105C9;TODHRI LETTER EI;Lo;0;L;105D2 0307;;;;N;;;;; +105CA;TODHRI LETTER E;Lo;0;L;;;;;N;;;;; +105CB;TODHRI LETTER FA;Lo;0;L;;;;;N;;;;; +105CC;TODHRI LETTER GA;Lo;0;L;;;;;N;;;;; +105CD;TODHRI LETTER NGA;Lo;0;L;;;;;N;;;;; +105CE;TODHRI LETTER GJA;Lo;0;L;;;;;N;;;;; +105CF;TODHRI LETTER NGJA;Lo;0;L;;;;;N;;;;; +105D0;TODHRI LETTER HA;Lo;0;L;;;;;N;;;;; +105D1;TODHRI LETTER HJA;Lo;0;L;;;;;N;;;;; +105D2;TODHRI LETTER I;Lo;0;L;;;;;N;;;;; +105D3;TODHRI LETTER JA;Lo;0;L;;;;;N;;;;; +105D4;TODHRI LETTER KA;Lo;0;L;;;;;N;;;;; +105D5;TODHRI LETTER LA;Lo;0;L;;;;;N;;;;; +105D6;TODHRI LETTER LLA;Lo;0;L;;;;;N;;;;; +105D7;TODHRI LETTER MA;Lo;0;L;;;;;N;;;;; +105D8;TODHRI LETTER NA;Lo;0;L;;;;;N;;;;; +105D9;TODHRI LETTER NJAN;Lo;0;L;;;;;N;;;;; +105DA;TODHRI LETTER O;Lo;0;L;;;;;N;;;;; +105DB;TODHRI LETTER PA;Lo;0;L;;;;;N;;;;; +105DC;TODHRI LETTER QA;Lo;0;L;;;;;N;;;;; +105DD;TODHRI LETTER RA;Lo;0;L;;;;;N;;;;; +105DE;TODHRI LETTER RRA;Lo;0;L;;;;;N;;;;; +105DF;TODHRI LETTER SA;Lo;0;L;;;;;N;;;;; +105E0;TODHRI LETTER SHA;Lo;0;L;;;;;N;;;;; +105E1;TODHRI LETTER SHTA;Lo;0;L;;;;;N;;;;; +105E2;TODHRI LETTER TA;Lo;0;L;;;;;N;;;;; +105E3;TODHRI LETTER THA;Lo;0;L;;;;;N;;;;; +105E4;TODHRI LETTER U;Lo;0;L;105DA 0307;;;;N;;;;; +105E5;TODHRI LETTER VA;Lo;0;L;;;;;N;;;;; +105E6;TODHRI LETTER XA;Lo;0;L;;;;;N;;;;; +105E7;TODHRI LETTER NXA;Lo;0;L;;;;;N;;;;; +105E8;TODHRI LETTER XHA;Lo;0;L;;;;;N;;;;; +105E9;TODHRI LETTER NXHA;Lo;0;L;;;;;N;;;;; +105EA;TODHRI LETTER Y;Lo;0;L;;;;;N;;;;; +105EB;TODHRI LETTER JY;Lo;0;L;;;;;N;;;;; +105EC;TODHRI LETTER ZA;Lo;0;L;;;;;N;;;;; +105ED;TODHRI LETTER ZHA;Lo;0;L;;;;;N;;;;; +105EE;TODHRI LETTER GHA;Lo;0;L;;;;;N;;;;; +105EF;TODHRI LETTER STA;Lo;0;L;;;;;N;;;;; +105F0;TODHRI LETTER SKAN;Lo;0;L;;;;;N;;;;; +105F1;TODHRI LETTER KHA;Lo;0;L;;;;;N;;;;; +105F2;TODHRI LETTER PSA;Lo;0;L;;;;;N;;;;; +105F3;TODHRI LETTER OO;Lo;0;L;;;;;N;;;;; +10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;; +10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;; +10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;; +10603;LINEAR A SIGN AB004;Lo;0;L;;;;;N;;;;; +10604;LINEAR A SIGN AB005;Lo;0;L;;;;;N;;;;; +10605;LINEAR A SIGN AB006;Lo;0;L;;;;;N;;;;; +10606;LINEAR A SIGN AB007;Lo;0;L;;;;;N;;;;; +10607;LINEAR A SIGN AB008;Lo;0;L;;;;;N;;;;; +10608;LINEAR A SIGN AB009;Lo;0;L;;;;;N;;;;; +10609;LINEAR A SIGN AB010;Lo;0;L;;;;;N;;;;; +1060A;LINEAR A SIGN AB011;Lo;0;L;;;;;N;;;;; +1060B;LINEAR A SIGN AB013;Lo;0;L;;;;;N;;;;; +1060C;LINEAR A SIGN AB016;Lo;0;L;;;;;N;;;;; +1060D;LINEAR A SIGN AB017;Lo;0;L;;;;;N;;;;; +1060E;LINEAR A SIGN AB020;Lo;0;L;;;;;N;;;;; +1060F;LINEAR A SIGN AB021;Lo;0;L;;;;;N;;;;; +10610;LINEAR A SIGN AB021F;Lo;0;L;;;;;N;;;;; +10611;LINEAR A SIGN AB021M;Lo;0;L;;;;;N;;;;; +10612;LINEAR A SIGN AB022;Lo;0;L;;;;;N;;;;; +10613;LINEAR A SIGN AB022F;Lo;0;L;;;;;N;;;;; +10614;LINEAR A SIGN AB022M;Lo;0;L;;;;;N;;;;; +10615;LINEAR A SIGN AB023;Lo;0;L;;;;;N;;;;; +10616;LINEAR A SIGN AB023M;Lo;0;L;;;;;N;;;;; +10617;LINEAR A SIGN AB024;Lo;0;L;;;;;N;;;;; +10618;LINEAR A SIGN AB026;Lo;0;L;;;;;N;;;;; +10619;LINEAR A SIGN AB027;Lo;0;L;;;;;N;;;;; +1061A;LINEAR A SIGN AB028;Lo;0;L;;;;;N;;;;; +1061B;LINEAR A SIGN A028B;Lo;0;L;;;;;N;;;;; +1061C;LINEAR A SIGN AB029;Lo;0;L;;;;;N;;;;; +1061D;LINEAR A SIGN AB030;Lo;0;L;;;;;N;;;;; +1061E;LINEAR A SIGN AB031;Lo;0;L;;;;;N;;;;; +1061F;LINEAR A SIGN AB034;Lo;0;L;;;;;N;;;;; +10620;LINEAR A SIGN AB037;Lo;0;L;;;;;N;;;;; +10621;LINEAR A SIGN AB038;Lo;0;L;;;;;N;;;;; +10622;LINEAR A SIGN AB039;Lo;0;L;;;;;N;;;;; +10623;LINEAR A SIGN AB040;Lo;0;L;;;;;N;;;;; +10624;LINEAR A SIGN AB041;Lo;0;L;;;;;N;;;;; +10625;LINEAR A SIGN AB044;Lo;0;L;;;;;N;;;;; +10626;LINEAR A SIGN AB045;Lo;0;L;;;;;N;;;;; +10627;LINEAR A SIGN AB046;Lo;0;L;;;;;N;;;;; +10628;LINEAR A SIGN AB047;Lo;0;L;;;;;N;;;;; +10629;LINEAR A SIGN AB048;Lo;0;L;;;;;N;;;;; +1062A;LINEAR A SIGN AB049;Lo;0;L;;;;;N;;;;; +1062B;LINEAR A SIGN AB050;Lo;0;L;;;;;N;;;;; +1062C;LINEAR A SIGN AB051;Lo;0;L;;;;;N;;;;; +1062D;LINEAR A SIGN AB053;Lo;0;L;;;;;N;;;;; +1062E;LINEAR A SIGN AB054;Lo;0;L;;;;;N;;;;; +1062F;LINEAR A SIGN AB055;Lo;0;L;;;;;N;;;;; +10630;LINEAR A SIGN AB056;Lo;0;L;;;;;N;;;;; +10631;LINEAR A SIGN AB057;Lo;0;L;;;;;N;;;;; +10632;LINEAR A SIGN AB058;Lo;0;L;;;;;N;;;;; +10633;LINEAR A SIGN AB059;Lo;0;L;;;;;N;;;;; +10634;LINEAR A SIGN AB060;Lo;0;L;;;;;N;;;;; +10635;LINEAR A SIGN AB061;Lo;0;L;;;;;N;;;;; +10636;LINEAR A SIGN AB065;Lo;0;L;;;;;N;;;;; +10637;LINEAR A SIGN AB066;Lo;0;L;;;;;N;;;;; +10638;LINEAR A SIGN AB067;Lo;0;L;;;;;N;;;;; +10639;LINEAR A SIGN AB069;Lo;0;L;;;;;N;;;;; +1063A;LINEAR A SIGN AB070;Lo;0;L;;;;;N;;;;; +1063B;LINEAR A SIGN AB073;Lo;0;L;;;;;N;;;;; +1063C;LINEAR A SIGN AB074;Lo;0;L;;;;;N;;;;; +1063D;LINEAR A SIGN AB076;Lo;0;L;;;;;N;;;;; +1063E;LINEAR A SIGN AB077;Lo;0;L;;;;;N;;;;; +1063F;LINEAR A SIGN AB078;Lo;0;L;;;;;N;;;;; +10640;LINEAR A SIGN AB079;Lo;0;L;;;;;N;;;;; +10641;LINEAR A SIGN AB080;Lo;0;L;;;;;N;;;;; +10642;LINEAR A SIGN AB081;Lo;0;L;;;;;N;;;;; +10643;LINEAR A SIGN AB082;Lo;0;L;;;;;N;;;;; +10644;LINEAR A SIGN AB085;Lo;0;L;;;;;N;;;;; +10645;LINEAR A SIGN AB086;Lo;0;L;;;;;N;;;;; +10646;LINEAR A SIGN AB087;Lo;0;L;;;;;N;;;;; +10647;LINEAR A SIGN A100-102;Lo;0;L;;;;;N;;;;; +10648;LINEAR A SIGN AB118;Lo;0;L;;;;;N;;;;; +10649;LINEAR A SIGN AB120;Lo;0;L;;;;;N;;;;; +1064A;LINEAR A SIGN A120B;Lo;0;L;;;;;N;;;;; +1064B;LINEAR A SIGN AB122;Lo;0;L;;;;;N;;;;; +1064C;LINEAR A SIGN AB123;Lo;0;L;;;;;N;;;;; +1064D;LINEAR A SIGN AB131A;Lo;0;L;;;;;N;;;;; +1064E;LINEAR A SIGN AB131B;Lo;0;L;;;;;N;;;;; +1064F;LINEAR A SIGN A131C;Lo;0;L;;;;;N;;;;; +10650;LINEAR A SIGN AB164;Lo;0;L;;;;;N;;;;; +10651;LINEAR A SIGN AB171;Lo;0;L;;;;;N;;;;; +10652;LINEAR A SIGN AB180;Lo;0;L;;;;;N;;;;; +10653;LINEAR A SIGN AB188;Lo;0;L;;;;;N;;;;; +10654;LINEAR A SIGN AB191;Lo;0;L;;;;;N;;;;; +10655;LINEAR A SIGN A301;Lo;0;L;;;;;N;;;;; +10656;LINEAR A SIGN A302;Lo;0;L;;;;;N;;;;; +10657;LINEAR A SIGN A303;Lo;0;L;;;;;N;;;;; +10658;LINEAR A SIGN A304;Lo;0;L;;;;;N;;;;; +10659;LINEAR A SIGN A305;Lo;0;L;;;;;N;;;;; +1065A;LINEAR A SIGN A306;Lo;0;L;;;;;N;;;;; +1065B;LINEAR A SIGN A307;Lo;0;L;;;;;N;;;;; +1065C;LINEAR A SIGN A308;Lo;0;L;;;;;N;;;;; +1065D;LINEAR A SIGN A309A;Lo;0;L;;;;;N;;;;; +1065E;LINEAR A SIGN A309B;Lo;0;L;;;;;N;;;;; +1065F;LINEAR A SIGN A309C;Lo;0;L;;;;;N;;;;; +10660;LINEAR A SIGN A310;Lo;0;L;;;;;N;;;;; +10661;LINEAR A SIGN A311;Lo;0;L;;;;;N;;;;; +10662;LINEAR A SIGN A312;Lo;0;L;;;;;N;;;;; +10663;LINEAR A SIGN A313A;Lo;0;L;;;;;N;;;;; +10664;LINEAR A SIGN A313B;Lo;0;L;;;;;N;;;;; +10665;LINEAR A SIGN A313C;Lo;0;L;;;;;N;;;;; +10666;LINEAR A SIGN A314;Lo;0;L;;;;;N;;;;; +10667;LINEAR A SIGN A315;Lo;0;L;;;;;N;;;;; +10668;LINEAR A SIGN A316;Lo;0;L;;;;;N;;;;; +10669;LINEAR A SIGN A317;Lo;0;L;;;;;N;;;;; +1066A;LINEAR A SIGN A318;Lo;0;L;;;;;N;;;;; +1066B;LINEAR A SIGN A319;Lo;0;L;;;;;N;;;;; +1066C;LINEAR A SIGN A320;Lo;0;L;;;;;N;;;;; +1066D;LINEAR A SIGN A321;Lo;0;L;;;;;N;;;;; +1066E;LINEAR A SIGN A322;Lo;0;L;;;;;N;;;;; +1066F;LINEAR A SIGN A323;Lo;0;L;;;;;N;;;;; +10670;LINEAR A SIGN A324;Lo;0;L;;;;;N;;;;; +10671;LINEAR A SIGN A325;Lo;0;L;;;;;N;;;;; +10672;LINEAR A SIGN A326;Lo;0;L;;;;;N;;;;; +10673;LINEAR A SIGN A327;Lo;0;L;;;;;N;;;;; +10674;LINEAR A SIGN A328;Lo;0;L;;;;;N;;;;; +10675;LINEAR A SIGN A329;Lo;0;L;;;;;N;;;;; +10676;LINEAR A SIGN A330;Lo;0;L;;;;;N;;;;; +10677;LINEAR A SIGN A331;Lo;0;L;;;;;N;;;;; +10678;LINEAR A SIGN A332;Lo;0;L;;;;;N;;;;; +10679;LINEAR A SIGN A333;Lo;0;L;;;;;N;;;;; +1067A;LINEAR A SIGN A334;Lo;0;L;;;;;N;;;;; +1067B;LINEAR A SIGN A335;Lo;0;L;;;;;N;;;;; +1067C;LINEAR A SIGN A336;Lo;0;L;;;;;N;;;;; +1067D;LINEAR A SIGN A337;Lo;0;L;;;;;N;;;;; +1067E;LINEAR A SIGN A338;Lo;0;L;;;;;N;;;;; +1067F;LINEAR A SIGN A339;Lo;0;L;;;;;N;;;;; +10680;LINEAR A SIGN A340;Lo;0;L;;;;;N;;;;; +10681;LINEAR A SIGN A341;Lo;0;L;;;;;N;;;;; +10682;LINEAR A SIGN A342;Lo;0;L;;;;;N;;;;; +10683;LINEAR A SIGN A343;Lo;0;L;;;;;N;;;;; +10684;LINEAR A SIGN A344;Lo;0;L;;;;;N;;;;; +10685;LINEAR A SIGN A345;Lo;0;L;;;;;N;;;;; +10686;LINEAR A SIGN A346;Lo;0;L;;;;;N;;;;; +10687;LINEAR A SIGN A347;Lo;0;L;;;;;N;;;;; +10688;LINEAR A SIGN A348;Lo;0;L;;;;;N;;;;; +10689;LINEAR A SIGN A349;Lo;0;L;;;;;N;;;;; +1068A;LINEAR A SIGN A350;Lo;0;L;;;;;N;;;;; +1068B;LINEAR A SIGN A351;Lo;0;L;;;;;N;;;;; +1068C;LINEAR A SIGN A352;Lo;0;L;;;;;N;;;;; +1068D;LINEAR A SIGN A353;Lo;0;L;;;;;N;;;;; +1068E;LINEAR A SIGN A354;Lo;0;L;;;;;N;;;;; +1068F;LINEAR A SIGN A355;Lo;0;L;;;;;N;;;;; +10690;LINEAR A SIGN A356;Lo;0;L;;;;;N;;;;; +10691;LINEAR A SIGN A357;Lo;0;L;;;;;N;;;;; +10692;LINEAR A SIGN A358;Lo;0;L;;;;;N;;;;; +10693;LINEAR A SIGN A359;Lo;0;L;;;;;N;;;;; +10694;LINEAR A SIGN A360;Lo;0;L;;;;;N;;;;; +10695;LINEAR A SIGN A361;Lo;0;L;;;;;N;;;;; +10696;LINEAR A SIGN A362;Lo;0;L;;;;;N;;;;; +10697;LINEAR A SIGN A363;Lo;0;L;;;;;N;;;;; +10698;LINEAR A SIGN A364;Lo;0;L;;;;;N;;;;; +10699;LINEAR A SIGN A365;Lo;0;L;;;;;N;;;;; +1069A;LINEAR A SIGN A366;Lo;0;L;;;;;N;;;;; +1069B;LINEAR A SIGN A367;Lo;0;L;;;;;N;;;;; +1069C;LINEAR A SIGN A368;Lo;0;L;;;;;N;;;;; +1069D;LINEAR A SIGN A369;Lo;0;L;;;;;N;;;;; +1069E;LINEAR A SIGN A370;Lo;0;L;;;;;N;;;;; +1069F;LINEAR A SIGN A371;Lo;0;L;;;;;N;;;;; +106A0;LINEAR A SIGN A400-VAS;Lo;0;L;;;;;N;;;;; +106A1;LINEAR A SIGN A401-VAS;Lo;0;L;;;;;N;;;;; +106A2;LINEAR A SIGN A402-VAS;Lo;0;L;;;;;N;;;;; +106A3;LINEAR A SIGN A403-VAS;Lo;0;L;;;;;N;;;;; +106A4;LINEAR A SIGN A404-VAS;Lo;0;L;;;;;N;;;;; +106A5;LINEAR A SIGN A405-VAS;Lo;0;L;;;;;N;;;;; +106A6;LINEAR A SIGN A406-VAS;Lo;0;L;;;;;N;;;;; +106A7;LINEAR A SIGN A407-VAS;Lo;0;L;;;;;N;;;;; +106A8;LINEAR A SIGN A408-VAS;Lo;0;L;;;;;N;;;;; +106A9;LINEAR A SIGN A409-VAS;Lo;0;L;;;;;N;;;;; +106AA;LINEAR A SIGN A410-VAS;Lo;0;L;;;;;N;;;;; +106AB;LINEAR A SIGN A411-VAS;Lo;0;L;;;;;N;;;;; +106AC;LINEAR A SIGN A412-VAS;Lo;0;L;;;;;N;;;;; +106AD;LINEAR A SIGN A413-VAS;Lo;0;L;;;;;N;;;;; +106AE;LINEAR A SIGN A414-VAS;Lo;0;L;;;;;N;;;;; +106AF;LINEAR A SIGN A415-VAS;Lo;0;L;;;;;N;;;;; +106B0;LINEAR A SIGN A416-VAS;Lo;0;L;;;;;N;;;;; +106B1;LINEAR A SIGN A417-VAS;Lo;0;L;;;;;N;;;;; +106B2;LINEAR A SIGN A418-VAS;Lo;0;L;;;;;N;;;;; +106B3;LINEAR A SIGN A501;Lo;0;L;;;;;N;;;;; +106B4;LINEAR A SIGN A502;Lo;0;L;;;;;N;;;;; +106B5;LINEAR A SIGN A503;Lo;0;L;;;;;N;;;;; +106B6;LINEAR A SIGN A504;Lo;0;L;;;;;N;;;;; +106B7;LINEAR A SIGN A505;Lo;0;L;;;;;N;;;;; +106B8;LINEAR A SIGN A506;Lo;0;L;;;;;N;;;;; +106B9;LINEAR A SIGN A508;Lo;0;L;;;;;N;;;;; +106BA;LINEAR A SIGN A509;Lo;0;L;;;;;N;;;;; +106BB;LINEAR A SIGN A510;Lo;0;L;;;;;N;;;;; +106BC;LINEAR A SIGN A511;Lo;0;L;;;;;N;;;;; +106BD;LINEAR A SIGN A512;Lo;0;L;;;;;N;;;;; +106BE;LINEAR A SIGN A513;Lo;0;L;;;;;N;;;;; +106BF;LINEAR A SIGN A515;Lo;0;L;;;;;N;;;;; +106C0;LINEAR A SIGN A516;Lo;0;L;;;;;N;;;;; +106C1;LINEAR A SIGN A520;Lo;0;L;;;;;N;;;;; +106C2;LINEAR A SIGN A521;Lo;0;L;;;;;N;;;;; +106C3;LINEAR A SIGN A523;Lo;0;L;;;;;N;;;;; +106C4;LINEAR A SIGN A524;Lo;0;L;;;;;N;;;;; +106C5;LINEAR A SIGN A525;Lo;0;L;;;;;N;;;;; +106C6;LINEAR A SIGN A526;Lo;0;L;;;;;N;;;;; +106C7;LINEAR A SIGN A527;Lo;0;L;;;;;N;;;;; +106C8;LINEAR A SIGN A528;Lo;0;L;;;;;N;;;;; +106C9;LINEAR A SIGN A529;Lo;0;L;;;;;N;;;;; +106CA;LINEAR A SIGN A530;Lo;0;L;;;;;N;;;;; +106CB;LINEAR A SIGN A531;Lo;0;L;;;;;N;;;;; +106CC;LINEAR A SIGN A532;Lo;0;L;;;;;N;;;;; +106CD;LINEAR A SIGN A534;Lo;0;L;;;;;N;;;;; +106CE;LINEAR A SIGN A535;Lo;0;L;;;;;N;;;;; +106CF;LINEAR A SIGN A536;Lo;0;L;;;;;N;;;;; +106D0;LINEAR A SIGN A537;Lo;0;L;;;;;N;;;;; +106D1;LINEAR A SIGN A538;Lo;0;L;;;;;N;;;;; +106D2;LINEAR A SIGN A539;Lo;0;L;;;;;N;;;;; +106D3;LINEAR A SIGN A540;Lo;0;L;;;;;N;;;;; +106D4;LINEAR A SIGN A541;Lo;0;L;;;;;N;;;;; +106D5;LINEAR A SIGN A542;Lo;0;L;;;;;N;;;;; +106D6;LINEAR A SIGN A545;Lo;0;L;;;;;N;;;;; +106D7;LINEAR A SIGN A547;Lo;0;L;;;;;N;;;;; +106D8;LINEAR A SIGN A548;Lo;0;L;;;;;N;;;;; +106D9;LINEAR A SIGN A549;Lo;0;L;;;;;N;;;;; +106DA;LINEAR A SIGN A550;Lo;0;L;;;;;N;;;;; +106DB;LINEAR A SIGN A551;Lo;0;L;;;;;N;;;;; +106DC;LINEAR A SIGN A552;Lo;0;L;;;;;N;;;;; +106DD;LINEAR A SIGN A553;Lo;0;L;;;;;N;;;;; +106DE;LINEAR A SIGN A554;Lo;0;L;;;;;N;;;;; +106DF;LINEAR A SIGN A555;Lo;0;L;;;;;N;;;;; +106E0;LINEAR A SIGN A556;Lo;0;L;;;;;N;;;;; +106E1;LINEAR A SIGN A557;Lo;0;L;;;;;N;;;;; +106E2;LINEAR A SIGN A559;Lo;0;L;;;;;N;;;;; +106E3;LINEAR A SIGN A563;Lo;0;L;;;;;N;;;;; +106E4;LINEAR A SIGN A564;Lo;0;L;;;;;N;;;;; +106E5;LINEAR A SIGN A565;Lo;0;L;;;;;N;;;;; +106E6;LINEAR A SIGN A566;Lo;0;L;;;;;N;;;;; +106E7;LINEAR A SIGN A568;Lo;0;L;;;;;N;;;;; +106E8;LINEAR A SIGN A569;Lo;0;L;;;;;N;;;;; +106E9;LINEAR A SIGN A570;Lo;0;L;;;;;N;;;;; +106EA;LINEAR A SIGN A571;Lo;0;L;;;;;N;;;;; +106EB;LINEAR A SIGN A572;Lo;0;L;;;;;N;;;;; +106EC;LINEAR A SIGN A573;Lo;0;L;;;;;N;;;;; +106ED;LINEAR A SIGN A574;Lo;0;L;;;;;N;;;;; +106EE;LINEAR A SIGN A575;Lo;0;L;;;;;N;;;;; +106EF;LINEAR A SIGN A576;Lo;0;L;;;;;N;;;;; +106F0;LINEAR A SIGN A577;Lo;0;L;;;;;N;;;;; +106F1;LINEAR A SIGN A578;Lo;0;L;;;;;N;;;;; +106F2;LINEAR A SIGN A579;Lo;0;L;;;;;N;;;;; +106F3;LINEAR A SIGN A580;Lo;0;L;;;;;N;;;;; +106F4;LINEAR A SIGN A581;Lo;0;L;;;;;N;;;;; +106F5;LINEAR A SIGN A582;Lo;0;L;;;;;N;;;;; +106F6;LINEAR A SIGN A583;Lo;0;L;;;;;N;;;;; +106F7;LINEAR A SIGN A584;Lo;0;L;;;;;N;;;;; +106F8;LINEAR A SIGN A585;Lo;0;L;;;;;N;;;;; +106F9;LINEAR A SIGN A586;Lo;0;L;;;;;N;;;;; +106FA;LINEAR A SIGN A587;Lo;0;L;;;;;N;;;;; +106FB;LINEAR A SIGN A588;Lo;0;L;;;;;N;;;;; +106FC;LINEAR A SIGN A589;Lo;0;L;;;;;N;;;;; +106FD;LINEAR A SIGN A591;Lo;0;L;;;;;N;;;;; +106FE;LINEAR A SIGN A592;Lo;0;L;;;;;N;;;;; +106FF;LINEAR A SIGN A594;Lo;0;L;;;;;N;;;;; +10700;LINEAR A SIGN A595;Lo;0;L;;;;;N;;;;; +10701;LINEAR A SIGN A596;Lo;0;L;;;;;N;;;;; +10702;LINEAR A SIGN A598;Lo;0;L;;;;;N;;;;; +10703;LINEAR A SIGN A600;Lo;0;L;;;;;N;;;;; +10704;LINEAR A SIGN A601;Lo;0;L;;;;;N;;;;; +10705;LINEAR A SIGN A602;Lo;0;L;;;;;N;;;;; +10706;LINEAR A SIGN A603;Lo;0;L;;;;;N;;;;; +10707;LINEAR A SIGN A604;Lo;0;L;;;;;N;;;;; +10708;LINEAR A SIGN A606;Lo;0;L;;;;;N;;;;; +10709;LINEAR A SIGN A608;Lo;0;L;;;;;N;;;;; +1070A;LINEAR A SIGN A609;Lo;0;L;;;;;N;;;;; +1070B;LINEAR A SIGN A610;Lo;0;L;;;;;N;;;;; +1070C;LINEAR A SIGN A611;Lo;0;L;;;;;N;;;;; +1070D;LINEAR A SIGN A612;Lo;0;L;;;;;N;;;;; +1070E;LINEAR A SIGN A613;Lo;0;L;;;;;N;;;;; +1070F;LINEAR A SIGN A614;Lo;0;L;;;;;N;;;;; +10710;LINEAR A SIGN A615;Lo;0;L;;;;;N;;;;; +10711;LINEAR A SIGN A616;Lo;0;L;;;;;N;;;;; +10712;LINEAR A SIGN A617;Lo;0;L;;;;;N;;;;; +10713;LINEAR A SIGN A618;Lo;0;L;;;;;N;;;;; +10714;LINEAR A SIGN A619;Lo;0;L;;;;;N;;;;; +10715;LINEAR A SIGN A620;Lo;0;L;;;;;N;;;;; +10716;LINEAR A SIGN A621;Lo;0;L;;;;;N;;;;; +10717;LINEAR A SIGN A622;Lo;0;L;;;;;N;;;;; +10718;LINEAR A SIGN A623;Lo;0;L;;;;;N;;;;; +10719;LINEAR A SIGN A624;Lo;0;L;;;;;N;;;;; +1071A;LINEAR A SIGN A626;Lo;0;L;;;;;N;;;;; +1071B;LINEAR A SIGN A627;Lo;0;L;;;;;N;;;;; +1071C;LINEAR A SIGN A628;Lo;0;L;;;;;N;;;;; +1071D;LINEAR A SIGN A629;Lo;0;L;;;;;N;;;;; +1071E;LINEAR A SIGN A634;Lo;0;L;;;;;N;;;;; +1071F;LINEAR A SIGN A637;Lo;0;L;;;;;N;;;;; +10720;LINEAR A SIGN A638;Lo;0;L;;;;;N;;;;; +10721;LINEAR A SIGN A640;Lo;0;L;;;;;N;;;;; +10722;LINEAR A SIGN A642;Lo;0;L;;;;;N;;;;; +10723;LINEAR A SIGN A643;Lo;0;L;;;;;N;;;;; +10724;LINEAR A SIGN A644;Lo;0;L;;;;;N;;;;; +10725;LINEAR A SIGN A645;Lo;0;L;;;;;N;;;;; +10726;LINEAR A SIGN A646;Lo;0;L;;;;;N;;;;; +10727;LINEAR A SIGN A648;Lo;0;L;;;;;N;;;;; +10728;LINEAR A SIGN A649;Lo;0;L;;;;;N;;;;; +10729;LINEAR A SIGN A651;Lo;0;L;;;;;N;;;;; +1072A;LINEAR A SIGN A652;Lo;0;L;;;;;N;;;;; +1072B;LINEAR A SIGN A653;Lo;0;L;;;;;N;;;;; +1072C;LINEAR A SIGN A654;Lo;0;L;;;;;N;;;;; +1072D;LINEAR A SIGN A655;Lo;0;L;;;;;N;;;;; +1072E;LINEAR A SIGN A656;Lo;0;L;;;;;N;;;;; +1072F;LINEAR A SIGN A657;Lo;0;L;;;;;N;;;;; +10730;LINEAR A SIGN A658;Lo;0;L;;;;;N;;;;; +10731;LINEAR A SIGN A659;Lo;0;L;;;;;N;;;;; +10732;LINEAR A SIGN A660;Lo;0;L;;;;;N;;;;; +10733;LINEAR A SIGN A661;Lo;0;L;;;;;N;;;;; +10734;LINEAR A SIGN A662;Lo;0;L;;;;;N;;;;; +10735;LINEAR A SIGN A663;Lo;0;L;;;;;N;;;;; +10736;LINEAR A SIGN A664;Lo;0;L;;;;;N;;;;; +10740;LINEAR A SIGN A701 A;Lo;0;L;;;;;N;;;;; +10741;LINEAR A SIGN A702 B;Lo;0;L;;;;;N;;;;; +10742;LINEAR A SIGN A703 D;Lo;0;L;;;;;N;;;;; +10743;LINEAR A SIGN A704 E;Lo;0;L;;;;;N;;;;; +10744;LINEAR A SIGN A705 F;Lo;0;L;;;;;N;;;;; +10745;LINEAR A SIGN A706 H;Lo;0;L;;;;;N;;;;; +10746;LINEAR A SIGN A707 J;Lo;0;L;;;;;N;;;;; +10747;LINEAR A SIGN A708 K;Lo;0;L;;;;;N;;;;; +10748;LINEAR A SIGN A709 L;Lo;0;L;;;;;N;;;;; +10749;LINEAR A SIGN A709-2 L2;Lo;0;L;;;;;N;;;;; +1074A;LINEAR A SIGN A709-3 L3;Lo;0;L;;;;;N;;;;; +1074B;LINEAR A SIGN A709-4 L4;Lo;0;L;;;;;N;;;;; +1074C;LINEAR A SIGN A709-6 L6;Lo;0;L;;;;;N;;;;; +1074D;LINEAR A SIGN A710 W;Lo;0;L;;;;;N;;;;; +1074E;LINEAR A SIGN A711 X;Lo;0;L;;;;;N;;;;; +1074F;LINEAR A SIGN A712 Y;Lo;0;L;;;;;N;;;;; +10750;LINEAR A SIGN A713 OMEGA;Lo;0;L;;;;;N;;;;; +10751;LINEAR A SIGN A714 ABB;Lo;0;L;;;;;N;;;;; +10752;LINEAR A SIGN A715 BB;Lo;0;L;;;;;N;;;;; +10753;LINEAR A SIGN A717 DD;Lo;0;L;;;;;N;;;;; +10754;LINEAR A SIGN A726 EYYY;Lo;0;L;;;;;N;;;;; +10755;LINEAR A SIGN A732 JE;Lo;0;L;;;;;N;;;;; +10760;LINEAR A SIGN A800;Lo;0;L;;;;;N;;;;; +10761;LINEAR A SIGN A801;Lo;0;L;;;;;N;;;;; +10762;LINEAR A SIGN A802;Lo;0;L;;;;;N;;;;; +10763;LINEAR A SIGN A803;Lo;0;L;;;;;N;;;;; +10764;LINEAR A SIGN A804;Lo;0;L;;;;;N;;;;; +10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;; +10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;; +10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;; +10780;MODIFIER LETTER SMALL CAPITAL AA;Lm;0;L;;;;;N;;;;; +10781;MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON;Lm;0;L; 02D0;;;;N;;;;; +10782;MODIFIER LETTER SUPERSCRIPT HALF TRIANGULAR COLON;Lm;0;L; 02D1;;;;N;;;;; +10783;MODIFIER LETTER SMALL AE;Lm;0;L; 00E6;;;;N;;;;; +10784;MODIFIER LETTER SMALL CAPITAL B;Lm;0;L; 0299;;;;N;;;;; +10785;MODIFIER LETTER SMALL B WITH HOOK;Lm;0;L; 0253;;;;N;;;;; +10787;MODIFIER LETTER SMALL DZ DIGRAPH;Lm;0;L; 02A3;;;;N;;;;; +10788;MODIFIER LETTER SMALL DZ DIGRAPH WITH RETROFLEX HOOK;Lm;0;L; AB66;;;;N;;;;; +10789;MODIFIER LETTER SMALL DZ DIGRAPH WITH CURL;Lm;0;L; 02A5;;;;N;;;;; +1078A;MODIFIER LETTER SMALL DEZH DIGRAPH;Lm;0;L; 02A4;;;;N;;;;; +1078B;MODIFIER LETTER SMALL D WITH TAIL;Lm;0;L; 0256;;;;N;;;;; +1078C;MODIFIER LETTER SMALL D WITH HOOK;Lm;0;L; 0257;;;;N;;;;; +1078D;MODIFIER LETTER SMALL D WITH HOOK AND TAIL;Lm;0;L; 1D91;;;;N;;;;; +1078E;MODIFIER LETTER SMALL REVERSED E;Lm;0;L; 0258;;;;N;;;;; +1078F;MODIFIER LETTER SMALL CLOSED REVERSED OPEN E;Lm;0;L; 025E;;;;N;;;;; +10790;MODIFIER LETTER SMALL FENG DIGRAPH;Lm;0;L; 02A9;;;;N;;;;; +10791;MODIFIER LETTER SMALL RAMS HORN;Lm;0;L; 0264;;;;N;;;;; +10792;MODIFIER LETTER SMALL CAPITAL G;Lm;0;L; 0262;;;;N;;;;; +10793;MODIFIER LETTER SMALL G WITH HOOK;Lm;0;L; 0260;;;;N;;;;; +10794;MODIFIER LETTER SMALL CAPITAL G WITH HOOK;Lm;0;L; 029B;;;;N;;;;; +10795;MODIFIER LETTER SMALL H WITH STROKE;Lm;0;L; 0127;;;;N;;;;; +10796;MODIFIER LETTER SMALL CAPITAL H;Lm;0;L; 029C;;;;N;;;;; +10797;MODIFIER LETTER SMALL HENG WITH HOOK;Lm;0;L; 0267;;;;N;;;;; +10798;MODIFIER LETTER SMALL DOTLESS J WITH STROKE AND HOOK;Lm;0;L; 0284;;;;N;;;;; +10799;MODIFIER LETTER SMALL LS DIGRAPH;Lm;0;L; 02AA;;;;N;;;;; +1079A;MODIFIER LETTER SMALL LZ DIGRAPH;Lm;0;L; 02AB;;;;N;;;;; +1079B;MODIFIER LETTER SMALL L WITH BELT;Lm;0;L; 026C;;;;N;;;;; +1079C;MODIFIER LETTER SMALL CAPITAL L WITH BELT;Lm;0;L; 1DF04;;;;N;;;;; +1079D;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK AND BELT;Lm;0;L; A78E;;;;N;;;;; +1079E;MODIFIER LETTER SMALL LEZH;Lm;0;L; 026E;;;;N;;;;; +1079F;MODIFIER LETTER SMALL LEZH WITH RETROFLEX HOOK;Lm;0;L; 1DF05;;;;N;;;;; +107A0;MODIFIER LETTER SMALL TURNED Y;Lm;0;L; 028E;;;;N;;;;; +107A1;MODIFIER LETTER SMALL TURNED Y WITH BELT;Lm;0;L; 1DF06;;;;N;;;;; +107A2;MODIFIER LETTER SMALL O WITH STROKE;Lm;0;L; 00F8;;;;N;;;;; +107A3;MODIFIER LETTER SMALL CAPITAL OE;Lm;0;L; 0276;;;;N;;;;; +107A4;MODIFIER LETTER SMALL CLOSED OMEGA;Lm;0;L; 0277;;;;N;;;;; +107A5;MODIFIER LETTER SMALL Q;Lm;0;L; 0071;;;;N;;;;; +107A6;MODIFIER LETTER SMALL TURNED R WITH LONG LEG;Lm;0;L; 027A;;;;N;;;;; +107A7;MODIFIER LETTER SMALL TURNED R WITH LONG LEG AND RETROFLEX HOOK;Lm;0;L; 1DF08;;;;N;;;;; +107A8;MODIFIER LETTER SMALL R WITH TAIL;Lm;0;L; 027D;;;;N;;;;; +107A9;MODIFIER LETTER SMALL R WITH FISHHOOK;Lm;0;L; 027E;;;;N;;;;; +107AA;MODIFIER LETTER SMALL CAPITAL R;Lm;0;L; 0280;;;;N;;;;; +107AB;MODIFIER LETTER SMALL TC DIGRAPH WITH CURL;Lm;0;L; 02A8;;;;N;;;;; +107AC;MODIFIER LETTER SMALL TS DIGRAPH;Lm;0;L; 02A6;;;;N;;;;; +107AD;MODIFIER LETTER SMALL TS DIGRAPH WITH RETROFLEX HOOK;Lm;0;L; AB67;;;;N;;;;; +107AE;MODIFIER LETTER SMALL TESH DIGRAPH;Lm;0;L; 02A7;;;;N;;;;; +107AF;MODIFIER LETTER SMALL T WITH RETROFLEX HOOK;Lm;0;L; 0288;;;;N;;;;; +107B0;MODIFIER LETTER SMALL V WITH RIGHT HOOK;Lm;0;L; 2C71;;;;N;;;;; +107B2;MODIFIER LETTER SMALL CAPITAL Y;Lm;0;L; 028F;;;;N;;;;; +107B3;MODIFIER LETTER GLOTTAL STOP WITH STROKE;Lm;0;L; 02A1;;;;N;;;;; +107B4;MODIFIER LETTER REVERSED GLOTTAL STOP WITH STROKE;Lm;0;L; 02A2;;;;N;;;;; +107B5;MODIFIER LETTER BILABIAL CLICK;Lm;0;L; 0298;;;;N;;;;; +107B6;MODIFIER LETTER DENTAL CLICK;Lm;0;L; 01C0;;;;N;;;;; +107B7;MODIFIER LETTER LATERAL CLICK;Lm;0;L; 01C1;;;;N;;;;; +107B8;MODIFIER LETTER ALVEOLAR CLICK;Lm;0;L; 01C2;;;;N;;;;; +107B9;MODIFIER LETTER RETROFLEX CLICK WITH RETROFLEX HOOK;Lm;0;L; 1DF0A;;;;N;;;;; +107BA;MODIFIER LETTER SMALL S WITH CURL;Lm;0;L; 1DF1E;;;;N;;;;; +10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; +10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; +10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; +10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; +10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; +10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; +10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; +1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; +1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; +1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; +1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; +1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; +1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; +10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; +10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; +10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; +10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; +10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; +10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; +10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; +10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; +10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; +10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; +1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; +1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; +1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; +1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; +1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; +1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; +10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; +10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; +10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; +10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; +10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; +10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; +10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; +10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; +10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; +10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; +1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; +1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; +1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; +1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; +1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; +1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; +10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; +10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; +10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; +10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; +10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; +10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; +10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; +10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; +1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; +1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; +10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; +10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; +10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;; +10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; +10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; +10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; +10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; +1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; +1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; +1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; +1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; +10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;; +10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; +10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; +10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; +10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; +10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; +10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;; +10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;; +10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;; +1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;; +1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;; +1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;; +1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +10860;PALMYRENE LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10861;PALMYRENE LETTER BETH;Lo;0;R;;;;;N;;;;; +10862;PALMYRENE LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10863;PALMYRENE LETTER DALETH;Lo;0;R;;;;;N;;;;; +10864;PALMYRENE LETTER HE;Lo;0;R;;;;;N;;;;; +10865;PALMYRENE LETTER WAW;Lo;0;R;;;;;N;;;;; +10866;PALMYRENE LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10867;PALMYRENE LETTER HETH;Lo;0;R;;;;;N;;;;; +10868;PALMYRENE LETTER TETH;Lo;0;R;;;;;N;;;;; +10869;PALMYRENE LETTER YODH;Lo;0;R;;;;;N;;;;; +1086A;PALMYRENE LETTER KAPH;Lo;0;R;;;;;N;;;;; +1086B;PALMYRENE LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1086C;PALMYRENE LETTER MEM;Lo;0;R;;;;;N;;;;; +1086D;PALMYRENE LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +1086E;PALMYRENE LETTER NUN;Lo;0;R;;;;;N;;;;; +1086F;PALMYRENE LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10870;PALMYRENE LETTER AYIN;Lo;0;R;;;;;N;;;;; +10871;PALMYRENE LETTER PE;Lo;0;R;;;;;N;;;;; +10872;PALMYRENE LETTER SADHE;Lo;0;R;;;;;N;;;;; +10873;PALMYRENE LETTER QOPH;Lo;0;R;;;;;N;;;;; +10874;PALMYRENE LETTER RESH;Lo;0;R;;;;;N;;;;; +10875;PALMYRENE LETTER SHIN;Lo;0;R;;;;;N;;;;; +10876;PALMYRENE LETTER TAW;Lo;0;R;;;;;N;;;;; +10877;PALMYRENE LEFT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10878;PALMYRENE RIGHT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10879;PALMYRENE NUMBER ONE;No;0;R;;;;1;N;;;;; +1087A;PALMYRENE NUMBER TWO;No;0;R;;;;2;N;;;;; +1087B;PALMYRENE NUMBER THREE;No;0;R;;;;3;N;;;;; +1087C;PALMYRENE NUMBER FOUR;No;0;R;;;;4;N;;;;; +1087D;PALMYRENE NUMBER FIVE;No;0;R;;;;5;N;;;;; +1087E;PALMYRENE NUMBER TEN;No;0;R;;;;10;N;;;;; +1087F;PALMYRENE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10880;NABATAEAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; +10881;NABATAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10882;NABATAEAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; +10883;NABATAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10884;NABATAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10885;NABATAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10886;NABATAEAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; +10887;NABATAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10888;NABATAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10889;NABATAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +1088A;NABATAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +1088B;NABATAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +1088C;NABATAEAN LETTER FINAL YODH;Lo;0;R;;;;;N;;;;; +1088D;NABATAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +1088E;NABATAEAN LETTER FINAL KAPH;Lo;0;R;;;;;N;;;;; +1088F;NABATAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10890;NABATAEAN LETTER FINAL LAMEDH;Lo;0;R;;;;;N;;;;; +10891;NABATAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10892;NABATAEAN LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +10893;NABATAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10894;NABATAEAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +10895;NABATAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10896;NABATAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10897;NABATAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10898;NABATAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10899;NABATAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +1089A;NABATAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +1089B;NABATAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +1089C;NABATAEAN LETTER FINAL SHIN;Lo;0;R;;;;;N;;;;; +1089D;NABATAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +1089E;NABATAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108A7;NABATAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108A8;NABATAEAN NUMBER TWO;No;0;R;;;;2;N;;;;; +108A9;NABATAEAN NUMBER THREE;No;0;R;;;;3;N;;;;; +108AA;NABATAEAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AB;NABATAEAN CRUCIFORM NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AC;NABATAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +108E0;HATRAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +108E1;HATRAN LETTER BETH;Lo;0;R;;;;;N;;;;; +108E2;HATRAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +108E3;HATRAN LETTER DALETH-RESH;Lo;0;R;;;;;N;;;;; +108E4;HATRAN LETTER HE;Lo;0;R;;;;;N;;;;; +108E5;HATRAN LETTER WAW;Lo;0;R;;;;;N;;;;; +108E6;HATRAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +108E7;HATRAN LETTER HETH;Lo;0;R;;;;;N;;;;; +108E8;HATRAN LETTER TETH;Lo;0;R;;;;;N;;;;; +108E9;HATRAN LETTER YODH;Lo;0;R;;;;;N;;;;; +108EA;HATRAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +108EB;HATRAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +108EC;HATRAN LETTER MEM;Lo;0;R;;;;;N;;;;; +108ED;HATRAN LETTER NUN;Lo;0;R;;;;;N;;;;; +108EE;HATRAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +108EF;HATRAN LETTER AYN;Lo;0;R;;;;;N;;;;; +108F0;HATRAN LETTER PE;Lo;0;R;;;;;N;;;;; +108F1;HATRAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +108F2;HATRAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +108F4;HATRAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +108F5;HATRAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108FB;HATRAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108FC;HATRAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108FD;HATRAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108FE;HATRAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108FF;HATRAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; +10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; +10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; +10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; +10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; +10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; +10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; +10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; +10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; +1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; +1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; +1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; +10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; +10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; +10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; +10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; +10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; +10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; +10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; +10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; +10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; +10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; +10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; +10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; +10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; +10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; +1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; +1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; +1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; +1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; +1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; +1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; +10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; +10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; +10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; +10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; +10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; +10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; +10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; +10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; +10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; +10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; +1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; +10940;SIDETIC LETTER N01;Lo;0;R;;;;;N;;;;; +10941;SIDETIC LETTER N02;Lo;0;R;;;;;N;;;;; +10942;SIDETIC LETTER N03;Lo;0;R;;;;;N;;;;; +10943;SIDETIC LETTER N04;Lo;0;R;;;;;N;;;;; +10944;SIDETIC LETTER N05;Lo;0;R;;;;;N;;;;; +10945;SIDETIC LETTER N06;Lo;0;R;;;;;N;;;;; +10946;SIDETIC LETTER N07;Lo;0;R;;;;;N;;;;; +10947;SIDETIC LETTER N08;Lo;0;R;;;;;N;;;;; +10948;SIDETIC LETTER N09;Lo;0;R;;;;;N;;;;; +10949;SIDETIC LETTER N10;Lo;0;R;;;;;N;;;;; +1094A;SIDETIC LETTER N11;Lo;0;R;;;;;N;;;;; +1094B;SIDETIC LETTER N12;Lo;0;R;;;;;N;;;;; +1094C;SIDETIC LETTER N13;Lo;0;R;;;;;N;;;;; +1094D;SIDETIC LETTER N14;Lo;0;R;;;;;N;;;;; +1094E;SIDETIC LETTER N15;Lo;0;R;;;;;N;;;;; +1094F;SIDETIC LETTER N16;Lo;0;R;;;;;N;;;;; +10950;SIDETIC LETTER N17;Lo;0;R;;;;;N;;;;; +10951;SIDETIC LETTER N18;Lo;0;R;;;;;N;;;;; +10952;SIDETIC LETTER N19;Lo;0;R;;;;;N;;;;; +10953;SIDETIC LETTER N20;Lo;0;R;;;;;N;;;;; +10954;SIDETIC LETTER N21;Lo;0;R;;;;;N;;;;; +10955;SIDETIC LETTER N22;Lo;0;R;;;;;N;;;;; +10956;SIDETIC LETTER N23;Lo;0;R;;;;;N;;;;; +10957;SIDETIC LETTER N24;Lo;0;R;;;;;N;;;;; +10958;SIDETIC LETTER N25;Lo;0;R;;;;;N;;;;; +10959;SIDETIC LETTER N26;Lo;0;R;;;;;N;;;;; +10980;MEROITIC HIEROGLYPHIC LETTER A;Lo;0;R;;;;;N;;;;; +10981;MEROITIC HIEROGLYPHIC LETTER E;Lo;0;R;;;;;N;;;;; +10982;MEROITIC HIEROGLYPHIC LETTER I;Lo;0;R;;;;;N;;;;; +10983;MEROITIC HIEROGLYPHIC LETTER O;Lo;0;R;;;;;N;;;;; +10984;MEROITIC HIEROGLYPHIC LETTER YA;Lo;0;R;;;;;N;;;;; +10985;MEROITIC HIEROGLYPHIC LETTER WA;Lo;0;R;;;;;N;;;;; +10986;MEROITIC HIEROGLYPHIC LETTER BA;Lo;0;R;;;;;N;;;;; +10987;MEROITIC HIEROGLYPHIC LETTER BA-2;Lo;0;R;;;;;N;;;;; +10988;MEROITIC HIEROGLYPHIC LETTER PA;Lo;0;R;;;;;N;;;;; +10989;MEROITIC HIEROGLYPHIC LETTER MA;Lo;0;R;;;;;N;;;;; +1098A;MEROITIC HIEROGLYPHIC LETTER NA;Lo;0;R;;;;;N;;;;; +1098B;MEROITIC HIEROGLYPHIC LETTER NA-2;Lo;0;R;;;;;N;;;;; +1098C;MEROITIC HIEROGLYPHIC LETTER NE;Lo;0;R;;;;;N;;;;; +1098D;MEROITIC HIEROGLYPHIC LETTER NE-2;Lo;0;R;;;;;N;;;;; +1098E;MEROITIC HIEROGLYPHIC LETTER RA;Lo;0;R;;;;;N;;;;; +1098F;MEROITIC HIEROGLYPHIC LETTER RA-2;Lo;0;R;;;;;N;;;;; +10990;MEROITIC HIEROGLYPHIC LETTER LA;Lo;0;R;;;;;N;;;;; +10991;MEROITIC HIEROGLYPHIC LETTER KHA;Lo;0;R;;;;;N;;;;; +10992;MEROITIC HIEROGLYPHIC LETTER HHA;Lo;0;R;;;;;N;;;;; +10993;MEROITIC HIEROGLYPHIC LETTER SA;Lo;0;R;;;;;N;;;;; +10994;MEROITIC HIEROGLYPHIC LETTER SA-2;Lo;0;R;;;;;N;;;;; +10995;MEROITIC HIEROGLYPHIC LETTER SE;Lo;0;R;;;;;N;;;;; +10996;MEROITIC HIEROGLYPHIC LETTER KA;Lo;0;R;;;;;N;;;;; +10997;MEROITIC HIEROGLYPHIC LETTER QA;Lo;0;R;;;;;N;;;;; +10998;MEROITIC HIEROGLYPHIC LETTER TA;Lo;0;R;;;;;N;;;;; +10999;MEROITIC HIEROGLYPHIC LETTER TA-2;Lo;0;R;;;;;N;;;;; +1099A;MEROITIC HIEROGLYPHIC LETTER TE;Lo;0;R;;;;;N;;;;; +1099B;MEROITIC HIEROGLYPHIC LETTER TE-2;Lo;0;R;;;;;N;;;;; +1099C;MEROITIC HIEROGLYPHIC LETTER TO;Lo;0;R;;;;;N;;;;; +1099D;MEROITIC HIEROGLYPHIC LETTER DA;Lo;0;R;;;;;N;;;;; +1099E;MEROITIC HIEROGLYPHIC SYMBOL VIDJ;Lo;0;R;;;;;N;;;;; +1099F;MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2;Lo;0;R;;;;;N;;;;; +109A0;MEROITIC CURSIVE LETTER A;Lo;0;R;;;;;N;;;;; +109A1;MEROITIC CURSIVE LETTER E;Lo;0;R;;;;;N;;;;; +109A2;MEROITIC CURSIVE LETTER I;Lo;0;R;;;;;N;;;;; +109A3;MEROITIC CURSIVE LETTER O;Lo;0;R;;;;;N;;;;; +109A4;MEROITIC CURSIVE LETTER YA;Lo;0;R;;;;;N;;;;; +109A5;MEROITIC CURSIVE LETTER WA;Lo;0;R;;;;;N;;;;; +109A6;MEROITIC CURSIVE LETTER BA;Lo;0;R;;;;;N;;;;; +109A7;MEROITIC CURSIVE LETTER PA;Lo;0;R;;;;;N;;;;; +109A8;MEROITIC CURSIVE LETTER MA;Lo;0;R;;;;;N;;;;; +109A9;MEROITIC CURSIVE LETTER NA;Lo;0;R;;;;;N;;;;; +109AA;MEROITIC CURSIVE LETTER NE;Lo;0;R;;;;;N;;;;; +109AB;MEROITIC CURSIVE LETTER RA;Lo;0;R;;;;;N;;;;; +109AC;MEROITIC CURSIVE LETTER LA;Lo;0;R;;;;;N;;;;; +109AD;MEROITIC CURSIVE LETTER KHA;Lo;0;R;;;;;N;;;;; +109AE;MEROITIC CURSIVE LETTER HHA;Lo;0;R;;;;;N;;;;; +109AF;MEROITIC CURSIVE LETTER SA;Lo;0;R;;;;;N;;;;; +109B0;MEROITIC CURSIVE LETTER ARCHAIC SA;Lo;0;R;;;;;N;;;;; +109B1;MEROITIC CURSIVE LETTER SE;Lo;0;R;;;;;N;;;;; +109B2;MEROITIC CURSIVE LETTER KA;Lo;0;R;;;;;N;;;;; +109B3;MEROITIC CURSIVE LETTER QA;Lo;0;R;;;;;N;;;;; +109B4;MEROITIC CURSIVE LETTER TA;Lo;0;R;;;;;N;;;;; +109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; +109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; +109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; +109BC;MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS;No;0;R;;;;11/12;N;;;;; +109BD;MEROITIC CURSIVE FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; +109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; +109C0;MEROITIC CURSIVE NUMBER ONE;No;0;R;;;;1;N;;;;; +109C1;MEROITIC CURSIVE NUMBER TWO;No;0;R;;;;2;N;;;;; +109C2;MEROITIC CURSIVE NUMBER THREE;No;0;R;;;;3;N;;;;; +109C3;MEROITIC CURSIVE NUMBER FOUR;No;0;R;;;;4;N;;;;; +109C4;MEROITIC CURSIVE NUMBER FIVE;No;0;R;;;;5;N;;;;; +109C5;MEROITIC CURSIVE NUMBER SIX;No;0;R;;;;6;N;;;;; +109C6;MEROITIC CURSIVE NUMBER SEVEN;No;0;R;;;;7;N;;;;; +109C7;MEROITIC CURSIVE NUMBER EIGHT;No;0;R;;;;8;N;;;;; +109C8;MEROITIC CURSIVE NUMBER NINE;No;0;R;;;;9;N;;;;; +109C9;MEROITIC CURSIVE NUMBER TEN;No;0;R;;;;10;N;;;;; +109CA;MEROITIC CURSIVE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +109CB;MEROITIC CURSIVE NUMBER THIRTY;No;0;R;;;;30;N;;;;; +109CC;MEROITIC CURSIVE NUMBER FORTY;No;0;R;;;;40;N;;;;; +109CD;MEROITIC CURSIVE NUMBER FIFTY;No;0;R;;;;50;N;;;;; +109CE;MEROITIC CURSIVE NUMBER SIXTY;No;0;R;;;;60;N;;;;; +109CF;MEROITIC CURSIVE NUMBER SEVENTY;No;0;R;;;;70;N;;;;; +109D2;MEROITIC CURSIVE NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +109D3;MEROITIC CURSIVE NUMBER TWO HUNDRED;No;0;R;;;;200;N;;;;; +109D4;MEROITIC CURSIVE NUMBER THREE HUNDRED;No;0;R;;;;300;N;;;;; +109D5;MEROITIC CURSIVE NUMBER FOUR HUNDRED;No;0;R;;;;400;N;;;;; +109D6;MEROITIC CURSIVE NUMBER FIVE HUNDRED;No;0;R;;;;500;N;;;;; +109D7;MEROITIC CURSIVE NUMBER SIX HUNDRED;No;0;R;;;;600;N;;;;; +109D8;MEROITIC CURSIVE NUMBER SEVEN HUNDRED;No;0;R;;;;700;N;;;;; +109D9;MEROITIC CURSIVE NUMBER EIGHT HUNDRED;No;0;R;;;;800;N;;;;; +109DA;MEROITIC CURSIVE NUMBER NINE HUNDRED;No;0;R;;;;900;N;;;;; +109DB;MEROITIC CURSIVE NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +109DC;MEROITIC CURSIVE NUMBER TWO THOUSAND;No;0;R;;;;2000;N;;;;; +109DD;MEROITIC CURSIVE NUMBER THREE THOUSAND;No;0;R;;;;3000;N;;;;; +109DE;MEROITIC CURSIVE NUMBER FOUR THOUSAND;No;0;R;;;;4000;N;;;;; +109DF;MEROITIC CURSIVE NUMBER FIVE THOUSAND;No;0;R;;;;5000;N;;;;; +109E0;MEROITIC CURSIVE NUMBER SIX THOUSAND;No;0;R;;;;6000;N;;;;; +109E1;MEROITIC CURSIVE NUMBER SEVEN THOUSAND;No;0;R;;;;7000;N;;;;; +109E2;MEROITIC CURSIVE NUMBER EIGHT THOUSAND;No;0;R;;;;8000;N;;;;; +109E3;MEROITIC CURSIVE NUMBER NINE THOUSAND;No;0;R;;;;9000;N;;;;; +109E4;MEROITIC CURSIVE NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +109E5;MEROITIC CURSIVE NUMBER TWENTY THOUSAND;No;0;R;;;;20000;N;;;;; +109E6;MEROITIC CURSIVE NUMBER THIRTY THOUSAND;No;0;R;;;;30000;N;;;;; +109E7;MEROITIC CURSIVE NUMBER FORTY THOUSAND;No;0;R;;;;40000;N;;;;; +109E8;MEROITIC CURSIVE NUMBER FIFTY THOUSAND;No;0;R;;;;50000;N;;;;; +109E9;MEROITIC CURSIVE NUMBER SIXTY THOUSAND;No;0;R;;;;60000;N;;;;; +109EA;MEROITIC CURSIVE NUMBER SEVENTY THOUSAND;No;0;R;;;;70000;N;;;;; +109EB;MEROITIC CURSIVE NUMBER EIGHTY THOUSAND;No;0;R;;;;80000;N;;;;; +109EC;MEROITIC CURSIVE NUMBER NINETY THOUSAND;No;0;R;;;;90000;N;;;;; +109ED;MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND;No;0;R;;;;100000;N;;;;; +109EE;MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND;No;0;R;;;;200000;N;;;;; +109EF;MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND;No;0;R;;;;300000;N;;;;; +109F0;MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND;No;0;R;;;;400000;N;;;;; +109F1;MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND;No;0;R;;;;500000;N;;;;; +109F2;MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND;No;0;R;;;;600000;N;;;;; +109F3;MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND;No;0;R;;;;700000;N;;;;; +109F4;MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND;No;0;R;;;;800000;N;;;;; +109F5;MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND;No;0;R;;;;900000;N;;;;; +109F6;MEROITIC CURSIVE FRACTION ONE TWELFTH;No;0;R;;;;1/12;N;;;;; +109F7;MEROITIC CURSIVE FRACTION TWO TWELFTHS;No;0;R;;;;2/12;N;;;;; +109F8;MEROITIC CURSIVE FRACTION THREE TWELFTHS;No;0;R;;;;3/12;N;;;;; +109F9;MEROITIC CURSIVE FRACTION FOUR TWELFTHS;No;0;R;;;;4/12;N;;;;; +109FA;MEROITIC CURSIVE FRACTION FIVE TWELFTHS;No;0;R;;;;5/12;N;;;;; +109FB;MEROITIC CURSIVE FRACTION SIX TWELFTHS;No;0;R;;;;6/12;N;;;;; +109FC;MEROITIC CURSIVE FRACTION SEVEN TWELFTHS;No;0;R;;;;7/12;N;;;;; +109FD;MEROITIC CURSIVE FRACTION EIGHT TWELFTHS;No;0;R;;;;8/12;N;;;;; +109FE;MEROITIC CURSIVE FRACTION NINE TWELFTHS;No;0;R;;;;9/12;N;;;;; +109FF;MEROITIC CURSIVE FRACTION TEN TWELFTHS;No;0;R;;;;10/12;N;;;;; +10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; +10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; +10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; +10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; +10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; +10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; +10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; +10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; +10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; +10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; +10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; +10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; +10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; +10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; +10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; +10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; +10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; +10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; +10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; +10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; +10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; +10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; +10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; +10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; +10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; +10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; +10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; +10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; +10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; +10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; +10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; +10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; +10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; +10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; +10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; +10A34;KHAROSHTHI LETTER TTTA;Lo;0;R;;;;;N;;;;; +10A35;KHAROSHTHI LETTER VHA;Lo;0;R;;;;;N;;;;; +10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; +10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; +10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; +10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; +10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; +10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; +10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; +10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; +10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10A48;KHAROSHTHI FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; +10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; +10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; +10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; +10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; +10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; +10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; +10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; +10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;; +10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;; +10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;; +10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;; +10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;; +10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;; +10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;; +10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;; +10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;; +10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;; +10A80;OLD NORTH ARABIAN LETTER HEH;Lo;0;R;;;;;N;;;;; +10A81;OLD NORTH ARABIAN LETTER LAM;Lo;0;R;;;;;N;;;;; +10A82;OLD NORTH ARABIAN LETTER HAH;Lo;0;R;;;;;N;;;;; +10A83;OLD NORTH ARABIAN LETTER MEEM;Lo;0;R;;;;;N;;;;; +10A84;OLD NORTH ARABIAN LETTER QAF;Lo;0;R;;;;;N;;;;; +10A85;OLD NORTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A86;OLD NORTH ARABIAN LETTER ES-2;Lo;0;R;;;;;N;;;;; +10A87;OLD NORTH ARABIAN LETTER REH;Lo;0;R;;;;;N;;;;; +10A88;OLD NORTH ARABIAN LETTER BEH;Lo;0;R;;;;;N;;;;; +10A89;OLD NORTH ARABIAN LETTER TEH;Lo;0;R;;;;;N;;;;; +10A8A;OLD NORTH ARABIAN LETTER ES-1;Lo;0;R;;;;;N;;;;; +10A8B;OLD NORTH ARABIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +10A8C;OLD NORTH ARABIAN LETTER NOON;Lo;0;R;;;;;N;;;;; +10A8D;OLD NORTH ARABIAN LETTER KHAH;Lo;0;R;;;;;N;;;;; +10A8E;OLD NORTH ARABIAN LETTER SAD;Lo;0;R;;;;;N;;;;; +10A8F;OLD NORTH ARABIAN LETTER ES-3;Lo;0;R;;;;;N;;;;; +10A90;OLD NORTH ARABIAN LETTER FEH;Lo;0;R;;;;;N;;;;; +10A91;OLD NORTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A92;OLD NORTH ARABIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10A93;OLD NORTH ARABIAN LETTER DAD;Lo;0;R;;;;;N;;;;; +10A94;OLD NORTH ARABIAN LETTER GEEM;Lo;0;R;;;;;N;;;;; +10A95;OLD NORTH ARABIAN LETTER DAL;Lo;0;R;;;;;N;;;;; +10A96;OLD NORTH ARABIAN LETTER GHAIN;Lo;0;R;;;;;N;;;;; +10A97;OLD NORTH ARABIAN LETTER TAH;Lo;0;R;;;;;N;;;;; +10A98;OLD NORTH ARABIAN LETTER ZAIN;Lo;0;R;;;;;N;;;;; +10A99;OLD NORTH ARABIAN LETTER THAL;Lo;0;R;;;;;N;;;;; +10A9A;OLD NORTH ARABIAN LETTER YEH;Lo;0;R;;;;;N;;;;; +10A9B;OLD NORTH ARABIAN LETTER THEH;Lo;0;R;;;;;N;;;;; +10A9C;OLD NORTH ARABIAN LETTER ZAH;Lo;0;R;;;;;N;;;;; +10A9D;OLD NORTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A9E;OLD NORTH ARABIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10A9F;OLD NORTH ARABIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AC0;MANICHAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10AC1;MANICHAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10AC2;MANICHAEAN LETTER BHETH;Lo;0;R;;;;;N;;;;; +10AC3;MANICHAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10AC4;MANICHAEAN LETTER GHIMEL;Lo;0;R;;;;;N;;;;; +10AC5;MANICHAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10AC6;MANICHAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10AC7;MANICHAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10AC8;MANICHAEAN SIGN UD;So;0;R;;;;;N;;;;; +10AC9;MANICHAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10ACA;MANICHAEAN LETTER ZHAYIN;Lo;0;R;;;;;N;;;;; +10ACB;MANICHAEAN LETTER JAYIN;Lo;0;R;;;;;N;;;;; +10ACC;MANICHAEAN LETTER JHAYIN;Lo;0;R;;;;;N;;;;; +10ACD;MANICHAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10ACE;MANICHAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10ACF;MANICHAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10AD0;MANICHAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10AD1;MANICHAEAN LETTER XAPH;Lo;0;R;;;;;N;;;;; +10AD2;MANICHAEAN LETTER KHAPH;Lo;0;R;;;;;N;;;;; +10AD3;MANICHAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10AD4;MANICHAEAN LETTER DHAMEDH;Lo;0;R;;;;;N;;;;; +10AD5;MANICHAEAN LETTER THAMEDH;Lo;0;R;;;;;N;;;;; +10AD6;MANICHAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10AD7;MANICHAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10AD8;MANICHAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10AD9;MANICHAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10ADA;MANICHAEAN LETTER AAYIN;Lo;0;R;;;;;N;;;;; +10ADB;MANICHAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10ADC;MANICHAEAN LETTER FE;Lo;0;R;;;;;N;;;;; +10ADD;MANICHAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10ADE;MANICHAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10ADF;MANICHAEAN LETTER XOPH;Lo;0;R;;;;;N;;;;; +10AE0;MANICHAEAN LETTER QHOPH;Lo;0;R;;;;;N;;;;; +10AE1;MANICHAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10AE2;MANICHAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10AE3;MANICHAEAN LETTER SSHIN;Lo;0;R;;;;;N;;;;; +10AE4;MANICHAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10AE5;MANICHAEAN ABBREVIATION MARK ABOVE;Mn;230;NSM;;;;;N;;;;; +10AE6;MANICHAEAN ABBREVIATION MARK BELOW;Mn;220;NSM;;;;;N;;;;; +10AEB;MANICHAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10AEC;MANICHAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10AED;MANICHAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10AEE;MANICHAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AEF;MANICHAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10AF0;MANICHAEAN PUNCTUATION STAR;Po;0;R;;;;;N;;;;; +10AF1;MANICHAEAN PUNCTUATION FLEURON;Po;0;R;;;;;N;;;;; +10AF2;MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF3;MANICHAEAN PUNCTUATION DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF4;MANICHAEAN PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10AF5;MANICHAEAN PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; +10AF6;MANICHAEAN PUNCTUATION LINE FILLER;Po;0;R;;;;;N;;;;; +10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;; +10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;; +10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;; +10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;; +10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;; +10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;; +10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;; +10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;; +10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;; +10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;; +10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;; +10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;; +10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;; +10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;; +10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;; +10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;; +10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;; +10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;; +10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;; +10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;; +10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;; +10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;; +10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;; +10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;; +10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;; +10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;; +10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;; +10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;; +10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;; +10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;; +10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;; +10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;; +10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;; +10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;; +10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;; +10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;; +10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;; +10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;; +10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;; +10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;; +10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;; +10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;; +10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;; +10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;; +10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;; +10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;; +10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;; +10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;; +10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;; +10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;; +10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;; +10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;; +10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;; +10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;; +10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B80;PSALTER PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B81;PSALTER PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B82;PSALTER PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B83;PSALTER PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B84;PSALTER PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B85;PSALTER PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B86;PSALTER PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B87;PSALTER PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B88;PSALTER PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B89;PSALTER PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B8A;PSALTER PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B8B;PSALTER PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B8C;PSALTER PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B8D;PSALTER PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B8E;PSALTER PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B8F;PSALTER PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B90;PSALTER PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B91;PSALTER PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B99;PSALTER PAHLAVI SECTION MARK;Po;0;R;;;;;N;;;;; +10B9A;PSALTER PAHLAVI TURNED SECTION MARK;Po;0;R;;;;;N;;;;; +10B9B;PSALTER PAHLAVI FOUR DOTS WITH CROSS;Po;0;R;;;;;N;;;;; +10B9C;PSALTER PAHLAVI FOUR DOTS WITH DOT;Po;0;R;;;;;N;;;;; +10BA9;PSALTER PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10BAA;PSALTER PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10BAB;PSALTER PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10BAC;PSALTER PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10BAD;PSALTER PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10BAE;PSALTER PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10BAF;PSALTER PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;; +10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;; +10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;; +10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;; +10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;; +10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;; +10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;; +10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;; +10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;; +10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;; +10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;; +10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;; +10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;; +10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;; +10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;; +10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;; +10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;; +10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;; +10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;; +10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;; +10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;; +10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;; +10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;; +10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;; +10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;; +10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;; +10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;; +10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;; +10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;; +10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;; +10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;; +10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;; +10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;; +10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;; +10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;; +10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;; +10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;; +10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;; +10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;; +10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;; +10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;; +10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;; +10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;; +10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;; +10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;; +10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;; +10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;; +10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;; +10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;; +10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;; +10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;; +10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;; +10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;; +10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;; +10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;; +10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;; +10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;; +10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;; +10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;; +10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;; +10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;; +10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;; +10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;; +10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;; +10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;; +10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;; +10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;; +10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;; +10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;; +10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;; +10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; +10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; +10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; +10C80;OLD HUNGARIAN CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10CC0; +10C81;OLD HUNGARIAN CAPITAL LETTER AA;Lu;0;R;;;;;N;;;;10CC1; +10C82;OLD HUNGARIAN CAPITAL LETTER EB;Lu;0;R;;;;;N;;;;10CC2; +10C83;OLD HUNGARIAN CAPITAL LETTER AMB;Lu;0;R;;;;;N;;;;10CC3; +10C84;OLD HUNGARIAN CAPITAL LETTER EC;Lu;0;R;;;;;N;;;;10CC4; +10C85;OLD HUNGARIAN CAPITAL LETTER ENC;Lu;0;R;;;;;N;;;;10CC5; +10C86;OLD HUNGARIAN CAPITAL LETTER ECS;Lu;0;R;;;;;N;;;;10CC6; +10C87;OLD HUNGARIAN CAPITAL LETTER ED;Lu;0;R;;;;;N;;;;10CC7; +10C88;OLD HUNGARIAN CAPITAL LETTER AND;Lu;0;R;;;;;N;;;;10CC8; +10C89;OLD HUNGARIAN CAPITAL LETTER E;Lu;0;R;;;;;N;;;;10CC9; +10C8A;OLD HUNGARIAN CAPITAL LETTER CLOSE E;Lu;0;R;;;;;N;;;;10CCA; +10C8B;OLD HUNGARIAN CAPITAL LETTER EE;Lu;0;R;;;;;N;;;;10CCB; +10C8C;OLD HUNGARIAN CAPITAL LETTER EF;Lu;0;R;;;;;N;;;;10CCC; +10C8D;OLD HUNGARIAN CAPITAL LETTER EG;Lu;0;R;;;;;N;;;;10CCD; +10C8E;OLD HUNGARIAN CAPITAL LETTER EGY;Lu;0;R;;;;;N;;;;10CCE; +10C8F;OLD HUNGARIAN CAPITAL LETTER EH;Lu;0;R;;;;;N;;;;10CCF; +10C90;OLD HUNGARIAN CAPITAL LETTER I;Lu;0;R;;;;;N;;;;10CD0; +10C91;OLD HUNGARIAN CAPITAL LETTER II;Lu;0;R;;;;;N;;;;10CD1; +10C92;OLD HUNGARIAN CAPITAL LETTER EJ;Lu;0;R;;;;;N;;;;10CD2; +10C93;OLD HUNGARIAN CAPITAL LETTER EK;Lu;0;R;;;;;N;;;;10CD3; +10C94;OLD HUNGARIAN CAPITAL LETTER AK;Lu;0;R;;;;;N;;;;10CD4; +10C95;OLD HUNGARIAN CAPITAL LETTER UNK;Lu;0;R;;;;;N;;;;10CD5; +10C96;OLD HUNGARIAN CAPITAL LETTER EL;Lu;0;R;;;;;N;;;;10CD6; +10C97;OLD HUNGARIAN CAPITAL LETTER ELY;Lu;0;R;;;;;N;;;;10CD7; +10C98;OLD HUNGARIAN CAPITAL LETTER EM;Lu;0;R;;;;;N;;;;10CD8; +10C99;OLD HUNGARIAN CAPITAL LETTER EN;Lu;0;R;;;;;N;;;;10CD9; +10C9A;OLD HUNGARIAN CAPITAL LETTER ENY;Lu;0;R;;;;;N;;;;10CDA; +10C9B;OLD HUNGARIAN CAPITAL LETTER O;Lu;0;R;;;;;N;;;;10CDB; +10C9C;OLD HUNGARIAN CAPITAL LETTER OO;Lu;0;R;;;;;N;;;;10CDC; +10C9D;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE;Lu;0;R;;;;;N;;;;10CDD; +10C9E;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE;Lu;0;R;;;;;N;;;;10CDE; +10C9F;OLD HUNGARIAN CAPITAL LETTER OEE;Lu;0;R;;;;;N;;;;10CDF; +10CA0;OLD HUNGARIAN CAPITAL LETTER EP;Lu;0;R;;;;;N;;;;10CE0; +10CA1;OLD HUNGARIAN CAPITAL LETTER EMP;Lu;0;R;;;;;N;;;;10CE1; +10CA2;OLD HUNGARIAN CAPITAL LETTER ER;Lu;0;R;;;;;N;;;;10CE2; +10CA3;OLD HUNGARIAN CAPITAL LETTER SHORT ER;Lu;0;R;;;;;N;;;;10CE3; +10CA4;OLD HUNGARIAN CAPITAL LETTER ES;Lu;0;R;;;;;N;;;;10CE4; +10CA5;OLD HUNGARIAN CAPITAL LETTER ESZ;Lu;0;R;;;;;N;;;;10CE5; +10CA6;OLD HUNGARIAN CAPITAL LETTER ET;Lu;0;R;;;;;N;;;;10CE6; +10CA7;OLD HUNGARIAN CAPITAL LETTER ENT;Lu;0;R;;;;;N;;;;10CE7; +10CA8;OLD HUNGARIAN CAPITAL LETTER ETY;Lu;0;R;;;;;N;;;;10CE8; +10CA9;OLD HUNGARIAN CAPITAL LETTER ECH;Lu;0;R;;;;;N;;;;10CE9; +10CAA;OLD HUNGARIAN CAPITAL LETTER U;Lu;0;R;;;;;N;;;;10CEA; +10CAB;OLD HUNGARIAN CAPITAL LETTER UU;Lu;0;R;;;;;N;;;;10CEB; +10CAC;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE;Lu;0;R;;;;;N;;;;10CEC; +10CAD;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE;Lu;0;R;;;;;N;;;;10CED; +10CAE;OLD HUNGARIAN CAPITAL LETTER EV;Lu;0;R;;;;;N;;;;10CEE; +10CAF;OLD HUNGARIAN CAPITAL LETTER EZ;Lu;0;R;;;;;N;;;;10CEF; +10CB0;OLD HUNGARIAN CAPITAL LETTER EZS;Lu;0;R;;;;;N;;;;10CF0; +10CB1;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN;Lu;0;R;;;;;N;;;;10CF1; +10CB2;OLD HUNGARIAN CAPITAL LETTER US;Lu;0;R;;;;;N;;;;10CF2; +10CC0;OLD HUNGARIAN SMALL LETTER A;Ll;0;R;;;;;N;;;10C80;;10C80 +10CC1;OLD HUNGARIAN SMALL LETTER AA;Ll;0;R;;;;;N;;;10C81;;10C81 +10CC2;OLD HUNGARIAN SMALL LETTER EB;Ll;0;R;;;;;N;;;10C82;;10C82 +10CC3;OLD HUNGARIAN SMALL LETTER AMB;Ll;0;R;;;;;N;;;10C83;;10C83 +10CC4;OLD HUNGARIAN SMALL LETTER EC;Ll;0;R;;;;;N;;;10C84;;10C84 +10CC5;OLD HUNGARIAN SMALL LETTER ENC;Ll;0;R;;;;;N;;;10C85;;10C85 +10CC6;OLD HUNGARIAN SMALL LETTER ECS;Ll;0;R;;;;;N;;;10C86;;10C86 +10CC7;OLD HUNGARIAN SMALL LETTER ED;Ll;0;R;;;;;N;;;10C87;;10C87 +10CC8;OLD HUNGARIAN SMALL LETTER AND;Ll;0;R;;;;;N;;;10C88;;10C88 +10CC9;OLD HUNGARIAN SMALL LETTER E;Ll;0;R;;;;;N;;;10C89;;10C89 +10CCA;OLD HUNGARIAN SMALL LETTER CLOSE E;Ll;0;R;;;;;N;;;10C8A;;10C8A +10CCB;OLD HUNGARIAN SMALL LETTER EE;Ll;0;R;;;;;N;;;10C8B;;10C8B +10CCC;OLD HUNGARIAN SMALL LETTER EF;Ll;0;R;;;;;N;;;10C8C;;10C8C +10CCD;OLD HUNGARIAN SMALL LETTER EG;Ll;0;R;;;;;N;;;10C8D;;10C8D +10CCE;OLD HUNGARIAN SMALL LETTER EGY;Ll;0;R;;;;;N;;;10C8E;;10C8E +10CCF;OLD HUNGARIAN SMALL LETTER EH;Ll;0;R;;;;;N;;;10C8F;;10C8F +10CD0;OLD HUNGARIAN SMALL LETTER I;Ll;0;R;;;;;N;;;10C90;;10C90 +10CD1;OLD HUNGARIAN SMALL LETTER II;Ll;0;R;;;;;N;;;10C91;;10C91 +10CD2;OLD HUNGARIAN SMALL LETTER EJ;Ll;0;R;;;;;N;;;10C92;;10C92 +10CD3;OLD HUNGARIAN SMALL LETTER EK;Ll;0;R;;;;;N;;;10C93;;10C93 +10CD4;OLD HUNGARIAN SMALL LETTER AK;Ll;0;R;;;;;N;;;10C94;;10C94 +10CD5;OLD HUNGARIAN SMALL LETTER UNK;Ll;0;R;;;;;N;;;10C95;;10C95 +10CD6;OLD HUNGARIAN SMALL LETTER EL;Ll;0;R;;;;;N;;;10C96;;10C96 +10CD7;OLD HUNGARIAN SMALL LETTER ELY;Ll;0;R;;;;;N;;;10C97;;10C97 +10CD8;OLD HUNGARIAN SMALL LETTER EM;Ll;0;R;;;;;N;;;10C98;;10C98 +10CD9;OLD HUNGARIAN SMALL LETTER EN;Ll;0;R;;;;;N;;;10C99;;10C99 +10CDA;OLD HUNGARIAN SMALL LETTER ENY;Ll;0;R;;;;;N;;;10C9A;;10C9A +10CDB;OLD HUNGARIAN SMALL LETTER O;Ll;0;R;;;;;N;;;10C9B;;10C9B +10CDC;OLD HUNGARIAN SMALL LETTER OO;Ll;0;R;;;;;N;;;10C9C;;10C9C +10CDD;OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE;Ll;0;R;;;;;N;;;10C9D;;10C9D +10CDE;OLD HUNGARIAN SMALL LETTER RUDIMENTA OE;Ll;0;R;;;;;N;;;10C9E;;10C9E +10CDF;OLD HUNGARIAN SMALL LETTER OEE;Ll;0;R;;;;;N;;;10C9F;;10C9F +10CE0;OLD HUNGARIAN SMALL LETTER EP;Ll;0;R;;;;;N;;;10CA0;;10CA0 +10CE1;OLD HUNGARIAN SMALL LETTER EMP;Ll;0;R;;;;;N;;;10CA1;;10CA1 +10CE2;OLD HUNGARIAN SMALL LETTER ER;Ll;0;R;;;;;N;;;10CA2;;10CA2 +10CE3;OLD HUNGARIAN SMALL LETTER SHORT ER;Ll;0;R;;;;;N;;;10CA3;;10CA3 +10CE4;OLD HUNGARIAN SMALL LETTER ES;Ll;0;R;;;;;N;;;10CA4;;10CA4 +10CE5;OLD HUNGARIAN SMALL LETTER ESZ;Ll;0;R;;;;;N;;;10CA5;;10CA5 +10CE6;OLD HUNGARIAN SMALL LETTER ET;Ll;0;R;;;;;N;;;10CA6;;10CA6 +10CE7;OLD HUNGARIAN SMALL LETTER ENT;Ll;0;R;;;;;N;;;10CA7;;10CA7 +10CE8;OLD HUNGARIAN SMALL LETTER ETY;Ll;0;R;;;;;N;;;10CA8;;10CA8 +10CE9;OLD HUNGARIAN SMALL LETTER ECH;Ll;0;R;;;;;N;;;10CA9;;10CA9 +10CEA;OLD HUNGARIAN SMALL LETTER U;Ll;0;R;;;;;N;;;10CAA;;10CAA +10CEB;OLD HUNGARIAN SMALL LETTER UU;Ll;0;R;;;;;N;;;10CAB;;10CAB +10CEC;OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE;Ll;0;R;;;;;N;;;10CAC;;10CAC +10CED;OLD HUNGARIAN SMALL LETTER RUDIMENTA UE;Ll;0;R;;;;;N;;;10CAD;;10CAD +10CEE;OLD HUNGARIAN SMALL LETTER EV;Ll;0;R;;;;;N;;;10CAE;;10CAE +10CEF;OLD HUNGARIAN SMALL LETTER EZ;Ll;0;R;;;;;N;;;10CAF;;10CAF +10CF0;OLD HUNGARIAN SMALL LETTER EZS;Ll;0;R;;;;;N;;;10CB0;;10CB0 +10CF1;OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN;Ll;0;R;;;;;N;;;10CB1;;10CB1 +10CF2;OLD HUNGARIAN SMALL LETTER US;Ll;0;R;;;;;N;;;10CB2;;10CB2 +10CFA;OLD HUNGARIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10CFB;OLD HUNGARIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10CFC;OLD HUNGARIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10D00;HANIFI ROHINGYA LETTER A;Lo;0;AL;;;;;N;;;;; +10D01;HANIFI ROHINGYA LETTER BA;Lo;0;AL;;;;;N;;;;; +10D02;HANIFI ROHINGYA LETTER PA;Lo;0;AL;;;;;N;;;;; +10D03;HANIFI ROHINGYA LETTER TA;Lo;0;AL;;;;;N;;;;; +10D04;HANIFI ROHINGYA LETTER TTA;Lo;0;AL;;;;;N;;;;; +10D05;HANIFI ROHINGYA LETTER JA;Lo;0;AL;;;;;N;;;;; +10D06;HANIFI ROHINGYA LETTER CA;Lo;0;AL;;;;;N;;;;; +10D07;HANIFI ROHINGYA LETTER HA;Lo;0;AL;;;;;N;;;;; +10D08;HANIFI ROHINGYA LETTER KHA;Lo;0;AL;;;;;N;;;;; +10D09;HANIFI ROHINGYA LETTER FA;Lo;0;AL;;;;;N;;;;; +10D0A;HANIFI ROHINGYA LETTER DA;Lo;0;AL;;;;;N;;;;; +10D0B;HANIFI ROHINGYA LETTER DDA;Lo;0;AL;;;;;N;;;;; +10D0C;HANIFI ROHINGYA LETTER RA;Lo;0;AL;;;;;N;;;;; +10D0D;HANIFI ROHINGYA LETTER RRA;Lo;0;AL;;;;;N;;;;; +10D0E;HANIFI ROHINGYA LETTER ZA;Lo;0;AL;;;;;N;;;;; +10D0F;HANIFI ROHINGYA LETTER SA;Lo;0;AL;;;;;N;;;;; +10D10;HANIFI ROHINGYA LETTER SHA;Lo;0;AL;;;;;N;;;;; +10D11;HANIFI ROHINGYA LETTER KA;Lo;0;AL;;;;;N;;;;; +10D12;HANIFI ROHINGYA LETTER GA;Lo;0;AL;;;;;N;;;;; +10D13;HANIFI ROHINGYA LETTER LA;Lo;0;AL;;;;;N;;;;; +10D14;HANIFI ROHINGYA LETTER MA;Lo;0;AL;;;;;N;;;;; +10D15;HANIFI ROHINGYA LETTER NA;Lo;0;AL;;;;;N;;;;; +10D16;HANIFI ROHINGYA LETTER WA;Lo;0;AL;;;;;N;;;;; +10D17;HANIFI ROHINGYA LETTER KINNA WA;Lo;0;AL;;;;;N;;;;; +10D18;HANIFI ROHINGYA LETTER YA;Lo;0;AL;;;;;N;;;;; +10D19;HANIFI ROHINGYA LETTER KINNA YA;Lo;0;AL;;;;;N;;;;; +10D1A;HANIFI ROHINGYA LETTER NGA;Lo;0;AL;;;;;N;;;;; +10D1B;HANIFI ROHINGYA LETTER NYA;Lo;0;AL;;;;;N;;;;; +10D1C;HANIFI ROHINGYA LETTER VA;Lo;0;AL;;;;;N;;;;; +10D1D;HANIFI ROHINGYA VOWEL A;Lo;0;AL;;;;;N;;;;; +10D1E;HANIFI ROHINGYA VOWEL I;Lo;0;AL;;;;;N;;;;; +10D1F;HANIFI ROHINGYA VOWEL U;Lo;0;AL;;;;;N;;;;; +10D20;HANIFI ROHINGYA VOWEL E;Lo;0;AL;;;;;N;;;;; +10D21;HANIFI ROHINGYA VOWEL O;Lo;0;AL;;;;;N;;;;; +10D22;HANIFI ROHINGYA MARK SAKIN;Lo;0;AL;;;;;N;;;;; +10D23;HANIFI ROHINGYA MARK NA KHONNA;Lo;0;AL;;;;;N;;;;; +10D24;HANIFI ROHINGYA SIGN HARBAHAY;Mn;230;NSM;;;;;N;;;;; +10D25;HANIFI ROHINGYA SIGN TAHALA;Mn;230;NSM;;;;;N;;;;; +10D26;HANIFI ROHINGYA SIGN TANA;Mn;230;NSM;;;;;N;;;;; +10D27;HANIFI ROHINGYA SIGN TASSI;Mn;230;NSM;;;;;N;;;;; +10D30;HANIFI ROHINGYA DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +10D31;HANIFI ROHINGYA DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +10D32;HANIFI ROHINGYA DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +10D33;HANIFI ROHINGYA DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +10D34;HANIFI ROHINGYA DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +10D35;HANIFI ROHINGYA DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +10D36;HANIFI ROHINGYA DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +10D37;HANIFI ROHINGYA DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +10D38;HANIFI ROHINGYA DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +10D39;HANIFI ROHINGYA DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +10D40;GARAY DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +10D41;GARAY DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +10D42;GARAY DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +10D43;GARAY DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +10D44;GARAY DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +10D45;GARAY DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +10D46;GARAY DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +10D47;GARAY DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +10D48;GARAY DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +10D49;GARAY DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +10D4A;GARAY VOWEL SIGN A;Lo;0;R;;;;;N;;;;; +10D4B;GARAY VOWEL SIGN I;Lo;0;R;;;;;N;;;;; +10D4C;GARAY VOWEL SIGN O;Lo;0;R;;;;;N;;;;; +10D4D;GARAY VOWEL SIGN EE;Lo;0;R;;;;;N;;;;; +10D4E;GARAY VOWEL LENGTH MARK;Lm;0;R;;;;;N;;;;; +10D4F;GARAY SUKUN;Lo;0;R;;;;;N;;;;; +10D50;GARAY CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10D70; +10D51;GARAY CAPITAL LETTER CA;Lu;0;R;;;;;N;;;;10D71; +10D52;GARAY CAPITAL LETTER MA;Lu;0;R;;;;;N;;;;10D72; +10D53;GARAY CAPITAL LETTER KA;Lu;0;R;;;;;N;;;;10D73; +10D54;GARAY CAPITAL LETTER BA;Lu;0;R;;;;;N;;;;10D74; +10D55;GARAY CAPITAL LETTER JA;Lu;0;R;;;;;N;;;;10D75; +10D56;GARAY CAPITAL LETTER SA;Lu;0;R;;;;;N;;;;10D76; +10D57;GARAY CAPITAL LETTER WA;Lu;0;R;;;;;N;;;;10D77; +10D58;GARAY CAPITAL LETTER LA;Lu;0;R;;;;;N;;;;10D78; +10D59;GARAY CAPITAL LETTER GA;Lu;0;R;;;;;N;;;;10D79; +10D5A;GARAY CAPITAL LETTER DA;Lu;0;R;;;;;N;;;;10D7A; +10D5B;GARAY CAPITAL LETTER XA;Lu;0;R;;;;;N;;;;10D7B; +10D5C;GARAY CAPITAL LETTER YA;Lu;0;R;;;;;N;;;;10D7C; +10D5D;GARAY CAPITAL LETTER TA;Lu;0;R;;;;;N;;;;10D7D; +10D5E;GARAY CAPITAL LETTER RA;Lu;0;R;;;;;N;;;;10D7E; +10D5F;GARAY CAPITAL LETTER NYA;Lu;0;R;;;;;N;;;;10D7F; +10D60;GARAY CAPITAL LETTER FA;Lu;0;R;;;;;N;;;;10D80; +10D61;GARAY CAPITAL LETTER NA;Lu;0;R;;;;;N;;;;10D81; +10D62;GARAY CAPITAL LETTER PA;Lu;0;R;;;;;N;;;;10D82; +10D63;GARAY CAPITAL LETTER HA;Lu;0;R;;;;;N;;;;10D83; +10D64;GARAY CAPITAL LETTER OLD KA;Lu;0;R;;;;;N;;;;10D84; +10D65;GARAY CAPITAL LETTER OLD NA;Lu;0;R;;;;;N;;;;10D85; +10D69;GARAY VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; +10D6A;GARAY CONSONANT GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +10D6B;GARAY COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10D6C;GARAY COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10D6D;GARAY CONSONANT NASALIZATION MARK;Mn;230;NSM;;;;;N;;;;; +10D6E;GARAY HYPHEN;Pd;0;ON;;;;;N;;;;; +10D6F;GARAY REDUPLICATION MARK;Lm;0;R;;;;;N;;;;; +10D70;GARAY SMALL LETTER A;Ll;0;R;;;;;N;;;10D50;;10D50 +10D71;GARAY SMALL LETTER CA;Ll;0;R;;;;;N;;;10D51;;10D51 +10D72;GARAY SMALL LETTER MA;Ll;0;R;;;;;N;;;10D52;;10D52 +10D73;GARAY SMALL LETTER KA;Ll;0;R;;;;;N;;;10D53;;10D53 +10D74;GARAY SMALL LETTER BA;Ll;0;R;;;;;N;;;10D54;;10D54 +10D75;GARAY SMALL LETTER JA;Ll;0;R;;;;;N;;;10D55;;10D55 +10D76;GARAY SMALL LETTER SA;Ll;0;R;;;;;N;;;10D56;;10D56 +10D77;GARAY SMALL LETTER WA;Ll;0;R;;;;;N;;;10D57;;10D57 +10D78;GARAY SMALL LETTER LA;Ll;0;R;;;;;N;;;10D58;;10D58 +10D79;GARAY SMALL LETTER GA;Ll;0;R;;;;;N;;;10D59;;10D59 +10D7A;GARAY SMALL LETTER DA;Ll;0;R;;;;;N;;;10D5A;;10D5A +10D7B;GARAY SMALL LETTER XA;Ll;0;R;;;;;N;;;10D5B;;10D5B +10D7C;GARAY SMALL LETTER YA;Ll;0;R;;;;;N;;;10D5C;;10D5C +10D7D;GARAY SMALL LETTER TA;Ll;0;R;;;;;N;;;10D5D;;10D5D +10D7E;GARAY SMALL LETTER RA;Ll;0;R;;;;;N;;;10D5E;;10D5E +10D7F;GARAY SMALL LETTER NYA;Ll;0;R;;;;;N;;;10D5F;;10D5F +10D80;GARAY SMALL LETTER FA;Ll;0;R;;;;;N;;;10D60;;10D60 +10D81;GARAY SMALL LETTER NA;Ll;0;R;;;;;N;;;10D61;;10D61 +10D82;GARAY SMALL LETTER PA;Ll;0;R;;;;;N;;;10D62;;10D62 +10D83;GARAY SMALL LETTER HA;Ll;0;R;;;;;N;;;10D63;;10D63 +10D84;GARAY SMALL LETTER OLD KA;Ll;0;R;;;;;N;;;10D64;;10D64 +10D85;GARAY SMALL LETTER OLD NA;Ll;0;R;;;;;N;;;10D65;;10D65 +10D8E;GARAY PLUS SIGN;Sm;0;R;;;;;N;;;;; +10D8F;GARAY MINUS SIGN;Sm;0;R;;;;;N;;;;; +10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; +10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; +10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; +10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;; +10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;; +10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;; +10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;; +10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;; +10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;; +10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;; +10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;; +10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;; +10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;; +10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;; +10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;; +10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;; +10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;; +10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;; +10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;; +10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;; +10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;; +10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;; +10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;; +10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;; +10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;; +10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;; +10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;; +10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;N;;;;; +10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;; +10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;; +10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;; +10E80;YEZIDI LETTER ELIF;Lo;0;R;;;;;N;;;;; +10E81;YEZIDI LETTER BE;Lo;0;R;;;;;N;;;;; +10E82;YEZIDI LETTER PE;Lo;0;R;;;;;N;;;;; +10E83;YEZIDI LETTER PHE;Lo;0;R;;;;;N;;;;; +10E84;YEZIDI LETTER THE;Lo;0;R;;;;;N;;;;; +10E85;YEZIDI LETTER SE;Lo;0;R;;;;;N;;;;; +10E86;YEZIDI LETTER CIM;Lo;0;R;;;;;N;;;;; +10E87;YEZIDI LETTER CHIM;Lo;0;R;;;;;N;;;;; +10E88;YEZIDI LETTER CHHIM;Lo;0;R;;;;;N;;;;; +10E89;YEZIDI LETTER HHA;Lo;0;R;;;;;N;;;;; +10E8A;YEZIDI LETTER XA;Lo;0;R;;;;;N;;;;; +10E8B;YEZIDI LETTER DAL;Lo;0;R;;;;;N;;;;; +10E8C;YEZIDI LETTER ZAL;Lo;0;R;;;;;N;;;;; +10E8D;YEZIDI LETTER RA;Lo;0;R;;;;;N;;;;; +10E8E;YEZIDI LETTER RHA;Lo;0;R;;;;;N;;;;; +10E8F;YEZIDI LETTER ZA;Lo;0;R;;;;;N;;;;; +10E90;YEZIDI LETTER JA;Lo;0;R;;;;;N;;;;; +10E91;YEZIDI LETTER SIN;Lo;0;R;;;;;N;;;;; +10E92;YEZIDI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10E93;YEZIDI LETTER SAD;Lo;0;R;;;;;N;;;;; +10E94;YEZIDI LETTER DAD;Lo;0;R;;;;;N;;;;; +10E95;YEZIDI LETTER TA;Lo;0;R;;;;;N;;;;; +10E96;YEZIDI LETTER ZE;Lo;0;R;;;;;N;;;;; +10E97;YEZIDI LETTER EYN;Lo;0;R;;;;;N;;;;; +10E98;YEZIDI LETTER XHEYN;Lo;0;R;;;;;N;;;;; +10E99;YEZIDI LETTER FA;Lo;0;R;;;;;N;;;;; +10E9A;YEZIDI LETTER VA;Lo;0;R;;;;;N;;;;; +10E9B;YEZIDI LETTER VA ALTERNATE FORM;Lo;0;R;;;;;N;;;;; +10E9C;YEZIDI LETTER QAF;Lo;0;R;;;;;N;;;;; +10E9D;YEZIDI LETTER KAF;Lo;0;R;;;;;N;;;;; +10E9E;YEZIDI LETTER KHAF;Lo;0;R;;;;;N;;;;; +10E9F;YEZIDI LETTER GAF;Lo;0;R;;;;;N;;;;; +10EA0;YEZIDI LETTER LAM;Lo;0;R;;;;;N;;;;; +10EA1;YEZIDI LETTER MIM;Lo;0;R;;;;;N;;;;; +10EA2;YEZIDI LETTER NUN;Lo;0;R;;;;;N;;;;; +10EA3;YEZIDI LETTER UM;Lo;0;R;;;;;N;;;;; +10EA4;YEZIDI LETTER WAW;Lo;0;R;;;;;N;;;;; +10EA5;YEZIDI LETTER OW;Lo;0;R;;;;;N;;;;; +10EA6;YEZIDI LETTER EW;Lo;0;R;;;;;N;;;;; +10EA7;YEZIDI LETTER HAY;Lo;0;R;;;;;N;;;;; +10EA8;YEZIDI LETTER YOT;Lo;0;R;;;;;N;;;;; +10EA9;YEZIDI LETTER ET;Lo;0;R;;;;;N;;;;; +10EAB;YEZIDI COMBINING HAMZA MARK;Mn;230;NSM;;;;;N;;;;; +10EAC;YEZIDI COMBINING MADDA MARK;Mn;230;NSM;;;;;N;;;;; +10EAD;YEZIDI HYPHENATION MARK;Pd;0;R;;;;;N;;;;; +10EB0;YEZIDI LETTER LAM WITH DOT ABOVE;Lo;0;R;;;;;N;;;;; +10EB1;YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE;Lo;0;R;;;;;N;;;;; +10EC2;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW;Lo;0;AL;;;;;N;;;;; +10EC3;ARABIC LETTER TAH WITH TWO DOTS VERTICALLY BELOW;Lo;0;AL;;;;;N;;;;; +10EC4;ARABIC LETTER KAF WITH TWO DOTS VERTICALLY BELOW;Lo;0;AL;;;;;N;;;;; +10EC5;ARABIC SMALL YEH BARREE WITH TWO DOTS BELOW;Lm;0;AL;;;;;N;;;;; +10EC6;ARABIC LETTER THIN NOON;Lo;0;AL;;;;;N;;;;; +10EC7;ARABIC LETTER YEH WITH FOUR DOTS BELOW;Lo;0;AL;;;;;N;;;;; +10ED0;ARABIC BIBLICAL END OF VERSE;Po;0;ON;;;;;N;;;;; +10ED1;ARABIC LIGATURE ALAYHAA AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; +10ED2;ARABIC LIGATURE ALAYHIM AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; +10ED3;ARABIC LIGATURE ALAYHIMAA AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; +10ED4;ARABIC LIGATURE QADDASA ALLAAHU SIRRAH;So;0;ON;;;;;N;;;;; +10ED5;ARABIC LIGATURE QUDDISA SIRRUHUM;So;0;ON;;;;;N;;;;; +10ED6;ARABIC LIGATURE QUDDISA SIRRUHUMAA;So;0;ON;;;;;N;;;;; +10ED7;ARABIC LIGATURE QUDDISAT ASRAARUHUM;So;0;ON;;;;;N;;;;; +10ED8;ARABIC LIGATURE NAWWARA ALLAAHU MARQADAH;So;0;ON;;;;;N;;;;; +10EFA;ARABIC DOUBLE VERTICAL BAR BELOW;Mn;220;NSM;;;;;N;;;;; +10EFB;ARABIC SMALL LOW NOON;Mn;220;NSM;;;;;N;;;;; +10EFC;ARABIC COMBINING ALEF OVERLAY;Mn;0;NSM;;;;;N;;;;; +10EFD;ARABIC SMALL LOW WORD SAKTA;Mn;220;NSM;;;;;N;;;;; +10EFE;ARABIC SMALL LOW WORD QASR;Mn;220;NSM;;;;;N;;;;; +10EFF;ARABIC SMALL LOW WORD MADDA;Mn;220;NSM;;;;;N;;;;; +10F00;OLD SOGDIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10F01;OLD SOGDIAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; +10F02;OLD SOGDIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10F03;OLD SOGDIAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; +10F04;OLD SOGDIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10F05;OLD SOGDIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10F06;OLD SOGDIAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; +10F07;OLD SOGDIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10F08;OLD SOGDIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10F09;OLD SOGDIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10F0A;OLD SOGDIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10F0B;OLD SOGDIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10F0C;OLD SOGDIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10F0D;OLD SOGDIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10F0E;OLD SOGDIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10F0F;OLD SOGDIAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +10F10;OLD SOGDIAN LETTER FINAL NUN WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F11;OLD SOGDIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10F12;OLD SOGDIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10F13;OLD SOGDIAN LETTER ALTERNATE AYIN;Lo;0;R;;;;;N;;;;; +10F14;OLD SOGDIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10F15;OLD SOGDIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10F16;OLD SOGDIAN LETTER FINAL SADHE;Lo;0;R;;;;;N;;;;; +10F17;OLD SOGDIAN LETTER FINAL SADHE WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F18;OLD SOGDIAN LETTER RESH-AYIN-DALETH;Lo;0;R;;;;;N;;;;; +10F19;OLD SOGDIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10F1A;OLD SOGDIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10F1B;OLD SOGDIAN LETTER FINAL TAW;Lo;0;R;;;;;N;;;;; +10F1C;OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F1D;OLD SOGDIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10F1E;OLD SOGDIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10F1F;OLD SOGDIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10F20;OLD SOGDIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10F21;OLD SOGDIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10F22;OLD SOGDIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10F23;OLD SOGDIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10F24;OLD SOGDIAN NUMBER THIRTY;No;0;R;;;;30;N;;;;; +10F25;OLD SOGDIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10F26;OLD SOGDIAN FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +10F27;OLD SOGDIAN LIGATURE AYIN-DALETH;Lo;0;R;;;;;N;;;;; +10F30;SOGDIAN LETTER ALEPH;Lo;0;AL;;;;;N;;;;; +10F31;SOGDIAN LETTER BETH;Lo;0;AL;;;;;N;;;;; +10F32;SOGDIAN LETTER GIMEL;Lo;0;AL;;;;;N;;;;; +10F33;SOGDIAN LETTER HE;Lo;0;AL;;;;;N;;;;; +10F34;SOGDIAN LETTER WAW;Lo;0;AL;;;;;N;;;;; +10F35;SOGDIAN LETTER ZAYIN;Lo;0;AL;;;;;N;;;;; +10F36;SOGDIAN LETTER HETH;Lo;0;AL;;;;;N;;;;; +10F37;SOGDIAN LETTER YODH;Lo;0;AL;;;;;N;;;;; +10F38;SOGDIAN LETTER KAPH;Lo;0;AL;;;;;N;;;;; +10F39;SOGDIAN LETTER LAMEDH;Lo;0;AL;;;;;N;;;;; +10F3A;SOGDIAN LETTER MEM;Lo;0;AL;;;;;N;;;;; +10F3B;SOGDIAN LETTER NUN;Lo;0;AL;;;;;N;;;;; +10F3C;SOGDIAN LETTER SAMEKH;Lo;0;AL;;;;;N;;;;; +10F3D;SOGDIAN LETTER AYIN;Lo;0;AL;;;;;N;;;;; +10F3E;SOGDIAN LETTER PE;Lo;0;AL;;;;;N;;;;; +10F3F;SOGDIAN LETTER SADHE;Lo;0;AL;;;;;N;;;;; +10F40;SOGDIAN LETTER RESH-AYIN;Lo;0;AL;;;;;N;;;;; +10F41;SOGDIAN LETTER SHIN;Lo;0;AL;;;;;N;;;;; +10F42;SOGDIAN LETTER TAW;Lo;0;AL;;;;;N;;;;; +10F43;SOGDIAN LETTER FETH;Lo;0;AL;;;;;N;;;;; +10F44;SOGDIAN LETTER LESH;Lo;0;AL;;;;;N;;;;; +10F45;SOGDIAN INDEPENDENT SHIN;Lo;0;AL;;;;;N;;;;; +10F46;SOGDIAN COMBINING DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10F47;SOGDIAN COMBINING TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +10F48;SOGDIAN COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10F49;SOGDIAN COMBINING TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4A;SOGDIAN COMBINING CURVE ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4B;SOGDIAN COMBINING CURVE BELOW;Mn;220;NSM;;;;;N;;;;; +10F4C;SOGDIAN COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4D;SOGDIAN COMBINING HOOK BELOW;Mn;220;NSM;;;;;N;;;;; +10F4E;SOGDIAN COMBINING LONG HOOK BELOW;Mn;220;NSM;;;;;N;;;;; +10F4F;SOGDIAN COMBINING RESH BELOW;Mn;220;NSM;;;;;N;;;;; +10F50;SOGDIAN COMBINING STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +10F51;SOGDIAN NUMBER ONE;No;0;AL;;;;1;N;;;;; +10F52;SOGDIAN NUMBER TEN;No;0;AL;;;;10;N;;;;; +10F53;SOGDIAN NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +10F54;SOGDIAN NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +10F55;SOGDIAN PUNCTUATION TWO VERTICAL BARS;Po;0;AL;;;;;N;;;;; +10F56;SOGDIAN PUNCTUATION TWO VERTICAL BARS WITH DOTS;Po;0;AL;;;;;N;;;;; +10F57;SOGDIAN PUNCTUATION CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;; +10F58;SOGDIAN PUNCTUATION TWO CIRCLES WITH DOTS;Po;0;AL;;;;;N;;;;; +10F59;SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;; +10F70;OLD UYGHUR LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10F71;OLD UYGHUR LETTER BETH;Lo;0;R;;;;;N;;;;; +10F72;OLD UYGHUR LETTER GIMEL-HETH;Lo;0;R;;;;;N;;;;; +10F73;OLD UYGHUR LETTER WAW;Lo;0;R;;;;;N;;;;; +10F74;OLD UYGHUR LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10F75;OLD UYGHUR LETTER FINAL HETH;Lo;0;R;;;;;N;;;;; +10F76;OLD UYGHUR LETTER YODH;Lo;0;R;;;;;N;;;;; +10F77;OLD UYGHUR LETTER KAPH;Lo;0;R;;;;;N;;;;; +10F78;OLD UYGHUR LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10F79;OLD UYGHUR LETTER MEM;Lo;0;R;;;;;N;;;;; +10F7A;OLD UYGHUR LETTER NUN;Lo;0;R;;;;;N;;;;; +10F7B;OLD UYGHUR LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10F7C;OLD UYGHUR LETTER PE;Lo;0;R;;;;;N;;;;; +10F7D;OLD UYGHUR LETTER SADHE;Lo;0;R;;;;;N;;;;; +10F7E;OLD UYGHUR LETTER RESH;Lo;0;R;;;;;N;;;;; +10F7F;OLD UYGHUR LETTER SHIN;Lo;0;R;;;;;N;;;;; +10F80;OLD UYGHUR LETTER TAW;Lo;0;R;;;;;N;;;;; +10F81;OLD UYGHUR LETTER LESH;Lo;0;R;;;;;N;;;;; +10F82;OLD UYGHUR COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10F83;OLD UYGHUR COMBINING DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10F84;OLD UYGHUR COMBINING TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +10F85;OLD UYGHUR COMBINING TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +10F86;OLD UYGHUR PUNCTUATION BAR;Po;0;R;;;;;N;;;;; +10F87;OLD UYGHUR PUNCTUATION TWO BARS;Po;0;R;;;;;N;;;;; +10F88;OLD UYGHUR PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; +10F89;OLD UYGHUR PUNCTUATION FOUR DOTS;Po;0;R;;;;;N;;;;; +10FB0;CHORASMIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10FB1;CHORASMIAN LETTER SMALL ALEPH;Lo;0;R;;;;;N;;;;; +10FB2;CHORASMIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10FB3;CHORASMIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10FB4;CHORASMIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10FB5;CHORASMIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10FB6;CHORASMIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10FB7;CHORASMIAN LETTER CURLED WAW;Lo;0;R;;;;;N;;;;; +10FB8;CHORASMIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10FB9;CHORASMIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10FBA;CHORASMIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10FBB;CHORASMIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10FBC;CHORASMIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10FBD;CHORASMIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10FBE;CHORASMIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10FBF;CHORASMIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10FC0;CHORASMIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10FC1;CHORASMIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10FC2;CHORASMIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10FC3;CHORASMIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10FC4;CHORASMIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10FC5;CHORASMIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10FC6;CHORASMIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10FC7;CHORASMIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10FC8;CHORASMIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10FC9;CHORASMIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10FCA;CHORASMIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10FCB;CHORASMIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10FE0;ELYMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10FE1;ELYMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; +10FE2;ELYMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10FE3;ELYMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; +10FE4;ELYMAIC LETTER HE;Lo;0;R;;;;;N;;;;; +10FE5;ELYMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; +10FE6;ELYMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10FE7;ELYMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; +10FE8;ELYMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; +10FE9;ELYMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; +10FEA;ELYMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; +10FEB;ELYMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10FEC;ELYMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; +10FED;ELYMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; +10FEE;ELYMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10FEF;ELYMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; +10FF0;ELYMAIC LETTER PE;Lo;0;R;;;;;N;;;;; +10FF1;ELYMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; +10FF2;ELYMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; +10FF3;ELYMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; +10FF4;ELYMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; +10FF5;ELYMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; +10FF6;ELYMAIC LIGATURE ZAYIN-YODH;Lo;0;R;;;;;N;;;;; +11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11003;BRAHMI SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11004;BRAHMI SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11005;BRAHMI LETTER A;Lo;0;L;;;;;N;;;;; +11006;BRAHMI LETTER AA;Lo;0;L;;;;;N;;;;; +11007;BRAHMI LETTER I;Lo;0;L;;;;;N;;;;; +11008;BRAHMI LETTER II;Lo;0;L;;;;;N;;;;; +11009;BRAHMI LETTER U;Lo;0;L;;;;;N;;;;; +1100A;BRAHMI LETTER UU;Lo;0;L;;;;;N;;;;; +1100B;BRAHMI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1100C;BRAHMI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1100D;BRAHMI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1100E;BRAHMI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1100F;BRAHMI LETTER E;Lo;0;L;;;;;N;;;;; +11010;BRAHMI LETTER AI;Lo;0;L;;;;;N;;;;; +11011;BRAHMI LETTER O;Lo;0;L;;;;;N;;;;; +11012;BRAHMI LETTER AU;Lo;0;L;;;;;N;;;;; +11013;BRAHMI LETTER KA;Lo;0;L;;;;;N;;;;; +11014;BRAHMI LETTER KHA;Lo;0;L;;;;;N;;;;; +11015;BRAHMI LETTER GA;Lo;0;L;;;;;N;;;;; +11016;BRAHMI LETTER GHA;Lo;0;L;;;;;N;;;;; +11017;BRAHMI LETTER NGA;Lo;0;L;;;;;N;;;;; +11018;BRAHMI LETTER CA;Lo;0;L;;;;;N;;;;; +11019;BRAHMI LETTER CHA;Lo;0;L;;;;;N;;;;; +1101A;BRAHMI LETTER JA;Lo;0;L;;;;;N;;;;; +1101B;BRAHMI LETTER JHA;Lo;0;L;;;;;N;;;;; +1101C;BRAHMI LETTER NYA;Lo;0;L;;;;;N;;;;; +1101D;BRAHMI LETTER TTA;Lo;0;L;;;;;N;;;;; +1101E;BRAHMI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1101F;BRAHMI LETTER DDA;Lo;0;L;;;;;N;;;;; +11020;BRAHMI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11021;BRAHMI LETTER NNA;Lo;0;L;;;;;N;;;;; +11022;BRAHMI LETTER TA;Lo;0;L;;;;;N;;;;; +11023;BRAHMI LETTER THA;Lo;0;L;;;;;N;;;;; +11024;BRAHMI LETTER DA;Lo;0;L;;;;;N;;;;; +11025;BRAHMI LETTER DHA;Lo;0;L;;;;;N;;;;; +11026;BRAHMI LETTER NA;Lo;0;L;;;;;N;;;;; +11027;BRAHMI LETTER PA;Lo;0;L;;;;;N;;;;; +11028;BRAHMI LETTER PHA;Lo;0;L;;;;;N;;;;; +11029;BRAHMI LETTER BA;Lo;0;L;;;;;N;;;;; +1102A;BRAHMI LETTER BHA;Lo;0;L;;;;;N;;;;; +1102B;BRAHMI LETTER MA;Lo;0;L;;;;;N;;;;; +1102C;BRAHMI LETTER YA;Lo;0;L;;;;;N;;;;; +1102D;BRAHMI LETTER RA;Lo;0;L;;;;;N;;;;; +1102E;BRAHMI LETTER LA;Lo;0;L;;;;;N;;;;; +1102F;BRAHMI LETTER VA;Lo;0;L;;;;;N;;;;; +11030;BRAHMI LETTER SHA;Lo;0;L;;;;;N;;;;; +11031;BRAHMI LETTER SSA;Lo;0;L;;;;;N;;;;; +11032;BRAHMI LETTER SA;Lo;0;L;;;;;N;;;;; +11033;BRAHMI LETTER HA;Lo;0;L;;;;;N;;;;; +11034;BRAHMI LETTER LLA;Lo;0;L;;;;;N;;;;; +11035;BRAHMI LETTER OLD TAMIL LLLA;Lo;0;L;;;;;N;;;;; +11036;BRAHMI LETTER OLD TAMIL RRA;Lo;0;L;;;;;N;;;;; +11037;BRAHMI LETTER OLD TAMIL NNNA;Lo;0;L;;;;;N;;;;; +11038;BRAHMI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11039;BRAHMI VOWEL SIGN BHATTIPROLU AA;Mn;0;NSM;;;;;N;;;;; +1103A;BRAHMI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1103B;BRAHMI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1103C;BRAHMI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1103D;BRAHMI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1103E;BRAHMI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +1103F;BRAHMI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11040;BRAHMI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11041;BRAHMI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11042;BRAHMI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11043;BRAHMI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11044;BRAHMI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11045;BRAHMI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11046;BRAHMI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11047;BRAHMI DANDA;Po;0;L;;;;;N;;;;; +11048;BRAHMI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11049;BRAHMI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; +1104A;BRAHMI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; +1104B;BRAHMI PUNCTUATION LINE;Po;0;L;;;;;N;;;;; +1104C;BRAHMI PUNCTUATION CRESCENT BAR;Po;0;L;;;;;N;;;;; +1104D;BRAHMI PUNCTUATION LOTUS;Po;0;L;;;;;N;;;;; +11052;BRAHMI NUMBER ONE;No;0;ON;;;1;1;N;;;;; +11053;BRAHMI NUMBER TWO;No;0;ON;;;2;2;N;;;;; +11054;BRAHMI NUMBER THREE;No;0;ON;;;3;3;N;;;;; +11055;BRAHMI NUMBER FOUR;No;0;ON;;;4;4;N;;;;; +11056;BRAHMI NUMBER FIVE;No;0;ON;;;5;5;N;;;;; +11057;BRAHMI NUMBER SIX;No;0;ON;;;6;6;N;;;;; +11058;BRAHMI NUMBER SEVEN;No;0;ON;;;7;7;N;;;;; +11059;BRAHMI NUMBER EIGHT;No;0;ON;;;8;8;N;;;;; +1105A;BRAHMI NUMBER NINE;No;0;ON;;;9;9;N;;;;; +1105B;BRAHMI NUMBER TEN;No;0;ON;;;;10;N;;;;; +1105C;BRAHMI NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +1105D;BRAHMI NUMBER THIRTY;No;0;ON;;;;30;N;;;;; +1105E;BRAHMI NUMBER FORTY;No;0;ON;;;;40;N;;;;; +1105F;BRAHMI NUMBER FIFTY;No;0;ON;;;;50;N;;;;; +11060;BRAHMI NUMBER SIXTY;No;0;ON;;;;60;N;;;;; +11061;BRAHMI NUMBER SEVENTY;No;0;ON;;;;70;N;;;;; +11062;BRAHMI NUMBER EIGHTY;No;0;ON;;;;80;N;;;;; +11063;BRAHMI NUMBER NINETY;No;0;ON;;;;90;N;;;;; +11064;BRAHMI NUMBER ONE HUNDRED;No;0;ON;;;;100;N;;;;; +11065;BRAHMI NUMBER ONE THOUSAND;No;0;ON;;;;1000;N;;;;; +11066;BRAHMI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11067;BRAHMI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11068;BRAHMI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11069;BRAHMI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1106A;BRAHMI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1106B;BRAHMI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1106C;BRAHMI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11070;BRAHMI SIGN OLD TAMIL VIRAMA;Mn;9;NSM;;;;;N;;;;; +11071;BRAHMI LETTER OLD TAMIL SHORT E;Lo;0;L;;;;;N;;;;; +11072;BRAHMI LETTER OLD TAMIL SHORT O;Lo;0;L;;;;;N;;;;; +11073;BRAHMI VOWEL SIGN OLD TAMIL SHORT E;Mn;0;NSM;;;;;N;;;;; +11074;BRAHMI VOWEL SIGN OLD TAMIL SHORT O;Mn;0;NSM;;;;;N;;;;; +11075;BRAHMI LETTER OLD TAMIL LLA;Lo;0;L;;;;;N;;;;; +1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;; +11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;; +11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;; +11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;; +11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;; +11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;; +11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;; +11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;; +1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;; +1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;; +1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;; +1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;; +1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;; +1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;; +11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;; +11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;; +11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;; +11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;; +11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;; +11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;; +11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;; +11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;; +11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;; +1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;; +1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;; +1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;; +1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;; +1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;; +110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;; +110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;; +110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;; +110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;; +110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;; +110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;; +110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;; +110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;; +110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;; +110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;; +110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;; +110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;; +110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;; +110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;; +110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;; +110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;; +110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;; +110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;; +110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;; +110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;; +110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +110C2;KAITHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +110CD;KAITHI NUMBER SIGN ABOVE;Cf;0;L;;;;;N;;;;; +110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;; +110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;; +110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;; +110D3;SORA SOMPENG LETTER CAH;Lo;0;L;;;;;N;;;;; +110D4;SORA SOMPENG LETTER DAH;Lo;0;L;;;;;N;;;;; +110D5;SORA SOMPENG LETTER GAH;Lo;0;L;;;;;N;;;;; +110D6;SORA SOMPENG LETTER MAH;Lo;0;L;;;;;N;;;;; +110D7;SORA SOMPENG LETTER NGAH;Lo;0;L;;;;;N;;;;; +110D8;SORA SOMPENG LETTER LAH;Lo;0;L;;;;;N;;;;; +110D9;SORA SOMPENG LETTER NAH;Lo;0;L;;;;;N;;;;; +110DA;SORA SOMPENG LETTER VAH;Lo;0;L;;;;;N;;;;; +110DB;SORA SOMPENG LETTER PAH;Lo;0;L;;;;;N;;;;; +110DC;SORA SOMPENG LETTER YAH;Lo;0;L;;;;;N;;;;; +110DD;SORA SOMPENG LETTER RAH;Lo;0;L;;;;;N;;;;; +110DE;SORA SOMPENG LETTER HAH;Lo;0;L;;;;;N;;;;; +110DF;SORA SOMPENG LETTER KAH;Lo;0;L;;;;;N;;;;; +110E0;SORA SOMPENG LETTER JAH;Lo;0;L;;;;;N;;;;; +110E1;SORA SOMPENG LETTER NYAH;Lo;0;L;;;;;N;;;;; +110E2;SORA SOMPENG LETTER AH;Lo;0;L;;;;;N;;;;; +110E3;SORA SOMPENG LETTER EEH;Lo;0;L;;;;;N;;;;; +110E4;SORA SOMPENG LETTER IH;Lo;0;L;;;;;N;;;;; +110E5;SORA SOMPENG LETTER UH;Lo;0;L;;;;;N;;;;; +110E6;SORA SOMPENG LETTER OH;Lo;0;L;;;;;N;;;;; +110E7;SORA SOMPENG LETTER EH;Lo;0;L;;;;;N;;;;; +110E8;SORA SOMPENG LETTER MAE;Lo;0;L;;;;;N;;;;; +110F0;SORA SOMPENG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +110F1;SORA SOMPENG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +110F2;SORA SOMPENG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +110F3;SORA SOMPENG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +110F4;SORA SOMPENG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +110F5;SORA SOMPENG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +110F6;SORA SOMPENG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +110F7;SORA SOMPENG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +110F8;SORA SOMPENG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +110F9;SORA SOMPENG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11100;CHAKMA SIGN CANDRABINDU;Mn;230;NSM;;;;;N;;;;; +11101;CHAKMA SIGN ANUSVARA;Mn;230;NSM;;;;;N;;;;; +11102;CHAKMA SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +11103;CHAKMA LETTER AA;Lo;0;L;;;;;N;;;;; +11104;CHAKMA LETTER I;Lo;0;L;;;;;N;;;;; +11105;CHAKMA LETTER U;Lo;0;L;;;;;N;;;;; +11106;CHAKMA LETTER E;Lo;0;L;;;;;N;;;;; +11107;CHAKMA LETTER KAA;Lo;0;L;;;;;N;;;;; +11108;CHAKMA LETTER KHAA;Lo;0;L;;;;;N;;;;; +11109;CHAKMA LETTER GAA;Lo;0;L;;;;;N;;;;; +1110A;CHAKMA LETTER GHAA;Lo;0;L;;;;;N;;;;; +1110B;CHAKMA LETTER NGAA;Lo;0;L;;;;;N;;;;; +1110C;CHAKMA LETTER CAA;Lo;0;L;;;;;N;;;;; +1110D;CHAKMA LETTER CHAA;Lo;0;L;;;;;N;;;;; +1110E;CHAKMA LETTER JAA;Lo;0;L;;;;;N;;;;; +1110F;CHAKMA LETTER JHAA;Lo;0;L;;;;;N;;;;; +11110;CHAKMA LETTER NYAA;Lo;0;L;;;;;N;;;;; +11111;CHAKMA LETTER TTAA;Lo;0;L;;;;;N;;;;; +11112;CHAKMA LETTER TTHAA;Lo;0;L;;;;;N;;;;; +11113;CHAKMA LETTER DDAA;Lo;0;L;;;;;N;;;;; +11114;CHAKMA LETTER DDHAA;Lo;0;L;;;;;N;;;;; +11115;CHAKMA LETTER NNAA;Lo;0;L;;;;;N;;;;; +11116;CHAKMA LETTER TAA;Lo;0;L;;;;;N;;;;; +11117;CHAKMA LETTER THAA;Lo;0;L;;;;;N;;;;; +11118;CHAKMA LETTER DAA;Lo;0;L;;;;;N;;;;; +11119;CHAKMA LETTER DHAA;Lo;0;L;;;;;N;;;;; +1111A;CHAKMA LETTER NAA;Lo;0;L;;;;;N;;;;; +1111B;CHAKMA LETTER PAA;Lo;0;L;;;;;N;;;;; +1111C;CHAKMA LETTER PHAA;Lo;0;L;;;;;N;;;;; +1111D;CHAKMA LETTER BAA;Lo;0;L;;;;;N;;;;; +1111E;CHAKMA LETTER BHAA;Lo;0;L;;;;;N;;;;; +1111F;CHAKMA LETTER MAA;Lo;0;L;;;;;N;;;;; +11120;CHAKMA LETTER YYAA;Lo;0;L;;;;;N;;;;; +11121;CHAKMA LETTER YAA;Lo;0;L;;;;;N;;;;; +11122;CHAKMA LETTER RAA;Lo;0;L;;;;;N;;;;; +11123;CHAKMA LETTER LAA;Lo;0;L;;;;;N;;;;; +11124;CHAKMA LETTER WAA;Lo;0;L;;;;;N;;;;; +11125;CHAKMA LETTER SAA;Lo;0;L;;;;;N;;;;; +11126;CHAKMA LETTER HAA;Lo;0;L;;;;;N;;;;; +11127;CHAKMA VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +11128;CHAKMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11129;CHAKMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1112A;CHAKMA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1112B;CHAKMA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1112C;CHAKMA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1112D;CHAKMA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1112E;CHAKMA VOWEL SIGN O;Mn;0;NSM;11131 11127;;;;N;;;;; +1112F;CHAKMA VOWEL SIGN AU;Mn;0;NSM;11132 11127;;;;N;;;;; +11130;CHAKMA VOWEL SIGN OI;Mn;0;NSM;;;;;N;;;;; +11131;CHAKMA O MARK;Mn;0;NSM;;;;;N;;;;; +11132;CHAKMA AU MARK;Mn;0;NSM;;;;;N;;;;; +11133;CHAKMA VIRAMA;Mn;9;NSM;;;;;N;;;;; +11134;CHAKMA MAAYYAA;Mn;9;NSM;;;;;N;;;;; +11136;CHAKMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11137;CHAKMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11138;CHAKMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11139;CHAKMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1113A;CHAKMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1113B;CHAKMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1113C;CHAKMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1113D;CHAKMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1113E;CHAKMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1113F;CHAKMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11140;CHAKMA SECTION MARK;Po;0;L;;;;;N;;;;; +11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;; +11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11143;CHAKMA QUESTION MARK;Po;0;L;;;;;N;;;;; +11144;CHAKMA LETTER LHAA;Lo;0;L;;;;;N;;;;; +11145;CHAKMA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11146;CHAKMA VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; +11147;CHAKMA LETTER VAA;Lo;0;L;;;;;N;;;;; +11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;; +11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;; +11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;; +11153;MAHAJANI LETTER E;Lo;0;L;;;;;N;;;;; +11154;MAHAJANI LETTER O;Lo;0;L;;;;;N;;;;; +11155;MAHAJANI LETTER KA;Lo;0;L;;;;;N;;;;; +11156;MAHAJANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11157;MAHAJANI LETTER GA;Lo;0;L;;;;;N;;;;; +11158;MAHAJANI LETTER GHA;Lo;0;L;;;;;N;;;;; +11159;MAHAJANI LETTER CA;Lo;0;L;;;;;N;;;;; +1115A;MAHAJANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1115B;MAHAJANI LETTER JA;Lo;0;L;;;;;N;;;;; +1115C;MAHAJANI LETTER JHA;Lo;0;L;;;;;N;;;;; +1115D;MAHAJANI LETTER NYA;Lo;0;L;;;;;N;;;;; +1115E;MAHAJANI LETTER TTA;Lo;0;L;;;;;N;;;;; +1115F;MAHAJANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11160;MAHAJANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11161;MAHAJANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11162;MAHAJANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11163;MAHAJANI LETTER TA;Lo;0;L;;;;;N;;;;; +11164;MAHAJANI LETTER THA;Lo;0;L;;;;;N;;;;; +11165;MAHAJANI LETTER DA;Lo;0;L;;;;;N;;;;; +11166;MAHAJANI LETTER DHA;Lo;0;L;;;;;N;;;;; +11167;MAHAJANI LETTER NA;Lo;0;L;;;;;N;;;;; +11168;MAHAJANI LETTER PA;Lo;0;L;;;;;N;;;;; +11169;MAHAJANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1116A;MAHAJANI LETTER BA;Lo;0;L;;;;;N;;;;; +1116B;MAHAJANI LETTER BHA;Lo;0;L;;;;;N;;;;; +1116C;MAHAJANI LETTER MA;Lo;0;L;;;;;N;;;;; +1116D;MAHAJANI LETTER RA;Lo;0;L;;;;;N;;;;; +1116E;MAHAJANI LETTER LA;Lo;0;L;;;;;N;;;;; +1116F;MAHAJANI LETTER VA;Lo;0;L;;;;;N;;;;; +11170;MAHAJANI LETTER SA;Lo;0;L;;;;;N;;;;; +11171;MAHAJANI LETTER HA;Lo;0;L;;;;;N;;;;; +11172;MAHAJANI LETTER RRA;Lo;0;L;;;;;N;;;;; +11173;MAHAJANI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11174;MAHAJANI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11175;MAHAJANI SECTION MARK;Po;0;L;;;;;N;;;;; +11176;MAHAJANI LIGATURE SHRI;Lo;0;L;;;;;N;;;;; +11180;SHARADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11181;SHARADA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11182;SHARADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11183;SHARADA LETTER A;Lo;0;L;;;;;N;;;;; +11184;SHARADA LETTER AA;Lo;0;L;;;;;N;;;;; +11185;SHARADA LETTER I;Lo;0;L;;;;;N;;;;; +11186;SHARADA LETTER II;Lo;0;L;;;;;N;;;;; +11187;SHARADA LETTER U;Lo;0;L;;;;;N;;;;; +11188;SHARADA LETTER UU;Lo;0;L;;;;;N;;;;; +11189;SHARADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1118A;SHARADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1118B;SHARADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1118C;SHARADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1118D;SHARADA LETTER E;Lo;0;L;;;;;N;;;;; +1118E;SHARADA LETTER AI;Lo;0;L;;;;;N;;;;; +1118F;SHARADA LETTER O;Lo;0;L;;;;;N;;;;; +11190;SHARADA LETTER AU;Lo;0;L;;;;;N;;;;; +11191;SHARADA LETTER KA;Lo;0;L;;;;;N;;;;; +11192;SHARADA LETTER KHA;Lo;0;L;;;;;N;;;;; +11193;SHARADA LETTER GA;Lo;0;L;;;;;N;;;;; +11194;SHARADA LETTER GHA;Lo;0;L;;;;;N;;;;; +11195;SHARADA LETTER NGA;Lo;0;L;;;;;N;;;;; +11196;SHARADA LETTER CA;Lo;0;L;;;;;N;;;;; +11197;SHARADA LETTER CHA;Lo;0;L;;;;;N;;;;; +11198;SHARADA LETTER JA;Lo;0;L;;;;;N;;;;; +11199;SHARADA LETTER JHA;Lo;0;L;;;;;N;;;;; +1119A;SHARADA LETTER NYA;Lo;0;L;;;;;N;;;;; +1119B;SHARADA LETTER TTA;Lo;0;L;;;;;N;;;;; +1119C;SHARADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1119D;SHARADA LETTER DDA;Lo;0;L;;;;;N;;;;; +1119E;SHARADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1119F;SHARADA LETTER NNA;Lo;0;L;;;;;N;;;;; +111A0;SHARADA LETTER TA;Lo;0;L;;;;;N;;;;; +111A1;SHARADA LETTER THA;Lo;0;L;;;;;N;;;;; +111A2;SHARADA LETTER DA;Lo;0;L;;;;;N;;;;; +111A3;SHARADA LETTER DHA;Lo;0;L;;;;;N;;;;; +111A4;SHARADA LETTER NA;Lo;0;L;;;;;N;;;;; +111A5;SHARADA LETTER PA;Lo;0;L;;;;;N;;;;; +111A6;SHARADA LETTER PHA;Lo;0;L;;;;;N;;;;; +111A7;SHARADA LETTER BA;Lo;0;L;;;;;N;;;;; +111A8;SHARADA LETTER BHA;Lo;0;L;;;;;N;;;;; +111A9;SHARADA LETTER MA;Lo;0;L;;;;;N;;;;; +111AA;SHARADA LETTER YA;Lo;0;L;;;;;N;;;;; +111AB;SHARADA LETTER RA;Lo;0;L;;;;;N;;;;; +111AC;SHARADA LETTER LA;Lo;0;L;;;;;N;;;;; +111AD;SHARADA LETTER LLA;Lo;0;L;;;;;N;;;;; +111AE;SHARADA LETTER VA;Lo;0;L;;;;;N;;;;; +111AF;SHARADA LETTER SHA;Lo;0;L;;;;;N;;;;; +111B0;SHARADA LETTER SSA;Lo;0;L;;;;;N;;;;; +111B1;SHARADA LETTER SA;Lo;0;L;;;;;N;;;;; +111B2;SHARADA LETTER HA;Lo;0;L;;;;;N;;;;; +111B3;SHARADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +111B4;SHARADA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +111B5;SHARADA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +111B6;SHARADA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +111B7;SHARADA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +111B8;SHARADA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +111B9;SHARADA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +111BA;SHARADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +111BB;SHARADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +111BC;SHARADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +111BD;SHARADA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +111BE;SHARADA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +111BF;SHARADA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +111C0;SHARADA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +111C1;SHARADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +111C2;SHARADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +111C3;SHARADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +111C4;SHARADA OM;Lo;0;L;;;;;N;;;;; +111C5;SHARADA DANDA;Po;0;L;;;;;N;;;;; +111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; +111C9;SHARADA SANDHI MARK;Mn;0;NSM;;;;;N;;;;; +111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;; +111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;; +111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;; +111CE;SHARADA VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +111CF;SHARADA SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +111D2;SHARADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +111D3;SHARADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +111D4;SHARADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +111D5;SHARADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +111D6;SHARADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +111D7;SHARADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; +111DB;SHARADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +111DC;SHARADA HEADSTROKE;Lo;0;L;;;;;N;;;;; +111DD;SHARADA CONTINUATION SIGN;Po;0;L;;;;;N;;;;; +111DE;SHARADA SECTION MARK-1;Po;0;L;;;;;N;;;;; +111DF;SHARADA SECTION MARK-2;Po;0;L;;;;;N;;;;; +111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; +111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; +111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; +111E4;SINHALA ARCHAIC DIGIT FOUR;No;0;L;;;;4;N;;;;; +111E5;SINHALA ARCHAIC DIGIT FIVE;No;0;L;;;;5;N;;;;; +111E6;SINHALA ARCHAIC DIGIT SIX;No;0;L;;;;6;N;;;;; +111E7;SINHALA ARCHAIC DIGIT SEVEN;No;0;L;;;;7;N;;;;; +111E8;SINHALA ARCHAIC DIGIT EIGHT;No;0;L;;;;8;N;;;;; +111E9;SINHALA ARCHAIC DIGIT NINE;No;0;L;;;;9;N;;;;; +111EA;SINHALA ARCHAIC NUMBER TEN;No;0;L;;;;10;N;;;;; +111EB;SINHALA ARCHAIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +111EC;SINHALA ARCHAIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +111ED;SINHALA ARCHAIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +111EE;SINHALA ARCHAIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +111EF;SINHALA ARCHAIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +111F0;SINHALA ARCHAIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +111F1;SINHALA ARCHAIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +111F2;SINHALA ARCHAIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +111F3;SINHALA ARCHAIC NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +111F4;SINHALA ARCHAIC NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +11200;KHOJKI LETTER A;Lo;0;L;;;;;N;;;;; +11201;KHOJKI LETTER AA;Lo;0;L;;;;;N;;;;; +11202;KHOJKI LETTER I;Lo;0;L;;;;;N;;;;; +11203;KHOJKI LETTER U;Lo;0;L;;;;;N;;;;; +11204;KHOJKI LETTER E;Lo;0;L;;;;;N;;;;; +11205;KHOJKI LETTER AI;Lo;0;L;;;;;N;;;;; +11206;KHOJKI LETTER O;Lo;0;L;;;;;N;;;;; +11207;KHOJKI LETTER AU;Lo;0;L;;;;;N;;;;; +11208;KHOJKI LETTER KA;Lo;0;L;;;;;N;;;;; +11209;KHOJKI LETTER KHA;Lo;0;L;;;;;N;;;;; +1120A;KHOJKI LETTER GA;Lo;0;L;;;;;N;;;;; +1120B;KHOJKI LETTER GGA;Lo;0;L;;;;;N;;;;; +1120C;KHOJKI LETTER GHA;Lo;0;L;;;;;N;;;;; +1120D;KHOJKI LETTER NGA;Lo;0;L;;;;;N;;;;; +1120E;KHOJKI LETTER CA;Lo;0;L;;;;;N;;;;; +1120F;KHOJKI LETTER CHA;Lo;0;L;;;;;N;;;;; +11210;KHOJKI LETTER JA;Lo;0;L;;;;;N;;;;; +11211;KHOJKI LETTER JJA;Lo;0;L;;;;;N;;;;; +11213;KHOJKI LETTER NYA;Lo;0;L;;;;;N;;;;; +11214;KHOJKI LETTER TTA;Lo;0;L;;;;;N;;;;; +11215;KHOJKI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11216;KHOJKI LETTER DDA;Lo;0;L;;;;;N;;;;; +11217;KHOJKI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11218;KHOJKI LETTER NNA;Lo;0;L;;;;;N;;;;; +11219;KHOJKI LETTER TA;Lo;0;L;;;;;N;;;;; +1121A;KHOJKI LETTER THA;Lo;0;L;;;;;N;;;;; +1121B;KHOJKI LETTER DA;Lo;0;L;;;;;N;;;;; +1121C;KHOJKI LETTER DDDA;Lo;0;L;;;;;N;;;;; +1121D;KHOJKI LETTER DHA;Lo;0;L;;;;;N;;;;; +1121E;KHOJKI LETTER NA;Lo;0;L;;;;;N;;;;; +1121F;KHOJKI LETTER PA;Lo;0;L;;;;;N;;;;; +11220;KHOJKI LETTER PHA;Lo;0;L;;;;;N;;;;; +11221;KHOJKI LETTER BA;Lo;0;L;;;;;N;;;;; +11222;KHOJKI LETTER BBA;Lo;0;L;;;;;N;;;;; +11223;KHOJKI LETTER BHA;Lo;0;L;;;;;N;;;;; +11224;KHOJKI LETTER MA;Lo;0;L;;;;;N;;;;; +11225;KHOJKI LETTER YA;Lo;0;L;;;;;N;;;;; +11226;KHOJKI LETTER RA;Lo;0;L;;;;;N;;;;; +11227;KHOJKI LETTER LA;Lo;0;L;;;;;N;;;;; +11228;KHOJKI LETTER VA;Lo;0;L;;;;;N;;;;; +11229;KHOJKI LETTER SA;Lo;0;L;;;;;N;;;;; +1122A;KHOJKI LETTER HA;Lo;0;L;;;;;N;;;;; +1122B;KHOJKI LETTER LLA;Lo;0;L;;;;;N;;;;; +1122C;KHOJKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1122D;KHOJKI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1122E;KHOJKI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +1122F;KHOJKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11230;KHOJKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11231;KHOJKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11232;KHOJKI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11233;KHOJKI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11234;KHOJKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11235;KHOJKI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11236;KHOJKI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11237;KHOJKI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +11238;KHOJKI DANDA;Po;0;L;;;;;N;;;;; +11239;KHOJKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +1123A;KHOJKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; +1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; +1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +1123E;KHOJKI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;; +1123F;KHOJKI LETTER QA;Lo;0;L;;;;;N;;;;; +11240;KHOJKI LETTER SHORT I;Lo;0;L;;;;;N;;;;; +11241;KHOJKI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;; +11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;; +11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;; +11283;MULTANI LETTER E;Lo;0;L;;;;;N;;;;; +11284;MULTANI LETTER KA;Lo;0;L;;;;;N;;;;; +11285;MULTANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11286;MULTANI LETTER GA;Lo;0;L;;;;;N;;;;; +11288;MULTANI LETTER GHA;Lo;0;L;;;;;N;;;;; +1128A;MULTANI LETTER CA;Lo;0;L;;;;;N;;;;; +1128B;MULTANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1128C;MULTANI LETTER JA;Lo;0;L;;;;;N;;;;; +1128D;MULTANI LETTER JJA;Lo;0;L;;;;;N;;;;; +1128F;MULTANI LETTER NYA;Lo;0;L;;;;;N;;;;; +11290;MULTANI LETTER TTA;Lo;0;L;;;;;N;;;;; +11291;MULTANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11292;MULTANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11293;MULTANI LETTER DDDA;Lo;0;L;;;;;N;;;;; +11294;MULTANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11295;MULTANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11296;MULTANI LETTER TA;Lo;0;L;;;;;N;;;;; +11297;MULTANI LETTER THA;Lo;0;L;;;;;N;;;;; +11298;MULTANI LETTER DA;Lo;0;L;;;;;N;;;;; +11299;MULTANI LETTER DHA;Lo;0;L;;;;;N;;;;; +1129A;MULTANI LETTER NA;Lo;0;L;;;;;N;;;;; +1129B;MULTANI LETTER PA;Lo;0;L;;;;;N;;;;; +1129C;MULTANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1129D;MULTANI LETTER BA;Lo;0;L;;;;;N;;;;; +1129F;MULTANI LETTER BHA;Lo;0;L;;;;;N;;;;; +112A0;MULTANI LETTER MA;Lo;0;L;;;;;N;;;;; +112A1;MULTANI LETTER YA;Lo;0;L;;;;;N;;;;; +112A2;MULTANI LETTER RA;Lo;0;L;;;;;N;;;;; +112A3;MULTANI LETTER LA;Lo;0;L;;;;;N;;;;; +112A4;MULTANI LETTER VA;Lo;0;L;;;;;N;;;;; +112A5;MULTANI LETTER SA;Lo;0;L;;;;;N;;;;; +112A6;MULTANI LETTER HA;Lo;0;L;;;;;N;;;;; +112A7;MULTANI LETTER RRA;Lo;0;L;;;;;N;;;;; +112A8;MULTANI LETTER RHA;Lo;0;L;;;;;N;;;;; +112A9;MULTANI SECTION MARK;Po;0;L;;;;;N;;;;; +112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; +112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; +112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; +112B3;KHUDAWADI LETTER II;Lo;0;L;;;;;N;;;;; +112B4;KHUDAWADI LETTER U;Lo;0;L;;;;;N;;;;; +112B5;KHUDAWADI LETTER UU;Lo;0;L;;;;;N;;;;; +112B6;KHUDAWADI LETTER E;Lo;0;L;;;;;N;;;;; +112B7;KHUDAWADI LETTER AI;Lo;0;L;;;;;N;;;;; +112B8;KHUDAWADI LETTER O;Lo;0;L;;;;;N;;;;; +112B9;KHUDAWADI LETTER AU;Lo;0;L;;;;;N;;;;; +112BA;KHUDAWADI LETTER KA;Lo;0;L;;;;;N;;;;; +112BB;KHUDAWADI LETTER KHA;Lo;0;L;;;;;N;;;;; +112BC;KHUDAWADI LETTER GA;Lo;0;L;;;;;N;;;;; +112BD;KHUDAWADI LETTER GGA;Lo;0;L;;;;;N;;;;; +112BE;KHUDAWADI LETTER GHA;Lo;0;L;;;;;N;;;;; +112BF;KHUDAWADI LETTER NGA;Lo;0;L;;;;;N;;;;; +112C0;KHUDAWADI LETTER CA;Lo;0;L;;;;;N;;;;; +112C1;KHUDAWADI LETTER CHA;Lo;0;L;;;;;N;;;;; +112C2;KHUDAWADI LETTER JA;Lo;0;L;;;;;N;;;;; +112C3;KHUDAWADI LETTER JJA;Lo;0;L;;;;;N;;;;; +112C4;KHUDAWADI LETTER JHA;Lo;0;L;;;;;N;;;;; +112C5;KHUDAWADI LETTER NYA;Lo;0;L;;;;;N;;;;; +112C6;KHUDAWADI LETTER TTA;Lo;0;L;;;;;N;;;;; +112C7;KHUDAWADI LETTER TTHA;Lo;0;L;;;;;N;;;;; +112C8;KHUDAWADI LETTER DDA;Lo;0;L;;;;;N;;;;; +112C9;KHUDAWADI LETTER DDDA;Lo;0;L;;;;;N;;;;; +112CA;KHUDAWADI LETTER RRA;Lo;0;L;;;;;N;;;;; +112CB;KHUDAWADI LETTER DDHA;Lo;0;L;;;;;N;;;;; +112CC;KHUDAWADI LETTER NNA;Lo;0;L;;;;;N;;;;; +112CD;KHUDAWADI LETTER TA;Lo;0;L;;;;;N;;;;; +112CE;KHUDAWADI LETTER THA;Lo;0;L;;;;;N;;;;; +112CF;KHUDAWADI LETTER DA;Lo;0;L;;;;;N;;;;; +112D0;KHUDAWADI LETTER DHA;Lo;0;L;;;;;N;;;;; +112D1;KHUDAWADI LETTER NA;Lo;0;L;;;;;N;;;;; +112D2;KHUDAWADI LETTER PA;Lo;0;L;;;;;N;;;;; +112D3;KHUDAWADI LETTER PHA;Lo;0;L;;;;;N;;;;; +112D4;KHUDAWADI LETTER BA;Lo;0;L;;;;;N;;;;; +112D5;KHUDAWADI LETTER BBA;Lo;0;L;;;;;N;;;;; +112D6;KHUDAWADI LETTER BHA;Lo;0;L;;;;;N;;;;; +112D7;KHUDAWADI LETTER MA;Lo;0;L;;;;;N;;;;; +112D8;KHUDAWADI LETTER YA;Lo;0;L;;;;;N;;;;; +112D9;KHUDAWADI LETTER RA;Lo;0;L;;;;;N;;;;; +112DA;KHUDAWADI LETTER LA;Lo;0;L;;;;;N;;;;; +112DB;KHUDAWADI LETTER VA;Lo;0;L;;;;;N;;;;; +112DC;KHUDAWADI LETTER SHA;Lo;0;L;;;;;N;;;;; +112DD;KHUDAWADI LETTER SA;Lo;0;L;;;;;N;;;;; +112DE;KHUDAWADI LETTER HA;Lo;0;L;;;;;N;;;;; +112DF;KHUDAWADI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +112E0;KHUDAWADI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +112E1;KHUDAWADI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +112E2;KHUDAWADI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +112E3;KHUDAWADI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +112E4;KHUDAWADI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +112E5;KHUDAWADI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +112E6;KHUDAWADI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +112E7;KHUDAWADI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +112E8;KHUDAWADI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +112E9;KHUDAWADI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +112EA;KHUDAWADI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +112F0;KHUDAWADI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +112F1;KHUDAWADI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +112F2;KHUDAWADI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +112F3;KHUDAWADI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +112F4;KHUDAWADI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +112F5;KHUDAWADI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +112F6;KHUDAWADI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11300;GRANTHA SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11305;GRANTHA LETTER A;Lo;0;L;;;;;N;;;;; +11306;GRANTHA LETTER AA;Lo;0;L;;;;;N;;;;; +11307;GRANTHA LETTER I;Lo;0;L;;;;;N;;;;; +11308;GRANTHA LETTER II;Lo;0;L;;;;;N;;;;; +11309;GRANTHA LETTER U;Lo;0;L;;;;;N;;;;; +1130A;GRANTHA LETTER UU;Lo;0;L;;;;;N;;;;; +1130B;GRANTHA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1130C;GRANTHA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1130F;GRANTHA LETTER EE;Lo;0;L;;;;;N;;;;; +11310;GRANTHA LETTER AI;Lo;0;L;;;;;N;;;;; +11313;GRANTHA LETTER OO;Lo;0;L;;;;;N;;;;; +11314;GRANTHA LETTER AU;Lo;0;L;;;;;N;;;;; +11315;GRANTHA LETTER KA;Lo;0;L;;;;;N;;;;; +11316;GRANTHA LETTER KHA;Lo;0;L;;;;;N;;;;; +11317;GRANTHA LETTER GA;Lo;0;L;;;;;N;;;;; +11318;GRANTHA LETTER GHA;Lo;0;L;;;;;N;;;;; +11319;GRANTHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1131A;GRANTHA LETTER CA;Lo;0;L;;;;;N;;;;; +1131B;GRANTHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1131C;GRANTHA LETTER JA;Lo;0;L;;;;;N;;;;; +1131D;GRANTHA LETTER JHA;Lo;0;L;;;;;N;;;;; +1131E;GRANTHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1131F;GRANTHA LETTER TTA;Lo;0;L;;;;;N;;;;; +11320;GRANTHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +11321;GRANTHA LETTER DDA;Lo;0;L;;;;;N;;;;; +11322;GRANTHA LETTER DDHA;Lo;0;L;;;;;N;;;;; +11323;GRANTHA LETTER NNA;Lo;0;L;;;;;N;;;;; +11324;GRANTHA LETTER TA;Lo;0;L;;;;;N;;;;; +11325;GRANTHA LETTER THA;Lo;0;L;;;;;N;;;;; +11326;GRANTHA LETTER DA;Lo;0;L;;;;;N;;;;; +11327;GRANTHA LETTER DHA;Lo;0;L;;;;;N;;;;; +11328;GRANTHA LETTER NA;Lo;0;L;;;;;N;;;;; +1132A;GRANTHA LETTER PA;Lo;0;L;;;;;N;;;;; +1132B;GRANTHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1132C;GRANTHA LETTER BA;Lo;0;L;;;;;N;;;;; +1132D;GRANTHA LETTER BHA;Lo;0;L;;;;;N;;;;; +1132E;GRANTHA LETTER MA;Lo;0;L;;;;;N;;;;; +1132F;GRANTHA LETTER YA;Lo;0;L;;;;;N;;;;; +11330;GRANTHA LETTER RA;Lo;0;L;;;;;N;;;;; +11332;GRANTHA LETTER LA;Lo;0;L;;;;;N;;;;; +11333;GRANTHA LETTER LLA;Lo;0;L;;;;;N;;;;; +11335;GRANTHA LETTER VA;Lo;0;L;;;;;N;;;;; +11336;GRANTHA LETTER SHA;Lo;0;L;;;;;N;;;;; +11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;; +11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;; +11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;; +1133B;COMBINING BINDU BELOW;Mn;7;NSM;;;;;N;;;;; +1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1133F;GRANTHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11340;GRANTHA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11341;GRANTHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11342;GRANTHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11343;GRANTHA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +11344;GRANTHA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +11347;GRANTHA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +11348;GRANTHA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; +1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; +1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11350;GRANTHA OM;Lo;0;L;;;;;N;;;;; +11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; +1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +1135F;GRANTHA LETTER VEDIC DOUBLE ANUSVARA;Lo;0;L;;;;;N;;;;; +11360;GRANTHA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11361;GRANTHA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +11362;GRANTHA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +11363;GRANTHA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +11366;COMBINING GRANTHA DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +11367;COMBINING GRANTHA DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +11368;COMBINING GRANTHA DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +11369;COMBINING GRANTHA DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +1136A;COMBINING GRANTHA DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +1136B;COMBINING GRANTHA DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +1136C;COMBINING GRANTHA DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +11370;COMBINING GRANTHA LETTER A;Mn;230;NSM;;;;;N;;;;; +11371;COMBINING GRANTHA LETTER KA;Mn;230;NSM;;;;;N;;;;; +11372;COMBINING GRANTHA LETTER NA;Mn;230;NSM;;;;;N;;;;; +11373;COMBINING GRANTHA LETTER VI;Mn;230;NSM;;;;;N;;;;; +11374;COMBINING GRANTHA LETTER PA;Mn;230;NSM;;;;;N;;;;; +11380;TULU-TIGALARI LETTER A;Lo;0;L;;;;;N;;;;; +11381;TULU-TIGALARI LETTER AA;Lo;0;L;;;;;N;;;;; +11382;TULU-TIGALARI LETTER I;Lo;0;L;;;;;N;;;;; +11383;TULU-TIGALARI LETTER II;Lo;0;L;11382 113C9;;;;N;;;;; +11384;TULU-TIGALARI LETTER U;Lo;0;L;;;;;N;;;;; +11385;TULU-TIGALARI LETTER UU;Lo;0;L;11384 113BB;;;;N;;;;; +11386;TULU-TIGALARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11387;TULU-TIGALARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11388;TULU-TIGALARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11389;TULU-TIGALARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1138B;TULU-TIGALARI LETTER EE;Lo;0;L;;;;;N;;;;; +1138E;TULU-TIGALARI LETTER AI;Lo;0;L;1138B 113C2;;;;N;;;;; +11390;TULU-TIGALARI LETTER OO;Lo;0;L;;;;;N;;;;; +11391;TULU-TIGALARI LETTER AU;Lo;0;L;11390 113C9;;;;N;;;;; +11392;TULU-TIGALARI LETTER KA;Lo;0;L;;;;;N;;;;; +11393;TULU-TIGALARI LETTER KHA;Lo;0;L;;;;;N;;;;; +11394;TULU-TIGALARI LETTER GA;Lo;0;L;;;;;N;;;;; +11395;TULU-TIGALARI LETTER GHA;Lo;0;L;;;;;N;;;;; +11396;TULU-TIGALARI LETTER NGA;Lo;0;L;;;;;N;;;;; +11397;TULU-TIGALARI LETTER CA;Lo;0;L;;;;;N;;;;; +11398;TULU-TIGALARI LETTER CHA;Lo;0;L;;;;;N;;;;; +11399;TULU-TIGALARI LETTER JA;Lo;0;L;;;;;N;;;;; +1139A;TULU-TIGALARI LETTER JHA;Lo;0;L;;;;;N;;;;; +1139B;TULU-TIGALARI LETTER NYA;Lo;0;L;;;;;N;;;;; +1139C;TULU-TIGALARI LETTER TTA;Lo;0;L;;;;;N;;;;; +1139D;TULU-TIGALARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1139E;TULU-TIGALARI LETTER DDA;Lo;0;L;;;;;N;;;;; +1139F;TULU-TIGALARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +113A0;TULU-TIGALARI LETTER NNA;Lo;0;L;;;;;N;;;;; +113A1;TULU-TIGALARI LETTER TA;Lo;0;L;;;;;N;;;;; +113A2;TULU-TIGALARI LETTER THA;Lo;0;L;;;;;N;;;;; +113A3;TULU-TIGALARI LETTER DA;Lo;0;L;;;;;N;;;;; +113A4;TULU-TIGALARI LETTER DHA;Lo;0;L;;;;;N;;;;; +113A5;TULU-TIGALARI LETTER NA;Lo;0;L;;;;;N;;;;; +113A6;TULU-TIGALARI LETTER PA;Lo;0;L;;;;;N;;;;; +113A7;TULU-TIGALARI LETTER PHA;Lo;0;L;;;;;N;;;;; +113A8;TULU-TIGALARI LETTER BA;Lo;0;L;;;;;N;;;;; +113A9;TULU-TIGALARI LETTER BHA;Lo;0;L;;;;;N;;;;; +113AA;TULU-TIGALARI LETTER MA;Lo;0;L;;;;;N;;;;; +113AB;TULU-TIGALARI LETTER YA;Lo;0;L;;;;;N;;;;; +113AC;TULU-TIGALARI LETTER RA;Lo;0;L;;;;;N;;;;; +113AD;TULU-TIGALARI LETTER LA;Lo;0;L;;;;;N;;;;; +113AE;TULU-TIGALARI LETTER VA;Lo;0;L;;;;;N;;;;; +113AF;TULU-TIGALARI LETTER SHA;Lo;0;L;;;;;N;;;;; +113B0;TULU-TIGALARI LETTER SSA;Lo;0;L;;;;;N;;;;; +113B1;TULU-TIGALARI LETTER SA;Lo;0;L;;;;;N;;;;; +113B2;TULU-TIGALARI LETTER HA;Lo;0;L;;;;;N;;;;; +113B3;TULU-TIGALARI LETTER LLA;Lo;0;L;;;;;N;;;;; +113B4;TULU-TIGALARI LETTER RRA;Lo;0;L;;;;;N;;;;; +113B5;TULU-TIGALARI LETTER LLLA;Lo;0;L;;;;;N;;;;; +113B7;TULU-TIGALARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +113B8;TULU-TIGALARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +113B9;TULU-TIGALARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +113BA;TULU-TIGALARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +113BB;TULU-TIGALARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +113BC;TULU-TIGALARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +113BD;TULU-TIGALARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +113BE;TULU-TIGALARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +113BF;TULU-TIGALARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +113C0;TULU-TIGALARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +113C2;TULU-TIGALARI VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +113C5;TULU-TIGALARI VOWEL SIGN AI;Mc;0;L;113C2 113C2;;;;N;;;;; +113C7;TULU-TIGALARI VOWEL SIGN OO;Mc;0;L;113C2 113B8;;;;N;;;;; +113C8;TULU-TIGALARI VOWEL SIGN AU;Mc;0;L;113C2 113C9;;;;N;;;;; +113C9;TULU-TIGALARI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +113CA;TULU-TIGALARI SIGN CANDRA ANUNASIKA;Mc;0;L;;;;;N;;;;; +113CC;TULU-TIGALARI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +113CD;TULU-TIGALARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +113CE;TULU-TIGALARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +113CF;TULU-TIGALARI SIGN LOOPED VIRAMA;Mc;9;L;;;;;N;;;;; +113D0;TULU-TIGALARI CONJOINER;Mn;9;NSM;;;;;N;;;;; +113D1;TULU-TIGALARI REPHA;Lo;0;L;;;;;N;;;;; +113D2;TULU-TIGALARI GEMINATION MARK;Mn;0;NSM;;;;;N;;;;; +113D3;TULU-TIGALARI SIGN PLUTA;Lo;0;L;;;;;N;;;;; +113D4;TULU-TIGALARI DANDA;Po;0;L;;;;;N;;;;; +113D5;TULU-TIGALARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +113D7;TULU-TIGALARI SIGN OM PUSHPIKA;Po;0;L;;;;;N;;;;; +113D8;TULU-TIGALARI SIGN SHRII PUSHPIKA;Po;0;L;;;;;N;;;;; +113E1;TULU-TIGALARI VEDIC TONE SVARITA;Mn;0;NSM;;;;;N;;;;; +113E2;TULU-TIGALARI VEDIC TONE ANUDATTA;Mn;0;NSM;;;;;N;;;;; +11400;NEWA LETTER A;Lo;0;L;;;;;N;;;;; +11401;NEWA LETTER AA;Lo;0;L;;;;;N;;;;; +11402;NEWA LETTER I;Lo;0;L;;;;;N;;;;; +11403;NEWA LETTER II;Lo;0;L;;;;;N;;;;; +11404;NEWA LETTER U;Lo;0;L;;;;;N;;;;; +11405;NEWA LETTER UU;Lo;0;L;;;;;N;;;;; +11406;NEWA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11407;NEWA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11408;NEWA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11409;NEWA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1140A;NEWA LETTER E;Lo;0;L;;;;;N;;;;; +1140B;NEWA LETTER AI;Lo;0;L;;;;;N;;;;; +1140C;NEWA LETTER O;Lo;0;L;;;;;N;;;;; +1140D;NEWA LETTER AU;Lo;0;L;;;;;N;;;;; +1140E;NEWA LETTER KA;Lo;0;L;;;;;N;;;;; +1140F;NEWA LETTER KHA;Lo;0;L;;;;;N;;;;; +11410;NEWA LETTER GA;Lo;0;L;;;;;N;;;;; +11411;NEWA LETTER GHA;Lo;0;L;;;;;N;;;;; +11412;NEWA LETTER NGA;Lo;0;L;;;;;N;;;;; +11413;NEWA LETTER NGHA;Lo;0;L;;;;;N;;;;; +11414;NEWA LETTER CA;Lo;0;L;;;;;N;;;;; +11415;NEWA LETTER CHA;Lo;0;L;;;;;N;;;;; +11416;NEWA LETTER JA;Lo;0;L;;;;;N;;;;; +11417;NEWA LETTER JHA;Lo;0;L;;;;;N;;;;; +11418;NEWA LETTER NYA;Lo;0;L;;;;;N;;;;; +11419;NEWA LETTER NYHA;Lo;0;L;;;;;N;;;;; +1141A;NEWA LETTER TTA;Lo;0;L;;;;;N;;;;; +1141B;NEWA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1141C;NEWA LETTER DDA;Lo;0;L;;;;;N;;;;; +1141D;NEWA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1141E;NEWA LETTER NNA;Lo;0;L;;;;;N;;;;; +1141F;NEWA LETTER TA;Lo;0;L;;;;;N;;;;; +11420;NEWA LETTER THA;Lo;0;L;;;;;N;;;;; +11421;NEWA LETTER DA;Lo;0;L;;;;;N;;;;; +11422;NEWA LETTER DHA;Lo;0;L;;;;;N;;;;; +11423;NEWA LETTER NA;Lo;0;L;;;;;N;;;;; +11424;NEWA LETTER NHA;Lo;0;L;;;;;N;;;;; +11425;NEWA LETTER PA;Lo;0;L;;;;;N;;;;; +11426;NEWA LETTER PHA;Lo;0;L;;;;;N;;;;; +11427;NEWA LETTER BA;Lo;0;L;;;;;N;;;;; +11428;NEWA LETTER BHA;Lo;0;L;;;;;N;;;;; +11429;NEWA LETTER MA;Lo;0;L;;;;;N;;;;; +1142A;NEWA LETTER MHA;Lo;0;L;;;;;N;;;;; +1142B;NEWA LETTER YA;Lo;0;L;;;;;N;;;;; +1142C;NEWA LETTER RA;Lo;0;L;;;;;N;;;;; +1142D;NEWA LETTER RHA;Lo;0;L;;;;;N;;;;; +1142E;NEWA LETTER LA;Lo;0;L;;;;;N;;;;; +1142F;NEWA LETTER LHA;Lo;0;L;;;;;N;;;;; +11430;NEWA LETTER WA;Lo;0;L;;;;;N;;;;; +11431;NEWA LETTER SHA;Lo;0;L;;;;;N;;;;; +11432;NEWA LETTER SSA;Lo;0;L;;;;;N;;;;; +11433;NEWA LETTER SA;Lo;0;L;;;;;N;;;;; +11434;NEWA LETTER HA;Lo;0;L;;;;;N;;;;; +11435;NEWA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11436;NEWA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11437;NEWA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11438;NEWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11439;NEWA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1143A;NEWA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +1143B;NEWA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +1143C;NEWA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1143D;NEWA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +1143E;NEWA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1143F;NEWA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11440;NEWA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11441;NEWA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11442;NEWA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11443;NEWA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11444;NEWA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11445;NEWA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11446;NEWA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11447;NEWA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +11448;NEWA SIGN FINAL ANUSVARA;Lo;0;L;;;;;N;;;;; +11449;NEWA OM;Lo;0;L;;;;;N;;;;; +1144A;NEWA SIDDHI;Lo;0;L;;;;;N;;;;; +1144B;NEWA DANDA;Po;0;L;;;;;N;;;;; +1144C;NEWA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +1144D;NEWA COMMA;Po;0;L;;;;;N;;;;; +1144E;NEWA GAP FILLER;Po;0;L;;;;;N;;;;; +1144F;NEWA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11450;NEWA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11451;NEWA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11452;NEWA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11453;NEWA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11454;NEWA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11455;NEWA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11456;NEWA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11457;NEWA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11458;NEWA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11459;NEWA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1145A;NEWA DOUBLE COMMA;Po;0;L;;;;;N;;;;; +1145B;NEWA PLACEHOLDER MARK;Po;0;L;;;;;N;;;;; +1145D;NEWA INSERTION SIGN;Po;0;L;;;;;N;;;;; +1145E;NEWA SANDHI MARK;Mn;230;NSM;;;;;N;;;;; +1145F;NEWA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +11460;NEWA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11461;NEWA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;; +11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;; +11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;; +11483;TIRHUTA LETTER I;Lo;0;L;;;;;N;;;;; +11484;TIRHUTA LETTER II;Lo;0;L;;;;;N;;;;; +11485;TIRHUTA LETTER U;Lo;0;L;;;;;N;;;;; +11486;TIRHUTA LETTER UU;Lo;0;L;;;;;N;;;;; +11487;TIRHUTA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11488;TIRHUTA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11489;TIRHUTA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1148A;TIRHUTA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1148B;TIRHUTA LETTER E;Lo;0;L;;;;;N;;;;; +1148C;TIRHUTA LETTER AI;Lo;0;L;;;;;N;;;;; +1148D;TIRHUTA LETTER O;Lo;0;L;;;;;N;;;;; +1148E;TIRHUTA LETTER AU;Lo;0;L;;;;;N;;;;; +1148F;TIRHUTA LETTER KA;Lo;0;L;;;;;N;;;;; +11490;TIRHUTA LETTER KHA;Lo;0;L;;;;;N;;;;; +11491;TIRHUTA LETTER GA;Lo;0;L;;;;;N;;;;; +11492;TIRHUTA LETTER GHA;Lo;0;L;;;;;N;;;;; +11493;TIRHUTA LETTER NGA;Lo;0;L;;;;;N;;;;; +11494;TIRHUTA LETTER CA;Lo;0;L;;;;;N;;;;; +11495;TIRHUTA LETTER CHA;Lo;0;L;;;;;N;;;;; +11496;TIRHUTA LETTER JA;Lo;0;L;;;;;N;;;;; +11497;TIRHUTA LETTER JHA;Lo;0;L;;;;;N;;;;; +11498;TIRHUTA LETTER NYA;Lo;0;L;;;;;N;;;;; +11499;TIRHUTA LETTER TTA;Lo;0;L;;;;;N;;;;; +1149A;TIRHUTA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1149B;TIRHUTA LETTER DDA;Lo;0;L;;;;;N;;;;; +1149C;TIRHUTA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1149D;TIRHUTA LETTER NNA;Lo;0;L;;;;;N;;;;; +1149E;TIRHUTA LETTER TA;Lo;0;L;;;;;N;;;;; +1149F;TIRHUTA LETTER THA;Lo;0;L;;;;;N;;;;; +114A0;TIRHUTA LETTER DA;Lo;0;L;;;;;N;;;;; +114A1;TIRHUTA LETTER DHA;Lo;0;L;;;;;N;;;;; +114A2;TIRHUTA LETTER NA;Lo;0;L;;;;;N;;;;; +114A3;TIRHUTA LETTER PA;Lo;0;L;;;;;N;;;;; +114A4;TIRHUTA LETTER PHA;Lo;0;L;;;;;N;;;;; +114A5;TIRHUTA LETTER BA;Lo;0;L;;;;;N;;;;; +114A6;TIRHUTA LETTER BHA;Lo;0;L;;;;;N;;;;; +114A7;TIRHUTA LETTER MA;Lo;0;L;;;;;N;;;;; +114A8;TIRHUTA LETTER YA;Lo;0;L;;;;;N;;;;; +114A9;TIRHUTA LETTER RA;Lo;0;L;;;;;N;;;;; +114AA;TIRHUTA LETTER LA;Lo;0;L;;;;;N;;;;; +114AB;TIRHUTA LETTER VA;Lo;0;L;;;;;N;;;;; +114AC;TIRHUTA LETTER SHA;Lo;0;L;;;;;N;;;;; +114AD;TIRHUTA LETTER SSA;Lo;0;L;;;;;N;;;;; +114AE;TIRHUTA LETTER SA;Lo;0;L;;;;;N;;;;; +114AF;TIRHUTA LETTER HA;Lo;0;L;;;;;N;;;;; +114B0;TIRHUTA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +114B1;TIRHUTA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +114B2;TIRHUTA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +114B3;TIRHUTA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +114B4;TIRHUTA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +114B5;TIRHUTA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +114B6;TIRHUTA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +114B7;TIRHUTA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +114B8;TIRHUTA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +114B9;TIRHUTA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +114BA;TIRHUTA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +114BB;TIRHUTA VOWEL SIGN AI;Mc;0;L;114B9 114BA;;;;N;;;;; +114BC;TIRHUTA VOWEL SIGN O;Mc;0;L;114B9 114B0;;;;N;;;;; +114BD;TIRHUTA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +114BE;TIRHUTA VOWEL SIGN AU;Mc;0;L;114B9 114BD;;;;N;;;;; +114BF;TIRHUTA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +114C0;TIRHUTA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +114C1;TIRHUTA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +114C2;TIRHUTA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +114C3;TIRHUTA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +114C4;TIRHUTA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +114C5;TIRHUTA GVANG;Lo;0;L;;;;;N;;;;; +114C6;TIRHUTA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +114C7;TIRHUTA OM;Lo;0;L;;;;;N;;;;; +114D0;TIRHUTA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +114D1;TIRHUTA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +114D2;TIRHUTA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +114D3;TIRHUTA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +114D4;TIRHUTA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +114D5;TIRHUTA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +114D6;TIRHUTA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +114D7;TIRHUTA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +114D8;TIRHUTA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +114D9;TIRHUTA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11580;SIDDHAM LETTER A;Lo;0;L;;;;;N;;;;; +11581;SIDDHAM LETTER AA;Lo;0;L;;;;;N;;;;; +11582;SIDDHAM LETTER I;Lo;0;L;;;;;N;;;;; +11583;SIDDHAM LETTER II;Lo;0;L;;;;;N;;;;; +11584;SIDDHAM LETTER U;Lo;0;L;;;;;N;;;;; +11585;SIDDHAM LETTER UU;Lo;0;L;;;;;N;;;;; +11586;SIDDHAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11587;SIDDHAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11588;SIDDHAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11589;SIDDHAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1158A;SIDDHAM LETTER E;Lo;0;L;;;;;N;;;;; +1158B;SIDDHAM LETTER AI;Lo;0;L;;;;;N;;;;; +1158C;SIDDHAM LETTER O;Lo;0;L;;;;;N;;;;; +1158D;SIDDHAM LETTER AU;Lo;0;L;;;;;N;;;;; +1158E;SIDDHAM LETTER KA;Lo;0;L;;;;;N;;;;; +1158F;SIDDHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +11590;SIDDHAM LETTER GA;Lo;0;L;;;;;N;;;;; +11591;SIDDHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +11592;SIDDHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +11593;SIDDHAM LETTER CA;Lo;0;L;;;;;N;;;;; +11594;SIDDHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +11595;SIDDHAM LETTER JA;Lo;0;L;;;;;N;;;;; +11596;SIDDHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +11597;SIDDHAM LETTER NYA;Lo;0;L;;;;;N;;;;; +11598;SIDDHAM LETTER TTA;Lo;0;L;;;;;N;;;;; +11599;SIDDHAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +1159A;SIDDHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +1159B;SIDDHAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +1159C;SIDDHAM LETTER NNA;Lo;0;L;;;;;N;;;;; +1159D;SIDDHAM LETTER TA;Lo;0;L;;;;;N;;;;; +1159E;SIDDHAM LETTER THA;Lo;0;L;;;;;N;;;;; +1159F;SIDDHAM LETTER DA;Lo;0;L;;;;;N;;;;; +115A0;SIDDHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +115A1;SIDDHAM LETTER NA;Lo;0;L;;;;;N;;;;; +115A2;SIDDHAM LETTER PA;Lo;0;L;;;;;N;;;;; +115A3;SIDDHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +115A4;SIDDHAM LETTER BA;Lo;0;L;;;;;N;;;;; +115A5;SIDDHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +115A6;SIDDHAM LETTER MA;Lo;0;L;;;;;N;;;;; +115A7;SIDDHAM LETTER YA;Lo;0;L;;;;;N;;;;; +115A8;SIDDHAM LETTER RA;Lo;0;L;;;;;N;;;;; +115A9;SIDDHAM LETTER LA;Lo;0;L;;;;;N;;;;; +115AA;SIDDHAM LETTER VA;Lo;0;L;;;;;N;;;;; +115AB;SIDDHAM LETTER SHA;Lo;0;L;;;;;N;;;;; +115AC;SIDDHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +115AD;SIDDHAM LETTER SA;Lo;0;L;;;;;N;;;;; +115AE;SIDDHAM LETTER HA;Lo;0;L;;;;;N;;;;; +115AF;SIDDHAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +115B0;SIDDHAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +115B1;SIDDHAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +115B2;SIDDHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +115B3;SIDDHAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +115B4;SIDDHAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +115B5;SIDDHAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +115B8;SIDDHAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +115B9;SIDDHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +115BA;SIDDHAM VOWEL SIGN O;Mc;0;L;115B8 115AF;;;;N;;;;; +115BB;SIDDHAM VOWEL SIGN AU;Mc;0;L;115B9 115AF;;;;N;;;;; +115BC;SIDDHAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +115BD;SIDDHAM SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +115BE;SIDDHAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +115BF;SIDDHAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +115C0;SIDDHAM SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +115C1;SIDDHAM SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +115C2;SIDDHAM DANDA;Po;0;L;;;;;N;;;;; +115C3;SIDDHAM DOUBLE DANDA;Po;0;L;;;;;N;;;;; +115C4;SIDDHAM SEPARATOR DOT;Po;0;L;;;;;N;;;;; +115C5;SIDDHAM SEPARATOR BAR;Po;0;L;;;;;N;;;;; +115C6;SIDDHAM REPETITION MARK-1;Po;0;L;;;;;N;;;;; +115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; +115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; +115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; +115CA;SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS;Po;0;L;;;;;N;;;;; +115CB;SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CC;SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CD;SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CE;SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CF;SIDDHAM SECTION MARK DOUBLE RING;Po;0;L;;;;;N;;;;; +115D0;SIDDHAM SECTION MARK DOUBLE RING WITH RAYS;Po;0;L;;;;;N;;;;; +115D1;SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D2;SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D3;SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D4;SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D5;SIDDHAM SECTION MARK WITH CIRCLES AND RAYS;Po;0;L;;;;;N;;;;; +115D6;SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES;Po;0;L;;;;;N;;;;; +115D7;SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES;Po;0;L;;;;;N;;;;; +115D8;SIDDHAM LETTER THREE-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115D9;SIDDHAM LETTER TWO-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115DA;SIDDHAM LETTER TWO-CIRCLE ALTERNATE II;Lo;0;L;;;;;N;;;;; +115DB;SIDDHAM LETTER ALTERNATE U;Lo;0;L;;;;;N;;;;; +115DC;SIDDHAM VOWEL SIGN ALTERNATE U;Mn;0;NSM;;;;;N;;;;; +115DD;SIDDHAM VOWEL SIGN ALTERNATE UU;Mn;0;NSM;;;;;N;;;;; +11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; +11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; +11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; +11603;MODI LETTER II;Lo;0;L;;;;;N;;;;; +11604;MODI LETTER U;Lo;0;L;;;;;N;;;;; +11605;MODI LETTER UU;Lo;0;L;;;;;N;;;;; +11606;MODI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11607;MODI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11608;MODI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11609;MODI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1160A;MODI LETTER E;Lo;0;L;;;;;N;;;;; +1160B;MODI LETTER AI;Lo;0;L;;;;;N;;;;; +1160C;MODI LETTER O;Lo;0;L;;;;;N;;;;; +1160D;MODI LETTER AU;Lo;0;L;;;;;N;;;;; +1160E;MODI LETTER KA;Lo;0;L;;;;;N;;;;; +1160F;MODI LETTER KHA;Lo;0;L;;;;;N;;;;; +11610;MODI LETTER GA;Lo;0;L;;;;;N;;;;; +11611;MODI LETTER GHA;Lo;0;L;;;;;N;;;;; +11612;MODI LETTER NGA;Lo;0;L;;;;;N;;;;; +11613;MODI LETTER CA;Lo;0;L;;;;;N;;;;; +11614;MODI LETTER CHA;Lo;0;L;;;;;N;;;;; +11615;MODI LETTER JA;Lo;0;L;;;;;N;;;;; +11616;MODI LETTER JHA;Lo;0;L;;;;;N;;;;; +11617;MODI LETTER NYA;Lo;0;L;;;;;N;;;;; +11618;MODI LETTER TTA;Lo;0;L;;;;;N;;;;; +11619;MODI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1161A;MODI LETTER DDA;Lo;0;L;;;;;N;;;;; +1161B;MODI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1161C;MODI LETTER NNA;Lo;0;L;;;;;N;;;;; +1161D;MODI LETTER TA;Lo;0;L;;;;;N;;;;; +1161E;MODI LETTER THA;Lo;0;L;;;;;N;;;;; +1161F;MODI LETTER DA;Lo;0;L;;;;;N;;;;; +11620;MODI LETTER DHA;Lo;0;L;;;;;N;;;;; +11621;MODI LETTER NA;Lo;0;L;;;;;N;;;;; +11622;MODI LETTER PA;Lo;0;L;;;;;N;;;;; +11623;MODI LETTER PHA;Lo;0;L;;;;;N;;;;; +11624;MODI LETTER BA;Lo;0;L;;;;;N;;;;; +11625;MODI LETTER BHA;Lo;0;L;;;;;N;;;;; +11626;MODI LETTER MA;Lo;0;L;;;;;N;;;;; +11627;MODI LETTER YA;Lo;0;L;;;;;N;;;;; +11628;MODI LETTER RA;Lo;0;L;;;;;N;;;;; +11629;MODI LETTER LA;Lo;0;L;;;;;N;;;;; +1162A;MODI LETTER VA;Lo;0;L;;;;;N;;;;; +1162B;MODI LETTER SHA;Lo;0;L;;;;;N;;;;; +1162C;MODI LETTER SSA;Lo;0;L;;;;;N;;;;; +1162D;MODI LETTER SA;Lo;0;L;;;;;N;;;;; +1162E;MODI LETTER HA;Lo;0;L;;;;;N;;;;; +1162F;MODI LETTER LLA;Lo;0;L;;;;;N;;;;; +11630;MODI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11631;MODI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11632;MODI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11633;MODI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11634;MODI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11635;MODI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11636;MODI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11637;MODI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11638;MODI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11639;MODI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1163A;MODI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1163B;MODI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1163C;MODI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1163D;MODI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1163E;MODI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1163F;MODI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11640;MODI SIGN ARDHACANDRA;Mn;0;NSM;;;;;N;;;;; +11641;MODI DANDA;Po;0;L;;;;;N;;;;; +11642;MODI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11643;MODI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11644;MODI SIGN HUVA;Lo;0;L;;;;;N;;;;; +11650;MODI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11651;MODI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11652;MODI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11653;MODI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11654;MODI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11655;MODI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11656;MODI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11657;MODI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11658;MODI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11659;MODI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11660;MONGOLIAN BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11661;MONGOLIAN ROTATED BIRGA;Po;0;ON;;;;;N;;;;; +11662;MONGOLIAN DOUBLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11663;MONGOLIAN TRIPLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11664;MONGOLIAN BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11665;MONGOLIAN ROTATED BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11666;MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11667;MONGOLIAN INVERTED BIRGA;Po;0;ON;;;;;N;;;;; +11668;MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11669;MONGOLIAN SWIRL BIRGA;Po;0;ON;;;;;N;;;;; +1166A;MONGOLIAN SWIRL BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +1166B;MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +1166C;MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11680;TAKRI LETTER A;Lo;0;L;;;;;N;;;;; +11681;TAKRI LETTER AA;Lo;0;L;;;;;N;;;;; +11682;TAKRI LETTER I;Lo;0;L;;;;;N;;;;; +11683;TAKRI LETTER II;Lo;0;L;;;;;N;;;;; +11684;TAKRI LETTER U;Lo;0;L;;;;;N;;;;; +11685;TAKRI LETTER UU;Lo;0;L;;;;;N;;;;; +11686;TAKRI LETTER E;Lo;0;L;;;;;N;;;;; +11687;TAKRI LETTER AI;Lo;0;L;;;;;N;;;;; +11688;TAKRI LETTER O;Lo;0;L;;;;;N;;;;; +11689;TAKRI LETTER AU;Lo;0;L;;;;;N;;;;; +1168A;TAKRI LETTER KA;Lo;0;L;;;;;N;;;;; +1168B;TAKRI LETTER KHA;Lo;0;L;;;;;N;;;;; +1168C;TAKRI LETTER GA;Lo;0;L;;;;;N;;;;; +1168D;TAKRI LETTER GHA;Lo;0;L;;;;;N;;;;; +1168E;TAKRI LETTER NGA;Lo;0;L;;;;;N;;;;; +1168F;TAKRI LETTER CA;Lo;0;L;;;;;N;;;;; +11690;TAKRI LETTER CHA;Lo;0;L;;;;;N;;;;; +11691;TAKRI LETTER JA;Lo;0;L;;;;;N;;;;; +11692;TAKRI LETTER JHA;Lo;0;L;;;;;N;;;;; +11693;TAKRI LETTER NYA;Lo;0;L;;;;;N;;;;; +11694;TAKRI LETTER TTA;Lo;0;L;;;;;N;;;;; +11695;TAKRI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11696;TAKRI LETTER DDA;Lo;0;L;;;;;N;;;;; +11697;TAKRI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11698;TAKRI LETTER NNA;Lo;0;L;;;;;N;;;;; +11699;TAKRI LETTER TA;Lo;0;L;;;;;N;;;;; +1169A;TAKRI LETTER THA;Lo;0;L;;;;;N;;;;; +1169B;TAKRI LETTER DA;Lo;0;L;;;;;N;;;;; +1169C;TAKRI LETTER DHA;Lo;0;L;;;;;N;;;;; +1169D;TAKRI LETTER NA;Lo;0;L;;;;;N;;;;; +1169E;TAKRI LETTER PA;Lo;0;L;;;;;N;;;;; +1169F;TAKRI LETTER PHA;Lo;0;L;;;;;N;;;;; +116A0;TAKRI LETTER BA;Lo;0;L;;;;;N;;;;; +116A1;TAKRI LETTER BHA;Lo;0;L;;;;;N;;;;; +116A2;TAKRI LETTER MA;Lo;0;L;;;;;N;;;;; +116A3;TAKRI LETTER YA;Lo;0;L;;;;;N;;;;; +116A4;TAKRI LETTER RA;Lo;0;L;;;;;N;;;;; +116A5;TAKRI LETTER LA;Lo;0;L;;;;;N;;;;; +116A6;TAKRI LETTER VA;Lo;0;L;;;;;N;;;;; +116A7;TAKRI LETTER SHA;Lo;0;L;;;;;N;;;;; +116A8;TAKRI LETTER SA;Lo;0;L;;;;;N;;;;; +116A9;TAKRI LETTER HA;Lo;0;L;;;;;N;;;;; +116AA;TAKRI LETTER RRA;Lo;0;L;;;;;N;;;;; +116AB;TAKRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +116AC;TAKRI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +116AD;TAKRI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +116AE;TAKRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +116AF;TAKRI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +116B0;TAKRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +116B1;TAKRI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +116B2;TAKRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +116B3;TAKRI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +116B4;TAKRI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +116B8;TAKRI LETTER ARCHAIC KHA;Lo;0;L;;;;;N;;;;; +116B9;TAKRI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +116C3;TAKRI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +116C4;TAKRI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +116C5;TAKRI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +116C6;TAKRI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +116D0;MYANMAR PAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +116D1;MYANMAR PAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +116D2;MYANMAR PAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +116D3;MYANMAR PAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +116D4;MYANMAR PAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +116D5;MYANMAR PAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +116D6;MYANMAR PAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +116D7;MYANMAR PAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +116D8;MYANMAR PAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +116D9;MYANMAR PAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +116DA;MYANMAR EASTERN PWO KAREN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +116DB;MYANMAR EASTERN PWO KAREN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +116DC;MYANMAR EASTERN PWO KAREN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +116DD;MYANMAR EASTERN PWO KAREN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +116DE;MYANMAR EASTERN PWO KAREN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +116DF;MYANMAR EASTERN PWO KAREN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +116E0;MYANMAR EASTERN PWO KAREN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +116E1;MYANMAR EASTERN PWO KAREN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +116E2;MYANMAR EASTERN PWO KAREN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +116E3;MYANMAR EASTERN PWO KAREN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11700;AHOM LETTER KA;Lo;0;L;;;;;N;;;;; +11701;AHOM LETTER KHA;Lo;0;L;;;;;N;;;;; +11702;AHOM LETTER NGA;Lo;0;L;;;;;N;;;;; +11703;AHOM LETTER NA;Lo;0;L;;;;;N;;;;; +11704;AHOM LETTER TA;Lo;0;L;;;;;N;;;;; +11705;AHOM LETTER ALTERNATE TA;Lo;0;L;;;;;N;;;;; +11706;AHOM LETTER PA;Lo;0;L;;;;;N;;;;; +11707;AHOM LETTER PHA;Lo;0;L;;;;;N;;;;; +11708;AHOM LETTER BA;Lo;0;L;;;;;N;;;;; +11709;AHOM LETTER MA;Lo;0;L;;;;;N;;;;; +1170A;AHOM LETTER JA;Lo;0;L;;;;;N;;;;; +1170B;AHOM LETTER CHA;Lo;0;L;;;;;N;;;;; +1170C;AHOM LETTER THA;Lo;0;L;;;;;N;;;;; +1170D;AHOM LETTER RA;Lo;0;L;;;;;N;;;;; +1170E;AHOM LETTER LA;Lo;0;L;;;;;N;;;;; +1170F;AHOM LETTER SA;Lo;0;L;;;;;N;;;;; +11710;AHOM LETTER NYA;Lo;0;L;;;;;N;;;;; +11711;AHOM LETTER HA;Lo;0;L;;;;;N;;;;; +11712;AHOM LETTER A;Lo;0;L;;;;;N;;;;; +11713;AHOM LETTER DA;Lo;0;L;;;;;N;;;;; +11714;AHOM LETTER DHA;Lo;0;L;;;;;N;;;;; +11715;AHOM LETTER GA;Lo;0;L;;;;;N;;;;; +11716;AHOM LETTER ALTERNATE GA;Lo;0;L;;;;;N;;;;; +11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;; +11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;; +11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;; +1171A;AHOM LETTER ALTERNATE BA;Lo;0;L;;;;;N;;;;; +1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1171E;AHOM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;; +11720;AHOM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +11721;AHOM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11722;AHOM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11723;AHOM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11724;AHOM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11725;AHOM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11726;AHOM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11727;AHOM VOWEL SIGN AW;Mn;0;NSM;;;;;N;;;;; +11728;AHOM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11729;AHOM VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1172A;AHOM VOWEL SIGN AM;Mn;0;NSM;;;;;N;;;;; +1172B;AHOM SIGN KILLER;Mn;9;NSM;;;;;N;;;;; +11730;AHOM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11731;AHOM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11732;AHOM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11733;AHOM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11734;AHOM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11735;AHOM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11736;AHOM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11737;AHOM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11738;AHOM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11739;AHOM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1173A;AHOM NUMBER TEN;No;0;L;;;;10;N;;;;; +1173B;AHOM NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1173C;AHOM SIGN SMALL SECTION;Po;0;L;;;;;N;;;;; +1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;; +1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;; +1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;; +11740;AHOM LETTER CA;Lo;0;L;;;;;N;;;;; +11741;AHOM LETTER TTA;Lo;0;L;;;;;N;;;;; +11742;AHOM LETTER TTHA;Lo;0;L;;;;;N;;;;; +11743;AHOM LETTER DDA;Lo;0;L;;;;;N;;;;; +11744;AHOM LETTER DDHA;Lo;0;L;;;;;N;;;;; +11745;AHOM LETTER NNA;Lo;0;L;;;;;N;;;;; +11746;AHOM LETTER LLA;Lo;0;L;;;;;N;;;;; +11800;DOGRA LETTER A;Lo;0;L;;;;;N;;;;; +11801;DOGRA LETTER AA;Lo;0;L;;;;;N;;;;; +11802;DOGRA LETTER I;Lo;0;L;;;;;N;;;;; +11803;DOGRA LETTER II;Lo;0;L;;;;;N;;;;; +11804;DOGRA LETTER U;Lo;0;L;;;;;N;;;;; +11805;DOGRA LETTER UU;Lo;0;L;;;;;N;;;;; +11806;DOGRA LETTER E;Lo;0;L;;;;;N;;;;; +11807;DOGRA LETTER AI;Lo;0;L;;;;;N;;;;; +11808;DOGRA LETTER O;Lo;0;L;;;;;N;;;;; +11809;DOGRA LETTER AU;Lo;0;L;;;;;N;;;;; +1180A;DOGRA LETTER KA;Lo;0;L;;;;;N;;;;; +1180B;DOGRA LETTER KHA;Lo;0;L;;;;;N;;;;; +1180C;DOGRA LETTER GA;Lo;0;L;;;;;N;;;;; +1180D;DOGRA LETTER GHA;Lo;0;L;;;;;N;;;;; +1180E;DOGRA LETTER NGA;Lo;0;L;;;;;N;;;;; +1180F;DOGRA LETTER CA;Lo;0;L;;;;;N;;;;; +11810;DOGRA LETTER CHA;Lo;0;L;;;;;N;;;;; +11811;DOGRA LETTER JA;Lo;0;L;;;;;N;;;;; +11812;DOGRA LETTER JHA;Lo;0;L;;;;;N;;;;; +11813;DOGRA LETTER NYA;Lo;0;L;;;;;N;;;;; +11814;DOGRA LETTER TTA;Lo;0;L;;;;;N;;;;; +11815;DOGRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +11816;DOGRA LETTER DDA;Lo;0;L;;;;;N;;;;; +11817;DOGRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +11818;DOGRA LETTER NNA;Lo;0;L;;;;;N;;;;; +11819;DOGRA LETTER TA;Lo;0;L;;;;;N;;;;; +1181A;DOGRA LETTER THA;Lo;0;L;;;;;N;;;;; +1181B;DOGRA LETTER DA;Lo;0;L;;;;;N;;;;; +1181C;DOGRA LETTER DHA;Lo;0;L;;;;;N;;;;; +1181D;DOGRA LETTER NA;Lo;0;L;;;;;N;;;;; +1181E;DOGRA LETTER PA;Lo;0;L;;;;;N;;;;; +1181F;DOGRA LETTER PHA;Lo;0;L;;;;;N;;;;; +11820;DOGRA LETTER BA;Lo;0;L;;;;;N;;;;; +11821;DOGRA LETTER BHA;Lo;0;L;;;;;N;;;;; +11822;DOGRA LETTER MA;Lo;0;L;;;;;N;;;;; +11823;DOGRA LETTER YA;Lo;0;L;;;;;N;;;;; +11824;DOGRA LETTER RA;Lo;0;L;;;;;N;;;;; +11825;DOGRA LETTER LA;Lo;0;L;;;;;N;;;;; +11826;DOGRA LETTER VA;Lo;0;L;;;;;N;;;;; +11827;DOGRA LETTER SHA;Lo;0;L;;;;;N;;;;; +11828;DOGRA LETTER SSA;Lo;0;L;;;;;N;;;;; +11829;DOGRA LETTER SA;Lo;0;L;;;;;N;;;;; +1182A;DOGRA LETTER HA;Lo;0;L;;;;;N;;;;; +1182B;DOGRA LETTER RRA;Lo;0;L;;;;;N;;;;; +1182C;DOGRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1182D;DOGRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1182E;DOGRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +1182F;DOGRA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11830;DOGRA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11831;DOGRA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11832;DOGRA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11833;DOGRA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11834;DOGRA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11835;DOGRA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11836;DOGRA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11837;DOGRA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11838;DOGRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11839;DOGRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1183A;DOGRA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1183B;DOGRA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; +118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; +118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; +118A3;WARANG CITI CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;118C3; +118A4;WARANG CITI CAPITAL LETTER YA;Lu;0;L;;;;;N;;;;118C4; +118A5;WARANG CITI CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;118C5; +118A6;WARANG CITI CAPITAL LETTER II;Lu;0;L;;;;;N;;;;118C6; +118A7;WARANG CITI CAPITAL LETTER UU;Lu;0;L;;;;;N;;;;118C7; +118A8;WARANG CITI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;118C8; +118A9;WARANG CITI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;118C9; +118AA;WARANG CITI CAPITAL LETTER ANG;Lu;0;L;;;;;N;;;;118CA; +118AB;WARANG CITI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;118CB; +118AC;WARANG CITI CAPITAL LETTER KO;Lu;0;L;;;;;N;;;;118CC; +118AD;WARANG CITI CAPITAL LETTER ENY;Lu;0;L;;;;;N;;;;118CD; +118AE;WARANG CITI CAPITAL LETTER YUJ;Lu;0;L;;;;;N;;;;118CE; +118AF;WARANG CITI CAPITAL LETTER UC;Lu;0;L;;;;;N;;;;118CF; +118B0;WARANG CITI CAPITAL LETTER ENN;Lu;0;L;;;;;N;;;;118D0; +118B1;WARANG CITI CAPITAL LETTER ODD;Lu;0;L;;;;;N;;;;118D1; +118B2;WARANG CITI CAPITAL LETTER TTE;Lu;0;L;;;;;N;;;;118D2; +118B3;WARANG CITI CAPITAL LETTER NUNG;Lu;0;L;;;;;N;;;;118D3; +118B4;WARANG CITI CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;118D4; +118B5;WARANG CITI CAPITAL LETTER AT;Lu;0;L;;;;;N;;;;118D5; +118B6;WARANG CITI CAPITAL LETTER AM;Lu;0;L;;;;;N;;;;118D6; +118B7;WARANG CITI CAPITAL LETTER BU;Lu;0;L;;;;;N;;;;118D7; +118B8;WARANG CITI CAPITAL LETTER PU;Lu;0;L;;;;;N;;;;118D8; +118B9;WARANG CITI CAPITAL LETTER HIYO;Lu;0;L;;;;;N;;;;118D9; +118BA;WARANG CITI CAPITAL LETTER HOLO;Lu;0;L;;;;;N;;;;118DA; +118BB;WARANG CITI CAPITAL LETTER HORR;Lu;0;L;;;;;N;;;;118DB; +118BC;WARANG CITI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;118DC; +118BD;WARANG CITI CAPITAL LETTER SSUU;Lu;0;L;;;;;N;;;;118DD; +118BE;WARANG CITI CAPITAL LETTER SII;Lu;0;L;;;;;N;;;;118DE; +118BF;WARANG CITI CAPITAL LETTER VIYO;Lu;0;L;;;;;N;;;;118DF; +118C0;WARANG CITI SMALL LETTER NGAA;Ll;0;L;;;;;N;;;118A0;;118A0 +118C1;WARANG CITI SMALL LETTER A;Ll;0;L;;;;;N;;;118A1;;118A1 +118C2;WARANG CITI SMALL LETTER WI;Ll;0;L;;;;;N;;;118A2;;118A2 +118C3;WARANG CITI SMALL LETTER YU;Ll;0;L;;;;;N;;;118A3;;118A3 +118C4;WARANG CITI SMALL LETTER YA;Ll;0;L;;;;;N;;;118A4;;118A4 +118C5;WARANG CITI SMALL LETTER YO;Ll;0;L;;;;;N;;;118A5;;118A5 +118C6;WARANG CITI SMALL LETTER II;Ll;0;L;;;;;N;;;118A6;;118A6 +118C7;WARANG CITI SMALL LETTER UU;Ll;0;L;;;;;N;;;118A7;;118A7 +118C8;WARANG CITI SMALL LETTER E;Ll;0;L;;;;;N;;;118A8;;118A8 +118C9;WARANG CITI SMALL LETTER O;Ll;0;L;;;;;N;;;118A9;;118A9 +118CA;WARANG CITI SMALL LETTER ANG;Ll;0;L;;;;;N;;;118AA;;118AA +118CB;WARANG CITI SMALL LETTER GA;Ll;0;L;;;;;N;;;118AB;;118AB +118CC;WARANG CITI SMALL LETTER KO;Ll;0;L;;;;;N;;;118AC;;118AC +118CD;WARANG CITI SMALL LETTER ENY;Ll;0;L;;;;;N;;;118AD;;118AD +118CE;WARANG CITI SMALL LETTER YUJ;Ll;0;L;;;;;N;;;118AE;;118AE +118CF;WARANG CITI SMALL LETTER UC;Ll;0;L;;;;;N;;;118AF;;118AF +118D0;WARANG CITI SMALL LETTER ENN;Ll;0;L;;;;;N;;;118B0;;118B0 +118D1;WARANG CITI SMALL LETTER ODD;Ll;0;L;;;;;N;;;118B1;;118B1 +118D2;WARANG CITI SMALL LETTER TTE;Ll;0;L;;;;;N;;;118B2;;118B2 +118D3;WARANG CITI SMALL LETTER NUNG;Ll;0;L;;;;;N;;;118B3;;118B3 +118D4;WARANG CITI SMALL LETTER DA;Ll;0;L;;;;;N;;;118B4;;118B4 +118D5;WARANG CITI SMALL LETTER AT;Ll;0;L;;;;;N;;;118B5;;118B5 +118D6;WARANG CITI SMALL LETTER AM;Ll;0;L;;;;;N;;;118B6;;118B6 +118D7;WARANG CITI SMALL LETTER BU;Ll;0;L;;;;;N;;;118B7;;118B7 +118D8;WARANG CITI SMALL LETTER PU;Ll;0;L;;;;;N;;;118B8;;118B8 +118D9;WARANG CITI SMALL LETTER HIYO;Ll;0;L;;;;;N;;;118B9;;118B9 +118DA;WARANG CITI SMALL LETTER HOLO;Ll;0;L;;;;;N;;;118BA;;118BA +118DB;WARANG CITI SMALL LETTER HORR;Ll;0;L;;;;;N;;;118BB;;118BB +118DC;WARANG CITI SMALL LETTER HAR;Ll;0;L;;;;;N;;;118BC;;118BC +118DD;WARANG CITI SMALL LETTER SSUU;Ll;0;L;;;;;N;;;118BD;;118BD +118DE;WARANG CITI SMALL LETTER SII;Ll;0;L;;;;;N;;;118BE;;118BE +118DF;WARANG CITI SMALL LETTER VIYO;Ll;0;L;;;;;N;;;118BF;;118BF +118E0;WARANG CITI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +118E1;WARANG CITI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +118E2;WARANG CITI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +118E3;WARANG CITI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +118E4;WARANG CITI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +118E5;WARANG CITI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +118E6;WARANG CITI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +118E7;WARANG CITI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +118E8;WARANG CITI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +118E9;WARANG CITI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +118EA;WARANG CITI NUMBER TEN;No;0;L;;;;10;N;;;;; +118EB;WARANG CITI NUMBER TWENTY;No;0;L;;;;20;N;;;;; +118EC;WARANG CITI NUMBER THIRTY;No;0;L;;;;30;N;;;;; +118ED;WARANG CITI NUMBER FORTY;No;0;L;;;;40;N;;;;; +118EE;WARANG CITI NUMBER FIFTY;No;0;L;;;;50;N;;;;; +118EF;WARANG CITI NUMBER SIXTY;No;0;L;;;;60;N;;;;; +118F0;WARANG CITI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;; +118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;; +11900;DIVES AKURU LETTER A;Lo;0;L;;;;;N;;;;; +11901;DIVES AKURU LETTER AA;Lo;0;L;;;;;N;;;;; +11902;DIVES AKURU LETTER I;Lo;0;L;;;;;N;;;;; +11903;DIVES AKURU LETTER II;Lo;0;L;;;;;N;;;;; +11904;DIVES AKURU LETTER U;Lo;0;L;;;;;N;;;;; +11905;DIVES AKURU LETTER UU;Lo;0;L;;;;;N;;;;; +11906;DIVES AKURU LETTER E;Lo;0;L;;;;;N;;;;; +11909;DIVES AKURU LETTER O;Lo;0;L;;;;;N;;;;; +1190C;DIVES AKURU LETTER KA;Lo;0;L;;;;;N;;;;; +1190D;DIVES AKURU LETTER KHA;Lo;0;L;;;;;N;;;;; +1190E;DIVES AKURU LETTER GA;Lo;0;L;;;;;N;;;;; +1190F;DIVES AKURU LETTER GHA;Lo;0;L;;;;;N;;;;; +11910;DIVES AKURU LETTER NGA;Lo;0;L;;;;;N;;;;; +11911;DIVES AKURU LETTER CA;Lo;0;L;;;;;N;;;;; +11912;DIVES AKURU LETTER CHA;Lo;0;L;;;;;N;;;;; +11913;DIVES AKURU LETTER JA;Lo;0;L;;;;;N;;;;; +11915;DIVES AKURU LETTER NYA;Lo;0;L;;;;;N;;;;; +11916;DIVES AKURU LETTER TTA;Lo;0;L;;;;;N;;;;; +11918;DIVES AKURU LETTER DDA;Lo;0;L;;;;;N;;;;; +11919;DIVES AKURU LETTER DDHA;Lo;0;L;;;;;N;;;;; +1191A;DIVES AKURU LETTER NNA;Lo;0;L;;;;;N;;;;; +1191B;DIVES AKURU LETTER TA;Lo;0;L;;;;;N;;;;; +1191C;DIVES AKURU LETTER THA;Lo;0;L;;;;;N;;;;; +1191D;DIVES AKURU LETTER DA;Lo;0;L;;;;;N;;;;; +1191E;DIVES AKURU LETTER DHA;Lo;0;L;;;;;N;;;;; +1191F;DIVES AKURU LETTER NA;Lo;0;L;;;;;N;;;;; +11920;DIVES AKURU LETTER PA;Lo;0;L;;;;;N;;;;; +11921;DIVES AKURU LETTER PHA;Lo;0;L;;;;;N;;;;; +11922;DIVES AKURU LETTER BA;Lo;0;L;;;;;N;;;;; +11923;DIVES AKURU LETTER BHA;Lo;0;L;;;;;N;;;;; +11924;DIVES AKURU LETTER MA;Lo;0;L;;;;;N;;;;; +11925;DIVES AKURU LETTER YA;Lo;0;L;;;;;N;;;;; +11926;DIVES AKURU LETTER YYA;Lo;0;L;;;;;N;;;;; +11927;DIVES AKURU LETTER RA;Lo;0;L;;;;;N;;;;; +11928;DIVES AKURU LETTER LA;Lo;0;L;;;;;N;;;;; +11929;DIVES AKURU LETTER VA;Lo;0;L;;;;;N;;;;; +1192A;DIVES AKURU LETTER SHA;Lo;0;L;;;;;N;;;;; +1192B;DIVES AKURU LETTER SSA;Lo;0;L;;;;;N;;;;; +1192C;DIVES AKURU LETTER SA;Lo;0;L;;;;;N;;;;; +1192D;DIVES AKURU LETTER HA;Lo;0;L;;;;;N;;;;; +1192E;DIVES AKURU LETTER LLA;Lo;0;L;;;;;N;;;;; +1192F;DIVES AKURU LETTER ZA;Lo;0;L;;;;;N;;;;; +11930;DIVES AKURU VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11931;DIVES AKURU VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11932;DIVES AKURU VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11933;DIVES AKURU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11934;DIVES AKURU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11935;DIVES AKURU VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11937;DIVES AKURU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11938;DIVES AKURU VOWEL SIGN O;Mc;0;L;11935 11930;;;;N;;;;; +1193B;DIVES AKURU SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1193C;DIVES AKURU SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +1193D;DIVES AKURU SIGN HALANTA;Mc;9;L;;;;;N;;;;; +1193E;DIVES AKURU VIRAMA;Mn;9;NSM;;;;;N;;;;; +1193F;DIVES AKURU PREFIXED NASAL SIGN;Lo;0;L;;;;;N;;;;; +11940;DIVES AKURU MEDIAL YA;Mc;0;L;;;;;N;;;;; +11941;DIVES AKURU INITIAL RA;Lo;0;L;;;;;N;;;;; +11942;DIVES AKURU MEDIAL RA;Mc;0;L;;;;;N;;;;; +11943;DIVES AKURU SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11944;DIVES AKURU DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11945;DIVES AKURU GAP FILLER;Po;0;L;;;;;N;;;;; +11946;DIVES AKURU END OF TEXT MARK;Po;0;L;;;;;N;;;;; +11950;DIVES AKURU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11951;DIVES AKURU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11952;DIVES AKURU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11953;DIVES AKURU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11954;DIVES AKURU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11955;DIVES AKURU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11956;DIVES AKURU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11957;DIVES AKURU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11958;DIVES AKURU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11959;DIVES AKURU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +119A0;NANDINAGARI LETTER A;Lo;0;L;;;;;N;;;;; +119A1;NANDINAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +119A2;NANDINAGARI LETTER I;Lo;0;L;;;;;N;;;;; +119A3;NANDINAGARI LETTER II;Lo;0;L;;;;;N;;;;; +119A4;NANDINAGARI LETTER U;Lo;0;L;;;;;N;;;;; +119A5;NANDINAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +119A6;NANDINAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +119A7;NANDINAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +119AA;NANDINAGARI LETTER E;Lo;0;L;;;;;N;;;;; +119AB;NANDINAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +119AC;NANDINAGARI LETTER O;Lo;0;L;;;;;N;;;;; +119AD;NANDINAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +119AE;NANDINAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +119AF;NANDINAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +119B0;NANDINAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +119B1;NANDINAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +119B2;NANDINAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +119B3;NANDINAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +119B4;NANDINAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +119B5;NANDINAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +119B6;NANDINAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +119B7;NANDINAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +119B8;NANDINAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +119B9;NANDINAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +119BA;NANDINAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +119BB;NANDINAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +119BC;NANDINAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +119BD;NANDINAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +119BE;NANDINAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +119BF;NANDINAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +119C0;NANDINAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +119C1;NANDINAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +119C2;NANDINAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +119C3;NANDINAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +119C4;NANDINAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +119C5;NANDINAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +119C6;NANDINAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +119C7;NANDINAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +119C8;NANDINAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +119C9;NANDINAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +119CA;NANDINAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +119CB;NANDINAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +119CC;NANDINAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +119CD;NANDINAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +119CE;NANDINAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +119CF;NANDINAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +119D0;NANDINAGARI LETTER RRA;Lo;0;L;;;;;N;;;;; +119D1;NANDINAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +119D2;NANDINAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +119D3;NANDINAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +119D4;NANDINAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +119D5;NANDINAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +119D6;NANDINAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +119D7;NANDINAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +119DA;NANDINAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +119DB;NANDINAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +119DC;NANDINAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +119DD;NANDINAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +119DE;NANDINAGARI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +119DF;NANDINAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +119E0;NANDINAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +119E1;NANDINAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +119E2;NANDINAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +119E3;NANDINAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +119E4;NANDINAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +11A00;ZANABAZAR SQUARE LETTER A;Lo;0;L;;;;;N;;;;; +11A01;ZANABAZAR SQUARE VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11A02;ZANABAZAR SQUARE VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11A03;ZANABAZAR SQUARE VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11A04;ZANABAZAR SQUARE VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11A05;ZANABAZAR SQUARE VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11A06;ZANABAZAR SQUARE VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11A07;ZANABAZAR SQUARE VOWEL SIGN AI;Mn;0;L;;;;;N;;;;; +11A08;ZANABAZAR SQUARE VOWEL SIGN AU;Mn;0;L;;;;;N;;;;; +11A09;ZANABAZAR SQUARE VOWEL SIGN REVERSED I;Mn;0;NSM;;;;;N;;;;; +11A0A;ZANABAZAR SQUARE VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +11A0B;ZANABAZAR SQUARE LETTER KA;Lo;0;L;;;;;N;;;;; +11A0C;ZANABAZAR SQUARE LETTER KHA;Lo;0;L;;;;;N;;;;; +11A0D;ZANABAZAR SQUARE LETTER GA;Lo;0;L;;;;;N;;;;; +11A0E;ZANABAZAR SQUARE LETTER GHA;Lo;0;L;;;;;N;;;;; +11A0F;ZANABAZAR SQUARE LETTER NGA;Lo;0;L;;;;;N;;;;; +11A10;ZANABAZAR SQUARE LETTER CA;Lo;0;L;;;;;N;;;;; +11A11;ZANABAZAR SQUARE LETTER CHA;Lo;0;L;;;;;N;;;;; +11A12;ZANABAZAR SQUARE LETTER JA;Lo;0;L;;;;;N;;;;; +11A13;ZANABAZAR SQUARE LETTER NYA;Lo;0;L;;;;;N;;;;; +11A14;ZANABAZAR SQUARE LETTER TTA;Lo;0;L;;;;;N;;;;; +11A15;ZANABAZAR SQUARE LETTER TTHA;Lo;0;L;;;;;N;;;;; +11A16;ZANABAZAR SQUARE LETTER DDA;Lo;0;L;;;;;N;;;;; +11A17;ZANABAZAR SQUARE LETTER DDHA;Lo;0;L;;;;;N;;;;; +11A18;ZANABAZAR SQUARE LETTER NNA;Lo;0;L;;;;;N;;;;; +11A19;ZANABAZAR SQUARE LETTER TA;Lo;0;L;;;;;N;;;;; +11A1A;ZANABAZAR SQUARE LETTER THA;Lo;0;L;;;;;N;;;;; +11A1B;ZANABAZAR SQUARE LETTER DA;Lo;0;L;;;;;N;;;;; +11A1C;ZANABAZAR SQUARE LETTER DHA;Lo;0;L;;;;;N;;;;; +11A1D;ZANABAZAR SQUARE LETTER NA;Lo;0;L;;;;;N;;;;; +11A1E;ZANABAZAR SQUARE LETTER PA;Lo;0;L;;;;;N;;;;; +11A1F;ZANABAZAR SQUARE LETTER PHA;Lo;0;L;;;;;N;;;;; +11A20;ZANABAZAR SQUARE LETTER BA;Lo;0;L;;;;;N;;;;; +11A21;ZANABAZAR SQUARE LETTER BHA;Lo;0;L;;;;;N;;;;; +11A22;ZANABAZAR SQUARE LETTER MA;Lo;0;L;;;;;N;;;;; +11A23;ZANABAZAR SQUARE LETTER TSA;Lo;0;L;;;;;N;;;;; +11A24;ZANABAZAR SQUARE LETTER TSHA;Lo;0;L;;;;;N;;;;; +11A25;ZANABAZAR SQUARE LETTER DZA;Lo;0;L;;;;;N;;;;; +11A26;ZANABAZAR SQUARE LETTER DZHA;Lo;0;L;;;;;N;;;;; +11A27;ZANABAZAR SQUARE LETTER ZHA;Lo;0;L;;;;;N;;;;; +11A28;ZANABAZAR SQUARE LETTER ZA;Lo;0;L;;;;;N;;;;; +11A29;ZANABAZAR SQUARE LETTER -A;Lo;0;L;;;;;N;;;;; +11A2A;ZANABAZAR SQUARE LETTER YA;Lo;0;L;;;;;N;;;;; +11A2B;ZANABAZAR SQUARE LETTER RA;Lo;0;L;;;;;N;;;;; +11A2C;ZANABAZAR SQUARE LETTER LA;Lo;0;L;;;;;N;;;;; +11A2D;ZANABAZAR SQUARE LETTER VA;Lo;0;L;;;;;N;;;;; +11A2E;ZANABAZAR SQUARE LETTER SHA;Lo;0;L;;;;;N;;;;; +11A2F;ZANABAZAR SQUARE LETTER SSA;Lo;0;L;;;;;N;;;;; +11A30;ZANABAZAR SQUARE LETTER SA;Lo;0;L;;;;;N;;;;; +11A31;ZANABAZAR SQUARE LETTER HA;Lo;0;L;;;;;N;;;;; +11A32;ZANABAZAR SQUARE LETTER KSSA;Lo;0;L;;;;;N;;;;; +11A33;ZANABAZAR SQUARE FINAL CONSONANT MARK;Mn;0;NSM;;;;;N;;;;; +11A34;ZANABAZAR SQUARE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11A35;ZANABAZAR SQUARE SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11A36;ZANABAZAR SQUARE SIGN CANDRABINDU WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;; +11A37;ZANABAZAR SQUARE SIGN CANDRA WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;; +11A38;ZANABAZAR SQUARE SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11A39;ZANABAZAR SQUARE SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11A3A;ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;; +11A3B;ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA;Mn;0;NSM;;;;;N;;;;; +11A3C;ZANABAZAR SQUARE CLUSTER-FINAL LETTER RA;Mn;0;NSM;;;;;N;;;;; +11A3D;ZANABAZAR SQUARE CLUSTER-FINAL LETTER LA;Mn;0;NSM;;;;;N;;;;; +11A3E;ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA;Mn;0;NSM;;;;;N;;;;; +11A3F;ZANABAZAR SQUARE INITIAL HEAD MARK;Po;0;L;;;;;N;;;;; +11A40;ZANABAZAR SQUARE CLOSING HEAD MARK;Po;0;L;;;;;N;;;;; +11A41;ZANABAZAR SQUARE MARK TSHEG;Po;0;L;;;;;N;;;;; +11A42;ZANABAZAR SQUARE MARK SHAD;Po;0;L;;;;;N;;;;; +11A43;ZANABAZAR SQUARE MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;; +11A44;ZANABAZAR SQUARE MARK LONG TSHEG;Po;0;L;;;;;N;;;;; +11A45;ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;; +11A46;ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;; +11A47;ZANABAZAR SQUARE SUBJOINER;Mn;9;NSM;;;;;N;;;;; +11A50;SOYOMBO LETTER A;Lo;0;L;;;;;N;;;;; +11A51;SOYOMBO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11A52;SOYOMBO VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11A53;SOYOMBO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11A54;SOYOMBO VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11A55;SOYOMBO VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11A56;SOYOMBO VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11A57;SOYOMBO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11A58;SOYOMBO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11A59;SOYOMBO VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11A5A;SOYOMBO VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11A5B;SOYOMBO VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +11A5C;SOYOMBO LETTER KA;Lo;0;L;;;;;N;;;;; +11A5D;SOYOMBO LETTER KHA;Lo;0;L;;;;;N;;;;; +11A5E;SOYOMBO LETTER GA;Lo;0;L;;;;;N;;;;; +11A5F;SOYOMBO LETTER GHA;Lo;0;L;;;;;N;;;;; +11A60;SOYOMBO LETTER NGA;Lo;0;L;;;;;N;;;;; +11A61;SOYOMBO LETTER CA;Lo;0;L;;;;;N;;;;; +11A62;SOYOMBO LETTER CHA;Lo;0;L;;;;;N;;;;; +11A63;SOYOMBO LETTER JA;Lo;0;L;;;;;N;;;;; +11A64;SOYOMBO LETTER JHA;Lo;0;L;;;;;N;;;;; +11A65;SOYOMBO LETTER NYA;Lo;0;L;;;;;N;;;;; +11A66;SOYOMBO LETTER TTA;Lo;0;L;;;;;N;;;;; +11A67;SOYOMBO LETTER TTHA;Lo;0;L;;;;;N;;;;; +11A68;SOYOMBO LETTER DDA;Lo;0;L;;;;;N;;;;; +11A69;SOYOMBO LETTER DDHA;Lo;0;L;;;;;N;;;;; +11A6A;SOYOMBO LETTER NNA;Lo;0;L;;;;;N;;;;; +11A6B;SOYOMBO LETTER TA;Lo;0;L;;;;;N;;;;; +11A6C;SOYOMBO LETTER THA;Lo;0;L;;;;;N;;;;; +11A6D;SOYOMBO LETTER DA;Lo;0;L;;;;;N;;;;; +11A6E;SOYOMBO LETTER DHA;Lo;0;L;;;;;N;;;;; +11A6F;SOYOMBO LETTER NA;Lo;0;L;;;;;N;;;;; +11A70;SOYOMBO LETTER PA;Lo;0;L;;;;;N;;;;; +11A71;SOYOMBO LETTER PHA;Lo;0;L;;;;;N;;;;; +11A72;SOYOMBO LETTER BA;Lo;0;L;;;;;N;;;;; +11A73;SOYOMBO LETTER BHA;Lo;0;L;;;;;N;;;;; +11A74;SOYOMBO LETTER MA;Lo;0;L;;;;;N;;;;; +11A75;SOYOMBO LETTER TSA;Lo;0;L;;;;;N;;;;; +11A76;SOYOMBO LETTER TSHA;Lo;0;L;;;;;N;;;;; +11A77;SOYOMBO LETTER DZA;Lo;0;L;;;;;N;;;;; +11A78;SOYOMBO LETTER ZHA;Lo;0;L;;;;;N;;;;; +11A79;SOYOMBO LETTER ZA;Lo;0;L;;;;;N;;;;; +11A7A;SOYOMBO LETTER -A;Lo;0;L;;;;;N;;;;; +11A7B;SOYOMBO LETTER YA;Lo;0;L;;;;;N;;;;; +11A7C;SOYOMBO LETTER RA;Lo;0;L;;;;;N;;;;; +11A7D;SOYOMBO LETTER LA;Lo;0;L;;;;;N;;;;; +11A7E;SOYOMBO LETTER VA;Lo;0;L;;;;;N;;;;; +11A7F;SOYOMBO LETTER SHA;Lo;0;L;;;;;N;;;;; +11A80;SOYOMBO LETTER SSA;Lo;0;L;;;;;N;;;;; +11A81;SOYOMBO LETTER SA;Lo;0;L;;;;;N;;;;; +11A82;SOYOMBO LETTER HA;Lo;0;L;;;;;N;;;;; +11A83;SOYOMBO LETTER KSSA;Lo;0;L;;;;;N;;;;; +11A84;SOYOMBO SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11A85;SOYOMBO SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11A86;SOYOMBO CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;; +11A87;SOYOMBO CLUSTER-INITIAL LETTER LA;Lo;0;L;;;;;N;;;;; +11A88;SOYOMBO CLUSTER-INITIAL LETTER SHA;Lo;0;L;;;;;N;;;;; +11A89;SOYOMBO CLUSTER-INITIAL LETTER SA;Lo;0;L;;;;;N;;;;; +11A8A;SOYOMBO FINAL CONSONANT SIGN G;Mn;0;NSM;;;;;N;;;;; +11A8B;SOYOMBO FINAL CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +11A8C;SOYOMBO FINAL CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +11A8D;SOYOMBO FINAL CONSONANT SIGN D;Mn;0;NSM;;;;;N;;;;; +11A8E;SOYOMBO FINAL CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +11A8F;SOYOMBO FINAL CONSONANT SIGN B;Mn;0;NSM;;;;;N;;;;; +11A90;SOYOMBO FINAL CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +11A91;SOYOMBO FINAL CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +11A92;SOYOMBO FINAL CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +11A93;SOYOMBO FINAL CONSONANT SIGN SH;Mn;0;NSM;;;;;N;;;;; +11A94;SOYOMBO FINAL CONSONANT SIGN S;Mn;0;NSM;;;;;N;;;;; +11A95;SOYOMBO FINAL CONSONANT SIGN -A;Mn;0;NSM;;;;;N;;;;; +11A96;SOYOMBO SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11A97;SOYOMBO SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11A98;SOYOMBO GEMINATION MARK;Mn;0;NSM;;;;;N;;;;; +11A99;SOYOMBO SUBJOINER;Mn;9;NSM;;;;;N;;;;; +11A9A;SOYOMBO MARK TSHEG;Po;0;L;;;;;N;;;;; +11A9B;SOYOMBO MARK SHAD;Po;0;L;;;;;N;;;;; +11A9C;SOYOMBO MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;; +11A9D;SOYOMBO MARK PLUTA;Lo;0;L;;;;;N;;;;; +11A9E;SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME;Po;0;L;;;;;N;;;;; +11A9F;SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME;Po;0;L;;;;;N;;;;; +11AA0;SOYOMBO HEAD MARK WITH MOON AND SUN;Po;0;L;;;;;N;;;;; +11AA1;SOYOMBO TERMINAL MARK-1;Po;0;L;;;;;N;;;;; +11AA2;SOYOMBO TERMINAL MARK-2;Po;0;L;;;;;N;;;;; +11AB0;CANADIAN SYLLABICS NATTILIK HI;Lo;0;L;;;;;N;;;;; +11AB1;CANADIAN SYLLABICS NATTILIK HII;Lo;0;L;;;;;N;;;;; +11AB2;CANADIAN SYLLABICS NATTILIK HO;Lo;0;L;;;;;N;;;;; +11AB3;CANADIAN SYLLABICS NATTILIK HOO;Lo;0;L;;;;;N;;;;; +11AB4;CANADIAN SYLLABICS NATTILIK HA;Lo;0;L;;;;;N;;;;; +11AB5;CANADIAN SYLLABICS NATTILIK HAA;Lo;0;L;;;;;N;;;;; +11AB6;CANADIAN SYLLABICS NATTILIK SHRI;Lo;0;L;;;;;N;;;;; +11AB7;CANADIAN SYLLABICS NATTILIK SHRII;Lo;0;L;;;;;N;;;;; +11AB8;CANADIAN SYLLABICS NATTILIK SHRO;Lo;0;L;;;;;N;;;;; +11AB9;CANADIAN SYLLABICS NATTILIK SHROO;Lo;0;L;;;;;N;;;;; +11ABA;CANADIAN SYLLABICS NATTILIK SHRA;Lo;0;L;;;;;N;;;;; +11ABB;CANADIAN SYLLABICS NATTILIK SHRAA;Lo;0;L;;;;;N;;;;; +11ABC;CANADIAN SYLLABICS SPE;Lo;0;L;;;;;N;;;;; +11ABD;CANADIAN SYLLABICS SPI;Lo;0;L;;;;;N;;;;; +11ABE;CANADIAN SYLLABICS SPO;Lo;0;L;;;;;N;;;;; +11ABF;CANADIAN SYLLABICS SPA;Lo;0;L;;;;;N;;;;; +11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;; +11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;; +11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;; +11AC3;PAU CIN HAU LETTER MA;Lo;0;L;;;;;N;;;;; +11AC4;PAU CIN HAU LETTER DA;Lo;0;L;;;;;N;;;;; +11AC5;PAU CIN HAU LETTER ZA;Lo;0;L;;;;;N;;;;; +11AC6;PAU CIN HAU LETTER VA;Lo;0;L;;;;;N;;;;; +11AC7;PAU CIN HAU LETTER NGA;Lo;0;L;;;;;N;;;;; +11AC8;PAU CIN HAU LETTER HA;Lo;0;L;;;;;N;;;;; +11AC9;PAU CIN HAU LETTER GA;Lo;0;L;;;;;N;;;;; +11ACA;PAU CIN HAU LETTER KHA;Lo;0;L;;;;;N;;;;; +11ACB;PAU CIN HAU LETTER SA;Lo;0;L;;;;;N;;;;; +11ACC;PAU CIN HAU LETTER BA;Lo;0;L;;;;;N;;;;; +11ACD;PAU CIN HAU LETTER CA;Lo;0;L;;;;;N;;;;; +11ACE;PAU CIN HAU LETTER TA;Lo;0;L;;;;;N;;;;; +11ACF;PAU CIN HAU LETTER THA;Lo;0;L;;;;;N;;;;; +11AD0;PAU CIN HAU LETTER NA;Lo;0;L;;;;;N;;;;; +11AD1;PAU CIN HAU LETTER PHA;Lo;0;L;;;;;N;;;;; +11AD2;PAU CIN HAU LETTER RA;Lo;0;L;;;;;N;;;;; +11AD3;PAU CIN HAU LETTER FA;Lo;0;L;;;;;N;;;;; +11AD4;PAU CIN HAU LETTER CHA;Lo;0;L;;;;;N;;;;; +11AD5;PAU CIN HAU LETTER A;Lo;0;L;;;;;N;;;;; +11AD6;PAU CIN HAU LETTER E;Lo;0;L;;;;;N;;;;; +11AD7;PAU CIN HAU LETTER I;Lo;0;L;;;;;N;;;;; +11AD8;PAU CIN HAU LETTER O;Lo;0;L;;;;;N;;;;; +11AD9;PAU CIN HAU LETTER U;Lo;0;L;;;;;N;;;;; +11ADA;PAU CIN HAU LETTER UA;Lo;0;L;;;;;N;;;;; +11ADB;PAU CIN HAU LETTER IA;Lo;0;L;;;;;N;;;;; +11ADC;PAU CIN HAU LETTER FINAL P;Lo;0;L;;;;;N;;;;; +11ADD;PAU CIN HAU LETTER FINAL K;Lo;0;L;;;;;N;;;;; +11ADE;PAU CIN HAU LETTER FINAL T;Lo;0;L;;;;;N;;;;; +11ADF;PAU CIN HAU LETTER FINAL M;Lo;0;L;;;;;N;;;;; +11AE0;PAU CIN HAU LETTER FINAL N;Lo;0;L;;;;;N;;;;; +11AE1;PAU CIN HAU LETTER FINAL L;Lo;0;L;;;;;N;;;;; +11AE2;PAU CIN HAU LETTER FINAL W;Lo;0;L;;;;;N;;;;; +11AE3;PAU CIN HAU LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +11AE4;PAU CIN HAU LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +11AE5;PAU CIN HAU RISING TONE LONG;Lo;0;L;;;;;N;;;;; +11AE6;PAU CIN HAU RISING TONE;Lo;0;L;;;;;N;;;;; +11AE7;PAU CIN HAU SANDHI GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AE8;PAU CIN HAU RISING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AE9;PAU CIN HAU RISING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEA;PAU CIN HAU SANDHI GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +11AEB;PAU CIN HAU SANDHI TONE LONG;Lo;0;L;;;;;N;;;;; +11AEC;PAU CIN HAU SANDHI TONE;Lo;0;L;;;;;N;;;;; +11AED;PAU CIN HAU SANDHI TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AEE;PAU CIN HAU SANDHI TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEF;PAU CIN HAU MID-LEVEL TONE;Lo;0;L;;;;;N;;;;; +11AF0;PAU CIN HAU GLOTTAL STOP VARIANT;Lo;0;L;;;;;N;;;;; +11AF1;PAU CIN HAU MID-LEVEL TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF2;PAU CIN HAU MID-LEVEL TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF3;PAU CIN HAU LOW-FALLING TONE LONG;Lo;0;L;;;;;N;;;;; +11AF4;PAU CIN HAU LOW-FALLING TONE;Lo;0;L;;;;;N;;;;; +11AF5;PAU CIN HAU GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +11B00;DEVANAGARI HEAD MARK;Po;0;L;;;;;N;;;;; +11B01;DEVANAGARI HEAD MARK WITH HEADSTROKE;Po;0;L;;;;;N;;;;; +11B02;DEVANAGARI SIGN BHALE;Po;0;L;;;;;N;;;;; +11B03;DEVANAGARI SIGN BHALE WITH HOOK;Po;0;L;;;;;N;;;;; +11B04;DEVANAGARI SIGN EXTENDED BHALE;Po;0;L;;;;;N;;;;; +11B05;DEVANAGARI SIGN EXTENDED BHALE WITH HOOK;Po;0;L;;;;;N;;;;; +11B06;DEVANAGARI SIGN WESTERN FIVE-LIKE BHALE;Po;0;L;;;;;N;;;;; +11B07;DEVANAGARI SIGN WESTERN NINE-LIKE BHALE;Po;0;L;;;;;N;;;;; +11B08;DEVANAGARI SIGN REVERSED NINE-LIKE BHALE;Po;0;L;;;;;N;;;;; +11B09;DEVANAGARI SIGN MINDU;Po;0;L;;;;;N;;;;; +11B60;SHARADA VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11B61;SHARADA VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; +11B62;SHARADA VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11B63;SHARADA VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +11B64;SHARADA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +11B65;SHARADA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +11B66;SHARADA VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +11B67;SHARADA VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +11BC0;SUNUWAR LETTER DEVI;Lo;0;L;;;;;N;;;;; +11BC1;SUNUWAR LETTER TASLA;Lo;0;L;;;;;N;;;;; +11BC2;SUNUWAR LETTER EKO;Lo;0;L;;;;;N;;;;; +11BC3;SUNUWAR LETTER IMAR;Lo;0;L;;;;;N;;;;; +11BC4;SUNUWAR LETTER REU;Lo;0;L;;;;;N;;;;; +11BC5;SUNUWAR LETTER UTTHI;Lo;0;L;;;;;N;;;;; +11BC6;SUNUWAR LETTER KIK;Lo;0;L;;;;;N;;;;; +11BC7;SUNUWAR LETTER MA;Lo;0;L;;;;;N;;;;; +11BC8;SUNUWAR LETTER APPHO;Lo;0;L;;;;;N;;;;; +11BC9;SUNUWAR LETTER PIP;Lo;0;L;;;;;N;;;;; +11BCA;SUNUWAR LETTER GIL;Lo;0;L;;;;;N;;;;; +11BCB;SUNUWAR LETTER HAMSO;Lo;0;L;;;;;N;;;;; +11BCC;SUNUWAR LETTER CARMI;Lo;0;L;;;;;N;;;;; +11BCD;SUNUWAR LETTER NAH;Lo;0;L;;;;;N;;;;; +11BCE;SUNUWAR LETTER BUR;Lo;0;L;;;;;N;;;;; +11BCF;SUNUWAR LETTER JYAH;Lo;0;L;;;;;N;;;;; +11BD0;SUNUWAR LETTER LOACHA;Lo;0;L;;;;;N;;;;; +11BD1;SUNUWAR LETTER OTTHI;Lo;0;L;;;;;N;;;;; +11BD2;SUNUWAR LETTER SHYELE;Lo;0;L;;;;;N;;;;; +11BD3;SUNUWAR LETTER VARCA;Lo;0;L;;;;;N;;;;; +11BD4;SUNUWAR LETTER YAT;Lo;0;L;;;;;N;;;;; +11BD5;SUNUWAR LETTER AVA;Lo;0;L;;;;;N;;;;; +11BD6;SUNUWAR LETTER AAL;Lo;0;L;;;;;N;;;;; +11BD7;SUNUWAR LETTER DONGA;Lo;0;L;;;;;N;;;;; +11BD8;SUNUWAR LETTER THARI;Lo;0;L;;;;;N;;;;; +11BD9;SUNUWAR LETTER PHAR;Lo;0;L;;;;;N;;;;; +11BDA;SUNUWAR LETTER NGAR;Lo;0;L;;;;;N;;;;; +11BDB;SUNUWAR LETTER KHA;Lo;0;L;;;;;N;;;;; +11BDC;SUNUWAR LETTER SHYER;Lo;0;L;;;;;N;;;;; +11BDD;SUNUWAR LETTER CHELAP;Lo;0;L;;;;;N;;;;; +11BDE;SUNUWAR LETTER TENTU;Lo;0;L;;;;;N;;;;; +11BDF;SUNUWAR LETTER THELE;Lo;0;L;;;;;N;;;;; +11BE0;SUNUWAR LETTER KLOKO;Lo;0;L;;;;;N;;;;; +11BE1;SUNUWAR SIGN PVO;Po;0;L;;;;;N;;;;; +11BF0;SUNUWAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11BF1;SUNUWAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11BF2;SUNUWAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11BF3;SUNUWAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11BF4;SUNUWAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11BF5;SUNUWAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11BF6;SUNUWAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11BF7;SUNUWAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11BF8;SUNUWAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11BF9;SUNUWAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11C00;BHAIKSUKI LETTER A;Lo;0;L;;;;;N;;;;; +11C01;BHAIKSUKI LETTER AA;Lo;0;L;;;;;N;;;;; +11C02;BHAIKSUKI LETTER I;Lo;0;L;;;;;N;;;;; +11C03;BHAIKSUKI LETTER II;Lo;0;L;;;;;N;;;;; +11C04;BHAIKSUKI LETTER U;Lo;0;L;;;;;N;;;;; +11C05;BHAIKSUKI LETTER UU;Lo;0;L;;;;;N;;;;; +11C06;BHAIKSUKI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11C07;BHAIKSUKI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11C08;BHAIKSUKI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11C0A;BHAIKSUKI LETTER E;Lo;0;L;;;;;N;;;;; +11C0B;BHAIKSUKI LETTER AI;Lo;0;L;;;;;N;;;;; +11C0C;BHAIKSUKI LETTER O;Lo;0;L;;;;;N;;;;; +11C0D;BHAIKSUKI LETTER AU;Lo;0;L;;;;;N;;;;; +11C0E;BHAIKSUKI LETTER KA;Lo;0;L;;;;;N;;;;; +11C0F;BHAIKSUKI LETTER KHA;Lo;0;L;;;;;N;;;;; +11C10;BHAIKSUKI LETTER GA;Lo;0;L;;;;;N;;;;; +11C11;BHAIKSUKI LETTER GHA;Lo;0;L;;;;;N;;;;; +11C12;BHAIKSUKI LETTER NGA;Lo;0;L;;;;;N;;;;; +11C13;BHAIKSUKI LETTER CA;Lo;0;L;;;;;N;;;;; +11C14;BHAIKSUKI LETTER CHA;Lo;0;L;;;;;N;;;;; +11C15;BHAIKSUKI LETTER JA;Lo;0;L;;;;;N;;;;; +11C16;BHAIKSUKI LETTER JHA;Lo;0;L;;;;;N;;;;; +11C17;BHAIKSUKI LETTER NYA;Lo;0;L;;;;;N;;;;; +11C18;BHAIKSUKI LETTER TTA;Lo;0;L;;;;;N;;;;; +11C19;BHAIKSUKI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11C1A;BHAIKSUKI LETTER DDA;Lo;0;L;;;;;N;;;;; +11C1B;BHAIKSUKI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11C1C;BHAIKSUKI LETTER NNA;Lo;0;L;;;;;N;;;;; +11C1D;BHAIKSUKI LETTER TA;Lo;0;L;;;;;N;;;;; +11C1E;BHAIKSUKI LETTER THA;Lo;0;L;;;;;N;;;;; +11C1F;BHAIKSUKI LETTER DA;Lo;0;L;;;;;N;;;;; +11C20;BHAIKSUKI LETTER DHA;Lo;0;L;;;;;N;;;;; +11C21;BHAIKSUKI LETTER NA;Lo;0;L;;;;;N;;;;; +11C22;BHAIKSUKI LETTER PA;Lo;0;L;;;;;N;;;;; +11C23;BHAIKSUKI LETTER PHA;Lo;0;L;;;;;N;;;;; +11C24;BHAIKSUKI LETTER BA;Lo;0;L;;;;;N;;;;; +11C25;BHAIKSUKI LETTER BHA;Lo;0;L;;;;;N;;;;; +11C26;BHAIKSUKI LETTER MA;Lo;0;L;;;;;N;;;;; +11C27;BHAIKSUKI LETTER YA;Lo;0;L;;;;;N;;;;; +11C28;BHAIKSUKI LETTER RA;Lo;0;L;;;;;N;;;;; +11C29;BHAIKSUKI LETTER LA;Lo;0;L;;;;;N;;;;; +11C2A;BHAIKSUKI LETTER VA;Lo;0;L;;;;;N;;;;; +11C2B;BHAIKSUKI LETTER SHA;Lo;0;L;;;;;N;;;;; +11C2C;BHAIKSUKI LETTER SSA;Lo;0;L;;;;;N;;;;; +11C2D;BHAIKSUKI LETTER SA;Lo;0;L;;;;;N;;;;; +11C2E;BHAIKSUKI LETTER HA;Lo;0;L;;;;;N;;;;; +11C2F;BHAIKSUKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11C30;BHAIKSUKI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11C31;BHAIKSUKI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11C32;BHAIKSUKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11C33;BHAIKSUKI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11C34;BHAIKSUKI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11C35;BHAIKSUKI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11C36;BHAIKSUKI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11C38;BHAIKSUKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11C39;BHAIKSUKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11C3A;BHAIKSUKI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11C3B;BHAIKSUKI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11C3C;BHAIKSUKI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11C3D;BHAIKSUKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11C3E;BHAIKSUKI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11C3F;BHAIKSUKI SIGN VIRAMA;Mn;9;L;;;;;N;;;;; +11C40;BHAIKSUKI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +11C41;BHAIKSUKI DANDA;Po;0;L;;;;;N;;;;; +11C42;BHAIKSUKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11C43;BHAIKSUKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; +11C44;BHAIKSUKI GAP FILLER-1;Po;0;L;;;;;N;;;;; +11C45;BHAIKSUKI GAP FILLER-2;Po;0;L;;;;;N;;;;; +11C50;BHAIKSUKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11C51;BHAIKSUKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11C52;BHAIKSUKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11C53;BHAIKSUKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11C54;BHAIKSUKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11C55;BHAIKSUKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11C56;BHAIKSUKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11C57;BHAIKSUKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11C58;BHAIKSUKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11C59;BHAIKSUKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11C5A;BHAIKSUKI NUMBER ONE;No;0;L;;;;1;N;;;;; +11C5B;BHAIKSUKI NUMBER TWO;No;0;L;;;;2;N;;;;; +11C5C;BHAIKSUKI NUMBER THREE;No;0;L;;;;3;N;;;;; +11C5D;BHAIKSUKI NUMBER FOUR;No;0;L;;;;4;N;;;;; +11C5E;BHAIKSUKI NUMBER FIVE;No;0;L;;;;5;N;;;;; +11C5F;BHAIKSUKI NUMBER SIX;No;0;L;;;;6;N;;;;; +11C60;BHAIKSUKI NUMBER SEVEN;No;0;L;;;;7;N;;;;; +11C61;BHAIKSUKI NUMBER EIGHT;No;0;L;;;;8;N;;;;; +11C62;BHAIKSUKI NUMBER NINE;No;0;L;;;;9;N;;;;; +11C63;BHAIKSUKI NUMBER TEN;No;0;L;;;;10;N;;;;; +11C64;BHAIKSUKI NUMBER TWENTY;No;0;L;;;;20;N;;;;; +11C65;BHAIKSUKI NUMBER THIRTY;No;0;L;;;;30;N;;;;; +11C66;BHAIKSUKI NUMBER FORTY;No;0;L;;;;40;N;;;;; +11C67;BHAIKSUKI NUMBER FIFTY;No;0;L;;;;50;N;;;;; +11C68;BHAIKSUKI NUMBER SIXTY;No;0;L;;;;60;N;;;;; +11C69;BHAIKSUKI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +11C6A;BHAIKSUKI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +11C6B;BHAIKSUKI NUMBER NINETY;No;0;L;;;;90;N;;;;; +11C6C;BHAIKSUKI HUNDREDS UNIT MARK;No;0;L;;;;100;N;;;;; +11C70;MARCHEN HEAD MARK;Po;0;L;;;;;N;;;;; +11C71;MARCHEN MARK SHAD;Po;0;L;;;;;N;;;;; +11C72;MARCHEN LETTER KA;Lo;0;L;;;;;N;;;;; +11C73;MARCHEN LETTER KHA;Lo;0;L;;;;;N;;;;; +11C74;MARCHEN LETTER GA;Lo;0;L;;;;;N;;;;; +11C75;MARCHEN LETTER NGA;Lo;0;L;;;;;N;;;;; +11C76;MARCHEN LETTER CA;Lo;0;L;;;;;N;;;;; +11C77;MARCHEN LETTER CHA;Lo;0;L;;;;;N;;;;; +11C78;MARCHEN LETTER JA;Lo;0;L;;;;;N;;;;; +11C79;MARCHEN LETTER NYA;Lo;0;L;;;;;N;;;;; +11C7A;MARCHEN LETTER TA;Lo;0;L;;;;;N;;;;; +11C7B;MARCHEN LETTER THA;Lo;0;L;;;;;N;;;;; +11C7C;MARCHEN LETTER DA;Lo;0;L;;;;;N;;;;; +11C7D;MARCHEN LETTER NA;Lo;0;L;;;;;N;;;;; +11C7E;MARCHEN LETTER PA;Lo;0;L;;;;;N;;;;; +11C7F;MARCHEN LETTER PHA;Lo;0;L;;;;;N;;;;; +11C80;MARCHEN LETTER BA;Lo;0;L;;;;;N;;;;; +11C81;MARCHEN LETTER MA;Lo;0;L;;;;;N;;;;; +11C82;MARCHEN LETTER TSA;Lo;0;L;;;;;N;;;;; +11C83;MARCHEN LETTER TSHA;Lo;0;L;;;;;N;;;;; +11C84;MARCHEN LETTER DZA;Lo;0;L;;;;;N;;;;; +11C85;MARCHEN LETTER WA;Lo;0;L;;;;;N;;;;; +11C86;MARCHEN LETTER ZHA;Lo;0;L;;;;;N;;;;; +11C87;MARCHEN LETTER ZA;Lo;0;L;;;;;N;;;;; +11C88;MARCHEN LETTER -A;Lo;0;L;;;;;N;;;;; +11C89;MARCHEN LETTER YA;Lo;0;L;;;;;N;;;;; +11C8A;MARCHEN LETTER RA;Lo;0;L;;;;;N;;;;; +11C8B;MARCHEN LETTER LA;Lo;0;L;;;;;N;;;;; +11C8C;MARCHEN LETTER SHA;Lo;0;L;;;;;N;;;;; +11C8D;MARCHEN LETTER SA;Lo;0;L;;;;;N;;;;; +11C8E;MARCHEN LETTER HA;Lo;0;L;;;;;N;;;;; +11C8F;MARCHEN LETTER A;Lo;0;L;;;;;N;;;;; +11C92;MARCHEN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +11C93;MARCHEN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +11C94;MARCHEN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +11C95;MARCHEN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +11C96;MARCHEN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +11C97;MARCHEN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +11C98;MARCHEN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +11C99;MARCHEN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +11C9A;MARCHEN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +11C9B;MARCHEN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +11C9C;MARCHEN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +11C9D;MARCHEN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +11C9E;MARCHEN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +11C9F;MARCHEN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +11CA0;MARCHEN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +11CA1;MARCHEN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +11CA2;MARCHEN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +11CA3;MARCHEN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +11CA4;MARCHEN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +11CA5;MARCHEN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +11CA6;MARCHEN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +11CA7;MARCHEN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +11CA9;MARCHEN SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +11CAA;MARCHEN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +11CAB;MARCHEN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +11CAC;MARCHEN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +11CAD;MARCHEN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +11CAE;MARCHEN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +11CAF;MARCHEN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +11CB0;MARCHEN VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11CB1;MARCHEN VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11CB2;MARCHEN VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11CB3;MARCHEN VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11CB4;MARCHEN VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11CB5;MARCHEN SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11CB6;MARCHEN SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11D00;MASARAM GONDI LETTER A;Lo;0;L;;;;;N;;;;; +11D01;MASARAM GONDI LETTER AA;Lo;0;L;;;;;N;;;;; +11D02;MASARAM GONDI LETTER I;Lo;0;L;;;;;N;;;;; +11D03;MASARAM GONDI LETTER II;Lo;0;L;;;;;N;;;;; +11D04;MASARAM GONDI LETTER U;Lo;0;L;;;;;N;;;;; +11D05;MASARAM GONDI LETTER UU;Lo;0;L;;;;;N;;;;; +11D06;MASARAM GONDI LETTER E;Lo;0;L;;;;;N;;;;; +11D08;MASARAM GONDI LETTER AI;Lo;0;L;;;;;N;;;;; +11D09;MASARAM GONDI LETTER O;Lo;0;L;;;;;N;;;;; +11D0B;MASARAM GONDI LETTER AU;Lo;0;L;;;;;N;;;;; +11D0C;MASARAM GONDI LETTER KA;Lo;0;L;;;;;N;;;;; +11D0D;MASARAM GONDI LETTER KHA;Lo;0;L;;;;;N;;;;; +11D0E;MASARAM GONDI LETTER GA;Lo;0;L;;;;;N;;;;; +11D0F;MASARAM GONDI LETTER GHA;Lo;0;L;;;;;N;;;;; +11D10;MASARAM GONDI LETTER NGA;Lo;0;L;;;;;N;;;;; +11D11;MASARAM GONDI LETTER CA;Lo;0;L;;;;;N;;;;; +11D12;MASARAM GONDI LETTER CHA;Lo;0;L;;;;;N;;;;; +11D13;MASARAM GONDI LETTER JA;Lo;0;L;;;;;N;;;;; +11D14;MASARAM GONDI LETTER JHA;Lo;0;L;;;;;N;;;;; +11D15;MASARAM GONDI LETTER NYA;Lo;0;L;;;;;N;;;;; +11D16;MASARAM GONDI LETTER TTA;Lo;0;L;;;;;N;;;;; +11D17;MASARAM GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11D18;MASARAM GONDI LETTER DDA;Lo;0;L;;;;;N;;;;; +11D19;MASARAM GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11D1A;MASARAM GONDI LETTER NNA;Lo;0;L;;;;;N;;;;; +11D1B;MASARAM GONDI LETTER TA;Lo;0;L;;;;;N;;;;; +11D1C;MASARAM GONDI LETTER THA;Lo;0;L;;;;;N;;;;; +11D1D;MASARAM GONDI LETTER DA;Lo;0;L;;;;;N;;;;; +11D1E;MASARAM GONDI LETTER DHA;Lo;0;L;;;;;N;;;;; +11D1F;MASARAM GONDI LETTER NA;Lo;0;L;;;;;N;;;;; +11D20;MASARAM GONDI LETTER PA;Lo;0;L;;;;;N;;;;; +11D21;MASARAM GONDI LETTER PHA;Lo;0;L;;;;;N;;;;; +11D22;MASARAM GONDI LETTER BA;Lo;0;L;;;;;N;;;;; +11D23;MASARAM GONDI LETTER BHA;Lo;0;L;;;;;N;;;;; +11D24;MASARAM GONDI LETTER MA;Lo;0;L;;;;;N;;;;; +11D25;MASARAM GONDI LETTER YA;Lo;0;L;;;;;N;;;;; +11D26;MASARAM GONDI LETTER RA;Lo;0;L;;;;;N;;;;; +11D27;MASARAM GONDI LETTER LA;Lo;0;L;;;;;N;;;;; +11D28;MASARAM GONDI LETTER VA;Lo;0;L;;;;;N;;;;; +11D29;MASARAM GONDI LETTER SHA;Lo;0;L;;;;;N;;;;; +11D2A;MASARAM GONDI LETTER SSA;Lo;0;L;;;;;N;;;;; +11D2B;MASARAM GONDI LETTER SA;Lo;0;L;;;;;N;;;;; +11D2C;MASARAM GONDI LETTER HA;Lo;0;L;;;;;N;;;;; +11D2D;MASARAM GONDI LETTER LLA;Lo;0;L;;;;;N;;;;; +11D2E;MASARAM GONDI LETTER KSSA;Lo;0;L;;;;;N;;;;; +11D2F;MASARAM GONDI LETTER JNYA;Lo;0;L;;;;;N;;;;; +11D30;MASARAM GONDI LETTER TRA;Lo;0;L;;;;;N;;;;; +11D31;MASARAM GONDI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11D32;MASARAM GONDI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11D33;MASARAM GONDI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11D34;MASARAM GONDI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11D35;MASARAM GONDI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11D36;MASARAM GONDI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11D3A;MASARAM GONDI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11D3C;MASARAM GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11D3D;MASARAM GONDI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11D3F;MASARAM GONDI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11D40;MASARAM GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11D41;MASARAM GONDI SIGN VISARGA;Mn;0;NSM;;;;;N;;;;; +11D42;MASARAM GONDI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11D43;MASARAM GONDI SIGN CANDRA;Mn;0;NSM;;;;;N;;;;; +11D44;MASARAM GONDI SIGN HALANTA;Mn;9;NSM;;;;;N;;;;; +11D45;MASARAM GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11D46;MASARAM GONDI REPHA;Lo;0;L;;;;;N;;;;; +11D47;MASARAM GONDI RA-KARA;Mn;0;NSM;;;;;N;;;;; +11D50;MASARAM GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11D51;MASARAM GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11D52;MASARAM GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11D53;MASARAM GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11D54;MASARAM GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11D55;MASARAM GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11D56;MASARAM GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11D57;MASARAM GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11D58;MASARAM GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11D59;MASARAM GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11D60;GUNJALA GONDI LETTER A;Lo;0;L;;;;;N;;;;; +11D61;GUNJALA GONDI LETTER AA;Lo;0;L;;;;;N;;;;; +11D62;GUNJALA GONDI LETTER I;Lo;0;L;;;;;N;;;;; +11D63;GUNJALA GONDI LETTER II;Lo;0;L;;;;;N;;;;; +11D64;GUNJALA GONDI LETTER U;Lo;0;L;;;;;N;;;;; +11D65;GUNJALA GONDI LETTER UU;Lo;0;L;;;;;N;;;;; +11D67;GUNJALA GONDI LETTER EE;Lo;0;L;;;;;N;;;;; +11D68;GUNJALA GONDI LETTER AI;Lo;0;L;;;;;N;;;;; +11D6A;GUNJALA GONDI LETTER OO;Lo;0;L;;;;;N;;;;; +11D6B;GUNJALA GONDI LETTER AU;Lo;0;L;;;;;N;;;;; +11D6C;GUNJALA GONDI LETTER YA;Lo;0;L;;;;;N;;;;; +11D6D;GUNJALA GONDI LETTER VA;Lo;0;L;;;;;N;;;;; +11D6E;GUNJALA GONDI LETTER BA;Lo;0;L;;;;;N;;;;; +11D6F;GUNJALA GONDI LETTER BHA;Lo;0;L;;;;;N;;;;; +11D70;GUNJALA GONDI LETTER MA;Lo;0;L;;;;;N;;;;; +11D71;GUNJALA GONDI LETTER KA;Lo;0;L;;;;;N;;;;; +11D72;GUNJALA GONDI LETTER KHA;Lo;0;L;;;;;N;;;;; +11D73;GUNJALA GONDI LETTER TA;Lo;0;L;;;;;N;;;;; +11D74;GUNJALA GONDI LETTER THA;Lo;0;L;;;;;N;;;;; +11D75;GUNJALA GONDI LETTER LA;Lo;0;L;;;;;N;;;;; +11D76;GUNJALA GONDI LETTER GA;Lo;0;L;;;;;N;;;;; +11D77;GUNJALA GONDI LETTER GHA;Lo;0;L;;;;;N;;;;; +11D78;GUNJALA GONDI LETTER DA;Lo;0;L;;;;;N;;;;; +11D79;GUNJALA GONDI LETTER DHA;Lo;0;L;;;;;N;;;;; +11D7A;GUNJALA GONDI LETTER NA;Lo;0;L;;;;;N;;;;; +11D7B;GUNJALA GONDI LETTER CA;Lo;0;L;;;;;N;;;;; +11D7C;GUNJALA GONDI LETTER CHA;Lo;0;L;;;;;N;;;;; +11D7D;GUNJALA GONDI LETTER TTA;Lo;0;L;;;;;N;;;;; +11D7E;GUNJALA GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11D7F;GUNJALA GONDI LETTER LLA;Lo;0;L;;;;;N;;;;; +11D80;GUNJALA GONDI LETTER JA;Lo;0;L;;;;;N;;;;; +11D81;GUNJALA GONDI LETTER JHA;Lo;0;L;;;;;N;;;;; +11D82;GUNJALA GONDI LETTER DDA;Lo;0;L;;;;;N;;;;; +11D83;GUNJALA GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11D84;GUNJALA GONDI LETTER NGA;Lo;0;L;;;;;N;;;;; +11D85;GUNJALA GONDI LETTER PA;Lo;0;L;;;;;N;;;;; +11D86;GUNJALA GONDI LETTER PHA;Lo;0;L;;;;;N;;;;; +11D87;GUNJALA GONDI LETTER HA;Lo;0;L;;;;;N;;;;; +11D88;GUNJALA GONDI LETTER RA;Lo;0;L;;;;;N;;;;; +11D89;GUNJALA GONDI LETTER SA;Lo;0;L;;;;;N;;;;; +11D8A;GUNJALA GONDI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11D8B;GUNJALA GONDI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11D8C;GUNJALA GONDI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11D8D;GUNJALA GONDI VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11D8E;GUNJALA GONDI VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11D90;GUNJALA GONDI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +11D91;GUNJALA GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11D93;GUNJALA GONDI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +11D94;GUNJALA GONDI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11D95;GUNJALA GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11D96;GUNJALA GONDI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11D97;GUNJALA GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11D98;GUNJALA GONDI OM;Lo;0;L;;;;;N;;;;; +11DA0;GUNJALA GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11DA1;GUNJALA GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11DA2;GUNJALA GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11DA3;GUNJALA GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11DA4;GUNJALA GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11DA5;GUNJALA GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11DA6;GUNJALA GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11DA7;GUNJALA GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11DA8;GUNJALA GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11DA9;GUNJALA GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11DB0;TOLONG SIKI LETTER I;Lo;0;L;;;;;N;;;;; +11DB1;TOLONG SIKI LETTER E;Lo;0;L;;;;;N;;;;; +11DB2;TOLONG SIKI LETTER U;Lo;0;L;;;;;N;;;;; +11DB3;TOLONG SIKI LETTER O;Lo;0;L;;;;;N;;;;; +11DB4;TOLONG SIKI LETTER A;Lo;0;L;;;;;N;;;;; +11DB5;TOLONG SIKI LETTER AA;Lo;0;L;;;;;N;;;;; +11DB6;TOLONG SIKI LETTER P;Lo;0;L;;;;;N;;;;; +11DB7;TOLONG SIKI LETTER PH;Lo;0;L;;;;;N;;;;; +11DB8;TOLONG SIKI LETTER B;Lo;0;L;;;;;N;;;;; +11DB9;TOLONG SIKI LETTER BH;Lo;0;L;;;;;N;;;;; +11DBA;TOLONG SIKI LETTER M;Lo;0;L;;;;;N;;;;; +11DBB;TOLONG SIKI LETTER T;Lo;0;L;;;;;N;;;;; +11DBC;TOLONG SIKI LETTER TH;Lo;0;L;;;;;N;;;;; +11DBD;TOLONG SIKI LETTER D;Lo;0;L;;;;;N;;;;; +11DBE;TOLONG SIKI LETTER DH;Lo;0;L;;;;;N;;;;; +11DBF;TOLONG SIKI LETTER N;Lo;0;L;;;;;N;;;;; +11DC0;TOLONG SIKI LETTER TT;Lo;0;L;;;;;N;;;;; +11DC1;TOLONG SIKI LETTER TTH;Lo;0;L;;;;;N;;;;; +11DC2;TOLONG SIKI LETTER DD;Lo;0;L;;;;;N;;;;; +11DC3;TOLONG SIKI LETTER DDH;Lo;0;L;;;;;N;;;;; +11DC4;TOLONG SIKI LETTER NN;Lo;0;L;;;;;N;;;;; +11DC5;TOLONG SIKI LETTER C;Lo;0;L;;;;;N;;;;; +11DC6;TOLONG SIKI LETTER CH;Lo;0;L;;;;;N;;;;; +11DC7;TOLONG SIKI LETTER J;Lo;0;L;;;;;N;;;;; +11DC8;TOLONG SIKI LETTER JH;Lo;0;L;;;;;N;;;;; +11DC9;TOLONG SIKI LETTER NY;Lo;0;L;;;;;N;;;;; +11DCA;TOLONG SIKI LETTER K;Lo;0;L;;;;;N;;;;; +11DCB;TOLONG SIKI LETTER KH;Lo;0;L;;;;;N;;;;; +11DCC;TOLONG SIKI LETTER G;Lo;0;L;;;;;N;;;;; +11DCD;TOLONG SIKI LETTER GH;Lo;0;L;;;;;N;;;;; +11DCE;TOLONG SIKI LETTER NG;Lo;0;L;;;;;N;;;;; +11DCF;TOLONG SIKI LETTER Y;Lo;0;L;;;;;N;;;;; +11DD0;TOLONG SIKI LETTER R;Lo;0;L;;;;;N;;;;; +11DD1;TOLONG SIKI LETTER L;Lo;0;L;;;;;N;;;;; +11DD2;TOLONG SIKI LETTER V;Lo;0;L;;;;;N;;;;; +11DD3;TOLONG SIKI LETTER NNY;Lo;0;L;;;;;N;;;;; +11DD4;TOLONG SIKI LETTER S;Lo;0;L;;;;;N;;;;; +11DD5;TOLONG SIKI LETTER H;Lo;0;L;;;;;N;;;;; +11DD6;TOLONG SIKI LETTER X;Lo;0;L;;;;;N;;;;; +11DD7;TOLONG SIKI LETTER RR;Lo;0;L;;;;;N;;;;; +11DD8;TOLONG SIKI LETTER RRH;Lo;0;L;;;;;N;;;;; +11DD9;TOLONG SIKI SIGN SELA;Lm;0;L;;;;;N;;;;; +11DDA;TOLONG SIKI SIGN HECAKA;Lo;0;L;;;;;N;;;;; +11DDB;TOLONG SIKI UNGGA;Lo;0;L;;;;;N;;;;; +11DE0;TOLONG SIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11DE1;TOLONG SIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11DE2;TOLONG SIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11DE3;TOLONG SIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11DE4;TOLONG SIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11DE5;TOLONG SIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11DE6;TOLONG SIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11DE7;TOLONG SIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11DE8;TOLONG SIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11DE9;TOLONG SIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11EE0;MAKASAR LETTER KA;Lo;0;L;;;;;N;;;;; +11EE1;MAKASAR LETTER GA;Lo;0;L;;;;;N;;;;; +11EE2;MAKASAR LETTER NGA;Lo;0;L;;;;;N;;;;; +11EE3;MAKASAR LETTER PA;Lo;0;L;;;;;N;;;;; +11EE4;MAKASAR LETTER BA;Lo;0;L;;;;;N;;;;; +11EE5;MAKASAR LETTER MA;Lo;0;L;;;;;N;;;;; +11EE6;MAKASAR LETTER TA;Lo;0;L;;;;;N;;;;; +11EE7;MAKASAR LETTER DA;Lo;0;L;;;;;N;;;;; +11EE8;MAKASAR LETTER NA;Lo;0;L;;;;;N;;;;; +11EE9;MAKASAR LETTER CA;Lo;0;L;;;;;N;;;;; +11EEA;MAKASAR LETTER JA;Lo;0;L;;;;;N;;;;; +11EEB;MAKASAR LETTER NYA;Lo;0;L;;;;;N;;;;; +11EEC;MAKASAR LETTER YA;Lo;0;L;;;;;N;;;;; +11EED;MAKASAR LETTER RA;Lo;0;L;;;;;N;;;;; +11EEE;MAKASAR LETTER LA;Lo;0;L;;;;;N;;;;; +11EEF;MAKASAR LETTER VA;Lo;0;L;;;;;N;;;;; +11EF0;MAKASAR LETTER SA;Lo;0;L;;;;;N;;;;; +11EF1;MAKASAR LETTER A;Lo;0;L;;;;;N;;;;; +11EF2;MAKASAR ANGKA;Lo;0;L;;;;;N;;;;; +11EF3;MAKASAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11EF4;MAKASAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11EF5;MAKASAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11EF6;MAKASAR VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11EF7;MAKASAR PASSIMBANG;Po;0;L;;;;;N;;;;; +11EF8;MAKASAR END OF SECTION;Po;0;L;;;;;N;;;;; +11F00;KAWI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11F01;KAWI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11F02;KAWI SIGN REPHA;Lo;0;L;;;;;N;;;;; +11F03;KAWI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11F04;KAWI LETTER A;Lo;0;L;;;;;N;;;;; +11F05;KAWI LETTER AA;Lo;0;L;;;;;N;;;;; +11F06;KAWI LETTER I;Lo;0;L;;;;;N;;;;; +11F07;KAWI LETTER II;Lo;0;L;;;;;N;;;;; +11F08;KAWI LETTER U;Lo;0;L;;;;;N;;;;; +11F09;KAWI LETTER UU;Lo;0;L;;;;;N;;;;; +11F0A;KAWI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11F0B;KAWI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11F0C;KAWI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11F0D;KAWI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +11F0E;KAWI LETTER E;Lo;0;L;;;;;N;;;;; +11F0F;KAWI LETTER AI;Lo;0;L;;;;;N;;;;; +11F10;KAWI LETTER O;Lo;0;L;;;;;N;;;;; +11F12;KAWI LETTER KA;Lo;0;L;;;;;N;;;;; +11F13;KAWI LETTER KHA;Lo;0;L;;;;;N;;;;; +11F14;KAWI LETTER GA;Lo;0;L;;;;;N;;;;; +11F15;KAWI LETTER GHA;Lo;0;L;;;;;N;;;;; +11F16;KAWI LETTER NGA;Lo;0;L;;;;;N;;;;; +11F17;KAWI LETTER CA;Lo;0;L;;;;;N;;;;; +11F18;KAWI LETTER CHA;Lo;0;L;;;;;N;;;;; +11F19;KAWI LETTER JA;Lo;0;L;;;;;N;;;;; +11F1A;KAWI LETTER JHA;Lo;0;L;;;;;N;;;;; +11F1B;KAWI LETTER NYA;Lo;0;L;;;;;N;;;;; +11F1C;KAWI LETTER TTA;Lo;0;L;;;;;N;;;;; +11F1D;KAWI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11F1E;KAWI LETTER DDA;Lo;0;L;;;;;N;;;;; +11F1F;KAWI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11F20;KAWI LETTER NNA;Lo;0;L;;;;;N;;;;; +11F21;KAWI LETTER TA;Lo;0;L;;;;;N;;;;; +11F22;KAWI LETTER THA;Lo;0;L;;;;;N;;;;; +11F23;KAWI LETTER DA;Lo;0;L;;;;;N;;;;; +11F24;KAWI LETTER DHA;Lo;0;L;;;;;N;;;;; +11F25;KAWI LETTER NA;Lo;0;L;;;;;N;;;;; +11F26;KAWI LETTER PA;Lo;0;L;;;;;N;;;;; +11F27;KAWI LETTER PHA;Lo;0;L;;;;;N;;;;; +11F28;KAWI LETTER BA;Lo;0;L;;;;;N;;;;; +11F29;KAWI LETTER BHA;Lo;0;L;;;;;N;;;;; +11F2A;KAWI LETTER MA;Lo;0;L;;;;;N;;;;; +11F2B;KAWI LETTER YA;Lo;0;L;;;;;N;;;;; +11F2C;KAWI LETTER RA;Lo;0;L;;;;;N;;;;; +11F2D;KAWI LETTER LA;Lo;0;L;;;;;N;;;;; +11F2E;KAWI LETTER WA;Lo;0;L;;;;;N;;;;; +11F2F;KAWI LETTER SHA;Lo;0;L;;;;;N;;;;; +11F30;KAWI LETTER SSA;Lo;0;L;;;;;N;;;;; +11F31;KAWI LETTER SA;Lo;0;L;;;;;N;;;;; +11F32;KAWI LETTER HA;Lo;0;L;;;;;N;;;;; +11F33;KAWI LETTER JNYA;Lo;0;L;;;;;N;;;;; +11F34;KAWI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11F35;KAWI VOWEL SIGN ALTERNATE AA;Mc;0;L;;;;;N;;;;; +11F36;KAWI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11F37;KAWI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11F38;KAWI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11F39;KAWI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11F3A;KAWI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11F3E;KAWI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11F3F;KAWI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11F40;KAWI VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +11F41;KAWI SIGN KILLER;Mc;9;L;;;;;N;;;;; +11F42;KAWI CONJOINER;Mn;9;NSM;;;;;N;;;;; +11F43;KAWI DANDA;Po;0;L;;;;;N;;;;; +11F44;KAWI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11F45;KAWI PUNCTUATION SECTION MARKER;Po;0;L;;;;;N;;;;; +11F46;KAWI PUNCTUATION ALTERNATE SECTION MARKER;Po;0;L;;;;;N;;;;; +11F47;KAWI PUNCTUATION FLOWER;Po;0;L;;;;;N;;;;; +11F48;KAWI PUNCTUATION SPACE FILLER;Po;0;L;;;;;N;;;;; +11F49;KAWI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; +11F4A;KAWI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; +11F4B;KAWI PUNCTUATION TRIPLE DOT;Po;0;L;;;;;N;;;;; +11F4C;KAWI PUNCTUATION CIRCLE;Po;0;L;;;;;N;;;;; +11F4D;KAWI PUNCTUATION FILLED CIRCLE;Po;0;L;;;;;N;;;;; +11F4E;KAWI PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +11F4F;KAWI PUNCTUATION CLOSING SPIRAL;Po;0;L;;;;;N;;;;; +11F50;KAWI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11F51;KAWI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11F52;KAWI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11F53;KAWI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11F54;KAWI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11F55;KAWI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11F56;KAWI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11F57;KAWI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11F58;KAWI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11F59;KAWI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11F5A;KAWI SIGN NUKTA;Mn;0;NSM;;;;;N;;;;; +11FB0;LISU LETTER YHA;Lo;0;L;;;;;N;;;;; +11FC0;TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH;No;0;L;;;;1/320;N;;;;; +11FC1;TAMIL FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;; +11FC2;TAMIL FRACTION ONE EIGHTIETH;No;0;L;;;;1/80;N;;;;; +11FC3;TAMIL FRACTION ONE SIXTY-FOURTH;No;0;L;;;;1/64;N;;;;; +11FC4;TAMIL FRACTION ONE FORTIETH;No;0;L;;;;1/40;N;;;;; +11FC5;TAMIL FRACTION ONE THIRTY-SECOND;No;0;L;;;;1/32;N;;;;; +11FC6;TAMIL FRACTION THREE EIGHTIETHS;No;0;L;;;;3/80;N;;;;; +11FC7;TAMIL FRACTION THREE SIXTY-FOURTHS;No;0;L;;;;3/64;N;;;;; +11FC8;TAMIL FRACTION ONE TWENTIETH;No;0;L;;;;1/20;N;;;;; +11FC9;TAMIL FRACTION ONE SIXTEENTH-1;No;0;L;;;;1/16;N;;;;; +11FCA;TAMIL FRACTION ONE SIXTEENTH-2;No;0;L;;;;1/16;N;;;;; +11FCB;TAMIL FRACTION ONE TENTH;No;0;L;;;;1/10;N;;;;; +11FCC;TAMIL FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +11FCD;TAMIL FRACTION THREE TWENTIETHS;No;0;L;;;;3/20;N;;;;; +11FCE;TAMIL FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +11FCF;TAMIL FRACTION ONE FIFTH;No;0;L;;;;1/5;N;;;;; +11FD0;TAMIL FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +11FD1;TAMIL FRACTION ONE HALF-1;No;0;L;;;;1/2;N;;;;; +11FD2;TAMIL FRACTION ONE HALF-2;No;0;L;;;;1/2;N;;;;; +11FD3;TAMIL FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +11FD4;TAMIL FRACTION DOWNSCALING FACTOR KIIZH;No;0;L;;;;1/320;N;;;;; +11FD5;TAMIL SIGN NEL;So;0;ON;;;;;N;;;;; +11FD6;TAMIL SIGN CEVITU;So;0;ON;;;;;N;;;;; +11FD7;TAMIL SIGN AAZHAAKKU;So;0;ON;;;;;N;;;;; +11FD8;TAMIL SIGN UZHAKKU;So;0;ON;;;;;N;;;;; +11FD9;TAMIL SIGN MUUVUZHAKKU;So;0;ON;;;;;N;;;;; +11FDA;TAMIL SIGN KURUNI;So;0;ON;;;;;N;;;;; +11FDB;TAMIL SIGN PATHAKKU;So;0;ON;;;;;N;;;;; +11FDC;TAMIL SIGN MUKKURUNI;So;0;ON;;;;;N;;;;; +11FDD;TAMIL SIGN KAACU;Sc;0;ET;;;;;N;;;;; +11FDE;TAMIL SIGN PANAM;Sc;0;ET;;;;;N;;;;; +11FDF;TAMIL SIGN PON;Sc;0;ET;;;;;N;;;;; +11FE0;TAMIL SIGN VARAAKAN;Sc;0;ET;;;;;N;;;;; +11FE1;TAMIL SIGN PAARAM;So;0;ON;;;;;N;;;;; +11FE2;TAMIL SIGN KUZHI;So;0;ON;;;;;N;;;;; +11FE3;TAMIL SIGN VELI;So;0;ON;;;;;N;;;;; +11FE4;TAMIL WET CULTIVATION SIGN;So;0;ON;;;;;N;;;;; +11FE5;TAMIL DRY CULTIVATION SIGN;So;0;ON;;;;;N;;;;; +11FE6;TAMIL LAND SIGN;So;0;ON;;;;;N;;;;; +11FE7;TAMIL SALT PAN SIGN;So;0;ON;;;;;N;;;;; +11FE8;TAMIL TRADITIONAL CREDIT SIGN;So;0;ON;;;;;N;;;;; +11FE9;TAMIL TRADITIONAL NUMBER SIGN;So;0;ON;;;;;N;;;;; +11FEA;TAMIL CURRENT SIGN;So;0;ON;;;;;N;;;;; +11FEB;TAMIL AND ODD SIGN;So;0;ON;;;;;N;;;;; +11FEC;TAMIL SPENT SIGN;So;0;ON;;;;;N;;;;; +11FED;TAMIL TOTAL SIGN;So;0;ON;;;;;N;;;;; +11FEE;TAMIL IN POSSESSION SIGN;So;0;ON;;;;;N;;;;; +11FEF;TAMIL STARTING FROM SIGN;So;0;ON;;;;;N;;;;; +11FF0;TAMIL SIGN MUTHALIYA;So;0;ON;;;;;N;;;;; +11FF1;TAMIL SIGN VAKAIYARAA;So;0;ON;;;;;N;;;;; +11FFF;TAMIL PUNCTUATION END OF TEXT;Po;0;L;;;;;N;;;;; +12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; +12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; +12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; +12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; +12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; +12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; +12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; +12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; +12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; +1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; +1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; +1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; +1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; +12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; +12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; +12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; +12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; +12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; +12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; +1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; +1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; +1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; +1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; +12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; +12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; +12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; +12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; +12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; +12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; +12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; +12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; +12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; +12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; +1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; +1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; +1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; +1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; +1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; +1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; +12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; +12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; +12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; +12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; +12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; +12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; +12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; +12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; +12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;1;N;;;;; +12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;1;N;;;;; +1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; +1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; +1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; +1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; +12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; +12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; +12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; +12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; +12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; +12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; +12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; +12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; +12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; +12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; +1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; +1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; +1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; +1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; +1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; +12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; +12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; +12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; +12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; +12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; +12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; +12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; +12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; +12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; +12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; +1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; +1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; +1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; +1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; +1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; +12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; +12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; +12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; +12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; +12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; +12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; +12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; +12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; +12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; +12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; +1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; +1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; +1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; +1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; +12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; +12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; +12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; +12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; +12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; +12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; +12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; +12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; +12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;1;N;;;;; +1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; +1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; +1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; +1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; +1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; +1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; +12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; +12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; +12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; +12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; +12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; +12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; +12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; +12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; +12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; +1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; +1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; +1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; +1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; +1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; +12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; +12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; +12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; +12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; +12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; +12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; +12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; +12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; +12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; +12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; +1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; +1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; +1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; +1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; +1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; +120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; +120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; +120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; +120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; +120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; +120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; +120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; +120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; +120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; +120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; +120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; +120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; +120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; +120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; +120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; +120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; +120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; +120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; +120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; +120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; +120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; +120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; +120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; +120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; +120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; +120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; +120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; +120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; +120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; +120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; +120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; +120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; +120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; +120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; +120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; +120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; +120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; +120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; +120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; +120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; +120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; +120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; +120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; +120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; +120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; +120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; +120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; +120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; +120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; +120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; +120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; +120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; +120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; +120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; +120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; +120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; +120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; +120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; +120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; +120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; +120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; +120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; +120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; +120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; +120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; +120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; +120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; +120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; +120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; +120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; +120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; +120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; +120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; +120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; +12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; +12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; +12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; +12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; +12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; +12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; +12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; +12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; +12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; +12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; +1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; +1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; +1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; +1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; +12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; +12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; +12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; +12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; +12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; +12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; +12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; +12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; +1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; +1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; +1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; +1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; +12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; +12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; +12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; +12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; +12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; +12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; +12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; +12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; +12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; +12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; +1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; +1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; +1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; +1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; +1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; +1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; +12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; +12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; +12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; +12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; +12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; +12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; +12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; +12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; +1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; +1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; +1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; +1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; +12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; +12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; +12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; +12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; +12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; +12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; +12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; +12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; +12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; +12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; +1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; +1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; +1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; +1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; +1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; +12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; +12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; +12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; +12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; +12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; +12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; +12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; +12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; +12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; +12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; +1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; +1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; +1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; +1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; +1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; +1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; +12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; +12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; +12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; +12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; +12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; +12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; +12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; +12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; +1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; +1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; +1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; +1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; +1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; +12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; +12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; +12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; +12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; +12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; +12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; +12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; +12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; +12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; +12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; +1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; +1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; +1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; +1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; +1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; +1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; +12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; +12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; +12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; +12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; +12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; +12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; +12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; +12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; +12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; +12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; +1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; +1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; +1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; +1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; +1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; +12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; +12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; +12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; +12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; +12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; +12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; +12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; +12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; +12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; +1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; +1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; +1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; +1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; +121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; +121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; +121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; +121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; +121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; +121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; +121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; +121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; +121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; +121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; +121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; +121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; +121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; +121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; +121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; +121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; +121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; +121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; +121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; +121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; +121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; +121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; +121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; +121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; +121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; +121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; +121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; +121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; +121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; +121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; +121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; +121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; +121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; +121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; +121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; +121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; +121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; +121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; +121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; +121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; +121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; +121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; +121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; +121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; +121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; +121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; +121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; +121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; +121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; +121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; +121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; +121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; +121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; +121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; +121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; +121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; +121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; +121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; +121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; +121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; +121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; +121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; +121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; +121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; +121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; +121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; +121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; +121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; +121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; +121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; +121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; +121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; +121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; +121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; +121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; +121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; +121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; +121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; +121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; +121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; +121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; +12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; +12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; +12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; +12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; +12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; +12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; +12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; +1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; +1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; +1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; +1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; +12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; +12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; +12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; +12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; +12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; +12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; +12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; +12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; +12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; +12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; +1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; +1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; +1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; +1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; +1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; +1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; +12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; +12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; +12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; +12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; +12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;1/2;N;;;;; +12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; +12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; +12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; +1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; +1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;2;N;;;;; +1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; +1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; +1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; +1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; +12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; +12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; +12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; +12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; +12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; +12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; +12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; +12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; +12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; +1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; +1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; +1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; +1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; +1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; +1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; +12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; +12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; +12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; +12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; +12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; +12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; +12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; +12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; +12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; +12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; +1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; +1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; +1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; +1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; +1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; +1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; +12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; +12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; +12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; +12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; +1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; +1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; +12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; +12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; +12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; +12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; +12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; +12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; +12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; +12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; +1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; +1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; +1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; +1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; +12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; +12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; +12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; +12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; +12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; +12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; +1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; +1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; +1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; +1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; +1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; +1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; +12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; +12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; +12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; +12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; +12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; +12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; +12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; +12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; +12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; +12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; +1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; +1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; +1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; +1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; +1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; +1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; +12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; +12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; +12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; +12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; +12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; +12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; +12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; +12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; +12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; +12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; +1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; +1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; +1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; +1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; +1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; +122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; +122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; +122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; +122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; +122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; +122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; +122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; +122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; +122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; +122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; +122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; +122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; +122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; +122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; +122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; +122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; +122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; +122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; +122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; +122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; +122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; +122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; +122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; +122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; +122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; +122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; +122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; +122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; +122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; +122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; +122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; +122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; +122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; +122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; +122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; +122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; +122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; +122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; +122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; +122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; +122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; +122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; +122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; +122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; +122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; +122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; +122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; +122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; +122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; +122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; +122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; +122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; +122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; +122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; +122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; +122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; +122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; +122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; +122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; +122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; +122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; +122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; +122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; +122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; +122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; +122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; +122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; +122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; +122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; +122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; +122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; +122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; +122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; +122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; +122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; +122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; +122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; +122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; +122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; +122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; +122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; +122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; +122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; +122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; +122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; +122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; +122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; +122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; +122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; +122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; +122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; +12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; +12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; +12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; +12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; +12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; +12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; +12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; +12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; +12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; +1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; +1230B;CUNEIFORM SIGN U;Lo;0;L;;;;1;N;;;;; +1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; +1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;3;N;;;;; +1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; +1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; +12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; +12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; +12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; +12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; +12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; +12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; +12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; +12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; +12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; +1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; +1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; +1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; +1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; +12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; +12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; +12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; +12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; +12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; +12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; +12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; +12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; +12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; +1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; +1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; +1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; +1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; +12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; +12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; +12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; +12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; +12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; +12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; +12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; +12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; +12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; +1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; +1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; +1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; +1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; +12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; +12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; +12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; +12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; +12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; +12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; +12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; +12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; +12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; +12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; +1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; +1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; +1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; +1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; +1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; +1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; +12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; +12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; +12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; +12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; +12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; +12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; +12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; +12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; +12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; +1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; +1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; +1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; +1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; +1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; +12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; +12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; +12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; +12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; +12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; +12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; +12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; +12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; +12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; +12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; +1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; +1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; +1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; +1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; +1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; +1236F;CUNEIFORM SIGN KAP ELAMITE;Lo;0;L;;;;;N;;;;; +12370;CUNEIFORM SIGN AB TIMES NUN;Lo;0;L;;;;;N;;;;; +12371;CUNEIFORM SIGN AB2 TIMES A;Lo;0;L;;;;;N;;;;; +12372;CUNEIFORM SIGN AMAR TIMES KUG;Lo;0;L;;;;;N;;;;; +12373;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH;Lo;0;L;;;;;N;;;;; +12374;CUNEIFORM SIGN DAG3;Lo;0;L;;;;;N;;;;; +12375;CUNEIFORM SIGN DISH PLUS SHU;Lo;0;L;;;;;N;;;;; +12376;CUNEIFORM SIGN DUB TIMES SHE;Lo;0;L;;;;;N;;;;; +12377;CUNEIFORM SIGN EZEN TIMES GUD;Lo;0;L;;;;;N;;;;; +12378;CUNEIFORM SIGN EZEN TIMES SHE;Lo;0;L;;;;;N;;;;; +12379;CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A;Lo;0;L;;;;;N;;;;; +1237A;CUNEIFORM SIGN GA2 TIMES ASH2;Lo;0;L;;;;;N;;;;; +1237B;CUNEIFORM SIGN GE22;Lo;0;L;;;;;N;;;;; +1237C;CUNEIFORM SIGN GIG;Lo;0;L;;;;;N;;;;; +1237D;CUNEIFORM SIGN HUSH;Lo;0;L;;;;;N;;;;; +1237E;CUNEIFORM SIGN KA TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1237F;CUNEIFORM SIGN KA TIMES ASH3;Lo;0;L;;;;;N;;;;; +12380;CUNEIFORM SIGN KA TIMES GISH;Lo;0;L;;;;;N;;;;; +12381;CUNEIFORM SIGN KA TIMES GUD;Lo;0;L;;;;;N;;;;; +12382;CUNEIFORM SIGN KA TIMES HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12383;CUNEIFORM SIGN KA TIMES LUM;Lo;0;L;;;;;N;;;;; +12384;CUNEIFORM SIGN KA TIMES PA;Lo;0;L;;;;;N;;;;; +12385;CUNEIFORM SIGN KA TIMES SHUL;Lo;0;L;;;;;N;;;;; +12386;CUNEIFORM SIGN KA TIMES TU;Lo;0;L;;;;;N;;;;; +12387;CUNEIFORM SIGN KA TIMES UR2;Lo;0;L;;;;;N;;;;; +12388;CUNEIFORM SIGN LAGAB TIMES GI;Lo;0;L;;;;;N;;;;; +12389;CUNEIFORM SIGN LU2 SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1238A;CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL;Lo;0;L;;;;;N;;;;; +1238B;CUNEIFORM SIGN LU2 TIMES SHU;Lo;0;L;;;;;N;;;;; +1238C;CUNEIFORM SIGN MESH;Lo;0;L;;;;;N;;;;; +1238D;CUNEIFORM SIGN MUSH3 TIMES ZA;Lo;0;L;;;;;N;;;;; +1238E;CUNEIFORM SIGN NA4;Lo;0;L;;;;;N;;;;; +1238F;CUNEIFORM SIGN NIN;Lo;0;L;;;;;N;;;;; +12390;CUNEIFORM SIGN NIN9;Lo;0;L;;;;;N;;;;; +12391;CUNEIFORM SIGN NINDA2 TIMES BAL;Lo;0;L;;;;;N;;;;; +12392;CUNEIFORM SIGN NINDA2 TIMES GI;Lo;0;L;;;;;N;;;;; +12393;CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +12394;CUNEIFORM SIGN PESH2 ASTERISK;Lo;0;L;;;;;N;;;;; +12395;CUNEIFORM SIGN PIR2;Lo;0;L;;;;;N;;;;; +12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; +12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; +12399;CUNEIFORM SIGN U U;Lo;0;L;;;;2;N;;;;; +12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; +12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; +12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; +12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; +12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; +12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; +12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; +12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; +12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; +12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; +1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; +1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; +1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; +1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; +1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; +1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; +12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; +12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; +12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; +12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; +12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; +12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; +12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; +12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; +12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; +12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; +1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; +1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; +1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; +1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; +1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; +1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; +12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; +12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; +12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; +12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; +12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; +12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; +12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; +12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; +12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; +1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; +1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; +1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; +1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; +1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; +1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; +12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; +12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;; +12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;N;;;;; +12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; +12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; +12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; +12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; +12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; +1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; +1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; +1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; +1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; +1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; +1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; +12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; +12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; +12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; +12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; +12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; +12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; +12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; +12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; +12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; +12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; +1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; +1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; +1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; +1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; +1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; +1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; +12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; +12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; +12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; +12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; +12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; +12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; +12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;2;N;;;;; +12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;3;N;;;;; +12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; +12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; +1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; +1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; +1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; +1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; +1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; +1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; +12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; +12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; +12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; +12463;CUNEIFORM NUMERIC SIGN ONE QUARTER GUR;Nl;0;L;;;;1/4;N;;;;; +12464;CUNEIFORM NUMERIC SIGN ONE HALF GUR;Nl;0;L;;;;1/2;N;;;;; +12465;CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD;Nl;0;L;;;;1/3;N;;;;; +12466;CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS;Nl;0;L;;;;2/3;N;;;;; +12467;CUNEIFORM NUMERIC SIGN ELAMITE FORTY;Nl;0;L;;;;40;N;;;;; +12468;CUNEIFORM NUMERIC SIGN ELAMITE FIFTY;Nl;0;L;;;;50;N;;;;; +12469;CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM;Nl;0;L;;;;4;N;;;;; +1246A;CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM;Nl;0;L;;;;5;N;;;;; +1246B;CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM;Nl;0;L;;;;6;N;;;;; +1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;; +1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;; +1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;; +12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; +12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; +12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; +12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; +12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;; +12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;; +12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;; +12483;CUNEIFORM SIGN BAD TIMES DISH TENU;Lo;0;L;;;;;N;;;;; +12484;CUNEIFORM SIGN BAHAR2 TIMES AB2;Lo;0;L;;;;;N;;;;; +12485;CUNEIFORM SIGN BAHAR2 TIMES NI;Lo;0;L;;;;;N;;;;; +12486;CUNEIFORM SIGN BAHAR2 TIMES ZA;Lo;0;L;;;;;N;;;;; +12487;CUNEIFORM SIGN BU OVER BU TIMES NA2;Lo;0;L;;;;;N;;;;; +12488;CUNEIFORM SIGN DA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12489;CUNEIFORM SIGN DAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1248A;CUNEIFORM SIGN DIM TIMES IGI;Lo;0;L;;;;;N;;;;; +1248B;CUNEIFORM SIGN DIM TIMES U U U;Lo;0;L;;;;;N;;;;; +1248C;CUNEIFORM SIGN DIM2 TIMES UD;Lo;0;L;;;;;N;;;;; +1248D;CUNEIFORM SIGN DUG TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1248E;CUNEIFORM SIGN DUG TIMES ASH;Lo;0;L;;;;;N;;;;; +1248F;CUNEIFORM SIGN DUG TIMES ASH AT LEFT;Lo;0;L;;;;;N;;;;; +12490;CUNEIFORM SIGN DUG TIMES DIN;Lo;0;L;;;;;N;;;;; +12491;CUNEIFORM SIGN DUG TIMES DUN;Lo;0;L;;;;;N;;;;; +12492;CUNEIFORM SIGN DUG TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12493;CUNEIFORM SIGN DUG TIMES GA;Lo;0;L;;;;;N;;;;; +12494;CUNEIFORM SIGN DUG TIMES GI;Lo;0;L;;;;;N;;;;; +12495;CUNEIFORM SIGN DUG TIMES GIR2 GUNU;Lo;0;L;;;;;N;;;;; +12496;CUNEIFORM SIGN DUG TIMES GISH;Lo;0;L;;;;;N;;;;; +12497;CUNEIFORM SIGN DUG TIMES HA;Lo;0;L;;;;;N;;;;; +12498;CUNEIFORM SIGN DUG TIMES HI;Lo;0;L;;;;;N;;;;; +12499;CUNEIFORM SIGN DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1249A;CUNEIFORM SIGN DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1249B;CUNEIFORM SIGN DUG TIMES KUR;Lo;0;L;;;;;N;;;;; +1249C;CUNEIFORM SIGN DUG TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +1249D;CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +1249E;CUNEIFORM SIGN DUG TIMES LAK-020;Lo;0;L;;;;;N;;;;; +1249F;CUNEIFORM SIGN DUG TIMES LAM;Lo;0;L;;;;;N;;;;; +124A0;CUNEIFORM SIGN DUG TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124A1;CUNEIFORM SIGN DUG TIMES LUH PLUS GISH;Lo;0;L;;;;;N;;;;; +124A2;CUNEIFORM SIGN DUG TIMES MASH;Lo;0;L;;;;;N;;;;; +124A3;CUNEIFORM SIGN DUG TIMES MES;Lo;0;L;;;;;N;;;;; +124A4;CUNEIFORM SIGN DUG TIMES MI;Lo;0;L;;;;;N;;;;; +124A5;CUNEIFORM SIGN DUG TIMES NI;Lo;0;L;;;;;N;;;;; +124A6;CUNEIFORM SIGN DUG TIMES PI;Lo;0;L;;;;;N;;;;; +124A7;CUNEIFORM SIGN DUG TIMES SHE;Lo;0;L;;;;;N;;;;; +124A8;CUNEIFORM SIGN DUG TIMES SI GUNU;Lo;0;L;;;;;N;;;;; +124A9;CUNEIFORM SIGN E2 TIMES KUR;Lo;0;L;;;;;N;;;;; +124AA;CUNEIFORM SIGN E2 TIMES PAP;Lo;0;L;;;;;N;;;;; +124AB;CUNEIFORM SIGN ERIN2 X;Lo;0;L;;;;;N;;;;; +124AC;CUNEIFORM SIGN ESH2 CROSSING ESH2;Lo;0;L;;;;;N;;;;; +124AD;CUNEIFORM SIGN EZEN SHESHIG TIMES ASH;Lo;0;L;;;;;N;;;;; +124AE;CUNEIFORM SIGN EZEN SHESHIG TIMES HI;Lo;0;L;;;;;N;;;;; +124AF;CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B0;CUNEIFORM SIGN EZEN SHESHIG TIMES LA;Lo;0;L;;;;;N;;;;; +124B1;CUNEIFORM SIGN EZEN SHESHIG TIMES LAL;Lo;0;L;;;;;N;;;;; +124B2;CUNEIFORM SIGN EZEN SHESHIG TIMES ME;Lo;0;L;;;;;N;;;;; +124B3;CUNEIFORM SIGN EZEN SHESHIG TIMES MES;Lo;0;L;;;;;N;;;;; +124B4;CUNEIFORM SIGN EZEN SHESHIG TIMES SU;Lo;0;L;;;;;N;;;;; +124B5;CUNEIFORM SIGN EZEN TIMES SU;Lo;0;L;;;;;N;;;;; +124B6;CUNEIFORM SIGN GA2 TIMES BAHAR2;Lo;0;L;;;;;N;;;;; +124B7;CUNEIFORM SIGN GA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +124B8;CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B9;CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +124BA;CUNEIFORM SIGN GA2 TIMES EREN;Lo;0;L;;;;;N;;;;; +124BB;CUNEIFORM SIGN GA2 TIMES GA;Lo;0;L;;;;;N;;;;; +124BC;CUNEIFORM SIGN GA2 TIMES GAR PLUS DI;Lo;0;L;;;;;N;;;;; +124BD;CUNEIFORM SIGN GA2 TIMES GAR PLUS NE;Lo;0;L;;;;;N;;;;; +124BE;CUNEIFORM SIGN GA2 TIMES HA PLUS A;Lo;0;L;;;;;N;;;;; +124BF;CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +124C0;CUNEIFORM SIGN GA2 TIMES LAM;Lo;0;L;;;;;N;;;;; +124C1;CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124C2;CUNEIFORM SIGN GA2 TIMES LUH;Lo;0;L;;;;;N;;;;; +124C3;CUNEIFORM SIGN GA2 TIMES MUSH;Lo;0;L;;;;;N;;;;; +124C4;CUNEIFORM SIGN GA2 TIMES NE;Lo;0;L;;;;;N;;;;; +124C5;CUNEIFORM SIGN GA2 TIMES NE PLUS E2;Lo;0;L;;;;;N;;;;; +124C6;CUNEIFORM SIGN GA2 TIMES NE PLUS GI;Lo;0;L;;;;;N;;;;; +124C7;CUNEIFORM SIGN GA2 TIMES SHIM;Lo;0;L;;;;;N;;;;; +124C8;CUNEIFORM SIGN GA2 TIMES ZIZ2;Lo;0;L;;;;;N;;;;; +124C9;CUNEIFORM SIGN GABA ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +124CA;CUNEIFORM SIGN GESHTIN TIMES U;Lo;0;L;;;;;N;;;;; +124CB;CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +124CC;CUNEIFORM SIGN GU2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124CD;CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +124CE;CUNEIFORM SIGN HA TENU GUNU;Lo;0;L;;;;;N;;;;; +124CF;CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH;Lo;0;L;;;;;N;;;;; +124D0;CUNEIFORM SIGN KA TIMES BU;Lo;0;L;;;;;N;;;;; +124D1;CUNEIFORM SIGN KA TIMES KA;Lo;0;L;;;;;N;;;;; +124D2;CUNEIFORM SIGN KA TIMES U U U;Lo;0;L;;;;;N;;;;; +124D3;CUNEIFORM SIGN KA TIMES UR;Lo;0;L;;;;;N;;;;; +124D4;CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU;Lo;0;L;;;;;N;;;;; +124D5;CUNEIFORM SIGN LAK-003;Lo;0;L;;;;;N;;;;; +124D6;CUNEIFORM SIGN LAK-021;Lo;0;L;;;;;N;;;;; +124D7;CUNEIFORM SIGN LAK-025;Lo;0;L;;;;;N;;;;; +124D8;CUNEIFORM SIGN LAK-030;Lo;0;L;;;;;N;;;;; +124D9;CUNEIFORM SIGN LAK-050;Lo;0;L;;;;;N;;;;; +124DA;CUNEIFORM SIGN LAK-051;Lo;0;L;;;;;N;;;;; +124DB;CUNEIFORM SIGN LAK-062;Lo;0;L;;;;;N;;;;; +124DC;CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU;Lo;0;L;;;;;N;;;;; +124DD;CUNEIFORM SIGN LAK-080;Lo;0;L;;;;;N;;;;; +124DE;CUNEIFORM SIGN LAK-081 OVER LAK-081;Lo;0;L;;;;;N;;;;; +124DF;CUNEIFORM SIGN LAK-092;Lo;0;L;;;;;N;;;;; +124E0;CUNEIFORM SIGN LAK-130;Lo;0;L;;;;;N;;;;; +124E1;CUNEIFORM SIGN LAK-142;Lo;0;L;;;;;N;;;;; +124E2;CUNEIFORM SIGN LAK-210;Lo;0;L;;;;;N;;;;; +124E3;CUNEIFORM SIGN LAK-219;Lo;0;L;;;;;N;;;;; +124E4;CUNEIFORM SIGN LAK-220;Lo;0;L;;;;;N;;;;; +124E5;CUNEIFORM SIGN LAK-225;Lo;0;L;;;;;N;;;;; +124E6;CUNEIFORM SIGN LAK-228;Lo;0;L;;;;;N;;;;; +124E7;CUNEIFORM SIGN LAK-238;Lo;0;L;;;;;N;;;;; +124E8;CUNEIFORM SIGN LAK-265;Lo;0;L;;;;;N;;;;; +124E9;CUNEIFORM SIGN LAK-266;Lo;0;L;;;;;N;;;;; +124EA;CUNEIFORM SIGN LAK-343;Lo;0;L;;;;;N;;;;; +124EB;CUNEIFORM SIGN LAK-347;Lo;0;L;;;;;N;;;;; +124EC;CUNEIFORM SIGN LAK-348;Lo;0;L;;;;;N;;;;; +124ED;CUNEIFORM SIGN LAK-383;Lo;0;L;;;;;N;;;;; +124EE;CUNEIFORM SIGN LAK-384;Lo;0;L;;;;;N;;;;; +124EF;CUNEIFORM SIGN LAK-390;Lo;0;L;;;;;N;;;;; +124F0;CUNEIFORM SIGN LAK-441;Lo;0;L;;;;;N;;;;; +124F1;CUNEIFORM SIGN LAK-449;Lo;0;L;;;;;N;;;;; +124F2;CUNEIFORM SIGN LAK-449 TIMES GU;Lo;0;L;;;;;N;;;;; +124F3;CUNEIFORM SIGN LAK-449 TIMES IGI;Lo;0;L;;;;;N;;;;; +124F4;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F5;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F6;CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA;Lo;0;L;;;;;N;;;;; +124F7;CUNEIFORM SIGN LAK-450;Lo;0;L;;;;;N;;;;; +124F8;CUNEIFORM SIGN LAK-457;Lo;0;L;;;;;N;;;;; +124F9;CUNEIFORM SIGN LAK-470;Lo;0;L;;;;;N;;;;; +124FA;CUNEIFORM SIGN LAK-483;Lo;0;L;;;;;N;;;;; +124FB;CUNEIFORM SIGN LAK-490;Lo;0;L;;;;;N;;;;; +124FC;CUNEIFORM SIGN LAK-492;Lo;0;L;;;;;N;;;;; +124FD;CUNEIFORM SIGN LAK-493;Lo;0;L;;;;;N;;;;; +124FE;CUNEIFORM SIGN LAK-495;Lo;0;L;;;;;N;;;;; +124FF;CUNEIFORM SIGN LAK-550;Lo;0;L;;;;;N;;;;; +12500;CUNEIFORM SIGN LAK-608;Lo;0;L;;;;;N;;;;; +12501;CUNEIFORM SIGN LAK-617;Lo;0;L;;;;;N;;;;; +12502;CUNEIFORM SIGN LAK-617 TIMES ASH;Lo;0;L;;;;;N;;;;; +12503;CUNEIFORM SIGN LAK-617 TIMES BAD;Lo;0;L;;;;;N;;;;; +12504;CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12505;CUNEIFORM SIGN LAK-617 TIMES KU3;Lo;0;L;;;;;N;;;;; +12506;CUNEIFORM SIGN LAK-617 TIMES LA;Lo;0;L;;;;;N;;;;; +12507;CUNEIFORM SIGN LAK-617 TIMES TAR;Lo;0;L;;;;;N;;;;; +12508;CUNEIFORM SIGN LAK-617 TIMES TE;Lo;0;L;;;;;N;;;;; +12509;CUNEIFORM SIGN LAK-617 TIMES U2;Lo;0;L;;;;;N;;;;; +1250A;CUNEIFORM SIGN LAK-617 TIMES UD;Lo;0;L;;;;;N;;;;; +1250B;CUNEIFORM SIGN LAK-617 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1250C;CUNEIFORM SIGN LAK-636;Lo;0;L;;;;;N;;;;; +1250D;CUNEIFORM SIGN LAK-648;Lo;0;L;;;;;N;;;;; +1250E;CUNEIFORM SIGN LAK-648 TIMES DUB;Lo;0;L;;;;;N;;;;; +1250F;CUNEIFORM SIGN LAK-648 TIMES GA;Lo;0;L;;;;;N;;;;; +12510;CUNEIFORM SIGN LAK-648 TIMES IGI;Lo;0;L;;;;;N;;;;; +12511;CUNEIFORM SIGN LAK-648 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12512;CUNEIFORM SIGN LAK-648 TIMES NI;Lo;0;L;;;;;N;;;;; +12513;CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +12514;CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI;Lo;0;L;;;;;N;;;;; +12515;CUNEIFORM SIGN LAK-648 TIMES UD;Lo;0;L;;;;;N;;;;; +12516;CUNEIFORM SIGN LAK-648 TIMES URUDA;Lo;0;L;;;;;N;;;;; +12517;CUNEIFORM SIGN LAK-724;Lo;0;L;;;;;N;;;;; +12518;CUNEIFORM SIGN LAK-749;Lo;0;L;;;;;N;;;;; +12519;CUNEIFORM SIGN LU2 GUNU TIMES ASH;Lo;0;L;;;;;N;;;;; +1251A;CUNEIFORM SIGN LU2 TIMES DISH;Lo;0;L;;;;;N;;;;; +1251B;CUNEIFORM SIGN LU2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1251C;CUNEIFORM SIGN LU2 TIMES PAP;Lo;0;L;;;;;N;;;;; +1251D;CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +1251E;CUNEIFORM SIGN LU2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1251F;CUNEIFORM SIGN MI PLUS ZA7;Lo;0;L;;;;;N;;;;; +12520;CUNEIFORM SIGN MUSH OVER MUSH TIMES GA;Lo;0;L;;;;;N;;;;; +12521;CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK;Lo;0;L;;;;;N;;;;; +12522;CUNEIFORM SIGN NINDA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +12523;CUNEIFORM SIGN NINDA2 TIMES GISH;Lo;0;L;;;;;N;;;;; +12524;CUNEIFORM SIGN NINDA2 TIMES GUL;Lo;0;L;;;;;N;;;;; +12525;CUNEIFORM SIGN NINDA2 TIMES HI;Lo;0;L;;;;;N;;;;; +12526;CUNEIFORM SIGN NINDA2 TIMES KESH2;Lo;0;L;;;;;N;;;;; +12527;CUNEIFORM SIGN NINDA2 TIMES LAK-050;Lo;0;L;;;;;N;;;;; +12528;CUNEIFORM SIGN NINDA2 TIMES MASH;Lo;0;L;;;;;N;;;;; +12529;CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1252A;CUNEIFORM SIGN NINDA2 TIMES U;Lo;0;L;;;;;N;;;;; +1252B;CUNEIFORM SIGN NINDA2 TIMES U PLUS U;Lo;0;L;;;;;N;;;;; +1252C;CUNEIFORM SIGN NINDA2 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1252D;CUNEIFORM SIGN SAG GUNU TIMES HA;Lo;0;L;;;;;N;;;;; +1252E;CUNEIFORM SIGN SAG TIMES EN;Lo;0;L;;;;;N;;;;; +1252F;CUNEIFORM SIGN SAG TIMES SHE AT LEFT;Lo;0;L;;;;;N;;;;; +12530;CUNEIFORM SIGN SAG TIMES TAK4;Lo;0;L;;;;;N;;;;; +12531;CUNEIFORM SIGN SHA6 TENU;Lo;0;L;;;;;N;;;;; +12532;CUNEIFORM SIGN SHE OVER SHE;Lo;0;L;;;;;N;;;;; +12533;CUNEIFORM SIGN SHE PLUS HUB2;Lo;0;L;;;;;N;;;;; +12534;CUNEIFORM SIGN SHE PLUS NAM2;Lo;0;L;;;;;N;;;;; +12535;CUNEIFORM SIGN SHE PLUS SAR;Lo;0;L;;;;;N;;;;; +12536;CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI;Lo;0;L;;;;;N;;;;; +12537;CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN;Lo;0;L;;;;;N;;;;; +12538;CUNEIFORM SIGN SI TIMES TAK4;Lo;0;L;;;;;N;;;;; +12539;CUNEIFORM SIGN TAK4 PLUS SAG;Lo;0;L;;;;;N;;;;; +1253A;CUNEIFORM SIGN TUM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1253B;CUNEIFORM SIGN TUM TIMES THREE DISH;Lo;0;L;;;;;N;;;;; +1253C;CUNEIFORM SIGN UR2 INVERTED;Lo;0;L;;;;;N;;;;; +1253D;CUNEIFORM SIGN UR2 TIMES UD;Lo;0;L;;;;;N;;;;; +1253E;CUNEIFORM SIGN URU TIMES DARA3;Lo;0;L;;;;;N;;;;; +1253F;CUNEIFORM SIGN URU TIMES LAK-668;Lo;0;L;;;;;N;;;;; +12540;CUNEIFORM SIGN URU TIMES LU3;Lo;0;L;;;;;N;;;;; +12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;; +12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;; +12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;; +12F90;CYPRO-MINOAN SIGN CM001;Lo;0;L;;;;;N;;;;; +12F91;CYPRO-MINOAN SIGN CM002;Lo;0;L;;;;;N;;;;; +12F92;CYPRO-MINOAN SIGN CM004;Lo;0;L;;;;;N;;;;; +12F93;CYPRO-MINOAN SIGN CM005;Lo;0;L;;;;;N;;;;; +12F94;CYPRO-MINOAN SIGN CM006;Lo;0;L;;;;;N;;;;; +12F95;CYPRO-MINOAN SIGN CM007;Lo;0;L;;;;;N;;;;; +12F96;CYPRO-MINOAN SIGN CM008;Lo;0;L;;;;;N;;;;; +12F97;CYPRO-MINOAN SIGN CM009;Lo;0;L;;;;;N;;;;; +12F98;CYPRO-MINOAN SIGN CM010;Lo;0;L;;;;;N;;;;; +12F99;CYPRO-MINOAN SIGN CM011;Lo;0;L;;;;;N;;;;; +12F9A;CYPRO-MINOAN SIGN CM012;Lo;0;L;;;;;N;;;;; +12F9B;CYPRO-MINOAN SIGN CM012B;Lo;0;L;;;;;N;;;;; +12F9C;CYPRO-MINOAN SIGN CM013;Lo;0;L;;;;;N;;;;; +12F9D;CYPRO-MINOAN SIGN CM015;Lo;0;L;;;;;N;;;;; +12F9E;CYPRO-MINOAN SIGN CM017;Lo;0;L;;;;;N;;;;; +12F9F;CYPRO-MINOAN SIGN CM019;Lo;0;L;;;;;N;;;;; +12FA0;CYPRO-MINOAN SIGN CM021;Lo;0;L;;;;;N;;;;; +12FA1;CYPRO-MINOAN SIGN CM023;Lo;0;L;;;;;N;;;;; +12FA2;CYPRO-MINOAN SIGN CM024;Lo;0;L;;;;;N;;;;; +12FA3;CYPRO-MINOAN SIGN CM025;Lo;0;L;;;;;N;;;;; +12FA4;CYPRO-MINOAN SIGN CM026;Lo;0;L;;;;;N;;;;; +12FA5;CYPRO-MINOAN SIGN CM027;Lo;0;L;;;;;N;;;;; +12FA6;CYPRO-MINOAN SIGN CM028;Lo;0;L;;;;;N;;;;; +12FA7;CYPRO-MINOAN SIGN CM029;Lo;0;L;;;;;N;;;;; +12FA8;CYPRO-MINOAN SIGN CM030;Lo;0;L;;;;;N;;;;; +12FA9;CYPRO-MINOAN SIGN CM033;Lo;0;L;;;;;N;;;;; +12FAA;CYPRO-MINOAN SIGN CM034;Lo;0;L;;;;;N;;;;; +12FAB;CYPRO-MINOAN SIGN CM035;Lo;0;L;;;;;N;;;;; +12FAC;CYPRO-MINOAN SIGN CM036;Lo;0;L;;;;;N;;;;; +12FAD;CYPRO-MINOAN SIGN CM037;Lo;0;L;;;;;N;;;;; +12FAE;CYPRO-MINOAN SIGN CM038;Lo;0;L;;;;;N;;;;; +12FAF;CYPRO-MINOAN SIGN CM039;Lo;0;L;;;;;N;;;;; +12FB0;CYPRO-MINOAN SIGN CM040;Lo;0;L;;;;;N;;;;; +12FB1;CYPRO-MINOAN SIGN CM041;Lo;0;L;;;;;N;;;;; +12FB2;CYPRO-MINOAN SIGN CM044;Lo;0;L;;;;;N;;;;; +12FB3;CYPRO-MINOAN SIGN CM046;Lo;0;L;;;;;N;;;;; +12FB4;CYPRO-MINOAN SIGN CM047;Lo;0;L;;;;;N;;;;; +12FB5;CYPRO-MINOAN SIGN CM049;Lo;0;L;;;;;N;;;;; +12FB6;CYPRO-MINOAN SIGN CM050;Lo;0;L;;;;;N;;;;; +12FB7;CYPRO-MINOAN SIGN CM051;Lo;0;L;;;;;N;;;;; +12FB8;CYPRO-MINOAN SIGN CM052;Lo;0;L;;;;;N;;;;; +12FB9;CYPRO-MINOAN SIGN CM053;Lo;0;L;;;;;N;;;;; +12FBA;CYPRO-MINOAN SIGN CM054;Lo;0;L;;;;;N;;;;; +12FBB;CYPRO-MINOAN SIGN CM055;Lo;0;L;;;;;N;;;;; +12FBC;CYPRO-MINOAN SIGN CM056;Lo;0;L;;;;;N;;;;; +12FBD;CYPRO-MINOAN SIGN CM058;Lo;0;L;;;;;N;;;;; +12FBE;CYPRO-MINOAN SIGN CM059;Lo;0;L;;;;;N;;;;; +12FBF;CYPRO-MINOAN SIGN CM060;Lo;0;L;;;;;N;;;;; +12FC0;CYPRO-MINOAN SIGN CM061;Lo;0;L;;;;;N;;;;; +12FC1;CYPRO-MINOAN SIGN CM062;Lo;0;L;;;;;N;;;;; +12FC2;CYPRO-MINOAN SIGN CM063;Lo;0;L;;;;;N;;;;; +12FC3;CYPRO-MINOAN SIGN CM064;Lo;0;L;;;;;N;;;;; +12FC4;CYPRO-MINOAN SIGN CM066;Lo;0;L;;;;;N;;;;; +12FC5;CYPRO-MINOAN SIGN CM067;Lo;0;L;;;;;N;;;;; +12FC6;CYPRO-MINOAN SIGN CM068;Lo;0;L;;;;;N;;;;; +12FC7;CYPRO-MINOAN SIGN CM069;Lo;0;L;;;;;N;;;;; +12FC8;CYPRO-MINOAN SIGN CM070;Lo;0;L;;;;;N;;;;; +12FC9;CYPRO-MINOAN SIGN CM071;Lo;0;L;;;;;N;;;;; +12FCA;CYPRO-MINOAN SIGN CM072;Lo;0;L;;;;;N;;;;; +12FCB;CYPRO-MINOAN SIGN CM073;Lo;0;L;;;;;N;;;;; +12FCC;CYPRO-MINOAN SIGN CM074;Lo;0;L;;;;;N;;;;; +12FCD;CYPRO-MINOAN SIGN CM075;Lo;0;L;;;;;N;;;;; +12FCE;CYPRO-MINOAN SIGN CM075B;Lo;0;L;;;;;N;;;;; +12FCF;CYPRO-MINOAN SIGN CM076;Lo;0;L;;;;;N;;;;; +12FD0;CYPRO-MINOAN SIGN CM078;Lo;0;L;;;;;N;;;;; +12FD1;CYPRO-MINOAN SIGN CM079;Lo;0;L;;;;;N;;;;; +12FD2;CYPRO-MINOAN SIGN CM080;Lo;0;L;;;;;N;;;;; +12FD3;CYPRO-MINOAN SIGN CM081;Lo;0;L;;;;;N;;;;; +12FD4;CYPRO-MINOAN SIGN CM082;Lo;0;L;;;;;N;;;;; +12FD5;CYPRO-MINOAN SIGN CM083;Lo;0;L;;;;;N;;;;; +12FD6;CYPRO-MINOAN SIGN CM084;Lo;0;L;;;;;N;;;;; +12FD7;CYPRO-MINOAN SIGN CM085;Lo;0;L;;;;;N;;;;; +12FD8;CYPRO-MINOAN SIGN CM086;Lo;0;L;;;;;N;;;;; +12FD9;CYPRO-MINOAN SIGN CM087;Lo;0;L;;;;;N;;;;; +12FDA;CYPRO-MINOAN SIGN CM088;Lo;0;L;;;;;N;;;;; +12FDB;CYPRO-MINOAN SIGN CM089;Lo;0;L;;;;;N;;;;; +12FDC;CYPRO-MINOAN SIGN CM090;Lo;0;L;;;;;N;;;;; +12FDD;CYPRO-MINOAN SIGN CM091;Lo;0;L;;;;;N;;;;; +12FDE;CYPRO-MINOAN SIGN CM092;Lo;0;L;;;;;N;;;;; +12FDF;CYPRO-MINOAN SIGN CM094;Lo;0;L;;;;;N;;;;; +12FE0;CYPRO-MINOAN SIGN CM095;Lo;0;L;;;;;N;;;;; +12FE1;CYPRO-MINOAN SIGN CM096;Lo;0;L;;;;;N;;;;; +12FE2;CYPRO-MINOAN SIGN CM097;Lo;0;L;;;;;N;;;;; +12FE3;CYPRO-MINOAN SIGN CM098;Lo;0;L;;;;;N;;;;; +12FE4;CYPRO-MINOAN SIGN CM099;Lo;0;L;;;;;N;;;;; +12FE5;CYPRO-MINOAN SIGN CM100;Lo;0;L;;;;;N;;;;; +12FE6;CYPRO-MINOAN SIGN CM101;Lo;0;L;;;;;N;;;;; +12FE7;CYPRO-MINOAN SIGN CM102;Lo;0;L;;;;;N;;;;; +12FE8;CYPRO-MINOAN SIGN CM103;Lo;0;L;;;;;N;;;;; +12FE9;CYPRO-MINOAN SIGN CM104;Lo;0;L;;;;;N;;;;; +12FEA;CYPRO-MINOAN SIGN CM105;Lo;0;L;;;;;N;;;;; +12FEB;CYPRO-MINOAN SIGN CM107;Lo;0;L;;;;;N;;;;; +12FEC;CYPRO-MINOAN SIGN CM108;Lo;0;L;;;;;N;;;;; +12FED;CYPRO-MINOAN SIGN CM109;Lo;0;L;;;;;N;;;;; +12FEE;CYPRO-MINOAN SIGN CM110;Lo;0;L;;;;;N;;;;; +12FEF;CYPRO-MINOAN SIGN CM112;Lo;0;L;;;;;N;;;;; +12FF0;CYPRO-MINOAN SIGN CM114;Lo;0;L;;;;;N;;;;; +12FF1;CYPRO-MINOAN SIGN CM301;Po;0;L;;;;;N;;;;; +12FF2;CYPRO-MINOAN SIGN CM302;Po;0;L;;;;;N;;;;; +13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;; +13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;; +13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;; +13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;; +13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;; +13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;; +13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;; +1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;; +13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;; +13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;; +13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;; +13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;; +13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;; +13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;; +13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;; +13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;; +13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;; +13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;; +13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;; +1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;; +1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;; +1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;; +1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;; +1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;; +1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;; +13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;; +13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;; +13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;; +13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;; +13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;; +13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;; +13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;; +13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;; +13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;; +13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;; +1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;; +1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;; +1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;; +1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;; +1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;; +1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;; +13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;; +13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;; +13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;; +13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;; +13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;; +13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;; +13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;; +13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;; +13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;; +13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;; +1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;; +1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;; +1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;; +1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;; +1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;; +1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;; +13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;; +13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;; +13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;; +13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;; +13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;; +13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;; +13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;; +13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;; +13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;; +13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;; +1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;; +1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;; +1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;; +1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;; +1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;; +1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;; +13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;; +13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;; +13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;; +13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;; +13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;; +13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;; +13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;; +13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;; +13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;; +13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;; +1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;; +1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;; +1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;; +1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;; +1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;; +1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;; +130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;; +130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;; +130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;; +130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;; +130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;; +130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;; +130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;; +130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;; +130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;; +130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;; +130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;; +130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;; +130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;; +130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;; +130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;; +130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;; +130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;; +130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;; +130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;; +130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;; +130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;; +130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;; +130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;; +130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;; +130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;; +130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;; +130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;; +130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;; +130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;; +130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;; +130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;; +130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;; +130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;; +130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;; +130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;; +130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;; +130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;; +130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;; +130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;; +130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;; +130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;; +130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;; +130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;; +130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;; +130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;; +130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;; +130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;; +130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;; +130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;; +130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;; +130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;; +130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;; +130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;; +130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;; +130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;; +130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;; +130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;; +130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;; +130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;; +130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;; +130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;; +130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;; +130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;; +130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;; +130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;; +130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;; +130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;; +130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;; +130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;; +130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;; +130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;; +130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;; +130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;; +130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;; +130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;; +130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;; +130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;; +130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;; +130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;; +130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;; +130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;; +130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;; +130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;; +130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;; +130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;; +130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;; +130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;; +130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;; +130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;; +130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;; +130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;; +130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;; +130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;; +130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;; +130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;; +130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;; +13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;; +13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;; +13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;; +13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;; +13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;; +13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;; +13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;; +13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;; +13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;; +13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;; +1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;; +1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;; +1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;; +1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;; +1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;; +1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;; +13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;; +13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;; +13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;; +13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;; +13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;; +13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;; +13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;; +13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;; +13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;; +13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;; +1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;; +1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;; +1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;; +1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;; +1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;; +1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;; +13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;; +13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;; +13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;; +13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;; +13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;; +13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;; +13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;; +13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;; +13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;; +13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;; +1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;; +1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;; +1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;; +1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;; +1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;; +1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;; +13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;; +13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;; +13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;; +13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;; +13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;; +13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;; +13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;; +13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;; +13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;; +13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;; +1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;; +1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;; +1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;; +1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;; +1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;; +1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;; +13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;; +13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;; +13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;; +13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;; +13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;; +13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;; +13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;; +13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;; +13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;; +13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;; +1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;; +1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;; +1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;; +1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;; +1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;; +1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;; +13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;; +13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;; +13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;; +13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;; +13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;; +13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;; +13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;; +13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;; +13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;; +13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;; +1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;; +1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;; +1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;; +1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;; +1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;; +1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;; +13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;; +13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;; +13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;; +13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;; +13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;; +13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;; +13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;; +13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;; +13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;; +13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;; +1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;; +1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;; +1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;; +1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;; +1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;; +1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;; +13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;; +13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;; +13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;; +13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;; +13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;; +13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;; +13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;; +13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;; +13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;; +13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;; +1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;; +1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;; +1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;; +1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;; +1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;; +1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;; +13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;; +13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;; +13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;; +13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;; +13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;; +13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;; +13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;; +13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;; +13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;; +13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;; +1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;; +1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;; +1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;; +1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;; +1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;; +1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;; +13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;; +13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;; +13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;; +13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;; +13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;; +13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;; +13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;; +13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;; +13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;; +13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;; +1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;; +1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;; +1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;; +1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;; +1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;; +1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;; +131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;; +131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;; +131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;; +131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;; +131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;; +131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;; +131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;; +131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;; +131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;; +131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;; +131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;; +131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;; +131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;; +131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;; +131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;; +131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;; +131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;; +131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;; +131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;; +131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;; +131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;; +131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;; +131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;; +131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;; +131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;; +131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;; +131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;; +131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;; +131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;; +131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;; +131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;; +131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;; +131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;; +131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;; +131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;; +131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;; +131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;; +131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;; +131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;; +131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;; +131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;; +131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;; +131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;; +131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;; +131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;; +131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;; +131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;; +131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;; +131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;; +131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;; +131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;; +131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;; +131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;; +131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;; +131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;; +131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;; +131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;; +131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;; +131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;; +131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;; +131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;; +131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;; +131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;; +131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;; +131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;; +131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;; +131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;; +131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;; +131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;; +131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;; +131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;; +131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;; +131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;; +131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;; +131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;; +131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;; +131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;; +131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;; +131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;; +131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;; +131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;; +131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;; +131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;; +131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;; +131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;; +131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;; +131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;; +131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;; +131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;; +131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;; +131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;; +131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;; +131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;; +131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;; +131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;; +131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;; +13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;; +13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;; +13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;; +13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;; +13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;; +13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;; +13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;; +13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;; +13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;; +13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;; +1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;; +1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;; +1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;; +1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;; +1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;; +1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;; +13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;; +13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;; +13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;; +13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;; +13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;; +13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;; +13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;; +13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;; +13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;; +13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;; +1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;; +1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;; +1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;; +1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;; +1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;; +1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;; +13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;; +13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;; +13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;; +13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;; +13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;; +13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;; +13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;; +13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;; +13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;; +13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;; +1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;; +1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;; +1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;; +1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;; +1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;; +1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;; +13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;; +13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;; +13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;; +13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;; +13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;; +13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;; +13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;; +13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;; +13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;; +13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;; +1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;; +1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;; +1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;; +1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;; +1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;; +1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;; +13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;; +13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;; +13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;; +13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;; +13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;; +13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;; +13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;; +13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;; +13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;; +13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;; +1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;; +1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;; +1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;; +1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;; +1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;; +1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;; +13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;; +13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;; +13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;; +13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;; +13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;; +13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;; +13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;; +13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;; +13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;; +13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;; +1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;; +1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;; +1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;; +1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;; +1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;; +1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;; +13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;; +13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;; +13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;; +13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;; +13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;; +13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;; +13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;; +13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;; +13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;; +13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;; +1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;; +1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;; +1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;; +1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;; +1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;; +1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;; +13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;; +13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;; +13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;; +13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;; +13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;; +13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;; +13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;; +13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;; +13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;; +13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;; +1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;; +1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;; +1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;; +1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;; +1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;; +1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;; +13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;; +13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;; +13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;; +13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;; +13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;; +13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;; +13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;; +13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;; +13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;; +13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;; +1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;; +1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;; +1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;; +1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;; +1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;; +1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;; +13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;; +13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;; +13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;; +13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;; +13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;; +13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;; +13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;; +13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;; +13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;; +13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;; +1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;; +1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;; +1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;; +1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;; +1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;; +1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;; +132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;; +132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;; +132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;; +132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;; +132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;; +132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;; +132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;; +132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;; +132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;; +132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;; +132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;; +132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;; +132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;; +132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;; +132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;; +132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;; +132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;; +132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;; +132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;; +132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;; +132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;; +132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;; +132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;; +132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;; +132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;; +132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;; +132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;; +132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;; +132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;; +132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;; +132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;; +132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;; +132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;; +132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;; +132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;; +132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;; +132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;; +132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;; +132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;; +132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;; +132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;; +132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;; +132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;; +132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;; +132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;; +132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;; +132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;; +132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;; +132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;; +132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;; +132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;; +132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;; +132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;; +132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;; +132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;; +132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;; +132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;; +132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;; +132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;; +132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;; +132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;; +132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;; +132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;; +132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;; +132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;; +132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;; +132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;; +132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;; +132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;; +132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;; +132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;; +132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;; +132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;; +132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;; +132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;; +132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;; +132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;; +132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;; +132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;; +132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;; +132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;; +132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;; +132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;; +132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;; +132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;; +132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;; +132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;; +132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;; +132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;; +132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;; +132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;; +132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;; +132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;; +132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;; +132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;; +132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;; +13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;; +13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;; +13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;; +13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;; +13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;; +13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;; +13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;; +13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;; +13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;; +13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;; +1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;; +1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;; +1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;; +1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;; +1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;; +1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;; +13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;; +13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;; +13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;; +13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;; +13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;; +13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;; +13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;; +13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;; +13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;; +13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;; +1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;; +1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;; +1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;; +1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;; +1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;; +1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;; +13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;; +13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;; +13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;; +13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;; +13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;; +13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;; +13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;; +13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;; +13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;; +13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;; +1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;; +1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;; +1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;; +1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;; +1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;; +1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;; +13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;; +13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;; +13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;; +13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;; +13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;; +13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;; +13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;; +13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;; +13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;; +13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;; +1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;; +1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;; +1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;; +1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;; +1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;; +1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;; +13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;; +13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;; +13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;; +13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;; +13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;; +13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;; +13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;; +13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;; +13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;; +13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;; +1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;; +1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;; +1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;; +1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;; +1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;; +1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;; +13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;; +13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;; +13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;; +13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;; +13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;; +13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;; +13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;; +13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;; +13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;; +13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;; +1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;; +1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;; +1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;; +1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;; +1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;; +1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;; +13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;; +13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;; +13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;; +13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;; +13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;; +13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;; +13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;; +13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;; +13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;; +13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;; +1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;; +1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;; +1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;; +1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;; +1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;; +1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;; +13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;; +13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;; +13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;; +13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;; +13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;; +13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;; +13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;; +13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;; +13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;; +13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;; +1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;; +1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;; +1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;; +1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;; +1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;; +1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;; +13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;; +13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;; +13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;; +13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;; +13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;; +13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;; +13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;; +13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;; +13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;; +13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;; +1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;; +1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;; +1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;; +1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;; +1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;; +1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;; +13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;; +13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;; +13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;; +13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;; +13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;; +13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;; +13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;; +13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;; +13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;; +13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;; +1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;; +1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;; +1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;; +1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;; +1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;; +1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;; +133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;; +133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;; +133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;; +133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;; +133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;; +133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;; +133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;; +133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;; +133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;; +133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;; +133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;; +133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;; +133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;; +133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;; +133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;; +133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;; +133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;; +133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;; +133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;; +133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;; +133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;; +133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;; +133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;; +133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;; +133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;; +133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;; +133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;; +133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;; +133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;; +133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;; +133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;; +133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;; +133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;; +133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;; +133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;; +133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;; +133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;; +133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;; +133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;; +133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;; +133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;; +133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;; +133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;; +133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;; +133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;; +133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;; +133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;; +133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;; +133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;; +133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;; +133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;; +133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;; +133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;; +133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;; +133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;; +133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;; +133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;; +133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;; +133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;; +133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;; +133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;; +133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;; +133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;; +133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;; +133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;; +133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;; +133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;; +133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;; +133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;; +133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;; +133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;; +133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;; +133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;; +133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;; +133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;; +133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;; +133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;; +133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;; +133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;; +133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;; +133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;; +133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;; +133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;; +133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;; +133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;; +133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;; +133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;; +133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;; +133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;; +133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;; +133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;; +133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;; +133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;; +133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;; +133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;; +133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;; +13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;; +13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;; +13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;; +13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;; +13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;; +13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;; +13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;; +13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;; +13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;; +13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;; +1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;; +1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;; +1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;; +1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;; +1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;; +1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;; +13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;; +13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;; +13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;; +13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;; +13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;; +13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;; +13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;; +13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;; +13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;; +13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;; +1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;; +1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;; +1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;; +1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;; +1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;; +1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;; +13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;; +13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;; +13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;; +13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;; +13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;; +13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;; +13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;; +13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;; +13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;; +13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;; +1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;; +1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;; +1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; +1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; +1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; +1342F;EGYPTIAN HIEROGLYPH V011D;Lo;0;L;;;;;N;;;;; +13430;EGYPTIAN HIEROGLYPH VERTICAL JOINER;Cf;0;L;;;;;N;;;;; +13431;EGYPTIAN HIEROGLYPH HORIZONTAL JOINER;Cf;0;L;;;;;N;;;;; +13432;EGYPTIAN HIEROGLYPH INSERT AT TOP START;Cf;0;L;;;;;N;;;;; +13433;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM START;Cf;0;L;;;;;N;;;;; +13434;EGYPTIAN HIEROGLYPH INSERT AT TOP END;Cf;0;L;;;;;N;;;;; +13435;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM END;Cf;0;L;;;;;N;;;;; +13436;EGYPTIAN HIEROGLYPH OVERLAY MIDDLE;Cf;0;L;;;;;N;;;;; +13437;EGYPTIAN HIEROGLYPH BEGIN SEGMENT;Cf;0;L;;;;;N;;;;; +13438;EGYPTIAN HIEROGLYPH END SEGMENT;Cf;0;L;;;;;N;;;;; +13439;EGYPTIAN HIEROGLYPH INSERT AT MIDDLE;Cf;0;L;;;;;N;;;;; +1343A;EGYPTIAN HIEROGLYPH INSERT AT TOP;Cf;0;L;;;;;N;;;;; +1343B;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM;Cf;0;L;;;;;N;;;;; +1343C;EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE;Cf;0;L;;;;;N;;;;; +1343D;EGYPTIAN HIEROGLYPH END ENCLOSURE;Cf;0;L;;;;;N;;;;; +1343E;EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE;Cf;0;L;;;;;N;;;;; +1343F;EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE;Cf;0;L;;;;;N;;;;; +13440;EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY;Mn;0;NSM;;;;;N;;;;; +13441;EGYPTIAN HIEROGLYPH FULL BLANK;Lo;0;L;;;;;N;;;;; +13442;EGYPTIAN HIEROGLYPH HALF BLANK;Lo;0;L;;;;;N;;;;; +13443;EGYPTIAN HIEROGLYPH LOST SIGN;Lo;0;L;;;;;N;;;;; +13444;EGYPTIAN HIEROGLYPH HALF LOST SIGN;Lo;0;L;;;;;N;;;;; +13445;EGYPTIAN HIEROGLYPH TALL LOST SIGN;Lo;0;L;;;;;N;;;;; +13446;EGYPTIAN HIEROGLYPH WIDE LOST SIGN;Lo;0;L;;;;;N;;;;; +13447;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START;Mn;0;NSM;;;;;N;;;;; +13448;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START;Mn;0;NSM;;;;;N;;;;; +13449;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START;Mn;0;NSM;;;;;N;;;;; +1344A;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP END;Mn;0;NSM;;;;;N;;;;; +1344B;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP;Mn;0;NSM;;;;;N;;;;; +1344C;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START AND TOP END;Mn;0;NSM;;;;;N;;;;; +1344D;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND TOP;Mn;0;NSM;;;;;N;;;;; +1344E;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM END;Mn;0;NSM;;;;;N;;;;; +1344F;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START AND BOTTOM END;Mn;0;NSM;;;;;N;;;;; +13450;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM;Mn;0;NSM;;;;;N;;;;; +13451;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND BOTTOM;Mn;0;NSM;;;;;N;;;;; +13452;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT END;Mn;0;NSM;;;;;N;;;;; +13453;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP AND END;Mn;0;NSM;;;;;N;;;;; +13454;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM AND END;Mn;0;NSM;;;;;N;;;;; +13455;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED;Mn;0;NSM;;;;;N;;;;; +13460;EGYPTIAN HIEROGLYPH-13460;Lo;0;L;;;;;N;;;;; +13461;EGYPTIAN HIEROGLYPH-13461;Lo;0;L;;;;;N;;;;; +13462;EGYPTIAN HIEROGLYPH-13462;Lo;0;L;;;;;N;;;;; +13463;EGYPTIAN HIEROGLYPH-13463;Lo;0;L;;;;;N;;;;; +13464;EGYPTIAN HIEROGLYPH-13464;Lo;0;L;;;;;N;;;;; +13465;EGYPTIAN HIEROGLYPH-13465;Lo;0;L;;;;;N;;;;; +13466;EGYPTIAN HIEROGLYPH-13466;Lo;0;L;;;;;N;;;;; +13467;EGYPTIAN HIEROGLYPH-13467;Lo;0;L;;;;;N;;;;; +13468;EGYPTIAN HIEROGLYPH-13468;Lo;0;L;;;;;N;;;;; +13469;EGYPTIAN HIEROGLYPH-13469;Lo;0;L;;;;;N;;;;; +1346A;EGYPTIAN HIEROGLYPH-1346A;Lo;0;L;;;;;N;;;;; +1346B;EGYPTIAN HIEROGLYPH-1346B;Lo;0;L;;;;;N;;;;; +1346C;EGYPTIAN HIEROGLYPH-1346C;Lo;0;L;;;;;N;;;;; +1346D;EGYPTIAN HIEROGLYPH-1346D;Lo;0;L;;;;;N;;;;; +1346E;EGYPTIAN HIEROGLYPH-1346E;Lo;0;L;;;;;N;;;;; +1346F;EGYPTIAN HIEROGLYPH-1346F;Lo;0;L;;;;;N;;;;; +13470;EGYPTIAN HIEROGLYPH-13470;Lo;0;L;;;;;N;;;;; +13471;EGYPTIAN HIEROGLYPH-13471;Lo;0;L;;;;;N;;;;; +13472;EGYPTIAN HIEROGLYPH-13472;Lo;0;L;;;;;N;;;;; +13473;EGYPTIAN HIEROGLYPH-13473;Lo;0;L;;;;;N;;;;; +13474;EGYPTIAN HIEROGLYPH-13474;Lo;0;L;;;;;N;;;;; +13475;EGYPTIAN HIEROGLYPH-13475;Lo;0;L;;;;;N;;;;; +13476;EGYPTIAN HIEROGLYPH-13476;Lo;0;L;;;;;N;;;;; +13477;EGYPTIAN HIEROGLYPH-13477;Lo;0;L;;;;;N;;;;; +13478;EGYPTIAN HIEROGLYPH-13478;Lo;0;L;;;;;N;;;;; +13479;EGYPTIAN HIEROGLYPH-13479;Lo;0;L;;;;;N;;;;; +1347A;EGYPTIAN HIEROGLYPH-1347A;Lo;0;L;;;;;N;;;;; +1347B;EGYPTIAN HIEROGLYPH-1347B;Lo;0;L;;;;;N;;;;; +1347C;EGYPTIAN HIEROGLYPH-1347C;Lo;0;L;;;;;N;;;;; +1347D;EGYPTIAN HIEROGLYPH-1347D;Lo;0;L;;;;;N;;;;; +1347E;EGYPTIAN HIEROGLYPH-1347E;Lo;0;L;;;;;N;;;;; +1347F;EGYPTIAN HIEROGLYPH-1347F;Lo;0;L;;;;;N;;;;; +13480;EGYPTIAN HIEROGLYPH-13480;Lo;0;L;;;;;N;;;;; +13481;EGYPTIAN HIEROGLYPH-13481;Lo;0;L;;;;;N;;;;; +13482;EGYPTIAN HIEROGLYPH-13482;Lo;0;L;;;;;N;;;;; +13483;EGYPTIAN HIEROGLYPH-13483;Lo;0;L;;;;;N;;;;; +13484;EGYPTIAN HIEROGLYPH-13484;Lo;0;L;;;;;N;;;;; +13485;EGYPTIAN HIEROGLYPH-13485;Lo;0;L;;;;;N;;;;; +13486;EGYPTIAN HIEROGLYPH-13486;Lo;0;L;;;;;N;;;;; +13487;EGYPTIAN HIEROGLYPH-13487;Lo;0;L;;;;;N;;;;; +13488;EGYPTIAN HIEROGLYPH-13488;Lo;0;L;;;;;N;;;;; +13489;EGYPTIAN HIEROGLYPH-13489;Lo;0;L;;;;;N;;;;; +1348A;EGYPTIAN HIEROGLYPH-1348A;Lo;0;L;;;;;N;;;;; +1348B;EGYPTIAN HIEROGLYPH-1348B;Lo;0;L;;;;;N;;;;; +1348C;EGYPTIAN HIEROGLYPH-1348C;Lo;0;L;;;;;N;;;;; +1348D;EGYPTIAN HIEROGLYPH-1348D;Lo;0;L;;;;;N;;;;; +1348E;EGYPTIAN HIEROGLYPH-1348E;Lo;0;L;;;;;N;;;;; +1348F;EGYPTIAN HIEROGLYPH-1348F;Lo;0;L;;;;;N;;;;; +13490;EGYPTIAN HIEROGLYPH-13490;Lo;0;L;;;;;N;;;;; +13491;EGYPTIAN HIEROGLYPH-13491;Lo;0;L;;;;;N;;;;; +13492;EGYPTIAN HIEROGLYPH-13492;Lo;0;L;;;;;N;;;;; +13493;EGYPTIAN HIEROGLYPH-13493;Lo;0;L;;;;;N;;;;; +13494;EGYPTIAN HIEROGLYPH-13494;Lo;0;L;;;;;N;;;;; +13495;EGYPTIAN HIEROGLYPH-13495;Lo;0;L;;;;;N;;;;; +13496;EGYPTIAN HIEROGLYPH-13496;Lo;0;L;;;;;N;;;;; +13497;EGYPTIAN HIEROGLYPH-13497;Lo;0;L;;;;;N;;;;; +13498;EGYPTIAN HIEROGLYPH-13498;Lo;0;L;;;;;N;;;;; +13499;EGYPTIAN HIEROGLYPH-13499;Lo;0;L;;;;;N;;;;; +1349A;EGYPTIAN HIEROGLYPH-1349A;Lo;0;L;;;;;N;;;;; +1349B;EGYPTIAN HIEROGLYPH-1349B;Lo;0;L;;;;;N;;;;; +1349C;EGYPTIAN HIEROGLYPH-1349C;Lo;0;L;;;;;N;;;;; +1349D;EGYPTIAN HIEROGLYPH-1349D;Lo;0;L;;;;;N;;;;; +1349E;EGYPTIAN HIEROGLYPH-1349E;Lo;0;L;;;;;N;;;;; +1349F;EGYPTIAN HIEROGLYPH-1349F;Lo;0;L;;;;;N;;;;; +134A0;EGYPTIAN HIEROGLYPH-134A0;Lo;0;L;;;;;N;;;;; +134A1;EGYPTIAN HIEROGLYPH-134A1;Lo;0;L;;;;;N;;;;; +134A2;EGYPTIAN HIEROGLYPH-134A2;Lo;0;L;;;;;N;;;;; +134A3;EGYPTIAN HIEROGLYPH-134A3;Lo;0;L;;;;;N;;;;; +134A4;EGYPTIAN HIEROGLYPH-134A4;Lo;0;L;;;;;N;;;;; +134A5;EGYPTIAN HIEROGLYPH-134A5;Lo;0;L;;;;;N;;;;; +134A6;EGYPTIAN HIEROGLYPH-134A6;Lo;0;L;;;;;N;;;;; +134A7;EGYPTIAN HIEROGLYPH-134A7;Lo;0;L;;;;;N;;;;; +134A8;EGYPTIAN HIEROGLYPH-134A8;Lo;0;L;;;;;N;;;;; +134A9;EGYPTIAN HIEROGLYPH-134A9;Lo;0;L;;;;;N;;;;; +134AA;EGYPTIAN HIEROGLYPH-134AA;Lo;0;L;;;;;N;;;;; +134AB;EGYPTIAN HIEROGLYPH-134AB;Lo;0;L;;;;;N;;;;; +134AC;EGYPTIAN HIEROGLYPH-134AC;Lo;0;L;;;;;N;;;;; +134AD;EGYPTIAN HIEROGLYPH-134AD;Lo;0;L;;;;;N;;;;; +134AE;EGYPTIAN HIEROGLYPH-134AE;Lo;0;L;;;;;N;;;;; +134AF;EGYPTIAN HIEROGLYPH-134AF;Lo;0;L;;;;;N;;;;; +134B0;EGYPTIAN HIEROGLYPH-134B0;Lo;0;L;;;;;N;;;;; +134B1;EGYPTIAN HIEROGLYPH-134B1;Lo;0;L;;;;;N;;;;; +134B2;EGYPTIAN HIEROGLYPH-134B2;Lo;0;L;;;;;N;;;;; +134B3;EGYPTIAN HIEROGLYPH-134B3;Lo;0;L;;;;;N;;;;; +134B4;EGYPTIAN HIEROGLYPH-134B4;Lo;0;L;;;;;N;;;;; +134B5;EGYPTIAN HIEROGLYPH-134B5;Lo;0;L;;;;;N;;;;; +134B6;EGYPTIAN HIEROGLYPH-134B6;Lo;0;L;;;;;N;;;;; +134B7;EGYPTIAN HIEROGLYPH-134B7;Lo;0;L;;;;;N;;;;; +134B8;EGYPTIAN HIEROGLYPH-134B8;Lo;0;L;;;;;N;;;;; +134B9;EGYPTIAN HIEROGLYPH-134B9;Lo;0;L;;;;;N;;;;; +134BA;EGYPTIAN HIEROGLYPH-134BA;Lo;0;L;;;;;N;;;;; +134BB;EGYPTIAN HIEROGLYPH-134BB;Lo;0;L;;;;;N;;;;; +134BC;EGYPTIAN HIEROGLYPH-134BC;Lo;0;L;;;;;N;;;;; +134BD;EGYPTIAN HIEROGLYPH-134BD;Lo;0;L;;;;;N;;;;; +134BE;EGYPTIAN HIEROGLYPH-134BE;Lo;0;L;;;;;N;;;;; +134BF;EGYPTIAN HIEROGLYPH-134BF;Lo;0;L;;;;;N;;;;; +134C0;EGYPTIAN HIEROGLYPH-134C0;Lo;0;L;;;;;N;;;;; +134C1;EGYPTIAN HIEROGLYPH-134C1;Lo;0;L;;;;;N;;;;; +134C2;EGYPTIAN HIEROGLYPH-134C2;Lo;0;L;;;;;N;;;;; +134C3;EGYPTIAN HIEROGLYPH-134C3;Lo;0;L;;;;;N;;;;; +134C4;EGYPTIAN HIEROGLYPH-134C4;Lo;0;L;;;;;N;;;;; +134C5;EGYPTIAN HIEROGLYPH-134C5;Lo;0;L;;;;;N;;;;; +134C6;EGYPTIAN HIEROGLYPH-134C6;Lo;0;L;;;;;N;;;;; +134C7;EGYPTIAN HIEROGLYPH-134C7;Lo;0;L;;;;;N;;;;; +134C8;EGYPTIAN HIEROGLYPH-134C8;Lo;0;L;;;;;N;;;;; +134C9;EGYPTIAN HIEROGLYPH-134C9;Lo;0;L;;;;;N;;;;; +134CA;EGYPTIAN HIEROGLYPH-134CA;Lo;0;L;;;;;N;;;;; +134CB;EGYPTIAN HIEROGLYPH-134CB;Lo;0;L;;;;;N;;;;; +134CC;EGYPTIAN HIEROGLYPH-134CC;Lo;0;L;;;;;N;;;;; +134CD;EGYPTIAN HIEROGLYPH-134CD;Lo;0;L;;;;;N;;;;; +134CE;EGYPTIAN HIEROGLYPH-134CE;Lo;0;L;;;;;N;;;;; +134CF;EGYPTIAN HIEROGLYPH-134CF;Lo;0;L;;;;;N;;;;; +134D0;EGYPTIAN HIEROGLYPH-134D0;Lo;0;L;;;;;N;;;;; +134D1;EGYPTIAN HIEROGLYPH-134D1;Lo;0;L;;;;;N;;;;; +134D2;EGYPTIAN HIEROGLYPH-134D2;Lo;0;L;;;;;N;;;;; +134D3;EGYPTIAN HIEROGLYPH-134D3;Lo;0;L;;;;;N;;;;; +134D4;EGYPTIAN HIEROGLYPH-134D4;Lo;0;L;;;;;N;;;;; +134D5;EGYPTIAN HIEROGLYPH-134D5;Lo;0;L;;;;;N;;;;; +134D6;EGYPTIAN HIEROGLYPH-134D6;Lo;0;L;;;;;N;;;;; +134D7;EGYPTIAN HIEROGLYPH-134D7;Lo;0;L;;;;;N;;;;; +134D8;EGYPTIAN HIEROGLYPH-134D8;Lo;0;L;;;;;N;;;;; +134D9;EGYPTIAN HIEROGLYPH-134D9;Lo;0;L;;;;;N;;;;; +134DA;EGYPTIAN HIEROGLYPH-134DA;Lo;0;L;;;;;N;;;;; +134DB;EGYPTIAN HIEROGLYPH-134DB;Lo;0;L;;;;;N;;;;; +134DC;EGYPTIAN HIEROGLYPH-134DC;Lo;0;L;;;;;N;;;;; +134DD;EGYPTIAN HIEROGLYPH-134DD;Lo;0;L;;;;;N;;;;; +134DE;EGYPTIAN HIEROGLYPH-134DE;Lo;0;L;;;;;N;;;;; +134DF;EGYPTIAN HIEROGLYPH-134DF;Lo;0;L;;;;;N;;;;; +134E0;EGYPTIAN HIEROGLYPH-134E0;Lo;0;L;;;;;N;;;;; +134E1;EGYPTIAN HIEROGLYPH-134E1;Lo;0;L;;;;;N;;;;; +134E2;EGYPTIAN HIEROGLYPH-134E2;Lo;0;L;;;;;N;;;;; +134E3;EGYPTIAN HIEROGLYPH-134E3;Lo;0;L;;;;;N;;;;; +134E4;EGYPTIAN HIEROGLYPH-134E4;Lo;0;L;;;;;N;;;;; +134E5;EGYPTIAN HIEROGLYPH-134E5;Lo;0;L;;;;;N;;;;; +134E6;EGYPTIAN HIEROGLYPH-134E6;Lo;0;L;;;;;N;;;;; +134E7;EGYPTIAN HIEROGLYPH-134E7;Lo;0;L;;;;;N;;;;; +134E8;EGYPTIAN HIEROGLYPH-134E8;Lo;0;L;;;;;N;;;;; +134E9;EGYPTIAN HIEROGLYPH-134E9;Lo;0;L;;;;;N;;;;; +134EA;EGYPTIAN HIEROGLYPH-134EA;Lo;0;L;;;;;N;;;;; +134EB;EGYPTIAN HIEROGLYPH-134EB;Lo;0;L;;;;;N;;;;; +134EC;EGYPTIAN HIEROGLYPH-134EC;Lo;0;L;;;;;N;;;;; +134ED;EGYPTIAN HIEROGLYPH-134ED;Lo;0;L;;;;;N;;;;; +134EE;EGYPTIAN HIEROGLYPH-134EE;Lo;0;L;;;;;N;;;;; +134EF;EGYPTIAN HIEROGLYPH-134EF;Lo;0;L;;;;;N;;;;; +134F0;EGYPTIAN HIEROGLYPH-134F0;Lo;0;L;;;;;N;;;;; +134F1;EGYPTIAN HIEROGLYPH-134F1;Lo;0;L;;;;;N;;;;; +134F2;EGYPTIAN HIEROGLYPH-134F2;Lo;0;L;;;;;N;;;;; +134F3;EGYPTIAN HIEROGLYPH-134F3;Lo;0;L;;;;;N;;;;; +134F4;EGYPTIAN HIEROGLYPH-134F4;Lo;0;L;;;;;N;;;;; +134F5;EGYPTIAN HIEROGLYPH-134F5;Lo;0;L;;;;;N;;;;; +134F6;EGYPTIAN HIEROGLYPH-134F6;Lo;0;L;;;;;N;;;;; +134F7;EGYPTIAN HIEROGLYPH-134F7;Lo;0;L;;;;;N;;;;; +134F8;EGYPTIAN HIEROGLYPH-134F8;Lo;0;L;;;;;N;;;;; +134F9;EGYPTIAN HIEROGLYPH-134F9;Lo;0;L;;;;;N;;;;; +134FA;EGYPTIAN HIEROGLYPH-134FA;Lo;0;L;;;;;N;;;;; +134FB;EGYPTIAN HIEROGLYPH-134FB;Lo;0;L;;;;;N;;;;; +134FC;EGYPTIAN HIEROGLYPH-134FC;Lo;0;L;;;;;N;;;;; +134FD;EGYPTIAN HIEROGLYPH-134FD;Lo;0;L;;;;;N;;;;; +134FE;EGYPTIAN HIEROGLYPH-134FE;Lo;0;L;;;;;N;;;;; +134FF;EGYPTIAN HIEROGLYPH-134FF;Lo;0;L;;;;;N;;;;; +13500;EGYPTIAN HIEROGLYPH-13500;Lo;0;L;;;;;N;;;;; +13501;EGYPTIAN HIEROGLYPH-13501;Lo;0;L;;;;;N;;;;; +13502;EGYPTIAN HIEROGLYPH-13502;Lo;0;L;;;;;N;;;;; +13503;EGYPTIAN HIEROGLYPH-13503;Lo;0;L;;;;;N;;;;; +13504;EGYPTIAN HIEROGLYPH-13504;Lo;0;L;;;;;N;;;;; +13505;EGYPTIAN HIEROGLYPH-13505;Lo;0;L;;;;;N;;;;; +13506;EGYPTIAN HIEROGLYPH-13506;Lo;0;L;;;;;N;;;;; +13507;EGYPTIAN HIEROGLYPH-13507;Lo;0;L;;;;;N;;;;; +13508;EGYPTIAN HIEROGLYPH-13508;Lo;0;L;;;;;N;;;;; +13509;EGYPTIAN HIEROGLYPH-13509;Lo;0;L;;;;;N;;;;; +1350A;EGYPTIAN HIEROGLYPH-1350A;Lo;0;L;;;;;N;;;;; +1350B;EGYPTIAN HIEROGLYPH-1350B;Lo;0;L;;;;;N;;;;; +1350C;EGYPTIAN HIEROGLYPH-1350C;Lo;0;L;;;;;N;;;;; +1350D;EGYPTIAN HIEROGLYPH-1350D;Lo;0;L;;;;;N;;;;; +1350E;EGYPTIAN HIEROGLYPH-1350E;Lo;0;L;;;;;N;;;;; +1350F;EGYPTIAN HIEROGLYPH-1350F;Lo;0;L;;;;;N;;;;; +13510;EGYPTIAN HIEROGLYPH-13510;Lo;0;L;;;;;N;;;;; +13511;EGYPTIAN HIEROGLYPH-13511;Lo;0;L;;;;;N;;;;; +13512;EGYPTIAN HIEROGLYPH-13512;Lo;0;L;;;;;N;;;;; +13513;EGYPTIAN HIEROGLYPH-13513;Lo;0;L;;;;;N;;;;; +13514;EGYPTIAN HIEROGLYPH-13514;Lo;0;L;;;;;N;;;;; +13515;EGYPTIAN HIEROGLYPH-13515;Lo;0;L;;;;;N;;;;; +13516;EGYPTIAN HIEROGLYPH-13516;Lo;0;L;;;;;N;;;;; +13517;EGYPTIAN HIEROGLYPH-13517;Lo;0;L;;;;;N;;;;; +13518;EGYPTIAN HIEROGLYPH-13518;Lo;0;L;;;;;N;;;;; +13519;EGYPTIAN HIEROGLYPH-13519;Lo;0;L;;;;;N;;;;; +1351A;EGYPTIAN HIEROGLYPH-1351A;Lo;0;L;;;;;N;;;;; +1351B;EGYPTIAN HIEROGLYPH-1351B;Lo;0;L;;;;;N;;;;; +1351C;EGYPTIAN HIEROGLYPH-1351C;Lo;0;L;;;;;N;;;;; +1351D;EGYPTIAN HIEROGLYPH-1351D;Lo;0;L;;;;;N;;;;; +1351E;EGYPTIAN HIEROGLYPH-1351E;Lo;0;L;;;;;N;;;;; +1351F;EGYPTIAN HIEROGLYPH-1351F;Lo;0;L;;;;;N;;;;; +13520;EGYPTIAN HIEROGLYPH-13520;Lo;0;L;;;;;N;;;;; +13521;EGYPTIAN HIEROGLYPH-13521;Lo;0;L;;;;;N;;;;; +13522;EGYPTIAN HIEROGLYPH-13522;Lo;0;L;;;;;N;;;;; +13523;EGYPTIAN HIEROGLYPH-13523;Lo;0;L;;;;;N;;;;; +13524;EGYPTIAN HIEROGLYPH-13524;Lo;0;L;;;;;N;;;;; +13525;EGYPTIAN HIEROGLYPH-13525;Lo;0;L;;;;;N;;;;; +13526;EGYPTIAN HIEROGLYPH-13526;Lo;0;L;;;;;N;;;;; +13527;EGYPTIAN HIEROGLYPH-13527;Lo;0;L;;;;;N;;;;; +13528;EGYPTIAN HIEROGLYPH-13528;Lo;0;L;;;;;N;;;;; +13529;EGYPTIAN HIEROGLYPH-13529;Lo;0;L;;;;;N;;;;; +1352A;EGYPTIAN HIEROGLYPH-1352A;Lo;0;L;;;;;N;;;;; +1352B;EGYPTIAN HIEROGLYPH-1352B;Lo;0;L;;;;;N;;;;; +1352C;EGYPTIAN HIEROGLYPH-1352C;Lo;0;L;;;;;N;;;;; +1352D;EGYPTIAN HIEROGLYPH-1352D;Lo;0;L;;;;;N;;;;; +1352E;EGYPTIAN HIEROGLYPH-1352E;Lo;0;L;;;;;N;;;;; +1352F;EGYPTIAN HIEROGLYPH-1352F;Lo;0;L;;;;;N;;;;; +13530;EGYPTIAN HIEROGLYPH-13530;Lo;0;L;;;;;N;;;;; +13531;EGYPTIAN HIEROGLYPH-13531;Lo;0;L;;;;;N;;;;; +13532;EGYPTIAN HIEROGLYPH-13532;Lo;0;L;;;;;N;;;;; +13533;EGYPTIAN HIEROGLYPH-13533;Lo;0;L;;;;;N;;;;; +13534;EGYPTIAN HIEROGLYPH-13534;Lo;0;L;;;;;N;;;;; +13535;EGYPTIAN HIEROGLYPH-13535;Lo;0;L;;;;;N;;;;; +13536;EGYPTIAN HIEROGLYPH-13536;Lo;0;L;;;;;N;;;;; +13537;EGYPTIAN HIEROGLYPH-13537;Lo;0;L;;;;;N;;;;; +13538;EGYPTIAN HIEROGLYPH-13538;Lo;0;L;;;;;N;;;;; +13539;EGYPTIAN HIEROGLYPH-13539;Lo;0;L;;;;;N;;;;; +1353A;EGYPTIAN HIEROGLYPH-1353A;Lo;0;L;;;;;N;;;;; +1353B;EGYPTIAN HIEROGLYPH-1353B;Lo;0;L;;;;;N;;;;; +1353C;EGYPTIAN HIEROGLYPH-1353C;Lo;0;L;;;;;N;;;;; +1353D;EGYPTIAN HIEROGLYPH-1353D;Lo;0;L;;;;;N;;;;; +1353E;EGYPTIAN HIEROGLYPH-1353E;Lo;0;L;;;;;N;;;;; +1353F;EGYPTIAN HIEROGLYPH-1353F;Lo;0;L;;;;;N;;;;; +13540;EGYPTIAN HIEROGLYPH-13540;Lo;0;L;;;;;N;;;;; +13541;EGYPTIAN HIEROGLYPH-13541;Lo;0;L;;;;;N;;;;; +13542;EGYPTIAN HIEROGLYPH-13542;Lo;0;L;;;;;N;;;;; +13543;EGYPTIAN HIEROGLYPH-13543;Lo;0;L;;;;;N;;;;; +13544;EGYPTIAN HIEROGLYPH-13544;Lo;0;L;;;;;N;;;;; +13545;EGYPTIAN HIEROGLYPH-13545;Lo;0;L;;;;;N;;;;; +13546;EGYPTIAN HIEROGLYPH-13546;Lo;0;L;;;;;N;;;;; +13547;EGYPTIAN HIEROGLYPH-13547;Lo;0;L;;;;;N;;;;; +13548;EGYPTIAN HIEROGLYPH-13548;Lo;0;L;;;;;N;;;;; +13549;EGYPTIAN HIEROGLYPH-13549;Lo;0;L;;;;;N;;;;; +1354A;EGYPTIAN HIEROGLYPH-1354A;Lo;0;L;;;;;N;;;;; +1354B;EGYPTIAN HIEROGLYPH-1354B;Lo;0;L;;;;;N;;;;; +1354C;EGYPTIAN HIEROGLYPH-1354C;Lo;0;L;;;;;N;;;;; +1354D;EGYPTIAN HIEROGLYPH-1354D;Lo;0;L;;;;;N;;;;; +1354E;EGYPTIAN HIEROGLYPH-1354E;Lo;0;L;;;;;N;;;;; +1354F;EGYPTIAN HIEROGLYPH-1354F;Lo;0;L;;;;;N;;;;; +13550;EGYPTIAN HIEROGLYPH-13550;Lo;0;L;;;;;N;;;;; +13551;EGYPTIAN HIEROGLYPH-13551;Lo;0;L;;;;;N;;;;; +13552;EGYPTIAN HIEROGLYPH-13552;Lo;0;L;;;;;N;;;;; +13553;EGYPTIAN HIEROGLYPH-13553;Lo;0;L;;;;;N;;;;; +13554;EGYPTIAN HIEROGLYPH-13554;Lo;0;L;;;;;N;;;;; +13555;EGYPTIAN HIEROGLYPH-13555;Lo;0;L;;;;;N;;;;; +13556;EGYPTIAN HIEROGLYPH-13556;Lo;0;L;;;;;N;;;;; +13557;EGYPTIAN HIEROGLYPH-13557;Lo;0;L;;;;;N;;;;; +13558;EGYPTIAN HIEROGLYPH-13558;Lo;0;L;;;;;N;;;;; +13559;EGYPTIAN HIEROGLYPH-13559;Lo;0;L;;;;;N;;;;; +1355A;EGYPTIAN HIEROGLYPH-1355A;Lo;0;L;;;;;N;;;;; +1355B;EGYPTIAN HIEROGLYPH-1355B;Lo;0;L;;;;;N;;;;; +1355C;EGYPTIAN HIEROGLYPH-1355C;Lo;0;L;;;;;N;;;;; +1355D;EGYPTIAN HIEROGLYPH-1355D;Lo;0;L;;;;;N;;;;; +1355E;EGYPTIAN HIEROGLYPH-1355E;Lo;0;L;;;;;N;;;;; +1355F;EGYPTIAN HIEROGLYPH-1355F;Lo;0;L;;;;;N;;;;; +13560;EGYPTIAN HIEROGLYPH-13560;Lo;0;L;;;;;N;;;;; +13561;EGYPTIAN HIEROGLYPH-13561;Lo;0;L;;;;;N;;;;; +13562;EGYPTIAN HIEROGLYPH-13562;Lo;0;L;;;;;N;;;;; +13563;EGYPTIAN HIEROGLYPH-13563;Lo;0;L;;;;;N;;;;; +13564;EGYPTIAN HIEROGLYPH-13564;Lo;0;L;;;;;N;;;;; +13565;EGYPTIAN HIEROGLYPH-13565;Lo;0;L;;;;;N;;;;; +13566;EGYPTIAN HIEROGLYPH-13566;Lo;0;L;;;;;N;;;;; +13567;EGYPTIAN HIEROGLYPH-13567;Lo;0;L;;;;;N;;;;; +13568;EGYPTIAN HIEROGLYPH-13568;Lo;0;L;;;;;N;;;;; +13569;EGYPTIAN HIEROGLYPH-13569;Lo;0;L;;;;;N;;;;; +1356A;EGYPTIAN HIEROGLYPH-1356A;Lo;0;L;;;;;N;;;;; +1356B;EGYPTIAN HIEROGLYPH-1356B;Lo;0;L;;;;;N;;;;; +1356C;EGYPTIAN HIEROGLYPH-1356C;Lo;0;L;;;;;N;;;;; +1356D;EGYPTIAN HIEROGLYPH-1356D;Lo;0;L;;;;;N;;;;; +1356E;EGYPTIAN HIEROGLYPH-1356E;Lo;0;L;;;;;N;;;;; +1356F;EGYPTIAN HIEROGLYPH-1356F;Lo;0;L;;;;;N;;;;; +13570;EGYPTIAN HIEROGLYPH-13570;Lo;0;L;;;;;N;;;;; +13571;EGYPTIAN HIEROGLYPH-13571;Lo;0;L;;;;;N;;;;; +13572;EGYPTIAN HIEROGLYPH-13572;Lo;0;L;;;;;N;;;;; +13573;EGYPTIAN HIEROGLYPH-13573;Lo;0;L;;;;;N;;;;; +13574;EGYPTIAN HIEROGLYPH-13574;Lo;0;L;;;;;N;;;;; +13575;EGYPTIAN HIEROGLYPH-13575;Lo;0;L;;;;;N;;;;; +13576;EGYPTIAN HIEROGLYPH-13576;Lo;0;L;;;;;N;;;;; +13577;EGYPTIAN HIEROGLYPH-13577;Lo;0;L;;;;;N;;;;; +13578;EGYPTIAN HIEROGLYPH-13578;Lo;0;L;;;;;N;;;;; +13579;EGYPTIAN HIEROGLYPH-13579;Lo;0;L;;;;;N;;;;; +1357A;EGYPTIAN HIEROGLYPH-1357A;Lo;0;L;;;;;N;;;;; +1357B;EGYPTIAN HIEROGLYPH-1357B;Lo;0;L;;;;;N;;;;; +1357C;EGYPTIAN HIEROGLYPH-1357C;Lo;0;L;;;;;N;;;;; +1357D;EGYPTIAN HIEROGLYPH-1357D;Lo;0;L;;;;;N;;;;; +1357E;EGYPTIAN HIEROGLYPH-1357E;Lo;0;L;;;;;N;;;;; +1357F;EGYPTIAN HIEROGLYPH-1357F;Lo;0;L;;;;;N;;;;; +13580;EGYPTIAN HIEROGLYPH-13580;Lo;0;L;;;;;N;;;;; +13581;EGYPTIAN HIEROGLYPH-13581;Lo;0;L;;;;;N;;;;; +13582;EGYPTIAN HIEROGLYPH-13582;Lo;0;L;;;;;N;;;;; +13583;EGYPTIAN HIEROGLYPH-13583;Lo;0;L;;;;;N;;;;; +13584;EGYPTIAN HIEROGLYPH-13584;Lo;0;L;;;;;N;;;;; +13585;EGYPTIAN HIEROGLYPH-13585;Lo;0;L;;;;;N;;;;; +13586;EGYPTIAN HIEROGLYPH-13586;Lo;0;L;;;;;N;;;;; +13587;EGYPTIAN HIEROGLYPH-13587;Lo;0;L;;;;;N;;;;; +13588;EGYPTIAN HIEROGLYPH-13588;Lo;0;L;;;;;N;;;;; +13589;EGYPTIAN HIEROGLYPH-13589;Lo;0;L;;;;;N;;;;; +1358A;EGYPTIAN HIEROGLYPH-1358A;Lo;0;L;;;;;N;;;;; +1358B;EGYPTIAN HIEROGLYPH-1358B;Lo;0;L;;;;;N;;;;; +1358C;EGYPTIAN HIEROGLYPH-1358C;Lo;0;L;;;;;N;;;;; +1358D;EGYPTIAN HIEROGLYPH-1358D;Lo;0;L;;;;;N;;;;; +1358E;EGYPTIAN HIEROGLYPH-1358E;Lo;0;L;;;;;N;;;;; +1358F;EGYPTIAN HIEROGLYPH-1358F;Lo;0;L;;;;;N;;;;; +13590;EGYPTIAN HIEROGLYPH-13590;Lo;0;L;;;;;N;;;;; +13591;EGYPTIAN HIEROGLYPH-13591;Lo;0;L;;;;;N;;;;; +13592;EGYPTIAN HIEROGLYPH-13592;Lo;0;L;;;;;N;;;;; +13593;EGYPTIAN HIEROGLYPH-13593;Lo;0;L;;;;;N;;;;; +13594;EGYPTIAN HIEROGLYPH-13594;Lo;0;L;;;;;N;;;;; +13595;EGYPTIAN HIEROGLYPH-13595;Lo;0;L;;;;;N;;;;; +13596;EGYPTIAN HIEROGLYPH-13596;Lo;0;L;;;;;N;;;;; +13597;EGYPTIAN HIEROGLYPH-13597;Lo;0;L;;;;;N;;;;; +13598;EGYPTIAN HIEROGLYPH-13598;Lo;0;L;;;;;N;;;;; +13599;EGYPTIAN HIEROGLYPH-13599;Lo;0;L;;;;;N;;;;; +1359A;EGYPTIAN HIEROGLYPH-1359A;Lo;0;L;;;;;N;;;;; +1359B;EGYPTIAN HIEROGLYPH-1359B;Lo;0;L;;;;;N;;;;; +1359C;EGYPTIAN HIEROGLYPH-1359C;Lo;0;L;;;;;N;;;;; +1359D;EGYPTIAN HIEROGLYPH-1359D;Lo;0;L;;;;;N;;;;; +1359E;EGYPTIAN HIEROGLYPH-1359E;Lo;0;L;;;;;N;;;;; +1359F;EGYPTIAN HIEROGLYPH-1359F;Lo;0;L;;;;;N;;;;; +135A0;EGYPTIAN HIEROGLYPH-135A0;Lo;0;L;;;;;N;;;;; +135A1;EGYPTIAN HIEROGLYPH-135A1;Lo;0;L;;;;;N;;;;; +135A2;EGYPTIAN HIEROGLYPH-135A2;Lo;0;L;;;;;N;;;;; +135A3;EGYPTIAN HIEROGLYPH-135A3;Lo;0;L;;;;;N;;;;; +135A4;EGYPTIAN HIEROGLYPH-135A4;Lo;0;L;;;;;N;;;;; +135A5;EGYPTIAN HIEROGLYPH-135A5;Lo;0;L;;;;;N;;;;; +135A6;EGYPTIAN HIEROGLYPH-135A6;Lo;0;L;;;;;N;;;;; +135A7;EGYPTIAN HIEROGLYPH-135A7;Lo;0;L;;;;;N;;;;; +135A8;EGYPTIAN HIEROGLYPH-135A8;Lo;0;L;;;;;N;;;;; +135A9;EGYPTIAN HIEROGLYPH-135A9;Lo;0;L;;;;;N;;;;; +135AA;EGYPTIAN HIEROGLYPH-135AA;Lo;0;L;;;;;N;;;;; +135AB;EGYPTIAN HIEROGLYPH-135AB;Lo;0;L;;;;;N;;;;; +135AC;EGYPTIAN HIEROGLYPH-135AC;Lo;0;L;;;;;N;;;;; +135AD;EGYPTIAN HIEROGLYPH-135AD;Lo;0;L;;;;;N;;;;; +135AE;EGYPTIAN HIEROGLYPH-135AE;Lo;0;L;;;;;N;;;;; +135AF;EGYPTIAN HIEROGLYPH-135AF;Lo;0;L;;;;;N;;;;; +135B0;EGYPTIAN HIEROGLYPH-135B0;Lo;0;L;;;;;N;;;;; +135B1;EGYPTIAN HIEROGLYPH-135B1;Lo;0;L;;;;;N;;;;; +135B2;EGYPTIAN HIEROGLYPH-135B2;Lo;0;L;;;;;N;;;;; +135B3;EGYPTIAN HIEROGLYPH-135B3;Lo;0;L;;;;;N;;;;; +135B4;EGYPTIAN HIEROGLYPH-135B4;Lo;0;L;;;;;N;;;;; +135B5;EGYPTIAN HIEROGLYPH-135B5;Lo;0;L;;;;;N;;;;; +135B6;EGYPTIAN HIEROGLYPH-135B6;Lo;0;L;;;;;N;;;;; +135B7;EGYPTIAN HIEROGLYPH-135B7;Lo;0;L;;;;;N;;;;; +135B8;EGYPTIAN HIEROGLYPH-135B8;Lo;0;L;;;;;N;;;;; +135B9;EGYPTIAN HIEROGLYPH-135B9;Lo;0;L;;;;;N;;;;; +135BA;EGYPTIAN HIEROGLYPH-135BA;Lo;0;L;;;;;N;;;;; +135BB;EGYPTIAN HIEROGLYPH-135BB;Lo;0;L;;;;;N;;;;; +135BC;EGYPTIAN HIEROGLYPH-135BC;Lo;0;L;;;;;N;;;;; +135BD;EGYPTIAN HIEROGLYPH-135BD;Lo;0;L;;;;;N;;;;; +135BE;EGYPTIAN HIEROGLYPH-135BE;Lo;0;L;;;;;N;;;;; +135BF;EGYPTIAN HIEROGLYPH-135BF;Lo;0;L;;;;;N;;;;; +135C0;EGYPTIAN HIEROGLYPH-135C0;Lo;0;L;;;;;N;;;;; +135C1;EGYPTIAN HIEROGLYPH-135C1;Lo;0;L;;;;;N;;;;; +135C2;EGYPTIAN HIEROGLYPH-135C2;Lo;0;L;;;;;N;;;;; +135C3;EGYPTIAN HIEROGLYPH-135C3;Lo;0;L;;;;;N;;;;; +135C4;EGYPTIAN HIEROGLYPH-135C4;Lo;0;L;;;;;N;;;;; +135C5;EGYPTIAN HIEROGLYPH-135C5;Lo;0;L;;;;;N;;;;; +135C6;EGYPTIAN HIEROGLYPH-135C6;Lo;0;L;;;;;N;;;;; +135C7;EGYPTIAN HIEROGLYPH-135C7;Lo;0;L;;;;;N;;;;; +135C8;EGYPTIAN HIEROGLYPH-135C8;Lo;0;L;;;;;N;;;;; +135C9;EGYPTIAN HIEROGLYPH-135C9;Lo;0;L;;;;;N;;;;; +135CA;EGYPTIAN HIEROGLYPH-135CA;Lo;0;L;;;;;N;;;;; +135CB;EGYPTIAN HIEROGLYPH-135CB;Lo;0;L;;;;;N;;;;; +135CC;EGYPTIAN HIEROGLYPH-135CC;Lo;0;L;;;;;N;;;;; +135CD;EGYPTIAN HIEROGLYPH-135CD;Lo;0;L;;;;;N;;;;; +135CE;EGYPTIAN HIEROGLYPH-135CE;Lo;0;L;;;;;N;;;;; +135CF;EGYPTIAN HIEROGLYPH-135CF;Lo;0;L;;;;;N;;;;; +135D0;EGYPTIAN HIEROGLYPH-135D0;Lo;0;L;;;;;N;;;;; +135D1;EGYPTIAN HIEROGLYPH-135D1;Lo;0;L;;;;;N;;;;; +135D2;EGYPTIAN HIEROGLYPH-135D2;Lo;0;L;;;;;N;;;;; +135D3;EGYPTIAN HIEROGLYPH-135D3;Lo;0;L;;;;;N;;;;; +135D4;EGYPTIAN HIEROGLYPH-135D4;Lo;0;L;;;;;N;;;;; +135D5;EGYPTIAN HIEROGLYPH-135D5;Lo;0;L;;;;;N;;;;; +135D6;EGYPTIAN HIEROGLYPH-135D6;Lo;0;L;;;;;N;;;;; +135D7;EGYPTIAN HIEROGLYPH-135D7;Lo;0;L;;;;;N;;;;; +135D8;EGYPTIAN HIEROGLYPH-135D8;Lo;0;L;;;;;N;;;;; +135D9;EGYPTIAN HIEROGLYPH-135D9;Lo;0;L;;;;;N;;;;; +135DA;EGYPTIAN HIEROGLYPH-135DA;Lo;0;L;;;;;N;;;;; +135DB;EGYPTIAN HIEROGLYPH-135DB;Lo;0;L;;;;;N;;;;; +135DC;EGYPTIAN HIEROGLYPH-135DC;Lo;0;L;;;;;N;;;;; +135DD;EGYPTIAN HIEROGLYPH-135DD;Lo;0;L;;;;;N;;;;; +135DE;EGYPTIAN HIEROGLYPH-135DE;Lo;0;L;;;;;N;;;;; +135DF;EGYPTIAN HIEROGLYPH-135DF;Lo;0;L;;;;;N;;;;; +135E0;EGYPTIAN HIEROGLYPH-135E0;Lo;0;L;;;;;N;;;;; +135E1;EGYPTIAN HIEROGLYPH-135E1;Lo;0;L;;;;;N;;;;; +135E2;EGYPTIAN HIEROGLYPH-135E2;Lo;0;L;;;;;N;;;;; +135E3;EGYPTIAN HIEROGLYPH-135E3;Lo;0;L;;;;;N;;;;; +135E4;EGYPTIAN HIEROGLYPH-135E4;Lo;0;L;;;;;N;;;;; +135E5;EGYPTIAN HIEROGLYPH-135E5;Lo;0;L;;;;;N;;;;; +135E6;EGYPTIAN HIEROGLYPH-135E6;Lo;0;L;;;;;N;;;;; +135E7;EGYPTIAN HIEROGLYPH-135E7;Lo;0;L;;;;;N;;;;; +135E8;EGYPTIAN HIEROGLYPH-135E8;Lo;0;L;;;;;N;;;;; +135E9;EGYPTIAN HIEROGLYPH-135E9;Lo;0;L;;;;;N;;;;; +135EA;EGYPTIAN HIEROGLYPH-135EA;Lo;0;L;;;;;N;;;;; +135EB;EGYPTIAN HIEROGLYPH-135EB;Lo;0;L;;;;;N;;;;; +135EC;EGYPTIAN HIEROGLYPH-135EC;Lo;0;L;;;;;N;;;;; +135ED;EGYPTIAN HIEROGLYPH-135ED;Lo;0;L;;;;;N;;;;; +135EE;EGYPTIAN HIEROGLYPH-135EE;Lo;0;L;;;;;N;;;;; +135EF;EGYPTIAN HIEROGLYPH-135EF;Lo;0;L;;;;;N;;;;; +135F0;EGYPTIAN HIEROGLYPH-135F0;Lo;0;L;;;;;N;;;;; +135F1;EGYPTIAN HIEROGLYPH-135F1;Lo;0;L;;;;;N;;;;; +135F2;EGYPTIAN HIEROGLYPH-135F2;Lo;0;L;;;;;N;;;;; +135F3;EGYPTIAN HIEROGLYPH-135F3;Lo;0;L;;;;;N;;;;; +135F4;EGYPTIAN HIEROGLYPH-135F4;Lo;0;L;;;;;N;;;;; +135F5;EGYPTIAN HIEROGLYPH-135F5;Lo;0;L;;;;;N;;;;; +135F6;EGYPTIAN HIEROGLYPH-135F6;Lo;0;L;;;;;N;;;;; +135F7;EGYPTIAN HIEROGLYPH-135F7;Lo;0;L;;;;;N;;;;; +135F8;EGYPTIAN HIEROGLYPH-135F8;Lo;0;L;;;;;N;;;;; +135F9;EGYPTIAN HIEROGLYPH-135F9;Lo;0;L;;;;;N;;;;; +135FA;EGYPTIAN HIEROGLYPH-135FA;Lo;0;L;;;;;N;;;;; +135FB;EGYPTIAN HIEROGLYPH-135FB;Lo;0;L;;;;;N;;;;; +135FC;EGYPTIAN HIEROGLYPH-135FC;Lo;0;L;;;;;N;;;;; +135FD;EGYPTIAN HIEROGLYPH-135FD;Lo;0;L;;;;;N;;;;; +135FE;EGYPTIAN HIEROGLYPH-135FE;Lo;0;L;;;;;N;;;;; +135FF;EGYPTIAN HIEROGLYPH-135FF;Lo;0;L;;;;;N;;;;; +13600;EGYPTIAN HIEROGLYPH-13600;Lo;0;L;;;;;N;;;;; +13601;EGYPTIAN HIEROGLYPH-13601;Lo;0;L;;;;;N;;;;; +13602;EGYPTIAN HIEROGLYPH-13602;Lo;0;L;;;;;N;;;;; +13603;EGYPTIAN HIEROGLYPH-13603;Lo;0;L;;;;;N;;;;; +13604;EGYPTIAN HIEROGLYPH-13604;Lo;0;L;;;;;N;;;;; +13605;EGYPTIAN HIEROGLYPH-13605;Lo;0;L;;;;;N;;;;; +13606;EGYPTIAN HIEROGLYPH-13606;Lo;0;L;;;;;N;;;;; +13607;EGYPTIAN HIEROGLYPH-13607;Lo;0;L;;;;;N;;;;; +13608;EGYPTIAN HIEROGLYPH-13608;Lo;0;L;;;;;N;;;;; +13609;EGYPTIAN HIEROGLYPH-13609;Lo;0;L;;;;;N;;;;; +1360A;EGYPTIAN HIEROGLYPH-1360A;Lo;0;L;;;;;N;;;;; +1360B;EGYPTIAN HIEROGLYPH-1360B;Lo;0;L;;;;;N;;;;; +1360C;EGYPTIAN HIEROGLYPH-1360C;Lo;0;L;;;;;N;;;;; +1360D;EGYPTIAN HIEROGLYPH-1360D;Lo;0;L;;;;;N;;;;; +1360E;EGYPTIAN HIEROGLYPH-1360E;Lo;0;L;;;;;N;;;;; +1360F;EGYPTIAN HIEROGLYPH-1360F;Lo;0;L;;;;;N;;;;; +13610;EGYPTIAN HIEROGLYPH-13610;Lo;0;L;;;;;N;;;;; +13611;EGYPTIAN HIEROGLYPH-13611;Lo;0;L;;;;;N;;;;; +13612;EGYPTIAN HIEROGLYPH-13612;Lo;0;L;;;;;N;;;;; +13613;EGYPTIAN HIEROGLYPH-13613;Lo;0;L;;;;;N;;;;; +13614;EGYPTIAN HIEROGLYPH-13614;Lo;0;L;;;;;N;;;;; +13615;EGYPTIAN HIEROGLYPH-13615;Lo;0;L;;;;;N;;;;; +13616;EGYPTIAN HIEROGLYPH-13616;Lo;0;L;;;;;N;;;;; +13617;EGYPTIAN HIEROGLYPH-13617;Lo;0;L;;;;;N;;;;; +13618;EGYPTIAN HIEROGLYPH-13618;Lo;0;L;;;;;N;;;;; +13619;EGYPTIAN HIEROGLYPH-13619;Lo;0;L;;;;;N;;;;; +1361A;EGYPTIAN HIEROGLYPH-1361A;Lo;0;L;;;;;N;;;;; +1361B;EGYPTIAN HIEROGLYPH-1361B;Lo;0;L;;;;;N;;;;; +1361C;EGYPTIAN HIEROGLYPH-1361C;Lo;0;L;;;;;N;;;;; +1361D;EGYPTIAN HIEROGLYPH-1361D;Lo;0;L;;;;;N;;;;; +1361E;EGYPTIAN HIEROGLYPH-1361E;Lo;0;L;;;;;N;;;;; +1361F;EGYPTIAN HIEROGLYPH-1361F;Lo;0;L;;;;;N;;;;; +13620;EGYPTIAN HIEROGLYPH-13620;Lo;0;L;;;;;N;;;;; +13621;EGYPTIAN HIEROGLYPH-13621;Lo;0;L;;;;;N;;;;; +13622;EGYPTIAN HIEROGLYPH-13622;Lo;0;L;;;;;N;;;;; +13623;EGYPTIAN HIEROGLYPH-13623;Lo;0;L;;;;;N;;;;; +13624;EGYPTIAN HIEROGLYPH-13624;Lo;0;L;;;;;N;;;;; +13625;EGYPTIAN HIEROGLYPH-13625;Lo;0;L;;;;;N;;;;; +13626;EGYPTIAN HIEROGLYPH-13626;Lo;0;L;;;;;N;;;;; +13627;EGYPTIAN HIEROGLYPH-13627;Lo;0;L;;;;;N;;;;; +13628;EGYPTIAN HIEROGLYPH-13628;Lo;0;L;;;;;N;;;;; +13629;EGYPTIAN HIEROGLYPH-13629;Lo;0;L;;;;;N;;;;; +1362A;EGYPTIAN HIEROGLYPH-1362A;Lo;0;L;;;;;N;;;;; +1362B;EGYPTIAN HIEROGLYPH-1362B;Lo;0;L;;;;;N;;;;; +1362C;EGYPTIAN HIEROGLYPH-1362C;Lo;0;L;;;;;N;;;;; +1362D;EGYPTIAN HIEROGLYPH-1362D;Lo;0;L;;;;;N;;;;; +1362E;EGYPTIAN HIEROGLYPH-1362E;Lo;0;L;;;;;N;;;;; +1362F;EGYPTIAN HIEROGLYPH-1362F;Lo;0;L;;;;;N;;;;; +13630;EGYPTIAN HIEROGLYPH-13630;Lo;0;L;;;;;N;;;;; +13631;EGYPTIAN HIEROGLYPH-13631;Lo;0;L;;;;;N;;;;; +13632;EGYPTIAN HIEROGLYPH-13632;Lo;0;L;;;;;N;;;;; +13633;EGYPTIAN HIEROGLYPH-13633;Lo;0;L;;;;;N;;;;; +13634;EGYPTIAN HIEROGLYPH-13634;Lo;0;L;;;;;N;;;;; +13635;EGYPTIAN HIEROGLYPH-13635;Lo;0;L;;;;;N;;;;; +13636;EGYPTIAN HIEROGLYPH-13636;Lo;0;L;;;;;N;;;;; +13637;EGYPTIAN HIEROGLYPH-13637;Lo;0;L;;;;;N;;;;; +13638;EGYPTIAN HIEROGLYPH-13638;Lo;0;L;;;;;N;;;;; +13639;EGYPTIAN HIEROGLYPH-13639;Lo;0;L;;;;;N;;;;; +1363A;EGYPTIAN HIEROGLYPH-1363A;Lo;0;L;;;;;N;;;;; +1363B;EGYPTIAN HIEROGLYPH-1363B;Lo;0;L;;;;;N;;;;; +1363C;EGYPTIAN HIEROGLYPH-1363C;Lo;0;L;;;;;N;;;;; +1363D;EGYPTIAN HIEROGLYPH-1363D;Lo;0;L;;;;;N;;;;; +1363E;EGYPTIAN HIEROGLYPH-1363E;Lo;0;L;;;;;N;;;;; +1363F;EGYPTIAN HIEROGLYPH-1363F;Lo;0;L;;;;;N;;;;; +13640;EGYPTIAN HIEROGLYPH-13640;Lo;0;L;;;;;N;;;;; +13641;EGYPTIAN HIEROGLYPH-13641;Lo;0;L;;;;;N;;;;; +13642;EGYPTIAN HIEROGLYPH-13642;Lo;0;L;;;;;N;;;;; +13643;EGYPTIAN HIEROGLYPH-13643;Lo;0;L;;;;;N;;;;; +13644;EGYPTIAN HIEROGLYPH-13644;Lo;0;L;;;;;N;;;;; +13645;EGYPTIAN HIEROGLYPH-13645;Lo;0;L;;;;;N;;;;; +13646;EGYPTIAN HIEROGLYPH-13646;Lo;0;L;;;;;N;;;;; +13647;EGYPTIAN HIEROGLYPH-13647;Lo;0;L;;;;;N;;;;; +13648;EGYPTIAN HIEROGLYPH-13648;Lo;0;L;;;;;N;;;;; +13649;EGYPTIAN HIEROGLYPH-13649;Lo;0;L;;;;;N;;;;; +1364A;EGYPTIAN HIEROGLYPH-1364A;Lo;0;L;;;;;N;;;;; +1364B;EGYPTIAN HIEROGLYPH-1364B;Lo;0;L;;;;;N;;;;; +1364C;EGYPTIAN HIEROGLYPH-1364C;Lo;0;L;;;;;N;;;;; +1364D;EGYPTIAN HIEROGLYPH-1364D;Lo;0;L;;;;;N;;;;; +1364E;EGYPTIAN HIEROGLYPH-1364E;Lo;0;L;;;;;N;;;;; +1364F;EGYPTIAN HIEROGLYPH-1364F;Lo;0;L;;;;;N;;;;; +13650;EGYPTIAN HIEROGLYPH-13650;Lo;0;L;;;;;N;;;;; +13651;EGYPTIAN HIEROGLYPH-13651;Lo;0;L;;;;;N;;;;; +13652;EGYPTIAN HIEROGLYPH-13652;Lo;0;L;;;;;N;;;;; +13653;EGYPTIAN HIEROGLYPH-13653;Lo;0;L;;;;;N;;;;; +13654;EGYPTIAN HIEROGLYPH-13654;Lo;0;L;;;;;N;;;;; +13655;EGYPTIAN HIEROGLYPH-13655;Lo;0;L;;;;;N;;;;; +13656;EGYPTIAN HIEROGLYPH-13656;Lo;0;L;;;;;N;;;;; +13657;EGYPTIAN HIEROGLYPH-13657;Lo;0;L;;;;;N;;;;; +13658;EGYPTIAN HIEROGLYPH-13658;Lo;0;L;;;;;N;;;;; +13659;EGYPTIAN HIEROGLYPH-13659;Lo;0;L;;;;;N;;;;; +1365A;EGYPTIAN HIEROGLYPH-1365A;Lo;0;L;;;;;N;;;;; +1365B;EGYPTIAN HIEROGLYPH-1365B;Lo;0;L;;;;;N;;;;; +1365C;EGYPTIAN HIEROGLYPH-1365C;Lo;0;L;;;;;N;;;;; +1365D;EGYPTIAN HIEROGLYPH-1365D;Lo;0;L;;;;;N;;;;; +1365E;EGYPTIAN HIEROGLYPH-1365E;Lo;0;L;;;;;N;;;;; +1365F;EGYPTIAN HIEROGLYPH-1365F;Lo;0;L;;;;;N;;;;; +13660;EGYPTIAN HIEROGLYPH-13660;Lo;0;L;;;;;N;;;;; +13661;EGYPTIAN HIEROGLYPH-13661;Lo;0;L;;;;;N;;;;; +13662;EGYPTIAN HIEROGLYPH-13662;Lo;0;L;;;;;N;;;;; +13663;EGYPTIAN HIEROGLYPH-13663;Lo;0;L;;;;;N;;;;; +13664;EGYPTIAN HIEROGLYPH-13664;Lo;0;L;;;;;N;;;;; +13665;EGYPTIAN HIEROGLYPH-13665;Lo;0;L;;;;;N;;;;; +13666;EGYPTIAN HIEROGLYPH-13666;Lo;0;L;;;;;N;;;;; +13667;EGYPTIAN HIEROGLYPH-13667;Lo;0;L;;;;;N;;;;; +13668;EGYPTIAN HIEROGLYPH-13668;Lo;0;L;;;;;N;;;;; +13669;EGYPTIAN HIEROGLYPH-13669;Lo;0;L;;;;;N;;;;; +1366A;EGYPTIAN HIEROGLYPH-1366A;Lo;0;L;;;;;N;;;;; +1366B;EGYPTIAN HIEROGLYPH-1366B;Lo;0;L;;;;;N;;;;; +1366C;EGYPTIAN HIEROGLYPH-1366C;Lo;0;L;;;;;N;;;;; +1366D;EGYPTIAN HIEROGLYPH-1366D;Lo;0;L;;;;;N;;;;; +1366E;EGYPTIAN HIEROGLYPH-1366E;Lo;0;L;;;;;N;;;;; +1366F;EGYPTIAN HIEROGLYPH-1366F;Lo;0;L;;;;;N;;;;; +13670;EGYPTIAN HIEROGLYPH-13670;Lo;0;L;;;;;N;;;;; +13671;EGYPTIAN HIEROGLYPH-13671;Lo;0;L;;;;;N;;;;; +13672;EGYPTIAN HIEROGLYPH-13672;Lo;0;L;;;;;N;;;;; +13673;EGYPTIAN HIEROGLYPH-13673;Lo;0;L;;;;;N;;;;; +13674;EGYPTIAN HIEROGLYPH-13674;Lo;0;L;;;;;N;;;;; +13675;EGYPTIAN HIEROGLYPH-13675;Lo;0;L;;;;;N;;;;; +13676;EGYPTIAN HIEROGLYPH-13676;Lo;0;L;;;;;N;;;;; +13677;EGYPTIAN HIEROGLYPH-13677;Lo;0;L;;;;;N;;;;; +13678;EGYPTIAN HIEROGLYPH-13678;Lo;0;L;;;;;N;;;;; +13679;EGYPTIAN HIEROGLYPH-13679;Lo;0;L;;;;;N;;;;; +1367A;EGYPTIAN HIEROGLYPH-1367A;Lo;0;L;;;;;N;;;;; +1367B;EGYPTIAN HIEROGLYPH-1367B;Lo;0;L;;;;;N;;;;; +1367C;EGYPTIAN HIEROGLYPH-1367C;Lo;0;L;;;;;N;;;;; +1367D;EGYPTIAN HIEROGLYPH-1367D;Lo;0;L;;;;;N;;;;; +1367E;EGYPTIAN HIEROGLYPH-1367E;Lo;0;L;;;;;N;;;;; +1367F;EGYPTIAN HIEROGLYPH-1367F;Lo;0;L;;;;;N;;;;; +13680;EGYPTIAN HIEROGLYPH-13680;Lo;0;L;;;;;N;;;;; +13681;EGYPTIAN HIEROGLYPH-13681;Lo;0;L;;;;;N;;;;; +13682;EGYPTIAN HIEROGLYPH-13682;Lo;0;L;;;;;N;;;;; +13683;EGYPTIAN HIEROGLYPH-13683;Lo;0;L;;;;;N;;;;; +13684;EGYPTIAN HIEROGLYPH-13684;Lo;0;L;;;;;N;;;;; +13685;EGYPTIAN HIEROGLYPH-13685;Lo;0;L;;;;;N;;;;; +13686;EGYPTIAN HIEROGLYPH-13686;Lo;0;L;;;;;N;;;;; +13687;EGYPTIAN HIEROGLYPH-13687;Lo;0;L;;;;;N;;;;; +13688;EGYPTIAN HIEROGLYPH-13688;Lo;0;L;;;;;N;;;;; +13689;EGYPTIAN HIEROGLYPH-13689;Lo;0;L;;;;;N;;;;; +1368A;EGYPTIAN HIEROGLYPH-1368A;Lo;0;L;;;;;N;;;;; +1368B;EGYPTIAN HIEROGLYPH-1368B;Lo;0;L;;;;;N;;;;; +1368C;EGYPTIAN HIEROGLYPH-1368C;Lo;0;L;;;;;N;;;;; +1368D;EGYPTIAN HIEROGLYPH-1368D;Lo;0;L;;;;;N;;;;; +1368E;EGYPTIAN HIEROGLYPH-1368E;Lo;0;L;;;;;N;;;;; +1368F;EGYPTIAN HIEROGLYPH-1368F;Lo;0;L;;;;;N;;;;; +13690;EGYPTIAN HIEROGLYPH-13690;Lo;0;L;;;;;N;;;;; +13691;EGYPTIAN HIEROGLYPH-13691;Lo;0;L;;;;;N;;;;; +13692;EGYPTIAN HIEROGLYPH-13692;Lo;0;L;;;;;N;;;;; +13693;EGYPTIAN HIEROGLYPH-13693;Lo;0;L;;;;;N;;;;; +13694;EGYPTIAN HIEROGLYPH-13694;Lo;0;L;;;;;N;;;;; +13695;EGYPTIAN HIEROGLYPH-13695;Lo;0;L;;;;;N;;;;; +13696;EGYPTIAN HIEROGLYPH-13696;Lo;0;L;;;;;N;;;;; +13697;EGYPTIAN HIEROGLYPH-13697;Lo;0;L;;;;;N;;;;; +13698;EGYPTIAN HIEROGLYPH-13698;Lo;0;L;;;;;N;;;;; +13699;EGYPTIAN HIEROGLYPH-13699;Lo;0;L;;;;;N;;;;; +1369A;EGYPTIAN HIEROGLYPH-1369A;Lo;0;L;;;;;N;;;;; +1369B;EGYPTIAN HIEROGLYPH-1369B;Lo;0;L;;;;;N;;;;; +1369C;EGYPTIAN HIEROGLYPH-1369C;Lo;0;L;;;;;N;;;;; +1369D;EGYPTIAN HIEROGLYPH-1369D;Lo;0;L;;;;;N;;;;; +1369E;EGYPTIAN HIEROGLYPH-1369E;Lo;0;L;;;;;N;;;;; +1369F;EGYPTIAN HIEROGLYPH-1369F;Lo;0;L;;;;;N;;;;; +136A0;EGYPTIAN HIEROGLYPH-136A0;Lo;0;L;;;;;N;;;;; +136A1;EGYPTIAN HIEROGLYPH-136A1;Lo;0;L;;;;;N;;;;; +136A2;EGYPTIAN HIEROGLYPH-136A2;Lo;0;L;;;;;N;;;;; +136A3;EGYPTIAN HIEROGLYPH-136A3;Lo;0;L;;;;;N;;;;; +136A4;EGYPTIAN HIEROGLYPH-136A4;Lo;0;L;;;;;N;;;;; +136A5;EGYPTIAN HIEROGLYPH-136A5;Lo;0;L;;;;;N;;;;; +136A6;EGYPTIAN HIEROGLYPH-136A6;Lo;0;L;;;;;N;;;;; +136A7;EGYPTIAN HIEROGLYPH-136A7;Lo;0;L;;;;;N;;;;; +136A8;EGYPTIAN HIEROGLYPH-136A8;Lo;0;L;;;;;N;;;;; +136A9;EGYPTIAN HIEROGLYPH-136A9;Lo;0;L;;;;;N;;;;; +136AA;EGYPTIAN HIEROGLYPH-136AA;Lo;0;L;;;;;N;;;;; +136AB;EGYPTIAN HIEROGLYPH-136AB;Lo;0;L;;;;;N;;;;; +136AC;EGYPTIAN HIEROGLYPH-136AC;Lo;0;L;;;;;N;;;;; +136AD;EGYPTIAN HIEROGLYPH-136AD;Lo;0;L;;;;;N;;;;; +136AE;EGYPTIAN HIEROGLYPH-136AE;Lo;0;L;;;;;N;;;;; +136AF;EGYPTIAN HIEROGLYPH-136AF;Lo;0;L;;;;;N;;;;; +136B0;EGYPTIAN HIEROGLYPH-136B0;Lo;0;L;;;;;N;;;;; +136B1;EGYPTIAN HIEROGLYPH-136B1;Lo;0;L;;;;;N;;;;; +136B2;EGYPTIAN HIEROGLYPH-136B2;Lo;0;L;;;;;N;;;;; +136B3;EGYPTIAN HIEROGLYPH-136B3;Lo;0;L;;;;;N;;;;; +136B4;EGYPTIAN HIEROGLYPH-136B4;Lo;0;L;;;;;N;;;;; +136B5;EGYPTIAN HIEROGLYPH-136B5;Lo;0;L;;;;;N;;;;; +136B6;EGYPTIAN HIEROGLYPH-136B6;Lo;0;L;;;;;N;;;;; +136B7;EGYPTIAN HIEROGLYPH-136B7;Lo;0;L;;;;;N;;;;; +136B8;EGYPTIAN HIEROGLYPH-136B8;Lo;0;L;;;;;N;;;;; +136B9;EGYPTIAN HIEROGLYPH-136B9;Lo;0;L;;;;;N;;;;; +136BA;EGYPTIAN HIEROGLYPH-136BA;Lo;0;L;;;;;N;;;;; +136BB;EGYPTIAN HIEROGLYPH-136BB;Lo;0;L;;;;;N;;;;; +136BC;EGYPTIAN HIEROGLYPH-136BC;Lo;0;L;;;;;N;;;;; +136BD;EGYPTIAN HIEROGLYPH-136BD;Lo;0;L;;;;;N;;;;; +136BE;EGYPTIAN HIEROGLYPH-136BE;Lo;0;L;;;;;N;;;;; +136BF;EGYPTIAN HIEROGLYPH-136BF;Lo;0;L;;;;;N;;;;; +136C0;EGYPTIAN HIEROGLYPH-136C0;Lo;0;L;;;;;N;;;;; +136C1;EGYPTIAN HIEROGLYPH-136C1;Lo;0;L;;;;;N;;;;; +136C2;EGYPTIAN HIEROGLYPH-136C2;Lo;0;L;;;;;N;;;;; +136C3;EGYPTIAN HIEROGLYPH-136C3;Lo;0;L;;;;;N;;;;; +136C4;EGYPTIAN HIEROGLYPH-136C4;Lo;0;L;;;;;N;;;;; +136C5;EGYPTIAN HIEROGLYPH-136C5;Lo;0;L;;;;;N;;;;; +136C6;EGYPTIAN HIEROGLYPH-136C6;Lo;0;L;;;;;N;;;;; +136C7;EGYPTIAN HIEROGLYPH-136C7;Lo;0;L;;;;;N;;;;; +136C8;EGYPTIAN HIEROGLYPH-136C8;Lo;0;L;;;;;N;;;;; +136C9;EGYPTIAN HIEROGLYPH-136C9;Lo;0;L;;;;;N;;;;; +136CA;EGYPTIAN HIEROGLYPH-136CA;Lo;0;L;;;;;N;;;;; +136CB;EGYPTIAN HIEROGLYPH-136CB;Lo;0;L;;;;;N;;;;; +136CC;EGYPTIAN HIEROGLYPH-136CC;Lo;0;L;;;;;N;;;;; +136CD;EGYPTIAN HIEROGLYPH-136CD;Lo;0;L;;;;;N;;;;; +136CE;EGYPTIAN HIEROGLYPH-136CE;Lo;0;L;;;;;N;;;;; +136CF;EGYPTIAN HIEROGLYPH-136CF;Lo;0;L;;;;;N;;;;; +136D0;EGYPTIAN HIEROGLYPH-136D0;Lo;0;L;;;;;N;;;;; +136D1;EGYPTIAN HIEROGLYPH-136D1;Lo;0;L;;;;;N;;;;; +136D2;EGYPTIAN HIEROGLYPH-136D2;Lo;0;L;;;;;N;;;;; +136D3;EGYPTIAN HIEROGLYPH-136D3;Lo;0;L;;;;;N;;;;; +136D4;EGYPTIAN HIEROGLYPH-136D4;Lo;0;L;;;;;N;;;;; +136D5;EGYPTIAN HIEROGLYPH-136D5;Lo;0;L;;;;;N;;;;; +136D6;EGYPTIAN HIEROGLYPH-136D6;Lo;0;L;;;;;N;;;;; +136D7;EGYPTIAN HIEROGLYPH-136D7;Lo;0;L;;;;;N;;;;; +136D8;EGYPTIAN HIEROGLYPH-136D8;Lo;0;L;;;;;N;;;;; +136D9;EGYPTIAN HIEROGLYPH-136D9;Lo;0;L;;;;;N;;;;; +136DA;EGYPTIAN HIEROGLYPH-136DA;Lo;0;L;;;;;N;;;;; +136DB;EGYPTIAN HIEROGLYPH-136DB;Lo;0;L;;;;;N;;;;; +136DC;EGYPTIAN HIEROGLYPH-136DC;Lo;0;L;;;;;N;;;;; +136DD;EGYPTIAN HIEROGLYPH-136DD;Lo;0;L;;;;;N;;;;; +136DE;EGYPTIAN HIEROGLYPH-136DE;Lo;0;L;;;;;N;;;;; +136DF;EGYPTIAN HIEROGLYPH-136DF;Lo;0;L;;;;;N;;;;; +136E0;EGYPTIAN HIEROGLYPH-136E0;Lo;0;L;;;;;N;;;;; +136E1;EGYPTIAN HIEROGLYPH-136E1;Lo;0;L;;;;;N;;;;; +136E2;EGYPTIAN HIEROGLYPH-136E2;Lo;0;L;;;;;N;;;;; +136E3;EGYPTIAN HIEROGLYPH-136E3;Lo;0;L;;;;;N;;;;; +136E4;EGYPTIAN HIEROGLYPH-136E4;Lo;0;L;;;;;N;;;;; +136E5;EGYPTIAN HIEROGLYPH-136E5;Lo;0;L;;;;;N;;;;; +136E6;EGYPTIAN HIEROGLYPH-136E6;Lo;0;L;;;;;N;;;;; +136E7;EGYPTIAN HIEROGLYPH-136E7;Lo;0;L;;;;;N;;;;; +136E8;EGYPTIAN HIEROGLYPH-136E8;Lo;0;L;;;;;N;;;;; +136E9;EGYPTIAN HIEROGLYPH-136E9;Lo;0;L;;;;;N;;;;; +136EA;EGYPTIAN HIEROGLYPH-136EA;Lo;0;L;;;;;N;;;;; +136EB;EGYPTIAN HIEROGLYPH-136EB;Lo;0;L;;;;;N;;;;; +136EC;EGYPTIAN HIEROGLYPH-136EC;Lo;0;L;;;;;N;;;;; +136ED;EGYPTIAN HIEROGLYPH-136ED;Lo;0;L;;;;;N;;;;; +136EE;EGYPTIAN HIEROGLYPH-136EE;Lo;0;L;;;;;N;;;;; +136EF;EGYPTIAN HIEROGLYPH-136EF;Lo;0;L;;;;;N;;;;; +136F0;EGYPTIAN HIEROGLYPH-136F0;Lo;0;L;;;;;N;;;;; +136F1;EGYPTIAN HIEROGLYPH-136F1;Lo;0;L;;;;;N;;;;; +136F2;EGYPTIAN HIEROGLYPH-136F2;Lo;0;L;;;;;N;;;;; +136F3;EGYPTIAN HIEROGLYPH-136F3;Lo;0;L;;;;;N;;;;; +136F4;EGYPTIAN HIEROGLYPH-136F4;Lo;0;L;;;;;N;;;;; +136F5;EGYPTIAN HIEROGLYPH-136F5;Lo;0;L;;;;;N;;;;; +136F6;EGYPTIAN HIEROGLYPH-136F6;Lo;0;L;;;;;N;;;;; +136F7;EGYPTIAN HIEROGLYPH-136F7;Lo;0;L;;;;;N;;;;; +136F8;EGYPTIAN HIEROGLYPH-136F8;Lo;0;L;;;;;N;;;;; +136F9;EGYPTIAN HIEROGLYPH-136F9;Lo;0;L;;;;;N;;;;; +136FA;EGYPTIAN HIEROGLYPH-136FA;Lo;0;L;;;;;N;;;;; +136FB;EGYPTIAN HIEROGLYPH-136FB;Lo;0;L;;;;;N;;;;; +136FC;EGYPTIAN HIEROGLYPH-136FC;Lo;0;L;;;;;N;;;;; +136FD;EGYPTIAN HIEROGLYPH-136FD;Lo;0;L;;;;;N;;;;; +136FE;EGYPTIAN HIEROGLYPH-136FE;Lo;0;L;;;;;N;;;;; +136FF;EGYPTIAN HIEROGLYPH-136FF;Lo;0;L;;;;;N;;;;; +13700;EGYPTIAN HIEROGLYPH-13700;Lo;0;L;;;;;N;;;;; +13701;EGYPTIAN HIEROGLYPH-13701;Lo;0;L;;;;;N;;;;; +13702;EGYPTIAN HIEROGLYPH-13702;Lo;0;L;;;;;N;;;;; +13703;EGYPTIAN HIEROGLYPH-13703;Lo;0;L;;;;;N;;;;; +13704;EGYPTIAN HIEROGLYPH-13704;Lo;0;L;;;;;N;;;;; +13705;EGYPTIAN HIEROGLYPH-13705;Lo;0;L;;;;;N;;;;; +13706;EGYPTIAN HIEROGLYPH-13706;Lo;0;L;;;;;N;;;;; +13707;EGYPTIAN HIEROGLYPH-13707;Lo;0;L;;;;;N;;;;; +13708;EGYPTIAN HIEROGLYPH-13708;Lo;0;L;;;;;N;;;;; +13709;EGYPTIAN HIEROGLYPH-13709;Lo;0;L;;;;;N;;;;; +1370A;EGYPTIAN HIEROGLYPH-1370A;Lo;0;L;;;;;N;;;;; +1370B;EGYPTIAN HIEROGLYPH-1370B;Lo;0;L;;;;;N;;;;; +1370C;EGYPTIAN HIEROGLYPH-1370C;Lo;0;L;;;;;N;;;;; +1370D;EGYPTIAN HIEROGLYPH-1370D;Lo;0;L;;;;;N;;;;; +1370E;EGYPTIAN HIEROGLYPH-1370E;Lo;0;L;;;;;N;;;;; +1370F;EGYPTIAN HIEROGLYPH-1370F;Lo;0;L;;;;;N;;;;; +13710;EGYPTIAN HIEROGLYPH-13710;Lo;0;L;;;;;N;;;;; +13711;EGYPTIAN HIEROGLYPH-13711;Lo;0;L;;;;;N;;;;; +13712;EGYPTIAN HIEROGLYPH-13712;Lo;0;L;;;;;N;;;;; +13713;EGYPTIAN HIEROGLYPH-13713;Lo;0;L;;;;;N;;;;; +13714;EGYPTIAN HIEROGLYPH-13714;Lo;0;L;;;;;N;;;;; +13715;EGYPTIAN HIEROGLYPH-13715;Lo;0;L;;;;;N;;;;; +13716;EGYPTIAN HIEROGLYPH-13716;Lo;0;L;;;;;N;;;;; +13717;EGYPTIAN HIEROGLYPH-13717;Lo;0;L;;;;;N;;;;; +13718;EGYPTIAN HIEROGLYPH-13718;Lo;0;L;;;;;N;;;;; +13719;EGYPTIAN HIEROGLYPH-13719;Lo;0;L;;;;;N;;;;; +1371A;EGYPTIAN HIEROGLYPH-1371A;Lo;0;L;;;;;N;;;;; +1371B;EGYPTIAN HIEROGLYPH-1371B;Lo;0;L;;;;;N;;;;; +1371C;EGYPTIAN HIEROGLYPH-1371C;Lo;0;L;;;;;N;;;;; +1371D;EGYPTIAN HIEROGLYPH-1371D;Lo;0;L;;;;;N;;;;; +1371E;EGYPTIAN HIEROGLYPH-1371E;Lo;0;L;;;;;N;;;;; +1371F;EGYPTIAN HIEROGLYPH-1371F;Lo;0;L;;;;;N;;;;; +13720;EGYPTIAN HIEROGLYPH-13720;Lo;0;L;;;;;N;;;;; +13721;EGYPTIAN HIEROGLYPH-13721;Lo;0;L;;;;;N;;;;; +13722;EGYPTIAN HIEROGLYPH-13722;Lo;0;L;;;;;N;;;;; +13723;EGYPTIAN HIEROGLYPH-13723;Lo;0;L;;;;;N;;;;; +13724;EGYPTIAN HIEROGLYPH-13724;Lo;0;L;;;;;N;;;;; +13725;EGYPTIAN HIEROGLYPH-13725;Lo;0;L;;;;;N;;;;; +13726;EGYPTIAN HIEROGLYPH-13726;Lo;0;L;;;;;N;;;;; +13727;EGYPTIAN HIEROGLYPH-13727;Lo;0;L;;;;;N;;;;; +13728;EGYPTIAN HIEROGLYPH-13728;Lo;0;L;;;;;N;;;;; +13729;EGYPTIAN HIEROGLYPH-13729;Lo;0;L;;;;;N;;;;; +1372A;EGYPTIAN HIEROGLYPH-1372A;Lo;0;L;;;;;N;;;;; +1372B;EGYPTIAN HIEROGLYPH-1372B;Lo;0;L;;;;;N;;;;; +1372C;EGYPTIAN HIEROGLYPH-1372C;Lo;0;L;;;;;N;;;;; +1372D;EGYPTIAN HIEROGLYPH-1372D;Lo;0;L;;;;;N;;;;; +1372E;EGYPTIAN HIEROGLYPH-1372E;Lo;0;L;;;;;N;;;;; +1372F;EGYPTIAN HIEROGLYPH-1372F;Lo;0;L;;;;;N;;;;; +13730;EGYPTIAN HIEROGLYPH-13730;Lo;0;L;;;;;N;;;;; +13731;EGYPTIAN HIEROGLYPH-13731;Lo;0;L;;;;;N;;;;; +13732;EGYPTIAN HIEROGLYPH-13732;Lo;0;L;;;;;N;;;;; +13733;EGYPTIAN HIEROGLYPH-13733;Lo;0;L;;;;;N;;;;; +13734;EGYPTIAN HIEROGLYPH-13734;Lo;0;L;;;;;N;;;;; +13735;EGYPTIAN HIEROGLYPH-13735;Lo;0;L;;;;;N;;;;; +13736;EGYPTIAN HIEROGLYPH-13736;Lo;0;L;;;;;N;;;;; +13737;EGYPTIAN HIEROGLYPH-13737;Lo;0;L;;;;;N;;;;; +13738;EGYPTIAN HIEROGLYPH-13738;Lo;0;L;;;;;N;;;;; +13739;EGYPTIAN HIEROGLYPH-13739;Lo;0;L;;;;;N;;;;; +1373A;EGYPTIAN HIEROGLYPH-1373A;Lo;0;L;;;;;N;;;;; +1373B;EGYPTIAN HIEROGLYPH-1373B;Lo;0;L;;;;;N;;;;; +1373C;EGYPTIAN HIEROGLYPH-1373C;Lo;0;L;;;;;N;;;;; +1373D;EGYPTIAN HIEROGLYPH-1373D;Lo;0;L;;;;;N;;;;; +1373E;EGYPTIAN HIEROGLYPH-1373E;Lo;0;L;;;;;N;;;;; +1373F;EGYPTIAN HIEROGLYPH-1373F;Lo;0;L;;;;;N;;;;; +13740;EGYPTIAN HIEROGLYPH-13740;Lo;0;L;;;;;N;;;;; +13741;EGYPTIAN HIEROGLYPH-13741;Lo;0;L;;;;;N;;;;; +13742;EGYPTIAN HIEROGLYPH-13742;Lo;0;L;;;;;N;;;;; +13743;EGYPTIAN HIEROGLYPH-13743;Lo;0;L;;;;;N;;;;; +13744;EGYPTIAN HIEROGLYPH-13744;Lo;0;L;;;;;N;;;;; +13745;EGYPTIAN HIEROGLYPH-13745;Lo;0;L;;;;;N;;;;; +13746;EGYPTIAN HIEROGLYPH-13746;Lo;0;L;;;;;N;;;;; +13747;EGYPTIAN HIEROGLYPH-13747;Lo;0;L;;;;;N;;;;; +13748;EGYPTIAN HIEROGLYPH-13748;Lo;0;L;;;;;N;;;;; +13749;EGYPTIAN HIEROGLYPH-13749;Lo;0;L;;;;;N;;;;; +1374A;EGYPTIAN HIEROGLYPH-1374A;Lo;0;L;;;;;N;;;;; +1374B;EGYPTIAN HIEROGLYPH-1374B;Lo;0;L;;;;;N;;;;; +1374C;EGYPTIAN HIEROGLYPH-1374C;Lo;0;L;;;;;N;;;;; +1374D;EGYPTIAN HIEROGLYPH-1374D;Lo;0;L;;;;;N;;;;; +1374E;EGYPTIAN HIEROGLYPH-1374E;Lo;0;L;;;;;N;;;;; +1374F;EGYPTIAN HIEROGLYPH-1374F;Lo;0;L;;;;;N;;;;; +13750;EGYPTIAN HIEROGLYPH-13750;Lo;0;L;;;;;N;;;;; +13751;EGYPTIAN HIEROGLYPH-13751;Lo;0;L;;;;;N;;;;; +13752;EGYPTIAN HIEROGLYPH-13752;Lo;0;L;;;;;N;;;;; +13753;EGYPTIAN HIEROGLYPH-13753;Lo;0;L;;;;;N;;;;; +13754;EGYPTIAN HIEROGLYPH-13754;Lo;0;L;;;;;N;;;;; +13755;EGYPTIAN HIEROGLYPH-13755;Lo;0;L;;;;;N;;;;; +13756;EGYPTIAN HIEROGLYPH-13756;Lo;0;L;;;;;N;;;;; +13757;EGYPTIAN HIEROGLYPH-13757;Lo;0;L;;;;;N;;;;; +13758;EGYPTIAN HIEROGLYPH-13758;Lo;0;L;;;;;N;;;;; +13759;EGYPTIAN HIEROGLYPH-13759;Lo;0;L;;;;;N;;;;; +1375A;EGYPTIAN HIEROGLYPH-1375A;Lo;0;L;;;;;N;;;;; +1375B;EGYPTIAN HIEROGLYPH-1375B;Lo;0;L;;;;;N;;;;; +1375C;EGYPTIAN HIEROGLYPH-1375C;Lo;0;L;;;;;N;;;;; +1375D;EGYPTIAN HIEROGLYPH-1375D;Lo;0;L;;;;;N;;;;; +1375E;EGYPTIAN HIEROGLYPH-1375E;Lo;0;L;;;;;N;;;;; +1375F;EGYPTIAN HIEROGLYPH-1375F;Lo;0;L;;;;;N;;;;; +13760;EGYPTIAN HIEROGLYPH-13760;Lo;0;L;;;;;N;;;;; +13761;EGYPTIAN HIEROGLYPH-13761;Lo;0;L;;;;;N;;;;; +13762;EGYPTIAN HIEROGLYPH-13762;Lo;0;L;;;;;N;;;;; +13763;EGYPTIAN HIEROGLYPH-13763;Lo;0;L;;;;;N;;;;; +13764;EGYPTIAN HIEROGLYPH-13764;Lo;0;L;;;;;N;;;;; +13765;EGYPTIAN HIEROGLYPH-13765;Lo;0;L;;;;;N;;;;; +13766;EGYPTIAN HIEROGLYPH-13766;Lo;0;L;;;;;N;;;;; +13767;EGYPTIAN HIEROGLYPH-13767;Lo;0;L;;;;;N;;;;; +13768;EGYPTIAN HIEROGLYPH-13768;Lo;0;L;;;;;N;;;;; +13769;EGYPTIAN HIEROGLYPH-13769;Lo;0;L;;;;;N;;;;; +1376A;EGYPTIAN HIEROGLYPH-1376A;Lo;0;L;;;;;N;;;;; +1376B;EGYPTIAN HIEROGLYPH-1376B;Lo;0;L;;;;;N;;;;; +1376C;EGYPTIAN HIEROGLYPH-1376C;Lo;0;L;;;;;N;;;;; +1376D;EGYPTIAN HIEROGLYPH-1376D;Lo;0;L;;;;;N;;;;; +1376E;EGYPTIAN HIEROGLYPH-1376E;Lo;0;L;;;;;N;;;;; +1376F;EGYPTIAN HIEROGLYPH-1376F;Lo;0;L;;;;;N;;;;; +13770;EGYPTIAN HIEROGLYPH-13770;Lo;0;L;;;;;N;;;;; +13771;EGYPTIAN HIEROGLYPH-13771;Lo;0;L;;;;;N;;;;; +13772;EGYPTIAN HIEROGLYPH-13772;Lo;0;L;;;;;N;;;;; +13773;EGYPTIAN HIEROGLYPH-13773;Lo;0;L;;;;;N;;;;; +13774;EGYPTIAN HIEROGLYPH-13774;Lo;0;L;;;;;N;;;;; +13775;EGYPTIAN HIEROGLYPH-13775;Lo;0;L;;;;;N;;;;; +13776;EGYPTIAN HIEROGLYPH-13776;Lo;0;L;;;;;N;;;;; +13777;EGYPTIAN HIEROGLYPH-13777;Lo;0;L;;;;;N;;;;; +13778;EGYPTIAN HIEROGLYPH-13778;Lo;0;L;;;;;N;;;;; +13779;EGYPTIAN HIEROGLYPH-13779;Lo;0;L;;;;;N;;;;; +1377A;EGYPTIAN HIEROGLYPH-1377A;Lo;0;L;;;;;N;;;;; +1377B;EGYPTIAN HIEROGLYPH-1377B;Lo;0;L;;;;;N;;;;; +1377C;EGYPTIAN HIEROGLYPH-1377C;Lo;0;L;;;;;N;;;;; +1377D;EGYPTIAN HIEROGLYPH-1377D;Lo;0;L;;;;;N;;;;; +1377E;EGYPTIAN HIEROGLYPH-1377E;Lo;0;L;;;;;N;;;;; +1377F;EGYPTIAN HIEROGLYPH-1377F;Lo;0;L;;;;;N;;;;; +13780;EGYPTIAN HIEROGLYPH-13780;Lo;0;L;;;;;N;;;;; +13781;EGYPTIAN HIEROGLYPH-13781;Lo;0;L;;;;;N;;;;; +13782;EGYPTIAN HIEROGLYPH-13782;Lo;0;L;;;;;N;;;;; +13783;EGYPTIAN HIEROGLYPH-13783;Lo;0;L;;;;;N;;;;; +13784;EGYPTIAN HIEROGLYPH-13784;Lo;0;L;;;;;N;;;;; +13785;EGYPTIAN HIEROGLYPH-13785;Lo;0;L;;;;;N;;;;; +13786;EGYPTIAN HIEROGLYPH-13786;Lo;0;L;;;;;N;;;;; +13787;EGYPTIAN HIEROGLYPH-13787;Lo;0;L;;;;;N;;;;; +13788;EGYPTIAN HIEROGLYPH-13788;Lo;0;L;;;;;N;;;;; +13789;EGYPTIAN HIEROGLYPH-13789;Lo;0;L;;;;;N;;;;; +1378A;EGYPTIAN HIEROGLYPH-1378A;Lo;0;L;;;;;N;;;;; +1378B;EGYPTIAN HIEROGLYPH-1378B;Lo;0;L;;;;;N;;;;; +1378C;EGYPTIAN HIEROGLYPH-1378C;Lo;0;L;;;;;N;;;;; +1378D;EGYPTIAN HIEROGLYPH-1378D;Lo;0;L;;;;;N;;;;; +1378E;EGYPTIAN HIEROGLYPH-1378E;Lo;0;L;;;;;N;;;;; +1378F;EGYPTIAN HIEROGLYPH-1378F;Lo;0;L;;;;;N;;;;; +13790;EGYPTIAN HIEROGLYPH-13790;Lo;0;L;;;;;N;;;;; +13791;EGYPTIAN HIEROGLYPH-13791;Lo;0;L;;;;;N;;;;; +13792;EGYPTIAN HIEROGLYPH-13792;Lo;0;L;;;;;N;;;;; +13793;EGYPTIAN HIEROGLYPH-13793;Lo;0;L;;;;;N;;;;; +13794;EGYPTIAN HIEROGLYPH-13794;Lo;0;L;;;;;N;;;;; +13795;EGYPTIAN HIEROGLYPH-13795;Lo;0;L;;;;;N;;;;; +13796;EGYPTIAN HIEROGLYPH-13796;Lo;0;L;;;;;N;;;;; +13797;EGYPTIAN HIEROGLYPH-13797;Lo;0;L;;;;;N;;;;; +13798;EGYPTIAN HIEROGLYPH-13798;Lo;0;L;;;;;N;;;;; +13799;EGYPTIAN HIEROGLYPH-13799;Lo;0;L;;;;;N;;;;; +1379A;EGYPTIAN HIEROGLYPH-1379A;Lo;0;L;;;;;N;;;;; +1379B;EGYPTIAN HIEROGLYPH-1379B;Lo;0;L;;;;;N;;;;; +1379C;EGYPTIAN HIEROGLYPH-1379C;Lo;0;L;;;;;N;;;;; +1379D;EGYPTIAN HIEROGLYPH-1379D;Lo;0;L;;;;;N;;;;; +1379E;EGYPTIAN HIEROGLYPH-1379E;Lo;0;L;;;;;N;;;;; +1379F;EGYPTIAN HIEROGLYPH-1379F;Lo;0;L;;;;;N;;;;; +137A0;EGYPTIAN HIEROGLYPH-137A0;Lo;0;L;;;;;N;;;;; +137A1;EGYPTIAN HIEROGLYPH-137A1;Lo;0;L;;;;;N;;;;; +137A2;EGYPTIAN HIEROGLYPH-137A2;Lo;0;L;;;;;N;;;;; +137A3;EGYPTIAN HIEROGLYPH-137A3;Lo;0;L;;;;;N;;;;; +137A4;EGYPTIAN HIEROGLYPH-137A4;Lo;0;L;;;;;N;;;;; +137A5;EGYPTIAN HIEROGLYPH-137A5;Lo;0;L;;;;;N;;;;; +137A6;EGYPTIAN HIEROGLYPH-137A6;Lo;0;L;;;;;N;;;;; +137A7;EGYPTIAN HIEROGLYPH-137A7;Lo;0;L;;;;;N;;;;; +137A8;EGYPTIAN HIEROGLYPH-137A8;Lo;0;L;;;;;N;;;;; +137A9;EGYPTIAN HIEROGLYPH-137A9;Lo;0;L;;;;;N;;;;; +137AA;EGYPTIAN HIEROGLYPH-137AA;Lo;0;L;;;;;N;;;;; +137AB;EGYPTIAN HIEROGLYPH-137AB;Lo;0;L;;;;;N;;;;; +137AC;EGYPTIAN HIEROGLYPH-137AC;Lo;0;L;;;;;N;;;;; +137AD;EGYPTIAN HIEROGLYPH-137AD;Lo;0;L;;;;;N;;;;; +137AE;EGYPTIAN HIEROGLYPH-137AE;Lo;0;L;;;;;N;;;;; +137AF;EGYPTIAN HIEROGLYPH-137AF;Lo;0;L;;;;;N;;;;; +137B0;EGYPTIAN HIEROGLYPH-137B0;Lo;0;L;;;;;N;;;;; +137B1;EGYPTIAN HIEROGLYPH-137B1;Lo;0;L;;;;;N;;;;; +137B2;EGYPTIAN HIEROGLYPH-137B2;Lo;0;L;;;;;N;;;;; +137B3;EGYPTIAN HIEROGLYPH-137B3;Lo;0;L;;;;;N;;;;; +137B4;EGYPTIAN HIEROGLYPH-137B4;Lo;0;L;;;;;N;;;;; +137B5;EGYPTIAN HIEROGLYPH-137B5;Lo;0;L;;;;;N;;;;; +137B6;EGYPTIAN HIEROGLYPH-137B6;Lo;0;L;;;;;N;;;;; +137B7;EGYPTIAN HIEROGLYPH-137B7;Lo;0;L;;;;;N;;;;; +137B8;EGYPTIAN HIEROGLYPH-137B8;Lo;0;L;;;;;N;;;;; +137B9;EGYPTIAN HIEROGLYPH-137B9;Lo;0;L;;;;;N;;;;; +137BA;EGYPTIAN HIEROGLYPH-137BA;Lo;0;L;;;;;N;;;;; +137BB;EGYPTIAN HIEROGLYPH-137BB;Lo;0;L;;;;;N;;;;; +137BC;EGYPTIAN HIEROGLYPH-137BC;Lo;0;L;;;;;N;;;;; +137BD;EGYPTIAN HIEROGLYPH-137BD;Lo;0;L;;;;;N;;;;; +137BE;EGYPTIAN HIEROGLYPH-137BE;Lo;0;L;;;;;N;;;;; +137BF;EGYPTIAN HIEROGLYPH-137BF;Lo;0;L;;;;;N;;;;; +137C0;EGYPTIAN HIEROGLYPH-137C0;Lo;0;L;;;;;N;;;;; +137C1;EGYPTIAN HIEROGLYPH-137C1;Lo;0;L;;;;;N;;;;; +137C2;EGYPTIAN HIEROGLYPH-137C2;Lo;0;L;;;;;N;;;;; +137C3;EGYPTIAN HIEROGLYPH-137C3;Lo;0;L;;;;;N;;;;; +137C4;EGYPTIAN HIEROGLYPH-137C4;Lo;0;L;;;;;N;;;;; +137C5;EGYPTIAN HIEROGLYPH-137C5;Lo;0;L;;;;;N;;;;; +137C6;EGYPTIAN HIEROGLYPH-137C6;Lo;0;L;;;;;N;;;;; +137C7;EGYPTIAN HIEROGLYPH-137C7;Lo;0;L;;;;;N;;;;; +137C8;EGYPTIAN HIEROGLYPH-137C8;Lo;0;L;;;;;N;;;;; +137C9;EGYPTIAN HIEROGLYPH-137C9;Lo;0;L;;;;;N;;;;; +137CA;EGYPTIAN HIEROGLYPH-137CA;Lo;0;L;;;;;N;;;;; +137CB;EGYPTIAN HIEROGLYPH-137CB;Lo;0;L;;;;;N;;;;; +137CC;EGYPTIAN HIEROGLYPH-137CC;Lo;0;L;;;;;N;;;;; +137CD;EGYPTIAN HIEROGLYPH-137CD;Lo;0;L;;;;;N;;;;; +137CE;EGYPTIAN HIEROGLYPH-137CE;Lo;0;L;;;;;N;;;;; +137CF;EGYPTIAN HIEROGLYPH-137CF;Lo;0;L;;;;;N;;;;; +137D0;EGYPTIAN HIEROGLYPH-137D0;Lo;0;L;;;;;N;;;;; +137D1;EGYPTIAN HIEROGLYPH-137D1;Lo;0;L;;;;;N;;;;; +137D2;EGYPTIAN HIEROGLYPH-137D2;Lo;0;L;;;;;N;;;;; +137D3;EGYPTIAN HIEROGLYPH-137D3;Lo;0;L;;;;;N;;;;; +137D4;EGYPTIAN HIEROGLYPH-137D4;Lo;0;L;;;;;N;;;;; +137D5;EGYPTIAN HIEROGLYPH-137D5;Lo;0;L;;;;;N;;;;; +137D6;EGYPTIAN HIEROGLYPH-137D6;Lo;0;L;;;;;N;;;;; +137D7;EGYPTIAN HIEROGLYPH-137D7;Lo;0;L;;;;;N;;;;; +137D8;EGYPTIAN HIEROGLYPH-137D8;Lo;0;L;;;;;N;;;;; +137D9;EGYPTIAN HIEROGLYPH-137D9;Lo;0;L;;;;;N;;;;; +137DA;EGYPTIAN HIEROGLYPH-137DA;Lo;0;L;;;;;N;;;;; +137DB;EGYPTIAN HIEROGLYPH-137DB;Lo;0;L;;;;;N;;;;; +137DC;EGYPTIAN HIEROGLYPH-137DC;Lo;0;L;;;;;N;;;;; +137DD;EGYPTIAN HIEROGLYPH-137DD;Lo;0;L;;;;;N;;;;; +137DE;EGYPTIAN HIEROGLYPH-137DE;Lo;0;L;;;;;N;;;;; +137DF;EGYPTIAN HIEROGLYPH-137DF;Lo;0;L;;;;;N;;;;; +137E0;EGYPTIAN HIEROGLYPH-137E0;Lo;0;L;;;;;N;;;;; +137E1;EGYPTIAN HIEROGLYPH-137E1;Lo;0;L;;;;;N;;;;; +137E2;EGYPTIAN HIEROGLYPH-137E2;Lo;0;L;;;;;N;;;;; +137E3;EGYPTIAN HIEROGLYPH-137E3;Lo;0;L;;;;;N;;;;; +137E4;EGYPTIAN HIEROGLYPH-137E4;Lo;0;L;;;;;N;;;;; +137E5;EGYPTIAN HIEROGLYPH-137E5;Lo;0;L;;;;;N;;;;; +137E6;EGYPTIAN HIEROGLYPH-137E6;Lo;0;L;;;;;N;;;;; +137E7;EGYPTIAN HIEROGLYPH-137E7;Lo;0;L;;;;;N;;;;; +137E8;EGYPTIAN HIEROGLYPH-137E8;Lo;0;L;;;;;N;;;;; +137E9;EGYPTIAN HIEROGLYPH-137E9;Lo;0;L;;;;;N;;;;; +137EA;EGYPTIAN HIEROGLYPH-137EA;Lo;0;L;;;;;N;;;;; +137EB;EGYPTIAN HIEROGLYPH-137EB;Lo;0;L;;;;;N;;;;; +137EC;EGYPTIAN HIEROGLYPH-137EC;Lo;0;L;;;;;N;;;;; +137ED;EGYPTIAN HIEROGLYPH-137ED;Lo;0;L;;;;;N;;;;; +137EE;EGYPTIAN HIEROGLYPH-137EE;Lo;0;L;;;;;N;;;;; +137EF;EGYPTIAN HIEROGLYPH-137EF;Lo;0;L;;;;;N;;;;; +137F0;EGYPTIAN HIEROGLYPH-137F0;Lo;0;L;;;;;N;;;;; +137F1;EGYPTIAN HIEROGLYPH-137F1;Lo;0;L;;;;;N;;;;; +137F2;EGYPTIAN HIEROGLYPH-137F2;Lo;0;L;;;;;N;;;;; +137F3;EGYPTIAN HIEROGLYPH-137F3;Lo;0;L;;;;;N;;;;; +137F4;EGYPTIAN HIEROGLYPH-137F4;Lo;0;L;;;;;N;;;;; +137F5;EGYPTIAN HIEROGLYPH-137F5;Lo;0;L;;;;;N;;;;; +137F6;EGYPTIAN HIEROGLYPH-137F6;Lo;0;L;;;;;N;;;;; +137F7;EGYPTIAN HIEROGLYPH-137F7;Lo;0;L;;;;;N;;;;; +137F8;EGYPTIAN HIEROGLYPH-137F8;Lo;0;L;;;;;N;;;;; +137F9;EGYPTIAN HIEROGLYPH-137F9;Lo;0;L;;;;;N;;;;; +137FA;EGYPTIAN HIEROGLYPH-137FA;Lo;0;L;;;;;N;;;;; +137FB;EGYPTIAN HIEROGLYPH-137FB;Lo;0;L;;;;;N;;;;; +137FC;EGYPTIAN HIEROGLYPH-137FC;Lo;0;L;;;;;N;;;;; +137FD;EGYPTIAN HIEROGLYPH-137FD;Lo;0;L;;;;;N;;;;; +137FE;EGYPTIAN HIEROGLYPH-137FE;Lo;0;L;;;;;N;;;;; +137FF;EGYPTIAN HIEROGLYPH-137FF;Lo;0;L;;;;;N;;;;; +13800;EGYPTIAN HIEROGLYPH-13800;Lo;0;L;;;;;N;;;;; +13801;EGYPTIAN HIEROGLYPH-13801;Lo;0;L;;;;;N;;;;; +13802;EGYPTIAN HIEROGLYPH-13802;Lo;0;L;;;;;N;;;;; +13803;EGYPTIAN HIEROGLYPH-13803;Lo;0;L;;;;;N;;;;; +13804;EGYPTIAN HIEROGLYPH-13804;Lo;0;L;;;;;N;;;;; +13805;EGYPTIAN HIEROGLYPH-13805;Lo;0;L;;;;;N;;;;; +13806;EGYPTIAN HIEROGLYPH-13806;Lo;0;L;;;;;N;;;;; +13807;EGYPTIAN HIEROGLYPH-13807;Lo;0;L;;;;;N;;;;; +13808;EGYPTIAN HIEROGLYPH-13808;Lo;0;L;;;;;N;;;;; +13809;EGYPTIAN HIEROGLYPH-13809;Lo;0;L;;;;;N;;;;; +1380A;EGYPTIAN HIEROGLYPH-1380A;Lo;0;L;;;;;N;;;;; +1380B;EGYPTIAN HIEROGLYPH-1380B;Lo;0;L;;;;;N;;;;; +1380C;EGYPTIAN HIEROGLYPH-1380C;Lo;0;L;;;;;N;;;;; +1380D;EGYPTIAN HIEROGLYPH-1380D;Lo;0;L;;;;;N;;;;; +1380E;EGYPTIAN HIEROGLYPH-1380E;Lo;0;L;;;;;N;;;;; +1380F;EGYPTIAN HIEROGLYPH-1380F;Lo;0;L;;;;;N;;;;; +13810;EGYPTIAN HIEROGLYPH-13810;Lo;0;L;;;;;N;;;;; +13811;EGYPTIAN HIEROGLYPH-13811;Lo;0;L;;;;;N;;;;; +13812;EGYPTIAN HIEROGLYPH-13812;Lo;0;L;;;;;N;;;;; +13813;EGYPTIAN HIEROGLYPH-13813;Lo;0;L;;;;;N;;;;; +13814;EGYPTIAN HIEROGLYPH-13814;Lo;0;L;;;;;N;;;;; +13815;EGYPTIAN HIEROGLYPH-13815;Lo;0;L;;;;;N;;;;; +13816;EGYPTIAN HIEROGLYPH-13816;Lo;0;L;;;;;N;;;;; +13817;EGYPTIAN HIEROGLYPH-13817;Lo;0;L;;;;;N;;;;; +13818;EGYPTIAN HIEROGLYPH-13818;Lo;0;L;;;;;N;;;;; +13819;EGYPTIAN HIEROGLYPH-13819;Lo;0;L;;;;;N;;;;; +1381A;EGYPTIAN HIEROGLYPH-1381A;Lo;0;L;;;;;N;;;;; +1381B;EGYPTIAN HIEROGLYPH-1381B;Lo;0;L;;;;;N;;;;; +1381C;EGYPTIAN HIEROGLYPH-1381C;Lo;0;L;;;;;N;;;;; +1381D;EGYPTIAN HIEROGLYPH-1381D;Lo;0;L;;;;;N;;;;; +1381E;EGYPTIAN HIEROGLYPH-1381E;Lo;0;L;;;;;N;;;;; +1381F;EGYPTIAN HIEROGLYPH-1381F;Lo;0;L;;;;;N;;;;; +13820;EGYPTIAN HIEROGLYPH-13820;Lo;0;L;;;;;N;;;;; +13821;EGYPTIAN HIEROGLYPH-13821;Lo;0;L;;;;;N;;;;; +13822;EGYPTIAN HIEROGLYPH-13822;Lo;0;L;;;;;N;;;;; +13823;EGYPTIAN HIEROGLYPH-13823;Lo;0;L;;;;;N;;;;; +13824;EGYPTIAN HIEROGLYPH-13824;Lo;0;L;;;;;N;;;;; +13825;EGYPTIAN HIEROGLYPH-13825;Lo;0;L;;;;;N;;;;; +13826;EGYPTIAN HIEROGLYPH-13826;Lo;0;L;;;;;N;;;;; +13827;EGYPTIAN HIEROGLYPH-13827;Lo;0;L;;;;;N;;;;; +13828;EGYPTIAN HIEROGLYPH-13828;Lo;0;L;;;;;N;;;;; +13829;EGYPTIAN HIEROGLYPH-13829;Lo;0;L;;;;;N;;;;; +1382A;EGYPTIAN HIEROGLYPH-1382A;Lo;0;L;;;;;N;;;;; +1382B;EGYPTIAN HIEROGLYPH-1382B;Lo;0;L;;;;;N;;;;; +1382C;EGYPTIAN HIEROGLYPH-1382C;Lo;0;L;;;;;N;;;;; +1382D;EGYPTIAN HIEROGLYPH-1382D;Lo;0;L;;;;;N;;;;; +1382E;EGYPTIAN HIEROGLYPH-1382E;Lo;0;L;;;;;N;;;;; +1382F;EGYPTIAN HIEROGLYPH-1382F;Lo;0;L;;;;;N;;;;; +13830;EGYPTIAN HIEROGLYPH-13830;Lo;0;L;;;;;N;;;;; +13831;EGYPTIAN HIEROGLYPH-13831;Lo;0;L;;;;;N;;;;; +13832;EGYPTIAN HIEROGLYPH-13832;Lo;0;L;;;;;N;;;;; +13833;EGYPTIAN HIEROGLYPH-13833;Lo;0;L;;;;;N;;;;; +13834;EGYPTIAN HIEROGLYPH-13834;Lo;0;L;;;;;N;;;;; +13835;EGYPTIAN HIEROGLYPH-13835;Lo;0;L;;;;;N;;;;; +13836;EGYPTIAN HIEROGLYPH-13836;Lo;0;L;;;;;N;;;;; +13837;EGYPTIAN HIEROGLYPH-13837;Lo;0;L;;;;;N;;;;; +13838;EGYPTIAN HIEROGLYPH-13838;Lo;0;L;;;;;N;;;;; +13839;EGYPTIAN HIEROGLYPH-13839;Lo;0;L;;;;;N;;;;; +1383A;EGYPTIAN HIEROGLYPH-1383A;Lo;0;L;;;;;N;;;;; +1383B;EGYPTIAN HIEROGLYPH-1383B;Lo;0;L;;;;;N;;;;; +1383C;EGYPTIAN HIEROGLYPH-1383C;Lo;0;L;;;;;N;;;;; +1383D;EGYPTIAN HIEROGLYPH-1383D;Lo;0;L;;;;;N;;;;; +1383E;EGYPTIAN HIEROGLYPH-1383E;Lo;0;L;;;;;N;;;;; +1383F;EGYPTIAN HIEROGLYPH-1383F;Lo;0;L;;;;;N;;;;; +13840;EGYPTIAN HIEROGLYPH-13840;Lo;0;L;;;;;N;;;;; +13841;EGYPTIAN HIEROGLYPH-13841;Lo;0;L;;;;;N;;;;; +13842;EGYPTIAN HIEROGLYPH-13842;Lo;0;L;;;;;N;;;;; +13843;EGYPTIAN HIEROGLYPH-13843;Lo;0;L;;;;;N;;;;; +13844;EGYPTIAN HIEROGLYPH-13844;Lo;0;L;;;;;N;;;;; +13845;EGYPTIAN HIEROGLYPH-13845;Lo;0;L;;;;;N;;;;; +13846;EGYPTIAN HIEROGLYPH-13846;Lo;0;L;;;;;N;;;;; +13847;EGYPTIAN HIEROGLYPH-13847;Lo;0;L;;;;;N;;;;; +13848;EGYPTIAN HIEROGLYPH-13848;Lo;0;L;;;;;N;;;;; +13849;EGYPTIAN HIEROGLYPH-13849;Lo;0;L;;;;;N;;;;; +1384A;EGYPTIAN HIEROGLYPH-1384A;Lo;0;L;;;;;N;;;;; +1384B;EGYPTIAN HIEROGLYPH-1384B;Lo;0;L;;;;;N;;;;; +1384C;EGYPTIAN HIEROGLYPH-1384C;Lo;0;L;;;;;N;;;;; +1384D;EGYPTIAN HIEROGLYPH-1384D;Lo;0;L;;;;;N;;;;; +1384E;EGYPTIAN HIEROGLYPH-1384E;Lo;0;L;;;;;N;;;;; +1384F;EGYPTIAN HIEROGLYPH-1384F;Lo;0;L;;;;;N;;;;; +13850;EGYPTIAN HIEROGLYPH-13850;Lo;0;L;;;;;N;;;;; +13851;EGYPTIAN HIEROGLYPH-13851;Lo;0;L;;;;;N;;;;; +13852;EGYPTIAN HIEROGLYPH-13852;Lo;0;L;;;;;N;;;;; +13853;EGYPTIAN HIEROGLYPH-13853;Lo;0;L;;;;;N;;;;; +13854;EGYPTIAN HIEROGLYPH-13854;Lo;0;L;;;;;N;;;;; +13855;EGYPTIAN HIEROGLYPH-13855;Lo;0;L;;;;;N;;;;; +13856;EGYPTIAN HIEROGLYPH-13856;Lo;0;L;;;;;N;;;;; +13857;EGYPTIAN HIEROGLYPH-13857;Lo;0;L;;;;;N;;;;; +13858;EGYPTIAN HIEROGLYPH-13858;Lo;0;L;;;;;N;;;;; +13859;EGYPTIAN HIEROGLYPH-13859;Lo;0;L;;;;;N;;;;; +1385A;EGYPTIAN HIEROGLYPH-1385A;Lo;0;L;;;;;N;;;;; +1385B;EGYPTIAN HIEROGLYPH-1385B;Lo;0;L;;;;;N;;;;; +1385C;EGYPTIAN HIEROGLYPH-1385C;Lo;0;L;;;;;N;;;;; +1385D;EGYPTIAN HIEROGLYPH-1385D;Lo;0;L;;;;;N;;;;; +1385E;EGYPTIAN HIEROGLYPH-1385E;Lo;0;L;;;;;N;;;;; +1385F;EGYPTIAN HIEROGLYPH-1385F;Lo;0;L;;;;;N;;;;; +13860;EGYPTIAN HIEROGLYPH-13860;Lo;0;L;;;;;N;;;;; +13861;EGYPTIAN HIEROGLYPH-13861;Lo;0;L;;;;;N;;;;; +13862;EGYPTIAN HIEROGLYPH-13862;Lo;0;L;;;;;N;;;;; +13863;EGYPTIAN HIEROGLYPH-13863;Lo;0;L;;;;;N;;;;; +13864;EGYPTIAN HIEROGLYPH-13864;Lo;0;L;;;;;N;;;;; +13865;EGYPTIAN HIEROGLYPH-13865;Lo;0;L;;;;;N;;;;; +13866;EGYPTIAN HIEROGLYPH-13866;Lo;0;L;;;;;N;;;;; +13867;EGYPTIAN HIEROGLYPH-13867;Lo;0;L;;;;;N;;;;; +13868;EGYPTIAN HIEROGLYPH-13868;Lo;0;L;;;;;N;;;;; +13869;EGYPTIAN HIEROGLYPH-13869;Lo;0;L;;;;;N;;;;; +1386A;EGYPTIAN HIEROGLYPH-1386A;Lo;0;L;;;;;N;;;;; +1386B;EGYPTIAN HIEROGLYPH-1386B;Lo;0;L;;;;;N;;;;; +1386C;EGYPTIAN HIEROGLYPH-1386C;Lo;0;L;;;;;N;;;;; +1386D;EGYPTIAN HIEROGLYPH-1386D;Lo;0;L;;;;;N;;;;; +1386E;EGYPTIAN HIEROGLYPH-1386E;Lo;0;L;;;;;N;;;;; +1386F;EGYPTIAN HIEROGLYPH-1386F;Lo;0;L;;;;;N;;;;; +13870;EGYPTIAN HIEROGLYPH-13870;Lo;0;L;;;;;N;;;;; +13871;EGYPTIAN HIEROGLYPH-13871;Lo;0;L;;;;;N;;;;; +13872;EGYPTIAN HIEROGLYPH-13872;Lo;0;L;;;;;N;;;;; +13873;EGYPTIAN HIEROGLYPH-13873;Lo;0;L;;;;;N;;;;; +13874;EGYPTIAN HIEROGLYPH-13874;Lo;0;L;;;;;N;;;;; +13875;EGYPTIAN HIEROGLYPH-13875;Lo;0;L;;;;;N;;;;; +13876;EGYPTIAN HIEROGLYPH-13876;Lo;0;L;;;;;N;;;;; +13877;EGYPTIAN HIEROGLYPH-13877;Lo;0;L;;;;;N;;;;; +13878;EGYPTIAN HIEROGLYPH-13878;Lo;0;L;;;;;N;;;;; +13879;EGYPTIAN HIEROGLYPH-13879;Lo;0;L;;;;;N;;;;; +1387A;EGYPTIAN HIEROGLYPH-1387A;Lo;0;L;;;;;N;;;;; +1387B;EGYPTIAN HIEROGLYPH-1387B;Lo;0;L;;;;;N;;;;; +1387C;EGYPTIAN HIEROGLYPH-1387C;Lo;0;L;;;;;N;;;;; +1387D;EGYPTIAN HIEROGLYPH-1387D;Lo;0;L;;;;;N;;;;; +1387E;EGYPTIAN HIEROGLYPH-1387E;Lo;0;L;;;;;N;;;;; +1387F;EGYPTIAN HIEROGLYPH-1387F;Lo;0;L;;;;;N;;;;; +13880;EGYPTIAN HIEROGLYPH-13880;Lo;0;L;;;;;N;;;;; +13881;EGYPTIAN HIEROGLYPH-13881;Lo;0;L;;;;;N;;;;; +13882;EGYPTIAN HIEROGLYPH-13882;Lo;0;L;;;;;N;;;;; +13883;EGYPTIAN HIEROGLYPH-13883;Lo;0;L;;;;;N;;;;; +13884;EGYPTIAN HIEROGLYPH-13884;Lo;0;L;;;;;N;;;;; +13885;EGYPTIAN HIEROGLYPH-13885;Lo;0;L;;;;;N;;;;; +13886;EGYPTIAN HIEROGLYPH-13886;Lo;0;L;;;;;N;;;;; +13887;EGYPTIAN HIEROGLYPH-13887;Lo;0;L;;;;;N;;;;; +13888;EGYPTIAN HIEROGLYPH-13888;Lo;0;L;;;;;N;;;;; +13889;EGYPTIAN HIEROGLYPH-13889;Lo;0;L;;;;;N;;;;; +1388A;EGYPTIAN HIEROGLYPH-1388A;Lo;0;L;;;;;N;;;;; +1388B;EGYPTIAN HIEROGLYPH-1388B;Lo;0;L;;;;;N;;;;; +1388C;EGYPTIAN HIEROGLYPH-1388C;Lo;0;L;;;;;N;;;;; +1388D;EGYPTIAN HIEROGLYPH-1388D;Lo;0;L;;;;;N;;;;; +1388E;EGYPTIAN HIEROGLYPH-1388E;Lo;0;L;;;;;N;;;;; +1388F;EGYPTIAN HIEROGLYPH-1388F;Lo;0;L;;;;;N;;;;; +13890;EGYPTIAN HIEROGLYPH-13890;Lo;0;L;;;;;N;;;;; +13891;EGYPTIAN HIEROGLYPH-13891;Lo;0;L;;;;;N;;;;; +13892;EGYPTIAN HIEROGLYPH-13892;Lo;0;L;;;;;N;;;;; +13893;EGYPTIAN HIEROGLYPH-13893;Lo;0;L;;;;;N;;;;; +13894;EGYPTIAN HIEROGLYPH-13894;Lo;0;L;;;;;N;;;;; +13895;EGYPTIAN HIEROGLYPH-13895;Lo;0;L;;;;;N;;;;; +13896;EGYPTIAN HIEROGLYPH-13896;Lo;0;L;;;;;N;;;;; +13897;EGYPTIAN HIEROGLYPH-13897;Lo;0;L;;;;;N;;;;; +13898;EGYPTIAN HIEROGLYPH-13898;Lo;0;L;;;;;N;;;;; +13899;EGYPTIAN HIEROGLYPH-13899;Lo;0;L;;;;;N;;;;; +1389A;EGYPTIAN HIEROGLYPH-1389A;Lo;0;L;;;;;N;;;;; +1389B;EGYPTIAN HIEROGLYPH-1389B;Lo;0;L;;;;;N;;;;; +1389C;EGYPTIAN HIEROGLYPH-1389C;Lo;0;L;;;;;N;;;;; +1389D;EGYPTIAN HIEROGLYPH-1389D;Lo;0;L;;;;;N;;;;; +1389E;EGYPTIAN HIEROGLYPH-1389E;Lo;0;L;;;;;N;;;;; +1389F;EGYPTIAN HIEROGLYPH-1389F;Lo;0;L;;;;;N;;;;; +138A0;EGYPTIAN HIEROGLYPH-138A0;Lo;0;L;;;;;N;;;;; +138A1;EGYPTIAN HIEROGLYPH-138A1;Lo;0;L;;;;;N;;;;; +138A2;EGYPTIAN HIEROGLYPH-138A2;Lo;0;L;;;;;N;;;;; +138A3;EGYPTIAN HIEROGLYPH-138A3;Lo;0;L;;;;;N;;;;; +138A4;EGYPTIAN HIEROGLYPH-138A4;Lo;0;L;;;;;N;;;;; +138A5;EGYPTIAN HIEROGLYPH-138A5;Lo;0;L;;;;;N;;;;; +138A6;EGYPTIAN HIEROGLYPH-138A6;Lo;0;L;;;;;N;;;;; +138A7;EGYPTIAN HIEROGLYPH-138A7;Lo;0;L;;;;;N;;;;; +138A8;EGYPTIAN HIEROGLYPH-138A8;Lo;0;L;;;;;N;;;;; +138A9;EGYPTIAN HIEROGLYPH-138A9;Lo;0;L;;;;;N;;;;; +138AA;EGYPTIAN HIEROGLYPH-138AA;Lo;0;L;;;;;N;;;;; +138AB;EGYPTIAN HIEROGLYPH-138AB;Lo;0;L;;;;;N;;;;; +138AC;EGYPTIAN HIEROGLYPH-138AC;Lo;0;L;;;;;N;;;;; +138AD;EGYPTIAN HIEROGLYPH-138AD;Lo;0;L;;;;;N;;;;; +138AE;EGYPTIAN HIEROGLYPH-138AE;Lo;0;L;;;;;N;;;;; +138AF;EGYPTIAN HIEROGLYPH-138AF;Lo;0;L;;;;;N;;;;; +138B0;EGYPTIAN HIEROGLYPH-138B0;Lo;0;L;;;;;N;;;;; +138B1;EGYPTIAN HIEROGLYPH-138B1;Lo;0;L;;;;;N;;;;; +138B2;EGYPTIAN HIEROGLYPH-138B2;Lo;0;L;;;;;N;;;;; +138B3;EGYPTIAN HIEROGLYPH-138B3;Lo;0;L;;;;;N;;;;; +138B4;EGYPTIAN HIEROGLYPH-138B4;Lo;0;L;;;;;N;;;;; +138B5;EGYPTIAN HIEROGLYPH-138B5;Lo;0;L;;;;;N;;;;; +138B6;EGYPTIAN HIEROGLYPH-138B6;Lo;0;L;;;;;N;;;;; +138B7;EGYPTIAN HIEROGLYPH-138B7;Lo;0;L;;;;;N;;;;; +138B8;EGYPTIAN HIEROGLYPH-138B8;Lo;0;L;;;;;N;;;;; +138B9;EGYPTIAN HIEROGLYPH-138B9;Lo;0;L;;;;;N;;;;; +138BA;EGYPTIAN HIEROGLYPH-138BA;Lo;0;L;;;;;N;;;;; +138BB;EGYPTIAN HIEROGLYPH-138BB;Lo;0;L;;;;;N;;;;; +138BC;EGYPTIAN HIEROGLYPH-138BC;Lo;0;L;;;;;N;;;;; +138BD;EGYPTIAN HIEROGLYPH-138BD;Lo;0;L;;;;;N;;;;; +138BE;EGYPTIAN HIEROGLYPH-138BE;Lo;0;L;;;;;N;;;;; +138BF;EGYPTIAN HIEROGLYPH-138BF;Lo;0;L;;;;;N;;;;; +138C0;EGYPTIAN HIEROGLYPH-138C0;Lo;0;L;;;;;N;;;;; +138C1;EGYPTIAN HIEROGLYPH-138C1;Lo;0;L;;;;;N;;;;; +138C2;EGYPTIAN HIEROGLYPH-138C2;Lo;0;L;;;;;N;;;;; +138C3;EGYPTIAN HIEROGLYPH-138C3;Lo;0;L;;;;;N;;;;; +138C4;EGYPTIAN HIEROGLYPH-138C4;Lo;0;L;;;;;N;;;;; +138C5;EGYPTIAN HIEROGLYPH-138C5;Lo;0;L;;;;;N;;;;; +138C6;EGYPTIAN HIEROGLYPH-138C6;Lo;0;L;;;;;N;;;;; +138C7;EGYPTIAN HIEROGLYPH-138C7;Lo;0;L;;;;;N;;;;; +138C8;EGYPTIAN HIEROGLYPH-138C8;Lo;0;L;;;;;N;;;;; +138C9;EGYPTIAN HIEROGLYPH-138C9;Lo;0;L;;;;;N;;;;; +138CA;EGYPTIAN HIEROGLYPH-138CA;Lo;0;L;;;;;N;;;;; +138CB;EGYPTIAN HIEROGLYPH-138CB;Lo;0;L;;;;;N;;;;; +138CC;EGYPTIAN HIEROGLYPH-138CC;Lo;0;L;;;;;N;;;;; +138CD;EGYPTIAN HIEROGLYPH-138CD;Lo;0;L;;;;;N;;;;; +138CE;EGYPTIAN HIEROGLYPH-138CE;Lo;0;L;;;;;N;;;;; +138CF;EGYPTIAN HIEROGLYPH-138CF;Lo;0;L;;;;;N;;;;; +138D0;EGYPTIAN HIEROGLYPH-138D0;Lo;0;L;;;;;N;;;;; +138D1;EGYPTIAN HIEROGLYPH-138D1;Lo;0;L;;;;;N;;;;; +138D2;EGYPTIAN HIEROGLYPH-138D2;Lo;0;L;;;;;N;;;;; +138D3;EGYPTIAN HIEROGLYPH-138D3;Lo;0;L;;;;;N;;;;; +138D4;EGYPTIAN HIEROGLYPH-138D4;Lo;0;L;;;;;N;;;;; +138D5;EGYPTIAN HIEROGLYPH-138D5;Lo;0;L;;;;;N;;;;; +138D6;EGYPTIAN HIEROGLYPH-138D6;Lo;0;L;;;;;N;;;;; +138D7;EGYPTIAN HIEROGLYPH-138D7;Lo;0;L;;;;;N;;;;; +138D8;EGYPTIAN HIEROGLYPH-138D8;Lo;0;L;;;;;N;;;;; +138D9;EGYPTIAN HIEROGLYPH-138D9;Lo;0;L;;;;;N;;;;; +138DA;EGYPTIAN HIEROGLYPH-138DA;Lo;0;L;;;;;N;;;;; +138DB;EGYPTIAN HIEROGLYPH-138DB;Lo;0;L;;;;;N;;;;; +138DC;EGYPTIAN HIEROGLYPH-138DC;Lo;0;L;;;;;N;;;;; +138DD;EGYPTIAN HIEROGLYPH-138DD;Lo;0;L;;;;;N;;;;; +138DE;EGYPTIAN HIEROGLYPH-138DE;Lo;0;L;;;;;N;;;;; +138DF;EGYPTIAN HIEROGLYPH-138DF;Lo;0;L;;;;;N;;;;; +138E0;EGYPTIAN HIEROGLYPH-138E0;Lo;0;L;;;;;N;;;;; +138E1;EGYPTIAN HIEROGLYPH-138E1;Lo;0;L;;;;;N;;;;; +138E2;EGYPTIAN HIEROGLYPH-138E2;Lo;0;L;;;;;N;;;;; +138E3;EGYPTIAN HIEROGLYPH-138E3;Lo;0;L;;;;;N;;;;; +138E4;EGYPTIAN HIEROGLYPH-138E4;Lo;0;L;;;;;N;;;;; +138E5;EGYPTIAN HIEROGLYPH-138E5;Lo;0;L;;;;;N;;;;; +138E6;EGYPTIAN HIEROGLYPH-138E6;Lo;0;L;;;;;N;;;;; +138E7;EGYPTIAN HIEROGLYPH-138E7;Lo;0;L;;;;;N;;;;; +138E8;EGYPTIAN HIEROGLYPH-138E8;Lo;0;L;;;;;N;;;;; +138E9;EGYPTIAN HIEROGLYPH-138E9;Lo;0;L;;;;;N;;;;; +138EA;EGYPTIAN HIEROGLYPH-138EA;Lo;0;L;;;;;N;;;;; +138EB;EGYPTIAN HIEROGLYPH-138EB;Lo;0;L;;;;;N;;;;; +138EC;EGYPTIAN HIEROGLYPH-138EC;Lo;0;L;;;;;N;;;;; +138ED;EGYPTIAN HIEROGLYPH-138ED;Lo;0;L;;;;;N;;;;; +138EE;EGYPTIAN HIEROGLYPH-138EE;Lo;0;L;;;;;N;;;;; +138EF;EGYPTIAN HIEROGLYPH-138EF;Lo;0;L;;;;;N;;;;; +138F0;EGYPTIAN HIEROGLYPH-138F0;Lo;0;L;;;;;N;;;;; +138F1;EGYPTIAN HIEROGLYPH-138F1;Lo;0;L;;;;;N;;;;; +138F2;EGYPTIAN HIEROGLYPH-138F2;Lo;0;L;;;;;N;;;;; +138F3;EGYPTIAN HIEROGLYPH-138F3;Lo;0;L;;;;;N;;;;; +138F4;EGYPTIAN HIEROGLYPH-138F4;Lo;0;L;;;;;N;;;;; +138F5;EGYPTIAN HIEROGLYPH-138F5;Lo;0;L;;;;;N;;;;; +138F6;EGYPTIAN HIEROGLYPH-138F6;Lo;0;L;;;;;N;;;;; +138F7;EGYPTIAN HIEROGLYPH-138F7;Lo;0;L;;;;;N;;;;; +138F8;EGYPTIAN HIEROGLYPH-138F8;Lo;0;L;;;;;N;;;;; +138F9;EGYPTIAN HIEROGLYPH-138F9;Lo;0;L;;;;;N;;;;; +138FA;EGYPTIAN HIEROGLYPH-138FA;Lo;0;L;;;;;N;;;;; +138FB;EGYPTIAN HIEROGLYPH-138FB;Lo;0;L;;;;;N;;;;; +138FC;EGYPTIAN HIEROGLYPH-138FC;Lo;0;L;;;;;N;;;;; +138FD;EGYPTIAN HIEROGLYPH-138FD;Lo;0;L;;;;;N;;;;; +138FE;EGYPTIAN HIEROGLYPH-138FE;Lo;0;L;;;;;N;;;;; +138FF;EGYPTIAN HIEROGLYPH-138FF;Lo;0;L;;;;;N;;;;; +13900;EGYPTIAN HIEROGLYPH-13900;Lo;0;L;;;;;N;;;;; +13901;EGYPTIAN HIEROGLYPH-13901;Lo;0;L;;;;;N;;;;; +13902;EGYPTIAN HIEROGLYPH-13902;Lo;0;L;;;;;N;;;;; +13903;EGYPTIAN HIEROGLYPH-13903;Lo;0;L;;;;;N;;;;; +13904;EGYPTIAN HIEROGLYPH-13904;Lo;0;L;;;;;N;;;;; +13905;EGYPTIAN HIEROGLYPH-13905;Lo;0;L;;;;;N;;;;; +13906;EGYPTIAN HIEROGLYPH-13906;Lo;0;L;;;;;N;;;;; +13907;EGYPTIAN HIEROGLYPH-13907;Lo;0;L;;;;;N;;;;; +13908;EGYPTIAN HIEROGLYPH-13908;Lo;0;L;;;;;N;;;;; +13909;EGYPTIAN HIEROGLYPH-13909;Lo;0;L;;;;;N;;;;; +1390A;EGYPTIAN HIEROGLYPH-1390A;Lo;0;L;;;;;N;;;;; +1390B;EGYPTIAN HIEROGLYPH-1390B;Lo;0;L;;;;;N;;;;; +1390C;EGYPTIAN HIEROGLYPH-1390C;Lo;0;L;;;;;N;;;;; +1390D;EGYPTIAN HIEROGLYPH-1390D;Lo;0;L;;;;;N;;;;; +1390E;EGYPTIAN HIEROGLYPH-1390E;Lo;0;L;;;;;N;;;;; +1390F;EGYPTIAN HIEROGLYPH-1390F;Lo;0;L;;;;;N;;;;; +13910;EGYPTIAN HIEROGLYPH-13910;Lo;0;L;;;;;N;;;;; +13911;EGYPTIAN HIEROGLYPH-13911;Lo;0;L;;;;;N;;;;; +13912;EGYPTIAN HIEROGLYPH-13912;Lo;0;L;;;;;N;;;;; +13913;EGYPTIAN HIEROGLYPH-13913;Lo;0;L;;;;;N;;;;; +13914;EGYPTIAN HIEROGLYPH-13914;Lo;0;L;;;;;N;;;;; +13915;EGYPTIAN HIEROGLYPH-13915;Lo;0;L;;;;;N;;;;; +13916;EGYPTIAN HIEROGLYPH-13916;Lo;0;L;;;;;N;;;;; +13917;EGYPTIAN HIEROGLYPH-13917;Lo;0;L;;;;;N;;;;; +13918;EGYPTIAN HIEROGLYPH-13918;Lo;0;L;;;;;N;;;;; +13919;EGYPTIAN HIEROGLYPH-13919;Lo;0;L;;;;;N;;;;; +1391A;EGYPTIAN HIEROGLYPH-1391A;Lo;0;L;;;;;N;;;;; +1391B;EGYPTIAN HIEROGLYPH-1391B;Lo;0;L;;;;;N;;;;; +1391C;EGYPTIAN HIEROGLYPH-1391C;Lo;0;L;;;;;N;;;;; +1391D;EGYPTIAN HIEROGLYPH-1391D;Lo;0;L;;;;;N;;;;; +1391E;EGYPTIAN HIEROGLYPH-1391E;Lo;0;L;;;;;N;;;;; +1391F;EGYPTIAN HIEROGLYPH-1391F;Lo;0;L;;;;;N;;;;; +13920;EGYPTIAN HIEROGLYPH-13920;Lo;0;L;;;;;N;;;;; +13921;EGYPTIAN HIEROGLYPH-13921;Lo;0;L;;;;;N;;;;; +13922;EGYPTIAN HIEROGLYPH-13922;Lo;0;L;;;;;N;;;;; +13923;EGYPTIAN HIEROGLYPH-13923;Lo;0;L;;;;;N;;;;; +13924;EGYPTIAN HIEROGLYPH-13924;Lo;0;L;;;;;N;;;;; +13925;EGYPTIAN HIEROGLYPH-13925;Lo;0;L;;;;;N;;;;; +13926;EGYPTIAN HIEROGLYPH-13926;Lo;0;L;;;;;N;;;;; +13927;EGYPTIAN HIEROGLYPH-13927;Lo;0;L;;;;;N;;;;; +13928;EGYPTIAN HIEROGLYPH-13928;Lo;0;L;;;;;N;;;;; +13929;EGYPTIAN HIEROGLYPH-13929;Lo;0;L;;;;;N;;;;; +1392A;EGYPTIAN HIEROGLYPH-1392A;Lo;0;L;;;;;N;;;;; +1392B;EGYPTIAN HIEROGLYPH-1392B;Lo;0;L;;;;;N;;;;; +1392C;EGYPTIAN HIEROGLYPH-1392C;Lo;0;L;;;;;N;;;;; +1392D;EGYPTIAN HIEROGLYPH-1392D;Lo;0;L;;;;;N;;;;; +1392E;EGYPTIAN HIEROGLYPH-1392E;Lo;0;L;;;;;N;;;;; +1392F;EGYPTIAN HIEROGLYPH-1392F;Lo;0;L;;;;;N;;;;; +13930;EGYPTIAN HIEROGLYPH-13930;Lo;0;L;;;;;N;;;;; +13931;EGYPTIAN HIEROGLYPH-13931;Lo;0;L;;;;;N;;;;; +13932;EGYPTIAN HIEROGLYPH-13932;Lo;0;L;;;;;N;;;;; +13933;EGYPTIAN HIEROGLYPH-13933;Lo;0;L;;;;;N;;;;; +13934;EGYPTIAN HIEROGLYPH-13934;Lo;0;L;;;;;N;;;;; +13935;EGYPTIAN HIEROGLYPH-13935;Lo;0;L;;;;;N;;;;; +13936;EGYPTIAN HIEROGLYPH-13936;Lo;0;L;;;;;N;;;;; +13937;EGYPTIAN HIEROGLYPH-13937;Lo;0;L;;;;;N;;;;; +13938;EGYPTIAN HIEROGLYPH-13938;Lo;0;L;;;;;N;;;;; +13939;EGYPTIAN HIEROGLYPH-13939;Lo;0;L;;;;;N;;;;; +1393A;EGYPTIAN HIEROGLYPH-1393A;Lo;0;L;;;;;N;;;;; +1393B;EGYPTIAN HIEROGLYPH-1393B;Lo;0;L;;;;;N;;;;; +1393C;EGYPTIAN HIEROGLYPH-1393C;Lo;0;L;;;;;N;;;;; +1393D;EGYPTIAN HIEROGLYPH-1393D;Lo;0;L;;;;;N;;;;; +1393E;EGYPTIAN HIEROGLYPH-1393E;Lo;0;L;;;;;N;;;;; +1393F;EGYPTIAN HIEROGLYPH-1393F;Lo;0;L;;;;;N;;;;; +13940;EGYPTIAN HIEROGLYPH-13940;Lo;0;L;;;;;N;;;;; +13941;EGYPTIAN HIEROGLYPH-13941;Lo;0;L;;;;;N;;;;; +13942;EGYPTIAN HIEROGLYPH-13942;Lo;0;L;;;;;N;;;;; +13943;EGYPTIAN HIEROGLYPH-13943;Lo;0;L;;;;;N;;;;; +13944;EGYPTIAN HIEROGLYPH-13944;Lo;0;L;;;;;N;;;;; +13945;EGYPTIAN HIEROGLYPH-13945;Lo;0;L;;;;;N;;;;; +13946;EGYPTIAN HIEROGLYPH-13946;Lo;0;L;;;;;N;;;;; +13947;EGYPTIAN HIEROGLYPH-13947;Lo;0;L;;;;;N;;;;; +13948;EGYPTIAN HIEROGLYPH-13948;Lo;0;L;;;;;N;;;;; +13949;EGYPTIAN HIEROGLYPH-13949;Lo;0;L;;;;;N;;;;; +1394A;EGYPTIAN HIEROGLYPH-1394A;Lo;0;L;;;;;N;;;;; +1394B;EGYPTIAN HIEROGLYPH-1394B;Lo;0;L;;;;;N;;;;; +1394C;EGYPTIAN HIEROGLYPH-1394C;Lo;0;L;;;;;N;;;;; +1394D;EGYPTIAN HIEROGLYPH-1394D;Lo;0;L;;;;;N;;;;; +1394E;EGYPTIAN HIEROGLYPH-1394E;Lo;0;L;;;;;N;;;;; +1394F;EGYPTIAN HIEROGLYPH-1394F;Lo;0;L;;;;;N;;;;; +13950;EGYPTIAN HIEROGLYPH-13950;Lo;0;L;;;;;N;;;;; +13951;EGYPTIAN HIEROGLYPH-13951;Lo;0;L;;;;;N;;;;; +13952;EGYPTIAN HIEROGLYPH-13952;Lo;0;L;;;;;N;;;;; +13953;EGYPTIAN HIEROGLYPH-13953;Lo;0;L;;;;;N;;;;; +13954;EGYPTIAN HIEROGLYPH-13954;Lo;0;L;;;;;N;;;;; +13955;EGYPTIAN HIEROGLYPH-13955;Lo;0;L;;;;;N;;;;; +13956;EGYPTIAN HIEROGLYPH-13956;Lo;0;L;;;;;N;;;;; +13957;EGYPTIAN HIEROGLYPH-13957;Lo;0;L;;;;;N;;;;; +13958;EGYPTIAN HIEROGLYPH-13958;Lo;0;L;;;;;N;;;;; +13959;EGYPTIAN HIEROGLYPH-13959;Lo;0;L;;;;;N;;;;; +1395A;EGYPTIAN HIEROGLYPH-1395A;Lo;0;L;;;;;N;;;;; +1395B;EGYPTIAN HIEROGLYPH-1395B;Lo;0;L;;;;;N;;;;; +1395C;EGYPTIAN HIEROGLYPH-1395C;Lo;0;L;;;;;N;;;;; +1395D;EGYPTIAN HIEROGLYPH-1395D;Lo;0;L;;;;;N;;;;; +1395E;EGYPTIAN HIEROGLYPH-1395E;Lo;0;L;;;;;N;;;;; +1395F;EGYPTIAN HIEROGLYPH-1395F;Lo;0;L;;;;;N;;;;; +13960;EGYPTIAN HIEROGLYPH-13960;Lo;0;L;;;;;N;;;;; +13961;EGYPTIAN HIEROGLYPH-13961;Lo;0;L;;;;;N;;;;; +13962;EGYPTIAN HIEROGLYPH-13962;Lo;0;L;;;;;N;;;;; +13963;EGYPTIAN HIEROGLYPH-13963;Lo;0;L;;;;;N;;;;; +13964;EGYPTIAN HIEROGLYPH-13964;Lo;0;L;;;;;N;;;;; +13965;EGYPTIAN HIEROGLYPH-13965;Lo;0;L;;;;;N;;;;; +13966;EGYPTIAN HIEROGLYPH-13966;Lo;0;L;;;;;N;;;;; +13967;EGYPTIAN HIEROGLYPH-13967;Lo;0;L;;;;;N;;;;; +13968;EGYPTIAN HIEROGLYPH-13968;Lo;0;L;;;;;N;;;;; +13969;EGYPTIAN HIEROGLYPH-13969;Lo;0;L;;;;;N;;;;; +1396A;EGYPTIAN HIEROGLYPH-1396A;Lo;0;L;;;;;N;;;;; +1396B;EGYPTIAN HIEROGLYPH-1396B;Lo;0;L;;;;;N;;;;; +1396C;EGYPTIAN HIEROGLYPH-1396C;Lo;0;L;;;;;N;;;;; +1396D;EGYPTIAN HIEROGLYPH-1396D;Lo;0;L;;;;;N;;;;; +1396E;EGYPTIAN HIEROGLYPH-1396E;Lo;0;L;;;;;N;;;;; +1396F;EGYPTIAN HIEROGLYPH-1396F;Lo;0;L;;;;;N;;;;; +13970;EGYPTIAN HIEROGLYPH-13970;Lo;0;L;;;;;N;;;;; +13971;EGYPTIAN HIEROGLYPH-13971;Lo;0;L;;;;;N;;;;; +13972;EGYPTIAN HIEROGLYPH-13972;Lo;0;L;;;;;N;;;;; +13973;EGYPTIAN HIEROGLYPH-13973;Lo;0;L;;;;;N;;;;; +13974;EGYPTIAN HIEROGLYPH-13974;Lo;0;L;;;;;N;;;;; +13975;EGYPTIAN HIEROGLYPH-13975;Lo;0;L;;;;;N;;;;; +13976;EGYPTIAN HIEROGLYPH-13976;Lo;0;L;;;;;N;;;;; +13977;EGYPTIAN HIEROGLYPH-13977;Lo;0;L;;;;;N;;;;; +13978;EGYPTIAN HIEROGLYPH-13978;Lo;0;L;;;;;N;;;;; +13979;EGYPTIAN HIEROGLYPH-13979;Lo;0;L;;;;;N;;;;; +1397A;EGYPTIAN HIEROGLYPH-1397A;Lo;0;L;;;;;N;;;;; +1397B;EGYPTIAN HIEROGLYPH-1397B;Lo;0;L;;;;;N;;;;; +1397C;EGYPTIAN HIEROGLYPH-1397C;Lo;0;L;;;;;N;;;;; +1397D;EGYPTIAN HIEROGLYPH-1397D;Lo;0;L;;;;;N;;;;; +1397E;EGYPTIAN HIEROGLYPH-1397E;Lo;0;L;;;;;N;;;;; +1397F;EGYPTIAN HIEROGLYPH-1397F;Lo;0;L;;;;;N;;;;; +13980;EGYPTIAN HIEROGLYPH-13980;Lo;0;L;;;;;N;;;;; +13981;EGYPTIAN HIEROGLYPH-13981;Lo;0;L;;;;;N;;;;; +13982;EGYPTIAN HIEROGLYPH-13982;Lo;0;L;;;;;N;;;;; +13983;EGYPTIAN HIEROGLYPH-13983;Lo;0;L;;;;;N;;;;; +13984;EGYPTIAN HIEROGLYPH-13984;Lo;0;L;;;;;N;;;;; +13985;EGYPTIAN HIEROGLYPH-13985;Lo;0;L;;;;;N;;;;; +13986;EGYPTIAN HIEROGLYPH-13986;Lo;0;L;;;;;N;;;;; +13987;EGYPTIAN HIEROGLYPH-13987;Lo;0;L;;;;;N;;;;; +13988;EGYPTIAN HIEROGLYPH-13988;Lo;0;L;;;;;N;;;;; +13989;EGYPTIAN HIEROGLYPH-13989;Lo;0;L;;;;;N;;;;; +1398A;EGYPTIAN HIEROGLYPH-1398A;Lo;0;L;;;;;N;;;;; +1398B;EGYPTIAN HIEROGLYPH-1398B;Lo;0;L;;;;;N;;;;; +1398C;EGYPTIAN HIEROGLYPH-1398C;Lo;0;L;;;;;N;;;;; +1398D;EGYPTIAN HIEROGLYPH-1398D;Lo;0;L;;;;;N;;;;; +1398E;EGYPTIAN HIEROGLYPH-1398E;Lo;0;L;;;;;N;;;;; +1398F;EGYPTIAN HIEROGLYPH-1398F;Lo;0;L;;;;;N;;;;; +13990;EGYPTIAN HIEROGLYPH-13990;Lo;0;L;;;;;N;;;;; +13991;EGYPTIAN HIEROGLYPH-13991;Lo;0;L;;;;;N;;;;; +13992;EGYPTIAN HIEROGLYPH-13992;Lo;0;L;;;;;N;;;;; +13993;EGYPTIAN HIEROGLYPH-13993;Lo;0;L;;;;;N;;;;; +13994;EGYPTIAN HIEROGLYPH-13994;Lo;0;L;;;;;N;;;;; +13995;EGYPTIAN HIEROGLYPH-13995;Lo;0;L;;;;;N;;;;; +13996;EGYPTIAN HIEROGLYPH-13996;Lo;0;L;;;;;N;;;;; +13997;EGYPTIAN HIEROGLYPH-13997;Lo;0;L;;;;;N;;;;; +13998;EGYPTIAN HIEROGLYPH-13998;Lo;0;L;;;;;N;;;;; +13999;EGYPTIAN HIEROGLYPH-13999;Lo;0;L;;;;;N;;;;; +1399A;EGYPTIAN HIEROGLYPH-1399A;Lo;0;L;;;;;N;;;;; +1399B;EGYPTIAN HIEROGLYPH-1399B;Lo;0;L;;;;;N;;;;; +1399C;EGYPTIAN HIEROGLYPH-1399C;Lo;0;L;;;;;N;;;;; +1399D;EGYPTIAN HIEROGLYPH-1399D;Lo;0;L;;;;;N;;;;; +1399E;EGYPTIAN HIEROGLYPH-1399E;Lo;0;L;;;;;N;;;;; +1399F;EGYPTIAN HIEROGLYPH-1399F;Lo;0;L;;;;;N;;;;; +139A0;EGYPTIAN HIEROGLYPH-139A0;Lo;0;L;;;;;N;;;;; +139A1;EGYPTIAN HIEROGLYPH-139A1;Lo;0;L;;;;;N;;;;; +139A2;EGYPTIAN HIEROGLYPH-139A2;Lo;0;L;;;;;N;;;;; +139A3;EGYPTIAN HIEROGLYPH-139A3;Lo;0;L;;;;;N;;;;; +139A4;EGYPTIAN HIEROGLYPH-139A4;Lo;0;L;;;;;N;;;;; +139A5;EGYPTIAN HIEROGLYPH-139A5;Lo;0;L;;;;;N;;;;; +139A6;EGYPTIAN HIEROGLYPH-139A6;Lo;0;L;;;;;N;;;;; +139A7;EGYPTIAN HIEROGLYPH-139A7;Lo;0;L;;;;;N;;;;; +139A8;EGYPTIAN HIEROGLYPH-139A8;Lo;0;L;;;;;N;;;;; +139A9;EGYPTIAN HIEROGLYPH-139A9;Lo;0;L;;;;;N;;;;; +139AA;EGYPTIAN HIEROGLYPH-139AA;Lo;0;L;;;;;N;;;;; +139AB;EGYPTIAN HIEROGLYPH-139AB;Lo;0;L;;;;;N;;;;; +139AC;EGYPTIAN HIEROGLYPH-139AC;Lo;0;L;;;;;N;;;;; +139AD;EGYPTIAN HIEROGLYPH-139AD;Lo;0;L;;;;;N;;;;; +139AE;EGYPTIAN HIEROGLYPH-139AE;Lo;0;L;;;;;N;;;;; +139AF;EGYPTIAN HIEROGLYPH-139AF;Lo;0;L;;;;;N;;;;; +139B0;EGYPTIAN HIEROGLYPH-139B0;Lo;0;L;;;;;N;;;;; +139B1;EGYPTIAN HIEROGLYPH-139B1;Lo;0;L;;;;;N;;;;; +139B2;EGYPTIAN HIEROGLYPH-139B2;Lo;0;L;;;;;N;;;;; +139B3;EGYPTIAN HIEROGLYPH-139B3;Lo;0;L;;;;;N;;;;; +139B4;EGYPTIAN HIEROGLYPH-139B4;Lo;0;L;;;;;N;;;;; +139B5;EGYPTIAN HIEROGLYPH-139B5;Lo;0;L;;;;;N;;;;; +139B6;EGYPTIAN HIEROGLYPH-139B6;Lo;0;L;;;;;N;;;;; +139B7;EGYPTIAN HIEROGLYPH-139B7;Lo;0;L;;;;;N;;;;; +139B8;EGYPTIAN HIEROGLYPH-139B8;Lo;0;L;;;;;N;;;;; +139B9;EGYPTIAN HIEROGLYPH-139B9;Lo;0;L;;;;;N;;;;; +139BA;EGYPTIAN HIEROGLYPH-139BA;Lo;0;L;;;;;N;;;;; +139BB;EGYPTIAN HIEROGLYPH-139BB;Lo;0;L;;;;;N;;;;; +139BC;EGYPTIAN HIEROGLYPH-139BC;Lo;0;L;;;;;N;;;;; +139BD;EGYPTIAN HIEROGLYPH-139BD;Lo;0;L;;;;;N;;;;; +139BE;EGYPTIAN HIEROGLYPH-139BE;Lo;0;L;;;;;N;;;;; +139BF;EGYPTIAN HIEROGLYPH-139BF;Lo;0;L;;;;;N;;;;; +139C0;EGYPTIAN HIEROGLYPH-139C0;Lo;0;L;;;;;N;;;;; +139C1;EGYPTIAN HIEROGLYPH-139C1;Lo;0;L;;;;;N;;;;; +139C2;EGYPTIAN HIEROGLYPH-139C2;Lo;0;L;;;;;N;;;;; +139C3;EGYPTIAN HIEROGLYPH-139C3;Lo;0;L;;;;;N;;;;; +139C4;EGYPTIAN HIEROGLYPH-139C4;Lo;0;L;;;;;N;;;;; +139C5;EGYPTIAN HIEROGLYPH-139C5;Lo;0;L;;;;;N;;;;; +139C6;EGYPTIAN HIEROGLYPH-139C6;Lo;0;L;;;;;N;;;;; +139C7;EGYPTIAN HIEROGLYPH-139C7;Lo;0;L;;;;;N;;;;; +139C8;EGYPTIAN HIEROGLYPH-139C8;Lo;0;L;;;;;N;;;;; +139C9;EGYPTIAN HIEROGLYPH-139C9;Lo;0;L;;;;;N;;;;; +139CA;EGYPTIAN HIEROGLYPH-139CA;Lo;0;L;;;;;N;;;;; +139CB;EGYPTIAN HIEROGLYPH-139CB;Lo;0;L;;;;;N;;;;; +139CC;EGYPTIAN HIEROGLYPH-139CC;Lo;0;L;;;;;N;;;;; +139CD;EGYPTIAN HIEROGLYPH-139CD;Lo;0;L;;;;;N;;;;; +139CE;EGYPTIAN HIEROGLYPH-139CE;Lo;0;L;;;;;N;;;;; +139CF;EGYPTIAN HIEROGLYPH-139CF;Lo;0;L;;;;;N;;;;; +139D0;EGYPTIAN HIEROGLYPH-139D0;Lo;0;L;;;;;N;;;;; +139D1;EGYPTIAN HIEROGLYPH-139D1;Lo;0;L;;;;;N;;;;; +139D2;EGYPTIAN HIEROGLYPH-139D2;Lo;0;L;;;;;N;;;;; +139D3;EGYPTIAN HIEROGLYPH-139D3;Lo;0;L;;;;;N;;;;; +139D4;EGYPTIAN HIEROGLYPH-139D4;Lo;0;L;;;;;N;;;;; +139D5;EGYPTIAN HIEROGLYPH-139D5;Lo;0;L;;;;;N;;;;; +139D6;EGYPTIAN HIEROGLYPH-139D6;Lo;0;L;;;;;N;;;;; +139D7;EGYPTIAN HIEROGLYPH-139D7;Lo;0;L;;;;;N;;;;; +139D8;EGYPTIAN HIEROGLYPH-139D8;Lo;0;L;;;;;N;;;;; +139D9;EGYPTIAN HIEROGLYPH-139D9;Lo;0;L;;;;;N;;;;; +139DA;EGYPTIAN HIEROGLYPH-139DA;Lo;0;L;;;;;N;;;;; +139DB;EGYPTIAN HIEROGLYPH-139DB;Lo;0;L;;;;;N;;;;; +139DC;EGYPTIAN HIEROGLYPH-139DC;Lo;0;L;;;;;N;;;;; +139DD;EGYPTIAN HIEROGLYPH-139DD;Lo;0;L;;;;;N;;;;; +139DE;EGYPTIAN HIEROGLYPH-139DE;Lo;0;L;;;;;N;;;;; +139DF;EGYPTIAN HIEROGLYPH-139DF;Lo;0;L;;;;;N;;;;; +139E0;EGYPTIAN HIEROGLYPH-139E0;Lo;0;L;;;;;N;;;;; +139E1;EGYPTIAN HIEROGLYPH-139E1;Lo;0;L;;;;;N;;;;; +139E2;EGYPTIAN HIEROGLYPH-139E2;Lo;0;L;;;;;N;;;;; +139E3;EGYPTIAN HIEROGLYPH-139E3;Lo;0;L;;;;;N;;;;; +139E4;EGYPTIAN HIEROGLYPH-139E4;Lo;0;L;;;;;N;;;;; +139E5;EGYPTIAN HIEROGLYPH-139E5;Lo;0;L;;;;;N;;;;; +139E6;EGYPTIAN HIEROGLYPH-139E6;Lo;0;L;;;;;N;;;;; +139E7;EGYPTIAN HIEROGLYPH-139E7;Lo;0;L;;;;;N;;;;; +139E8;EGYPTIAN HIEROGLYPH-139E8;Lo;0;L;;;;;N;;;;; +139E9;EGYPTIAN HIEROGLYPH-139E9;Lo;0;L;;;;;N;;;;; +139EA;EGYPTIAN HIEROGLYPH-139EA;Lo;0;L;;;;;N;;;;; +139EB;EGYPTIAN HIEROGLYPH-139EB;Lo;0;L;;;;;N;;;;; +139EC;EGYPTIAN HIEROGLYPH-139EC;Lo;0;L;;;;;N;;;;; +139ED;EGYPTIAN HIEROGLYPH-139ED;Lo;0;L;;;;;N;;;;; +139EE;EGYPTIAN HIEROGLYPH-139EE;Lo;0;L;;;;;N;;;;; +139EF;EGYPTIAN HIEROGLYPH-139EF;Lo;0;L;;;;;N;;;;; +139F0;EGYPTIAN HIEROGLYPH-139F0;Lo;0;L;;;;;N;;;;; +139F1;EGYPTIAN HIEROGLYPH-139F1;Lo;0;L;;;;;N;;;;; +139F2;EGYPTIAN HIEROGLYPH-139F2;Lo;0;L;;;;;N;;;;; +139F3;EGYPTIAN HIEROGLYPH-139F3;Lo;0;L;;;;;N;;;;; +139F4;EGYPTIAN HIEROGLYPH-139F4;Lo;0;L;;;;;N;;;;; +139F5;EGYPTIAN HIEROGLYPH-139F5;Lo;0;L;;;;;N;;;;; +139F6;EGYPTIAN HIEROGLYPH-139F6;Lo;0;L;;;;;N;;;;; +139F7;EGYPTIAN HIEROGLYPH-139F7;Lo;0;L;;;;;N;;;;; +139F8;EGYPTIAN HIEROGLYPH-139F8;Lo;0;L;;;;;N;;;;; +139F9;EGYPTIAN HIEROGLYPH-139F9;Lo;0;L;;;;;N;;;;; +139FA;EGYPTIAN HIEROGLYPH-139FA;Lo;0;L;;;;;N;;;;; +139FB;EGYPTIAN HIEROGLYPH-139FB;Lo;0;L;;;;;N;;;;; +139FC;EGYPTIAN HIEROGLYPH-139FC;Lo;0;L;;;;;N;;;;; +139FD;EGYPTIAN HIEROGLYPH-139FD;Lo;0;L;;;;;N;;;;; +139FE;EGYPTIAN HIEROGLYPH-139FE;Lo;0;L;;;;;N;;;;; +139FF;EGYPTIAN HIEROGLYPH-139FF;Lo;0;L;;;;;N;;;;; +13A00;EGYPTIAN HIEROGLYPH-13A00;Lo;0;L;;;;;N;;;;; +13A01;EGYPTIAN HIEROGLYPH-13A01;Lo;0;L;;;;;N;;;;; +13A02;EGYPTIAN HIEROGLYPH-13A02;Lo;0;L;;;;;N;;;;; +13A03;EGYPTIAN HIEROGLYPH-13A03;Lo;0;L;;;;;N;;;;; +13A04;EGYPTIAN HIEROGLYPH-13A04;Lo;0;L;;;;;N;;;;; +13A05;EGYPTIAN HIEROGLYPH-13A05;Lo;0;L;;;;;N;;;;; +13A06;EGYPTIAN HIEROGLYPH-13A06;Lo;0;L;;;;;N;;;;; +13A07;EGYPTIAN HIEROGLYPH-13A07;Lo;0;L;;;;;N;;;;; +13A08;EGYPTIAN HIEROGLYPH-13A08;Lo;0;L;;;;;N;;;;; +13A09;EGYPTIAN HIEROGLYPH-13A09;Lo;0;L;;;;;N;;;;; +13A0A;EGYPTIAN HIEROGLYPH-13A0A;Lo;0;L;;;;;N;;;;; +13A0B;EGYPTIAN HIEROGLYPH-13A0B;Lo;0;L;;;;;N;;;;; +13A0C;EGYPTIAN HIEROGLYPH-13A0C;Lo;0;L;;;;;N;;;;; +13A0D;EGYPTIAN HIEROGLYPH-13A0D;Lo;0;L;;;;;N;;;;; +13A0E;EGYPTIAN HIEROGLYPH-13A0E;Lo;0;L;;;;;N;;;;; +13A0F;EGYPTIAN HIEROGLYPH-13A0F;Lo;0;L;;;;;N;;;;; +13A10;EGYPTIAN HIEROGLYPH-13A10;Lo;0;L;;;;;N;;;;; +13A11;EGYPTIAN HIEROGLYPH-13A11;Lo;0;L;;;;;N;;;;; +13A12;EGYPTIAN HIEROGLYPH-13A12;Lo;0;L;;;;;N;;;;; +13A13;EGYPTIAN HIEROGLYPH-13A13;Lo;0;L;;;;;N;;;;; +13A14;EGYPTIAN HIEROGLYPH-13A14;Lo;0;L;;;;;N;;;;; +13A15;EGYPTIAN HIEROGLYPH-13A15;Lo;0;L;;;;;N;;;;; +13A16;EGYPTIAN HIEROGLYPH-13A16;Lo;0;L;;;;;N;;;;; +13A17;EGYPTIAN HIEROGLYPH-13A17;Lo;0;L;;;;;N;;;;; +13A18;EGYPTIAN HIEROGLYPH-13A18;Lo;0;L;;;;;N;;;;; +13A19;EGYPTIAN HIEROGLYPH-13A19;Lo;0;L;;;;;N;;;;; +13A1A;EGYPTIAN HIEROGLYPH-13A1A;Lo;0;L;;;;;N;;;;; +13A1B;EGYPTIAN HIEROGLYPH-13A1B;Lo;0;L;;;;;N;;;;; +13A1C;EGYPTIAN HIEROGLYPH-13A1C;Lo;0;L;;;;;N;;;;; +13A1D;EGYPTIAN HIEROGLYPH-13A1D;Lo;0;L;;;;;N;;;;; +13A1E;EGYPTIAN HIEROGLYPH-13A1E;Lo;0;L;;;;;N;;;;; +13A1F;EGYPTIAN HIEROGLYPH-13A1F;Lo;0;L;;;;;N;;;;; +13A20;EGYPTIAN HIEROGLYPH-13A20;Lo;0;L;;;;;N;;;;; +13A21;EGYPTIAN HIEROGLYPH-13A21;Lo;0;L;;;;;N;;;;; +13A22;EGYPTIAN HIEROGLYPH-13A22;Lo;0;L;;;;;N;;;;; +13A23;EGYPTIAN HIEROGLYPH-13A23;Lo;0;L;;;;;N;;;;; +13A24;EGYPTIAN HIEROGLYPH-13A24;Lo;0;L;;;;;N;;;;; +13A25;EGYPTIAN HIEROGLYPH-13A25;Lo;0;L;;;;;N;;;;; +13A26;EGYPTIAN HIEROGLYPH-13A26;Lo;0;L;;;;;N;;;;; +13A27;EGYPTIAN HIEROGLYPH-13A27;Lo;0;L;;;;;N;;;;; +13A28;EGYPTIAN HIEROGLYPH-13A28;Lo;0;L;;;;;N;;;;; +13A29;EGYPTIAN HIEROGLYPH-13A29;Lo;0;L;;;;;N;;;;; +13A2A;EGYPTIAN HIEROGLYPH-13A2A;Lo;0;L;;;;;N;;;;; +13A2B;EGYPTIAN HIEROGLYPH-13A2B;Lo;0;L;;;;;N;;;;; +13A2C;EGYPTIAN HIEROGLYPH-13A2C;Lo;0;L;;;;;N;;;;; +13A2D;EGYPTIAN HIEROGLYPH-13A2D;Lo;0;L;;;;;N;;;;; +13A2E;EGYPTIAN HIEROGLYPH-13A2E;Lo;0;L;;;;;N;;;;; +13A2F;EGYPTIAN HIEROGLYPH-13A2F;Lo;0;L;;;;;N;;;;; +13A30;EGYPTIAN HIEROGLYPH-13A30;Lo;0;L;;;;;N;;;;; +13A31;EGYPTIAN HIEROGLYPH-13A31;Lo;0;L;;;;;N;;;;; +13A32;EGYPTIAN HIEROGLYPH-13A32;Lo;0;L;;;;;N;;;;; +13A33;EGYPTIAN HIEROGLYPH-13A33;Lo;0;L;;;;;N;;;;; +13A34;EGYPTIAN HIEROGLYPH-13A34;Lo;0;L;;;;;N;;;;; +13A35;EGYPTIAN HIEROGLYPH-13A35;Lo;0;L;;;;;N;;;;; +13A36;EGYPTIAN HIEROGLYPH-13A36;Lo;0;L;;;;;N;;;;; +13A37;EGYPTIAN HIEROGLYPH-13A37;Lo;0;L;;;;;N;;;;; +13A38;EGYPTIAN HIEROGLYPH-13A38;Lo;0;L;;;;;N;;;;; +13A39;EGYPTIAN HIEROGLYPH-13A39;Lo;0;L;;;;;N;;;;; +13A3A;EGYPTIAN HIEROGLYPH-13A3A;Lo;0;L;;;;;N;;;;; +13A3B;EGYPTIAN HIEROGLYPH-13A3B;Lo;0;L;;;;;N;;;;; +13A3C;EGYPTIAN HIEROGLYPH-13A3C;Lo;0;L;;;;;N;;;;; +13A3D;EGYPTIAN HIEROGLYPH-13A3D;Lo;0;L;;;;;N;;;;; +13A3E;EGYPTIAN HIEROGLYPH-13A3E;Lo;0;L;;;;;N;;;;; +13A3F;EGYPTIAN HIEROGLYPH-13A3F;Lo;0;L;;;;;N;;;;; +13A40;EGYPTIAN HIEROGLYPH-13A40;Lo;0;L;;;;;N;;;;; +13A41;EGYPTIAN HIEROGLYPH-13A41;Lo;0;L;;;;;N;;;;; +13A42;EGYPTIAN HIEROGLYPH-13A42;Lo;0;L;;;;;N;;;;; +13A43;EGYPTIAN HIEROGLYPH-13A43;Lo;0;L;;;;;N;;;;; +13A44;EGYPTIAN HIEROGLYPH-13A44;Lo;0;L;;;;;N;;;;; +13A45;EGYPTIAN HIEROGLYPH-13A45;Lo;0;L;;;;;N;;;;; +13A46;EGYPTIAN HIEROGLYPH-13A46;Lo;0;L;;;;;N;;;;; +13A47;EGYPTIAN HIEROGLYPH-13A47;Lo;0;L;;;;;N;;;;; +13A48;EGYPTIAN HIEROGLYPH-13A48;Lo;0;L;;;;;N;;;;; +13A49;EGYPTIAN HIEROGLYPH-13A49;Lo;0;L;;;;;N;;;;; +13A4A;EGYPTIAN HIEROGLYPH-13A4A;Lo;0;L;;;;;N;;;;; +13A4B;EGYPTIAN HIEROGLYPH-13A4B;Lo;0;L;;;;;N;;;;; +13A4C;EGYPTIAN HIEROGLYPH-13A4C;Lo;0;L;;;;;N;;;;; +13A4D;EGYPTIAN HIEROGLYPH-13A4D;Lo;0;L;;;;;N;;;;; +13A4E;EGYPTIAN HIEROGLYPH-13A4E;Lo;0;L;;;;;N;;;;; +13A4F;EGYPTIAN HIEROGLYPH-13A4F;Lo;0;L;;;;;N;;;;; +13A50;EGYPTIAN HIEROGLYPH-13A50;Lo;0;L;;;;;N;;;;; +13A51;EGYPTIAN HIEROGLYPH-13A51;Lo;0;L;;;;;N;;;;; +13A52;EGYPTIAN HIEROGLYPH-13A52;Lo;0;L;;;;;N;;;;; +13A53;EGYPTIAN HIEROGLYPH-13A53;Lo;0;L;;;;;N;;;;; +13A54;EGYPTIAN HIEROGLYPH-13A54;Lo;0;L;;;;;N;;;;; +13A55;EGYPTIAN HIEROGLYPH-13A55;Lo;0;L;;;;;N;;;;; +13A56;EGYPTIAN HIEROGLYPH-13A56;Lo;0;L;;;;;N;;;;; +13A57;EGYPTIAN HIEROGLYPH-13A57;Lo;0;L;;;;;N;;;;; +13A58;EGYPTIAN HIEROGLYPH-13A58;Lo;0;L;;;;;N;;;;; +13A59;EGYPTIAN HIEROGLYPH-13A59;Lo;0;L;;;;;N;;;;; +13A5A;EGYPTIAN HIEROGLYPH-13A5A;Lo;0;L;;;;;N;;;;; +13A5B;EGYPTIAN HIEROGLYPH-13A5B;Lo;0;L;;;;;N;;;;; +13A5C;EGYPTIAN HIEROGLYPH-13A5C;Lo;0;L;;;;;N;;;;; +13A5D;EGYPTIAN HIEROGLYPH-13A5D;Lo;0;L;;;;;N;;;;; +13A5E;EGYPTIAN HIEROGLYPH-13A5E;Lo;0;L;;;;;N;;;;; +13A5F;EGYPTIAN HIEROGLYPH-13A5F;Lo;0;L;;;;;N;;;;; +13A60;EGYPTIAN HIEROGLYPH-13A60;Lo;0;L;;;;;N;;;;; +13A61;EGYPTIAN HIEROGLYPH-13A61;Lo;0;L;;;;;N;;;;; +13A62;EGYPTIAN HIEROGLYPH-13A62;Lo;0;L;;;;;N;;;;; +13A63;EGYPTIAN HIEROGLYPH-13A63;Lo;0;L;;;;;N;;;;; +13A64;EGYPTIAN HIEROGLYPH-13A64;Lo;0;L;;;;;N;;;;; +13A65;EGYPTIAN HIEROGLYPH-13A65;Lo;0;L;;;;;N;;;;; +13A66;EGYPTIAN HIEROGLYPH-13A66;Lo;0;L;;;;;N;;;;; +13A67;EGYPTIAN HIEROGLYPH-13A67;Lo;0;L;;;;;N;;;;; +13A68;EGYPTIAN HIEROGLYPH-13A68;Lo;0;L;;;;;N;;;;; +13A69;EGYPTIAN HIEROGLYPH-13A69;Lo;0;L;;;;;N;;;;; +13A6A;EGYPTIAN HIEROGLYPH-13A6A;Lo;0;L;;;;;N;;;;; +13A6B;EGYPTIAN HIEROGLYPH-13A6B;Lo;0;L;;;;;N;;;;; +13A6C;EGYPTIAN HIEROGLYPH-13A6C;Lo;0;L;;;;;N;;;;; +13A6D;EGYPTIAN HIEROGLYPH-13A6D;Lo;0;L;;;;;N;;;;; +13A6E;EGYPTIAN HIEROGLYPH-13A6E;Lo;0;L;;;;;N;;;;; +13A6F;EGYPTIAN HIEROGLYPH-13A6F;Lo;0;L;;;;;N;;;;; +13A70;EGYPTIAN HIEROGLYPH-13A70;Lo;0;L;;;;;N;;;;; +13A71;EGYPTIAN HIEROGLYPH-13A71;Lo;0;L;;;;;N;;;;; +13A72;EGYPTIAN HIEROGLYPH-13A72;Lo;0;L;;;;;N;;;;; +13A73;EGYPTIAN HIEROGLYPH-13A73;Lo;0;L;;;;;N;;;;; +13A74;EGYPTIAN HIEROGLYPH-13A74;Lo;0;L;;;;;N;;;;; +13A75;EGYPTIAN HIEROGLYPH-13A75;Lo;0;L;;;;;N;;;;; +13A76;EGYPTIAN HIEROGLYPH-13A76;Lo;0;L;;;;;N;;;;; +13A77;EGYPTIAN HIEROGLYPH-13A77;Lo;0;L;;;;;N;;;;; +13A78;EGYPTIAN HIEROGLYPH-13A78;Lo;0;L;;;;;N;;;;; +13A79;EGYPTIAN HIEROGLYPH-13A79;Lo;0;L;;;;;N;;;;; +13A7A;EGYPTIAN HIEROGLYPH-13A7A;Lo;0;L;;;;;N;;;;; +13A7B;EGYPTIAN HIEROGLYPH-13A7B;Lo;0;L;;;;;N;;;;; +13A7C;EGYPTIAN HIEROGLYPH-13A7C;Lo;0;L;;;;;N;;;;; +13A7D;EGYPTIAN HIEROGLYPH-13A7D;Lo;0;L;;;;;N;;;;; +13A7E;EGYPTIAN HIEROGLYPH-13A7E;Lo;0;L;;;;;N;;;;; +13A7F;EGYPTIAN HIEROGLYPH-13A7F;Lo;0;L;;;;;N;;;;; +13A80;EGYPTIAN HIEROGLYPH-13A80;Lo;0;L;;;;;N;;;;; +13A81;EGYPTIAN HIEROGLYPH-13A81;Lo;0;L;;;;;N;;;;; +13A82;EGYPTIAN HIEROGLYPH-13A82;Lo;0;L;;;;;N;;;;; +13A83;EGYPTIAN HIEROGLYPH-13A83;Lo;0;L;;;;;N;;;;; +13A84;EGYPTIAN HIEROGLYPH-13A84;Lo;0;L;;;;;N;;;;; +13A85;EGYPTIAN HIEROGLYPH-13A85;Lo;0;L;;;;;N;;;;; +13A86;EGYPTIAN HIEROGLYPH-13A86;Lo;0;L;;;;;N;;;;; +13A87;EGYPTIAN HIEROGLYPH-13A87;Lo;0;L;;;;;N;;;;; +13A88;EGYPTIAN HIEROGLYPH-13A88;Lo;0;L;;;;;N;;;;; +13A89;EGYPTIAN HIEROGLYPH-13A89;Lo;0;L;;;;;N;;;;; +13A8A;EGYPTIAN HIEROGLYPH-13A8A;Lo;0;L;;;;;N;;;;; +13A8B;EGYPTIAN HIEROGLYPH-13A8B;Lo;0;L;;;;;N;;;;; +13A8C;EGYPTIAN HIEROGLYPH-13A8C;Lo;0;L;;;;;N;;;;; +13A8D;EGYPTIAN HIEROGLYPH-13A8D;Lo;0;L;;;;;N;;;;; +13A8E;EGYPTIAN HIEROGLYPH-13A8E;Lo;0;L;;;;;N;;;;; +13A8F;EGYPTIAN HIEROGLYPH-13A8F;Lo;0;L;;;;;N;;;;; +13A90;EGYPTIAN HIEROGLYPH-13A90;Lo;0;L;;;;;N;;;;; +13A91;EGYPTIAN HIEROGLYPH-13A91;Lo;0;L;;;;;N;;;;; +13A92;EGYPTIAN HIEROGLYPH-13A92;Lo;0;L;;;;;N;;;;; +13A93;EGYPTIAN HIEROGLYPH-13A93;Lo;0;L;;;;;N;;;;; +13A94;EGYPTIAN HIEROGLYPH-13A94;Lo;0;L;;;;;N;;;;; +13A95;EGYPTIAN HIEROGLYPH-13A95;Lo;0;L;;;;;N;;;;; +13A96;EGYPTIAN HIEROGLYPH-13A96;Lo;0;L;;;;;N;;;;; +13A97;EGYPTIAN HIEROGLYPH-13A97;Lo;0;L;;;;;N;;;;; +13A98;EGYPTIAN HIEROGLYPH-13A98;Lo;0;L;;;;;N;;;;; +13A99;EGYPTIAN HIEROGLYPH-13A99;Lo;0;L;;;;;N;;;;; +13A9A;EGYPTIAN HIEROGLYPH-13A9A;Lo;0;L;;;;;N;;;;; +13A9B;EGYPTIAN HIEROGLYPH-13A9B;Lo;0;L;;;;;N;;;;; +13A9C;EGYPTIAN HIEROGLYPH-13A9C;Lo;0;L;;;;;N;;;;; +13A9D;EGYPTIAN HIEROGLYPH-13A9D;Lo;0;L;;;;;N;;;;; +13A9E;EGYPTIAN HIEROGLYPH-13A9E;Lo;0;L;;;;;N;;;;; +13A9F;EGYPTIAN HIEROGLYPH-13A9F;Lo;0;L;;;;;N;;;;; +13AA0;EGYPTIAN HIEROGLYPH-13AA0;Lo;0;L;;;;;N;;;;; +13AA1;EGYPTIAN HIEROGLYPH-13AA1;Lo;0;L;;;;;N;;;;; +13AA2;EGYPTIAN HIEROGLYPH-13AA2;Lo;0;L;;;;;N;;;;; +13AA3;EGYPTIAN HIEROGLYPH-13AA3;Lo;0;L;;;;;N;;;;; +13AA4;EGYPTIAN HIEROGLYPH-13AA4;Lo;0;L;;;;;N;;;;; +13AA5;EGYPTIAN HIEROGLYPH-13AA5;Lo;0;L;;;;;N;;;;; +13AA6;EGYPTIAN HIEROGLYPH-13AA6;Lo;0;L;;;;;N;;;;; +13AA7;EGYPTIAN HIEROGLYPH-13AA7;Lo;0;L;;;;;N;;;;; +13AA8;EGYPTIAN HIEROGLYPH-13AA8;Lo;0;L;;;;;N;;;;; +13AA9;EGYPTIAN HIEROGLYPH-13AA9;Lo;0;L;;;;;N;;;;; +13AAA;EGYPTIAN HIEROGLYPH-13AAA;Lo;0;L;;;;;N;;;;; +13AAB;EGYPTIAN HIEROGLYPH-13AAB;Lo;0;L;;;;;N;;;;; +13AAC;EGYPTIAN HIEROGLYPH-13AAC;Lo;0;L;;;;;N;;;;; +13AAD;EGYPTIAN HIEROGLYPH-13AAD;Lo;0;L;;;;;N;;;;; +13AAE;EGYPTIAN HIEROGLYPH-13AAE;Lo;0;L;;;;;N;;;;; +13AAF;EGYPTIAN HIEROGLYPH-13AAF;Lo;0;L;;;;;N;;;;; +13AB0;EGYPTIAN HIEROGLYPH-13AB0;Lo;0;L;;;;;N;;;;; +13AB1;EGYPTIAN HIEROGLYPH-13AB1;Lo;0;L;;;;;N;;;;; +13AB2;EGYPTIAN HIEROGLYPH-13AB2;Lo;0;L;;;;;N;;;;; +13AB3;EGYPTIAN HIEROGLYPH-13AB3;Lo;0;L;;;;;N;;;;; +13AB4;EGYPTIAN HIEROGLYPH-13AB4;Lo;0;L;;;;;N;;;;; +13AB5;EGYPTIAN HIEROGLYPH-13AB5;Lo;0;L;;;;;N;;;;; +13AB6;EGYPTIAN HIEROGLYPH-13AB6;Lo;0;L;;;;;N;;;;; +13AB7;EGYPTIAN HIEROGLYPH-13AB7;Lo;0;L;;;;;N;;;;; +13AB8;EGYPTIAN HIEROGLYPH-13AB8;Lo;0;L;;;;;N;;;;; +13AB9;EGYPTIAN HIEROGLYPH-13AB9;Lo;0;L;;;;;N;;;;; +13ABA;EGYPTIAN HIEROGLYPH-13ABA;Lo;0;L;;;;;N;;;;; +13ABB;EGYPTIAN HIEROGLYPH-13ABB;Lo;0;L;;;;;N;;;;; +13ABC;EGYPTIAN HIEROGLYPH-13ABC;Lo;0;L;;;;;N;;;;; +13ABD;EGYPTIAN HIEROGLYPH-13ABD;Lo;0;L;;;;;N;;;;; +13ABE;EGYPTIAN HIEROGLYPH-13ABE;Lo;0;L;;;;;N;;;;; +13ABF;EGYPTIAN HIEROGLYPH-13ABF;Lo;0;L;;;;;N;;;;; +13AC0;EGYPTIAN HIEROGLYPH-13AC0;Lo;0;L;;;;;N;;;;; +13AC1;EGYPTIAN HIEROGLYPH-13AC1;Lo;0;L;;;;;N;;;;; +13AC2;EGYPTIAN HIEROGLYPH-13AC2;Lo;0;L;;;;;N;;;;; +13AC3;EGYPTIAN HIEROGLYPH-13AC3;Lo;0;L;;;;;N;;;;; +13AC4;EGYPTIAN HIEROGLYPH-13AC4;Lo;0;L;;;;;N;;;;; +13AC5;EGYPTIAN HIEROGLYPH-13AC5;Lo;0;L;;;;;N;;;;; +13AC6;EGYPTIAN HIEROGLYPH-13AC6;Lo;0;L;;;;;N;;;;; +13AC7;EGYPTIAN HIEROGLYPH-13AC7;Lo;0;L;;;;;N;;;;; +13AC8;EGYPTIAN HIEROGLYPH-13AC8;Lo;0;L;;;;;N;;;;; +13AC9;EGYPTIAN HIEROGLYPH-13AC9;Lo;0;L;;;;;N;;;;; +13ACA;EGYPTIAN HIEROGLYPH-13ACA;Lo;0;L;;;;;N;;;;; +13ACB;EGYPTIAN HIEROGLYPH-13ACB;Lo;0;L;;;;;N;;;;; +13ACC;EGYPTIAN HIEROGLYPH-13ACC;Lo;0;L;;;;;N;;;;; +13ACD;EGYPTIAN HIEROGLYPH-13ACD;Lo;0;L;;;;;N;;;;; +13ACE;EGYPTIAN HIEROGLYPH-13ACE;Lo;0;L;;;;;N;;;;; +13ACF;EGYPTIAN HIEROGLYPH-13ACF;Lo;0;L;;;;;N;;;;; +13AD0;EGYPTIAN HIEROGLYPH-13AD0;Lo;0;L;;;;;N;;;;; +13AD1;EGYPTIAN HIEROGLYPH-13AD1;Lo;0;L;;;;;N;;;;; +13AD2;EGYPTIAN HIEROGLYPH-13AD2;Lo;0;L;;;;;N;;;;; +13AD3;EGYPTIAN HIEROGLYPH-13AD3;Lo;0;L;;;;;N;;;;; +13AD4;EGYPTIAN HIEROGLYPH-13AD4;Lo;0;L;;;;;N;;;;; +13AD5;EGYPTIAN HIEROGLYPH-13AD5;Lo;0;L;;;;;N;;;;; +13AD6;EGYPTIAN HIEROGLYPH-13AD6;Lo;0;L;;;;;N;;;;; +13AD7;EGYPTIAN HIEROGLYPH-13AD7;Lo;0;L;;;;;N;;;;; +13AD8;EGYPTIAN HIEROGLYPH-13AD8;Lo;0;L;;;;;N;;;;; +13AD9;EGYPTIAN HIEROGLYPH-13AD9;Lo;0;L;;;;;N;;;;; +13ADA;EGYPTIAN HIEROGLYPH-13ADA;Lo;0;L;;;;;N;;;;; +13ADB;EGYPTIAN HIEROGLYPH-13ADB;Lo;0;L;;;;;N;;;;; +13ADC;EGYPTIAN HIEROGLYPH-13ADC;Lo;0;L;;;;;N;;;;; +13ADD;EGYPTIAN HIEROGLYPH-13ADD;Lo;0;L;;;;;N;;;;; +13ADE;EGYPTIAN HIEROGLYPH-13ADE;Lo;0;L;;;;;N;;;;; +13ADF;EGYPTIAN HIEROGLYPH-13ADF;Lo;0;L;;;;;N;;;;; +13AE0;EGYPTIAN HIEROGLYPH-13AE0;Lo;0;L;;;;;N;;;;; +13AE1;EGYPTIAN HIEROGLYPH-13AE1;Lo;0;L;;;;;N;;;;; +13AE2;EGYPTIAN HIEROGLYPH-13AE2;Lo;0;L;;;;;N;;;;; +13AE3;EGYPTIAN HIEROGLYPH-13AE3;Lo;0;L;;;;;N;;;;; +13AE4;EGYPTIAN HIEROGLYPH-13AE4;Lo;0;L;;;;;N;;;;; +13AE5;EGYPTIAN HIEROGLYPH-13AE5;Lo;0;L;;;;;N;;;;; +13AE6;EGYPTIAN HIEROGLYPH-13AE6;Lo;0;L;;;;;N;;;;; +13AE7;EGYPTIAN HIEROGLYPH-13AE7;Lo;0;L;;;;;N;;;;; +13AE8;EGYPTIAN HIEROGLYPH-13AE8;Lo;0;L;;;;;N;;;;; +13AE9;EGYPTIAN HIEROGLYPH-13AE9;Lo;0;L;;;;;N;;;;; +13AEA;EGYPTIAN HIEROGLYPH-13AEA;Lo;0;L;;;;;N;;;;; +13AEB;EGYPTIAN HIEROGLYPH-13AEB;Lo;0;L;;;;;N;;;;; +13AEC;EGYPTIAN HIEROGLYPH-13AEC;Lo;0;L;;;;;N;;;;; +13AED;EGYPTIAN HIEROGLYPH-13AED;Lo;0;L;;;;;N;;;;; +13AEE;EGYPTIAN HIEROGLYPH-13AEE;Lo;0;L;;;;;N;;;;; +13AEF;EGYPTIAN HIEROGLYPH-13AEF;Lo;0;L;;;;;N;;;;; +13AF0;EGYPTIAN HIEROGLYPH-13AF0;Lo;0;L;;;;;N;;;;; +13AF1;EGYPTIAN HIEROGLYPH-13AF1;Lo;0;L;;;;;N;;;;; +13AF2;EGYPTIAN HIEROGLYPH-13AF2;Lo;0;L;;;;;N;;;;; +13AF3;EGYPTIAN HIEROGLYPH-13AF3;Lo;0;L;;;;;N;;;;; +13AF4;EGYPTIAN HIEROGLYPH-13AF4;Lo;0;L;;;;;N;;;;; +13AF5;EGYPTIAN HIEROGLYPH-13AF5;Lo;0;L;;;;;N;;;;; +13AF6;EGYPTIAN HIEROGLYPH-13AF6;Lo;0;L;;;;;N;;;;; +13AF7;EGYPTIAN HIEROGLYPH-13AF7;Lo;0;L;;;;;N;;;;; +13AF8;EGYPTIAN HIEROGLYPH-13AF8;Lo;0;L;;;;;N;;;;; +13AF9;EGYPTIAN HIEROGLYPH-13AF9;Lo;0;L;;;;;N;;;;; +13AFA;EGYPTIAN HIEROGLYPH-13AFA;Lo;0;L;;;;;N;;;;; +13AFB;EGYPTIAN HIEROGLYPH-13AFB;Lo;0;L;;;;;N;;;;; +13AFC;EGYPTIAN HIEROGLYPH-13AFC;Lo;0;L;;;;;N;;;;; +13AFD;EGYPTIAN HIEROGLYPH-13AFD;Lo;0;L;;;;;N;;;;; +13AFE;EGYPTIAN HIEROGLYPH-13AFE;Lo;0;L;;;;;N;;;;; +13AFF;EGYPTIAN HIEROGLYPH-13AFF;Lo;0;L;;;;;N;;;;; +13B00;EGYPTIAN HIEROGLYPH-13B00;Lo;0;L;;;;;N;;;;; +13B01;EGYPTIAN HIEROGLYPH-13B01;Lo;0;L;;;;;N;;;;; +13B02;EGYPTIAN HIEROGLYPH-13B02;Lo;0;L;;;;;N;;;;; +13B03;EGYPTIAN HIEROGLYPH-13B03;Lo;0;L;;;;;N;;;;; +13B04;EGYPTIAN HIEROGLYPH-13B04;Lo;0;L;;;;;N;;;;; +13B05;EGYPTIAN HIEROGLYPH-13B05;Lo;0;L;;;;;N;;;;; +13B06;EGYPTIAN HIEROGLYPH-13B06;Lo;0;L;;;;;N;;;;; +13B07;EGYPTIAN HIEROGLYPH-13B07;Lo;0;L;;;;;N;;;;; +13B08;EGYPTIAN HIEROGLYPH-13B08;Lo;0;L;;;;;N;;;;; +13B09;EGYPTIAN HIEROGLYPH-13B09;Lo;0;L;;;;;N;;;;; +13B0A;EGYPTIAN HIEROGLYPH-13B0A;Lo;0;L;;;;;N;;;;; +13B0B;EGYPTIAN HIEROGLYPH-13B0B;Lo;0;L;;;;;N;;;;; +13B0C;EGYPTIAN HIEROGLYPH-13B0C;Lo;0;L;;;;;N;;;;; +13B0D;EGYPTIAN HIEROGLYPH-13B0D;Lo;0;L;;;;;N;;;;; +13B0E;EGYPTIAN HIEROGLYPH-13B0E;Lo;0;L;;;;;N;;;;; +13B0F;EGYPTIAN HIEROGLYPH-13B0F;Lo;0;L;;;;;N;;;;; +13B10;EGYPTIAN HIEROGLYPH-13B10;Lo;0;L;;;;;N;;;;; +13B11;EGYPTIAN HIEROGLYPH-13B11;Lo;0;L;;;;;N;;;;; +13B12;EGYPTIAN HIEROGLYPH-13B12;Lo;0;L;;;;;N;;;;; +13B13;EGYPTIAN HIEROGLYPH-13B13;Lo;0;L;;;;;N;;;;; +13B14;EGYPTIAN HIEROGLYPH-13B14;Lo;0;L;;;;;N;;;;; +13B15;EGYPTIAN HIEROGLYPH-13B15;Lo;0;L;;;;;N;;;;; +13B16;EGYPTIAN HIEROGLYPH-13B16;Lo;0;L;;;;;N;;;;; +13B17;EGYPTIAN HIEROGLYPH-13B17;Lo;0;L;;;;;N;;;;; +13B18;EGYPTIAN HIEROGLYPH-13B18;Lo;0;L;;;;;N;;;;; +13B19;EGYPTIAN HIEROGLYPH-13B19;Lo;0;L;;;;;N;;;;; +13B1A;EGYPTIAN HIEROGLYPH-13B1A;Lo;0;L;;;;;N;;;;; +13B1B;EGYPTIAN HIEROGLYPH-13B1B;Lo;0;L;;;;;N;;;;; +13B1C;EGYPTIAN HIEROGLYPH-13B1C;Lo;0;L;;;;;N;;;;; +13B1D;EGYPTIAN HIEROGLYPH-13B1D;Lo;0;L;;;;;N;;;;; +13B1E;EGYPTIAN HIEROGLYPH-13B1E;Lo;0;L;;;;;N;;;;; +13B1F;EGYPTIAN HIEROGLYPH-13B1F;Lo;0;L;;;;;N;;;;; +13B20;EGYPTIAN HIEROGLYPH-13B20;Lo;0;L;;;;;N;;;;; +13B21;EGYPTIAN HIEROGLYPH-13B21;Lo;0;L;;;;;N;;;;; +13B22;EGYPTIAN HIEROGLYPH-13B22;Lo;0;L;;;;;N;;;;; +13B23;EGYPTIAN HIEROGLYPH-13B23;Lo;0;L;;;;;N;;;;; +13B24;EGYPTIAN HIEROGLYPH-13B24;Lo;0;L;;;;;N;;;;; +13B25;EGYPTIAN HIEROGLYPH-13B25;Lo;0;L;;;;;N;;;;; +13B26;EGYPTIAN HIEROGLYPH-13B26;Lo;0;L;;;;;N;;;;; +13B27;EGYPTIAN HIEROGLYPH-13B27;Lo;0;L;;;;;N;;;;; +13B28;EGYPTIAN HIEROGLYPH-13B28;Lo;0;L;;;;;N;;;;; +13B29;EGYPTIAN HIEROGLYPH-13B29;Lo;0;L;;;;;N;;;;; +13B2A;EGYPTIAN HIEROGLYPH-13B2A;Lo;0;L;;;;;N;;;;; +13B2B;EGYPTIAN HIEROGLYPH-13B2B;Lo;0;L;;;;;N;;;;; +13B2C;EGYPTIAN HIEROGLYPH-13B2C;Lo;0;L;;;;;N;;;;; +13B2D;EGYPTIAN HIEROGLYPH-13B2D;Lo;0;L;;;;;N;;;;; +13B2E;EGYPTIAN HIEROGLYPH-13B2E;Lo;0;L;;;;;N;;;;; +13B2F;EGYPTIAN HIEROGLYPH-13B2F;Lo;0;L;;;;;N;;;;; +13B30;EGYPTIAN HIEROGLYPH-13B30;Lo;0;L;;;;;N;;;;; +13B31;EGYPTIAN HIEROGLYPH-13B31;Lo;0;L;;;;;N;;;;; +13B32;EGYPTIAN HIEROGLYPH-13B32;Lo;0;L;;;;;N;;;;; +13B33;EGYPTIAN HIEROGLYPH-13B33;Lo;0;L;;;;;N;;;;; +13B34;EGYPTIAN HIEROGLYPH-13B34;Lo;0;L;;;;;N;;;;; +13B35;EGYPTIAN HIEROGLYPH-13B35;Lo;0;L;;;;;N;;;;; +13B36;EGYPTIAN HIEROGLYPH-13B36;Lo;0;L;;;;;N;;;;; +13B37;EGYPTIAN HIEROGLYPH-13B37;Lo;0;L;;;;;N;;;;; +13B38;EGYPTIAN HIEROGLYPH-13B38;Lo;0;L;;;;;N;;;;; +13B39;EGYPTIAN HIEROGLYPH-13B39;Lo;0;L;;;;;N;;;;; +13B3A;EGYPTIAN HIEROGLYPH-13B3A;Lo;0;L;;;;;N;;;;; +13B3B;EGYPTIAN HIEROGLYPH-13B3B;Lo;0;L;;;;;N;;;;; +13B3C;EGYPTIAN HIEROGLYPH-13B3C;Lo;0;L;;;;;N;;;;; +13B3D;EGYPTIAN HIEROGLYPH-13B3D;Lo;0;L;;;;;N;;;;; +13B3E;EGYPTIAN HIEROGLYPH-13B3E;Lo;0;L;;;;;N;;;;; +13B3F;EGYPTIAN HIEROGLYPH-13B3F;Lo;0;L;;;;;N;;;;; +13B40;EGYPTIAN HIEROGLYPH-13B40;Lo;0;L;;;;;N;;;;; +13B41;EGYPTIAN HIEROGLYPH-13B41;Lo;0;L;;;;;N;;;;; +13B42;EGYPTIAN HIEROGLYPH-13B42;Lo;0;L;;;;;N;;;;; +13B43;EGYPTIAN HIEROGLYPH-13B43;Lo;0;L;;;;;N;;;;; +13B44;EGYPTIAN HIEROGLYPH-13B44;Lo;0;L;;;;;N;;;;; +13B45;EGYPTIAN HIEROGLYPH-13B45;Lo;0;L;;;;;N;;;;; +13B46;EGYPTIAN HIEROGLYPH-13B46;Lo;0;L;;;;;N;;;;; +13B47;EGYPTIAN HIEROGLYPH-13B47;Lo;0;L;;;;;N;;;;; +13B48;EGYPTIAN HIEROGLYPH-13B48;Lo;0;L;;;;;N;;;;; +13B49;EGYPTIAN HIEROGLYPH-13B49;Lo;0;L;;;;;N;;;;; +13B4A;EGYPTIAN HIEROGLYPH-13B4A;Lo;0;L;;;;;N;;;;; +13B4B;EGYPTIAN HIEROGLYPH-13B4B;Lo;0;L;;;;;N;;;;; +13B4C;EGYPTIAN HIEROGLYPH-13B4C;Lo;0;L;;;;;N;;;;; +13B4D;EGYPTIAN HIEROGLYPH-13B4D;Lo;0;L;;;;;N;;;;; +13B4E;EGYPTIAN HIEROGLYPH-13B4E;Lo;0;L;;;;;N;;;;; +13B4F;EGYPTIAN HIEROGLYPH-13B4F;Lo;0;L;;;;;N;;;;; +13B50;EGYPTIAN HIEROGLYPH-13B50;Lo;0;L;;;;;N;;;;; +13B51;EGYPTIAN HIEROGLYPH-13B51;Lo;0;L;;;;;N;;;;; +13B52;EGYPTIAN HIEROGLYPH-13B52;Lo;0;L;;;;;N;;;;; +13B53;EGYPTIAN HIEROGLYPH-13B53;Lo;0;L;;;;;N;;;;; +13B54;EGYPTIAN HIEROGLYPH-13B54;Lo;0;L;;;;;N;;;;; +13B55;EGYPTIAN HIEROGLYPH-13B55;Lo;0;L;;;;;N;;;;; +13B56;EGYPTIAN HIEROGLYPH-13B56;Lo;0;L;;;;;N;;;;; +13B57;EGYPTIAN HIEROGLYPH-13B57;Lo;0;L;;;;;N;;;;; +13B58;EGYPTIAN HIEROGLYPH-13B58;Lo;0;L;;;;;N;;;;; +13B59;EGYPTIAN HIEROGLYPH-13B59;Lo;0;L;;;;;N;;;;; +13B5A;EGYPTIAN HIEROGLYPH-13B5A;Lo;0;L;;;;;N;;;;; +13B5B;EGYPTIAN HIEROGLYPH-13B5B;Lo;0;L;;;;;N;;;;; +13B5C;EGYPTIAN HIEROGLYPH-13B5C;Lo;0;L;;;;;N;;;;; +13B5D;EGYPTIAN HIEROGLYPH-13B5D;Lo;0;L;;;;;N;;;;; +13B5E;EGYPTIAN HIEROGLYPH-13B5E;Lo;0;L;;;;;N;;;;; +13B5F;EGYPTIAN HIEROGLYPH-13B5F;Lo;0;L;;;;;N;;;;; +13B60;EGYPTIAN HIEROGLYPH-13B60;Lo;0;L;;;;;N;;;;; +13B61;EGYPTIAN HIEROGLYPH-13B61;Lo;0;L;;;;;N;;;;; +13B62;EGYPTIAN HIEROGLYPH-13B62;Lo;0;L;;;;;N;;;;; +13B63;EGYPTIAN HIEROGLYPH-13B63;Lo;0;L;;;;;N;;;;; +13B64;EGYPTIAN HIEROGLYPH-13B64;Lo;0;L;;;;;N;;;;; +13B65;EGYPTIAN HIEROGLYPH-13B65;Lo;0;L;;;;;N;;;;; +13B66;EGYPTIAN HIEROGLYPH-13B66;Lo;0;L;;;;;N;;;;; +13B67;EGYPTIAN HIEROGLYPH-13B67;Lo;0;L;;;;;N;;;;; +13B68;EGYPTIAN HIEROGLYPH-13B68;Lo;0;L;;;;;N;;;;; +13B69;EGYPTIAN HIEROGLYPH-13B69;Lo;0;L;;;;;N;;;;; +13B6A;EGYPTIAN HIEROGLYPH-13B6A;Lo;0;L;;;;;N;;;;; +13B6B;EGYPTIAN HIEROGLYPH-13B6B;Lo;0;L;;;;;N;;;;; +13B6C;EGYPTIAN HIEROGLYPH-13B6C;Lo;0;L;;;;;N;;;;; +13B6D;EGYPTIAN HIEROGLYPH-13B6D;Lo;0;L;;;;;N;;;;; +13B6E;EGYPTIAN HIEROGLYPH-13B6E;Lo;0;L;;;;;N;;;;; +13B6F;EGYPTIAN HIEROGLYPH-13B6F;Lo;0;L;;;;;N;;;;; +13B70;EGYPTIAN HIEROGLYPH-13B70;Lo;0;L;;;;;N;;;;; +13B71;EGYPTIAN HIEROGLYPH-13B71;Lo;0;L;;;;;N;;;;; +13B72;EGYPTIAN HIEROGLYPH-13B72;Lo;0;L;;;;;N;;;;; +13B73;EGYPTIAN HIEROGLYPH-13B73;Lo;0;L;;;;;N;;;;; +13B74;EGYPTIAN HIEROGLYPH-13B74;Lo;0;L;;;;;N;;;;; +13B75;EGYPTIAN HIEROGLYPH-13B75;Lo;0;L;;;;;N;;;;; +13B76;EGYPTIAN HIEROGLYPH-13B76;Lo;0;L;;;;;N;;;;; +13B77;EGYPTIAN HIEROGLYPH-13B77;Lo;0;L;;;;;N;;;;; +13B78;EGYPTIAN HIEROGLYPH-13B78;Lo;0;L;;;;;N;;;;; +13B79;EGYPTIAN HIEROGLYPH-13B79;Lo;0;L;;;;;N;;;;; +13B7A;EGYPTIAN HIEROGLYPH-13B7A;Lo;0;L;;;;;N;;;;; +13B7B;EGYPTIAN HIEROGLYPH-13B7B;Lo;0;L;;;;;N;;;;; +13B7C;EGYPTIAN HIEROGLYPH-13B7C;Lo;0;L;;;;;N;;;;; +13B7D;EGYPTIAN HIEROGLYPH-13B7D;Lo;0;L;;;;;N;;;;; +13B7E;EGYPTIAN HIEROGLYPH-13B7E;Lo;0;L;;;;;N;;;;; +13B7F;EGYPTIAN HIEROGLYPH-13B7F;Lo;0;L;;;;;N;;;;; +13B80;EGYPTIAN HIEROGLYPH-13B80;Lo;0;L;;;;;N;;;;; +13B81;EGYPTIAN HIEROGLYPH-13B81;Lo;0;L;;;;;N;;;;; +13B82;EGYPTIAN HIEROGLYPH-13B82;Lo;0;L;;;;;N;;;;; +13B83;EGYPTIAN HIEROGLYPH-13B83;Lo;0;L;;;;;N;;;;; +13B84;EGYPTIAN HIEROGLYPH-13B84;Lo;0;L;;;;;N;;;;; +13B85;EGYPTIAN HIEROGLYPH-13B85;Lo;0;L;;;;;N;;;;; +13B86;EGYPTIAN HIEROGLYPH-13B86;Lo;0;L;;;;;N;;;;; +13B87;EGYPTIAN HIEROGLYPH-13B87;Lo;0;L;;;;;N;;;;; +13B88;EGYPTIAN HIEROGLYPH-13B88;Lo;0;L;;;;;N;;;;; +13B89;EGYPTIAN HIEROGLYPH-13B89;Lo;0;L;;;;;N;;;;; +13B8A;EGYPTIAN HIEROGLYPH-13B8A;Lo;0;L;;;;;N;;;;; +13B8B;EGYPTIAN HIEROGLYPH-13B8B;Lo;0;L;;;;;N;;;;; +13B8C;EGYPTIAN HIEROGLYPH-13B8C;Lo;0;L;;;;;N;;;;; +13B8D;EGYPTIAN HIEROGLYPH-13B8D;Lo;0;L;;;;;N;;;;; +13B8E;EGYPTIAN HIEROGLYPH-13B8E;Lo;0;L;;;;;N;;;;; +13B8F;EGYPTIAN HIEROGLYPH-13B8F;Lo;0;L;;;;;N;;;;; +13B90;EGYPTIAN HIEROGLYPH-13B90;Lo;0;L;;;;;N;;;;; +13B91;EGYPTIAN HIEROGLYPH-13B91;Lo;0;L;;;;;N;;;;; +13B92;EGYPTIAN HIEROGLYPH-13B92;Lo;0;L;;;;;N;;;;; +13B93;EGYPTIAN HIEROGLYPH-13B93;Lo;0;L;;;;;N;;;;; +13B94;EGYPTIAN HIEROGLYPH-13B94;Lo;0;L;;;;;N;;;;; +13B95;EGYPTIAN HIEROGLYPH-13B95;Lo;0;L;;;;;N;;;;; +13B96;EGYPTIAN HIEROGLYPH-13B96;Lo;0;L;;;;;N;;;;; +13B97;EGYPTIAN HIEROGLYPH-13B97;Lo;0;L;;;;;N;;;;; +13B98;EGYPTIAN HIEROGLYPH-13B98;Lo;0;L;;;;;N;;;;; +13B99;EGYPTIAN HIEROGLYPH-13B99;Lo;0;L;;;;;N;;;;; +13B9A;EGYPTIAN HIEROGLYPH-13B9A;Lo;0;L;;;;;N;;;;; +13B9B;EGYPTIAN HIEROGLYPH-13B9B;Lo;0;L;;;;;N;;;;; +13B9C;EGYPTIAN HIEROGLYPH-13B9C;Lo;0;L;;;;;N;;;;; +13B9D;EGYPTIAN HIEROGLYPH-13B9D;Lo;0;L;;;;;N;;;;; +13B9E;EGYPTIAN HIEROGLYPH-13B9E;Lo;0;L;;;;;N;;;;; +13B9F;EGYPTIAN HIEROGLYPH-13B9F;Lo;0;L;;;;;N;;;;; +13BA0;EGYPTIAN HIEROGLYPH-13BA0;Lo;0;L;;;;;N;;;;; +13BA1;EGYPTIAN HIEROGLYPH-13BA1;Lo;0;L;;;;;N;;;;; +13BA2;EGYPTIAN HIEROGLYPH-13BA2;Lo;0;L;;;;;N;;;;; +13BA3;EGYPTIAN HIEROGLYPH-13BA3;Lo;0;L;;;;;N;;;;; +13BA4;EGYPTIAN HIEROGLYPH-13BA4;Lo;0;L;;;;;N;;;;; +13BA5;EGYPTIAN HIEROGLYPH-13BA5;Lo;0;L;;;;;N;;;;; +13BA6;EGYPTIAN HIEROGLYPH-13BA6;Lo;0;L;;;;;N;;;;; +13BA7;EGYPTIAN HIEROGLYPH-13BA7;Lo;0;L;;;;;N;;;;; +13BA8;EGYPTIAN HIEROGLYPH-13BA8;Lo;0;L;;;;;N;;;;; +13BA9;EGYPTIAN HIEROGLYPH-13BA9;Lo;0;L;;;;;N;;;;; +13BAA;EGYPTIAN HIEROGLYPH-13BAA;Lo;0;L;;;;;N;;;;; +13BAB;EGYPTIAN HIEROGLYPH-13BAB;Lo;0;L;;;;;N;;;;; +13BAC;EGYPTIAN HIEROGLYPH-13BAC;Lo;0;L;;;;;N;;;;; +13BAD;EGYPTIAN HIEROGLYPH-13BAD;Lo;0;L;;;;;N;;;;; +13BAE;EGYPTIAN HIEROGLYPH-13BAE;Lo;0;L;;;;;N;;;;; +13BAF;EGYPTIAN HIEROGLYPH-13BAF;Lo;0;L;;;;;N;;;;; +13BB0;EGYPTIAN HIEROGLYPH-13BB0;Lo;0;L;;;;;N;;;;; +13BB1;EGYPTIAN HIEROGLYPH-13BB1;Lo;0;L;;;;;N;;;;; +13BB2;EGYPTIAN HIEROGLYPH-13BB2;Lo;0;L;;;;;N;;;;; +13BB3;EGYPTIAN HIEROGLYPH-13BB3;Lo;0;L;;;;;N;;;;; +13BB4;EGYPTIAN HIEROGLYPH-13BB4;Lo;0;L;;;;;N;;;;; +13BB5;EGYPTIAN HIEROGLYPH-13BB5;Lo;0;L;;;;;N;;;;; +13BB6;EGYPTIAN HIEROGLYPH-13BB6;Lo;0;L;;;;;N;;;;; +13BB7;EGYPTIAN HIEROGLYPH-13BB7;Lo;0;L;;;;;N;;;;; +13BB8;EGYPTIAN HIEROGLYPH-13BB8;Lo;0;L;;;;;N;;;;; +13BB9;EGYPTIAN HIEROGLYPH-13BB9;Lo;0;L;;;;;N;;;;; +13BBA;EGYPTIAN HIEROGLYPH-13BBA;Lo;0;L;;;;;N;;;;; +13BBB;EGYPTIAN HIEROGLYPH-13BBB;Lo;0;L;;;;;N;;;;; +13BBC;EGYPTIAN HIEROGLYPH-13BBC;Lo;0;L;;;;;N;;;;; +13BBD;EGYPTIAN HIEROGLYPH-13BBD;Lo;0;L;;;;;N;;;;; +13BBE;EGYPTIAN HIEROGLYPH-13BBE;Lo;0;L;;;;;N;;;;; +13BBF;EGYPTIAN HIEROGLYPH-13BBF;Lo;0;L;;;;;N;;;;; +13BC0;EGYPTIAN HIEROGLYPH-13BC0;Lo;0;L;;;;;N;;;;; +13BC1;EGYPTIAN HIEROGLYPH-13BC1;Lo;0;L;;;;;N;;;;; +13BC2;EGYPTIAN HIEROGLYPH-13BC2;Lo;0;L;;;;;N;;;;; +13BC3;EGYPTIAN HIEROGLYPH-13BC3;Lo;0;L;;;;;N;;;;; +13BC4;EGYPTIAN HIEROGLYPH-13BC4;Lo;0;L;;;;;N;;;;; +13BC5;EGYPTIAN HIEROGLYPH-13BC5;Lo;0;L;;;;;N;;;;; +13BC6;EGYPTIAN HIEROGLYPH-13BC6;Lo;0;L;;;;;N;;;;; +13BC7;EGYPTIAN HIEROGLYPH-13BC7;Lo;0;L;;;;;N;;;;; +13BC8;EGYPTIAN HIEROGLYPH-13BC8;Lo;0;L;;;;;N;;;;; +13BC9;EGYPTIAN HIEROGLYPH-13BC9;Lo;0;L;;;;;N;;;;; +13BCA;EGYPTIAN HIEROGLYPH-13BCA;Lo;0;L;;;;;N;;;;; +13BCB;EGYPTIAN HIEROGLYPH-13BCB;Lo;0;L;;;;;N;;;;; +13BCC;EGYPTIAN HIEROGLYPH-13BCC;Lo;0;L;;;;;N;;;;; +13BCD;EGYPTIAN HIEROGLYPH-13BCD;Lo;0;L;;;;;N;;;;; +13BCE;EGYPTIAN HIEROGLYPH-13BCE;Lo;0;L;;;;;N;;;;; +13BCF;EGYPTIAN HIEROGLYPH-13BCF;Lo;0;L;;;;;N;;;;; +13BD0;EGYPTIAN HIEROGLYPH-13BD0;Lo;0;L;;;;;N;;;;; +13BD1;EGYPTIAN HIEROGLYPH-13BD1;Lo;0;L;;;;;N;;;;; +13BD2;EGYPTIAN HIEROGLYPH-13BD2;Lo;0;L;;;;;N;;;;; +13BD3;EGYPTIAN HIEROGLYPH-13BD3;Lo;0;L;;;;;N;;;;; +13BD4;EGYPTIAN HIEROGLYPH-13BD4;Lo;0;L;;;;;N;;;;; +13BD5;EGYPTIAN HIEROGLYPH-13BD5;Lo;0;L;;;;;N;;;;; +13BD6;EGYPTIAN HIEROGLYPH-13BD6;Lo;0;L;;;;;N;;;;; +13BD7;EGYPTIAN HIEROGLYPH-13BD7;Lo;0;L;;;;;N;;;;; +13BD8;EGYPTIAN HIEROGLYPH-13BD8;Lo;0;L;;;;;N;;;;; +13BD9;EGYPTIAN HIEROGLYPH-13BD9;Lo;0;L;;;;;N;;;;; +13BDA;EGYPTIAN HIEROGLYPH-13BDA;Lo;0;L;;;;;N;;;;; +13BDB;EGYPTIAN HIEROGLYPH-13BDB;Lo;0;L;;;;;N;;;;; +13BDC;EGYPTIAN HIEROGLYPH-13BDC;Lo;0;L;;;;;N;;;;; +13BDD;EGYPTIAN HIEROGLYPH-13BDD;Lo;0;L;;;;;N;;;;; +13BDE;EGYPTIAN HIEROGLYPH-13BDE;Lo;0;L;;;;;N;;;;; +13BDF;EGYPTIAN HIEROGLYPH-13BDF;Lo;0;L;;;;;N;;;;; +13BE0;EGYPTIAN HIEROGLYPH-13BE0;Lo;0;L;;;;;N;;;;; +13BE1;EGYPTIAN HIEROGLYPH-13BE1;Lo;0;L;;;;;N;;;;; +13BE2;EGYPTIAN HIEROGLYPH-13BE2;Lo;0;L;;;;;N;;;;; +13BE3;EGYPTIAN HIEROGLYPH-13BE3;Lo;0;L;;;;;N;;;;; +13BE4;EGYPTIAN HIEROGLYPH-13BE4;Lo;0;L;;;;;N;;;;; +13BE5;EGYPTIAN HIEROGLYPH-13BE5;Lo;0;L;;;;;N;;;;; +13BE6;EGYPTIAN HIEROGLYPH-13BE6;Lo;0;L;;;;;N;;;;; +13BE7;EGYPTIAN HIEROGLYPH-13BE7;Lo;0;L;;;;;N;;;;; +13BE8;EGYPTIAN HIEROGLYPH-13BE8;Lo;0;L;;;;;N;;;;; +13BE9;EGYPTIAN HIEROGLYPH-13BE9;Lo;0;L;;;;;N;;;;; +13BEA;EGYPTIAN HIEROGLYPH-13BEA;Lo;0;L;;;;;N;;;;; +13BEB;EGYPTIAN HIEROGLYPH-13BEB;Lo;0;L;;;;;N;;;;; +13BEC;EGYPTIAN HIEROGLYPH-13BEC;Lo;0;L;;;;;N;;;;; +13BED;EGYPTIAN HIEROGLYPH-13BED;Lo;0;L;;;;;N;;;;; +13BEE;EGYPTIAN HIEROGLYPH-13BEE;Lo;0;L;;;;;N;;;;; +13BEF;EGYPTIAN HIEROGLYPH-13BEF;Lo;0;L;;;;;N;;;;; +13BF0;EGYPTIAN HIEROGLYPH-13BF0;Lo;0;L;;;;;N;;;;; +13BF1;EGYPTIAN HIEROGLYPH-13BF1;Lo;0;L;;;;;N;;;;; +13BF2;EGYPTIAN HIEROGLYPH-13BF2;Lo;0;L;;;;;N;;;;; +13BF3;EGYPTIAN HIEROGLYPH-13BF3;Lo;0;L;;;;;N;;;;; +13BF4;EGYPTIAN HIEROGLYPH-13BF4;Lo;0;L;;;;;N;;;;; +13BF5;EGYPTIAN HIEROGLYPH-13BF5;Lo;0;L;;;;;N;;;;; +13BF6;EGYPTIAN HIEROGLYPH-13BF6;Lo;0;L;;;;;N;;;;; +13BF7;EGYPTIAN HIEROGLYPH-13BF7;Lo;0;L;;;;;N;;;;; +13BF8;EGYPTIAN HIEROGLYPH-13BF8;Lo;0;L;;;;;N;;;;; +13BF9;EGYPTIAN HIEROGLYPH-13BF9;Lo;0;L;;;;;N;;;;; +13BFA;EGYPTIAN HIEROGLYPH-13BFA;Lo;0;L;;;;;N;;;;; +13BFB;EGYPTIAN HIEROGLYPH-13BFB;Lo;0;L;;;;;N;;;;; +13BFC;EGYPTIAN HIEROGLYPH-13BFC;Lo;0;L;;;;;N;;;;; +13BFD;EGYPTIAN HIEROGLYPH-13BFD;Lo;0;L;;;;;N;;;;; +13BFE;EGYPTIAN HIEROGLYPH-13BFE;Lo;0;L;;;;;N;;;;; +13BFF;EGYPTIAN HIEROGLYPH-13BFF;Lo;0;L;;;;;N;;;;; +13C00;EGYPTIAN HIEROGLYPH-13C00;Lo;0;L;;;;;N;;;;; +13C01;EGYPTIAN HIEROGLYPH-13C01;Lo;0;L;;;;;N;;;;; +13C02;EGYPTIAN HIEROGLYPH-13C02;Lo;0;L;;;;;N;;;;; +13C03;EGYPTIAN HIEROGLYPH-13C03;Lo;0;L;;;;;N;;;;; +13C04;EGYPTIAN HIEROGLYPH-13C04;Lo;0;L;;;;;N;;;;; +13C05;EGYPTIAN HIEROGLYPH-13C05;Lo;0;L;;;;;N;;;;; +13C06;EGYPTIAN HIEROGLYPH-13C06;Lo;0;L;;;;;N;;;;; +13C07;EGYPTIAN HIEROGLYPH-13C07;Lo;0;L;;;;;N;;;;; +13C08;EGYPTIAN HIEROGLYPH-13C08;Lo;0;L;;;;;N;;;;; +13C09;EGYPTIAN HIEROGLYPH-13C09;Lo;0;L;;;;;N;;;;; +13C0A;EGYPTIAN HIEROGLYPH-13C0A;Lo;0;L;;;;;N;;;;; +13C0B;EGYPTIAN HIEROGLYPH-13C0B;Lo;0;L;;;;;N;;;;; +13C0C;EGYPTIAN HIEROGLYPH-13C0C;Lo;0;L;;;;;N;;;;; +13C0D;EGYPTIAN HIEROGLYPH-13C0D;Lo;0;L;;;;;N;;;;; +13C0E;EGYPTIAN HIEROGLYPH-13C0E;Lo;0;L;;;;;N;;;;; +13C0F;EGYPTIAN HIEROGLYPH-13C0F;Lo;0;L;;;;;N;;;;; +13C10;EGYPTIAN HIEROGLYPH-13C10;Lo;0;L;;;;;N;;;;; +13C11;EGYPTIAN HIEROGLYPH-13C11;Lo;0;L;;;;;N;;;;; +13C12;EGYPTIAN HIEROGLYPH-13C12;Lo;0;L;;;;;N;;;;; +13C13;EGYPTIAN HIEROGLYPH-13C13;Lo;0;L;;;;;N;;;;; +13C14;EGYPTIAN HIEROGLYPH-13C14;Lo;0;L;;;;;N;;;;; +13C15;EGYPTIAN HIEROGLYPH-13C15;Lo;0;L;;;;;N;;;;; +13C16;EGYPTIAN HIEROGLYPH-13C16;Lo;0;L;;;;;N;;;;; +13C17;EGYPTIAN HIEROGLYPH-13C17;Lo;0;L;;;;;N;;;;; +13C18;EGYPTIAN HIEROGLYPH-13C18;Lo;0;L;;;;;N;;;;; +13C19;EGYPTIAN HIEROGLYPH-13C19;Lo;0;L;;;;;N;;;;; +13C1A;EGYPTIAN HIEROGLYPH-13C1A;Lo;0;L;;;;;N;;;;; +13C1B;EGYPTIAN HIEROGLYPH-13C1B;Lo;0;L;;;;;N;;;;; +13C1C;EGYPTIAN HIEROGLYPH-13C1C;Lo;0;L;;;;;N;;;;; +13C1D;EGYPTIAN HIEROGLYPH-13C1D;Lo;0;L;;;;;N;;;;; +13C1E;EGYPTIAN HIEROGLYPH-13C1E;Lo;0;L;;;;;N;;;;; +13C1F;EGYPTIAN HIEROGLYPH-13C1F;Lo;0;L;;;;;N;;;;; +13C20;EGYPTIAN HIEROGLYPH-13C20;Lo;0;L;;;;;N;;;;; +13C21;EGYPTIAN HIEROGLYPH-13C21;Lo;0;L;;;;;N;;;;; +13C22;EGYPTIAN HIEROGLYPH-13C22;Lo;0;L;;;;;N;;;;; +13C23;EGYPTIAN HIEROGLYPH-13C23;Lo;0;L;;;;;N;;;;; +13C24;EGYPTIAN HIEROGLYPH-13C24;Lo;0;L;;;;;N;;;;; +13C25;EGYPTIAN HIEROGLYPH-13C25;Lo;0;L;;;;;N;;;;; +13C26;EGYPTIAN HIEROGLYPH-13C26;Lo;0;L;;;;;N;;;;; +13C27;EGYPTIAN HIEROGLYPH-13C27;Lo;0;L;;;;;N;;;;; +13C28;EGYPTIAN HIEROGLYPH-13C28;Lo;0;L;;;;;N;;;;; +13C29;EGYPTIAN HIEROGLYPH-13C29;Lo;0;L;;;;;N;;;;; +13C2A;EGYPTIAN HIEROGLYPH-13C2A;Lo;0;L;;;;;N;;;;; +13C2B;EGYPTIAN HIEROGLYPH-13C2B;Lo;0;L;;;;;N;;;;; +13C2C;EGYPTIAN HIEROGLYPH-13C2C;Lo;0;L;;;;;N;;;;; +13C2D;EGYPTIAN HIEROGLYPH-13C2D;Lo;0;L;;;;;N;;;;; +13C2E;EGYPTIAN HIEROGLYPH-13C2E;Lo;0;L;;;;;N;;;;; +13C2F;EGYPTIAN HIEROGLYPH-13C2F;Lo;0;L;;;;;N;;;;; +13C30;EGYPTIAN HIEROGLYPH-13C30;Lo;0;L;;;;;N;;;;; +13C31;EGYPTIAN HIEROGLYPH-13C31;Lo;0;L;;;;;N;;;;; +13C32;EGYPTIAN HIEROGLYPH-13C32;Lo;0;L;;;;;N;;;;; +13C33;EGYPTIAN HIEROGLYPH-13C33;Lo;0;L;;;;;N;;;;; +13C34;EGYPTIAN HIEROGLYPH-13C34;Lo;0;L;;;;;N;;;;; +13C35;EGYPTIAN HIEROGLYPH-13C35;Lo;0;L;;;;;N;;;;; +13C36;EGYPTIAN HIEROGLYPH-13C36;Lo;0;L;;;;;N;;;;; +13C37;EGYPTIAN HIEROGLYPH-13C37;Lo;0;L;;;;;N;;;;; +13C38;EGYPTIAN HIEROGLYPH-13C38;Lo;0;L;;;;;N;;;;; +13C39;EGYPTIAN HIEROGLYPH-13C39;Lo;0;L;;;;;N;;;;; +13C3A;EGYPTIAN HIEROGLYPH-13C3A;Lo;0;L;;;;;N;;;;; +13C3B;EGYPTIAN HIEROGLYPH-13C3B;Lo;0;L;;;;;N;;;;; +13C3C;EGYPTIAN HIEROGLYPH-13C3C;Lo;0;L;;;;;N;;;;; +13C3D;EGYPTIAN HIEROGLYPH-13C3D;Lo;0;L;;;;;N;;;;; +13C3E;EGYPTIAN HIEROGLYPH-13C3E;Lo;0;L;;;;;N;;;;; +13C3F;EGYPTIAN HIEROGLYPH-13C3F;Lo;0;L;;;;;N;;;;; +13C40;EGYPTIAN HIEROGLYPH-13C40;Lo;0;L;;;;;N;;;;; +13C41;EGYPTIAN HIEROGLYPH-13C41;Lo;0;L;;;;;N;;;;; +13C42;EGYPTIAN HIEROGLYPH-13C42;Lo;0;L;;;;;N;;;;; +13C43;EGYPTIAN HIEROGLYPH-13C43;Lo;0;L;;;;;N;;;;; +13C44;EGYPTIAN HIEROGLYPH-13C44;Lo;0;L;;;;;N;;;;; +13C45;EGYPTIAN HIEROGLYPH-13C45;Lo;0;L;;;;;N;;;;; +13C46;EGYPTIAN HIEROGLYPH-13C46;Lo;0;L;;;;;N;;;;; +13C47;EGYPTIAN HIEROGLYPH-13C47;Lo;0;L;;;;;N;;;;; +13C48;EGYPTIAN HIEROGLYPH-13C48;Lo;0;L;;;;;N;;;;; +13C49;EGYPTIAN HIEROGLYPH-13C49;Lo;0;L;;;;;N;;;;; +13C4A;EGYPTIAN HIEROGLYPH-13C4A;Lo;0;L;;;;;N;;;;; +13C4B;EGYPTIAN HIEROGLYPH-13C4B;Lo;0;L;;;;;N;;;;; +13C4C;EGYPTIAN HIEROGLYPH-13C4C;Lo;0;L;;;;;N;;;;; +13C4D;EGYPTIAN HIEROGLYPH-13C4D;Lo;0;L;;;;;N;;;;; +13C4E;EGYPTIAN HIEROGLYPH-13C4E;Lo;0;L;;;;;N;;;;; +13C4F;EGYPTIAN HIEROGLYPH-13C4F;Lo;0;L;;;;;N;;;;; +13C50;EGYPTIAN HIEROGLYPH-13C50;Lo;0;L;;;;;N;;;;; +13C51;EGYPTIAN HIEROGLYPH-13C51;Lo;0;L;;;;;N;;;;; +13C52;EGYPTIAN HIEROGLYPH-13C52;Lo;0;L;;;;;N;;;;; +13C53;EGYPTIAN HIEROGLYPH-13C53;Lo;0;L;;;;;N;;;;; +13C54;EGYPTIAN HIEROGLYPH-13C54;Lo;0;L;;;;;N;;;;; +13C55;EGYPTIAN HIEROGLYPH-13C55;Lo;0;L;;;;;N;;;;; +13C56;EGYPTIAN HIEROGLYPH-13C56;Lo;0;L;;;;;N;;;;; +13C57;EGYPTIAN HIEROGLYPH-13C57;Lo;0;L;;;;;N;;;;; +13C58;EGYPTIAN HIEROGLYPH-13C58;Lo;0;L;;;;;N;;;;; +13C59;EGYPTIAN HIEROGLYPH-13C59;Lo;0;L;;;;;N;;;;; +13C5A;EGYPTIAN HIEROGLYPH-13C5A;Lo;0;L;;;;;N;;;;; +13C5B;EGYPTIAN HIEROGLYPH-13C5B;Lo;0;L;;;;;N;;;;; +13C5C;EGYPTIAN HIEROGLYPH-13C5C;Lo;0;L;;;;;N;;;;; +13C5D;EGYPTIAN HIEROGLYPH-13C5D;Lo;0;L;;;;;N;;;;; +13C5E;EGYPTIAN HIEROGLYPH-13C5E;Lo;0;L;;;;;N;;;;; +13C5F;EGYPTIAN HIEROGLYPH-13C5F;Lo;0;L;;;;;N;;;;; +13C60;EGYPTIAN HIEROGLYPH-13C60;Lo;0;L;;;;;N;;;;; +13C61;EGYPTIAN HIEROGLYPH-13C61;Lo;0;L;;;;;N;;;;; +13C62;EGYPTIAN HIEROGLYPH-13C62;Lo;0;L;;;;;N;;;;; +13C63;EGYPTIAN HIEROGLYPH-13C63;Lo;0;L;;;;;N;;;;; +13C64;EGYPTIAN HIEROGLYPH-13C64;Lo;0;L;;;;;N;;;;; +13C65;EGYPTIAN HIEROGLYPH-13C65;Lo;0;L;;;;;N;;;;; +13C66;EGYPTIAN HIEROGLYPH-13C66;Lo;0;L;;;;;N;;;;; +13C67;EGYPTIAN HIEROGLYPH-13C67;Lo;0;L;;;;;N;;;;; +13C68;EGYPTIAN HIEROGLYPH-13C68;Lo;0;L;;;;;N;;;;; +13C69;EGYPTIAN HIEROGLYPH-13C69;Lo;0;L;;;;;N;;;;; +13C6A;EGYPTIAN HIEROGLYPH-13C6A;Lo;0;L;;;;;N;;;;; +13C6B;EGYPTIAN HIEROGLYPH-13C6B;Lo;0;L;;;;;N;;;;; +13C6C;EGYPTIAN HIEROGLYPH-13C6C;Lo;0;L;;;;;N;;;;; +13C6D;EGYPTIAN HIEROGLYPH-13C6D;Lo;0;L;;;;;N;;;;; +13C6E;EGYPTIAN HIEROGLYPH-13C6E;Lo;0;L;;;;;N;;;;; +13C6F;EGYPTIAN HIEROGLYPH-13C6F;Lo;0;L;;;;;N;;;;; +13C70;EGYPTIAN HIEROGLYPH-13C70;Lo;0;L;;;;;N;;;;; +13C71;EGYPTIAN HIEROGLYPH-13C71;Lo;0;L;;;;;N;;;;; +13C72;EGYPTIAN HIEROGLYPH-13C72;Lo;0;L;;;;;N;;;;; +13C73;EGYPTIAN HIEROGLYPH-13C73;Lo;0;L;;;;;N;;;;; +13C74;EGYPTIAN HIEROGLYPH-13C74;Lo;0;L;;;;;N;;;;; +13C75;EGYPTIAN HIEROGLYPH-13C75;Lo;0;L;;;;;N;;;;; +13C76;EGYPTIAN HIEROGLYPH-13C76;Lo;0;L;;;;;N;;;;; +13C77;EGYPTIAN HIEROGLYPH-13C77;Lo;0;L;;;;;N;;;;; +13C78;EGYPTIAN HIEROGLYPH-13C78;Lo;0;L;;;;;N;;;;; +13C79;EGYPTIAN HIEROGLYPH-13C79;Lo;0;L;;;;;N;;;;; +13C7A;EGYPTIAN HIEROGLYPH-13C7A;Lo;0;L;;;;;N;;;;; +13C7B;EGYPTIAN HIEROGLYPH-13C7B;Lo;0;L;;;;;N;;;;; +13C7C;EGYPTIAN HIEROGLYPH-13C7C;Lo;0;L;;;;;N;;;;; +13C7D;EGYPTIAN HIEROGLYPH-13C7D;Lo;0;L;;;;;N;;;;; +13C7E;EGYPTIAN HIEROGLYPH-13C7E;Lo;0;L;;;;;N;;;;; +13C7F;EGYPTIAN HIEROGLYPH-13C7F;Lo;0;L;;;;;N;;;;; +13C80;EGYPTIAN HIEROGLYPH-13C80;Lo;0;L;;;;;N;;;;; +13C81;EGYPTIAN HIEROGLYPH-13C81;Lo;0;L;;;;;N;;;;; +13C82;EGYPTIAN HIEROGLYPH-13C82;Lo;0;L;;;;;N;;;;; +13C83;EGYPTIAN HIEROGLYPH-13C83;Lo;0;L;;;;;N;;;;; +13C84;EGYPTIAN HIEROGLYPH-13C84;Lo;0;L;;;;;N;;;;; +13C85;EGYPTIAN HIEROGLYPH-13C85;Lo;0;L;;;;;N;;;;; +13C86;EGYPTIAN HIEROGLYPH-13C86;Lo;0;L;;;;;N;;;;; +13C87;EGYPTIAN HIEROGLYPH-13C87;Lo;0;L;;;;;N;;;;; +13C88;EGYPTIAN HIEROGLYPH-13C88;Lo;0;L;;;;;N;;;;; +13C89;EGYPTIAN HIEROGLYPH-13C89;Lo;0;L;;;;;N;;;;; +13C8A;EGYPTIAN HIEROGLYPH-13C8A;Lo;0;L;;;;;N;;;;; +13C8B;EGYPTIAN HIEROGLYPH-13C8B;Lo;0;L;;;;;N;;;;; +13C8C;EGYPTIAN HIEROGLYPH-13C8C;Lo;0;L;;;;;N;;;;; +13C8D;EGYPTIAN HIEROGLYPH-13C8D;Lo;0;L;;;;;N;;;;; +13C8E;EGYPTIAN HIEROGLYPH-13C8E;Lo;0;L;;;;;N;;;;; +13C8F;EGYPTIAN HIEROGLYPH-13C8F;Lo;0;L;;;;;N;;;;; +13C90;EGYPTIAN HIEROGLYPH-13C90;Lo;0;L;;;;;N;;;;; +13C91;EGYPTIAN HIEROGLYPH-13C91;Lo;0;L;;;;;N;;;;; +13C92;EGYPTIAN HIEROGLYPH-13C92;Lo;0;L;;;;;N;;;;; +13C93;EGYPTIAN HIEROGLYPH-13C93;Lo;0;L;;;;;N;;;;; +13C94;EGYPTIAN HIEROGLYPH-13C94;Lo;0;L;;;;;N;;;;; +13C95;EGYPTIAN HIEROGLYPH-13C95;Lo;0;L;;;;;N;;;;; +13C96;EGYPTIAN HIEROGLYPH-13C96;Lo;0;L;;;;;N;;;;; +13C97;EGYPTIAN HIEROGLYPH-13C97;Lo;0;L;;;;;N;;;;; +13C98;EGYPTIAN HIEROGLYPH-13C98;Lo;0;L;;;;;N;;;;; +13C99;EGYPTIAN HIEROGLYPH-13C99;Lo;0;L;;;;;N;;;;; +13C9A;EGYPTIAN HIEROGLYPH-13C9A;Lo;0;L;;;;;N;;;;; +13C9B;EGYPTIAN HIEROGLYPH-13C9B;Lo;0;L;;;;;N;;;;; +13C9C;EGYPTIAN HIEROGLYPH-13C9C;Lo;0;L;;;;;N;;;;; +13C9D;EGYPTIAN HIEROGLYPH-13C9D;Lo;0;L;;;;;N;;;;; +13C9E;EGYPTIAN HIEROGLYPH-13C9E;Lo;0;L;;;;;N;;;;; +13C9F;EGYPTIAN HIEROGLYPH-13C9F;Lo;0;L;;;;;N;;;;; +13CA0;EGYPTIAN HIEROGLYPH-13CA0;Lo;0;L;;;;;N;;;;; +13CA1;EGYPTIAN HIEROGLYPH-13CA1;Lo;0;L;;;;;N;;;;; +13CA2;EGYPTIAN HIEROGLYPH-13CA2;Lo;0;L;;;;;N;;;;; +13CA3;EGYPTIAN HIEROGLYPH-13CA3;Lo;0;L;;;;;N;;;;; +13CA4;EGYPTIAN HIEROGLYPH-13CA4;Lo;0;L;;;;;N;;;;; +13CA5;EGYPTIAN HIEROGLYPH-13CA5;Lo;0;L;;;;;N;;;;; +13CA6;EGYPTIAN HIEROGLYPH-13CA6;Lo;0;L;;;;;N;;;;; +13CA7;EGYPTIAN HIEROGLYPH-13CA7;Lo;0;L;;;;;N;;;;; +13CA8;EGYPTIAN HIEROGLYPH-13CA8;Lo;0;L;;;;;N;;;;; +13CA9;EGYPTIAN HIEROGLYPH-13CA9;Lo;0;L;;;;;N;;;;; +13CAA;EGYPTIAN HIEROGLYPH-13CAA;Lo;0;L;;;;;N;;;;; +13CAB;EGYPTIAN HIEROGLYPH-13CAB;Lo;0;L;;;;;N;;;;; +13CAC;EGYPTIAN HIEROGLYPH-13CAC;Lo;0;L;;;;;N;;;;; +13CAD;EGYPTIAN HIEROGLYPH-13CAD;Lo;0;L;;;;;N;;;;; +13CAE;EGYPTIAN HIEROGLYPH-13CAE;Lo;0;L;;;;;N;;;;; +13CAF;EGYPTIAN HIEROGLYPH-13CAF;Lo;0;L;;;;;N;;;;; +13CB0;EGYPTIAN HIEROGLYPH-13CB0;Lo;0;L;;;;;N;;;;; +13CB1;EGYPTIAN HIEROGLYPH-13CB1;Lo;0;L;;;;;N;;;;; +13CB2;EGYPTIAN HIEROGLYPH-13CB2;Lo;0;L;;;;;N;;;;; +13CB3;EGYPTIAN HIEROGLYPH-13CB3;Lo;0;L;;;;;N;;;;; +13CB4;EGYPTIAN HIEROGLYPH-13CB4;Lo;0;L;;;;;N;;;;; +13CB5;EGYPTIAN HIEROGLYPH-13CB5;Lo;0;L;;;;;N;;;;; +13CB6;EGYPTIAN HIEROGLYPH-13CB6;Lo;0;L;;;;;N;;;;; +13CB7;EGYPTIAN HIEROGLYPH-13CB7;Lo;0;L;;;;;N;;;;; +13CB8;EGYPTIAN HIEROGLYPH-13CB8;Lo;0;L;;;;;N;;;;; +13CB9;EGYPTIAN HIEROGLYPH-13CB9;Lo;0;L;;;;;N;;;;; +13CBA;EGYPTIAN HIEROGLYPH-13CBA;Lo;0;L;;;;;N;;;;; +13CBB;EGYPTIAN HIEROGLYPH-13CBB;Lo;0;L;;;;;N;;;;; +13CBC;EGYPTIAN HIEROGLYPH-13CBC;Lo;0;L;;;;;N;;;;; +13CBD;EGYPTIAN HIEROGLYPH-13CBD;Lo;0;L;;;;;N;;;;; +13CBE;EGYPTIAN HIEROGLYPH-13CBE;Lo;0;L;;;;;N;;;;; +13CBF;EGYPTIAN HIEROGLYPH-13CBF;Lo;0;L;;;;;N;;;;; +13CC0;EGYPTIAN HIEROGLYPH-13CC0;Lo;0;L;;;;;N;;;;; +13CC1;EGYPTIAN HIEROGLYPH-13CC1;Lo;0;L;;;;;N;;;;; +13CC2;EGYPTIAN HIEROGLYPH-13CC2;Lo;0;L;;;;;N;;;;; +13CC3;EGYPTIAN HIEROGLYPH-13CC3;Lo;0;L;;;;;N;;;;; +13CC4;EGYPTIAN HIEROGLYPH-13CC4;Lo;0;L;;;;;N;;;;; +13CC5;EGYPTIAN HIEROGLYPH-13CC5;Lo;0;L;;;;;N;;;;; +13CC6;EGYPTIAN HIEROGLYPH-13CC6;Lo;0;L;;;;;N;;;;; +13CC7;EGYPTIAN HIEROGLYPH-13CC7;Lo;0;L;;;;;N;;;;; +13CC8;EGYPTIAN HIEROGLYPH-13CC8;Lo;0;L;;;;;N;;;;; +13CC9;EGYPTIAN HIEROGLYPH-13CC9;Lo;0;L;;;;;N;;;;; +13CCA;EGYPTIAN HIEROGLYPH-13CCA;Lo;0;L;;;;;N;;;;; +13CCB;EGYPTIAN HIEROGLYPH-13CCB;Lo;0;L;;;;;N;;;;; +13CCC;EGYPTIAN HIEROGLYPH-13CCC;Lo;0;L;;;;;N;;;;; +13CCD;EGYPTIAN HIEROGLYPH-13CCD;Lo;0;L;;;;;N;;;;; +13CCE;EGYPTIAN HIEROGLYPH-13CCE;Lo;0;L;;;;;N;;;;; +13CCF;EGYPTIAN HIEROGLYPH-13CCF;Lo;0;L;;;;;N;;;;; +13CD0;EGYPTIAN HIEROGLYPH-13CD0;Lo;0;L;;;;;N;;;;; +13CD1;EGYPTIAN HIEROGLYPH-13CD1;Lo;0;L;;;;;N;;;;; +13CD2;EGYPTIAN HIEROGLYPH-13CD2;Lo;0;L;;;;;N;;;;; +13CD3;EGYPTIAN HIEROGLYPH-13CD3;Lo;0;L;;;;;N;;;;; +13CD4;EGYPTIAN HIEROGLYPH-13CD4;Lo;0;L;;;;;N;;;;; +13CD5;EGYPTIAN HIEROGLYPH-13CD5;Lo;0;L;;;;;N;;;;; +13CD6;EGYPTIAN HIEROGLYPH-13CD6;Lo;0;L;;;;;N;;;;; +13CD7;EGYPTIAN HIEROGLYPH-13CD7;Lo;0;L;;;;;N;;;;; +13CD8;EGYPTIAN HIEROGLYPH-13CD8;Lo;0;L;;;;;N;;;;; +13CD9;EGYPTIAN HIEROGLYPH-13CD9;Lo;0;L;;;;;N;;;;; +13CDA;EGYPTIAN HIEROGLYPH-13CDA;Lo;0;L;;;;;N;;;;; +13CDB;EGYPTIAN HIEROGLYPH-13CDB;Lo;0;L;;;;;N;;;;; +13CDC;EGYPTIAN HIEROGLYPH-13CDC;Lo;0;L;;;;;N;;;;; +13CDD;EGYPTIAN HIEROGLYPH-13CDD;Lo;0;L;;;;;N;;;;; +13CDE;EGYPTIAN HIEROGLYPH-13CDE;Lo;0;L;;;;;N;;;;; +13CDF;EGYPTIAN HIEROGLYPH-13CDF;Lo;0;L;;;;;N;;;;; +13CE0;EGYPTIAN HIEROGLYPH-13CE0;Lo;0;L;;;;;N;;;;; +13CE1;EGYPTIAN HIEROGLYPH-13CE1;Lo;0;L;;;;;N;;;;; +13CE2;EGYPTIAN HIEROGLYPH-13CE2;Lo;0;L;;;;;N;;;;; +13CE3;EGYPTIAN HIEROGLYPH-13CE3;Lo;0;L;;;;;N;;;;; +13CE4;EGYPTIAN HIEROGLYPH-13CE4;Lo;0;L;;;;;N;;;;; +13CE5;EGYPTIAN HIEROGLYPH-13CE5;Lo;0;L;;;;;N;;;;; +13CE6;EGYPTIAN HIEROGLYPH-13CE6;Lo;0;L;;;;;N;;;;; +13CE7;EGYPTIAN HIEROGLYPH-13CE7;Lo;0;L;;;;;N;;;;; +13CE8;EGYPTIAN HIEROGLYPH-13CE8;Lo;0;L;;;;;N;;;;; +13CE9;EGYPTIAN HIEROGLYPH-13CE9;Lo;0;L;;;;;N;;;;; +13CEA;EGYPTIAN HIEROGLYPH-13CEA;Lo;0;L;;;;;N;;;;; +13CEB;EGYPTIAN HIEROGLYPH-13CEB;Lo;0;L;;;;;N;;;;; +13CEC;EGYPTIAN HIEROGLYPH-13CEC;Lo;0;L;;;;;N;;;;; +13CED;EGYPTIAN HIEROGLYPH-13CED;Lo;0;L;;;;;N;;;;; +13CEE;EGYPTIAN HIEROGLYPH-13CEE;Lo;0;L;;;;;N;;;;; +13CEF;EGYPTIAN HIEROGLYPH-13CEF;Lo;0;L;;;;;N;;;;; +13CF0;EGYPTIAN HIEROGLYPH-13CF0;Lo;0;L;;;;;N;;;;; +13CF1;EGYPTIAN HIEROGLYPH-13CF1;Lo;0;L;;;;;N;;;;; +13CF2;EGYPTIAN HIEROGLYPH-13CF2;Lo;0;L;;;;;N;;;;; +13CF3;EGYPTIAN HIEROGLYPH-13CF3;Lo;0;L;;;;;N;;;;; +13CF4;EGYPTIAN HIEROGLYPH-13CF4;Lo;0;L;;;;;N;;;;; +13CF5;EGYPTIAN HIEROGLYPH-13CF5;Lo;0;L;;;;;N;;;;; +13CF6;EGYPTIAN HIEROGLYPH-13CF6;Lo;0;L;;;;;N;;;;; +13CF7;EGYPTIAN HIEROGLYPH-13CF7;Lo;0;L;;;;;N;;;;; +13CF8;EGYPTIAN HIEROGLYPH-13CF8;Lo;0;L;;;;;N;;;;; +13CF9;EGYPTIAN HIEROGLYPH-13CF9;Lo;0;L;;;;;N;;;;; +13CFA;EGYPTIAN HIEROGLYPH-13CFA;Lo;0;L;;;;;N;;;;; +13CFB;EGYPTIAN HIEROGLYPH-13CFB;Lo;0;L;;;;;N;;;;; +13CFC;EGYPTIAN HIEROGLYPH-13CFC;Lo;0;L;;;;;N;;;;; +13CFD;EGYPTIAN HIEROGLYPH-13CFD;Lo;0;L;;;;;N;;;;; +13CFE;EGYPTIAN HIEROGLYPH-13CFE;Lo;0;L;;;;;N;;;;; +13CFF;EGYPTIAN HIEROGLYPH-13CFF;Lo;0;L;;;;;N;;;;; +13D00;EGYPTIAN HIEROGLYPH-13D00;Lo;0;L;;;;;N;;;;; +13D01;EGYPTIAN HIEROGLYPH-13D01;Lo;0;L;;;;;N;;;;; +13D02;EGYPTIAN HIEROGLYPH-13D02;Lo;0;L;;;;;N;;;;; +13D03;EGYPTIAN HIEROGLYPH-13D03;Lo;0;L;;;;;N;;;;; +13D04;EGYPTIAN HIEROGLYPH-13D04;Lo;0;L;;;;;N;;;;; +13D05;EGYPTIAN HIEROGLYPH-13D05;Lo;0;L;;;;;N;;;;; +13D06;EGYPTIAN HIEROGLYPH-13D06;Lo;0;L;;;;;N;;;;; +13D07;EGYPTIAN HIEROGLYPH-13D07;Lo;0;L;;;;;N;;;;; +13D08;EGYPTIAN HIEROGLYPH-13D08;Lo;0;L;;;;;N;;;;; +13D09;EGYPTIAN HIEROGLYPH-13D09;Lo;0;L;;;;;N;;;;; +13D0A;EGYPTIAN HIEROGLYPH-13D0A;Lo;0;L;;;;;N;;;;; +13D0B;EGYPTIAN HIEROGLYPH-13D0B;Lo;0;L;;;;;N;;;;; +13D0C;EGYPTIAN HIEROGLYPH-13D0C;Lo;0;L;;;;;N;;;;; +13D0D;EGYPTIAN HIEROGLYPH-13D0D;Lo;0;L;;;;;N;;;;; +13D0E;EGYPTIAN HIEROGLYPH-13D0E;Lo;0;L;;;;;N;;;;; +13D0F;EGYPTIAN HIEROGLYPH-13D0F;Lo;0;L;;;;;N;;;;; +13D10;EGYPTIAN HIEROGLYPH-13D10;Lo;0;L;;;;;N;;;;; +13D11;EGYPTIAN HIEROGLYPH-13D11;Lo;0;L;;;;;N;;;;; +13D12;EGYPTIAN HIEROGLYPH-13D12;Lo;0;L;;;;;N;;;;; +13D13;EGYPTIAN HIEROGLYPH-13D13;Lo;0;L;;;;;N;;;;; +13D14;EGYPTIAN HIEROGLYPH-13D14;Lo;0;L;;;;;N;;;;; +13D15;EGYPTIAN HIEROGLYPH-13D15;Lo;0;L;;;;;N;;;;; +13D16;EGYPTIAN HIEROGLYPH-13D16;Lo;0;L;;;;;N;;;;; +13D17;EGYPTIAN HIEROGLYPH-13D17;Lo;0;L;;;;;N;;;;; +13D18;EGYPTIAN HIEROGLYPH-13D18;Lo;0;L;;;;;N;;;;; +13D19;EGYPTIAN HIEROGLYPH-13D19;Lo;0;L;;;;;N;;;;; +13D1A;EGYPTIAN HIEROGLYPH-13D1A;Lo;0;L;;;;;N;;;;; +13D1B;EGYPTIAN HIEROGLYPH-13D1B;Lo;0;L;;;;;N;;;;; +13D1C;EGYPTIAN HIEROGLYPH-13D1C;Lo;0;L;;;;;N;;;;; +13D1D;EGYPTIAN HIEROGLYPH-13D1D;Lo;0;L;;;;;N;;;;; +13D1E;EGYPTIAN HIEROGLYPH-13D1E;Lo;0;L;;;;;N;;;;; +13D1F;EGYPTIAN HIEROGLYPH-13D1F;Lo;0;L;;;;;N;;;;; +13D20;EGYPTIAN HIEROGLYPH-13D20;Lo;0;L;;;;;N;;;;; +13D21;EGYPTIAN HIEROGLYPH-13D21;Lo;0;L;;;;;N;;;;; +13D22;EGYPTIAN HIEROGLYPH-13D22;Lo;0;L;;;;;N;;;;; +13D23;EGYPTIAN HIEROGLYPH-13D23;Lo;0;L;;;;;N;;;;; +13D24;EGYPTIAN HIEROGLYPH-13D24;Lo;0;L;;;;;N;;;;; +13D25;EGYPTIAN HIEROGLYPH-13D25;Lo;0;L;;;;;N;;;;; +13D26;EGYPTIAN HIEROGLYPH-13D26;Lo;0;L;;;;;N;;;;; +13D27;EGYPTIAN HIEROGLYPH-13D27;Lo;0;L;;;;;N;;;;; +13D28;EGYPTIAN HIEROGLYPH-13D28;Lo;0;L;;;;;N;;;;; +13D29;EGYPTIAN HIEROGLYPH-13D29;Lo;0;L;;;;;N;;;;; +13D2A;EGYPTIAN HIEROGLYPH-13D2A;Lo;0;L;;;;;N;;;;; +13D2B;EGYPTIAN HIEROGLYPH-13D2B;Lo;0;L;;;;;N;;;;; +13D2C;EGYPTIAN HIEROGLYPH-13D2C;Lo;0;L;;;;;N;;;;; +13D2D;EGYPTIAN HIEROGLYPH-13D2D;Lo;0;L;;;;;N;;;;; +13D2E;EGYPTIAN HIEROGLYPH-13D2E;Lo;0;L;;;;;N;;;;; +13D2F;EGYPTIAN HIEROGLYPH-13D2F;Lo;0;L;;;;;N;;;;; +13D30;EGYPTIAN HIEROGLYPH-13D30;Lo;0;L;;;;;N;;;;; +13D31;EGYPTIAN HIEROGLYPH-13D31;Lo;0;L;;;;;N;;;;; +13D32;EGYPTIAN HIEROGLYPH-13D32;Lo;0;L;;;;;N;;;;; +13D33;EGYPTIAN HIEROGLYPH-13D33;Lo;0;L;;;;;N;;;;; +13D34;EGYPTIAN HIEROGLYPH-13D34;Lo;0;L;;;;;N;;;;; +13D35;EGYPTIAN HIEROGLYPH-13D35;Lo;0;L;;;;;N;;;;; +13D36;EGYPTIAN HIEROGLYPH-13D36;Lo;0;L;;;;;N;;;;; +13D37;EGYPTIAN HIEROGLYPH-13D37;Lo;0;L;;;;;N;;;;; +13D38;EGYPTIAN HIEROGLYPH-13D38;Lo;0;L;;;;;N;;;;; +13D39;EGYPTIAN HIEROGLYPH-13D39;Lo;0;L;;;;;N;;;;; +13D3A;EGYPTIAN HIEROGLYPH-13D3A;Lo;0;L;;;;;N;;;;; +13D3B;EGYPTIAN HIEROGLYPH-13D3B;Lo;0;L;;;;;N;;;;; +13D3C;EGYPTIAN HIEROGLYPH-13D3C;Lo;0;L;;;;;N;;;;; +13D3D;EGYPTIAN HIEROGLYPH-13D3D;Lo;0;L;;;;;N;;;;; +13D3E;EGYPTIAN HIEROGLYPH-13D3E;Lo;0;L;;;;;N;;;;; +13D3F;EGYPTIAN HIEROGLYPH-13D3F;Lo;0;L;;;;;N;;;;; +13D40;EGYPTIAN HIEROGLYPH-13D40;Lo;0;L;;;;;N;;;;; +13D41;EGYPTIAN HIEROGLYPH-13D41;Lo;0;L;;;;;N;;;;; +13D42;EGYPTIAN HIEROGLYPH-13D42;Lo;0;L;;;;;N;;;;; +13D43;EGYPTIAN HIEROGLYPH-13D43;Lo;0;L;;;;;N;;;;; +13D44;EGYPTIAN HIEROGLYPH-13D44;Lo;0;L;;;;;N;;;;; +13D45;EGYPTIAN HIEROGLYPH-13D45;Lo;0;L;;;;;N;;;;; +13D46;EGYPTIAN HIEROGLYPH-13D46;Lo;0;L;;;;;N;;;;; +13D47;EGYPTIAN HIEROGLYPH-13D47;Lo;0;L;;;;;N;;;;; +13D48;EGYPTIAN HIEROGLYPH-13D48;Lo;0;L;;;;;N;;;;; +13D49;EGYPTIAN HIEROGLYPH-13D49;Lo;0;L;;;;;N;;;;; +13D4A;EGYPTIAN HIEROGLYPH-13D4A;Lo;0;L;;;;;N;;;;; +13D4B;EGYPTIAN HIEROGLYPH-13D4B;Lo;0;L;;;;;N;;;;; +13D4C;EGYPTIAN HIEROGLYPH-13D4C;Lo;0;L;;;;;N;;;;; +13D4D;EGYPTIAN HIEROGLYPH-13D4D;Lo;0;L;;;;;N;;;;; +13D4E;EGYPTIAN HIEROGLYPH-13D4E;Lo;0;L;;;;;N;;;;; +13D4F;EGYPTIAN HIEROGLYPH-13D4F;Lo;0;L;;;;;N;;;;; +13D50;EGYPTIAN HIEROGLYPH-13D50;Lo;0;L;;;;;N;;;;; +13D51;EGYPTIAN HIEROGLYPH-13D51;Lo;0;L;;;;;N;;;;; +13D52;EGYPTIAN HIEROGLYPH-13D52;Lo;0;L;;;;;N;;;;; +13D53;EGYPTIAN HIEROGLYPH-13D53;Lo;0;L;;;;;N;;;;; +13D54;EGYPTIAN HIEROGLYPH-13D54;Lo;0;L;;;;;N;;;;; +13D55;EGYPTIAN HIEROGLYPH-13D55;Lo;0;L;;;;;N;;;;; +13D56;EGYPTIAN HIEROGLYPH-13D56;Lo;0;L;;;;;N;;;;; +13D57;EGYPTIAN HIEROGLYPH-13D57;Lo;0;L;;;;;N;;;;; +13D58;EGYPTIAN HIEROGLYPH-13D58;Lo;0;L;;;;;N;;;;; +13D59;EGYPTIAN HIEROGLYPH-13D59;Lo;0;L;;;;;N;;;;; +13D5A;EGYPTIAN HIEROGLYPH-13D5A;Lo;0;L;;;;;N;;;;; +13D5B;EGYPTIAN HIEROGLYPH-13D5B;Lo;0;L;;;;;N;;;;; +13D5C;EGYPTIAN HIEROGLYPH-13D5C;Lo;0;L;;;;;N;;;;; +13D5D;EGYPTIAN HIEROGLYPH-13D5D;Lo;0;L;;;;;N;;;;; +13D5E;EGYPTIAN HIEROGLYPH-13D5E;Lo;0;L;;;;;N;;;;; +13D5F;EGYPTIAN HIEROGLYPH-13D5F;Lo;0;L;;;;;N;;;;; +13D60;EGYPTIAN HIEROGLYPH-13D60;Lo;0;L;;;;;N;;;;; +13D61;EGYPTIAN HIEROGLYPH-13D61;Lo;0;L;;;;;N;;;;; +13D62;EGYPTIAN HIEROGLYPH-13D62;Lo;0;L;;;;;N;;;;; +13D63;EGYPTIAN HIEROGLYPH-13D63;Lo;0;L;;;;;N;;;;; +13D64;EGYPTIAN HIEROGLYPH-13D64;Lo;0;L;;;;;N;;;;; +13D65;EGYPTIAN HIEROGLYPH-13D65;Lo;0;L;;;;;N;;;;; +13D66;EGYPTIAN HIEROGLYPH-13D66;Lo;0;L;;;;;N;;;;; +13D67;EGYPTIAN HIEROGLYPH-13D67;Lo;0;L;;;;;N;;;;; +13D68;EGYPTIAN HIEROGLYPH-13D68;Lo;0;L;;;;;N;;;;; +13D69;EGYPTIAN HIEROGLYPH-13D69;Lo;0;L;;;;;N;;;;; +13D6A;EGYPTIAN HIEROGLYPH-13D6A;Lo;0;L;;;;;N;;;;; +13D6B;EGYPTIAN HIEROGLYPH-13D6B;Lo;0;L;;;;;N;;;;; +13D6C;EGYPTIAN HIEROGLYPH-13D6C;Lo;0;L;;;;;N;;;;; +13D6D;EGYPTIAN HIEROGLYPH-13D6D;Lo;0;L;;;;;N;;;;; +13D6E;EGYPTIAN HIEROGLYPH-13D6E;Lo;0;L;;;;;N;;;;; +13D6F;EGYPTIAN HIEROGLYPH-13D6F;Lo;0;L;;;;;N;;;;; +13D70;EGYPTIAN HIEROGLYPH-13D70;Lo;0;L;;;;;N;;;;; +13D71;EGYPTIAN HIEROGLYPH-13D71;Lo;0;L;;;;;N;;;;; +13D72;EGYPTIAN HIEROGLYPH-13D72;Lo;0;L;;;;;N;;;;; +13D73;EGYPTIAN HIEROGLYPH-13D73;Lo;0;L;;;;;N;;;;; +13D74;EGYPTIAN HIEROGLYPH-13D74;Lo;0;L;;;;;N;;;;; +13D75;EGYPTIAN HIEROGLYPH-13D75;Lo;0;L;;;;;N;;;;; +13D76;EGYPTIAN HIEROGLYPH-13D76;Lo;0;L;;;;;N;;;;; +13D77;EGYPTIAN HIEROGLYPH-13D77;Lo;0;L;;;;;N;;;;; +13D78;EGYPTIAN HIEROGLYPH-13D78;Lo;0;L;;;;;N;;;;; +13D79;EGYPTIAN HIEROGLYPH-13D79;Lo;0;L;;;;;N;;;;; +13D7A;EGYPTIAN HIEROGLYPH-13D7A;Lo;0;L;;;;;N;;;;; +13D7B;EGYPTIAN HIEROGLYPH-13D7B;Lo;0;L;;;;;N;;;;; +13D7C;EGYPTIAN HIEROGLYPH-13D7C;Lo;0;L;;;;;N;;;;; +13D7D;EGYPTIAN HIEROGLYPH-13D7D;Lo;0;L;;;;;N;;;;; +13D7E;EGYPTIAN HIEROGLYPH-13D7E;Lo;0;L;;;;;N;;;;; +13D7F;EGYPTIAN HIEROGLYPH-13D7F;Lo;0;L;;;;;N;;;;; +13D80;EGYPTIAN HIEROGLYPH-13D80;Lo;0;L;;;;;N;;;;; +13D81;EGYPTIAN HIEROGLYPH-13D81;Lo;0;L;;;;;N;;;;; +13D82;EGYPTIAN HIEROGLYPH-13D82;Lo;0;L;;;;;N;;;;; +13D83;EGYPTIAN HIEROGLYPH-13D83;Lo;0;L;;;;;N;;;;; +13D84;EGYPTIAN HIEROGLYPH-13D84;Lo;0;L;;;;;N;;;;; +13D85;EGYPTIAN HIEROGLYPH-13D85;Lo;0;L;;;;;N;;;;; +13D86;EGYPTIAN HIEROGLYPH-13D86;Lo;0;L;;;;;N;;;;; +13D87;EGYPTIAN HIEROGLYPH-13D87;Lo;0;L;;;;;N;;;;; +13D88;EGYPTIAN HIEROGLYPH-13D88;Lo;0;L;;;;;N;;;;; +13D89;EGYPTIAN HIEROGLYPH-13D89;Lo;0;L;;;;;N;;;;; +13D8A;EGYPTIAN HIEROGLYPH-13D8A;Lo;0;L;;;;;N;;;;; +13D8B;EGYPTIAN HIEROGLYPH-13D8B;Lo;0;L;;;;;N;;;;; +13D8C;EGYPTIAN HIEROGLYPH-13D8C;Lo;0;L;;;;;N;;;;; +13D8D;EGYPTIAN HIEROGLYPH-13D8D;Lo;0;L;;;;;N;;;;; +13D8E;EGYPTIAN HIEROGLYPH-13D8E;Lo;0;L;;;;;N;;;;; +13D8F;EGYPTIAN HIEROGLYPH-13D8F;Lo;0;L;;;;;N;;;;; +13D90;EGYPTIAN HIEROGLYPH-13D90;Lo;0;L;;;;;N;;;;; +13D91;EGYPTIAN HIEROGLYPH-13D91;Lo;0;L;;;;;N;;;;; +13D92;EGYPTIAN HIEROGLYPH-13D92;Lo;0;L;;;;;N;;;;; +13D93;EGYPTIAN HIEROGLYPH-13D93;Lo;0;L;;;;;N;;;;; +13D94;EGYPTIAN HIEROGLYPH-13D94;Lo;0;L;;;;;N;;;;; +13D95;EGYPTIAN HIEROGLYPH-13D95;Lo;0;L;;;;;N;;;;; +13D96;EGYPTIAN HIEROGLYPH-13D96;Lo;0;L;;;;;N;;;;; +13D97;EGYPTIAN HIEROGLYPH-13D97;Lo;0;L;;;;;N;;;;; +13D98;EGYPTIAN HIEROGLYPH-13D98;Lo;0;L;;;;;N;;;;; +13D99;EGYPTIAN HIEROGLYPH-13D99;Lo;0;L;;;;;N;;;;; +13D9A;EGYPTIAN HIEROGLYPH-13D9A;Lo;0;L;;;;;N;;;;; +13D9B;EGYPTIAN HIEROGLYPH-13D9B;Lo;0;L;;;;;N;;;;; +13D9C;EGYPTIAN HIEROGLYPH-13D9C;Lo;0;L;;;;;N;;;;; +13D9D;EGYPTIAN HIEROGLYPH-13D9D;Lo;0;L;;;;;N;;;;; +13D9E;EGYPTIAN HIEROGLYPH-13D9E;Lo;0;L;;;;;N;;;;; +13D9F;EGYPTIAN HIEROGLYPH-13D9F;Lo;0;L;;;;;N;;;;; +13DA0;EGYPTIAN HIEROGLYPH-13DA0;Lo;0;L;;;;;N;;;;; +13DA1;EGYPTIAN HIEROGLYPH-13DA1;Lo;0;L;;;;;N;;;;; +13DA2;EGYPTIAN HIEROGLYPH-13DA2;Lo;0;L;;;;;N;;;;; +13DA3;EGYPTIAN HIEROGLYPH-13DA3;Lo;0;L;;;;;N;;;;; +13DA4;EGYPTIAN HIEROGLYPH-13DA4;Lo;0;L;;;;;N;;;;; +13DA5;EGYPTIAN HIEROGLYPH-13DA5;Lo;0;L;;;;;N;;;;; +13DA6;EGYPTIAN HIEROGLYPH-13DA6;Lo;0;L;;;;;N;;;;; +13DA7;EGYPTIAN HIEROGLYPH-13DA7;Lo;0;L;;;;;N;;;;; +13DA8;EGYPTIAN HIEROGLYPH-13DA8;Lo;0;L;;;;;N;;;;; +13DA9;EGYPTIAN HIEROGLYPH-13DA9;Lo;0;L;;;;;N;;;;; +13DAA;EGYPTIAN HIEROGLYPH-13DAA;Lo;0;L;;;;;N;;;;; +13DAB;EGYPTIAN HIEROGLYPH-13DAB;Lo;0;L;;;;;N;;;;; +13DAC;EGYPTIAN HIEROGLYPH-13DAC;Lo;0;L;;;;;N;;;;; +13DAD;EGYPTIAN HIEROGLYPH-13DAD;Lo;0;L;;;;;N;;;;; +13DAE;EGYPTIAN HIEROGLYPH-13DAE;Lo;0;L;;;;;N;;;;; +13DAF;EGYPTIAN HIEROGLYPH-13DAF;Lo;0;L;;;;;N;;;;; +13DB0;EGYPTIAN HIEROGLYPH-13DB0;Lo;0;L;;;;;N;;;;; +13DB1;EGYPTIAN HIEROGLYPH-13DB1;Lo;0;L;;;;;N;;;;; +13DB2;EGYPTIAN HIEROGLYPH-13DB2;Lo;0;L;;;;;N;;;;; +13DB3;EGYPTIAN HIEROGLYPH-13DB3;Lo;0;L;;;;;N;;;;; +13DB4;EGYPTIAN HIEROGLYPH-13DB4;Lo;0;L;;;;;N;;;;; +13DB5;EGYPTIAN HIEROGLYPH-13DB5;Lo;0;L;;;;;N;;;;; +13DB6;EGYPTIAN HIEROGLYPH-13DB6;Lo;0;L;;;;;N;;;;; +13DB7;EGYPTIAN HIEROGLYPH-13DB7;Lo;0;L;;;;;N;;;;; +13DB8;EGYPTIAN HIEROGLYPH-13DB8;Lo;0;L;;;;;N;;;;; +13DB9;EGYPTIAN HIEROGLYPH-13DB9;Lo;0;L;;;;;N;;;;; +13DBA;EGYPTIAN HIEROGLYPH-13DBA;Lo;0;L;;;;;N;;;;; +13DBB;EGYPTIAN HIEROGLYPH-13DBB;Lo;0;L;;;;;N;;;;; +13DBC;EGYPTIAN HIEROGLYPH-13DBC;Lo;0;L;;;;;N;;;;; +13DBD;EGYPTIAN HIEROGLYPH-13DBD;Lo;0;L;;;;;N;;;;; +13DBE;EGYPTIAN HIEROGLYPH-13DBE;Lo;0;L;;;;;N;;;;; +13DBF;EGYPTIAN HIEROGLYPH-13DBF;Lo;0;L;;;;;N;;;;; +13DC0;EGYPTIAN HIEROGLYPH-13DC0;Lo;0;L;;;;;N;;;;; +13DC1;EGYPTIAN HIEROGLYPH-13DC1;Lo;0;L;;;;;N;;;;; +13DC2;EGYPTIAN HIEROGLYPH-13DC2;Lo;0;L;;;;;N;;;;; +13DC3;EGYPTIAN HIEROGLYPH-13DC3;Lo;0;L;;;;;N;;;;; +13DC4;EGYPTIAN HIEROGLYPH-13DC4;Lo;0;L;;;;;N;;;;; +13DC5;EGYPTIAN HIEROGLYPH-13DC5;Lo;0;L;;;;;N;;;;; +13DC6;EGYPTIAN HIEROGLYPH-13DC6;Lo;0;L;;;;;N;;;;; +13DC7;EGYPTIAN HIEROGLYPH-13DC7;Lo;0;L;;;;;N;;;;; +13DC8;EGYPTIAN HIEROGLYPH-13DC8;Lo;0;L;;;;;N;;;;; +13DC9;EGYPTIAN HIEROGLYPH-13DC9;Lo;0;L;;;;;N;;;;; +13DCA;EGYPTIAN HIEROGLYPH-13DCA;Lo;0;L;;;;;N;;;;; +13DCB;EGYPTIAN HIEROGLYPH-13DCB;Lo;0;L;;;;;N;;;;; +13DCC;EGYPTIAN HIEROGLYPH-13DCC;Lo;0;L;;;;;N;;;;; +13DCD;EGYPTIAN HIEROGLYPH-13DCD;Lo;0;L;;;;;N;;;;; +13DCE;EGYPTIAN HIEROGLYPH-13DCE;Lo;0;L;;;;;N;;;;; +13DCF;EGYPTIAN HIEROGLYPH-13DCF;Lo;0;L;;;;;N;;;;; +13DD0;EGYPTIAN HIEROGLYPH-13DD0;Lo;0;L;;;;;N;;;;; +13DD1;EGYPTIAN HIEROGLYPH-13DD1;Lo;0;L;;;;;N;;;;; +13DD2;EGYPTIAN HIEROGLYPH-13DD2;Lo;0;L;;;;;N;;;;; +13DD3;EGYPTIAN HIEROGLYPH-13DD3;Lo;0;L;;;;;N;;;;; +13DD4;EGYPTIAN HIEROGLYPH-13DD4;Lo;0;L;;;;;N;;;;; +13DD5;EGYPTIAN HIEROGLYPH-13DD5;Lo;0;L;;;;;N;;;;; +13DD6;EGYPTIAN HIEROGLYPH-13DD6;Lo;0;L;;;;;N;;;;; +13DD7;EGYPTIAN HIEROGLYPH-13DD7;Lo;0;L;;;;;N;;;;; +13DD8;EGYPTIAN HIEROGLYPH-13DD8;Lo;0;L;;;;;N;;;;; +13DD9;EGYPTIAN HIEROGLYPH-13DD9;Lo;0;L;;;;;N;;;;; +13DDA;EGYPTIAN HIEROGLYPH-13DDA;Lo;0;L;;;;;N;;;;; +13DDB;EGYPTIAN HIEROGLYPH-13DDB;Lo;0;L;;;;;N;;;;; +13DDC;EGYPTIAN HIEROGLYPH-13DDC;Lo;0;L;;;;;N;;;;; +13DDD;EGYPTIAN HIEROGLYPH-13DDD;Lo;0;L;;;;;N;;;;; +13DDE;EGYPTIAN HIEROGLYPH-13DDE;Lo;0;L;;;;;N;;;;; +13DDF;EGYPTIAN HIEROGLYPH-13DDF;Lo;0;L;;;;;N;;;;; +13DE0;EGYPTIAN HIEROGLYPH-13DE0;Lo;0;L;;;;;N;;;;; +13DE1;EGYPTIAN HIEROGLYPH-13DE1;Lo;0;L;;;;;N;;;;; +13DE2;EGYPTIAN HIEROGLYPH-13DE2;Lo;0;L;;;;;N;;;;; +13DE3;EGYPTIAN HIEROGLYPH-13DE3;Lo;0;L;;;;;N;;;;; +13DE4;EGYPTIAN HIEROGLYPH-13DE4;Lo;0;L;;;;;N;;;;; +13DE5;EGYPTIAN HIEROGLYPH-13DE5;Lo;0;L;;;;;N;;;;; +13DE6;EGYPTIAN HIEROGLYPH-13DE6;Lo;0;L;;;;;N;;;;; +13DE7;EGYPTIAN HIEROGLYPH-13DE7;Lo;0;L;;;;;N;;;;; +13DE8;EGYPTIAN HIEROGLYPH-13DE8;Lo;0;L;;;;;N;;;;; +13DE9;EGYPTIAN HIEROGLYPH-13DE9;Lo;0;L;;;;;N;;;;; +13DEA;EGYPTIAN HIEROGLYPH-13DEA;Lo;0;L;;;;;N;;;;; +13DEB;EGYPTIAN HIEROGLYPH-13DEB;Lo;0;L;;;;;N;;;;; +13DEC;EGYPTIAN HIEROGLYPH-13DEC;Lo;0;L;;;;;N;;;;; +13DED;EGYPTIAN HIEROGLYPH-13DED;Lo;0;L;;;;;N;;;;; +13DEE;EGYPTIAN HIEROGLYPH-13DEE;Lo;0;L;;;;;N;;;;; +13DEF;EGYPTIAN HIEROGLYPH-13DEF;Lo;0;L;;;;;N;;;;; +13DF0;EGYPTIAN HIEROGLYPH-13DF0;Lo;0;L;;;;;N;;;;; +13DF1;EGYPTIAN HIEROGLYPH-13DF1;Lo;0;L;;;;;N;;;;; +13DF2;EGYPTIAN HIEROGLYPH-13DF2;Lo;0;L;;;;;N;;;;; +13DF3;EGYPTIAN HIEROGLYPH-13DF3;Lo;0;L;;;;;N;;;;; +13DF4;EGYPTIAN HIEROGLYPH-13DF4;Lo;0;L;;;;;N;;;;; +13DF5;EGYPTIAN HIEROGLYPH-13DF5;Lo;0;L;;;;;N;;;;; +13DF6;EGYPTIAN HIEROGLYPH-13DF6;Lo;0;L;;;;;N;;;;; +13DF7;EGYPTIAN HIEROGLYPH-13DF7;Lo;0;L;;;;;N;;;;; +13DF8;EGYPTIAN HIEROGLYPH-13DF8;Lo;0;L;;;;;N;;;;; +13DF9;EGYPTIAN HIEROGLYPH-13DF9;Lo;0;L;;;;;N;;;;; +13DFA;EGYPTIAN HIEROGLYPH-13DFA;Lo;0;L;;;;;N;;;;; +13DFB;EGYPTIAN HIEROGLYPH-13DFB;Lo;0;L;;;;;N;;;;; +13DFC;EGYPTIAN HIEROGLYPH-13DFC;Lo;0;L;;;;;N;;;;; +13DFD;EGYPTIAN HIEROGLYPH-13DFD;Lo;0;L;;;;;N;;;;; +13DFE;EGYPTIAN HIEROGLYPH-13DFE;Lo;0;L;;;;;N;;;;; +13DFF;EGYPTIAN HIEROGLYPH-13DFF;Lo;0;L;;;;;N;;;;; +13E00;EGYPTIAN HIEROGLYPH-13E00;Lo;0;L;;;;;N;;;;; +13E01;EGYPTIAN HIEROGLYPH-13E01;Lo;0;L;;;;;N;;;;; +13E02;EGYPTIAN HIEROGLYPH-13E02;Lo;0;L;;;;;N;;;;; +13E03;EGYPTIAN HIEROGLYPH-13E03;Lo;0;L;;;;;N;;;;; +13E04;EGYPTIAN HIEROGLYPH-13E04;Lo;0;L;;;;;N;;;;; +13E05;EGYPTIAN HIEROGLYPH-13E05;Lo;0;L;;;;;N;;;;; +13E06;EGYPTIAN HIEROGLYPH-13E06;Lo;0;L;;;;;N;;;;; +13E07;EGYPTIAN HIEROGLYPH-13E07;Lo;0;L;;;;;N;;;;; +13E08;EGYPTIAN HIEROGLYPH-13E08;Lo;0;L;;;;;N;;;;; +13E09;EGYPTIAN HIEROGLYPH-13E09;Lo;0;L;;;;;N;;;;; +13E0A;EGYPTIAN HIEROGLYPH-13E0A;Lo;0;L;;;;;N;;;;; +13E0B;EGYPTIAN HIEROGLYPH-13E0B;Lo;0;L;;;;;N;;;;; +13E0C;EGYPTIAN HIEROGLYPH-13E0C;Lo;0;L;;;;;N;;;;; +13E0D;EGYPTIAN HIEROGLYPH-13E0D;Lo;0;L;;;;;N;;;;; +13E0E;EGYPTIAN HIEROGLYPH-13E0E;Lo;0;L;;;;;N;;;;; +13E0F;EGYPTIAN HIEROGLYPH-13E0F;Lo;0;L;;;;;N;;;;; +13E10;EGYPTIAN HIEROGLYPH-13E10;Lo;0;L;;;;;N;;;;; +13E11;EGYPTIAN HIEROGLYPH-13E11;Lo;0;L;;;;;N;;;;; +13E12;EGYPTIAN HIEROGLYPH-13E12;Lo;0;L;;;;;N;;;;; +13E13;EGYPTIAN HIEROGLYPH-13E13;Lo;0;L;;;;;N;;;;; +13E14;EGYPTIAN HIEROGLYPH-13E14;Lo;0;L;;;;;N;;;;; +13E15;EGYPTIAN HIEROGLYPH-13E15;Lo;0;L;;;;;N;;;;; +13E16;EGYPTIAN HIEROGLYPH-13E16;Lo;0;L;;;;;N;;;;; +13E17;EGYPTIAN HIEROGLYPH-13E17;Lo;0;L;;;;;N;;;;; +13E18;EGYPTIAN HIEROGLYPH-13E18;Lo;0;L;;;;;N;;;;; +13E19;EGYPTIAN HIEROGLYPH-13E19;Lo;0;L;;;;;N;;;;; +13E1A;EGYPTIAN HIEROGLYPH-13E1A;Lo;0;L;;;;;N;;;;; +13E1B;EGYPTIAN HIEROGLYPH-13E1B;Lo;0;L;;;;;N;;;;; +13E1C;EGYPTIAN HIEROGLYPH-13E1C;Lo;0;L;;;;;N;;;;; +13E1D;EGYPTIAN HIEROGLYPH-13E1D;Lo;0;L;;;;;N;;;;; +13E1E;EGYPTIAN HIEROGLYPH-13E1E;Lo;0;L;;;;;N;;;;; +13E1F;EGYPTIAN HIEROGLYPH-13E1F;Lo;0;L;;;;;N;;;;; +13E20;EGYPTIAN HIEROGLYPH-13E20;Lo;0;L;;;;;N;;;;; +13E21;EGYPTIAN HIEROGLYPH-13E21;Lo;0;L;;;;;N;;;;; +13E22;EGYPTIAN HIEROGLYPH-13E22;Lo;0;L;;;;;N;;;;; +13E23;EGYPTIAN HIEROGLYPH-13E23;Lo;0;L;;;;;N;;;;; +13E24;EGYPTIAN HIEROGLYPH-13E24;Lo;0;L;;;;;N;;;;; +13E25;EGYPTIAN HIEROGLYPH-13E25;Lo;0;L;;;;;N;;;;; +13E26;EGYPTIAN HIEROGLYPH-13E26;Lo;0;L;;;;;N;;;;; +13E27;EGYPTIAN HIEROGLYPH-13E27;Lo;0;L;;;;;N;;;;; +13E28;EGYPTIAN HIEROGLYPH-13E28;Lo;0;L;;;;;N;;;;; +13E29;EGYPTIAN HIEROGLYPH-13E29;Lo;0;L;;;;;N;;;;; +13E2A;EGYPTIAN HIEROGLYPH-13E2A;Lo;0;L;;;;;N;;;;; +13E2B;EGYPTIAN HIEROGLYPH-13E2B;Lo;0;L;;;;;N;;;;; +13E2C;EGYPTIAN HIEROGLYPH-13E2C;Lo;0;L;;;;;N;;;;; +13E2D;EGYPTIAN HIEROGLYPH-13E2D;Lo;0;L;;;;;N;;;;; +13E2E;EGYPTIAN HIEROGLYPH-13E2E;Lo;0;L;;;;;N;;;;; +13E2F;EGYPTIAN HIEROGLYPH-13E2F;Lo;0;L;;;;;N;;;;; +13E30;EGYPTIAN HIEROGLYPH-13E30;Lo;0;L;;;;;N;;;;; +13E31;EGYPTIAN HIEROGLYPH-13E31;Lo;0;L;;;;;N;;;;; +13E32;EGYPTIAN HIEROGLYPH-13E32;Lo;0;L;;;;;N;;;;; +13E33;EGYPTIAN HIEROGLYPH-13E33;Lo;0;L;;;;;N;;;;; +13E34;EGYPTIAN HIEROGLYPH-13E34;Lo;0;L;;;;;N;;;;; +13E35;EGYPTIAN HIEROGLYPH-13E35;Lo;0;L;;;;;N;;;;; +13E36;EGYPTIAN HIEROGLYPH-13E36;Lo;0;L;;;;;N;;;;; +13E37;EGYPTIAN HIEROGLYPH-13E37;Lo;0;L;;;;;N;;;;; +13E38;EGYPTIAN HIEROGLYPH-13E38;Lo;0;L;;;;;N;;;;; +13E39;EGYPTIAN HIEROGLYPH-13E39;Lo;0;L;;;;;N;;;;; +13E3A;EGYPTIAN HIEROGLYPH-13E3A;Lo;0;L;;;;;N;;;;; +13E3B;EGYPTIAN HIEROGLYPH-13E3B;Lo;0;L;;;;;N;;;;; +13E3C;EGYPTIAN HIEROGLYPH-13E3C;Lo;0;L;;;;;N;;;;; +13E3D;EGYPTIAN HIEROGLYPH-13E3D;Lo;0;L;;;;;N;;;;; +13E3E;EGYPTIAN HIEROGLYPH-13E3E;Lo;0;L;;;;;N;;;;; +13E3F;EGYPTIAN HIEROGLYPH-13E3F;Lo;0;L;;;;;N;;;;; +13E40;EGYPTIAN HIEROGLYPH-13E40;Lo;0;L;;;;;N;;;;; +13E41;EGYPTIAN HIEROGLYPH-13E41;Lo;0;L;;;;;N;;;;; +13E42;EGYPTIAN HIEROGLYPH-13E42;Lo;0;L;;;;;N;;;;; +13E43;EGYPTIAN HIEROGLYPH-13E43;Lo;0;L;;;;;N;;;;; +13E44;EGYPTIAN HIEROGLYPH-13E44;Lo;0;L;;;;;N;;;;; +13E45;EGYPTIAN HIEROGLYPH-13E45;Lo;0;L;;;;;N;;;;; +13E46;EGYPTIAN HIEROGLYPH-13E46;Lo;0;L;;;;;N;;;;; +13E47;EGYPTIAN HIEROGLYPH-13E47;Lo;0;L;;;;;N;;;;; +13E48;EGYPTIAN HIEROGLYPH-13E48;Lo;0;L;;;;;N;;;;; +13E49;EGYPTIAN HIEROGLYPH-13E49;Lo;0;L;;;;;N;;;;; +13E4A;EGYPTIAN HIEROGLYPH-13E4A;Lo;0;L;;;;;N;;;;; +13E4B;EGYPTIAN HIEROGLYPH-13E4B;Lo;0;L;;;;;N;;;;; +13E4C;EGYPTIAN HIEROGLYPH-13E4C;Lo;0;L;;;;;N;;;;; +13E4D;EGYPTIAN HIEROGLYPH-13E4D;Lo;0;L;;;;;N;;;;; +13E4E;EGYPTIAN HIEROGLYPH-13E4E;Lo;0;L;;;;;N;;;;; +13E4F;EGYPTIAN HIEROGLYPH-13E4F;Lo;0;L;;;;;N;;;;; +13E50;EGYPTIAN HIEROGLYPH-13E50;Lo;0;L;;;;;N;;;;; +13E51;EGYPTIAN HIEROGLYPH-13E51;Lo;0;L;;;;;N;;;;; +13E52;EGYPTIAN HIEROGLYPH-13E52;Lo;0;L;;;;;N;;;;; +13E53;EGYPTIAN HIEROGLYPH-13E53;Lo;0;L;;;;;N;;;;; +13E54;EGYPTIAN HIEROGLYPH-13E54;Lo;0;L;;;;;N;;;;; +13E55;EGYPTIAN HIEROGLYPH-13E55;Lo;0;L;;;;;N;;;;; +13E56;EGYPTIAN HIEROGLYPH-13E56;Lo;0;L;;;;;N;;;;; +13E57;EGYPTIAN HIEROGLYPH-13E57;Lo;0;L;;;;;N;;;;; +13E58;EGYPTIAN HIEROGLYPH-13E58;Lo;0;L;;;;;N;;;;; +13E59;EGYPTIAN HIEROGLYPH-13E59;Lo;0;L;;;;;N;;;;; +13E5A;EGYPTIAN HIEROGLYPH-13E5A;Lo;0;L;;;;;N;;;;; +13E5B;EGYPTIAN HIEROGLYPH-13E5B;Lo;0;L;;;;;N;;;;; +13E5C;EGYPTIAN HIEROGLYPH-13E5C;Lo;0;L;;;;;N;;;;; +13E5D;EGYPTIAN HIEROGLYPH-13E5D;Lo;0;L;;;;;N;;;;; +13E5E;EGYPTIAN HIEROGLYPH-13E5E;Lo;0;L;;;;;N;;;;; +13E5F;EGYPTIAN HIEROGLYPH-13E5F;Lo;0;L;;;;;N;;;;; +13E60;EGYPTIAN HIEROGLYPH-13E60;Lo;0;L;;;;;N;;;;; +13E61;EGYPTIAN HIEROGLYPH-13E61;Lo;0;L;;;;;N;;;;; +13E62;EGYPTIAN HIEROGLYPH-13E62;Lo;0;L;;;;;N;;;;; +13E63;EGYPTIAN HIEROGLYPH-13E63;Lo;0;L;;;;;N;;;;; +13E64;EGYPTIAN HIEROGLYPH-13E64;Lo;0;L;;;;;N;;;;; +13E65;EGYPTIAN HIEROGLYPH-13E65;Lo;0;L;;;;;N;;;;; +13E66;EGYPTIAN HIEROGLYPH-13E66;Lo;0;L;;;;;N;;;;; +13E67;EGYPTIAN HIEROGLYPH-13E67;Lo;0;L;;;;;N;;;;; +13E68;EGYPTIAN HIEROGLYPH-13E68;Lo;0;L;;;;;N;;;;; +13E69;EGYPTIAN HIEROGLYPH-13E69;Lo;0;L;;;;;N;;;;; +13E6A;EGYPTIAN HIEROGLYPH-13E6A;Lo;0;L;;;;;N;;;;; +13E6B;EGYPTIAN HIEROGLYPH-13E6B;Lo;0;L;;;;;N;;;;; +13E6C;EGYPTIAN HIEROGLYPH-13E6C;Lo;0;L;;;;;N;;;;; +13E6D;EGYPTIAN HIEROGLYPH-13E6D;Lo;0;L;;;;;N;;;;; +13E6E;EGYPTIAN HIEROGLYPH-13E6E;Lo;0;L;;;;;N;;;;; +13E6F;EGYPTIAN HIEROGLYPH-13E6F;Lo;0;L;;;;;N;;;;; +13E70;EGYPTIAN HIEROGLYPH-13E70;Lo;0;L;;;;;N;;;;; +13E71;EGYPTIAN HIEROGLYPH-13E71;Lo;0;L;;;;;N;;;;; +13E72;EGYPTIAN HIEROGLYPH-13E72;Lo;0;L;;;;;N;;;;; +13E73;EGYPTIAN HIEROGLYPH-13E73;Lo;0;L;;;;;N;;;;; +13E74;EGYPTIAN HIEROGLYPH-13E74;Lo;0;L;;;;;N;;;;; +13E75;EGYPTIAN HIEROGLYPH-13E75;Lo;0;L;;;;;N;;;;; +13E76;EGYPTIAN HIEROGLYPH-13E76;Lo;0;L;;;;;N;;;;; +13E77;EGYPTIAN HIEROGLYPH-13E77;Lo;0;L;;;;;N;;;;; +13E78;EGYPTIAN HIEROGLYPH-13E78;Lo;0;L;;;;;N;;;;; +13E79;EGYPTIAN HIEROGLYPH-13E79;Lo;0;L;;;;;N;;;;; +13E7A;EGYPTIAN HIEROGLYPH-13E7A;Lo;0;L;;;;;N;;;;; +13E7B;EGYPTIAN HIEROGLYPH-13E7B;Lo;0;L;;;;;N;;;;; +13E7C;EGYPTIAN HIEROGLYPH-13E7C;Lo;0;L;;;;;N;;;;; +13E7D;EGYPTIAN HIEROGLYPH-13E7D;Lo;0;L;;;;;N;;;;; +13E7E;EGYPTIAN HIEROGLYPH-13E7E;Lo;0;L;;;;;N;;;;; +13E7F;EGYPTIAN HIEROGLYPH-13E7F;Lo;0;L;;;;;N;;;;; +13E80;EGYPTIAN HIEROGLYPH-13E80;Lo;0;L;;;;;N;;;;; +13E81;EGYPTIAN HIEROGLYPH-13E81;Lo;0;L;;;;;N;;;;; +13E82;EGYPTIAN HIEROGLYPH-13E82;Lo;0;L;;;;;N;;;;; +13E83;EGYPTIAN HIEROGLYPH-13E83;Lo;0;L;;;;;N;;;;; +13E84;EGYPTIAN HIEROGLYPH-13E84;Lo;0;L;;;;;N;;;;; +13E85;EGYPTIAN HIEROGLYPH-13E85;Lo;0;L;;;;;N;;;;; +13E86;EGYPTIAN HIEROGLYPH-13E86;Lo;0;L;;;;;N;;;;; +13E87;EGYPTIAN HIEROGLYPH-13E87;Lo;0;L;;;;;N;;;;; +13E88;EGYPTIAN HIEROGLYPH-13E88;Lo;0;L;;;;;N;;;;; +13E89;EGYPTIAN HIEROGLYPH-13E89;Lo;0;L;;;;;N;;;;; +13E8A;EGYPTIAN HIEROGLYPH-13E8A;Lo;0;L;;;;;N;;;;; +13E8B;EGYPTIAN HIEROGLYPH-13E8B;Lo;0;L;;;;;N;;;;; +13E8C;EGYPTIAN HIEROGLYPH-13E8C;Lo;0;L;;;;;N;;;;; +13E8D;EGYPTIAN HIEROGLYPH-13E8D;Lo;0;L;;;;;N;;;;; +13E8E;EGYPTIAN HIEROGLYPH-13E8E;Lo;0;L;;;;;N;;;;; +13E8F;EGYPTIAN HIEROGLYPH-13E8F;Lo;0;L;;;;;N;;;;; +13E90;EGYPTIAN HIEROGLYPH-13E90;Lo;0;L;;;;;N;;;;; +13E91;EGYPTIAN HIEROGLYPH-13E91;Lo;0;L;;;;;N;;;;; +13E92;EGYPTIAN HIEROGLYPH-13E92;Lo;0;L;;;;;N;;;;; +13E93;EGYPTIAN HIEROGLYPH-13E93;Lo;0;L;;;;;N;;;;; +13E94;EGYPTIAN HIEROGLYPH-13E94;Lo;0;L;;;;;N;;;;; +13E95;EGYPTIAN HIEROGLYPH-13E95;Lo;0;L;;;;;N;;;;; +13E96;EGYPTIAN HIEROGLYPH-13E96;Lo;0;L;;;;;N;;;;; +13E97;EGYPTIAN HIEROGLYPH-13E97;Lo;0;L;;;;;N;;;;; +13E98;EGYPTIAN HIEROGLYPH-13E98;Lo;0;L;;;;;N;;;;; +13E99;EGYPTIAN HIEROGLYPH-13E99;Lo;0;L;;;;;N;;;;; +13E9A;EGYPTIAN HIEROGLYPH-13E9A;Lo;0;L;;;;;N;;;;; +13E9B;EGYPTIAN HIEROGLYPH-13E9B;Lo;0;L;;;;;N;;;;; +13E9C;EGYPTIAN HIEROGLYPH-13E9C;Lo;0;L;;;;;N;;;;; +13E9D;EGYPTIAN HIEROGLYPH-13E9D;Lo;0;L;;;;;N;;;;; +13E9E;EGYPTIAN HIEROGLYPH-13E9E;Lo;0;L;;;;;N;;;;; +13E9F;EGYPTIAN HIEROGLYPH-13E9F;Lo;0;L;;;;;N;;;;; +13EA0;EGYPTIAN HIEROGLYPH-13EA0;Lo;0;L;;;;;N;;;;; +13EA1;EGYPTIAN HIEROGLYPH-13EA1;Lo;0;L;;;;;N;;;;; +13EA2;EGYPTIAN HIEROGLYPH-13EA2;Lo;0;L;;;;;N;;;;; +13EA3;EGYPTIAN HIEROGLYPH-13EA3;Lo;0;L;;;;;N;;;;; +13EA4;EGYPTIAN HIEROGLYPH-13EA4;Lo;0;L;;;;;N;;;;; +13EA5;EGYPTIAN HIEROGLYPH-13EA5;Lo;0;L;;;;;N;;;;; +13EA6;EGYPTIAN HIEROGLYPH-13EA6;Lo;0;L;;;;;N;;;;; +13EA7;EGYPTIAN HIEROGLYPH-13EA7;Lo;0;L;;;;;N;;;;; +13EA8;EGYPTIAN HIEROGLYPH-13EA8;Lo;0;L;;;;;N;;;;; +13EA9;EGYPTIAN HIEROGLYPH-13EA9;Lo;0;L;;;;;N;;;;; +13EAA;EGYPTIAN HIEROGLYPH-13EAA;Lo;0;L;;;;;N;;;;; +13EAB;EGYPTIAN HIEROGLYPH-13EAB;Lo;0;L;;;;;N;;;;; +13EAC;EGYPTIAN HIEROGLYPH-13EAC;Lo;0;L;;;;;N;;;;; +13EAD;EGYPTIAN HIEROGLYPH-13EAD;Lo;0;L;;;;;N;;;;; +13EAE;EGYPTIAN HIEROGLYPH-13EAE;Lo;0;L;;;;;N;;;;; +13EAF;EGYPTIAN HIEROGLYPH-13EAF;Lo;0;L;;;;;N;;;;; +13EB0;EGYPTIAN HIEROGLYPH-13EB0;Lo;0;L;;;;;N;;;;; +13EB1;EGYPTIAN HIEROGLYPH-13EB1;Lo;0;L;;;;;N;;;;; +13EB2;EGYPTIAN HIEROGLYPH-13EB2;Lo;0;L;;;;;N;;;;; +13EB3;EGYPTIAN HIEROGLYPH-13EB3;Lo;0;L;;;;;N;;;;; +13EB4;EGYPTIAN HIEROGLYPH-13EB4;Lo;0;L;;;;;N;;;;; +13EB5;EGYPTIAN HIEROGLYPH-13EB5;Lo;0;L;;;;;N;;;;; +13EB6;EGYPTIAN HIEROGLYPH-13EB6;Lo;0;L;;;;;N;;;;; +13EB7;EGYPTIAN HIEROGLYPH-13EB7;Lo;0;L;;;;;N;;;;; +13EB8;EGYPTIAN HIEROGLYPH-13EB8;Lo;0;L;;;;;N;;;;; +13EB9;EGYPTIAN HIEROGLYPH-13EB9;Lo;0;L;;;;;N;;;;; +13EBA;EGYPTIAN HIEROGLYPH-13EBA;Lo;0;L;;;;;N;;;;; +13EBB;EGYPTIAN HIEROGLYPH-13EBB;Lo;0;L;;;;;N;;;;; +13EBC;EGYPTIAN HIEROGLYPH-13EBC;Lo;0;L;;;;;N;;;;; +13EBD;EGYPTIAN HIEROGLYPH-13EBD;Lo;0;L;;;;;N;;;;; +13EBE;EGYPTIAN HIEROGLYPH-13EBE;Lo;0;L;;;;;N;;;;; +13EBF;EGYPTIAN HIEROGLYPH-13EBF;Lo;0;L;;;;;N;;;;; +13EC0;EGYPTIAN HIEROGLYPH-13EC0;Lo;0;L;;;;;N;;;;; +13EC1;EGYPTIAN HIEROGLYPH-13EC1;Lo;0;L;;;;;N;;;;; +13EC2;EGYPTIAN HIEROGLYPH-13EC2;Lo;0;L;;;;;N;;;;; +13EC3;EGYPTIAN HIEROGLYPH-13EC3;Lo;0;L;;;;;N;;;;; +13EC4;EGYPTIAN HIEROGLYPH-13EC4;Lo;0;L;;;;;N;;;;; +13EC5;EGYPTIAN HIEROGLYPH-13EC5;Lo;0;L;;;;;N;;;;; +13EC6;EGYPTIAN HIEROGLYPH-13EC6;Lo;0;L;;;;;N;;;;; +13EC7;EGYPTIAN HIEROGLYPH-13EC7;Lo;0;L;;;;;N;;;;; +13EC8;EGYPTIAN HIEROGLYPH-13EC8;Lo;0;L;;;;;N;;;;; +13EC9;EGYPTIAN HIEROGLYPH-13EC9;Lo;0;L;;;;;N;;;;; +13ECA;EGYPTIAN HIEROGLYPH-13ECA;Lo;0;L;;;;;N;;;;; +13ECB;EGYPTIAN HIEROGLYPH-13ECB;Lo;0;L;;;;;N;;;;; +13ECC;EGYPTIAN HIEROGLYPH-13ECC;Lo;0;L;;;;;N;;;;; +13ECD;EGYPTIAN HIEROGLYPH-13ECD;Lo;0;L;;;;;N;;;;; +13ECE;EGYPTIAN HIEROGLYPH-13ECE;Lo;0;L;;;;;N;;;;; +13ECF;EGYPTIAN HIEROGLYPH-13ECF;Lo;0;L;;;;;N;;;;; +13ED0;EGYPTIAN HIEROGLYPH-13ED0;Lo;0;L;;;;;N;;;;; +13ED1;EGYPTIAN HIEROGLYPH-13ED1;Lo;0;L;;;;;N;;;;; +13ED2;EGYPTIAN HIEROGLYPH-13ED2;Lo;0;L;;;;;N;;;;; +13ED3;EGYPTIAN HIEROGLYPH-13ED3;Lo;0;L;;;;;N;;;;; +13ED4;EGYPTIAN HIEROGLYPH-13ED4;Lo;0;L;;;;;N;;;;; +13ED5;EGYPTIAN HIEROGLYPH-13ED5;Lo;0;L;;;;;N;;;;; +13ED6;EGYPTIAN HIEROGLYPH-13ED6;Lo;0;L;;;;;N;;;;; +13ED7;EGYPTIAN HIEROGLYPH-13ED7;Lo;0;L;;;;;N;;;;; +13ED8;EGYPTIAN HIEROGLYPH-13ED8;Lo;0;L;;;;;N;;;;; +13ED9;EGYPTIAN HIEROGLYPH-13ED9;Lo;0;L;;;;;N;;;;; +13EDA;EGYPTIAN HIEROGLYPH-13EDA;Lo;0;L;;;;;N;;;;; +13EDB;EGYPTIAN HIEROGLYPH-13EDB;Lo;0;L;;;;;N;;;;; +13EDC;EGYPTIAN HIEROGLYPH-13EDC;Lo;0;L;;;;;N;;;;; +13EDD;EGYPTIAN HIEROGLYPH-13EDD;Lo;0;L;;;;;N;;;;; +13EDE;EGYPTIAN HIEROGLYPH-13EDE;Lo;0;L;;;;;N;;;;; +13EDF;EGYPTIAN HIEROGLYPH-13EDF;Lo;0;L;;;;;N;;;;; +13EE0;EGYPTIAN HIEROGLYPH-13EE0;Lo;0;L;;;;;N;;;;; +13EE1;EGYPTIAN HIEROGLYPH-13EE1;Lo;0;L;;;;;N;;;;; +13EE2;EGYPTIAN HIEROGLYPH-13EE2;Lo;0;L;;;;;N;;;;; +13EE3;EGYPTIAN HIEROGLYPH-13EE3;Lo;0;L;;;;;N;;;;; +13EE4;EGYPTIAN HIEROGLYPH-13EE4;Lo;0;L;;;;;N;;;;; +13EE5;EGYPTIAN HIEROGLYPH-13EE5;Lo;0;L;;;;;N;;;;; +13EE6;EGYPTIAN HIEROGLYPH-13EE6;Lo;0;L;;;;;N;;;;; +13EE7;EGYPTIAN HIEROGLYPH-13EE7;Lo;0;L;;;;;N;;;;; +13EE8;EGYPTIAN HIEROGLYPH-13EE8;Lo;0;L;;;;;N;;;;; +13EE9;EGYPTIAN HIEROGLYPH-13EE9;Lo;0;L;;;;;N;;;;; +13EEA;EGYPTIAN HIEROGLYPH-13EEA;Lo;0;L;;;;;N;;;;; +13EEB;EGYPTIAN HIEROGLYPH-13EEB;Lo;0;L;;;;;N;;;;; +13EEC;EGYPTIAN HIEROGLYPH-13EEC;Lo;0;L;;;;;N;;;;; +13EED;EGYPTIAN HIEROGLYPH-13EED;Lo;0;L;;;;;N;;;;; +13EEE;EGYPTIAN HIEROGLYPH-13EEE;Lo;0;L;;;;;N;;;;; +13EEF;EGYPTIAN HIEROGLYPH-13EEF;Lo;0;L;;;;;N;;;;; +13EF0;EGYPTIAN HIEROGLYPH-13EF0;Lo;0;L;;;;;N;;;;; +13EF1;EGYPTIAN HIEROGLYPH-13EF1;Lo;0;L;;;;;N;;;;; +13EF2;EGYPTIAN HIEROGLYPH-13EF2;Lo;0;L;;;;;N;;;;; +13EF3;EGYPTIAN HIEROGLYPH-13EF3;Lo;0;L;;;;;N;;;;; +13EF4;EGYPTIAN HIEROGLYPH-13EF4;Lo;0;L;;;;;N;;;;; +13EF5;EGYPTIAN HIEROGLYPH-13EF5;Lo;0;L;;;;;N;;;;; +13EF6;EGYPTIAN HIEROGLYPH-13EF6;Lo;0;L;;;;;N;;;;; +13EF7;EGYPTIAN HIEROGLYPH-13EF7;Lo;0;L;;;;;N;;;;; +13EF8;EGYPTIAN HIEROGLYPH-13EF8;Lo;0;L;;;;;N;;;;; +13EF9;EGYPTIAN HIEROGLYPH-13EF9;Lo;0;L;;;;;N;;;;; +13EFA;EGYPTIAN HIEROGLYPH-13EFA;Lo;0;L;;;;;N;;;;; +13EFB;EGYPTIAN HIEROGLYPH-13EFB;Lo;0;L;;;;;N;;;;; +13EFC;EGYPTIAN HIEROGLYPH-13EFC;Lo;0;L;;;;;N;;;;; +13EFD;EGYPTIAN HIEROGLYPH-13EFD;Lo;0;L;;;;;N;;;;; +13EFE;EGYPTIAN HIEROGLYPH-13EFE;Lo;0;L;;;;;N;;;;; +13EFF;EGYPTIAN HIEROGLYPH-13EFF;Lo;0;L;;;;;N;;;;; +13F00;EGYPTIAN HIEROGLYPH-13F00;Lo;0;L;;;;;N;;;;; +13F01;EGYPTIAN HIEROGLYPH-13F01;Lo;0;L;;;;;N;;;;; +13F02;EGYPTIAN HIEROGLYPH-13F02;Lo;0;L;;;;;N;;;;; +13F03;EGYPTIAN HIEROGLYPH-13F03;Lo;0;L;;;;;N;;;;; +13F04;EGYPTIAN HIEROGLYPH-13F04;Lo;0;L;;;;;N;;;;; +13F05;EGYPTIAN HIEROGLYPH-13F05;Lo;0;L;;;;;N;;;;; +13F06;EGYPTIAN HIEROGLYPH-13F06;Lo;0;L;;;;;N;;;;; +13F07;EGYPTIAN HIEROGLYPH-13F07;Lo;0;L;;;;;N;;;;; +13F08;EGYPTIAN HIEROGLYPH-13F08;Lo;0;L;;;;;N;;;;; +13F09;EGYPTIAN HIEROGLYPH-13F09;Lo;0;L;;;;;N;;;;; +13F0A;EGYPTIAN HIEROGLYPH-13F0A;Lo;0;L;;;;;N;;;;; +13F0B;EGYPTIAN HIEROGLYPH-13F0B;Lo;0;L;;;;;N;;;;; +13F0C;EGYPTIAN HIEROGLYPH-13F0C;Lo;0;L;;;;;N;;;;; +13F0D;EGYPTIAN HIEROGLYPH-13F0D;Lo;0;L;;;;;N;;;;; +13F0E;EGYPTIAN HIEROGLYPH-13F0E;Lo;0;L;;;;;N;;;;; +13F0F;EGYPTIAN HIEROGLYPH-13F0F;Lo;0;L;;;;;N;;;;; +13F10;EGYPTIAN HIEROGLYPH-13F10;Lo;0;L;;;;;N;;;;; +13F11;EGYPTIAN HIEROGLYPH-13F11;Lo;0;L;;;;;N;;;;; +13F12;EGYPTIAN HIEROGLYPH-13F12;Lo;0;L;;;;;N;;;;; +13F13;EGYPTIAN HIEROGLYPH-13F13;Lo;0;L;;;;;N;;;;; +13F14;EGYPTIAN HIEROGLYPH-13F14;Lo;0;L;;;;;N;;;;; +13F15;EGYPTIAN HIEROGLYPH-13F15;Lo;0;L;;;;;N;;;;; +13F16;EGYPTIAN HIEROGLYPH-13F16;Lo;0;L;;;;;N;;;;; +13F17;EGYPTIAN HIEROGLYPH-13F17;Lo;0;L;;;;;N;;;;; +13F18;EGYPTIAN HIEROGLYPH-13F18;Lo;0;L;;;;;N;;;;; +13F19;EGYPTIAN HIEROGLYPH-13F19;Lo;0;L;;;;;N;;;;; +13F1A;EGYPTIAN HIEROGLYPH-13F1A;Lo;0;L;;;;;N;;;;; +13F1B;EGYPTIAN HIEROGLYPH-13F1B;Lo;0;L;;;;;N;;;;; +13F1C;EGYPTIAN HIEROGLYPH-13F1C;Lo;0;L;;;;;N;;;;; +13F1D;EGYPTIAN HIEROGLYPH-13F1D;Lo;0;L;;;;;N;;;;; +13F1E;EGYPTIAN HIEROGLYPH-13F1E;Lo;0;L;;;;;N;;;;; +13F1F;EGYPTIAN HIEROGLYPH-13F1F;Lo;0;L;;;;;N;;;;; +13F20;EGYPTIAN HIEROGLYPH-13F20;Lo;0;L;;;;;N;;;;; +13F21;EGYPTIAN HIEROGLYPH-13F21;Lo;0;L;;;;;N;;;;; +13F22;EGYPTIAN HIEROGLYPH-13F22;Lo;0;L;;;;;N;;;;; +13F23;EGYPTIAN HIEROGLYPH-13F23;Lo;0;L;;;;;N;;;;; +13F24;EGYPTIAN HIEROGLYPH-13F24;Lo;0;L;;;;;N;;;;; +13F25;EGYPTIAN HIEROGLYPH-13F25;Lo;0;L;;;;;N;;;;; +13F26;EGYPTIAN HIEROGLYPH-13F26;Lo;0;L;;;;;N;;;;; +13F27;EGYPTIAN HIEROGLYPH-13F27;Lo;0;L;;;;;N;;;;; +13F28;EGYPTIAN HIEROGLYPH-13F28;Lo;0;L;;;;;N;;;;; +13F29;EGYPTIAN HIEROGLYPH-13F29;Lo;0;L;;;;;N;;;;; +13F2A;EGYPTIAN HIEROGLYPH-13F2A;Lo;0;L;;;;;N;;;;; +13F2B;EGYPTIAN HIEROGLYPH-13F2B;Lo;0;L;;;;;N;;;;; +13F2C;EGYPTIAN HIEROGLYPH-13F2C;Lo;0;L;;;;;N;;;;; +13F2D;EGYPTIAN HIEROGLYPH-13F2D;Lo;0;L;;;;;N;;;;; +13F2E;EGYPTIAN HIEROGLYPH-13F2E;Lo;0;L;;;;;N;;;;; +13F2F;EGYPTIAN HIEROGLYPH-13F2F;Lo;0;L;;;;;N;;;;; +13F30;EGYPTIAN HIEROGLYPH-13F30;Lo;0;L;;;;;N;;;;; +13F31;EGYPTIAN HIEROGLYPH-13F31;Lo;0;L;;;;;N;;;;; +13F32;EGYPTIAN HIEROGLYPH-13F32;Lo;0;L;;;;;N;;;;; +13F33;EGYPTIAN HIEROGLYPH-13F33;Lo;0;L;;;;;N;;;;; +13F34;EGYPTIAN HIEROGLYPH-13F34;Lo;0;L;;;;;N;;;;; +13F35;EGYPTIAN HIEROGLYPH-13F35;Lo;0;L;;;;;N;;;;; +13F36;EGYPTIAN HIEROGLYPH-13F36;Lo;0;L;;;;;N;;;;; +13F37;EGYPTIAN HIEROGLYPH-13F37;Lo;0;L;;;;;N;;;;; +13F38;EGYPTIAN HIEROGLYPH-13F38;Lo;0;L;;;;;N;;;;; +13F39;EGYPTIAN HIEROGLYPH-13F39;Lo;0;L;;;;;N;;;;; +13F3A;EGYPTIAN HIEROGLYPH-13F3A;Lo;0;L;;;;;N;;;;; +13F3B;EGYPTIAN HIEROGLYPH-13F3B;Lo;0;L;;;;;N;;;;; +13F3C;EGYPTIAN HIEROGLYPH-13F3C;Lo;0;L;;;;;N;;;;; +13F3D;EGYPTIAN HIEROGLYPH-13F3D;Lo;0;L;;;;;N;;;;; +13F3E;EGYPTIAN HIEROGLYPH-13F3E;Lo;0;L;;;;;N;;;;; +13F3F;EGYPTIAN HIEROGLYPH-13F3F;Lo;0;L;;;;;N;;;;; +13F40;EGYPTIAN HIEROGLYPH-13F40;Lo;0;L;;;;;N;;;;; +13F41;EGYPTIAN HIEROGLYPH-13F41;Lo;0;L;;;;;N;;;;; +13F42;EGYPTIAN HIEROGLYPH-13F42;Lo;0;L;;;;;N;;;;; +13F43;EGYPTIAN HIEROGLYPH-13F43;Lo;0;L;;;;;N;;;;; +13F44;EGYPTIAN HIEROGLYPH-13F44;Lo;0;L;;;;;N;;;;; +13F45;EGYPTIAN HIEROGLYPH-13F45;Lo;0;L;;;;;N;;;;; +13F46;EGYPTIAN HIEROGLYPH-13F46;Lo;0;L;;;;;N;;;;; +13F47;EGYPTIAN HIEROGLYPH-13F47;Lo;0;L;;;;;N;;;;; +13F48;EGYPTIAN HIEROGLYPH-13F48;Lo;0;L;;;;;N;;;;; +13F49;EGYPTIAN HIEROGLYPH-13F49;Lo;0;L;;;;;N;;;;; +13F4A;EGYPTIAN HIEROGLYPH-13F4A;Lo;0;L;;;;;N;;;;; +13F4B;EGYPTIAN HIEROGLYPH-13F4B;Lo;0;L;;;;;N;;;;; +13F4C;EGYPTIAN HIEROGLYPH-13F4C;Lo;0;L;;;;;N;;;;; +13F4D;EGYPTIAN HIEROGLYPH-13F4D;Lo;0;L;;;;;N;;;;; +13F4E;EGYPTIAN HIEROGLYPH-13F4E;Lo;0;L;;;;;N;;;;; +13F4F;EGYPTIAN HIEROGLYPH-13F4F;Lo;0;L;;;;;N;;;;; +13F50;EGYPTIAN HIEROGLYPH-13F50;Lo;0;L;;;;;N;;;;; +13F51;EGYPTIAN HIEROGLYPH-13F51;Lo;0;L;;;;;N;;;;; +13F52;EGYPTIAN HIEROGLYPH-13F52;Lo;0;L;;;;;N;;;;; +13F53;EGYPTIAN HIEROGLYPH-13F53;Lo;0;L;;;;;N;;;;; +13F54;EGYPTIAN HIEROGLYPH-13F54;Lo;0;L;;;;;N;;;;; +13F55;EGYPTIAN HIEROGLYPH-13F55;Lo;0;L;;;;;N;;;;; +13F56;EGYPTIAN HIEROGLYPH-13F56;Lo;0;L;;;;;N;;;;; +13F57;EGYPTIAN HIEROGLYPH-13F57;Lo;0;L;;;;;N;;;;; +13F58;EGYPTIAN HIEROGLYPH-13F58;Lo;0;L;;;;;N;;;;; +13F59;EGYPTIAN HIEROGLYPH-13F59;Lo;0;L;;;;;N;;;;; +13F5A;EGYPTIAN HIEROGLYPH-13F5A;Lo;0;L;;;;;N;;;;; +13F5B;EGYPTIAN HIEROGLYPH-13F5B;Lo;0;L;;;;;N;;;;; +13F5C;EGYPTIAN HIEROGLYPH-13F5C;Lo;0;L;;;;;N;;;;; +13F5D;EGYPTIAN HIEROGLYPH-13F5D;Lo;0;L;;;;;N;;;;; +13F5E;EGYPTIAN HIEROGLYPH-13F5E;Lo;0;L;;;;;N;;;;; +13F5F;EGYPTIAN HIEROGLYPH-13F5F;Lo;0;L;;;;;N;;;;; +13F60;EGYPTIAN HIEROGLYPH-13F60;Lo;0;L;;;;;N;;;;; +13F61;EGYPTIAN HIEROGLYPH-13F61;Lo;0;L;;;;;N;;;;; +13F62;EGYPTIAN HIEROGLYPH-13F62;Lo;0;L;;;;;N;;;;; +13F63;EGYPTIAN HIEROGLYPH-13F63;Lo;0;L;;;;;N;;;;; +13F64;EGYPTIAN HIEROGLYPH-13F64;Lo;0;L;;;;;N;;;;; +13F65;EGYPTIAN HIEROGLYPH-13F65;Lo;0;L;;;;;N;;;;; +13F66;EGYPTIAN HIEROGLYPH-13F66;Lo;0;L;;;;;N;;;;; +13F67;EGYPTIAN HIEROGLYPH-13F67;Lo;0;L;;;;;N;;;;; +13F68;EGYPTIAN HIEROGLYPH-13F68;Lo;0;L;;;;;N;;;;; +13F69;EGYPTIAN HIEROGLYPH-13F69;Lo;0;L;;;;;N;;;;; +13F6A;EGYPTIAN HIEROGLYPH-13F6A;Lo;0;L;;;;;N;;;;; +13F6B;EGYPTIAN HIEROGLYPH-13F6B;Lo;0;L;;;;;N;;;;; +13F6C;EGYPTIAN HIEROGLYPH-13F6C;Lo;0;L;;;;;N;;;;; +13F6D;EGYPTIAN HIEROGLYPH-13F6D;Lo;0;L;;;;;N;;;;; +13F6E;EGYPTIAN HIEROGLYPH-13F6E;Lo;0;L;;;;;N;;;;; +13F6F;EGYPTIAN HIEROGLYPH-13F6F;Lo;0;L;;;;;N;;;;; +13F70;EGYPTIAN HIEROGLYPH-13F70;Lo;0;L;;;;;N;;;;; +13F71;EGYPTIAN HIEROGLYPH-13F71;Lo;0;L;;;;;N;;;;; +13F72;EGYPTIAN HIEROGLYPH-13F72;Lo;0;L;;;;;N;;;;; +13F73;EGYPTIAN HIEROGLYPH-13F73;Lo;0;L;;;;;N;;;;; +13F74;EGYPTIAN HIEROGLYPH-13F74;Lo;0;L;;;;;N;;;;; +13F75;EGYPTIAN HIEROGLYPH-13F75;Lo;0;L;;;;;N;;;;; +13F76;EGYPTIAN HIEROGLYPH-13F76;Lo;0;L;;;;;N;;;;; +13F77;EGYPTIAN HIEROGLYPH-13F77;Lo;0;L;;;;;N;;;;; +13F78;EGYPTIAN HIEROGLYPH-13F78;Lo;0;L;;;;;N;;;;; +13F79;EGYPTIAN HIEROGLYPH-13F79;Lo;0;L;;;;;N;;;;; +13F7A;EGYPTIAN HIEROGLYPH-13F7A;Lo;0;L;;;;;N;;;;; +13F7B;EGYPTIAN HIEROGLYPH-13F7B;Lo;0;L;;;;;N;;;;; +13F7C;EGYPTIAN HIEROGLYPH-13F7C;Lo;0;L;;;;;N;;;;; +13F7D;EGYPTIAN HIEROGLYPH-13F7D;Lo;0;L;;;;;N;;;;; +13F7E;EGYPTIAN HIEROGLYPH-13F7E;Lo;0;L;;;;;N;;;;; +13F7F;EGYPTIAN HIEROGLYPH-13F7F;Lo;0;L;;;;;N;;;;; +13F80;EGYPTIAN HIEROGLYPH-13F80;Lo;0;L;;;;;N;;;;; +13F81;EGYPTIAN HIEROGLYPH-13F81;Lo;0;L;;;;;N;;;;; +13F82;EGYPTIAN HIEROGLYPH-13F82;Lo;0;L;;;;;N;;;;; +13F83;EGYPTIAN HIEROGLYPH-13F83;Lo;0;L;;;;;N;;;;; +13F84;EGYPTIAN HIEROGLYPH-13F84;Lo;0;L;;;;;N;;;;; +13F85;EGYPTIAN HIEROGLYPH-13F85;Lo;0;L;;;;;N;;;;; +13F86;EGYPTIAN HIEROGLYPH-13F86;Lo;0;L;;;;;N;;;;; +13F87;EGYPTIAN HIEROGLYPH-13F87;Lo;0;L;;;;;N;;;;; +13F88;EGYPTIAN HIEROGLYPH-13F88;Lo;0;L;;;;;N;;;;; +13F89;EGYPTIAN HIEROGLYPH-13F89;Lo;0;L;;;;;N;;;;; +13F8A;EGYPTIAN HIEROGLYPH-13F8A;Lo;0;L;;;;;N;;;;; +13F8B;EGYPTIAN HIEROGLYPH-13F8B;Lo;0;L;;;;;N;;;;; +13F8C;EGYPTIAN HIEROGLYPH-13F8C;Lo;0;L;;;;;N;;;;; +13F8D;EGYPTIAN HIEROGLYPH-13F8D;Lo;0;L;;;;;N;;;;; +13F8E;EGYPTIAN HIEROGLYPH-13F8E;Lo;0;L;;;;;N;;;;; +13F8F;EGYPTIAN HIEROGLYPH-13F8F;Lo;0;L;;;;;N;;;;; +13F90;EGYPTIAN HIEROGLYPH-13F90;Lo;0;L;;;;;N;;;;; +13F91;EGYPTIAN HIEROGLYPH-13F91;Lo;0;L;;;;;N;;;;; +13F92;EGYPTIAN HIEROGLYPH-13F92;Lo;0;L;;;;;N;;;;; +13F93;EGYPTIAN HIEROGLYPH-13F93;Lo;0;L;;;;;N;;;;; +13F94;EGYPTIAN HIEROGLYPH-13F94;Lo;0;L;;;;;N;;;;; +13F95;EGYPTIAN HIEROGLYPH-13F95;Lo;0;L;;;;;N;;;;; +13F96;EGYPTIAN HIEROGLYPH-13F96;Lo;0;L;;;;;N;;;;; +13F97;EGYPTIAN HIEROGLYPH-13F97;Lo;0;L;;;;;N;;;;; +13F98;EGYPTIAN HIEROGLYPH-13F98;Lo;0;L;;;;;N;;;;; +13F99;EGYPTIAN HIEROGLYPH-13F99;Lo;0;L;;;;;N;;;;; +13F9A;EGYPTIAN HIEROGLYPH-13F9A;Lo;0;L;;;;;N;;;;; +13F9B;EGYPTIAN HIEROGLYPH-13F9B;Lo;0;L;;;;;N;;;;; +13F9C;EGYPTIAN HIEROGLYPH-13F9C;Lo;0;L;;;;;N;;;;; +13F9D;EGYPTIAN HIEROGLYPH-13F9D;Lo;0;L;;;;;N;;;;; +13F9E;EGYPTIAN HIEROGLYPH-13F9E;Lo;0;L;;;;;N;;;;; +13F9F;EGYPTIAN HIEROGLYPH-13F9F;Lo;0;L;;;;;N;;;;; +13FA0;EGYPTIAN HIEROGLYPH-13FA0;Lo;0;L;;;;;N;;;;; +13FA1;EGYPTIAN HIEROGLYPH-13FA1;Lo;0;L;;;;;N;;;;; +13FA2;EGYPTIAN HIEROGLYPH-13FA2;Lo;0;L;;;;;N;;;;; +13FA3;EGYPTIAN HIEROGLYPH-13FA3;Lo;0;L;;;;;N;;;;; +13FA4;EGYPTIAN HIEROGLYPH-13FA4;Lo;0;L;;;;;N;;;;; +13FA5;EGYPTIAN HIEROGLYPH-13FA5;Lo;0;L;;;;;N;;;;; +13FA6;EGYPTIAN HIEROGLYPH-13FA6;Lo;0;L;;;;;N;;;;; +13FA7;EGYPTIAN HIEROGLYPH-13FA7;Lo;0;L;;;;;N;;;;; +13FA8;EGYPTIAN HIEROGLYPH-13FA8;Lo;0;L;;;;;N;;;;; +13FA9;EGYPTIAN HIEROGLYPH-13FA9;Lo;0;L;;;;;N;;;;; +13FAA;EGYPTIAN HIEROGLYPH-13FAA;Lo;0;L;;;;;N;;;;; +13FAB;EGYPTIAN HIEROGLYPH-13FAB;Lo;0;L;;;;;N;;;;; +13FAC;EGYPTIAN HIEROGLYPH-13FAC;Lo;0;L;;;;;N;;;;; +13FAD;EGYPTIAN HIEROGLYPH-13FAD;Lo;0;L;;;;;N;;;;; +13FAE;EGYPTIAN HIEROGLYPH-13FAE;Lo;0;L;;;;;N;;;;; +13FAF;EGYPTIAN HIEROGLYPH-13FAF;Lo;0;L;;;;;N;;;;; +13FB0;EGYPTIAN HIEROGLYPH-13FB0;Lo;0;L;;;;;N;;;;; +13FB1;EGYPTIAN HIEROGLYPH-13FB1;Lo;0;L;;;;;N;;;;; +13FB2;EGYPTIAN HIEROGLYPH-13FB2;Lo;0;L;;;;;N;;;;; +13FB3;EGYPTIAN HIEROGLYPH-13FB3;Lo;0;L;;;;;N;;;;; +13FB4;EGYPTIAN HIEROGLYPH-13FB4;Lo;0;L;;;;;N;;;;; +13FB5;EGYPTIAN HIEROGLYPH-13FB5;Lo;0;L;;;;;N;;;;; +13FB6;EGYPTIAN HIEROGLYPH-13FB6;Lo;0;L;;;;;N;;;;; +13FB7;EGYPTIAN HIEROGLYPH-13FB7;Lo;0;L;;;;;N;;;;; +13FB8;EGYPTIAN HIEROGLYPH-13FB8;Lo;0;L;;;;;N;;;;; +13FB9;EGYPTIAN HIEROGLYPH-13FB9;Lo;0;L;;;;;N;;;;; +13FBA;EGYPTIAN HIEROGLYPH-13FBA;Lo;0;L;;;;;N;;;;; +13FBB;EGYPTIAN HIEROGLYPH-13FBB;Lo;0;L;;;;;N;;;;; +13FBC;EGYPTIAN HIEROGLYPH-13FBC;Lo;0;L;;;;;N;;;;; +13FBD;EGYPTIAN HIEROGLYPH-13FBD;Lo;0;L;;;;;N;;;;; +13FBE;EGYPTIAN HIEROGLYPH-13FBE;Lo;0;L;;;;;N;;;;; +13FBF;EGYPTIAN HIEROGLYPH-13FBF;Lo;0;L;;;;;N;;;;; +13FC0;EGYPTIAN HIEROGLYPH-13FC0;Lo;0;L;;;;;N;;;;; +13FC1;EGYPTIAN HIEROGLYPH-13FC1;Lo;0;L;;;;;N;;;;; +13FC2;EGYPTIAN HIEROGLYPH-13FC2;Lo;0;L;;;;;N;;;;; +13FC3;EGYPTIAN HIEROGLYPH-13FC3;Lo;0;L;;;;;N;;;;; +13FC4;EGYPTIAN HIEROGLYPH-13FC4;Lo;0;L;;;;;N;;;;; +13FC5;EGYPTIAN HIEROGLYPH-13FC5;Lo;0;L;;;;;N;;;;; +13FC6;EGYPTIAN HIEROGLYPH-13FC6;Lo;0;L;;;;;N;;;;; +13FC7;EGYPTIAN HIEROGLYPH-13FC7;Lo;0;L;;;;;N;;;;; +13FC8;EGYPTIAN HIEROGLYPH-13FC8;Lo;0;L;;;;;N;;;;; +13FC9;EGYPTIAN HIEROGLYPH-13FC9;Lo;0;L;;;;;N;;;;; +13FCA;EGYPTIAN HIEROGLYPH-13FCA;Lo;0;L;;;;;N;;;;; +13FCB;EGYPTIAN HIEROGLYPH-13FCB;Lo;0;L;;;;;N;;;;; +13FCC;EGYPTIAN HIEROGLYPH-13FCC;Lo;0;L;;;;;N;;;;; +13FCD;EGYPTIAN HIEROGLYPH-13FCD;Lo;0;L;;;;;N;;;;; +13FCE;EGYPTIAN HIEROGLYPH-13FCE;Lo;0;L;;;;;N;;;;; +13FCF;EGYPTIAN HIEROGLYPH-13FCF;Lo;0;L;;;;;N;;;;; +13FD0;EGYPTIAN HIEROGLYPH-13FD0;Lo;0;L;;;;;N;;;;; +13FD1;EGYPTIAN HIEROGLYPH-13FD1;Lo;0;L;;;;;N;;;;; +13FD2;EGYPTIAN HIEROGLYPH-13FD2;Lo;0;L;;;;;N;;;;; +13FD3;EGYPTIAN HIEROGLYPH-13FD3;Lo;0;L;;;;;N;;;;; +13FD4;EGYPTIAN HIEROGLYPH-13FD4;Lo;0;L;;;;;N;;;;; +13FD5;EGYPTIAN HIEROGLYPH-13FD5;Lo;0;L;;;;;N;;;;; +13FD6;EGYPTIAN HIEROGLYPH-13FD6;Lo;0;L;;;;;N;;;;; +13FD7;EGYPTIAN HIEROGLYPH-13FD7;Lo;0;L;;;;;N;;;;; +13FD8;EGYPTIAN HIEROGLYPH-13FD8;Lo;0;L;;;;;N;;;;; +13FD9;EGYPTIAN HIEROGLYPH-13FD9;Lo;0;L;;;;;N;;;;; +13FDA;EGYPTIAN HIEROGLYPH-13FDA;Lo;0;L;;;;;N;;;;; +13FDB;EGYPTIAN HIEROGLYPH-13FDB;Lo;0;L;;;;;N;;;;; +13FDC;EGYPTIAN HIEROGLYPH-13FDC;Lo;0;L;;;;;N;;;;; +13FDD;EGYPTIAN HIEROGLYPH-13FDD;Lo;0;L;;;;;N;;;;; +13FDE;EGYPTIAN HIEROGLYPH-13FDE;Lo;0;L;;;;;N;;;;; +13FDF;EGYPTIAN HIEROGLYPH-13FDF;Lo;0;L;;;;;N;;;;; +13FE0;EGYPTIAN HIEROGLYPH-13FE0;Lo;0;L;;;;;N;;;;; +13FE1;EGYPTIAN HIEROGLYPH-13FE1;Lo;0;L;;;;;N;;;;; +13FE2;EGYPTIAN HIEROGLYPH-13FE2;Lo;0;L;;;;;N;;;;; +13FE3;EGYPTIAN HIEROGLYPH-13FE3;Lo;0;L;;;;;N;;;;; +13FE4;EGYPTIAN HIEROGLYPH-13FE4;Lo;0;L;;;;;N;;;;; +13FE5;EGYPTIAN HIEROGLYPH-13FE5;Lo;0;L;;;;;N;;;;; +13FE6;EGYPTIAN HIEROGLYPH-13FE6;Lo;0;L;;;;;N;;;;; +13FE7;EGYPTIAN HIEROGLYPH-13FE7;Lo;0;L;;;;;N;;;;; +13FE8;EGYPTIAN HIEROGLYPH-13FE8;Lo;0;L;;;;;N;;;;; +13FE9;EGYPTIAN HIEROGLYPH-13FE9;Lo;0;L;;;;;N;;;;; +13FEA;EGYPTIAN HIEROGLYPH-13FEA;Lo;0;L;;;;;N;;;;; +13FEB;EGYPTIAN HIEROGLYPH-13FEB;Lo;0;L;;;;;N;;;;; +13FEC;EGYPTIAN HIEROGLYPH-13FEC;Lo;0;L;;;;;N;;;;; +13FED;EGYPTIAN HIEROGLYPH-13FED;Lo;0;L;;;;;N;;;;; +13FEE;EGYPTIAN HIEROGLYPH-13FEE;Lo;0;L;;;;;N;;;;; +13FEF;EGYPTIAN HIEROGLYPH-13FEF;Lo;0;L;;;;;N;;;;; +13FF0;EGYPTIAN HIEROGLYPH-13FF0;Lo;0;L;;;;;N;;;;; +13FF1;EGYPTIAN HIEROGLYPH-13FF1;Lo;0;L;;;;;N;;;;; +13FF2;EGYPTIAN HIEROGLYPH-13FF2;Lo;0;L;;;;;N;;;;; +13FF3;EGYPTIAN HIEROGLYPH-13FF3;Lo;0;L;;;;;N;;;;; +13FF4;EGYPTIAN HIEROGLYPH-13FF4;Lo;0;L;;;;;N;;;;; +13FF5;EGYPTIAN HIEROGLYPH-13FF5;Lo;0;L;;;;;N;;;;; +13FF6;EGYPTIAN HIEROGLYPH-13FF6;Lo;0;L;;;;;N;;;;; +13FF7;EGYPTIAN HIEROGLYPH-13FF7;Lo;0;L;;;;;N;;;;; +13FF8;EGYPTIAN HIEROGLYPH-13FF8;Lo;0;L;;;;;N;;;;; +13FF9;EGYPTIAN HIEROGLYPH-13FF9;Lo;0;L;;;;;N;;;;; +13FFA;EGYPTIAN HIEROGLYPH-13FFA;Lo;0;L;;;;;N;;;;; +13FFB;EGYPTIAN HIEROGLYPH-13FFB;Lo;0;L;;;;;N;;;;; +13FFC;EGYPTIAN HIEROGLYPH-13FFC;Lo;0;L;;;;;N;;;;; +13FFD;EGYPTIAN HIEROGLYPH-13FFD;Lo;0;L;;;;;N;;;;; +13FFE;EGYPTIAN HIEROGLYPH-13FFE;Lo;0;L;;;;;N;;;;; +13FFF;EGYPTIAN HIEROGLYPH-13FFF;Lo;0;L;;;;;N;;;;; +14000;EGYPTIAN HIEROGLYPH-14000;Lo;0;L;;;;;N;;;;; +14001;EGYPTIAN HIEROGLYPH-14001;Lo;0;L;;;;;N;;;;; +14002;EGYPTIAN HIEROGLYPH-14002;Lo;0;L;;;;;N;;;;; +14003;EGYPTIAN HIEROGLYPH-14003;Lo;0;L;;;;;N;;;;; +14004;EGYPTIAN HIEROGLYPH-14004;Lo;0;L;;;;;N;;;;; +14005;EGYPTIAN HIEROGLYPH-14005;Lo;0;L;;;;;N;;;;; +14006;EGYPTIAN HIEROGLYPH-14006;Lo;0;L;;;;;N;;;;; +14007;EGYPTIAN HIEROGLYPH-14007;Lo;0;L;;;;;N;;;;; +14008;EGYPTIAN HIEROGLYPH-14008;Lo;0;L;;;;;N;;;;; +14009;EGYPTIAN HIEROGLYPH-14009;Lo;0;L;;;;;N;;;;; +1400A;EGYPTIAN HIEROGLYPH-1400A;Lo;0;L;;;;;N;;;;; +1400B;EGYPTIAN HIEROGLYPH-1400B;Lo;0;L;;;;;N;;;;; +1400C;EGYPTIAN HIEROGLYPH-1400C;Lo;0;L;;;;;N;;;;; +1400D;EGYPTIAN HIEROGLYPH-1400D;Lo;0;L;;;;;N;;;;; +1400E;EGYPTIAN HIEROGLYPH-1400E;Lo;0;L;;;;;N;;;;; +1400F;EGYPTIAN HIEROGLYPH-1400F;Lo;0;L;;;;;N;;;;; +14010;EGYPTIAN HIEROGLYPH-14010;Lo;0;L;;;;;N;;;;; +14011;EGYPTIAN HIEROGLYPH-14011;Lo;0;L;;;;;N;;;;; +14012;EGYPTIAN HIEROGLYPH-14012;Lo;0;L;;;;;N;;;;; +14013;EGYPTIAN HIEROGLYPH-14013;Lo;0;L;;;;;N;;;;; +14014;EGYPTIAN HIEROGLYPH-14014;Lo;0;L;;;;;N;;;;; +14015;EGYPTIAN HIEROGLYPH-14015;Lo;0;L;;;;;N;;;;; +14016;EGYPTIAN HIEROGLYPH-14016;Lo;0;L;;;;;N;;;;; +14017;EGYPTIAN HIEROGLYPH-14017;Lo;0;L;;;;;N;;;;; +14018;EGYPTIAN HIEROGLYPH-14018;Lo;0;L;;;;;N;;;;; +14019;EGYPTIAN HIEROGLYPH-14019;Lo;0;L;;;;;N;;;;; +1401A;EGYPTIAN HIEROGLYPH-1401A;Lo;0;L;;;;;N;;;;; +1401B;EGYPTIAN HIEROGLYPH-1401B;Lo;0;L;;;;;N;;;;; +1401C;EGYPTIAN HIEROGLYPH-1401C;Lo;0;L;;;;;N;;;;; +1401D;EGYPTIAN HIEROGLYPH-1401D;Lo;0;L;;;;;N;;;;; +1401E;EGYPTIAN HIEROGLYPH-1401E;Lo;0;L;;;;;N;;;;; +1401F;EGYPTIAN HIEROGLYPH-1401F;Lo;0;L;;;;;N;;;;; +14020;EGYPTIAN HIEROGLYPH-14020;Lo;0;L;;;;;N;;;;; +14021;EGYPTIAN HIEROGLYPH-14021;Lo;0;L;;;;;N;;;;; +14022;EGYPTIAN HIEROGLYPH-14022;Lo;0;L;;;;;N;;;;; +14023;EGYPTIAN HIEROGLYPH-14023;Lo;0;L;;;;;N;;;;; +14024;EGYPTIAN HIEROGLYPH-14024;Lo;0;L;;;;;N;;;;; +14025;EGYPTIAN HIEROGLYPH-14025;Lo;0;L;;;;;N;;;;; +14026;EGYPTIAN HIEROGLYPH-14026;Lo;0;L;;;;;N;;;;; +14027;EGYPTIAN HIEROGLYPH-14027;Lo;0;L;;;;;N;;;;; +14028;EGYPTIAN HIEROGLYPH-14028;Lo;0;L;;;;;N;;;;; +14029;EGYPTIAN HIEROGLYPH-14029;Lo;0;L;;;;;N;;;;; +1402A;EGYPTIAN HIEROGLYPH-1402A;Lo;0;L;;;;;N;;;;; +1402B;EGYPTIAN HIEROGLYPH-1402B;Lo;0;L;;;;;N;;;;; +1402C;EGYPTIAN HIEROGLYPH-1402C;Lo;0;L;;;;;N;;;;; +1402D;EGYPTIAN HIEROGLYPH-1402D;Lo;0;L;;;;;N;;;;; +1402E;EGYPTIAN HIEROGLYPH-1402E;Lo;0;L;;;;;N;;;;; +1402F;EGYPTIAN HIEROGLYPH-1402F;Lo;0;L;;;;;N;;;;; +14030;EGYPTIAN HIEROGLYPH-14030;Lo;0;L;;;;;N;;;;; +14031;EGYPTIAN HIEROGLYPH-14031;Lo;0;L;;;;;N;;;;; +14032;EGYPTIAN HIEROGLYPH-14032;Lo;0;L;;;;;N;;;;; +14033;EGYPTIAN HIEROGLYPH-14033;Lo;0;L;;;;;N;;;;; +14034;EGYPTIAN HIEROGLYPH-14034;Lo;0;L;;;;;N;;;;; +14035;EGYPTIAN HIEROGLYPH-14035;Lo;0;L;;;;;N;;;;; +14036;EGYPTIAN HIEROGLYPH-14036;Lo;0;L;;;;;N;;;;; +14037;EGYPTIAN HIEROGLYPH-14037;Lo;0;L;;;;;N;;;;; +14038;EGYPTIAN HIEROGLYPH-14038;Lo;0;L;;;;;N;;;;; +14039;EGYPTIAN HIEROGLYPH-14039;Lo;0;L;;;;;N;;;;; +1403A;EGYPTIAN HIEROGLYPH-1403A;Lo;0;L;;;;;N;;;;; +1403B;EGYPTIAN HIEROGLYPH-1403B;Lo;0;L;;;;;N;;;;; +1403C;EGYPTIAN HIEROGLYPH-1403C;Lo;0;L;;;;;N;;;;; +1403D;EGYPTIAN HIEROGLYPH-1403D;Lo;0;L;;;;;N;;;;; +1403E;EGYPTIAN HIEROGLYPH-1403E;Lo;0;L;;;;;N;;;;; +1403F;EGYPTIAN HIEROGLYPH-1403F;Lo;0;L;;;;;N;;;;; +14040;EGYPTIAN HIEROGLYPH-14040;Lo;0;L;;;;;N;;;;; +14041;EGYPTIAN HIEROGLYPH-14041;Lo;0;L;;;;;N;;;;; +14042;EGYPTIAN HIEROGLYPH-14042;Lo;0;L;;;;;N;;;;; +14043;EGYPTIAN HIEROGLYPH-14043;Lo;0;L;;;;;N;;;;; +14044;EGYPTIAN HIEROGLYPH-14044;Lo;0;L;;;;;N;;;;; +14045;EGYPTIAN HIEROGLYPH-14045;Lo;0;L;;;;;N;;;;; +14046;EGYPTIAN HIEROGLYPH-14046;Lo;0;L;;;;;N;;;;; +14047;EGYPTIAN HIEROGLYPH-14047;Lo;0;L;;;;;N;;;;; +14048;EGYPTIAN HIEROGLYPH-14048;Lo;0;L;;;;;N;;;;; +14049;EGYPTIAN HIEROGLYPH-14049;Lo;0;L;;;;;N;;;;; +1404A;EGYPTIAN HIEROGLYPH-1404A;Lo;0;L;;;;;N;;;;; +1404B;EGYPTIAN HIEROGLYPH-1404B;Lo;0;L;;;;;N;;;;; +1404C;EGYPTIAN HIEROGLYPH-1404C;Lo;0;L;;;;;N;;;;; +1404D;EGYPTIAN HIEROGLYPH-1404D;Lo;0;L;;;;;N;;;;; +1404E;EGYPTIAN HIEROGLYPH-1404E;Lo;0;L;;;;;N;;;;; +1404F;EGYPTIAN HIEROGLYPH-1404F;Lo;0;L;;;;;N;;;;; +14050;EGYPTIAN HIEROGLYPH-14050;Lo;0;L;;;;;N;;;;; +14051;EGYPTIAN HIEROGLYPH-14051;Lo;0;L;;;;;N;;;;; +14052;EGYPTIAN HIEROGLYPH-14052;Lo;0;L;;;;;N;;;;; +14053;EGYPTIAN HIEROGLYPH-14053;Lo;0;L;;;;;N;;;;; +14054;EGYPTIAN HIEROGLYPH-14054;Lo;0;L;;;;;N;;;;; +14055;EGYPTIAN HIEROGLYPH-14055;Lo;0;L;;;;;N;;;;; +14056;EGYPTIAN HIEROGLYPH-14056;Lo;0;L;;;;;N;;;;; +14057;EGYPTIAN HIEROGLYPH-14057;Lo;0;L;;;;;N;;;;; +14058;EGYPTIAN HIEROGLYPH-14058;Lo;0;L;;;;;N;;;;; +14059;EGYPTIAN HIEROGLYPH-14059;Lo;0;L;;;;;N;;;;; +1405A;EGYPTIAN HIEROGLYPH-1405A;Lo;0;L;;;;;N;;;;; +1405B;EGYPTIAN HIEROGLYPH-1405B;Lo;0;L;;;;;N;;;;; +1405C;EGYPTIAN HIEROGLYPH-1405C;Lo;0;L;;;;;N;;;;; +1405D;EGYPTIAN HIEROGLYPH-1405D;Lo;0;L;;;;;N;;;;; +1405E;EGYPTIAN HIEROGLYPH-1405E;Lo;0;L;;;;;N;;;;; +1405F;EGYPTIAN HIEROGLYPH-1405F;Lo;0;L;;;;;N;;;;; +14060;EGYPTIAN HIEROGLYPH-14060;Lo;0;L;;;;;N;;;;; +14061;EGYPTIAN HIEROGLYPH-14061;Lo;0;L;;;;;N;;;;; +14062;EGYPTIAN HIEROGLYPH-14062;Lo;0;L;;;;;N;;;;; +14063;EGYPTIAN HIEROGLYPH-14063;Lo;0;L;;;;;N;;;;; +14064;EGYPTIAN HIEROGLYPH-14064;Lo;0;L;;;;;N;;;;; +14065;EGYPTIAN HIEROGLYPH-14065;Lo;0;L;;;;;N;;;;; +14066;EGYPTIAN HIEROGLYPH-14066;Lo;0;L;;;;;N;;;;; +14067;EGYPTIAN HIEROGLYPH-14067;Lo;0;L;;;;;N;;;;; +14068;EGYPTIAN HIEROGLYPH-14068;Lo;0;L;;;;;N;;;;; +14069;EGYPTIAN HIEROGLYPH-14069;Lo;0;L;;;;;N;;;;; +1406A;EGYPTIAN HIEROGLYPH-1406A;Lo;0;L;;;;;N;;;;; +1406B;EGYPTIAN HIEROGLYPH-1406B;Lo;0;L;;;;;N;;;;; +1406C;EGYPTIAN HIEROGLYPH-1406C;Lo;0;L;;;;;N;;;;; +1406D;EGYPTIAN HIEROGLYPH-1406D;Lo;0;L;;;;;N;;;;; +1406E;EGYPTIAN HIEROGLYPH-1406E;Lo;0;L;;;;;N;;;;; +1406F;EGYPTIAN HIEROGLYPH-1406F;Lo;0;L;;;;;N;;;;; +14070;EGYPTIAN HIEROGLYPH-14070;Lo;0;L;;;;;N;;;;; +14071;EGYPTIAN HIEROGLYPH-14071;Lo;0;L;;;;;N;;;;; +14072;EGYPTIAN HIEROGLYPH-14072;Lo;0;L;;;;;N;;;;; +14073;EGYPTIAN HIEROGLYPH-14073;Lo;0;L;;;;;N;;;;; +14074;EGYPTIAN HIEROGLYPH-14074;Lo;0;L;;;;;N;;;;; +14075;EGYPTIAN HIEROGLYPH-14075;Lo;0;L;;;;;N;;;;; +14076;EGYPTIAN HIEROGLYPH-14076;Lo;0;L;;;;;N;;;;; +14077;EGYPTIAN HIEROGLYPH-14077;Lo;0;L;;;;;N;;;;; +14078;EGYPTIAN HIEROGLYPH-14078;Lo;0;L;;;;;N;;;;; +14079;EGYPTIAN HIEROGLYPH-14079;Lo;0;L;;;;;N;;;;; +1407A;EGYPTIAN HIEROGLYPH-1407A;Lo;0;L;;;;;N;;;;; +1407B;EGYPTIAN HIEROGLYPH-1407B;Lo;0;L;;;;;N;;;;; +1407C;EGYPTIAN HIEROGLYPH-1407C;Lo;0;L;;;;;N;;;;; +1407D;EGYPTIAN HIEROGLYPH-1407D;Lo;0;L;;;;;N;;;;; +1407E;EGYPTIAN HIEROGLYPH-1407E;Lo;0;L;;;;;N;;;;; +1407F;EGYPTIAN HIEROGLYPH-1407F;Lo;0;L;;;;;N;;;;; +14080;EGYPTIAN HIEROGLYPH-14080;Lo;0;L;;;;;N;;;;; +14081;EGYPTIAN HIEROGLYPH-14081;Lo;0;L;;;;;N;;;;; +14082;EGYPTIAN HIEROGLYPH-14082;Lo;0;L;;;;;N;;;;; +14083;EGYPTIAN HIEROGLYPH-14083;Lo;0;L;;;;;N;;;;; +14084;EGYPTIAN HIEROGLYPH-14084;Lo;0;L;;;;;N;;;;; +14085;EGYPTIAN HIEROGLYPH-14085;Lo;0;L;;;;;N;;;;; +14086;EGYPTIAN HIEROGLYPH-14086;Lo;0;L;;;;;N;;;;; +14087;EGYPTIAN HIEROGLYPH-14087;Lo;0;L;;;;;N;;;;; +14088;EGYPTIAN HIEROGLYPH-14088;Lo;0;L;;;;;N;;;;; +14089;EGYPTIAN HIEROGLYPH-14089;Lo;0;L;;;;;N;;;;; +1408A;EGYPTIAN HIEROGLYPH-1408A;Lo;0;L;;;;;N;;;;; +1408B;EGYPTIAN HIEROGLYPH-1408B;Lo;0;L;;;;;N;;;;; +1408C;EGYPTIAN HIEROGLYPH-1408C;Lo;0;L;;;;;N;;;;; +1408D;EGYPTIAN HIEROGLYPH-1408D;Lo;0;L;;;;;N;;;;; +1408E;EGYPTIAN HIEROGLYPH-1408E;Lo;0;L;;;;;N;;;;; +1408F;EGYPTIAN HIEROGLYPH-1408F;Lo;0;L;;;;;N;;;;; +14090;EGYPTIAN HIEROGLYPH-14090;Lo;0;L;;;;;N;;;;; +14091;EGYPTIAN HIEROGLYPH-14091;Lo;0;L;;;;;N;;;;; +14092;EGYPTIAN HIEROGLYPH-14092;Lo;0;L;;;;;N;;;;; +14093;EGYPTIAN HIEROGLYPH-14093;Lo;0;L;;;;;N;;;;; +14094;EGYPTIAN HIEROGLYPH-14094;Lo;0;L;;;;;N;;;;; +14095;EGYPTIAN HIEROGLYPH-14095;Lo;0;L;;;;;N;;;;; +14096;EGYPTIAN HIEROGLYPH-14096;Lo;0;L;;;;;N;;;;; +14097;EGYPTIAN HIEROGLYPH-14097;Lo;0;L;;;;;N;;;;; +14098;EGYPTIAN HIEROGLYPH-14098;Lo;0;L;;;;;N;;;;; +14099;EGYPTIAN HIEROGLYPH-14099;Lo;0;L;;;;;N;;;;; +1409A;EGYPTIAN HIEROGLYPH-1409A;Lo;0;L;;;;;N;;;;; +1409B;EGYPTIAN HIEROGLYPH-1409B;Lo;0;L;;;;;N;;;;; +1409C;EGYPTIAN HIEROGLYPH-1409C;Lo;0;L;;;;;N;;;;; +1409D;EGYPTIAN HIEROGLYPH-1409D;Lo;0;L;;;;;N;;;;; +1409E;EGYPTIAN HIEROGLYPH-1409E;Lo;0;L;;;;;N;;;;; +1409F;EGYPTIAN HIEROGLYPH-1409F;Lo;0;L;;;;;N;;;;; +140A0;EGYPTIAN HIEROGLYPH-140A0;Lo;0;L;;;;;N;;;;; +140A1;EGYPTIAN HIEROGLYPH-140A1;Lo;0;L;;;;;N;;;;; +140A2;EGYPTIAN HIEROGLYPH-140A2;Lo;0;L;;;;;N;;;;; +140A3;EGYPTIAN HIEROGLYPH-140A3;Lo;0;L;;;;;N;;;;; +140A4;EGYPTIAN HIEROGLYPH-140A4;Lo;0;L;;;;;N;;;;; +140A5;EGYPTIAN HIEROGLYPH-140A5;Lo;0;L;;;;;N;;;;; +140A6;EGYPTIAN HIEROGLYPH-140A6;Lo;0;L;;;;;N;;;;; +140A7;EGYPTIAN HIEROGLYPH-140A7;Lo;0;L;;;;;N;;;;; +140A8;EGYPTIAN HIEROGLYPH-140A8;Lo;0;L;;;;;N;;;;; +140A9;EGYPTIAN HIEROGLYPH-140A9;Lo;0;L;;;;;N;;;;; +140AA;EGYPTIAN HIEROGLYPH-140AA;Lo;0;L;;;;;N;;;;; +140AB;EGYPTIAN HIEROGLYPH-140AB;Lo;0;L;;;;;N;;;;; +140AC;EGYPTIAN HIEROGLYPH-140AC;Lo;0;L;;;;;N;;;;; +140AD;EGYPTIAN HIEROGLYPH-140AD;Lo;0;L;;;;;N;;;;; +140AE;EGYPTIAN HIEROGLYPH-140AE;Lo;0;L;;;;;N;;;;; +140AF;EGYPTIAN HIEROGLYPH-140AF;Lo;0;L;;;;;N;;;;; +140B0;EGYPTIAN HIEROGLYPH-140B0;Lo;0;L;;;;;N;;;;; +140B1;EGYPTIAN HIEROGLYPH-140B1;Lo;0;L;;;;;N;;;;; +140B2;EGYPTIAN HIEROGLYPH-140B2;Lo;0;L;;;;;N;;;;; +140B3;EGYPTIAN HIEROGLYPH-140B3;Lo;0;L;;;;;N;;;;; +140B4;EGYPTIAN HIEROGLYPH-140B4;Lo;0;L;;;;;N;;;;; +140B5;EGYPTIAN HIEROGLYPH-140B5;Lo;0;L;;;;;N;;;;; +140B6;EGYPTIAN HIEROGLYPH-140B6;Lo;0;L;;;;;N;;;;; +140B7;EGYPTIAN HIEROGLYPH-140B7;Lo;0;L;;;;;N;;;;; +140B8;EGYPTIAN HIEROGLYPH-140B8;Lo;0;L;;;;;N;;;;; +140B9;EGYPTIAN HIEROGLYPH-140B9;Lo;0;L;;;;;N;;;;; +140BA;EGYPTIAN HIEROGLYPH-140BA;Lo;0;L;;;;;N;;;;; +140BB;EGYPTIAN HIEROGLYPH-140BB;Lo;0;L;;;;;N;;;;; +140BC;EGYPTIAN HIEROGLYPH-140BC;Lo;0;L;;;;;N;;;;; +140BD;EGYPTIAN HIEROGLYPH-140BD;Lo;0;L;;;;;N;;;;; +140BE;EGYPTIAN HIEROGLYPH-140BE;Lo;0;L;;;;;N;;;;; +140BF;EGYPTIAN HIEROGLYPH-140BF;Lo;0;L;;;;;N;;;;; +140C0;EGYPTIAN HIEROGLYPH-140C0;Lo;0;L;;;;;N;;;;; +140C1;EGYPTIAN HIEROGLYPH-140C1;Lo;0;L;;;;;N;;;;; +140C2;EGYPTIAN HIEROGLYPH-140C2;Lo;0;L;;;;;N;;;;; +140C3;EGYPTIAN HIEROGLYPH-140C3;Lo;0;L;;;;;N;;;;; +140C4;EGYPTIAN HIEROGLYPH-140C4;Lo;0;L;;;;;N;;;;; +140C5;EGYPTIAN HIEROGLYPH-140C5;Lo;0;L;;;;;N;;;;; +140C6;EGYPTIAN HIEROGLYPH-140C6;Lo;0;L;;;;;N;;;;; +140C7;EGYPTIAN HIEROGLYPH-140C7;Lo;0;L;;;;;N;;;;; +140C8;EGYPTIAN HIEROGLYPH-140C8;Lo;0;L;;;;;N;;;;; +140C9;EGYPTIAN HIEROGLYPH-140C9;Lo;0;L;;;;;N;;;;; +140CA;EGYPTIAN HIEROGLYPH-140CA;Lo;0;L;;;;;N;;;;; +140CB;EGYPTIAN HIEROGLYPH-140CB;Lo;0;L;;;;;N;;;;; +140CC;EGYPTIAN HIEROGLYPH-140CC;Lo;0;L;;;;;N;;;;; +140CD;EGYPTIAN HIEROGLYPH-140CD;Lo;0;L;;;;;N;;;;; +140CE;EGYPTIAN HIEROGLYPH-140CE;Lo;0;L;;;;;N;;;;; +140CF;EGYPTIAN HIEROGLYPH-140CF;Lo;0;L;;;;;N;;;;; +140D0;EGYPTIAN HIEROGLYPH-140D0;Lo;0;L;;;;;N;;;;; +140D1;EGYPTIAN HIEROGLYPH-140D1;Lo;0;L;;;;;N;;;;; +140D2;EGYPTIAN HIEROGLYPH-140D2;Lo;0;L;;;;;N;;;;; +140D3;EGYPTIAN HIEROGLYPH-140D3;Lo;0;L;;;;;N;;;;; +140D4;EGYPTIAN HIEROGLYPH-140D4;Lo;0;L;;;;;N;;;;; +140D5;EGYPTIAN HIEROGLYPH-140D5;Lo;0;L;;;;;N;;;;; +140D6;EGYPTIAN HIEROGLYPH-140D6;Lo;0;L;;;;;N;;;;; +140D7;EGYPTIAN HIEROGLYPH-140D7;Lo;0;L;;;;;N;;;;; +140D8;EGYPTIAN HIEROGLYPH-140D8;Lo;0;L;;;;;N;;;;; +140D9;EGYPTIAN HIEROGLYPH-140D9;Lo;0;L;;;;;N;;;;; +140DA;EGYPTIAN HIEROGLYPH-140DA;Lo;0;L;;;;;N;;;;; +140DB;EGYPTIAN HIEROGLYPH-140DB;Lo;0;L;;;;;N;;;;; +140DC;EGYPTIAN HIEROGLYPH-140DC;Lo;0;L;;;;;N;;;;; +140DD;EGYPTIAN HIEROGLYPH-140DD;Lo;0;L;;;;;N;;;;; +140DE;EGYPTIAN HIEROGLYPH-140DE;Lo;0;L;;;;;N;;;;; +140DF;EGYPTIAN HIEROGLYPH-140DF;Lo;0;L;;;;;N;;;;; +140E0;EGYPTIAN HIEROGLYPH-140E0;Lo;0;L;;;;;N;;;;; +140E1;EGYPTIAN HIEROGLYPH-140E1;Lo;0;L;;;;;N;;;;; +140E2;EGYPTIAN HIEROGLYPH-140E2;Lo;0;L;;;;;N;;;;; +140E3;EGYPTIAN HIEROGLYPH-140E3;Lo;0;L;;;;;N;;;;; +140E4;EGYPTIAN HIEROGLYPH-140E4;Lo;0;L;;;;;N;;;;; +140E5;EGYPTIAN HIEROGLYPH-140E5;Lo;0;L;;;;;N;;;;; +140E6;EGYPTIAN HIEROGLYPH-140E6;Lo;0;L;;;;;N;;;;; +140E7;EGYPTIAN HIEROGLYPH-140E7;Lo;0;L;;;;;N;;;;; +140E8;EGYPTIAN HIEROGLYPH-140E8;Lo;0;L;;;;;N;;;;; +140E9;EGYPTIAN HIEROGLYPH-140E9;Lo;0;L;;;;;N;;;;; +140EA;EGYPTIAN HIEROGLYPH-140EA;Lo;0;L;;;;;N;;;;; +140EB;EGYPTIAN HIEROGLYPH-140EB;Lo;0;L;;;;;N;;;;; +140EC;EGYPTIAN HIEROGLYPH-140EC;Lo;0;L;;;;;N;;;;; +140ED;EGYPTIAN HIEROGLYPH-140ED;Lo;0;L;;;;;N;;;;; +140EE;EGYPTIAN HIEROGLYPH-140EE;Lo;0;L;;;;;N;;;;; +140EF;EGYPTIAN HIEROGLYPH-140EF;Lo;0;L;;;;;N;;;;; +140F0;EGYPTIAN HIEROGLYPH-140F0;Lo;0;L;;;;;N;;;;; +140F1;EGYPTIAN HIEROGLYPH-140F1;Lo;0;L;;;;;N;;;;; +140F2;EGYPTIAN HIEROGLYPH-140F2;Lo;0;L;;;;;N;;;;; +140F3;EGYPTIAN HIEROGLYPH-140F3;Lo;0;L;;;;;N;;;;; +140F4;EGYPTIAN HIEROGLYPH-140F4;Lo;0;L;;;;;N;;;;; +140F5;EGYPTIAN HIEROGLYPH-140F5;Lo;0;L;;;;;N;;;;; +140F6;EGYPTIAN HIEROGLYPH-140F6;Lo;0;L;;;;;N;;;;; +140F7;EGYPTIAN HIEROGLYPH-140F7;Lo;0;L;;;;;N;;;;; +140F8;EGYPTIAN HIEROGLYPH-140F8;Lo;0;L;;;;;N;;;;; +140F9;EGYPTIAN HIEROGLYPH-140F9;Lo;0;L;;;;;N;;;;; +140FA;EGYPTIAN HIEROGLYPH-140FA;Lo;0;L;;;;;N;;;;; +140FB;EGYPTIAN HIEROGLYPH-140FB;Lo;0;L;;;;;N;;;;; +140FC;EGYPTIAN HIEROGLYPH-140FC;Lo;0;L;;;;;N;;;;; +140FD;EGYPTIAN HIEROGLYPH-140FD;Lo;0;L;;;;;N;;;;; +140FE;EGYPTIAN HIEROGLYPH-140FE;Lo;0;L;;;;;N;;;;; +140FF;EGYPTIAN HIEROGLYPH-140FF;Lo;0;L;;;;;N;;;;; +14100;EGYPTIAN HIEROGLYPH-14100;Lo;0;L;;;;;N;;;;; +14101;EGYPTIAN HIEROGLYPH-14101;Lo;0;L;;;;;N;;;;; +14102;EGYPTIAN HIEROGLYPH-14102;Lo;0;L;;;;;N;;;;; +14103;EGYPTIAN HIEROGLYPH-14103;Lo;0;L;;;;;N;;;;; +14104;EGYPTIAN HIEROGLYPH-14104;Lo;0;L;;;;;N;;;;; +14105;EGYPTIAN HIEROGLYPH-14105;Lo;0;L;;;;;N;;;;; +14106;EGYPTIAN HIEROGLYPH-14106;Lo;0;L;;;;;N;;;;; +14107;EGYPTIAN HIEROGLYPH-14107;Lo;0;L;;;;;N;;;;; +14108;EGYPTIAN HIEROGLYPH-14108;Lo;0;L;;;;;N;;;;; +14109;EGYPTIAN HIEROGLYPH-14109;Lo;0;L;;;;;N;;;;; +1410A;EGYPTIAN HIEROGLYPH-1410A;Lo;0;L;;;;;N;;;;; +1410B;EGYPTIAN HIEROGLYPH-1410B;Lo;0;L;;;;;N;;;;; +1410C;EGYPTIAN HIEROGLYPH-1410C;Lo;0;L;;;;;N;;;;; +1410D;EGYPTIAN HIEROGLYPH-1410D;Lo;0;L;;;;;N;;;;; +1410E;EGYPTIAN HIEROGLYPH-1410E;Lo;0;L;;;;;N;;;;; +1410F;EGYPTIAN HIEROGLYPH-1410F;Lo;0;L;;;;;N;;;;; +14110;EGYPTIAN HIEROGLYPH-14110;Lo;0;L;;;;;N;;;;; +14111;EGYPTIAN HIEROGLYPH-14111;Lo;0;L;;;;;N;;;;; +14112;EGYPTIAN HIEROGLYPH-14112;Lo;0;L;;;;;N;;;;; +14113;EGYPTIAN HIEROGLYPH-14113;Lo;0;L;;;;;N;;;;; +14114;EGYPTIAN HIEROGLYPH-14114;Lo;0;L;;;;;N;;;;; +14115;EGYPTIAN HIEROGLYPH-14115;Lo;0;L;;;;;N;;;;; +14116;EGYPTIAN HIEROGLYPH-14116;Lo;0;L;;;;;N;;;;; +14117;EGYPTIAN HIEROGLYPH-14117;Lo;0;L;;;;;N;;;;; +14118;EGYPTIAN HIEROGLYPH-14118;Lo;0;L;;;;;N;;;;; +14119;EGYPTIAN HIEROGLYPH-14119;Lo;0;L;;;;;N;;;;; +1411A;EGYPTIAN HIEROGLYPH-1411A;Lo;0;L;;;;;N;;;;; +1411B;EGYPTIAN HIEROGLYPH-1411B;Lo;0;L;;;;;N;;;;; +1411C;EGYPTIAN HIEROGLYPH-1411C;Lo;0;L;;;;;N;;;;; +1411D;EGYPTIAN HIEROGLYPH-1411D;Lo;0;L;;;;;N;;;;; +1411E;EGYPTIAN HIEROGLYPH-1411E;Lo;0;L;;;;;N;;;;; +1411F;EGYPTIAN HIEROGLYPH-1411F;Lo;0;L;;;;;N;;;;; +14120;EGYPTIAN HIEROGLYPH-14120;Lo;0;L;;;;;N;;;;; +14121;EGYPTIAN HIEROGLYPH-14121;Lo;0;L;;;;;N;;;;; +14122;EGYPTIAN HIEROGLYPH-14122;Lo;0;L;;;;;N;;;;; +14123;EGYPTIAN HIEROGLYPH-14123;Lo;0;L;;;;;N;;;;; +14124;EGYPTIAN HIEROGLYPH-14124;Lo;0;L;;;;;N;;;;; +14125;EGYPTIAN HIEROGLYPH-14125;Lo;0;L;;;;;N;;;;; +14126;EGYPTIAN HIEROGLYPH-14126;Lo;0;L;;;;;N;;;;; +14127;EGYPTIAN HIEROGLYPH-14127;Lo;0;L;;;;;N;;;;; +14128;EGYPTIAN HIEROGLYPH-14128;Lo;0;L;;;;;N;;;;; +14129;EGYPTIAN HIEROGLYPH-14129;Lo;0;L;;;;;N;;;;; +1412A;EGYPTIAN HIEROGLYPH-1412A;Lo;0;L;;;;;N;;;;; +1412B;EGYPTIAN HIEROGLYPH-1412B;Lo;0;L;;;;;N;;;;; +1412C;EGYPTIAN HIEROGLYPH-1412C;Lo;0;L;;;;;N;;;;; +1412D;EGYPTIAN HIEROGLYPH-1412D;Lo;0;L;;;;;N;;;;; +1412E;EGYPTIAN HIEROGLYPH-1412E;Lo;0;L;;;;;N;;;;; +1412F;EGYPTIAN HIEROGLYPH-1412F;Lo;0;L;;;;;N;;;;; +14130;EGYPTIAN HIEROGLYPH-14130;Lo;0;L;;;;;N;;;;; +14131;EGYPTIAN HIEROGLYPH-14131;Lo;0;L;;;;;N;;;;; +14132;EGYPTIAN HIEROGLYPH-14132;Lo;0;L;;;;;N;;;;; +14133;EGYPTIAN HIEROGLYPH-14133;Lo;0;L;;;;;N;;;;; +14134;EGYPTIAN HIEROGLYPH-14134;Lo;0;L;;;;;N;;;;; +14135;EGYPTIAN HIEROGLYPH-14135;Lo;0;L;;;;;N;;;;; +14136;EGYPTIAN HIEROGLYPH-14136;Lo;0;L;;;;;N;;;;; +14137;EGYPTIAN HIEROGLYPH-14137;Lo;0;L;;;;;N;;;;; +14138;EGYPTIAN HIEROGLYPH-14138;Lo;0;L;;;;;N;;;;; +14139;EGYPTIAN HIEROGLYPH-14139;Lo;0;L;;;;;N;;;;; +1413A;EGYPTIAN HIEROGLYPH-1413A;Lo;0;L;;;;;N;;;;; +1413B;EGYPTIAN HIEROGLYPH-1413B;Lo;0;L;;;;;N;;;;; +1413C;EGYPTIAN HIEROGLYPH-1413C;Lo;0;L;;;;;N;;;;; +1413D;EGYPTIAN HIEROGLYPH-1413D;Lo;0;L;;;;;N;;;;; +1413E;EGYPTIAN HIEROGLYPH-1413E;Lo;0;L;;;;;N;;;;; +1413F;EGYPTIAN HIEROGLYPH-1413F;Lo;0;L;;;;;N;;;;; +14140;EGYPTIAN HIEROGLYPH-14140;Lo;0;L;;;;;N;;;;; +14141;EGYPTIAN HIEROGLYPH-14141;Lo;0;L;;;;;N;;;;; +14142;EGYPTIAN HIEROGLYPH-14142;Lo;0;L;;;;;N;;;;; +14143;EGYPTIAN HIEROGLYPH-14143;Lo;0;L;;;;;N;;;;; +14144;EGYPTIAN HIEROGLYPH-14144;Lo;0;L;;;;;N;;;;; +14145;EGYPTIAN HIEROGLYPH-14145;Lo;0;L;;;;;N;;;;; +14146;EGYPTIAN HIEROGLYPH-14146;Lo;0;L;;;;;N;;;;; +14147;EGYPTIAN HIEROGLYPH-14147;Lo;0;L;;;;;N;;;;; +14148;EGYPTIAN HIEROGLYPH-14148;Lo;0;L;;;;;N;;;;; +14149;EGYPTIAN HIEROGLYPH-14149;Lo;0;L;;;;;N;;;;; +1414A;EGYPTIAN HIEROGLYPH-1414A;Lo;0;L;;;;;N;;;;; +1414B;EGYPTIAN HIEROGLYPH-1414B;Lo;0;L;;;;;N;;;;; +1414C;EGYPTIAN HIEROGLYPH-1414C;Lo;0;L;;;;;N;;;;; +1414D;EGYPTIAN HIEROGLYPH-1414D;Lo;0;L;;;;;N;;;;; +1414E;EGYPTIAN HIEROGLYPH-1414E;Lo;0;L;;;;;N;;;;; +1414F;EGYPTIAN HIEROGLYPH-1414F;Lo;0;L;;;;;N;;;;; +14150;EGYPTIAN HIEROGLYPH-14150;Lo;0;L;;;;;N;;;;; +14151;EGYPTIAN HIEROGLYPH-14151;Lo;0;L;;;;;N;;;;; +14152;EGYPTIAN HIEROGLYPH-14152;Lo;0;L;;;;;N;;;;; +14153;EGYPTIAN HIEROGLYPH-14153;Lo;0;L;;;;;N;;;;; +14154;EGYPTIAN HIEROGLYPH-14154;Lo;0;L;;;;;N;;;;; +14155;EGYPTIAN HIEROGLYPH-14155;Lo;0;L;;;;;N;;;;; +14156;EGYPTIAN HIEROGLYPH-14156;Lo;0;L;;;;;N;;;;; +14157;EGYPTIAN HIEROGLYPH-14157;Lo;0;L;;;;;N;;;;; +14158;EGYPTIAN HIEROGLYPH-14158;Lo;0;L;;;;;N;;;;; +14159;EGYPTIAN HIEROGLYPH-14159;Lo;0;L;;;;;N;;;;; +1415A;EGYPTIAN HIEROGLYPH-1415A;Lo;0;L;;;;;N;;;;; +1415B;EGYPTIAN HIEROGLYPH-1415B;Lo;0;L;;;;;N;;;;; +1415C;EGYPTIAN HIEROGLYPH-1415C;Lo;0;L;;;;;N;;;;; +1415D;EGYPTIAN HIEROGLYPH-1415D;Lo;0;L;;;;;N;;;;; +1415E;EGYPTIAN HIEROGLYPH-1415E;Lo;0;L;;;;;N;;;;; +1415F;EGYPTIAN HIEROGLYPH-1415F;Lo;0;L;;;;;N;;;;; +14160;EGYPTIAN HIEROGLYPH-14160;Lo;0;L;;;;;N;;;;; +14161;EGYPTIAN HIEROGLYPH-14161;Lo;0;L;;;;;N;;;;; +14162;EGYPTIAN HIEROGLYPH-14162;Lo;0;L;;;;;N;;;;; +14163;EGYPTIAN HIEROGLYPH-14163;Lo;0;L;;;;;N;;;;; +14164;EGYPTIAN HIEROGLYPH-14164;Lo;0;L;;;;;N;;;;; +14165;EGYPTIAN HIEROGLYPH-14165;Lo;0;L;;;;;N;;;;; +14166;EGYPTIAN HIEROGLYPH-14166;Lo;0;L;;;;;N;;;;; +14167;EGYPTIAN HIEROGLYPH-14167;Lo;0;L;;;;;N;;;;; +14168;EGYPTIAN HIEROGLYPH-14168;Lo;0;L;;;;;N;;;;; +14169;EGYPTIAN HIEROGLYPH-14169;Lo;0;L;;;;;N;;;;; +1416A;EGYPTIAN HIEROGLYPH-1416A;Lo;0;L;;;;;N;;;;; +1416B;EGYPTIAN HIEROGLYPH-1416B;Lo;0;L;;;;;N;;;;; +1416C;EGYPTIAN HIEROGLYPH-1416C;Lo;0;L;;;;;N;;;;; +1416D;EGYPTIAN HIEROGLYPH-1416D;Lo;0;L;;;;;N;;;;; +1416E;EGYPTIAN HIEROGLYPH-1416E;Lo;0;L;;;;;N;;;;; +1416F;EGYPTIAN HIEROGLYPH-1416F;Lo;0;L;;;;;N;;;;; +14170;EGYPTIAN HIEROGLYPH-14170;Lo;0;L;;;;;N;;;;; +14171;EGYPTIAN HIEROGLYPH-14171;Lo;0;L;;;;;N;;;;; +14172;EGYPTIAN HIEROGLYPH-14172;Lo;0;L;;;;;N;;;;; +14173;EGYPTIAN HIEROGLYPH-14173;Lo;0;L;;;;;N;;;;; +14174;EGYPTIAN HIEROGLYPH-14174;Lo;0;L;;;;;N;;;;; +14175;EGYPTIAN HIEROGLYPH-14175;Lo;0;L;;;;;N;;;;; +14176;EGYPTIAN HIEROGLYPH-14176;Lo;0;L;;;;;N;;;;; +14177;EGYPTIAN HIEROGLYPH-14177;Lo;0;L;;;;;N;;;;; +14178;EGYPTIAN HIEROGLYPH-14178;Lo;0;L;;;;;N;;;;; +14179;EGYPTIAN HIEROGLYPH-14179;Lo;0;L;;;;;N;;;;; +1417A;EGYPTIAN HIEROGLYPH-1417A;Lo;0;L;;;;;N;;;;; +1417B;EGYPTIAN HIEROGLYPH-1417B;Lo;0;L;;;;;N;;;;; +1417C;EGYPTIAN HIEROGLYPH-1417C;Lo;0;L;;;;;N;;;;; +1417D;EGYPTIAN HIEROGLYPH-1417D;Lo;0;L;;;;;N;;;;; +1417E;EGYPTIAN HIEROGLYPH-1417E;Lo;0;L;;;;;N;;;;; +1417F;EGYPTIAN HIEROGLYPH-1417F;Lo;0;L;;;;;N;;;;; +14180;EGYPTIAN HIEROGLYPH-14180;Lo;0;L;;;;;N;;;;; +14181;EGYPTIAN HIEROGLYPH-14181;Lo;0;L;;;;;N;;;;; +14182;EGYPTIAN HIEROGLYPH-14182;Lo;0;L;;;;;N;;;;; +14183;EGYPTIAN HIEROGLYPH-14183;Lo;0;L;;;;;N;;;;; +14184;EGYPTIAN HIEROGLYPH-14184;Lo;0;L;;;;;N;;;;; +14185;EGYPTIAN HIEROGLYPH-14185;Lo;0;L;;;;;N;;;;; +14186;EGYPTIAN HIEROGLYPH-14186;Lo;0;L;;;;;N;;;;; +14187;EGYPTIAN HIEROGLYPH-14187;Lo;0;L;;;;;N;;;;; +14188;EGYPTIAN HIEROGLYPH-14188;Lo;0;L;;;;;N;;;;; +14189;EGYPTIAN HIEROGLYPH-14189;Lo;0;L;;;;;N;;;;; +1418A;EGYPTIAN HIEROGLYPH-1418A;Lo;0;L;;;;;N;;;;; +1418B;EGYPTIAN HIEROGLYPH-1418B;Lo;0;L;;;;;N;;;;; +1418C;EGYPTIAN HIEROGLYPH-1418C;Lo;0;L;;;;;N;;;;; +1418D;EGYPTIAN HIEROGLYPH-1418D;Lo;0;L;;;;;N;;;;; +1418E;EGYPTIAN HIEROGLYPH-1418E;Lo;0;L;;;;;N;;;;; +1418F;EGYPTIAN HIEROGLYPH-1418F;Lo;0;L;;;;;N;;;;; +14190;EGYPTIAN HIEROGLYPH-14190;Lo;0;L;;;;;N;;;;; +14191;EGYPTIAN HIEROGLYPH-14191;Lo;0;L;;;;;N;;;;; +14192;EGYPTIAN HIEROGLYPH-14192;Lo;0;L;;;;;N;;;;; +14193;EGYPTIAN HIEROGLYPH-14193;Lo;0;L;;;;;N;;;;; +14194;EGYPTIAN HIEROGLYPH-14194;Lo;0;L;;;;;N;;;;; +14195;EGYPTIAN HIEROGLYPH-14195;Lo;0;L;;;;;N;;;;; +14196;EGYPTIAN HIEROGLYPH-14196;Lo;0;L;;;;;N;;;;; +14197;EGYPTIAN HIEROGLYPH-14197;Lo;0;L;;;;;N;;;;; +14198;EGYPTIAN HIEROGLYPH-14198;Lo;0;L;;;;;N;;;;; +14199;EGYPTIAN HIEROGLYPH-14199;Lo;0;L;;;;;N;;;;; +1419A;EGYPTIAN HIEROGLYPH-1419A;Lo;0;L;;;;;N;;;;; +1419B;EGYPTIAN HIEROGLYPH-1419B;Lo;0;L;;;;;N;;;;; +1419C;EGYPTIAN HIEROGLYPH-1419C;Lo;0;L;;;;;N;;;;; +1419D;EGYPTIAN HIEROGLYPH-1419D;Lo;0;L;;;;;N;;;;; +1419E;EGYPTIAN HIEROGLYPH-1419E;Lo;0;L;;;;;N;;;;; +1419F;EGYPTIAN HIEROGLYPH-1419F;Lo;0;L;;;;;N;;;;; +141A0;EGYPTIAN HIEROGLYPH-141A0;Lo;0;L;;;;;N;;;;; +141A1;EGYPTIAN HIEROGLYPH-141A1;Lo;0;L;;;;;N;;;;; +141A2;EGYPTIAN HIEROGLYPH-141A2;Lo;0;L;;;;;N;;;;; +141A3;EGYPTIAN HIEROGLYPH-141A3;Lo;0;L;;;;;N;;;;; +141A4;EGYPTIAN HIEROGLYPH-141A4;Lo;0;L;;;;;N;;;;; +141A5;EGYPTIAN HIEROGLYPH-141A5;Lo;0;L;;;;;N;;;;; +141A6;EGYPTIAN HIEROGLYPH-141A6;Lo;0;L;;;;;N;;;;; +141A7;EGYPTIAN HIEROGLYPH-141A7;Lo;0;L;;;;;N;;;;; +141A8;EGYPTIAN HIEROGLYPH-141A8;Lo;0;L;;;;;N;;;;; +141A9;EGYPTIAN HIEROGLYPH-141A9;Lo;0;L;;;;;N;;;;; +141AA;EGYPTIAN HIEROGLYPH-141AA;Lo;0;L;;;;;N;;;;; +141AB;EGYPTIAN HIEROGLYPH-141AB;Lo;0;L;;;;;N;;;;; +141AC;EGYPTIAN HIEROGLYPH-141AC;Lo;0;L;;;;;N;;;;; +141AD;EGYPTIAN HIEROGLYPH-141AD;Lo;0;L;;;;;N;;;;; +141AE;EGYPTIAN HIEROGLYPH-141AE;Lo;0;L;;;;;N;;;;; +141AF;EGYPTIAN HIEROGLYPH-141AF;Lo;0;L;;;;;N;;;;; +141B0;EGYPTIAN HIEROGLYPH-141B0;Lo;0;L;;;;;N;;;;; +141B1;EGYPTIAN HIEROGLYPH-141B1;Lo;0;L;;;;;N;;;;; +141B2;EGYPTIAN HIEROGLYPH-141B2;Lo;0;L;;;;;N;;;;; +141B3;EGYPTIAN HIEROGLYPH-141B3;Lo;0;L;;;;;N;;;;; +141B4;EGYPTIAN HIEROGLYPH-141B4;Lo;0;L;;;;;N;;;;; +141B5;EGYPTIAN HIEROGLYPH-141B5;Lo;0;L;;;;;N;;;;; +141B6;EGYPTIAN HIEROGLYPH-141B6;Lo;0;L;;;;;N;;;;; +141B7;EGYPTIAN HIEROGLYPH-141B7;Lo;0;L;;;;;N;;;;; +141B8;EGYPTIAN HIEROGLYPH-141B8;Lo;0;L;;;;;N;;;;; +141B9;EGYPTIAN HIEROGLYPH-141B9;Lo;0;L;;;;;N;;;;; +141BA;EGYPTIAN HIEROGLYPH-141BA;Lo;0;L;;;;;N;;;;; +141BB;EGYPTIAN HIEROGLYPH-141BB;Lo;0;L;;;;;N;;;;; +141BC;EGYPTIAN HIEROGLYPH-141BC;Lo;0;L;;;;;N;;;;; +141BD;EGYPTIAN HIEROGLYPH-141BD;Lo;0;L;;;;;N;;;;; +141BE;EGYPTIAN HIEROGLYPH-141BE;Lo;0;L;;;;;N;;;;; +141BF;EGYPTIAN HIEROGLYPH-141BF;Lo;0;L;;;;;N;;;;; +141C0;EGYPTIAN HIEROGLYPH-141C0;Lo;0;L;;;;;N;;;;; +141C1;EGYPTIAN HIEROGLYPH-141C1;Lo;0;L;;;;;N;;;;; +141C2;EGYPTIAN HIEROGLYPH-141C2;Lo;0;L;;;;;N;;;;; +141C3;EGYPTIAN HIEROGLYPH-141C3;Lo;0;L;;;;;N;;;;; +141C4;EGYPTIAN HIEROGLYPH-141C4;Lo;0;L;;;;;N;;;;; +141C5;EGYPTIAN HIEROGLYPH-141C5;Lo;0;L;;;;;N;;;;; +141C6;EGYPTIAN HIEROGLYPH-141C6;Lo;0;L;;;;;N;;;;; +141C7;EGYPTIAN HIEROGLYPH-141C7;Lo;0;L;;;;;N;;;;; +141C8;EGYPTIAN HIEROGLYPH-141C8;Lo;0;L;;;;;N;;;;; +141C9;EGYPTIAN HIEROGLYPH-141C9;Lo;0;L;;;;;N;;;;; +141CA;EGYPTIAN HIEROGLYPH-141CA;Lo;0;L;;;;;N;;;;; +141CB;EGYPTIAN HIEROGLYPH-141CB;Lo;0;L;;;;;N;;;;; +141CC;EGYPTIAN HIEROGLYPH-141CC;Lo;0;L;;;;;N;;;;; +141CD;EGYPTIAN HIEROGLYPH-141CD;Lo;0;L;;;;;N;;;;; +141CE;EGYPTIAN HIEROGLYPH-141CE;Lo;0;L;;;;;N;;;;; +141CF;EGYPTIAN HIEROGLYPH-141CF;Lo;0;L;;;;;N;;;;; +141D0;EGYPTIAN HIEROGLYPH-141D0;Lo;0;L;;;;;N;;;;; +141D1;EGYPTIAN HIEROGLYPH-141D1;Lo;0;L;;;;;N;;;;; +141D2;EGYPTIAN HIEROGLYPH-141D2;Lo;0;L;;;;;N;;;;; +141D3;EGYPTIAN HIEROGLYPH-141D3;Lo;0;L;;;;;N;;;;; +141D4;EGYPTIAN HIEROGLYPH-141D4;Lo;0;L;;;;;N;;;;; +141D5;EGYPTIAN HIEROGLYPH-141D5;Lo;0;L;;;;;N;;;;; +141D6;EGYPTIAN HIEROGLYPH-141D6;Lo;0;L;;;;;N;;;;; +141D7;EGYPTIAN HIEROGLYPH-141D7;Lo;0;L;;;;;N;;;;; +141D8;EGYPTIAN HIEROGLYPH-141D8;Lo;0;L;;;;;N;;;;; +141D9;EGYPTIAN HIEROGLYPH-141D9;Lo;0;L;;;;;N;;;;; +141DA;EGYPTIAN HIEROGLYPH-141DA;Lo;0;L;;;;;N;;;;; +141DB;EGYPTIAN HIEROGLYPH-141DB;Lo;0;L;;;;;N;;;;; +141DC;EGYPTIAN HIEROGLYPH-141DC;Lo;0;L;;;;;N;;;;; +141DD;EGYPTIAN HIEROGLYPH-141DD;Lo;0;L;;;;;N;;;;; +141DE;EGYPTIAN HIEROGLYPH-141DE;Lo;0;L;;;;;N;;;;; +141DF;EGYPTIAN HIEROGLYPH-141DF;Lo;0;L;;;;;N;;;;; +141E0;EGYPTIAN HIEROGLYPH-141E0;Lo;0;L;;;;;N;;;;; +141E1;EGYPTIAN HIEROGLYPH-141E1;Lo;0;L;;;;;N;;;;; +141E2;EGYPTIAN HIEROGLYPH-141E2;Lo;0;L;;;;;N;;;;; +141E3;EGYPTIAN HIEROGLYPH-141E3;Lo;0;L;;;;;N;;;;; +141E4;EGYPTIAN HIEROGLYPH-141E4;Lo;0;L;;;;;N;;;;; +141E5;EGYPTIAN HIEROGLYPH-141E5;Lo;0;L;;;;;N;;;;; +141E6;EGYPTIAN HIEROGLYPH-141E6;Lo;0;L;;;;;N;;;;; +141E7;EGYPTIAN HIEROGLYPH-141E7;Lo;0;L;;;;;N;;;;; +141E8;EGYPTIAN HIEROGLYPH-141E8;Lo;0;L;;;;;N;;;;; +141E9;EGYPTIAN HIEROGLYPH-141E9;Lo;0;L;;;;;N;;;;; +141EA;EGYPTIAN HIEROGLYPH-141EA;Lo;0;L;;;;;N;;;;; +141EB;EGYPTIAN HIEROGLYPH-141EB;Lo;0;L;;;;;N;;;;; +141EC;EGYPTIAN HIEROGLYPH-141EC;Lo;0;L;;;;;N;;;;; +141ED;EGYPTIAN HIEROGLYPH-141ED;Lo;0;L;;;;;N;;;;; +141EE;EGYPTIAN HIEROGLYPH-141EE;Lo;0;L;;;;;N;;;;; +141EF;EGYPTIAN HIEROGLYPH-141EF;Lo;0;L;;;;;N;;;;; +141F0;EGYPTIAN HIEROGLYPH-141F0;Lo;0;L;;;;;N;;;;; +141F1;EGYPTIAN HIEROGLYPH-141F1;Lo;0;L;;;;;N;;;;; +141F2;EGYPTIAN HIEROGLYPH-141F2;Lo;0;L;;;;;N;;;;; +141F3;EGYPTIAN HIEROGLYPH-141F3;Lo;0;L;;;;;N;;;;; +141F4;EGYPTIAN HIEROGLYPH-141F4;Lo;0;L;;;;;N;;;;; +141F5;EGYPTIAN HIEROGLYPH-141F5;Lo;0;L;;;;;N;;;;; +141F6;EGYPTIAN HIEROGLYPH-141F6;Lo;0;L;;;;;N;;;;; +141F7;EGYPTIAN HIEROGLYPH-141F7;Lo;0;L;;;;;N;;;;; +141F8;EGYPTIAN HIEROGLYPH-141F8;Lo;0;L;;;;;N;;;;; +141F9;EGYPTIAN HIEROGLYPH-141F9;Lo;0;L;;;;;N;;;;; +141FA;EGYPTIAN HIEROGLYPH-141FA;Lo;0;L;;;;;N;;;;; +141FB;EGYPTIAN HIEROGLYPH-141FB;Lo;0;L;;;;;N;;;;; +141FC;EGYPTIAN HIEROGLYPH-141FC;Lo;0;L;;;;;N;;;;; +141FD;EGYPTIAN HIEROGLYPH-141FD;Lo;0;L;;;;;N;;;;; +141FE;EGYPTIAN HIEROGLYPH-141FE;Lo;0;L;;;;;N;;;;; +141FF;EGYPTIAN HIEROGLYPH-141FF;Lo;0;L;;;;;N;;;;; +14200;EGYPTIAN HIEROGLYPH-14200;Lo;0;L;;;;;N;;;;; +14201;EGYPTIAN HIEROGLYPH-14201;Lo;0;L;;;;;N;;;;; +14202;EGYPTIAN HIEROGLYPH-14202;Lo;0;L;;;;;N;;;;; +14203;EGYPTIAN HIEROGLYPH-14203;Lo;0;L;;;;;N;;;;; +14204;EGYPTIAN HIEROGLYPH-14204;Lo;0;L;;;;;N;;;;; +14205;EGYPTIAN HIEROGLYPH-14205;Lo;0;L;;;;;N;;;;; +14206;EGYPTIAN HIEROGLYPH-14206;Lo;0;L;;;;;N;;;;; +14207;EGYPTIAN HIEROGLYPH-14207;Lo;0;L;;;;;N;;;;; +14208;EGYPTIAN HIEROGLYPH-14208;Lo;0;L;;;;;N;;;;; +14209;EGYPTIAN HIEROGLYPH-14209;Lo;0;L;;;;;N;;;;; +1420A;EGYPTIAN HIEROGLYPH-1420A;Lo;0;L;;;;;N;;;;; +1420B;EGYPTIAN HIEROGLYPH-1420B;Lo;0;L;;;;;N;;;;; +1420C;EGYPTIAN HIEROGLYPH-1420C;Lo;0;L;;;;;N;;;;; +1420D;EGYPTIAN HIEROGLYPH-1420D;Lo;0;L;;;;;N;;;;; +1420E;EGYPTIAN HIEROGLYPH-1420E;Lo;0;L;;;;;N;;;;; +1420F;EGYPTIAN HIEROGLYPH-1420F;Lo;0;L;;;;;N;;;;; +14210;EGYPTIAN HIEROGLYPH-14210;Lo;0;L;;;;;N;;;;; +14211;EGYPTIAN HIEROGLYPH-14211;Lo;0;L;;;;;N;;;;; +14212;EGYPTIAN HIEROGLYPH-14212;Lo;0;L;;;;;N;;;;; +14213;EGYPTIAN HIEROGLYPH-14213;Lo;0;L;;;;;N;;;;; +14214;EGYPTIAN HIEROGLYPH-14214;Lo;0;L;;;;;N;;;;; +14215;EGYPTIAN HIEROGLYPH-14215;Lo;0;L;;;;;N;;;;; +14216;EGYPTIAN HIEROGLYPH-14216;Lo;0;L;;;;;N;;;;; +14217;EGYPTIAN HIEROGLYPH-14217;Lo;0;L;;;;;N;;;;; +14218;EGYPTIAN HIEROGLYPH-14218;Lo;0;L;;;;;N;;;;; +14219;EGYPTIAN HIEROGLYPH-14219;Lo;0;L;;;;;N;;;;; +1421A;EGYPTIAN HIEROGLYPH-1421A;Lo;0;L;;;;;N;;;;; +1421B;EGYPTIAN HIEROGLYPH-1421B;Lo;0;L;;;;;N;;;;; +1421C;EGYPTIAN HIEROGLYPH-1421C;Lo;0;L;;;;;N;;;;; +1421D;EGYPTIAN HIEROGLYPH-1421D;Lo;0;L;;;;;N;;;;; +1421E;EGYPTIAN HIEROGLYPH-1421E;Lo;0;L;;;;;N;;;;; +1421F;EGYPTIAN HIEROGLYPH-1421F;Lo;0;L;;;;;N;;;;; +14220;EGYPTIAN HIEROGLYPH-14220;Lo;0;L;;;;;N;;;;; +14221;EGYPTIAN HIEROGLYPH-14221;Lo;0;L;;;;;N;;;;; +14222;EGYPTIAN HIEROGLYPH-14222;Lo;0;L;;;;;N;;;;; +14223;EGYPTIAN HIEROGLYPH-14223;Lo;0;L;;;;;N;;;;; +14224;EGYPTIAN HIEROGLYPH-14224;Lo;0;L;;;;;N;;;;; +14225;EGYPTIAN HIEROGLYPH-14225;Lo;0;L;;;;;N;;;;; +14226;EGYPTIAN HIEROGLYPH-14226;Lo;0;L;;;;;N;;;;; +14227;EGYPTIAN HIEROGLYPH-14227;Lo;0;L;;;;;N;;;;; +14228;EGYPTIAN HIEROGLYPH-14228;Lo;0;L;;;;;N;;;;; +14229;EGYPTIAN HIEROGLYPH-14229;Lo;0;L;;;;;N;;;;; +1422A;EGYPTIAN HIEROGLYPH-1422A;Lo;0;L;;;;;N;;;;; +1422B;EGYPTIAN HIEROGLYPH-1422B;Lo;0;L;;;;;N;;;;; +1422C;EGYPTIAN HIEROGLYPH-1422C;Lo;0;L;;;;;N;;;;; +1422D;EGYPTIAN HIEROGLYPH-1422D;Lo;0;L;;;;;N;;;;; +1422E;EGYPTIAN HIEROGLYPH-1422E;Lo;0;L;;;;;N;;;;; +1422F;EGYPTIAN HIEROGLYPH-1422F;Lo;0;L;;;;;N;;;;; +14230;EGYPTIAN HIEROGLYPH-14230;Lo;0;L;;;;;N;;;;; +14231;EGYPTIAN HIEROGLYPH-14231;Lo;0;L;;;;;N;;;;; +14232;EGYPTIAN HIEROGLYPH-14232;Lo;0;L;;;;;N;;;;; +14233;EGYPTIAN HIEROGLYPH-14233;Lo;0;L;;;;;N;;;;; +14234;EGYPTIAN HIEROGLYPH-14234;Lo;0;L;;;;;N;;;;; +14235;EGYPTIAN HIEROGLYPH-14235;Lo;0;L;;;;;N;;;;; +14236;EGYPTIAN HIEROGLYPH-14236;Lo;0;L;;;;;N;;;;; +14237;EGYPTIAN HIEROGLYPH-14237;Lo;0;L;;;;;N;;;;; +14238;EGYPTIAN HIEROGLYPH-14238;Lo;0;L;;;;;N;;;;; +14239;EGYPTIAN HIEROGLYPH-14239;Lo;0;L;;;;;N;;;;; +1423A;EGYPTIAN HIEROGLYPH-1423A;Lo;0;L;;;;;N;;;;; +1423B;EGYPTIAN HIEROGLYPH-1423B;Lo;0;L;;;;;N;;;;; +1423C;EGYPTIAN HIEROGLYPH-1423C;Lo;0;L;;;;;N;;;;; +1423D;EGYPTIAN HIEROGLYPH-1423D;Lo;0;L;;;;;N;;;;; +1423E;EGYPTIAN HIEROGLYPH-1423E;Lo;0;L;;;;;N;;;;; +1423F;EGYPTIAN HIEROGLYPH-1423F;Lo;0;L;;;;;N;;;;; +14240;EGYPTIAN HIEROGLYPH-14240;Lo;0;L;;;;;N;;;;; +14241;EGYPTIAN HIEROGLYPH-14241;Lo;0;L;;;;;N;;;;; +14242;EGYPTIAN HIEROGLYPH-14242;Lo;0;L;;;;;N;;;;; +14243;EGYPTIAN HIEROGLYPH-14243;Lo;0;L;;;;;N;;;;; +14244;EGYPTIAN HIEROGLYPH-14244;Lo;0;L;;;;;N;;;;; +14245;EGYPTIAN HIEROGLYPH-14245;Lo;0;L;;;;;N;;;;; +14246;EGYPTIAN HIEROGLYPH-14246;Lo;0;L;;;;;N;;;;; +14247;EGYPTIAN HIEROGLYPH-14247;Lo;0;L;;;;;N;;;;; +14248;EGYPTIAN HIEROGLYPH-14248;Lo;0;L;;;;;N;;;;; +14249;EGYPTIAN HIEROGLYPH-14249;Lo;0;L;;;;;N;;;;; +1424A;EGYPTIAN HIEROGLYPH-1424A;Lo;0;L;;;;;N;;;;; +1424B;EGYPTIAN HIEROGLYPH-1424B;Lo;0;L;;;;;N;;;;; +1424C;EGYPTIAN HIEROGLYPH-1424C;Lo;0;L;;;;;N;;;;; +1424D;EGYPTIAN HIEROGLYPH-1424D;Lo;0;L;;;;;N;;;;; +1424E;EGYPTIAN HIEROGLYPH-1424E;Lo;0;L;;;;;N;;;;; +1424F;EGYPTIAN HIEROGLYPH-1424F;Lo;0;L;;;;;N;;;;; +14250;EGYPTIAN HIEROGLYPH-14250;Lo;0;L;;;;;N;;;;; +14251;EGYPTIAN HIEROGLYPH-14251;Lo;0;L;;;;;N;;;;; +14252;EGYPTIAN HIEROGLYPH-14252;Lo;0;L;;;;;N;;;;; +14253;EGYPTIAN HIEROGLYPH-14253;Lo;0;L;;;;;N;;;;; +14254;EGYPTIAN HIEROGLYPH-14254;Lo;0;L;;;;;N;;;;; +14255;EGYPTIAN HIEROGLYPH-14255;Lo;0;L;;;;;N;;;;; +14256;EGYPTIAN HIEROGLYPH-14256;Lo;0;L;;;;;N;;;;; +14257;EGYPTIAN HIEROGLYPH-14257;Lo;0;L;;;;;N;;;;; +14258;EGYPTIAN HIEROGLYPH-14258;Lo;0;L;;;;;N;;;;; +14259;EGYPTIAN HIEROGLYPH-14259;Lo;0;L;;;;;N;;;;; +1425A;EGYPTIAN HIEROGLYPH-1425A;Lo;0;L;;;;;N;;;;; +1425B;EGYPTIAN HIEROGLYPH-1425B;Lo;0;L;;;;;N;;;;; +1425C;EGYPTIAN HIEROGLYPH-1425C;Lo;0;L;;;;;N;;;;; +1425D;EGYPTIAN HIEROGLYPH-1425D;Lo;0;L;;;;;N;;;;; +1425E;EGYPTIAN HIEROGLYPH-1425E;Lo;0;L;;;;;N;;;;; +1425F;EGYPTIAN HIEROGLYPH-1425F;Lo;0;L;;;;;N;;;;; +14260;EGYPTIAN HIEROGLYPH-14260;Lo;0;L;;;;;N;;;;; +14261;EGYPTIAN HIEROGLYPH-14261;Lo;0;L;;;;;N;;;;; +14262;EGYPTIAN HIEROGLYPH-14262;Lo;0;L;;;;;N;;;;; +14263;EGYPTIAN HIEROGLYPH-14263;Lo;0;L;;;;;N;;;;; +14264;EGYPTIAN HIEROGLYPH-14264;Lo;0;L;;;;;N;;;;; +14265;EGYPTIAN HIEROGLYPH-14265;Lo;0;L;;;;;N;;;;; +14266;EGYPTIAN HIEROGLYPH-14266;Lo;0;L;;;;;N;;;;; +14267;EGYPTIAN HIEROGLYPH-14267;Lo;0;L;;;;;N;;;;; +14268;EGYPTIAN HIEROGLYPH-14268;Lo;0;L;;;;;N;;;;; +14269;EGYPTIAN HIEROGLYPH-14269;Lo;0;L;;;;;N;;;;; +1426A;EGYPTIAN HIEROGLYPH-1426A;Lo;0;L;;;;;N;;;;; +1426B;EGYPTIAN HIEROGLYPH-1426B;Lo;0;L;;;;;N;;;;; +1426C;EGYPTIAN HIEROGLYPH-1426C;Lo;0;L;;;;;N;;;;; +1426D;EGYPTIAN HIEROGLYPH-1426D;Lo;0;L;;;;;N;;;;; +1426E;EGYPTIAN HIEROGLYPH-1426E;Lo;0;L;;;;;N;;;;; +1426F;EGYPTIAN HIEROGLYPH-1426F;Lo;0;L;;;;;N;;;;; +14270;EGYPTIAN HIEROGLYPH-14270;Lo;0;L;;;;;N;;;;; +14271;EGYPTIAN HIEROGLYPH-14271;Lo;0;L;;;;;N;;;;; +14272;EGYPTIAN HIEROGLYPH-14272;Lo;0;L;;;;;N;;;;; +14273;EGYPTIAN HIEROGLYPH-14273;Lo;0;L;;;;;N;;;;; +14274;EGYPTIAN HIEROGLYPH-14274;Lo;0;L;;;;;N;;;;; +14275;EGYPTIAN HIEROGLYPH-14275;Lo;0;L;;;;;N;;;;; +14276;EGYPTIAN HIEROGLYPH-14276;Lo;0;L;;;;;N;;;;; +14277;EGYPTIAN HIEROGLYPH-14277;Lo;0;L;;;;;N;;;;; +14278;EGYPTIAN HIEROGLYPH-14278;Lo;0;L;;;;;N;;;;; +14279;EGYPTIAN HIEROGLYPH-14279;Lo;0;L;;;;;N;;;;; +1427A;EGYPTIAN HIEROGLYPH-1427A;Lo;0;L;;;;;N;;;;; +1427B;EGYPTIAN HIEROGLYPH-1427B;Lo;0;L;;;;;N;;;;; +1427C;EGYPTIAN HIEROGLYPH-1427C;Lo;0;L;;;;;N;;;;; +1427D;EGYPTIAN HIEROGLYPH-1427D;Lo;0;L;;;;;N;;;;; +1427E;EGYPTIAN HIEROGLYPH-1427E;Lo;0;L;;;;;N;;;;; +1427F;EGYPTIAN HIEROGLYPH-1427F;Lo;0;L;;;;;N;;;;; +14280;EGYPTIAN HIEROGLYPH-14280;Lo;0;L;;;;;N;;;;; +14281;EGYPTIAN HIEROGLYPH-14281;Lo;0;L;;;;;N;;;;; +14282;EGYPTIAN HIEROGLYPH-14282;Lo;0;L;;;;;N;;;;; +14283;EGYPTIAN HIEROGLYPH-14283;Lo;0;L;;;;;N;;;;; +14284;EGYPTIAN HIEROGLYPH-14284;Lo;0;L;;;;;N;;;;; +14285;EGYPTIAN HIEROGLYPH-14285;Lo;0;L;;;;;N;;;;; +14286;EGYPTIAN HIEROGLYPH-14286;Lo;0;L;;;;;N;;;;; +14287;EGYPTIAN HIEROGLYPH-14287;Lo;0;L;;;;;N;;;;; +14288;EGYPTIAN HIEROGLYPH-14288;Lo;0;L;;;;;N;;;;; +14289;EGYPTIAN HIEROGLYPH-14289;Lo;0;L;;;;;N;;;;; +1428A;EGYPTIAN HIEROGLYPH-1428A;Lo;0;L;;;;;N;;;;; +1428B;EGYPTIAN HIEROGLYPH-1428B;Lo;0;L;;;;;N;;;;; +1428C;EGYPTIAN HIEROGLYPH-1428C;Lo;0;L;;;;;N;;;;; +1428D;EGYPTIAN HIEROGLYPH-1428D;Lo;0;L;;;;;N;;;;; +1428E;EGYPTIAN HIEROGLYPH-1428E;Lo;0;L;;;;;N;;;;; +1428F;EGYPTIAN HIEROGLYPH-1428F;Lo;0;L;;;;;N;;;;; +14290;EGYPTIAN HIEROGLYPH-14290;Lo;0;L;;;;;N;;;;; +14291;EGYPTIAN HIEROGLYPH-14291;Lo;0;L;;;;;N;;;;; +14292;EGYPTIAN HIEROGLYPH-14292;Lo;0;L;;;;;N;;;;; +14293;EGYPTIAN HIEROGLYPH-14293;Lo;0;L;;;;;N;;;;; +14294;EGYPTIAN HIEROGLYPH-14294;Lo;0;L;;;;;N;;;;; +14295;EGYPTIAN HIEROGLYPH-14295;Lo;0;L;;;;;N;;;;; +14296;EGYPTIAN HIEROGLYPH-14296;Lo;0;L;;;;;N;;;;; +14297;EGYPTIAN HIEROGLYPH-14297;Lo;0;L;;;;;N;;;;; +14298;EGYPTIAN HIEROGLYPH-14298;Lo;0;L;;;;;N;;;;; +14299;EGYPTIAN HIEROGLYPH-14299;Lo;0;L;;;;;N;;;;; +1429A;EGYPTIAN HIEROGLYPH-1429A;Lo;0;L;;;;;N;;;;; +1429B;EGYPTIAN HIEROGLYPH-1429B;Lo;0;L;;;;;N;;;;; +1429C;EGYPTIAN HIEROGLYPH-1429C;Lo;0;L;;;;;N;;;;; +1429D;EGYPTIAN HIEROGLYPH-1429D;Lo;0;L;;;;;N;;;;; +1429E;EGYPTIAN HIEROGLYPH-1429E;Lo;0;L;;;;;N;;;;; +1429F;EGYPTIAN HIEROGLYPH-1429F;Lo;0;L;;;;;N;;;;; +142A0;EGYPTIAN HIEROGLYPH-142A0;Lo;0;L;;;;;N;;;;; +142A1;EGYPTIAN HIEROGLYPH-142A1;Lo;0;L;;;;;N;;;;; +142A2;EGYPTIAN HIEROGLYPH-142A2;Lo;0;L;;;;;N;;;;; +142A3;EGYPTIAN HIEROGLYPH-142A3;Lo;0;L;;;;;N;;;;; +142A4;EGYPTIAN HIEROGLYPH-142A4;Lo;0;L;;;;;N;;;;; +142A5;EGYPTIAN HIEROGLYPH-142A5;Lo;0;L;;;;;N;;;;; +142A6;EGYPTIAN HIEROGLYPH-142A6;Lo;0;L;;;;;N;;;;; +142A7;EGYPTIAN HIEROGLYPH-142A7;Lo;0;L;;;;;N;;;;; +142A8;EGYPTIAN HIEROGLYPH-142A8;Lo;0;L;;;;;N;;;;; +142A9;EGYPTIAN HIEROGLYPH-142A9;Lo;0;L;;;;;N;;;;; +142AA;EGYPTIAN HIEROGLYPH-142AA;Lo;0;L;;;;;N;;;;; +142AB;EGYPTIAN HIEROGLYPH-142AB;Lo;0;L;;;;;N;;;;; +142AC;EGYPTIAN HIEROGLYPH-142AC;Lo;0;L;;;;;N;;;;; +142AD;EGYPTIAN HIEROGLYPH-142AD;Lo;0;L;;;;;N;;;;; +142AE;EGYPTIAN HIEROGLYPH-142AE;Lo;0;L;;;;;N;;;;; +142AF;EGYPTIAN HIEROGLYPH-142AF;Lo;0;L;;;;;N;;;;; +142B0;EGYPTIAN HIEROGLYPH-142B0;Lo;0;L;;;;;N;;;;; +142B1;EGYPTIAN HIEROGLYPH-142B1;Lo;0;L;;;;;N;;;;; +142B2;EGYPTIAN HIEROGLYPH-142B2;Lo;0;L;;;;;N;;;;; +142B3;EGYPTIAN HIEROGLYPH-142B3;Lo;0;L;;;;;N;;;;; +142B4;EGYPTIAN HIEROGLYPH-142B4;Lo;0;L;;;;;N;;;;; +142B5;EGYPTIAN HIEROGLYPH-142B5;Lo;0;L;;;;;N;;;;; +142B6;EGYPTIAN HIEROGLYPH-142B6;Lo;0;L;;;;;N;;;;; +142B7;EGYPTIAN HIEROGLYPH-142B7;Lo;0;L;;;;;N;;;;; +142B8;EGYPTIAN HIEROGLYPH-142B8;Lo;0;L;;;;;N;;;;; +142B9;EGYPTIAN HIEROGLYPH-142B9;Lo;0;L;;;;;N;;;;; +142BA;EGYPTIAN HIEROGLYPH-142BA;Lo;0;L;;;;;N;;;;; +142BB;EGYPTIAN HIEROGLYPH-142BB;Lo;0;L;;;;;N;;;;; +142BC;EGYPTIAN HIEROGLYPH-142BC;Lo;0;L;;;;;N;;;;; +142BD;EGYPTIAN HIEROGLYPH-142BD;Lo;0;L;;;;;N;;;;; +142BE;EGYPTIAN HIEROGLYPH-142BE;Lo;0;L;;;;;N;;;;; +142BF;EGYPTIAN HIEROGLYPH-142BF;Lo;0;L;;;;;N;;;;; +142C0;EGYPTIAN HIEROGLYPH-142C0;Lo;0;L;;;;;N;;;;; +142C1;EGYPTIAN HIEROGLYPH-142C1;Lo;0;L;;;;;N;;;;; +142C2;EGYPTIAN HIEROGLYPH-142C2;Lo;0;L;;;;;N;;;;; +142C3;EGYPTIAN HIEROGLYPH-142C3;Lo;0;L;;;;;N;;;;; +142C4;EGYPTIAN HIEROGLYPH-142C4;Lo;0;L;;;;;N;;;;; +142C5;EGYPTIAN HIEROGLYPH-142C5;Lo;0;L;;;;;N;;;;; +142C6;EGYPTIAN HIEROGLYPH-142C6;Lo;0;L;;;;;N;;;;; +142C7;EGYPTIAN HIEROGLYPH-142C7;Lo;0;L;;;;;N;;;;; +142C8;EGYPTIAN HIEROGLYPH-142C8;Lo;0;L;;;;;N;;;;; +142C9;EGYPTIAN HIEROGLYPH-142C9;Lo;0;L;;;;;N;;;;; +142CA;EGYPTIAN HIEROGLYPH-142CA;Lo;0;L;;;;;N;;;;; +142CB;EGYPTIAN HIEROGLYPH-142CB;Lo;0;L;;;;;N;;;;; +142CC;EGYPTIAN HIEROGLYPH-142CC;Lo;0;L;;;;;N;;;;; +142CD;EGYPTIAN HIEROGLYPH-142CD;Lo;0;L;;;;;N;;;;; +142CE;EGYPTIAN HIEROGLYPH-142CE;Lo;0;L;;;;;N;;;;; +142CF;EGYPTIAN HIEROGLYPH-142CF;Lo;0;L;;;;;N;;;;; +142D0;EGYPTIAN HIEROGLYPH-142D0;Lo;0;L;;;;;N;;;;; +142D1;EGYPTIAN HIEROGLYPH-142D1;Lo;0;L;;;;;N;;;;; +142D2;EGYPTIAN HIEROGLYPH-142D2;Lo;0;L;;;;;N;;;;; +142D3;EGYPTIAN HIEROGLYPH-142D3;Lo;0;L;;;;;N;;;;; +142D4;EGYPTIAN HIEROGLYPH-142D4;Lo;0;L;;;;;N;;;;; +142D5;EGYPTIAN HIEROGLYPH-142D5;Lo;0;L;;;;;N;;;;; +142D6;EGYPTIAN HIEROGLYPH-142D6;Lo;0;L;;;;;N;;;;; +142D7;EGYPTIAN HIEROGLYPH-142D7;Lo;0;L;;;;;N;;;;; +142D8;EGYPTIAN HIEROGLYPH-142D8;Lo;0;L;;;;;N;;;;; +142D9;EGYPTIAN HIEROGLYPH-142D9;Lo;0;L;;;;;N;;;;; +142DA;EGYPTIAN HIEROGLYPH-142DA;Lo;0;L;;;;;N;;;;; +142DB;EGYPTIAN HIEROGLYPH-142DB;Lo;0;L;;;;;N;;;;; +142DC;EGYPTIAN HIEROGLYPH-142DC;Lo;0;L;;;;;N;;;;; +142DD;EGYPTIAN HIEROGLYPH-142DD;Lo;0;L;;;;;N;;;;; +142DE;EGYPTIAN HIEROGLYPH-142DE;Lo;0;L;;;;;N;;;;; +142DF;EGYPTIAN HIEROGLYPH-142DF;Lo;0;L;;;;;N;;;;; +142E0;EGYPTIAN HIEROGLYPH-142E0;Lo;0;L;;;;;N;;;;; +142E1;EGYPTIAN HIEROGLYPH-142E1;Lo;0;L;;;;;N;;;;; +142E2;EGYPTIAN HIEROGLYPH-142E2;Lo;0;L;;;;;N;;;;; +142E3;EGYPTIAN HIEROGLYPH-142E3;Lo;0;L;;;;;N;;;;; +142E4;EGYPTIAN HIEROGLYPH-142E4;Lo;0;L;;;;;N;;;;; +142E5;EGYPTIAN HIEROGLYPH-142E5;Lo;0;L;;;;;N;;;;; +142E6;EGYPTIAN HIEROGLYPH-142E6;Lo;0;L;;;;;N;;;;; +142E7;EGYPTIAN HIEROGLYPH-142E7;Lo;0;L;;;;;N;;;;; +142E8;EGYPTIAN HIEROGLYPH-142E8;Lo;0;L;;;;;N;;;;; +142E9;EGYPTIAN HIEROGLYPH-142E9;Lo;0;L;;;;;N;;;;; +142EA;EGYPTIAN HIEROGLYPH-142EA;Lo;0;L;;;;;N;;;;; +142EB;EGYPTIAN HIEROGLYPH-142EB;Lo;0;L;;;;;N;;;;; +142EC;EGYPTIAN HIEROGLYPH-142EC;Lo;0;L;;;;;N;;;;; +142ED;EGYPTIAN HIEROGLYPH-142ED;Lo;0;L;;;;;N;;;;; +142EE;EGYPTIAN HIEROGLYPH-142EE;Lo;0;L;;;;;N;;;;; +142EF;EGYPTIAN HIEROGLYPH-142EF;Lo;0;L;;;;;N;;;;; +142F0;EGYPTIAN HIEROGLYPH-142F0;Lo;0;L;;;;;N;;;;; +142F1;EGYPTIAN HIEROGLYPH-142F1;Lo;0;L;;;;;N;;;;; +142F2;EGYPTIAN HIEROGLYPH-142F2;Lo;0;L;;;;;N;;;;; +142F3;EGYPTIAN HIEROGLYPH-142F3;Lo;0;L;;;;;N;;;;; +142F4;EGYPTIAN HIEROGLYPH-142F4;Lo;0;L;;;;;N;;;;; +142F5;EGYPTIAN HIEROGLYPH-142F5;Lo;0;L;;;;;N;;;;; +142F6;EGYPTIAN HIEROGLYPH-142F6;Lo;0;L;;;;;N;;;;; +142F7;EGYPTIAN HIEROGLYPH-142F7;Lo;0;L;;;;;N;;;;; +142F8;EGYPTIAN HIEROGLYPH-142F8;Lo;0;L;;;;;N;;;;; +142F9;EGYPTIAN HIEROGLYPH-142F9;Lo;0;L;;;;;N;;;;; +142FA;EGYPTIAN HIEROGLYPH-142FA;Lo;0;L;;;;;N;;;;; +142FB;EGYPTIAN HIEROGLYPH-142FB;Lo;0;L;;;;;N;;;;; +142FC;EGYPTIAN HIEROGLYPH-142FC;Lo;0;L;;;;;N;;;;; +142FD;EGYPTIAN HIEROGLYPH-142FD;Lo;0;L;;;;;N;;;;; +142FE;EGYPTIAN HIEROGLYPH-142FE;Lo;0;L;;;;;N;;;;; +142FF;EGYPTIAN HIEROGLYPH-142FF;Lo;0;L;;;;;N;;;;; +14300;EGYPTIAN HIEROGLYPH-14300;Lo;0;L;;;;;N;;;;; +14301;EGYPTIAN HIEROGLYPH-14301;Lo;0;L;;;;;N;;;;; +14302;EGYPTIAN HIEROGLYPH-14302;Lo;0;L;;;;;N;;;;; +14303;EGYPTIAN HIEROGLYPH-14303;Lo;0;L;;;;;N;;;;; +14304;EGYPTIAN HIEROGLYPH-14304;Lo;0;L;;;;;N;;;;; +14305;EGYPTIAN HIEROGLYPH-14305;Lo;0;L;;;;;N;;;;; +14306;EGYPTIAN HIEROGLYPH-14306;Lo;0;L;;;;;N;;;;; +14307;EGYPTIAN HIEROGLYPH-14307;Lo;0;L;;;;;N;;;;; +14308;EGYPTIAN HIEROGLYPH-14308;Lo;0;L;;;;;N;;;;; +14309;EGYPTIAN HIEROGLYPH-14309;Lo;0;L;;;;;N;;;;; +1430A;EGYPTIAN HIEROGLYPH-1430A;Lo;0;L;;;;;N;;;;; +1430B;EGYPTIAN HIEROGLYPH-1430B;Lo;0;L;;;;;N;;;;; +1430C;EGYPTIAN HIEROGLYPH-1430C;Lo;0;L;;;;;N;;;;; +1430D;EGYPTIAN HIEROGLYPH-1430D;Lo;0;L;;;;;N;;;;; +1430E;EGYPTIAN HIEROGLYPH-1430E;Lo;0;L;;;;;N;;;;; +1430F;EGYPTIAN HIEROGLYPH-1430F;Lo;0;L;;;;;N;;;;; +14310;EGYPTIAN HIEROGLYPH-14310;Lo;0;L;;;;;N;;;;; +14311;EGYPTIAN HIEROGLYPH-14311;Lo;0;L;;;;;N;;;;; +14312;EGYPTIAN HIEROGLYPH-14312;Lo;0;L;;;;;N;;;;; +14313;EGYPTIAN HIEROGLYPH-14313;Lo;0;L;;;;;N;;;;; +14314;EGYPTIAN HIEROGLYPH-14314;Lo;0;L;;;;;N;;;;; +14315;EGYPTIAN HIEROGLYPH-14315;Lo;0;L;;;;;N;;;;; +14316;EGYPTIAN HIEROGLYPH-14316;Lo;0;L;;;;;N;;;;; +14317;EGYPTIAN HIEROGLYPH-14317;Lo;0;L;;;;;N;;;;; +14318;EGYPTIAN HIEROGLYPH-14318;Lo;0;L;;;;;N;;;;; +14319;EGYPTIAN HIEROGLYPH-14319;Lo;0;L;;;;;N;;;;; +1431A;EGYPTIAN HIEROGLYPH-1431A;Lo;0;L;;;;;N;;;;; +1431B;EGYPTIAN HIEROGLYPH-1431B;Lo;0;L;;;;;N;;;;; +1431C;EGYPTIAN HIEROGLYPH-1431C;Lo;0;L;;;;;N;;;;; +1431D;EGYPTIAN HIEROGLYPH-1431D;Lo;0;L;;;;;N;;;;; +1431E;EGYPTIAN HIEROGLYPH-1431E;Lo;0;L;;;;;N;;;;; +1431F;EGYPTIAN HIEROGLYPH-1431F;Lo;0;L;;;;;N;;;;; +14320;EGYPTIAN HIEROGLYPH-14320;Lo;0;L;;;;;N;;;;; +14321;EGYPTIAN HIEROGLYPH-14321;Lo;0;L;;;;;N;;;;; +14322;EGYPTIAN HIEROGLYPH-14322;Lo;0;L;;;;;N;;;;; +14323;EGYPTIAN HIEROGLYPH-14323;Lo;0;L;;;;;N;;;;; +14324;EGYPTIAN HIEROGLYPH-14324;Lo;0;L;;;;;N;;;;; +14325;EGYPTIAN HIEROGLYPH-14325;Lo;0;L;;;;;N;;;;; +14326;EGYPTIAN HIEROGLYPH-14326;Lo;0;L;;;;;N;;;;; +14327;EGYPTIAN HIEROGLYPH-14327;Lo;0;L;;;;;N;;;;; +14328;EGYPTIAN HIEROGLYPH-14328;Lo;0;L;;;;;N;;;;; +14329;EGYPTIAN HIEROGLYPH-14329;Lo;0;L;;;;;N;;;;; +1432A;EGYPTIAN HIEROGLYPH-1432A;Lo;0;L;;;;;N;;;;; +1432B;EGYPTIAN HIEROGLYPH-1432B;Lo;0;L;;;;;N;;;;; +1432C;EGYPTIAN HIEROGLYPH-1432C;Lo;0;L;;;;;N;;;;; +1432D;EGYPTIAN HIEROGLYPH-1432D;Lo;0;L;;;;;N;;;;; +1432E;EGYPTIAN HIEROGLYPH-1432E;Lo;0;L;;;;;N;;;;; +1432F;EGYPTIAN HIEROGLYPH-1432F;Lo;0;L;;;;;N;;;;; +14330;EGYPTIAN HIEROGLYPH-14330;Lo;0;L;;;;;N;;;;; +14331;EGYPTIAN HIEROGLYPH-14331;Lo;0;L;;;;;N;;;;; +14332;EGYPTIAN HIEROGLYPH-14332;Lo;0;L;;;;;N;;;;; +14333;EGYPTIAN HIEROGLYPH-14333;Lo;0;L;;;;;N;;;;; +14334;EGYPTIAN HIEROGLYPH-14334;Lo;0;L;;;;;N;;;;; +14335;EGYPTIAN HIEROGLYPH-14335;Lo;0;L;;;;;N;;;;; +14336;EGYPTIAN HIEROGLYPH-14336;Lo;0;L;;;;;N;;;;; +14337;EGYPTIAN HIEROGLYPH-14337;Lo;0;L;;;;;N;;;;; +14338;EGYPTIAN HIEROGLYPH-14338;Lo;0;L;;;;;N;;;;; +14339;EGYPTIAN HIEROGLYPH-14339;Lo;0;L;;;;;N;;;;; +1433A;EGYPTIAN HIEROGLYPH-1433A;Lo;0;L;;;;;N;;;;; +1433B;EGYPTIAN HIEROGLYPH-1433B;Lo;0;L;;;;;N;;;;; +1433C;EGYPTIAN HIEROGLYPH-1433C;Lo;0;L;;;;;N;;;;; +1433D;EGYPTIAN HIEROGLYPH-1433D;Lo;0;L;;;;;N;;;;; +1433E;EGYPTIAN HIEROGLYPH-1433E;Lo;0;L;;;;;N;;;;; +1433F;EGYPTIAN HIEROGLYPH-1433F;Lo;0;L;;;;;N;;;;; +14340;EGYPTIAN HIEROGLYPH-14340;Lo;0;L;;;;;N;;;;; +14341;EGYPTIAN HIEROGLYPH-14341;Lo;0;L;;;;;N;;;;; +14342;EGYPTIAN HIEROGLYPH-14342;Lo;0;L;;;;;N;;;;; +14343;EGYPTIAN HIEROGLYPH-14343;Lo;0;L;;;;;N;;;;; +14344;EGYPTIAN HIEROGLYPH-14344;Lo;0;L;;;;;N;;;;; +14345;EGYPTIAN HIEROGLYPH-14345;Lo;0;L;;;;;N;;;;; +14346;EGYPTIAN HIEROGLYPH-14346;Lo;0;L;;;;;N;;;;; +14347;EGYPTIAN HIEROGLYPH-14347;Lo;0;L;;;;;N;;;;; +14348;EGYPTIAN HIEROGLYPH-14348;Lo;0;L;;;;;N;;;;; +14349;EGYPTIAN HIEROGLYPH-14349;Lo;0;L;;;;;N;;;;; +1434A;EGYPTIAN HIEROGLYPH-1434A;Lo;0;L;;;;;N;;;;; +1434B;EGYPTIAN HIEROGLYPH-1434B;Lo;0;L;;;;;N;;;;; +1434C;EGYPTIAN HIEROGLYPH-1434C;Lo;0;L;;;;;N;;;;; +1434D;EGYPTIAN HIEROGLYPH-1434D;Lo;0;L;;;;;N;;;;; +1434E;EGYPTIAN HIEROGLYPH-1434E;Lo;0;L;;;;;N;;;;; +1434F;EGYPTIAN HIEROGLYPH-1434F;Lo;0;L;;;;;N;;;;; +14350;EGYPTIAN HIEROGLYPH-14350;Lo;0;L;;;;;N;;;;; +14351;EGYPTIAN HIEROGLYPH-14351;Lo;0;L;;;;;N;;;;; +14352;EGYPTIAN HIEROGLYPH-14352;Lo;0;L;;;;;N;;;;; +14353;EGYPTIAN HIEROGLYPH-14353;Lo;0;L;;;;;N;;;;; +14354;EGYPTIAN HIEROGLYPH-14354;Lo;0;L;;;;;N;;;;; +14355;EGYPTIAN HIEROGLYPH-14355;Lo;0;L;;;;;N;;;;; +14356;EGYPTIAN HIEROGLYPH-14356;Lo;0;L;;;;;N;;;;; +14357;EGYPTIAN HIEROGLYPH-14357;Lo;0;L;;;;;N;;;;; +14358;EGYPTIAN HIEROGLYPH-14358;Lo;0;L;;;;;N;;;;; +14359;EGYPTIAN HIEROGLYPH-14359;Lo;0;L;;;;;N;;;;; +1435A;EGYPTIAN HIEROGLYPH-1435A;Lo;0;L;;;;;N;;;;; +1435B;EGYPTIAN HIEROGLYPH-1435B;Lo;0;L;;;;;N;;;;; +1435C;EGYPTIAN HIEROGLYPH-1435C;Lo;0;L;;;;;N;;;;; +1435D;EGYPTIAN HIEROGLYPH-1435D;Lo;0;L;;;;;N;;;;; +1435E;EGYPTIAN HIEROGLYPH-1435E;Lo;0;L;;;;;N;;;;; +1435F;EGYPTIAN HIEROGLYPH-1435F;Lo;0;L;;;;;N;;;;; +14360;EGYPTIAN HIEROGLYPH-14360;Lo;0;L;;;;;N;;;;; +14361;EGYPTIAN HIEROGLYPH-14361;Lo;0;L;;;;;N;;;;; +14362;EGYPTIAN HIEROGLYPH-14362;Lo;0;L;;;;;N;;;;; +14363;EGYPTIAN HIEROGLYPH-14363;Lo;0;L;;;;;N;;;;; +14364;EGYPTIAN HIEROGLYPH-14364;Lo;0;L;;;;;N;;;;; +14365;EGYPTIAN HIEROGLYPH-14365;Lo;0;L;;;;;N;;;;; +14366;EGYPTIAN HIEROGLYPH-14366;Lo;0;L;;;;;N;;;;; +14367;EGYPTIAN HIEROGLYPH-14367;Lo;0;L;;;;;N;;;;; +14368;EGYPTIAN HIEROGLYPH-14368;Lo;0;L;;;;;N;;;;; +14369;EGYPTIAN HIEROGLYPH-14369;Lo;0;L;;;;;N;;;;; +1436A;EGYPTIAN HIEROGLYPH-1436A;Lo;0;L;;;;;N;;;;; +1436B;EGYPTIAN HIEROGLYPH-1436B;Lo;0;L;;;;;N;;;;; +1436C;EGYPTIAN HIEROGLYPH-1436C;Lo;0;L;;;;;N;;;;; +1436D;EGYPTIAN HIEROGLYPH-1436D;Lo;0;L;;;;;N;;;;; +1436E;EGYPTIAN HIEROGLYPH-1436E;Lo;0;L;;;;;N;;;;; +1436F;EGYPTIAN HIEROGLYPH-1436F;Lo;0;L;;;;;N;;;;; +14370;EGYPTIAN HIEROGLYPH-14370;Lo;0;L;;;;;N;;;;; +14371;EGYPTIAN HIEROGLYPH-14371;Lo;0;L;;;;;N;;;;; +14372;EGYPTIAN HIEROGLYPH-14372;Lo;0;L;;;;;N;;;;; +14373;EGYPTIAN HIEROGLYPH-14373;Lo;0;L;;;;;N;;;;; +14374;EGYPTIAN HIEROGLYPH-14374;Lo;0;L;;;;;N;;;;; +14375;EGYPTIAN HIEROGLYPH-14375;Lo;0;L;;;;;N;;;;; +14376;EGYPTIAN HIEROGLYPH-14376;Lo;0;L;;;;;N;;;;; +14377;EGYPTIAN HIEROGLYPH-14377;Lo;0;L;;;;;N;;;;; +14378;EGYPTIAN HIEROGLYPH-14378;Lo;0;L;;;;;N;;;;; +14379;EGYPTIAN HIEROGLYPH-14379;Lo;0;L;;;;;N;;;;; +1437A;EGYPTIAN HIEROGLYPH-1437A;Lo;0;L;;;;;N;;;;; +1437B;EGYPTIAN HIEROGLYPH-1437B;Lo;0;L;;;;;N;;;;; +1437C;EGYPTIAN HIEROGLYPH-1437C;Lo;0;L;;;;;N;;;;; +1437D;EGYPTIAN HIEROGLYPH-1437D;Lo;0;L;;;;;N;;;;; +1437E;EGYPTIAN HIEROGLYPH-1437E;Lo;0;L;;;;;N;;;;; +1437F;EGYPTIAN HIEROGLYPH-1437F;Lo;0;L;;;;;N;;;;; +14380;EGYPTIAN HIEROGLYPH-14380;Lo;0;L;;;;;N;;;;; +14381;EGYPTIAN HIEROGLYPH-14381;Lo;0;L;;;;;N;;;;; +14382;EGYPTIAN HIEROGLYPH-14382;Lo;0;L;;;;;N;;;;; +14383;EGYPTIAN HIEROGLYPH-14383;Lo;0;L;;;;;N;;;;; +14384;EGYPTIAN HIEROGLYPH-14384;Lo;0;L;;;;;N;;;;; +14385;EGYPTIAN HIEROGLYPH-14385;Lo;0;L;;;;;N;;;;; +14386;EGYPTIAN HIEROGLYPH-14386;Lo;0;L;;;;;N;;;;; +14387;EGYPTIAN HIEROGLYPH-14387;Lo;0;L;;;;;N;;;;; +14388;EGYPTIAN HIEROGLYPH-14388;Lo;0;L;;;;;N;;;;; +14389;EGYPTIAN HIEROGLYPH-14389;Lo;0;L;;;;;N;;;;; +1438A;EGYPTIAN HIEROGLYPH-1438A;Lo;0;L;;;;;N;;;;; +1438B;EGYPTIAN HIEROGLYPH-1438B;Lo;0;L;;;;;N;;;;; +1438C;EGYPTIAN HIEROGLYPH-1438C;Lo;0;L;;;;;N;;;;; +1438D;EGYPTIAN HIEROGLYPH-1438D;Lo;0;L;;;;;N;;;;; +1438E;EGYPTIAN HIEROGLYPH-1438E;Lo;0;L;;;;;N;;;;; +1438F;EGYPTIAN HIEROGLYPH-1438F;Lo;0;L;;;;;N;;;;; +14390;EGYPTIAN HIEROGLYPH-14390;Lo;0;L;;;;;N;;;;; +14391;EGYPTIAN HIEROGLYPH-14391;Lo;0;L;;;;;N;;;;; +14392;EGYPTIAN HIEROGLYPH-14392;Lo;0;L;;;;;N;;;;; +14393;EGYPTIAN HIEROGLYPH-14393;Lo;0;L;;;;;N;;;;; +14394;EGYPTIAN HIEROGLYPH-14394;Lo;0;L;;;;;N;;;;; +14395;EGYPTIAN HIEROGLYPH-14395;Lo;0;L;;;;;N;;;;; +14396;EGYPTIAN HIEROGLYPH-14396;Lo;0;L;;;;;N;;;;; +14397;EGYPTIAN HIEROGLYPH-14397;Lo;0;L;;;;;N;;;;; +14398;EGYPTIAN HIEROGLYPH-14398;Lo;0;L;;;;;N;;;;; +14399;EGYPTIAN HIEROGLYPH-14399;Lo;0;L;;;;;N;;;;; +1439A;EGYPTIAN HIEROGLYPH-1439A;Lo;0;L;;;;;N;;;;; +1439B;EGYPTIAN HIEROGLYPH-1439B;Lo;0;L;;;;;N;;;;; +1439C;EGYPTIAN HIEROGLYPH-1439C;Lo;0;L;;;;;N;;;;; +1439D;EGYPTIAN HIEROGLYPH-1439D;Lo;0;L;;;;;N;;;;; +1439E;EGYPTIAN HIEROGLYPH-1439E;Lo;0;L;;;;;N;;;;; +1439F;EGYPTIAN HIEROGLYPH-1439F;Lo;0;L;;;;;N;;;;; +143A0;EGYPTIAN HIEROGLYPH-143A0;Lo;0;L;;;;;N;;;;; +143A1;EGYPTIAN HIEROGLYPH-143A1;Lo;0;L;;;;;N;;;;; +143A2;EGYPTIAN HIEROGLYPH-143A2;Lo;0;L;;;;;N;;;;; +143A3;EGYPTIAN HIEROGLYPH-143A3;Lo;0;L;;;;;N;;;;; +143A4;EGYPTIAN HIEROGLYPH-143A4;Lo;0;L;;;;;N;;;;; +143A5;EGYPTIAN HIEROGLYPH-143A5;Lo;0;L;;;;;N;;;;; +143A6;EGYPTIAN HIEROGLYPH-143A6;Lo;0;L;;;;;N;;;;; +143A7;EGYPTIAN HIEROGLYPH-143A7;Lo;0;L;;;;;N;;;;; +143A8;EGYPTIAN HIEROGLYPH-143A8;Lo;0;L;;;;;N;;;;; +143A9;EGYPTIAN HIEROGLYPH-143A9;Lo;0;L;;;;;N;;;;; +143AA;EGYPTIAN HIEROGLYPH-143AA;Lo;0;L;;;;;N;;;;; +143AB;EGYPTIAN HIEROGLYPH-143AB;Lo;0;L;;;;;N;;;;; +143AC;EGYPTIAN HIEROGLYPH-143AC;Lo;0;L;;;;;N;;;;; +143AD;EGYPTIAN HIEROGLYPH-143AD;Lo;0;L;;;;;N;;;;; +143AE;EGYPTIAN HIEROGLYPH-143AE;Lo;0;L;;;;;N;;;;; +143AF;EGYPTIAN HIEROGLYPH-143AF;Lo;0;L;;;;;N;;;;; +143B0;EGYPTIAN HIEROGLYPH-143B0;Lo;0;L;;;;;N;;;;; +143B1;EGYPTIAN HIEROGLYPH-143B1;Lo;0;L;;;;;N;;;;; +143B2;EGYPTIAN HIEROGLYPH-143B2;Lo;0;L;;;;;N;;;;; +143B3;EGYPTIAN HIEROGLYPH-143B3;Lo;0;L;;;;;N;;;;; +143B4;EGYPTIAN HIEROGLYPH-143B4;Lo;0;L;;;;;N;;;;; +143B5;EGYPTIAN HIEROGLYPH-143B5;Lo;0;L;;;;;N;;;;; +143B6;EGYPTIAN HIEROGLYPH-143B6;Lo;0;L;;;;;N;;;;; +143B7;EGYPTIAN HIEROGLYPH-143B7;Lo;0;L;;;;;N;;;;; +143B8;EGYPTIAN HIEROGLYPH-143B8;Lo;0;L;;;;;N;;;;; +143B9;EGYPTIAN HIEROGLYPH-143B9;Lo;0;L;;;;;N;;;;; +143BA;EGYPTIAN HIEROGLYPH-143BA;Lo;0;L;;;;;N;;;;; +143BB;EGYPTIAN HIEROGLYPH-143BB;Lo;0;L;;;;;N;;;;; +143BC;EGYPTIAN HIEROGLYPH-143BC;Lo;0;L;;;;;N;;;;; +143BD;EGYPTIAN HIEROGLYPH-143BD;Lo;0;L;;;;;N;;;;; +143BE;EGYPTIAN HIEROGLYPH-143BE;Lo;0;L;;;;;N;;;;; +143BF;EGYPTIAN HIEROGLYPH-143BF;Lo;0;L;;;;;N;;;;; +143C0;EGYPTIAN HIEROGLYPH-143C0;Lo;0;L;;;;;N;;;;; +143C1;EGYPTIAN HIEROGLYPH-143C1;Lo;0;L;;;;;N;;;;; +143C2;EGYPTIAN HIEROGLYPH-143C2;Lo;0;L;;;;;N;;;;; +143C3;EGYPTIAN HIEROGLYPH-143C3;Lo;0;L;;;;;N;;;;; +143C4;EGYPTIAN HIEROGLYPH-143C4;Lo;0;L;;;;;N;;;;; +143C5;EGYPTIAN HIEROGLYPH-143C5;Lo;0;L;;;;;N;;;;; +143C6;EGYPTIAN HIEROGLYPH-143C6;Lo;0;L;;;;;N;;;;; +143C7;EGYPTIAN HIEROGLYPH-143C7;Lo;0;L;;;;;N;;;;; +143C8;EGYPTIAN HIEROGLYPH-143C8;Lo;0;L;;;;;N;;;;; +143C9;EGYPTIAN HIEROGLYPH-143C9;Lo;0;L;;;;;N;;;;; +143CA;EGYPTIAN HIEROGLYPH-143CA;Lo;0;L;;;;;N;;;;; +143CB;EGYPTIAN HIEROGLYPH-143CB;Lo;0;L;;;;;N;;;;; +143CC;EGYPTIAN HIEROGLYPH-143CC;Lo;0;L;;;;;N;;;;; +143CD;EGYPTIAN HIEROGLYPH-143CD;Lo;0;L;;;;;N;;;;; +143CE;EGYPTIAN HIEROGLYPH-143CE;Lo;0;L;;;;;N;;;;; +143CF;EGYPTIAN HIEROGLYPH-143CF;Lo;0;L;;;;;N;;;;; +143D0;EGYPTIAN HIEROGLYPH-143D0;Lo;0;L;;;;;N;;;;; +143D1;EGYPTIAN HIEROGLYPH-143D1;Lo;0;L;;;;;N;;;;; +143D2;EGYPTIAN HIEROGLYPH-143D2;Lo;0;L;;;;;N;;;;; +143D3;EGYPTIAN HIEROGLYPH-143D3;Lo;0;L;;;;;N;;;;; +143D4;EGYPTIAN HIEROGLYPH-143D4;Lo;0;L;;;;;N;;;;; +143D5;EGYPTIAN HIEROGLYPH-143D5;Lo;0;L;;;;;N;;;;; +143D6;EGYPTIAN HIEROGLYPH-143D6;Lo;0;L;;;;;N;;;;; +143D7;EGYPTIAN HIEROGLYPH-143D7;Lo;0;L;;;;;N;;;;; +143D8;EGYPTIAN HIEROGLYPH-143D8;Lo;0;L;;;;;N;;;;; +143D9;EGYPTIAN HIEROGLYPH-143D9;Lo;0;L;;;;;N;;;;; +143DA;EGYPTIAN HIEROGLYPH-143DA;Lo;0;L;;;;;N;;;;; +143DB;EGYPTIAN HIEROGLYPH-143DB;Lo;0;L;;;;;N;;;;; +143DC;EGYPTIAN HIEROGLYPH-143DC;Lo;0;L;;;;;N;;;;; +143DD;EGYPTIAN HIEROGLYPH-143DD;Lo;0;L;;;;;N;;;;; +143DE;EGYPTIAN HIEROGLYPH-143DE;Lo;0;L;;;;;N;;;;; +143DF;EGYPTIAN HIEROGLYPH-143DF;Lo;0;L;;;;;N;;;;; +143E0;EGYPTIAN HIEROGLYPH-143E0;Lo;0;L;;;;;N;;;;; +143E1;EGYPTIAN HIEROGLYPH-143E1;Lo;0;L;;;;;N;;;;; +143E2;EGYPTIAN HIEROGLYPH-143E2;Lo;0;L;;;;;N;;;;; +143E3;EGYPTIAN HIEROGLYPH-143E3;Lo;0;L;;;;;N;;;;; +143E4;EGYPTIAN HIEROGLYPH-143E4;Lo;0;L;;;;;N;;;;; +143E5;EGYPTIAN HIEROGLYPH-143E5;Lo;0;L;;;;;N;;;;; +143E6;EGYPTIAN HIEROGLYPH-143E6;Lo;0;L;;;;;N;;;;; +143E7;EGYPTIAN HIEROGLYPH-143E7;Lo;0;L;;;;;N;;;;; +143E8;EGYPTIAN HIEROGLYPH-143E8;Lo;0;L;;;;;N;;;;; +143E9;EGYPTIAN HIEROGLYPH-143E9;Lo;0;L;;;;;N;;;;; +143EA;EGYPTIAN HIEROGLYPH-143EA;Lo;0;L;;;;;N;;;;; +143EB;EGYPTIAN HIEROGLYPH-143EB;Lo;0;L;;;;;N;;;;; +143EC;EGYPTIAN HIEROGLYPH-143EC;Lo;0;L;;;;;N;;;;; +143ED;EGYPTIAN HIEROGLYPH-143ED;Lo;0;L;;;;;N;;;;; +143EE;EGYPTIAN HIEROGLYPH-143EE;Lo;0;L;;;;;N;;;;; +143EF;EGYPTIAN HIEROGLYPH-143EF;Lo;0;L;;;;;N;;;;; +143F0;EGYPTIAN HIEROGLYPH-143F0;Lo;0;L;;;;;N;;;;; +143F1;EGYPTIAN HIEROGLYPH-143F1;Lo;0;L;;;;;N;;;;; +143F2;EGYPTIAN HIEROGLYPH-143F2;Lo;0;L;;;;;N;;;;; +143F3;EGYPTIAN HIEROGLYPH-143F3;Lo;0;L;;;;;N;;;;; +143F4;EGYPTIAN HIEROGLYPH-143F4;Lo;0;L;;;;;N;;;;; +143F5;EGYPTIAN HIEROGLYPH-143F5;Lo;0;L;;;;;N;;;;; +143F6;EGYPTIAN HIEROGLYPH-143F6;Lo;0;L;;;;;N;;;;; +143F7;EGYPTIAN HIEROGLYPH-143F7;Lo;0;L;;;;;N;;;;; +143F8;EGYPTIAN HIEROGLYPH-143F8;Lo;0;L;;;;;N;;;;; +143F9;EGYPTIAN HIEROGLYPH-143F9;Lo;0;L;;;;;N;;;;; +143FA;EGYPTIAN HIEROGLYPH-143FA;Lo;0;L;;;;;N;;;;; +14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +14403;ANATOLIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +14404;ANATOLIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +14405;ANATOLIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +14406;ANATOLIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +14407;ANATOLIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +14408;ANATOLIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +14409;ANATOLIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1440A;ANATOLIAN HIEROGLYPH A010A;Lo;0;L;;;;;N;;;;; +1440B;ANATOLIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1440C;ANATOLIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1440D;ANATOLIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +1440E;ANATOLIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +1440F;ANATOLIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +14410;ANATOLIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +14411;ANATOLIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +14412;ANATOLIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +14413;ANATOLIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +14414;ANATOLIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +14415;ANATOLIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +14416;ANATOLIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +14417;ANATOLIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +14418;ANATOLIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +14419;ANATOLIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1441A;ANATOLIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1441B;ANATOLIAN HIEROGLYPH A026A;Lo;0;L;;;;;N;;;;; +1441C;ANATOLIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +1441D;ANATOLIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +1441E;ANATOLIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +1441F;ANATOLIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +14420;ANATOLIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +14421;ANATOLIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +14422;ANATOLIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +14423;ANATOLIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +14424;ANATOLIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +14425;ANATOLIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +14426;ANATOLIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +14427;ANATOLIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +14428;ANATOLIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +14429;ANATOLIAN HIEROGLYPH A039A;Lo;0;L;;;;;N;;;;; +1442A;ANATOLIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1442B;ANATOLIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +1442C;ANATOLIAN HIEROGLYPH A041A;Lo;0;L;;;;;N;;;;; +1442D;ANATOLIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +1442E;ANATOLIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +1442F;ANATOLIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +14430;ANATOLIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +14431;ANATOLIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +14432;ANATOLIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +14433;ANATOLIAN HIEROGLYPH A046A;Lo;0;L;;;;;N;;;;; +14434;ANATOLIAN HIEROGLYPH A046B;Lo;0;L;;;;;N;;;;; +14435;ANATOLIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +14436;ANATOLIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +14437;ANATOLIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +14438;ANATOLIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +14439;ANATOLIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1443A;ANATOLIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1443B;ANATOLIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1443C;ANATOLIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +1443D;ANATOLIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +1443E;ANATOLIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +1443F;ANATOLIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +14440;ANATOLIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +14441;ANATOLIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +14442;ANATOLIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +14443;ANATOLIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +14444;ANATOLIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +14445;ANATOLIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +14446;ANATOLIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +14447;ANATOLIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +14448;ANATOLIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +14449;ANATOLIAN HIEROGLYPH A066A;Lo;0;L;;;;;N;;;;; +1444A;ANATOLIAN HIEROGLYPH A066B;Lo;0;L;;;;;N;;;;; +1444B;ANATOLIAN HIEROGLYPH A066C;Lo;0;L;;;;;N;;;;; +1444C;ANATOLIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1444D;ANATOLIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1444E;ANATOLIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1444F;ANATOLIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +14450;ANATOLIAN HIEROGLYPH A071;Lo;0;L;;;;;N;;;;; +14451;ANATOLIAN HIEROGLYPH A072;Lo;0;L;;;;;N;;;;; +14452;ANATOLIAN HIEROGLYPH A073;Lo;0;L;;;;;N;;;;; +14453;ANATOLIAN HIEROGLYPH A074;Lo;0;L;;;;;N;;;;; +14454;ANATOLIAN HIEROGLYPH A075;Lo;0;L;;;;;N;;;;; +14455;ANATOLIAN HIEROGLYPH A076;Lo;0;L;;;;;N;;;;; +14456;ANATOLIAN HIEROGLYPH A077;Lo;0;L;;;;;N;;;;; +14457;ANATOLIAN HIEROGLYPH A078;Lo;0;L;;;;;N;;;;; +14458;ANATOLIAN HIEROGLYPH A079;Lo;0;L;;;;;N;;;;; +14459;ANATOLIAN HIEROGLYPH A080;Lo;0;L;;;;;N;;;;; +1445A;ANATOLIAN HIEROGLYPH A081;Lo;0;L;;;;;N;;;;; +1445B;ANATOLIAN HIEROGLYPH A082;Lo;0;L;;;;;N;;;;; +1445C;ANATOLIAN HIEROGLYPH A083;Lo;0;L;;;;;N;;;;; +1445D;ANATOLIAN HIEROGLYPH A084;Lo;0;L;;;;;N;;;;; +1445E;ANATOLIAN HIEROGLYPH A085;Lo;0;L;;;;;N;;;;; +1445F;ANATOLIAN HIEROGLYPH A086;Lo;0;L;;;;;N;;;;; +14460;ANATOLIAN HIEROGLYPH A087;Lo;0;L;;;;;N;;;;; +14461;ANATOLIAN HIEROGLYPH A088;Lo;0;L;;;;;N;;;;; +14462;ANATOLIAN HIEROGLYPH A089;Lo;0;L;;;;;N;;;;; +14463;ANATOLIAN HIEROGLYPH A090;Lo;0;L;;;;;N;;;;; +14464;ANATOLIAN HIEROGLYPH A091;Lo;0;L;;;;;N;;;;; +14465;ANATOLIAN HIEROGLYPH A092;Lo;0;L;;;;;N;;;;; +14466;ANATOLIAN HIEROGLYPH A093;Lo;0;L;;;;;N;;;;; +14467;ANATOLIAN HIEROGLYPH A094;Lo;0;L;;;;;N;;;;; +14468;ANATOLIAN HIEROGLYPH A095;Lo;0;L;;;;;N;;;;; +14469;ANATOLIAN HIEROGLYPH A096;Lo;0;L;;;;;N;;;;; +1446A;ANATOLIAN HIEROGLYPH A097;Lo;0;L;;;;;N;;;;; +1446B;ANATOLIAN HIEROGLYPH A097A;Lo;0;L;;;;;N;;;;; +1446C;ANATOLIAN HIEROGLYPH A098;Lo;0;L;;;;;N;;;;; +1446D;ANATOLIAN HIEROGLYPH A098A;Lo;0;L;;;;;N;;;;; +1446E;ANATOLIAN HIEROGLYPH A099;Lo;0;L;;;;;N;;;;; +1446F;ANATOLIAN HIEROGLYPH A100;Lo;0;L;;;;;N;;;;; +14470;ANATOLIAN HIEROGLYPH A100A;Lo;0;L;;;;;N;;;;; +14471;ANATOLIAN HIEROGLYPH A101;Lo;0;L;;;;;N;;;;; +14472;ANATOLIAN HIEROGLYPH A101A;Lo;0;L;;;;;N;;;;; +14473;ANATOLIAN HIEROGLYPH A102;Lo;0;L;;;;;N;;;;; +14474;ANATOLIAN HIEROGLYPH A102A;Lo;0;L;;;;;N;;;;; +14475;ANATOLIAN HIEROGLYPH A103;Lo;0;L;;;;;N;;;;; +14476;ANATOLIAN HIEROGLYPH A104;Lo;0;L;;;;;N;;;;; +14477;ANATOLIAN HIEROGLYPH A104A;Lo;0;L;;;;;N;;;;; +14478;ANATOLIAN HIEROGLYPH A104B;Lo;0;L;;;;;N;;;;; +14479;ANATOLIAN HIEROGLYPH A104C;Lo;0;L;;;;;N;;;;; +1447A;ANATOLIAN HIEROGLYPH A105;Lo;0;L;;;;;N;;;;; +1447B;ANATOLIAN HIEROGLYPH A105A;Lo;0;L;;;;;N;;;;; +1447C;ANATOLIAN HIEROGLYPH A105B;Lo;0;L;;;;;N;;;;; +1447D;ANATOLIAN HIEROGLYPH A106;Lo;0;L;;;;;N;;;;; +1447E;ANATOLIAN HIEROGLYPH A107;Lo;0;L;;;;;N;;;;; +1447F;ANATOLIAN HIEROGLYPH A107A;Lo;0;L;;;;;N;;;;; +14480;ANATOLIAN HIEROGLYPH A107B;Lo;0;L;;;;;N;;;;; +14481;ANATOLIAN HIEROGLYPH A107C;Lo;0;L;;;;;N;;;;; +14482;ANATOLIAN HIEROGLYPH A108;Lo;0;L;;;;;N;;;;; +14483;ANATOLIAN HIEROGLYPH A109;Lo;0;L;;;;;N;;;;; +14484;ANATOLIAN HIEROGLYPH A110;Lo;0;L;;;;;N;;;;; +14485;ANATOLIAN HIEROGLYPH A110A;Lo;0;L;;;;;N;;;;; +14486;ANATOLIAN HIEROGLYPH A110B;Lo;0;L;;;;;N;;;;; +14487;ANATOLIAN HIEROGLYPH A111;Lo;0;L;;;;;N;;;;; +14488;ANATOLIAN HIEROGLYPH A112;Lo;0;L;;;;;N;;;;; +14489;ANATOLIAN HIEROGLYPH A113;Lo;0;L;;;;;N;;;;; +1448A;ANATOLIAN HIEROGLYPH A114;Lo;0;L;;;;;N;;;;; +1448B;ANATOLIAN HIEROGLYPH A115;Lo;0;L;;;;;N;;;;; +1448C;ANATOLIAN HIEROGLYPH A115A;Lo;0;L;;;;;N;;;;; +1448D;ANATOLIAN HIEROGLYPH A116;Lo;0;L;;;;;N;;;;; +1448E;ANATOLIAN HIEROGLYPH A117;Lo;0;L;;;;;N;;;;; +1448F;ANATOLIAN HIEROGLYPH A118;Lo;0;L;;;;;N;;;;; +14490;ANATOLIAN HIEROGLYPH A119;Lo;0;L;;;;;N;;;;; +14491;ANATOLIAN HIEROGLYPH A120;Lo;0;L;;;;;N;;;;; +14492;ANATOLIAN HIEROGLYPH A121;Lo;0;L;;;;;N;;;;; +14493;ANATOLIAN HIEROGLYPH A122;Lo;0;L;;;;;N;;;;; +14494;ANATOLIAN HIEROGLYPH A123;Lo;0;L;;;;;N;;;;; +14495;ANATOLIAN HIEROGLYPH A124;Lo;0;L;;;;;N;;;;; +14496;ANATOLIAN HIEROGLYPH A125;Lo;0;L;;;;;N;;;;; +14497;ANATOLIAN HIEROGLYPH A125A;Lo;0;L;;;;;N;;;;; +14498;ANATOLIAN HIEROGLYPH A126;Lo;0;L;;;;;N;;;;; +14499;ANATOLIAN HIEROGLYPH A127;Lo;0;L;;;;;N;;;;; +1449A;ANATOLIAN HIEROGLYPH A128;Lo;0;L;;;;;N;;;;; +1449B;ANATOLIAN HIEROGLYPH A129;Lo;0;L;;;;;N;;;;; +1449C;ANATOLIAN HIEROGLYPH A130;Lo;0;L;;;;;N;;;;; +1449D;ANATOLIAN HIEROGLYPH A131;Lo;0;L;;;;;N;;;;; +1449E;ANATOLIAN HIEROGLYPH A132;Lo;0;L;;;;;N;;;;; +1449F;ANATOLIAN HIEROGLYPH A133;Lo;0;L;;;;;N;;;;; +144A0;ANATOLIAN HIEROGLYPH A134;Lo;0;L;;;;;N;;;;; +144A1;ANATOLIAN HIEROGLYPH A135;Lo;0;L;;;;;N;;;;; +144A2;ANATOLIAN HIEROGLYPH A135A;Lo;0;L;;;;;N;;;;; +144A3;ANATOLIAN HIEROGLYPH A136;Lo;0;L;;;;;N;;;;; +144A4;ANATOLIAN HIEROGLYPH A137;Lo;0;L;;;;;N;;;;; +144A5;ANATOLIAN HIEROGLYPH A138;Lo;0;L;;;;;N;;;;; +144A6;ANATOLIAN HIEROGLYPH A139;Lo;0;L;;;;;N;;;;; +144A7;ANATOLIAN HIEROGLYPH A140;Lo;0;L;;;;;N;;;;; +144A8;ANATOLIAN HIEROGLYPH A141;Lo;0;L;;;;;N;;;;; +144A9;ANATOLIAN HIEROGLYPH A142;Lo;0;L;;;;;N;;;;; +144AA;ANATOLIAN HIEROGLYPH A143;Lo;0;L;;;;;N;;;;; +144AB;ANATOLIAN HIEROGLYPH A144;Lo;0;L;;;;;N;;;;; +144AC;ANATOLIAN HIEROGLYPH A145;Lo;0;L;;;;;N;;;;; +144AD;ANATOLIAN HIEROGLYPH A146;Lo;0;L;;;;;N;;;;; +144AE;ANATOLIAN HIEROGLYPH A147;Lo;0;L;;;;;N;;;;; +144AF;ANATOLIAN HIEROGLYPH A148;Lo;0;L;;;;;N;;;;; +144B0;ANATOLIAN HIEROGLYPH A149;Lo;0;L;;;;;N;;;;; +144B1;ANATOLIAN HIEROGLYPH A150;Lo;0;L;;;;;N;;;;; +144B2;ANATOLIAN HIEROGLYPH A151;Lo;0;L;;;;;N;;;;; +144B3;ANATOLIAN HIEROGLYPH A152;Lo;0;L;;;;;N;;;;; +144B4;ANATOLIAN HIEROGLYPH A153;Lo;0;L;;;;;N;;;;; +144B5;ANATOLIAN HIEROGLYPH A154;Lo;0;L;;;;;N;;;;; +144B6;ANATOLIAN HIEROGLYPH A155;Lo;0;L;;;;;N;;;;; +144B7;ANATOLIAN HIEROGLYPH A156;Lo;0;L;;;;;N;;;;; +144B8;ANATOLIAN HIEROGLYPH A157;Lo;0;L;;;;;N;;;;; +144B9;ANATOLIAN HIEROGLYPH A158;Lo;0;L;;;;;N;;;;; +144BA;ANATOLIAN HIEROGLYPH A159;Lo;0;L;;;;;N;;;;; +144BB;ANATOLIAN HIEROGLYPH A160;Lo;0;L;;;;;N;;;;; +144BC;ANATOLIAN HIEROGLYPH A161;Lo;0;L;;;;;N;;;;; +144BD;ANATOLIAN HIEROGLYPH A162;Lo;0;L;;;;;N;;;;; +144BE;ANATOLIAN HIEROGLYPH A163;Lo;0;L;;;;;N;;;;; +144BF;ANATOLIAN HIEROGLYPH A164;Lo;0;L;;;;;N;;;;; +144C0;ANATOLIAN HIEROGLYPH A165;Lo;0;L;;;;;N;;;;; +144C1;ANATOLIAN HIEROGLYPH A166;Lo;0;L;;;;;N;;;;; +144C2;ANATOLIAN HIEROGLYPH A167;Lo;0;L;;;;;N;;;;; +144C3;ANATOLIAN HIEROGLYPH A168;Lo;0;L;;;;;N;;;;; +144C4;ANATOLIAN HIEROGLYPH A169;Lo;0;L;;;;;N;;;;; +144C5;ANATOLIAN HIEROGLYPH A170;Lo;0;L;;;;;N;;;;; +144C6;ANATOLIAN HIEROGLYPH A171;Lo;0;L;;;;;N;;;;; +144C7;ANATOLIAN HIEROGLYPH A172;Lo;0;L;;;;;N;;;;; +144C8;ANATOLIAN HIEROGLYPH A173;Lo;0;L;;;;;N;;;;; +144C9;ANATOLIAN HIEROGLYPH A174;Lo;0;L;;;;;N;;;;; +144CA;ANATOLIAN HIEROGLYPH A175;Lo;0;L;;;;;N;;;;; +144CB;ANATOLIAN HIEROGLYPH A176;Lo;0;L;;;;;N;;;;; +144CC;ANATOLIAN HIEROGLYPH A177;Lo;0;L;;;;;N;;;;; +144CD;ANATOLIAN HIEROGLYPH A178;Lo;0;L;;;;;N;;;;; +144CE;ANATOLIAN HIEROGLYPH A179;Lo;0;L;;;;;N;;;;; +144CF;ANATOLIAN HIEROGLYPH A180;Lo;0;L;;;;;N;;;;; +144D0;ANATOLIAN HIEROGLYPH A181;Lo;0;L;;;;;N;;;;; +144D1;ANATOLIAN HIEROGLYPH A182;Lo;0;L;;;;;N;;;;; +144D2;ANATOLIAN HIEROGLYPH A183;Lo;0;L;;;;;N;;;;; +144D3;ANATOLIAN HIEROGLYPH A184;Lo;0;L;;;;;N;;;;; +144D4;ANATOLIAN HIEROGLYPH A185;Lo;0;L;;;;;N;;;;; +144D5;ANATOLIAN HIEROGLYPH A186;Lo;0;L;;;;;N;;;;; +144D6;ANATOLIAN HIEROGLYPH A187;Lo;0;L;;;;;N;;;;; +144D7;ANATOLIAN HIEROGLYPH A188;Lo;0;L;;;;;N;;;;; +144D8;ANATOLIAN HIEROGLYPH A189;Lo;0;L;;;;;N;;;;; +144D9;ANATOLIAN HIEROGLYPH A190;Lo;0;L;;;;;N;;;;; +144DA;ANATOLIAN HIEROGLYPH A191;Lo;0;L;;;;;N;;;;; +144DB;ANATOLIAN HIEROGLYPH A192;Lo;0;L;;;;;N;;;;; +144DC;ANATOLIAN HIEROGLYPH A193;Lo;0;L;;;;;N;;;;; +144DD;ANATOLIAN HIEROGLYPH A194;Lo;0;L;;;;;N;;;;; +144DE;ANATOLIAN HIEROGLYPH A195;Lo;0;L;;;;;N;;;;; +144DF;ANATOLIAN HIEROGLYPH A196;Lo;0;L;;;;;N;;;;; +144E0;ANATOLIAN HIEROGLYPH A197;Lo;0;L;;;;;N;;;;; +144E1;ANATOLIAN HIEROGLYPH A198;Lo;0;L;;;;;N;;;;; +144E2;ANATOLIAN HIEROGLYPH A199;Lo;0;L;;;;;N;;;;; +144E3;ANATOLIAN HIEROGLYPH A200;Lo;0;L;;;;;N;;;;; +144E4;ANATOLIAN HIEROGLYPH A201;Lo;0;L;;;;;N;;;;; +144E5;ANATOLIAN HIEROGLYPH A202;Lo;0;L;;;;;N;;;;; +144E6;ANATOLIAN HIEROGLYPH A202A;Lo;0;L;;;;;N;;;;; +144E7;ANATOLIAN HIEROGLYPH A202B;Lo;0;L;;;;;N;;;;; +144E8;ANATOLIAN HIEROGLYPH A203;Lo;0;L;;;;;N;;;;; +144E9;ANATOLIAN HIEROGLYPH A204;Lo;0;L;;;;;N;;;;; +144EA;ANATOLIAN HIEROGLYPH A205;Lo;0;L;;;;;N;;;;; +144EB;ANATOLIAN HIEROGLYPH A206;Lo;0;L;;;;;N;;;;; +144EC;ANATOLIAN HIEROGLYPH A207;Lo;0;L;;;;;N;;;;; +144ED;ANATOLIAN HIEROGLYPH A207A;Lo;0;L;;;;;N;;;;; +144EE;ANATOLIAN HIEROGLYPH A208;Lo;0;L;;;;;N;;;;; +144EF;ANATOLIAN HIEROGLYPH A209;Lo;0;L;;;;;N;;;;; +144F0;ANATOLIAN HIEROGLYPH A209A;Lo;0;L;;;;;N;;;;; +144F1;ANATOLIAN HIEROGLYPH A210;Lo;0;L;;;;;N;;;;; +144F2;ANATOLIAN HIEROGLYPH A211;Lo;0;L;;;;;N;;;;; +144F3;ANATOLIAN HIEROGLYPH A212;Lo;0;L;;;;;N;;;;; +144F4;ANATOLIAN HIEROGLYPH A213;Lo;0;L;;;;;N;;;;; +144F5;ANATOLIAN HIEROGLYPH A214;Lo;0;L;;;;;N;;;;; +144F6;ANATOLIAN HIEROGLYPH A215;Lo;0;L;;;;;N;;;;; +144F7;ANATOLIAN HIEROGLYPH A215A;Lo;0;L;;;;;N;;;;; +144F8;ANATOLIAN HIEROGLYPH A216;Lo;0;L;;;;;N;;;;; +144F9;ANATOLIAN HIEROGLYPH A216A;Lo;0;L;;;;;N;;;;; +144FA;ANATOLIAN HIEROGLYPH A217;Lo;0;L;;;;;N;;;;; +144FB;ANATOLIAN HIEROGLYPH A218;Lo;0;L;;;;;N;;;;; +144FC;ANATOLIAN HIEROGLYPH A219;Lo;0;L;;;;;N;;;;; +144FD;ANATOLIAN HIEROGLYPH A220;Lo;0;L;;;;;N;;;;; +144FE;ANATOLIAN HIEROGLYPH A221;Lo;0;L;;;;;N;;;;; +144FF;ANATOLIAN HIEROGLYPH A222;Lo;0;L;;;;;N;;;;; +14500;ANATOLIAN HIEROGLYPH A223;Lo;0;L;;;;;N;;;;; +14501;ANATOLIAN HIEROGLYPH A224;Lo;0;L;;;;;N;;;;; +14502;ANATOLIAN HIEROGLYPH A225;Lo;0;L;;;;;N;;;;; +14503;ANATOLIAN HIEROGLYPH A226;Lo;0;L;;;;;N;;;;; +14504;ANATOLIAN HIEROGLYPH A227;Lo;0;L;;;;;N;;;;; +14505;ANATOLIAN HIEROGLYPH A227A;Lo;0;L;;;;;N;;;;; +14506;ANATOLIAN HIEROGLYPH A228;Lo;0;L;;;;;N;;;;; +14507;ANATOLIAN HIEROGLYPH A229;Lo;0;L;;;;;N;;;;; +14508;ANATOLIAN HIEROGLYPH A230;Lo;0;L;;;;;N;;;;; +14509;ANATOLIAN HIEROGLYPH A231;Lo;0;L;;;;;N;;;;; +1450A;ANATOLIAN HIEROGLYPH A232;Lo;0;L;;;;;N;;;;; +1450B;ANATOLIAN HIEROGLYPH A233;Lo;0;L;;;;;N;;;;; +1450C;ANATOLIAN HIEROGLYPH A234;Lo;0;L;;;;;N;;;;; +1450D;ANATOLIAN HIEROGLYPH A235;Lo;0;L;;;;;N;;;;; +1450E;ANATOLIAN HIEROGLYPH A236;Lo;0;L;;;;;N;;;;; +1450F;ANATOLIAN HIEROGLYPH A237;Lo;0;L;;;;;N;;;;; +14510;ANATOLIAN HIEROGLYPH A238;Lo;0;L;;;;;N;;;;; +14511;ANATOLIAN HIEROGLYPH A239;Lo;0;L;;;;;N;;;;; +14512;ANATOLIAN HIEROGLYPH A240;Lo;0;L;;;;;N;;;;; +14513;ANATOLIAN HIEROGLYPH A241;Lo;0;L;;;;;N;;;;; +14514;ANATOLIAN HIEROGLYPH A242;Lo;0;L;;;;;N;;;;; +14515;ANATOLIAN HIEROGLYPH A243;Lo;0;L;;;;;N;;;;; +14516;ANATOLIAN HIEROGLYPH A244;Lo;0;L;;;;;N;;;;; +14517;ANATOLIAN HIEROGLYPH A245;Lo;0;L;;;;;N;;;;; +14518;ANATOLIAN HIEROGLYPH A246;Lo;0;L;;;;;N;;;;; +14519;ANATOLIAN HIEROGLYPH A247;Lo;0;L;;;;;N;;;;; +1451A;ANATOLIAN HIEROGLYPH A248;Lo;0;L;;;;;N;;;;; +1451B;ANATOLIAN HIEROGLYPH A249;Lo;0;L;;;;;N;;;;; +1451C;ANATOLIAN HIEROGLYPH A250;Lo;0;L;;;;;N;;;;; +1451D;ANATOLIAN HIEROGLYPH A251;Lo;0;L;;;;;N;;;;; +1451E;ANATOLIAN HIEROGLYPH A252;Lo;0;L;;;;;N;;;;; +1451F;ANATOLIAN HIEROGLYPH A253;Lo;0;L;;;;;N;;;;; +14520;ANATOLIAN HIEROGLYPH A254;Lo;0;L;;;;;N;;;;; +14521;ANATOLIAN HIEROGLYPH A255;Lo;0;L;;;;;N;;;;; +14522;ANATOLIAN HIEROGLYPH A256;Lo;0;L;;;;;N;;;;; +14523;ANATOLIAN HIEROGLYPH A257;Lo;0;L;;;;;N;;;;; +14524;ANATOLIAN HIEROGLYPH A258;Lo;0;L;;;;;N;;;;; +14525;ANATOLIAN HIEROGLYPH A259;Lo;0;L;;;;;N;;;;; +14526;ANATOLIAN HIEROGLYPH A260;Lo;0;L;;;;;N;;;;; +14527;ANATOLIAN HIEROGLYPH A261;Lo;0;L;;;;;N;;;;; +14528;ANATOLIAN HIEROGLYPH A262;Lo;0;L;;;;;N;;;;; +14529;ANATOLIAN HIEROGLYPH A263;Lo;0;L;;;;;N;;;;; +1452A;ANATOLIAN HIEROGLYPH A264;Lo;0;L;;;;;N;;;;; +1452B;ANATOLIAN HIEROGLYPH A265;Lo;0;L;;;;;N;;;;; +1452C;ANATOLIAN HIEROGLYPH A266;Lo;0;L;;;;;N;;;;; +1452D;ANATOLIAN HIEROGLYPH A267;Lo;0;L;;;;;N;;;;; +1452E;ANATOLIAN HIEROGLYPH A267A;Lo;0;L;;;;;N;;;;; +1452F;ANATOLIAN HIEROGLYPH A268;Lo;0;L;;;;;N;;;;; +14530;ANATOLIAN HIEROGLYPH A269;Lo;0;L;;;;;N;;;;; +14531;ANATOLIAN HIEROGLYPH A270;Lo;0;L;;;;;N;;;;; +14532;ANATOLIAN HIEROGLYPH A271;Lo;0;L;;;;;N;;;;; +14533;ANATOLIAN HIEROGLYPH A272;Lo;0;L;;;;;N;;;;; +14534;ANATOLIAN HIEROGLYPH A273;Lo;0;L;;;;;N;;;;; +14535;ANATOLIAN HIEROGLYPH A274;Lo;0;L;;;;;N;;;;; +14536;ANATOLIAN HIEROGLYPH A275;Lo;0;L;;;;;N;;;;; +14537;ANATOLIAN HIEROGLYPH A276;Lo;0;L;;;;;N;;;;; +14538;ANATOLIAN HIEROGLYPH A277;Lo;0;L;;;;;N;;;;; +14539;ANATOLIAN HIEROGLYPH A278;Lo;0;L;;;;;N;;;;; +1453A;ANATOLIAN HIEROGLYPH A279;Lo;0;L;;;;;N;;;;; +1453B;ANATOLIAN HIEROGLYPH A280;Lo;0;L;;;;;N;;;;; +1453C;ANATOLIAN HIEROGLYPH A281;Lo;0;L;;;;;N;;;;; +1453D;ANATOLIAN HIEROGLYPH A282;Lo;0;L;;;;;N;;;;; +1453E;ANATOLIAN HIEROGLYPH A283;Lo;0;L;;;;;N;;;;; +1453F;ANATOLIAN HIEROGLYPH A284;Lo;0;L;;;;;N;;;;; +14540;ANATOLIAN HIEROGLYPH A285;Lo;0;L;;;;;N;;;;; +14541;ANATOLIAN HIEROGLYPH A286;Lo;0;L;;;;;N;;;;; +14542;ANATOLIAN HIEROGLYPH A287;Lo;0;L;;;;;N;;;;; +14543;ANATOLIAN HIEROGLYPH A288;Lo;0;L;;;;;N;;;;; +14544;ANATOLIAN HIEROGLYPH A289;Lo;0;L;;;;;N;;;;; +14545;ANATOLIAN HIEROGLYPH A289A;Lo;0;L;;;;;N;;;;; +14546;ANATOLIAN HIEROGLYPH A290;Lo;0;L;;;;;N;;;;; +14547;ANATOLIAN HIEROGLYPH A291;Lo;0;L;;;;;N;;;;; +14548;ANATOLIAN HIEROGLYPH A292;Lo;0;L;;;;;N;;;;; +14549;ANATOLIAN HIEROGLYPH A293;Lo;0;L;;;;;N;;;;; +1454A;ANATOLIAN HIEROGLYPH A294;Lo;0;L;;;;;N;;;;; +1454B;ANATOLIAN HIEROGLYPH A294A;Lo;0;L;;;;;N;;;;; +1454C;ANATOLIAN HIEROGLYPH A295;Lo;0;L;;;;;N;;;;; +1454D;ANATOLIAN HIEROGLYPH A296;Lo;0;L;;;;;N;;;;; +1454E;ANATOLIAN HIEROGLYPH A297;Lo;0;L;;;;;N;;;;; +1454F;ANATOLIAN HIEROGLYPH A298;Lo;0;L;;;;;N;;;;; +14550;ANATOLIAN HIEROGLYPH A299;Lo;0;L;;;;;N;;;;; +14551;ANATOLIAN HIEROGLYPH A299A;Lo;0;L;;;;;N;;;;; +14552;ANATOLIAN HIEROGLYPH A300;Lo;0;L;;;;;N;;;;; +14553;ANATOLIAN HIEROGLYPH A301;Lo;0;L;;;;;N;;;;; +14554;ANATOLIAN HIEROGLYPH A302;Lo;0;L;;;;;N;;;;; +14555;ANATOLIAN HIEROGLYPH A303;Lo;0;L;;;;;N;;;;; +14556;ANATOLIAN HIEROGLYPH A304;Lo;0;L;;;;;N;;;;; +14557;ANATOLIAN HIEROGLYPH A305;Lo;0;L;;;;;N;;;;; +14558;ANATOLIAN HIEROGLYPH A306;Lo;0;L;;;;;N;;;;; +14559;ANATOLIAN HIEROGLYPH A307;Lo;0;L;;;;;N;;;;; +1455A;ANATOLIAN HIEROGLYPH A308;Lo;0;L;;;;;N;;;;; +1455B;ANATOLIAN HIEROGLYPH A309;Lo;0;L;;;;;N;;;;; +1455C;ANATOLIAN HIEROGLYPH A309A;Lo;0;L;;;;;N;;;;; +1455D;ANATOLIAN HIEROGLYPH A310;Lo;0;L;;;;;N;;;;; +1455E;ANATOLIAN HIEROGLYPH A311;Lo;0;L;;;;;N;;;;; +1455F;ANATOLIAN HIEROGLYPH A312;Lo;0;L;;;;;N;;;;; +14560;ANATOLIAN HIEROGLYPH A313;Lo;0;L;;;;;N;;;;; +14561;ANATOLIAN HIEROGLYPH A314;Lo;0;L;;;;;N;;;;; +14562;ANATOLIAN HIEROGLYPH A315;Lo;0;L;;;;;N;;;;; +14563;ANATOLIAN HIEROGLYPH A316;Lo;0;L;;;;;N;;;;; +14564;ANATOLIAN HIEROGLYPH A317;Lo;0;L;;;;;N;;;;; +14565;ANATOLIAN HIEROGLYPH A318;Lo;0;L;;;;;N;;;;; +14566;ANATOLIAN HIEROGLYPH A319;Lo;0;L;;;;;N;;;;; +14567;ANATOLIAN HIEROGLYPH A320;Lo;0;L;;;;;N;;;;; +14568;ANATOLIAN HIEROGLYPH A321;Lo;0;L;;;;;N;;;;; +14569;ANATOLIAN HIEROGLYPH A322;Lo;0;L;;;;;N;;;;; +1456A;ANATOLIAN HIEROGLYPH A323;Lo;0;L;;;;;N;;;;; +1456B;ANATOLIAN HIEROGLYPH A324;Lo;0;L;;;;;N;;;;; +1456C;ANATOLIAN HIEROGLYPH A325;Lo;0;L;;;;;N;;;;; +1456D;ANATOLIAN HIEROGLYPH A326;Lo;0;L;;;;;N;;;;; +1456E;ANATOLIAN HIEROGLYPH A327;Lo;0;L;;;;;N;;;;; +1456F;ANATOLIAN HIEROGLYPH A328;Lo;0;L;;;;;N;;;;; +14570;ANATOLIAN HIEROGLYPH A329;Lo;0;L;;;;;N;;;;; +14571;ANATOLIAN HIEROGLYPH A329A;Lo;0;L;;;;;N;;;;; +14572;ANATOLIAN HIEROGLYPH A330;Lo;0;L;;;;;N;;;;; +14573;ANATOLIAN HIEROGLYPH A331;Lo;0;L;;;;;N;;;;; +14574;ANATOLIAN HIEROGLYPH A332A;Lo;0;L;;;;;N;;;;; +14575;ANATOLIAN HIEROGLYPH A332B;Lo;0;L;;;;;N;;;;; +14576;ANATOLIAN HIEROGLYPH A332C;Lo;0;L;;;;;N;;;;; +14577;ANATOLIAN HIEROGLYPH A333;Lo;0;L;;;;;N;;;;; +14578;ANATOLIAN HIEROGLYPH A334;Lo;0;L;;;;;N;;;;; +14579;ANATOLIAN HIEROGLYPH A335;Lo;0;L;;;;;N;;;;; +1457A;ANATOLIAN HIEROGLYPH A336;Lo;0;L;;;;;N;;;;; +1457B;ANATOLIAN HIEROGLYPH A336A;Lo;0;L;;;;;N;;;;; +1457C;ANATOLIAN HIEROGLYPH A336B;Lo;0;L;;;;;N;;;;; +1457D;ANATOLIAN HIEROGLYPH A336C;Lo;0;L;;;;;N;;;;; +1457E;ANATOLIAN HIEROGLYPH A337;Lo;0;L;;;;;N;;;;; +1457F;ANATOLIAN HIEROGLYPH A338;Lo;0;L;;;;;N;;;;; +14580;ANATOLIAN HIEROGLYPH A339;Lo;0;L;;;;;N;;;;; +14581;ANATOLIAN HIEROGLYPH A340;Lo;0;L;;;;;N;;;;; +14582;ANATOLIAN HIEROGLYPH A341;Lo;0;L;;;;;N;;;;; +14583;ANATOLIAN HIEROGLYPH A342;Lo;0;L;;;;;N;;;;; +14584;ANATOLIAN HIEROGLYPH A343;Lo;0;L;;;;;N;;;;; +14585;ANATOLIAN HIEROGLYPH A344;Lo;0;L;;;;;N;;;;; +14586;ANATOLIAN HIEROGLYPH A345;Lo;0;L;;;;;N;;;;; +14587;ANATOLIAN HIEROGLYPH A346;Lo;0;L;;;;;N;;;;; +14588;ANATOLIAN HIEROGLYPH A347;Lo;0;L;;;;;N;;;;; +14589;ANATOLIAN HIEROGLYPH A348;Lo;0;L;;;;;N;;;;; +1458A;ANATOLIAN HIEROGLYPH A349;Lo;0;L;;;;;N;;;;; +1458B;ANATOLIAN HIEROGLYPH A350;Lo;0;L;;;;;N;;;;; +1458C;ANATOLIAN HIEROGLYPH A351;Lo;0;L;;;;;N;;;;; +1458D;ANATOLIAN HIEROGLYPH A352;Lo;0;L;;;;;N;;;;; +1458E;ANATOLIAN HIEROGLYPH A353;Lo;0;L;;;;;N;;;;; +1458F;ANATOLIAN HIEROGLYPH A354;Lo;0;L;;;;;N;;;;; +14590;ANATOLIAN HIEROGLYPH A355;Lo;0;L;;;;;N;;;;; +14591;ANATOLIAN HIEROGLYPH A356;Lo;0;L;;;;;N;;;;; +14592;ANATOLIAN HIEROGLYPH A357;Lo;0;L;;;;;N;;;;; +14593;ANATOLIAN HIEROGLYPH A358;Lo;0;L;;;;;N;;;;; +14594;ANATOLIAN HIEROGLYPH A359;Lo;0;L;;;;;N;;;;; +14595;ANATOLIAN HIEROGLYPH A359A;Lo;0;L;;;;;N;;;;; +14596;ANATOLIAN HIEROGLYPH A360;Lo;0;L;;;;;N;;;;; +14597;ANATOLIAN HIEROGLYPH A361;Lo;0;L;;;;;N;;;;; +14598;ANATOLIAN HIEROGLYPH A362;Lo;0;L;;;;;N;;;;; +14599;ANATOLIAN HIEROGLYPH A363;Lo;0;L;;;;;N;;;;; +1459A;ANATOLIAN HIEROGLYPH A364;Lo;0;L;;;;;N;;;;; +1459B;ANATOLIAN HIEROGLYPH A364A;Lo;0;L;;;;;N;;;;; +1459C;ANATOLIAN HIEROGLYPH A365;Lo;0;L;;;;;N;;;;; +1459D;ANATOLIAN HIEROGLYPH A366;Lo;0;L;;;;;N;;;;; +1459E;ANATOLIAN HIEROGLYPH A367;Lo;0;L;;;;;N;;;;; +1459F;ANATOLIAN HIEROGLYPH A368;Lo;0;L;;;;;N;;;;; +145A0;ANATOLIAN HIEROGLYPH A368A;Lo;0;L;;;;;N;;;;; +145A1;ANATOLIAN HIEROGLYPH A369;Lo;0;L;;;;;N;;;;; +145A2;ANATOLIAN HIEROGLYPH A370;Lo;0;L;;;;;N;;;;; +145A3;ANATOLIAN HIEROGLYPH A371;Lo;0;L;;;;;N;;;;; +145A4;ANATOLIAN HIEROGLYPH A371A;Lo;0;L;;;;;N;;;;; +145A5;ANATOLIAN HIEROGLYPH A372;Lo;0;L;;;;;N;;;;; +145A6;ANATOLIAN HIEROGLYPH A373;Lo;0;L;;;;;N;;;;; +145A7;ANATOLIAN HIEROGLYPH A374;Lo;0;L;;;;;N;;;;; +145A8;ANATOLIAN HIEROGLYPH A375;Lo;0;L;;;;;N;;;;; +145A9;ANATOLIAN HIEROGLYPH A376;Lo;0;L;;;;;N;;;;; +145AA;ANATOLIAN HIEROGLYPH A377;Lo;0;L;;;;;N;;;;; +145AB;ANATOLIAN HIEROGLYPH A378;Lo;0;L;;;;;N;;;;; +145AC;ANATOLIAN HIEROGLYPH A379;Lo;0;L;;;;;N;;;;; +145AD;ANATOLIAN HIEROGLYPH A380;Lo;0;L;;;;;N;;;;; +145AE;ANATOLIAN HIEROGLYPH A381;Lo;0;L;;;;;N;;;;; +145AF;ANATOLIAN HIEROGLYPH A381A;Lo;0;L;;;;;N;;;;; +145B0;ANATOLIAN HIEROGLYPH A382;Lo;0;L;;;;;N;;;;; +145B1;ANATOLIAN HIEROGLYPH A383 RA OR RI;Lo;0;L;;;;;N;;;;; +145B2;ANATOLIAN HIEROGLYPH A383A;Lo;0;L;;;;;N;;;;; +145B3;ANATOLIAN HIEROGLYPH A384;Lo;0;L;;;;;N;;;;; +145B4;ANATOLIAN HIEROGLYPH A385;Lo;0;L;;;;;N;;;;; +145B5;ANATOLIAN HIEROGLYPH A386;Lo;0;L;;;;;N;;;;; +145B6;ANATOLIAN HIEROGLYPH A386A;Lo;0;L;;;;;N;;;;; +145B7;ANATOLIAN HIEROGLYPH A387;Lo;0;L;;;;;N;;;;; +145B8;ANATOLIAN HIEROGLYPH A388;Lo;0;L;;;;;N;;;;; +145B9;ANATOLIAN HIEROGLYPH A389;Lo;0;L;;;;;N;;;;; +145BA;ANATOLIAN HIEROGLYPH A390;Lo;0;L;;;;;N;;;;; +145BB;ANATOLIAN HIEROGLYPH A391;Lo;0;L;;;;;N;;;;; +145BC;ANATOLIAN HIEROGLYPH A392;Lo;0;L;;;;;N;;;;; +145BD;ANATOLIAN HIEROGLYPH A393 EIGHT;Lo;0;L;;;;;N;;;;; +145BE;ANATOLIAN HIEROGLYPH A394;Lo;0;L;;;;;N;;;;; +145BF;ANATOLIAN HIEROGLYPH A395;Lo;0;L;;;;;N;;;;; +145C0;ANATOLIAN HIEROGLYPH A396;Lo;0;L;;;;;N;;;;; +145C1;ANATOLIAN HIEROGLYPH A397;Lo;0;L;;;;;N;;;;; +145C2;ANATOLIAN HIEROGLYPH A398;Lo;0;L;;;;;N;;;;; +145C3;ANATOLIAN HIEROGLYPH A399;Lo;0;L;;;;;N;;;;; +145C4;ANATOLIAN HIEROGLYPH A400;Lo;0;L;;;;;N;;;;; +145C5;ANATOLIAN HIEROGLYPH A401;Lo;0;L;;;;;N;;;;; +145C6;ANATOLIAN HIEROGLYPH A402;Lo;0;L;;;;;N;;;;; +145C7;ANATOLIAN HIEROGLYPH A403;Lo;0;L;;;;;N;;;;; +145C8;ANATOLIAN HIEROGLYPH A404;Lo;0;L;;;;;N;;;;; +145C9;ANATOLIAN HIEROGLYPH A405;Lo;0;L;;;;;N;;;;; +145CA;ANATOLIAN HIEROGLYPH A406;Lo;0;L;;;;;N;;;;; +145CB;ANATOLIAN HIEROGLYPH A407;Lo;0;L;;;;;N;;;;; +145CC;ANATOLIAN HIEROGLYPH A408;Lo;0;L;;;;;N;;;;; +145CD;ANATOLIAN HIEROGLYPH A409;Lo;0;L;;;;;N;;;;; +145CE;ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145CF;ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145D0;ANATOLIAN HIEROGLYPH A411;Lo;0;L;;;;;N;;;;; +145D1;ANATOLIAN HIEROGLYPH A412;Lo;0;L;;;;;N;;;;; +145D2;ANATOLIAN HIEROGLYPH A413;Lo;0;L;;;;;N;;;;; +145D3;ANATOLIAN HIEROGLYPH A414;Lo;0;L;;;;;N;;;;; +145D4;ANATOLIAN HIEROGLYPH A415;Lo;0;L;;;;;N;;;;; +145D5;ANATOLIAN HIEROGLYPH A416;Lo;0;L;;;;;N;;;;; +145D6;ANATOLIAN HIEROGLYPH A417;Lo;0;L;;;;;N;;;;; +145D7;ANATOLIAN HIEROGLYPH A418;Lo;0;L;;;;;N;;;;; +145D8;ANATOLIAN HIEROGLYPH A419;Lo;0;L;;;;;N;;;;; +145D9;ANATOLIAN HIEROGLYPH A420;Lo;0;L;;;;;N;;;;; +145DA;ANATOLIAN HIEROGLYPH A421;Lo;0;L;;;;;N;;;;; +145DB;ANATOLIAN HIEROGLYPH A422;Lo;0;L;;;;;N;;;;; +145DC;ANATOLIAN HIEROGLYPH A423;Lo;0;L;;;;;N;;;;; +145DD;ANATOLIAN HIEROGLYPH A424;Lo;0;L;;;;;N;;;;; +145DE;ANATOLIAN HIEROGLYPH A425;Lo;0;L;;;;;N;;;;; +145DF;ANATOLIAN HIEROGLYPH A426;Lo;0;L;;;;;N;;;;; +145E0;ANATOLIAN HIEROGLYPH A427;Lo;0;L;;;;;N;;;;; +145E1;ANATOLIAN HIEROGLYPH A428;Lo;0;L;;;;;N;;;;; +145E2;ANATOLIAN HIEROGLYPH A429;Lo;0;L;;;;;N;;;;; +145E3;ANATOLIAN HIEROGLYPH A430;Lo;0;L;;;;;N;;;;; +145E4;ANATOLIAN HIEROGLYPH A431;Lo;0;L;;;;;N;;;;; +145E5;ANATOLIAN HIEROGLYPH A432;Lo;0;L;;;;;N;;;;; +145E6;ANATOLIAN HIEROGLYPH A433;Lo;0;L;;;;;N;;;;; +145E7;ANATOLIAN HIEROGLYPH A434;Lo;0;L;;;;;N;;;;; +145E8;ANATOLIAN HIEROGLYPH A435;Lo;0;L;;;;;N;;;;; +145E9;ANATOLIAN HIEROGLYPH A436;Lo;0;L;;;;;N;;;;; +145EA;ANATOLIAN HIEROGLYPH A437;Lo;0;L;;;;;N;;;;; +145EB;ANATOLIAN HIEROGLYPH A438;Lo;0;L;;;;;N;;;;; +145EC;ANATOLIAN HIEROGLYPH A439;Lo;0;L;;;;;N;;;;; +145ED;ANATOLIAN HIEROGLYPH A440;Lo;0;L;;;;;N;;;;; +145EE;ANATOLIAN HIEROGLYPH A441;Lo;0;L;;;;;N;;;;; +145EF;ANATOLIAN HIEROGLYPH A442;Lo;0;L;;;;;N;;;;; +145F0;ANATOLIAN HIEROGLYPH A443;Lo;0;L;;;;;N;;;;; +145F1;ANATOLIAN HIEROGLYPH A444;Lo;0;L;;;;;N;;;;; +145F2;ANATOLIAN HIEROGLYPH A445;Lo;0;L;;;;;N;;;;; +145F3;ANATOLIAN HIEROGLYPH A446;Lo;0;L;;;;;N;;;;; +145F4;ANATOLIAN HIEROGLYPH A447;Lo;0;L;;;;;N;;;;; +145F5;ANATOLIAN HIEROGLYPH A448;Lo;0;L;;;;;N;;;;; +145F6;ANATOLIAN HIEROGLYPH A449;Lo;0;L;;;;;N;;;;; +145F7;ANATOLIAN HIEROGLYPH A450;Lo;0;L;;;;;N;;;;; +145F8;ANATOLIAN HIEROGLYPH A450A;Lo;0;L;;;;;N;;;;; +145F9;ANATOLIAN HIEROGLYPH A451;Lo;0;L;;;;;N;;;;; +145FA;ANATOLIAN HIEROGLYPH A452;Lo;0;L;;;;;N;;;;; +145FB;ANATOLIAN HIEROGLYPH A453;Lo;0;L;;;;;N;;;;; +145FC;ANATOLIAN HIEROGLYPH A454;Lo;0;L;;;;;N;;;;; +145FD;ANATOLIAN HIEROGLYPH A455;Lo;0;L;;;;;N;;;;; +145FE;ANATOLIAN HIEROGLYPH A456;Lo;0;L;;;;;N;;;;; +145FF;ANATOLIAN HIEROGLYPH A457;Lo;0;L;;;;;N;;;;; +14600;ANATOLIAN HIEROGLYPH A457A;Lo;0;L;;;;;N;;;;; +14601;ANATOLIAN HIEROGLYPH A458;Lo;0;L;;;;;N;;;;; +14602;ANATOLIAN HIEROGLYPH A459;Lo;0;L;;;;;N;;;;; +14603;ANATOLIAN HIEROGLYPH A460;Lo;0;L;;;;;N;;;;; +14604;ANATOLIAN HIEROGLYPH A461;Lo;0;L;;;;;N;;;;; +14605;ANATOLIAN HIEROGLYPH A462;Lo;0;L;;;;;N;;;;; +14606;ANATOLIAN HIEROGLYPH A463;Lo;0;L;;;;;N;;;;; +14607;ANATOLIAN HIEROGLYPH A464;Lo;0;L;;;;;N;;;;; +14608;ANATOLIAN HIEROGLYPH A465;Lo;0;L;;;;;N;;;;; +14609;ANATOLIAN HIEROGLYPH A466;Lo;0;L;;;;;N;;;;; +1460A;ANATOLIAN HIEROGLYPH A467;Lo;0;L;;;;;N;;;;; +1460B;ANATOLIAN HIEROGLYPH A468;Lo;0;L;;;;;N;;;;; +1460C;ANATOLIAN HIEROGLYPH A469;Lo;0;L;;;;;N;;;;; +1460D;ANATOLIAN HIEROGLYPH A470;Lo;0;L;;;;;N;;;;; +1460E;ANATOLIAN HIEROGLYPH A471;Lo;0;L;;;;;N;;;;; +1460F;ANATOLIAN HIEROGLYPH A472;Lo;0;L;;;;;N;;;;; +14610;ANATOLIAN HIEROGLYPH A473;Lo;0;L;;;;;N;;;;; +14611;ANATOLIAN HIEROGLYPH A474;Lo;0;L;;;;;N;;;;; +14612;ANATOLIAN HIEROGLYPH A475;Lo;0;L;;;;;N;;;;; +14613;ANATOLIAN HIEROGLYPH A476;Lo;0;L;;;;;N;;;;; +14614;ANATOLIAN HIEROGLYPH A477;Lo;0;L;;;;;N;;;;; +14615;ANATOLIAN HIEROGLYPH A478;Lo;0;L;;;;;N;;;;; +14616;ANATOLIAN HIEROGLYPH A479;Lo;0;L;;;;;N;;;;; +14617;ANATOLIAN HIEROGLYPH A480;Lo;0;L;;;;;N;;;;; +14618;ANATOLIAN HIEROGLYPH A481;Lo;0;L;;;;;N;;;;; +14619;ANATOLIAN HIEROGLYPH A482;Lo;0;L;;;;;N;;;;; +1461A;ANATOLIAN HIEROGLYPH A483;Lo;0;L;;;;;N;;;;; +1461B;ANATOLIAN HIEROGLYPH A484;Lo;0;L;;;;;N;;;;; +1461C;ANATOLIAN HIEROGLYPH A485;Lo;0;L;;;;;N;;;;; +1461D;ANATOLIAN HIEROGLYPH A486;Lo;0;L;;;;;N;;;;; +1461E;ANATOLIAN HIEROGLYPH A487;Lo;0;L;;;;;N;;;;; +1461F;ANATOLIAN HIEROGLYPH A488;Lo;0;L;;;;;N;;;;; +14620;ANATOLIAN HIEROGLYPH A489;Lo;0;L;;;;;N;;;;; +14621;ANATOLIAN HIEROGLYPH A490;Lo;0;L;;;;;N;;;;; +14622;ANATOLIAN HIEROGLYPH A491;Lo;0;L;;;;;N;;;;; +14623;ANATOLIAN HIEROGLYPH A492;Lo;0;L;;;;;N;;;;; +14624;ANATOLIAN HIEROGLYPH A493;Lo;0;L;;;;;N;;;;; +14625;ANATOLIAN HIEROGLYPH A494;Lo;0;L;;;;;N;;;;; +14626;ANATOLIAN HIEROGLYPH A495;Lo;0;L;;;;;N;;;;; +14627;ANATOLIAN HIEROGLYPH A496;Lo;0;L;;;;;N;;;;; +14628;ANATOLIAN HIEROGLYPH A497;Lo;0;L;;;;;N;;;;; +14629;ANATOLIAN HIEROGLYPH A501;Lo;0;L;;;;;N;;;;; +1462A;ANATOLIAN HIEROGLYPH A502;Lo;0;L;;;;;N;;;;; +1462B;ANATOLIAN HIEROGLYPH A503;Lo;0;L;;;;;N;;;;; +1462C;ANATOLIAN HIEROGLYPH A504;Lo;0;L;;;;;N;;;;; +1462D;ANATOLIAN HIEROGLYPH A505;Lo;0;L;;;;;N;;;;; +1462E;ANATOLIAN HIEROGLYPH A506;Lo;0;L;;;;;N;;;;; +1462F;ANATOLIAN HIEROGLYPH A507;Lo;0;L;;;;;N;;;;; +14630;ANATOLIAN HIEROGLYPH A508;Lo;0;L;;;;;N;;;;; +14631;ANATOLIAN HIEROGLYPH A509;Lo;0;L;;;;;N;;;;; +14632;ANATOLIAN HIEROGLYPH A510;Lo;0;L;;;;;N;;;;; +14633;ANATOLIAN HIEROGLYPH A511;Lo;0;L;;;;;N;;;;; +14634;ANATOLIAN HIEROGLYPH A512;Lo;0;L;;;;;N;;;;; +14635;ANATOLIAN HIEROGLYPH A513;Lo;0;L;;;;;N;;;;; +14636;ANATOLIAN HIEROGLYPH A514;Lo;0;L;;;;;N;;;;; +14637;ANATOLIAN HIEROGLYPH A515;Lo;0;L;;;;;N;;;;; +14638;ANATOLIAN HIEROGLYPH A516;Lo;0;L;;;;;N;;;;; +14639;ANATOLIAN HIEROGLYPH A517;Lo;0;L;;;;;N;;;;; +1463A;ANATOLIAN HIEROGLYPH A518;Lo;0;L;;;;;N;;;;; +1463B;ANATOLIAN HIEROGLYPH A519;Lo;0;L;;;;;N;;;;; +1463C;ANATOLIAN HIEROGLYPH A520;Lo;0;L;;;;;N;;;;; +1463D;ANATOLIAN HIEROGLYPH A521;Lo;0;L;;;;;N;;;;; +1463E;ANATOLIAN HIEROGLYPH A522;Lo;0;L;;;;;N;;;;; +1463F;ANATOLIAN HIEROGLYPH A523;Lo;0;L;;;;;N;;;;; +14640;ANATOLIAN HIEROGLYPH A524;Lo;0;L;;;;;N;;;;; +14641;ANATOLIAN HIEROGLYPH A525;Lo;0;L;;;;;N;;;;; +14642;ANATOLIAN HIEROGLYPH A526;Lo;0;L;;;;;N;;;;; +14643;ANATOLIAN HIEROGLYPH A527;Lo;0;L;;;;;N;;;;; +14644;ANATOLIAN HIEROGLYPH A528;Lo;0;L;;;;;N;;;;; +14645;ANATOLIAN HIEROGLYPH A529;Lo;0;L;;;;;N;;;;; +14646;ANATOLIAN HIEROGLYPH A530;Lo;0;L;;;;;N;;;;; +16100;GURUNG KHEMA LETTER A;Lo;0;L;;;;;N;;;;; +16101;GURUNG KHEMA LETTER KA;Lo;0;L;;;;;N;;;;; +16102;GURUNG KHEMA LETTER KHA;Lo;0;L;;;;;N;;;;; +16103;GURUNG KHEMA LETTER GA;Lo;0;L;;;;;N;;;;; +16104;GURUNG KHEMA LETTER GHA;Lo;0;L;;;;;N;;;;; +16105;GURUNG KHEMA LETTER NGA;Lo;0;L;;;;;N;;;;; +16106;GURUNG KHEMA LETTER CA;Lo;0;L;;;;;N;;;;; +16107;GURUNG KHEMA LETTER CHA;Lo;0;L;;;;;N;;;;; +16108;GURUNG KHEMA LETTER JA;Lo;0;L;;;;;N;;;;; +16109;GURUNG KHEMA LETTER JHA;Lo;0;L;;;;;N;;;;; +1610A;GURUNG KHEMA LETTER HA;Lo;0;L;;;;;N;;;;; +1610B;GURUNG KHEMA LETTER TTA;Lo;0;L;;;;;N;;;;; +1610C;GURUNG KHEMA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1610D;GURUNG KHEMA LETTER DDA;Lo;0;L;;;;;N;;;;; +1610E;GURUNG KHEMA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1610F;GURUNG KHEMA LETTER VA;Lo;0;L;;;;;N;;;;; +16110;GURUNG KHEMA LETTER TA;Lo;0;L;;;;;N;;;;; +16111;GURUNG KHEMA LETTER THA;Lo;0;L;;;;;N;;;;; +16112;GURUNG KHEMA LETTER DA;Lo;0;L;;;;;N;;;;; +16113;GURUNG KHEMA LETTER DHA;Lo;0;L;;;;;N;;;;; +16114;GURUNG KHEMA LETTER NA;Lo;0;L;;;;;N;;;;; +16115;GURUNG KHEMA LETTER PA;Lo;0;L;;;;;N;;;;; +16116;GURUNG KHEMA LETTER PHA;Lo;0;L;;;;;N;;;;; +16117;GURUNG KHEMA LETTER BA;Lo;0;L;;;;;N;;;;; +16118;GURUNG KHEMA LETTER BHA;Lo;0;L;;;;;N;;;;; +16119;GURUNG KHEMA LETTER MA;Lo;0;L;;;;;N;;;;; +1611A;GURUNG KHEMA LETTER YA;Lo;0;L;;;;;N;;;;; +1611B;GURUNG KHEMA LETTER RA;Lo;0;L;;;;;N;;;;; +1611C;GURUNG KHEMA LETTER LA;Lo;0;L;;;;;N;;;;; +1611D;GURUNG KHEMA LETTER SA;Lo;0;L;;;;;N;;;;; +1611E;GURUNG KHEMA VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +1611F;GURUNG KHEMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +16120;GURUNG KHEMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +16121;GURUNG KHEMA VOWEL SIGN U;Mn;0;NSM;1611E 1611E;;;;N;;;;; +16122;GURUNG KHEMA VOWEL SIGN UU;Mn;0;NSM;1611E 16129;;;;N;;;;; +16123;GURUNG KHEMA VOWEL SIGN E;Mn;0;NSM;1611E 1611F;;;;N;;;;; +16124;GURUNG KHEMA VOWEL SIGN EE;Mn;0;NSM;16129 1611F;;;;N;;;;; +16125;GURUNG KHEMA VOWEL SIGN AI;Mn;0;NSM;1611E 16120;;;;N;;;;; +16126;GURUNG KHEMA VOWEL SIGN O;Mn;0;NSM;16121 1611F;;;;N;;;;; +16127;GURUNG KHEMA VOWEL SIGN OO;Mn;0;NSM;16122 1611F;;;;N;;;;; +16128;GURUNG KHEMA VOWEL SIGN AU;Mn;0;NSM;16121 16120;;;;N;;;;; +16129;GURUNG KHEMA VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +1612A;GURUNG KHEMA CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +1612B;GURUNG KHEMA CONSONANT SIGN MEDIAL VA;Mc;0;L;;;;;N;;;;; +1612C;GURUNG KHEMA CONSONANT SIGN MEDIAL HA;Mc;0;L;;;;;N;;;;; +1612D;GURUNG KHEMA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1612E;GURUNG KHEMA CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;; +1612F;GURUNG KHEMA SIGN THOLHOMA;Mn;9;NSM;;;;;N;;;;; +16130;GURUNG KHEMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16131;GURUNG KHEMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16132;GURUNG KHEMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16133;GURUNG KHEMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16134;GURUNG KHEMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16135;GURUNG KHEMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16136;GURUNG KHEMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16137;GURUNG KHEMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16138;GURUNG KHEMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16139;GURUNG KHEMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; +16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; +16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +16803;BAMUM LETTER PHASE-A PON MFON PIPAEMBA;Lo;0;L;;;;;N;;;;; +16804;BAMUM LETTER PHASE-A NAA MFON;Lo;0;L;;;;;N;;;;; +16805;BAMUM LETTER PHASE-A SHUENSHUET;Lo;0;L;;;;;N;;;;; +16806;BAMUM LETTER PHASE-A TITA MFON;Lo;0;L;;;;;N;;;;; +16807;BAMUM LETTER PHASE-A NZA MFON;Lo;0;L;;;;;N;;;;; +16808;BAMUM LETTER PHASE-A SHINDA PA NJI;Lo;0;L;;;;;N;;;;; +16809;BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +1680A;BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA;Lo;0;L;;;;;N;;;;; +1680B;BAMUM LETTER PHASE-A MAEMBGBIEE;Lo;0;L;;;;;N;;;;; +1680C;BAMUM LETTER PHASE-A TU MAEMBA;Lo;0;L;;;;;N;;;;; +1680D;BAMUM LETTER PHASE-A NGANGU;Lo;0;L;;;;;N;;;;; +1680E;BAMUM LETTER PHASE-A MAEMVEUX;Lo;0;L;;;;;N;;;;; +1680F;BAMUM LETTER PHASE-A MANSUAE;Lo;0;L;;;;;N;;;;; +16810;BAMUM LETTER PHASE-A MVEUAENGAM;Lo;0;L;;;;;N;;;;; +16811;BAMUM LETTER PHASE-A SEUNYAM;Lo;0;L;;;;;N;;;;; +16812;BAMUM LETTER PHASE-A NTOQPEN;Lo;0;L;;;;;N;;;;; +16813;BAMUM LETTER PHASE-A KEUKEUTNDA;Lo;0;L;;;;;N;;;;; +16814;BAMUM LETTER PHASE-A NKINDI;Lo;0;L;;;;;N;;;;; +16815;BAMUM LETTER PHASE-A SUU;Lo;0;L;;;;;N;;;;; +16816;BAMUM LETTER PHASE-A NGKUENZEUM;Lo;0;L;;;;;N;;;;; +16817;BAMUM LETTER PHASE-A LAPAQ;Lo;0;L;;;;;N;;;;; +16818;BAMUM LETTER PHASE-A LET KUT;Lo;0;L;;;;;N;;;;; +16819;BAMUM LETTER PHASE-A NTAP MFAA;Lo;0;L;;;;;N;;;;; +1681A;BAMUM LETTER PHASE-A MAEKEUP;Lo;0;L;;;;;N;;;;; +1681B;BAMUM LETTER PHASE-A PASHAE;Lo;0;L;;;;;N;;;;; +1681C;BAMUM LETTER PHASE-A GHEUAERAE;Lo;0;L;;;;;N;;;;; +1681D;BAMUM LETTER PHASE-A PAMSHAE;Lo;0;L;;;;;N;;;;; +1681E;BAMUM LETTER PHASE-A MON NGGEUAET;Lo;0;L;;;;;N;;;;; +1681F;BAMUM LETTER PHASE-A NZUN MEUT;Lo;0;L;;;;;N;;;;; +16820;BAMUM LETTER PHASE-A U YUQ NAE;Lo;0;L;;;;;N;;;;; +16821;BAMUM LETTER PHASE-A GHEUAEGHEUAE;Lo;0;L;;;;;N;;;;; +16822;BAMUM LETTER PHASE-A NTAP NTAA;Lo;0;L;;;;;N;;;;; +16823;BAMUM LETTER PHASE-A SISA;Lo;0;L;;;;;N;;;;; +16824;BAMUM LETTER PHASE-A MGBASA;Lo;0;L;;;;;N;;;;; +16825;BAMUM LETTER PHASE-A MEUNJOMNDEUQ;Lo;0;L;;;;;N;;;;; +16826;BAMUM LETTER PHASE-A MOOMPUQ;Lo;0;L;;;;;N;;;;; +16827;BAMUM LETTER PHASE-A KAFA;Lo;0;L;;;;;N;;;;; +16828;BAMUM LETTER PHASE-A PA LEERAEWA;Lo;0;L;;;;;N;;;;; +16829;BAMUM LETTER PHASE-A NDA LEERAEWA;Lo;0;L;;;;;N;;;;; +1682A;BAMUM LETTER PHASE-A PET;Lo;0;L;;;;;N;;;;; +1682B;BAMUM LETTER PHASE-A MAEMKPEN;Lo;0;L;;;;;N;;;;; +1682C;BAMUM LETTER PHASE-A NIKA;Lo;0;L;;;;;N;;;;; +1682D;BAMUM LETTER PHASE-A PUP;Lo;0;L;;;;;N;;;;; +1682E;BAMUM LETTER PHASE-A TUAEP;Lo;0;L;;;;;N;;;;; +1682F;BAMUM LETTER PHASE-A LUAEP;Lo;0;L;;;;;N;;;;; +16830;BAMUM LETTER PHASE-A SONJAM;Lo;0;L;;;;;N;;;;; +16831;BAMUM LETTER PHASE-A TEUTEUWEN;Lo;0;L;;;;;N;;;;; +16832;BAMUM LETTER PHASE-A MAENYI;Lo;0;L;;;;;N;;;;; +16833;BAMUM LETTER PHASE-A KET;Lo;0;L;;;;;N;;;;; +16834;BAMUM LETTER PHASE-A NDAANGGEUAET;Lo;0;L;;;;;N;;;;; +16835;BAMUM LETTER PHASE-A KUOQ;Lo;0;L;;;;;N;;;;; +16836;BAMUM LETTER PHASE-A MOOMEUT;Lo;0;L;;;;;N;;;;; +16837;BAMUM LETTER PHASE-A SHUM;Lo;0;L;;;;;N;;;;; +16838;BAMUM LETTER PHASE-A LOMMAE;Lo;0;L;;;;;N;;;;; +16839;BAMUM LETTER PHASE-A FIRI;Lo;0;L;;;;;N;;;;; +1683A;BAMUM LETTER PHASE-A ROM;Lo;0;L;;;;;N;;;;; +1683B;BAMUM LETTER PHASE-A KPOQ;Lo;0;L;;;;;N;;;;; +1683C;BAMUM LETTER PHASE-A SOQ;Lo;0;L;;;;;N;;;;; +1683D;BAMUM LETTER PHASE-A MAP PIEET;Lo;0;L;;;;;N;;;;; +1683E;BAMUM LETTER PHASE-A SHIRAE;Lo;0;L;;;;;N;;;;; +1683F;BAMUM LETTER PHASE-A NTAP;Lo;0;L;;;;;N;;;;; +16840;BAMUM LETTER PHASE-A SHOQ NSHUT YUM;Lo;0;L;;;;;N;;;;; +16841;BAMUM LETTER PHASE-A NYIT MONGKEUAEQ;Lo;0;L;;;;;N;;;;; +16842;BAMUM LETTER PHASE-A PAARAE;Lo;0;L;;;;;N;;;;; +16843;BAMUM LETTER PHASE-A NKAARAE;Lo;0;L;;;;;N;;;;; +16844;BAMUM LETTER PHASE-A UNKNOWN;Lo;0;L;;;;;N;;;;; +16845;BAMUM LETTER PHASE-A NGGEN;Lo;0;L;;;;;N;;;;; +16846;BAMUM LETTER PHASE-A MAESI;Lo;0;L;;;;;N;;;;; +16847;BAMUM LETTER PHASE-A NJAM;Lo;0;L;;;;;N;;;;; +16848;BAMUM LETTER PHASE-A MBANYI;Lo;0;L;;;;;N;;;;; +16849;BAMUM LETTER PHASE-A NYET;Lo;0;L;;;;;N;;;;; +1684A;BAMUM LETTER PHASE-A TEUAEN;Lo;0;L;;;;;N;;;;; +1684B;BAMUM LETTER PHASE-A SOT;Lo;0;L;;;;;N;;;;; +1684C;BAMUM LETTER PHASE-A PAAM;Lo;0;L;;;;;N;;;;; +1684D;BAMUM LETTER PHASE-A NSHIEE;Lo;0;L;;;;;N;;;;; +1684E;BAMUM LETTER PHASE-A MAEM;Lo;0;L;;;;;N;;;;; +1684F;BAMUM LETTER PHASE-A NYI;Lo;0;L;;;;;N;;;;; +16850;BAMUM LETTER PHASE-A KAQ;Lo;0;L;;;;;N;;;;; +16851;BAMUM LETTER PHASE-A NSHA;Lo;0;L;;;;;N;;;;; +16852;BAMUM LETTER PHASE-A VEE;Lo;0;L;;;;;N;;;;; +16853;BAMUM LETTER PHASE-A LU;Lo;0;L;;;;;N;;;;; +16854;BAMUM LETTER PHASE-A NEN;Lo;0;L;;;;;N;;;;; +16855;BAMUM LETTER PHASE-A NAQ;Lo;0;L;;;;;N;;;;; +16856;BAMUM LETTER PHASE-A MBAQ;Lo;0;L;;;;;N;;;;; +16857;BAMUM LETTER PHASE-B NSHUET;Lo;0;L;;;;;N;;;;; +16858;BAMUM LETTER PHASE-B TU MAEMGBIEE;Lo;0;L;;;;;N;;;;; +16859;BAMUM LETTER PHASE-B SIEE;Lo;0;L;;;;;N;;;;; +1685A;BAMUM LETTER PHASE-B SET TU;Lo;0;L;;;;;N;;;;; +1685B;BAMUM LETTER PHASE-B LOM NTEUM;Lo;0;L;;;;;N;;;;; +1685C;BAMUM LETTER PHASE-B MBA MAELEE;Lo;0;L;;;;;N;;;;; +1685D;BAMUM LETTER PHASE-B KIEEM;Lo;0;L;;;;;N;;;;; +1685E;BAMUM LETTER PHASE-B YEURAE;Lo;0;L;;;;;N;;;;; +1685F;BAMUM LETTER PHASE-B MBAARAE;Lo;0;L;;;;;N;;;;; +16860;BAMUM LETTER PHASE-B KAM;Lo;0;L;;;;;N;;;;; +16861;BAMUM LETTER PHASE-B PEESHI;Lo;0;L;;;;;N;;;;; +16862;BAMUM LETTER PHASE-B YAFU LEERAEWA;Lo;0;L;;;;;N;;;;; +16863;BAMUM LETTER PHASE-B LAM NSHUT NYAM;Lo;0;L;;;;;N;;;;; +16864;BAMUM LETTER PHASE-B NTIEE SHEUOQ;Lo;0;L;;;;;N;;;;; +16865;BAMUM LETTER PHASE-B NDU NJAA;Lo;0;L;;;;;N;;;;; +16866;BAMUM LETTER PHASE-B GHEUGHEUAEM;Lo;0;L;;;;;N;;;;; +16867;BAMUM LETTER PHASE-B PIT;Lo;0;L;;;;;N;;;;; +16868;BAMUM LETTER PHASE-B TU NSIEE;Lo;0;L;;;;;N;;;;; +16869;BAMUM LETTER PHASE-B SHET NJAQ;Lo;0;L;;;;;N;;;;; +1686A;BAMUM LETTER PHASE-B SHEUAEQTU;Lo;0;L;;;;;N;;;;; +1686B;BAMUM LETTER PHASE-B MFON TEUAEQ;Lo;0;L;;;;;N;;;;; +1686C;BAMUM LETTER PHASE-B MBIT MBAAKET;Lo;0;L;;;;;N;;;;; +1686D;BAMUM LETTER PHASE-B NYI NTEUM;Lo;0;L;;;;;N;;;;; +1686E;BAMUM LETTER PHASE-B KEUPUQ;Lo;0;L;;;;;N;;;;; +1686F;BAMUM LETTER PHASE-B GHEUGHEN;Lo;0;L;;;;;N;;;;; +16870;BAMUM LETTER PHASE-B KEUYEUX;Lo;0;L;;;;;N;;;;; +16871;BAMUM LETTER PHASE-B LAANAE;Lo;0;L;;;;;N;;;;; +16872;BAMUM LETTER PHASE-B PARUM;Lo;0;L;;;;;N;;;;; +16873;BAMUM LETTER PHASE-B VEUM;Lo;0;L;;;;;N;;;;; +16874;BAMUM LETTER PHASE-B NGKINDI MVOP;Lo;0;L;;;;;N;;;;; +16875;BAMUM LETTER PHASE-B NGGEU MBU;Lo;0;L;;;;;N;;;;; +16876;BAMUM LETTER PHASE-B WUAET;Lo;0;L;;;;;N;;;;; +16877;BAMUM LETTER PHASE-B SAKEUAE;Lo;0;L;;;;;N;;;;; +16878;BAMUM LETTER PHASE-B TAAM;Lo;0;L;;;;;N;;;;; +16879;BAMUM LETTER PHASE-B MEUQ;Lo;0;L;;;;;N;;;;; +1687A;BAMUM LETTER PHASE-B NGGUOQ;Lo;0;L;;;;;N;;;;; +1687B;BAMUM LETTER PHASE-B NGGUOQ LARGE;Lo;0;L;;;;;N;;;;; +1687C;BAMUM LETTER PHASE-B MFIYAQ;Lo;0;L;;;;;N;;;;; +1687D;BAMUM LETTER PHASE-B SUE;Lo;0;L;;;;;N;;;;; +1687E;BAMUM LETTER PHASE-B MBEURI;Lo;0;L;;;;;N;;;;; +1687F;BAMUM LETTER PHASE-B MONTIEEN;Lo;0;L;;;;;N;;;;; +16880;BAMUM LETTER PHASE-B NYAEMAE;Lo;0;L;;;;;N;;;;; +16881;BAMUM LETTER PHASE-B PUNGAAM;Lo;0;L;;;;;N;;;;; +16882;BAMUM LETTER PHASE-B MEUT NGGEET;Lo;0;L;;;;;N;;;;; +16883;BAMUM LETTER PHASE-B FEUX;Lo;0;L;;;;;N;;;;; +16884;BAMUM LETTER PHASE-B MBUOQ;Lo;0;L;;;;;N;;;;; +16885;BAMUM LETTER PHASE-B FEE;Lo;0;L;;;;;N;;;;; +16886;BAMUM LETTER PHASE-B KEUAEM;Lo;0;L;;;;;N;;;;; +16887;BAMUM LETTER PHASE-B MA NJEUAENA;Lo;0;L;;;;;N;;;;; +16888;BAMUM LETTER PHASE-B MA NJUQA;Lo;0;L;;;;;N;;;;; +16889;BAMUM LETTER PHASE-B LET;Lo;0;L;;;;;N;;;;; +1688A;BAMUM LETTER PHASE-B NGGAAM;Lo;0;L;;;;;N;;;;; +1688B;BAMUM LETTER PHASE-B NSEN;Lo;0;L;;;;;N;;;;; +1688C;BAMUM LETTER PHASE-B MA;Lo;0;L;;;;;N;;;;; +1688D;BAMUM LETTER PHASE-B KIQ;Lo;0;L;;;;;N;;;;; +1688E;BAMUM LETTER PHASE-B NGOM;Lo;0;L;;;;;N;;;;; +1688F;BAMUM LETTER PHASE-C NGKUE MAEMBA;Lo;0;L;;;;;N;;;;; +16890;BAMUM LETTER PHASE-C NZA;Lo;0;L;;;;;N;;;;; +16891;BAMUM LETTER PHASE-C YUM;Lo;0;L;;;;;N;;;;; +16892;BAMUM LETTER PHASE-C WANGKUOQ;Lo;0;L;;;;;N;;;;; +16893;BAMUM LETTER PHASE-C NGGEN;Lo;0;L;;;;;N;;;;; +16894;BAMUM LETTER PHASE-C NDEUAEREE;Lo;0;L;;;;;N;;;;; +16895;BAMUM LETTER PHASE-C NGKAQ;Lo;0;L;;;;;N;;;;; +16896;BAMUM LETTER PHASE-C GHARAE;Lo;0;L;;;;;N;;;;; +16897;BAMUM LETTER PHASE-C MBEEKEET;Lo;0;L;;;;;N;;;;; +16898;BAMUM LETTER PHASE-C GBAYI;Lo;0;L;;;;;N;;;;; +16899;BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN;Lo;0;L;;;;;N;;;;; +1689A;BAMUM LETTER PHASE-C NTU MBIT;Lo;0;L;;;;;N;;;;; +1689B;BAMUM LETTER PHASE-C MBEUM;Lo;0;L;;;;;N;;;;; +1689C;BAMUM LETTER PHASE-C PIRIEEN;Lo;0;L;;;;;N;;;;; +1689D;BAMUM LETTER PHASE-C NDOMBU;Lo;0;L;;;;;N;;;;; +1689E;BAMUM LETTER PHASE-C MBAA CABBAGE-TREE;Lo;0;L;;;;;N;;;;; +1689F;BAMUM LETTER PHASE-C KEUSHEUAEP;Lo;0;L;;;;;N;;;;; +168A0;BAMUM LETTER PHASE-C GHAP;Lo;0;L;;;;;N;;;;; +168A1;BAMUM LETTER PHASE-C KEUKAQ;Lo;0;L;;;;;N;;;;; +168A2;BAMUM LETTER PHASE-C YU MUOMAE;Lo;0;L;;;;;N;;;;; +168A3;BAMUM LETTER PHASE-C NZEUM;Lo;0;L;;;;;N;;;;; +168A4;BAMUM LETTER PHASE-C MBUE;Lo;0;L;;;;;N;;;;; +168A5;BAMUM LETTER PHASE-C NSEUAEN;Lo;0;L;;;;;N;;;;; +168A6;BAMUM LETTER PHASE-C MBIT;Lo;0;L;;;;;N;;;;; +168A7;BAMUM LETTER PHASE-C YEUQ;Lo;0;L;;;;;N;;;;; +168A8;BAMUM LETTER PHASE-C KPARAQ;Lo;0;L;;;;;N;;;;; +168A9;BAMUM LETTER PHASE-C KAA;Lo;0;L;;;;;N;;;;; +168AA;BAMUM LETTER PHASE-C SEUX;Lo;0;L;;;;;N;;;;; +168AB;BAMUM LETTER PHASE-C NDIDA;Lo;0;L;;;;;N;;;;; +168AC;BAMUM LETTER PHASE-C TAASHAE;Lo;0;L;;;;;N;;;;; +168AD;BAMUM LETTER PHASE-C NJUEQ;Lo;0;L;;;;;N;;;;; +168AE;BAMUM LETTER PHASE-C TITA YUE;Lo;0;L;;;;;N;;;;; +168AF;BAMUM LETTER PHASE-C SUAET;Lo;0;L;;;;;N;;;;; +168B0;BAMUM LETTER PHASE-C NGGUAEN NYAM;Lo;0;L;;;;;N;;;;; +168B1;BAMUM LETTER PHASE-C VEUX;Lo;0;L;;;;;N;;;;; +168B2;BAMUM LETTER PHASE-C NANSANAQ;Lo;0;L;;;;;N;;;;; +168B3;BAMUM LETTER PHASE-C MA KEUAERI;Lo;0;L;;;;;N;;;;; +168B4;BAMUM LETTER PHASE-C NTAA;Lo;0;L;;;;;N;;;;; +168B5;BAMUM LETTER PHASE-C NGGUON;Lo;0;L;;;;;N;;;;; +168B6;BAMUM LETTER PHASE-C LAP;Lo;0;L;;;;;N;;;;; +168B7;BAMUM LETTER PHASE-C MBIRIEEN;Lo;0;L;;;;;N;;;;; +168B8;BAMUM LETTER PHASE-C MGBASAQ;Lo;0;L;;;;;N;;;;; +168B9;BAMUM LETTER PHASE-C NTEUNGBA;Lo;0;L;;;;;N;;;;; +168BA;BAMUM LETTER PHASE-C TEUTEUX;Lo;0;L;;;;;N;;;;; +168BB;BAMUM LETTER PHASE-C NGGUM;Lo;0;L;;;;;N;;;;; +168BC;BAMUM LETTER PHASE-C FUE;Lo;0;L;;;;;N;;;;; +168BD;BAMUM LETTER PHASE-C NDEUT;Lo;0;L;;;;;N;;;;; +168BE;BAMUM LETTER PHASE-C NSA;Lo;0;L;;;;;N;;;;; +168BF;BAMUM LETTER PHASE-C NSHAQ;Lo;0;L;;;;;N;;;;; +168C0;BAMUM LETTER PHASE-C BUNG;Lo;0;L;;;;;N;;;;; +168C1;BAMUM LETTER PHASE-C VEUAEPEN;Lo;0;L;;;;;N;;;;; +168C2;BAMUM LETTER PHASE-C MBERAE;Lo;0;L;;;;;N;;;;; +168C3;BAMUM LETTER PHASE-C RU;Lo;0;L;;;;;N;;;;; +168C4;BAMUM LETTER PHASE-C NJAEM;Lo;0;L;;;;;N;;;;; +168C5;BAMUM LETTER PHASE-C LAM;Lo;0;L;;;;;N;;;;; +168C6;BAMUM LETTER PHASE-C TITUAEP;Lo;0;L;;;;;N;;;;; +168C7;BAMUM LETTER PHASE-C NSUOT NGOM;Lo;0;L;;;;;N;;;;; +168C8;BAMUM LETTER PHASE-C NJEEEE;Lo;0;L;;;;;N;;;;; +168C9;BAMUM LETTER PHASE-C KET;Lo;0;L;;;;;N;;;;; +168CA;BAMUM LETTER PHASE-C NGGU;Lo;0;L;;;;;N;;;;; +168CB;BAMUM LETTER PHASE-C MAESI;Lo;0;L;;;;;N;;;;; +168CC;BAMUM LETTER PHASE-C MBUAEM;Lo;0;L;;;;;N;;;;; +168CD;BAMUM LETTER PHASE-C LU;Lo;0;L;;;;;N;;;;; +168CE;BAMUM LETTER PHASE-C KUT;Lo;0;L;;;;;N;;;;; +168CF;BAMUM LETTER PHASE-C NJAM;Lo;0;L;;;;;N;;;;; +168D0;BAMUM LETTER PHASE-C NGOM;Lo;0;L;;;;;N;;;;; +168D1;BAMUM LETTER PHASE-C WUP;Lo;0;L;;;;;N;;;;; +168D2;BAMUM LETTER PHASE-C NGGUEET;Lo;0;L;;;;;N;;;;; +168D3;BAMUM LETTER PHASE-C NSOM;Lo;0;L;;;;;N;;;;; +168D4;BAMUM LETTER PHASE-C NTEN;Lo;0;L;;;;;N;;;;; +168D5;BAMUM LETTER PHASE-C KUOP NKAARAE;Lo;0;L;;;;;N;;;;; +168D6;BAMUM LETTER PHASE-C NSUN;Lo;0;L;;;;;N;;;;; +168D7;BAMUM LETTER PHASE-C NDAM;Lo;0;L;;;;;N;;;;; +168D8;BAMUM LETTER PHASE-C MA NSIEE;Lo;0;L;;;;;N;;;;; +168D9;BAMUM LETTER PHASE-C YAA;Lo;0;L;;;;;N;;;;; +168DA;BAMUM LETTER PHASE-C NDAP;Lo;0;L;;;;;N;;;;; +168DB;BAMUM LETTER PHASE-C SHUEQ;Lo;0;L;;;;;N;;;;; +168DC;BAMUM LETTER PHASE-C SETFON;Lo;0;L;;;;;N;;;;; +168DD;BAMUM LETTER PHASE-C MBI;Lo;0;L;;;;;N;;;;; +168DE;BAMUM LETTER PHASE-C MAEMBA;Lo;0;L;;;;;N;;;;; +168DF;BAMUM LETTER PHASE-C MBANYI;Lo;0;L;;;;;N;;;;; +168E0;BAMUM LETTER PHASE-C KEUSEUX;Lo;0;L;;;;;N;;;;; +168E1;BAMUM LETTER PHASE-C MBEUX;Lo;0;L;;;;;N;;;;; +168E2;BAMUM LETTER PHASE-C KEUM;Lo;0;L;;;;;N;;;;; +168E3;BAMUM LETTER PHASE-C MBAA PICKET;Lo;0;L;;;;;N;;;;; +168E4;BAMUM LETTER PHASE-C YUWOQ;Lo;0;L;;;;;N;;;;; +168E5;BAMUM LETTER PHASE-C NJEUX;Lo;0;L;;;;;N;;;;; +168E6;BAMUM LETTER PHASE-C MIEE;Lo;0;L;;;;;N;;;;; +168E7;BAMUM LETTER PHASE-C MUAE;Lo;0;L;;;;;N;;;;; +168E8;BAMUM LETTER PHASE-C SHIQ;Lo;0;L;;;;;N;;;;; +168E9;BAMUM LETTER PHASE-C KEN LAW;Lo;0;L;;;;;N;;;;; +168EA;BAMUM LETTER PHASE-C KEN FATIGUE;Lo;0;L;;;;;N;;;;; +168EB;BAMUM LETTER PHASE-C NGAQ;Lo;0;L;;;;;N;;;;; +168EC;BAMUM LETTER PHASE-C NAQ;Lo;0;L;;;;;N;;;;; +168ED;BAMUM LETTER PHASE-C LIQ;Lo;0;L;;;;;N;;;;; +168EE;BAMUM LETTER PHASE-C PIN;Lo;0;L;;;;;N;;;;; +168EF;BAMUM LETTER PHASE-C PEN;Lo;0;L;;;;;N;;;;; +168F0;BAMUM LETTER PHASE-C TET;Lo;0;L;;;;;N;;;;; +168F1;BAMUM LETTER PHASE-D MBUO;Lo;0;L;;;;;N;;;;; +168F2;BAMUM LETTER PHASE-D WAP;Lo;0;L;;;;;N;;;;; +168F3;BAMUM LETTER PHASE-D NJI;Lo;0;L;;;;;N;;;;; +168F4;BAMUM LETTER PHASE-D MFON;Lo;0;L;;;;;N;;;;; +168F5;BAMUM LETTER PHASE-D NJIEE;Lo;0;L;;;;;N;;;;; +168F6;BAMUM LETTER PHASE-D LIEE;Lo;0;L;;;;;N;;;;; +168F7;BAMUM LETTER PHASE-D NJEUT;Lo;0;L;;;;;N;;;;; +168F8;BAMUM LETTER PHASE-D NSHEE;Lo;0;L;;;;;N;;;;; +168F9;BAMUM LETTER PHASE-D NGGAAMAE;Lo;0;L;;;;;N;;;;; +168FA;BAMUM LETTER PHASE-D NYAM;Lo;0;L;;;;;N;;;;; +168FB;BAMUM LETTER PHASE-D WUAEN;Lo;0;L;;;;;N;;;;; +168FC;BAMUM LETTER PHASE-D NGKUN;Lo;0;L;;;;;N;;;;; +168FD;BAMUM LETTER PHASE-D SHEE;Lo;0;L;;;;;N;;;;; +168FE;BAMUM LETTER PHASE-D NGKAP;Lo;0;L;;;;;N;;;;; +168FF;BAMUM LETTER PHASE-D KEUAETMEUN;Lo;0;L;;;;;N;;;;; +16900;BAMUM LETTER PHASE-D TEUT;Lo;0;L;;;;;N;;;;; +16901;BAMUM LETTER PHASE-D SHEUAE;Lo;0;L;;;;;N;;;;; +16902;BAMUM LETTER PHASE-D NJAP;Lo;0;L;;;;;N;;;;; +16903;BAMUM LETTER PHASE-D SUE;Lo;0;L;;;;;N;;;;; +16904;BAMUM LETTER PHASE-D KET;Lo;0;L;;;;;N;;;;; +16905;BAMUM LETTER PHASE-D YAEMMAE;Lo;0;L;;;;;N;;;;; +16906;BAMUM LETTER PHASE-D KUOM;Lo;0;L;;;;;N;;;;; +16907;BAMUM LETTER PHASE-D SAP;Lo;0;L;;;;;N;;;;; +16908;BAMUM LETTER PHASE-D MFEUT;Lo;0;L;;;;;N;;;;; +16909;BAMUM LETTER PHASE-D NDEUX;Lo;0;L;;;;;N;;;;; +1690A;BAMUM LETTER PHASE-D MALEERI;Lo;0;L;;;;;N;;;;; +1690B;BAMUM LETTER PHASE-D MEUT;Lo;0;L;;;;;N;;;;; +1690C;BAMUM LETTER PHASE-D SEUAEQ;Lo;0;L;;;;;N;;;;; +1690D;BAMUM LETTER PHASE-D YEN;Lo;0;L;;;;;N;;;;; +1690E;BAMUM LETTER PHASE-D NJEUAEM;Lo;0;L;;;;;N;;;;; +1690F;BAMUM LETTER PHASE-D KEUOT MBUAE;Lo;0;L;;;;;N;;;;; +16910;BAMUM LETTER PHASE-D NGKEURI;Lo;0;L;;;;;N;;;;; +16911;BAMUM LETTER PHASE-D TU;Lo;0;L;;;;;N;;;;; +16912;BAMUM LETTER PHASE-D GHAA;Lo;0;L;;;;;N;;;;; +16913;BAMUM LETTER PHASE-D NGKYEE;Lo;0;L;;;;;N;;;;; +16914;BAMUM LETTER PHASE-D FEUFEUAET;Lo;0;L;;;;;N;;;;; +16915;BAMUM LETTER PHASE-D NDEE;Lo;0;L;;;;;N;;;;; +16916;BAMUM LETTER PHASE-D MGBOFUM;Lo;0;L;;;;;N;;;;; +16917;BAMUM LETTER PHASE-D LEUAEP;Lo;0;L;;;;;N;;;;; +16918;BAMUM LETTER PHASE-D NDON;Lo;0;L;;;;;N;;;;; +16919;BAMUM LETTER PHASE-D MONI;Lo;0;L;;;;;N;;;;; +1691A;BAMUM LETTER PHASE-D MGBEUN;Lo;0;L;;;;;N;;;;; +1691B;BAMUM LETTER PHASE-D PUUT;Lo;0;L;;;;;N;;;;; +1691C;BAMUM LETTER PHASE-D MGBIEE;Lo;0;L;;;;;N;;;;; +1691D;BAMUM LETTER PHASE-D MFO;Lo;0;L;;;;;N;;;;; +1691E;BAMUM LETTER PHASE-D LUM;Lo;0;L;;;;;N;;;;; +1691F;BAMUM LETTER PHASE-D NSIEEP;Lo;0;L;;;;;N;;;;; +16920;BAMUM LETTER PHASE-D MBAA;Lo;0;L;;;;;N;;;;; +16921;BAMUM LETTER PHASE-D KWAET;Lo;0;L;;;;;N;;;;; +16922;BAMUM LETTER PHASE-D NYET;Lo;0;L;;;;;N;;;;; +16923;BAMUM LETTER PHASE-D TEUAEN;Lo;0;L;;;;;N;;;;; +16924;BAMUM LETTER PHASE-D SOT;Lo;0;L;;;;;N;;;;; +16925;BAMUM LETTER PHASE-D YUWOQ;Lo;0;L;;;;;N;;;;; +16926;BAMUM LETTER PHASE-D KEUM;Lo;0;L;;;;;N;;;;; +16927;BAMUM LETTER PHASE-D RAEM;Lo;0;L;;;;;N;;;;; +16928;BAMUM LETTER PHASE-D TEEEE;Lo;0;L;;;;;N;;;;; +16929;BAMUM LETTER PHASE-D NGKEUAEQ;Lo;0;L;;;;;N;;;;; +1692A;BAMUM LETTER PHASE-D MFEUAE;Lo;0;L;;;;;N;;;;; +1692B;BAMUM LETTER PHASE-D NSIEET;Lo;0;L;;;;;N;;;;; +1692C;BAMUM LETTER PHASE-D KEUP;Lo;0;L;;;;;N;;;;; +1692D;BAMUM LETTER PHASE-D PIP;Lo;0;L;;;;;N;;;;; +1692E;BAMUM LETTER PHASE-D PEUTAE;Lo;0;L;;;;;N;;;;; +1692F;BAMUM LETTER PHASE-D NYUE;Lo;0;L;;;;;N;;;;; +16930;BAMUM LETTER PHASE-D LET;Lo;0;L;;;;;N;;;;; +16931;BAMUM LETTER PHASE-D NGGAAM;Lo;0;L;;;;;N;;;;; +16932;BAMUM LETTER PHASE-D MFIEE;Lo;0;L;;;;;N;;;;; +16933;BAMUM LETTER PHASE-D NGGWAEN;Lo;0;L;;;;;N;;;;; +16934;BAMUM LETTER PHASE-D YUOM;Lo;0;L;;;;;N;;;;; +16935;BAMUM LETTER PHASE-D PAP;Lo;0;L;;;;;N;;;;; +16936;BAMUM LETTER PHASE-D YUOP;Lo;0;L;;;;;N;;;;; +16937;BAMUM LETTER PHASE-D NDAM;Lo;0;L;;;;;N;;;;; +16938;BAMUM LETTER PHASE-D NTEUM;Lo;0;L;;;;;N;;;;; +16939;BAMUM LETTER PHASE-D SUAE;Lo;0;L;;;;;N;;;;; +1693A;BAMUM LETTER PHASE-D KUN;Lo;0;L;;;;;N;;;;; +1693B;BAMUM LETTER PHASE-D NGGEUX;Lo;0;L;;;;;N;;;;; +1693C;BAMUM LETTER PHASE-D NGKIEE;Lo;0;L;;;;;N;;;;; +1693D;BAMUM LETTER PHASE-D TUOT;Lo;0;L;;;;;N;;;;; +1693E;BAMUM LETTER PHASE-D MEUN;Lo;0;L;;;;;N;;;;; +1693F;BAMUM LETTER PHASE-D KUQ;Lo;0;L;;;;;N;;;;; +16940;BAMUM LETTER PHASE-D NSUM;Lo;0;L;;;;;N;;;;; +16941;BAMUM LETTER PHASE-D TEUN;Lo;0;L;;;;;N;;;;; +16942;BAMUM LETTER PHASE-D MAENJET;Lo;0;L;;;;;N;;;;; +16943;BAMUM LETTER PHASE-D NGGAP;Lo;0;L;;;;;N;;;;; +16944;BAMUM LETTER PHASE-D LEUM;Lo;0;L;;;;;N;;;;; +16945;BAMUM LETTER PHASE-D NGGUOM;Lo;0;L;;;;;N;;;;; +16946;BAMUM LETTER PHASE-D NSHUT;Lo;0;L;;;;;N;;;;; +16947;BAMUM LETTER PHASE-D NJUEQ;Lo;0;L;;;;;N;;;;; +16948;BAMUM LETTER PHASE-D GHEUAE;Lo;0;L;;;;;N;;;;; +16949;BAMUM LETTER PHASE-D KU;Lo;0;L;;;;;N;;;;; +1694A;BAMUM LETTER PHASE-D REN OLD;Lo;0;L;;;;;N;;;;; +1694B;BAMUM LETTER PHASE-D TAE;Lo;0;L;;;;;N;;;;; +1694C;BAMUM LETTER PHASE-D TOQ;Lo;0;L;;;;;N;;;;; +1694D;BAMUM LETTER PHASE-D NYI;Lo;0;L;;;;;N;;;;; +1694E;BAMUM LETTER PHASE-D RII;Lo;0;L;;;;;N;;;;; +1694F;BAMUM LETTER PHASE-D LEEEE;Lo;0;L;;;;;N;;;;; +16950;BAMUM LETTER PHASE-D MEEEE;Lo;0;L;;;;;N;;;;; +16951;BAMUM LETTER PHASE-D M;Lo;0;L;;;;;N;;;;; +16952;BAMUM LETTER PHASE-D SUU;Lo;0;L;;;;;N;;;;; +16953;BAMUM LETTER PHASE-D MU;Lo;0;L;;;;;N;;;;; +16954;BAMUM LETTER PHASE-D SHII;Lo;0;L;;;;;N;;;;; +16955;BAMUM LETTER PHASE-D SHEUX;Lo;0;L;;;;;N;;;;; +16956;BAMUM LETTER PHASE-D KYEE;Lo;0;L;;;;;N;;;;; +16957;BAMUM LETTER PHASE-D NU;Lo;0;L;;;;;N;;;;; +16958;BAMUM LETTER PHASE-D SHU;Lo;0;L;;;;;N;;;;; +16959;BAMUM LETTER PHASE-D NTEE;Lo;0;L;;;;;N;;;;; +1695A;BAMUM LETTER PHASE-D PEE;Lo;0;L;;;;;N;;;;; +1695B;BAMUM LETTER PHASE-D NI;Lo;0;L;;;;;N;;;;; +1695C;BAMUM LETTER PHASE-D SHOQ;Lo;0;L;;;;;N;;;;; +1695D;BAMUM LETTER PHASE-D PUQ;Lo;0;L;;;;;N;;;;; +1695E;BAMUM LETTER PHASE-D MVOP;Lo;0;L;;;;;N;;;;; +1695F;BAMUM LETTER PHASE-D LOQ;Lo;0;L;;;;;N;;;;; +16960;BAMUM LETTER PHASE-D REN MUCH;Lo;0;L;;;;;N;;;;; +16961;BAMUM LETTER PHASE-D TI;Lo;0;L;;;;;N;;;;; +16962;BAMUM LETTER PHASE-D NTUU;Lo;0;L;;;;;N;;;;; +16963;BAMUM LETTER PHASE-D MBAA SEVEN;Lo;0;L;;;;;N;;;;; +16964;BAMUM LETTER PHASE-D SAQ;Lo;0;L;;;;;N;;;;; +16965;BAMUM LETTER PHASE-D FAA;Lo;0;L;;;;;N;;;;; +16966;BAMUM LETTER PHASE-E NDAP;Lo;0;L;;;;;N;;;;; +16967;BAMUM LETTER PHASE-E TOON;Lo;0;L;;;;;N;;;;; +16968;BAMUM LETTER PHASE-E MBEUM;Lo;0;L;;;;;N;;;;; +16969;BAMUM LETTER PHASE-E LAP;Lo;0;L;;;;;N;;;;; +1696A;BAMUM LETTER PHASE-E VOM;Lo;0;L;;;;;N;;;;; +1696B;BAMUM LETTER PHASE-E LOON;Lo;0;L;;;;;N;;;;; +1696C;BAMUM LETTER PHASE-E PAA;Lo;0;L;;;;;N;;;;; +1696D;BAMUM LETTER PHASE-E SOM;Lo;0;L;;;;;N;;;;; +1696E;BAMUM LETTER PHASE-E RAQ;Lo;0;L;;;;;N;;;;; +1696F;BAMUM LETTER PHASE-E NSHUOP;Lo;0;L;;;;;N;;;;; +16970;BAMUM LETTER PHASE-E NDUN;Lo;0;L;;;;;N;;;;; +16971;BAMUM LETTER PHASE-E PUAE;Lo;0;L;;;;;N;;;;; +16972;BAMUM LETTER PHASE-E TAM;Lo;0;L;;;;;N;;;;; +16973;BAMUM LETTER PHASE-E NGKA;Lo;0;L;;;;;N;;;;; +16974;BAMUM LETTER PHASE-E KPEUX;Lo;0;L;;;;;N;;;;; +16975;BAMUM LETTER PHASE-E WUO;Lo;0;L;;;;;N;;;;; +16976;BAMUM LETTER PHASE-E SEE;Lo;0;L;;;;;N;;;;; +16977;BAMUM LETTER PHASE-E NGGEUAET;Lo;0;L;;;;;N;;;;; +16978;BAMUM LETTER PHASE-E PAAM;Lo;0;L;;;;;N;;;;; +16979;BAMUM LETTER PHASE-E TOO;Lo;0;L;;;;;N;;;;; +1697A;BAMUM LETTER PHASE-E KUOP;Lo;0;L;;;;;N;;;;; +1697B;BAMUM LETTER PHASE-E LOM;Lo;0;L;;;;;N;;;;; +1697C;BAMUM LETTER PHASE-E NSHIEE;Lo;0;L;;;;;N;;;;; +1697D;BAMUM LETTER PHASE-E NGOP;Lo;0;L;;;;;N;;;;; +1697E;BAMUM LETTER PHASE-E MAEM;Lo;0;L;;;;;N;;;;; +1697F;BAMUM LETTER PHASE-E NGKEUX;Lo;0;L;;;;;N;;;;; +16980;BAMUM LETTER PHASE-E NGOQ;Lo;0;L;;;;;N;;;;; +16981;BAMUM LETTER PHASE-E NSHUE;Lo;0;L;;;;;N;;;;; +16982;BAMUM LETTER PHASE-E RIMGBA;Lo;0;L;;;;;N;;;;; +16983;BAMUM LETTER PHASE-E NJEUX;Lo;0;L;;;;;N;;;;; +16984;BAMUM LETTER PHASE-E PEEM;Lo;0;L;;;;;N;;;;; +16985;BAMUM LETTER PHASE-E SAA;Lo;0;L;;;;;N;;;;; +16986;BAMUM LETTER PHASE-E NGGURAE;Lo;0;L;;;;;N;;;;; +16987;BAMUM LETTER PHASE-E MGBA;Lo;0;L;;;;;N;;;;; +16988;BAMUM LETTER PHASE-E GHEUX;Lo;0;L;;;;;N;;;;; +16989;BAMUM LETTER PHASE-E NGKEUAEM;Lo;0;L;;;;;N;;;;; +1698A;BAMUM LETTER PHASE-E NJAEMLI;Lo;0;L;;;;;N;;;;; +1698B;BAMUM LETTER PHASE-E MAP;Lo;0;L;;;;;N;;;;; +1698C;BAMUM LETTER PHASE-E LOOT;Lo;0;L;;;;;N;;;;; +1698D;BAMUM LETTER PHASE-E NGGEEEE;Lo;0;L;;;;;N;;;;; +1698E;BAMUM LETTER PHASE-E NDIQ;Lo;0;L;;;;;N;;;;; +1698F;BAMUM LETTER PHASE-E TAEN NTEUM;Lo;0;L;;;;;N;;;;; +16990;BAMUM LETTER PHASE-E SET;Lo;0;L;;;;;N;;;;; +16991;BAMUM LETTER PHASE-E PUM;Lo;0;L;;;;;N;;;;; +16992;BAMUM LETTER PHASE-E NDAA SOFTNESS;Lo;0;L;;;;;N;;;;; +16993;BAMUM LETTER PHASE-E NGGUAESHAE NYAM;Lo;0;L;;;;;N;;;;; +16994;BAMUM LETTER PHASE-E YIEE;Lo;0;L;;;;;N;;;;; +16995;BAMUM LETTER PHASE-E GHEUN;Lo;0;L;;;;;N;;;;; +16996;BAMUM LETTER PHASE-E TUAE;Lo;0;L;;;;;N;;;;; +16997;BAMUM LETTER PHASE-E YEUAE;Lo;0;L;;;;;N;;;;; +16998;BAMUM LETTER PHASE-E PO;Lo;0;L;;;;;N;;;;; +16999;BAMUM LETTER PHASE-E TUMAE;Lo;0;L;;;;;N;;;;; +1699A;BAMUM LETTER PHASE-E KEUAE;Lo;0;L;;;;;N;;;;; +1699B;BAMUM LETTER PHASE-E SUAEN;Lo;0;L;;;;;N;;;;; +1699C;BAMUM LETTER PHASE-E TEUAEQ;Lo;0;L;;;;;N;;;;; +1699D;BAMUM LETTER PHASE-E VEUAE;Lo;0;L;;;;;N;;;;; +1699E;BAMUM LETTER PHASE-E WEUX;Lo;0;L;;;;;N;;;;; +1699F;BAMUM LETTER PHASE-E LAAM;Lo;0;L;;;;;N;;;;; +169A0;BAMUM LETTER PHASE-E PU;Lo;0;L;;;;;N;;;;; +169A1;BAMUM LETTER PHASE-E TAAQ;Lo;0;L;;;;;N;;;;; +169A2;BAMUM LETTER PHASE-E GHAAMAE;Lo;0;L;;;;;N;;;;; +169A3;BAMUM LETTER PHASE-E NGEUREUT;Lo;0;L;;;;;N;;;;; +169A4;BAMUM LETTER PHASE-E SHEUAEQ;Lo;0;L;;;;;N;;;;; +169A5;BAMUM LETTER PHASE-E MGBEN;Lo;0;L;;;;;N;;;;; +169A6;BAMUM LETTER PHASE-E MBEE;Lo;0;L;;;;;N;;;;; +169A7;BAMUM LETTER PHASE-E NZAQ;Lo;0;L;;;;;N;;;;; +169A8;BAMUM LETTER PHASE-E NKOM;Lo;0;L;;;;;N;;;;; +169A9;BAMUM LETTER PHASE-E GBET;Lo;0;L;;;;;N;;;;; +169AA;BAMUM LETTER PHASE-E TUM;Lo;0;L;;;;;N;;;;; +169AB;BAMUM LETTER PHASE-E KUET;Lo;0;L;;;;;N;;;;; +169AC;BAMUM LETTER PHASE-E YAP;Lo;0;L;;;;;N;;;;; +169AD;BAMUM LETTER PHASE-E NYI CLEAVER;Lo;0;L;;;;;N;;;;; +169AE;BAMUM LETTER PHASE-E YIT;Lo;0;L;;;;;N;;;;; +169AF;BAMUM LETTER PHASE-E MFEUQ;Lo;0;L;;;;;N;;;;; +169B0;BAMUM LETTER PHASE-E NDIAQ;Lo;0;L;;;;;N;;;;; +169B1;BAMUM LETTER PHASE-E PIEEQ;Lo;0;L;;;;;N;;;;; +169B2;BAMUM LETTER PHASE-E YUEQ;Lo;0;L;;;;;N;;;;; +169B3;BAMUM LETTER PHASE-E LEUAEM;Lo;0;L;;;;;N;;;;; +169B4;BAMUM LETTER PHASE-E FUE;Lo;0;L;;;;;N;;;;; +169B5;BAMUM LETTER PHASE-E GBEUX;Lo;0;L;;;;;N;;;;; +169B6;BAMUM LETTER PHASE-E NGKUP;Lo;0;L;;;;;N;;;;; +169B7;BAMUM LETTER PHASE-E KET;Lo;0;L;;;;;N;;;;; +169B8;BAMUM LETTER PHASE-E MAE;Lo;0;L;;;;;N;;;;; +169B9;BAMUM LETTER PHASE-E NGKAAMI;Lo;0;L;;;;;N;;;;; +169BA;BAMUM LETTER PHASE-E GHET;Lo;0;L;;;;;N;;;;; +169BB;BAMUM LETTER PHASE-E FA;Lo;0;L;;;;;N;;;;; +169BC;BAMUM LETTER PHASE-E NTUM;Lo;0;L;;;;;N;;;;; +169BD;BAMUM LETTER PHASE-E PEUT;Lo;0;L;;;;;N;;;;; +169BE;BAMUM LETTER PHASE-E YEUM;Lo;0;L;;;;;N;;;;; +169BF;BAMUM LETTER PHASE-E NGGEUAE;Lo;0;L;;;;;N;;;;; +169C0;BAMUM LETTER PHASE-E NYI BETWEEN;Lo;0;L;;;;;N;;;;; +169C1;BAMUM LETTER PHASE-E NZUQ;Lo;0;L;;;;;N;;;;; +169C2;BAMUM LETTER PHASE-E POON;Lo;0;L;;;;;N;;;;; +169C3;BAMUM LETTER PHASE-E MIEE;Lo;0;L;;;;;N;;;;; +169C4;BAMUM LETTER PHASE-E FUET;Lo;0;L;;;;;N;;;;; +169C5;BAMUM LETTER PHASE-E NAE;Lo;0;L;;;;;N;;;;; +169C6;BAMUM LETTER PHASE-E MUAE;Lo;0;L;;;;;N;;;;; +169C7;BAMUM LETTER PHASE-E GHEUAE;Lo;0;L;;;;;N;;;;; +169C8;BAMUM LETTER PHASE-E FU I;Lo;0;L;;;;;N;;;;; +169C9;BAMUM LETTER PHASE-E MVI;Lo;0;L;;;;;N;;;;; +169CA;BAMUM LETTER PHASE-E PUAQ;Lo;0;L;;;;;N;;;;; +169CB;BAMUM LETTER PHASE-E NGKUM;Lo;0;L;;;;;N;;;;; +169CC;BAMUM LETTER PHASE-E KUT;Lo;0;L;;;;;N;;;;; +169CD;BAMUM LETTER PHASE-E PIET;Lo;0;L;;;;;N;;;;; +169CE;BAMUM LETTER PHASE-E NTAP;Lo;0;L;;;;;N;;;;; +169CF;BAMUM LETTER PHASE-E YEUAET;Lo;0;L;;;;;N;;;;; +169D0;BAMUM LETTER PHASE-E NGGUP;Lo;0;L;;;;;N;;;;; +169D1;BAMUM LETTER PHASE-E PA PEOPLE;Lo;0;L;;;;;N;;;;; +169D2;BAMUM LETTER PHASE-E FU CALL;Lo;0;L;;;;;N;;;;; +169D3;BAMUM LETTER PHASE-E FOM;Lo;0;L;;;;;N;;;;; +169D4;BAMUM LETTER PHASE-E NJEE;Lo;0;L;;;;;N;;;;; +169D5;BAMUM LETTER PHASE-E A;Lo;0;L;;;;;N;;;;; +169D6;BAMUM LETTER PHASE-E TOQ;Lo;0;L;;;;;N;;;;; +169D7;BAMUM LETTER PHASE-E O;Lo;0;L;;;;;N;;;;; +169D8;BAMUM LETTER PHASE-E I;Lo;0;L;;;;;N;;;;; +169D9;BAMUM LETTER PHASE-E LAQ;Lo;0;L;;;;;N;;;;; +169DA;BAMUM LETTER PHASE-E PA PLURAL;Lo;0;L;;;;;N;;;;; +169DB;BAMUM LETTER PHASE-E TAA;Lo;0;L;;;;;N;;;;; +169DC;BAMUM LETTER PHASE-E TAQ;Lo;0;L;;;;;N;;;;; +169DD;BAMUM LETTER PHASE-E NDAA MY HOUSE;Lo;0;L;;;;;N;;;;; +169DE;BAMUM LETTER PHASE-E SHIQ;Lo;0;L;;;;;N;;;;; +169DF;BAMUM LETTER PHASE-E YEUX;Lo;0;L;;;;;N;;;;; +169E0;BAMUM LETTER PHASE-E NGUAE;Lo;0;L;;;;;N;;;;; +169E1;BAMUM LETTER PHASE-E YUAEN;Lo;0;L;;;;;N;;;;; +169E2;BAMUM LETTER PHASE-E YOQ SWIMMING;Lo;0;L;;;;;N;;;;; +169E3;BAMUM LETTER PHASE-E YOQ COVER;Lo;0;L;;;;;N;;;;; +169E4;BAMUM LETTER PHASE-E YUQ;Lo;0;L;;;;;N;;;;; +169E5;BAMUM LETTER PHASE-E YUN;Lo;0;L;;;;;N;;;;; +169E6;BAMUM LETTER PHASE-E KEUX;Lo;0;L;;;;;N;;;;; +169E7;BAMUM LETTER PHASE-E PEUX;Lo;0;L;;;;;N;;;;; +169E8;BAMUM LETTER PHASE-E NJEE EPOCH;Lo;0;L;;;;;N;;;;; +169E9;BAMUM LETTER PHASE-E PUE;Lo;0;L;;;;;N;;;;; +169EA;BAMUM LETTER PHASE-E WUE;Lo;0;L;;;;;N;;;;; +169EB;BAMUM LETTER PHASE-E FEE;Lo;0;L;;;;;N;;;;; +169EC;BAMUM LETTER PHASE-E VEE;Lo;0;L;;;;;N;;;;; +169ED;BAMUM LETTER PHASE-E LU;Lo;0;L;;;;;N;;;;; +169EE;BAMUM LETTER PHASE-E MI;Lo;0;L;;;;;N;;;;; +169EF;BAMUM LETTER PHASE-E REUX;Lo;0;L;;;;;N;;;;; +169F0;BAMUM LETTER PHASE-E RAE;Lo;0;L;;;;;N;;;;; +169F1;BAMUM LETTER PHASE-E NGUAET;Lo;0;L;;;;;N;;;;; +169F2;BAMUM LETTER PHASE-E NGA;Lo;0;L;;;;;N;;;;; +169F3;BAMUM LETTER PHASE-E SHO;Lo;0;L;;;;;N;;;;; +169F4;BAMUM LETTER PHASE-E SHOQ;Lo;0;L;;;;;N;;;;; +169F5;BAMUM LETTER PHASE-E FU REMEDY;Lo;0;L;;;;;N;;;;; +169F6;BAMUM LETTER PHASE-E NA;Lo;0;L;;;;;N;;;;; +169F7;BAMUM LETTER PHASE-E PI;Lo;0;L;;;;;N;;;;; +169F8;BAMUM LETTER PHASE-E LOQ;Lo;0;L;;;;;N;;;;; +169F9;BAMUM LETTER PHASE-E KO;Lo;0;L;;;;;N;;;;; +169FA;BAMUM LETTER PHASE-E MEN;Lo;0;L;;;;;N;;;;; +169FB;BAMUM LETTER PHASE-E MA;Lo;0;L;;;;;N;;;;; +169FC;BAMUM LETTER PHASE-E MAQ;Lo;0;L;;;;;N;;;;; +169FD;BAMUM LETTER PHASE-E TEU;Lo;0;L;;;;;N;;;;; +169FE;BAMUM LETTER PHASE-E KI;Lo;0;L;;;;;N;;;;; +169FF;BAMUM LETTER PHASE-E MON;Lo;0;L;;;;;N;;;;; +16A00;BAMUM LETTER PHASE-E TEN;Lo;0;L;;;;;N;;;;; +16A01;BAMUM LETTER PHASE-E FAQ;Lo;0;L;;;;;N;;;;; +16A02;BAMUM LETTER PHASE-E GHOM;Lo;0;L;;;;;N;;;;; +16A03;BAMUM LETTER PHASE-F KA;Lo;0;L;;;;;N;;;;; +16A04;BAMUM LETTER PHASE-F U;Lo;0;L;;;;;N;;;;; +16A05;BAMUM LETTER PHASE-F KU;Lo;0;L;;;;;N;;;;; +16A06;BAMUM LETTER PHASE-F EE;Lo;0;L;;;;;N;;;;; +16A07;BAMUM LETTER PHASE-F REE;Lo;0;L;;;;;N;;;;; +16A08;BAMUM LETTER PHASE-F TAE;Lo;0;L;;;;;N;;;;; +16A09;BAMUM LETTER PHASE-F NYI;Lo;0;L;;;;;N;;;;; +16A0A;BAMUM LETTER PHASE-F LA;Lo;0;L;;;;;N;;;;; +16A0B;BAMUM LETTER PHASE-F RII;Lo;0;L;;;;;N;;;;; +16A0C;BAMUM LETTER PHASE-F RIEE;Lo;0;L;;;;;N;;;;; +16A0D;BAMUM LETTER PHASE-F MEEEE;Lo;0;L;;;;;N;;;;; +16A0E;BAMUM LETTER PHASE-F TAA;Lo;0;L;;;;;N;;;;; +16A0F;BAMUM LETTER PHASE-F NDAA;Lo;0;L;;;;;N;;;;; +16A10;BAMUM LETTER PHASE-F NJAEM;Lo;0;L;;;;;N;;;;; +16A11;BAMUM LETTER PHASE-F M;Lo;0;L;;;;;N;;;;; +16A12;BAMUM LETTER PHASE-F SUU;Lo;0;L;;;;;N;;;;; +16A13;BAMUM LETTER PHASE-F SHII;Lo;0;L;;;;;N;;;;; +16A14;BAMUM LETTER PHASE-F SI;Lo;0;L;;;;;N;;;;; +16A15;BAMUM LETTER PHASE-F SEUX;Lo;0;L;;;;;N;;;;; +16A16;BAMUM LETTER PHASE-F KYEE;Lo;0;L;;;;;N;;;;; +16A17;BAMUM LETTER PHASE-F KET;Lo;0;L;;;;;N;;;;; +16A18;BAMUM LETTER PHASE-F NUAE;Lo;0;L;;;;;N;;;;; +16A19;BAMUM LETTER PHASE-F NU;Lo;0;L;;;;;N;;;;; +16A1A;BAMUM LETTER PHASE-F NJUAE;Lo;0;L;;;;;N;;;;; +16A1B;BAMUM LETTER PHASE-F YOQ;Lo;0;L;;;;;N;;;;; +16A1C;BAMUM LETTER PHASE-F SHU;Lo;0;L;;;;;N;;;;; +16A1D;BAMUM LETTER PHASE-F YA;Lo;0;L;;;;;N;;;;; +16A1E;BAMUM LETTER PHASE-F NSHA;Lo;0;L;;;;;N;;;;; +16A1F;BAMUM LETTER PHASE-F PEUX;Lo;0;L;;;;;N;;;;; +16A20;BAMUM LETTER PHASE-F NTEE;Lo;0;L;;;;;N;;;;; +16A21;BAMUM LETTER PHASE-F WUE;Lo;0;L;;;;;N;;;;; +16A22;BAMUM LETTER PHASE-F PEE;Lo;0;L;;;;;N;;;;; +16A23;BAMUM LETTER PHASE-F RU;Lo;0;L;;;;;N;;;;; +16A24;BAMUM LETTER PHASE-F NI;Lo;0;L;;;;;N;;;;; +16A25;BAMUM LETTER PHASE-F REUX;Lo;0;L;;;;;N;;;;; +16A26;BAMUM LETTER PHASE-F KEN;Lo;0;L;;;;;N;;;;; +16A27;BAMUM LETTER PHASE-F NGKWAEN;Lo;0;L;;;;;N;;;;; +16A28;BAMUM LETTER PHASE-F NGGA;Lo;0;L;;;;;N;;;;; +16A29;BAMUM LETTER PHASE-F SHO;Lo;0;L;;;;;N;;;;; +16A2A;BAMUM LETTER PHASE-F PUAE;Lo;0;L;;;;;N;;;;; +16A2B;BAMUM LETTER PHASE-F FOM;Lo;0;L;;;;;N;;;;; +16A2C;BAMUM LETTER PHASE-F WA;Lo;0;L;;;;;N;;;;; +16A2D;BAMUM LETTER PHASE-F LI;Lo;0;L;;;;;N;;;;; +16A2E;BAMUM LETTER PHASE-F LOQ;Lo;0;L;;;;;N;;;;; +16A2F;BAMUM LETTER PHASE-F KO;Lo;0;L;;;;;N;;;;; +16A30;BAMUM LETTER PHASE-F MBEN;Lo;0;L;;;;;N;;;;; +16A31;BAMUM LETTER PHASE-F REN;Lo;0;L;;;;;N;;;;; +16A32;BAMUM LETTER PHASE-F MA;Lo;0;L;;;;;N;;;;; +16A33;BAMUM LETTER PHASE-F MO;Lo;0;L;;;;;N;;;;; +16A34;BAMUM LETTER PHASE-F MBAA;Lo;0;L;;;;;N;;;;; +16A35;BAMUM LETTER PHASE-F TET;Lo;0;L;;;;;N;;;;; +16A36;BAMUM LETTER PHASE-F KPA;Lo;0;L;;;;;N;;;;; +16A37;BAMUM LETTER PHASE-F SAMBA;Lo;0;L;;;;;N;;;;; +16A38;BAMUM LETTER PHASE-F VUEQ;Lo;0;L;;;;;N;;;;; +16A40;MRO LETTER TA;Lo;0;L;;;;;N;;;;; +16A41;MRO LETTER NGI;Lo;0;L;;;;;N;;;;; +16A42;MRO LETTER YO;Lo;0;L;;;;;N;;;;; +16A43;MRO LETTER MIM;Lo;0;L;;;;;N;;;;; +16A44;MRO LETTER BA;Lo;0;L;;;;;N;;;;; +16A45;MRO LETTER DA;Lo;0;L;;;;;N;;;;; +16A46;MRO LETTER A;Lo;0;L;;;;;N;;;;; +16A47;MRO LETTER PHI;Lo;0;L;;;;;N;;;;; +16A48;MRO LETTER KHAI;Lo;0;L;;;;;N;;;;; +16A49;MRO LETTER HAO;Lo;0;L;;;;;N;;;;; +16A4A;MRO LETTER DAI;Lo;0;L;;;;;N;;;;; +16A4B;MRO LETTER CHU;Lo;0;L;;;;;N;;;;; +16A4C;MRO LETTER KEAAE;Lo;0;L;;;;;N;;;;; +16A4D;MRO LETTER OL;Lo;0;L;;;;;N;;;;; +16A4E;MRO LETTER MAEM;Lo;0;L;;;;;N;;;;; +16A4F;MRO LETTER NIN;Lo;0;L;;;;;N;;;;; +16A50;MRO LETTER PA;Lo;0;L;;;;;N;;;;; +16A51;MRO LETTER OO;Lo;0;L;;;;;N;;;;; +16A52;MRO LETTER O;Lo;0;L;;;;;N;;;;; +16A53;MRO LETTER RO;Lo;0;L;;;;;N;;;;; +16A54;MRO LETTER SHI;Lo;0;L;;;;;N;;;;; +16A55;MRO LETTER THEA;Lo;0;L;;;;;N;;;;; +16A56;MRO LETTER EA;Lo;0;L;;;;;N;;;;; +16A57;MRO LETTER WA;Lo;0;L;;;;;N;;;;; +16A58;MRO LETTER E;Lo;0;L;;;;;N;;;;; +16A59;MRO LETTER KO;Lo;0;L;;;;;N;;;;; +16A5A;MRO LETTER LAN;Lo;0;L;;;;;N;;;;; +16A5B;MRO LETTER LA;Lo;0;L;;;;;N;;;;; +16A5C;MRO LETTER HAI;Lo;0;L;;;;;N;;;;; +16A5D;MRO LETTER RI;Lo;0;L;;;;;N;;;;; +16A5E;MRO LETTER TEK;Lo;0;L;;;;;N;;;;; +16A60;MRO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16A61;MRO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16A62;MRO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16A63;MRO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16A64;MRO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16A65;MRO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16A66;MRO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16A67;MRO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16A68;MRO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16A6E;MRO DANDA;Po;0;L;;;;;N;;;;; +16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;; +16A70;TANGSA LETTER OZ;Lo;0;L;;;;;N;;;;; +16A71;TANGSA LETTER OC;Lo;0;L;;;;;N;;;;; +16A72;TANGSA LETTER OQ;Lo;0;L;;;;;N;;;;; +16A73;TANGSA LETTER OX;Lo;0;L;;;;;N;;;;; +16A74;TANGSA LETTER AZ;Lo;0;L;;;;;N;;;;; +16A75;TANGSA LETTER AC;Lo;0;L;;;;;N;;;;; +16A76;TANGSA LETTER AQ;Lo;0;L;;;;;N;;;;; +16A77;TANGSA LETTER AX;Lo;0;L;;;;;N;;;;; +16A78;TANGSA LETTER VZ;Lo;0;L;;;;;N;;;;; +16A79;TANGSA LETTER VC;Lo;0;L;;;;;N;;;;; +16A7A;TANGSA LETTER VQ;Lo;0;L;;;;;N;;;;; +16A7B;TANGSA LETTER VX;Lo;0;L;;;;;N;;;;; +16A7C;TANGSA LETTER EZ;Lo;0;L;;;;;N;;;;; +16A7D;TANGSA LETTER EC;Lo;0;L;;;;;N;;;;; +16A7E;TANGSA LETTER EQ;Lo;0;L;;;;;N;;;;; +16A7F;TANGSA LETTER EX;Lo;0;L;;;;;N;;;;; +16A80;TANGSA LETTER IZ;Lo;0;L;;;;;N;;;;; +16A81;TANGSA LETTER IC;Lo;0;L;;;;;N;;;;; +16A82;TANGSA LETTER IQ;Lo;0;L;;;;;N;;;;; +16A83;TANGSA LETTER IX;Lo;0;L;;;;;N;;;;; +16A84;TANGSA LETTER UZ;Lo;0;L;;;;;N;;;;; +16A85;TANGSA LETTER UC;Lo;0;L;;;;;N;;;;; +16A86;TANGSA LETTER UQ;Lo;0;L;;;;;N;;;;; +16A87;TANGSA LETTER UX;Lo;0;L;;;;;N;;;;; +16A88;TANGSA LETTER AWZ;Lo;0;L;;;;;N;;;;; +16A89;TANGSA LETTER AWC;Lo;0;L;;;;;N;;;;; +16A8A;TANGSA LETTER AWQ;Lo;0;L;;;;;N;;;;; +16A8B;TANGSA LETTER AWX;Lo;0;L;;;;;N;;;;; +16A8C;TANGSA LETTER UIZ;Lo;0;L;;;;;N;;;;; +16A8D;TANGSA LETTER UIC;Lo;0;L;;;;;N;;;;; +16A8E;TANGSA LETTER UIQ;Lo;0;L;;;;;N;;;;; +16A8F;TANGSA LETTER UIX;Lo;0;L;;;;;N;;;;; +16A90;TANGSA LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +16A91;TANGSA LETTER LONG UEX;Lo;0;L;;;;;N;;;;; +16A92;TANGSA LETTER SHORT UEZ;Lo;0;L;;;;;N;;;;; +16A93;TANGSA LETTER SHORT AWX;Lo;0;L;;;;;N;;;;; +16A94;TANGSA LETTER UEC;Lo;0;L;;;;;N;;;;; +16A95;TANGSA LETTER UEZ;Lo;0;L;;;;;N;;;;; +16A96;TANGSA LETTER UEQ;Lo;0;L;;;;;N;;;;; +16A97;TANGSA LETTER UEX;Lo;0;L;;;;;N;;;;; +16A98;TANGSA LETTER UIUZ;Lo;0;L;;;;;N;;;;; +16A99;TANGSA LETTER UIUC;Lo;0;L;;;;;N;;;;; +16A9A;TANGSA LETTER UIUQ;Lo;0;L;;;;;N;;;;; +16A9B;TANGSA LETTER UIUX;Lo;0;L;;;;;N;;;;; +16A9C;TANGSA LETTER MZ;Lo;0;L;;;;;N;;;;; +16A9D;TANGSA LETTER MC;Lo;0;L;;;;;N;;;;; +16A9E;TANGSA LETTER MQ;Lo;0;L;;;;;N;;;;; +16A9F;TANGSA LETTER MX;Lo;0;L;;;;;N;;;;; +16AA0;TANGSA LETTER KA;Lo;0;L;;;;;N;;;;; +16AA1;TANGSA LETTER KHA;Lo;0;L;;;;;N;;;;; +16AA2;TANGSA LETTER GA;Lo;0;L;;;;;N;;;;; +16AA3;TANGSA LETTER NGA;Lo;0;L;;;;;N;;;;; +16AA4;TANGSA LETTER SA;Lo;0;L;;;;;N;;;;; +16AA5;TANGSA LETTER YA;Lo;0;L;;;;;N;;;;; +16AA6;TANGSA LETTER WA;Lo;0;L;;;;;N;;;;; +16AA7;TANGSA LETTER PA;Lo;0;L;;;;;N;;;;; +16AA8;TANGSA LETTER NYA;Lo;0;L;;;;;N;;;;; +16AA9;TANGSA LETTER PHA;Lo;0;L;;;;;N;;;;; +16AAA;TANGSA LETTER BA;Lo;0;L;;;;;N;;;;; +16AAB;TANGSA LETTER MA;Lo;0;L;;;;;N;;;;; +16AAC;TANGSA LETTER NA;Lo;0;L;;;;;N;;;;; +16AAD;TANGSA LETTER HA;Lo;0;L;;;;;N;;;;; +16AAE;TANGSA LETTER LA;Lo;0;L;;;;;N;;;;; +16AAF;TANGSA LETTER HTA;Lo;0;L;;;;;N;;;;; +16AB0;TANGSA LETTER TA;Lo;0;L;;;;;N;;;;; +16AB1;TANGSA LETTER DA;Lo;0;L;;;;;N;;;;; +16AB2;TANGSA LETTER RA;Lo;0;L;;;;;N;;;;; +16AB3;TANGSA LETTER NHA;Lo;0;L;;;;;N;;;;; +16AB4;TANGSA LETTER SHA;Lo;0;L;;;;;N;;;;; +16AB5;TANGSA LETTER CA;Lo;0;L;;;;;N;;;;; +16AB6;TANGSA LETTER TSA;Lo;0;L;;;;;N;;;;; +16AB7;TANGSA LETTER GHA;Lo;0;L;;;;;N;;;;; +16AB8;TANGSA LETTER HTTA;Lo;0;L;;;;;N;;;;; +16AB9;TANGSA LETTER THA;Lo;0;L;;;;;N;;;;; +16ABA;TANGSA LETTER XA;Lo;0;L;;;;;N;;;;; +16ABB;TANGSA LETTER FA;Lo;0;L;;;;;N;;;;; +16ABC;TANGSA LETTER DHA;Lo;0;L;;;;;N;;;;; +16ABD;TANGSA LETTER CHA;Lo;0;L;;;;;N;;;;; +16ABE;TANGSA LETTER ZA;Lo;0;L;;;;;N;;;;; +16AC0;TANGSA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16AC1;TANGSA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16AC2;TANGSA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16AC3;TANGSA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16AC4;TANGSA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16AC5;TANGSA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16AC6;TANGSA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16AC7;TANGSA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16AC8;TANGSA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16AC9;TANGSA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;; +16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;; +16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;; +16AD3;BASSA VAH LETTER FA;Lo;0;L;;;;;N;;;;; +16AD4;BASSA VAH LETTER MBE;Lo;0;L;;;;;N;;;;; +16AD5;BASSA VAH LETTER YIE;Lo;0;L;;;;;N;;;;; +16AD6;BASSA VAH LETTER GAH;Lo;0;L;;;;;N;;;;; +16AD7;BASSA VAH LETTER DHII;Lo;0;L;;;;;N;;;;; +16AD8;BASSA VAH LETTER KPAH;Lo;0;L;;;;;N;;;;; +16AD9;BASSA VAH LETTER JO;Lo;0;L;;;;;N;;;;; +16ADA;BASSA VAH LETTER HWAH;Lo;0;L;;;;;N;;;;; +16ADB;BASSA VAH LETTER WA;Lo;0;L;;;;;N;;;;; +16ADC;BASSA VAH LETTER ZO;Lo;0;L;;;;;N;;;;; +16ADD;BASSA VAH LETTER GBU;Lo;0;L;;;;;N;;;;; +16ADE;BASSA VAH LETTER DO;Lo;0;L;;;;;N;;;;; +16ADF;BASSA VAH LETTER CE;Lo;0;L;;;;;N;;;;; +16AE0;BASSA VAH LETTER UWU;Lo;0;L;;;;;N;;;;; +16AE1;BASSA VAH LETTER TO;Lo;0;L;;;;;N;;;;; +16AE2;BASSA VAH LETTER BA;Lo;0;L;;;;;N;;;;; +16AE3;BASSA VAH LETTER VU;Lo;0;L;;;;;N;;;;; +16AE4;BASSA VAH LETTER YEIN;Lo;0;L;;;;;N;;;;; +16AE5;BASSA VAH LETTER PA;Lo;0;L;;;;;N;;;;; +16AE6;BASSA VAH LETTER WADDA;Lo;0;L;;;;;N;;;;; +16AE7;BASSA VAH LETTER A;Lo;0;L;;;;;N;;;;; +16AE8;BASSA VAH LETTER O;Lo;0;L;;;;;N;;;;; +16AE9;BASSA VAH LETTER OO;Lo;0;L;;;;;N;;;;; +16AEA;BASSA VAH LETTER U;Lo;0;L;;;;;N;;;;; +16AEB;BASSA VAH LETTER EE;Lo;0;L;;;;;N;;;;; +16AEC;BASSA VAH LETTER E;Lo;0;L;;;;;N;;;;; +16AED;BASSA VAH LETTER I;Lo;0;L;;;;;N;;;;; +16AF0;BASSA VAH COMBINING HIGH TONE;Mn;1;NSM;;;;;N;;;;; +16AF1;BASSA VAH COMBINING LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF2;BASSA VAH COMBINING MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF3;BASSA VAH COMBINING LOW-MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF4;BASSA VAH COMBINING HIGH-LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF5;BASSA VAH FULL STOP;Po;0;L;;;;;N;;;;; +16B00;PAHAWH HMONG VOWEL KEEB;Lo;0;L;;;;;N;;;;; +16B01;PAHAWH HMONG VOWEL KEEV;Lo;0;L;;;;;N;;;;; +16B02;PAHAWH HMONG VOWEL KIB;Lo;0;L;;;;;N;;;;; +16B03;PAHAWH HMONG VOWEL KIV;Lo;0;L;;;;;N;;;;; +16B04;PAHAWH HMONG VOWEL KAUB;Lo;0;L;;;;;N;;;;; +16B05;PAHAWH HMONG VOWEL KAUV;Lo;0;L;;;;;N;;;;; +16B06;PAHAWH HMONG VOWEL KUB;Lo;0;L;;;;;N;;;;; +16B07;PAHAWH HMONG VOWEL KUV;Lo;0;L;;;;;N;;;;; +16B08;PAHAWH HMONG VOWEL KEB;Lo;0;L;;;;;N;;;;; +16B09;PAHAWH HMONG VOWEL KEV;Lo;0;L;;;;;N;;;;; +16B0A;PAHAWH HMONG VOWEL KAIB;Lo;0;L;;;;;N;;;;; +16B0B;PAHAWH HMONG VOWEL KAIV;Lo;0;L;;;;;N;;;;; +16B0C;PAHAWH HMONG VOWEL KOOB;Lo;0;L;;;;;N;;;;; +16B0D;PAHAWH HMONG VOWEL KOOV;Lo;0;L;;;;;N;;;;; +16B0E;PAHAWH HMONG VOWEL KAWB;Lo;0;L;;;;;N;;;;; +16B0F;PAHAWH HMONG VOWEL KAWV;Lo;0;L;;;;;N;;;;; +16B10;PAHAWH HMONG VOWEL KUAB;Lo;0;L;;;;;N;;;;; +16B11;PAHAWH HMONG VOWEL KUAV;Lo;0;L;;;;;N;;;;; +16B12;PAHAWH HMONG VOWEL KOB;Lo;0;L;;;;;N;;;;; +16B13;PAHAWH HMONG VOWEL KOV;Lo;0;L;;;;;N;;;;; +16B14;PAHAWH HMONG VOWEL KIAB;Lo;0;L;;;;;N;;;;; +16B15;PAHAWH HMONG VOWEL KIAV;Lo;0;L;;;;;N;;;;; +16B16;PAHAWH HMONG VOWEL KAB;Lo;0;L;;;;;N;;;;; +16B17;PAHAWH HMONG VOWEL KAV;Lo;0;L;;;;;N;;;;; +16B18;PAHAWH HMONG VOWEL KWB;Lo;0;L;;;;;N;;;;; +16B19;PAHAWH HMONG VOWEL KWV;Lo;0;L;;;;;N;;;;; +16B1A;PAHAWH HMONG VOWEL KAAB;Lo;0;L;;;;;N;;;;; +16B1B;PAHAWH HMONG VOWEL KAAV;Lo;0;L;;;;;N;;;;; +16B1C;PAHAWH HMONG CONSONANT VAU;Lo;0;L;;;;;N;;;;; +16B1D;PAHAWH HMONG CONSONANT NTSAU;Lo;0;L;;;;;N;;;;; +16B1E;PAHAWH HMONG CONSONANT LAU;Lo;0;L;;;;;N;;;;; +16B1F;PAHAWH HMONG CONSONANT HAU;Lo;0;L;;;;;N;;;;; +16B20;PAHAWH HMONG CONSONANT NLAU;Lo;0;L;;;;;N;;;;; +16B21;PAHAWH HMONG CONSONANT RAU;Lo;0;L;;;;;N;;;;; +16B22;PAHAWH HMONG CONSONANT NKAU;Lo;0;L;;;;;N;;;;; +16B23;PAHAWH HMONG CONSONANT QHAU;Lo;0;L;;;;;N;;;;; +16B24;PAHAWH HMONG CONSONANT YAU;Lo;0;L;;;;;N;;;;; +16B25;PAHAWH HMONG CONSONANT HLAU;Lo;0;L;;;;;N;;;;; +16B26;PAHAWH HMONG CONSONANT MAU;Lo;0;L;;;;;N;;;;; +16B27;PAHAWH HMONG CONSONANT CHAU;Lo;0;L;;;;;N;;;;; +16B28;PAHAWH HMONG CONSONANT NCHAU;Lo;0;L;;;;;N;;;;; +16B29;PAHAWH HMONG CONSONANT HNAU;Lo;0;L;;;;;N;;;;; +16B2A;PAHAWH HMONG CONSONANT PLHAU;Lo;0;L;;;;;N;;;;; +16B2B;PAHAWH HMONG CONSONANT NTHAU;Lo;0;L;;;;;N;;;;; +16B2C;PAHAWH HMONG CONSONANT NAU;Lo;0;L;;;;;N;;;;; +16B2D;PAHAWH HMONG CONSONANT AU;Lo;0;L;;;;;N;;;;; +16B2E;PAHAWH HMONG CONSONANT XAU;Lo;0;L;;;;;N;;;;; +16B2F;PAHAWH HMONG CONSONANT CAU;Lo;0;L;;;;;N;;;;; +16B30;PAHAWH HMONG MARK CIM TUB;Mn;230;NSM;;;;;N;;;;; +16B31;PAHAWH HMONG MARK CIM SO;Mn;230;NSM;;;;;N;;;;; +16B32;PAHAWH HMONG MARK CIM KES;Mn;230;NSM;;;;;N;;;;; +16B33;PAHAWH HMONG MARK CIM KHAV;Mn;230;NSM;;;;;N;;;;; +16B34;PAHAWH HMONG MARK CIM SUAM;Mn;230;NSM;;;;;N;;;;; +16B35;PAHAWH HMONG MARK CIM HOM;Mn;230;NSM;;;;;N;;;;; +16B36;PAHAWH HMONG MARK CIM TAUM;Mn;230;NSM;;;;;N;;;;; +16B37;PAHAWH HMONG SIGN VOS THOM;Po;0;L;;;;;N;;;;; +16B38;PAHAWH HMONG SIGN VOS TSHAB CEEB;Po;0;L;;;;;N;;;;; +16B39;PAHAWH HMONG SIGN CIM CHEEM;Po;0;L;;;;;N;;;;; +16B3A;PAHAWH HMONG SIGN VOS THIAB;Po;0;L;;;;;N;;;;; +16B3B;PAHAWH HMONG SIGN VOS FEEM;Po;0;L;;;;;N;;;;; +16B3C;PAHAWH HMONG SIGN XYEEM NTXIV;So;0;L;;;;;N;;;;; +16B3D;PAHAWH HMONG SIGN XYEEM RHO;So;0;L;;;;;N;;;;; +16B3E;PAHAWH HMONG SIGN XYEEM TOV;So;0;L;;;;;N;;;;; +16B3F;PAHAWH HMONG SIGN XYEEM FAIB;So;0;L;;;;;N;;;;; +16B40;PAHAWH HMONG SIGN VOS SEEV;Lm;0;L;;;;;N;;;;; +16B41;PAHAWH HMONG SIGN MEEJ SUAB;Lm;0;L;;;;;N;;;;; +16B42;PAHAWH HMONG SIGN VOS NRUA;Lm;0;L;;;;;N;;;;; +16B43;PAHAWH HMONG SIGN IB YAM;Lm;0;L;;;;;N;;;;; +16B44;PAHAWH HMONG SIGN XAUS;Po;0;L;;;;;N;;;;; +16B45;PAHAWH HMONG SIGN CIM TSOV ROG;So;0;L;;;;;N;;;;; +16B50;PAHAWH HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16B51;PAHAWH HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16B52;PAHAWH HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16B53;PAHAWH HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16B54;PAHAWH HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16B55;PAHAWH HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16B56;PAHAWH HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16B57;PAHAWH HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16B58;PAHAWH HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16B59;PAHAWH HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16B5B;PAHAWH HMONG NUMBER TENS;No;0;L;;;;10;N;;;;; +16B5C;PAHAWH HMONG NUMBER HUNDREDS;No;0;L;;;;100;N;;;;; +16B5D;PAHAWH HMONG NUMBER TEN THOUSANDS;No;0;L;;;;10000;N;;;;; +16B5E;PAHAWH HMONG NUMBER MILLIONS;No;0;L;;;;1000000;N;;;;; +16B5F;PAHAWH HMONG NUMBER HUNDRED MILLIONS;No;0;L;;;;100000000;N;;;;; +16B60;PAHAWH HMONG NUMBER TEN BILLIONS;No;0;L;;;;10000000000;N;;;;; +16B61;PAHAWH HMONG NUMBER TRILLIONS;No;0;L;;;;1000000000000;N;;;;; +16B63;PAHAWH HMONG SIGN VOS LUB;Lo;0;L;;;;;N;;;;; +16B64;PAHAWH HMONG SIGN XYOO;Lo;0;L;;;;;N;;;;; +16B65;PAHAWH HMONG SIGN HLI;Lo;0;L;;;;;N;;;;; +16B66;PAHAWH HMONG SIGN THIRD-STAGE HLI;Lo;0;L;;;;;N;;;;; +16B67;PAHAWH HMONG SIGN ZWJ THAJ;Lo;0;L;;;;;N;;;;; +16B68;PAHAWH HMONG SIGN HNUB;Lo;0;L;;;;;N;;;;; +16B69;PAHAWH HMONG SIGN NQIG;Lo;0;L;;;;;N;;;;; +16B6A;PAHAWH HMONG SIGN XIAB;Lo;0;L;;;;;N;;;;; +16B6B;PAHAWH HMONG SIGN NTUJ;Lo;0;L;;;;;N;;;;; +16B6C;PAHAWH HMONG SIGN AV;Lo;0;L;;;;;N;;;;; +16B6D;PAHAWH HMONG SIGN TXHEEJ CEEV;Lo;0;L;;;;;N;;;;; +16B6E;PAHAWH HMONG SIGN MEEJ TSEEB;Lo;0;L;;;;;N;;;;; +16B6F;PAHAWH HMONG SIGN TAU;Lo;0;L;;;;;N;;;;; +16B70;PAHAWH HMONG SIGN LOS;Lo;0;L;;;;;N;;;;; +16B71;PAHAWH HMONG SIGN MUS;Lo;0;L;;;;;N;;;;; +16B72;PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG;Lo;0;L;;;;;N;;;;; +16B73;PAHAWH HMONG SIGN CIM CUAM TSHOOJ;Lo;0;L;;;;;N;;;;; +16B74;PAHAWH HMONG SIGN CIM TXWV;Lo;0;L;;;;;N;;;;; +16B75;PAHAWH HMONG SIGN CIM TXWV CHWV;Lo;0;L;;;;;N;;;;; +16B76;PAHAWH HMONG SIGN CIM PUB DAWB;Lo;0;L;;;;;N;;;;; +16B77;PAHAWH HMONG SIGN CIM NRES TOS;Lo;0;L;;;;;N;;;;; +16B7D;PAHAWH HMONG CLAN SIGN TSHEEJ;Lo;0;L;;;;;N;;;;; +16B7E;PAHAWH HMONG CLAN SIGN YEEG;Lo;0;L;;;;;N;;;;; +16B7F;PAHAWH HMONG CLAN SIGN LIS;Lo;0;L;;;;;N;;;;; +16B80;PAHAWH HMONG CLAN SIGN LAUJ;Lo;0;L;;;;;N;;;;; +16B81;PAHAWH HMONG CLAN SIGN XYOOJ;Lo;0;L;;;;;N;;;;; +16B82;PAHAWH HMONG CLAN SIGN KOO;Lo;0;L;;;;;N;;;;; +16B83;PAHAWH HMONG CLAN SIGN HAWJ;Lo;0;L;;;;;N;;;;; +16B84;PAHAWH HMONG CLAN SIGN MUAS;Lo;0;L;;;;;N;;;;; +16B85;PAHAWH HMONG CLAN SIGN THOJ;Lo;0;L;;;;;N;;;;; +16B86;PAHAWH HMONG CLAN SIGN TSAB;Lo;0;L;;;;;N;;;;; +16B87;PAHAWH HMONG CLAN SIGN PHAB;Lo;0;L;;;;;N;;;;; +16B88;PAHAWH HMONG CLAN SIGN KHAB;Lo;0;L;;;;;N;;;;; +16B89;PAHAWH HMONG CLAN SIGN HAM;Lo;0;L;;;;;N;;;;; +16B8A;PAHAWH HMONG CLAN SIGN VAJ;Lo;0;L;;;;;N;;;;; +16B8B;PAHAWH HMONG CLAN SIGN FAJ;Lo;0;L;;;;;N;;;;; +16B8C;PAHAWH HMONG CLAN SIGN YAJ;Lo;0;L;;;;;N;;;;; +16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;; +16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;; +16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;; +16D40;KIRAT RAI SIGN ANUSVARA;Lm;0;L;;;;;N;;;;; +16D41;KIRAT RAI SIGN TONPI;Lm;0;L;;;;;N;;;;; +16D42;KIRAT RAI SIGN VISARGA;Lm;0;L;;;;;N;;;;; +16D43;KIRAT RAI LETTER A;Lo;0;L;;;;;N;;;;; +16D44;KIRAT RAI LETTER KA;Lo;0;L;;;;;N;;;;; +16D45;KIRAT RAI LETTER KHA;Lo;0;L;;;;;N;;;;; +16D46;KIRAT RAI LETTER GA;Lo;0;L;;;;;N;;;;; +16D47;KIRAT RAI LETTER GHA;Lo;0;L;;;;;N;;;;; +16D48;KIRAT RAI LETTER NGA;Lo;0;L;;;;;N;;;;; +16D49;KIRAT RAI LETTER CA;Lo;0;L;;;;;N;;;;; +16D4A;KIRAT RAI LETTER CHA;Lo;0;L;;;;;N;;;;; +16D4B;KIRAT RAI LETTER JA;Lo;0;L;;;;;N;;;;; +16D4C;KIRAT RAI LETTER JHA;Lo;0;L;;;;;N;;;;; +16D4D;KIRAT RAI LETTER NYA;Lo;0;L;;;;;N;;;;; +16D4E;KIRAT RAI LETTER TTA;Lo;0;L;;;;;N;;;;; +16D4F;KIRAT RAI LETTER TTHA;Lo;0;L;;;;;N;;;;; +16D50;KIRAT RAI LETTER DDA;Lo;0;L;;;;;N;;;;; +16D51;KIRAT RAI LETTER DDHA;Lo;0;L;;;;;N;;;;; +16D52;KIRAT RAI LETTER TA;Lo;0;L;;;;;N;;;;; +16D53;KIRAT RAI LETTER THA;Lo;0;L;;;;;N;;;;; +16D54;KIRAT RAI LETTER DA;Lo;0;L;;;;;N;;;;; +16D55;KIRAT RAI LETTER DHA;Lo;0;L;;;;;N;;;;; +16D56;KIRAT RAI LETTER NA;Lo;0;L;;;;;N;;;;; +16D57;KIRAT RAI LETTER PA;Lo;0;L;;;;;N;;;;; +16D58;KIRAT RAI LETTER PHA;Lo;0;L;;;;;N;;;;; +16D59;KIRAT RAI LETTER BA;Lo;0;L;;;;;N;;;;; +16D5A;KIRAT RAI LETTER BHA;Lo;0;L;;;;;N;;;;; +16D5B;KIRAT RAI LETTER MA;Lo;0;L;;;;;N;;;;; +16D5C;KIRAT RAI LETTER YA;Lo;0;L;;;;;N;;;;; +16D5D;KIRAT RAI LETTER RA;Lo;0;L;;;;;N;;;;; +16D5E;KIRAT RAI LETTER LA;Lo;0;L;;;;;N;;;;; +16D5F;KIRAT RAI LETTER VA;Lo;0;L;;;;;N;;;;; +16D60;KIRAT RAI LETTER SA;Lo;0;L;;;;;N;;;;; +16D61;KIRAT RAI LETTER SHA;Lo;0;L;;;;;N;;;;; +16D62;KIRAT RAI LETTER HA;Lo;0;L;;;;;N;;;;; +16D63;KIRAT RAI VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +16D64;KIRAT RAI VOWEL SIGN I;Lo;0;L;;;;;N;;;;; +16D65;KIRAT RAI VOWEL SIGN U;Lo;0;L;;;;;N;;;;; +16D66;KIRAT RAI VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; +16D67;KIRAT RAI VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +16D68;KIRAT RAI VOWEL SIGN AI;Lo;0;L;16D67 16D67;;;;N;;;;; +16D69;KIRAT RAI VOWEL SIGN O;Lo;0;L;16D63 16D67;;;;N;;;;; +16D6A;KIRAT RAI VOWEL SIGN AU;Lo;0;L;16D69 16D67;;;;N;;;;; +16D6B;KIRAT RAI SIGN VIRAMA;Lm;0;L;;;;;N;;;;; +16D6C;KIRAT RAI SIGN SAAT;Lm;0;L;;;;;N;;;;; +16D6D;KIRAT RAI SIGN YUPI;Po;0;L;;;;;N;;;;; +16D6E;KIRAT RAI DANDA;Po;0;L;;;;;N;;;;; +16D6F;KIRAT RAI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +16D70;KIRAT RAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16D71;KIRAT RAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16D72;KIRAT RAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16D73;KIRAT RAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16D74;KIRAT RAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16D75;KIRAT RAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16D76;KIRAT RAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16D77;KIRAT RAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16D78;KIRAT RAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16D79;KIRAT RAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16E40;MEDEFAIDRIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;16E60; +16E41;MEDEFAIDRIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;16E61; +16E42;MEDEFAIDRIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;16E62; +16E43;MEDEFAIDRIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;16E63; +16E44;MEDEFAIDRIN CAPITAL LETTER ATIU;Lu;0;L;;;;;N;;;;16E64; +16E45;MEDEFAIDRIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;16E65; +16E46;MEDEFAIDRIN CAPITAL LETTER KP;Lu;0;L;;;;;N;;;;16E66; +16E47;MEDEFAIDRIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;16E67; +16E48;MEDEFAIDRIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;16E68; +16E49;MEDEFAIDRIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;16E69; +16E4A;MEDEFAIDRIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;16E6A; +16E4B;MEDEFAIDRIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;16E6B; +16E4C;MEDEFAIDRIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;16E6C; +16E4D;MEDEFAIDRIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;16E6D; +16E4E;MEDEFAIDRIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;16E6E; +16E4F;MEDEFAIDRIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;16E6F; +16E50;MEDEFAIDRIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;16E70; +16E51;MEDEFAIDRIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;16E71; +16E52;MEDEFAIDRIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;16E72; +16E53;MEDEFAIDRIN CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;16E73; +16E54;MEDEFAIDRIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;16E74; +16E55;MEDEFAIDRIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;16E75; +16E56;MEDEFAIDRIN CAPITAL LETTER HP;Lu;0;L;;;;;N;;;;16E76; +16E57;MEDEFAIDRIN CAPITAL LETTER NY;Lu;0;L;;;;;N;;;;16E77; +16E58;MEDEFAIDRIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;16E78; +16E59;MEDEFAIDRIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;16E79; +16E5A;MEDEFAIDRIN CAPITAL LETTER OE;Lu;0;L;;;;;N;;;;16E7A; +16E5B;MEDEFAIDRIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;16E7B; +16E5C;MEDEFAIDRIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;16E7C; +16E5D;MEDEFAIDRIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;16E7D; +16E5E;MEDEFAIDRIN CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;16E7E; +16E5F;MEDEFAIDRIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;16E7F; +16E60;MEDEFAIDRIN SMALL LETTER M;Ll;0;L;;;;;N;;;16E40;;16E40 +16E61;MEDEFAIDRIN SMALL LETTER S;Ll;0;L;;;;;N;;;16E41;;16E41 +16E62;MEDEFAIDRIN SMALL LETTER V;Ll;0;L;;;;;N;;;16E42;;16E42 +16E63;MEDEFAIDRIN SMALL LETTER W;Ll;0;L;;;;;N;;;16E43;;16E43 +16E64;MEDEFAIDRIN SMALL LETTER ATIU;Ll;0;L;;;;;N;;;16E44;;16E44 +16E65;MEDEFAIDRIN SMALL LETTER Z;Ll;0;L;;;;;N;;;16E45;;16E45 +16E66;MEDEFAIDRIN SMALL LETTER KP;Ll;0;L;;;;;N;;;16E46;;16E46 +16E67;MEDEFAIDRIN SMALL LETTER P;Ll;0;L;;;;;N;;;16E47;;16E47 +16E68;MEDEFAIDRIN SMALL LETTER T;Ll;0;L;;;;;N;;;16E48;;16E48 +16E69;MEDEFAIDRIN SMALL LETTER G;Ll;0;L;;;;;N;;;16E49;;16E49 +16E6A;MEDEFAIDRIN SMALL LETTER F;Ll;0;L;;;;;N;;;16E4A;;16E4A +16E6B;MEDEFAIDRIN SMALL LETTER I;Ll;0;L;;;;;N;;;16E4B;;16E4B +16E6C;MEDEFAIDRIN SMALL LETTER K;Ll;0;L;;;;;N;;;16E4C;;16E4C +16E6D;MEDEFAIDRIN SMALL LETTER A;Ll;0;L;;;;;N;;;16E4D;;16E4D +16E6E;MEDEFAIDRIN SMALL LETTER J;Ll;0;L;;;;;N;;;16E4E;;16E4E +16E6F;MEDEFAIDRIN SMALL LETTER E;Ll;0;L;;;;;N;;;16E4F;;16E4F +16E70;MEDEFAIDRIN SMALL LETTER B;Ll;0;L;;;;;N;;;16E50;;16E50 +16E71;MEDEFAIDRIN SMALL LETTER C;Ll;0;L;;;;;N;;;16E51;;16E51 +16E72;MEDEFAIDRIN SMALL LETTER U;Ll;0;L;;;;;N;;;16E52;;16E52 +16E73;MEDEFAIDRIN SMALL LETTER YU;Ll;0;L;;;;;N;;;16E53;;16E53 +16E74;MEDEFAIDRIN SMALL LETTER L;Ll;0;L;;;;;N;;;16E54;;16E54 +16E75;MEDEFAIDRIN SMALL LETTER Q;Ll;0;L;;;;;N;;;16E55;;16E55 +16E76;MEDEFAIDRIN SMALL LETTER HP;Ll;0;L;;;;;N;;;16E56;;16E56 +16E77;MEDEFAIDRIN SMALL LETTER NY;Ll;0;L;;;;;N;;;16E57;;16E57 +16E78;MEDEFAIDRIN SMALL LETTER X;Ll;0;L;;;;;N;;;16E58;;16E58 +16E79;MEDEFAIDRIN SMALL LETTER D;Ll;0;L;;;;;N;;;16E59;;16E59 +16E7A;MEDEFAIDRIN SMALL LETTER OE;Ll;0;L;;;;;N;;;16E5A;;16E5A +16E7B;MEDEFAIDRIN SMALL LETTER N;Ll;0;L;;;;;N;;;16E5B;;16E5B +16E7C;MEDEFAIDRIN SMALL LETTER R;Ll;0;L;;;;;N;;;16E5C;;16E5C +16E7D;MEDEFAIDRIN SMALL LETTER O;Ll;0;L;;;;;N;;;16E5D;;16E5D +16E7E;MEDEFAIDRIN SMALL LETTER AI;Ll;0;L;;;;;N;;;16E5E;;16E5E +16E7F;MEDEFAIDRIN SMALL LETTER Y;Ll;0;L;;;;;N;;;16E5F;;16E5F +16E80;MEDEFAIDRIN DIGIT ZERO;No;0;L;;;;0;N;;;;; +16E81;MEDEFAIDRIN DIGIT ONE;No;0;L;;;;1;N;;;;; +16E82;MEDEFAIDRIN DIGIT TWO;No;0;L;;;;2;N;;;;; +16E83;MEDEFAIDRIN DIGIT THREE;No;0;L;;;;3;N;;;;; +16E84;MEDEFAIDRIN DIGIT FOUR;No;0;L;;;;4;N;;;;; +16E85;MEDEFAIDRIN DIGIT FIVE;No;0;L;;;;5;N;;;;; +16E86;MEDEFAIDRIN DIGIT SIX;No;0;L;;;;6;N;;;;; +16E87;MEDEFAIDRIN DIGIT SEVEN;No;0;L;;;;7;N;;;;; +16E88;MEDEFAIDRIN DIGIT EIGHT;No;0;L;;;;8;N;;;;; +16E89;MEDEFAIDRIN DIGIT NINE;No;0;L;;;;9;N;;;;; +16E8A;MEDEFAIDRIN NUMBER TEN;No;0;L;;;;10;N;;;;; +16E8B;MEDEFAIDRIN NUMBER ELEVEN;No;0;L;;;;11;N;;;;; +16E8C;MEDEFAIDRIN NUMBER TWELVE;No;0;L;;;;12;N;;;;; +16E8D;MEDEFAIDRIN NUMBER THIRTEEN;No;0;L;;;;13;N;;;;; +16E8E;MEDEFAIDRIN NUMBER FOURTEEN;No;0;L;;;;14;N;;;;; +16E8F;MEDEFAIDRIN NUMBER FIFTEEN;No;0;L;;;;15;N;;;;; +16E90;MEDEFAIDRIN NUMBER SIXTEEN;No;0;L;;;;16;N;;;;; +16E91;MEDEFAIDRIN NUMBER SEVENTEEN;No;0;L;;;;17;N;;;;; +16E92;MEDEFAIDRIN NUMBER EIGHTEEN;No;0;L;;;;18;N;;;;; +16E93;MEDEFAIDRIN NUMBER NINETEEN;No;0;L;;;;19;N;;;;; +16E94;MEDEFAIDRIN DIGIT ONE ALTERNATE FORM;No;0;L;;;;1;N;;;;; +16E95;MEDEFAIDRIN DIGIT TWO ALTERNATE FORM;No;0;L;;;;2;N;;;;; +16E96;MEDEFAIDRIN DIGIT THREE ALTERNATE FORM;No;0;L;;;;3;N;;;;; +16E97;MEDEFAIDRIN COMMA;Po;0;L;;;;;N;;;;; +16E98;MEDEFAIDRIN FULL STOP;Po;0;L;;;;;N;;;;; +16E99;MEDEFAIDRIN SYMBOL AIVA;Po;0;L;;;;;N;;;;; +16E9A;MEDEFAIDRIN EXCLAMATION OH;Po;0;L;;;;;N;;;;; +16EA0;BERIA ERFE CAPITAL LETTER ARKAB;Lu;0;L;;;;;N;;;;16EBB; +16EA1;BERIA ERFE CAPITAL LETTER BASIGNA;Lu;0;L;;;;;N;;;;16EBC; +16EA2;BERIA ERFE CAPITAL LETTER DARBAI;Lu;0;L;;;;;N;;;;16EBD; +16EA3;BERIA ERFE CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;16EBE; +16EA4;BERIA ERFE CAPITAL LETTER FITKO;Lu;0;L;;;;;N;;;;16EBF; +16EA5;BERIA ERFE CAPITAL LETTER GOWAY;Lu;0;L;;;;;N;;;;16EC0; +16EA6;BERIA ERFE CAPITAL LETTER HIRDEABO;Lu;0;L;;;;;N;;;;16EC1; +16EA7;BERIA ERFE CAPITAL LETTER I;Lu;0;L;;;;;N;;;;16EC2; +16EA8;BERIA ERFE CAPITAL LETTER DJAI;Lu;0;L;;;;;N;;;;16EC3; +16EA9;BERIA ERFE CAPITAL LETTER KOBO;Lu;0;L;;;;;N;;;;16EC4; +16EAA;BERIA ERFE CAPITAL LETTER LAKKO;Lu;0;L;;;;;N;;;;16EC5; +16EAB;BERIA ERFE CAPITAL LETTER MERI;Lu;0;L;;;;;N;;;;16EC6; +16EAC;BERIA ERFE CAPITAL LETTER NINI;Lu;0;L;;;;;N;;;;16EC7; +16EAD;BERIA ERFE CAPITAL LETTER GNA;Lu;0;L;;;;;N;;;;16EC8; +16EAE;BERIA ERFE CAPITAL LETTER NGAY;Lu;0;L;;;;;N;;;;16EC9; +16EAF;BERIA ERFE CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;16ECA; +16EB0;BERIA ERFE CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;16ECB; +16EB1;BERIA ERFE CAPITAL LETTER ERIGO;Lu;0;L;;;;;N;;;;16ECC; +16EB2;BERIA ERFE CAPITAL LETTER ERIGO TAMURA;Lu;0;L;;;;;N;;;;16ECD; +16EB3;BERIA ERFE CAPITAL LETTER SERI;Lu;0;L;;;;;N;;;;16ECE; +16EB4;BERIA ERFE CAPITAL LETTER SHEP;Lu;0;L;;;;;N;;;;16ECF; +16EB5;BERIA ERFE CAPITAL LETTER TATASOUE;Lu;0;L;;;;;N;;;;16ED0; +16EB6;BERIA ERFE CAPITAL LETTER UI;Lu;0;L;;;;;N;;;;16ED1; +16EB7;BERIA ERFE CAPITAL LETTER WASSE;Lu;0;L;;;;;N;;;;16ED2; +16EB8;BERIA ERFE CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;16ED3; +16EBB;BERIA ERFE SMALL LETTER ARKAB;Ll;0;L;;;;;N;;;16EA0;;16EA0 +16EBC;BERIA ERFE SMALL LETTER BASIGNA;Ll;0;L;;;;;N;;;16EA1;;16EA1 +16EBD;BERIA ERFE SMALL LETTER DARBAI;Ll;0;L;;;;;N;;;16EA2;;16EA2 +16EBE;BERIA ERFE SMALL LETTER EH;Ll;0;L;;;;;N;;;16EA3;;16EA3 +16EBF;BERIA ERFE SMALL LETTER FITKO;Ll;0;L;;;;;N;;;16EA4;;16EA4 +16EC0;BERIA ERFE SMALL LETTER GOWAY;Ll;0;L;;;;;N;;;16EA5;;16EA5 +16EC1;BERIA ERFE SMALL LETTER HIRDEABO;Ll;0;L;;;;;N;;;16EA6;;16EA6 +16EC2;BERIA ERFE SMALL LETTER I;Ll;0;L;;;;;N;;;16EA7;;16EA7 +16EC3;BERIA ERFE SMALL LETTER DJAI;Ll;0;L;;;;;N;;;16EA8;;16EA8 +16EC4;BERIA ERFE SMALL LETTER KOBO;Ll;0;L;;;;;N;;;16EA9;;16EA9 +16EC5;BERIA ERFE SMALL LETTER LAKKO;Ll;0;L;;;;;N;;;16EAA;;16EAA +16EC6;BERIA ERFE SMALL LETTER MERI;Ll;0;L;;;;;N;;;16EAB;;16EAB +16EC7;BERIA ERFE SMALL LETTER NINI;Ll;0;L;;;;;N;;;16EAC;;16EAC +16EC8;BERIA ERFE SMALL LETTER GNA;Ll;0;L;;;;;N;;;16EAD;;16EAD +16EC9;BERIA ERFE SMALL LETTER NGAY;Ll;0;L;;;;;N;;;16EAE;;16EAE +16ECA;BERIA ERFE SMALL LETTER OI;Ll;0;L;;;;;N;;;16EAF;;16EAF +16ECB;BERIA ERFE SMALL LETTER PI;Ll;0;L;;;;;N;;;16EB0;;16EB0 +16ECC;BERIA ERFE SMALL LETTER ERIGO;Ll;0;L;;;;;N;;;16EB1;;16EB1 +16ECD;BERIA ERFE SMALL LETTER ERIGO TAMURA;Ll;0;L;;;;;N;;;16EB2;;16EB2 +16ECE;BERIA ERFE SMALL LETTER SERI;Ll;0;L;;;;;N;;;16EB3;;16EB3 +16ECF;BERIA ERFE SMALL LETTER SHEP;Ll;0;L;;;;;N;;;16EB4;;16EB4 +16ED0;BERIA ERFE SMALL LETTER TATASOUE;Ll;0;L;;;;;N;;;16EB5;;16EB5 +16ED1;BERIA ERFE SMALL LETTER UI;Ll;0;L;;;;;N;;;16EB6;;16EB6 +16ED2;BERIA ERFE SMALL LETTER WASSE;Ll;0;L;;;;;N;;;16EB7;;16EB7 +16ED3;BERIA ERFE SMALL LETTER AY;Ll;0;L;;;;;N;;;16EB8;;16EB8 +16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;; +16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;; +16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;; +16F03;MIAO LETTER PLA;Lo;0;L;;;;;N;;;;; +16F04;MIAO LETTER MA;Lo;0;L;;;;;N;;;;; +16F05;MIAO LETTER MHA;Lo;0;L;;;;;N;;;;; +16F06;MIAO LETTER ARCHAIC MA;Lo;0;L;;;;;N;;;;; +16F07;MIAO LETTER FA;Lo;0;L;;;;;N;;;;; +16F08;MIAO LETTER VA;Lo;0;L;;;;;N;;;;; +16F09;MIAO LETTER VFA;Lo;0;L;;;;;N;;;;; +16F0A;MIAO LETTER TA;Lo;0;L;;;;;N;;;;; +16F0B;MIAO LETTER DA;Lo;0;L;;;;;N;;;;; +16F0C;MIAO LETTER YI TTA;Lo;0;L;;;;;N;;;;; +16F0D;MIAO LETTER YI TA;Lo;0;L;;;;;N;;;;; +16F0E;MIAO LETTER TTA;Lo;0;L;;;;;N;;;;; +16F0F;MIAO LETTER DDA;Lo;0;L;;;;;N;;;;; +16F10;MIAO LETTER NA;Lo;0;L;;;;;N;;;;; +16F11;MIAO LETTER NHA;Lo;0;L;;;;;N;;;;; +16F12;MIAO LETTER YI NNA;Lo;0;L;;;;;N;;;;; +16F13;MIAO LETTER ARCHAIC NA;Lo;0;L;;;;;N;;;;; +16F14;MIAO LETTER NNA;Lo;0;L;;;;;N;;;;; +16F15;MIAO LETTER NNHA;Lo;0;L;;;;;N;;;;; +16F16;MIAO LETTER LA;Lo;0;L;;;;;N;;;;; +16F17;MIAO LETTER LYA;Lo;0;L;;;;;N;;;;; +16F18;MIAO LETTER LHA;Lo;0;L;;;;;N;;;;; +16F19;MIAO LETTER LHYA;Lo;0;L;;;;;N;;;;; +16F1A;MIAO LETTER TLHA;Lo;0;L;;;;;N;;;;; +16F1B;MIAO LETTER DLHA;Lo;0;L;;;;;N;;;;; +16F1C;MIAO LETTER TLHYA;Lo;0;L;;;;;N;;;;; +16F1D;MIAO LETTER DLHYA;Lo;0;L;;;;;N;;;;; +16F1E;MIAO LETTER KA;Lo;0;L;;;;;N;;;;; +16F1F;MIAO LETTER GA;Lo;0;L;;;;;N;;;;; +16F20;MIAO LETTER YI KA;Lo;0;L;;;;;N;;;;; +16F21;MIAO LETTER QA;Lo;0;L;;;;;N;;;;; +16F22;MIAO LETTER QGA;Lo;0;L;;;;;N;;;;; +16F23;MIAO LETTER NGA;Lo;0;L;;;;;N;;;;; +16F24;MIAO LETTER NGHA;Lo;0;L;;;;;N;;;;; +16F25;MIAO LETTER ARCHAIC NGA;Lo;0;L;;;;;N;;;;; +16F26;MIAO LETTER HA;Lo;0;L;;;;;N;;;;; +16F27;MIAO LETTER XA;Lo;0;L;;;;;N;;;;; +16F28;MIAO LETTER GHA;Lo;0;L;;;;;N;;;;; +16F29;MIAO LETTER GHHA;Lo;0;L;;;;;N;;;;; +16F2A;MIAO LETTER TSSA;Lo;0;L;;;;;N;;;;; +16F2B;MIAO LETTER DZZA;Lo;0;L;;;;;N;;;;; +16F2C;MIAO LETTER NYA;Lo;0;L;;;;;N;;;;; +16F2D;MIAO LETTER NYHA;Lo;0;L;;;;;N;;;;; +16F2E;MIAO LETTER TSHA;Lo;0;L;;;;;N;;;;; +16F2F;MIAO LETTER DZHA;Lo;0;L;;;;;N;;;;; +16F30;MIAO LETTER YI TSHA;Lo;0;L;;;;;N;;;;; +16F31;MIAO LETTER YI DZHA;Lo;0;L;;;;;N;;;;; +16F32;MIAO LETTER REFORMED TSHA;Lo;0;L;;;;;N;;;;; +16F33;MIAO LETTER SHA;Lo;0;L;;;;;N;;;;; +16F34;MIAO LETTER SSA;Lo;0;L;;;;;N;;;;; +16F35;MIAO LETTER ZHA;Lo;0;L;;;;;N;;;;; +16F36;MIAO LETTER ZSHA;Lo;0;L;;;;;N;;;;; +16F37;MIAO LETTER TSA;Lo;0;L;;;;;N;;;;; +16F38;MIAO LETTER DZA;Lo;0;L;;;;;N;;;;; +16F39;MIAO LETTER YI TSA;Lo;0;L;;;;;N;;;;; +16F3A;MIAO LETTER SA;Lo;0;L;;;;;N;;;;; +16F3B;MIAO LETTER ZA;Lo;0;L;;;;;N;;;;; +16F3C;MIAO LETTER ZSA;Lo;0;L;;;;;N;;;;; +16F3D;MIAO LETTER ZZA;Lo;0;L;;;;;N;;;;; +16F3E;MIAO LETTER ZZSA;Lo;0;L;;;;;N;;;;; +16F3F;MIAO LETTER ARCHAIC ZZA;Lo;0;L;;;;;N;;;;; +16F40;MIAO LETTER ZZYA;Lo;0;L;;;;;N;;;;; +16F41;MIAO LETTER ZZSYA;Lo;0;L;;;;;N;;;;; +16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;; +16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;; +16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;; +16F45;MIAO LETTER BRI;Lo;0;L;;;;;N;;;;; +16F46;MIAO LETTER SYI;Lo;0;L;;;;;N;;;;; +16F47;MIAO LETTER DZYI;Lo;0;L;;;;;N;;;;; +16F48;MIAO LETTER TE;Lo;0;L;;;;;N;;;;; +16F49;MIAO LETTER TSE;Lo;0;L;;;;;N;;;;; +16F4A;MIAO LETTER RTE;Lo;0;L;;;;;N;;;;; +16F4F;MIAO SIGN CONSONANT MODIFIER BAR;Mn;0;NSM;;;;;N;;;;; +16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;; +16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;; +16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;; +16F53;MIAO SIGN REFORMED ASPIRATION;Mc;0;L;;;;;N;;;;; +16F54;MIAO VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +16F55;MIAO VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +16F56;MIAO VOWEL SIGN AHH;Mc;0;L;;;;;N;;;;; +16F57;MIAO VOWEL SIGN AN;Mc;0;L;;;;;N;;;;; +16F58;MIAO VOWEL SIGN ANG;Mc;0;L;;;;;N;;;;; +16F59;MIAO VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +16F5A;MIAO VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +16F5B;MIAO VOWEL SIGN WO;Mc;0;L;;;;;N;;;;; +16F5C;MIAO VOWEL SIGN W;Mc;0;L;;;;;N;;;;; +16F5D;MIAO VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +16F5E;MIAO VOWEL SIGN EN;Mc;0;L;;;;;N;;;;; +16F5F;MIAO VOWEL SIGN ENG;Mc;0;L;;;;;N;;;;; +16F60;MIAO VOWEL SIGN OEY;Mc;0;L;;;;;N;;;;; +16F61;MIAO VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +16F62;MIAO VOWEL SIGN IA;Mc;0;L;;;;;N;;;;; +16F63;MIAO VOWEL SIGN IAN;Mc;0;L;;;;;N;;;;; +16F64;MIAO VOWEL SIGN IANG;Mc;0;L;;;;;N;;;;; +16F65;MIAO VOWEL SIGN IO;Mc;0;L;;;;;N;;;;; +16F66;MIAO VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +16F67;MIAO VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +16F68;MIAO VOWEL SIGN IU;Mc;0;L;;;;;N;;;;; +16F69;MIAO VOWEL SIGN ING;Mc;0;L;;;;;N;;;;; +16F6A;MIAO VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +16F6B;MIAO VOWEL SIGN UA;Mc;0;L;;;;;N;;;;; +16F6C;MIAO VOWEL SIGN UAN;Mc;0;L;;;;;N;;;;; +16F6D;MIAO VOWEL SIGN UANG;Mc;0;L;;;;;N;;;;; +16F6E;MIAO VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +16F6F;MIAO VOWEL SIGN UEI;Mc;0;L;;;;;N;;;;; +16F70;MIAO VOWEL SIGN UNG;Mc;0;L;;;;;N;;;;; +16F71;MIAO VOWEL SIGN Y;Mc;0;L;;;;;N;;;;; +16F72;MIAO VOWEL SIGN YI;Mc;0;L;;;;;N;;;;; +16F73;MIAO VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +16F74;MIAO VOWEL SIGN AEE;Mc;0;L;;;;;N;;;;; +16F75;MIAO VOWEL SIGN ERR;Mc;0;L;;;;;N;;;;; +16F76;MIAO VOWEL SIGN ROUNDED ERR;Mc;0;L;;;;;N;;;;; +16F77;MIAO VOWEL SIGN ER;Mc;0;L;;;;;N;;;;; +16F78;MIAO VOWEL SIGN ROUNDED ER;Mc;0;L;;;;;N;;;;; +16F79;MIAO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +16F7A;MIAO VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; +16F7B;MIAO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;; +16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;; +16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;; +16F7F;MIAO VOWEL SIGN UOG;Mc;0;L;;;;;N;;;;; +16F80;MIAO VOWEL SIGN YUI;Mc;0;L;;;;;N;;;;; +16F81;MIAO VOWEL SIGN OG;Mc;0;L;;;;;N;;;;; +16F82;MIAO VOWEL SIGN OER;Mc;0;L;;;;;N;;;;; +16F83;MIAO VOWEL SIGN VW;Mc;0;L;;;;;N;;;;; +16F84;MIAO VOWEL SIGN IG;Mc;0;L;;;;;N;;;;; +16F85;MIAO VOWEL SIGN EA;Mc;0;L;;;;;N;;;;; +16F86;MIAO VOWEL SIGN IONG;Mc;0;L;;;;;N;;;;; +16F87;MIAO VOWEL SIGN UI;Mc;0;L;;;;;N;;;;; +16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;; +16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;; +16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;; +16F92;MIAO TONE BELOW;Mn;0;NSM;;;;;N;;;;; +16F93;MIAO LETTER TONE-2;Lm;0;L;;;;;N;;;;; +16F94;MIAO LETTER TONE-3;Lm;0;L;;;;;N;;;;; +16F95;MIAO LETTER TONE-4;Lm;0;L;;;;;N;;;;; +16F96;MIAO LETTER TONE-5;Lm;0;L;;;;;N;;;;; +16F97;MIAO LETTER TONE-6;Lm;0;L;;;;;N;;;;; +16F98;MIAO LETTER TONE-7;Lm;0;L;;;;;N;;;;; +16F99;MIAO LETTER TONE-8;Lm;0;L;;;;;N;;;;; +16F9A;MIAO LETTER REFORMED TONE-1;Lm;0;L;;;;;N;;;;; +16F9B;MIAO LETTER REFORMED TONE-2;Lm;0;L;;;;;N;;;;; +16F9C;MIAO LETTER REFORMED TONE-4;Lm;0;L;;;;;N;;;;; +16F9D;MIAO LETTER REFORMED TONE-5;Lm;0;L;;;;;N;;;;; +16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; +16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; +16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE1;NUSHU ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE2;OLD CHINESE HOOK MARK;Po;0;ON;;;;;N;;;;; +16FE3;OLD CHINESE ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE4;KHITAN SMALL SCRIPT FILLER;Mn;0;NSM;;;;;N;;;;; +16FF0;VIETNAMESE ALTERNATE READING MARK CA;Mc;6;L;;;;;N;;;;; +16FF1;VIETNAMESE ALTERNATE READING MARK NHAY;Mc;6;L;;;;;N;;;;; +16FF2;CHINESE SMALL SIMPLIFIED ER;Lm;0;L;;;;;N;;;;; +16FF3;CHINESE SMALL TRADITIONAL ER;Lm;0;L;;;;;N;;;;; +16FF4;YANGQIN SIGN SLOW ONE BEAT;Nl;0;L;;;;1;N;;;;; +16FF5;YANGQIN SIGN SLOW THREE HALF BEATS;Nl;0;L;;;;3/2;N;;;;; +16FF6;YANGQIN SIGN SLOW TWO BEATS;Nl;0;L;;;;2;N;;;;; +17000;;Lo;0;L;;;;;N;;;;; +187FF;;Lo;0;L;;;;;N;;;;; +18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;; +18801;TANGUT COMPONENT-002;Lo;0;L;;;;;N;;;;; +18802;TANGUT COMPONENT-003;Lo;0;L;;;;;N;;;;; +18803;TANGUT COMPONENT-004;Lo;0;L;;;;;N;;;;; +18804;TANGUT COMPONENT-005;Lo;0;L;;;;;N;;;;; +18805;TANGUT COMPONENT-006;Lo;0;L;;;;;N;;;;; +18806;TANGUT COMPONENT-007;Lo;0;L;;;;;N;;;;; +18807;TANGUT COMPONENT-008;Lo;0;L;;;;;N;;;;; +18808;TANGUT COMPONENT-009;Lo;0;L;;;;;N;;;;; +18809;TANGUT COMPONENT-010;Lo;0;L;;;;;N;;;;; +1880A;TANGUT COMPONENT-011;Lo;0;L;;;;;N;;;;; +1880B;TANGUT COMPONENT-012;Lo;0;L;;;;;N;;;;; +1880C;TANGUT COMPONENT-013;Lo;0;L;;;;;N;;;;; +1880D;TANGUT COMPONENT-014;Lo;0;L;;;;;N;;;;; +1880E;TANGUT COMPONENT-015;Lo;0;L;;;;;N;;;;; +1880F;TANGUT COMPONENT-016;Lo;0;L;;;;;N;;;;; +18810;TANGUT COMPONENT-017;Lo;0;L;;;;;N;;;;; +18811;TANGUT COMPONENT-018;Lo;0;L;;;;;N;;;;; +18812;TANGUT COMPONENT-019;Lo;0;L;;;;;N;;;;; +18813;TANGUT COMPONENT-020;Lo;0;L;;;;;N;;;;; +18814;TANGUT COMPONENT-021;Lo;0;L;;;;;N;;;;; +18815;TANGUT COMPONENT-022;Lo;0;L;;;;;N;;;;; +18816;TANGUT COMPONENT-023;Lo;0;L;;;;;N;;;;; +18817;TANGUT COMPONENT-024;Lo;0;L;;;;;N;;;;; +18818;TANGUT COMPONENT-025;Lo;0;L;;;;;N;;;;; +18819;TANGUT COMPONENT-026;Lo;0;L;;;;;N;;;;; +1881A;TANGUT COMPONENT-027;Lo;0;L;;;;;N;;;;; +1881B;TANGUT COMPONENT-028;Lo;0;L;;;;;N;;;;; +1881C;TANGUT COMPONENT-029;Lo;0;L;;;;;N;;;;; +1881D;TANGUT COMPONENT-030;Lo;0;L;;;;;N;;;;; +1881E;TANGUT COMPONENT-031;Lo;0;L;;;;;N;;;;; +1881F;TANGUT COMPONENT-032;Lo;0;L;;;;;N;;;;; +18820;TANGUT COMPONENT-033;Lo;0;L;;;;;N;;;;; +18821;TANGUT COMPONENT-034;Lo;0;L;;;;;N;;;;; +18822;TANGUT COMPONENT-035;Lo;0;L;;;;;N;;;;; +18823;TANGUT COMPONENT-036;Lo;0;L;;;;;N;;;;; +18824;TANGUT COMPONENT-037;Lo;0;L;;;;;N;;;;; +18825;TANGUT COMPONENT-038;Lo;0;L;;;;;N;;;;; +18826;TANGUT COMPONENT-039;Lo;0;L;;;;;N;;;;; +18827;TANGUT COMPONENT-040;Lo;0;L;;;;;N;;;;; +18828;TANGUT COMPONENT-041;Lo;0;L;;;;;N;;;;; +18829;TANGUT COMPONENT-042;Lo;0;L;;;;;N;;;;; +1882A;TANGUT COMPONENT-043;Lo;0;L;;;;;N;;;;; +1882B;TANGUT COMPONENT-044;Lo;0;L;;;;;N;;;;; +1882C;TANGUT COMPONENT-045;Lo;0;L;;;;;N;;;;; +1882D;TANGUT COMPONENT-046;Lo;0;L;;;;;N;;;;; +1882E;TANGUT COMPONENT-047;Lo;0;L;;;;;N;;;;; +1882F;TANGUT COMPONENT-048;Lo;0;L;;;;;N;;;;; +18830;TANGUT COMPONENT-049;Lo;0;L;;;;;N;;;;; +18831;TANGUT COMPONENT-050;Lo;0;L;;;;;N;;;;; +18832;TANGUT COMPONENT-051;Lo;0;L;;;;;N;;;;; +18833;TANGUT COMPONENT-052;Lo;0;L;;;;;N;;;;; +18834;TANGUT COMPONENT-053;Lo;0;L;;;;;N;;;;; +18835;TANGUT COMPONENT-054;Lo;0;L;;;;;N;;;;; +18836;TANGUT COMPONENT-055;Lo;0;L;;;;;N;;;;; +18837;TANGUT COMPONENT-056;Lo;0;L;;;;;N;;;;; +18838;TANGUT COMPONENT-057;Lo;0;L;;;;;N;;;;; +18839;TANGUT COMPONENT-058;Lo;0;L;;;;;N;;;;; +1883A;TANGUT COMPONENT-059;Lo;0;L;;;;;N;;;;; +1883B;TANGUT COMPONENT-060;Lo;0;L;;;;;N;;;;; +1883C;TANGUT COMPONENT-061;Lo;0;L;;;;;N;;;;; +1883D;TANGUT COMPONENT-062;Lo;0;L;;;;;N;;;;; +1883E;TANGUT COMPONENT-063;Lo;0;L;;;;;N;;;;; +1883F;TANGUT COMPONENT-064;Lo;0;L;;;;;N;;;;; +18840;TANGUT COMPONENT-065;Lo;0;L;;;;;N;;;;; +18841;TANGUT COMPONENT-066;Lo;0;L;;;;;N;;;;; +18842;TANGUT COMPONENT-067;Lo;0;L;;;;;N;;;;; +18843;TANGUT COMPONENT-068;Lo;0;L;;;;;N;;;;; +18844;TANGUT COMPONENT-069;Lo;0;L;;;;;N;;;;; +18845;TANGUT COMPONENT-070;Lo;0;L;;;;;N;;;;; +18846;TANGUT COMPONENT-071;Lo;0;L;;;;;N;;;;; +18847;TANGUT COMPONENT-072;Lo;0;L;;;;;N;;;;; +18848;TANGUT COMPONENT-073;Lo;0;L;;;;;N;;;;; +18849;TANGUT COMPONENT-074;Lo;0;L;;;;;N;;;;; +1884A;TANGUT COMPONENT-075;Lo;0;L;;;;;N;;;;; +1884B;TANGUT COMPONENT-076;Lo;0;L;;;;;N;;;;; +1884C;TANGUT COMPONENT-077;Lo;0;L;;;;;N;;;;; +1884D;TANGUT COMPONENT-078;Lo;0;L;;;;;N;;;;; +1884E;TANGUT COMPONENT-079;Lo;0;L;;;;;N;;;;; +1884F;TANGUT COMPONENT-080;Lo;0;L;;;;;N;;;;; +18850;TANGUT COMPONENT-081;Lo;0;L;;;;;N;;;;; +18851;TANGUT COMPONENT-082;Lo;0;L;;;;;N;;;;; +18852;TANGUT COMPONENT-083;Lo;0;L;;;;;N;;;;; +18853;TANGUT COMPONENT-084;Lo;0;L;;;;;N;;;;; +18854;TANGUT COMPONENT-085;Lo;0;L;;;;;N;;;;; +18855;TANGUT COMPONENT-086;Lo;0;L;;;;;N;;;;; +18856;TANGUT COMPONENT-087;Lo;0;L;;;;;N;;;;; +18857;TANGUT COMPONENT-088;Lo;0;L;;;;;N;;;;; +18858;TANGUT COMPONENT-089;Lo;0;L;;;;;N;;;;; +18859;TANGUT COMPONENT-090;Lo;0;L;;;;;N;;;;; +1885A;TANGUT COMPONENT-091;Lo;0;L;;;;;N;;;;; +1885B;TANGUT COMPONENT-092;Lo;0;L;;;;;N;;;;; +1885C;TANGUT COMPONENT-093;Lo;0;L;;;;;N;;;;; +1885D;TANGUT COMPONENT-094;Lo;0;L;;;;;N;;;;; +1885E;TANGUT COMPONENT-095;Lo;0;L;;;;;N;;;;; +1885F;TANGUT COMPONENT-096;Lo;0;L;;;;;N;;;;; +18860;TANGUT COMPONENT-097;Lo;0;L;;;;;N;;;;; +18861;TANGUT COMPONENT-098;Lo;0;L;;;;;N;;;;; +18862;TANGUT COMPONENT-099;Lo;0;L;;;;;N;;;;; +18863;TANGUT COMPONENT-100;Lo;0;L;;;;;N;;;;; +18864;TANGUT COMPONENT-101;Lo;0;L;;;;;N;;;;; +18865;TANGUT COMPONENT-102;Lo;0;L;;;;;N;;;;; +18866;TANGUT COMPONENT-103;Lo;0;L;;;;;N;;;;; +18867;TANGUT COMPONENT-104;Lo;0;L;;;;;N;;;;; +18868;TANGUT COMPONENT-105;Lo;0;L;;;;;N;;;;; +18869;TANGUT COMPONENT-106;Lo;0;L;;;;;N;;;;; +1886A;TANGUT COMPONENT-107;Lo;0;L;;;;;N;;;;; +1886B;TANGUT COMPONENT-108;Lo;0;L;;;;;N;;;;; +1886C;TANGUT COMPONENT-109;Lo;0;L;;;;;N;;;;; +1886D;TANGUT COMPONENT-110;Lo;0;L;;;;;N;;;;; +1886E;TANGUT COMPONENT-111;Lo;0;L;;;;;N;;;;; +1886F;TANGUT COMPONENT-112;Lo;0;L;;;;;N;;;;; +18870;TANGUT COMPONENT-113;Lo;0;L;;;;;N;;;;; +18871;TANGUT COMPONENT-114;Lo;0;L;;;;;N;;;;; +18872;TANGUT COMPONENT-115;Lo;0;L;;;;;N;;;;; +18873;TANGUT COMPONENT-116;Lo;0;L;;;;;N;;;;; +18874;TANGUT COMPONENT-117;Lo;0;L;;;;;N;;;;; +18875;TANGUT COMPONENT-118;Lo;0;L;;;;;N;;;;; +18876;TANGUT COMPONENT-119;Lo;0;L;;;;;N;;;;; +18877;TANGUT COMPONENT-120;Lo;0;L;;;;;N;;;;; +18878;TANGUT COMPONENT-121;Lo;0;L;;;;;N;;;;; +18879;TANGUT COMPONENT-122;Lo;0;L;;;;;N;;;;; +1887A;TANGUT COMPONENT-123;Lo;0;L;;;;;N;;;;; +1887B;TANGUT COMPONENT-124;Lo;0;L;;;;;N;;;;; +1887C;TANGUT COMPONENT-125;Lo;0;L;;;;;N;;;;; +1887D;TANGUT COMPONENT-126;Lo;0;L;;;;;N;;;;; +1887E;TANGUT COMPONENT-127;Lo;0;L;;;;;N;;;;; +1887F;TANGUT COMPONENT-128;Lo;0;L;;;;;N;;;;; +18880;TANGUT COMPONENT-129;Lo;0;L;;;;;N;;;;; +18881;TANGUT COMPONENT-130;Lo;0;L;;;;;N;;;;; +18882;TANGUT COMPONENT-131;Lo;0;L;;;;;N;;;;; +18883;TANGUT COMPONENT-132;Lo;0;L;;;;;N;;;;; +18884;TANGUT COMPONENT-133;Lo;0;L;;;;;N;;;;; +18885;TANGUT COMPONENT-134;Lo;0;L;;;;;N;;;;; +18886;TANGUT COMPONENT-135;Lo;0;L;;;;;N;;;;; +18887;TANGUT COMPONENT-136;Lo;0;L;;;;;N;;;;; +18888;TANGUT COMPONENT-137;Lo;0;L;;;;;N;;;;; +18889;TANGUT COMPONENT-138;Lo;0;L;;;;;N;;;;; +1888A;TANGUT COMPONENT-139;Lo;0;L;;;;;N;;;;; +1888B;TANGUT COMPONENT-140;Lo;0;L;;;;;N;;;;; +1888C;TANGUT COMPONENT-141;Lo;0;L;;;;;N;;;;; +1888D;TANGUT COMPONENT-142;Lo;0;L;;;;;N;;;;; +1888E;TANGUT COMPONENT-143;Lo;0;L;;;;;N;;;;; +1888F;TANGUT COMPONENT-144;Lo;0;L;;;;;N;;;;; +18890;TANGUT COMPONENT-145;Lo;0;L;;;;;N;;;;; +18891;TANGUT COMPONENT-146;Lo;0;L;;;;;N;;;;; +18892;TANGUT COMPONENT-147;Lo;0;L;;;;;N;;;;; +18893;TANGUT COMPONENT-148;Lo;0;L;;;;;N;;;;; +18894;TANGUT COMPONENT-149;Lo;0;L;;;;;N;;;;; +18895;TANGUT COMPONENT-150;Lo;0;L;;;;;N;;;;; +18896;TANGUT COMPONENT-151;Lo;0;L;;;;;N;;;;; +18897;TANGUT COMPONENT-152;Lo;0;L;;;;;N;;;;; +18898;TANGUT COMPONENT-153;Lo;0;L;;;;;N;;;;; +18899;TANGUT COMPONENT-154;Lo;0;L;;;;;N;;;;; +1889A;TANGUT COMPONENT-155;Lo;0;L;;;;;N;;;;; +1889B;TANGUT COMPONENT-156;Lo;0;L;;;;;N;;;;; +1889C;TANGUT COMPONENT-157;Lo;0;L;;;;;N;;;;; +1889D;TANGUT COMPONENT-158;Lo;0;L;;;;;N;;;;; +1889E;TANGUT COMPONENT-159;Lo;0;L;;;;;N;;;;; +1889F;TANGUT COMPONENT-160;Lo;0;L;;;;;N;;;;; +188A0;TANGUT COMPONENT-161;Lo;0;L;;;;;N;;;;; +188A1;TANGUT COMPONENT-162;Lo;0;L;;;;;N;;;;; +188A2;TANGUT COMPONENT-163;Lo;0;L;;;;;N;;;;; +188A3;TANGUT COMPONENT-164;Lo;0;L;;;;;N;;;;; +188A4;TANGUT COMPONENT-165;Lo;0;L;;;;;N;;;;; +188A5;TANGUT COMPONENT-166;Lo;0;L;;;;;N;;;;; +188A6;TANGUT COMPONENT-167;Lo;0;L;;;;;N;;;;; +188A7;TANGUT COMPONENT-168;Lo;0;L;;;;;N;;;;; +188A8;TANGUT COMPONENT-169;Lo;0;L;;;;;N;;;;; +188A9;TANGUT COMPONENT-170;Lo;0;L;;;;;N;;;;; +188AA;TANGUT COMPONENT-171;Lo;0;L;;;;;N;;;;; +188AB;TANGUT COMPONENT-172;Lo;0;L;;;;;N;;;;; +188AC;TANGUT COMPONENT-173;Lo;0;L;;;;;N;;;;; +188AD;TANGUT COMPONENT-174;Lo;0;L;;;;;N;;;;; +188AE;TANGUT COMPONENT-175;Lo;0;L;;;;;N;;;;; +188AF;TANGUT COMPONENT-176;Lo;0;L;;;;;N;;;;; +188B0;TANGUT COMPONENT-177;Lo;0;L;;;;;N;;;;; +188B1;TANGUT COMPONENT-178;Lo;0;L;;;;;N;;;;; +188B2;TANGUT COMPONENT-179;Lo;0;L;;;;;N;;;;; +188B3;TANGUT COMPONENT-180;Lo;0;L;;;;;N;;;;; +188B4;TANGUT COMPONENT-181;Lo;0;L;;;;;N;;;;; +188B5;TANGUT COMPONENT-182;Lo;0;L;;;;;N;;;;; +188B6;TANGUT COMPONENT-183;Lo;0;L;;;;;N;;;;; +188B7;TANGUT COMPONENT-184;Lo;0;L;;;;;N;;;;; +188B8;TANGUT COMPONENT-185;Lo;0;L;;;;;N;;;;; +188B9;TANGUT COMPONENT-186;Lo;0;L;;;;;N;;;;; +188BA;TANGUT COMPONENT-187;Lo;0;L;;;;;N;;;;; +188BB;TANGUT COMPONENT-188;Lo;0;L;;;;;N;;;;; +188BC;TANGUT COMPONENT-189;Lo;0;L;;;;;N;;;;; +188BD;TANGUT COMPONENT-190;Lo;0;L;;;;;N;;;;; +188BE;TANGUT COMPONENT-191;Lo;0;L;;;;;N;;;;; +188BF;TANGUT COMPONENT-192;Lo;0;L;;;;;N;;;;; +188C0;TANGUT COMPONENT-193;Lo;0;L;;;;;N;;;;; +188C1;TANGUT COMPONENT-194;Lo;0;L;;;;;N;;;;; +188C2;TANGUT COMPONENT-195;Lo;0;L;;;;;N;;;;; +188C3;TANGUT COMPONENT-196;Lo;0;L;;;;;N;;;;; +188C4;TANGUT COMPONENT-197;Lo;0;L;;;;;N;;;;; +188C5;TANGUT COMPONENT-198;Lo;0;L;;;;;N;;;;; +188C6;TANGUT COMPONENT-199;Lo;0;L;;;;;N;;;;; +188C7;TANGUT COMPONENT-200;Lo;0;L;;;;;N;;;;; +188C8;TANGUT COMPONENT-201;Lo;0;L;;;;;N;;;;; +188C9;TANGUT COMPONENT-202;Lo;0;L;;;;;N;;;;; +188CA;TANGUT COMPONENT-203;Lo;0;L;;;;;N;;;;; +188CB;TANGUT COMPONENT-204;Lo;0;L;;;;;N;;;;; +188CC;TANGUT COMPONENT-205;Lo;0;L;;;;;N;;;;; +188CD;TANGUT COMPONENT-206;Lo;0;L;;;;;N;;;;; +188CE;TANGUT COMPONENT-207;Lo;0;L;;;;;N;;;;; +188CF;TANGUT COMPONENT-208;Lo;0;L;;;;;N;;;;; +188D0;TANGUT COMPONENT-209;Lo;0;L;;;;;N;;;;; +188D1;TANGUT COMPONENT-210;Lo;0;L;;;;;N;;;;; +188D2;TANGUT COMPONENT-211;Lo;0;L;;;;;N;;;;; +188D3;TANGUT COMPONENT-212;Lo;0;L;;;;;N;;;;; +188D4;TANGUT COMPONENT-213;Lo;0;L;;;;;N;;;;; +188D5;TANGUT COMPONENT-214;Lo;0;L;;;;;N;;;;; +188D6;TANGUT COMPONENT-215;Lo;0;L;;;;;N;;;;; +188D7;TANGUT COMPONENT-216;Lo;0;L;;;;;N;;;;; +188D8;TANGUT COMPONENT-217;Lo;0;L;;;;;N;;;;; +188D9;TANGUT COMPONENT-218;Lo;0;L;;;;;N;;;;; +188DA;TANGUT COMPONENT-219;Lo;0;L;;;;;N;;;;; +188DB;TANGUT COMPONENT-220;Lo;0;L;;;;;N;;;;; +188DC;TANGUT COMPONENT-221;Lo;0;L;;;;;N;;;;; +188DD;TANGUT COMPONENT-222;Lo;0;L;;;;;N;;;;; +188DE;TANGUT COMPONENT-223;Lo;0;L;;;;;N;;;;; +188DF;TANGUT COMPONENT-224;Lo;0;L;;;;;N;;;;; +188E0;TANGUT COMPONENT-225;Lo;0;L;;;;;N;;;;; +188E1;TANGUT COMPONENT-226;Lo;0;L;;;;;N;;;;; +188E2;TANGUT COMPONENT-227;Lo;0;L;;;;;N;;;;; +188E3;TANGUT COMPONENT-228;Lo;0;L;;;;;N;;;;; +188E4;TANGUT COMPONENT-229;Lo;0;L;;;;;N;;;;; +188E5;TANGUT COMPONENT-230;Lo;0;L;;;;;N;;;;; +188E6;TANGUT COMPONENT-231;Lo;0;L;;;;;N;;;;; +188E7;TANGUT COMPONENT-232;Lo;0;L;;;;;N;;;;; +188E8;TANGUT COMPONENT-233;Lo;0;L;;;;;N;;;;; +188E9;TANGUT COMPONENT-234;Lo;0;L;;;;;N;;;;; +188EA;TANGUT COMPONENT-235;Lo;0;L;;;;;N;;;;; +188EB;TANGUT COMPONENT-236;Lo;0;L;;;;;N;;;;; +188EC;TANGUT COMPONENT-237;Lo;0;L;;;;;N;;;;; +188ED;TANGUT COMPONENT-238;Lo;0;L;;;;;N;;;;; +188EE;TANGUT COMPONENT-239;Lo;0;L;;;;;N;;;;; +188EF;TANGUT COMPONENT-240;Lo;0;L;;;;;N;;;;; +188F0;TANGUT COMPONENT-241;Lo;0;L;;;;;N;;;;; +188F1;TANGUT COMPONENT-242;Lo;0;L;;;;;N;;;;; +188F2;TANGUT COMPONENT-243;Lo;0;L;;;;;N;;;;; +188F3;TANGUT COMPONENT-244;Lo;0;L;;;;;N;;;;; +188F4;TANGUT COMPONENT-245;Lo;0;L;;;;;N;;;;; +188F5;TANGUT COMPONENT-246;Lo;0;L;;;;;N;;;;; +188F6;TANGUT COMPONENT-247;Lo;0;L;;;;;N;;;;; +188F7;TANGUT COMPONENT-248;Lo;0;L;;;;;N;;;;; +188F8;TANGUT COMPONENT-249;Lo;0;L;;;;;N;;;;; +188F9;TANGUT COMPONENT-250;Lo;0;L;;;;;N;;;;; +188FA;TANGUT COMPONENT-251;Lo;0;L;;;;;N;;;;; +188FB;TANGUT COMPONENT-252;Lo;0;L;;;;;N;;;;; +188FC;TANGUT COMPONENT-253;Lo;0;L;;;;;N;;;;; +188FD;TANGUT COMPONENT-254;Lo;0;L;;;;;N;;;;; +188FE;TANGUT COMPONENT-255;Lo;0;L;;;;;N;;;;; +188FF;TANGUT COMPONENT-256;Lo;0;L;;;;;N;;;;; +18900;TANGUT COMPONENT-257;Lo;0;L;;;;;N;;;;; +18901;TANGUT COMPONENT-258;Lo;0;L;;;;;N;;;;; +18902;TANGUT COMPONENT-259;Lo;0;L;;;;;N;;;;; +18903;TANGUT COMPONENT-260;Lo;0;L;;;;;N;;;;; +18904;TANGUT COMPONENT-261;Lo;0;L;;;;;N;;;;; +18905;TANGUT COMPONENT-262;Lo;0;L;;;;;N;;;;; +18906;TANGUT COMPONENT-263;Lo;0;L;;;;;N;;;;; +18907;TANGUT COMPONENT-264;Lo;0;L;;;;;N;;;;; +18908;TANGUT COMPONENT-265;Lo;0;L;;;;;N;;;;; +18909;TANGUT COMPONENT-266;Lo;0;L;;;;;N;;;;; +1890A;TANGUT COMPONENT-267;Lo;0;L;;;;;N;;;;; +1890B;TANGUT COMPONENT-268;Lo;0;L;;;;;N;;;;; +1890C;TANGUT COMPONENT-269;Lo;0;L;;;;;N;;;;; +1890D;TANGUT COMPONENT-270;Lo;0;L;;;;;N;;;;; +1890E;TANGUT COMPONENT-271;Lo;0;L;;;;;N;;;;; +1890F;TANGUT COMPONENT-272;Lo;0;L;;;;;N;;;;; +18910;TANGUT COMPONENT-273;Lo;0;L;;;;;N;;;;; +18911;TANGUT COMPONENT-274;Lo;0;L;;;;;N;;;;; +18912;TANGUT COMPONENT-275;Lo;0;L;;;;;N;;;;; +18913;TANGUT COMPONENT-276;Lo;0;L;;;;;N;;;;; +18914;TANGUT COMPONENT-277;Lo;0;L;;;;;N;;;;; +18915;TANGUT COMPONENT-278;Lo;0;L;;;;;N;;;;; +18916;TANGUT COMPONENT-279;Lo;0;L;;;;;N;;;;; +18917;TANGUT COMPONENT-280;Lo;0;L;;;;;N;;;;; +18918;TANGUT COMPONENT-281;Lo;0;L;;;;;N;;;;; +18919;TANGUT COMPONENT-282;Lo;0;L;;;;;N;;;;; +1891A;TANGUT COMPONENT-283;Lo;0;L;;;;;N;;;;; +1891B;TANGUT COMPONENT-284;Lo;0;L;;;;;N;;;;; +1891C;TANGUT COMPONENT-285;Lo;0;L;;;;;N;;;;; +1891D;TANGUT COMPONENT-286;Lo;0;L;;;;;N;;;;; +1891E;TANGUT COMPONENT-287;Lo;0;L;;;;;N;;;;; +1891F;TANGUT COMPONENT-288;Lo;0;L;;;;;N;;;;; +18920;TANGUT COMPONENT-289;Lo;0;L;;;;;N;;;;; +18921;TANGUT COMPONENT-290;Lo;0;L;;;;;N;;;;; +18922;TANGUT COMPONENT-291;Lo;0;L;;;;;N;;;;; +18923;TANGUT COMPONENT-292;Lo;0;L;;;;;N;;;;; +18924;TANGUT COMPONENT-293;Lo;0;L;;;;;N;;;;; +18925;TANGUT COMPONENT-294;Lo;0;L;;;;;N;;;;; +18926;TANGUT COMPONENT-295;Lo;0;L;;;;;N;;;;; +18927;TANGUT COMPONENT-296;Lo;0;L;;;;;N;;;;; +18928;TANGUT COMPONENT-297;Lo;0;L;;;;;N;;;;; +18929;TANGUT COMPONENT-298;Lo;0;L;;;;;N;;;;; +1892A;TANGUT COMPONENT-299;Lo;0;L;;;;;N;;;;; +1892B;TANGUT COMPONENT-300;Lo;0;L;;;;;N;;;;; +1892C;TANGUT COMPONENT-301;Lo;0;L;;;;;N;;;;; +1892D;TANGUT COMPONENT-302;Lo;0;L;;;;;N;;;;; +1892E;TANGUT COMPONENT-303;Lo;0;L;;;;;N;;;;; +1892F;TANGUT COMPONENT-304;Lo;0;L;;;;;N;;;;; +18930;TANGUT COMPONENT-305;Lo;0;L;;;;;N;;;;; +18931;TANGUT COMPONENT-306;Lo;0;L;;;;;N;;;;; +18932;TANGUT COMPONENT-307;Lo;0;L;;;;;N;;;;; +18933;TANGUT COMPONENT-308;Lo;0;L;;;;;N;;;;; +18934;TANGUT COMPONENT-309;Lo;0;L;;;;;N;;;;; +18935;TANGUT COMPONENT-310;Lo;0;L;;;;;N;;;;; +18936;TANGUT COMPONENT-311;Lo;0;L;;;;;N;;;;; +18937;TANGUT COMPONENT-312;Lo;0;L;;;;;N;;;;; +18938;TANGUT COMPONENT-313;Lo;0;L;;;;;N;;;;; +18939;TANGUT COMPONENT-314;Lo;0;L;;;;;N;;;;; +1893A;TANGUT COMPONENT-315;Lo;0;L;;;;;N;;;;; +1893B;TANGUT COMPONENT-316;Lo;0;L;;;;;N;;;;; +1893C;TANGUT COMPONENT-317;Lo;0;L;;;;;N;;;;; +1893D;TANGUT COMPONENT-318;Lo;0;L;;;;;N;;;;; +1893E;TANGUT COMPONENT-319;Lo;0;L;;;;;N;;;;; +1893F;TANGUT COMPONENT-320;Lo;0;L;;;;;N;;;;; +18940;TANGUT COMPONENT-321;Lo;0;L;;;;;N;;;;; +18941;TANGUT COMPONENT-322;Lo;0;L;;;;;N;;;;; +18942;TANGUT COMPONENT-323;Lo;0;L;;;;;N;;;;; +18943;TANGUT COMPONENT-324;Lo;0;L;;;;;N;;;;; +18944;TANGUT COMPONENT-325;Lo;0;L;;;;;N;;;;; +18945;TANGUT COMPONENT-326;Lo;0;L;;;;;N;;;;; +18946;TANGUT COMPONENT-327;Lo;0;L;;;;;N;;;;; +18947;TANGUT COMPONENT-328;Lo;0;L;;;;;N;;;;; +18948;TANGUT COMPONENT-329;Lo;0;L;;;;;N;;;;; +18949;TANGUT COMPONENT-330;Lo;0;L;;;;;N;;;;; +1894A;TANGUT COMPONENT-331;Lo;0;L;;;;;N;;;;; +1894B;TANGUT COMPONENT-332;Lo;0;L;;;;;N;;;;; +1894C;TANGUT COMPONENT-333;Lo;0;L;;;;;N;;;;; +1894D;TANGUT COMPONENT-334;Lo;0;L;;;;;N;;;;; +1894E;TANGUT COMPONENT-335;Lo;0;L;;;;;N;;;;; +1894F;TANGUT COMPONENT-336;Lo;0;L;;;;;N;;;;; +18950;TANGUT COMPONENT-337;Lo;0;L;;;;;N;;;;; +18951;TANGUT COMPONENT-338;Lo;0;L;;;;;N;;;;; +18952;TANGUT COMPONENT-339;Lo;0;L;;;;;N;;;;; +18953;TANGUT COMPONENT-340;Lo;0;L;;;;;N;;;;; +18954;TANGUT COMPONENT-341;Lo;0;L;;;;;N;;;;; +18955;TANGUT COMPONENT-342;Lo;0;L;;;;;N;;;;; +18956;TANGUT COMPONENT-343;Lo;0;L;;;;;N;;;;; +18957;TANGUT COMPONENT-344;Lo;0;L;;;;;N;;;;; +18958;TANGUT COMPONENT-345;Lo;0;L;;;;;N;;;;; +18959;TANGUT COMPONENT-346;Lo;0;L;;;;;N;;;;; +1895A;TANGUT COMPONENT-347;Lo;0;L;;;;;N;;;;; +1895B;TANGUT COMPONENT-348;Lo;0;L;;;;;N;;;;; +1895C;TANGUT COMPONENT-349;Lo;0;L;;;;;N;;;;; +1895D;TANGUT COMPONENT-350;Lo;0;L;;;;;N;;;;; +1895E;TANGUT COMPONENT-351;Lo;0;L;;;;;N;;;;; +1895F;TANGUT COMPONENT-352;Lo;0;L;;;;;N;;;;; +18960;TANGUT COMPONENT-353;Lo;0;L;;;;;N;;;;; +18961;TANGUT COMPONENT-354;Lo;0;L;;;;;N;;;;; +18962;TANGUT COMPONENT-355;Lo;0;L;;;;;N;;;;; +18963;TANGUT COMPONENT-356;Lo;0;L;;;;;N;;;;; +18964;TANGUT COMPONENT-357;Lo;0;L;;;;;N;;;;; +18965;TANGUT COMPONENT-358;Lo;0;L;;;;;N;;;;; +18966;TANGUT COMPONENT-359;Lo;0;L;;;;;N;;;;; +18967;TANGUT COMPONENT-360;Lo;0;L;;;;;N;;;;; +18968;TANGUT COMPONENT-361;Lo;0;L;;;;;N;;;;; +18969;TANGUT COMPONENT-362;Lo;0;L;;;;;N;;;;; +1896A;TANGUT COMPONENT-363;Lo;0;L;;;;;N;;;;; +1896B;TANGUT COMPONENT-364;Lo;0;L;;;;;N;;;;; +1896C;TANGUT COMPONENT-365;Lo;0;L;;;;;N;;;;; +1896D;TANGUT COMPONENT-366;Lo;0;L;;;;;N;;;;; +1896E;TANGUT COMPONENT-367;Lo;0;L;;;;;N;;;;; +1896F;TANGUT COMPONENT-368;Lo;0;L;;;;;N;;;;; +18970;TANGUT COMPONENT-369;Lo;0;L;;;;;N;;;;; +18971;TANGUT COMPONENT-370;Lo;0;L;;;;;N;;;;; +18972;TANGUT COMPONENT-371;Lo;0;L;;;;;N;;;;; +18973;TANGUT COMPONENT-372;Lo;0;L;;;;;N;;;;; +18974;TANGUT COMPONENT-373;Lo;0;L;;;;;N;;;;; +18975;TANGUT COMPONENT-374;Lo;0;L;;;;;N;;;;; +18976;TANGUT COMPONENT-375;Lo;0;L;;;;;N;;;;; +18977;TANGUT COMPONENT-376;Lo;0;L;;;;;N;;;;; +18978;TANGUT COMPONENT-377;Lo;0;L;;;;;N;;;;; +18979;TANGUT COMPONENT-378;Lo;0;L;;;;;N;;;;; +1897A;TANGUT COMPONENT-379;Lo;0;L;;;;;N;;;;; +1897B;TANGUT COMPONENT-380;Lo;0;L;;;;;N;;;;; +1897C;TANGUT COMPONENT-381;Lo;0;L;;;;;N;;;;; +1897D;TANGUT COMPONENT-382;Lo;0;L;;;;;N;;;;; +1897E;TANGUT COMPONENT-383;Lo;0;L;;;;;N;;;;; +1897F;TANGUT COMPONENT-384;Lo;0;L;;;;;N;;;;; +18980;TANGUT COMPONENT-385;Lo;0;L;;;;;N;;;;; +18981;TANGUT COMPONENT-386;Lo;0;L;;;;;N;;;;; +18982;TANGUT COMPONENT-387;Lo;0;L;;;;;N;;;;; +18983;TANGUT COMPONENT-388;Lo;0;L;;;;;N;;;;; +18984;TANGUT COMPONENT-389;Lo;0;L;;;;;N;;;;; +18985;TANGUT COMPONENT-390;Lo;0;L;;;;;N;;;;; +18986;TANGUT COMPONENT-391;Lo;0;L;;;;;N;;;;; +18987;TANGUT COMPONENT-392;Lo;0;L;;;;;N;;;;; +18988;TANGUT COMPONENT-393;Lo;0;L;;;;;N;;;;; +18989;TANGUT COMPONENT-394;Lo;0;L;;;;;N;;;;; +1898A;TANGUT COMPONENT-395;Lo;0;L;;;;;N;;;;; +1898B;TANGUT COMPONENT-396;Lo;0;L;;;;;N;;;;; +1898C;TANGUT COMPONENT-397;Lo;0;L;;;;;N;;;;; +1898D;TANGUT COMPONENT-398;Lo;0;L;;;;;N;;;;; +1898E;TANGUT COMPONENT-399;Lo;0;L;;;;;N;;;;; +1898F;TANGUT COMPONENT-400;Lo;0;L;;;;;N;;;;; +18990;TANGUT COMPONENT-401;Lo;0;L;;;;;N;;;;; +18991;TANGUT COMPONENT-402;Lo;0;L;;;;;N;;;;; +18992;TANGUT COMPONENT-403;Lo;0;L;;;;;N;;;;; +18993;TANGUT COMPONENT-404;Lo;0;L;;;;;N;;;;; +18994;TANGUT COMPONENT-405;Lo;0;L;;;;;N;;;;; +18995;TANGUT COMPONENT-406;Lo;0;L;;;;;N;;;;; +18996;TANGUT COMPONENT-407;Lo;0;L;;;;;N;;;;; +18997;TANGUT COMPONENT-408;Lo;0;L;;;;;N;;;;; +18998;TANGUT COMPONENT-409;Lo;0;L;;;;;N;;;;; +18999;TANGUT COMPONENT-410;Lo;0;L;;;;;N;;;;; +1899A;TANGUT COMPONENT-411;Lo;0;L;;;;;N;;;;; +1899B;TANGUT COMPONENT-412;Lo;0;L;;;;;N;;;;; +1899C;TANGUT COMPONENT-413;Lo;0;L;;;;;N;;;;; +1899D;TANGUT COMPONENT-414;Lo;0;L;;;;;N;;;;; +1899E;TANGUT COMPONENT-415;Lo;0;L;;;;;N;;;;; +1899F;TANGUT COMPONENT-416;Lo;0;L;;;;;N;;;;; +189A0;TANGUT COMPONENT-417;Lo;0;L;;;;;N;;;;; +189A1;TANGUT COMPONENT-418;Lo;0;L;;;;;N;;;;; +189A2;TANGUT COMPONENT-419;Lo;0;L;;;;;N;;;;; +189A3;TANGUT COMPONENT-420;Lo;0;L;;;;;N;;;;; +189A4;TANGUT COMPONENT-421;Lo;0;L;;;;;N;;;;; +189A5;TANGUT COMPONENT-422;Lo;0;L;;;;;N;;;;; +189A6;TANGUT COMPONENT-423;Lo;0;L;;;;;N;;;;; +189A7;TANGUT COMPONENT-424;Lo;0;L;;;;;N;;;;; +189A8;TANGUT COMPONENT-425;Lo;0;L;;;;;N;;;;; +189A9;TANGUT COMPONENT-426;Lo;0;L;;;;;N;;;;; +189AA;TANGUT COMPONENT-427;Lo;0;L;;;;;N;;;;; +189AB;TANGUT COMPONENT-428;Lo;0;L;;;;;N;;;;; +189AC;TANGUT COMPONENT-429;Lo;0;L;;;;;N;;;;; +189AD;TANGUT COMPONENT-430;Lo;0;L;;;;;N;;;;; +189AE;TANGUT COMPONENT-431;Lo;0;L;;;;;N;;;;; +189AF;TANGUT COMPONENT-432;Lo;0;L;;;;;N;;;;; +189B0;TANGUT COMPONENT-433;Lo;0;L;;;;;N;;;;; +189B1;TANGUT COMPONENT-434;Lo;0;L;;;;;N;;;;; +189B2;TANGUT COMPONENT-435;Lo;0;L;;;;;N;;;;; +189B3;TANGUT COMPONENT-436;Lo;0;L;;;;;N;;;;; +189B4;TANGUT COMPONENT-437;Lo;0;L;;;;;N;;;;; +189B5;TANGUT COMPONENT-438;Lo;0;L;;;;;N;;;;; +189B6;TANGUT COMPONENT-439;Lo;0;L;;;;;N;;;;; +189B7;TANGUT COMPONENT-440;Lo;0;L;;;;;N;;;;; +189B8;TANGUT COMPONENT-441;Lo;0;L;;;;;N;;;;; +189B9;TANGUT COMPONENT-442;Lo;0;L;;;;;N;;;;; +189BA;TANGUT COMPONENT-443;Lo;0;L;;;;;N;;;;; +189BB;TANGUT COMPONENT-444;Lo;0;L;;;;;N;;;;; +189BC;TANGUT COMPONENT-445;Lo;0;L;;;;;N;;;;; +189BD;TANGUT COMPONENT-446;Lo;0;L;;;;;N;;;;; +189BE;TANGUT COMPONENT-447;Lo;0;L;;;;;N;;;;; +189BF;TANGUT COMPONENT-448;Lo;0;L;;;;;N;;;;; +189C0;TANGUT COMPONENT-449;Lo;0;L;;;;;N;;;;; +189C1;TANGUT COMPONENT-450;Lo;0;L;;;;;N;;;;; +189C2;TANGUT COMPONENT-451;Lo;0;L;;;;;N;;;;; +189C3;TANGUT COMPONENT-452;Lo;0;L;;;;;N;;;;; +189C4;TANGUT COMPONENT-453;Lo;0;L;;;;;N;;;;; +189C5;TANGUT COMPONENT-454;Lo;0;L;;;;;N;;;;; +189C6;TANGUT COMPONENT-455;Lo;0;L;;;;;N;;;;; +189C7;TANGUT COMPONENT-456;Lo;0;L;;;;;N;;;;; +189C8;TANGUT COMPONENT-457;Lo;0;L;;;;;N;;;;; +189C9;TANGUT COMPONENT-458;Lo;0;L;;;;;N;;;;; +189CA;TANGUT COMPONENT-459;Lo;0;L;;;;;N;;;;; +189CB;TANGUT COMPONENT-460;Lo;0;L;;;;;N;;;;; +189CC;TANGUT COMPONENT-461;Lo;0;L;;;;;N;;;;; +189CD;TANGUT COMPONENT-462;Lo;0;L;;;;;N;;;;; +189CE;TANGUT COMPONENT-463;Lo;0;L;;;;;N;;;;; +189CF;TANGUT COMPONENT-464;Lo;0;L;;;;;N;;;;; +189D0;TANGUT COMPONENT-465;Lo;0;L;;;;;N;;;;; +189D1;TANGUT COMPONENT-466;Lo;0;L;;;;;N;;;;; +189D2;TANGUT COMPONENT-467;Lo;0;L;;;;;N;;;;; +189D3;TANGUT COMPONENT-468;Lo;0;L;;;;;N;;;;; +189D4;TANGUT COMPONENT-469;Lo;0;L;;;;;N;;;;; +189D5;TANGUT COMPONENT-470;Lo;0;L;;;;;N;;;;; +189D6;TANGUT COMPONENT-471;Lo;0;L;;;;;N;;;;; +189D7;TANGUT COMPONENT-472;Lo;0;L;;;;;N;;;;; +189D8;TANGUT COMPONENT-473;Lo;0;L;;;;;N;;;;; +189D9;TANGUT COMPONENT-474;Lo;0;L;;;;;N;;;;; +189DA;TANGUT COMPONENT-475;Lo;0;L;;;;;N;;;;; +189DB;TANGUT COMPONENT-476;Lo;0;L;;;;;N;;;;; +189DC;TANGUT COMPONENT-477;Lo;0;L;;;;;N;;;;; +189DD;TANGUT COMPONENT-478;Lo;0;L;;;;;N;;;;; +189DE;TANGUT COMPONENT-479;Lo;0;L;;;;;N;;;;; +189DF;TANGUT COMPONENT-480;Lo;0;L;;;;;N;;;;; +189E0;TANGUT COMPONENT-481;Lo;0;L;;;;;N;;;;; +189E1;TANGUT COMPONENT-482;Lo;0;L;;;;;N;;;;; +189E2;TANGUT COMPONENT-483;Lo;0;L;;;;;N;;;;; +189E3;TANGUT COMPONENT-484;Lo;0;L;;;;;N;;;;; +189E4;TANGUT COMPONENT-485;Lo;0;L;;;;;N;;;;; +189E5;TANGUT COMPONENT-486;Lo;0;L;;;;;N;;;;; +189E6;TANGUT COMPONENT-487;Lo;0;L;;;;;N;;;;; +189E7;TANGUT COMPONENT-488;Lo;0;L;;;;;N;;;;; +189E8;TANGUT COMPONENT-489;Lo;0;L;;;;;N;;;;; +189E9;TANGUT COMPONENT-490;Lo;0;L;;;;;N;;;;; +189EA;TANGUT COMPONENT-491;Lo;0;L;;;;;N;;;;; +189EB;TANGUT COMPONENT-492;Lo;0;L;;;;;N;;;;; +189EC;TANGUT COMPONENT-493;Lo;0;L;;;;;N;;;;; +189ED;TANGUT COMPONENT-494;Lo;0;L;;;;;N;;;;; +189EE;TANGUT COMPONENT-495;Lo;0;L;;;;;N;;;;; +189EF;TANGUT COMPONENT-496;Lo;0;L;;;;;N;;;;; +189F0;TANGUT COMPONENT-497;Lo;0;L;;;;;N;;;;; +189F1;TANGUT COMPONENT-498;Lo;0;L;;;;;N;;;;; +189F2;TANGUT COMPONENT-499;Lo;0;L;;;;;N;;;;; +189F3;TANGUT COMPONENT-500;Lo;0;L;;;;;N;;;;; +189F4;TANGUT COMPONENT-501;Lo;0;L;;;;;N;;;;; +189F5;TANGUT COMPONENT-502;Lo;0;L;;;;;N;;;;; +189F6;TANGUT COMPONENT-503;Lo;0;L;;;;;N;;;;; +189F7;TANGUT COMPONENT-504;Lo;0;L;;;;;N;;;;; +189F8;TANGUT COMPONENT-505;Lo;0;L;;;;;N;;;;; +189F9;TANGUT COMPONENT-506;Lo;0;L;;;;;N;;;;; +189FA;TANGUT COMPONENT-507;Lo;0;L;;;;;N;;;;; +189FB;TANGUT COMPONENT-508;Lo;0;L;;;;;N;;;;; +189FC;TANGUT COMPONENT-509;Lo;0;L;;;;;N;;;;; +189FD;TANGUT COMPONENT-510;Lo;0;L;;;;;N;;;;; +189FE;TANGUT COMPONENT-511;Lo;0;L;;;;;N;;;;; +189FF;TANGUT COMPONENT-512;Lo;0;L;;;;;N;;;;; +18A00;TANGUT COMPONENT-513;Lo;0;L;;;;;N;;;;; +18A01;TANGUT COMPONENT-514;Lo;0;L;;;;;N;;;;; +18A02;TANGUT COMPONENT-515;Lo;0;L;;;;;N;;;;; +18A03;TANGUT COMPONENT-516;Lo;0;L;;;;;N;;;;; +18A04;TANGUT COMPONENT-517;Lo;0;L;;;;;N;;;;; +18A05;TANGUT COMPONENT-518;Lo;0;L;;;;;N;;;;; +18A06;TANGUT COMPONENT-519;Lo;0;L;;;;;N;;;;; +18A07;TANGUT COMPONENT-520;Lo;0;L;;;;;N;;;;; +18A08;TANGUT COMPONENT-521;Lo;0;L;;;;;N;;;;; +18A09;TANGUT COMPONENT-522;Lo;0;L;;;;;N;;;;; +18A0A;TANGUT COMPONENT-523;Lo;0;L;;;;;N;;;;; +18A0B;TANGUT COMPONENT-524;Lo;0;L;;;;;N;;;;; +18A0C;TANGUT COMPONENT-525;Lo;0;L;;;;;N;;;;; +18A0D;TANGUT COMPONENT-526;Lo;0;L;;;;;N;;;;; +18A0E;TANGUT COMPONENT-527;Lo;0;L;;;;;N;;;;; +18A0F;TANGUT COMPONENT-528;Lo;0;L;;;;;N;;;;; +18A10;TANGUT COMPONENT-529;Lo;0;L;;;;;N;;;;; +18A11;TANGUT COMPONENT-530;Lo;0;L;;;;;N;;;;; +18A12;TANGUT COMPONENT-531;Lo;0;L;;;;;N;;;;; +18A13;TANGUT COMPONENT-532;Lo;0;L;;;;;N;;;;; +18A14;TANGUT COMPONENT-533;Lo;0;L;;;;;N;;;;; +18A15;TANGUT COMPONENT-534;Lo;0;L;;;;;N;;;;; +18A16;TANGUT COMPONENT-535;Lo;0;L;;;;;N;;;;; +18A17;TANGUT COMPONENT-536;Lo;0;L;;;;;N;;;;; +18A18;TANGUT COMPONENT-537;Lo;0;L;;;;;N;;;;; +18A19;TANGUT COMPONENT-538;Lo;0;L;;;;;N;;;;; +18A1A;TANGUT COMPONENT-539;Lo;0;L;;;;;N;;;;; +18A1B;TANGUT COMPONENT-540;Lo;0;L;;;;;N;;;;; +18A1C;TANGUT COMPONENT-541;Lo;0;L;;;;;N;;;;; +18A1D;TANGUT COMPONENT-542;Lo;0;L;;;;;N;;;;; +18A1E;TANGUT COMPONENT-543;Lo;0;L;;;;;N;;;;; +18A1F;TANGUT COMPONENT-544;Lo;0;L;;;;;N;;;;; +18A20;TANGUT COMPONENT-545;Lo;0;L;;;;;N;;;;; +18A21;TANGUT COMPONENT-546;Lo;0;L;;;;;N;;;;; +18A22;TANGUT COMPONENT-547;Lo;0;L;;;;;N;;;;; +18A23;TANGUT COMPONENT-548;Lo;0;L;;;;;N;;;;; +18A24;TANGUT COMPONENT-549;Lo;0;L;;;;;N;;;;; +18A25;TANGUT COMPONENT-550;Lo;0;L;;;;;N;;;;; +18A26;TANGUT COMPONENT-551;Lo;0;L;;;;;N;;;;; +18A27;TANGUT COMPONENT-552;Lo;0;L;;;;;N;;;;; +18A28;TANGUT COMPONENT-553;Lo;0;L;;;;;N;;;;; +18A29;TANGUT COMPONENT-554;Lo;0;L;;;;;N;;;;; +18A2A;TANGUT COMPONENT-555;Lo;0;L;;;;;N;;;;; +18A2B;TANGUT COMPONENT-556;Lo;0;L;;;;;N;;;;; +18A2C;TANGUT COMPONENT-557;Lo;0;L;;;;;N;;;;; +18A2D;TANGUT COMPONENT-558;Lo;0;L;;;;;N;;;;; +18A2E;TANGUT COMPONENT-559;Lo;0;L;;;;;N;;;;; +18A2F;TANGUT COMPONENT-560;Lo;0;L;;;;;N;;;;; +18A30;TANGUT COMPONENT-561;Lo;0;L;;;;;N;;;;; +18A31;TANGUT COMPONENT-562;Lo;0;L;;;;;N;;;;; +18A32;TANGUT COMPONENT-563;Lo;0;L;;;;;N;;;;; +18A33;TANGUT COMPONENT-564;Lo;0;L;;;;;N;;;;; +18A34;TANGUT COMPONENT-565;Lo;0;L;;;;;N;;;;; +18A35;TANGUT COMPONENT-566;Lo;0;L;;;;;N;;;;; +18A36;TANGUT COMPONENT-567;Lo;0;L;;;;;N;;;;; +18A37;TANGUT COMPONENT-568;Lo;0;L;;;;;N;;;;; +18A38;TANGUT COMPONENT-569;Lo;0;L;;;;;N;;;;; +18A39;TANGUT COMPONENT-570;Lo;0;L;;;;;N;;;;; +18A3A;TANGUT COMPONENT-571;Lo;0;L;;;;;N;;;;; +18A3B;TANGUT COMPONENT-572;Lo;0;L;;;;;N;;;;; +18A3C;TANGUT COMPONENT-573;Lo;0;L;;;;;N;;;;; +18A3D;TANGUT COMPONENT-574;Lo;0;L;;;;;N;;;;; +18A3E;TANGUT COMPONENT-575;Lo;0;L;;;;;N;;;;; +18A3F;TANGUT COMPONENT-576;Lo;0;L;;;;;N;;;;; +18A40;TANGUT COMPONENT-577;Lo;0;L;;;;;N;;;;; +18A41;TANGUT COMPONENT-578;Lo;0;L;;;;;N;;;;; +18A42;TANGUT COMPONENT-579;Lo;0;L;;;;;N;;;;; +18A43;TANGUT COMPONENT-580;Lo;0;L;;;;;N;;;;; +18A44;TANGUT COMPONENT-581;Lo;0;L;;;;;N;;;;; +18A45;TANGUT COMPONENT-582;Lo;0;L;;;;;N;;;;; +18A46;TANGUT COMPONENT-583;Lo;0;L;;;;;N;;;;; +18A47;TANGUT COMPONENT-584;Lo;0;L;;;;;N;;;;; +18A48;TANGUT COMPONENT-585;Lo;0;L;;;;;N;;;;; +18A49;TANGUT COMPONENT-586;Lo;0;L;;;;;N;;;;; +18A4A;TANGUT COMPONENT-587;Lo;0;L;;;;;N;;;;; +18A4B;TANGUT COMPONENT-588;Lo;0;L;;;;;N;;;;; +18A4C;TANGUT COMPONENT-589;Lo;0;L;;;;;N;;;;; +18A4D;TANGUT COMPONENT-590;Lo;0;L;;;;;N;;;;; +18A4E;TANGUT COMPONENT-591;Lo;0;L;;;;;N;;;;; +18A4F;TANGUT COMPONENT-592;Lo;0;L;;;;;N;;;;; +18A50;TANGUT COMPONENT-593;Lo;0;L;;;;;N;;;;; +18A51;TANGUT COMPONENT-594;Lo;0;L;;;;;N;;;;; +18A52;TANGUT COMPONENT-595;Lo;0;L;;;;;N;;;;; +18A53;TANGUT COMPONENT-596;Lo;0;L;;;;;N;;;;; +18A54;TANGUT COMPONENT-597;Lo;0;L;;;;;N;;;;; +18A55;TANGUT COMPONENT-598;Lo;0;L;;;;;N;;;;; +18A56;TANGUT COMPONENT-599;Lo;0;L;;;;;N;;;;; +18A57;TANGUT COMPONENT-600;Lo;0;L;;;;;N;;;;; +18A58;TANGUT COMPONENT-601;Lo;0;L;;;;;N;;;;; +18A59;TANGUT COMPONENT-602;Lo;0;L;;;;;N;;;;; +18A5A;TANGUT COMPONENT-603;Lo;0;L;;;;;N;;;;; +18A5B;TANGUT COMPONENT-604;Lo;0;L;;;;;N;;;;; +18A5C;TANGUT COMPONENT-605;Lo;0;L;;;;;N;;;;; +18A5D;TANGUT COMPONENT-606;Lo;0;L;;;;;N;;;;; +18A5E;TANGUT COMPONENT-607;Lo;0;L;;;;;N;;;;; +18A5F;TANGUT COMPONENT-608;Lo;0;L;;;;;N;;;;; +18A60;TANGUT COMPONENT-609;Lo;0;L;;;;;N;;;;; +18A61;TANGUT COMPONENT-610;Lo;0;L;;;;;N;;;;; +18A62;TANGUT COMPONENT-611;Lo;0;L;;;;;N;;;;; +18A63;TANGUT COMPONENT-612;Lo;0;L;;;;;N;;;;; +18A64;TANGUT COMPONENT-613;Lo;0;L;;;;;N;;;;; +18A65;TANGUT COMPONENT-614;Lo;0;L;;;;;N;;;;; +18A66;TANGUT COMPONENT-615;Lo;0;L;;;;;N;;;;; +18A67;TANGUT COMPONENT-616;Lo;0;L;;;;;N;;;;; +18A68;TANGUT COMPONENT-617;Lo;0;L;;;;;N;;;;; +18A69;TANGUT COMPONENT-618;Lo;0;L;;;;;N;;;;; +18A6A;TANGUT COMPONENT-619;Lo;0;L;;;;;N;;;;; +18A6B;TANGUT COMPONENT-620;Lo;0;L;;;;;N;;;;; +18A6C;TANGUT COMPONENT-621;Lo;0;L;;;;;N;;;;; +18A6D;TANGUT COMPONENT-622;Lo;0;L;;;;;N;;;;; +18A6E;TANGUT COMPONENT-623;Lo;0;L;;;;;N;;;;; +18A6F;TANGUT COMPONENT-624;Lo;0;L;;;;;N;;;;; +18A70;TANGUT COMPONENT-625;Lo;0;L;;;;;N;;;;; +18A71;TANGUT COMPONENT-626;Lo;0;L;;;;;N;;;;; +18A72;TANGUT COMPONENT-627;Lo;0;L;;;;;N;;;;; +18A73;TANGUT COMPONENT-628;Lo;0;L;;;;;N;;;;; +18A74;TANGUT COMPONENT-629;Lo;0;L;;;;;N;;;;; +18A75;TANGUT COMPONENT-630;Lo;0;L;;;;;N;;;;; +18A76;TANGUT COMPONENT-631;Lo;0;L;;;;;N;;;;; +18A77;TANGUT COMPONENT-632;Lo;0;L;;;;;N;;;;; +18A78;TANGUT COMPONENT-633;Lo;0;L;;;;;N;;;;; +18A79;TANGUT COMPONENT-634;Lo;0;L;;;;;N;;;;; +18A7A;TANGUT COMPONENT-635;Lo;0;L;;;;;N;;;;; +18A7B;TANGUT COMPONENT-636;Lo;0;L;;;;;N;;;;; +18A7C;TANGUT COMPONENT-637;Lo;0;L;;;;;N;;;;; +18A7D;TANGUT COMPONENT-638;Lo;0;L;;;;;N;;;;; +18A7E;TANGUT COMPONENT-639;Lo;0;L;;;;;N;;;;; +18A7F;TANGUT COMPONENT-640;Lo;0;L;;;;;N;;;;; +18A80;TANGUT COMPONENT-641;Lo;0;L;;;;;N;;;;; +18A81;TANGUT COMPONENT-642;Lo;0;L;;;;;N;;;;; +18A82;TANGUT COMPONENT-643;Lo;0;L;;;;;N;;;;; +18A83;TANGUT COMPONENT-644;Lo;0;L;;;;;N;;;;; +18A84;TANGUT COMPONENT-645;Lo;0;L;;;;;N;;;;; +18A85;TANGUT COMPONENT-646;Lo;0;L;;;;;N;;;;; +18A86;TANGUT COMPONENT-647;Lo;0;L;;;;;N;;;;; +18A87;TANGUT COMPONENT-648;Lo;0;L;;;;;N;;;;; +18A88;TANGUT COMPONENT-649;Lo;0;L;;;;;N;;;;; +18A89;TANGUT COMPONENT-650;Lo;0;L;;;;;N;;;;; +18A8A;TANGUT COMPONENT-651;Lo;0;L;;;;;N;;;;; +18A8B;TANGUT COMPONENT-652;Lo;0;L;;;;;N;;;;; +18A8C;TANGUT COMPONENT-653;Lo;0;L;;;;;N;;;;; +18A8D;TANGUT COMPONENT-654;Lo;0;L;;;;;N;;;;; +18A8E;TANGUT COMPONENT-655;Lo;0;L;;;;;N;;;;; +18A8F;TANGUT COMPONENT-656;Lo;0;L;;;;;N;;;;; +18A90;TANGUT COMPONENT-657;Lo;0;L;;;;;N;;;;; +18A91;TANGUT COMPONENT-658;Lo;0;L;;;;;N;;;;; +18A92;TANGUT COMPONENT-659;Lo;0;L;;;;;N;;;;; +18A93;TANGUT COMPONENT-660;Lo;0;L;;;;;N;;;;; +18A94;TANGUT COMPONENT-661;Lo;0;L;;;;;N;;;;; +18A95;TANGUT COMPONENT-662;Lo;0;L;;;;;N;;;;; +18A96;TANGUT COMPONENT-663;Lo;0;L;;;;;N;;;;; +18A97;TANGUT COMPONENT-664;Lo;0;L;;;;;N;;;;; +18A98;TANGUT COMPONENT-665;Lo;0;L;;;;;N;;;;; +18A99;TANGUT COMPONENT-666;Lo;0;L;;;;;N;;;;; +18A9A;TANGUT COMPONENT-667;Lo;0;L;;;;;N;;;;; +18A9B;TANGUT COMPONENT-668;Lo;0;L;;;;;N;;;;; +18A9C;TANGUT COMPONENT-669;Lo;0;L;;;;;N;;;;; +18A9D;TANGUT COMPONENT-670;Lo;0;L;;;;;N;;;;; +18A9E;TANGUT COMPONENT-671;Lo;0;L;;;;;N;;;;; +18A9F;TANGUT COMPONENT-672;Lo;0;L;;;;;N;;;;; +18AA0;TANGUT COMPONENT-673;Lo;0;L;;;;;N;;;;; +18AA1;TANGUT COMPONENT-674;Lo;0;L;;;;;N;;;;; +18AA2;TANGUT COMPONENT-675;Lo;0;L;;;;;N;;;;; +18AA3;TANGUT COMPONENT-676;Lo;0;L;;;;;N;;;;; +18AA4;TANGUT COMPONENT-677;Lo;0;L;;;;;N;;;;; +18AA5;TANGUT COMPONENT-678;Lo;0;L;;;;;N;;;;; +18AA6;TANGUT COMPONENT-679;Lo;0;L;;;;;N;;;;; +18AA7;TANGUT COMPONENT-680;Lo;0;L;;;;;N;;;;; +18AA8;TANGUT COMPONENT-681;Lo;0;L;;;;;N;;;;; +18AA9;TANGUT COMPONENT-682;Lo;0;L;;;;;N;;;;; +18AAA;TANGUT COMPONENT-683;Lo;0;L;;;;;N;;;;; +18AAB;TANGUT COMPONENT-684;Lo;0;L;;;;;N;;;;; +18AAC;TANGUT COMPONENT-685;Lo;0;L;;;;;N;;;;; +18AAD;TANGUT COMPONENT-686;Lo;0;L;;;;;N;;;;; +18AAE;TANGUT COMPONENT-687;Lo;0;L;;;;;N;;;;; +18AAF;TANGUT COMPONENT-688;Lo;0;L;;;;;N;;;;; +18AB0;TANGUT COMPONENT-689;Lo;0;L;;;;;N;;;;; +18AB1;TANGUT COMPONENT-690;Lo;0;L;;;;;N;;;;; +18AB2;TANGUT COMPONENT-691;Lo;0;L;;;;;N;;;;; +18AB3;TANGUT COMPONENT-692;Lo;0;L;;;;;N;;;;; +18AB4;TANGUT COMPONENT-693;Lo;0;L;;;;;N;;;;; +18AB5;TANGUT COMPONENT-694;Lo;0;L;;;;;N;;;;; +18AB6;TANGUT COMPONENT-695;Lo;0;L;;;;;N;;;;; +18AB7;TANGUT COMPONENT-696;Lo;0;L;;;;;N;;;;; +18AB8;TANGUT COMPONENT-697;Lo;0;L;;;;;N;;;;; +18AB9;TANGUT COMPONENT-698;Lo;0;L;;;;;N;;;;; +18ABA;TANGUT COMPONENT-699;Lo;0;L;;;;;N;;;;; +18ABB;TANGUT COMPONENT-700;Lo;0;L;;;;;N;;;;; +18ABC;TANGUT COMPONENT-701;Lo;0;L;;;;;N;;;;; +18ABD;TANGUT COMPONENT-702;Lo;0;L;;;;;N;;;;; +18ABE;TANGUT COMPONENT-703;Lo;0;L;;;;;N;;;;; +18ABF;TANGUT COMPONENT-704;Lo;0;L;;;;;N;;;;; +18AC0;TANGUT COMPONENT-705;Lo;0;L;;;;;N;;;;; +18AC1;TANGUT COMPONENT-706;Lo;0;L;;;;;N;;;;; +18AC2;TANGUT COMPONENT-707;Lo;0;L;;;;;N;;;;; +18AC3;TANGUT COMPONENT-708;Lo;0;L;;;;;N;;;;; +18AC4;TANGUT COMPONENT-709;Lo;0;L;;;;;N;;;;; +18AC5;TANGUT COMPONENT-710;Lo;0;L;;;;;N;;;;; +18AC6;TANGUT COMPONENT-711;Lo;0;L;;;;;N;;;;; +18AC7;TANGUT COMPONENT-712;Lo;0;L;;;;;N;;;;; +18AC8;TANGUT COMPONENT-713;Lo;0;L;;;;;N;;;;; +18AC9;TANGUT COMPONENT-714;Lo;0;L;;;;;N;;;;; +18ACA;TANGUT COMPONENT-715;Lo;0;L;;;;;N;;;;; +18ACB;TANGUT COMPONENT-716;Lo;0;L;;;;;N;;;;; +18ACC;TANGUT COMPONENT-717;Lo;0;L;;;;;N;;;;; +18ACD;TANGUT COMPONENT-718;Lo;0;L;;;;;N;;;;; +18ACE;TANGUT COMPONENT-719;Lo;0;L;;;;;N;;;;; +18ACF;TANGUT COMPONENT-720;Lo;0;L;;;;;N;;;;; +18AD0;TANGUT COMPONENT-721;Lo;0;L;;;;;N;;;;; +18AD1;TANGUT COMPONENT-722;Lo;0;L;;;;;N;;;;; +18AD2;TANGUT COMPONENT-723;Lo;0;L;;;;;N;;;;; +18AD3;TANGUT COMPONENT-724;Lo;0;L;;;;;N;;;;; +18AD4;TANGUT COMPONENT-725;Lo;0;L;;;;;N;;;;; +18AD5;TANGUT COMPONENT-726;Lo;0;L;;;;;N;;;;; +18AD6;TANGUT COMPONENT-727;Lo;0;L;;;;;N;;;;; +18AD7;TANGUT COMPONENT-728;Lo;0;L;;;;;N;;;;; +18AD8;TANGUT COMPONENT-729;Lo;0;L;;;;;N;;;;; +18AD9;TANGUT COMPONENT-730;Lo;0;L;;;;;N;;;;; +18ADA;TANGUT COMPONENT-731;Lo;0;L;;;;;N;;;;; +18ADB;TANGUT COMPONENT-732;Lo;0;L;;;;;N;;;;; +18ADC;TANGUT COMPONENT-733;Lo;0;L;;;;;N;;;;; +18ADD;TANGUT COMPONENT-734;Lo;0;L;;;;;N;;;;; +18ADE;TANGUT COMPONENT-735;Lo;0;L;;;;;N;;;;; +18ADF;TANGUT COMPONENT-736;Lo;0;L;;;;;N;;;;; +18AE0;TANGUT COMPONENT-737;Lo;0;L;;;;;N;;;;; +18AE1;TANGUT COMPONENT-738;Lo;0;L;;;;;N;;;;; +18AE2;TANGUT COMPONENT-739;Lo;0;L;;;;;N;;;;; +18AE3;TANGUT COMPONENT-740;Lo;0;L;;;;;N;;;;; +18AE4;TANGUT COMPONENT-741;Lo;0;L;;;;;N;;;;; +18AE5;TANGUT COMPONENT-742;Lo;0;L;;;;;N;;;;; +18AE6;TANGUT COMPONENT-743;Lo;0;L;;;;;N;;;;; +18AE7;TANGUT COMPONENT-744;Lo;0;L;;;;;N;;;;; +18AE8;TANGUT COMPONENT-745;Lo;0;L;;;;;N;;;;; +18AE9;TANGUT COMPONENT-746;Lo;0;L;;;;;N;;;;; +18AEA;TANGUT COMPONENT-747;Lo;0;L;;;;;N;;;;; +18AEB;TANGUT COMPONENT-748;Lo;0;L;;;;;N;;;;; +18AEC;TANGUT COMPONENT-749;Lo;0;L;;;;;N;;;;; +18AED;TANGUT COMPONENT-750;Lo;0;L;;;;;N;;;;; +18AEE;TANGUT COMPONENT-751;Lo;0;L;;;;;N;;;;; +18AEF;TANGUT COMPONENT-752;Lo;0;L;;;;;N;;;;; +18AF0;TANGUT COMPONENT-753;Lo;0;L;;;;;N;;;;; +18AF1;TANGUT COMPONENT-754;Lo;0;L;;;;;N;;;;; +18AF2;TANGUT COMPONENT-755;Lo;0;L;;;;;N;;;;; +18AF3;TANGUT COMPONENT-756;Lo;0;L;;;;;N;;;;; +18AF4;TANGUT COMPONENT-757;Lo;0;L;;;;;N;;;;; +18AF5;TANGUT COMPONENT-758;Lo;0;L;;;;;N;;;;; +18AF6;TANGUT COMPONENT-759;Lo;0;L;;;;;N;;;;; +18AF7;TANGUT COMPONENT-760;Lo;0;L;;;;;N;;;;; +18AF8;TANGUT COMPONENT-761;Lo;0;L;;;;;N;;;;; +18AF9;TANGUT COMPONENT-762;Lo;0;L;;;;;N;;;;; +18AFA;TANGUT COMPONENT-763;Lo;0;L;;;;;N;;;;; +18AFB;TANGUT COMPONENT-764;Lo;0;L;;;;;N;;;;; +18AFC;TANGUT COMPONENT-765;Lo;0;L;;;;;N;;;;; +18AFD;TANGUT COMPONENT-766;Lo;0;L;;;;;N;;;;; +18AFE;TANGUT COMPONENT-767;Lo;0;L;;;;;N;;;;; +18AFF;TANGUT COMPONENT-768;Lo;0;L;;;;;N;;;;; +18B00;KHITAN SMALL SCRIPT CHARACTER-18B00;Lo;0;L;;;;;N;;;;; +18B01;KHITAN SMALL SCRIPT CHARACTER-18B01;Lo;0;L;;;;;N;;;;; +18B02;KHITAN SMALL SCRIPT CHARACTER-18B02;Lo;0;L;;;;;N;;;;; +18B03;KHITAN SMALL SCRIPT CHARACTER-18B03;Lo;0;L;;;;;N;;;;; +18B04;KHITAN SMALL SCRIPT CHARACTER-18B04;Lo;0;L;;;;;N;;;;; +18B05;KHITAN SMALL SCRIPT CHARACTER-18B05;Lo;0;L;;;;;N;;;;; +18B06;KHITAN SMALL SCRIPT CHARACTER-18B06;Lo;0;L;;;;;N;;;;; +18B07;KHITAN SMALL SCRIPT CHARACTER-18B07;Lo;0;L;;;;;N;;;;; +18B08;KHITAN SMALL SCRIPT CHARACTER-18B08;Lo;0;L;;;;;N;;;;; +18B09;KHITAN SMALL SCRIPT CHARACTER-18B09;Lo;0;L;;;;;N;;;;; +18B0A;KHITAN SMALL SCRIPT CHARACTER-18B0A;Lo;0;L;;;;;N;;;;; +18B0B;KHITAN SMALL SCRIPT CHARACTER-18B0B;Lo;0;L;;;;;N;;;;; +18B0C;KHITAN SMALL SCRIPT CHARACTER-18B0C;Lo;0;L;;;;;N;;;;; +18B0D;KHITAN SMALL SCRIPT CHARACTER-18B0D;Lo;0;L;;;;;N;;;;; +18B0E;KHITAN SMALL SCRIPT CHARACTER-18B0E;Lo;0;L;;;;;N;;;;; +18B0F;KHITAN SMALL SCRIPT CHARACTER-18B0F;Lo;0;L;;;;;N;;;;; +18B10;KHITAN SMALL SCRIPT CHARACTER-18B10;Lo;0;L;;;;;N;;;;; +18B11;KHITAN SMALL SCRIPT CHARACTER-18B11;Lo;0;L;;;;;N;;;;; +18B12;KHITAN SMALL SCRIPT CHARACTER-18B12;Lo;0;L;;;;;N;;;;; +18B13;KHITAN SMALL SCRIPT CHARACTER-18B13;Lo;0;L;;;;;N;;;;; +18B14;KHITAN SMALL SCRIPT CHARACTER-18B14;Lo;0;L;;;;;N;;;;; +18B15;KHITAN SMALL SCRIPT CHARACTER-18B15;Lo;0;L;;;;;N;;;;; +18B16;KHITAN SMALL SCRIPT CHARACTER-18B16;Lo;0;L;;;;;N;;;;; +18B17;KHITAN SMALL SCRIPT CHARACTER-18B17;Lo;0;L;;;;;N;;;;; +18B18;KHITAN SMALL SCRIPT CHARACTER-18B18;Lo;0;L;;;;;N;;;;; +18B19;KHITAN SMALL SCRIPT CHARACTER-18B19;Lo;0;L;;;;;N;;;;; +18B1A;KHITAN SMALL SCRIPT CHARACTER-18B1A;Lo;0;L;;;;;N;;;;; +18B1B;KHITAN SMALL SCRIPT CHARACTER-18B1B;Lo;0;L;;;;;N;;;;; +18B1C;KHITAN SMALL SCRIPT CHARACTER-18B1C;Lo;0;L;;;;;N;;;;; +18B1D;KHITAN SMALL SCRIPT CHARACTER-18B1D;Lo;0;L;;;;;N;;;;; +18B1E;KHITAN SMALL SCRIPT CHARACTER-18B1E;Lo;0;L;;;;;N;;;;; +18B1F;KHITAN SMALL SCRIPT CHARACTER-18B1F;Lo;0;L;;;;;N;;;;; +18B20;KHITAN SMALL SCRIPT CHARACTER-18B20;Lo;0;L;;;;;N;;;;; +18B21;KHITAN SMALL SCRIPT CHARACTER-18B21;Lo;0;L;;;;;N;;;;; +18B22;KHITAN SMALL SCRIPT CHARACTER-18B22;Lo;0;L;;;;;N;;;;; +18B23;KHITAN SMALL SCRIPT CHARACTER-18B23;Lo;0;L;;;;;N;;;;; +18B24;KHITAN SMALL SCRIPT CHARACTER-18B24;Lo;0;L;;;;;N;;;;; +18B25;KHITAN SMALL SCRIPT CHARACTER-18B25;Lo;0;L;;;;;N;;;;; +18B26;KHITAN SMALL SCRIPT CHARACTER-18B26;Lo;0;L;;;;;N;;;;; +18B27;KHITAN SMALL SCRIPT CHARACTER-18B27;Lo;0;L;;;;;N;;;;; +18B28;KHITAN SMALL SCRIPT CHARACTER-18B28;Lo;0;L;;;;;N;;;;; +18B29;KHITAN SMALL SCRIPT CHARACTER-18B29;Lo;0;L;;;;;N;;;;; +18B2A;KHITAN SMALL SCRIPT CHARACTER-18B2A;Lo;0;L;;;;;N;;;;; +18B2B;KHITAN SMALL SCRIPT CHARACTER-18B2B;Lo;0;L;;;;;N;;;;; +18B2C;KHITAN SMALL SCRIPT CHARACTER-18B2C;Lo;0;L;;;;;N;;;;; +18B2D;KHITAN SMALL SCRIPT CHARACTER-18B2D;Lo;0;L;;;;;N;;;;; +18B2E;KHITAN SMALL SCRIPT CHARACTER-18B2E;Lo;0;L;;;;;N;;;;; +18B2F;KHITAN SMALL SCRIPT CHARACTER-18B2F;Lo;0;L;;;;;N;;;;; +18B30;KHITAN SMALL SCRIPT CHARACTER-18B30;Lo;0;L;;;;;N;;;;; +18B31;KHITAN SMALL SCRIPT CHARACTER-18B31;Lo;0;L;;;;;N;;;;; +18B32;KHITAN SMALL SCRIPT CHARACTER-18B32;Lo;0;L;;;;;N;;;;; +18B33;KHITAN SMALL SCRIPT CHARACTER-18B33;Lo;0;L;;;;;N;;;;; +18B34;KHITAN SMALL SCRIPT CHARACTER-18B34;Lo;0;L;;;;;N;;;;; +18B35;KHITAN SMALL SCRIPT CHARACTER-18B35;Lo;0;L;;;;;N;;;;; +18B36;KHITAN SMALL SCRIPT CHARACTER-18B36;Lo;0;L;;;;;N;;;;; +18B37;KHITAN SMALL SCRIPT CHARACTER-18B37;Lo;0;L;;;;;N;;;;; +18B38;KHITAN SMALL SCRIPT CHARACTER-18B38;Lo;0;L;;;;;N;;;;; +18B39;KHITAN SMALL SCRIPT CHARACTER-18B39;Lo;0;L;;;;;N;;;;; +18B3A;KHITAN SMALL SCRIPT CHARACTER-18B3A;Lo;0;L;;;;;N;;;;; +18B3B;KHITAN SMALL SCRIPT CHARACTER-18B3B;Lo;0;L;;;;;N;;;;; +18B3C;KHITAN SMALL SCRIPT CHARACTER-18B3C;Lo;0;L;;;;;N;;;;; +18B3D;KHITAN SMALL SCRIPT CHARACTER-18B3D;Lo;0;L;;;;;N;;;;; +18B3E;KHITAN SMALL SCRIPT CHARACTER-18B3E;Lo;0;L;;;;;N;;;;; +18B3F;KHITAN SMALL SCRIPT CHARACTER-18B3F;Lo;0;L;;;;;N;;;;; +18B40;KHITAN SMALL SCRIPT CHARACTER-18B40;Lo;0;L;;;;;N;;;;; +18B41;KHITAN SMALL SCRIPT CHARACTER-18B41;Lo;0;L;;;;;N;;;;; +18B42;KHITAN SMALL SCRIPT CHARACTER-18B42;Lo;0;L;;;;;N;;;;; +18B43;KHITAN SMALL SCRIPT CHARACTER-18B43;Lo;0;L;;;;;N;;;;; +18B44;KHITAN SMALL SCRIPT CHARACTER-18B44;Lo;0;L;;;;;N;;;;; +18B45;KHITAN SMALL SCRIPT CHARACTER-18B45;Lo;0;L;;;;;N;;;;; +18B46;KHITAN SMALL SCRIPT CHARACTER-18B46;Lo;0;L;;;;;N;;;;; +18B47;KHITAN SMALL SCRIPT CHARACTER-18B47;Lo;0;L;;;;;N;;;;; +18B48;KHITAN SMALL SCRIPT CHARACTER-18B48;Lo;0;L;;;;;N;;;;; +18B49;KHITAN SMALL SCRIPT CHARACTER-18B49;Lo;0;L;;;;;N;;;;; +18B4A;KHITAN SMALL SCRIPT CHARACTER-18B4A;Lo;0;L;;;;;N;;;;; +18B4B;KHITAN SMALL SCRIPT CHARACTER-18B4B;Lo;0;L;;;;;N;;;;; +18B4C;KHITAN SMALL SCRIPT CHARACTER-18B4C;Lo;0;L;;;;;N;;;;; +18B4D;KHITAN SMALL SCRIPT CHARACTER-18B4D;Lo;0;L;;;;;N;;;;; +18B4E;KHITAN SMALL SCRIPT CHARACTER-18B4E;Lo;0;L;;;;;N;;;;; +18B4F;KHITAN SMALL SCRIPT CHARACTER-18B4F;Lo;0;L;;;;;N;;;;; +18B50;KHITAN SMALL SCRIPT CHARACTER-18B50;Lo;0;L;;;;;N;;;;; +18B51;KHITAN SMALL SCRIPT CHARACTER-18B51;Lo;0;L;;;;;N;;;;; +18B52;KHITAN SMALL SCRIPT CHARACTER-18B52;Lo;0;L;;;;;N;;;;; +18B53;KHITAN SMALL SCRIPT CHARACTER-18B53;Lo;0;L;;;;;N;;;;; +18B54;KHITAN SMALL SCRIPT CHARACTER-18B54;Lo;0;L;;;;;N;;;;; +18B55;KHITAN SMALL SCRIPT CHARACTER-18B55;Lo;0;L;;;;;N;;;;; +18B56;KHITAN SMALL SCRIPT CHARACTER-18B56;Lo;0;L;;;;;N;;;;; +18B57;KHITAN SMALL SCRIPT CHARACTER-18B57;Lo;0;L;;;;;N;;;;; +18B58;KHITAN SMALL SCRIPT CHARACTER-18B58;Lo;0;L;;;;;N;;;;; +18B59;KHITAN SMALL SCRIPT CHARACTER-18B59;Lo;0;L;;;;;N;;;;; +18B5A;KHITAN SMALL SCRIPT CHARACTER-18B5A;Lo;0;L;;;;;N;;;;; +18B5B;KHITAN SMALL SCRIPT CHARACTER-18B5B;Lo;0;L;;;;;N;;;;; +18B5C;KHITAN SMALL SCRIPT CHARACTER-18B5C;Lo;0;L;;;;;N;;;;; +18B5D;KHITAN SMALL SCRIPT CHARACTER-18B5D;Lo;0;L;;;;;N;;;;; +18B5E;KHITAN SMALL SCRIPT CHARACTER-18B5E;Lo;0;L;;;;;N;;;;; +18B5F;KHITAN SMALL SCRIPT CHARACTER-18B5F;Lo;0;L;;;;;N;;;;; +18B60;KHITAN SMALL SCRIPT CHARACTER-18B60;Lo;0;L;;;;;N;;;;; +18B61;KHITAN SMALL SCRIPT CHARACTER-18B61;Lo;0;L;;;;;N;;;;; +18B62;KHITAN SMALL SCRIPT CHARACTER-18B62;Lo;0;L;;;;;N;;;;; +18B63;KHITAN SMALL SCRIPT CHARACTER-18B63;Lo;0;L;;;;;N;;;;; +18B64;KHITAN SMALL SCRIPT CHARACTER-18B64;Lo;0;L;;;;;N;;;;; +18B65;KHITAN SMALL SCRIPT CHARACTER-18B65;Lo;0;L;;;;;N;;;;; +18B66;KHITAN SMALL SCRIPT CHARACTER-18B66;Lo;0;L;;;;;N;;;;; +18B67;KHITAN SMALL SCRIPT CHARACTER-18B67;Lo;0;L;;;;;N;;;;; +18B68;KHITAN SMALL SCRIPT CHARACTER-18B68;Lo;0;L;;;;;N;;;;; +18B69;KHITAN SMALL SCRIPT CHARACTER-18B69;Lo;0;L;;;;;N;;;;; +18B6A;KHITAN SMALL SCRIPT CHARACTER-18B6A;Lo;0;L;;;;;N;;;;; +18B6B;KHITAN SMALL SCRIPT CHARACTER-18B6B;Lo;0;L;;;;;N;;;;; +18B6C;KHITAN SMALL SCRIPT CHARACTER-18B6C;Lo;0;L;;;;;N;;;;; +18B6D;KHITAN SMALL SCRIPT CHARACTER-18B6D;Lo;0;L;;;;;N;;;;; +18B6E;KHITAN SMALL SCRIPT CHARACTER-18B6E;Lo;0;L;;;;;N;;;;; +18B6F;KHITAN SMALL SCRIPT CHARACTER-18B6F;Lo;0;L;;;;;N;;;;; +18B70;KHITAN SMALL SCRIPT CHARACTER-18B70;Lo;0;L;;;;;N;;;;; +18B71;KHITAN SMALL SCRIPT CHARACTER-18B71;Lo;0;L;;;;;N;;;;; +18B72;KHITAN SMALL SCRIPT CHARACTER-18B72;Lo;0;L;;;;;N;;;;; +18B73;KHITAN SMALL SCRIPT CHARACTER-18B73;Lo;0;L;;;;;N;;;;; +18B74;KHITAN SMALL SCRIPT CHARACTER-18B74;Lo;0;L;;;;;N;;;;; +18B75;KHITAN SMALL SCRIPT CHARACTER-18B75;Lo;0;L;;;;;N;;;;; +18B76;KHITAN SMALL SCRIPT CHARACTER-18B76;Lo;0;L;;;;;N;;;;; +18B77;KHITAN SMALL SCRIPT CHARACTER-18B77;Lo;0;L;;;;;N;;;;; +18B78;KHITAN SMALL SCRIPT CHARACTER-18B78;Lo;0;L;;;;;N;;;;; +18B79;KHITAN SMALL SCRIPT CHARACTER-18B79;Lo;0;L;;;;;N;;;;; +18B7A;KHITAN SMALL SCRIPT CHARACTER-18B7A;Lo;0;L;;;;;N;;;;; +18B7B;KHITAN SMALL SCRIPT CHARACTER-18B7B;Lo;0;L;;;;;N;;;;; +18B7C;KHITAN SMALL SCRIPT CHARACTER-18B7C;Lo;0;L;;;;;N;;;;; +18B7D;KHITAN SMALL SCRIPT CHARACTER-18B7D;Lo;0;L;;;;;N;;;;; +18B7E;KHITAN SMALL SCRIPT CHARACTER-18B7E;Lo;0;L;;;;;N;;;;; +18B7F;KHITAN SMALL SCRIPT CHARACTER-18B7F;Lo;0;L;;;;;N;;;;; +18B80;KHITAN SMALL SCRIPT CHARACTER-18B80;Lo;0;L;;;;;N;;;;; +18B81;KHITAN SMALL SCRIPT CHARACTER-18B81;Lo;0;L;;;;;N;;;;; +18B82;KHITAN SMALL SCRIPT CHARACTER-18B82;Lo;0;L;;;;;N;;;;; +18B83;KHITAN SMALL SCRIPT CHARACTER-18B83;Lo;0;L;;;;;N;;;;; +18B84;KHITAN SMALL SCRIPT CHARACTER-18B84;Lo;0;L;;;;;N;;;;; +18B85;KHITAN SMALL SCRIPT CHARACTER-18B85;Lo;0;L;;;;;N;;;;; +18B86;KHITAN SMALL SCRIPT CHARACTER-18B86;Lo;0;L;;;;;N;;;;; +18B87;KHITAN SMALL SCRIPT CHARACTER-18B87;Lo;0;L;;;;;N;;;;; +18B88;KHITAN SMALL SCRIPT CHARACTER-18B88;Lo;0;L;;;;;N;;;;; +18B89;KHITAN SMALL SCRIPT CHARACTER-18B89;Lo;0;L;;;;;N;;;;; +18B8A;KHITAN SMALL SCRIPT CHARACTER-18B8A;Lo;0;L;;;;;N;;;;; +18B8B;KHITAN SMALL SCRIPT CHARACTER-18B8B;Lo;0;L;;;;;N;;;;; +18B8C;KHITAN SMALL SCRIPT CHARACTER-18B8C;Lo;0;L;;;;;N;;;;; +18B8D;KHITAN SMALL SCRIPT CHARACTER-18B8D;Lo;0;L;;;;;N;;;;; +18B8E;KHITAN SMALL SCRIPT CHARACTER-18B8E;Lo;0;L;;;;;N;;;;; +18B8F;KHITAN SMALL SCRIPT CHARACTER-18B8F;Lo;0;L;;;;;N;;;;; +18B90;KHITAN SMALL SCRIPT CHARACTER-18B90;Lo;0;L;;;;;N;;;;; +18B91;KHITAN SMALL SCRIPT CHARACTER-18B91;Lo;0;L;;;;;N;;;;; +18B92;KHITAN SMALL SCRIPT CHARACTER-18B92;Lo;0;L;;;;;N;;;;; +18B93;KHITAN SMALL SCRIPT CHARACTER-18B93;Lo;0;L;;;;;N;;;;; +18B94;KHITAN SMALL SCRIPT CHARACTER-18B94;Lo;0;L;;;;;N;;;;; +18B95;KHITAN SMALL SCRIPT CHARACTER-18B95;Lo;0;L;;;;;N;;;;; +18B96;KHITAN SMALL SCRIPT CHARACTER-18B96;Lo;0;L;;;;;N;;;;; +18B97;KHITAN SMALL SCRIPT CHARACTER-18B97;Lo;0;L;;;;;N;;;;; +18B98;KHITAN SMALL SCRIPT CHARACTER-18B98;Lo;0;L;;;;;N;;;;; +18B99;KHITAN SMALL SCRIPT CHARACTER-18B99;Lo;0;L;;;;;N;;;;; +18B9A;KHITAN SMALL SCRIPT CHARACTER-18B9A;Lo;0;L;;;;;N;;;;; +18B9B;KHITAN SMALL SCRIPT CHARACTER-18B9B;Lo;0;L;;;;;N;;;;; +18B9C;KHITAN SMALL SCRIPT CHARACTER-18B9C;Lo;0;L;;;;;N;;;;; +18B9D;KHITAN SMALL SCRIPT CHARACTER-18B9D;Lo;0;L;;;;;N;;;;; +18B9E;KHITAN SMALL SCRIPT CHARACTER-18B9E;Lo;0;L;;;;;N;;;;; +18B9F;KHITAN SMALL SCRIPT CHARACTER-18B9F;Lo;0;L;;;;;N;;;;; +18BA0;KHITAN SMALL SCRIPT CHARACTER-18BA0;Lo;0;L;;;;;N;;;;; +18BA1;KHITAN SMALL SCRIPT CHARACTER-18BA1;Lo;0;L;;;;;N;;;;; +18BA2;KHITAN SMALL SCRIPT CHARACTER-18BA2;Lo;0;L;;;;;N;;;;; +18BA3;KHITAN SMALL SCRIPT CHARACTER-18BA3;Lo;0;L;;;;;N;;;;; +18BA4;KHITAN SMALL SCRIPT CHARACTER-18BA4;Lo;0;L;;;;;N;;;;; +18BA5;KHITAN SMALL SCRIPT CHARACTER-18BA5;Lo;0;L;;;;;N;;;;; +18BA6;KHITAN SMALL SCRIPT CHARACTER-18BA6;Lo;0;L;;;;;N;;;;; +18BA7;KHITAN SMALL SCRIPT CHARACTER-18BA7;Lo;0;L;;;;;N;;;;; +18BA8;KHITAN SMALL SCRIPT CHARACTER-18BA8;Lo;0;L;;;;;N;;;;; +18BA9;KHITAN SMALL SCRIPT CHARACTER-18BA9;Lo;0;L;;;;;N;;;;; +18BAA;KHITAN SMALL SCRIPT CHARACTER-18BAA;Lo;0;L;;;;;N;;;;; +18BAB;KHITAN SMALL SCRIPT CHARACTER-18BAB;Lo;0;L;;;;;N;;;;; +18BAC;KHITAN SMALL SCRIPT CHARACTER-18BAC;Lo;0;L;;;;;N;;;;; +18BAD;KHITAN SMALL SCRIPT CHARACTER-18BAD;Lo;0;L;;;;;N;;;;; +18BAE;KHITAN SMALL SCRIPT CHARACTER-18BAE;Lo;0;L;;;;;N;;;;; +18BAF;KHITAN SMALL SCRIPT CHARACTER-18BAF;Lo;0;L;;;;;N;;;;; +18BB0;KHITAN SMALL SCRIPT CHARACTER-18BB0;Lo;0;L;;;;;N;;;;; +18BB1;KHITAN SMALL SCRIPT CHARACTER-18BB1;Lo;0;L;;;;;N;;;;; +18BB2;KHITAN SMALL SCRIPT CHARACTER-18BB2;Lo;0;L;;;;;N;;;;; +18BB3;KHITAN SMALL SCRIPT CHARACTER-18BB3;Lo;0;L;;;;;N;;;;; +18BB4;KHITAN SMALL SCRIPT CHARACTER-18BB4;Lo;0;L;;;;;N;;;;; +18BB5;KHITAN SMALL SCRIPT CHARACTER-18BB5;Lo;0;L;;;;;N;;;;; +18BB6;KHITAN SMALL SCRIPT CHARACTER-18BB6;Lo;0;L;;;;;N;;;;; +18BB7;KHITAN SMALL SCRIPT CHARACTER-18BB7;Lo;0;L;;;;;N;;;;; +18BB8;KHITAN SMALL SCRIPT CHARACTER-18BB8;Lo;0;L;;;;;N;;;;; +18BB9;KHITAN SMALL SCRIPT CHARACTER-18BB9;Lo;0;L;;;;;N;;;;; +18BBA;KHITAN SMALL SCRIPT CHARACTER-18BBA;Lo;0;L;;;;;N;;;;; +18BBB;KHITAN SMALL SCRIPT CHARACTER-18BBB;Lo;0;L;;;;;N;;;;; +18BBC;KHITAN SMALL SCRIPT CHARACTER-18BBC;Lo;0;L;;;;;N;;;;; +18BBD;KHITAN SMALL SCRIPT CHARACTER-18BBD;Lo;0;L;;;;;N;;;;; +18BBE;KHITAN SMALL SCRIPT CHARACTER-18BBE;Lo;0;L;;;;;N;;;;; +18BBF;KHITAN SMALL SCRIPT CHARACTER-18BBF;Lo;0;L;;;;;N;;;;; +18BC0;KHITAN SMALL SCRIPT CHARACTER-18BC0;Lo;0;L;;;;;N;;;;; +18BC1;KHITAN SMALL SCRIPT CHARACTER-18BC1;Lo;0;L;;;;;N;;;;; +18BC2;KHITAN SMALL SCRIPT CHARACTER-18BC2;Lo;0;L;;;;;N;;;;; +18BC3;KHITAN SMALL SCRIPT CHARACTER-18BC3;Lo;0;L;;;;;N;;;;; +18BC4;KHITAN SMALL SCRIPT CHARACTER-18BC4;Lo;0;L;;;;;N;;;;; +18BC5;KHITAN SMALL SCRIPT CHARACTER-18BC5;Lo;0;L;;;;;N;;;;; +18BC6;KHITAN SMALL SCRIPT CHARACTER-18BC6;Lo;0;L;;;;;N;;;;; +18BC7;KHITAN SMALL SCRIPT CHARACTER-18BC7;Lo;0;L;;;;;N;;;;; +18BC8;KHITAN SMALL SCRIPT CHARACTER-18BC8;Lo;0;L;;;;;N;;;;; +18BC9;KHITAN SMALL SCRIPT CHARACTER-18BC9;Lo;0;L;;;;;N;;;;; +18BCA;KHITAN SMALL SCRIPT CHARACTER-18BCA;Lo;0;L;;;;;N;;;;; +18BCB;KHITAN SMALL SCRIPT CHARACTER-18BCB;Lo;0;L;;;;;N;;;;; +18BCC;KHITAN SMALL SCRIPT CHARACTER-18BCC;Lo;0;L;;;;;N;;;;; +18BCD;KHITAN SMALL SCRIPT CHARACTER-18BCD;Lo;0;L;;;;;N;;;;; +18BCE;KHITAN SMALL SCRIPT CHARACTER-18BCE;Lo;0;L;;;;;N;;;;; +18BCF;KHITAN SMALL SCRIPT CHARACTER-18BCF;Lo;0;L;;;;;N;;;;; +18BD0;KHITAN SMALL SCRIPT CHARACTER-18BD0;Lo;0;L;;;;;N;;;;; +18BD1;KHITAN SMALL SCRIPT CHARACTER-18BD1;Lo;0;L;;;;;N;;;;; +18BD2;KHITAN SMALL SCRIPT CHARACTER-18BD2;Lo;0;L;;;;;N;;;;; +18BD3;KHITAN SMALL SCRIPT CHARACTER-18BD3;Lo;0;L;;;;;N;;;;; +18BD4;KHITAN SMALL SCRIPT CHARACTER-18BD4;Lo;0;L;;;;;N;;;;; +18BD5;KHITAN SMALL SCRIPT CHARACTER-18BD5;Lo;0;L;;;;;N;;;;; +18BD6;KHITAN SMALL SCRIPT CHARACTER-18BD6;Lo;0;L;;;;;N;;;;; +18BD7;KHITAN SMALL SCRIPT CHARACTER-18BD7;Lo;0;L;;;;;N;;;;; +18BD8;KHITAN SMALL SCRIPT CHARACTER-18BD8;Lo;0;L;;;;;N;;;;; +18BD9;KHITAN SMALL SCRIPT CHARACTER-18BD9;Lo;0;L;;;;;N;;;;; +18BDA;KHITAN SMALL SCRIPT CHARACTER-18BDA;Lo;0;L;;;;;N;;;;; +18BDB;KHITAN SMALL SCRIPT CHARACTER-18BDB;Lo;0;L;;;;;N;;;;; +18BDC;KHITAN SMALL SCRIPT CHARACTER-18BDC;Lo;0;L;;;;;N;;;;; +18BDD;KHITAN SMALL SCRIPT CHARACTER-18BDD;Lo;0;L;;;;;N;;;;; +18BDE;KHITAN SMALL SCRIPT CHARACTER-18BDE;Lo;0;L;;;;;N;;;;; +18BDF;KHITAN SMALL SCRIPT CHARACTER-18BDF;Lo;0;L;;;;;N;;;;; +18BE0;KHITAN SMALL SCRIPT CHARACTER-18BE0;Lo;0;L;;;;;N;;;;; +18BE1;KHITAN SMALL SCRIPT CHARACTER-18BE1;Lo;0;L;;;;;N;;;;; +18BE2;KHITAN SMALL SCRIPT CHARACTER-18BE2;Lo;0;L;;;;;N;;;;; +18BE3;KHITAN SMALL SCRIPT CHARACTER-18BE3;Lo;0;L;;;;;N;;;;; +18BE4;KHITAN SMALL SCRIPT CHARACTER-18BE4;Lo;0;L;;;;;N;;;;; +18BE5;KHITAN SMALL SCRIPT CHARACTER-18BE5;Lo;0;L;;;;;N;;;;; +18BE6;KHITAN SMALL SCRIPT CHARACTER-18BE6;Lo;0;L;;;;;N;;;;; +18BE7;KHITAN SMALL SCRIPT CHARACTER-18BE7;Lo;0;L;;;;;N;;;;; +18BE8;KHITAN SMALL SCRIPT CHARACTER-18BE8;Lo;0;L;;;;;N;;;;; +18BE9;KHITAN SMALL SCRIPT CHARACTER-18BE9;Lo;0;L;;;;;N;;;;; +18BEA;KHITAN SMALL SCRIPT CHARACTER-18BEA;Lo;0;L;;;;;N;;;;; +18BEB;KHITAN SMALL SCRIPT CHARACTER-18BEB;Lo;0;L;;;;;N;;;;; +18BEC;KHITAN SMALL SCRIPT CHARACTER-18BEC;Lo;0;L;;;;;N;;;;; +18BED;KHITAN SMALL SCRIPT CHARACTER-18BED;Lo;0;L;;;;;N;;;;; +18BEE;KHITAN SMALL SCRIPT CHARACTER-18BEE;Lo;0;L;;;;;N;;;;; +18BEF;KHITAN SMALL SCRIPT CHARACTER-18BEF;Lo;0;L;;;;;N;;;;; +18BF0;KHITAN SMALL SCRIPT CHARACTER-18BF0;Lo;0;L;;;;;N;;;;; +18BF1;KHITAN SMALL SCRIPT CHARACTER-18BF1;Lo;0;L;;;;;N;;;;; +18BF2;KHITAN SMALL SCRIPT CHARACTER-18BF2;Lo;0;L;;;;;N;;;;; +18BF3;KHITAN SMALL SCRIPT CHARACTER-18BF3;Lo;0;L;;;;;N;;;;; +18BF4;KHITAN SMALL SCRIPT CHARACTER-18BF4;Lo;0;L;;;;;N;;;;; +18BF5;KHITAN SMALL SCRIPT CHARACTER-18BF5;Lo;0;L;;;;;N;;;;; +18BF6;KHITAN SMALL SCRIPT CHARACTER-18BF6;Lo;0;L;;;;;N;;;;; +18BF7;KHITAN SMALL SCRIPT CHARACTER-18BF7;Lo;0;L;;;;;N;;;;; +18BF8;KHITAN SMALL SCRIPT CHARACTER-18BF8;Lo;0;L;;;;;N;;;;; +18BF9;KHITAN SMALL SCRIPT CHARACTER-18BF9;Lo;0;L;;;;;N;;;;; +18BFA;KHITAN SMALL SCRIPT CHARACTER-18BFA;Lo;0;L;;;;;N;;;;; +18BFB;KHITAN SMALL SCRIPT CHARACTER-18BFB;Lo;0;L;;;;;N;;;;; +18BFC;KHITAN SMALL SCRIPT CHARACTER-18BFC;Lo;0;L;;;;;N;;;;; +18BFD;KHITAN SMALL SCRIPT CHARACTER-18BFD;Lo;0;L;;;;;N;;;;; +18BFE;KHITAN SMALL SCRIPT CHARACTER-18BFE;Lo;0;L;;;;;N;;;;; +18BFF;KHITAN SMALL SCRIPT CHARACTER-18BFF;Lo;0;L;;;;;N;;;;; +18C00;KHITAN SMALL SCRIPT CHARACTER-18C00;Lo;0;L;;;;;N;;;;; +18C01;KHITAN SMALL SCRIPT CHARACTER-18C01;Lo;0;L;;;;;N;;;;; +18C02;KHITAN SMALL SCRIPT CHARACTER-18C02;Lo;0;L;;;;;N;;;;; +18C03;KHITAN SMALL SCRIPT CHARACTER-18C03;Lo;0;L;;;;;N;;;;; +18C04;KHITAN SMALL SCRIPT CHARACTER-18C04;Lo;0;L;;;;;N;;;;; +18C05;KHITAN SMALL SCRIPT CHARACTER-18C05;Lo;0;L;;;;;N;;;;; +18C06;KHITAN SMALL SCRIPT CHARACTER-18C06;Lo;0;L;;;;;N;;;;; +18C07;KHITAN SMALL SCRIPT CHARACTER-18C07;Lo;0;L;;;;;N;;;;; +18C08;KHITAN SMALL SCRIPT CHARACTER-18C08;Lo;0;L;;;;;N;;;;; +18C09;KHITAN SMALL SCRIPT CHARACTER-18C09;Lo;0;L;;;;;N;;;;; +18C0A;KHITAN SMALL SCRIPT CHARACTER-18C0A;Lo;0;L;;;;;N;;;;; +18C0B;KHITAN SMALL SCRIPT CHARACTER-18C0B;Lo;0;L;;;;;N;;;;; +18C0C;KHITAN SMALL SCRIPT CHARACTER-18C0C;Lo;0;L;;;;;N;;;;; +18C0D;KHITAN SMALL SCRIPT CHARACTER-18C0D;Lo;0;L;;;;;N;;;;; +18C0E;KHITAN SMALL SCRIPT CHARACTER-18C0E;Lo;0;L;;;;;N;;;;; +18C0F;KHITAN SMALL SCRIPT CHARACTER-18C0F;Lo;0;L;;;;;N;;;;; +18C10;KHITAN SMALL SCRIPT CHARACTER-18C10;Lo;0;L;;;;;N;;;;; +18C11;KHITAN SMALL SCRIPT CHARACTER-18C11;Lo;0;L;;;;;N;;;;; +18C12;KHITAN SMALL SCRIPT CHARACTER-18C12;Lo;0;L;;;;;N;;;;; +18C13;KHITAN SMALL SCRIPT CHARACTER-18C13;Lo;0;L;;;;;N;;;;; +18C14;KHITAN SMALL SCRIPT CHARACTER-18C14;Lo;0;L;;;;;N;;;;; +18C15;KHITAN SMALL SCRIPT CHARACTER-18C15;Lo;0;L;;;;;N;;;;; +18C16;KHITAN SMALL SCRIPT CHARACTER-18C16;Lo;0;L;;;;;N;;;;; +18C17;KHITAN SMALL SCRIPT CHARACTER-18C17;Lo;0;L;;;;;N;;;;; +18C18;KHITAN SMALL SCRIPT CHARACTER-18C18;Lo;0;L;;;;;N;;;;; +18C19;KHITAN SMALL SCRIPT CHARACTER-18C19;Lo;0;L;;;;;N;;;;; +18C1A;KHITAN SMALL SCRIPT CHARACTER-18C1A;Lo;0;L;;;;;N;;;;; +18C1B;KHITAN SMALL SCRIPT CHARACTER-18C1B;Lo;0;L;;;;;N;;;;; +18C1C;KHITAN SMALL SCRIPT CHARACTER-18C1C;Lo;0;L;;;;;N;;;;; +18C1D;KHITAN SMALL SCRIPT CHARACTER-18C1D;Lo;0;L;;;;;N;;;;; +18C1E;KHITAN SMALL SCRIPT CHARACTER-18C1E;Lo;0;L;;;;;N;;;;; +18C1F;KHITAN SMALL SCRIPT CHARACTER-18C1F;Lo;0;L;;;;;N;;;;; +18C20;KHITAN SMALL SCRIPT CHARACTER-18C20;Lo;0;L;;;;;N;;;;; +18C21;KHITAN SMALL SCRIPT CHARACTER-18C21;Lo;0;L;;;;;N;;;;; +18C22;KHITAN SMALL SCRIPT CHARACTER-18C22;Lo;0;L;;;;;N;;;;; +18C23;KHITAN SMALL SCRIPT CHARACTER-18C23;Lo;0;L;;;;;N;;;;; +18C24;KHITAN SMALL SCRIPT CHARACTER-18C24;Lo;0;L;;;;;N;;;;; +18C25;KHITAN SMALL SCRIPT CHARACTER-18C25;Lo;0;L;;;;;N;;;;; +18C26;KHITAN SMALL SCRIPT CHARACTER-18C26;Lo;0;L;;;;;N;;;;; +18C27;KHITAN SMALL SCRIPT CHARACTER-18C27;Lo;0;L;;;;;N;;;;; +18C28;KHITAN SMALL SCRIPT CHARACTER-18C28;Lo;0;L;;;;;N;;;;; +18C29;KHITAN SMALL SCRIPT CHARACTER-18C29;Lo;0;L;;;;;N;;;;; +18C2A;KHITAN SMALL SCRIPT CHARACTER-18C2A;Lo;0;L;;;;;N;;;;; +18C2B;KHITAN SMALL SCRIPT CHARACTER-18C2B;Lo;0;L;;;;;N;;;;; +18C2C;KHITAN SMALL SCRIPT CHARACTER-18C2C;Lo;0;L;;;;;N;;;;; +18C2D;KHITAN SMALL SCRIPT CHARACTER-18C2D;Lo;0;L;;;;;N;;;;; +18C2E;KHITAN SMALL SCRIPT CHARACTER-18C2E;Lo;0;L;;;;;N;;;;; +18C2F;KHITAN SMALL SCRIPT CHARACTER-18C2F;Lo;0;L;;;;;N;;;;; +18C30;KHITAN SMALL SCRIPT CHARACTER-18C30;Lo;0;L;;;;;N;;;;; +18C31;KHITAN SMALL SCRIPT CHARACTER-18C31;Lo;0;L;;;;;N;;;;; +18C32;KHITAN SMALL SCRIPT CHARACTER-18C32;Lo;0;L;;;;;N;;;;; +18C33;KHITAN SMALL SCRIPT CHARACTER-18C33;Lo;0;L;;;;;N;;;;; +18C34;KHITAN SMALL SCRIPT CHARACTER-18C34;Lo;0;L;;;;;N;;;;; +18C35;KHITAN SMALL SCRIPT CHARACTER-18C35;Lo;0;L;;;;;N;;;;; +18C36;KHITAN SMALL SCRIPT CHARACTER-18C36;Lo;0;L;;;;;N;;;;; +18C37;KHITAN SMALL SCRIPT CHARACTER-18C37;Lo;0;L;;;;;N;;;;; +18C38;KHITAN SMALL SCRIPT CHARACTER-18C38;Lo;0;L;;;;;N;;;;; +18C39;KHITAN SMALL SCRIPT CHARACTER-18C39;Lo;0;L;;;;;N;;;;; +18C3A;KHITAN SMALL SCRIPT CHARACTER-18C3A;Lo;0;L;;;;;N;;;;; +18C3B;KHITAN SMALL SCRIPT CHARACTER-18C3B;Lo;0;L;;;;;N;;;;; +18C3C;KHITAN SMALL SCRIPT CHARACTER-18C3C;Lo;0;L;;;;;N;;;;; +18C3D;KHITAN SMALL SCRIPT CHARACTER-18C3D;Lo;0;L;;;;;N;;;;; +18C3E;KHITAN SMALL SCRIPT CHARACTER-18C3E;Lo;0;L;;;;;N;;;;; +18C3F;KHITAN SMALL SCRIPT CHARACTER-18C3F;Lo;0;L;;;;;N;;;;; +18C40;KHITAN SMALL SCRIPT CHARACTER-18C40;Lo;0;L;;;;;N;;;;; +18C41;KHITAN SMALL SCRIPT CHARACTER-18C41;Lo;0;L;;;;;N;;;;; +18C42;KHITAN SMALL SCRIPT CHARACTER-18C42;Lo;0;L;;;;;N;;;;; +18C43;KHITAN SMALL SCRIPT CHARACTER-18C43;Lo;0;L;;;;;N;;;;; +18C44;KHITAN SMALL SCRIPT CHARACTER-18C44;Lo;0;L;;;;;N;;;;; +18C45;KHITAN SMALL SCRIPT CHARACTER-18C45;Lo;0;L;;;;;N;;;;; +18C46;KHITAN SMALL SCRIPT CHARACTER-18C46;Lo;0;L;;;;;N;;;;; +18C47;KHITAN SMALL SCRIPT CHARACTER-18C47;Lo;0;L;;;;;N;;;;; +18C48;KHITAN SMALL SCRIPT CHARACTER-18C48;Lo;0;L;;;;;N;;;;; +18C49;KHITAN SMALL SCRIPT CHARACTER-18C49;Lo;0;L;;;;;N;;;;; +18C4A;KHITAN SMALL SCRIPT CHARACTER-18C4A;Lo;0;L;;;;;N;;;;; +18C4B;KHITAN SMALL SCRIPT CHARACTER-18C4B;Lo;0;L;;;;;N;;;;; +18C4C;KHITAN SMALL SCRIPT CHARACTER-18C4C;Lo;0;L;;;;;N;;;;; +18C4D;KHITAN SMALL SCRIPT CHARACTER-18C4D;Lo;0;L;;;;;N;;;;; +18C4E;KHITAN SMALL SCRIPT CHARACTER-18C4E;Lo;0;L;;;;;N;;;;; +18C4F;KHITAN SMALL SCRIPT CHARACTER-18C4F;Lo;0;L;;;;;N;;;;; +18C50;KHITAN SMALL SCRIPT CHARACTER-18C50;Lo;0;L;;;;;N;;;;; +18C51;KHITAN SMALL SCRIPT CHARACTER-18C51;Lo;0;L;;;;;N;;;;; +18C52;KHITAN SMALL SCRIPT CHARACTER-18C52;Lo;0;L;;;;;N;;;;; +18C53;KHITAN SMALL SCRIPT CHARACTER-18C53;Lo;0;L;;;;;N;;;;; +18C54;KHITAN SMALL SCRIPT CHARACTER-18C54;Lo;0;L;;;;;N;;;;; +18C55;KHITAN SMALL SCRIPT CHARACTER-18C55;Lo;0;L;;;;;N;;;;; +18C56;KHITAN SMALL SCRIPT CHARACTER-18C56;Lo;0;L;;;;;N;;;;; +18C57;KHITAN SMALL SCRIPT CHARACTER-18C57;Lo;0;L;;;;;N;;;;; +18C58;KHITAN SMALL SCRIPT CHARACTER-18C58;Lo;0;L;;;;;N;;;;; +18C59;KHITAN SMALL SCRIPT CHARACTER-18C59;Lo;0;L;;;;;N;;;;; +18C5A;KHITAN SMALL SCRIPT CHARACTER-18C5A;Lo;0;L;;;;;N;;;;; +18C5B;KHITAN SMALL SCRIPT CHARACTER-18C5B;Lo;0;L;;;;;N;;;;; +18C5C;KHITAN SMALL SCRIPT CHARACTER-18C5C;Lo;0;L;;;;;N;;;;; +18C5D;KHITAN SMALL SCRIPT CHARACTER-18C5D;Lo;0;L;;;;;N;;;;; +18C5E;KHITAN SMALL SCRIPT CHARACTER-18C5E;Lo;0;L;;;;;N;;;;; +18C5F;KHITAN SMALL SCRIPT CHARACTER-18C5F;Lo;0;L;;;;;N;;;;; +18C60;KHITAN SMALL SCRIPT CHARACTER-18C60;Lo;0;L;;;;;N;;;;; +18C61;KHITAN SMALL SCRIPT CHARACTER-18C61;Lo;0;L;;;;;N;;;;; +18C62;KHITAN SMALL SCRIPT CHARACTER-18C62;Lo;0;L;;;;;N;;;;; +18C63;KHITAN SMALL SCRIPT CHARACTER-18C63;Lo;0;L;;;;;N;;;;; +18C64;KHITAN SMALL SCRIPT CHARACTER-18C64;Lo;0;L;;;;;N;;;;; +18C65;KHITAN SMALL SCRIPT CHARACTER-18C65;Lo;0;L;;;;;N;;;;; +18C66;KHITAN SMALL SCRIPT CHARACTER-18C66;Lo;0;L;;;;;N;;;;; +18C67;KHITAN SMALL SCRIPT CHARACTER-18C67;Lo;0;L;;;;;N;;;;; +18C68;KHITAN SMALL SCRIPT CHARACTER-18C68;Lo;0;L;;;;;N;;;;; +18C69;KHITAN SMALL SCRIPT CHARACTER-18C69;Lo;0;L;;;;;N;;;;; +18C6A;KHITAN SMALL SCRIPT CHARACTER-18C6A;Lo;0;L;;;;;N;;;;; +18C6B;KHITAN SMALL SCRIPT CHARACTER-18C6B;Lo;0;L;;;;;N;;;;; +18C6C;KHITAN SMALL SCRIPT CHARACTER-18C6C;Lo;0;L;;;;;N;;;;; +18C6D;KHITAN SMALL SCRIPT CHARACTER-18C6D;Lo;0;L;;;;;N;;;;; +18C6E;KHITAN SMALL SCRIPT CHARACTER-18C6E;Lo;0;L;;;;;N;;;;; +18C6F;KHITAN SMALL SCRIPT CHARACTER-18C6F;Lo;0;L;;;;;N;;;;; +18C70;KHITAN SMALL SCRIPT CHARACTER-18C70;Lo;0;L;;;;;N;;;;; +18C71;KHITAN SMALL SCRIPT CHARACTER-18C71;Lo;0;L;;;;;N;;;;; +18C72;KHITAN SMALL SCRIPT CHARACTER-18C72;Lo;0;L;;;;;N;;;;; +18C73;KHITAN SMALL SCRIPT CHARACTER-18C73;Lo;0;L;;;;;N;;;;; +18C74;KHITAN SMALL SCRIPT CHARACTER-18C74;Lo;0;L;;;;;N;;;;; +18C75;KHITAN SMALL SCRIPT CHARACTER-18C75;Lo;0;L;;;;;N;;;;; +18C76;KHITAN SMALL SCRIPT CHARACTER-18C76;Lo;0;L;;;;;N;;;;; +18C77;KHITAN SMALL SCRIPT CHARACTER-18C77;Lo;0;L;;;;;N;;;;; +18C78;KHITAN SMALL SCRIPT CHARACTER-18C78;Lo;0;L;;;;;N;;;;; +18C79;KHITAN SMALL SCRIPT CHARACTER-18C79;Lo;0;L;;;;;N;;;;; +18C7A;KHITAN SMALL SCRIPT CHARACTER-18C7A;Lo;0;L;;;;;N;;;;; +18C7B;KHITAN SMALL SCRIPT CHARACTER-18C7B;Lo;0;L;;;;;N;;;;; +18C7C;KHITAN SMALL SCRIPT CHARACTER-18C7C;Lo;0;L;;;;;N;;;;; +18C7D;KHITAN SMALL SCRIPT CHARACTER-18C7D;Lo;0;L;;;;;N;;;;; +18C7E;KHITAN SMALL SCRIPT CHARACTER-18C7E;Lo;0;L;;;;;N;;;;; +18C7F;KHITAN SMALL SCRIPT CHARACTER-18C7F;Lo;0;L;;;;;N;;;;; +18C80;KHITAN SMALL SCRIPT CHARACTER-18C80;Lo;0;L;;;;;N;;;;; +18C81;KHITAN SMALL SCRIPT CHARACTER-18C81;Lo;0;L;;;;;N;;;;; +18C82;KHITAN SMALL SCRIPT CHARACTER-18C82;Lo;0;L;;;;;N;;;;; +18C83;KHITAN SMALL SCRIPT CHARACTER-18C83;Lo;0;L;;;;;N;;;;; +18C84;KHITAN SMALL SCRIPT CHARACTER-18C84;Lo;0;L;;;;;N;;;;; +18C85;KHITAN SMALL SCRIPT CHARACTER-18C85;Lo;0;L;;;;;N;;;;; +18C86;KHITAN SMALL SCRIPT CHARACTER-18C86;Lo;0;L;;;;;N;;;;; +18C87;KHITAN SMALL SCRIPT CHARACTER-18C87;Lo;0;L;;;;;N;;;;; +18C88;KHITAN SMALL SCRIPT CHARACTER-18C88;Lo;0;L;;;;;N;;;;; +18C89;KHITAN SMALL SCRIPT CHARACTER-18C89;Lo;0;L;;;;;N;;;;; +18C8A;KHITAN SMALL SCRIPT CHARACTER-18C8A;Lo;0;L;;;;;N;;;;; +18C8B;KHITAN SMALL SCRIPT CHARACTER-18C8B;Lo;0;L;;;;;N;;;;; +18C8C;KHITAN SMALL SCRIPT CHARACTER-18C8C;Lo;0;L;;;;;N;;;;; +18C8D;KHITAN SMALL SCRIPT CHARACTER-18C8D;Lo;0;L;;;;;N;;;;; +18C8E;KHITAN SMALL SCRIPT CHARACTER-18C8E;Lo;0;L;;;;;N;;;;; +18C8F;KHITAN SMALL SCRIPT CHARACTER-18C8F;Lo;0;L;;;;;N;;;;; +18C90;KHITAN SMALL SCRIPT CHARACTER-18C90;Lo;0;L;;;;;N;;;;; +18C91;KHITAN SMALL SCRIPT CHARACTER-18C91;Lo;0;L;;;;;N;;;;; +18C92;KHITAN SMALL SCRIPT CHARACTER-18C92;Lo;0;L;;;;;N;;;;; +18C93;KHITAN SMALL SCRIPT CHARACTER-18C93;Lo;0;L;;;;;N;;;;; +18C94;KHITAN SMALL SCRIPT CHARACTER-18C94;Lo;0;L;;;;;N;;;;; +18C95;KHITAN SMALL SCRIPT CHARACTER-18C95;Lo;0;L;;;;;N;;;;; +18C96;KHITAN SMALL SCRIPT CHARACTER-18C96;Lo;0;L;;;;;N;;;;; +18C97;KHITAN SMALL SCRIPT CHARACTER-18C97;Lo;0;L;;;;;N;;;;; +18C98;KHITAN SMALL SCRIPT CHARACTER-18C98;Lo;0;L;;;;;N;;;;; +18C99;KHITAN SMALL SCRIPT CHARACTER-18C99;Lo;0;L;;;;;N;;;;; +18C9A;KHITAN SMALL SCRIPT CHARACTER-18C9A;Lo;0;L;;;;;N;;;;; +18C9B;KHITAN SMALL SCRIPT CHARACTER-18C9B;Lo;0;L;;;;;N;;;;; +18C9C;KHITAN SMALL SCRIPT CHARACTER-18C9C;Lo;0;L;;;;;N;;;;; +18C9D;KHITAN SMALL SCRIPT CHARACTER-18C9D;Lo;0;L;;;;;N;;;;; +18C9E;KHITAN SMALL SCRIPT CHARACTER-18C9E;Lo;0;L;;;;;N;;;;; +18C9F;KHITAN SMALL SCRIPT CHARACTER-18C9F;Lo;0;L;;;;;N;;;;; +18CA0;KHITAN SMALL SCRIPT CHARACTER-18CA0;Lo;0;L;;;;;N;;;;; +18CA1;KHITAN SMALL SCRIPT CHARACTER-18CA1;Lo;0;L;;;;;N;;;;; +18CA2;KHITAN SMALL SCRIPT CHARACTER-18CA2;Lo;0;L;;;;;N;;;;; +18CA3;KHITAN SMALL SCRIPT CHARACTER-18CA3;Lo;0;L;;;;;N;;;;; +18CA4;KHITAN SMALL SCRIPT CHARACTER-18CA4;Lo;0;L;;;;;N;;;;; +18CA5;KHITAN SMALL SCRIPT CHARACTER-18CA5;Lo;0;L;;;;;N;;;;; +18CA6;KHITAN SMALL SCRIPT CHARACTER-18CA6;Lo;0;L;;;;;N;;;;; +18CA7;KHITAN SMALL SCRIPT CHARACTER-18CA7;Lo;0;L;;;;;N;;;;; +18CA8;KHITAN SMALL SCRIPT CHARACTER-18CA8;Lo;0;L;;;;;N;;;;; +18CA9;KHITAN SMALL SCRIPT CHARACTER-18CA9;Lo;0;L;;;;;N;;;;; +18CAA;KHITAN SMALL SCRIPT CHARACTER-18CAA;Lo;0;L;;;;;N;;;;; +18CAB;KHITAN SMALL SCRIPT CHARACTER-18CAB;Lo;0;L;;;;;N;;;;; +18CAC;KHITAN SMALL SCRIPT CHARACTER-18CAC;Lo;0;L;;;;;N;;;;; +18CAD;KHITAN SMALL SCRIPT CHARACTER-18CAD;Lo;0;L;;;;;N;;;;; +18CAE;KHITAN SMALL SCRIPT CHARACTER-18CAE;Lo;0;L;;;;;N;;;;; +18CAF;KHITAN SMALL SCRIPT CHARACTER-18CAF;Lo;0;L;;;;;N;;;;; +18CB0;KHITAN SMALL SCRIPT CHARACTER-18CB0;Lo;0;L;;;;;N;;;;; +18CB1;KHITAN SMALL SCRIPT CHARACTER-18CB1;Lo;0;L;;;;;N;;;;; +18CB2;KHITAN SMALL SCRIPT CHARACTER-18CB2;Lo;0;L;;;;;N;;;;; +18CB3;KHITAN SMALL SCRIPT CHARACTER-18CB3;Lo;0;L;;;;;N;;;;; +18CB4;KHITAN SMALL SCRIPT CHARACTER-18CB4;Lo;0;L;;;;;N;;;;; +18CB5;KHITAN SMALL SCRIPT CHARACTER-18CB5;Lo;0;L;;;;;N;;;;; +18CB6;KHITAN SMALL SCRIPT CHARACTER-18CB6;Lo;0;L;;;;;N;;;;; +18CB7;KHITAN SMALL SCRIPT CHARACTER-18CB7;Lo;0;L;;;;;N;;;;; +18CB8;KHITAN SMALL SCRIPT CHARACTER-18CB8;Lo;0;L;;;;;N;;;;; +18CB9;KHITAN SMALL SCRIPT CHARACTER-18CB9;Lo;0;L;;;;;N;;;;; +18CBA;KHITAN SMALL SCRIPT CHARACTER-18CBA;Lo;0;L;;;;;N;;;;; +18CBB;KHITAN SMALL SCRIPT CHARACTER-18CBB;Lo;0;L;;;;;N;;;;; +18CBC;KHITAN SMALL SCRIPT CHARACTER-18CBC;Lo;0;L;;;;;N;;;;; +18CBD;KHITAN SMALL SCRIPT CHARACTER-18CBD;Lo;0;L;;;;;N;;;;; +18CBE;KHITAN SMALL SCRIPT CHARACTER-18CBE;Lo;0;L;;;;;N;;;;; +18CBF;KHITAN SMALL SCRIPT CHARACTER-18CBF;Lo;0;L;;;;;N;;;;; +18CC0;KHITAN SMALL SCRIPT CHARACTER-18CC0;Lo;0;L;;;;;N;;;;; +18CC1;KHITAN SMALL SCRIPT CHARACTER-18CC1;Lo;0;L;;;;;N;;;;; +18CC2;KHITAN SMALL SCRIPT CHARACTER-18CC2;Lo;0;L;;;;;N;;;;; +18CC3;KHITAN SMALL SCRIPT CHARACTER-18CC3;Lo;0;L;;;;;N;;;;; +18CC4;KHITAN SMALL SCRIPT CHARACTER-18CC4;Lo;0;L;;;;;N;;;;; +18CC5;KHITAN SMALL SCRIPT CHARACTER-18CC5;Lo;0;L;;;;;N;;;;; +18CC6;KHITAN SMALL SCRIPT CHARACTER-18CC6;Lo;0;L;;;;;N;;;;; +18CC7;KHITAN SMALL SCRIPT CHARACTER-18CC7;Lo;0;L;;;;;N;;;;; +18CC8;KHITAN SMALL SCRIPT CHARACTER-18CC8;Lo;0;L;;;;;N;;;;; +18CC9;KHITAN SMALL SCRIPT CHARACTER-18CC9;Lo;0;L;;;;;N;;;;; +18CCA;KHITAN SMALL SCRIPT CHARACTER-18CCA;Lo;0;L;;;;;N;;;;; +18CCB;KHITAN SMALL SCRIPT CHARACTER-18CCB;Lo;0;L;;;;;N;;;;; +18CCC;KHITAN SMALL SCRIPT CHARACTER-18CCC;Lo;0;L;;;;;N;;;;; +18CCD;KHITAN SMALL SCRIPT CHARACTER-18CCD;Lo;0;L;;;;;N;;;;; +18CCE;KHITAN SMALL SCRIPT CHARACTER-18CCE;Lo;0;L;;;;;N;;;;; +18CCF;KHITAN SMALL SCRIPT CHARACTER-18CCF;Lo;0;L;;;;;N;;;;; +18CD0;KHITAN SMALL SCRIPT CHARACTER-18CD0;Lo;0;L;;;;;N;;;;; +18CD1;KHITAN SMALL SCRIPT CHARACTER-18CD1;Lo;0;L;;;;;N;;;;; +18CD2;KHITAN SMALL SCRIPT CHARACTER-18CD2;Lo;0;L;;;;;N;;;;; +18CD3;KHITAN SMALL SCRIPT CHARACTER-18CD3;Lo;0;L;;;;;N;;;;; +18CD4;KHITAN SMALL SCRIPT CHARACTER-18CD4;Lo;0;L;;;;;N;;;;; +18CD5;KHITAN SMALL SCRIPT CHARACTER-18CD5;Lo;0;L;;;;;N;;;;; +18CFF;KHITAN SMALL SCRIPT CHARACTER-18CFF;Lo;0;L;;;;;N;;;;; +18D00;;Lo;0;L;;;;;N;;;;; +18D1E;;Lo;0;L;;;;;N;;;;; +18D80;TANGUT COMPONENT-769;Lo;0;L;;;;;N;;;;; +18D81;TANGUT COMPONENT-770;Lo;0;L;;;;;N;;;;; +18D82;TANGUT COMPONENT-771;Lo;0;L;;;;;N;;;;; +18D83;TANGUT COMPONENT-772;Lo;0;L;;;;;N;;;;; +18D84;TANGUT COMPONENT-773;Lo;0;L;;;;;N;;;;; +18D85;TANGUT COMPONENT-774;Lo;0;L;;;;;N;;;;; +18D86;TANGUT COMPONENT-775;Lo;0;L;;;;;N;;;;; +18D87;TANGUT COMPONENT-776;Lo;0;L;;;;;N;;;;; +18D88;TANGUT COMPONENT-777;Lo;0;L;;;;;N;;;;; +18D89;TANGUT COMPONENT-778;Lo;0;L;;;;;N;;;;; +18D8A;TANGUT COMPONENT-779;Lo;0;L;;;;;N;;;;; +18D8B;TANGUT COMPONENT-780;Lo;0;L;;;;;N;;;;; +18D8C;TANGUT COMPONENT-781;Lo;0;L;;;;;N;;;;; +18D8D;TANGUT COMPONENT-782;Lo;0;L;;;;;N;;;;; +18D8E;TANGUT COMPONENT-783;Lo;0;L;;;;;N;;;;; +18D8F;TANGUT COMPONENT-784;Lo;0;L;;;;;N;;;;; +18D90;TANGUT COMPONENT-785;Lo;0;L;;;;;N;;;;; +18D91;TANGUT COMPONENT-786;Lo;0;L;;;;;N;;;;; +18D92;TANGUT COMPONENT-787;Lo;0;L;;;;;N;;;;; +18D93;TANGUT COMPONENT-788;Lo;0;L;;;;;N;;;;; +18D94;TANGUT COMPONENT-789;Lo;0;L;;;;;N;;;;; +18D95;TANGUT COMPONENT-790;Lo;0;L;;;;;N;;;;; +18D96;TANGUT COMPONENT-791;Lo;0;L;;;;;N;;;;; +18D97;TANGUT COMPONENT-792;Lo;0;L;;;;;N;;;;; +18D98;TANGUT COMPONENT-793;Lo;0;L;;;;;N;;;;; +18D99;TANGUT COMPONENT-794;Lo;0;L;;;;;N;;;;; +18D9A;TANGUT COMPONENT-795;Lo;0;L;;;;;N;;;;; +18D9B;TANGUT COMPONENT-796;Lo;0;L;;;;;N;;;;; +18D9C;TANGUT COMPONENT-797;Lo;0;L;;;;;N;;;;; +18D9D;TANGUT COMPONENT-798;Lo;0;L;;;;;N;;;;; +18D9E;TANGUT COMPONENT-799;Lo;0;L;;;;;N;;;;; +18D9F;TANGUT COMPONENT-800;Lo;0;L;;;;;N;;;;; +18DA0;TANGUT COMPONENT-801;Lo;0;L;;;;;N;;;;; +18DA1;TANGUT COMPONENT-802;Lo;0;L;;;;;N;;;;; +18DA2;TANGUT COMPONENT-803;Lo;0;L;;;;;N;;;;; +18DA3;TANGUT COMPONENT-804;Lo;0;L;;;;;N;;;;; +18DA4;TANGUT COMPONENT-805;Lo;0;L;;;;;N;;;;; +18DA5;TANGUT COMPONENT-806;Lo;0;L;;;;;N;;;;; +18DA6;TANGUT COMPONENT-807;Lo;0;L;;;;;N;;;;; +18DA7;TANGUT COMPONENT-808;Lo;0;L;;;;;N;;;;; +18DA8;TANGUT COMPONENT-809;Lo;0;L;;;;;N;;;;; +18DA9;TANGUT COMPONENT-810;Lo;0;L;;;;;N;;;;; +18DAA;TANGUT COMPONENT-811;Lo;0;L;;;;;N;;;;; +18DAB;TANGUT COMPONENT-812;Lo;0;L;;;;;N;;;;; +18DAC;TANGUT COMPONENT-813;Lo;0;L;;;;;N;;;;; +18DAD;TANGUT COMPONENT-814;Lo;0;L;;;;;N;;;;; +18DAE;TANGUT COMPONENT-815;Lo;0;L;;;;;N;;;;; +18DAF;TANGUT COMPONENT-816;Lo;0;L;;;;;N;;;;; +18DB0;TANGUT COMPONENT-817;Lo;0;L;;;;;N;;;;; +18DB1;TANGUT COMPONENT-818;Lo;0;L;;;;;N;;;;; +18DB2;TANGUT COMPONENT-819;Lo;0;L;;;;;N;;;;; +18DB3;TANGUT COMPONENT-820;Lo;0;L;;;;;N;;;;; +18DB4;TANGUT COMPONENT-821;Lo;0;L;;;;;N;;;;; +18DB5;TANGUT COMPONENT-822;Lo;0;L;;;;;N;;;;; +18DB6;TANGUT COMPONENT-823;Lo;0;L;;;;;N;;;;; +18DB7;TANGUT COMPONENT-824;Lo;0;L;;;;;N;;;;; +18DB8;TANGUT COMPONENT-825;Lo;0;L;;;;;N;;;;; +18DB9;TANGUT COMPONENT-826;Lo;0;L;;;;;N;;;;; +18DBA;TANGUT COMPONENT-827;Lo;0;L;;;;;N;;;;; +18DBB;TANGUT COMPONENT-828;Lo;0;L;;;;;N;;;;; +18DBC;TANGUT COMPONENT-829;Lo;0;L;;;;;N;;;;; +18DBD;TANGUT COMPONENT-830;Lo;0;L;;;;;N;;;;; +18DBE;TANGUT COMPONENT-831;Lo;0;L;;;;;N;;;;; +18DBF;TANGUT COMPONENT-832;Lo;0;L;;;;;N;;;;; +18DC0;TANGUT COMPONENT-833;Lo;0;L;;;;;N;;;;; +18DC1;TANGUT COMPONENT-834;Lo;0;L;;;;;N;;;;; +18DC2;TANGUT COMPONENT-835;Lo;0;L;;;;;N;;;;; +18DC3;TANGUT COMPONENT-836;Lo;0;L;;;;;N;;;;; +18DC4;TANGUT COMPONENT-837;Lo;0;L;;;;;N;;;;; +18DC5;TANGUT COMPONENT-838;Lo;0;L;;;;;N;;;;; +18DC6;TANGUT COMPONENT-839;Lo;0;L;;;;;N;;;;; +18DC7;TANGUT COMPONENT-840;Lo;0;L;;;;;N;;;;; +18DC8;TANGUT COMPONENT-841;Lo;0;L;;;;;N;;;;; +18DC9;TANGUT COMPONENT-842;Lo;0;L;;;;;N;;;;; +18DCA;TANGUT COMPONENT-843;Lo;0;L;;;;;N;;;;; +18DCB;TANGUT COMPONENT-844;Lo;0;L;;;;;N;;;;; +18DCC;TANGUT COMPONENT-845;Lo;0;L;;;;;N;;;;; +18DCD;TANGUT COMPONENT-846;Lo;0;L;;;;;N;;;;; +18DCE;TANGUT COMPONENT-847;Lo;0;L;;;;;N;;;;; +18DCF;TANGUT COMPONENT-848;Lo;0;L;;;;;N;;;;; +18DD0;TANGUT COMPONENT-849;Lo;0;L;;;;;N;;;;; +18DD1;TANGUT COMPONENT-850;Lo;0;L;;;;;N;;;;; +18DD2;TANGUT COMPONENT-851;Lo;0;L;;;;;N;;;;; +18DD3;TANGUT COMPONENT-852;Lo;0;L;;;;;N;;;;; +18DD4;TANGUT COMPONENT-853;Lo;0;L;;;;;N;;;;; +18DD5;TANGUT COMPONENT-854;Lo;0;L;;;;;N;;;;; +18DD6;TANGUT COMPONENT-855;Lo;0;L;;;;;N;;;;; +18DD7;TANGUT COMPONENT-856;Lo;0;L;;;;;N;;;;; +18DD8;TANGUT COMPONENT-857;Lo;0;L;;;;;N;;;;; +18DD9;TANGUT COMPONENT-858;Lo;0;L;;;;;N;;;;; +18DDA;TANGUT COMPONENT-859;Lo;0;L;;;;;N;;;;; +18DDB;TANGUT COMPONENT-860;Lo;0;L;;;;;N;;;;; +18DDC;TANGUT COMPONENT-861;Lo;0;L;;;;;N;;;;; +18DDD;TANGUT COMPONENT-862;Lo;0;L;;;;;N;;;;; +18DDE;TANGUT COMPONENT-863;Lo;0;L;;;;;N;;;;; +18DDF;TANGUT COMPONENT-864;Lo;0;L;;;;;N;;;;; +18DE0;TANGUT COMPONENT-865;Lo;0;L;;;;;N;;;;; +18DE1;TANGUT COMPONENT-866;Lo;0;L;;;;;N;;;;; +18DE2;TANGUT COMPONENT-867;Lo;0;L;;;;;N;;;;; +18DE3;TANGUT COMPONENT-868;Lo;0;L;;;;;N;;;;; +18DE4;TANGUT COMPONENT-869;Lo;0;L;;;;;N;;;;; +18DE5;TANGUT COMPONENT-870;Lo;0;L;;;;;N;;;;; +18DE6;TANGUT COMPONENT-871;Lo;0;L;;;;;N;;;;; +18DE7;TANGUT COMPONENT-872;Lo;0;L;;;;;N;;;;; +18DE8;TANGUT COMPONENT-873;Lo;0;L;;;;;N;;;;; +18DE9;TANGUT COMPONENT-874;Lo;0;L;;;;;N;;;;; +18DEA;TANGUT COMPONENT-875;Lo;0;L;;;;;N;;;;; +18DEB;TANGUT COMPONENT-876;Lo;0;L;;;;;N;;;;; +18DEC;TANGUT COMPONENT-877;Lo;0;L;;;;;N;;;;; +18DED;TANGUT COMPONENT-878;Lo;0;L;;;;;N;;;;; +18DEE;TANGUT COMPONENT-879;Lo;0;L;;;;;N;;;;; +18DEF;TANGUT COMPONENT-880;Lo;0;L;;;;;N;;;;; +18DF0;TANGUT COMPONENT-881;Lo;0;L;;;;;N;;;;; +18DF1;TANGUT COMPONENT-882;Lo;0;L;;;;;N;;;;; +18DF2;TANGUT COMPONENT-883;Lo;0;L;;;;;N;;;;; +1AFF0;KATAKANA LETTER MINNAN TONE-2;Lm;0;L;;;;;N;;;;; +1AFF1;KATAKANA LETTER MINNAN TONE-3;Lm;0;L;;;;;N;;;;; +1AFF2;KATAKANA LETTER MINNAN TONE-4;Lm;0;L;;;;;N;;;;; +1AFF3;KATAKANA LETTER MINNAN TONE-5;Lm;0;L;;;;;N;;;;; +1AFF5;KATAKANA LETTER MINNAN TONE-7;Lm;0;L;;;;;N;;;;; +1AFF6;KATAKANA LETTER MINNAN TONE-8;Lm;0;L;;;;;N;;;;; +1AFF7;KATAKANA LETTER MINNAN NASALIZED TONE-1;Lm;0;L;;;;;N;;;;; +1AFF8;KATAKANA LETTER MINNAN NASALIZED TONE-2;Lm;0;L;;;;;N;;;;; +1AFF9;KATAKANA LETTER MINNAN NASALIZED TONE-3;Lm;0;L;;;;;N;;;;; +1AFFA;KATAKANA LETTER MINNAN NASALIZED TONE-4;Lm;0;L;;;;;N;;;;; +1AFFB;KATAKANA LETTER MINNAN NASALIZED TONE-5;Lm;0;L;;;;;N;;;;; +1AFFD;KATAKANA LETTER MINNAN NASALIZED TONE-7;Lm;0;L;;;;;N;;;;; +1AFFE;KATAKANA LETTER MINNAN NASALIZED TONE-8;Lm;0;L;;;;;N;;;;; +1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; +1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; +1B002;HENTAIGANA LETTER A-1;Lo;0;L;;;;;N;;;;; +1B003;HENTAIGANA LETTER A-2;Lo;0;L;;;;;N;;;;; +1B004;HENTAIGANA LETTER A-3;Lo;0;L;;;;;N;;;;; +1B005;HENTAIGANA LETTER A-WO;Lo;0;L;;;;;N;;;;; +1B006;HENTAIGANA LETTER I-1;Lo;0;L;;;;;N;;;;; +1B007;HENTAIGANA LETTER I-2;Lo;0;L;;;;;N;;;;; +1B008;HENTAIGANA LETTER I-3;Lo;0;L;;;;;N;;;;; +1B009;HENTAIGANA LETTER I-4;Lo;0;L;;;;;N;;;;; +1B00A;HENTAIGANA LETTER U-1;Lo;0;L;;;;;N;;;;; +1B00B;HENTAIGANA LETTER U-2;Lo;0;L;;;;;N;;;;; +1B00C;HENTAIGANA LETTER U-3;Lo;0;L;;;;;N;;;;; +1B00D;HENTAIGANA LETTER U-4;Lo;0;L;;;;;N;;;;; +1B00E;HENTAIGANA LETTER U-5;Lo;0;L;;;;;N;;;;; +1B00F;HENTAIGANA LETTER E-2;Lo;0;L;;;;;N;;;;; +1B010;HENTAIGANA LETTER E-3;Lo;0;L;;;;;N;;;;; +1B011;HENTAIGANA LETTER E-4;Lo;0;L;;;;;N;;;;; +1B012;HENTAIGANA LETTER E-5;Lo;0;L;;;;;N;;;;; +1B013;HENTAIGANA LETTER E-6;Lo;0;L;;;;;N;;;;; +1B014;HENTAIGANA LETTER O-1;Lo;0;L;;;;;N;;;;; +1B015;HENTAIGANA LETTER O-2;Lo;0;L;;;;;N;;;;; +1B016;HENTAIGANA LETTER O-3;Lo;0;L;;;;;N;;;;; +1B017;HENTAIGANA LETTER KA-1;Lo;0;L;;;;;N;;;;; +1B018;HENTAIGANA LETTER KA-2;Lo;0;L;;;;;N;;;;; +1B019;HENTAIGANA LETTER KA-3;Lo;0;L;;;;;N;;;;; +1B01A;HENTAIGANA LETTER KA-4;Lo;0;L;;;;;N;;;;; +1B01B;HENTAIGANA LETTER KA-5;Lo;0;L;;;;;N;;;;; +1B01C;HENTAIGANA LETTER KA-6;Lo;0;L;;;;;N;;;;; +1B01D;HENTAIGANA LETTER KA-7;Lo;0;L;;;;;N;;;;; +1B01E;HENTAIGANA LETTER KA-8;Lo;0;L;;;;;N;;;;; +1B01F;HENTAIGANA LETTER KA-9;Lo;0;L;;;;;N;;;;; +1B020;HENTAIGANA LETTER KA-10;Lo;0;L;;;;;N;;;;; +1B021;HENTAIGANA LETTER KA-11;Lo;0;L;;;;;N;;;;; +1B022;HENTAIGANA LETTER KA-KE;Lo;0;L;;;;;N;;;;; +1B023;HENTAIGANA LETTER KI-1;Lo;0;L;;;;;N;;;;; +1B024;HENTAIGANA LETTER KI-2;Lo;0;L;;;;;N;;;;; +1B025;HENTAIGANA LETTER KI-3;Lo;0;L;;;;;N;;;;; +1B026;HENTAIGANA LETTER KI-4;Lo;0;L;;;;;N;;;;; +1B027;HENTAIGANA LETTER KI-5;Lo;0;L;;;;;N;;;;; +1B028;HENTAIGANA LETTER KI-6;Lo;0;L;;;;;N;;;;; +1B029;HENTAIGANA LETTER KI-7;Lo;0;L;;;;;N;;;;; +1B02A;HENTAIGANA LETTER KI-8;Lo;0;L;;;;;N;;;;; +1B02B;HENTAIGANA LETTER KU-1;Lo;0;L;;;;;N;;;;; +1B02C;HENTAIGANA LETTER KU-2;Lo;0;L;;;;;N;;;;; +1B02D;HENTAIGANA LETTER KU-3;Lo;0;L;;;;;N;;;;; +1B02E;HENTAIGANA LETTER KU-4;Lo;0;L;;;;;N;;;;; +1B02F;HENTAIGANA LETTER KU-5;Lo;0;L;;;;;N;;;;; +1B030;HENTAIGANA LETTER KU-6;Lo;0;L;;;;;N;;;;; +1B031;HENTAIGANA LETTER KU-7;Lo;0;L;;;;;N;;;;; +1B032;HENTAIGANA LETTER KE-1;Lo;0;L;;;;;N;;;;; +1B033;HENTAIGANA LETTER KE-2;Lo;0;L;;;;;N;;;;; +1B034;HENTAIGANA LETTER KE-3;Lo;0;L;;;;;N;;;;; +1B035;HENTAIGANA LETTER KE-4;Lo;0;L;;;;;N;;;;; +1B036;HENTAIGANA LETTER KE-5;Lo;0;L;;;;;N;;;;; +1B037;HENTAIGANA LETTER KE-6;Lo;0;L;;;;;N;;;;; +1B038;HENTAIGANA LETTER KO-1;Lo;0;L;;;;;N;;;;; +1B039;HENTAIGANA LETTER KO-2;Lo;0;L;;;;;N;;;;; +1B03A;HENTAIGANA LETTER KO-3;Lo;0;L;;;;;N;;;;; +1B03B;HENTAIGANA LETTER KO-KI;Lo;0;L;;;;;N;;;;; +1B03C;HENTAIGANA LETTER SA-1;Lo;0;L;;;;;N;;;;; +1B03D;HENTAIGANA LETTER SA-2;Lo;0;L;;;;;N;;;;; +1B03E;HENTAIGANA LETTER SA-3;Lo;0;L;;;;;N;;;;; +1B03F;HENTAIGANA LETTER SA-4;Lo;0;L;;;;;N;;;;; +1B040;HENTAIGANA LETTER SA-5;Lo;0;L;;;;;N;;;;; +1B041;HENTAIGANA LETTER SA-6;Lo;0;L;;;;;N;;;;; +1B042;HENTAIGANA LETTER SA-7;Lo;0;L;;;;;N;;;;; +1B043;HENTAIGANA LETTER SA-8;Lo;0;L;;;;;N;;;;; +1B044;HENTAIGANA LETTER SI-1;Lo;0;L;;;;;N;;;;; +1B045;HENTAIGANA LETTER SI-2;Lo;0;L;;;;;N;;;;; +1B046;HENTAIGANA LETTER SI-3;Lo;0;L;;;;;N;;;;; +1B047;HENTAIGANA LETTER SI-4;Lo;0;L;;;;;N;;;;; +1B048;HENTAIGANA LETTER SI-5;Lo;0;L;;;;;N;;;;; +1B049;HENTAIGANA LETTER SI-6;Lo;0;L;;;;;N;;;;; +1B04A;HENTAIGANA LETTER SU-1;Lo;0;L;;;;;N;;;;; +1B04B;HENTAIGANA LETTER SU-2;Lo;0;L;;;;;N;;;;; +1B04C;HENTAIGANA LETTER SU-3;Lo;0;L;;;;;N;;;;; +1B04D;HENTAIGANA LETTER SU-4;Lo;0;L;;;;;N;;;;; +1B04E;HENTAIGANA LETTER SU-5;Lo;0;L;;;;;N;;;;; +1B04F;HENTAIGANA LETTER SU-6;Lo;0;L;;;;;N;;;;; +1B050;HENTAIGANA LETTER SU-7;Lo;0;L;;;;;N;;;;; +1B051;HENTAIGANA LETTER SU-8;Lo;0;L;;;;;N;;;;; +1B052;HENTAIGANA LETTER SE-1;Lo;0;L;;;;;N;;;;; +1B053;HENTAIGANA LETTER SE-2;Lo;0;L;;;;;N;;;;; +1B054;HENTAIGANA LETTER SE-3;Lo;0;L;;;;;N;;;;; +1B055;HENTAIGANA LETTER SE-4;Lo;0;L;;;;;N;;;;; +1B056;HENTAIGANA LETTER SE-5;Lo;0;L;;;;;N;;;;; +1B057;HENTAIGANA LETTER SO-1;Lo;0;L;;;;;N;;;;; +1B058;HENTAIGANA LETTER SO-2;Lo;0;L;;;;;N;;;;; +1B059;HENTAIGANA LETTER SO-3;Lo;0;L;;;;;N;;;;; +1B05A;HENTAIGANA LETTER SO-4;Lo;0;L;;;;;N;;;;; +1B05B;HENTAIGANA LETTER SO-5;Lo;0;L;;;;;N;;;;; +1B05C;HENTAIGANA LETTER SO-6;Lo;0;L;;;;;N;;;;; +1B05D;HENTAIGANA LETTER SO-7;Lo;0;L;;;;;N;;;;; +1B05E;HENTAIGANA LETTER TA-1;Lo;0;L;;;;;N;;;;; +1B05F;HENTAIGANA LETTER TA-2;Lo;0;L;;;;;N;;;;; +1B060;HENTAIGANA LETTER TA-3;Lo;0;L;;;;;N;;;;; +1B061;HENTAIGANA LETTER TA-4;Lo;0;L;;;;;N;;;;; +1B062;HENTAIGANA LETTER TI-1;Lo;0;L;;;;;N;;;;; +1B063;HENTAIGANA LETTER TI-2;Lo;0;L;;;;;N;;;;; +1B064;HENTAIGANA LETTER TI-3;Lo;0;L;;;;;N;;;;; +1B065;HENTAIGANA LETTER TI-4;Lo;0;L;;;;;N;;;;; +1B066;HENTAIGANA LETTER TI-5;Lo;0;L;;;;;N;;;;; +1B067;HENTAIGANA LETTER TI-6;Lo;0;L;;;;;N;;;;; +1B068;HENTAIGANA LETTER TI-7;Lo;0;L;;;;;N;;;;; +1B069;HENTAIGANA LETTER TU-1;Lo;0;L;;;;;N;;;;; +1B06A;HENTAIGANA LETTER TU-2;Lo;0;L;;;;;N;;;;; +1B06B;HENTAIGANA LETTER TU-3;Lo;0;L;;;;;N;;;;; +1B06C;HENTAIGANA LETTER TU-4;Lo;0;L;;;;;N;;;;; +1B06D;HENTAIGANA LETTER TU-TO;Lo;0;L;;;;;N;;;;; +1B06E;HENTAIGANA LETTER TE-1;Lo;0;L;;;;;N;;;;; +1B06F;HENTAIGANA LETTER TE-2;Lo;0;L;;;;;N;;;;; +1B070;HENTAIGANA LETTER TE-3;Lo;0;L;;;;;N;;;;; +1B071;HENTAIGANA LETTER TE-4;Lo;0;L;;;;;N;;;;; +1B072;HENTAIGANA LETTER TE-5;Lo;0;L;;;;;N;;;;; +1B073;HENTAIGANA LETTER TE-6;Lo;0;L;;;;;N;;;;; +1B074;HENTAIGANA LETTER TE-7;Lo;0;L;;;;;N;;;;; +1B075;HENTAIGANA LETTER TE-8;Lo;0;L;;;;;N;;;;; +1B076;HENTAIGANA LETTER TE-9;Lo;0;L;;;;;N;;;;; +1B077;HENTAIGANA LETTER TO-1;Lo;0;L;;;;;N;;;;; +1B078;HENTAIGANA LETTER TO-2;Lo;0;L;;;;;N;;;;; +1B079;HENTAIGANA LETTER TO-3;Lo;0;L;;;;;N;;;;; +1B07A;HENTAIGANA LETTER TO-4;Lo;0;L;;;;;N;;;;; +1B07B;HENTAIGANA LETTER TO-5;Lo;0;L;;;;;N;;;;; +1B07C;HENTAIGANA LETTER TO-6;Lo;0;L;;;;;N;;;;; +1B07D;HENTAIGANA LETTER TO-RA;Lo;0;L;;;;;N;;;;; +1B07E;HENTAIGANA LETTER NA-1;Lo;0;L;;;;;N;;;;; +1B07F;HENTAIGANA LETTER NA-2;Lo;0;L;;;;;N;;;;; +1B080;HENTAIGANA LETTER NA-3;Lo;0;L;;;;;N;;;;; +1B081;HENTAIGANA LETTER NA-4;Lo;0;L;;;;;N;;;;; +1B082;HENTAIGANA LETTER NA-5;Lo;0;L;;;;;N;;;;; +1B083;HENTAIGANA LETTER NA-6;Lo;0;L;;;;;N;;;;; +1B084;HENTAIGANA LETTER NA-7;Lo;0;L;;;;;N;;;;; +1B085;HENTAIGANA LETTER NA-8;Lo;0;L;;;;;N;;;;; +1B086;HENTAIGANA LETTER NA-9;Lo;0;L;;;;;N;;;;; +1B087;HENTAIGANA LETTER NI-1;Lo;0;L;;;;;N;;;;; +1B088;HENTAIGANA LETTER NI-2;Lo;0;L;;;;;N;;;;; +1B089;HENTAIGANA LETTER NI-3;Lo;0;L;;;;;N;;;;; +1B08A;HENTAIGANA LETTER NI-4;Lo;0;L;;;;;N;;;;; +1B08B;HENTAIGANA LETTER NI-5;Lo;0;L;;;;;N;;;;; +1B08C;HENTAIGANA LETTER NI-6;Lo;0;L;;;;;N;;;;; +1B08D;HENTAIGANA LETTER NI-7;Lo;0;L;;;;;N;;;;; +1B08E;HENTAIGANA LETTER NI-TE;Lo;0;L;;;;;N;;;;; +1B08F;HENTAIGANA LETTER NU-1;Lo;0;L;;;;;N;;;;; +1B090;HENTAIGANA LETTER NU-2;Lo;0;L;;;;;N;;;;; +1B091;HENTAIGANA LETTER NU-3;Lo;0;L;;;;;N;;;;; +1B092;HENTAIGANA LETTER NE-1;Lo;0;L;;;;;N;;;;; +1B093;HENTAIGANA LETTER NE-2;Lo;0;L;;;;;N;;;;; +1B094;HENTAIGANA LETTER NE-3;Lo;0;L;;;;;N;;;;; +1B095;HENTAIGANA LETTER NE-4;Lo;0;L;;;;;N;;;;; +1B096;HENTAIGANA LETTER NE-5;Lo;0;L;;;;;N;;;;; +1B097;HENTAIGANA LETTER NE-6;Lo;0;L;;;;;N;;;;; +1B098;HENTAIGANA LETTER NE-KO;Lo;0;L;;;;;N;;;;; +1B099;HENTAIGANA LETTER NO-1;Lo;0;L;;;;;N;;;;; +1B09A;HENTAIGANA LETTER NO-2;Lo;0;L;;;;;N;;;;; +1B09B;HENTAIGANA LETTER NO-3;Lo;0;L;;;;;N;;;;; +1B09C;HENTAIGANA LETTER NO-4;Lo;0;L;;;;;N;;;;; +1B09D;HENTAIGANA LETTER NO-5;Lo;0;L;;;;;N;;;;; +1B09E;HENTAIGANA LETTER HA-1;Lo;0;L;;;;;N;;;;; +1B09F;HENTAIGANA LETTER HA-2;Lo;0;L;;;;;N;;;;; +1B0A0;HENTAIGANA LETTER HA-3;Lo;0;L;;;;;N;;;;; +1B0A1;HENTAIGANA LETTER HA-4;Lo;0;L;;;;;N;;;;; +1B0A2;HENTAIGANA LETTER HA-5;Lo;0;L;;;;;N;;;;; +1B0A3;HENTAIGANA LETTER HA-6;Lo;0;L;;;;;N;;;;; +1B0A4;HENTAIGANA LETTER HA-7;Lo;0;L;;;;;N;;;;; +1B0A5;HENTAIGANA LETTER HA-8;Lo;0;L;;;;;N;;;;; +1B0A6;HENTAIGANA LETTER HA-9;Lo;0;L;;;;;N;;;;; +1B0A7;HENTAIGANA LETTER HA-10;Lo;0;L;;;;;N;;;;; +1B0A8;HENTAIGANA LETTER HA-11;Lo;0;L;;;;;N;;;;; +1B0A9;HENTAIGANA LETTER HI-1;Lo;0;L;;;;;N;;;;; +1B0AA;HENTAIGANA LETTER HI-2;Lo;0;L;;;;;N;;;;; +1B0AB;HENTAIGANA LETTER HI-3;Lo;0;L;;;;;N;;;;; +1B0AC;HENTAIGANA LETTER HI-4;Lo;0;L;;;;;N;;;;; +1B0AD;HENTAIGANA LETTER HI-5;Lo;0;L;;;;;N;;;;; +1B0AE;HENTAIGANA LETTER HI-6;Lo;0;L;;;;;N;;;;; +1B0AF;HENTAIGANA LETTER HI-7;Lo;0;L;;;;;N;;;;; +1B0B0;HENTAIGANA LETTER HU-1;Lo;0;L;;;;;N;;;;; +1B0B1;HENTAIGANA LETTER HU-2;Lo;0;L;;;;;N;;;;; +1B0B2;HENTAIGANA LETTER HU-3;Lo;0;L;;;;;N;;;;; +1B0B3;HENTAIGANA LETTER HE-1;Lo;0;L;;;;;N;;;;; +1B0B4;HENTAIGANA LETTER HE-2;Lo;0;L;;;;;N;;;;; +1B0B5;HENTAIGANA LETTER HE-3;Lo;0;L;;;;;N;;;;; +1B0B6;HENTAIGANA LETTER HE-4;Lo;0;L;;;;;N;;;;; +1B0B7;HENTAIGANA LETTER HE-5;Lo;0;L;;;;;N;;;;; +1B0B8;HENTAIGANA LETTER HE-6;Lo;0;L;;;;;N;;;;; +1B0B9;HENTAIGANA LETTER HE-7;Lo;0;L;;;;;N;;;;; +1B0BA;HENTAIGANA LETTER HO-1;Lo;0;L;;;;;N;;;;; +1B0BB;HENTAIGANA LETTER HO-2;Lo;0;L;;;;;N;;;;; +1B0BC;HENTAIGANA LETTER HO-3;Lo;0;L;;;;;N;;;;; +1B0BD;HENTAIGANA LETTER HO-4;Lo;0;L;;;;;N;;;;; +1B0BE;HENTAIGANA LETTER HO-5;Lo;0;L;;;;;N;;;;; +1B0BF;HENTAIGANA LETTER HO-6;Lo;0;L;;;;;N;;;;; +1B0C0;HENTAIGANA LETTER HO-7;Lo;0;L;;;;;N;;;;; +1B0C1;HENTAIGANA LETTER HO-8;Lo;0;L;;;;;N;;;;; +1B0C2;HENTAIGANA LETTER MA-1;Lo;0;L;;;;;N;;;;; +1B0C3;HENTAIGANA LETTER MA-2;Lo;0;L;;;;;N;;;;; +1B0C4;HENTAIGANA LETTER MA-3;Lo;0;L;;;;;N;;;;; +1B0C5;HENTAIGANA LETTER MA-4;Lo;0;L;;;;;N;;;;; +1B0C6;HENTAIGANA LETTER MA-5;Lo;0;L;;;;;N;;;;; +1B0C7;HENTAIGANA LETTER MA-6;Lo;0;L;;;;;N;;;;; +1B0C8;HENTAIGANA LETTER MA-7;Lo;0;L;;;;;N;;;;; +1B0C9;HENTAIGANA LETTER MI-1;Lo;0;L;;;;;N;;;;; +1B0CA;HENTAIGANA LETTER MI-2;Lo;0;L;;;;;N;;;;; +1B0CB;HENTAIGANA LETTER MI-3;Lo;0;L;;;;;N;;;;; +1B0CC;HENTAIGANA LETTER MI-4;Lo;0;L;;;;;N;;;;; +1B0CD;HENTAIGANA LETTER MI-5;Lo;0;L;;;;;N;;;;; +1B0CE;HENTAIGANA LETTER MI-6;Lo;0;L;;;;;N;;;;; +1B0CF;HENTAIGANA LETTER MI-7;Lo;0;L;;;;;N;;;;; +1B0D0;HENTAIGANA LETTER MU-1;Lo;0;L;;;;;N;;;;; +1B0D1;HENTAIGANA LETTER MU-2;Lo;0;L;;;;;N;;;;; +1B0D2;HENTAIGANA LETTER MU-3;Lo;0;L;;;;;N;;;;; +1B0D3;HENTAIGANA LETTER MU-4;Lo;0;L;;;;;N;;;;; +1B0D4;HENTAIGANA LETTER ME-1;Lo;0;L;;;;;N;;;;; +1B0D5;HENTAIGANA LETTER ME-2;Lo;0;L;;;;;N;;;;; +1B0D6;HENTAIGANA LETTER ME-MA;Lo;0;L;;;;;N;;;;; +1B0D7;HENTAIGANA LETTER MO-1;Lo;0;L;;;;;N;;;;; +1B0D8;HENTAIGANA LETTER MO-2;Lo;0;L;;;;;N;;;;; +1B0D9;HENTAIGANA LETTER MO-3;Lo;0;L;;;;;N;;;;; +1B0DA;HENTAIGANA LETTER MO-4;Lo;0;L;;;;;N;;;;; +1B0DB;HENTAIGANA LETTER MO-5;Lo;0;L;;;;;N;;;;; +1B0DC;HENTAIGANA LETTER MO-6;Lo;0;L;;;;;N;;;;; +1B0DD;HENTAIGANA LETTER YA-1;Lo;0;L;;;;;N;;;;; +1B0DE;HENTAIGANA LETTER YA-2;Lo;0;L;;;;;N;;;;; +1B0DF;HENTAIGANA LETTER YA-3;Lo;0;L;;;;;N;;;;; +1B0E0;HENTAIGANA LETTER YA-4;Lo;0;L;;;;;N;;;;; +1B0E1;HENTAIGANA LETTER YA-5;Lo;0;L;;;;;N;;;;; +1B0E2;HENTAIGANA LETTER YA-YO;Lo;0;L;;;;;N;;;;; +1B0E3;HENTAIGANA LETTER YU-1;Lo;0;L;;;;;N;;;;; +1B0E4;HENTAIGANA LETTER YU-2;Lo;0;L;;;;;N;;;;; +1B0E5;HENTAIGANA LETTER YU-3;Lo;0;L;;;;;N;;;;; +1B0E6;HENTAIGANA LETTER YU-4;Lo;0;L;;;;;N;;;;; +1B0E7;HENTAIGANA LETTER YO-1;Lo;0;L;;;;;N;;;;; +1B0E8;HENTAIGANA LETTER YO-2;Lo;0;L;;;;;N;;;;; +1B0E9;HENTAIGANA LETTER YO-3;Lo;0;L;;;;;N;;;;; +1B0EA;HENTAIGANA LETTER YO-4;Lo;0;L;;;;;N;;;;; +1B0EB;HENTAIGANA LETTER YO-5;Lo;0;L;;;;;N;;;;; +1B0EC;HENTAIGANA LETTER YO-6;Lo;0;L;;;;;N;;;;; +1B0ED;HENTAIGANA LETTER RA-1;Lo;0;L;;;;;N;;;;; +1B0EE;HENTAIGANA LETTER RA-2;Lo;0;L;;;;;N;;;;; +1B0EF;HENTAIGANA LETTER RA-3;Lo;0;L;;;;;N;;;;; +1B0F0;HENTAIGANA LETTER RA-4;Lo;0;L;;;;;N;;;;; +1B0F1;HENTAIGANA LETTER RI-1;Lo;0;L;;;;;N;;;;; +1B0F2;HENTAIGANA LETTER RI-2;Lo;0;L;;;;;N;;;;; +1B0F3;HENTAIGANA LETTER RI-3;Lo;0;L;;;;;N;;;;; +1B0F4;HENTAIGANA LETTER RI-4;Lo;0;L;;;;;N;;;;; +1B0F5;HENTAIGANA LETTER RI-5;Lo;0;L;;;;;N;;;;; +1B0F6;HENTAIGANA LETTER RI-6;Lo;0;L;;;;;N;;;;; +1B0F7;HENTAIGANA LETTER RI-7;Lo;0;L;;;;;N;;;;; +1B0F8;HENTAIGANA LETTER RU-1;Lo;0;L;;;;;N;;;;; +1B0F9;HENTAIGANA LETTER RU-2;Lo;0;L;;;;;N;;;;; +1B0FA;HENTAIGANA LETTER RU-3;Lo;0;L;;;;;N;;;;; +1B0FB;HENTAIGANA LETTER RU-4;Lo;0;L;;;;;N;;;;; +1B0FC;HENTAIGANA LETTER RU-5;Lo;0;L;;;;;N;;;;; +1B0FD;HENTAIGANA LETTER RU-6;Lo;0;L;;;;;N;;;;; +1B0FE;HENTAIGANA LETTER RE-1;Lo;0;L;;;;;N;;;;; +1B0FF;HENTAIGANA LETTER RE-2;Lo;0;L;;;;;N;;;;; +1B100;HENTAIGANA LETTER RE-3;Lo;0;L;;;;;N;;;;; +1B101;HENTAIGANA LETTER RE-4;Lo;0;L;;;;;N;;;;; +1B102;HENTAIGANA LETTER RO-1;Lo;0;L;;;;;N;;;;; +1B103;HENTAIGANA LETTER RO-2;Lo;0;L;;;;;N;;;;; +1B104;HENTAIGANA LETTER RO-3;Lo;0;L;;;;;N;;;;; +1B105;HENTAIGANA LETTER RO-4;Lo;0;L;;;;;N;;;;; +1B106;HENTAIGANA LETTER RO-5;Lo;0;L;;;;;N;;;;; +1B107;HENTAIGANA LETTER RO-6;Lo;0;L;;;;;N;;;;; +1B108;HENTAIGANA LETTER WA-1;Lo;0;L;;;;;N;;;;; +1B109;HENTAIGANA LETTER WA-2;Lo;0;L;;;;;N;;;;; +1B10A;HENTAIGANA LETTER WA-3;Lo;0;L;;;;;N;;;;; +1B10B;HENTAIGANA LETTER WA-4;Lo;0;L;;;;;N;;;;; +1B10C;HENTAIGANA LETTER WA-5;Lo;0;L;;;;;N;;;;; +1B10D;HENTAIGANA LETTER WI-1;Lo;0;L;;;;;N;;;;; +1B10E;HENTAIGANA LETTER WI-2;Lo;0;L;;;;;N;;;;; +1B10F;HENTAIGANA LETTER WI-3;Lo;0;L;;;;;N;;;;; +1B110;HENTAIGANA LETTER WI-4;Lo;0;L;;;;;N;;;;; +1B111;HENTAIGANA LETTER WI-5;Lo;0;L;;;;;N;;;;; +1B112;HENTAIGANA LETTER WE-1;Lo;0;L;;;;;N;;;;; +1B113;HENTAIGANA LETTER WE-2;Lo;0;L;;;;;N;;;;; +1B114;HENTAIGANA LETTER WE-3;Lo;0;L;;;;;N;;;;; +1B115;HENTAIGANA LETTER WE-4;Lo;0;L;;;;;N;;;;; +1B116;HENTAIGANA LETTER WO-1;Lo;0;L;;;;;N;;;;; +1B117;HENTAIGANA LETTER WO-2;Lo;0;L;;;;;N;;;;; +1B118;HENTAIGANA LETTER WO-3;Lo;0;L;;;;;N;;;;; +1B119;HENTAIGANA LETTER WO-4;Lo;0;L;;;;;N;;;;; +1B11A;HENTAIGANA LETTER WO-5;Lo;0;L;;;;;N;;;;; +1B11B;HENTAIGANA LETTER WO-6;Lo;0;L;;;;;N;;;;; +1B11C;HENTAIGANA LETTER WO-7;Lo;0;L;;;;;N;;;;; +1B11D;HENTAIGANA LETTER N-MU-MO-1;Lo;0;L;;;;;N;;;;; +1B11E;HENTAIGANA LETTER N-MU-MO-2;Lo;0;L;;;;;N;;;;; +1B11F;HIRAGANA LETTER ARCHAIC WU;Lo;0;L;;;;;N;;;;; +1B120;KATAKANA LETTER ARCHAIC YI;Lo;0;L;;;;;N;;;;; +1B121;KATAKANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; +1B122;KATAKANA LETTER ARCHAIC WU;Lo;0;L;;;;;N;;;;; +1B132;HIRAGANA LETTER SMALL KO;Lo;0;L;;;;;N;;;;; +1B150;HIRAGANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;; +1B151;HIRAGANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;; +1B152;HIRAGANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;; +1B155;KATAKANA LETTER SMALL KO;Lo;0;L;;;;;N;;;;; +1B164;KATAKANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;; +1B165;KATAKANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;; +1B166;KATAKANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;; +1B167;KATAKANA LETTER SMALL N;Lo;0;L;;;;;N;;;;; +1B170;NUSHU CHARACTER-1B170;Lo;0;L;;;;;N;;;;; +1B171;NUSHU CHARACTER-1B171;Lo;0;L;;;;;N;;;;; +1B172;NUSHU CHARACTER-1B172;Lo;0;L;;;;;N;;;;; +1B173;NUSHU CHARACTER-1B173;Lo;0;L;;;;;N;;;;; +1B174;NUSHU CHARACTER-1B174;Lo;0;L;;;;;N;;;;; +1B175;NUSHU CHARACTER-1B175;Lo;0;L;;;;;N;;;;; +1B176;NUSHU CHARACTER-1B176;Lo;0;L;;;;;N;;;;; +1B177;NUSHU CHARACTER-1B177;Lo;0;L;;;;;N;;;;; +1B178;NUSHU CHARACTER-1B178;Lo;0;L;;;;;N;;;;; +1B179;NUSHU CHARACTER-1B179;Lo;0;L;;;;;N;;;;; +1B17A;NUSHU CHARACTER-1B17A;Lo;0;L;;;;;N;;;;; +1B17B;NUSHU CHARACTER-1B17B;Lo;0;L;;;;;N;;;;; +1B17C;NUSHU CHARACTER-1B17C;Lo;0;L;;;;;N;;;;; +1B17D;NUSHU CHARACTER-1B17D;Lo;0;L;;;;;N;;;;; +1B17E;NUSHU CHARACTER-1B17E;Lo;0;L;;;;;N;;;;; +1B17F;NUSHU CHARACTER-1B17F;Lo;0;L;;;;;N;;;;; +1B180;NUSHU CHARACTER-1B180;Lo;0;L;;;;;N;;;;; +1B181;NUSHU CHARACTER-1B181;Lo;0;L;;;;;N;;;;; +1B182;NUSHU CHARACTER-1B182;Lo;0;L;;;;;N;;;;; +1B183;NUSHU CHARACTER-1B183;Lo;0;L;;;;;N;;;;; +1B184;NUSHU CHARACTER-1B184;Lo;0;L;;;;;N;;;;; +1B185;NUSHU CHARACTER-1B185;Lo;0;L;;;;;N;;;;; +1B186;NUSHU CHARACTER-1B186;Lo;0;L;;;;;N;;;;; +1B187;NUSHU CHARACTER-1B187;Lo;0;L;;;;;N;;;;; +1B188;NUSHU CHARACTER-1B188;Lo;0;L;;;;;N;;;;; +1B189;NUSHU CHARACTER-1B189;Lo;0;L;;;;;N;;;;; +1B18A;NUSHU CHARACTER-1B18A;Lo;0;L;;;;;N;;;;; +1B18B;NUSHU CHARACTER-1B18B;Lo;0;L;;;;;N;;;;; +1B18C;NUSHU CHARACTER-1B18C;Lo;0;L;;;;;N;;;;; +1B18D;NUSHU CHARACTER-1B18D;Lo;0;L;;;;;N;;;;; +1B18E;NUSHU CHARACTER-1B18E;Lo;0;L;;;;;N;;;;; +1B18F;NUSHU CHARACTER-1B18F;Lo;0;L;;;;;N;;;;; +1B190;NUSHU CHARACTER-1B190;Lo;0;L;;;;;N;;;;; +1B191;NUSHU CHARACTER-1B191;Lo;0;L;;;;;N;;;;; +1B192;NUSHU CHARACTER-1B192;Lo;0;L;;;;;N;;;;; +1B193;NUSHU CHARACTER-1B193;Lo;0;L;;;;;N;;;;; +1B194;NUSHU CHARACTER-1B194;Lo;0;L;;;;;N;;;;; +1B195;NUSHU CHARACTER-1B195;Lo;0;L;;;;;N;;;;; +1B196;NUSHU CHARACTER-1B196;Lo;0;L;;;;;N;;;;; +1B197;NUSHU CHARACTER-1B197;Lo;0;L;;;;;N;;;;; +1B198;NUSHU CHARACTER-1B198;Lo;0;L;;;;;N;;;;; +1B199;NUSHU CHARACTER-1B199;Lo;0;L;;;;;N;;;;; +1B19A;NUSHU CHARACTER-1B19A;Lo;0;L;;;;;N;;;;; +1B19B;NUSHU CHARACTER-1B19B;Lo;0;L;;;;;N;;;;; +1B19C;NUSHU CHARACTER-1B19C;Lo;0;L;;;;;N;;;;; +1B19D;NUSHU CHARACTER-1B19D;Lo;0;L;;;;;N;;;;; +1B19E;NUSHU CHARACTER-1B19E;Lo;0;L;;;;;N;;;;; +1B19F;NUSHU CHARACTER-1B19F;Lo;0;L;;;;;N;;;;; +1B1A0;NUSHU CHARACTER-1B1A0;Lo;0;L;;;;;N;;;;; +1B1A1;NUSHU CHARACTER-1B1A1;Lo;0;L;;;;;N;;;;; +1B1A2;NUSHU CHARACTER-1B1A2;Lo;0;L;;;;;N;;;;; +1B1A3;NUSHU CHARACTER-1B1A3;Lo;0;L;;;;;N;;;;; +1B1A4;NUSHU CHARACTER-1B1A4;Lo;0;L;;;;;N;;;;; +1B1A5;NUSHU CHARACTER-1B1A5;Lo;0;L;;;;;N;;;;; +1B1A6;NUSHU CHARACTER-1B1A6;Lo;0;L;;;;;N;;;;; +1B1A7;NUSHU CHARACTER-1B1A7;Lo;0;L;;;;;N;;;;; +1B1A8;NUSHU CHARACTER-1B1A8;Lo;0;L;;;;;N;;;;; +1B1A9;NUSHU CHARACTER-1B1A9;Lo;0;L;;;;;N;;;;; +1B1AA;NUSHU CHARACTER-1B1AA;Lo;0;L;;;;;N;;;;; +1B1AB;NUSHU CHARACTER-1B1AB;Lo;0;L;;;;;N;;;;; +1B1AC;NUSHU CHARACTER-1B1AC;Lo;0;L;;;;;N;;;;; +1B1AD;NUSHU CHARACTER-1B1AD;Lo;0;L;;;;;N;;;;; +1B1AE;NUSHU CHARACTER-1B1AE;Lo;0;L;;;;;N;;;;; +1B1AF;NUSHU CHARACTER-1B1AF;Lo;0;L;;;;;N;;;;; +1B1B0;NUSHU CHARACTER-1B1B0;Lo;0;L;;;;;N;;;;; +1B1B1;NUSHU CHARACTER-1B1B1;Lo;0;L;;;;;N;;;;; +1B1B2;NUSHU CHARACTER-1B1B2;Lo;0;L;;;;;N;;;;; +1B1B3;NUSHU CHARACTER-1B1B3;Lo;0;L;;;;;N;;;;; +1B1B4;NUSHU CHARACTER-1B1B4;Lo;0;L;;;;;N;;;;; +1B1B5;NUSHU CHARACTER-1B1B5;Lo;0;L;;;;;N;;;;; +1B1B6;NUSHU CHARACTER-1B1B6;Lo;0;L;;;;;N;;;;; +1B1B7;NUSHU CHARACTER-1B1B7;Lo;0;L;;;;;N;;;;; +1B1B8;NUSHU CHARACTER-1B1B8;Lo;0;L;;;;;N;;;;; +1B1B9;NUSHU CHARACTER-1B1B9;Lo;0;L;;;;;N;;;;; +1B1BA;NUSHU CHARACTER-1B1BA;Lo;0;L;;;;;N;;;;; +1B1BB;NUSHU CHARACTER-1B1BB;Lo;0;L;;;;;N;;;;; +1B1BC;NUSHU CHARACTER-1B1BC;Lo;0;L;;;;;N;;;;; +1B1BD;NUSHU CHARACTER-1B1BD;Lo;0;L;;;;;N;;;;; +1B1BE;NUSHU CHARACTER-1B1BE;Lo;0;L;;;;;N;;;;; +1B1BF;NUSHU CHARACTER-1B1BF;Lo;0;L;;;;;N;;;;; +1B1C0;NUSHU CHARACTER-1B1C0;Lo;0;L;;;;;N;;;;; +1B1C1;NUSHU CHARACTER-1B1C1;Lo;0;L;;;;;N;;;;; +1B1C2;NUSHU CHARACTER-1B1C2;Lo;0;L;;;;;N;;;;; +1B1C3;NUSHU CHARACTER-1B1C3;Lo;0;L;;;;;N;;;;; +1B1C4;NUSHU CHARACTER-1B1C4;Lo;0;L;;;;;N;;;;; +1B1C5;NUSHU CHARACTER-1B1C5;Lo;0;L;;;;;N;;;;; +1B1C6;NUSHU CHARACTER-1B1C6;Lo;0;L;;;;;N;;;;; +1B1C7;NUSHU CHARACTER-1B1C7;Lo;0;L;;;;;N;;;;; +1B1C8;NUSHU CHARACTER-1B1C8;Lo;0;L;;;;;N;;;;; +1B1C9;NUSHU CHARACTER-1B1C9;Lo;0;L;;;;;N;;;;; +1B1CA;NUSHU CHARACTER-1B1CA;Lo;0;L;;;;;N;;;;; +1B1CB;NUSHU CHARACTER-1B1CB;Lo;0;L;;;;;N;;;;; +1B1CC;NUSHU CHARACTER-1B1CC;Lo;0;L;;;;;N;;;;; +1B1CD;NUSHU CHARACTER-1B1CD;Lo;0;L;;;;;N;;;;; +1B1CE;NUSHU CHARACTER-1B1CE;Lo;0;L;;;;;N;;;;; +1B1CF;NUSHU CHARACTER-1B1CF;Lo;0;L;;;;;N;;;;; +1B1D0;NUSHU CHARACTER-1B1D0;Lo;0;L;;;;;N;;;;; +1B1D1;NUSHU CHARACTER-1B1D1;Lo;0;L;;;;;N;;;;; +1B1D2;NUSHU CHARACTER-1B1D2;Lo;0;L;;;;;N;;;;; +1B1D3;NUSHU CHARACTER-1B1D3;Lo;0;L;;;;;N;;;;; +1B1D4;NUSHU CHARACTER-1B1D4;Lo;0;L;;;;;N;;;;; +1B1D5;NUSHU CHARACTER-1B1D5;Lo;0;L;;;;;N;;;;; +1B1D6;NUSHU CHARACTER-1B1D6;Lo;0;L;;;;;N;;;;; +1B1D7;NUSHU CHARACTER-1B1D7;Lo;0;L;;;;;N;;;;; +1B1D8;NUSHU CHARACTER-1B1D8;Lo;0;L;;;;;N;;;;; +1B1D9;NUSHU CHARACTER-1B1D9;Lo;0;L;;;;;N;;;;; +1B1DA;NUSHU CHARACTER-1B1DA;Lo;0;L;;;;;N;;;;; +1B1DB;NUSHU CHARACTER-1B1DB;Lo;0;L;;;;;N;;;;; +1B1DC;NUSHU CHARACTER-1B1DC;Lo;0;L;;;;;N;;;;; +1B1DD;NUSHU CHARACTER-1B1DD;Lo;0;L;;;;;N;;;;; +1B1DE;NUSHU CHARACTER-1B1DE;Lo;0;L;;;;;N;;;;; +1B1DF;NUSHU CHARACTER-1B1DF;Lo;0;L;;;;;N;;;;; +1B1E0;NUSHU CHARACTER-1B1E0;Lo;0;L;;;;;N;;;;; +1B1E1;NUSHU CHARACTER-1B1E1;Lo;0;L;;;;;N;;;;; +1B1E2;NUSHU CHARACTER-1B1E2;Lo;0;L;;;;;N;;;;; +1B1E3;NUSHU CHARACTER-1B1E3;Lo;0;L;;;;;N;;;;; +1B1E4;NUSHU CHARACTER-1B1E4;Lo;0;L;;;;;N;;;;; +1B1E5;NUSHU CHARACTER-1B1E5;Lo;0;L;;;;;N;;;;; +1B1E6;NUSHU CHARACTER-1B1E6;Lo;0;L;;;;;N;;;;; +1B1E7;NUSHU CHARACTER-1B1E7;Lo;0;L;;;;;N;;;;; +1B1E8;NUSHU CHARACTER-1B1E8;Lo;0;L;;;;;N;;;;; +1B1E9;NUSHU CHARACTER-1B1E9;Lo;0;L;;;;;N;;;;; +1B1EA;NUSHU CHARACTER-1B1EA;Lo;0;L;;;;;N;;;;; +1B1EB;NUSHU CHARACTER-1B1EB;Lo;0;L;;;;;N;;;;; +1B1EC;NUSHU CHARACTER-1B1EC;Lo;0;L;;;;;N;;;;; +1B1ED;NUSHU CHARACTER-1B1ED;Lo;0;L;;;;;N;;;;; +1B1EE;NUSHU CHARACTER-1B1EE;Lo;0;L;;;;;N;;;;; +1B1EF;NUSHU CHARACTER-1B1EF;Lo;0;L;;;;;N;;;;; +1B1F0;NUSHU CHARACTER-1B1F0;Lo;0;L;;;;;N;;;;; +1B1F1;NUSHU CHARACTER-1B1F1;Lo;0;L;;;;;N;;;;; +1B1F2;NUSHU CHARACTER-1B1F2;Lo;0;L;;;;;N;;;;; +1B1F3;NUSHU CHARACTER-1B1F3;Lo;0;L;;;;;N;;;;; +1B1F4;NUSHU CHARACTER-1B1F4;Lo;0;L;;;;;N;;;;; +1B1F5;NUSHU CHARACTER-1B1F5;Lo;0;L;;;;;N;;;;; +1B1F6;NUSHU CHARACTER-1B1F6;Lo;0;L;;;;;N;;;;; +1B1F7;NUSHU CHARACTER-1B1F7;Lo;0;L;;;;;N;;;;; +1B1F8;NUSHU CHARACTER-1B1F8;Lo;0;L;;;;;N;;;;; +1B1F9;NUSHU CHARACTER-1B1F9;Lo;0;L;;;;;N;;;;; +1B1FA;NUSHU CHARACTER-1B1FA;Lo;0;L;;;;;N;;;;; +1B1FB;NUSHU CHARACTER-1B1FB;Lo;0;L;;;;;N;;;;; +1B1FC;NUSHU CHARACTER-1B1FC;Lo;0;L;;;;;N;;;;; +1B1FD;NUSHU CHARACTER-1B1FD;Lo;0;L;;;;;N;;;;; +1B1FE;NUSHU CHARACTER-1B1FE;Lo;0;L;;;;;N;;;;; +1B1FF;NUSHU CHARACTER-1B1FF;Lo;0;L;;;;;N;;;;; +1B200;NUSHU CHARACTER-1B200;Lo;0;L;;;;;N;;;;; +1B201;NUSHU CHARACTER-1B201;Lo;0;L;;;;;N;;;;; +1B202;NUSHU CHARACTER-1B202;Lo;0;L;;;;;N;;;;; +1B203;NUSHU CHARACTER-1B203;Lo;0;L;;;;;N;;;;; +1B204;NUSHU CHARACTER-1B204;Lo;0;L;;;;;N;;;;; +1B205;NUSHU CHARACTER-1B205;Lo;0;L;;;;;N;;;;; +1B206;NUSHU CHARACTER-1B206;Lo;0;L;;;;;N;;;;; +1B207;NUSHU CHARACTER-1B207;Lo;0;L;;;;;N;;;;; +1B208;NUSHU CHARACTER-1B208;Lo;0;L;;;;;N;;;;; +1B209;NUSHU CHARACTER-1B209;Lo;0;L;;;;;N;;;;; +1B20A;NUSHU CHARACTER-1B20A;Lo;0;L;;;;;N;;;;; +1B20B;NUSHU CHARACTER-1B20B;Lo;0;L;;;;;N;;;;; +1B20C;NUSHU CHARACTER-1B20C;Lo;0;L;;;;;N;;;;; +1B20D;NUSHU CHARACTER-1B20D;Lo;0;L;;;;;N;;;;; +1B20E;NUSHU CHARACTER-1B20E;Lo;0;L;;;;;N;;;;; +1B20F;NUSHU CHARACTER-1B20F;Lo;0;L;;;;;N;;;;; +1B210;NUSHU CHARACTER-1B210;Lo;0;L;;;;;N;;;;; +1B211;NUSHU CHARACTER-1B211;Lo;0;L;;;;;N;;;;; +1B212;NUSHU CHARACTER-1B212;Lo;0;L;;;;;N;;;;; +1B213;NUSHU CHARACTER-1B213;Lo;0;L;;;;;N;;;;; +1B214;NUSHU CHARACTER-1B214;Lo;0;L;;;;;N;;;;; +1B215;NUSHU CHARACTER-1B215;Lo;0;L;;;;;N;;;;; +1B216;NUSHU CHARACTER-1B216;Lo;0;L;;;;;N;;;;; +1B217;NUSHU CHARACTER-1B217;Lo;0;L;;;;;N;;;;; +1B218;NUSHU CHARACTER-1B218;Lo;0;L;;;;;N;;;;; +1B219;NUSHU CHARACTER-1B219;Lo;0;L;;;;;N;;;;; +1B21A;NUSHU CHARACTER-1B21A;Lo;0;L;;;;;N;;;;; +1B21B;NUSHU CHARACTER-1B21B;Lo;0;L;;;;;N;;;;; +1B21C;NUSHU CHARACTER-1B21C;Lo;0;L;;;;;N;;;;; +1B21D;NUSHU CHARACTER-1B21D;Lo;0;L;;;;;N;;;;; +1B21E;NUSHU CHARACTER-1B21E;Lo;0;L;;;;;N;;;;; +1B21F;NUSHU CHARACTER-1B21F;Lo;0;L;;;;;N;;;;; +1B220;NUSHU CHARACTER-1B220;Lo;0;L;;;;;N;;;;; +1B221;NUSHU CHARACTER-1B221;Lo;0;L;;;;;N;;;;; +1B222;NUSHU CHARACTER-1B222;Lo;0;L;;;;;N;;;;; +1B223;NUSHU CHARACTER-1B223;Lo;0;L;;;;;N;;;;; +1B224;NUSHU CHARACTER-1B224;Lo;0;L;;;;;N;;;;; +1B225;NUSHU CHARACTER-1B225;Lo;0;L;;;;;N;;;;; +1B226;NUSHU CHARACTER-1B226;Lo;0;L;;;;;N;;;;; +1B227;NUSHU CHARACTER-1B227;Lo;0;L;;;;;N;;;;; +1B228;NUSHU CHARACTER-1B228;Lo;0;L;;;;;N;;;;; +1B229;NUSHU CHARACTER-1B229;Lo;0;L;;;;;N;;;;; +1B22A;NUSHU CHARACTER-1B22A;Lo;0;L;;;;;N;;;;; +1B22B;NUSHU CHARACTER-1B22B;Lo;0;L;;;;;N;;;;; +1B22C;NUSHU CHARACTER-1B22C;Lo;0;L;;;;;N;;;;; +1B22D;NUSHU CHARACTER-1B22D;Lo;0;L;;;;;N;;;;; +1B22E;NUSHU CHARACTER-1B22E;Lo;0;L;;;;;N;;;;; +1B22F;NUSHU CHARACTER-1B22F;Lo;0;L;;;;;N;;;;; +1B230;NUSHU CHARACTER-1B230;Lo;0;L;;;;;N;;;;; +1B231;NUSHU CHARACTER-1B231;Lo;0;L;;;;;N;;;;; +1B232;NUSHU CHARACTER-1B232;Lo;0;L;;;;;N;;;;; +1B233;NUSHU CHARACTER-1B233;Lo;0;L;;;;;N;;;;; +1B234;NUSHU CHARACTER-1B234;Lo;0;L;;;;;N;;;;; +1B235;NUSHU CHARACTER-1B235;Lo;0;L;;;;;N;;;;; +1B236;NUSHU CHARACTER-1B236;Lo;0;L;;;;;N;;;;; +1B237;NUSHU CHARACTER-1B237;Lo;0;L;;;;;N;;;;; +1B238;NUSHU CHARACTER-1B238;Lo;0;L;;;;;N;;;;; +1B239;NUSHU CHARACTER-1B239;Lo;0;L;;;;;N;;;;; +1B23A;NUSHU CHARACTER-1B23A;Lo;0;L;;;;;N;;;;; +1B23B;NUSHU CHARACTER-1B23B;Lo;0;L;;;;;N;;;;; +1B23C;NUSHU CHARACTER-1B23C;Lo;0;L;;;;;N;;;;; +1B23D;NUSHU CHARACTER-1B23D;Lo;0;L;;;;;N;;;;; +1B23E;NUSHU CHARACTER-1B23E;Lo;0;L;;;;;N;;;;; +1B23F;NUSHU CHARACTER-1B23F;Lo;0;L;;;;;N;;;;; +1B240;NUSHU CHARACTER-1B240;Lo;0;L;;;;;N;;;;; +1B241;NUSHU CHARACTER-1B241;Lo;0;L;;;;;N;;;;; +1B242;NUSHU CHARACTER-1B242;Lo;0;L;;;;;N;;;;; +1B243;NUSHU CHARACTER-1B243;Lo;0;L;;;;;N;;;;; +1B244;NUSHU CHARACTER-1B244;Lo;0;L;;;;;N;;;;; +1B245;NUSHU CHARACTER-1B245;Lo;0;L;;;;;N;;;;; +1B246;NUSHU CHARACTER-1B246;Lo;0;L;;;;;N;;;;; +1B247;NUSHU CHARACTER-1B247;Lo;0;L;;;;;N;;;;; +1B248;NUSHU CHARACTER-1B248;Lo;0;L;;;;;N;;;;; +1B249;NUSHU CHARACTER-1B249;Lo;0;L;;;;;N;;;;; +1B24A;NUSHU CHARACTER-1B24A;Lo;0;L;;;;;N;;;;; +1B24B;NUSHU CHARACTER-1B24B;Lo;0;L;;;;;N;;;;; +1B24C;NUSHU CHARACTER-1B24C;Lo;0;L;;;;;N;;;;; +1B24D;NUSHU CHARACTER-1B24D;Lo;0;L;;;;;N;;;;; +1B24E;NUSHU CHARACTER-1B24E;Lo;0;L;;;;;N;;;;; +1B24F;NUSHU CHARACTER-1B24F;Lo;0;L;;;;;N;;;;; +1B250;NUSHU CHARACTER-1B250;Lo;0;L;;;;;N;;;;; +1B251;NUSHU CHARACTER-1B251;Lo;0;L;;;;;N;;;;; +1B252;NUSHU CHARACTER-1B252;Lo;0;L;;;;;N;;;;; +1B253;NUSHU CHARACTER-1B253;Lo;0;L;;;;;N;;;;; +1B254;NUSHU CHARACTER-1B254;Lo;0;L;;;;;N;;;;; +1B255;NUSHU CHARACTER-1B255;Lo;0;L;;;;;N;;;;; +1B256;NUSHU CHARACTER-1B256;Lo;0;L;;;;;N;;;;; +1B257;NUSHU CHARACTER-1B257;Lo;0;L;;;;;N;;;;; +1B258;NUSHU CHARACTER-1B258;Lo;0;L;;;;;N;;;;; +1B259;NUSHU CHARACTER-1B259;Lo;0;L;;;;;N;;;;; +1B25A;NUSHU CHARACTER-1B25A;Lo;0;L;;;;;N;;;;; +1B25B;NUSHU CHARACTER-1B25B;Lo;0;L;;;;;N;;;;; +1B25C;NUSHU CHARACTER-1B25C;Lo;0;L;;;;;N;;;;; +1B25D;NUSHU CHARACTER-1B25D;Lo;0;L;;;;;N;;;;; +1B25E;NUSHU CHARACTER-1B25E;Lo;0;L;;;;;N;;;;; +1B25F;NUSHU CHARACTER-1B25F;Lo;0;L;;;;;N;;;;; +1B260;NUSHU CHARACTER-1B260;Lo;0;L;;;;;N;;;;; +1B261;NUSHU CHARACTER-1B261;Lo;0;L;;;;;N;;;;; +1B262;NUSHU CHARACTER-1B262;Lo;0;L;;;;;N;;;;; +1B263;NUSHU CHARACTER-1B263;Lo;0;L;;;;;N;;;;; +1B264;NUSHU CHARACTER-1B264;Lo;0;L;;;;;N;;;;; +1B265;NUSHU CHARACTER-1B265;Lo;0;L;;;;;N;;;;; +1B266;NUSHU CHARACTER-1B266;Lo;0;L;;;;;N;;;;; +1B267;NUSHU CHARACTER-1B267;Lo;0;L;;;;;N;;;;; +1B268;NUSHU CHARACTER-1B268;Lo;0;L;;;;;N;;;;; +1B269;NUSHU CHARACTER-1B269;Lo;0;L;;;;;N;;;;; +1B26A;NUSHU CHARACTER-1B26A;Lo;0;L;;;;;N;;;;; +1B26B;NUSHU CHARACTER-1B26B;Lo;0;L;;;;;N;;;;; +1B26C;NUSHU CHARACTER-1B26C;Lo;0;L;;;;;N;;;;; +1B26D;NUSHU CHARACTER-1B26D;Lo;0;L;;;;;N;;;;; +1B26E;NUSHU CHARACTER-1B26E;Lo;0;L;;;;;N;;;;; +1B26F;NUSHU CHARACTER-1B26F;Lo;0;L;;;;;N;;;;; +1B270;NUSHU CHARACTER-1B270;Lo;0;L;;;;;N;;;;; +1B271;NUSHU CHARACTER-1B271;Lo;0;L;;;;;N;;;;; +1B272;NUSHU CHARACTER-1B272;Lo;0;L;;;;;N;;;;; +1B273;NUSHU CHARACTER-1B273;Lo;0;L;;;;;N;;;;; +1B274;NUSHU CHARACTER-1B274;Lo;0;L;;;;;N;;;;; +1B275;NUSHU CHARACTER-1B275;Lo;0;L;;;;;N;;;;; +1B276;NUSHU CHARACTER-1B276;Lo;0;L;;;;;N;;;;; +1B277;NUSHU CHARACTER-1B277;Lo;0;L;;;;;N;;;;; +1B278;NUSHU CHARACTER-1B278;Lo;0;L;;;;;N;;;;; +1B279;NUSHU CHARACTER-1B279;Lo;0;L;;;;;N;;;;; +1B27A;NUSHU CHARACTER-1B27A;Lo;0;L;;;;;N;;;;; +1B27B;NUSHU CHARACTER-1B27B;Lo;0;L;;;;;N;;;;; +1B27C;NUSHU CHARACTER-1B27C;Lo;0;L;;;;;N;;;;; +1B27D;NUSHU CHARACTER-1B27D;Lo;0;L;;;;;N;;;;; +1B27E;NUSHU CHARACTER-1B27E;Lo;0;L;;;;;N;;;;; +1B27F;NUSHU CHARACTER-1B27F;Lo;0;L;;;;;N;;;;; +1B280;NUSHU CHARACTER-1B280;Lo;0;L;;;;;N;;;;; +1B281;NUSHU CHARACTER-1B281;Lo;0;L;;;;;N;;;;; +1B282;NUSHU CHARACTER-1B282;Lo;0;L;;;;;N;;;;; +1B283;NUSHU CHARACTER-1B283;Lo;0;L;;;;;N;;;;; +1B284;NUSHU CHARACTER-1B284;Lo;0;L;;;;;N;;;;; +1B285;NUSHU CHARACTER-1B285;Lo;0;L;;;;;N;;;;; +1B286;NUSHU CHARACTER-1B286;Lo;0;L;;;;;N;;;;; +1B287;NUSHU CHARACTER-1B287;Lo;0;L;;;;;N;;;;; +1B288;NUSHU CHARACTER-1B288;Lo;0;L;;;;;N;;;;; +1B289;NUSHU CHARACTER-1B289;Lo;0;L;;;;;N;;;;; +1B28A;NUSHU CHARACTER-1B28A;Lo;0;L;;;;;N;;;;; +1B28B;NUSHU CHARACTER-1B28B;Lo;0;L;;;;;N;;;;; +1B28C;NUSHU CHARACTER-1B28C;Lo;0;L;;;;;N;;;;; +1B28D;NUSHU CHARACTER-1B28D;Lo;0;L;;;;;N;;;;; +1B28E;NUSHU CHARACTER-1B28E;Lo;0;L;;;;;N;;;;; +1B28F;NUSHU CHARACTER-1B28F;Lo;0;L;;;;;N;;;;; +1B290;NUSHU CHARACTER-1B290;Lo;0;L;;;;;N;;;;; +1B291;NUSHU CHARACTER-1B291;Lo;0;L;;;;;N;;;;; +1B292;NUSHU CHARACTER-1B292;Lo;0;L;;;;;N;;;;; +1B293;NUSHU CHARACTER-1B293;Lo;0;L;;;;;N;;;;; +1B294;NUSHU CHARACTER-1B294;Lo;0;L;;;;;N;;;;; +1B295;NUSHU CHARACTER-1B295;Lo;0;L;;;;;N;;;;; +1B296;NUSHU CHARACTER-1B296;Lo;0;L;;;;;N;;;;; +1B297;NUSHU CHARACTER-1B297;Lo;0;L;;;;;N;;;;; +1B298;NUSHU CHARACTER-1B298;Lo;0;L;;;;;N;;;;; +1B299;NUSHU CHARACTER-1B299;Lo;0;L;;;;;N;;;;; +1B29A;NUSHU CHARACTER-1B29A;Lo;0;L;;;;;N;;;;; +1B29B;NUSHU CHARACTER-1B29B;Lo;0;L;;;;;N;;;;; +1B29C;NUSHU CHARACTER-1B29C;Lo;0;L;;;;;N;;;;; +1B29D;NUSHU CHARACTER-1B29D;Lo;0;L;;;;;N;;;;; +1B29E;NUSHU CHARACTER-1B29E;Lo;0;L;;;;;N;;;;; +1B29F;NUSHU CHARACTER-1B29F;Lo;0;L;;;;;N;;;;; +1B2A0;NUSHU CHARACTER-1B2A0;Lo;0;L;;;;;N;;;;; +1B2A1;NUSHU CHARACTER-1B2A1;Lo;0;L;;;;;N;;;;; +1B2A2;NUSHU CHARACTER-1B2A2;Lo;0;L;;;;;N;;;;; +1B2A3;NUSHU CHARACTER-1B2A3;Lo;0;L;;;;;N;;;;; +1B2A4;NUSHU CHARACTER-1B2A4;Lo;0;L;;;;;N;;;;; +1B2A5;NUSHU CHARACTER-1B2A5;Lo;0;L;;;;;N;;;;; +1B2A6;NUSHU CHARACTER-1B2A6;Lo;0;L;;;;;N;;;;; +1B2A7;NUSHU CHARACTER-1B2A7;Lo;0;L;;;;;N;;;;; +1B2A8;NUSHU CHARACTER-1B2A8;Lo;0;L;;;;;N;;;;; +1B2A9;NUSHU CHARACTER-1B2A9;Lo;0;L;;;;;N;;;;; +1B2AA;NUSHU CHARACTER-1B2AA;Lo;0;L;;;;;N;;;;; +1B2AB;NUSHU CHARACTER-1B2AB;Lo;0;L;;;;;N;;;;; +1B2AC;NUSHU CHARACTER-1B2AC;Lo;0;L;;;;;N;;;;; +1B2AD;NUSHU CHARACTER-1B2AD;Lo;0;L;;;;;N;;;;; +1B2AE;NUSHU CHARACTER-1B2AE;Lo;0;L;;;;;N;;;;; +1B2AF;NUSHU CHARACTER-1B2AF;Lo;0;L;;;;;N;;;;; +1B2B0;NUSHU CHARACTER-1B2B0;Lo;0;L;;;;;N;;;;; +1B2B1;NUSHU CHARACTER-1B2B1;Lo;0;L;;;;;N;;;;; +1B2B2;NUSHU CHARACTER-1B2B2;Lo;0;L;;;;;N;;;;; +1B2B3;NUSHU CHARACTER-1B2B3;Lo;0;L;;;;;N;;;;; +1B2B4;NUSHU CHARACTER-1B2B4;Lo;0;L;;;;;N;;;;; +1B2B5;NUSHU CHARACTER-1B2B5;Lo;0;L;;;;;N;;;;; +1B2B6;NUSHU CHARACTER-1B2B6;Lo;0;L;;;;;N;;;;; +1B2B7;NUSHU CHARACTER-1B2B7;Lo;0;L;;;;;N;;;;; +1B2B8;NUSHU CHARACTER-1B2B8;Lo;0;L;;;;;N;;;;; +1B2B9;NUSHU CHARACTER-1B2B9;Lo;0;L;;;;;N;;;;; +1B2BA;NUSHU CHARACTER-1B2BA;Lo;0;L;;;;;N;;;;; +1B2BB;NUSHU CHARACTER-1B2BB;Lo;0;L;;;;;N;;;;; +1B2BC;NUSHU CHARACTER-1B2BC;Lo;0;L;;;;;N;;;;; +1B2BD;NUSHU CHARACTER-1B2BD;Lo;0;L;;;;;N;;;;; +1B2BE;NUSHU CHARACTER-1B2BE;Lo;0;L;;;;;N;;;;; +1B2BF;NUSHU CHARACTER-1B2BF;Lo;0;L;;;;;N;;;;; +1B2C0;NUSHU CHARACTER-1B2C0;Lo;0;L;;;;;N;;;;; +1B2C1;NUSHU CHARACTER-1B2C1;Lo;0;L;;;;;N;;;;; +1B2C2;NUSHU CHARACTER-1B2C2;Lo;0;L;;;;;N;;;;; +1B2C3;NUSHU CHARACTER-1B2C3;Lo;0;L;;;;;N;;;;; +1B2C4;NUSHU CHARACTER-1B2C4;Lo;0;L;;;;;N;;;;; +1B2C5;NUSHU CHARACTER-1B2C5;Lo;0;L;;;;;N;;;;; +1B2C6;NUSHU CHARACTER-1B2C6;Lo;0;L;;;;;N;;;;; +1B2C7;NUSHU CHARACTER-1B2C7;Lo;0;L;;;;;N;;;;; +1B2C8;NUSHU CHARACTER-1B2C8;Lo;0;L;;;;;N;;;;; +1B2C9;NUSHU CHARACTER-1B2C9;Lo;0;L;;;;;N;;;;; +1B2CA;NUSHU CHARACTER-1B2CA;Lo;0;L;;;;;N;;;;; +1B2CB;NUSHU CHARACTER-1B2CB;Lo;0;L;;;;;N;;;;; +1B2CC;NUSHU CHARACTER-1B2CC;Lo;0;L;;;;;N;;;;; +1B2CD;NUSHU CHARACTER-1B2CD;Lo;0;L;;;;;N;;;;; +1B2CE;NUSHU CHARACTER-1B2CE;Lo;0;L;;;;;N;;;;; +1B2CF;NUSHU CHARACTER-1B2CF;Lo;0;L;;;;;N;;;;; +1B2D0;NUSHU CHARACTER-1B2D0;Lo;0;L;;;;;N;;;;; +1B2D1;NUSHU CHARACTER-1B2D1;Lo;0;L;;;;;N;;;;; +1B2D2;NUSHU CHARACTER-1B2D2;Lo;0;L;;;;;N;;;;; +1B2D3;NUSHU CHARACTER-1B2D3;Lo;0;L;;;;;N;;;;; +1B2D4;NUSHU CHARACTER-1B2D4;Lo;0;L;;;;;N;;;;; +1B2D5;NUSHU CHARACTER-1B2D5;Lo;0;L;;;;;N;;;;; +1B2D6;NUSHU CHARACTER-1B2D6;Lo;0;L;;;;;N;;;;; +1B2D7;NUSHU CHARACTER-1B2D7;Lo;0;L;;;;;N;;;;; +1B2D8;NUSHU CHARACTER-1B2D8;Lo;0;L;;;;;N;;;;; +1B2D9;NUSHU CHARACTER-1B2D9;Lo;0;L;;;;;N;;;;; +1B2DA;NUSHU CHARACTER-1B2DA;Lo;0;L;;;;;N;;;;; +1B2DB;NUSHU CHARACTER-1B2DB;Lo;0;L;;;;;N;;;;; +1B2DC;NUSHU CHARACTER-1B2DC;Lo;0;L;;;;;N;;;;; +1B2DD;NUSHU CHARACTER-1B2DD;Lo;0;L;;;;;N;;;;; +1B2DE;NUSHU CHARACTER-1B2DE;Lo;0;L;;;;;N;;;;; +1B2DF;NUSHU CHARACTER-1B2DF;Lo;0;L;;;;;N;;;;; +1B2E0;NUSHU CHARACTER-1B2E0;Lo;0;L;;;;;N;;;;; +1B2E1;NUSHU CHARACTER-1B2E1;Lo;0;L;;;;;N;;;;; +1B2E2;NUSHU CHARACTER-1B2E2;Lo;0;L;;;;;N;;;;; +1B2E3;NUSHU CHARACTER-1B2E3;Lo;0;L;;;;;N;;;;; +1B2E4;NUSHU CHARACTER-1B2E4;Lo;0;L;;;;;N;;;;; +1B2E5;NUSHU CHARACTER-1B2E5;Lo;0;L;;;;;N;;;;; +1B2E6;NUSHU CHARACTER-1B2E6;Lo;0;L;;;;;N;;;;; +1B2E7;NUSHU CHARACTER-1B2E7;Lo;0;L;;;;;N;;;;; +1B2E8;NUSHU CHARACTER-1B2E8;Lo;0;L;;;;;N;;;;; +1B2E9;NUSHU CHARACTER-1B2E9;Lo;0;L;;;;;N;;;;; +1B2EA;NUSHU CHARACTER-1B2EA;Lo;0;L;;;;;N;;;;; +1B2EB;NUSHU CHARACTER-1B2EB;Lo;0;L;;;;;N;;;;; +1B2EC;NUSHU CHARACTER-1B2EC;Lo;0;L;;;;;N;;;;; +1B2ED;NUSHU CHARACTER-1B2ED;Lo;0;L;;;;;N;;;;; +1B2EE;NUSHU CHARACTER-1B2EE;Lo;0;L;;;;;N;;;;; +1B2EF;NUSHU CHARACTER-1B2EF;Lo;0;L;;;;;N;;;;; +1B2F0;NUSHU CHARACTER-1B2F0;Lo;0;L;;;;;N;;;;; +1B2F1;NUSHU CHARACTER-1B2F1;Lo;0;L;;;;;N;;;;; +1B2F2;NUSHU CHARACTER-1B2F2;Lo;0;L;;;;;N;;;;; +1B2F3;NUSHU CHARACTER-1B2F3;Lo;0;L;;;;;N;;;;; +1B2F4;NUSHU CHARACTER-1B2F4;Lo;0;L;;;;;N;;;;; +1B2F5;NUSHU CHARACTER-1B2F5;Lo;0;L;;;;;N;;;;; +1B2F6;NUSHU CHARACTER-1B2F6;Lo;0;L;;;;;N;;;;; +1B2F7;NUSHU CHARACTER-1B2F7;Lo;0;L;;;;;N;;;;; +1B2F8;NUSHU CHARACTER-1B2F8;Lo;0;L;;;;;N;;;;; +1B2F9;NUSHU CHARACTER-1B2F9;Lo;0;L;;;;;N;;;;; +1B2FA;NUSHU CHARACTER-1B2FA;Lo;0;L;;;;;N;;;;; +1B2FB;NUSHU CHARACTER-1B2FB;Lo;0;L;;;;;N;;;;; +1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; +1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;; +1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;; +1BC03;DUPLOYAN LETTER T;Lo;0;L;;;;;N;;;;; +1BC04;DUPLOYAN LETTER F;Lo;0;L;;;;;N;;;;; +1BC05;DUPLOYAN LETTER K;Lo;0;L;;;;;N;;;;; +1BC06;DUPLOYAN LETTER L;Lo;0;L;;;;;N;;;;; +1BC07;DUPLOYAN LETTER B;Lo;0;L;;;;;N;;;;; +1BC08;DUPLOYAN LETTER D;Lo;0;L;;;;;N;;;;; +1BC09;DUPLOYAN LETTER V;Lo;0;L;;;;;N;;;;; +1BC0A;DUPLOYAN LETTER G;Lo;0;L;;;;;N;;;;; +1BC0B;DUPLOYAN LETTER R;Lo;0;L;;;;;N;;;;; +1BC0C;DUPLOYAN LETTER P N;Lo;0;L;;;;;N;;;;; +1BC0D;DUPLOYAN LETTER D S;Lo;0;L;;;;;N;;;;; +1BC0E;DUPLOYAN LETTER F N;Lo;0;L;;;;;N;;;;; +1BC0F;DUPLOYAN LETTER K M;Lo;0;L;;;;;N;;;;; +1BC10;DUPLOYAN LETTER R S;Lo;0;L;;;;;N;;;;; +1BC11;DUPLOYAN LETTER TH;Lo;0;L;;;;;N;;;;; +1BC12;DUPLOYAN LETTER SLOAN DH;Lo;0;L;;;;;N;;;;; +1BC13;DUPLOYAN LETTER DH;Lo;0;L;;;;;N;;;;; +1BC14;DUPLOYAN LETTER KK;Lo;0;L;;;;;N;;;;; +1BC15;DUPLOYAN LETTER SLOAN J;Lo;0;L;;;;;N;;;;; +1BC16;DUPLOYAN LETTER HL;Lo;0;L;;;;;N;;;;; +1BC17;DUPLOYAN LETTER LH;Lo;0;L;;;;;N;;;;; +1BC18;DUPLOYAN LETTER RH;Lo;0;L;;;;;N;;;;; +1BC19;DUPLOYAN LETTER M;Lo;0;L;;;;;N;;;;; +1BC1A;DUPLOYAN LETTER N;Lo;0;L;;;;;N;;;;; +1BC1B;DUPLOYAN LETTER J;Lo;0;L;;;;;N;;;;; +1BC1C;DUPLOYAN LETTER S;Lo;0;L;;;;;N;;;;; +1BC1D;DUPLOYAN LETTER M N;Lo;0;L;;;;;N;;;;; +1BC1E;DUPLOYAN LETTER N M;Lo;0;L;;;;;N;;;;; +1BC1F;DUPLOYAN LETTER J M;Lo;0;L;;;;;N;;;;; +1BC20;DUPLOYAN LETTER S J;Lo;0;L;;;;;N;;;;; +1BC21;DUPLOYAN LETTER M WITH DOT;Lo;0;L;;;;;N;;;;; +1BC22;DUPLOYAN LETTER N WITH DOT;Lo;0;L;;;;;N;;;;; +1BC23;DUPLOYAN LETTER J WITH DOT;Lo;0;L;;;;;N;;;;; +1BC24;DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE;Lo;0;L;;;;;N;;;;; +1BC25;DUPLOYAN LETTER S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC26;DUPLOYAN LETTER S WITH DOT BELOW;Lo;0;L;;;;;N;;;;; +1BC27;DUPLOYAN LETTER M S;Lo;0;L;;;;;N;;;;; +1BC28;DUPLOYAN LETTER N S;Lo;0;L;;;;;N;;;;; +1BC29;DUPLOYAN LETTER J S;Lo;0;L;;;;;N;;;;; +1BC2A;DUPLOYAN LETTER S S;Lo;0;L;;;;;N;;;;; +1BC2B;DUPLOYAN LETTER M N S;Lo;0;L;;;;;N;;;;; +1BC2C;DUPLOYAN LETTER N M S;Lo;0;L;;;;;N;;;;; +1BC2D;DUPLOYAN LETTER J M S;Lo;0;L;;;;;N;;;;; +1BC2E;DUPLOYAN LETTER S J S;Lo;0;L;;;;;N;;;;; +1BC2F;DUPLOYAN LETTER J S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC30;DUPLOYAN LETTER J N;Lo;0;L;;;;;N;;;;; +1BC31;DUPLOYAN LETTER J N S;Lo;0;L;;;;;N;;;;; +1BC32;DUPLOYAN LETTER S T;Lo;0;L;;;;;N;;;;; +1BC33;DUPLOYAN LETTER S T R;Lo;0;L;;;;;N;;;;; +1BC34;DUPLOYAN LETTER S P;Lo;0;L;;;;;N;;;;; +1BC35;DUPLOYAN LETTER S P R;Lo;0;L;;;;;N;;;;; +1BC36;DUPLOYAN LETTER T S;Lo;0;L;;;;;N;;;;; +1BC37;DUPLOYAN LETTER T R S;Lo;0;L;;;;;N;;;;; +1BC38;DUPLOYAN LETTER W;Lo;0;L;;;;;N;;;;; +1BC39;DUPLOYAN LETTER WH;Lo;0;L;;;;;N;;;;; +1BC3A;DUPLOYAN LETTER W R;Lo;0;L;;;;;N;;;;; +1BC3B;DUPLOYAN LETTER S N;Lo;0;L;;;;;N;;;;; +1BC3C;DUPLOYAN LETTER S M;Lo;0;L;;;;;N;;;;; +1BC3D;DUPLOYAN LETTER K R S;Lo;0;L;;;;;N;;;;; +1BC3E;DUPLOYAN LETTER G R S;Lo;0;L;;;;;N;;;;; +1BC3F;DUPLOYAN LETTER S K;Lo;0;L;;;;;N;;;;; +1BC40;DUPLOYAN LETTER S K R;Lo;0;L;;;;;N;;;;; +1BC41;DUPLOYAN LETTER A;Lo;0;L;;;;;N;;;;; +1BC42;DUPLOYAN LETTER SLOAN OW;Lo;0;L;;;;;N;;;;; +1BC43;DUPLOYAN LETTER OA;Lo;0;L;;;;;N;;;;; +1BC44;DUPLOYAN LETTER O;Lo;0;L;;;;;N;;;;; +1BC45;DUPLOYAN LETTER AOU;Lo;0;L;;;;;N;;;;; +1BC46;DUPLOYAN LETTER I;Lo;0;L;;;;;N;;;;; +1BC47;DUPLOYAN LETTER E;Lo;0;L;;;;;N;;;;; +1BC48;DUPLOYAN LETTER IE;Lo;0;L;;;;;N;;;;; +1BC49;DUPLOYAN LETTER SHORT I;Lo;0;L;;;;;N;;;;; +1BC4A;DUPLOYAN LETTER UI;Lo;0;L;;;;;N;;;;; +1BC4B;DUPLOYAN LETTER EE;Lo;0;L;;;;;N;;;;; +1BC4C;DUPLOYAN LETTER SLOAN EH;Lo;0;L;;;;;N;;;;; +1BC4D;DUPLOYAN LETTER ROMANIAN I;Lo;0;L;;;;;N;;;;; +1BC4E;DUPLOYAN LETTER SLOAN EE;Lo;0;L;;;;;N;;;;; +1BC4F;DUPLOYAN LETTER LONG I;Lo;0;L;;;;;N;;;;; +1BC50;DUPLOYAN LETTER YE;Lo;0;L;;;;;N;;;;; +1BC51;DUPLOYAN LETTER U;Lo;0;L;;;;;N;;;;; +1BC52;DUPLOYAN LETTER EU;Lo;0;L;;;;;N;;;;; +1BC53;DUPLOYAN LETTER XW;Lo;0;L;;;;;N;;;;; +1BC54;DUPLOYAN LETTER U N;Lo;0;L;;;;;N;;;;; +1BC55;DUPLOYAN LETTER LONG U;Lo;0;L;;;;;N;;;;; +1BC56;DUPLOYAN LETTER ROMANIAN U;Lo;0;L;;;;;N;;;;; +1BC57;DUPLOYAN LETTER UH;Lo;0;L;;;;;N;;;;; +1BC58;DUPLOYAN LETTER SLOAN U;Lo;0;L;;;;;N;;;;; +1BC59;DUPLOYAN LETTER OOH;Lo;0;L;;;;;N;;;;; +1BC5A;DUPLOYAN LETTER OW;Lo;0;L;;;;;N;;;;; +1BC5B;DUPLOYAN LETTER OU;Lo;0;L;;;;;N;;;;; +1BC5C;DUPLOYAN LETTER WA;Lo;0;L;;;;;N;;;;; +1BC5D;DUPLOYAN LETTER WO;Lo;0;L;;;;;N;;;;; +1BC5E;DUPLOYAN LETTER WI;Lo;0;L;;;;;N;;;;; +1BC5F;DUPLOYAN LETTER WEI;Lo;0;L;;;;;N;;;;; +1BC60;DUPLOYAN LETTER WOW;Lo;0;L;;;;;N;;;;; +1BC61;DUPLOYAN LETTER NASAL U;Lo;0;L;;;;;N;;;;; +1BC62;DUPLOYAN LETTER NASAL O;Lo;0;L;;;;;N;;;;; +1BC63;DUPLOYAN LETTER NASAL I;Lo;0;L;;;;;N;;;;; +1BC64;DUPLOYAN LETTER NASAL A;Lo;0;L;;;;;N;;;;; +1BC65;DUPLOYAN LETTER PERNIN AN;Lo;0;L;;;;;N;;;;; +1BC66;DUPLOYAN LETTER PERNIN AM;Lo;0;L;;;;;N;;;;; +1BC67;DUPLOYAN LETTER SLOAN EN;Lo;0;L;;;;;N;;;;; +1BC68;DUPLOYAN LETTER SLOAN AN;Lo;0;L;;;;;N;;;;; +1BC69;DUPLOYAN LETTER SLOAN ON;Lo;0;L;;;;;N;;;;; +1BC6A;DUPLOYAN LETTER VOCALIC M;Lo;0;L;;;;;N;;;;; +1BC70;DUPLOYAN AFFIX LEFT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC71;DUPLOYAN AFFIX MID HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC72;DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC73;DUPLOYAN AFFIX LOW VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC74;DUPLOYAN AFFIX MID VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC75;DUPLOYAN AFFIX HIGH VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC76;DUPLOYAN AFFIX ATTACHED SECANT;Lo;0;L;;;;;N;;;;; +1BC77;DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT;Lo;0;L;;;;;N;;;;; +1BC78;DUPLOYAN AFFIX ATTACHED TANGENT;Lo;0;L;;;;;N;;;;; +1BC79;DUPLOYAN AFFIX ATTACHED TAIL;Lo;0;L;;;;;N;;;;; +1BC7A;DUPLOYAN AFFIX ATTACHED E HOOK;Lo;0;L;;;;;N;;;;; +1BC7B;DUPLOYAN AFFIX ATTACHED I HOOK;Lo;0;L;;;;;N;;;;; +1BC7C;DUPLOYAN AFFIX ATTACHED TANGENT HOOK;Lo;0;L;;;;;N;;;;; +1BC80;DUPLOYAN AFFIX HIGH ACUTE;Lo;0;L;;;;;N;;;;; +1BC81;DUPLOYAN AFFIX HIGH TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC82;DUPLOYAN AFFIX HIGH GRAVE;Lo;0;L;;;;;N;;;;; +1BC83;DUPLOYAN AFFIX HIGH LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC84;DUPLOYAN AFFIX HIGH DOT;Lo;0;L;;;;;N;;;;; +1BC85;DUPLOYAN AFFIX HIGH CIRCLE;Lo;0;L;;;;;N;;;;; +1BC86;DUPLOYAN AFFIX HIGH LINE;Lo;0;L;;;;;N;;;;; +1BC87;DUPLOYAN AFFIX HIGH WAVE;Lo;0;L;;;;;N;;;;; +1BC88;DUPLOYAN AFFIX HIGH VERTICAL;Lo;0;L;;;;;N;;;;; +1BC90;DUPLOYAN AFFIX LOW ACUTE;Lo;0;L;;;;;N;;;;; +1BC91;DUPLOYAN AFFIX LOW TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC92;DUPLOYAN AFFIX LOW GRAVE;Lo;0;L;;;;;N;;;;; +1BC93;DUPLOYAN AFFIX LOW LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC94;DUPLOYAN AFFIX LOW DOT;Lo;0;L;;;;;N;;;;; +1BC95;DUPLOYAN AFFIX LOW CIRCLE;Lo;0;L;;;;;N;;;;; +1BC96;DUPLOYAN AFFIX LOW LINE;Lo;0;L;;;;;N;;;;; +1BC97;DUPLOYAN AFFIX LOW WAVE;Lo;0;L;;;;;N;;;;; +1BC98;DUPLOYAN AFFIX LOW VERTICAL;Lo;0;L;;;;;N;;;;; +1BC99;DUPLOYAN AFFIX LOW ARROW;Lo;0;L;;;;;N;;;;; +1BC9C;DUPLOYAN SIGN O WITH CROSS;So;0;L;;;;;N;;;;; +1BC9D;DUPLOYAN THICK LETTER SELECTOR;Mn;0;NSM;;;;;N;;;;; +1BC9E;DUPLOYAN DOUBLE MARK;Mn;1;NSM;;;;;N;;;;; +1BC9F;DUPLOYAN PUNCTUATION CHINOOK FULL STOP;Po;0;L;;;;;N;;;;; +1BCA0;SHORTHAND FORMAT LETTER OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;; +1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;; +1CC00;UP-POINTING GO-KART;So;0;ON;;;;;N;;;;; +1CC01;RIGHT-POINTING GO-KART;So;0;ON;;;;;N;;;;; +1CC02;LEFT-POINTING STICK FIGURE;So;0;ON;;;;;N;;;;; +1CC03;RIGHT-POINTING STICK FIGURE;So;0;ON;;;;;N;;;;; +1CC04;DOWN-POINTING STICK FIGURE;So;0;ON;;;;;N;;;;; +1CC05;LOWER HORIZONTAL RULER SEGMENT;So;0;ON;;;;;N;;;;; +1CC06;RIGHT VERTICAL RULER SEGMENT;So;0;ON;;;;;N;;;;; +1CC07;LOWER RIGHT RULER SEGMENT;So;0;ON;;;;;N;;;;; +1CC08;ANTENNA;So;0;ON;;;;;N;;;;; +1CC09;HORIZONTAL RESISTOR SEGMENT;So;0;ON;;;;;N;;;;; +1CC0A;VERTICAL RESISTOR SEGMENT;So;0;ON;;;;;N;;;;; +1CC0B;LEFT THIRD INDUCTOR;So;0;ON;;;;;N;;;;; +1CC0C;MIDDLE THIRD INDUCTOR;So;0;ON;;;;;N;;;;; +1CC0D;RIGHT THIRD INDUCTOR;So;0;ON;;;;;N;;;;; +1CC0E;LEFT-POINTING DIODE;So;0;ON;;;;;N;;;;; +1CC0F;RIGHT-POINTING DIODE;So;0;ON;;;;;N;;;;; +1CC10;NPN TRANSISTOR;So;0;ON;;;;;N;;;;; +1CC11;PNP TRANSISTOR;So;0;ON;;;;;N;;;;; +1CC12;RECEPTACLE;So;0;ON;;;;;N;;;;; +1CC13;HORIZONTAL CAPACITOR;So;0;ON;;;;;N;;;;; +1CC14;VERTICAL CAPACITOR;So;0;ON;;;;;N;;;;; +1CC15;LOGIC GATE OR;So;0;ON;;;;;N;;;;; +1CC16;LOGIC GATE AND;So;0;ON;;;;;N;;;;; +1CC17;LOGIC GATE INVERTED INPUTS;So;0;ON;;;;;N;;;;; +1CC18;LOGIC GATE INVERTED OUTPUT;So;0;ON;;;;;N;;;;; +1CC19;LOGIC GATE BUFFER;So;0;ON;;;;;N;;;;; +1CC1A;LOGIC GATE BUFFER WITH INVERTED INPUT;So;0;ON;;;;;N;;;;; +1CC1B;BOX DRAWINGS LIGHT HORIZONTAL AND UPPER RIGHT;So;0;ON;;;;;N;;;;; +1CC1C;BOX DRAWINGS LIGHT HORIZONTAL AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +1CC1D;BOX DRAWINGS LIGHT TOP AND UPPER LEFT;So;0;ON;;;;;N;;;;; +1CC1E;BOX DRAWINGS LIGHT BOTTOM AND LOWER LEFT;So;0;ON;;;;;N;;;;; +1CC1F;BOX DRAWINGS DOUBLE DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;;;;; +1CC20;BOX DRAWINGS DOUBLE DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1CC21;SEPARATED BLOCK QUADRANT-1;So;0;ON;;;;;N;;;;; +1CC22;SEPARATED BLOCK QUADRANT-2;So;0;ON;;;;;N;;;;; +1CC23;SEPARATED BLOCK QUADRANT-12;So;0;ON;;;;;N;;;;; +1CC24;SEPARATED BLOCK QUADRANT-3;So;0;ON;;;;;N;;;;; +1CC25;SEPARATED BLOCK QUADRANT-13;So;0;ON;;;;;N;;;;; +1CC26;SEPARATED BLOCK QUADRANT-23;So;0;ON;;;;;N;;;;; +1CC27;SEPARATED BLOCK QUADRANT-123;So;0;ON;;;;;N;;;;; +1CC28;SEPARATED BLOCK QUADRANT-4;So;0;ON;;;;;N;;;;; +1CC29;SEPARATED BLOCK QUADRANT-14;So;0;ON;;;;;N;;;;; +1CC2A;SEPARATED BLOCK QUADRANT-24;So;0;ON;;;;;N;;;;; +1CC2B;SEPARATED BLOCK QUADRANT-124;So;0;ON;;;;;N;;;;; +1CC2C;SEPARATED BLOCK QUADRANT-34;So;0;ON;;;;;N;;;;; +1CC2D;SEPARATED BLOCK QUADRANT-134;So;0;ON;;;;;N;;;;; +1CC2E;SEPARATED BLOCK QUADRANT-234;So;0;ON;;;;;N;;;;; +1CC2F;SEPARATED BLOCK QUADRANT-1234;So;0;ON;;;;;N;;;;; +1CC30;UPPER LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC31;UPPER CENTRE LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC32;UPPER CENTRE RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC33;UPPER RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC34;UPPER MIDDLE LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC35;UPPER LEFT QUARTER CIRCLE;So;0;ON;;;;;N;;;;; +1CC36;UPPER RIGHT QUARTER CIRCLE;So;0;ON;;;;;N;;;;; +1CC37;UPPER MIDDLE RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC38;LOWER MIDDLE LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC39;LOWER LEFT QUARTER CIRCLE;So;0;ON;;;;;N;;;;; +1CC3A;LOWER RIGHT QUARTER CIRCLE;So;0;ON;;;;;N;;;;; +1CC3B;LOWER MIDDLE RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC3C;LOWER LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC3D;LOWER CENTRE LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC3E;LOWER CENTRE RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC3F;LOWER RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC40;SPARSE HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +1CC41;SPARSE VERTICAL FILL;So;0;ON;;;;;N;;;;; +1CC42;ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +1CC43;DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +1CC44;DENSE VERTICAL FILL;So;0;ON;;;;;N;;;;; +1CC45;DENSE HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +1CC46;SPECKLE FILL FRAME-1;So;0;ON;;;;;N;;;;; +1CC47;SPECKLE FILL FRAME-2;So;0;ON;;;;;N;;;;; +1CC48;LEFT-FACING BASSINET;So;0;ON;;;;;N;;;;; +1CC49;RIGHT-FACING BASSINET;So;0;ON;;;;;N;;;;; +1CC4A;FLYING SAUCER WITH BEAMS;So;0;ON;;;;;N;;;;; +1CC4B;FLYING SAUCER WITHOUT BEAMS;So;0;ON;;;;;N;;;;; +1CC4C;ALIEN MONSTER OPEN JAWS;So;0;ON;;;;;N;;;;; +1CC4D;ALIEN MONSTER CLOSED JAWS;So;0;ON;;;;;N;;;;; +1CC4E;ALIEN SQUID OPEN TENTACLES;So;0;ON;;;;;N;;;;; +1CC4F;ALIEN SQUID CLOSED TENTACLES;So;0;ON;;;;;N;;;;; +1CC50;ALIEN CRAB STEPPING RIGHT;So;0;ON;;;;;N;;;;; +1CC51;ALIEN CRAB STEPPING LEFT;So;0;ON;;;;;N;;;;; +1CC52;ALIEN SPIDER CROUCHING;So;0;ON;;;;;N;;;;; +1CC53;ALIEN SPIDER SPREAD;So;0;ON;;;;;N;;;;; +1CC54;ALIEN MONSTER STEP-1;So;0;ON;;;;;N;;;;; +1CC55;ALIEN MONSTER STEP-2;So;0;ON;;;;;N;;;;; +1CC56;LEFT-POINTING ROCKET SHIP;So;0;ON;;;;;N;;;;; +1CC57;UP-POINTING ROCKET SHIP;So;0;ON;;;;;N;;;;; +1CC58;RIGHT-POINTING ROCKET SHIP;So;0;ON;;;;;N;;;;; +1CC59;DOWN-POINTING ROCKET SHIP;So;0;ON;;;;;N;;;;; +1CC5A;TOP HALF LEFT-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC5B;TOP HALF FORWARD-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC5C;TOP HALF RIGHT-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC5D;BOTTOM HALF LEFT-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC5E;BOTTOM HALF FORWARD-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC5F;BOTTOM HALF RIGHT-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC60;LEFT-POINTING ATOMIC BOMB;So;0;ON;;;;;N;;;;; +1CC61;UP-POINTING ATOMIC BOMB;So;0;ON;;;;;N;;;;; +1CC62;RIGHT-POINTING ATOMIC BOMB;So;0;ON;;;;;N;;;;; +1CC63;DOWN-POINTING ATOMIC BOMB;So;0;ON;;;;;N;;;;; +1CC64;MUSHROOM CLOUD;So;0;ON;;;;;N;;;;; +1CC65;LEFT-POINTING RIFLE;So;0;ON;;;;;N;;;;; +1CC66;UP-POINTING RIFLE;So;0;ON;;;;;N;;;;; +1CC67;RIGHT-POINTING RIFLE;So;0;ON;;;;;N;;;;; +1CC68;DOWN-POINTING RIFLE;So;0;ON;;;;;N;;;;; +1CC69;EIGHT RAYS INWARD;So;0;ON;;;;;N;;;;; +1CC6A;EIGHT RAYS OUTWARD;So;0;ON;;;;;N;;;;; +1CC6B;BLACK LARGE CIRCLE MINUS LEFT QUARTER SECTION;So;0;ON;;;;;N;;;;; +1CC6C;BLACK LARGE CIRCLE MINUS UPPER QUARTER SECTION;So;0;ON;;;;;N;;;;; +1CC6D;BLACK LARGE CIRCLE MINUS RIGHT QUARTER SECTION;So;0;ON;;;;;N;;;;; +1CC6E;BLACK LARGE CIRCLE MINUS LOWER QUARTER SECTION;So;0;ON;;;;;N;;;;; +1CC6F;BLACK NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1CC70;LEFT-FACING SNAKE HEAD WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC71;UP-FACING SNAKE HEAD WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC72;RIGHT-FACING SNAKE HEAD WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC73;DOWN-FACING SNAKE HEAD WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC74;LEFT-FACING SNAKE HEAD WITH CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1CC75;UP-FACING SNAKE HEAD WITH CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1CC76;RIGHT-FACING SNAKE HEAD WITH CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1CC77;DOWN-FACING SNAKE HEAD WITH CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1CC78;LEFT-POINTING ENERGY WAVE;So;0;ON;;;;;N;;;;; +1CC79;UP-POINTING ENERGY WAVE;So;0;ON;;;;;N;;;;; +1CC7A;RIGHT-POINTING ENERGY WAVE;So;0;ON;;;;;N;;;;; +1CC7B;DOWN-POINTING ENERGY WAVE;So;0;ON;;;;;N;;;;; +1CC7C;SQUARE SPIRAL FROM TOP LEFT;So;0;ON;;;;;N;;;;; +1CC7D;SQUARE SPIRAL FROM TOP RIGHT;So;0;ON;;;;;N;;;;; +1CC7E;SQUARE SPIRAL FROM BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +1CC7F;SQUARE SPIRAL FROM BOTTOM LEFT;So;0;ON;;;;;N;;;;; +1CC80;STRIPED LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +1CC81;STRIPED UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +1CC82;STRIPED RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +1CC83;STRIPED DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +1CC84;VERTICAL LADDER;So;0;ON;;;;;N;;;;; +1CC85;HORIZONTAL LADDER;So;0;ON;;;;;N;;;;; +1CC86;WHITE LOWER LEFT POINTER;So;0;ON;;;;;N;;;;; +1CC87;WHITE LOWER RIGHT POINTER;So;0;ON;;;;;N;;;;; +1CC88;TWO RINGS ALIGNED HORIZONTALLY;So;0;ON;;;;;N;;;;; +1CC89;SQUARE FOUR CORNER SALTIRES;So;0;ON;;;;;N;;;;; +1CC8A;SQUARE FOUR CORNER DIAGONALS;So;0;ON;;;;;N;;;;; +1CC8B;SQUARE FOUR CORNER BLACK TRIANGLES;So;0;ON;;;;;N;;;;; +1CC8C;SQUARE APERTURE;So;0;ON;;;;;N;;;;; +1CC8D;INVERSE BLACK DIAMOND;So;0;ON;;;;;N;;;;; +1CC8E;LEFT AND UPPER ONE EIGHTH BLOCK CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +1CC8F;INVERSE BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +1CC90;VERTICAL LINE WITH FOUR TICK MARKS;So;0;ON;;;;;N;;;;; +1CC91;HORIZONTAL LINE WITH FOUR TICK MARKS;So;0;ON;;;;;N;;;;; +1CC92;LEFT-FACING FISH;So;0;ON;;;;;N;;;;; +1CC93;RIGHT-FACING FISH;So;0;ON;;;;;N;;;;; +1CC94;LEFT-FACING FISH WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC95;RIGHT-FACING FISH WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC96;FLAPPING BIRD;So;0;ON;;;;;N;;;;; +1CC97;LEFT-POINTING RACING CAR;So;0;ON;;;;;N;;;;; +1CC98;UP-POINTING RACING CAR;So;0;ON;;;;;N;;;;; +1CC99;RIGHT-POINTING RACING CAR;So;0;ON;;;;;N;;;;; +1CC9A;DOWN-POINTING RACING CAR;So;0;ON;;;;;N;;;;; +1CC9B;HORIZONTAL RACING CAR;So;0;ON;;;;;N;;;;; +1CC9C;VERTICAL RACING CAR;So;0;ON;;;;;N;;;;; +1CC9D;VERTICAL GO-KART;So;0;ON;;;;;N;;;;; +1CC9E;LEFT-POINTING TANK;So;0;ON;;;;;N;;;;; +1CC9F;RIGHT-POINTING TANK;So;0;ON;;;;;N;;;;; +1CCA0;LEFT-POINTING ROCKET BOOSTER;So;0;ON;;;;;N;;;;; +1CCA1;RIGHT-POINTING ROCKET BOOSTER;So;0;ON;;;;;N;;;;; +1CCA2;LEFT-POINTING ROLLER COASTER CAR;So;0;ON;;;;;N;;;;; +1CCA3;RIGHT-POINTING ROLLER COASTER CAR;So;0;ON;;;;;N;;;;; +1CCA4;LEFT HALF FLYING SAUCER;So;0;ON;;;;;N;;;;; +1CCA5;RIGHT HALF FLYING SAUCER;So;0;ON;;;;;N;;;;; +1CCA6;UPPER LEFT QUADRANT FACE WITH OPEN EYES;So;0;ON;;;;;N;;;;; +1CCA7;UPPER RIGHT QUADRANT FACE WITH OPEN EYES;So;0;ON;;;;;N;;;;; +1CCA8;UPPER LEFT QUADRANT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1CCA9;UPPER RIGHT QUADRANT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1CCAA;LOWER LEFT QUADRANT SMILING FACE;So;0;ON;;;;;N;;;;; +1CCAB;LOWER RIGHT QUADRANT SMILING FACE;So;0;ON;;;;;N;;;;; +1CCAC;LOWER LEFT QUADRANT NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1CCAD;LOWER RIGHT QUADRANT NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1CCAE;LOWER LEFT QUADRANT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CCAF;LOWER RIGHT QUADRANT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CCB0;LOWER LEFT QUADRANT FROWNING FACE;So;0;ON;;;;;N;;;;; +1CCB1;LOWER RIGHT QUADRANT FROWNING FACE;So;0;ON;;;;;N;;;;; +1CCB2;UPPER LEFT QUADRANT TELEVISION;So;0;ON;;;;;N;;;;; +1CCB3;UPPER RIGHT QUADRANT TELEVISION;So;0;ON;;;;;N;;;;; +1CCB4;LOWER LEFT QUADRANT TELEVISION;So;0;ON;;;;;N;;;;; +1CCB5;LOWER RIGHT QUADRANT TELEVISION;So;0;ON;;;;;N;;;;; +1CCB6;UPPER LEFT QUADRANT MICROCOMPUTER;So;0;ON;;;;;N;;;;; +1CCB7;UPPER RIGHT QUADRANT MICROCOMPUTER;So;0;ON;;;;;N;;;;; +1CCB8;LOWER LEFT QUADRANT MICROCOMPUTER;So;0;ON;;;;;N;;;;; +1CCB9;LOWER RIGHT QUADRANT MICROCOMPUTER;So;0;ON;;;;;N;;;;; +1CCBA;UPPER LEFT QUADRANT CHESS KING;So;0;ON;;;;;N;;;;; +1CCBB;UPPER RIGHT QUADRANT CHESS KING;So;0;ON;;;;;N;;;;; +1CCBC;LOWER LEFT QUADRANT CHESS KING;So;0;ON;;;;;N;;;;; +1CCBD;LOWER RIGHT QUADRANT CHESS KING;So;0;ON;;;;;N;;;;; +1CCBE;UPPER LEFT QUADRANT CHESS QUEEN;So;0;ON;;;;;N;;;;; +1CCBF;UPPER RIGHT QUADRANT CHESS QUEEN;So;0;ON;;;;;N;;;;; +1CCC0;LOWER LEFT QUADRANT CHESS QUEEN;So;0;ON;;;;;N;;;;; +1CCC1;LOWER RIGHT QUADRANT CHESS QUEEN;So;0;ON;;;;;N;;;;; +1CCC2;UPPER LEFT QUADRANT CHESS ROOK;So;0;ON;;;;;N;;;;; +1CCC3;UPPER RIGHT QUADRANT CHESS ROOK;So;0;ON;;;;;N;;;;; +1CCC4;LOWER LEFT QUADRANT CHESS ROOK;So;0;ON;;;;;N;;;;; +1CCC5;LOWER RIGHT QUADRANT CHESS ROOK;So;0;ON;;;;;N;;;;; +1CCC6;UPPER LEFT QUADRANT CHESS BISHOP;So;0;ON;;;;;N;;;;; +1CCC7;UPPER RIGHT QUADRANT CHESS BISHOP;So;0;ON;;;;;N;;;;; +1CCC8;LOWER LEFT QUADRANT CHESS BISHOP;So;0;ON;;;;;N;;;;; +1CCC9;LOWER RIGHT QUADRANT CHESS BISHOP;So;0;ON;;;;;N;;;;; +1CCCA;UPPER LEFT QUADRANT CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1CCCB;UPPER RIGHT QUADRANT CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1CCCC;LOWER LEFT QUADRANT CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1CCCD;LOWER RIGHT QUADRANT CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1CCCE;UPPER LEFT QUADRANT CHESS PAWN;So;0;ON;;;;;N;;;;; +1CCCF;UPPER RIGHT QUADRANT CHESS PAWN;So;0;ON;;;;;N;;;;; +1CCD0;LOWER LEFT QUADRANT CHESS PAWN;So;0;ON;;;;;N;;;;; +1CCD1;LOWER RIGHT QUADRANT CHESS PAWN;So;0;ON;;;;;N;;;;; +1CCD2;UPPER LEFT QUADRANT STANDING KNIGHT;So;0;ON;;;;;N;;;;; +1CCD3;UPPER RIGHT QUADRANT STANDING KNIGHT;So;0;ON;;;;;N;;;;; +1CCD4;LOWER LEFT QUADRANT STANDING KNIGHT;So;0;ON;;;;;N;;;;; +1CCD5;LOWER RIGHT QUADRANT STANDING KNIGHT;So;0;ON;;;;;N;;;;; +1CCD6;OUTLINED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;; +1CCD7;OUTLINED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;; +1CCD8;OUTLINED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; +1CCD9;OUTLINED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;; +1CCDA;OUTLINED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;; +1CCDB;OUTLINED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;; +1CCDC;OUTLINED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;; +1CCDD;OUTLINED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;; +1CCDE;OUTLINED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;; +1CCDF;OUTLINED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;; +1CCE0;OUTLINED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;; +1CCE1;OUTLINED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;; +1CCE2;OUTLINED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;; +1CCE3;OUTLINED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;; +1CCE4;OUTLINED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;; +1CCE5;OUTLINED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;; +1CCE6;OUTLINED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;; +1CCE7;OUTLINED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; +1CCE8;OUTLINED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;; +1CCE9;OUTLINED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;; +1CCEA;OUTLINED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;; +1CCEB;OUTLINED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;; +1CCEC;OUTLINED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;; +1CCED;OUTLINED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;; +1CCEE;OUTLINED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;; +1CCEF;OUTLINED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;; +1CCF0;OUTLINED DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1CCF1;OUTLINED DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1CCF2;OUTLINED DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1CCF3;OUTLINED DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1CCF4;OUTLINED DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1CCF5;OUTLINED DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1CCF6;OUTLINED DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1CCF7;OUTLINED DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1CCF8;OUTLINED DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1CCF9;OUTLINED DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1CCFA;SNAKE SYMBOL;So;0;ON;;;;;N;;;;; +1CCFB;FLYING SAUCER SYMBOL;So;0;ON;;;;;N;;;;; +1CCFC;NOSE SYMBOL;So;0;ON;;;;;N;;;;; +1CD00;BLOCK OCTANT-3;So;0;ON;;;;;N;;;;; +1CD01;BLOCK OCTANT-23;So;0;ON;;;;;N;;;;; +1CD02;BLOCK OCTANT-123;So;0;ON;;;;;N;;;;; +1CD03;BLOCK OCTANT-4;So;0;ON;;;;;N;;;;; +1CD04;BLOCK OCTANT-14;So;0;ON;;;;;N;;;;; +1CD05;BLOCK OCTANT-124;So;0;ON;;;;;N;;;;; +1CD06;BLOCK OCTANT-34;So;0;ON;;;;;N;;;;; +1CD07;BLOCK OCTANT-134;So;0;ON;;;;;N;;;;; +1CD08;BLOCK OCTANT-234;So;0;ON;;;;;N;;;;; +1CD09;BLOCK OCTANT-5;So;0;ON;;;;;N;;;;; +1CD0A;BLOCK OCTANT-15;So;0;ON;;;;;N;;;;; +1CD0B;BLOCK OCTANT-25;So;0;ON;;;;;N;;;;; +1CD0C;BLOCK OCTANT-125;So;0;ON;;;;;N;;;;; +1CD0D;BLOCK OCTANT-135;So;0;ON;;;;;N;;;;; +1CD0E;BLOCK OCTANT-235;So;0;ON;;;;;N;;;;; +1CD0F;BLOCK OCTANT-1235;So;0;ON;;;;;N;;;;; +1CD10;BLOCK OCTANT-45;So;0;ON;;;;;N;;;;; +1CD11;BLOCK OCTANT-145;So;0;ON;;;;;N;;;;; +1CD12;BLOCK OCTANT-245;So;0;ON;;;;;N;;;;; +1CD13;BLOCK OCTANT-1245;So;0;ON;;;;;N;;;;; +1CD14;BLOCK OCTANT-345;So;0;ON;;;;;N;;;;; +1CD15;BLOCK OCTANT-1345;So;0;ON;;;;;N;;;;; +1CD16;BLOCK OCTANT-2345;So;0;ON;;;;;N;;;;; +1CD17;BLOCK OCTANT-12345;So;0;ON;;;;;N;;;;; +1CD18;BLOCK OCTANT-6;So;0;ON;;;;;N;;;;; +1CD19;BLOCK OCTANT-16;So;0;ON;;;;;N;;;;; +1CD1A;BLOCK OCTANT-26;So;0;ON;;;;;N;;;;; +1CD1B;BLOCK OCTANT-126;So;0;ON;;;;;N;;;;; +1CD1C;BLOCK OCTANT-36;So;0;ON;;;;;N;;;;; +1CD1D;BLOCK OCTANT-136;So;0;ON;;;;;N;;;;; +1CD1E;BLOCK OCTANT-236;So;0;ON;;;;;N;;;;; +1CD1F;BLOCK OCTANT-1236;So;0;ON;;;;;N;;;;; +1CD20;BLOCK OCTANT-146;So;0;ON;;;;;N;;;;; +1CD21;BLOCK OCTANT-246;So;0;ON;;;;;N;;;;; +1CD22;BLOCK OCTANT-1246;So;0;ON;;;;;N;;;;; +1CD23;BLOCK OCTANT-346;So;0;ON;;;;;N;;;;; +1CD24;BLOCK OCTANT-1346;So;0;ON;;;;;N;;;;; +1CD25;BLOCK OCTANT-2346;So;0;ON;;;;;N;;;;; +1CD26;BLOCK OCTANT-12346;So;0;ON;;;;;N;;;;; +1CD27;BLOCK OCTANT-56;So;0;ON;;;;;N;;;;; +1CD28;BLOCK OCTANT-156;So;0;ON;;;;;N;;;;; +1CD29;BLOCK OCTANT-256;So;0;ON;;;;;N;;;;; +1CD2A;BLOCK OCTANT-1256;So;0;ON;;;;;N;;;;; +1CD2B;BLOCK OCTANT-356;So;0;ON;;;;;N;;;;; +1CD2C;BLOCK OCTANT-1356;So;0;ON;;;;;N;;;;; +1CD2D;BLOCK OCTANT-2356;So;0;ON;;;;;N;;;;; +1CD2E;BLOCK OCTANT-12356;So;0;ON;;;;;N;;;;; +1CD2F;BLOCK OCTANT-456;So;0;ON;;;;;N;;;;; +1CD30;BLOCK OCTANT-1456;So;0;ON;;;;;N;;;;; +1CD31;BLOCK OCTANT-2456;So;0;ON;;;;;N;;;;; +1CD32;BLOCK OCTANT-12456;So;0;ON;;;;;N;;;;; +1CD33;BLOCK OCTANT-3456;So;0;ON;;;;;N;;;;; +1CD34;BLOCK OCTANT-13456;So;0;ON;;;;;N;;;;; +1CD35;BLOCK OCTANT-23456;So;0;ON;;;;;N;;;;; +1CD36;BLOCK OCTANT-17;So;0;ON;;;;;N;;;;; +1CD37;BLOCK OCTANT-27;So;0;ON;;;;;N;;;;; +1CD38;BLOCK OCTANT-127;So;0;ON;;;;;N;;;;; +1CD39;BLOCK OCTANT-37;So;0;ON;;;;;N;;;;; +1CD3A;BLOCK OCTANT-137;So;0;ON;;;;;N;;;;; +1CD3B;BLOCK OCTANT-237;So;0;ON;;;;;N;;;;; +1CD3C;BLOCK OCTANT-1237;So;0;ON;;;;;N;;;;; +1CD3D;BLOCK OCTANT-47;So;0;ON;;;;;N;;;;; +1CD3E;BLOCK OCTANT-147;So;0;ON;;;;;N;;;;; +1CD3F;BLOCK OCTANT-247;So;0;ON;;;;;N;;;;; +1CD40;BLOCK OCTANT-1247;So;0;ON;;;;;N;;;;; +1CD41;BLOCK OCTANT-347;So;0;ON;;;;;N;;;;; +1CD42;BLOCK OCTANT-1347;So;0;ON;;;;;N;;;;; +1CD43;BLOCK OCTANT-2347;So;0;ON;;;;;N;;;;; +1CD44;BLOCK OCTANT-12347;So;0;ON;;;;;N;;;;; +1CD45;BLOCK OCTANT-157;So;0;ON;;;;;N;;;;; +1CD46;BLOCK OCTANT-257;So;0;ON;;;;;N;;;;; +1CD47;BLOCK OCTANT-1257;So;0;ON;;;;;N;;;;; +1CD48;BLOCK OCTANT-357;So;0;ON;;;;;N;;;;; +1CD49;BLOCK OCTANT-2357;So;0;ON;;;;;N;;;;; +1CD4A;BLOCK OCTANT-12357;So;0;ON;;;;;N;;;;; +1CD4B;BLOCK OCTANT-457;So;0;ON;;;;;N;;;;; +1CD4C;BLOCK OCTANT-1457;So;0;ON;;;;;N;;;;; +1CD4D;BLOCK OCTANT-12457;So;0;ON;;;;;N;;;;; +1CD4E;BLOCK OCTANT-3457;So;0;ON;;;;;N;;;;; +1CD4F;BLOCK OCTANT-13457;So;0;ON;;;;;N;;;;; +1CD50;BLOCK OCTANT-23457;So;0;ON;;;;;N;;;;; +1CD51;BLOCK OCTANT-67;So;0;ON;;;;;N;;;;; +1CD52;BLOCK OCTANT-167;So;0;ON;;;;;N;;;;; +1CD53;BLOCK OCTANT-267;So;0;ON;;;;;N;;;;; +1CD54;BLOCK OCTANT-1267;So;0;ON;;;;;N;;;;; +1CD55;BLOCK OCTANT-367;So;0;ON;;;;;N;;;;; +1CD56;BLOCK OCTANT-1367;So;0;ON;;;;;N;;;;; +1CD57;BLOCK OCTANT-2367;So;0;ON;;;;;N;;;;; +1CD58;BLOCK OCTANT-12367;So;0;ON;;;;;N;;;;; +1CD59;BLOCK OCTANT-467;So;0;ON;;;;;N;;;;; +1CD5A;BLOCK OCTANT-1467;So;0;ON;;;;;N;;;;; +1CD5B;BLOCK OCTANT-2467;So;0;ON;;;;;N;;;;; +1CD5C;BLOCK OCTANT-12467;So;0;ON;;;;;N;;;;; +1CD5D;BLOCK OCTANT-3467;So;0;ON;;;;;N;;;;; +1CD5E;BLOCK OCTANT-13467;So;0;ON;;;;;N;;;;; +1CD5F;BLOCK OCTANT-23467;So;0;ON;;;;;N;;;;; +1CD60;BLOCK OCTANT-123467;So;0;ON;;;;;N;;;;; +1CD61;BLOCK OCTANT-567;So;0;ON;;;;;N;;;;; +1CD62;BLOCK OCTANT-1567;So;0;ON;;;;;N;;;;; +1CD63;BLOCK OCTANT-2567;So;0;ON;;;;;N;;;;; +1CD64;BLOCK OCTANT-12567;So;0;ON;;;;;N;;;;; +1CD65;BLOCK OCTANT-3567;So;0;ON;;;;;N;;;;; +1CD66;BLOCK OCTANT-13567;So;0;ON;;;;;N;;;;; +1CD67;BLOCK OCTANT-23567;So;0;ON;;;;;N;;;;; +1CD68;BLOCK OCTANT-123567;So;0;ON;;;;;N;;;;; +1CD69;BLOCK OCTANT-4567;So;0;ON;;;;;N;;;;; +1CD6A;BLOCK OCTANT-14567;So;0;ON;;;;;N;;;;; +1CD6B;BLOCK OCTANT-24567;So;0;ON;;;;;N;;;;; +1CD6C;BLOCK OCTANT-124567;So;0;ON;;;;;N;;;;; +1CD6D;BLOCK OCTANT-34567;So;0;ON;;;;;N;;;;; +1CD6E;BLOCK OCTANT-134567;So;0;ON;;;;;N;;;;; +1CD6F;BLOCK OCTANT-234567;So;0;ON;;;;;N;;;;; +1CD70;BLOCK OCTANT-1234567;So;0;ON;;;;;N;;;;; +1CD71;BLOCK OCTANT-18;So;0;ON;;;;;N;;;;; +1CD72;BLOCK OCTANT-28;So;0;ON;;;;;N;;;;; +1CD73;BLOCK OCTANT-128;So;0;ON;;;;;N;;;;; +1CD74;BLOCK OCTANT-38;So;0;ON;;;;;N;;;;; +1CD75;BLOCK OCTANT-138;So;0;ON;;;;;N;;;;; +1CD76;BLOCK OCTANT-238;So;0;ON;;;;;N;;;;; +1CD77;BLOCK OCTANT-1238;So;0;ON;;;;;N;;;;; +1CD78;BLOCK OCTANT-48;So;0;ON;;;;;N;;;;; +1CD79;BLOCK OCTANT-148;So;0;ON;;;;;N;;;;; +1CD7A;BLOCK OCTANT-248;So;0;ON;;;;;N;;;;; +1CD7B;BLOCK OCTANT-1248;So;0;ON;;;;;N;;;;; +1CD7C;BLOCK OCTANT-348;So;0;ON;;;;;N;;;;; +1CD7D;BLOCK OCTANT-1348;So;0;ON;;;;;N;;;;; +1CD7E;BLOCK OCTANT-2348;So;0;ON;;;;;N;;;;; +1CD7F;BLOCK OCTANT-12348;So;0;ON;;;;;N;;;;; +1CD80;BLOCK OCTANT-58;So;0;ON;;;;;N;;;;; +1CD81;BLOCK OCTANT-158;So;0;ON;;;;;N;;;;; +1CD82;BLOCK OCTANT-258;So;0;ON;;;;;N;;;;; +1CD83;BLOCK OCTANT-1258;So;0;ON;;;;;N;;;;; +1CD84;BLOCK OCTANT-358;So;0;ON;;;;;N;;;;; +1CD85;BLOCK OCTANT-1358;So;0;ON;;;;;N;;;;; +1CD86;BLOCK OCTANT-2358;So;0;ON;;;;;N;;;;; +1CD87;BLOCK OCTANT-12358;So;0;ON;;;;;N;;;;; +1CD88;BLOCK OCTANT-458;So;0;ON;;;;;N;;;;; +1CD89;BLOCK OCTANT-1458;So;0;ON;;;;;N;;;;; +1CD8A;BLOCK OCTANT-2458;So;0;ON;;;;;N;;;;; +1CD8B;BLOCK OCTANT-12458;So;0;ON;;;;;N;;;;; +1CD8C;BLOCK OCTANT-3458;So;0;ON;;;;;N;;;;; +1CD8D;BLOCK OCTANT-13458;So;0;ON;;;;;N;;;;; +1CD8E;BLOCK OCTANT-23458;So;0;ON;;;;;N;;;;; +1CD8F;BLOCK OCTANT-123458;So;0;ON;;;;;N;;;;; +1CD90;BLOCK OCTANT-168;So;0;ON;;;;;N;;;;; +1CD91;BLOCK OCTANT-268;So;0;ON;;;;;N;;;;; +1CD92;BLOCK OCTANT-1268;So;0;ON;;;;;N;;;;; +1CD93;BLOCK OCTANT-368;So;0;ON;;;;;N;;;;; +1CD94;BLOCK OCTANT-2368;So;0;ON;;;;;N;;;;; +1CD95;BLOCK OCTANT-12368;So;0;ON;;;;;N;;;;; +1CD96;BLOCK OCTANT-468;So;0;ON;;;;;N;;;;; +1CD97;BLOCK OCTANT-1468;So;0;ON;;;;;N;;;;; +1CD98;BLOCK OCTANT-12468;So;0;ON;;;;;N;;;;; +1CD99;BLOCK OCTANT-3468;So;0;ON;;;;;N;;;;; +1CD9A;BLOCK OCTANT-13468;So;0;ON;;;;;N;;;;; +1CD9B;BLOCK OCTANT-23468;So;0;ON;;;;;N;;;;; +1CD9C;BLOCK OCTANT-568;So;0;ON;;;;;N;;;;; +1CD9D;BLOCK OCTANT-1568;So;0;ON;;;;;N;;;;; +1CD9E;BLOCK OCTANT-2568;So;0;ON;;;;;N;;;;; +1CD9F;BLOCK OCTANT-12568;So;0;ON;;;;;N;;;;; +1CDA0;BLOCK OCTANT-3568;So;0;ON;;;;;N;;;;; +1CDA1;BLOCK OCTANT-13568;So;0;ON;;;;;N;;;;; +1CDA2;BLOCK OCTANT-23568;So;0;ON;;;;;N;;;;; +1CDA3;BLOCK OCTANT-123568;So;0;ON;;;;;N;;;;; +1CDA4;BLOCK OCTANT-4568;So;0;ON;;;;;N;;;;; +1CDA5;BLOCK OCTANT-14568;So;0;ON;;;;;N;;;;; +1CDA6;BLOCK OCTANT-24568;So;0;ON;;;;;N;;;;; +1CDA7;BLOCK OCTANT-124568;So;0;ON;;;;;N;;;;; +1CDA8;BLOCK OCTANT-34568;So;0;ON;;;;;N;;;;; +1CDA9;BLOCK OCTANT-134568;So;0;ON;;;;;N;;;;; +1CDAA;BLOCK OCTANT-234568;So;0;ON;;;;;N;;;;; +1CDAB;BLOCK OCTANT-1234568;So;0;ON;;;;;N;;;;; +1CDAC;BLOCK OCTANT-178;So;0;ON;;;;;N;;;;; +1CDAD;BLOCK OCTANT-278;So;0;ON;;;;;N;;;;; +1CDAE;BLOCK OCTANT-1278;So;0;ON;;;;;N;;;;; +1CDAF;BLOCK OCTANT-378;So;0;ON;;;;;N;;;;; +1CDB0;BLOCK OCTANT-1378;So;0;ON;;;;;N;;;;; +1CDB1;BLOCK OCTANT-2378;So;0;ON;;;;;N;;;;; +1CDB2;BLOCK OCTANT-12378;So;0;ON;;;;;N;;;;; +1CDB3;BLOCK OCTANT-478;So;0;ON;;;;;N;;;;; +1CDB4;BLOCK OCTANT-1478;So;0;ON;;;;;N;;;;; +1CDB5;BLOCK OCTANT-2478;So;0;ON;;;;;N;;;;; +1CDB6;BLOCK OCTANT-12478;So;0;ON;;;;;N;;;;; +1CDB7;BLOCK OCTANT-3478;So;0;ON;;;;;N;;;;; +1CDB8;BLOCK OCTANT-13478;So;0;ON;;;;;N;;;;; +1CDB9;BLOCK OCTANT-23478;So;0;ON;;;;;N;;;;; +1CDBA;BLOCK OCTANT-123478;So;0;ON;;;;;N;;;;; +1CDBB;BLOCK OCTANT-578;So;0;ON;;;;;N;;;;; +1CDBC;BLOCK OCTANT-1578;So;0;ON;;;;;N;;;;; +1CDBD;BLOCK OCTANT-2578;So;0;ON;;;;;N;;;;; +1CDBE;BLOCK OCTANT-12578;So;0;ON;;;;;N;;;;; +1CDBF;BLOCK OCTANT-3578;So;0;ON;;;;;N;;;;; +1CDC0;BLOCK OCTANT-13578;So;0;ON;;;;;N;;;;; +1CDC1;BLOCK OCTANT-23578;So;0;ON;;;;;N;;;;; +1CDC2;BLOCK OCTANT-123578;So;0;ON;;;;;N;;;;; +1CDC3;BLOCK OCTANT-4578;So;0;ON;;;;;N;;;;; +1CDC4;BLOCK OCTANT-14578;So;0;ON;;;;;N;;;;; +1CDC5;BLOCK OCTANT-24578;So;0;ON;;;;;N;;;;; +1CDC6;BLOCK OCTANT-124578;So;0;ON;;;;;N;;;;; +1CDC7;BLOCK OCTANT-34578;So;0;ON;;;;;N;;;;; +1CDC8;BLOCK OCTANT-134578;So;0;ON;;;;;N;;;;; +1CDC9;BLOCK OCTANT-234578;So;0;ON;;;;;N;;;;; +1CDCA;BLOCK OCTANT-1234578;So;0;ON;;;;;N;;;;; +1CDCB;BLOCK OCTANT-678;So;0;ON;;;;;N;;;;; +1CDCC;BLOCK OCTANT-1678;So;0;ON;;;;;N;;;;; +1CDCD;BLOCK OCTANT-2678;So;0;ON;;;;;N;;;;; +1CDCE;BLOCK OCTANT-12678;So;0;ON;;;;;N;;;;; +1CDCF;BLOCK OCTANT-3678;So;0;ON;;;;;N;;;;; +1CDD0;BLOCK OCTANT-13678;So;0;ON;;;;;N;;;;; +1CDD1;BLOCK OCTANT-23678;So;0;ON;;;;;N;;;;; +1CDD2;BLOCK OCTANT-123678;So;0;ON;;;;;N;;;;; +1CDD3;BLOCK OCTANT-4678;So;0;ON;;;;;N;;;;; +1CDD4;BLOCK OCTANT-14678;So;0;ON;;;;;N;;;;; +1CDD5;BLOCK OCTANT-24678;So;0;ON;;;;;N;;;;; +1CDD6;BLOCK OCTANT-124678;So;0;ON;;;;;N;;;;; +1CDD7;BLOCK OCTANT-34678;So;0;ON;;;;;N;;;;; +1CDD8;BLOCK OCTANT-134678;So;0;ON;;;;;N;;;;; +1CDD9;BLOCK OCTANT-234678;So;0;ON;;;;;N;;;;; +1CDDA;BLOCK OCTANT-1234678;So;0;ON;;;;;N;;;;; +1CDDB;BLOCK OCTANT-15678;So;0;ON;;;;;N;;;;; +1CDDC;BLOCK OCTANT-25678;So;0;ON;;;;;N;;;;; +1CDDD;BLOCK OCTANT-125678;So;0;ON;;;;;N;;;;; +1CDDE;BLOCK OCTANT-35678;So;0;ON;;;;;N;;;;; +1CDDF;BLOCK OCTANT-235678;So;0;ON;;;;;N;;;;; +1CDE0;BLOCK OCTANT-1235678;So;0;ON;;;;;N;;;;; +1CDE1;BLOCK OCTANT-45678;So;0;ON;;;;;N;;;;; +1CDE2;BLOCK OCTANT-145678;So;0;ON;;;;;N;;;;; +1CDE3;BLOCK OCTANT-1245678;So;0;ON;;;;;N;;;;; +1CDE4;BLOCK OCTANT-1345678;So;0;ON;;;;;N;;;;; +1CDE5;BLOCK OCTANT-2345678;So;0;ON;;;;;N;;;;; +1CDE6;TOP HALF STANDING PERSON;So;0;ON;;;;;N;;;;; +1CDE7;BOTTOM HALF STANDING PERSON;So;0;ON;;;;;N;;;;; +1CDE8;TOP HALF RIGHT-FACING RUNNER FRAME-1;So;0;ON;;;;;N;;;;; +1CDE9;BOTTOM HALF RIGHT-FACING RUNNER FRAME-1;So;0;ON;;;;;N;;;;; +1CDEA;TOP HALF RIGHT-FACING RUNNER FRAME-2;So;0;ON;;;;;N;;;;; +1CDEB;BOTTOM HALF RIGHT-FACING RUNNER FRAME-2;So;0;ON;;;;;N;;;;; +1CDEC;TOP HALF LEFT-FACING RUNNER FRAME-1;So;0;ON;;;;;N;;;;; +1CDED;BOTTOM HALF LEFT-FACING RUNNER FRAME-1;So;0;ON;;;;;N;;;;; +1CDEE;TOP HALF LEFT-FACING RUNNER FRAME-2;So;0;ON;;;;;N;;;;; +1CDEF;BOTTOM HALF LEFT-FACING RUNNER FRAME-2;So;0;ON;;;;;N;;;;; +1CDF0;TOP HALF FORWARD-FACING RUNNER;So;0;ON;;;;;N;;;;; +1CDF1;BOTTOM HALF FORWARD-FACING RUNNER FRAME-1;So;0;ON;;;;;N;;;;; +1CDF2;BOTTOM HALF FORWARD-FACING RUNNER FRAME-2;So;0;ON;;;;;N;;;;; +1CDF3;BOTTOM HALF FORWARD-FACING RUNNER FRAME-3;So;0;ON;;;;;N;;;;; +1CDF4;BOTTOM HALF FORWARD-FACING RUNNER FRAME-4;So;0;ON;;;;;N;;;;; +1CDF5;MOON LANDER;So;0;ON;;;;;N;;;;; +1CDF6;TOP HALF FLAILING ROBOT FRAME-1;So;0;ON;;;;;N;;;;; +1CDF7;TOP HALF FLAILING ROBOT FRAME-2;So;0;ON;;;;;N;;;;; +1CDF8;DOWN-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1CDF9;LEFT-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1CDFA;SMALL UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1CDFB;UP-POINTING FROG;So;0;ON;;;;;N;;;;; +1CDFC;DOWN-POINTING FROG;So;0;ON;;;;;N;;;;; +1CDFD;EXPLOSION FRAME-1;So;0;ON;;;;;N;;;;; +1CDFE;EXPLOSION FRAME-2;So;0;ON;;;;;N;;;;; +1CDFF;EXPLOSION FRAME-3;So;0;ON;;;;;N;;;;; +1CE00;RIGHT HALF AND LEFT HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1CE01;LOWER HALF AND UPPER HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1CE02;EXPLOSION AT HORIZON;So;0;ON;;;;;N;;;;; +1CE03;UPPER HALF HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1CE04;LOWER HALF HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1CE05;HEAVY WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1CE06;WHITE VERTICAL RECTANGLE WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +1CE07;TOP LEFT BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;;;;; +1CE08;FUNNEL;So;0;ON;;;;;N;;;;; +1CE09;BOX DRAWINGS DOUBLE DIAGONAL LOWER LEFT TO MIDDLE CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1CE0A;BOX DRAWINGS DOUBLE DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1CE0B;LEFT HALF WHITE ELLIPSE;So;0;ON;;;;;N;;;;; +1CE0C;RIGHT HALF WHITE ELLIPSE;So;0;ON;;;;;N;;;;; +1CE0D;LEFT HALF TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;;;;; +1CE0E;RIGHT HALF TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;;;;; +1CE0F;HORIZONTAL LINE WITH TICK MARK;So;0;ON;;;;;N;;;;; +1CE10;LEFT HALF HORIZONTAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE11;RIGHT HALF HORIZONTAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE12;HORIZONTAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE13;LOWER HALF VERTICAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE14;UPPER HALF VERTICAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE15;VERTICAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE16;BOX DRAWINGS LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; +1CE17;BOX DRAWINGS LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +1CE18;BOX DRAWINGS LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; +1CE19;BOX DRAWINGS LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; +1CE1A;LARGE TYPE PIECE UPPER LEFT ARC;So;0;ON;;;;;N;;;;; +1CE1B;LARGE TYPE PIECE UPPER LEFT CORNER;So;0;ON;;;;;N;;;;; +1CE1C;LARGE TYPE PIECE UPPER TERMINAL;So;0;ON;;;;;N;;;;; +1CE1D;LARGE TYPE PIECE UPPER LEFT CROTCH;So;0;ON;;;;;N;;;;; +1CE1E;LARGE TYPE PIECE LEFT ARM;So;0;ON;;;;;N;;;;; +1CE1F;LARGE TYPE PIECE CROSSBAR;So;0;ON;;;;;N;;;;; +1CE20;LARGE TYPE PIECE CROSSBAR WITH LOWER STEM;So;0;ON;;;;;N;;;;; +1CE21;LARGE TYPE PIECE UPPER HALF VERTEX OF M;So;0;ON;;;;;N;;;;; +1CE22;LARGE TYPE PIECE DIAGONAL LOWER LEFT;So;0;ON;;;;;N;;;;; +1CE23;LARGE TYPE PIECE SHORT UPPER TERMINAL;So;0;ON;;;;;N;;;;; +1CE24;LARGE TYPE PIECE UPPER RIGHT ARC;So;0;ON;;;;;N;;;;; +1CE25;LARGE TYPE PIECE RIGHT ARM;So;0;ON;;;;;N;;;;; +1CE26;LARGE TYPE PIECE UPPER RIGHT CROTCH;So;0;ON;;;;;N;;;;; +1CE27;LARGE TYPE PIECE UPPER RIGHT CORNER;So;0;ON;;;;;N;;;;; +1CE28;LARGE TYPE PIECE STEM WITH RIGHT CROSSBAR;So;0;ON;;;;;N;;;;; +1CE29;LARGE TYPE PIECE STEM;So;0;ON;;;;;N;;;;; +1CE2A;LARGE TYPE PIECE DIAGONAL UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +1CE2B;LARGE TYPE PIECE DIAGONAL UPPER RIGHT;So;0;ON;;;;;N;;;;; +1CE2C;LARGE TYPE PIECE DIAGONAL LOWER RIGHT;So;0;ON;;;;;N;;;;; +1CE2D;LARGE TYPE PIECE SHORT LOWER TERMINAL;So;0;ON;;;;;N;;;;; +1CE2E;LARGE TYPE PIECE LOWER LEFT AND UPPER LEFT ARC;So;0;ON;;;;;N;;;;; +1CE2F;LARGE TYPE PIECE CENTRE OF K;So;0;ON;;;;;N;;;;; +1CE30;LARGE TYPE PIECE LOWER HALF VERTEX OF M;So;0;ON;;;;;N;;;;; +1CE31;LARGE TYPE PIECE UPPER HALF VERTEX OF W;So;0;ON;;;;;N;;;;; +1CE32;LARGE TYPE PIECE CENTRE OF X;So;0;ON;;;;;N;;;;; +1CE33;LARGE TYPE PIECE CENTRE OF Y;So;0;ON;;;;;N;;;;; +1CE34;LARGE TYPE PIECE CENTRE OF Z WITH CROSSBAR;So;0;ON;;;;;N;;;;; +1CE35;LARGE TYPE PIECE RAISED UPPER LEFT ARC;So;0;ON;;;;;N;;;;; +1CE36;LARGE TYPE PIECE STEM WITH LEFT CROSSBAR;So;0;ON;;;;;N;;;;; +1CE37;LARGE TYPE PIECE LOWER RIGHT AND UPPER RIGHT ARC;So;0;ON;;;;;N;;;;; +1CE38;LARGE TYPE PIECE DIAGONAL UPPER LEFT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +1CE39;LARGE TYPE PIECE STEM WITH LEFT JOINT;So;0;ON;;;;;N;;;;; +1CE3A;LARGE TYPE PIECE STEM WITH CROSSBAR;So;0;ON;;;;;N;;;;; +1CE3B;LARGE TYPE PIECE DIAGONAL UPPER LEFT;So;0;ON;;;;;N;;;;; +1CE3C;LARGE TYPE PIECE LOWER TERMINAL;So;0;ON;;;;;N;;;;; +1CE3D;LARGE TYPE PIECE LOWER LEFT CORNER;So;0;ON;;;;;N;;;;; +1CE3E;LARGE TYPE PIECE LOWER LEFT ARC;So;0;ON;;;;;N;;;;; +1CE3F;LARGE TYPE PIECE LOWER LEFT CROTCH;So;0;ON;;;;;N;;;;; +1CE40;LARGE TYPE PIECE CROSSBAR WITH UPPER STEM;So;0;ON;;;;;N;;;;; +1CE41;LARGE TYPE PIECE VERTEX OF V;So;0;ON;;;;;N;;;;; +1CE42;LARGE TYPE PIECE LOWER HALF VERTEX OF W;So;0;ON;;;;;N;;;;; +1CE43;LARGE TYPE PIECE LOWER RIGHT ARC;So;0;ON;;;;;N;;;;; +1CE44;LARGE TYPE PIECE LOWER RIGHT CORNER;So;0;ON;;;;;N;;;;; +1CE45;LARGE TYPE PIECE LOWER RIGHT ARC WITH TAIL;So;0;ON;;;;;N;;;;; +1CE46;LARGE TYPE PIECE LOWER RIGHT CROTCH;So;0;ON;;;;;N;;;;; +1CE47;LARGE TYPE PIECE STEM-45;So;0;ON;;;;;N;;;;; +1CE48;LARGE TYPE PIECE STEM-2345;So;0;ON;;;;;N;;;;; +1CE49;LARGE TYPE PIECE STEM-4;So;0;ON;;;;;N;;;;; +1CE4A;LARGE TYPE PIECE STEM-34;So;0;ON;;;;;N;;;;; +1CE4B;LARGE TYPE PIECE STEM-234;So;0;ON;;;;;N;;;;; +1CE4C;LARGE TYPE PIECE STEM-1234;So;0;ON;;;;;N;;;;; +1CE4D;LARGE TYPE PIECE STEM-3;So;0;ON;;;;;N;;;;; +1CE4E;LARGE TYPE PIECE STEM-23;So;0;ON;;;;;N;;;;; +1CE4F;LARGE TYPE PIECE STEM-2;So;0;ON;;;;;N;;;;; +1CE50;LARGE TYPE PIECE STEM-12;So;0;ON;;;;;N;;;;; +1CE51;SEPARATED BLOCK SEXTANT-1;So;0;ON;;;;;N;;;;; +1CE52;SEPARATED BLOCK SEXTANT-2;So;0;ON;;;;;N;;;;; +1CE53;SEPARATED BLOCK SEXTANT-12;So;0;ON;;;;;N;;;;; +1CE54;SEPARATED BLOCK SEXTANT-3;So;0;ON;;;;;N;;;;; +1CE55;SEPARATED BLOCK SEXTANT-13;So;0;ON;;;;;N;;;;; +1CE56;SEPARATED BLOCK SEXTANT-23;So;0;ON;;;;;N;;;;; +1CE57;SEPARATED BLOCK SEXTANT-123;So;0;ON;;;;;N;;;;; +1CE58;SEPARATED BLOCK SEXTANT-4;So;0;ON;;;;;N;;;;; +1CE59;SEPARATED BLOCK SEXTANT-14;So;0;ON;;;;;N;;;;; +1CE5A;SEPARATED BLOCK SEXTANT-24;So;0;ON;;;;;N;;;;; +1CE5B;SEPARATED BLOCK SEXTANT-124;So;0;ON;;;;;N;;;;; +1CE5C;SEPARATED BLOCK SEXTANT-34;So;0;ON;;;;;N;;;;; +1CE5D;SEPARATED BLOCK SEXTANT-134;So;0;ON;;;;;N;;;;; +1CE5E;SEPARATED BLOCK SEXTANT-234;So;0;ON;;;;;N;;;;; +1CE5F;SEPARATED BLOCK SEXTANT-1234;So;0;ON;;;;;N;;;;; +1CE60;SEPARATED BLOCK SEXTANT-5;So;0;ON;;;;;N;;;;; +1CE61;SEPARATED BLOCK SEXTANT-15;So;0;ON;;;;;N;;;;; +1CE62;SEPARATED BLOCK SEXTANT-25;So;0;ON;;;;;N;;;;; +1CE63;SEPARATED BLOCK SEXTANT-125;So;0;ON;;;;;N;;;;; +1CE64;SEPARATED BLOCK SEXTANT-35;So;0;ON;;;;;N;;;;; +1CE65;SEPARATED BLOCK SEXTANT-135;So;0;ON;;;;;N;;;;; +1CE66;SEPARATED BLOCK SEXTANT-235;So;0;ON;;;;;N;;;;; +1CE67;SEPARATED BLOCK SEXTANT-1235;So;0;ON;;;;;N;;;;; +1CE68;SEPARATED BLOCK SEXTANT-45;So;0;ON;;;;;N;;;;; +1CE69;SEPARATED BLOCK SEXTANT-145;So;0;ON;;;;;N;;;;; +1CE6A;SEPARATED BLOCK SEXTANT-245;So;0;ON;;;;;N;;;;; +1CE6B;SEPARATED BLOCK SEXTANT-1245;So;0;ON;;;;;N;;;;; +1CE6C;SEPARATED BLOCK SEXTANT-345;So;0;ON;;;;;N;;;;; +1CE6D;SEPARATED BLOCK SEXTANT-1345;So;0;ON;;;;;N;;;;; +1CE6E;SEPARATED BLOCK SEXTANT-2345;So;0;ON;;;;;N;;;;; +1CE6F;SEPARATED BLOCK SEXTANT-12345;So;0;ON;;;;;N;;;;; +1CE70;SEPARATED BLOCK SEXTANT-6;So;0;ON;;;;;N;;;;; +1CE71;SEPARATED BLOCK SEXTANT-16;So;0;ON;;;;;N;;;;; +1CE72;SEPARATED BLOCK SEXTANT-26;So;0;ON;;;;;N;;;;; +1CE73;SEPARATED BLOCK SEXTANT-126;So;0;ON;;;;;N;;;;; +1CE74;SEPARATED BLOCK SEXTANT-36;So;0;ON;;;;;N;;;;; +1CE75;SEPARATED BLOCK SEXTANT-136;So;0;ON;;;;;N;;;;; +1CE76;SEPARATED BLOCK SEXTANT-236;So;0;ON;;;;;N;;;;; +1CE77;SEPARATED BLOCK SEXTANT-1236;So;0;ON;;;;;N;;;;; +1CE78;SEPARATED BLOCK SEXTANT-46;So;0;ON;;;;;N;;;;; +1CE79;SEPARATED BLOCK SEXTANT-146;So;0;ON;;;;;N;;;;; +1CE7A;SEPARATED BLOCK SEXTANT-246;So;0;ON;;;;;N;;;;; +1CE7B;SEPARATED BLOCK SEXTANT-1246;So;0;ON;;;;;N;;;;; +1CE7C;SEPARATED BLOCK SEXTANT-346;So;0;ON;;;;;N;;;;; +1CE7D;SEPARATED BLOCK SEXTANT-1346;So;0;ON;;;;;N;;;;; +1CE7E;SEPARATED BLOCK SEXTANT-2346;So;0;ON;;;;;N;;;;; +1CE7F;SEPARATED BLOCK SEXTANT-12346;So;0;ON;;;;;N;;;;; +1CE80;SEPARATED BLOCK SEXTANT-56;So;0;ON;;;;;N;;;;; +1CE81;SEPARATED BLOCK SEXTANT-156;So;0;ON;;;;;N;;;;; +1CE82;SEPARATED BLOCK SEXTANT-256;So;0;ON;;;;;N;;;;; +1CE83;SEPARATED BLOCK SEXTANT-1256;So;0;ON;;;;;N;;;;; +1CE84;SEPARATED BLOCK SEXTANT-356;So;0;ON;;;;;N;;;;; +1CE85;SEPARATED BLOCK SEXTANT-1356;So;0;ON;;;;;N;;;;; +1CE86;SEPARATED BLOCK SEXTANT-2356;So;0;ON;;;;;N;;;;; +1CE87;SEPARATED BLOCK SEXTANT-12356;So;0;ON;;;;;N;;;;; +1CE88;SEPARATED BLOCK SEXTANT-456;So;0;ON;;;;;N;;;;; +1CE89;SEPARATED BLOCK SEXTANT-1456;So;0;ON;;;;;N;;;;; +1CE8A;SEPARATED BLOCK SEXTANT-2456;So;0;ON;;;;;N;;;;; +1CE8B;SEPARATED BLOCK SEXTANT-12456;So;0;ON;;;;;N;;;;; +1CE8C;SEPARATED BLOCK SEXTANT-3456;So;0;ON;;;;;N;;;;; +1CE8D;SEPARATED BLOCK SEXTANT-13456;So;0;ON;;;;;N;;;;; +1CE8E;SEPARATED BLOCK SEXTANT-23456;So;0;ON;;;;;N;;;;; +1CE8F;SEPARATED BLOCK SEXTANT-123456;So;0;ON;;;;;N;;;;; +1CE90;UPPER LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE91;UPPER CENTRE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE92;UPPER CENTRE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE93;UPPER RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE94;UPPER MIDDLE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE95;UPPER MIDDLE CENTRE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE96;UPPER MIDDLE CENTRE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE97;UPPER MIDDLE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE98;LOWER MIDDLE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE99;LOWER MIDDLE CENTRE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9A;LOWER MIDDLE CENTRE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9B;LOWER MIDDLE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9C;LOWER LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9D;LOWER CENTRE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9E;LOWER CENTRE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9F;LOWER RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CEA0;RIGHT HALF LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA1;RIGHT THREE QUARTERS LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA2;LEFT THREE QUARTERS LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA3;LEFT HALF LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA4;LOWER HALF LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA5;LOWER THREE QUARTERS LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA6;UPPER THREE QUARTERS LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA7;UPPER HALF LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA8;LEFT HALF UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA9;LEFT THREE QUARTERS UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAA;RIGHT THREE QUARTERS UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAB;RIGHT HALF UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAC;UPPER HALF RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAD;UPPER THREE QUARTERS RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAE;LOWER THREE QUARTERS RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAF;LOWER HALF RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEB0;HORIZONTAL ZIGZAG LINE;So;0;ON;;;;;N;;;;; +1CEB1;KEYHOLE;So;0;ON;;;;;N;;;;; +1CEB2;OLD PERSONAL COMPUTER WITH MONITOR IN PORTRAIT ORIENTATION;So;0;ON;;;;;N;;;;; +1CEB3;BLACK RIGHT TRIANGLE CARET;So;0;ON;;;;;N;;;;; +1CEBA;FRAGILE SYMBOL;So;0;ON;;;;;N;;;;; +1CEBB;OFFICE BUILDING SYMBOL;So;0;ON;;;;;N;;;;; +1CEBC;TREE SYMBOL;So;0;ON;;;;;N;;;;; +1CEBD;APPLE SYMBOL;So;0;ON;;;;;N;;;;; +1CEBE;CHERRY SYMBOL;So;0;ON;;;;;N;;;;; +1CEBF;STRAWBERRY SYMBOL;So;0;ON;;;;;N;;;;; +1CEC0;HEBE;So;0;ON;;;;;N;;;;; +1CEC1;IRIS;So;0;ON;;;;;N;;;;; +1CEC2;FLORA;So;0;ON;;;;;N;;;;; +1CEC3;METIS;So;0;ON;;;;;N;;;;; +1CEC4;PARTHENOPE;So;0;ON;;;;;N;;;;; +1CEC5;VICTORIA;So;0;ON;;;;;N;;;;; +1CEC6;EGERIA;So;0;ON;;;;;N;;;;; +1CEC7;IRENE;So;0;ON;;;;;N;;;;; +1CEC8;EUNOMIA;So;0;ON;;;;;N;;;;; +1CEC9;PSYCHE;So;0;ON;;;;;N;;;;; +1CECA;THETIS;So;0;ON;;;;;N;;;;; +1CECB;MELPOMENE;So;0;ON;;;;;N;;;;; +1CECC;FORTUNA;So;0;ON;;;;;N;;;;; +1CECD;ASTRONOMICAL SYMBOL FOR ASTEROID PROSERPINA;So;0;ON;;;;;N;;;;; +1CECE;BELLONA;So;0;ON;;;;;N;;;;; +1CECF;AMPHITRITE;So;0;ON;;;;;N;;;;; +1CED0;LEUKOTHEA;So;0;ON;;;;;N;;;;; +1CEE0;GEOMANTIC FIGURE POPULUS;So;0;ON;;;;;N;;;;; +1CEE1;GEOMANTIC FIGURE TRISTITIA;So;0;ON;;;;;N;;;;; +1CEE2;GEOMANTIC FIGURE ALBUS;So;0;ON;;;;;N;;;;; +1CEE3;GEOMANTIC FIGURE FORTUNA MAJOR;So;0;ON;;;;;N;;;;; +1CEE4;GEOMANTIC FIGURE RUBEUS;So;0;ON;;;;;N;;;;; +1CEE5;GEOMANTIC FIGURE ACQUISITIO;So;0;ON;;;;;N;;;;; +1CEE6;GEOMANTIC FIGURE CONJUNCTIO;So;0;ON;;;;;N;;;;; +1CEE7;GEOMANTIC FIGURE CAPUT DRACONIS;So;0;ON;;;;;N;;;;; +1CEE8;GEOMANTIC FIGURE LAETITIA;So;0;ON;;;;;N;;;;; +1CEE9;GEOMANTIC FIGURE CARCER;So;0;ON;;;;;N;;;;; +1CEEA;GEOMANTIC FIGURE AMISSIO;So;0;ON;;;;;N;;;;; +1CEEB;GEOMANTIC FIGURE PUELLA;So;0;ON;;;;;N;;;;; +1CEEC;GEOMANTIC FIGURE FORTUNA MINOR;So;0;ON;;;;;N;;;;; +1CEED;GEOMANTIC FIGURE PUER;So;0;ON;;;;;N;;;;; +1CEEE;GEOMANTIC FIGURE CAUDA DRACONIS;So;0;ON;;;;;N;;;;; +1CEEF;GEOMANTIC FIGURE VIA;So;0;ON;;;;;N;;;;; +1CEF0;MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +1CF00;ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF01;ZNAMENNY COMBINING MARK NIZKO S KRYZHEM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF02;ZNAMENNY COMBINING MARK TSATA ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF03;ZNAMENNY COMBINING MARK GORAZDO NIZKO ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF04;ZNAMENNY COMBINING MARK NIZKO ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF05;ZNAMENNY COMBINING MARK SREDNE ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF06;ZNAMENNY COMBINING MARK MALO POVYSHE ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF07;ZNAMENNY COMBINING MARK POVYSHE ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF08;ZNAMENNY COMBINING MARK VYSOKO ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF09;ZNAMENNY COMBINING MARK MALO POVYSHE S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF0A;ZNAMENNY COMBINING MARK POVYSHE S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF0B;ZNAMENNY COMBINING MARK VYSOKO S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF0C;ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF0D;ZNAMENNY COMBINING MARK NIZKO S KRYZHEM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF0E;ZNAMENNY COMBINING MARK TSATA ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF0F;ZNAMENNY COMBINING MARK GORAZDO NIZKO ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF10;ZNAMENNY COMBINING MARK NIZKO ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF11;ZNAMENNY COMBINING MARK SREDNE ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF12;ZNAMENNY COMBINING MARK MALO POVYSHE ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF13;ZNAMENNY COMBINING MARK POVYSHE ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF14;ZNAMENNY COMBINING MARK VYSOKO ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF15;ZNAMENNY COMBINING MARK MALO POVYSHE S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF16;ZNAMENNY COMBINING MARK POVYSHE S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF17;ZNAMENNY COMBINING MARK VYSOKO S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF18;ZNAMENNY COMBINING MARK TSATA S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF19;ZNAMENNY COMBINING MARK MALO POVYSHE S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF1A;ZNAMENNY COMBINING MARK STRANNO MALO POVYSHE;Mn;0;NSM;;;;;N;;;;; +1CF1B;ZNAMENNY COMBINING MARK POVYSHE S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF1C;ZNAMENNY COMBINING MARK POVYSHE STRANNO;Mn;0;NSM;;;;;N;;;;; +1CF1D;ZNAMENNY COMBINING MARK VYSOKO S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF1E;ZNAMENNY COMBINING MARK MALO POVYSHE STRANNO;Mn;0;NSM;;;;;N;;;;; +1CF1F;ZNAMENNY COMBINING MARK GORAZDO VYSOKO;Mn;0;NSM;;;;;N;;;;; +1CF20;ZNAMENNY COMBINING MARK ZELO;Mn;0;NSM;;;;;N;;;;; +1CF21;ZNAMENNY COMBINING MARK ON;Mn;0;NSM;;;;;N;;;;; +1CF22;ZNAMENNY COMBINING MARK RAVNO;Mn;0;NSM;;;;;N;;;;; +1CF23;ZNAMENNY COMBINING MARK TIKHAYA;Mn;0;NSM;;;;;N;;;;; +1CF24;ZNAMENNY COMBINING MARK BORZAYA;Mn;0;NSM;;;;;N;;;;; +1CF25;ZNAMENNY COMBINING MARK UDARKA;Mn;0;NSM;;;;;N;;;;; +1CF26;ZNAMENNY COMBINING MARK PODVERTKA;Mn;0;NSM;;;;;N;;;;; +1CF27;ZNAMENNY COMBINING MARK LOMKA;Mn;0;NSM;;;;;N;;;;; +1CF28;ZNAMENNY COMBINING MARK KUPNAYA;Mn;0;NSM;;;;;N;;;;; +1CF29;ZNAMENNY COMBINING MARK KACHKA;Mn;0;NSM;;;;;N;;;;; +1CF2A;ZNAMENNY COMBINING MARK ZEVOK;Mn;0;NSM;;;;;N;;;;; +1CF2B;ZNAMENNY COMBINING MARK SKOBA;Mn;0;NSM;;;;;N;;;;; +1CF2C;ZNAMENNY COMBINING MARK RAZSEKA;Mn;0;NSM;;;;;N;;;;; +1CF2D;ZNAMENNY COMBINING MARK KRYZH ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF30;ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO;Mn;0;NSM;;;;;N;;;;; +1CF31;ZNAMENNY COMBINING TONAL RANGE MARK SVETLO;Mn;0;NSM;;;;;N;;;;; +1CF32;ZNAMENNY COMBINING TONAL RANGE MARK TRESVETLO;Mn;0;NSM;;;;;N;;;;; +1CF33;ZNAMENNY COMBINING MARK ZADERZHKA;Mn;0;NSM;;;;;N;;;;; +1CF34;ZNAMENNY COMBINING MARK DEMESTVENNY ZADERZHKA;Mn;0;NSM;;;;;N;;;;; +1CF35;ZNAMENNY COMBINING MARK OTSECHKA;Mn;0;NSM;;;;;N;;;;; +1CF36;ZNAMENNY COMBINING MARK PODCHASHIE;Mn;0;NSM;;;;;N;;;;; +1CF37;ZNAMENNY COMBINING MARK PODCHASHIE WITH VERTICAL STROKE;Mn;0;NSM;;;;;N;;;;; +1CF38;ZNAMENNY COMBINING MARK CHASHKA;Mn;0;NSM;;;;;N;;;;; +1CF39;ZNAMENNY COMBINING MARK CHASHKA POLNAYA;Mn;0;NSM;;;;;N;;;;; +1CF3A;ZNAMENNY COMBINING MARK OBLACHKO;Mn;0;NSM;;;;;N;;;;; +1CF3B;ZNAMENNY COMBINING MARK SOROCHYA NOZHKA;Mn;0;NSM;;;;;N;;;;; +1CF3C;ZNAMENNY COMBINING MARK TOCHKA;Mn;0;NSM;;;;;N;;;;; +1CF3D;ZNAMENNY COMBINING MARK DVOETOCHIE;Mn;0;NSM;;;;;N;;;;; +1CF3E;ZNAMENNY COMBINING ATTACHING VERTICAL OMET;Mn;0;NSM;;;;;N;;;;; +1CF3F;ZNAMENNY COMBINING MARK CURVED OMET;Mn;0;NSM;;;;;N;;;;; +1CF40;ZNAMENNY COMBINING MARK KRYZH;Mn;0;NSM;;;;;N;;;;; +1CF41;ZNAMENNY COMBINING LOWER TONAL RANGE INDICATOR;Mn;0;NSM;;;;;N;;;;; +1CF42;ZNAMENNY PRIZNAK MODIFIER LEVEL-2;Mn;0;NSM;;;;;N;;;;; +1CF43;ZNAMENNY PRIZNAK MODIFIER LEVEL-3;Mn;0;NSM;;;;;N;;;;; +1CF44;ZNAMENNY PRIZNAK MODIFIER DIRECTION FLIP;Mn;0;NSM;;;;;N;;;;; +1CF45;ZNAMENNY PRIZNAK MODIFIER KRYZH;Mn;0;NSM;;;;;N;;;;; +1CF46;ZNAMENNY PRIZNAK MODIFIER ROG;Mn;0;NSM;;;;;N;;;;; +1CF50;ZNAMENNY NEUME KRYUK;So;0;L;;;;;N;;;;; +1CF51;ZNAMENNY NEUME KRYUK TIKHY;So;0;L;;;;;N;;;;; +1CF52;ZNAMENNY NEUME PARAKLIT;So;0;L;;;;;N;;;;; +1CF53;ZNAMENNY NEUME DVA V CHELNU;So;0;L;;;;;N;;;;; +1CF54;ZNAMENNY NEUME KLYUCH;So;0;L;;;;;N;;;;; +1CF55;ZNAMENNY NEUME ZANOZHEK;So;0;L;;;;;N;;;;; +1CF56;ZNAMENNY NEUME STOPITSA;So;0;L;;;;;N;;;;; +1CF57;ZNAMENNY NEUME STOPITSA S OCHKOM;So;0;L;;;;;N;;;;; +1CF58;ZNAMENNY NEUME PEREVODKA;So;0;L;;;;;N;;;;; +1CF59;ZNAMENNY NEUME PEREVODKA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF5A;ZNAMENNY NEUME STOPITSA WITH SOROCHYA NOZHKA;So;0;L;;;;;N;;;;; +1CF5B;ZNAMENNY NEUME CHELYUSTKA;So;0;L;;;;;N;;;;; +1CF5C;ZNAMENNY NEUME PALKA;So;0;L;;;;;N;;;;; +1CF5D;ZNAMENNY NEUME ZAPYATAYA;So;0;L;;;;;N;;;;; +1CF5E;ZNAMENNY NEUME GOLUBCHIK BORZY;So;0;L;;;;;N;;;;; +1CF5F;ZNAMENNY NEUME GOLUBCHIK TIKHY;So;0;L;;;;;N;;;;; +1CF60;ZNAMENNY NEUME GOLUBCHIK MRACHNY;So;0;L;;;;;N;;;;; +1CF61;ZNAMENNY NEUME GOLUBCHIK SVETLY;So;0;L;;;;;N;;;;; +1CF62;ZNAMENNY NEUME GOLUBCHIK TRESVETLY;So;0;L;;;;;N;;;;; +1CF63;ZNAMENNY NEUME VRAKHIYA PROSTAYA;So;0;L;;;;;N;;;;; +1CF64;ZNAMENNY NEUME VRAKHIYA MRACHNAYA;So;0;L;;;;;N;;;;; +1CF65;ZNAMENNY NEUME VRAKHIYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF66;ZNAMENNY NEUME VRAKHIYA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CF67;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA PROSTAYA;So;0;L;;;;;N;;;;; +1CF68;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA MRACHNAYA;So;0;L;;;;;N;;;;; +1CF69;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF6A;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CF6B;ZNAMENNY NEUME DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CF6C;ZNAMENNY NEUME REVERSED CHELYUSTKA;So;0;L;;;;;N;;;;; +1CF6D;ZNAMENNY NEUME DERBITSA;So;0;L;;;;;N;;;;; +1CF6E;ZNAMENNY NEUME KHAMILO;So;0;L;;;;;N;;;;; +1CF6F;ZNAMENNY NEUME CHASHKA;So;0;L;;;;;N;;;;; +1CF70;ZNAMENNY NEUME PODCHASHIE;So;0;L;;;;;N;;;;; +1CF71;ZNAMENNY NEUME SKAMEYTSA MRACHNAYA;So;0;L;;;;;N;;;;; +1CF72;ZNAMENNY NEUME SKAMEYTSA SVETLAYA;So;0;L;;;;;N;;;;; +1CF73;ZNAMENNY NEUME SKAMEYTSA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CF74;ZNAMENNY NEUME SKAMEYTSA TIKHAYA;So;0;L;;;;;N;;;;; +1CF75;ZNAMENNY NEUME DEMESTVENNY KLYUCH;So;0;L;;;;;N;;;;; +1CF76;ZNAMENNY NEUME SKAMEYTSA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF77;ZNAMENNY NEUME SKAMEYTSA KLYUCHENEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF78;ZNAMENNY NEUME SKAMEYTSA KLYUCHEVAYA TIKHAYA;So;0;L;;;;;N;;;;; +1CF79;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA PROSTAYA;So;0;L;;;;;N;;;;; +1CF7A;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF7B;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF7C;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;; +1CF7D;ZNAMENNY NEUME SLOZHITIE;So;0;L;;;;;N;;;;; +1CF7E;ZNAMENNY NEUME SLOZHITIE S ZAPYATOY;So;0;L;;;;;N;;;;; +1CF7F;ZNAMENNY NEUME SLOZHITIE ZAKRYTOE;So;0;L;;;;;N;;;;; +1CF80;ZNAMENNY NEUME SLOZHITIE S KRYZHEM;So;0;L;;;;;N;;;;; +1CF81;ZNAMENNY NEUME KRYZH;So;0;L;;;;;N;;;;; +1CF82;ZNAMENNY NEUME ROG;So;0;L;;;;;N;;;;; +1CF83;ZNAMENNY NEUME FITA;So;0;L;;;;;N;;;;; +1CF84;ZNAMENNY NEUME KOBYLA;So;0;L;;;;;N;;;;; +1CF85;ZNAMENNY NEUME ZMEYTSA;So;0;L;;;;;N;;;;; +1CF86;ZNAMENNY NEUME STATYA;So;0;L;;;;;N;;;;; +1CF87;ZNAMENNY NEUME STATYA S ZAPYATOY;So;0;L;;;;;N;;;;; +1CF88;ZNAMENNY NEUME STATYA S KRYZHEM;So;0;L;;;;;N;;;;; +1CF89;ZNAMENNY NEUME STATYA S ZAPYATOY I KRYZHEM;So;0;L;;;;;N;;;;; +1CF8A;ZNAMENNY NEUME STATYA S KRYZHEM I ZAPYATOY;So;0;L;;;;;N;;;;; +1CF8B;ZNAMENNY NEUME STATYA ZAKRYTAYA;So;0;L;;;;;N;;;;; +1CF8C;ZNAMENNY NEUME STATYA ZAKRYTAYA S ZAPYATOY;So;0;L;;;;;N;;;;; +1CF8D;ZNAMENNY NEUME STATYA S ROGOM;So;0;L;;;;;N;;;;; +1CF8E;ZNAMENNY NEUME STATYA S DVUMYA ZAPYATYMI;So;0;L;;;;;N;;;;; +1CF8F;ZNAMENNY NEUME STATYA S ZAPYATOY I PODCHASHIEM;So;0;L;;;;;N;;;;; +1CF90;ZNAMENNY NEUME POLKULIZMY;So;0;L;;;;;N;;;;; +1CF91;ZNAMENNY NEUME STATYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF92;ZNAMENNY NEUME STRELA PROSTAYA;So;0;L;;;;;N;;;;; +1CF93;ZNAMENNY NEUME STRELA MRACHNOTIKHAYA;So;0;L;;;;;N;;;;; +1CF94;ZNAMENNY NEUME STRELA KRYZHEVAYA;So;0;L;;;;;N;;;;; +1CF95;ZNAMENNY NEUME STRELA POLUPOVODNAYA;So;0;L;;;;;N;;;;; +1CF96;ZNAMENNY NEUME STRELA POVODNAYA;So;0;L;;;;;N;;;;; +1CF97;ZNAMENNY NEUME STRELA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF98;ZNAMENNY NEUME STRELA KLYUCHEPOVODNAYA;So;0;L;;;;;N;;;;; +1CF99;ZNAMENNY NEUME STRELA KLYUCHENEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF9A;ZNAMENNY NEUME STRELA TIKHAYA PUTNAYA;So;0;L;;;;;N;;;;; +1CF9B;ZNAMENNY NEUME STRELA DVOECHELNAYA;So;0;L;;;;;N;;;;; +1CF9C;ZNAMENNY NEUME STRELA DVOECHELNOKRYZHEVAYA;So;0;L;;;;;N;;;;; +1CF9D;ZNAMENNY NEUME STRELA DVOECHELNOPOVODNAYA;So;0;L;;;;;N;;;;; +1CF9E;ZNAMENNY NEUME STRELA DVOECHELNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;; +1CF9F;ZNAMENNY NEUME STRELA DVOECHELNOPOVODNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;; +1CFA0;ZNAMENNY NEUME STRELA GROMNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFA1;ZNAMENNY NEUME STRELA GROMOPOVODNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFA2;ZNAMENNY NEUME STRELA GROMNAYA;So;0;L;;;;;N;;;;; +1CFA3;ZNAMENNY NEUME STRELA GROMOPOVODNAYA;So;0;L;;;;;N;;;;; +1CFA4;ZNAMENNY NEUME STRELA GROMOPOVODNAYA WITH DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFA5;ZNAMENNY NEUME STRELA GROMOKRYZHEVAYA;So;0;L;;;;;N;;;;; +1CFA6;ZNAMENNY NEUME STRELA GROMOKRYZHEVAYA POVODNAYA;So;0;L;;;;;N;;;;; +1CFA7;ZNAMENNY NEUME MECHIK;So;0;L;;;;;N;;;;; +1CFA8;ZNAMENNY NEUME MECHIK POVODNY;So;0;L;;;;;N;;;;; +1CFA9;ZNAMENNY NEUME MECHIK KLYUCHEVOY;So;0;L;;;;;N;;;;; +1CFAA;ZNAMENNY NEUME MECHIK KLYUCHEPOVODNY;So;0;L;;;;;N;;;;; +1CFAB;ZNAMENNY NEUME MECHIK KLYUCHENEPOSTOYANNY;So;0;L;;;;;N;;;;; +1CFAC;ZNAMENNY NEUME STRELA TRYASOGLASNAYA;So;0;L;;;;;N;;;;; +1CFAD;ZNAMENNY NEUME STRELA TRYASOPOVODNAYA;So;0;L;;;;;N;;;;; +1CFAE;ZNAMENNY NEUME STRELA TRYASOSTRELNAYA;So;0;L;;;;;N;;;;; +1CFAF;ZNAMENNY NEUME OSOKA;So;0;L;;;;;N;;;;; +1CFB0;ZNAMENNY NEUME OSOKA SVETLAYA;So;0;L;;;;;N;;;;; +1CFB1;ZNAMENNY NEUME OSOKA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CFB2;ZNAMENNY NEUME OSOKA KRYUKOVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CFB3;ZNAMENNY NEUME OSOKA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CFB4;ZNAMENNY NEUME OSOKA KLYUCHEVAYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CFB5;ZNAMENNY NEUME STRELA KRYUKOVAYA;So;0;L;;;;;N;;;;; +1CFB6;ZNAMENNY NEUME STRELA KRYUKOVAYA POVODNAYA;So;0;L;;;;;N;;;;; +1CFB7;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFB8;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFB9;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMNAYA;So;0;L;;;;;N;;;;; +1CFBA;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA;So;0;L;;;;;N;;;;; +1CFBB;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA WITH DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFBC;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOKRYZHEVAYA;So;0;L;;;;;N;;;;; +1CFBD;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOKRYZHEVAYA POVODNAYA;So;0;L;;;;;N;;;;; +1CFBE;ZNAMENNY NEUME STRELA KRYUKOVAYA TRYASKA;So;0;L;;;;;N;;;;; +1CFBF;ZNAMENNY NEUME KUFISMA;So;0;L;;;;;N;;;;; +1CFC0;ZNAMENNY NEUME OBLAKO;So;0;L;;;;;N;;;;; +1CFC1;ZNAMENNY NEUME DUDA;So;0;L;;;;;N;;;;; +1CFC2;ZNAMENNY NEUME NEMKA;So;0;L;;;;;N;;;;; +1CFC3;ZNAMENNY NEUME PAUK;So;0;L;;;;;N;;;;; +1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; +1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; +1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; +1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; +1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; +1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; +1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; +1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; +1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; +1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; +1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; +1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; +1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; +1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; +1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; +1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; +1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; +1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; +1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; +1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; +1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; +1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; +1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; +1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; +1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; +1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; +1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; +1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; +1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; +1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; +1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; +1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; +1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; +1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; +1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; +1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; +1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; +1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; +1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; +1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; +1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; +1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; +1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; +1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; +1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; +1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; +1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; +1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; +1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; +1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; +1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; +1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; +1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; +1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; +1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; +1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; +1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; +1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; +1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; +1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; +1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; +1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; +1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; +1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; +1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; +1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; +1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; +1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; +1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; +1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; +1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; +1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; +1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; +1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; +1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; +1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; +1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; +1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; +1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; +1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; +1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; +1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; +1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; +1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; +1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; +1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; +1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; +1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; +1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; +1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; +1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; +1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; +1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; +1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; +1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; +1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; +1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; +1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; +1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; +1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; +1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; +1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; +1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; +1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; +1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; +1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; +1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; +1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; +1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; +1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; +1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; +1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; +1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; +1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; +1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; +1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; +1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; +1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; +1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; +1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; +1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; +1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; +1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; +1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; +1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; +1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; +1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; +1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; +1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; +1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; +1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; +1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; +1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; +1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; +1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; +1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; +1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; +1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; +1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; +1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; +1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; +1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; +1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; +1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; +1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; +1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; +1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; +1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; +1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; +1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; +1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; +1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; +1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; +1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; +1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; +1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; +1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; +1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; +1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; +1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; +1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; +1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; +1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; +1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; +1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; +1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; +1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; +1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; +1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; +1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; +1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; +1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; +1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; +1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; +1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; +1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; +1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; +1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; +1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; +1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; +1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; +1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; +1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; +1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; +1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; +1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; +1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; +1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; +1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; +1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; +1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; +1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; +1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; +1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; +1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; +1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; +1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; +1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; +1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; +1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; +1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; +1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; +1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; +1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; +1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; +1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; +1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; +1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; +1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; +1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; +1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; +1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; +1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; +1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; +1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; +1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; +1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; +1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; +1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; +1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; +1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; +1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; +1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; +1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; +1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; +1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; +1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; +1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; +1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; +1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; +1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; +1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; +1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; +1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; +1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; +1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; +1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; +1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; +1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; +1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; +1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; +1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; +1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; +1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; +1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; +1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; +1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; +1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; +1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; +1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; +1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; +1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; +1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; +1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; +1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; +1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; +1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; +1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; +1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; +1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; +1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; +1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; +1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; +1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; +1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; +1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; +1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; +1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; +1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; +1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; +1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; +1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; +1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; +1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; +1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; +1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; +1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; +1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; +1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; +1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; +1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; +1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; +1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; +1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; +1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; +1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; +1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; +1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; +1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; +1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; +1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; +1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; +1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; +1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; +1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; +1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; +1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; +1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; +1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; +1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; +1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; +1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; +1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; +1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; +1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; +1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; +1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; +1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; +1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; +1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; +1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; +1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; +1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; +1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; +1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; +1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; +1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; +1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; +1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; +1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; +1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; +1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; +1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; +1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; +1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; +1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; +1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; +1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; +1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; +1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; +1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; +1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; +1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; +1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; +1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; +1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; +1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; +1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; +1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; +1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; +1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; +1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; +1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; +1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; +1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; +1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; +1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; +1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; +1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; +1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; +1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; +1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; +1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; +1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; +1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; +1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; +1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; +1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; +1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; +1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; +1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; +1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; +1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; +1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; +1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; +1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; +1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; +1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; +1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; +1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; +1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; +1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; +1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; +1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; +1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; +1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; +1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; +1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; +1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; +1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; +1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; +1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; +1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; +1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; +1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; +1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; +1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; +1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; +1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; +1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; +1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; +1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; +1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; +1D1DE;MUSICAL SYMBOL KIEVAN C CLEF;So;0;L;;;;;N;;;;; +1D1DF;MUSICAL SYMBOL KIEVAN END OF PIECE;So;0;L;;;;;N;;;;; +1D1E0;MUSICAL SYMBOL KIEVAN FINAL NOTE;So;0;L;;;;;N;;;;; +1D1E1;MUSICAL SYMBOL KIEVAN RECITATIVE MARK;So;0;L;;;;;N;;;;; +1D1E2;MUSICAL SYMBOL KIEVAN WHOLE NOTE;So;0;L;;;;;N;;;;; +1D1E3;MUSICAL SYMBOL KIEVAN HALF NOTE;So;0;L;;;;;N;;;;; +1D1E4;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E5;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;; +1D1E9;MUSICAL SYMBOL SORI;So;0;ON;;;;;N;;;;; +1D1EA;MUSICAL SYMBOL KORON;So;0;ON;;;;;N;;;;; +1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; +1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; +1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; +1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; +1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; +1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; +1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; +1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; +1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; +1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; +1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; +1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; +1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; +1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; +1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; +1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; +1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; +1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; +1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; +1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; +1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; +1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; +1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; +1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; +1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; +1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; +1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; +1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; +1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; +1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D2C0;KAKTOVIK NUMERAL ZERO;No;0;L;;;;0;N;;;;; +1D2C1;KAKTOVIK NUMERAL ONE;No;0;L;;;;1;N;;;;; +1D2C2;KAKTOVIK NUMERAL TWO;No;0;L;;;;2;N;;;;; +1D2C3;KAKTOVIK NUMERAL THREE;No;0;L;;;;3;N;;;;; +1D2C4;KAKTOVIK NUMERAL FOUR;No;0;L;;;;4;N;;;;; +1D2C5;KAKTOVIK NUMERAL FIVE;No;0;L;;;;5;N;;;;; +1D2C6;KAKTOVIK NUMERAL SIX;No;0;L;;;;6;N;;;;; +1D2C7;KAKTOVIK NUMERAL SEVEN;No;0;L;;;;7;N;;;;; +1D2C8;KAKTOVIK NUMERAL EIGHT;No;0;L;;;;8;N;;;;; +1D2C9;KAKTOVIK NUMERAL NINE;No;0;L;;;;9;N;;;;; +1D2CA;KAKTOVIK NUMERAL TEN;No;0;L;;;;10;N;;;;; +1D2CB;KAKTOVIK NUMERAL ELEVEN;No;0;L;;;;11;N;;;;; +1D2CC;KAKTOVIK NUMERAL TWELVE;No;0;L;;;;12;N;;;;; +1D2CD;KAKTOVIK NUMERAL THIRTEEN;No;0;L;;;;13;N;;;;; +1D2CE;KAKTOVIK NUMERAL FOURTEEN;No;0;L;;;;14;N;;;;; +1D2CF;KAKTOVIK NUMERAL FIFTEEN;No;0;L;;;;15;N;;;;; +1D2D0;KAKTOVIK NUMERAL SIXTEEN;No;0;L;;;;16;N;;;;; +1D2D1;KAKTOVIK NUMERAL SEVENTEEN;No;0;L;;;;17;N;;;;; +1D2D2;KAKTOVIK NUMERAL EIGHTEEN;No;0;L;;;;18;N;;;;; +1D2D3;KAKTOVIK NUMERAL NINETEEN;No;0;L;;;;19;N;;;;; +1D2E0;MAYAN NUMERAL ZERO;No;0;L;;;;0;N;;;;; +1D2E1;MAYAN NUMERAL ONE;No;0;L;;;;1;N;;;;; +1D2E2;MAYAN NUMERAL TWO;No;0;L;;;;2;N;;;;; +1D2E3;MAYAN NUMERAL THREE;No;0;L;;;;3;N;;;;; +1D2E4;MAYAN NUMERAL FOUR;No;0;L;;;;4;N;;;;; +1D2E5;MAYAN NUMERAL FIVE;No;0;L;;;;5;N;;;;; +1D2E6;MAYAN NUMERAL SIX;No;0;L;;;;6;N;;;;; +1D2E7;MAYAN NUMERAL SEVEN;No;0;L;;;;7;N;;;;; +1D2E8;MAYAN NUMERAL EIGHT;No;0;L;;;;8;N;;;;; +1D2E9;MAYAN NUMERAL NINE;No;0;L;;;;9;N;;;;; +1D2EA;MAYAN NUMERAL TEN;No;0;L;;;;10;N;;;;; +1D2EB;MAYAN NUMERAL ELEVEN;No;0;L;;;;11;N;;;;; +1D2EC;MAYAN NUMERAL TWELVE;No;0;L;;;;12;N;;;;; +1D2ED;MAYAN NUMERAL THIRTEEN;No;0;L;;;;13;N;;;;; +1D2EE;MAYAN NUMERAL FOURTEEN;No;0;L;;;;14;N;;;;; +1D2EF;MAYAN NUMERAL FIFTEEN;No;0;L;;;;15;N;;;;; +1D2F0;MAYAN NUMERAL SIXTEEN;No;0;L;;;;16;N;;;;; +1D2F1;MAYAN NUMERAL SEVENTEEN;No;0;L;;;;17;N;;;;; +1D2F2;MAYAN NUMERAL EIGHTEEN;No;0;L;;;;18;N;;;;; +1D2F3;MAYAN NUMERAL NINETEEN;No;0;L;;;;19;N;;;;; +1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; +1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; +1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; +1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; +1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; +1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; +1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; +1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; +1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; +1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; +1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; +1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; +1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; +1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; +1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; +1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; +1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; +1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; +1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; +1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; +1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; +1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; +1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; +1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; +1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; +1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; +1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; +1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; +1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; +1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; +1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; +1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; +1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; +1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; +1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; +1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; +1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; +1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; +1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; +1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; +1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; +1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; +1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; +1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; +1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; +1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; +1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; +1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; +1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; +1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; +1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; +1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; +1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; +1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; +1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; +1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; +1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; +1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; +1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; +1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; +1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; +1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; +1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; +1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; +1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; +1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; +1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; +1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; +1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; +1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; +1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; +1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; +1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; +1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; +1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; +1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; +1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; +1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; +1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; +1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; +1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; +1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; +1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; +1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; +1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; +1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; +1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; +1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; +1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; +1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; +1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; +1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; +1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; +1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; +1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; +1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; +1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; +1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; +1D372;IDEOGRAPHIC TALLY MARK ONE;No;0;L;;;;1;N;;;;; +1D373;IDEOGRAPHIC TALLY MARK TWO;No;0;L;;;;2;N;;;;; +1D374;IDEOGRAPHIC TALLY MARK THREE;No;0;L;;;;3;N;;;;; +1D375;IDEOGRAPHIC TALLY MARK FOUR;No;0;L;;;;4;N;;;;; +1D376;IDEOGRAPHIC TALLY MARK FIVE;No;0;L;;;;5;N;;;;; +1D377;TALLY MARK ONE;No;0;L;;;;1;N;;;;; +1D378;TALLY MARK FIVE;No;0;L;;;;5;N;;;;; +1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L; 0131;;;;N;;;;; +1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L; 0237;;;;N;;;;; +1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;ON; 2207;;;;N;;;;; +1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;ON; 2207;;;;N;;;;; +1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;ON; 2207;;;;N;;;;; +1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;ON; 2207;;;;N;;;;; +1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;ON; 2207;;;;N;;;;; +1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L; 03DC;;;;N;;;;; +1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L; 03DD;;;;N;;;;; +1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D800;SIGNWRITING HAND-FIST INDEX;So;0;L;;;;;N;;;;; +1D801;SIGNWRITING HAND-CIRCLE INDEX;So;0;L;;;;;N;;;;; +1D802;SIGNWRITING HAND-CUP INDEX;So;0;L;;;;;N;;;;; +1D803;SIGNWRITING HAND-OVAL INDEX;So;0;L;;;;;N;;;;; +1D804;SIGNWRITING HAND-HINGE INDEX;So;0;L;;;;;N;;;;; +1D805;SIGNWRITING HAND-ANGLE INDEX;So;0;L;;;;;N;;;;; +1D806;SIGNWRITING HAND-FIST INDEX BENT;So;0;L;;;;;N;;;;; +1D807;SIGNWRITING HAND-CIRCLE INDEX BENT;So;0;L;;;;;N;;;;; +1D808;SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT;So;0;L;;;;;N;;;;; +1D809;SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D80A;SIGNWRITING HAND-FIST INDEX CUPPED;So;0;L;;;;;N;;;;; +1D80B;SIGNWRITING HAND-FIST INDEX HINGED;So;0;L;;;;;N;;;;; +1D80C;SIGNWRITING HAND-FIST INDEX HINGED LOW;So;0;L;;;;;N;;;;; +1D80D;SIGNWRITING HAND-CIRCLE INDEX HINGE;So;0;L;;;;;N;;;;; +1D80E;SIGNWRITING HAND-FIST INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D80F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D810;SIGNWRITING HAND-FIST INDEX MIDDLE BENT;So;0;L;;;;;N;;;;; +1D811;SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D812;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D813;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D814;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP;So;0;L;;;;;N;;;;; +1D815;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D816;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT;So;0;L;;;;;N;;;;; +1D817;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT;So;0;L;;;;;N;;;;; +1D818;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED;So;0;L;;;;;N;;;;; +1D819;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D81A;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81B;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81C;SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX;So;0;L;;;;;N;;;;; +1D81D;SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE;So;0;L;;;;;N;;;;; +1D81E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D81F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D820;SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT;So;0;L;;;;;N;;;;; +1D821;SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT;So;0;L;;;;;N;;;;; +1D822;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT;So;0;L;;;;;N;;;;; +1D823;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE;So;0;L;;;;;N;;;;; +1D824;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D825;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D826;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D827;SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D828;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED;So;0;L;;;;;N;;;;; +1D829;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED;So;0;L;;;;;N;;;;; +1D82A;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED;So;0;L;;;;;N;;;;; +1D82B;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED;So;0;L;;;;;N;;;;; +1D82C;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT;So;0;L;;;;;N;;;;; +1D82D;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE;So;0;L;;;;;N;;;;; +1D82E;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D82F;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D830;SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP;So;0;L;;;;;N;;;;; +1D831;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP;So;0;L;;;;;N;;;;; +1D832;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D833;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE;So;0;L;;;;;N;;;;; +1D834;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D835;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D836;SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP;So;0;L;;;;;N;;;;; +1D837;SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP;So;0;L;;;;;N;;;;; +1D838;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP;So;0;L;;;;;N;;;;; +1D839;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED;So;0;L;;;;;N;;;;; +1D83A;SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP;So;0;L;;;;;N;;;;; +1D83B;SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP;So;0;L;;;;;N;;;;; +1D83C;SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP;So;0;L;;;;;N;;;;; +1D83D;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D83E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT;So;0;L;;;;;N;;;;; +1D83F;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED;So;0;L;;;;;N;;;;; +1D840;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP;So;0;L;;;;;N;;;;; +1D841;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED;So;0;L;;;;;N;;;;; +1D842;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP;So;0;L;;;;;N;;;;; +1D843;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D844;SIGNWRITING HAND-FLAT FOUR FINGERS;So;0;L;;;;;N;;;;; +1D845;SIGNWRITING HAND-FLAT FOUR FINGERS BENT;So;0;L;;;;;N;;;;; +1D846;SIGNWRITING HAND-FLAT FOUR FINGERS HINGED;So;0;L;;;;;N;;;;; +1D847;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D848;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT;So;0;L;;;;;N;;;;; +1D849;SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84A;SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT;So;0;L;;;;;N;;;;; +1D84B;SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84C;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84D;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84E;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D84F;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D850;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D851;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D852;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D853;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D854;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D855;SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D856;SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D857;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED;So;0;L;;;;;N;;;;; +1D858;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D859;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB;So;0;L;;;;;N;;;;; +1D85A;SIGNWRITING HAND-FLAT;So;0;L;;;;;N;;;;; +1D85B;SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS;So;0;L;;;;;N;;;;; +1D85C;SIGNWRITING HAND-FLAT HEEL;So;0;L;;;;;N;;;;; +1D85D;SIGNWRITING HAND-FLAT THUMB SIDE;So;0;L;;;;;N;;;;; +1D85E;SIGNWRITING HAND-FLAT HEEL THUMB SIDE;So;0;L;;;;;N;;;;; +1D85F;SIGNWRITING HAND-FLAT THUMB BENT;So;0;L;;;;;N;;;;; +1D860;SIGNWRITING HAND-FLAT THUMB FORWARD;So;0;L;;;;;N;;;;; +1D861;SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D862;SIGNWRITING HAND-FLAT SPLIT CENTRE;So;0;L;;;;;N;;;;; +1D863;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE;So;0;L;;;;;N;;;;; +1D864;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D865;SIGNWRITING HAND-FLAT SPLIT LITTLE;So;0;L;;;;;N;;;;; +1D866;SIGNWRITING HAND-CLAW;So;0;L;;;;;N;;;;; +1D867;SIGNWRITING HAND-CLAW THUMB SIDE;So;0;L;;;;;N;;;;; +1D868;SIGNWRITING HAND-CLAW NO THUMB;So;0;L;;;;;N;;;;; +1D869;SIGNWRITING HAND-CLAW THUMB FORWARD;So;0;L;;;;;N;;;;; +1D86A;SIGNWRITING HAND-HOOK CURLICUE;So;0;L;;;;;N;;;;; +1D86B;SIGNWRITING HAND-HOOK;So;0;L;;;;;N;;;;; +1D86C;SIGNWRITING HAND-CUP OPEN;So;0;L;;;;;N;;;;; +1D86D;SIGNWRITING HAND-CUP;So;0;L;;;;;N;;;;; +1D86E;SIGNWRITING HAND-CUP OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D86F;SIGNWRITING HAND-CUP THUMB SIDE;So;0;L;;;;;N;;;;; +1D870;SIGNWRITING HAND-CUP OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D871;SIGNWRITING HAND-CUP NO THUMB;So;0;L;;;;;N;;;;; +1D872;SIGNWRITING HAND-CUP OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D873;SIGNWRITING HAND-CUP THUMB FORWARD;So;0;L;;;;;N;;;;; +1D874;SIGNWRITING HAND-CURLICUE OPEN;So;0;L;;;;;N;;;;; +1D875;SIGNWRITING HAND-CURLICUE;So;0;L;;;;;N;;;;; +1D876;SIGNWRITING HAND-CIRCLE;So;0;L;;;;;N;;;;; +1D877;SIGNWRITING HAND-OVAL;So;0;L;;;;;N;;;;; +1D878;SIGNWRITING HAND-OVAL THUMB SIDE;So;0;L;;;;;N;;;;; +1D879;SIGNWRITING HAND-OVAL NO THUMB;So;0;L;;;;;N;;;;; +1D87A;SIGNWRITING HAND-OVAL THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87B;SIGNWRITING HAND-HINGE OPEN;So;0;L;;;;;N;;;;; +1D87C;SIGNWRITING HAND-HINGE OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87D;SIGNWRITING HAND-HINGE;So;0;L;;;;;N;;;;; +1D87E;SIGNWRITING HAND-HINGE SMALL;So;0;L;;;;;N;;;;; +1D87F;SIGNWRITING HAND-HINGE OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D880;SIGNWRITING HAND-HINGE THUMB SIDE;So;0;L;;;;;N;;;;; +1D881;SIGNWRITING HAND-HINGE OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D882;SIGNWRITING HAND-HINGE NO THUMB;So;0;L;;;;;N;;;;; +1D883;SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX;So;0;L;;;;;N;;;;; +1D884;SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D885;SIGNWRITING HAND-ANGLE;So;0;L;;;;;N;;;;; +1D886;SIGNWRITING HAND-FIST INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D887;SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D888;SIGNWRITING HAND-HINGE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D889;SIGNWRITING HAND-ANGLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D88A;SIGNWRITING HAND-HINGE LITTLE;So;0;L;;;;;N;;;;; +1D88B;SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT;So;0;L;;;;;N;;;;; +1D88C;SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88D;SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88E;SIGNWRITING HAND-FIST LITTLE DOWN;So;0;L;;;;;N;;;;; +1D88F;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT;So;0;L;;;;;N;;;;; +1D890;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED;So;0;L;;;;;N;;;;; +1D891;SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED;So;0;L;;;;;N;;;;; +1D892;SIGNWRITING HAND-FIST LITTLE UP;So;0;L;;;;;N;;;;; +1D893;SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP;So;0;L;;;;;N;;;;; +1D894;SIGNWRITING HAND-CIRCLE LITTLE UP;So;0;L;;;;;N;;;;; +1D895;SIGNWRITING HAND-OVAL LITTLE UP;So;0;L;;;;;N;;;;; +1D896;SIGNWRITING HAND-ANGLE LITTLE UP;So;0;L;;;;;N;;;;; +1D897;SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D898;SIGNWRITING HAND-FIST LITTLE BENT;So;0;L;;;;;N;;;;; +1D899;SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB;So;0;L;;;;;N;;;;; +1D89A;SIGNWRITING HAND-FIST LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89B;SIGNWRITING HAND-HINGE LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89C;SIGNWRITING HAND-FIST LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89D;SIGNWRITING HAND-HINGE LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89E;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D89F;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB;So;0;L;;;;;N;;;;; +1D8A0;SIGNWRITING HAND-FIST LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A1;SIGNWRITING HAND-CIRCLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A2;SIGNWRITING HAND-HINGE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A3;SIGNWRITING HAND-ANGLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A4;SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A5;SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A6;SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A7;SIGNWRITING HAND-HINGE RING;So;0;L;;;;;N;;;;; +1D8A8;SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A9;SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AA;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AB;SIGNWRITING HAND-FIST RING DOWN;So;0;L;;;;;N;;;;; +1D8AC;SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE;So;0;L;;;;;N;;;;; +1D8AD;SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS;So;0;L;;;;;N;;;;; +1D8AE;SIGNWRITING HAND-FIST RING UP;So;0;L;;;;;N;;;;; +1D8AF;SIGNWRITING HAND-FIST RING RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8B0;SIGNWRITING HAND-FIST RING LITTLE;So;0;L;;;;;N;;;;; +1D8B1;SIGNWRITING HAND-CIRCLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B2;SIGNWRITING HAND-OVAL RING LITTLE;So;0;L;;;;;N;;;;; +1D8B3;SIGNWRITING HAND-ANGLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B4;SIGNWRITING HAND-FIST RING MIDDLE;So;0;L;;;;;N;;;;; +1D8B5;SIGNWRITING HAND-FIST RING MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D8B6;SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D8B7;SIGNWRITING HAND-FIST RING INDEX;So;0;L;;;;;N;;;;; +1D8B8;SIGNWRITING HAND-FIST RING THUMB;So;0;L;;;;;N;;;;; +1D8B9;SIGNWRITING HAND-HOOK RING THUMB;So;0;L;;;;;N;;;;; +1D8BA;SIGNWRITING HAND-FIST INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BB;SIGNWRITING HAND-CIRCLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BC;SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8BD;SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8BE;SIGNWRITING HAND-HOOK INDEX RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8BF;SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER;So;0;L;;;;;N;;;;; +1D8C0;SIGNWRITING HAND-CUP INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C1;SIGNWRITING HAND-HINGE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C2;SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8C3;SIGNWRITING HAND-ANGLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C4;SIGNWRITING HAND-FIST MIDDLE DOWN;So;0;L;;;;;N;;;;; +1D8C5;SIGNWRITING HAND-HINGE MIDDLE;So;0;L;;;;;N;;;;; +1D8C6;SIGNWRITING HAND-FIST MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C7;SIGNWRITING HAND-CIRCLE MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C8;SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8C9;SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D8CA;SIGNWRITING HAND-HOOK MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D8CB;SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE;So;0;L;;;;;N;;;;; +1D8CC;SIGNWRITING HAND-FIST MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8CD;SIGNWRITING HAND-FIST MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CE;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CF;SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8D0;SIGNWRITING HAND-CUP MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D1;SIGNWRITING HAND-HINGE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D2;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8D3;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8D4;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D5;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT;So;0;L;;;;;N;;;;; +1D8D6;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8D7;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE;So;0;L;;;;;N;;;;; +1D8D8;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT;So;0;L;;;;;N;;;;; +1D8D9;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN;So;0;L;;;;;N;;;;; +1D8DA;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8DB;SIGNWRITING HAND-HINGE INDEX HINGED;So;0;L;;;;;N;;;;; +1D8DC;SIGNWRITING HAND-FIST INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DD;SIGNWRITING HAND-HINGE INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DE;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL;So;0;L;;;;;N;;;;; +1D8DF;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D8E0;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT;So;0;L;;;;;N;;;;; +1D8E1;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT;So;0;L;;;;;N;;;;; +1D8E2;SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT;So;0;L;;;;;N;;;;; +1D8E3;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE;So;0;L;;;;;N;;;;; +1D8E4;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT;So;0;L;;;;;N;;;;; +1D8E5;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT;So;0;L;;;;;N;;;;; +1D8E6;SIGNWRITING HAND-FIST INDEX THUMB HOOK;So;0;L;;;;;N;;;;; +1D8E7;SIGNWRITING HAND-FIST INDEX THUMB CURLICUE;So;0;L;;;;;N;;;;; +1D8E8;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8E9;SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8EA;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER;So;0;L;;;;;N;;;;; +1D8EB;SIGNWRITING HAND-FIST INDEX THUMB CIRCLE;So;0;L;;;;;N;;;;; +1D8EC;SIGNWRITING HAND-CUP INDEX THUMB;So;0;L;;;;;N;;;;; +1D8ED;SIGNWRITING HAND-CUP INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EE;SIGNWRITING HAND-HINGE INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EF;SIGNWRITING HAND-HINGE INDEX THUMB LARGE;So;0;L;;;;;N;;;;; +1D8F0;SIGNWRITING HAND-HINGE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F1;SIGNWRITING HAND-HINGE INDEX THUMB SMALL;So;0;L;;;;;N;;;;; +1D8F2;SIGNWRITING HAND-ANGLE INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D8F3;SIGNWRITING HAND-ANGLE INDEX THUMB IN;So;0;L;;;;;N;;;;; +1D8F4;SIGNWRITING HAND-ANGLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F5;SIGNWRITING HAND-FIST THUMB;So;0;L;;;;;N;;;;; +1D8F6;SIGNWRITING HAND-FIST THUMB HEEL;So;0;L;;;;;N;;;;; +1D8F7;SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL;So;0;L;;;;;N;;;;; +1D8F8;SIGNWRITING HAND-FIST THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D8F9;SIGNWRITING HAND-FIST THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D8FA;SIGNWRITING HAND-FIST THUMB FORWARD;So;0;L;;;;;N;;;;; +1D8FB;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D8FC;SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D8FD;SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE;So;0;L;;;;;N;;;;; +1D8FE;SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS;So;0;L;;;;;N;;;;; +1D8FF;SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS;So;0;L;;;;;N;;;;; +1D900;SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS;So;0;L;;;;;N;;;;; +1D901;SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS;So;0;L;;;;;N;;;;; +1D902;SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D903;SIGNWRITING HAND-FIST;So;0;L;;;;;N;;;;; +1D904;SIGNWRITING HAND-FIST HEEL;So;0;L;;;;;N;;;;; +1D905;SIGNWRITING TOUCH SINGLE;So;0;L;;;;;N;;;;; +1D906;SIGNWRITING TOUCH MULTIPLE;So;0;L;;;;;N;;;;; +1D907;SIGNWRITING TOUCH BETWEEN;So;0;L;;;;;N;;;;; +1D908;SIGNWRITING GRASP SINGLE;So;0;L;;;;;N;;;;; +1D909;SIGNWRITING GRASP MULTIPLE;So;0;L;;;;;N;;;;; +1D90A;SIGNWRITING GRASP BETWEEN;So;0;L;;;;;N;;;;; +1D90B;SIGNWRITING STRIKE SINGLE;So;0;L;;;;;N;;;;; +1D90C;SIGNWRITING STRIKE MULTIPLE;So;0;L;;;;;N;;;;; +1D90D;SIGNWRITING STRIKE BETWEEN;So;0;L;;;;;N;;;;; +1D90E;SIGNWRITING BRUSH SINGLE;So;0;L;;;;;N;;;;; +1D90F;SIGNWRITING BRUSH MULTIPLE;So;0;L;;;;;N;;;;; +1D910;SIGNWRITING BRUSH BETWEEN;So;0;L;;;;;N;;;;; +1D911;SIGNWRITING RUB SINGLE;So;0;L;;;;;N;;;;; +1D912;SIGNWRITING RUB MULTIPLE;So;0;L;;;;;N;;;;; +1D913;SIGNWRITING RUB BETWEEN;So;0;L;;;;;N;;;;; +1D914;SIGNWRITING SURFACE SYMBOLS;So;0;L;;;;;N;;;;; +1D915;SIGNWRITING SURFACE BETWEEN;So;0;L;;;;;N;;;;; +1D916;SIGNWRITING SQUEEZE LARGE SINGLE;So;0;L;;;;;N;;;;; +1D917;SIGNWRITING SQUEEZE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D918;SIGNWRITING SQUEEZE LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D919;SIGNWRITING SQUEEZE SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91A;SIGNWRITING SQUEEZE SEQUENTIAL;So;0;L;;;;;N;;;;; +1D91B;SIGNWRITING FLICK LARGE SINGLE;So;0;L;;;;;N;;;;; +1D91C;SIGNWRITING FLICK SMALL SINGLE;So;0;L;;;;;N;;;;; +1D91D;SIGNWRITING FLICK LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D91E;SIGNWRITING FLICK SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91F;SIGNWRITING FLICK SEQUENTIAL;So;0;L;;;;;N;;;;; +1D920;SIGNWRITING SQUEEZE FLICK ALTERNATING;So;0;L;;;;;N;;;;; +1D921;SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE;So;0;L;;;;;N;;;;; +1D922;SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL;So;0;L;;;;;N;;;;; +1D923;SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL;So;0;L;;;;;N;;;;; +1D924;SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL;So;0;L;;;;;N;;;;; +1D925;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE;So;0;L;;;;;N;;;;; +1D926;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL;So;0;L;;;;;N;;;;; +1D927;SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS;So;0;L;;;;;N;;;;; +1D928;SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D929;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D92A;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D92B;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D92C;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D92D;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D92E;SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D92F;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D930;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D931;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D932;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D933;SIGNWRITING MOVEMENT-WALLPLANE CROSS;So;0;L;;;;;N;;;;; +1D934;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D935;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D936;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING;So;0;L;;;;;N;;;;; +1D937;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D938;SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL;So;0;L;;;;;N;;;;; +1D939;SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM;So;0;L;;;;;N;;;;; +1D93A;SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE;So;0;L;;;;;N;;;;; +1D93B;SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D93C;SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D93D;SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D93E;SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION;So;0;L;;;;;N;;;;; +1D93F;SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL;So;0;L;;;;;N;;;;; +1D940;SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM;So;0;L;;;;;N;;;;; +1D941;SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE;So;0;L;;;;;N;;;;; +1D942;SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D943;SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D944;SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D945;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D946;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D947;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D948;SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D949;SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D94A;SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D94B;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94C;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D94D;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D94E;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94F;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D950;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D951;SIGNWRITING TRAVEL-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D952;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE;So;0;L;;;;;N;;;;; +1D953;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE;So;0;L;;;;;N;;;;; +1D954;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE;So;0;L;;;;;N;;;;; +1D955;SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL;So;0;L;;;;;N;;;;; +1D956;SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D957;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE;So;0;L;;;;;N;;;;; +1D958;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST;So;0;L;;;;;N;;;;; +1D959;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D95A;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D95B;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D95C;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D95D;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL;So;0;L;;;;;N;;;;; +1D95E;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D95F;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE;So;0;L;;;;;N;;;;; +1D960;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST;So;0;L;;;;;N;;;;; +1D961;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D962;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D963;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D964;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D965;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D966;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D967;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D968;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D969;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96A;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D96B;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96C;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D96D;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D96E;SIGNWRITING MOVEMENT-FLOORPLANE CROSS;So;0;L;;;;;N;;;;; +1D96F;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D970;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D971;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT;So;0;L;;;;;N;;;;; +1D972;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D973;SIGNWRITING MOVEMENT-FLOORPLANE BEND;So;0;L;;;;;N;;;;; +1D974;SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D975;SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D976;SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D977;SIGNWRITING MOVEMENT-FLOORPLANE CHECK;So;0;L;;;;;N;;;;; +1D978;SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D979;SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D97A;SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D97B;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D97C;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D97D;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D97E;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D97F;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D980;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D981;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D982;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D983;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D984;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D985;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D986;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D987;SIGNWRITING TRAVEL-FLOORPLANE SHAKING;So;0;L;;;;;N;;;;; +1D988;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL;So;0;L;;;;;N;;;;; +1D989;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM;So;0;L;;;;;N;;;;; +1D98A;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE;So;0;L;;;;;N;;;;; +1D98B;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST;So;0;L;;;;;N;;;;; +1D98C;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D98D;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D98E;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE;So;0;L;;;;;N;;;;; +1D98F;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST;So;0;L;;;;;N;;;;; +1D990;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D991;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D992;SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D993;SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM;So;0;L;;;;;N;;;;; +1D994;SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE;So;0;L;;;;;N;;;;; +1D995;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D996;SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM;So;0;L;;;;;N;;;;; +1D997;SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE;So;0;L;;;;;N;;;;; +1D998;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D999;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL;So;0;L;;;;;N;;;;; +1D99A;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM;So;0;L;;;;;N;;;;; +1D99B;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE;So;0;L;;;;;N;;;;; +1D99C;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL;So;0;L;;;;;N;;;;; +1D99D;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM;So;0;L;;;;;N;;;;; +1D99E;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE;So;0;L;;;;;N;;;;; +1D99F;SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT;So;0;L;;;;;N;;;;; +1D9A0;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL;So;0;L;;;;;N;;;;; +1D9A1;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM;So;0;L;;;;;N;;;;; +1D9A2;SIGNWRITING ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9A3;SIGNWRITING ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9A4;SIGNWRITING ROTATION-WALLPLANE ALTERNATE;So;0;L;;;;;N;;;;; +1D9A5;SIGNWRITING MOVEMENT-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D9A6;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A7;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A8;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A9;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AA;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AB;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AC;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AD;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AE;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AF;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B0;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B1;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B2;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B3;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B4;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL;So;0;L;;;;;N;;;;; +1D9B5;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM;So;0;L;;;;;N;;;;; +1D9B6;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE;So;0;L;;;;;N;;;;; +1D9B7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9B8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9B9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9BA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9BB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9BC;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9BD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9BE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9BF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C0;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9C1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9C2;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9C3;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C4;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C5;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9C7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9C8;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9CA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9CB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9CC;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9CD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9CE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9CF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9D0;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9D1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9D2;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D3;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D4;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D5;SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL;So;0;L;;;;;N;;;;; +1D9D6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM;So;0;L;;;;;N;;;;; +1D9D7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE;So;0;L;;;;;N;;;;; +1D9D8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST;So;0;L;;;;;N;;;;; +1D9D9;SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED;So;0;L;;;;;N;;;;; +1D9DA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D9DB;SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D9DC;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE;So;0;L;;;;;N;;;;; +1D9DD;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL;So;0;L;;;;;N;;;;; +1D9DE;SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE;So;0;L;;;;;N;;;;; +1D9DF;SIGNWRITING ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9E0;SIGNWRITING ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9E1;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D9E2;SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL;So;0;L;;;;;N;;;;; +1D9E3;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E4;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E5;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9E6;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9E7;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E8;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E9;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9EA;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9EB;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9EC;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9ED;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE;So;0;L;;;;;N;;;;; +1D9EE;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE;So;0;L;;;;;N;;;;; +1D9EF;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F0;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F1;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE;So;0;L;;;;;N;;;;; +1D9F2;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE;So;0;L;;;;;N;;;;; +1D9F3;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F4;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F5;SIGNWRITING DYNAMIC ARROWHEAD SMALL;So;0;L;;;;;N;;;;; +1D9F6;SIGNWRITING DYNAMIC ARROWHEAD LARGE;So;0;L;;;;;N;;;;; +1D9F7;SIGNWRITING DYNAMIC FAST;So;0;L;;;;;N;;;;; +1D9F8;SIGNWRITING DYNAMIC SLOW;So;0;L;;;;;N;;;;; +1D9F9;SIGNWRITING DYNAMIC TENSE;So;0;L;;;;;N;;;;; +1D9FA;SIGNWRITING DYNAMIC RELAXED;So;0;L;;;;;N;;;;; +1D9FB;SIGNWRITING DYNAMIC SIMULTANEOUS;So;0;L;;;;;N;;;;; +1D9FC;SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING;So;0;L;;;;;N;;;;; +1D9FD;SIGNWRITING DYNAMIC EVERY OTHER TIME;So;0;L;;;;;N;;;;; +1D9FE;SIGNWRITING DYNAMIC GRADUAL;So;0;L;;;;;N;;;;; +1D9FF;SIGNWRITING HEAD;So;0;L;;;;;N;;;;; +1DA00;SIGNWRITING HEAD RIM;Mn;0;NSM;;;;;N;;;;; +1DA01;SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA02;SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT;Mn;0;NSM;;;;;N;;;;; +1DA03;SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA04;SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA05;SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA06;SIGNWRITING HEAD MOVEMENT CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA07;SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING;Mn;0;NSM;;;;;N;;;;; +1DA08;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN;Mn;0;NSM;;;;;N;;;;; +1DA09;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING;Mn;0;NSM;;;;;N;;;;; +1DA0A;SIGNWRITING EYEBROWS STRAIGHT UP;Mn;0;NSM;;;;;N;;;;; +1DA0B;SIGNWRITING EYEBROWS STRAIGHT NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0C;SIGNWRITING EYEBROWS STRAIGHT DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0D;SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0E;SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0F;SIGNWRITING DREAMY EYEBROWS UP NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA10;SIGNWRITING DREAMY EYEBROWS NEUTRAL UP;Mn;0;NSM;;;;;N;;;;; +1DA11;SIGNWRITING FOREHEAD NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA12;SIGNWRITING FOREHEAD CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA13;SIGNWRITING FOREHEAD WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA14;SIGNWRITING EYES OPEN;Mn;0;NSM;;;;;N;;;;; +1DA15;SIGNWRITING EYES SQUEEZED;Mn;0;NSM;;;;;N;;;;; +1DA16;SIGNWRITING EYES CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA17;SIGNWRITING EYE BLINK SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA18;SIGNWRITING EYE BLINK MULTIPLE;Mn;0;NSM;;;;;N;;;;; +1DA19;SIGNWRITING EYES HALF OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1A;SIGNWRITING EYES WIDE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1B;SIGNWRITING EYES HALF CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA1C;SIGNWRITING EYES WIDENING MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA1D;SIGNWRITING EYE WINK;Mn;0;NSM;;;;;N;;;;; +1DA1E;SIGNWRITING EYELASHES UP;Mn;0;NSM;;;;;N;;;;; +1DA1F;SIGNWRITING EYELASHES DOWN;Mn;0;NSM;;;;;N;;;;; +1DA20;SIGNWRITING EYELASHES FLUTTERING;Mn;0;NSM;;;;;N;;;;; +1DA21;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA22;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA23;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA24;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA25;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA26;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA27;SIGNWRITING EYEGAZE-WALLPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA28;SIGNWRITING EYEGAZE-FLOORPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA29;SIGNWRITING EYEGAZE-WALLPLANE CIRCLING;Mn;0;NSM;;;;;N;;;;; +1DA2A;SIGNWRITING CHEEKS PUFFED;Mn;0;NSM;;;;;N;;;;; +1DA2B;SIGNWRITING CHEEKS NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA2C;SIGNWRITING CHEEKS SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA2D;SIGNWRITING TENSE CHEEKS HIGH;Mn;0;NSM;;;;;N;;;;; +1DA2E;SIGNWRITING TENSE CHEEKS MIDDLE;Mn;0;NSM;;;;;N;;;;; +1DA2F;SIGNWRITING TENSE CHEEKS LOW;Mn;0;NSM;;;;;N;;;;; +1DA30;SIGNWRITING EARS;Mn;0;NSM;;;;;N;;;;; +1DA31;SIGNWRITING NOSE NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA32;SIGNWRITING NOSE CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA33;SIGNWRITING NOSE WRINKLES;Mn;0;NSM;;;;;N;;;;; +1DA34;SIGNWRITING NOSE WIGGLES;Mn;0;NSM;;;;;N;;;;; +1DA35;SIGNWRITING AIR BLOWING OUT;Mn;0;NSM;;;;;N;;;;; +1DA36;SIGNWRITING AIR SUCKING IN;Mn;0;NSM;;;;;N;;;;; +1DA37;SIGNWRITING AIR BLOW SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA38;SIGNWRITING AIR SUCK SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA39;SIGNWRITING BREATH INHALE;So;0;L;;;;;N;;;;; +1DA3A;SIGNWRITING BREATH EXHALE;So;0;L;;;;;N;;;;; +1DA3B;SIGNWRITING MOUTH CLOSED NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA3C;SIGNWRITING MOUTH CLOSED FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA3D;SIGNWRITING MOUTH CLOSED CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA3E;SIGNWRITING MOUTH SMILE;Mn;0;NSM;;;;;N;;;;; +1DA3F;SIGNWRITING MOUTH SMILE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA40;SIGNWRITING MOUTH SMILE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA41;SIGNWRITING MOUTH FROWN;Mn;0;NSM;;;;;N;;;;; +1DA42;SIGNWRITING MOUTH FROWN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA43;SIGNWRITING MOUTH FROWN OPEN;Mn;0;NSM;;;;;N;;;;; +1DA44;SIGNWRITING MOUTH OPEN CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA45;SIGNWRITING MOUTH OPEN FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA46;SIGNWRITING MOUTH OPEN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA47;SIGNWRITING MOUTH OPEN OVAL;Mn;0;NSM;;;;;N;;;;; +1DA48;SIGNWRITING MOUTH OPEN OVAL WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA49;SIGNWRITING MOUTH OPEN OVAL YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4A;SIGNWRITING MOUTH OPEN RECTANGLE;Mn;0;NSM;;;;;N;;;;; +1DA4B;SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA4C;SIGNWRITING MOUTH OPEN RECTANGLE YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4D;SIGNWRITING MOUTH KISS;Mn;0;NSM;;;;;N;;;;; +1DA4E;SIGNWRITING MOUTH KISS FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA4F;SIGNWRITING MOUTH KISS WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA50;SIGNWRITING MOUTH TENSE;Mn;0;NSM;;;;;N;;;;; +1DA51;SIGNWRITING MOUTH TENSE FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA52;SIGNWRITING MOUTH TENSE SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA53;SIGNWRITING LIPS PRESSED TOGETHER;Mn;0;NSM;;;;;N;;;;; +1DA54;SIGNWRITING LIP LOWER OVER UPPER;Mn;0;NSM;;;;;N;;;;; +1DA55;SIGNWRITING LIP UPPER OVER LOWER;Mn;0;NSM;;;;;N;;;;; +1DA56;SIGNWRITING MOUTH CORNERS;Mn;0;NSM;;;;;N;;;;; +1DA57;SIGNWRITING MOUTH WRINKLES SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA58;SIGNWRITING MOUTH WRINKLES DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA59;SIGNWRITING TONGUE STICKING OUT FAR;Mn;0;NSM;;;;;N;;;;; +1DA5A;SIGNWRITING TONGUE LICKING LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5B;SIGNWRITING TONGUE TIP BETWEEN LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5C;SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA5D;SIGNWRITING TONGUE INSIDE MOUTH RELAXED;Mn;0;NSM;;;;;N;;;;; +1DA5E;SIGNWRITING TONGUE MOVES AGAINST CHEEK;Mn;0;NSM;;;;;N;;;;; +1DA5F;SIGNWRITING TONGUE CENTRE STICKING OUT;Mn;0;NSM;;;;;N;;;;; +1DA60;SIGNWRITING TONGUE CENTRE INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA61;SIGNWRITING TEETH;Mn;0;NSM;;;;;N;;;;; +1DA62;SIGNWRITING TEETH MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA63;SIGNWRITING TEETH ON TONGUE;Mn;0;NSM;;;;;N;;;;; +1DA64;SIGNWRITING TEETH ON TONGUE MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA65;SIGNWRITING TEETH ON LIPS;Mn;0;NSM;;;;;N;;;;; +1DA66;SIGNWRITING TEETH ON LIPS MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA67;SIGNWRITING TEETH BITE LIPS;Mn;0;NSM;;;;;N;;;;; +1DA68;SIGNWRITING MOVEMENT-WALLPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA69;SIGNWRITING MOVEMENT-FLOORPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA6A;SIGNWRITING NECK;Mn;0;NSM;;;;;N;;;;; +1DA6B;SIGNWRITING HAIR;Mn;0;NSM;;;;;N;;;;; +1DA6C;SIGNWRITING EXCITEMENT;Mn;0;NSM;;;;;N;;;;; +1DA6D;SIGNWRITING SHOULDER HIP SPINE;So;0;L;;;;;N;;;;; +1DA6E;SIGNWRITING SHOULDER HIP POSITIONS;So;0;L;;;;;N;;;;; +1DA6F;SIGNWRITING WALLPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA70;SIGNWRITING FLOORPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA71;SIGNWRITING SHOULDER TILTING FROM WAIST;So;0;L;;;;;N;;;;; +1DA72;SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH;So;0;L;;;;;N;;;;; +1DA73;SIGNWRITING TORSO-WALLPLANE CURVED BEND;So;0;L;;;;;N;;;;; +1DA74;SIGNWRITING TORSO-FLOORPLANE TWISTING;So;0;L;;;;;N;;;;; +1DA75;SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS;Mn;0;NSM;;;;;N;;;;; +1DA76;SIGNWRITING LIMB COMBINATION;So;0;L;;;;;N;;;;; +1DA77;SIGNWRITING LIMB LENGTH-1;So;0;L;;;;;N;;;;; +1DA78;SIGNWRITING LIMB LENGTH-2;So;0;L;;;;;N;;;;; +1DA79;SIGNWRITING LIMB LENGTH-3;So;0;L;;;;;N;;;;; +1DA7A;SIGNWRITING LIMB LENGTH-4;So;0;L;;;;;N;;;;; +1DA7B;SIGNWRITING LIMB LENGTH-5;So;0;L;;;;;N;;;;; +1DA7C;SIGNWRITING LIMB LENGTH-6;So;0;L;;;;;N;;;;; +1DA7D;SIGNWRITING LIMB LENGTH-7;So;0;L;;;;;N;;;;; +1DA7E;SIGNWRITING FINGER;So;0;L;;;;;N;;;;; +1DA7F;SIGNWRITING LOCATION-WALLPLANE SPACE;So;0;L;;;;;N;;;;; +1DA80;SIGNWRITING LOCATION-FLOORPLANE SPACE;So;0;L;;;;;N;;;;; +1DA81;SIGNWRITING LOCATION HEIGHT;So;0;L;;;;;N;;;;; +1DA82;SIGNWRITING LOCATION WIDTH;So;0;L;;;;;N;;;;; +1DA83;SIGNWRITING LOCATION DEPTH;So;0;L;;;;;N;;;;; +1DA84;SIGNWRITING LOCATION HEAD NECK;Mn;0;NSM;;;;;N;;;;; +1DA85;SIGNWRITING LOCATION TORSO;So;0;L;;;;;N;;;;; +1DA86;SIGNWRITING LOCATION LIMBS DIGITS;So;0;L;;;;;N;;;;; +1DA87;SIGNWRITING COMMA;Po;0;L;;;;;N;;;;; +1DA88;SIGNWRITING FULL STOP;Po;0;L;;;;;N;;;;; +1DA89;SIGNWRITING SEMICOLON;Po;0;L;;;;;N;;;;; +1DA8A;SIGNWRITING COLON;Po;0;L;;;;;N;;;;; +1DA8B;SIGNWRITING PARENTHESIS;Po;0;L;;;;;N;;;;; +1DA9B;SIGNWRITING FILL MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DA9C;SIGNWRITING FILL MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DA9D;SIGNWRITING FILL MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DA9E;SIGNWRITING FILL MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DA9F;SIGNWRITING FILL MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA1;SIGNWRITING ROTATION MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DAA2;SIGNWRITING ROTATION MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DAA3;SIGNWRITING ROTATION MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DAA4;SIGNWRITING ROTATION MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DAA5;SIGNWRITING ROTATION MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA6;SIGNWRITING ROTATION MODIFIER-7;Mn;0;NSM;;;;;N;;;;; +1DAA7;SIGNWRITING ROTATION MODIFIER-8;Mn;0;NSM;;;;;N;;;;; +1DAA8;SIGNWRITING ROTATION MODIFIER-9;Mn;0;NSM;;;;;N;;;;; +1DAA9;SIGNWRITING ROTATION MODIFIER-10;Mn;0;NSM;;;;;N;;;;; +1DAAA;SIGNWRITING ROTATION MODIFIER-11;Mn;0;NSM;;;;;N;;;;; +1DAAB;SIGNWRITING ROTATION MODIFIER-12;Mn;0;NSM;;;;;N;;;;; +1DAAC;SIGNWRITING ROTATION MODIFIER-13;Mn;0;NSM;;;;;N;;;;; +1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;; +1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;; +1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;; +1DF00;LATIN SMALL LETTER FENG DIGRAPH WITH TRILL;Ll;0;L;;;;;N;;;;; +1DF01;LATIN SMALL LETTER REVERSED SCRIPT G;Ll;0;L;;;;;N;;;;; +1DF02;LATIN LETTER SMALL CAPITAL TURNED G;Ll;0;L;;;;;N;;;;; +1DF03;LATIN SMALL LETTER REVERSED K;Ll;0;L;;;;;N;;;;; +1DF04;LATIN LETTER SMALL CAPITAL L WITH BELT;Ll;0;L;;;;;N;;;;; +1DF05;LATIN SMALL LETTER LEZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF06;LATIN SMALL LETTER TURNED Y WITH BELT;Ll;0;L;;;;;N;;;;; +1DF07;LATIN SMALL LETTER REVERSED ENG;Ll;0;L;;;;;N;;;;; +1DF08;LATIN SMALL LETTER TURNED R WITH LONG LEG AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF09;LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF0A;LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK;Lo;0;L;;;;;N;;;;; +1DF0B;LATIN SMALL LETTER ESH WITH DOUBLE BAR;Ll;0;L;;;;;N;;;;; +1DF0C;LATIN SMALL LETTER ESH WITH DOUBLE BAR AND CURL;Ll;0;L;;;;;N;;;;; +1DF0D;LATIN SMALL LETTER TURNED T WITH CURL;Ll;0;L;;;;;N;;;;; +1DF0E;LATIN LETTER INVERTED GLOTTAL STOP WITH CURL;Ll;0;L;;;;;N;;;;; +1DF0F;LATIN LETTER STRETCHED C WITH CURL;Ll;0;L;;;;;N;;;;; +1DF10;LATIN LETTER SMALL CAPITAL TURNED K;Ll;0;L;;;;;N;;;;; +1DF11;LATIN SMALL LETTER L WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +1DF12;LATIN SMALL LETTER DEZH DIGRAPH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF13;LATIN SMALL LETTER L WITH BELT AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF14;LATIN SMALL LETTER ENG WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF15;LATIN SMALL LETTER TURNED R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF16;LATIN SMALL LETTER R WITH FISHHOOK AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF17;LATIN SMALL LETTER TESH DIGRAPH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF18;LATIN SMALL LETTER EZH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF19;LATIN SMALL LETTER DEZH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1A;LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1B;LATIN SMALL LETTER O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1C;LATIN SMALL LETTER TESH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1D;LATIN SMALL LETTER C WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1E;LATIN SMALL LETTER S WITH CURL;Ll;0;L;;;;;N;;;;; +1DF25;LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF26;LATIN SMALL LETTER L WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF27;LATIN SMALL LETTER N WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF28;LATIN SMALL LETTER R WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF29;LATIN SMALL LETTER S WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF2A;LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1E000;COMBINING GLAGOLITIC LETTER AZU;Mn;230;NSM;;;;;N;;;;; +1E001;COMBINING GLAGOLITIC LETTER BUKY;Mn;230;NSM;;;;;N;;;;; +1E002;COMBINING GLAGOLITIC LETTER VEDE;Mn;230;NSM;;;;;N;;;;; +1E003;COMBINING GLAGOLITIC LETTER GLAGOLI;Mn;230;NSM;;;;;N;;;;; +1E004;COMBINING GLAGOLITIC LETTER DOBRO;Mn;230;NSM;;;;;N;;;;; +1E005;COMBINING GLAGOLITIC LETTER YESTU;Mn;230;NSM;;;;;N;;;;; +1E006;COMBINING GLAGOLITIC LETTER ZHIVETE;Mn;230;NSM;;;;;N;;;;; +1E008;COMBINING GLAGOLITIC LETTER ZEMLJA;Mn;230;NSM;;;;;N;;;;; +1E009;COMBINING GLAGOLITIC LETTER IZHE;Mn;230;NSM;;;;;N;;;;; +1E00A;COMBINING GLAGOLITIC LETTER INITIAL IZHE;Mn;230;NSM;;;;;N;;;;; +1E00B;COMBINING GLAGOLITIC LETTER I;Mn;230;NSM;;;;;N;;;;; +1E00C;COMBINING GLAGOLITIC LETTER DJERVI;Mn;230;NSM;;;;;N;;;;; +1E00D;COMBINING GLAGOLITIC LETTER KAKO;Mn;230;NSM;;;;;N;;;;; +1E00E;COMBINING GLAGOLITIC LETTER LJUDIJE;Mn;230;NSM;;;;;N;;;;; +1E00F;COMBINING GLAGOLITIC LETTER MYSLITE;Mn;230;NSM;;;;;N;;;;; +1E010;COMBINING GLAGOLITIC LETTER NASHI;Mn;230;NSM;;;;;N;;;;; +1E011;COMBINING GLAGOLITIC LETTER ONU;Mn;230;NSM;;;;;N;;;;; +1E012;COMBINING GLAGOLITIC LETTER POKOJI;Mn;230;NSM;;;;;N;;;;; +1E013;COMBINING GLAGOLITIC LETTER RITSI;Mn;230;NSM;;;;;N;;;;; +1E014;COMBINING GLAGOLITIC LETTER SLOVO;Mn;230;NSM;;;;;N;;;;; +1E015;COMBINING GLAGOLITIC LETTER TVRIDO;Mn;230;NSM;;;;;N;;;;; +1E016;COMBINING GLAGOLITIC LETTER UKU;Mn;230;NSM;;;;;N;;;;; +1E017;COMBINING GLAGOLITIC LETTER FRITU;Mn;230;NSM;;;;;N;;;;; +1E018;COMBINING GLAGOLITIC LETTER HERU;Mn;230;NSM;;;;;N;;;;; +1E01B;COMBINING GLAGOLITIC LETTER SHTA;Mn;230;NSM;;;;;N;;;;; +1E01C;COMBINING GLAGOLITIC LETTER TSI;Mn;230;NSM;;;;;N;;;;; +1E01D;COMBINING GLAGOLITIC LETTER CHRIVI;Mn;230;NSM;;;;;N;;;;; +1E01E;COMBINING GLAGOLITIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +1E01F;COMBINING GLAGOLITIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; +1E020;COMBINING GLAGOLITIC LETTER YERI;Mn;230;NSM;;;;;N;;;;; +1E021;COMBINING GLAGOLITIC LETTER YATI;Mn;230;NSM;;;;;N;;;;; +1E023;COMBINING GLAGOLITIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +1E024;COMBINING GLAGOLITIC LETTER SMALL YUS;Mn;230;NSM;;;;;N;;;;; +1E026;COMBINING GLAGOLITIC LETTER YO;Mn;230;NSM;;;;;N;;;;; +1E027;COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS;Mn;230;NSM;;;;;N;;;;; +1E028;COMBINING GLAGOLITIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +1E029;COMBINING GLAGOLITIC LETTER IOTATED BIG YUS;Mn;230;NSM;;;;;N;;;;; +1E02A;COMBINING GLAGOLITIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +1E030;MODIFIER LETTER CYRILLIC SMALL A;Lm;0;L; 0430;;;;N;;;;; +1E031;MODIFIER LETTER CYRILLIC SMALL BE;Lm;0;L; 0431;;;;N;;;;; +1E032;MODIFIER LETTER CYRILLIC SMALL VE;Lm;0;L; 0432;;;;N;;;;; +1E033;MODIFIER LETTER CYRILLIC SMALL GHE;Lm;0;L; 0433;;;;N;;;;; +1E034;MODIFIER LETTER CYRILLIC SMALL DE;Lm;0;L; 0434;;;;N;;;;; +1E035;MODIFIER LETTER CYRILLIC SMALL IE;Lm;0;L; 0435;;;;N;;;;; +1E036;MODIFIER LETTER CYRILLIC SMALL ZHE;Lm;0;L; 0436;;;;N;;;;; +1E037;MODIFIER LETTER CYRILLIC SMALL ZE;Lm;0;L; 0437;;;;N;;;;; +1E038;MODIFIER LETTER CYRILLIC SMALL I;Lm;0;L; 0438;;;;N;;;;; +1E039;MODIFIER LETTER CYRILLIC SMALL KA;Lm;0;L; 043A;;;;N;;;;; +1E03A;MODIFIER LETTER CYRILLIC SMALL EL;Lm;0;L; 043B;;;;N;;;;; +1E03B;MODIFIER LETTER CYRILLIC SMALL EM;Lm;0;L; 043C;;;;N;;;;; +1E03C;MODIFIER LETTER CYRILLIC SMALL O;Lm;0;L; 043E;;;;N;;;;; +1E03D;MODIFIER LETTER CYRILLIC SMALL PE;Lm;0;L; 043F;;;;N;;;;; +1E03E;MODIFIER LETTER CYRILLIC SMALL ER;Lm;0;L; 0440;;;;N;;;;; +1E03F;MODIFIER LETTER CYRILLIC SMALL ES;Lm;0;L; 0441;;;;N;;;;; +1E040;MODIFIER LETTER CYRILLIC SMALL TE;Lm;0;L; 0442;;;;N;;;;; +1E041;MODIFIER LETTER CYRILLIC SMALL U;Lm;0;L; 0443;;;;N;;;;; +1E042;MODIFIER LETTER CYRILLIC SMALL EF;Lm;0;L; 0444;;;;N;;;;; +1E043;MODIFIER LETTER CYRILLIC SMALL HA;Lm;0;L; 0445;;;;N;;;;; +1E044;MODIFIER LETTER CYRILLIC SMALL TSE;Lm;0;L; 0446;;;;N;;;;; +1E045;MODIFIER LETTER CYRILLIC SMALL CHE;Lm;0;L; 0447;;;;N;;;;; +1E046;MODIFIER LETTER CYRILLIC SMALL SHA;Lm;0;L; 0448;;;;N;;;;; +1E047;MODIFIER LETTER CYRILLIC SMALL YERU;Lm;0;L; 044B;;;;N;;;;; +1E048;MODIFIER LETTER CYRILLIC SMALL E;Lm;0;L; 044D;;;;N;;;;; +1E049;MODIFIER LETTER CYRILLIC SMALL YU;Lm;0;L; 044E;;;;N;;;;; +1E04A;MODIFIER LETTER CYRILLIC SMALL DZZE;Lm;0;L; A689;;;;N;;;;; +1E04B;MODIFIER LETTER CYRILLIC SMALL SCHWA;Lm;0;L; 04D9;;;;N;;;;; +1E04C;MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I;Lm;0;L; 0456;;;;N;;;;; +1E04D;MODIFIER LETTER CYRILLIC SMALL JE;Lm;0;L; 0458;;;;N;;;;; +1E04E;MODIFIER LETTER CYRILLIC SMALL BARRED O;Lm;0;L; 04E9;;;;N;;;;; +1E04F;MODIFIER LETTER CYRILLIC SMALL STRAIGHT U;Lm;0;L; 04AF;;;;N;;;;; +1E050;MODIFIER LETTER CYRILLIC SMALL PALOCHKA;Lm;0;L; 04CF;;;;N;;;;; +1E051;CYRILLIC SUBSCRIPT SMALL LETTER A;Lm;0;L; 0430;;;;N;;;;; +1E052;CYRILLIC SUBSCRIPT SMALL LETTER BE;Lm;0;L; 0431;;;;N;;;;; +1E053;CYRILLIC SUBSCRIPT SMALL LETTER VE;Lm;0;L; 0432;;;;N;;;;; +1E054;CYRILLIC SUBSCRIPT SMALL LETTER GHE;Lm;0;L; 0433;;;;N;;;;; +1E055;CYRILLIC SUBSCRIPT SMALL LETTER DE;Lm;0;L; 0434;;;;N;;;;; +1E056;CYRILLIC SUBSCRIPT SMALL LETTER IE;Lm;0;L; 0435;;;;N;;;;; +1E057;CYRILLIC SUBSCRIPT SMALL LETTER ZHE;Lm;0;L; 0436;;;;N;;;;; +1E058;CYRILLIC SUBSCRIPT SMALL LETTER ZE;Lm;0;L; 0437;;;;N;;;;; +1E059;CYRILLIC SUBSCRIPT SMALL LETTER I;Lm;0;L; 0438;;;;N;;;;; +1E05A;CYRILLIC SUBSCRIPT SMALL LETTER KA;Lm;0;L; 043A;;;;N;;;;; +1E05B;CYRILLIC SUBSCRIPT SMALL LETTER EL;Lm;0;L; 043B;;;;N;;;;; +1E05C;CYRILLIC SUBSCRIPT SMALL LETTER O;Lm;0;L; 043E;;;;N;;;;; +1E05D;CYRILLIC SUBSCRIPT SMALL LETTER PE;Lm;0;L; 043F;;;;N;;;;; +1E05E;CYRILLIC SUBSCRIPT SMALL LETTER ES;Lm;0;L; 0441;;;;N;;;;; +1E05F;CYRILLIC SUBSCRIPT SMALL LETTER U;Lm;0;L; 0443;;;;N;;;;; +1E060;CYRILLIC SUBSCRIPT SMALL LETTER EF;Lm;0;L; 0444;;;;N;;;;; +1E061;CYRILLIC SUBSCRIPT SMALL LETTER HA;Lm;0;L; 0445;;;;N;;;;; +1E062;CYRILLIC SUBSCRIPT SMALL LETTER TSE;Lm;0;L; 0446;;;;N;;;;; +1E063;CYRILLIC SUBSCRIPT SMALL LETTER CHE;Lm;0;L; 0447;;;;N;;;;; +1E064;CYRILLIC SUBSCRIPT SMALL LETTER SHA;Lm;0;L; 0448;;;;N;;;;; +1E065;CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN;Lm;0;L; 044A;;;;N;;;;; +1E066;CYRILLIC SUBSCRIPT SMALL LETTER YERU;Lm;0;L; 044B;;;;N;;;;; +1E067;CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN;Lm;0;L; 0491;;;;N;;;;; +1E068;CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Lm;0;L; 0456;;;;N;;;;; +1E069;CYRILLIC SUBSCRIPT SMALL LETTER DZE;Lm;0;L; 0455;;;;N;;;;; +1E06A;CYRILLIC SUBSCRIPT SMALL LETTER DZHE;Lm;0;L; 045F;;;;N;;;;; +1E06B;MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER;Lm;0;L; 04AB;;;;N;;;;; +1E06C;MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER;Lm;0;L; A651;;;;N;;;;; +1E06D;MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE;Lm;0;L; 04B1;;;;N;;;;; +1E08F;COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Mn;230;NSM;;;;;N;;;;; +1E100;NYIAKENG PUACHUE HMONG LETTER MA;Lo;0;L;;;;;N;;;;; +1E101;NYIAKENG PUACHUE HMONG LETTER TSA;Lo;0;L;;;;;N;;;;; +1E102;NYIAKENG PUACHUE HMONG LETTER NTA;Lo;0;L;;;;;N;;;;; +1E103;NYIAKENG PUACHUE HMONG LETTER TA;Lo;0;L;;;;;N;;;;; +1E104;NYIAKENG PUACHUE HMONG LETTER HA;Lo;0;L;;;;;N;;;;; +1E105;NYIAKENG PUACHUE HMONG LETTER NA;Lo;0;L;;;;;N;;;;; +1E106;NYIAKENG PUACHUE HMONG LETTER XA;Lo;0;L;;;;;N;;;;; +1E107;NYIAKENG PUACHUE HMONG LETTER NKA;Lo;0;L;;;;;N;;;;; +1E108;NYIAKENG PUACHUE HMONG LETTER CA;Lo;0;L;;;;;N;;;;; +1E109;NYIAKENG PUACHUE HMONG LETTER LA;Lo;0;L;;;;;N;;;;; +1E10A;NYIAKENG PUACHUE HMONG LETTER SA;Lo;0;L;;;;;N;;;;; +1E10B;NYIAKENG PUACHUE HMONG LETTER ZA;Lo;0;L;;;;;N;;;;; +1E10C;NYIAKENG PUACHUE HMONG LETTER NCA;Lo;0;L;;;;;N;;;;; +1E10D;NYIAKENG PUACHUE HMONG LETTER NTSA;Lo;0;L;;;;;N;;;;; +1E10E;NYIAKENG PUACHUE HMONG LETTER KA;Lo;0;L;;;;;N;;;;; +1E10F;NYIAKENG PUACHUE HMONG LETTER DA;Lo;0;L;;;;;N;;;;; +1E110;NYIAKENG PUACHUE HMONG LETTER NYA;Lo;0;L;;;;;N;;;;; +1E111;NYIAKENG PUACHUE HMONG LETTER NRA;Lo;0;L;;;;;N;;;;; +1E112;NYIAKENG PUACHUE HMONG LETTER VA;Lo;0;L;;;;;N;;;;; +1E113;NYIAKENG PUACHUE HMONG LETTER NTXA;Lo;0;L;;;;;N;;;;; +1E114;NYIAKENG PUACHUE HMONG LETTER TXA;Lo;0;L;;;;;N;;;;; +1E115;NYIAKENG PUACHUE HMONG LETTER FA;Lo;0;L;;;;;N;;;;; +1E116;NYIAKENG PUACHUE HMONG LETTER RA;Lo;0;L;;;;;N;;;;; +1E117;NYIAKENG PUACHUE HMONG LETTER QA;Lo;0;L;;;;;N;;;;; +1E118;NYIAKENG PUACHUE HMONG LETTER YA;Lo;0;L;;;;;N;;;;; +1E119;NYIAKENG PUACHUE HMONG LETTER NQA;Lo;0;L;;;;;N;;;;; +1E11A;NYIAKENG PUACHUE HMONG LETTER PA;Lo;0;L;;;;;N;;;;; +1E11B;NYIAKENG PUACHUE HMONG LETTER XYA;Lo;0;L;;;;;N;;;;; +1E11C;NYIAKENG PUACHUE HMONG LETTER NPA;Lo;0;L;;;;;N;;;;; +1E11D;NYIAKENG PUACHUE HMONG LETTER DLA;Lo;0;L;;;;;N;;;;; +1E11E;NYIAKENG PUACHUE HMONG LETTER NPLA;Lo;0;L;;;;;N;;;;; +1E11F;NYIAKENG PUACHUE HMONG LETTER HAH;Lo;0;L;;;;;N;;;;; +1E120;NYIAKENG PUACHUE HMONG LETTER MLA;Lo;0;L;;;;;N;;;;; +1E121;NYIAKENG PUACHUE HMONG LETTER PLA;Lo;0;L;;;;;N;;;;; +1E122;NYIAKENG PUACHUE HMONG LETTER GA;Lo;0;L;;;;;N;;;;; +1E123;NYIAKENG PUACHUE HMONG LETTER RRA;Lo;0;L;;;;;N;;;;; +1E124;NYIAKENG PUACHUE HMONG LETTER A;Lo;0;L;;;;;N;;;;; +1E125;NYIAKENG PUACHUE HMONG LETTER AA;Lo;0;L;;;;;N;;;;; +1E126;NYIAKENG PUACHUE HMONG LETTER I;Lo;0;L;;;;;N;;;;; +1E127;NYIAKENG PUACHUE HMONG LETTER U;Lo;0;L;;;;;N;;;;; +1E128;NYIAKENG PUACHUE HMONG LETTER O;Lo;0;L;;;;;N;;;;; +1E129;NYIAKENG PUACHUE HMONG LETTER OO;Lo;0;L;;;;;N;;;;; +1E12A;NYIAKENG PUACHUE HMONG LETTER E;Lo;0;L;;;;;N;;;;; +1E12B;NYIAKENG PUACHUE HMONG LETTER EE;Lo;0;L;;;;;N;;;;; +1E12C;NYIAKENG PUACHUE HMONG LETTER W;Lo;0;L;;;;;N;;;;; +1E130;NYIAKENG PUACHUE HMONG TONE-B;Mn;230;NSM;;;;;N;;;;; +1E131;NYIAKENG PUACHUE HMONG TONE-M;Mn;230;NSM;;;;;N;;;;; +1E132;NYIAKENG PUACHUE HMONG TONE-J;Mn;230;NSM;;;;;N;;;;; +1E133;NYIAKENG PUACHUE HMONG TONE-V;Mn;230;NSM;;;;;N;;;;; +1E134;NYIAKENG PUACHUE HMONG TONE-S;Mn;230;NSM;;;;;N;;;;; +1E135;NYIAKENG PUACHUE HMONG TONE-G;Mn;230;NSM;;;;;N;;;;; +1E136;NYIAKENG PUACHUE HMONG TONE-D;Mn;230;NSM;;;;;N;;;;; +1E137;NYIAKENG PUACHUE HMONG SIGN FOR PERSON;Lm;0;L;;;;;N;;;;; +1E138;NYIAKENG PUACHUE HMONG SIGN FOR THING;Lm;0;L;;;;;N;;;;; +1E139;NYIAKENG PUACHUE HMONG SIGN FOR LOCATION;Lm;0;L;;;;;N;;;;; +1E13A;NYIAKENG PUACHUE HMONG SIGN FOR ANIMAL;Lm;0;L;;;;;N;;;;; +1E13B;NYIAKENG PUACHUE HMONG SIGN FOR INVERTEBRATE;Lm;0;L;;;;;N;;;;; +1E13C;NYIAKENG PUACHUE HMONG SIGN XW XW;Lm;0;L;;;;;N;;;;; +1E13D;NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +1E140;NYIAKENG PUACHUE HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E141;NYIAKENG PUACHUE HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E142;NYIAKENG PUACHUE HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E143;NYIAKENG PUACHUE HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E144;NYIAKENG PUACHUE HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E145;NYIAKENG PUACHUE HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E146;NYIAKENG PUACHUE HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E147;NYIAKENG PUACHUE HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E148;NYIAKENG PUACHUE HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E149;NYIAKENG PUACHUE HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E14E;NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ;Lo;0;L;;;;;N;;;;; +1E14F;NYIAKENG PUACHUE HMONG CIRCLED CA;So;0;L;;;;;N;;;;; +1E290;TOTO LETTER PA;Lo;0;L;;;;;N;;;;; +1E291;TOTO LETTER BA;Lo;0;L;;;;;N;;;;; +1E292;TOTO LETTER TA;Lo;0;L;;;;;N;;;;; +1E293;TOTO LETTER DA;Lo;0;L;;;;;N;;;;; +1E294;TOTO LETTER KA;Lo;0;L;;;;;N;;;;; +1E295;TOTO LETTER GA;Lo;0;L;;;;;N;;;;; +1E296;TOTO LETTER MA;Lo;0;L;;;;;N;;;;; +1E297;TOTO LETTER NA;Lo;0;L;;;;;N;;;;; +1E298;TOTO LETTER NGA;Lo;0;L;;;;;N;;;;; +1E299;TOTO LETTER SA;Lo;0;L;;;;;N;;;;; +1E29A;TOTO LETTER CHA;Lo;0;L;;;;;N;;;;; +1E29B;TOTO LETTER YA;Lo;0;L;;;;;N;;;;; +1E29C;TOTO LETTER WA;Lo;0;L;;;;;N;;;;; +1E29D;TOTO LETTER JA;Lo;0;L;;;;;N;;;;; +1E29E;TOTO LETTER HA;Lo;0;L;;;;;N;;;;; +1E29F;TOTO LETTER RA;Lo;0;L;;;;;N;;;;; +1E2A0;TOTO LETTER LA;Lo;0;L;;;;;N;;;;; +1E2A1;TOTO LETTER I;Lo;0;L;;;;;N;;;;; +1E2A2;TOTO LETTER BREATHY I;Lo;0;L;;;;;N;;;;; +1E2A3;TOTO LETTER IU;Lo;0;L;;;;;N;;;;; +1E2A4;TOTO LETTER BREATHY IU;Lo;0;L;;;;;N;;;;; +1E2A5;TOTO LETTER U;Lo;0;L;;;;;N;;;;; +1E2A6;TOTO LETTER E;Lo;0;L;;;;;N;;;;; +1E2A7;TOTO LETTER BREATHY E;Lo;0;L;;;;;N;;;;; +1E2A8;TOTO LETTER EO;Lo;0;L;;;;;N;;;;; +1E2A9;TOTO LETTER BREATHY EO;Lo;0;L;;;;;N;;;;; +1E2AA;TOTO LETTER O;Lo;0;L;;;;;N;;;;; +1E2AB;TOTO LETTER AE;Lo;0;L;;;;;N;;;;; +1E2AC;TOTO LETTER BREATHY AE;Lo;0;L;;;;;N;;;;; +1E2AD;TOTO LETTER A;Lo;0;L;;;;;N;;;;; +1E2AE;TOTO SIGN RISING TONE;Mn;230;NSM;;;;;N;;;;; +1E2C0;WANCHO LETTER AA;Lo;0;L;;;;;N;;;;; +1E2C1;WANCHO LETTER A;Lo;0;L;;;;;N;;;;; +1E2C2;WANCHO LETTER BA;Lo;0;L;;;;;N;;;;; +1E2C3;WANCHO LETTER CA;Lo;0;L;;;;;N;;;;; +1E2C4;WANCHO LETTER DA;Lo;0;L;;;;;N;;;;; +1E2C5;WANCHO LETTER GA;Lo;0;L;;;;;N;;;;; +1E2C6;WANCHO LETTER YA;Lo;0;L;;;;;N;;;;; +1E2C7;WANCHO LETTER PHA;Lo;0;L;;;;;N;;;;; +1E2C8;WANCHO LETTER LA;Lo;0;L;;;;;N;;;;; +1E2C9;WANCHO LETTER NA;Lo;0;L;;;;;N;;;;; +1E2CA;WANCHO LETTER PA;Lo;0;L;;;;;N;;;;; +1E2CB;WANCHO LETTER TA;Lo;0;L;;;;;N;;;;; +1E2CC;WANCHO LETTER THA;Lo;0;L;;;;;N;;;;; +1E2CD;WANCHO LETTER FA;Lo;0;L;;;;;N;;;;; +1E2CE;WANCHO LETTER SA;Lo;0;L;;;;;N;;;;; +1E2CF;WANCHO LETTER SHA;Lo;0;L;;;;;N;;;;; +1E2D0;WANCHO LETTER JA;Lo;0;L;;;;;N;;;;; +1E2D1;WANCHO LETTER ZA;Lo;0;L;;;;;N;;;;; +1E2D2;WANCHO LETTER WA;Lo;0;L;;;;;N;;;;; +1E2D3;WANCHO LETTER VA;Lo;0;L;;;;;N;;;;; +1E2D4;WANCHO LETTER KA;Lo;0;L;;;;;N;;;;; +1E2D5;WANCHO LETTER O;Lo;0;L;;;;;N;;;;; +1E2D6;WANCHO LETTER AU;Lo;0;L;;;;;N;;;;; +1E2D7;WANCHO LETTER RA;Lo;0;L;;;;;N;;;;; +1E2D8;WANCHO LETTER MA;Lo;0;L;;;;;N;;;;; +1E2D9;WANCHO LETTER KHA;Lo;0;L;;;;;N;;;;; +1E2DA;WANCHO LETTER HA;Lo;0;L;;;;;N;;;;; +1E2DB;WANCHO LETTER E;Lo;0;L;;;;;N;;;;; +1E2DC;WANCHO LETTER I;Lo;0;L;;;;;N;;;;; +1E2DD;WANCHO LETTER NGA;Lo;0;L;;;;;N;;;;; +1E2DE;WANCHO LETTER U;Lo;0;L;;;;;N;;;;; +1E2DF;WANCHO LETTER LLHA;Lo;0;L;;;;;N;;;;; +1E2E0;WANCHO LETTER TSA;Lo;0;L;;;;;N;;;;; +1E2E1;WANCHO LETTER TRA;Lo;0;L;;;;;N;;;;; +1E2E2;WANCHO LETTER ONG;Lo;0;L;;;;;N;;;;; +1E2E3;WANCHO LETTER AANG;Lo;0;L;;;;;N;;;;; +1E2E4;WANCHO LETTER ANG;Lo;0;L;;;;;N;;;;; +1E2E5;WANCHO LETTER ING;Lo;0;L;;;;;N;;;;; +1E2E6;WANCHO LETTER ON;Lo;0;L;;;;;N;;;;; +1E2E7;WANCHO LETTER EN;Lo;0;L;;;;;N;;;;; +1E2E8;WANCHO LETTER AAN;Lo;0;L;;;;;N;;;;; +1E2E9;WANCHO LETTER NYA;Lo;0;L;;;;;N;;;;; +1E2EA;WANCHO LETTER UEN;Lo;0;L;;;;;N;;;;; +1E2EB;WANCHO LETTER YIH;Lo;0;L;;;;;N;;;;; +1E2EC;WANCHO TONE TUP;Mn;230;NSM;;;;;N;;;;; +1E2ED;WANCHO TONE TUPNI;Mn;230;NSM;;;;;N;;;;; +1E2EE;WANCHO TONE KOI;Mn;230;NSM;;;;;N;;;;; +1E2EF;WANCHO TONE KOINI;Mn;230;NSM;;;;;N;;;;; +1E2F0;WANCHO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E2F1;WANCHO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E2F2;WANCHO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E2F3;WANCHO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E2F4;WANCHO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E2F5;WANCHO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E2F6;WANCHO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E2F7;WANCHO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E2F8;WANCHO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E2F9;WANCHO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E2FF;WANCHO NGUN SIGN;Sc;0;ET;;;;;N;;;;; +1E4D0;NAG MUNDARI LETTER O;Lo;0;L;;;;;N;;;;; +1E4D1;NAG MUNDARI LETTER OP;Lo;0;L;;;;;N;;;;; +1E4D2;NAG MUNDARI LETTER OL;Lo;0;L;;;;;N;;;;; +1E4D3;NAG MUNDARI LETTER OY;Lo;0;L;;;;;N;;;;; +1E4D4;NAG MUNDARI LETTER ONG;Lo;0;L;;;;;N;;;;; +1E4D5;NAG MUNDARI LETTER A;Lo;0;L;;;;;N;;;;; +1E4D6;NAG MUNDARI LETTER AJ;Lo;0;L;;;;;N;;;;; +1E4D7;NAG MUNDARI LETTER AB;Lo;0;L;;;;;N;;;;; +1E4D8;NAG MUNDARI LETTER ANY;Lo;0;L;;;;;N;;;;; +1E4D9;NAG MUNDARI LETTER AH;Lo;0;L;;;;;N;;;;; +1E4DA;NAG MUNDARI LETTER I;Lo;0;L;;;;;N;;;;; +1E4DB;NAG MUNDARI LETTER IS;Lo;0;L;;;;;N;;;;; +1E4DC;NAG MUNDARI LETTER IDD;Lo;0;L;;;;;N;;;;; +1E4DD;NAG MUNDARI LETTER IT;Lo;0;L;;;;;N;;;;; +1E4DE;NAG MUNDARI LETTER IH;Lo;0;L;;;;;N;;;;; +1E4DF;NAG MUNDARI LETTER U;Lo;0;L;;;;;N;;;;; +1E4E0;NAG MUNDARI LETTER UC;Lo;0;L;;;;;N;;;;; +1E4E1;NAG MUNDARI LETTER UD;Lo;0;L;;;;;N;;;;; +1E4E2;NAG MUNDARI LETTER UK;Lo;0;L;;;;;N;;;;; +1E4E3;NAG MUNDARI LETTER UR;Lo;0;L;;;;;N;;;;; +1E4E4;NAG MUNDARI LETTER E;Lo;0;L;;;;;N;;;;; +1E4E5;NAG MUNDARI LETTER ENN;Lo;0;L;;;;;N;;;;; +1E4E6;NAG MUNDARI LETTER EG;Lo;0;L;;;;;N;;;;; +1E4E7;NAG MUNDARI LETTER EM;Lo;0;L;;;;;N;;;;; +1E4E8;NAG MUNDARI LETTER EN;Lo;0;L;;;;;N;;;;; +1E4E9;NAG MUNDARI LETTER ETT;Lo;0;L;;;;;N;;;;; +1E4EA;NAG MUNDARI LETTER ELL;Lo;0;L;;;;;N;;;;; +1E4EB;NAG MUNDARI SIGN OJOD;Lm;0;L;;;;;N;;;;; +1E4EC;NAG MUNDARI SIGN MUHOR;Mn;232;NSM;;;;;N;;;;; +1E4ED;NAG MUNDARI SIGN TOYOR;Mn;232;NSM;;;;;N;;;;; +1E4EE;NAG MUNDARI SIGN IKIR;Mn;220;NSM;;;;;N;;;;; +1E4EF;NAG MUNDARI SIGN SUTUH;Mn;230;NSM;;;;;N;;;;; +1E4F0;NAG MUNDARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E4F1;NAG MUNDARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E4F2;NAG MUNDARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E4F3;NAG MUNDARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E4F4;NAG MUNDARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E4F5;NAG MUNDARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E4F6;NAG MUNDARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E4F7;NAG MUNDARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E4F8;NAG MUNDARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E4F9;NAG MUNDARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E5D0;OL ONAL LETTER O;Lo;0;L;;;;;N;;;;; +1E5D1;OL ONAL LETTER OM;Lo;0;L;;;;;N;;;;; +1E5D2;OL ONAL LETTER ONG;Lo;0;L;;;;;N;;;;; +1E5D3;OL ONAL LETTER ORR;Lo;0;L;;;;;N;;;;; +1E5D4;OL ONAL LETTER OO;Lo;0;L;;;;;N;;;;; +1E5D5;OL ONAL LETTER OY;Lo;0;L;;;;;N;;;;; +1E5D6;OL ONAL LETTER A;Lo;0;L;;;;;N;;;;; +1E5D7;OL ONAL LETTER AD;Lo;0;L;;;;;N;;;;; +1E5D8;OL ONAL LETTER AB;Lo;0;L;;;;;N;;;;; +1E5D9;OL ONAL LETTER AH;Lo;0;L;;;;;N;;;;; +1E5DA;OL ONAL LETTER AL;Lo;0;L;;;;;N;;;;; +1E5DB;OL ONAL LETTER AW;Lo;0;L;;;;;N;;;;; +1E5DC;OL ONAL LETTER I;Lo;0;L;;;;;N;;;;; +1E5DD;OL ONAL LETTER IT;Lo;0;L;;;;;N;;;;; +1E5DE;OL ONAL LETTER IP;Lo;0;L;;;;;N;;;;; +1E5DF;OL ONAL LETTER ITT;Lo;0;L;;;;;N;;;;; +1E5E0;OL ONAL LETTER ID;Lo;0;L;;;;;N;;;;; +1E5E1;OL ONAL LETTER IN;Lo;0;L;;;;;N;;;;; +1E5E2;OL ONAL LETTER U;Lo;0;L;;;;;N;;;;; +1E5E3;OL ONAL LETTER UK;Lo;0;L;;;;;N;;;;; +1E5E4;OL ONAL LETTER UDD;Lo;0;L;;;;;N;;;;; +1E5E5;OL ONAL LETTER UJ;Lo;0;L;;;;;N;;;;; +1E5E6;OL ONAL LETTER UNY;Lo;0;L;;;;;N;;;;; +1E5E7;OL ONAL LETTER UR;Lo;0;L;;;;;N;;;;; +1E5E8;OL ONAL LETTER E;Lo;0;L;;;;;N;;;;; +1E5E9;OL ONAL LETTER ES;Lo;0;L;;;;;N;;;;; +1E5EA;OL ONAL LETTER EH;Lo;0;L;;;;;N;;;;; +1E5EB;OL ONAL LETTER EC;Lo;0;L;;;;;N;;;;; +1E5EC;OL ONAL LETTER ENN;Lo;0;L;;;;;N;;;;; +1E5ED;OL ONAL LETTER EG;Lo;0;L;;;;;N;;;;; +1E5EE;OL ONAL SIGN MU;Mn;230;NSM;;;;;N;;;;; +1E5EF;OL ONAL SIGN IKIR;Mn;220;NSM;;;;;N;;;;; +1E5F0;OL ONAL SIGN HODDOND;Lo;0;L;;;;;N;;;;; +1E5F1;OL ONAL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E5F2;OL ONAL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E5F3;OL ONAL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E5F4;OL ONAL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E5F5;OL ONAL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E5F6;OL ONAL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E5F7;OL ONAL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E5F8;OL ONAL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E5F9;OL ONAL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E5FA;OL ONAL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E5FF;OL ONAL ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +1E6C0;TAI YO LETTER LOW KO;Lo;0;L;;;;;N;;;;; +1E6C1;TAI YO LETTER HIGH KO;Lo;0;L;;;;;N;;;;; +1E6C2;TAI YO LETTER LOW KHO;Lo;0;L;;;;;N;;;;; +1E6C3;TAI YO LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; +1E6C4;TAI YO LETTER GO;Lo;0;L;;;;;N;;;;; +1E6C5;TAI YO LETTER NGO;Lo;0;L;;;;;N;;;;; +1E6C6;TAI YO LETTER CO;Lo;0;L;;;;;N;;;;; +1E6C7;TAI YO LETTER LOW XO;Lo;0;L;;;;;N;;;;; +1E6C8;TAI YO LETTER HIGH XO;Lo;0;L;;;;;N;;;;; +1E6C9;TAI YO LETTER LOW NYO;Lo;0;L;;;;;N;;;;; +1E6CA;TAI YO LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; +1E6CB;TAI YO LETTER DO;Lo;0;L;;;;;N;;;;; +1E6CC;TAI YO LETTER LOW TO;Lo;0;L;;;;;N;;;;; +1E6CD;TAI YO LETTER HIGH TO;Lo;0;L;;;;;N;;;;; +1E6CE;TAI YO LETTER THO;Lo;0;L;;;;;N;;;;; +1E6CF;TAI YO LETTER NO;Lo;0;L;;;;;N;;;;; +1E6D0;TAI YO LETTER BO;Lo;0;L;;;;;N;;;;; +1E6D1;TAI YO LETTER LOW PO;Lo;0;L;;;;;N;;;;; +1E6D2;TAI YO LETTER HIGH PO;Lo;0;L;;;;;N;;;;; +1E6D3;TAI YO LETTER PHO;Lo;0;L;;;;;N;;;;; +1E6D4;TAI YO LETTER LOW FO;Lo;0;L;;;;;N;;;;; +1E6D5;TAI YO LETTER HIGH FO;Lo;0;L;;;;;N;;;;; +1E6D6;TAI YO LETTER MO;Lo;0;L;;;;;N;;;;; +1E6D7;TAI YO LETTER YO;Lo;0;L;;;;;N;;;;; +1E6D8;TAI YO LETTER LO;Lo;0;L;;;;;N;;;;; +1E6D9;TAI YO LETTER VO;Lo;0;L;;;;;N;;;;; +1E6DA;TAI YO LETTER LOW HO;Lo;0;L;;;;;N;;;;; +1E6DB;TAI YO LETTER HIGH HO;Lo;0;L;;;;;N;;;;; +1E6DC;TAI YO LETTER QO;Lo;0;L;;;;;N;;;;; +1E6DD;TAI YO LETTER LOW KVO;Lo;0;L;;;;;N;;;;; +1E6DE;TAI YO LETTER HIGH KVO;Lo;0;L;;;;;N;;;;; +1E6E0;TAI YO LETTER AA;Lo;0;L;;;;;N;;;;; +1E6E1;TAI YO LETTER I;Lo;0;L;;;;;N;;;;; +1E6E2;TAI YO LETTER UE;Lo;0;L;;;;;N;;;;; +1E6E3;TAI YO SIGN UE;Mn;230;NSM;;;;;N;;;;; +1E6E4;TAI YO LETTER U;Lo;0;L;;;;;N;;;;; +1E6E5;TAI YO LETTER AE;Lo;0;L;;;;;N;;;;; +1E6E6;TAI YO SIGN AU;Mn;230;NSM;;;;;N;;;;; +1E6E7;TAI YO LETTER O;Lo;0;L;;;;;N;;;;; +1E6E8;TAI YO LETTER E;Lo;0;L;;;;;N;;;;; +1E6E9;TAI YO LETTER IA;Lo;0;L;;;;;N;;;;; +1E6EA;TAI YO LETTER UEA;Lo;0;L;;;;;N;;;;; +1E6EB;TAI YO LETTER UA;Lo;0;L;;;;;N;;;;; +1E6EC;TAI YO LETTER OO;Lo;0;L;;;;;N;;;;; +1E6ED;TAI YO LETTER AUE;Lo;0;L;;;;;N;;;;; +1E6EE;TAI YO SIGN AY;Mn;230;NSM;;;;;N;;;;; +1E6EF;TAI YO SIGN ANG;Mn;230;NSM;;;;;N;;;;; +1E6F0;TAI YO LETTER AN;Lo;0;L;;;;;N;;;;; +1E6F1;TAI YO LETTER AM;Lo;0;L;;;;;N;;;;; +1E6F2;TAI YO LETTER AK;Lo;0;L;;;;;N;;;;; +1E6F3;TAI YO LETTER AT;Lo;0;L;;;;;N;;;;; +1E6F4;TAI YO LETTER AP;Lo;0;L;;;;;N;;;;; +1E6F5;TAI YO SIGN OM;Mn;230;NSM;;;;;N;;;;; +1E6FE;TAI YO SYMBOL MUEANG;Lo;0;L;;;;;N;;;;; +1E6FF;TAI YO XAM LAI;Lm;0;L;;;;;N;;;;; +1E7E0;ETHIOPIC SYLLABLE HHYA;Lo;0;L;;;;;N;;;;; +1E7E1;ETHIOPIC SYLLABLE HHYU;Lo;0;L;;;;;N;;;;; +1E7E2;ETHIOPIC SYLLABLE HHYI;Lo;0;L;;;;;N;;;;; +1E7E3;ETHIOPIC SYLLABLE HHYAA;Lo;0;L;;;;;N;;;;; +1E7E4;ETHIOPIC SYLLABLE HHYEE;Lo;0;L;;;;;N;;;;; +1E7E5;ETHIOPIC SYLLABLE HHYE;Lo;0;L;;;;;N;;;;; +1E7E6;ETHIOPIC SYLLABLE HHYO;Lo;0;L;;;;;N;;;;; +1E7E8;ETHIOPIC SYLLABLE GURAGE HHWA;Lo;0;L;;;;;N;;;;; +1E7E9;ETHIOPIC SYLLABLE HHWI;Lo;0;L;;;;;N;;;;; +1E7EA;ETHIOPIC SYLLABLE HHWEE;Lo;0;L;;;;;N;;;;; +1E7EB;ETHIOPIC SYLLABLE HHWE;Lo;0;L;;;;;N;;;;; +1E7ED;ETHIOPIC SYLLABLE GURAGE MWI;Lo;0;L;;;;;N;;;;; +1E7EE;ETHIOPIC SYLLABLE GURAGE MWEE;Lo;0;L;;;;;N;;;;; +1E7F0;ETHIOPIC SYLLABLE GURAGE QWI;Lo;0;L;;;;;N;;;;; +1E7F1;ETHIOPIC SYLLABLE GURAGE QWEE;Lo;0;L;;;;;N;;;;; +1E7F2;ETHIOPIC SYLLABLE GURAGE QWE;Lo;0;L;;;;;N;;;;; +1E7F3;ETHIOPIC SYLLABLE GURAGE BWI;Lo;0;L;;;;;N;;;;; +1E7F4;ETHIOPIC SYLLABLE GURAGE BWEE;Lo;0;L;;;;;N;;;;; +1E7F5;ETHIOPIC SYLLABLE GURAGE KWI;Lo;0;L;;;;;N;;;;; +1E7F6;ETHIOPIC SYLLABLE GURAGE KWEE;Lo;0;L;;;;;N;;;;; +1E7F7;ETHIOPIC SYLLABLE GURAGE KWE;Lo;0;L;;;;;N;;;;; +1E7F8;ETHIOPIC SYLLABLE GURAGE GWI;Lo;0;L;;;;;N;;;;; +1E7F9;ETHIOPIC SYLLABLE GURAGE GWEE;Lo;0;L;;;;;N;;;;; +1E7FA;ETHIOPIC SYLLABLE GURAGE GWE;Lo;0;L;;;;;N;;;;; +1E7FB;ETHIOPIC SYLLABLE GURAGE FWI;Lo;0;L;;;;;N;;;;; +1E7FC;ETHIOPIC SYLLABLE GURAGE FWEE;Lo;0;L;;;;;N;;;;; +1E7FD;ETHIOPIC SYLLABLE GURAGE PWI;Lo;0;L;;;;;N;;;;; +1E7FE;ETHIOPIC SYLLABLE GURAGE PWEE;Lo;0;L;;;;;N;;;;; +1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; +1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; +1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; +1E803;MENDE KIKAKUI SYLLABLE M065 KEE;Lo;0;R;;;;;N;;;;; +1E804;MENDE KIKAKUI SYLLABLE M095 KE;Lo;0;R;;;;;N;;;;; +1E805;MENDE KIKAKUI SYLLABLE M076 KOO;Lo;0;R;;;;;N;;;;; +1E806;MENDE KIKAKUI SYLLABLE M048 KO;Lo;0;R;;;;;N;;;;; +1E807;MENDE KIKAKUI SYLLABLE M179 KUA;Lo;0;R;;;;;N;;;;; +1E808;MENDE KIKAKUI SYLLABLE M004 WI;Lo;0;R;;;;;N;;;;; +1E809;MENDE KIKAKUI SYLLABLE M005 WA;Lo;0;R;;;;;N;;;;; +1E80A;MENDE KIKAKUI SYLLABLE M006 WU;Lo;0;R;;;;;N;;;;; +1E80B;MENDE KIKAKUI SYLLABLE M126 WEE;Lo;0;R;;;;;N;;;;; +1E80C;MENDE KIKAKUI SYLLABLE M118 WE;Lo;0;R;;;;;N;;;;; +1E80D;MENDE KIKAKUI SYLLABLE M114 WOO;Lo;0;R;;;;;N;;;;; +1E80E;MENDE KIKAKUI SYLLABLE M045 WO;Lo;0;R;;;;;N;;;;; +1E80F;MENDE KIKAKUI SYLLABLE M194 WUI;Lo;0;R;;;;;N;;;;; +1E810;MENDE KIKAKUI SYLLABLE M143 WEI;Lo;0;R;;;;;N;;;;; +1E811;MENDE KIKAKUI SYLLABLE M061 WVI;Lo;0;R;;;;;N;;;;; +1E812;MENDE KIKAKUI SYLLABLE M049 WVA;Lo;0;R;;;;;N;;;;; +1E813;MENDE KIKAKUI SYLLABLE M139 WVE;Lo;0;R;;;;;N;;;;; +1E814;MENDE KIKAKUI SYLLABLE M007 MIN;Lo;0;R;;;;;N;;;;; +1E815;MENDE KIKAKUI SYLLABLE M008 MAN;Lo;0;R;;;;;N;;;;; +1E816;MENDE KIKAKUI SYLLABLE M009 MUN;Lo;0;R;;;;;N;;;;; +1E817;MENDE KIKAKUI SYLLABLE M059 MEN;Lo;0;R;;;;;N;;;;; +1E818;MENDE KIKAKUI SYLLABLE M094 MON;Lo;0;R;;;;;N;;;;; +1E819;MENDE KIKAKUI SYLLABLE M154 MUAN;Lo;0;R;;;;;N;;;;; +1E81A;MENDE KIKAKUI SYLLABLE M189 MUEN;Lo;0;R;;;;;N;;;;; +1E81B;MENDE KIKAKUI SYLLABLE M010 BI;Lo;0;R;;;;;N;;;;; +1E81C;MENDE KIKAKUI SYLLABLE M011 BA;Lo;0;R;;;;;N;;;;; +1E81D;MENDE KIKAKUI SYLLABLE M012 BU;Lo;0;R;;;;;N;;;;; +1E81E;MENDE KIKAKUI SYLLABLE M150 BEE;Lo;0;R;;;;;N;;;;; +1E81F;MENDE KIKAKUI SYLLABLE M097 BE;Lo;0;R;;;;;N;;;;; +1E820;MENDE KIKAKUI SYLLABLE M103 BOO;Lo;0;R;;;;;N;;;;; +1E821;MENDE KIKAKUI SYLLABLE M138 BO;Lo;0;R;;;;;N;;;;; +1E822;MENDE KIKAKUI SYLLABLE M013 I;Lo;0;R;;;;;N;;;;; +1E823;MENDE KIKAKUI SYLLABLE M014 A;Lo;0;R;;;;;N;;;;; +1E824;MENDE KIKAKUI SYLLABLE M015 U;Lo;0;R;;;;;N;;;;; +1E825;MENDE KIKAKUI SYLLABLE M163 EE;Lo;0;R;;;;;N;;;;; +1E826;MENDE KIKAKUI SYLLABLE M100 E;Lo;0;R;;;;;N;;;;; +1E827;MENDE KIKAKUI SYLLABLE M165 OO;Lo;0;R;;;;;N;;;;; +1E828;MENDE KIKAKUI SYLLABLE M147 O;Lo;0;R;;;;;N;;;;; +1E829;MENDE KIKAKUI SYLLABLE M137 EI;Lo;0;R;;;;;N;;;;; +1E82A;MENDE KIKAKUI SYLLABLE M131 IN;Lo;0;R;;;;;N;;;;; +1E82B;MENDE KIKAKUI SYLLABLE M135 IN;Lo;0;R;;;;;N;;;;; +1E82C;MENDE KIKAKUI SYLLABLE M195 AN;Lo;0;R;;;;;N;;;;; +1E82D;MENDE KIKAKUI SYLLABLE M178 EN;Lo;0;R;;;;;N;;;;; +1E82E;MENDE KIKAKUI SYLLABLE M019 SI;Lo;0;R;;;;;N;;;;; +1E82F;MENDE KIKAKUI SYLLABLE M020 SA;Lo;0;R;;;;;N;;;;; +1E830;MENDE KIKAKUI SYLLABLE M021 SU;Lo;0;R;;;;;N;;;;; +1E831;MENDE KIKAKUI SYLLABLE M162 SEE;Lo;0;R;;;;;N;;;;; +1E832;MENDE KIKAKUI SYLLABLE M116 SE;Lo;0;R;;;;;N;;;;; +1E833;MENDE KIKAKUI SYLLABLE M136 SOO;Lo;0;R;;;;;N;;;;; +1E834;MENDE KIKAKUI SYLLABLE M079 SO;Lo;0;R;;;;;N;;;;; +1E835;MENDE KIKAKUI SYLLABLE M196 SIA;Lo;0;R;;;;;N;;;;; +1E836;MENDE KIKAKUI SYLLABLE M025 LI;Lo;0;R;;;;;N;;;;; +1E837;MENDE KIKAKUI SYLLABLE M026 LA;Lo;0;R;;;;;N;;;;; +1E838;MENDE KIKAKUI SYLLABLE M027 LU;Lo;0;R;;;;;N;;;;; +1E839;MENDE KIKAKUI SYLLABLE M084 LEE;Lo;0;R;;;;;N;;;;; +1E83A;MENDE KIKAKUI SYLLABLE M073 LE;Lo;0;R;;;;;N;;;;; +1E83B;MENDE KIKAKUI SYLLABLE M054 LOO;Lo;0;R;;;;;N;;;;; +1E83C;MENDE KIKAKUI SYLLABLE M153 LO;Lo;0;R;;;;;N;;;;; +1E83D;MENDE KIKAKUI SYLLABLE M110 LONG LE;Lo;0;R;;;;;N;;;;; +1E83E;MENDE KIKAKUI SYLLABLE M016 DI;Lo;0;R;;;;;N;;;;; +1E83F;MENDE KIKAKUI SYLLABLE M017 DA;Lo;0;R;;;;;N;;;;; +1E840;MENDE KIKAKUI SYLLABLE M018 DU;Lo;0;R;;;;;N;;;;; +1E841;MENDE KIKAKUI SYLLABLE M089 DEE;Lo;0;R;;;;;N;;;;; +1E842;MENDE KIKAKUI SYLLABLE M180 DOO;Lo;0;R;;;;;N;;;;; +1E843;MENDE KIKAKUI SYLLABLE M181 DO;Lo;0;R;;;;;N;;;;; +1E844;MENDE KIKAKUI SYLLABLE M022 TI;Lo;0;R;;;;;N;;;;; +1E845;MENDE KIKAKUI SYLLABLE M023 TA;Lo;0;R;;;;;N;;;;; +1E846;MENDE KIKAKUI SYLLABLE M024 TU;Lo;0;R;;;;;N;;;;; +1E847;MENDE KIKAKUI SYLLABLE M091 TEE;Lo;0;R;;;;;N;;;;; +1E848;MENDE KIKAKUI SYLLABLE M055 TE;Lo;0;R;;;;;N;;;;; +1E849;MENDE KIKAKUI SYLLABLE M104 TOO;Lo;0;R;;;;;N;;;;; +1E84A;MENDE KIKAKUI SYLLABLE M069 TO;Lo;0;R;;;;;N;;;;; +1E84B;MENDE KIKAKUI SYLLABLE M028 JI;Lo;0;R;;;;;N;;;;; +1E84C;MENDE KIKAKUI SYLLABLE M029 JA;Lo;0;R;;;;;N;;;;; +1E84D;MENDE KIKAKUI SYLLABLE M030 JU;Lo;0;R;;;;;N;;;;; +1E84E;MENDE KIKAKUI SYLLABLE M157 JEE;Lo;0;R;;;;;N;;;;; +1E84F;MENDE KIKAKUI SYLLABLE M113 JE;Lo;0;R;;;;;N;;;;; +1E850;MENDE KIKAKUI SYLLABLE M160 JOO;Lo;0;R;;;;;N;;;;; +1E851;MENDE KIKAKUI SYLLABLE M063 JO;Lo;0;R;;;;;N;;;;; +1E852;MENDE KIKAKUI SYLLABLE M175 LONG JO;Lo;0;R;;;;;N;;;;; +1E853;MENDE KIKAKUI SYLLABLE M031 YI;Lo;0;R;;;;;N;;;;; +1E854;MENDE KIKAKUI SYLLABLE M032 YA;Lo;0;R;;;;;N;;;;; +1E855;MENDE KIKAKUI SYLLABLE M033 YU;Lo;0;R;;;;;N;;;;; +1E856;MENDE KIKAKUI SYLLABLE M109 YEE;Lo;0;R;;;;;N;;;;; +1E857;MENDE KIKAKUI SYLLABLE M080 YE;Lo;0;R;;;;;N;;;;; +1E858;MENDE KIKAKUI SYLLABLE M141 YOO;Lo;0;R;;;;;N;;;;; +1E859;MENDE KIKAKUI SYLLABLE M121 YO;Lo;0;R;;;;;N;;;;; +1E85A;MENDE KIKAKUI SYLLABLE M034 FI;Lo;0;R;;;;;N;;;;; +1E85B;MENDE KIKAKUI SYLLABLE M035 FA;Lo;0;R;;;;;N;;;;; +1E85C;MENDE KIKAKUI SYLLABLE M036 FU;Lo;0;R;;;;;N;;;;; +1E85D;MENDE KIKAKUI SYLLABLE M078 FEE;Lo;0;R;;;;;N;;;;; +1E85E;MENDE KIKAKUI SYLLABLE M075 FE;Lo;0;R;;;;;N;;;;; +1E85F;MENDE KIKAKUI SYLLABLE M133 FOO;Lo;0;R;;;;;N;;;;; +1E860;MENDE KIKAKUI SYLLABLE M088 FO;Lo;0;R;;;;;N;;;;; +1E861;MENDE KIKAKUI SYLLABLE M197 FUA;Lo;0;R;;;;;N;;;;; +1E862;MENDE KIKAKUI SYLLABLE M101 FAN;Lo;0;R;;;;;N;;;;; +1E863;MENDE KIKAKUI SYLLABLE M037 NIN;Lo;0;R;;;;;N;;;;; +1E864;MENDE KIKAKUI SYLLABLE M038 NAN;Lo;0;R;;;;;N;;;;; +1E865;MENDE KIKAKUI SYLLABLE M039 NUN;Lo;0;R;;;;;N;;;;; +1E866;MENDE KIKAKUI SYLLABLE M117 NEN;Lo;0;R;;;;;N;;;;; +1E867;MENDE KIKAKUI SYLLABLE M169 NON;Lo;0;R;;;;;N;;;;; +1E868;MENDE KIKAKUI SYLLABLE M176 HI;Lo;0;R;;;;;N;;;;; +1E869;MENDE KIKAKUI SYLLABLE M041 HA;Lo;0;R;;;;;N;;;;; +1E86A;MENDE KIKAKUI SYLLABLE M186 HU;Lo;0;R;;;;;N;;;;; +1E86B;MENDE KIKAKUI SYLLABLE M040 HEE;Lo;0;R;;;;;N;;;;; +1E86C;MENDE KIKAKUI SYLLABLE M096 HE;Lo;0;R;;;;;N;;;;; +1E86D;MENDE KIKAKUI SYLLABLE M042 HOO;Lo;0;R;;;;;N;;;;; +1E86E;MENDE KIKAKUI SYLLABLE M140 HO;Lo;0;R;;;;;N;;;;; +1E86F;MENDE KIKAKUI SYLLABLE M083 HEEI;Lo;0;R;;;;;N;;;;; +1E870;MENDE KIKAKUI SYLLABLE M128 HOOU;Lo;0;R;;;;;N;;;;; +1E871;MENDE KIKAKUI SYLLABLE M053 HIN;Lo;0;R;;;;;N;;;;; +1E872;MENDE KIKAKUI SYLLABLE M130 HAN;Lo;0;R;;;;;N;;;;; +1E873;MENDE KIKAKUI SYLLABLE M087 HUN;Lo;0;R;;;;;N;;;;; +1E874;MENDE KIKAKUI SYLLABLE M052 HEN;Lo;0;R;;;;;N;;;;; +1E875;MENDE KIKAKUI SYLLABLE M193 HON;Lo;0;R;;;;;N;;;;; +1E876;MENDE KIKAKUI SYLLABLE M046 HUAN;Lo;0;R;;;;;N;;;;; +1E877;MENDE KIKAKUI SYLLABLE M090 NGGI;Lo;0;R;;;;;N;;;;; +1E878;MENDE KIKAKUI SYLLABLE M043 NGGA;Lo;0;R;;;;;N;;;;; +1E879;MENDE KIKAKUI SYLLABLE M082 NGGU;Lo;0;R;;;;;N;;;;; +1E87A;MENDE KIKAKUI SYLLABLE M115 NGGEE;Lo;0;R;;;;;N;;;;; +1E87B;MENDE KIKAKUI SYLLABLE M146 NGGE;Lo;0;R;;;;;N;;;;; +1E87C;MENDE KIKAKUI SYLLABLE M156 NGGOO;Lo;0;R;;;;;N;;;;; +1E87D;MENDE KIKAKUI SYLLABLE M120 NGGO;Lo;0;R;;;;;N;;;;; +1E87E;MENDE KIKAKUI SYLLABLE M159 NGGAA;Lo;0;R;;;;;N;;;;; +1E87F;MENDE KIKAKUI SYLLABLE M127 NGGUA;Lo;0;R;;;;;N;;;;; +1E880;MENDE KIKAKUI SYLLABLE M086 LONG NGGE;Lo;0;R;;;;;N;;;;; +1E881;MENDE KIKAKUI SYLLABLE M106 LONG NGGOO;Lo;0;R;;;;;N;;;;; +1E882;MENDE KIKAKUI SYLLABLE M183 LONG NGGO;Lo;0;R;;;;;N;;;;; +1E883;MENDE KIKAKUI SYLLABLE M155 GI;Lo;0;R;;;;;N;;;;; +1E884;MENDE KIKAKUI SYLLABLE M111 GA;Lo;0;R;;;;;N;;;;; +1E885;MENDE KIKAKUI SYLLABLE M168 GU;Lo;0;R;;;;;N;;;;; +1E886;MENDE KIKAKUI SYLLABLE M190 GEE;Lo;0;R;;;;;N;;;;; +1E887;MENDE KIKAKUI SYLLABLE M166 GUEI;Lo;0;R;;;;;N;;;;; +1E888;MENDE KIKAKUI SYLLABLE M167 GUAN;Lo;0;R;;;;;N;;;;; +1E889;MENDE KIKAKUI SYLLABLE M184 NGEN;Lo;0;R;;;;;N;;;;; +1E88A;MENDE KIKAKUI SYLLABLE M057 NGON;Lo;0;R;;;;;N;;;;; +1E88B;MENDE KIKAKUI SYLLABLE M177 NGUAN;Lo;0;R;;;;;N;;;;; +1E88C;MENDE KIKAKUI SYLLABLE M068 PI;Lo;0;R;;;;;N;;;;; +1E88D;MENDE KIKAKUI SYLLABLE M099 PA;Lo;0;R;;;;;N;;;;; +1E88E;MENDE KIKAKUI SYLLABLE M050 PU;Lo;0;R;;;;;N;;;;; +1E88F;MENDE KIKAKUI SYLLABLE M081 PEE;Lo;0;R;;;;;N;;;;; +1E890;MENDE KIKAKUI SYLLABLE M051 PE;Lo;0;R;;;;;N;;;;; +1E891;MENDE KIKAKUI SYLLABLE M102 POO;Lo;0;R;;;;;N;;;;; +1E892;MENDE KIKAKUI SYLLABLE M066 PO;Lo;0;R;;;;;N;;;;; +1E893;MENDE KIKAKUI SYLLABLE M145 MBI;Lo;0;R;;;;;N;;;;; +1E894;MENDE KIKAKUI SYLLABLE M062 MBA;Lo;0;R;;;;;N;;;;; +1E895;MENDE KIKAKUI SYLLABLE M122 MBU;Lo;0;R;;;;;N;;;;; +1E896;MENDE KIKAKUI SYLLABLE M047 MBEE;Lo;0;R;;;;;N;;;;; +1E897;MENDE KIKAKUI SYLLABLE M188 MBEE;Lo;0;R;;;;;N;;;;; +1E898;MENDE KIKAKUI SYLLABLE M072 MBE;Lo;0;R;;;;;N;;;;; +1E899;MENDE KIKAKUI SYLLABLE M172 MBOO;Lo;0;R;;;;;N;;;;; +1E89A;MENDE KIKAKUI SYLLABLE M174 MBO;Lo;0;R;;;;;N;;;;; +1E89B;MENDE KIKAKUI SYLLABLE M187 MBUU;Lo;0;R;;;;;N;;;;; +1E89C;MENDE KIKAKUI SYLLABLE M161 LONG MBE;Lo;0;R;;;;;N;;;;; +1E89D;MENDE KIKAKUI SYLLABLE M105 LONG MBOO;Lo;0;R;;;;;N;;;;; +1E89E;MENDE KIKAKUI SYLLABLE M142 LONG MBO;Lo;0;R;;;;;N;;;;; +1E89F;MENDE KIKAKUI SYLLABLE M132 KPI;Lo;0;R;;;;;N;;;;; +1E8A0;MENDE KIKAKUI SYLLABLE M092 KPA;Lo;0;R;;;;;N;;;;; +1E8A1;MENDE KIKAKUI SYLLABLE M074 KPU;Lo;0;R;;;;;N;;;;; +1E8A2;MENDE KIKAKUI SYLLABLE M044 KPEE;Lo;0;R;;;;;N;;;;; +1E8A3;MENDE KIKAKUI SYLLABLE M108 KPE;Lo;0;R;;;;;N;;;;; +1E8A4;MENDE KIKAKUI SYLLABLE M112 KPOO;Lo;0;R;;;;;N;;;;; +1E8A5;MENDE KIKAKUI SYLLABLE M158 KPO;Lo;0;R;;;;;N;;;;; +1E8A6;MENDE KIKAKUI SYLLABLE M124 GBI;Lo;0;R;;;;;N;;;;; +1E8A7;MENDE KIKAKUI SYLLABLE M056 GBA;Lo;0;R;;;;;N;;;;; +1E8A8;MENDE KIKAKUI SYLLABLE M148 GBU;Lo;0;R;;;;;N;;;;; +1E8A9;MENDE KIKAKUI SYLLABLE M093 GBEE;Lo;0;R;;;;;N;;;;; +1E8AA;MENDE KIKAKUI SYLLABLE M107 GBE;Lo;0;R;;;;;N;;;;; +1E8AB;MENDE KIKAKUI SYLLABLE M071 GBOO;Lo;0;R;;;;;N;;;;; +1E8AC;MENDE KIKAKUI SYLLABLE M070 GBO;Lo;0;R;;;;;N;;;;; +1E8AD;MENDE KIKAKUI SYLLABLE M171 RA;Lo;0;R;;;;;N;;;;; +1E8AE;MENDE KIKAKUI SYLLABLE M123 NDI;Lo;0;R;;;;;N;;;;; +1E8AF;MENDE KIKAKUI SYLLABLE M129 NDA;Lo;0;R;;;;;N;;;;; +1E8B0;MENDE KIKAKUI SYLLABLE M125 NDU;Lo;0;R;;;;;N;;;;; +1E8B1;MENDE KIKAKUI SYLLABLE M191 NDEE;Lo;0;R;;;;;N;;;;; +1E8B2;MENDE KIKAKUI SYLLABLE M119 NDE;Lo;0;R;;;;;N;;;;; +1E8B3;MENDE KIKAKUI SYLLABLE M067 NDOO;Lo;0;R;;;;;N;;;;; +1E8B4;MENDE KIKAKUI SYLLABLE M064 NDO;Lo;0;R;;;;;N;;;;; +1E8B5;MENDE KIKAKUI SYLLABLE M152 NJA;Lo;0;R;;;;;N;;;;; +1E8B6;MENDE KIKAKUI SYLLABLE M192 NJU;Lo;0;R;;;;;N;;;;; +1E8B7;MENDE KIKAKUI SYLLABLE M149 NJEE;Lo;0;R;;;;;N;;;;; +1E8B8;MENDE KIKAKUI SYLLABLE M134 NJOO;Lo;0;R;;;;;N;;;;; +1E8B9;MENDE KIKAKUI SYLLABLE M182 VI;Lo;0;R;;;;;N;;;;; +1E8BA;MENDE KIKAKUI SYLLABLE M185 VA;Lo;0;R;;;;;N;;;;; +1E8BB;MENDE KIKAKUI SYLLABLE M151 VU;Lo;0;R;;;;;N;;;;; +1E8BC;MENDE KIKAKUI SYLLABLE M173 VEE;Lo;0;R;;;;;N;;;;; +1E8BD;MENDE KIKAKUI SYLLABLE M085 VE;Lo;0;R;;;;;N;;;;; +1E8BE;MENDE KIKAKUI SYLLABLE M144 VOO;Lo;0;R;;;;;N;;;;; +1E8BF;MENDE KIKAKUI SYLLABLE M077 VO;Lo;0;R;;;;;N;;;;; +1E8C0;MENDE KIKAKUI SYLLABLE M164 NYIN;Lo;0;R;;;;;N;;;;; +1E8C1;MENDE KIKAKUI SYLLABLE M058 NYAN;Lo;0;R;;;;;N;;;;; +1E8C2;MENDE KIKAKUI SYLLABLE M170 NYUN;Lo;0;R;;;;;N;;;;; +1E8C3;MENDE KIKAKUI SYLLABLE M098 NYEN;Lo;0;R;;;;;N;;;;; +1E8C4;MENDE KIKAKUI SYLLABLE M060 NYON;Lo;0;R;;;;;N;;;;; +1E8C7;MENDE KIKAKUI DIGIT ONE;No;0;R;;;;1;N;;;;; +1E8C8;MENDE KIKAKUI DIGIT TWO;No;0;R;;;;2;N;;;;; +1E8C9;MENDE KIKAKUI DIGIT THREE;No;0;R;;;;3;N;;;;; +1E8CA;MENDE KIKAKUI DIGIT FOUR;No;0;R;;;;4;N;;;;; +1E8CB;MENDE KIKAKUI DIGIT FIVE;No;0;R;;;;5;N;;;;; +1E8CC;MENDE KIKAKUI DIGIT SIX;No;0;R;;;;6;N;;;;; +1E8CD;MENDE KIKAKUI DIGIT SEVEN;No;0;R;;;;7;N;;;;; +1E8CE;MENDE KIKAKUI DIGIT EIGHT;No;0;R;;;;8;N;;;;; +1E8CF;MENDE KIKAKUI DIGIT NINE;No;0;R;;;;9;N;;;;; +1E8D0;MENDE KIKAKUI COMBINING NUMBER TEENS;Mn;220;NSM;;;;;N;;;;; +1E8D1;MENDE KIKAKUI COMBINING NUMBER TENS;Mn;220;NSM;;;;;N;;;;; +1E8D2;MENDE KIKAKUI COMBINING NUMBER HUNDREDS;Mn;220;NSM;;;;;N;;;;; +1E8D3;MENDE KIKAKUI COMBINING NUMBER THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D4;MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D5;MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D6;MENDE KIKAKUI COMBINING NUMBER MILLIONS;Mn;220;NSM;;;;;N;;;;; +1E900;ADLAM CAPITAL LETTER ALIF;Lu;0;R;;;;;N;;;;1E922; +1E901;ADLAM CAPITAL LETTER DAALI;Lu;0;R;;;;;N;;;;1E923; +1E902;ADLAM CAPITAL LETTER LAAM;Lu;0;R;;;;;N;;;;1E924; +1E903;ADLAM CAPITAL LETTER MIIM;Lu;0;R;;;;;N;;;;1E925; +1E904;ADLAM CAPITAL LETTER BA;Lu;0;R;;;;;N;;;;1E926; +1E905;ADLAM CAPITAL LETTER SINNYIIYHE;Lu;0;R;;;;;N;;;;1E927; +1E906;ADLAM CAPITAL LETTER PE;Lu;0;R;;;;;N;;;;1E928; +1E907;ADLAM CAPITAL LETTER BHE;Lu;0;R;;;;;N;;;;1E929; +1E908;ADLAM CAPITAL LETTER RA;Lu;0;R;;;;;N;;;;1E92A; +1E909;ADLAM CAPITAL LETTER E;Lu;0;R;;;;;N;;;;1E92B; +1E90A;ADLAM CAPITAL LETTER FA;Lu;0;R;;;;;N;;;;1E92C; +1E90B;ADLAM CAPITAL LETTER I;Lu;0;R;;;;;N;;;;1E92D; +1E90C;ADLAM CAPITAL LETTER O;Lu;0;R;;;;;N;;;;1E92E; +1E90D;ADLAM CAPITAL LETTER DHA;Lu;0;R;;;;;N;;;;1E92F; +1E90E;ADLAM CAPITAL LETTER YHE;Lu;0;R;;;;;N;;;;1E930; +1E90F;ADLAM CAPITAL LETTER WAW;Lu;0;R;;;;;N;;;;1E931; +1E910;ADLAM CAPITAL LETTER NUN;Lu;0;R;;;;;N;;;;1E932; +1E911;ADLAM CAPITAL LETTER KAF;Lu;0;R;;;;;N;;;;1E933; +1E912;ADLAM CAPITAL LETTER YA;Lu;0;R;;;;;N;;;;1E934; +1E913;ADLAM CAPITAL LETTER U;Lu;0;R;;;;;N;;;;1E935; +1E914;ADLAM CAPITAL LETTER JIIM;Lu;0;R;;;;;N;;;;1E936; +1E915;ADLAM CAPITAL LETTER CHI;Lu;0;R;;;;;N;;;;1E937; +1E916;ADLAM CAPITAL LETTER HA;Lu;0;R;;;;;N;;;;1E938; +1E917;ADLAM CAPITAL LETTER QAAF;Lu;0;R;;;;;N;;;;1E939; +1E918;ADLAM CAPITAL LETTER GA;Lu;0;R;;;;;N;;;;1E93A; +1E919;ADLAM CAPITAL LETTER NYA;Lu;0;R;;;;;N;;;;1E93B; +1E91A;ADLAM CAPITAL LETTER TU;Lu;0;R;;;;;N;;;;1E93C; +1E91B;ADLAM CAPITAL LETTER NHA;Lu;0;R;;;;;N;;;;1E93D; +1E91C;ADLAM CAPITAL LETTER VA;Lu;0;R;;;;;N;;;;1E93E; +1E91D;ADLAM CAPITAL LETTER KHA;Lu;0;R;;;;;N;;;;1E93F; +1E91E;ADLAM CAPITAL LETTER GBE;Lu;0;R;;;;;N;;;;1E940; +1E91F;ADLAM CAPITAL LETTER ZAL;Lu;0;R;;;;;N;;;;1E941; +1E920;ADLAM CAPITAL LETTER KPO;Lu;0;R;;;;;N;;;;1E942; +1E921;ADLAM CAPITAL LETTER SHA;Lu;0;R;;;;;N;;;;1E943; +1E922;ADLAM SMALL LETTER ALIF;Ll;0;R;;;;;N;;;1E900;;1E900 +1E923;ADLAM SMALL LETTER DAALI;Ll;0;R;;;;;N;;;1E901;;1E901 +1E924;ADLAM SMALL LETTER LAAM;Ll;0;R;;;;;N;;;1E902;;1E902 +1E925;ADLAM SMALL LETTER MIIM;Ll;0;R;;;;;N;;;1E903;;1E903 +1E926;ADLAM SMALL LETTER BA;Ll;0;R;;;;;N;;;1E904;;1E904 +1E927;ADLAM SMALL LETTER SINNYIIYHE;Ll;0;R;;;;;N;;;1E905;;1E905 +1E928;ADLAM SMALL LETTER PE;Ll;0;R;;;;;N;;;1E906;;1E906 +1E929;ADLAM SMALL LETTER BHE;Ll;0;R;;;;;N;;;1E907;;1E907 +1E92A;ADLAM SMALL LETTER RA;Ll;0;R;;;;;N;;;1E908;;1E908 +1E92B;ADLAM SMALL LETTER E;Ll;0;R;;;;;N;;;1E909;;1E909 +1E92C;ADLAM SMALL LETTER FA;Ll;0;R;;;;;N;;;1E90A;;1E90A +1E92D;ADLAM SMALL LETTER I;Ll;0;R;;;;;N;;;1E90B;;1E90B +1E92E;ADLAM SMALL LETTER O;Ll;0;R;;;;;N;;;1E90C;;1E90C +1E92F;ADLAM SMALL LETTER DHA;Ll;0;R;;;;;N;;;1E90D;;1E90D +1E930;ADLAM SMALL LETTER YHE;Ll;0;R;;;;;N;;;1E90E;;1E90E +1E931;ADLAM SMALL LETTER WAW;Ll;0;R;;;;;N;;;1E90F;;1E90F +1E932;ADLAM SMALL LETTER NUN;Ll;0;R;;;;;N;;;1E910;;1E910 +1E933;ADLAM SMALL LETTER KAF;Ll;0;R;;;;;N;;;1E911;;1E911 +1E934;ADLAM SMALL LETTER YA;Ll;0;R;;;;;N;;;1E912;;1E912 +1E935;ADLAM SMALL LETTER U;Ll;0;R;;;;;N;;;1E913;;1E913 +1E936;ADLAM SMALL LETTER JIIM;Ll;0;R;;;;;N;;;1E914;;1E914 +1E937;ADLAM SMALL LETTER CHI;Ll;0;R;;;;;N;;;1E915;;1E915 +1E938;ADLAM SMALL LETTER HA;Ll;0;R;;;;;N;;;1E916;;1E916 +1E939;ADLAM SMALL LETTER QAAF;Ll;0;R;;;;;N;;;1E917;;1E917 +1E93A;ADLAM SMALL LETTER GA;Ll;0;R;;;;;N;;;1E918;;1E918 +1E93B;ADLAM SMALL LETTER NYA;Ll;0;R;;;;;N;;;1E919;;1E919 +1E93C;ADLAM SMALL LETTER TU;Ll;0;R;;;;;N;;;1E91A;;1E91A +1E93D;ADLAM SMALL LETTER NHA;Ll;0;R;;;;;N;;;1E91B;;1E91B +1E93E;ADLAM SMALL LETTER VA;Ll;0;R;;;;;N;;;1E91C;;1E91C +1E93F;ADLAM SMALL LETTER KHA;Ll;0;R;;;;;N;;;1E91D;;1E91D +1E940;ADLAM SMALL LETTER GBE;Ll;0;R;;;;;N;;;1E91E;;1E91E +1E941;ADLAM SMALL LETTER ZAL;Ll;0;R;;;;;N;;;1E91F;;1E91F +1E942;ADLAM SMALL LETTER KPO;Ll;0;R;;;;;N;;;1E920;;1E920 +1E943;ADLAM SMALL LETTER SHA;Ll;0;R;;;;;N;;;1E921;;1E921 +1E944;ADLAM ALIF LENGTHENER;Mn;230;NSM;;;;;N;;;;; +1E945;ADLAM VOWEL LENGTHENER;Mn;230;NSM;;;;;N;;;;; +1E946;ADLAM GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1E947;ADLAM HAMZA;Mn;230;NSM;;;;;N;;;;; +1E948;ADLAM CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;; +1E949;ADLAM GEMINATE CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;; +1E94A;ADLAM NUKTA;Mn;7;NSM;;;;;N;;;;; +1E94B;ADLAM NASALIZATION MARK;Lm;0;R;;;;;N;;;;; +1E950;ADLAM DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +1E951;ADLAM DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +1E952;ADLAM DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +1E953;ADLAM DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +1E954;ADLAM DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +1E955;ADLAM DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +1E956;ADLAM DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +1E957;ADLAM DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +1E958;ADLAM DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +1E959;ADLAM DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +1E95E;ADLAM INITIAL EXCLAMATION MARK;Po;0;R;;;;;N;;;;; +1E95F;ADLAM INITIAL QUESTION MARK;Po;0;R;;;;;N;;;;; +1EC71;INDIC SIYAQ NUMBER ONE;No;0;AL;;;;1;N;;;;; +1EC72;INDIC SIYAQ NUMBER TWO;No;0;AL;;;;2;N;;;;; +1EC73;INDIC SIYAQ NUMBER THREE;No;0;AL;;;;3;N;;;;; +1EC74;INDIC SIYAQ NUMBER FOUR;No;0;AL;;;;4;N;;;;; +1EC75;INDIC SIYAQ NUMBER FIVE;No;0;AL;;;;5;N;;;;; +1EC76;INDIC SIYAQ NUMBER SIX;No;0;AL;;;;6;N;;;;; +1EC77;INDIC SIYAQ NUMBER SEVEN;No;0;AL;;;;7;N;;;;; +1EC78;INDIC SIYAQ NUMBER EIGHT;No;0;AL;;;;8;N;;;;; +1EC79;INDIC SIYAQ NUMBER NINE;No;0;AL;;;;9;N;;;;; +1EC7A;INDIC SIYAQ NUMBER TEN;No;0;AL;;;;10;N;;;;; +1EC7B;INDIC SIYAQ NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +1EC7C;INDIC SIYAQ NUMBER THIRTY;No;0;AL;;;;30;N;;;;; +1EC7D;INDIC SIYAQ NUMBER FORTY;No;0;AL;;;;40;N;;;;; +1EC7E;INDIC SIYAQ NUMBER FIFTY;No;0;AL;;;;50;N;;;;; +1EC7F;INDIC SIYAQ NUMBER SIXTY;No;0;AL;;;;60;N;;;;; +1EC80;INDIC SIYAQ NUMBER SEVENTY;No;0;AL;;;;70;N;;;;; +1EC81;INDIC SIYAQ NUMBER EIGHTY;No;0;AL;;;;80;N;;;;; +1EC82;INDIC SIYAQ NUMBER NINETY;No;0;AL;;;;90;N;;;;; +1EC83;INDIC SIYAQ NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +1EC84;INDIC SIYAQ NUMBER TWO HUNDRED;No;0;AL;;;;200;N;;;;; +1EC85;INDIC SIYAQ NUMBER THREE HUNDRED;No;0;AL;;;;300;N;;;;; +1EC86;INDIC SIYAQ NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;; +1EC87;INDIC SIYAQ NUMBER FIVE HUNDRED;No;0;AL;;;;500;N;;;;; +1EC88;INDIC SIYAQ NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;; +1EC89;INDIC SIYAQ NUMBER SEVEN HUNDRED;No;0;AL;;;;700;N;;;;; +1EC8A;INDIC SIYAQ NUMBER EIGHT HUNDRED;No;0;AL;;;;800;N;;;;; +1EC8B;INDIC SIYAQ NUMBER NINE HUNDRED;No;0;AL;;;;900;N;;;;; +1EC8C;INDIC SIYAQ NUMBER ONE THOUSAND;No;0;AL;;;;1000;N;;;;; +1EC8D;INDIC SIYAQ NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;; +1EC8E;INDIC SIYAQ NUMBER THREE THOUSAND;No;0;AL;;;;3000;N;;;;; +1EC8F;INDIC SIYAQ NUMBER FOUR THOUSAND;No;0;AL;;;;4000;N;;;;; +1EC90;INDIC SIYAQ NUMBER FIVE THOUSAND;No;0;AL;;;;5000;N;;;;; +1EC91;INDIC SIYAQ NUMBER SIX THOUSAND;No;0;AL;;;;6000;N;;;;; +1EC92;INDIC SIYAQ NUMBER SEVEN THOUSAND;No;0;AL;;;;7000;N;;;;; +1EC93;INDIC SIYAQ NUMBER EIGHT THOUSAND;No;0;AL;;;;8000;N;;;;; +1EC94;INDIC SIYAQ NUMBER NINE THOUSAND;No;0;AL;;;;9000;N;;;;; +1EC95;INDIC SIYAQ NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1EC96;INDIC SIYAQ NUMBER TWENTY THOUSAND;No;0;AL;;;;20000;N;;;;; +1EC97;INDIC SIYAQ NUMBER THIRTY THOUSAND;No;0;AL;;;;30000;N;;;;; +1EC98;INDIC SIYAQ NUMBER FORTY THOUSAND;No;0;AL;;;;40000;N;;;;; +1EC99;INDIC SIYAQ NUMBER FIFTY THOUSAND;No;0;AL;;;;50000;N;;;;; +1EC9A;INDIC SIYAQ NUMBER SIXTY THOUSAND;No;0;AL;;;;60000;N;;;;; +1EC9B;INDIC SIYAQ NUMBER SEVENTY THOUSAND;No;0;AL;;;;70000;N;;;;; +1EC9C;INDIC SIYAQ NUMBER EIGHTY THOUSAND;No;0;AL;;;;80000;N;;;;; +1EC9D;INDIC SIYAQ NUMBER NINETY THOUSAND;No;0;AL;;;;90000;N;;;;; +1EC9E;INDIC SIYAQ NUMBER LAKH;No;0;AL;;;;100000;N;;;;; +1EC9F;INDIC SIYAQ NUMBER LAKHAN;No;0;AL;;;;200000;N;;;;; +1ECA0;INDIC SIYAQ LAKH MARK;No;0;AL;;;;100000;N;;;;; +1ECA1;INDIC SIYAQ NUMBER KAROR;No;0;AL;;;;10000000;N;;;;; +1ECA2;INDIC SIYAQ NUMBER KARORAN;No;0;AL;;;;20000000;N;;;;; +1ECA3;INDIC SIYAQ NUMBER PREFIXED ONE;No;0;AL;;;;1;N;;;;; +1ECA4;INDIC SIYAQ NUMBER PREFIXED TWO;No;0;AL;;;;2;N;;;;; +1ECA5;INDIC SIYAQ NUMBER PREFIXED THREE;No;0;AL;;;;3;N;;;;; +1ECA6;INDIC SIYAQ NUMBER PREFIXED FOUR;No;0;AL;;;;4;N;;;;; +1ECA7;INDIC SIYAQ NUMBER PREFIXED FIVE;No;0;AL;;;;5;N;;;;; +1ECA8;INDIC SIYAQ NUMBER PREFIXED SIX;No;0;AL;;;;6;N;;;;; +1ECA9;INDIC SIYAQ NUMBER PREFIXED SEVEN;No;0;AL;;;;7;N;;;;; +1ECAA;INDIC SIYAQ NUMBER PREFIXED EIGHT;No;0;AL;;;;8;N;;;;; +1ECAB;INDIC SIYAQ NUMBER PREFIXED NINE;No;0;AL;;;;9;N;;;;; +1ECAC;INDIC SIYAQ PLACEHOLDER;So;0;AL;;;;;N;;;;; +1ECAD;INDIC SIYAQ FRACTION ONE QUARTER;No;0;AL;;;;1/4;N;;;;; +1ECAE;INDIC SIYAQ FRACTION ONE HALF;No;0;AL;;;;1/2;N;;;;; +1ECAF;INDIC SIYAQ FRACTION THREE QUARTERS;No;0;AL;;;;3/4;N;;;;; +1ECB0;INDIC SIYAQ RUPEE MARK;Sc;0;AL;;;;;N;;;;; +1ECB1;INDIC SIYAQ NUMBER ALTERNATE ONE;No;0;AL;;;;1;N;;;;; +1ECB2;INDIC SIYAQ NUMBER ALTERNATE TWO;No;0;AL;;;;2;N;;;;; +1ECB3;INDIC SIYAQ NUMBER ALTERNATE TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1ECB4;INDIC SIYAQ ALTERNATE LAKH MARK;No;0;AL;;;;100000;N;;;;; +1ED01;OTTOMAN SIYAQ NUMBER ONE;No;0;AL;;;;1;N;;;;; +1ED02;OTTOMAN SIYAQ NUMBER TWO;No;0;AL;;;;2;N;;;;; +1ED03;OTTOMAN SIYAQ NUMBER THREE;No;0;AL;;;;3;N;;;;; +1ED04;OTTOMAN SIYAQ NUMBER FOUR;No;0;AL;;;;4;N;;;;; +1ED05;OTTOMAN SIYAQ NUMBER FIVE;No;0;AL;;;;5;N;;;;; +1ED06;OTTOMAN SIYAQ NUMBER SIX;No;0;AL;;;;6;N;;;;; +1ED07;OTTOMAN SIYAQ NUMBER SEVEN;No;0;AL;;;;7;N;;;;; +1ED08;OTTOMAN SIYAQ NUMBER EIGHT;No;0;AL;;;;8;N;;;;; +1ED09;OTTOMAN SIYAQ NUMBER NINE;No;0;AL;;;;9;N;;;;; +1ED0A;OTTOMAN SIYAQ NUMBER TEN;No;0;AL;;;;10;N;;;;; +1ED0B;OTTOMAN SIYAQ NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +1ED0C;OTTOMAN SIYAQ NUMBER THIRTY;No;0;AL;;;;30;N;;;;; +1ED0D;OTTOMAN SIYAQ NUMBER FORTY;No;0;AL;;;;40;N;;;;; +1ED0E;OTTOMAN SIYAQ NUMBER FIFTY;No;0;AL;;;;50;N;;;;; +1ED0F;OTTOMAN SIYAQ NUMBER SIXTY;No;0;AL;;;;60;N;;;;; +1ED10;OTTOMAN SIYAQ NUMBER SEVENTY;No;0;AL;;;;70;N;;;;; +1ED11;OTTOMAN SIYAQ NUMBER EIGHTY;No;0;AL;;;;80;N;;;;; +1ED12;OTTOMAN SIYAQ NUMBER NINETY;No;0;AL;;;;90;N;;;;; +1ED13;OTTOMAN SIYAQ NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +1ED14;OTTOMAN SIYAQ NUMBER TWO HUNDRED;No;0;AL;;;;200;N;;;;; +1ED15;OTTOMAN SIYAQ NUMBER THREE HUNDRED;No;0;AL;;;;300;N;;;;; +1ED16;OTTOMAN SIYAQ NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;; +1ED17;OTTOMAN SIYAQ NUMBER FIVE HUNDRED;No;0;AL;;;;500;N;;;;; +1ED18;OTTOMAN SIYAQ NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;; +1ED19;OTTOMAN SIYAQ NUMBER SEVEN HUNDRED;No;0;AL;;;;700;N;;;;; +1ED1A;OTTOMAN SIYAQ NUMBER EIGHT HUNDRED;No;0;AL;;;;800;N;;;;; +1ED1B;OTTOMAN SIYAQ NUMBER NINE HUNDRED;No;0;AL;;;;900;N;;;;; +1ED1C;OTTOMAN SIYAQ NUMBER ONE THOUSAND;No;0;AL;;;;1000;N;;;;; +1ED1D;OTTOMAN SIYAQ NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;; +1ED1E;OTTOMAN SIYAQ NUMBER THREE THOUSAND;No;0;AL;;;;3000;N;;;;; +1ED1F;OTTOMAN SIYAQ NUMBER FOUR THOUSAND;No;0;AL;;;;4000;N;;;;; +1ED20;OTTOMAN SIYAQ NUMBER FIVE THOUSAND;No;0;AL;;;;5000;N;;;;; +1ED21;OTTOMAN SIYAQ NUMBER SIX THOUSAND;No;0;AL;;;;6000;N;;;;; +1ED22;OTTOMAN SIYAQ NUMBER SEVEN THOUSAND;No;0;AL;;;;7000;N;;;;; +1ED23;OTTOMAN SIYAQ NUMBER EIGHT THOUSAND;No;0;AL;;;;8000;N;;;;; +1ED24;OTTOMAN SIYAQ NUMBER NINE THOUSAND;No;0;AL;;;;9000;N;;;;; +1ED25;OTTOMAN SIYAQ NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1ED26;OTTOMAN SIYAQ NUMBER TWENTY THOUSAND;No;0;AL;;;;20000;N;;;;; +1ED27;OTTOMAN SIYAQ NUMBER THIRTY THOUSAND;No;0;AL;;;;30000;N;;;;; +1ED28;OTTOMAN SIYAQ NUMBER FORTY THOUSAND;No;0;AL;;;;40000;N;;;;; +1ED29;OTTOMAN SIYAQ NUMBER FIFTY THOUSAND;No;0;AL;;;;50000;N;;;;; +1ED2A;OTTOMAN SIYAQ NUMBER SIXTY THOUSAND;No;0;AL;;;;60000;N;;;;; +1ED2B;OTTOMAN SIYAQ NUMBER SEVENTY THOUSAND;No;0;AL;;;;70000;N;;;;; +1ED2C;OTTOMAN SIYAQ NUMBER EIGHTY THOUSAND;No;0;AL;;;;80000;N;;;;; +1ED2D;OTTOMAN SIYAQ NUMBER NINETY THOUSAND;No;0;AL;;;;90000;N;;;;; +1ED2E;OTTOMAN SIYAQ MARRATAN;So;0;AL;;;;;N;;;;; +1ED2F;OTTOMAN SIYAQ ALTERNATE NUMBER TWO;No;0;AL;;;;2;N;;;;; +1ED30;OTTOMAN SIYAQ ALTERNATE NUMBER THREE;No;0;AL;;;;3;N;;;;; +1ED31;OTTOMAN SIYAQ ALTERNATE NUMBER FOUR;No;0;AL;;;;4;N;;;;; +1ED32;OTTOMAN SIYAQ ALTERNATE NUMBER FIVE;No;0;AL;;;;5;N;;;;; +1ED33;OTTOMAN SIYAQ ALTERNATE NUMBER SIX;No;0;AL;;;;6;N;;;;; +1ED34;OTTOMAN SIYAQ ALTERNATE NUMBER SEVEN;No;0;AL;;;;7;N;;;;; +1ED35;OTTOMAN SIYAQ ALTERNATE NUMBER EIGHT;No;0;AL;;;;8;N;;;;; +1ED36;OTTOMAN SIYAQ ALTERNATE NUMBER NINE;No;0;AL;;;;9;N;;;;; +1ED37;OTTOMAN SIYAQ ALTERNATE NUMBER TEN;No;0;AL;;;;10;N;;;;; +1ED38;OTTOMAN SIYAQ ALTERNATE NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;; +1ED39;OTTOMAN SIYAQ ALTERNATE NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;; +1ED3A;OTTOMAN SIYAQ ALTERNATE NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;; +1ED3B;OTTOMAN SIYAQ ALTERNATE NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1ED3C;OTTOMAN SIYAQ FRACTION ONE HALF;No;0;AL;;;;1/2;N;;;;; +1ED3D;OTTOMAN SIYAQ FRACTION ONE SIXTH;No;0;AL;;;;1/6;N;;;;; +1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL; 0627;;;;N;;;;; +1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE03;ARABIC MATHEMATICAL DAL;Lo;0;AL; 062F;;;;N;;;;; +1EE05;ARABIC MATHEMATICAL WAW;Lo;0;AL; 0648;;;;N;;;;; +1EE06;ARABIC MATHEMATICAL ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EE07;ARABIC MATHEMATICAL HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE08;ARABIC MATHEMATICAL TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE09;ARABIC MATHEMATICAL YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE0A;ARABIC MATHEMATICAL KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE0B;ARABIC MATHEMATICAL LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE0C;ARABIC MATHEMATICAL MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE0D;ARABIC MATHEMATICAL NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE0E;ARABIC MATHEMATICAL SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE0F;ARABIC MATHEMATICAL AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE10;ARABIC MATHEMATICAL FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE11;ARABIC MATHEMATICAL SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE12;ARABIC MATHEMATICAL QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE13;ARABIC MATHEMATICAL REH;Lo;0;AL; 0631;;;;N;;;;; +1EE14;ARABIC MATHEMATICAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE15;ARABIC MATHEMATICAL TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE16;ARABIC MATHEMATICAL THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE17;ARABIC MATHEMATICAL KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE18;ARABIC MATHEMATICAL THAL;Lo;0;AL; 0630;;;;N;;;;; +1EE19;ARABIC MATHEMATICAL DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE1A;ARABIC MATHEMATICAL ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE1B;ARABIC MATHEMATICAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE1C;ARABIC MATHEMATICAL DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; +1EE1D;ARABIC MATHEMATICAL DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; +1EE1E;ARABIC MATHEMATICAL DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; +1EE1F;ARABIC MATHEMATICAL DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; +1EE21;ARABIC MATHEMATICAL INITIAL BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE22;ARABIC MATHEMATICAL INITIAL JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE24;ARABIC MATHEMATICAL INITIAL HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE27;ARABIC MATHEMATICAL INITIAL HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE29;ARABIC MATHEMATICAL INITIAL YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE2A;ARABIC MATHEMATICAL INITIAL KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE2B;ARABIC MATHEMATICAL INITIAL LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE2C;ARABIC MATHEMATICAL INITIAL MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE2D;ARABIC MATHEMATICAL INITIAL NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE2E;ARABIC MATHEMATICAL INITIAL SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE2F;ARABIC MATHEMATICAL INITIAL AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE30;ARABIC MATHEMATICAL INITIAL FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE31;ARABIC MATHEMATICAL INITIAL SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE32;ARABIC MATHEMATICAL INITIAL QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE34;ARABIC MATHEMATICAL INITIAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE35;ARABIC MATHEMATICAL INITIAL TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE36;ARABIC MATHEMATICAL INITIAL THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE37;ARABIC MATHEMATICAL INITIAL KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE39;ARABIC MATHEMATICAL INITIAL DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE3B;ARABIC MATHEMATICAL INITIAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE42;ARABIC MATHEMATICAL TAILED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE47;ARABIC MATHEMATICAL TAILED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE49;ARABIC MATHEMATICAL TAILED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE4B;ARABIC MATHEMATICAL TAILED LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE4D;ARABIC MATHEMATICAL TAILED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE4E;ARABIC MATHEMATICAL TAILED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE4F;ARABIC MATHEMATICAL TAILED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE51;ARABIC MATHEMATICAL TAILED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE52;ARABIC MATHEMATICAL TAILED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE54;ARABIC MATHEMATICAL TAILED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE57;ARABIC MATHEMATICAL TAILED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE59;ARABIC MATHEMATICAL TAILED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE5B;ARABIC MATHEMATICAL TAILED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE5D;ARABIC MATHEMATICAL TAILED DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; +1EE5F;ARABIC MATHEMATICAL TAILED DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; +1EE61;ARABIC MATHEMATICAL STRETCHED BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE62;ARABIC MATHEMATICAL STRETCHED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE64;ARABIC MATHEMATICAL STRETCHED HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE67;ARABIC MATHEMATICAL STRETCHED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE68;ARABIC MATHEMATICAL STRETCHED TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE69;ARABIC MATHEMATICAL STRETCHED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE6A;ARABIC MATHEMATICAL STRETCHED KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE6C;ARABIC MATHEMATICAL STRETCHED MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE6D;ARABIC MATHEMATICAL STRETCHED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE6E;ARABIC MATHEMATICAL STRETCHED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE6F;ARABIC MATHEMATICAL STRETCHED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE70;ARABIC MATHEMATICAL STRETCHED FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE71;ARABIC MATHEMATICAL STRETCHED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE72;ARABIC MATHEMATICAL STRETCHED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE74;ARABIC MATHEMATICAL STRETCHED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE75;ARABIC MATHEMATICAL STRETCHED TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE76;ARABIC MATHEMATICAL STRETCHED THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE77;ARABIC MATHEMATICAL STRETCHED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE79;ARABIC MATHEMATICAL STRETCHED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE7A;ARABIC MATHEMATICAL STRETCHED ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE7B;ARABIC MATHEMATICAL STRETCHED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE7C;ARABIC MATHEMATICAL STRETCHED DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; +1EE7E;ARABIC MATHEMATICAL STRETCHED DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; +1EE80;ARABIC MATHEMATICAL LOOPED ALEF;Lo;0;AL; 0627;;;;N;;;;; +1EE81;ARABIC MATHEMATICAL LOOPED BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE82;ARABIC MATHEMATICAL LOOPED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE83;ARABIC MATHEMATICAL LOOPED DAL;Lo;0;AL; 062F;;;;N;;;;; +1EE84;ARABIC MATHEMATICAL LOOPED HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE85;ARABIC MATHEMATICAL LOOPED WAW;Lo;0;AL; 0648;;;;N;;;;; +1EE86;ARABIC MATHEMATICAL LOOPED ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EE87;ARABIC MATHEMATICAL LOOPED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE88;ARABIC MATHEMATICAL LOOPED TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE89;ARABIC MATHEMATICAL LOOPED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE8B;ARABIC MATHEMATICAL LOOPED LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE8C;ARABIC MATHEMATICAL LOOPED MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE8D;ARABIC MATHEMATICAL LOOPED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE8E;ARABIC MATHEMATICAL LOOPED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE8F;ARABIC MATHEMATICAL LOOPED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE90;ARABIC MATHEMATICAL LOOPED FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE91;ARABIC MATHEMATICAL LOOPED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE92;ARABIC MATHEMATICAL LOOPED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE93;ARABIC MATHEMATICAL LOOPED REH;Lo;0;AL; 0631;;;;N;;;;; +1EE94;ARABIC MATHEMATICAL LOOPED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE95;ARABIC MATHEMATICAL LOOPED TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE96;ARABIC MATHEMATICAL LOOPED THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE97;ARABIC MATHEMATICAL LOOPED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE98;ARABIC MATHEMATICAL LOOPED THAL;Lo;0;AL; 0630;;;;N;;;;; +1EE99;ARABIC MATHEMATICAL LOOPED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE9A;ARABIC MATHEMATICAL LOOPED ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE9B;ARABIC MATHEMATICAL LOOPED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EEA1;ARABIC MATHEMATICAL DOUBLE-STRUCK BEH;Lo;0;AL; 0628;;;;N;;;;; +1EEA2;ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EEA3;ARABIC MATHEMATICAL DOUBLE-STRUCK DAL;Lo;0;AL; 062F;;;;N;;;;; +1EEA5;ARABIC MATHEMATICAL DOUBLE-STRUCK WAW;Lo;0;AL; 0648;;;;N;;;;; +1EEA6;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EEA7;ARABIC MATHEMATICAL DOUBLE-STRUCK HAH;Lo;0;AL; 062D;;;;N;;;;; +1EEA8;ARABIC MATHEMATICAL DOUBLE-STRUCK TAH;Lo;0;AL; 0637;;;;N;;;;; +1EEA9;ARABIC MATHEMATICAL DOUBLE-STRUCK YEH;Lo;0;AL; 064A;;;;N;;;;; +1EEAB;ARABIC MATHEMATICAL DOUBLE-STRUCK LAM;Lo;0;AL; 0644;;;;N;;;;; +1EEAC;ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EEAD;ARABIC MATHEMATICAL DOUBLE-STRUCK NOON;Lo;0;AL; 0646;;;;N;;;;; +1EEAE;ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EEAF;ARABIC MATHEMATICAL DOUBLE-STRUCK AIN;Lo;0;AL; 0639;;;;N;;;;; +1EEB0;ARABIC MATHEMATICAL DOUBLE-STRUCK FEH;Lo;0;AL; 0641;;;;N;;;;; +1EEB1;ARABIC MATHEMATICAL DOUBLE-STRUCK SAD;Lo;0;AL; 0635;;;;N;;;;; +1EEB2;ARABIC MATHEMATICAL DOUBLE-STRUCK QAF;Lo;0;AL; 0642;;;;N;;;;; +1EEB3;ARABIC MATHEMATICAL DOUBLE-STRUCK REH;Lo;0;AL; 0631;;;;N;;;;; +1EEB4;ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EEB5;ARABIC MATHEMATICAL DOUBLE-STRUCK TEH;Lo;0;AL; 062A;;;;N;;;;; +1EEB6;ARABIC MATHEMATICAL DOUBLE-STRUCK THEH;Lo;0;AL; 062B;;;;N;;;;; +1EEB7;ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EEB8;ARABIC MATHEMATICAL DOUBLE-STRUCK THAL;Lo;0;AL; 0630;;;;N;;;;; +1EEB9;ARABIC MATHEMATICAL DOUBLE-STRUCK DAD;Lo;0;AL; 0636;;;;N;;;;; +1EEBA;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EEBB;ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EEF0;ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL;Sm;0;ON;;;;;N;;;;; +1EEF1;ARABIC MATHEMATICAL OPERATOR HAH WITH DAL;Sm;0;ON;;;;;N;;;;; +1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; +1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; +1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; +1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; +1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; +1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; +1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; +1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; +1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; +1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; +1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; +1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; +1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; +1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; +1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; +1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; +1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; +1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; +1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; +1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; +1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; +1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; +1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; +1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; +1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; +1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; +1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; +1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; +1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; +1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; +1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; +1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; +1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; +1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; +1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; +1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; +1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; +1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; +1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; +1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; +1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; +1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; +1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; +1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; +1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; +1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; +1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; +1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; +1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; +1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; +1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; +1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; +1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; +1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; +1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; +1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; +1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; +1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; +1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; +1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; +1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; +1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; +1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; +1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; +1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; +1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; +1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; +1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; +1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; +1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; +1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; +1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; +1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; +1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; +1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; +1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; +1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; +1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; +1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; +1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; +1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; +1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; +1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; +1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; +1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; +1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; +1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; +1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; +1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; +1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; +1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; +1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; +1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; +1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; +1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; +1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; +1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; +1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; +1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; +1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; +1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; +1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; +1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; +1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; +1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; +1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; +1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; +1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; +1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; +1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; +1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; +1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; +1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; +1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; +1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; +1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; +1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; +1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; +1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; +1F0A0;PLAYING CARD BACK;So;0;ON;;;;;N;;;;; +1F0A1;PLAYING CARD ACE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A2;PLAYING CARD TWO OF SPADES;So;0;ON;;;;;N;;;;; +1F0A3;PLAYING CARD THREE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A4;PLAYING CARD FOUR OF SPADES;So;0;ON;;;;;N;;;;; +1F0A5;PLAYING CARD FIVE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A6;PLAYING CARD SIX OF SPADES;So;0;ON;;;;;N;;;;; +1F0A7;PLAYING CARD SEVEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0A8;PLAYING CARD EIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0A9;PLAYING CARD NINE OF SPADES;So;0;ON;;;;;N;;;;; +1F0AA;PLAYING CARD TEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AB;PLAYING CARD JACK OF SPADES;So;0;ON;;;;;N;;;;; +1F0AC;PLAYING CARD KNIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0AD;PLAYING CARD QUEEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AE;PLAYING CARD KING OF SPADES;So;0;ON;;;;;N;;;;; +1F0B1;PLAYING CARD ACE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B2;PLAYING CARD TWO OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B3;PLAYING CARD THREE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B4;PLAYING CARD FOUR OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B5;PLAYING CARD FIVE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B6;PLAYING CARD SIX OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B7;PLAYING CARD SEVEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B8;PLAYING CARD EIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B9;PLAYING CARD NINE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BA;PLAYING CARD TEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BB;PLAYING CARD JACK OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BC;PLAYING CARD KNIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BD;PLAYING CARD QUEEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BE;PLAYING CARD KING OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BF;PLAYING CARD RED JOKER;So;0;ON;;;;;N;;;;; +1F0C1;PLAYING CARD ACE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C2;PLAYING CARD TWO OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C3;PLAYING CARD THREE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C4;PLAYING CARD FOUR OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C5;PLAYING CARD FIVE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C6;PLAYING CARD SIX OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C7;PLAYING CARD SEVEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C8;PLAYING CARD EIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C9;PLAYING CARD NINE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CA;PLAYING CARD TEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CB;PLAYING CARD JACK OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CC;PLAYING CARD KNIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CD;PLAYING CARD QUEEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CE;PLAYING CARD KING OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CF;PLAYING CARD BLACK JOKER;So;0;ON;;;;;N;;;;; +1F0D1;PLAYING CARD ACE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D2;PLAYING CARD TWO OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D3;PLAYING CARD THREE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D4;PLAYING CARD FOUR OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D5;PLAYING CARD FIVE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D6;PLAYING CARD SIX OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D7;PLAYING CARD SEVEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D8;PLAYING CARD EIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D9;PLAYING CARD NINE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DA;PLAYING CARD TEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DB;PLAYING CARD JACK OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DC;PLAYING CARD KNIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DD;PLAYING CARD QUEEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DE;PLAYING CARD KING OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DF;PLAYING CARD WHITE JOKER;So;0;ON;;;;;N;;;;; +1F0E0;PLAYING CARD FOOL;So;0;ON;;;;;N;;;;; +1F0E1;PLAYING CARD TRUMP-1;So;0;ON;;;;;N;;;;; +1F0E2;PLAYING CARD TRUMP-2;So;0;ON;;;;;N;;;;; +1F0E3;PLAYING CARD TRUMP-3;So;0;ON;;;;;N;;;;; +1F0E4;PLAYING CARD TRUMP-4;So;0;ON;;;;;N;;;;; +1F0E5;PLAYING CARD TRUMP-5;So;0;ON;;;;;N;;;;; +1F0E6;PLAYING CARD TRUMP-6;So;0;ON;;;;;N;;;;; +1F0E7;PLAYING CARD TRUMP-7;So;0;ON;;;;;N;;;;; +1F0E8;PLAYING CARD TRUMP-8;So;0;ON;;;;;N;;;;; +1F0E9;PLAYING CARD TRUMP-9;So;0;ON;;;;;N;;;;; +1F0EA;PLAYING CARD TRUMP-10;So;0;ON;;;;;N;;;;; +1F0EB;PLAYING CARD TRUMP-11;So;0;ON;;;;;N;;;;; +1F0EC;PLAYING CARD TRUMP-12;So;0;ON;;;;;N;;;;; +1F0ED;PLAYING CARD TRUMP-13;So;0;ON;;;;;N;;;;; +1F0EE;PLAYING CARD TRUMP-14;So;0;ON;;;;;N;;;;; +1F0EF;PLAYING CARD TRUMP-15;So;0;ON;;;;;N;;;;; +1F0F0;PLAYING CARD TRUMP-16;So;0;ON;;;;;N;;;;; +1F0F1;PLAYING CARD TRUMP-17;So;0;ON;;;;;N;;;;; +1F0F2;PLAYING CARD TRUMP-18;So;0;ON;;;;;N;;;;; +1F0F3;PLAYING CARD TRUMP-19;So;0;ON;;;;;N;;;;; +1F0F4;PLAYING CARD TRUMP-20;So;0;ON;;;;;N;;;;; +1F0F5;PLAYING CARD TRUMP-21;So;0;ON;;;;;N;;;;; +1F100;DIGIT ZERO FULL STOP;No;0;EN; 0030 002E;;0;0;N;;;;; +1F101;DIGIT ZERO COMMA;No;0;EN; 0030 002C;;0;0;N;;;;; +1F102;DIGIT ONE COMMA;No;0;EN; 0031 002C;;1;1;N;;;;; +1F103;DIGIT TWO COMMA;No;0;EN; 0032 002C;;2;2;N;;;;; +1F104;DIGIT THREE COMMA;No;0;EN; 0033 002C;;3;3;N;;;;; +1F105;DIGIT FOUR COMMA;No;0;EN; 0034 002C;;4;4;N;;;;; +1F106;DIGIT FIVE COMMA;No;0;EN; 0035 002C;;5;5;N;;;;; +1F107;DIGIT SIX COMMA;No;0;EN; 0036 002C;;6;6;N;;;;; +1F108;DIGIT SEVEN COMMA;No;0;EN; 0037 002C;;7;7;N;;;;; +1F109;DIGIT EIGHT COMMA;No;0;EN; 0038 002C;;8;8;N;;;;; +1F10A;DIGIT NINE COMMA;No;0;EN; 0039 002C;;9;9;N;;;;; +1F10B;DINGBAT CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F10C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F10D;CIRCLED ZERO WITH SLASH;So;0;ON;;;;;N;;;;; +1F10E;CIRCLED ANTICLOCKWISE ARROW;So;0;ON;;;;;N;;;;; +1F10F;CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH;So;0;ON;;;;;N;;;;; +1F110;PARENTHESIZED LATIN CAPITAL LETTER A;So;0;L; 0028 0041 0029;;;;N;;;;; +1F111;PARENTHESIZED LATIN CAPITAL LETTER B;So;0;L; 0028 0042 0029;;;;N;;;;; +1F112;PARENTHESIZED LATIN CAPITAL LETTER C;So;0;L; 0028 0043 0029;;;;N;;;;; +1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L; 0028 0044 0029;;;;N;;;;; +1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L; 0028 0045 0029;;;;N;;;;; +1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L; 0028 0046 0029;;;;N;;;;; +1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L; 0028 0047 0029;;;;N;;;;; +1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L; 0028 0048 0029;;;;N;;;;; +1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L; 0028 0049 0029;;;;N;;;;; +1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L; 0028 004A 0029;;;;N;;;;; +1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L; 0028 004B 0029;;;;N;;;;; +1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L; 0028 004C 0029;;;;N;;;;; +1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L; 0028 004D 0029;;;;N;;;;; +1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L; 0028 004E 0029;;;;N;;;;; +1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L; 0028 004F 0029;;;;N;;;;; +1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L; 0028 0050 0029;;;;N;;;;; +1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L; 0028 0051 0029;;;;N;;;;; +1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L; 0028 0052 0029;;;;N;;;;; +1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L; 0028 0053 0029;;;;N;;;;; +1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L; 0028 0054 0029;;;;N;;;;; +1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L; 0028 0055 0029;;;;N;;;;; +1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L; 0028 0056 0029;;;;N;;;;; +1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L; 0028 0057 0029;;;;N;;;;; +1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L; 0028 0058 0029;;;;N;;;;; +1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L; 0028 0059 0029;;;;N;;;;; +1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L; 0028 005A 0029;;;;N;;;;; +1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L; 3014 0053 3015;;;;N;;;;; +1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; +1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; +1F12D;CIRCLED CD;So;0;L; 0043 0044;;;;N;;;;; +1F12E;CIRCLED WZ;So;0;L; 0057 005A;;;;N;;;;; +1F12F;COPYLEFT SYMBOL;So;0;ON;;;;;N;;;;; +1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;; +1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;; +1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; +1F133;SQUARED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;; +1F134;SQUARED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;; +1F135;SQUARED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;; +1F136;SQUARED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;; +1F137;SQUARED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;; +1F138;SQUARED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;; +1F139;SQUARED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;; +1F13A;SQUARED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;; +1F13B;SQUARED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;; +1F13C;SQUARED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;; +1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;; +1F13E;SQUARED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;; +1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;; +1F140;SQUARED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;; +1F141;SQUARED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; +1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;; +1F143;SQUARED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;; +1F144;SQUARED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;; +1F145;SQUARED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;; +1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;; +1F147;SQUARED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;; +1F148;SQUARED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;; +1F149;SQUARED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;; +1F14A;SQUARED HV;So;0;L; 0048 0056;;;;N;;;;; +1F14B;SQUARED MV;So;0;L; 004D 0056;;;;N;;;;; +1F14C;SQUARED SD;So;0;L; 0053 0044;;;;N;;;;; +1F14D;SQUARED SS;So;0;L; 0053 0053;;;;N;;;;; +1F14E;SQUARED PPV;So;0;L; 0050 0050 0056;;;;N;;;;; +1F14F;SQUARED WC;So;0;L; 0057 0043;;;;N;;;;; +1F150;NEGATIVE CIRCLED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F151;NEGATIVE CIRCLED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F152;NEGATIVE CIRCLED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F153;NEGATIVE CIRCLED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F154;NEGATIVE CIRCLED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F155;NEGATIVE CIRCLED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F156;NEGATIVE CIRCLED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F158;NEGATIVE CIRCLED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F159;NEGATIVE CIRCLED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F15A;NEGATIVE CIRCLED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F15B;NEGATIVE CIRCLED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F15C;NEGATIVE CIRCLED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F15D;NEGATIVE CIRCLED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F15E;NEGATIVE CIRCLED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F160;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F161;NEGATIVE CIRCLED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F162;NEGATIVE CIRCLED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F163;NEGATIVE CIRCLED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F164;NEGATIVE CIRCLED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F165;NEGATIVE CIRCLED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F166;NEGATIVE CIRCLED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F167;NEGATIVE CIRCLED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F168;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F16A;RAISED MC SIGN;So;0;ON; 004D 0043;;;;N;;;;; +1F16B;RAISED MD SIGN;So;0;ON; 004D 0044;;;;N;;;;; +1F16C;RAISED MR SIGN;So;0;ON; 004D 0052;;;;N;;;;; +1F16D;CIRCLED CC;So;0;ON;;;;;N;;;;; +1F16E;CIRCLED C WITH OVERLAID BACKSLASH;So;0;ON;;;;;N;;;;; +1F16F;CIRCLED HUMAN FIGURE;So;0;ON;;;;;N;;;;; +1F170;NEGATIVE SQUARED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F171;NEGATIVE SQUARED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F172;NEGATIVE SQUARED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F173;NEGATIVE SQUARED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F174;NEGATIVE SQUARED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F175;NEGATIVE SQUARED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F176;NEGATIVE SQUARED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F177;NEGATIVE SQUARED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F178;NEGATIVE SQUARED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F17A;NEGATIVE SQUARED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F17D;NEGATIVE SQUARED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F17E;NEGATIVE SQUARED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F180;NEGATIVE SQUARED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F181;NEGATIVE SQUARED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F182;NEGATIVE SQUARED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F183;NEGATIVE SQUARED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F184;NEGATIVE SQUARED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F185;NEGATIVE SQUARED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F186;NEGATIVE SQUARED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F187;NEGATIVE SQUARED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F188;NEGATIVE SQUARED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F189;NEGATIVE SQUARED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;; +1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;; +1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;; +1F18E;NEGATIVE SQUARED AB;So;0;L;;;;;N;;;;; +1F18F;NEGATIVE SQUARED WC;So;0;L;;;;;N;;;;; +1F190;SQUARE DJ;So;0;L; 0044 004A;;;;N;;;;; +1F191;SQUARED CL;So;0;L;;;;;N;;;;; +1F192;SQUARED COOL;So;0;L;;;;;N;;;;; +1F193;SQUARED FREE;So;0;L;;;;;N;;;;; +1F194;SQUARED ID;So;0;L;;;;;N;;;;; +1F195;SQUARED NEW;So;0;L;;;;;N;;;;; +1F196;SQUARED NG;So;0;L;;;;;N;;;;; +1F197;SQUARED OK;So;0;L;;;;;N;;;;; +1F198;SQUARED SOS;So;0;L;;;;;N;;;;; +1F199;SQUARED UP WITH EXCLAMATION MARK;So;0;L;;;;;N;;;;; +1F19A;SQUARED VS;So;0;L;;;;;N;;;;; +1F19B;SQUARED THREE D;So;0;L;;;;;N;;;;; +1F19C;SQUARED SECOND SCREEN;So;0;L;;;;;N;;;;; +1F19D;SQUARED TWO K;So;0;L;;;;;N;;;;; +1F19E;SQUARED FOUR K;So;0;L;;;;;N;;;;; +1F19F;SQUARED EIGHT K;So;0;L;;;;;N;;;;; +1F1A0;SQUARED FIVE POINT ONE;So;0;L;;;;;N;;;;; +1F1A1;SQUARED SEVEN POINT ONE;So;0;L;;;;;N;;;;; +1F1A2;SQUARED TWENTY-TWO POINT TWO;So;0;L;;;;;N;;;;; +1F1A3;SQUARED SIXTY P;So;0;L;;;;;N;;;;; +1F1A4;SQUARED ONE HUNDRED TWENTY P;So;0;L;;;;;N;;;;; +1F1A5;SQUARED LATIN SMALL LETTER D;So;0;L;;;;;N;;;;; +1F1A6;SQUARED HC;So;0;L;;;;;N;;;;; +1F1A7;SQUARED HDR;So;0;L;;;;;N;;;;; +1F1A8;SQUARED HI-RES;So;0;L;;;;;N;;;;; +1F1A9;SQUARED LOSSLESS;So;0;L;;;;;N;;;;; +1F1AA;SQUARED SHV;So;0;L;;;;;N;;;;; +1F1AB;SQUARED UHD;So;0;L;;;;;N;;;;; +1F1AC;SQUARED VOD;So;0;L;;;;;N;;;;; +1F1AD;MASK WORK SYMBOL;So;0;ON;;;;;N;;;;; +1F1E6;REGIONAL INDICATOR SYMBOL LETTER A;So;0;L;;;;;N;;;;; +1F1E7;REGIONAL INDICATOR SYMBOL LETTER B;So;0;L;;;;;N;;;;; +1F1E8;REGIONAL INDICATOR SYMBOL LETTER C;So;0;L;;;;;N;;;;; +1F1E9;REGIONAL INDICATOR SYMBOL LETTER D;So;0;L;;;;;N;;;;; +1F1EA;REGIONAL INDICATOR SYMBOL LETTER E;So;0;L;;;;;N;;;;; +1F1EB;REGIONAL INDICATOR SYMBOL LETTER F;So;0;L;;;;;N;;;;; +1F1EC;REGIONAL INDICATOR SYMBOL LETTER G;So;0;L;;;;;N;;;;; +1F1ED;REGIONAL INDICATOR SYMBOL LETTER H;So;0;L;;;;;N;;;;; +1F1EE;REGIONAL INDICATOR SYMBOL LETTER I;So;0;L;;;;;N;;;;; +1F1EF;REGIONAL INDICATOR SYMBOL LETTER J;So;0;L;;;;;N;;;;; +1F1F0;REGIONAL INDICATOR SYMBOL LETTER K;So;0;L;;;;;N;;;;; +1F1F1;REGIONAL INDICATOR SYMBOL LETTER L;So;0;L;;;;;N;;;;; +1F1F2;REGIONAL INDICATOR SYMBOL LETTER M;So;0;L;;;;;N;;;;; +1F1F3;REGIONAL INDICATOR SYMBOL LETTER N;So;0;L;;;;;N;;;;; +1F1F4;REGIONAL INDICATOR SYMBOL LETTER O;So;0;L;;;;;N;;;;; +1F1F5;REGIONAL INDICATOR SYMBOL LETTER P;So;0;L;;;;;N;;;;; +1F1F6;REGIONAL INDICATOR SYMBOL LETTER Q;So;0;L;;;;;N;;;;; +1F1F7;REGIONAL INDICATOR SYMBOL LETTER R;So;0;L;;;;;N;;;;; +1F1F8;REGIONAL INDICATOR SYMBOL LETTER S;So;0;L;;;;;N;;;;; +1F1F9;REGIONAL INDICATOR SYMBOL LETTER T;So;0;L;;;;;N;;;;; +1F1FA;REGIONAL INDICATOR SYMBOL LETTER U;So;0;L;;;;;N;;;;; +1F1FB;REGIONAL INDICATOR SYMBOL LETTER V;So;0;L;;;;;N;;;;; +1F1FC;REGIONAL INDICATOR SYMBOL LETTER W;So;0;L;;;;;N;;;;; +1F1FD;REGIONAL INDICATOR SYMBOL LETTER X;So;0;L;;;;;N;;;;; +1F1FE;REGIONAL INDICATOR SYMBOL LETTER Y;So;0;L;;;;;N;;;;; +1F1FF;REGIONAL INDICATOR SYMBOL LETTER Z;So;0;L;;;;;N;;;;; +1F200;SQUARE HIRAGANA HOKA;So;0;L; 307B 304B;;;;N;;;;; +1F201;SQUARED KATAKANA KOKO;So;0;L; 30B3 30B3;;;;N;;;;; +1F202;SQUARED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; +1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L; 624B;;;;N;;;;; +1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L; 5B57;;;;N;;;;; +1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L; 53CC;;;;N;;;;; +1F213;SQUARED KATAKANA DE;So;0;L; 30C7;;;;N;;;;; +1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 4E8C;;;;N;;;;; +1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L; 591A;;;;N;;;;; +1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L; 89E3;;;;N;;;;; +1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L; 5929;;;;N;;;;; +1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L; 4EA4;;;;N;;;;; +1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L; 6620;;;;N;;;;; +1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L; 7121;;;;N;;;;; +1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L; 6599;;;;N;;;;; +1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L; 524D;;;;N;;;;; +1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L; 5F8C;;;;N;;;;; +1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L; 518D;;;;N;;;;; +1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L; 65B0;;;;N;;;;; +1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L; 521D;;;;N;;;;; +1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L; 7D42;;;;N;;;;; +1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L; 751F;;;;N;;;;; +1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L; 8CA9;;;;N;;;;; +1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L; 58F0;;;;N;;;;; +1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L; 5439;;;;N;;;;; +1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L; 6F14;;;;N;;;;; +1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L; 6295;;;;N;;;;; +1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L; 6355;;;;N;;;;; +1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L; 4E00;;;;N;;;;; +1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 4E09;;;;N;;;;; +1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L; 904A;;;;N;;;;; +1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L; 5DE6;;;;N;;;;; +1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L; 4E2D;;;;N;;;;; +1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L; 53F3;;;;N;;;;; +1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L; 6307;;;;N;;;;; +1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L; 8D70;;;;N;;;;; +1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 6253;;;;N;;;;; +1F232;SQUARED CJK UNIFIED IDEOGRAPH-7981;So;0;L; 7981;;;;N;;;;; +1F233;SQUARED CJK UNIFIED IDEOGRAPH-7A7A;So;0;L; 7A7A;;;;N;;;;; +1F234;SQUARED CJK UNIFIED IDEOGRAPH-5408;So;0;L; 5408;;;;N;;;;; +1F235;SQUARED CJK UNIFIED IDEOGRAPH-6E80;So;0;L; 6E80;;;;N;;;;; +1F236;SQUARED CJK UNIFIED IDEOGRAPH-6709;So;0;L; 6709;;;;N;;;;; +1F237;SQUARED CJK UNIFIED IDEOGRAPH-6708;So;0;L; 6708;;;;N;;;;; +1F238;SQUARED CJK UNIFIED IDEOGRAPH-7533;So;0;L; 7533;;;;N;;;;; +1F239;SQUARED CJK UNIFIED IDEOGRAPH-5272;So;0;L; 5272;;;;N;;;;; +1F23A;SQUARED CJK UNIFIED IDEOGRAPH-55B6;So;0;L; 55B6;;;;N;;;;; +1F23B;SQUARED CJK UNIFIED IDEOGRAPH-914D;So;0;L; 914D;;;;N;;;;; +1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L; 3014 672C 3015;;;;N;;;;; +1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 3014 4E09 3015;;;;N;;;;; +1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 3014 4E8C 3015;;;;N;;;;; +1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L; 3014 5B89 3015;;;;N;;;;; +1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L; 3014 70B9 3015;;;;N;;;;; +1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 3014 6253 3015;;;;N;;;;; +1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L; 3014 76D7 3015;;;;N;;;;; +1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L; 3014 52DD 3015;;;;N;;;;; +1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L; 3014 6557 3015;;;;N;;;;; +1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L; 5F97;;;;N;;;;; +1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L; 53EF;;;;N;;;;; +1F260;ROUNDED SYMBOL FOR FU;So;0;ON;;;;;N;;;;; +1F261;ROUNDED SYMBOL FOR LU;So;0;ON;;;;;N;;;;; +1F262;ROUNDED SYMBOL FOR SHOU;So;0;ON;;;;;N;;;;; +1F263;ROUNDED SYMBOL FOR XI;So;0;ON;;;;;N;;;;; +1F264;ROUNDED SYMBOL FOR SHUANGXI;So;0;ON;;;;;N;;;;; +1F265;ROUNDED SYMBOL FOR CAI;So;0;ON;;;;;N;;;;; +1F300;CYCLONE;So;0;ON;;;;;N;;;;; +1F301;FOGGY;So;0;ON;;;;;N;;;;; +1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;; +1F303;NIGHT WITH STARS;So;0;ON;;;;;N;;;;; +1F304;SUNRISE OVER MOUNTAINS;So;0;ON;;;;;N;;;;; +1F305;SUNRISE;So;0;ON;;;;;N;;;;; +1F306;CITYSCAPE AT DUSK;So;0;ON;;;;;N;;;;; +1F307;SUNSET OVER BUILDINGS;So;0;ON;;;;;N;;;;; +1F308;RAINBOW;So;0;ON;;;;;N;;;;; +1F309;BRIDGE AT NIGHT;So;0;ON;;;;;N;;;;; +1F30A;WATER WAVE;So;0;ON;;;;;N;;;;; +1F30B;VOLCANO;So;0;ON;;;;;N;;;;; +1F30C;MILKY WAY;So;0;ON;;;;;N;;;;; +1F30D;EARTH GLOBE EUROPE-AFRICA;So;0;ON;;;;;N;;;;; +1F30E;EARTH GLOBE AMERICAS;So;0;ON;;;;;N;;;;; +1F30F;EARTH GLOBE ASIA-AUSTRALIA;So;0;ON;;;;;N;;;;; +1F310;GLOBE WITH MERIDIANS;So;0;ON;;;;;N;;;;; +1F311;NEW MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F312;WAXING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F313;FIRST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F314;WAXING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F315;FULL MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F316;WANING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F317;LAST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F318;WANING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F319;CRESCENT MOON;So;0;ON;;;;;N;;;;; +1F31A;NEW MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31B;FIRST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31C;LAST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31D;FULL MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31E;SUN WITH FACE;So;0;ON;;;;;N;;;;; +1F31F;GLOWING STAR;So;0;ON;;;;;N;;;;; +1F320;SHOOTING STAR;So;0;ON;;;;;N;;;;; +1F321;THERMOMETER;So;0;ON;;;;;N;;;;; +1F322;BLACK DROPLET;So;0;ON;;;;;N;;;;; +1F323;WHITE SUN;So;0;ON;;;;;N;;;;; +1F324;WHITE SUN WITH SMALL CLOUD;So;0;ON;;;;;N;;;;; +1F325;WHITE SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +1F326;WHITE SUN BEHIND CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F327;CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F328;CLOUD WITH SNOW;So;0;ON;;;;;N;;;;; +1F329;CLOUD WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; +1F32B;FOG;So;0;ON;;;;;N;;;;; +1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; +1F32D;HOT DOG;So;0;ON;;;;;N;;;;; +1F32E;TACO;So;0;ON;;;;;N;;;;; +1F32F;BURRITO;So;0;ON;;;;;N;;;;; +1F330;CHESTNUT;So;0;ON;;;;;N;;;;; +1F331;SEEDLING;So;0;ON;;;;;N;;;;; +1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; +1F333;DECIDUOUS TREE;So;0;ON;;;;;N;;;;; +1F334;PALM TREE;So;0;ON;;;;;N;;;;; +1F335;CACTUS;So;0;ON;;;;;N;;;;; +1F336;HOT PEPPER;So;0;ON;;;;;N;;;;; +1F337;TULIP;So;0;ON;;;;;N;;;;; +1F338;CHERRY BLOSSOM;So;0;ON;;;;;N;;;;; +1F339;ROSE;So;0;ON;;;;;N;;;;; +1F33A;HIBISCUS;So;0;ON;;;;;N;;;;; +1F33B;SUNFLOWER;So;0;ON;;;;;N;;;;; +1F33C;BLOSSOM;So;0;ON;;;;;N;;;;; +1F33D;EAR OF MAIZE;So;0;ON;;;;;N;;;;; +1F33E;EAR OF RICE;So;0;ON;;;;;N;;;;; +1F33F;HERB;So;0;ON;;;;;N;;;;; +1F340;FOUR LEAF CLOVER;So;0;ON;;;;;N;;;;; +1F341;MAPLE LEAF;So;0;ON;;;;;N;;;;; +1F342;FALLEN LEAF;So;0;ON;;;;;N;;;;; +1F343;LEAF FLUTTERING IN WIND;So;0;ON;;;;;N;;;;; +1F344;MUSHROOM;So;0;ON;;;;;N;;;;; +1F345;TOMATO;So;0;ON;;;;;N;;;;; +1F346;AUBERGINE;So;0;ON;;;;;N;;;;; +1F347;GRAPES;So;0;ON;;;;;N;;;;; +1F348;MELON;So;0;ON;;;;;N;;;;; +1F349;WATERMELON;So;0;ON;;;;;N;;;;; +1F34A;TANGERINE;So;0;ON;;;;;N;;;;; +1F34B;LEMON;So;0;ON;;;;;N;;;;; +1F34C;BANANA;So;0;ON;;;;;N;;;;; +1F34D;PINEAPPLE;So;0;ON;;;;;N;;;;; +1F34E;RED APPLE;So;0;ON;;;;;N;;;;; +1F34F;GREEN APPLE;So;0;ON;;;;;N;;;;; +1F350;PEAR;So;0;ON;;;;;N;;;;; +1F351;PEACH;So;0;ON;;;;;N;;;;; +1F352;CHERRIES;So;0;ON;;;;;N;;;;; +1F353;STRAWBERRY;So;0;ON;;;;;N;;;;; +1F354;HAMBURGER;So;0;ON;;;;;N;;;;; +1F355;SLICE OF PIZZA;So;0;ON;;;;;N;;;;; +1F356;MEAT ON BONE;So;0;ON;;;;;N;;;;; +1F357;POULTRY LEG;So;0;ON;;;;;N;;;;; +1F358;RICE CRACKER;So;0;ON;;;;;N;;;;; +1F359;RICE BALL;So;0;ON;;;;;N;;;;; +1F35A;COOKED RICE;So;0;ON;;;;;N;;;;; +1F35B;CURRY AND RICE;So;0;ON;;;;;N;;;;; +1F35C;STEAMING BOWL;So;0;ON;;;;;N;;;;; +1F35D;SPAGHETTI;So;0;ON;;;;;N;;;;; +1F35E;BREAD;So;0;ON;;;;;N;;;;; +1F35F;FRENCH FRIES;So;0;ON;;;;;N;;;;; +1F360;ROASTED SWEET POTATO;So;0;ON;;;;;N;;;;; +1F361;DANGO;So;0;ON;;;;;N;;;;; +1F362;ODEN;So;0;ON;;;;;N;;;;; +1F363;SUSHI;So;0;ON;;;;;N;;;;; +1F364;FRIED SHRIMP;So;0;ON;;;;;N;;;;; +1F365;FISH CAKE WITH SWIRL DESIGN;So;0;ON;;;;;N;;;;; +1F366;SOFT ICE CREAM;So;0;ON;;;;;N;;;;; +1F367;SHAVED ICE;So;0;ON;;;;;N;;;;; +1F368;ICE CREAM;So;0;ON;;;;;N;;;;; +1F369;DOUGHNUT;So;0;ON;;;;;N;;;;; +1F36A;COOKIE;So;0;ON;;;;;N;;;;; +1F36B;CHOCOLATE BAR;So;0;ON;;;;;N;;;;; +1F36C;CANDY;So;0;ON;;;;;N;;;;; +1F36D;LOLLIPOP;So;0;ON;;;;;N;;;;; +1F36E;CUSTARD;So;0;ON;;;;;N;;;;; +1F36F;HONEY POT;So;0;ON;;;;;N;;;;; +1F370;SHORTCAKE;So;0;ON;;;;;N;;;;; +1F371;BENTO BOX;So;0;ON;;;;;N;;;;; +1F372;POT OF FOOD;So;0;ON;;;;;N;;;;; +1F373;COOKING;So;0;ON;;;;;N;;;;; +1F374;FORK AND KNIFE;So;0;ON;;;;;N;;;;; +1F375;TEACUP WITHOUT HANDLE;So;0;ON;;;;;N;;;;; +1F376;SAKE BOTTLE AND CUP;So;0;ON;;;;;N;;;;; +1F377;WINE GLASS;So;0;ON;;;;;N;;;;; +1F378;COCKTAIL GLASS;So;0;ON;;;;;N;;;;; +1F379;TROPICAL DRINK;So;0;ON;;;;;N;;;;; +1F37A;BEER MUG;So;0;ON;;;;;N;;;;; +1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; +1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; +1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; +1F37E;BOTTLE WITH POPPING CORK;So;0;ON;;;;;N;;;;; +1F37F;POPCORN;So;0;ON;;;;;N;;;;; +1F380;RIBBON;So;0;ON;;;;;N;;;;; +1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; +1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; +1F383;JACK-O-LANTERN;So;0;ON;;;;;N;;;;; +1F384;CHRISTMAS TREE;So;0;ON;;;;;N;;;;; +1F385;FATHER CHRISTMAS;So;0;ON;;;;;N;;;;; +1F386;FIREWORKS;So;0;ON;;;;;N;;;;; +1F387;FIREWORK SPARKLER;So;0;ON;;;;;N;;;;; +1F388;BALLOON;So;0;ON;;;;;N;;;;; +1F389;PARTY POPPER;So;0;ON;;;;;N;;;;; +1F38A;CONFETTI BALL;So;0;ON;;;;;N;;;;; +1F38B;TANABATA TREE;So;0;ON;;;;;N;;;;; +1F38C;CROSSED FLAGS;So;0;ON;;;;;N;;;;; +1F38D;PINE DECORATION;So;0;ON;;;;;N;;;;; +1F38E;JAPANESE DOLLS;So;0;ON;;;;;N;;;;; +1F38F;CARP STREAMER;So;0;ON;;;;;N;;;;; +1F390;WIND CHIME;So;0;ON;;;;;N;;;;; +1F391;MOON VIEWING CEREMONY;So;0;ON;;;;;N;;;;; +1F392;SCHOOL SATCHEL;So;0;ON;;;;;N;;;;; +1F393;GRADUATION CAP;So;0;ON;;;;;N;;;;; +1F394;HEART WITH TIP ON THE LEFT;So;0;ON;;;;;N;;;;; +1F395;BOUQUET OF FLOWERS;So;0;ON;;;;;N;;;;; +1F396;MILITARY MEDAL;So;0;ON;;;;;N;;;;; +1F397;REMINDER RIBBON;So;0;ON;;;;;N;;;;; +1F398;MUSICAL KEYBOARD WITH JACKS;So;0;ON;;;;;N;;;;; +1F399;STUDIO MICROPHONE;So;0;ON;;;;;N;;;;; +1F39A;LEVEL SLIDER;So;0;ON;;;;;N;;;;; +1F39B;CONTROL KNOBS;So;0;ON;;;;;N;;;;; +1F39C;BEAMED ASCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39D;BEAMED DESCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39E;FILM FRAMES;So;0;ON;;;;;N;;;;; +1F39F;ADMISSION TICKETS;So;0;ON;;;;;N;;;;; +1F3A0;CAROUSEL HORSE;So;0;ON;;;;;N;;;;; +1F3A1;FERRIS WHEEL;So;0;ON;;;;;N;;;;; +1F3A2;ROLLER COASTER;So;0;ON;;;;;N;;;;; +1F3A3;FISHING POLE AND FISH;So;0;ON;;;;;N;;;;; +1F3A4;MICROPHONE;So;0;ON;;;;;N;;;;; +1F3A5;MOVIE CAMERA;So;0;ON;;;;;N;;;;; +1F3A6;CINEMA;So;0;ON;;;;;N;;;;; +1F3A7;HEADPHONE;So;0;ON;;;;;N;;;;; +1F3A8;ARTIST PALETTE;So;0;ON;;;;;N;;;;; +1F3A9;TOP HAT;So;0;ON;;;;;N;;;;; +1F3AA;CIRCUS TENT;So;0;ON;;;;;N;;;;; +1F3AB;TICKET;So;0;ON;;;;;N;;;;; +1F3AC;CLAPPER BOARD;So;0;ON;;;;;N;;;;; +1F3AD;PERFORMING ARTS;So;0;ON;;;;;N;;;;; +1F3AE;VIDEO GAME;So;0;ON;;;;;N;;;;; +1F3AF;DIRECT HIT;So;0;ON;;;;;N;;;;; +1F3B0;SLOT MACHINE;So;0;ON;;;;;N;;;;; +1F3B1;BILLIARDS;So;0;ON;;;;;N;;;;; +1F3B2;GAME DIE;So;0;ON;;;;;N;;;;; +1F3B3;BOWLING;So;0;ON;;;;;N;;;;; +1F3B4;FLOWER PLAYING CARDS;So;0;ON;;;;;N;;;;; +1F3B5;MUSICAL NOTE;So;0;ON;;;;;N;;;;; +1F3B6;MULTIPLE MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F3B7;SAXOPHONE;So;0;ON;;;;;N;;;;; +1F3B8;GUITAR;So;0;ON;;;;;N;;;;; +1F3B9;MUSICAL KEYBOARD;So;0;ON;;;;;N;;;;; +1F3BA;TRUMPET;So;0;ON;;;;;N;;;;; +1F3BB;VIOLIN;So;0;ON;;;;;N;;;;; +1F3BC;MUSICAL SCORE;So;0;ON;;;;;N;;;;; +1F3BD;RUNNING SHIRT WITH SASH;So;0;ON;;;;;N;;;;; +1F3BE;TENNIS RACQUET AND BALL;So;0;ON;;;;;N;;;;; +1F3BF;SKI AND SKI BOOT;So;0;ON;;;;;N;;;;; +1F3C0;BASKETBALL AND HOOP;So;0;ON;;;;;N;;;;; +1F3C1;CHEQUERED FLAG;So;0;ON;;;;;N;;;;; +1F3C2;SNOWBOARDER;So;0;ON;;;;;N;;;;; +1F3C3;RUNNER;So;0;ON;;;;;N;;;;; +1F3C4;SURFER;So;0;ON;;;;;N;;;;; +1F3C5;SPORTS MEDAL;So;0;ON;;;;;N;;;;; +1F3C6;TROPHY;So;0;ON;;;;;N;;;;; +1F3C7;HORSE RACING;So;0;ON;;;;;N;;;;; +1F3C8;AMERICAN FOOTBALL;So;0;ON;;;;;N;;;;; +1F3C9;RUGBY FOOTBALL;So;0;ON;;;;;N;;;;; +1F3CA;SWIMMER;So;0;ON;;;;;N;;;;; +1F3CB;WEIGHT LIFTER;So;0;ON;;;;;N;;;;; +1F3CC;GOLFER;So;0;ON;;;;;N;;;;; +1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; +1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; +1F3CF;CRICKET BAT AND BALL;So;0;ON;;;;;N;;;;; +1F3D0;VOLLEYBALL;So;0;ON;;;;;N;;;;; +1F3D1;FIELD HOCKEY STICK AND BALL;So;0;ON;;;;;N;;;;; +1F3D2;ICE HOCKEY STICK AND PUCK;So;0;ON;;;;;N;;;;; +1F3D3;TABLE TENNIS PADDLE AND BALL;So;0;ON;;;;;N;;;;; +1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; +1F3D5;CAMPING;So;0;ON;;;;;N;;;;; +1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; +1F3D7;BUILDING CONSTRUCTION;So;0;ON;;;;;N;;;;; +1F3D8;HOUSE BUILDINGS;So;0;ON;;;;;N;;;;; +1F3D9;CITYSCAPE;So;0;ON;;;;;N;;;;; +1F3DA;DERELICT HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3DB;CLASSICAL BUILDING;So;0;ON;;;;;N;;;;; +1F3DC;DESERT;So;0;ON;;;;;N;;;;; +1F3DD;DESERT ISLAND;So;0;ON;;;;;N;;;;; +1F3DE;NATIONAL PARK;So;0;ON;;;;;N;;;;; +1F3DF;STADIUM;So;0;ON;;;;;N;;;;; +1F3E0;HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3E1;HOUSE WITH GARDEN;So;0;ON;;;;;N;;;;; +1F3E2;OFFICE BUILDING;So;0;ON;;;;;N;;;;; +1F3E3;JAPANESE POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E4;EUROPEAN POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E5;HOSPITAL;So;0;ON;;;;;N;;;;; +1F3E6;BANK;So;0;ON;;;;;N;;;;; +1F3E7;AUTOMATED TELLER MACHINE;So;0;ON;;;;;N;;;;; +1F3E8;HOTEL;So;0;ON;;;;;N;;;;; +1F3E9;LOVE HOTEL;So;0;ON;;;;;N;;;;; +1F3EA;CONVENIENCE STORE;So;0;ON;;;;;N;;;;; +1F3EB;SCHOOL;So;0;ON;;;;;N;;;;; +1F3EC;DEPARTMENT STORE;So;0;ON;;;;;N;;;;; +1F3ED;FACTORY;So;0;ON;;;;;N;;;;; +1F3EE;IZAKAYA LANTERN;So;0;ON;;;;;N;;;;; +1F3EF;JAPANESE CASTLE;So;0;ON;;;;;N;;;;; +1F3F0;EUROPEAN CASTLE;So;0;ON;;;;;N;;;;; +1F3F1;WHITE PENNANT;So;0;ON;;;;;N;;;;; +1F3F2;BLACK PENNANT;So;0;ON;;;;;N;;;;; +1F3F3;WAVING WHITE FLAG;So;0;ON;;;;;N;;;;; +1F3F4;WAVING BLACK FLAG;So;0;ON;;;;;N;;;;; +1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; +1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; +1F3F7;LABEL;So;0;ON;;;;;N;;;;; +1F3F8;BADMINTON RACQUET AND SHUTTLECOCK;So;0;ON;;;;;N;;;;; +1F3F9;BOW AND ARROW;So;0;ON;;;;;N;;;;; +1F3FA;AMPHORA;So;0;ON;;;;;N;;;;; +1F3FB;EMOJI MODIFIER FITZPATRICK TYPE-1-2;Sk;0;ON;;;;;N;;;;; +1F3FC;EMOJI MODIFIER FITZPATRICK TYPE-3;Sk;0;ON;;;;;N;;;;; +1F3FD;EMOJI MODIFIER FITZPATRICK TYPE-4;Sk;0;ON;;;;;N;;;;; +1F3FE;EMOJI MODIFIER FITZPATRICK TYPE-5;Sk;0;ON;;;;;N;;;;; +1F3FF;EMOJI MODIFIER FITZPATRICK TYPE-6;Sk;0;ON;;;;;N;;;;; +1F400;RAT;So;0;ON;;;;;N;;;;; +1F401;MOUSE;So;0;ON;;;;;N;;;;; +1F402;OX;So;0;ON;;;;;N;;;;; +1F403;WATER BUFFALO;So;0;ON;;;;;N;;;;; +1F404;COW;So;0;ON;;;;;N;;;;; +1F405;TIGER;So;0;ON;;;;;N;;;;; +1F406;LEOPARD;So;0;ON;;;;;N;;;;; +1F407;RABBIT;So;0;ON;;;;;N;;;;; +1F408;CAT;So;0;ON;;;;;N;;;;; +1F409;DRAGON;So;0;ON;;;;;N;;;;; +1F40A;CROCODILE;So;0;ON;;;;;N;;;;; +1F40B;WHALE;So;0;ON;;;;;N;;;;; +1F40C;SNAIL;So;0;ON;;;;;N;;;;; +1F40D;SNAKE;So;0;ON;;;;;N;;;;; +1F40E;HORSE;So;0;ON;;;;;N;;;;; +1F40F;RAM;So;0;ON;;;;;N;;;;; +1F410;GOAT;So;0;ON;;;;;N;;;;; +1F411;SHEEP;So;0;ON;;;;;N;;;;; +1F412;MONKEY;So;0;ON;;;;;N;;;;; +1F413;ROOSTER;So;0;ON;;;;;N;;;;; +1F414;CHICKEN;So;0;ON;;;;;N;;;;; +1F415;DOG;So;0;ON;;;;;N;;;;; +1F416;PIG;So;0;ON;;;;;N;;;;; +1F417;BOAR;So;0;ON;;;;;N;;;;; +1F418;ELEPHANT;So;0;ON;;;;;N;;;;; +1F419;OCTOPUS;So;0;ON;;;;;N;;;;; +1F41A;SPIRAL SHELL;So;0;ON;;;;;N;;;;; +1F41B;BUG;So;0;ON;;;;;N;;;;; +1F41C;ANT;So;0;ON;;;;;N;;;;; +1F41D;HONEYBEE;So;0;ON;;;;;N;;;;; +1F41E;LADY BEETLE;So;0;ON;;;;;N;;;;; +1F41F;FISH;So;0;ON;;;;;N;;;;; +1F420;TROPICAL FISH;So;0;ON;;;;;N;;;;; +1F421;BLOWFISH;So;0;ON;;;;;N;;;;; +1F422;TURTLE;So;0;ON;;;;;N;;;;; +1F423;HATCHING CHICK;So;0;ON;;;;;N;;;;; +1F424;BABY CHICK;So;0;ON;;;;;N;;;;; +1F425;FRONT-FACING BABY CHICK;So;0;ON;;;;;N;;;;; +1F426;BIRD;So;0;ON;;;;;N;;;;; +1F427;PENGUIN;So;0;ON;;;;;N;;;;; +1F428;KOALA;So;0;ON;;;;;N;;;;; +1F429;POODLE;So;0;ON;;;;;N;;;;; +1F42A;DROMEDARY CAMEL;So;0;ON;;;;;N;;;;; +1F42B;BACTRIAN CAMEL;So;0;ON;;;;;N;;;;; +1F42C;DOLPHIN;So;0;ON;;;;;N;;;;; +1F42D;MOUSE FACE;So;0;ON;;;;;N;;;;; +1F42E;COW FACE;So;0;ON;;;;;N;;;;; +1F42F;TIGER FACE;So;0;ON;;;;;N;;;;; +1F430;RABBIT FACE;So;0;ON;;;;;N;;;;; +1F431;CAT FACE;So;0;ON;;;;;N;;;;; +1F432;DRAGON FACE;So;0;ON;;;;;N;;;;; +1F433;SPOUTING WHALE;So;0;ON;;;;;N;;;;; +1F434;HORSE FACE;So;0;ON;;;;;N;;;;; +1F435;MONKEY FACE;So;0;ON;;;;;N;;;;; +1F436;DOG FACE;So;0;ON;;;;;N;;;;; +1F437;PIG FACE;So;0;ON;;;;;N;;;;; +1F438;FROG FACE;So;0;ON;;;;;N;;;;; +1F439;HAMSTER FACE;So;0;ON;;;;;N;;;;; +1F43A;WOLF FACE;So;0;ON;;;;;N;;;;; +1F43B;BEAR FACE;So;0;ON;;;;;N;;;;; +1F43C;PANDA FACE;So;0;ON;;;;;N;;;;; +1F43D;PIG NOSE;So;0;ON;;;;;N;;;;; +1F43E;PAW PRINTS;So;0;ON;;;;;N;;;;; +1F43F;CHIPMUNK;So;0;ON;;;;;N;;;;; +1F440;EYES;So;0;ON;;;;;N;;;;; +1F441;EYE;So;0;ON;;;;;N;;;;; +1F442;EAR;So;0;ON;;;;;N;;;;; +1F443;NOSE;So;0;ON;;;;;N;;;;; +1F444;MOUTH;So;0;ON;;;;;N;;;;; +1F445;TONGUE;So;0;ON;;;;;N;;;;; +1F446;WHITE UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F447;WHITE DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F448;WHITE LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F449;WHITE RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F44A;FISTED HAND SIGN;So;0;ON;;;;;N;;;;; +1F44B;WAVING HAND SIGN;So;0;ON;;;;;N;;;;; +1F44C;OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F44D;THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F44E;THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F44F;CLAPPING HANDS SIGN;So;0;ON;;;;;N;;;;; +1F450;OPEN HANDS SIGN;So;0;ON;;;;;N;;;;; +1F451;CROWN;So;0;ON;;;;;N;;;;; +1F452;WOMANS HAT;So;0;ON;;;;;N;;;;; +1F453;EYEGLASSES;So;0;ON;;;;;N;;;;; +1F454;NECKTIE;So;0;ON;;;;;N;;;;; +1F455;T-SHIRT;So;0;ON;;;;;N;;;;; +1F456;JEANS;So;0;ON;;;;;N;;;;; +1F457;DRESS;So;0;ON;;;;;N;;;;; +1F458;KIMONO;So;0;ON;;;;;N;;;;; +1F459;BIKINI;So;0;ON;;;;;N;;;;; +1F45A;WOMANS CLOTHES;So;0;ON;;;;;N;;;;; +1F45B;PURSE;So;0;ON;;;;;N;;;;; +1F45C;HANDBAG;So;0;ON;;;;;N;;;;; +1F45D;POUCH;So;0;ON;;;;;N;;;;; +1F45E;MANS SHOE;So;0;ON;;;;;N;;;;; +1F45F;ATHLETIC SHOE;So;0;ON;;;;;N;;;;; +1F460;HIGH-HEELED SHOE;So;0;ON;;;;;N;;;;; +1F461;WOMANS SANDAL;So;0;ON;;;;;N;;;;; +1F462;WOMANS BOOTS;So;0;ON;;;;;N;;;;; +1F463;FOOTPRINTS;So;0;ON;;;;;N;;;;; +1F464;BUST IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F465;BUSTS IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F466;BOY;So;0;ON;;;;;N;;;;; +1F467;GIRL;So;0;ON;;;;;N;;;;; +1F468;MAN;So;0;ON;;;;;N;;;;; +1F469;WOMAN;So;0;ON;;;;;N;;;;; +1F46A;FAMILY;So;0;ON;;;;;N;;;;; +1F46B;MAN AND WOMAN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46C;TWO MEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46D;TWO WOMEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46E;POLICE OFFICER;So;0;ON;;;;;N;;;;; +1F46F;WOMAN WITH BUNNY EARS;So;0;ON;;;;;N;;;;; +1F470;BRIDE WITH VEIL;So;0;ON;;;;;N;;;;; +1F471;PERSON WITH BLOND HAIR;So;0;ON;;;;;N;;;;; +1F472;MAN WITH GUA PI MAO;So;0;ON;;;;;N;;;;; +1F473;MAN WITH TURBAN;So;0;ON;;;;;N;;;;; +1F474;OLDER MAN;So;0;ON;;;;;N;;;;; +1F475;OLDER WOMAN;So;0;ON;;;;;N;;;;; +1F476;BABY;So;0;ON;;;;;N;;;;; +1F477;CONSTRUCTION WORKER;So;0;ON;;;;;N;;;;; +1F478;PRINCESS;So;0;ON;;;;;N;;;;; +1F479;JAPANESE OGRE;So;0;ON;;;;;N;;;;; +1F47A;JAPANESE GOBLIN;So;0;ON;;;;;N;;;;; +1F47B;GHOST;So;0;ON;;;;;N;;;;; +1F47C;BABY ANGEL;So;0;ON;;;;;N;;;;; +1F47D;EXTRATERRESTRIAL ALIEN;So;0;ON;;;;;N;;;;; +1F47E;ALIEN MONSTER;So;0;ON;;;;;N;;;;; +1F47F;IMP;So;0;ON;;;;;N;;;;; +1F480;SKULL;So;0;ON;;;;;N;;;;; +1F481;INFORMATION DESK PERSON;So;0;ON;;;;;N;;;;; +1F482;GUARDSMAN;So;0;ON;;;;;N;;;;; +1F483;DANCER;So;0;ON;;;;;N;;;;; +1F484;LIPSTICK;So;0;ON;;;;;N;;;;; +1F485;NAIL POLISH;So;0;ON;;;;;N;;;;; +1F486;FACE MASSAGE;So;0;ON;;;;;N;;;;; +1F487;HAIRCUT;So;0;ON;;;;;N;;;;; +1F488;BARBER POLE;So;0;ON;;;;;N;;;;; +1F489;SYRINGE;So;0;ON;;;;;N;;;;; +1F48A;PILL;So;0;ON;;;;;N;;;;; +1F48B;KISS MARK;So;0;ON;;;;;N;;;;; +1F48C;LOVE LETTER;So;0;ON;;;;;N;;;;; +1F48D;RING;So;0;ON;;;;;N;;;;; +1F48E;GEM STONE;So;0;ON;;;;;N;;;;; +1F48F;KISS;So;0;ON;;;;;N;;;;; +1F490;BOUQUET;So;0;ON;;;;;N;;;;; +1F491;COUPLE WITH HEART;So;0;ON;;;;;N;;;;; +1F492;WEDDING;So;0;ON;;;;;N;;;;; +1F493;BEATING HEART;So;0;ON;;;;;N;;;;; +1F494;BROKEN HEART;So;0;ON;;;;;N;;;;; +1F495;TWO HEARTS;So;0;ON;;;;;N;;;;; +1F496;SPARKLING HEART;So;0;ON;;;;;N;;;;; +1F497;GROWING HEART;So;0;ON;;;;;N;;;;; +1F498;HEART WITH ARROW;So;0;ON;;;;;N;;;;; +1F499;BLUE HEART;So;0;ON;;;;;N;;;;; +1F49A;GREEN HEART;So;0;ON;;;;;N;;;;; +1F49B;YELLOW HEART;So;0;ON;;;;;N;;;;; +1F49C;PURPLE HEART;So;0;ON;;;;;N;;;;; +1F49D;HEART WITH RIBBON;So;0;ON;;;;;N;;;;; +1F49E;REVOLVING HEARTS;So;0;ON;;;;;N;;;;; +1F49F;HEART DECORATION;So;0;ON;;;;;N;;;;; +1F4A0;DIAMOND SHAPE WITH A DOT INSIDE;So;0;ON;;;;;N;;;;; +1F4A1;ELECTRIC LIGHT BULB;So;0;ON;;;;;N;;;;; +1F4A2;ANGER SYMBOL;So;0;ON;;;;;N;;;;; +1F4A3;BOMB;So;0;ON;;;;;N;;;;; +1F4A4;SLEEPING SYMBOL;So;0;ON;;;;;N;;;;; +1F4A5;COLLISION SYMBOL;So;0;ON;;;;;N;;;;; +1F4A6;SPLASHING SWEAT SYMBOL;So;0;ON;;;;;N;;;;; +1F4A7;DROPLET;So;0;ON;;;;;N;;;;; +1F4A8;DASH SYMBOL;So;0;ON;;;;;N;;;;; +1F4A9;PILE OF POO;So;0;ON;;;;;N;;;;; +1F4AA;FLEXED BICEPS;So;0;ON;;;;;N;;;;; +1F4AB;DIZZY SYMBOL;So;0;ON;;;;;N;;;;; +1F4AC;SPEECH BALLOON;So;0;ON;;;;;N;;;;; +1F4AD;THOUGHT BALLOON;So;0;ON;;;;;N;;;;; +1F4AE;WHITE FLOWER;So;0;ON;;;;;N;;;;; +1F4AF;HUNDRED POINTS SYMBOL;So;0;ON;;;;;N;;;;; +1F4B0;MONEY BAG;So;0;ON;;;;;N;;;;; +1F4B1;CURRENCY EXCHANGE;So;0;ON;;;;;N;;;;; +1F4B2;HEAVY DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B3;CREDIT CARD;So;0;ON;;;;;N;;;;; +1F4B4;BANKNOTE WITH YEN SIGN;So;0;ON;;;;;N;;;;; +1F4B5;BANKNOTE WITH DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B6;BANKNOTE WITH EURO SIGN;So;0;ON;;;;;N;;;;; +1F4B7;BANKNOTE WITH POUND SIGN;So;0;ON;;;;;N;;;;; +1F4B8;MONEY WITH WINGS;So;0;ON;;;;;N;;;;; +1F4B9;CHART WITH UPWARDS TREND AND YEN SIGN;So;0;ON;;;;;N;;;;; +1F4BA;SEAT;So;0;ON;;;;;N;;;;; +1F4BB;PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F4BC;BRIEFCASE;So;0;ON;;;;;N;;;;; +1F4BD;MINIDISC;So;0;ON;;;;;N;;;;; +1F4BE;FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F4BF;OPTICAL DISC;So;0;ON;;;;;N;;;;; +1F4C0;DVD;So;0;ON;;;;;N;;;;; +1F4C1;FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C2;OPEN FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C3;PAGE WITH CURL;So;0;ON;;;;;N;;;;; +1F4C4;PAGE FACING UP;So;0;ON;;;;;N;;;;; +1F4C5;CALENDAR;So;0;ON;;;;;N;;;;; +1F4C6;TEAR-OFF CALENDAR;So;0;ON;;;;;N;;;;; +1F4C7;CARD INDEX;So;0;ON;;;;;N;;;;; +1F4C8;CHART WITH UPWARDS TREND;So;0;ON;;;;;N;;;;; +1F4C9;CHART WITH DOWNWARDS TREND;So;0;ON;;;;;N;;;;; +1F4CA;BAR CHART;So;0;ON;;;;;N;;;;; +1F4CB;CLIPBOARD;So;0;ON;;;;;N;;;;; +1F4CC;PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CD;ROUND PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CE;PAPERCLIP;So;0;ON;;;;;N;;;;; +1F4CF;STRAIGHT RULER;So;0;ON;;;;;N;;;;; +1F4D0;TRIANGULAR RULER;So;0;ON;;;;;N;;;;; +1F4D1;BOOKMARK TABS;So;0;ON;;;;;N;;;;; +1F4D2;LEDGER;So;0;ON;;;;;N;;;;; +1F4D3;NOTEBOOK;So;0;ON;;;;;N;;;;; +1F4D4;NOTEBOOK WITH DECORATIVE COVER;So;0;ON;;;;;N;;;;; +1F4D5;CLOSED BOOK;So;0;ON;;;;;N;;;;; +1F4D6;OPEN BOOK;So;0;ON;;;;;N;;;;; +1F4D7;GREEN BOOK;So;0;ON;;;;;N;;;;; +1F4D8;BLUE BOOK;So;0;ON;;;;;N;;;;; +1F4D9;ORANGE BOOK;So;0;ON;;;;;N;;;;; +1F4DA;BOOKS;So;0;ON;;;;;N;;;;; +1F4DB;NAME BADGE;So;0;ON;;;;;N;;;;; +1F4DC;SCROLL;So;0;ON;;;;;N;;;;; +1F4DD;MEMO;So;0;ON;;;;;N;;;;; +1F4DE;TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F4DF;PAGER;So;0;ON;;;;;N;;;;; +1F4E0;FAX MACHINE;So;0;ON;;;;;N;;;;; +1F4E1;SATELLITE ANTENNA;So;0;ON;;;;;N;;;;; +1F4E2;PUBLIC ADDRESS LOUDSPEAKER;So;0;ON;;;;;N;;;;; +1F4E3;CHEERING MEGAPHONE;So;0;ON;;;;;N;;;;; +1F4E4;OUTBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E5;INBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E6;PACKAGE;So;0;ON;;;;;N;;;;; +1F4E7;E-MAIL SYMBOL;So;0;ON;;;;;N;;;;; +1F4E8;INCOMING ENVELOPE;So;0;ON;;;;;N;;;;; +1F4E9;ENVELOPE WITH DOWNWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F4EA;CLOSED MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EB;CLOSED MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4EC;OPEN MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4ED;OPEN MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EE;POSTBOX;So;0;ON;;;;;N;;;;; +1F4EF;POSTAL HORN;So;0;ON;;;;;N;;;;; +1F4F0;NEWSPAPER;So;0;ON;;;;;N;;;;; +1F4F1;MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F4F2;MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT;So;0;ON;;;;;N;;;;; +1F4F3;VIBRATION MODE;So;0;ON;;;;;N;;;;; +1F4F4;MOBILE PHONE OFF;So;0;ON;;;;;N;;;;; +1F4F5;NO MOBILE PHONES;So;0;ON;;;;;N;;;;; +1F4F6;ANTENNA WITH BARS;So;0;ON;;;;;N;;;;; +1F4F7;CAMERA;So;0;ON;;;;;N;;;;; +1F4F8;CAMERA WITH FLASH;So;0;ON;;;;;N;;;;; +1F4F9;VIDEO CAMERA;So;0;ON;;;;;N;;;;; +1F4FA;TELEVISION;So;0;ON;;;;;N;;;;; +1F4FB;RADIO;So;0;ON;;;;;N;;;;; +1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; +1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; +1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; +1F4FF;PRAYER BEADS;So;0;ON;;;;;N;;;;; +1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; +1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; +1F503;CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F504;ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F505;LOW BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F506;HIGH BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F507;SPEAKER WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F508;SPEAKER;So;0;ON;;;;;N;;;;; +1F509;SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F50A;SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F50B;BATTERY;So;0;ON;;;;;N;;;;; +1F50C;ELECTRIC PLUG;So;0;ON;;;;;N;;;;; +1F50D;LEFT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50E;RIGHT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50F;LOCK WITH INK PEN;So;0;ON;;;;;N;;;;; +1F510;CLOSED LOCK WITH KEY;So;0;ON;;;;;N;;;;; +1F511;KEY;So;0;ON;;;;;N;;;;; +1F512;LOCK;So;0;ON;;;;;N;;;;; +1F513;OPEN LOCK;So;0;ON;;;;;N;;;;; +1F514;BELL;So;0;ON;;;;;N;;;;; +1F515;BELL WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F516;BOOKMARK;So;0;ON;;;;;N;;;;; +1F517;LINK SYMBOL;So;0;ON;;;;;N;;;;; +1F518;RADIO BUTTON;So;0;ON;;;;;N;;;;; +1F519;BACK WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51A;END WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51B;ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51C;SOON WITH RIGHTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51D;TOP WITH UPWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51E;NO ONE UNDER EIGHTEEN SYMBOL;So;0;ON;;;;;N;;;;; +1F51F;KEYCAP TEN;So;0;ON;;;;;N;;;;; +1F520;INPUT SYMBOL FOR LATIN CAPITAL LETTERS;So;0;ON;;;;;N;;;;; +1F521;INPUT SYMBOL FOR LATIN SMALL LETTERS;So;0;ON;;;;;N;;;;; +1F522;INPUT SYMBOL FOR NUMBERS;So;0;ON;;;;;N;;;;; +1F523;INPUT SYMBOL FOR SYMBOLS;So;0;ON;;;;;N;;;;; +1F524;INPUT SYMBOL FOR LATIN LETTERS;So;0;ON;;;;;N;;;;; +1F525;FIRE;So;0;ON;;;;;N;;;;; +1F526;ELECTRIC TORCH;So;0;ON;;;;;N;;;;; +1F527;WRENCH;So;0;ON;;;;;N;;;;; +1F528;HAMMER;So;0;ON;;;;;N;;;;; +1F529;NUT AND BOLT;So;0;ON;;;;;N;;;;; +1F52A;HOCHO;So;0;ON;;;;;N;;;;; +1F52B;PISTOL;So;0;ON;;;;;N;;;;; +1F52C;MICROSCOPE;So;0;ON;;;;;N;;;;; +1F52D;TELESCOPE;So;0;ON;;;;;N;;;;; +1F52E;CRYSTAL BALL;So;0;ON;;;;;N;;;;; +1F52F;SIX POINTED STAR WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +1F530;JAPANESE SYMBOL FOR BEGINNER;So;0;ON;;;;;N;;;;; +1F531;TRIDENT EMBLEM;So;0;ON;;;;;N;;;;; +1F532;BLACK SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F533;WHITE SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F534;LARGE RED CIRCLE;So;0;ON;;;;;N;;;;; +1F535;LARGE BLUE CIRCLE;So;0;ON;;;;;N;;;;; +1F536;LARGE ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F537;LARGE BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F538;SMALL ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F539;SMALL BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F53A;UP-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53B;DOWN-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53C;UP-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53D;DOWN-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53E;LOWER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F53F;UPPER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F540;CIRCLED CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F541;CROSS POMMEE WITH HALF-CIRCLE BELOW;So;0;ON;;;;;N;;;;; +1F542;CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F543;NOTCHED LEFT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F544;NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F545;SYMBOL FOR MARKS CHAPTER;So;0;ON;;;;;N;;;;; +1F546;WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +1F547;HEAVY LATIN CROSS;So;0;ON;;;;;N;;;;; +1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; +1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; +1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; +1F54B;KAABA;So;0;ON;;;;;N;;;;; +1F54C;MOSQUE;So;0;ON;;;;;N;;;;; +1F54D;SYNAGOGUE;So;0;ON;;;;;N;;;;; +1F54E;MENORAH WITH NINE BRANCHES;So;0;ON;;;;;N;;;;; +1F54F;BOWL OF HYGIEIA;So;0;ON;;;;;N;;;;; +1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; +1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; +1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; +1F553;CLOCK FACE FOUR OCLOCK;So;0;ON;;;;;N;;;;; +1F554;CLOCK FACE FIVE OCLOCK;So;0;ON;;;;;N;;;;; +1F555;CLOCK FACE SIX OCLOCK;So;0;ON;;;;;N;;;;; +1F556;CLOCK FACE SEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F557;CLOCK FACE EIGHT OCLOCK;So;0;ON;;;;;N;;;;; +1F558;CLOCK FACE NINE OCLOCK;So;0;ON;;;;;N;;;;; +1F559;CLOCK FACE TEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55A;CLOCK FACE ELEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55B;CLOCK FACE TWELVE OCLOCK;So;0;ON;;;;;N;;;;; +1F55C;CLOCK FACE ONE-THIRTY;So;0;ON;;;;;N;;;;; +1F55D;CLOCK FACE TWO-THIRTY;So;0;ON;;;;;N;;;;; +1F55E;CLOCK FACE THREE-THIRTY;So;0;ON;;;;;N;;;;; +1F55F;CLOCK FACE FOUR-THIRTY;So;0;ON;;;;;N;;;;; +1F560;CLOCK FACE FIVE-THIRTY;So;0;ON;;;;;N;;;;; +1F561;CLOCK FACE SIX-THIRTY;So;0;ON;;;;;N;;;;; +1F562;CLOCK FACE SEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F563;CLOCK FACE EIGHT-THIRTY;So;0;ON;;;;;N;;;;; +1F564;CLOCK FACE NINE-THIRTY;So;0;ON;;;;;N;;;;; +1F565;CLOCK FACE TEN-THIRTY;So;0;ON;;;;;N;;;;; +1F566;CLOCK FACE ELEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F567;CLOCK FACE TWELVE-THIRTY;So;0;ON;;;;;N;;;;; +1F568;RIGHT SPEAKER;So;0;ON;;;;;N;;;;; +1F569;RIGHT SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F56A;RIGHT SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56B;BULLHORN;So;0;ON;;;;;N;;;;; +1F56C;BULLHORN WITH SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56D;RINGING BELL;So;0;ON;;;;;N;;;;; +1F56E;BOOK;So;0;ON;;;;;N;;;;; +1F56F;CANDLE;So;0;ON;;;;;N;;;;; +1F570;MANTELPIECE CLOCK;So;0;ON;;;;;N;;;;; +1F571;BLACK SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +1F572;NO PIRACY;So;0;ON;;;;;N;;;;; +1F573;HOLE;So;0;ON;;;;;N;;;;; +1F574;MAN IN BUSINESS SUIT LEVITATING;So;0;ON;;;;;N;;;;; +1F575;SLEUTH OR SPY;So;0;ON;;;;;N;;;;; +1F576;DARK SUNGLASSES;So;0;ON;;;;;N;;;;; +1F577;SPIDER;So;0;ON;;;;;N;;;;; +1F578;SPIDER WEB;So;0;ON;;;;;N;;;;; +1F579;JOYSTICK;So;0;ON;;;;;N;;;;; +1F57A;MAN DANCING;So;0;ON;;;;;N;;;;; +1F57B;LEFT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F57C;TELEPHONE RECEIVER WITH PAGE;So;0;ON;;;;;N;;;;; +1F57D;RIGHT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F57E;WHITE TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F57F;BLACK TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F580;TELEPHONE ON TOP OF MODEM;So;0;ON;;;;;N;;;;; +1F581;CLAMSHELL MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F582;BACK OF ENVELOPE;So;0;ON;;;;;N;;;;; +1F583;STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F584;ENVELOPE WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F585;FLYING ENVELOPE;So;0;ON;;;;;N;;;;; +1F586;PEN OVER STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F587;LINKED PAPERCLIPS;So;0;ON;;;;;N;;;;; +1F588;BLACK PUSHPIN;So;0;ON;;;;;N;;;;; +1F589;LOWER LEFT PENCIL;So;0;ON;;;;;N;;;;; +1F58A;LOWER LEFT BALLPOINT PEN;So;0;ON;;;;;N;;;;; +1F58B;LOWER LEFT FOUNTAIN PEN;So;0;ON;;;;;N;;;;; +1F58C;LOWER LEFT PAINTBRUSH;So;0;ON;;;;;N;;;;; +1F58D;LOWER LEFT CRAYON;So;0;ON;;;;;N;;;;; +1F58E;LEFT WRITING HAND;So;0;ON;;;;;N;;;;; +1F58F;TURNED OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F590;RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F591;REVERSED RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F592;REVERSED THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F593;REVERSED THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F594;REVERSED VICTORY HAND;So;0;ON;;;;;N;;;;; +1F595;REVERSED HAND WITH MIDDLE FINGER EXTENDED;So;0;ON;;;;;N;;;;; +1F596;RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS;So;0;ON;;;;;N;;;;; +1F597;WHITE DOWN POINTING LEFT HAND INDEX;So;0;ON;;;;;N;;;;; +1F598;SIDEWAYS WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F599;SIDEWAYS WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59A;SIDEWAYS BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59B;SIDEWAYS BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59C;BLACK LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59D;BLACK RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59E;SIDEWAYS WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59F;SIDEWAYS WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A0;SIDEWAYS BLACK UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A1;SIDEWAYS BLACK DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A2;BLACK UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A3;BLACK DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A4;BLACK HEART;So;0;ON;;;;;N;;;;; +1F5A5;DESKTOP COMPUTER;So;0;ON;;;;;N;;;;; +1F5A6;KEYBOARD AND MOUSE;So;0;ON;;;;;N;;;;; +1F5A7;THREE NETWORKED COMPUTERS;So;0;ON;;;;;N;;;;; +1F5A8;PRINTER;So;0;ON;;;;;N;;;;; +1F5A9;POCKET CALCULATOR;So;0;ON;;;;;N;;;;; +1F5AA;BLACK HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AB;WHITE HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AC;SOFT SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AD;TAPE CARTRIDGE;So;0;ON;;;;;N;;;;; +1F5AE;WIRED KEYBOARD;So;0;ON;;;;;N;;;;; +1F5AF;ONE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B0;TWO BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B1;THREE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B2;TRACKBALL;So;0;ON;;;;;N;;;;; +1F5B3;OLD PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F5B4;HARD DISK;So;0;ON;;;;;N;;;;; +1F5B5;SCREEN;So;0;ON;;;;;N;;;;; +1F5B6;PRINTER ICON;So;0;ON;;;;;N;;;;; +1F5B7;FAX ICON;So;0;ON;;;;;N;;;;; +1F5B8;OPTICAL DISC ICON;So;0;ON;;;;;N;;;;; +1F5B9;DOCUMENT WITH TEXT;So;0;ON;;;;;N;;;;; +1F5BA;DOCUMENT WITH TEXT AND PICTURE;So;0;ON;;;;;N;;;;; +1F5BB;DOCUMENT WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BC;FRAME WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BD;FRAME WITH TILES;So;0;ON;;;;;N;;;;; +1F5BE;FRAME WITH AN X;So;0;ON;;;;;N;;;;; +1F5BF;BLACK FOLDER;So;0;ON;;;;;N;;;;; +1F5C0;FOLDER;So;0;ON;;;;;N;;;;; +1F5C1;OPEN FOLDER;So;0;ON;;;;;N;;;;; +1F5C2;CARD INDEX DIVIDERS;So;0;ON;;;;;N;;;;; +1F5C3;CARD FILE BOX;So;0;ON;;;;;N;;;;; +1F5C4;FILE CABINET;So;0;ON;;;;;N;;;;; +1F5C5;EMPTY NOTE;So;0;ON;;;;;N;;;;; +1F5C6;EMPTY NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5C7;EMPTY NOTE PAD;So;0;ON;;;;;N;;;;; +1F5C8;NOTE;So;0;ON;;;;;N;;;;; +1F5C9;NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5CA;NOTE PAD;So;0;ON;;;;;N;;;;; +1F5CB;EMPTY DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CC;EMPTY PAGE;So;0;ON;;;;;N;;;;; +1F5CD;EMPTY PAGES;So;0;ON;;;;;N;;;;; +1F5CE;DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CF;PAGE;So;0;ON;;;;;N;;;;; +1F5D0;PAGES;So;0;ON;;;;;N;;;;; +1F5D1;WASTEBASKET;So;0;ON;;;;;N;;;;; +1F5D2;SPIRAL NOTE PAD;So;0;ON;;;;;N;;;;; +1F5D3;SPIRAL CALENDAR PAD;So;0;ON;;;;;N;;;;; +1F5D4;DESKTOP WINDOW;So;0;ON;;;;;N;;;;; +1F5D5;MINIMIZE;So;0;ON;;;;;N;;;;; +1F5D6;MAXIMIZE;So;0;ON;;;;;N;;;;; +1F5D7;OVERLAP;So;0;ON;;;;;N;;;;; +1F5D8;CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F5D9;CANCELLATION X;So;0;ON;;;;;N;;;;; +1F5DA;INCREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DB;DECREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DC;COMPRESSION;So;0;ON;;;;;N;;;;; +1F5DD;OLD KEY;So;0;ON;;;;;N;;;;; +1F5DE;ROLLED-UP NEWSPAPER;So;0;ON;;;;;N;;;;; +1F5DF;PAGE WITH CIRCLED TEXT;So;0;ON;;;;;N;;;;; +1F5E0;STOCK CHART;So;0;ON;;;;;N;;;;; +1F5E1;DAGGER KNIFE;So;0;ON;;;;;N;;;;; +1F5E2;LIPS;So;0;ON;;;;;N;;;;; +1F5E3;SPEAKING HEAD IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F5E4;THREE RAYS ABOVE;So;0;ON;;;;;N;;;;; +1F5E5;THREE RAYS BELOW;So;0;ON;;;;;N;;;;; +1F5E6;THREE RAYS LEFT;So;0;ON;;;;;N;;;;; +1F5E7;THREE RAYS RIGHT;So;0;ON;;;;;N;;;;; +1F5E8;LEFT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5E9;RIGHT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5EA;TWO SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EB;THREE SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EC;LEFT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5ED;RIGHT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5EE;LEFT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5EF;RIGHT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5F0;MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F1;LIGHTNING MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F2;LIGHTNING MOOD;So;0;ON;;;;;N;;;;; +1F5F3;BALLOT BOX WITH BALLOT;So;0;ON;;;;;N;;;;; +1F5F4;BALLOT SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F5;BALLOT BOX WITH SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F6;BALLOT BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F7;BALLOT BOX WITH BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F8;LIGHT CHECK MARK;So;0;ON;;;;;N;;;;; +1F5F9;BALLOT BOX WITH BOLD CHECK;So;0;ON;;;;;N;;;;; +1F5FA;WORLD MAP;So;0;ON;;;;;N;;;;; +1F5FB;MOUNT FUJI;So;0;ON;;;;;N;;;;; +1F5FC;TOKYO TOWER;So;0;ON;;;;;N;;;;; +1F5FD;STATUE OF LIBERTY;So;0;ON;;;;;N;;;;; +1F5FE;SILHOUETTE OF JAPAN;So;0;ON;;;;;N;;;;; +1F5FF;MOYAI;So;0;ON;;;;;N;;;;; +1F600;GRINNING FACE;So;0;ON;;;;;N;;;;; +1F601;GRINNING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F602;FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F603;SMILING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F604;SMILING FACE WITH OPEN MOUTH AND SMILING EYES;So;0;ON;;;;;N;;;;; +1F605;SMILING FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F606;SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F607;SMILING FACE WITH HALO;So;0;ON;;;;;N;;;;; +1F608;SMILING FACE WITH HORNS;So;0;ON;;;;;N;;;;; +1F609;WINKING FACE;So;0;ON;;;;;N;;;;; +1F60A;SMILING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F60B;FACE SAVOURING DELICIOUS FOOD;So;0;ON;;;;;N;;;;; +1F60C;RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F60D;SMILING FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F60E;SMILING FACE WITH SUNGLASSES;So;0;ON;;;;;N;;;;; +1F60F;SMIRKING FACE;So;0;ON;;;;;N;;;;; +1F610;NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1F611;EXPRESSIONLESS FACE;So;0;ON;;;;;N;;;;; +1F612;UNAMUSED FACE;So;0;ON;;;;;N;;;;; +1F613;FACE WITH COLD SWEAT;So;0;ON;;;;;N;;;;; +1F614;PENSIVE FACE;So;0;ON;;;;;N;;;;; +1F615;CONFUSED FACE;So;0;ON;;;;;N;;;;; +1F616;CONFOUNDED FACE;So;0;ON;;;;;N;;;;; +1F617;KISSING FACE;So;0;ON;;;;;N;;;;; +1F618;FACE THROWING A KISS;So;0;ON;;;;;N;;;;; +1F619;KISSING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F61A;KISSING FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61B;FACE WITH STUCK-OUT TONGUE;So;0;ON;;;;;N;;;;; +1F61C;FACE WITH STUCK-OUT TONGUE AND WINKING EYE;So;0;ON;;;;;N;;;;; +1F61D;FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61E;DISAPPOINTED FACE;So;0;ON;;;;;N;;;;; +1F61F;WORRIED FACE;So;0;ON;;;;;N;;;;; +1F620;ANGRY FACE;So;0;ON;;;;;N;;;;; +1F621;POUTING FACE;So;0;ON;;;;;N;;;;; +1F622;CRYING FACE;So;0;ON;;;;;N;;;;; +1F623;PERSEVERING FACE;So;0;ON;;;;;N;;;;; +1F624;FACE WITH LOOK OF TRIUMPH;So;0;ON;;;;;N;;;;; +1F625;DISAPPOINTED BUT RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F626;FROWNING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F627;ANGUISHED FACE;So;0;ON;;;;;N;;;;; +1F628;FEARFUL FACE;So;0;ON;;;;;N;;;;; +1F629;WEARY FACE;So;0;ON;;;;;N;;;;; +1F62A;SLEEPY FACE;So;0;ON;;;;;N;;;;; +1F62B;TIRED FACE;So;0;ON;;;;;N;;;;; +1F62C;GRIMACING FACE;So;0;ON;;;;;N;;;;; +1F62D;LOUDLY CRYING FACE;So;0;ON;;;;;N;;;;; +1F62E;FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F62F;HUSHED FACE;So;0;ON;;;;;N;;;;; +1F630;FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F631;FACE SCREAMING IN FEAR;So;0;ON;;;;;N;;;;; +1F632;ASTONISHED FACE;So;0;ON;;;;;N;;;;; +1F633;FLUSHED FACE;So;0;ON;;;;;N;;;;; +1F634;SLEEPING FACE;So;0;ON;;;;;N;;;;; +1F635;DIZZY FACE;So;0;ON;;;;;N;;;;; +1F636;FACE WITHOUT MOUTH;So;0;ON;;;;;N;;;;; +1F637;FACE WITH MEDICAL MASK;So;0;ON;;;;;N;;;;; +1F638;GRINNING CAT FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F639;CAT FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F63A;SMILING CAT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F63B;SMILING CAT FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F63C;CAT FACE WITH WRY SMILE;So;0;ON;;;;;N;;;;; +1F63D;KISSING CAT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F63E;POUTING CAT FACE;So;0;ON;;;;;N;;;;; +1F63F;CRYING CAT FACE;So;0;ON;;;;;N;;;;; +1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; +1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; +1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; +1F643;UPSIDE-DOWN FACE;So;0;ON;;;;;N;;;;; +1F644;FACE WITH ROLLING EYES;So;0;ON;;;;;N;;;;; +1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; +1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; +1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; +1F648;SEE-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F649;HEAR-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64A;SPEAK-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64B;HAPPY PERSON RAISING ONE HAND;So;0;ON;;;;;N;;;;; +1F64C;PERSON RAISING BOTH HANDS IN CELEBRATION;So;0;ON;;;;;N;;;;; +1F64D;PERSON FROWNING;So;0;ON;;;;;N;;;;; +1F64E;PERSON WITH POUTING FACE;So;0;ON;;;;;N;;;;; +1F64F;PERSON WITH FOLDED HANDS;So;0;ON;;;;;N;;;;; +1F650;NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F651;SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F652;NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F653;SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F654;TURNED NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F655;TURNED SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F656;TURNED NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F657;TURNED SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F658;NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F659;SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65A;NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65B;SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65C;HEAVY NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65D;HEAVY SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65E;HEAVY NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65F;HEAVY SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F660;NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F661;SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F662;NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F663;SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F664;HEAVY NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F665;HEAVY SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F666;HEAVY NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F667;HEAVY SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F668;HOLLOW QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F669;HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66A;SOLID QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F66B;SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66C;LEFTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66D;UPWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66E;RIGHTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66F;DOWNWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F670;SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F671;HEAVY SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F672;LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F673;HEAVY LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F674;HEAVY AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F675;SWASH AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F676;SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F677;SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F678;SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F679;HEAVY INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67A;SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67B;HEAVY SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67C;VERY HEAVY SOLIDUS;So;0;ON;;;;;N;;;;; +1F67D;VERY HEAVY REVERSE SOLIDUS;So;0;ON;;;;;N;;;;; +1F67E;CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F67F;REVERSE CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F680;ROCKET;So;0;ON;;;;;N;;;;; +1F681;HELICOPTER;So;0;ON;;;;;N;;;;; +1F682;STEAM LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F683;RAILWAY CAR;So;0;ON;;;;;N;;;;; +1F684;HIGH-SPEED TRAIN;So;0;ON;;;;;N;;;;; +1F685;HIGH-SPEED TRAIN WITH BULLET NOSE;So;0;ON;;;;;N;;;;; +1F686;TRAIN;So;0;ON;;;;;N;;;;; +1F687;METRO;So;0;ON;;;;;N;;;;; +1F688;LIGHT RAIL;So;0;ON;;;;;N;;;;; +1F689;STATION;So;0;ON;;;;;N;;;;; +1F68A;TRAM;So;0;ON;;;;;N;;;;; +1F68B;TRAM CAR;So;0;ON;;;;;N;;;;; +1F68C;BUS;So;0;ON;;;;;N;;;;; +1F68D;ONCOMING BUS;So;0;ON;;;;;N;;;;; +1F68E;TROLLEYBUS;So;0;ON;;;;;N;;;;; +1F68F;BUS STOP;So;0;ON;;;;;N;;;;; +1F690;MINIBUS;So;0;ON;;;;;N;;;;; +1F691;AMBULANCE;So;0;ON;;;;;N;;;;; +1F692;FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F693;POLICE CAR;So;0;ON;;;;;N;;;;; +1F694;ONCOMING POLICE CAR;So;0;ON;;;;;N;;;;; +1F695;TAXI;So;0;ON;;;;;N;;;;; +1F696;ONCOMING TAXI;So;0;ON;;;;;N;;;;; +1F697;AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F698;ONCOMING AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F699;RECREATIONAL VEHICLE;So;0;ON;;;;;N;;;;; +1F69A;DELIVERY TRUCK;So;0;ON;;;;;N;;;;; +1F69B;ARTICULATED LORRY;So;0;ON;;;;;N;;;;; +1F69C;TRACTOR;So;0;ON;;;;;N;;;;; +1F69D;MONORAIL;So;0;ON;;;;;N;;;;; +1F69E;MOUNTAIN RAILWAY;So;0;ON;;;;;N;;;;; +1F69F;SUSPENSION RAILWAY;So;0;ON;;;;;N;;;;; +1F6A0;MOUNTAIN CABLEWAY;So;0;ON;;;;;N;;;;; +1F6A1;AERIAL TRAMWAY;So;0;ON;;;;;N;;;;; +1F6A2;SHIP;So;0;ON;;;;;N;;;;; +1F6A3;ROWBOAT;So;0;ON;;;;;N;;;;; +1F6A4;SPEEDBOAT;So;0;ON;;;;;N;;;;; +1F6A5;HORIZONTAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A6;VERTICAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A7;CONSTRUCTION SIGN;So;0;ON;;;;;N;;;;; +1F6A8;POLICE CARS REVOLVING LIGHT;So;0;ON;;;;;N;;;;; +1F6A9;TRIANGULAR FLAG ON POST;So;0;ON;;;;;N;;;;; +1F6AA;DOOR;So;0;ON;;;;;N;;;;; +1F6AB;NO ENTRY SIGN;So;0;ON;;;;;N;;;;; +1F6AC;SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AD;NO SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AE;PUT LITTER IN ITS PLACE SYMBOL;So;0;ON;;;;;N;;;;; +1F6AF;DO NOT LITTER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B0;POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B1;NON-POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B2;BICYCLE;So;0;ON;;;;;N;;;;; +1F6B3;NO BICYCLES;So;0;ON;;;;;N;;;;; +1F6B4;BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B5;MOUNTAIN BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B6;PEDESTRIAN;So;0;ON;;;;;N;;;;; +1F6B7;NO PEDESTRIANS;So;0;ON;;;;;N;;;;; +1F6B8;CHILDREN CROSSING;So;0;ON;;;;;N;;;;; +1F6B9;MENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BA;WOMENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BB;RESTROOM;So;0;ON;;;;;N;;;;; +1F6BC;BABY SYMBOL;So;0;ON;;;;;N;;;;; +1F6BD;TOILET;So;0;ON;;;;;N;;;;; +1F6BE;WATER CLOSET;So;0;ON;;;;;N;;;;; +1F6BF;SHOWER;So;0;ON;;;;;N;;;;; +1F6C0;BATH;So;0;ON;;;;;N;;;;; +1F6C1;BATHTUB;So;0;ON;;;;;N;;;;; +1F6C2;PASSPORT CONTROL;So;0;ON;;;;;N;;;;; +1F6C3;CUSTOMS;So;0;ON;;;;;N;;;;; +1F6C4;BAGGAGE CLAIM;So;0;ON;;;;;N;;;;; +1F6C5;LEFT LUGGAGE;So;0;ON;;;;;N;;;;; +1F6C6;TRIANGLE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +1F6C7;PROHIBITED SIGN;So;0;ON;;;;;N;;;;; +1F6C8;CIRCLED INFORMATION SOURCE;So;0;ON;;;;;N;;;;; +1F6C9;BOYS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CA;GIRLS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CB;COUCH AND LAMP;So;0;ON;;;;;N;;;;; +1F6CC;SLEEPING ACCOMMODATION;So;0;ON;;;;;N;;;;; +1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;; +1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; +1F6CF;BED;So;0;ON;;;;;N;;;;; +1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; +1F6D1;OCTAGONAL SIGN;So;0;ON;;;;;N;;;;; +1F6D2;SHOPPING TROLLEY;So;0;ON;;;;;N;;;;; +1F6D3;STUPA;So;0;ON;;;;;N;;;;; +1F6D4;PAGODA;So;0;ON;;;;;N;;;;; +1F6D5;HINDU TEMPLE;So;0;ON;;;;;N;;;;; +1F6D6;HUT;So;0;ON;;;;;N;;;;; +1F6D7;ELEVATOR;So;0;ON;;;;;N;;;;; +1F6D8;LANDSLIDE;So;0;ON;;;;;N;;;;; +1F6DC;WIRELESS;So;0;ON;;;;;N;;;;; +1F6DD;PLAYGROUND SLIDE;So;0;ON;;;;;N;;;;; +1F6DE;WHEEL;So;0;ON;;;;;N;;;;; +1F6DF;RING BUOY;So;0;ON;;;;;N;;;;; +1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; +1F6E1;SHIELD;So;0;ON;;;;;N;;;;; +1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; +1F6E3;MOTORWAY;So;0;ON;;;;;N;;;;; +1F6E4;RAILWAY TRACK;So;0;ON;;;;;N;;;;; +1F6E5;MOTOR BOAT;So;0;ON;;;;;N;;;;; +1F6E6;UP-POINTING MILITARY AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E7;UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E8;UP-POINTING SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E9;SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EA;NORTHEAST-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EB;AIRPLANE DEPARTURE;So;0;ON;;;;;N;;;;; +1F6EC;AIRPLANE ARRIVING;So;0;ON;;;;;N;;;;; +1F6F0;SATELLITE;So;0;ON;;;;;N;;;;; +1F6F1;ONCOMING FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F6F2;DIESEL LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F6F3;PASSENGER SHIP;So;0;ON;;;;;N;;;;; +1F6F4;SCOOTER;So;0;ON;;;;;N;;;;; +1F6F5;MOTOR SCOOTER;So;0;ON;;;;;N;;;;; +1F6F6;CANOE;So;0;ON;;;;;N;;;;; +1F6F7;SLED;So;0;ON;;;;;N;;;;; +1F6F8;FLYING SAUCER;So;0;ON;;;;;N;;;;; +1F6F9;SKATEBOARD;So;0;ON;;;;;N;;;;; +1F6FA;AUTO RICKSHAW;So;0;ON;;;;;N;;;;; +1F6FB;PICKUP TRUCK;So;0;ON;;;;;N;;;;; +1F6FC;ROLLER SKATE;So;0;ON;;;;;N;;;;; +1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;; +1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;; +1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;; +1F703;ALCHEMICAL SYMBOL FOR EARTH;So;0;ON;;;;;N;;;;; +1F704;ALCHEMICAL SYMBOL FOR WATER;So;0;ON;;;;;N;;;;; +1F705;ALCHEMICAL SYMBOL FOR AQUAFORTIS;So;0;ON;;;;;N;;;;; +1F706;ALCHEMICAL SYMBOL FOR AQUA REGIA;So;0;ON;;;;;N;;;;; +1F707;ALCHEMICAL SYMBOL FOR AQUA REGIA-2;So;0;ON;;;;;N;;;;; +1F708;ALCHEMICAL SYMBOL FOR AQUA VITAE;So;0;ON;;;;;N;;;;; +1F709;ALCHEMICAL SYMBOL FOR AQUA VITAE-2;So;0;ON;;;;;N;;;;; +1F70A;ALCHEMICAL SYMBOL FOR VINEGAR;So;0;ON;;;;;N;;;;; +1F70B;ALCHEMICAL SYMBOL FOR VINEGAR-2;So;0;ON;;;;;N;;;;; +1F70C;ALCHEMICAL SYMBOL FOR VINEGAR-3;So;0;ON;;;;;N;;;;; +1F70D;ALCHEMICAL SYMBOL FOR SULFUR;So;0;ON;;;;;N;;;;; +1F70E;ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR;So;0;ON;;;;;N;;;;; +1F70F;ALCHEMICAL SYMBOL FOR BLACK SULFUR;So;0;ON;;;;;N;;;;; +1F710;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE;So;0;ON;;;;;N;;;;; +1F711;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2;So;0;ON;;;;;N;;;;; +1F712;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3;So;0;ON;;;;;N;;;;; +1F713;ALCHEMICAL SYMBOL FOR CINNABAR;So;0;ON;;;;;N;;;;; +1F714;ALCHEMICAL SYMBOL FOR SALT;So;0;ON;;;;;N;;;;; +1F715;ALCHEMICAL SYMBOL FOR NITRE;So;0;ON;;;;;N;;;;; +1F716;ALCHEMICAL SYMBOL FOR VITRIOL;So;0;ON;;;;;N;;;;; +1F717;ALCHEMICAL SYMBOL FOR VITRIOL-2;So;0;ON;;;;;N;;;;; +1F718;ALCHEMICAL SYMBOL FOR ROCK SALT;So;0;ON;;;;;N;;;;; +1F719;ALCHEMICAL SYMBOL FOR ROCK SALT-2;So;0;ON;;;;;N;;;;; +1F71A;ALCHEMICAL SYMBOL FOR GOLD;So;0;ON;;;;;N;;;;; +1F71B;ALCHEMICAL SYMBOL FOR SILVER;So;0;ON;;;;;N;;;;; +1F71C;ALCHEMICAL SYMBOL FOR IRON ORE;So;0;ON;;;;;N;;;;; +1F71D;ALCHEMICAL SYMBOL FOR IRON ORE-2;So;0;ON;;;;;N;;;;; +1F71E;ALCHEMICAL SYMBOL FOR CROCUS OF IRON;So;0;ON;;;;;N;;;;; +1F71F;ALCHEMICAL SYMBOL FOR REGULUS OF IRON;So;0;ON;;;;;N;;;;; +1F720;ALCHEMICAL SYMBOL FOR COPPER ORE;So;0;ON;;;;;N;;;;; +1F721;ALCHEMICAL SYMBOL FOR IRON-COPPER ORE;So;0;ON;;;;;N;;;;; +1F722;ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER;So;0;ON;;;;;N;;;;; +1F723;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER;So;0;ON;;;;;N;;;;; +1F724;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2;So;0;ON;;;;;N;;;;; +1F725;ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F726;ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F727;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER;So;0;ON;;;;;N;;;;; +1F728;ALCHEMICAL SYMBOL FOR VERDIGRIS;So;0;ON;;;;;N;;;;; +1F729;ALCHEMICAL SYMBOL FOR TIN ORE;So;0;ON;;;;;N;;;;; +1F72A;ALCHEMICAL SYMBOL FOR LEAD ORE;So;0;ON;;;;;N;;;;; +1F72B;ALCHEMICAL SYMBOL FOR ANTIMONY ORE;So;0;ON;;;;;N;;;;; +1F72C;ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72D;ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72E;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72F;ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F730;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F731;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2;So;0;ON;;;;;N;;;;; +1F732;ALCHEMICAL SYMBOL FOR REGULUS;So;0;ON;;;;;N;;;;; +1F733;ALCHEMICAL SYMBOL FOR REGULUS-2;So;0;ON;;;;;N;;;;; +1F734;ALCHEMICAL SYMBOL FOR REGULUS-3;So;0;ON;;;;;N;;;;; +1F735;ALCHEMICAL SYMBOL FOR REGULUS-4;So;0;ON;;;;;N;;;;; +1F736;ALCHEMICAL SYMBOL FOR ALKALI;So;0;ON;;;;;N;;;;; +1F737;ALCHEMICAL SYMBOL FOR ALKALI-2;So;0;ON;;;;;N;;;;; +1F738;ALCHEMICAL SYMBOL FOR MARCASITE;So;0;ON;;;;;N;;;;; +1F739;ALCHEMICAL SYMBOL FOR SAL-AMMONIAC;So;0;ON;;;;;N;;;;; +1F73A;ALCHEMICAL SYMBOL FOR ARSENIC;So;0;ON;;;;;N;;;;; +1F73B;ALCHEMICAL SYMBOL FOR REALGAR;So;0;ON;;;;;N;;;;; +1F73C;ALCHEMICAL SYMBOL FOR REALGAR-2;So;0;ON;;;;;N;;;;; +1F73D;ALCHEMICAL SYMBOL FOR AURIPIGMENT;So;0;ON;;;;;N;;;;; +1F73E;ALCHEMICAL SYMBOL FOR BISMUTH ORE;So;0;ON;;;;;N;;;;; +1F73F;ALCHEMICAL SYMBOL FOR TARTAR;So;0;ON;;;;;N;;;;; +1F740;ALCHEMICAL SYMBOL FOR TARTAR-2;So;0;ON;;;;;N;;;;; +1F741;ALCHEMICAL SYMBOL FOR QUICK LIME;So;0;ON;;;;;N;;;;; +1F742;ALCHEMICAL SYMBOL FOR BORAX;So;0;ON;;;;;N;;;;; +1F743;ALCHEMICAL SYMBOL FOR BORAX-2;So;0;ON;;;;;N;;;;; +1F744;ALCHEMICAL SYMBOL FOR BORAX-3;So;0;ON;;;;;N;;;;; +1F745;ALCHEMICAL SYMBOL FOR ALUM;So;0;ON;;;;;N;;;;; +1F746;ALCHEMICAL SYMBOL FOR OIL;So;0;ON;;;;;N;;;;; +1F747;ALCHEMICAL SYMBOL FOR SPIRIT;So;0;ON;;;;;N;;;;; +1F748;ALCHEMICAL SYMBOL FOR TINCTURE;So;0;ON;;;;;N;;;;; +1F749;ALCHEMICAL SYMBOL FOR GUM;So;0;ON;;;;;N;;;;; +1F74A;ALCHEMICAL SYMBOL FOR WAX;So;0;ON;;;;;N;;;;; +1F74B;ALCHEMICAL SYMBOL FOR POWDER;So;0;ON;;;;;N;;;;; +1F74C;ALCHEMICAL SYMBOL FOR CALX;So;0;ON;;;;;N;;;;; +1F74D;ALCHEMICAL SYMBOL FOR TUTTY;So;0;ON;;;;;N;;;;; +1F74E;ALCHEMICAL SYMBOL FOR CAPUT MORTUUM;So;0;ON;;;;;N;;;;; +1F74F;ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE;So;0;ON;;;;;N;;;;; +1F750;ALCHEMICAL SYMBOL FOR CADUCEUS;So;0;ON;;;;;N;;;;; +1F751;ALCHEMICAL SYMBOL FOR TRIDENT;So;0;ON;;;;;N;;;;; +1F752;ALCHEMICAL SYMBOL FOR STARRED TRIDENT;So;0;ON;;;;;N;;;;; +1F753;ALCHEMICAL SYMBOL FOR LODESTONE;So;0;ON;;;;;N;;;;; +1F754;ALCHEMICAL SYMBOL FOR SOAP;So;0;ON;;;;;N;;;;; +1F755;ALCHEMICAL SYMBOL FOR URINE;So;0;ON;;;;;N;;;;; +1F756;ALCHEMICAL SYMBOL FOR HORSE DUNG;So;0;ON;;;;;N;;;;; +1F757;ALCHEMICAL SYMBOL FOR ASHES;So;0;ON;;;;;N;;;;; +1F758;ALCHEMICAL SYMBOL FOR POT ASHES;So;0;ON;;;;;N;;;;; +1F759;ALCHEMICAL SYMBOL FOR BRICK;So;0;ON;;;;;N;;;;; +1F75A;ALCHEMICAL SYMBOL FOR POWDERED BRICK;So;0;ON;;;;;N;;;;; +1F75B;ALCHEMICAL SYMBOL FOR AMALGAM;So;0;ON;;;;;N;;;;; +1F75C;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM;So;0;ON;;;;;N;;;;; +1F75D;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2;So;0;ON;;;;;N;;;;; +1F75E;ALCHEMICAL SYMBOL FOR SUBLIMATION;So;0;ON;;;;;N;;;;; +1F75F;ALCHEMICAL SYMBOL FOR PRECIPITATE;So;0;ON;;;;;N;;;;; +1F760;ALCHEMICAL SYMBOL FOR DISTILL;So;0;ON;;;;;N;;;;; +1F761;ALCHEMICAL SYMBOL FOR DISSOLVE;So;0;ON;;;;;N;;;;; +1F762;ALCHEMICAL SYMBOL FOR DISSOLVE-2;So;0;ON;;;;;N;;;;; +1F763;ALCHEMICAL SYMBOL FOR PURIFY;So;0;ON;;;;;N;;;;; +1F764;ALCHEMICAL SYMBOL FOR PUTREFACTION;So;0;ON;;;;;N;;;;; +1F765;ALCHEMICAL SYMBOL FOR CRUCIBLE;So;0;ON;;;;;N;;;;; +1F766;ALCHEMICAL SYMBOL FOR CRUCIBLE-2;So;0;ON;;;;;N;;;;; +1F767;ALCHEMICAL SYMBOL FOR CRUCIBLE-3;So;0;ON;;;;;N;;;;; +1F768;ALCHEMICAL SYMBOL FOR CRUCIBLE-4;So;0;ON;;;;;N;;;;; +1F769;ALCHEMICAL SYMBOL FOR CRUCIBLE-5;So;0;ON;;;;;N;;;;; +1F76A;ALCHEMICAL SYMBOL FOR ALEMBIC;So;0;ON;;;;;N;;;;; +1F76B;ALCHEMICAL SYMBOL FOR BATH OF MARY;So;0;ON;;;;;N;;;;; +1F76C;ALCHEMICAL SYMBOL FOR BATH OF VAPOURS;So;0;ON;;;;;N;;;;; +1F76D;ALCHEMICAL SYMBOL FOR RETORT;So;0;ON;;;;;N;;;;; +1F76E;ALCHEMICAL SYMBOL FOR HOUR;So;0;ON;;;;;N;;;;; +1F76F;ALCHEMICAL SYMBOL FOR NIGHT;So;0;ON;;;;;N;;;;; +1F770;ALCHEMICAL SYMBOL FOR DAY-NIGHT;So;0;ON;;;;;N;;;;; +1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;; +1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;; +1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;; +1F774;LOT OF FORTUNE;So;0;ON;;;;;N;;;;; +1F775;OCCULTATION;So;0;ON;;;;;N;;;;; +1F776;LUNAR ECLIPSE;So;0;ON;;;;;N;;;;; +1F777;VESTA FORM TWO;So;0;ON;;;;;N;;;;; +1F778;ASTRAEA FORM TWO;So;0;ON;;;;;N;;;;; +1F779;HYGIEA FORM TWO;So;0;ON;;;;;N;;;;; +1F77A;PARTHENOPE FORM TWO;So;0;ON;;;;;N;;;;; +1F77B;HAUMEA;So;0;ON;;;;;N;;;;; +1F77C;MAKEMAKE;So;0;ON;;;;;N;;;;; +1F77D;GONGGONG;So;0;ON;;;;;N;;;;; +1F77E;QUAOAR;So;0;ON;;;;;N;;;;; +1F77F;ORCUS;So;0;ON;;;;;N;;;;; +1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F783;BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F784;BLACK SLIGHTLY SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F785;MEDIUM BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F786;BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F787;HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F788;VERY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F789;EXTREMELY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F78A;WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F78B;ROUND TARGET;So;0;ON;;;;;N;;;;; +1F78C;BLACK TINY SQUARE;So;0;ON;;;;;N;;;;; +1F78D;BLACK SLIGHTLY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F78E;LIGHT WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F78F;MEDIUM WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F790;BOLD WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F791;HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F792;VERY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F793;EXTREMELY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F794;WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F795;WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE;So;0;ON;;;;;N;;;;; +1F796;SQUARE TARGET;So;0;ON;;;;;N;;;;; +1F797;BLACK TINY DIAMOND;So;0;ON;;;;;N;;;;; +1F798;BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F799;BLACK MEDIUM SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79A;WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79B;WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +1F79C;DIAMOND TARGET;So;0;ON;;;;;N;;;;; +1F79D;BLACK TINY LOZENGE;So;0;ON;;;;;N;;;;; +1F79E;BLACK VERY SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F79F;BLACK MEDIUM SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A0;WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A1;THIN GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A2;LIGHT GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A3;MEDIUM GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A4;BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A5;VERY BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A6;VERY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A7;EXTREMELY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A8;THIN SALTIRE;So;0;ON;;;;;N;;;;; +1F7A9;LIGHT SALTIRE;So;0;ON;;;;;N;;;;; +1F7AA;MEDIUM SALTIRE;So;0;ON;;;;;N;;;;; +1F7AB;BOLD SALTIRE;So;0;ON;;;;;N;;;;; +1F7AC;HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AD;VERY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AE;EXTREMELY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AF;LIGHT FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B0;MEDIUM FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B1;BOLD FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B2;HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B3;VERY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B4;EXTREMELY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B5;LIGHT SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B6;MEDIUM SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B7;BOLD SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B8;HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B9;VERY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BA;EXTREMELY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BB;LIGHT EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BC;MEDIUM EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BD;BOLD EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BE;HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BF;VERY HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7C0;LIGHT THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C1;MEDIUM THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C2;THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C3;MEDIUM THREE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C4;LIGHT FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C5;MEDIUM FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C6;FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C7;MEDIUM FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C8;REVERSE LIGHT FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C9;LIGHT FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CA;HEAVY FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CB;MEDIUM SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CC;HEAVY SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CD;SIX POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7CE;MEDIUM EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CF;HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D0;VERY HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D1;HEAVY EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7D5;CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;; +1F7D6;NEGATIVE CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;; +1F7D7;CIRCLED SQUARE;So;0;ON;;;;;N;;;;; +1F7D8;NEGATIVE CIRCLED SQUARE;So;0;ON;;;;;N;;;;; +1F7D9;NINE POINTED WHITE STAR;So;0;ON;;;;;N;;;;; +1F7E0;LARGE ORANGE CIRCLE;So;0;ON;;;;;N;;;;; +1F7E1;LARGE YELLOW CIRCLE;So;0;ON;;;;;N;;;;; +1F7E2;LARGE GREEN CIRCLE;So;0;ON;;;;;N;;;;; +1F7E3;LARGE PURPLE CIRCLE;So;0;ON;;;;;N;;;;; +1F7E4;LARGE BROWN CIRCLE;So;0;ON;;;;;N;;;;; +1F7E5;LARGE RED SQUARE;So;0;ON;;;;;N;;;;; +1F7E6;LARGE BLUE SQUARE;So;0;ON;;;;;N;;;;; +1F7E7;LARGE ORANGE SQUARE;So;0;ON;;;;;N;;;;; +1F7E8;LARGE YELLOW SQUARE;So;0;ON;;;;;N;;;;; +1F7E9;LARGE GREEN SQUARE;So;0;ON;;;;;N;;;;; +1F7EA;LARGE PURPLE SQUARE;So;0;ON;;;;;N;;;;; +1F7EB;LARGE BROWN SQUARE;So;0;ON;;;;;N;;;;; +1F7F0;HEAVY EQUALS SIGN;So;0;ON;;;;;N;;;;; +1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F803;DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F804;LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F805;UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F806;RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F807;DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F808;LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F809;UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80A;RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80B;DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F810;LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F811;UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F812;RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F813;DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F814;LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F815;UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F816;RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F817;DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F818;HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F819;HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81A;HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81B;HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81C;HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81D;HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81E;HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81F;HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F820;LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F821;UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F822;RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F823;DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F824;LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F825;UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F826;RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F827;DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F828;LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F829;UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82A;RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82B;DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82C;LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82D;UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82E;RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82F;DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F830;LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F831;UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F832;RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F833;DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F834;LEFTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F835;UPWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F836;RIGHTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F837;DOWNWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F838;LEFTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F839;UPWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83A;RIGHTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83B;DOWNWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83C;LEFTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83D;UPWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83E;RIGHTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83F;DOWNWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F840;LEFTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F841;UPWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F842;RIGHTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F843;DOWNWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F844;LEFTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F845;UPWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F846;RIGHTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F847;DOWNWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F850;LEFTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F851;UPWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F852;RIGHTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F853;DOWNWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F854;NORTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F855;NORTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F856;SOUTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F857;SOUTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F858;LEFT RIGHT SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F859;UP DOWN SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F860;WIDE-HEADED LEFTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F861;WIDE-HEADED UPWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F862;WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F863;WIDE-HEADED DOWNWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F864;WIDE-HEADED NORTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F865;WIDE-HEADED NORTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F866;WIDE-HEADED SOUTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F867;WIDE-HEADED SOUTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F868;WIDE-HEADED LEFTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F869;WIDE-HEADED UPWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86A;WIDE-HEADED RIGHTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86B;WIDE-HEADED DOWNWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86C;WIDE-HEADED NORTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86D;WIDE-HEADED NORTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86E;WIDE-HEADED SOUTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86F;WIDE-HEADED SOUTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F870;WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F871;WIDE-HEADED UPWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F872;WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F873;WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F874;WIDE-HEADED NORTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F875;WIDE-HEADED NORTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F876;WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F877;WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F878;WIDE-HEADED LEFTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F879;WIDE-HEADED UPWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87A;WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87B;WIDE-HEADED DOWNWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87C;WIDE-HEADED NORTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87D;WIDE-HEADED NORTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87E;WIDE-HEADED SOUTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87F;WIDE-HEADED SOUTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F880;WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F881;WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F882;WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F883;WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F884;WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F885;WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F886;WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F887;WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F890;LEFTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F891;UPWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F892;RIGHTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F893;DOWNWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F894;LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F895;UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F896;RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F897;DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F898;LEFTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F899;UPWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89A;RIGHTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89B;DOWNWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89C;HEAVY ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F89D;HEAVY ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F89E;HEAVY ARROW SHAFT WIDTH ONE HALF;So;0;ON;;;;;N;;;;; +1F89F;HEAVY ARROW SHAFT WIDTH ONE THIRD;So;0;ON;;;;;N;;;;; +1F8A0;LEFTWARDS BOTTOM-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A1;RIGHTWARDS BOTTOM SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A2;LEFTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A3;RIGHTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A4;LEFTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A5;RIGHTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A6;LEFTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A7;RIGHTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A8;LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A9;RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AA;LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F8B0;ARROW POINTING UPWARDS THEN NORTH WEST;So;0;ON;;;;;N;;;;; +1F8B1;ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST;So;0;ON;;;;;N;;;;; +1F8B2;RIGHTWARDS ARROW WITH LOWER HOOK;So;0;ON;;;;;N;;;;; +1F8B3;DOWNWARDS BLACK ARROW TO BAR;So;0;ON;;;;;N;;;;; +1F8B4;NEGATIVE SQUARED LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8B5;NEGATIVE SQUARED UPWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8B6;NEGATIVE SQUARED RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8B7;NEGATIVE SQUARED DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8B8;NORTH WEST ARROW FROM BAR;So;0;ON;;;;;N;;;;; +1F8B9;NORTH EAST ARROW FROM BAR;So;0;ON;;;;;N;;;;; +1F8BA;SOUTH EAST ARROW FROM BAR;So;0;ON;;;;;N;;;;; +1F8BB;SOUTH WEST ARROW FROM BAR;So;0;ON;;;;;N;;;;; +1F8C0;LEFTWARDS ARROW FROM DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8C1;RIGHTWARDS ARROW FROM DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8D0;LONG RIGHTWARDS ARROW OVER LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +1F8D1;LONG RIGHTWARDS HARPOON OVER LONG LEFTWARDS HARPOON;Sm;0;ON;;;;;N;;;;; +1F8D2;LONG RIGHTWARDS HARPOON ABOVE SHORT LEFTWARDS HARPOON;Sm;0;ON;;;;;N;;;;; +1F8D3;SHORT RIGHTWARDS HARPOON ABOVE LONG LEFTWARDS HARPOON;Sm;0;ON;;;;;N;;;;; +1F8D4;LONG LEFTWARDS HARPOON ABOVE SHORT RIGHTWARDS HARPOON;Sm;0;ON;;;;;N;;;;; +1F8D5;SHORT LEFTWARDS HARPOON ABOVE LONG RIGHTWARDS HARPOON;Sm;0;ON;;;;;N;;;;; +1F8D6;LONG RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +1F8D7;LONG RIGHTWARDS ARROW WITH DOUBLE SLASH;Sm;0;ON;;;;;N;;;;; +1F8D8;LONG LEFT RIGHT ARROW WITH DEPENDENT LOBE;Sm;0;ON;;;;;N;;;;; +1F900;CIRCLED CROSS FORMEE WITH FOUR DOTS;So;0;ON;;;;;N;;;;; +1F901;CIRCLED CROSS FORMEE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +1F902;CIRCLED CROSS FORMEE;So;0;ON;;;;;N;;;;; +1F903;LEFT HALF CIRCLE WITH FOUR DOTS;So;0;ON;;;;;N;;;;; +1F904;LEFT HALF CIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F905;LEFT HALF CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +1F906;LEFT HALF CIRCLE WITH DOT;So;0;ON;;;;;N;;;;; +1F907;LEFT HALF CIRCLE;So;0;ON;;;;;N;;;;; +1F908;DOWNWARD FACING HOOK;So;0;ON;;;;;N;;;;; +1F909;DOWNWARD FACING NOTCHED HOOK;So;0;ON;;;;;N;;;;; +1F90A;DOWNWARD FACING HOOK WITH DOT;So;0;ON;;;;;N;;;;; +1F90B;DOWNWARD FACING NOTCHED HOOK WITH DOT;So;0;ON;;;;;N;;;;; +1F90C;PINCHED FINGERS;So;0;ON;;;;;N;;;;; +1F90D;WHITE HEART;So;0;ON;;;;;N;;;;; +1F90E;BROWN HEART;So;0;ON;;;;;N;;;;; +1F90F;PINCHING HAND;So;0;ON;;;;;N;;;;; +1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;; +1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;; +1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;; +1F913;NERD FACE;So;0;ON;;;;;N;;;;; +1F914;THINKING FACE;So;0;ON;;;;;N;;;;; +1F915;FACE WITH HEAD-BANDAGE;So;0;ON;;;;;N;;;;; +1F916;ROBOT FACE;So;0;ON;;;;;N;;;;; +1F917;HUGGING FACE;So;0;ON;;;;;N;;;;; +1F918;SIGN OF THE HORNS;So;0;ON;;;;;N;;;;; +1F919;CALL ME HAND;So;0;ON;;;;;N;;;;; +1F91A;RAISED BACK OF HAND;So;0;ON;;;;;N;;;;; +1F91B;LEFT-FACING FIST;So;0;ON;;;;;N;;;;; +1F91C;RIGHT-FACING FIST;So;0;ON;;;;;N;;;;; +1F91D;HANDSHAKE;So;0;ON;;;;;N;;;;; +1F91E;HAND WITH INDEX AND MIDDLE FINGERS CROSSED;So;0;ON;;;;;N;;;;; +1F91F;I LOVE YOU HAND SIGN;So;0;ON;;;;;N;;;;; +1F920;FACE WITH COWBOY HAT;So;0;ON;;;;;N;;;;; +1F921;CLOWN FACE;So;0;ON;;;;;N;;;;; +1F922;NAUSEATED FACE;So;0;ON;;;;;N;;;;; +1F923;ROLLING ON THE FLOOR LAUGHING;So;0;ON;;;;;N;;;;; +1F924;DROOLING FACE;So;0;ON;;;;;N;;;;; +1F925;LYING FACE;So;0;ON;;;;;N;;;;; +1F926;FACE PALM;So;0;ON;;;;;N;;;;; +1F927;SNEEZING FACE;So;0;ON;;;;;N;;;;; +1F928;FACE WITH ONE EYEBROW RAISED;So;0;ON;;;;;N;;;;; +1F929;GRINNING FACE WITH STAR EYES;So;0;ON;;;;;N;;;;; +1F92A;GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE;So;0;ON;;;;;N;;;;; +1F92B;FACE WITH FINGER COVERING CLOSED LIPS;So;0;ON;;;;;N;;;;; +1F92C;SERIOUS FACE WITH SYMBOLS COVERING MOUTH;So;0;ON;;;;;N;;;;; +1F92D;SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH;So;0;ON;;;;;N;;;;; +1F92E;FACE WITH OPEN MOUTH VOMITING;So;0;ON;;;;;N;;;;; +1F92F;SHOCKED FACE WITH EXPLODING HEAD;So;0;ON;;;;;N;;;;; +1F930;PREGNANT WOMAN;So;0;ON;;;;;N;;;;; +1F931;BREAST-FEEDING;So;0;ON;;;;;N;;;;; +1F932;PALMS UP TOGETHER;So;0;ON;;;;;N;;;;; +1F933;SELFIE;So;0;ON;;;;;N;;;;; +1F934;PRINCE;So;0;ON;;;;;N;;;;; +1F935;MAN IN TUXEDO;So;0;ON;;;;;N;;;;; +1F936;MOTHER CHRISTMAS;So;0;ON;;;;;N;;;;; +1F937;SHRUG;So;0;ON;;;;;N;;;;; +1F938;PERSON DOING CARTWHEEL;So;0;ON;;;;;N;;;;; +1F939;JUGGLING;So;0;ON;;;;;N;;;;; +1F93A;FENCER;So;0;ON;;;;;N;;;;; +1F93B;MODERN PENTATHLON;So;0;ON;;;;;N;;;;; +1F93C;WRESTLERS;So;0;ON;;;;;N;;;;; +1F93D;WATER POLO;So;0;ON;;;;;N;;;;; +1F93E;HANDBALL;So;0;ON;;;;;N;;;;; +1F93F;DIVING MASK;So;0;ON;;;;;N;;;;; +1F940;WILTED FLOWER;So;0;ON;;;;;N;;;;; +1F941;DRUM WITH DRUMSTICKS;So;0;ON;;;;;N;;;;; +1F942;CLINKING GLASSES;So;0;ON;;;;;N;;;;; +1F943;TUMBLER GLASS;So;0;ON;;;;;N;;;;; +1F944;SPOON;So;0;ON;;;;;N;;;;; +1F945;GOAL NET;So;0;ON;;;;;N;;;;; +1F946;RIFLE;So;0;ON;;;;;N;;;;; +1F947;FIRST PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F948;SECOND PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F949;THIRD PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F94A;BOXING GLOVE;So;0;ON;;;;;N;;;;; +1F94B;MARTIAL ARTS UNIFORM;So;0;ON;;;;;N;;;;; +1F94C;CURLING STONE;So;0;ON;;;;;N;;;;; +1F94D;LACROSSE STICK AND BALL;So;0;ON;;;;;N;;;;; +1F94E;SOFTBALL;So;0;ON;;;;;N;;;;; +1F94F;FLYING DISC;So;0;ON;;;;;N;;;;; +1F950;CROISSANT;So;0;ON;;;;;N;;;;; +1F951;AVOCADO;So;0;ON;;;;;N;;;;; +1F952;CUCUMBER;So;0;ON;;;;;N;;;;; +1F953;BACON;So;0;ON;;;;;N;;;;; +1F954;POTATO;So;0;ON;;;;;N;;;;; +1F955;CARROT;So;0;ON;;;;;N;;;;; +1F956;BAGUETTE BREAD;So;0;ON;;;;;N;;;;; +1F957;GREEN SALAD;So;0;ON;;;;;N;;;;; +1F958;SHALLOW PAN OF FOOD;So;0;ON;;;;;N;;;;; +1F959;STUFFED FLATBREAD;So;0;ON;;;;;N;;;;; +1F95A;EGG;So;0;ON;;;;;N;;;;; +1F95B;GLASS OF MILK;So;0;ON;;;;;N;;;;; +1F95C;PEANUTS;So;0;ON;;;;;N;;;;; +1F95D;KIWIFRUIT;So;0;ON;;;;;N;;;;; +1F95E;PANCAKES;So;0;ON;;;;;N;;;;; +1F95F;DUMPLING;So;0;ON;;;;;N;;;;; +1F960;FORTUNE COOKIE;So;0;ON;;;;;N;;;;; +1F961;TAKEOUT BOX;So;0;ON;;;;;N;;;;; +1F962;CHOPSTICKS;So;0;ON;;;;;N;;;;; +1F963;BOWL WITH SPOON;So;0;ON;;;;;N;;;;; +1F964;CUP WITH STRAW;So;0;ON;;;;;N;;;;; +1F965;COCONUT;So;0;ON;;;;;N;;;;; +1F966;BROCCOLI;So;0;ON;;;;;N;;;;; +1F967;PIE;So;0;ON;;;;;N;;;;; +1F968;PRETZEL;So;0;ON;;;;;N;;;;; +1F969;CUT OF MEAT;So;0;ON;;;;;N;;;;; +1F96A;SANDWICH;So;0;ON;;;;;N;;;;; +1F96B;CANNED FOOD;So;0;ON;;;;;N;;;;; +1F96C;LEAFY GREEN;So;0;ON;;;;;N;;;;; +1F96D;MANGO;So;0;ON;;;;;N;;;;; +1F96E;MOON CAKE;So;0;ON;;;;;N;;;;; +1F96F;BAGEL;So;0;ON;;;;;N;;;;; +1F970;SMILING FACE WITH SMILING EYES AND THREE HEARTS;So;0;ON;;;;;N;;;;; +1F971;YAWNING FACE;So;0;ON;;;;;N;;;;; +1F972;SMILING FACE WITH TEAR;So;0;ON;;;;;N;;;;; +1F973;FACE WITH PARTY HORN AND PARTY HAT;So;0;ON;;;;;N;;;;; +1F974;FACE WITH UNEVEN EYES AND WAVY MOUTH;So;0;ON;;;;;N;;;;; +1F975;OVERHEATED FACE;So;0;ON;;;;;N;;;;; +1F976;FREEZING FACE;So;0;ON;;;;;N;;;;; +1F977;NINJA;So;0;ON;;;;;N;;;;; +1F978;DISGUISED FACE;So;0;ON;;;;;N;;;;; +1F979;FACE HOLDING BACK TEARS;So;0;ON;;;;;N;;;;; +1F97A;FACE WITH PLEADING EYES;So;0;ON;;;;;N;;;;; +1F97B;SARI;So;0;ON;;;;;N;;;;; +1F97C;LAB COAT;So;0;ON;;;;;N;;;;; +1F97D;GOGGLES;So;0;ON;;;;;N;;;;; +1F97E;HIKING BOOT;So;0;ON;;;;;N;;;;; +1F97F;FLAT SHOE;So;0;ON;;;;;N;;;;; +1F980;CRAB;So;0;ON;;;;;N;;;;; +1F981;LION FACE;So;0;ON;;;;;N;;;;; +1F982;SCORPION;So;0;ON;;;;;N;;;;; +1F983;TURKEY;So;0;ON;;;;;N;;;;; +1F984;UNICORN FACE;So;0;ON;;;;;N;;;;; +1F985;EAGLE;So;0;ON;;;;;N;;;;; +1F986;DUCK;So;0;ON;;;;;N;;;;; +1F987;BAT;So;0;ON;;;;;N;;;;; +1F988;SHARK;So;0;ON;;;;;N;;;;; +1F989;OWL;So;0;ON;;;;;N;;;;; +1F98A;FOX FACE;So;0;ON;;;;;N;;;;; +1F98B;BUTTERFLY;So;0;ON;;;;;N;;;;; +1F98C;DEER;So;0;ON;;;;;N;;;;; +1F98D;GORILLA;So;0;ON;;;;;N;;;;; +1F98E;LIZARD;So;0;ON;;;;;N;;;;; +1F98F;RHINOCEROS;So;0;ON;;;;;N;;;;; +1F990;SHRIMP;So;0;ON;;;;;N;;;;; +1F991;SQUID;So;0;ON;;;;;N;;;;; +1F992;GIRAFFE FACE;So;0;ON;;;;;N;;;;; +1F993;ZEBRA FACE;So;0;ON;;;;;N;;;;; +1F994;HEDGEHOG;So;0;ON;;;;;N;;;;; +1F995;SAUROPOD;So;0;ON;;;;;N;;;;; +1F996;T-REX;So;0;ON;;;;;N;;;;; +1F997;CRICKET;So;0;ON;;;;;N;;;;; +1F998;KANGAROO;So;0;ON;;;;;N;;;;; +1F999;LLAMA;So;0;ON;;;;;N;;;;; +1F99A;PEACOCK;So;0;ON;;;;;N;;;;; +1F99B;HIPPOPOTAMUS;So;0;ON;;;;;N;;;;; +1F99C;PARROT;So;0;ON;;;;;N;;;;; +1F99D;RACCOON;So;0;ON;;;;;N;;;;; +1F99E;LOBSTER;So;0;ON;;;;;N;;;;; +1F99F;MOSQUITO;So;0;ON;;;;;N;;;;; +1F9A0;MICROBE;So;0;ON;;;;;N;;;;; +1F9A1;BADGER;So;0;ON;;;;;N;;;;; +1F9A2;SWAN;So;0;ON;;;;;N;;;;; +1F9A3;MAMMOTH;So;0;ON;;;;;N;;;;; +1F9A4;DODO;So;0;ON;;;;;N;;;;; +1F9A5;SLOTH;So;0;ON;;;;;N;;;;; +1F9A6;OTTER;So;0;ON;;;;;N;;;;; +1F9A7;ORANGUTAN;So;0;ON;;;;;N;;;;; +1F9A8;SKUNK;So;0;ON;;;;;N;;;;; +1F9A9;FLAMINGO;So;0;ON;;;;;N;;;;; +1F9AA;OYSTER;So;0;ON;;;;;N;;;;; +1F9AB;BEAVER;So;0;ON;;;;;N;;;;; +1F9AC;BISON;So;0;ON;;;;;N;;;;; +1F9AD;SEAL;So;0;ON;;;;;N;;;;; +1F9AE;GUIDE DOG;So;0;ON;;;;;N;;;;; +1F9AF;PROBING CANE;So;0;ON;;;;;N;;;;; +1F9B0;EMOJI COMPONENT RED HAIR;So;0;ON;;;;;N;;;;; +1F9B1;EMOJI COMPONENT CURLY HAIR;So;0;ON;;;;;N;;;;; +1F9B2;EMOJI COMPONENT BALD;So;0;ON;;;;;N;;;;; +1F9B3;EMOJI COMPONENT WHITE HAIR;So;0;ON;;;;;N;;;;; +1F9B4;BONE;So;0;ON;;;;;N;;;;; +1F9B5;LEG;So;0;ON;;;;;N;;;;; +1F9B6;FOOT;So;0;ON;;;;;N;;;;; +1F9B7;TOOTH;So;0;ON;;;;;N;;;;; +1F9B8;SUPERHERO;So;0;ON;;;;;N;;;;; +1F9B9;SUPERVILLAIN;So;0;ON;;;;;N;;;;; +1F9BA;SAFETY VEST;So;0;ON;;;;;N;;;;; +1F9BB;EAR WITH HEARING AID;So;0;ON;;;;;N;;;;; +1F9BC;MOTORIZED WHEELCHAIR;So;0;ON;;;;;N;;;;; +1F9BD;MANUAL WHEELCHAIR;So;0;ON;;;;;N;;;;; +1F9BE;MECHANICAL ARM;So;0;ON;;;;;N;;;;; +1F9BF;MECHANICAL LEG;So;0;ON;;;;;N;;;;; +1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; +1F9C1;CUPCAKE;So;0;ON;;;;;N;;;;; +1F9C2;SALT SHAKER;So;0;ON;;;;;N;;;;; +1F9C3;BEVERAGE BOX;So;0;ON;;;;;N;;;;; +1F9C4;GARLIC;So;0;ON;;;;;N;;;;; +1F9C5;ONION;So;0;ON;;;;;N;;;;; +1F9C6;FALAFEL;So;0;ON;;;;;N;;;;; +1F9C7;WAFFLE;So;0;ON;;;;;N;;;;; +1F9C8;BUTTER;So;0;ON;;;;;N;;;;; +1F9C9;MATE DRINK;So;0;ON;;;;;N;;;;; +1F9CA;ICE CUBE;So;0;ON;;;;;N;;;;; +1F9CB;BUBBLE TEA;So;0;ON;;;;;N;;;;; +1F9CC;TROLL;So;0;ON;;;;;N;;;;; +1F9CD;STANDING PERSON;So;0;ON;;;;;N;;;;; +1F9CE;KNEELING PERSON;So;0;ON;;;;;N;;;;; +1F9CF;DEAF PERSON;So;0;ON;;;;;N;;;;; +1F9D0;FACE WITH MONOCLE;So;0;ON;;;;;N;;;;; +1F9D1;ADULT;So;0;ON;;;;;N;;;;; +1F9D2;CHILD;So;0;ON;;;;;N;;;;; +1F9D3;OLDER ADULT;So;0;ON;;;;;N;;;;; +1F9D4;BEARDED PERSON;So;0;ON;;;;;N;;;;; +1F9D5;PERSON WITH HEADSCARF;So;0;ON;;;;;N;;;;; +1F9D6;PERSON IN STEAMY ROOM;So;0;ON;;;;;N;;;;; +1F9D7;PERSON CLIMBING;So;0;ON;;;;;N;;;;; +1F9D8;PERSON IN LOTUS POSITION;So;0;ON;;;;;N;;;;; +1F9D9;MAGE;So;0;ON;;;;;N;;;;; +1F9DA;FAIRY;So;0;ON;;;;;N;;;;; +1F9DB;VAMPIRE;So;0;ON;;;;;N;;;;; +1F9DC;MERPERSON;So;0;ON;;;;;N;;;;; +1F9DD;ELF;So;0;ON;;;;;N;;;;; +1F9DE;GENIE;So;0;ON;;;;;N;;;;; +1F9DF;ZOMBIE;So;0;ON;;;;;N;;;;; +1F9E0;BRAIN;So;0;ON;;;;;N;;;;; +1F9E1;ORANGE HEART;So;0;ON;;;;;N;;;;; +1F9E2;BILLED CAP;So;0;ON;;;;;N;;;;; +1F9E3;SCARF;So;0;ON;;;;;N;;;;; +1F9E4;GLOVES;So;0;ON;;;;;N;;;;; +1F9E5;COAT;So;0;ON;;;;;N;;;;; +1F9E6;SOCKS;So;0;ON;;;;;N;;;;; +1F9E7;RED GIFT ENVELOPE;So;0;ON;;;;;N;;;;; +1F9E8;FIRECRACKER;So;0;ON;;;;;N;;;;; +1F9E9;JIGSAW PUZZLE PIECE;So;0;ON;;;;;N;;;;; +1F9EA;TEST TUBE;So;0;ON;;;;;N;;;;; +1F9EB;PETRI DISH;So;0;ON;;;;;N;;;;; +1F9EC;DNA DOUBLE HELIX;So;0;ON;;;;;N;;;;; +1F9ED;COMPASS;So;0;ON;;;;;N;;;;; +1F9EE;ABACUS;So;0;ON;;;;;N;;;;; +1F9EF;FIRE EXTINGUISHER;So;0;ON;;;;;N;;;;; +1F9F0;TOOLBOX;So;0;ON;;;;;N;;;;; +1F9F1;BRICK;So;0;ON;;;;;N;;;;; +1F9F2;MAGNET;So;0;ON;;;;;N;;;;; +1F9F3;LUGGAGE;So;0;ON;;;;;N;;;;; +1F9F4;LOTION BOTTLE;So;0;ON;;;;;N;;;;; +1F9F5;SPOOL OF THREAD;So;0;ON;;;;;N;;;;; +1F9F6;BALL OF YARN;So;0;ON;;;;;N;;;;; +1F9F7;SAFETY PIN;So;0;ON;;;;;N;;;;; +1F9F8;TEDDY BEAR;So;0;ON;;;;;N;;;;; +1F9F9;BROOM;So;0;ON;;;;;N;;;;; +1F9FA;BASKET;So;0;ON;;;;;N;;;;; +1F9FB;ROLL OF PAPER;So;0;ON;;;;;N;;;;; +1F9FC;BAR OF SOAP;So;0;ON;;;;;N;;;;; +1F9FD;SPONGE;So;0;ON;;;;;N;;;;; +1F9FE;RECEIPT;So;0;ON;;;;;N;;;;; +1F9FF;NAZAR AMULET;So;0;ON;;;;;N;;;;; +1FA00;NEUTRAL CHESS KING;So;0;ON;;;;;N;;;;; +1FA01;NEUTRAL CHESS QUEEN;So;0;ON;;;;;N;;;;; +1FA02;NEUTRAL CHESS ROOK;So;0;ON;;;;;N;;;;; +1FA03;NEUTRAL CHESS BISHOP;So;0;ON;;;;;N;;;;; +1FA04;NEUTRAL CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1FA05;NEUTRAL CHESS PAWN;So;0;ON;;;;;N;;;;; +1FA06;WHITE CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA07;BLACK CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA08;NEUTRAL CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA09;WHITE CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0A;WHITE CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0B;WHITE CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0C;WHITE CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0D;WHITE CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0E;WHITE CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0F;BLACK CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA10;BLACK CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA11;BLACK CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA12;BLACK CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA13;BLACK CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA14;BLACK CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA15;NEUTRAL CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA16;NEUTRAL CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA17;NEUTRAL CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA18;NEUTRAL CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA19;NEUTRAL CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA1A;NEUTRAL CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA1B;WHITE CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA1C;BLACK CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA1D;NEUTRAL CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA1E;WHITE CHESS TURNED KING;So;0;ON;;;;;N;;;;; +1FA1F;WHITE CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;; +1FA20;WHITE CHESS TURNED ROOK;So;0;ON;;;;;N;;;;; +1FA21;WHITE CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;; +1FA22;WHITE CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;; +1FA23;WHITE CHESS TURNED PAWN;So;0;ON;;;;;N;;;;; +1FA24;BLACK CHESS TURNED KING;So;0;ON;;;;;N;;;;; +1FA25;BLACK CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;; +1FA26;BLACK CHESS TURNED ROOK;So;0;ON;;;;;N;;;;; +1FA27;BLACK CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;; +1FA28;BLACK CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;; +1FA29;BLACK CHESS TURNED PAWN;So;0;ON;;;;;N;;;;; +1FA2A;NEUTRAL CHESS TURNED KING;So;0;ON;;;;;N;;;;; +1FA2B;NEUTRAL CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;; +1FA2C;NEUTRAL CHESS TURNED ROOK;So;0;ON;;;;;N;;;;; +1FA2D;NEUTRAL CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;; +1FA2E;NEUTRAL CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;; +1FA2F;NEUTRAL CHESS TURNED PAWN;So;0;ON;;;;;N;;;;; +1FA30;WHITE CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA31;BLACK CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA32;NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA33;WHITE CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA34;WHITE CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA35;WHITE CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA36;WHITE CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA37;WHITE CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA38;WHITE CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA39;BLACK CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3A;BLACK CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3B;BLACK CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3C;BLACK CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3D;BLACK CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3E;BLACK CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3F;NEUTRAL CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA40;NEUTRAL CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA41;NEUTRAL CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA42;NEUTRAL CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA43;NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA44;NEUTRAL CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA45;WHITE CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;; +1FA46;BLACK CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;; +1FA47;NEUTRAL CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;; +1FA48;WHITE CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;; +1FA49;BLACK CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;; +1FA4A;NEUTRAL CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;; +1FA4B;WHITE CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA4C;BLACK CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA4D;NEUTRAL CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA4E;WHITE CHESS KNIGHT-QUEEN;So;0;ON;;;;;N;;;;; +1FA4F;WHITE CHESS KNIGHT-ROOK;So;0;ON;;;;;N;;;;; +1FA50;WHITE CHESS KNIGHT-BISHOP;So;0;ON;;;;;N;;;;; +1FA51;BLACK CHESS KNIGHT-QUEEN;So;0;ON;;;;;N;;;;; +1FA52;BLACK CHESS KNIGHT-ROOK;So;0;ON;;;;;N;;;;; +1FA53;BLACK CHESS KNIGHT-BISHOP;So;0;ON;;;;;N;;;;; +1FA54;WHITE CHESS FERZ;So;0;ON;;;;;N;;;;; +1FA55;WHITE CHESS ALFIL;So;0;ON;;;;;N;;;;; +1FA56;BLACK CHESS FERZ;So;0;ON;;;;;N;;;;; +1FA57;BLACK CHESS ALFIL;So;0;ON;;;;;N;;;;; +1FA60;XIANGQI RED GENERAL;So;0;ON;;;;;N;;;;; +1FA61;XIANGQI RED MANDARIN;So;0;ON;;;;;N;;;;; +1FA62;XIANGQI RED ELEPHANT;So;0;ON;;;;;N;;;;; +1FA63;XIANGQI RED HORSE;So;0;ON;;;;;N;;;;; +1FA64;XIANGQI RED CHARIOT;So;0;ON;;;;;N;;;;; +1FA65;XIANGQI RED CANNON;So;0;ON;;;;;N;;;;; +1FA66;XIANGQI RED SOLDIER;So;0;ON;;;;;N;;;;; +1FA67;XIANGQI BLACK GENERAL;So;0;ON;;;;;N;;;;; +1FA68;XIANGQI BLACK MANDARIN;So;0;ON;;;;;N;;;;; +1FA69;XIANGQI BLACK ELEPHANT;So;0;ON;;;;;N;;;;; +1FA6A;XIANGQI BLACK HORSE;So;0;ON;;;;;N;;;;; +1FA6B;XIANGQI BLACK CHARIOT;So;0;ON;;;;;N;;;;; +1FA6C;XIANGQI BLACK CANNON;So;0;ON;;;;;N;;;;; +1FA6D;XIANGQI BLACK SOLDIER;So;0;ON;;;;;N;;;;; +1FA70;BALLET SHOES;So;0;ON;;;;;N;;;;; +1FA71;ONE-PIECE SWIMSUIT;So;0;ON;;;;;N;;;;; +1FA72;BRIEFS;So;0;ON;;;;;N;;;;; +1FA73;SHORTS;So;0;ON;;;;;N;;;;; +1FA74;THONG SANDAL;So;0;ON;;;;;N;;;;; +1FA75;LIGHT BLUE HEART;So;0;ON;;;;;N;;;;; +1FA76;GREY HEART;So;0;ON;;;;;N;;;;; +1FA77;PINK HEART;So;0;ON;;;;;N;;;;; +1FA78;DROP OF BLOOD;So;0;ON;;;;;N;;;;; +1FA79;ADHESIVE BANDAGE;So;0;ON;;;;;N;;;;; +1FA7A;STETHOSCOPE;So;0;ON;;;;;N;;;;; +1FA7B;X-RAY;So;0;ON;;;;;N;;;;; +1FA7C;CRUTCH;So;0;ON;;;;;N;;;;; +1FA80;YO-YO;So;0;ON;;;;;N;;;;; +1FA81;KITE;So;0;ON;;;;;N;;;;; +1FA82;PARACHUTE;So;0;ON;;;;;N;;;;; +1FA83;BOOMERANG;So;0;ON;;;;;N;;;;; +1FA84;MAGIC WAND;So;0;ON;;;;;N;;;;; +1FA85;PINATA;So;0;ON;;;;;N;;;;; +1FA86;NESTING DOLLS;So;0;ON;;;;;N;;;;; +1FA87;MARACAS;So;0;ON;;;;;N;;;;; +1FA88;FLUTE;So;0;ON;;;;;N;;;;; +1FA89;HARP;So;0;ON;;;;;N;;;;; +1FA8A;TROMBONE;So;0;ON;;;;;N;;;;; +1FA8E;TREASURE CHEST;So;0;ON;;;;;N;;;;; +1FA8F;SHOVEL;So;0;ON;;;;;N;;;;; +1FA90;RINGED PLANET;So;0;ON;;;;;N;;;;; +1FA91;CHAIR;So;0;ON;;;;;N;;;;; +1FA92;RAZOR;So;0;ON;;;;;N;;;;; +1FA93;AXE;So;0;ON;;;;;N;;;;; +1FA94;DIYA LAMP;So;0;ON;;;;;N;;;;; +1FA95;BANJO;So;0;ON;;;;;N;;;;; +1FA96;MILITARY HELMET;So;0;ON;;;;;N;;;;; +1FA97;ACCORDION;So;0;ON;;;;;N;;;;; +1FA98;LONG DRUM;So;0;ON;;;;;N;;;;; +1FA99;COIN;So;0;ON;;;;;N;;;;; +1FA9A;CARPENTRY SAW;So;0;ON;;;;;N;;;;; +1FA9B;SCREWDRIVER;So;0;ON;;;;;N;;;;; +1FA9C;LADDER;So;0;ON;;;;;N;;;;; +1FA9D;HOOK;So;0;ON;;;;;N;;;;; +1FA9E;MIRROR;So;0;ON;;;;;N;;;;; +1FA9F;WINDOW;So;0;ON;;;;;N;;;;; +1FAA0;PLUNGER;So;0;ON;;;;;N;;;;; +1FAA1;SEWING NEEDLE;So;0;ON;;;;;N;;;;; +1FAA2;KNOT;So;0;ON;;;;;N;;;;; +1FAA3;BUCKET;So;0;ON;;;;;N;;;;; +1FAA4;MOUSE TRAP;So;0;ON;;;;;N;;;;; +1FAA5;TOOTHBRUSH;So;0;ON;;;;;N;;;;; +1FAA6;HEADSTONE;So;0;ON;;;;;N;;;;; +1FAA7;PLACARD;So;0;ON;;;;;N;;;;; +1FAA8;ROCK;So;0;ON;;;;;N;;;;; +1FAA9;MIRROR BALL;So;0;ON;;;;;N;;;;; +1FAAA;IDENTIFICATION CARD;So;0;ON;;;;;N;;;;; +1FAAB;LOW BATTERY;So;0;ON;;;;;N;;;;; +1FAAC;HAMSA;So;0;ON;;;;;N;;;;; +1FAAD;FOLDING HAND FAN;So;0;ON;;;;;N;;;;; +1FAAE;HAIR PICK;So;0;ON;;;;;N;;;;; +1FAAF;KHANDA;So;0;ON;;;;;N;;;;; +1FAB0;FLY;So;0;ON;;;;;N;;;;; +1FAB1;WORM;So;0;ON;;;;;N;;;;; +1FAB2;BEETLE;So;0;ON;;;;;N;;;;; +1FAB3;COCKROACH;So;0;ON;;;;;N;;;;; +1FAB4;POTTED PLANT;So;0;ON;;;;;N;;;;; +1FAB5;WOOD;So;0;ON;;;;;N;;;;; +1FAB6;FEATHER;So;0;ON;;;;;N;;;;; +1FAB7;LOTUS;So;0;ON;;;;;N;;;;; +1FAB8;CORAL;So;0;ON;;;;;N;;;;; +1FAB9;EMPTY NEST;So;0;ON;;;;;N;;;;; +1FABA;NEST WITH EGGS;So;0;ON;;;;;N;;;;; +1FABB;HYACINTH;So;0;ON;;;;;N;;;;; +1FABC;JELLYFISH;So;0;ON;;;;;N;;;;; +1FABD;WING;So;0;ON;;;;;N;;;;; +1FABE;LEAFLESS TREE;So;0;ON;;;;;N;;;;; +1FABF;GOOSE;So;0;ON;;;;;N;;;;; +1FAC0;ANATOMICAL HEART;So;0;ON;;;;;N;;;;; +1FAC1;LUNGS;So;0;ON;;;;;N;;;;; +1FAC2;PEOPLE HUGGING;So;0;ON;;;;;N;;;;; +1FAC3;PREGNANT MAN;So;0;ON;;;;;N;;;;; +1FAC4;PREGNANT PERSON;So;0;ON;;;;;N;;;;; +1FAC5;PERSON WITH CROWN;So;0;ON;;;;;N;;;;; +1FAC6;FINGERPRINT;So;0;ON;;;;;N;;;;; +1FAC8;HAIRY CREATURE;So;0;ON;;;;;N;;;;; +1FACD;ORCA;So;0;ON;;;;;N;;;;; +1FACE;MOOSE;So;0;ON;;;;;N;;;;; +1FACF;DONKEY;So;0;ON;;;;;N;;;;; +1FAD0;BLUEBERRIES;So;0;ON;;;;;N;;;;; +1FAD1;BELL PEPPER;So;0;ON;;;;;N;;;;; +1FAD2;OLIVE;So;0;ON;;;;;N;;;;; +1FAD3;FLATBREAD;So;0;ON;;;;;N;;;;; +1FAD4;TAMALE;So;0;ON;;;;;N;;;;; +1FAD5;FONDUE;So;0;ON;;;;;N;;;;; +1FAD6;TEAPOT;So;0;ON;;;;;N;;;;; +1FAD7;POURING LIQUID;So;0;ON;;;;;N;;;;; +1FAD8;BEANS;So;0;ON;;;;;N;;;;; +1FAD9;JAR;So;0;ON;;;;;N;;;;; +1FADA;GINGER ROOT;So;0;ON;;;;;N;;;;; +1FADB;PEA POD;So;0;ON;;;;;N;;;;; +1FADC;ROOT VEGETABLE;So;0;ON;;;;;N;;;;; +1FADF;SPLATTER;So;0;ON;;;;;N;;;;; +1FAE0;MELTING FACE;So;0;ON;;;;;N;;;;; +1FAE1;SALUTING FACE;So;0;ON;;;;;N;;;;; +1FAE2;FACE WITH OPEN EYES AND HAND OVER MOUTH;So;0;ON;;;;;N;;;;; +1FAE3;FACE WITH PEEKING EYE;So;0;ON;;;;;N;;;;; +1FAE4;FACE WITH DIAGONAL MOUTH;So;0;ON;;;;;N;;;;; +1FAE5;DOTTED LINE FACE;So;0;ON;;;;;N;;;;; +1FAE6;BITING LIP;So;0;ON;;;;;N;;;;; +1FAE7;BUBBLES;So;0;ON;;;;;N;;;;; +1FAE8;SHAKING FACE;So;0;ON;;;;;N;;;;; +1FAE9;FACE WITH BAGS UNDER EYES;So;0;ON;;;;;N;;;;; +1FAEA;DISTORTED FACE;So;0;ON;;;;;N;;;;; +1FAEF;FIGHT CLOUD;So;0;ON;;;;;N;;;;; +1FAF0;HAND WITH INDEX FINGER AND THUMB CROSSED;So;0;ON;;;;;N;;;;; +1FAF1;RIGHTWARDS HAND;So;0;ON;;;;;N;;;;; +1FAF2;LEFTWARDS HAND;So;0;ON;;;;;N;;;;; +1FAF3;PALM DOWN HAND;So;0;ON;;;;;N;;;;; +1FAF4;PALM UP HAND;So;0;ON;;;;;N;;;;; +1FAF5;INDEX POINTING AT THE VIEWER;So;0;ON;;;;;N;;;;; +1FAF6;HEART HANDS;So;0;ON;;;;;N;;;;; +1FAF7;LEFTWARDS PUSHING HAND;So;0;ON;;;;;N;;;;; +1FAF8;RIGHTWARDS PUSHING HAND;So;0;ON;;;;;N;;;;; +1FB00;BLOCK SEXTANT-1;So;0;ON;;;;;N;;;;; +1FB01;BLOCK SEXTANT-2;So;0;ON;;;;;N;;;;; +1FB02;BLOCK SEXTANT-12;So;0;ON;;;;;N;;;;; +1FB03;BLOCK SEXTANT-3;So;0;ON;;;;;N;;;;; +1FB04;BLOCK SEXTANT-13;So;0;ON;;;;;N;;;;; +1FB05;BLOCK SEXTANT-23;So;0;ON;;;;;N;;;;; +1FB06;BLOCK SEXTANT-123;So;0;ON;;;;;N;;;;; +1FB07;BLOCK SEXTANT-4;So;0;ON;;;;;N;;;;; +1FB08;BLOCK SEXTANT-14;So;0;ON;;;;;N;;;;; +1FB09;BLOCK SEXTANT-24;So;0;ON;;;;;N;;;;; +1FB0A;BLOCK SEXTANT-124;So;0;ON;;;;;N;;;;; +1FB0B;BLOCK SEXTANT-34;So;0;ON;;;;;N;;;;; +1FB0C;BLOCK SEXTANT-134;So;0;ON;;;;;N;;;;; +1FB0D;BLOCK SEXTANT-234;So;0;ON;;;;;N;;;;; +1FB0E;BLOCK SEXTANT-1234;So;0;ON;;;;;N;;;;; +1FB0F;BLOCK SEXTANT-5;So;0;ON;;;;;N;;;;; +1FB10;BLOCK SEXTANT-15;So;0;ON;;;;;N;;;;; +1FB11;BLOCK SEXTANT-25;So;0;ON;;;;;N;;;;; +1FB12;BLOCK SEXTANT-125;So;0;ON;;;;;N;;;;; +1FB13;BLOCK SEXTANT-35;So;0;ON;;;;;N;;;;; +1FB14;BLOCK SEXTANT-235;So;0;ON;;;;;N;;;;; +1FB15;BLOCK SEXTANT-1235;So;0;ON;;;;;N;;;;; +1FB16;BLOCK SEXTANT-45;So;0;ON;;;;;N;;;;; +1FB17;BLOCK SEXTANT-145;So;0;ON;;;;;N;;;;; +1FB18;BLOCK SEXTANT-245;So;0;ON;;;;;N;;;;; +1FB19;BLOCK SEXTANT-1245;So;0;ON;;;;;N;;;;; +1FB1A;BLOCK SEXTANT-345;So;0;ON;;;;;N;;;;; +1FB1B;BLOCK SEXTANT-1345;So;0;ON;;;;;N;;;;; +1FB1C;BLOCK SEXTANT-2345;So;0;ON;;;;;N;;;;; +1FB1D;BLOCK SEXTANT-12345;So;0;ON;;;;;N;;;;; +1FB1E;BLOCK SEXTANT-6;So;0;ON;;;;;N;;;;; +1FB1F;BLOCK SEXTANT-16;So;0;ON;;;;;N;;;;; +1FB20;BLOCK SEXTANT-26;So;0;ON;;;;;N;;;;; +1FB21;BLOCK SEXTANT-126;So;0;ON;;;;;N;;;;; +1FB22;BLOCK SEXTANT-36;So;0;ON;;;;;N;;;;; +1FB23;BLOCK SEXTANT-136;So;0;ON;;;;;N;;;;; +1FB24;BLOCK SEXTANT-236;So;0;ON;;;;;N;;;;; +1FB25;BLOCK SEXTANT-1236;So;0;ON;;;;;N;;;;; +1FB26;BLOCK SEXTANT-46;So;0;ON;;;;;N;;;;; +1FB27;BLOCK SEXTANT-146;So;0;ON;;;;;N;;;;; +1FB28;BLOCK SEXTANT-1246;So;0;ON;;;;;N;;;;; +1FB29;BLOCK SEXTANT-346;So;0;ON;;;;;N;;;;; +1FB2A;BLOCK SEXTANT-1346;So;0;ON;;;;;N;;;;; +1FB2B;BLOCK SEXTANT-2346;So;0;ON;;;;;N;;;;; +1FB2C;BLOCK SEXTANT-12346;So;0;ON;;;;;N;;;;; +1FB2D;BLOCK SEXTANT-56;So;0;ON;;;;;N;;;;; +1FB2E;BLOCK SEXTANT-156;So;0;ON;;;;;N;;;;; +1FB2F;BLOCK SEXTANT-256;So;0;ON;;;;;N;;;;; +1FB30;BLOCK SEXTANT-1256;So;0;ON;;;;;N;;;;; +1FB31;BLOCK SEXTANT-356;So;0;ON;;;;;N;;;;; +1FB32;BLOCK SEXTANT-1356;So;0;ON;;;;;N;;;;; +1FB33;BLOCK SEXTANT-2356;So;0;ON;;;;;N;;;;; +1FB34;BLOCK SEXTANT-12356;So;0;ON;;;;;N;;;;; +1FB35;BLOCK SEXTANT-456;So;0;ON;;;;;N;;;;; +1FB36;BLOCK SEXTANT-1456;So;0;ON;;;;;N;;;;; +1FB37;BLOCK SEXTANT-2456;So;0;ON;;;;;N;;;;; +1FB38;BLOCK SEXTANT-12456;So;0;ON;;;;;N;;;;; +1FB39;BLOCK SEXTANT-3456;So;0;ON;;;;;N;;;;; +1FB3A;BLOCK SEXTANT-13456;So;0;ON;;;;;N;;;;; +1FB3B;BLOCK SEXTANT-23456;So;0;ON;;;;;N;;;;; +1FB3C;LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB3D;LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB3E;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB3F;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB40;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB41;LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB42;LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB43;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB44;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB45;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB46;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB47;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB48;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB49;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4A;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4B;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB4C;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4D;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4E;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4F;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB50;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB51;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB52;UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB53;UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB54;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB55;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB56;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB57;UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB58;UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB59;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB5A;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB5B;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB5C;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB5D;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB5E;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB5F;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB60;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB61;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB62;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB63;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB64;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB65;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB66;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB67;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB68;UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB69;LEFT AND LOWER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB6A;UPPER AND LEFT AND LOWER TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB6B;LEFT AND UPPER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB6C;LEFT TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB6D;UPPER TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB6E;RIGHT TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB6F;LOWER TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB70;VERTICAL ONE EIGHTH BLOCK-2;So;0;ON;;;;;N;;;;; +1FB71;VERTICAL ONE EIGHTH BLOCK-3;So;0;ON;;;;;N;;;;; +1FB72;VERTICAL ONE EIGHTH BLOCK-4;So;0;ON;;;;;N;;;;; +1FB73;VERTICAL ONE EIGHTH BLOCK-5;So;0;ON;;;;;N;;;;; +1FB74;VERTICAL ONE EIGHTH BLOCK-6;So;0;ON;;;;;N;;;;; +1FB75;VERTICAL ONE EIGHTH BLOCK-7;So;0;ON;;;;;N;;;;; +1FB76;HORIZONTAL ONE EIGHTH BLOCK-2;So;0;ON;;;;;N;;;;; +1FB77;HORIZONTAL ONE EIGHTH BLOCK-3;So;0;ON;;;;;N;;;;; +1FB78;HORIZONTAL ONE EIGHTH BLOCK-4;So;0;ON;;;;;N;;;;; +1FB79;HORIZONTAL ONE EIGHTH BLOCK-5;So;0;ON;;;;;N;;;;; +1FB7A;HORIZONTAL ONE EIGHTH BLOCK-6;So;0;ON;;;;;N;;;;; +1FB7B;HORIZONTAL ONE EIGHTH BLOCK-7;So;0;ON;;;;;N;;;;; +1FB7C;LEFT AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB7D;LEFT AND UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB7E;RIGHT AND UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB7F;RIGHT AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB80;UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB81;HORIZONTAL ONE EIGHTH BLOCK-1358;So;0;ON;;;;;N;;;;; +1FB82;UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB83;UPPER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB84;UPPER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB85;UPPER THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB86;UPPER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB87;RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB88;RIGHT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB89;RIGHT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB8A;RIGHT THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB8B;RIGHT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB8C;LEFT HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB8D;RIGHT HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB8E;UPPER HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB8F;LOWER HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB90;INVERSE MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB91;UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB92;UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB94;LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB95;CHECKER BOARD FILL;So;0;ON;;;;;N;;;;; +1FB96;INVERSE CHECKER BOARD FILL;So;0;ON;;;;;N;;;;; +1FB97;HEAVY HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +1FB98;UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +1FB99;UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +1FB9A;UPPER AND LOWER TRIANGULAR HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB9B;LEFT AND RIGHT TRIANGULAR HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB9C;UPPER LEFT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB9D;UPPER RIGHT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB9E;LOWER RIGHT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB9F;LOWER LEFT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FBA0;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT;So;0;ON;;;;;N;;;;; +1FBA1;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBA2;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA3;BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA4;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA5;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA6;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBA7;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBA8;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT AND MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA9;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT AND MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBAA;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE TO MIDDLE LEFT;So;0;ON;;;;;N;;;;; +1FBAB;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBAC;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBAD;BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBAE;BOX DRAWINGS LIGHT DIAGONAL DIAMOND;So;0;ON;;;;;N;;;;; +1FBAF;BOX DRAWINGS LIGHT HORIZONTAL WITH VERTICAL STROKE;So;0;ON;;;;;N;;;;; +1FBB0;ARROWHEAD-SHAPED POINTER;So;0;ON;;;;;N;;;;; +1FBB1;INVERSE CHECK MARK;So;0;ON;;;;;N;;;;; +1FBB2;LEFT HALF RUNNING MAN;So;0;ON;;;;;N;;;;; +1FBB3;RIGHT HALF RUNNING MAN;So;0;ON;;;;;N;;;;; +1FBB4;INVERSE DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +1FBB5;LEFTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB6;RIGHTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB7;DOWNWARDS ARROW AND RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB8;UPWARDS ARROW AND RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB9;LEFT HALF FOLDER;So;0;ON;;;;;N;;;;; +1FBBA;RIGHT HALF FOLDER;So;0;ON;;;;;N;;;;; +1FBBB;VOIDED GREEK CROSS;So;0;ON;;;;;N;;;;; +1FBBC;RIGHT OPEN SQUARED DOT;So;0;ON;;;;;N;;;;; +1FBBD;NEGATIVE DIAGONAL CROSS;So;0;ON;;;;;N;;;;; +1FBBE;NEGATIVE DIAGONAL MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBBF;NEGATIVE DIAGONAL DIAMOND;So;0;ON;;;;;N;;;;; +1FBC0;WHITE HEAVY SALTIRE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +1FBC1;LEFT THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1FBC2;MIDDLE THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1FBC3;RIGHT THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1FBC4;NEGATIVE SQUARED QUESTION MARK;So;0;ON;;;;;N;;;;; +1FBC5;STICK FIGURE;So;0;ON;;;;;N;;;;; +1FBC6;STICK FIGURE WITH ARMS RAISED;So;0;ON;;;;;N;;;;; +1FBC7;STICK FIGURE LEANING LEFT;So;0;ON;;;;;N;;;;; +1FBC8;STICK FIGURE LEANING RIGHT;So;0;ON;;;;;N;;;;; +1FBC9;STICK FIGURE WITH DRESS;So;0;ON;;;;;N;;;;; +1FBCA;WHITE UP-POINTING CHEVRON;So;0;ON;;;;;N;;;;; +1FBCB;WHITE CROSS MARK;So;0;ON;;;;;N;;;;; +1FBCC;RAISED SMALL LEFT SQUARE BRACKET;So;0;ON;;;;;N;;;;; +1FBCD;BLACK SMALL UP-POINTING CHEVRON;So;0;ON;;;;;N;;;;; +1FBCE;LEFT TWO THIRDS BLOCK;So;0;ON;;;;;N;;;;; +1FBCF;LEFT ONE THIRD BLOCK;So;0;ON;;;;;N;;;;; +1FBD0;BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER LEFT;So;0;ON;;;;;N;;;;; +1FBD1;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT;So;0;ON;;;;;N;;;;; +1FBD2;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBD3;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBD4;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBD5;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBD6;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBD7;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER LEFT;So;0;ON;;;;;N;;;;; +1FBD8;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FBD9;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBDA;BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO MIDDLE CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBDB;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO LOWER LEFT;So;0;ON;;;;;N;;;;; +1FBDC;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FBDD;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBDE;BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBDF;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT TO LOWER LEFT;So;0;ON;;;;;N;;;;; +1FBE0;TOP JUSTIFIED LOWER HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1FBE1;RIGHT JUSTIFIED LEFT HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1FBE2;BOTTOM JUSTIFIED UPPER HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1FBE3;LEFT JUSTIFIED RIGHT HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1FBE4;UPPER CENTRE ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FBE5;LOWER CENTRE ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FBE6;MIDDLE LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FBE7;MIDDLE RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FBE8;TOP JUSTIFIED LOWER HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBE9;RIGHT JUSTIFIED LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBEA;BOTTOM JUSTIFIED UPPER HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBEB;LEFT JUSTIFIED RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBEC;TOP RIGHT JUSTIFIED LOWER LEFT QUARTER BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBED;BOTTOM LEFT JUSTIFIED UPPER RIGHT QUARTER BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBEE;BOTTOM RIGHT JUSTIFIED UPPER LEFT QUARTER BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBEF;TOP LEFT JUSTIFIED LOWER RIGHT QUARTER BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBF0;SEGMENTED DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1FBF1;SEGMENTED DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1FBF2;SEGMENTED DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1FBF3;SEGMENTED DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1FBF4;SEGMENTED DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1FBF5;SEGMENTED DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1FBF6;SEGMENTED DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1FBF7;SEGMENTED DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1FBF8;SEGMENTED DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1FBF9;SEGMENTED DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1FBFA;ALARM BELL SYMBOL;So;0;ON;;;;;N;;;;; +20000;;Lo;0;L;;;;;N;;;;; +2A6DF;;Lo;0;L;;;;;N;;;;; +2A700;;Lo;0;L;;;;;N;;;;; +2B73F;;Lo;0;L;;;;;N;;;;; +2B740;;Lo;0;L;;;;;N;;;;; +2B81D;;Lo;0;L;;;;;N;;;;; +2B820;;Lo;0;L;;;;;N;;;;; +2CEAD;;Lo;0;L;;;;;N;;;;; +2CEB0;;Lo;0;L;;;;;N;;;;; +2EBE0;;Lo;0;L;;;;;N;;;;; +2EBF0;;Lo;0;L;;;;;N;;;;; +2EE5D;;Lo;0;L;;;;;N;;;;; +2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; +2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; +2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; +2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; +2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; +2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; +2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; +2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; +2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; +2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; +2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; +2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; +2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; +2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; +2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; +2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; +2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; +2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; +2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; +2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; +2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; +2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; +2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; +2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; +2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; +2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; +2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; +2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; +2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; +2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; +2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; +2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; +2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; +2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; +2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; +2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; +2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; +2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; +2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; +2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; +2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; +2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; +2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; +2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; +2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; +2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; +2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; +2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; +2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; +2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; +2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; +2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; +2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; +2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; +2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; +2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; +2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; +2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; +2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; +2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; +2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; +2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; +2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; +2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; +2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; +2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; +2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; +2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; +2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; +2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; +2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; +2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; +2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; +2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; +2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; +2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; +2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; +2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; +2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; +2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; +2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; +2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; +2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; +2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; +2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; +2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; +2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; +2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; +2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; +2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; +2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; +2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; +2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; +2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; +2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; +2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; +2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; +2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; +2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; +2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; +2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; +2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; +2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; +2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; +2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;; +2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; +2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; +2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; +2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; +2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; +2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; +2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; +2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; +2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; +2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; +2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; +2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;; +2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; +2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; +2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; +2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; +2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; +2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; +2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; +2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; +2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; +2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; +2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; +2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; +2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; +2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; +2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; +2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; +2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; +2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; +2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; +2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; +2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; +2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; +2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; +2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; +2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; +2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; +2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; +2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; +2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; +2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; +2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; +2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; +2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; +2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; +2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; +2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; +2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; +2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; +2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; +2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; +2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; +2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; +2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; +2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; +2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; +2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; +2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; +2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; +2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; +2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; +2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; +2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; +2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; +2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; +2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; +2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; +2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; +2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; +2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; +2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; +2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; +2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; +2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; +2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; +2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; +2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; +2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; +2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; +2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; +2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; +2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; +2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; +2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; +2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; +2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; +2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; +2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; +2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; +2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; +2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; +2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; +2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; +2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; +2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; +2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; +2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; +2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; +2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; +2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; +2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; +2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; +2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; +2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; +2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; +2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; +2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; +2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; +2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; +2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; +2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; +2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; +2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; +2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; +2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; +2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; +2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; +2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; +2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; +2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; +2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; +2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; +2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; +2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; +2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; +2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; +2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; +2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; +2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; +2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; +2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; +2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; +2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; +2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; +2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; +2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; +2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; +2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; +2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; +2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; +2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; +2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; +2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; +2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; +2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; +2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; +2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; +2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; +2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; +2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; +2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; +2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; +2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; +2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; +2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; +2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; +2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; +2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; +2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; +2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; +2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; +2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; +2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; +2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; +2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; +2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; +2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; +2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; +2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; +2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; +2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; +2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; +2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; +2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; +2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; +2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; +2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; +2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; +2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; +2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; +2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; +2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;; +2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; +2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; +2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; +2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; +2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; +2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; +2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; +2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; +2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; +2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; +2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; +2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; +2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; +2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; +2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; +2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; +2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; +2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; +2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; +2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; +2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; +2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; +2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; +2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; +2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; +2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; +2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; +2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; +2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; +2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; +2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; +2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; +2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; +2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; +2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; +2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; +2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; +2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; +2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; +2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; +2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; +2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; +2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; +2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; +2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; +2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; +2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; +2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; +2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; +2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; +2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; +2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; +2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; +2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; +2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; +2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; +2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; +2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; +2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; +2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; +2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; +2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; +2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; +2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;; +2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; +2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; +2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; +2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; +2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; +2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; +2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; +2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; +2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; +2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; +2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; +2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; +2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; +2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; +2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; +2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; +2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; +2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; +2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; +2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; +2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; +2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; +2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; +2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; +2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; +2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; +2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; +2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; +2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; +2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; +2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; +2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; +2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; +2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; +2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; +2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; +2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; +2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; +2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; +2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; +2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; +2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; +2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; +2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; +2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; +2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; +2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; +2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; +2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; +2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; +2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; +2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; +2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; +2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; +2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; +2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; +2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; +2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; +2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; +2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; +2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; +2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; +2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; +2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; +2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; +2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; +2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; +2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; +2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; +2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; +2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; +2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; +2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; +2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; +2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; +2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; +2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; +2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; +2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; +2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; +2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; +2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; +2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; +2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; +2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; +2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; +2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; +2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; +2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; +2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; +2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; +2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; +2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; +2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; +2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; +2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;; +2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; +2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; +2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; +2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; +2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; +2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; +2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; +2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; +2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; +2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; +2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; +2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; +2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; +2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; +2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; +2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; +2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; +2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; +2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; +2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; +2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; +2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; +2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; +2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; +2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; +2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; +2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; +2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; +2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; +2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; +2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; +2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; +2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; +2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; +2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; +2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; +2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; +2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; +2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; +2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; +2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; +2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; +2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; +2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; +2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; +2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; +2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; +2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; +2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; +2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; +2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; +2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; +2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; +2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; +2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; +2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; +2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; +2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; +2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; +2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; +2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; +2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; +2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; +2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; +2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; +2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; +2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; +2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; +2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; +2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; +2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; +2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; +2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; +2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; +2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; +2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; +2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; +2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; +2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; +2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; +2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; +2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; +2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; +2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; +2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; +2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; +2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; +2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; +2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; +2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; +2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; +2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; +2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; +2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; +30000;;Lo;0;L;;;;;N;;;;; +3134A;;Lo;0;L;;;;;N;;;;; +31350;;Lo;0;L;;;;;N;;;;; +323AF;;Lo;0;L;;;;;N;;;;; +323B0;;Lo;0;L;;;;;N;;;;; +33479;;Lo;0;L;;;;;N;;;;; +E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; +E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; +E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; +E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;; +E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;; +E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;; +E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;; +E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;; +E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;; +E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;; +E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;; +E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;; +E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;; +E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;; +E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;; +E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;; +E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;; +E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;; +E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;; +E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;; +E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;; +E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;; +E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;; +E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;; +E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;; +E003A;TAG COLON;Cf;0;BN;;;;;N;;;;; +E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;; +E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;; +E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;; +E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;; +E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;; +E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;; +E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;; +E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;; +E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;; +E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;; +E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;; +E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;; +E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;; +E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;; +E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;; +E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;; +E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;; +E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;; +E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;; +E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;; +E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;; +E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;; +E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;; +E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;; +E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;; +E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;; +E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;; +E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;; +E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;; +E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;; +E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;; +E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;; +E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;; +E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;; +E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;; +E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;; +E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;; +E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;; +E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;; +E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;; +E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;; +E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;; +E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;; +E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;; +E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;; +E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;; +E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;; +E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;; +E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;; +E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;; +E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;; +E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;; +E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;; +E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;; +E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;; +E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;; +E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;; +E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;; +E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;; +E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;; +E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;; +E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;; +E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;; +E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;; +E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;; +E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;; +E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;; +E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;; +E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;; +E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;; +E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;; +E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;; +E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;; +E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;; +E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;; +E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;; +E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;; +E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;; +E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;; +E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;; +E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;; +E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;; +E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;; +E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;; +E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;; +E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;; +E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;; +E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;; +E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;; +E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;; +E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;; +E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;; +E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;; +E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;; +E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;; +E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;; +E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;; +E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;; +E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;; +E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;; +E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;; +E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;; +E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;; +E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;; +E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;; +E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;; +E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;; +E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;; +E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;; +E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;; +E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;; +E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;; +E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;; +E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;; +E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;; +E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;; +E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;; +E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;; +E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;; +E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;; +E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;; +E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;; +E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;; +E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;; +E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;; +E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;; +E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;; +E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;; +E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;; +E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;; +E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;; +E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;; +E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;; +E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;; +E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;; +E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;; +E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;; +E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;; +E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;; +E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;; +E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;; +E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;; +E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;; +E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;; +E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;; +E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;; +E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;; +E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;; +E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;; +E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;; +E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;; +E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;; +E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;; +E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;; +E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;; +E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;; +E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;; +E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;; +E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;; +E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;; +E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;; +E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;; +E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;; +E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;; +E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;; +E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;; +E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;; +E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;; +E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;; +E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;; +E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;; +E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;; +E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;; +E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;; +E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;; +E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;; +E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;; +E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;; +E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;; +E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;; +E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;; +E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;; +E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;; +E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;; +E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;; +E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;; +E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;; +E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;; +E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;; +E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;; +E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;; +E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;; +E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;; +E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;; +E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;; +E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;; +E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;; +E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;; +E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;; +E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;; +E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;; +E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;; +E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;; +E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;; +E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;; +E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;; +E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;; +E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;; +E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;; +E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;; +E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;; +E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;; +E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;; +E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;; +E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;; +E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;; +E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;; +E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;; +E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;; +E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;; +E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;; +E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;; +E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;; +E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;; +E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;; +E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;; +E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;; +E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;; +E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;; +E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;; +E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;; +E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;; +E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;; +E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;; +E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;; +E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;; +E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;; +E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;; +E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;; +E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;; +E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;; +E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;; +E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;; +E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;; +E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;; +E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;; +E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;; +E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;; +E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;; +E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;; +E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;; +E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;; +E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;; +E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;; +E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;; +E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;; +E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;; +E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;; +E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;; +E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;; +E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;; +E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;; +E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;; +E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;; +E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;; +E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;; +E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;; +E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;; +E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;; +E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;; +E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;; +E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;; +E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;; +E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;; +E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;; +E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;; +E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;; +E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;; +E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;; +E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;; +E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;; +E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;; +E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;; +E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;; +E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;; +E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;; +E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;; +E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;; +E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;; +E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;; +E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;; +E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;; +E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;; +E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;; +E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;; +E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;; +E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;; +E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;; +E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;; +E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;; +E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;; +F0000;;Co;0;L;;;;;N;;;;; +FFFFD;;Co;0;L;;;;;N;;;;; +100000;;Co;0;L;;;;;N;;;;; +10FFFD;;Co;0;L;;;;;N;;;;; diff --git a/tests/core/assets/UCD/license.txt b/tests/core/assets/UCD/license.txt new file mode 100644 index 000000000..56da58912 --- /dev/null +++ b/tests/core/assets/UCD/license.txt @@ -0,0 +1,39 @@ +UNICODE LICENSE V3 + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2026 Unicode, Inc. + +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR +SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT +DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of data files and any associated documentation (the "Data Files") or +software and any associated documentation (the "Software") to deal in the +Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Data Files or Software, and to permit persons to whom the +Data Files or Software are furnished to do so, provided that either (a) +this copyright and permission notice appear with all copies of the Data +Files or Software, or (b) this copyright and permission notice appear in +associated Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +THIRD PARTY RIGHTS. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA +FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in these Data Files or Software without prior written +authorization of the copyright holder. From 8f579d1f3bea095dc188c33d95b5e685b4c1e807 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 17:34:37 -0500 Subject: [PATCH 615/766] Added program to generate Unicode Table This adds a program that will generate tables for use by the `core/unicode` package. The table generated file will be `core/unicode/generated.odin` It may be better to incorporate this into `generate_entity_table.odin`. This can easily be accomplised if desired. --- core/unicode/tools/generate_unicode.odin | 325 +++++++++++ core/unicode/tools/ucd/iterator.odin | 70 +++ core/unicode/tools/ucd/string_to.odin | 396 +++++++++++++ core/unicode/tools/ucd/types.odin | 702 +++++++++++++++++++++++ core/unicode/tools/ucd/ucd.odin | 307 ++++++++++ 5 files changed, 1800 insertions(+) create mode 100644 core/unicode/tools/generate_unicode.odin create mode 100644 core/unicode/tools/ucd/iterator.odin create mode 100644 core/unicode/tools/ucd/string_to.odin create mode 100644 core/unicode/tools/ucd/types.odin create mode 100644 core/unicode/tools/ucd/ucd.odin diff --git a/core/unicode/tools/generate_unicode.odin b/core/unicode/tools/generate_unicode.odin new file mode 100644 index 000000000..5962a269c --- /dev/null +++ b/core/unicode/tools/generate_unicode.odin @@ -0,0 +1,325 @@ +package main +import "core:fmt" +import path "core:path/filepath" +import "core:os" +import "core:strings" +import "base:runtime" +import "core:mem" +import "core:io" +import "core:log" +import "ucd" + +// Table 2-3. Types of Code Points +// Table 4-4. General_Category Values page 229 + +// Reference https://www.unicode.org/reports/tr44/ + + +/* +Formats a ucd.Dynamic_Range into a set of fixed length arrays and writes +corresponding to a io.Writer. The value of the parameter `name`will be used as a +prefix to the array names. If a dynamic array contained in the `range` is empty, +no corresponding fixed length array will be written. + +Inputs: +- writer: The io.Writer to be written to. +- name: Prefix to add to any array that is written to `writer` +- range: The ucd.Dynamic_Range to format and write to writer. +*/ +write_range_arrays :: proc( + writer: io.Writer, + name: string, + range : ucd.Dynamic_Range, +) -> int { + n_written : int + if len(range.single_16) > 0 { + n_written += fmt.wprintln(writer, "@(rodata)") + n_written += fmt.wprintf(writer, "%s_singles16 := [?]u16{{", name) + line_length := 100 + for v in range.single_16 { + str_buffer : [32]byte + str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) + + if line_length + len(str) > 80 { + n_written += fmt.wprintf(writer, "\n") + line_length = fmt.wprintf(writer, "\t0x%4X,",v) + n_written += line_length + } else { + temp, _ := io.write_string(writer, str) + line_length += temp + n_written += temp + } + } + n_written += fmt.wprintln(writer, "\n}\n") + } + + if len(range.ranges_16) > 0 { + n_written += fmt.wprintln(writer, "@(rodata)") + n_written += fmt.wprintfln(writer, "%s_ranges16 := [?]u16{{", name) + for v in range.ranges_16 { + n_written += fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) + } + n_written += fmt.wprintln(writer, "}\n") + } + + if len(range.single_32) > 0 { + n_written += fmt.wprintln(writer, "@(rodata)") + n_written += fmt.wprintf(writer, "%s_singles32 := [?]i32{{", name) + line_length := 100 + for v in range.single_32 { + str_buffer : [32]byte + str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) + + if line_length + len(str) > 80 { + n_written += fmt.wprint(writer, "\n") + line_length = fmt.wprintf(writer, "\t0x%4X,",v) + n_written += line_length + } else { + temp, _ := io.write_string(writer, str) + line_length += temp + n_written += temp + } + } + n_written += fmt.wprintln(writer, "\n}\n") + } + + if len(range.ranges_32) > 0 { + n_written += fmt.wprintln(writer, "@(rodata)") + n_written += fmt.wprintfln(writer, "%s_ranges32 := [?]i32{{", name) + for v in range.ranges_32 { + n_written += fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) + } + n_written += fmt.wprintln(writer, "}\n") + } + + return n_written +} + +write_range :: proc( + writer: io.Writer, + name: union{string, + ucd.General_Category}, + range: ucd.Dynamic_Range, +) -> (n_written: int) { + buffer: [128]byte + str: string + + switch n in name{ + case string: + assert(len(n) <= len(buffer)) + runtime.mem_copy(&buffer[0], raw_data(n), len(n)) + str = transmute(string) buffer[0:len(n)] + + case ucd.General_Category: + str = fmt.bprintf(buffer[:], "%s", n) + } + + for &b in buffer[0:len(str)] { + if b >= 'A' && b <= 'Z' { + b += ('a' - 'A') + } + } + + n_written = write_range_arrays(writer, str, range) + + n_written += fmt.wprintfln(writer, "%s_ranges := Range{{", str) + if len(range.single_16) > 0 { + n_written += fmt.wprintfln(writer, "\tsingle_16 = %s_singles16[:],", str) + } + if len(range.ranges_16) > 0 { + n_written += fmt.wprintfln(writer, "\tranges_16 = %s_ranges16[:],", str) + } + if len(range.single_32) > 0 { + n_written += fmt.wprintfln(writer, "\tsingle_32 = %s_singles32[:],", str) + } + if len(range.ranges_32) > 0 { + n_written += fmt.wprintfln(writer, "\tranges_32 = %s_ranges32[:],", str) + } + n_written += fmt.wprintln(writer, "}\n") + + return +} + +GENERATED :: `/* + ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ +*/ +` + +MESSAGE :: `/* + This file is generated from UnicodeData.txt and PropList.txt. These files + are part of the Unicode Database (UCD) and are covered by the license + listed further down. They may be downloaded from the following locations; + + https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt + https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt + https://www.unicode.org/license.txt + + ------------------------------------------------------------------------------ + UNICODE LICENSE V3 + + COPYRIGHT AND PERMISSION NOTICE + + Copyright © 1991-2026 Unicode, Inc. + + NOTICE TO USER: Carefully read the following legal agreement. BY + DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR + SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE + TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT + DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of data files and any associated documentation (the "Data Files") or + software and any associated documentation (the "Software") to deal in the + Data Files or Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, and/or sell + copies of the Data Files or Software, and to permit persons to whom the + Data Files or Software are furnished to do so, provided that either (a) + this copyright and permission notice appear with all copies of the Data + Files or Software, or (b) this copyright and permission notice appear in + associated Documentation. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + THIRD PARTY RIGHTS. + + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE + BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, + OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA + FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder shall + not be used in advertising or otherwise to promote the sale, use or other + dealings in these Data Files or Software without prior written + authorization of the copyright holder. + +*/ +` + +main :: proc() { + track: mem.Tracking_Allocator + + mem.tracking_allocator_init(&track, context.allocator) + defer { + if len(track.allocation_map) > 0 { + fmt.eprintf("=== %v allocations not freed: ===\n", len(track.allocation_map)) + for _, entry in track.allocation_map { + fmt.eprintf("- %v bytes @ %v\n", entry.size, entry.location) + } + } + mem.tracking_allocator_destroy(&track) + } + + context.allocator = mem.tracking_allocator(&track) + + context.logger = log.create_console_logger() + defer log.destroy_console_logger(context.logger) + + ucd_path, _ := path.join({ODIN_ROOT, + "tests","core","assets","UCD","UnicodeData.txt"}, context.allocator) + defer delete(ucd_path) + + unicode_data, ucd_err := ucd.load_unicode_data(ucd_path) + if ucd_err != nil { + log.errorf("Error loading Unicode data. %s", ucd_err) + } + defer ucd.destroy_unicode_data(unicode_data) + + general_category_ranges := ucd.gc_ranges(&unicode_data) + defer ucd.destroy_general_category_ranges(general_category_ranges) + + extra_digits := ucd.extra_digits(&unicode_data) + defer ucd.destroy_dynamic_range(extra_digits) + + + proplist_path, _ := path.join({ODIN_ROOT, + "tests","core","assets","UCD","PropList.txt"}, context.allocator) + defer delete(proplist_path) + proplist, proplist_err := ucd.load_protperty_list(proplist_path) + if proplist_err != nil { + log.errorf("Error loading PropList.txt. %s", proplist_err) + return + } + defer ucd.destroy_protperty_list(proplist) + + + + sb := strings.builder_make_len_cap(0, 1024*32) + defer strings.builder_destroy(&sb) + + + writer := strings.to_writer(&sb) + + fmt.wprintfln(writer, "package unicode\n") + fmt.wprintln(writer, GENERATED) + fmt.wprintln(writer, MESSAGE) + + Range_Type :: "Range :: struct {\n" + + "\tsingle_16 : []u16,\n" + + "\tranges_16 : []u16,\n" + + "\tsingle_32 : []i32,\n" + + "\tranges_32 : []i32,\n" + + "}\n" + + fmt.wprintfln(writer, "%s", Range_Type) + + //List of the general categories to skip when generating the code for + //core/unicode/generated.txt. + to_exclude := [?]ucd.General_Category{ + .Cc, // Control, a C0 or C1 control code + .Cf, // Format, a format control character + .Cn, // Unassigned, a reserved unassigned code point or a noncharacter + .Co, // Private_Use, a private-use character + .Cs, // Surrogate, a surrogate code point + // .Ll, // Lowercase_Letter, a lowercase letter + // .Lm, // Modifier_Letter, a modifier letter + // .Lo, // Other_Letter, other letters, including syllables and ideographs + // .Lt, // Titlecase_Letter, a digraph encoded as a single character, with first part uppercase + // .Lu, // Uppercase_Letter, an uppercase letter + .Mc, // Spacing_Mark, a spacing combining mark (positive advance width) + .Me, // Enclosing_Mark, an enclosing combining mark + .Mn, // Nonspacing_Mark, a nonspacing combining mark (zero advance width) + //.Nd, // Decimal_Number, a decimal digit + //.Nl, // Letter_Number, a letterlike numeric character + //.No, // Other_Number, a numeric character of other type + .Pc, // Connector_Punctuation, a connecting punctuation mark, like a tie + .Pd, // Dash_Punctuation, a dash or hyphen punctuation mark + .Pe, // Close_Punctuation, a closing punctuation mark (of a pair) + .Pf, // Final_Punctuation, a final quotation mark + .Pi, // Initial_Punctuation, an initial quotation mark + .Po, // Other_Punctuation, a punctuation mark of other type + .Ps, // Open_Punctuation, an opening punctuation mark (of a pair) + .Sc, // Currency_Symbol, a currency sign + .Sk, // Modifier_Symbol, a non-letterlike modifier symbol + .Sm, // Math_Symbol, a symbol of mathematical use + .So, // Other_Symbol, a symbol of other type + .Zl, // Line_Separator, U+2028 LINE SEPARATOR only + .Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only + .Zs, // Space_Separator, a space character (of various non-zero widths) + } + + write_loop : for gc, i in general_category_ranges { + for excluded in to_exclude { + if i == excluded do continue write_loop + } + write_range(writer, i, gc) + } + + write_range(writer, "extra_digits", extra_digits ) + + write_range(writer,"other_lowercase", proplist[.Other_Lowercase]) + write_range(writer,"other_uppercase", proplist[.Other_Uppercase]) + + file_name, _ := path.join({ODIN_ROOT, "core", "unicode", "generated.odin"}, context.allocator) + defer delete(file_name) + + str := strings.to_string(sb) + + write_error := os.write_entire_file_from_string(file_name, str) + if write_error != nil { + log.errorf("Error writting %s. %s", file_name, write_error) + } +} + diff --git a/core/unicode/tools/ucd/iterator.odin b/core/unicode/tools/ucd/iterator.odin new file mode 100644 index 000000000..53424466f --- /dev/null +++ b/core/unicode/tools/ucd/iterator.odin @@ -0,0 +1,70 @@ +package ucd + +/* +An iterator that allows simple iterating over the lines of of a slice of bytes, []byte, +without allocating. Each line must end in a new line, i.e., '\n' +*/ +Line_Iterator :: struct { + index: int, // current location in data + data: []byte, // Data over which to iterate + line_counter: int, // line number storage +} + +line_iterator :: proc(it: ^Line_Iterator) -> (line: []byte, line_number: int, more: bool) { + more = it.index < len(it.data) + if more { + it.line_counter += 1 + line_number = it.line_counter + } else { + return + } + start:= it.index + for it.index < len(it.data) && it.data[it.index] != '\n' && it.data[it.index] != '#' do it.index += 1 + line = it.data[start:it.index] + //index = start + + if it.index < len(it.data) && it.data[it.index] == '#' { + for it.index < len(it.data) && it.data[it.index] != '\n' do it.index += 1 + } + if it.index < len(it.data) && it.data[it.index] == '\n' do it.index += 1 + return +} + +Field_Iterator :: struct { + index: int, + field_counter: int, + line: []byte, +} + +field_iterator :: proc(it: ^Field_Iterator) -> (field: []byte, field_count: int, valid: bool) { + valid = it.index < len(it.line) && it.line[it.index] != '\n' && it.line[it.index] != '#' + if !valid do return + + if it.index < len(it.line) && it.index != 0 && it.line[it.index] == ';' do it. index += 1 + + start := it.index + for it.index < len(it.line) && it.line[it.index] != ';' && it.line[it.index] != '#' do it.index += 1 + + field = it.line[start:it.index] + temp := field + + // Remove leading spaces + for b, i in temp { + if b != ' ' { + field = temp[i:] + break + } + } + + // Remove trailing spaces + temp = field + for b, i in temp { + if b != ' ' { + field = temp[0:i+1] + } + } + + field_count = it.field_counter + it.field_counter += 1 + return +} diff --git a/core/unicode/tools/ucd/string_to.odin b/core/unicode/tools/ucd/string_to.odin new file mode 100644 index 000000000..5ca0f40fe --- /dev/null +++ b/core/unicode/tools/ucd/string_to.odin @@ -0,0 +1,396 @@ +package ucd + +string_to_general_category :: proc "contextless"( + str: string, +) -> (gc: General_Category, err: Error) { + switch str { + case "Lu": + gc = .Lu + case "Ll": + gc = .Ll + case "Lt": + gc = .Lt + case "Lm": + gc = .Lm + case "Lo": + gc = .Lo + case "Mn": + gc = .Mn + case "Mc": + gc = .Mc + case "Me": + gc = .Me + case "Nd": + gc = .Nd + case "Nl": + gc = .Nl + case "No": + gc = .No + case "Pc": + gc = .Pc + case "Pd": + gc = .Pd + case "Ps": + gc = .Ps + case "Pe": + gc = .Pe + case "Pi": + gc = .Pi + case "Pf": + gc = .Pf + case "Po": + gc = .Po + case "Sm": + gc = .Sm + case "Sc": + gc = .Sc + case "Sk": + gc = .Sk + case "So": + gc = .So + case "Zs": + gc = .Zs + case "Zl": + gc = .Zl + case "Zp": + gc = .Zp + case "Cc": + gc = .Cc + case "Cf": + gc = .Cf + case "Cs": + gc = .Cs + case "Co": + gc = .Co + case "Cn": + gc = .Cn + case: + err = UCD_Error.Invalid_General_Category + } + return +} + + +string_to_age :: proc "contextless" ( + str: string, +) -> (age: Age, err: Error) { + switch str { + case "1.1": + age = .Age_1_1 + return + + case "2.0": + age = .Age_2_0 + return + + case "2.1": + age = .Age_2_1 + return + + case "3.0": + age = .Age_3_0 + return + + case "3.1": + age = .Age_3_1 + return + + case "3.2": + age = .Age_3_2 + return + + case "4.0": + age = .Age_4_0 + return + + case "4.1": + age = .Age_4_1 + return + + case "5.0": + age = .Age_5_0 + return + + case "5.1": + age = .Age_5_1 + return + + case "5.2": + age = .Age_5_2 + return + + case "6.0": + age = .Age_6_0 + return + + case "6.1": + age = .Age_6_1 + return + + case "6.2": + age = .Age_6_2 + return + + case "6.3": + age = .Age_6_3 + return + + case "7.0": + age = .Age_7_0 + return + + case "8.0": + age = .Age_8_0 + return + + case "9.0": + age = .Age_9_0 + return + + case "10.0": + age = .Age_10_0 + return + + case "11.0": + age = .Age_11_0 + return + + case "12.0": + age = .Age_12_0 + return + + case "12.1": + age = .Age_12_1 + return + + case "13.0": + age = .Age_13_0 + return + + case "14.0": + age = .Age_14_0 + return + + case "15.0": + age = .Age_15_0 + return + + case "15.1": + age = .Age_15_1 + return + + case "16.0": + age = .Age_16_0 + return + + case "17.0": + age = .Age_17_0 + return + + case "unassigned": + age = .Age_Unassigned + return + + case: + // NOTE: Should this return an error instead? + unreachable() + } +} + + +string_to_paired_bracket_type :: proc "contextless"(str: string) -> Paired_Brack_Type { + switch str { + case "o": + return .Open + case "c": + return .Close + case "n": + return .None + case: + // TODO: Add error for this + unreachable() + } +} + +string_to_bidi_class :: proc "contextless"(str: string) -> Bidi_Class { + switch str { + case "AL": + return .AL + case "AN": + return .AN + case "B": + return .B + case "BN": + return .BN + case "CS": + return .CS + case "EN": + return .EN + case "ES": + return .ES + case "ET": + return .ET + case "FSI": + return .FSI + case "L": + return .L + case "LRE": + return .LRE + case "LRI": + return .LRI + case "LRO": + return .LRO + case "NSM": + return .NSM + case "ON": + return .ON + case "PDF": + return .PDF + case "PDI": + return .PDI + case "R": + return .R + case "RLE": + return .RLE + case "RLI": + return .RLI + case "RLO": + return .RLO + case "S": + return .S + case "WS": + return .WS + case: + // TODO: Add error for this + unreachable() + } +} + +string_to_proplist_property :: proc(str: string) -> ( + prop: PropList_Property, + err: UCD_Error, +) { + + switch str { + case "White_Space": + prop = .White_Space + + case "Bidi_Control": + prop = .Bidi_Control + + case "Join_Control": + prop = .Join_Control + + case "Dash": + prop = .Dash + + case "Hyphen": + prop = .Hyphen + + case "Quotation_Mark": + prop = .Quotation_Mark + + case "Terminal_Punctuation": + prop = .Terminal_Punctuation + + case "Other_Math": + prop = .Other_Math + + case "Hex_Digit": + prop = .Hex_Digit + + case "ASCII_Hex_Digit": + prop = .ASCII_Hex_Digit + + case "Other_Alphabetic": + prop = .Other_Alphabetic + + case "Ideographic": + prop = .Ideographic + + case "Diacritic": + prop = .Diacritic + + case "Extender": + prop = .Extender + + case "Other_Lowercase": + prop = .Other_Lowercase + + case "Other_Uppercase": + prop = .Other_Uppercase + + + case "Noncharacter_Code_Point": + prop = .Noncharacter_Code_Point + + case "Other_Grapheme_Extend": + prop = .Other_Grapheme_Extend + + case "IDS_Binary_Operator": + prop = .IDS_Binary_Operator + + case "IDS_Trinary_Operator": + prop = .IDS_Trinary_Operator + + case "IDS_Unary_Operator": + prop = .IDS_Unary_Operator + + case "Radical": + prop = .Radical + + case "Unified_Ideograph": + prop = .Unified_Ideograph + + case "Other_Default_Ignorable_Code_Point": + prop = .Other_Default_Ignorable_Code_Point + + case "Deprecated": + prop = .Deprecated + + case "Soft_Dotted": + prop = .Soft_Dotted + + case "Logical_Order_Exception": + prop = .Logical_Order_Exception + + case "Other_ID_Start": + prop = .Other_ID_Start + + case "Other_ID_Continue": + prop = .Other_ID_Continue + + case "ID_Compat_Math_Continue": + prop = .ID_Compat_Math_Continue + + case "ID_Compat_Math_Start": + prop = .ID_Compat_Math_Start + + case "Sentence_Terminal": + prop = .Sentence_Terminal + + case "Variation_Selector": + prop = .Variation_Selector + + case "Pattern_White_Space": + prop = .Pattern_White_Space + + case "Pattern_Syntax": + prop = .Pattern_Syntax + + case "Prepended_Concatenation_Mark": + prop = .Prepended_Concatenation_Mark + + case "Regional_Indicator": + prop = .Regional_Indicator + + case "Modifier_Combining_Mark": + prop = .Modifier_Combining_Mark + + case: + err = .Unknown_Property + return + } + + return +} diff --git a/core/unicode/tools/ucd/types.odin b/core/unicode/tools/ucd/types.odin new file mode 100644 index 000000000..0ba6f8909 --- /dev/null +++ b/core/unicode/tools/ucd/types.odin @@ -0,0 +1,702 @@ +package ucd + +import "core:os" + +Age :: enum byte { + Nil = 0, + Age_1_1, + Age_2_0, + Age_2_1, + Age_3_0, + Age_3_1, + Age_3_2, + Age_4_0, + Age_4_1, + Age_5_0, + Age_5_1, + Age_5_2, + Age_6_0, + Age_6_1, + Age_6_2, + Age_6_3, + Age_7_0, + Age_8_0, + Age_9_0, + Age_10_0, + Age_11_0, + Age_12_0, + Age_12_1, + Age_13_0, + Age_14_0, + Age_15_0, + Age_15_1, + Age_16_0, + Age_17_0, + Age_Unassigned, +} + +General_Category :: enum { + Cc, // Control, a C0 or C1 control code + Cf, // Format, a format control character + Cn, // Unassigned, a reserved unassigned code point or a noncharacter + Co, // Private_Use, a private-use character + Cs, // Surrogate, a surrogate code point + Ll, // Lowercase_Letter, a lowercase letter + Lm, // Modifier_Letter, a modifier letter + Lo, // Other_Letter, other letters, including syllables and ideographs + Lt, // Titlecase_Letter, a digraph encoded as a single character, with first part uppercase + Lu, // Uppercase_Letter, an uppercase letter + Mc, // Spacing_Mark, a spacing combining mark (positive advance width) + Me, // Enclosing_Mark, an enclosing combining mark + Mn, // Nonspacing_Mark, a nonspacing combining mark (zero advance width) + Nd, // Decimal_Number, a decimal digit + Nl, // Letter_Number, a letterlike numeric character + No, // Other_Number, a numeric character of other type + Pc, // Connector_Punctuation, a connecting punctuation mark, like a tie + Pd, // Dash_Punctuation, a dash or hyphen punctuation mark + Pe, // Close_Punctuation, a closing punctuation mark (of a pair) + Pf, // Final_Punctuation, a final quotation mark + Pi, // Initial_Punctuation, an initial quotation mark + Po, // Other_Punctuation, a punctuation mark of other type + Ps, // Open_Punctuation, an opening punctuation mark (of a pair) + Sc, // Currency_Symbol, a currency sign + Sk, // Modifier_Symbol, a non-letterlike modifier symbol + Sm, // Math_Symbol, a symbol of mathematical use + So, // Other_Symbol, a symbol of other type + Zl, // Line_Separator, U+2028 LINE SEPARATOR only + Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only + Zs, // Space_Separator, a space character (of various non-zero widths) +} + +Block :: enum { + Nil = 0, + Adlam, + Aegean_Numbers, + Ahom, + Alchemical, + Alphabetic_PF, + Anatolian_Hieroglyphs, + Ancient_Greek_Music, + Ancient_Greek_Numbers, + Ancient_Symbols, + Arabic, + Arabic_Ext_A, + Arabic_Ext_B, + Arabic_Ext_C, + Arabic_Math, + Arabic_PF_A, + Arabic_PF_B, + Arabic_Sup, + Armenian, + Arrows, + ASCII, + Avestan, + Balinese, + Bamum, + Bamum_Sup, + Bassa_Vah, + Batak, + Bengali, + Beria_Erfe, + Bhaiksuki, + Block_Elements, + Bopomofo, + Bopomofo_Ext, + Box_Drawing, + Brahmi, + Braille, + Buginese, + Buhid, + Byzantine_Music, + Carian, + Caucasian_Albanian, + Chakma, + Cham, + Cherokee, + Cherokee_Sup, + Chess_Symbols, + Chorasmian, + CJK, + CJK_Compat, + CJK_Compat_Forms, + CJK_Compat_Ideographs, + CJK_Compat_Ideographs_Sup, + CJK_Ext_A, + CJK_Ext_B, + CJK_Ext_C, + CJK_Ext_D, + CJK_Ext_E, + CJK_Ext_F, + CJK_Ext_G, + CJK_Ext_H, + CJK_Ext_I, + CJK_Ext_J, + CJK_Radicals_Sup, + CJK_Strokes, + CJK_Symbols, + Compat_Jamo, + Control_Pictures, + Coptic, + Coptic_Epact_Numbers, + Counting_Rod, + Cuneiform, + Cuneiform_Numbers, + Currency_Symbols, + Cypriot_Syllabary, + Cypro_Minoan, + Cyrillic, + Cyrillic_Ext_A, + Cyrillic_Ext_B, + Cyrillic_Ext_C, + Cyrillic_Ext_D, + Cyrillic_Sup, + Deseret, + Devanagari, + Devanagari_Ext, + Devanagari_Ext_A, + Diacriticals, + Diacriticals_Ext, + Diacriticals_For_Symbols, + Diacriticals_Sup, + Dingbats, + Dives_Akuru, + Dogra, + Domino, + Duployan, + Early_Dynastic_Cuneiform, + Egyptian_Hieroglyph_Format_Controls, + Egyptian_Hieroglyphs, + Egyptian_Hieroglyphs_Ext_A, + Elbasan, + Elymaic, + Emoticons, + Enclosed_Alphanum, + Enclosed_Alphanum_Sup, + Enclosed_CJK, + Enclosed_Ideographic_Sup, + Ethiopic, + Ethiopic_Ext, + Ethiopic_Ext_A, + Ethiopic_Ext_B, + Ethiopic_Sup, + Garay, + Geometric_Shapes, + Geometric_Shapes_Ext, + Georgian, + Georgian_Ext, + Georgian_Sup, + Glagolitic, + Glagolitic_Sup, + Gothic, + Grantha, + Greek, + Greek_Ext, + Gujarati, + Gunjala_Gondi, + Gurmukhi, + Gurung_Khema, + Half_And_Full_Forms, + Half_Marks, + Hangul, + Hanifi_Rohingya, + Hanunoo, + Hatran, + Hebrew, + High_PU_Surrogates, + High_Surrogates, + Hiragana, + IDC, + Ideographic_Symbols, + Imperial_Aramaic, + Indic_Number_Forms, + Indic_Siyaq_Numbers, + Inscriptional_Pahlavi, + Inscriptional_Parthian, + IPA_Ext, + Jamo, + Jamo_Ext_A, + Jamo_Ext_B, + Javanese, + Kaithi, + Kaktovik_Numerals, + Kana_Ext_A, + Kana_Ext_B, + Kana_Sup, + Kanbun, + Kangxi, + Kannada, + Katakana, + Katakana_Ext, + Kawi, + Kayah_Li, + Kharoshthi, + Khitan_Small_Script, + Khmer, + Khmer_Symbols, + Khojki, + Khudawadi, + Kirat_Rai, + Lao, + Latin_1_Sup, + Latin_Ext_A, + Latin_Ext_Additional, + Latin_Ext_B, + Latin_Ext_C, + Latin_Ext_D, + Latin_Ext_E, + Latin_Ext_F, + Latin_Ext_G, + Lepcha, + Letterlike_Symbols, + Limbu, + Linear_A, + Linear_B_Ideograms, + Linear_B_Syllabary, + Lisu, + Lisu_Sup, + Low_Surrogates, + Lycian, + Lydian, + Mahajani, + Mahjong, + Makasar, + Malayalam, + Mandaic, + Manichaean, + Marchen, + Masaram_Gondi, + Math_Alphanum, + Math_Operators, + Mayan_Numerals, + Medefaidrin, + Meetei_Mayek, + Meetei_Mayek_Ext, + Mende_Kikakui, + Meroitic_Cursive, + Meroitic_Hieroglyphs, + Miao, + Misc_Arrows, + Misc_Math_Symbols_A, + Misc_Math_Symbols_B, + Misc_Pictographs, + Misc_Symbols, + Misc_Symbols_Sup, + Misc_Technical, + Modi, + Modifier_Letters, + Modifier_Tone_Letters, + Mongolian, + Mongolian_Sup, + Mro, + Multani, + Music, + Myanmar, + Myanmar_Ext_A, + Myanmar_Ext_B, + Myanmar_Ext_C, + Nabataean, + Nag_Mundari, + Nandinagari, + NB, + New_Tai_Lue, + Newa, + NKo, + Number_Forms, + Nushu, + Nyiakeng_Puachue_Hmong, + OCR, + Ogham, + Ol_Chiki, + Ol_Onal, + Old_Hungarian, + Old_Italic, + Old_North_Arabian, + Old_Permic, + Old_Persian, + Old_Sogdian, + Old_South_Arabian, + Old_Turkic, + Old_Uyghur, + Oriya, + Ornamental_Dingbats, + Osage, + Osmanya, + Ottoman_Siyaq_Numbers, + Pahawh_Hmong, + Palmyrene, + Pau_Cin_Hau, + Phags_Pa, + Phaistos, + Phoenician, + Phonetic_Ext, + Phonetic_Ext_Sup, + Playing_Cards, + Psalter_Pahlavi, + PUA, + Punctuation, + Rejang, + Rumi, + Runic, + Samaritan, + Saurashtra, + Sharada, + Sharada_Sup, + Shavian, + Shorthand_Format_Controls, + Siddham, + Sidetic, + Sinhala, + Sinhala_Archaic_Numbers, + Small_Forms, + Small_Kana_Ext, + Sogdian, + Sora_Sompeng, + Soyombo, + Specials, + Sundanese, + Sundanese_Sup, + Sunuwar, + Sup_Arrows_A, + Sup_Arrows_B, + Sup_Arrows_C, + Sup_Math_Operators, + Sup_PUA_A, + Sup_PUA_B, + Sup_Punctuation, + Sup_Symbols_And_Pictographs, + Super_And_Sub, + Sutton_SignWriting, + Syloti_Nagri, + Symbols_And_Pictographs_Ext_A, + Symbols_For_Legacy_Computing, + Symbols_For_Legacy_Computing_Sup, + Syriac, + Syriac_Sup, + Tagalog, + Tagbanwa, + Tags, + Tai_Le, + Tai_Tham, + Tai_Viet, + Tai_Xuan_Jing, + Tai_Yo, + Takri, + Tamil, + Tamil_Sup, + Tangsa, + Tangut, + Tangut_Components, + Tangut_Components_Sup, + Tangut_Sup, + Telugu, + Thaana, + Thai, + Tibetan, + Tifinagh, + Tirhuta, + Todhri, + Tolong_Siki, + Toto, + Transport_And_Map, + Tulu_Tigalari, + UCAS, + UCAS_Ext, + UCAS_Ext_A, + Ugaritic, + Vai, + Vedic_Ext, + Vertical_Forms, + Vithkuqi, + VS, + VS_Sup, + Wancho, + Warang_Citi, + Yezidi, + Yi_Radicals, + Yi_Syllables, + Yijing, + Zanabazar_Square, + Znamenny_Music, +} + +Combining_Class :: distinct byte + +Paired_Brack_Type :: enum { + Nil, + Open, + Close, + None, +} + +Bidi_Class :: enum { + Nil, // + L, // Left-to-Right LRM + R, // Right-to-Left RLM + AL, // Right-to-Left Arabic ALM + EN, // European Number + ES, // European Number Separator + ET, // European Number Terminator + AN, // Arabic Number + CS, // Common Number Separator + NSM, // Nonspacing Mark + BN, // Boundary Neutral + B, // Paragraph Separator + S, // Segment Separator + WS, // Whitespace + ON, // Other Neutrals + LRE, // Left-to-Right Embedding LRE + LRO, // Left-to-Right Override LRO + RLE, // Right-to-Left Embedding RLE + RLO, // Right-to-Left Override RLO + PDF, // Pop Directional Format PDF + LRI, // Left-to-Right Isolate LRI + RLI, // Right-to-Left Isolate RLI + FSI, // First Strong Isolate FSI + PDI, // Pop Directional Isolate PDI +} + + +Bidi :: struct { + bc: Bidi_Class, + bmg: Maybe(rune), // mirrored glyph + m: bool, // Bidi mirrored + c: bool, // Bidi control property + bpt : Paired_Brack_Type, // bidi paired bracket type + bpb : rune, // bidi paired bracket properties +} + + +Decomposition_Type :: enum { + Nil = 0, + can, + com, + enc, + fin, + font, + fra, + init, + iso, + med, + nar, + nb, + sml, + sqr, + sub, + sup, + vert, + wid, + none, +} + +Trinary_Bool :: enum { + Maybe = -1, + False = 0, + True = 1, +} + +Decomposition_Mapping :: distinct [dynamic]rune + +Decomposition :: struct { + dt: Decomposition_Type, // Decomposition type + dm: Decomposition_Mapping, // Decomposition Mapping + ce: bool, // Composition Exclusion + comp_ex: bool, // Full Composition Exclusion + nfc_quick_check: Trinary_Bool, + nfd_quick_check: bool, + nfkc_quick_check: Trinary_Bool, + nfkd_quick_check: bool, +} + +Numeric_Type :: enum { + None = 0, // None + Decimal, // De + Digit, // Di + Numeric, // Nu +} + +/* +Note: Value is NAN when numberator and denominator ar 0 +*/ +Numberic_Value :: struct { + numerator: int, + denominator: int, +} + +Char :: struct { + cp: rune, + name: string, + gc: General_Category, + ccc: Combining_Class, + bc: Bidi_Class, + dt: Decomposition_Type, + dm: Decomposition_Mapping, + nt: Numeric_Type, + nv: Numberic_Value, + bm: bool, + name1: string, + sum: string, // Simple uppercase mapping + slm: string, // Simple lowercase mapping + stm: string, // Simple titlecase_mapping +} + +Char_Range :: struct { + first_cp: rune, + last_cp: rune, + name: string, + gc: General_Category, + ccc: Combining_Class, + bc: Bidi_Class, + dt: Decomposition_Type, + dm: Decomposition_Mapping, + nt: Numeric_Type, + nv: Numberic_Value, + bm: bool, + name1: string, + sum: string, // Simple uppercase mapping + slm: string, // Simple lowercase mapping + stm: string, // Simple titlecase_mapping +} + +Chars :: union { + Char, + Char_Range, +} + +Unicode_Data :: distinct [dynamic]Chars + + +PropList_Property :: enum { + White_Space, + Bidi_Control, + Join_Control, + Dash, + Hyphen, + Quotation_Mark, + Terminal_Punctuation, + Other_Math, + Hex_Digit, + ASCII_Hex_Digit, + Other_Alphabetic, + Ideographic, + Diacritic, + Extender, + Other_Lowercase, + Other_Uppercase, + Noncharacter_Code_Point, + Other_Grapheme_Extend, + IDS_Binary_Operator, + IDS_Trinary_Operator, + IDS_Unary_Operator, + Radical, + Unified_Ideograph, + Other_Default_Ignorable_Code_Point, + Deprecated, + Soft_Dotted, + Logical_Order_Exception, + Other_ID_Start, + Other_ID_Continue, + ID_Compat_Math_Continue, + ID_Compat_Math_Start, + Sentence_Terminal, + Variation_Selector, + Pattern_White_Space, + Pattern_Syntax, + Prepended_Concatenation_Mark, + Regional_Indicator, + Modifier_Combining_Mark, +} + +UCD_Error :: enum { + XML_LOAD_ERROR, + XML_Not_UCD, + Nil_XML_Document, + Element_Not_Repertoire, + Extra_Fields, + Unknown_Property, + + NO_REPERTOIRE, + UNEXPECTED_STRING, + Invalid_Hex_Number, + Invalid_General_Category, + UnicodeData_6_Too_Long, + UnicodeData_6_Invalid, + UnicodeData_7_Too_Long, + UnicodeData_7_Invalid, +} + + +Error :: union #shared_nil { + UCD_Error, + os.Error, +} + +Range_u16 :: struct { + first: u16, + last: u16, +} + +Range_i32 :: struct { + first: i32, + last: i32, +} + +Range_Rune :: struct { + first: rune, + last: rune, +} + +Dynamic_Range :: struct { + single_16 : [dynamic]u16, + ranges_16 : [dynamic]Range_u16, + single_32 : [dynamic]i32, + ranges_32 : [dynamic]Range_i32, +} + +append_to_dynamic_range :: proc( + dr: ^Dynamic_Range, + range: Range_Rune, + allocator := context.allocator, +) { + if range.first == range.last && range.first <= 0xFFFF { + if len(dr.single_16) == 0 { + dr.single_16 = make([dynamic]u16, 0, 512, allocator) + } + append(&dr.single_16, cast(u16) range.first) + } else if range.first == range.last { + if len(dr.single_32) == 0 { + dr.single_32 = make([dynamic]i32, 0, 512, allocator) + } + append(&dr.single_32, cast(i32) range.first) + + } else if range.first <= 0xFFFF && range.last <= 0xFFFF { + if len(dr.ranges_16) == 0 { + dr.ranges_16 = make([dynamic]Range_u16, 0, 128, allocator) + } + r := Range_u16{ cast(u16)range.first, cast(u16) range.last} + append(&dr.ranges_16, r) + + } else { + if len(dr.ranges_32) == 0 { + dr.ranges_32 = make([dynamic]Range_i32, 0, 128, allocator) + } + r := Range_i32{ cast(i32)range.first, cast(i32) range.last} + append(&dr.ranges_32, r) + } +} + +destroy_dynamic_range :: proc ( + dr: Dynamic_Range, +){ + delete(dr.ranges_16) + delete(dr.ranges_32) + delete(dr.single_16) + delete(dr.single_32) +} + +destroy_general_category_ranges :: proc( + gcr: [General_Category]Dynamic_Range, +){ + for r in gcr { + destroy_dynamic_range(r) + } +} diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin new file mode 100644 index 000000000..d46ae37cb --- /dev/null +++ b/core/unicode/tools/ucd/ucd.odin @@ -0,0 +1,307 @@ +package ucd + +import "core:strings" +import "core:os" + +load_unicode_data :: proc( + filename: string, + allocator := context.allocator, +) -> (unicode_data : Unicode_Data, err: Error) { + + data, os_error := os.read_entire_file(filename, context.temp_allocator) + if os_error != nil { + err = os_error + return + } + defer free_all(context.temp_allocator) + + line_iter := Line_Iterator{data = data } + first_cp: rune + + line_loop: for line, line_num in line_iterator(&line_iter) { + // Skip empty lines + if len(line) == 0 do continue + + field_iter := Field_Iterator{line = line} + is_range := false + cp: rune + name: string + gc: General_Category + + num_6 : string + num_7 : string + nt := Numeric_Type.None + nv : Numberic_Value + + for field, field_num in field_iterator(&field_iter) { + switch field_num { + case 0: // Code point + cp = 0 + + for c in field { + if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') do break + cp *= 16 + cp += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') + cp += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + } + + case 1: // Name + if len(field) > 9 && field[0] == '<' && strings.ends_with(transmute(string) field, ", First>") { + first_cp = cp + continue line_loop + } + + if len(field) > 9 && field[0] == '<' && strings.ends_with(transmute(string) field, ", Last>") { + name = strings.clone_from_bytes(field[1:len(field)-7], allocator) + is_range = true + } else { + name = strings.clone_from_bytes(field[:], allocator) + } + + case 2: // General_Category + // NOTE: This is currently igorning a possible error it should probably be fixed + gc, _ = string_to_general_category(transmute(string)field) + + case 3: // Canonical_Combining_Class + case 4: // Bidi Class + case 5: // Decomposition_Type and Decomposition_Mapping + // Numeric_Type and Numberic_Value + case 6: + num_6 = transmute(string)field + + case 7: + num_7 = transmute(string)field + + case 8: + switch { + case num_6 != "" && num_7 != "" && transmute(string) field != "" : + nt = .Decimal + + case num_6 == "" && num_7 != "" && transmute(string) field != "" : + nt = .Digit + + case num_6 == "" && num_7 == "" && transmute(string) field != "" : + nt = .Numeric + + case: + nt = .None + } + + case 9: // Bidi mirrored + case 10: // Unicode 1 Name (Obsolete as of 6.2.0) + case 11: // should be null + case 12: + case 13: + case 14: + case: + unreachable() + } + } + + if is_range { + cr : Char_Range + cr.gc = gc + cr.first_cp = first_cp + cr.last_cp = cp + cr.name = name + cr.nt = nt + append(&unicode_data, cr) + } else { + c : Char + c.gc = gc + c.cp = cp + c.name = name + c.nt = nt + append(&unicode_data, c) + } + } + return +} + +destroy_unicode_data :: proc(unicode_data: Unicode_Data){ + for point in unicode_data { + switch p in point { + case Char: + delete(p.name) + case Char_Range: + delete(p.name) + } + } + delete(unicode_data) +} + + +gc_ranges :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (lst: [General_Category]Dynamic_Range) { + range := Range_Rune { + first = -1, + last = -1, + } + gc: General_Category + + for point in ud { + switch p in point { + case Char: + if range.first != -1 && (p.cp != range.last + 1 || p.gc != gc) { + append_to_dynamic_range(&lst[gc], range, allocator) + range.first = -1 + range.last = -1 + } + + range.first = transmute(rune) min(transmute(u32)range.first, transmute(u32)p.cp) + gc = p.gc + range.last = p.cp + + case Char_Range: + if range.first != -1 do append_to_dynamic_range(&lst[gc], range, allocator) + + range.first = p.first_cp + range.last = p.last_cp + append_to_dynamic_range(&lst[p.gc], range ,allocator) + range.first = -1 + range.last = -1 + } + } + if range.first != -1 do append_to_dynamic_range(&lst[gc], range, allocator) + + return +} + + +extra_digits :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (Dynamic_Range) { + range := Range_Rune { + first = -1, + last = -1, + } + + exd: Dynamic_Range + for point in ud { + switch p in point { + + case Char: + exd_type := p.gc != .Nd && (p.nt == .Decimal || p.nt == .Digit) + + if range.first != -1 && (p.cp != range.last + 1 || !exd_type) { + append_to_dynamic_range(&exd, range, allocator) + range.first = -1 + range.last = -1 + } + + if exd_type { + range.first = transmute(rune) min(transmute(u32)range.first, transmute(u32)p.cp) + range.last = p.cp + } + + case Char_Range: + exd_type := p.gc != .Nd && (p.nt == .Decimal || p.nt == .Digit) + + if range.first != -1 do append_to_dynamic_range(&exd, range, allocator) + + if exd_type { + range.first = p.first_cp + range.last = p.last_cp + append_to_dynamic_range(&exd, range ,allocator) + } + range.first = -1 + range.last = -1 + } + } + if range.first != -1 do append_to_dynamic_range(&exd, range, allocator) + + return exd +} + +/* +Data containted in the Unicode fiel PropList.txt + +A `PropList` is the data containted in the Unicode Database (UCD) file +PropList.txt. It is created with the procedure `load_property_list` and +destroy with the procedure `destroy_property_list`. +*/ +PropList ::[PropList_Property]Dynamic_Range + +/* +This function destroys a `PropList` created by `load_property_list`. + +Inputs: +- props: The PropList to destroy +*/ +destroy_protperty_list :: proc( + props: [PropList_Property]Dynamic_Range, +){ + for r in props { + delete(r.ranges_16) + delete(r.ranges_32) + delete(r.single_16) + delete(r.single_32) + } +} + +load_protperty_list :: proc ( + filename : string, + allocator := context.allocator, +) -> (props: [PropList_Property]Dynamic_Range, err: Error) { + + data, os_error := os.read_entire_file(filename, allocator) + if os_error != nil { + err = os_error + return + } + defer delete(data) + + line_iter := Line_Iterator{ + data = data + } + for line in line_iterator(&line_iter) { + if len(line) == 0 do continue + field_iter := Field_Iterator{ line = line} + + is_range: bool + + rr : Range_Rune + + prop: PropList_Property + for field, i in field_iterator(&field_iter) { + switch i { + case 0: // Code point or code point range + for c in field { + if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') { + if c == '.' { + is_range = true + continue + } else { + err = UCD_Error.Invalid_Hex_Number + return + } + } + if is_range { + rr.first *= 16 + rr.first += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') + rr.first += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + rr.last = rr.first + } else { + rr.last *= 16 + rr.last += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') + rr.last += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + } + } + + case 1: + prop, err = string_to_proplist_property(transmute(string)field) + if err != nil { + return + } + + case: + err = UCD_Error.Extra_Fields + return + } + } + + append_to_dynamic_range(&props[prop], rr, allocator) + } + + return +} + + + From 9d038b23ec00b722f549fb6c86bf48d3aef5d319 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 17:41:55 -0500 Subject: [PATCH 616/766] Add generated tables to core/unicode --- core/unicode/generated.odin | 1272 +++++++++++++++++++++++++++++++++++ 1 file changed, 1272 insertions(+) create mode 100644 core/unicode/generated.odin diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin new file mode 100644 index 000000000..28d2cf7e1 --- /dev/null +++ b/core/unicode/generated.odin @@ -0,0 +1,1272 @@ +package unicode + +/* + ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ +*/ + +/* + This file is generated from UnicodeData.txt and PropList.txt. These files + are part of the Unicode Database (UCD) and are covered by the license + listed further down. They may be downloaded from the following locations; + + https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt + https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt + https://www.unicode.org/license.txt + + ------------------------------------------------------------------------------ + UNICODE LICENSE V3 + + COPYRIGHT AND PERMISSION NOTICE + + Copyright © 1991-2026 Unicode, Inc. + + NOTICE TO USER: Carefully read the following legal agreement. BY + DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR + SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE + TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT + DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of data files and any associated documentation (the "Data Files") or + software and any associated documentation (the "Software") to deal in the + Data Files or Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, and/or sell + copies of the Data Files or Software, and to permit persons to whom the + Data Files or Software are furnished to do so, provided that either (a) + this copyright and permission notice appear with all copies of the Data + Files or Software, or (b) this copyright and permission notice appear in + associated Documentation. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + THIRD PARTY RIGHTS. + + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE + BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, + OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA + FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder shall + not be used in advertising or otherwise to promote the sale, use or other + dealings in these Data Files or Software without prior written + authorization of the copyright holder. + +*/ + +Range :: struct { + single_16 : []u16, + ranges_16 : []u16, + single_32 : []i32, + ranges_32 : []i32, +} + +@(rodata) +ll_singles16 := [?]u16{ + 0x00B5, 0x0101, 0x0103, 0x0105, 0x0107, 0x0109, 0x010B, 0x010D, 0x010F, 0x0111, + 0x0113, 0x0115, 0x0117, 0x0119, 0x011B, 0x011D, 0x011F, 0x0121, 0x0123, 0x0125, + 0x0127, 0x0129, 0x012B, 0x012D, 0x012F, 0x0131, 0x0133, 0x0135, 0x013A, 0x013C, + 0x013E, 0x0140, 0x0142, 0x0144, 0x0146, 0x014B, 0x014D, 0x014F, 0x0151, 0x0153, + 0x0155, 0x0157, 0x0159, 0x015B, 0x015D, 0x015F, 0x0161, 0x0163, 0x0165, 0x0167, + 0x0169, 0x016B, 0x016D, 0x016F, 0x0171, 0x0173, 0x0175, 0x0177, 0x017A, 0x017C, + 0x0183, 0x0185, 0x0188, 0x0192, 0x0195, 0x019E, 0x01A1, 0x01A3, 0x01A5, 0x01A8, + 0x01AD, 0x01B0, 0x01B4, 0x01B6, 0x01C6, 0x01C9, 0x01CC, 0x01CE, 0x01D0, 0x01D2, + 0x01D4, 0x01D6, 0x01D8, 0x01DA, 0x01DF, 0x01E1, 0x01E3, 0x01E5, 0x01E7, 0x01E9, + 0x01EB, 0x01ED, 0x01F3, 0x01F5, 0x01F9, 0x01FB, 0x01FD, 0x01FF, 0x0201, 0x0203, + 0x0205, 0x0207, 0x0209, 0x020B, 0x020D, 0x020F, 0x0211, 0x0213, 0x0215, 0x0217, + 0x0219, 0x021B, 0x021D, 0x021F, 0x0221, 0x0223, 0x0225, 0x0227, 0x0229, 0x022B, + 0x022D, 0x022F, 0x0231, 0x023C, 0x0242, 0x0247, 0x0249, 0x024B, 0x024D, 0x0371, + 0x0373, 0x0377, 0x0390, 0x03D9, 0x03DB, 0x03DD, 0x03DF, 0x03E1, 0x03E3, 0x03E5, + 0x03E7, 0x03E9, 0x03EB, 0x03ED, 0x03F5, 0x03F8, 0x0461, 0x0463, 0x0465, 0x0467, + 0x0469, 0x046B, 0x046D, 0x046F, 0x0471, 0x0473, 0x0475, 0x0477, 0x0479, 0x047B, + 0x047D, 0x047F, 0x0481, 0x048B, 0x048D, 0x048F, 0x0491, 0x0493, 0x0495, 0x0497, + 0x0499, 0x049B, 0x049D, 0x049F, 0x04A1, 0x04A3, 0x04A5, 0x04A7, 0x04A9, 0x04AB, + 0x04AD, 0x04AF, 0x04B1, 0x04B3, 0x04B5, 0x04B7, 0x04B9, 0x04BB, 0x04BD, 0x04BF, + 0x04C2, 0x04C4, 0x04C6, 0x04C8, 0x04CA, 0x04CC, 0x04D1, 0x04D3, 0x04D5, 0x04D7, + 0x04D9, 0x04DB, 0x04DD, 0x04DF, 0x04E1, 0x04E3, 0x04E5, 0x04E7, 0x04E9, 0x04EB, + 0x04ED, 0x04EF, 0x04F1, 0x04F3, 0x04F5, 0x04F7, 0x04F9, 0x04FB, 0x04FD, 0x04FF, + 0x0501, 0x0503, 0x0505, 0x0507, 0x0509, 0x050B, 0x050D, 0x050F, 0x0511, 0x0513, + 0x0515, 0x0517, 0x0519, 0x051B, 0x051D, 0x051F, 0x0521, 0x0523, 0x0525, 0x0527, + 0x0529, 0x052B, 0x052D, 0x052F, 0x1C8A, 0x1E01, 0x1E03, 0x1E05, 0x1E07, 0x1E09, + 0x1E0B, 0x1E0D, 0x1E0F, 0x1E11, 0x1E13, 0x1E15, 0x1E17, 0x1E19, 0x1E1B, 0x1E1D, + 0x1E1F, 0x1E21, 0x1E23, 0x1E25, 0x1E27, 0x1E29, 0x1E2B, 0x1E2D, 0x1E2F, 0x1E31, + 0x1E33, 0x1E35, 0x1E37, 0x1E39, 0x1E3B, 0x1E3D, 0x1E3F, 0x1E41, 0x1E43, 0x1E45, + 0x1E47, 0x1E49, 0x1E4B, 0x1E4D, 0x1E4F, 0x1E51, 0x1E53, 0x1E55, 0x1E57, 0x1E59, + 0x1E5B, 0x1E5D, 0x1E5F, 0x1E61, 0x1E63, 0x1E65, 0x1E67, 0x1E69, 0x1E6B, 0x1E6D, + 0x1E6F, 0x1E71, 0x1E73, 0x1E75, 0x1E77, 0x1E79, 0x1E7B, 0x1E7D, 0x1E7F, 0x1E81, + 0x1E83, 0x1E85, 0x1E87, 0x1E89, 0x1E8B, 0x1E8D, 0x1E8F, 0x1E91, 0x1E93, 0x1E9F, + 0x1EA1, 0x1EA3, 0x1EA5, 0x1EA7, 0x1EA9, 0x1EAB, 0x1EAD, 0x1EAF, 0x1EB1, 0x1EB3, + 0x1EB5, 0x1EB7, 0x1EB9, 0x1EBB, 0x1EBD, 0x1EBF, 0x1EC1, 0x1EC3, 0x1EC5, 0x1EC7, + 0x1EC9, 0x1ECB, 0x1ECD, 0x1ECF, 0x1ED1, 0x1ED3, 0x1ED5, 0x1ED7, 0x1ED9, 0x1EDB, + 0x1EDD, 0x1EDF, 0x1EE1, 0x1EE3, 0x1EE5, 0x1EE7, 0x1EE9, 0x1EEB, 0x1EED, 0x1EEF, + 0x1EF1, 0x1EF3, 0x1EF5, 0x1EF7, 0x1EF9, 0x1EFB, 0x1EFD, 0x1FBE, 0x210A, 0x2113, + 0x212F, 0x2134, 0x2139, 0x214E, 0x2184, 0x2C61, 0x2C68, 0x2C6A, 0x2C6C, 0x2C71, + 0x2C81, 0x2C83, 0x2C85, 0x2C87, 0x2C89, 0x2C8B, 0x2C8D, 0x2C8F, 0x2C91, 0x2C93, + 0x2C95, 0x2C97, 0x2C99, 0x2C9B, 0x2C9D, 0x2C9F, 0x2CA1, 0x2CA3, 0x2CA5, 0x2CA7, + 0x2CA9, 0x2CAB, 0x2CAD, 0x2CAF, 0x2CB1, 0x2CB3, 0x2CB5, 0x2CB7, 0x2CB9, 0x2CBB, + 0x2CBD, 0x2CBF, 0x2CC1, 0x2CC3, 0x2CC5, 0x2CC7, 0x2CC9, 0x2CCB, 0x2CCD, 0x2CCF, + 0x2CD1, 0x2CD3, 0x2CD5, 0x2CD7, 0x2CD9, 0x2CDB, 0x2CDD, 0x2CDF, 0x2CE1, 0x2CEC, + 0x2CEE, 0x2CF3, 0x2D27, 0x2D2D, 0xA641, 0xA643, 0xA645, 0xA647, 0xA649, 0xA64B, + 0xA64D, 0xA64F, 0xA651, 0xA653, 0xA655, 0xA657, 0xA659, 0xA65B, 0xA65D, 0xA65F, + 0xA661, 0xA663, 0xA665, 0xA667, 0xA669, 0xA66B, 0xA66D, 0xA681, 0xA683, 0xA685, + 0xA687, 0xA689, 0xA68B, 0xA68D, 0xA68F, 0xA691, 0xA693, 0xA695, 0xA697, 0xA699, + 0xA69B, 0xA723, 0xA725, 0xA727, 0xA729, 0xA72B, 0xA72D, 0xA733, 0xA735, 0xA737, + 0xA739, 0xA73B, 0xA73D, 0xA73F, 0xA741, 0xA743, 0xA745, 0xA747, 0xA749, 0xA74B, + 0xA74D, 0xA74F, 0xA751, 0xA753, 0xA755, 0xA757, 0xA759, 0xA75B, 0xA75D, 0xA75F, + 0xA761, 0xA763, 0xA765, 0xA767, 0xA769, 0xA76B, 0xA76D, 0xA76F, 0xA77A, 0xA77C, + 0xA77F, 0xA781, 0xA783, 0xA785, 0xA787, 0xA78C, 0xA78E, 0xA791, 0xA797, 0xA799, + 0xA79B, 0xA79D, 0xA79F, 0xA7A1, 0xA7A3, 0xA7A5, 0xA7A7, 0xA7A9, 0xA7AF, 0xA7B5, + 0xA7B7, 0xA7B9, 0xA7BB, 0xA7BD, 0xA7BF, 0xA7C1, 0xA7C3, 0xA7C8, 0xA7CA, 0xA7CD, + 0xA7CF, 0xA7D1, 0xA7D3, 0xA7D5, 0xA7D7, 0xA7D9, 0xA7DB, 0xA7F6, 0xA7FA, +} + +@(rodata) +ll_ranges16 := [?]u16{ + 0x0061, 0x007A, + 0x00DF, 0x00F6, + 0x00F8, 0x00FF, + 0x0137, 0x0138, + 0x0148, 0x0149, + 0x017E, 0x0180, + 0x018C, 0x018D, + 0x0199, 0x019B, + 0x01AA, 0x01AB, + 0x01B9, 0x01BA, + 0x01BD, 0x01BF, + 0x01DC, 0x01DD, + 0x01EF, 0x01F0, + 0x0233, 0x0239, + 0x023F, 0x0240, + 0x024F, 0x0293, + 0x0296, 0x02AF, + 0x037B, 0x037D, + 0x03AC, 0x03CE, + 0x03D0, 0x03D1, + 0x03D5, 0x03D7, + 0x03EF, 0x03F3, + 0x03FB, 0x03FC, + 0x0430, 0x045F, + 0x04CE, 0x04CF, + 0x0560, 0x0588, + 0x10D0, 0x10FA, + 0x10FD, 0x10FF, + 0x13F8, 0x13FD, + 0x1C80, 0x1C88, + 0x1D00, 0x1D2B, + 0x1D6B, 0x1D77, + 0x1D79, 0x1D9A, + 0x1E95, 0x1E9D, + 0x1EFF, 0x1F07, + 0x1F10, 0x1F15, + 0x1F20, 0x1F27, + 0x1F30, 0x1F37, + 0x1F40, 0x1F45, + 0x1F50, 0x1F57, + 0x1F60, 0x1F67, + 0x1F70, 0x1F7D, + 0x1F80, 0x1F87, + 0x1F90, 0x1F97, + 0x1FA0, 0x1FA7, + 0x1FB0, 0x1FB4, + 0x1FB6, 0x1FB7, + 0x1FC2, 0x1FC4, + 0x1FC6, 0x1FC7, + 0x1FD0, 0x1FD3, + 0x1FD6, 0x1FD7, + 0x1FE0, 0x1FE7, + 0x1FF2, 0x1FF4, + 0x1FF6, 0x1FF7, + 0x210E, 0x210F, + 0x213C, 0x213D, + 0x2146, 0x2149, + 0x2C30, 0x2C5F, + 0x2C65, 0x2C66, + 0x2C73, 0x2C74, + 0x2C76, 0x2C7B, + 0x2CE3, 0x2CE4, + 0x2D00, 0x2D25, + 0xA72F, 0xA731, + 0xA771, 0xA778, + 0xA793, 0xA795, + 0xAB30, 0xAB5A, + 0xAB60, 0xAB68, + 0xAB70, 0xABBF, + 0xFB00, 0xFB06, + 0xFB13, 0xFB17, + 0xFF41, 0xFF5A, +} + +@(rodata) +ll_singles32 := [?]i32{ + 0x1D4BB, 0x1D7CB, +} + +@(rodata) +ll_ranges32 := [?]i32{ + 0x10428, 0x1044F, + 0x104D8, 0x104FB, + 0x10597, 0x105A1, + 0x105A3, 0x105B1, + 0x105B3, 0x105B9, + 0x105BB, 0x105BC, + 0x10CC0, 0x10CF2, + 0x10D70, 0x10D85, + 0x118C0, 0x118DF, + 0x16E60, 0x16E7F, + 0x16EBB, 0x16ED3, + 0x1D41A, 0x1D433, + 0x1D44E, 0x1D454, + 0x1D456, 0x1D467, + 0x1D482, 0x1D49B, + 0x1D4B6, 0x1D4B9, + 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D4CF, + 0x1D4EA, 0x1D503, + 0x1D51E, 0x1D537, + 0x1D552, 0x1D56B, + 0x1D586, 0x1D59F, + 0x1D5BA, 0x1D5D3, + 0x1D5EE, 0x1D607, + 0x1D622, 0x1D63B, + 0x1D656, 0x1D66F, + 0x1D68A, 0x1D6A5, + 0x1D6C2, 0x1D6DA, + 0x1D6DC, 0x1D6E1, + 0x1D6FC, 0x1D714, + 0x1D716, 0x1D71B, + 0x1D736, 0x1D74E, + 0x1D750, 0x1D755, + 0x1D770, 0x1D788, + 0x1D78A, 0x1D78F, + 0x1D7AA, 0x1D7C2, + 0x1D7C4, 0x1D7C9, + 0x1DF00, 0x1DF09, + 0x1DF0B, 0x1DF1E, + 0x1DF25, 0x1DF2A, + 0x1E922, 0x1E943, +} + +ll_ranges := Range{ + single_16 = ll_singles16[:], + ranges_16 = ll_ranges16[:], + single_32 = ll_singles32[:], + ranges_32 = ll_ranges32[:], +} + +@(rodata) +lm_singles16 := [?]u16{ + 0x02EC, 0x02EE, 0x0374, 0x037A, 0x0559, 0x0640, 0x07FA, 0x081A, 0x0824, 0x0828, + 0x08C9, 0x0971, 0x0E46, 0x0EC6, 0x10FC, 0x17D7, 0x1843, 0x1AA7, 0x1D78, 0x2071, + 0x207F, 0x2D6F, 0x2E2F, 0x3005, 0x303B, 0xA015, 0xA60C, 0xA67F, 0xA770, 0xA788, + 0xA9CF, 0xA9E6, 0xAA70, 0xAADD, 0xAB69, 0xFF70, +} + +@(rodata) +lm_ranges16 := [?]u16{ + 0x02B0, 0x02C1, + 0x02C6, 0x02D1, + 0x02E0, 0x02E4, + 0x06E5, 0x06E6, + 0x07F4, 0x07F5, + 0x1C78, 0x1C7D, + 0x1D2C, 0x1D6A, + 0x1D9B, 0x1DBF, + 0x2090, 0x209C, + 0x2C7C, 0x2C7D, + 0x3031, 0x3035, + 0x309D, 0x309E, + 0x30FC, 0x30FE, + 0xA4F8, 0xA4FD, + 0xA69C, 0xA69D, + 0xA717, 0xA71F, + 0xA7F1, 0xA7F4, + 0xA7F8, 0xA7F9, + 0xAAF3, 0xAAF4, + 0xAB5C, 0xAB5F, + 0xFF9E, 0xFF9F, +} + +@(rodata) +lm_singles32 := [?]i32{ + 0x10D4E, 0x10D6F, 0x10EC5, 0x11DD9, 0x16FE3, 0x1E4EB, 0x1E6FF, 0x1E94B, +} + +@(rodata) +lm_ranges32 := [?]i32{ + 0x10780, 0x10785, + 0x10787, 0x107B0, + 0x107B2, 0x107BA, + 0x16B40, 0x16B43, + 0x16D40, 0x16D42, + 0x16D6B, 0x16D6C, + 0x16F93, 0x16F9F, + 0x16FE0, 0x16FE1, + 0x16FF2, 0x16FF3, + 0x1AFF0, 0x1AFF3, + 0x1AFF5, 0x1AFFB, + 0x1AFFD, 0x1AFFE, + 0x1E030, 0x1E06D, + 0x1E137, 0x1E13D, +} + +lm_ranges := Range{ + single_16 = lm_singles16[:], + ranges_16 = lm_ranges16[:], + single_32 = lm_singles32[:], + ranges_32 = lm_ranges32[:], +} + +@(rodata) +lo_singles16 := [?]u16{ + 0x00AA, 0x00BA, 0x01BB, 0x06D5, 0x06FF, 0x0710, 0x07B1, 0x093D, 0x0950, 0x09B2, + 0x09BD, 0x09CE, 0x09FC, 0x0A5E, 0x0ABD, 0x0AD0, 0x0AF9, 0x0B3D, 0x0B71, 0x0B83, + 0x0B9C, 0x0BD0, 0x0C3D, 0x0C80, 0x0CBD, 0x0D3D, 0x0D4E, 0x0DBD, 0x0E84, 0x0EA5, + 0x0EBD, 0x0F00, 0x103F, 0x1061, 0x108E, 0x1258, 0x12C0, 0x17DC, 0x18AA, 0x1CFA, + 0x3006, 0x303C, 0x309F, 0x30FF, 0xA66E, 0xA78F, 0xA7F7, 0xA8FB, 0xAA7A, 0xAAB1, + 0xAAC0, 0xAAC2, 0xAAF2, 0xFB1D, 0xFB3E, +} + +@(rodata) +lo_ranges16 := [?]u16{ + 0x01C0, 0x01C3, + 0x0294, 0x0295, + 0x05D0, 0x05EA, + 0x05EF, 0x05F2, + 0x0620, 0x063F, + 0x0641, 0x064A, + 0x066E, 0x066F, + 0x0671, 0x06D3, + 0x06EE, 0x06EF, + 0x06FA, 0x06FC, + 0x0712, 0x072F, + 0x074D, 0x07A5, + 0x07CA, 0x07EA, + 0x0800, 0x0815, + 0x0840, 0x0858, + 0x0860, 0x086A, + 0x0870, 0x0887, + 0x0889, 0x088F, + 0x08A0, 0x08C8, + 0x0904, 0x0939, + 0x0958, 0x0961, + 0x0972, 0x0980, + 0x0985, 0x098C, + 0x098F, 0x0990, + 0x0993, 0x09A8, + 0x09AA, 0x09B0, + 0x09B6, 0x09B9, + 0x09DC, 0x09DD, + 0x09DF, 0x09E1, + 0x09F0, 0x09F1, + 0x0A05, 0x0A0A, + 0x0A0F, 0x0A10, + 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, + 0x0A32, 0x0A33, + 0x0A35, 0x0A36, + 0x0A38, 0x0A39, + 0x0A59, 0x0A5C, + 0x0A72, 0x0A74, + 0x0A85, 0x0A8D, + 0x0A8F, 0x0A91, + 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, + 0x0AB2, 0x0AB3, + 0x0AB5, 0x0AB9, + 0x0AE0, 0x0AE1, + 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, + 0x0B13, 0x0B28, + 0x0B2A, 0x0B30, + 0x0B32, 0x0B33, + 0x0B35, 0x0B39, + 0x0B5C, 0x0B5D, + 0x0B5F, 0x0B61, + 0x0B85, 0x0B8A, + 0x0B8E, 0x0B90, + 0x0B92, 0x0B95, + 0x0B99, 0x0B9A, + 0x0B9E, 0x0B9F, + 0x0BA3, 0x0BA4, + 0x0BA8, 0x0BAA, + 0x0BAE, 0x0BB9, + 0x0C05, 0x0C0C, + 0x0C0E, 0x0C10, + 0x0C12, 0x0C28, + 0x0C2A, 0x0C39, + 0x0C58, 0x0C5A, + 0x0C5C, 0x0C5D, + 0x0C60, 0x0C61, + 0x0C85, 0x0C8C, + 0x0C8E, 0x0C90, + 0x0C92, 0x0CA8, + 0x0CAA, 0x0CB3, + 0x0CB5, 0x0CB9, + 0x0CDC, 0x0CDE, + 0x0CE0, 0x0CE1, + 0x0CF1, 0x0CF2, + 0x0D04, 0x0D0C, + 0x0D0E, 0x0D10, + 0x0D12, 0x0D3A, + 0x0D54, 0x0D56, + 0x0D5F, 0x0D61, + 0x0D7A, 0x0D7F, + 0x0D85, 0x0D96, + 0x0D9A, 0x0DB1, + 0x0DB3, 0x0DBB, + 0x0DC0, 0x0DC6, + 0x0E01, 0x0E30, + 0x0E32, 0x0E33, + 0x0E40, 0x0E45, + 0x0E81, 0x0E82, + 0x0E86, 0x0E8A, + 0x0E8C, 0x0EA3, + 0x0EA7, 0x0EB0, + 0x0EB2, 0x0EB3, + 0x0EC0, 0x0EC4, + 0x0EDC, 0x0EDF, + 0x0F40, 0x0F47, + 0x0F49, 0x0F6C, + 0x0F88, 0x0F8C, + 0x1000, 0x102A, + 0x1050, 0x1055, + 0x105A, 0x105D, + 0x1065, 0x1066, + 0x106E, 0x1070, + 0x1075, 0x1081, + 0x1100, 0x1248, + 0x124A, 0x124D, + 0x1250, 0x1256, + 0x125A, 0x125D, + 0x1260, 0x1288, + 0x128A, 0x128D, + 0x1290, 0x12B0, + 0x12B2, 0x12B5, + 0x12B8, 0x12BE, + 0x12C2, 0x12C5, + 0x12C8, 0x12D6, + 0x12D8, 0x1310, + 0x1312, 0x1315, + 0x1318, 0x135A, + 0x1380, 0x138F, + 0x1401, 0x166C, + 0x166F, 0x167F, + 0x1681, 0x169A, + 0x16A0, 0x16EA, + 0x16F1, 0x16F8, + 0x1700, 0x1711, + 0x171F, 0x1731, + 0x1740, 0x1751, + 0x1760, 0x176C, + 0x176E, 0x1770, + 0x1780, 0x17B3, + 0x1820, 0x1842, + 0x1844, 0x1878, + 0x1880, 0x1884, + 0x1887, 0x18A8, + 0x18B0, 0x18F5, + 0x1900, 0x191E, + 0x1950, 0x196D, + 0x1970, 0x1974, + 0x1980, 0x19AB, + 0x19B0, 0x19C9, + 0x1A00, 0x1A16, + 0x1A20, 0x1A54, + 0x1B05, 0x1B33, + 0x1B45, 0x1B4C, + 0x1B83, 0x1BA0, + 0x1BAE, 0x1BAF, + 0x1BBA, 0x1BE5, + 0x1C00, 0x1C23, + 0x1C4D, 0x1C4F, + 0x1C5A, 0x1C77, + 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, + 0x1CF5, 0x1CF6, + 0x2135, 0x2138, + 0x2D30, 0x2D67, + 0x2D80, 0x2D96, + 0x2DA0, 0x2DA6, + 0x2DA8, 0x2DAE, + 0x2DB0, 0x2DB6, + 0x2DB8, 0x2DBE, + 0x2DC0, 0x2DC6, + 0x2DC8, 0x2DCE, + 0x2DD0, 0x2DD6, + 0x2DD8, 0x2DDE, + 0x3041, 0x3096, + 0x30A1, 0x30FA, + 0x3105, 0x312F, + 0x3131, 0x318E, + 0x31A0, 0x31BF, + 0x31F0, 0x31FF, + 0x3400, 0x4DBF, + 0x4E00, 0x9FFF, + 0xA000, 0xA014, + 0xA016, 0xA48C, + 0xA4D0, 0xA4F7, + 0xA500, 0xA60B, + 0xA610, 0xA61F, + 0xA62A, 0xA62B, + 0xA6A0, 0xA6E5, + 0xA7FB, 0xA801, + 0xA803, 0xA805, + 0xA807, 0xA80A, + 0xA80C, 0xA822, + 0xA840, 0xA873, + 0xA882, 0xA8B3, + 0xA8F2, 0xA8F7, + 0xA8FD, 0xA8FE, + 0xA90A, 0xA925, + 0xA930, 0xA946, + 0xA960, 0xA97C, + 0xA984, 0xA9B2, + 0xA9E0, 0xA9E4, + 0xA9E7, 0xA9EF, + 0xA9FA, 0xA9FE, + 0xAA00, 0xAA28, + 0xAA40, 0xAA42, + 0xAA44, 0xAA4B, + 0xAA60, 0xAA6F, + 0xAA71, 0xAA76, + 0xAA7E, 0xAAAF, + 0xAAB5, 0xAAB6, + 0xAAB9, 0xAABD, + 0xAADB, 0xAADC, + 0xAAE0, 0xAAEA, + 0xAB01, 0xAB06, + 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, + 0xAB20, 0xAB26, + 0xAB28, 0xAB2E, + 0xABC0, 0xABE2, + 0xAC00, 0xD7A3, + 0xD7B0, 0xD7C6, + 0xD7CB, 0xD7FB, + 0xF900, 0xFA6D, + 0xFA70, 0xFAD9, + 0xFB1F, 0xFB28, + 0xFB2A, 0xFB36, + 0xFB38, 0xFB3C, + 0xFB40, 0xFB41, + 0xFB43, 0xFB44, + 0xFB46, 0xFBB1, + 0xFBD3, 0xFD3D, + 0xFD50, 0xFD8F, + 0xFD92, 0xFDC7, + 0xFDF0, 0xFDFB, + 0xFE70, 0xFE74, + 0xFE76, 0xFEFC, + 0xFF66, 0xFF6F, + 0xFF71, 0xFF9D, + 0xFFA0, 0xFFBE, + 0xFFC2, 0xFFC7, + 0xFFCA, 0xFFCF, + 0xFFD2, 0xFFD7, + 0xFFDA, 0xFFDC, +} + +@(rodata) +lo_singles32 := [?]i32{ + 0x10808, 0x1083C, 0x10A00, 0x10D4F, 0x10F27, 0x11075, 0x11144, 0x11147, + 0x11176, 0x111DA, 0x111DC, 0x11288, 0x1133D, 0x11350, 0x1138B, 0x1138E, + 0x113B7, 0x113D1, 0x113D3, 0x114C7, 0x11644, 0x116B8, 0x11909, 0x1193F, + 0x11941, 0x119E1, 0x119E3, 0x11A00, 0x11A3A, 0x11A50, 0x11A9D, 0x11C40, + 0x11D46, 0x11D98, 0x11F02, 0x11FB0, 0x16F50, 0x18CFF, 0x1B132, 0x1B155, + 0x1DF0A, 0x1E14E, 0x1E5F0, 0x1E6FE, 0x1EE24, 0x1EE27, 0x1EE39, 0x1EE3B, + 0x1EE42, 0x1EE47, 0x1EE49, 0x1EE4B, 0x1EE54, 0x1EE57, 0x1EE59, 0x1EE5B, + 0x1EE5D, 0x1EE5F, 0x1EE64, 0x1EE7E, +} + +@(rodata) +lo_ranges32 := [?]i32{ + 0x10000, 0x1000B, + 0x1000D, 0x10026, + 0x10028, 0x1003A, + 0x1003C, 0x1003D, + 0x1003F, 0x1004D, + 0x10050, 0x1005D, + 0x10080, 0x100FA, + 0x10280, 0x1029C, + 0x102A0, 0x102D0, + 0x10300, 0x1031F, + 0x1032D, 0x10340, + 0x10342, 0x10349, + 0x10350, 0x10375, + 0x10380, 0x1039D, + 0x103A0, 0x103C3, + 0x103C8, 0x103CF, + 0x10450, 0x1049D, + 0x10500, 0x10527, + 0x10530, 0x10563, + 0x105C0, 0x105F3, + 0x10600, 0x10736, + 0x10740, 0x10755, + 0x10760, 0x10767, + 0x10800, 0x10805, + 0x1080A, 0x10835, + 0x10837, 0x10838, + 0x1083F, 0x10855, + 0x10860, 0x10876, + 0x10880, 0x1089E, + 0x108E0, 0x108F2, + 0x108F4, 0x108F5, + 0x10900, 0x10915, + 0x10920, 0x10939, + 0x10940, 0x10959, + 0x10980, 0x109B7, + 0x109BE, 0x109BF, + 0x10A10, 0x10A13, + 0x10A15, 0x10A17, + 0x10A19, 0x10A35, + 0x10A60, 0x10A7C, + 0x10A80, 0x10A9C, + 0x10AC0, 0x10AC7, + 0x10AC9, 0x10AE4, + 0x10B00, 0x10B35, + 0x10B40, 0x10B55, + 0x10B60, 0x10B72, + 0x10B80, 0x10B91, + 0x10C00, 0x10C48, + 0x10D00, 0x10D23, + 0x10D4A, 0x10D4D, + 0x10E80, 0x10EA9, + 0x10EB0, 0x10EB1, + 0x10EC2, 0x10EC4, + 0x10EC6, 0x10EC7, + 0x10F00, 0x10F1C, + 0x10F30, 0x10F45, + 0x10F70, 0x10F81, + 0x10FB0, 0x10FC4, + 0x10FE0, 0x10FF6, + 0x11003, 0x11037, + 0x11071, 0x11072, + 0x11083, 0x110AF, + 0x110D0, 0x110E8, + 0x11103, 0x11126, + 0x11150, 0x11172, + 0x11183, 0x111B2, + 0x111C1, 0x111C4, + 0x11200, 0x11211, + 0x11213, 0x1122B, + 0x1123F, 0x11240, + 0x11280, 0x11286, + 0x1128A, 0x1128D, + 0x1128F, 0x1129D, + 0x1129F, 0x112A8, + 0x112B0, 0x112DE, + 0x11305, 0x1130C, + 0x1130F, 0x11310, + 0x11313, 0x11328, + 0x1132A, 0x11330, + 0x11332, 0x11333, + 0x11335, 0x11339, + 0x1135D, 0x11361, + 0x11380, 0x11389, + 0x11390, 0x113B5, + 0x11400, 0x11434, + 0x11447, 0x1144A, + 0x1145F, 0x11461, + 0x11480, 0x114AF, + 0x114C4, 0x114C5, + 0x11580, 0x115AE, + 0x115D8, 0x115DB, + 0x11600, 0x1162F, + 0x11680, 0x116AA, + 0x11700, 0x1171A, + 0x11740, 0x11746, + 0x11800, 0x1182B, + 0x118FF, 0x11906, + 0x1190C, 0x11913, + 0x11915, 0x11916, + 0x11918, 0x1192F, + 0x119A0, 0x119A7, + 0x119AA, 0x119D0, + 0x11A0B, 0x11A32, + 0x11A5C, 0x11A89, + 0x11AB0, 0x11AF8, + 0x11BC0, 0x11BE0, + 0x11C00, 0x11C08, + 0x11C0A, 0x11C2E, + 0x11C72, 0x11C8F, + 0x11D00, 0x11D06, + 0x11D08, 0x11D09, + 0x11D0B, 0x11D30, + 0x11D60, 0x11D65, + 0x11D67, 0x11D68, + 0x11D6A, 0x11D89, + 0x11DB0, 0x11DD8, + 0x11DDA, 0x11DDB, + 0x11EE0, 0x11EF2, + 0x11F04, 0x11F10, + 0x11F12, 0x11F33, + 0x12000, 0x12399, + 0x12480, 0x12543, + 0x12F90, 0x12FF0, + 0x13000, 0x1342F, + 0x13441, 0x13446, + 0x13460, 0x143FA, + 0x14400, 0x14646, + 0x16100, 0x1611D, + 0x16800, 0x16A38, + 0x16A40, 0x16A5E, + 0x16A70, 0x16ABE, + 0x16AD0, 0x16AED, + 0x16B00, 0x16B2F, + 0x16B63, 0x16B77, + 0x16B7D, 0x16B8F, + 0x16D43, 0x16D6A, + 0x16F00, 0x16F4A, + 0x17000, 0x187FF, + 0x18800, 0x18CD5, + 0x18D00, 0x18D1E, + 0x18D80, 0x18DF2, + 0x1B000, 0x1B122, + 0x1B150, 0x1B152, + 0x1B164, 0x1B167, + 0x1B170, 0x1B2FB, + 0x1BC00, 0x1BC6A, + 0x1BC70, 0x1BC7C, + 0x1BC80, 0x1BC88, + 0x1BC90, 0x1BC99, + 0x1E100, 0x1E12C, + 0x1E290, 0x1E2AD, + 0x1E2C0, 0x1E2EB, + 0x1E4D0, 0x1E4EA, + 0x1E5D0, 0x1E5ED, + 0x1E6C0, 0x1E6DE, + 0x1E6E0, 0x1E6E2, + 0x1E6E4, 0x1E6E5, + 0x1E6E7, 0x1E6ED, + 0x1E6F0, 0x1E6F4, + 0x1E7E0, 0x1E7E6, + 0x1E7E8, 0x1E7EB, + 0x1E7ED, 0x1E7EE, + 0x1E7F0, 0x1E7FE, + 0x1E800, 0x1E8C4, + 0x1EE00, 0x1EE03, + 0x1EE05, 0x1EE1F, + 0x1EE21, 0x1EE22, + 0x1EE29, 0x1EE32, + 0x1EE34, 0x1EE37, + 0x1EE4D, 0x1EE4F, + 0x1EE51, 0x1EE52, + 0x1EE61, 0x1EE62, + 0x1EE67, 0x1EE6A, + 0x1EE6C, 0x1EE72, + 0x1EE74, 0x1EE77, + 0x1EE79, 0x1EE7C, + 0x1EE80, 0x1EE89, + 0x1EE8B, 0x1EE9B, + 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, + 0x1EEAB, 0x1EEBB, + 0x20000, 0x2A6DF, + 0x2A700, 0x2B73F, + 0x2B740, 0x2B81D, + 0x2B820, 0x2CEAD, + 0x2CEB0, 0x2EBE0, + 0x2EBF0, 0x2EE5D, + 0x2F800, 0x2FA1D, + 0x30000, 0x3134A, + 0x31350, 0x323AF, + 0x323B0, 0x33479, +} + +lo_ranges := Range{ + single_16 = lo_singles16[:], + ranges_16 = lo_ranges16[:], + single_32 = lo_singles32[:], + ranges_32 = lo_ranges32[:], +} + +@(rodata) +lt_singles16 := [?]u16{ + 0x01C5, 0x01C8, 0x01CB, 0x01F2, 0x1FBC, 0x1FCC, 0x1FFC, +} + +@(rodata) +lt_ranges16 := [?]u16{ + 0x1F88, 0x1F8F, + 0x1F98, 0x1F9F, + 0x1FA8, 0x1FAF, +} + +lt_ranges := Range{ + single_16 = lt_singles16[:], + ranges_16 = lt_ranges16[:], +} + +@(rodata) +lu_singles16 := [?]u16{ + 0x0100, 0x0102, 0x0104, 0x0106, 0x0108, 0x010A, 0x010C, 0x010E, 0x0110, 0x0112, + 0x0114, 0x0116, 0x0118, 0x011A, 0x011C, 0x011E, 0x0120, 0x0122, 0x0124, 0x0126, + 0x0128, 0x012A, 0x012C, 0x012E, 0x0130, 0x0132, 0x0134, 0x0136, 0x0139, 0x013B, + 0x013D, 0x013F, 0x0141, 0x0143, 0x0145, 0x0147, 0x014A, 0x014C, 0x014E, 0x0150, + 0x0152, 0x0154, 0x0156, 0x0158, 0x015A, 0x015C, 0x015E, 0x0160, 0x0162, 0x0164, + 0x0166, 0x0168, 0x016A, 0x016C, 0x016E, 0x0170, 0x0172, 0x0174, 0x0176, 0x017B, + 0x017D, 0x0184, 0x01A2, 0x01A4, 0x01A9, 0x01AC, 0x01B5, 0x01BC, 0x01C4, 0x01C7, + 0x01CA, 0x01CD, 0x01CF, 0x01D1, 0x01D3, 0x01D5, 0x01D7, 0x01D9, 0x01DB, 0x01DE, + 0x01E0, 0x01E2, 0x01E4, 0x01E6, 0x01E8, 0x01EA, 0x01EC, 0x01EE, 0x01F1, 0x01F4, + 0x01FA, 0x01FC, 0x01FE, 0x0200, 0x0202, 0x0204, 0x0206, 0x0208, 0x020A, 0x020C, + 0x020E, 0x0210, 0x0212, 0x0214, 0x0216, 0x0218, 0x021A, 0x021C, 0x021E, 0x0220, + 0x0222, 0x0224, 0x0226, 0x0228, 0x022A, 0x022C, 0x022E, 0x0230, 0x0232, 0x0241, + 0x0248, 0x024A, 0x024C, 0x024E, 0x0370, 0x0372, 0x0376, 0x037F, 0x0386, 0x038C, + 0x03CF, 0x03D8, 0x03DA, 0x03DC, 0x03DE, 0x03E0, 0x03E2, 0x03E4, 0x03E6, 0x03E8, + 0x03EA, 0x03EC, 0x03EE, 0x03F4, 0x03F7, 0x0460, 0x0462, 0x0464, 0x0466, 0x0468, + 0x046A, 0x046C, 0x046E, 0x0470, 0x0472, 0x0474, 0x0476, 0x0478, 0x047A, 0x047C, + 0x047E, 0x0480, 0x048A, 0x048C, 0x048E, 0x0490, 0x0492, 0x0494, 0x0496, 0x0498, + 0x049A, 0x049C, 0x049E, 0x04A0, 0x04A2, 0x04A4, 0x04A6, 0x04A8, 0x04AA, 0x04AC, + 0x04AE, 0x04B0, 0x04B2, 0x04B4, 0x04B6, 0x04B8, 0x04BA, 0x04BC, 0x04BE, 0x04C3, + 0x04C5, 0x04C7, 0x04C9, 0x04CB, 0x04CD, 0x04D0, 0x04D2, 0x04D4, 0x04D6, 0x04D8, + 0x04DA, 0x04DC, 0x04DE, 0x04E0, 0x04E2, 0x04E4, 0x04E6, 0x04E8, 0x04EA, 0x04EC, + 0x04EE, 0x04F0, 0x04F2, 0x04F4, 0x04F6, 0x04F8, 0x04FA, 0x04FC, 0x04FE, 0x0500, + 0x0502, 0x0504, 0x0506, 0x0508, 0x050A, 0x050C, 0x050E, 0x0510, 0x0512, 0x0514, + 0x0516, 0x0518, 0x051A, 0x051C, 0x051E, 0x0520, 0x0522, 0x0524, 0x0526, 0x0528, + 0x052A, 0x052C, 0x052E, 0x10C7, 0x10CD, 0x1C89, 0x1E00, 0x1E02, 0x1E04, 0x1E06, + 0x1E08, 0x1E0A, 0x1E0C, 0x1E0E, 0x1E10, 0x1E12, 0x1E14, 0x1E16, 0x1E18, 0x1E1A, + 0x1E1C, 0x1E1E, 0x1E20, 0x1E22, 0x1E24, 0x1E26, 0x1E28, 0x1E2A, 0x1E2C, 0x1E2E, + 0x1E30, 0x1E32, 0x1E34, 0x1E36, 0x1E38, 0x1E3A, 0x1E3C, 0x1E3E, 0x1E40, 0x1E42, + 0x1E44, 0x1E46, 0x1E48, 0x1E4A, 0x1E4C, 0x1E4E, 0x1E50, 0x1E52, 0x1E54, 0x1E56, + 0x1E58, 0x1E5A, 0x1E5C, 0x1E5E, 0x1E60, 0x1E62, 0x1E64, 0x1E66, 0x1E68, 0x1E6A, + 0x1E6C, 0x1E6E, 0x1E70, 0x1E72, 0x1E74, 0x1E76, 0x1E78, 0x1E7A, 0x1E7C, 0x1E7E, + 0x1E80, 0x1E82, 0x1E84, 0x1E86, 0x1E88, 0x1E8A, 0x1E8C, 0x1E8E, 0x1E90, 0x1E92, + 0x1E94, 0x1E9E, 0x1EA0, 0x1EA2, 0x1EA4, 0x1EA6, 0x1EA8, 0x1EAA, 0x1EAC, 0x1EAE, + 0x1EB0, 0x1EB2, 0x1EB4, 0x1EB6, 0x1EB8, 0x1EBA, 0x1EBC, 0x1EBE, 0x1EC0, 0x1EC2, + 0x1EC4, 0x1EC6, 0x1EC8, 0x1ECA, 0x1ECC, 0x1ECE, 0x1ED0, 0x1ED2, 0x1ED4, 0x1ED6, + 0x1ED8, 0x1EDA, 0x1EDC, 0x1EDE, 0x1EE0, 0x1EE2, 0x1EE4, 0x1EE6, 0x1EE8, 0x1EEA, + 0x1EEC, 0x1EEE, 0x1EF0, 0x1EF2, 0x1EF4, 0x1EF6, 0x1EF8, 0x1EFA, 0x1EFC, 0x1EFE, + 0x1F59, 0x1F5B, 0x1F5D, 0x1F5F, 0x2102, 0x2107, 0x2115, 0x2124, 0x2126, 0x2128, + 0x2145, 0x2183, 0x2C60, 0x2C67, 0x2C69, 0x2C6B, 0x2C72, 0x2C75, 0x2C82, 0x2C84, + 0x2C86, 0x2C88, 0x2C8A, 0x2C8C, 0x2C8E, 0x2C90, 0x2C92, 0x2C94, 0x2C96, 0x2C98, + 0x2C9A, 0x2C9C, 0x2C9E, 0x2CA0, 0x2CA2, 0x2CA4, 0x2CA6, 0x2CA8, 0x2CAA, 0x2CAC, + 0x2CAE, 0x2CB0, 0x2CB2, 0x2CB4, 0x2CB6, 0x2CB8, 0x2CBA, 0x2CBC, 0x2CBE, 0x2CC0, + 0x2CC2, 0x2CC4, 0x2CC6, 0x2CC8, 0x2CCA, 0x2CCC, 0x2CCE, 0x2CD0, 0x2CD2, 0x2CD4, + 0x2CD6, 0x2CD8, 0x2CDA, 0x2CDC, 0x2CDE, 0x2CE0, 0x2CE2, 0x2CEB, 0x2CED, 0x2CF2, + 0xA640, 0xA642, 0xA644, 0xA646, 0xA648, 0xA64A, 0xA64C, 0xA64E, 0xA650, 0xA652, + 0xA654, 0xA656, 0xA658, 0xA65A, 0xA65C, 0xA65E, 0xA660, 0xA662, 0xA664, 0xA666, + 0xA668, 0xA66A, 0xA66C, 0xA680, 0xA682, 0xA684, 0xA686, 0xA688, 0xA68A, 0xA68C, + 0xA68E, 0xA690, 0xA692, 0xA694, 0xA696, 0xA698, 0xA69A, 0xA722, 0xA724, 0xA726, + 0xA728, 0xA72A, 0xA72C, 0xA72E, 0xA732, 0xA734, 0xA736, 0xA738, 0xA73A, 0xA73C, + 0xA73E, 0xA740, 0xA742, 0xA744, 0xA746, 0xA748, 0xA74A, 0xA74C, 0xA74E, 0xA750, + 0xA752, 0xA754, 0xA756, 0xA758, 0xA75A, 0xA75C, 0xA75E, 0xA760, 0xA762, 0xA764, + 0xA766, 0xA768, 0xA76A, 0xA76C, 0xA76E, 0xA779, 0xA77B, 0xA780, 0xA782, 0xA784, + 0xA786, 0xA78B, 0xA78D, 0xA790, 0xA792, 0xA796, 0xA798, 0xA79A, 0xA79C, 0xA79E, + 0xA7A0, 0xA7A2, 0xA7A4, 0xA7A6, 0xA7A8, 0xA7B6, 0xA7B8, 0xA7BA, 0xA7BC, 0xA7BE, + 0xA7C0, 0xA7C2, 0xA7C9, 0xA7CE, 0xA7D0, 0xA7D2, 0xA7D4, 0xA7D6, 0xA7D8, 0xA7DA, + 0xA7DC, 0xA7F5, +} + +@(rodata) +lu_ranges16 := [?]u16{ + 0x0041, 0x005A, + 0x00C0, 0x00D6, + 0x00D8, 0x00DE, + 0x0178, 0x0179, + 0x0181, 0x0182, + 0x0186, 0x0187, + 0x0189, 0x018B, + 0x018E, 0x0191, + 0x0193, 0x0194, + 0x0196, 0x0198, + 0x019C, 0x019D, + 0x019F, 0x01A0, + 0x01A6, 0x01A7, + 0x01AE, 0x01AF, + 0x01B1, 0x01B3, + 0x01B7, 0x01B8, + 0x01F6, 0x01F8, + 0x023A, 0x023B, + 0x023D, 0x023E, + 0x0243, 0x0246, + 0x0388, 0x038A, + 0x038E, 0x038F, + 0x0391, 0x03A1, + 0x03A3, 0x03AB, + 0x03D2, 0x03D4, + 0x03F9, 0x03FA, + 0x03FD, 0x042F, + 0x04C0, 0x04C1, + 0x0531, 0x0556, + 0x10A0, 0x10C5, + 0x13A0, 0x13F5, + 0x1C90, 0x1CBA, + 0x1CBD, 0x1CBF, + 0x1F08, 0x1F0F, + 0x1F18, 0x1F1D, + 0x1F28, 0x1F2F, + 0x1F38, 0x1F3F, + 0x1F48, 0x1F4D, + 0x1F68, 0x1F6F, + 0x1FB8, 0x1FBB, + 0x1FC8, 0x1FCB, + 0x1FD8, 0x1FDB, + 0x1FE8, 0x1FEC, + 0x1FF8, 0x1FFB, + 0x210B, 0x210D, + 0x2110, 0x2112, + 0x2119, 0x211D, + 0x212A, 0x212D, + 0x2130, 0x2133, + 0x213E, 0x213F, + 0x2C00, 0x2C2F, + 0x2C62, 0x2C64, + 0x2C6D, 0x2C70, + 0x2C7E, 0x2C80, + 0xA77D, 0xA77E, + 0xA7AA, 0xA7AE, + 0xA7B0, 0xA7B4, + 0xA7C4, 0xA7C7, + 0xA7CB, 0xA7CC, + 0xFF21, 0xFF3A, +} + +@(rodata) +lu_singles32 := [?]i32{ + 0x1D49C, 0x1D4A2, 0x1D546, 0x1D7CA, +} + +@(rodata) +lu_ranges32 := [?]i32{ + 0x10400, 0x10427, + 0x104B0, 0x104D3, + 0x10570, 0x1057A, + 0x1057C, 0x1058A, + 0x1058C, 0x10592, + 0x10594, 0x10595, + 0x10C80, 0x10CB2, + 0x10D50, 0x10D65, + 0x118A0, 0x118BF, + 0x16E40, 0x16E5F, + 0x16EA0, 0x16EB8, + 0x1D400, 0x1D419, + 0x1D434, 0x1D44D, + 0x1D468, 0x1D481, + 0x1D49E, 0x1D49F, + 0x1D4A5, 0x1D4A6, + 0x1D4A9, 0x1D4AC, + 0x1D4AE, 0x1D4B5, + 0x1D4D0, 0x1D4E9, + 0x1D504, 0x1D505, + 0x1D507, 0x1D50A, + 0x1D50D, 0x1D514, + 0x1D516, 0x1D51C, + 0x1D538, 0x1D539, + 0x1D53B, 0x1D53E, + 0x1D540, 0x1D544, + 0x1D54A, 0x1D550, + 0x1D56C, 0x1D585, + 0x1D5A0, 0x1D5B9, + 0x1D5D4, 0x1D5ED, + 0x1D608, 0x1D621, + 0x1D63C, 0x1D655, + 0x1D670, 0x1D689, + 0x1D6A8, 0x1D6C0, + 0x1D6E2, 0x1D6FA, + 0x1D71C, 0x1D734, + 0x1D756, 0x1D76E, + 0x1D790, 0x1D7A8, + 0x1E900, 0x1E921, +} + +lu_ranges := Range{ + single_16 = lu_singles16[:], + ranges_16 = lu_ranges16[:], + single_32 = lu_singles32[:], + ranges_32 = lu_ranges32[:], +} + +@(rodata) +nd_ranges16 := [?]u16{ + 0x0030, 0x0039, + 0x0660, 0x0669, + 0x06F0, 0x06F9, + 0x07C0, 0x07C9, + 0x0966, 0x096F, + 0x09E6, 0x09EF, + 0x0A66, 0x0A6F, + 0x0AE6, 0x0AEF, + 0x0B66, 0x0B6F, + 0x0BE6, 0x0BEF, + 0x0C66, 0x0C6F, + 0x0CE6, 0x0CEF, + 0x0D66, 0x0D6F, + 0x0DE6, 0x0DEF, + 0x0E50, 0x0E59, + 0x0ED0, 0x0ED9, + 0x0F20, 0x0F29, + 0x1040, 0x1049, + 0x1090, 0x1099, + 0x17E0, 0x17E9, + 0x1810, 0x1819, + 0x1946, 0x194F, + 0x19D0, 0x19D9, + 0x1A80, 0x1A89, + 0x1A90, 0x1A99, + 0x1B50, 0x1B59, + 0x1BB0, 0x1BB9, + 0x1C40, 0x1C49, + 0x1C50, 0x1C59, + 0xA620, 0xA629, + 0xA8D0, 0xA8D9, + 0xA900, 0xA909, + 0xA9D0, 0xA9D9, + 0xA9F0, 0xA9F9, + 0xAA50, 0xAA59, + 0xABF0, 0xABF9, + 0xFF10, 0xFF19, +} + +@(rodata) +nd_ranges32 := [?]i32{ + 0x104A0, 0x104A9, + 0x10D30, 0x10D39, + 0x10D40, 0x10D49, + 0x11066, 0x1106F, + 0x110F0, 0x110F9, + 0x11136, 0x1113F, + 0x111D0, 0x111D9, + 0x112F0, 0x112F9, + 0x11450, 0x11459, + 0x114D0, 0x114D9, + 0x11650, 0x11659, + 0x116C0, 0x116C9, + 0x116D0, 0x116E3, + 0x11730, 0x11739, + 0x118E0, 0x118E9, + 0x11950, 0x11959, + 0x11BF0, 0x11BF9, + 0x11C50, 0x11C59, + 0x11D50, 0x11D59, + 0x11DA0, 0x11DA9, + 0x11DE0, 0x11DE9, + 0x11F50, 0x11F59, + 0x16130, 0x16139, + 0x16A60, 0x16A69, + 0x16AC0, 0x16AC9, + 0x16B50, 0x16B59, + 0x16D70, 0x16D79, + 0x1CCF0, 0x1CCF9, + 0x1D7CE, 0x1D7FF, + 0x1E140, 0x1E149, + 0x1E2F0, 0x1E2F9, + 0x1E4F0, 0x1E4F9, + 0x1E5F1, 0x1E5FA, + 0x1E950, 0x1E959, + 0x1FBF0, 0x1FBF9, +} + +nd_ranges := Range{ + ranges_16 = nd_ranges16[:], + ranges_32 = nd_ranges32[:], +} + +@(rodata) +nl_singles16 := [?]u16{ + 0x3007, +} + +@(rodata) +nl_ranges16 := [?]u16{ + 0x16EE, 0x16F0, + 0x2160, 0x2182, + 0x2185, 0x2188, + 0x3021, 0x3029, + 0x3038, 0x303A, + 0xA6E6, 0xA6EF, +} + +@(rodata) +nl_singles32 := [?]i32{ + 0x10341, 0x1034A, +} + +@(rodata) +nl_ranges32 := [?]i32{ + 0x10140, 0x10174, + 0x103D1, 0x103D5, + 0x12400, 0x1246E, + 0x16FF4, 0x16FF6, +} + +nl_ranges := Range{ + single_16 = nl_singles16[:], + ranges_16 = nl_ranges16[:], + single_32 = nl_singles32[:], + ranges_32 = nl_ranges32[:], +} + +@(rodata) +no_singles16 := [?]u16{ + 0x00B9, 0x19DA, 0x2070, 0x2189, 0x2CFD, +} + +@(rodata) +no_ranges16 := [?]u16{ + 0x00B2, 0x00B3, + 0x00BC, 0x00BE, + 0x09F4, 0x09F9, + 0x0B72, 0x0B77, + 0x0BF0, 0x0BF2, + 0x0C78, 0x0C7E, + 0x0D58, 0x0D5E, + 0x0D70, 0x0D78, + 0x0F2A, 0x0F33, + 0x1369, 0x137C, + 0x17F0, 0x17F9, + 0x2074, 0x2079, + 0x2080, 0x2089, + 0x2150, 0x215F, + 0x2460, 0x249B, + 0x24EA, 0x24FF, + 0x2776, 0x2793, + 0x3192, 0x3195, + 0x3220, 0x3229, + 0x3248, 0x324F, + 0x3251, 0x325F, + 0x3280, 0x3289, + 0x32B1, 0x32BF, + 0xA830, 0xA835, +} + +@(rodata) +no_ranges32 := [?]i32{ + 0x10107, 0x10133, + 0x10175, 0x10178, + 0x1018A, 0x1018B, + 0x102E1, 0x102FB, + 0x10320, 0x10323, + 0x10858, 0x1085F, + 0x10879, 0x1087F, + 0x108A7, 0x108AF, + 0x108FB, 0x108FF, + 0x10916, 0x1091B, + 0x109BC, 0x109BD, + 0x109C0, 0x109CF, + 0x109D2, 0x109FF, + 0x10A40, 0x10A48, + 0x10A7D, 0x10A7E, + 0x10A9D, 0x10A9F, + 0x10AEB, 0x10AEF, + 0x10B58, 0x10B5F, + 0x10B78, 0x10B7F, + 0x10BA9, 0x10BAF, + 0x10CFA, 0x10CFF, + 0x10E60, 0x10E7E, + 0x10F1D, 0x10F26, + 0x10F51, 0x10F54, + 0x10FC5, 0x10FCB, + 0x11052, 0x11065, + 0x111E1, 0x111F4, + 0x1173A, 0x1173B, + 0x118EA, 0x118F2, + 0x11C5A, 0x11C6C, + 0x11FC0, 0x11FD4, + 0x16B5B, 0x16B61, + 0x16E80, 0x16E96, + 0x1D2C0, 0x1D2D3, + 0x1D2E0, 0x1D2F3, + 0x1D360, 0x1D378, + 0x1E8C7, 0x1E8CF, + 0x1EC71, 0x1ECAB, + 0x1ECAD, 0x1ECAF, + 0x1ECB1, 0x1ECB4, + 0x1ED01, 0x1ED2D, + 0x1ED2F, 0x1ED3D, + 0x1F100, 0x1F10C, +} + +no_ranges := Range{ + single_16 = no_singles16[:], + ranges_16 = no_ranges16[:], + ranges_32 = no_ranges32[:], +} + +@(rodata) +extra_digits_singles16 := [?]u16{ + 0x00B9, 0x19DA, 0x2070, 0x24EA, 0x24FF, +} + +@(rodata) +extra_digits_ranges16 := [?]u16{ + 0x00B2, 0x00B3, + 0x1369, 0x1371, + 0x2074, 0x2079, + 0x2080, 0x2089, + 0x2460, 0x2468, + 0x2474, 0x247C, + 0x2488, 0x2490, + 0x24F5, 0x24FD, + 0x2776, 0x277E, + 0x2780, 0x2788, + 0x278A, 0x2792, +} + +@(rodata) +extra_digits_ranges32 := [?]i32{ + 0x10A40, 0x10A43, + 0x10E60, 0x10E68, + 0x11052, 0x1105A, + 0x1F100, 0x1F10A, +} + +extra_digits_ranges := Range{ + single_16 = extra_digits_singles16[:], + ranges_16 = extra_digits_ranges16[:], + ranges_32 = extra_digits_ranges32[:], +} + +@(rodata) +other_lowercase_singles16 := [?]u16{ + 0x02B8, 0x02C1, 0x02E4, 0x1D6A, 0x1DBF, 0x209C, 0x217F, 0x24E9, 0x2C7D, 0xA69D, + 0xA7F4, 0xA7F9, 0xAB5F, +} + +@(rodata) +other_lowercase_ranges16 := [?]u16{ + 0x0000, 0x00AA, + 0x0000, 0x00BA, + 0x0000, 0x0345, + 0x0000, 0x037A, + 0x0000, 0x10FC, + 0x0000, 0x1D78, + 0x0000, 0x2071, + 0x0000, 0x207F, + 0x0000, 0xA770, + 0x0000, 0xAB69, +} + +@(rodata) +other_lowercase_singles32 := [?]i32{ + 0x10785, 0x107B0, 0x107BA, 0x1E06D, +} + +@(rodata) +other_lowercase_ranges32 := [?]i32{ + 0x0000, 0x10780, +} + +other_lowercase_ranges := Range{ + single_16 = other_lowercase_singles16[:], + ranges_16 = other_lowercase_ranges16[:], + single_32 = other_lowercase_singles32[:], + ranges_32 = other_lowercase_ranges32[:], +} + +@(rodata) +other_uppercase_singles16 := [?]u16{ + 0x216F, 0x24CF, +} + +@(rodata) +other_uppercase_singles32 := [?]i32{ + 0x1F149, 0x1F169, 0x1F189, +} + +other_uppercase_ranges := Range{ + single_16 = other_uppercase_singles16[:], + single_32 = other_uppercase_singles32[:], +} + From 673adf30c3d4af273224804667a93aba63c25598 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 18:01:09 -0500 Subject: [PATCH 617/766] Add searing of generated tables, Fixed in_digit This adds the functino `unicode.in_range` to search for a run in the `Range` type used in `core/unicode/generated.odin`. This also modifies `unicode.binary_search` so it will support searching types other than i32 by making it support implicit parametric polymorphism. `unicode.in_digit` has been modified to use the generated tables. --- core/unicode/inrange.odin | 39 +++++++++++++++++++++++++++++++++++++++ core/unicode/letter.odin | 9 +++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 core/unicode/inrange.odin diff --git a/core/unicode/inrange.odin b/core/unicode/inrange.odin new file mode 100644 index 000000000..15f7de745 --- /dev/null +++ b/core/unicode/inrange.odin @@ -0,0 +1,39 @@ +package unicode + +/* +Check to see if the rune `r` is in `range` +*/ +in_range :: proc(r: rune, range: Range) -> bool { + + if r <= 0xFFFF { + r16 := cast(u16) r + + length := len(range.ranges_16) + index := binary_search(r16, range.ranges_16, length/2, 2) if length > 0 else -1 + if index >= 0 && range.ranges_16[index] <= r16 && range.ranges_16[index+1] >= r16 do return true + + length = len(range.single_16) + index = binary_search(r16, range.single_16, length, 1) if length > 0 else -1 + if index >= 0 && range.single_16[index] == r16 { + return true + } + } + + r32 := cast(i32) r + + length := len(range.ranges_32) + index := binary_search(r32, range.ranges_32, length/2, 2) if length >0 else -1 + if index >= 0 && range.ranges_32[index] <= r32 && range.ranges_32[index+1] >= r32 do return true + + length = len(range.single_32) + index = binary_search(r32, range.single_32, length, 1) if length > 0 else -1 + if index >= 0 && range.single_32[index] == r32 do return true + + + return false +} + + + + + diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 5191dd900..84be04cfc 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -13,7 +13,7 @@ ZERO_WIDTH_JOINER :: '\u200D' WORD_JOINER :: '\u2060' @(require_results) -binary_search :: proc(c: i32, table: []i32, length, stride: int, loc := #caller_location) -> int #no_bounds_check { +binary_search :: proc(c: $T, table: []T, length, stride: int, loc := #caller_location) -> int #no_bounds_check { runtime.bounds_check_error_loc(loc, length*stride-1, len(table)) n := length t := 0 @@ -134,8 +134,13 @@ is_title :: proc(r: rune) -> bool { @(require_results) is_digit :: proc(r: rune) -> bool { if r <= MAX_LATIN1 { - return '0' <= r && r <= '9' + return ('0' <= r && r <= '9') || r == 0x00B9 || (r >= 0x00B2 && r <= 0x0B3) } + + if in_range(r, nd_ranges) do return true + + if in_range(r, extra_digits_ranges) do return true + return false } From 263bc8cc7ed4479b474783c298ec12613f61612e Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 18:13:04 -0500 Subject: [PATCH 618/766] Added comment to is_digit --- core/unicode/letter.odin | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 84be04cfc..d0d6ec634 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -131,6 +131,17 @@ is_title :: proc(r: rune) -> bool { return is_upper(r) && is_lower(r) } +/* +This function determincs if a rune is a digit. To be a digit the +charage either has a Numeric_Type of Digit or Decimal. + +Inputs: +- r: The rune to check if it is a digit. + +Returns: +`true` if the rune `r` is a digit, `false` in all other cases + +*/ @(require_results) is_digit :: proc(r: rune) -> bool { if r <= MAX_LATIN1 { From e5b1f1bf94379a4c68ab4b2979fd055a7dc9435b Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 18:18:47 -0500 Subject: [PATCH 619/766] Add procedure `is_decimal` This adds the function `is_decimal` to `core/unicode` --- core/unicode/letter.odin | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index d0d6ec634..ade35e16e 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -131,6 +131,20 @@ is_title :: proc(r: rune) -> bool { return is_upper(r) && is_lower(r) } +/* +Returns true if the rune `r` is in the General Category Nd + +Inputs: +- r: The run to check if it is in the general category Nd. + +Returns: +`true` if the rune is in the general category Nd and `false` otherwise + +*/ +is_decimal :: proc(r: rune) -> bool { + return in_range(r, nd_ranges) +} + /* This function determincs if a rune is a digit. To be a digit the charage either has a Numeric_Type of Digit or Decimal. From 090dedda1b32921fa10fa29a589b63b28233f649 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 18:28:34 -0500 Subject: [PATCH 620/766] is_number now searches generate tables --- core/unicode/letter.odin | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index ade35e16e..636b1bdb2 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -225,12 +225,25 @@ is_control :: proc(r: rune) -> bool #no_bounds_check { return false } +/* +Checks to see if the rune `r` is a number. This means the rune is a member +of the general category Nd, Nl, or No. + +Inputs: +r: The rune to check if it is number. + +Returns: +`true` if the ruen belongs to the general category Nd, Nl, or No. `false` +is return in all other cases. + +*/ @(require_results) is_number :: proc(r: rune) -> bool #no_bounds_check { if u32(r) <= MAX_LATIN1 { return char_properties[u8(r)]&pN != 0 } - return false + + return in_range(r, nd_ranges) || in_range(r, nl_ranges) || in_range(r, no_ranges) } @(require_results) From b4d70d3c5b35a66e58b551e85a0586ae5d9cd5fd Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 19:19:04 -0500 Subject: [PATCH 621/766] Corrected issue with PropList.txt ranges --- core/unicode/generated.odin | 48 +++++++++++++++++++-------------- core/unicode/tools/ucd/ucd.odin | 9 ++++--- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index 28d2cf7e1..63f6b2436 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -1220,32 +1220,37 @@ extra_digits_ranges := Range{ @(rodata) other_lowercase_singles16 := [?]u16{ - 0x02B8, 0x02C1, 0x02E4, 0x1D6A, 0x1DBF, 0x209C, 0x217F, 0x24E9, 0x2C7D, 0xA69D, - 0xA7F4, 0xA7F9, 0xAB5F, + 0x00AA, 0x00BA, 0x0345, 0x037A, 0x10FC, 0x1D78, 0x2071, 0x207F, 0xA770, 0xAB69, } @(rodata) other_lowercase_ranges16 := [?]u16{ - 0x0000, 0x00AA, - 0x0000, 0x00BA, - 0x0000, 0x0345, - 0x0000, 0x037A, - 0x0000, 0x10FC, - 0x0000, 0x1D78, - 0x0000, 0x2071, - 0x0000, 0x207F, - 0x0000, 0xA770, - 0x0000, 0xAB69, + 0x02B0, 0x02B8, + 0x02C0, 0x02C1, + 0x02E0, 0x02E4, + 0x1D2C, 0x1D6A, + 0x1D9B, 0x1DBF, + 0x2090, 0x209C, + 0x2170, 0x217F, + 0x24D0, 0x24E9, + 0x2C7C, 0x2C7D, + 0xA69C, 0xA69D, + 0xA7F1, 0xA7F4, + 0xA7F8, 0xA7F9, + 0xAB5C, 0xAB5F, } @(rodata) other_lowercase_singles32 := [?]i32{ - 0x10785, 0x107B0, 0x107BA, 0x1E06D, + 0x10780, } @(rodata) other_lowercase_ranges32 := [?]i32{ - 0x0000, 0x10780, + 0x10783, 0x10785, + 0x10787, 0x107B0, + 0x107B2, 0x107BA, + 0x1E030, 0x1E06D, } other_lowercase_ranges := Range{ @@ -1256,17 +1261,20 @@ other_lowercase_ranges := Range{ } @(rodata) -other_uppercase_singles16 := [?]u16{ - 0x216F, 0x24CF, +other_uppercase_ranges16 := [?]u16{ + 0x2160, 0x216F, + 0x24B6, 0x24CF, } @(rodata) -other_uppercase_singles32 := [?]i32{ - 0x1F149, 0x1F169, 0x1F189, +other_uppercase_ranges32 := [?]i32{ + 0x1F130, 0x1F149, + 0x1F150, 0x1F169, + 0x1F170, 0x1F189, } other_uppercase_ranges := Range{ - single_16 = other_uppercase_singles16[:], - single_32 = other_uppercase_singles32[:], + ranges_16 = other_uppercase_ranges16[:], + ranges_32 = other_uppercase_ranges32[:], } diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index d46ae37cb..9f815d386 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -267,6 +267,7 @@ load_protperty_list :: proc ( if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') { if c == '.' { is_range = true + rr.last = 0 continue } else { err = UCD_Error.Invalid_Hex_Number @@ -274,14 +275,14 @@ load_protperty_list :: proc ( } } if is_range { + rr.last *= 16 + rr.last += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') + rr.last += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + } else { rr.first *= 16 rr.first += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') rr.first += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) rr.last = rr.first - } else { - rr.last *= 16 - rr.last += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') - rr.last += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) } } From 69c04b696a3864790dba3fd0fc5f924c3bbb37d1 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 19:23:16 -0500 Subject: [PATCH 622/766] islower now used the generated tables --- core/unicode/letter.odin | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 636b1bdb2..2fc1fa1be 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -75,16 +75,7 @@ is_lower :: proc(r: rune) -> bool #no_bounds_check { if r <= MAX_ASCII { return u32(r)-'a' < 26 } - c := i32(r) - p := binary_search(c, to_upper_ranges[:], len(to_upper_ranges)/3, 3) - if p >= 0 && to_upper_ranges[p] <= c && c <= to_upper_ranges[p+1] { - return true - } - p = binary_search(c, to_upper_singlets[:], len(to_upper_singlets)/2, 2) - if p >= 0 && c == to_upper_singlets[p] { - return true - } - return false + return in_range(r, ll_ranges) || in_range(r, other_lowercase_ranges) } @(require_results) From e9943e61453ada4e4fd9b3df9478c8701bb875eb Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 11:40:05 -0400 Subject: [PATCH 623/766] is_letter now uses generated tables unicode.is_letter has been modified to use the generated unicode tables. --- core/unicode/letter.odin | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 2fc1fa1be..a7e2c6c9f 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -83,19 +83,22 @@ is_upper :: proc(r: rune) -> bool #no_bounds_check { if r <= MAX_ASCII { return u32(r)-'A' < 26 } - c := i32(r) - p := binary_search(c, to_lower_ranges[:], len(to_lower_ranges)/3, 3) - if p >= 0 && to_lower_ranges[p] <= c && c <= to_lower_ranges[p+1] { - return true - } - p = binary_search(c, to_lower_singlets[:], len(to_lower_singlets)/2, 2) - if p >= 0 && c == to_lower_singlets[p] { - return true - } - return false + return in_range(r, lu_ranges) || in_range(r, other_uppercase_ranges) } is_alpha :: is_letter + +/* +Return true if the rune `r` is a letter. Being a letter means that the rune has +the Unicode general category property of L. In practice, the character will have +a general category property of Ll, Lm, Lo, Lt, or Lu. + +Inputs: +- r: The rune which will be check for having the property of being a letter. + +Returns: +`true` when the rune `r` is a letter. `false` will be returned in all other cases. +*/ @(require_results) is_letter :: proc(r: rune) -> bool #no_bounds_check { if u32(r) <= MAX_LATIN1 { @@ -105,16 +108,9 @@ is_letter :: proc(r: rune) -> bool #no_bounds_check { return true } - c := i32(r) - p := binary_search(c, alpha_ranges[:], len(alpha_ranges)/2, 2) - if p >= 0 && alpha_ranges[p] <= c && c <= alpha_ranges[p+1] { - return true - } - p = binary_search(c, alpha_singlets[:], len(alpha_singlets), 1) - if p >= 0 && c == alpha_singlets[p] { - return true - } - return false + ll_lu := in_range(r, ll_ranges) || in_range(r, lu_ranges) + + return ll_lu || in_range(r, lo_ranges) || in_range(r, lt_ranges) || in_range(r, lm_ranges) } @(require_results) From 9b38bdf849e51657b7f91511f4f812cba11a8878 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 11:58:50 -0400 Subject: [PATCH 624/766] Refactor to remove the us of if do --- core/unicode/inrange.odin | 12 +++++++++--- core/unicode/letter.odin | 8 ++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/core/unicode/inrange.odin b/core/unicode/inrange.odin index 15f7de745..fa433a741 100644 --- a/core/unicode/inrange.odin +++ b/core/unicode/inrange.odin @@ -10,7 +10,9 @@ in_range :: proc(r: rune, range: Range) -> bool { length := len(range.ranges_16) index := binary_search(r16, range.ranges_16, length/2, 2) if length > 0 else -1 - if index >= 0 && range.ranges_16[index] <= r16 && range.ranges_16[index+1] >= r16 do return true + if index >= 0 && range.ranges_16[index] <= r16 && range.ranges_16[index+1] >= r16 { + return true + } length = len(range.single_16) index = binary_search(r16, range.single_16, length, 1) if length > 0 else -1 @@ -23,11 +25,15 @@ in_range :: proc(r: rune, range: Range) -> bool { length := len(range.ranges_32) index := binary_search(r32, range.ranges_32, length/2, 2) if length >0 else -1 - if index >= 0 && range.ranges_32[index] <= r32 && range.ranges_32[index+1] >= r32 do return true + if index >= 0 && range.ranges_32[index] <= r32 && range.ranges_32[index+1] >= r32 { + return true + } length = len(range.single_32) index = binary_search(r32, range.single_32, length, 1) if length > 0 else -1 - if index >= 0 && range.single_32[index] == r32 do return true + if index >= 0 && range.single_32[index] == r32 { + return true + } return false diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index a7e2c6c9f..29ea86ca9 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -149,9 +149,13 @@ is_digit :: proc(r: rune) -> bool { return ('0' <= r && r <= '9') || r == 0x00B9 || (r >= 0x00B2 && r <= 0x0B3) } - if in_range(r, nd_ranges) do return true + if in_range(r, nd_ranges) { + return true + } - if in_range(r, extra_digits_ranges) do return true + if in_range(r, extra_digits_ranges) { + return true + } return false } From 3bfa01d4a82c944dabaef0e93b9ad65dcc893503 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 12:19:38 -0400 Subject: [PATCH 625/766] Generate Unicode Punctuation Tables --- core/unicode/generated.odin | 258 +++++++++++++++++++++++ core/unicode/tools/generate_unicode.odin | 14 +- 2 files changed, 265 insertions(+), 7 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index 63f6b2436..c2a26ae2e 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -1184,6 +1184,264 @@ no_ranges := Range{ ranges_32 = no_ranges32[:], } +@(rodata) +pc_singles16 := [?]u16{ + 0x005F, 0x2054, 0xFF3F, +} + +@(rodata) +pc_ranges16 := [?]u16{ + 0x203F, 0x2040, + 0xFE33, 0xFE34, + 0xFE4D, 0xFE4F, +} + +pc_ranges := Range{ + single_16 = pc_singles16[:], + ranges_16 = pc_ranges16[:], +} + +@(rodata) +pd_singles16 := [?]u16{ + 0x002D, 0x058A, 0x05BE, 0x1400, 0x1806, 0x2E17, 0x2E1A, 0x2E40, 0x2E5D, 0x301C, + 0x3030, 0x30A0, 0xFE58, 0xFE63, 0xFF0D, +} + +@(rodata) +pd_ranges16 := [?]u16{ + 0x2010, 0x2015, + 0x2E3A, 0x2E3B, + 0xFE31, 0xFE32, +} + +@(rodata) +pd_singles32 := [?]i32{ + 0x10D6E, 0x10EAD, +} + +pd_ranges := Range{ + single_16 = pd_singles16[:], + ranges_16 = pd_ranges16[:], + single_32 = pd_singles32[:], +} + +@(rodata) +pe_singles16 := [?]u16{ + 0x0029, 0x005D, 0x007D, 0x0F3B, 0x0F3D, 0x169C, 0x2046, 0x207E, 0x208E, 0x2309, + 0x230B, 0x232A, 0x2769, 0x276B, 0x276D, 0x276F, 0x2771, 0x2773, 0x2775, 0x27C6, + 0x27E7, 0x27E9, 0x27EB, 0x27ED, 0x27EF, 0x2984, 0x2986, 0x2988, 0x298A, 0x298C, + 0x298E, 0x2990, 0x2992, 0x2994, 0x2996, 0x2998, 0x29D9, 0x29DB, 0x29FD, 0x2E23, + 0x2E25, 0x2E27, 0x2E29, 0x2E56, 0x2E58, 0x2E5A, 0x2E5C, 0x3009, 0x300B, 0x300D, + 0x300F, 0x3011, 0x3015, 0x3017, 0x3019, 0x301B, 0xFD3E, 0xFE18, 0xFE36, 0xFE38, + 0xFE3A, 0xFE3C, 0xFE3E, 0xFE40, 0xFE42, 0xFE44, 0xFE48, 0xFE5A, 0xFE5C, 0xFE5E, + 0xFF09, 0xFF3D, 0xFF5D, 0xFF60, 0xFF63, +} + +@(rodata) +pe_ranges16 := [?]u16{ + 0x301E, 0x301F, +} + +pe_ranges := Range{ + single_16 = pe_singles16[:], + ranges_16 = pe_ranges16[:], +} + +@(rodata) +pf_singles16 := [?]u16{ + 0x00BB, 0x2019, 0x201D, 0x203A, 0x2E03, 0x2E05, 0x2E0A, 0x2E0D, 0x2E1D, 0x2E21, +} + +pf_ranges := Range{ + single_16 = pf_singles16[:], +} + +@(rodata) +pi_singles16 := [?]u16{ + 0x00AB, 0x2018, 0x201F, 0x2039, 0x2E02, 0x2E04, 0x2E09, 0x2E0C, 0x2E1C, 0x2E20, +} + +@(rodata) +pi_ranges16 := [?]u16{ + 0x201B, 0x201C, +} + +pi_ranges := Range{ + single_16 = pi_singles16[:], + ranges_16 = pi_ranges16[:], +} + +@(rodata) +po_singles16 := [?]u16{ + 0x002A, 0x002C, 0x005C, 0x00A1, 0x00A7, 0x00BF, 0x037E, 0x0387, 0x0589, 0x05C0, + 0x05C3, 0x05C6, 0x061B, 0x06D4, 0x085E, 0x0970, 0x09FD, 0x0A76, 0x0AF0, 0x0C77, + 0x0C84, 0x0DF4, 0x0E4F, 0x0F14, 0x0F85, 0x10FB, 0x166E, 0x1CD3, 0x2053, 0x2D70, + 0x2E0B, 0x2E1B, 0x2E41, 0x303D, 0x30FB, 0xA673, 0xA67E, 0xA8FC, 0xA95F, 0xABEB, + 0xFE19, 0xFE30, 0xFE68, 0xFF0A, 0xFF0C, 0xFF3C, 0xFF61, +} + +@(rodata) +po_ranges16 := [?]u16{ + 0x0021, 0x0023, + 0x0025, 0x0027, + 0x002E, 0x002F, + 0x003A, 0x003B, + 0x003F, 0x0040, + 0x00B6, 0x00B7, + 0x055A, 0x055F, + 0x05F3, 0x05F4, + 0x0609, 0x060A, + 0x060C, 0x060D, + 0x061D, 0x061F, + 0x066A, 0x066D, + 0x0700, 0x070D, + 0x07F7, 0x07F9, + 0x0830, 0x083E, + 0x0964, 0x0965, + 0x0E5A, 0x0E5B, + 0x0F04, 0x0F12, + 0x0FD0, 0x0FD4, + 0x0FD9, 0x0FDA, + 0x104A, 0x104F, + 0x1360, 0x1368, + 0x16EB, 0x16ED, + 0x1735, 0x1736, + 0x17D4, 0x17D6, + 0x17D8, 0x17DA, + 0x1800, 0x1805, + 0x1807, 0x180A, + 0x1944, 0x1945, + 0x1A1E, 0x1A1F, + 0x1AA0, 0x1AA6, + 0x1AA8, 0x1AAD, + 0x1B4E, 0x1B4F, + 0x1B5A, 0x1B60, + 0x1B7D, 0x1B7F, + 0x1BFC, 0x1BFF, + 0x1C3B, 0x1C3F, + 0x1C7E, 0x1C7F, + 0x1CC0, 0x1CC7, + 0x2016, 0x2017, + 0x2020, 0x2027, + 0x2030, 0x2038, + 0x203B, 0x203E, + 0x2041, 0x2043, + 0x2047, 0x2051, + 0x2055, 0x205E, + 0x2CF9, 0x2CFC, + 0x2CFE, 0x2CFF, + 0x2E00, 0x2E01, + 0x2E06, 0x2E08, + 0x2E0E, 0x2E16, + 0x2E18, 0x2E19, + 0x2E1E, 0x2E1F, + 0x2E2A, 0x2E2E, + 0x2E30, 0x2E39, + 0x2E3C, 0x2E3F, + 0x2E43, 0x2E4F, + 0x2E52, 0x2E54, + 0x3001, 0x3003, + 0xA4FE, 0xA4FF, + 0xA60D, 0xA60F, + 0xA6F2, 0xA6F7, + 0xA874, 0xA877, + 0xA8CE, 0xA8CF, + 0xA8F8, 0xA8FA, + 0xA92E, 0xA92F, + 0xA9C1, 0xA9CD, + 0xA9DE, 0xA9DF, + 0xAA5C, 0xAA5F, + 0xAADE, 0xAADF, + 0xAAF0, 0xAAF1, + 0xFE10, 0xFE16, + 0xFE45, 0xFE46, + 0xFE49, 0xFE4C, + 0xFE50, 0xFE52, + 0xFE54, 0xFE57, + 0xFE5F, 0xFE61, + 0xFE6A, 0xFE6B, + 0xFF01, 0xFF03, + 0xFF05, 0xFF07, + 0xFF0E, 0xFF0F, + 0xFF1A, 0xFF1B, + 0xFF1F, 0xFF20, + 0xFF64, 0xFF65, +} + +@(rodata) +po_singles32 := [?]i32{ + 0x1039F, 0x103D0, 0x1056F, 0x10857, 0x1091F, 0x1093F, 0x10A7F, 0x10ED0, + 0x111CD, 0x111DB, 0x112A9, 0x1145D, 0x114C6, 0x116B9, 0x1183B, 0x119E2, + 0x11BE1, 0x11FFF, 0x16AF5, 0x16B44, 0x16FE2, 0x1BC9F, 0x1E5FF, +} + +@(rodata) +po_ranges32 := [?]i32{ + 0x10100, 0x10102, + 0x10A50, 0x10A58, + 0x10AF0, 0x10AF6, + 0x10B39, 0x10B3F, + 0x10B99, 0x10B9C, + 0x10F55, 0x10F59, + 0x10F86, 0x10F89, + 0x11047, 0x1104D, + 0x110BB, 0x110BC, + 0x110BE, 0x110C1, + 0x11140, 0x11143, + 0x11174, 0x11175, + 0x111C5, 0x111C8, + 0x111DD, 0x111DF, + 0x11238, 0x1123D, + 0x113D4, 0x113D5, + 0x113D7, 0x113D8, + 0x1144B, 0x1144F, + 0x1145A, 0x1145B, + 0x115C1, 0x115D7, + 0x11641, 0x11643, + 0x11660, 0x1166C, + 0x1173C, 0x1173E, + 0x11944, 0x11946, + 0x11A3F, 0x11A46, + 0x11A9A, 0x11A9C, + 0x11A9E, 0x11AA2, + 0x11B00, 0x11B09, + 0x11C41, 0x11C45, + 0x11C70, 0x11C71, + 0x11EF7, 0x11EF8, + 0x11F43, 0x11F4F, + 0x12470, 0x12474, + 0x12FF1, 0x12FF2, + 0x16A6E, 0x16A6F, + 0x16B37, 0x16B3B, + 0x16D6D, 0x16D6F, + 0x16E97, 0x16E9A, + 0x1DA87, 0x1DA8B, + 0x1E95E, 0x1E95F, +} + +po_ranges := Range{ + single_16 = po_singles16[:], + ranges_16 = po_ranges16[:], + single_32 = po_singles32[:], + ranges_32 = po_ranges32[:], +} + +@(rodata) +ps_singles16 := [?]u16{ + 0x0028, 0x005B, 0x007B, 0x0F3A, 0x0F3C, 0x169B, 0x201A, 0x201E, 0x2045, 0x207D, + 0x208D, 0x2308, 0x230A, 0x2329, 0x2768, 0x276A, 0x276C, 0x276E, 0x2770, 0x2772, + 0x2774, 0x27C5, 0x27E6, 0x27E8, 0x27EA, 0x27EC, 0x27EE, 0x2983, 0x2985, 0x2987, + 0x2989, 0x298B, 0x298D, 0x298F, 0x2991, 0x2993, 0x2995, 0x2997, 0x29D8, 0x29DA, + 0x29FC, 0x2E22, 0x2E24, 0x2E26, 0x2E28, 0x2E42, 0x2E55, 0x2E57, 0x2E59, 0x2E5B, + 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016, 0x3018, 0x301A, 0x301D, + 0xFD3F, 0xFE17, 0xFE35, 0xFE37, 0xFE39, 0xFE3B, 0xFE3D, 0xFE3F, 0xFE41, 0xFE43, + 0xFE47, 0xFE59, 0xFE5B, 0xFE5D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F, 0xFF62, +} + +ps_ranges := Range{ + single_16 = ps_singles16[:], +} + @(rodata) extra_digits_singles16 := [?]u16{ 0x00B9, 0x19DA, 0x2070, 0x24EA, 0x24FF, diff --git a/core/unicode/tools/generate_unicode.odin b/core/unicode/tools/generate_unicode.odin index 5962a269c..489b778ac 100644 --- a/core/unicode/tools/generate_unicode.odin +++ b/core/unicode/tools/generate_unicode.odin @@ -284,13 +284,13 @@ main :: proc() { //.Nd, // Decimal_Number, a decimal digit //.Nl, // Letter_Number, a letterlike numeric character //.No, // Other_Number, a numeric character of other type - .Pc, // Connector_Punctuation, a connecting punctuation mark, like a tie - .Pd, // Dash_Punctuation, a dash or hyphen punctuation mark - .Pe, // Close_Punctuation, a closing punctuation mark (of a pair) - .Pf, // Final_Punctuation, a final quotation mark - .Pi, // Initial_Punctuation, an initial quotation mark - .Po, // Other_Punctuation, a punctuation mark of other type - .Ps, // Open_Punctuation, an opening punctuation mark (of a pair) + // .Pc, // Connector_Punctuation, a connecting punctuation mark, like a tie + // .Pd, // Dash_Punctuation, a dash or hyphen punctuation mark + // .Pe, // Close_Punctuation, a closing punctuation mark (of a pair) + // .Pf, // Final_Punctuation, a final quotation mark + // .Pi, // Initial_Punctuation, an initial quotation mark + // .Po, // Other_Punctuation, a punctuation mark of other type + // .Ps, // Open_Punctuation, an opening punctuation mark (of a pair) .Sc, // Currency_Symbol, a currency sign .Sk, // Modifier_Symbol, a non-letterlike modifier symbol .Sm, // Math_Symbol, a symbol of mathematical use From 8f5f1ee1cc55a9ccaccfe9740bed7605685fa3d9 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 16:00:34 -0400 Subject: [PATCH 626/766] is_punct now searches generated tables --- core/unicode/letter.odin | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 29ea86ca9..6df645484 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -242,7 +242,16 @@ is_punct :: proc(r: rune) -> bool #no_bounds_check { if u32(r) <= MAX_LATIN1 { return char_properties[u8(r)]&pP != 0 } - return false + + if in_range(r, pc_ranges) || in_range(r, pd_ranges) || in_range(r, pe_ranges) { + return true + } + + if in_range(r, pf_ranges) || in_range(r, pi_ranges) || in_range(r, po_ranges) { + return true + } + + return in_range(r, ps_ranges) } @(require_results) From 65d0e5c82f1a6284ac925b84fac120531a123de7 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 16:20:35 -0400 Subject: [PATCH 627/766] is_symbol uses generated Unicode tables Tables for Sm, Sc, Sk, So are now being generated. These tables are now being searched by is_symbol --- core/unicode/generated.odin | 301 +++++++++++++++++++++++ core/unicode/letter.odin | 7 + core/unicode/tools/generate_unicode.odin | 8 +- 3 files changed, 312 insertions(+), 4 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index c2a26ae2e..d35aa020c 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -1442,6 +1442,307 @@ ps_ranges := Range{ single_16 = ps_singles16[:], } +@(rodata) +sc_singles16 := [?]u16{ + 0x0024, 0x058F, 0x060B, 0x09FB, 0x0AF1, 0x0BF9, 0x0E3F, 0x17DB, 0xA838, 0xFDFC, + 0xFE69, 0xFF04, +} + +@(rodata) +sc_ranges16 := [?]u16{ + 0x00A2, 0x00A5, + 0x07FE, 0x07FF, + 0x09F2, 0x09F3, + 0x20A0, 0x20C1, + 0xFFE0, 0xFFE1, + 0xFFE5, 0xFFE6, +} + +@(rodata) +sc_singles32 := [?]i32{ + 0x1E2FF, 0x1ECB0, +} + +@(rodata) +sc_ranges32 := [?]i32{ + 0x11FDD, 0x11FE0, +} + +sc_ranges := Range{ + single_16 = sc_singles16[:], + ranges_16 = sc_ranges16[:], + single_32 = sc_singles32[:], + ranges_32 = sc_ranges32[:], +} + +@(rodata) +sk_singles16 := [?]u16{ + 0x005E, 0x0060, 0x00A8, 0x00AF, 0x00B4, 0x00B8, 0x02ED, 0x0375, 0x0888, 0x1FBD, + 0xAB5B, 0xFF3E, 0xFF40, 0xFFE3, +} + +@(rodata) +sk_ranges16 := [?]u16{ + 0x02C2, 0x02C5, + 0x02D2, 0x02DF, + 0x02E5, 0x02EB, + 0x02EF, 0x02FF, + 0x0384, 0x0385, + 0x1FBF, 0x1FC1, + 0x1FCD, 0x1FCF, + 0x1FDD, 0x1FDF, + 0x1FED, 0x1FEF, + 0x1FFD, 0x1FFE, + 0x309B, 0x309C, + 0xA700, 0xA716, + 0xA720, 0xA721, + 0xA789, 0xA78A, + 0xAB6A, 0xAB6B, + 0xFBB2, 0xFBC2, +} + +@(rodata) +sk_ranges32 := [?]i32{ + 0x1F3FB, 0x1F3FF, +} + +sk_ranges := Range{ + single_16 = sk_singles16[:], + ranges_16 = sk_ranges16[:], + ranges_32 = sk_ranges32[:], +} + +@(rodata) +sm_singles16 := [?]u16{ + 0x002B, 0x007C, 0x007E, 0x00AC, 0x00B1, 0x00D7, 0x00F7, 0x03F6, 0x2044, 0x2052, + 0x2118, 0x214B, 0x21A0, 0x21A3, 0x21A6, 0x21AE, 0x21D2, 0x21D4, 0x237C, 0x25B7, + 0x25C1, 0x266F, 0xFB29, 0xFE62, 0xFF0B, 0xFF5C, 0xFF5E, 0xFFE2, +} + +@(rodata) +sm_ranges16 := [?]u16{ + 0x003C, 0x003E, + 0x0606, 0x0608, + 0x207A, 0x207C, + 0x208A, 0x208C, + 0x2140, 0x2144, + 0x2190, 0x2194, + 0x219A, 0x219B, + 0x21CE, 0x21CF, + 0x21F4, 0x22FF, + 0x2320, 0x2321, + 0x239B, 0x23B3, + 0x23DC, 0x23E1, + 0x25F8, 0x25FF, + 0x27C0, 0x27C4, + 0x27C7, 0x27E5, + 0x27F0, 0x27FF, + 0x2900, 0x2982, + 0x2999, 0x29D7, + 0x29DC, 0x29FB, + 0x29FE, 0x2AFF, + 0x2B30, 0x2B44, + 0x2B47, 0x2B4C, + 0xFE64, 0xFE66, + 0xFF1C, 0xFF1E, + 0xFFE9, 0xFFEC, +} + +@(rodata) +sm_singles32 := [?]i32{ + 0x1CEF0, 0x1D6C1, 0x1D6DB, 0x1D6FB, 0x1D715, 0x1D735, 0x1D74F, 0x1D76F, + 0x1D789, 0x1D7A9, 0x1D7C3, +} + +@(rodata) +sm_ranges32 := [?]i32{ + 0x10D8E, 0x10D8F, + 0x1EEF0, 0x1EEF1, + 0x1F8D0, 0x1F8D8, +} + +sm_ranges := Range{ + single_16 = sm_singles16[:], + ranges_16 = sm_ranges16[:], + single_32 = sm_singles32[:], + ranges_32 = sm_ranges32[:], +} + +@(rodata) +so_singles16 := [?]u16{ + 0x00A6, 0x00A9, 0x00AE, 0x00B0, 0x0482, 0x06DE, 0x06E9, 0x07F6, 0x09FA, 0x0B70, + 0x0BFA, 0x0C7F, 0x0D4F, 0x0D79, 0x0F13, 0x0F34, 0x0F36, 0x0F38, 0x166D, 0x1940, + 0x2114, 0x2125, 0x2127, 0x2129, 0x212E, 0x214A, 0x214F, 0x21D3, 0x3004, 0x3020, + 0x31EF, 0x3250, 0xA839, 0xFFE4, 0xFFE8, +} + +@(rodata) +so_ranges16 := [?]u16{ + 0x058D, 0x058E, + 0x060E, 0x060F, + 0x06FD, 0x06FE, + 0x0BF3, 0x0BF8, + 0x0F01, 0x0F03, + 0x0F15, 0x0F17, + 0x0F1A, 0x0F1F, + 0x0FBE, 0x0FC5, + 0x0FC7, 0x0FCC, + 0x0FCE, 0x0FCF, + 0x0FD5, 0x0FD8, + 0x109E, 0x109F, + 0x1390, 0x1399, + 0x19DE, 0x19FF, + 0x1B61, 0x1B6A, + 0x1B74, 0x1B7C, + 0x2100, 0x2101, + 0x2103, 0x2106, + 0x2108, 0x2109, + 0x2116, 0x2117, + 0x211E, 0x2123, + 0x213A, 0x213B, + 0x214C, 0x214D, + 0x218A, 0x218B, + 0x2195, 0x2199, + 0x219C, 0x219F, + 0x21A1, 0x21A2, + 0x21A4, 0x21A5, + 0x21A7, 0x21AD, + 0x21AF, 0x21CD, + 0x21D0, 0x21D1, + 0x21D5, 0x21F3, + 0x2300, 0x2307, + 0x230C, 0x231F, + 0x2322, 0x2328, + 0x232B, 0x237B, + 0x237D, 0x239A, + 0x23B4, 0x23DB, + 0x23E2, 0x2429, + 0x2440, 0x244A, + 0x249C, 0x24E9, + 0x2500, 0x25B6, + 0x25B8, 0x25C0, + 0x25C2, 0x25F7, + 0x2600, 0x266E, + 0x2670, 0x2767, + 0x2794, 0x27BF, + 0x2800, 0x28FF, + 0x2B00, 0x2B2F, + 0x2B45, 0x2B46, + 0x2B4D, 0x2B73, + 0x2B76, 0x2BFF, + 0x2CE5, 0x2CEA, + 0x2E50, 0x2E51, + 0x2E80, 0x2E99, + 0x2E9B, 0x2EF3, + 0x2F00, 0x2FD5, + 0x2FF0, 0x2FFF, + 0x3012, 0x3013, + 0x3036, 0x3037, + 0x303E, 0x303F, + 0x3190, 0x3191, + 0x3196, 0x319F, + 0x31C0, 0x31E5, + 0x3200, 0x321E, + 0x322A, 0x3247, + 0x3260, 0x327F, + 0x328A, 0x32B0, + 0x32C0, 0x33FF, + 0x4DC0, 0x4DFF, + 0xA490, 0xA4C6, + 0xA828, 0xA82B, + 0xA836, 0xA837, + 0xAA77, 0xAA79, + 0xFBC3, 0xFBD2, + 0xFD40, 0xFD4F, + 0xFD90, 0xFD91, + 0xFDC8, 0xFDCF, + 0xFDFD, 0xFDFF, + 0xFFED, 0xFFEE, + 0xFFFC, 0xFFFD, +} + +@(rodata) +so_singles32 := [?]i32{ + 0x101A0, 0x10AC8, 0x1173F, 0x16B45, 0x1BC9C, 0x1D245, 0x1E14F, 0x1ECAC, + 0x1ED2E, 0x1F7F0, 0x1FAC8, 0x1FBFA, +} + +@(rodata) +so_ranges32 := [?]i32{ + 0x10137, 0x1013F, + 0x10179, 0x10189, + 0x1018C, 0x1018E, + 0x10190, 0x1019C, + 0x101D0, 0x101FC, + 0x10877, 0x10878, + 0x10ED1, 0x10ED8, + 0x11FD5, 0x11FDC, + 0x11FE1, 0x11FF1, + 0x16B3C, 0x16B3F, + 0x1CC00, 0x1CCEF, + 0x1CCFA, 0x1CCFC, + 0x1CD00, 0x1CEB3, + 0x1CEBA, 0x1CED0, + 0x1CEE0, 0x1CEEF, + 0x1CF50, 0x1CFC3, + 0x1D000, 0x1D0F5, + 0x1D100, 0x1D126, + 0x1D129, 0x1D164, + 0x1D16A, 0x1D16C, + 0x1D183, 0x1D184, + 0x1D18C, 0x1D1A9, + 0x1D1AE, 0x1D1EA, + 0x1D200, 0x1D241, + 0x1D300, 0x1D356, + 0x1D800, 0x1D9FF, + 0x1DA37, 0x1DA3A, + 0x1DA6D, 0x1DA74, + 0x1DA76, 0x1DA83, + 0x1DA85, 0x1DA86, + 0x1F000, 0x1F02B, + 0x1F030, 0x1F093, + 0x1F0A0, 0x1F0AE, + 0x1F0B1, 0x1F0BF, + 0x1F0C1, 0x1F0CF, + 0x1F0D1, 0x1F0F5, + 0x1F10D, 0x1F1AD, + 0x1F1E6, 0x1F202, + 0x1F210, 0x1F23B, + 0x1F240, 0x1F248, + 0x1F250, 0x1F251, + 0x1F260, 0x1F265, + 0x1F300, 0x1F3FA, + 0x1F400, 0x1F6D8, + 0x1F6DC, 0x1F6EC, + 0x1F6F0, 0x1F6FC, + 0x1F700, 0x1F7D9, + 0x1F7E0, 0x1F7EB, + 0x1F800, 0x1F80B, + 0x1F810, 0x1F847, + 0x1F850, 0x1F859, + 0x1F860, 0x1F887, + 0x1F890, 0x1F8AD, + 0x1F8B0, 0x1F8BB, + 0x1F8C0, 0x1F8C1, + 0x1F900, 0x1FA57, + 0x1FA60, 0x1FA6D, + 0x1FA70, 0x1FA7C, + 0x1FA80, 0x1FA8A, + 0x1FA8E, 0x1FAC6, + 0x1FACD, 0x1FADC, + 0x1FADF, 0x1FAEA, + 0x1FAEF, 0x1FAF8, + 0x1FB00, 0x1FB92, + 0x1FB94, 0x1FBEF, +} + +so_ranges := Range{ + single_16 = so_singles16[:], + ranges_16 = so_ranges16[:], + single_32 = so_singles32[:], + ranges_32 = so_ranges32[:], +} + @(rodata) extra_digits_singles16 := [?]u16{ 0x00B9, 0x19DA, 0x2070, 0x24EA, 0x24FF, diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 6df645484..c6df96f3f 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -259,6 +259,13 @@ is_symbol :: proc(r: rune) -> bool #no_bounds_check { if u32(r) <= MAX_LATIN1 { return char_properties[u8(r)]&pS != 0 } + + s := in_range(r, sc_ranges) || in_range(r, sm_ranges) + + if s || in_range(r, so_ranges) || in_range(r, sk_ranges) { + return true + } + return false } diff --git a/core/unicode/tools/generate_unicode.odin b/core/unicode/tools/generate_unicode.odin index 489b778ac..27cee0012 100644 --- a/core/unicode/tools/generate_unicode.odin +++ b/core/unicode/tools/generate_unicode.odin @@ -291,10 +291,10 @@ main :: proc() { // .Pi, // Initial_Punctuation, an initial quotation mark // .Po, // Other_Punctuation, a punctuation mark of other type // .Ps, // Open_Punctuation, an opening punctuation mark (of a pair) - .Sc, // Currency_Symbol, a currency sign - .Sk, // Modifier_Symbol, a non-letterlike modifier symbol - .Sm, // Math_Symbol, a symbol of mathematical use - .So, // Other_Symbol, a symbol of other type + // .Sc, // Currency_Symbol, a currency sign + // .Sk, // Modifier_Symbol, a non-letterlike modifier symbol + // .Sm, // Math_Symbol, a symbol of mathematical use + // .So, // Other_Symbol, a symbol of other type .Zl, // Line_Separator, U+2028 LINE SEPARATOR only .Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only .Zs, // Space_Separator, a space character (of various non-zero widths) From 1d0510d27f8ebbc1101a4a9c473a6d994a4fde44 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 19:00:06 -0400 Subject: [PATCH 628/766] is_graphic now uses the generated Unicode tables unicode.is_graphic has been modified to use the generted Unicode tables. The tables Me, Mn, Mc, and Zs were add as needed by is_graphic. --- core/unicode/generated.odin | 454 +++++++++++++++++++++++ core/unicode/letter.odin | 9 + core/unicode/tools/generate_unicode.odin | 12 +- 3 files changed, 469 insertions(+), 6 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index d35aa020c..85d4e9e8b 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -978,6 +978,445 @@ lu_ranges := Range{ ranges_32 = lu_ranges32[:], } +@(rodata) +mc_singles16 := [?]u16{ + 0x0903, 0x093B, 0x09D7, 0x0A03, 0x0A83, 0x0AC9, 0x0B3E, 0x0B40, 0x0B57, 0x0BD7, + 0x0CBE, 0x0CF3, 0x0D57, 0x0F7F, 0x1031, 0x1038, 0x108F, 0x1715, 0x1734, 0x17B6, + 0x1A55, 0x1A57, 0x1A61, 0x1B04, 0x1B35, 0x1B3B, 0x1B82, 0x1BA1, 0x1BAA, 0x1BE7, + 0x1BEE, 0x1CE1, 0x1CF7, 0xA827, 0xA983, 0xAA4D, 0xAA7B, 0xAA7D, 0xAAEB, 0xAAF5, + 0xABEC, +} + +@(rodata) +mc_ranges16 := [?]u16{ + 0x093E, 0x0940, + 0x0949, 0x094C, + 0x094E, 0x094F, + 0x0982, 0x0983, + 0x09BE, 0x09C0, + 0x09C7, 0x09C8, + 0x09CB, 0x09CC, + 0x0A3E, 0x0A40, + 0x0ABE, 0x0AC0, + 0x0ACB, 0x0ACC, + 0x0B02, 0x0B03, + 0x0B47, 0x0B48, + 0x0B4B, 0x0B4C, + 0x0BBE, 0x0BBF, + 0x0BC1, 0x0BC2, + 0x0BC6, 0x0BC8, + 0x0BCA, 0x0BCC, + 0x0C01, 0x0C03, + 0x0C41, 0x0C44, + 0x0C82, 0x0C83, + 0x0CC0, 0x0CC4, + 0x0CC7, 0x0CC8, + 0x0CCA, 0x0CCB, + 0x0CD5, 0x0CD6, + 0x0D02, 0x0D03, + 0x0D3E, 0x0D40, + 0x0D46, 0x0D48, + 0x0D4A, 0x0D4C, + 0x0D82, 0x0D83, + 0x0DCF, 0x0DD1, + 0x0DD8, 0x0DDF, + 0x0DF2, 0x0DF3, + 0x0F3E, 0x0F3F, + 0x102B, 0x102C, + 0x103B, 0x103C, + 0x1056, 0x1057, + 0x1062, 0x1064, + 0x1067, 0x106D, + 0x1083, 0x1084, + 0x1087, 0x108C, + 0x109A, 0x109C, + 0x17BE, 0x17C5, + 0x17C7, 0x17C8, + 0x1923, 0x1926, + 0x1929, 0x192B, + 0x1930, 0x1931, + 0x1933, 0x1938, + 0x1A19, 0x1A1A, + 0x1A63, 0x1A64, + 0x1A6D, 0x1A72, + 0x1B3D, 0x1B41, + 0x1B43, 0x1B44, + 0x1BA6, 0x1BA7, + 0x1BEA, 0x1BEC, + 0x1BF2, 0x1BF3, + 0x1C24, 0x1C2B, + 0x1C34, 0x1C35, + 0x302E, 0x302F, + 0xA823, 0xA824, + 0xA880, 0xA881, + 0xA8B4, 0xA8C3, + 0xA952, 0xA953, + 0xA9B4, 0xA9B5, + 0xA9BA, 0xA9BB, + 0xA9BE, 0xA9C0, + 0xAA2F, 0xAA30, + 0xAA33, 0xAA34, + 0xAAEE, 0xAAEF, + 0xABE3, 0xABE4, + 0xABE6, 0xABE7, + 0xABE9, 0xABEA, +} + +@(rodata) +mc_singles32 := [?]i32{ + 0x11000, 0x11002, 0x11082, 0x1112C, 0x11182, 0x111CE, 0x11235, 0x11357, + 0x113C2, 0x113C5, 0x113CF, 0x11445, 0x114B9, 0x114C1, 0x115BE, 0x1163E, + 0x116AC, 0x116B6, 0x1171E, 0x11726, 0x11838, 0x1193D, 0x11940, 0x11942, + 0x119E4, 0x11A39, 0x11A97, 0x11B61, 0x11B65, 0x11B67, 0x11C2F, 0x11C3E, + 0x11CA9, 0x11CB1, 0x11CB4, 0x11D96, 0x11F03, 0x11F41, +} + +@(rodata) +mc_ranges32 := [?]i32{ + 0x110B0, 0x110B2, + 0x110B7, 0x110B8, + 0x11145, 0x11146, + 0x111B3, 0x111B5, + 0x111BF, 0x111C0, + 0x1122C, 0x1122E, + 0x11232, 0x11233, + 0x112E0, 0x112E2, + 0x11302, 0x11303, + 0x1133E, 0x1133F, + 0x11341, 0x11344, + 0x11347, 0x11348, + 0x1134B, 0x1134D, + 0x11362, 0x11363, + 0x113B8, 0x113BA, + 0x113C7, 0x113CA, + 0x113CC, 0x113CD, + 0x11435, 0x11437, + 0x11440, 0x11441, + 0x114B0, 0x114B2, + 0x114BB, 0x114BE, + 0x115AF, 0x115B1, + 0x115B8, 0x115BB, + 0x11630, 0x11632, + 0x1163B, 0x1163C, + 0x116AE, 0x116AF, + 0x11720, 0x11721, + 0x1182C, 0x1182E, + 0x11930, 0x11935, + 0x11937, 0x11938, + 0x119D1, 0x119D3, + 0x119DC, 0x119DF, + 0x11A57, 0x11A58, + 0x11D8A, 0x11D8E, + 0x11D93, 0x11D94, + 0x11EF5, 0x11EF6, + 0x11F34, 0x11F35, + 0x11F3E, 0x11F3F, + 0x1612A, 0x1612C, + 0x16F51, 0x16F87, + 0x16FF0, 0x16FF1, + 0x1D165, 0x1D166, + 0x1D16D, 0x1D172, +} + +mc_ranges := Range{ + single_16 = mc_singles16[:], + ranges_16 = mc_ranges16[:], + single_32 = mc_singles32[:], + ranges_32 = mc_ranges32[:], +} + +@(rodata) +me_singles16 := [?]u16{ + 0x1ABE, +} + +@(rodata) +me_ranges16 := [?]u16{ + 0x0488, 0x0489, + 0x20DD, 0x20E0, + 0x20E2, 0x20E4, + 0xA670, 0xA672, +} + +me_ranges := Range{ + single_16 = me_singles16[:], + ranges_16 = me_ranges16[:], +} + +@(rodata) +mn_singles16 := [?]u16{ + 0x05BF, 0x05C7, 0x0670, 0x0711, 0x07FD, 0x093A, 0x093C, 0x094D, 0x0981, 0x09BC, + 0x09CD, 0x09FE, 0x0A3C, 0x0A51, 0x0A75, 0x0ABC, 0x0ACD, 0x0B01, 0x0B3C, 0x0B3F, + 0x0B4D, 0x0B82, 0x0BC0, 0x0BCD, 0x0C00, 0x0C04, 0x0C3C, 0x0C81, 0x0CBC, 0x0CBF, + 0x0CC6, 0x0D4D, 0x0D81, 0x0DCA, 0x0DD6, 0x0E31, 0x0EB1, 0x0F35, 0x0F37, 0x0F39, + 0x0FC6, 0x1082, 0x108D, 0x109D, 0x17C6, 0x17DD, 0x180F, 0x18A9, 0x1932, 0x1A1B, + 0x1A56, 0x1A60, 0x1A62, 0x1A7F, 0x1B34, 0x1B3C, 0x1B42, 0x1BE6, 0x1BED, 0x1CED, + 0x1CF4, 0x20E1, 0x2D7F, 0xA66F, 0xA802, 0xA806, 0xA80B, 0xA82C, 0xA8FF, 0xA9B3, + 0xA9E5, 0xAA43, 0xAA4C, 0xAA7C, 0xAAB0, 0xAAC1, 0xAAF6, 0xABE5, 0xABE8, 0xABED, + 0xFB1E, +} + +@(rodata) +mn_ranges16 := [?]u16{ + 0x0300, 0x036F, + 0x0483, 0x0487, + 0x0591, 0x05BD, + 0x05C1, 0x05C2, + 0x05C4, 0x05C5, + 0x0610, 0x061A, + 0x064B, 0x065F, + 0x06D6, 0x06DC, + 0x06DF, 0x06E4, + 0x06E7, 0x06E8, + 0x06EA, 0x06ED, + 0x0730, 0x074A, + 0x07A6, 0x07B0, + 0x07EB, 0x07F3, + 0x0816, 0x0819, + 0x081B, 0x0823, + 0x0825, 0x0827, + 0x0829, 0x082D, + 0x0859, 0x085B, + 0x0897, 0x089F, + 0x08CA, 0x08E1, + 0x08E3, 0x0902, + 0x0941, 0x0948, + 0x0951, 0x0957, + 0x0962, 0x0963, + 0x09C1, 0x09C4, + 0x09E2, 0x09E3, + 0x0A01, 0x0A02, + 0x0A41, 0x0A42, + 0x0A47, 0x0A48, + 0x0A4B, 0x0A4D, + 0x0A70, 0x0A71, + 0x0A81, 0x0A82, + 0x0AC1, 0x0AC5, + 0x0AC7, 0x0AC8, + 0x0AE2, 0x0AE3, + 0x0AFA, 0x0AFF, + 0x0B41, 0x0B44, + 0x0B55, 0x0B56, + 0x0B62, 0x0B63, + 0x0C3E, 0x0C40, + 0x0C46, 0x0C48, + 0x0C4A, 0x0C4D, + 0x0C55, 0x0C56, + 0x0C62, 0x0C63, + 0x0CCC, 0x0CCD, + 0x0CE2, 0x0CE3, + 0x0D00, 0x0D01, + 0x0D3B, 0x0D3C, + 0x0D41, 0x0D44, + 0x0D62, 0x0D63, + 0x0DD2, 0x0DD4, + 0x0E34, 0x0E3A, + 0x0E47, 0x0E4E, + 0x0EB4, 0x0EBC, + 0x0EC8, 0x0ECE, + 0x0F18, 0x0F19, + 0x0F71, 0x0F7E, + 0x0F80, 0x0F84, + 0x0F86, 0x0F87, + 0x0F8D, 0x0F97, + 0x0F99, 0x0FBC, + 0x102D, 0x1030, + 0x1032, 0x1037, + 0x1039, 0x103A, + 0x103D, 0x103E, + 0x1058, 0x1059, + 0x105E, 0x1060, + 0x1071, 0x1074, + 0x1085, 0x1086, + 0x135D, 0x135F, + 0x1712, 0x1714, + 0x1732, 0x1733, + 0x1752, 0x1753, + 0x1772, 0x1773, + 0x17B4, 0x17B5, + 0x17B7, 0x17BD, + 0x17C9, 0x17D3, + 0x180B, 0x180D, + 0x1885, 0x1886, + 0x1920, 0x1922, + 0x1927, 0x1928, + 0x1939, 0x193B, + 0x1A17, 0x1A18, + 0x1A58, 0x1A5E, + 0x1A65, 0x1A6C, + 0x1A73, 0x1A7C, + 0x1AB0, 0x1ABD, + 0x1ABF, 0x1ADD, + 0x1AE0, 0x1AEB, + 0x1B00, 0x1B03, + 0x1B36, 0x1B3A, + 0x1B6B, 0x1B73, + 0x1B80, 0x1B81, + 0x1BA2, 0x1BA5, + 0x1BA8, 0x1BA9, + 0x1BAB, 0x1BAD, + 0x1BE8, 0x1BE9, + 0x1BEF, 0x1BF1, + 0x1C2C, 0x1C33, + 0x1C36, 0x1C37, + 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CE0, + 0x1CE2, 0x1CE8, + 0x1CF8, 0x1CF9, + 0x1DC0, 0x1DFF, + 0x20D0, 0x20DC, + 0x20E5, 0x20F0, + 0x2CEF, 0x2CF1, + 0x2DE0, 0x2DFF, + 0x302A, 0x302D, + 0x3099, 0x309A, + 0xA674, 0xA67D, + 0xA69E, 0xA69F, + 0xA6F0, 0xA6F1, + 0xA825, 0xA826, + 0xA8C4, 0xA8C5, + 0xA8E0, 0xA8F1, + 0xA926, 0xA92D, + 0xA947, 0xA951, + 0xA980, 0xA982, + 0xA9B6, 0xA9B9, + 0xA9BC, 0xA9BD, + 0xAA29, 0xAA2E, + 0xAA31, 0xAA32, + 0xAA35, 0xAA36, + 0xAAB2, 0xAAB4, + 0xAAB7, 0xAAB8, + 0xAABE, 0xAABF, + 0xAAEC, 0xAAED, + 0xFE00, 0xFE0F, + 0xFE20, 0xFE2F, +} + +@(rodata) +mn_singles32 := [?]i32{ + 0x101FD, 0x102E0, 0x10A3F, 0x11001, 0x11070, 0x110C2, 0x11173, 0x111CF, + 0x11234, 0x1123E, 0x11241, 0x112DF, 0x11340, 0x113CE, 0x113D0, 0x113D2, + 0x11446, 0x1145E, 0x114BA, 0x1163D, 0x116AB, 0x116AD, 0x116B7, 0x1171D, + 0x1171F, 0x1193E, 0x11943, 0x119E0, 0x11A47, 0x11B60, 0x11B66, 0x11C3F, + 0x11D3A, 0x11D47, 0x11D95, 0x11D97, 0x11F40, 0x11F42, 0x11F5A, 0x13440, + 0x16F4F, 0x16FE4, 0x1DA75, 0x1DA84, 0x1E08F, 0x1E2AE, 0x1E6E3, 0x1E6E6, + 0x1E6F5, +} + +@(rodata) +mn_ranges32 := [?]i32{ + 0x10376, 0x1037A, + 0x10A01, 0x10A03, + 0x10A05, 0x10A06, + 0x10A0C, 0x10A0F, + 0x10A38, 0x10A3A, + 0x10AE5, 0x10AE6, + 0x10D24, 0x10D27, + 0x10D69, 0x10D6D, + 0x10EAB, 0x10EAC, + 0x10EFA, 0x10EFF, + 0x10F46, 0x10F50, + 0x10F82, 0x10F85, + 0x11038, 0x11046, + 0x11073, 0x11074, + 0x1107F, 0x11081, + 0x110B3, 0x110B6, + 0x110B9, 0x110BA, + 0x11100, 0x11102, + 0x11127, 0x1112B, + 0x1112D, 0x11134, + 0x11180, 0x11181, + 0x111B6, 0x111BE, + 0x111C9, 0x111CC, + 0x1122F, 0x11231, + 0x11236, 0x11237, + 0x112E3, 0x112EA, + 0x11300, 0x11301, + 0x1133B, 0x1133C, + 0x11366, 0x1136C, + 0x11370, 0x11374, + 0x113BB, 0x113C0, + 0x113E1, 0x113E2, + 0x11438, 0x1143F, + 0x11442, 0x11444, + 0x114B3, 0x114B8, + 0x114BF, 0x114C0, + 0x114C2, 0x114C3, + 0x115B2, 0x115B5, + 0x115BC, 0x115BD, + 0x115BF, 0x115C0, + 0x115DC, 0x115DD, + 0x11633, 0x1163A, + 0x1163F, 0x11640, + 0x116B0, 0x116B5, + 0x11722, 0x11725, + 0x11727, 0x1172B, + 0x1182F, 0x11837, + 0x11839, 0x1183A, + 0x1193B, 0x1193C, + 0x119D4, 0x119D7, + 0x119DA, 0x119DB, + 0x11A01, 0x11A0A, + 0x11A33, 0x11A38, + 0x11A3B, 0x11A3E, + 0x11A51, 0x11A56, + 0x11A59, 0x11A5B, + 0x11A8A, 0x11A96, + 0x11A98, 0x11A99, + 0x11B62, 0x11B64, + 0x11C30, 0x11C36, + 0x11C38, 0x11C3D, + 0x11C92, 0x11CA7, + 0x11CAA, 0x11CB0, + 0x11CB2, 0x11CB3, + 0x11CB5, 0x11CB6, + 0x11D31, 0x11D36, + 0x11D3C, 0x11D3D, + 0x11D3F, 0x11D45, + 0x11D90, 0x11D91, + 0x11EF3, 0x11EF4, + 0x11F00, 0x11F01, + 0x11F36, 0x11F3A, + 0x13447, 0x13455, + 0x1611E, 0x16129, + 0x1612D, 0x1612F, + 0x16AF0, 0x16AF4, + 0x16B30, 0x16B36, + 0x16F8F, 0x16F92, + 0x1BC9D, 0x1BC9E, + 0x1CF00, 0x1CF2D, + 0x1CF30, 0x1CF46, + 0x1D167, 0x1D169, + 0x1D17B, 0x1D182, + 0x1D185, 0x1D18B, + 0x1D1AA, 0x1D1AD, + 0x1D242, 0x1D244, + 0x1DA00, 0x1DA36, + 0x1DA3B, 0x1DA6C, + 0x1DA9B, 0x1DA9F, + 0x1DAA1, 0x1DAAF, + 0x1E000, 0x1E006, + 0x1E008, 0x1E018, + 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, + 0x1E026, 0x1E02A, + 0x1E130, 0x1E136, + 0x1E2EC, 0x1E2EF, + 0x1E4EC, 0x1E4EF, + 0x1E5EE, 0x1E5EF, + 0x1E6EE, 0x1E6EF, + 0x1E8D0, 0x1E8D6, + 0x1E944, 0x1E94A, + 0xE0100, 0xE01EF, +} + +mn_ranges := Range{ + single_16 = mn_singles16[:], + ranges_16 = mn_ranges16[:], + single_32 = mn_singles32[:], + ranges_32 = mn_ranges32[:], +} + @(rodata) nd_ranges16 := [?]u16{ 0x0030, 0x0039, @@ -1743,6 +2182,21 @@ so_ranges := Range{ ranges_32 = so_ranges32[:], } +@(rodata) +zs_singles16 := [?]u16{ + 0x0020, 0x00A0, 0x1680, 0x202F, 0x205F, 0x3000, +} + +@(rodata) +zs_ranges16 := [?]u16{ + 0x2000, 0x200A, +} + +zs_ranges := Range{ + single_16 = zs_singles16[:], + ranges_16 = zs_ranges16[:], +} + @(rodata) extra_digits_singles16 := [?]u16{ 0x00B9, 0x19DA, 0x2070, 0x24EA, 0x24FF, diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index c6df96f3f..92aee9a68 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -197,6 +197,15 @@ is_graphic :: proc(r: rune) -> bool { if u32(r) <= MAX_LATIN1 { return char_properties[u8(r)]&pg != 0 } + + if is_letter(r) || is_number(r) || is_punct(r) || is_symbol(r) || in_range(r, zs_ranges) { + return true + } + + if in_range(r, mc_ranges) || in_range(r, me_ranges) || in_range(r, mn_ranges) { + return true + } + return false } diff --git a/core/unicode/tools/generate_unicode.odin b/core/unicode/tools/generate_unicode.odin index 27cee0012..f2d07442a 100644 --- a/core/unicode/tools/generate_unicode.odin +++ b/core/unicode/tools/generate_unicode.odin @@ -278,9 +278,9 @@ main :: proc() { // .Lo, // Other_Letter, other letters, including syllables and ideographs // .Lt, // Titlecase_Letter, a digraph encoded as a single character, with first part uppercase // .Lu, // Uppercase_Letter, an uppercase letter - .Mc, // Spacing_Mark, a spacing combining mark (positive advance width) - .Me, // Enclosing_Mark, an enclosing combining mark - .Mn, // Nonspacing_Mark, a nonspacing combining mark (zero advance width) + // .Mc, // Spacing_Mark, a spacing combining mark (positive advance width) + // .Me, // Enclosing_Mark, an enclosing combining mark + // .Mn, // Nonspacing_Mark, a nonspacing combining mark (zero advance width) //.Nd, // Decimal_Number, a decimal digit //.Nl, // Letter_Number, a letterlike numeric character //.No, // Other_Number, a numeric character of other type @@ -295,9 +295,9 @@ main :: proc() { // .Sk, // Modifier_Symbol, a non-letterlike modifier symbol // .Sm, // Math_Symbol, a symbol of mathematical use // .So, // Other_Symbol, a symbol of other type - .Zl, // Line_Separator, U+2028 LINE SEPARATOR only - .Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only - .Zs, // Space_Separator, a space character (of various non-zero widths) + .Zl, // Line_Separator, U+2028 LINE SEPARATOR only + .Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only + //.Zs, // Space_Separator, a space character (of various non-zero widths) } write_loop : for gc, i in general_category_ranges { From 3f330752cdbdca68d76385e712b5d8d8e7e1cb6d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Mar 2026 16:25:35 +0100 Subject: [PATCH 629/766] Replace iterators; fixes line ending handling --- .../tools/{ => ucd}/generate_unicode.odin | 34 ++++----- core/unicode/tools/ucd/iterator.odin | 70 ------------------- core/unicode/tools/ucd/ucd.odin | 44 ++++++++---- 3 files changed, 47 insertions(+), 101 deletions(-) rename core/unicode/tools/{ => ucd}/generate_unicode.odin (93%) delete mode 100644 core/unicode/tools/ucd/iterator.odin diff --git a/core/unicode/tools/generate_unicode.odin b/core/unicode/tools/ucd/generate_unicode.odin similarity index 93% rename from core/unicode/tools/generate_unicode.odin rename to core/unicode/tools/ucd/generate_unicode.odin index f2d07442a..36b6e2ac4 100644 --- a/core/unicode/tools/generate_unicode.odin +++ b/core/unicode/tools/ucd/generate_unicode.odin @@ -1,4 +1,5 @@ -package main +package ucd + import "core:fmt" import path "core:path/filepath" import "core:os" @@ -7,7 +8,6 @@ import "base:runtime" import "core:mem" import "core:io" import "core:log" -import "ucd" // Table 2-3. Types of Code Points // Table 4-4. General_Category Values page 229 @@ -16,7 +16,7 @@ import "ucd" /* -Formats a ucd.Dynamic_Range into a set of fixed length arrays and writes +Formats a Dynamic_Range into a set of fixed length arrays and writes corresponding to a io.Writer. The value of the parameter `name`will be used as a prefix to the array names. If a dynamic array contained in the `range` is empty, no corresponding fixed length array will be written. @@ -24,12 +24,12 @@ no corresponding fixed length array will be written. Inputs: - writer: The io.Writer to be written to. - name: Prefix to add to any array that is written to `writer` -- range: The ucd.Dynamic_Range to format and write to writer. +- range: The Dynamic_Range to format and write to writer. */ write_range_arrays :: proc( writer: io.Writer, name: string, - range : ucd.Dynamic_Range, + range : Dynamic_Range, ) -> int { n_written : int if len(range.single_16) > 0 { @@ -98,8 +98,8 @@ write_range_arrays :: proc( write_range :: proc( writer: io.Writer, name: union{string, - ucd.General_Category}, - range: ucd.Dynamic_Range, + General_Category}, + range: Dynamic_Range, ) -> (n_written: int) { buffer: [128]byte str: string @@ -110,7 +110,7 @@ write_range :: proc( runtime.mem_copy(&buffer[0], raw_data(n), len(n)) str = transmute(string) buffer[0:len(n)] - case ucd.General_Category: + case General_Category: str = fmt.bprintf(buffer[:], "%s", n) } @@ -221,28 +221,28 @@ main :: proc() { "tests","core","assets","UCD","UnicodeData.txt"}, context.allocator) defer delete(ucd_path) - unicode_data, ucd_err := ucd.load_unicode_data(ucd_path) + unicode_data, ucd_err := load_unicode_data(ucd_path) if ucd_err != nil { log.errorf("Error loading Unicode data. %s", ucd_err) } - defer ucd.destroy_unicode_data(unicode_data) + defer destroy_unicode_data(unicode_data) - general_category_ranges := ucd.gc_ranges(&unicode_data) - defer ucd.destroy_general_category_ranges(general_category_ranges) + general_category_ranges := gc_ranges(&unicode_data) + defer destroy_general_category_ranges(general_category_ranges) - extra_digits := ucd.extra_digits(&unicode_data) - defer ucd.destroy_dynamic_range(extra_digits) + extra_digits := extra_digits(&unicode_data) + defer destroy_dynamic_range(extra_digits) proplist_path, _ := path.join({ODIN_ROOT, "tests","core","assets","UCD","PropList.txt"}, context.allocator) defer delete(proplist_path) - proplist, proplist_err := ucd.load_protperty_list(proplist_path) + proplist, proplist_err := load_protperty_list(proplist_path) if proplist_err != nil { log.errorf("Error loading PropList.txt. %s", proplist_err) return } - defer ucd.destroy_protperty_list(proplist) + defer destroy_protperty_list(proplist) @@ -267,7 +267,7 @@ main :: proc() { //List of the general categories to skip when generating the code for //core/unicode/generated.txt. - to_exclude := [?]ucd.General_Category{ + to_exclude := [?]General_Category{ .Cc, // Control, a C0 or C1 control code .Cf, // Format, a format control character .Cn, // Unassigned, a reserved unassigned code point or a noncharacter diff --git a/core/unicode/tools/ucd/iterator.odin b/core/unicode/tools/ucd/iterator.odin deleted file mode 100644 index 53424466f..000000000 --- a/core/unicode/tools/ucd/iterator.odin +++ /dev/null @@ -1,70 +0,0 @@ -package ucd - -/* -An iterator that allows simple iterating over the lines of of a slice of bytes, []byte, -without allocating. Each line must end in a new line, i.e., '\n' -*/ -Line_Iterator :: struct { - index: int, // current location in data - data: []byte, // Data over which to iterate - line_counter: int, // line number storage -} - -line_iterator :: proc(it: ^Line_Iterator) -> (line: []byte, line_number: int, more: bool) { - more = it.index < len(it.data) - if more { - it.line_counter += 1 - line_number = it.line_counter - } else { - return - } - start:= it.index - for it.index < len(it.data) && it.data[it.index] != '\n' && it.data[it.index] != '#' do it.index += 1 - line = it.data[start:it.index] - //index = start - - if it.index < len(it.data) && it.data[it.index] == '#' { - for it.index < len(it.data) && it.data[it.index] != '\n' do it.index += 1 - } - if it.index < len(it.data) && it.data[it.index] == '\n' do it.index += 1 - return -} - -Field_Iterator :: struct { - index: int, - field_counter: int, - line: []byte, -} - -field_iterator :: proc(it: ^Field_Iterator) -> (field: []byte, field_count: int, valid: bool) { - valid = it.index < len(it.line) && it.line[it.index] != '\n' && it.line[it.index] != '#' - if !valid do return - - if it.index < len(it.line) && it.index != 0 && it.line[it.index] == ';' do it. index += 1 - - start := it.index - for it.index < len(it.line) && it.line[it.index] != ';' && it.line[it.index] != '#' do it.index += 1 - - field = it.line[start:it.index] - temp := field - - // Remove leading spaces - for b, i in temp { - if b != ' ' { - field = temp[i:] - break - } - } - - // Remove trailing spaces - temp = field - for b, i in temp { - if b != ' ' { - field = temp[0:i+1] - } - } - - field_count = it.field_counter - it.field_counter += 1 - return -} diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index 9f815d386..0a6641b4a 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -15,14 +15,17 @@ load_unicode_data :: proc( } defer free_all(context.temp_allocator) - line_iter := Line_Iterator{data = data } + // line_iter := Line_Iterator{data = data } first_cp: rune - line_loop: for line, line_num in line_iterator(&line_iter) { - // Skip empty lines + str := string(data) + line_no := 1 + line_loop: for _line in strings.split_lines_iterator(&str) { + defer line_no += 1 + line, _, _ := strings.partition(_line, "#") if len(line) == 0 do continue - field_iter := Field_Iterator{line = line} + // field_iter := Field_Iterator{line = line} is_range := false cp: rune name: string @@ -33,7 +36,11 @@ load_unicode_data :: proc( nt := Numeric_Type.None nv : Numberic_Value - for field, field_num in field_iterator(&field_iter) { + field_num := 0 + for field in strings.split_iterator(&line, ";") { + defer field_num += 1 + field := strings.trim_space(field) + switch field_num { case 0: // Code point cp = 0 @@ -52,10 +59,10 @@ load_unicode_data :: proc( } if len(field) > 9 && field[0] == '<' && strings.ends_with(transmute(string) field, ", Last>") { - name = strings.clone_from_bytes(field[1:len(field)-7], allocator) + name = strings.clone(field[1:len(field)-7], allocator) is_range = true } else { - name = strings.clone_from_bytes(field[:], allocator) + name = strings.clone(field[:], allocator) } case 2: // General_Category @@ -236,6 +243,8 @@ destroy_protperty_list :: proc( } } +import "core:fmt" + load_protperty_list :: proc ( filename : string, allocator := context.allocator, @@ -251,16 +260,26 @@ load_protperty_list :: proc ( line_iter := Line_Iterator{ data = data } - for line in line_iterator(&line_iter) { + + str := string(data) + line_no := 1 + for _line in strings.split_lines_iterator(&str) { + defer line_no += 1 + line, _, _ := strings.partition(_line, "#") if len(line) == 0 do continue - field_iter := Field_Iterator{ line = line} + fmt.printfln("%d: %q", line_no, line) is_range: bool rr : Range_Rune prop: PropList_Property - for field, i in field_iterator(&field_iter) { + i := 0 + for field in strings.split_iterator(&line, ";") { + defer i += 1 + field := strings.trim_space(field) + fmt.printfln("%d: %q", i, field) + switch i { case 0: // Code point or code point range for c in field { @@ -302,7 +321,4 @@ load_protperty_list :: proc ( } return -} - - - +} \ No newline at end of file From 7b79f28522698150f8f8a87e687cc19e77a582b6 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Mar 2026 16:47:53 +0100 Subject: [PATCH 630/766] Allow compiling with `-vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do` Support the same strict flags as used throughout the CI tests. --- core/unicode/generated.odin | 16 +-- core/unicode/tools/ucd/generate_unicode.odin | 129 ++++++++----------- core/unicode/tools/ucd/string_to.odin | 50 ++++--- core/unicode/tools/ucd/ucd.odin | 115 +++++++---------- 4 files changed, 133 insertions(+), 177 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index 85d4e9e8b..7a29e56ce 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -4,7 +4,7 @@ package unicode ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ */ -/* +/* This file is generated from UnicodeData.txt and PropList.txt. These files are part of the Unicode Database (UCD) and are covered by the license listed further down. They may be downloaded from the following locations; @@ -15,17 +15,17 @@ package unicode ------------------------------------------------------------------------------ UNICODE LICENSE V3 - + COPYRIGHT AND PERMISSION NOTICE - + Copyright © 1991-2026 Unicode, Inc. - + NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. - + Permission is hereby granted, free of charge, to any person obtaining a copy of data files and any associated documentation (the "Data Files") or software and any associated documentation (the "Software") to deal in the @@ -36,19 +36,19 @@ package unicode this copyright and permission notice appear with all copies of the Data Files or Software, or (b) this copyright and permission notice appear in associated Documentation. - + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. - + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. - + Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written diff --git a/core/unicode/tools/ucd/generate_unicode.odin b/core/unicode/tools/ucd/generate_unicode.odin index 36b6e2ac4..ffa8a3be3 100644 --- a/core/unicode/tools/ucd/generate_unicode.odin +++ b/core/unicode/tools/ucd/generate_unicode.odin @@ -1,7 +1,6 @@ package ucd import "core:fmt" -import path "core:path/filepath" import "core:os" import "core:strings" import "base:runtime" @@ -26,16 +25,12 @@ Inputs: - name: Prefix to add to any array that is written to `writer` - range: The Dynamic_Range to format and write to writer. */ -write_range_arrays :: proc( - writer: io.Writer, - name: string, - range : Dynamic_Range, -) -> int { +write_range_arrays :: proc(writer: io.Writer, name: string, range: Dynamic_Range) -> int { n_written : int - if len(range.single_16) > 0 { + if len(range.single_16) > 0 { n_written += fmt.wprintln(writer, "@(rodata)") n_written += fmt.wprintf(writer, "%s_singles16 := [?]u16{{", name) - line_length := 100 + line_length := 100 for v in range.single_16 { str_buffer : [32]byte str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) @@ -52,7 +47,7 @@ write_range_arrays :: proc( } n_written += fmt.wprintln(writer, "\n}\n") } - + if len(range.ranges_16) > 0 { n_written += fmt.wprintln(writer, "@(rodata)") n_written += fmt.wprintfln(writer, "%s_ranges16 := [?]u16{{", name) @@ -70,7 +65,7 @@ write_range_arrays :: proc( str_buffer : [32]byte str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) - if line_length + len(str) > 80 { + if line_length + len(str) > 80 { n_written += fmt.wprint(writer, "\n") line_length = fmt.wprintf(writer, "\t0x%4X,",v) n_written += line_length @@ -95,12 +90,7 @@ write_range_arrays :: proc( return n_written } -write_range :: proc( - writer: io.Writer, - name: union{string, - General_Category}, - range: Dynamic_Range, -) -> (n_written: int) { +write_range :: proc(writer: io.Writer, name: union{string, General_Category}, range: Dynamic_Range) -> (n_written: int) { buffer: [128]byte str: string @@ -124,16 +114,16 @@ write_range :: proc( n_written += fmt.wprintfln(writer, "%s_ranges := Range{{", str) if len(range.single_16) > 0 { - n_written += fmt.wprintfln(writer, "\tsingle_16 = %s_singles16[:],", str) + n_written += fmt.wprintfln(writer, "\tsingle_16 = %s_singles16[:],", str) } if len(range.ranges_16) > 0 { - n_written += fmt.wprintfln(writer, "\tranges_16 = %s_ranges16[:],", str) + n_written += fmt.wprintfln(writer, "\tranges_16 = %s_ranges16[:],", str) } if len(range.single_32) > 0 { - n_written += fmt.wprintfln(writer, "\tsingle_32 = %s_singles32[:],", str) + n_written += fmt.wprintfln(writer, "\tsingle_32 = %s_singles32[:],", str) } if len(range.ranges_32) > 0 { - n_written += fmt.wprintfln(writer, "\tranges_32 = %s_ranges32[:],", str) + n_written += fmt.wprintfln(writer, "\tranges_32 = %s_ranges32[:],", str) } n_written += fmt.wprintln(writer, "}\n") @@ -145,7 +135,7 @@ GENERATED :: `/* */ ` -MESSAGE :: `/* +MESSAGE :: `/* This file is generated from UnicodeData.txt and PropList.txt. These files are part of the Unicode Database (UCD) and are covered by the license listed further down. They may be downloaded from the following locations; @@ -156,17 +146,17 @@ MESSAGE :: `/* ------------------------------------------------------------------------------ UNICODE LICENSE V3 - + COPYRIGHT AND PERMISSION NOTICE - + Copyright © 1991-2026 Unicode, Inc. - + NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. - + Permission is hereby granted, free of charge, to any person obtaining a copy of data files and any associated documentation (the "Data Files") or software and any associated documentation (the "Software") to deal in the @@ -177,19 +167,19 @@ MESSAGE :: `/* this copyright and permission notice appear with all copies of the Data Files or Software, or (b) this copyright and permission notice appear in associated Documentation. - + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. - + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. - + Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written @@ -217,9 +207,7 @@ main :: proc() { context.logger = log.create_console_logger() defer log.destroy_console_logger(context.logger) - ucd_path, _ := path.join({ODIN_ROOT, - "tests","core","assets","UCD","UnicodeData.txt"}, context.allocator) - defer delete(ucd_path) + ucd_path := ODIN_ROOT + "tests/core/assets/UCD/UnicodeData.txt" unicode_data, ucd_err := load_unicode_data(ucd_path) if ucd_err != nil { @@ -234,39 +222,34 @@ main :: proc() { defer destroy_dynamic_range(extra_digits) - proplist_path, _ := path.join({ODIN_ROOT, - "tests","core","assets","UCD","PropList.txt"}, context.allocator) - defer delete(proplist_path) - proplist, proplist_err := load_protperty_list(proplist_path) + proplist_path := ODIN_ROOT + "tests/core/assets/UCD/PropList.txt" + proplist, proplist_err := load_property_list(proplist_path) if proplist_err != nil { log.errorf("Error loading PropList.txt. %s", proplist_err) return } - defer destroy_protperty_list(proplist) + defer destroy_property_list(proplist) + sb := strings.builder_make_len_cap(0, 1024*32) + defer strings.builder_destroy(&sb) + writer := strings.to_writer(&sb) - sb := strings.builder_make_len_cap(0, 1024*32) - defer strings.builder_destroy(&sb) - - - writer := strings.to_writer(&sb) - - fmt.wprintfln(writer, "package unicode\n") - fmt.wprintln(writer, GENERATED) - fmt.wprintln(writer, MESSAGE) - - Range_Type :: "Range :: struct {\n" + - "\tsingle_16 : []u16,\n" + - "\tranges_16 : []u16,\n" + - "\tsingle_32 : []i32,\n" + - "\tranges_32 : []i32,\n" + - "}\n" - - fmt.wprintfln(writer, "%s", Range_Type) + fmt.wprintfln(writer, "package unicode\n") + fmt.wprintln(writer, GENERATED) + fmt.wprintln(writer, MESSAGE) + + Range_Type :: "Range :: struct {\n" + + "\tsingle_16 : []u16,\n" + + "\tranges_16 : []u16,\n" + + "\tsingle_32 : []i32,\n" + + "\tranges_32 : []i32,\n" + + "}\n" + + fmt.wprintfln(writer, "%s", Range_Type) //List of the general categories to skip when generating the code for - //core/unicode/generated.txt. + //core/unicode/generated.txt. to_exclude := [?]General_Category{ .Cc, // Control, a C0 or C1 control code .Cf, // Format, a format control character @@ -299,27 +282,23 @@ main :: proc() { .Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only //.Zs, // Space_Separator, a space character (of various non-zero widths) } - - write_loop : for gc, i in general_category_ranges { - for excluded in to_exclude { - if i == excluded do continue write_loop - } - write_range(writer, i, gc) - } - write_range(writer, "extra_digits", extra_digits ) - - write_range(writer,"other_lowercase", proplist[.Other_Lowercase]) - write_range(writer,"other_uppercase", proplist[.Other_Uppercase]) + write_loop : for gc, i in general_category_ranges { + for excluded in to_exclude { + if i == excluded { + continue write_loop + } + } + write_range(writer, i, gc) + } - file_name, _ := path.join({ODIN_ROOT, "core", "unicode", "generated.odin"}, context.allocator) - defer delete(file_name) - - str := strings.to_string(sb) + write_range(writer, "extra_digits", extra_digits) + write_range(writer, "other_lowercase", proplist[.Other_Lowercase]) + write_range(writer, "other_uppercase", proplist[.Other_Uppercase]) - write_error := os.write_entire_file_from_string(file_name, str) - if write_error != nil { - log.errorf("Error writting %s. %s", file_name, write_error) - } -} + file_name := ODIN_ROOT + "core/unicode/generated.odin" + if write_error := os.write_entire_file_from_string(file_name, strings.to_string(sb)); write_error != nil { + log.errorf("Error %v writing %q", write_error, file_name) + } +} \ No newline at end of file diff --git a/core/unicode/tools/ucd/string_to.odin b/core/unicode/tools/ucd/string_to.odin index 5ca0f40fe..7c9115f21 100644 --- a/core/unicode/tools/ucd/string_to.odin +++ b/core/unicode/tools/ucd/string_to.odin @@ -214,55 +214,53 @@ string_to_paired_bracket_type :: proc "contextless"(str: string) -> Paired_Brack string_to_bidi_class :: proc "contextless"(str: string) -> Bidi_Class { switch str { - case "AL": + case "AL": return .AL - case "AN": + case "AN": return .AN - case "B": + case "B": return .B - case "BN": + case "BN": return .BN - case "CS": + case "CS": return .CS - case "EN": + case "EN": return .EN - case "ES": + case "ES": return .ES - case "ET": + case "ET": return .ET - case "FSI": + case "FSI": return .FSI - case "L": + case "L": return .L - case "LRE": + case "LRE": return .LRE - case "LRI": + case "LRI": return .LRI - case "LRO": + case "LRO": return .LRO - case "NSM": + case "NSM": return .NSM - case "ON": + case "ON": return .ON - case "PDF": + case "PDF": return .PDF - case "PDI": + case "PDI": return .PDI - case "R": + case "R": return .R - case "RLE": + case "RLE": return .RLE - case "RLI": + case "RLI": return .RLI - case "RLO": + case "RLO": return .RLO - case "S": + case "S": return .S - case "WS": + case "WS": return .WS - case: - // TODO: Add error for this - unreachable() + case: unreachable() // TODO: Add error for this } } diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index 0a6641b4a..0277b5b15 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -2,20 +2,12 @@ package ucd import "core:strings" import "core:os" +// import "core:fmt" -load_unicode_data :: proc( - filename: string, - allocator := context.allocator, -) -> (unicode_data : Unicode_Data, err: Error) { - - data, os_error := os.read_entire_file(filename, context.temp_allocator) - if os_error != nil { - err = os_error - return - } +load_unicode_data :: proc(filename: string, allocator := context.allocator) -> (unicode_data: Unicode_Data, err: Error) { + data := os.read_entire_file(filename, context.temp_allocator) or_return defer free_all(context.temp_allocator) - // line_iter := Line_Iterator{data = data } first_cp: rune str := string(data) @@ -23,7 +15,7 @@ load_unicode_data :: proc( line_loop: for _line in strings.split_lines_iterator(&str) { defer line_no += 1 line, _, _ := strings.partition(_line, "#") - if len(line) == 0 do continue + if len(line) == 0 { continue } // field_iter := Field_Iterator{line = line} is_range := false @@ -34,31 +26,29 @@ load_unicode_data :: proc( num_6 : string num_7 : string nt := Numeric_Type.None - nv : Numberic_Value field_num := 0 - for field in strings.split_iterator(&line, ";") { + for _field in strings.split_iterator(&line, ";") { defer field_num += 1 - field := strings.trim_space(field) + field := strings.trim_space(_field) switch field_num { case 0: // Code point cp = 0 for c in field { - if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') do break + if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') { break } cp *= 16 - cp += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') - cp += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + cp += (c - '0') if c >= '0' && c <= '9' else (c - 'A' + 10) } case 1: // Name - if len(field) > 9 && field[0] == '<' && strings.ends_with(transmute(string) field, ", First>") { + if len(field) > 9 && field[0] == '<' && strings.ends_with(field, ", First>") { first_cp = cp continue line_loop } - if len(field) > 9 && field[0] == '<' && strings.ends_with(transmute(string) field, ", Last>") { + if len(field) > 9 && field[0] == '<' && strings.ends_with(field, ", Last>") { name = strings.clone(field[1:len(field)-7], allocator) is_range = true } else { @@ -67,27 +57,27 @@ load_unicode_data :: proc( case 2: // General_Category // NOTE: This is currently igorning a possible error it should probably be fixed - gc, _ = string_to_general_category(transmute(string)field) + gc, _ = string_to_general_category(field) case 3: // Canonical_Combining_Class case 4: // Bidi Class case 5: // Decomposition_Type and Decomposition_Mapping // Numeric_Type and Numberic_Value case 6: - num_6 = transmute(string)field + num_6 = field case 7: - num_7 = transmute(string)field + num_7 = field case 8: switch { - case num_6 != "" && num_7 != "" && transmute(string) field != "" : + case num_6 != "" && num_7 != "" && field != "" : nt = .Decimal - case num_6 == "" && num_7 != "" && transmute(string) field != "" : + case num_6 == "" && num_7 != "" && field != "" : nt = .Digit - case num_6 == "" && num_7 == "" && transmute(string) field != "" : + case num_6 == "" && num_7 == "" && field != "" : nt = .Numeric case: @@ -154,12 +144,14 @@ gc_ranges :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (lst: [G range.last = -1 } - range.first = transmute(rune) min(transmute(u32)range.first, transmute(u32)p.cp) + range.first = rune(min(u32(range.first), u32(p.cp))) gc = p.gc range.last = p.cp case Char_Range: - if range.first != -1 do append_to_dynamic_range(&lst[gc], range, allocator) + if range.first != -1 { + append_to_dynamic_range(&lst[gc], range, allocator) + } range.first = p.first_cp range.last = p.last_cp @@ -168,7 +160,9 @@ gc_ranges :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (lst: [G range.last = -1 } } - if range.first != -1 do append_to_dynamic_range(&lst[gc], range, allocator) + if range.first != -1 { + append_to_dynamic_range(&lst[gc], range, allocator) + } return } @@ -194,14 +188,16 @@ extra_digits :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (Dyna } if exd_type { - range.first = transmute(rune) min(transmute(u32)range.first, transmute(u32)p.cp) + range.first = rune(min(u32(range.first), u32(p.cp))) range.last = p.cp } case Char_Range: exd_type := p.gc != .Nd && (p.nt == .Decimal || p.nt == .Digit) - if range.first != -1 do append_to_dynamic_range(&exd, range, allocator) + if range.first != -1 { + append_to_dynamic_range(&exd, range, allocator) + } if exd_type { range.first = p.first_cp @@ -212,29 +208,28 @@ extra_digits :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (Dyna range.last = -1 } } - if range.first != -1 do append_to_dynamic_range(&exd, range, allocator) + if range.first != -1 { + append_to_dynamic_range(&exd, range, allocator) + } return exd } /* -Data containted in the Unicode fiel PropList.txt +Data contained in the Unicode fiel PropList.txt -A `PropList` is the data containted in the Unicode Database (UCD) file -PropList.txt. It is created with the procedure `load_property_list` and -destroy with the procedure `destroy_property_list`. +A `Prop_List` is the data contained in the Unicode Database (UCD) file `PropList.txt`. +It is created with the procedure `load_property_list` and destroyed with the procedure `destroy_property_list`. */ -PropList ::[PropList_Property]Dynamic_Range +Prop_List :: [PropList_Property]Dynamic_Range /* -This function destroys a `PropList` created by `load_property_list`. +This function destroys a `Prop_List` created by `load_property_list`. Inputs: -- props: The PropList to destroy +- props: The Prop_List to destroy */ -destroy_protperty_list :: proc( - props: [PropList_Property]Dynamic_Range, -){ +destroy_property_list :: proc(props: Prop_List) { for r in props { delete(r.ranges_16) delete(r.ranges_32) @@ -243,31 +238,18 @@ destroy_protperty_list :: proc( } } -import "core:fmt" -load_protperty_list :: proc ( - filename : string, - allocator := context.allocator, -) -> (props: [PropList_Property]Dynamic_Range, err: Error) { - data, os_error := os.read_entire_file(filename, allocator) - if os_error != nil { - err = os_error - return - } +load_property_list :: proc(filename: string, allocator := context.allocator) -> (props: Prop_List, err: Error) { + data := os.read_entire_file(filename, allocator) or_return defer delete(data) - line_iter := Line_Iterator{ - data = data - } - str := string(data) - line_no := 1 for _line in strings.split_lines_iterator(&str) { - defer line_no += 1 line, _, _ := strings.partition(_line, "#") - if len(line) == 0 do continue - fmt.printfln("%d: %q", line_no, line) + if len(line) == 0 { + continue + } is_range: bool @@ -275,10 +257,9 @@ load_protperty_list :: proc ( prop: PropList_Property i := 0 - for field in strings.split_iterator(&line, ";") { + for _field in strings.split_iterator(&line, ";") { defer i += 1 - field := strings.trim_space(field) - fmt.printfln("%d: %q", i, field) + field := strings.trim_space(_field) switch i { case 0: // Code point or code point range @@ -295,18 +276,16 @@ load_protperty_list :: proc ( } if is_range { rr.last *= 16 - rr.last += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') - rr.last += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + rr.last += (c - '0') if (c >= '0' && c <= '9') else (c - 'A' + 10) } else { rr.first *= 16 - rr.first += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') - rr.first += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + rr.first += (c - '0') if (c >= '0' && c <= '9') else (c - 'A' + 10) rr.last = rr.first } } case 1: - prop, err = string_to_proplist_property(transmute(string)field) + prop, err = string_to_proplist_property(field) if err != nil { return } From 7928d1b92c2c57253e96320a7cb60aa1a43d81da Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Mar 2026 17:22:23 +0100 Subject: [PATCH 631/766] Simplify --- core/unicode/tools/ucd/ucd.odin | 70 ++++++++++++++------------------- 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index 0277b5b15..27eb1ebb7 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -2,7 +2,28 @@ package ucd import "core:strings" import "core:os" -// import "core:fmt" +import "core:strconv" + +decode_rune :: proc(str: string) -> (cp1, cp2: rune, err: Error) { + head, _, tail := strings.partition(str, "..") + + if _cp1, _ok := strconv.parse_int(head, 16); !_ok { + return 0, 0, .Invalid_Hex_Number + } else { + cp1 = rune(_cp1) + } + + if len(tail) == 0 { + return cp1, cp1, nil + } + + if _cp2, _ok := strconv.parse_int(tail, 16); !_ok { + return 0, 0, .Invalid_Hex_Number + } else { + cp2 = rune(_cp2) + } + return +} load_unicode_data :: proc(filename: string, allocator := context.allocator) -> (unicode_data: Unicode_Data, err: Error) { data := os.read_entire_file(filename, context.temp_allocator) or_return @@ -11,13 +32,12 @@ load_unicode_data :: proc(filename: string, allocator := context.allocator) -> ( first_cp: rune str := string(data) - line_no := 1 line_loop: for _line in strings.split_lines_iterator(&str) { - defer line_no += 1 line, _, _ := strings.partition(_line, "#") - if len(line) == 0 { continue } + if len(line) == 0 { + continue + } - // field_iter := Field_Iterator{line = line} is_range := false cp: rune name: string @@ -34,13 +54,7 @@ load_unicode_data :: proc(filename: string, allocator := context.allocator) -> ( switch field_num { case 0: // Code point - cp = 0 - - for c in field { - if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') { break } - cp *= 16 - cp += (c - '0') if c >= '0' && c <= '9' else (c - 'A' + 10) - } + cp, _ = decode_rune(field) or_return case 1: // Name if len(field) > 9 && field[0] == '<' && strings.ends_with(field, ", First>") { @@ -251,11 +265,9 @@ load_property_list :: proc(filename: string, allocator := context.allocator) -> continue } - is_range: bool + rr: Range_Rune + prop: PropList_Property - rr : Range_Rune - - prop: PropList_Property i := 0 for _field in strings.split_iterator(&line, ";") { defer i += 1 @@ -263,32 +275,10 @@ load_property_list :: proc(filename: string, allocator := context.allocator) -> switch i { case 0: // Code point or code point range - for c in field { - if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') { - if c == '.' { - is_range = true - rr.last = 0 - continue - } else { - err = UCD_Error.Invalid_Hex_Number - return - } - } - if is_range { - rr.last *= 16 - rr.last += (c - '0') if (c >= '0' && c <= '9') else (c - 'A' + 10) - } else { - rr.first *= 16 - rr.first += (c - '0') if (c >= '0' && c <= '9') else (c - 'A' + 10) - rr.last = rr.first - } - } + rr.first, rr.last = decode_rune(field) or_return case 1: - prop, err = string_to_proplist_property(field) - if err != nil { - return - } + prop = string_to_proplist_property(field) or_return case: err = UCD_Error.Extra_Fields From df0d74efbe7ee84aef3880e5fb6b8d5a74281d7a Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Mar 2026 18:38:49 +0100 Subject: [PATCH 632/766] Simplify table writer --- core/unicode/generated.odin | 380 ++++++++++--------- core/unicode/tools/ucd/generate_unicode.odin | 111 +++--- core/unicode/tools/ucd/ucd.odin | 20 +- 3 files changed, 268 insertions(+), 243 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index 7a29e56ce..bfea47a87 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -65,61 +65,75 @@ Range :: struct { @(rodata) ll_singles16 := [?]u16{ - 0x00B5, 0x0101, 0x0103, 0x0105, 0x0107, 0x0109, 0x010B, 0x010D, 0x010F, 0x0111, - 0x0113, 0x0115, 0x0117, 0x0119, 0x011B, 0x011D, 0x011F, 0x0121, 0x0123, 0x0125, - 0x0127, 0x0129, 0x012B, 0x012D, 0x012F, 0x0131, 0x0133, 0x0135, 0x013A, 0x013C, - 0x013E, 0x0140, 0x0142, 0x0144, 0x0146, 0x014B, 0x014D, 0x014F, 0x0151, 0x0153, - 0x0155, 0x0157, 0x0159, 0x015B, 0x015D, 0x015F, 0x0161, 0x0163, 0x0165, 0x0167, - 0x0169, 0x016B, 0x016D, 0x016F, 0x0171, 0x0173, 0x0175, 0x0177, 0x017A, 0x017C, - 0x0183, 0x0185, 0x0188, 0x0192, 0x0195, 0x019E, 0x01A1, 0x01A3, 0x01A5, 0x01A8, - 0x01AD, 0x01B0, 0x01B4, 0x01B6, 0x01C6, 0x01C9, 0x01CC, 0x01CE, 0x01D0, 0x01D2, - 0x01D4, 0x01D6, 0x01D8, 0x01DA, 0x01DF, 0x01E1, 0x01E3, 0x01E5, 0x01E7, 0x01E9, - 0x01EB, 0x01ED, 0x01F3, 0x01F5, 0x01F9, 0x01FB, 0x01FD, 0x01FF, 0x0201, 0x0203, - 0x0205, 0x0207, 0x0209, 0x020B, 0x020D, 0x020F, 0x0211, 0x0213, 0x0215, 0x0217, - 0x0219, 0x021B, 0x021D, 0x021F, 0x0221, 0x0223, 0x0225, 0x0227, 0x0229, 0x022B, - 0x022D, 0x022F, 0x0231, 0x023C, 0x0242, 0x0247, 0x0249, 0x024B, 0x024D, 0x0371, - 0x0373, 0x0377, 0x0390, 0x03D9, 0x03DB, 0x03DD, 0x03DF, 0x03E1, 0x03E3, 0x03E5, - 0x03E7, 0x03E9, 0x03EB, 0x03ED, 0x03F5, 0x03F8, 0x0461, 0x0463, 0x0465, 0x0467, - 0x0469, 0x046B, 0x046D, 0x046F, 0x0471, 0x0473, 0x0475, 0x0477, 0x0479, 0x047B, - 0x047D, 0x047F, 0x0481, 0x048B, 0x048D, 0x048F, 0x0491, 0x0493, 0x0495, 0x0497, - 0x0499, 0x049B, 0x049D, 0x049F, 0x04A1, 0x04A3, 0x04A5, 0x04A7, 0x04A9, 0x04AB, - 0x04AD, 0x04AF, 0x04B1, 0x04B3, 0x04B5, 0x04B7, 0x04B9, 0x04BB, 0x04BD, 0x04BF, - 0x04C2, 0x04C4, 0x04C6, 0x04C8, 0x04CA, 0x04CC, 0x04D1, 0x04D3, 0x04D5, 0x04D7, - 0x04D9, 0x04DB, 0x04DD, 0x04DF, 0x04E1, 0x04E3, 0x04E5, 0x04E7, 0x04E9, 0x04EB, - 0x04ED, 0x04EF, 0x04F1, 0x04F3, 0x04F5, 0x04F7, 0x04F9, 0x04FB, 0x04FD, 0x04FF, - 0x0501, 0x0503, 0x0505, 0x0507, 0x0509, 0x050B, 0x050D, 0x050F, 0x0511, 0x0513, - 0x0515, 0x0517, 0x0519, 0x051B, 0x051D, 0x051F, 0x0521, 0x0523, 0x0525, 0x0527, - 0x0529, 0x052B, 0x052D, 0x052F, 0x1C8A, 0x1E01, 0x1E03, 0x1E05, 0x1E07, 0x1E09, - 0x1E0B, 0x1E0D, 0x1E0F, 0x1E11, 0x1E13, 0x1E15, 0x1E17, 0x1E19, 0x1E1B, 0x1E1D, - 0x1E1F, 0x1E21, 0x1E23, 0x1E25, 0x1E27, 0x1E29, 0x1E2B, 0x1E2D, 0x1E2F, 0x1E31, - 0x1E33, 0x1E35, 0x1E37, 0x1E39, 0x1E3B, 0x1E3D, 0x1E3F, 0x1E41, 0x1E43, 0x1E45, - 0x1E47, 0x1E49, 0x1E4B, 0x1E4D, 0x1E4F, 0x1E51, 0x1E53, 0x1E55, 0x1E57, 0x1E59, - 0x1E5B, 0x1E5D, 0x1E5F, 0x1E61, 0x1E63, 0x1E65, 0x1E67, 0x1E69, 0x1E6B, 0x1E6D, - 0x1E6F, 0x1E71, 0x1E73, 0x1E75, 0x1E77, 0x1E79, 0x1E7B, 0x1E7D, 0x1E7F, 0x1E81, - 0x1E83, 0x1E85, 0x1E87, 0x1E89, 0x1E8B, 0x1E8D, 0x1E8F, 0x1E91, 0x1E93, 0x1E9F, - 0x1EA1, 0x1EA3, 0x1EA5, 0x1EA7, 0x1EA9, 0x1EAB, 0x1EAD, 0x1EAF, 0x1EB1, 0x1EB3, - 0x1EB5, 0x1EB7, 0x1EB9, 0x1EBB, 0x1EBD, 0x1EBF, 0x1EC1, 0x1EC3, 0x1EC5, 0x1EC7, - 0x1EC9, 0x1ECB, 0x1ECD, 0x1ECF, 0x1ED1, 0x1ED3, 0x1ED5, 0x1ED7, 0x1ED9, 0x1EDB, - 0x1EDD, 0x1EDF, 0x1EE1, 0x1EE3, 0x1EE5, 0x1EE7, 0x1EE9, 0x1EEB, 0x1EED, 0x1EEF, - 0x1EF1, 0x1EF3, 0x1EF5, 0x1EF7, 0x1EF9, 0x1EFB, 0x1EFD, 0x1FBE, 0x210A, 0x2113, - 0x212F, 0x2134, 0x2139, 0x214E, 0x2184, 0x2C61, 0x2C68, 0x2C6A, 0x2C6C, 0x2C71, - 0x2C81, 0x2C83, 0x2C85, 0x2C87, 0x2C89, 0x2C8B, 0x2C8D, 0x2C8F, 0x2C91, 0x2C93, - 0x2C95, 0x2C97, 0x2C99, 0x2C9B, 0x2C9D, 0x2C9F, 0x2CA1, 0x2CA3, 0x2CA5, 0x2CA7, - 0x2CA9, 0x2CAB, 0x2CAD, 0x2CAF, 0x2CB1, 0x2CB3, 0x2CB5, 0x2CB7, 0x2CB9, 0x2CBB, - 0x2CBD, 0x2CBF, 0x2CC1, 0x2CC3, 0x2CC5, 0x2CC7, 0x2CC9, 0x2CCB, 0x2CCD, 0x2CCF, - 0x2CD1, 0x2CD3, 0x2CD5, 0x2CD7, 0x2CD9, 0x2CDB, 0x2CDD, 0x2CDF, 0x2CE1, 0x2CEC, - 0x2CEE, 0x2CF3, 0x2D27, 0x2D2D, 0xA641, 0xA643, 0xA645, 0xA647, 0xA649, 0xA64B, - 0xA64D, 0xA64F, 0xA651, 0xA653, 0xA655, 0xA657, 0xA659, 0xA65B, 0xA65D, 0xA65F, - 0xA661, 0xA663, 0xA665, 0xA667, 0xA669, 0xA66B, 0xA66D, 0xA681, 0xA683, 0xA685, - 0xA687, 0xA689, 0xA68B, 0xA68D, 0xA68F, 0xA691, 0xA693, 0xA695, 0xA697, 0xA699, - 0xA69B, 0xA723, 0xA725, 0xA727, 0xA729, 0xA72B, 0xA72D, 0xA733, 0xA735, 0xA737, - 0xA739, 0xA73B, 0xA73D, 0xA73F, 0xA741, 0xA743, 0xA745, 0xA747, 0xA749, 0xA74B, - 0xA74D, 0xA74F, 0xA751, 0xA753, 0xA755, 0xA757, 0xA759, 0xA75B, 0xA75D, 0xA75F, - 0xA761, 0xA763, 0xA765, 0xA767, 0xA769, 0xA76B, 0xA76D, 0xA76F, 0xA77A, 0xA77C, - 0xA77F, 0xA781, 0xA783, 0xA785, 0xA787, 0xA78C, 0xA78E, 0xA791, 0xA797, 0xA799, - 0xA79B, 0xA79D, 0xA79F, 0xA7A1, 0xA7A3, 0xA7A5, 0xA7A7, 0xA7A9, 0xA7AF, 0xA7B5, - 0xA7B7, 0xA7B9, 0xA7BB, 0xA7BD, 0xA7BF, 0xA7C1, 0xA7C3, 0xA7C8, 0xA7CA, 0xA7CD, - 0xA7CF, 0xA7D1, 0xA7D3, 0xA7D5, 0xA7D7, 0xA7D9, 0xA7DB, 0xA7F6, 0xA7FA, + 0x00B5, 0x0101, 0x0103, 0x0105, 0x0107, 0x0109, 0x010B, 0x010D, + 0x010F, 0x0111, 0x0113, 0x0115, 0x0117, 0x0119, 0x011B, 0x011D, + 0x011F, 0x0121, 0x0123, 0x0125, 0x0127, 0x0129, 0x012B, 0x012D, + 0x012F, 0x0131, 0x0133, 0x0135, 0x013A, 0x013C, 0x013E, 0x0140, + 0x0142, 0x0144, 0x0146, 0x014B, 0x014D, 0x014F, 0x0151, 0x0153, + 0x0155, 0x0157, 0x0159, 0x015B, 0x015D, 0x015F, 0x0161, 0x0163, + 0x0165, 0x0167, 0x0169, 0x016B, 0x016D, 0x016F, 0x0171, 0x0173, + 0x0175, 0x0177, 0x017A, 0x017C, 0x0183, 0x0185, 0x0188, 0x0192, + 0x0195, 0x019E, 0x01A1, 0x01A3, 0x01A5, 0x01A8, 0x01AD, 0x01B0, + 0x01B4, 0x01B6, 0x01C6, 0x01C9, 0x01CC, 0x01CE, 0x01D0, 0x01D2, + 0x01D4, 0x01D6, 0x01D8, 0x01DA, 0x01DF, 0x01E1, 0x01E3, 0x01E5, + 0x01E7, 0x01E9, 0x01EB, 0x01ED, 0x01F3, 0x01F5, 0x01F9, 0x01FB, + 0x01FD, 0x01FF, 0x0201, 0x0203, 0x0205, 0x0207, 0x0209, 0x020B, + 0x020D, 0x020F, 0x0211, 0x0213, 0x0215, 0x0217, 0x0219, 0x021B, + 0x021D, 0x021F, 0x0221, 0x0223, 0x0225, 0x0227, 0x0229, 0x022B, + 0x022D, 0x022F, 0x0231, 0x023C, 0x0242, 0x0247, 0x0249, 0x024B, + 0x024D, 0x0371, 0x0373, 0x0377, 0x0390, 0x03D9, 0x03DB, 0x03DD, + 0x03DF, 0x03E1, 0x03E3, 0x03E5, 0x03E7, 0x03E9, 0x03EB, 0x03ED, + 0x03F5, 0x03F8, 0x0461, 0x0463, 0x0465, 0x0467, 0x0469, 0x046B, + 0x046D, 0x046F, 0x0471, 0x0473, 0x0475, 0x0477, 0x0479, 0x047B, + 0x047D, 0x047F, 0x0481, 0x048B, 0x048D, 0x048F, 0x0491, 0x0493, + 0x0495, 0x0497, 0x0499, 0x049B, 0x049D, 0x049F, 0x04A1, 0x04A3, + 0x04A5, 0x04A7, 0x04A9, 0x04AB, 0x04AD, 0x04AF, 0x04B1, 0x04B3, + 0x04B5, 0x04B7, 0x04B9, 0x04BB, 0x04BD, 0x04BF, 0x04C2, 0x04C4, + 0x04C6, 0x04C8, 0x04CA, 0x04CC, 0x04D1, 0x04D3, 0x04D5, 0x04D7, + 0x04D9, 0x04DB, 0x04DD, 0x04DF, 0x04E1, 0x04E3, 0x04E5, 0x04E7, + 0x04E9, 0x04EB, 0x04ED, 0x04EF, 0x04F1, 0x04F3, 0x04F5, 0x04F7, + 0x04F9, 0x04FB, 0x04FD, 0x04FF, 0x0501, 0x0503, 0x0505, 0x0507, + 0x0509, 0x050B, 0x050D, 0x050F, 0x0511, 0x0513, 0x0515, 0x0517, + 0x0519, 0x051B, 0x051D, 0x051F, 0x0521, 0x0523, 0x0525, 0x0527, + 0x0529, 0x052B, 0x052D, 0x052F, 0x1C8A, 0x1E01, 0x1E03, 0x1E05, + 0x1E07, 0x1E09, 0x1E0B, 0x1E0D, 0x1E0F, 0x1E11, 0x1E13, 0x1E15, + 0x1E17, 0x1E19, 0x1E1B, 0x1E1D, 0x1E1F, 0x1E21, 0x1E23, 0x1E25, + 0x1E27, 0x1E29, 0x1E2B, 0x1E2D, 0x1E2F, 0x1E31, 0x1E33, 0x1E35, + 0x1E37, 0x1E39, 0x1E3B, 0x1E3D, 0x1E3F, 0x1E41, 0x1E43, 0x1E45, + 0x1E47, 0x1E49, 0x1E4B, 0x1E4D, 0x1E4F, 0x1E51, 0x1E53, 0x1E55, + 0x1E57, 0x1E59, 0x1E5B, 0x1E5D, 0x1E5F, 0x1E61, 0x1E63, 0x1E65, + 0x1E67, 0x1E69, 0x1E6B, 0x1E6D, 0x1E6F, 0x1E71, 0x1E73, 0x1E75, + 0x1E77, 0x1E79, 0x1E7B, 0x1E7D, 0x1E7F, 0x1E81, 0x1E83, 0x1E85, + 0x1E87, 0x1E89, 0x1E8B, 0x1E8D, 0x1E8F, 0x1E91, 0x1E93, 0x1E9F, + 0x1EA1, 0x1EA3, 0x1EA5, 0x1EA7, 0x1EA9, 0x1EAB, 0x1EAD, 0x1EAF, + 0x1EB1, 0x1EB3, 0x1EB5, 0x1EB7, 0x1EB9, 0x1EBB, 0x1EBD, 0x1EBF, + 0x1EC1, 0x1EC3, 0x1EC5, 0x1EC7, 0x1EC9, 0x1ECB, 0x1ECD, 0x1ECF, + 0x1ED1, 0x1ED3, 0x1ED5, 0x1ED7, 0x1ED9, 0x1EDB, 0x1EDD, 0x1EDF, + 0x1EE1, 0x1EE3, 0x1EE5, 0x1EE7, 0x1EE9, 0x1EEB, 0x1EED, 0x1EEF, + 0x1EF1, 0x1EF3, 0x1EF5, 0x1EF7, 0x1EF9, 0x1EFB, 0x1EFD, 0x1FBE, + 0x210A, 0x2113, 0x212F, 0x2134, 0x2139, 0x214E, 0x2184, 0x2C61, + 0x2C68, 0x2C6A, 0x2C6C, 0x2C71, 0x2C81, 0x2C83, 0x2C85, 0x2C87, + 0x2C89, 0x2C8B, 0x2C8D, 0x2C8F, 0x2C91, 0x2C93, 0x2C95, 0x2C97, + 0x2C99, 0x2C9B, 0x2C9D, 0x2C9F, 0x2CA1, 0x2CA3, 0x2CA5, 0x2CA7, + 0x2CA9, 0x2CAB, 0x2CAD, 0x2CAF, 0x2CB1, 0x2CB3, 0x2CB5, 0x2CB7, + 0x2CB9, 0x2CBB, 0x2CBD, 0x2CBF, 0x2CC1, 0x2CC3, 0x2CC5, 0x2CC7, + 0x2CC9, 0x2CCB, 0x2CCD, 0x2CCF, 0x2CD1, 0x2CD3, 0x2CD5, 0x2CD7, + 0x2CD9, 0x2CDB, 0x2CDD, 0x2CDF, 0x2CE1, 0x2CEC, 0x2CEE, 0x2CF3, + 0x2D27, 0x2D2D, 0xA641, 0xA643, 0xA645, 0xA647, 0xA649, 0xA64B, + 0xA64D, 0xA64F, 0xA651, 0xA653, 0xA655, 0xA657, 0xA659, 0xA65B, + 0xA65D, 0xA65F, 0xA661, 0xA663, 0xA665, 0xA667, 0xA669, 0xA66B, + 0xA66D, 0xA681, 0xA683, 0xA685, 0xA687, 0xA689, 0xA68B, 0xA68D, + 0xA68F, 0xA691, 0xA693, 0xA695, 0xA697, 0xA699, 0xA69B, 0xA723, + 0xA725, 0xA727, 0xA729, 0xA72B, 0xA72D, 0xA733, 0xA735, 0xA737, + 0xA739, 0xA73B, 0xA73D, 0xA73F, 0xA741, 0xA743, 0xA745, 0xA747, + 0xA749, 0xA74B, 0xA74D, 0xA74F, 0xA751, 0xA753, 0xA755, 0xA757, + 0xA759, 0xA75B, 0xA75D, 0xA75F, 0xA761, 0xA763, 0xA765, 0xA767, + 0xA769, 0xA76B, 0xA76D, 0xA76F, 0xA77A, 0xA77C, 0xA77F, 0xA781, + 0xA783, 0xA785, 0xA787, 0xA78C, 0xA78E, 0xA791, 0xA797, 0xA799, + 0xA79B, 0xA79D, 0xA79F, 0xA7A1, 0xA7A3, 0xA7A5, 0xA7A7, 0xA7A9, + 0xA7AF, 0xA7B5, 0xA7B7, 0xA7B9, 0xA7BB, 0xA7BD, 0xA7BF, 0xA7C1, + 0xA7C3, 0xA7C8, 0xA7CA, 0xA7CD, 0xA7CF, 0xA7D1, 0xA7D3, 0xA7D5, + 0xA7D7, 0xA7D9, 0xA7DB, 0xA7F6, 0xA7FA, } @(rodata) @@ -257,10 +271,11 @@ ll_ranges := Range{ @(rodata) lm_singles16 := [?]u16{ - 0x02EC, 0x02EE, 0x0374, 0x037A, 0x0559, 0x0640, 0x07FA, 0x081A, 0x0824, 0x0828, - 0x08C9, 0x0971, 0x0E46, 0x0EC6, 0x10FC, 0x17D7, 0x1843, 0x1AA7, 0x1D78, 0x2071, - 0x207F, 0x2D6F, 0x2E2F, 0x3005, 0x303B, 0xA015, 0xA60C, 0xA67F, 0xA770, 0xA788, - 0xA9CF, 0xA9E6, 0xAA70, 0xAADD, 0xAB69, 0xFF70, + 0x02EC, 0x02EE, 0x0374, 0x037A, 0x0559, 0x0640, 0x07FA, 0x081A, + 0x0824, 0x0828, 0x08C9, 0x0971, 0x0E46, 0x0EC6, 0x10FC, 0x17D7, + 0x1843, 0x1AA7, 0x1D78, 0x2071, 0x207F, 0x2D6F, 0x2E2F, 0x3005, + 0x303B, 0xA015, 0xA60C, 0xA67F, 0xA770, 0xA788, 0xA9CF, 0xA9E6, + 0xAA70, 0xAADD, 0xAB69, 0xFF70, } @(rodata) @@ -320,12 +335,13 @@ lm_ranges := Range{ @(rodata) lo_singles16 := [?]u16{ - 0x00AA, 0x00BA, 0x01BB, 0x06D5, 0x06FF, 0x0710, 0x07B1, 0x093D, 0x0950, 0x09B2, - 0x09BD, 0x09CE, 0x09FC, 0x0A5E, 0x0ABD, 0x0AD0, 0x0AF9, 0x0B3D, 0x0B71, 0x0B83, - 0x0B9C, 0x0BD0, 0x0C3D, 0x0C80, 0x0CBD, 0x0D3D, 0x0D4E, 0x0DBD, 0x0E84, 0x0EA5, - 0x0EBD, 0x0F00, 0x103F, 0x1061, 0x108E, 0x1258, 0x12C0, 0x17DC, 0x18AA, 0x1CFA, - 0x3006, 0x303C, 0x309F, 0x30FF, 0xA66E, 0xA78F, 0xA7F7, 0xA8FB, 0xAA7A, 0xAAB1, - 0xAAC0, 0xAAC2, 0xAAF2, 0xFB1D, 0xFB3E, + 0x00AA, 0x00BA, 0x01BB, 0x06D5, 0x06FF, 0x0710, 0x07B1, 0x093D, + 0x0950, 0x09B2, 0x09BD, 0x09CE, 0x09FC, 0x0A5E, 0x0ABD, 0x0AD0, + 0x0AF9, 0x0B3D, 0x0B71, 0x0B83, 0x0B9C, 0x0BD0, 0x0C3D, 0x0C80, + 0x0CBD, 0x0D3D, 0x0D4E, 0x0DBD, 0x0E84, 0x0EA5, 0x0EBD, 0x0F00, + 0x103F, 0x1061, 0x108E, 0x1258, 0x12C0, 0x17DC, 0x18AA, 0x1CFA, + 0x3006, 0x303C, 0x309F, 0x30FF, 0xA66E, 0xA78F, 0xA7F7, 0xA8FB, + 0xAA7A, 0xAAB1, 0xAAC0, 0xAAC2, 0xAAF2, 0xFB1D, 0xFB3E, } @(rodata) @@ -801,62 +817,75 @@ lt_ranges := Range{ @(rodata) lu_singles16 := [?]u16{ - 0x0100, 0x0102, 0x0104, 0x0106, 0x0108, 0x010A, 0x010C, 0x010E, 0x0110, 0x0112, - 0x0114, 0x0116, 0x0118, 0x011A, 0x011C, 0x011E, 0x0120, 0x0122, 0x0124, 0x0126, - 0x0128, 0x012A, 0x012C, 0x012E, 0x0130, 0x0132, 0x0134, 0x0136, 0x0139, 0x013B, - 0x013D, 0x013F, 0x0141, 0x0143, 0x0145, 0x0147, 0x014A, 0x014C, 0x014E, 0x0150, - 0x0152, 0x0154, 0x0156, 0x0158, 0x015A, 0x015C, 0x015E, 0x0160, 0x0162, 0x0164, - 0x0166, 0x0168, 0x016A, 0x016C, 0x016E, 0x0170, 0x0172, 0x0174, 0x0176, 0x017B, - 0x017D, 0x0184, 0x01A2, 0x01A4, 0x01A9, 0x01AC, 0x01B5, 0x01BC, 0x01C4, 0x01C7, - 0x01CA, 0x01CD, 0x01CF, 0x01D1, 0x01D3, 0x01D5, 0x01D7, 0x01D9, 0x01DB, 0x01DE, - 0x01E0, 0x01E2, 0x01E4, 0x01E6, 0x01E8, 0x01EA, 0x01EC, 0x01EE, 0x01F1, 0x01F4, - 0x01FA, 0x01FC, 0x01FE, 0x0200, 0x0202, 0x0204, 0x0206, 0x0208, 0x020A, 0x020C, - 0x020E, 0x0210, 0x0212, 0x0214, 0x0216, 0x0218, 0x021A, 0x021C, 0x021E, 0x0220, - 0x0222, 0x0224, 0x0226, 0x0228, 0x022A, 0x022C, 0x022E, 0x0230, 0x0232, 0x0241, - 0x0248, 0x024A, 0x024C, 0x024E, 0x0370, 0x0372, 0x0376, 0x037F, 0x0386, 0x038C, - 0x03CF, 0x03D8, 0x03DA, 0x03DC, 0x03DE, 0x03E0, 0x03E2, 0x03E4, 0x03E6, 0x03E8, - 0x03EA, 0x03EC, 0x03EE, 0x03F4, 0x03F7, 0x0460, 0x0462, 0x0464, 0x0466, 0x0468, - 0x046A, 0x046C, 0x046E, 0x0470, 0x0472, 0x0474, 0x0476, 0x0478, 0x047A, 0x047C, - 0x047E, 0x0480, 0x048A, 0x048C, 0x048E, 0x0490, 0x0492, 0x0494, 0x0496, 0x0498, - 0x049A, 0x049C, 0x049E, 0x04A0, 0x04A2, 0x04A4, 0x04A6, 0x04A8, 0x04AA, 0x04AC, - 0x04AE, 0x04B0, 0x04B2, 0x04B4, 0x04B6, 0x04B8, 0x04BA, 0x04BC, 0x04BE, 0x04C3, - 0x04C5, 0x04C7, 0x04C9, 0x04CB, 0x04CD, 0x04D0, 0x04D2, 0x04D4, 0x04D6, 0x04D8, - 0x04DA, 0x04DC, 0x04DE, 0x04E0, 0x04E2, 0x04E4, 0x04E6, 0x04E8, 0x04EA, 0x04EC, - 0x04EE, 0x04F0, 0x04F2, 0x04F4, 0x04F6, 0x04F8, 0x04FA, 0x04FC, 0x04FE, 0x0500, - 0x0502, 0x0504, 0x0506, 0x0508, 0x050A, 0x050C, 0x050E, 0x0510, 0x0512, 0x0514, - 0x0516, 0x0518, 0x051A, 0x051C, 0x051E, 0x0520, 0x0522, 0x0524, 0x0526, 0x0528, - 0x052A, 0x052C, 0x052E, 0x10C7, 0x10CD, 0x1C89, 0x1E00, 0x1E02, 0x1E04, 0x1E06, - 0x1E08, 0x1E0A, 0x1E0C, 0x1E0E, 0x1E10, 0x1E12, 0x1E14, 0x1E16, 0x1E18, 0x1E1A, - 0x1E1C, 0x1E1E, 0x1E20, 0x1E22, 0x1E24, 0x1E26, 0x1E28, 0x1E2A, 0x1E2C, 0x1E2E, - 0x1E30, 0x1E32, 0x1E34, 0x1E36, 0x1E38, 0x1E3A, 0x1E3C, 0x1E3E, 0x1E40, 0x1E42, - 0x1E44, 0x1E46, 0x1E48, 0x1E4A, 0x1E4C, 0x1E4E, 0x1E50, 0x1E52, 0x1E54, 0x1E56, - 0x1E58, 0x1E5A, 0x1E5C, 0x1E5E, 0x1E60, 0x1E62, 0x1E64, 0x1E66, 0x1E68, 0x1E6A, - 0x1E6C, 0x1E6E, 0x1E70, 0x1E72, 0x1E74, 0x1E76, 0x1E78, 0x1E7A, 0x1E7C, 0x1E7E, - 0x1E80, 0x1E82, 0x1E84, 0x1E86, 0x1E88, 0x1E8A, 0x1E8C, 0x1E8E, 0x1E90, 0x1E92, - 0x1E94, 0x1E9E, 0x1EA0, 0x1EA2, 0x1EA4, 0x1EA6, 0x1EA8, 0x1EAA, 0x1EAC, 0x1EAE, - 0x1EB0, 0x1EB2, 0x1EB4, 0x1EB6, 0x1EB8, 0x1EBA, 0x1EBC, 0x1EBE, 0x1EC0, 0x1EC2, - 0x1EC4, 0x1EC6, 0x1EC8, 0x1ECA, 0x1ECC, 0x1ECE, 0x1ED0, 0x1ED2, 0x1ED4, 0x1ED6, - 0x1ED8, 0x1EDA, 0x1EDC, 0x1EDE, 0x1EE0, 0x1EE2, 0x1EE4, 0x1EE6, 0x1EE8, 0x1EEA, - 0x1EEC, 0x1EEE, 0x1EF0, 0x1EF2, 0x1EF4, 0x1EF6, 0x1EF8, 0x1EFA, 0x1EFC, 0x1EFE, - 0x1F59, 0x1F5B, 0x1F5D, 0x1F5F, 0x2102, 0x2107, 0x2115, 0x2124, 0x2126, 0x2128, - 0x2145, 0x2183, 0x2C60, 0x2C67, 0x2C69, 0x2C6B, 0x2C72, 0x2C75, 0x2C82, 0x2C84, - 0x2C86, 0x2C88, 0x2C8A, 0x2C8C, 0x2C8E, 0x2C90, 0x2C92, 0x2C94, 0x2C96, 0x2C98, - 0x2C9A, 0x2C9C, 0x2C9E, 0x2CA0, 0x2CA2, 0x2CA4, 0x2CA6, 0x2CA8, 0x2CAA, 0x2CAC, - 0x2CAE, 0x2CB0, 0x2CB2, 0x2CB4, 0x2CB6, 0x2CB8, 0x2CBA, 0x2CBC, 0x2CBE, 0x2CC0, - 0x2CC2, 0x2CC4, 0x2CC6, 0x2CC8, 0x2CCA, 0x2CCC, 0x2CCE, 0x2CD0, 0x2CD2, 0x2CD4, - 0x2CD6, 0x2CD8, 0x2CDA, 0x2CDC, 0x2CDE, 0x2CE0, 0x2CE2, 0x2CEB, 0x2CED, 0x2CF2, - 0xA640, 0xA642, 0xA644, 0xA646, 0xA648, 0xA64A, 0xA64C, 0xA64E, 0xA650, 0xA652, - 0xA654, 0xA656, 0xA658, 0xA65A, 0xA65C, 0xA65E, 0xA660, 0xA662, 0xA664, 0xA666, - 0xA668, 0xA66A, 0xA66C, 0xA680, 0xA682, 0xA684, 0xA686, 0xA688, 0xA68A, 0xA68C, - 0xA68E, 0xA690, 0xA692, 0xA694, 0xA696, 0xA698, 0xA69A, 0xA722, 0xA724, 0xA726, - 0xA728, 0xA72A, 0xA72C, 0xA72E, 0xA732, 0xA734, 0xA736, 0xA738, 0xA73A, 0xA73C, - 0xA73E, 0xA740, 0xA742, 0xA744, 0xA746, 0xA748, 0xA74A, 0xA74C, 0xA74E, 0xA750, - 0xA752, 0xA754, 0xA756, 0xA758, 0xA75A, 0xA75C, 0xA75E, 0xA760, 0xA762, 0xA764, - 0xA766, 0xA768, 0xA76A, 0xA76C, 0xA76E, 0xA779, 0xA77B, 0xA780, 0xA782, 0xA784, - 0xA786, 0xA78B, 0xA78D, 0xA790, 0xA792, 0xA796, 0xA798, 0xA79A, 0xA79C, 0xA79E, - 0xA7A0, 0xA7A2, 0xA7A4, 0xA7A6, 0xA7A8, 0xA7B6, 0xA7B8, 0xA7BA, 0xA7BC, 0xA7BE, - 0xA7C0, 0xA7C2, 0xA7C9, 0xA7CE, 0xA7D0, 0xA7D2, 0xA7D4, 0xA7D6, 0xA7D8, 0xA7DA, - 0xA7DC, 0xA7F5, + 0x0100, 0x0102, 0x0104, 0x0106, 0x0108, 0x010A, 0x010C, 0x010E, + 0x0110, 0x0112, 0x0114, 0x0116, 0x0118, 0x011A, 0x011C, 0x011E, + 0x0120, 0x0122, 0x0124, 0x0126, 0x0128, 0x012A, 0x012C, 0x012E, + 0x0130, 0x0132, 0x0134, 0x0136, 0x0139, 0x013B, 0x013D, 0x013F, + 0x0141, 0x0143, 0x0145, 0x0147, 0x014A, 0x014C, 0x014E, 0x0150, + 0x0152, 0x0154, 0x0156, 0x0158, 0x015A, 0x015C, 0x015E, 0x0160, + 0x0162, 0x0164, 0x0166, 0x0168, 0x016A, 0x016C, 0x016E, 0x0170, + 0x0172, 0x0174, 0x0176, 0x017B, 0x017D, 0x0184, 0x01A2, 0x01A4, + 0x01A9, 0x01AC, 0x01B5, 0x01BC, 0x01C4, 0x01C7, 0x01CA, 0x01CD, + 0x01CF, 0x01D1, 0x01D3, 0x01D5, 0x01D7, 0x01D9, 0x01DB, 0x01DE, + 0x01E0, 0x01E2, 0x01E4, 0x01E6, 0x01E8, 0x01EA, 0x01EC, 0x01EE, + 0x01F1, 0x01F4, 0x01FA, 0x01FC, 0x01FE, 0x0200, 0x0202, 0x0204, + 0x0206, 0x0208, 0x020A, 0x020C, 0x020E, 0x0210, 0x0212, 0x0214, + 0x0216, 0x0218, 0x021A, 0x021C, 0x021E, 0x0220, 0x0222, 0x0224, + 0x0226, 0x0228, 0x022A, 0x022C, 0x022E, 0x0230, 0x0232, 0x0241, + 0x0248, 0x024A, 0x024C, 0x024E, 0x0370, 0x0372, 0x0376, 0x037F, + 0x0386, 0x038C, 0x03CF, 0x03D8, 0x03DA, 0x03DC, 0x03DE, 0x03E0, + 0x03E2, 0x03E4, 0x03E6, 0x03E8, 0x03EA, 0x03EC, 0x03EE, 0x03F4, + 0x03F7, 0x0460, 0x0462, 0x0464, 0x0466, 0x0468, 0x046A, 0x046C, + 0x046E, 0x0470, 0x0472, 0x0474, 0x0476, 0x0478, 0x047A, 0x047C, + 0x047E, 0x0480, 0x048A, 0x048C, 0x048E, 0x0490, 0x0492, 0x0494, + 0x0496, 0x0498, 0x049A, 0x049C, 0x049E, 0x04A0, 0x04A2, 0x04A4, + 0x04A6, 0x04A8, 0x04AA, 0x04AC, 0x04AE, 0x04B0, 0x04B2, 0x04B4, + 0x04B6, 0x04B8, 0x04BA, 0x04BC, 0x04BE, 0x04C3, 0x04C5, 0x04C7, + 0x04C9, 0x04CB, 0x04CD, 0x04D0, 0x04D2, 0x04D4, 0x04D6, 0x04D8, + 0x04DA, 0x04DC, 0x04DE, 0x04E0, 0x04E2, 0x04E4, 0x04E6, 0x04E8, + 0x04EA, 0x04EC, 0x04EE, 0x04F0, 0x04F2, 0x04F4, 0x04F6, 0x04F8, + 0x04FA, 0x04FC, 0x04FE, 0x0500, 0x0502, 0x0504, 0x0506, 0x0508, + 0x050A, 0x050C, 0x050E, 0x0510, 0x0512, 0x0514, 0x0516, 0x0518, + 0x051A, 0x051C, 0x051E, 0x0520, 0x0522, 0x0524, 0x0526, 0x0528, + 0x052A, 0x052C, 0x052E, 0x10C7, 0x10CD, 0x1C89, 0x1E00, 0x1E02, + 0x1E04, 0x1E06, 0x1E08, 0x1E0A, 0x1E0C, 0x1E0E, 0x1E10, 0x1E12, + 0x1E14, 0x1E16, 0x1E18, 0x1E1A, 0x1E1C, 0x1E1E, 0x1E20, 0x1E22, + 0x1E24, 0x1E26, 0x1E28, 0x1E2A, 0x1E2C, 0x1E2E, 0x1E30, 0x1E32, + 0x1E34, 0x1E36, 0x1E38, 0x1E3A, 0x1E3C, 0x1E3E, 0x1E40, 0x1E42, + 0x1E44, 0x1E46, 0x1E48, 0x1E4A, 0x1E4C, 0x1E4E, 0x1E50, 0x1E52, + 0x1E54, 0x1E56, 0x1E58, 0x1E5A, 0x1E5C, 0x1E5E, 0x1E60, 0x1E62, + 0x1E64, 0x1E66, 0x1E68, 0x1E6A, 0x1E6C, 0x1E6E, 0x1E70, 0x1E72, + 0x1E74, 0x1E76, 0x1E78, 0x1E7A, 0x1E7C, 0x1E7E, 0x1E80, 0x1E82, + 0x1E84, 0x1E86, 0x1E88, 0x1E8A, 0x1E8C, 0x1E8E, 0x1E90, 0x1E92, + 0x1E94, 0x1E9E, 0x1EA0, 0x1EA2, 0x1EA4, 0x1EA6, 0x1EA8, 0x1EAA, + 0x1EAC, 0x1EAE, 0x1EB0, 0x1EB2, 0x1EB4, 0x1EB6, 0x1EB8, 0x1EBA, + 0x1EBC, 0x1EBE, 0x1EC0, 0x1EC2, 0x1EC4, 0x1EC6, 0x1EC8, 0x1ECA, + 0x1ECC, 0x1ECE, 0x1ED0, 0x1ED2, 0x1ED4, 0x1ED6, 0x1ED8, 0x1EDA, + 0x1EDC, 0x1EDE, 0x1EE0, 0x1EE2, 0x1EE4, 0x1EE6, 0x1EE8, 0x1EEA, + 0x1EEC, 0x1EEE, 0x1EF0, 0x1EF2, 0x1EF4, 0x1EF6, 0x1EF8, 0x1EFA, + 0x1EFC, 0x1EFE, 0x1F59, 0x1F5B, 0x1F5D, 0x1F5F, 0x2102, 0x2107, + 0x2115, 0x2124, 0x2126, 0x2128, 0x2145, 0x2183, 0x2C60, 0x2C67, + 0x2C69, 0x2C6B, 0x2C72, 0x2C75, 0x2C82, 0x2C84, 0x2C86, 0x2C88, + 0x2C8A, 0x2C8C, 0x2C8E, 0x2C90, 0x2C92, 0x2C94, 0x2C96, 0x2C98, + 0x2C9A, 0x2C9C, 0x2C9E, 0x2CA0, 0x2CA2, 0x2CA4, 0x2CA6, 0x2CA8, + 0x2CAA, 0x2CAC, 0x2CAE, 0x2CB0, 0x2CB2, 0x2CB4, 0x2CB6, 0x2CB8, + 0x2CBA, 0x2CBC, 0x2CBE, 0x2CC0, 0x2CC2, 0x2CC4, 0x2CC6, 0x2CC8, + 0x2CCA, 0x2CCC, 0x2CCE, 0x2CD0, 0x2CD2, 0x2CD4, 0x2CD6, 0x2CD8, + 0x2CDA, 0x2CDC, 0x2CDE, 0x2CE0, 0x2CE2, 0x2CEB, 0x2CED, 0x2CF2, + 0xA640, 0xA642, 0xA644, 0xA646, 0xA648, 0xA64A, 0xA64C, 0xA64E, + 0xA650, 0xA652, 0xA654, 0xA656, 0xA658, 0xA65A, 0xA65C, 0xA65E, + 0xA660, 0xA662, 0xA664, 0xA666, 0xA668, 0xA66A, 0xA66C, 0xA680, + 0xA682, 0xA684, 0xA686, 0xA688, 0xA68A, 0xA68C, 0xA68E, 0xA690, + 0xA692, 0xA694, 0xA696, 0xA698, 0xA69A, 0xA722, 0xA724, 0xA726, + 0xA728, 0xA72A, 0xA72C, 0xA72E, 0xA732, 0xA734, 0xA736, 0xA738, + 0xA73A, 0xA73C, 0xA73E, 0xA740, 0xA742, 0xA744, 0xA746, 0xA748, + 0xA74A, 0xA74C, 0xA74E, 0xA750, 0xA752, 0xA754, 0xA756, 0xA758, + 0xA75A, 0xA75C, 0xA75E, 0xA760, 0xA762, 0xA764, 0xA766, 0xA768, + 0xA76A, 0xA76C, 0xA76E, 0xA779, 0xA77B, 0xA780, 0xA782, 0xA784, + 0xA786, 0xA78B, 0xA78D, 0xA790, 0xA792, 0xA796, 0xA798, 0xA79A, + 0xA79C, 0xA79E, 0xA7A0, 0xA7A2, 0xA7A4, 0xA7A6, 0xA7A8, 0xA7B6, + 0xA7B8, 0xA7BA, 0xA7BC, 0xA7BE, 0xA7C0, 0xA7C2, 0xA7C9, 0xA7CE, + 0xA7D0, 0xA7D2, 0xA7D4, 0xA7D6, 0xA7D8, 0xA7DA, 0xA7DC, 0xA7F5, } @(rodata) @@ -980,10 +1009,11 @@ lu_ranges := Range{ @(rodata) mc_singles16 := [?]u16{ - 0x0903, 0x093B, 0x09D7, 0x0A03, 0x0A83, 0x0AC9, 0x0B3E, 0x0B40, 0x0B57, 0x0BD7, - 0x0CBE, 0x0CF3, 0x0D57, 0x0F7F, 0x1031, 0x1038, 0x108F, 0x1715, 0x1734, 0x17B6, - 0x1A55, 0x1A57, 0x1A61, 0x1B04, 0x1B35, 0x1B3B, 0x1B82, 0x1BA1, 0x1BAA, 0x1BE7, - 0x1BEE, 0x1CE1, 0x1CF7, 0xA827, 0xA983, 0xAA4D, 0xAA7B, 0xAA7D, 0xAAEB, 0xAAF5, + 0x0903, 0x093B, 0x09D7, 0x0A03, 0x0A83, 0x0AC9, 0x0B3E, 0x0B40, + 0x0B57, 0x0BD7, 0x0CBE, 0x0CF3, 0x0D57, 0x0F7F, 0x1031, 0x1038, + 0x108F, 0x1715, 0x1734, 0x17B6, 0x1A55, 0x1A57, 0x1A61, 0x1B04, + 0x1B35, 0x1B3B, 0x1B82, 0x1BA1, 0x1BAA, 0x1BE7, 0x1BEE, 0x1CE1, + 0x1CF7, 0xA827, 0xA983, 0xAA4D, 0xAA7B, 0xAA7D, 0xAAEB, 0xAAF5, 0xABEC, } @@ -1145,14 +1175,16 @@ me_ranges := Range{ @(rodata) mn_singles16 := [?]u16{ - 0x05BF, 0x05C7, 0x0670, 0x0711, 0x07FD, 0x093A, 0x093C, 0x094D, 0x0981, 0x09BC, - 0x09CD, 0x09FE, 0x0A3C, 0x0A51, 0x0A75, 0x0ABC, 0x0ACD, 0x0B01, 0x0B3C, 0x0B3F, - 0x0B4D, 0x0B82, 0x0BC0, 0x0BCD, 0x0C00, 0x0C04, 0x0C3C, 0x0C81, 0x0CBC, 0x0CBF, - 0x0CC6, 0x0D4D, 0x0D81, 0x0DCA, 0x0DD6, 0x0E31, 0x0EB1, 0x0F35, 0x0F37, 0x0F39, - 0x0FC6, 0x1082, 0x108D, 0x109D, 0x17C6, 0x17DD, 0x180F, 0x18A9, 0x1932, 0x1A1B, - 0x1A56, 0x1A60, 0x1A62, 0x1A7F, 0x1B34, 0x1B3C, 0x1B42, 0x1BE6, 0x1BED, 0x1CED, - 0x1CF4, 0x20E1, 0x2D7F, 0xA66F, 0xA802, 0xA806, 0xA80B, 0xA82C, 0xA8FF, 0xA9B3, - 0xA9E5, 0xAA43, 0xAA4C, 0xAA7C, 0xAAB0, 0xAAC1, 0xAAF6, 0xABE5, 0xABE8, 0xABED, + 0x05BF, 0x05C7, 0x0670, 0x0711, 0x07FD, 0x093A, 0x093C, 0x094D, + 0x0981, 0x09BC, 0x09CD, 0x09FE, 0x0A3C, 0x0A51, 0x0A75, 0x0ABC, + 0x0ACD, 0x0B01, 0x0B3C, 0x0B3F, 0x0B4D, 0x0B82, 0x0BC0, 0x0BCD, + 0x0C00, 0x0C04, 0x0C3C, 0x0C81, 0x0CBC, 0x0CBF, 0x0CC6, 0x0D4D, + 0x0D81, 0x0DCA, 0x0DD6, 0x0E31, 0x0EB1, 0x0F35, 0x0F37, 0x0F39, + 0x0FC6, 0x1082, 0x108D, 0x109D, 0x17C6, 0x17DD, 0x180F, 0x18A9, + 0x1932, 0x1A1B, 0x1A56, 0x1A60, 0x1A62, 0x1A7F, 0x1B34, 0x1B3C, + 0x1B42, 0x1BE6, 0x1BED, 0x1CED, 0x1CF4, 0x20E1, 0x2D7F, 0xA66F, + 0xA802, 0xA806, 0xA80B, 0xA82C, 0xA8FF, 0xA9B3, 0xA9E5, 0xAA43, + 0xAA4C, 0xAA7C, 0xAAB0, 0xAAC1, 0xAAF6, 0xABE5, 0xABE8, 0xABED, 0xFB1E, } @@ -1642,8 +1674,8 @@ pc_ranges := Range{ @(rodata) pd_singles16 := [?]u16{ - 0x002D, 0x058A, 0x05BE, 0x1400, 0x1806, 0x2E17, 0x2E1A, 0x2E40, 0x2E5D, 0x301C, - 0x3030, 0x30A0, 0xFE58, 0xFE63, 0xFF0D, + 0x002D, 0x058A, 0x05BE, 0x1400, 0x1806, 0x2E17, 0x2E1A, 0x2E40, + 0x2E5D, 0x301C, 0x3030, 0x30A0, 0xFE58, 0xFE63, 0xFF0D, } @(rodata) @@ -1666,14 +1698,16 @@ pd_ranges := Range{ @(rodata) pe_singles16 := [?]u16{ - 0x0029, 0x005D, 0x007D, 0x0F3B, 0x0F3D, 0x169C, 0x2046, 0x207E, 0x208E, 0x2309, - 0x230B, 0x232A, 0x2769, 0x276B, 0x276D, 0x276F, 0x2771, 0x2773, 0x2775, 0x27C6, - 0x27E7, 0x27E9, 0x27EB, 0x27ED, 0x27EF, 0x2984, 0x2986, 0x2988, 0x298A, 0x298C, - 0x298E, 0x2990, 0x2992, 0x2994, 0x2996, 0x2998, 0x29D9, 0x29DB, 0x29FD, 0x2E23, - 0x2E25, 0x2E27, 0x2E29, 0x2E56, 0x2E58, 0x2E5A, 0x2E5C, 0x3009, 0x300B, 0x300D, - 0x300F, 0x3011, 0x3015, 0x3017, 0x3019, 0x301B, 0xFD3E, 0xFE18, 0xFE36, 0xFE38, - 0xFE3A, 0xFE3C, 0xFE3E, 0xFE40, 0xFE42, 0xFE44, 0xFE48, 0xFE5A, 0xFE5C, 0xFE5E, - 0xFF09, 0xFF3D, 0xFF5D, 0xFF60, 0xFF63, + 0x0029, 0x005D, 0x007D, 0x0F3B, 0x0F3D, 0x169C, 0x2046, 0x207E, + 0x208E, 0x2309, 0x230B, 0x232A, 0x2769, 0x276B, 0x276D, 0x276F, + 0x2771, 0x2773, 0x2775, 0x27C6, 0x27E7, 0x27E9, 0x27EB, 0x27ED, + 0x27EF, 0x2984, 0x2986, 0x2988, 0x298A, 0x298C, 0x298E, 0x2990, + 0x2992, 0x2994, 0x2996, 0x2998, 0x29D9, 0x29DB, 0x29FD, 0x2E23, + 0x2E25, 0x2E27, 0x2E29, 0x2E56, 0x2E58, 0x2E5A, 0x2E5C, 0x3009, + 0x300B, 0x300D, 0x300F, 0x3011, 0x3015, 0x3017, 0x3019, 0x301B, + 0xFD3E, 0xFE18, 0xFE36, 0xFE38, 0xFE3A, 0xFE3C, 0xFE3E, 0xFE40, + 0xFE42, 0xFE44, 0xFE48, 0xFE5A, 0xFE5C, 0xFE5E, 0xFF09, 0xFF3D, + 0xFF5D, 0xFF60, 0xFF63, } @(rodata) @@ -1688,7 +1722,8 @@ pe_ranges := Range{ @(rodata) pf_singles16 := [?]u16{ - 0x00BB, 0x2019, 0x201D, 0x203A, 0x2E03, 0x2E05, 0x2E0A, 0x2E0D, 0x2E1D, 0x2E21, + 0x00BB, 0x2019, 0x201D, 0x203A, 0x2E03, 0x2E05, 0x2E0A, 0x2E0D, + 0x2E1D, 0x2E21, } pf_ranges := Range{ @@ -1697,7 +1732,8 @@ pf_ranges := Range{ @(rodata) pi_singles16 := [?]u16{ - 0x00AB, 0x2018, 0x201F, 0x2039, 0x2E02, 0x2E04, 0x2E09, 0x2E0C, 0x2E1C, 0x2E20, + 0x00AB, 0x2018, 0x201F, 0x2039, 0x2E02, 0x2E04, 0x2E09, 0x2E0C, + 0x2E1C, 0x2E20, } @(rodata) @@ -1712,10 +1748,11 @@ pi_ranges := Range{ @(rodata) po_singles16 := [?]u16{ - 0x002A, 0x002C, 0x005C, 0x00A1, 0x00A7, 0x00BF, 0x037E, 0x0387, 0x0589, 0x05C0, - 0x05C3, 0x05C6, 0x061B, 0x06D4, 0x085E, 0x0970, 0x09FD, 0x0A76, 0x0AF0, 0x0C77, - 0x0C84, 0x0DF4, 0x0E4F, 0x0F14, 0x0F85, 0x10FB, 0x166E, 0x1CD3, 0x2053, 0x2D70, - 0x2E0B, 0x2E1B, 0x2E41, 0x303D, 0x30FB, 0xA673, 0xA67E, 0xA8FC, 0xA95F, 0xABEB, + 0x002A, 0x002C, 0x005C, 0x00A1, 0x00A7, 0x00BF, 0x037E, 0x0387, + 0x0589, 0x05C0, 0x05C3, 0x05C6, 0x061B, 0x06D4, 0x085E, 0x0970, + 0x09FD, 0x0A76, 0x0AF0, 0x0C77, 0x0C84, 0x0DF4, 0x0E4F, 0x0F14, + 0x0F85, 0x10FB, 0x166E, 0x1CD3, 0x2053, 0x2D70, 0x2E0B, 0x2E1B, + 0x2E41, 0x303D, 0x30FB, 0xA673, 0xA67E, 0xA8FC, 0xA95F, 0xABEB, 0xFE19, 0xFE30, 0xFE68, 0xFF0A, 0xFF0C, 0xFF3C, 0xFF61, } @@ -1867,14 +1904,16 @@ po_ranges := Range{ @(rodata) ps_singles16 := [?]u16{ - 0x0028, 0x005B, 0x007B, 0x0F3A, 0x0F3C, 0x169B, 0x201A, 0x201E, 0x2045, 0x207D, - 0x208D, 0x2308, 0x230A, 0x2329, 0x2768, 0x276A, 0x276C, 0x276E, 0x2770, 0x2772, - 0x2774, 0x27C5, 0x27E6, 0x27E8, 0x27EA, 0x27EC, 0x27EE, 0x2983, 0x2985, 0x2987, - 0x2989, 0x298B, 0x298D, 0x298F, 0x2991, 0x2993, 0x2995, 0x2997, 0x29D8, 0x29DA, - 0x29FC, 0x2E22, 0x2E24, 0x2E26, 0x2E28, 0x2E42, 0x2E55, 0x2E57, 0x2E59, 0x2E5B, - 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016, 0x3018, 0x301A, 0x301D, - 0xFD3F, 0xFE17, 0xFE35, 0xFE37, 0xFE39, 0xFE3B, 0xFE3D, 0xFE3F, 0xFE41, 0xFE43, - 0xFE47, 0xFE59, 0xFE5B, 0xFE5D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F, 0xFF62, + 0x0028, 0x005B, 0x007B, 0x0F3A, 0x0F3C, 0x169B, 0x201A, 0x201E, + 0x2045, 0x207D, 0x208D, 0x2308, 0x230A, 0x2329, 0x2768, 0x276A, + 0x276C, 0x276E, 0x2770, 0x2772, 0x2774, 0x27C5, 0x27E6, 0x27E8, + 0x27EA, 0x27EC, 0x27EE, 0x2983, 0x2985, 0x2987, 0x2989, 0x298B, + 0x298D, 0x298F, 0x2991, 0x2993, 0x2995, 0x2997, 0x29D8, 0x29DA, + 0x29FC, 0x2E22, 0x2E24, 0x2E26, 0x2E28, 0x2E42, 0x2E55, 0x2E57, + 0x2E59, 0x2E5B, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, + 0x3016, 0x3018, 0x301A, 0x301D, 0xFD3F, 0xFE17, 0xFE35, 0xFE37, + 0xFE39, 0xFE3B, 0xFE3D, 0xFE3F, 0xFE41, 0xFE43, 0xFE47, 0xFE59, + 0xFE5B, 0xFE5D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F, 0xFF62, } ps_ranges := Range{ @@ -1883,8 +1922,8 @@ ps_ranges := Range{ @(rodata) sc_singles16 := [?]u16{ - 0x0024, 0x058F, 0x060B, 0x09FB, 0x0AF1, 0x0BF9, 0x0E3F, 0x17DB, 0xA838, 0xFDFC, - 0xFE69, 0xFF04, + 0x0024, 0x058F, 0x060B, 0x09FB, 0x0AF1, 0x0BF9, 0x0E3F, 0x17DB, + 0xA838, 0xFDFC, 0xFE69, 0xFF04, } @(rodata) @@ -1916,8 +1955,8 @@ sc_ranges := Range{ @(rodata) sk_singles16 := [?]u16{ - 0x005E, 0x0060, 0x00A8, 0x00AF, 0x00B4, 0x00B8, 0x02ED, 0x0375, 0x0888, 0x1FBD, - 0xAB5B, 0xFF3E, 0xFF40, 0xFFE3, + 0x005E, 0x0060, 0x00A8, 0x00AF, 0x00B4, 0x00B8, 0x02ED, 0x0375, + 0x0888, 0x1FBD, 0xAB5B, 0xFF3E, 0xFF40, 0xFFE3, } @(rodata) @@ -1953,9 +1992,10 @@ sk_ranges := Range{ @(rodata) sm_singles16 := [?]u16{ - 0x002B, 0x007C, 0x007E, 0x00AC, 0x00B1, 0x00D7, 0x00F7, 0x03F6, 0x2044, 0x2052, - 0x2118, 0x214B, 0x21A0, 0x21A3, 0x21A6, 0x21AE, 0x21D2, 0x21D4, 0x237C, 0x25B7, - 0x25C1, 0x266F, 0xFB29, 0xFE62, 0xFF0B, 0xFF5C, 0xFF5E, 0xFFE2, + 0x002B, 0x007C, 0x007E, 0x00AC, 0x00B1, 0x00D7, 0x00F7, 0x03F6, + 0x2044, 0x2052, 0x2118, 0x214B, 0x21A0, 0x21A3, 0x21A6, 0x21AE, + 0x21D2, 0x21D4, 0x237C, 0x25B7, 0x25C1, 0x266F, 0xFB29, 0xFE62, + 0xFF0B, 0xFF5C, 0xFF5E, 0xFFE2, } @(rodata) @@ -2009,10 +2049,11 @@ sm_ranges := Range{ @(rodata) so_singles16 := [?]u16{ - 0x00A6, 0x00A9, 0x00AE, 0x00B0, 0x0482, 0x06DE, 0x06E9, 0x07F6, 0x09FA, 0x0B70, - 0x0BFA, 0x0C7F, 0x0D4F, 0x0D79, 0x0F13, 0x0F34, 0x0F36, 0x0F38, 0x166D, 0x1940, - 0x2114, 0x2125, 0x2127, 0x2129, 0x212E, 0x214A, 0x214F, 0x21D3, 0x3004, 0x3020, - 0x31EF, 0x3250, 0xA839, 0xFFE4, 0xFFE8, + 0x00A6, 0x00A9, 0x00AE, 0x00B0, 0x0482, 0x06DE, 0x06E9, 0x07F6, + 0x09FA, 0x0B70, 0x0BFA, 0x0C7F, 0x0D4F, 0x0D79, 0x0F13, 0x0F34, + 0x0F36, 0x0F38, 0x166D, 0x1940, 0x2114, 0x2125, 0x2127, 0x2129, + 0x212E, 0x214A, 0x214F, 0x21D3, 0x3004, 0x3020, 0x31EF, 0x3250, + 0xA839, 0xFFE4, 0xFFE8, } @(rodata) @@ -2233,7 +2274,8 @@ extra_digits_ranges := Range{ @(rodata) other_lowercase_singles16 := [?]u16{ - 0x00AA, 0x00BA, 0x0345, 0x037A, 0x10FC, 0x1D78, 0x2071, 0x207F, 0xA770, 0xAB69, + 0x00AA, 0x00BA, 0x0345, 0x037A, 0x10FC, 0x1D78, 0x2071, 0x207F, + 0xA770, 0xAB69, } @(rodata) diff --git a/core/unicode/tools/ucd/generate_unicode.odin b/core/unicode/tools/ucd/generate_unicode.odin index ffa8a3be3..9494674a1 100644 --- a/core/unicode/tools/ucd/generate_unicode.odin +++ b/core/unicode/tools/ucd/generate_unicode.odin @@ -3,129 +3,112 @@ package ucd import "core:fmt" import "core:os" import "core:strings" -import "base:runtime" import "core:mem" import "core:io" import "core:log" // Table 2-3. Types of Code Points // Table 4-4. General_Category Values page 229 - // Reference https://www.unicode.org/reports/tr44/ - /* -Formats a Dynamic_Range into a set of fixed length arrays and writes -corresponding to a io.Writer. The value of the parameter `name`will be used as a -prefix to the array names. If a dynamic array contained in the `range` is empty, -no corresponding fixed length array will be written. +Formats a `Dynamic_Range` into a set of fixed length arrays and writes them to an `io.Writer`. +The value of the parameter `name` will be used as a prefix to the array names. + +If a dynamic array contained in the `range` is empty, no corresponding fixed length array will be written. Inputs: -- writer: The io.Writer to be written to. +- writer: The `io.Writer` to be written to. - name: Prefix to add to any array that is written to `writer` -- range: The Dynamic_Range to format and write to writer. +- range: `The Dynamic_Range` to format and write to writer. */ -write_range_arrays :: proc(writer: io.Writer, name: string, range: Dynamic_Range) -> int { - n_written : int +write_range_arrays :: proc(writer: io.Writer, name: string, range: Dynamic_Range) { if len(range.single_16) > 0 { - n_written += fmt.wprintln(writer, "@(rodata)") - n_written += fmt.wprintf(writer, "%s_singles16 := [?]u16{{", name) - line_length := 100 - for v in range.single_16 { - str_buffer : [32]byte - str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) - - if line_length + len(str) > 80 { - n_written += fmt.wprintf(writer, "\n") - line_length = fmt.wprintf(writer, "\t0x%4X,",v) - n_written += line_length + fmt.wprintln(writer, "@(rodata)") + fmt.wprintf(writer, "%s_singles16 := [?]u16{{", name) + for v, count in range.single_16 { + if count % 8 == 0 { + fmt.wprintf(writer, "\n\t0x%4X,", v) + continue } else { - temp, _ := io.write_string(writer, str) - line_length += temp - n_written += temp + fmt.wprintf(writer, " 0x%4X,", v) } } - n_written += fmt.wprintln(writer, "\n}\n") + fmt.wprintln(writer, "\n}\n") } if len(range.ranges_16) > 0 { - n_written += fmt.wprintln(writer, "@(rodata)") - n_written += fmt.wprintfln(writer, "%s_ranges16 := [?]u16{{", name) + fmt.wprintln(writer, "@(rodata)") + fmt.wprintfln(writer, "%s_ranges16 := [?]u16{{", name) for v in range.ranges_16 { - n_written += fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) + fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) } - n_written += fmt.wprintln(writer, "}\n") + fmt.wprintln(writer, "}\n") } if len(range.single_32) > 0 { - n_written += fmt.wprintln(writer, "@(rodata)") - n_written += fmt.wprintf(writer, "%s_singles32 := [?]i32{{", name) - line_length := 100 - for v in range.single_32 { - str_buffer : [32]byte - str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) - - if line_length + len(str) > 80 { - n_written += fmt.wprint(writer, "\n") - line_length = fmt.wprintf(writer, "\t0x%4X,",v) - n_written += line_length + fmt.wprintln(writer, "@(rodata)") + fmt.wprintf(writer, "%s_singles32 := [?]i32{{", name) + for v, count in range.single_32 { + if count % 8 == 0 { + fmt.wprintf(writer, "\n\t0x%4X,", v) + continue } else { - temp, _ := io.write_string(writer, str) - line_length += temp - n_written += temp + fmt.wprintf(writer, " 0x%4X,", v) } } - n_written += fmt.wprintln(writer, "\n}\n") + fmt.wprintln(writer, "\n}\n") } if len(range.ranges_32) > 0 { - n_written += fmt.wprintln(writer, "@(rodata)") - n_written += fmt.wprintfln(writer, "%s_ranges32 := [?]i32{{", name) + fmt.wprintln(writer, "@(rodata)") + fmt.wprintfln(writer, "%s_ranges32 := [?]i32{{", name) for v in range.ranges_32 { - n_written += fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) + fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) } - n_written += fmt.wprintln(writer, "}\n") + fmt.wprintln(writer, "}\n") } - return n_written + return } -write_range :: proc(writer: io.Writer, name: union{string, General_Category}, range: Dynamic_Range) -> (n_written: int) { +write_range :: proc(writer: io.Writer, name: union{string, General_Category}, range: Dynamic_Range) { buffer: [128]byte str: string - switch n in name{ + switch n in name { case string: assert(len(n) <= len(buffer)) - runtime.mem_copy(&buffer[0], raw_data(n), len(n)) - str = transmute(string) buffer[0:len(n)] + copy(buffer[:], n) + str = string(buffer[:len(n)]) case General_Category: str = fmt.bprintf(buffer[:], "%s", n) } + // lowercase table names for &b in buffer[0:len(str)] { if b >= 'A' && b <= 'Z' { b += ('a' - 'A') } } - n_written = write_range_arrays(writer, str, range) + write_range_arrays(writer, str, range) - n_written += fmt.wprintfln(writer, "%s_ranges := Range{{", str) + fmt.wprintfln(writer, "%s_ranges := Range{{", str) if len(range.single_16) > 0 { - n_written += fmt.wprintfln(writer, "\tsingle_16 = %s_singles16[:],", str) + fmt.wprintfln(writer, "\tsingle_16 = %s_singles16[:],", str) } if len(range.ranges_16) > 0 { - n_written += fmt.wprintfln(writer, "\tranges_16 = %s_ranges16[:],", str) + fmt.wprintfln(writer, "\tranges_16 = %s_ranges16[:],", str) } if len(range.single_32) > 0 { - n_written += fmt.wprintfln(writer, "\tsingle_32 = %s_singles32[:],", str) + fmt.wprintfln(writer, "\tsingle_32 = %s_singles32[:],", str) } if len(range.ranges_32) > 0 { - n_written += fmt.wprintfln(writer, "\tranges_32 = %s_ranges32[:],", str) + fmt.wprintfln(writer, "\tranges_32 = %s_ranges32[:],", str) } - n_written += fmt.wprintln(writer, "}\n") + fmt.wprintln(writer, "}\n") return } @@ -283,13 +266,13 @@ main :: proc() { //.Zs, // Space_Separator, a space character (of various non-zero widths) } - write_loop : for gc, i in general_category_ranges { + write_loop: for range, category in general_category_ranges { for excluded in to_exclude { - if i == excluded { + if category == excluded { continue write_loop } } - write_range(writer, i, gc) + write_range(writer, category, range) } write_range(writer, "extra_digits", extra_digits) diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index 27eb1ebb7..ea6283343 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -33,18 +33,18 @@ load_unicode_data :: proc(filename: string, allocator := context.allocator) -> ( str := string(data) line_loop: for _line in strings.split_lines_iterator(&str) { + // Ignore any comments line, _, _ := strings.partition(_line, "#") - if len(line) == 0 { - continue - } + + // Skip empty lines + if len(line) == 0 { continue } is_range := false - cp: rune - name: string - gc: General_Category - - num_6 : string - num_7 : string + cp: rune + name: string + gc: General_Category + num_6: string + num_7: string nt := Numeric_Type.None field_num := 0 @@ -76,7 +76,7 @@ load_unicode_data :: proc(filename: string, allocator := context.allocator) -> ( case 3: // Canonical_Combining_Class case 4: // Bidi Class case 5: // Decomposition_Type and Decomposition_Mapping - // Numeric_Type and Numberic_Value + // Numeric_Type and Numeric_Value case 6: num_6 = field From d880404b84506e61cea3d104aa954b10be6440c3 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Mar 2026 19:40:10 +0100 Subject: [PATCH 633/766] Style --- core/unicode/tools/ucd/string_to.odin | 514 +++++++------------------- core/unicode/tools/ucd/types.odin | 188 +++++----- core/unicode/tools/ucd/ucd.odin | 53 ++- 3 files changed, 256 insertions(+), 499 deletions(-) diff --git a/core/unicode/tools/ucd/string_to.odin b/core/unicode/tools/ucd/string_to.odin index 7c9115f21..4f07d7e67 100644 --- a/core/unicode/tools/ucd/string_to.odin +++ b/core/unicode/tools/ucd/string_to.odin @@ -1,394 +1,162 @@ package ucd -string_to_general_category :: proc "contextless"( - str: string, -) -> (gc: General_Category, err: Error) { +string_to_general_category :: proc "contextless" (str: string) -> (gc: General_Category, err: Error) { switch str { - case "Lu": - gc = .Lu - case "Ll": - gc = .Ll - case "Lt": - gc = .Lt - case "Lm": - gc = .Lm - case "Lo": - gc = .Lo - case "Mn": - gc = .Mn - case "Mc": - gc = .Mc - case "Me": - gc = .Me - case "Nd": - gc = .Nd - case "Nl": - gc = .Nl - case "No": - gc = .No - case "Pc": - gc = .Pc - case "Pd": - gc = .Pd - case "Ps": - gc = .Ps - case "Pe": - gc = .Pe - case "Pi": - gc = .Pi - case "Pf": - gc = .Pf - case "Po": - gc = .Po - case "Sm": - gc = .Sm - case "Sc": - gc = .Sc - case "Sk": - gc = .Sk - case "So": - gc = .So - case "Zs": - gc = .Zs - case "Zl": - gc = .Zl - case "Zp": - gc = .Zp - case "Cc": - gc = .Cc - case "Cf": - gc = .Cf - case "Cs": - gc = .Cs - case "Co": - gc = .Co - case "Cn": - gc = .Cn - case: - err = UCD_Error.Invalid_General_Category + case "Lu": gc = .Lu + case "Ll": gc = .Ll + case "Lt": gc = .Lt + case "Lm": gc = .Lm + case "Lo": gc = .Lo + case "Mn": gc = .Mn + case "Mc": gc = .Mc + case "Me": gc = .Me + case "Nd": gc = .Nd + case "Nl": gc = .Nl + case "No": gc = .No + case "Pc": gc = .Pc + case "Pd": gc = .Pd + case "Ps": gc = .Ps + case "Pe": gc = .Pe + case "Pi": gc = .Pi + case "Pf": gc = .Pf + case "Po": gc = .Po + case "Sm": gc = .Sm + case "Sc": gc = .Sc + case "Sk": gc = .Sk + case "So": gc = .So + case "Zs": gc = .Zs + case "Zl": gc = .Zl + case "Zp": gc = .Zp + case "Cc": gc = .Cc + case "Cf": gc = .Cf + case "Cs": gc = .Cs + case "Co": gc = .Co + case "Cn": gc = .Cn + case: err = .Invalid_General_Category } return } - -string_to_age :: proc "contextless" ( - str: string, -) -> (age: Age, err: Error) { +string_to_proplist_property :: proc(str: string) -> (prop: Prop_List_Property) { switch str { - case "1.1": - age = .Age_1_1 - return - - case "2.0": - age = .Age_2_0 - return - - case "2.1": - age = .Age_2_1 - return - - case "3.0": - age = .Age_3_0 - return - - case "3.1": - age = .Age_3_1 - return - - case "3.2": - age = .Age_3_2 - return - - case "4.0": - age = .Age_4_0 - return - - case "4.1": - age = .Age_4_1 - return - - case "5.0": - age = .Age_5_0 - return - - case "5.1": - age = .Age_5_1 - return - - case "5.2": - age = .Age_5_2 - return - - case "6.0": - age = .Age_6_0 - return - - case "6.1": - age = .Age_6_1 - return - - case "6.2": - age = .Age_6_2 - return - - case "6.3": - age = .Age_6_3 - return - - case "7.0": - age = .Age_7_0 - return - - case "8.0": - age = .Age_8_0 - return - - case "9.0": - age = .Age_9_0 - return - - case "10.0": - age = .Age_10_0 - return - - case "11.0": - age = .Age_11_0 - return - - case "12.0": - age = .Age_12_0 - return - - case "12.1": - age = .Age_12_1 - return - - case "13.0": - age = .Age_13_0 - return - - case "14.0": - age = .Age_14_0 - return - - case "15.0": - age = .Age_15_0 - return - - case "15.1": - age = .Age_15_1 - return - - case "16.0": - age = .Age_16_0 - return - - case "17.0": - age = .Age_17_0 - return - - case "unassigned": - age = .Age_Unassigned - return - - case: - // NOTE: Should this return an error instead? - unreachable() + case "White_Space": prop = .White_Space + case "Bidi_Control": prop = .Bidi_Control + case "Join_Control": prop = .Join_Control + case "Dash": prop = .Dash + case "Hyphen": prop = .Hyphen + case "Quotation_Mark": prop = .Quotation_Mark + case "Terminal_Punctuation": prop = .Terminal_Punctuation + case "Other_Math": prop = .Other_Math + case "Hex_Digit": prop = .Hex_Digit + case "ASCII_Hex_Digit": prop = .ASCII_Hex_Digit + case "Other_Alphabetic": prop = .Other_Alphabetic + case "Ideographic": prop = .Ideographic + case "Diacritic": prop = .Diacritic + case "Extender": prop = .Extender + case "Other_Lowercase": prop = .Other_Lowercase + case "Other_Uppercase": prop = .Other_Uppercase + case "Noncharacter_Code_Point": prop = .Noncharacter_Code_Point + case "Other_Grapheme_Extend": prop = .Other_Grapheme_Extend + case "IDS_Binary_Operator": prop = .IDS_Binary_Operator + case "IDS_Trinary_Operator": prop = .IDS_Trinary_Operator + case "IDS_Unary_Operator": prop = .IDS_Unary_Operator + case "Radical": prop = .Radical + case "Unified_Ideograph": prop = .Unified_Ideograph + case "Other_Default_Ignorable_Code_Point": prop = .Other_Default_Ignorable_Code_Point + case "Deprecated": prop = .Deprecated + case "Soft_Dotted": prop = .Soft_Dotted + case "Logical_Order_Exception": prop = .Logical_Order_Exception + case "Other_ID_Start": prop = .Other_ID_Start + case "Other_ID_Continue": prop = .Other_ID_Continue + case "ID_Compat_Math_Continue": prop = .ID_Compat_Math_Continue + case "ID_Compat_Math_Start": prop = .ID_Compat_Math_Start + case "Sentence_Terminal": prop = .Sentence_Terminal + case "Variation_Selector": prop = .Variation_Selector + case "Pattern_White_Space": prop = .Pattern_White_Space + case "Pattern_Syntax": prop = .Pattern_Syntax + case "Prepended_Concatenation_Mark": prop = .Prepended_Concatenation_Mark + case "Regional_Indicator": prop = .Regional_Indicator + case "Modifier_Combining_Mark": prop = .Modifier_Combining_Mark + case: prop = .Unknown_Property } + return } - -string_to_paired_bracket_type :: proc "contextless"(str: string) -> Paired_Brack_Type { +@(deprecated="Unused?") +string_to_age :: proc "contextless" (str: string) -> (age: Age) { switch str { - case "o": - return .Open - case "c": - return .Close - case "n": - return .None - case: - // TODO: Add error for this - unreachable() + case "1.1": age = .Age_1_1 + case "2.0": age = .Age_2_0 + case "2.1": age = .Age_2_1 + case "3.0": age = .Age_3_0 + case "3.1": age = .Age_3_1 + case "3.2": age = .Age_3_2 + case "4.0": age = .Age_4_0 + case "4.1": age = .Age_4_1 + case "5.0": age = .Age_5_0 + case "5.1": age = .Age_5_1 + case "5.2": age = .Age_5_2 + case "6.0": age = .Age_6_0 + case "6.1": age = .Age_6_1 + case "6.2": age = .Age_6_2 + case "6.3": age = .Age_6_3 + case "7.0": age = .Age_7_0 + case "8.0": age = .Age_8_0 + case "9.0": age = .Age_9_0 + case "10.0": age = .Age_10_0 + case "11.0": age = .Age_11_0 + case "12.0": age = .Age_12_0 + case "12.1": age = .Age_12_1 + case "13.0": age = .Age_13_0 + case "14.0": age = .Age_14_0 + case "15.0": age = .Age_15_0 + case "15.1": age = .Age_15_1 + case "16.0": age = .Age_16_0 + case "17.0": age = .Age_17_0 + case "unassigned": age = .Age_Unassigned + case: age = .Age_Unknown } + return } -string_to_bidi_class :: proc "contextless"(str: string) -> Bidi_Class { +@(deprecated="Unused?") +string_to_paired_bracket_type :: proc "contextless" (str: string) -> (pbt: Paired_Bracket_Type) { switch str { - case "AL": - return .AL - case "AN": - return .AN - case "B": - return .B - case "BN": - return .BN - case "CS": - return .CS - case "EN": - return .EN - case "ES": - return .ES - case "ET": - return .ET - case "FSI": - return .FSI - case "L": - return .L - case "LRE": - return .LRE - case "LRI": - return .LRI - case "LRO": - return .LRO - case "NSM": - return .NSM - case "ON": - return .ON - case "PDF": - return .PDF - case "PDI": - return .PDI - case "R": - return .R - case "RLE": - return .RLE - case "RLI": - return .RLI - case "RLO": - return .RLO - case "S": - return .S - case "WS": - return .WS - case: unreachable() // TODO: Add error for this + case "o": pbt = .Open + case "c": pbt = .Close + case "n": pbt = .None + case: pbt = .Unknown } + return } -string_to_proplist_property :: proc(str: string) -> ( - prop: PropList_Property, - err: UCD_Error, -) { - +@(deprecated="Unused?") +string_to_bidi_class :: proc "contextless" (str: string) -> (class: Bidi_Class) { switch str { - case "White_Space": - prop = .White_Space - - case "Bidi_Control": - prop = .Bidi_Control - - case "Join_Control": - prop = .Join_Control - - case "Dash": - prop = .Dash - - case "Hyphen": - prop = .Hyphen - - case "Quotation_Mark": - prop = .Quotation_Mark - - case "Terminal_Punctuation": - prop = .Terminal_Punctuation - - case "Other_Math": - prop = .Other_Math - - case "Hex_Digit": - prop = .Hex_Digit - - case "ASCII_Hex_Digit": - prop = .ASCII_Hex_Digit - - case "Other_Alphabetic": - prop = .Other_Alphabetic - - case "Ideographic": - prop = .Ideographic - - case "Diacritic": - prop = .Diacritic - - case "Extender": - prop = .Extender - - case "Other_Lowercase": - prop = .Other_Lowercase - - case "Other_Uppercase": - prop = .Other_Uppercase - - - case "Noncharacter_Code_Point": - prop = .Noncharacter_Code_Point - - case "Other_Grapheme_Extend": - prop = .Other_Grapheme_Extend - - case "IDS_Binary_Operator": - prop = .IDS_Binary_Operator - - case "IDS_Trinary_Operator": - prop = .IDS_Trinary_Operator - - case "IDS_Unary_Operator": - prop = .IDS_Unary_Operator - - case "Radical": - prop = .Radical - - case "Unified_Ideograph": - prop = .Unified_Ideograph - - case "Other_Default_Ignorable_Code_Point": - prop = .Other_Default_Ignorable_Code_Point - - case "Deprecated": - prop = .Deprecated - - case "Soft_Dotted": - prop = .Soft_Dotted - - case "Logical_Order_Exception": - prop = .Logical_Order_Exception - - case "Other_ID_Start": - prop = .Other_ID_Start - - case "Other_ID_Continue": - prop = .Other_ID_Continue - - case "ID_Compat_Math_Continue": - prop = .ID_Compat_Math_Continue - - case "ID_Compat_Math_Start": - prop = .ID_Compat_Math_Start - - case "Sentence_Terminal": - prop = .Sentence_Terminal - - case "Variation_Selector": - prop = .Variation_Selector - - case "Pattern_White_Space": - prop = .Pattern_White_Space - - case "Pattern_Syntax": - prop = .Pattern_Syntax - - case "Prepended_Concatenation_Mark": - prop = .Prepended_Concatenation_Mark - - case "Regional_Indicator": - prop = .Regional_Indicator - - case "Modifier_Combining_Mark": - prop = .Modifier_Combining_Mark - - case: - err = .Unknown_Property - return + case "AL": class = .AL + case "AN": class = .AN + case "B": class = .B + case "BN": class = .BN + case "CS": class = .CS + case "EN": class = .EN + case "ES": class = .ES + case "ET": class = .ET + case "FSI": class = .FSI + case "L": class = .L + case "LRE": class = .LRE + case "LRI": class = .LRI + case "LRO": class = .LRO + case "NSM": class = .NSM + case "ON": class = .ON + case "PDF": class = .PDF + case "PDI": class = .PDI + case "R": class = .R + case "RLE": class = .RLE + case "RLI": class = .RLI + case "RLO": class = .RLO + case "S": class = .S + case "WS": class = .WS + case: class = .Unknown } - - return -} + return +} \ No newline at end of file diff --git a/core/unicode/tools/ucd/types.odin b/core/unicode/tools/ucd/types.odin index 0ba6f8909..5b87f96f8 100644 --- a/core/unicode/tools/ucd/types.odin +++ b/core/unicode/tools/ucd/types.odin @@ -3,7 +3,7 @@ package ucd import "core:os" Age :: enum byte { - Nil = 0, + Age_Unknown = 0, Age_1_1, Age_2_0, Age_2_1, @@ -421,51 +421,49 @@ Block :: enum { Combining_Class :: distinct byte -Paired_Brack_Type :: enum { - Nil, +Paired_Bracket_Type :: enum { + Unknown, Open, Close, None, } Bidi_Class :: enum { - Nil, // - L, // Left-to-Right LRM - R, // Right-to-Left RLM - AL, // Right-to-Left Arabic ALM - EN, // European Number - ES, // European Number Separator - ET, // European Number Terminator - AN, // Arabic Number - CS, // Common Number Separator - NSM, // Nonspacing Mark - BN, // Boundary Neutral - B, // Paragraph Separator - S, // Segment Separator - WS, // Whitespace - ON, // Other Neutrals - LRE, // Left-to-Right Embedding LRE - LRO, // Left-to-Right Override LRO - RLE, // Right-to-Left Embedding RLE - RLO, // Right-to-Left Override RLO - PDF, // Pop Directional Format PDF - LRI, // Left-to-Right Isolate LRI - RLI, // Right-to-Left Isolate RLI - FSI, // First Strong Isolate FSI - PDI, // Pop Directional Isolate PDI + Unknown, // + L, // Left-to-Right LRM + R, // Right-to-Left RLM + AL, // Right-to-Left Arabic ALM + EN, // European Number + ES, // European Number Separator + ET, // European Number Terminator + AN, // Arabic Number + CS, // Common Number Separator + NSM, // Nonspacing Mark + BN, // Boundary Neutral + B, // Paragraph Separator + S, // Segment Separator + WS, // Whitespace + ON, // Other Neutrals + LRE, // Left-to-Right Embedding LRE + LRO, // Left-to-Right Override LRO + RLE, // Right-to-Left Embedding RLE + RLO, // Right-to-Left Override RLO + PDF, // Pop Directional Format PDF + LRI, // Left-to-Right Isolate LRI + RLI, // Right-to-Left Isolate RLI + FSI, // First Strong Isolate FSI + PDI, // Pop Directional Isolate PDI } - Bidi :: struct { - bc: Bidi_Class, + bc: Bidi_Class, bmg: Maybe(rune), // mirrored glyph - m: bool, // Bidi mirrored - c: bool, // Bidi control property - bpt : Paired_Brack_Type, // bidi paired bracket type - bpb : rune, // bidi paired bracket properties + m: bool, // Bidi mirrored + c: bool, // Bidi control property + pb: Paired_Bracket_Type, // bidi paired bracket type + bpb: rune, // bidi paired bracket properties } - Decomposition_Type :: enum { Nil = 0, can, @@ -490,71 +488,71 @@ Decomposition_Type :: enum { Trinary_Bool :: enum { Maybe = -1, - False = 0, - True = 1, + False = 0, + True = 1, } Decomposition_Mapping :: distinct [dynamic]rune Decomposition :: struct { - dt: Decomposition_Type, // Decomposition type - dm: Decomposition_Mapping, // Decomposition Mapping - ce: bool, // Composition Exclusion - comp_ex: bool, // Full Composition Exclusion - nfc_quick_check: Trinary_Bool, - nfd_quick_check: bool, + dt: Decomposition_Type, // Decomposition type + dm: Decomposition_Mapping, // Decomposition Mapping + ce: bool, // Composition Exclusion + comp_ex: bool, // Full Composition Exclusion + nfc_quick_check: Trinary_Bool, + nfd_quick_check: bool, nfkc_quick_check: Trinary_Bool, nfkd_quick_check: bool, } Numeric_Type :: enum { - None = 0, // None - Decimal, // De - Digit, // Di - Numeric, // Nu + None = 0, // None + Decimal, // De + Digit, // Di + Numeric, // Nu } /* Note: Value is NAN when numberator and denominator ar 0 */ Numberic_Value :: struct { - numerator: int, + numerator: int, denominator: int, } Char :: struct { - cp: rune, - name: string, - gc: General_Category, - ccc: Combining_Class, - bc: Bidi_Class, - dt: Decomposition_Type, - dm: Decomposition_Mapping, - nt: Numeric_Type, - nv: Numberic_Value, - bm: bool, + cp: rune, + name: string, + gc: General_Category, + ccc: Combining_Class, + bc: Bidi_Class, + dt: Decomposition_Type, + dm: Decomposition_Mapping, + nt: Numeric_Type, + nv: Numberic_Value, + bm: bool, name1: string, - sum: string, // Simple uppercase mapping - slm: string, // Simple lowercase mapping - stm: string, // Simple titlecase_mapping + sum: string, // Simple uppercase mapping + slm: string, // Simple lowercase mapping + stm: string, // Simple titlecase_mapping } Char_Range :: struct { first_cp: rune, - last_cp: rune, - name: string, - gc: General_Category, - ccc: Combining_Class, - bc: Bidi_Class, - dt: Decomposition_Type, - dm: Decomposition_Mapping, - nt: Numeric_Type, - nv: Numberic_Value, - bm: bool, - name1: string, - sum: string, // Simple uppercase mapping - slm: string, // Simple lowercase mapping - stm: string, // Simple titlecase_mapping + last_cp: rune, + name: string, + gc: General_Category, + ccc: Combining_Class, + bc: Bidi_Class, + dt: Decomposition_Type, + dm: Decomposition_Mapping, + nt: Numeric_Type, + nv: Numberic_Value, + bm: bool, + name1: string, + sum: string, // Simple uppercase mapping + slm: string, // Simple lowercase mapping + stm: string, // Simple titlecase_mapping } Chars :: union { @@ -565,7 +563,8 @@ Chars :: union { Unicode_Data :: distinct [dynamic]Chars -PropList_Property :: enum { +Prop_List_Property :: enum { + Unknown, White_Space, Bidi_Control, Join_Control, @@ -613,6 +612,7 @@ UCD_Error :: enum { Element_Not_Repertoire, Extra_Fields, Unknown_Property, + Unknown_Bidi_Class, NO_REPERTOIRE, UNEXPECTED_STRING, @@ -632,71 +632,63 @@ Error :: union #shared_nil { Range_u16 :: struct { first: u16, - last: u16, + last: u16, } Range_i32 :: struct { first: i32, - last: i32, + last: i32, } Range_Rune :: struct { first: rune, - last: rune, + last: rune, } Dynamic_Range :: struct { - single_16 : [dynamic]u16, - ranges_16 : [dynamic]Range_u16, - single_32 : [dynamic]i32, - ranges_32 : [dynamic]Range_i32, + single_16: [dynamic]u16, + ranges_16: [dynamic]Range_u16, + single_32: [dynamic]i32, + ranges_32: [dynamic]Range_i32, } -append_to_dynamic_range :: proc( - dr: ^Dynamic_Range, - range: Range_Rune, - allocator := context.allocator, -) { +append_to_dynamic_range :: proc(dr: ^Dynamic_Range, range: Range_Rune, allocator := context.allocator) { if range.first == range.last && range.first <= 0xFFFF { if len(dr.single_16) == 0 { dr.single_16 = make([dynamic]u16, 0, 512, allocator) } - append(&dr.single_16, cast(u16) range.first) + append(&dr.single_16, cast(u16)range.first) } else if range.first == range.last { if len(dr.single_32) == 0 { dr.single_32 = make([dynamic]i32, 0, 512, allocator) } - append(&dr.single_32, cast(i32) range.first) + append(&dr.single_32, cast(i32)range.first) } else if range.first <= 0xFFFF && range.last <= 0xFFFF { if len(dr.ranges_16) == 0 { dr.ranges_16 = make([dynamic]Range_u16, 0, 128, allocator) } - r := Range_u16{ cast(u16)range.first, cast(u16) range.last} + r := Range_u16{ cast(u16)range.first, cast(u16)range.last} append(&dr.ranges_16, r) } else { if len(dr.ranges_32) == 0 { dr.ranges_32 = make([dynamic]Range_i32, 0, 128, allocator) } - r := Range_i32{ cast(i32)range.first, cast(i32) range.last} + r := Range_i32{ cast(i32)range.first, cast(i32)range.last} append(&dr.ranges_32, r) } } -destroy_dynamic_range :: proc ( - dr: Dynamic_Range, -){ +destroy_dynamic_range :: proc(dr: Dynamic_Range) { delete(dr.ranges_16) delete(dr.ranges_32) delete(dr.single_16) delete(dr.single_32) } -destroy_general_category_ranges :: proc( - gcr: [General_Category]Dynamic_Range, -){ +destroy_general_category_ranges :: proc(gcr: [General_Category]Dynamic_Range) { for r in gcr { destroy_dynamic_range(r) } -} +} \ No newline at end of file diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index ea6283343..328fe06b8 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -98,38 +98,39 @@ load_unicode_data :: proc(filename: string, allocator := context.allocator) -> ( nt = .None } - case 9: // Bidi mirrored + case 9: // Bidi mirrored case 10: // Unicode 1 Name (Obsolete as of 6.2.0) case 11: // should be null case 12: case 13: case 14: - case: - unreachable() + case: + err = .Extra_Fields + return } } if is_range { - cr : Char_Range - cr.gc = gc - cr.first_cp = first_cp - cr.last_cp = cp - cr.name = name - cr.nt = nt - append(&unicode_data, cr) + append(&unicode_data, Char_Range { + gc = gc, + first_cp = first_cp, + last_cp = cp, + name = name, + nt = nt, + }) } else { - c : Char - c.gc = gc - c.cp = cp - c.name = name - c.nt = nt - append(&unicode_data, c) + append(&unicode_data, Char{ + gc = gc, + cp = cp, + name = name, + nt = nt, + }) } } return } -destroy_unicode_data :: proc(unicode_data: Unicode_Data){ +destroy_unicode_data :: proc(unicode_data: Unicode_Data) { for point in unicode_data { switch p in point { case Char: @@ -143,9 +144,9 @@ destroy_unicode_data :: proc(unicode_data: Unicode_Data){ gc_ranges :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (lst: [General_Category]Dynamic_Range) { - range := Range_Rune { + range := Range_Rune{ first = -1, - last = -1, + last = -1, } gc: General_Category @@ -174,6 +175,7 @@ gc_ranges :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (lst: [G range.last = -1 } } + if range.first != -1 { append_to_dynamic_range(&lst[gc], range, allocator) } @@ -274,15 +276,10 @@ load_property_list :: proc(filename: string, allocator := context.allocator) -> field := strings.trim_space(_field) switch i { - case 0: // Code point or code point range - rr.first, rr.last = decode_rune(field) or_return - - case 1: - prop = string_to_proplist_property(field) or_return - - case: - err = UCD_Error.Extra_Fields - return + // Code point or code point range + case 0: rr.first, rr.last = decode_rune(field) or_return + case 1: prop = string_to_proplist_property(field) or_return + case: return {}, .Extra_Fields } } From e119b9883f9ac846078b71c8da3568a4afa8d0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tar=C4=B1k=20B=2E?= Date: Tue, 10 Mar 2026 00:05:46 +0100 Subject: [PATCH 634/766] Use fi.space instead of fi.hash --- core/fmt/fmt.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index e955141fc..f1601f278 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2592,7 +2592,7 @@ fmt_named_buitlin_custom_formatters :: proc(fi: ^Info, v: any, verb: rune, info: prec = 6 buf[w] = 'm' } - if fi.hash { + if fi.space { w -= 1 buf[w] = ' ' } @@ -2601,7 +2601,7 @@ fmt_named_buitlin_custom_formatters :: proc(fi: ^Info, v: any, verb: rune, info: } else { w -= 1 buf[w] = 's' - if fi.hash { + if fi.space { w -= 1 buf[w] = ' ' } From 20b4d5757f5152f6519826dbfd19006fdd064805 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Mon, 9 Mar 2026 19:25:00 -0400 Subject: [PATCH 635/766] Corrected type name Prop_List_Property --- core/unicode/tools/ucd/string_to.odin | 4 ++-- core/unicode/tools/ucd/ucd.odin | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/unicode/tools/ucd/string_to.odin b/core/unicode/tools/ucd/string_to.odin index 4f07d7e67..26093a3a9 100644 --- a/core/unicode/tools/ucd/string_to.odin +++ b/core/unicode/tools/ucd/string_to.odin @@ -77,7 +77,7 @@ string_to_proplist_property :: proc(str: string) -> (prop: Prop_List_Property) { case "Prepended_Concatenation_Mark": prop = .Prepended_Concatenation_Mark case "Regional_Indicator": prop = .Regional_Indicator case "Modifier_Combining_Mark": prop = .Modifier_Combining_Mark - case: prop = .Unknown_Property + case: prop = .Unknown } return } @@ -159,4 +159,4 @@ string_to_bidi_class :: proc "contextless" (str: string) -> (class: Bidi_Class) case: class = .Unknown } return -} \ No newline at end of file +} diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index 328fe06b8..165147bbd 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -237,7 +237,7 @@ Data contained in the Unicode fiel PropList.txt A `Prop_List` is the data contained in the Unicode Database (UCD) file `PropList.txt`. It is created with the procedure `load_property_list` and destroyed with the procedure `destroy_property_list`. */ -Prop_List :: [PropList_Property]Dynamic_Range +Prop_List :: [Prop_List_Property]Dynamic_Range /* This function destroys a `Prop_List` created by `load_property_list`. @@ -268,7 +268,7 @@ load_property_list :: proc(filename: string, allocator := context.allocator) -> } rr: Range_Rune - prop: PropList_Property + prop: Prop_List_Property i := 0 for _field in strings.split_iterator(&line, ";") { @@ -287,4 +287,4 @@ load_property_list :: proc(filename: string, allocator := context.allocator) -> } return -} \ No newline at end of file +} From d3a71c5dc64a3afdd7e7ebbc0660218c5623e485 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Mon, 9 Mar 2026 19:32:27 -0400 Subject: [PATCH 636/766] string_to_proplist_property returns error string_to_proplist_property was being used with an or_return but did not return an error. The function now returns an error when it cannot identify a property. --- core/unicode/tools/ucd/string_to.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/unicode/tools/ucd/string_to.odin b/core/unicode/tools/ucd/string_to.odin index 26093a3a9..873c162b7 100644 --- a/core/unicode/tools/ucd/string_to.odin +++ b/core/unicode/tools/ucd/string_to.odin @@ -37,7 +37,7 @@ string_to_general_category :: proc "contextless" (str: string) -> (gc: General_C return } -string_to_proplist_property :: proc(str: string) -> (prop: Prop_List_Property) { +string_to_proplist_property :: proc(str: string) -> (prop: Prop_List_Property, err: Error) { switch str { case "White_Space": prop = .White_Space case "Bidi_Control": prop = .Bidi_Control @@ -78,6 +78,7 @@ string_to_proplist_property :: proc(str: string) -> (prop: Prop_List_Property) { case "Regional_Indicator": prop = .Regional_Indicator case "Modifier_Combining_Mark": prop = .Modifier_Combining_Mark case: prop = .Unknown + err = UCD_Error.Unknown_Property } return } From 72db43f2d6b03fe99570eff706212be427aa44e8 Mon Sep 17 00:00:00 2001 From: turu Date: Mon, 9 Mar 2026 21:33:23 -0500 Subject: [PATCH 637/766] correcting SIMD shr examples documentation --- core/simd/simd.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/simd/simd.odin b/core/simd/simd.odin index e2373d3e2..52c97cc45 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -493,7 +493,7 @@ Example: +-------+-------+-------+-------+ res: +-------+-------+-------+--------+ - | 0x04 | 0x2a | 0 | 0xff | + | 0x04 | 0x2a | 0 | 0x7f | +-------+-------+-------+--------+ */ shr :: intrinsics.simd_shr @@ -581,7 +581,7 @@ Example: +-------+-------+-------+-------+ res: +-------+-------+-------+--------+ - | 0x04 | 0x2a | 0x01 | 0xff | + | 0x04 | 0x2a | 0x01 | 0x7f | +-------+-------+-------+--------+ */ shr_masked :: intrinsics.simd_shr_masked From 5a82f06ba10dcdcb3cf384d30e0f3c879cb05ef1 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Mon, 9 Mar 2026 14:51:35 -0400 Subject: [PATCH 638/766] Add virtual arena tests for bug #5821 --- tests/core/mem/test_core_mem.odin | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/core/mem/test_core_mem.odin b/tests/core/mem/test_core_mem.odin index 9d64e50a3..3afd49a06 100644 --- a/tests/core/mem/test_core_mem.odin +++ b/tests/core/mem/test_core_mem.odin @@ -57,6 +57,33 @@ test_align_bumping_block_limit :: proc(t: ^testing.T) { testing.expect(t, len(data) == 896) } +@(test) +test_large_minimum_block_size :: proc(t: ^testing.T) { + a: virtual.Arena + defer virtual.arena_destroy(&a) + + init_err := virtual.arena_init_growing(&a, 16*mem.Megabyte) + testing.expect_value(t, init_err, nil) + + align : uint = 4 + for _ in 0..<6 { + data, err := virtual.arena_alloc(&a, 18874368, align) + testing.expect_value(t, err, nil) + testing.expect(t, len(data) == 18874368) + testing.expect(t, uintptr(raw_data(data)) & uintptr(align-1) == 0) + align *= 2 + virtual.arena_free_all(&a) + } + + align = 4 + for _ in 0..<32 { + data, err := virtual.arena_alloc(&a, 1048576, align) + testing.expect_value(t, err, nil) + testing.expect(t, len(data) == 1048576) + testing.expect(t, uintptr(raw_data(data)) & uintptr(align-1) == 0) + } +} + @(test) tlsf_test_overlap_and_zero :: proc(t: ^testing.T) { default_allocator := context.allocator From 5d80809dc845b890f75288b3e2b644ada42c4498 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Mon, 9 Mar 2026 14:58:58 -0400 Subject: [PATCH 639/766] Fix virtual arena memory block overcommit bug #5821 --- core/mem/virtual/arena.odin | 4 ++-- core/mem/virtual/virtual.odin | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/mem/virtual/arena.odin b/core/mem/virtual/arena.odin index b515aa3cf..bcf3ee702 100644 --- a/core/mem/virtual/arena.odin +++ b/core/mem/virtual/arena.odin @@ -141,9 +141,9 @@ arena_alloc_unguarded :: proc(arena: ^Arena, size: uint, alignment: uint, loc := needed := mem.align_forward_uint(size, alignment) needed = max(needed, arena.default_commit_size) - block_size := max(needed, arena.minimum_block_size) + block_size := max(needed, arena.minimum_block_size) + alignment - new_block := memory_block_alloc(needed, block_size, alignment, {}) or_return + new_block := memory_block_alloc(needed, block_size) or_return new_block.prev = arena.curr_block arena.curr_block = new_block arena.total_reserved += new_block.reserved diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin index 3f388acf3..d37c61267 100644 --- a/core/mem/virtual/virtual.odin +++ b/core/mem/virtual/virtual.odin @@ -154,7 +154,7 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: uint, pmblock.committed = platform_total_commit block.committed = pmblock.committed - base_offset - + assert(block.committed <= block.reserved) } return } @@ -174,7 +174,7 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: uint, err = .Out_Of_Memory return } - assert(block.committed <= block.reserved) + do_commit_if_necessary(block, size, default_commit_size) or_return data = block.base[block.used+alignment_offset:][:min_size] From c9e55d3add43d5627478b4aa4bf87a22bc1c9b91 Mon Sep 17 00:00:00 2001 From: bymehul Date: Tue, 10 Mar 2026 23:21:19 +0530 Subject: [PATCH 640/766] fix: handle full-width bit_field literal masks --- src/llvm_backend_expr.cpp | 26 +++++++++++--------------- tests/issues/run.sh | 1 + tests/issues/test_issue_6396.odin | 23 +++++++++++++++++++++++ 3 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 tests/issues/test_issue_6396.odin diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 81d7a4e36..1685f9627 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1,5 +1,14 @@ gb_internal lbValue lb_emit_arith_matrix(lbProcedure *p, TokenKind op, lbValue lhs, lbValue rhs, Type *type, bool component_wise); +gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) { + GB_ASSERT(bit_count <= 64); + if (bit_count == 0) { + return LLVMConstInt(type, 0, false); + } + u64 mask = bit_count == 64 ? ~0ull : (1ull<module; @@ -5148,13 +5157,7 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { for (isize i = 0; i < fields.count; i++) { auto const &f = fields[i]; - LLVMValueRef mask = LLVMConstInt(lit, 1, false); - #if LLVM_VERSION_MAJOR >= 19 - mask = LLVMBuildShl(p->builder, mask, LLVMConstInt(lit, f.bit_size, false), ""); - #else - mask = LLVMConstShl(mask, LLVMConstInt(lit, f.bit_size, false)); - #endif - mask = LLVMConstSub(mask, LLVMConstInt(lit, 1, false)); + LLVMValueRef mask = lb_const_low_bits_mask(lit, f.bit_size); LLVMValueRef elem = values[i].value; if (lb_sizeof(lit) < lb_sizeof(LLVMTypeOf(elem))) { @@ -5200,13 +5203,7 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { GB_ASSERT(mask_width > 0); bits_to_set -= mask_width; - LLVMValueRef mask = LLVMConstInt(vt, 1, false); - #if LLVM_VERSION_MAJOR >= 19 - mask = LLVMBuildShl(p->builder, mask, LLVMConstInt(vt, mask_width, false), ""); - #else - mask = LLVMConstShl(mask, LLVMConstInt(vt, mask_width, false)); - #endif - mask = LLVMConstSub(mask, LLVMConstInt(vt, 1, false)); + LLVMValueRef mask = lb_const_low_bits_mask(vt, mask_width); LLVMValueRef to_set = LLVMBuildAnd(p->builder, val, mask, ""); @@ -6076,4 +6073,3 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { return {}; } - diff --git a/tests/issues/run.sh b/tests/issues/run.sh index 6c6796e28..e2e45dbfa 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -36,6 +36,7 @@ $ODIN test ../test_issue_5699.odin $COMMON $ODIN test ../test_issue_6068.odin $COMMON $ODIN test ../test_issue_6101.odin $COMMON $ODIN test ../test_issue_6165.odin $COMMON +$ODIN test ../test_issue_6396.odin $COMMON if [[ $($ODIN build ../test_issue_6240.odin $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 3 ]] ; then echo "SUCCESSFUL 1/1" else diff --git a/tests/issues/test_issue_6396.odin b/tests/issues/test_issue_6396.odin new file mode 100644 index 000000000..5a0e7527c --- /dev/null +++ b/tests/issues/test_issue_6396.odin @@ -0,0 +1,23 @@ +// Tests issue #6396 https://github.com/odin-lang/Odin/issues/6396 +package test_issues + +import "core:testing" + +Issue6396_Full_Width_Field :: bit_field u32 { + a: u32 | 32, +} + +@test +test_issue_6396_full_width_bit_field_literal :: proc(t: ^testing.T) { + f0: Issue6396_Full_Width_Field = {a = 7} + testing.expect_value(t, f0.a, u32(7)) + + f0 = {a = 3} + testing.expect_value(t, f0.a, u32(3)) + + f0 = Issue6396_Full_Width_Field{a = 11} + testing.expect_value(t, f0.a, u32(11)) + + f0.a = 12 + testing.expect_value(t, f0.a, u32(12)) +} From 763c8d3a428994f7474a8234497936aed0438e6b Mon Sep 17 00:00:00 2001 From: bymehul Date: Wed, 11 Mar 2026 03:04:26 +0530 Subject: [PATCH 641/766] Fix generic cycle deadlock in struct layout --- src/types.cpp | 5 +++-- tests/issues/run.bat | 1 + tests/issues/run.sh | 6 ++++++ tests/issues/test_issue_6401.odin | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 tests/issues/test_issue_6401.odin diff --git a/src/types.cpp b/src/types.cpp index 0ecce1adc..b11e95452 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -4201,8 +4201,9 @@ gb_internal i64 type_align_of_internal(Type *t, TypePath *path) { if (t->Struct.is_packed) { return 1; } - - type_set_offsets(t); + // Avoid forcing offset computation here. The caller's type-path state must + // be able to detect recursive field cycles before any nested struct tries to + // re-enter this struct's offset mutex. i64 max = 1; for_array(i, t->Struct.fields) { diff --git a/tests/issues/run.bat b/tests/issues/run.bat index 9e722886d..3db9d48c2 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -31,6 +31,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_6101.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6165.odin %COMMON% || exit /b ..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b +..\..\..\odin build ..\test_issue_6401.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index e2e45dbfa..01e6a6a28 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -43,6 +43,12 @@ else echo "SUCCESSFUL 0/1" exit 1 fi +if [[ $($ODIN build ../test_issue_6401.odin $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 3 ]] ; then + echo "SUCCESSFUL 1/1" +else + echo "SUCCESSFUL 0/1" + exit 1 +fi set +x popd diff --git a/tests/issues/test_issue_6401.odin b/tests/issues/test_issue_6401.odin new file mode 100644 index 000000000..0f7cd58b6 --- /dev/null +++ b/tests/issues/test_issue_6401.odin @@ -0,0 +1,16 @@ +// Tests issue #6401 https://github.com/odin-lang/Odin/issues/6401 +package test_issues + +Wrapper :: struct(T: typeid) { + value: T, +} + +A :: struct { + value: Wrapper(B), +} + +B :: struct { + value: A, +} + +main :: proc() {} From 8b4cd5a3f303d1e13a1a5e14cecf993a4b9b5578 Mon Sep 17 00:00:00 2001 From: Michael Freundorfer Date: Wed, 11 Mar 2026 10:07:26 +0100 Subject: [PATCH 642/766] Fix auto reset event signal deadlock The status variables need to be updated every iteration, otherwise the thread will spin forever, if another thread waits on the event between the load and the compare exchange, because the old value is never updated. --- core/sync/extended.odin | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/sync/extended.odin b/core/sync/extended.odin index 8566eccc8..58344b740 100644 --- a/core/sync/extended.odin +++ b/core/sync/extended.odin @@ -222,9 +222,10 @@ thread. */ auto_reset_event_signal :: proc "contextless" (e: ^Auto_Reset_Event) { old_status := atomic_load_explicit(&e.status, .Relaxed) - new_status := old_status + 1 if old_status < 1 else 1 for { - if _, ok := atomic_compare_exchange_weak_explicit(&e.status, old_status, new_status, .Release, .Relaxed); ok { + new_status := old_status + 1 if old_status < 1 else 1 + ok: bool + if old_status, ok = atomic_compare_exchange_weak_explicit(&e.status, old_status, new_status, .Release, .Relaxed); ok { break } cpu_relax() From 461486ef6c59c866029a4f3425825775a3d2a75d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Mar 2026 13:41:27 +0000 Subject: [PATCH 643/766] Fix comments which used `///` instead of `//` --- core/simd/x86/types.odin | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/simd/x86/types.odin b/core/simd/x86/types.odin index ea0eff534..1b52f22f1 100644 --- a/core/simd/x86/types.odin +++ b/core/simd/x86/types.odin @@ -22,25 +22,25 @@ __m256bh :: #simd[16]bf16 __m512bh :: #simd[32]bf16 -/// The `__mmask64` type used in AVX-512 intrinsics, a 64-bit integer +// The `__mmask64` type used in AVX-512 intrinsics, a 64-bit integer __mmask64 :: u64 -/// The `__mmask32` type used in AVX-512 intrinsics, a 32-bit integer +// The `__mmask32` type used in AVX-512 intrinsics, a 32-bit integer __mmask32 :: u32 -/// The `__mmask16` type used in AVX-512 intrinsics, a 16-bit integer +// The `__mmask16` type used in AVX-512 intrinsics, a 16-bit integer __mmask16 :: u16 -/// The `__mmask8` type used in AVX-512 intrinsics, a 8-bit integer +// The `__mmask8` type used in AVX-512 intrinsics, a 8-bit integer __mmask8 :: u8 -/// The `_MM_CMPINT_ENUM` type used to specify comparison operations in AVX-512 intrinsics. +// The `_MM_CMPINT_ENUM` type used to specify comparison operations in AVX-512 intrinsics. _MM_CMPINT_ENUM :: i32 -/// The `MM_MANTISSA_NORM_ENUM` type used to specify mantissa normalized operations in AVX-512 intrinsics. +// The `MM_MANTISSA_NORM_ENUM` type used to specify mantissa normalized operations in AVX-512 intrinsics. _MM_MANTISSA_NORM_ENUM :: i32 -/// The `MM_MANTISSA_SIGN_ENUM` type used to specify mantissa signed operations in AVX-512 intrinsics. +// The `MM_MANTISSA_SIGN_ENUM` type used to specify mantissa signed operations in AVX-512 intrinsics. _MM_MANTISSA_SIGN_ENUM :: i32 _MM_PERM_ENUM :: i32 From b7bb7a1dc471e07a603718d7940b04ea7a1077d7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Mar 2026 14:22:36 +0000 Subject: [PATCH 644/766] Use `scope_reserve` call directly --- src/build_settings.cpp | 2 +- src/checker.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index f46b7d247..c2ef7b259 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -388,7 +388,7 @@ u64 get_feature_flag_from_name(String const &name) { } if (name == "using-stmt") { return OptInFeatureFlag_UsingStmt; - } + } if (name == "force-type-assert") { return OptInFeatureFlag_ForceTypeAssert; } diff --git a/src/checker.cpp b/src/checker.cpp index 71ccfebc4..8acc5f4ae 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -238,8 +238,7 @@ gb_internal Scope *create_scope_from_file(CheckerInfo *info, AstFile *f) { isize init_elements_capacity = gb_max(DEFAULT_SCOPE_CAPACITY, 2*f->total_file_decl_count); Scope *s = create_scope(info, f->pkg->scope); - string_map_init(&s->elements, init_elements_capacity); - + scope_reserve(s, init_elements_capacity); s->flags |= ScopeFlag_File; s->file = f; From f1dbe9c242b44e02d8420b06486a7c061181efe9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Mar 2026 16:46:33 +0000 Subject: [PATCH 645/766] `[dynamic; N]T` proof of concept: fixed capacity dynamic array (akin to `small_array.Small_Array(N, T)`) --- base/runtime/core.odin | 14 ++++ base/runtime/core_builtin.odin | 80 ++++++++++++++++++ base/runtime/print.odin | 12 +++ core/fmt/fmt.odin | 15 ++++ core/odin/ast/ast.odin | 12 +++ core/odin/ast/clone.odin | 6 ++ core/odin/ast/walk.odin | 6 ++ core/odin/parser/parser.odin | 16 ++++ core/reflect/reflect.odin | 128 +++++++++++++++++------------ core/reflect/types.odin | 11 +++ src/check_builtin.cpp | 11 +++ src/check_expr.cpp | 32 ++++++++ src/check_type.cpp | 25 ++++++ src/checker.cpp | 11 +++ src/llvm_backend.hpp | 1 + src/llvm_backend_debug.cpp | 64 +++++++++++++++ src/llvm_backend_expr.cpp | 44 ++++++++++ src/llvm_backend_general.cpp | 20 +++++ src/llvm_backend_proc.cpp | 4 + src/llvm_backend_type.cpp | 16 ++++ src/llvm_backend_utility.cpp | 10 +++ src/name_canonicalization.cpp | 4 + src/parser.cpp | 41 +++++++++- src/parser.hpp | 10 ++- src/types.cpp | 145 ++++++++++++++++++++++++++++++++- 25 files changed, 677 insertions(+), 61 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 983f104e3..52993286a 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -206,6 +206,14 @@ Type_Info_Bit_Field :: struct { field_count: int, } +Type_Info_Fixed_Capacity_Dynamic_Array :: struct { + elem: ^Type_Info, + elem_size: int, + capacity: int, + len_offset: uintptr, +} + + Type_Info_Flag :: enum u8 { Comparable = 0, Simple_Compare = 1, @@ -246,6 +254,7 @@ Type_Info :: struct { Type_Info_Matrix, Type_Info_Soa_Pointer, Type_Info_Bit_Field, + Type_Info_Fixed_Capacity_Dynamic_Array, }, } @@ -425,6 +434,11 @@ Raw_Dynamic_Array :: struct { allocator: Allocator, } +Raw_Fixed_Capacity_Dynamic_Array :: struct($Capacity: uint, $T: typeid) { + data: [Capacity]T, + len: int, +} + // The raw, type-erased representation of a map. // // 32-bytes on 64-bit diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 974b2f048..7a1a38f9a 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -254,6 +254,7 @@ non_zero_reserve :: proc{ @builtin resize :: proc{ resize_dynamic_array, + resize_fixed_capacity_dynamic_array, resize_soa, } @@ -261,6 +262,7 @@ resize :: proc{ @builtin non_zero_resize :: proc{ non_zero_resize_dynamic_array, + non_zero_resize_fixed_capacity_dynamic_array, non_zero_resize_soa, } @@ -686,6 +688,43 @@ append_string :: proc(array: ^$T/[dynamic]$E/u8, args: ..string, loc := #caller_ return } + +// `append_fixed_capacity_elem` appends an element to the end of a fixed capacity dynamic array. Returns 0 on failure +@builtin +append_fixed_capacity_elem :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast arg: E) -> (n: int) { + Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) + + if (^Raw)(array).len >= N { + return 0 + } + + when size_of(E) != 0 { + #no_bounds_check (^Raw)(array).data[(^Raw)(array).len] = arg + } + (^Raw)(array).len += 1 + return 1 +} + + +// `append_fixed_capacity_elem` appends an element to the end of a fixed capacity dynamic array. Returns 0 on failure +@builtin +append_fixed_capacity_elems :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast args: ..E) -> (n: int) { + Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) + raw := (^Raw)(array) + + n = min(N - len(args), len(args)) + + when size_of(E) != 0 { + for i in 0.. bool { + if array == nil { + return false + } + raw := (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array) + if raw.len < length { + size_of_elem :: size_of(E) + + num_reused := min(N, length) - a.len + intrinsics.mem_zero(([^]byte)(a.data)[a.len*size_of_elem:], num_reused*size_of_elem) + } + new_length := clamp(length, 0, N) + raw.len = new_length + return true +} + +// `non_zero_resize_fixed_capacity_dynamic_array` will try to resize memory of a passed fixed capacity dynamic array or map to the requested element count (setting the `len`, and possibly `cap`). +// +// Note: Prefer the procedure group `resize` +@builtin +non_zero_resize_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int length: int) -> bool { + if array == nil { + return false + } + raw := (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array) + new_length := clamp(length, 0, N) + raw.len = new_length + return true +} + // Shrinks the capacity of a dynamic array down to the current length, or the given capacity. // // If `new_cap` is negative, then `len(array)` is used. diff --git a/base/runtime/print.odin b/base/runtime/print.odin index 6569ece6c..ad205d887 100644 --- a/base/runtime/print.odin +++ b/base/runtime/print.odin @@ -392,6 +392,12 @@ print_type :: #force_no_inline proc "contextless" (ti: ^Type_Info) { print_string("[]") print_type(info.elem) + case Type_Info_Fixed_Capacity_Dynamic_Array: + print_string("[dynamic; ") + print_u64(u64(info.capacity)) + print_string("]") + print_type(info.elem) + case Type_Info_Map: print_string("map[") print_type(info.key) @@ -807,6 +813,12 @@ write_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, t write_string (i, buf, "[]") or_return write_write_type(i, buf, info.elem) or_return + case Type_Info_Fixed_Capacity_Dynamic_Array: + write_string (i, buf, "[dynamic; ") or_return + write_u64 (i, buf, u64(info.capacity)) or_return + write_string (i, buf, "]") or_return + write_write_type(i, buf, info.elem) or_return + case Type_Info_Map: write_string (i, buf, "map[") or_return write_write_type(i, buf, info.key) or_return diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index f1601f278..4ecb19c21 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -3246,6 +3246,21 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) { } fmt_array(fi, ptr, n, info.elem_size, info.elem, verb) + + case runtime.Type_Info_Fixed_Capacity_Dynamic_Array: + n := (^int)(uintptr(v.data) + info.len_offset)^ + + ptr := v.data // data is stored at the start + if ol, ok := fi.optional_len.?; ok { + fi.optional_len = nil + n = min(n, ol) + } else if fi.use_nul_termination { + fi.use_nul_termination = false + fmt_array_nul_terminated(fi, ptr, n, info.elem_size, info.elem, verb) + return + } + fmt_array(fi, ptr, n, info.elem_size, info.elem, verb) + case runtime.Type_Info_Simd_Vector: io.write_byte(fi.writer, '<', &fi.n) defer io.write_byte(fi.writer, '>', &fi.n) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 2cee6e385..8f5f466cb 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -786,6 +786,16 @@ Dynamic_Array_Type :: struct { elem: ^Expr, } +Fixed_Capacity_Dynamic_Array_Type :: struct { + using node: Expr, + tag: ^Expr, // possibly nil + open: tokenizer.Pos, + dynamic_pos: tokenizer.Pos, + capacity: ^Expr, + close: tokenizer.Pos, + elem: ^Expr, +} + Struct_Type :: struct { using node: Expr, tok_pos: tokenizer.Pos, @@ -931,6 +941,7 @@ Any_Node :: union { ^Multi_Pointer_Type, ^Array_Type, ^Dynamic_Array_Type, + ^Fixed_Capacity_Dynamic_Array_Type, ^Struct_Type, ^Union_Type, ^Enum_Type, @@ -1017,6 +1028,7 @@ Any_Expr :: union { ^Multi_Pointer_Type, ^Array_Type, ^Dynamic_Array_Type, + ^Fixed_Capacity_Dynamic_Array_Type, ^Struct_Type, ^Union_Type, ^Enum_Type, diff --git a/core/odin/ast/clone.odin b/core/odin/ast/clone.odin index df3e1df0d..163485840 100644 --- a/core/odin/ast/clone.odin +++ b/core/odin/ast/clone.odin @@ -311,10 +311,16 @@ clone_node :: proc(node: ^Node) -> ^Node { case ^Multi_Pointer_Type: r.elem = clone(r.elem) case ^Array_Type: + r.tag = clone(r.tag) r.len = clone(r.len) r.elem = clone(r.elem) case ^Dynamic_Array_Type: + r.tag = clone(r.tag) r.elem = clone(r.elem) + case ^Fixed_Capacity_Dynamic_Array_Type: + r.tag = clone(r.tag) + r.capacity = clone(r.capacity) + r.elem = clone(r.elem) case ^Struct_Type: r.poly_params = auto_cast clone(r.poly_params) r.align = clone(r.align) diff --git a/core/odin/ast/walk.odin b/core/odin/ast/walk.odin index 5b9340c62..d3824c213 100644 --- a/core/odin/ast/walk.odin +++ b/core/odin/ast/walk.odin @@ -380,6 +380,12 @@ walk :: proc(v: ^Visitor, node: ^Node) { walk(v, n.tag) } walk(v, n.elem) + case ^Fixed_Capacity_Dynamic_Array_Type: + if n.tag != nil { + walk(v, n.tag) + } + walk(v, n.capacity) + walk(v, n.elem) case ^Struct_Type: if n.poly_params != nil { walk(v, n.poly_params) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 643673c69..0f3ac78b2 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2389,6 +2389,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { case ^ast.Array_Type: t.tag = bd case ^ast.Dynamic_Array_Type: t.tag = bd case ^ast.Pointer_Type: t.tag = bd + case ^ast.Fixed_Capacity_Dynamic_Array_Type: t.tag = bd case: error(p, original_type.pos, "expected an array or pointer type after #%s", name.text) } @@ -2626,6 +2627,20 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { return t case .Dynamic: tok := expect_token(p, .Dynamic) + if allow_token(p, .Semicolon) { + capacity := parse_expr(p, false) + close := expect_token(p, .Close_Bracket) + elem := parse_type(p) + + da := ast.new(ast.Fixed_Capacity_Dynamic_Array_Type, open.pos, elem) + da.open = open.pos + da.dynamic_pos = tok.pos + da.capacity = capacity + da.close = close.pos + da.elem = elem + return da + } + close := expect_token(p, .Close_Bracket) elem := parse_type(p) da := ast.new(ast.Dynamic_Array_Type, open.pos, elem) @@ -3107,6 +3122,7 @@ is_literal_type :: proc(expr: ^ast.Expr) -> bool { ^ast.Union_Type, ^ast.Enum_Type, ^ast.Dynamic_Array_Type, + ^ast.Fixed_Capacity_Dynamic_Array_Type, ^ast.Map_Type, ^ast.Bit_Set_Type, ^ast.Matrix_Type, diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index b39c6ac6b..924120464 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -6,33 +6,34 @@ _ :: intrinsics Type_Info :: runtime.Type_Info -Type_Info_Named :: runtime.Type_Info_Named -Type_Info_Integer :: runtime.Type_Info_Integer -Type_Info_Rune :: runtime.Type_Info_Rune -Type_Info_Float :: runtime.Type_Info_Float -Type_Info_Complex :: runtime.Type_Info_Complex -Type_Info_Quaternion :: runtime.Type_Info_Quaternion -Type_Info_String :: runtime.Type_Info_String -Type_Info_Boolean :: runtime.Type_Info_Boolean -Type_Info_Any :: runtime.Type_Info_Any -Type_Info_Type_Id :: runtime.Type_Info_Type_Id -Type_Info_Pointer :: runtime.Type_Info_Pointer -Type_Info_Multi_Pointer :: runtime.Type_Info_Multi_Pointer -Type_Info_Procedure :: runtime.Type_Info_Procedure -Type_Info_Array :: runtime.Type_Info_Array -Type_Info_Enumerated_Array :: runtime.Type_Info_Enumerated_Array -Type_Info_Dynamic_Array :: runtime.Type_Info_Dynamic_Array -Type_Info_Slice :: runtime.Type_Info_Slice -Type_Info_Parameters :: runtime.Type_Info_Parameters -Type_Info_Struct :: runtime.Type_Info_Struct -Type_Info_Union :: runtime.Type_Info_Union -Type_Info_Enum :: runtime.Type_Info_Enum -Type_Info_Map :: runtime.Type_Info_Map -Type_Info_Bit_Set :: runtime.Type_Info_Bit_Set -Type_Info_Simd_Vector :: runtime.Type_Info_Simd_Vector -Type_Info_Matrix :: runtime.Type_Info_Matrix -Type_Info_Soa_Pointer :: runtime.Type_Info_Soa_Pointer -Type_Info_Bit_Field :: runtime.Type_Info_Bit_Field +Type_Info_Named :: runtime.Type_Info_Named +Type_Info_Integer :: runtime.Type_Info_Integer +Type_Info_Rune :: runtime.Type_Info_Rune +Type_Info_Float :: runtime.Type_Info_Float +Type_Info_Complex :: runtime.Type_Info_Complex +Type_Info_Quaternion :: runtime.Type_Info_Quaternion +Type_Info_String :: runtime.Type_Info_String +Type_Info_Boolean :: runtime.Type_Info_Boolean +Type_Info_Any :: runtime.Type_Info_Any +Type_Info_Type_Id :: runtime.Type_Info_Type_Id +Type_Info_Pointer :: runtime.Type_Info_Pointer +Type_Info_Multi_Pointer :: runtime.Type_Info_Multi_Pointer +Type_Info_Procedure :: runtime.Type_Info_Procedure +Type_Info_Array :: runtime.Type_Info_Array +Type_Info_Enumerated_Array :: runtime.Type_Info_Enumerated_Array +Type_Info_Dynamic_Array :: runtime.Type_Info_Dynamic_Array +Type_Info_Slice :: runtime.Type_Info_Slice +Type_Info_Parameters :: runtime.Type_Info_Parameters +Type_Info_Struct :: runtime.Type_Info_Struct +Type_Info_Union :: runtime.Type_Info_Union +Type_Info_Enum :: runtime.Type_Info_Enum +Type_Info_Map :: runtime.Type_Info_Map +Type_Info_Bit_Set :: runtime.Type_Info_Bit_Set +Type_Info_Simd_Vector :: runtime.Type_Info_Simd_Vector +Type_Info_Matrix :: runtime.Type_Info_Matrix +Type_Info_Soa_Pointer :: runtime.Type_Info_Soa_Pointer +Type_Info_Bit_Field :: runtime.Type_Info_Bit_Field +Type_Info_Fixed_Capacity_Dynamic_Array :: runtime.Type_Info_Fixed_Capacity_Dynamic_Array Type_Info_Enum_Value :: runtime.Type_Info_Enum_Value @@ -67,6 +68,7 @@ Type_Kind :: enum { Matrix, Soa_Pointer, Bit_Field, + Fixed_Capacity_Dynamic_Array, } @@ -76,33 +78,34 @@ type_kind :: proc(T: typeid) -> Type_Kind { ti := type_info_of(T) if ti != nil { switch _ in ti.variant { - case Type_Info_Named: return .Named - case Type_Info_Integer: return .Integer - case Type_Info_Rune: return .Rune - case Type_Info_Float: return .Float - case Type_Info_Complex: return .Complex - case Type_Info_Quaternion: return .Quaternion - case Type_Info_String: return .String - case Type_Info_Boolean: return .Boolean - case Type_Info_Any: return .Any - case Type_Info_Type_Id: return .Type_Id - case Type_Info_Pointer: return .Pointer - case Type_Info_Multi_Pointer: return .Multi_Pointer - case Type_Info_Procedure: return .Procedure - case Type_Info_Array: return .Array - case Type_Info_Enumerated_Array: return .Enumerated_Array - case Type_Info_Dynamic_Array: return .Dynamic_Array - case Type_Info_Slice: return .Slice - case Type_Info_Parameters: return .Parameters - case Type_Info_Struct: return .Struct - case Type_Info_Union: return .Union - case Type_Info_Enum: return .Enum - case Type_Info_Map: return .Map - case Type_Info_Bit_Set: return .Bit_Set - case Type_Info_Simd_Vector: return .Simd_Vector - case Type_Info_Matrix: return .Matrix - case Type_Info_Soa_Pointer: return .Soa_Pointer - case Type_Info_Bit_Field: return .Bit_Field + case Type_Info_Named: return .Named + case Type_Info_Integer: return .Integer + case Type_Info_Rune: return .Rune + case Type_Info_Float: return .Float + case Type_Info_Complex: return .Complex + case Type_Info_Quaternion: return .Quaternion + case Type_Info_String: return .String + case Type_Info_Boolean: return .Boolean + case Type_Info_Any: return .Any + case Type_Info_Type_Id: return .Type_Id + case Type_Info_Pointer: return .Pointer + case Type_Info_Multi_Pointer: return .Multi_Pointer + case Type_Info_Procedure: return .Procedure + case Type_Info_Array: return .Array + case Type_Info_Enumerated_Array: return .Enumerated_Array + case Type_Info_Dynamic_Array: return .Dynamic_Array + case Type_Info_Slice: return .Slice + case Type_Info_Parameters: return .Parameters + case Type_Info_Struct: return .Struct + case Type_Info_Union: return .Union + case Type_Info_Enum: return .Enum + case Type_Info_Map: return .Map + case Type_Info_Bit_Set: return .Bit_Set + case Type_Info_Simd_Vector: return .Simd_Vector + case Type_Info_Matrix: return .Matrix + case Type_Info_Soa_Pointer: return .Soa_Pointer + case Type_Info_Bit_Field: return .Bit_Field + case Type_Info_Fixed_Capacity_Dynamic_Array: return .Fixed_Capacity_Dynamic_Array } } @@ -1919,6 +1922,23 @@ equal :: proc(a, b: any, including_indirect_array_recursion := false, recursion_ } } return true + case Type_Info_Fixed_Capacity_Dynamic_Array: + a_count := (^int)(uintptr(a.data) + v.len_offset)^ + b_count := (^int)(uintptr(b.data) + v.len_offset)^ + if a_count != b_count { + return false + } + + for i in 0.. bool { y := b.variant.(Type_Info_Slice) or_return return are_types_identical(x.elem, y.elem) + case Type_Info_Fixed_Capacity_Dynamic_Array: + y := b.variant.(Type_Info_Fixed_Capacity_Dynamic_Array) or_return + if x.capacity != y.capacity { return false } + return are_types_identical(x.elem, y.elem) + case Type_Info_Parameters: y := b.variant.(Type_Info_Parameters) or_return if len(x.types) != len(y.types) { return false } @@ -661,6 +666,12 @@ write_type_writer :: #force_no_inline proc(w: io.Writer, ti: ^Type_Info, n_writt io.write_string(w, "[]", &n) or_return write_type(w, info.elem, &n) or_return + case Type_Info_Fixed_Capacity_Dynamic_Array: + io.write_string(w, "[dynamic;", &n) or_return + io.write_i64(w, i64(info.capacity), 10, &n) or_return + io.write_string(w, "]", &n) or_return + write_type(w, info.elem, &n) or_return + case Type_Info_Map: io.write_string(w, "map[", &n) or_return write_type(w, info.key, &n) or_return diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 1a094c1f0..02826a209 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -2634,6 +2634,16 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As mode = Addressing_Constant; value = exact_value_i64(at->Array.count); type = t_untyped_integer; + } else if (is_type_fixed_capacity_dynamic_array(op_type)) { + Type *at = core_type(op_type); + if (id == BuiltinProc_cap) { + mode = Addressing_Constant; + value = exact_value_i64(at->FixedCapacityDynamicArray.capacity); + type = t_untyped_integer; + } else { + GB_ASSERT(id == BuiltinProc_len); + mode = Addressing_Value; + } } else if (is_type_enumerated_array(op_type) && id == BuiltinProc_len) { Type *at = core_type(op_type); mode = Addressing_Constant; @@ -5167,6 +5177,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As case Type_Array: case Type_EnumeratedArray: case Type_SimdVector: + case Type_FixedCapacityDynamicArray: operand->type = alloc_type_multi_pointer(base_array_type(base)); break; case Type_Matrix: diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 80df35edc..9f66f8fec 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1490,6 +1490,22 @@ gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, T return is_polymorphic_type_assignable(c, poly->DynamicArray.elem, source->DynamicArray.elem, true, modify_type); } return false; + + case Type_FixedCapacityDynamicArray: + if (source->kind == Type_FixedCapacityDynamicArray) { + if (poly->FixedCapacityDynamicArray.generic_capacity != nullptr) { + if (!polymorphic_assign_index(&poly->FixedCapacityDynamicArray.generic_capacity, + &poly->FixedCapacityDynamicArray.capacity, + source->FixedCapacityDynamicArray.capacity)) { + return false; + } + } + if (poly->FixedCapacityDynamicArray.capacity == source->FixedCapacityDynamicArray.capacity) { + return is_polymorphic_type_assignable(c, poly->FixedCapacityDynamicArray.elem, source->FixedCapacityDynamicArray.elem, true, modify_type); + } + } + return false; + case Type_Slice: if (source->kind == Type_Slice) { return is_polymorphic_type_assignable(c, poly->Slice.elem, source->Slice.elem, true, modify_type); @@ -8761,6 +8777,14 @@ gb_internal bool check_set_index_data(Operand *o, Type *t, bool indirection, i64 o->mode = Addressing_Variable; } return true; + + case Type_FixedCapacityDynamicArray: + o->type = t->FixedCapacityDynamicArray.elem; + if (o->mode != Addressing_Constant) { + o->mode = Addressing_Variable; + } + return true; + case Type_Struct: if (t->Struct.soa_kind != StructSoa_None) { if (t->Struct.soa_kind == StructSoa_Fixed) { @@ -11410,6 +11434,8 @@ gb_internal ExprKind check_index_expr(CheckerContext *c, Operand *o, Ast *node, // Okay } else if (is_type_enumerated_array(t)) { // Okay + } else if (is_type_fixed_capacity_dynamic_array(t)) { + // Okay } else if (is_type_string(t)) { // Okay } else if (is_type_matrix(t)) { @@ -11556,6 +11582,11 @@ gb_internal ExprKind check_slice_expr(CheckerContext *c, Operand *o, Ast *node, o->type = alloc_type_slice(t->DynamicArray.elem); break; + case Type_FixedCapacityDynamicArray: + valid = true; + o->type = alloc_type_slice(t->FixedCapacityDynamicArray.elem); + break; + case Type_Struct: if (is_type_soa_struct(t)) { valid = true; @@ -12110,6 +12141,7 @@ gb_internal ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast case Ast_MultiPointerType: case Ast_ArrayType: case Ast_DynamicArrayType: + case Ast_FixedCapacityDynamicArrayType: case Ast_StructType: case Ast_UnionType: case Ast_EnumType: diff --git a/src/check_type.cpp b/src/check_type.cpp index 82e70dd33..5cfc24981 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -3642,6 +3642,31 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T return true; case_end; + case_ast_node(dat, FixedCapacityDynamicArrayType, e); + Operand o = {}; + i64 capacity = check_array_count(ctx, &o, dat->capacity); + Type *generic_type = nullptr; + if (o.mode == Addressing_Type && o.type->kind == Type_Generic) { + generic_type = o.type; + } + + if (capacity < 0) { + error(dat->capacity, "? can only be used in conjunction with compound literals of fixed-length arrays"); + capacity = 0; + } + + + Type *elem = check_type(ctx, dat->elem); + if (dat->tag != nullptr) { + GB_ASSERT(dat->tag->kind == Ast_BasicDirective); + String name = dat->tag->BasicDirective.name.string; + error(dat->tag, "Invalid tag applied to fixed capacity dynamic array, got #%.*s", LIT(name)); + } + *type = alloc_type_fixed_capacity_dynamic_array(elem, capacity, generic_type); + set_base_type(named_type, *type); + return true; + case_end; + case_ast_node(st, StructType, e); CheckerContext c = *ctx; c.in_polymorphic_specialization = false; diff --git a/src/checker.cpp b/src/checker.cpp index 8acc5f4ae..2ac5aa62d 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2276,6 +2276,11 @@ gb_internal void add_type_info_type_internal(CheckerContext *c, Type *t) { add_type_info_type_internal(c, t_int); break; + case Type_FixedCapacityDynamicArray: + add_type_info_type_internal(c, bt->FixedCapacityDynamicArray.elem); + add_type_info_type_internal(c, t_allocator); + break; + case Type_Enum: add_type_info_type_internal(c, bt->Enum.base_type); break; @@ -2514,6 +2519,10 @@ gb_internal void add_min_dep_type_info(Checker *c, Type *t) { add_min_dep_type_info(c, t_int); break; + case Type_FixedCapacityDynamicArray: + add_min_dep_type_info(c, bt->FixedCapacityDynamicArray.elem); + add_min_dep_type_info(c, t_int); + case Type_Enum: add_min_dep_type_info(c, bt->Enum.base_type); break; @@ -3350,6 +3359,7 @@ gb_internal void init_core_type_info(Checker *c) { t_type_info_matrix = find_core_type(c, str_lit("Type_Info_Matrix")); t_type_info_soa_pointer = find_core_type(c, str_lit("Type_Info_Soa_Pointer")); t_type_info_bit_field = find_core_type(c, str_lit("Type_Info_Bit_Field")); + t_type_info_fixed_capacity_dynamic_array = find_core_type(c, str_lit("Type_Info_Fixed_Capacity_Dynamic_Array")); t_type_info_named_ptr = alloc_type_pointer(t_type_info_named); t_type_info_integer_ptr = alloc_type_pointer(t_type_info_integer); @@ -3378,6 +3388,7 @@ gb_internal void init_core_type_info(Checker *c) { t_type_info_matrix_ptr = alloc_type_pointer(t_type_info_matrix); t_type_info_soa_pointer_ptr = alloc_type_pointer(t_type_info_soa_pointer); t_type_info_bit_field_ptr = alloc_type_pointer(t_type_info_bit_field); + t_type_info_fixed_capacity_dynamic_array_ptr = alloc_type_pointer(t_type_info_fixed_capacity_dynamic_array); } gb_internal void init_mem_allocator(Checker *c) { diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 0f199907d..48c5be546 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -533,6 +533,7 @@ gb_internal lbValue lb_dynamic_array_elem(lbProcedure *p, lbValue da); gb_internal lbValue lb_dynamic_array_len(lbProcedure *p, lbValue da); gb_internal lbValue lb_dynamic_array_cap(lbProcedure *p, lbValue da); gb_internal lbValue lb_dynamic_array_allocator(lbProcedure *p, lbValue da); +gb_internal lbValue lb_fixed_capacity_dynamic_array_len(lbProcedure *p, lbValue da); gb_internal lbValue lb_map_len(lbProcedure *p, lbValue value); gb_internal lbValue lb_map_cap(lbProcedure *p, lbValue value); gb_internal lbValue lb_soa_struct_len(lbProcedure *p, lbValue value); diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index e9b0f72cb..4b09d3d5e 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -409,6 +409,69 @@ gb_internal LLVMMetadataRef lb_debug_dynamic_array(lbModule *m, Type *type, Stri return final_decl; } +gb_internal LLVMMetadataRef lb_debug_fixed_capacity_dynamic_array(lbModule *m, Type *type, String name, LLVMMetadataRef scope, LLVMMetadataRef file, unsigned line) { + Type *bt = base_type(type); + GB_ASSERT(bt->kind == Type_FixedCapacityDynamicArray); + + unsigned const int_bits = cast(unsigned)(8*build_context.int_size); + + u64 size_in_bits = 8*type_size_of(bt); + u32 align_in_bits = 8*cast(u32)type_align_of(bt); + + LLVMMetadataRef temp_forward_decl = LLVMDIBuilderCreateReplaceableCompositeType( + m->debug_builder, DW_TAG_structure_type, + cast(char const *)name.text, cast(size_t)name.len, + scope, file, line, 0, size_in_bits, align_in_bits, LLVMDIFlagZero, "", 0 + ); + + lb_set_llvm_metadata(m, type, temp_forward_decl); + + unsigned element_count = 2; + LLVMMetadataRef elements[2]; + + // LLVMMetadataRef member_scope = lb_get_llvm_metadata(m, bt->DynamicArray.scope); + LLVMMetadataRef member_scope = nullptr; + + Type *elem_type = alloc_type_array(bt->FixedCapacityDynamicArray.elem, bt->FixedCapacityDynamicArray.capacity); + elements[0] = LLVMDIBuilderCreateMemberType( + m->debug_builder, member_scope, + "data", 4, + file, line, + 8*cast(u64)type_size_of(elem_type), 8*cast(u32)type_align_of(elem_type), + 0, + LLVMDIFlagZero, lb_debug_type(m, elem_type) + ); + + i64 len_offset = type_offset_of(bt, 1); + + elements[1] = LLVMDIBuilderCreateMemberType( + m->debug_builder, member_scope, + "len", 3, + file, line, + int_bits, int_bits, + len_offset, + LLVMDIFlagZero, lb_debug_type(m, t_int) + ); + + LLVMMetadataRef final_decl = LLVMDIBuilderCreateStructType( + m->debug_builder, scope, + cast(char const *)name.text, cast(size_t)name.len, + file, line, + size_in_bits, align_in_bits, + LLVMDIFlagZero, + nullptr, + elements, element_count, + 0, + nullptr, + "", 0 + ); + + LLVMMetadataReplaceAllUsesWith(temp_forward_decl, final_decl); + lb_set_llvm_metadata(m, type, final_decl); + return final_decl; +} + + gb_internal LLVMMetadataRef lb_debug_union(lbModule *m, Type *type, String name, LLVMMetadataRef scope, LLVMMetadataRef file, unsigned line) { Type *bt = base_type(type); GB_ASSERT(bt->kind == Type_Union); @@ -899,6 +962,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { case Type_BitSet: return lb_debug_bitset( m, type, type_to_canonical_string(temporary_allocator(), type), nullptr, nullptr, 0); case Type_Enum: return lb_debug_enum( m, type, type_to_canonical_string(temporary_allocator(), type), nullptr, nullptr, 0); case Type_BitField: return lb_debug_bitfield( m, type, type_to_canonical_string(temporary_allocator(), type), nullptr, nullptr, 0); + case Type_FixedCapacityDynamicArray: return lb_debug_fixed_capacity_dynamic_array(m, type, type_to_canonical_string(temporary_allocator(), type), nullptr, nullptr, 0); case Type_Tuple: if (type->Tuple.variables.count == 1) { diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 1685f9627..e352a33e9 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -4700,6 +4700,25 @@ gb_internal lbAddr lb_build_addr_index_expr(lbProcedure *p, Ast *expr) { return lb_addr(elem); } + case Type_FixedCapacityDynamicArray: { + lbValue array = {}; + array = lb_build_addr_ptr(p, ie->expr); + if (deref) { + array = lb_emit_load(p, array); + } + lbValue index = lb_build_expr(p, ie->index); + index = lb_emit_conv(p, index, t_int); + + lbValue array_ptr = lb_emit_struct_ep(p, array, 0); + lbValue elem = lb_emit_array_ep(p, array_ptr, index); + + auto index_tv = type_and_value_of_expr(ie->index); + lbValue len = lb_emit_struct_ep(p, array, 1); + len = lb_emit_load(p, len); + lb_emit_bounds_check(p, ast_token(ie->index), index, len); + return lb_addr(elem); + } + case Type_EnumeratedArray: { lbValue array = {}; array = lb_build_addr_ptr(p, ie->expr); @@ -4943,6 +4962,31 @@ gb_internal lbAddr lb_build_addr_slice_expr(lbProcedure *p, Ast *expr) { return slice; } + case Type_FixedCapacityDynamicArray: { + Type *elem_type = type->FixedCapacityDynamicArray.elem; + Type *slice_type = alloc_type_slice(elem_type); + + lbValue len = lb_fixed_capacity_dynamic_array_len(p, base); + if (high.value == nullptr) high = len; + + bool low_const = type_and_value_of_expr(se->low).mode == Addressing_Constant; + bool high_const = type_and_value_of_expr(se->high).mode == Addressing_Constant; + + if (!low_const || !high_const) { + if (!no_indices) { + lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); + } + } + lbValue data_ptr = lb_addr_get_ptr(p, addr); + lbValue array_ptr = lb_emit_struct_ep(p, data_ptr, 0); + lbValue elem = lb_emit_ptr_offset(p, lb_array_elem(p, array_ptr), low); + lbValue new_len = lb_emit_arith(p, Token_Sub, high, low, t_int); + + lbAddr slice = lb_add_local_generated(p, slice_type, false); + lb_fill_slice(p, slice, elem, new_len); + return slice; + } + case Type_Basic: { if (is_type_string16(type)) { GB_ASSERT_MSG(are_types_identical(type, t_string16), "got %s", type_to_string(type)); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 572e3990c..32a669235 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -2234,6 +2234,26 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) { } break; + case Type_FixedCapacityDynamicArray: + { + unsigned field_count = 0; + + LLVMTypeRef fields[3] = {}; + m->internal_type_level += 1; + fields[field_count++] = llvm_array_type(lb_type(m, type->FixedCapacityDynamicArray.elem), type->FixedCapacityDynamicArray.capacity); + m->internal_type_level -= 1; + + gb_unused(type_size_of(type)); + if (type->FixedCapacityDynamicArray.padding_needed > 0) { + fields[field_count++] = lb_type_padding_filler(m, type->FixedCapacityDynamicArray.padding_needed, 1); // padding + } + + fields[field_count++] = lb_type(m, t_int); // len + + return LLVMStructTypeInContext(ctx, fields, field_count, false); + } + break; + case Type_Map: init_map_internal_debug_types(type); GB_ASSERT(t_raw_map != nullptr); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index f72726af1..840bbfb19 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2323,6 +2323,8 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu return lb_slice_len(p, v); } else if (is_type_dynamic_array(t)) { return lb_dynamic_array_len(p, v); + } else if (is_type_fixed_capacity_dynamic_array(t)) { + return lb_fixed_capacity_dynamic_array_len(p, v); } else if (is_type_map(t)) { return lb_map_len(p, v); } else if (is_type_soa_struct(t)) { @@ -2344,6 +2346,8 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu GB_PANIC("Unreachable"); } else if (is_type_array(t)) { GB_PANIC("Array lengths are constant"); + } else if (is_type_fixed_capacity_dynamic_array(t)) { + GB_PANIC("Fixed capacity dynamic array capacities are constant"); } else if (is_type_slice(t)) { return lb_slice_len(p, v); } else if (is_type_dynamic_array(t)) { diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 89c671f7d..82156d32a 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -69,6 +69,7 @@ gb_internal u64 lb_typeid_kind(lbModule *m, Type *type, u64 id=0) { case Type_SimdVector: kind = Typeid_Simd_Vector; break; case Type_SoaPointer: kind = Typeid_SoaPointer; break; case Type_BitField: kind = Typeid_Bit_Field; break; + case Type_FixedCapacityDynamicArray: kind = Typeid_Fixed_Capacity_Dynamic_Array; break; } return kind; @@ -644,6 +645,21 @@ gb_internal void lb_setup_type_info_data_giant_array(lbModule *m, i64 global_typ variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); break; } + case Type_FixedCapacityDynamicArray: { + tag_type = t_type_info_fixed_capacity_dynamic_array; + + i64 len_offset = type_offset_of(t, 1); + + LLVMValueRef vals[4] = { + get_type_info_ptr(m, t->FixedCapacityDynamicArray.elem), + lb_const_int(m, t_int, type_size_of(t->FixedCapacityDynamicArray.elem)).value, + lb_const_int(m, t_int, t->FixedCapacityDynamicArray.capacity).value, + lb_const_int(m, t_uintptr, len_offset).value, + }; + + variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); + break; + } case Type_Slice: { tag_type = t_type_info_slice; diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 8a7bced59..b4ab5e4d6 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1234,6 +1234,11 @@ gb_internal lbValue lb_emit_struct_ep(lbProcedure *p, lbValue s, i32 index) { case 2: result_type = t_int; break; case 3: result_type = t_allocator; break; } + } else if (is_type_fixed_capacity_dynamic_array(t)) { + switch (index) { + case 0: result_type = alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity); break; + case 1: result_type = t_int; break; + } } else if (is_type_map(t)) { init_map_internal_debug_types(t); Type *itp = alloc_type_pointer(t_raw_map); @@ -1749,6 +1754,11 @@ gb_internal lbValue lb_dynamic_array_cap(lbProcedure *p, lbValue da) { return lb_emit_struct_ev(p, da, 2); } +gb_internal lbValue lb_fixed_capacity_dynamic_array_len(lbProcedure *p, lbValue da) { + GB_ASSERT(is_type_fixed_capacity_dynamic_array(da.type)); + return lb_emit_struct_ev(p, da, 1); +} + gb_internal lbValue lb_map_len(lbProcedure *p, lbValue value) { GB_ASSERT_MSG(is_type_map(value.type) || are_types_identical(value.type, t_raw_map), "%s", type_to_string(value.type)); lbValue len = lb_emit_struct_ev(p, value, 1); diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index efe115c89..6d5f54cf8 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -788,6 +788,10 @@ gb_internal void write_type_to_canonical_string(TypeWriter *w, Type *type) { type_writer_appendc(w, "[dynamic]"); write_type_to_canonical_string(w, type->DynamicArray.elem); return; + case Type_FixedCapacityDynamicArray: + type_writer_append_fmt(w, "[dynamic;%lld]", cast(long long)type->FixedCapacityDynamicArray.capacity); + write_type_to_canonical_string(w, type->FixedCapacityDynamicArray.elem); + return; case Type_SimdVector: type_writer_append_fmt(w, "#simd[%lld]", cast(long long)type->SimdVector.count); write_type_to_canonical_string(w, type->SimdVector.elem); diff --git a/src/parser.cpp b/src/parser.cpp index ca81159b4..b302c935d 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -456,6 +456,12 @@ gb_internal Ast *clone_ast(Ast *node, AstFile *f) { break; case Ast_DynamicArrayType: n->DynamicArrayType.elem = clone_ast(n->DynamicArrayType.elem, f); + n->DynamicArrayType.tag = clone_ast(n->DynamicArrayType.tag, f); + break; + case Ast_FixedCapacityDynamicArrayType: + n->FixedCapacityDynamicArrayType.elem = clone_ast(n->FixedCapacityDynamicArrayType.elem, f); + n->FixedCapacityDynamicArrayType.capacity = clone_ast(n->FixedCapacityDynamicArrayType.capacity, f); + n->FixedCapacityDynamicArrayType.tag = clone_ast(n->FixedCapacityDynamicArrayType.tag, f); break; case Ast_StructType: n->StructType.fields = clone_ast_array(n->StructType.fields, f); @@ -1254,6 +1260,14 @@ gb_internal Ast *ast_dynamic_array_type(AstFile *f, Token token, Ast *elem) { return result; } +gb_internal Ast *ast_fixed_capacity_dynamic_array_type(AstFile *f, Token token, Ast *capacity, Ast *elem) { + Ast *result = alloc_ast_node(f, Ast_FixedCapacityDynamicArrayType); + result->FixedCapacityDynamicArrayType.token = token; + result->FixedCapacityDynamicArrayType.capacity = capacity; + result->FixedCapacityDynamicArrayType.elem = elem; + return result; +} + gb_internal Ast *ast_struct_type(AstFile *f, Token token, Slice fields, isize field_count, Ast *polymorphic_params, bool is_packed, bool is_raw_union, bool is_all_or_none, bool is_simple, Ast *align, Ast *min_field_align, Ast *max_field_align, @@ -2470,9 +2484,10 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { Ast *original_type = parse_type(f); Ast *type = unparen_expr(original_type); switch (type->kind) { - case Ast_ArrayType: type->ArrayType.tag = tag; break; - case Ast_DynamicArrayType: type->DynamicArrayType.tag = tag; break; - case Ast_PointerType: type->PointerType.tag = tag; break; + case Ast_ArrayType: type->ArrayType.tag = tag; break; + case Ast_DynamicArrayType: type->DynamicArrayType.tag = tag; break; + case Ast_PointerType: type->PointerType.tag = tag; break; + case Ast_FixedCapacityDynamicArrayType: type->FixedCapacityDynamicArrayType.tag = tag; break; default: syntax_error(type, "Expected an array or pointer type after #%.*s, got %.*s", LIT(name.string), LIT(ast_strings[type->kind])); break; @@ -2702,8 +2717,25 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { } else if (f->curr_token.kind == Token_Question) { count_expr = ast_unary_expr(f, expect_token(f, Token_Question), nullptr); } else if (allow_token(f, Token_dynamic)) { + Ast *capacity = nullptr; + if (f->curr_token.kind == Token_Semicolon && f->curr_token.string == ";") { + expect_token(f, Token_Semicolon); + capacity = parse_expr(f, false); + } else if (allow_token(f, Token_Comma) || allow_token(f, Token_Semicolon)) { + String p = token_to_string(f->prev_token); + syntax_error(token_end_of_line(f, f->prev_token), "Expected a semicolon, got a %.*s", LIT(p)); + + capacity = parse_expr(f, false); + } expect_token(f, Token_CloseBracket); - return ast_dynamic_array_type(f, token, parse_type(f)); + + Ast *elem = parse_type(f); + + if (capacity == nullptr) { + return ast_dynamic_array_type(f, token, elem); + } else { + return ast_fixed_capacity_dynamic_array_type(f, token, capacity, elem); + } } else if (f->curr_token.kind != Token_CloseBracket) { f->expr_level++; count_expr = parse_expr(f, false); @@ -3186,6 +3218,7 @@ gb_internal bool is_literal_type(Ast *node) { case Ast_StructType: case Ast_UnionType: case Ast_EnumType: + case Ast_FixedCapacityDynamicArrayType: case Ast_DynamicArrayType: case Ast_MapType: case Ast_BitSetType: diff --git a/src/parser.hpp b/src/parser.hpp index d3527285d..c68b3614f 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -764,8 +764,14 @@ AST_KIND(_TypeBegin, "", bool) \ }) \ AST_KIND(DynamicArrayType, "dynamic array type", struct { \ Token token; \ - Ast *elem; \ - Ast *tag; \ + Ast *elem; \ + Ast *tag; \ + }) \ + AST_KIND(FixedCapacityDynamicArrayType, "fixed capacity dynamic array type", struct { \ + Token token; \ + Ast *capacity; \ + Ast *elem; \ + Ast *tag; \ }) \ AST_KIND(StructType, "struct type", struct { \ Scope *scope; \ diff --git a/src/types.cpp b/src/types.cpp index b11e95452..418a64b04 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -248,6 +248,12 @@ struct TypeNamed { }) \ TYPE_KIND(Slice, struct { Type *elem; }) \ TYPE_KIND(DynamicArray, struct { Type *elem; }) \ + TYPE_KIND(FixedCapacityDynamicArray, struct { \ + i64 capacity; \ + Type *generic_capacity; \ + Type *elem; \ + i64 padding_needed; /*-1 if unknown*/ \ + }) \ TYPE_KIND(Map, struct { \ Type *key; \ Type *value; \ @@ -378,6 +384,7 @@ enum Typeid_Kind : u8 { Typeid_Matrix, Typeid_SoaPointer, Typeid_Bit_Field, + Typeid_Fixed_Capacity_Dynamic_Array, Typeid__COUNT @@ -698,6 +705,7 @@ gb_global Type *t_type_info_simd_vector = nullptr; gb_global Type *t_type_info_matrix = nullptr; gb_global Type *t_type_info_soa_pointer = nullptr; gb_global Type *t_type_info_bit_field = nullptr; +gb_global Type *t_type_info_fixed_capacity_dynamic_array = nullptr; gb_global Type *t_type_info_named_ptr = nullptr; gb_global Type *t_type_info_integer_ptr = nullptr; @@ -726,6 +734,7 @@ gb_global Type *t_type_info_simd_vector_ptr = nullptr; gb_global Type *t_type_info_matrix_ptr = nullptr; gb_global Type *t_type_info_soa_pointer_ptr = nullptr; gb_global Type *t_type_info_bit_field_ptr = nullptr; +gb_global Type *t_type_info_fixed_capacity_dynamic_array_ptr = nullptr; gb_global Type *t_allocator = nullptr; gb_global Type *t_allocator_ptr = nullptr; @@ -1094,6 +1103,23 @@ gb_internal Type *alloc_type_dynamic_array(Type *elem) { return t; } +gb_internal Type *alloc_type_fixed_capacity_dynamic_array(Type *elem, i64 capacity, Type *generic_capacity = nullptr) { + if (generic_capacity != nullptr) { + Type *t = alloc_type(Type_FixedCapacityDynamicArray); + t->FixedCapacityDynamicArray.elem = elem; + t->FixedCapacityDynamicArray.capacity = capacity; + t->FixedCapacityDynamicArray.generic_capacity = generic_capacity; + t->FixedCapacityDynamicArray.padding_needed = 0; + return t; + } + Type *t = alloc_type(Type_FixedCapacityDynamicArray); + t->FixedCapacityDynamicArray.elem = elem; + t->FixedCapacityDynamicArray.capacity = capacity; + t->FixedCapacityDynamicArray.padding_needed = 0; + return t; +} + + gb_internal Type *alloc_type_struct() { Type *t = alloc_type(Type_Struct); @@ -1658,6 +1684,11 @@ gb_internal bool is_type_dynamic_array(Type *t) { if (t == nullptr) { return false; } return t->kind == Type_DynamicArray; } +gb_internal bool is_type_fixed_capacity_dynamic_array(Type *t) { + t = base_type(t); + if (t == nullptr) { return false; } + return t->kind == Type_FixedCapacityDynamicArray; +} gb_internal bool is_type_slice(Type *t) { t = base_type(t); if (t == nullptr) { return false; } @@ -1687,6 +1718,8 @@ gb_internal Type *base_array_type(Type *t) { return bt->EnumeratedArray.elem; } else if (is_type_simd_vector(bt)) { return bt->SimdVector.elem; + } else if (is_type_fixed_capacity_dynamic_array(bt)) { + return bt->FixedCapacityDynamicArray.elem; } else if (is_type_matrix(bt)) { return bt->Matrix.elem; } @@ -1702,6 +1735,8 @@ gb_internal Type *base_any_array_type(Type *t) { return bt->Slice.elem; } else if (is_type_dynamic_array(bt)) { return bt->DynamicArray.elem; + } else if (is_type_fixed_capacity_dynamic_array(bt)) { + return bt->FixedCapacityDynamicArray.elem; } else if (is_type_enumerated_array(bt)) { return bt->EnumeratedArray.elem; } else if (is_type_simd_vector(bt)) { @@ -2234,6 +2269,7 @@ gb_internal bool is_type_indexable(Type *t) { case Type_Array: case Type_Slice: case Type_DynamicArray: + case Type_FixedCapacityDynamicArray: case Type_Map: return true; case Type_MultiPointer: @@ -2254,6 +2290,7 @@ gb_internal bool is_type_sliceable(Type *t) { case Type_Array: case Type_Slice: case Type_DynamicArray: + case Type_FixedCapacityDynamicArray: return true; case Type_EnumeratedArray: return false; @@ -2394,6 +2431,11 @@ gb_internal bool is_type_polymorphic(Type *t, bool or_specialized=false) { return is_type_polymorphic(t->SimdVector.elem, or_specialized); case Type_DynamicArray: return is_type_polymorphic(t->DynamicArray.elem, or_specialized); + case Type_FixedCapacityDynamicArray: + if (t->FixedCapacityDynamicArray.generic_capacity != nullptr) { + return true; + } + return is_type_polymorphic(t->FixedCapacityDynamicArray.elem, or_specialized); case Type_Slice: return is_type_polymorphic(t->Slice.elem, or_specialized); @@ -2515,6 +2557,11 @@ gb_internal bool type_has_nil(Type *t) { case Type_DynamicArray: case Type_Map: return true; + + case Type_FixedCapacityDynamicArray: + // TODO(bill): should it have `nil`? + return false; + case Type_Union: return t->Union.kind != UnionType_no_nil; case Type_Struct: @@ -2642,6 +2689,9 @@ gb_internal bool is_type_comparable(Type *t) { case Type_Matrix: return is_type_comparable(t->Matrix.elem); + case Type_FixedCapacityDynamicArray: + return false; + case Type_BitSet: return true; @@ -2688,6 +2738,10 @@ gb_internal bool is_type_simple_compare(Type *t) { case Type_EnumeratedArray: return is_type_simple_compare(t->EnumeratedArray.elem); + case Type_FixedCapacityDynamicArray: + return false; + // return is_type_simple_compare(t->FixedCapacityDynamicArray.elem); + case Type_Basic: if (t->Basic.flags & BasicFlag_SimpleCompare) { return true; @@ -2758,6 +2812,10 @@ gb_internal bool is_type_nearly_simple_compare(Type *t) { case Type_EnumeratedArray: return is_type_nearly_simple_compare(t->EnumeratedArray.elem); + case Type_FixedCapacityDynamicArray: + return false; + // return is_type_nearly_simple_compare(t->FixedCapacityDynamicArray.elem); + case Type_Basic: if (t->Basic.flags & (BasicFlag_SimpleCompare|BasicFlag_Numeric)) { return true; @@ -2838,6 +2896,7 @@ gb_internal bool is_type_load_safe(Type *type) { case Type_DynamicArray: case Type_Proc: case Type_SoaPointer: + case Type_FixedCapacityDynamicArray: return false; case Type_Enum: @@ -3047,6 +3106,10 @@ gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple case Type_DynamicArray: return are_types_identical(x->DynamicArray.elem, y->DynamicArray.elem); + case Type_FixedCapacityDynamicArray: + return (x->FixedCapacityDynamicArray.capacity == y->FixedCapacityDynamicArray.capacity) && + are_types_identical(x->FixedCapacityDynamicArray.elem, y->FixedCapacityDynamicArray.elem); + case Type_Slice: return are_types_identical(x->Slice.elem, y->Slice.elem); @@ -4144,9 +4207,22 @@ gb_internal i64 type_align_of_internal(Type *t, TypePath *path) { } case Type_DynamicArray: - // data, count, capacity, allocator + // data, len, cap, allocator return build_context.int_size; + case Type_FixedCapacityDynamicArray: + // data, len + { + Type *elem = t->FixedCapacityDynamicArray.elem; + bool pop = type_path_push(path, elem); + if (path->failure) { + return FAILURE_ALIGNMENT; + } + i64 align = type_align_of_internal(elem, path); + if (pop) type_path_pop(path); + return gb_max(build_context.int_size, align); + } + case Type_Slice: return build_context.int_size; @@ -4419,6 +4495,34 @@ gb_internal i64 type_size_of_internal(Type *t, TypePath *path) { // data + len + cap + allocator(procedure+data) return 3*build_context.int_size + 2*build_context.ptr_size; + case Type_FixedCapacityDynamicArray: + { + // data + len + i64 capacity = t->FixedCapacityDynamicArray.capacity; + Type *elem = t->FixedCapacityDynamicArray.elem; + i64 align = type_align_of_internal(elem, path); + if (path->failure) { + return FAILURE_SIZE; + } + align = gb_max(build_context.int_size, align); + + i64 size = type_size_of(elem); + size *= capacity; + + i64 old_size = size; + size = align_formula(size, build_context.int_size); + + i64 padding = size - old_size; + if (t->FixedCapacityDynamicArray.padding_needed >= 0) { + GB_ASSERT(t->FixedCapacityDynamicArray.padding_needed == padding); + } + t->FixedCapacityDynamicArray.padding_needed = padding; + + size += 1*build_context.int_size; + size = align_formula(size, align); + return size; + } + case Type_Map: /* struct { @@ -4644,6 +4748,23 @@ gb_internal i64 type_offset_of(Type *t, i64 index, Type **field_type_) { return 3*build_context.int_size; // allocator } break; + + case Type_FixedCapacityDynamicArray: + switch (index) { + case 0: + if (field_type_) *field_type_ = alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity); + return 0; // data + + case 1: // len + if (field_type_) *field_type_ = t_int; + { + i64 offset = 0; + offset = type_size_of(alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity)); + offset = align_formula(offset, build_context.int_size); + return offset; + } + } + break; case Type_Union: if (!is_type_union_maybe_pointer(t)) { /* i64 s = */ type_size_of(t); @@ -4711,6 +4832,12 @@ gb_internal i64 type_offset_of_from_selection(Type *type, Selection sel) { case 3: t = t_allocator; break; } break; + case Type_FixedCapacityDynamicArray: + switch (index) { + case 0: t = alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity); break; + case 1: t = t_int; break; + } + break; } } } @@ -4970,6 +5097,15 @@ gb_internal Type *type_internal_index(Type *t, isize index) { default: GB_PANIC("invalid raw dynamic array index"); }; } + + case Type_FixedCapacityDynamicArray: + { + switch (index) { + case 0: t = alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity); break; + case 1: return t_int; + default: GB_PANIC("invalid raw fixed capacity dynamic array index"); + }; + } case Type_Struct: return get_struct_field_type(bt, index); case Type_Union: @@ -5068,6 +5204,13 @@ gb_internal gbString write_type_to_string(gbString str, Type *type, bool shortha str = write_type_to_string(str, type->DynamicArray.elem, shorthand, allow_polymorphic); break; + case Type_FixedCapacityDynamicArray: + str = gb_string_appendc(str, "[dynamic; "); + str = gb_string_appendc(str, gb_bprintf("%lld", cast(long long)type->FixedCapacityDynamicArray.capacity)); + str = gb_string_appendc(str, "]"); + str = write_type_to_string(str, type->FixedCapacityDynamicArray.elem, shorthand, allow_polymorphic); + break; + case Type_Enum: str = gb_string_appendc(str, "enum"); if (type->Enum.base_type != nullptr) { From 4df2de057bd45d9ebd809fe3d34b978869df7a3e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Mar 2026 18:43:01 +0000 Subject: [PATCH 646/766] Add `Type_Info_Fixed_Capacity_Dynamic_Array` to `json` --- core/encoding/json/marshal.odin | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index 011fc6f91..a38c6b6d9 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -320,6 +320,16 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: } opt_write_end(w, opt, ']') or_return + case runtime.Type_Info_Fixed_Capacity_Dynamic_Array: + opt_write_start(w, opt, '[') or_return + len := (^int)(uintptr(v.data) + info.len_offset)^ + for i in 0.. Date: Sat, 10 Jan 2026 10:21:00 -0500 Subject: [PATCH 647/766] Add support for other Android architectures --- src/build_settings.cpp | 30 ++++++++++++++++++++++++++++-- src/linker.cpp | 9 +++++---- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index f46b7d247..bcaf72f90 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1683,7 +1683,20 @@ gb_internal void init_android_values(bool with_sdk) { gb_exit(1); } - bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB = concatenate_strings(permanent_allocator(), bc->ODIN_ANDROID_NDK_TOOLCHAIN, str_lit("sysroot/usr/lib/aarch64-linux-android/")); + switch (bc->metrics.arch) { + case TargetArch_arm64: + bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB = str_lit("aarch64-linux-android"); + break; + case TargetArch_arm32: + bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB = str_lit("arm-linux-androideabi"); + break; + case TargetArch_amd64: + bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB = str_lit("x86_64-linux-android"); + break; + case TargetArch_i386: + bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB = str_lit("i686-linux-android"); + break; + } char buf[32] = {}; gb_snprintf(buf, gb_size_of(buf), "%d/", bc->ODIN_ANDROID_API_LEVEL); @@ -1958,9 +1971,22 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta } else if (metrics->os == TargetOs_linux && subtarget == Subtarget_Android) { switch (metrics->arch) { case TargetArch_arm64: - bc->metrics.target_triplet = str_lit("aarch64-none-linux-android"); + bc->metrics.target_triplet = str_lit("aarch64-linux-android"); bc->reloc_mode = RelocMode_PIC; break; + case TargetArch_arm32: + bc->metrics.target_triplet = str_lit("armv7a-linux-androideabi"); + bc->reloc_mode = RelocMode_PIC; + break; + case TargetArch_amd64: + bc->metrics.target_triplet = str_lit("x86_64-linux-android"); + bc->reloc_mode = RelocMode_PIC; + break; + case TargetArch_i386: + bc->metrics.target_triplet = str_lit("i686-linux-android"); + bc->reloc_mode = RelocMode_PIC; + break; + default: GB_PANIC("Unknown architecture for -subtarget:android"); } diff --git a/src/linker.cpp b/src/linker.cpp index e48486d9a..12f016cea 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -676,7 +676,7 @@ try_cross_linking:; defer (gb_string_free(glue)); glue = gb_string_append_fmt(glue, "bin/clang"); - glue = gb_string_append_fmt(glue, " --target=aarch64-linux-android%d ", ODIN_ANDROID_API_LEVEL); + glue = gb_string_append_fmt(glue, " --target=%s%d ", build_context.metrics.target_triplet, ODIN_ANDROID_API_LEVEL); glue = gb_string_appendc(glue, "-c \""); glue = gb_string_append_length(glue, ODIN_ANDROID_NDK.text, ODIN_ANDROID_NDK.len); glue = gb_string_appendc(glue, "sources/android/native_app_glue/android_native_app_glue.c"); @@ -697,8 +697,9 @@ try_cross_linking:; glue = gb_string_appendc(glue, "\"-I"); glue = gb_string_append_length(glue, ODIN_ANDROID_NDK_TOOLCHAIN.text, ODIN_ANDROID_NDK_TOOLCHAIN.len); - glue = gb_string_appendc(glue, "sysroot/usr/include/aarch64-linux-android/"); - glue = gb_string_appendc(glue, "\" "); + glue = gb_string_appendc(glue, "sysroot/usr/include/"); + glue = gb_string_append_length(glue, ODIN_ANDROID_NDK_TOOLCHAIN_LIB.text, ODIN_ANDROID_NDK_TOOLCHAIN_LIB.len); + glue = gb_string_appendc(glue, "/\" "); glue = gb_string_appendc(glue, "-Wno-macro-redefined "); @@ -969,7 +970,7 @@ try_cross_linking:; gbString ndk_bin_directory = gb_string_make_length(temporary_allocator(), ODIN_ANDROID_NDK_TOOLCHAIN.text, ODIN_ANDROID_NDK_TOOLCHAIN.len); link_command_line = gb_string_appendc(link_command_line, ndk_bin_directory); link_command_line = gb_string_appendc(link_command_line, "bin/clang"); - link_command_line = gb_string_append_fmt(link_command_line, " --target=aarch64-linux-android%d ", ODIN_ANDROID_API_LEVEL); + link_command_line = gb_string_append_fmt(link_command_line, " --target=%s%d ", build_context.metrics.target_triplet, ODIN_ANDROID_API_LEVEL); } else { link_command_line = gb_string_appendc(link_command_line, clang_path); } From 273ab7e3bb49a0b09d46f42041b58316196a8ee8 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Mar 2026 22:16:35 +0100 Subject: [PATCH 648/766] nbio: fix posix big send/recv wrongly check if done --- core/nbio/impl_posix.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index 8469c9ade..3ecb5d8a3 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -805,7 +805,7 @@ send_exec :: proc(op: ^Operation) -> Op_Result { op.send.sent += n - if op.send.sent < total { + if n < total { return send_exec(op) } @@ -869,7 +869,7 @@ recv_exec :: proc(op: ^Operation) -> Op_Result { assert(is_tcp || op.recv.received == 0) op.recv.received += n - if is_tcp && n != 0 && op.recv.received < total { + if is_tcp && n != 0 && n < total { return recv_exec(op) } From 535b70b82e086dcc7de258844d334d570ee971ff Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 09:37:27 +0000 Subject: [PATCH 649/766] Add other `@builtin` procedures for fixed capacity dynamic arrays --- base/runtime/core_builtin.odin | 317 +++++++++++++++++++++++++++++++-- 1 file changed, 301 insertions(+), 16 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 7a1a38f9a..bcb00f0f9 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -165,28 +165,50 @@ remove_range :: proc(array: ^$D/[dynamic]$T, #any_int lo, hi: int, loc := #calle } -// `pop` will remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. +// `pop_dynamic_array` will remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. // // Note: If the dynamic array has no elements (`len(array) == 0`), this procedure will panic. @builtin -pop :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) #no_bounds_check { +pop_dynamic_array :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) #no_bounds_check { assert(len(array) > 0, loc=loc) - _pop_type_erased(&res, (^Raw_Dynamic_Array)(array), size_of(E)) + _pop_dynamic_array_type_erased(&res, (^Raw_Dynamic_Array)(array), size_of(E)) return res } -_pop_type_erased :: proc(res: rawptr, array: ^Raw_Dynamic_Array, elem_size: int, loc := #caller_location) { +_pop_dynamic_array_type_erased :: proc(res: rawptr, array: ^Raw_Dynamic_Array, elem_size: int) { end := rawptr(uintptr(array.data) + uintptr(elem_size*(array.len-1))) intrinsics.mem_copy_non_overlapping(res, end, elem_size) array.len -= 1 } +// `pop_fixed_capacity_dynamic_array` will remove and return the end value of fixed capacity dynamic array `array` and reduces the length of `array` by 1. +// +// Note: If the fixed capacity dynamic array has no elements (`len(array) == 0`), this procedure will panic. +@builtin +pop_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, loc := #caller_location) -> (res: E) #no_bounds_check { + assert(len(array) > 0, loc=loc) -// `pop_safe` trys to remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. + elem_size :: size_of(E) + end := rawptr(uintptr(array) + uintptr(elem_size*(len(array)-1))) + intrinsics.mem_copy_non_overlapping(&res, end, elem_size) + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 +} + + +// `pop` will remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. +// +// Note: If the dynamic array has no elements (`len(array) == 0`), this procedure will panic. +@builtin +pop :: proc{ + pop_dynamic_array, + pop_fixed_capacity_dynamic_array, +} + +// `pop_safe_dynamic_array` trys to remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. // If the operation is not possible, it will return false. @builtin -pop_safe :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #no_bounds_check { +pop_safe_dynamic_array :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #no_bounds_check { if len(array) == 0 { return } @@ -195,11 +217,32 @@ pop_safe :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #n return } -// `pop_front` will remove and return the first value of dynamic array `array` and reduces the length of `array` by 1. +// `pop_safe_fixed_capacity_dynamic_array` trys to remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. +// If the operation is not possible, it will return false. +@builtin +pop_safe_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E) -> (res: E, ok: bool) #no_bounds_check { + if len(array) == 0 { + return + } + res, ok = array[len(array)-1], true + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 + return +} + +// `pop_safe` trys to remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. +// If the operation is not possible, it will return false. +@builtin +pop_safe :: proc{ + pop_safe_dynamic_array, + pop_safe_fixed_capacity_dynamic_array, +} + + +// `pop_front_dynamic_array` will remove and return the first value of dynamic array `array` and reduces the length of `array` by 1. // // Note: If the dynamic array as no elements (`len(array) == 0`), this procedure will panic. @builtin -pop_front :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) #no_bounds_check { +pop_front_dynamic_array :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) #no_bounds_check { assert(len(array) > 0, loc=loc) res = array[0] if len(array) > 1 { @@ -209,10 +252,35 @@ pop_front :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) # return res } -// `pop_front_safe` trys to return and remove the first value of dynamic array `array` and reduces the length of `array` by 1. +// `pop_front_fixed_capacity_dynamic_array` will remove and return the first value of fixed capacity dynamic array `array` and reduces the length of `array` by 1. +// +// Note: If the fixed capacity dynamic array as no elements (`len(array) == 0`), this procedure will panic. +@builtin +pop_front_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, loc := #caller_location) -> (res: E) #no_bounds_check { + assert(len(array) > 0, loc=loc) + res = array[0] + if len(array) > 1 { + copy(array[0:], array[1:]) + } + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 + return res +} + + +// `pop_front` will remove and return the first value of dynamic array `array` and reduces the length of `array` by 1. +// +// Note: If the dynamic array as no elements (`len(array) == 0`), this procedure will panic. +@builtin +pop_front :: proc{ + pop_front_dynamic_array, + pop_front_fixed_capacity_dynamic_array, +} + + +// `pop_front_safe_dynamic_array` trys to return and remove the first value of dynamic array `array` and reduces the length of `array` by 1. // If the operation is not possible, it will return false. @builtin -pop_front_safe :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #no_bounds_check { +pop_front_safe_dynamic_array :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #no_bounds_check { if len(array) == 0 { return } @@ -224,12 +292,37 @@ pop_front_safe :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bo return } +// `pop_front_safe_fixed_capacity_dynamic_array` trys to return and remove the first value of dynamic array `array` and reduces the length of `array` by 1. +// If the operation is not possible, it will return false. +@builtin +pop_front_safe_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E) -> (res: E, ok: bool) #no_bounds_check { + if len(array) == 0 { + return + } + res, ok = array[0], true + if len(array) > 1 { + copy(array[0:], array[1:]) + } + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 + return +} + +// `pop_front_safe` trys to return and remove the first value of dynamic array `array` and reduces the length of `array` by 1. +// If the operation is not possible, it will return false. +@builtin +pop_front_safe :: proc { + pop_front_safe_dynamic_array, + pop_front_safe_fixed_capacity_dynamic_array, +} + + // `clear` will set the length of a passed dynamic array or map to `0` @builtin clear :: proc{ clear_dynamic_array, clear_map, + clear_fixed_capacity_dynamic_array, clear_soa_dynamic_array, } @@ -671,6 +764,15 @@ non_zero_append_elem_string :: proc(array: ^$T/[dynamic]$E/u8, arg: $A/string, l return _append_elem_string(array, arg, false, loc) } +// `non_zero_append_elem_fixed_capacity_string` appends a string to the end of a dynamic array of bytes, without zeroing any reserved memory +// +// Note: Prefer using the procedure group `non_zero_append`. +@builtin +non_zero_append_elem_fixed_capacity_string :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, arg: $A/string) -> (n: int) { + return append_fixed_capacity_elem(array, transmute([]byte)arg) +} + + // The append_string built-in procedure appends multiple strings to the end of a [dynamic]u8 like type // @@ -691,7 +793,7 @@ append_string :: proc(array: ^$T/[dynamic]$E/u8, args: ..string, loc := #caller_ // `append_fixed_capacity_elem` appends an element to the end of a fixed capacity dynamic array. Returns 0 on failure @builtin -append_fixed_capacity_elem :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast arg: E) -> (n: int) { +append_fixed_capacity_elem :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #no_broadcast arg: E) -> (n: int) { Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) if (^Raw)(array).len >= N { @@ -708,7 +810,7 @@ append_fixed_capacity_elem :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast arg // `append_fixed_capacity_elem` appends an element to the end of a fixed capacity dynamic array. Returns 0 on failure @builtin -append_fixed_capacity_elems :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast args: ..E) -> (n: int) { +append_fixed_capacity_elems :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #no_broadcast args: ..E) -> (n: int) { Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) raw := (^Raw)(array) @@ -724,6 +826,22 @@ append_fixed_capacity_elems :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast ar return n } +// The append_fixed_capacity_string built-in procedure appends multiple strings to the end of a [dynamic]u8 like type +// +// Note: Prefer using the procedure group `append`. +@builtin +append_fixed_capacity_string :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, args: ..string, loc := #caller_location) -> (n: int) { + n_arg: int + for arg in args { + n_arg = append_fixed_capacity_elems(array, ..transmute([]E)(arg), loc=loc) + n += n_arg + if n_arg < len(arg) { + return + } + } + return +} + // The append built-in procedure appends elements to the end of a dynamic array @builtin @@ -734,6 +852,7 @@ append :: proc{ append_fixed_capacity_elem, append_fixed_capacity_elems, + append_fixed_capacity_string, append_soa_elem, append_soa_elems, @@ -746,6 +865,7 @@ non_zero_append :: proc{ non_zero_append_elem_string, append_fixed_capacity_elem, + non_zero_append_elem_fixed_capacity_string, non_zero_append_soa_elem, non_zero_append_soa_elems, @@ -755,7 +875,7 @@ non_zero_append :: proc{ // `append_nothing` appends an empty value to a dynamic array. It returns `1, nil` if successful, and `0, err` when it was not possible, // whatever `err` happens to be. @builtin -append_nothing :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +append_nothing_dynamic_array :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { if array == nil { return 0, nil } @@ -764,6 +884,27 @@ append_nothing :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (n: i return len(array)-prev_len, nil } +// `append_nothing` appends an empty value to a dynamic array. It returns `1, nil` if successful, and `0, err` when it was not possible, +// whatever `err` happens to be. +@builtin +append_nothing_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E) -> (n: int, ok: bool) { + if array == nil { + return 0, true + } + prev_len := len(array) + resize_fixed_capacity_dynamic_array(array, len(array)+1) or_return + return len(array)-prev_len, true +} + + +// `append_nothing` appends an empty value to a dynamic array. It returns `1, nil` if successful, and `0, err` when it was not possible, +// whatever `err` happens to be. +@builtin +append_nothing :: proc{ + append_nothing_dynamic_array, + append_nothing_fixed_capacity_dynamic_array, +} + // `inject_at_elem` injects an element in a dynamic array at a specified index and moves the previous elements after that index "across" @builtin @@ -839,11 +980,87 @@ inject_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, ar return } + +// `inject_at_elem_fixed_capacity_dynamic_array` injects an element in a dynamic array at a specified index and moves the previous elements after that index "across" +@builtin +inject_at_elem_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int index: int, #no_broadcast arg: E, loc := #caller_location) -> (ok: bool) #no_bounds_check { + when !ODIN_NO_BOUNDS_CHECK { + ensure(index >= 0, "Index must be positive.", loc) + } + if array == nil { + return false + } + n := max(len(array), index) + m :: 1 + new_size := n + m + + resize(array, new_size, loc) or_return + when size_of(E) != 0 { + copy(array[index + m:], array[index:]) + array[index] = arg + } + return true +} + +// `inject_at_elems_fixed_capacity_dynamic_array` injects multiple elements in a dynamic array at a specified index and moves the previous elements after that index "across" +@builtin +inject_at_elems_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int index: int, #no_broadcast args: ..E, loc := #caller_location) -> (ok: bool) #no_bounds_check { + when !ODIN_NO_BOUNDS_CHECK { + ensure(index >= 0, "Index must be positive.", loc) + } + if array == nil { + return false + } + if len(args) == 0 { + return true + } + + n := max(len(array), index) + m := len(args) + new_size := n + m + + resize(array, new_size, loc) or_return + when size_of(E) != 0 { + copy(array[index + m:], array[index:]) + copy(array[index:], args) + } + return true +} + +// `inject_at_elem_string_fixed_capacity_dynamic_array` injects a string into a dynamic array at a specified index and moves the previous elements after that index "across" +@builtin +inject_at_elem_string_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E/u8, #any_int index: int, arg: string, loc := #caller_location) -> (ok: bool) #no_bounds_check { + when !ODIN_NO_BOUNDS_CHECK { + ensure(index >= 0, "Index must be positive.", loc) + } + if array == nil { + return false + } + if len(arg) == 0 { + return true + } + + n := max(len(array), index) + m := len(arg) + new_size := n + m + + resize(array, new_size, loc) or_return + copy(array[index+m:], array[index:]) + copy(array[index:], arg) + return true +} + + // `inject_at` injects something into a dynamic array at a specified index and moves the previous elements after that index "across" -@builtin inject_at :: proc{ +@builtin +inject_at :: proc{ inject_at_elem, inject_at_elems, inject_at_elem_string, + + inject_at_elem_fixed_capacity_dynamic_array, + inject_at_elems_fixed_capacity_dynamic_array, + inject_at_elem_string_fixed_capacity_dynamic_array, } @@ -900,6 +1117,60 @@ assign_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, ar return } + +// `assign_at_elem_fixed_capacity_dynamic_array` assigns a value at a given index. If the requested index is past the end of the current +// size of the dynamic array, it will attempt to `resize` the a new length of `index+1` and then assign as `index`. +@builtin +assign_at_elem_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #any_int index: int, arg: E) -> (ok: bool) #no_bounds_check { + if index < len(array) { + array[index] = arg + ok = true + } else { + resize(array, index+1, loc) or_return + array[index] = arg + ok = true + } + return +} + + +// `assign_at_elems_fixed_capacity_dynamic_array` assigns a values at a given index. If the requested index is past the end of the current +// size of the dynamic array, it will attempt to `resize` the a new length of `index+len(args)` and then assign as `index`. +@builtin +assign_at_elems_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #any_int index: int, #no_broadcast args: ..E) -> (ok: bool) #no_bounds_check { + new_size := index + len(args) + if len(args) == 0 { + ok = true + } else if new_size < len(array) { + copy(array[index:], args) + ok = true + } else { + resize(array, new_size, loc) or_return + copy(array[index:], args) + ok = true + } + return +} + +// `assign_at_elem_string_fixed_capacity_dynamic_array` assigns a string at a given index. If the requested index is past the end of the current +// size of the dynamic array, it will attempt to `resize` the a new length of `index+len(arg)` and then assign as `index`. +@builtin +assign_at_elem_string_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, #any_int index: int, arg: string) -> (ok: bool) #no_bounds_check { + new_size := index + len(arg) + if len(arg) == 0 { + ok = true + } else if new_size < len(array) { + copy(array[index:], arg) + ok = true + } else { + resize(array, new_size, loc) or_return + copy(array[index:], arg) + ok = true + } + return +} + + // `assign_at` assigns a value at a given index. If the requested index is past the end of the current // size of the dynamic array, it will attempt to `resize` the a new length of `index+size_needed` and then assign as `index`. @builtin @@ -907,6 +1178,10 @@ assign_at :: proc{ assign_at_elem, assign_at_elems, assign_at_elem_string, + + assign_at_elem_fixed_capacity_dynamic_array, + assign_at_elems_fixed_capacity_dynamic_array, + assign_at_elem_string_fixed_capacity_dynamic_array, } @@ -921,6 +1196,16 @@ clear_dynamic_array :: proc "contextless" (array: ^$T/[dynamic]$E) { } } +// `clear_fixed_capacity_dynamic_array` will set the length of a passed dynamic array to `0` +// +// Note: Prefer the procedure group `clear`. +@builtin +clear_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E) { + if array != nil { + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len = 0 + } +} + // `reserve_dynamic_array` will try to reserve memory of a passed dynamic array or map to the requested element count (setting the `cap`). // // When a memory resize allocation is required, the memory will be asked to be zeroed (i.e. it calls `mem_resize`). @@ -1046,7 +1331,7 @@ non_zero_resize_dynamic_array :: proc(array: ^$T/[dynamic]$E, #any_int length: i // // Note: Prefer the procedure group `resize` @builtin -resize_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int length: int) -> bool { +resize_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #any_int length: int) -> bool { if array == nil { return false } @@ -1066,7 +1351,7 @@ resize_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int // // Note: Prefer the procedure group `resize` @builtin -non_zero_resize_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int length: int) -> bool { +non_zero_resize_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #any_int length: int) -> bool { if array == nil { return false } From 6a03cf5d683870317fe0236d552ee4c1bb6ff951 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 09:40:31 +0000 Subject: [PATCH 650/766] Add "remove" procedures to fixed capacity dynamic arrays --- base/runtime/core_builtin.odin | 77 +++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index bcb00f0f9..0a59167b2 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -119,14 +119,14 @@ copy :: proc{copy_slice, copy_from_string, copy_from_string16} -// `unordered_remove` removed the element at the specified `index`. It does so by replacing the current end value +// `unordered_remove_dynamic_array` removed the element at the specified `index`. It does so by replacing the current end value // with the old value, and reducing the length of the dynamic array by 1. // // Note: This is an O(1) operation. // Note: If you want the elements to remain in their order, use `ordered_remove`. // Note: If the index is out of bounds, this procedure will panic. @builtin -unordered_remove :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { +unordered_remove_dynamic_array :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { bounds_check_error_loc(loc, index, len(array)) n := len(array)-1 if index != n { @@ -134,13 +134,13 @@ unordered_remove :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #ca } (^Raw_Dynamic_Array)(array).len -= 1 } -// `ordered_remove` removed the element at the specified `index` whilst keeping the order of the other elements. +// `ordered_remove_dynamic_array` removed the element at the specified `index` whilst keeping the order of the other elements. // // Note: This is an O(N) operation. // Note: If the elements do not have to remain in their order, prefer `unordered_remove`. // Note: If the index is out of bounds, this procedure will panic. @builtin -ordered_remove :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { +ordered_remove_dynamic_array :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { bounds_check_error_loc(loc, index, len(array)) if index+1 < len(array) { copy(array[index:], array[index+1:]) @@ -148,12 +148,12 @@ ordered_remove :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #call (^Raw_Dynamic_Array)(array).len -= 1 } -// `remove_range` removes a range of elements specified by the range `lo` and `hi`, whilst keeping the order of the other elements. +// `remove_range_dynamic_array` removes a range of elements specified by the range `lo` and `hi`, whilst keeping the order of the other elements. // // Note: This is an O(N) operation. // Note: If the range is out of bounds, this procedure will panic. @builtin -remove_range :: proc(array: ^$D/[dynamic]$T, #any_int lo, hi: int, loc := #caller_location) #no_bounds_check { +remove_range_dynamic_array :: proc(array: ^$D/[dynamic]$T, #any_int lo, hi: int, loc := #caller_location) #no_bounds_check { slice_expr_error_lo_hi_loc(loc, lo, hi, len(array)) n := max(hi-lo, 0) if n > 0 { @@ -164,6 +164,71 @@ remove_range :: proc(array: ^$D/[dynamic]$T, #any_int lo, hi: int, loc := #calle } } +// `unordered_remove_fixed_capacity_dynamic_array` removed the element at the specified `index`. It does so by replacing the current end value +// with the old value, and reducing the length of the dynamic array by 1. +// +// Note: This is an O(1) operation. +// Note: If you want the elements to remain in their order, use `ordered_remove`. +// Note: If the index is out of bounds, this procedure will panic. +@builtin +unordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { + bounds_check_error_loc(loc, index, len(array)) + n := len(array)-1 + if index != n { + array[index] = array[n] + } + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 +} +// `ordered_remove_fixed_capacity_dynamic_array` removed the element at the specified `index` whilst keeping the order of the other elements. +// +// Note: This is an O(N) operation. +// Note: If the elements do not have to remain in their order, prefer `unordered_remove`. +// Note: If the index is out of bounds, this procedure will panic. +@builtin +ordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { + bounds_check_error_loc(loc, index, len(array)) + if index+1 < len(array) { + copy(array[index:], array[index+1:]) + } + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 +} + +// `remove_range_fixed_capacity_dynamic_array` removes a range of elements specified by the range `lo` and `hi`, whilst keeping the order of the other elements. +// +// Note: This is an O(N) operation. +// Note: If the range is out of bounds, this procedure will panic. +@builtin +remove_range_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int lo, hi: int, loc := #caller_location) #no_bounds_check { + slice_expr_error_lo_hi_loc(loc, lo, hi, len(array)) + n := max(hi-lo, 0) + if n > 0 { + if hi != len(array) { + copy(array[lo:], array[hi:]) + } + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= n + } +} + +@builtin +unordered_remove :: proc{ + unordered_remove_dynamic_array, + unordered_remove_fixed_capacity_dynamic_array, +} + + +@builtin +ordered_remove :: proc{ + ordered_remove_dynamic_array, + ordered_remove_fixed_capacity_dynamic_array, +} + +@builtin +remove_range :: proc{ + remove_range_dynamic_array, + remove_range_fixed_capacity_dynamic_array, +} + + // `pop_dynamic_array` will remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. // From 8ff07d29be715c5daf6983a336024d3aebef80b2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 09:42:46 +0000 Subject: [PATCH 651/766] Fix parser position for fixed capacity dynamic arrays --- src/parser_pos.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/parser_pos.cpp b/src/parser_pos.cpp index 1ffd3a82f..1d2b5090a 100644 --- a/src/parser_pos.cpp +++ b/src/parser_pos.cpp @@ -107,6 +107,7 @@ gb_internal Token ast_token(Ast *node) { case Ast_MultiPointerType: return node->MultiPointerType.token; case Ast_ArrayType: return node->ArrayType.token; case Ast_DynamicArrayType: return node->DynamicArrayType.token; + case Ast_FixedCapacityDynamicArrayType: return node->FixedCapacityDynamicArrayType.token; case Ast_StructType: return node->StructType.token; case Ast_UnionType: return node->UnionType.token; case Ast_EnumType: return node->EnumType.token; @@ -342,6 +343,7 @@ Token ast_end_token(Ast *node) { case Ast_MultiPointerType: return ast_end_token(node->MultiPointerType.type); case Ast_ArrayType: return ast_end_token(node->ArrayType.elem); case Ast_DynamicArrayType: return ast_end_token(node->DynamicArrayType.elem); + case Ast_FixedCapacityDynamicArrayType: return ast_end_token(node->FixedCapacityDynamicArrayType.elem); case Ast_StructType: if (node->StructType.fields.count > 0) { return ast_end_token(node->StructType.fields[node->StructType.fields.count-1]); From a6160770ff550426ad1b475d29a5356a51f6facb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 10:03:58 +0000 Subject: [PATCH 652/766] Support compound literals for fixed capacity dynamic arrays --- src/check_expr.cpp | 5 ++ src/llvm_backend_const.cpp | 124 +++++++++++++++++++++++++++++++++++ src/llvm_backend_expr.cpp | 33 ++++++++-- src/llvm_backend_utility.cpp | 15 ++++- src/types.cpp | 7 +- 5 files changed, 171 insertions(+), 13 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 9f66f8fec..39af640d8 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -10321,6 +10321,7 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * case Type_DynamicArray: case Type_SimdVector: case Type_Matrix: + case Type_FixedCapacityDynamicArray: { Type *elem_type = nullptr; String context_name = {}; @@ -10351,6 +10352,10 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * elem_type = t->DynamicArray.elem; context_name = str_lit("dynamic array literal"); is_constant = false; + } else if (t->kind == Type_FixedCapacityDynamicArray) { + elem_type = t->FixedCapacityDynamicArray.elem; + context_name = str_lit("fixed capacity dynamic array literal"); + max_type_count = t->FixedCapacityDynamicArray.capacity; } else if (t->kind == Type_SimdVector) { elem_type = t->SimdVector.elem; context_name = str_lit("simd vector literal"); diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 9f2052960..289d3daa2 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -694,6 +694,28 @@ gb_internal void lb_const_array_spread(lbModule *m, lbConstContext cc, Type *arr res->value = llvm_const_array(m, lb_type(m, elem), elems, cast(unsigned)count); } +gb_internal LLVMValueRef lb_fill_fixed_capacity_dynamic_array(lbModule *m, i64 elem_count, Type *original_type, LLVMValueRef *values, lbConstContext cc) { + Type *bt = base_type(original_type); + GB_ASSERT(bt->kind == Type_FixedCapacityDynamicArray); + Type *elem_type = bt->FixedCapacityDynamicArray.elem; + i64 capacity = bt->FixedCapacityDynamicArray.capacity; + + Type *array_backing_type = alloc_type_array(elem_type, capacity); + LLVMValueRef array_backing = lb_build_constant_array_values(m, array_backing_type, elem_type, cast(isize)capacity, values, cc); + LLVMValueRef array_len = lb_const_int(m, t_int, elem_count).value; + + isize svalue_count = 0; + LLVMValueRef svalues[3] = {}; + svalues[svalue_count++] = array_backing; + i64 padding = bt->FixedCapacityDynamicArray.padding_needed; + if (padding > 0) { + svalues[svalue_count++] = LLVMConstNull(lb_type_padding_filler(m, padding, 1)); + } + svalues[svalue_count++] = array_len; + + return llvm_const_named_struct(m, original_type, svalues, svalue_count); +} + gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lbConstContext cc, Type *value_type) { if (cc.allow_local) { cc.is_rodata = false; @@ -1554,6 +1576,108 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb res.value = lb_build_constant_array_values(m, type, elem_type, cast(isize)type->EnumeratedArray.count, values, cc); return res; } + } else if (is_type_fixed_capacity_dynamic_array(type)) { + ast_node(cl, CompoundLit, value.value_compound); + Type *elem_type = type->FixedCapacityDynamicArray.elem; + i64 capacity = type->FixedCapacityDynamicArray.capacity; + isize elem_count = cl->elems.count; + if (elem_count == 0 || !elem_type_can_be_constant(elem_type)) { + return lb_const_nil(m, original_type); + } + if (cl->elems[0]->kind == Ast_FieldValue) { + // TODO(bill): This is O(N*M) and will be quite slow; it should probably be sorted before hand + LLVMValueRef *values = gb_alloc_array(temporary_allocator(), LLVMValueRef, cast(isize)capacity); + + i64 max_index = -1; + isize value_index = 0; + for (i64 i = 0; i < capacity; i++) { + bool found = false; + + for (isize j = 0; j < elem_count; j++) { + Ast *elem = cl->elems[j]; + ast_node(fv, FieldValue, elem); + if (is_ast_range(fv->field)) { + ast_node(ie, BinaryExpr, fv->field); + TypeAndValue lo_tav = ie->left->tav; + TypeAndValue hi_tav = ie->right->tav; + GB_ASSERT(lo_tav.mode == Addressing_Constant); + GB_ASSERT(hi_tav.mode == Addressing_Constant); + + TokenKind op = ie->op.kind; + i64 lo = exact_value_to_i64(lo_tav.value); + i64 hi = exact_value_to_i64(hi_tav.value); + if (op != Token_RangeHalf) { + hi += 1; + } + max_index = gb_max(max_index, hi-1); + + if (lo == i) { + TypeAndValue tav = fv->value->tav; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + for (i64 k = lo; k < hi; k++) { + values[value_index++] = val; + } + + found = true; + i += (hi-lo-1); + break; + } + } else { + TypeAndValue index_tav = fv->field->tav; + GB_ASSERT(index_tav.mode == Addressing_Constant); + i64 index = exact_value_to_i64(index_tav.value); + + max_index = gb_max(max_index, index); + + if (index == i) { + TypeAndValue tav = fv->value->tav; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + values[value_index++] = val; + found = true; + break; + } + } + } + + if (!found) { + values[value_index++] = LLVMConstNull(lb_type(m, elem_type)); + } + } + + i64 count = max_index+1; + GB_ASSERT(0 < count); + GB_ASSERT(count <= capacity); + + res.value = lb_fill_fixed_capacity_dynamic_array(m, count, original_type, values, cc); + return res; + } else if (are_types_identical(value.value_compound->tav.type, elem_type)) { + // Compound is of array item type; expand its value to all items in array. + LLVMValueRef* values = gb_alloc_array(temporary_allocator(), LLVMValueRef, cast(isize)capacity); + + for (isize i = 0; i < capacity; i++) { + values[i] = lb_const_value(m, elem_type, value, cc, elem_type).value; + } + + res.value = lb_fill_fixed_capacity_dynamic_array(m, capacity, original_type, values, cc); + return res; + } else { + // Assume that compound value is an array literal + GB_ASSERT_MSG(elem_count <= capacity, "%td <= %td", elem_count, capacity); + + LLVMValueRef *values = gb_alloc_array(temporary_allocator(), LLVMValueRef, cast(isize)capacity); + + for (isize i = 0; i < elem_count; i++) { + TypeAndValue tav = cl->elems[i]->tav; + GB_ASSERT(tav.mode != Addressing_Invalid); + values[i] = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + } + for (isize i = elem_count; i < capacity; i++) { + values[i] = LLVMConstNull(lb_type(m, elem_type)); + } + + res.value = lb_fill_fixed_capacity_dynamic_array(m, elem_count, original_type, values, cc); + return res; + } } else if (is_type_simd_vector(type)) { ast_node(cl, CompoundLit, value.value_compound); diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index e352a33e9..af498214e 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -4495,6 +4495,7 @@ gb_internal void lb_build_addr_compound_lit_populate(lbProcedure *p, SliceDynamicArray.elem; break; case Type_SimdVector: et = bt->SimdVector.elem; break; case Type_Matrix: et = bt->Matrix.elem; break; + case Type_FixedCapacityDynamicArray: et = bt->FixedCapacityDynamicArray.elem; break; } GB_ASSERT(et != nullptr); @@ -5102,12 +5103,13 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { Type *et = nullptr; switch (bt->kind) { - case Type_Array: et = bt->Array.elem; break; - case Type_EnumeratedArray: et = bt->EnumeratedArray.elem; break; - case Type_Slice: et = bt->Slice.elem; break; - case Type_BitSet: et = bt->BitSet.elem; break; - case Type_SimdVector: et = bt->SimdVector.elem; break; - case Type_Matrix: et = bt->Matrix.elem; break; + case Type_Array: et = bt->Array.elem; break; + case Type_EnumeratedArray: et = bt->EnumeratedArray.elem; break; + case Type_Slice: et = bt->Slice.elem; break; + case Type_BitSet: et = bt->BitSet.elem; break; + case Type_SimdVector: et = bt->SimdVector.elem; break; + case Type_Matrix: et = bt->Matrix.elem; break; + case Type_FixedCapacityDynamicArray: et = bt->FixedCapacityDynamicArray.elem; break; } String proc_name = {}; @@ -5489,6 +5491,25 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { break; } + case Type_FixedCapacityDynamicArray: { + if (cl->elems.count > 0) { + lb_addr_store(p, v, lb_const_value(p->module, type, exact_value_compound(expr))); + + auto temp_data = array_make(temporary_allocator(), 0, cl->elems.count); + + lb_build_addr_compound_lit_populate(p, cl->elems, &temp_data, type); + + lbValue dst_ptr = lb_addr_get_ptr(p, v); + for_array(i, temp_data) { + i32 index = cast(i32)(temp_data[i].elem_index); + temp_data[i].gep = lb_emit_array_epi(p, dst_ptr, index); + } + + lb_build_addr_compound_lit_assign_array(p, temp_data); + } + break; + } + case Type_DynamicArray: { if (cl->elems.count == 0) { break; diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index b4ab5e4d6..349e8c85b 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1567,16 +1567,27 @@ gb_internal lbValue lb_emit_array_epi(lbProcedure *p, lbValue s, isize index) { Type *t = s.type; GB_ASSERT(is_type_pointer(t)); Type *st = base_type(type_deref(t)); - GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); + GB_ASSERT(0 <= index); + if (is_type_fixed_capacity_dynamic_array(st)) { + lbValue data = lb_emit_struct_ep(p, s, 0); + return lb_emit_epi(p, data, index); + } + + GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); return lb_emit_epi(p, s, index); } gb_internal lbValue lb_emit_array_epi(lbModule *m, lbValue s, isize index) { Type *t = s.type; GB_ASSERT(is_type_pointer(t)); Type *st = base_type(type_deref(t)); - GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); GB_ASSERT(0 <= index); + if (is_type_fixed_capacity_dynamic_array(st)) { + lbValue data = lb_emit_epi(m, s, 0); + return lb_emit_epi(m, data, index); + } + + GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); return lb_emit_epi(m, s, index); } diff --git a/src/types.cpp b/src/types.cpp index 418a64b04..73563968d 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -1109,13 +1109,13 @@ gb_internal Type *alloc_type_fixed_capacity_dynamic_array(Type *elem, i64 capaci t->FixedCapacityDynamicArray.elem = elem; t->FixedCapacityDynamicArray.capacity = capacity; t->FixedCapacityDynamicArray.generic_capacity = generic_capacity; - t->FixedCapacityDynamicArray.padding_needed = 0; + t->FixedCapacityDynamicArray.padding_needed = -1; return t; } Type *t = alloc_type(Type_FixedCapacityDynamicArray); t->FixedCapacityDynamicArray.elem = elem; t->FixedCapacityDynamicArray.capacity = capacity; - t->FixedCapacityDynamicArray.padding_needed = 0; + t->FixedCapacityDynamicArray.padding_needed = -1; return t; } @@ -4513,9 +4513,6 @@ gb_internal i64 type_size_of_internal(Type *t, TypePath *path) { size = align_formula(size, build_context.int_size); i64 padding = size - old_size; - if (t->FixedCapacityDynamicArray.padding_needed >= 0) { - GB_ASSERT(t->FixedCapacityDynamicArray.padding_needed == padding); - } t->FixedCapacityDynamicArray.padding_needed = padding; size += 1*build_context.int_size; From bc636e4b368dceb073ea2756a3503378f3ac04aa Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 12:56:00 +0000 Subject: [PATCH 653/766] raddbg debug view for fixed capacity dynamic arrays --- src/llvm_backend.cpp | 1 + src/llvm_backend_debug.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 931813f42..a4259b01e 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3583,6 +3583,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { lb_add_raddbg_string(m, "type_view: {type: \"[]?\", expr: \"array(data, len)\"}"); lb_add_raddbg_string(m, "type_view: {type: \"string\", expr: \"array(data, len)\"}"); lb_add_raddbg_string(m, "type_view: {type: \"[dynamic]?\", expr: \"rows($, array(data, len), len, cap, allocator)\"}"); + lb_add_raddbg_string(m, "type_view: {type: \"[dynamic;?]?\", expr: \"rows($, array(data, len), len)\"}"); // column major matrices lb_add_raddbg_string(m, "type_view: {type: \"matrix[1, ?]?\", expr: \"columns($.data, $[0])\"}"); diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index 4b09d3d5e..d3e63cbf7 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -442,14 +442,14 @@ gb_internal LLVMMetadataRef lb_debug_fixed_capacity_dynamic_array(lbModule *m, T LLVMDIFlagZero, lb_debug_type(m, elem_type) ); - i64 len_offset = type_offset_of(bt, 1); + i64 len_offset_in_bits = 8*type_offset_of(bt, 1); elements[1] = LLVMDIBuilderCreateMemberType( m->debug_builder, member_scope, "len", 3, file, line, int_bits, int_bits, - len_offset, + len_offset_in_bits, LLVMDIFlagZero, lb_debug_type(m, t_int) ); From e485d82c9d0b2cb526a9f94cff6718e0d2ef49f9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 13:01:29 +0000 Subject: [PATCH 654/766] cbor support for fixed capacity dynamic arrays --- core/encoding/cbor/marshal.odin | 26 +++++++++++++++++++++++++ core/encoding/cbor/unmarshal.odin | 32 +++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/core/encoding/cbor/marshal.odin b/core/encoding/cbor/marshal.odin index b23087c90..366473bcc 100644 --- a/core/encoding/cbor/marshal.odin +++ b/core/encoding/cbor/marshal.odin @@ -285,6 +285,32 @@ _marshal_into_encoder :: proc(e: Encoder, v: any, ti: ^runtime.Type_Info) -> (er } return + + case runtime.Type_Info_Fixed_Capacity_Dynamic_Array: + if info.elem.id == byte { + raw := (^[dynamic]byte)(v.data) + return err_conv(_encode_bytes(e, raw[:])) + } + + array_len := (^int)(uintptr(v.data) + info.len_offset)^ + array_data := uintptr(v.data) + err_conv(_encode_u64(e, u64(array_len), .Array)) or_return + + if impl, ok := _tag_implementations_type[info.elem.id]; ok { + for i in 0..marshal(e, any{rawptr(data), info.elem.id}) or_return + } + return + } + + elem_ti := runtime.type_info_core(type_info_of(info.elem.id)) + for i in 0.. t.capacity { return _unsupported(v, hdr) } + + // Copy into array type, delete original. + slice := ([^]byte)(v.data)[:len(bytes)] + n := copy(slice, bytes) + assert(n == len(bytes)) + (^int)(uintptr(v.data) + t.len_offset)^ = n + return } return _unsupported(v, hdr) @@ -553,6 +570,21 @@ _unmarshal_array :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header if out_of_space { return _unsupported(v, hdr) } return + case reflect.Type_Info_Fixed_Capacity_Dynamic_Array: + length, _ := err_conv(_decode_len_container(d, add)) or_return + if length > t.capacity { + return _unsupported(v, hdr) + } + + da := mem.Raw_Dynamic_Array{rawptr(v.data), 0, length, allocator } + + out_of_space := assign_array(d, &da, t.elem, length, growable=false) or_return + if out_of_space { return _unsupported(v, hdr) } + + (^int)(uintptr(v.data) + t.len_offset)^ = length + + return + case reflect.Type_Info_Complex: length, _ := err_conv(_decode_len_container(d, add)) or_return if length > 2 { From b4405d01f86d35d916e8b21704e2d0c2a6b17116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Vaeng=20R=C3=B8tnes?= Date: Thu, 12 Mar 2026 16:37:05 +0100 Subject: [PATCH 655/766] Fix typo in error message for using statement Change "It you do require..." to "If you do require..." --- src/check_type.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 82e70dd33..ed0d6528e 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1853,7 +1853,7 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para if (is_using && (feature_flags & OptInFeatureFlag_UsingStmt) == 0) { ERROR_BLOCK(); error(param, "'using' has been disallowed as it is considered bad practice to use as a statement/procedure parameter outside of immediate refactoring"); - error_line("\tIt you do require it for refactoring purposes or legacy code, it can be enabled on a per-file basis with '#+feature using-stmt'\n"); + error_line("\tIf you do require it for refactoring purposes or legacy code, it can be enabled on a per-file basis with '#+feature using-stmt'\n"); } if (type_expr == nullptr) { From 43d8c2bb344be20d9f4849e5e075cf5699f3a077 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 16:41:24 +0000 Subject: [PATCH 656/766] Add basic tests I know this is not the best place to put them but since `[dynamic; N]T` is meant to a replacement for `small_array.Small_Array(N, T)`, I thought it would be fine for the time being. --- .../test_fixed_capacity_dynamic_array.odin | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 tests/core/container/test_fixed_capacity_dynamic_array.odin diff --git a/tests/core/container/test_fixed_capacity_dynamic_array.odin b/tests/core/container/test_fixed_capacity_dynamic_array.odin new file mode 100644 index 000000000..91639fec6 --- /dev/null +++ b/tests/core/container/test_fixed_capacity_dynamic_array.odin @@ -0,0 +1,75 @@ +package test_core_container + +import "core:testing" + +@(test) +test_fixed_capacity_dynamic_array_removes :: proc(t: ^testing.T) { + array: [dynamic; 10]int + append(&array, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) + + ordered_remove(&array, 0) + testing.expect(t, slice_equal(array[:], []int { 1, 2, 3, 4, 5, 6, 7, 8, 9 })) + ordered_remove(&array, 5) + testing.expect(t, slice_equal(array[:], []int { 1, 2, 3, 4, 5, 7, 8, 9 })) + ordered_remove(&array, 6) + testing.expect(t, slice_equal(array[:], []int { 1, 2, 3, 4, 5, 7, 9 })) + unordered_remove(&array, 0) + testing.expect(t, slice_equal(array[:], []int { 9, 2, 3, 4, 5, 7 })) + unordered_remove(&array, 2) + testing.expect(t, slice_equal(array[:], []int { 9, 2, 7, 4, 5 })) + unordered_remove(&array, 4) + testing.expect(t, slice_equal(array[:], []int { 9, 2, 7, 4 })) +} + +@(test) +test_fixed_capacity_dynamic_array_inject_at :: proc(t: ^testing.T) { + array: [dynamic; 13]int + append(&array, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) + + testing.expect(t, inject_at(&array, 0, 0), "Expected to be able to inject into small array") + testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 })) + testing.expect(t, inject_at(&array, 0, 5), "Expected to be able to inject into small array") + testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9 })) + testing.expect(t, inject_at(&array, 0, len(array)), "Expected to be able to inject into small array") + testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 0 })) +} + +@(test) +test_fixed_capacity_dynamic_array_push_back_elems :: proc(t: ^testing.T) { + array: [dynamic; 2]int + testing.expect(t, slice_equal(array[:], []int { })) + testing.expect(t, append(&array, 0), "Expected to be able to append to empty small array") + testing.expect(t, slice_equal(array[:], []int { 0 })) + testing.expect(t, append(&array, 1, 2) == false, "Expected to fail appending multiple elements beyond capacity of small array") + testing.expect(t, append(&array, 1), "Expected to be able to append to small array") + testing.expect(t, slice_equal(array[:], []int { 0, 1 })) + testing.expect(t, append(&array, 1) == false, "Expected to fail appending to full small array") + testing.expect(t, append(&array, 1, 2) == false, "Expected to fail appending multiple elements to full small array") + clear(&array) + testing.expect(t, slice_equal(array[:], []int { })) + testing.expect(t, append(&array, 1, 2, 3) == false, "Expected to fail appending multiple elements to empty small array") + testing.expect(t, slice_equal(array[:], []int { })) + testing.expect(t, append(&array, 1, 2), "Expected to be able to append multiple elements to empty small array") + testing.expect(t, slice_equal(array[:], []int { 1, 2 })) +} + +@(test) +test_fixed_capacity_dynamic_array_resize :: proc(t: ^testing.T) { + + array: [dynamic; 4]int + + for i in 0..<4 { + append(&array, i+1) + } + testing.expect(t, slice_equal(array[:], []int{1, 2, 3, 4}), "Expected to initialize the array with 1, 2, 3, 4") + + clear(&array) + testing.expect(t, slice_equal(array[:], []int{}), "Expected to clear the array") + + non_zero_resize(&array, 4) + testing.expect(t, slice_equal(array[:], []int{1, 2, 3, 4}), "Expected non_zero_resize to set length 4 with previous values") + + clear(&array) + resize(&array, 4) + testing.expect(t, slice_equal(array[:], []int{0, 0, 0, 0}), "Expected resize to set length 4 with zeroed values") +} From 6898cbe678496a5cb71d3192354ac9a92169f273 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 16:46:51 +0000 Subject: [PATCH 657/766] Replace usage of `Small_Array(N; T)` with `[dynamic; N]T` in `core:nbio` for posix systems --- core/nbio/impl_posix.odin | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index 8469c9ade..3845882da 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -11,7 +11,6 @@ import "core:strings" import "core:sys/posix" import "core:time" import kq "core:sys/kqueue" -import sa "core:container/small_array" @(private="package") _FULLY_SUPPORTED :: true @@ -23,7 +22,7 @@ _Event_Loop :: struct { // that would be the same (ident, filter) pair we need to bundle the operations under one kevent. submitted: map[Queue_Identifier]^Operation, // Holds all events we want to flush. Flushing is done each tick at which point this is emptied. - pending: sa.Small_Array(QUEUE_SIZE, kq.KEvent), + pending: [dynamic; QUEUE_SIZE]kq.KEvent, // Holds what should be in `pending` but didn't fit. // When `pending`is flushed these are moved to `pending`. overflow: queue.Queue(kq.KEvent), @@ -116,7 +115,7 @@ _init :: proc(l: ^Event_Loop, allocator: mem.Allocator) -> (rerr: General_Error) l.kqueue = kqueue - sa.append(&l.pending, kq.KEvent{ + append(&l.pending, kq.KEvent{ ident = IDENT_WAKE_UP, filter = .User, flags = {.Add, .Enable, .Clear}, @@ -150,7 +149,7 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> General_Error { } if NBIO_DEBUG { - npending := sa.len(l.pending) + npending := len(l.pending) if npending > 0 { debug("queueing", npending, "new events, there are", int(len(l.submitted)), "events pending") } else { @@ -177,9 +176,9 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> General_Error { results_buf: [128]kq.KEvent results := kevent(l, results_buf[:], ts_pointer) or_return - sa.clear(&l.pending) + clear(&l.pending) for overflow in queue.pop_front_safe(&l.overflow) { - sa.append(&l.pending, overflow) or_break + (append(&l.pending, overflow) != 0) or_break } l.now = time.now() @@ -202,7 +201,7 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> General_Error { kevent :: proc(l: ^Event_Loop, buf: []kq.KEvent, ts: ^posix.timespec) -> ([]kq.KEvent, General_Error) { for { - new_events, err := kq.kevent(l.kqueue, sa.slice(&l.pending), buf, ts) + new_events, err := kq.kevent(l.kqueue, l.pending[:], buf, ts) #partial switch err { case nil: assert(new_events >= 0) @@ -1188,7 +1187,7 @@ add_pending :: proc(op: ^Operation, filter: kq.Filter, ident: uintptr) { } append_pending :: #force_inline proc(l: ^Event_Loop, ev: kq.KEvent) { - if !sa.append(&l.pending, ev) { + if append(&l.pending, ev) == 0 { warn("queue is full, adding to overflow, should QUEUE_SIZE be increased?") _, err := queue.append(&l.overflow, ev) ensure(err == nil, "allocation failure") @@ -1325,7 +1324,7 @@ timeout_and_delete :: proc(target: ^Operation) { flags = {.Add, .Enable, .One_Shot}, udata = target._impl.next, } - if !sa.append(&target.l.pending, ev) { + if append(&target.l.pending, ev) == 0 { warn("just removed the head operation of a list of multiple, and the queue is full, have to force this update through inefficiently") // This has to happen the next time we submit or we could have udata pointing wrong. // Very inefficient but probably never hit. From 6e9d6bfbe5f85a5cc0a9cd7dcd9b865b1d672543 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 16:55:46 +0000 Subject: [PATCH 658/766] Fixed tests --- base/runtime/core_builtin.odin | 4 ++-- .../test_fixed_capacity_dynamic_array.odin | 23 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 0a59167b2..7fa9ab4c8 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -1404,8 +1404,8 @@ resize_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; if raw.len < length { size_of_elem :: size_of(E) - num_reused := min(N, length) - a.len - intrinsics.mem_zero(([^]byte)(a.data)[a.len*size_of_elem:], num_reused*size_of_elem) + num_reused := min(N, length) - raw.len + intrinsics.mem_zero(([^]byte)(a.data)[raw.len*size_of_elem:], num_reused*size_of_elem) } new_length := clamp(length, 0, N) raw.len = new_length diff --git a/tests/core/container/test_fixed_capacity_dynamic_array.odin b/tests/core/container/test_fixed_capacity_dynamic_array.odin index 91639fec6..bca4e20f3 100644 --- a/tests/core/container/test_fixed_capacity_dynamic_array.odin +++ b/tests/core/container/test_fixed_capacity_dynamic_array.odin @@ -26,11 +26,11 @@ test_fixed_capacity_dynamic_array_inject_at :: proc(t: ^testing.T) { array: [dynamic; 13]int append(&array, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) - testing.expect(t, inject_at(&array, 0, 0), "Expected to be able to inject into small array") + testing.expect(t, inject_at(&array, 0, 0), "Expected to be able to inject into fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 })) - testing.expect(t, inject_at(&array, 0, 5), "Expected to be able to inject into small array") + testing.expect(t, inject_at(&array, 0, 5), "Expected to be able to inject into fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9 })) - testing.expect(t, inject_at(&array, 0, len(array)), "Expected to be able to inject into small array") + testing.expect(t, inject_at(&array, 0, len(array)), "Expected to be able to inject into fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 0 })) } @@ -38,18 +38,21 @@ test_fixed_capacity_dynamic_array_inject_at :: proc(t: ^testing.T) { test_fixed_capacity_dynamic_array_push_back_elems :: proc(t: ^testing.T) { array: [dynamic; 2]int testing.expect(t, slice_equal(array[:], []int { })) - testing.expect(t, append(&array, 0), "Expected to be able to append to empty small array") + testing.expect(t, append(&array, 0) == 1, "Expected to be able to append to empty fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 0 })) - testing.expect(t, append(&array, 1, 2) == false, "Expected to fail appending multiple elements beyond capacity of small array") - testing.expect(t, append(&array, 1), "Expected to be able to append to small array") + testing.expect(t, append(&array, 1) == 1, "Expected to be able to append to fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 0, 1 })) - testing.expect(t, append(&array, 1) == false, "Expected to fail appending to full small array") - testing.expect(t, append(&array, 1, 2) == false, "Expected to fail appending multiple elements to full small array") + testing.expect(t, append(&array, 1, 2) == 1, "Expected to fail appending multiple elements beyond capacity of fixed capacity dynamic array") + clear(&array) + testing.expect(t, append(&array, 1) == 1, "Expected to be able to append to fixed capacity dynamic array") + testing.expect(t, append(&array, 2) == 1, "Expected to be able to append to fixed capacity dynamic array") + testing.expect(t, append(&array, 1) != 1, "Expected to fail appending to full fixed capacity dynamic array") + testing.expect(t, append(&array, 1, 2) != 2, "Expected to fail appending multiple elements to full fixed capacity dynamic array") clear(&array) testing.expect(t, slice_equal(array[:], []int { })) - testing.expect(t, append(&array, 1, 2, 3) == false, "Expected to fail appending multiple elements to empty small array") + testing.expect(t, append(&array, 1, 2, 3) != 3, "Expected to fail appending multiple elements to empty fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { })) - testing.expect(t, append(&array, 1, 2), "Expected to be able to append multiple elements to empty small array") + testing.expect(t, append(&array, 1, 2) == 2, "Expected to be able to append multiple elements to empty fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 1, 2 })) } From fac847101983b2f9402ab419937bba51e531cbfc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 16:59:11 +0000 Subject: [PATCH 659/766] Fix typos --- base/runtime/core_builtin.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 7fa9ab4c8..268ac6d33 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -171,7 +171,7 @@ remove_range_dynamic_array :: proc(array: ^$D/[dynamic]$T, #any_int lo, hi: int, // Note: If you want the elements to remain in their order, use `ordered_remove`. // Note: If the index is out of bounds, this procedure will panic. @builtin -unordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { +unordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$E, #any_int index: int, loc := #caller_location) #no_bounds_check { bounds_check_error_loc(loc, index, len(array)) n := len(array)-1 if index != n { @@ -185,7 +185,7 @@ unordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T // Note: If the elements do not have to remain in their order, prefer `unordered_remove`. // Note: If the index is out of bounds, this procedure will panic. @builtin -ordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { +ordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$E, #any_int index: int, loc := #caller_location) #no_bounds_check { bounds_check_error_loc(loc, index, len(array)) if index+1 < len(array) { copy(array[index:], array[index+1:]) @@ -198,7 +198,7 @@ ordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, // Note: This is an O(N) operation. // Note: If the range is out of bounds, this procedure will panic. @builtin -remove_range_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int lo, hi: int, loc := #caller_location) #no_bounds_check { +remove_range_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$E, #any_int lo, hi: int, loc := #caller_location) #no_bounds_check { slice_expr_error_lo_hi_loc(loc, lo, hi, len(array)) n := max(hi-lo, 0) if n > 0 { @@ -1405,7 +1405,7 @@ resize_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; size_of_elem :: size_of(E) num_reused := min(N, length) - raw.len - intrinsics.mem_zero(([^]byte)(a.data)[raw.len*size_of_elem:], num_reused*size_of_elem) + intrinsics.mem_zero(([^]byte)(raw.data)[raw.len*size_of_elem:], num_reused*size_of_elem) } new_length := clamp(length, 0, N) raw.len = new_length From 6c61b1d46ca4492915876cfbe06ec0ed7b422e24 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 16:59:58 +0000 Subject: [PATCH 660/766] Remove `loc` being passed --- base/runtime/core_builtin.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 268ac6d33..9bc476d1f 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -1059,7 +1059,7 @@ inject_at_elem_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, m :: 1 new_size := n + m - resize(array, new_size, loc) or_return + resize(array, new_size) or_return when size_of(E) != 0 { copy(array[index + m:], array[index:]) array[index] = arg @@ -1084,7 +1084,7 @@ inject_at_elems_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, m := len(args) new_size := n + m - resize(array, new_size, loc) or_return + resize(array, new_size) or_return when size_of(E) != 0 { copy(array[index + m:], array[index:]) copy(array[index:], args) @@ -1109,7 +1109,7 @@ inject_at_elem_string_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; m := len(arg) new_size := n + m - resize(array, new_size, loc) or_return + resize(array, new_size) or_return copy(array[index+m:], array[index:]) copy(array[index:], arg) return true From 26eb58b589e36689c37217c4c70fa566cf7afa41 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 17:03:07 +0000 Subject: [PATCH 661/766] Move `raw` closer to usage --- base/runtime/core_builtin.odin | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 9bc476d1f..99705b0c3 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -1400,13 +1400,14 @@ resize_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; if array == nil { return false } - raw := (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array) - if raw.len < length { + if len(array) < length { size_of_elem :: size_of(E) - num_reused := min(N, length) - raw.len - intrinsics.mem_zero(([^]byte)(raw.data)[raw.len*size_of_elem:], num_reused*size_of_elem) + num_reused := min(N, length) - len(array) + intrinsics.mem_zero(([^]byte)(array)[len(array)*size_of_elem:], num_reused*size_of_elem) } + + raw := (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array) new_length := clamp(length, 0, N) raw.len = new_length return true From c7308d86d4fb5ddd066c1bc97629b2bb44259063 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 17:33:54 +0000 Subject: [PATCH 662/766] Fix tests as they are not direct matches to `small_array` --- base/runtime/core_builtin.odin | 2 +- .../container/test_fixed_capacity_dynamic_array.odin | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 99705b0c3..ad3420770 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -879,7 +879,7 @@ append_fixed_capacity_elems :: proc "contextless" (array: ^$T/[dynamic; $N]$E, # Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) raw := (^Raw)(array) - n = min(N - len(args), len(args)) + n = min(N - len(array), len(args)) when size_of(E) != 0 { for i in 0.. Date: Thu, 12 Mar 2026 17:39:44 +0000 Subject: [PATCH 663/766] Add intrinsics `type_fixed_capacity_dynamic_array_len_offset` and `type_is_fixed_capacity_dynamic_array` --- base/intrinsics/intrinsics.odin | 3 +++ src/check_builtin.cpp | 26 ++++++++++++++++++++++++++ src/checker_builtin_procs.hpp | 6 ++++++ src/types.cpp | 3 ++- 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index f06dbdfbf..a4a761f44 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -180,6 +180,7 @@ type_is_bit_set :: proc($T: typeid) -> bool --- type_is_bit_field :: proc($T: typeid) -> bool --- type_is_simd_vector :: proc($T: typeid) -> bool --- type_is_matrix :: proc($T: typeid) -> bool --- +type_is_fixed_capacity_dynamic_array :: proc($T: typeid) -> bool --- type_has_nil :: proc($T: typeid) -> bool --- @@ -222,6 +223,8 @@ type_is_superset_of :: proc($Super, $Sub: typeid) -> bool --- type_field_index_of :: proc($T: typeid, $name: string) -> uintptr --- +type_fixed_capacity_dynamic_array_len_offset :: proc($T: typeid/[dynamic; $N]$E) -> uintptr --- + // "Contiguous" means that the set of enum constants, when sorted, have a difference of either 0 or 1 between consecutive values. // This is the exact opposite of "sparse". type_enum_is_contiguous :: proc($T: typeid) -> bool where type_is_enum(T) --- diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 02826a209..186c0bd67 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -58,6 +58,7 @@ gb_global BuiltinTypeIsProc *builtin_type_is_procs[BuiltinProc__type_simple_bool is_type_simd_vector, is_type_matrix, is_type_raw_union, + is_type_fixed_capacity_dynamic_array, is_type_polymorphic_record_specialized, is_type_polymorphic_record_unspecialized, @@ -7628,6 +7629,31 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } break; + case BuiltinProc_type_fixed_capacity_dynamic_array_len_offset: + { + Operand op = {}; + Type *bt = check_type(c, ce->args[0]); + Type *type = base_type(bt); + if (type == nullptr || type == t_invalid) { + error(ce->args[0], "Expected a fixed capacity dynamic array type for '%.*s'", LIT(builtin_name)); + return false; + } + if (!is_type_fixed_capacity_dynamic_array(type)) { + error(ce->args[0], "Expected a fixed capacity dynamic array type for '%.*s'", LIT(builtin_name)); + return false; + } + + i64 sz = type_size_of(type); + gb_unused(sz); + i64 offset = type_offset_of(type, 1); + + operand->mode = Addressing_Constant; + operand->value = exact_value_u64(cast(u64)offset); + operand->type = t_uintptr; + break; + } + break; + case BuiltinProc_type_bit_set_backing_type: { Operand op = {}; diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index a13ffc3cd..107f333fd 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -297,6 +297,7 @@ BuiltinProc__type_simple_boolean_begin, BuiltinProc_type_is_simd_vector, BuiltinProc_type_is_matrix, BuiltinProc_type_is_raw_union, + BuiltinProc_type_is_fixed_capacity_dynamic_array, BuiltinProc_type_is_specialized_polymorphic_record, @@ -342,6 +343,8 @@ BuiltinProc__type_simple_boolean_end, BuiltinProc_type_field_index_of, + BuiltinProc_type_fixed_capacity_dynamic_array_len_offset, + BuiltinProc_type_bit_set_backing_type, BuiltinProc_type_enum_is_contiguous, @@ -674,6 +677,7 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("type_is_simd_vector"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_matrix"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_raw_union"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("type_is_fixed_capacity_dynamic_array"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_specialized_polymorphic_record"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_unspecialized_polymorphic_record"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, @@ -717,6 +721,8 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("type_field_index_of"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("type_fixed_capacity_dynamic_array_len_offset"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("type_bit_set_backing_type"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_enum_is_contiguous"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics }, diff --git a/src/types.cpp b/src/types.cpp index 73563968d..1fb274f6a 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -4755,8 +4755,9 @@ gb_internal i64 type_offset_of(Type *t, i64 index, Type **field_type_) { case 1: // len if (field_type_) *field_type_ = t_int; { + i64 elem_size = type_size_of(t->FixedCapacityDynamicArray.elem); i64 offset = 0; - offset = type_size_of(alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity)); + offset = elem_size * t->FixedCapacityDynamicArray.capacity; offset = align_formula(offset, build_context.int_size); return offset; } From fa72a38036f89b3dae8856868e349c9e72ac347e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 17:44:05 +0000 Subject: [PATCH 664/766] Add fixed capacity dynamic array stuff to `core:reflect` --- core/reflect/iterator.odin | 9 +++++++++ core/reflect/reflect.odin | 18 ++++++++++++++++++ core/reflect/types.odin | 9 +++++++++ 3 files changed, 36 insertions(+) diff --git a/core/reflect/iterator.odin b/core/reflect/iterator.odin index e96019f68..d283f190f 100644 --- a/core/reflect/iterator.odin +++ b/core/reflect/iterator.odin @@ -44,6 +44,15 @@ iterate_array :: proc(val: any, it: ^int) -> (elem: any, index: int, ok: bool) { index = it^ it^ += 1 } + case Type_Info_Fixed_Capacity_Dynamic_Array: + count := (^int)(uintptr(val.data) + info.len_offset)^ + if it^ < count { + elem.data = rawptr(uintptr(val.data) + uintptr(it^ * info.elem_size)) + elem.id = info.elem.id + ok = true + index = it^ + it^ += 1 + } } return diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index 924120464..a0cc468f2 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -218,6 +218,7 @@ typeid_elem :: proc(id: typeid) -> typeid { case Type_Info_Slice: return v.elem.id case Type_Info_Dynamic_Array: return v.elem.id case Type_Info_Simd_Vector: return v.elem.id + case Type_Info_Fixed_Capacity_Dynamic_Array: return v.elem.id } return id } @@ -308,6 +309,9 @@ length :: proc(val: any) -> int { case Type_Info_Dynamic_Array: return (^runtime.Raw_Dynamic_Array)(val.data).len + case Type_Info_Fixed_Capacity_Dynamic_Array: + return (^int)(uintptr(val.data) + a.len_offset)^ + case Type_Info_Map: return runtime.map_len((^runtime.Raw_Map)(val.data)^) @@ -360,6 +364,9 @@ capacity :: proc(val: any) -> int { case Type_Info_Dynamic_Array: return (^runtime.Raw_Dynamic_Array)(val.data).cap + case Type_Info_Fixed_Capacity_Dynamic_Array: + return a.capacity + case Type_Info_Map: return runtime.map_cap((^runtime.Raw_Map)(val.data)^) @@ -420,6 +427,13 @@ index :: proc(val: any, i: int, loc := #caller_location) -> any { data := rawptr(uintptr(raw.data) + offset) return any{data, a.elem.id} + case Type_Info_Fixed_Capacity_Dynamic_Array: + count := (^int)(uintptr(val.data) + a.len_offset)^ + runtime.bounds_check_error_loc(loc, i, count) + offset := uintptr(a.elem.size * i) + data := rawptr(uintptr(val.data) + offset) + return any{data, a.elem.id} + case Type_Info_String: if a.is_cstring { return nil } @@ -1776,6 +1790,10 @@ as_raw_data :: proc(a: any) -> (value: rawptr, valid: bool) { valid = true value = (^runtime.Raw_Slice)(a.data).data + case Type_Info_Fixed_Capacity_Dynamic_Array: + valid = true + value = a.data + case Type_Info_Dynamic_Array: valid = true value = (^runtime.Raw_Dynamic_Array)(a.data).data diff --git a/core/reflect/types.odin b/core/reflect/types.odin index ff78708e3..079a4a172 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -433,6 +433,13 @@ is_simd_vector :: proc(info: ^Type_Info) -> bool { _, ok := type_info_base(info).variant.(Type_Info_Simd_Vector) return ok } +// Returns true when the type is a dynamic-array type ([dynamic]T), false otherwise. +@(require_results) +is_fixed_capacity_dynamic_array :: proc(info: ^Type_Info) -> bool { + if info == nil { return false } + _, ok := type_info_base(info).variant.(Type_Info_Fixed_Capacity_Dynamic_Array) + return ok +} // Returns true when the core-type is represented with a platform-native endian type, and returns false otherwise. @@ -840,6 +847,8 @@ has_no_indirections :: proc(ti: ^Type_Info) -> bool { return has_no_indirections(info.elem) case Type_Info_Enumerated_Array: return has_no_indirections(info.elem) + case Type_Info_Fixed_Capacity_Dynamic_Array: + return has_no_indirections(info.elem) case Type_Info_Simd_Vector: return true From 27667ce36bf76e39aad3becf469a6fbcbb2d85fe Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 13 Mar 2026 11:54:15 +0100 Subject: [PATCH 665/766] =?UTF-8?q?`iff`=20->=20`if=20and=20only=20if=20(?= =?UTF-8?q?=E2=9F=BA)`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/runtime/core.odin | 2 +- base/runtime/core_builtin.odin | 8 ++++---- .../random_generator_chacha8_simd256.odin | 2 +- core/bufio/reader.odin | 2 +- core/bufio/writer.odin | 2 +- core/bytes/bytes.odin | 4 ++-- core/container/avl/avl.odin | 18 ++++++++--------- core/container/rbtree/rbtree.odin | 20 +++++++++---------- core/crypto/_aes/hw_intel/api.odin | 2 +- .../_chacha20/simd128/chacha20_simd128.odin | 2 +- .../_chacha20/simd256/chacha20_simd256.odin | 2 +- core/crypto/_fiat/field_p256r1/field.odin | 2 +- core/crypto/_fiat/field_p384r1/field.odin | 2 +- core/crypto/_subtle/subtle.odin | 10 +++++----- core/crypto/aead/aead.odin | 2 +- core/crypto/aead/low_level.odin | 2 +- core/crypto/aegis/aegis.odin | 2 +- core/crypto/aegis/aegis_impl_hw_gen.odin | 2 +- core/crypto/aegis/aegis_impl_hw_intel.odin | 2 +- core/crypto/aes/aes_gcm.odin | 2 +- core/crypto/aes/aes_impl_hw_gen.odin | 2 +- core/crypto/aes/aes_impl_hw_intel.odin | 2 +- core/crypto/blake2b/blake2b.odin | 2 +- core/crypto/blake2s/blake2s.odin | 2 +- .../chacha20poly1305/chacha20poly1305.odin | 2 +- core/crypto/crypto.odin | 14 ++++++------- core/crypto/deoxysii/deoxysii.odin | 2 +- .../crypto/deoxysii/deoxysii_impl_hw_gen.odin | 2 +- .../deoxysii/deoxysii_impl_hw_intel.odin | 2 +- core/crypto/ecdh/ecdh.odin | 10 +++++----- core/crypto/ecdsa/ecdsa.odin | 10 +++++----- core/crypto/ecdsa/ecdsa_asn1.odin | 2 +- core/crypto/ecdsa/ecdsa_verify.odin | 4 ++-- core/crypto/ed25519/ed25519.odin | 10 +++++----- core/crypto/hash/low_level.odin | 2 +- core/crypto/hmac/hmac.odin | 2 +- core/crypto/kmac/kmac.odin | 2 +- core/crypto/legacy/keccak/keccak.odin | 2 +- core/crypto/legacy/md5/md5.odin | 2 +- core/crypto/legacy/sha1/sha1.odin | 2 +- core/crypto/pbkdf2/pbkdf2.odin | 2 +- core/crypto/poly1305/poly1305.odin | 2 +- core/crypto/ristretto255/ristretto255.odin | 10 +++++----- .../ristretto255/ristretto255_scalar.odin | 4 ++-- core/crypto/sha2/sha2.odin | 2 +- core/crypto/sha2/sha2_impl_hw_gen.odin | 2 +- core/crypto/sha2/sha2_impl_hw_intel.odin | 2 +- core/crypto/sha3/sha3.odin | 2 +- core/crypto/sm3/sm3.odin | 2 +- core/crypto/tuplehash/tuplehash.odin | 2 +- core/io/io.odin | 2 +- core/sys/darwin/Foundation/NSBlock.odin | 2 +- src/check_expr.cpp | 6 +++--- src/llvm_backend_expr.cpp | 4 ++-- vendor/lua/5.4/include/luaconf.h | 2 +- vendor/portmidi/portmidi.odin | 4 ++-- 56 files changed, 109 insertions(+), 109 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 983f104e3..e2ed78452 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -141,7 +141,7 @@ Type_Info_Struct :: struct { flags: Type_Info_Struct_Flags, - // These are only set iff this structure is an SOA structure + // These are only set if and only if (⟺) this structure is an SOA structure soa_kind: Type_Info_Struct_Soa_Kind, soa_len: i32, soa_base_type: ^Type_Info, diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 974b2f048..4d8b493f7 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -1094,7 +1094,7 @@ card :: proc "contextless" (s: $S/bit_set[$E; $U]) -> int { -// Evaluates the condition and panics the program iff the condition is false. +// Evaluates the condition and panics the program if and only if (⟺) the condition is false. // This uses the `context.assertion_failure_procedure` to assert. // // This routine will be ignored when `ODIN_DISABLE_ASSERT` is true. @@ -1118,7 +1118,7 @@ assert :: proc(condition: bool, message := #caller_expression(condition), loc := } } -// Evaluates the condition and panics the program iff the condition is false. +// Evaluates the condition and panics the program if and only if (⟺) the condition is false. // This uses the `context.assertion_failure_procedure` to assert. // This routine ignores `ODIN_DISABLE_ASSERT`, and will always execute. @builtin @@ -1158,7 +1158,7 @@ unimplemented :: proc(message := "", loc := #caller_location) -> ! { p("not yet implemented", message, loc) } -// Evaluates the condition and panics the program iff the condition is false. +// Evaluates the condition and panics the program if and only if (⟺) the condition is false. // This uses the `default_assertion_contextless_failure_proc` to assert. // // This routine will be ignored when `ODIN_DISABLE_ASSERT` is true. @@ -1178,7 +1178,7 @@ assert_contextless :: proc "contextless" (condition: bool, message := #caller_ex } } -// Evaluates the condition and panics the program iff the condition is false. +// Evaluates the condition and panics the program if and only if (⟺) the condition is false. // This uses the `default_assertion_contextless_failure_proc` to assert. @builtin ensure_contextless :: proc "contextless" (condition: bool, message := #caller_expression(condition), loc := #caller_location) { diff --git a/base/runtime/random_generator_chacha8_simd256.odin b/base/runtime/random_generator_chacha8_simd256.odin index c0985f456..f2ccb6934 100644 --- a/base/runtime/random_generator_chacha8_simd256.odin +++ b/base/runtime/random_generator_chacha8_simd256.odin @@ -136,7 +136,7 @@ chacha8rand_refill_simd256 :: proc(r: ^Default_Random_State) { // // LLVM appears not to consider "this instruction is totally // awful on the given microarchitcture", which leads to - // `VPCOMPRESSED` being generated iff AVX512 support is + // `VPCOMPRESSED` being generated if and only if (⟺) AVX512 support is // enabled for `intrinsics.simd_masked_compress_store`. // On Zen 4, this leads to a 50% performance regression vs // the 128-bit SIMD code. diff --git a/core/bufio/reader.odin b/core/bufio/reader.odin index 8e30542f1..e361612d2 100644 --- a/core/bufio/reader.odin +++ b/core/bufio/reader.odin @@ -45,7 +45,7 @@ reader_init_with_buf :: proc(b: ^Reader, rd: io.Reader, buf: []byte) { b.buf = buf } -// reader_destroy destroys the underlying buffer with its associated allocator IFF that allocator has been set +// reader_destroy destroys the underlying buffer with its associated allocator if and only if (⟺) that allocator has been set reader_destroy :: proc(b: ^Reader) { delete(b.buf, b.buf_allocator) b^ = {} diff --git a/core/bufio/writer.odin b/core/bufio/writer.odin index 666c05b67..9d5ef3481 100644 --- a/core/bufio/writer.odin +++ b/core/bufio/writer.odin @@ -35,7 +35,7 @@ writer_init_with_buf :: proc(b: ^Writer, wr: io.Writer, buf: []byte) { b.buf = buf } -// writer_destroy destroys the underlying buffer with its associated allocator IFF that allocator has been set +// writer_destroy destroys the underlying buffer with its associated allocator if and only if (⟺) that allocator has been set writer_destroy :: proc(b: ^Writer) { delete(b.buf, b.buf_allocator) b^ = {} diff --git a/core/bytes/bytes.odin b/core/bytes/bytes.odin index 33978b3df..55eca5386 100644 --- a/core/bytes/bytes.odin +++ b/core/bytes/bytes.odin @@ -1460,7 +1460,7 @@ fields_proc :: proc(s: []byte, f: proc(rune) -> bool, allocator := context.alloc return subslices[:] } -// alias returns true iff a and b have a non-zero length, and any part of +// alias returns true if and only if (⟺) a and b have a non-zero length, and any part of // a overlaps with b. alias :: proc "contextless" (a, b: []byte) -> bool { a_len, b_len := len(a), len(b) @@ -1474,7 +1474,7 @@ alias :: proc "contextless" (a, b: []byte) -> bool { return a_start <= b_end && b_start <= a_end } -// alias_inexactly returns true iff a and b have a non-zero length, +// alias_inexactly returns true if and only if (⟺) a and b have a non-zero length, // the base pointer of a and b are NOT equal, and any part of a overlaps // with b (ie: `alias(a, b)` with an exception that returns false for // `a == b`, `b = a[:len(a)-69]` and similar conditions). diff --git a/core/container/avl/avl.odin b/core/container/avl/avl.odin index 6c7216c29..1208cd213 100644 --- a/core/container/avl/avl.odin +++ b/core/container/avl/avl.odin @@ -100,20 +100,20 @@ len :: proc "contextless" (t: ^$T/Tree($Value)) -> int { return t._size } -// first returns the first node in the tree (in-order) or nil iff +// first returns the first node in the tree (in-order) or nil if and only if (⟺) // the tree is empty. first :: proc "contextless" (t: ^$T/Tree($Value)) -> ^Node(Value) { return tree_first_or_last_in_order(t, Direction.Backward) } -// last returns the last element in the tree (in-order) or nil iff +// last returns the last element in the tree (in-order) or nil if and only if (⟺) // the tree is empty. last :: proc "contextless" (t: ^$T/Tree($Value)) -> ^Node(Value) { return tree_first_or_last_in_order(t, Direction.Forward) } // find finds the value in the tree, and returns the corresponding -// node or nil iff the value is not present. +// node or nil if and only if (⟺) the value is not present. find :: proc(t: ^$T/Tree($Value), value: Value) -> ^Node(Value) { cur := t._root descend_loop: for cur != nil { @@ -168,7 +168,7 @@ find_or_insert :: proc( return } -// remove removes a node or value from the tree, and returns true iff the +// remove removes a node or value from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's value will be left intact, // the node itself will be freed via the tree's node allocator. remove :: proc { @@ -176,7 +176,7 @@ remove :: proc { remove_node, } -// remove_value removes a value from the tree, and returns true iff the +// remove_value removes a value from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's value will be left intact, // the node itself will be freed via the tree's node allocator. remove_value :: proc(t: ^$T/Tree($Value), value: Value, call_on_remove: bool = true) -> bool { @@ -187,7 +187,7 @@ remove_value :: proc(t: ^$T/Tree($Value), value: Value, call_on_remove: bool = t return remove_node(t, n, call_on_remove) } -// remove_node removes a node from the tree, and returns true iff the +// remove_node removes a node from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's value will be left intact, // the node itself will be freed via the tree's node allocator. remove_node :: proc(t: ^$T/Tree($Value), node: ^Node(Value), call_on_remove: bool = true) -> bool { @@ -281,14 +281,14 @@ iterator_from_pos :: proc "contextless" ( } // iterator_get returns the node currently pointed to by the iterator, -// or nil iff the node has been removed, the tree is empty, or the end +// or nil if and only if (⟺) the node has been removed, the tree is empty, or the end // of the tree has been reached. iterator_get :: proc "contextless" (it: ^$I/Iterator($Value)) -> ^Node(Value) { return it._cur } // iterator_remove removes the node currently pointed to by the iterator, -// and returns true iff the removal was successful. Semantics are the +// and returns true if and only if (⟺) the removal was successful. Semantics are the // same as the Tree remove. iterator_remove :: proc(it: ^$I/Iterator($Value), call_on_remove: bool = true) -> bool { if it._cur == nil { @@ -304,7 +304,7 @@ iterator_remove :: proc(it: ^$I/Iterator($Value), call_on_remove: bool = true) - } // iterator_next advances the iterator and returns the (node, true) or -// or (nil, false) iff the end of the tree has been reached. +// or (nil, false) if and only if (⟺) the end of the tree has been reached. // // Note: The first call to iterator_next will return the first node instead // of advancing the iterator. diff --git a/core/container/rbtree/rbtree.odin b/core/container/rbtree/rbtree.odin index e892188d7..c138838df 100644 --- a/core/container/rbtree/rbtree.odin +++ b/core/container/rbtree/rbtree.odin @@ -95,19 +95,19 @@ len :: proc "contextless" (t: $T/Tree($Key, $Value)) -> (node_count: int) { return t._size } -// first returns the first node in the tree (in-order) or nil iff +// first returns the first node in the tree (in-order) or nil if and only if (⟺) // the tree is empty. first :: proc "contextless" (t: ^$T/Tree($Key, $Value)) -> ^Node(Key, Value) { return tree_first_or_last_in_order(t, Direction.Backward) } -// last returns the last element in the tree (in-order) or nil iff +// last returns the last element in the tree (in-order) or nil if and only if (⟺) // the tree is empty. last :: proc "contextless" (t: ^$T/Tree($Key, $Value)) -> ^Node(Key, Value) { return tree_first_or_last_in_order(t, Direction.Forward) } -// find finds the key in the tree, and returns the corresponding node, or nil iff the value is not present. +// find finds the key in the tree, and returns the corresponding node, or nil if and only if (⟺) the value is not present. find :: proc(t: $T/Tree($Key, $Value), key: Key) -> (node: ^Node(Key, Value)) { node = t._root for node != nil { @@ -120,7 +120,7 @@ find :: proc(t: $T/Tree($Key, $Value), key: Key) -> (node: ^Node(Key, Value)) { return node } -// find_value finds the key in the tree, and returns the corresponding value, or nil iff the value is not present. +// find_value finds the key in the tree, and returns the corresponding value, or nil if and only if (⟺) the value is not present. find_value :: proc(t: $T/Tree($Key, $Value), key: Key) -> (value: Value, ok: bool) #optional_ok { if n := find(t, key); n != nil { return n.value, true @@ -154,7 +154,7 @@ find_or_insert :: proc(t: ^$T/Tree($Key, $Value), key: Key, value: Value) -> (n: return n, true, nil } -// remove removes a node or value from the tree, and returns true iff the +// remove removes a node or value from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's value will be left intact, // the node itself will be freed via the tree's node allocator. remove :: proc { @@ -162,7 +162,7 @@ remove :: proc { remove_node, } -// remove_value removes a value from the tree, and returns true iff the +// remove_value removes a value from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's key + value will be left intact, // the node itself will be freed via the tree's node allocator. remove_key :: proc(t: ^$T/Tree($Key, $Value), key: Key, call_on_remove := true) -> bool { @@ -173,7 +173,7 @@ remove_key :: proc(t: ^$T/Tree($Key, $Value), key: Key, call_on_remove := true) return remove_node(t, n, call_on_remove) } -// remove_node removes a node from the tree, and returns true iff the +// remove_node removes a node from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's key + value will be left intact, // the node itself will be freed via the tree's node allocator. remove_node :: proc(t: ^$T/Tree($Key, $Value), node: ^$N/Node(Key, Value), call_on_remove := true) -> (found: bool) { @@ -235,14 +235,14 @@ iterator_from_pos :: proc "contextless" (t: ^$T/Tree($Key, $Value), pos: ^Node(K } // iterator_get returns the node currently pointed to by the iterator, -// or nil iff the node has been removed, the tree is empty, or the end +// or nil if and only if (⟺) the node has been removed, the tree is empty, or the end // of the tree has been reached. iterator_get :: proc "contextless" (it: ^$I/Iterator($Key, $Value)) -> ^Node(Key, Value) { return it._cur } // iterator_remove removes the node currently pointed to by the iterator, -// and returns true iff the removal was successful. Semantics are the +// and returns true if and only if (⟺) the removal was successful. Semantics are the // same as the Tree remove. iterator_remove :: proc(it: ^$I/Iterator($Key, $Value), call_on_remove: bool = true) -> bool { if it._cur == nil { @@ -258,7 +258,7 @@ iterator_remove :: proc(it: ^$I/Iterator($Key, $Value), call_on_remove: bool = t } // iterator_next advances the iterator and returns the (node, true) or -// or (nil, false) iff the end of the tree has been reached. +// or (nil, false) if and only if (⟺) the end of the tree has been reached. // // Note: The first call to iterator_next will return the first node instead // of advancing the iterator. diff --git a/core/crypto/_aes/hw_intel/api.odin b/core/crypto/_aes/hw_intel/api.odin index ce769fc10..9547d8f84 100644 --- a/core/crypto/_aes/hw_intel/api.odin +++ b/core/crypto/_aes/hw_intel/api.odin @@ -3,7 +3,7 @@ package aes_hw_intel import "core:sys/info" -// is_supported returns true iff hardware accelerated AES +// is_supported returns true if and only if (⟺) hardware accelerated AES // is supported. is_supported :: proc "contextless" () -> bool { // Note: Everything with AES-NI and PCLMULQDQ has support for diff --git a/core/crypto/_chacha20/simd128/chacha20_simd128.odin b/core/crypto/_chacha20/simd128/chacha20_simd128.odin index 9da0a54ea..fd48074df 100644 --- a/core/crypto/_chacha20/simd128/chacha20_simd128.odin +++ b/core/crypto/_chacha20/simd128/chacha20_simd128.odin @@ -215,7 +215,7 @@ _store_simd128 :: #force_inline proc "contextless" ( intrinsics.unaligned_store((^simd.u32x4)(dst[3:]), v3) } -// is_performant returns true iff the target and current host both support +// is_performant returns true if and only if (⟺) the target and current host both support // "enough" 128-bit SIMD to make this implementation performant. is_performant :: proc "contextless" () -> bool { when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32 || ODIN_ARCH == .amd64 || ODIN_ARCH == .i386 || ODIN_ARCH == .riscv64 { diff --git a/core/crypto/_chacha20/simd256/chacha20_simd256.odin b/core/crypto/_chacha20/simd256/chacha20_simd256.odin index 407fbac56..c2f709aec 100644 --- a/core/crypto/_chacha20/simd256/chacha20_simd256.odin +++ b/core/crypto/_chacha20/simd256/chacha20_simd256.odin @@ -36,7 +36,7 @@ _VEC_ZERO_ONE: simd.u64x4 : {0, 0, 1, 0} @(private = "file") _VEC_TWO: simd.u64x4 : {2, 0, 2, 0} -// is_performant returns true iff the target and current host both support +// is_performant returns true if and only if (⟺) the target and current host both support // "enough" SIMD to make this implementation performant. is_performant :: proc "contextless" () -> bool { req_features :: info.CPU_Features{.avx, .avx2} diff --git a/core/crypto/_fiat/field_p256r1/field.odin b/core/crypto/_fiat/field_p256r1/field.odin index f39bee4a9..f7dd978aa 100644 --- a/core/crypto/_fiat/field_p256r1/field.odin +++ b/core/crypto/_fiat/field_p256r1/field.odin @@ -69,7 +69,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> tmp: Montgomery_Domain_Field_Element = --- fe_sub(&tmp, arg1, arg2) - // This will only underflow iff arg1 == arg2, and we return the borrow, + // This will only underflow if and only if (⟺) arg1 == arg2, and we return the borrow, // which will be 1. is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) diff --git a/core/crypto/_fiat/field_p384r1/field.odin b/core/crypto/_fiat/field_p384r1/field.odin index 5cb5cd05e..2bddff18c 100644 --- a/core/crypto/_fiat/field_p384r1/field.odin +++ b/core/crypto/_fiat/field_p384r1/field.odin @@ -75,7 +75,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> tmp: Montgomery_Domain_Field_Element = --- fe_sub(&tmp, arg1, arg2) - // This will only underflow iff arg1 == arg2, and we return the borrow, + // This will only underflow if and only if (⟺) arg1 == arg2, and we return the borrow, // which will be 1. is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) diff --git a/core/crypto/_subtle/subtle.odin b/core/crypto/_subtle/subtle.odin index 89328072c..454066e4a 100644 --- a/core/crypto/_subtle/subtle.odin +++ b/core/crypto/_subtle/subtle.odin @@ -5,17 +5,17 @@ package _subtle import "core:math/bits" -// byte_eq returns 1 iff a == b, 0 otherwise. +// byte_eq returns 1 if and only if (⟺) a == b, 0 otherwise. @(optimization_mode="none") byte_eq :: proc "contextless" (a, b: byte) -> int { v := a ~ b - // v == 0 iff a == b. The subtraction will underflow, setting the + // v == 0 if and only if (⟺) a == b. The subtraction will underflow, setting the // sign bit, which will get returned. return int((u32(v)-1) >> 31) } -// u64_eq returns 1 iff a == b, 0 otherwise. +// u64_eq returns 1 if and only if (⟺) a == b, 0 otherwise. @(optimization_mode="none") u64_eq :: proc "contextless" (a, b: u64) -> u64 { _, borrow := bits.sub_u64(0, a ~ b, 0) @@ -27,14 +27,14 @@ eq :: proc { u64_eq, } -// u64_is_zero returns 1 iff a == 0, 0 otherwise. +// u64_is_zero returns 1 if and only if (⟺) a == 0, 0 otherwise. @(optimization_mode="none") u64_is_zero :: proc "contextless" (a: u64) -> u64 { _, borrow := bits.sub_u64(a, 1, 0) return borrow } -// u64_is_non_zero returns 1 iff a != 0, 0 otherwise. +// u64_is_non_zero returns 1 if and only if (⟺) a != 0, 0 otherwise. @(optimization_mode="none") u64_is_non_zero :: proc "contextless" (a: u64) -> u64 { is_zero := u64_is_zero(a) diff --git a/core/crypto/aead/aead.odin b/core/crypto/aead/aead.odin index c8f324929..ed14a41f3 100644 --- a/core/crypto/aead/aead.odin +++ b/core/crypto/aead/aead.odin @@ -13,7 +13,7 @@ seal_oneshot :: proc(algo: Algorithm, dst, tag, key, iv, aad, plaintext: []byte, // open authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided algorithm, key, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and ciphertext MUST alias exactly or not at all. diff --git a/core/crypto/aead/low_level.odin b/core/crypto/aead/low_level.odin index c80574a0d..c89d85823 100644 --- a/core/crypto/aead/low_level.odin +++ b/core/crypto/aead/low_level.odin @@ -183,7 +183,7 @@ seal_ctx :: proc(ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) { // open_ctx authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided Context, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and plaintext MUST alias exactly or not at all. diff --git a/core/crypto/aegis/aegis.odin b/core/crypto/aegis/aegis.odin index fbb19f1ae..5aee61767 100644 --- a/core/crypto/aegis/aegis.odin +++ b/core/crypto/aegis/aegis.odin @@ -144,7 +144,7 @@ seal :: proc(ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) { // open authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided Context, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and plaintext MUST alias exactly or not at all. diff --git a/core/crypto/aegis/aegis_impl_hw_gen.odin b/core/crypto/aegis/aegis_impl_hw_gen.odin index 5ec2f3d6e..db38e71bc 100644 --- a/core/crypto/aegis/aegis_impl_hw_gen.odin +++ b/core/crypto/aegis/aegis_impl_hw_gen.odin @@ -7,7 +7,7 @@ ERR_HW_NOT_SUPPORTED :: "crypto/aegis: hardware implementation unsupported" @(private) State_HW :: struct {} -// is_hardware_accelerated returns true iff hardware accelerated AEGIS +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AEGIS // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return false diff --git a/core/crypto/aegis/aegis_impl_hw_intel.odin b/core/crypto/aegis/aegis_impl_hw_intel.odin index 7673b6b28..8b767908c 100644 --- a/core/crypto/aegis/aegis_impl_hw_intel.odin +++ b/core/crypto/aegis/aegis_impl_hw_intel.odin @@ -20,7 +20,7 @@ State_HW :: struct { rate: int, } -// is_hardware_accelerated returns true iff hardware accelerated AEGIS +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AEGIS // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return aes.is_hardware_accelerated() diff --git a/core/crypto/aes/aes_gcm.odin b/core/crypto/aes/aes_gcm.odin index bb87788ac..0acd95d2f 100644 --- a/core/crypto/aes/aes_gcm.odin +++ b/core/crypto/aes/aes_gcm.odin @@ -65,7 +65,7 @@ seal_gcm :: proc(ctx: ^Context_GCM, dst, tag, iv, aad, plaintext: []byte) { // open_gcm authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided Context_GCM, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and plaintext MUST alias exactly or not at all. diff --git a/core/crypto/aes/aes_impl_hw_gen.odin b/core/crypto/aes/aes_impl_hw_gen.odin index 0c9ec6edc..506298751 100644 --- a/core/crypto/aes/aes_impl_hw_gen.odin +++ b/core/crypto/aes/aes_impl_hw_gen.odin @@ -4,7 +4,7 @@ package aes @(private = "file") ERR_HW_NOT_SUPPORTED :: "crypto/aes: hardware implementation unsupported" -// is_hardware_accelerated returns true iff hardware accelerated AES +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AES // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return false diff --git a/core/crypto/aes/aes_impl_hw_intel.odin b/core/crypto/aes/aes_impl_hw_intel.odin index 0f1fa6143..96a1811f3 100644 --- a/core/crypto/aes/aes_impl_hw_intel.odin +++ b/core/crypto/aes/aes_impl_hw_intel.odin @@ -3,7 +3,7 @@ package aes import "core:crypto/_aes/hw_intel" -// is_hardware_accelerated returns true iff hardware accelerated AES +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AES // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return hw_intel.is_supported() diff --git a/core/crypto/blake2b/blake2b.odin b/core/crypto/blake2b/blake2b.odin index 6c2c5c1e9..8cce6dac8 100644 --- a/core/crypto/blake2b/blake2b.odin +++ b/core/crypto/blake2b/blake2b.odin @@ -54,7 +54,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { _blake2.final(ctx, hash, finalize_clone) diff --git a/core/crypto/blake2s/blake2s.odin b/core/crypto/blake2s/blake2s.odin index 902f992b3..35e278f72 100644 --- a/core/crypto/blake2s/blake2s.odin +++ b/core/crypto/blake2s/blake2s.odin @@ -54,7 +54,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { _blake2.final(ctx, hash, finalize_clone) diff --git a/core/crypto/chacha20poly1305/chacha20poly1305.odin b/core/crypto/chacha20poly1305/chacha20poly1305.odin index 0504acab0..c405a2736 100644 --- a/core/crypto/chacha20poly1305/chacha20poly1305.odin +++ b/core/crypto/chacha20poly1305/chacha20poly1305.odin @@ -136,7 +136,7 @@ seal :: proc(ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) { // open authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided Context, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and plaintext MUST alias exactly or not at all. diff --git a/core/crypto/crypto.odin b/core/crypto/crypto.odin index b36bc2004..f4ddbfbe7 100644 --- a/core/crypto/crypto.odin +++ b/core/crypto/crypto.odin @@ -8,15 +8,15 @@ import subtle "core:crypto/_subtle" // Omit large precomputed tables, trading off performance for size. COMPACT_IMPLS: bool : #config(ODIN_CRYPTO_COMPACT, false) -// HAS_RAND_BYTES is true iff the runtime provides a cryptographic +// HAS_RAND_BYTES is true if and only if (⟺) the runtime provides a cryptographic // entropy source. HAS_RAND_BYTES :: runtime.HAS_RAND_BYTES -// compare_constant_time returns 1 iff a and b are equal, 0 otherwise. +// compare_constant_time returns 1 if and only if (⟺) a and b are equal, 0 otherwise. // // The execution time of this routine is constant regardless of the contents // of the slices being compared, as long as the length of the slices is equal. -// If the length of the two slices is different, it will early-return 0. +// If the length of the two slices is dif and only if (⟺)erent, it will early-return 0. compare_constant_time :: proc "contextless" (a, b: []byte) -> int { // If the length of the slices is different, early return. // @@ -31,7 +31,7 @@ compare_constant_time :: proc "contextless" (a, b: []byte) -> int { return compare_byte_ptrs_constant_time(raw_data(a), raw_data(b), n) } -// compare_byte_ptrs_constant_time returns 1 iff the bytes pointed to by +// compare_byte_ptrs_constant_time returns 1 if and only if (⟺) the bytes pointed to by // a and b are equal, 0 otherwise. // // The execution time of this routine is constant regardless of the @@ -46,12 +46,12 @@ compare_byte_ptrs_constant_time :: proc "contextless" (a, b: ^byte, n: int) -> i v |= x[i] ~ y[i] } - // After the loop, v == 0 iff a == b. The subtraction will underflow - // iff v == 0, setting the sign-bit, which gets returned. + // After the loop, v == 0 if and only if (⟺) a == b. The subtraction will underflow + // if and only if (⟺) v == 0, setting the sign-bit, which gets returned. return subtle.eq(0, v) } -// is_zero_constant_time returns 1 iff b is all 0s, 0 otherwise. +// is_zero_constant_time returns 1 if and only if (⟺) b is all 0s, 0 otherwise. is_zero_constant_time :: proc "contextless" (b: []byte) -> int { v: byte for b_ in b { diff --git a/core/crypto/deoxysii/deoxysii.odin b/core/crypto/deoxysii/deoxysii.odin index 829d3d3ad..ffe9b4b32 100644 --- a/core/crypto/deoxysii/deoxysii.odin +++ b/core/crypto/deoxysii/deoxysii.odin @@ -122,7 +122,7 @@ seal :: proc(ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) { // open authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided Context, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and plaintext MUST alias exactly or not at all. diff --git a/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin b/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin index b0705ca62..89dae7229 100644 --- a/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin +++ b/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin @@ -4,7 +4,7 @@ package deoxysii @(private = "file") ERR_HW_NOT_SUPPORTED :: "crypto/deoxysii: hardware implementation unsupported" -// is_hardware_accelerated returns true iff hardware accelerated Deoxys-II +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated Deoxys-II // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return false diff --git a/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin b/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin index cdad16f42..88c569d53 100644 --- a/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin +++ b/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin @@ -21,7 +21,7 @@ _PREFIX_MSG_BLOCK :: x86.__m128i{PREFIX_MSG_BLOCK << PREFIX_SHIFT, 0} @(private = "file") _PREFIX_MSG_FINAL :: x86.__m128i{PREFIX_MSG_FINAL << PREFIX_SHIFT, 0} -// is_hardware_accelerated returns true iff hardware accelerated Deoxys-II +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated Deoxys-II // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return aes.is_hardware_accelerated() diff --git a/core/crypto/ecdh/ecdh.odin b/core/crypto/ecdh/ecdh.odin index af60f5649..6a8f6e466 100644 --- a/core/crypto/ecdh/ecdh.odin +++ b/core/crypto/ecdh/ecdh.odin @@ -104,7 +104,7 @@ Public_Key :: struct { } // private_key_generate uses the system entropy source to generate a new -// Private_Key. This will only fail iff the system entropy source is +// Private_Key. This will only fail if and only if (⟺) the system entropy source is // missing or broken. private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { private_key_clear(priv_key) @@ -142,7 +142,7 @@ private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { } // private_key_set_bytes decodes a byte-encoded private key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. private_key_set_bytes :: proc(priv_key: ^Private_Key, curve: Curve, b: []byte) -> bool { private_key_clear(priv_key) @@ -245,7 +245,7 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { } } -// private_key_equal returns true iff the private keys are equal, +// private_key_equal returns true if and only if (⟺) the private keys are equal, // in constant time. private_key_equal :: proc(p, q: ^Private_Key) -> bool { if p._curve != q._curve { @@ -276,7 +276,7 @@ private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { } // public_key_set_bytes decodes a byte-encoded public key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. public_key_set_bytes :: proc(pub_key: ^Public_Key, curve: Curve, b: []byte) -> bool { public_key_clear(pub_key) @@ -365,7 +365,7 @@ public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { } } -// public_key_equal returns true iff the public keys are equal, +// public_key_equal returns true if and only if (⟺) the public keys are equal, // in constant time. public_key_equal :: proc(p, q: ^Public_Key) -> bool { if p._curve != q._curve { diff --git a/core/crypto/ecdsa/ecdsa.odin b/core/crypto/ecdsa/ecdsa.odin index 241d50987..6c71feef7 100644 --- a/core/crypto/ecdsa/ecdsa.odin +++ b/core/crypto/ecdsa/ecdsa.odin @@ -79,7 +79,7 @@ Public_Key :: struct { } // private_key_generate uses the system entropy source to generate a new -// Private_Key. This will only fail iff the system entropy source is +// Private_Key. This will only fail if and only if (⟺) the system entropy source is // missing or broken. private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { private_key_clear(priv_key) @@ -111,7 +111,7 @@ private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { } // private_key_set_bytes decodes a byte-encoded private key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. private_key_set_bytes :: proc(priv_key: ^Private_Key, curve: Curve, b: []byte) -> bool { private_key_clear(priv_key) @@ -194,7 +194,7 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { } } -// private_key_equal returns true iff the private keys are equal, +// private_key_equal returns true if and only if (⟺) the private keys are equal, // in constant time. private_key_equal :: proc(p, q: ^Private_Key) -> bool { if p._curve != q._curve { @@ -219,7 +219,7 @@ private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { } // public_key_set_bytes decodes a byte-encoded public key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. public_key_set_bytes :: proc(pub_key: ^Public_Key, curve: Curve, b: []byte) -> bool { public_key_clear(pub_key) @@ -296,7 +296,7 @@ public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { } } -// public_key_equal returns true iff the public keys are equal, +// public_key_equal returns true if and only if (⟺) the public keys are equal, // in constant time. public_key_equal :: proc(p, q: ^Public_Key) -> bool { if p._curve != q._curve { diff --git a/core/crypto/ecdsa/ecdsa_asn1.odin b/core/crypto/ecdsa/ecdsa_asn1.odin index 0b423286d..74c9d65e6 100644 --- a/core/crypto/ecdsa/ecdsa_asn1.odin +++ b/core/crypto/ecdsa/ecdsa_asn1.odin @@ -141,7 +141,7 @@ parse_asn1_sig :: proc(sig: []byte) -> (r, s: []byte, ok: bool) { return nil, nil, false } - // DER requires a leading 0 iff the sign bit of the leading byte + // DER requires a leading 0 if and only if (⟺) the sign bit of the leading byte // is set to distinguish between positive and negative integers, // and the minimal length representation. `r` and `s` are always // going to be unsigned, so we validate malformed DER and strip diff --git a/core/crypto/ecdsa/ecdsa_verify.odin b/core/crypto/ecdsa/ecdsa_verify.odin index 6b4e3dd4a..bd973a8df 100644 --- a/core/crypto/ecdsa/ecdsa_verify.odin +++ b/core/crypto/ecdsa/ecdsa_verify.odin @@ -3,7 +3,7 @@ package ecdsa import "core:crypto/hash" import secec "core:crypto/_weierstrass" -// verify_raw returns true iff sig is a valid signature by pub_key over +// verify_raw returns true if and only if (⟺) sig is a valid signature by pub_key over // msg, hased using hash_algo, per the verification procedure specifed // in SEC 1, Version 2.0, Section 4.1.4. // @@ -33,7 +33,7 @@ verify_raw :: proc(pub_key: ^Public_Key, hash_algo: hash.Algorithm, msg, sig: [] panic("crypto/ecdsa: invalid curve") } -// verify_asn1 returns true iff sig is a valid signature by pub_key over +// verify_asn1 returns true if and only if (⟺) sig is a valid signature by pub_key over // msg, hased using hash_algo, per the verification procedure specifed // in SEC 1, Version 2.0, Section 4.1.4. // diff --git a/core/crypto/ed25519/ed25519.odin b/core/crypto/ed25519/ed25519.odin index 817c8d34b..2020c0633 100644 --- a/core/crypto/ed25519/ed25519.odin +++ b/core/crypto/ed25519/ed25519.odin @@ -48,7 +48,7 @@ Public_Key :: struct { } // private_key_generate uses the system entropy source to generate a new -// Private_Key. This will only fail iff the system entropy source is +// Private_Key. This will only fail if and only if (⟺) the system entropy source is // missing or broken. private_key_generate :: proc(priv_key: ^Private_Key) -> bool { private_key_clear(priv_key) @@ -67,7 +67,7 @@ private_key_generate :: proc(priv_key: ^Private_Key) -> bool { } // private_key_set_bytes decodes a byte-encoded private key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. private_key_set_bytes :: proc(priv_key: ^Private_Key, b: []byte) -> bool { if len(b) != PRIVATE_KEY_SIZE { return false @@ -167,7 +167,7 @@ sign :: proc(priv_key: ^Private_Key, msg, sig: []byte) { } // public_key_set_bytes decodes a byte-encoded public key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. public_key_set_bytes :: proc "contextless" (pub_key: ^Public_Key, b: []byte) -> bool { if len(b) != PUBLIC_KEY_SIZE { return false @@ -205,14 +205,14 @@ public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { copy(dst, pub_key._b[:]) } -// public_key_equal returns true iff pub_key is equal to other. +// public_key_equal returns true if and only if (⟺) pub_key is equal to other. public_key_equal :: proc(pub_key, other: ^Public_Key) -> bool { ensure(pub_key._is_initialized && other._is_initialized, "crypto/ed25519: uninitialized public key") return crypto.compare_constant_time(pub_key._b[:], other._b[:]) == 1 } -// verify returns true iff sig is a valid signature by pub_key over msg. +// verify returns true if and only if (⟺) sig is a valid signature by pub_key over msg. // // The optional `allow_small_order_A` parameter will make this // implementation strictly compatible with FIPS 186-5, at the expense of diff --git a/core/crypto/hash/low_level.odin b/core/crypto/hash/low_level.odin index 242eadd5f..44b2a8100 100644 --- a/core/crypto/hash/low_level.odin +++ b/core/crypto/hash/low_level.odin @@ -235,7 +235,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { switch &impl in ctx._impl { diff --git a/core/crypto/hmac/hmac.odin b/core/crypto/hmac/hmac.odin index d28c03b5b..56decc0ef 100644 --- a/core/crypto/hmac/hmac.odin +++ b/core/crypto/hmac/hmac.odin @@ -21,7 +21,7 @@ sum :: proc(algorithm: hash.Algorithm, dst, msg, key: []byte) { } // verify will verify the HMAC tag computed with the specified algorithm -// and key over msg and return true iff the tag is valid. It requires +// and key over msg and return true if and only if (⟺) the tag is valid. It requires // that the tag is correctly sized. verify :: proc(algorithm: hash.Algorithm, tag, msg, key: []byte) -> bool { tag_buf: [hash.MAX_DIGEST_SIZE]byte diff --git a/core/crypto/kmac/kmac.odin b/core/crypto/kmac/kmac.odin index 4ecff4f12..f0c27739a 100644 --- a/core/crypto/kmac/kmac.odin +++ b/core/crypto/kmac/kmac.odin @@ -32,7 +32,7 @@ sum :: proc(sec_strength: int, dst, msg, key, domain_sep: []byte) { } // verify will verify the KMAC tag computed with the specified security -// strength, key and domain separator over msg and return true iff the +// strength, key and domain separator over msg and return true if and only if (⟺) the // tag is valid. verify :: proc(sec_strength: int, tag, msg, key, domain_sep: []byte, allocator := context.temp_allocator) -> bool { derived_tag := make([]byte, len(tag), allocator) diff --git a/core/crypto/legacy/keccak/keccak.odin b/core/crypto/legacy/keccak/keccak.odin index ec6af2565..ffca1c95c 100644 --- a/core/crypto/legacy/keccak/keccak.odin +++ b/core/crypto/legacy/keccak/keccak.odin @@ -77,7 +77,7 @@ update :: proc "contextless" (ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc "contextless" (ctx: ^Context, hash: []byte, finalize_clone: bool = false) { _sha3.final((^_sha3.Context)(ctx), hash, finalize_clone) diff --git a/core/crypto/legacy/md5/md5.odin b/core/crypto/legacy/md5/md5.odin index 399a789ed..4bbc5d32a 100644 --- a/core/crypto/legacy/md5/md5.odin +++ b/core/crypto/legacy/md5/md5.odin @@ -69,7 +69,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { ensure(ctx.is_initialized) diff --git a/core/crypto/legacy/sha1/sha1.odin b/core/crypto/legacy/sha1/sha1.odin index f9adcc3d1..892f893a6 100644 --- a/core/crypto/legacy/sha1/sha1.odin +++ b/core/crypto/legacy/sha1/sha1.odin @@ -76,7 +76,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { ensure(ctx.is_initialized) diff --git a/core/crypto/pbkdf2/pbkdf2.odin b/core/crypto/pbkdf2/pbkdf2.odin index 9d8394031..c27ec4aa2 100644 --- a/core/crypto/pbkdf2/pbkdf2.odin +++ b/core/crypto/pbkdf2/pbkdf2.odin @@ -66,7 +66,7 @@ derive :: proc( dst_blk = dst_blk[h_len:] } - // Instead of rounding l up, just proceass the one extra block iff + // Instead of rounding l up, just proceass the one extra block if and only if (⟺) // r != 0. if r > 0 { tmp: [hash.MAX_DIGEST_SIZE]byte diff --git a/core/crypto/poly1305/poly1305.odin b/core/crypto/poly1305/poly1305.odin index 69e2e3ad3..ed2bec82d 100644 --- a/core/crypto/poly1305/poly1305.odin +++ b/core/crypto/poly1305/poly1305.odin @@ -33,7 +33,7 @@ sum :: proc(dst, msg, key: []byte) { } // verify will verify the Poly1305 tag computed with the key over msg and -// return true iff the tag is valid. It requires that the tag is correctly +// return true if and only if (⟺) the tag is valid. It requires that the tag is correctly // sized. verify :: proc(tag, msg, key: []byte) -> bool { ctx: Context = --- diff --git a/core/crypto/ristretto255/ristretto255.odin b/core/crypto/ristretto255/ristretto255.odin index 3724aee7a..ef899d1da 100644 --- a/core/crypto/ristretto255/ristretto255.odin +++ b/core/crypto/ristretto255/ristretto255.odin @@ -360,7 +360,7 @@ ge_double_scalarmult_generator_vartime :: proc( ge._is_initialized = true } -// ge_cond_negate sets `ge = a` iff `ctrl == 0` and `ge = -a` iff `ctrl == 1`. +// ge_cond_negate sets `ge = a` if and only if (⟺) `ctrl == 0` and `ge = -a` if and only if (⟺) `ctrl == 1`. // Behavior for all other values of ctrl are undefined, ge_cond_negate :: proc(ge, a: ^Group_Element, ctrl: int) { _ge_ensure_initialized([]^Group_Element{a}) @@ -369,7 +369,7 @@ ge_cond_negate :: proc(ge, a: ^Group_Element, ctrl: int) { ge._is_initialized = true } -// ge_cond_assign sets `ge = ge` iff `ctrl == 0` and `ge = a` iff `ctrl == 1`. +// ge_cond_assign sets `ge = ge` if and only if (⟺) `ctrl == 0` and `ge = a` if and only if (⟺) `ctrl == 1`. // Behavior for all other values of ctrl are undefined, ge_cond_assign :: proc(ge, a: ^Group_Element, ctrl: int) { _ge_ensure_initialized([]^Group_Element{ge, a}) @@ -377,7 +377,7 @@ ge_cond_assign :: proc(ge, a: ^Group_Element, ctrl: int) { grp.ge_cond_assign(&ge._p, &a._p, ctrl) } -// ge_cond_select sets `ge = a` iff `ctrl == 0` and `ge = b` iff `ctrl == 1`. +// ge_cond_select sets `ge = a` if and only if (⟺) `ctrl == 0` and `ge = b` if and only if (⟺) `ctrl == 1`. // Behavior for all other values of ctrl are undefined, ge_cond_select :: proc(ge, a, b: ^Group_Element, ctrl: int) { _ge_ensure_initialized([]^Group_Element{a, b}) @@ -386,7 +386,7 @@ ge_cond_select :: proc(ge, a, b: ^Group_Element, ctrl: int) { ge._is_initialized = true } -// ge_equal returns 1 iff `a == b`, and 0 otherwise. +// ge_equal returns 1 if and only if (⟺) `a == b`, and 0 otherwise. @(require_results) ge_equal :: proc(a, b: ^Group_Element) -> int { _ge_ensure_initialized([]^Group_Element{a, b}) @@ -405,7 +405,7 @@ ge_equal :: proc(a, b: ^Group_Element) -> int { return ret } -// ge_is_identity returns 1 iff `ge` is the identity element, and 0 otherwise. +// ge_is_identity returns 1 if and only if (⟺) `ge` is the identity element, and 0 otherwise. @(require_results) ge_is_identity :: proc(ge: ^Group_Element) -> int { return ge_equal(ge, &GE_IDENTITY) diff --git a/core/crypto/ristretto255/ristretto255_scalar.odin b/core/crypto/ristretto255/ristretto255_scalar.odin index 75844b3f4..743e02ef3 100644 --- a/core/crypto/ristretto255/ristretto255_scalar.odin +++ b/core/crypto/ristretto255/ristretto255_scalar.odin @@ -80,13 +80,13 @@ sc_square :: proc "contextless" (sc, a: ^Scalar) { grp.sc_square(sc, a) } -// sc_cond_assign sets `sc = sc` iff `ctrl == 0` and `sc = a` iff `ctrl == 1`. +// sc_cond_assign sets `sc = sc` if and only if (⟺) `ctrl == 0` and `sc = a` if and only if (⟺) `ctrl == 1`. // Behavior for all other values of ctrl are undefined, sc_cond_assign :: proc(sc, a: ^Scalar, ctrl: int) { grp.sc_cond_assign(sc, a, ctrl) } -// sc_equal returns 1 iff `a == b`, and 0 otherwise. +// sc_equal returns 1 if and only if (⟺) `a == b`, and 0 otherwise. @(require_results) sc_equal :: proc(a, b: ^Scalar) -> int { return grp.sc_equal(a, b) diff --git a/core/crypto/sha2/sha2.odin b/core/crypto/sha2/sha2.odin index 36fa4aa02..dc41462e4 100644 --- a/core/crypto/sha2/sha2.odin +++ b/core/crypto/sha2/sha2.odin @@ -191,7 +191,7 @@ update :: proc(ctx: ^$T, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^$T, hash: []byte, finalize_clone: bool = false) { ensure(ctx.is_initialized) diff --git a/core/crypto/sha2/sha2_impl_hw_gen.odin b/core/crypto/sha2/sha2_impl_hw_gen.odin index 85c7f8b28..837d0656d 100644 --- a/core/crypto/sha2/sha2_impl_hw_gen.odin +++ b/core/crypto/sha2/sha2_impl_hw_gen.odin @@ -4,7 +4,7 @@ package sha2 @(private = "file") ERR_HW_NOT_SUPPORTED :: "crypto/sha2: hardware implementation unsupported" -// is_hardware_accelerated_256 returns true iff hardware accelerated +// is_hardware_accelerated_256 returns true if and only if (⟺) hardware accelerated // SHA-224/SHA-256 is supported. is_hardware_accelerated_256 :: proc "contextless" () -> bool { return false diff --git a/core/crypto/sha2/sha2_impl_hw_intel.odin b/core/crypto/sha2/sha2_impl_hw_intel.odin index 83ef58a12..3f6ebb746 100644 --- a/core/crypto/sha2/sha2_impl_hw_intel.odin +++ b/core/crypto/sha2/sha2_impl_hw_intel.odin @@ -49,7 +49,7 @@ K_14 :: simd.u64x2{0x78a5636f748f82ee, 0x8cc7020884c87814} K_15 :: simd.u64x2{0xa4506ceb90befffa, 0xc67178f2bef9a3f7} -// is_hardware_accelerated_256 returns true iff hardware accelerated +// is_hardware_accelerated_256 returns true if and only if (⟺) hardware accelerated // SHA-224/SHA-256 is supported. is_hardware_accelerated_256 :: proc "contextless" () -> bool { req_features :: info.CPU_Features{ diff --git a/core/crypto/sha3/sha3.odin b/core/crypto/sha3/sha3.odin index 2ca70963a..2f8d95092 100644 --- a/core/crypto/sha3/sha3.odin +++ b/core/crypto/sha3/sha3.odin @@ -79,7 +79,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { _sha3.final((^_sha3.Context)(ctx), hash, finalize_clone) diff --git a/core/crypto/sm3/sm3.odin b/core/crypto/sm3/sm3.odin index ac38ca417..6f1d788e0 100644 --- a/core/crypto/sm3/sm3.odin +++ b/core/crypto/sm3/sm3.odin @@ -80,7 +80,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { ensure(ctx.is_initialized) diff --git a/core/crypto/tuplehash/tuplehash.odin b/core/crypto/tuplehash/tuplehash.odin index 5c8d8e39b..a45c1b120 100644 --- a/core/crypto/tuplehash/tuplehash.odin +++ b/core/crypto/tuplehash/tuplehash.odin @@ -31,7 +31,7 @@ write_element :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { _sha3.final_cshake((^_sha3.Context)(ctx), hash, finalize_clone) diff --git a/core/io/io.odin b/core/io/io.odin index 9fae30946..631a232aa 100644 --- a/core/io/io.odin +++ b/core/io/io.odin @@ -436,7 +436,7 @@ copy_buffer :: proc(dst: Writer, src: Reader, buf: []byte) -> (written: i64, err // copy_n copies n bytes (or till an error) from src to dst. // It returns the number of bytes copied and the first error that occurred whilst copying, if any. -// On return, written == n IFF err == nil +// On return, written == n if and only if (⟺) err == nil copy_n :: proc(dst: Writer, src: Reader, n: i64) -> (written: i64, err: Error) { nsrc := limited_reader_init(&Limited_Reader{}, src, n) written, err = copy(dst, nsrc) diff --git a/core/sys/darwin/Foundation/NSBlock.odin b/core/sys/darwin/Foundation/NSBlock.odin index 34e562d75..a5b99abc5 100644 --- a/core/sys/darwin/Foundation/NSBlock.odin +++ b/core/sys/darwin/Foundation/NSBlock.odin @@ -82,7 +82,7 @@ internal_block_literal_make :: proc (is_global: bool, user_data: rawptr, user_pr BLOCK_HAS_COPY_DISPOSE :: 1 << 25 BLOCK_HAS_CTOR :: 1 << 26 // helpers have C++ code BLOCK_IS_GLOBAL :: 1 << 28 - BLOCK_HAS_STRET :: 1 << 29 // IFF BLOCK_HAS_SIGNATURE + BLOCK_HAS_STRET :: 1 << 29 // if and only if (⟺) BLOCK_HAS_SIGNATURE BLOCK_HAS_SIGNATURE :: 1 << 30 bl.isa = is_global ? &_NSConcreteGlobalBlock : &_NSConcreteStackBlock diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 80df35edc..3dd4808c3 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4460,9 +4460,9 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ truncated: r = a - b*trunc(a/b) floored: r = a - b*floor(a/b) - IFF a/0 == 0, then (a%0 == a) or (a%%0 == a) - IFF a/0 == a, then (a%0 == 0) or (a%%0 == 0) - IFF a/0 == 0b111..., then (a%0 == a) or (a%%0 == a) + If and only if (⟺) a/0 == 0, then (a%0 == a) or (a%%0 == a) + If and only if (⟺) a/0 == a, then (a%0 == 0) or (a%%0 == 0) + If and only if (⟺) a/0 == 0b111..., then (a%0 == a) or (a%%0 == a) */ switch (zero_behaviour) { diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 1685f9627..fc68561b3 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1424,8 +1424,8 @@ gb_internal LLVMValueRef lb_integer_modulo(lbProcedure *p, LLVMValueRef lhs, LLV truncated: r = a - b*trunc(a/b) floored: r = a - b*floor(a/b) - IFF a/0 == 0, then (a%0 == a) or (a%%0 == a) - IFF a/0 == a, then (a%0 == 0) or (a%%0 == 0) + If and only if (⟺) a/0 == 0, then (a%0 == a) or (a%%0 == a) + If and only if (⟺) a/0 == a, then (a%0 == 0) or (a%%0 == 0) */ switch (behaviour) { diff --git a/vendor/lua/5.4/include/luaconf.h b/vendor/lua/5.4/include/luaconf.h index 3ad294e4f..fbfa5781b 100644 --- a/vendor/lua/5.4/include/luaconf.h +++ b/vendor/lua/5.4/include/luaconf.h @@ -71,7 +71,7 @@ /* -@@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits. +@@ LUAI_IS32INT is true if and only if (⟺) 'int' has (at least) 32 bits. */ #define LUAI_IS32INT ((UINT_MAX >> 30) >= 3) diff --git a/vendor/portmidi/portmidi.odin b/vendor/portmidi/portmidi.odin index 58d7c2ec2..1f2aca286 100644 --- a/vendor/portmidi/portmidi.odin +++ b/vendor/portmidi/portmidi.odin @@ -119,8 +119,8 @@ DeviceInfo :: struct { structVersion: c.int, /**< this internal structure version */ interf: cstring, /**< underlying MIDI API, e.g. MMSystem or DirectX */ name: cstring, /**< device name, e.g. USB MidiSport 1x1 */ - input: b32, /**< true iff input is available */ - output: b32, /**< true iff output is available */ + input: b32, /**< true if and only if (⟺) input is available */ + output: b32, /**< true if and only if (⟺) output is available */ opened: b32, /**< used by generic PortMidi code to do error checking on arguments */ } From 987aa04d6ca99883483fa5a7098c24e6c6606512 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 13 Mar 2026 11:08:50 +0000 Subject: [PATCH 666/766] Minor formatting improvements, and more use of `or_return` --- core/reflect/types.odin | 113 ++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 56 deletions(-) diff --git a/core/reflect/types.odin b/core/reflect/types.odin index 079a4a172..bda2209ff 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -32,36 +32,36 @@ are_types_identical :: proc(a, b: ^Type_Info) -> bool { return x.signed == y.signed && x.endianness == y.endianness case Type_Info_Rune: - _, ok := b.variant.(Type_Info_Rune) - return ok + _ = b.variant.(Type_Info_Rune) or_return + return true case Type_Info_Float: - _, ok := b.variant.(Type_Info_Float) - return ok + y := b.variant.(Type_Info_Float) or_return + return x.endianness == y.endianness case Type_Info_Complex: - _, ok := b.variant.(Type_Info_Complex) - return ok + _ = b.variant.(Type_Info_Complex) or_return + return true case Type_Info_Quaternion: - _, ok := b.variant.(Type_Info_Quaternion) - return ok + _ = b.variant.(Type_Info_Quaternion) or_return + return true case Type_Info_Type_Id: - _, ok := b.variant.(Type_Info_Type_Id) - return ok + _ = b.variant.(Type_Info_Type_Id) or_return + return true case Type_Info_String: - _, ok := b.variant.(Type_Info_String) - return ok + y := b.variant.(Type_Info_String) or_return + return x.is_cstring == y.is_cstring && x.encoding == y.encoding case Type_Info_Boolean: - _, ok := b.variant.(Type_Info_Boolean) - return ok + _ = b.variant.(Type_Info_Boolean) or_return + return true case Type_Info_Any: - _, ok := b.variant.(Type_Info_Any) - return ok + _ = b.variant.(Type_Info_Any) or_return + return true case Type_Info_Pointer: y := b.variant.(Type_Info_Pointer) or_return @@ -78,22 +78,19 @@ are_types_identical :: proc(a, b: ^Type_Info) -> bool { case Type_Info_Procedure: y := b.variant.(Type_Info_Procedure) or_return - switch { - case x.variadic != y.variadic, - x.convention != y.convention: - return false - } + (x.variadic == y.variadic) or_return + (x.convention == y.convention) or_return return are_types_identical(x.params, y.params) && are_types_identical(x.results, y.results) case Type_Info_Array: y := b.variant.(Type_Info_Array) or_return - if x.count != y.count { return false } + (x.count == y.count) or_return return are_types_identical(x.elem, y.elem) case Type_Info_Enumerated_Array: y := b.variant.(Type_Info_Enumerated_Array) or_return - if x.count != y.count { return false } + (x.count == y.count) or_return return are_types_identical(x.index, y.index) && are_types_identical(x.elem, y.elem) @@ -107,17 +104,15 @@ are_types_identical :: proc(a, b: ^Type_Info) -> bool { case Type_Info_Fixed_Capacity_Dynamic_Array: y := b.variant.(Type_Info_Fixed_Capacity_Dynamic_Array) or_return - if x.capacity != y.capacity { return false } + (x.capacity == y.capacity) or_return return are_types_identical(x.elem, y.elem) case Type_Info_Parameters: y := b.variant.(Type_Info_Parameters) or_return - if len(x.types) != len(y.types) { return false } + (len(x.types) == len(y.types)) or_return for _, i in x.types { xt, yt := x.types[i], y.types[i] - if !are_types_identical(xt, yt) { - return false - } + are_types_identical(xt, yt) or_return } return true @@ -136,59 +131,64 @@ are_types_identical :: proc(a, b: ^Type_Info) -> bool { xt, yt := x.types[i], y.types[i] xl, yl := x.tags[i], y.tags[i] - if xn != yn { return false } - if !are_types_identical(xt, yt) { return false } - if xl != yl { return false } + (xn == yn) or_return + are_types_identical(xt, yt) or_return + (xl == yl) or_return } return true case Type_Info_Union: - y := b.variant.(Type_Info_Union) or_return - if len(x.variants) != len(y.variants) { return false } + y := b.variant.(Type_Info_Union) or_return + (len(x.variants) == len(y.variants)) or_return for _, i in x.variants { xv, yv := x.variants[i], y.variants[i] - if !are_types_identical(xv, yv) { return false } + are_types_identical(xv, yv) or_return } return true case Type_Info_Enum: - // NOTE(bill): Should be handled above - return false + y := b.variant.(Type_Info_Enum) or_return + are_types_identical(x.base, y.base) or_return + (len(x.names) == len(y.names)) or_return + + for _, i in x.names { + (x.names[i] == y.names[i]) or_return + (x.values[i] == y.values[i]) or_return + } + return true case Type_Info_Map: y := b.variant.(Type_Info_Map) or_return return are_types_identical(x.key, y.key) && are_types_identical(x.value, y.value) case Type_Info_Bit_Set: - y := b.variant.(Type_Info_Bit_Set) or_return - return x.elem == y.elem && x.lower == y.lower && x.upper == y.upper + y := b.variant.(Type_Info_Bit_Set) or_return + are_types_identical(x.underlying, y.underlying) or_return + are_types_identical(x.elem, y.elem) or_return + + return x.lower == y.lower && x.upper == y.upper case Type_Info_Simd_Vector: y := b.variant.(Type_Info_Simd_Vector) or_return return x.count == y.count && x.elem == y.elem case Type_Info_Matrix: - y := b.variant.(Type_Info_Matrix) or_return - if x.row_count != y.row_count { return false } - if x.column_count != y.column_count { return false } - if x.layout != y.layout { return false } + y := b.variant.(Type_Info_Matrix) or_return + (x.row_count == y.row_count) or_return + (x.column_count == y.column_count) or_return + (x.layout == y.layout) or_return return are_types_identical(x.elem, y.elem) case Type_Info_Bit_Field: - y := b.variant.(Type_Info_Bit_Field) or_return - if !are_types_identical(x.backing_type, y.backing_type) { return false } - if x.field_count != y.field_count { return false } + y := b.variant.(Type_Info_Bit_Field) or_return + are_types_identical(x.backing_type, y.backing_type) or_return + (x.field_count == y.field_count) or_return + for _, i in x.names[:x.field_count] { - if x.names[i] != y.names[i] { - return false - } - if !are_types_identical(x.types[i], y.types[i]) { - return false - } - if x.bit_sizes[i] != y.bit_sizes[i] { - return false - } + (x.names[i] == y.names[i]) or_return + are_types_identical(x.types[i], y.types[i]) or_return + (x.bit_sizes[i] == y.bit_sizes[i]) or_return } return true } @@ -334,7 +334,8 @@ is_soa_pointer :: proc(info: ^Type_Info) -> bool { is_pointer_internally :: proc(info: ^Type_Info) -> bool { if info == nil { return false } #partial switch v in type_info_base(info).variant { - case Type_Info_Pointer, Type_Info_Multi_Pointer, + case Type_Info_Pointer, + Type_Info_Multi_Pointer, Type_Info_Procedure: return true case Type_Info_String: @@ -674,7 +675,7 @@ write_type_writer :: #force_no_inline proc(w: io.Writer, ti: ^Type_Info, n_writt write_type(w, info.elem, &n) or_return case Type_Info_Fixed_Capacity_Dynamic_Array: - io.write_string(w, "[dynamic;", &n) or_return + io.write_string(w, "[dynamic; ", &n) or_return io.write_i64(w, i64(info.capacity), 10, &n) or_return io.write_string(w, "]", &n) or_return write_type(w, info.elem, &n) or_return From b5801ea5c1402894de66dfef1f2d0b6aae4ae947 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 13 Mar 2026 11:10:28 +0000 Subject: [PATCH 667/766] Handle endianness for floats --- core/reflect/types.odin | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/reflect/types.odin b/core/reflect/types.odin index bda2209ff..c6400eb63 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -454,6 +454,8 @@ is_endian_platform :: proc(info: ^Type_Info) -> bool { #partial switch v in info.variant { case Type_Info_Integer: return v.endianness == .Platform + case Type_Info_Float: + return v.endianness == .Platform case Type_Info_Bit_Set: return is_endian_platform(v.underlying) case Type_Info_Pointer: @@ -476,6 +478,11 @@ is_endian_little :: proc(info: ^Type_Info) -> bool { return ODIN_ENDIAN == .Little } return v.endianness == .Little + case Type_Info_Float: + if v.endianness == .Platform { + return ODIN_ENDIAN == .Little + } + return v.endianness == .Little case Type_Info_Bit_Set: return is_endian_little(v.underlying) case Type_Info_Pointer: @@ -498,6 +505,11 @@ is_endian_big :: proc(info: ^Type_Info) -> bool { return ODIN_ENDIAN == .Big } return v.endianness == .Big + case Type_Info_Float: + if v.endianness == .Platform { + return ODIN_ENDIAN == .Big + } + return v.endianness == .Big case Type_Info_Bit_Set: return is_endian_big(v.underlying) case Type_Info_Pointer: From 004a65e3826740230a4e65a77c1c2273befb3549 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 12 Mar 2026 02:40:20 +0900 Subject: [PATCH 668/766] core/crypto/_aes/hw_intel: Remove a copy of zero_explicit --- .../_aes/hw_intel/hw_intel_keysched.odin | 26 ++----------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin b/core/crypto/_aes/hw_intel/hw_intel_keysched.odin index 96108442d..7b339c5f5 100644 --- a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin +++ b/core/crypto/_aes/hw_intel/hw_intel_keysched.odin @@ -24,6 +24,7 @@ package aes_hw_intel import "base:intrinsics" +import "core:crypto" import "core:crypto/_aes" import "core:simd/x86" @@ -173,28 +174,5 @@ keysched :: proc(ctx: ^Context, key: []byte) { ctx._num_rounds = num_rounds - zero_explicit(&sks, size_of(sks)) + crypto.zero_explicit(&sks, size_of(sks)) } - -/* -Set each byte of a memory range to zero. - -This procedure copies the value `0` into the `len` bytes of a memory range, -starting at address `data`. - -This procedure returns the pointer to `data`. - -Unlike the `zero()` procedure, which can be optimized away or reordered by the -compiler under certain circumstances, `zero_explicit()` procedure can not be -optimized away or reordered with other memory access operations, and the -compiler assumes volatile semantics of the memory. -*/ -zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { - // This routine tries to avoid the compiler optimizing away the call, - // so that it is always executed. It is intended to provide - // equivalent semantics to those provided by the C11 Annex K 3.7.4.1 - // memset_s call. - intrinsics.mem_zero_volatile(data, len) // Use the volatile mem_zero - intrinsics.atomic_thread_fence(.Seq_Cst) // Prevent reordering - return data -} \ No newline at end of file From 48b1f3b8301ad3e0977555bd4e0a4cc8434f4216 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 12 Mar 2026 02:44:21 +0900 Subject: [PATCH 669/766] core/simd/arm: Initial import --- core/simd/arm/aes.odin | 34 ++++++++++++++++++++++++++++++++++ core/simd/arm/doc.odin | 2 ++ core/simd/arm/types.odin | 5 +++++ 3 files changed, 41 insertions(+) create mode 100644 core/simd/arm/aes.odin create mode 100644 core/simd/arm/doc.odin create mode 100644 core/simd/arm/types.odin diff --git a/core/simd/arm/aes.odin b/core/simd/arm/aes.odin new file mode 100644 index 000000000..acafb9f1e --- /dev/null +++ b/core/simd/arm/aes.odin @@ -0,0 +1,34 @@ +#+build arm64,arm32 +package simd_arm + +@(require_results,enable_target_feature="aes") +vaeseq_u8 :: #force_inline proc "c" (data, key: uint8x16_t) -> uint8x16_t { + return _vaeseq_u8(data, key) +} + +@(require_results,enable_target_feature="aes") +vaesdq_u8 :: #force_inline proc "c" (data, key: uint8x16_t) -> uint8x16_t { + return _vaesdq_u8(data, key) +} + +@(require_results,enable_target_feature="aes") +vaesmcq_u8 :: #force_inline proc "c" (data: uint8x16_t) -> uint8x16_t { + return _vaesmcq_u8(data) +} + +@(require_results,enable_target_feature="aes") +vaesimcq_u8 :: #force_inline proc "c" (data: uint8x16_t) -> uint8x16_t { + return _vaesimcq_u8(data) +} + +@(private,default_calling_convention="none") +foreign _ { + @(link_name = "llvm.aarch64.crypto.aese" when ODIN_ARCH == .arm64 else "llvm.arm.neon.aese") + _vaeseq_u8 :: proc(data, key: uint8x16_t) -> uint8x16_t --- + @(link_name = "llvm.aarch64.crypto.aesd" when ODIN_ARCH == .arm64 else "llvm.arm.neon.aesd") + _vaesdq_u8 :: proc(data, key: uint8x16_t) -> uint8x16_t --- + @(link_name = "llvm.aarch64.crypto.aesmc" when ODIN_ARCH == .arm64 else "llvm.arm.neon.aesmc") + _vaesmcq_u8 :: proc(data: uint8x16_t) -> uint8x16_t --- + @(link_name = "llvm.aarch64.crypto.aesimc" when ODIN_ARCH == .arm64 else "llvm.arm.neon.aesimc") + _vaesimcq_u8 :: proc(data: uint8x16_t) -> uint8x16_t --- +} diff --git a/core/simd/arm/doc.odin b/core/simd/arm/doc.odin new file mode 100644 index 000000000..ecedc7bac --- /dev/null +++ b/core/simd/arm/doc.odin @@ -0,0 +1,2 @@ +// `SIMD` intrinsics specific to ARMv8 `arm32` and `arm64` architectures. +package simd_arm \ No newline at end of file diff --git a/core/simd/arm/types.odin b/core/simd/arm/types.odin new file mode 100644 index 000000000..7c86483a7 --- /dev/null +++ b/core/simd/arm/types.odin @@ -0,0 +1,5 @@ +#+build arm64,arm32 +package simd_arm + +uint8x16_t :: #simd[16]u8 +uint32x4_t :: #simd[4]u32 From 6aeed0e20e05ff2c17c7fc17b10fcc9518f3395a Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 12 Mar 2026 20:35:55 +0900 Subject: [PATCH 670/766] core/crypto/_aes/hw: Initial import --- core/crypto/_aes/hw/api.odin | 69 +++++++ .../ghash.odin => hw/ghash_intel.odin} | 2 +- core/crypto/_aes/hw/intrinsics_arm.odin | 115 +++++++++++ core/crypto/_aes/hw/intrinsics_intel.odin | 55 ++++++ core/crypto/_aes/hw/keysched_hw.odin | 181 ++++++++++++++++++ core/crypto/_aes/hw/unsupported.odin | 11 ++ core/crypto/_aes/hw_intel/api.odin | 38 ---- .../_aes/hw_intel/hw_intel_keysched.odin | 178 ----------------- core/crypto/aes/aes_gcm_hw_intel.odin | 20 +- core/crypto/aes/aes_impl_hw_intel.odin | 8 +- 10 files changed, 446 insertions(+), 231 deletions(-) create mode 100644 core/crypto/_aes/hw/api.odin rename core/crypto/_aes/{hw_intel/ghash.odin => hw/ghash_intel.odin} (99%) create mode 100644 core/crypto/_aes/hw/intrinsics_arm.odin create mode 100644 core/crypto/_aes/hw/intrinsics_intel.odin create mode 100644 core/crypto/_aes/hw/keysched_hw.odin create mode 100644 core/crypto/_aes/hw/unsupported.odin delete mode 100644 core/crypto/_aes/hw_intel/api.odin delete mode 100644 core/crypto/_aes/hw_intel/hw_intel_keysched.odin diff --git a/core/crypto/_aes/hw/api.odin b/core/crypto/_aes/hw/api.odin new file mode 100644 index 000000000..09f674657 --- /dev/null +++ b/core/crypto/_aes/hw/api.odin @@ -0,0 +1,69 @@ +package aes_hw + +@(require) import "core:sys/info" + +// is_supported returns true if and only if (⟺) hardware accelerated AES +// is supported. +is_supported :: proc "contextless" () -> bool { + when ODIN_ARCH == .amd64 { + // Note: Everything with AES-NI has support for + // the required SSE extxtensions. + req_features :: info.CPU_Features{ + .sse2, + .ssse3, + .sse41, + .aes, + } + return info.cpu_features() >= req_features + } else when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32 { + req_features :: info.CPU_Features{ + .asimd, + .aes, + } + return info.cpu_features() >= req_features + } else { + return false + } +} + +// is_ghash_supported returns true if and only if (⟺) hardware accelerated +// GHASH is supported. +is_ghash_supported :: proc "contextless" () -> bool { + // Just having hardware GHASH is silly. + if !is_supported() { + return false + } + + when ODIN_ARCH == .amd64 { + return info.cpu_features() >= info.CPU_Features{ + .pclmulqdq, + } + } else when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32{ + // Once we can actually use this, we can re-enable this. + // + // return info.cpu_features() >= info.CPU_Features{ + // .pmull, + // } + return false + } else { + return false + } +} + +// Context is a keyed AES (ECB) instance. +Context :: struct { + // Note: The ideal thing to do is for the expanded round keys to be + // arrays of `u8x16`, however that implies alignment (or using AVX). + // + // All the people using e-waste processors that don't support an + // instruction set that has been around for over 10 years are why + // we can't have nice things. + _sk_exp_enc: [15][16]byte, + _sk_exp_dec: [15][16]byte, + _num_rounds: int, +} + +// init initializes a context for AES with the provided key. +init :: proc(ctx: ^Context, key: []byte) { + keysched(ctx, key) +} diff --git a/core/crypto/_aes/hw_intel/ghash.odin b/core/crypto/_aes/hw/ghash_intel.odin similarity index 99% rename from core/crypto/_aes/hw_intel/ghash.odin rename to core/crypto/_aes/hw/ghash_intel.odin index 5f51b614b..d80816d5d 100644 --- a/core/crypto/_aes/hw_intel/ghash.odin +++ b/core/crypto/_aes/hw/ghash_intel.odin @@ -21,7 +21,7 @@ // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #+build amd64 -package aes_hw_intel +package aes_hw import "base:intrinsics" import "core:crypto/_aes" diff --git a/core/crypto/_aes/hw/intrinsics_arm.odin b/core/crypto/_aes/hw/intrinsics_arm.odin new file mode 100644 index 000000000..ccd8efa8f --- /dev/null +++ b/core/crypto/_aes/hw/intrinsics_arm.odin @@ -0,0 +1,115 @@ +#+build arm64,arm32 +package aes_hw + +import "core:simd" +import "core:simd/arm" + +// https://blog.michaelbrase.com/2018/05/08/emulating-x86-aes-intrinsics-on-armv8-a/ + +TARGET_FEATURES :: "neon,aes" +HAS_GHASH :: false // Temporary + +@(require_results, enable_target_feature = "aes") +aesdec :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return simd.bit_xor(arm.vaesimcq_u8(arm.vaesdq_u8(data, simd.u8x16{})), key) +} + +@(require_results, enable_target_feature = "aes") +aesdeclast :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return simd.bit_xor(arm.vaesdq_u8(data, simd.u8x16{}), key) +} + +@(require_results, enable_target_feature = "aes") +aesenc :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return simd.bit_xor(arm.vaesmcq_u8(arm.vaeseq_u8(data, simd.u8x16{})), key) +} + +@(require_results, enable_target_feature = "aes") +aesenclast :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return simd.bit_xor(arm.vaeseq_u8(data, simd.u8x16{}), key) +} + +aesimc :: arm.vaesimcq_u8 + +@(require_results, enable_target_feature = "aes") +aeskeygenassist :: #force_inline proc "c" (data: simd.u8x16, $IMM8: u8) -> simd.u8x16 { + a := arm.vaeseq_u8(data, simd.u8x16{}) // AESE does ShiftRows and SubBytes on A + + // Undo ShiftRows step from AESE and extract X1 and X3 + dest := simd.swizzle( + a, + 0x04, 0x01, 0x0e, 0x0b, // SubBytes(X1) + 0x01, 0x0e, 0x0b, 0x04, // ROT(SubBytes(X1)) + 0x0c, 0x09, 0x06, 0x03, // SubBytes(X3) + 0x09, 0x06, 0x03, 0x0c, // ROT(SubBytes(X3)) + ) + + rcons := simd.u8x16{ + 0, 0, 0, 0, + IMM8, 0, 0, 0, + 0, 0, 0, 0, + IMM8, 0, 0, 0, + } + + return simd.bit_xor(dest, rcons) +} + +// The keyschedule implementation is easier to read with some extra +// Intel intrinsics that are emulated by built-in LLVM ops anyway. + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_slli_si128 :: #force_inline proc "c" (a: simd.u8x16, $IMM8: u32) -> simd.u8x16 { + shift :: IMM8 & 0xff + + // This needs to emit behavior identical to PSLLDQ which is as follows: + // + // TEMP := COUNT + // IF (TEMP > 15) THEN TEMP := 16; FI + // DEST := DEST << (TEMP * 8) + // DEST[MAXVL-1:128] (Unmodified) + + return simd.shuffle( + simd.u8x16{}, + a, + 0 when shift > 15 else (16 - shift + 0), + 1 when shift > 15 else (16 - shift + 1), + 2 when shift > 15 else (16 - shift + 2), + 3 when shift > 15 else (16 - shift + 3), + 4 when shift > 15 else (16 - shift + 4), + 5 when shift > 15 else (16 - shift + 5), + 6 when shift > 15 else (16 - shift + 6), + 7 when shift > 15 else (16 - shift + 7), + 8 when shift > 15 else (16 - shift + 8), + 9 when shift > 15 else (16 - shift + 9), + 10 when shift > 15 else (16 - shift + 10), + 11 when shift > 15 else (16 - shift + 11), + 12 when shift > 15 else (16 - shift + 12), + 13 when shift > 15 else (16 - shift + 13), + 14 when shift > 15 else (16 - shift + 14), + 15 when shift > 15 else (16 - shift + 15), + ) +} + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_shuffle_epi32 :: #force_inline proc "c" (a: simd.u8x16, $IMM8: u32) -> simd.u8x16 { + v := transmute(simd.i32x4)a + return transmute(simd.u8x16)simd.shuffle( + v, + v, + IMM8 & 0b11, + (IMM8 >> 2) & 0b11, + (IMM8 >> 4) & 0b11, + (IMM8 >> 6) & 0b11, + ) +} + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_shuffle_ps :: #force_inline proc "c" (a, b: simd.u8x16, $MASK: u32) -> simd.u8x16 { + return transmute(simd.u8x16)simd.shuffle( + transmute(simd.u32x4)(a), + transmute(simd.u32x4)(b), + u32(MASK) & 0b11, + (u32(MASK)>>2) & 0b11, + ((u32(MASK)>>4) & 0b11)+4, + ((u32(MASK)>>6) & 0b11)+4) +} diff --git a/core/crypto/_aes/hw/intrinsics_intel.odin b/core/crypto/_aes/hw/intrinsics_intel.odin new file mode 100644 index 000000000..25399dfae --- /dev/null +++ b/core/crypto/_aes/hw/intrinsics_intel.odin @@ -0,0 +1,55 @@ +#+build amd64 +package aes_hw + +import "core:simd" +import "core:simd/x86" + +// Intel/RISC-V semantics. + +TARGET_FEATURES :: "sse,sse2,ssse3,sse4.1,aes" +HAS_GHASH :: true + +@(require_results, enable_target_feature = "aes") +aesdec :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aesdec_si128(transmute(x86.__m128i)(data), transmute(x86.__m128i)(key))) +} + +@(require_results, enable_target_feature = "aes") +aesdeclast :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aesdeclast_si128(transmute(x86.__m128i)(data), transmute(x86.__m128i)(key))) +} + +@(require_results, enable_target_feature = "aes") +aesenc :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aesenc_si128(transmute(x86.__m128i)(data), transmute(x86.__m128i)(key))) +} + +@(require_results, enable_target_feature = "aes") +aesenclast :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aesenclast_si128(transmute(x86.__m128i)(data), transmute(x86.__m128i)(key))) +} + +@(require_results, enable_target_feature = "aes") +aesimc :: #force_inline proc "c" (data: simd.u8x16) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aesimc_si128(transmute(x86.__m128i)(data))) +} + +@(require_results, enable_target_feature = "aes") +aeskeygenassist :: #force_inline proc "c" (data: simd.u8x16, $IMM8: u8) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aeskeygenassist_si128(transmute(x86.__m128i)(data), IMM8)) +} + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_slli_si128 :: #force_inline proc "c" (a: simd.u8x16, $IMM8: u32) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_slli_si128(transmute(x86.__m128i)(a), IMM8)) +} + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_shuffle_epi32 :: #force_inline proc "c" (a: simd.u8x16, $IMM8: u32) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_shuffle_epi32(transmute(x86.__m128i)(a), IMM8)) +} + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_shuffle_ps :: #force_inline proc "c" (a, b: simd.u8x16, $MASK: u32) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_shuffle_ps(transmute(x86.__m128)(a), transmute(x86.__m128)(b), MASK)) +} diff --git a/core/crypto/_aes/hw/keysched_hw.odin b/core/crypto/_aes/hw/keysched_hw.odin new file mode 100644 index 000000000..7d85c43b7 --- /dev/null +++ b/core/crypto/_aes/hw/keysched_hw.odin @@ -0,0 +1,181 @@ +// Copyright (c) 2017 Thomas Pornin +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHORS “AS IS” AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#+build amd64,arm64,arm32 +package aes_hw + +import "base:intrinsics" +import "core:crypto" +import "core:crypto/_aes" +import "core:simd" + +// Inspiration taken from BearSSL's AES-NI implementation. +// +// Note: This assumes that the SROA optimization pass is enabled to be +// anything resembling performant otherwise, LLVM will not elide a massive +// number of redundant loads/stores it generates for every intrinsic call. + +@(private = "file", require_results, enable_target_feature = TARGET_FEATURES) +expand_step128 :: #force_inline proc(k1, k2: simd.u8x16) -> simd.u8x16 { + k1, k2 := k1, k2 + + k2 = _mm_shuffle_epi32(k2, 0xff) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + return simd.bit_xor(k1, k2) +} + +@(private = "file", require_results, enable_target_feature = TARGET_FEATURES) +expand_step192a :: #force_inline proc (k1_, k2_: ^simd.u8x16, k3: simd.u8x16) -> (simd.u8x16, simd.u8x16) { + k1, k2, k3 := k1_^, k2_^, k3 + + k3 = _mm_shuffle_epi32(k3, 0x55) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, k3) + + tmp := k2 + k2 = simd.bit_xor(k2, _mm_slli_si128(k2, 0x04)) + k2 = simd.bit_xor(k2, _mm_shuffle_epi32(k1, 0xff)) + + k1_, k2_ := k1_, k2_ + k1_^, k2_^ = k1, k2 + + r1 := _mm_shuffle_ps(tmp, k1, 0x44) + r2 := _mm_shuffle_ps(k1, k2, 0x4e) + + return r1, r2 +} + +@(private = "file", require_results, enable_target_feature = TARGET_FEATURES) +expand_step192b :: #force_inline proc (k1_, k2_: ^simd.u8x16, k3: simd.u8x16) -> simd.u8x16 { + k1, k2, k3 := k1_^, k2_^, k3 + + k3 = _mm_shuffle_epi32(k3, 0x55) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, k3) + + k2 = simd.bit_xor(k2, _mm_slli_si128(k2, 0x04)) + k2 = simd.bit_xor(k2, _mm_shuffle_epi32(k1, 0xff)) + + k1_, k2_ := k1_, k2_ + k1_^, k2_^ = k1, k2 + + return k1 +} + +@(private = "file", require_results, enable_target_feature = TARGET_FEATURES) +expand_step256b :: #force_inline proc(k1, k2: simd.u8x16) -> simd.u8x16 { + k1, k2 := k1, k2 + + k2 = _mm_shuffle_epi32(k2, 0xaa) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + return simd.bit_xor(k1, k2) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +derive_dec_keys :: proc(ctx: ^Context, sks: ^[15]simd.u8x16, num_rounds: int) { + intrinsics.unaligned_store((^simd.u8x16)(&ctx._sk_exp_dec[0]), sks[num_rounds]) + for i in 1 ..< num_rounds { + tmp := aesimc(sks[i]) + intrinsics.unaligned_store((^simd.u8x16)(&ctx._sk_exp_dec[num_rounds - i]), tmp) + } + intrinsics.unaligned_store((^simd.u8x16)(&ctx._sk_exp_dec[num_rounds]), sks[0]) +} + +@(private, enable_target_feature = TARGET_FEATURES) +keysched :: proc(ctx: ^Context, key: []byte) { + sks: [15]simd.u8x16 = --- + + // Compute the encryption keys. + num_rounds, key_len := 0, len(key) + switch key_len { + case _aes.KEY_SIZE_128: + sks[0] = intrinsics.unaligned_load((^simd.u8x16)(raw_data(key))) + sks[1] = expand_step128(sks[0], aeskeygenassist(sks[0], 0x01)) + sks[2] = expand_step128(sks[1], aeskeygenassist(sks[1], 0x02)) + sks[3] = expand_step128(sks[2], aeskeygenassist(sks[2], 0x04)) + sks[4] = expand_step128(sks[3], aeskeygenassist(sks[3], 0x08)) + sks[5] = expand_step128(sks[4], aeskeygenassist(sks[4], 0x10)) + sks[6] = expand_step128(sks[5], aeskeygenassist(sks[5], 0x20)) + sks[7] = expand_step128(sks[6], aeskeygenassist(sks[6], 0x40)) + sks[8] = expand_step128(sks[7], aeskeygenassist(sks[7], 0x80)) + sks[9] = expand_step128(sks[8], aeskeygenassist(sks[8], 0x1b)) + sks[10] = expand_step128(sks[9], aeskeygenassist(sks[9], 0x36)) + num_rounds = _aes.ROUNDS_128 + case _aes.KEY_SIZE_192: + k0 := intrinsics.unaligned_load((^simd.u8x16)(raw_data(key))) + + k1_tmp: [16]byte + copy(k1_tmp[:], key[16:24]) + k1 := intrinsics.unaligned_load((^simd.u8x16)(&k1_tmp)) + crypto.zero_explicit(&k1_tmp, size_of(k1_tmp)) + + sks[0] = k0 + sks[1], sks[2] = expand_step192a(&k0, &k1, aeskeygenassist(k1, 0x01)) + sks[3] = expand_step192b(&k0, &k1, aeskeygenassist(k1, 0x02)) + sks[4], sks[5] = expand_step192a(&k0, &k1, aeskeygenassist(k1, 0x04)) + sks[6] = expand_step192b(&k0, &k1, aeskeygenassist(k1, 0x08)) + sks[7], sks[8] = expand_step192a(&k0, &k1, aeskeygenassist(k1, 0x10)) + sks[9] = expand_step192b(&k0, &k1, aeskeygenassist(k1, 0x20)) + sks[10], sks[11] = expand_step192a(&k0, &k1, aeskeygenassist(k1, 0x40)) + sks[12] = expand_step192b(&k0, &k1, aeskeygenassist(k1, 0x80)) + num_rounds = _aes.ROUNDS_192 + + case _aes.KEY_SIZE_256: + sks[0] = intrinsics.unaligned_load((^simd.u8x16)(raw_data(key))) + sks[1] = intrinsics.unaligned_load((^simd.u8x16)(raw_data(key[16:]))) + sks[2] = expand_step128(sks[0], aeskeygenassist(sks[1], 0x01)) + sks[3] = expand_step256b(sks[1], aeskeygenassist(sks[2], 0x01)) + sks[4] = expand_step128(sks[2], aeskeygenassist(sks[3], 0x02)) + sks[5] = expand_step256b(sks[3], aeskeygenassist(sks[4], 0x02)) + sks[6] = expand_step128(sks[4], aeskeygenassist(sks[5], 0x04)) + sks[7] = expand_step256b(sks[5], aeskeygenassist(sks[6], 0x04)) + sks[8] = expand_step128(sks[6], aeskeygenassist(sks[7], 0x08)) + sks[9] = expand_step256b(sks[7], aeskeygenassist(sks[8], 0x08)) + sks[10] = expand_step128(sks[8], aeskeygenassist(sks[9], 0x10)) + sks[11] = expand_step256b(sks[9], aeskeygenassist(sks[10], 0x10)) + sks[12] = expand_step128(sks[10], aeskeygenassist(sks[11], 0x20)) + sks[13] = expand_step256b(sks[11], aeskeygenassist(sks[12], 0x20)) + sks[14] = expand_step128(sks[12], aeskeygenassist(sks[13], 0x40)) + num_rounds = _aes.ROUNDS_256 + case: + panic("crypto/aes: invalid AES key size") + } + for i in 0 ..= num_rounds { + intrinsics.unaligned_store((^simd.u8x16)(&ctx._sk_exp_enc[i]), sks[i]) + } + + // Compute the decryption keys. GCM and CTR do not need this, however + // ECB, CBC, OCB3, etc do. + derive_dec_keys(ctx, &sks, num_rounds) + + ctx._num_rounds = num_rounds + + crypto.zero_explicit(&sks, size_of(sks)) +} diff --git a/core/crypto/_aes/hw/unsupported.odin b/core/crypto/_aes/hw/unsupported.odin new file mode 100644 index 000000000..3fb31b6b8 --- /dev/null +++ b/core/crypto/_aes/hw/unsupported.odin @@ -0,0 +1,11 @@ +#+build !amd64 +#+build !arm64 +#+build !arm32 +package aes_hw + +HAS_GHASH :: false + +@(private) +keysched :: proc(ctx: ^Context, key: []byte) { + panic("crypto/aes: hardware implementation unsupported") +} diff --git a/core/crypto/_aes/hw_intel/api.odin b/core/crypto/_aes/hw_intel/api.odin deleted file mode 100644 index 9547d8f84..000000000 --- a/core/crypto/_aes/hw_intel/api.odin +++ /dev/null @@ -1,38 +0,0 @@ -#+build amd64 -package aes_hw_intel - -import "core:sys/info" - -// is_supported returns true if and only if (⟺) hardware accelerated AES -// is supported. -is_supported :: proc "contextless" () -> bool { - // Note: Everything with AES-NI and PCLMULQDQ has support for - // the required SSE extxtensions. - req_features :: info.CPU_Features{ - .sse2, - .ssse3, - .sse41, - .aes, - .pclmulqdq, - } - return info.cpu_features() >= req_features -} - -// Context is a keyed AES (ECB) instance. -Context :: struct { - // Note: The ideal thing to do is for the expanded round keys to be - // arrays of `__m128i`, however that implies alignment (or using AVX). - // - // All the people using e-waste processors that don't support an - // insturction set that has been around for over 10 years are why - // we can't have nice things. - _sk_exp_enc: [15][16]byte, - _sk_exp_dec: [15][16]byte, - _num_rounds: int, -} - -// init initializes a context for AES with the provided key. -init :: proc(ctx: ^Context, key: []byte) { - keysched(ctx, key) -} - diff --git a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin b/core/crypto/_aes/hw_intel/hw_intel_keysched.odin deleted file mode 100644 index 7b339c5f5..000000000 --- a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright (c) 2017 Thomas Pornin -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHORS “AS IS” AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#+build amd64 -package aes_hw_intel - -import "base:intrinsics" -import "core:crypto" -import "core:crypto/_aes" -import "core:simd/x86" - -// Intel AES-NI based implementation. Inspiration taken from BearSSL. -// -// Note: This assumes that the SROA optimization pass is enabled to be -// anything resembling performat otherwise, LLVM will not elide a massive -// number of redundant loads/stores it generates for every intrinsic call. - -@(private = "file", require_results, enable_target_feature = "sse2") -expand_step128 :: #force_inline proc(k1, k2: x86.__m128i) -> x86.__m128i { - k1, k2 := k1, k2 - - k2 = x86._mm_shuffle_epi32(k2, 0xff) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - return x86._mm_xor_si128(k1, k2) -} - -@(private = "file", require_results, enable_target_feature = "sse,sse2") -expand_step192a :: #force_inline proc (k1_, k2_: ^x86.__m128i, k3: x86.__m128i) -> (x86.__m128i, x86.__m128i) { - k1, k2, k3 := k1_^, k2_^, k3 - - k3 = x86._mm_shuffle_epi32(k3, 0x55) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, k3) - - tmp := k2 - k2 = x86._mm_xor_si128(k2, x86._mm_slli_si128(k2, 0x04)) - k2 = x86._mm_xor_si128(k2, x86._mm_shuffle_epi32(k1, 0xff)) - - k1_, k2_ := k1_, k2_ - k1_^, k2_^ = k1, k2 - - r1 := transmute(x86.__m128i)(x86._mm_shuffle_ps(transmute(x86.__m128)(tmp), transmute(x86.__m128)(k1), 0x44)) - r2 := transmute(x86.__m128i)(x86._mm_shuffle_ps(transmute(x86.__m128)(k1), transmute(x86.__m128)(k2), 0x4e)) - - return r1, r2 -} - -@(private = "file", require_results, enable_target_feature = "sse2") -expand_step192b :: #force_inline proc (k1_, k2_: ^x86.__m128i, k3: x86.__m128i) -> x86.__m128i { - k1, k2, k3 := k1_^, k2_^, k3 - - k3 = x86._mm_shuffle_epi32(k3, 0x55) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, k3) - - k2 = x86._mm_xor_si128(k2, x86._mm_slli_si128(k2, 0x04)) - k2 = x86._mm_xor_si128(k2, x86._mm_shuffle_epi32(k1, 0xff)) - - k1_, k2_ := k1_, k2_ - k1_^, k2_^ = k1, k2 - - return k1 -} - -@(private = "file", require_results, enable_target_feature = "sse2") -expand_step256b :: #force_inline proc(k1, k2: x86.__m128i) -> x86.__m128i { - k1, k2 := k1, k2 - - k2 = x86._mm_shuffle_epi32(k2, 0xaa) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - return x86._mm_xor_si128(k1, k2) -} - -@(private = "file", enable_target_feature = "aes") -derive_dec_keys :: proc(ctx: ^Context, sks: ^[15]x86.__m128i, num_rounds: int) { - intrinsics.unaligned_store((^x86.__m128i)(&ctx._sk_exp_dec[0]), sks[num_rounds]) - for i in 1 ..< num_rounds { - tmp := x86._mm_aesimc_si128(sks[i]) - intrinsics.unaligned_store((^x86.__m128i)(&ctx._sk_exp_dec[num_rounds - i]), tmp) - } - intrinsics.unaligned_store((^x86.__m128i)(&ctx._sk_exp_dec[num_rounds]), sks[0]) -} - -@(private, enable_target_feature = "sse,sse2,aes") -keysched :: proc(ctx: ^Context, key: []byte) { - sks: [15]x86.__m128i = --- - - // Compute the encryption keys. - num_rounds, key_len := 0, len(key) - switch key_len { - case _aes.KEY_SIZE_128: - sks[0] = intrinsics.unaligned_load((^x86.__m128i)(raw_data(key))) - sks[1] = expand_step128(sks[0], x86._mm_aeskeygenassist_si128(sks[0], 0x01)) - sks[2] = expand_step128(sks[1], x86._mm_aeskeygenassist_si128(sks[1], 0x02)) - sks[3] = expand_step128(sks[2], x86._mm_aeskeygenassist_si128(sks[2], 0x04)) - sks[4] = expand_step128(sks[3], x86._mm_aeskeygenassist_si128(sks[3], 0x08)) - sks[5] = expand_step128(sks[4], x86._mm_aeskeygenassist_si128(sks[4], 0x10)) - sks[6] = expand_step128(sks[5], x86._mm_aeskeygenassist_si128(sks[5], 0x20)) - sks[7] = expand_step128(sks[6], x86._mm_aeskeygenassist_si128(sks[6], 0x40)) - sks[8] = expand_step128(sks[7], x86._mm_aeskeygenassist_si128(sks[7], 0x80)) - sks[9] = expand_step128(sks[8], x86._mm_aeskeygenassist_si128(sks[8], 0x1b)) - sks[10] = expand_step128(sks[9], x86._mm_aeskeygenassist_si128(sks[9], 0x36)) - num_rounds = _aes.ROUNDS_128 - case _aes.KEY_SIZE_192: - k0 := intrinsics.unaligned_load((^x86.__m128i)(raw_data(key))) - k1 := x86.__m128i{ - intrinsics.unaligned_load((^i64)(raw_data(key[16:]))), - 0, - } - sks[0] = k0 - sks[1], sks[2] = expand_step192a(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x01)) - sks[3] = expand_step192b(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x02)) - sks[4], sks[5] = expand_step192a(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x04)) - sks[6] = expand_step192b(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x08)) - sks[7], sks[8] = expand_step192a(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x10)) - sks[9] = expand_step192b(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x20)) - sks[10], sks[11] = expand_step192a(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x40)) - sks[12] = expand_step192b(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x80)) - num_rounds = _aes.ROUNDS_192 - case _aes.KEY_SIZE_256: - sks[0] = intrinsics.unaligned_load((^x86.__m128i)(raw_data(key))) - sks[1] = intrinsics.unaligned_load((^x86.__m128i)(raw_data(key[16:]))) - sks[2] = expand_step128(sks[0], x86._mm_aeskeygenassist_si128(sks[1], 0x01)) - sks[3] = expand_step256b(sks[1], x86._mm_aeskeygenassist_si128(sks[2], 0x01)) - sks[4] = expand_step128(sks[2], x86._mm_aeskeygenassist_si128(sks[3], 0x02)) - sks[5] = expand_step256b(sks[3], x86._mm_aeskeygenassist_si128(sks[4], 0x02)) - sks[6] = expand_step128(sks[4], x86._mm_aeskeygenassist_si128(sks[5], 0x04)) - sks[7] = expand_step256b(sks[5], x86._mm_aeskeygenassist_si128(sks[6], 0x04)) - sks[8] = expand_step128(sks[6], x86._mm_aeskeygenassist_si128(sks[7], 0x08)) - sks[9] = expand_step256b(sks[7], x86._mm_aeskeygenassist_si128(sks[8], 0x08)) - sks[10] = expand_step128(sks[8], x86._mm_aeskeygenassist_si128(sks[9], 0x10)) - sks[11] = expand_step256b(sks[9], x86._mm_aeskeygenassist_si128(sks[10], 0x10)) - sks[12] = expand_step128(sks[10], x86._mm_aeskeygenassist_si128(sks[11], 0x20)) - sks[13] = expand_step256b(sks[11], x86._mm_aeskeygenassist_si128(sks[12], 0x20)) - sks[14] = expand_step128(sks[12], x86._mm_aeskeygenassist_si128(sks[13], 0x40)) - num_rounds = _aes.ROUNDS_256 - case: - panic("crypto/aes: invalid AES key size") - } - for i in 0 ..= num_rounds { - intrinsics.unaligned_store((^x86.__m128i)(&ctx._sk_exp_enc[i]), sks[i]) - } - - // Compute the decryption keys. GCM and CTR do not need this, however - // ECB, CBC, OCB3, etc do. - derive_dec_keys(ctx, &sks, num_rounds) - - ctx._num_rounds = num_rounds - - crypto.zero_explicit(&sks, size_of(sks)) -} diff --git a/core/crypto/aes/aes_gcm_hw_intel.odin b/core/crypto/aes/aes_gcm_hw_intel.odin index c6e564773..75c97be80 100644 --- a/core/crypto/aes/aes_gcm_hw_intel.odin +++ b/core/crypto/aes/aes_gcm_hw_intel.odin @@ -4,7 +4,7 @@ package aes import "base:intrinsics" import "core:crypto" import "core:crypto/_aes" -import "core:crypto/_aes/hw_intel" +import aes_hw "core:crypto/_aes/hw" import "core:encoding/endian" import "core:simd/x86" @@ -17,7 +17,7 @@ gcm_seal_hw :: proc(ctx: ^Context_Impl_Hardware, dst, tag, iv, aad, plaintext: [ init_ghash_hw(ctx, &h, &j0, &j0_enc, iv) // Note: Our GHASH implementation handles appending padding. - hw_intel.ghash(s[:], h[:], aad) + aes_hw.ghash(s[:], h[:], aad) gctr_hw(ctx, dst, &s, plaintext, &h, &j0, true) final_ghash_hw(&s, &h, &j0_enc, len(aad), len(plaintext)) copy(tag, s[:]) @@ -35,7 +35,7 @@ gcm_open_hw :: proc(ctx: ^Context_Impl_Hardware, dst, iv, aad, ciphertext, tag: s: [_aes.GHASH_TAG_SIZE]byte init_ghash_hw(ctx, &h, &j0, &j0_enc, iv) - hw_intel.ghash(s[:], h[:], aad) + aes_hw.ghash(s[:], h[:], aad) gctr_hw(ctx, dst, &s, ciphertext, &h, &j0, false) final_ghash_hw(&s, &h, &j0_enc, len(aad), len(ciphertext)) @@ -71,11 +71,11 @@ init_ghash_hw :: proc( } else { // If len(IV) != 96, then let s = 128 ceil(len(IV)/128) - len(IV), // and let J0 = GHASHH(IV || 0^(s+64) || ceil(len(IV))^64). - hw_intel.ghash(j0[:], h[:], iv) + aes_hw.ghash(j0[:], h[:], iv) tmp: [_aes.GHASH_BLOCK_SIZE]byte endian.unchecked_put_u64be(tmp[8:], u64(l) * 8) - hw_intel.ghash(j0[:], h[:], tmp[:]) + aes_hw.ghash(j0[:], h[:], tmp[:]) } // ECB encrypt j0, so that we can just XOR with the tag. @@ -94,7 +94,7 @@ final_ghash_hw :: proc( endian.unchecked_put_u64be(blk[0:], u64(a_len) * 8) endian.unchecked_put_u64be(blk[8:], u64(t_len) * 8) - hw_intel.ghash(s[:], h[:], blk[:]) + aes_hw.ghash(s[:], h[:], blk[:]) j0_vec := intrinsics.unaligned_load((^x86.__m128i)(j0)) s_vec := intrinsics.unaligned_load((^x86.__m128i)(s)) s_vec = x86._mm_xor_si128(s_vec, j0_vec) @@ -131,7 +131,7 @@ gctr_hw :: proc( nr_blocks := len(src) / BLOCK_SIZE for nr_blocks >= CTR_STRIDE_HW { if !is_seal { - hw_intel.ghash(s[:], h[:], src[:CTR_STRIDE_BYTES_HW]) + aes_hw.ghash(s[:], h[:], src[:CTR_STRIDE_BYTES_HW]) } #unroll for i in 0 ..< CTR_STRIDE_HW { @@ -174,7 +174,7 @@ gctr_hw :: proc( xor_blocks_hw(dst, src, blks[:]) if is_seal { - hw_intel.ghash(s[:], h[:], dst[:CTR_STRIDE_BYTES_HW]) + aes_hw.ghash(s[:], h[:], dst[:CTR_STRIDE_BYTES_HW]) } src = src[CTR_STRIDE_BYTES_HW:] @@ -186,7 +186,7 @@ gctr_hw :: proc( for n := len(src); n > 0; { l := min(n, BLOCK_SIZE) if !is_seal { - hw_intel.ghash(s[:], h[:], src[:l]) + aes_hw.ghash(s[:], h[:], src[:l]) } blks[0], ctr = hw_inc_ctr32(&ctr_blk, ctr) @@ -219,7 +219,7 @@ gctr_hw :: proc( copy(dst, blk[:l]) } if is_seal { - hw_intel.ghash(s[:], h[:], dst[:l]) + aes_hw.ghash(s[:], h[:], dst[:l]) } dst = dst[l:] diff --git a/core/crypto/aes/aes_impl_hw_intel.odin b/core/crypto/aes/aes_impl_hw_intel.odin index 96a1811f3..fe3849eda 100644 --- a/core/crypto/aes/aes_impl_hw_intel.odin +++ b/core/crypto/aes/aes_impl_hw_intel.odin @@ -1,18 +1,18 @@ #+build amd64 package aes -import "core:crypto/_aes/hw_intel" +import aes_hw "core:crypto/_aes/hw" // is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AES // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { - return hw_intel.is_supported() + return aes_hw.is_supported() } @(private) -Context_Impl_Hardware :: hw_intel.Context +Context_Impl_Hardware :: aes_hw.Context @(private, enable_target_feature = "sse2,aes") init_impl_hw :: proc(ctx: ^Context_Impl_Hardware, key: []byte) { - hw_intel.init(ctx, key) + aes_hw.init(ctx, key) } From df1a9661008607f0cb3612cd0b3d78ad0787ceb3 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 12 Mar 2026 22:06:22 +0900 Subject: [PATCH 671/766] core/crypto/aegis: Migrate to generic SIMD + HW AES --- core/crypto/aegis/aegis_impl_hw.odin | 397 +++++++++++++++++++++ core/crypto/aegis/aegis_impl_hw_gen.odin | 2 + core/crypto/aegis/aegis_impl_hw_intel.odin | 389 -------------------- 3 files changed, 399 insertions(+), 389 deletions(-) create mode 100644 core/crypto/aegis/aegis_impl_hw.odin delete mode 100644 core/crypto/aegis/aegis_impl_hw_intel.odin diff --git a/core/crypto/aegis/aegis_impl_hw.odin b/core/crypto/aegis/aegis_impl_hw.odin new file mode 100644 index 000000000..4a39b341c --- /dev/null +++ b/core/crypto/aegis/aegis_impl_hw.odin @@ -0,0 +1,397 @@ +#+build amd64,arm64,arm32 +package aegis + +import "base:intrinsics" +import "core:crypto" +import aes_hw "core:crypto/_aes/hw" +import "core:encoding/endian" +import "core:simd" + +@(private) +State_HW :: struct { + s0: simd.u8x16, + s1: simd.u8x16, + s2: simd.u8x16, + s3: simd.u8x16, + s4: simd.u8x16, + s5: simd.u8x16, + s6: simd.u8x16, + s7: simd.u8x16, + rate: int, +} + +when ODIN_ARCH == .amd64 { + @(private="file") + TARGET_FEATURES :: "sse2,aes" +} else when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32 { + @(private="file") + TARGET_FEATURES :: "neon,aes" +} + +// is_hardware_accelerated returns true if and only if (⟺) hardware +// accelerated AEGIS is supported. +is_hardware_accelerated :: proc "contextless" () -> bool { + return aes_hw.is_supported() +} + +@(private, enable_target_feature = TARGET_FEATURES) +init_hw :: proc "contextless" (ctx: ^Context, st: ^State_HW, iv: []byte) { + switch ctx._key_len { + case KEY_SIZE_128L: + key := intrinsics.unaligned_load((^simd.u8x16)(&ctx._key[0])) + iv := intrinsics.unaligned_load((^simd.u8x16)(raw_data(iv))) + + st.s0 = simd.bit_xor(key, iv) + st.s1 = intrinsics.unaligned_load((^simd.u8x16)(&_C1[0])) + st.s2 = intrinsics.unaligned_load((^simd.u8x16)(&_C0[0])) + st.s3 = st.s1 + st.s4 = st.s0 + st.s5 = simd.bit_xor(key, st.s2) // key ^ C0 + st.s6 = simd.bit_xor(key, st.s1) // key ^ C1 + st.s7 = st.s5 + st.rate = _RATE_128L + + for _ in 0 ..< 10 { + update_hw_128l(st, iv, key) + } + case KEY_SIZE_256: + k0 := intrinsics.unaligned_load((^simd.u8x16)(&ctx._key[0])) + k1 := intrinsics.unaligned_load((^simd.u8x16)(&ctx._key[16])) + n0 := intrinsics.unaligned_load((^simd.u8x16)(&iv[0])) + n1 := intrinsics.unaligned_load((^simd.u8x16)(&iv[16])) + + st.s0 = simd.bit_xor(k0, n0) + st.s1 = simd.bit_xor(k1, n1) + st.s2 = intrinsics.unaligned_load((^simd.u8x16)(&_C1[0])) + st.s3 = intrinsics.unaligned_load((^simd.u8x16)(&_C0[0])) + st.s4 = simd.bit_xor(k0, st.s3) // k0 ^ C0 + st.s5 = simd.bit_xor(k1, st.s2) // k1 ^ C1 + st.rate = _RATE_256 + + u0, u1 := st.s0, st.s1 + for _ in 0 ..< 4 { + update_hw_256(st, k0) + update_hw_256(st, k1) + update_hw_256(st, u0) + update_hw_256(st, u1) + } + } +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +update_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, m0, m1: simd.u8x16) { + s0_ := aes_hw.aesenc(st.s7, simd.bit_xor(st.s0, m0)) + s1_ := aes_hw.aesenc(st.s0, st.s1) + s2_ := aes_hw.aesenc(st.s1, st.s2) + s3_ := aes_hw.aesenc(st.s2, st.s3) + s4_ := aes_hw.aesenc(st.s3, simd.bit_xor(st.s4, m1)) + s5_ := aes_hw.aesenc(st.s4, st.s5) + s6_ := aes_hw.aesenc(st.s5, st.s6) + s7_ := aes_hw.aesenc(st.s6, st.s7) + st.s0, st.s1, st.s2, st.s3, st.s4, st.s5, st.s6, st.s7 = s0_, s1_, s2_, s3_, s4_, s5_, s6_, s7_ +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +update_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, m: simd.u8x16) { + s0_ := aes_hw.aesenc(st.s5, simd.bit_xor(st.s0, m)) + s1_ := aes_hw.aesenc(st.s0, st.s1) + s2_ := aes_hw.aesenc(st.s1, st.s2) + s3_ := aes_hw.aesenc(st.s2, st.s3) + s4_ := aes_hw.aesenc(st.s3, st.s4) + s5_ := aes_hw.aesenc(st.s4, st.s5) + st.s0, st.s1, st.s2, st.s3, st.s4, st.s5 = s0_, s1_, s2_, s3_, s4_, s5_ +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +absorb_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, ai: []byte) { + t0 := intrinsics.unaligned_load((^simd.u8x16)(&ai[0])) + t1 := intrinsics.unaligned_load((^simd.u8x16)(&ai[16])) + update_hw_128l(st, t0, t1) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +absorb_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, ai: []byte) { + m := intrinsics.unaligned_load((^simd.u8x16)(&ai[0])) + update_hw_256(st, m) +} + +@(private, enable_target_feature = TARGET_FEATURES) +absorb_hw :: proc "contextless" (st: ^State_HW, aad: []byte) #no_bounds_check { + ai, l := aad, len(aad) + + switch st.rate { + case _RATE_128L: + for l >= _RATE_128L { + absorb_hw_128l(st, ai) + ai = ai[_RATE_128L:] + l -= _RATE_128L + } + case _RATE_256: + for l >= _RATE_256 { + absorb_hw_256(st, ai) + + ai = ai[_RATE_256:] + l -= _RATE_256 + } + } + + // Pad out the remainder with `0`s till it is rate sized. + if l > 0 { + tmp: [_RATE_MAX]byte // AAD is not confidential. + copy(tmp[:], ai) + switch st.rate { + case _RATE_128L: + absorb_hw_128l(st, tmp[:]) + case _RATE_256: + absorb_hw_256(st, tmp[:]) + } + } +} + +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) +z_hw_128l :: #force_inline proc "contextless" (st: ^State_HW) -> (simd.u8x16, simd.u8x16) { + z0 := simd.bit_xor( + st.s6, + simd.bit_xor( + st.s1, + simd.bit_and(st.s2, st.s3), + ), + ) + z1 := simd.bit_xor( + st.s2, + simd.bit_xor( + st.s5, + simd.bit_and(st.s6, st.s7), + ), + ) + return z0, z1 +} + +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) +z_hw_256 :: #force_inline proc "contextless" (st: ^State_HW) -> simd.u8x16 { + return simd.bit_xor( + st.s1, + simd.bit_xor( + st.s4, + simd.bit_xor( + st.s5, + simd.bit_and(st.s2, st.s3), + ), + ), + ) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +enc_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, ci, xi: []byte) #no_bounds_check { + z0, z1 := z_hw_128l(st) + + t0 := intrinsics.unaligned_load((^simd.u8x16)(&xi[0])) + t1 := intrinsics.unaligned_load((^simd.u8x16)(&xi[16])) + update_hw_128l(st, t0, t1) + + out0 := simd.bit_xor(t0, z0) + out1 := simd.bit_xor(t1, z1) + intrinsics.unaligned_store((^simd.u8x16)(&ci[0]), out0) + intrinsics.unaligned_store((^simd.u8x16)(&ci[16]), out1) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +enc_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, ci, xi: []byte) #no_bounds_check { + z := z_hw_256(st) + + xi_ := intrinsics.unaligned_load((^simd.u8x16)(raw_data(xi))) + update_hw_256(st, xi_) + + ci_ := simd.bit_xor(xi_, z) + intrinsics.unaligned_store((^simd.u8x16)(raw_data(ci)), ci_) +} + +@(private, enable_target_feature = TARGET_FEATURES) +enc_hw :: proc "contextless" (st: ^State_HW, dst, src: []byte) #no_bounds_check { + ci, xi, l := dst, src, len(src) + + switch st.rate { + case _RATE_128L: + for l >= _RATE_128L { + enc_hw_128l(st, ci, xi) + ci = ci[_RATE_128L:] + xi = xi[_RATE_128L:] + l -= _RATE_128L + } + case _RATE_256: + for l >= _RATE_256 { + enc_hw_256(st, ci, xi) + ci = ci[_RATE_256:] + xi = xi[_RATE_256:] + l -= _RATE_256 + } + } + + // Pad out the remainder with `0`s till it is rate sized. + if l > 0 { + tmp: [_RATE_MAX]byte // Ciphertext is not confidential. + copy(tmp[:], xi) + switch st.rate { + case _RATE_128L: + enc_hw_128l(st, tmp[:], tmp[:]) + case _RATE_256: + enc_hw_256(st, tmp[:], tmp[:]) + } + copy(ci, tmp[:l]) + } +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +dec_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, xi, ci: []byte) #no_bounds_check { + z0, z1 := z_hw_128l(st) + + t0 := intrinsics.unaligned_load((^simd.u8x16)(&ci[0])) + t1 := intrinsics.unaligned_load((^simd.u8x16)(&ci[16])) + out0 := simd.bit_xor(t0, z0) + out1 := simd.bit_xor(t1, z1) + + update_hw_128l(st, out0, out1) + intrinsics.unaligned_store((^simd.u8x16)(&xi[0]), out0) + intrinsics.unaligned_store((^simd.u8x16)(&xi[16]), out1) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +dec_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, xi, ci: []byte) #no_bounds_check { + z := z_hw_256(st) + + ci_ := intrinsics.unaligned_load((^simd.u8x16)(raw_data(ci))) + xi_ := simd.bit_xor(ci_, z) + + update_hw_256(st, xi_) + intrinsics.unaligned_store((^simd.u8x16)(raw_data(xi)), xi_) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +dec_partial_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: []byte) #no_bounds_check { + tmp: [_RATE_128L]byte + defer crypto.zero_explicit(&tmp, size_of(tmp)) + + z0, z1 := z_hw_128l(st) + copy(tmp[:], cn) + + t0 := intrinsics.unaligned_load((^simd.u8x16)(&tmp[0])) + t1 := intrinsics.unaligned_load((^simd.u8x16)(&tmp[16])) + out0 := simd.bit_xor(t0, z0) + out1 := simd.bit_xor(t1, z1) + + intrinsics.unaligned_store((^simd.u8x16)(&tmp[0]), out0) + intrinsics.unaligned_store((^simd.u8x16)(&tmp[16]), out1) + copy(xn, tmp[:]) + + for off := len(xn); off < _RATE_128L; off += 1 { + tmp[off] = 0 + } + out0 = intrinsics.unaligned_load((^simd.u8x16)(&tmp[0])) // v0 + out1 = intrinsics.unaligned_load((^simd.u8x16)(&tmp[16])) // v1 + update_hw_128l(st, out0, out1) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +dec_partial_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: []byte) #no_bounds_check { + tmp: [_RATE_256]byte + defer crypto.zero_explicit(&tmp, size_of(tmp)) + + z := z_hw_256(st) + copy(tmp[:], cn) + + cn_ := intrinsics.unaligned_load((^simd.u8x16)(&tmp[0])) + xn_ := simd.bit_xor(cn_, z) + + intrinsics.unaligned_store((^simd.u8x16)(&tmp[0]), xn_) + copy(xn, tmp[:]) + + for off := len(xn); off < _RATE_256; off += 1 { + tmp[off] = 0 + } + xn_ = intrinsics.unaligned_load((^simd.u8x16)(&tmp[0])) + update_hw_256(st, xn_) +} + +@(private, enable_target_feature = TARGET_FEATURES) +dec_hw :: proc "contextless" (st: ^State_HW, dst, src: []byte) #no_bounds_check { + xi, ci, l := dst, src, len(src) + + switch st.rate { + case _RATE_128L: + for l >= _RATE_128L { + dec_hw_128l(st, xi, ci) + xi = xi[_RATE_128L:] + ci = ci[_RATE_128L:] + l -= _RATE_128L + } + case _RATE_256: + for l >= _RATE_256 { + dec_hw_256(st, xi, ci) + xi = xi[_RATE_256:] + ci = ci[_RATE_256:] + l -= _RATE_256 + } + } + + // Process the remainder. + if l > 0 { + switch st.rate { + case _RATE_128L: + dec_partial_hw_128l(st, xi, ci) + case _RATE_256: + dec_partial_hw_256(st, xi, ci) + } + } +} + +@(private, enable_target_feature = TARGET_FEATURES) +finalize_hw :: proc "contextless" (st: ^State_HW, tag: []byte, ad_len, msg_len: int) { + tmp: [16]byte + endian.unchecked_put_u64le(tmp[0:], u64(ad_len) * 8) + endian.unchecked_put_u64le(tmp[8:], u64(msg_len) * 8) + + t := intrinsics.unaligned_load((^simd.u8x16)(&tmp[0])) + + t0, t1: simd.u8x16 = ---, --- + switch st.rate { + case _RATE_128L: + t = simd.bit_xor(st.s2, t) + for _ in 0 ..< 7 { + update_hw_128l(st, t, t) + } + + t0 = simd.bit_xor(st.s0, st.s1) + t0 = simd.bit_xor(t0, st.s2) + t0 = simd.bit_xor(t0, st.s3) + + t1 = simd.bit_xor(st.s4, st.s5) + t1 = simd.bit_xor(t1, st.s6) + if len(tag) == TAG_SIZE_256 { + t1 = simd.bit_xor(t1, st.s7) + } + case _RATE_256: + t = simd.bit_xor(st.s3, t) + for _ in 0 ..< 7 { + update_hw_256(st, t) + } + + t0 = simd.bit_xor(st.s0, st.s1) + t0 = simd.bit_xor(t0, st.s2) + + t1 = simd.bit_xor(st.s3, st.s4) + t1 = simd.bit_xor(t1, st.s5) + } + switch len(tag) { + case TAG_SIZE_128: + t0 = simd.bit_xor(t0, t1) + intrinsics.unaligned_store((^simd.u8x16)(&tag[0]), t0) + case TAG_SIZE_256: + intrinsics.unaligned_store((^simd.u8x16)(&tag[0]), t0) + intrinsics.unaligned_store((^simd.u8x16)(&tag[16]), t1) + } +} + +@(private) +reset_state_hw :: proc "contextless" (st: ^State_HW) { + crypto.zero_explicit(st, size_of(st^)) +} diff --git a/core/crypto/aegis/aegis_impl_hw_gen.odin b/core/crypto/aegis/aegis_impl_hw_gen.odin index db38e71bc..8f8b4c5da 100644 --- a/core/crypto/aegis/aegis_impl_hw_gen.odin +++ b/core/crypto/aegis/aegis_impl_hw_gen.odin @@ -1,4 +1,6 @@ #+build !amd64 +#+build !arm64 +#+build !arm32 package aegis @(private = "file") diff --git a/core/crypto/aegis/aegis_impl_hw_intel.odin b/core/crypto/aegis/aegis_impl_hw_intel.odin deleted file mode 100644 index 8b767908c..000000000 --- a/core/crypto/aegis/aegis_impl_hw_intel.odin +++ /dev/null @@ -1,389 +0,0 @@ -#+build amd64 -package aegis - -import "base:intrinsics" -import "core:crypto" -import "core:crypto/aes" -import "core:encoding/endian" -import "core:simd/x86" - -@(private) -State_HW :: struct { - s0: x86.__m128i, - s1: x86.__m128i, - s2: x86.__m128i, - s3: x86.__m128i, - s4: x86.__m128i, - s5: x86.__m128i, - s6: x86.__m128i, - s7: x86.__m128i, - rate: int, -} - -// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AEGIS -// is supported. -is_hardware_accelerated :: proc "contextless" () -> bool { - return aes.is_hardware_accelerated() -} - -@(private, enable_target_feature = "sse2,aes") -init_hw :: proc "contextless" (ctx: ^Context, st: ^State_HW, iv: []byte) { - switch ctx._key_len { - case KEY_SIZE_128L: - key := intrinsics.unaligned_load((^x86.__m128i)(&ctx._key[0])) - iv := intrinsics.unaligned_load((^x86.__m128i)(raw_data(iv))) - - st.s0 = x86._mm_xor_si128(key, iv) - st.s1 = intrinsics.unaligned_load((^x86.__m128i)(&_C1[0])) - st.s2 = intrinsics.unaligned_load((^x86.__m128i)(&_C0[0])) - st.s3 = st.s1 - st.s4 = st.s0 - st.s5 = x86._mm_xor_si128(key, st.s2) // key ^ C0 - st.s6 = x86._mm_xor_si128(key, st.s1) // key ^ C1 - st.s7 = st.s5 - st.rate = _RATE_128L - - for _ in 0 ..< 10 { - update_hw_128l(st, iv, key) - } - case KEY_SIZE_256: - k0 := intrinsics.unaligned_load((^x86.__m128i)(&ctx._key[0])) - k1 := intrinsics.unaligned_load((^x86.__m128i)(&ctx._key[16])) - n0 := intrinsics.unaligned_load((^x86.__m128i)(&iv[0])) - n1 := intrinsics.unaligned_load((^x86.__m128i)(&iv[16])) - - st.s0 = x86._mm_xor_si128(k0, n0) - st.s1 = x86._mm_xor_si128(k1, n1) - st.s2 = intrinsics.unaligned_load((^x86.__m128i)(&_C1[0])) - st.s3 = intrinsics.unaligned_load((^x86.__m128i)(&_C0[0])) - st.s4 = x86._mm_xor_si128(k0, st.s3) // k0 ^ C0 - st.s5 = x86._mm_xor_si128(k1, st.s2) // k1 ^ C1 - st.rate = _RATE_256 - - u0, u1 := st.s0, st.s1 - for _ in 0 ..< 4 { - update_hw_256(st, k0) - update_hw_256(st, k1) - update_hw_256(st, u0) - update_hw_256(st, u1) - } - } -} - -@(private = "file", enable_target_feature = "sse2,aes") -update_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, m0, m1: x86.__m128i) { - s0_ := x86._mm_aesenc_si128(st.s7, x86._mm_xor_si128(st.s0, m0)) - s1_ := x86._mm_aesenc_si128(st.s0, st.s1) - s2_ := x86._mm_aesenc_si128(st.s1, st.s2) - s3_ := x86._mm_aesenc_si128(st.s2, st.s3) - s4_ := x86._mm_aesenc_si128(st.s3, x86._mm_xor_si128(st.s4, m1)) - s5_ := x86._mm_aesenc_si128(st.s4, st.s5) - s6_ := x86._mm_aesenc_si128(st.s5, st.s6) - s7_ := x86._mm_aesenc_si128(st.s6, st.s7) - st.s0, st.s1, st.s2, st.s3, st.s4, st.s5, st.s6, st.s7 = s0_, s1_, s2_, s3_, s4_, s5_, s6_, s7_ -} - -@(private = "file", enable_target_feature = "sse2,aes") -update_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, m: x86.__m128i) { - s0_ := x86._mm_aesenc_si128(st.s5, x86._mm_xor_si128(st.s0, m)) - s1_ := x86._mm_aesenc_si128(st.s0, st.s1) - s2_ := x86._mm_aesenc_si128(st.s1, st.s2) - s3_ := x86._mm_aesenc_si128(st.s2, st.s3) - s4_ := x86._mm_aesenc_si128(st.s3, st.s4) - s5_ := x86._mm_aesenc_si128(st.s4, st.s5) - st.s0, st.s1, st.s2, st.s3, st.s4, st.s5 = s0_, s1_, s2_, s3_, s4_, s5_ -} - -@(private = "file", enable_target_feature = "sse2,aes") -absorb_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, ai: []byte) { - t0 := intrinsics.unaligned_load((^x86.__m128i)(&ai[0])) - t1 := intrinsics.unaligned_load((^x86.__m128i)(&ai[16])) - update_hw_128l(st, t0, t1) -} - -@(private = "file", enable_target_feature = "sse2,aes") -absorb_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, ai: []byte) { - m := intrinsics.unaligned_load((^x86.__m128i)(&ai[0])) - update_hw_256(st, m) -} - -@(private, enable_target_feature = "sse2,aes") -absorb_hw :: proc "contextless" (st: ^State_HW, aad: []byte) #no_bounds_check { - ai, l := aad, len(aad) - - switch st.rate { - case _RATE_128L: - for l >= _RATE_128L { - absorb_hw_128l(st, ai) - ai = ai[_RATE_128L:] - l -= _RATE_128L - } - case _RATE_256: - for l >= _RATE_256 { - absorb_hw_256(st, ai) - - ai = ai[_RATE_256:] - l -= _RATE_256 - } - } - - // Pad out the remainder with `0`s till it is rate sized. - if l > 0 { - tmp: [_RATE_MAX]byte // AAD is not confidential. - copy(tmp[:], ai) - switch st.rate { - case _RATE_128L: - absorb_hw_128l(st, tmp[:]) - case _RATE_256: - absorb_hw_256(st, tmp[:]) - } - } -} - -@(private = "file", enable_target_feature = "sse2", require_results) -z_hw_128l :: #force_inline proc "contextless" (st: ^State_HW) -> (x86.__m128i, x86.__m128i) { - z0 := x86._mm_xor_si128( - st.s6, - x86._mm_xor_si128( - st.s1, - x86._mm_and_si128(st.s2, st.s3), - ), - ) - z1 := x86._mm_xor_si128( - st.s2, - x86._mm_xor_si128( - st.s5, - x86._mm_and_si128(st.s6, st.s7), - ), - ) - return z0, z1 -} - -@(private = "file", enable_target_feature = "sse2", require_results) -z_hw_256 :: #force_inline proc "contextless" (st: ^State_HW) -> x86.__m128i { - return x86._mm_xor_si128( - st.s1, - x86._mm_xor_si128( - st.s4, - x86._mm_xor_si128( - st.s5, - x86._mm_and_si128(st.s2, st.s3), - ), - ), - ) -} - -@(private = "file", enable_target_feature = "sse2,aes") -enc_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, ci, xi: []byte) #no_bounds_check { - z0, z1 := z_hw_128l(st) - - t0 := intrinsics.unaligned_load((^x86.__m128i)(&xi[0])) - t1 := intrinsics.unaligned_load((^x86.__m128i)(&xi[16])) - update_hw_128l(st, t0, t1) - - out0 := x86._mm_xor_si128(t0, z0) - out1 := x86._mm_xor_si128(t1, z1) - intrinsics.unaligned_store((^x86.__m128i)(&ci[0]), out0) - intrinsics.unaligned_store((^x86.__m128i)(&ci[16]), out1) -} - -@(private = "file", enable_target_feature = "sse2,aes") -enc_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, ci, xi: []byte) #no_bounds_check { - z := z_hw_256(st) - - xi_ := intrinsics.unaligned_load((^x86.__m128i)(raw_data(xi))) - update_hw_256(st, xi_) - - ci_ := x86._mm_xor_si128(xi_, z) - intrinsics.unaligned_store((^x86.__m128i)(raw_data(ci)), ci_) -} - -@(private, enable_target_feature = "sse2,aes") -enc_hw :: proc "contextless" (st: ^State_HW, dst, src: []byte) #no_bounds_check { - ci, xi, l := dst, src, len(src) - - switch st.rate { - case _RATE_128L: - for l >= _RATE_128L { - enc_hw_128l(st, ci, xi) - ci = ci[_RATE_128L:] - xi = xi[_RATE_128L:] - l -= _RATE_128L - } - case _RATE_256: - for l >= _RATE_256 { - enc_hw_256(st, ci, xi) - ci = ci[_RATE_256:] - xi = xi[_RATE_256:] - l -= _RATE_256 - } - } - - // Pad out the remainder with `0`s till it is rate sized. - if l > 0 { - tmp: [_RATE_MAX]byte // Ciphertext is not confidential. - copy(tmp[:], xi) - switch st.rate { - case _RATE_128L: - enc_hw_128l(st, tmp[:], tmp[:]) - case _RATE_256: - enc_hw_256(st, tmp[:], tmp[:]) - } - copy(ci, tmp[:l]) - } -} - -@(private = "file", enable_target_feature = "sse2,aes") -dec_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, xi, ci: []byte) #no_bounds_check { - z0, z1 := z_hw_128l(st) - - t0 := intrinsics.unaligned_load((^x86.__m128i)(&ci[0])) - t1 := intrinsics.unaligned_load((^x86.__m128i)(&ci[16])) - out0 := x86._mm_xor_si128(t0, z0) - out1 := x86._mm_xor_si128(t1, z1) - - update_hw_128l(st, out0, out1) - intrinsics.unaligned_store((^x86.__m128i)(&xi[0]), out0) - intrinsics.unaligned_store((^x86.__m128i)(&xi[16]), out1) -} - -@(private = "file", enable_target_feature = "sse2,aes") -dec_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, xi, ci: []byte) #no_bounds_check { - z := z_hw_256(st) - - ci_ := intrinsics.unaligned_load((^x86.__m128i)(raw_data(ci))) - xi_ := x86._mm_xor_si128(ci_, z) - - update_hw_256(st, xi_) - intrinsics.unaligned_store((^x86.__m128i)(raw_data(xi)), xi_) -} - -@(private = "file", enable_target_feature = "sse2,aes") -dec_partial_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: []byte) #no_bounds_check { - tmp: [_RATE_128L]byte - defer crypto.zero_explicit(&tmp, size_of(tmp)) - - z0, z1 := z_hw_128l(st) - copy(tmp[:], cn) - - t0 := intrinsics.unaligned_load((^x86.__m128i)(&tmp[0])) - t1 := intrinsics.unaligned_load((^x86.__m128i)(&tmp[16])) - out0 := x86._mm_xor_si128(t0, z0) - out1 := x86._mm_xor_si128(t1, z1) - - intrinsics.unaligned_store((^x86.__m128i)(&tmp[0]), out0) - intrinsics.unaligned_store((^x86.__m128i)(&tmp[16]), out1) - copy(xn, tmp[:]) - - for off := len(xn); off < _RATE_128L; off += 1 { - tmp[off] = 0 - } - out0 = intrinsics.unaligned_load((^x86.__m128i)(&tmp[0])) // v0 - out1 = intrinsics.unaligned_load((^x86.__m128i)(&tmp[16])) // v1 - update_hw_128l(st, out0, out1) -} - -@(private = "file", enable_target_feature = "sse2,aes") -dec_partial_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: []byte) #no_bounds_check { - tmp: [_RATE_256]byte - defer crypto.zero_explicit(&tmp, size_of(tmp)) - - z := z_hw_256(st) - copy(tmp[:], cn) - - cn_ := intrinsics.unaligned_load((^x86.__m128i)(&tmp[0])) - xn_ := x86._mm_xor_si128(cn_, z) - - intrinsics.unaligned_store((^x86.__m128i)(&tmp[0]), xn_) - copy(xn, tmp[:]) - - for off := len(xn); off < _RATE_256; off += 1 { - tmp[off] = 0 - } - xn_ = intrinsics.unaligned_load((^x86.__m128i)(&tmp[0])) - update_hw_256(st, xn_) -} - -@(private, enable_target_feature = "sse2,aes") -dec_hw :: proc "contextless" (st: ^State_HW, dst, src: []byte) #no_bounds_check { - xi, ci, l := dst, src, len(src) - - switch st.rate { - case _RATE_128L: - for l >= _RATE_128L { - dec_hw_128l(st, xi, ci) - xi = xi[_RATE_128L:] - ci = ci[_RATE_128L:] - l -= _RATE_128L - } - case _RATE_256: - for l >= _RATE_256 { - dec_hw_256(st, xi, ci) - xi = xi[_RATE_256:] - ci = ci[_RATE_256:] - l -= _RATE_256 - } - } - - // Process the remainder. - if l > 0 { - switch st.rate { - case _RATE_128L: - dec_partial_hw_128l(st, xi, ci) - case _RATE_256: - dec_partial_hw_256(st, xi, ci) - } - } -} - -@(private, enable_target_feature = "sse2,aes") -finalize_hw :: proc "contextless" (st: ^State_HW, tag: []byte, ad_len, msg_len: int) { - tmp: [16]byte - endian.unchecked_put_u64le(tmp[0:], u64(ad_len) * 8) - endian.unchecked_put_u64le(tmp[8:], u64(msg_len) * 8) - - t := intrinsics.unaligned_load((^x86.__m128i)(&tmp[0])) - - t0, t1: x86.__m128i = ---, --- - switch st.rate { - case _RATE_128L: - t = x86._mm_xor_si128(st.s2, t) - for _ in 0 ..< 7 { - update_hw_128l(st, t, t) - } - - t0 = x86._mm_xor_si128(st.s0, st.s1) - t0 = x86._mm_xor_si128(t0, st.s2) - t0 = x86._mm_xor_si128(t0, st.s3) - - t1 = x86._mm_xor_si128(st.s4, st.s5) - t1 = x86._mm_xor_si128(t1, st.s6) - if len(tag) == TAG_SIZE_256 { - t1 = x86._mm_xor_si128(t1, st.s7) - } - case _RATE_256: - t = x86._mm_xor_si128(st.s3, t) - for _ in 0 ..< 7 { - update_hw_256(st, t) - } - - t0 = x86._mm_xor_si128(st.s0, st.s1) - t0 = x86._mm_xor_si128(t0, st.s2) - - t1 = x86._mm_xor_si128(st.s3, st.s4) - t1 = x86._mm_xor_si128(t1, st.s5) - } - switch len(tag) { - case TAG_SIZE_128: - t0 = x86._mm_xor_si128(t0, t1) - intrinsics.unaligned_store((^x86.__m128i)(&tag[0]), t0) - case TAG_SIZE_256: - intrinsics.unaligned_store((^x86.__m128i)(&tag[0]), t0) - intrinsics.unaligned_store((^x86.__m128i)(&tag[16]), t1) - } -} - -@(private) -reset_state_hw :: proc "contextless" (st: ^State_HW) { - crypto.zero_explicit(st, size_of(st^)) -} From e09923f585dc11a644a58903044dcec3574c89c7 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Fri, 13 Mar 2026 02:04:41 +0900 Subject: [PATCH 672/766] core/crypto/deoxysii: Migrate to generic SIMD + HW AES --- ...pl_hw_intel.odin => deoxysii_impl_hw.odin} | 241 ++++++++++-------- .../crypto/deoxysii/deoxysii_impl_hw_gen.odin | 2 + 2 files changed, 138 insertions(+), 105 deletions(-) rename core/crypto/deoxysii/{deoxysii_impl_hw_intel.odin => deoxysii_impl_hw.odin} (58%) diff --git a/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin b/core/crypto/deoxysii/deoxysii_impl_hw.odin similarity index 58% rename from core/crypto/deoxysii/deoxysii_impl_hw_intel.odin rename to core/crypto/deoxysii/deoxysii_impl_hw.odin index 88c569d53..47f9ab55f 100644 --- a/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin +++ b/core/crypto/deoxysii/deoxysii_impl_hw.odin @@ -1,152 +1,183 @@ -#+build amd64 +#+build amd64,arm64,arm32 package deoxysii import "base:intrinsics" import "core:crypto" -import "core:crypto/aes" +import aes_hw "core:crypto/_aes/hw" import "core:simd" -import "core:simd/x86" // This processes a maximum of 4 blocks at a time, as that is suitable // for most current hardware that doesn't say "Xeon". +// +// TODO/perf: ARM should be able to do 8 at a time. + +when ODIN_ARCH == .amd64 { + @(private="file") + TARGET_FEATURES :: "sse2,ssse3,aes" +} else when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32 { + @(private="file") + TARGET_FEATURES :: "neon,aes" +} @(private = "file") -_BIT_ENC :: x86.__m128i{0x80, 0} +_BIT_ENC :: simd.u8x16{0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} @(private = "file") -_PREFIX_AD_BLOCK :: x86.__m128i{PREFIX_AD_BLOCK << PREFIX_SHIFT, 0} +_PREFIX_AD_BLOCK :: simd.u8x16{ + PREFIX_AD_BLOCK << PREFIX_SHIFT, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +} @(private = "file") -_PREFIX_AD_FINAL :: x86.__m128i{PREFIX_AD_FINAL << PREFIX_SHIFT, 0} +_PREFIX_AD_FINAL :: simd.u8x16{ + PREFIX_AD_FINAL << PREFIX_SHIFT, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +} @(private = "file") -_PREFIX_MSG_BLOCK :: x86.__m128i{PREFIX_MSG_BLOCK << PREFIX_SHIFT, 0} +_PREFIX_MSG_BLOCK :: simd.u8x16{ + PREFIX_MSG_BLOCK << PREFIX_SHIFT, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +} @(private = "file") -_PREFIX_MSG_FINAL :: x86.__m128i{PREFIX_MSG_FINAL << PREFIX_SHIFT, 0} +_PREFIX_MSG_FINAL :: simd.u8x16{ + PREFIX_MSG_FINAL << PREFIX_SHIFT, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +} // is_hardware_accelerated returns true if and only if (⟺) hardware accelerated Deoxys-II // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { - return aes.is_hardware_accelerated() + return aes_hw.is_supported() } -@(private = "file", enable_target_feature = "sse4.1", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) auth_tweak :: #force_inline proc "contextless" ( - prefix: x86.__m128i, + prefix: simd.u8x16, block_nr: int, -) -> x86.__m128i { - return x86._mm_insert_epi64(prefix, i64(intrinsics.byte_swap(u64(block_nr))), 1) -} +) -> simd.u8x16 { + when ODIN_ENDIAN == .Little { + block_nr_u64 := intrinsics.byte_swap(u64(block_nr)) + } else { + block_nr_u64 := u64(block_nr) + } -@(private = "file", enable_target_feature = "sse2", require_results) -enc_tweak :: #force_inline proc "contextless" ( - tag: x86.__m128i, - block_nr: int, -) -> x86.__m128i { - return x86._mm_xor_si128( - x86._mm_or_si128(tag, _BIT_ENC), - x86.__m128i{0, i64(intrinsics.byte_swap(u64(block_nr)))}, + return simd.bit_or( + prefix, + transmute(simd.u8x16)(simd.u64x2{0, block_nr_u64}), ) } -@(private = "file", enable_target_feature = "ssse3", require_results) -h_ :: #force_inline proc "contextless" (tk1: x86.__m128i) -> x86.__m128i { - return transmute(x86.__m128i)h(transmute(simd.u8x16)tk1) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) +enc_tweak :: #force_inline proc "contextless" ( + tag: simd.u8x16, + block_nr: int, +) -> simd.u8x16 { + when ODIN_ENDIAN == .Little { + block_nr_u64 := intrinsics.byte_swap(u64(block_nr)) + } else { + block_nr_u64 := u64(block_nr) + } + + return simd.bit_xor( + simd.bit_or(tag, _BIT_ENC), + transmute(simd.u8x16)(simd.u64x2{0, block_nr_u64}), + ) } -@(private = "file", enable_target_feature = "sse2,ssse3,aes", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) bc_x4 :: #force_inline proc "contextless" ( ctx: ^Context, - s_0, s_1, s_2, s_3: x86.__m128i, - tweak_0, tweak_1, tweak_2, tweak_3: x86.__m128i, -) -> (x86.__m128i, x86.__m128i, x86.__m128i, x86.__m128i) #no_bounds_check { + s_0, s_1, s_2, s_3: simd.u8x16, + tweak_0, tweak_1, tweak_2, tweak_3: simd.u8x16, +) -> (simd.u8x16, simd.u8x16, simd.u8x16, simd.u8x16) #no_bounds_check { s_0, s_1, s_2, s_3 := s_0, s_1, s_2, s_3 tk1_0, tk1_1, tk1_2, tk1_3 := tweak_0, tweak_1, tweak_2, tweak_3 - sk := intrinsics.unaligned_load((^x86.__m128i)(&ctx._subkeys[0])) - stk_0 := x86._mm_xor_si128(tk1_0, sk) - stk_1 := x86._mm_xor_si128(tk1_1, sk) - stk_2 := x86._mm_xor_si128(tk1_2, sk) - stk_3 := x86._mm_xor_si128(tk1_3, sk) + sk := intrinsics.unaligned_load((^simd.u8x16)(&ctx._subkeys[0])) + stk_0 := simd.bit_xor(tk1_0, sk) + stk_1 := simd.bit_xor(tk1_1, sk) + stk_2 := simd.bit_xor(tk1_2, sk) + stk_3 := simd.bit_xor(tk1_3, sk) - s_0 = x86._mm_xor_si128(s_0, stk_0) - s_1 = x86._mm_xor_si128(s_1, stk_1) - s_2 = x86._mm_xor_si128(s_2, stk_2) - s_3 = x86._mm_xor_si128(s_3, stk_3) + s_0 = simd.bit_xor(s_0, stk_0) + s_1 = simd.bit_xor(s_1, stk_1) + s_2 = simd.bit_xor(s_2, stk_2) + s_3 = simd.bit_xor(s_3, stk_3) for i in 1 ..= BC_ROUNDS { - sk = intrinsics.unaligned_load((^x86.__m128i)(&ctx._subkeys[i])) + sk = intrinsics.unaligned_load((^simd.u8x16)(&ctx._subkeys[i])) - tk1_0 = h_(tk1_0) - tk1_1 = h_(tk1_1) - tk1_2 = h_(tk1_2) - tk1_3 = h_(tk1_3) + tk1_0 = h(tk1_0) + tk1_1 = h(tk1_1) + tk1_2 = h(tk1_2) + tk1_3 = h(tk1_3) - stk_0 = x86._mm_xor_si128(tk1_0, sk) - stk_1 = x86._mm_xor_si128(tk1_1, sk) - stk_2 = x86._mm_xor_si128(tk1_2, sk) - stk_3 = x86._mm_xor_si128(tk1_3, sk) + stk_0 = simd.bit_xor(tk1_0, sk) + stk_1 = simd.bit_xor(tk1_1, sk) + stk_2 = simd.bit_xor(tk1_2, sk) + stk_3 = simd.bit_xor(tk1_3, sk) - s_0 = x86._mm_aesenc_si128(s_0, stk_0) - s_1 = x86._mm_aesenc_si128(s_1, stk_1) - s_2 = x86._mm_aesenc_si128(s_2, stk_2) - s_3 = x86._mm_aesenc_si128(s_3, stk_3) + s_0 = aes_hw.aesenc(s_0, stk_0) + s_1 = aes_hw.aesenc(s_1, stk_1) + s_2 = aes_hw.aesenc(s_2, stk_2) + s_3 = aes_hw.aesenc(s_3, stk_3) } return s_0, s_1, s_2, s_3 } -@(private = "file", enable_target_feature = "sse2,ssse3,aes", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) bc_x1 :: #force_inline proc "contextless" ( ctx: ^Context, - s: x86.__m128i, - tweak: x86.__m128i, -) -> x86.__m128i #no_bounds_check { + s: simd.u8x16, + tweak: simd.u8x16, +) -> simd.u8x16 #no_bounds_check { s, tk1 := s, tweak - sk := intrinsics.unaligned_load((^x86.__m128i)(&ctx._subkeys[0])) - stk := x86._mm_xor_si128(tk1, sk) + sk := intrinsics.unaligned_load((^simd.u8x16)(&ctx._subkeys[0])) + stk := simd.bit_xor(tk1, sk) - s = x86._mm_xor_si128(s, stk) + s = simd.bit_xor(s, stk) for i in 1 ..= BC_ROUNDS { - sk = intrinsics.unaligned_load((^x86.__m128i)(&ctx._subkeys[i])) + sk = intrinsics.unaligned_load((^simd.u8x16)(&ctx._subkeys[i])) - tk1 = h_(tk1) + tk1 = h(tk1) - stk = x86._mm_xor_si128(tk1, sk) + stk = simd.bit_xor(tk1, sk) - s = x86._mm_aesenc_si128(s, stk) + s = aes_hw.aesenc(s, stk) } return s } -@(private = "file", enable_target_feature = "sse2,ssse3,sse4.1,aes", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) bc_absorb :: proc "contextless" ( ctx: ^Context, - tag: x86.__m128i, + tag: simd.u8x16, src: []byte, - tweak_prefix: x86.__m128i, + tweak_prefix: simd.u8x16, stk_block_nr: int, -) -> (x86.__m128i, int) #no_bounds_check { +) -> (simd.u8x16, int) #no_bounds_check { src, stk_block_nr, tag := src, stk_block_nr, tag nr_blocks := len(src) / BLOCK_SIZE for nr_blocks >= 4 { d_0, d_1, d_2, d_3 := bc_x4( ctx, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))), - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[BLOCK_SIZE:]))), - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[2*BLOCK_SIZE:]))), - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[3*BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[2*BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[3*BLOCK_SIZE:]))), auth_tweak(tweak_prefix, stk_block_nr), auth_tweak(tweak_prefix, stk_block_nr + 1), auth_tweak(tweak_prefix, stk_block_nr + 2), auth_tweak(tweak_prefix, stk_block_nr + 3), ) - tag = x86._mm_xor_si128(tag, d_0) - tag = x86._mm_xor_si128(tag, d_1) - tag = x86._mm_xor_si128(tag, d_2) - tag = x86._mm_xor_si128(tag, d_3) + tag = simd.bit_xor(tag, d_0) + tag = simd.bit_xor(tag, d_1) + tag = simd.bit_xor(tag, d_2) + tag = simd.bit_xor(tag, d_3) src = src[4*BLOCK_SIZE:] stk_block_nr += 4 @@ -156,11 +187,11 @@ bc_absorb :: proc "contextless" ( for nr_blocks > 0 { d := bc_x1( ctx, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))), auth_tweak(tweak_prefix, stk_block_nr), ) - tag = x86._mm_xor_si128(tag, d) + tag = simd.bit_xor(tag, d) src = src[BLOCK_SIZE:] stk_block_nr += 1 @@ -170,29 +201,29 @@ bc_absorb :: proc "contextless" ( return tag, stk_block_nr } -@(private = "file", enable_target_feature = "sse2,ssse3,aes", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) bc_final :: proc "contextless" ( ctx: ^Context, - tag: x86.__m128i, + tag: simd.u8x16, iv: []byte, -) -> x86.__m128i { +) -> simd.u8x16 { tmp: [BLOCK_SIZE]byte tmp[0] = PREFIX_TAG << PREFIX_SHIFT copy(tmp[1:], iv) - tweak := intrinsics.unaligned_load((^x86.__m128i)(&tmp)) + tweak := intrinsics.unaligned_load((^simd.u8x16)(&tmp)) return bc_x1(ctx, tag, tweak) } -@(private = "file", enable_target_feature = "sse2,ssse3,aes", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) bc_encrypt :: proc "contextless" ( ctx: ^Context, dst: []byte, src: []byte, - iv: x86.__m128i, - tweak_tag: x86.__m128i, + iv: simd.u8x16, + tweak_tag: simd.u8x16, stk_block_nr: int, ) -> int { dst, src, stk_block_nr := dst, src, stk_block_nr @@ -209,31 +240,31 @@ bc_encrypt :: proc "contextless" ( ) intrinsics.unaligned_store( - (^x86.__m128i)(raw_data(dst)), - x86._mm_xor_si128( + (^simd.u8x16)(raw_data(dst)), + simd.bit_xor( d_0, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))), ), ) intrinsics.unaligned_store( - (^x86.__m128i)(raw_data(dst[BLOCK_SIZE:])), - x86._mm_xor_si128( + (^simd.u8x16)(raw_data(dst[BLOCK_SIZE:])), + simd.bit_xor( d_1, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[BLOCK_SIZE:]))), ), ) intrinsics.unaligned_store( - (^x86.__m128i)(raw_data(dst[2*BLOCK_SIZE:])), - x86._mm_xor_si128( + (^simd.u8x16)(raw_data(dst[2*BLOCK_SIZE:])), + simd.bit_xor( d_2, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[2*BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[2*BLOCK_SIZE:]))), ), ) intrinsics.unaligned_store( - (^x86.__m128i)(raw_data(dst[3*BLOCK_SIZE:])), - x86._mm_xor_si128( + (^simd.u8x16)(raw_data(dst[3*BLOCK_SIZE:])), + simd.bit_xor( d_3, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[3*BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[3*BLOCK_SIZE:]))), ), ) @@ -250,10 +281,10 @@ bc_encrypt :: proc "contextless" ( ) intrinsics.unaligned_store( - (^x86.__m128i)(raw_data(dst)), - x86._mm_xor_si128( + (^simd.u8x16)(raw_data(dst)), + simd.bit_xor( d, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))), ), ) @@ -269,7 +300,7 @@ bc_encrypt :: proc "contextless" ( e_hw :: proc "contextless" (ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) #no_bounds_check { tmp: [BLOCK_SIZE]byte copy(tmp[1:], iv) - iv_ := intrinsics.unaligned_load((^x86.__m128i)(raw_data(&tmp))) + iv_ := intrinsics.unaligned_load((^simd.u8x16)(raw_data(&tmp))) // Algorithm 3 // @@ -282,7 +313,7 @@ e_hw :: proc "contextless" (ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) // if A_∗ != nil then // Auth <- Auth ^ EK(0110 || la, pad10∗(A_∗)) // end - auth: x86.__m128i + auth: simd.u8x16 n: int aad := aad @@ -341,14 +372,14 @@ e_hw :: proc "contextless" (ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) copy(dst[n*BLOCK_SIZE:], m_star[:]) } - intrinsics.unaligned_store((^x86.__m128i)(raw_data(tag)), auth) + intrinsics.unaligned_store((^simd.u8x16)(raw_data(tag)), auth) } @(private, require_results) d_hw :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte) -> bool { tmp: [BLOCK_SIZE]byte copy(tmp[1:], iv) - iv_ := intrinsics.unaligned_load((^x86.__m128i)(raw_data(&tmp))) + iv_ := intrinsics.unaligned_load((^simd.u8x16)(raw_data(&tmp))) // Algorithm 4 // @@ -360,7 +391,7 @@ d_hw :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte // if C_∗ != nil then // M_∗ <- C_∗ ^ EK(1 || tag ^ l, 0^8 || N) // end - auth := intrinsics.unaligned_load((^x86.__m128i)(raw_data(tag))) + auth := intrinsics.unaligned_load((^simd.u8x16)(raw_data(tag))) m := ciphertext n := bc_encrypt(ctx, dst, m, iv_, auth, 0) @@ -385,7 +416,7 @@ d_hw :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte // if A∗ != nil then // Auth <- Auth ^ EK(0110| | l_a, pad10∗(A_∗)) // end - auth = x86.__m128i{0, 0} + auth = simd.u8x16{} aad := aad auth, n = bc_absorb(ctx, auth, aad, _PREFIX_AD_BLOCK, 0) aad = aad[BLOCK_SIZE*n:] @@ -424,7 +455,7 @@ d_hw :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte // Tag verification // if tag0 = tag then return (M_1 || ... || M_l || M_∗) // else return false - intrinsics.unaligned_store((^x86.__m128i)(raw_data(&tmp)), auth) + intrinsics.unaligned_store((^simd.u8x16)(raw_data(&tmp)), auth) ok := crypto.compare_constant_time(tmp[:], tag) == 1 crypto.zero_explicit(&tmp, size_of(tmp)) diff --git a/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin b/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin index 89dae7229..7f5444535 100644 --- a/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin +++ b/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin @@ -1,4 +1,6 @@ #+build !amd64 +#+build !arm64 +#+build !arm32 package deoxysii @(private = "file") From 3139b7e755a9cea4af922a0fef47e0a372f1fba6 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Fri, 13 Mar 2026 15:00:21 +0900 Subject: [PATCH 673/766] core/crypto/aes: Migrate to generic SIMD + HW AES --- ...{aes_ctr_hw_intel.odin => aes_ctr_hw.odin} | 62 ++++----- core/crypto/aes/aes_ecb_hw.odin | 59 +++++++++ core/crypto/aes/aes_ecb_hw_intel.odin | 58 --------- core/crypto/aes/aes_gcm.odin | 5 + ...{aes_gcm_hw_intel.odin => aes_gcm_hw.odin} | 122 ++++++++++++------ ...es_impl_hw_intel.odin => aes_impl_hw.odin} | 4 +- core/crypto/aes/aes_impl_hw_gen.odin | 2 + 7 files changed, 184 insertions(+), 128 deletions(-) rename core/crypto/aes/{aes_ctr_hw_intel.odin => aes_ctr_hw.odin} (62%) create mode 100644 core/crypto/aes/aes_ecb_hw.odin delete mode 100644 core/crypto/aes/aes_ecb_hw_intel.odin rename core/crypto/aes/{aes_gcm_hw_intel.odin => aes_gcm_hw.odin} (63%) rename core/crypto/aes/{aes_impl_hw_intel.odin => aes_impl_hw.odin} (81%) diff --git a/core/crypto/aes/aes_ctr_hw_intel.odin b/core/crypto/aes/aes_ctr_hw.odin similarity index 62% rename from core/crypto/aes/aes_ctr_hw_intel.odin rename to core/crypto/aes/aes_ctr_hw.odin index f30122c86..859b63a40 100644 --- a/core/crypto/aes/aes_ctr_hw_intel.odin +++ b/core/crypto/aes/aes_ctr_hw.odin @@ -1,30 +1,32 @@ -#+build amd64 +#+build amd64,arm64,arm32 package aes import "base:intrinsics" import "core:crypto/_aes" +import aes_hw "core:crypto/_aes/hw" +import "core:encoding/endian" import "core:math/bits" -import "core:simd/x86" +import "core:simd" @(private) CTR_STRIDE_HW :: 4 @(private) CTR_STRIDE_BYTES_HW :: CTR_STRIDE_HW * BLOCK_SIZE -@(private, enable_target_feature = "sse2,aes") +@(private, enable_target_feature = aes_hw.TARGET_FEATURES) ctr_blocks_hw :: proc(ctx: ^Context_CTR, dst, src: []byte, nr_blocks: int) #no_bounds_check { hw_ctx := ctx._impl.(Context_Impl_Hardware) - sks: [15]x86.__m128i = --- + sks: [15]simd.u8x16 = --- for i in 0 ..= hw_ctx._num_rounds { - sks[i] = intrinsics.unaligned_load((^x86.__m128i)(&hw_ctx._sk_exp_enc[i])) + sks[i] = intrinsics.unaligned_load((^simd.u8x16)(&hw_ctx._sk_exp_enc[i])) } - hw_inc_ctr := #force_inline proc "contextless" (hi, lo: u64) -> (x86.__m128i, u64, u64) { - ret := x86.__m128i{ - i64(intrinsics.byte_swap(hi)), - i64(intrinsics.byte_swap(lo)), - } + hw_inc_ctr := #force_inline proc "contextless" (hi, lo: u64) -> (simd.u8x16, u64, u64) { + buf: [BLOCK_SIZE]byte = --- + endian.unchecked_put_u64be(buf[0:], hi) + endian.unchecked_put_u64be(buf[8:], lo) + ret := intrinsics.unaligned_load((^simd.u8x16)(&buf)) hi, lo := hi, lo carry: u64 @@ -46,42 +48,42 @@ ctr_blocks_hw :: proc(ctx: ^Context_CTR, dst, src: []byte, nr_blocks: int) #no_b nr_blocks := nr_blocks ctr_hi, ctr_lo := ctx._ctr_hi, ctx._ctr_lo - blks: [CTR_STRIDE_HW]x86.__m128i = --- + blks: [CTR_STRIDE_HW]simd.u8x16 = --- for nr_blocks >= CTR_STRIDE_HW { #unroll for i in 0..< CTR_STRIDE_HW { blks[i], ctr_hi, ctr_lo = hw_inc_ctr(ctr_hi, ctr_lo) } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_xor_si128(blks[i], sks[0]) + blks[i] = simd.bit_xor(blks[i], sks[0]) } #unroll for i in 1 ..= 9 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } switch hw_ctx._num_rounds { case _aes.ROUNDS_128: #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[10]) + blks[i] = aes_hw.aesenclast(blks[i], sks[10]) } case _aes.ROUNDS_192: #unroll for i in 10 ..= 11 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[12]) + blks[i] = aes_hw.aesenclast(blks[i], sks[12]) } case _aes.ROUNDS_256: #unroll for i in 10 ..= 13 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[14]) + blks[i] = aes_hw.aesenclast(blks[i], sks[14]) } } @@ -98,23 +100,23 @@ ctr_blocks_hw :: proc(ctx: ^Context_CTR, dst, src: []byte, nr_blocks: int) #no_b for nr_blocks > 0 { blks[0], ctr_hi, ctr_lo = hw_inc_ctr(ctr_hi, ctr_lo) - blks[0] = x86._mm_xor_si128(blks[0], sks[0]) + blks[0] = simd.bit_xor(blks[0], sks[0]) #unroll for i in 1 ..= 9 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } switch hw_ctx._num_rounds { case _aes.ROUNDS_128: - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[10]) + blks[0] = aes_hw.aesenclast(blks[0], sks[10]) case _aes.ROUNDS_192: #unroll for i in 10 ..= 11 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[12]) + blks[0] = aes_hw.aesenclast(blks[0], sks[12]) case _aes.ROUNDS_256: #unroll for i in 10 ..= 13 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[14]) + blks[0] = aes_hw.aesenclast(blks[0], sks[14]) } xor_blocks_hw(dst, src, blks[:1]) @@ -133,18 +135,18 @@ ctr_blocks_hw :: proc(ctx: ^Context_CTR, dst, src: []byte, nr_blocks: int) #no_b zero_explicit(&sks, size_of(sks)) } -@(private, enable_target_feature = "sse2") -xor_blocks_hw :: proc(dst, src: []byte, blocks: []x86.__m128i) { +@(private, enable_target_feature = aes_hw.TARGET_FEATURES) +xor_blocks_hw :: proc(dst, src: []byte, blocks: []simd.u8x16) { #no_bounds_check { if src != nil { for i in 0 ..< len(blocks) { off := i * BLOCK_SIZE - tmp := intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[off:]))) - blocks[i] = x86._mm_xor_si128(blocks[i], tmp) + tmp := intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[off:]))) + blocks[i] = simd.bit_xor(blocks[i], tmp) } } for i in 0 ..< len(blocks) { - intrinsics.unaligned_store((^x86.__m128i)(raw_data(dst[i * BLOCK_SIZE:])), blocks[i]) + intrinsics.unaligned_store((^simd.u8x16)(raw_data(dst[i * BLOCK_SIZE:])), blocks[i]) } } } diff --git a/core/crypto/aes/aes_ecb_hw.odin b/core/crypto/aes/aes_ecb_hw.odin new file mode 100644 index 000000000..87a006d9b --- /dev/null +++ b/core/crypto/aes/aes_ecb_hw.odin @@ -0,0 +1,59 @@ +#+build amd64,arm64,arm32 +package aes + +import "base:intrinsics" +import "core:crypto/_aes" +import aes_hw "core:crypto/_aes/hw" +import "core:simd" + +@(private, enable_target_feature = aes_hw.TARGET_FEATURES) +encrypt_block_hw :: proc(ctx: ^Context_Impl_Hardware, dst, src: []byte) { + blk := intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))) + + blk = simd.bit_xor(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[0]))) + #unroll for i in 1 ..= 9 { + blk = aes_hw.aesenc(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[i]))) + } + switch ctx._num_rounds { + case _aes.ROUNDS_128: + blk = aes_hw.aesenclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[10]))) + case _aes.ROUNDS_192: + #unroll for i in 10 ..= 11 { + blk = aes_hw.aesenc(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[i]))) + } + blk = aes_hw.aesenclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[12]))) + case _aes.ROUNDS_256: + #unroll for i in 10 ..= 13 { + blk = aes_hw.aesenc(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[i]))) + } + blk = aes_hw.aesenclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[14]))) + } + + intrinsics.unaligned_store((^simd.u8x16)(raw_data(dst)), blk) +} + +@(private, enable_target_feature = aes_hw.TARGET_FEATURES) +decrypt_block_hw :: proc(ctx: ^Context_Impl_Hardware, dst, src: []byte) { + blk := intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))) + + blk = simd.bit_xor(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[0]))) + #unroll for i in 1 ..= 9 { + blk = aes_hw.aesdec(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[i]))) + } + switch ctx._num_rounds { + case _aes.ROUNDS_128: + blk = aes_hw.aesdeclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[10]))) + case _aes.ROUNDS_192: + #unroll for i in 10 ..= 11 { + blk = aes_hw.aesdec(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[i]))) + } + blk = aes_hw.aesdeclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[12]))) + case _aes.ROUNDS_256: + #unroll for i in 10 ..= 13 { + blk = aes_hw.aesdec(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[i]))) + } + blk = aes_hw.aesdeclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[14]))) + } + + intrinsics.unaligned_store((^simd.u8x16)(raw_data(dst)), blk) +} diff --git a/core/crypto/aes/aes_ecb_hw_intel.odin b/core/crypto/aes/aes_ecb_hw_intel.odin deleted file mode 100644 index f1d44a25f..000000000 --- a/core/crypto/aes/aes_ecb_hw_intel.odin +++ /dev/null @@ -1,58 +0,0 @@ -#+build amd64 -package aes - -import "base:intrinsics" -import "core:crypto/_aes" -import "core:simd/x86" - -@(private, enable_target_feature = "sse2,aes") -encrypt_block_hw :: proc(ctx: ^Context_Impl_Hardware, dst, src: []byte) { - blk := intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))) - - blk = x86._mm_xor_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[0]))) - #unroll for i in 1 ..= 9 { - blk = x86._mm_aesenc_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[i]))) - } - switch ctx._num_rounds { - case _aes.ROUNDS_128: - blk = x86._mm_aesenclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[10]))) - case _aes.ROUNDS_192: - #unroll for i in 10 ..= 11 { - blk = x86._mm_aesenc_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[i]))) - } - blk = x86._mm_aesenclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[12]))) - case _aes.ROUNDS_256: - #unroll for i in 10 ..= 13 { - blk = x86._mm_aesenc_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[i]))) - } - blk = x86._mm_aesenclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[14]))) - } - - intrinsics.unaligned_store((^x86.__m128i)(raw_data(dst)), blk) -} - -@(private, enable_target_feature = "sse2,aes") -decrypt_block_hw :: proc(ctx: ^Context_Impl_Hardware, dst, src: []byte) { - blk := intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))) - - blk = x86._mm_xor_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[0]))) - #unroll for i in 1 ..= 9 { - blk = x86._mm_aesdec_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[i]))) - } - switch ctx._num_rounds { - case _aes.ROUNDS_128: - blk = x86._mm_aesdeclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[10]))) - case _aes.ROUNDS_192: - #unroll for i in 10 ..= 11 { - blk = x86._mm_aesdec_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[i]))) - } - blk = x86._mm_aesdeclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[12]))) - case _aes.ROUNDS_256: - #unroll for i in 10 ..= 13 { - blk = x86._mm_aesdec_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[i]))) - } - blk = x86._mm_aesdeclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[14]))) - } - - intrinsics.unaligned_store((^x86.__m128i)(raw_data(dst)), blk) -} diff --git a/core/crypto/aes/aes_gcm.odin b/core/crypto/aes/aes_gcm.odin index 0acd95d2f..531844a32 100644 --- a/core/crypto/aes/aes_gcm.odin +++ b/core/crypto/aes/aes_gcm.odin @@ -4,6 +4,7 @@ import "core:bytes" import "core:crypto" import "core:crypto/_aes" import "core:crypto/_aes/ct64" +import aes_hw "core:crypto/_aes/hw" import "core:encoding/endian" // GCM_IV_SIZE is the default size of the GCM IV in bytes. @@ -26,6 +27,10 @@ Context_GCM :: struct { // init_gcm initializes a Context_GCM with the provided key. init_gcm :: proc(ctx: ^Context_GCM, key: []byte, impl := DEFAULT_IMPLEMENTATION) { + when aes_hw.HAS_GHASH { + impl := aes_hw.is_ghash_supported() ? impl : .Portable + + } init_impl(&ctx._impl, key, impl) ctx._is_initialized = true } diff --git a/core/crypto/aes/aes_gcm_hw_intel.odin b/core/crypto/aes/aes_gcm_hw.odin similarity index 63% rename from core/crypto/aes/aes_gcm_hw_intel.odin rename to core/crypto/aes/aes_gcm_hw.odin index 75c97be80..13c035a20 100644 --- a/core/crypto/aes/aes_gcm_hw_intel.odin +++ b/core/crypto/aes/aes_gcm_hw.odin @@ -1,12 +1,13 @@ -#+build amd64 +#+build amd64,arm64,arm32 package aes import "base:intrinsics" import "core:crypto" import "core:crypto/_aes" +@(require) import "core:crypto/_aes/ct64" import aes_hw "core:crypto/_aes/hw" import "core:encoding/endian" -import "core:simd/x86" +import "core:simd" @(private) gcm_seal_hw :: proc(ctx: ^Context_Impl_Hardware, dst, tag, iv, aad, plaintext: []byte) { @@ -17,7 +18,11 @@ gcm_seal_hw :: proc(ctx: ^Context_Impl_Hardware, dst, tag, iv, aad, plaintext: [ init_ghash_hw(ctx, &h, &j0, &j0_enc, iv) // Note: Our GHASH implementation handles appending padding. - aes_hw.ghash(s[:], h[:], aad) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], aad) + } else { + ct64.ghash(s[:], h[:], aad) + } gctr_hw(ctx, dst, &s, plaintext, &h, &j0, true) final_ghash_hw(&s, &h, &j0_enc, len(aad), len(plaintext)) copy(tag, s[:]) @@ -35,7 +40,11 @@ gcm_open_hw :: proc(ctx: ^Context_Impl_Hardware, dst, iv, aad, ciphertext, tag: s: [_aes.GHASH_TAG_SIZE]byte init_ghash_hw(ctx, &h, &j0, &j0_enc, iv) - aes_hw.ghash(s[:], h[:], aad) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], aad) + } else { + ct64.ghash(s[:], h[:], aad) + } gctr_hw(ctx, dst, &s, ciphertext, &h, &j0, false) final_ghash_hw(&s, &h, &j0_enc, len(aad), len(ciphertext)) @@ -71,18 +80,26 @@ init_ghash_hw :: proc( } else { // If len(IV) != 96, then let s = 128 ceil(len(IV)/128) - len(IV), // and let J0 = GHASHH(IV || 0^(s+64) || ceil(len(IV))^64). - aes_hw.ghash(j0[:], h[:], iv) + when aes_hw.HAS_GHASH { + aes_hw.ghash(j0[:], h[:], iv) + } else { + ct64.ghash(j0[:], h[:], iv) + } tmp: [_aes.GHASH_BLOCK_SIZE]byte endian.unchecked_put_u64be(tmp[8:], u64(l) * 8) - aes_hw.ghash(j0[:], h[:], tmp[:]) + when aes_hw.HAS_GHASH { + aes_hw.ghash(j0[:], h[:], tmp[:]) + } else { + ct64.ghash(j0[:], h[:], tmp[:]) + } } // ECB encrypt j0, so that we can just XOR with the tag. encrypt_block_hw(ctx, j0_enc[:], j0[:]) } -@(private = "file", enable_target_feature = "sse2") +@(private = "file", enable_target_feature = aes_hw.TARGET_FEATURES) final_ghash_hw :: proc( s: ^[_aes.GHASH_BLOCK_SIZE]byte, h: ^[_aes.GHASH_KEY_SIZE]byte, @@ -94,14 +111,18 @@ final_ghash_hw :: proc( endian.unchecked_put_u64be(blk[0:], u64(a_len) * 8) endian.unchecked_put_u64be(blk[8:], u64(t_len) * 8) - aes_hw.ghash(s[:], h[:], blk[:]) - j0_vec := intrinsics.unaligned_load((^x86.__m128i)(j0)) - s_vec := intrinsics.unaligned_load((^x86.__m128i)(s)) - s_vec = x86._mm_xor_si128(s_vec, j0_vec) - intrinsics.unaligned_store((^x86.__m128i)(s), s_vec) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], blk[:]) + } else { + ct64.ghash(s[:], h[:], blk[:]) + } + j0_vec := intrinsics.unaligned_load((^simd.u8x16)(j0)) + s_vec := intrinsics.unaligned_load((^simd.u8x16)(s)) + s_vec = simd.bit_xor(s_vec, j0_vec) + intrinsics.unaligned_store((^simd.u8x16)(s), s_vec) } -@(private = "file", enable_target_feature = "sse2,sse4.1,aes") +@(private = "file", enable_target_feature = aes_hw.TARGET_FEATURES) gctr_hw :: proc( ctx: ^Context_Impl_Hardware, dst: []byte, @@ -111,13 +132,13 @@ gctr_hw :: proc( iv: ^[_aes.GHASH_BLOCK_SIZE]byte, is_seal: bool, ) #no_bounds_check { - sks: [15]x86.__m128i = --- + sks: [15]simd.u8x16 = --- for i in 0 ..= ctx._num_rounds { - sks[i] = intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[i])) + sks[i] = intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[i])) } // Setup the counter block - ctr_blk := intrinsics.unaligned_load((^x86.__m128i)(iv)) + ctr_blk := intrinsics.unaligned_load((^simd.u8x16)(iv)) ctr := endian.unchecked_get_u32be(iv[GCM_IV_SIZE:]) + 1 src, dst := src, dst @@ -127,11 +148,15 @@ gctr_hw :: proc( // This results in an unreadable mess, so we opt for simplicity // as performance is adequate. - blks: [CTR_STRIDE_HW]x86.__m128i = --- + blks: [CTR_STRIDE_HW]simd.u8x16 = --- nr_blocks := len(src) / BLOCK_SIZE for nr_blocks >= CTR_STRIDE_HW { if !is_seal { - aes_hw.ghash(s[:], h[:], src[:CTR_STRIDE_BYTES_HW]) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], src[:CTR_STRIDE_BYTES_HW]) + } else { + ct64.ghash(s[:], h[:], src[:CTR_STRIDE_BYTES_HW]) + } } #unroll for i in 0 ..< CTR_STRIDE_HW { @@ -139,42 +164,46 @@ gctr_hw :: proc( } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_xor_si128(blks[i], sks[0]) + blks[i] = simd.bit_xor(blks[i], sks[0]) } #unroll for i in 1 ..= 9 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } switch ctx._num_rounds { case _aes.ROUNDS_128: #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[10]) + blks[i] = aes_hw.aesenclast(blks[i], sks[10]) } case _aes.ROUNDS_192: #unroll for i in 10 ..= 11 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[12]) + blks[i] = aes_hw.aesenclast(blks[i], sks[12]) } case _aes.ROUNDS_256: #unroll for i in 10 ..= 13 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[14]) + blks[i] = aes_hw.aesenclast(blks[i], sks[14]) } } xor_blocks_hw(dst, src, blks[:]) if is_seal { - aes_hw.ghash(s[:], h[:], dst[:CTR_STRIDE_BYTES_HW]) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], dst[:CTR_STRIDE_BYTES_HW]) + } else { + ct64.ghash(s[:], h[:], dst[:CTR_STRIDE_BYTES_HW]) + } } src = src[CTR_STRIDE_BYTES_HW:] @@ -186,28 +215,32 @@ gctr_hw :: proc( for n := len(src); n > 0; { l := min(n, BLOCK_SIZE) if !is_seal { - aes_hw.ghash(s[:], h[:], src[:l]) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], src[:l]) + } else { + ct64.ghash(s[:], h[:], src[:l]) + } } blks[0], ctr = hw_inc_ctr32(&ctr_blk, ctr) - blks[0] = x86._mm_xor_si128(blks[0], sks[0]) + blks[0] = simd.bit_xor(blks[0], sks[0]) #unroll for i in 1 ..= 9 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } switch ctx._num_rounds { case _aes.ROUNDS_128: - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[10]) + blks[0] = aes_hw.aesenclast(blks[0], sks[10]) case _aes.ROUNDS_192: #unroll for i in 10 ..= 11 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[12]) + blks[0] = aes_hw.aesenclast(blks[0], sks[12]) case _aes.ROUNDS_256: #unroll for i in 10 ..= 13 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[14]) + blks[0] = aes_hw.aesenclast(blks[0], sks[14]) } if l == BLOCK_SIZE { @@ -219,7 +252,11 @@ gctr_hw :: proc( copy(dst, blk[:l]) } if is_seal { - aes_hw.ghash(s[:], h[:], dst[:l]) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], dst[:l]) + } else { + ct64.ghash(s[:], h[:], dst[:l]) + } } dst = dst[l:] @@ -235,8 +272,17 @@ gctr_hw :: proc( // the compiler. // // src/check_expr.cpp(8104): Assertion Failure: `c->curr_proc_decl->entity` -@(private = "file", enable_target_feature = "sse4.1") -hw_inc_ctr32 :: #force_inline proc "contextless" (src: ^x86.__m128i, ctr: u32) -> (x86.__m128i, u32) { - ret := x86._mm_insert_epi32(src^, i32(intrinsics.byte_swap(ctr)), 3) +@(private = "file", enable_target_feature = aes_hw.TARGET_FEATURES) +hw_inc_ctr32 :: #force_inline proc "contextless" (src: ^simd.u8x16, ctr: u32) -> (simd.u8x16, u32) { + when ODIN_ENDIAN == .Little { + ctr_be := intrinsics.byte_swap(ctr) + } else { + ctr_be := ctr + } + + ret := transmute(simd.u8x16)( + simd.replace(transmute(simd.u32x4)(src^), 3, ctr_be) + ) + return ret, ctr + 1 } diff --git a/core/crypto/aes/aes_impl_hw_intel.odin b/core/crypto/aes/aes_impl_hw.odin similarity index 81% rename from core/crypto/aes/aes_impl_hw_intel.odin rename to core/crypto/aes/aes_impl_hw.odin index fe3849eda..fe93966f8 100644 --- a/core/crypto/aes/aes_impl_hw_intel.odin +++ b/core/crypto/aes/aes_impl_hw.odin @@ -1,4 +1,4 @@ -#+build amd64 +#+build amd64,arm64,arm32 package aes import aes_hw "core:crypto/_aes/hw" @@ -12,7 +12,7 @@ is_hardware_accelerated :: proc "contextless" () -> bool { @(private) Context_Impl_Hardware :: aes_hw.Context -@(private, enable_target_feature = "sse2,aes") +@(private, enable_target_feature = aes_hw.TARGET_FEATURES) init_impl_hw :: proc(ctx: ^Context_Impl_Hardware, key: []byte) { aes_hw.init(ctx, key) } diff --git a/core/crypto/aes/aes_impl_hw_gen.odin b/core/crypto/aes/aes_impl_hw_gen.odin index 506298751..10b08b7b5 100644 --- a/core/crypto/aes/aes_impl_hw_gen.odin +++ b/core/crypto/aes/aes_impl_hw_gen.odin @@ -1,4 +1,6 @@ #+build !amd64 +#+build !arm64 +#+build !arm32 package aes @(private = "file") From 411e85f02ef642705da80feb084cdca547b58709 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 13 Mar 2026 13:37:34 +0000 Subject: [PATCH 674/766] Fix copy-and-paste doc typo --- core/reflect/types.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/reflect/types.odin b/core/reflect/types.odin index c6400eb63..fa40c1d1b 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -434,7 +434,7 @@ is_simd_vector :: proc(info: ^Type_Info) -> bool { _, ok := type_info_base(info).variant.(Type_Info_Simd_Vector) return ok } -// Returns true when the type is a dynamic-array type ([dynamic]T), false otherwise. +// Returns true when the type is a fixed-capacity dynamic-array type ([dynamic; N]T), false otherwise. @(require_results) is_fixed_capacity_dynamic_array :: proc(info: ^Type_Info) -> bool { if info == nil { return false } From af8853473af19ee9c424d0974392b1e26d820441 Mon Sep 17 00:00:00 2001 From: Laytan Date: Tue, 11 Nov 2025 19:14:40 +0100 Subject: [PATCH 675/766] query host features instead of only host cpu for more accurate -microarch:native --- src/llvm_backend.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 931813f42..600df6a20 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -66,6 +66,19 @@ gb_internal String get_final_microarchitecture() { gb_internal String get_default_features() { BuildContext *bc = &build_context; + if (bc->microarch == str_lit("native")) { + String features = make_string_c(LLVMGetHostCPUFeatures()); + + // Update the features string so LLVM uses it later. + if (bc->target_features_string.len > 0) { + bc->target_features_string = concatenate3_strings(permanent_allocator(), features, str_lit(","), bc->target_features_string); + } else { + bc->target_features_string = features; + } + + return features; + } + int off = 0; for (int i = 0; i < bc->metrics.arch; i += 1) { off += target_microarch_counts[i]; From f56ec37d1b7f532a941d683181fe031fa7f74499 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 13 Mar 2026 20:43:03 +0100 Subject: [PATCH 676/766] fix type info of u16 could not be found --- src/checker.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 8acc5f4ae..f0ba94d24 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2240,7 +2240,7 @@ gb_internal void add_type_info_type_internal(CheckerContext *c, Type *t) { case Type_BitSet: add_type_info_type_internal(c, bt->BitSet.elem); - add_type_info_type_internal(c, bt->BitSet.underlying); + add_type_info_type_internal(c, bit_set_to_int(bt)); break; case Type_Pointer: @@ -2479,7 +2479,7 @@ gb_internal void add_min_dep_type_info(Checker *c, Type *t) { case Type_BitSet: add_min_dep_type_info(c, bt->BitSet.elem); - add_min_dep_type_info(c, bt->BitSet.underlying); + add_min_dep_type_info(c, bit_set_to_int(bt)); break; case Type_Pointer: From adb2890d2bf05b4f3764418cc7bd6a5c16f9e67e Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 14 Mar 2026 04:12:17 +0900 Subject: [PATCH 677/766] core/simd/arm: Formating fixes (NFC) --- core/simd/arm/aes.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/simd/arm/aes.odin b/core/simd/arm/aes.odin index acafb9f1e..b1f44e52c 100644 --- a/core/simd/arm/aes.odin +++ b/core/simd/arm/aes.odin @@ -1,27 +1,27 @@ #+build arm64,arm32 package simd_arm -@(require_results,enable_target_feature="aes") +@(require_results, enable_target_feature = "aes") vaeseq_u8 :: #force_inline proc "c" (data, key: uint8x16_t) -> uint8x16_t { return _vaeseq_u8(data, key) } -@(require_results,enable_target_feature="aes") +@(require_results, enable_target_feature = "aes") vaesdq_u8 :: #force_inline proc "c" (data, key: uint8x16_t) -> uint8x16_t { return _vaesdq_u8(data, key) } -@(require_results,enable_target_feature="aes") +@(require_results, enable_target_feature = "aes") vaesmcq_u8 :: #force_inline proc "c" (data: uint8x16_t) -> uint8x16_t { return _vaesmcq_u8(data) } -@(require_results,enable_target_feature="aes") +@(require_results,enable_target_feature = "aes") vaesimcq_u8 :: #force_inline proc "c" (data: uint8x16_t) -> uint8x16_t { return _vaesimcq_u8(data) } -@(private,default_calling_convention="none") +@(private, default_calling_convention = "none") foreign _ { @(link_name = "llvm.aarch64.crypto.aese" when ODIN_ARCH == .arm64 else "llvm.arm.neon.aese") _vaeseq_u8 :: proc(data, key: uint8x16_t) -> uint8x16_t --- From 3a59e8c84950eabf6c50a684a0e02dbde250ec22 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 14 Mar 2026 05:09:35 +0900 Subject: [PATCH 678/766] core/simd/arm: Add the SHA intrinsics The SHA3 ones aren't in the developer.arm.com documentation. --- core/simd/arm/sha.odin | 108 +++++++++++++++++++++++++++++++++++++++ core/simd/arm/types.odin | 4 ++ 2 files changed, 112 insertions(+) create mode 100644 core/simd/arm/sha.odin diff --git a/core/simd/arm/sha.odin b/core/simd/arm/sha.odin new file mode 100644 index 000000000..ca87c9795 --- /dev/null +++ b/core/simd/arm/sha.odin @@ -0,0 +1,108 @@ +#+build arm64,arm32 +package simd_arm + +@(require_results, enable_target_feature = "sha2") +vsha1cq_u32 :: #force_inline proc "c" (hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t { + return _vsha1cq_u32(hash_abcd, e, wk) +} + +@(require_results, enable_target_feature = "sha2") +vsha1pq_u32 :: #force_inline proc "c" (hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t { + return _vsha1pq_u32(hash_abcd, e, wk) +} + +@(require_results, enable_target_feature = "sha2") +vsha1mq_u32 :: #force_inline proc "c" (hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t { + return _vsha1mq_u32(hash_abcd, e, wk) +} + +@(require_results, enable_target_feature = "sha2") +vsha1h_u32 :: #force_inline proc "c" (e: uint32_t) -> uint32_t { + return _vsha1h_u32(e) +} + +@(require_results, enable_target_feature = "sha2") +vsha1su0q_u32 :: #force_inline proc "c" (w0_3, w4_7, w8_11: uint32x4_t) -> uint32x4_t { + return _vsha1su0q_u32(w0_3, w4_7, w8_11) +} + +@(require_results, enable_target_feature = "sha2") +vsha1su1q_u32 :: #force_inline proc "c" (tw0_3, w12_15: uint32x4_t) -> uint32x4_t { + return _vsha1su1q_u32(tw0_3, w12_15) +} + +@(require_results, enable_target_feature = "sha2") +vsha256hq_u32 :: #force_inline proc "c" (hash_abcd, hash_efgh, wk: uint32x4_t) -> uint32x4_t { + return _vsha256hq_u32(hash_abcd, hash_efgh, wk) +} + +@(require_results, enable_target_feature = "sha2") +vsha256h2q_u32 :: #force_inline proc "c" (hash_efgh, hash_abcd, wk: uint32x4_t) -> uint32x4_t { + return _vsha256h2q_u32(hash_efgh, hash_abcd, wk) +} + +@(require_results, enable_target_feature = "sha2") +vsha256su0q_u32 :: #force_inline proc "c" (w0_3, w4_7: uint32x4_t) -> uint32x4_t { + return _vsha256su0q_u32(w0_3, w4_7) +} + +@(require_results, enable_target_feature = "sha2") +vsha256su1q_u32 :: #force_inline proc "c" (tw0_3, w8_11, w12_15: uint32x4_t) -> uint32x4_t { + return _vsha256su1q_u32(tw0_3, w8_11, w12_15) +} + +// Note: The SHA512 instructions are part of the `sha3` feature set. + +@(require_results, enable_target_feature = "sha3") +vsha512hq_u64 :: #force_inline proc "c" (hash_ed, hash_gf, kwh_kwh2: uint64x2_t) -> uint64x2_t { + return _vsha512hq_u64(hash_ed, hash_gf, kwh_kwh2) +} + +@(require_results, enable_target_feature = "sha3") +vsha512h2q_u64 :: #force_inline proc "c" (sum_ab, hash_c_, hash_ab: uint64x2_t) -> uint64x2_t { + return _vsha512h2q_u64(sum_ab, hash_c_, hash_ab) +} + +@(require_results, enable_target_feature = "sha3") +vsha512su0q_u64 :: #force_inline proc "c" (w0_1, w2_: uint64x2_t) -> uint64x2_t { + return _vsha512su0q_u64(w0_1, w2_) +} + +@(require_results, enable_target_feature = "sha3") +vsha512su1q_u64 :: #force_inline proc "c" (s01_s02, w14_15, w9_10: uint64x2_t) -> uint64x2_t { + return _vsha512su1q_u64(s01_s02, w14_15, w9_10) +} + +@(private, default_calling_convention = "none") +foreign _ { + @(link_name = "llvm.aarch64.crypto.sha1c" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1c") + _vsha1cq_u32 :: proc(hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha1p" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1p") + _vsha1pq_u32 :: proc(hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha1m" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1m") + _vsha1mq_u32 :: proc(hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha1h" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1h") + _vsha1h_u32 :: proc(e: uint32_t) -> uint32_t --- + @(link_name = "llvm.aarch64.crypto.sha1su0" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1su0") + _vsha1su0q_u32 :: proc(w0_3, w4_7, w8_11: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha1su1" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1su1") + _vsha1su1q_u32 :: proc(tw0_3, w12_15: uint32x4_t) -> uint32x4_t --- + + @(link_name = "llvm.aarch64.crypto.sha256h" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha256h") + _vsha256hq_u32 :: proc(hash_abcd, hash_efgh, wk: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha256h2" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha256h2") + _vsha256h2q_u32 :: proc(hash_efgh, hash_abcd, wk: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha256su0" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha256su0") + _vsha256su0q_u32 :: proc(w0_3, w4_7: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha256su1" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha256su1") + _vsha256su1q_u32 :: proc(tw0_3, w8_11, w12_15: uint32x4_t) -> uint32x4_t --- + + @(link_name = "llvm.aarch64.crypto.sha512h" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha512h") + _vsha512hq_u64 :: proc(hash_ed, hash_gf, kwh_kwh2: uint64x2_t) -> uint64x2_t --- + @(link_name = "llvm.aarch64.crypto.sha512h2" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha512h2") + _vsha512h2q_u64 :: proc(sum_ab, hash_c_, hash_ab: uint64x2_t) -> uint64x2_t --- + @(link_name = "llvm.aarch64.crypto.sha512su0" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha512su0") + _vsha512su0q_u64 :: proc(w0_1, w2_: uint64x2_t) -> uint64x2_t --- + @(link_name = "llvm.aarch64.crypto.sha512su1" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha512su1") + _vsha512su1q_u64 :: proc(s01_s02, w14_15, w9_10: uint64x2_t) -> uint64x2_t --- +} diff --git a/core/simd/arm/types.odin b/core/simd/arm/types.odin index 7c86483a7..05e3540b6 100644 --- a/core/simd/arm/types.odin +++ b/core/simd/arm/types.odin @@ -1,5 +1,9 @@ #+build arm64,arm32 package simd_arm +// Type aliases to match `arm_neon.h`. +uint32_t :: u32 + uint8x16_t :: #simd[16]u8 uint32x4_t :: #simd[4]u32 +uint64x2_t :: #simd[2]u64 From ee667ec02bcf2ef954f7a3c551977bf42bb2f5cf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 14 Mar 2026 16:21:38 +0000 Subject: [PATCH 679/766] Update core/reflect/reflect.odin Co-authored-by: Laytan --- core/reflect/reflect.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index a0cc468f2..e7115fc96 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -1948,7 +1948,7 @@ equal :: proc(a, b: any, including_indirect_array_recursion := false, recursion_ } for i in 0.. Date: Sat, 14 Mar 2026 16:22:01 +0000 Subject: [PATCH 680/766] Update core/encoding/cbor/marshal.odin Co-authored-by: Laytan --- core/encoding/cbor/marshal.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/encoding/cbor/marshal.odin b/core/encoding/cbor/marshal.odin index 366473bcc..b9333bf2b 100644 --- a/core/encoding/cbor/marshal.odin +++ b/core/encoding/cbor/marshal.odin @@ -287,13 +287,13 @@ _marshal_into_encoder :: proc(e: Encoder, v: any, ti: ^runtime.Type_Info) -> (er case runtime.Type_Info_Fixed_Capacity_Dynamic_Array: + array_data := uintptr(v.data) + array_len := (^int)(array_data + info.len_offset)^ if info.elem.id == byte { - raw := (^[dynamic]byte)(v.data) - return err_conv(_encode_bytes(e, raw[:])) + raw := runtime.Raw_Slice{v.data, array_len} + return err_conv(_encode_bytes(e, transmute([]byte)raw)) } - array_len := (^int)(uintptr(v.data) + info.len_offset)^ - array_data := uintptr(v.data) err_conv(_encode_u64(e, u64(array_len), .Array)) or_return if impl, ok := _tag_implementations_type[info.elem.id]; ok { From 59bc428782717f4fc565e4d137df697d2dea961a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 14 Mar 2026 16:22:12 +0000 Subject: [PATCH 681/766] Update core/odin/ast/ast.odin Co-authored-by: Laytan --- core/odin/ast/ast.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 8f5f466cb..22139d7f9 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -787,7 +787,7 @@ Dynamic_Array_Type :: struct { } Fixed_Capacity_Dynamic_Array_Type :: struct { - using node: Expr, + using node: Expr, tag: ^Expr, // possibly nil open: tokenizer.Pos, dynamic_pos: tokenizer.Pos, From 0e6ea3884d4e6f36c981d858f5e9ff6e1484a939 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 14 Mar 2026 16:26:42 +0000 Subject: [PATCH 682/766] General improves --- src/checker.cpp | 4 +++- src/types.cpp | 2 +- .../test_fixed_capacity_dynamic_array.odin | 17 ++++++++++++++++- 3 files changed, 20 insertions(+), 3 deletions(-) rename tests/{core/container => internal}/test_fixed_capacity_dynamic_array.odin (94%) diff --git a/src/checker.cpp b/src/checker.cpp index 2ac5aa62d..cd5842b10 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2278,7 +2278,7 @@ gb_internal void add_type_info_type_internal(CheckerContext *c, Type *t) { case Type_FixedCapacityDynamicArray: add_type_info_type_internal(c, bt->FixedCapacityDynamicArray.elem); - add_type_info_type_internal(c, t_allocator); + add_type_info_type_internal(c, t_int); break; case Type_Enum: @@ -2521,6 +2521,8 @@ gb_internal void add_min_dep_type_info(Checker *c, Type *t) { case Type_FixedCapacityDynamicArray: add_min_dep_type_info(c, bt->FixedCapacityDynamicArray.elem); + add_min_dep_type_info(c, alloc_type_pointer(bt->FixedCapacityDynamicArray.elem)); + add_min_dep_type_info(c, alloc_type_array(bt->FixedCapacityDynamicArray.elem, bt->FixedCapacityDynamicArray.capacity)); add_min_dep_type_info(c, t_int); case Type_Enum: diff --git a/src/types.cpp b/src/types.cpp index 1fb274f6a..2f13ed1f1 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -2559,7 +2559,7 @@ gb_internal bool type_has_nil(Type *t) { return true; case Type_FixedCapacityDynamicArray: - // TODO(bill): should it have `nil`? + // it's like a normal array, so no, similar to `#soa[N]T return false; case Type_Union: diff --git a/tests/core/container/test_fixed_capacity_dynamic_array.odin b/tests/internal/test_fixed_capacity_dynamic_array.odin similarity index 94% rename from tests/core/container/test_fixed_capacity_dynamic_array.odin rename to tests/internal/test_fixed_capacity_dynamic_array.odin index 648938e6b..49cf3a8f9 100644 --- a/tests/core/container/test_fixed_capacity_dynamic_array.odin +++ b/tests/internal/test_fixed_capacity_dynamic_array.odin @@ -1,7 +1,22 @@ -package test_core_container +package test_internal import "core:testing" +@(private="file") +slice_equal :: proc(a, b: []int) -> bool { + if len(a) != len(b) { + return false + } + + for a, i in a { + if b[i] != a { + return false + } + } + return true +} + + @(test) test_fixed_capacity_dynamic_array_removes :: proc(t: ^testing.T) { array: [dynamic; 10]int From 84b38810f11802511101345daeefdd943a43d622 Mon Sep 17 00:00:00 2001 From: mlgudi Date: Sun, 15 Mar 2026 02:46:30 +0000 Subject: [PATCH 683/766] powmod: fix Montgomery branch calling Barrett implementation --- core/math/big/prime.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/math/big/prime.odin b/core/math/big/prime.odin index 1c772143b..7fa6d8e4a 100644 --- a/core/math/big/prime.odin +++ b/core/math/big/prime.odin @@ -101,7 +101,7 @@ internal_int_power_modulo :: proc(res, G, X, P: ^Int, allocator := context.alloc If the modulus is odd or dr != 0 use the montgomery method. */ if internal_int_is_odd(P) || dr != 0 { - return _private_int_exponent_mod(res, G, X, P, dr) + return _private_int_exponent_mod_fast(res, G, X, P, dr) } /* From 76da2c32334aefa69daa7f3c3a8ea6de3c0adf97 Mon Sep 17 00:00:00 2001 From: mlgudi Date: Sun, 15 Mar 2026 02:47:26 +0000 Subject: [PATCH 684/766] mul_high: fix aliasing bug when dest overlaps input --- core/math/big/private.odin | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/core/math/big/private.odin b/core/math/big/private.odin index 506f68165..1feb433b0 100644 --- a/core/math/big/private.odin +++ b/core/math/big/private.odin @@ -439,8 +439,14 @@ _private_int_mul_high :: proc(dest, a, b: ^Int, digits: int, allocator := contex return _private_int_mul_high_comba(dest, a, b, digits) } - internal_grow(dest, a.used + b.used + 1) or_return - dest.used = a.used + b.used + 1 + /* + Set up temporary output `Int`, which we'll swap for `dest` when done. + */ + + t := &Int{} + + internal_grow(t, a.used + b.used + 1) or_return + t.used = a.used + b.used + 1 pa := a.used pb := b.used @@ -451,20 +457,23 @@ _private_int_mul_high :: proc(dest, a, b: ^Int, digits: int, allocator := contex /* Calculate the double precision result. */ - r := _WORD(dest.digit[ix + iy]) + _WORD(a.digit[ix]) * _WORD(b.digit[iy]) + _WORD(carry) + r := _WORD(t.digit[ix + iy]) + _WORD(a.digit[ix]) * _WORD(b.digit[iy]) + _WORD(carry) /* Get the lower part. */ - dest.digit[ix + iy] = DIGIT(r & _WORD(_MASK)) + t.digit[ix + iy] = DIGIT(r & _WORD(_MASK)) /* Carry the carry. */ carry = DIGIT(r >> _WORD(_DIGIT_BITS)) } - dest.digit[ix + pb] = carry + t.digit[ix + pb] = carry } + + internal_swap(dest, t) + internal_destroy(t) return internal_clamp(dest) } From 9194b599ec5f3b3edbc88c31ef19ebc372cebdf2 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sun, 15 Mar 2026 00:09:25 +0900 Subject: [PATCH 685/766] core/crypto/sha2: Add ARMv8 SHA256 acceleration --- core/crypto/sha2/sha256_impl_hw_arm.odin | 224 ++++++++++++++++++ ...w_intel.odin => sha256_impl_hw_intel.odin} | 0 core/crypto/sha2/sha2_impl_hw_gen.odin | 2 + 3 files changed, 226 insertions(+) create mode 100644 core/crypto/sha2/sha256_impl_hw_arm.odin rename core/crypto/sha2/{sha2_impl_hw_intel.odin => sha256_impl_hw_intel.odin} (100%) diff --git a/core/crypto/sha2/sha256_impl_hw_arm.odin b/core/crypto/sha2/sha256_impl_hw_arm.odin new file mode 100644 index 000000000..618cc6fff --- /dev/null +++ b/core/crypto/sha2/sha256_impl_hw_arm.odin @@ -0,0 +1,224 @@ +#+build arm64,arm32 +package sha2 + +// Based on the public domain code by Jeffrey Walton, though +// realistically, there only is one sensible way to write this. +// +// See: https://github.com/noloader/SHA-Intrinsics + +import "base:intrinsics" +import "core:simd" +import "core:simd/arm" +import "core:sys/info" + +// is_hardware_accelerated_256 returns true if and only if (⟺) hardware +// accelerated SHA-224/SHA-256 is supported. +is_hardware_accelerated_256 :: proc "contextless" () -> bool { + req_features :: info.CPU_Features{ + .asimd, + .sha256, + } + return info.cpu_features() >= req_features +} + +@(private = "file") +K_0 :: simd.u32x4{0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5} +@(private = "file") +K_1 :: simd.u32x4{0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5} +@(private = "file") +K_2 :: simd.u32x4{0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3} +@(private = "file") +K_3 :: simd.u32x4{0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174} +@(private = "file") +K_4 :: simd.u32x4{0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC} +@(private = "file") +K_5 :: simd.u32x4{0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA} +@(private = "file") +K_6 :: simd.u32x4{0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7} +@(private = "file") +K_7 :: simd.u32x4{0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967} +@(private = "file") +K_8 :: simd.u32x4{0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13} +@(private = "file") +K_9 :: simd.u32x4{0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85} +@(private = "file") +K_10 :: simd.u32x4{0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3} +@(private = "file") +K_11 :: simd.u32x4{0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070} +@(private = "file") +K_12 :: simd.u32x4{0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5} +@(private = "file") +K_13 :: simd.u32x4{0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3} +@(private = "file") +K_14 :: simd.u32x4{0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208} +@(private = "file") +K_15 :: simd.u32x4{0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2} + +@(private, enable_target_feature = "neon,sha2") +sha256_transf_hw :: proc "contextless" (ctx: ^Context_256, data: []byte) #no_bounds_check { + state_0 := intrinsics.unaligned_load((^simd.u32x4)(&ctx.h[0])) + state_1 := intrinsics.unaligned_load((^simd.u32x4)(&ctx.h[4])) + + data := data + for len(data) >= BLOCK_SIZE_256 { + // Save state + abef_save, cdgh_save := state_0, state_1 + + // Load message + msg_0 := intrinsics.unaligned_load((^simd.u32x4)(raw_data(data))) + msg_1 := intrinsics.unaligned_load((^simd.u32x4)(raw_data(data[16:]))) + msg_2 := intrinsics.unaligned_load((^simd.u32x4)(raw_data(data[32:]))) + msg_3 := intrinsics.unaligned_load((^simd.u32x4)(raw_data(data[48:]))) + + // Reverse for little endian + when ODIN_ENDIAN == .Little { + msg_0 = byteswap_u32x4(msg_0) + msg_1 = byteswap_u32x4(msg_1) + msg_2 = byteswap_u32x4(msg_2) + msg_3 = byteswap_u32x4(msg_3) + } + + tmp_0 := simd.add(msg_0, K_0) + + // Rounds 0-3 + msg_0 = arm.vsha256su0q_u32(msg_0, msg_1) + tmp_2 := state_0 + tmp_1 := simd.add(msg_1, K_1) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_0 = arm.vsha256su1q_u32(msg_0, msg_2, msg_3) + + // Rounds 4-7 + msg_1 = arm.vsha256su0q_u32(msg_1, msg_2) + tmp_2 = state_0 + tmp_0 = simd.add(msg_2, K_2) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_1 = arm.vsha256su1q_u32(msg_1, msg_3, msg_0) + + // Rounds 8-11 + msg_2 = arm.vsha256su0q_u32(msg_2, msg_3) + tmp_2 = state_0 + tmp_1 = simd.add(msg_3, K_3) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_2 = arm.vsha256su1q_u32(msg_2, msg_0, msg_1) + + // Rounds 12-15 + msg_3 = arm.vsha256su0q_u32(msg_3, msg_0) + tmp_2 = state_0 + tmp_0 = simd.add(msg_0, K_4) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_3 = arm.vsha256su1q_u32(msg_3, msg_1, msg_2) + + // Rounds 16-19 + msg_0 = arm.vsha256su0q_u32(msg_0, msg_1) + tmp_2 = state_0 + tmp_1 = simd.add(msg_1, K_5) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_0 = arm.vsha256su1q_u32(msg_0, msg_2, msg_3) + + // Rounds 20-23 + msg_1 = arm.vsha256su0q_u32(msg_1, msg_2) + tmp_2 = state_0 + tmp_0 = simd.add(msg_2, K_6) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_1 = arm.vsha256su1q_u32(msg_1, msg_3, msg_0) + + // Rounds 24-27 + msg_2 = arm.vsha256su0q_u32(msg_2, msg_3) + tmp_2 = state_0 + tmp_1 = simd.add(msg_3, K_7) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_2 = arm.vsha256su1q_u32(msg_2, msg_0, msg_1) + + // Rounds 28-31 + msg_3 = arm.vsha256su0q_u32(msg_3, msg_0) + tmp_2 = state_0 + tmp_0 = simd.add(msg_0, K_8) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_3 = arm.vsha256su1q_u32(msg_3, msg_1, msg_2) + + // Rounds 32-35 + msg_0 = arm.vsha256su0q_u32(msg_0, msg_1) + tmp_2 = state_0 + tmp_1 = simd.add(msg_1, K_9) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_0 = arm.vsha256su1q_u32(msg_0, msg_2, msg_3) + + // Rounds 36-39 + msg_1 = arm.vsha256su0q_u32(msg_1, msg_2) + tmp_2 = state_0 + tmp_0 = simd.add(msg_2, K_10) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_1 = arm.vsha256su1q_u32(msg_1, msg_3, msg_0) + + // Rounds 40-43 + msg_2 = arm.vsha256su0q_u32(msg_2, msg_3) + tmp_2 = state_0 + tmp_1 = simd.add(msg_3, K_11) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_2 = arm.vsha256su1q_u32(msg_2, msg_0, msg_1) + + // Rounds 44-47 + msg_3 = arm.vsha256su0q_u32(msg_3, msg_0) + tmp_2 = state_0 + tmp_0 = simd.add(msg_0, K_12) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_3 = arm.vsha256su1q_u32(msg_3, msg_1, msg_2) + + // Rounds 48-51 + tmp_2 = state_0 + tmp_1 = simd.add(msg_1, K_13) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + + // Rounds 52-55 + tmp_2 = state_0 + tmp_0 = simd.add(msg_2, K_14) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + + // Rounds 56-59 + tmp_2 = state_0 + tmp_1 = simd.add(msg_3, K_15) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + + // Rounds 60-63 + tmp_2 = state_0 + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + + // Combine state + state_0 = simd.add(state_0, abef_save) + state_1 = simd.add(state_1, cdgh_save) + + data = data[BLOCK_SIZE_256:] + } + + intrinsics.unaligned_store((^simd.u32x4)(&ctx.h[0]), state_0) + intrinsics.unaligned_store((^simd.u32x4)(&ctx.h[4]), state_1) +} + +when ODIN_ENDIAN == .Little { + @(private = "file", enable_target_feature = "neon") + byteswap_u32x4 :: #force_inline proc "contextless" (a: simd.u32x4) -> simd.u32x4 { + return transmute(simd.u32x4)( + simd.shuffle( + transmute(simd.u8x16)(a), + transmute(simd.u8x16)(a), + 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12, + ) + ) + } +} \ No newline at end of file diff --git a/core/crypto/sha2/sha2_impl_hw_intel.odin b/core/crypto/sha2/sha256_impl_hw_intel.odin similarity index 100% rename from core/crypto/sha2/sha2_impl_hw_intel.odin rename to core/crypto/sha2/sha256_impl_hw_intel.odin diff --git a/core/crypto/sha2/sha2_impl_hw_gen.odin b/core/crypto/sha2/sha2_impl_hw_gen.odin index 837d0656d..d735e3c61 100644 --- a/core/crypto/sha2/sha2_impl_hw_gen.odin +++ b/core/crypto/sha2/sha2_impl_hw_gen.odin @@ -1,4 +1,6 @@ #+build !amd64 +#+build !arm64 +#+build !arm32 package sha2 @(private = "file") From f82fbc94051955c2024d6a9e8299034a86b29b16 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 15 Mar 2026 11:06:22 +0100 Subject: [PATCH 686/766] -vet-tabs --- core/math/big/private.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/math/big/private.odin b/core/math/big/private.odin index 1feb433b0..1ca706c6d 100644 --- a/core/math/big/private.odin +++ b/core/math/big/private.odin @@ -472,7 +472,7 @@ _private_int_mul_high :: proc(dest, a, b: ^Int, digits: int, allocator := contex t.digit[ix + pb] = carry } - internal_swap(dest, t) + internal_swap(dest, t) internal_destroy(t) return internal_clamp(dest) } From ca73cd395f0eef92a618a12db67e1971dc922a6e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 10:33:52 +0000 Subject: [PATCH 687/766] Fix #6412 --- src/check_expr.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 80df35edc..aa3e26580 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2955,14 +2955,21 @@ gb_internal void check_comparison(CheckerContext *c, Ast *node, Operand *x, Oper if (check_is_assignable_to(c, x, y->type) || check_is_assignable_to(c, y, x->type)) { + if (x->type->failure || y->type->failure) { + // // skip any failures + x->mode = Addressing_Value; + x->type = t_untyped_bool; + return; + } + Type *err_type = x->type; bool defined = false; switch (op) { case Token_CmpEq: case Token_NotEq: - defined = (is_type_comparable(x->type) && is_type_comparable(y->type)) || - (is_operand_nil(*x) && type_has_nil(y->type)) || - (is_operand_nil(*y) && type_has_nil(x->type)); + defined = ((is_operand_nil(*x) && type_has_nil(y->type)) || + (is_operand_nil(*y) && type_has_nil(x->type)) || + is_type_comparable(x->type) && is_type_comparable(y->type)); break; case Token_Lt: case Token_Gt: From e5c7ab0660863a1e191aec546f9e8498d69dae57 Mon Sep 17 00:00:00 2001 From: Barinzaya Date: Sun, 15 Mar 2026 07:11:35 -0400 Subject: [PATCH 688/766] Add fmt field tags to core:container/small_array.Small_Array. This enables fmt (and other packages that use it, like log) to format Small_Arrays with only the used portion of the array. --- core/container/small_array/small_array.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/container/small_array/small_array.odin b/core/container/small_array/small_array.odin index 8498da852..901ed419e 100644 --- a/core/container/small_array/small_array.odin +++ b/core/container/small_array/small_array.odin @@ -21,7 +21,7 @@ Example: } */ Small_Array :: struct($N: int, $T: typeid) where N >= 0 { - data: [N]T, + data: [N]T `fmt:",len"`, len: int, } From 310def1e71ef37869f3c41da10bae8cd73beb096 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 11:42:24 +0000 Subject: [PATCH 689/766] Fix `append_fixed_capacity_elems` --- base/runtime/core_builtin.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 80c8f8752..20ce502b0 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -883,7 +883,7 @@ append_fixed_capacity_elems :: proc "contextless" (array: ^$T/[dynamic; $N]$E, # when size_of(E) != 0 { for i in 0.. Date: Sun, 15 Mar 2026 11:48:49 +0000 Subject: [PATCH 690/766] use `intrinsics.mem_copy` instead of a for-loop --- base/runtime/core_builtin.odin | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 20ce502b0..022778a24 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -881,10 +881,8 @@ append_fixed_capacity_elems :: proc "contextless" (array: ^$T/[dynamic; $N]$E, # n = min(N - len(array), len(args)) - when size_of(E) != 0 { - for i in 0.. (n: int) { +append_fixed_capacity_string :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, args: ..string) -> (n: int) { n_arg: int for arg in args { - n_arg = append_fixed_capacity_elems(array, ..transmute([]E)(arg), loc=loc) + n_arg = append_fixed_capacity_elems(array, ..transmute([]E)(arg)) n += n_arg if n_arg < len(arg) { return From 2f8da5ec677489ac67ae7f56cb979339e0e521c6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 11:55:04 +0000 Subject: [PATCH 691/766] Add fixed capacity dynamic array to the doc-format --- core/odin/doc-format/doc_format.odin | 113 ++++++++++++++------------- src/docs_format.cpp | 110 +++++++++++++------------- src/docs_writer.cpp | 6 ++ 3 files changed, 120 insertions(+), 109 deletions(-) diff --git a/core/odin/doc-format/doc_format.odin b/core/odin/doc-format/doc_format.odin index df36c1b55..3ae75a3f8 100644 --- a/core/odin/doc-format/doc_format.odin +++ b/core/odin/doc-format/doc_format.odin @@ -12,7 +12,7 @@ String :: distinct Array(byte) Version_Type_Major :: 0 Version_Type_Minor :: 3 -Version_Type_Patch :: 1 +Version_Type_Patch :: 2 Version_Type :: struct { major, minor, patch: u8, @@ -168,32 +168,33 @@ Attribute :: struct { } Type_Kind :: enum u32le { - Invalid = 0, - Basic = 1, - Named = 2, - Generic = 3, - Pointer = 4, - Array = 5, - Enumerated_Array = 6, - Slice = 7, - Dynamic_Array = 8, - Map = 9, - Struct = 10, - Union = 11, - Enum = 12, - Parameters = 13, - Proc = 14, - Bit_Set = 15, - Simd_Vector = 16, - SOA_Struct_Fixed = 17, - SOA_Struct_Slice = 18, - SOA_Struct_Dynamic = 19, - Relative_Pointer = 20, - Relative_Multi_Pointer = 21, - Multi_Pointer = 22, - Matrix = 23, - Soa_Pointer = 24, - Bit_Field = 25, + Invalid = 0, + Basic = 1, + Named = 2, + Generic = 3, + Pointer = 4, + Array = 5, + Enumerated_Array = 6, + Slice = 7, + Dynamic_Array = 8, + Map = 9, + Struct = 10, + Union = 11, + Enum = 12, + Parameters = 13, + Proc = 14, + Bit_Set = 15, + Simd_Vector = 16, + SOA_Struct_Fixed = 17, + SOA_Struct_Slice = 18, + SOA_Struct_Dynamic = 19, + Relative_Pointer = 20, + Relative_Multi_Pointer = 21, + Multi_Pointer = 22, + Matrix = 23, + Soa_Pointer = 24, + Bit_Field = 25, + Fixed_Capacity_Dynamic_Array = 26, } Type_Elems_Cap :: 4 @@ -219,13 +220,14 @@ Type :: struct { custom_align: String, // Used by: - // .Array - 1 count: 0=len - // .Enumerated_Array - 1 count: 0=len - // .SOA_Struct_Fixed - 1 count: 0=len - // .Bit_Set - 2 count: 0=lower, 1=upper - // .Simd_Vector - 1 count: 0=len - // .Matrix - 2 count: 0=row_count, 1=column_count - // .Struct - <=2 count: 0=min_field_align, 1=max_field_align + // .Array - 1 count: 0=len + // .Enumerated_Array - 1 count: 0=len + // .SOA_Struct_Fixed - 1 count: 0=len + // .Bit_Set - 2 count: 0=lower, 1=upper + // .Simd_Vector - 1 count: 0=len + // .Matrix - 2 count: 0=row_count, 1=column_count + // .Struct - <=2 count: 0=min_field_align, 1=max_field_align + // .Fixed_Capacity_Dynamic_Array - 1 count: 0=cap elem_count_len: u32le, elem_counts: [Type_Elems_Cap]i64le, @@ -234,27 +236,28 @@ Type :: struct { calling_convention: String, // Used by: - // .Named - 1 type: 0=base type - // .Generic - <1 type: 0=specialization - // .Pointer - 1 type: 0=element - // .Array - 1 type: 0=element - // .Enumerated_Array - 2 types: 0=index and 1=element - // .Slice - 1 type: 0=element - // .Dynamic_Array - 1 type: 0=element - // .Map - 2 types: 0=key, 1=value - // .SOA_Struct_Fixed - 1 type: underlying SOA struct element - // .SOA_Struct_Slice - 1 type: underlying SOA struct element - // .SOA_Struct_Dynamic - 1 type: underlying SOA struct element - // .Union - 0+ types: variants - // .Enum - <1 type: 0=base type - // .Proc - 2 types: 0=parameters, 1=results - // .Bit_Set - <=2 types: 0=element type, 1=underlying type (Underlying_Type flag will be set) - // .Simd_Vector - 1 type: 0=element - // .Relative_Pointer - 2 types: 0=pointer type, 1=base integer - // .Multi_Pointer - 1 type: 0=element - // .Matrix - 1 type: 0=element - // .Soa_Pointer - 1 type: 0=element - // .Bit_Field - 1 type: 0=backing type + // .Named - 1 type: 0=base type + // .Generic - <1 type: 0=specialization + // .Pointer - 1 type: 0=element + // .Array - 1 type: 0=element + // .Enumerated_Array - 2 types: 0=index and 1=element + // .Slice - 1 type: 0=element + // .Dynamic_Array - 1 type: 0=element + // .Map - 2 types: 0=key, 1=value + // .SOA_Struct_Fixed - 1 type: underlying SOA struct element + // .SOA_Struct_Slice - 1 type: underlying SOA struct element + // .SOA_Struct_Dynamic - 1 type: underlying SOA struct element + // .Union - 0+ types: variants + // .Enum - <1 type: 0=base type + // .Proc - 2 types: 0=parameters, 1=results + // .Bit_Set - <=2 types: 0=element type, 1=underlying type (Underlying_Type flag will be set) + // .Simd_Vector - 1 type: 0=element + // .Relative_Pointer - 2 types: 0=pointer type, 1=base integer + // .Multi_Pointer - 1 type: 0=element + // .Matrix - 1 type: 0=element + // .Soa_Pointer - 1 type: 0=element + // .Bit_Field - 1 type: 0=backing type + // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element types: Array(Type_Index), // Used by: diff --git a/src/docs_format.cpp b/src/docs_format.cpp index 2235789d5..4db85b481 100644 --- a/src/docs_format.cpp +++ b/src/docs_format.cpp @@ -15,7 +15,7 @@ struct OdinDocVersionType { #define OdinDocVersionType_Major 0 #define OdinDocVersionType_Minor 3 -#define OdinDocVersionType_Patch 1 +#define OdinDocVersionType_Patch 2 struct OdinDocHeaderBase { u8 magic[8]; @@ -59,31 +59,31 @@ struct OdinDocPosition { }; enum OdinDocTypeKind : u32 { - OdinDocType_Invalid = 0, - OdinDocType_Basic = 1, - OdinDocType_Named = 2, - OdinDocType_Generic = 3, - OdinDocType_Pointer = 4, - OdinDocType_Array = 5, - OdinDocType_EnumeratedArray = 6, - OdinDocType_Slice = 7, - OdinDocType_DynamicArray = 8, - OdinDocType_Map = 9, - OdinDocType_Struct = 10, - OdinDocType_Union = 11, - OdinDocType_Enum = 12, - OdinDocType_Tuple = 13, - OdinDocType_Proc = 14, - OdinDocType_BitSet = 15, - OdinDocType_SimdVector = 16, - OdinDocType_SOAStructFixed = 17, - OdinDocType_SOAStructSlice = 18, - OdinDocType_SOAStructDynamic = 19, - - OdinDocType_MultiPointer = 22, - OdinDocType_Matrix = 23, - OdinDocType_SoaPointer = 24, - OdinDocType_BitField = 25, + OdinDocType_Invalid = 0, + OdinDocType_Basic = 1, + OdinDocType_Named = 2, + OdinDocType_Generic = 3, + OdinDocType_Pointer = 4, + OdinDocType_Array = 5, + OdinDocType_EnumeratedArray = 6, + OdinDocType_Slice = 7, + OdinDocType_DynamicArray = 8, + OdinDocType_Map = 9, + OdinDocType_Struct = 10, + OdinDocType_Union = 11, + OdinDocType_Enum = 12, + OdinDocType_Tuple = 13, + OdinDocType_Proc = 14, + OdinDocType_BitSet = 15, + OdinDocType_SimdVector = 16, + OdinDocType_SOAStructFixed = 17, + OdinDocType_SOAStructSlice = 18, + OdinDocType_SOAStructDynamic = 19, + OdinDocType_MultiPointer = 22, + OdinDocType_Matrix = 23, + OdinDocType_SoaPointer = 24, + OdinDocType_BitField = 25, + OdinDocType_FixedCapacityDynamicArray = 26, }; enum OdinDocTypeFlag_Basic : u32 { @@ -144,13 +144,14 @@ struct OdinDocType { OdinDocString custom_align; // Used by: - // .Array - 1 count: 0=len - // .Enumerated_Array - 1 count: 0=len - // .SOA_Struct_Fixed - 1 count: 0=len - // .Bit_Set - 2 count: 0=lower, 1=upper - // .Simd_Vector - 1 count: 0=len - // .Matrix - 2 count: 0=row_count, 1=column_count - // .Struct - <=2 count: 0=min_field_align, 1=max_field_align + // .Array - 1 count: 0=len + // .Enumerated_Array - 1 count: 0=len + // .SOA_Struct_Fixed - 1 count: 0=len + // .Bit_Set - 2 count: 0=lower, 1=upper + // .Simd_Vector - 1 count: 0=len + // .Matrix - 2 count: 0=row_count, 1=column_count + // .Struct - <=2 count: 0=min_field_align, 1=max_field_align + // .Fixed_Capacity_Dynamic_Array - 1 count: 0=cap u32 elem_count_len; i64 elem_counts[OdinDocType_ElemsCap]; @@ -159,27 +160,28 @@ struct OdinDocType { OdinDocString calling_convention; // Used by: - // .Named - 1 type: 0=base type - // .Generic - <1 type: 0=specialization - // .Pointer - 1 type: 0=element - // .Array - 1 type: 0=element - // .Enumerated_Array - 2 types: 0=index and 1=element - // .Slice - 1 type: 0=element - // .Dynamic_Array - 1 type: 0=element - // .Map - 2 types: 0=key, 1=value - // .SOA_Struct_Fixed - 1 type: underlying SOA struct element - // .SOA_Struct_Slice - 1 type: underlying SOA struct element - // .SOA_Struct_Dynamic - 1 type: underlying SOA struct element - // .Union - 0+ types: variants - // .Enum - <1 type: 0=base type - // .Proc - 2 types: 0=parameters, 1=results - // .Bit_Set - <=2 types: 0=element type, 1=underlying type (Underlying_Type flag will be set) - // .Simd_Vector - 1 type: 0=element - // .Relative_Pointer - 2 types: 0=pointer type, 1=base integer - // .Multi_Pointer - 1 type: 0=element - // .Matrix - 1 type: 0=element - // .Soa_Pointer - 1 type: 0=element - // .Bit_Field - 1 type: 0=backing type + // .Named - 1 type: 0=base type + // .Generic - <1 type: 0=specialization + // .Pointer - 1 type: 0=element + // .Array - 1 type: 0=element + // .Enumerated_Array - 2 types: 0=index and 1=element + // .Slice - 1 type: 0=element + // .Dynamic_Array - 1 type: 0=element + // .Map - 2 types: 0=key, 1=value + // .SOA_Struct_Fixed - 1 type: underlying SOA struct element + // .SOA_Struct_Slice - 1 type: underlying SOA struct element + // .SOA_Struct_Dynamic - 1 type: underlying SOA struct element + // .Union - 0+ types: variants + // .Enum - <1 type: 0=base type + // .Proc - 2 types: 0=parameters, 1=results + // .Bit_Set - <=2 types: 0=element type, 1=underlying type (Underlying_Type flag will be set) + // .Simd_Vector - 1 type: 0=element + // .Relative_Pointer - 2 types: 0=pointer type, 1=base integer + // .Multi_Pointer - 1 type: 0=element + // .Matrix - 1 type: 0=element + // .Soa_Pointer - 1 type: 0=element + // .Bit_Field - 1 type: 0=backing type + // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element OdinDocArray types; // Used by: diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 3edd7da9d..d021b3fc2 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -576,6 +576,12 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca doc_type.kind = OdinDocType_DynamicArray; doc_type.types = odin_doc_type_as_slice(w, type->DynamicArray.elem); break; + case Type_FixedCapacityDynamicArray: + doc_type.kind = OdinDocType_FixedCapacityDynamicArray; + doc_type.elem_count_len = 1; + doc_type.elem_counts[0] = type->FixedCapacityDynamicArray.capacity; + doc_type.types = odin_doc_type_as_slice(w, type->FixedCapacityDynamicArray.elem); + break; case Type_Map: doc_type.kind = OdinDocType_Map; { From f123fb1e916bfe272bf800dd87beb30c05ee5a6c Mon Sep 17 00:00:00 2001 From: andzdroid Date: Sun, 15 Mar 2026 12:48:41 +0000 Subject: [PATCH 692/766] encoding/cbor: fix order-dependent partial unmarshals --- core/encoding/cbor/unmarshal.odin | 13 +------------ tests/core/encoding/cbor/test_core_cbor.odin | 2 ++ 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/core/encoding/cbor/unmarshal.odin b/core/encoding/cbor/unmarshal.odin index 043b2ec60..9a1e584fa 100644 --- a/core/encoding/cbor/unmarshal.odin +++ b/core/encoding/cbor/unmarshal.odin @@ -661,8 +661,7 @@ _unmarshal_map :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header, unknown := length == -1 fields := reflect.struct_fields_zipped(ti.id) - idx := 0 - for ; idx < len(fields) && (unknown || idx < length); idx += 1 { + for idx := 0; unknown || idx < length; idx += 1 { // Decode key, keys can only be strings. key: string if keyv, kerr := decode_key(d, v, context.temp_allocator); unknown && kerr == .Break { @@ -710,16 +709,6 @@ _unmarshal_map :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header, _unmarshal_value(d, fany, _decode_header(r) or_return) or_return } - // If there are fields left in the map that did not get decoded into the struct, decode and discard them. - if !unknown { - for _ in idx.. Date: Sun, 15 Mar 2026 15:25:54 +0100 Subject: [PATCH 693/766] Fix #6425 --- core/compress/common.odin | 2 -- core/compress/zlib/zlib.odin | 18 +++++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/core/compress/common.odin b/core/compress/common.odin index d78aec328..07ea7b71c 100644 --- a/core/compress/common.odin +++ b/core/compress/common.odin @@ -368,8 +368,6 @@ refill_lsb_from_memory :: #force_inline proc(z: ^Context_Memory_Input, width := if len(z.input_data) != 0 { b = u64(z.input_data[0]) z.input_data = z.input_data[1:] - } else { - b = 0 } z.code_buffer |= b << u8(z.num_bits) diff --git a/core/compress/zlib/zlib.odin b/core/compress/zlib/zlib.odin index e484a4958..72664846e 100644 --- a/core/compress/zlib/zlib.odin +++ b/core/compress/zlib/zlib.odin @@ -326,7 +326,7 @@ decode_huffman :: proc(z: ^$C, t: ^Huffman_Table) -> (r: u16, err: Error) #no_bo return 0, .Code_Buffer_Malformed } compress.refill_lsb(z) - if z.num_bits > 63 { + if z.code_buffer == 0 { return 0, .Stream_Too_Short } } @@ -491,7 +491,7 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all */ expected_output_size = max(max(expected_output_size, compress.COMPRESS_OUTPUT_ALLOCATE_MIN), 512) - // fmt.printf("\nZLIB: Expected Payload Size: %v\n\n", expected_output_size); + // fmt.printfln("ZLIB: Expected Payload Size: %v", expected_output_size) if expected_output_size > 0 && expected_output_size <= compress.COMPRESS_OUTPUT_ALLOCATE_MAX { /* @@ -522,11 +522,16 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all final := u32(0) type := u32(0) + defer if int(z.bytes_written) != len(z.output.buf) { + resize(&z.output.buf, int(z.bytes_written)) + } + for { final = compress.read_bits_lsb(z, 1) type = compress.read_bits_lsb(z, 2) - // fmt.printf("Final: %v | Type: %v\n", final, type) + // fmt.printfln("len(z): %v", len(z.input_data)) + // fmt.printfln("Final: %v | Type: %v", final, type) switch type { case 0: @@ -561,7 +566,6 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all case 3: return .BType_3 case: - // fmt.printf("Err: %v | Final: %v | Type: %v\n", err, final, type) if type == 1 { // Use fixed code lengths. build_huffman(z_repeat, Z_FIXED_LENGTH[:]) or_return @@ -590,7 +594,6 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all for n < ntot { c = decode_huffman(z, codelength_ht) or_return - if c < 0 || c >= 19 { return .Huffman_Bad_Code_Lengths } @@ -635,15 +638,12 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all } parse_huffman_block(z, z_repeat, z_offset) or_return } + if final == 1 { break } } - if int(z.bytes_written) != len(z.output.buf) { - resize(&z.output.buf, int(z.bytes_written)) or_return - } - return nil } From a0685f0511e9452e35cb77a7c125f2d190292d49 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 15:39:52 +0000 Subject: [PATCH 694/766] Add `intrinsics.likely` and `intrinsics.unlikely` --- base/intrinsics/intrinsics.odin | 4 +++- src/check_builtin.cpp | 27 +++++++++++++++++++++++++++ src/checker_builtin_procs.hpp | 6 +++++- src/llvm_backend_proc.cpp | 18 ++++++++++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index a4a761f44..ee99da1b3 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -77,7 +77,9 @@ prefetch_write_instruction :: proc(address: rawptr, #const locality: i32 /* 0..= prefetch_write_data :: proc(address: rawptr, #const locality: i32 /* 0..=3 */) --- // Compiler Hints -expect :: proc(val, expected_val: $T) -> T --- +expect :: proc(val, expected_val: $T) -> T --- +likely :: proc(val: $T) -> T where type_is_boolean(T) --- +unlikely :: proc(val: $T) -> T where type_is_boolean(T) --- // Linux and Darwin Only syscall :: proc(id: uintptr, args: ..uintptr) -> uintptr --- diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 186c0bd67..861d72fcb 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -6257,6 +6257,33 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As operand->type = x.type; } break; + + case BuiltinProc_likely: + case BuiltinProc_unlikely: + { + Operand x = {}; + check_expr(c, &x, ce->args[0]); + if (x.mode == Addressing_Invalid) { + return false; + } + if (!is_type_boolean(x.type)) { + gbString xt = type_to_string(x.type); + error(x.expr, "Expected a boolean expression to '%.*s', got %s", LIT(builtin_name), xt); + gb_string_free(xt); + *operand = x; // minimize error propagation + return true; + } + + if (x.mode == Addressing_Constant) { + // NOTE(bill): just completely ignore this intrinsic entirely + *operand = x; + return true; + } + + operand->mode = Addressing_Value; + operand->type = x.type; + } + break; case BuiltinProc_prefetch_read_instruction: case BuiltinProc_prefetch_read_data: diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index 107f333fd..f73422932 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -144,6 +144,8 @@ BuiltinProc__atomic_end, BuiltinProc_fixed_point_div_sat, BuiltinProc_expect, + BuiltinProc_likely, + BuiltinProc_unlikely, BuiltinProc__simd_begin, BuiltinProc_simd_add, @@ -527,7 +529,9 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("fixed_point_mul_sat"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("fixed_point_div_sat"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics}, - {STR_LIT("expect"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("expect"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("likely"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("unlikely"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT(""), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_add"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 840bbfb19..9e2429111 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -3369,6 +3369,24 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu return lb_emit_conv(p, res, t); } + case BuiltinProc_likely: + case BuiltinProc_unlikely: + { + Type *t = default_type(tv.type); + lbValue x = lb_emit_conv(p, lb_build_expr(p, ce->args[0]), t); + lbValue y = lb_const_bool(p->module, t, id == BuiltinProc_likely); + + char const *name = "llvm.expect"; + + LLVMTypeRef types[1] = {lb_type(p->module, t)}; + lbValue res = {}; + LLVMValueRef args[2] = { x.value, y.value }; + + res.value = lb_call_intrinsic(p, name, args, gb_count_of(args), types, gb_count_of(types)); + res.type = t; + return lb_emit_conv(p, res, t); + } + case BuiltinProc_prefetch_read_instruction: case BuiltinProc_prefetch_read_data: case BuiltinProc_prefetch_write_instruction: From c23d2793df60ec156f3fd8fe46d40fc5fd9b3893 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 15:45:29 +0000 Subject: [PATCH 695/766] Fix `lb_convert_struct_index` for FCD arrays --- src/llvm_backend_utility.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 349e8c85b..ed0b14273 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1061,6 +1061,17 @@ gb_internal i32 lb_convert_struct_index(lbModule *m, Type *t, i32 index) { break; } } + if (t->kind == Type_FixedCapacityDynamicArray) { + switch (index) { + case 0: return 0; // data + case 1: + if (t->FixedCapacityDynamicArray.padding_needed > 0) { + return 2; + } + return 1; + } + } + return index; } @@ -1404,6 +1415,12 @@ gb_internal lbValue lb_emit_struct_ev(lbProcedure *p, lbValue s, i32 index) { } break; + case Type_FixedCapacityDynamicArray: + switch (index) { + case 0: result_type = alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity); break; + case 1: result_type = t_int; break; + } + case Type_Map: { init_map_internal_debug_types(t); From 55f398b7340ca10d0cc24a8756c142c7674f511d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 15:53:28 +0000 Subject: [PATCH 696/766] Add `#no_bounds_check` to appropriate procedures --- base/runtime/internal.odin | 8 ++--- core/strings/strings.odin | 68 ++++++++++++++++++------------------- core/unicode/utf8/utf8.odin | 20 +++++------ 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index cf96098b8..12f0dceca 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -718,7 +718,7 @@ quaternion256_eq :: #force_inline proc "contextless" (a, b: quaternion256) -> bo quaternion256_ne :: #force_inline proc "contextless" (a, b: quaternion256) -> bool { return real(a) != real(b) || imag(a) != imag(b) || jmag(a) != jmag(b) || kmag(a) != kmag(b) } -string_decode_rune :: proc "contextless" (s: string) -> (rune, int) { +string_decode_rune :: proc "contextless" (s: string) -> (rune, int) #no_bounds_check { // NOTE(bill): Duplicated here to remove dependency on package unicode/utf8 @(static, rodata) accept_sizes := [256]u8{ @@ -797,7 +797,7 @@ string_decode_rune :: proc "contextless" (s: string) -> (rune, int) { return rune(s0&MASK4)<<18 | rune(b1&MASKX)<<12 | rune(b2&MASKX)<<6 | rune(b3&MASKX), 4 } -string_decode_last_rune :: proc "contextless" (s: string) -> (rune, int) { +string_decode_last_rune :: proc "contextless" (s: string) -> (rune, int) #no_bounds_check { RUNE_ERROR :: '\ufffd' RUNE_SELF :: 0x80 UTF_MAX :: 4 @@ -833,7 +833,7 @@ string_decode_last_rune :: proc "contextless" (s: string) -> (rune, int) { } -string16_decode_rune :: proc "contextless" (s: string16) -> (rune, int) { +string16_decode_rune :: proc "contextless" (s: string16) -> (rune, int) #no_bounds_check { REPLACEMENT_CHAR :: '\ufffd' _surr1 :: 0xd800 _surr2 :: 0xdc00 @@ -861,7 +861,7 @@ string16_decode_rune :: proc "contextless" (s: string16) -> (rune, int) { return r, w } -string16_decode_last_rune :: proc "contextless" (s: string16) -> (rune, int) { +string16_decode_last_rune :: proc "contextless" (s: string16) -> (rune, int) #no_bounds_check { REPLACEMENT_CHAR :: '\ufffd' _surr1 :: 0xd800 _surr2 :: 0xdc00 diff --git a/core/strings/strings.odin b/core/strings/strings.odin index d55fea69e..40dc11e75 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -112,7 +112,7 @@ NOTE: Failure to find the byte results in returning the entire string. Returns: - res: The truncated string */ -truncate_to_byte :: proc "contextless" (str: string, b: byte) -> (res: string) { +truncate_to_byte :: proc "contextless" (str: string, b: byte) -> (res: string) #no_bounds_check { n := index_byte(str, b) if n < 0 { n = len(str) @@ -130,7 +130,7 @@ Inputs: Returns: - res: The truncated string */ -truncate_to_rune :: proc(str: string, r: rune) -> (res: string) { +truncate_to_rune :: proc(str: string, r: rune) -> (res: string) #no_bounds_check { n := index_rune(str, r) if n < 0 { n = len(str) @@ -152,7 +152,7 @@ Returns: - res: The cloned string from the byte array with a null-byte - err: An optional allocator error if one occured, `nil` otherwise */ -clone_from_bytes :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { +clone_from_bytes :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { c := make([]byte, len(s)+1, allocator, loc) or_return copy(c, s) c[len(s)] = 0 @@ -398,7 +398,7 @@ Output: false */ -equal_fold :: proc(u, v: string) -> (res: bool) { +equal_fold :: proc(u, v: string) -> (res: bool) #no_bounds_check { s, t := u, v loop: for s != "" && t != "" { sr, tr: rune @@ -483,7 +483,7 @@ prefix_length :: proc "contextless" (a, b: string) -> (n: int) { n = runtime.memory_prefix_length(raw_data(a), raw_data(b), min(len(a), len(b))) lim := max(n - UTF_MAX + 1, 0) - for l := n; l > lim; l -= 1 { + #no_bounds_check for l := n; l > lim; l -= 1 { r, _ := runtime.string_decode_rune(a[l - 1:]) if r != RUNE_ERROR { if l > 0 && (a[l - 1] & 0xc0 == 0xc0) { @@ -592,7 +592,7 @@ Output: true */ -has_suffix :: proc(s, suffix: string) -> (result: bool) { +has_suffix :: proc(s, suffix: string) -> (result: bool) #no_bounds_check { return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix } @@ -631,7 +631,7 @@ Output: a...b...c */ -join :: proc(a: []string, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { +join :: proc(a: []string, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { if len(a) == 0 { return "", nil } @@ -678,7 +678,7 @@ Output: abc */ -concatenate :: proc(a: []string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { +concatenate :: proc(a: []string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { if len(a) == 0 { return "", nil } @@ -812,7 +812,7 @@ Returns: - err: An optional allocator error if one occured, `nil` otherwise */ @private -_split :: proc(s_, sep: string, sep_save, n_: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) { +_split :: proc(s_, sep: string, sep_save, n_: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #no_bounds_check { s, n := s_, n_ if n == 0 { @@ -1037,7 +1037,7 @@ _split_iterator :: proc(s: ^string, sep: string, sep_save: int) -> (res: string, } else { m = index(s^, sep) } - if m < 0 { + #no_bounds_check if m < 0 { // not found res = s[:] ok = res != "" @@ -1084,7 +1084,7 @@ Output: */ split_by_byte_iterator :: proc(s: ^string, sep: u8) -> (res: string, ok: bool) { m := index_byte(s^, sep) - if m < 0 { + #no_bounds_check if m < 0 { // not found res = s[:] ok = res != "" @@ -1181,7 +1181,7 @@ Returns: - res: The trimmed string as a slice of the original. */ @(private) -_trim_cr :: proc(s: string) -> (res: string) { +_trim_cr :: proc(s: string) -> (res: string) #no_bounds_check { n := len(s) if n > 0 { if s[n-1] == '\r' { @@ -1591,8 +1591,8 @@ Output: -1 */ -index :: proc "contextless" (s, substr: string) -> (res: int) { - hash_str_rabin_karp :: proc "contextless" (s: string) -> (hash: u32 = 0, pow: u32 = 1) { +index :: proc "contextless" (s, substr: string) -> (res: int) #no_bounds_check { + hash_str_rabin_karp :: proc "contextless" (s: string) -> (hash: u32 = 0, pow: u32 = 1) #no_bounds_check { for i := 0; i < len(s); i += 1 { hash = hash*PRIME_RABIN_KARP + u32(s[i]) } @@ -1671,8 +1671,8 @@ Output: -1 */ -last_index :: proc(s, substr: string) -> (res: int) { - hash_str_rabin_karp_reverse :: proc(s: string) -> (hash: u32 = 0, pow: u32 = 1) { +last_index :: proc(s, substr: string) -> (res: int) #no_bounds_check { + hash_str_rabin_karp_reverse :: proc "contextless" (s: string) -> (hash: u32 = 0, pow: u32 = 1) #no_bounds_check { for i := len(s) - 1; i >= 0; i -= 1 { hash = hash*PRIME_RABIN_KARP + u32(s[i]) } @@ -1751,7 +1751,7 @@ Output: -1 */ -index_any :: proc(s, chars: string) -> (res: int) { +index_any :: proc(s, chars: string) -> (res: int) #no_bounds_check { if chars == "" { return -1 } @@ -1815,7 +1815,7 @@ Output: -1 */ -last_index_any :: proc(s, chars: string) -> (res: int) { +last_index_any :: proc(s, chars: string) -> (res: int) #no_bounds_check { if chars == "" { return -1 } @@ -1876,7 +1876,7 @@ Returns: - idx: the index of the first matching substring - width: the length of the found substring */ -index_multi :: proc(s: string, substrs: []string) -> (idx: int, width: int) { +index_multi :: proc(s: string, substrs: []string) -> (idx: int, width: int) #no_bounds_check { idx = -1 if s == "" || len(substrs) <= 0 { return @@ -1939,7 +1939,7 @@ Output: 0 */ -count :: proc(s, substr: string) -> (res: int) { +count :: proc(s, substr: string) -> (res: int) #no_bounds_check { if len(substr) == 0 { // special case return rune_count(s) + 1 } @@ -2014,7 +2014,7 @@ repeat :: proc(s: string, count: int, allocator := context.allocator, loc := #ca b := make([]byte, len(s)*count, allocator, loc) or_return i := copy(b, s) - for i < len(b) { // 2^N trick to reduce the need to copy + #no_bounds_check for i < len(b) { // 2^N trick to reduce the need to copy copy(b[i:], b[:i]) i *= 2 } @@ -2121,7 +2121,7 @@ replace :: proc(s, old, new: string, n: int, allocator := context.allocator, loc w := 0 start := 0 - for i := 0; i < byte_count; i += 1 { + #no_bounds_check for i := 0; i < byte_count; i += 1 { j := start if len(old) == 0 { if i > 0 { @@ -2438,7 +2438,7 @@ Output: test */ -trim_right_proc :: proc(s: string, p: proc(rune) -> bool) -> (res: string) { +trim_right_proc :: proc(s: string, p: proc(rune) -> bool) -> (res: string) #no_bounds_check { i := last_index_proc(s, p, false) if i >= 0 && s[i] >= utf8.RUNE_SELF { _, w := utf8.decode_rune_in_string(s[i:]) @@ -2460,7 +2460,7 @@ Inputs: Returns: - res: The trimmed string as a slice of the original, empty when no match */ -trim_right_proc_with_state :: proc(s: string, p: proc(rawptr, rune) -> bool, state: rawptr) -> (res: string) { +trim_right_proc_with_state :: proc(s: string, p: proc(rawptr, rune) -> bool, state: rawptr) -> (res: string) #no_bounds_check { i := last_index_proc_with_state(s, p, state, false) if i >= 0 && s[i] >= utf8.RUNE_SELF { _, w := utf8.decode_rune_in_string(s[i:]) @@ -2635,7 +2635,7 @@ Output: testing */ -trim_prefix :: proc(s, prefix: string) -> (res: string) { +trim_prefix :: proc(s, prefix: string) -> (res: string) #no_bounds_check { if has_prefix(s, prefix) { return s[len(prefix):] } @@ -2668,7 +2668,7 @@ Output: todo.doc */ -trim_suffix :: proc(s, suffix: string) -> (res: string) { +trim_suffix :: proc(s, suffix: string) -> (res: string) #no_bounds_check { if has_suffix(s, suffix) { return s[:len(s)-len(suffix)] } @@ -2848,7 +2848,7 @@ scrub :: proc(s: string, replacement: string, allocator := context.allocator, lo cursor := 0 origin := str - for len(str) > 0 { + #no_bounds_check for len(str) > 0 { r, w := utf8.decode_rune_in_string(str) if r == utf8.RUNE_ERROR { @@ -2907,7 +2907,7 @@ reverse :: proc(s: string, allocator := context.allocator, loc := #caller_locati buf := make([]byte, n, allocator, loc) or_return i := n - for len(str) > 0 { + #no_bounds_check for len(str) > 0 { _, w := utf8.decode_rune_in_string(str) i -= w copy(buf[i:], str[:w]) @@ -2963,7 +2963,7 @@ expand_tabs :: proc(s: string, tab_size: int, allocator := context.allocator, lo str := s column: int - for len(str) > 0 { + #no_bounds_check for len(str) > 0 { r, w := utf8.decode_rune_in_string(str) if r == '\t' { @@ -3028,7 +3028,7 @@ Output: true */ -partition :: proc(str, sep: string) -> (head, match, tail: string) { +partition :: proc(str, sep: string) -> (head, match, tail: string) #no_bounds_check { i := index(str, sep) if i == -1 { head = str @@ -3166,14 +3166,14 @@ Inputs: write_pad_string :: proc(w: io.Writer, pad: string, pad_len, remains: int) { repeats := remains / pad_len - for i := 0; i < repeats; i += 1 { + for _ in 0.. (field: string, ok: bool) { +fields_iterator :: proc(s: ^string) -> (field: string, ok: bool) #no_bounds_check { start, end := -1, -1 for r, offset in s { end = offset @@ -3404,7 +3404,7 @@ levenshtein_distance :: proc(a, b: string, allocator := context.allocator, loc : } @(private) -internal_substring :: proc(s: string, rune_start: int, rune_end: int) -> (sub: string, ok: bool) { +internal_substring :: proc(s: string, rune_start: int, rune_end: int) -> (sub: string, ok: bool) #no_bounds_check { sub = s ok = true diff --git a/core/unicode/utf8/utf8.odin b/core/unicode/utf8/utf8.odin index 85687b749..c53b2e3a4 100644 --- a/core/unicode/utf8/utf8.odin +++ b/core/unicode/utf8/utf8.odin @@ -63,7 +63,7 @@ accept_sizes := [256]u8{ } @(require_results) -encode_rune :: proc "contextless" (c: rune) -> ([4]u8, int) { +encode_rune :: proc "contextless" (c: rune) -> ([4]u8, int) #no_bounds_check { r := c buf: [4]u8 @@ -109,7 +109,7 @@ decode_rune_in_string :: #force_inline proc "contextless" (s: string) -> (rune, return decode_rune_in_bytes(transmute([]u8)s) } @(require_results) -decode_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { +decode_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) #no_bounds_check { n := len(s) if n < 1 { return RUNE_ERROR, 0 @@ -147,7 +147,7 @@ decode_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { } @(require_results) -string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (runes: []rune, err: runtime.Allocator_Error) #optional_allocator_error { +string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (runes: []rune, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { n := rune_count_in_string(s) runes = make([]rune, n, allocator) or_return @@ -160,7 +160,7 @@ string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (r } @(require_results) -runes_to_string :: proc "odin" (runes: []rune, allocator := context.allocator) -> (s: string, err: runtime.Allocator_Error) #optional_allocator_error { +runes_to_string :: proc "odin" (runes: []rune, allocator := context.allocator) -> (s: string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { byte_count := 0 for r in runes { _, w := encode_rune(r) @@ -190,7 +190,7 @@ decode_last_rune_in_string :: #force_inline proc "contextless" (s: string) -> (r return decode_last_rune_in_bytes(transmute([]u8)s) } @(require_results) -decode_last_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { +decode_last_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) #no_bounds_check { r: rune size: int start, end, limit: int @@ -239,7 +239,7 @@ rune_at_pos :: proc "contextless" (s: string, pos: int) -> rune { } @(require_results) -rune_string_at_pos :: proc "contextless" (s: string, pos: int) -> string { +rune_string_at_pos :: proc "contextless" (s: string, pos: int) -> string #no_bounds_check { if pos < 0 { return "" } @@ -256,7 +256,7 @@ rune_string_at_pos :: proc "contextless" (s: string, pos: int) -> string { } @(require_results) -rune_at :: proc "contextless" (s: string, byte_index: int) -> rune { +rune_at :: proc "contextless" (s: string, byte_index: int) -> rune #no_bounds_check { r, _ := decode_rune_in_string(s[byte_index:]) return r } @@ -292,7 +292,7 @@ valid_rune :: proc "contextless" (r: rune) -> bool { } @(require_results) -valid_string :: proc "contextless" (s: string) -> bool { +valid_string :: proc "contextless" (s: string) -> bool #no_bounds_check { n := len(s) for i := 0; i < n; { si := s[i] @@ -340,7 +340,7 @@ rune_count_in_string :: #force_inline proc(s: string) -> int { return rune_count_in_bytes(transmute([]u8)s) } @(require_results) -rune_count_in_bytes :: proc "contextless" (s: []u8) -> int { +rune_count_in_bytes :: proc "contextless" (s: []u8) -> int #no_bounds_check { count := 0 n := len(s) @@ -402,7 +402,7 @@ full_rune :: proc{ // full_rune_in_bytes reports if the bytes in b begin with a full utf-8 encoding of a rune or not // An invalid encoding is considered a full rune since it will convert as an error rune of width 1 (RUNE_ERROR) @(require_results) -full_rune_in_bytes :: proc "contextless" (b: []byte) -> bool { +full_rune_in_bytes :: proc "contextless" (b: []byte) -> bool #no_bounds_check { n := len(b) if n == 0 { return false From 0314c91a64ae105a85657b59c7f2010cb48f8e5d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 16:14:46 +0000 Subject: [PATCH 697/766] Add error message for `foo := Foo{&foo}` where the type of `foo` is not determined yet --- src/check_expr.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 492b38ffa..e66498b6d 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -12009,6 +12009,17 @@ gb_internal ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast if (o->mode != Addressing_Invalid) { check_unary_expr(c, o, ue->op, node); + } else { + ERROR_BLOCK(); + gbString s = expr_to_string(ue->expr); + defer (gb_string_free(s)); + + error(node, "Cannot address value '%s' as it has not got a determined type yet", s); + + Entity *e = entity_of_node(ue->expr); + if (e != nullptr && e->kind == Entity_Variable) { + error_line("\tSuggestion: Add an explicit type to the declaration of '%.*s' rather than relying on type inference", LIT(e->token.string)); + } } o->expr = node; return Expr_Expr; From c51391f8cb45111d7b7ed7e2ce86124505631054 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 17:15:16 +0000 Subject: [PATCH 698/766] Fix #5129 --- src/llvm_backend_const.cpp | 2 +- src/llvm_backend_expr.cpp | 15 ++++++++++++--- src/llvm_backend_general.cpp | 8 ++++++-- src/llvm_backend_type.cpp | 2 +- src/types.cpp | 19 +++++++++++++++++-- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 289d3daa2..954545db6 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -836,7 +836,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb Type *tag_type = union_tag_type(bt); LLVMTypeRef llvm_tag_type = lb_type(m, tag_type); - i64 tag_index = union_variant_index(bt, variant_type); + i64 tag_index = union_variant_index_checked(bt, variant_type); GB_ASSERT(tag_index >= 0); values[value_count++] = LLVMConstInt(llvm_tag_type, tag_index, false); i64 used_size = block_size + type_size_of(tag_type); diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index b3aa57f16..d700db866 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -5388,11 +5388,20 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { Type *fet = field_expr.type; GB_ASSERT(fet->kind != Type_Tuple); - // HACK TODO(bill): THIS IS A MASSIVE HACK!!!! if (is_type_union(ft) && !are_types_identical(fet, ft) && !is_type_untyped(fet)) { - GB_ASSERT_MSG(union_variant_index(ft, fet) >= 0, "%s", type_to_string(fet)); + if (union_is_variant_of(ft, fet)) { + // NOTE(bill, 2026-03-15): If it's a direct assignment for a variant to the + // direct union we can just assign it directly to minimize wasted code generation + // + // TODO(bill): Allow this for deeply nested unions too e.g. union{union{T}} + GB_ASSERT_MSG(union_variant_index_checked(ft, fet) >= 0, "%s", type_to_string(fet)); + GB_ASSERT(are_types_identical(type_deref(gep.type), ft)); - lb_emit_store_union_variant(p, gep, field_expr, fet); + lb_emit_store_union_variant(p, gep, field_expr, fet); + } else { + lbValue fv = lb_emit_conv(p, field_expr, ft); + lb_emit_store(p, gep, fv); + } } else { lbValue fv = lb_emit_conv(p, field_expr, ft); lb_emit_store(p, gep, fv); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 32a669235..fea4be7b2 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -1497,7 +1497,7 @@ gb_internal lbValue lb_addr_load(lbProcedure *p, lbAddr const &addr) { } gb_internal lbValue lb_const_union_tag(lbModule *m, Type *u, Type *v) { - return lb_const_value(m, union_tag_type(u), exact_value_i64(union_variant_index(u, v))); + return lb_const_value(m, union_tag_type(u), exact_value_i64(union_variant_index_checked(u, v))); } gb_internal lbValue lb_emit_union_tag_ptr(lbProcedure *p, lbValue u) { @@ -1540,13 +1540,17 @@ gb_internal void lb_emit_store_union_variant_tag(lbProcedure *p, lbValue parent, // No tag needed! } else { lbValue tag_ptr = lb_emit_union_tag_ptr(p, parent); - lb_emit_store(p, tag_ptr, lb_const_union_tag(p->module, t, variant_type)); + lbValue tag = lb_const_union_tag(p->module, t, variant_type); + lb_emit_store(p, tag_ptr, tag); } } gb_internal void lb_emit_store_union_variant(lbProcedure *p, lbValue parent, lbValue variant, Type *variant_type) { Type *pt = base_type(type_deref(parent.type)); GB_ASSERT(pt->kind == Type_Union); + + GB_ASSERT_MSG(union_is_variant_of(pt, variant_type), "%s %s", type_to_string(pt), type_to_string(variant_type)); + if (pt->Union.kind == UnionType_shared_nil) { GB_ASSERT(type_size_of(variant_type)); diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 82156d32a..b41ba2f15 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -1064,7 +1064,7 @@ gb_internal void lb_setup_type_info_data_giant_array(lbModule *m, i64 global_typ i64 tag_index = 0; if (tag_type != nullptr) { - tag_index = union_variant_index(ut, tag_type); + tag_index = union_variant_index_checked(ut, tag_type); } GB_ASSERT(tag_index <= Typeid__COUNT); diff --git a/src/types.cpp b/src/types.cpp index 2f13ed1f1..0f7aa2199 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3375,7 +3375,7 @@ gb_internal bool union_variant_index_types_equal(Type *v, Type *vt) { return false; } -gb_internal i64 union_variant_index(Type *u, Type *v) { +gb_internal i64 union_variant_index_checked(Type *u, Type *v) { u = base_type(u); GB_ASSERT(u->kind == Type_Union); @@ -3389,9 +3389,24 @@ gb_internal i64 union_variant_index(Type *u, Type *v) { } } } - return 0; + GB_PANIC("unfound variant -> %s %s", type_to_string(u), type_to_string(v)); + return -1; } +gb_internal bool union_is_variant_of(Type *u, Type *v) { + u = base_type(u); + GB_ASSERT(u->kind == Type_Union); + + for_array(i, u->Union.variants) { + Type *vt = u->Union.variants[i]; + if (union_variant_index_types_equal(v, vt)) { + return true; + } + } + return false; +} + + gb_internal i64 union_tag_size(Type *u) { u = base_type(u); GB_ASSERT(u->kind == Type_Union); From 70dd93db8fc31bcd16ca8ea085444d3298145c5e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 17:24:38 +0000 Subject: [PATCH 699/766] Correct `case nil:` handling for unions --- src/llvm_backend_stmt.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 98b45f646..df87e7703 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -2137,7 +2137,13 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss lbValue on_val = {}; if (switch_kind == TypeSwitch_Union) { Type *ut = base_type(type_deref(parent.type)); - on_val = lb_const_union_tag(m, ut, case_type); + if (is_type_untyped_nil(case_type)) { + GB_ASSERT(type_has_nil(ut)); + saw_nil = true; + on_val = lb_const_int(m, union_tag_type(ut), 0); + } else { + on_val = lb_const_union_tag(m, ut, case_type); + } } else if (switch_kind == TypeSwitch_Any) { if (is_type_untyped_nil(case_type)) { From c4ae436ba655c238d1e89134dd7f1923dad56c8d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 17:39:37 +0000 Subject: [PATCH 700/766] Add `This is a compiler error. Please report this.` to all assertions. --- src/gb/gb.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gb/gb.h b/src/gb/gb.h index c52f63cec..3c88ce6ed 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -2522,6 +2522,7 @@ void gb_assert_handler(char const *prefix, char const *condition, char const *fi va_end(va); } gb_printf_err("\n"); + gb_printf_err("This is a compiler error. Please report this.\n"); } b32 gb_is_power_of_two(isize x) { From 4b95e8a040447a2ab939e0faf6ed094701d0a10e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 18:18:02 +0000 Subject: [PATCH 701/766] Add generic count of arrays to to doc-format --- core/odin/doc-format/doc_format.odin | 4 ++-- src/docs_format.cpp | 4 ++-- src/docs_writer.cpp | 26 ++++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/core/odin/doc-format/doc_format.odin b/core/odin/doc-format/doc_format.odin index 3ae75a3f8..28552b346 100644 --- a/core/odin/doc-format/doc_format.odin +++ b/core/odin/doc-format/doc_format.odin @@ -239,7 +239,7 @@ Type :: struct { // .Named - 1 type: 0=base type // .Generic - <1 type: 0=specialization // .Pointer - 1 type: 0=element - // .Array - 1 type: 0=element + // .Array - 1 type: 0=element (and 1=generic index (if exists)) // .Enumerated_Array - 2 types: 0=index and 1=element // .Slice - 1 type: 0=element // .Dynamic_Array - 1 type: 0=element @@ -257,7 +257,7 @@ Type :: struct { // .Matrix - 1 type: 0=element // .Soa_Pointer - 1 type: 0=element // .Bit_Field - 1 type: 0=backing type - // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element + // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element (and 1=generic index (if exists)) types: Array(Type_Index), // Used by: diff --git a/src/docs_format.cpp b/src/docs_format.cpp index 4db85b481..30dcf40b9 100644 --- a/src/docs_format.cpp +++ b/src/docs_format.cpp @@ -163,7 +163,7 @@ struct OdinDocType { // .Named - 1 type: 0=base type // .Generic - <1 type: 0=specialization // .Pointer - 1 type: 0=element - // .Array - 1 type: 0=element + // .Array - 1 type: 0=element (and 1=generic index (if exists)) // .Enumerated_Array - 2 types: 0=index and 1=element // .Slice - 1 type: 0=element // .Dynamic_Array - 1 type: 0=element @@ -181,7 +181,7 @@ struct OdinDocType { // .Matrix - 1 type: 0=element // .Soa_Pointer - 1 type: 0=element // .Bit_Field - 1 type: 0=backing type - // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element + // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element (and 1=generic index (if exists)) OdinDocArray types; // Used by: diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index d021b3fc2..5e9c25016 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -472,6 +472,14 @@ gb_internal OdinDocArray odin_doc_type_as_slice(OdinDocWriter return odin_write_item_as_slice(w, index); } +gb_internal OdinDocArray odin_doc_type2_as_slice(OdinDocWriter *w, Type *type0, Type *type1, bool cache=true) { + OdinDocTypeIndex indices[2] = {}; + indices[0] = odin_doc_type(w, type0, cache); + indices[1] = odin_doc_type(w, type1, cache); + + return odin_write_slice(w, indices, gb_count_of(indices)); +} + gb_internal OdinDocArray odin_doc_add_entity_as_slice(OdinDocWriter *w, Entity *e) { OdinDocEntityIndex index = odin_doc_add_entity(w, e); return odin_write_item_as_slice(w, index); @@ -555,7 +563,13 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca doc_type.kind = OdinDocType_Array; doc_type.elem_count_len = 1; doc_type.elem_counts[0] = type->Array.count; - doc_type.types = odin_doc_type_as_slice(w, type->Array.elem); + if (type->Array.generic_count != nullptr) { + doc_type.types = odin_doc_type2_as_slice(w, + type->Array.elem, + type->Array.generic_count); + } else { + doc_type.types = odin_doc_type_as_slice(w, type->Array.elem); + } break; case Type_EnumeratedArray: doc_type.kind = OdinDocType_EnumeratedArray; @@ -580,7 +594,15 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca doc_type.kind = OdinDocType_FixedCapacityDynamicArray; doc_type.elem_count_len = 1; doc_type.elem_counts[0] = type->FixedCapacityDynamicArray.capacity; - doc_type.types = odin_doc_type_as_slice(w, type->FixedCapacityDynamicArray.elem); + + if (type->FixedCapacityDynamicArray.generic_capacity != nullptr) { + doc_type.types = odin_doc_type2_as_slice(w, + type->FixedCapacityDynamicArray.elem, + type->FixedCapacityDynamicArray.generic_capacity); + + } else { + doc_type.types = odin_doc_type_as_slice(w, type->FixedCapacityDynamicArray.elem); + } break; case Type_Map: doc_type.kind = OdinDocType_Map; From 6fc80d95621bbe70920dccc762747557919fc48b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 18:33:20 +0000 Subject: [PATCH 702/766] Correct `write_type_to_canonical_string` for "untyped" types --- src/name_canonicalization.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index 6d5f54cf8..a99dec0af 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -748,8 +748,8 @@ gb_internal void write_type_to_canonical_string(TypeWriter *w, Type *type) { return; } - type = default_type(type); - GB_ASSERT(!is_type_untyped(type)); + // type = default_type(type); + // GB_ASSERT(!is_type_untyped(type)); switch (type->kind) { case Type_Basic: From 5f5c19fa2cfa85c69912bf45dffa1d2773606887 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 18:58:27 +0000 Subject: [PATCH 703/766] Add deprecation notice to small_array/doc.odin --- core/container/small_array/doc.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/container/small_array/doc.odin b/core/container/small_array/doc.odin index 21d000a10..5696ae58c 100644 --- a/core/container/small_array/doc.odin +++ b/core/container/small_array/doc.odin @@ -1,4 +1,6 @@ /* +Deprecation Notice: Prefer using `[dynamic; N]T` (fixed capacity dynamic arrays). + A dynamic array-like interface on a stack-allocated, fixed-size array. The `Small_Array` type is optimal for scenarios where you need From 55b3ea7c2dc83053a073b2da5e8361c1ea1c7717 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 18:58:48 +0000 Subject: [PATCH 704/766] Allow `@(deprecated=)` on types --- src/check_decl.cpp | 2 ++ src/checker.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 22a74f370..c0358cff7 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -518,6 +518,8 @@ gb_internal void check_type_decl(CheckerContext *ctx, Entity *e, Ast *init_expr, AttributeContext ac = {}; check_decl_attributes(ctx, decl->attributes, type_decl_attribute, &ac); + e->deprecated_message = ac.deprecated_message; + if (e->kind == Entity_TypeName && ac.objc_class != "") { e->TypeName.objc_class_name = ac.objc_class; diff --git a/src/checker.cpp b/src/checker.cpp index ec5abf067..720556a4f 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4282,6 +4282,20 @@ gb_internal DECL_ATTRIBUTE_PROC(type_decl_attribute) { error(elem, "Expected a string or no value for '%.*s'", LIT(name)); } return true; + } else if (name == "deprecated") { + ExactValue ev = check_decl_attribute_value(c, value); + + if (ev.kind == ExactValue_String) { + String msg = ev.value_string; + if (msg.len == 0) { + error(elem, "Deprecation message cannot be an empty string"); + } else { + ac->deprecated_message = msg; + } + } else { + error(elem, "Expected a string value for '%.*s'", LIT(name)); + } + return true; } return false; } From 20dcc8fd80c35f590219a95d940942b621b8fe35 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 19:09:45 +0000 Subject: [PATCH 705/766] Remove use of `@(init)` for checking if Windows has long path support and check on first usage instead --- core/os/path_windows.odin | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/core/os/path_windows.odin b/core/os/path_windows.odin index 1a0245c52..b471ab0b0 100644 --- a/core/os/path_windows.odin +++ b/core/os/path_windows.odin @@ -1,6 +1,7 @@ #+private package os +import "base:intrinsics" import "base:runtime" import "core:strings" import win32 "core:sys/windows" @@ -157,18 +158,30 @@ _get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err } } -@(private) -can_use_long_paths: bool -@(init) -init_long_path_support :: proc "contextless" () { +@(require_results) +has_long_path_support :: proc "contextless" () -> bool { + @(static) + can_use_long_paths_lock: win32.SRWLOCK + @(static) + can_use_long_paths_checked: bool // atomic + @(static) + can_use_long_paths: bool + + if intrinsics.atomic_load_explicit(&can_use_long_paths_checked, .Acquire) == true { + return can_use_long_paths + } + win32.AcquireSRWLockExclusive(&can_use_long_paths_lock) + defer win32.ReleaseSRWLockExclusive(&can_use_long_paths_lock) + defer intrinsics.atomic_store_explicit(&can_use_long_paths_checked, true, .Release) + can_use_long_paths = false key: win32.HKEY res := win32.RegOpenKeyExW(win32.HKEY_LOCAL_MACHINE, win32.L(`SYSTEM\CurrentControlSet\Control\FileSystem`), 0, win32.KEY_READ, &key) defer win32.RegCloseKey(key) if res != 0 { - return + return can_use_long_paths } value: u32 @@ -183,11 +196,13 @@ init_long_path_support :: proc "contextless" () { &size, ) if res != 0 { - return + return can_use_long_paths } if value == 1 { can_use_long_paths = true } + + return can_use_long_paths } @(require_results) @@ -202,10 +217,11 @@ _fix_long_path :: proc(path: string, allocator: runtime.Allocator) -> (win32.wst @(require_results) _fix_long_path_internal :: proc(path: string) -> string { - if can_use_long_paths { + if has_long_path_support() { return path } + // When using win32 to create a directory, the path // cannot be too long that you cannot append an 8.3 // file name, because MAX_PATH is 260, 260-12 = 248 From 0dbda038909ec36cc14a4c321752e74d5f544c59 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 19:40:57 +0000 Subject: [PATCH 706/766] Simplify slice creation as LLVM values --- src/llvm_backend_expr.cpp | 140 +++++++++++++++++++++++++++++++++++ src/llvm_backend_utility.cpp | 33 +++++++++ 2 files changed, 173 insertions(+) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index d700db866..29edf4d2d 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1,4 +1,5 @@ gb_internal lbValue lb_emit_arith_matrix(lbProcedure *p, TokenKind op, lbValue lhs, lbValue rhs, Type *type, bool component_wise); +gb_internal lbValue lb_build_slice_expr_value(lbProcedure *p, Ast *expr); gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) { GB_ASSERT(bit_count <= 64); @@ -4291,6 +4292,24 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { return lb_build_expr(p, se->expr); } } + { + Type *src_type = base_type(type_of_expr(se->expr)); + if (is_type_pointer(src_type)) { + src_type = base_type(type_deref(src_type)); + } + + if (is_type_slice(src_type) || + is_type_dynamic_array(src_type) || + is_type_string(src_type) || + is_type_string16(src_type)) { + return lb_build_slice_expr_value(p, expr); + } + + if (is_type_multi_pointer(src_type) && se->high != nullptr) { + return lb_build_slice_expr_value(p, expr); + } + } + return lb_addr_load(p, lb_build_addr(p, expr)); case_end; @@ -4853,6 +4872,127 @@ gb_internal lbAddr lb_build_addr_index_expr(lbProcedure *p, Ast *expr) { } +gb_internal lbValue lb_build_slice_expr_value(lbProcedure *p, Ast *expr) { + ast_node(se, SliceExpr, expr); + + lbValue base = lb_build_expr(p, se->expr); + Type *type = base_type(base.type); + + if (is_type_pointer(type)) { + type = base_type(type_deref(type)); + base = lb_emit_load(p, base); + } + + lbValue low = lb_const_int(p->module, t_int, 0); + lbValue high = {}; + + if (se->low != nullptr) { + low = lb_correct_endianness(p, lb_build_expr(p, se->low)); + } + if (se->high != nullptr) { + high = lb_correct_endianness(p, lb_build_expr(p, se->high)); + } + + bool no_indices = se->low == nullptr && se->high == nullptr; + + switch (type->kind) { + case Type_Slice: { + Type *slice_type = type; + lbValue len = lb_slice_len(p, base); + if (high.value == nullptr) high = len; + + if (!no_indices) { + lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); + } + + lbValue elem = lb_emit_ptr_offset(p, lb_slice_elem(p, base), low); + lbValue new_len = (se->low == nullptr) + ? lb_emit_conv(p, high, t_int) + : lb_emit_arith(p, Token_Sub, high, low, t_int); + + return lb_make_slice_value(p, slice_type, elem, new_len); + } + + case Type_DynamicArray: { + Type *elem_type = type->DynamicArray.elem; + Type *slice_type = alloc_type_slice(elem_type); + + lbValue len = lb_dynamic_array_len(p, base); + if (high.value == nullptr) high = len; + + if (!no_indices) { + lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); + } + + lbValue elem = lb_emit_ptr_offset(p, lb_dynamic_array_elem(p, base), low); + lbValue new_len = (se->low == nullptr) + ? lb_emit_conv(p, high, t_int) + : lb_emit_arith(p, Token_Sub, high, low, t_int); + + return lb_make_slice_value(p, slice_type, elem, new_len); + } + + case Type_Basic: { + if (is_type_string16(type)) { + GB_ASSERT_MSG(are_types_identical(type, t_string16), "got %s", type_to_string(type)); + lbValue len = lb_string_len(p, base); + if (high.value == nullptr) high = len; + + if (!no_indices) { + lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); + } + + lbValue elem = lb_emit_ptr_offset(p, lb_string_elem(p, base), low); + lbValue new_len = (se->low == nullptr) + ? lb_emit_conv(p, high, t_int) + : lb_emit_arith(p, Token_Sub, high, low, t_int); + + return lb_make_string_value(p, t_string16, elem, new_len); + } + GB_ASSERT_MSG(are_types_identical(type, t_string), "got %s", type_to_string(type)); + lbValue len = lb_string_len(p, base); + if (high.value == nullptr) high = len; + + if (!no_indices) { + lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); + } + + lbValue elem = lb_emit_ptr_offset(p, lb_string_elem(p, base), low); + lbValue new_len = (se->low == nullptr) + ? lb_emit_conv(p, high, t_int) + : lb_emit_arith(p, Token_Sub, high, low, t_int); + + return lb_make_string_value(p, t_string, elem, new_len); + } + + case Type_MultiPointer: { + GB_ASSERT(se->high != nullptr); + Type *elem_type = type->MultiPointer.elem; + Type *slice_type = alloc_type_slice(elem_type); + + low = lb_emit_conv(p, low, t_int); + high = lb_emit_conv(p, high, t_int); + + lb_emit_multi_pointer_slice_bounds_check(p, se->open, low, high); + + LLVMValueRef indices[1] = {low.value}; + lbValue ptr = {}; + ptr.value = LLVMBuildGEP2(p->builder, lb_type(p->module, elem_type), base.value, indices, 1, ""); + ptr.type = alloc_type_pointer(elem_type); + + lbValue new_len = (se->low == nullptr) + ? lb_emit_conv(p, high, t_int) + : lb_emit_arith(p, Token_Sub, high, low, t_int); + + return lb_make_slice_value(p, slice_type, ptr, new_len); + } + + default: + GB_PANIC("lb_build_slice_expr_value: unexpected type %s", type_to_string(base.type)); + return {}; + } +} + gb_internal lbAddr lb_build_addr_slice_expr(lbProcedure *p, Ast *expr) { ast_node(se, SliceExpr, expr); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index ed0b14273..3413fbdf9 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1724,6 +1724,39 @@ gb_internal void lb_fill_string(lbProcedure *p, lbAddr const &string, lbValue ba lb_emit_store(p, lb_emit_struct_ep(p, ptr, 1), len); } +gb_internal lbValue lb_emit_struct_iv(lbProcedure *p, lbValue agg, lbValue field, i32 index) { + Type *t = base_type(agg.type); + i32 mapped_index = lb_convert_struct_index(p->module, t, index); + lbValue res = {}; + res.value = LLVMBuildInsertValue(p->builder, agg.value, field.value, cast(unsigned)mapped_index, ""); + res.type = agg.type; + return res; +} + +gb_internal lbValue lb_build_struct_value(lbProcedure *p, Type *type, lbValue *fields, isize count) { + LLVMTypeRef llvm_type = lb_type(p->module, type); + lbValue agg = {}; + agg.value = LLVMGetPoison(llvm_type); + agg.type = type; + for (isize i = 0; i < count; i++) { + agg = lb_emit_struct_iv(p, agg, fields[i], cast(i32)i); + } + return agg; +} + +gb_internal lbValue lb_make_slice_value(lbProcedure *p, Type *slice_type, lbValue elem, lbValue len) { + GB_ASSERT(is_type_slice(slice_type)); + lbValue fields[2] = {elem, len}; + return lb_build_struct_value(p, slice_type, fields, 2); +} + +gb_internal lbValue lb_make_string_value(lbProcedure *p, Type *string_type, lbValue elem, lbValue len) { + GB_ASSERT(is_type_string(string_type)); + lbValue fields[2] = {elem, len}; + return lb_build_struct_value(p, string_type, fields, 2); +} + + gb_internal lbValue lb_string_elem(lbProcedure *p, lbValue string) { Type *t = base_type(string.type); if (t->kind == Type_Basic && t->Basic.kind == Basic_string16) { From bb2e42faa6ce6a26235c0607402430f67dff25df Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 19:49:26 +0000 Subject: [PATCH 707/766] More uses of SSA aggregation values --- src/llvm_backend_expr.cpp | 47 +++++++++--------------------------- src/llvm_backend_proc.cpp | 14 +++++------ src/llvm_backend_stmt.cpp | 25 +++++++------------ src/llvm_backend_utility.cpp | 3 ++- 4 files changed, 29 insertions(+), 60 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 29edf4d2d..2ff5a0191 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1495,7 +1495,6 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV } } - lbAddr res = lb_add_local_generated(p, type, false); // NOTE: initialized in full later lbValue a = lb_emit_struct_ev(p, lhs, 0); lbValue b = lb_emit_struct_ev(p, lhs, 1); lbValue c = lb_emit_struct_ev(p, rhs, 0); @@ -1533,10 +1532,9 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV } } - lb_emit_store(p, lb_emit_struct_ep(p, res.addr, 0), real); - lb_emit_store(p, lb_emit_struct_ep(p, res.addr, 1), imag); - return lb_addr_load(p, res); + lbValue fields[2] = {real, imag}; + return lb_build_struct_value(p, type, fields, gb_count_of(fields)); } else if (is_type_quaternion(type)) { lhs = lb_emit_conv(p, lhs, type); rhs = lb_emit_conv(p, rhs, type); @@ -1549,7 +1547,6 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV immediate_type = t_f32; } - lbAddr res = lb_add_local_generated(p, type, false); // NOTE: initialized in full later lbValue x0 = lb_emit_struct_ev(p, lhs, 0); lbValue x1 = lb_emit_struct_ev(p, lhs, 1); lbValue x2 = lb_emit_struct_ev(p, lhs, 2); @@ -1577,10 +1574,6 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV lbValue z2 = lb_emit_arith(p, op, x2, y2, immediate_type); lbValue z3 = lb_emit_arith(p, op, x3, y3, immediate_type); - lbValue d0 = lb_emit_struct_ep(p, res.addr, 0); - lbValue d1 = lb_emit_struct_ep(p, res.addr, 1); - lbValue d2 = lb_emit_struct_ep(p, res.addr, 2); - lbValue d3 = lb_emit_struct_ep(p, res.addr, 3); if (immediate_type != ft) { z0 = lb_emit_conv(p, z0, ft); @@ -1589,12 +1582,9 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV z3 = lb_emit_conv(p, z3, ft); } - lb_emit_store(p, d0, z0); - lb_emit_store(p, d1, z1); - lb_emit_store(p, d2, z2); - lb_emit_store(p, d3, z3); - return lb_addr_load(p, res); + lbValue fields[4] = {z0, z1, z2, z3}; + return lb_build_struct_value(p, type, fields, gb_count_of(fields)); } else if (op == Token_Mul) { TEMPORARY_ALLOCATOR_GUARD(); @@ -2232,29 +2222,23 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { if (is_type_complex(src) && is_type_complex(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, false); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft); lbValue imag = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 1), imag); - return lb_addr_load(p, gen); + + lbValue fields[2] = {real, imag}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_quaternion(src) && is_type_quaternion(dst)) { // @QuaternionLayout Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, false); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue q0 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft); lbValue q1 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft); lbValue q2 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 2), ft); lbValue q3 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 3), ft); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), q0); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 1), q1); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 2), q2); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 3), q3); - return lb_addr_load(p, gen); + + lbValue fields[4] = {q0, q1, q2, q2}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_integer(src) && is_type_complex(dst)) { @@ -2844,8 +2828,6 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { return lb_const_nil(p->module, t); } - lbAddr result = lb_add_local_generated(p, t, true); - Type *st = default_type(src_type); lbValue data = lb_address_from_load_or_generate_local(p, value); @@ -2854,13 +2836,8 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { data = lb_emit_conv(p, data, t_rawptr); lbValue id = lb_typeid(p->module, st); - lbValue any_data = lb_emit_struct_ep(p, result.addr, 0); - lbValue any_id = lb_emit_struct_ep(p, result.addr, 1); - - lb_emit_store(p, any_data, data); - lb_emit_store(p, any_id, id); - - return lb_addr_load(p, result); + lbValue fields[2] = {data, id}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 9e2429111..4033c12e8 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1028,15 +1028,14 @@ gb_internal lbValue lb_emit_conjugate(lbProcedure *p, lbValue val, Type *type) { lbValue res = {}; Type *t = val.type; if (is_type_complex(t)) { - res = lb_addr_get_ptr(p, lb_add_local_generated(p, type, false)); lbValue real = lb_emit_struct_ev(p, val, 0); lbValue imag = lb_emit_struct_ev(p, val, 1); imag = lb_emit_unary_arith(p, Token_Sub, imag, imag.type); - lb_emit_store(p, lb_emit_struct_ep(p, res, 0), real); - lb_emit_store(p, lb_emit_struct_ep(p, res, 1), imag); + + lbValue fields[2] = {real, imag}; + return lb_build_struct_value(p, type, fields, gb_count_of(fields)); } else if (is_type_quaternion(t)) { // @QuaternionLayout - res = lb_addr_get_ptr(p, lb_add_local_generated(p, type, false)); lbValue real = lb_emit_struct_ev(p, val, 3); lbValue imag = lb_emit_struct_ev(p, val, 0); lbValue jmag = lb_emit_struct_ev(p, val, 1); @@ -1044,10 +1043,9 @@ gb_internal lbValue lb_emit_conjugate(lbProcedure *p, lbValue val, Type *type) { imag = lb_emit_unary_arith(p, Token_Sub, imag, imag.type); jmag = lb_emit_unary_arith(p, Token_Sub, jmag, jmag.type); kmag = lb_emit_unary_arith(p, Token_Sub, kmag, kmag.type); - lb_emit_store(p, lb_emit_struct_ep(p, res, 3), real); - lb_emit_store(p, lb_emit_struct_ep(p, res, 0), imag); - lb_emit_store(p, lb_emit_struct_ep(p, res, 1), jmag); - lb_emit_store(p, lb_emit_struct_ep(p, res, 2), kmag); + + lbValue fields[4] = {imag, jmag, kmag, real}; + return lb_build_struct_value(p, type, fields, gb_count_of(fields)); } else if (is_type_array_like(t)) { res = lb_addr_get_ptr(p, lb_add_local_generated(p, type, true)); Type *elem_type = base_array_type(t); diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index df87e7703..77e5ec0d1 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -2537,33 +2537,26 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return } else { Type *ret_type = p->type->Proc.results; - // NOTE(bill): Doesn't need to be zero because it will be initialized in the loops - if (return_by_pointer) { - res = p->return_ptr.addr; - } else { - res = lb_add_local_generated(p, ret_type, false).addr; - } - auto result_values = slice_make(temporary_allocator(), results.count); - auto result_eps = slice_make(temporary_allocator(), results.count); - for_array(i, results) { result_values[i] = lb_emit_conv(p, results[i], tuple->variables[i]->type); } - for_array(i, results) { - result_eps[i] = lb_emit_struct_ep(p, res, cast(i32)i); - } - for_array(i, result_eps) { - lb_emit_store(p, result_eps[i], result_values[i]); - } if (return_by_pointer) { + res = p->return_ptr.addr; + auto result_eps = slice_make(temporary_allocator(), results.count); + for_array(i, results) { + result_eps[i] = lb_emit_struct_ep(p, res, cast(i32)i); + } + for_array(i, result_eps) { + lb_emit_store(p, result_eps[i], result_values[i]); + } lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr, pos); LLVMBuildRetVoid(p->builder); return; } - res = lb_emit_load(p, res); + res = lb_build_struct_value(p, ret_type, result_values.data, result_values.count); } } lb_build_return_stmt_internal(p, res, pos); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 3413fbdf9..3dec1b61c 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1736,7 +1736,8 @@ gb_internal lbValue lb_emit_struct_iv(lbProcedure *p, lbValue agg, lbValue field gb_internal lbValue lb_build_struct_value(lbProcedure *p, Type *type, lbValue *fields, isize count) { LLVMTypeRef llvm_type = lb_type(p->module, type); lbValue agg = {}; - agg.value = LLVMGetPoison(llvm_type); + // agg.value = LLVMGetPoison(llvm_type); + agg.value = LLVMConstNull(llvm_type); agg.type = type; for (isize i = 0; i < count; i++) { agg = lb_emit_struct_iv(p, agg, fields[i], cast(i32)i); From f70bceec84a7425a9dcd68fc21e4d64b0483f817 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 19:57:23 +0000 Subject: [PATCH 708/766] Add optimization for improving side-effect-free use of a `select` for ternary if. --- src/llvm_backend_expr.cpp | 49 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 2ff5a0191..819ad2330 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -10,6 +10,44 @@ gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) return LLVMConstInt(type, mask, false); } +gb_internal bool lb_is_expr_trivial(Ast *e) { + Type *type = default_type(type_of_expr(e)); + Type *bt = base_type(type); + if (is_type_integer(bt) || is_type_float(bt) || is_type_boolean(bt) || + is_type_pointer(bt) || is_type_enum(bt) || is_type_rune(bt) || is_type_typeid((bt))) { + e = unparen_expr(e); + TypeAndValue tav = type_and_value_of_expr(e); + if (tav.mode == Addressing_Constant) { + return true; + } + if (e->kind == Ast_Ident) { + return true; + } + if (e->kind == Ast_SelectorExpr) { + Ast *operand = unparen_expr(e->SelectorExpr.expr); + if (operand && operand->kind == Ast_Ident) { + // If the operand is a pointer, thus deferences it, disallow it + Type *ot = type_of_expr(operand); + if (ot == nullptr || is_type_pointer(ot)) { + return false; + } + return true; + } + } + if (e->kind == Ast_UnaryExpr && e->UnaryExpr.op.kind != Token_And) { + Ast *operand = unparen_expr(e->UnaryExpr.expr); + TypeAndValue otav = type_and_value_of_expr(operand); + if (otav.mode == Addressing_Constant) { + return true; + } + if (operand->kind == Ast_Ident) { + return true; + } + } + } + return false; +} + gb_internal lbValue lb_emit_logical_binary_expr(lbProcedure *p, TokenKind op, Ast *left, Ast *right, Type *final_type) { lbModule *m = p->module; @@ -4091,10 +4129,18 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { case_end; case_ast_node(te, TernaryIfExpr, expr); + GB_ASSERT(te->y != nullptr); + Type *type = default_type(type_of_expr(expr)); + if (lb_is_expr_trivial(te->x) && lb_is_expr_trivial(te->y)) { + lbValue cond = lb_build_expr(p, te->cond); + lbValue x = lb_emit_conv(p, lb_build_expr(p, te->x), type); + lbValue y = lb_emit_conv(p, lb_build_expr(p, te->y), type); + return lb_emit_select(p, cond, x, y); + } + LLVMValueRef incoming_values[2] = {}; LLVMBasicBlockRef incoming_blocks[2] = {}; - GB_ASSERT(te->y != nullptr); lbBlock *then = lb_create_block(p, "if.then"); lbBlock *done = lb_create_block(p, "if.done"); // NOTE(bill): Append later lbBlock *else_ = lb_create_block(p, "if.else"); @@ -4102,7 +4148,6 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { lb_build_cond(p, te->cond, then, else_); lb_start_block(p, then); - Type *type = default_type(type_of_expr(expr)); LLVMTypeRef llvm_type = lb_type(p->module, type); incoming_values[0] = lb_emit_conv(p, lb_build_expr(p, te->x), type).value; From a56c3da1497d64fd23e0e5d9157e7d076153c53f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 20:02:48 +0000 Subject: [PATCH 709/766] Support select fast path for `or_else` --- src/llvm_backend_expr.cpp | 38 --------------------------- src/llvm_backend_utility.cpp | 51 ++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 38 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 819ad2330..6fa259b0c 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -10,44 +10,6 @@ gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) return LLVMConstInt(type, mask, false); } -gb_internal bool lb_is_expr_trivial(Ast *e) { - Type *type = default_type(type_of_expr(e)); - Type *bt = base_type(type); - if (is_type_integer(bt) || is_type_float(bt) || is_type_boolean(bt) || - is_type_pointer(bt) || is_type_enum(bt) || is_type_rune(bt) || is_type_typeid((bt))) { - e = unparen_expr(e); - TypeAndValue tav = type_and_value_of_expr(e); - if (tav.mode == Addressing_Constant) { - return true; - } - if (e->kind == Ast_Ident) { - return true; - } - if (e->kind == Ast_SelectorExpr) { - Ast *operand = unparen_expr(e->SelectorExpr.expr); - if (operand && operand->kind == Ast_Ident) { - // If the operand is a pointer, thus deferences it, disallow it - Type *ot = type_of_expr(operand); - if (ot == nullptr || is_type_pointer(ot)) { - return false; - } - return true; - } - } - if (e->kind == Ast_UnaryExpr && e->UnaryExpr.op.kind != Token_And) { - Ast *operand = unparen_expr(e->UnaryExpr.expr); - TypeAndValue otav = type_and_value_of_expr(operand); - if (otav.mode == Addressing_Constant) { - return true; - } - if (operand->kind == Ast_Ident) { - return true; - } - } - } - return false; -} - gb_internal lbValue lb_emit_logical_binary_expr(lbProcedure *p, TokenKind op, Ast *left, Ast *right, Type *final_type) { lbModule *m = p->module; diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 3dec1b61c..944920135 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -438,6 +438,50 @@ gb_internal lbValue lb_emit_try_has_value(lbProcedure *p, lbValue rhs) { return has_value; } +gb_internal bool lb_is_type_trivial(Type *type) { + Type *bt = base_type(type); + if (is_type_integer(bt) || is_type_float(bt) || is_type_boolean(bt) || + is_type_pointer(bt) || is_type_enum(bt) || is_type_rune(bt) || is_type_typeid((bt))) { + return true; + } + return false; +} + +gb_internal bool lb_is_expr_trivial(Ast *e) { + Type *type = default_type(type_of_expr(e)); + if (lb_is_type_trivial(type)) { + e = unparen_expr(e); + TypeAndValue tav = type_and_value_of_expr(e); + if (tav.mode == Addressing_Constant) { + return true; + } + if (e->kind == Ast_Ident) { + return true; + } + if (e->kind == Ast_SelectorExpr) { + Ast *operand = unparen_expr(e->SelectorExpr.expr); + if (operand && operand->kind == Ast_Ident) { + // If the operand is a pointer, thus deferences it, disallow it + Type *ot = type_of_expr(operand); + if (ot == nullptr || is_type_pointer(ot)) { + return false; + } + return true; + } + } + if (e->kind == Ast_UnaryExpr && e->UnaryExpr.op.kind != Token_And) { + Ast *operand = unparen_expr(e->UnaryExpr.expr); + TypeAndValue otav = type_and_value_of_expr(operand); + if (otav.mode == Addressing_Constant) { + return true; + } + if (operand->kind == Ast_Ident) { + return true; + } + } + } + return false; +} gb_internal lbValue lb_emit_or_else(lbProcedure *p, Ast *arg, Ast *else_expr, TypeAndValue const &tv) { if (arg->state_flags & StateFlag_DirectiveWasFalse) { @@ -467,6 +511,13 @@ gb_internal lbValue lb_emit_or_else(lbProcedure *p, Ast *arg, Ast *else_expr, Ty lb_start_block(p, then); return lb_emit_conv(p, lhs, type); } else { + if (lb_is_type_trivial(type) && lb_is_expr_trivial(else_expr)) { + lbValue has_value = lb_emit_try_has_value(p, rhs); + lbValue then_val = lb_emit_conv(p, lhs, type); + lbValue else_val = lb_emit_conv(p, lb_build_expr(p, else_expr), type); + return lb_emit_select(p, has_value, then_val, else_val); + } + LLVMValueRef incoming_values[2] = {}; LLVMBasicBlockRef incoming_blocks[2] = {}; From f8f96905ae360bb022bac7d56da2c1e1e16c571c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 20:27:14 +0000 Subject: [PATCH 710/766] Fix typos --- src/llvm_backend_expr.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 6fa259b0c..434175c46 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -252,25 +252,18 @@ gb_internal lbValue lb_emit_unary_arith(lbProcedure *p, TokenKind op, lbValue x, LLVMValueRef v0 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 0, ""), ""); LLVMValueRef v1 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 1, ""), ""); - lbAddr addr = lb_add_local_generated(p, x.type, false); - LLVMTypeRef type = llvm_addr_type(p->module, addr.addr); - LLVMBuildStore(p->builder, v0, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 0, "")); - LLVMBuildStore(p->builder, v1, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 1, "")); - return lb_addr_load(p, addr); - + Type *et = base_complex_elem_type(x.type); + lbValue fields[2] = {{v0, et}, {v1, et}}; + return lb_build_struct_value(p, x.type, fields, gb_count_of(fields)); } else if (is_type_quaternion(x.type)) { LLVMValueRef v0 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 0, ""), ""); LLVMValueRef v1 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 1, ""), ""); LLVMValueRef v2 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 2, ""), ""); LLVMValueRef v3 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 3, ""), ""); - lbAddr addr = lb_add_local_generated(p, x.type, false); - LLVMTypeRef type = llvm_addr_type(p->module, addr.addr); - LLVMBuildStore(p->builder, v0, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 0, "")); - LLVMBuildStore(p->builder, v1, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 1, "")); - LLVMBuildStore(p->builder, v2, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 2, "")); - LLVMBuildStore(p->builder, v3, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 3, "")); - return lb_addr_load(p, addr); + Type *et = base_complex_elem_type(x.type); + lbValue fields[4] = {{v0, et}, {v1, et}, {v2, et}, {v3, et}}; + return lb_build_struct_value(p, x.type, fields, gb_count_of(fields)); } else if (is_type_simd_vector(x.type)) { Type *elem = base_array_type(x.type); if (is_type_float(elem)) { @@ -1547,6 +1540,8 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV immediate_type = t_f32; } + lbAddr res = lb_add_local_generated(p, type, false); + lbValue x0 = lb_emit_struct_ev(p, lhs, 0); lbValue x1 = lb_emit_struct_ev(p, lhs, 1); lbValue x2 = lb_emit_struct_ev(p, lhs, 2); @@ -1582,6 +1577,10 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV z3 = lb_emit_conv(p, z3, ft); } + lbValue d0 = lb_emit_struct_ep(p, res.addr, 0); + lbValue d1 = lb_emit_struct_ep(p, res.addr, 1); + lbValue d2 = lb_emit_struct_ep(p, res.addr, 2); + lbValue d3 = lb_emit_struct_ep(p, res.addr, 3); lbValue fields[4] = {z0, z1, z2, z3}; return lb_build_struct_value(p, type, fields, gb_count_of(fields)); @@ -2237,7 +2236,7 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { lbValue q2 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 2), ft); lbValue q3 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 3), ft); - lbValue fields[4] = {q0, q1, q2, q2}; + lbValue fields[4] = {q0, q1, q2, q3}; return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } From 12b06887a31a2c3fccef6996188c06d0aface0fa Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 20:36:02 +0000 Subject: [PATCH 711/766] Remove dead code --- src/llvm_backend_expr.cpp | 41 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 434175c46..8802cd5aa 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1540,8 +1540,6 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV immediate_type = t_f32; } - lbAddr res = lb_add_local_generated(p, type, false); - lbValue x0 = lb_emit_struct_ev(p, lhs, 0); lbValue x1 = lb_emit_struct_ev(p, lhs, 1); lbValue x2 = lb_emit_struct_ev(p, lhs, 2); @@ -1577,11 +1575,6 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV z3 = lb_emit_conv(p, z3, ft); } - lbValue d0 = lb_emit_struct_ep(p, res.addr, 0); - lbValue d1 = lb_emit_struct_ep(p, res.addr, 1); - lbValue d2 = lb_emit_struct_ep(p, res.addr, 2); - lbValue d3 = lb_emit_struct_ep(p, res.addr, 3); - lbValue fields[4] = {z0, z1, z2, z3}; return lb_build_struct_value(p, type, fields, gb_count_of(fields)); } else if (op == Token_Mul) { @@ -2242,50 +2235,42 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { if (is_type_integer(src) && is_type_complex(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, true); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, value, ft); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real); - return lb_addr_load(p, gen); + lbValue fields[2] = {real, lb_const_nil(m, ft)}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_float(src) && is_type_complex(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, true); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, value, ft); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real); - return lb_addr_load(p, gen); + lbValue fields[2] = {real, lb_const_nil(m, ft)}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_integer(src) && is_type_quaternion(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, true); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, value, ft); + lbValue zero = lb_const_nil(m, ft); // @QuaternionLayout - lb_emit_store(p, lb_emit_struct_ep(p, gp, 3), real); - return lb_addr_load(p, gen); + lbValue fields[4] = {zero, zero, zero, real}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_float(src) && is_type_quaternion(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, true); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, value, ft); + lbValue zero = lb_const_nil(m, ft); // @QuaternionLayout - lb_emit_store(p, lb_emit_struct_ep(p, gp, 3), real); - return lb_addr_load(p, gen); + lbValue fields[4] = {zero, zero, zero, real}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_complex(src) && is_type_quaternion(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, true); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft); lbValue imag = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft); + lbValue zero = lb_const_nil(m, ft); // @QuaternionLayout - lb_emit_store(p, lb_emit_struct_ep(p, gp, 3), real); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), imag); - return lb_addr_load(p, gen); + lbValue fields[4] = {imag, zero, zero, real}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } // float <-> integer From 6b2853d9f110acc433b03057d0824c9dfcae242a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:03:31 +0000 Subject: [PATCH 712/766] Improve `matrix * vector` code gen --- src/llvm_backend_expr.cpp | 18 ++++++++++++++---- src/llvm_backend_utility.cpp | 25 ++++++++++++++++++------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 8802cd5aa..e385dc995 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -967,7 +967,7 @@ gb_internal lbValue lb_emit_matrix_mul_vector(lbProcedure *p, lbValue lhs, lbVal } for (unsigned row_index = 0; row_index < column_count; row_index++) { - LLVMValueRef value = lb_emit_struct_ev(p, rhs, row_index).value; + LLVMValueRef value = LLVMBuildExtractValue(p->builder, rhs.value, row_index, ""); LLVMValueRef row = llvm_vector_broadcast(p, value, row_count); v_rows[row_index] = row; } @@ -988,13 +988,19 @@ gb_internal lbValue lb_emit_matrix_mul_vector(lbProcedure *p, lbValue lhs, lbVal lbAddr res = lb_add_local_generated(p, type, true); + Type *vector_elem_type = base_array_type(rhs.type); + for (i64 i = 0; i < mt->Matrix.row_count; i++) { for (i64 j = 0; j < mt->Matrix.column_count; j++) { lbValue dst = lb_emit_matrix_epi(p, res.addr, i, 0); lbValue d0 = lb_emit_load(p, dst); lbValue a = lb_emit_matrix_ev(p, lhs, i, j); - lbValue b = lb_emit_struct_ev(p, rhs, cast(i32)j); + + + LLVMValueRef b_value = LLVMBuildExtractValue(p->builder, rhs.value, cast(unsigned)j, ""); + lbValue b = {b_value, vector_elem_type}; + lbValue c = lb_emit_mul_add(p, a, b, d0, elem); lb_emit_store(p, dst, c); } @@ -1043,7 +1049,7 @@ gb_internal lbValue lb_emit_vector_mul_matrix(lbProcedure *p, lbValue lhs, lbVal } for (unsigned column_index = 0; column_index < row_count; column_index++) { - LLVMValueRef value = lb_emit_struct_ev(p, lhs, column_index).value; + LLVMValueRef value = LLVMBuildExtractValue(p->builder, lhs.value, column_index, ""); LLVMValueRef row = llvm_vector_broadcast(p, value, column_count); v_rows[column_index] = row; } @@ -1072,12 +1078,16 @@ gb_internal lbValue lb_emit_vector_mul_matrix(lbProcedure *p, lbValue lhs, lbVal lbAddr res = lb_add_local_generated(p, type, true); + Type *vector_elem_type = base_array_type(rhs.type); + for (i64 j = 0; j < mt->Matrix.column_count; j++) { for (i64 k = 0; k < mt->Matrix.row_count; k++) { lbValue dst = lb_emit_matrix_epi(p, res.addr, 0, j); lbValue d0 = lb_emit_load(p, dst); - lbValue a = lb_emit_struct_ev(p, lhs, cast(i32)k); + LLVMValueRef a_value = LLVMBuildExtractValue(p->builder, lhs.value, cast(unsigned)k, ""); + lbValue a = {a_value, vector_elem_type}; + lbValue b = lb_emit_matrix_ev(p, rhs, k, j); lbValue c = lb_emit_mul_add(p, a, b, d0, elem); lb_emit_store(p, dst, c); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 944920135..3905adfcd 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1742,14 +1742,25 @@ gb_internal lbValue lb_emit_matrix_ep(lbProcedure *p, lbValue s, lbValue row, lb return res; } - gb_internal lbValue lb_emit_matrix_ev(lbProcedure *p, lbValue s, isize row, isize column) { - Type *st = base_type(s.type); - GB_ASSERT_MSG(is_type_matrix(st), "%s", type_to_string(st)); - - lbValue value = lb_address_from_load_or_generate_local(p, s); - lbValue ptr = lb_emit_matrix_epi(p, value, row, column); - return lb_emit_load(p, ptr); + Type *t = s.type; + Type *mt = base_type(t); + GB_ASSERT_MSG(is_type_matrix(mt), "%s", type_to_string(mt)); + + isize stride_elems = matrix_type_stride_in_elems(mt); + + isize index = -1; + + if (mt->Matrix.is_row_major) { + index = column + (row * stride_elems); + } else { + index = row + (column * stride_elems); + } + + lbValue res = {}; + res.value = LLVMBuildExtractValue(p->builder, s.value, cast(unsigned)index, ""); + res.type = base_array_type(mt); + return res; } gb_internal void lb_fill_slice(lbProcedure *p, lbAddr const &slice, lbValue base_elem, lbValue len) { From eecb67cb8968acdf22ff89f55ac9bac432e38a2d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:17:05 +0000 Subject: [PATCH 713/766] Implement fused nested slice chain optimizations `src[a:b][c:d][e:f]...` --- src/llvm_backend_expr.cpp | 89 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index e385dc995..1efc8f411 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -4853,6 +4853,95 @@ gb_internal lbAddr lb_build_addr_index_expr(lbProcedure *p, Ast *expr) { gb_internal lbValue lb_build_slice_expr_value(lbProcedure *p, Ast *expr) { ast_node(se, SliceExpr, expr); + if (true) { + // NOTE(bill): Fused nested slice chain: src[a:b][c:d][e:f]... + // Walk a chain of nested SliceExprs down to the root source, then apply + // each slice's bounds check and offset on raw (ptr, len) SSA values, + // building a single aggregate at the end. + + + Ast *inner_ast = unparen_expr(se->expr); + if (inner_ast->kind == Ast_SliceExpr) { + enum {MAX_CHAIN = 8}; // this is more than enough in practice + + // Collect the chain: slices[0] is innermost, slices[n-1] is outer-most `se`. + Ast *chain[MAX_CHAIN] = {}; // bounded depth + isize chain_count = 0; + chain[chain_count++] = expr; // outer-most + + Ast *root = inner_ast; + while (root->kind == Ast_SliceExpr && chain_count < MAX_CHAIN) { + chain[chain_count++] = root; + root = unparen_expr(root->SliceExpr.expr); + } + + Type *root_type = base_type(type_of_expr(root)); + if (is_type_pointer(root_type)) { + root_type = base_type(type_deref(root_type)); + } + if (is_type_slice(root_type) || + is_type_dynamic_array(root_type) || + is_type_string(root_type) || + is_type_string16(root_type)) { + lbModule *m = p->module; + + // Evaluate the root source and extract raw (ptr, len). + lbValue src = lb_build_expr(p, root); + Type *src_type = base_type(src.type); + if (is_type_pointer(src_type)) { + src_type = base_type(type_deref(src_type)); + src = lb_emit_load(p, src); + } + + lbValue cur_ptr = {}; + lbValue cur_len = {}; + if (is_type_slice(src_type)) { + cur_ptr = lb_slice_elem(p, src); + cur_len = lb_slice_len(p, src); + } else if (is_type_dynamic_array(src_type)) { + cur_ptr = lb_dynamic_array_elem(p, src); + cur_len = lb_dynamic_array_len(p, src); + } else { + GB_ASSERT(is_type_string(src_type) || is_type_string16(src_type)); + cur_ptr = lb_string_elem(p, src); + cur_len = lb_string_len(p, src); + } + + // Apply each slice innermost-first (reverse of collection order). + for (isize i = chain_count - 1; i >= 0; i--) { + AstSliceExpr *s = &chain[i]->SliceExpr; + + lbValue lo = lb_const_int(m, t_int, 0); + lbValue hi = {}; + if (s->low != nullptr) { + lo = lb_correct_endianness(p, lb_build_expr(p, s->low)); + } + if (s->high != nullptr) { + hi = lb_correct_endianness(p, lb_build_expr(p, s->high)); + } + if (hi.value == nullptr) { + hi = cur_len; + } + + bool no_indices = s->low == nullptr && s->high == nullptr; + if (!no_indices) { + lb_emit_slice_bounds_check(p, s->open, lo, hi, cur_len, s->low != nullptr); + } + + cur_ptr = (s->low == nullptr) ? cur_ptr : lb_emit_ptr_offset(p, cur_ptr, lo); + cur_len = (s->low == nullptr) ? lb_emit_conv(p, hi, t_int) : lb_emit_arith(p, Token_Sub, hi, lo, t_int); + } + + // Single aggregate construction. + Type *result_type = type_of_expr(expr); + if (is_type_string(result_type)) { + return lb_make_string_value(p, result_type, cur_ptr, cur_len); + } + return lb_make_slice_value(p, result_type, cur_ptr, cur_len); + } + } + } + lbValue base = lb_build_expr(p, se->expr); Type *type = base_type(base.type); From dc72e8210fc94cf70d30b7453447bc323dd9abb4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:28:58 +0000 Subject: [PATCH 714/766] Support `proc(q: $Q) -> type_of(Q{}.data[0])` in return types --- src/check_type.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 071e30c18..d8fd8d079 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2306,6 +2306,57 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para return tuple; } +// Check if an AST node references any polymorphic type parameters +// TODO(bill): is this even complete enough? +gb_internal bool ast_references_poly_params(Scope *scope, Ast *node) { + if (node == nullptr) { + return false; + } + switch (node->kind) { + case Ast_Ident: { + String name = node->Ident.token.string; + Entity *e = scope_lookup(scope, name); + if (e != nullptr && e->kind == Entity_TypeName && e->type != nullptr && e->type->kind == Type_Generic) { + return true; + } + return false; + } + case Ast_SelectorExpr: + return ast_references_poly_params(scope, node->SelectorExpr.expr); + case Ast_IndexExpr: + return ast_references_poly_params(scope, node->IndexExpr.expr); + case Ast_CallExpr: + for (Ast *arg : node->CallExpr.args) { + if (ast_references_poly_params(scope, arg)) { + return true; + } + } + return ast_references_poly_params(scope, node->CallExpr.proc); + case Ast_CompoundLit: + return ast_references_poly_params(scope, node->CompoundLit.type); + case Ast_UnaryExpr: + return ast_references_poly_params(scope, node->UnaryExpr.expr); + case Ast_ParenExpr: + return ast_references_poly_params(scope, node->ParenExpr.expr); + case Ast_DerefExpr: + return ast_references_poly_params(scope, node->DerefExpr.expr); + case Ast_PointerType: + return ast_references_poly_params(scope, node->PointerType.type); + case Ast_ArrayType: + return ast_references_poly_params(scope, node->ArrayType.elem) || + ast_references_poly_params(scope, node->ArrayType.count); + case Ast_FixedCapacityDynamicArrayType: + return ast_references_poly_params(scope, node->FixedCapacityDynamicArrayType.elem) || + ast_references_poly_params(scope, node->FixedCapacityDynamicArrayType.capacity); + case Ast_DynamicArrayType: + return ast_references_poly_params(scope, node->DynamicArrayType.elem); + case Ast_MapType: + return ast_references_poly_params(scope, node->MapType.key) || + ast_references_poly_params(scope, node->MapType.value); + } + return false; +} + gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_results) { if (_results == nullptr) { return nullptr; @@ -2340,7 +2391,12 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res if (field->type == nullptr) { param_value = handle_parameter_value(ctx, nullptr, &type, default_value, false); } else { - type = check_type(ctx, field->type); + if (ctx->allow_polymorphic_types && ast_references_poly_params(ctx->scope, field->type)) { + type = alloc_type_generic(ctx->scope, 0, str_lit("$deferred_return"), nullptr); + } else { + type = check_type(ctx, field->type); + } + if (default_value != nullptr) { param_value = handle_parameter_value(ctx, type, nullptr, default_value, false); From 2de214418c5eaf4b6da5e327f47b7d55935131f1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:29:54 +0000 Subject: [PATCH 715/766] Fix LTO with debug info by passing `-g` --- src/linker.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/linker.cpp b/src/linker.cpp index 12f016cea..76c795989 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -980,6 +980,10 @@ try_cross_linking:; link_command_line = gb_string_appendc(link_command_line, " -flto=thin"); link_command_line = gb_string_append_fmt(link_command_line, " -flto-jobs=%d ", build_context.thread_count); + if (build_context.ODIN_DEBUG) { + link_command_line = gb_string_appendc(link_command_line, " -g "); + } + if (is_osx && !build_context.minimum_os_version_string_given) { link_command_line = gb_string_appendc(link_command_line, " -Wno-override-module "); } From 38d7f45e64953f907132e9e784190e07cc63bab1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:35:02 +0000 Subject: [PATCH 716/766] Fix race condition with `code_gen_module` --- src/checker.hpp | 2 +- src/llvm_backend_general.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/checker.hpp b/src/checker.hpp index 374aaf10d..fd2fa2c7f 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -250,7 +250,7 @@ struct DeclInfo { i64 variadic_reuse_max_align; // NOTE(bill): this is to prevent a race condition since these procedure literals can be created anywhere at any time - struct lbModule *code_gen_module; + std::atomic code_gen_module; }; // ProcInfo stores the information needed for checking a procedure diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index fea4be7b2..dc647c1ab 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -498,10 +498,11 @@ gb_internal lbModule *lb_module_of_expr(lbGenerator *gen, Ast *expr) { gb_internal lbModule *lb_module_of_entity_internal(lbGenerator *gen, Entity *e, lbModule *curr_module) { lbModule **found = nullptr; - if (e->kind == Entity_Procedure && - e->decl_info && - e->decl_info->code_gen_module) { - return e->decl_info->code_gen_module; + if (e->kind == Entity_Procedure && e->decl_info) { + lbModule *mod = e->decl_info->code_gen_module.load(std::memory_order_relaxed); + if (mod) { + return mod; + } } if (e->file) { found = map_get(&gen->modules, cast(void *)e->file); From fa6109ca1ebba9b16c48ffe080ca618f5b641cb9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:35:26 +0000 Subject: [PATCH 717/766] Properly dispose of `LLVMTargetDataRef` --- src/llvm_backend.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 81596c9ec..929b056a3 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3187,7 +3187,9 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { code_mode); lbModule *m = entry.value; m->target_machine = target_machine; - LLVMSetModuleDataLayout(m->mod, LLVMCreateTargetDataLayout(target_machine)); + LLVMTargetDataRef data_layout = LLVMCreateTargetDataLayout(target_machine); + LLVMSetModuleDataLayout(m->mod, data_layout); + LLVMDisposeTargetData(data_layout); #if LLVM_VERSION_MAJOR >= 18 if (build_context.fast_isel) { From 5d165f70e1a9c5d554e87ccee373fdeb5395d15a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:53:38 +0000 Subject: [PATCH 718/766] Add loads of RVO optimizations for basic 1-value return cases --- src/llvm_backend.hpp | 6 +- src/llvm_backend_proc.cpp | 19 ++-- src/llvm_backend_stmt.cpp | 201 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 216 insertions(+), 10 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 48c5be546..7b7d5cc31 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -359,6 +359,7 @@ struct lbProcedure { std::atomic is_done; lbAddr return_ptr; + Entity * sret_rvo_entity; // Local aliases of `return_ptr` Array defer_stmts; Array blocks; Array branch_blocks; @@ -486,7 +487,7 @@ gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlo gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlock *block, Ast *node); gb_internal lbValue lb_emit_transmute(lbProcedure *p, lbValue value, Type *t); gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue right); -gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining = ProcInlining_none, ProcTailing tailing = ProcTailing_none); +gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining = ProcInlining_none, ProcTailing tailing = ProcTailing_none, lbValue *sret_dst = nullptr); gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t); gb_internal lbValue lb_emit_comp_against_nil(lbProcedure *p, TokenKind op_kind, lbValue x); @@ -494,11 +495,10 @@ gb_internal void lb_emit_jump(lbProcedure *p, lbBlock *target_block); gb_internal void lb_emit_if(lbProcedure *p, lbValue cond, lbBlock *true_block, lbBlock *false_block); gb_internal void lb_start_block(lbProcedure *p, lbBlock *b); -gb_internal lbValue lb_build_call_expr(lbProcedure *p, Ast *expr); +gb_internal lbValue lb_build_call_expr(lbProcedure *p, Ast *expr, lbValue *sret_dst = nullptr); gb_internal lbProcedure *lb_create_dummy_procedure(lbModule *m, String link_name, Type *type); gb_internal void lb_begin_procedure_body(lbProcedure *p); gb_internal void lb_end_procedure_body(lbProcedure *p); -gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining); gb_internal lbAddr lb_find_or_generate_context_ptr(lbProcedure *p); gb_internal lbContextData *lb_push_context_onto_stack(lbProcedure *p, lbAddr ctx); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 4033c12e8..88165f4d2 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1073,7 +1073,7 @@ gb_internal lbValue lb_emit_conjugate(lbProcedure *p, lbValue val, Type *type) { return lb_emit_load(p, res); } -gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining, ProcTailing tailing) { +gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining, ProcTailing tailing, lbValue *sret_dst) { lbModule *m = p->module; Type *pt = base_type(value.type); @@ -1195,7 +1195,12 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c } if (return_by_pointer) { - lbValue return_ptr = lb_add_local_generated(p, rt, true).addr; + lbValue return_ptr = {}; + if (sret_dst != nullptr) { + return_ptr = *sret_dst; + } else { + return_ptr = lb_add_local_generated(p, rt, true).addr; + } lb_emit_call_internal(p, value, return_ptr, processed_args, nullptr, context_ptr, inlining, tailing); result = lb_emit_load(p, return_ptr); } else if (rt != nullptr) { @@ -4126,13 +4131,13 @@ gb_internal lbValue lb_handle_param_value(lbProcedure *p, Type *parameter_type, } -gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr); +gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr, lbValue *sret_dst = nullptr); -gb_internal lbValue lb_build_call_expr(lbProcedure *p, Ast *expr) { +gb_internal lbValue lb_build_call_expr(lbProcedure *p, Ast *expr, lbValue *sret_dst) { expr = unparen_expr(expr); ast_node(ce, CallExpr, expr); - lbValue res = lb_build_call_expr_internal(p, expr); + lbValue res = lb_build_call_expr_internal(p, expr, sret_dst); if (ce->optional_ok_one) { GB_ASSERT(is_type_tuple(res.type)); @@ -4153,7 +4158,7 @@ gb_internal void lb_add_values_to_array(lbProcedure *p, Array *args, lb } } -gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { +gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr, lbValue *sret_dst) { lbModule *m = p->module; TypeAndValue tv = type_and_value_of_expr(expr); @@ -4479,6 +4484,6 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { } } - return lb_emit_call(p, value, call_args, inlining, tailing); + return lb_emit_call(p, value, call_args, inlining, tailing, sret_dst); } diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 77e5ec0d1..80d52ef5b 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1,3 +1,127 @@ +#define LB_ENABLE_RVO true + +// NOTE(bill): @RVO Check if a call expression returns by sret with a return type matching dst_type. +// Returns the callee's function type if eligible for copy elision, nullptr otherwise. +gb_internal lbFunctionType *lb_call_sret_eligible(lbProcedure *p, Ast *call_expr, Type *dst_type) { + GB_ASSERT(call_expr->kind == Ast_CallExpr); + Ast *proc_expr = unparen_expr(call_expr->CallExpr.proc); + TypeAndValue proc_tv = type_and_value_of_expr(proc_expr); + if (proc_tv.mode == Addressing_Type || proc_tv.mode == Addressing_Builtin) { + return nullptr; + } + Type *pt = base_type(proc_tv.type); + if (pt == nullptr || pt->kind != Type_Proc || pt->Proc.results == nullptr) { + return nullptr; + } + lbFunctionType *callee_ft = lb_get_function_type(p->module, pt); + if (callee_ft->ret.kind != lbArg_Indirect) { + return nullptr; + } + Type *callee_ret = reduce_tuple_to_single_type(pt->Proc.results); + if (callee_ret == nullptr || !are_types_identical(dst_type, callee_ret)) { + return nullptr; + } + return callee_ft; +} + +// NOTE(bill): @RVO `sret` scan for `x := call(); ...; return x` pattern. +// When matched, `x` alloca will be the sret pointer itself, eliminating +// the copy from `x` to the sret buffer on return. +gb_internal void lb_scan_for_sret_rvo(lbProcedure *p) { + if (p->body == nullptr || p->body->kind != Ast_BlockStmt) { + return; + } + Type *proc_type = p->type; + if (proc_type->Proc.result_count != 1 || proc_type->Proc.results == nullptr) { + return; + } + lbFunctionType *ft = lb_get_function_type(p->module, proc_type); + if (ft->ret.kind != lbArg_Indirect) { + return; + } + + Slice stmts = p->body->BlockStmt.stmts; + if (stmts.count < 2) { + return; + } + + // Last stmt must be `return x` where x is an identifier + Ast *last = stmts[stmts.count - 1]; + if (last->kind != Ast_ReturnStmt) { + return; + } + Slice results = last->ReturnStmt.results; + if (results.count != 1) { + return; + } + Ast *ret_expr = unparen_expr(results[0]); + if (ret_expr->kind != Ast_Ident) { + return; + } + Entity *ret_entity = entity_of_node(ret_expr); + if (ret_entity == nullptr || ret_entity->kind != Entity_Variable) { + return; + } + + Type *ret_type = reduce_tuple_to_single_type(proc_type->Proc.results); + if (ret_type == nullptr || !are_types_identical(ret_entity->type, ret_type)) { + return; + } + + // Walk backwards from the second-to-last stmt to find `x := call()` + // Everything between must be safe (no reassignment of x, no control flow) + i64 decl_index = -1; + for (i64 i = stmts.count - 2; i >= 0; i--) { + Ast *stmt = stmts[i]; + switch (stmt->kind) { + case Ast_ValueDecl: { + AstValueDecl *vd = &stmt->ValueDecl; + if (!vd->is_mutable) { + // constant decl — safe, keep scanning + continue; + } + if (vd->names.count == 1 && vd->values.count == 1) { + Entity *e = entity_of_node(vd->names[0]); + if (e == ret_entity) { + Ast *rhs = unparen_expr(vd->values[0]); + if (rhs->kind == Ast_CallExpr && lb_call_sret_eligible(p, rhs, e->type)) { + decl_index = i; + } + goto done_scanning; + } + } + // Some other mutable ValueDecl — safe as long as it doesn't involve ret_entity + for (Ast *name : vd->names) { + if (entity_of_node(name) == ret_entity) { + goto done_scanning; + } + } + continue; + } + case Ast_ExprStmt: + // Expression statements (reads, function calls) are safe + continue; + case Ast_AssignStmt: { + // Check if any lhs is our entity + for (Ast *lhs : stmt->AssignStmt.lhs) { + Ast *l = unparen_expr(lhs); + if (l->kind == Ast_Ident && entity_of_node(l) == ret_entity) { + goto done_scanning; + } + } + continue; + } + default: + // Control flow or anything else — bail + goto done_scanning; + } + } +done_scanning: + if (decl_index >= 0) { + p->sret_rvo_entity = ret_entity; + } +} + gb_internal void lb_build_constant_value_decl(lbProcedure *p, AstValueDecl *vd) { if (vd == nullptr || vd->is_mutable) { return; @@ -2438,6 +2562,45 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return if (return_count == 1) { Entity *e = tuple->variables[0]; + + if (LB_ENABLE_RVO && res_count == 1 && return_by_pointer) { + Ast *ret_expr = unparen_expr(return_results[0]); + + // NOTE(bill): @RVO for `return call()` in a procedure which uses `sret` and has no defers + // This forwards the sret pointer directly to the callee + if (p->defer_stmts.count == 0) { + if (ret_expr->kind == Ast_CallExpr && lb_call_sret_eligible(p, ret_expr, e->type)) { + lbValue sret_ptr = p->return_ptr.addr; + lb_build_call_expr(p, ret_expr, &sret_ptr); + if (p->type->Proc.has_named_results && e->token.string != "") { + res = lb_emit_load(p, p->return_ptr.addr); + rw_mutex_shared_lock(&p->module->values_mutex); + lbValue found = map_must_get(&p->module->values, e); + rw_mutex_shared_unlock(&p->module->values_mutex); + lb_emit_store(p, found, lb_emit_conv(p, res, e->type)); + } + LLVMBuildRetVoid(p->builder); + return; + } + } + + // NOTE(bill): @RVO for `x := call(); ...; return x` + if (p->sret_rvo_entity != nullptr) { + if (ret_expr->kind == Ast_Ident) { + Entity *ret_e = entity_of_node(ret_expr); + if (ret_e == p->sret_rvo_entity) { + lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr, pos); + LLVMValueRef instr = LLVMGetLastInstruction(p->curr_block->block); + if (!lb_is_instr_terminating(instr)) { + LLVMBuildRetVoid(p->builder); + } + return; + } + } + } + } + + if (res_count == 0) { rw_mutex_shared_lock(&p->module->values_mutex); lbValue found = map_must_get(&p->module->values, e); @@ -2865,6 +3028,23 @@ gb_internal void lb_build_assign_stmt_array(lbProcedure *p, TokenKind op, lbAddr } gb_internal void lb_build_assign_stmt(lbProcedure *p, AstAssignStmt *as) { if (as->op.kind == Token_Eq) { + if (LB_ENABLE_RVO) { + // @RVO for single assignments `x = call()` + if (as->lhs.count == 1 && as->rhs.count == 1 && !is_blank_ident(as->lhs[0])) { + Ast *rhs_expr = unparen_expr(as->rhs[0]); + if (rhs_expr->kind == Ast_CallExpr) { + lbAddr lval = lb_build_addr(p, as->lhs[0]); + if (LLVMIsAAllocaInst(lval.addr.value) && lval.kind == lbAddr_Default) { + if (lb_call_sret_eligible(p, rhs_expr, lb_addr_type(lval))) { + lbValue dst = lval.addr; + lb_build_call_expr(p, rhs_expr, &dst); + return; + } + } + } + } + } + auto lvals = array_make(permanent_allocator(), 0, as->lhs.count); for (Ast *lhs : as->lhs) { @@ -3050,6 +3230,27 @@ gb_internal void lb_build_stmt(lbProcedure *p, Ast *node) { } } } else { + if (LB_ENABLE_RVO) { + // @RVO: for `x := call()` + if (vd->names.count == 1 && values.count == 1 && !is_blank_ident(vd->names[0])) { + Ast *rhs_expr = unparen_expr(values[0]); + Entity *e = entity_of_node(vd->names[0]); + if (rhs_expr->kind == Ast_CallExpr && e != nullptr && lb_call_sret_eligible(p, rhs_expr, e->type)) { + lbValue dst = {}; + if (e == p->sret_rvo_entity) { + dst = p->return_ptr.addr; + lb_add_entity(p->module, e, dst); + lb_add_debug_local_variable(p, dst.value, e->type, e->token); + } else { + lbAddr local = lb_add_local(p, e->type, e, true); + dst = local.addr; + } + lb_build_call_expr(p, rhs_expr, &dst); + break; + } + } + } + auto lvals_preused = slice_make(temporary_allocator(), vd->names.count); auto lvals = slice_make(temporary_allocator(), vd->names.count); auto inits = array_make(temporary_allocator(), 0, lvals.count); From b3b31cdba76a3b23ea65a50632abe85768142c87 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 22:04:27 +0000 Subject: [PATCH 719/766] `-internal-llvm-mem2reg` --- src/build_settings.cpp | 1 + src/llvm_backend_passes.cpp | 3 +++ src/main.cpp | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 1d836b1ec..d57793819 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -577,6 +577,7 @@ struct BuildContext { bool internal_by_value; bool internal_weak_monomorphization; bool internal_ignore_llvm_verification; + bool internal_llvm_mem2reg; bool no_threaded_checker; diff --git a/src/llvm_backend_passes.cpp b/src/llvm_backend_passes.cpp index e9edbace7..744f6af61 100644 --- a/src/llvm_backend_passes.cpp +++ b/src/llvm_backend_passes.cpp @@ -4,6 +4,9 @@ break; case 0: array_add(&passes, "always-inline"); + if (build_context.internal_llvm_mem2reg) { + array_add(&passes, "function(mem2reg)"); + } array_add(&passes, "function(annotation-remarks)"); break; case 1: diff --git a/src/main.cpp b/src/main.cpp index fdafa0cf2..177592fe6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -411,6 +411,7 @@ enum BuildFlagKind { BuildFlag_InternalByValue, BuildFlag_InternalWeakMonomorphization, BuildFlag_InternalLLVMVerification, + BuildFlag_InternalLLVMMem2Reg, BuildFlag_Tilde, @@ -642,6 +643,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_InternalByValue, str_lit("internal-by-value"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalWeakMonomorphization, str_lit("internal-weak-monomorphization"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalLLVMVerification, str_lit("internal-ignore-llvm-verification"), BuildFlagParam_None, Command_all); + add_flag(&build_flags, BuildFlag_InternalLLVMMem2Reg, str_lit("internal-llvm-mem2reg"), BuildFlagParam_None, Command_all); #if ALLOW_TILDE add_flag(&build_flags, BuildFlag_Tilde, str_lit("tilde"), BuildFlagParam_None, Command__does_build); @@ -1634,6 +1636,9 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_InternalLLVMVerification: build_context.internal_ignore_llvm_verification = true; break; + case BuildFlag_InternalLLVMMem2Reg: + build_context.internal_llvm_mem2reg = true; + break; case BuildFlag_Tilde: From 5fa274cb6a92c8d16150e51df1039b6324906113 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 22:10:03 +0000 Subject: [PATCH 720/766] `-internal-rvo` --- src/build_settings.cpp | 2 ++ src/llvm_backend_stmt.cpp | 2 +- src/main.cpp | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d57793819..d52553d65 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -579,6 +579,8 @@ struct BuildContext { bool internal_ignore_llvm_verification; bool internal_llvm_mem2reg; + bool enable_rvo; + bool no_threaded_checker; bool show_debug_messages; diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 80d52ef5b..f1b7175be 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1,4 +1,4 @@ -#define LB_ENABLE_RVO true +#define LB_ENABLE_RVO build_context.enable_rvo // NOTE(bill): @RVO Check if a call expression returns by sret with a return type matching dst_type. // Returns the callee's function type if eligible for copy elision, nullptr otherwise. diff --git a/src/main.cpp b/src/main.cpp index 177592fe6..d7288e5f4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -412,6 +412,7 @@ enum BuildFlagKind { BuildFlag_InternalWeakMonomorphization, BuildFlag_InternalLLVMVerification, BuildFlag_InternalLLVMMem2Reg, + BuildFlag_InternalEnableRVO, BuildFlag_Tilde, @@ -644,6 +645,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_InternalWeakMonomorphization, str_lit("internal-weak-monomorphization"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalLLVMVerification, str_lit("internal-ignore-llvm-verification"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalLLVMMem2Reg, str_lit("internal-llvm-mem2reg"), BuildFlagParam_None, Command_all); + add_flag(&build_flags, BuildFlag_InternalEnableRVO, str_lit("internal-enable-rvo"), BuildFlagParam_None, Command_all); #if ALLOW_TILDE add_flag(&build_flags, BuildFlag_Tilde, str_lit("tilde"), BuildFlagParam_None, Command__does_build); @@ -1639,6 +1641,10 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_InternalLLVMMem2Reg: build_context.internal_llvm_mem2reg = true; break; + case BuildFlag_InternalEnableRVO: + build_context.enable_rvo = true; + break; + case BuildFlag_Tilde: From af2d8ca679b95c2813c6af385a0746fb08caf07e Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Sun, 15 Mar 2026 21:45:44 -0400 Subject: [PATCH 721/766] FCD array proc group add _elems --- base/runtime/core_builtin.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 022778a24..511867feb 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -928,6 +928,7 @@ non_zero_append :: proc{ non_zero_append_elem_string, append_fixed_capacity_elem, + append_fixed_capacity_elems, non_zero_append_elem_fixed_capacity_string, non_zero_append_soa_elem, From 9051f5a0757de1b15f21c74e8dce38919775e2dd Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 16 Mar 2026 15:51:04 +0900 Subject: [PATCH 722/766] core/simd/x86: Fix _mm_blend_epi16 --- core/simd/x86/sse41.odin | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/simd/x86/sse41.odin b/core/simd/x86/sse41.odin index 81089ed63..510f5d8e9 100644 --- a/core/simd/x86/sse41.odin +++ b/core/simd/x86/sse41.odin @@ -26,7 +26,18 @@ _mm_blendv_epi8 :: #force_inline proc "c" (a, b, mask: __m128i) -> __m128i { } @(require_results, enable_target_feature="sse4.1") _mm_blend_epi16 :: #force_inline proc "c" (a, b: __m128i, $IMM8: u8) -> __m128i { - return transmute(__m128i)pblendw(transmute(i16x8)a, transmute(i16x8)b, IMM8) + return transmute(__m128i)simd.shuffle( + transmute(i16x8)b, + transmute(i16x8)a, + 0 when (IMM8 >> 0) & 1 == 1 else 8, + 1 when (IMM8 >> 1) & 1 == 1 else 9, + 2 when (IMM8 >> 2) & 1 == 1 else 10, + 3 when (IMM8 >> 3) & 1 == 1 else 11, + 4 when (IMM8 >> 4) & 1 == 1 else 12, + 5 when (IMM8 >> 5) & 1 == 1 else 13, + 6 when (IMM8 >> 6) & 1 == 1 else 14, + 7 when (IMM8 >> 7) & 1 == 1 else 15, + ) } @(require_results, enable_target_feature="sse4.1") _mm_blendv_pd :: #force_inline proc "c" (a, b, mask: __m128d) -> __m128d { @@ -303,8 +314,6 @@ foreign _ { blendpd :: proc(a, b: __m128d, #const imm2: u8) -> __m128d --- @(link_name = "llvm.x86.sse41.blendps") blendps :: proc(a, b: __m128, #const imm4: u8) -> __m128 --- - @(link_name = "llvm.x86.sse41.pblendw") - pblendw :: proc(a: i16x8, b: i16x8, #const imm8: u8) -> i16x8 --- @(link_name = "llvm.x86.sse41.insertps") insertps :: proc(a, b: __m128, #const imm8: u8) -> __m128 --- @(link_name = "llvm.x86.sse41.pmaxsb") From a030fb659672f5831bbcc9de7c864e5762fdeb7e Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 16 Mar 2026 15:51:54 +0900 Subject: [PATCH 723/766] core/crypto/sha2: Remove the broken Intel intrinsic kludge --- core/crypto/sha2/sha256_impl_hw_intel.odin | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/core/crypto/sha2/sha256_impl_hw_intel.odin b/core/crypto/sha2/sha256_impl_hw_intel.odin index 3f6ebb746..fcec80a3c 100644 --- a/core/crypto/sha2/sha256_impl_hw_intel.odin +++ b/core/crypto/sha2/sha256_impl_hw_intel.odin @@ -70,8 +70,7 @@ sha256_transf_hw :: proc "contextless" (ctx: ^Context_256, data: []byte) #no_bou tmp = x86._mm_shuffle_epi32(tmp, 0xb1) // CDAB state_1 = x86._mm_shuffle_epi32(state_1, 0x1b) // EFGH state_0 := x86._mm_alignr_epi8(tmp, state_1, 8) // ABEF - // state_1 = x86._mm_blend_epi16(state_1, tmp, 0xf0) // CDGH - state_1 = kludge_mm_blend_epi16_0xf0(state_1, tmp) + state_1 = x86._mm_blend_epi16(state_1, tmp, 0xf0) // CDGH data := data for len(data) >= BLOCK_SIZE_256 { @@ -238,18 +237,9 @@ sha256_transf_hw :: proc "contextless" (ctx: ^Context_256, data: []byte) #no_bou // Write back the updated state tmp = x86._mm_shuffle_epi32(state_0, 0x1b) // FEBA state_1 = x86._mm_shuffle_epi32(state_1, 0xb1) // DCHG - // state_0 = x86._mm_blend_epi16(tmp, state_1, 0xf0) // DCBA - state_0 = kludge_mm_blend_epi16_0xf0(tmp, state_1) + state_0 = x86._mm_blend_epi16(tmp, state_1, 0xf0) // DCBA state_1 = x86._mm_alignr_epi8(state_1, tmp, 8) // ABEF intrinsics.unaligned_store((^x86.__m128i)(&ctx.h[0]), state_0) intrinsics.unaligned_store((^x86.__m128i)(&ctx.h[4]), state_1) } - -@(private = "file") -kludge_mm_blend_epi16_0xf0 :: #force_inline proc "contextless"(a, b: x86.__m128i) -> x86.__m128i { - // HACK HACK HACK: LLVM got rid of `llvm.x86.sse41.pblendw`. - a_ := simd.to_array(a) - b_ := simd.to_array(b) - return x86.__m128i{a_[0], b_[1]} -} From ccb56de19a386532228baf2c83a7d06493fb8abc Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 16 Mar 2026 14:58:23 +0900 Subject: [PATCH 724/766] core/crypto/sha2: Add scaffolding for SHA512 acceleration --- core/crypto/sha2/sha2.odin | 20 ++++++++++++++++--- ...pl_hw_gen.odin => sha256_impl_hw_gen.odin} | 8 +++----- core/crypto/sha2/sha512_impl_hw_gen.odin | 12 +++++++++++ 3 files changed, 32 insertions(+), 8 deletions(-) rename core/crypto/sha2/{sha2_impl_hw_gen.odin => sha256_impl_hw_gen.odin} (68%) create mode 100644 core/crypto/sha2/sha512_impl_hw_gen.odin diff --git a/core/crypto/sha2/sha2.odin b/core/crypto/sha2/sha2.odin index dc41462e4..a878e1c2a 100644 --- a/core/crypto/sha2/sha2.odin +++ b/core/crypto/sha2/sha2.odin @@ -44,7 +44,8 @@ Context_256 :: struct { length: u64, md_bits: int, - is_initialized: bool, + is_hw_accelerated: bool, + is_initialized: bool, } // Context_512 is a SHA-384, SHA-512 or SHA-512/256 instance. @@ -55,7 +56,8 @@ Context_512 :: struct { length: u64, md_bits: int, - is_initialized: bool, + is_hw_accelerated: bool, + is_initialized: bool, } // init_224 initializes a Context_256 for SHA-224. @@ -88,6 +90,9 @@ init_512_256 :: proc(ctx: ^Context_512) { _init(ctx) } +@(private) +ERR_HW_NOT_SUPPORTED :: "crypto/sha2: hardware implementation unsupported" + @(private) _init :: proc(ctx: ^$T) { when T == Context_256 { @@ -113,6 +118,8 @@ _init :: proc(ctx: ^$T) { case: panic("crypto/sha2: invalid digest output length") } + + ctx.is_hw_accelerated = is_hardware_accelerated_256() } else when T == Context_512 { switch ctx.md_bits { case 256: @@ -148,6 +155,8 @@ _init :: proc(ctx: ^$T) { case: panic("crypto/sha2: invalid digest output length") } + + ctx.is_hw_accelerated = is_hardware_accelerated_512() } ctx.length = 0 @@ -399,7 +408,7 @@ SHA512_F4 :: #force_inline proc "contextless" (x: u64) -> u64 { @(private) sha2_transf :: proc "contextless" (ctx: ^$T, data: []byte) #no_bounds_check { when T == Context_256 { - if is_hardware_accelerated_256() { + if ctx.is_hw_accelerated { sha256_transf_hw(ctx, data) return } @@ -410,6 +419,11 @@ sha2_transf :: proc "contextless" (ctx: ^$T, data: []byte) #no_bounds_check { CURR_BLOCK_SIZE :: BLOCK_SIZE_256 } else when T == Context_512 { + if ctx.is_hw_accelerated { + sha512_transf_hw(ctx, data) + return + } + w: [SHA512_ROUNDS]u64 wv: [8]u64 t1, t2: u64 diff --git a/core/crypto/sha2/sha2_impl_hw_gen.odin b/core/crypto/sha2/sha256_impl_hw_gen.odin similarity index 68% rename from core/crypto/sha2/sha2_impl_hw_gen.odin rename to core/crypto/sha2/sha256_impl_hw_gen.odin index d735e3c61..ad384caaa 100644 --- a/core/crypto/sha2/sha2_impl_hw_gen.odin +++ b/core/crypto/sha2/sha256_impl_hw_gen.odin @@ -3,15 +3,13 @@ #+build !arm32 package sha2 -@(private = "file") -ERR_HW_NOT_SUPPORTED :: "crypto/sha2: hardware implementation unsupported" - -// is_hardware_accelerated_256 returns true if and only if (⟺) hardware accelerated -// SHA-224/SHA-256 is supported. +// is_hardware_accelerated_256 returns true if and only if (⟺) hardware +// accelerated SHA-224/SHA-256 is supported. is_hardware_accelerated_256 :: proc "contextless" () -> bool { return false } +@(private) sha256_transf_hw :: proc "contextless" (ctx: ^Context_256, data: []byte) { panic_contextless(ERR_HW_NOT_SUPPORTED) } diff --git a/core/crypto/sha2/sha512_impl_hw_gen.odin b/core/crypto/sha2/sha512_impl_hw_gen.odin new file mode 100644 index 000000000..5fd518d80 --- /dev/null +++ b/core/crypto/sha2/sha512_impl_hw_gen.odin @@ -0,0 +1,12 @@ +package sha2 + +// is_hardware_accelerated_512 returns true if and only if (⟺) hardware +// accelerated SHA-384/SHA-512/SHA-512/256 are supported. +is_hardware_accelerated_512 :: proc "contextless" () -> bool { + return false +} + +@(private) +sha512_transf_hw :: proc "contextless" (ctx: ^Context_512, data: []byte) { + panic_contextless(ERR_HW_NOT_SUPPORTED) +} From e87564b20580594da568008db754cbc467595fd0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 12:21:41 +0000 Subject: [PATCH 725/766] Support `for in` for FCD arrays --- src/check_stmt.cpp | 6 ++++++ src/llvm_backend_stmt.cpp | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index bfa68ca78..5e5c0e3f4 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1846,6 +1846,12 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) array_add(&vals, t_int); break; + case Type_FixedCapacityDynamicArray: + is_possibly_addressable = operand.mode == Addressing_Variable || is_ptr; + array_add(&vals, t->FixedCapacityDynamicArray.elem); + array_add(&vals, t_int); + break; + case Type_DynamicArray: is_possibly_addressable = true; array_add(&vals, t->DynamicArray.elem); diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index f1b7175be..cb2123fe1 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -486,6 +486,14 @@ gb_internal void lb_build_range_indexed(lbProcedure *p, lbValue expr, Type *val_ } break; } + case Type_FixedCapacityDynamicArray: { + if (val_type != nullptr) { + lbValue data = lb_emit_struct_ep(p, expr, 0); + val = lb_emit_load(p, lb_emit_array_ep(p, data, idx)); + } + break; + } + case Type_Slice: { if (val_type != nullptr) { lbValue elem = lb_slice_elem(p, expr); @@ -1365,6 +1373,15 @@ gb_internal void lb_build_range_stmt(lbProcedure *p, AstRangeStmt *rs, Scope *sc lb_build_range_indexed(p, array, val0_type, count_ptr.addr, &val, &key, &loop, &done, rs->reverse); break; } + case Type_FixedCapacityDynamicArray: { + lbValue array = lb_build_addr_ptr(p, expr); + if (is_type_pointer(type_deref(array.type))) { + array = lb_emit_load(p, array); + } + lbValue count_ptr = lb_emit_struct_ep(p, array, 1); + lb_build_range_indexed(p, array, val0_type, count_ptr, &val, &key, &loop, &done, rs->reverse); + break; + } case Type_DynamicArray: { lbValue count_ptr = {}; lbValue array = lb_build_addr_ptr(p, expr); From 93852df29ec837efd5834a907e99567a0f1d38e7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 12:28:18 +0000 Subject: [PATCH 726/766] Support `#unroll(N) for` for FCD arrays --- src/check_stmt.cpp | 17 +++++++++++++++-- src/llvm_backend_stmt.cpp | 13 +++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 5e5c0e3f4..857ec1492 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1018,15 +1018,28 @@ gb_internal void check_unroll_range_stmt(CheckerContext *ctx, Ast *node, u32 mod inline_for_depth = exact_value_i64(unroll_count); } break; + case Type_FixedCapacityDynamicArray: + if (unroll_count > 0) { + val0 = t->FixedCapacityDynamicArray.elem; + val1 = t_int; + inline_for_depth = exact_value_i64(unroll_count); + } + break; } } if (val0 == nullptr) { + ERROR_BLOCK(); gbString s = expr_to_string(operand.expr); gbString t = type_to_string(operand.type); + defer (gb_string_free(s)); + defer (gb_string_free(t)); error(operand.expr, "Cannot iterate over '%s' of type '%s' in an '#unroll for' statement", s, t); - gb_string_free(t); - gb_string_free(s); + + if (is_type_slice(operand.type) || is_type_dynamic_array(operand.type) || is_type_fixed_capacity_dynamic_array(operand.type)) { + error_line("\tSuggestion: An unroll count `#unroll(N)` must be specified with an array of a runtime-known length\n"); + } + } else if (operand.mode != Addressing_Constant && ( unroll_count <= 0 && compare_exact_values(Token_CmpEq, inline_for_depth, exact_value_i64(0)))) { diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index cb2123fe1..9f8c40e55 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1706,6 +1706,19 @@ gb_internal void lb_build_unroll_range_stmt(lbProcedure *p, AstUnrollRangeStmt * break; } + case Type_FixedCapacityDynamicArray: { + lbValue array = lb_build_expr(p, expr); + if (!is_type_pointer(array.type)) { + array = lb_address_from_load_or_generate_local(p, array); + } + GB_ASSERT(is_type_pointer(array.type)); + + count_ptr = lb_emit_struct_ep(p, array, 1); + + data_ptr = lb_emit_conv(p, array, alloc_type_pointer(t->FixedCapacityDynamicArray.elem)); + break; + } + case Type_Array: { lbValue array = lb_build_expr(p, expr); count_ptr = lb_add_local_generated(p, t_int, false).addr; From 0bf2d01a0444e994dad27915425d7832f312ec6f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 14:06:23 +0000 Subject: [PATCH 727/766] Work on improving bounds checking with constant known indices and `lb_add_local_generated` --- src/llvm_backend_expr.cpp | 21 ++++++++++++++- src/llvm_backend_general.cpp | 50 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 1efc8f411..c71409a8e 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2898,10 +2898,13 @@ gb_internal lbValue lb_emit_c_vararg(lbProcedure *p, lbValue arg, Type *type) { gb_internal lbValue lb_compare_records(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue right, Type *type) { GB_ASSERT((is_type_struct(type) || is_type_soa_pointer(type) || is_type_union(type)) && is_type_comparable(type)); + lbValue left_ptr = lb_address_from_load_or_generate_local(p, left); lbValue right_ptr = lb_address_from_load_or_generate_local(p, right); + i64 size = type_size_of(type); + lbValue res = {}; - if (type_size_of(type) == 0) { + if (size == 0) { switch (op_kind) { case Token_CmpEq: return lb_const_bool(p->module, t_bool, true); @@ -2910,8 +2913,23 @@ gb_internal lbValue lb_compare_records(lbProcedure *p, TokenKind op_kind, lbValu } GB_PANIC("invalid operator"); } + TEMPORARY_ALLOCATOR_GUARD(); + if (is_type_simple_compare(type)) { + // if (size <= 8) { + // LLVMTypeRef int_type = LLVMIntTypeInContext(p->module->ctx, cast(unsigned)(size*8)); + // LLVMValueRef l = OdinLLVMBuildLoad(p, int_type, LLVMBuildPointerCast(p->builder, left_ptr.value, LLVMPointerType(int_type, 0), "")); + // LLVMValueRef r = OdinLLVMBuildLoad(p, int_type, LLVMBuildPointerCast(p->builder, right_ptr.value, LLVMPointerType(int_type, 0), "")); + + // LLVMIntPredicate pred = (op_kind == Token_CmpEq) ? LLVMIntEQ : LLVMIntNE; + // LLVMValueRef cmp = LLVMBuildICmp(p->builder, pred, l, r, ""); + + // res.value = cmp; + // res.type = t_bool; + // return res; + // } + // TODO(bill): Test to see if this is actually faster!!!! auto args = array_make(temporary_allocator(), 3); args[0] = lb_emit_conv(p, left_ptr, t_rawptr); @@ -2925,6 +2943,7 @@ gb_internal lbValue lb_compare_records(lbProcedure *p, TokenKind op_kind, lbValu args[1] = lb_emit_conv(p, right_ptr, t_rawptr); res = lb_emit_call(p, value, args); } + if (op_kind == Token_NotEq) { res = lb_emit_unary_arith(p, Token_Not, res, res.type); } diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index dc647c1ab..9205e7325 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -709,6 +709,33 @@ gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index return; } + if (LLVMIsConstant(index.value) && LLVMIsConstant(len.value)) { + i64 i = LLVMConstIntGetSExtValue(index.value); + i64 n = LLVMConstIntGetSExtValue(len.value); + if (0<= i && i < n) { + return; + } + } + + if (LLVMIsAInstruction(index.value)) { + LLVMOpcode op = LLVMGetInstructionOpcode(index.value); + if (op == LLVMURem) { + LLVMValueRef divisor = LLVMGetOperand(index.value, 1); + if (divisor == len.value) { + return; + } + } else if (op == LLVMAnd) { + LLVMValueRef mask = LLVMGetOperand(index.value, 1); + if (LLVMIsConstant(mask) && LLVMIsConstant(len.value)) { + i64 m = LLVMConstIntGetSExtValue(mask); + i64 l = LLVMConstIntGetSExtValue(len.value); + if (l > 0 && (l & (l-1)) == 0 && m == l-1) { + return; + } + } + } + } + TEMPORARY_ALLOCATOR_GUARD(); index = lb_emit_conv(p, index, t_int); @@ -3567,7 +3594,30 @@ gb_internal lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e, bool zero } gb_internal lbAddr lb_add_local_generated(lbProcedure *p, Type *type, bool zero_init) { +#if 0 return lb_add_local(p, type, nullptr, zero_init); +#else + LLVMTypeRef llvm_type = lb_type(p->module, type); + + unsigned alignment = cast(unsigned)gb_max(type_align_of(type), lb_alignof(llvm_type)); + if (is_type_matrix(type)) { + alignment *= 2; // NOTE(bill): Just in case + } + + // This positions in the entry block, emits alloca, then restores position. + LLVMValueRef ptr = llvm_alloca(p, llvm_type, alignment, ""); + + if (zero_init) { + // Emit the zero-init store at the current position (not entry block) + // so it respects control flow. But the alloca itself is in entry. + lb_mem_zero_ptr(p, ptr, type, alignment); + } + + lbValue val = {}; + val.value = ptr; + val.type = alloc_type_pointer(type); + return lb_addr(val); +#endif } gb_internal lbAddr lb_add_local_generated_temp(lbProcedure *p, Type *type, i64 min_alignment) { From fc41e44140ebf5a5364812c27c8ec1b76bd5f5d1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 14:29:44 +0000 Subject: [PATCH 728/766] Improve bounds checking to minimize its need --- src/llvm_backend.hpp | 5 +++++ src/llvm_backend_general.cpp | 41 ++++++++++++++++++++++++++---------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 7b7d5cc31..e4297300f 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -648,6 +648,11 @@ gb_internal LLVMTypeRef llvm_array_type(LLVMTypeRef ElementType, uint64_t Elemen #endif } +gb_internal lbValue lb_emit_struct_iv(lbProcedure *p, lbValue agg, lbValue field, i32 index); +gb_internal lbValue lb_build_struct_value(lbProcedure *p, Type *type, lbValue *fields, isize count); +gb_internal lbValue lb_make_slice_value(lbProcedure *p, Type *slice_type, lbValue elem, lbValue len); +gb_internal lbValue lb_make_string_value(lbProcedure *p, Type *string_type, lbValue elem, lbValue len); + gb_internal String lb_internal_gen_name_from_type(char const *prefix, Type *type); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 9205e7325..6694f1a75 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -701,19 +701,19 @@ gb_internal void lb_set_file_line_col(lbProcedure *p, Array arr, TokenP arr[2] = lb_const_int(p->module, t_i32, col); } -gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index, lbValue len) { +gb_internal bool lb_bounds_check_short_circuit(lbProcedure *p, lbValue index, lbValue len) { if (build_context.no_bounds_check) { - return; + return true; } if ((p->state_flags & StateFlag_no_bounds_check) != 0) { - return; + return true; } if (LLVMIsConstant(index.value) && LLVMIsConstant(len.value)) { i64 i = LLVMConstIntGetSExtValue(index.value); i64 n = LLVMConstIntGetSExtValue(len.value); - if (0<= i && i < n) { - return; + if (0 <= i && i < n) { + return true; } } @@ -722,7 +722,7 @@ gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index if (op == LLVMURem) { LLVMValueRef divisor = LLVMGetOperand(index.value, 1); if (divisor == len.value) { - return; + return true; } } else if (op == LLVMAnd) { LLVMValueRef mask = LLVMGetOperand(index.value, 1); @@ -730,11 +730,18 @@ gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index i64 m = LLVMConstIntGetSExtValue(mask); i64 l = LLVMConstIntGetSExtValue(len.value); if (l > 0 && (l & (l-1)) == 0 && m == l-1) { - return; + return true; } } } } + return false; +} + +gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index, lbValue len) { + if (lb_bounds_check_short_circuit(p, index, len)) { + return; + } TEMPORARY_ALLOCATOR_GUARD(); @@ -783,6 +790,15 @@ gb_internal void lb_emit_multi_pointer_slice_bounds_check(lbProcedure *p, Token return; } + if (LLVMIsConstant(low.value) && LLVMIsConstant(high.value)) { + i64 i = LLVMConstIntGetSExtValue(low.value); + i64 n = LLVMConstIntGetSExtValue(high.value); + if (i < n) { + return; + } + } + + low = lb_emit_conv(p, low, t_int); high = lb_emit_conv(p, high, t_int); @@ -795,12 +811,15 @@ gb_internal void lb_emit_multi_pointer_slice_bounds_check(lbProcedure *p, Token } gb_internal void lb_emit_slice_bounds_check(lbProcedure *p, Token token, lbValue low, lbValue high, lbValue len, bool lower_value_used) { - if (build_context.no_bounds_check) { - return; - } - if ((p->state_flags & StateFlag_no_bounds_check) != 0) { + if (!lower_value_used && lb_bounds_check_short_circuit(p, high, len)) { return; } + // if (lower_value_used && + // lb_bounds_check_short_circuit(p, low, high) && + // lb_bounds_check_short_circuit(p, low, len) && + // lb_bounds_check_short_circuit(p, high, len)) { + // return; + // } high = lb_emit_conv(p, high, t_int); From ef36a18323370a0c14d79f4e8267bc56c94ca681 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 14:52:07 +0000 Subject: [PATCH 729/766] Enable some RVO by default --- src/llvm_backend_stmt.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 9f8c40e55..a93d3305e 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1,4 +1,5 @@ -#define LB_ENABLE_RVO build_context.enable_rvo +#define LB_ENABLE_BASIC_RVO true +#define LB_ENABLE_ADVANCED_RVO build_context.enable_rvo // NOTE(bill): @RVO Check if a call expression returns by sret with a return type matching dst_type. // Returns the callee's function type if eligible for copy elision, nullptr otherwise. @@ -2593,7 +2594,7 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return if (return_count == 1) { Entity *e = tuple->variables[0]; - if (LB_ENABLE_RVO && res_count == 1 && return_by_pointer) { + if (LB_ENABLE_BASIC_RVO && res_count == 1 && return_by_pointer) { Ast *ret_expr = unparen_expr(return_results[0]); // NOTE(bill): @RVO for `return call()` in a procedure which uses `sret` and has no defers @@ -3058,7 +3059,7 @@ gb_internal void lb_build_assign_stmt_array(lbProcedure *p, TokenKind op, lbAddr } gb_internal void lb_build_assign_stmt(lbProcedure *p, AstAssignStmt *as) { if (as->op.kind == Token_Eq) { - if (LB_ENABLE_RVO) { + if (LB_ENABLE_ADVANCED_RVO) { // @RVO for single assignments `x = call()` if (as->lhs.count == 1 && as->rhs.count == 1 && !is_blank_ident(as->lhs[0])) { Ast *rhs_expr = unparen_expr(as->rhs[0]); @@ -3260,7 +3261,7 @@ gb_internal void lb_build_stmt(lbProcedure *p, Ast *node) { } } } else { - if (LB_ENABLE_RVO) { + if (LB_ENABLE_ADVANCED_RVO) { // @RVO: for `x := call()` if (vd->names.count == 1 && values.count == 1 && !is_blank_ident(vd->names[0])) { Ast *rhs_expr = unparen_expr(values[0]); From 3dc68c2e089135a95928d7d2b6f8698cff3938f3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 15:50:13 +0000 Subject: [PATCH 730/766] In `PtrSet` `permanent_allocator` instead of `heap_allocator` --- src/ptr_set.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ptr_set.cpp b/src/ptr_set.cpp index 5b1d2cc19..21151c0aa 100644 --- a/src/ptr_set.cpp +++ b/src/ptr_set.cpp @@ -19,7 +19,8 @@ template gb_internal void ptr_set_clear (PtrSet *s); #define FOR_PTR_SET(element, set_) for (auto *it = &(set_).keys[0], element = it ? *it : nullptr; (set_).keys != nullptr && it < &(set_).keys[(set_).capacity]; it++) if (element = *it, (*it != nullptr && *it != cast(void *)~(uintptr)(0ull))) gb_internal gbAllocator ptr_set_allocator(void) { - return heap_allocator(); + // return heap_allocator(); + return permanent_allocator(); } template From 1744f57d011f7db8f8a6aced35a4bc8940fe9010 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 16:03:27 +0000 Subject: [PATCH 731/766] Use `permanent_alloc_item` directly rather than through the `gb_alloc_item` generic interface --- src/check_builtin.cpp | 11 +++++------ src/check_expr.cpp | 8 ++++---- src/check_type.cpp | 4 ++-- src/checker.cpp | 17 ++++++++--------- src/entity.cpp | 7 +++---- src/exact_value.cpp | 8 ++++---- src/llvm_abi.cpp | 16 ++++++++-------- src/llvm_backend.cpp | 6 +++--- src/llvm_backend_general.cpp | 12 ++++++------ src/llvm_backend_proc.cpp | 4 ++-- src/llvm_backend_stmt.cpp | 2 +- src/main.cpp | 6 +++--- src/parser.cpp | 14 +++++++------- src/queue.cpp | 2 +- src/types.cpp | 8 +++----- 15 files changed, 60 insertions(+), 65 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 861d72fcb..ea3ca8d3a 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1707,7 +1707,7 @@ gb_internal bool cache_load_file_directive(CheckerContext *c, Ast *call, String } defer ({ if (cache == nullptr) { - LoadFileCache *new_cache = gb_alloc_item(permanent_allocator(), LoadFileCache); + LoadFileCache *new_cache = permanent_alloc_item(); new_cache->path = path; new_cache->data = data; new_cache->file_error = file_error; @@ -1745,7 +1745,7 @@ gb_internal bool cache_load_file_directive(CheckerContext *c, Ast *call, String case LoadFileTier_Contents: { isize file_size = cast(isize)gb_file_size(&f); if (file_size > 0) { - u8 *ptr = cast(u8 *)gb_alloc(permanent_allocator(), file_size+1); + u8 *ptr = permanent_alloc_array(file_size+1); gb_file_read_at(&f, ptr, file_size, 0); ptr[file_size] = '\0'; data.text = ptr; @@ -1950,7 +1950,7 @@ gb_internal LoadDirectiveResult check_load_directory_directive(CheckerContext *c } defer ({ if (cache == nullptr) { - LoadDirectoryCache *new_cache = gb_alloc_item(permanent_allocator(), LoadDirectoryCache); + LoadDirectoryCache *new_cache = permanent_alloc_item(); new_cache->path = path; new_cache->files = file_caches; new_cache->file_error = file_error; @@ -3605,18 +3605,17 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As gb_string_free(type_str); return false; } - gbAllocator a = permanent_allocator(); Type *tuple = alloc_type_tuple(); if (is_type_struct(type)) { isize variable_count = type->Struct.fields.count; - slice_init(&tuple->Tuple.variables, a, variable_count); + tuple->Tuple.variables = permanent_slice_make(variable_count); // NOTE(bill): don't copy the entities, this should be good enough gb_memmove_array(tuple->Tuple.variables.data, type->Struct.fields.data, variable_count); } else if (is_type_array(type)) { isize variable_count = cast(isize)type->Array.count; - slice_init(&tuple->Tuple.variables, a, variable_count); + tuple->Tuple.variables = permanent_slice_make(variable_count); for (isize i = 0; i < variable_count; i++) { tuple->Tuple.variables[i] = alloc_entity_array_elem(nullptr, blank_token, type->Array.elem, cast(i32)i); } diff --git a/src/check_expr.cpp b/src/check_expr.cpp index e66498b6d..3b29d5f94 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -499,7 +499,7 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E rw_mutex_shared_unlock(&gen_procs->mutex); // @local-mutex } else { - gen_procs = gb_alloc_item(permanent_allocator(), GenProcsData); + gen_procs = permanent_alloc_item(); gen_procs->procs.allocator = heap_allocator(); base_entity->Procedure.gen_procs = gen_procs; mutex_unlock(&base_entity->Procedure.gen_procs_mutex); // @entity-mutex @@ -536,7 +536,7 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E DeclInfo *decl = other->decl_info; if (decl->proc_checked_state != ProcCheckedState_Checked) { - ProcInfo *proc_info = gb_alloc_item(permanent_allocator(), ProcInfo); + ProcInfo *proc_info = permanent_alloc_item(); proc_info->file = other->file; proc_info->token = other->token; proc_info->decl = decl; @@ -630,7 +630,7 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E array_add(&gen_procs->procs, entity); rw_mutex_unlock(&gen_procs->mutex); // @local-mutex - ProcInfo *proc_info = gb_alloc_item(permanent_allocator(), ProcInfo); + ProcInfo *proc_info = permanent_alloc_item(); proc_info->file = file; proc_info->token = token; proc_info->decl = d; @@ -7696,7 +7696,7 @@ gb_internal CallArgumentData check_call_arguments(CheckerContext *c, Operand *op } named_args = slice(ce->args, positional_args.count, ce->args.count); - auto split_args = gb_alloc_item(permanent_allocator(), AstSplitArgs); + auto split_args = permanent_alloc_item(); split_args->positional = positional_args; split_args->named = named_args; ce->split_args = split_args; diff --git a/src/check_type.cpp b/src/check_type.cpp index d8fd8d079..f780f82b0 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -272,7 +272,7 @@ gb_internal GenTypesData *ensure_polymorphic_record_entity_has_gen_types(Checker GB_ASSERT(original_type->kind == Type_Named); mutex_lock(&original_type->Named.gen_types_data_mutex); if (original_type->Named.gen_types_data == nullptr) { - GenTypesData *gen_types = gb_alloc_item(permanent_allocator(), GenTypesData); + GenTypesData *gen_types = permanent_alloc_item(); gen_types->types = array_make(heap_allocator()); original_type->Named.gen_types_data = gen_types; } @@ -3303,7 +3303,7 @@ gb_internal Type *make_soa_struct_internal(CheckerContext *ctx, Ast *array_typ_e add_type_info_type(ctx, soa_struct); wait_signal_set(&soa_struct->Struct.fields_wait_signal); } else { - SoaTypeWorkerData *wd = gb_alloc_item(permanent_allocator(), SoaTypeWorkerData); + SoaTypeWorkerData *wd = permanent_alloc_item(); wd->ctx = *ctx; wd->type = soa_struct; wd->wait_to_finish = true; diff --git a/src/checker.cpp b/src/checker.cpp index 720556a4f..5677b39b9 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -123,7 +123,7 @@ gb_internal void import_graph_node_set_add(ImportGraphNodeSet *s, ImportGraphNod // } gb_internal ImportGraphNode *import_graph_node_create(gbAllocator a, AstPackage *pkg) { - ImportGraphNode *n = gb_alloc_item(a, ImportGraphNode); + ImportGraphNode *n = permanent_alloc_item(); n->pkg = pkg; n->scope = pkg->scope; return n; @@ -163,7 +163,6 @@ gb_internal void import_graph_node_swap(ImportGraphNode **data, isize i, isize j gb_internal void init_decl_info(DeclInfo *d, Scope *scope, DeclInfo *parent) { - gb_zero_item(d); if (parent) { mutex_lock(&parent->next_mutex); d->next_sibling = parent->next_child; @@ -181,7 +180,7 @@ gb_internal void init_decl_info(DeclInfo *d, Scope *scope, DeclInfo *parent) { } gb_internal DeclInfo *make_decl_info(Scope *scope, DeclInfo *parent) { - DeclInfo *d = gb_alloc_item(permanent_allocator(), DeclInfo); + DeclInfo *d = permanent_alloc_item(); init_decl_info(d, scope, parent); return d; } @@ -214,7 +213,7 @@ gb_internal DeclInfo *make_decl_info(Scope *scope, DeclInfo *parent) { gb_internal Scope *create_scope(CheckerInfo *info, Scope *parent) { - Scope *s = gb_alloc_item(permanent_allocator(), Scope); + Scope *s = permanent_alloc_item(); s->parent = parent; if (parent != nullptr && parent != builtin_pkg->scope) { @@ -1018,7 +1017,7 @@ gb_internal void add_global_type_entity(String name, Type *type) { gb_internal AstPackage *create_builtin_package(char const *name) { gbAllocator a = permanent_allocator(); - AstPackage *pkg = gb_alloc_item(a, AstPackage); + AstPackage *pkg = permanent_alloc_item(); pkg->name = make_string_c(name); pkg->kind = Package_Builtin; @@ -2412,7 +2411,7 @@ gb_internal void check_procedure_later(Checker *c, ProcInfo *info) { } gb_internal void check_procedure_later(Checker *c, AstFile *file, Token token, DeclInfo *decl, Type *type, Ast *body, u64 tags) { - ProcInfo *info = gb_alloc_item(permanent_allocator(), ProcInfo); + ProcInfo *info = permanent_alloc_item(); info->file = file; info->token = token; info->decl = decl; @@ -3259,7 +3258,7 @@ gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String } gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator) { - auto *tp = gb_alloc_item(allocator, CheckerTypePath); + auto *tp = gb_alloc_item(heap_allocator(), CheckerTypePath); array_init(tp, allocator, 0, 16); return tp; } @@ -5016,7 +5015,7 @@ gb_internal void check_collect_entities(CheckerContext *c, Slice const &n } gb_internal CheckerContext *create_checker_context(Checker *c) { - CheckerContext *ctx = gb_alloc_item(permanent_allocator(), CheckerContext); + CheckerContext *ctx = permanent_alloc_item(); init_checker_context(ctx, c); return ctx; } @@ -6228,7 +6227,7 @@ gb_internal void check_procedure_later_from_entity(Checker *c, Entity *e, char c GB_ASSERT(e->decl_info != nullptr); - ProcInfo *pi = gb_alloc_item(permanent_allocator(), ProcInfo); + ProcInfo *pi = permanent_alloc_item(); pi->file = e->file; pi->token = e->token; pi->decl = e->decl_info; diff --git a/src/entity.cpp b/src/entity.cpp index 070b05462..1a01e0945 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -151,8 +151,8 @@ struct TypeNameObjCMetadata { }; gb_internal TypeNameObjCMetadata *create_type_name_obj_c_metadata() { - TypeNameObjCMetadata *md = gb_alloc_item(permanent_allocator(), TypeNameObjCMetadata); - md->mutex = gb_alloc_item(permanent_allocator(), BlockingMutex); + TypeNameObjCMetadata *md = permanent_alloc_item(); + md->mutex = permanent_alloc_item(); array_init(&md->type_entries, heap_allocator()); array_init(&md->value_entries, heap_allocator()); return md; @@ -345,8 +345,7 @@ gb_internal bool entity_has_deferred_procedure(Entity *e) { gb_global std::atomic global_entity_id; gb_internal Entity *alloc_entity(EntityKind kind, Scope *scope, Token token, Type *type) { - gbAllocator a = permanent_allocator(); - Entity *entity = gb_alloc_item(a, Entity); + Entity *entity = permanent_alloc_item(); entity->kind = kind; entity->state = EntityState_Unresolved; entity->scope = scope; diff --git a/src/exact_value.cpp b/src/exact_value.cpp index fa99ed3fe..525b8cb91 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -146,7 +146,7 @@ gb_internal ExactValue exact_value_float(f64 f) { gb_internal ExactValue exact_value_complex(f64 real, f64 imag) { ExactValue result = {ExactValue_Complex}; - result.value_complex = gb_alloc_item(permanent_allocator(), Complex128); + result.value_complex = permanent_alloc_item(); result.value_complex->real = real; result.value_complex->imag = imag; return result; @@ -154,7 +154,7 @@ gb_internal ExactValue exact_value_complex(f64 real, f64 imag) { gb_internal ExactValue exact_value_quaternion(f64 real, f64 imag, f64 jmag, f64 kmag) { ExactValue result = {ExactValue_Quaternion}; - result.value_quaternion = gb_alloc_item(permanent_allocator(), Quaternion256); + result.value_quaternion = permanent_alloc_item(); result.value_quaternion->real = real; result.value_quaternion->imag = imag; result.value_quaternion->jmag = jmag; @@ -438,7 +438,7 @@ gb_internal ExactValue exact_value_to_complex(ExactValue v) { // return exact_value_complex(v.value_quaternion.real, v.value_quaternion.imag); } ExactValue r = {ExactValue_Invalid}; - v.value_complex = gb_alloc_item(permanent_allocator(), Complex128); + v.value_complex = permanent_alloc_item(); return r; } gb_internal ExactValue exact_value_to_quaternion(ExactValue v) { @@ -453,7 +453,7 @@ gb_internal ExactValue exact_value_to_quaternion(ExactValue v) { return v; } ExactValue r = {ExactValue_Invalid}; - v.value_quaternion = gb_alloc_item(permanent_allocator(), Quaternion256); + v.value_quaternion = permanent_alloc_item(); return r; } diff --git a/src/llvm_abi.cpp b/src/llvm_abi.cpp index ec7c63b1a..6aabe456f 100644 --- a/src/llvm_abi.cpp +++ b/src/llvm_abi.cpp @@ -389,7 +389,7 @@ namespace lbAbi386 { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->args = compute_arg_types(c, arg_types, arg_count); ft->ret = compute_return_type(ft, c, return_type, return_is_defined, return_is_tuple); @@ -471,7 +471,7 @@ namespace lbAbiAmd64Win64 { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->args = compute_arg_types(c, arg_types, arg_count); ft->ret = compute_return_type(ft, c, return_type, return_is_defined, return_is_tuple); @@ -617,7 +617,7 @@ namespace lbAbiAmd64SysV { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->calling_convention = calling_convention; @@ -1128,7 +1128,7 @@ namespace lbAbiArm64 { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->args = compute_arg_types(c, arg_types, arg_count); ft->ret = compute_return_type(ft, c, return_type, return_is_defined, return_is_tuple); @@ -1349,7 +1349,7 @@ namespace lbAbiWasm { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->calling_convention = calling_convention; ft->args = compute_arg_types(c, arg_types, arg_count, calling_convention, original_type); @@ -1558,7 +1558,7 @@ namespace lbAbiArm32 { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->args = compute_arg_types(c, arg_types, arg_count, calling_convention); ft->ret = compute_return_type(c, return_type, return_is_defined); @@ -1867,7 +1867,7 @@ namespace lbAbiRiscv64 { } gb_internal LB_ABI_INFO(abi_info) { - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = m->ctx; ft->calling_convention = calling_convention; @@ -1889,7 +1889,7 @@ gb_internal LB_ABI_INFO(lb_get_abi_info_internal) { case ProcCC_None: case ProcCC_InlineAsm: { - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->args = array_make(lb_function_type_args_allocator(), arg_count); for (unsigned i = 0; i < arg_count; i++) { diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 929b056a3..fac3e3354 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2647,7 +2647,7 @@ gb_internal void lb_llvm_module_passes_and_verification(lbGenerator *gen, bool d if (do_threading) { for (auto const &entry : gen->modules) { lbModule *m = entry.value; - auto wd = gb_alloc_item(permanent_allocator(), lbLLVMModulePassWorkerData); + auto wd = permanent_alloc_item(); wd->m = m; wd->target_machine = m->target_machine; wd->do_threading = true; @@ -2658,7 +2658,7 @@ gb_internal void lb_llvm_module_passes_and_verification(lbGenerator *gen, bool d } else { for (auto const &entry : gen->modules) { lbModule *m = entry.value; - auto wd = gb_alloc_item(permanent_allocator(), lbLLVMModulePassWorkerData); + auto wd = permanent_alloc_item(); wd->m = m; wd->target_machine = m->target_machine; wd->do_threading = false; @@ -2778,7 +2778,7 @@ gb_internal bool lb_llvm_object_generation(lbGenerator *gen, bool do_threading) array_add(&gen->output_object_paths, filepath_obj); array_add(&gen->output_temp_paths, filepath_ll); - auto *wd = gb_alloc_item(permanent_allocator(), lbLLVMEmitWorker); + auto *wd = permanent_alloc_item(); wd->target_machine = m->target_machine; wd->code_gen_file_type = code_gen_file_type; wd->filepath_obj = filepath_obj; diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 6694f1a75..35a0f5f65 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -166,7 +166,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { bool module_per_file = build_context.module_per_file && (build_context.optimization_level <= 0 || build_context.lto_kind != LTO_None); for (auto const &entry : gen->info->packages) { AstPackage *pkg = entry.value; - auto m = gb_alloc_item(permanent_allocator(), lbModule); + auto m = permanent_alloc_item(); m->pkg = pkg; m->gen = gen; m->checker = c; @@ -174,7 +174,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { lb_init_module(m, do_threading); if (LLVM_WEAK_MONOMORPHIZATION) { - auto pm = gb_alloc_item(permanent_allocator(), lbModule); + auto pm = permanent_alloc_item(); pm->pkg = pkg; pm->gen = gen; pm->checker = c; @@ -216,7 +216,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { } // NOTE(bill): Probably per file is not a good idea, so leave this for later for (AstFile *file : pkg->files) { - auto m = gb_alloc_item(permanent_allocator(), lbModule); + auto m = permanent_alloc_item(); m->file = file; m->pkg = pkg; m->gen = gen; @@ -226,7 +226,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { if (LLVM_WEAK_MONOMORPHIZATION) { - auto pm = gb_alloc_item(permanent_allocator(), lbModule); + auto pm = permanent_alloc_item(); pm->file = file; pm->pkg = pkg; pm->gen = gen; @@ -242,7 +242,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { } if (LLVM_WEAK_MONOMORPHIZATION) { - lbModule *m = gb_alloc_item(permanent_allocator(), lbModule); + lbModule *m = permanent_alloc_item(); gen->equal_module = m; m->gen = gen; m->checker = c; @@ -2728,7 +2728,7 @@ gb_internal void lb_add_edge(lbBlock *from, lbBlock *to) { gb_internal lbBlock *lb_create_block(lbProcedure *p, char const *name, bool append) { - lbBlock *b = gb_alloc_item(permanent_allocator(), lbBlock); + lbBlock *b = permanent_alloc_item(); b->block = LLVMCreateBasicBlockInContext(p->module->ctx, name); b->appended = false; if (append) { diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 88165f4d2..121b8c550 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -99,7 +99,7 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i } } - lbProcedure *p = gb_alloc_item(permanent_allocator(), lbProcedure); + lbProcedure *p = permanent_alloc_item(); p->module = m; entity->code_gen_module = m; @@ -395,7 +395,7 @@ gb_internal lbProcedure *lb_create_dummy_procedure(lbModule *m, String link_name GB_ASSERT_MSG(found == nullptr, "failed to create dummy procedure for: %.*s", LIT(link_name)); } - lbProcedure *p = gb_alloc_item(permanent_allocator(), lbProcedure); + lbProcedure *p = permanent_alloc_item(); p->module = m; p->name = link_name; diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index a93d3305e..fe09b26c8 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -260,7 +260,7 @@ gb_internal lbBranchBlocks lb_lookup_branch_blocks(lbProcedure *p, Ast *ident) { } gb_internal lbTargetList *lb_push_target_list(lbProcedure *p, Ast *label, lbBlock *break_, lbBlock *continue_, lbBlock *fallthrough_) { - lbTargetList *tl = gb_alloc_item(permanent_allocator(), lbTargetList); + lbTargetList *tl = permanent_alloc_item(); tl->prev = p->target_list; tl->break_ = break_; tl->continue_ = continue_; diff --git a/src/main.cpp b/src/main.cpp index d7288e5f4..ee3f42660 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4012,8 +4012,8 @@ int main(int arg_count, char const **arg_ptr) { init_universal(); // TODO(bill): prevent compiling without a linker - Parser *parser = gb_alloc_item(permanent_allocator(), Parser); - Checker *checker = gb_alloc_item(permanent_allocator(), Checker); + Parser * parser = permanent_alloc_item(); + Checker *checker = permanent_alloc_item(); bool failed_to_cache_parsing = false; MAIN_TIME_SECTION("parse files"); @@ -4151,7 +4151,7 @@ int main(int arg_count, char const **arg_ptr) { } else #endif { - lbGenerator *gen = gb_alloc_item(permanent_allocator(), lbGenerator); + lbGenerator *gen = permanent_alloc_item(); if (!lb_init_generator(gen, checker)) { return 1; } diff --git a/src/parser.cpp b/src/parser.cpp index b302c935d..f79287ceb 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1476,7 +1476,7 @@ gb_internal CommentGroup *consume_comment_group(AstFile *f, isize n, isize *end_ CommentGroup *comments = nullptr; if (list.count > 0) { - comments = gb_alloc_item(permanent_allocator(), CommentGroup); + comments = permanent_alloc_item(); comments->list = slice_from_array(list); array_add(&f->comments, comments); } @@ -5151,7 +5151,7 @@ gb_internal Ast *parse_import_decl(AstFile *f, ImportDeclKind kind) { } if (file_path.string == "\".\"") { - syntax_error(import_name, "Cannot cyclicly import packages"); + // syntax_error(import_name, "Cannot cyclicly import packages"); } expect_semicolon(f); @@ -5797,7 +5797,7 @@ gb_internal WORKER_TASK_PROC(parser_worker_proc) { ParserWorkerData *wd = cast(ParserWorkerData *)data; ParseFileError err = process_imported_file(wd->parser, wd->imported_file); if (err != ParseFile_None) { - auto *node = gb_alloc_item(permanent_allocator(), ParseFileErrorNode); + auto *node = permanent_alloc_item(); node->err = err; MUTEX_GUARD_BLOCK(&wd->parser->file_error_mutex) { @@ -5817,7 +5817,7 @@ gb_internal WORKER_TASK_PROC(parser_worker_proc) { gb_internal void parser_add_file_to_process(Parser *p, AstPackage *pkg, FileInfo fi, TokenPos pos) { ImportedFile f = {pkg, fi, pos, p->file_to_process_count++}; f.pos.file_id = cast(i32)(f.index+1); - auto wd = gb_alloc_item(permanent_allocator(), ParserWorkerData); + auto wd = permanent_alloc_item(); wd->parser = p; wd->imported_file = f; thread_pool_add_task(parser_worker_proc, wd); @@ -5854,7 +5854,7 @@ gb_internal void parser_add_foreign_file_to_process(Parser *p, AstPackage *pkg, // TODO(bill): Use a better allocator ImportedFile f = {pkg, fi, pos, p->file_to_process_count++}; f.pos.file_id = cast(i32)(f.index+1); - auto wd = gb_alloc_item(permanent_allocator(), ForeignFileWorkerData); + auto wd = permanent_alloc_item(); wd->parser = p; wd->imported_file = f; wd->foreign_kind = kind; @@ -5874,7 +5874,7 @@ gb_internal AstPackage *try_add_import_path(Parser *p, String path, String const path = copy_string(permanent_allocator(), path); - AstPackage *pkg = gb_alloc_item(permanent_allocator(), AstPackage); + AstPackage *pkg = permanent_alloc_item(); pkg->kind = kind; pkg->fullpath = path; array_init(&pkg->files, permanent_allocator()); @@ -6880,7 +6880,7 @@ gb_internal ParseFileError process_imported_file(Parser *p, ImportedFile importe FileInfo fi = imported_file.fi; TokenPos pos = imported_file.pos; - AstFile *file = gb_alloc_item(permanent_allocator(), AstFile); + AstFile *file = permanent_alloc_item(); file->pkg = pkg; file->id = cast(i32)(imported_file.index+1); TokenPos err_pos = {0}; diff --git a/src/queue.cpp b/src/queue.cpp index 82f82f3e1..563fbe69e 100644 --- a/src/queue.cpp +++ b/src/queue.cpp @@ -37,7 +37,7 @@ gb_internal void mpsc_destroy(MPSCQueue *q) { template gb_internal MPSCNode *mpsc_alloc_node(MPSCQueue *q, T const &value) { // auto new_node = gb_alloc_item(heap_allocator(), MPSCNode); - auto new_node = gb_alloc_item(permanent_allocator(), MPSCNode); + auto new_node = permanent_alloc_item >(); new_node->value = value; return new_node; } diff --git a/src/types.cpp b/src/types.cpp index 0f7aa2199..1ab759c9a 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -979,9 +979,7 @@ gb_internal void set_base_type(Type *t, Type *base) { gb_internal Type *alloc_type(TypeKind kind) { // gbAllocator a = heap_allocator(); - gbAllocator a = permanent_allocator(); - Type *t = gb_alloc_item(a, Type); - gb_zero_item(t); + Type *t = permanent_alloc_item(); t->kind = kind; t->cached_size = -1; t->cached_align = -1; @@ -1076,8 +1074,8 @@ gb_internal Type *alloc_type_enumerated_array(Type *elem, Type *index, ExactValu Type *t = alloc_type(Type_EnumeratedArray); t->EnumeratedArray.elem = elem; t->EnumeratedArray.index = index; - t->EnumeratedArray.min_value = gb_alloc_item(permanent_allocator(), ExactValue); - t->EnumeratedArray.max_value = gb_alloc_item(permanent_allocator(), ExactValue); + t->EnumeratedArray.min_value = permanent_alloc_item(); + t->EnumeratedArray.max_value = permanent_alloc_item(); gb_memmove(t->EnumeratedArray.min_value, min_value, gb_size_of(ExactValue)); gb_memmove(t->EnumeratedArray.max_value, max_value, gb_size_of(ExactValue)); t->EnumeratedArray.op = op; From 36d5a1911571a97894ad92bc897afba3efc0d218 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 17:41:58 +0000 Subject: [PATCH 732/766] Replace `Scope.elements` to use a custom hash map `ScopeMap` This hash map is robin hood based with a inline slot amount for small scopes --- src/big_int.cpp | 19 +++- src/check_decl.cpp | 3 +- src/check_expr.cpp | 2 +- src/check_stmt.cpp | 3 +- src/check_type.cpp | 30 ++++-- src/checker.cpp | 106 ++++++++++++-------- src/checker.hpp | 245 ++++++++++++++++++++++++++++++++++++++++++++- src/entity.cpp | 27 +++-- src/ptr_set.cpp | 18 ++-- src/types.cpp | 2 +- 10 files changed, 374 insertions(+), 81 deletions(-) diff --git a/src/big_int.cpp b/src/big_int.cpp index 7067a7c3d..141152913 100644 --- a/src/big_int.cpp +++ b/src/big_int.cpp @@ -16,14 +16,25 @@ void MP_FREE(void *mem, size_t size) { #else void *MP_MALLOC(size_t size) { - return gb_alloc(permanent_allocator(), cast(isize)size); + Arena *arena = get_arena(ThreadArena_Permanent); + return arena_alloc(arena, cast(isize)size, 16); } void *MP_REALLOC(void *mem, size_t oldsize, size_t newsize) { - return gb_resize(permanent_allocator(), mem, cast(isize)oldsize, cast(isize)newsize); + if (newsize < oldsize) { + return mem; + } + if (newsize == 0) { + return mem; + } + Arena *arena = get_arena(ThreadArena_Permanent); + void *new_mem = arena_alloc(arena, cast(isize)newsize, 16); + gb_memcopy(new_mem, mem, oldsize); + return new_mem; } void *MP_CALLOC(size_t nmemb, size_t size) { - size_t total = nmemb*size; - return gb_alloc(permanent_allocator(), cast(isize)total); + Arena *arena = get_arena(ThreadArena_Permanent); + isize total_size = cast(isize)(nmemb * size); + return arena_alloc(arena, total_size, 16); } void MP_FREE(void *mem, size_t size) { // DO NOTHING diff --git a/src/check_decl.cpp b/src/check_decl.cpp index c0358cff7..9c849d1e2 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -170,8 +170,9 @@ gb_internal void override_entity_in_scope(Entity *original_entity, Entity *new_e // Therefore two things can be done: the type can be assigned to state that it // has been "evaluated" and the variant data can be copied across + u32 hash = string_hash(original_name); rw_mutex_lock(&found_scope->mutex); - string_map_set(&found_scope->elements, original_name, new_entity); + scope_map_insert(&found_scope->elements, original_name, hash, new_entity); rw_mutex_unlock(&found_scope->mutex); original_entity->flags |= EntityFlag_Overridden; diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 3b29d5f94..152031fa7 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -514,7 +514,7 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E // NOTE(bill): Reset scope from the failed procedure type scope->head_child.store(nullptr, std::memory_order_relaxed); - string_map_clear(&scope->elements); + scope_map_clear(&scope->elements); ptr_set_clear(&scope->imported); // LEAK NOTE(bill): Cloning this AST may be leaky but this is not really an issue due to arena-based allocation diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 857ec1492..41ad7197b 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -790,10 +790,11 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, for (auto const &entry : scope->elements) { String name = entry.key; + u32 hash = entry.hash; Entity *decl = entry.value; if (!is_entity_exported(decl, true)) continue; - Entity *found = scope_insert_with_name(ctx->scope, name, decl); + Entity *found = scope_insert_with_name(ctx->scope, name, hash, decl); if (found != nullptr) { gbString expr_str = expr_to_string(expr); error(us->token, diff --git a/src/check_type.cpp b/src/check_type.cpp index f780f82b0..9612fc4f6 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -117,6 +117,10 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, Slice(variable_count); + isize entities_to_use_index = 0; + i32 field_src_index = 0; i32 field_group_index = -1; for_array(i, params) { @@ -165,7 +169,14 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, SliceIdent.token; - Entity *field = alloc_entity_field(ctx->scope, name_token, type, is_using, field_src_index); + // Entity *field = alloc_entity_field(ctx->scope, name_token, type, is_using, field_src_index); + Entity *field = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(field, Entity_Variable, ctx->scope, name_token, type); + field->state = EntityState_Unresolved; + field->flags |= EntityFlag_Field; + if (is_using) field->flags |= EntityFlag_Using; + field->Variable.field_index = field_src_index; + add_entity(ctx, ctx->scope, name, field); field->Variable.field_group_index = field_group_index; if (is_subtype) { @@ -636,7 +647,7 @@ gb_internal void check_struct_type(CheckerContext *ctx, Type *struct_type, Ast * isize min_field_count = 0; for_array(field_index, st->fields) { - Ast *field = st->fields[field_index]; + Ast *field = st->fields[field_index]; switch (field->kind) { case_ast_node(f, ValueDecl, field); min_field_count += f->names.count; @@ -887,6 +898,10 @@ gb_internal void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *nam scope_reserve(ctx->scope, et->fields.count); + // Allocate all at once + Entity *entities_to_use = permanent_alloc_array(et->fields.count); + isize entities_to_use_index = 0; + for_array(i, et->fields) { Ast *field = et->fields[i]; Ast *ident = nullptr; @@ -931,9 +946,6 @@ gb_internal void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *nam // NOTE(bill): Skip blank identifiers if (is_blank_ident(name)) { continue; - } else if (name == "names") { - error(field, "'names' is a reserved identifier for enumerations"); - continue; } if (min_value_set) { @@ -957,7 +969,11 @@ gb_internal void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *nam max_value_set = true; } - Entity *e = alloc_entity_constant(ctx->scope, ident->Ident.token, constant_type, iota); + // Entity *e = alloc_entity_constant(ctx->scope, ident->Ident.token, constant_type, iota); + Entity *e = &entities_to_use[entities_to_use_index++]; + Token token = ident->Ident.token; + INTERNAL_ENTITY_INIT(e, Entity_Constant, ctx->scope, token, constant_type); + e->Constant.value = iota; e->identifier = ident; e->flags |= EntityFlag_Visited; e->state = EntityState_Resolved; @@ -3205,7 +3221,7 @@ gb_internal Type *make_soa_struct_internal(CheckerContext *ctx, Ast *array_typ_e soa_struct->Struct.fields = permanent_slice_make(field_count+extra_field_count); soa_struct->Struct.tags = gb_alloc_array(permanent_allocator(), String, field_count+extra_field_count); - string_map_init(&scope->elements, 8); + scope_map_init(&scope->elements); String params_xyzw[4] = { str_lit("x"), diff --git a/src/checker.cpp b/src/checker.cpp index 5677b39b9..aca0e90a6 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -55,7 +55,8 @@ gb_internal bool check_rtti_type_disallowed(Ast *expr, Type *type, char const *f gb_internal void scope_reserve(Scope *scope, isize count) { - string_map_reserve(&scope->elements, 2*count); + scope_map_reserve(&scope->elements, 2*count); + // string_map_reserve(&scope->elements, 2*count); } gb_internal void entity_graph_node_set_destroy(EntityGraphNodeSet *s) { @@ -214,6 +215,7 @@ gb_internal DeclInfo *make_decl_info(Scope *scope, DeclInfo *parent) { gb_internal Scope *create_scope(CheckerInfo *info, Scope *parent) { Scope *s = permanent_alloc_item(); + scope_map_init(&s->elements); s->parent = parent; if (parent != nullptr && parent != builtin_pkg->scope) { @@ -254,9 +256,10 @@ gb_internal Scope *create_scope_from_package(CheckerContext *c, AstPackage *pkg) total_pkg_decl_count += file->total_file_decl_count; } - isize init_elements_capacity = gb_max(DEFAULT_SCOPE_CAPACITY, 2*total_pkg_decl_count); + // isize init_elements_capacity = gb_max(DEFAULT_SCOPE_CAPACITY, 2*total_pkg_decl_count); Scope *s = create_scope(c->info, builtin_pkg->scope); - string_map_init(&s->elements, init_elements_capacity); + scope_map_reserve(&s->elements, 2*total_pkg_decl_count); + // string_map_init(&s->elements, init_elements_capacity); s->flags |= ScopeFlag_Pkg; s->pkg = pkg; @@ -283,7 +286,7 @@ gb_internal void destroy_scope(Scope *scope) { destroy_scope(child); } - string_map_destroy(&scope->elements); + // string_map_destroy(&scope->elements); ptr_set_destroy(&scope->imported); // NOTE(bill): No need to free scope as it "should" be allocated in an arena (except for the global scope) @@ -369,10 +372,14 @@ gb_internal void check_close_scope(CheckerContext *c) { } -gb_internal Entity *scope_lookup_current(Scope *s, String const &name) { - Entity **found = string_map_get(&s->elements, name); +gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash) { + // Entity **found = string_map_get(&s->elements, name); + if (hash == 0) { + hash = string_hash(name); + } + Entity *found = scope_map_get(&s->elements, name, hash); if (found) { - return *found; + return found; } return nullptr; } @@ -385,20 +392,16 @@ gb_internal void scope_lookup_parent(Scope *scope, String const &name, Scope **s if (scope != nullptr) { bool gone_thru_proc = false; bool gone_thru_package = false; - StringHashKey key = {}; - if (hash) { - key.hash = hash; - key.string = name; - } else { - key = string_hash_string(name); + if (!hash) { + hash = string_hash(name); } for (Scope *s = scope; s != nullptr; s = s->parent) { - Entity **found = nullptr; + Entity *found = nullptr; if (!is_single_threaded) rw_mutex_shared_lock(&s->mutex); - found = string_map_get(&s->elements, key); + found = scope_map_get(&s->elements, name, hash); if (!is_single_threaded) rw_mutex_shared_unlock(&s->mutex); if (found) { - Entity *e = *found; + Entity *e = found; if (gone_thru_proc) { if (e->kind == Entity_Label) { continue; @@ -437,35 +440,34 @@ gb_internal Entity *scope_lookup(Scope *s, String const &name, u32 hash) { return entity; } -gb_internal Entity *scope_insert_with_name_no_mutex(Scope *s, String const &name, Entity *entity) { +gb_internal Entity *scope_insert_with_name_no_mutex(Scope *s, String const &name, u32 hash, Entity *entity) { if (name == "") { return nullptr; } - StringHashKey key = string_hash_string(name); - Entity **found = nullptr; + Entity *found = nullptr; Entity *result = nullptr; - found = string_map_get(&s->elements, key); + found = scope_map_get(&s->elements, name, hash); if (found) { - if (entity != *found) { - result = *found; + if (entity != found) { + result = found; } goto end; } if (s->parent != nullptr && (s->parent->flags & ScopeFlag_Proc) != 0) { - found = string_map_get(&s->parent->elements, key); + found = scope_map_get(&s->parent->elements, name, hash); if (found) { - if ((*found)->flags & EntityFlag_Result) { - if (entity != *found) { - result = *found; + if (found->flags & EntityFlag_Result) { + if (entity != found) { + result = found; } goto end; } } } - string_map_set(&s->elements, key, entity); + scope_map_insert(&s->elements, name, hash, entity); if (entity->scope == nullptr) { entity->scope = s; } @@ -474,31 +476,30 @@ end:; } -gb_internal Entity *scope_insert_with_name(Scope *s, String const &name, Entity *entity) { +gb_internal Entity *scope_insert_with_name(Scope *s, String const &name, u32 hash, Entity *entity) { if (name == "") { return nullptr; } - StringHashKey key = string_hash_string(name); - Entity **found = nullptr; + Entity *found = nullptr; Entity *result = nullptr; rw_mutex_lock(&s->mutex); - found = string_map_get(&s->elements, key); + found = scope_map_get(&s->elements, name, hash); if (found) { - if (entity != *found) { - result = *found; + if (entity != found) { + result = found; } goto end; } if (s->parent != nullptr && (s->parent->flags & ScopeFlag_Proc) != 0) { rw_mutex_shared_lock(&s->parent->mutex); - found = string_map_get(&s->parent->elements, key); + found = scope_map_get(&s->parent->elements, name, hash); if (found) { - if ((*found)->flags & EntityFlag_Result) { - if (entity != *found) { - result = *found; + if (found->flags & EntityFlag_Result) { + if (entity != found) { + result = found; } rw_mutex_shared_unlock(&s->parent->mutex); goto end; @@ -507,7 +508,7 @@ gb_internal Entity *scope_insert_with_name(Scope *s, String const &name, Entity rw_mutex_shared_unlock(&s->parent->mutex); } - string_map_set(&s->elements, key, entity); + scope_map_insert(&s->elements, name, hash, entity); if (entity->scope == nullptr) { entity->scope = s; } @@ -519,16 +520,32 @@ end:; gb_internal Entity *scope_insert(Scope *s, Entity *entity) { String name = entity->token.string; + u32 hash = 0; + Ast *ident = entity->identifier.load(std::memory_order_relaxed); + if (ident != nullptr) { + hash = ident->Ident.hash; + } + if (hash == 0) { + hash = string_hash(name); + } if (in_single_threaded_checker_stage.load(std::memory_order_relaxed)) { - return scope_insert_with_name_no_mutex(s, name, entity); + return scope_insert_with_name_no_mutex(s, name, hash, entity); } else { - return scope_insert_with_name(s, name, entity); + return scope_insert_with_name(s, name, hash, entity); } } gb_internal Entity *scope_insert_no_mutex(Scope *s, Entity *entity) { String name = entity->token.string; - return scope_insert_with_name_no_mutex(s, name, entity); + u32 hash = 0; + Ast *ident = entity->identifier.load(std::memory_order_relaxed); + if (ident != nullptr) { + hash = ident->Ident.hash; + } + if (hash == 0) { + hash = string_hash(name); + } + return scope_insert_with_name_no_mutex(s, name, hash, entity); } @@ -3258,6 +3275,7 @@ gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String } gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator) { + // TODO(bill): Cache to reuse `CheckerTypePath` auto *tp = gb_alloc_item(heap_allocator(), CheckerTypePath); array_init(tp, allocator, 0, 16); return tp; @@ -4882,9 +4900,9 @@ gb_internal bool correct_single_type_alias(CheckerContext *c, Entity *e) { gb_internal bool correct_type_alias_in_scope_backwards(CheckerContext *c, Scope *s) { bool correction = false; for (u32 n = s->elements.count, i = n-1; i < n; i--) { - auto const &entry = s->elements.entries[i]; - Entity *e = entry.value; - if (entry.hash && e != nullptr) { + auto const &slot = s->elements.slots[i]; + Entity *e = slot.value; + if (slot.hash && e != nullptr) { correction |= correct_single_type_alias(c, e); } } diff --git a/src/checker.hpp b/src/checker.hpp index fd2fa2c7f..9f4ee66d8 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -266,6 +266,246 @@ struct ProcInfo { }; +enum { DEFAULT_SCOPE_CAPACITY = 32 }; + + +struct ScopeMapSlot { + u32 hash; + u32 _pad; + String key; + Entity *value; +}; + +enum { SCOPE_MAP_INLINE_CAP = 16 }; + +struct ScopeMap { + ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; + ScopeMapSlot *slots; + u32 count; + u32 cap; +}; + +gb_internal gb_inline u32 scope_map_max_load(u32 cap) { + return cap - (cap>>2); // 75% +} + +gb_internal gb_inline void scope_map_init(ScopeMap *m) { + m->cap = SCOPE_MAP_INLINE_CAP; + m->slots = m->inline_slots; +} + + +gb_internal Entity *scope_map_insert_for_rehash( + ScopeMapSlot *slots, u32 mask, + String key, u32 hash, Entity *value) { + u32 pos = hash & mask; + u32 dist = 0; + + for (;;) { + ScopeMapSlot *s = &slots[pos]; + + if (s->hash == 0) { + s->key = key; + s->hash = hash; + s->value = value; + return nullptr; + } + + u32 existing_dist = (pos - s->hash) & mask; + + if (dist > existing_dist) { + String tmp_key = s->key; + u32 tmp_hash = s->hash; + Entity *tmp_value = s->value; + + s->key = key; + s->hash = hash; + s->value = value; + + hash = tmp_hash; + value = tmp_value; + key = tmp_key; + dist = existing_dist; + } + + dist += 1; + pos = (pos+1) & mask; + } +} + + +gb_internal void scope_map_grow(ScopeMap *m) { + u32 new_cap = m->cap << 1; + u32 new_mask = new_cap - 1; + + ScopeMapSlot *new_slots = permanent_alloc_array(new_cap); + + if (m->count > 0) { + for (u32 i = 0; i < m->cap; i++) { + if (m->slots[i].hash) { + scope_map_insert_for_rehash(new_slots, new_mask, + m->slots[i].key, m->slots[i].hash, m->slots[i].value); + } + } + } + + m->slots = new_slots; + m->cap = new_cap; +} + +gb_internal void scope_map_reserve(ScopeMap *m, isize capacity) { + if (m->slots == nullptr) { + scope_map_init(m); + } + u32 new_cap = next_pow2_u32(cast(u32)capacity); + if (m->cap < new_cap && new_cap > SCOPE_MAP_INLINE_CAP) { + m->slots = permanent_alloc_array(new_cap); + m->cap = new_cap; + } +} + + + +gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity *value) { + if (m->slots == nullptr) { + scope_map_init(m); + } + if (m->count >= scope_map_max_load(m->cap)) { + scope_map_grow(m); + } + + u32 mask = m->cap-1; + u32 pos = hash & mask; + u32 dist = 0; + + for (;;) { + ScopeMapSlot *s = &m->slots[pos]; + + if (s->hash == 0) { + s->key = key; + s->hash = hash; + s->value = value; + m->count += 1; + return nullptr; + } + + if (s->hash == hash && s->key == key) { + Entity *old = s->value; + s->value = value; + return old; + } + + u32 existing_dist = (pos - s->hash) & mask; + + if (dist > existing_dist) { + String tmp_key = s->key; + u32 tmp_hash = s->hash; + Entity *tmp_value = s->value; + + s->key = key; + s->hash = hash; + s->value = value; + + key = tmp_key; + hash = tmp_hash; + value = tmp_value; + dist = existing_dist; + } + + dist += 1; + pos = (pos+1) & mask; + } +} + +gb_internal Entity *scope_map_get(ScopeMap *m, String key, u32 hash) { + u32 mask = m->cap-1; + u32 pos = hash & mask; + u32 dist = 0; + for (;;) { + ScopeMapSlot *s = &m->slots[pos]; + if (s->hash == 0) { + return nullptr; + } + + u32 existing_dist = (pos - s->hash) & mask; + if (dist > existing_dist) { + return nullptr; + } + if (s->hash == hash && s->key == key) { + return s->value; + } + + dist += 1; + pos = (pos + 1) & mask; + } +} + +gb_internal void scope_map_clear(ScopeMap *m) { + gb_memset(m->slots, 0, gb_size_of(*m->slots) * m->cap); + m->count = 0; +} + +struct ScopeMapIterator { + ScopeMap const *map; + u32 index; + + ScopeMapIterator &operator++() noexcept { + for (;;) { + ++index; + if (map->cap == index) { + return *this; + } + ScopeMapSlot *s = map->slots+index; + if (s->hash) { + return *this; + } + } + } + + bool operator==(ScopeMapIterator const &other) const noexcept { + return this->map == other.map && this->index == other.index; + } + + operator ScopeMapSlot *() const { + return map->slots+index; + } +}; + + +gb_internal ScopeMapIterator end(ScopeMap &m) noexcept { + return ScopeMapIterator{&m, m.cap}; +} +gb_internal ScopeMapIterator const end(ScopeMap const &m) noexcept { + return ScopeMapIterator{&m, m.cap}; +} +gb_internal ScopeMapIterator begin(ScopeMap &m) noexcept { + if (m.count == 0) { + return end(m); + } + + u32 index = 0; + while (index < m.cap) { + if (m.slots[index].hash) { + break; + } + index++; + } + return ScopeMapIterator{&m, index}; +} +gb_internal ScopeMapIterator const begin(ScopeMap const &m) noexcept { + if (m.count == 0) { + return end(m); + } + + u32 index = 0; + while (index < m.cap) { + if (m.slots[index].hash) { + break; + } + index++; + } + return ScopeMapIterator{&m, index}; +} enum ScopeFlag : i32 { ScopeFlag_Pkg = 1<<1, @@ -281,7 +521,6 @@ enum ScopeFlag : i32 { ScopeFlag_ContextDefined = 1<<16, }; -enum { DEFAULT_SCOPE_CAPACITY = 32 }; struct Scope { Ast * node; @@ -292,7 +531,7 @@ struct Scope { i32 index; // within a procedure RwMutex mutex; - StringMap elements; + ScopeMap elements; PtrSet imported; DeclInfo *decl_info; @@ -625,7 +864,7 @@ gb_internal isize type_info_index (CheckerInfo *info, TypeInfoPair gb_internal Entity *entity_of_node(Ast *expr); -gb_internal Entity *scope_lookup_current(Scope *s, String const &name); +// gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash=0); gb_internal Entity *scope_lookup (Scope *s, String const &name, u32 hash=0); gb_internal void scope_lookup_parent (Scope *s, String const &name, Scope **scope_, Entity **entity_, u32 hash=0); gb_internal Entity *scope_insert (Scope *s, Entity *entity); diff --git a/src/entity.cpp b/src/entity.cpp index 1a01e0945..5fcd62071 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -344,17 +344,23 @@ gb_internal bool entity_has_deferred_procedure(Entity *e) { gb_global std::atomic global_entity_id; +// NOTE(bill): This exists to allow for bulk allocations of entities all at once to improve performance for type generation +#define INTERNAL_ENTITY_INIT(entity, kind_, scope_, token_, type_) do { \ + (entity)->kind = (kind_); \ + (entity)->state = EntityState_Unresolved; \ + (entity)->scope = (scope_); \ + (entity)->token = (token_); \ + (entity)->type = (type_); \ + (entity)->id = 1 + global_entity_id.fetch_add(1); \ + if ((token_).pos.file_id) { \ + entity->file = thread_unsafe_get_ast_file_from_id((token_).pos.file_id); \ + } \ +} while (0) + + gb_internal Entity *alloc_entity(EntityKind kind, Scope *scope, Token token, Type *type) { Entity *entity = permanent_alloc_item(); - entity->kind = kind; - entity->state = EntityState_Unresolved; - entity->scope = scope; - entity->token = token; - entity->type = type; - entity->id = 1 + global_entity_id.fetch_add(1); - if (token.pos.file_id) { - entity->file = thread_unsafe_get_ast_file_from_id(token.pos.file_id); - } + INTERNAL_ENTITY_INIT(entity, kind, scope, token, type); return entity; } @@ -411,11 +417,10 @@ gb_internal Entity *alloc_entity_const_param(Scope *scope, Token token, Type *ty gb_internal Entity *alloc_entity_field(Scope *scope, Token token, Type *type, bool is_using, i32 field_index, EntityState state = EntityState_Unresolved) { - Entity *entity = alloc_entity_variable(scope, token, type); + Entity *entity = alloc_entity_variable(scope, token, type, state); entity->Variable.field_index = field_index; if (is_using) entity->flags |= EntityFlag_Using; entity->flags |= EntityFlag_Field; - entity->state = state; return entity; } diff --git a/src/ptr_set.cpp b/src/ptr_set.cpp index 21151c0aa..1d8154be7 100644 --- a/src/ptr_set.cpp +++ b/src/ptr_set.cpp @@ -123,10 +123,11 @@ gb_internal bool ptr_set_update(PtrSet *s, T ptr) { // returns true if it pre usize hash_index = (cast(usize)hash) & mask; GB_ASSERT(hash_index < s->capacity); for (usize i = 0; i < s->capacity; i++) { - T *key = &s->keys[hash_index]; - GB_ASSERT(*key != ptr); - if (*key == (T)PtrSet::TOMBSTONE || *key == 0) { - *key = ptr; + T *key_ptr = &s->keys[hash_index]; + T key = *key_ptr; + GB_ASSERT(key != ptr); + if (key == (T)PtrSet::TOMBSTONE || key == 0) { + *key_ptr = ptr; s->count++; return false; } @@ -161,10 +162,11 @@ gb_internal bool ptr_set_update_with_mutex(PtrSet *s, T ptr, RWSpinLock *m) { usize hash_index = (cast(usize)hash) & mask; GB_ASSERT(hash_index < s->capacity); for (usize i = 0; i < s->capacity; i++) { - T *key = &s->keys[hash_index]; - GB_ASSERT(*key != ptr); - if (*key == (T)PtrSet::TOMBSTONE || *key == 0) { - *key = ptr; + T *key_ptr = &s->keys[hash_index]; + T key = *key_ptr; + GB_ASSERT(key != ptr); + if (key == (T)PtrSet::TOMBSTONE || key == 0) { + *key_ptr = ptr; s->count++; return false; } diff --git a/src/types.cpp b/src/types.cpp index 1ab759c9a..a431e470e 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3617,7 +3617,7 @@ gb_internal Selection lookup_field_from_index(Type *type, i64 index) { return empty_selection; } -gb_internal Entity *scope_lookup_current(Scope *s, String const &name); +gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash=0); gb_internal bool has_type_got_objc_class_attribute(Type *t); gb_internal Selection lookup_field_with_selection(Type *type_, String field_name, bool is_type, Selection sel, bool allow_blank_ident) { From cb7a87773bda811027149bb12a0b4025e4f7782c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 18:04:25 +0000 Subject: [PATCH 733/766] Split keys and slots and allocate them both together --- src/check_stmt.cpp | 2 +- src/checker.hpp | 64 +++++++++++++++++++++++++++++---------------- src/docs_writer.cpp | 2 +- src/string.cpp | 5 ++-- 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 41ad7197b..bc7605e0d 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -789,7 +789,7 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, defer (rw_mutex_unlock(&scope->mutex)); for (auto const &entry : scope->elements) { - String name = entry.key; + String name = scope->elements.keys[entry.hash & (scope->elements.cap-1)]; u32 hash = entry.hash; Entity *decl = entry.value; if (!is_entity_exported(decl, true)) continue; diff --git a/src/checker.hpp b/src/checker.hpp index 9f4ee66d8..226a4ba6a 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -272,15 +272,16 @@ enum { DEFAULT_SCOPE_CAPACITY = 32 }; struct ScopeMapSlot { u32 hash; u32 _pad; - String key; Entity *value; }; enum { SCOPE_MAP_INLINE_CAP = 16 }; struct ScopeMap { - ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; + ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; + String inline_keys[SCOPE_MAP_INLINE_CAP]; ScopeMapSlot *slots; + String * keys; u32 count; u32 cap; }; @@ -292,11 +293,12 @@ gb_internal gb_inline u32 scope_map_max_load(u32 cap) { gb_internal gb_inline void scope_map_init(ScopeMap *m) { m->cap = SCOPE_MAP_INLINE_CAP; m->slots = m->inline_slots; + m->keys = m->inline_keys; } gb_internal Entity *scope_map_insert_for_rehash( - ScopeMapSlot *slots, u32 mask, + String *keys, ScopeMapSlot *slots, u32 mask, String key, u32 hash, Entity *value) { u32 pos = hash & mask; u32 dist = 0; @@ -305,22 +307,22 @@ gb_internal Entity *scope_map_insert_for_rehash( ScopeMapSlot *s = &slots[pos]; if (s->hash == 0) { - s->key = key; - s->hash = hash; - s->value = value; + keys[pos] = key; + s->hash = hash; + s->value = value; return nullptr; } u32 existing_dist = (pos - s->hash) & mask; if (dist > existing_dist) { - String tmp_key = s->key; + String tmp_key = keys[pos]; u32 tmp_hash = s->hash; Entity *tmp_value = s->value; - s->key = key; - s->hash = hash; - s->value = value; + keys[pos] = key; + s->hash = hash; + s->value = value; hash = tmp_hash; value = tmp_value; @@ -333,23 +335,38 @@ gb_internal Entity *scope_map_insert_for_rehash( } } +gb_internal gb_inline void scope_map_allocate_entries(u32 cap, String **keys, ScopeMapSlot **slots) { + Arena *arena = get_arena(ThreadArena_Permanent); + isize size = (gb_size_of(String) + gb_size_of(ScopeMapSlot)) * cap; + u8 *data = cast(u8 *)arena_alloc(arena, size, 8); + + *keys = cast(String *)data; + *slots = cast(ScopeMapSlot *)(*keys + cap); + + // *keys = permanent_alloc_array(cap); + // *slots = permanent_alloc_array(cap); +} + gb_internal void scope_map_grow(ScopeMap *m) { u32 new_cap = m->cap << 1; u32 new_mask = new_cap - 1; - ScopeMapSlot *new_slots = permanent_alloc_array(new_cap); + String * new_keys; + ScopeMapSlot *new_slots; + scope_map_allocate_entries(new_cap, &new_keys, &new_slots); if (m->count > 0) { for (u32 i = 0; i < m->cap; i++) { if (m->slots[i].hash) { - scope_map_insert_for_rehash(new_slots, new_mask, - m->slots[i].key, m->slots[i].hash, m->slots[i].value); + scope_map_insert_for_rehash(new_keys, new_slots, new_mask, + m->keys[i], m->slots[i].hash, m->slots[i].value); } } } m->slots = new_slots; + m->keys = new_keys; m->cap = new_cap; } @@ -359,7 +376,7 @@ gb_internal void scope_map_reserve(ScopeMap *m, isize capacity) { } u32 new_cap = next_pow2_u32(cast(u32)capacity); if (m->cap < new_cap && new_cap > SCOPE_MAP_INLINE_CAP) { - m->slots = permanent_alloc_array(new_cap); + scope_map_allocate_entries(new_cap, &m->keys, &m->slots); m->cap = new_cap; } } @@ -382,14 +399,14 @@ gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity * ScopeMapSlot *s = &m->slots[pos]; if (s->hash == 0) { - s->key = key; + m->keys[pos] = key; s->hash = hash; s->value = value; m->count += 1; return nullptr; } - if (s->hash == hash && s->key == key) { + if (s->hash == hash && m->keys[pos] == key) { Entity *old = s->value; s->value = value; return old; @@ -398,13 +415,13 @@ gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity * u32 existing_dist = (pos - s->hash) & mask; if (dist > existing_dist) { - String tmp_key = s->key; + String tmp_key = m->keys[pos]; u32 tmp_hash = s->hash; Entity *tmp_value = s->value; - s->key = key; - s->hash = hash; - s->value = value; + m->keys[pos] = key; + s->hash = hash; + s->value = value; key = tmp_key; hash = tmp_hash; @@ -423,15 +440,16 @@ gb_internal Entity *scope_map_get(ScopeMap *m, String key, u32 hash) { u32 dist = 0; for (;;) { ScopeMapSlot *s = &m->slots[pos]; - if (s->hash == 0) { + u32 curr_hash = s->hash; + if (curr_hash == 0) { return nullptr; } - u32 existing_dist = (pos - s->hash) & mask; + u32 existing_dist = (pos - curr_hash) & mask; if (dist > existing_dist) { return nullptr; } - if (s->hash == hash && s->key == key) { + if (curr_hash == hash && m->keys[pos] == key) { return s->value; } diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 5e9c25016..89b7802ae 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -1050,7 +1050,7 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit defer (array_free(&entries)); for (auto const &element : pkg->scope->elements) { - String name = element.key; + String name = pkg->scope->elements.keys[element.hash & (pkg->scope->elements.cap-1)]; Entity *e = element.value; switch (e->kind) { case Entity_Invalid: diff --git a/src/string.cpp b/src/string.cpp index c26457acf..09bce205e 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -182,8 +182,9 @@ gb_internal isize string_index_byte(String const &s, u8 x) { } gb_internal gb_inline bool str_eq(String const &a, String const &b) { - if (a.len != b.len) return false; - if (a.len == 0) return true; + if (a.len != b.len) return false; + if (a.len == 0) return true; + if (a.text == b.text) return true; return memcmp(a.text, b.text, a.len) == 0; } gb_internal gb_inline bool str_ne(String const &a, String const &b) { return !str_eq(a, b); } From 36a3f691c15c3bae16b23865c1bdd398b3d01ac5 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 16 Mar 2026 18:30:14 +0900 Subject: [PATCH 734/766] core/crypto/sha2: Add Aarch64 SHA512 acceleration --- core/crypto/sha2/sha2.odin | 30 +- core/crypto/sha2/sha512_impl_hw_arm.odin | 498 +++++++++++++++++++++++ core/crypto/sha2/sha512_impl_hw_gen.odin | 3 +- 3 files changed, 515 insertions(+), 16 deletions(-) create mode 100644 core/crypto/sha2/sha512_impl_hw_arm.odin diff --git a/core/crypto/sha2/sha2.odin b/core/crypto/sha2/sha2.odin index a878e1c2a..2eac9240b 100644 --- a/core/crypto/sha2/sha2.odin +++ b/core/crypto/sha2/sha2.odin @@ -276,7 +276,7 @@ reset :: proc(ctx: ^$T) { SHA2 implementation */ -@(private, rodata) +@(private = "file", rodata) SHA256_K := [64]u32 { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, @@ -296,7 +296,7 @@ SHA256_K := [64]u32 { 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, } -@(private, rodata) +@(private = "file", rodata) SHA512_K := [80]u64 { 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, @@ -345,67 +345,67 @@ SHA256_ROUNDS :: 64 @(private) SHA512_ROUNDS :: 80 -@(private) +@(private = "file") SHA256_CH :: #force_inline proc "contextless" (x, y, z: u32) -> u32 { return (x & y) ~ (~x & z) } -@(private) +@(private = "file") SHA256_MAJ :: #force_inline proc "contextless" (x, y, z: u32) -> u32 { return (x & y) ~ (x & z) ~ (y & z) } -@(private) +@(private = "file") SHA512_CH :: #force_inline proc "contextless" (x, y, z: u64) -> u64 { return (x & y) ~ (~x & z) } -@(private) +@(private = "file") SHA512_MAJ :: #force_inline proc "contextless" (x, y, z: u64) -> u64 { return (x & y) ~ (x & z) ~ (y & z) } -@(private) +@(private = "file") SHA256_F1 :: #force_inline proc "contextless" (x: u32) -> u32 { return bits.rotate_left32(x, 30) ~ bits.rotate_left32(x, 19) ~ bits.rotate_left32(x, 10) } -@(private) +@(private = "file") SHA256_F2 :: #force_inline proc "contextless" (x: u32) -> u32 { return bits.rotate_left32(x, 26) ~ bits.rotate_left32(x, 21) ~ bits.rotate_left32(x, 7) } -@(private) +@(private = "file") SHA256_F3 :: #force_inline proc "contextless" (x: u32) -> u32 { return bits.rotate_left32(x, 25) ~ bits.rotate_left32(x, 14) ~ (x >> 3) } -@(private) +@(private = "file") SHA256_F4 :: #force_inline proc "contextless" (x: u32) -> u32 { return bits.rotate_left32(x, 15) ~ bits.rotate_left32(x, 13) ~ (x >> 10) } -@(private) +@(private = "file") SHA512_F1 :: #force_inline proc "contextless" (x: u64) -> u64 { return bits.rotate_left64(x, 36) ~ bits.rotate_left64(x, 30) ~ bits.rotate_left64(x, 25) } -@(private) +@(private = "file") SHA512_F2 :: #force_inline proc "contextless" (x: u64) -> u64 { return bits.rotate_left64(x, 50) ~ bits.rotate_left64(x, 46) ~ bits.rotate_left64(x, 23) } -@(private) +@(private = "file") SHA512_F3 :: #force_inline proc "contextless" (x: u64) -> u64 { return bits.rotate_left64(x, 63) ~ bits.rotate_left64(x, 56) ~ (x >> 7) } -@(private) +@(private = "file") SHA512_F4 :: #force_inline proc "contextless" (x: u64) -> u64 { return bits.rotate_left64(x, 45) ~ bits.rotate_left64(x, 3) ~ (x >> 6) } -@(private) +@(private = "file") sha2_transf :: proc "contextless" (ctx: ^$T, data: []byte) #no_bounds_check { when T == Context_256 { if ctx.is_hw_accelerated { diff --git a/core/crypto/sha2/sha512_impl_hw_arm.odin b/core/crypto/sha2/sha512_impl_hw_arm.odin new file mode 100644 index 000000000..27ef83f5a --- /dev/null +++ b/core/crypto/sha2/sha512_impl_hw_arm.odin @@ -0,0 +1,498 @@ +// The round function's intrinsic calls are based on: +// https://github.com/LostInCompilation/HashMe/blob/main/src/SHA512_Hardware.cpp +// +// The zlib License +// +// Copyright (C) 2024 Marc Schöndorf +// +// This software is provided 'as-is', without any express or implied warranty. In +// no event will the authors be held liable for any damages arising from the use of +// this software. +// +// Permission is granted to anyone to use this software for any purpose, including +// commercial applications, and to alter it and redistribute it freely, subject to +// the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not claim +// that you wrote the original software. If you use this software in a product, +// an acknowledgment in the product documentation would be appreciated but is +// not required. +// +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. + +#+build arm64 +package sha2 + +import "base:intrinsics" +import "core:simd" +import "core:simd/arm" +import "core:sys/info" + +// is_hardware_accelerated_512 returns true if and only if (⟺) hardware +// accelerated SHA-384, SHA-512, and SHA-512/256 are supported. +is_hardware_accelerated_512 :: proc "contextless" () -> bool { + req_features :: info.CPU_Features{ + .asimd, + .sha512, + .sha3, // XXX: LLVM groups these under `sha3`. + } + return info.cpu_features() >= req_features +} + +@(private = "file") +K_0 :: simd.u64x2{0x428a2f98d728ae22, 0x7137449123ef65cd} +@(private = "file") +K_1 :: simd.u64x2{0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc} +@(private = "file") +K_2 :: simd.u64x2{0x3956c25bf348b538, 0x59f111f1b605d019} +@(private = "file") +K_3 :: simd.u64x2{0x923f82a4af194f9b, 0xab1c5ed5da6d8118} +@(private = "file") +K_4 :: simd.u64x2{0xd807aa98a3030242, 0x12835b0145706fbe} +@(private = "file") +K_5 :: simd.u64x2{0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2} +@(private = "file") +K_6 :: simd.u64x2{0x72be5d74f27b896f, 0x80deb1fe3b1696b1} +@(private = "file") +K_7 :: simd.u64x2{0x9bdc06a725c71235, 0xc19bf174cf692694} +@(private = "file") +K_8 :: simd.u64x2{0xe49b69c19ef14ad2, 0xefbe4786384f25e3} +@(private = "file") +K_9 :: simd.u64x2{0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65} +@(private = "file") +K_10 :: simd.u64x2{0x2de92c6f592b0275, 0x4a7484aa6ea6e483} +@(private = "file") +K_11 :: simd.u64x2{0x5cb0a9dcbd41fbd4, 0x76f988da831153b5} +@(private = "file") +K_12 :: simd.u64x2{0x983e5152ee66dfab, 0xa831c66d2db43210} +@(private = "file") +K_13 :: simd.u64x2{0xb00327c898fb213f, 0xbf597fc7beef0ee4} +@(private = "file") +K_14 :: simd.u64x2{0xc6e00bf33da88fc2, 0xd5a79147930aa725} +@(private = "file") +K_15 :: simd.u64x2{0x06ca6351e003826f, 0x142929670a0e6e70} +@(private = "file") +K_16 :: simd.u64x2{0x27b70a8546d22ffc, 0x2e1b21385c26c926} +@(private = "file") +K_17 :: simd.u64x2{0x4d2c6dfc5ac42aed, 0x53380d139d95b3df} +@(private = "file") +K_18 :: simd.u64x2{0x650a73548baf63de, 0x766a0abb3c77b2a8} +@(private = "file") +K_19 :: simd.u64x2{0x81c2c92e47edaee6, 0x92722c851482353b} +@(private = "file") +K_20 :: simd.u64x2{0xa2bfe8a14cf10364, 0xa81a664bbc423001} +@(private = "file") +K_21 :: simd.u64x2{0xc24b8b70d0f89791, 0xc76c51a30654be30} +@(private = "file") +K_22 :: simd.u64x2{0xd192e819d6ef5218, 0xd69906245565a910} +@(private = "file") +K_23 :: simd.u64x2{0xf40e35855771202a, 0x106aa07032bbd1b8} +@(private = "file") +K_24 :: simd.u64x2{0x19a4c116b8d2d0c8, 0x1e376c085141ab53} +@(private = "file") +K_25 :: simd.u64x2{0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8} +@(private = "file") +K_26 :: simd.u64x2{0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb} +@(private = "file") +K_27 :: simd.u64x2{0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3} +@(private = "file") +K_28 :: simd.u64x2{0x748f82ee5defb2fc, 0x78a5636f43172f60} +@(private = "file") +K_29 :: simd.u64x2{0x84c87814a1f0ab72, 0x8cc702081a6439ec} +@(private = "file") +K_30 :: simd.u64x2{0x90befffa23631e28, 0xa4506cebde82bde9} +@(private = "file") +K_31 :: simd.u64x2{0xbef9a3f7b2c67915, 0xc67178f2e372532b} +@(private = "file") +K_32 :: simd.u64x2{0xca273eceea26619c, 0xd186b8c721c0c207} +@(private = "file") +K_33 :: simd.u64x2{0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178} +@(private = "file") +K_34 :: simd.u64x2{0x06f067aa72176fba, 0x0a637dc5a2c898a6} +@(private = "file") +K_35 :: simd.u64x2{0x113f9804bef90dae, 0x1b710b35131c471b} +@(private = "file") +K_36 :: simd.u64x2{0x28db77f523047d84, 0x32caab7b40c72493} +@(private = "file") +K_37 :: simd.u64x2{0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c} +@(private = "file") +K_38 :: simd.u64x2{0x4cc5d4becb3e42b6, 0x597f299cfc657e2a} +@(private = "file") +K_39 :: simd.u64x2{0x5fcb6fab3ad6faec, 0x6c44198c4a475817} + +@(private, enable_target_feature = "neon,sha3") +sha512_transf_hw :: proc "contextless" (ctx: ^Context_512, data: []byte) #no_bounds_check { + state_0 := intrinsics.unaligned_load((^simd.u64x2)(&ctx.h[0])) + state_1 := intrinsics.unaligned_load((^simd.u64x2)(&ctx.h[2])) + state_2 := intrinsics.unaligned_load((^simd.u64x2)(&ctx.h[4])) + state_3 := intrinsics.unaligned_load((^simd.u64x2)(&ctx.h[6])) + + data := data + for len(data) >= BLOCK_SIZE_512 { + ab_save, cd_save, ef_save, gh_save := state_0, state_1, state_2, state_3 + + // Load message + msg_0 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data))) + msg_1 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[16:]))) + msg_2 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[32:]))) + msg_3 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[48:]))) + msg_4 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[64:]))) + msg_5 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[80:]))) + msg_6 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[96:]))) + msg_7 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[112:]))) + + // Reverse for little endian + when ODIN_ENDIAN == .Little { + msg_0 = byteswap_u64x2(msg_0) + msg_1 = byteswap_u64x2(msg_1) + msg_2 = byteswap_u64x2(msg_2) + msg_3 = byteswap_u64x2(msg_3) + msg_4 = byteswap_u64x2(msg_4) + msg_5 = byteswap_u64x2(msg_5) + msg_6 = byteswap_u64x2(msg_6) + msg_7 = byteswap_u64x2(msg_7) + } + + // Rounds 0-1 + msg_k := simd.add(msg_0, K_0) + tmp_0 := simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 := arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_0 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_0, msg_1), msg_7, simd.shuffle(msg_4, msg_5, 1, 2)) + + // Rounds 2-3 + msg_k = simd.add(msg_1, K_1) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_1 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_1, msg_2), msg_0, simd.shuffle(msg_5, msg_6, 1, 2)) + + // Rounds 4-5 + msg_k = simd.add(msg_2, K_2) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_2 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_2, msg_3), msg_1, simd.shuffle(msg_6, msg_7, 1, 2)) + + // Rounds 6-7 + msg_k = simd.add(msg_3, K_3) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_3 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_3, msg_4), msg_2, simd.shuffle(msg_7, msg_0, 1, 2)) + + // Rounds 8-9 + msg_k = simd.add(msg_4, K_4) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_4 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_4, msg_5), msg_3, simd.shuffle(msg_0, msg_1, 1, 2)) + + // Rounds 10-11 + msg_k = simd.add(msg_5, K_5) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_5 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_5, msg_6), msg_4, simd.shuffle(msg_1, msg_2, 1, 2)) + + // Rounds 12-13 + msg_k = simd.add(msg_6, K_6) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_6 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_6, msg_7), msg_5, simd.shuffle(msg_2, msg_3, 1, 2)) + + // Rounds 14-15 + msg_k = simd.add(msg_7, K_7) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_7 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_7, msg_0), msg_6, simd.shuffle(msg_3, msg_4, 1, 2)) + + // Rounds 16-17 + msg_k = simd.add(msg_0, K_8) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_0 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_0, msg_1), msg_7, simd.shuffle(msg_4, msg_5, 1, 2)) + + // Rounds 18-19 + msg_k = simd.add(msg_1, K_9) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_1 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_1, msg_2), msg_0, simd.shuffle(msg_5, msg_6, 1, 2)) + + // Rounds 20-21 + msg_k = simd.add(msg_2, K_10) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_2 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_2, msg_3), msg_1, simd.shuffle(msg_6, msg_7, 1, 2)) + + // Rounds 22-23 + msg_k = simd.add(msg_3, K_11) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_3 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_3, msg_4), msg_2, simd.shuffle(msg_7, msg_0, 1, 2)) + + // Rounds 24-25 + msg_k = simd.add(msg_4, K_12) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_4 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_4, msg_5), msg_3, simd.shuffle(msg_0, msg_1, 1, 2)) + + // Rounds 26-27 + msg_k = simd.add(msg_5, K_13) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_5 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_5, msg_6), msg_4, simd.shuffle(msg_1, msg_2, 1, 2)) + + // Rounds 28-29 + msg_k = simd.add(msg_6, K_14) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_6 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_6, msg_7), msg_5, simd.shuffle(msg_2, msg_3, 1, 2)) + + // Rounds 30-31 + msg_k = simd.add(msg_7, K_15) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_7 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_7, msg_0), msg_6, simd.shuffle(msg_3, msg_4, 1, 2)) + + // Rounds 32-33 + msg_k = simd.add(msg_0, K_16) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_0 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_0, msg_1), msg_7, simd.shuffle(msg_4, msg_5, 1, 2)) + + // Rounds 34-35 + msg_k = simd.add(msg_1, K_17) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_1 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_1, msg_2), msg_0, simd.shuffle(msg_5, msg_6, 1, 2)) + + // Rounds 36-37 + msg_k = simd.add(msg_2, K_18) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_2 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_2, msg_3), msg_1, simd.shuffle(msg_6, msg_7, 1, 2)) + + // Rounds 38-39 + msg_k = simd.add(msg_3, K_19) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_3 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_3, msg_4), msg_2, simd.shuffle(msg_7, msg_0, 1, 2)) + + // Rounds 40-41 + msg_k = simd.add(msg_4, K_20) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_4 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_4, msg_5), msg_3, simd.shuffle(msg_0, msg_1, 1, 2)) + + // Rounds 42-43 + msg_k = simd.add(msg_5, K_21) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_5 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_5, msg_6), msg_4, simd.shuffle(msg_1, msg_2, 1, 2)) + + // Rounds 44-45 + msg_k = simd.add(msg_6, K_22) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_6 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_6, msg_7), msg_5, simd.shuffle(msg_2, msg_3, 1, 2)) + + // Rounds 46-47 + msg_k = simd.add(msg_7, K_23) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_7 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_7, msg_0), msg_6, simd.shuffle(msg_3, msg_4, 1, 2)) + + // Rounds 48-49 + msg_k = simd.add(msg_0, K_24) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_0 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_0, msg_1), msg_7, simd.shuffle(msg_4, msg_5, 1, 2)) + + // Rounds 50-51 + msg_k = simd.add(msg_1, K_25) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_1 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_1, msg_2), msg_0, simd.shuffle(msg_5, msg_6, 1, 2)) + + // Rounds 52-53 + msg_k = simd.add(msg_2, K_26) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_2 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_2, msg_3), msg_1, simd.shuffle(msg_6, msg_7, 1, 2)) + + // Rounds 54-55 + msg_k = simd.add(msg_3, K_27) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_3 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_3, msg_4), msg_2, simd.shuffle(msg_7, msg_0, 1, 2)) + + // Rounds 56-57 + msg_k = simd.add(msg_4, K_28) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_4 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_4, msg_5), msg_3, simd.shuffle(msg_0, msg_1, 1, 2)) + + // Rounds 58-59 + msg_k = simd.add(msg_5, K_29) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_5 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_5, msg_6), msg_4, simd.shuffle(msg_1, msg_2, 1, 2)) + + // Rounds 60-61 + msg_k = simd.add(msg_6, K_30) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_6 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_6, msg_7), msg_5, simd.shuffle(msg_2, msg_3, 1, 2)) + + // Rounds 62-63 + msg_k = simd.add(msg_7, K_31) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_7 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_7, msg_0), msg_6, simd.shuffle(msg_3, msg_4, 1, 2)) + + // Rounds 64-65 + msg_k = simd.add(msg_0, K_32) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + + // Rounds 66-67 + msg_k = simd.add(msg_1, K_33) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + + // Rounds 68-69 + msg_k = simd.add(msg_2, K_34) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + + // Rounds 70-71 + msg_k = simd.add(msg_3, K_35) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + + // Rounds 72-73 + msg_k = simd.add(msg_4, K_36) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + + // Rounds 74-75 + msg_k = simd.add(msg_5, K_37) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + + // Rounds 76-77 + msg_k = simd.add(msg_6, K_38) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + + // Rounds 78-79 + msg_k = simd.add(msg_7, K_39) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + + // Combine state + state_0 = simd.add(state_0, ab_save) + state_1 = simd.add(state_1, cd_save) + state_2 = simd.add(state_2, ef_save) + state_3 = simd.add(state_3, gh_save) + + data = data[BLOCK_SIZE_512:] + } + + intrinsics.unaligned_store((^simd.u64x2)(&ctx.h[0]), state_0) + intrinsics.unaligned_store((^simd.u64x2)(&ctx.h[2]), state_1) + intrinsics.unaligned_store((^simd.u64x2)(&ctx.h[4]), state_2) + intrinsics.unaligned_store((^simd.u64x2)(&ctx.h[6]), state_3) +} + +when ODIN_ENDIAN == .Little { + @(private = "file", enable_target_feature = "neon") + byteswap_u64x2 :: #force_inline proc "contextless" (a: simd.u64x2) -> simd.u64x2 { + return transmute(simd.u64x2)( + simd.shuffle( + transmute(simd.u8x16)(a), + transmute(simd.u8x16)(a), + 7, 6, 5, 4, 3, 2, 1, 0, + 15, 14, 13, 12, 11, 10, 9, 8, + ) + ) + } +} diff --git a/core/crypto/sha2/sha512_impl_hw_gen.odin b/core/crypto/sha2/sha512_impl_hw_gen.odin index 5fd518d80..701f82709 100644 --- a/core/crypto/sha2/sha512_impl_hw_gen.odin +++ b/core/crypto/sha2/sha512_impl_hw_gen.odin @@ -1,7 +1,8 @@ +#+build !arm64 package sha2 // is_hardware_accelerated_512 returns true if and only if (⟺) hardware -// accelerated SHA-384/SHA-512/SHA-512/256 are supported. +// accelerated SHA-384, SHA-512, and SHA-512/256 are supported. is_hardware_accelerated_512 :: proc "contextless" () -> bool { return false } From f7ede8632f59a6f3a2f34fbb81716a3b65ac759b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 08:10:13 +0000 Subject: [PATCH 735/766] Minor changes --- src/check_stmt.cpp | 4 ++-- src/checker.hpp | 4 ++-- src/types.cpp | 13 ++++++++++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index bc7605e0d..a690308cb 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -789,10 +789,10 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, defer (rw_mutex_unlock(&scope->mutex)); for (auto const &entry : scope->elements) { - String name = scope->elements.keys[entry.hash & (scope->elements.cap-1)]; - u32 hash = entry.hash; Entity *decl = entry.value; if (!is_entity_exported(decl, true)) continue; + String name = scope->elements.keys[entry.hash & (scope->elements.cap-1)]; + u32 hash = entry.hash; Entity *found = scope_insert_with_name(ctx->scope, name, hash, decl); if (found != nullptr) { diff --git a/src/checker.hpp b/src/checker.hpp index 226a4ba6a..ef68f9c74 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -278,10 +278,10 @@ struct ScopeMapSlot { enum { SCOPE_MAP_INLINE_CAP = 16 }; struct ScopeMap { + String inline_keys [SCOPE_MAP_INLINE_CAP]; ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; - String inline_keys[SCOPE_MAP_INLINE_CAP]; - ScopeMapSlot *slots; String * keys; + ScopeMapSlot *slots; u32 count; u32 cap; }; diff --git a/src/types.cpp b/src/types.cpp index a431e470e..f82e54802 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -978,7 +978,6 @@ gb_internal void set_base_type(Type *t, Type *base) { gb_internal Type *alloc_type(TypeKind kind) { - // gbAllocator a = heap_allocator(); Type *t = permanent_alloc_item(); t->kind = kind; t->cached_size = -1; @@ -1139,8 +1138,8 @@ gb_internal Type *alloc_type_union() { gb_internal Type *alloc_type_enum() { Type *t = alloc_type(Type_Enum); - t->Enum.min_value = gb_alloc_item(permanent_allocator(), ExactValue); - t->Enum.max_value = gb_alloc_item(permanent_allocator(), ExactValue); + t->Enum.min_value = permanent_alloc_item(); + t->Enum.max_value = permanent_alloc_item(); return t; } @@ -3049,6 +3048,10 @@ gb_internal bool are_types_identical_unique_tuples(Type *x, Type *y) { return false; } + if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { + return false; + } + // MUTEX_GUARD(&g_type_mutex); return are_types_identical_internal(x, y, true); } @@ -3063,6 +3066,10 @@ gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple return false; } + if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { + return false; + } + #if 0 if (x->kind == Type_Named) { Entity *e = x->Named.type_name; From 8f2fd4f8866e85118a72d3f70b9db17deca2abfd Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 08:21:13 +0000 Subject: [PATCH 736/766] Disable warning about padding when using `alignas` in C++ --- build.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/build.bat b/build.bat index 32c2ae658..b6e8b890d 100644 --- a/build.bat +++ b/build.bat @@ -94,6 +94,7 @@ if %release_mode% EQU 0 ( rem Debug set compiler_warnings= ^ -W4 -WX ^ -wd4100 -wd4101 -wd4127 -wd4146 ^ + -wd4324 ^ -wd4505 ^ -wd4456 -wd4457 From a8c6ea7c8a1bc09e055daf71b49d7cedba23b7c0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 09:18:39 +0000 Subject: [PATCH 737/766] Implement a new `StringInterner` --- src/common.cpp | 43 +------- src/common_memory.cpp | 125 ++++++++++++++++++++--- src/main.cpp | 4 +- src/parser.cpp | 5 +- src/parser.hpp | 7 +- src/string_interner.cpp | 215 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 338 insertions(+), 61 deletions(-) create mode 100644 src/string_interner.cpp diff --git a/src/common.cpp b/src/common.cpp index d5fc1df4b..86ebb0fa8 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -366,6 +366,7 @@ gb_global bool global_module_path_set = false; #include "string_set.cpp" #include "priority_queue.cpp" #include "thread_pool.cpp" +#include "string_interner.cpp" gb_internal String obfuscate_string(String const &s, char const *prefix) { @@ -388,48 +389,6 @@ gb_internal i32 obfuscate_i32(i32 i) { } - -struct StringIntern { - StringIntern *next; - isize len; - char str[1]; -}; - -PtrMap string_intern_map = {}; // Key: u64 -gb_global Arena string_intern_arena = {}; - -gb_internal char const *string_intern(char const *text, isize len) { - u64 hash = gb_fnv64a(text, len); - uintptr key = cast(uintptr)(hash ? hash : 1); - StringIntern **found = map_get(&string_intern_map, key); - if (found) { - for (StringIntern *it = *found; it != nullptr; it = it->next) { - if (it->len == len && gb_strncmp(it->str, (char *)text, len) == 0) { - return it->str; - } - } - } - - StringIntern *new_intern = cast(StringIntern *)arena_alloc(&string_intern_arena, gb_offset_of(StringIntern, str) + len + 1, gb_align_of(StringIntern)); - new_intern->len = len; - new_intern->next = found ? *found : nullptr; - gb_memmove(new_intern->str, text, len); - new_intern->str[len] = 0; - map_set(&string_intern_map, key, new_intern); - return new_intern->str; -} - -gb_internal char const *string_intern(String const &string) { - return string_intern(cast(char const *)string.text, string.len); -} - -gb_internal void init_string_interner(void) { - map_init(&string_intern_map); -} - - - - gb_internal i32 next_pow2(i32 n) { if (n <= 0) { return 0; diff --git a/src/common_memory.cpp b/src/common_memory.cpp index addd43687..ba38720b3 100644 --- a/src/common_memory.cpp +++ b/src/common_memory.cpp @@ -40,6 +40,7 @@ struct MemoryBlock { u8 * base; isize size; isize used; + isize committed; }; struct Arena { @@ -48,13 +49,14 @@ struct Arena { // BlockingMutex mutex; isize temp_count; Thread * parent_thread; + bool custom_arena; }; enum { DEFAULT_MINIMUM_BLOCK_SIZE = 8ll*1024ll*1024ll }; gb_global isize DEFAULT_PAGE_SIZE = 4096; -gb_internal MemoryBlock *virtual_memory_alloc(isize size); +gb_internal MemoryBlock *virtual_memory_alloc(isize size, bool commit); gb_internal void virtual_memory_dealloc(MemoryBlock *block); gb_internal void *arena_alloc(Arena *arena, isize min_size, isize alignment); gb_internal void arena_free_all(Arena *arena); @@ -82,7 +84,7 @@ gb_internal void thread_init_arenas(Thread *t) { gb_internal void *arena_alloc(Arena *arena, isize min_size, isize alignment) { GB_ASSERT(gb_is_power_of_two(alignment)); - GB_ASSERT(arena->parent_thread == get_current_thread()); + GB_ASSERT(arena->custom_arena || arena->parent_thread == get_current_thread()); isize size = 0; if (arena->curr_block != nullptr) { @@ -95,7 +97,7 @@ gb_internal void *arena_alloc(Arena *arena, isize min_size, isize alignment) { isize block_size = gb_max(size, arena->minimum_block_size); - MemoryBlock *new_block = virtual_memory_alloc(block_size); + MemoryBlock *new_block = virtual_memory_alloc(block_size, true); new_block->prev = arena->curr_block; arena->curr_block = new_block; } @@ -113,6 +115,62 @@ gb_internal void *arena_alloc(Arena *arena, isize min_size, isize alignment) { return ptr; } +gb_internal void *platform_virtual_memory_alloc_internal(isize total_size, bool commit); +gb_internal bool platform_virtual_memory_commit_internal(void *data, isize commit_amount); + +struct StaticArena { + u8 * data; + isize used; + isize committed; + isize reserved; + isize commit_block_size; +}; + +enum {STATIC_ARENA_DEFAULT_COMMIT_BLOCK_SIZE = 8<<20}; + +gb_internal void static_arena_init(StaticArena *arena, isize reserve_size, isize commit_block_size) { + GB_ASSERT(gb_is_power_of_two(reserve_size)); + GB_ASSERT(gb_is_power_of_two(commit_block_size)); + GB_ASSERT(commit_block_size <= reserve_size); + arena->data = cast(u8 *)platform_virtual_memory_alloc_internal(reserve_size, false); + arena->reserved = reserve_size; + arena->commit_block_size = commit_block_size; +} + +gb_internal void static_arena_commit_memory(StaticArena *arena, isize amount) { + isize blocks = (amount + arena->commit_block_size-1)/arena->commit_block_size; + isize total_amount = blocks * arena->commit_block_size; + + if (total_amount > arena->reserved - arena->committed) { + total_amount = arena->reserved - arena->committed; + } + + platform_virtual_memory_commit_internal(arena->data + arena->committed, total_amount); + arena->committed += total_amount; +} + +gb_internal void *static_arena_alloc(StaticArena *arena, isize size, isize alignment) { + GB_ASSERT(gb_is_power_of_two(alignment)); + + size = align_formula_isize(size, alignment); + + u8 *curr = arena->data + arena->used; + curr = cast(u8 *)align_formula_ptr(curr, alignment); + + u8 *end = curr + size; + if (end-arena->data > arena->committed) { + isize needed = (end - arena->data) - arena->committed; + static_arena_commit_memory(arena, needed); + } + GB_ASSERT_MSG(end-arena->data <= arena->committed, "out of memory for the static arena"); + + arena->used = end - arena->data; + + return curr; +} + + + template gb_internal T *arena_alloc_item(Arena *arena) { @@ -138,10 +196,13 @@ struct PlatformMemoryBlock { gb_global std::atomic global_platform_memory_total_usage; gb_global PlatformMemoryBlock global_platform_memory_block_sentinel; -gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size); +gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size, bool commit); gb_internal void platform_virtual_memory_free(PlatformMemoryBlock *block); gb_internal void platform_virtual_memory_protect(void *memory, isize size); +gb_internal void *platform_virtual_memory_alloc_internal(isize total_size, bool commit); +gb_internal bool platform_virtual_memory_commit_internal(void *data, isize commit_amount); + #if defined(GB_SYSTEM_WINDOWS) gb_internal void platform_virtual_memory_init(void) { global_platform_memory_block_sentinel.prev = &global_platform_memory_block_sentinel; @@ -153,14 +214,20 @@ gb_internal void platform_virtual_memory_protect(void *memory, isize size); GB_ASSERT(gb_is_power_of_two(DEFAULT_PAGE_SIZE)); } - gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size) { - PlatformMemoryBlock *pmblock = (PlatformMemoryBlock *)VirtualAlloc(0, total_size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); - if (pmblock == nullptr) { + gb_internal void *platform_virtual_memory_alloc_internal(isize total_size, bool commit) { + DWORD flags = commit ? MEM_RESERVE|MEM_COMMIT : MEM_RESERVE; + void *mem = VirtualAlloc(0, total_size, flags, PAGE_READWRITE); + if (mem == nullptr) { gb_printf_err("Out of Virtual memory, oh no...\n"); gb_printf_err("Requested: %lld bytes\n", cast(long long)total_size); gb_printf_err("Total Usage: %lld bytes\n", cast(long long)global_platform_memory_total_usage); - GB_ASSERT_MSG(pmblock != nullptr, "Out of Virtual Memory, oh no..."); + GB_ASSERT_MSG(mem != nullptr, "Out of Virtual Memory, oh no..."); } + return mem; + } + + gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size, bool commit) { + PlatformMemoryBlock *pmblock = cast(PlatformMemoryBlock *)platform_virtual_memory_alloc_internal(total_size, commit); global_platform_memory_total_usage.fetch_add(total_size); return pmblock; } @@ -173,6 +240,16 @@ gb_internal void platform_virtual_memory_protect(void *memory, isize size); BOOL is_protected = VirtualProtect(memory, size, PAGE_NOACCESS, &old_protect); GB_ASSERT(is_protected); } + + gb_internal bool platform_virtual_memory_commit_internal(void *data, isize commit_amount) { + void *res = VirtualAlloc(data, commit_amount, MEM_COMMIT, PAGE_READWRITE); + if (res == nullptr) { + GB_PANIC("Out of Virtual Memory, oh no...\n"); + GB_ASSERT_MSG(res != nullptr, "Out of Virtual Memory, oh no..."); + return false; + } + return true; + } #else #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) #define MAP_ANONYMOUS MAP_ANON @@ -185,9 +262,20 @@ gb_internal void platform_virtual_memory_protect(void *memory, isize size); DEFAULT_PAGE_SIZE = gb_max(DEFAULT_PAGE_SIZE, cast(isize)sysconf(_SC_PAGE_SIZE)); GB_ASSERT(gb_is_power_of_two(DEFAULT_PAGE_SIZE)); } + + gb_internal void *platform_virtual_memory_alloc_internal(isize total_size, bool commit) { + void *mem = mmap(nullptr, total_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (mem == nullptr) { + gb_printf_err("Out of Virtual memory, oh no...\n"); + gb_printf_err("Requested: %lld bytes\n", cast(long long)total_size); + gb_printf_err("Total Usage: %lld bytes\n", cast(long long)global_platform_memory_total_usage); + GB_ASSERT_MSG(mem != nullptr, "Out of Virtual Memory, oh no..."); + } + return mem; + } - gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size) { - PlatformMemoryBlock *pmblock = (PlatformMemoryBlock *)mmap(nullptr, total_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size, bool commit) { + PlatformMemoryBlock *pmblock = cast(PlatformMemoryBlock *)platform_virtual_memory_alloc_internal(total_size, commit); if (pmblock == nullptr) { gb_printf_err("Out of Virtual memory, oh no...\n"); gb_printf_err("Requested: %lld bytes\n", cast(long long)total_size); @@ -197,6 +285,9 @@ gb_internal void platform_virtual_memory_protect(void *memory, isize size); global_platform_memory_total_usage.fetch_add(total_size); return pmblock; } + gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc_uncommited(isize total_size) { + return platform_virtual_memory_alloc(total_size); + } gb_internal void platform_virtual_memory_free(PlatformMemoryBlock *block) { isize size = block->total_size; global_platform_memory_total_usage.fetch_sub(size); @@ -206,9 +297,19 @@ gb_internal void platform_virtual_memory_protect(void *memory, isize size); int err = mprotect(memory, size, PROT_NONE); GB_ASSERT(err == 0); } + + gb_internal bool platform_virtual_memory_commit_internal(void *data, isize commit_amount) { + int err = mprotect(data, commit_amount, PROT_READ | PROT_WRITE) + if (err != 0) { + GB_PANIC("Out of Virtual Memory, oh no...\n"); + GB_ASSERT_MSG(err == 0, "Out of Virtual Memory, oh no..."); + return false; + } + return true; + } #endif -gb_internal MemoryBlock *virtual_memory_alloc(isize size) { +gb_internal MemoryBlock *virtual_memory_alloc(isize size, bool commit) { isize const page_size = DEFAULT_PAGE_SIZE; isize total_size = size + gb_size_of(PlatformMemoryBlock); @@ -224,7 +325,7 @@ gb_internal MemoryBlock *virtual_memory_alloc(isize size) { do_protection = true; } - PlatformMemoryBlock *pmblock = platform_virtual_memory_alloc(total_size); + PlatformMemoryBlock *pmblock = platform_virtual_memory_alloc(total_size, commit); GB_ASSERT_MSG(pmblock != nullptr, "Out of Virtual Memory, oh no..."); pmblock->block.base = cast(u8 *)pmblock + base_offset; diff --git a/src/main.cpp b/src/main.cpp index ee3f42660..1f0df6add 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1086,7 +1086,7 @@ gb_internal bool parse_build_flags(Array args) { break; } - char const *key = string_intern(name); + char const *key = string_intern_cstring(name); if (map_get(&build_context.defined_values, key) != nullptr) { gb_printf_err("Defined constant '%.*s' already exists\n", LIT(name)); @@ -3588,7 +3588,7 @@ int main(int arg_count, char const **arg_ptr) { MAIN_TIME_SECTION("initialization"); - init_string_interner(); + g_string_interner = string_interner_create(); init_global_error_collector(); init_keyword_hash_table(); init_terminal(); diff --git a/src/parser.cpp b/src/parser.cpp index f79287ceb..101167e45 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -773,8 +773,9 @@ gb_internal Ast *ast_matrix_index_expr(AstFile *f, Ast *expr, Token open, Token gb_internal Ast *ast_ident(AstFile *f, Token token) { Ast *result = alloc_ast_node(f, Ast_Ident); - result->Ident.token = token; - result->Ident.hash = string_hash(token.string); + result->Ident.token = token; + result->Ident.hash = string_hash(token.string); + result->Ident.interned = string_interner_insert(token.string); return result; } diff --git a/src/parser.hpp b/src/parser.hpp index c68b3614f..149cf6330 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -424,9 +424,10 @@ struct AstSplitArgs { #define AST_KINDS \ AST_KIND(Ident, "identifier", struct { \ - Token token; \ - std::atomic entity; \ - u32 hash; \ + Token token; \ + std::atomic entity; \ + u32 hash; \ + InternedString interned; \ }) \ AST_KIND(Implicit, "implicit", Token) \ AST_KIND(Uninit, "uninitialized value", Token) \ diff --git a/src/string_interner.cpp b/src/string_interner.cpp new file mode 100644 index 000000000..f8496e3b0 --- /dev/null +++ b/src/string_interner.cpp @@ -0,0 +1,215 @@ +#define STRING_INTERNER_CELL_WIDTH 8 +#define STRING_INTERNER_MUTEX_STRIPE_COUNT 1024 +#define STRING_INTERNER_MUTEX_STRIPE_MASK (STRING_INTERNER_MUTEX_STRIPE_COUNT - 1) +#define STRING_INTERNER_THREAD_LOCAL_SIZE (1024 * 1024 * 2) +#define STRING_INTERN_CACHE_LINE (2*GB_CACHE_LINE_SIZE) + +struct InternedString { + u32 value; + bool operator==(InternedString other) const { + return this->value == other.value; + } + + String load() const; + char const *load_cstring() const; +}; +struct alignas(STRING_INTERN_CACHE_LINE) StringInternCell { + std::atomic hashes [STRING_INTERNER_CELL_WIDTH]; + InternedString offsets[STRING_INTERNER_CELL_WIDTH]; + std::atomic next; +}; + +struct alignas(STRING_INTERN_CACHE_LINE) PaddedMutex { + BlockingMutex m; +}; + +struct alignas(STRING_INTERN_CACHE_LINE) PaddedI64 { + std::atomic value; +}; + +struct StringInterner { + StringInternCell *cells; + u64 cell_mask; + PaddedMutex mutexes[STRING_INTERNER_MUTEX_STRIPE_COUNT]; + StaticArena arena; + PaddedMutex arena_mutex; + bool track_count; + PaddedI64 count; +}; + +gb_internal StringInterner *string_interner_create(); +gb_internal InternedString string_interner_insert(String str, u32 hash=0); +gb_internal String string_interner_load(InternedString interned); + +gb_global StringInterner *g_string_interner; + +struct StringInternerThreadLocalArena { + u8 *data; + u64 cursor; +}; +gb_thread_local gb_global StringInternerThreadLocalArena g_interner_arena; + +gb_internal void string_interner_thread_local_arena_init(StringInternerThreadLocalArena *tl_arena); +gb_internal void *string_interner_thread_local_arena_alloc(StringInternerThreadLocalArena *tl_arena, isize size, isize alignment); + +gb_internal StringInterner *string_interner_create() { + StaticArena arena = {}; + static_arena_init(&arena, 1<<30, STATIC_ARENA_DEFAULT_COMMIT_BLOCK_SIZE); + + StringInterner *interner = cast(StringInterner *)static_arena_alloc(&arena, gb_size_of(StringInterner), STRING_INTERN_CACHE_LINE); + interner->arena = arena; + u64 cell_size = 1llu << 17llu; + u64 cell_mask = cell_size - 1; + interner->cell_mask = cell_mask; + interner->cells = cast(StringInternCell *)static_arena_alloc(&interner->arena, cell_size * gb_size_of(StringInternCell), STRING_INTERN_CACHE_LINE); + interner->track_count = false; + return interner; +} + +gb_internal String string_interner_load(InternedString interned) { + StringInterner* interner = g_string_interner; + if (interned.value == 0) { + return {}; + } + u8 *base = cast(u8 *)interner + interned.value; + u32 str_len = *cast(u32 *)base; + u8 *text = base + 4; + String str = { text, str_len }; + return str; +} + +gb_internal char const *string_interner_load_cstring(InternedString interned) { + StringInterner* interner = g_string_interner; + if (interned.value == 0) { + return ""; + } + u8 *base = cast(u8 *)interner + interned.value; + // u32 str_len = *cast(u32 *)base; + u8 *text = base + 4; + return cast(char const *)text; +} + +String InternedString::load() const { + return string_interner_load(*this); +} +char const *InternedString::load_cstring() const { + return string_interner_load_cstring(*this); +} + +gb_internal InternedString string_interner_insert(String str, u32 hash) { + StringInterner* interner = g_string_interner; + if (str.len == 0) { + return {}; + } + + if (hash == 0) { + hash = string_hash(str); + } + + u64 cell_idx = hash & interner->cell_mask; + StringInternCell *cell = &interner->cells[cell_idx]; + while (true) { + StringInternCell *next = cell->next.load(std::memory_order_acquire); + + for (i32 i = 0; i < STRING_INTERNER_CELL_WIDTH; i += 1) { + if (cell->hashes[i].load(std::memory_order_acquire) == hash) { + String to_compare = string_interner_load(cell->offsets[i]); + if (to_compare == str) { + return cell->offsets[i]; + } + } + } + if (next == nullptr) { + break; + } + cell = next; + } + + u64 mutex_cell = cell_idx & STRING_INTERNER_MUTEX_STRIPE_MASK; + PaddedMutex* m = &interner->mutexes[mutex_cell]; + MUTEX_GUARD(&m->m); + + StringInternCell *load_cell = nullptr; + while (cell) { + for (i32 i = 0; i < STRING_INTERNER_CELL_WIDTH; i += 1) { + if (cell->hashes[i].load(std::memory_order_relaxed) == hash) { + // string check + String to_compare = string_interner_load(cell->offsets[i]); + if (to_compare == str) { + return cell->offsets[i]; + } + } + } + load_cell = cell; + cell = cell->next.load(std::memory_order_relaxed); + } + + u64 data_to_allocate = 4 + str.len + 1; + u8 *data = cast(u8 *)string_interner_thread_local_arena_alloc(&g_interner_arena, data_to_allocate, 8); + u32 str_len = cast(u32)str.len; + gb_memcopy(data, &str_len, 4); + gb_memcopy(&data[4], str.text, str_len); + data[4+str_len] = 0; + InternedString offset = { cast(u32)(cast(u8 *)data - cast(u8 *)interner) }; + + for (i32 i = 0; i < STRING_INTERNER_CELL_WIDTH; i += 1) { + if (load_cell->hashes[i].load(std::memory_order_relaxed) == 0) { + load_cell->offsets[i] = offset; + load_cell->hashes[i].store(hash, std::memory_order_release); + if (interner->track_count) { + interner->count.value.fetch_add(1, std::memory_order_relaxed); + } + return offset; + } + } + + StringInternCell *new_cell = cast(StringInternCell *)string_interner_thread_local_arena_alloc(&g_interner_arena, gb_size_of(StringInternCell), STRING_INTERN_CACHE_LINE); + new_cell->offsets[0] = offset; + new_cell->hashes[0].store(hash, std::memory_order_relaxed); + load_cell->next.store(new_cell, std::memory_order_release); + + if (interner->track_count) { + interner->count.value.fetch_add(1, std::memory_order_relaxed); + } + + return offset; +} + +gb_internal char const *string_intern_cstring(String str) { + InternedString i = string_interner_insert(str, 0); + return string_interner_load_cstring(i); +} + + +gb_internal String string_intern_string(String str) { + InternedString i = string_interner_insert(str, 0); + return string_interner_load(i); +} + + + + +gb_internal void string_interner_thread_local_arena_init(StringInternerThreadLocalArena *tl_arena) { + *tl_arena = { + nullptr, + STRING_INTERNER_THREAD_LOCAL_SIZE, + }; +} + +gb_internal void *string_interner_thread_local_arena_alloc(StringInternerThreadLocalArena *tl_arena, isize size, isize alignment) { + if (tl_arena->data == nullptr) { + tl_arena->cursor = STRING_INTERNER_THREAD_LOCAL_SIZE; + } + isize new_head = align_formula_isize(tl_arena->cursor, alignment); + isize cursor = new_head + size; + if (cursor > STRING_INTERNER_THREAD_LOCAL_SIZE) { + mutex_lock(&g_string_interner->arena_mutex.m); + tl_arena->data = cast(u8 *)static_arena_alloc(&g_string_interner->arena, STRING_INTERNER_THREAD_LOCAL_SIZE, 4096); + tl_arena->cursor = 0; + mutex_unlock(&g_string_interner->arena_mutex.m); + return string_interner_thread_local_arena_alloc(tl_arena, size, alignment); + } + u8 *return_head = tl_arena->data + new_head; + tl_arena->cursor = cursor; + return return_head; +} \ No newline at end of file From 239b86c566bd63245faed9bcf90265b93850190c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 09:20:14 +0000 Subject: [PATCH 738/766] Fix typos --- src/common_memory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common_memory.cpp b/src/common_memory.cpp index ba38720b3..1590aac65 100644 --- a/src/common_memory.cpp +++ b/src/common_memory.cpp @@ -286,7 +286,7 @@ gb_internal bool platform_virtual_memory_commit_internal(void *data, isize comm return pmblock; } gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc_uncommited(isize total_size) { - return platform_virtual_memory_alloc(total_size); + return platform_virtual_memory_alloc(total_size, false); } gb_internal void platform_virtual_memory_free(PlatformMemoryBlock *block) { isize size = block->total_size; @@ -299,7 +299,7 @@ gb_internal bool platform_virtual_memory_commit_internal(void *data, isize comm } gb_internal bool platform_virtual_memory_commit_internal(void *data, isize commit_amount) { - int err = mprotect(data, commit_amount, PROT_READ | PROT_WRITE) + int err = mprotect(data, commit_amount, PROT_READ | PROT_WRITE); if (err != 0) { GB_PANIC("Out of Virtual Memory, oh no...\n"); GB_ASSERT_MSG(err == 0, "Out of Virtual Memory, oh no..."); From d5a78a9cf15603ee8cc637113bcf14acc8bb0b47 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 09:43:16 +0000 Subject: [PATCH 739/766] Remove canonical hash shortcut --- src/parser.cpp | 2 ++ src/types.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 101167e45..584979064 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -792,6 +792,7 @@ gb_internal Ast *ast_uninit(AstFile *f, Token token) { gb_internal ExactValue exact_value_from_token(AstFile *f, Token const &token) { String s = token.string; + string_interner_insert(s); switch (token.kind) { case Token_Rune: if (!unquote_string(ast_allocator(f), &s, 0)) { @@ -848,6 +849,7 @@ gb_internal Ast *ast_basic_directive(AstFile *f, Token token, Token name) { Ast *result = alloc_ast_node(f, Ast_BasicDirective); result->BasicDirective.token = token; result->BasicDirective.name = name; + string_interner_insert(name.string); if (string_starts_with(name.string, str_lit("load"))) { f->seen_load_directive_count++; } diff --git a/src/types.cpp b/src/types.cpp index f82e54802..abe7b104c 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3048,9 +3048,9 @@ gb_internal bool are_types_identical_unique_tuples(Type *x, Type *y) { return false; } - if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { - return false; - } + // if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { + // return false; + // } // MUTEX_GUARD(&g_type_mutex); return are_types_identical_internal(x, y, true); @@ -3066,9 +3066,9 @@ gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple return false; } - if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { - return false; - } + // if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { + // return false; + // } #if 0 if (x->kind == Type_Named) { From 04cb889aedc3c96e0976202772c1ebccd9b3612d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 11:04:32 +0000 Subject: [PATCH 740/766] Begin interning `ScopeMap` strings --- src/check_builtin.cpp | 43 ++++++++-------- src/check_decl.cpp | 18 ++++--- src/check_expr.cpp | 42 ++++++++-------- src/check_stmt.cpp | 20 ++++---- src/check_type.cpp | 29 ++++++----- src/checker.cpp | 85 ++++++++++++++++--------------- src/checker.hpp | 38 +++++++------- src/docs_writer.cpp | 5 +- src/entity.cpp | 37 ++++++++++---- src/llvm_backend.cpp | 2 +- src/llvm_backend_const.cpp | 3 +- src/llvm_backend_expr.cpp | 22 ++++---- src/llvm_backend_general.cpp | 2 +- src/llvm_backend_proc.cpp | 2 +- src/main.cpp | 2 +- src/name_canonicalization.cpp | 4 +- src/string_interner.cpp | 40 ++++++++++----- src/types.cpp | 95 ++++++++++++++++++++--------------- 18 files changed, 277 insertions(+), 212 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index ea3ca8d3a..4b3e8807e 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -2413,13 +2413,14 @@ gb_internal bool check_builtin_procedure_directive(CheckerContext *c, Operand *o } String name = arg->Ident.token.string; + auto interned = arg->Ident.interned; operand->type = def.type; operand->mode = def.mode; operand->value = def.value; - Entity *found = scope_lookup_current(config_pkg->scope, name); + Entity *found = scope_lookup_current(config_pkg->scope, interned); if (found != nullptr) { if (found->kind != Entity_Constant) { error(arg, "'#config' entity '%.*s' found but expected a constant", LIT(name)); @@ -2804,7 +2805,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } GB_ASSERT(type != nullptr); - String field_name = {}; + InternedString field_name = {}; if (field_arg == nullptr) { error(call, "Expected an identifier for field argument"); @@ -2812,9 +2813,9 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } if (field_arg->kind == Ast_Ident) { - field_name = field_arg->Ident.token.string; + field_name = field_arg->Ident.interned; } - if (field_name.len == 0) { + if (field_name.value == 0) { error(field_arg, "Expected an identifier for field argument"); return false; } @@ -2847,19 +2848,19 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As ERROR_BLOCK(); gbString type_str = type_to_string_shorthand(type); error(ce->args[0], - "'%s' has no field named '%.*s'", type_str, LIT(field_name)); + "'%s' has no field named '%s'", type_str, field_name.cstring()); gb_string_free(type_str); Type *bt = base_type(type); if (bt->kind == Type_Struct) { - check_did_you_mean_type(field_name, bt->Struct.fields); + check_did_you_mean_type(field_name.string(), bt->Struct.fields); } return false; } if (sel.indirect) { gbString type_str = type_to_string_shorthand(type); error(ce->args[0], - "Field '%.*s' is embedded via a pointer in '%s'", LIT(field_name), type_str); + "Field '%s' is embedded via a pointer in '%s'", field_name.cstring(), type_str); gb_string_free(type_str); return false; } @@ -2891,7 +2892,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } GB_ASSERT(type != nullptr); - String field_name = {}; + InternedString field_name = {}; if (field_arg == nullptr) { error(call, "Expected a constant (not-empty) string for field argument"); @@ -2901,9 +2902,9 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As Operand x = {}; check_expr(c, &x, field_arg); if (x.mode == Addressing_Constant && x.value.kind == ExactValue_String) { - field_name = x.value.value_string; + field_name = string_interner_insert(x.value.value_string); } - if (field_name.len == 0) { + if (field_name.value == 0) { error(field_arg, "Expected a constant (non-empty) string for field argument"); return false; } @@ -2921,19 +2922,19 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As ERROR_BLOCK(); gbString type_str = type_to_string_shorthand(type); error(ce->args[0], - "'%s' has no field named '%.*s'", type_str, LIT(field_name)); + "'%s' has no field named '%s'", type_str, field_name.cstring()); gb_string_free(type_str); Type *bt = base_type(type); if (bt->kind == Type_Struct) { - check_did_you_mean_type(field_name, bt->Struct.fields); + check_did_you_mean_type(field_name.string(), bt->Struct.fields); } return false; } if (sel.indirect) { gbString type_str = type_to_string_shorthand(type); error(ce->args[0], - "Field '%.*s' is embedded via a pointer in '%s'", LIT(field_name), type_str); + "Field '%s' is embedded via a pointer in '%s'", field_name.string(), type_str); gb_string_free(type_str); return false; } @@ -4436,7 +4437,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } if (!fail && first_is_field_value) { for_array(i, names) { - Selection sel = lookup_field(et, names[i], false); + Selection sel = lookup_field(et, string_interner_insert(names[i]), false); if (sel.entity == nullptr) { goto soa_zip_end; } @@ -6785,7 +6786,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As return false; } - String field_name = x.value.value_string; + InternedString field_name = string_interner_insert(x.value.value_string); Selection sel = lookup_field(type, field_name, false); operand->mode = Addressing_Constant; @@ -6865,12 +6866,12 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As return false; } - String field_name = x.value.value_string; + InternedString field_name = string_interner_insert(x.value.value_string); Selection sel = lookup_field(type, field_name, false); if (sel.index.count == 0) { gbString t = type_to_string(type); - error(ce->args[1], "'%.*s' is not a field of type %s", LIT(field_name), t); + error(ce->args[1], "'%s' is not a field of type %s", field_name.cstring(), t); gb_string_free(t); return false; } @@ -7625,25 +7626,25 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As return false; } - String field_name = x.value.value_string; + InternedString field_name = string_interner_insert(x.value.value_string); Selection sel = lookup_field(type, field_name, false); if (sel.entity == nullptr) { ERROR_BLOCK(); gbString type_str = type_to_string(bt); error(ce->args[0], - "'%s' has no field named '%.*s'", type_str, LIT(field_name)); + "'%s' has no field named '%s'", type_str, field_name.cstring()); gb_string_free(type_str); if (bt->kind == Type_Struct) { - check_did_you_mean_type(field_name, bt->Struct.fields); + check_did_you_mean_type(field_name.string(), bt->Struct.fields); } return false; } if (sel.indirect) { gbString type_str = type_to_string(bt); error(ce->args[0], - "Field '%.*s' is embedded via a pointer in '%s'", LIT(field_name), type_str); + "Field '%s' is embedded via a pointer in '%s'", field_name.cstring(), type_str); gb_string_free(type_str); return false; } diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 9c849d1e2..4f224affa 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -156,9 +156,12 @@ gb_internal void override_entity_in_scope(Entity *original_entity, Entity *new_e // NOTE(bill): The original_entity's scope may not be same scope that it was inserted into // e.g. file entity inserted into its package scope String original_name = original_entity->token.string; + auto original_intern = entity_interned_name(original_entity); + u32 hash = original_entity->interned_name_hash.load(); + Scope *found_scope = nullptr; Entity *found_entity = nullptr; - scope_lookup_parent(original_entity->scope, original_name, &found_scope, &found_entity); + scope_lookup_parent(original_entity->scope, original_intern, &found_scope, &found_entity, hash); if (found_scope == nullptr) { return; } @@ -170,9 +173,8 @@ gb_internal void override_entity_in_scope(Entity *original_entity, Entity *new_e // Therefore two things can be done: the type can be assigned to state that it // has been "evaluated" and the variant data can be copied across - u32 hash = string_hash(original_name); rw_mutex_lock(&found_scope->mutex); - scope_map_insert(&found_scope->elements, original_name, hash, new_entity); + scope_map_insert(&found_scope->elements, original_intern, hash, new_entity); rw_mutex_unlock(&found_scope->mutex); original_entity->flags |= EntityFlag_Overridden; @@ -993,7 +995,7 @@ gb_internal Entity *init_entity_foreign_library(CheckerContext *ctx, Entity *e) error(ident, "foreign library names must be an identifier"); } else { String name = ident->Ident.token.string; - Entity *found = scope_lookup(ctx->scope, name, ident->Ident.hash); + Entity *found = scope_lookup(ctx->scope, ident->Ident.interned, ident->Ident.hash); if (found == nullptr) { if (is_blank_ident(name)) { @@ -1192,26 +1194,26 @@ gb_internal void check_objc_methods(CheckerContext *ctx, Entity *e, AttributeCon if (!ac.objc_is_class_method) { bool ok = true; for (TypeNameObjCMetadataEntry const &entry : md->value_entries) { - if (entry.name == ac.objc_name) { + if (entry.interned.string() == ac.objc_name) { error(e->token, "Previous declaration of @(objc_name=\"%.*s\")", LIT(ac.objc_name)); ok = false; break; } } if (ok) { - array_add(&md->value_entries, TypeNameObjCMetadataEntry{ac.objc_name, e}); + array_add(&md->value_entries, TypeNameObjCMetadataEntry{string_interner_insert(ac.objc_name), e}); } } else { bool ok = true; for (TypeNameObjCMetadataEntry const &entry : md->type_entries) { - if (entry.name == ac.objc_name) { + if (entry.interned.string() == ac.objc_name) { error(e->token, "Previous declaration of @(objc_name=\"%.*s\")", LIT(ac.objc_name)); ok = false; break; } } if (ok) { - array_add(&md->type_entries, TypeNameObjCMetadataEntry{ac.objc_name, e}); + array_add(&md->type_entries, TypeNameObjCMetadataEntry{string_interner_insert(ac.objc_name), e}); } } } diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 152031fa7..f02322430 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -183,11 +183,11 @@ gb_internal void populate_check_did_you_mean_objc_entity(StringSet *set, Entity if (is_type) { for (auto const &entry : objc_metadata->type_entries) { - string_set_add(set, entry.name); + string_set_add(set, entry.interned.string()); } } else { for (auto const &entry : objc_metadata->value_entries) { - string_set_add(set, entry.name); + string_set_add(set, entry.interned.string()); } } @@ -1329,7 +1329,7 @@ gb_internal bool polymorphic_assign_index(Type **gt_, i64 *dst_count, i64 source Type *gt = *gt_; GB_ASSERT(gt->kind == Type_Generic); - Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.name); + Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name); GB_ASSERT(e != nullptr); if (e->kind == Entity_TypeName) { *gt_ = nullptr; @@ -1430,7 +1430,7 @@ gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, T if (poly->Array.generic_count != nullptr) { Type *gt = poly->Array.generic_count; GB_ASSERT(gt->kind == Type_Generic); - Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.name); + Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name); GB_ASSERT(e != nullptr); if (e->kind == Entity_TypeName) { Type *index = source->EnumeratedArray.index; @@ -1770,9 +1770,9 @@ gb_internal Entity *check_ident(CheckerContext *c, Operand *o, Ast *n, Type *nam GB_ASSERT(n->kind == Ast_Ident); o->mode = Addressing_Invalid; o->expr = n; - String name = n->Ident.token.string; + auto name = n->Ident.token.string; - Entity *e = scope_lookup(c->scope, name, n->Ident.hash); + Entity *e = scope_lookup(c->scope, n->Ident.interned); if (e == nullptr) { if (is_blank_ident(name)) { error(n, "'_' cannot be used as a value"); @@ -5192,7 +5192,7 @@ gb_internal ExactValue get_constant_field_single(CheckerContext *c, ExactValue v continue; } ast_node(fv, FieldValue, elem); - String name = fv->field->Ident.token.string; + auto name = fv->field->Ident.interned; Selection sub_sel = lookup_field(node->tav.type, name, false); if (sub_sel.index.count > 0 && sub_sel.index[0] == index) { @@ -5459,7 +5459,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * } } else */if (node->kind == Ast_Ident) { String name = node->Ident.token.string; - return scope_lookup(c->scope, name, node->Ident.hash); + return scope_lookup(c->scope, node->Ident.interned); } else if (!ident_only) if (node->kind == Ast_SelectorExpr) { ast_node(se, SelectorExpr, node); if (se->token.kind == Token_ArrowRight) { @@ -5481,7 +5481,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * if (op_expr->kind == Ast_Ident) { String op_name = op_expr->Ident.token.string; - Entity *e = scope_lookup(c->scope, op_name, op_expr->Ident.hash); + Entity *e = scope_lookup(c->scope,op_expr->Ident.interned); if (e == nullptr) { return nullptr; } @@ -5494,7 +5494,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * // If you can clean this up, please do but be really careful String import_name = op_name; Scope *import_scope = e->ImportName.scope; - String entity_name = selector->Ident.token.string; + auto entity_name = selector->Ident.interned; check_op_expr = false; entity = scope_lookup_current(import_scope, entity_name); @@ -5520,7 +5520,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * } if (entity == nullptr && selector->kind == Ast_Ident) { - String field_name = selector->Ident.token.string; + auto field_name = selector->Ident.interned; if (is_type_dynamic_array(type_deref(operand.type))) { init_mem_allocator(c->checker); } @@ -5578,7 +5578,7 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod if (op_expr->kind == Ast_Ident) { String op_name = op_expr->Ident.token.string; - Entity *e = scope_lookup(c->scope, op_name, op_expr->Ident.hash); + Entity *e = scope_lookup(c->scope, op_expr->Ident.interned); add_entity_use(c, op_expr, e); expr_entity = e; @@ -5596,6 +5596,7 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod String import_name = op_name; Scope *import_scope = e->ImportName.scope; String entity_name = selector->Ident.token.string; + InternedString entity_name_interned = selector->Ident.interned; if (import_scope == nullptr) { ERROR_BLOCK(); @@ -5606,7 +5607,7 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod } check_op_expr = false; - entity = scope_lookup_current(import_scope, entity_name); + entity = scope_lookup_current(import_scope, entity_name_interned); bool allow_builtin = false; if (!is_entity_declared_for_selector(entity, import_scope, &allow_builtin)) { ERROR_BLOCK(); @@ -5654,7 +5655,7 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod } if (entity == nullptr && selector->kind == Ast_Ident) { - String field_name = selector->Ident.token.string; + auto field_name = selector->Ident.interned; Type *t = type_deref(operand->type); if (t == nullptr) { error(operand->expr, "Cannot use a selector expression on 0-value expression"); @@ -5993,15 +5994,14 @@ gb_internal bool is_type_valid_atomic_type(Type *elem) { gb_internal bool check_identifier_exists(Scope *s, Ast *node, bool nested = false, Scope **out_scope = nullptr) { switch (node->kind) { case_ast_node(i, Ident, node); - String name = i->token.string; if (nested) { - Entity *e = scope_lookup_current(s, name); + Entity *e = scope_lookup_current(s, i->interned, i->hash); if (e != nullptr) { if (out_scope) *out_scope = e->scope; return true; } } else { - Entity *e = scope_lookup(s, name, i->hash); + Entity *e = scope_lookup(s, i->interned); if (e != nullptr) { if (out_scope) *out_scope = e->scope; return true; @@ -8972,7 +8972,7 @@ gb_internal bool attempt_implicit_selector_expr(CheckerContext *c, Operand *o, A Type *enum_type = base_type(th); GB_ASSERT(enum_type->kind == Type_Enum); - String name = ise->selector->Ident.token.string; + auto name = ise->selector->Ident.interned; Entity *e = scope_lookup_current(enum_type->Enum.scope, name); if (e == nullptr) { @@ -9907,8 +9907,9 @@ gb_internal void check_compound_literal_field_values(CheckerContext *c, SliceIdent.token.string; + auto interned = ident->Ident.interned; - Selection sel = lookup_field(type, name, o->mode == Addressing_Type); + Selection sel = lookup_field(type, interned, o->mode == Addressing_Type); bool is_unknown = sel.entity == nullptr; if (is_unknown) { error(ident, "Unknown field '%.*s' in structure literal", LIT(name)); @@ -10863,8 +10864,9 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * continue; } String name = fv->field->Ident.token.string; + auto interned = fv->field->Ident.interned; - Selection sel = lookup_field(type, name, o->mode == Addressing_Type); + Selection sel = lookup_field(type, interned, o->mode == Addressing_Type); if (sel.entity == nullptr) { error(elem, "Unknown field '%.*s' in 'any' literal", LIT(name)); continue; diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index a690308cb..5775c3e53 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -484,7 +484,7 @@ gb_internal Type *check_assignment_variable(CheckerContext *ctx, Operand *lhs, O } if (ident_node != nullptr) { ast_node(i, Ident, ident_node); - e = scope_lookup(ctx->scope, i->token.string, i->hash); + e = scope_lookup(ctx->scope, i->interned, i->hash); if (e != nullptr && e->kind == Entity_Variable) { used = (e->flags & EntityFlag_Used) != 0; // NOTE(bill): Make backup just in case } @@ -791,10 +791,10 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, for (auto const &entry : scope->elements) { Entity *decl = entry.value; if (!is_entity_exported(decl, true)) continue; - String name = scope->elements.keys[entry.hash & (scope->elements.cap-1)]; u32 hash = entry.hash; + auto interned = scope->elements.keys[hash & (scope->elements.cap-1)]; - Entity *found = scope_insert_with_name(ctx->scope, name, hash, decl); + Entity *found = scope_insert_with_name(ctx->scope, interned, hash, decl); if (found != nullptr) { gbString expr_str = expr_to_string(expr); error(us->token, @@ -1067,7 +1067,7 @@ gb_internal void check_unroll_range_stmt(CheckerContext *ctx, Ast *node, u32 mod Entity *found = nullptr; if (!is_blank_ident(str)) { - found = scope_lookup_current(ctx->scope, str); + found = scope_lookup_current(ctx->scope, name->Ident.interned, name->Ident.hash); } if (found == nullptr) { entity = alloc_entity_variable(ctx->scope, token, type, EntityState_Resolved); @@ -1836,10 +1836,10 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) } if (rs->vals.count == 1 && rs->vals[0] && rs->vals[0]->kind == Ast_Ident) { AstIdent *ident = &rs->vals[0]->Ident; - String name = ident->token.string; - Entity *found = scope_lookup(ctx->scope, name, ident->hash); + Entity *found = scope_lookup(ctx->scope, ident->interned, ident->hash); if (found && are_types_identical(found->type, t->BitSet.elem)) { ERROR_BLOCK(); + String name = ident->token.string; gbString s = expr_to_string(expr); error(rs->vals[0], "'%.*s' shadows a previous declaration which might be ambiguous with 'for (%.*s in %s)'", LIT(name), LIT(name), s); error_line("\tSuggestion: Use a different identifier if iteration is wanted, or surround in parentheses if a normal for loop is wanted\n"); @@ -1888,10 +1888,10 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) } if (rs->vals.count == 1 && rs->vals[0] && rs->vals[0]->kind == Ast_Ident) { AstIdent *ident = &rs->vals[0]->Ident; - String name = ident->token.string; - Entity *found = scope_lookup(ctx->scope, name, ident->hash); + Entity *found = scope_lookup(ctx->scope, ident->interned, ident->hash); if (found && are_types_identical(found->type, t->Map.key)) { ERROR_BLOCK(); + String name = ident->token.string; gbString s = expr_to_string(expr); error(rs->vals[0], "'%.*s' shadows a previous declaration which might be ambiguous with 'for (%.*s in %s)'", LIT(name), LIT(name), s); error_line("\tSuggestion: Use a different identifier if iteration is wanted, or surround in parentheses if a normal for loop is wanted\n"); @@ -2032,7 +2032,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) Entity *found = nullptr; if (!is_blank_ident(str)) { - found = scope_lookup_current(ctx->scope, str); + found = scope_lookup_current(ctx->scope, name->Ident.interned, name->Ident.hash); } if (found == nullptr) { entity = alloc_entity_variable(ctx->scope, token, type, EntityState_Resolved); @@ -2126,7 +2126,7 @@ gb_internal void check_value_decl_stmt(CheckerContext *ctx, Ast *node, u32 mod_f Entity *found = nullptr; // NOTE(bill): Ignore assignments to '_' if (!is_blank_ident(str)) { - found = scope_lookup_current(ctx->scope, str); + found = scope_lookup_current(ctx->scope, name->Ident.interned, name->Ident.hash); new_name_count += 1; } if (found == nullptr) { diff --git a/src/check_type.cpp b/src/check_type.cpp index 9612fc4f6..bd86e7c3d 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -5,7 +5,9 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para gb_internal void populate_using_array_index(CheckerContext *ctx, Ast *node, AstField *field, Type *t, String name, i32 idx) { t = base_type(t); GB_ASSERT(t->kind == Type_Array); - Entity *e = scope_lookup_current(ctx->scope, name); + InternedString interned = string_interner_insert(name); + + Entity *e = scope_lookup_current(ctx->scope, interned); if (e != nullptr) { gbString str = nullptr; defer (gb_string_free(str)); @@ -47,7 +49,8 @@ gb_internal void populate_using_entity_scope(CheckerContext *ctx, Ast *node, Ast for (Entity *f : t->Struct.fields) { GB_ASSERT(f->kind == Entity_Variable); String name = f->token.string; - Entity *e = scope_lookup_current(ctx->scope, name); + InternedString interned = entity_interned_name(f); + Entity *e = scope_lookup_current(ctx->scope, interned); if (e != nullptr && name != "_") { gbString ot = type_to_string(original_type); // TODO(bill): Better type error @@ -423,7 +426,7 @@ gb_internal Type *check_record_polymorphic_params(CheckerContext *ctx, Ast *poly Ast *s = type_expr->TypeidType.specialization; specialization = check_type(ctx, s); } - type = alloc_type_generic(ctx->scope, 0, str_lit(""), specialization); + type = alloc_type_generic(ctx->scope, 0, string_interner_insert(str_lit("")), specialization); } else { type = check_type(ctx, type_expr); if (is_type_polymorphic(type)) { @@ -981,7 +984,9 @@ gb_internal void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *nam e->Constant.docs = docs; e->Constant.comment = comment; - if (scope_lookup_current(ctx->scope, name) != nullptr) { + auto interned = entity_interned_name(e); + + if (scope_lookup_current(ctx->scope, interned) != nullptr) { error(ident, "'%.*s' is already declared in this enumeration", LIT(name)); } else { add_entity(ctx, ctx->scope, nullptr, e); @@ -1043,6 +1048,7 @@ gb_internal void check_bit_field_type(CheckerContext *ctx, Type *bit_field_type, CommentGroup *comment = f->comment; String name = f->name->Ident.token.string; + InternedString interned = f->name->Ident.interned; if (f->type == nullptr) { error(field, "A bit_field's field must have a type"); @@ -1093,7 +1099,7 @@ gb_internal void check_bit_field_type(CheckerContext *ctx, Type *bit_field_type, gb_string_free(s); } - if (scope_lookup_current(ctx->scope, name) != nullptr) { + if (scope_lookup_current(ctx->scope, interned) != nullptr) { error(f->name, "'%.*s' is already declared in this bit_field", LIT(name)); } else { i64 bit_size_i64 = exact_value_to_i64(bit_size); @@ -1513,7 +1519,7 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { - Entity *e = scope_lookup(st->Generic.scope, st->Generic.name); + Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name); GB_ASSERT(e != nullptr); if (modify_type) { e->kind = Entity_Constant; @@ -1566,7 +1572,7 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { - Entity *e = scope_lookup(st->Generic.scope, st->Generic.name); + Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name); GB_ASSERT(e != nullptr); if (modify_type) { e->kind = Entity_Constant; @@ -1905,7 +1911,7 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para detemine_type_from_operand = true; type = t_invalid; } else { - type = alloc_type_generic(ctx->scope, 0, str_lit(""), specialization); + type = alloc_type_generic(ctx->scope, 0, string_interner_insert(str_lit("")), specialization); } } else { type = t_typeid; @@ -2330,8 +2336,7 @@ gb_internal bool ast_references_poly_params(Scope *scope, Ast *node) { } switch (node->kind) { case Ast_Ident: { - String name = node->Ident.token.string; - Entity *e = scope_lookup(scope, name); + Entity *e = scope_lookup(scope, node->Ident.interned, node->Ident.hash); if (e != nullptr && e->kind == Entity_TypeName && e->type != nullptr && e->type->kind == Type_Generic) { return true; } @@ -2408,7 +2413,7 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res param_value = handle_parameter_value(ctx, nullptr, &type, default_value, false); } else { if (ctx->allow_polymorphic_types && ast_references_poly_params(ctx->scope, field->type)) { - type = alloc_type_generic(ctx->scope, 0, str_lit("$deferred_return"), nullptr); + type = alloc_type_generic(ctx->scope, 0, string_interner_insert(str_lit("$deferred_return")), nullptr); } else { type = check_type(ctx, field->type); } @@ -3534,7 +3539,7 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T Ast *s = pt->specialization; specific = check_type(&c, s); } - Type *t = alloc_type_generic(ctx->scope, 0, token.string, specific); + Type *t = alloc_type_generic(ctx->scope, 0, ident->Ident.interned, specific); if (ctx->allow_polymorphic_types) { if (ctx->disallow_polymorphic_return_types) { error(ident, "Undeclared polymorphic parameter '%.*s' in return type", LIT(token.string)); diff --git a/src/checker.cpp b/src/checker.cpp index aca0e90a6..021b03dc9 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -372,10 +372,10 @@ gb_internal void check_close_scope(CheckerContext *c) { } -gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash) { +gb_internal Entity *scope_lookup_current(Scope *s, InternedString name, u32 hash) { // Entity **found = string_map_get(&s->elements, name); if (hash == 0) { - hash = string_hash(name); + hash = name.hash(); } Entity *found = scope_map_get(&s->elements, name, hash); if (found) { @@ -387,13 +387,13 @@ gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash) gb_global std::atomic in_single_threaded_checker_stage; -gb_internal void scope_lookup_parent(Scope *scope, String const &name, Scope **scope_, Entity **entity_, u32 hash) { +gb_internal void scope_lookup_parent(Scope *scope, InternedString name, Scope **scope_, Entity **entity_, u32 hash) { bool is_single_threaded = in_single_threaded_checker_stage.load(std::memory_order_relaxed); if (scope != nullptr) { bool gone_thru_proc = false; bool gone_thru_package = false; if (!hash) { - hash = string_hash(name); + hash = name.hash(); } for (Scope *s = scope; s != nullptr; s = s->parent) { Entity *found = nullptr; @@ -434,14 +434,14 @@ gb_internal void scope_lookup_parent(Scope *scope, String const &name, Scope **s if (scope_) *scope_ = nullptr; } -gb_internal Entity *scope_lookup(Scope *s, String const &name, u32 hash) { +gb_internal Entity *scope_lookup(Scope *s, InternedString interned, u32 hash) { Entity *entity = nullptr; - scope_lookup_parent(s, name, nullptr, &entity, hash); + scope_lookup_parent(s, interned, nullptr, &entity, hash); return entity; } -gb_internal Entity *scope_insert_with_name_no_mutex(Scope *s, String const &name, u32 hash, Entity *entity) { - if (name == "") { +gb_internal Entity *scope_insert_with_name_no_mutex(Scope *s, InternedString name, u32 hash, Entity *entity) { + if (name.value == 0) { return nullptr; } Entity *found = nullptr; @@ -476,8 +476,8 @@ end:; } -gb_internal Entity *scope_insert_with_name(Scope *s, String const &name, u32 hash, Entity *entity) { - if (name == "") { +gb_internal Entity *scope_insert_with_name(Scope *s, InternedString name, u32 hash, Entity *entity) { + if (name.value == 0) { return nullptr; } Entity *found = nullptr; @@ -519,15 +519,9 @@ end:; } gb_internal Entity *scope_insert(Scope *s, Entity *entity) { - String name = entity->token.string; - u32 hash = 0; - Ast *ident = entity->identifier.load(std::memory_order_relaxed); - if (ident != nullptr) { - hash = ident->Ident.hash; - } - if (hash == 0) { - hash = string_hash(name); - } + auto name = entity_interned_name(entity); + u32 hash = entity->interned_name_hash.load(std::memory_order_relaxed); + GB_ASSERT(hash != 0); if (in_single_threaded_checker_stage.load(std::memory_order_relaxed)) { return scope_insert_with_name_no_mutex(s, name, hash, entity); } else { @@ -536,15 +530,9 @@ gb_internal Entity *scope_insert(Scope *s, Entity *entity) { } gb_internal Entity *scope_insert_no_mutex(Scope *s, Entity *entity) { - String name = entity->token.string; - u32 hash = 0; - Ast *ident = entity->identifier.load(std::memory_order_relaxed); - if (ident != nullptr) { - hash = ident->Ident.hash; - } - if (hash == 0) { - hash = string_hash(name); - } + auto name = string_interner_insert(entity->token.string); + u32 hash = entity->interned_name_hash.load(std::memory_order_relaxed); + GB_ASSERT(hash != 0); return scope_insert_with_name_no_mutex(s, name, hash, entity); } @@ -679,7 +667,7 @@ gb_internal bool check_vet_shadowing(Checker *c, Entity *e, VettedEntity *ve) { return false; } - Entity *shadowed = scope_lookup(parent, name); + Entity *shadowed = scope_lookup(parent, entity_interned_name(e)); if (shadowed == nullptr) { return false; } @@ -961,8 +949,9 @@ gb_internal AstPackage *try_get_core_package(CheckerInfo *info, String name) { gb_internal void add_package_dependency(CheckerContext *c, char const *package_name, char const *name, bool required=false) { String n = make_string_c(name); + InternedString key = string_interner_insert(n); AstPackage *p = get_core_package(&c->checker->info, make_string_c(package_name)); - Entity *e = scope_lookup(p->scope, n); + Entity *e = scope_lookup(p->scope, key); GB_ASSERT_MSG(e != nullptr, "%s", name); GB_ASSERT(c->decl != nullptr); e->flags |= EntityFlag_Used; @@ -974,8 +963,9 @@ gb_internal void add_package_dependency(CheckerContext *c, char const *package_n gb_internal void try_to_add_package_dependency(CheckerContext *c, char const *package_name, char const *name) { String n = make_string_c(name); + InternedString key = string_interner_insert(n); AstPackage *p = get_core_package(&c->checker->info, make_string_c(package_name)); - Entity *e = scope_lookup(p->scope, n); + Entity *e = scope_lookup(p->scope, key); if (e == nullptr) { return; } @@ -1373,6 +1363,9 @@ gb_internal void init_universal(void) { BuiltinProcId id = cast(BuiltinProcId)i; String name = builtin_procs[i].name; if (name != "") { + u32 hash = 0; + InternedString interned = string_interner_insert(name, 0, &hash); + Entity *entity = alloc_entity(Entity_Builtin, nullptr, make_token_ident(name), t_invalid); entity->Builtin.id = id; switch (builtin_procs[i].pkg) { @@ -1381,7 +1374,7 @@ gb_internal void init_universal(void) { break; case BuiltinProcPkg_intrinsics: add_global_entity(entity, intrinsics_pkg->scope); - GB_ASSERT(scope_lookup_current(intrinsics_pkg->scope, name) != nullptr); + GB_ASSERT(scope_lookup_current(intrinsics_pkg->scope, interned, hash) != nullptr); break; } } @@ -2763,7 +2756,7 @@ gb_internal void add_dependency_to_set_threaded(Checker *c, Entity *entity) { gb_internal void force_add_dependency_entity(Checker *c, Scope *scope, String const &name) { - Entity *e = scope_lookup(scope, name); + Entity *e = scope_lookup(scope, string_interner_insert(name)); if (e == nullptr) { return; } @@ -2775,7 +2768,9 @@ gb_internal void force_add_dependency_entity(Checker *c, Scope *scope, String co gb_internal void collect_testing_procedures_of_package(Checker *c, AstPackage *pkg) { AstPackage *testing_package = get_core_package(&c->info, str_lit("testing")); Scope *testing_scope = testing_package->scope; - Entity *test_signature = scope_lookup_current(testing_scope, str_lit("Test_Signature")); + u32 hash = 0; + InternedString interned = string_interner_insert(str_lit("Test_Signature"), 0, &hash); + Entity *test_signature = scope_lookup_current(testing_scope, interned, hash); Scope *s = pkg->scope; for (auto const &entry : s->elements) { @@ -3229,7 +3224,9 @@ gb_internal void check_single_global_entity(Checker *c, Entity *e, DeclInfo *d); gb_internal Entity *find_core_entity(Checker *c, String name) { - Entity *e = scope_lookup_current(c->info.runtime_package->scope, name); + u32 hash = 0; + InternedString interned = string_interner_insert(name, 0, &hash); + Entity *e = scope_lookup_current(c->info.runtime_package->scope, interned, hash); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s'\n" , LIT(name)); @@ -3239,7 +3236,9 @@ gb_internal Entity *find_core_entity(Checker *c, String name) { } gb_internal Type *find_core_type(Checker *c, String name) { - Entity *e = scope_lookup_current(c->info.runtime_package->scope, name); + u32 hash = 0; + InternedString interned = string_interner_insert(name, 0, &hash); + Entity *e = scope_lookup_current(c->info.runtime_package->scope, interned, hash); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s'\n" , LIT(name)); @@ -3254,8 +3253,10 @@ gb_internal Type *find_core_type(Checker *c, String name) { gb_internal Entity *find_entity_in_pkg(CheckerInfo *info, String const &pkg, String const &name) { + u32 hash = 0; + InternedString interned = string_interner_insert(name, 0, &hash); AstPackage *package = get_core_package(info, pkg); - Entity *e = scope_lookup_current(package->scope, name); + Entity *e = scope_lookup_current(package->scope, interned, hash); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s.%.*s'\n", LIT(pkg), LIT(name)); // NOTE(bill): This will exit the program as it's cannot continue without it! @@ -3264,8 +3265,10 @@ gb_internal Entity *find_entity_in_pkg(CheckerInfo *info, String const &pkg, Str } gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String const &name) { + u32 hash = 0; + InternedString interned = string_interner_insert(name, 0, &hash); AstPackage *package = get_core_package(info, pkg); - Entity *e = scope_lookup_current(package->scope, name); + Entity *e = scope_lookup_current(package->scope, interned, hash); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s.%.*s'\n", LIT(pkg), LIT(name)); // NOTE(bill): This will exit the program as it's cannot continue without it! @@ -4558,7 +4561,9 @@ gb_internal void check_builtin_attributes(CheckerContext *ctx, Entity *e, Array< if (name == "builtin") { mutex_lock(&ctx->info->builtin_mutex); add_entity(ctx, builtin_pkg->scope, nullptr, e); - GB_ASSERT(scope_lookup(builtin_pkg->scope, e->token.string) != nullptr); + auto interned = entity_interned_name(e); + u32 hash = e->interned_name_hash.load(); + GB_ASSERT(scope_lookup(builtin_pkg->scope, interned, hash) != nullptr); if (value != nullptr) { error(value, "'builtin' cannot have a field value"); } @@ -7514,7 +7519,7 @@ gb_internal void check_parsed_files(Checker *c) { Scope *s = c->info.init_scope; GB_ASSERT(s != nullptr); GB_ASSERT(s->flags&ScopeFlag_Init); - Entity *e = scope_lookup_current(s, str_lit("main")); + Entity *e = scope_lookup_current(s, string_interner_insert(str_lit("main"))); if (e == nullptr) { Token token = {}; token.pos.file_id = 0; diff --git a/src/checker.hpp b/src/checker.hpp index ef68f9c74..335794535 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -278,12 +278,12 @@ struct ScopeMapSlot { enum { SCOPE_MAP_INLINE_CAP = 16 }; struct ScopeMap { - String inline_keys [SCOPE_MAP_INLINE_CAP]; - ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; - String * keys; - ScopeMapSlot *slots; - u32 count; - u32 cap; + InternedString inline_keys [SCOPE_MAP_INLINE_CAP]; + ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; + InternedString *keys; + ScopeMapSlot * slots; + u32 count; + u32 cap; }; gb_internal gb_inline u32 scope_map_max_load(u32 cap) { @@ -298,8 +298,8 @@ gb_internal gb_inline void scope_map_init(ScopeMap *m) { gb_internal Entity *scope_map_insert_for_rehash( - String *keys, ScopeMapSlot *slots, u32 mask, - String key, u32 hash, Entity *value) { + InternedString *keys, ScopeMapSlot *slots, u32 mask, + InternedString key, u32 hash, Entity *value) { u32 pos = hash & mask; u32 dist = 0; @@ -316,7 +316,7 @@ gb_internal Entity *scope_map_insert_for_rehash( u32 existing_dist = (pos - s->hash) & mask; if (dist > existing_dist) { - String tmp_key = keys[pos]; + auto tmp_key = keys[pos]; u32 tmp_hash = s->hash; Entity *tmp_value = s->value; @@ -335,12 +335,12 @@ gb_internal Entity *scope_map_insert_for_rehash( } } -gb_internal gb_inline void scope_map_allocate_entries(u32 cap, String **keys, ScopeMapSlot **slots) { +gb_internal gb_inline void scope_map_allocate_entries(u32 cap, InternedString **keys, ScopeMapSlot **slots) { Arena *arena = get_arena(ThreadArena_Permanent); - isize size = (gb_size_of(String) + gb_size_of(ScopeMapSlot)) * cap; + isize size = (gb_size_of(InternedString) + gb_size_of(ScopeMapSlot)) * cap; u8 *data = cast(u8 *)arena_alloc(arena, size, 8); - *keys = cast(String *)data; + *keys = cast(InternedString *)data; *slots = cast(ScopeMapSlot *)(*keys + cap); // *keys = permanent_alloc_array(cap); @@ -352,8 +352,8 @@ gb_internal void scope_map_grow(ScopeMap *m) { u32 new_cap = m->cap << 1; u32 new_mask = new_cap - 1; - String * new_keys; - ScopeMapSlot *new_slots; + InternedString *new_keys; + ScopeMapSlot * new_slots; scope_map_allocate_entries(new_cap, &new_keys, &new_slots); if (m->count > 0) { @@ -383,7 +383,7 @@ gb_internal void scope_map_reserve(ScopeMap *m, isize capacity) { -gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity *value) { +gb_internal Entity *scope_map_insert(ScopeMap *m, InternedString key, u32 hash, Entity *value) { if (m->slots == nullptr) { scope_map_init(m); } @@ -415,7 +415,7 @@ gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity * u32 existing_dist = (pos - s->hash) & mask; if (dist > existing_dist) { - String tmp_key = m->keys[pos]; + auto tmp_key = m->keys[pos]; u32 tmp_hash = s->hash; Entity *tmp_value = s->value; @@ -434,7 +434,7 @@ gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity * } } -gb_internal Entity *scope_map_get(ScopeMap *m, String key, u32 hash) { +gb_internal Entity *scope_map_get(ScopeMap *m, InternedString key, u32 hash) { u32 mask = m->cap-1; u32 pos = hash & mask; u32 dist = 0; @@ -883,8 +883,8 @@ gb_internal Entity *entity_of_node(Ast *expr); // gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash=0); -gb_internal Entity *scope_lookup (Scope *s, String const &name, u32 hash=0); -gb_internal void scope_lookup_parent (Scope *s, String const &name, Scope **scope_, Entity **entity_, u32 hash=0); +gb_internal Entity *scope_lookup (Scope *s, InternedString interned, u32 hash=0); +gb_internal void scope_lookup_parent (Scope *s, InternedString name, Scope **scope_, Entity **entity_, u32 hash=0); gb_internal Entity *scope_insert (Scope *s, Entity *entity); diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 89b7802ae..3f5d4876a 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -1050,7 +1050,8 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit defer (array_free(&entries)); for (auto const &element : pkg->scope->elements) { - String name = pkg->scope->elements.keys[element.hash & (pkg->scope->elements.cap-1)]; + u32 hash = element.hash; + auto interned = pkg->scope->elements.keys[hash & (pkg->scope->elements.cap-1)]; Entity *e = element.value; switch (e->kind) { case Entity_Invalid: @@ -1079,7 +1080,7 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit } OdinDocScopeEntry entry = {}; - entry.name = odin_doc_write_string(w, name); + entry.name = odin_doc_write_string(w, interned.string()); entry.entity = odin_doc_add_entity(w, e); array_add(&entries, entry); } diff --git a/src/entity.cpp b/src/entity.cpp index 5fcd62071..2f0046972 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -141,7 +141,7 @@ enum ProcedureOptimizationMode : u8 { BlockingMutex global_type_name_objc_metadata_mutex; struct TypeNameObjCMetadataEntry { - String name; + InternedString interned; Entity *entity; }; struct TypeNameObjCMetadata { @@ -169,6 +169,10 @@ struct Entity { Scope * scope; Type * type; std::atomic identifier; // Can be nullptr + + std::atomic interned_name; + std::atomic interned_name_hash; + DeclInfo * decl_info; std::atomic parent_proc_decl; // nullptr if in file/global scope AstFile * file; @@ -300,6 +304,16 @@ struct Entity { }; }; +gb_internal InternedString entity_interned_name(Entity *entity) { + auto name = entity->interned_name.load(); + if (name.value == 0) { + name = string_interner_insert(entity->token.string); + entity->interned_name.store(name); + entity->interned_name_hash.store(name.hash()); + } + return name; +} + gb_internal bool is_entity_kind_exported(EntityKind kind, bool allow_builtin = false) { switch (kind) { case Entity_Builtin: @@ -345,16 +359,17 @@ gb_internal bool entity_has_deferred_procedure(Entity *e) { gb_global std::atomic global_entity_id; // NOTE(bill): This exists to allow for bulk allocations of entities all at once to improve performance for type generation -#define INTERNAL_ENTITY_INIT(entity, kind_, scope_, token_, type_) do { \ - (entity)->kind = (kind_); \ - (entity)->state = EntityState_Unresolved; \ - (entity)->scope = (scope_); \ - (entity)->token = (token_); \ - (entity)->type = (type_); \ - (entity)->id = 1 + global_entity_id.fetch_add(1); \ - if ((token_).pos.file_id) { \ - entity->file = thread_unsafe_get_ast_file_from_id((token_).pos.file_id); \ - } \ +#define INTERNAL_ENTITY_INIT(e_, kind_, scope_, token_, type_) do { \ + (e_)->kind = (kind_); \ + (e_)->state = EntityState_Unresolved; \ + (e_)->scope = (scope_); \ + (e_)->token = (token_); \ + (e_)->type = (type_); \ + (e_)->id = 1 + global_entity_id.fetch_add(1); \ + if ((token_).pos.file_id) { \ + e_->file = thread_unsafe_get_ast_file_from_id((token_).pos.file_id); \ + } \ + entity_interned_name(e_); \ } while (0) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index fac3e3354..b2246c90e 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2946,7 +2946,7 @@ gb_internal lbProcedure *lb_create_main_procedure(lbModule *m, lbProcedure *star AstPackage *pkg = get_runtime_package(m->info); String name = str_lit("exit"); - Entity *e = scope_lookup_current(pkg->scope, name); + Entity *e = scope_lookup_current(pkg->scope, string_interner_insert(name)); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s.%.*s'\n", LIT(pkg->name), LIT(name)); } diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 954545db6..762243ee3 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -1819,11 +1819,12 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb for (isize i = 0; i < elem_count; i++) { ast_node(fv, FieldValue, cl->elems[i]); String name = fv->field->Ident.token.string; + InternedString interned = fv->field->Ident.interned; TypeAndValue tav = fv->value->tav; GB_ASSERT(tav.mode != Addressing_Invalid); - Selection sel = lookup_field(type, name, false); + Selection sel = lookup_field(type, interned, false); GB_ASSERT(!sel.indirect); Entity *f = type->Struct.fields[sel.index[0]]; diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index c71409a8e..39cdcd54f 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -4362,9 +4362,9 @@ gb_internal lbAddr lb_get_soa_variable_addr(lbProcedure *p, Entity *e) { } gb_internal lbValue lb_get_using_variable(lbProcedure *p, Entity *e) { GB_ASSERT(e->kind == Entity_Variable && e->flags & EntityFlag_Using); - String name = e->token.string; + InternedString interned = entity_interned_name(e); Entity *parent = e->using_parent; - Selection sel = lookup_field(parent->type, name, false); + Selection sel = lookup_field(parent->type, interned, false); GB_ASSERT(sel.entity != nullptr); lbValue *pv = map_get(&p->module->values, parent); @@ -4379,7 +4379,7 @@ gb_internal lbValue lb_get_using_variable(lbProcedure *p, Entity *e) { } else if (pv != nullptr) { v = *pv; } else { - GB_ASSERT_MSG(e->using_expr != nullptr, "%.*s", LIT(name)); + GB_ASSERT_MSG(e->using_expr != nullptr, "%.*s", LIT(e->token.string)); v = lb_build_addr_ptr(p, e->using_expr); } GB_ASSERT(v.value != nullptr); @@ -5362,8 +5362,8 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { for (Ast *elem : cl->elems) { ast_node(fv, FieldValue, elem); - String name = fv->field->Ident.token.string; - Selection sel = lookup_field(bt, name, false); + InternedString interned = fv->field->Ident.interned; + Selection sel = lookup_field(bt, interned, false); GB_ASSERT(sel.is_bit_field); GB_ASSERT(!sel.indirect); GB_ASSERT(sel.index.count == 1); @@ -5556,8 +5556,8 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { if (elem->kind == Ast_FieldValue) { ast_node(fv, FieldValue, elem); - String name = fv->field->Ident.token.string; - Selection sel = lookup_field(bt, name, false); + InternedString interned = fv->field->Ident.interned; + Selection sel = lookup_field(bt, interned, false); GB_ASSERT(!sel.indirect); elem = fv->value; @@ -5811,12 +5811,12 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { if (elem->kind == Ast_FieldValue) { ast_node(fv, FieldValue, elem); - Selection sel = lookup_field(bt, fv->field->Ident.token.string, false); + Selection sel = lookup_field(bt, fv->field->Ident.interned, false); index = sel.index[0]; elem = fv->value; } else { TypeAndValue tav = type_and_value_of_expr(elem); - Selection sel = lookup_field(bt, field_names[field_index], false); + Selection sel = lookup_field(bt, string_interner_insert(field_names[field_index]), false); index = sel.index[0]; } @@ -5958,7 +5958,7 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { case_ast_node(se, SelectorExpr, expr); Ast *sel_node = unparen_expr(se->selector); if (sel_node->kind == Ast_Ident) { - String selector = sel_node->Ident.token.string; + InternedString selector = sel_node->Ident.interned; TypeAndValue tav = type_and_value_of_expr(se->expr); if (tav.mode == Addressing_Invalid) { @@ -5978,7 +5978,7 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { GB_ASSERT(e->kind == Entity_Procedure); return lb_addr(lb_find_value_from_entity(p->module, e)); } - GB_PANIC("Unreachable %.*s", LIT(selector)); + GB_PANIC("Unreachable %s", selector.cstring()); } if (se->swizzle_count > 0) { diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 35a0f5f65..b15eb8333 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -3406,7 +3406,7 @@ gb_internal lbAddr lb_add_global_generated_from_procedure(lbProcedure *p, Type * gb_internal lbValue lb_find_runtime_value(lbModule *m, String const &name) { AstPackage *p = m->info->runtime_package; - Entity *e = scope_lookup_current(p->scope, name); + Entity *e = scope_lookup_current(p->scope, string_interner_insert(name)); return lb_find_value_from_entity(m, e); } gb_internal lbValue lb_find_package_value(lbModule *m, String const &pkg, String const &name) { diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 121b8c550..36d736b0f 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1012,7 +1012,7 @@ gb_internal lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue gb_internal lbValue lb_lookup_runtime_procedure(lbModule *m, String const &name) { AstPackage *pkg = m->info->runtime_package; - Entity *e = scope_lookup_current(pkg->scope, name); + Entity *e = scope_lookup_current(pkg->scope, string_interner_insert(name)); GB_ASSERT_MSG(e != nullptr, "Runtime procedure not found: %s", name); return lb_find_procedure_value_from_entity(m, e); } diff --git a/src/main.cpp b/src/main.cpp index 1f0df6add..4d68d3d73 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3588,7 +3588,7 @@ int main(int arg_count, char const **arg_ptr) { MAIN_TIME_SECTION("initialization"); - g_string_interner = string_interner_create(); + init_string_interner(); init_global_error_collector(); init_keyword_hash_table(); init_terminal(); diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index a99dec0af..1a4ca6439 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -559,6 +559,8 @@ gb_internal void write_canonical_parent_prefix(TypeWriter *w, Entity *e) { // no prefix return; } + InternedString interned = entity_interned_name(e); + if (e->parent_proc_decl.load(std::memory_order_relaxed)) { Entity *p = e->parent_proc_decl.load(std::memory_order_relaxed)->entity; write_canonical_parent_prefix(w, p); @@ -569,7 +571,7 @@ gb_internal void write_canonical_parent_prefix(TypeWriter *w, Entity *e) { } type_writer_appendc(w, CANONICAL_NAME_SEPARATOR); - } else if (e->pkg && (scope_lookup_current(e->pkg->scope, e->token.string) == e)) { + } else if (e->pkg && (scope_lookup_current(e->pkg->scope, interned) == e)) { type_writer_append(w, e->pkg->name.text, e->pkg->name.len); if (e->pkg->name == "llvm") { type_writer_appendc(w, "$"); diff --git a/src/string_interner.cpp b/src/string_interner.cpp index f8496e3b0..660dbc61d 100644 --- a/src/string_interner.cpp +++ b/src/string_interner.cpp @@ -10,8 +10,11 @@ struct InternedString { return this->value == other.value; } - String load() const; - char const *load_cstring() const; + String string() const; + char const *cstring() const; + u32 hash() const; + + bool is_blank() const; }; struct alignas(STRING_INTERN_CACHE_LINE) StringInternCell { std::atomic hashes [STRING_INTERNER_CELL_WIDTH]; @@ -38,10 +41,11 @@ struct StringInterner { }; gb_internal StringInterner *string_interner_create(); -gb_internal InternedString string_interner_insert(String str, u32 hash=0); +gb_internal InternedString string_interner_insert(String str, u32 hash=0, u32 *new_hash_=nullptr); gb_internal String string_interner_load(InternedString interned); gb_global StringInterner *g_string_interner; +gb_global InternedString g_interned_blank_ident; struct StringInternerThreadLocalArena { u8 *data; @@ -52,7 +56,7 @@ gb_thread_local gb_global StringInternerThreadLocalArena g_interner_arena; gb_internal void string_interner_thread_local_arena_init(StringInternerThreadLocalArena *tl_arena); gb_internal void *string_interner_thread_local_arena_alloc(StringInternerThreadLocalArena *tl_arena, isize size, isize alignment); -gb_internal StringInterner *string_interner_create() { +gb_internal void init_string_interner() { StaticArena arena = {}; static_arena_init(&arena, 1<<30, STATIC_ARENA_DEFAULT_COMMIT_BLOCK_SIZE); @@ -63,7 +67,10 @@ gb_internal StringInterner *string_interner_create() { interner->cell_mask = cell_mask; interner->cells = cast(StringInternCell *)static_arena_alloc(&interner->arena, cell_size * gb_size_of(StringInternCell), STRING_INTERN_CACHE_LINE); interner->track_count = false; - return interner; + + g_string_interner = interner; + + g_interned_blank_ident = string_interner_insert(str_lit("_")); } gb_internal String string_interner_load(InternedString interned) { @@ -89,22 +96,31 @@ gb_internal char const *string_interner_load_cstring(InternedString interned) { return cast(char const *)text; } -String InternedString::load() const { +String InternedString::string() const { return string_interner_load(*this); } -char const *InternedString::load_cstring() const { +char const *InternedString::cstring() const { return string_interner_load_cstring(*this); } +u32 InternedString::hash() const { + String s = string_interner_load(*this); + return string_hash(s); +} +bool InternedString::is_blank() const { + return this->value == g_interned_blank_ident.value; +} -gb_internal InternedString string_interner_insert(String str, u32 hash) { +gb_internal InternedString string_interner_insert(String str, u32 hash, u32 *new_hash_) { StringInterner* interner = g_string_interner; if (str.len == 0) { + if (new_hash_) *new_hash_ = string_hash(String{}); return {}; } if (hash == 0) { hash = string_hash(str); } + if (new_hash_) *new_hash_ = hash; u64 cell_idx = hash & interner->cell_mask; StringInternCell *cell = &interner->cells[cell_idx]; @@ -175,14 +191,14 @@ gb_internal InternedString string_interner_insert(String str, u32 hash) { return offset; } -gb_internal char const *string_intern_cstring(String str) { - InternedString i = string_interner_insert(str, 0); +gb_internal char const *string_intern_cstring(String str, u32 *hash_=nullptr) { + InternedString i = string_interner_insert(str, 0, hash_); return string_interner_load_cstring(i); } -gb_internal String string_intern_string(String str) { - InternedString i = string_interner_insert(str, 0); +gb_internal String string_intern_string(String str, u32 *hash_=nullptr) { + InternedString i = string_interner_insert(str, 0, hash_); return string_interner_load(i); } diff --git a/src/types.cpp b/src/types.cpp index abe7b104c..f4b708e57 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -226,6 +226,7 @@ struct TypeNamed { TYPE_KIND(Generic, struct { \ i64 id; \ String name; \ + InternedString interned_name; \ Type * specialized; \ Scope * scope; \ Entity *entity; \ @@ -986,10 +987,11 @@ gb_internal Type *alloc_type(TypeKind kind) { } -gb_internal Type *alloc_type_generic(Scope *scope, i64 id, String name, Type *specialized) { +gb_internal Type *alloc_type_generic(Scope *scope, i64 id, InternedString interned_name, Type *specialized) { Type *t = alloc_type(Type_Generic); t->Generic.id = id; - t->Generic.name = name; + t->Generic.name = interned_name.string(); + t->Generic.interned_name = interned_name; t->Generic.specialized = specialized; t->Generic.scope = scope; return t; @@ -3569,9 +3571,9 @@ gb_internal ProcTypeOverloadKind are_proc_types_overload_safe(Type *x, Type *y) -gb_internal Selection lookup_field_with_selection(Type *type_, String field_name, bool is_type, Selection sel, bool allow_blank_ident=false); +gb_internal Selection lookup_field_with_selection(Type *type_, InternedString field_name, bool is_type, Selection sel, bool allow_blank_ident=false); -gb_internal Selection lookup_field(Type *type_, String field_name, bool is_type, bool allow_blank_ident=false) { +gb_internal Selection lookup_field(Type *type_, InternedString field_name, bool is_type, bool allow_blank_ident=false) { return lookup_field_with_selection(type_, field_name, is_type, empty_selection, allow_blank_ident); } @@ -3624,13 +3626,13 @@ gb_internal Selection lookup_field_from_index(Type *type, i64 index) { return empty_selection; } -gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash=0); +gb_internal Entity *scope_lookup_current(Scope *s, InternedString name, u32 hash=0); gb_internal bool has_type_got_objc_class_attribute(Type *t); -gb_internal Selection lookup_field_with_selection(Type *type_, String field_name, bool is_type, Selection sel, bool allow_blank_ident) { +gb_internal Selection lookup_field_with_selection(Type *type_, InternedString field_name, bool is_type, Selection sel, bool allow_blank_ident) { GB_ASSERT(type_ != nullptr); - if (!allow_blank_ident && is_blank_ident(field_name)) { + if (!allow_blank_ident && field_name.is_blank()) { return empty_selection; } @@ -3652,7 +3654,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name defer (mutex_unlock(md->mutex)); for (TypeNameObjCMetadataEntry const &entry : md->type_entries) { GB_ASSERT(entry.entity->kind == Entity_Procedure || entry.entity->kind == Entity_ProcGroup); - if (entry.name == field_name) { + if (entry.interned == field_name) { sel.entity = entry.entity; sel.pseudo_field = true; return sel; @@ -3679,7 +3681,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name for_array(i, type->Enum.fields) { Entity *f = type->Enum.fields[i]; GB_ASSERT(f->kind == Entity_Constant); - String str = f->token.string; + auto str = entity_interned_name(f); if (field_name == str) { sel.entity = f; @@ -3730,7 +3732,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name defer (mutex_unlock(md->mutex)); for (TypeNameObjCMetadataEntry const &entry : md->value_entries) { GB_ASSERT(entry.entity->kind == Entity_Procedure || entry.entity->kind == Entity_ProcGroup); - if (entry.name == field_name) { + if (entry.interned == field_name) { sel.entity = entry.entity; sel.pseudo_field = true; return sel; @@ -3759,7 +3761,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name if (f->kind != Entity_Variable || (f->flags & EntityFlag_Field) == 0) { continue; } - String str = f->token.string; + auto str = entity_interned_name(f); if (field_name == str) { selection_add_index(&sel, i); // HACK(bill): Leaky memory sel.entity = f; @@ -3788,11 +3790,12 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name bool is_soa_of_array = is_soa && is_type_array(type->Struct.soa_elem); if (is_soa_of_array) { - String mapped_field_name = {}; - if (field_name == "r") mapped_field_name = str_lit("x"); - else if (field_name == "g") mapped_field_name = str_lit("y"); - else if (field_name == "b") mapped_field_name = str_lit("z"); - else if (field_name == "a") mapped_field_name = str_lit("w"); + InternedString mapped_field_name = {}; + String n = field_name.string(); + if (n == "r") mapped_field_name = string_interner_insert(str_lit("x")); + else if (n == "g") mapped_field_name = string_interner_insert(str_lit("y")); + else if (n == "b") mapped_field_name = string_interner_insert(str_lit("z")); + else if (n == "a") mapped_field_name = string_interner_insert(str_lit("w")); return lookup_field_with_selection(type, mapped_field_name, is_type, sel, allow_blank_ident); } } else if (type->kind == Type_BitField) { @@ -3801,7 +3804,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name if (f->kind != Entity_Variable || (f->flags & EntityFlag_Field) == 0) { continue; } - String str = f->token.string; + auto str = entity_interned_name(f); if (field_name == str) { selection_add_index(&sel, i); // HACK(bill): Leaky memory sel.entity = f; @@ -3819,11 +3822,12 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name gb_local_persist Entity *entity__any_data = alloc_entity_field(nullptr, make_token_ident(data_str), t_rawptr, false, 0); gb_local_persist Entity *entity__any_id = alloc_entity_field(nullptr, make_token_ident(id_str), t_typeid, false, 1); - if (field_name == data_str) { + String n = field_name.string(); + if (n == data_str) { selection_add_index(&sel, 0); sel.entity = entity__any_data; return sel; - } else if (field_name == id_str) { + } else if (n == id_str) { selection_add_index(&sel, 1); sel.entity = entity__any_id; return sel; @@ -3841,19 +3845,21 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name gb_local_persist Entity *entity__x = alloc_entity_field(nullptr, make_token_ident(x), t_f16, false, 0); gb_local_persist Entity *entity__y = alloc_entity_field(nullptr, make_token_ident(y), t_f16, false, 1); gb_local_persist Entity *entity__z = alloc_entity_field(nullptr, make_token_ident(z), t_f16, false, 2); - if (field_name == w) { + + String n = field_name.string(); + if (n == w) { selection_add_index(&sel, 3); sel.entity = entity__w; return sel; - } else if (field_name == x) { + } else if (n == x) { selection_add_index(&sel, 0); sel.entity = entity__x; return sel; - } else if (field_name == y) { + } else if (n == y) { selection_add_index(&sel, 1); sel.entity = entity__y; return sel; - } else if (field_name == z) { + } else if (n == z) { selection_add_index(&sel, 2); sel.entity = entity__z; return sel; @@ -3870,19 +3876,21 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name gb_local_persist Entity *entity__x = alloc_entity_field(nullptr, make_token_ident(x), t_f32, false, 0); gb_local_persist Entity *entity__y = alloc_entity_field(nullptr, make_token_ident(y), t_f32, false, 1); gb_local_persist Entity *entity__z = alloc_entity_field(nullptr, make_token_ident(z), t_f32, false, 2); - if (field_name == w) { + + String n = field_name.string(); + if (n == w) { selection_add_index(&sel, 3); sel.entity = entity__w; return sel; - } else if (field_name == x) { + } else if (n == x) { selection_add_index(&sel, 0); sel.entity = entity__x; return sel; - } else if (field_name == y) { + } else if (n == y) { selection_add_index(&sel, 1); sel.entity = entity__y; return sel; - } else if (field_name == z) { + } else if (n == z) { selection_add_index(&sel, 2); sel.entity = entity__z; return sel; @@ -3899,19 +3907,21 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name gb_local_persist Entity *entity__x = alloc_entity_field(nullptr, make_token_ident(x), t_f64, false, 0); gb_local_persist Entity *entity__y = alloc_entity_field(nullptr, make_token_ident(y), t_f64, false, 1); gb_local_persist Entity *entity__z = alloc_entity_field(nullptr, make_token_ident(z), t_f64, false, 2); - if (field_name == w) { + + String n = field_name.string(); + if (n == w) { selection_add_index(&sel, 3); sel.entity = entity__w; return sel; - } else if (field_name == x) { + } else if (n == x) { selection_add_index(&sel, 0); sel.entity = entity__x; return sel; - } else if (field_name == y) { + } else if (n == y) { selection_add_index(&sel, 1); sel.entity = entity__y; return sel; - } else if (field_name == z) { + } else if (n == z) { selection_add_index(&sel, 2); sel.entity = entity__z; return sel; @@ -3928,19 +3938,21 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name gb_local_persist Entity *entity__x = alloc_entity_field(nullptr, make_token_ident(x), t_untyped_float, false, 0); gb_local_persist Entity *entity__y = alloc_entity_field(nullptr, make_token_ident(y), t_untyped_float, false, 1); gb_local_persist Entity *entity__z = alloc_entity_field(nullptr, make_token_ident(z), t_untyped_float, false, 2); - if (field_name == w) { + + String n = field_name.string(); + if (n == w) { selection_add_index(&sel, 3); sel.entity = entity__w; return sel; - } else if (field_name == x) { + } else if (n == x) { selection_add_index(&sel, 0); sel.entity = entity__x; return sel; - } else if (field_name == y) { + } else if (n == y) { selection_add_index(&sel, 1); sel.entity = entity__y; return sel; - } else if (field_name == z) { + } else if (n == z) { selection_add_index(&sel, 2); sel.entity = entity__z; return sel; @@ -3955,7 +3967,8 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name String allocator_str = str_lit("allocator"); gb_local_persist Entity *entity__allocator = alloc_entity_field(nullptr, make_token_ident(allocator_str), t_allocator, false, 3); - if (field_name == allocator_str) { + String n = field_name.string(); + if (n == allocator_str) { selection_add_index(&sel, 3); sel.entity = entity__allocator; return sel; @@ -3965,7 +3978,8 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name String allocator_str = str_lit("allocator"); gb_local_persist Entity *entity__allocator = alloc_entity_field(nullptr, make_token_ident(allocator_str), t_allocator, false, 2); - if (field_name == allocator_str) { + String n = field_name.string(); + if (n == allocator_str) { selection_add_index(&sel, 2); sel.entity = entity__allocator; return sel; @@ -3973,7 +3987,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name #define _ARRAY_FIELD_CASE_IF(_length, _name) \ - if (field_name == (_name)) { \ + if (n == (_name)) { \ selection_add_index(&sel, (_length)-1); \ sel.entity = alloc_entity_array_elem(nullptr, make_token_ident(str_lit(_name)), elem, (_length)-1); \ return sel; \ @@ -3986,7 +4000,7 @@ case (_length): \ } else if (type->kind == Type_Array) { - + String n = field_name.string(); Type *elem = type->Array.elem; if (type->Array.count <= 4) { @@ -4001,8 +4015,9 @@ case (_length): \ } } } else if (type->kind == Type_SimdVector) { - + String n = field_name.string(); Type *elem = type->SimdVector.elem; + if (type->SimdVector.count <= 4) { // HACK(bill): Memory leak switch (type->SimdVector.count) { From b19e89578f6577b9ff582311b5d282d9ebc8eb28 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 11:42:03 +0000 Subject: [PATCH 741/766] Improve `check_struct_fields` performance; use `CheckerTypePath` free list --- src/check_expr.cpp | 14 +++++------ src/check_type.cpp | 22 +++++++++++----- src/checker.cpp | 63 ++++++++++++++++++++++++++++++++++++---------- src/checker.hpp | 4 +-- src/entity.cpp | 2 +- 5 files changed, 76 insertions(+), 29 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index f02322430..0ba316697 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1329,7 +1329,7 @@ gb_internal bool polymorphic_assign_index(Type **gt_, i64 *dst_count, i64 source Type *gt = *gt_; GB_ASSERT(gt->kind == Type_Generic); - Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name); + Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name, 0); GB_ASSERT(e != nullptr); if (e->kind == Entity_TypeName) { *gt_ = nullptr; @@ -1430,7 +1430,7 @@ gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, T if (poly->Array.generic_count != nullptr) { Type *gt = poly->Array.generic_count; GB_ASSERT(gt->kind == Type_Generic); - Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name); + Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name, 0); GB_ASSERT(e != nullptr); if (e->kind == Entity_TypeName) { Type *index = source->EnumeratedArray.index; @@ -1772,7 +1772,7 @@ gb_internal Entity *check_ident(CheckerContext *c, Operand *o, Ast *n, Type *nam o->expr = n; auto name = n->Ident.token.string; - Entity *e = scope_lookup(c->scope, n->Ident.interned); + Entity *e = scope_lookup(c->scope, n->Ident.interned, n->Ident.hash); if (e == nullptr) { if (is_blank_ident(name)) { error(n, "'_' cannot be used as a value"); @@ -5459,7 +5459,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * } } else */if (node->kind == Ast_Ident) { String name = node->Ident.token.string; - return scope_lookup(c->scope, node->Ident.interned); + return scope_lookup(c->scope, node->Ident.interned, node->Ident.hash); } else if (!ident_only) if (node->kind == Ast_SelectorExpr) { ast_node(se, SelectorExpr, node); if (se->token.kind == Token_ArrowRight) { @@ -5481,7 +5481,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * if (op_expr->kind == Ast_Ident) { String op_name = op_expr->Ident.token.string; - Entity *e = scope_lookup(c->scope,op_expr->Ident.interned); + Entity *e = scope_lookup(c->scope, op_expr->Ident.interned, op_expr->Ident.hash); if (e == nullptr) { return nullptr; } @@ -5578,7 +5578,7 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod if (op_expr->kind == Ast_Ident) { String op_name = op_expr->Ident.token.string; - Entity *e = scope_lookup(c->scope, op_expr->Ident.interned); + Entity *e = scope_lookup(c->scope, op_expr->Ident.interned, op_expr->Ident.hash); add_entity_use(c, op_expr, e); expr_entity = e; @@ -6001,7 +6001,7 @@ gb_internal bool check_identifier_exists(Scope *s, Ast *node, bool nested = fals return true; } } else { - Entity *e = scope_lookup(s, i->interned); + Entity *e = scope_lookup(s, i->interned, i->hash); if (e != nullptr) { if (out_scope) *out_scope = e->scope; return true; diff --git a/src/check_type.cpp b/src/check_type.cpp index bd86e7c3d..a23033ef1 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -105,9 +105,6 @@ gb_internal bool does_field_type_allow_using(Type *t) { gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, Slice *fields, String **tags, Slice const ¶ms, isize init_field_capacity, Type *struct_type, String context) { - auto fields_array = array_make(heap_allocator(), 0, init_field_capacity); - auto tags_array = array_make(heap_allocator(), 0, init_field_capacity); - GB_ASSERT(node->kind == Ast_StructType); GB_ASSERT(struct_type->kind == Type_Struct); @@ -120,6 +117,12 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, Slice(permanent_allocator(), 0, init_field_capacity); + auto tags_array = array_make(permanent_allocator(), 0, init_field_capacity); + + defer (GB_ASSERT(fields_array.count == init_field_capacity)); + // Allocate all at once Entity *entities_to_use = permanent_alloc_array(variable_count); isize entities_to_use_index = 0; @@ -175,7 +178,10 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, Slicescope, name_token, type, is_using, field_src_index); Entity *field = &entities_to_use[entities_to_use_index++]; INTERNAL_ENTITY_INIT(field, Entity_Variable, ctx->scope, name_token, type); - field->state = EntityState_Unresolved; + + field->interned_name.store(name->Ident.interned); + field->interned_name_hash.store(name->Ident.hash); + field->flags |= EntityFlag_Field; if (is_using) field->flags |= EntityFlag_Using; field->Variable.field_index = field_src_index; @@ -976,6 +982,10 @@ gb_internal void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *nam Entity *e = &entities_to_use[entities_to_use_index++]; Token token = ident->Ident.token; INTERNAL_ENTITY_INIT(e, Entity_Constant, ctx->scope, token, constant_type); + + e->interned_name.store(ident->Ident.interned); + e->interned_name_hash.store(ident->Ident.hash); + e->Constant.value = iota; e->identifier = ident; e->flags |= EntityFlag_Visited; @@ -1519,7 +1529,7 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { - Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name); + Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name, 0); GB_ASSERT(e != nullptr); if (modify_type) { e->kind = Entity_Constant; @@ -1572,7 +1582,7 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { - Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name); + Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name, 0); GB_ASSERT(e != nullptr); if (modify_type) { e->kind = Entity_Constant; diff --git a/src/checker.cpp b/src/checker.cpp index 021b03dc9..0897fdbce 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -667,7 +667,8 @@ gb_internal bool check_vet_shadowing(Checker *c, Entity *e, VettedEntity *ve) { return false; } - Entity *shadowed = scope_lookup(parent, entity_interned_name(e)); + auto interned = entity_interned_name(e); + Entity *shadowed = scope_lookup(parent, interned, e->interned_name_hash.load()); if (shadowed == nullptr) { return false; } @@ -949,9 +950,10 @@ gb_internal AstPackage *try_get_core_package(CheckerInfo *info, String name) { gb_internal void add_package_dependency(CheckerContext *c, char const *package_name, char const *name, bool required=false) { String n = make_string_c(name); - InternedString key = string_interner_insert(n); + u32 hash = 0; + InternedString key = string_interner_insert(n, 0, &hash); AstPackage *p = get_core_package(&c->checker->info, make_string_c(package_name)); - Entity *e = scope_lookup(p->scope, key); + Entity *e = scope_lookup(p->scope, key, hash); GB_ASSERT_MSG(e != nullptr, "%s", name); GB_ASSERT(c->decl != nullptr); e->flags |= EntityFlag_Used; @@ -963,9 +965,10 @@ gb_internal void add_package_dependency(CheckerContext *c, char const *package_n gb_internal void try_to_add_package_dependency(CheckerContext *c, char const *package_name, char const *name) { String n = make_string_c(name); - InternedString key = string_interner_insert(n); + u32 hash = 0; + InternedString key = string_interner_insert(n, 0, &hash); AstPackage *p = get_core_package(&c->checker->info, make_string_c(package_name)); - Entity *e = scope_lookup(p->scope, key); + Entity *e = scope_lookup(p->scope, key, hash); if (e == nullptr) { return; } @@ -2756,7 +2759,9 @@ gb_internal void add_dependency_to_set_threaded(Checker *c, Entity *entity) { gb_internal void force_add_dependency_entity(Checker *c, Scope *scope, String const &name) { - Entity *e = scope_lookup(scope, string_interner_insert(name)); + u32 hash = 0; + auto interned = string_interner_insert(name, 0, &hash); + Entity *e = scope_lookup(scope, interned, hash); if (e == nullptr) { return; } @@ -3277,16 +3282,48 @@ gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String return e->type; } +struct CheckerTypePathStore { + CheckerTypePath path; + std::atomic next; +}; + +gb_internal gb_thread_local std::atomic checker_type_path_free_list; + gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator) { - // TODO(bill): Cache to reuse `CheckerTypePath` - auto *tp = gb_alloc_item(heap_allocator(), CheckerTypePath); - array_init(tp, allocator, 0, 16); - return tp; + // TODO(bill): Cache to reuse `CheckerTypePath + + CheckerTypePathStore *tp = nullptr; + + for (;;) { + tp = checker_type_path_free_list.load(std::memory_order_acquire); + if (tp == nullptr) { + tp = permanent_alloc_item(); + array_init(&tp->path, allocator, 0, 16); + return &tp->path; + } + + if (checker_type_path_free_list.compare_exchange_weak(tp, tp->next.load(std::memory_order_acquire), std::memory_order_acquire, std::memory_order_relaxed)) { + tp->next.store(nullptr); + return &tp->path; + } + + } } -gb_internal void destroy_checker_type_path(CheckerTypePath *tp, gbAllocator allocator) { - array_free(tp); - gb_free(allocator, tp); +gb_internal void destroy_checker_type_path(CheckerTypePath *path, gbAllocator allocator) { + auto *tp = cast(CheckerTypePathStore *)path; + array_clear(&tp->path); + + + for (;;) { + auto *head = checker_type_path_free_list.load(std::memory_order_relaxed); + tp->next.store(head); + if (checker_type_path_free_list.compare_exchange_weak(head, tp, std::memory_order_release, std::memory_order_relaxed)) { + return; + } + } + + // array_free(&tp->path); } gb_internal void check_type_path_push(CheckerContext *c, Entity *e) { diff --git a/src/checker.hpp b/src/checker.hpp index 335794535..a5f0ba704 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -883,8 +883,8 @@ gb_internal Entity *entity_of_node(Ast *expr); // gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash=0); -gb_internal Entity *scope_lookup (Scope *s, InternedString interned, u32 hash=0); -gb_internal void scope_lookup_parent (Scope *s, InternedString name, Scope **scope_, Entity **entity_, u32 hash=0); +gb_internal Entity *scope_lookup (Scope *s, InternedString interned, u32 hash); +gb_internal void scope_lookup_parent (Scope *s, InternedString name, Scope **scope_, Entity **entity_, u32 hash); gb_internal Entity *scope_insert (Scope *s, Entity *entity); diff --git a/src/entity.cpp b/src/entity.cpp index 2f0046972..c6e091584 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -369,13 +369,13 @@ gb_global std::atomic global_entity_id; if ((token_).pos.file_id) { \ e_->file = thread_unsafe_get_ast_file_from_id((token_).pos.file_id); \ } \ - entity_interned_name(e_); \ } while (0) gb_internal Entity *alloc_entity(EntityKind kind, Scope *scope, Token token, Type *type) { Entity *entity = permanent_alloc_item(); INTERNAL_ENTITY_INIT(entity, kind, scope, token, type); + entity_interned_name(entity); return entity; } From 9ad3a23f27221890ba707f854246a10906608725 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 12:10:49 +0000 Subject: [PATCH 742/766] More improvements to performance; `AtomicFreelist` abstraction --- src/check_type.cpp | 9 +++------ src/checker.cpp | 42 +++++++++--------------------------------- src/threading.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 39 deletions(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index a23033ef1..9921ae6ae 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -39,11 +39,6 @@ gb_internal void populate_using_entity_scope(CheckerContext *ctx, Ast *node, Ast } Type *original_type = t; t = base_type(type_deref(t)); - gbString str = nullptr; - defer (gb_string_free(str)); - if (node != nullptr) { - str = expr_to_string(node); - } if (t->kind == Type_Struct) { for (Entity *f : t->Struct.fields) { @@ -54,8 +49,10 @@ gb_internal void populate_using_entity_scope(CheckerContext *ctx, Ast *node, Ast if (e != nullptr && name != "_") { gbString ot = type_to_string(original_type); // TODO(bill): Better type error - if (str != nullptr) { + if (node != nullptr) { + gbString str = expr_to_string(node); error(e->token, "'%.*s' is already declared in '%s', through 'using' from '%s'", LIT(name), str, ot); + gb_string_free(str); } else { error(e->token, "'%.*s' is already declared, through 'using' from '%s'", LIT(name), ot); } diff --git a/src/checker.cpp b/src/checker.cpp index 0897fdbce..ba6a392dd 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3282,48 +3282,24 @@ gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String return e->type; } -struct CheckerTypePathStore { - CheckerTypePath path; - std::atomic next; -}; - -gb_internal gb_thread_local std::atomic checker_type_path_free_list; +gb_internal gb_thread_local std::atomic *> checker_type_path_free_list; gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator) { // TODO(bill): Cache to reuse `CheckerTypePath - CheckerTypePathStore *tp = nullptr; - - for (;;) { - tp = checker_type_path_free_list.load(std::memory_order_acquire); - if (tp == nullptr) { - tp = permanent_alloc_item(); - array_init(&tp->path, allocator, 0, 16); - return &tp->path; - } - - if (checker_type_path_free_list.compare_exchange_weak(tp, tp->next.load(std::memory_order_acquire), std::memory_order_acquire, std::memory_order_relaxed)) { - tp->next.store(nullptr); - return &tp->path; - } - + auto *tp = atomic_freelist_get(checker_type_path_free_list); + if (tp == nullptr) { + tp = permanent_alloc_item >(); + array_init(&tp->value, allocator, 0, 16); } + return &tp->value; } gb_internal void destroy_checker_type_path(CheckerTypePath *path, gbAllocator allocator) { - auto *tp = cast(CheckerTypePathStore *)path; - array_clear(&tp->path); + auto *tp = cast(AtomicFreelist *)path; + array_clear(&tp->value); - - for (;;) { - auto *head = checker_type_path_free_list.load(std::memory_order_relaxed); - tp->next.store(head); - if (checker_type_path_free_list.compare_exchange_weak(head, tp, std::memory_order_release, std::memory_order_relaxed)) { - return; - } - } - - // array_free(&tp->path); + atomic_freelist_put(checker_type_path_free_list, tp); } gb_internal void check_type_path_push(CheckerContext *c, Entity *e) { diff --git a/src/threading.cpp b/src/threading.cpp index d8ae321f5..5dff13d2e 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -1201,3 +1201,41 @@ void futex_wait(Futex *f, Footex val) { #if defined(GB_SYSTEM_WINDOWS) #pragma warning(pop) #endif + + + +template +struct AtomicFreelist { + T value; + std::atomic *> next; +}; + +template +AtomicFreelist *atomic_freelist_get(std::atomic *> &head) { + AtomicFreelist *elem = nullptr; + + for (;;) { + elem = head.load(std::memory_order_acquire); + if (elem == nullptr) { + return nullptr; + } + + if (head.compare_exchange_weak(elem, elem->next.load(std::memory_order_acquire), std::memory_order_acquire, std::memory_order_relaxed)) { + elem->next.store(nullptr, std::memory_order_relaxed); + return elem; + } + + } +} + +template +void atomic_freelist_put(std::atomic *> &head_list, AtomicFreelist *elem) { + for (;;) { + auto *head = head_list.load(std::memory_order_relaxed); + elem->next.store(head, std::memory_order_relaxed); + if (head_list.compare_exchange_weak(head, elem, std::memory_order_release, std::memory_order_relaxed)) { + return; + } + + } +} \ No newline at end of file From e18b15e8f05d62b7bc8461dfe4bf4a8b92089752 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 12:16:44 +0000 Subject: [PATCH 743/766] Move error-only things to the error scopes --- src/check_expr.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 0ba316697..2155485f5 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1090,18 +1090,20 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ return; } - // Grab definite or indefinite article matching `context_name`, or "" if not found. - String article = error_article(context_name); if (is_type_untyped(operand->type)) { Type *target_type = type; if (type == nullptr || is_type_any(type)) { if (type == nullptr && is_type_untyped_uninit(operand->type)) { + String article = error_article(context_name); // Grab definite or indefinite article matching `context_name`, or "" if not found. + error(operand->expr, "Use of --- in %.*s%.*s", LIT(article), LIT(context_name)); operand->mode = Addressing_Invalid; return; } if (type == nullptr && is_type_untyped_nil(operand->type)) { + String article = error_article(context_name); // Grab definite or indefinite article matching `context_name`, or "" if not found. + error(operand->expr, "Use of untyped nil in %.*s%.*s", LIT(article), LIT(context_name)); operand->mode = Addressing_Invalid; return; @@ -1159,6 +1161,8 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ defer (gb_string_free(op_type_str)); defer (gb_string_free(expr_str)); + String article = error_article(context_name); // Grab definite or indefinite article matching `context_name`, or "" if not found. + // TODO(bill): is this a good enough error message? error(operand->expr, "Cannot assign overloaded procedure group '%s' to '%s' in %.*s%.*s", @@ -1187,6 +1191,8 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ defer (gb_string_free(op_type_str)); defer (gb_string_free(expr_str)); + String article = error_article(context_name); // Grab definite or indefinite article matching `context_name`, or "" if not found. + switch (operand->mode) { case Addressing_Builtin: error(operand->expr, From 46936e0e52b29cc877bf9944efd60fa0c0a3218e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 12:55:25 +0000 Subject: [PATCH 744/766] General improvements --- src/check_expr.cpp | 11 +++++--- src/check_type.cpp | 49 +++++++++++++++++++++++++++++---- src/checker.cpp | 10 +++---- src/checker.hpp | 4 +-- src/entity.cpp | 3 +- src/ptr_set.cpp | 68 ++++++++++++++++++++++++++++++++-------------- 6 files changed, 106 insertions(+), 39 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 2155485f5..c72e89bf2 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -7822,11 +7822,14 @@ gb_internal CallArgumentError check_polymorphic_record_type(CheckerContext *c, O { // NOTE(bill, 2019-10-26): Allow a cycle in the parameters but not in the fields themselves auto prev_type_path = c->type_path; + + c->type_path = new_checker_type_path(); + defer ({ + destroy_checker_type_path(c->type_path); + c->type_path = prev_type_path; + }); + TEMPORARY_ALLOCATOR_GUARD(); - - c->type_path = new_checker_type_path(temporary_allocator()); - defer (c->type_path = prev_type_path); - if (is_call_expr_field_value(ce)) { named_fields = true; operands = array_make(temporary_allocator(), ce->args.count); diff --git a/src/check_type.cpp b/src/check_type.cpp index 9921ae6ae..1ba2ee051 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1857,6 +1857,11 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para bool is_c_vararg = false; auto variables = array_make(permanent_allocator(), 0, variable_count); i32 field_group_index = -1; + + + Entity *entities_to_use = permanent_alloc_array(variable_count); + isize entities_to_use_index = 0; + for_array(i, params) { Ast *param = params[i]; if (param->kind != Ast_Field) { @@ -2096,7 +2101,12 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para p->flags &= ~FieldFlag_no_capture; } - param = alloc_entity_type_name(scope, name->Ident.token, type, EntityState_Resolved); + param = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(param, Entity_TypeName, scope, name->Ident.token, type); + param->state = EntityState_Resolved; + param->interned_name.store(name->Ident.interned); + param->interned_name_hash.store(name->Ident.hash); + param->TypeName.is_type_alias = true; } else { ExactValue poly_const = {}; @@ -2250,10 +2260,36 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para // failed } - param = alloc_entity_const_param(scope, name->Ident.token, type, poly_const, is_type_polymorphic(type)); + // param = alloc_entity_const_param(scope, name->Ident.token, type, poly_const, is_type_polymorphic(type)); + + param = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(param, Entity_Constant, scope, name->Ident.token, type); + + param->flags |= EntityFlag_Used|EntityFlag_Param; + if (is_type_polymorphic(type)) { + param->flags |= EntityFlag_PolyConst; + } + param->Constant.value = poly_const; + + param->interned_name.store(name->Ident.interned); + param->interned_name_hash.store(name->Ident.hash); + param->Constant.field_group_index = field_group_index; } else { - param = alloc_entity_param(scope, name->Ident.token, type, is_using, true); + // param = alloc_entity_param(scope, name->Ident.token, type, is_using, true); + + param = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(param, Entity_Variable, scope, name->Ident.token, type); + + param->state = EntityState_Resolved; + param->flags |= EntityFlag_Used|EntityFlag_Param|EntityFlag_Value; + if (is_using) { + param->flags |= EntityFlag_Using; + } + + param->interned_name.store(name->Ident.interned); + param->interned_name_hash.store(name->Ident.hash); + param->Variable.param_value = param_value; param->Variable.field_group_index = field_group_index; param->Variable.type_expr = type_expr; @@ -3627,7 +3663,8 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T CheckerContext c = *ctx; TEMPORARY_ALLOCATOR_GUARD(); - c.type_path = new_checker_type_path(temporary_allocator()); + c.type_path = new_checker_type_path(); + defer (destroy_checker_type_path(c.type_path)); Type *elem = t_invalid; Operand o = {}; @@ -3900,8 +3937,8 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T gb_internal Type *check_type(CheckerContext *ctx, Ast *e) { CheckerContext c = *ctx; - TEMPORARY_ALLOCATOR_GUARD(); - c.type_path = new_checker_type_path(temporary_allocator()); + c.type_path = new_checker_type_path(); + defer (destroy_checker_type_path(c.type_path)); return check_type_expr(&c, e, nullptr); } diff --git a/src/checker.cpp b/src/checker.cpp index ba6a392dd..ce8042b41 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1550,12 +1550,12 @@ gb_internal void init_checker_context(CheckerContext *ctx, Checker *c) { ctx->scope = builtin_pkg->scope; ctx->pkg = builtin_pkg; - ctx->type_path = new_checker_type_path(heap_allocator()); + ctx->type_path = new_checker_type_path(); ctx->type_level = 0; } gb_internal void destroy_checker_context(CheckerContext *ctx) { - destroy_checker_type_path(ctx->type_path, heap_allocator()); + destroy_checker_type_path(ctx->type_path); } gb_internal bool add_curr_ast_file(CheckerContext *ctx, AstFile *file) { @@ -3284,18 +3284,18 @@ gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String gb_internal gb_thread_local std::atomic *> checker_type_path_free_list; -gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator) { +gb_internal CheckerTypePath *new_checker_type_path() { // TODO(bill): Cache to reuse `CheckerTypePath auto *tp = atomic_freelist_get(checker_type_path_free_list); if (tp == nullptr) { tp = permanent_alloc_item >(); - array_init(&tp->value, allocator, 0, 16); + array_init(&tp->value, permanent_allocator(), 0, 16); } return &tp->value; } -gb_internal void destroy_checker_type_path(CheckerTypePath *path, gbAllocator allocator) { +gb_internal void destroy_checker_type_path(CheckerTypePath *path) { auto *tp = cast(AtomicFreelist *)path; array_clear(&tp->value); diff --git a/src/checker.hpp b/src/checker.hpp index a5f0ba704..5e295dc84 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -909,8 +909,8 @@ gb_internal void check_collect_entities(CheckerContext *c, Slice const &n gb_internal void check_collect_entities_from_when_stmt(CheckerContext *c, AstWhenStmt *ws); gb_internal void check_delayed_file_import_entity(CheckerContext *c, Ast *decl); -gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator); -gb_internal void destroy_checker_type_path(CheckerTypePath *tp, gbAllocator allocator); +gb_internal CheckerTypePath *new_checker_type_path(); +gb_internal void destroy_checker_type_path(CheckerTypePath *tp); gb_internal void check_type_path_push(CheckerContext *c, Entity *e); gb_internal Entity *check_type_path_pop (CheckerContext *c); diff --git a/src/entity.cpp b/src/entity.cpp index c6e091584..5062599de 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -412,10 +412,9 @@ gb_internal Entity *alloc_entity_type_name(Scope *scope, Token token, Type *type } gb_internal Entity *alloc_entity_param(Scope *scope, Token token, Type *type, bool is_using, bool is_value) { - Entity *entity = alloc_entity_variable(scope, token, type); + Entity *entity = alloc_entity_variable(scope, token, type, EntityState_Resolved); entity->flags |= EntityFlag_Used; entity->flags |= EntityFlag_Param; - entity->state = EntityState_Resolved; if (is_using) entity->flags |= EntityFlag_Using; if (is_value) entity->flags |= EntityFlag_Value; return entity; diff --git a/src/ptr_set.cpp b/src/ptr_set.cpp index 1d8154be7..3d30bb35e 100644 --- a/src/ptr_set.cpp +++ b/src/ptr_set.cpp @@ -1,11 +1,14 @@ +enum {PTR_SET_INLINE_CAP = 16}; + template struct PtrSet { static_assert(TypeIsPointer::value || TypeIsPtrSizedInteger::value, "PtrSet::T must be a pointer"); static constexpr uintptr TOMBSTONE = ~(uintptr)(0ull); - T * keys; - usize count; - usize capacity; + T * keys; + u32 count; + u32 capacity; + T inline_keys[PTR_SET_INLINE_CAP]; }; template gb_internal void ptr_set_init (PtrSet *s, isize capacity = 16); @@ -27,17 +30,23 @@ template gb_internal void ptr_set_init(PtrSet *s, isize capacity) { GB_ASSERT(s->keys == nullptr); if (capacity != 0) { - capacity = next_pow2_isize(gb_max(16, capacity)); - s->keys = gb_alloc_array(ptr_set_allocator(), T, capacity); + capacity = next_pow2_isize(gb_max(PTR_SET_INLINE_CAP, capacity)); + if (capacity > PTR_SET_INLINE_CAP) { + s->keys = gb_alloc_array(ptr_set_allocator(), T, capacity); + } else { + s->keys = s->inline_keys; + } // This memory will be zeroed, no need to explicitly zero it } s->count = 0; - s->capacity = capacity; + s->capacity = cast(u32)capacity; } template gb_internal void ptr_set_destroy(PtrSet *s) { - gb_free(ptr_set_allocator(), s->keys); + if (s->keys != s->inline_keys) { + gb_free(ptr_set_allocator(), s->keys); + } s->keys = nullptr; s->count = 0; s->capacity = 0; @@ -47,16 +56,10 @@ template gb_internal isize ptr_set__find(PtrSet *s, T ptr) { GB_ASSERT(ptr != 0); if (s->count != 0) { - #if 0 - for (usize i = 0; i < s->capacity; i++) { - if (s->keys[i] == ptr) { - return i; - } - } - #else u32 hash = ptr_map_hash_key(ptr); usize mask = s->capacity-1; usize hash_index = cast(usize)hash & mask; + for (usize i = 0; i < s->capacity; i++) { T key = s->keys[hash_index]; if (key == ptr) { @@ -66,14 +69,14 @@ gb_internal isize ptr_set__find(PtrSet *s, T ptr) { } hash_index = (hash_index+1)&mask; } - #endif } return -1; } template gb_internal bool ptr_set__full(PtrSet *s) { - return 0.75f * s->capacity <= s->count; + usize grow_at = s->capacity - (s->capacity>>2); + return s->count >= grow_at; } template @@ -187,11 +190,36 @@ gb_internal T ptr_set_add(PtrSet *s, T ptr) { template gb_internal void ptr_set_remove(PtrSet *s, T ptr) { isize index = ptr_set__find(s, ptr); - if (index >= 0) { - GB_ASSERT(s->count > 0); - s->keys[index] = (T)PtrSet::TOMBSTONE; - s->count--; + if (index < 0) { + return; } + +#if 0 + u32 mask = s->capacity-1; + u32 i = cast(u32)index; + s->count -= 1; + + for (;;) { + u32 next = (i + 1) & mask; + T key = s->keys[next]; + if (key == 0) { + break; + } + + u32 natural = ptr_map_hash_key(key) & mask; + + if (((next - natural) & mask) == 0) { + break; + } + s->keys[i] = key; + i = next; + } + s->keys[i] = 0; +#else + GB_ASSERT(s->count > 0); + s->keys[index] = (T)PtrSet::TOMBSTONE; + s->count--; +#endif } template From 1f2c9686527e70c547d63ec6643878f316355702 Mon Sep 17 00:00:00 2001 From: Nathan Chere <853261+nathanchere@users.noreply.github.com> Date: Tue, 17 Mar 2026 14:05:45 +0100 Subject: [PATCH 745/766] Update build_odin.shm to support LLVM 22 --- build_odin.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build_odin.sh b/build_odin.sh index 64bb4c799..ee891e41e 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -26,7 +26,7 @@ error() { exit 1 } -SUPPORTED_LLVM_VERSIONS="21 20 19 18 17 14" +SUPPORTED_LLVM_VERSIONS="22 21 20 19 18 17 14" # Brew advises people not to add llvm to their $PATH, so try and use brew to find it. if [ -z "$LLVM_CONFIG" ] && [ -n "$(command -v brew)" ]; then @@ -78,8 +78,8 @@ LLVM_VERSION_MAJOR="$(echo $LLVM_VERSION | awk -F. '{print $1}')" LLVM_VERSION_MINOR="$(echo $LLVM_VERSION | awk -F. '{print $2}')" LLVM_VERSION_PATCH="$(echo $LLVM_VERSION | awk -F. '{print $3}')" -if [ $LLVM_VERSION_MAJOR -lt 14 ] || ([ $LLVM_VERSION_MAJOR -gt 14 ] && [ $LLVM_VERSION_MAJOR -lt 17 ]) || [ $LLVM_VERSION_MAJOR -gt 21 ]; then - error "Invalid LLVM version $LLVM_VERSION: must be 14, 17, 18, 19, 20, or 21" +if [ $LLVM_VERSION_MAJOR -lt 14 ] || ([ $LLVM_VERSION_MAJOR -gt 14 ] && [ $LLVM_VERSION_MAJOR -lt 17 ]) || [ $LLVM_VERSION_MAJOR -gt 22 ]; then + error "Invalid LLVM version $LLVM_VERSION: must be 14, 17, 18, 19, 20, 21 or 22" fi case "$OS_NAME" in From 153a522228fb877a37e9483427d5bf929a8c19cf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 13:34:06 +0000 Subject: [PATCH 746/766] Use normal `i64` arithmetic instead of big-ints for hot path --- src/big_int.cpp | 7 +++++++ src/check_expr.cpp | 50 ++++++++++++++++++++++++++++++++++++---------- src/check_type.cpp | 23 ++++++++++++++++++--- 3 files changed, 66 insertions(+), 14 deletions(-) diff --git a/src/big_int.cpp b/src/big_int.cpp index 141152913..e2ebb5c76 100644 --- a/src/big_int.cpp +++ b/src/big_int.cpp @@ -57,6 +57,8 @@ gb_internal void big_int_dealloc(BigInt *dst) { mp_clear(dst); } +gb_internal bool big_int_can_be_represented_in_64_bits(BigInt const *x); + gb_internal BigInt big_int_make(BigInt const *b, bool abs=false); gb_internal BigInt big_int_make_abs(BigInt const *b); gb_internal BigInt big_int_make_u64(u64 x); @@ -293,6 +295,11 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success +gb_internal bool big_int_can_be_represented_in_64_bits(BigInt const *x) { + int bits_used = (x->used-1) * MP_DIGIT_BIT; + return bits_used <= 64; +} + gb_internal u64 big_int_to_u64(BigInt const *x) { GB_ASSERT(x->sign == 0); return mp_get_u64(x); diff --git a/src/check_expr.cpp b/src/check_expr.cpp index c72e89bf2..d634aa9c0 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2167,9 +2167,13 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i BigInt i = v.value_integer; i64 byte_size = type_size_of(type); - BigInt umax = {}; - BigInt imin = {}; - BigInt imax = {}; + BigInt umax; + BigInt imin; + BigInt imax; + + u64 umax_64 = 0; + i64 imin_64 = 0; + i64 imax_64 = 0; if (c->bit_field_bit_size > 0) { i64 bit_size = gb_min(cast(i64)(8*byte_size), cast(i64)c->bit_field_bit_size); @@ -2192,10 +2196,10 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i big_int_shl_eq(&imax, &bi); mp_decr(&imax); } else { - if (byte_size < 16) { - big_int_from_u64(&umax, unsigned_integer_maxs[byte_size]); - big_int_from_i64(&imin, signed_integer_mins[byte_size]); - big_int_from_i64(&imax, signed_integer_maxs[byte_size]); + if (byte_size <= 8) { + umax_64 = unsigned_integer_maxs[byte_size]; + imin_64 = signed_integer_mins[byte_size]; + imax_64 = signed_integer_maxs[byte_size]; } else { big_int_from_u64(&umax, 1); big_int_from_i64(&imin, 1); @@ -2223,16 +2227,27 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i case Basic_i16: case Basic_i32: case Basic_i64: - case Basic_i128: case Basic_int: case Basic_i16le: case Basic_i32le: case Basic_i64le: - case Basic_i128le: case Basic_i16be: case Basic_i32be: case Basic_i64be: + { + // return imin <= i && i <= imax; + if (!big_int_can_be_represented_in_64_bits(&i)) { + return false; + } + + i64 val64 = big_int_to_i64(&i); + + return imin_64 <= val64 && val64 <= imax_64; + } + + case Basic_i128le: + case Basic_i128: case Basic_i128be: { // return imin <= i && i <= imax; @@ -2245,17 +2260,30 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i case Basic_u16: case Basic_u32: case Basic_u64: - case Basic_u128: case Basic_uint: case Basic_uintptr: case Basic_u16le: case Basic_u32le: case Basic_u64le: - case Basic_u128le: case Basic_u16be: case Basic_u32be: case Basic_u64be: + { + if (big_int_is_neg(&i)) { + return false; + } + if (!big_int_can_be_represented_in_64_bits(&i)) { + return false; + } + u64 val64 = big_int_to_u64(&i); + + return val64 <= umax_64; + + } + + case Basic_u128: + case Basic_u128le: case Basic_u128be: { // return 0ull <= i && i <= umax; diff --git a/src/check_type.cpp b/src/check_type.cpp index 1ba2ee051..b625fb3d0 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2442,6 +2442,9 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res } } + Entity *entities_to_use = permanent_alloc_array(variable_count); + isize entities_to_use_index = 0; + auto variables = array_make(permanent_allocator(), 0, variable_count); i32 field_group_index = -1; for_array(i, results) { @@ -2480,7 +2483,12 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res if (field->names.count == 0) { Token token = ast_token(field->type); token.string = str_lit(""); - Entity *param = alloc_entity_param(scope, token, type, false, false); + // Entity *param = alloc_entity_param(scope, token, type, false, false); + Entity *param = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(param, Entity_Variable, scope, token, type); + param->state = EntityState_Resolved; + param->flags |= EntityFlag_Used|EntityFlag_Param|EntityFlag_Result; + param->Variable.param_value = param_value; param->Variable.field_group_index = -1; array_add(&variables, param); @@ -2503,8 +2511,17 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res error(name, "Result value cannot be a blank identifer `_`"); } - Entity *param = alloc_entity_param(scope, token, type, false, false); - param->flags |= EntityFlag_Result; + // Entity *param = alloc_entity_param(scope, token, type, false, false); + Entity *param = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(param, Entity_Variable, scope, token, type); + param->state = EntityState_Resolved; + param->flags |= EntityFlag_Used|EntityFlag_Param|EntityFlag_Result; + + if (name->kind == Ast_Ident) { + param->interned_name.store(name->Ident.interned); + param->interned_name_hash.store(name->Ident.hash); + } + param->Variable.param_value = param_value; param->Variable.field_group_index = field_group_index; array_add(&variables, param); From 911f00521cf9cc8e22194bf1071dd95137b99165 Mon Sep 17 00:00:00 2001 From: pawelt Date: Tue, 17 Mar 2026 14:31:47 +0100 Subject: [PATCH 747/766] Handle OOM error in path_linux / _get_working_directory() --- core/os/path_linux.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/os/path_linux.odin b/core/os/path_linux.odin index cba4b4e98..8911e6986 100644 --- a/core/os/path_linux.odin +++ b/core/os/path_linux.odin @@ -71,7 +71,7 @@ _mkdir_all :: proc(path: string, perm: Permissions) -> Error { if errno != .NONE { return _get_platform_error(errno) } - + has_created: bool mkdirat(dfd, path_bytes, perm, &has_created) or_return return nil if has_created else .Exist @@ -147,13 +147,13 @@ _remove_all :: proc(path: string) -> Error { return _get_platform_error(linux.rmdir(path_cstr)) } -_get_working_directory :: proc(allocator: runtime.Allocator) -> (string, Error) { +_get_working_directory :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) { // NOTE(tetra): I would use PATH_MAX here, but I was not able to find // an authoritative value for it across all systems. // The largest value I could find was 4096, so might as well use the page size. // NOTE(jason): Avoiding libc, so just use 4096 directly PATH_MAX :: 4096 - buf := make([dynamic]u8, PATH_MAX, allocator) + buf := make([dynamic]u8, PATH_MAX, allocator) or_return for { #no_bounds_check n, errno := linux.getcwd(buf[:]) if errno == .NONE { @@ -162,7 +162,7 @@ _get_working_directory :: proc(allocator: runtime.Allocator) -> (string, Error) if errno != .ERANGE { return "", _get_platform_error(errno) } - resize(&buf, len(buf)+PATH_MAX) + resize(&buf, len(buf)+PATH_MAX) or_return } unreachable() } From d28e19c9572ee7a954dec9dbc2d1e268b5292e28 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 13:47:02 +0000 Subject: [PATCH 748/766] Minor improve to check if the entity was already there --- src/check_expr.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index d634aa9c0..9c9f99fc0 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -5492,6 +5492,10 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * return e; } } else */if (node->kind == Ast_Ident) { + Entity *e = node->Ident.entity.load(); + if (e != nullptr) { + return e; + } String name = node->Ident.token.string; return scope_lookup(c->scope, node->Ident.interned, node->Ident.hash); } else if (!ident_only) if (node->kind == Ast_SelectorExpr) { From 85c05b238e5d6f454754e70edae24872b0c573cc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 13:50:49 +0000 Subject: [PATCH 749/766] Handle bit fields separately --- src/check_expr.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 9c9f99fc0..9044d8346 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2235,7 +2235,7 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i case Basic_i16be: case Basic_i32be: case Basic_i64be: - { + if (c->bit_field_bit_size == 0) { // return imin <= i && i <= imax; if (!big_int_can_be_represented_in_64_bits(&i)) { return false; @@ -2245,7 +2245,7 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i return imin_64 <= val64 && val64 <= imax_64; } - + /*fallthrough*/ case Basic_i128le: case Basic_i128: case Basic_i128be: @@ -2269,7 +2269,7 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i case Basic_u16be: case Basic_u32be: case Basic_u64be: - { + if (c->bit_field_bit_size == 0) { if (big_int_is_neg(&i)) { return false; } @@ -2281,7 +2281,7 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i return val64 <= umax_64; } - + /*fallthrough*/ case Basic_u128: case Basic_u128le: case Basic_u128be: From 1f9f2dc0da2849fe1da2cdfbe8afc9dece643f1a Mon Sep 17 00:00:00 2001 From: WojtaZam Date: Tue, 17 Mar 2026 20:19:46 +0100 Subject: [PATCH 750/766] fix Error: Missing return statement at the end of the procedure pop_fixed_capacity_dynamic_array --- base/runtime/core_builtin.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 511867feb..fe76ee5a5 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -258,6 +258,7 @@ pop_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, loc := #cal end := rawptr(uintptr(array) + uintptr(elem_size*(len(array)-1))) intrinsics.mem_copy_non_overlapping(&res, end, elem_size) (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 + return res } From 72c1a9420b5875ee8af33c0d03f66cb2f4ab8af1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Fro=C5=82ow?= Date: Wed, 18 Mar 2026 12:54:07 +0100 Subject: [PATCH 751/766] No need to use f for print here --- examples/demo/demo.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index a5455846d..a12217548 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -2247,7 +2247,7 @@ arbitrary_precision_mathematics :: proc() { cb := big.internal_count_bits(a) if print_name { - fmt.printf(name) + fmt.print(name) } if err != nil { fmt.printf(" (Error: %v) ", err) From eddc8084f14f2008fdcee0b163f02742227acad5 Mon Sep 17 00:00:00 2001 From: Nathan Chere Date: Wed, 18 Mar 2026 18:30:39 +0100 Subject: [PATCH 752/766] update microarch table for LLVM 22 --- src/build_settings_microarch.cpp | 590 ++++++++++++++++++++++++++++++- 1 file changed, 589 insertions(+), 1 deletion(-) diff --git a/src/build_settings_microarch.cpp b/src/build_settings_microarch.cpp index 0755aa62d..d3010522d 100644 --- a/src/build_settings_microarch.cpp +++ b/src/build_settings_microarch.cpp @@ -2,7 +2,595 @@ #error "LLVM_VERSION_MAJOR is not defined!" #endif -#if LLVM_VERSION_MAJOR >= 21 + +#if LLVM_VERSION_MAJOR >= 22 +// Generated with the featuregen script in `misc/featuregen` +gb_global String target_microarch_list[TargetArch_COUNT] = { + // TargetArch_Invalid: + str_lit(""), + // TargetArch_amd64: + str_lit("alderlake,amdfam10,arrowlake,arrowlake-s,arrowlake_s,athlon,athlon-4,athlon-fx,athlon-mp,athlon-tbird,athlon-xp,athlon64,athlon64-sse3,atom,atom_sse4_2,atom_sse4_2_movbe,barcelona,bdver1,bdver2,bdver3,bdver4,bonnell,broadwell,btver1,btver2,c3,c3-2,cannonlake,cascadelake,clearwaterforest,cooperlake,core-avx-i,core-avx2,core2,core_2_duo_sse4_1,core_2_duo_ssse3,core_2nd_gen_avx,core_3rd_gen_avx,core_4th_gen_avx,core_4th_gen_avx_tsx,core_5th_gen_avx,core_5th_gen_avx_tsx,core_aes_pclmulqdq,core_i7_sse4_2,corei7,corei7-avx,diamondrapids,emeraldrapids,generic,geode,goldmont,goldmont-plus,goldmont_plus,gracemont,grandridge,graniterapids,graniterapids-d,graniterapids_d,haswell,i386,i486,i586,i686,icelake-client,icelake-server,icelake_client,icelake_server,ivybridge,k6,k6-2,k6-3,k8,k8-sse3,knl,knm,lakemont,lunarlake,meteorlake,mic_avx512,nehalem,nocona,novalake,opteron,opteron-sse3,pantherlake,penryn,pentium,pentium-m,pentium-mmx,pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium_4,pentium_4_sse3,pentium_ii,pentium_iii,pentium_iii_no_xmm_regs,pentium_m,pentium_mmx,pentium_pro,pentiumpro,prescott,raptorlake,rocketlake,sandybridge,sapphirerapids,sierraforest,silvermont,skx,skylake,skylake-avx512,skylake_avx512,slm,tigerlake,tremont,westmere,wildcatlake,winchip-c6,winchip2,x86-64,x86-64-v2,x86-64-v3,x86-64-v4,yonah,znver1,znver2,znver3,znver4,znver5"), + // TargetArch_i386: + str_lit("alderlake,amdfam10,arrowlake,arrowlake-s,arrowlake_s,athlon,athlon-4,athlon-fx,athlon-mp,athlon-tbird,athlon-xp,athlon64,athlon64-sse3,atom,atom_sse4_2,atom_sse4_2_movbe,barcelona,bdver1,bdver2,bdver3,bdver4,bonnell,broadwell,btver1,btver2,c3,c3-2,cannonlake,cascadelake,clearwaterforest,cooperlake,core-avx-i,core-avx2,core2,core_2_duo_sse4_1,core_2_duo_ssse3,core_2nd_gen_avx,core_3rd_gen_avx,core_4th_gen_avx,core_4th_gen_avx_tsx,core_5th_gen_avx,core_5th_gen_avx_tsx,core_aes_pclmulqdq,core_i7_sse4_2,corei7,corei7-avx,diamondrapids,emeraldrapids,generic,geode,goldmont,goldmont-plus,goldmont_plus,gracemont,grandridge,graniterapids,graniterapids-d,graniterapids_d,haswell,i386,i486,i586,i686,icelake-client,icelake-server,icelake_client,icelake_server,ivybridge,k6,k6-2,k6-3,k8,k8-sse3,knl,knm,lakemont,lunarlake,meteorlake,mic_avx512,nehalem,nocona,novalake,opteron,opteron-sse3,pantherlake,penryn,pentium,pentium-m,pentium-mmx,pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium_4,pentium_4_sse3,pentium_ii,pentium_iii,pentium_iii_no_xmm_regs,pentium_m,pentium_mmx,pentium_pro,pentiumpro,prescott,raptorlake,rocketlake,sandybridge,sapphirerapids,sierraforest,silvermont,skx,skylake,skylake-avx512,skylake_avx512,slm,tigerlake,tremont,westmere,wildcatlake,winchip-c6,winchip2,x86-64,x86-64-v2,x86-64-v3,x86-64-v4,yonah,znver1,znver2,znver3,znver4,znver5"), + // TargetArch_arm32: + str_lit("arm1020e,arm1020t,arm1022e,arm10e,arm10tdmi,arm1136j-s,arm1136jf-s,arm1156t2-s,arm1156t2f-s,arm1176jz-s,arm1176jzf-s,arm710t,arm720t,arm7tdmi,arm7tdmi-s,arm8,arm810,arm9,arm920,arm920t,arm922t,arm926ej-s,arm940t,arm946e-s,arm966e-s,arm968e-s,arm9e,arm9tdmi,cortex-a12,cortex-a15,cortex-a17,cortex-a32,cortex-a35,cortex-a5,cortex-a510,cortex-a53,cortex-a55,cortex-a57,cortex-a7,cortex-a710,cortex-a72,cortex-a73,cortex-a75,cortex-a76,cortex-a76ae,cortex-a77,cortex-a78,cortex-a78ae,cortex-a78c,cortex-a8,cortex-a9,cortex-m0,cortex-m0plus,cortex-m1,cortex-m23,cortex-m3,cortex-m33,cortex-m35p,cortex-m4,cortex-m52,cortex-m55,cortex-m7,cortex-m85,cortex-r4,cortex-r4f,cortex-r5,cortex-r52,cortex-r52plus,cortex-r7,cortex-r8,cortex-x1,cortex-x1c,cyclone,ep9312,exynos-m3,exynos-m4,exynos-m5,generic,iwmmxt,krait,kryo,mpcore,mpcorenovfp,neoverse-n1,neoverse-n2,neoverse-v1,sc000,sc300,star-mc1,star-mc3,strongarm,strongarm110,strongarm1100,strongarm1110,swift,xscale"), + // TargetArch_arm64: + str_lit("a64fx,ampere1,ampere1a,ampere1b,ampere1c,apple-a10,apple-a11,apple-a12,apple-a13,apple-a14,apple-a15,apple-a16,apple-a17,apple-a18,apple-a19,apple-a7,apple-a8,apple-a9,apple-m1,apple-m2,apple-m3,apple-m4,apple-m5,apple-s10,apple-s4,apple-s5,apple-s6,apple-s7,apple-s8,apple-s9,c1-nano,c1-premium,c1-pro,c1-ultra,carmel,cobalt-100,cortex-a320,cortex-a34,cortex-a35,cortex-a510,cortex-a520,cortex-a520ae,cortex-a53,cortex-a55,cortex-a57,cortex-a65,cortex-a65ae,cortex-a710,cortex-a715,cortex-a72,cortex-a720,cortex-a720ae,cortex-a725,cortex-a73,cortex-a75,cortex-a76,cortex-a76ae,cortex-a77,cortex-a78,cortex-a78ae,cortex-a78c,cortex-r82,cortex-r82ae,cortex-x1,cortex-x1c,cortex-x2,cortex-x3,cortex-x4,cortex-x925,cyclone,exynos-m3,exynos-m4,exynos-m5,falkor,fujitsu-monaka,gb10,generic,grace,kryo,neoverse-512tvb,neoverse-e1,neoverse-n1,neoverse-n2,neoverse-n3,neoverse-v1,neoverse-v2,neoverse-v3,neoverse-v3ae,olympus,oryon-1,saphira,thunderx,thunderx2t99,thunderx3t110,thunderxt81,thunderxt83,thunderxt88,tsv110"), + // TargetArch_wasm32: + str_lit("bleeding-edge,generic,lime1,mvp"), + // TargetArch_wasm64p32: + str_lit("bleeding-edge,generic,lime1,mvp"), + // TargetArch_riscv64: + str_lit("andes-45-series,andes-a25,andes-a45,andes-ax25,andes-ax45,andes-ax45mpv,andes-n45,andes-nx45,generic,generic-ooo,generic-rv32,generic-rv64,mips-p8700,rocket,rocket-rv32,rocket-rv64,rp2350-hazard3,sifive-7-series,sifive-e20,sifive-e21,sifive-e24,sifive-e31,sifive-e34,sifive-e76,sifive-p450,sifive-p470,sifive-p550,sifive-p670,sifive-p870,sifive-s21,sifive-s51,sifive-s54,sifive-s76,sifive-u54,sifive-u74,sifive-x280,sifive-x390,spacemit-x60,syntacore-scr1-base,syntacore-scr1-max,syntacore-scr3-rv32,syntacore-scr3-rv64,syntacore-scr4-rv32,syntacore-scr4-rv64,syntacore-scr5-rv32,syntacore-scr5-rv64,syntacore-scr7,tt-ascalon-d8,veyron-v1,xiangshan-kunminghu,xiangshan-nanhu"), +}; + +// Generated with the featuregen script in `misc/featuregen` +gb_global String target_features_list[TargetArch_COUNT] = { + // TargetArch_Invalid: + str_lit(""), + // TargetArch_amd64: + str_lit("16bit-mode,32bit-mode,64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-avx512,amx-bf16,amx-complex,amx-fp16,amx-fp8,amx-int8,amx-movrs,amx-tf32,amx-tile,avx,avx10.1,avx10.1-512,avx10.2,avx10.2-512,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,branch-hint,branchfusion,ccmp,cf,cldemote,clflushopt,clwb,clzero,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,ermsb,evex512,f16c,false-deps-getmant,false-deps-lzcnt-tzcnt,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-popcnt,false-deps-range,fast-11bytenop,fast-15bytenop,fast-7bytenop,fast-bextr,fast-dpwssd,fast-gather,fast-hops,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fast-vector-shift-masks,faster-shift-than-shuffle,fma,fma4,fsgsbase,fsrm,fxsr,gfni,harden-sls-ijmp,harden-sls-ret,hreset,idivl-to-divb,idivq-to-divl,inline-asm-use-gpr32,invpcid,kl,lea-sp,lea-uses-ag,lvi-cfi,lvi-load-hardening,lwp,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,mwaitx,ndd,nf,no-bypass-delay,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pad-short-functions,pclmul,pconfig,pku,popcnt,ppx,prefer-128-bit,prefer-256-bit,prefer-legacy-setcc,prefer-mask-registers,prefer-movmsk-over-vtest,prefer-no-gather,prefer-no-scatter,prefetchi,prfchw,ptwrite,push2pop2,raoint,rdpid,rdpru,rdrnd,rdseed,retpoline,retpoline-external-thunk,retpoline-indirect-branches,retpoline-indirect-calls,rtm,sahf,sbb-dep-breaking,serialize,seses,sgx,sha,sha512,shstk,slow-3ops-lea,slow-incdec,slow-lea,slow-pmaddwd,slow-pmulld,slow-pmullq,slow-shld,slow-two-mem-ops,slow-unaligned-mem-16,slow-unaligned-mem-32,sm3,sm4,soft-float,sse,sse-unaligned-mem,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tagged-globals,tbm,tsxldtrk,tuning-fast-imm-vector-shift,uintr,use-glm-div-sqrt-costs,use-slm-arith-costs,usermsr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,widekl,x32,x87,xop,xsave,xsavec,xsaveopt,xsaves,zu"), + // TargetArch_i386: + str_lit("16bit-mode,32bit-mode,64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-avx512,amx-bf16,amx-complex,amx-fp16,amx-fp8,amx-int8,amx-movrs,amx-tf32,amx-tile,avx,avx10.1,avx10.1-512,avx10.2,avx10.2-512,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,branch-hint,branchfusion,ccmp,cf,cldemote,clflushopt,clwb,clzero,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,ermsb,evex512,f16c,false-deps-getmant,false-deps-lzcnt-tzcnt,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-popcnt,false-deps-range,fast-11bytenop,fast-15bytenop,fast-7bytenop,fast-bextr,fast-dpwssd,fast-gather,fast-hops,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fast-vector-shift-masks,faster-shift-than-shuffle,fma,fma4,fsgsbase,fsrm,fxsr,gfni,harden-sls-ijmp,harden-sls-ret,hreset,idivl-to-divb,idivq-to-divl,inline-asm-use-gpr32,invpcid,kl,lea-sp,lea-uses-ag,lvi-cfi,lvi-load-hardening,lwp,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,mwaitx,ndd,nf,no-bypass-delay,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pad-short-functions,pclmul,pconfig,pku,popcnt,ppx,prefer-128-bit,prefer-256-bit,prefer-legacy-setcc,prefer-mask-registers,prefer-movmsk-over-vtest,prefer-no-gather,prefer-no-scatter,prefetchi,prfchw,ptwrite,push2pop2,raoint,rdpid,rdpru,rdrnd,rdseed,retpoline,retpoline-external-thunk,retpoline-indirect-branches,retpoline-indirect-calls,rtm,sahf,sbb-dep-breaking,serialize,seses,sgx,sha,sha512,shstk,slow-3ops-lea,slow-incdec,slow-lea,slow-pmaddwd,slow-pmulld,slow-pmullq,slow-shld,slow-two-mem-ops,slow-unaligned-mem-16,slow-unaligned-mem-32,sm3,sm4,soft-float,sse,sse-unaligned-mem,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tagged-globals,tbm,tsxldtrk,tuning-fast-imm-vector-shift,uintr,use-glm-div-sqrt-costs,use-slm-arith-costs,usermsr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,widekl,x32,x87,xop,xsave,xsavec,xsaveopt,xsaves,zu"), + // TargetArch_arm32: + str_lit("32bit,8msecext,a12,a15,a17,a32,a35,a5,a53,a55,a57,a7,a72,a73,a75,a76,a77,a78c,a8,a9,aapcs-frame-chain,aclass,acquire-release,aes,armv4,armv4t,armv5t,armv5te,armv5tej,armv6,armv6-m,armv6j,armv6k,armv6kz,armv6s-m,armv6t2,armv7-a,armv7-m,armv7-r,armv7e-m,armv7k,armv7s,armv7ve,armv8-a,armv8-m.base,armv8-m.main,armv8-r,armv8.1-a,armv8.1-m.main,armv8.2-a,armv8.3-a,armv8.4-a,armv8.5-a,armv8.6-a,armv8.7-a,armv8.8-a,armv8.9-a,armv9-a,armv9.1-a,armv9.2-a,armv9.3-a,armv9.4-a,armv9.5-a,armv9.6-a,armv9.7-a,atomics-32,avoid-movs-shop,avoid-muls,avoid-partial-cpsr,bf16,big-endian-instructions,branch-align-64,cde,cdecp0,cdecp1,cdecp2,cdecp3,cdecp4,cdecp5,cdecp6,cdecp7,cheap-predicable-cpsr,clrbhb,cortex-a510,cortex-a710,cortex-a78,cortex-a78ae,cortex-x1,cortex-x1c,crc,crypto,d32,db,dfb,disable-postra-scheduler,dont-widen-vmovs,dotprod,dsp,execute-only,expand-fp-mlx,exynos,fix-cmse-cve-2021-35465,fix-cortex-a57-aes-1742098,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp16fml,fp64,fpao,fpregs,fpregs16,fpregs64,fullfp16,fuse-aes,fuse-literals,harden-sls-blr,harden-sls-nocomdat,harden-sls-retbr,hwdiv,hwdiv-arm,i8mm,iwmmxt,iwmmxt2,krait,kryo,lob,long-calls,loop-align,m3,m55,m7,m85,mclass,mp,muxed-units,mve,mve.fp,mve1beat,mve2beat,mve4beat,neon,neon-fpmovs,neonfp,neoverse-v1,no-branch-predictor,no-bti-at-return-twice,no-movt,no-neg-immediates,noarm,nonpipelined-vfp,pacbti,perfmon,prefer-ishst,prefer-vmovsr,prof-unpr,r4,r5,r52,r52plus,r7,ras,rclass,read-tp-tpidrprw,read-tp-tpidruro,read-tp-tpidrurw,reserve-r9,ret-addr-stack,sb,sha2,slow-fp-brcc,slow-load-D-subreg,slow-odd-reg,slow-vdup32,slow-vgetlni32,slowfpvfmx,slowfpvmlx,soft-float,splat-vfp-neon,strict-align,swift,thumb-mode,thumb2,trustzone,use-mipipeliner,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.1m.main,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8.9a,v8m,v8m.main,v9.1a,v9.2a,v9.3a,v9.4a,v9.5a,v9.6a,v9.7a,v9a,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,vldn-align,vmlx-forwarding,vmlx-hazards,wide-stride-vfp,xscale,zcz"), + // TargetArch_arm64: + str_lit("CONTEXTIDREL2,a320,a35,a510,a520,a520ae,a53,a55,a57,a64fx,a65,a710,a715,a72,a720,a720ae,a73,a75,a76,a77,a78,a78ae,a78c,addr-lsl-slow-14,aes,aggressive-fma,aggressive-interleaving,all,alternate-sextload-cvt-f32-pattern,altnzcv,alu-lsl-fast,am,ampere1,ampere1a,ampere1b,ampere1c,amvs,apple-a10,apple-a11,apple-a12,apple-a13,apple-a14,apple-a15,apple-a16,apple-a17,apple-a7,apple-m4,apple-m5,arith-bcc-fusion,arith-cbz-fusion,ascend-store-address,avoid-ldapur,balance-fp-ops,bf16,brbe,bti,btie,c1-nano,c1-premium,c1-pro,c1-ultra,call-saved-x10,call-saved-x11,call-saved-x12,call-saved-x13,call-saved-x14,call-saved-x15,call-saved-x18,call-saved-x8,call-saved-x9,carmel,ccdp,ccidx,ccpp,chk,clrbhb,cmh,cmp-bcc-fusion,cmpbr,complxnum,cortex-a725,cortex-r82,cortex-r82ae,cortex-x1,cortex-x2,cortex-x3,cortex-x4,cortex-x925,cpa,crc,crypto,cssc,d128,disable-fast-inc-vl,disable-latency-sched-heuristic,disable-ldp,disable-maximize-scalable-bandwidth,disable-stp,disable-unpredicated-ld-st-lower,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,execute-only,exynos-cheap-as-move,exynosm3,exynosm4,f16f32dot,f16f32mm,f16mm,f32mm,f64mm,f8f16mm,f8f32mm,falkor,faminmax,fgt,fix-cortex-a53-835769,flagm,fmv,force-32bit-jump-tables,fp-armv8,fp16fml,fp8,fp8dot2,fp8dot4,fp8fma,fpac,fprcvt,fptoint,fujitsu-monaka,fullfp16,fuse-address,fuse-addsub-2reg-const1,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-cset,fuse-literals,gcie,gcs,harden-sls-blr,harden-sls-nocomdat,harden-sls-retbr,hbc,hcx,i8mm,ite,jsconv,kryo,ldp-aligned-only,lor,ls64,lscp,lse,lse128,lse2,lsfe,lsui,lut,max-interleave-factor-4,mec,mops,mops-go,mpam,mpamv2,mte,mtetc,neon,neoverse512tvb,neoversee1,neoversen1,neoversen2,neoversen3,neoversev1,neoversev2,neoversev3,neoversev3AE,nmi,no-bti-at-return-twice,no-neg-immediates,no-sve-fp-ld1r,no-zcz-fpr64,nv,occmo,olympus,oryon-1,outline-atomics,pan,pan-rwv,pauth,pauth-lr,pcdphint,perfmon,poe2,pops,predictable-select-expensive,predres,prfm-slc-target,rand,ras,rasv2,rcpc,rcpc-immo,rcpc3,rdm,reserve-lr-for-ra,reserve-x1,reserve-x10,reserve-x11,reserve-x12,reserve-x13,reserve-x14,reserve-x15,reserve-x18,reserve-x2,reserve-x20,reserve-x21,reserve-x22,reserve-x23,reserve-x24,reserve-x25,reserve-x26,reserve-x27,reserve-x28,reserve-x3,reserve-x4,reserve-x5,reserve-x6,reserve-x7,reserve-x9,rme,saphira,sb,sel2,sha2,sha3,slow-misaligned-128store,slow-paired-128,slow-strqro-store,sm4,sme,sme-b16b16,sme-f16f16,sme-f64f64,sme-f8f16,sme-f8f32,sme-fa64,sme-i16i64,sme-lutv2,sme-mop4,sme-tmop,sme2,sme2p1,sme2p2,sme2p3,spe,spe-eef,specres2,specrestrict,ssbs,ssve-aes,ssve-bitperm,ssve-fexpa,ssve-fp8dot2,ssve-fp8dot4,ssve-fp8fma,store-pair-suppress,stp-aligned-only,strict-align,sve,sve-aes,sve-aes2,sve-b16b16,sve-b16mm,sve-bfscale,sve-bitperm,sve-f16f32mm,sve-sha3,sve-sm4,sve2,sve2-aes,sve2-bitperm,sve2-sha3,sve2-sm4,sve2p1,sve2p2,sve2p3,tagged-globals,tev,the,thunderx,thunderx2t99,thunderx3t110,thunderxt81,thunderxt83,thunderxt88,tlb-rmi,tlbid,tlbiw,tpidr-el1,tpidr-el2,tpidr-el3,tpidrro-el0,tracev8.4,trbe,tsv110,uaops,use-experimental-zeroing-pseudos,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,use-reciprocal-square-root,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8.9a,v8a,v8r,v9.1a,v9.2a,v9.3a,v9.4a,v9.5a,v9.6a,v9.7a,v9a,vh,wfxt,xs,zcm-fpr128,zcm-fpr32,zcm-fpr64,zcm-gpr32,zcm-gpr64,zcz-fp-workaround,zcz-fpr128,zcz-gpr32,zcz-gpr64"), + // TargetArch_wasm32: + str_lit("atomics,bulk-memory,bulk-memory-opt,call-indirect-overlong,exception-handling,extended-const,fp16,gc,multimemory,multivalue,mutable-globals,nontrapping-fptoint,reference-types,relaxed-simd,sign-ext,simd128,tail-call,wide-arithmetic"), + // TargetArch_wasm64p32: + str_lit("atomics,bulk-memory,bulk-memory-opt,call-indirect-overlong,exception-handling,extended-const,fp16,gc,multimemory,multivalue,mutable-globals,nontrapping-fptoint,reference-types,relaxed-simd,sign-ext,simd128,tail-call,wide-arithmetic"), + // TargetArch_riscv64: + str_lit("32bit,64bit,a,add-load-fusion,addi-load-fusion,andes45,auipc-addi-fusion,auipc-load-fusion,b,bfext-fusion,c,conditional-cmv-fusion,d,disable-latency-sched-heuristic,disable-misched-load-clustering,disable-misched-store-clustering,disable-postmisched-load-clustering,disable-postmisched-store-clustering,dlen-factor-2,e,enable-vsetvli-sched-heuristic,exact-asm,experimental,experimental-p,experimental-rvm23u32,experimental-smpmpmt,experimental-svukte,experimental-xrivosvisni,experimental-xrivosvizip,experimental-xsfmclic,experimental-xsfsclic,experimental-zibi,experimental-zicfilp,experimental-zicfiss,experimental-zvbc32e,experimental-zvfbfa,experimental-zvfofp8min,experimental-zvkgs,experimental-zvqdotq,f,forced-atomics,h,i,ld-add-fusion,log-vrgather,lui-addi-fusion,lui-load-fusion,m,mips-p8700,no-default-unroll,no-sink-splat-operands,no-trailing-seq-cst-fence,optimized-nf2-segment-load-store,optimized-nf3-segment-load-store,optimized-nf4-segment-load-store,optimized-nf5-segment-load-store,optimized-nf6-segment-load-store,optimized-nf7-segment-load-store,optimized-nf8-segment-load-store,optimized-zero-stride-load,permissive-zalrsc,predictable-select-expensive,prefer-vsetvli-over-read-vlenb,prefer-w-inst,q,relax,reserve-x1,reserve-x10,reserve-x11,reserve-x12,reserve-x13,reserve-x14,reserve-x15,reserve-x16,reserve-x17,reserve-x18,reserve-x19,reserve-x2,reserve-x20,reserve-x21,reserve-x22,reserve-x23,reserve-x24,reserve-x25,reserve-x26,reserve-x27,reserve-x28,reserve-x29,reserve-x3,reserve-x30,reserve-x31,reserve-x4,reserve-x5,reserve-x6,reserve-x7,reserve-x8,reserve-x9,rva20s64,rva20u64,rva22s64,rva22u64,rva23s64,rva23u64,rvb23s64,rvb23u64,rvi20u32,rvi20u64,save-restore,sdext,sdtrig,sha,shcounterenw,shgatpa,shifted-zextw-fusion,shlcofideleg,short-forward-branch-ialu,short-forward-branch-iload,short-forward-branch-iminmax,short-forward-branch-imul,shtvala,shvsatpa,shvstvala,shvstvecd,shxadd-load-fusion,sifive7,single-element-vec-fp64,smaia,smcdeleg,smcntrpmf,smcsrind,smctr,smdbltrp,smepmp,smmpm,smnpm,smrnmi,smstateen,ssaia,ssccfg,ssccptr,sscofpmf,sscounterenw,sscsrind,ssctr,ssdbltrp,ssnpm,sspm,ssqosid,ssstateen,ssstrict,sstc,sstvala,sstvecd,ssu64xl,supm,svade,svadu,svbare,svinval,svnapot,svpbmt,svvptc,tagged-globals,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,v,ventana-veyron,vl-dependent-latency,vxrm-pipeline-flush,xandesbfhcvt,xandesperf,xandesvbfhcvt,xandesvdot,xandesvpackfph,xandesvsinth,xandesvsintload,xcvalu,xcvbi,xcvbitmanip,xcvelw,xcvmac,xcvmem,xcvsimd,xmipscbop,xmipscmov,xmipsexectl,xmipslsp,xqccmp,xqci,xqcia,xqciac,xqcibi,xqcibm,xqcicli,xqcicm,xqcics,xqcicsr,xqciint,xqciio,xqcilb,xqcili,xqcilia,xqcilo,xqcilsm,xqcisim,xqcisls,xqcisync,xsfcease,xsfmm128t,xsfmm16t,xsfmm32a16f,xsfmm32a32f,xsfmm32a8f,xsfmm32a8i,xsfmm32t,xsfmm64a64f,xsfmm64t,xsfmmbase,xsfvcp,xsfvfbfexp16e,xsfvfexp16e,xsfvfexp32e,xsfvfexpa,xsfvfexpa64e,xsfvfnrclipxfqf,xsfvfwmaccqqq,xsfvqmaccdod,xsfvqmaccqoq,xsifivecdiscarddlone,xsifivecflushdlone,xsmtvdot,xtheadba,xtheadbb,xtheadbs,xtheadcmo,xtheadcondmov,xtheadfmemidx,xtheadmac,xtheadmemidx,xtheadmempair,xtheadsync,xtheadvdot,xventanacondops,xwchc,za128rs,za64rs,zaamo,zabha,zacas,zalasr,zalrsc,zama16b,zawrs,zba,zbb,zbc,zbkb,zbkc,zbkx,zbs,zca,zcb,zcd,zce,zcf,zclsd,zcmop,zcmp,zcmt,zdinx,zexth-fusion,zextw-fusion,zfa,zfbfmin,zfh,zfhmin,zfinx,zhinx,zhinxmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccamoc,ziccif,zicclsm,ziccrse,zicntr,zicond,zicsr,zifencei,zihintntl,zihintpause,zihpm,zilsd,zilsd-4byte-align,zimop,zk,zkn,zknd,zkne,zknh,zkr,zks,zksed,zksh,zkt,zmmul,ztso,zvbb,zvbc,zve32f,zve32x,zve64d,zve64f,zve64x,zvfbfmin,zvfbfwma,zvfh,zvfhmin,zvkb,zvkg,zvkn,zvknc,zvkned,zvkng,zvknha,zvknhb,zvks,zvksc,zvksed,zvksg,zvksh,zvkt,zvl1024b,zvl128b,zvl16384b,zvl2048b,zvl256b,zvl32768b,zvl32b,zvl4096b,zvl512b,zvl64b,zvl65536b,zvl8192b"), +}; + +// Generated with the featuregen script in `misc/featuregen` +gb_global int target_microarch_counts[TargetArch_COUNT] = { + // TargetArch_Invalid: + 0, + // TargetArch_amd64: + 131, + // TargetArch_i386: + 131, + // TargetArch_arm32: + 96, + // TargetArch_arm64: + 98, + // TargetArch_wasm32: + 4, + // TargetArch_wasm64p32: + 4, + // TargetArch_riscv64: + 51, +}; + +// Generated with the featuregen script in `misc/featuregen` +gb_global MicroarchFeatureList microarch_features_list[] = { + // TargetArch_amd64: + { str_lit("alderlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("amdfam10"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,idivq-to-divl,lzcnt,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,vzeroupper,x87") }, + { str_lit("arrowlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("arrowlake-s"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("arrowlake_s"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("athlon"), str_lit("64bit-mode,cmov,cx8,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-4"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-fx"), str_lit("64bit,64bit-mode,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-mp"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-tbird"), str_lit("64bit-mode,cmov,cx8,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-xp"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon64"), str_lit("64bit,64bit-mode,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon64-sse3"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("atom"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-imm16,fxsr,idivl-to-divb,idivq-to-divl,lea-sp,lea-uses-ag,mmx,movbe,no-bypass-delay,nopl,pad-short-functions,sahf,slow-two-mem-ops,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("atom_sse4_2"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("atom_sse4_2_movbe"), str_lit("64bit,64bit-mode,aes,clflushopt,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fsgsbase,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("barcelona"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,idivq-to-divl,lzcnt,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,vzeroupper,x87") }, + { str_lit("bdver1"), str_lit("64bit,64bit-mode,aes,avx,branchfusion,cmov,crc32,cx16,cx8,fast-11bytenop,fast-scalar-shift-masks,fma4,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,x87,xop,xsave") }, + { str_lit("bdver2"), str_lit("64bit,64bit-mode,aes,avx,bmi,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave") }, + { str_lit("bdver3"), str_lit("64bit,64bit-mode,aes,avx,bmi,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fsgsbase,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave,xsaveopt") }, + { str_lit("bdver4"), str_lit("64bit,64bit-mode,aes,avx,avx2,bmi,bmi2,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fsgsbase,fxsr,idivq-to-divl,lwp,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave,xsaveopt") }, + { str_lit("bonnell"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-imm16,fxsr,idivl-to-divb,idivq-to-divl,lea-sp,lea-uses-ag,mmx,movbe,no-bypass-delay,nopl,pad-short-functions,sahf,slow-two-mem-ops,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("broadwell"), str_lit("64bit,64bit-mode,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("btver1"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-15bytenop,fast-imm16,fast-scalar-shift-masks,fast-vector-shift-masks,fxsr,idivq-to-divl,lzcnt,mmx,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,ssse3,vzeroupper,x87") }, + { str_lit("btver2"), str_lit("64bit,64bit-mode,aes,avx,bmi,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-hops,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-shift-masks,fast-vector-shift-masks,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,x87,xsave,xsaveopt") }, + { str_lit("c3"), str_lit("64bit-mode,mmx,prfchw,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("c3-2"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("cannonlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vl,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,sha,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("cascadelake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,avx512vnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("clearwaterforest"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,usermsr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("cooperlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,avx512vnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("core-avx-i"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core-avx2"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core2"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("core_2_duo_sse4_1"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,sse4.1,ssse3,vzeroupper,x87") }, + { str_lit("core_2_duo_ssse3"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("core_2nd_gen_avx"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_3rd_gen_avx"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_4th_gen_avx"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_4th_gen_avx_tsx"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_5th_gen_avx"), str_lit("64bit,64bit-mode,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_5th_gen_avx_tsx"), str_lit("64bit,64bit-mode,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_aes_pclmulqdq"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("core_i7_sse4_2"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("corei7"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("corei7-avx"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("diamondrapids"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-avx512,amx-bf16,amx-complex,amx-fp16,amx-fp8,amx-int8,amx-movrs,amx-tf32,amx-tile,avx,avx10.1,avx10.2,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,branch-hint,ccmp,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,ndd,nf,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,ppx,prefer-256-bit,prefetchi,prfchw,ptwrite,push2pop2,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves,zu") }, + { str_lit("emeraldrapids"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-bf16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("generic"), str_lit("64bit,64bit-mode,cx8,fast-15bytenop,fast-scalar-fsqrt,idivq-to-divl,macrofusion,slow-3ops-lea,sse,sse2,vzeroupper,x87") }, + { str_lit("geode"), str_lit("64bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("goldmont"), str_lit("64bit,64bit-mode,aes,clflushopt,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("goldmont-plus"), str_lit("64bit,64bit-mode,aes,clflushopt,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("goldmont_plus"), str_lit("64bit,64bit-mode,aes,clflushopt,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("gracemont"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("grandridge"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-bf16,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids-d"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-bf16,amx-complex,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids_d"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-bf16,amx-complex,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("haswell"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("i386"), str_lit("64bit-mode,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("i486"), str_lit("64bit-mode,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("i586"), str_lit("64bit-mode,cx8,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("i686"), str_lit("64bit-mode,cmov,cx8,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("icelake-client"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake-server"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake_client"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake_server"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("ivybridge"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("k6"), str_lit("64bit-mode,cx8,mmx,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("k6-2"), str_lit("64bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("k6-3"), str_lit("64bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("k8"), str_lit("64bit,64bit-mode,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("k8-sse3"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("knl"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avx512cd,avx512f,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("knm"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avx512cd,avx512f,avx512vpopcntdq,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("lakemont"), str_lit("64bit-mode,cx8,slow-unaligned-mem-16,sse,sse2,vzeroupper") }, + { str_lit("lunarlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("meteorlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("mic_avx512"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avx512cd,avx512f,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("nehalem"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("nocona"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("novalake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx10.1,avx10.2,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,ccmp,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,ndd,nf,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,ppx,prefer-movmsk-over-vtest,prefetchi,prfchw,ptwrite,push2pop2,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves,zu") }, + { str_lit("opteron"), str_lit("64bit,64bit-mode,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("opteron-sse3"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("pantherlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("penryn"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,sse4.1,ssse3,vzeroupper,x87") }, + { str_lit("pentium"), str_lit("64bit-mode,cx8,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium-m"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium-mmx"), str_lit("64bit-mode,cx8,mmx,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium2"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium3"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium3m"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium4"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium4m"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_4"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_4_sse3"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("pentium_ii"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_iii"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_iii_no_xmm_regs"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_m"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_mmx"), str_lit("64bit-mode,cx8,mmx,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_pro"), str_lit("64bit-mode,cmov,cx8,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentiumpro"), str_lit("64bit-mode,cmov,cx8,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("prescott"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("raptorlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("rocketlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("sandybridge"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("sapphirerapids"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-bf16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("sierraforest"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("silvermont"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("skx"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake-avx512"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake_avx512"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("slm"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("tigerlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("tremont"), str_lit("64bit,64bit-mode,aes,clflushopt,clwb,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,gfni,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("westmere"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("wildcatlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("winchip-c6"), str_lit("64bit-mode,mmx,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("winchip2"), str_lit("64bit-mode,mmx,prfchw,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("x86-64"), str_lit("64bit,64bit-mode,cmov,cx8,fxsr,idivq-to-divl,macrofusion,mmx,nopl,slow-3ops-lea,slow-incdec,sse,sse2,vzeroupper,x87") }, + { str_lit("x86-64-v2"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,nopl,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("x86-64-v3"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fxsr,idivq-to-divl,lzcnt,macrofusion,mmx,movbe,nopl,popcnt,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave") }, + { str_lit("x86-64-v4"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fxsr,idivq-to-divl,lzcnt,macrofusion,mmx,movbe,nopl,popcnt,prefer-256-bit,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave") }, + { str_lit("yonah"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("znver1"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver2"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver3"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,mwaitx,nopl,pclmul,pku,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver4"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-dpwssd,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,mwaitx,nopl,pclmul,pku,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,shstk,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver5"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,avxvnni,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-dpwssd,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,mwaitx,nopl,pclmul,pku,popcnt,prefetchi,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,shstk,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + // TargetArch_i386: + { str_lit("alderlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("amdfam10"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,idivq-to-divl,lzcnt,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,vzeroupper,x87") }, + { str_lit("arrowlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("arrowlake-s"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("arrowlake_s"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("athlon"), str_lit("32bit-mode,cmov,cx8,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("athlon-4"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("athlon-fx"), str_lit("32bit-mode,64bit,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-mp"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("athlon-tbird"), str_lit("32bit-mode,cmov,cx8,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("athlon-xp"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("athlon64"), str_lit("32bit-mode,64bit,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon64-sse3"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("atom"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-imm16,fxsr,idivl-to-divb,idivq-to-divl,lea-sp,lea-uses-ag,mmx,movbe,no-bypass-delay,nopl,pad-short-functions,sahf,slow-two-mem-ops,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("atom_sse4_2"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("atom_sse4_2_movbe"), str_lit("32bit-mode,64bit,aes,clflushopt,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fsgsbase,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("barcelona"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,idivq-to-divl,lzcnt,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,vzeroupper,x87") }, + { str_lit("bdver1"), str_lit("32bit-mode,64bit,aes,avx,branchfusion,cmov,crc32,cx16,cx8,fast-11bytenop,fast-scalar-shift-masks,fma4,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,x87,xop,xsave") }, + { str_lit("bdver2"), str_lit("32bit-mode,64bit,aes,avx,bmi,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave") }, + { str_lit("bdver3"), str_lit("32bit-mode,64bit,aes,avx,bmi,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fsgsbase,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave,xsaveopt") }, + { str_lit("bdver4"), str_lit("32bit-mode,64bit,aes,avx,avx2,bmi,bmi2,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fsgsbase,fxsr,idivq-to-divl,lwp,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave,xsaveopt") }, + { str_lit("bonnell"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-imm16,fxsr,idivl-to-divb,idivq-to-divl,lea-sp,lea-uses-ag,mmx,movbe,no-bypass-delay,nopl,pad-short-functions,sahf,slow-two-mem-ops,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("broadwell"), str_lit("32bit-mode,64bit,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("btver1"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-15bytenop,fast-imm16,fast-scalar-shift-masks,fast-vector-shift-masks,fxsr,idivq-to-divl,lzcnt,mmx,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,ssse3,vzeroupper,x87") }, + { str_lit("btver2"), str_lit("32bit-mode,64bit,aes,avx,bmi,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-hops,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-shift-masks,fast-vector-shift-masks,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,x87,xsave,xsaveopt") }, + { str_lit("c3"), str_lit("32bit-mode,mmx,prfchw,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("c3-2"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("cannonlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vl,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,sha,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("cascadelake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,avx512vnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("clearwaterforest"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,usermsr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("cooperlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,avx512vnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("core-avx-i"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core-avx2"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core2"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("core_2_duo_sse4_1"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,sse4.1,ssse3,vzeroupper,x87") }, + { str_lit("core_2_duo_ssse3"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("core_2nd_gen_avx"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_3rd_gen_avx"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_4th_gen_avx"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_4th_gen_avx_tsx"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_5th_gen_avx"), str_lit("32bit-mode,64bit,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_5th_gen_avx_tsx"), str_lit("32bit-mode,64bit,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_aes_pclmulqdq"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("core_i7_sse4_2"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("corei7"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("corei7-avx"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("diamondrapids"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-avx512,amx-bf16,amx-complex,amx-fp16,amx-fp8,amx-int8,amx-movrs,amx-tf32,amx-tile,avx,avx10.1,avx10.2,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,branch-hint,ccmp,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,ndd,nf,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,ppx,prefer-256-bit,prefetchi,prfchw,ptwrite,push2pop2,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves,zu") }, + { str_lit("emeraldrapids"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-bf16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("generic"), str_lit("32bit-mode,64bit,cx8,fast-15bytenop,fast-scalar-fsqrt,idivq-to-divl,macrofusion,slow-3ops-lea,vzeroupper,x87") }, + { str_lit("geode"), str_lit("32bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("goldmont"), str_lit("32bit-mode,64bit,aes,clflushopt,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("goldmont-plus"), str_lit("32bit-mode,64bit,aes,clflushopt,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("goldmont_plus"), str_lit("32bit-mode,64bit,aes,clflushopt,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("gracemont"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("grandridge"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-bf16,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids-d"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-bf16,amx-complex,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids_d"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-bf16,amx-complex,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("haswell"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("i386"), str_lit("32bit-mode,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("i486"), str_lit("32bit-mode,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("i586"), str_lit("32bit-mode,cx8,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("i686"), str_lit("32bit-mode,cmov,cx8,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("icelake-client"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake-server"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake_client"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake_server"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("ivybridge"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("k6"), str_lit("32bit-mode,cx8,mmx,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("k6-2"), str_lit("32bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("k6-3"), str_lit("32bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("k8"), str_lit("32bit-mode,64bit,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("k8-sse3"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("knl"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avx512cd,avx512f,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("knm"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avx512cd,avx512f,avx512vpopcntdq,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("lakemont"), str_lit("32bit-mode,cx8,slow-unaligned-mem-16,vzeroupper") }, + { str_lit("lunarlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("meteorlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("mic_avx512"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avx512cd,avx512f,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("nehalem"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("nocona"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("novalake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx10.1,avx10.2,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,ccmp,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,ndd,nf,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,ppx,prefer-movmsk-over-vtest,prefetchi,prfchw,ptwrite,push2pop2,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves,zu") }, + { str_lit("opteron"), str_lit("32bit-mode,64bit,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("opteron-sse3"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("pantherlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("penryn"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,sse4.1,ssse3,vzeroupper,x87") }, + { str_lit("pentium"), str_lit("32bit-mode,cx8,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentium-m"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium-mmx"), str_lit("32bit-mode,cx8,mmx,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentium2"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentium3"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("pentium3m"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("pentium4"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium4m"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_4"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_4_sse3"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("pentium_ii"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentium_iii"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("pentium_iii_no_xmm_regs"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("pentium_m"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_mmx"), str_lit("32bit-mode,cx8,mmx,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentium_pro"), str_lit("32bit-mode,cmov,cx8,nopl,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentiumpro"), str_lit("32bit-mode,cmov,cx8,nopl,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("prescott"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("raptorlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("rocketlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("sandybridge"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("sapphirerapids"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-bf16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("sierraforest"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("silvermont"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("skx"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake-avx512"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake_avx512"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("slm"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("tigerlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("tremont"), str_lit("32bit-mode,64bit,aes,clflushopt,clwb,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,gfni,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("westmere"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("wildcatlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("winchip-c6"), str_lit("32bit-mode,mmx,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("winchip2"), str_lit("32bit-mode,mmx,prfchw,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("x86-64"), str_lit("32bit-mode,64bit,cmov,cx8,fxsr,idivq-to-divl,macrofusion,mmx,nopl,slow-3ops-lea,slow-incdec,sse,sse2,vzeroupper,x87") }, + { str_lit("x86-64-v2"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,nopl,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("x86-64-v3"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fxsr,idivq-to-divl,lzcnt,macrofusion,mmx,movbe,nopl,popcnt,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave") }, + { str_lit("x86-64-v4"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fxsr,idivq-to-divl,lzcnt,macrofusion,mmx,movbe,nopl,popcnt,prefer-256-bit,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave") }, + { str_lit("yonah"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("znver1"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver2"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver3"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,mwaitx,nopl,pclmul,pku,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver4"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-dpwssd,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,mwaitx,nopl,pclmul,pku,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,shstk,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver5"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,avxvnni,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-dpwssd,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,mwaitx,nopl,pclmul,pku,popcnt,prefetchi,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,shstk,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + // TargetArch_arm32: + { str_lit("arm1020e"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm1020t"), str_lit("armv5t,v4t,v5t") }, + { str_lit("arm1022e"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm10e"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm10tdmi"), str_lit("armv5t,v4t,v5t") }, + { str_lit("arm1136j-s"), str_lit("armv6,dsp,v4t,v5t,v5te,v6") }, + { str_lit("arm1136jf-s"), str_lit("armv6,dsp,fp64,fpregs,fpregs64,slowfpvmlx,v4t,v5t,v5te,v6,vfp2,vfp2sp") }, + { str_lit("arm1156t2-s"), str_lit("armv6t2,dsp,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v8m") }, + { str_lit("arm1156t2f-s"), str_lit("armv6t2,dsp,fp64,fpregs,fpregs64,slowfpvmlx,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v8m,vfp2,vfp2sp") }, + { str_lit("arm1176jz-s"), str_lit("armv6kz,trustzone,v4t,v5t,v5te,v6,v6k") }, + { str_lit("arm1176jzf-s"), str_lit("armv6kz,fp64,fpregs,fpregs64,slowfpvmlx,trustzone,v4t,v5t,v5te,v6,v6k,vfp2,vfp2sp") }, + { str_lit("arm710t"), str_lit("armv4t,v4t") }, + { str_lit("arm720t"), str_lit("armv4t,v4t") }, + { str_lit("arm7tdmi"), str_lit("armv4t,v4t") }, + { str_lit("arm7tdmi-s"), str_lit("armv4t,v4t") }, + { str_lit("arm8"), str_lit("armv4") }, + { str_lit("arm810"), str_lit("armv4") }, + { str_lit("arm9"), str_lit("armv4t,v4t") }, + { str_lit("arm920"), str_lit("armv4t,v4t") }, + { str_lit("arm920t"), str_lit("armv4t,v4t") }, + { str_lit("arm922t"), str_lit("armv4t,v4t") }, + { str_lit("arm926ej-s"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm940t"), str_lit("armv4t,v4t") }, + { str_lit("arm946e-s"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm966e-s"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm968e-s"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm9e"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm9tdmi"), str_lit("armv4t,v4t") }, + { str_lit("cortex-a12"), str_lit("a12,aclass,armv7-a,avoid-partial-cpsr,d32,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ret-addr-stack,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,vmlx-forwarding") }, + { str_lit("cortex-a15"), str_lit("a15,aclass,armv7-a,avoid-partial-cpsr,d32,db,dont-widen-vmovs,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,muxed-units,neon,perfmon,ret-addr-stack,splat-vfp-neon,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,vldn-align") }, + { str_lit("cortex-a17"), str_lit("a17,aclass,armv7-a,avoid-partial-cpsr,d32,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ret-addr-stack,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,vmlx-forwarding") }, + { str_lit("cortex-a32"), str_lit("aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a35"), str_lit("a35,aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a5"), str_lit("a5,aclass,armv7-a,d32,db,dsp,fp16,fp64,fpregs,fpregs64,mp,neon,perfmon,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,vmlx-forwarding") }, + { str_lit("cortex-a510"), str_lit("aclass,acquire-release,armv9-a,bf16,cortex-a710,crc,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp16fml,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,i8mm,mp,neon,perfmon,ras,sb,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8m,v9a,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a53"), str_lit("a53,aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpao,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a55"), str_lit("a55,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a57"), str_lit("a57,aclass,acquire-release,aes,armv8-a,avoid-partial-cpsr,cheap-predicable-cpsr,crc,crypto,d32,db,dsp,fix-cortex-a57-aes-1742098,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpao,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a7"), str_lit("a7,aclass,armv7-a,d32,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,vmlx-forwarding,vmlx-hazards") }, + { str_lit("cortex-a710"), str_lit("aclass,acquire-release,armv9-a,bf16,cortex-a710,crc,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp16fml,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,i8mm,mp,neon,perfmon,ras,sb,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8m,v9a,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a72"), str_lit("a72,aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fix-cortex-a57-aes-1742098,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a73"), str_lit("a73,aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a75"), str_lit("a75,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a76"), str_lit("a76,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a76ae"), str_lit("a76,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a77"), str_lit("a77,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a78"), str_lit("aclass,acquire-release,aes,armv8.2-a,cortex-a78,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a78ae"), str_lit("aclass,acquire-release,aes,armv8.2-a,cortex-a78ae,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a78c"), str_lit("a78c,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a8"), str_lit("a8,aclass,armv7-a,d32,db,dsp,fp64,fpregs,fpregs64,neon,nonpipelined-vfp,perfmon,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vmlx-forwarding,vmlx-hazards") }, + { str_lit("cortex-a9"), str_lit("a9,aclass,armv7-a,avoid-partial-cpsr,d32,db,dsp,expand-fp-mlx,fp16,fp64,fpregs,fpregs64,mp,muxed-units,neon,neon-fpmovs,perfmon,prefer-vmovsr,ret-addr-stack,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vldn-align,vmlx-forwarding,vmlx-hazards") }, + { str_lit("cortex-m0"), str_lit("armv6-m,db,mclass,no-branch-predictor,noarm,strict-align,thumb-mode,v4t,v5t,v5te,v6,v6m") }, + { str_lit("cortex-m0plus"), str_lit("armv6-m,db,mclass,no-branch-predictor,noarm,strict-align,thumb-mode,v4t,v5t,v5te,v6,v6m") }, + { str_lit("cortex-m1"), str_lit("armv6-m,db,mclass,no-branch-predictor,noarm,strict-align,thumb-mode,v4t,v5t,v5te,v6,v6m") }, + { str_lit("cortex-m23"), str_lit("8msecext,acquire-release,armv8-m.base,db,hwdiv,mclass,no-branch-predictor,no-movt,noarm,strict-align,thumb-mode,v4t,v5t,v5te,v6,v6m,v7clrex,v8m") }, + { str_lit("cortex-m3"), str_lit("armv7-m,db,hwdiv,loop-align,m3,mclass,no-branch-predictor,noarm,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m") }, + { str_lit("cortex-m33"), str_lit("8msecext,acquire-release,armv8-m.main,avoid-muls,db,dsp,fix-cmse-cve-2021-35465,fp-armv8d16sp,fp16,fpregs,hwdiv,loop-align,mclass,no-branch-predictor,noarm,slowfpvfmx,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,v8m.main,vfp2sp,vfp3d16sp,vfp4d16sp") }, + { str_lit("cortex-m35p"), str_lit("8msecext,acquire-release,armv8-m.main,db,dsp,fix-cmse-cve-2021-35465,fp-armv8d16sp,fp16,fpregs,hwdiv,loop-align,mclass,no-branch-predictor,noarm,slowfpvfmx,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,v8m.main,vfp2sp,vfp3d16sp,vfp4d16sp") }, + { str_lit("cortex-m4"), str_lit("armv7e-m,db,dsp,fp16,fpregs,hwdiv,loop-align,mclass,no-branch-predictor,noarm,slowfpvfmx,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2sp,vfp3d16sp,vfp4d16sp") }, + { str_lit("cortex-m52"), str_lit("8msecext,acquire-release,armv8.1-m.main,db,dsp,fp-armv8d16,fp-armv8d16sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,lob,loop-align,mclass,mve,mve.fp,mve1beat,no-branch-predictor,noarm,pacbti,ras,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8.1m.main,v8m,v8m.main,vfp2,vfp2sp,vfp3d16,vfp3d16sp,vfp4d16,vfp4d16sp") }, + { str_lit("cortex-m55"), str_lit("8msecext,acquire-release,armv8.1-m.main,db,dsp,fix-cmse-cve-2021-35465,fp-armv8d16,fp-armv8d16sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,lob,loop-align,m55,mclass,mve,mve.fp,no-branch-predictor,noarm,ras,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8.1m.main,v8m,v8m.main,vfp2,vfp2sp,vfp3d16,vfp3d16sp,vfp4d16,vfp4d16sp") }, + { str_lit("cortex-m7"), str_lit("armv7e-m,branch-align-64,db,dsp,fp-armv8d16,fp-armv8d16sp,fp16,fp64,fpregs,fpregs64,hwdiv,m7,mclass,noarm,thumb-mode,thumb2,use-mipipeliner,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3d16,vfp3d16sp,vfp4d16,vfp4d16sp") }, + { str_lit("cortex-m85"), str_lit("8msecext,acquire-release,armv8.1-m.main,branch-align-64,db,dsp,fp-armv8d16,fp-armv8d16sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,lob,m85,mclass,mve,mve.fp,noarm,pacbti,ras,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8.1m.main,v8m,v8m.main,vfp2,vfp2sp,vfp3d16,vfp3d16sp,vfp4d16,vfp4d16sp") }, + { str_lit("cortex-r4"), str_lit("armv7-r,avoid-partial-cpsr,db,dsp,hwdiv,perfmon,r4,rclass,ret-addr-stack,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m") }, + { str_lit("cortex-r4f"), str_lit("armv7-r,avoid-partial-cpsr,db,dsp,fp64,fpregs,fpregs64,hwdiv,perfmon,r4,rclass,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3d16,vfp3d16sp") }, + { str_lit("cortex-r5"), str_lit("armv7-r,avoid-partial-cpsr,db,dsp,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,perfmon,r5,rclass,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3d16,vfp3d16sp") }, + { str_lit("cortex-r52"), str_lit("acquire-release,armv8-r,crc,d32,db,dfb,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpao,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,r52,rclass,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-r52plus"), str_lit("acquire-release,armv8-r,crc,d32,db,dfb,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpao,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,r52plus,rclass,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-r7"), str_lit("armv7-r,avoid-partial-cpsr,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,perfmon,r7,rclass,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3d16,vfp3d16sp") }, + { str_lit("cortex-r8"), str_lit("armv7-r,avoid-partial-cpsr,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,perfmon,rclass,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3d16,vfp3d16sp") }, + { str_lit("cortex-x1"), str_lit("aclass,acquire-release,aes,armv8.2-a,cortex-x1,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-x1c"), str_lit("aclass,acquire-release,aes,armv8.2-a,cortex-x1c,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cyclone"), str_lit("aclass,acquire-release,aes,armv8-a,avoid-movs-shop,avoid-partial-cpsr,crc,crypto,d32,db,disable-postra-scheduler,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,neonfp,perfmon,ret-addr-stack,sha2,slowfpvfmx,slowfpvmlx,swift,thumb2,trustzone,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,zcz") }, + { str_lit("ep9312"), str_lit("armv4t,v4t") }, + { str_lit("exynos-m3"), str_lit("aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dont-widen-vmovs,dsp,expand-fp-mlx,exynos,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,fuse-aes,fuse-literals,hwdiv,hwdiv-arm,mp,neon,perfmon,prof-unpr,ret-addr-stack,sha2,slow-fp-brcc,slow-vdup32,slow-vgetlni32,slowfpvfmx,slowfpvmlx,splat-vfp-neon,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,wide-stride-vfp,zcz") }, + { str_lit("exynos-m4"), str_lit("aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dont-widen-vmovs,dotprod,dsp,expand-fp-mlx,exynos,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,fuse-aes,fuse-literals,hwdiv,hwdiv-arm,mp,neon,perfmon,prof-unpr,ras,ret-addr-stack,sha2,slow-fp-brcc,slow-vdup32,slow-vgetlni32,slowfpvfmx,slowfpvmlx,splat-vfp-neon,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,wide-stride-vfp,zcz") }, + { str_lit("exynos-m5"), str_lit("aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dont-widen-vmovs,dotprod,dsp,expand-fp-mlx,exynos,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,fuse-aes,fuse-literals,hwdiv,hwdiv-arm,mp,neon,perfmon,prof-unpr,ras,ret-addr-stack,sha2,slow-fp-brcc,slow-vdup32,slow-vgetlni32,slowfpvfmx,slowfpvmlx,splat-vfp-neon,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,wide-stride-vfp,zcz") }, + { str_lit("generic"), str_lit("") }, + { str_lit("iwmmxt"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("krait"), str_lit("aclass,armv7-a,avoid-partial-cpsr,d32,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,krait,muxed-units,neon,perfmon,ret-addr-stack,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,vldn-align,vmlx-forwarding") }, + { str_lit("kryo"), str_lit("aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,kryo,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("mpcore"), str_lit("armv6k,fp64,fpregs,fpregs64,slowfpvmlx,v4t,v5t,v5te,v6,v6k,vfp2,vfp2sp") }, + { str_lit("mpcorenovfp"), str_lit("armv6k,v4t,v5t,v5te,v6,v6k") }, + { str_lit("neoverse-n1"), str_lit("aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("neoverse-n2"), str_lit("aclass,acquire-release,armv9-a,bf16,crc,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp16fml,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,i8mm,mp,neon,perfmon,ras,sb,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8m,v9a,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("neoverse-v1"), str_lit("aclass,acquire-release,aes,armv8.4-a,bf16,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,i8mm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8.3a,v8.4a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("sc000"), str_lit("armv6-m,db,mclass,no-branch-predictor,noarm,strict-align,thumb-mode,v4t,v5t,v5te,v6,v6m") }, + { str_lit("sc300"), str_lit("armv7-m,db,hwdiv,m3,mclass,no-branch-predictor,noarm,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m") }, + { str_lit("star-mc1"), str_lit("8msecext,acquire-release,armv8-m.main,avoid-muls,db,dsp,fix-cmse-cve-2021-35465,fp-armv8d16sp,fp16,fpregs,hwdiv,loop-align,mclass,no-branch-predictor,noarm,slowfpvfmx,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,v8m.main,vfp2sp,vfp3d16sp,vfp4d16sp") }, + { str_lit("star-mc3"), str_lit("8msecext,acquire-release,armv8.1-m.main,db,dsp,fp-armv8d16,fp-armv8d16sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,lob,loop-align,mclass,mve,mve.fp,mve1beat,no-branch-predictor,noarm,pacbti,ras,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8.1m.main,v8m,v8m.main,vfp2,vfp2sp,vfp3d16,vfp3d16sp,vfp4d16,vfp4d16sp") }, + { str_lit("strongarm"), str_lit("armv4") }, + { str_lit("strongarm110"), str_lit("armv4") }, + { str_lit("strongarm1100"), str_lit("armv4") }, + { str_lit("strongarm1110"), str_lit("armv4") }, + { str_lit("swift"), str_lit("aclass,armv7-a,avoid-movs-shop,avoid-partial-cpsr,d32,db,disable-postra-scheduler,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,neonfp,perfmon,prefer-ishst,prof-unpr,ret-addr-stack,slow-load-D-subreg,slow-odd-reg,slow-vdup32,slow-vgetlni32,slowfpvfmx,slowfpvmlx,swift,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,vmlx-hazards,wide-stride-vfp") }, + { str_lit("xscale"), str_lit("armv5te,v4t,v5t,v5te") }, + // TargetArch_arm64: + { str_lit("a64fx"), str_lit("CONTEXTIDREL2,a64fx,aes,aggressive-fma,arith-bcc-fusion,ccpp,complxnum,crc,disable-unpredicated-ld-st-lower,el2vmsa,el3,fp-armv8,fullfp16,lor,lse,max-interleave-factor-4,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rdm,sha2,store-pair-suppress,sve,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("ampere1"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,altnzcv,alu-lsl-fast,am,ampere1,amvs,arith-bcc-fusion,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-literals,i8mm,jsconv,ldp-aligned-only,lor,lse,lse2,max-interleave-factor-4,mpam,neon,nv,pan,pan-rwv,pauth,perfmon,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,stp-aligned-only,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh") }, + { str_lit("ampere1a"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,altnzcv,alu-lsl-fast,am,ampere1a,amvs,arith-bcc-fusion,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fptoint,fullfp16,fuse-address,fuse-addsub-2reg-const1,fuse-adrp-add,fuse-aes,fuse-literals,i8mm,jsconv,ldp-aligned-only,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,specrestrict,ssbs,store-pair-suppress,stp-aligned-only,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh") }, + { str_lit("ampere1b"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,altnzcv,alu-lsl-fast,am,ampere1b,amvs,arith-bcc-fusion,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,cssc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,fgt,flagm,fp-armv8,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-literals,hcx,i8mm,jsconv,ldp-aligned-only,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,specrestrict,ssbs,store-pair-suppress,stp-aligned-only,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,vh,wfxt,xs") }, + { str_lit("ampere1c"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,altnzcv,alu-lsl-fast,am,ampere1c,amvs,arith-bcc-fusion,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,cssc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,faminmax,fgt,flagm,fp-armv8,fp16fml,fp8,fp8fma,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,lut,max-interleave-factor-4,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,specrestrict,ssbs,store-pair-suppress,sve,sve-aes,sve-b16b16,sve-sha3,sve-sm4,sve2,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("apple-a10"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,apple-a10,arith-bcc-fusion,arith-cbz-fusion,crc,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fuse-aes,fuse-crypto-eor,lor,neon,no-zcz-fpr64,pan,perfmon,rdm,sha2,store-pair-suppress,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a11"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,apple-a11,arith-bcc-fusion,arith-cbz-fusion,ccpp,crc,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fullfp16,fuse-aes,fuse-crypto-eor,lor,lse,neon,no-zcz-fpr64,pan,pan-rwv,perfmon,ras,rdm,sha2,store-pair-suppress,uaops,v8.1a,v8.2a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a12"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,apple-a12,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,neon,no-zcz-fpr64,pan,pan-rwv,pauth,perfmon,ras,rcpc,rdm,sha2,store-pair-suppress,uaops,v8.1a,v8.2a,v8.3a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a13"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,am,apple-a13,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,lse2,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a14"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,alternate-sextload-cvt-f32-pattern,altnzcv,am,apple-a14,arith-bcc-fusion,arith-cbz-fusion,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fptoint,fullfp16,fuse-address,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a15"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a15,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a16"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a16,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a17"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a17,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a18"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-m4,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sme,sme-f64f64,sme-i16i64,sme2,specrestrict,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,vh,wfxt,xs,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a19"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-m5,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,cssc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hbc,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sme,sme-b16b16,sme-f16f16,sme-f64f64,sme-i16i64,sme2,sme2p1,specres2,specrestrict,sve-b16b16,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,vh,wfxt,xs,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a7"), str_lit("aes,alternate-sextload-cvt-f32-pattern,apple-a7,arith-bcc-fusion,arith-cbz-fusion,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fuse-aes,fuse-crypto-eor,neon,no-zcz-fpr64,perfmon,sha2,store-pair-suppress,v8a,zcm-fpr128,zcm-gpr64,zcz-fp-workaround,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a8"), str_lit("aes,alternate-sextload-cvt-f32-pattern,apple-a7,arith-bcc-fusion,arith-cbz-fusion,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fuse-aes,fuse-crypto-eor,neon,no-zcz-fpr64,perfmon,sha2,store-pair-suppress,v8a,zcm-fpr128,zcm-gpr64,zcz-fp-workaround,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a9"), str_lit("aes,alternate-sextload-cvt-f32-pattern,apple-a7,arith-bcc-fusion,arith-cbz-fusion,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fuse-aes,fuse-crypto-eor,neon,no-zcz-fpr64,perfmon,sha2,store-pair-suppress,v8a,zcm-fpr128,zcm-gpr64,zcz-fp-workaround,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-m1"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,alternate-sextload-cvt-f32-pattern,altnzcv,am,apple-a14,arith-bcc-fusion,arith-cbz-fusion,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fptoint,fullfp16,fuse-address,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-m2"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a15,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-m3"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a16,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-m4"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-m4,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sme,sme-f64f64,sme-i16i64,sme2,specrestrict,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,vh,wfxt,xs,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-m5"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-m5,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,cssc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hbc,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sme,sme-b16b16,sme-f16f16,sme-f64f64,sme-i16i64,sme2,sme2p1,specres2,specrestrict,sve-b16b16,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,vh,wfxt,xs,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s10"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a16,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s4"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,apple-a12,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,neon,no-zcz-fpr64,pan,pan-rwv,pauth,perfmon,ras,rcpc,rdm,sha2,store-pair-suppress,uaops,v8.1a,v8.2a,v8.3a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s5"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,apple-a12,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,neon,no-zcz-fpr64,pan,pan-rwv,pauth,perfmon,ras,rcpc,rdm,sha2,store-pair-suppress,uaops,v8.1a,v8.2a,v8.3a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s6"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,am,apple-a13,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,lse2,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s7"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,am,apple-a13,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,lse2,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s8"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,am,apple-a13,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,lse2,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s9"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a16,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("c1-nano"), str_lit("CONTEXTIDREL2,altnzcv,am,amvs,bf16,bti,c1-nano,ccdp,ccidx,ccpp,chk,clrbhb,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,hbc,hcx,i8mm,jsconv,lor,lse,lse2,mops,mpam,mte,neon,nmi,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rcpc3,rdm,sb,sel2,sme,sme2,specres2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8a,v9.1a,v9.2a,v9.3a,v9a,vh,wfxt,xs") }, + { str_lit("c1-premium"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,bti,c1-premium,ccdp,ccidx,ccpp,chk,clrbhb,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hbc,hcx,i8mm,jsconv,lor,lse,lse2,mops,mpam,mte,neon,nmi,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rcpc3,rdm,sb,sel2,sme,sme2,spe,spe-eef,specres2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8a,v9.1a,v9.2a,v9.3a,v9a,vh,wfxt,xs") }, + { str_lit("c1-pro"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,bf16,bti,c1-pro,ccdp,ccidx,ccpp,chk,clrbhb,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hbc,hcx,i8mm,jsconv,lor,lse,lse2,mops,mpam,mte,neon,nmi,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rcpc3,rdm,sb,sel2,sme,sme2,spe,spe-eef,specres2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8a,v9.1a,v9.2a,v9.3a,v9a,vh,wfxt,xs") }, + { str_lit("c1-ultra"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,bti,c1-ultra,ccdp,ccidx,ccpp,chk,clrbhb,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hbc,hcx,i8mm,jsconv,lor,lse,lse2,mops,mpam,mte,neon,nmi,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rcpc3,rdm,sb,sel2,sme,sme2,spe,spe-eef,specres2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8a,v9.1a,v9.2a,v9.3a,v9a,vh,wfxt,xs") }, + { str_lit("carmel"), str_lit("CONTEXTIDREL2,aes,carmel,ccpp,crc,el2vmsa,el3,fp-armv8,fullfp16,lor,lse,neon,pan,pan-rwv,ras,rdm,sha2,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cobalt-100"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,disable-maximize-scalable-bandwidth,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,neoversen2,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-a320"), str_lit("CONTEXTIDREL2,a320,aggressive-interleaving,altnzcv,am,amvs,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,ete,fgt,flagm,fp-armv8,fp16fml,fptoint,fullfp16,fuse-adrp-add,fuse-aes,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a34"), str_lit("a35,aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,sha2,v8a") }, + { str_lit("cortex-a35"), str_lit("a35,aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,sha2,v8a") }, + { str_lit("cortex-a510"), str_lit("CONTEXTIDREL2,a510,altnzcv,am,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,el2vmsa,el3,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-a520"), str_lit("CONTEXTIDREL2,a520,altnzcv,am,amvs,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a520ae"), str_lit("CONTEXTIDREL2,a520ae,altnzcv,am,amvs,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a53"), str_lit("a53,aes,balance-fp-ops,crc,el2vmsa,el3,fp-armv8,fuse-adrp-add,fuse-aes,neon,perfmon,sha2,use-postra-scheduler,use-wzr-to-vec-move,v8a") }, + { str_lit("cortex-a55"), str_lit("CONTEXTIDREL2,a55,aes,ccpp,crc,dotprod,el2vmsa,el3,fp-armv8,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,ras,rcpc,rdm,sha2,uaops,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a57"), str_lit("a57,addr-lsl-slow-14,aes,balance-fp-ops,crc,el2vmsa,el3,enable-select-opt,fp-armv8,fuse-adrp-add,fuse-aes,fuse-literals,max-interleave-factor-4,neon,perfmon,predictable-select-expensive,sha2,use-postra-scheduler,v8a") }, + { str_lit("cortex-a65"), str_lit("CONTEXTIDREL2,a65,aes,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-literals,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,ssbs,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a65ae"), str_lit("CONTEXTIDREL2,a65,aes,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-literals,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,ssbs,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a710"), str_lit("CONTEXTIDREL2,a710,altnzcv,alu-lsl-fast,am,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-a715"), str_lit("CONTEXTIDREL2,a715,altnzcv,alu-lsl-fast,am,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-a72"), str_lit("a72,addr-lsl-slow-14,aes,crc,el2vmsa,el3,enable-select-opt,fp-armv8,fuse-adrp-add,fuse-aes,fuse-literals,neon,perfmon,predictable-select-expensive,sha2,v8a") }, + { str_lit("cortex-a720"), str_lit("CONTEXTIDREL2,a720,altnzcv,alu-lsl-fast,am,amvs,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a720ae"), str_lit("CONTEXTIDREL2,a720ae,altnzcv,alu-lsl-fast,am,amvs,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a725"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,cortex-a725,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a73"), str_lit("a73,addr-lsl-slow-14,aes,crc,el2vmsa,el3,enable-select-opt,fp-armv8,fuse-adrp-add,fuse-aes,neon,perfmon,predictable-select-expensive,sha2,v8a") }, + { str_lit("cortex-a75"), str_lit("CONTEXTIDREL2,a75,addr-lsl-slow-14,aes,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a76"), str_lit("CONTEXTIDREL2,a76,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,ssbs,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a76ae"), str_lit("CONTEXTIDREL2,a76,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,ssbs,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a77"), str_lit("CONTEXTIDREL2,a77,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,ssbs,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a78"), str_lit("CONTEXTIDREL2,a78,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a78ae"), str_lit("CONTEXTIDREL2,a78ae,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a78c"), str_lit("CONTEXTIDREL2,a78c,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,crc,dotprod,el2vmsa,el3,enable-select-opt,flagm,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,lor,lse,neon,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-r82"), str_lit("CONTEXTIDREL2,ccdp,ccpp,complxnum,cortex-r82,crc,dit,dotprod,flagm,fp-armv8,fp16fml,fpac,fullfp16,jsconv,lse,neon,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8r") }, + { str_lit("cortex-r82ae"), str_lit("CONTEXTIDREL2,ccdp,ccpp,complxnum,cortex-r82ae,crc,dit,dotprod,flagm,fp-armv8,fp16fml,fpac,fullfp16,jsconv,lse,neon,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8r") }, + { str_lit("cortex-x1"), str_lit("CONTEXTIDREL2,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,cortex-x1,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-x1c"), str_lit("CONTEXTIDREL2,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,cortex-x1,crc,dotprod,el2vmsa,el3,enable-select-opt,flagm,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,lse2,neon,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,ras,rcpc,rcpc-immo,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-x2"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,cortex-x2,crc,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-x3"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,complxnum,cortex-x3,crc,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-x4"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,complxnum,cortex-x4,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-x925"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,complxnum,cortex-x925,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cyclone"), str_lit("aes,alternate-sextload-cvt-f32-pattern,apple-a7,arith-bcc-fusion,arith-cbz-fusion,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fuse-aes,fuse-crypto-eor,neon,no-zcz-fpr64,perfmon,sha2,store-pair-suppress,v8a,zcm-fpr128,zcm-gpr64,zcz-fp-workaround,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("exynos-m3"), str_lit("aes,alu-lsl-fast,crc,el2vmsa,el3,exynos-cheap-as-move,exynosm3,force-32bit-jump-tables,fp-armv8,fuse-address,fuse-adrp-add,fuse-aes,fuse-csel,fuse-literals,max-interleave-factor-4,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,use-postra-scheduler,v8a") }, + { str_lit("exynos-m4"), str_lit("CONTEXTIDREL2,aes,alu-lsl-fast,arith-bcc-fusion,arith-cbz-fusion,ccpp,crc,dotprod,el2vmsa,el3,exynos-cheap-as-move,exynosm4,force-32bit-jump-tables,fp-armv8,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-csel,fuse-literals,lor,lse,max-interleave-factor-4,neon,pan,pan-rwv,perfmon,ras,rdm,sha2,store-pair-suppress,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh,zcz-gpr32,zcz-gpr64") }, + { str_lit("exynos-m5"), str_lit("CONTEXTIDREL2,aes,alu-lsl-fast,arith-bcc-fusion,arith-cbz-fusion,ccpp,crc,dotprod,el2vmsa,el3,exynos-cheap-as-move,exynosm4,force-32bit-jump-tables,fp-armv8,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-csel,fuse-literals,lor,lse,max-interleave-factor-4,neon,pan,pan-rwv,perfmon,ras,rdm,sha2,store-pair-suppress,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh,zcz-gpr32,zcz-gpr64") }, + { str_lit("falkor"), str_lit("aes,alu-lsl-fast,crc,el2vmsa,el3,falkor,fp-armv8,max-interleave-factor-4,neon,perfmon,predictable-select-expensive,rdm,sha2,slow-strqro-store,store-pair-suppress,use-postra-scheduler,v8a,zcz-gpr32,zcz-gpr64") }, + { str_lit("fujitsu-monaka"), str_lit("CONTEXTIDREL2,aes,altnzcv,am,amvs,arith-bcc-fusion,bf16,bti,ccdp,ccidx,ccpp,clrbhb,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,faminmax,fgt,flagm,fp-armv8,fp16fml,fp8,fp8dot2,fp8dot4,fp8fma,fpac,fptoint,fujitsu-monaka,fullfp16,hbc,hcx,i8mm,jsconv,lor,ls64,lse,lse2,lut,mec,mops,mpam,neon,nmi,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,rme,sb,sel2,sha2,sha3,sm4,specres2,specrestrict,ssbs,sve,sve-aes,sve-bitperm,sve-sha3,sve-sm4,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8a,v9.1a,v9.2a,v9.3a,v9a,vh,wfxt,xs") }, + { str_lit("gb10"), str_lit("CONTEXTIDREL2,aes,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,complxnum,cortex-x925,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,spe,spe-eef,specrestrict,ssbs,sve,sve-aes,sve-bitperm,sve-sha3,sve-sm4,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("generic"), str_lit("enable-select-opt,ete,fp-armv8,fuse-adrp-add,fuse-aes,neon,trbe,use-postra-scheduler") }, + { str_lit("grace"), str_lit("CONTEXTIDREL2,aes,altnzcv,alu-lsl-fast,am,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,neoversev2,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,spe,specrestrict,ssbs,sve,sve-aes,sve-bitperm,sve-sha3,sve-sm4,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("kryo"), str_lit("aes,alu-lsl-fast,crc,el2vmsa,el3,fp-armv8,kryo,max-interleave-factor-4,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,use-postra-scheduler,v8a,zcz-gpr32,zcz-gpr64") }, + { str_lit("neoverse-512tvb"), str_lit("CONTEXTIDREL2,aes,alu-lsl-fast,am,bf16,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,el2vmsa,el3,enable-select-opt,flagm,fp-armv8,fp16fml,fpac,fullfp16,fuse-adrp-add,fuse-aes,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,neoverse512tvb,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,rand,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,sm4,spe,ssbs,sve,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh") }, + { str_lit("neoverse-e1"), str_lit("CONTEXTIDREL2,aes,ccpp,crc,dotprod,el2vmsa,el3,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,neoversee1,pan,pan-rwv,perfmon,ras,rcpc,rdm,sha2,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("neoverse-n1"), str_lit("CONTEXTIDREL2,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,neoversen1,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("neoverse-n2"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,disable-maximize-scalable-bandwidth,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,neoversen2,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("neoverse-n3"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,neoversen3,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("neoverse-v1"), str_lit("CONTEXTIDREL2,addr-lsl-slow-14,aes,alu-lsl-fast,am,bf16,ccdp,ccidx,ccpp,complxnum,crc,disable-maximize-scalable-bandwidth,dit,dotprod,el2vmsa,el3,enable-select-opt,flagm,fp-armv8,fp16fml,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,mpam,neon,neoversev1,no-sve-fp-ld1r,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,rand,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,sm4,spe,ssbs,sve,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh") }, + { str_lit("neoverse-v2"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,neoversev2,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("neoverse-v3"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,brbe,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,ls64,lse,lse2,max-interleave-factor-4,mpam,mte,neon,neoversev3,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,rme,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("neoverse-v3ae"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,brbe,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,ls64,lse,lse2,max-interleave-factor-4,mpam,mte,neon,neoversev3AE,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,rme,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("olympus"), str_lit("CONTEXTIDREL2,aes,altnzcv,alu-lsl-fast,am,amvs,bf16,brbe,bti,ccdp,ccidx,ccpp,chk,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,faminmax,fgt,flagm,fp-armv8,fp16fml,fp8,fp8dot2,fp8dot4,fp8fma,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,hcx,i8mm,jsconv,lor,ls64,lse,lse2,lut,max-interleave-factor-4,mec,mpam,mte,neon,nv,olympus,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,rme,sb,sel2,sha2,sha3,sm4,spe,spe-eef,specrestrict,ssbs,sve,sve-aes,sve-bitperm,sve-sha3,sve-sm4,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("oryon-1"), str_lit("CONTEXTIDREL2,aes,altnzcv,am,amvs,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,fgt,flagm,fp-armv8,fp16fml,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-crypto-eor,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,nv,oryon-1,pan,pan-rwv,pauth,perfmon,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,spe,specrestrict,ssbs,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh") }, + { str_lit("saphira"), str_lit("CONTEXTIDREL2,aes,alu-lsl-fast,am,ccidx,ccpp,complxnum,crc,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,ras,rcpc,rcpc-immo,rdm,saphira,sel2,sha2,spe,store-pair-suppress,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcz-gpr32,zcz-gpr64") }, + { str_lit("thunderx"), str_lit("aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,thunderx,use-postra-scheduler,v8a") }, + { str_lit("thunderx2t99"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,arith-bcc-fusion,crc,el2vmsa,el3,fp-armv8,lor,lse,max-interleave-factor-4,neon,pan,predictable-select-expensive,rdm,sha2,store-pair-suppress,thunderx2t99,use-postra-scheduler,v8.1a,v8a,vh") }, + { str_lit("thunderx3t110"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,arith-bcc-fusion,balance-fp-ops,ccidx,ccpp,complxnum,crc,el2vmsa,el3,fp-armv8,jsconv,lor,lse,max-interleave-factor-4,neon,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,store-pair-suppress,strict-align,thunderx3t110,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8a,vh") }, + { str_lit("thunderxt81"), str_lit("aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,thunderxt81,use-postra-scheduler,v8a") }, + { str_lit("thunderxt83"), str_lit("aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,thunderxt83,use-postra-scheduler,v8a") }, + { str_lit("thunderxt88"), str_lit("aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,thunderxt88,use-postra-scheduler,v8a") }, + { str_lit("tsv110"), str_lit("CONTEXTIDREL2,aes,ccpp,complxnum,crc,dotprod,el2vmsa,el3,fp-armv8,fp16fml,fullfp16,fuse-aes,jsconv,lor,lse,neon,pan,pan-rwv,perfmon,ras,rdm,sha2,spe,store-pair-suppress,tsv110,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + // TargetArch_wasm32: + { str_lit("bleeding-edge"), str_lit("atomics,bulk-memory,bulk-memory-opt,call-indirect-overlong,exception-handling,extended-const,fp16,gc,multimemory,multivalue,mutable-globals,nontrapping-fptoint,reference-types,relaxed-simd,sign-ext,simd128,tail-call") }, + { str_lit("generic"), str_lit("bulk-memory,bulk-memory-opt,call-indirect-overlong,multivalue,mutable-globals,nontrapping-fptoint,reference-types,sign-ext") }, + { str_lit("lime1"), str_lit("bulk-memory-opt,call-indirect-overlong,extended-const,multivalue,mutable-globals,nontrapping-fptoint,sign-ext") }, + { str_lit("mvp"), str_lit("") }, + // TargetArch_wasm64p32: + { str_lit("bleeding-edge"), str_lit("atomics,bulk-memory,bulk-memory-opt,call-indirect-overlong,exception-handling,extended-const,fp16,gc,multimemory,multivalue,mutable-globals,nontrapping-fptoint,reference-types,relaxed-simd,sign-ext,simd128,tail-call") }, + { str_lit("generic"), str_lit("bulk-memory,bulk-memory-opt,call-indirect-overlong,multivalue,mutable-globals,nontrapping-fptoint,reference-types,sign-ext") }, + { str_lit("lime1"), str_lit("bulk-memory-opt,call-indirect-overlong,extended-const,multivalue,mutable-globals,nontrapping-fptoint,sign-ext") }, + { str_lit("mvp"), str_lit("") }, + // TargetArch_riscv64: + { str_lit("andes-45-series"), str_lit("andes45,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler") }, + { str_lit("andes-a25"), str_lit("32bit,a,c,d,f,i,m,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("andes-a45"), str_lit("32bit,a,andes45,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("andes-ax25"), str_lit("64bit,a,c,d,f,i,m,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("andes-ax45"), str_lit("64bit,a,andes45,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("andes-ax45mpv"), str_lit("64bit,a,andes45,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler,v,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul,zve32f,zve32x,zve64d,zve64f,zve64x,zvl128b,zvl32b,zvl64b") }, + { str_lit("andes-n45"), str_lit("32bit,a,andes45,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("andes-nx45"), str_lit("64bit,a,andes45,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("generic"), str_lit("64bit,i,optimized-nf2-segment-load-store") }, + { str_lit("generic-ooo"), str_lit("") }, + { str_lit("generic-rv32"), str_lit("32bit,i,optimized-nf2-segment-load-store") }, + { str_lit("generic-rv64"), str_lit("64bit,i,optimized-nf2-segment-load-store") }, + { str_lit("mips-p8700"), str_lit("64bit,a,c,d,f,i,m,mips-p8700,xmipscbop,xmipscmov,xmipsexectl,xmipslsp,zaamo,zalrsc,zba,zbb,zca,zicsr,zifencei,zmmul") }, + { str_lit("rocket"), str_lit("") }, + { str_lit("rocket-rv32"), str_lit("32bit,i,zicsr,zifencei") }, + { str_lit("rocket-rv64"), str_lit("64bit,i,zicsr,zifencei") }, + { str_lit("rp2350-hazard3"), str_lit("32bit,a,c,i,m,zaamo,zalrsc,zba,zbb,zbkb,zbs,zca,zcb,zcmp,zicsr,zifencei,zmmul") }, + { str_lit("sifive-7-series"), str_lit("no-default-unroll,short-forward-branch-ialu,sifive7,use-postra-scheduler") }, + { str_lit("sifive-e20"), str_lit("32bit,c,i,m,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-e21"), str_lit("32bit,a,c,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-e24"), str_lit("32bit,a,c,f,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-e31"), str_lit("32bit,a,c,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-e34"), str_lit("32bit,a,c,f,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-e76"), str_lit("32bit,a,c,f,i,m,no-default-unroll,short-forward-branch-ialu,sifive7,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-p450"), str_lit("64bit,a,auipc-addi-fusion,b,c,conditional-cmv-fusion,d,f,i,lui-addi-fusion,m,no-default-unroll,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,za64rs,zaamo,zalrsc,zba,zbb,zbs,zca,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicsr,zifencei,zihintntl,zihintpause,zihpm,zkt,zmmul") }, + { str_lit("sifive-p470"), str_lit("64bit,a,auipc-addi-fusion,b,c,conditional-cmv-fusion,d,f,i,lui-addi-fusion,m,no-default-unroll,no-sink-splat-operands,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,v,vxrm-pipeline-flush,xsifivecdiscarddlone,xsifivecflushdlone,za64rs,zaamo,zalrsc,zba,zbb,zbs,zca,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicsr,zifencei,zihintntl,zihintpause,zihpm,zkt,zmmul,zvbb,zvbc,zve32f,zve32x,zve64d,zve64f,zve64x,zvkb,zvkg,zvkn,zvknc,zvkned,zvkng,zvknhb,zvks,zvksc,zvksed,zvksg,zvksh,zvkt,zvl128b,zvl32b,zvl64b") }, + { str_lit("sifive-p550"), str_lit("64bit,a,auipc-addi-fusion,c,conditional-cmv-fusion,d,f,i,lui-addi-fusion,m,no-default-unroll,use-postra-scheduler,zaamo,zalrsc,zba,zbb,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-p670"), str_lit("64bit,a,auipc-addi-fusion,b,c,conditional-cmv-fusion,d,f,i,lui-addi-fusion,m,no-default-unroll,no-sink-splat-operands,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,v,vxrm-pipeline-flush,za64rs,zaamo,zalrsc,zba,zbb,zbs,zca,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicsr,zifencei,zihintntl,zihintpause,zihpm,zkt,zmmul,zvbb,zvbc,zve32f,zve32x,zve64d,zve64f,zve64x,zvkb,zvkg,zvkn,zvknc,zvkned,zvkng,zvknhb,zvks,zvksc,zvksed,zvksg,zvksh,zvkt,zvl128b,zvl32b,zvl64b") }, + { str_lit("sifive-p870"), str_lit("64bit,a,auipc-addi-fusion,b,c,conditional-cmv-fusion,d,f,i,lui-addi-fusion,m,no-default-unroll,no-sink-splat-operands,supm,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,v,vxrm-pipeline-flush,za64rs,zaamo,zalrsc,zama16b,zawrs,zba,zbb,zbs,zca,zcb,zcmop,zfa,zfbfmin,zfh,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicntr,zicond,zicsr,zifencei,zihintntl,zihintpause,zihpm,zimop,zkr,zkt,zmmul,zvbb,zvbc,zve32f,zve32x,zve64d,zve64f,zve64x,zvfbfmin,zvfbfwma,zvfh,zvfhmin,zvkb,zvkg,zvkn,zvknc,zvkned,zvkng,zvknhb,zvks,zvksc,zvksed,zvksg,zvksh,zvkt,zvl128b,zvl32b,zvl64b") }, + { str_lit("sifive-s21"), str_lit("64bit,a,c,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-s51"), str_lit("64bit,a,c,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-s54"), str_lit("64bit,a,c,d,f,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-s76"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,sifive7,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zihintpause,zmmul") }, + { str_lit("sifive-u54"), str_lit("64bit,a,c,d,f,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-u74"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,sifive7,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-x280"), str_lit("64bit,a,c,d,dlen-factor-2,f,i,m,no-default-unroll,optimized-nf2-segment-load-store,optimized-zero-stride-load,short-forward-branch-ialu,sifive7,use-postra-scheduler,v,vl-dependent-latency,zaamo,zalrsc,zba,zbb,zca,zfh,zfhmin,zicsr,zifencei,zmmul,zve32f,zve32x,zve64d,zve64f,zve64x,zvfh,zvfhmin,zvl128b,zvl256b,zvl32b,zvl512b,zvl64b") }, + { str_lit("sifive-x390"), str_lit("64bit,a,b,c,d,dlen-factor-2,experimental-zicfilp,experimental-zicfiss,f,i,m,no-default-unroll,optimized-nf2-segment-load-store,optimized-zero-stride-load,short-forward-branch-ialu,sifive7,single-element-vec-fp64,use-postra-scheduler,v,vl-dependent-latency,xsifivecdiscarddlone,xsifivecflushdlone,za64rs,zaamo,zalrsc,zawrs,zba,zbb,zbs,zca,zcb,zcmop,zfa,zfbfmin,zfh,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,ziccrse,zicntr,zicond,zicsr,zifencei,zihintntl,zihintpause,zihpm,zimop,zkr,zkt,zmmul,zvbb,zve32f,zve32x,zve64d,zve64f,zve64x,zvfbfmin,zvfbfwma,zvfh,zvfhmin,zvkb,zvkt,zvl1024b,zvl128b,zvl256b,zvl32b,zvl512b,zvl64b") }, + { str_lit("spacemit-x60"), str_lit("64bit,a,b,c,d,dlen-factor-2,f,i,m,optimized-nf2-segment-load-store,optimized-nf3-segment-load-store,optimized-nf4-segment-load-store,ssccptr,sscofpmf,sscounterenw,sstc,sstvala,sstvecd,svade,svbare,svinval,svnapot,svpbmt,unaligned-scalar-mem,v,vxrm-pipeline-flush,xsmtvdot,za64rs,zaamo,zalrsc,zba,zbb,zbc,zbkc,zbs,zca,zfh,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicntr,zicond,zicsr,zifencei,zihintpause,zihpm,zkt,zmmul,zve32f,zve32x,zve64d,zve64f,zve64x,zvfh,zvfhmin,zvkt,zvl128b,zvl256b,zvl32b,zvl64b") }, + { str_lit("syntacore-scr1-base"), str_lit("32bit,c,i,no-default-unroll,zca,zicsr,zifencei") }, + { str_lit("syntacore-scr1-max"), str_lit("32bit,c,i,m,no-default-unroll,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr3-rv32"), str_lit("32bit,c,i,m,no-default-unroll,use-postra-scheduler,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr3-rv64"), str_lit("64bit,a,c,i,m,no-default-unroll,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr4-rv32"), str_lit("32bit,c,d,f,i,m,no-default-unroll,use-postra-scheduler,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr4-rv64"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr5-rv32"), str_lit("32bit,a,c,d,f,i,m,no-default-unroll,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr5-rv64"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr7"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,use-postra-scheduler,v,zaamo,zalrsc,zba,zbb,zbc,zbkb,zbkc,zbkx,zbs,zca,zicsr,zifencei,zkn,zknd,zkne,zknh,zmmul,zve32f,zve32x,zve64d,zve64f,zve64x,zvl128b,zvl32b,zvl64b") }, + { str_lit("tt-ascalon-d8"), str_lit("64bit,a,b,c,d,f,h,i,log-vrgather,m,no-default-unroll,optimized-nf2-segment-load-store,optimized-nf3-segment-load-store,optimized-nf4-segment-load-store,optimized-nf5-segment-load-store,optimized-nf6-segment-load-store,optimized-nf7-segment-load-store,optimized-nf8-segment-load-store,optimized-zero-stride-load,sha,shcounterenw,shgatpa,shtvala,shvsatpa,shvstvala,shvstvecd,smaia,ssaia,ssccptr,sscofpmf,sscounterenw,ssnpm,ssstateen,ssstrict,sstc,sstvala,sstvecd,ssu64xl,supm,svade,svbare,svinval,svnapot,svpbmt,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,v,za64rs,zaamo,zalrsc,zawrs,zba,zbb,zbs,zca,zcb,zcmop,zfa,zfbfmin,zfh,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicntr,zicond,zicsr,zifencei,zihintntl,zihintpause,zihpm,zimop,zkt,zmmul,zvbb,zvbc,zve32f,zve32x,zve64d,zve64f,zve64x,zvfbfmin,zvfbfwma,zvfh,zvfhmin,zvkb,zvkg,zvkn,zvkned,zvkng,zvknhb,zvkt,zvl128b,zvl256b,zvl32b,zvl64b") }, + { str_lit("veyron-v1"), str_lit("64bit,a,add-load-fusion,auipc-addi-fusion,auipc-load-fusion,c,d,disable-misched-load-clustering,disable-postmisched-load-clustering,disable-postmisched-store-clustering,f,i,lui-addi-fusion,lui-load-fusion,m,shifted-zextw-fusion,ventana-veyron,xventanacondops,zaamo,zalrsc,zba,zbb,zbc,zbs,zca,zexth-fusion,zextw-fusion,zicbom,zicbop,zicboz,zicntr,zicsr,zifencei,zihintpause,zihpm,zmmul") }, + { str_lit("xiangshan-kunminghu"), str_lit("64bit,a,b,c,d,f,h,i,m,no-default-unroll,sha,shcounterenw,shgatpa,shifted-zextw-fusion,shtvala,shvsatpa,shvstvala,shvstvecd,smaia,smcsrind,smdbltrp,smmpm,smnpm,smrnmi,smstateen,ssaia,ssccptr,sscofpmf,sscounterenw,sscsrind,ssdbltrp,ssnpm,sspm,ssstateen,ssstrict,sstc,sstvala,sstvecd,ssu64xl,supm,svade,svbare,svinval,svnapot,svpbmt,v,za64rs,zaamo,zacas,zalrsc,zawrs,zba,zbb,zbc,zbkb,zbkc,zbkx,zbs,zca,zcb,zcmop,zexth-fusion,zextw-fusion,zfa,zfh,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicntr,zicond,zicsr,zifencei,zihintntl,zihintpause,zihpm,zimop,zkn,zknd,zkne,zknh,zks,zksed,zksh,zkt,zmmul,zvbb,zve32f,zve32x,zve64d,zve64f,zve64x,zvfh,zvfhmin,zvkb,zvkt,zvl128b,zvl32b,zvl64b") }, + { str_lit("xiangshan-nanhu"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,shifted-zextw-fusion,svinval,zaamo,zalrsc,zba,zbb,zbc,zbkb,zbkc,zbkx,zbs,zca,zexth-fusion,zextw-fusion,zicbom,zicboz,zicsr,zifencei,zkn,zknd,zkne,zknh,zksed,zksh,zmmul") }, +}; + +#elif LLVM_VERSION_MAJOR == 21 // Generated with the featuregen script in `misc/featuregen` gb_global String target_microarch_list[TargetArch_COUNT] = { // TargetArch_Invalid: From 82d985b45856c2dc4f767a5686bf875f3deaff7a Mon Sep 17 00:00:00 2001 From: Nathan Chere Date: Wed, 18 Mar 2026 20:31:27 +0100 Subject: [PATCH 753/766] add LLVM 22 support to optimisation pass pipelines --- src/llvm_backend_passes.cpp | 425 +++++++++++++++++++++++++++++++++++- 1 file changed, 422 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend_passes.cpp b/src/llvm_backend_passes.cpp index 744f6af61..5001e29b0 100644 --- a/src/llvm_backend_passes.cpp +++ b/src/llvm_backend_passes.cpp @@ -266,7 +266,7 @@ function( ), verify )"); -#else // LLVM 20 & 21 (same config) +#elif LLVM_VERSION_MAJOR < 22 // LLVM 20 & 21 (same config) array_add(&passes, u8R"( annotation2metadata, forceattrs, @@ -398,6 +398,144 @@ function( verify )"); +#else // LLVM 22 +// Passes removed: coro, openmp + array_add(&passes, u8R"( +memprof-remove-attributes, +annotation2metadata, +forceattrs, +inferattrs, +function( + ee-instrument<>, + lower-expect, + simplifycfg, + sroa, + early-cse<> +), +ipsccp, +called-value-propagation, +globalopt, +function( + mem2reg, + instcombine, + simplifycfg +), +always-inline, +require, +function( + invalidate +), +require, +cgscc( + devirt<4>( + inline, + function-attrs, + function( + sroa, + early-cse, + speculative-execution, + jump-threading, + correlated-propagation, + simplifycfg, + instcombine, + aggressive-instcombine, + tailcallelim, + simplifycfg, + reassociate, + constraint-elimination, + loop-mssa( + loop-instsimplify, + loop-simplifycfg, + licm, + loop-rotate, + licm, + simple-loop-unswitch + ), + simplifycfg, + instcombine, + loop( + loop-idiom, + indvars, + extra-simple-loop-unswitch-passes, + loop-deletion, + loop-unroll-full + ), + sroa, + vector-combine, + mldst-motion, + gvn<>, + sccp, + bdce, + instcombine, + jump-threading, + correlated-propagation, + adce, + memcpyopt, + dse, + move-auto-init, + loop-mssa( + licm + ), + simplifycfg, + instcombine + ), + function-attrs, + function( + require + ) + ) +), +deadargelim, +globalopt, +globaldce, +elim-avail-extern, +rpo-function-attrs, +recompute-globalsaa, +function( + drop-unnecessary-assumes, + float2int, + lower-constant-intrinsics, + loop( + loop-rotate, + loop-deletion + ), + loop-distribute, + inject-tli-mappings, + loop-vectorize, + drop-unnecessary-assumes, + infer-alignment, + loop-load-elim, + instcombine, + simplifycfg, + slp-vectorizer, + vector-combine, + instcombine, + loop-unroll, + transform-warning, + sroa, + infer-alignment, + instcombine, + loop-mssa( + licm + ), + alignment-from-assumptions, + loop-sink, + instsimplify, + div-rem-pairs, + tailcallelim, + simplifycfg +), +alloc-token, +globaldce, +constmerge, +cg-profile, +rel-lookup-table-converter, +function( + annotation-remarks +), +verify +)"); + #endif break; // default @@ -659,7 +797,7 @@ function( ), verify )"); -#else // LLVM 20 & 21 (same config) +#elif LLVM_VERSION_MAJOR < 22 // LLVM 20 & 21 (same config) array_add(&passes, u8R"( annotation2metadata, forceattrs, @@ -792,6 +930,145 @@ function( ), verify )"); + +#else // LLVM 22 +// Passes removed: coro, openmp + array_add(&passes, u8R"( +memprof-remove-attributes, +annotation2metadata, +forceattrs, +inferattrs, +function( + ee-instrument<>, + lower-expect, + simplifycfg, + sroa, + early-cse<> +), +ipsccp, +called-value-propagation, +globalopt, +function( + mem2reg, + instcombine, + simplifycfg +), +always-inline, +require, +function( + invalidate +), +require, +cgscc( + devirt<4>( + inline, + function-attrs, + function( + sroa, + early-cse, + speculative-execution, + jump-threading, + correlated-propagation, + simplifycfg, + instcombine, + aggressive-instcombine, + libcalls-shrinkwrap, + tailcallelim, + simplifycfg, + reassociate, + constraint-elimination, + loop-mssa( + loop-instsimplify, + loop-simplifycfg, + licm, + loop-rotate, + licm, + simple-loop-unswitch + ), + simplifycfg, + instcombine, + loop( + loop-idiom, + indvars, + extra-simple-loop-unswitch-passes, + loop-deletion, + loop-unroll-full + ), + sroa, + vector-combine, + mldst-motion, + gvn<>, + sccp, + bdce, + instcombine, + jump-threading, + correlated-propagation, + adce, + memcpyopt, + dse, + move-auto-init, + loop-mssa( + licm + ), + simplifycfg, + instcombine + ), + function-attrs, + function( + require + ) + ) +), +deadargelim, +globalopt, +globaldce, +elim-avail-extern, +rpo-function-attrs, +recompute-globalsaa, +function( + drop-unnecessary-assumes, + float2int, + lower-constant-intrinsics, + loop( + loop-rotate, + loop-deletion + ), + loop-distribute, + inject-tli-mappings, + loop-vectorize, + drop-unnecessary-assumes, + infer-alignment, + loop-load-elim, + instcombine, + simplifycfg, + slp-vectorizer, + vector-combine, + instcombine, + loop-unroll, + transform-warning, + sroa, + infer-alignment, + instcombine, + loop-mssa( + licm + ), + alignment-from-assumptions, + loop-sink, + instsimplify, + div-rem-pairs, + tailcallelim, + simplifycfg +), +alloc-token, +globaldce, +constmerge, +cg-profile, +rel-lookup-table-converter, +function( + annotation-remarks +), +verify +)"); #endif break; @@ -1055,7 +1332,7 @@ function( ), verify )"); -#else // LLVM 20 & 21 (same config) +#elif LLVM_VERSION_MAJOR < 22 // LLVM 20 & 21 (same config) array_add(&passes, u8R"( annotation2metadata, forceattrs, @@ -1193,6 +1470,148 @@ verify )"); +#else // LLVM 22 +// Passes removed: coro, openmp + array_add(&passes, u8R"( +memprof-remove-attributes, +annotation2metadata, +forceattrs, +inferattrs, +function( + ee-instrument<>, + lower-expect, + simplifycfg, + sroa, + early-cse<>, + callsite-splitting +), +ipsccp, +called-value-propagation, +globalopt, +function( + mem2reg, + instcombine, + simplifycfg +), +always-inline, +require, +function( + invalidate +), +require, +cgscc( + devirt<4>( + inline, + function-attrs, + argpromotion, + function( + sroa, + early-cse, + speculative-execution, + jump-threading, + correlated-propagation, + simplifycfg, + instcombine, + aggressive-instcombine, + libcalls-shrinkwrap, + tailcallelim, + simplifycfg, + reassociate, + constraint-elimination, + loop-mssa( + loop-instsimplify, + loop-simplifycfg, + licm, + loop-rotate, + licm, + simple-loop-unswitch + ), + simplifycfg, + instcombine, + loop( + loop-idiom, + indvars, + extra-simple-loop-unswitch-passes, + loop-deletion, + loop-unroll-full + ), + sroa, + vector-combine, + mldst-motion, + gvn<>, + sccp, + bdce, + instcombine, + jump-threading, + correlated-propagation, + adce, + memcpyopt, + dse, + move-auto-init, + loop-mssa( + licm + ), + simplifycfg, + instcombine + ), + function-attrs, + function( + require + ) + ) +), +deadargelim, +globalopt, +globaldce, +elim-avail-extern, +rpo-function-attrs, +recompute-globalsaa, +function( + drop-unnecessary-assumes, + float2int, + lower-constant-intrinsics, + chr, + loop( + loop-rotate, + loop-deletion + ), + loop-distribute, + inject-tli-mappings, + loop-vectorize, + drop-unnecessary-assumes, + infer-alignment, + loop-load-elim, + instcombine, + simplifycfg, + slp-vectorizer, + vector-combine, + instcombine, + loop-unroll, + transform-warning, + sroa, + infer-alignment, + instcombine, + loop-mssa( + licm + ), + alignment-from-assumptions, + loop-sink, + instsimplify, + div-rem-pairs, + tailcallelim, + simplifycfg +), +alloc-token, +globaldce, +constmerge, +cg-profile, +rel-lookup-table-converter, +function( + annotation-remarks +), +verify +)"); + #endif break; } From 36e6bd4235813ff9111127c12a9a0bec1458f42a Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Wed, 18 Mar 2026 15:37:04 -0400 Subject: [PATCH 754/766] [SDL3/mixer] initial commit --- vendor/sdl3/mixer/LICENSE.txt | 17 + vendor/sdl3/mixer/include/SDL_mixer.h | 3347 +++++++++++++++++++++++++ vendor/sdl3/mixer/sdl3_mixer.odin | 168 ++ 3 files changed, 3532 insertions(+) create mode 100644 vendor/sdl3/mixer/LICENSE.txt create mode 100644 vendor/sdl3/mixer/include/SDL_mixer.h create mode 100644 vendor/sdl3/mixer/sdl3_mixer.odin diff --git a/vendor/sdl3/mixer/LICENSE.txt b/vendor/sdl3/mixer/LICENSE.txt new file mode 100644 index 000000000..acaf5b21b --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.txt @@ -0,0 +1,17 @@ +Copyright (C) 1997-2026 Sam Lantinga + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. diff --git a/vendor/sdl3/mixer/include/SDL_mixer.h b/vendor/sdl3/mixer/include/SDL_mixer.h new file mode 100644 index 000000000..8eca47369 --- /dev/null +++ b/vendor/sdl3/mixer/include/SDL_mixer.h @@ -0,0 +1,3347 @@ +/* + SDL_mixer: An audio mixer library based on the SDL library + Copyright (C) 1997-2026 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/* WIKI CATEGORY: SDLMixer */ + +/** + * # CategorySDLMixer + * + * SDL_mixer is a library to make complicated audio processing tasks easier. + * + * It offers audio file decoding, mixing multiple sounds together, basic 3D + * positional audio, and various audio effects. + * + * It can mix sound to multiple audio devices in real time, or generate mixed + * audio data to a memory buffer for any other use. It can do both at the same + * time! + * + * To use the library, first call MIX_Init(). Then create a mixer with + * MIX_CreateMixerDevice() (or MIX_CreateMixer() to render to memory). + * + * Once you have a mixer, you can load sound data with MIX_LoadAudio(), + * MIX_LoadAudio_IO(), or MIX_LoadAudioWithProperties(). Data gets loaded once + * and can be played over and over. + * + * When loading audio, SDL_mixer can parse out several metadata tag formats, + * such as ID3 and APE tags, and exposes this information through the + * MIX_GetAudioProperties() function. + * + * To play audio, you create a track with MIX_CreateTrack(). You need one + * track for each sound that will be played simultaneously; think of tracks as + * individual sliders on a mixer board. You might have loaded hundreds of + * audio files, but you probably only have a handful of tracks that you assign + * those loaded files to when they are ready to play, and reuse those tracks + * with different audio later. Tracks take their input from a MIX_Audio + * (static data to be played multiple times) or an SDL_AudioStream (streaming + * PCM audio the app supplies, possibly as needed). A third option is to + * supply an SDL_IOStream, to load and decode on the fly, which might be more + * efficient for background music that is only used once, etc. + * + * Assign input to a MIX_Track with MIX_SetTrackAudio(), + * MIX_SetTrackAudioStream(), or MIX_SetTrackIOStream(). + * + * Once a track has an input, start it playing with MIX_PlayTrack(). There are + * many options to this function to dictate mixing features: looping, fades, + * etc. + * + * Tracks can be tagged with arbitrary strings, like "music" or "ingame" or + * "ui". These tags can be used to start, stop, and pause a selection of + * tracks at the same moment. + * + * All significant portions of the mixing pipeline have callbacks, so that an + * app can hook in to the appropriate locations to examine or modify audio + * data as it passes through the mixer: a "raw" callback for raw PCM data + * decoded from an audio file without any modifications, a "cooked" callback + * for that same data after all transformations (fade, positioning, etc) have + * been processed, a "stopped" callback for when the track finishes mixing, a + * "postmix" callback for the final mixed audio about to be sent to the audio + * hardware to play. Additionally, you can use MIX_Group objects to mix a + * subset of playing tracks and access the data before it is mixed in with + * other tracks. All of this is optional, but allows for powerful access and + * control of the mixing process. + * + * SDL_mixer can also be used for decoding audio files without actually + * rendering a mix. This is done with MIX_AudioDecoder. Even though SDL_mixer + * handles decoding transparently when used as the audio engine for an app, + * and probably won't need this interface in that normal scenario, this can be + * useful when using a different audio library to access many file formats. + * + * This library offers several features on top of mixing sounds together: a + * track can have its own gain, to adjust its volume, in addition to a master + * gain applied as well. One can set the "frequency ratio" of a track or the + * final mixed output, to speed it up or slow it down, which also adjusts its + * pitch. A channel map can also be applied per-track, to change what speaker + * a given channel of audio is output to. + * + * Almost all timing in SDL_mixer is in _sample frames_. Stereo PCM audio data + * in Sint16 format takes 4 bytes per sample frame (2 bytes per sample times 2 + * channels), for example. This allows everything in SDL_mixer to run at + * sample-perfect accuracy, and it lets it run without concern for wall clock + * time--you can produce audio faster than real-time, if desired. The problem, + * though, is different pieces of audio at different _sample rates_ will + * produce a different number of sample frames for the same length of time. To + * deal with this, conversion routines are offered: MIX_TrackMSToFrames(), + * MIX_TrackFramesToMS(), etc. Functions that operate on multiple tracks at + * once will deal with time in milliseconds, so it can do these conversions + * internally; be sure to read the documentation for these small quirks! + * + * SDL_mixer offers basic positional audio: a simple 3D positioning API + * through MIX_SetTrack3DPosition() and MIX_SetTrackStereo(). The former will + * do simple distance attenuation and spatialization--on a stereo setup, you + * will hear sounds move from left to right--and on a surround-sound + * configuration, individual tracks can move around the user. The latter, + * MIX_SetTrackStereo(), will force a sound to the Front Left and Front Right + * speakers and let the app pan it left and right as desired. Either effect + * can be useful for different situations. SDL_mixer is not meant to be a full + * 3D audio engine, but rather Good Enough for many purposes; if something + * more powerful in terms of 3D audio is needed, consider a proper 3D library + * like OpenAL. + */ + +#ifndef SDL_MIXER_H_ +#define SDL_MIXER_H_ + +#include +#include + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * An opaque object that represents a mixer. + * + * The MIX_Mixer is the toplevel object for this library. To use SDL_mixer, + * you must have at least one, but are allowed to have several. Each mixer is + * responsible for generating a single output stream of mixed audio, usually + * to an audio device for realtime playback. + * + * Mixers are either created to feed an audio device (through + * MIX_CreateMixerDevice()), or to generate audio to a buffer in memory, where + * it can be used for anything (through MIX_CreateMixer()). + * + * \since This datatype is available since SDL_mixer 3.0.0. + */ +typedef struct MIX_Mixer MIX_Mixer; + +/** + * An opaque object that represents audio data. + * + * Generally you load audio data (in whatever file format) into SDL_mixer with + * MIX_LoadAudio() or one of its several variants, producing a MIX_Audio + * object. + * + * A MIX_Audio represents static audio data; it could be background music, or + * maybe a laser gun sound effect. It is loaded into RAM and can be played + * multiple times, possibly on different tracks at the same time. + * + * Unlike most other objects, MIX_Audio objects can be shared between mixers. + * + * \since This datatype is available since SDL_mixer 3.0.0. + */ +typedef struct MIX_Audio MIX_Audio; + +/** + * An opaque object that represents a source of sound output to be mixed. + * + * A MIX_Mixer has an arbitrary number of tracks, and each track manages its + * own unique audio to be mixed together. + * + * Tracks also have other properties: gain, loop points, fading, 3D position, + * and other attributes that alter the produced sound; many can be altered + * during playback. + * + * \since This datatype is available since SDL_mixer 3.0.0. + */ +typedef struct MIX_Track MIX_Track; + +/** + * An opaque object that represents a grouping of tracks. + * + * SDL_mixer offers callbacks at various stages of the mixing pipeline to + * allow apps to view and manipulate data as it is transformed. Sometimes it + * is useful to hook in at a point where several tracks--but not all tracks-- + * have been mixed. For example, when a game is in some options menu, perhaps + * adjusting game audio but not UI sounds could be useful. + * + * SDL_mixer allows you to assign several tracks to a group, and receive a + * callback when that group has finished mixing, with a buffer of just that + * group's mixed audio, before it mixes into the final output. + * + * \since This datatype is available since SDL_mixer 3.0.0. + */ +typedef struct MIX_Group MIX_Group; + +/** + * The current major version of SDL_mixer headers. + * + * If this were SDL_mixer version 3.2.1, this value would be 3. + * + * \since This macro is available since SDL_mixer 3.0.0. + */ +#define SDL_MIXER_MAJOR_VERSION 3 + +/** + * The current minor version of the SDL_mixer headers. + * + * If this were SDL_mixer version 3.2.1, this value would be 2. + * + * \since This macro is available since SDL_mixer 3.0.0. + */ +#define SDL_MIXER_MINOR_VERSION 2 + +/** + * The current micro (or patchlevel) version of the SDL_mixer headers. + * + * If this were SDL_mixer version 3.2.1, this value would be 1. + * + * \since This macro is available since SDL_mixer 3.0.0. + */ +#define SDL_MIXER_MICRO_VERSION 0 + +/** + * This is the current version number macro of the SDL_mixer headers. + * + * \since This macro is available since SDL_mixer 3.0.0. + * + * \sa MIX_Version + */ +#define SDL_MIXER_VERSION SDL_VERSIONNUM(SDL_MIXER_MAJOR_VERSION, SDL_MIXER_MINOR_VERSION, SDL_MIXER_MICRO_VERSION) + +/** + * This macro will evaluate to true if compiled with SDL_mixer at least X.Y.Z. + * + * \since This macro is available since SDL_mixer 3.0.0. + */ +#define SDL_MIXER_VERSION_ATLEAST(X, Y, Z) \ + ((SDL_MIXER_MAJOR_VERSION >= X) && \ + (SDL_MIXER_MAJOR_VERSION > X || SDL_MIXER_MINOR_VERSION >= Y) && \ + (SDL_MIXER_MAJOR_VERSION > X || SDL_MIXER_MINOR_VERSION > Y || SDL_MIXER_MICRO_VERSION >= Z)) + +/** + * Get the version of SDL_mixer that is linked against your program. + * + * If you are linking to SDL_mixer dynamically, then it is possible that the + * current version will be different than the version you compiled against. + * This function returns the current version, while SDL_MIXER_VERSION is the + * version you compiled with. + * + * This function may be called safely at any time, even before MIX_Init(). + * + * \returns the version of the linked library. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa SDL_MIXER_VERSION + */ +extern SDL_DECLSPEC int SDLCALL MIX_Version(void); + +/** + * Initialize the SDL_mixer library. + * + * This must be successfully called once before (almost) any other SDL_mixer + * function can be used. + * + * It is safe to call this multiple times; the library will only initialize + * once, and won't deinitialize until MIX_Quit() has been called a matching + * number of times. Extra attempts to init report success. + * + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_Quit + */ +extern SDL_DECLSPEC bool SDLCALL MIX_Init(void); + +/** + * Deinitialize the SDL_mixer library. + * + * This must be called when done with the library, probably at the end of your + * program. + * + * It is safe to call this multiple times; the library will only deinitialize + * once, when this function is called the same number of times as MIX_Init was + * successfully called. + * + * Once you have successfully deinitialized the library, it is safe to call + * MIX_Init to reinitialize it for further use. + * + * On successful deinitialization, SDL_mixer will destroy almost all created + * objects, including objects of type: + * + * - MIX_Mixer + * - MIX_Track + * - MIX_Audio + * - MIX_Group + * - MIX_AudioDecoder + * + * ...which is to say: it's possible a single call to this function will clean + * up anything it allocated, stop all audio output, close audio devices, etc. + * Don't attempt to destroy objects after this call. The app is still + * encouraged to manage their resources carefully and clean up first, treating + * this function as a safety net against memory leaks. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_Init + */ +extern SDL_DECLSPEC void SDLCALL MIX_Quit(void); + +/** + * Report the number of audio decoders available for use. + * + * An audio decoder is what turns specific audio file formats into usable PCM + * data. For example, there might be an MP3 decoder, or a WAV decoder, etc. + * SDL_mixer probably has several decoders built in. + * + * The return value can be used to call MIX_GetAudioDecoder() in a loop. + * + * The number of decoders available is decided during MIX_Init() and does not + * change until the library is deinitialized. + * + * \returns the number of decoders available. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetAudioDecoder + */ +extern SDL_DECLSPEC int SDLCALL MIX_GetNumAudioDecoders(void); + +/** + * Report the name of a specific audio decoders. + * + * An audio decoder is what turns specific audio file formats into usable PCM + * data. For example, there might be an MP3 decoder, or a WAV decoder, etc. + * SDL_mixer probably has several decoders built in. + * + * The names are capital English letters and numbers, low-ASCII. They don't + * necessarily map to a specific file format; Some decoders, like "XMP" + * operate on multiple file types, and more than one decoder might handle the + * same file type, like "DRMP3" vs "MPG123". Note that in that last example, + * neither decoder is called "MP3". + * + * The index of a specific decoder is decided during MIX_Init() and does not + * change until the library is deinitialized. Valid indices are between zero + * and the return value of MIX_GetNumAudioDecoders(). + * + * The returned pointer is const memory owned by SDL_mixer; do not free it. + * + * \param index the index of the decoder to query. + * \returns a UTF-8 (really, ASCII) string of the decoder's name, or NULL if + * `index` is invalid. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetNumAudioDecoders + */ +extern SDL_DECLSPEC const char * SDLCALL MIX_GetAudioDecoder(int index); + +/** + * Create a mixer that plays sound directly to an audio device. + * + * This is usually the function you want, vs MIX_CreateMixer(). + * + * You can choose a specific device ID to open, following SDL's usual rules, + * but often the correct choice is to specify + * SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK and let SDL figure out what device to use + * (and seamlessly transition you to new hardware if the default changes). + * + * Only playback devices make sense here. Attempting to open a recording + * device will fail. + * + * This will call SDL_Init(SDL_INIT_AUDIO) internally; it's safe to call + * SDL_Init() before this call, too, if you intend to enumerate audio devices + * to choose one to open here. + * + * An audio format can be requested, and the system will try to set the + * hardware to those specifications, or as close as possible, but this is just + * a hint. SDL_mixer will handle all data conversion behind the scenes in any + * case, and specifying a NULL spec is a reasonable choice. The best reason to + * specify a format is because you know all your data is in that format and it + * might save some unnecessary CPU time on conversion. + * + * The actual device format chosen is available through MIX_GetMixerFormat(). + * + * Once a mixer is created, next steps are usually to load audio (through + * MIX_LoadAudio() and friends), create a track (MIX_CreateTrack()), and play + * that audio through that track. + * + * When done with the mixer, it can be destroyed with MIX_DestroyMixer(). + * + * \param devid the device to open for playback, or + * SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK for the default. + * \param spec the audio format to request from the device. May be NULL. + * \returns a mixer that can be used to play audio, or NULL on failure; call + * SDL_GetError() for more information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateMixer + * \sa MIX_DestroyMixer + */ +extern SDL_DECLSPEC MIX_Mixer * SDLCALL MIX_CreateMixerDevice(SDL_AudioDeviceID devid, const SDL_AudioSpec *spec); + +/** + * Create a mixer that generates audio to a memory buffer. + * + * Usually you want MIX_CreateMixerDevice() instead of this function. The + * mixer created here can be used with MIX_Generate() to produce more data on + * demand, as fast as desired. + * + * An audio format must be specified. This is the format it will output in. + * This cannot be NULL. + * + * Once a mixer is created, next steps are usually to load audio (through + * MIX_LoadAudio() and friends), create a track (MIX_CreateTrack()), and play + * that audio through that track. + * + * When done with the mixer, it can be destroyed with MIX_DestroyMixer(). + * + * \param spec the audio format that mixer will generate. + * \returns a mixer that can be used to generate audio, or NULL on failure; + * call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateMixerDevice + * \sa MIX_DestroyMixer + */ +extern SDL_DECLSPEC MIX_Mixer * SDLCALL MIX_CreateMixer(const SDL_AudioSpec *spec); + +/** + * Free a mixer. + * + * If this mixer was created with MIX_CreateMixerDevice(), this function will + * also close the audio device and call SDL_QuitSubSystem(SDL_INIT_AUDIO). + * + * Any MIX_Group or MIX_Track created for this mixer will also be destroyed. + * Do not access them again or attempt to destroy them after the device is + * destroyed. MIX_Audio objects will not be destroyed, since they can be + * shared between mixers (but those will all be destroyed during MIX_Quit()). + * + * \param mixer the mixer to destroy. + * + * \threadsafety If this is used with a MIX_Mixer from MIX_CreateMixerDevice, + * then this function should only be called on the main thread. + * If this is used with a MIX_Mixer from MIX_CreateMixer, then + * it is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateMixerDevice + * \sa MIX_CreateMixer + */ +extern SDL_DECLSPEC void SDLCALL MIX_DestroyMixer(MIX_Mixer *mixer); + + +/** + * Get the properties associated with a mixer. + * + * The following read-only properties are provided by SDL_mixer: + * + * - `MIX_PROP_MIXER_DEVICE_NUMBER`: the SDL_AudioDeviceID that this mixer has + * opened for playback. This will be zero (no device) if the mixer was + * created with Mix_CreateMixer() instead of Mix_CreateMixerDevice(). + * + * \param mixer the mixer to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL MIX_GetMixerProperties(MIX_Mixer *mixer); + +#define MIX_PROP_MIXER_DEVICE_NUMBER "SDL_mixer.mixer.device" + + +/** + * Get the audio format a mixer is generating. + * + * Generally you don't need this information, as SDL_mixer will convert data + * as necessary between inputs you provide and its output format, but it might + * be useful if trying to match your inputs to reduce conversion and + * resampling costs. + * + * For mixers created with MIX_CreateMixerDevice(), this is the format of the + * audio device (and may change later if the device itself changes; SDL_mixer + * will seamlessly handle this change internally, though). + * + * For mixers created with MIX_CreateMixer(), this is the format that + * MIX_Generate() will produce, as requested at create time, and does not + * change. + * + * Note that internally, SDL_mixer will work in SDL_AUDIO_F32 format before + * outputting the format specified here, so it would be more efficient to + * match input data to that, not the final output format. + * + * \param mixer the mixer to query. + * \param spec where to store the mixer audio format. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_GetMixerFormat(MIX_Mixer *mixer, SDL_AudioSpec *spec); + +/** + * Lock a mixer by obtaining its internal mutex. + * + * While locked, the mixer will not be able to mix more audio or change its + * internal state in another thread. Those other threads will block until the + * mixer is unlocked again. + * + * Under the hood, this function calls SDL_LockMutex(), so all the same rules + * apply: the lock can be recursive, it must be unlocked the same number of + * times from the same thread that locked it, etc. + * + * Just about every SDL_mixer API _also_ locks the mixer while doing its work, + * as does the SDL audio device thread while actual mixing is in progress, so + * basic use of this library never requires the app to explicitly lock the + * device to be thread safe. There are two scenarios where this can be useful, + * however: + * + * - The app has a provided a callback that the mixing thread might call, and + * there is some app state that needs to be protected against race + * conditions as changes are made and mixing progresses simultaneously. Any + * lock can be used for this, but this is a conveniently-available lock. + * - The app wants to make multiple, atomic changes to the mix. For example, + * to start several tracks at the exact same moment, one would lock the + * mixer, call MIX_PlayTrack multiple times, and then unlock again; all the + * tracks will start mixing on the same sample frame. + * + * Each call to this function must be paired with a call to MIX_UnlockMixer + * from the same thread. It is safe to lock a mixer multiple times; it remains + * locked until the final matching unlock call. + * + * Do not lock the mixer for significant amounts of time, or it can cause + * audio dropouts. Just do simply things quickly and unlock again. + * + * Locking a NULL mixer is a safe no-op. + * + * \param mixer the mixer to lock. May be NULL. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_UnlockMixer + */ +extern SDL_DECLSPEC void SDLCALL MIX_LockMixer(MIX_Mixer *mixer); + +/** + * Unlock a mixer previously locked by a call to MIX_LockMixer(). + * + * While locked, the mixer will not be able to mix more audio or change its + * internal state another thread. Those other threads will block until the + * mixer is unlocked again. + * + * Under the hood, this function calls SDL_LockMutex(), so all the same rules + * apply: the lock can be recursive, it must be unlocked the same number of + * times from the same thread that locked it, etc. + * + * Unlocking a NULL mixer is a safe no-op. + * + * \param mixer the mixer to unlock. May be NULL. + * + * \threadsafety This call must be paired with a previous MIX_LockMixer call + * on the same thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_LockMixer + */ +extern SDL_DECLSPEC void SDLCALL MIX_UnlockMixer(MIX_Mixer *mixer); + +/** + * Load audio for playback from an SDL_IOStream. + * + * In normal usage, apps should load audio once, maybe at startup, then play + * it multiple times. + * + * When loading audio, it will be cached fully in RAM in its original data + * format. Each time it plays, the data will be decoded. For example, an MP3 + * will be stored in memory in MP3 format and be decompressed on the fly + * during playback. This is a tradeoff between i/o overhead and memory usage. + * + * If `predecode` is true, the data will be decompressed during load and + * stored as raw PCM data. This might dramatically increase loading time and + * memory usage, but there will be no need to decompress data during playback. + * + * (One could also use MIX_SetTrackIOStream() to bypass loading the data into + * RAM upfront at all, but this offers still different tradeoffs. The correct + * approach depends on the app's needs and employing different approaches in + * different situations can make sense.) + * + * MIX_Audio objects can be shared between mixers. This function takes a + * MIX_Mixer, to imply this is the most likely place it will be used and + * loading should try to match its audio format, but the resulting audio can + * be used elsewhere. If `mixer` is NULL, SDL_mixer will set reasonable + * defaults. + * + * Once a MIX_Audio is created, it can be assigned to a MIX_Track with + * MIX_SetTrackAudio(), or played without any management with MIX_PlayAudio(). + * + * When done with a MIX_Audio, it can be freed with MIX_DestroyAudio(). + * + * This function loads data from an SDL_IOStream. There is also a version that + * loads from a path on the filesystem (MIX_LoadAudio()), and one that accepts + * properties for ultimate control (MIX_LoadAudioWithProperties()). + * + * The SDL_IOStream provided must be able to seek, or loading will fail. If + * the stream can't seek (data is coming from an HTTP connection, etc), + * consider caching the data to memory or disk first and creating a new stream + * to read from there. + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param io the SDL_IOStream to load data from. + * \param predecode if true, data will be fully uncompressed before returning. + * \param closeio true if SDL_mixer should close `io` before returning + * (success or failure). + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadAudio + * \sa MIX_LoadAudioWithProperties + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadAudio_IO(MIX_Mixer *mixer, SDL_IOStream *io, bool predecode, bool closeio); + +/** + * Load audio for playback from a file. + * + * This is equivalent to calling: + * + * ```c + * MIX_LoadAudio_IO(mixer, SDL_IOFromFile(path, "rb"), predecode, true); + * ``` + * + * This function loads data from a path on the filesystem. There is also a + * version that loads from an SDL_IOStream (MIX_LoadAudio_IO()), and one that + * accepts properties for ultimate control (MIX_LoadAudioWithProperties()). + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param path the path on the filesystem to load data from. + * \param predecode if true, data will be fully uncompressed before returning. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadAudio_IO + * \sa MIX_LoadAudioWithProperties + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadAudio(MIX_Mixer *mixer, const char *path, bool predecode); + +/** + * Load audio for playback from a memory buffer without making a copy. + * + * When loading audio through most other LoadAudio functions, the data will be + * cached fully in RAM in its original data format, for decoding on-demand. + * This function does most of the same work as those functions, but instead + * uses a buffer of memory provided by the app that it does not make a copy + * of. + * + * This buffer must live for the entire time the returned MIX_Audio lives, as + * the mixer will access the buffer whenever it needs to mix more data. + * + * This function is meant to maximize efficiency: if the data is already in + * memory and can remain there, don't copy it. This data can be in any + * supported audio file format (WAV, MP3, etc); it will be decoded on the fly + * while mixing. Unlike MIX_LoadAudio(), there is no `predecode` option + * offered here, as this is meant to optimize for data that's already in + * memory and intends to exist there for significant time; since predecoding + * would only need the file format data once, upfront, one could simply wrap + * it in SDL_CreateIOFromConstMem() and pass that to MIX_LoadAudio_IO(). + * + * MIX_Audio objects can be shared between multiple mixers. The `mixer` + * parameter just suggests the most likely mixer to use this audio, in case + * some optimization might be applied, but this is not required, and a NULL + * mixer may be specified. + * + * If `free_when_done` is true, SDL_mixer will call `SDL_free(data)` when the + * returned MIX_Audio is eventually destroyed. This can be useful when the + * data is not static, but rather loaded elsewhere for this specific MIX_Audio + * and simply wants to avoid the extra copy. + * + * As audio format information is obtained from the file format metadata, this + * isn't useful for raw PCM data; in that case, use MIX_LoadRawAudioNoCopy() + * instead, which offers an SDL_AudioSpec. + * + * Once a MIX_Audio is created, it can be assigned to a MIX_Track with + * MIX_SetTrackAudio(), or played without any management with MIX_PlayAudio(). + * + * When done with a MIX_Audio, it can be freed with MIX_DestroyAudio(). + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param data the buffer where the audio data lives. + * \param datalen the size, in bytes, of the buffer. + * \param free_when_done if true, `data` will be given to SDL_free() when the + * MIX_Audio is destroyed. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadRawAudioNoCopy + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadAudioNoCopy(MIX_Mixer *mixer, const void *data, size_t datalen, bool free_when_done); + +/** + * Load audio for playback through a collection of properties. + * + * Please see MIX_LoadAudio_IO() for a description of what the various + * LoadAudio functions do. This function uses properties to dictate how it + * operates, and exposes functionality the other functions don't provide. + * + * SDL_PropertiesID are discussed in + * [SDL's documentation](https://wiki.libsdl.org/SDL3/CategoryProperties) + * . + * + * These are the supported properties: + * + * - `MIX_PROP_AUDIO_LOAD_IOSTREAM_POINTER`: a pointer to an SDL_IOStream to + * be used to load audio data. Required. This stream must be able to seek! + * - `MIX_PROP_AUDIO_LOAD_CLOSEIO_BOOLEAN`: true if SDL_mixer should close the + * SDL_IOStream before returning (success or failure). + * - `MIX_PROP_AUDIO_LOAD_PREDECODE_BOOLEAN`: true if SDL_mixer should fully + * decode and decompress the data before returning. Otherwise it will be + * stored in its original state and decompressed on demand. + * - `MIX_PROP_AUDIO_LOAD_PREFERRED_MIXER_POINTER`: a pointer to a MIX_Mixer, + * in case steps can be made to match its format when decoding. Optional. + * - `MIX_PROP_AUDIO_LOAD_SKIP_METADATA_TAGS_BOOLEAN`: true to skip parsing + * metadata tags, like ID3 and APE tags. This can be used to speed up + * loading _if the data definitely doesn't have these tags_. Some decoders + * will fail if these tags are present when this property is true. + * - `MIX_PROP_AUDIO_DECODER_STRING`: the name of the decoder to use for this + * data. Optional. If not specified, SDL_mixer will examine the data and + * choose the best decoder. These names are the same returned from + * MIX_GetAudioDecoder(). + * + * Specific decoders might accept additional custom properties, such as where + * to find soundfonts for MIDI playback, etc. + * + * \param props a set of properties on how to load audio. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadAudio + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadAudioWithProperties(SDL_PropertiesID props); + +#define MIX_PROP_AUDIO_LOAD_IOSTREAM_POINTER "SDL_mixer.audio.load.iostream" +#define MIX_PROP_AUDIO_LOAD_CLOSEIO_BOOLEAN "SDL_mixer.audio.load.closeio" +#define MIX_PROP_AUDIO_LOAD_PREDECODE_BOOLEAN "SDL_mixer.audio.load.predecode" +#define MIX_PROP_AUDIO_LOAD_PREFERRED_MIXER_POINTER "SDL_mixer.audio.load.preferred_mixer" +#define MIX_PROP_AUDIO_LOAD_SKIP_METADATA_TAGS_BOOLEAN "SDL_mixer.audio.load.skip_metadata_tags" +#define MIX_PROP_AUDIO_DECODER_STRING "SDL_mixer.audio.decoder" + +/** + * Load raw PCM data from an SDL_IOStream. + * + * There are other options for _streaming_ raw PCM: an SDL_AudioStream can be + * connected to a track, as can an SDL_IOStream, and will read from those + * sources on-demand when it is time to mix the audio. This function is useful + * for loading static audio data that is meant to be played multiple times. + * + * This function will load the raw data in its entirety and cache it in RAM. + * + * MIX_Audio objects can be shared between multiple mixers. The `mixer` + * parameter just suggests the most likely mixer to use this audio, in case + * some optimization might be applied, but this is not required, and a NULL + * mixer may be specified. + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param io the SDL_IOStream to load data from. + * \param spec what format the raw data is in. + * \param closeio true if SDL_mixer should close `io` before returning + * (success or failure). + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadRawAudio + * \sa MIX_LoadRawAudioNoCopy + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadRawAudio_IO(MIX_Mixer *mixer, SDL_IOStream *io, const SDL_AudioSpec *spec, bool closeio); + +/** + * Load raw PCM data from a memory buffer. + * + * There are other options for _streaming_ raw PCM: an SDL_AudioStream can be + * connected to a track, as can an SDL_IOStream, and will read from those + * sources on-demand when it is time to mix the audio. This function is useful + * for loading static audio data that is meant to be played multiple times. + * + * This function will load the raw data in its entirety and cache it in RAM, + * allocating a copy. If the original data will outlive the created MIX_Audio, + * you can use MIX_LoadRawAudioNoCopy() to avoid extra allocations and copies. + * + * MIX_Audio objects can be shared between multiple mixers. The `mixer` + * parameter just suggests the most likely mixer to use this audio, in case + * some optimization might be applied, but this is not required, and a NULL + * mixer may be specified. + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param data the raw PCM data to load. + * \param datalen the size, in bytes, of the raw PCM data. + * \param spec what format the raw data is in. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadRawAudio_IO + * \sa MIX_LoadRawAudioNoCopy + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadRawAudio(MIX_Mixer *mixer, const void *data, size_t datalen, const SDL_AudioSpec *spec); + +/** + * Load raw PCM data from a memory buffer without making a copy. + * + * This buffer must live for the entire time the returned MIX_Audio lives, as + * the mixer will access the buffer whenever it needs to mix more data. + * + * This function is meant to maximize efficiency: if the data is already in + * memory and can remain there, don't copy it. But it can also lead to some + * interesting tricks, like changing the buffer's contents to alter multiple + * playing tracks at once. (But, of course, be careful when being too clever.) + * + * MIX_Audio objects can be shared between multiple mixers. The `mixer` + * parameter just suggests the most likely mixer to use this audio, in case + * some optimization might be applied, but this is not required, and a NULL + * mixer may be specified. + * + * If `free_when_done` is true, SDL_mixer will call `SDL_free(data)` when the + * returned MIX_Audio is eventually destroyed. This can be useful when the + * data is not static, but rather composed dynamically for this specific + * MIX_Audio and simply wants to avoid the extra copy. + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param data the buffer where the raw PCM data lives. + * \param datalen the size, in bytes, of the buffer. + * \param spec what format the raw data is in. + * \param free_when_done if true, `data` will be given to SDL_free() when the + * MIX_Audio is destroyed. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadRawAudio + * \sa MIX_LoadRawAudio_IO + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadRawAudioNoCopy(MIX_Mixer *mixer, const void *data, size_t datalen, const SDL_AudioSpec *spec, bool free_when_done); + +/** + * Create a MIX_Audio that generates a sinewave. + * + * This is useful just to have _something_ to play, perhaps for testing or + * debugging purposes. + * + * You specify its frequency in Hz (determines the pitch of the sinewave's + * audio) and amplitude (determines the volume of the sinewave: 1.0f is very + * loud, 0.0f is silent). + * + * A number of milliseconds of audio to generate can be specified. Specifying + * a value less than zero will generate infinite audio (when assigned to a + * MIX_Track, the sinewave will play forever). + * + * MIX_Audio objects can be shared between multiple mixers. The `mixer` + * parameter just suggests the most likely mixer to use this audio, in case + * some optimization might be applied, but this is not required, and a NULL + * mixer may be specified. + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param hz the sinewave's frequency in Hz. + * \param amplitude the sinewave's amplitude from 0.0f to 1.0f. + * \param ms the maximum number of milliseconds of audio to generate, or less + * than zero to generate infinite audio. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_CreateSineWaveAudio(MIX_Mixer *mixer, int hz, float amplitude, Sint64 ms); + + +/** + * Get the properties associated with a MIX_Audio. + * + * SDL_mixer offers some properties of its own, but this can also be a + * convenient place to store app-specific data. + * + * A SDL_PropertiesID is created the first time this function is called for a + * given MIX_Audio, if necessary. + * + * The following read-only properties are provided by SDL_mixer: + * + * - `MIX_PROP_METADATA_TITLE_STRING`: the audio's title ("Smells Like Teen + * Spirit"). + * - `MIX_PROP_METADATA_ARTIST_STRING`: the audio's artist name ("Nirvana"). + * - `MIX_PROP_METADATA_ALBUM_STRING`: the audio's album name ("Nevermind"). + * - `MIX_PROP_METADATA_COPYRIGHT_STRING`: the audio's copyright info + * ("Copyright (c) 1991") + * - `MIX_PROP_METADATA_TRACK_NUMBER`: the audio's track number on the album + * (1) + * - `MIX_PROP_METADATA_TOTAL_TRACKS_NUMBER`: the total tracks on the album + * (13) + * - `MIX_PROP_METADATA_YEAR_NUMBER`: the year the audio was released (1991) + * - `MIX_PROP_METADATA_DURATION_FRAMES_NUMBER`: The sample frames worth of + * PCM data that comprise this audio. It might be off by a little if the + * decoder only knows the duration as a unit of time. + * - `MIX_PROP_METADATA_DURATION_INFINITE_BOOLEAN`: if true, audio never runs + * out of sound to generate. This isn't necessarily always known to + * SDL_mixer, though. + * + * Other properties, documented with MIX_LoadAudioWithProperties(), may also + * be present. + * + * Note that the metadata properties are whatever SDL_mixer finds in things + * like ID3 tags, and they often have very little standardized formatting, may + * be missing, and can be completely wrong if the original data is + * untrustworthy (like an MP3 from a P2P file sharing service). + * + * \param audio the audio to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL MIX_GetAudioProperties(MIX_Audio *audio); + +#define MIX_PROP_METADATA_TITLE_STRING "SDL_mixer.metadata.title" +#define MIX_PROP_METADATA_ARTIST_STRING "SDL_mixer.metadata.artist" +#define MIX_PROP_METADATA_ALBUM_STRING "SDL_mixer.metadata.album" +#define MIX_PROP_METADATA_COPYRIGHT_STRING "SDL_mixer.metadata.copyright" +#define MIX_PROP_METADATA_TRACK_NUMBER "SDL_mixer.metadata.track" +#define MIX_PROP_METADATA_TOTAL_TRACKS_NUMBER "SDL_mixer.metadata.total_tracks" +#define MIX_PROP_METADATA_YEAR_NUMBER "SDL_mixer.metadata.year" +#define MIX_PROP_METADATA_DURATION_FRAMES_NUMBER "SDL_mixer.metadata.duration_frames" +#define MIX_PROP_METADATA_DURATION_INFINITE_BOOLEAN "SDL_mixer.metadata.duration_infinite" + + +/** + * Get the length of a MIX_Audio's playback in sample frames. + * + * This information is also available via the + * MIX_PROP_METADATA_DURATION_FRAMES_NUMBER property, but it's common enough + * to provide a simple accessor function. + * + * This reports the length of the data in _sample frames_, so sample-perfect + * mixing can be possible. Sample frames are only meaningful as a measure of + * time if the sample rate (frequency) is also known. To convert from sample + * frames to milliseconds, use MIX_AudioFramesToMS(). + * + * Not all audio file formats can report the complete length of the data they + * will produce through decoding: some can't calculate it, some might produce + * infinite audio. + * + * Also, some file formats can only report duration as a unit of time, which + * means SDL_mixer might have to estimate sample frames from that information. + * With less precision, the reported duration might be off by a few sample + * frames in either direction. + * + * This will return a value >= 0 if a duration is known. It might also return + * MIX_DURATION_UNKNOWN or MIX_DURATION_INFINITE. + * + * \param audio the audio to query. + * \returns the length of the audio in sample frames, or MIX_DURATION_UNKNOWN + * or MIX_DURATION_INFINITE. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_GetAudioDuration(MIX_Audio *audio); + +#define MIX_DURATION_UNKNOWN -1 +#define MIX_DURATION_INFINITE -2 + + +/** + * Query the initial audio format of a MIX_Audio. + * + * Note that some audio files can change format in the middle; some explicitly + * support this, but a more common example is two MP3 files concatenated + * together. In many cases, SDL_mixer will correctly handle these sort of + * files, but this function will only report the initial format a file uses. + * + * \param audio the audio to query. + * \param spec on success, audio format details will be stored here. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_GetAudioFormat(MIX_Audio *audio, SDL_AudioSpec *spec); + +/** + * Destroy the specified audio. + * + * MIX_Audio is reference-counted internally, so this function only unrefs it. + * If doing so causes the reference count to drop to zero, the MIX_Audio will + * be deallocated. This allows the system to safely operate if the audio is + * still assigned to a MIX_Track at the time of destruction. The actual + * destroying will happen when the track stops using it. + * + * But from the caller's perspective, once this function is called, it should + * assume the `audio` pointer has become invalid. + * + * Destroying a NULL MIX_Audio is a legal no-op. + * + * \param audio the audio to destroy. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC void SDLCALL MIX_DestroyAudio(MIX_Audio *audio); + +/** + * Create a new track on a mixer. + * + * A track provides a single source of audio. All currently-playing tracks + * will be processed and mixed together to form the final output from the + * mixer. + * + * There are no limits to the number of tracks one may create, beyond running + * out of memory, but in normal practice there are a small number of tracks + * that are reused between all loaded audio as appropriate. + * + * Tracks are unique to a specific MIX_Mixer and can't be transferred between + * them. + * + * \param mixer the mixer on which to create this track. + * \returns a new MIX_Track on success, NULL on error; call SDL_GetError() for + * more informations. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyTrack + */ +extern SDL_DECLSPEC MIX_Track * SDLCALL MIX_CreateTrack(MIX_Mixer *mixer); + +/** + * Destroy the specified track. + * + * If the track is currently playing, it will be stopped immediately, without + * any fadeout. If there is a callback set through + * MIX_SetTrackStoppedCallback(), it will _not_ be called. + * + * If the mixer is currently mixing in another thread, this will block until + * it finishes. + * + * Destroying a NULL MIX_Track is a legal no-op. + * + * \param track the track to destroy. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC void SDLCALL MIX_DestroyTrack(MIX_Track *track); + +/** + * Get the properties associated with a track. + * + * Currently SDL_mixer assigns no properties of its own to a track, but this + * can be a convenient place to store app-specific data. + * + * A SDL_PropertiesID is created the first time this function is called for a + * given track. + * + * \param track the track to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL MIX_GetTrackProperties(MIX_Track *track); + +/** + * Get the MIX_Mixer that owns a MIX_Track. + * + * This is the mixer pointer that was passed to MIX_CreateTrack(). + * + * \param track the track to query. + * \returns the mixer associated with the track, or NULL on error; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC MIX_Mixer * SDLCALL MIX_GetTrackMixer(MIX_Track *track); + +/** + * Set a MIX_Track's input to a MIX_Audio. + * + * A MIX_Audio is audio data stored in RAM (possibly still in a compressed + * form). One MIX_Audio can be assigned to multiple tracks at once. + * + * Once a track has a valid input, it can start mixing sound by calling + * MIX_PlayTrack(), or possibly MIX_PlayTag(). + * + * Calling this function with a NULL audio input is legal, and removes any + * input from the track. If the track was currently playing, the next time the + * mixer runs, it'll notice this and mark the track as stopped, calling any + * assigned MIX_TrackStoppedCallback. + * + * It is legal to change the input of a track while it's playing, however some + * states, like loop points, may cease to make sense with the new audio. In + * such a case, one can call MIX_PlayTrack again to adjust parameters. + * + * The track will hold a reference to the provided MIX_Audio, so it is safe to + * call MIX_DestroyAudio() on it while the track is still using it. The track + * will drop its reference (and possibly free the resources) once it is no + * longer using the MIX_Audio. + * + * \param track the track on which to set a new audio input. + * \param audio the new audio input to set. May be NULL. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackAudio(MIX_Track *track, MIX_Audio *audio); + +/** + * Set a MIX_Track's input to an SDL_AudioStream. + * + * Using an audio stream allows the application to generate any type of audio, + * in any format, possibly procedurally or on-demand, and mix in with all + * other tracks. + * + * When a track uses an audio stream, it will call SDL_GetAudioStreamData as + * it needs more audio to mix. The app can either buffer data to the stream + * ahead of time, or set a callback on the stream to provide data as needed. + * Please refer to SDL's documentation for details. + * + * A given audio stream may only be assigned to a single track at a time; + * duplicate assignments won't return an error, but assigning a stream to + * multiple tracks will cause each track to read from the stream arbitrarily, + * causing confusion and incorrect mixing. + * + * Once a track has a valid input, it can start mixing sound by calling + * MIX_PlayTrack(), or possibly MIX_PlayTag(). + * + * Calling this function with a NULL audio stream is legal, and removes any + * input from the track. If the track was currently playing, the next time the + * mixer runs, it'll notice this and mark the track as stopped, calling any + * assigned MIX_TrackStoppedCallback. + * + * It is legal to change the input of a track while it's playing, however some + * states, like loop points, may cease to make sense with the new audio. In + * such a case, one can call MIX_PlayTrack again to adjust parameters. + * + * The provided audio stream must remain valid until the track no longer needs + * it (either by changing the track's input or destroying the track). + * + * \param track the track on which to set a new audio input. + * \param stream the audio stream to use as the track's input. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackAudioStream(MIX_Track *track, SDL_AudioStream *stream); + +/** + * Set a MIX_Track's input to an SDL_IOStream. + * + * This is not the recommended way to set a track's input, but this can be + * useful for a very specific scenario: a large file, to be played once, that + * must be read from disk in small chunks as needed. In most cases, however, + * it is preferable to create a MIX_Audio ahead of time and use + * MIX_SetTrackAudio() instead. + * + * The stream supplied here should provide an audio file in a supported + * format. SDL_mixer will parse it during this call to make sure it's valid, + * and then will read file data from the stream as it needs to decode more + * during mixing. + * + * The stream must be able to seek through the complete set of data, or this + * function will fail. + * + * A given IOStream may only be assigned to a single track at a time; + * duplicate assignments won't return an error, but assigning a stream to + * multiple tracks will cause each track to read from the stream arbitrarily, + * causing confusion, incorrect mixing, or failure to decode. + * + * Once a track has a valid input, it can start mixing sound by calling + * MIX_PlayTrack(), or possibly MIX_PlayTag(). + * + * Calling this function with a NULL stream is legal, and removes any input + * from the track. If the track was currently playing, the next time the mixer + * runs, it'll notice this and mark the track as stopped, calling any assigned + * MIX_TrackStoppedCallback. + * + * It is legal to change the input of a track while it's playing, however some + * states, like loop points, may cease to make sense with the new audio. In + * such a case, one can call MIX_PlayTrack again to adjust parameters. + * + * The provided stream must remain valid until the track no longer needs it + * (either by changing the track's input or destroying the track). + * + * \param track the track on which to set a new audio input. + * \param io the new i/o stream to use as the track's input. + * \param closeio if true, close the stream when done with it. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackRawIOStream + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackIOStream(MIX_Track *track, SDL_IOStream *io, bool closeio); + +/** + * Set a MIX_Track's input to an SDL_IOStream providing raw PCM data. + * + * This is not the recommended way to set a track's input, but this can be + * useful for a very specific scenario: a large file, to be played once, that + * must be read from disk in small chunks as needed. In most cases, however, + * it is preferable to create a MIX_Audio ahead of time and use + * MIX_SetTrackAudio() instead. + * + * Also, an MIX_SetTrackAudioStream() can _also_ provide raw PCM audio to a + * track, via an SDL_AudioStream, which might be preferable unless the data is + * already coming directly from an SDL_IOStream. + * + * The stream supplied here should provide an audio in raw PCM format. + * + * A given IOStream may only be assigned to a single track at a time; + * duplicate assignments won't return an error, but assigning a stream to + * multiple tracks will cause each track to read from the stream arbitrarily, + * causing confusion and incorrect mixing. + * + * Once a track has a valid input, it can start mixing sound by calling + * MIX_PlayTrack(), or possibly MIX_PlayTag(). + * + * Calling this function with a NULL stream is legal, and removes any input + * from the track. If the track was currently playing, the next time the mixer + * runs, it'll notice this and mark the track as stopped, calling any assigned + * MIX_TrackStoppedCallback. + * + * It is legal to change the input of a track while it's playing, however some + * states, like loop points, may cease to make sense with the new audio. In + * such a case, one can call MIX_PlayTrack again to adjust parameters. + * + * The provided stream must remain valid until the track no longer needs it + * (either by changing the track's input or destroying the track). + * + * \param track the track on which to set a new audio input. + * \param io the new i/o stream to use as the track's input. + * \param spec the format of the PCM data that the SDL_IOStream will provide. + * \param closeio if true, close the stream when done with it. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackAudioStream + * \sa MIX_SetTrackIOStream + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackRawIOStream(MIX_Track *track, SDL_IOStream *io, const SDL_AudioSpec *spec, bool closeio); + + +/** + * Assign an arbitrary tag to a track. + * + * A tag can be any valid C string in UTF-8 encoding. It can be useful to + * group tracks in various ways. For example, everything in-game might be + * marked as "game", so when the user brings up the settings menu, the app can + * pause all tracks involved in gameplay at once, but keep background music + * and menu sound effects running. + * + * A track can have as many tags as desired, until the machine runs out of + * memory. + * + * It's legal to add the same tag to a track more than once; the extra + * attempts will report success but not change anything. + * + * Tags can later be removed with MIX_UntagTrack(). + * + * \param track the track to add a tag to. + * \param tag the tag to add. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_UntagTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_TagTrack(MIX_Track *track, const char *tag); + +/** + * Remove an arbitrary tag from a track. + * + * A tag can be any valid C string in UTF-8 encoding. It can be useful to + * group tracks in various ways. For example, everything in-game might be + * marked as "game", so when the user brings up the settings menu, the app can + * pause all tracks involved in gameplay at once, but keep background music + * and menu sound effects running. + * + * It's legal to remove a tag that the track doesn't have; this function + * doesn't report errors, so this simply does nothing. + * + * Specifying a NULL tag will remove all tags on a track. + * + * \param track the track from which to remove a tag. + * \param tag the tag to remove, or NULL to remove all current tags. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TagTrack + */ +extern SDL_DECLSPEC void SDLCALL MIX_UntagTrack(MIX_Track *track, const char *tag); + +/** + * Get the tags currently associated with a track. + * + * Tags are not provided in any guaranteed order. + * + * \param track the track to query. + * \param count a pointer filled in with the number of tags returned, can be + * NULL. + * \returns an array of the tags, NULL-terminated, or NULL on failure; call + * SDL_GetError() for more information. This is a single allocation + * that should be freed with SDL_free() when it is no longer needed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC char ** SDLCALL MIX_GetTrackTags(MIX_Track *track, int *count); + +/** + * Get all tracks with a specific tag. + * + * Tracks are not provided in any guaranteed order. + * + * \param mixer the mixer to query. + * \param tag the tag to search. + * \param count a pointer filled in with the number of tracks returned, can be + * NULL. + * \returns an array of the tracks, NULL-terminated, or NULL on failure; call + * SDL_GetError() for more information. The returned pointer should + * be freed with SDL_free() when it is no longer needed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC MIX_Track ** SDLCALL MIX_GetTaggedTracks(MIX_Mixer *mixer, const char *tag, int *count); + +/** + * Seek a playing track to a new position in its input. + * + * (Not to be confused with MIX_SetTrack3DPosition(), which is positioning of + * the track in 3D space, not the playback position of its audio data.) + * + * On a playing track, the next time the mixer runs, it will start mixing from + * the new position. + * + * Position is defined in _sample frames_ of decoded audio, not units of time, + * so that sample-perfect mixing can be achieved. To instead operate in units + * of time, use MIX_TrackMSToFrames() to get the approximate sample frames for + * a given tick. + * + * This function requires an input that can seek (so it can not be used if the + * input was set with MIX_SetTrackAudioStream()), and a audio file format that + * allows seeking. SDL_mixer's decoders for some file formats do not offer + * seeking, or can only seek to times, not exact sample frames, in which case + * the final position may be off by some amount of sample frames. Please check + * your audio data and file bug reports if appropriate. + * + * It's legal to call this function on a track that is stopped, but a future + * call to MIX_PlayTrack() will reset the start position anyhow. Paused tracks + * will resume at the new input position. + * + * \param track the track to change. + * \param frames the sample frame position to seek to. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackPlaybackPosition + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackPlaybackPosition(MIX_Track *track, Sint64 frames); + +/** + * Get the current input position of a playing track. + * + * (Not to be confused with MIX_GetTrack3DPosition(), which is positioning of + * the track in 3D space, not the playback position of its audio data.) + * + * Position is defined in _sample frames_ of decoded audio, not units of time, + * so that sample-perfect mixing can be achieved. To instead operate in units + * of time, use MIX_TrackFramesToMS() to convert the return value to + * milliseconds. + * + * Stopped and paused tracks will report the position when they halted. + * Playing tracks will report the current position, which will change over + * time. + * + * \param track the track to change. + * \returns the track's current sample frame position, or -1 on error; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackPlaybackPosition + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_GetTrackPlaybackPosition(MIX_Track *track); + +/** + * Query whether a given track is fading. + * + * This specifically checks if the track is _not stopped_ (paused or playing), + * and it is fading in or out, and returns the number of frames remaining in + * the fade. + * + * If fading out, the returned value will be negative. When fading in, the + * returned value will be positive. If not fading, this function returns zero. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns 0, but there is no mechanism to distinguish errors from tracks that + * aren't fading. + * + * \param track the track to query. + * \returns less than 0 if the track is fading out, greater than 0 if fading + * in, zero otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_GetTrackFadeFrames(MIX_Track *track); + +/** + * Query how many loops remain for a given track. + * + * This returns the number of loops still pending; if a track will eventually + * complete and loop to play again one more time, this will return 1. If a + * track _was_ looping but is on its final iteration of the loop (will stop + * when this iteration completes), this will return zero. + * + * A track that is looping infinitely will return -1. This value does not + * report an error in this case. + * + * A track that is stopped (not playing and not paused) will have zero loops + * remaining. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns zero, but there is no mechanism to distinguish errors from + * non-looping tracks. + * + * \param track the track to query. + * \returns the number of pending loops, zero if not looping, and -1 if + * looping infinitely. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC int SDLCALL MIX_GetTrackLoops(MIX_Track *track); + +/** + * Change the number of times a currently-playing track will loop. + * + * This replaces any previously-set remaining loops. A value of 1 will loop to + * the start of playback one time. Zero will not loop at all. A value of -1 + * requests infinite loops. If the input is not seekable and `num_loops` isn't + * zero, this function will report success but the track will stop at the + * point it should loop. + * + * The new loop count replaces any previous state, even if the track has + * already looped. + * + * This has no effect on a track that is stopped, or rather, starting a + * stopped track later will set a new loop count, replacing this value. + * Stopped tracks can specify a loop count while starting via + * MIX_PROP_PLAY_LOOPS_NUMBER. This function is intended to alter that count + * in the middle of playback. + * + * \param track the track to configure. + * \param num_loops new number of times to loop. Zero to disable looping, -1 + * to loop infinitely. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackLoops + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackLoops(MIX_Track *track, int num_loops); + +/** + * Query the MIX_Audio assigned to a track. + * + * This returns the MIX_Audio object currently assigned to `track` through a + * call to MIX_SetTrackAudio(). If there is none assigned, or the track has an + * input that isn't a MIX_Audio (such as an SDL_AudioStream or SDL_IOStream), + * this will return NULL. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns NULL, but there is no mechanism to distinguish errors from tracks + * without a valid input. + * + * \param track the track to query. + * \returns a MIX_Audio if available, NULL if not. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackAudioStream + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_GetTrackAudio(MIX_Track *track); + +/** + * Query the SDL_AudioStream assigned to a track. + * + * This returns the SDL_AudioStream object currently assigned to `track` + * through a call to MIX_SetTrackAudioStream(). If there is none assigned, or + * the track has an input that isn't an SDL_AudioStream (such as a MIX_Audio + * or SDL_IOStream), this will return NULL. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns NULL, but there is no mechanism to distinguish errors from tracks + * without a valid input. + * + * \param track the track to query. + * \returns an SDL_AudioStream if available, NULL if not. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackAudio + */ +extern SDL_DECLSPEC SDL_AudioStream * SDLCALL MIX_GetTrackAudioStream(MIX_Track *track); + +/** + * Return the number of sample frames remaining to be mixed in a track. + * + * If the track is playing or paused, and its total duration is known, this + * will report how much audio is left to mix. If the track is playing, future + * calls to this function will report different values. + * + * Remaining audio is defined in _sample frames_ of decoded audio, not units + * of time, so that sample-perfect mixing can be achieved. To instead operate + * in units of time, use MIX_TrackFramesToMS() to convert the return value to + * milliseconds. + * + * This function does not take into account fade-outs or looping, just the + * current mixing position vs the duration of the track. + * + * If the duration of the track isn't known, or `track` is NULL, this function + * returns -1. A stopped track reports 0. + * + * \param track the track to query. + * \returns the total sample frames still to be mixed, or -1 if unknown. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_GetTrackRemaining(MIX_Track *track); + +/** + * Convert milliseconds to sample frames for a track's current format. + * + * This calculates time based on the track's current input format, which can + * change when its input does, and also if that input changes formats + * mid-stream (for example, if decoding a file that is two MP3s concatenated + * together). + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns -1. If the track has no input, this returns -1. If `ms` is < 0, + * this returns -1. + * + * \param track the track to query. + * \param ms the milliseconds to convert to track-specific sample frames. + * \returns Converted number of sample frames, or -1 for errors/no input; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TrackFramesToMS + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_TrackMSToFrames(MIX_Track *track, Sint64 ms); + +/** + * Convert sample frames for a track's current format to milliseconds. + * + * This calculates time based on the track's current input format, which can + * change when its input does, and also if that input changes formats + * mid-stream (for example, if decoding a file that is two MP3s concatenated + * together). + * + * Sample frames are more precise than milliseconds, so out of necessity, this + * function will approximate by rounding down to the closest full millisecond. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns -1. If the track has no input, this returns -1. If `frames` is < 0, + * this returns -1. + * + * \param track the track to query. + * \param frames the track-specific sample frames to convert to milliseconds. + * \returns Converted number of milliseconds, or -1 for errors/no input; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TrackMSToFrames + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_TrackFramesToMS(MIX_Track *track, Sint64 frames); + +/** + * Convert milliseconds to sample frames for a MIX_Audio's format. + * + * This calculates time based on the audio's initial format, even if the + * format would change mid-stream. + * + * If `ms` is < 0, this returns -1. + * + * \param audio the audio to query. + * \param ms the milliseconds to convert to audio-specific sample frames. + * \returns Converted number of sample frames, or -1 for errors/no input; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_AudioFramesToMS + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_AudioMSToFrames(MIX_Audio *audio, Sint64 ms); + +/** + * Convert sample frames for a MIX_Audio's format to milliseconds. + * + * This calculates time based on the audio's initial format, even if the + * format would change mid-stream. + * + * Sample frames are more precise than milliseconds, so out of necessity, this + * function will approximate by rounding down to the closest full millisecond. + * + * If `frames` is < 0, this returns -1. + * + * \param audio the audio to query. + * \param frames the audio-specific sample frames to convert to milliseconds. + * \returns Converted number of milliseconds, or -1 for errors/no input; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_AudioMSToFrames + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_AudioFramesToMS(MIX_Audio *audio, Sint64 frames); + +/** + * Convert milliseconds to sample frames at a specific sample rate. + * + * If `sample_rate` is <= 0, this returns -1. If `ms` is < 0, this returns -1. + * + * \param sample_rate the sample rate to use for conversion. + * \param ms the milliseconds to convert to rate-specific sample frames. + * \returns Converted number of sample frames, or -1 for errors; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_FramesToMS + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_MSToFrames(int sample_rate, Sint64 ms); + +/** + * Convert sample frames, at a specific sample rate, to milliseconds. + * + * Sample frames are more precise than milliseconds, so out of necessity, this + * function will approximate by rounding down to the closest full millisecond. + * + * If `sample_rate` is <= 0, this returns -1. If `frames` is < 0, this returns + * -1. + * + * \param sample_rate the sample rate to use for conversion. + * \param frames the rate-specific sample frames to convert to milliseconds. + * \returns Converted number of milliseconds, or -1 for errors; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_MSToFrames + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_FramesToMS(int sample_rate, Sint64 frames); + + +/* operations that deal with actual mixing/playback... */ + +/** + * Start (or restart) mixing a track for playback. + * + * The track will use whatever input was last assigned to it when playing; an + * input must be assigned to this track or this function will fail. Inputs are + * assigned with calls to MIX_SetTrackAudio(), MIX_SetTrackAudioStream(), or + * MIX_SetTrackIOStream(). + * + * If the track is already playing, or paused, this will restart the track + * with the newly-specified parameters. + * + * As there are several parameters, and more may be added in the future, they + * are specified with an SDL_PropertiesID. The parameters have reasonable + * defaults, and specifying a 0 for `options` will choose defaults for + * everything. + * + * SDL_PropertiesID are discussed in + * [SDL's documentation](https://wiki.libsdl.org/SDL3/CategoryProperties) + * . + * + * These are the supported properties: + * + * - `MIX_PROP_PLAY_LOOPS_NUMBER`: The number of times to loop the track when + * it reaches the end. A value of 1 will loop to the start one time. Zero + * will not loop at all. A value of -1 requests infinite loops. If the input + * is not seekable and this value isn't zero, this function will report + * success but the track will stop at the point it should loop. Default 0. + * - `MIX_PROP_PLAY_MAX_FRAME_NUMBER`: Mix at most to this sample frame + * position in the track. This will be treated as if the input reach EOF at + * this point in the audio file. If -1, mix all available audio without a + * limit. Default -1. + * - `MIX_PROP_PLAY_MAX_MILLISECONDS_NUMBER`: The same as using the + * MIX_PROP_PLAY_MAX_FRAME_NUMBER property, but the value is specified in + * milliseconds instead of sample frames. If both properties are specified, + * the sample frames value is favored. Default -1. + * - `MIX_PROP_PLAY_START_FRAME_NUMBER`: Start mixing from this sample frame + * position in the track's input. A value <= 0 will begin from the start of + * the track's input. If the input is not seekable and this value is > 0, + * this function will report failure. Default 0. + * - `MIX_PROP_PLAY_START_MILLISECOND_NUMBER`: The same as using the + * MIX_PROP_PLAY_START_FRAME_NUMBER property, but the value is specified in + * milliseconds instead of sample frames. If both properties are specified, + * the sample frames value is favored. Default 0. + * - `MIX_PROP_PLAY_LOOP_START_FRAME_NUMBER`: If the track is looping, this is + * the sample frame position that the track will loop back to; this lets one + * play an intro at the start of a track on the first iteration, but have a + * loop point somewhere in the middle thereafter. A value <= 0 will begin + * the loop from the start of the track's input. Default 0. + * - `MIX_PROP_PLAY_LOOP_START_MILLISECOND_NUMBER`: The same as using the + * MIX_PROP_PLAY_LOOP_START_FRAME_NUMBER property, but the value is + * specified in milliseconds instead of sample frames. If both properties + * are specified, the sample frames value is favored. Default 0. + * - `MIX_PROP_PLAY_FADE_IN_FRAMES_NUMBER`: The number of sample frames over + * which to fade in the newly-started track. The track will begin mixing + * silence and reach full volume smoothly over this many sample frames. If + * the track loops before the fade-in is complete, it will continue to fade + * correctly from the loop point. A value <= 0 will disable fade-in, so the + * track starts mixing at full volume. Default 0. + * - `MIX_PROP_PLAY_FADE_IN_MILLISECONDS_NUMBER`: The same as using the + * MIX_PROP_PLAY_FADE_IN_FRAMES_NUMBER property, but the value is specified + * in milliseconds instead of sample frames. If both properties are + * specified, the sample frames value is favored. Default 0. + * - `MIX_PROP_PLAY_FADE_IN_START_GAIN_FLOAT`: If fading in, start fading from + * this volume level. 0.0f is silence and 1.0f is full volume, every in + * between is a linear change in gain. The specified value will be clamped + * between 0.0f and 1.0f. Default 0.0f. + * - `MIX_PROP_PLAY_APPEND_SILENCE_FRAMES_NUMBER`: At the end of mixing this + * track, after all loops are complete, append this many sample frames of + * silence as if it were part of the audio file. This allows for apps to + * implement effects in callbacks, like reverb, that need to generate + * samples past the end of the stream's audio, or perhaps introduce a delay + * before starting a new sound on the track without having to manage it + * directly. A value <= 0 generates no silence before stopping the track. + * Default 0. + * - `MIX_PROP_PLAY_APPEND_SILENCE_MILLISECONDS_NUMBER`: The same as using the + * MIX_PROP_PLAY_APPEND_SILENCE_FRAMES_NUMBER property, but the value is + * specified in milliseconds instead of sample frames. If both properties + * are specified, the sample frames value is favored. Default 0. + * - `MIX_PROP_PLAY_HALT_WHEN_EXHAUSTED_BOOLEAN`: If true, when input is + * completely consumed for the track, the mixer will mark the track as + * stopped (and call any appropriate MIX_TrackStoppedCallback, etc); to play + * more, the track will need to be restarted. If false, the track will just + * not contribute to the mix, but it will not be marked as stopped. There + * may be clever logic tricks this exposes generally, but this property is + * specifically useful when the track's input is an SDL_AudioStream assigned + * via MIX_SetTrackAudioStream(). Setting this property to true can be + * useful when pushing a complete piece of audio to the stream that has a + * definite ending, as the track will operate like any other audio was + * applied. Setting to false means as new data is added to the stream, the + * mixer will start using it as soon as possible, which is useful when audio + * should play immediately as it drips in: new VoIP packets, etc. Note that + * in this situation, if the audio runs out when needed, there _will_ be + * gaps in the mixed output, so try to buffer enough data to avoid this when + * possible. Note that a track is not consider exhausted until all its loops + * and appended silence have been mixed (and also, that loops don't mean + * anything when the input is an AudioStream). Default true. + * + * If this function fails, mixing of this track will not start (or restart, if + * it was already started). + * + * \param track the track to start (or restart) mixing. + * \param options a set of properties that control playback. May be zero. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTag + * \sa MIX_PlayAudio + * \sa MIX_StopTrack + * \sa MIX_PauseTrack + * \sa MIX_TrackPlaying + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PlayTrack(MIX_Track *track, SDL_PropertiesID options); + +#define MIX_PROP_PLAY_LOOPS_NUMBER "SDL_mixer.play.loops" +#define MIX_PROP_PLAY_MAX_FRAME_NUMBER "SDL_mixer.play.max_frame" +#define MIX_PROP_PLAY_MAX_MILLISECONDS_NUMBER "SDL_mixer.play.max_milliseconds" +#define MIX_PROP_PLAY_START_FRAME_NUMBER "SDL_mixer.play.start_frame" +#define MIX_PROP_PLAY_START_MILLISECOND_NUMBER "SDL_mixer.play.start_millisecond" +#define MIX_PROP_PLAY_LOOP_START_FRAME_NUMBER "SDL_mixer.play.loop_start_frame" +#define MIX_PROP_PLAY_LOOP_START_MILLISECOND_NUMBER "SDL_mixer.play.loop_start_millisecond" +#define MIX_PROP_PLAY_FADE_IN_FRAMES_NUMBER "SDL_mixer.play.fade_in_frames" +#define MIX_PROP_PLAY_FADE_IN_MILLISECONDS_NUMBER "SDL_mixer.play.fade_in_milliseconds" +#define MIX_PROP_PLAY_FADE_IN_START_GAIN_FLOAT "SDL_mixer.play.fade_in_start_gain" +#define MIX_PROP_PLAY_APPEND_SILENCE_FRAMES_NUMBER "SDL_mixer.play.append_silence_frames" +#define MIX_PROP_PLAY_APPEND_SILENCE_MILLISECONDS_NUMBER "SDL_mixer.play.append_silence_milliseconds" +#define MIX_PROP_PLAY_HALT_WHEN_EXHAUSTED_BOOLEAN "SDL_mixer.play.halt_when_exhausted" + +/** + * Start (or restart) mixing all tracks with a specific tag for playback. + * + * This function follows all the same rules as MIX_PlayTrack(); please refer + * to its documentation for the details. Unlike that function, MIX_PlayTag() + * operates on multiple tracks at once that have the specified tag applied, + * via MIX_TagTrack(). + * + * If all of your tagged tracks have different sample rates, it would make + * sense to use the `*_MILLISECONDS_NUMBER` properties in your `options`, + * instead of `*_FRAMES_NUMBER`, and let SDL_mixer figure out how to apply it + * to each track. + * + * This function returns true if all tagged tracks are started (or restarted). + * If any track fails, this function returns false, but all tracks that could + * start will still be started even when this function reports failure. + * + * From the point of view of the mixing process, all tracks that successfully + * (re)start will do so at the exact same moment. + * + * \param mixer the mixer on which to look for tagged tracks. + * \param tag the tag to use when searching for tracks. + * \param options the set of options that will be applied to each track. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTrack + * \sa MIX_TagTrack + * \sa MIX_StopTrack + * \sa MIX_PauseTrack + * \sa MIX_TrackPlaying + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PlayTag(MIX_Mixer *mixer, const char *tag, SDL_PropertiesID options); + +/** + * Play a MIX_Audio from start to finish without any management. + * + * This is what we term a "fire-and-forget" sound. Internally, SDL_mixer will + * manage a temporary track to mix the specified MIX_Audio, cleaning it up + * when complete. No options can be provided for how to do the mixing, like + * MIX_PlayTrack() offers, and since the track is not available to the caller, + * no adjustments can be made to mixing over time. + * + * This is not the function to build an entire game of any complexity around, + * but it can be convenient to play simple, one-off sounds that can't be + * stopped early. An example would be a voice saying "GAME OVER" during an + * unpausable endgame sequence. + * + * There are no limits to the number of fire-and-forget sounds that can mix at + * once (short of running out of memory), and SDL_mixer keeps an internal pool + * of temporary tracks it creates as needed and reuses when available. + * + * \param mixer the mixer on which to play this audio. + * \param audio the audio input to play. + * \returns true if the track has begun mixing, false on error; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTrack + * \sa MIX_LoadAudio + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PlayAudio(MIX_Mixer *mixer, MIX_Audio *audio); + +/** + * Halt a currently-playing track, possibly fading out over time. + * + * If `fade_out_frames` is > 0, the track does not stop mixing immediately, + * but rather fades to silence over that many sample frames before stopping. + * Sample frames are specific to the input assigned to the track, to allow for + * sample-perfect mixing. MIX_TrackMSToFrames() can be used to convert + * milliseconds to an appropriate value here. + * + * If the track ends normally while the fade-out is still in progress, the + * audio stops there; the fade is not adjusted to be shorter if it will last + * longer than the audio remaining. + * + * Once a track has completed any fadeout and come to a stop, it will call its + * MIX_TrackStoppedCallback, if any. It is legal to assign the track a new + * input and/or restart it during this callback. + * + * It is legal to halt a track that's already stopped. It does nothing, and + * returns true. + * + * \param track the track to halt. + * \param fade_out_frames the number of sample frames to spend fading out to + * silence before halting. 0 to stop immediately. + * \returns true if the track has stopped, false on error; call SDL_GetError() + * for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_StopTrack(MIX_Track *track, Sint64 fade_out_frames); + +/** + * Halt all currently-playing tracks, possibly fading out over time. + * + * If `fade_out_ms` is > 0, the tracks do not stop mixing immediately, but + * rather fades to silence over that many milliseconds before stopping. Note + * that this is different than MIX_StopTrack(), which wants sample frames; + * this function takes milliseconds because different tracks might have + * different sample rates. + * + * If a track ends normally while the fade-out is still in progress, the audio + * stops there; the fade is not adjusted to be shorter if it will last longer + * than the audio remaining. + * + * Once a track has completed any fadeout and come to a stop, it will call its + * MIX_TrackStoppedCallback, if any. It is legal to assign the track a new + * input and/or restart it during this callback. This function does not + * prevent new play requests from being made. + * + * \param mixer the mixer on which to stop all tracks. + * \param fade_out_ms the number of milliseconds to spend fading out to + * silence before halting. 0 to stop immediately. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_StopTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_StopAllTracks(MIX_Mixer *mixer, Sint64 fade_out_ms); + +/** + * Halt all tracks with a specific tag, possibly fading out over time. + * + * If `fade_out_ms` is > 0, the tracks do not stop mixing immediately, but + * rather fades to silence over that many milliseconds before stopping. Note + * that this is different than MIX_StopTrack(), which wants sample frames; + * this function takes milliseconds because different tracks might have + * different sample rates. + * + * If a track ends normally while the fade-out is still in progress, the audio + * stops there; the fade is not adjusted to be shorter if it will last longer + * than the audio remaining. + * + * Once a track has completed any fadeout and come to a stop, it will call its + * MIX_TrackStoppedCallback, if any. It is legal to assign the track a new + * input and/or restart it during this callback. This function does not + * prevent new play requests from being made. + * + * \param mixer the mixer on which to stop tracks. + * \param tag the tag to use when searching for tracks. + * \param fade_out_ms the number of milliseconds to spend fading out to + * silence before halting. 0 to stop immediately. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_StopTrack + * \sa MIX_TagTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_StopTag(MIX_Mixer *mixer, const char *tag, Sint64 fade_out_ms); + +/** + * Pause a currently-playing track. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * It is legal to pause a track that's in any state (playing, already paused, + * or stopped). Unless the track is currently playing, pausing does nothing, + * and returns true. A false return is only used to signal errors here (such + * as MIX_Init not being called or `track` being NULL). + * + * \param track the track to pause. + * \returns true if the track has paused, false on error; call SDL_GetError() + * for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_ResumeTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PauseTrack(MIX_Track *track); + +/** + * Pause all currently-playing tracks. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * This function makes all tracks on the specified mixer that are currently + * playing move to a paused state. They can later be resumed. + * + * \param mixer the mixer on which to pause all tracks. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_ResumeTrack + * \sa MIX_ResumeAllTracks + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PauseAllTracks(MIX_Mixer *mixer); + +/** + * Pause all tracks with a specific tag. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * This function makes all currently-playing tracks on the specified mixer, + * with a specific tag, move to a paused state. They can later be resumed. + * + * Tracks that match the specified tag that aren't currently playing are + * ignored. + * + * \param mixer the mixer on which to pause tracks. + * \param tag the tag to use when searching for tracks. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PauseTrack + * \sa MIX_ResumeTrack + * \sa MIX_ResumeTag + * \sa MIX_TagTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PauseTag(MIX_Mixer *mixer, const char *tag); + +/** + * Resume a currently-paused track. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * It is legal to resume a track that's in any state (playing, paused, or + * stopped). Unless the track is currently paused, resuming does nothing, and + * returns true. A false return is only used to signal errors here (such as + * MIX_Init not being called or `track` being NULL). + * + * \param track the track to resume. + * \returns true if the track has resumed, false on error; call SDL_GetError() + * for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PauseTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_ResumeTrack(MIX_Track *track); + +/** + * Resume all currently-paused tracks. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * This function makes all tracks on the specified mixer that are currently + * paused move to a playing state. + * + * \param mixer the mixer on which to resume all tracks. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PauseTrack + * \sa MIX_PauseAllTracks + */ +extern SDL_DECLSPEC bool SDLCALL MIX_ResumeAllTracks(MIX_Mixer *mixer); + +/** + * Resume all tracks with a specific tag. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * This function makes all currently-paused tracks on the specified mixer, + * with a specific tag, move to a playing state. + * + * Tracks that match the specified tag that aren't currently paused are + * ignored. + * + * \param mixer the mixer on which to resume tracks. + * \param tag the tag to use when searching for tracks. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_ResumeTrack + * \sa MIX_PauseTrack + * \sa MIX_PauseTag + * \sa MIX_TagTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_ResumeTag(MIX_Mixer *mixer, const char *tag); + +/** + * Query if a track is currently playing. + * + * If this returns true, the track is currently contributing to the mixer's + * output (it's "playing"). It is not stopped nor paused. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns false, but there is no mechanism to distinguish errors from + * non-playing tracks. + * + * \param track the track to query. + * \returns true if playing, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTrack + * \sa MIX_PauseTrack + * \sa MIX_ResumeTrack + * \sa MIX_StopTrack + * \sa MIX_TrackPaused + */ +extern SDL_DECLSPEC bool SDLCALL MIX_TrackPlaying(MIX_Track *track); + +/** + * Query if a track is currently paused. + * + * If this returns true, the track is not currently contributing to the + * mixer's output but will when resumed (it's "paused"). It is not playing nor + * stopped. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns false, but there is no mechanism to distinguish errors from + * non-playing tracks. + * + * \param track the track to query. + * \returns true if paused, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTrack + * \sa MIX_PauseTrack + * \sa MIX_ResumeTrack + * \sa MIX_StopTrack + * \sa MIX_TrackPlaying + */ +extern SDL_DECLSPEC bool SDLCALL MIX_TrackPaused(MIX_Track *track); + + +/* volume control... */ + +/** + * Set a mixer's master gain control. + * + * Each mixer has a master gain, to adjust the volume of the entire mix. Each + * sample passing through the pipeline is modulated by this gain value. A gain + * of zero will generate silence, 1.0f will not change the mixed volume, and + * larger than 1.0f will increase the volume. Negative values are illegal. + * There is no maximum gain specified, but this can quickly get extremely + * loud, so please be careful with this setting. + * + * A mixer's master gain defaults to 1.0f. + * + * This value can be changed at any time to adjust the future mix. + * + * \param mixer the mixer to adjust. + * \param gain the new gain value. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetMixerGain + * \sa MIX_SetTrackGain + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetMixerGain(MIX_Mixer *mixer, float gain); + +/** + * Get a mixer's master gain control. + * + * This returns the last value set through MIX_SetMixerGain(), or 1.0f if no + * value has ever been explicitly set. + * + * \param mixer the mixer to query. + * \returns the mixer's current master gain. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetMixerGain + * \sa MIX_GetTrackGain + */ +extern SDL_DECLSPEC float SDLCALL MIX_GetMixerGain(MIX_Mixer *mixer); + +/** + * Set a track's gain control. + * + * Each track has its own gain, to adjust its overall volume. Each sample from + * this track is modulated by this gain value. A gain of zero will generate + * silence, 1.0f will not change the mixed volume, and larger than 1.0f will + * increase the volume. Negative values are illegal. There is no maximum gain + * specified, but this can quickly get extremely loud, so please be careful + * with this setting. + * + * A track's gain defaults to 1.0f. + * + * This value can be changed at any time to adjust the future mix. + * + * \param track the track to adjust. + * \param gain the new gain value. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackGain + * \sa MIX_SetMixerGain + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackGain(MIX_Track *track, float gain); + +/** + * Get a track's gain control. + * + * This returns the last value set through MIX_SetTrackGain(), or 1.0f if no + * value has ever been explicitly set. + * + * \param track the track to query. + * \returns the track's current gain. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackGain + * \sa MIX_GetMixerGain + */ +extern SDL_DECLSPEC float SDLCALL MIX_GetTrackGain(MIX_Track *track); + +/** + * Set the gain control of all tracks with a specific tag. + * + * Each track has its own gain, to adjust its overall volume. Each sample from + * this track is modulated by this gain value. A gain of zero will generate + * silence, 1.0f will not change the mixed volume, and larger than 1.0f will + * increase the volume. Negative values are illegal. There is no maximum gain + * specified, but this can quickly get extremely loud, so please be careful + * with this setting. + * + * A track's gain defaults to 1.0f. + * + * This will change the gain control on tracks on the specified mixer that + * have the specified tag. + * + * From the point of view of the mixing process, all tracks that successfully + * change gain values will do so at the exact same moment. + * + * This value can be changed at any time to adjust the future mix. + * + * \param mixer the mixer on which to look for tagged tracks. + * \param tag the tag to use when searching for tracks. + * \param gain the new gain value. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackGain + * \sa MIX_SetTrackGain + * \sa MIX_SetMixerGain + * \sa MIX_TagTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTagGain(MIX_Mixer *mixer, const char *tag, float gain); + + +/* frequency ratio ... */ + +/** + * Set a mixer's master frequency ratio. + * + * Each mixer has a master frequency ratio, that affects the entire mix. This + * can cause the final output to change speed and pitch. A value greater than + * 1.0f will play the audio faster, and at a higher pitch. A value less than + * 1.0f will play the audio slower, and at a lower pitch. 1.0f is normal + * speed. + * + * Each track _also_ has a frequency ratio; it will be applied when mixing + * that track's audio regardless of the master setting. The master setting + * affects the final output after all mixing has been completed. + * + * A mixer's master frequency ratio defaults to 1.0f. + * + * This value can be changed at any time to adjust the future mix. + * + * \param mixer the mixer to adjust. + * \param ratio the frequency ratio. Must be between 0.01f and 100.0f. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetMixerFrequencyRatio + * \sa MIX_SetTrackFrequencyRatio + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetMixerFrequencyRatio(MIX_Mixer *mixer, float ratio); + +/** + * Get a mixer's master frequency ratio. + * + * This returns the last value set through MIX_SetMixerFrequencyRatio(), or + * 1.0f if no value has ever been explicitly set. + * + * \param mixer the mixer to query. + * \returns the mixer's current master frequency ratio. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetMixerFrequencyRatio + * \sa MIX_GetTrackFrequencyRatio + */ +extern SDL_DECLSPEC float SDLCALL MIX_GetMixerFrequencyRatio(MIX_Mixer *mixer); + + +/** + * Change the frequency ratio of a track. + * + * The frequency ratio is used to adjust the rate at which audio data is + * consumed. Changing this effectively modifies the speed and pitch of the + * track's audio. A value greater than 1.0f will play the audio faster, and at + * a higher pitch. A value less than 1.0f will play the audio slower, and at a + * lower pitch. 1.0f is normal speed. + * + * The default value is 1.0f. + * + * This value can be changed at any time to adjust the future mix. + * + * \param track the track on which to change the frequency ratio. + * \param ratio the frequency ratio. Must be between 0.01f and 100.0f. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackFrequencyRatio + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackFrequencyRatio(MIX_Track *track, float ratio); + +/** + * Query the frequency ratio of a track. + * + * The frequency ratio is used to adjust the rate at which audio data is + * consumed. Changing this effectively modifies the speed and pitch of the + * track's audio. A value greater than 1.0f will play the audio faster, and at + * a higher pitch. A value less than 1.0f will play the audio slower, and at a + * lower pitch. 1.0f is normal speed. + * + * The default value is 1.0f. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns 0.0f. Since this is not a valid value to set, this can be seen as + * an error state. + * + * \param track the track on which to query the frequency ratio. + * \returns the current frequency ratio, or 0.0f on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackFrequencyRatio + */ +extern SDL_DECLSPEC float SDLCALL MIX_GetTrackFrequencyRatio(MIX_Track *track); + + +/* channel maps... */ + +/** + * Set the current output channel map of a track. + * + * Channel maps are optional; most things do not need them, instead passing + * data in the order that SDL expects. + * + * The output channel map reorders track data after transformations and before + * it is mixed into a mixer group. This can be useful for reversing stereo + * channels, for example. + * + * Each item in the array represents an input channel, and its value is the + * channel that it should be remapped to. To reverse a stereo signal's left + * and right values, you'd have an array of `{ 1, 0 }`. It is legal to remap + * multiple channels to the same thing, so `{ 1, 1 }` would duplicate the + * right channel to both channels of a stereo signal. An element in the + * channel map set to -1 instead of a valid channel will mute that channel, + * setting it to a silence value. + * + * You cannot change the number of channels through a channel map, just + * reorder/mute them. + * + * Tracks default to no remapping applied. Passing a NULL channel map is + * legal, and turns off remapping. + * + * SDL_mixer will copy the channel map; the caller does not have to save this + * array after this call. + * + * \param track the track to change. + * \param chmap the new channel map, NULL to reset to default. + * \param count The number of channels in the map. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackOutputChannelMap(MIX_Track *track, const int *chmap, int count); + + +/* positional audio... */ + +/** + * A set of per-channel gains for tracks using MIX_SetTrackStereo(). + * + * When forcing a track to stereo, the app can specify a per-channel gain, to + * further adjust the left or right outputs. + * + * When mixing audio that has been forced to stereo, each channel is modulated + * by these values. A value of 1.0f produces no change, 0.0f produces silence. + * + * A simple panning effect would be to set `left` to the desired value and + * `right` to `1.0f - left`. + * + * \since This struct is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackStereo + */ +typedef struct MIX_StereoGains +{ + float left; /**< left channel gain */ + float right; /**< right channel gain */ +} MIX_StereoGains; + +/** + * Force a track to stereo output, with optionally left/right panning. + * + * This will cause the output of the track to convert to stereo, and then mix + * it only onto the Front Left and Front Right speakers, regardless of the + * speaker configuration. The left and right channels are modulated by + * `gains`, which can be used to produce panning effects. This function may be + * called to adjust the gains at any time. + * + * If `gains` is not NULL, this track will be switched into forced-stereo + * mode. If `gains` is NULL, this will disable spatialization (both the + * forced-stereo mode of this function and full 3D spatialization of + * MIX_SetTrack3DPosition()). + * + * Negative gains are clamped to zero; there is no clamp for maximum, so one + * could set the value > 1.0f to make a channel louder. + * + * The track's 3D position, reported by MIX_GetTrack3DPosition(), will be + * reset to (0, 0, 0). + * + * \param track the track to adjust. + * \param gains the per-channel gains, or NULL to disable spatialization. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrack3DPosition + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackStereo(MIX_Track *track, const MIX_StereoGains *gains); + + +/** + * 3D coordinates for MIX_SetTrack3DPosition. + * + * The coordinates use a "right-handed" coordinate system, like OpenGL and + * OpenAL. + * + * \since This struct is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrack3DPosition + */ +typedef struct MIX_Point3D +{ + float x; /**< X coordinate (negative left, positive right). */ + float y; /**< Y coordinate (negative down, positive up). */ + float z; /**< Z coordinate (negative forward, positive back). */ +} MIX_Point3D; + +/** + * Set a track's position in 3D space. + * + * (Please note that SDL_mixer is not intended to be a extremely powerful 3D + * API. It lacks 3D features that other APIs like OpenAL offer: there's no + * doppler effect, distance models, rolloff, etc. This is meant to be Good + * Enough for games that can use some positional sounds and can even take + * advantage of surround-sound configurations.) + * + * If `position` is not NULL, this track will be switched into 3D positional + * mode. If `position` is NULL, this will disable positional mixing (both the + * full 3D spatialization of this function and forced-stereo mode of + * MIX_SetTrackStereo()). + * + * In 3D positional mode, SDL_mixer will mix this track as if it were + * positioned in 3D space, including distance attenuation (quieter as it gets + * further from the listener) and spatialization (positioned on the correct + * speakers to suggest direction, either with stereo outputs or full surround + * sound). + * + * For a mono speaker output, spatialization is effectively disabled but + * distance attenuation will still work, which is all you can really do with a + * single speaker. + * + * The coordinate system operates like OpenGL or OpenAL: a "right-handed" + * coordinate system. See MIX_Point3D for the details. + * + * The listener is always at coordinate (0,0,0) and can't be changed. + * + * The track's input will be converted to mono (1 channel) so it can be + * rendered across the correct speakers. + * + * \param track the track for which to set 3D position. + * \param position the new 3D position for the track. May be NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrack3DPosition + * \sa MIX_SetTrackStereo + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrack3DPosition(MIX_Track *track, const MIX_Point3D *position); + +/** + * Get a track's current position in 3D space. + * + * If 3D positioning isn't enabled for this track, through a call to + * MIX_SetTrack3DPosition(), this will return (0,0,0). + * + * \param track the track to query. + * \param position on successful return, will contain the track's position. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrack3DPosition + */ +extern SDL_DECLSPEC bool SDLCALL MIX_GetTrack3DPosition(MIX_Track *track, MIX_Point3D *position); + + +/* Mix groups... */ + +/** + * Create a mixing group. + * + * Tracks are assigned to a mixing group (or if unassigned, they live in a + * mixer's internal default group). All tracks in a group are mixed together + * and the app can access this mixed data before it is mixed with all other + * groups to produce the final output. + * + * This can be a useful feature, but is completely optional; apps can ignore + * mixing groups entirely and still have a full experience with SDL_mixer. + * + * After creating a group, assign tracks to it with MIX_SetTrackGroup(). Use + * MIX_SetGroupPostMixCallback() to access the group's mixed data. + * + * A mixing group can be destroyed with MIX_DestroyGroup() when no longer + * needed. Destroying the mixer will also destroy all its still-existing + * mixing groups. + * + * \param mixer the mixer on which to create a mixing group. + * \returns a newly-created mixing group, or NULL on error; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyGroup + * \sa MIX_SetTrackGroup + * \sa MIX_SetGroupPostMixCallback + */ +extern SDL_DECLSPEC MIX_Group * SDLCALL MIX_CreateGroup(MIX_Mixer *mixer); + +/** + * Destroy a mixing group. + * + * Any tracks currently assigned to this group will be reassigned to the + * mixer's internal default group. + * + * \param group the mixing group to destroy. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateGroup + */ +extern SDL_DECLSPEC void SDLCALL MIX_DestroyGroup(MIX_Group *group); + +/** + * Get the properties associated with a group. + * + * Currently SDL_mixer assigns no properties of its own to a group, but this + * can be a convenient place to store app-specific data. + * + * A SDL_PropertiesID is created the first time this function is called for a + * given group. + * + * \param group the group to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL MIX_GetGroupProperties(MIX_Group *group); + +/** + * Get the MIX_Mixer that owns a MIX_Group. + * + * This is the mixer pointer that was passed to MIX_CreateGroup(). + * + * \param group the group to query. + * \returns the mixer associated with the group, or NULL on error; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC MIX_Mixer * SDLCALL MIX_GetGroupMixer(MIX_Group *group); + +/** + * Assign a track to a mixing group. + * + * All tracks in a group are mixed together, and that output is made available + * to the app before it is mixed into the final output. + * + * Tracks can only be in one group at a time, and the track and group must + * have been created on the same MIX_Mixer. + * + * Setting a track to a NULL group will remove it from any app-created groups, + * and reassign it to the mixer's internal default group. + * + * \param track the track to set mixing group assignment. + * \param group the new mixing group to assign to. May be NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateGroup + * \sa MIX_SetGroupPostMixCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackGroup(MIX_Track *track, MIX_Group *group); + + + +/* Hooks... */ + +/** + * A callback that fires when a MIX_Track is stopped. + * + * This callback is fired when a track completes playback, either because it + * ran out of data to mix (and all loops were completed as well), or it was + * explicitly stopped by the app. Pausing a track will not fire this callback. + * + * It is legal to adjust the track, including changing its input and + * restarting it. If this is done because it ran out of data in the middle of + * mixing, the mixer will start mixing the new track state in its current run + * without any gap in the audio. + * + * This callback will not fire when a playing track is destroyed. + * + * \param userdata an opaque pointer provided by the app for its personal use. + * \param track the track that has stopped. + * + * \since This datatype is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackStoppedCallback + */ +typedef void (SDLCALL *MIX_TrackStoppedCallback)(void *userdata, MIX_Track *track); + +/** + * Set a callback that fires when a MIX_Track is stopped. + * + * When a track completes playback, either because it ran out of data to mix + * (and all loops were completed as well), or it was explicitly stopped by the + * app, it will fire the callback specified here. + * + * Each track has its own unique callback. + * + * Passing a NULL callback here is legal; it disables this track's callback. + * + * Pausing a track will not fire the callback, nor will the callback fire on a + * playing track that is being destroyed. + * + * It is legal to adjust the track, including changing its input and + * restarting it. If this is done because it ran out of data in the middle of + * mixing, the mixer will start mixing the new track state in its current run + * without any gap in the audio. + * + * \param track the track to assign this callback to. + * \param cb the function to call when the track stops. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TrackStoppedCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackStoppedCallback(MIX_Track *track, MIX_TrackStoppedCallback cb, void *userdata); + +/** + * A callback that fires when a MIX_Track is mixing at various stages. + * + * This callback is fired for different parts of the mixing pipeline, and + * gives the app visbility into the audio data that is being generated at + * various stages. + * + * The audio data passed through here is _not_ const data; the app is + * permitted to change it in any way it likes, and those changes will + * propagate through the mixing pipeline. + * + * An audiospec is provided. Different tracks might be in different formats, + * and an app needs to be able to handle that, but SDL_mixer always does its + * mixing work in 32-bit float samples, even if the inputs or final output are + * not floating point. As such, `spec->format` will always be `SDL_AUDIO_F32` + * and `pcm` hardcoded to be a float pointer. + * + * `samples` is the number of float values pointed to by `pcm`: samples, not + * sample frames! There are no promises how many samples will be provided + * per-callback, and this number can vary wildly from call to call, depending + * on many factors. + * + * Making changes to the track during this callback is undefined behavior. + * Change the data in `pcm` but not the track itself. + * + * \param userdata an opaque pointer provided by the app for its personal use. + * \param track the track that is being mixed. + * \param spec the format of the data in `pcm`. + * \param pcm the raw PCM data in float32 format. + * \param samples the number of float values pointed to by `pcm`. + * + * \since This datatype is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackRawCallback + * \sa MIX_SetTrackCookedCallback + */ +typedef void (SDLCALL *MIX_TrackMixCallback)(void *userdata, MIX_Track *track, const SDL_AudioSpec *spec, float *pcm, int samples); + +/** + * Set a callback that fires when a MIX_Track has initial decoded audio. + * + * As a track needs to mix more data, it pulls from its input (a MIX_Audio, an + * SDL_AudioStream, etc). This input might be a compressed file format, like + * MP3, so a little more data is uncompressed from it. + * + * Once the track has PCM data to start operating on, it can fire a callback + * before _any_ changes to the raw PCM input have happened. This lets an app + * view the data before it has gone through transformations such as gain, 3D + * positioning, fading, etc. It can also change the data in any way it pleases + * during this callback, and the mixer will continue as if this data came + * directly from the input. + * + * Each track has its own unique raw callback. + * + * Passing a NULL callback here is legal; it disables this track's callback. + * + * \param track the track to assign this callback to. + * \param cb the function to call when the track mixes. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TrackMixCallback + * \sa MIX_SetTrackCookedCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackRawCallback(MIX_Track *track, MIX_TrackMixCallback cb, void *userdata); + +/** + * Set a callback that fires when the mixer has transformed a track's audio. + * + * As a track needs to mix more data, it pulls from its input (a MIX_Audio, an + * SDL_AudioStream, etc). This input might be a compressed file format, like + * MP3, so a little more data is uncompressed from it. + * + * Once the track has PCM data to start operating on, and its raw callback has + * completed, it will begin to transform the audio: gain, fading, frequency + * ratio, 3D positioning, etc. + * + * A callback can be fired after all these transformations, but before the + * transformed data is mixed into other tracks. This lets an app view the data + * at the last moment that it is still a part of this track. It can also + * change the data in any way it pleases during this callback, and the mixer + * will continue as if this data came directly from the input. + * + * Each track has its own unique cooked callback. + * + * Passing a NULL callback here is legal; it disables this track's callback. + * + * \param track the track to assign this callback to. + * \param cb the function to call when the track mixes. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TrackMixCallback + * \sa MIX_SetTrackRawCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackCookedCallback(MIX_Track *track, MIX_TrackMixCallback cb, void *userdata); + +/** + * A callback that fires when a MIX_Group has completed mixing. + * + * This callback is fired when a mixing group has finished mixing: all tracks + * in the group have mixed into a single buffer and are prepared to be mixed + * into all other groups for the final mix output. + * + * The audio data passed through here is _not_ const data; the app is + * permitted to change it in any way it likes, and those changes will + * propagate through the mixing pipeline. + * + * An audiospec is provided. Different groups might be in different formats, + * and an app needs to be able to handle that, but SDL_mixer always does its + * mixing work in 32-bit float samples, even if the inputs or final output are + * not floating point. As such, `spec->format` will always be `SDL_AUDIO_F32` + * and `pcm` hardcoded to be a float pointer. + * + * `samples` is the number of float values pointed to by `pcm`: samples, not + * sample frames! There are no promises how many samples will be provided + * per-callback, and this number can vary wildly from call to call, depending + * on many factors. + * + * \param userdata an opaque pointer provided by the app for its personal use. + * \param group the group that is being mixed. + * \param spec the format of the data in `pcm`. + * \param pcm the raw PCM data in float32 format. + * \param samples the number of float values pointed to by `pcm`. + * + * \since This datatype is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetGroupPostMixCallback + */ +typedef void (SDLCALL *MIX_GroupMixCallback)(void *userdata, MIX_Group *group, const SDL_AudioSpec *spec, float *pcm, int samples); + +/** + * Set a callback that fires when a mixer group has completed mixing. + * + * After all playing tracks in a mixer group have pulled in more data from + * their inputs, transformed it, and mixed together into a single buffer, a + * callback can be fired. This lets an app view the data at the last moment + * that it is still a part of this group. It can also change the data in any + * way it pleases during this callback, and the mixer will continue as if this + * data came directly from the group's mix buffer. + * + * Each group has its own unique callback. Tracks that aren't in an explicit + * MIX_Group are mixed in an internal grouping that is not available to the + * app. + * + * Passing a NULL callback here is legal; it disables this group's callback. + * + * \param group the mixing group to assign this callback to. + * \param cb the function to call when the group mixes. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GroupMixCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetGroupPostMixCallback(MIX_Group *group, MIX_GroupMixCallback cb, void *userdata); + +/** + * A callback that fires when all mixing has completed. + * + * This callback is fired when the mixer has completed all its work. If this + * mixer was created with MIX_CreateMixerDevice(), the data provided by this + * callback is what is being sent to the audio hardware, minus last + * conversions for format requirements. If this mixer was created with + * MIX_CreateMixer(), this is what is being output from MIX_Generate(), after + * final conversions. + * + * The audio data passed through here is _not_ const data; the app is + * permitted to change it in any way it likes, and those changes will replace + * the final mixer pipeline output. + * + * An audiospec is provided. SDL_mixer always does its mixing work in 32-bit + * float samples, even if the inputs or final output are not floating point. + * As such, `spec->format` will always be `SDL_AUDIO_F32` and `pcm` hardcoded + * to be a float pointer. + * + * `samples` is the number of float values pointed to by `pcm`: samples, not + * sample frames! There are no promises how many samples will be provided + * per-callback, and this number can vary wildly from call to call, depending + * on many factors. + * + * \param userdata an opaque pointer provided by the app for its personal use. + * \param mixer the mixer that is generating audio. + * \param spec the format of the data in `pcm`. + * \param pcm the raw PCM data in float32 format. + * \param samples the number of float values pointed to by `pcm`. + * + * \since This datatype is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetPostMixCallback + */ +typedef void (SDLCALL *MIX_PostMixCallback)(void *userdata, MIX_Mixer *mixer, const SDL_AudioSpec *spec, float *pcm, int samples); + +/** + * Set a callback that fires when all mixing has completed. + * + * After all mixer groups have processed, their buffers are mixed together + * into a single buffer for the final output, at which point a callback can be + * fired. This lets an app view the data at the last moment before mixing + * completes. It can also change the data in any way it pleases during this + * callback, and the mixer will continue as if this data is the final output. + * + * Each mixer has its own unique callback. + * + * Passing a NULL callback here is legal; it disables this mixer's callback. + * + * \param mixer the mixer to assign this callback to. + * \param cb the function to call when the mixer mixes. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PostMixCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetPostMixCallback(MIX_Mixer *mixer, MIX_PostMixCallback cb, void *userdata); + + +/* Audio generation without an audio device... */ + +/** + * Generate mixer output when not driving an audio device. + * + * SDL_mixer allows the creation of MIX_Mixer objects that are not connected + * to an audio device, by calling MIX_CreateMixer() instead of + * MIX_CreateMixerDevice(). Such mixers will not generate output until + * explicitly requested through this function. + * + * The caller may request as much audio as desired, so long as `buflen` is a + * multiple of the sample frame size specified when creating the mixer (for + * example, if requesting stereo Sint16 audio, buflen must be a multiple of 4: + * 2 bytes-per-channel times 2 channels). + * + * The mixer will mix as quickly as possible; since it works in sample frames + * instead of time, it can potentially generate enormous amounts of audio in a + * small amount of time. + * + * On success, this always fills `buffer` with `buflen` bytes of audio; if all + * playing tracks finish mixing, it will fill the remaining buffer with + * silence. + * + * Each call to this function will pick up where it left off, playing tracks + * will continue to mix from the point the previous call completed, etc. The + * mixer state can be changed between each call in any way desired: tracks can + * be added, played, stopped, changed, removed, etc. Effectively this function + * does the same thing SDL_mixer does internally when the audio device needs + * more audio to play. + * + * This function can not be used with mixers from MIX_CreateMixerDevice(); + * those generate audio as needed internally. + * + * This function returns the number of _bytes_ of real audio mixed, which + * might be less than `buflen`. While all `buflen` bytes of `buffer` will be + * initialized, if available tracks to mix run out, the end of the buffer will + * be initialized with silence; this silence will not be counted in the return + * value, so the caller has the option to identify how much of the buffer has + * legimitate contents vs appended silence. As such, any value >= 0 signifies + * success. A return value of -1 means failure (out of memory, invalid + * parameters, etc). + * + * \param mixer the mixer for which to generate more audio. + * \param buffer a pointer to a buffer to store audio in. + * \param buflen the number of bytes to store in buffer. + * \returns The number of bytes of mixed audio, discounting appended silence, + * on success, or -1 on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateMixer + */ +extern SDL_DECLSPEC int SDLCALL MIX_Generate(MIX_Mixer *mixer, void *buffer, int buflen); + + +/* Decode audio files directly without a mixer ... */ + +/** + * An opaque object that represents an audio decoder. + * + * Most apps won't need this, as SDL_mixer's usual interfaces will decode + * audio as needed. However, if one wants to decode an audio file into a + * memory buffer without playing it, this interface offers that. + * + * These objects are created with MIX_CreateAudioDecoder() or + * MIX_CreateAudioDecoder_IO(), and then can use MIX_DecodeAudio() to retrieve + * the raw PCM data. + * + * \since This struct is available since SDL_mixer 3.0.0. + */ +typedef struct MIX_AudioDecoder MIX_AudioDecoder; + +/** + * Create a MIX_AudioDecoder from a path on the filesystem. + * + * Most apps won't need this, as SDL_mixer's usual interfaces will decode + * audio as needed. However, if one wants to decode an audio file into a + * memory buffer without playing it, this interface offers that. + * + * This function allows properties to be specified. This is intended to supply + * file-specific settings, such as where to find SoundFonts for a MIDI file, + * etc. In most cases, the caller should pass a zero to specify no extra + * properties. + * + * SDL_PropertiesID are discussed in + * [SDL's documentation](https://wiki.libsdl.org/SDL3/CategoryProperties) + * . + * + * When done with the audio decoder, it can be destroyed with + * MIX_DestroyAudioDecoder(). + * + * This function requires SDL_mixer to have been initialized with a successful + * call to MIX_Init(), but does not need an actual MIX_Mixer to have been + * created. + * + * \param path the path on the filesystem from which to load data. + * \param props decoder-specific properties. May be zero. + * \returns an audio decoder, ready to decode. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateAudioDecoder_IO + * \sa MIX_DecodeAudio + * \sa MIX_DestroyAudioDecoder + */ +extern SDL_DECLSPEC MIX_AudioDecoder * SDLCALL MIX_CreateAudioDecoder(const char *path, SDL_PropertiesID props); + +/** + * Create a MIX_AudioDecoder from an SDL_IOStream. + * + * Most apps won't need this, as SDL_mixer's usual interfaces will decode + * audio as needed. However, if one wants to decode an audio file into a + * memory buffer without playing it, this interface offers that. + * + * This function allows properties to be specified. This is intended to supply + * file-specific settings, such as where to find SoundFonts for a MIDI file, + * etc. In most cases, the caller should pass a zero to specify no extra + * properties. + * + * If `closeio` is true, then `io` will be closed when this decoder is done + * with it. If this function fails and `closeio` is true, then `io` will be + * closed before this function returns. + * + * When done with the audio decoder, it can be destroyed with + * MIX_DestroyAudioDecoder(). + * + * This function requires SDL_mixer to have been initialized with a successful + * call to MIX_Init(), but does not need an actual MIX_Mixer to have been + * created. + * + * \param io the i/o stream from which to load data. + * \param closeio if true, close the i/o stream when done with it. + * \param props decoder-specific properties. May be zero. + * \returns an audio decoder, ready to decode. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateAudioDecoder_IO + * \sa MIX_DecodeAudio + * \sa MIX_DestroyAudioDecoder + */ +extern SDL_DECLSPEC MIX_AudioDecoder * SDLCALL MIX_CreateAudioDecoder_IO(SDL_IOStream *io, bool closeio, SDL_PropertiesID props); + +/** + * Destroy the specified audio decoder. + * + * Destroying a NULL MIX_AudioDecoder is a legal no-op. + * + * \param audiodecoder the audio to destroy. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC void SDLCALL MIX_DestroyAudioDecoder(MIX_AudioDecoder *audiodecoder); + +/** + * Get the properties associated with a MIX_AudioDecoder. + * + * SDL_mixer offers some properties of its own, but this can also be a + * convenient place to store app-specific data. + * + * A SDL_PropertiesID is created the first time this function is called for a + * given MIX_AudioDecoder, if necessary. + * + * The file-specific metadata exposed through this function is identical to + * those available through MIX_GetAudioProperties(). Please refer to that + * function's documentation for details. + * + * \param audiodecoder the audio decoder to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetAudioProperties + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL MIX_GetAudioDecoderProperties(MIX_AudioDecoder *audiodecoder); + +/** + * Query the initial audio format of a MIX_AudioDecoder. + * + * Note that some audio files can change format in the middle; some explicitly + * support this, but a more common example is two MP3 files concatenated + * together. In many cases, SDL_mixer will correctly handle these sort of + * files, but this function will only report the initial format a file uses. + * + * \param audiodecoder the audio decoder to query. + * \param spec on success, audio format details will be stored here. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_GetAudioDecoderFormat(MIX_AudioDecoder *audiodecoder, SDL_AudioSpec *spec); + +/** + * Decode more audio from a MIX_AudioDecoder. + * + * Data is decoded on demand in whatever format is requested. The format is + * permitted to change between calls. + * + * This function will return the number of bytes decoded, which may be less + * than requested if there was an error or end-of-file. A return value of zero + * means the entire file was decoded, -1 means an unrecoverable error + * happened. + * + * \param audiodecoder the decoder from which to retrieve more data. + * \param buffer the memory buffer to store decoded audio. + * \param buflen the maximum number of bytes to store to `buffer`. + * \param spec the format that audio data will be stored to `buffer`. + * \returns number of bytes decoded, or -1 on error; call SDL_GetError() for + * more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC int SDLCALL MIX_DecodeAudio(MIX_AudioDecoder *audiodecoder, void *buffer, int buflen, const SDL_AudioSpec *spec); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include + +#endif /* SDL_MIXER_H_ */ diff --git a/vendor/sdl3/mixer/sdl3_mixer.odin b/vendor/sdl3/mixer/sdl3_mixer.odin new file mode 100644 index 000000000..36e5ecd1e --- /dev/null +++ b/vendor/sdl3/mixer/sdl3_mixer.odin @@ -0,0 +1,168 @@ +package sdl3_mixer + +import "core:c" + +import SDL "vendor:sdl3" + +when ODIN_OS == .Windows { + foreign import lib "SDL3_mixer.lib" +} else { + foreign import lib "system:SDL3_mixer" +} + +Mixer :: struct {} +Audio :: struct {} +Track :: struct {} +Group :: struct {} + +StereoGains :: struct { + left, right: c.float, +} +Point3D :: struct { + x, y, z: c.float, +} + +TrackStoppedCallback :: #type proc(userdata: rawptr, track: ^Track) +TrackMixCallback :: #type proc(userdata: rawptr, track: ^Track, spec: ^SDL.AudioSpec, pcm: ^c.float, samples: c.int) +GroupMixCallback :: #type proc(userdata: rawptr, group: ^Group, spec: ^SDL.AudioSpec, pcm: ^c.float, samples: c.int) +PostMixCallback :: #type proc( userdata: rawptr, mixer: ^Mixer, spec: ^SDL.AudioSpec, pcm: ^c.float, samples: c.int) + +AudioDecoder :: struct {} + +MAJOR_VERSION :: 3 +MINOR_VERSION :: 2 +MICRO_VERSION :: 0 + +PROP_MIXER_DEVICE_NUMBER :: "SDL_mixer.mixer.device" + +PROP_AUDIO_LOAD_IOSTREAM_POINTER :: "SDL_mixer.audio.load.iostream" +PROP_AUDIO_LOAD_CLOSEIO_BOOLEAN :: "SDL_mixer.audio.load.closeio" +PROP_AUDIO_LOAD_PREDECODE_BOOLEAN :: "SDL_mixer.audio.load.predecode" +PROP_AUDIO_LOAD_PREFERRED_MIXER_POINTER :: "SDL_mixer.audio.load.preferred_mixer" +PROP_AUDIO_LOAD_SKIP_METADATA_TAGS_BOOLEAN :: "SDL_mixer.audio.load.skip_metadata_tags" +PROP_AUDIO_DECODER_STRING :: "SDL_mixer.audio.decoder" + +PROP_METADATA_TITLE_STRING :: "SDL_mixer.metadata.title" +PROP_METADATA_ARTIST_STRING :: "SDL_mixer.metadata.artist" +PROP_METADATA_ALBUM_STRING :: "SDL_mixer.metadata.album" +PROP_METADATA_COPYRIGHT_STRING :: "SDL_mixer.metadata.copyright" +PROP_METADATA_TRACK_NUMBER :: "SDL_mixer.metadata.track" +PROP_METADATA_TOTAL_TRACKS_NUMBER :: "SDL_mixer.metadata.total_tracks" +PROP_METADATA_YEAR_NUMBER :: "SDL_mixer.metadata.year" +PROP_METADATA_DURATION_FRAMES_NUMBER :: "SDL_mixer.metadata.duration_frames" +PROP_METADATA_DURATION_INFINITE_BOOLEAN :: "SDL_mixer.metadata.duration_infinite" + +PROP_PLAY_LOOPS_NUMBER :: "SDL_mixer.play.loops" +PROP_PLAY_MAX_FRAME_NUMBER :: "SDL_mixer.play.max_frame" +PROP_PLAY_MAX_MILLISECONDS_NUMBER :: "SDL_mixer.play.max_milliseconds" +PROP_PLAY_START_FRAME_NUMBER :: "SDL_mixer.play.start_frame" +PROP_PLAY_START_MILLISECOND_NUMBER :: "SDL_mixer.play.start_millisecond" +PROP_PLAY_LOOP_START_FRAME_NUMBER :: "SDL_mixer.play.loop_start_frame" +PROP_PLAY_LOOP_START_MILLISECOND_NUMBER :: "SDL_mixer.play.loop_start_millisecond" +PROP_PLAY_FADE_IN_FRAMES_NUMBER :: "SDL_mixer.play.fade_in_frames" +PROP_PLAY_FADE_IN_MILLISECONDS_NUMBER :: "SDL_mixer.play.fade_in_milliseconds" +PROP_PLAY_FADE_IN_START_GAIN_FLOAT :: "SDL_mixer.play.fade_in_start_gain" +PROP_PLAY_APPEND_SILENCE_FRAMES_NUMBER :: "SDL_mixer.play.append_silence_frames" +PROP_PLAY_APPEND_SILENCE_MILLISECONDS_NUMBER :: "SDL_mixer.play.append_silence_milliseconds" +PROP_PLAY_HALT_WHEN_EXHAUSTED_BOOLEAN :: "SDL_mixer.play.halt_when_exhausted" + +DURATION_UNKNOWN :: -1 +DURATION_INFINITE :: -2 + +@(default_calling_convention = "c", link_prefix = "MIX_", require_results) +foreign lib { + Version :: proc() -> c.int --- + Init :: proc() -> c.bool --- + Quit :: proc() --- + GetNumAudioDecoders :: proc() -> c.int --- + GetAudioDecoder :: proc(index: c.int) -> cstring --- + CreateMixerDevice :: proc(devid: SDL.AudioDeviceID, #by_ptr spec: SDL.AudioSpec) -> ^Mixer --- + CreateMixer :: proc(#by_ptr spec: SDL.AudioSpec) -> ^Mixer --- + DestroyMixer :: proc(mixer: ^Mixer) --- + GetMixerProperties :: proc(mixer: ^Mixer) -> SDL.PropertiesID --- + GetMixerFormat :: proc(mixer: ^Mixer, spec: ^SDL.AudioSpec) -> c.bool --- + LockMixer :: proc(mixer: ^Mixer) --- + UnlockMixer :: proc(mixer: ^Mixer) --- + LoadAudio_IO :: proc(mixer: ^Mixer, io: ^SDL.IOStream, predecode, closeio: c.bool) -> ^Audio --- + LoadAudio :: proc(mixer: ^Mixer, path: cstring, predecode: c.bool) -> ^Audio --- + LoadAudioNoCopy :: proc(mixer: ^Mixer, data: rawptr, datalen: c.size_t, free_when_done: c.bool) -> ^Audio --- + LoadAudioWithProperties :: proc(props: SDL.PropertiesID) -> ^Audio --- + LoadRawAudio_IO :: proc(mixer: ^Mixer, io: ^SDL.IOStream, #by_ptr spec: SDL.AudioSpec, closeio: c.bool) -> ^Audio --- + LoadRawAudio :: proc(mixer: ^Mixer, data: rawptr, datalen: c.size_t, #by_ptr spec: SDL.AudioSpec) -> ^Audio --- + LoadRawAudioNoCopy :: proc(mixer: ^Mixer, data: rawptr, datalen: c.size_t, #by_ptr spec: SDL.AudioSpec, free_when_done: c.bool) -> ^Audio --- + CreateSineWaveAudio :: proc(mixer: ^Mixer, hz: c.int, amplitude: c.float, ms: SDL.Sint64) -> ^Audio --- + GetAudioProperties :: proc(audio: ^Audio) -> SDL.PropertiesID --- + GetAudioDuration :: proc(audio: ^Audio) -> SDL.Sint64 --- + GetAudioFormat :: proc(audio: ^Audio, spec: ^SDL.AudioSpec) -> c.bool --- + DestroyAudio :: proc(audio: ^Audio) --- + CreateTrack :: proc(mixer: ^Mixer) -> ^Track --- + DestroyTrack :: proc(track: ^Track) --- + GetTrackProperties :: proc(track: ^Track) -> SDL.PropertiesID --- + GetTrackMixer :: proc(track: ^Track) -> ^Mixer --- + SetTrackAudio :: proc(track: ^Track, audio: ^Audio) -> c.bool --- + SetTrackAudioStream :: proc(track: ^Track, stream: ^SDL.AudioStream) -> c.bool --- + SetTrackIOStream :: proc(track: ^Track, io: ^SDL.IOStream, closeio: c.bool) -> c.bool --- + SetTrackRawIOStream :: proc(track: ^Track, io: ^SDL.IOStream, #by_ptr spec: SDL.AudioSpec, closeio: c.bool) -> c.bool --- + TagTrack :: proc(track: ^Track, tag: cstring) -> c.bool --- + UntagTrack :: proc(track: ^Track, tag: cstring) --- + GetTrackTags :: proc(track: ^Track, count: ^c.int) -> [^]cstring --- + GetTaggedTracks :: proc(mixer: ^Mixer, tag: cstring, count: ^c.int) -> [^]^Track --- + SetTrackPlaybackPosition :: proc(track: ^Track, frames: SDL.Sint64) -> c.bool --- + GetTrackPlaybackPosition :: proc(track: ^Track) -> SDL.Sint64 --- + GetTrackFadeFrames :: proc(track: ^Track) -> SDL.Sint64 --- + GetTrackLoops :: proc(track: ^Track) -> c.int --- + SetTrackLoops :: proc(track: ^Track, num_loops: c.int) -> c.bool --- + GetTrackAudio :: proc(track: ^Track) -> ^Audio --- + GetTrackAudioStream :: proc(track: ^Track) -> ^SDL.AudioStream --- + GetTrackRemaining :: proc(track: ^Track) -> SDL.Sint64 --- + TrackMSToFrames :: proc(track: ^Track, ms: SDL.Sint64) -> SDL.Sint64 --- + TrackFramesToMS :: proc(track: ^Track, frames: SDL.Sint64) -> SDL.Sint64 --- + AudioMSToFrames :: proc(audio: ^Audio, ms: SDL.Sint64) -> SDL.Sint64 --- + AudioFramesToMS :: proc(audio: ^Audio, frames: SDL.Sint64) -> SDL.Sint64 --- + MSToFrames :: proc(sample_rate: c.int, ms: SDL.Sint64) -> SDL.Sint64 --- + FramesToMS :: proc(sample_rate: c.int, frames: SDL.Sint64) -> SDL.Sint64 --- + PlayTrack :: proc(track: ^Track, options: SDL.PropertiesID) -> c.bool --- + PlayTag :: proc(mixer: ^Mixer, tag: cstring, options: SDL.PropertiesID) -> c.bool --- + PlayAudio :: proc(mixer: ^Mixer, audio: ^Audio) -> c.bool --- + StopTrack :: proc(track: ^Track, fade_out_frames: SDL.Sint64) -> c.bool --- + StopAllTracks :: proc(mixer: ^Mixer, fade_out_ms: SDL.Sint64) -> c.bool --- + StopTag :: proc(mixer: ^Mixer, tag: cstring, fade_out_ms: SDL.Sint64) -> c.bool --- + PauseTrack :: proc(track: ^Track) -> c.bool --- + PauseAllTracks :: proc(mixer: ^Mixer) -> c.bool --- + PauseTag :: proc(mixer: ^Mixer, tag: cstring) -> c.bool --- + ResumeTrack :: proc(track: ^Track) -> c.bool --- + ResumeAllTracks :: proc(mixer: ^Mixer) -> c.bool --- + ResumeTag :: proc(mixer: ^Mixer, tag: cstring) -> c.bool --- + TrackPlaying :: proc(track: ^Track) -> c.bool --- + TrackPaused :: proc(track: ^Track) -> c.bool --- + SetMixerGain :: proc(mixer: ^Mixer, gain: c.float) -> c.bool --- + GetMixerGain :: proc(mixer: ^Mixer) -> c.float --- + SetTrackGain :: proc(track: ^Track, gain: c.float) -> c.bool --- + GetTrackGain :: proc(track: ^Track) -> c.float --- + SetTagGain :: proc(mixer: ^Mixer, tag: cstring, gain: c.float) -> c.bool --- + SetMixerFrequencyRatio :: proc(mixer: ^Mixer, ratio: c.float) -> c.bool --- + GetMixerFrequencyRatio :: proc(mixer: ^Mixer) -> c.float --- + SetTrackFrequencyRatio :: proc(track: ^Track, ratio: c.float) -> c.bool --- + GetTrackFrequencyRatio :: proc(track: ^Track) -> c.float --- + SetTrackOutputChannelMap :: proc(track: ^Track, chmap: [^]c.int, count: c.int) -> c.bool --- + SetTrackStereo :: proc(track: ^Track, #by_ptr gains: StereoGains) -> c.bool --- + SetTrack3DPosition :: proc(track: ^Track, #by_ptr position: Point3D) -> c.bool --- + GetTrack3DPosition :: proc(track: ^Track, position: ^Point3D) -> c.bool --- + CreateGroup :: proc(mixer: ^Mixer) -> ^Group --- + DestroyGroup :: proc(group: ^Group) --- + GetGroupProperties :: proc(group: ^Group) -> SDL.PropertiesID --- + GetGroupMixer :: proc(group: ^Group) -> ^Mixer --- + SetTrackGroup :: proc(track: ^Track, group: ^Group) -> c.bool --- + SetTrackStoppedCallback :: proc(track: ^Track, cb: TrackStoppedCallback, userdata: rawptr) -> c.bool --- + SetTrackRawCallback :: proc(track: ^Track, cb: TrackMixCallback, userdata: rawptr) -> c.bool --- + SetTrackCookedCallback :: proc(track: ^Track, cb: TrackMixCallback, userdata: rawptr) -> c.bool --- + SetGroupPostMixCallback :: proc(group: ^Group, cb: GroupMixCallback, userdata: rawptr) -> c.bool --- + SetPostMixCallback :: proc(mixer: ^Mixer, cb: PostMixCallback, userdata: rawptr) -> c.bool --- + Generate :: proc(mixer: ^Mixer, buffer: rawptr, buflen: c.int) -> c.int --- + CreateAudioDecoder :: proc(path: cstring, props: SDL.PropertiesID) -> ^AudioDecoder --- + CreateAudioDecoder_IO :: proc(io: ^SDL.IOStream, closeio: c.bool, props: SDL.PropertiesID) -> ^AudioDecoder --- + DestroyAudioDecoder :: proc(audiodecoder: ^AudioDecoder) --- + GetAudioDecoderProperties :: proc(audiodecoder: ^AudioDecoder) -> SDL.PropertiesID --- + GetAudioDecoderFormat :: proc(audiodecoder: ^AudioDecoder, spec: ^SDL.AudioSpec) -> c.bool --- + DecodeAudio :: proc(audiodecoder: ^AudioDecoder, buffer: rawptr, buflen: c.int, #by_ptr spec: SDL.AudioSpec) -> c.int --- +} From 7891744b65cf0a8bff6048f56462788b4045d560 Mon Sep 17 00:00:00 2001 From: Nathan Chere Date: Wed, 18 Mar 2026 20:48:38 +0100 Subject: [PATCH 755/766] MacOS ARM builds bumped from LLVM 20->22 --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5db1119a5..dd49b8ff8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -93,8 +93,8 @@ jobs: if: matrix.os == 'macos-latest' run: | brew update - brew install llvm@20 wasmtime lua@5.4 lld - echo "$(brew --prefix llvm@20)/bin" >> $GITHUB_PATH + brew install llvm@22 wasmtime lua@5.4 lld + echo "$(brew --prefix llvm@22)/bin" >> $GITHUB_PATH - name: Download LLVM (Ubuntu) if: matrix.os == 'ubuntu-latest' || matrix.os == 'ubuntu-24.04-arm' From c2e42fe455155bdd2e617616002b91f117c8631f Mon Sep 17 00:00:00 2001 From: Nathan Chere Date: Wed, 18 Mar 2026 21:11:12 +0100 Subject: [PATCH 756/766] Remove deprecated LLVMGetGlobalContext calls --- src/llvm_backend_general.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 35a0f5f65..3088db72d 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -1767,13 +1767,13 @@ gb_internal LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *t "\n\tArgTypeCtx: %p\n\tCurrentCtx: %p\n\tGlobalCtx: %p", LLVMPrintTypeToString(arg.type), j, ft->args.count, - LLVMGetTypeContext(arg.type), ft->ctx, LLVMGetGlobalContext()); + LLVMGetTypeContext(arg.type), ft->ctx); } GB_ASSERT_MSG(LLVMGetTypeContext(ft->ret.type) == ft->ctx, "\n\t%s" "\n\tRetTypeCtx: %p\n\tCurrentCtx: %p\n\tGlobalCtx: %p", LLVMPrintTypeToString(ft->ret.type), - LLVMGetTypeContext(ft->ret.type), ft->ctx, LLVMGetGlobalContext()); + LLVMGetTypeContext(ft->ret.type), ft->ctx); } for (unsigned i = 0; i < param_count; i++) { if (params_by_ptr[i]) { @@ -1791,7 +1791,7 @@ gb_internal LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *t GB_ASSERT_MSG(LLVMGetTypeContext(new_abi_fn_type) == m->ctx, "\n\tFuncTypeCtx: %p\n\tCurrentCtx: %p\n\tGlobalCtx: %p", - LLVMGetTypeContext(new_abi_fn_type), m->ctx, LLVMGetGlobalContext()); + LLVMGetTypeContext(new_abi_fn_type), m->ctx); map_set(&m->func_raw_types, type, new_abi_fn_type); From d18eff9a937d373219484704f13e6b7f4ef57173 Mon Sep 17 00:00:00 2001 From: Nathan Chere Date: Wed, 18 Mar 2026 21:21:00 +0100 Subject: [PATCH 757/766] Fix LLVMStructType calls deprecated as of LLVM 22 --- src/llvm_backend_type.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index b41ba2f15..9b9d3e8eb 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -201,10 +201,10 @@ gb_internal LLVMTypeRef *lb_setup_modified_types_for_type_info(lbModule *m, isiz vtypes[0] = lb_type(m, t); vtypes[1] = padding; vtypes[2] = tag; - LLVMTypeRef variant_type = LLVMStructType(vtypes, gb_count_of(vtypes), true); + LLVMTypeRef variant_type = LLVMStructTypeInContext(m->ctx, vtypes, gb_count_of(vtypes), true); stypes[variant_index] = variant_type; - LLVMTypeRef modified_type = LLVMStructType(stypes, cast(unsigned)(variant_index+1), false); + LLVMTypeRef modified_type = LLVMStructTypeInContext(m->ctx, stypes, cast(unsigned)(variant_index+1), false); modified_types[i] = modified_type; } From b965e46d7cc462b560aaaab39bb540c978ab9ed1 Mon Sep 17 00:00:00 2001 From: xfitgd Date: Thu, 19 Mar 2026 08:27:09 +0900 Subject: [PATCH 758/766] fixes Android build --- src/bundle_command.cpp | 4 ++++ src/linker.cpp | 13 ++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/bundle_command.cpp b/src/bundle_command.cpp index 7abd48104..c19f29220 100644 --- a/src/bundle_command.cpp +++ b/src/bundle_command.cpp @@ -186,7 +186,11 @@ i32 bundle_android(String original_init_directory) { gb_string_clear(cmd); cmd = gb_string_append_length(cmd, android_sdk_build_tools.text, android_sdk_build_tools.len); +#if defined(GB_SYSTEM_WINDOWS) + cmd = gb_string_appendc(cmd, "apksigner.bat"); +#else cmd = gb_string_appendc(cmd, "apksigner"); +#endif cmd = gb_string_appendc(cmd, " sign"); String keystore = normalize_path(temporary_allocator(), build_context.android_keystore, NIX_SEPARATOR_STRING); diff --git a/src/linker.cpp b/src/linker.cpp index 76c795989..02bfe1146 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -676,7 +676,7 @@ try_cross_linking:; defer (gb_string_free(glue)); glue = gb_string_append_fmt(glue, "bin/clang"); - glue = gb_string_append_fmt(glue, " --target=%s%d ", build_context.metrics.target_triplet, ODIN_ANDROID_API_LEVEL); + glue = gb_string_append_fmt(glue, " --target=%.*s%d ", LIT(build_context.metrics.target_triplet), ODIN_ANDROID_API_LEVEL); glue = gb_string_appendc(glue, "-c \""); glue = gb_string_append_length(glue, ODIN_ANDROID_NDK.text, ODIN_ANDROID_NDK.len); glue = gb_string_appendc(glue, "sources/android/native_app_glue/android_native_app_glue.c"); @@ -731,12 +731,12 @@ try_cross_linking:; return result; } - object_files = gb_string_append_fmt(object_files, "\'%.*s\' ", LIT(android_glue_static_lib)); + object_files = gb_string_append_fmt(object_files, "\"%.*s\" ", LIT(android_glue_static_lib)); } for (String object_path : gen->output_object_paths) { - object_files = gb_string_append_fmt(object_files, "\'%.*s\' ", LIT(object_path)); + object_files = gb_string_append_fmt(object_files, "\"%.*s\" ", LIT(object_path)); } gbString link_settings = gb_string_make_reserve(heap_allocator(), 32); @@ -925,7 +925,10 @@ try_cross_linking:; GB_ASSERT(ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT.len != 0); platform_lib_str = gb_string_appendc(platform_lib_str, "\"-L"); - platform_lib_str = gb_string_append_length(platform_lib_str, ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL.text, ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL.len); + platform_lib_str = gb_string_append_length(platform_lib_str, ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT.text, ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT.len); + platform_lib_str = gb_string_appendc(platform_lib_str, "usr/lib/"); + platform_lib_str = gb_string_append_length(platform_lib_str, ODIN_ANDROID_NDK_TOOLCHAIN_LIB.text, ODIN_ANDROID_NDK_TOOLCHAIN_LIB.len); + platform_lib_str = gb_string_append_fmt(platform_lib_str, "/%d", ODIN_ANDROID_API_LEVEL); platform_lib_str = gb_string_appendc(platform_lib_str, "\" "); platform_lib_str = gb_string_appendc(platform_lib_str, "-landroid "); @@ -970,7 +973,7 @@ try_cross_linking:; gbString ndk_bin_directory = gb_string_make_length(temporary_allocator(), ODIN_ANDROID_NDK_TOOLCHAIN.text, ODIN_ANDROID_NDK_TOOLCHAIN.len); link_command_line = gb_string_appendc(link_command_line, ndk_bin_directory); link_command_line = gb_string_appendc(link_command_line, "bin/clang"); - link_command_line = gb_string_append_fmt(link_command_line, " --target=%s%d ", build_context.metrics.target_triplet, ODIN_ANDROID_API_LEVEL); + link_command_line = gb_string_append_fmt(link_command_line, " --target=%.*s%d ", LIT(build_context.metrics.target_triplet), ODIN_ANDROID_API_LEVEL); } else { link_command_line = gb_string_appendc(link_command_line, clang_path); } From 62d78d61fa0d2a0aeb375f0cded57434721c4f3f Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Wed, 18 Mar 2026 05:13:44 +0900 Subject: [PATCH 759/766] src: Allow clang-style `+`/`-` for target features This largely works as expected, except that as far as I can tell, without explicit annotations added to the caller, (or a `#force_inline`), the LLVM `target-features` function attribute gets ignored by the inliner under the rationale of `-sse,-avx,-avx2` is a subset of `+sse,+avx,+avx2`. With `#force_no_inline` the correct code does get generated, but in the regression I am trying to fix, the caller gratuitously also uses SIMD, leading to horrific performance. --- src/build_settings.cpp | 27 ++++++++++++++++++++------- src/llvm_backend_proc.cpp | 5 ++++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d52553d65..9663d5db5 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -2160,8 +2160,15 @@ gb_internal bool check_target_feature_is_valid(String const &feature, TargetArch String_Iterator it = {feature, 0}; for (;;) { String str = string_split_iterator(&it, ','); - if (str == "") break; - if (!check_single_target_feature_is_valid(feature_list, str)) { + String feature_str = str; + if (string_starts_with(feature_str, '+') || string_starts_with(feature_str, '-')) { + feature_str = substring(feature_str, 1, feature_str.len); + if (feature_str == "") { + return false; + } + } + if (feature_str == "") break; + if (!check_single_target_feature_is_valid(feature_list, feature_str)) { if (invalid) *invalid = str; return false; } @@ -2201,20 +2208,26 @@ gb_internal bool check_target_feature_is_enabled(String const &feature, String * String_Iterator it = {feature, 0}; for (;;) { String str = string_split_iterator(&it, ','); - if (str == "") break; + String feature_str = str; + bool want_enabled = true; + if (string_starts_with(feature_str, '+') || string_starts_with(feature_str, '-')) { + want_enabled = feature_str[0] == '+'; + feature_str = substring(feature_str, 1, feature_str.len); + } + if (feature_str == "") break; if (!string_set_exists(&build_context.target_features_set, str)) { - String plus_str = concatenate_strings(temporary_allocator(), make_string_c("+"), str); + String plus_str = concatenate_strings(temporary_allocator(), make_string_c("+"), feature_str); - if (!string_set_exists(&build_context.target_features_set, plus_str)) { + if (want_enabled && !string_set_exists(&build_context.target_features_set, plus_str)) { if (not_enabled) *not_enabled = str; return false; } } - String minus_str = concatenate_strings(temporary_allocator(), make_string_c("-"), str); + String minus_str = concatenate_strings(temporary_allocator(), make_string_c("-"), feature_str); - if (string_set_exists(&build_context.target_features_set, minus_str)) { + if (!want_enabled && !string_set_exists(&build_context.target_features_set, minus_str)) { if (not_enabled) *not_enabled = str; return false; } diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 36d736b0f..7d0379e9a 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -201,12 +201,15 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i for (;;) { String str = string_split_iterator(&it, ','); if (str == "") break; + bool add_prefix = !(string_starts_with(str, '+') || string_starts_with(str, '-')); if (!first) { feature_str = gb_string_appendc(feature_str, ","); } first = false; - feature_str = gb_string_appendc(feature_str, "+"); + if (add_prefix) { + feature_str = gb_string_appendc(feature_str, "+"); + } feature_str = gb_string_append_length(feature_str, str.text, str.len); } From a171746a157b0ea4f15a1889f99e15e40eb2ad7a Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Wed, 18 Mar 2026 05:41:50 +0900 Subject: [PATCH 760/766] core/math/rand: Disable LLVM vectorization of xoshiro on Intel LLVM tries really hard to vectorize this when it is a terrible idea, when `-microarch:native` is specified on modern processors. Not doing so is a 2.5->3x performance gain. --- core/math/rand/rand_xoshiro256.odin | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/math/rand/rand_xoshiro256.odin b/core/math/rand/rand_xoshiro256.odin index 6f5dbe545..3771d2beb 100644 --- a/core/math/rand/rand_xoshiro256.odin +++ b/core/math/rand/rand_xoshiro256.odin @@ -3,6 +3,18 @@ package rand import "base:intrinsics" import "base:runtime" +when ODIN_ARCH == .amd64 || ODIN_ARCH == .i386 { + // LLVM thinks that using SIMD for read_u64 is good, + // when it causes a ~3x performance regression. As + // far as I can tell, this behavior is limited to + // Intel. + @(private = "file") + TARGET_FEATURES :: "-sse,-avx,-avx2" +} else { + @(private = "file") + TARGET_FEATURES :: "" +} + /* The state for a xoshiro256** pseudorandom generator. */ @@ -10,8 +22,9 @@ Xoshiro256_Random_State :: struct { s: [4]u64, } +@(enable_target_feature = TARGET_FEATURES) xoshiro256_random_generator_proc :: proc(data: rawptr, mode: runtime.Random_Generator_Mode, p: []byte) { - @(require_results) + @(require_results, enable_target_feature = TARGET_FEATURES) read_u64 :: proc "contextless" (r: ^Xoshiro256_Random_State) -> u64 { // xoshiro256** output function and state transition @@ -27,7 +40,7 @@ xoshiro256_random_generator_proc :: proc(data: rawptr, mode: runtime.Random_Gene return result - rotate_left64 :: proc "contextless" (x: u64, k: int) -> u64 { + rotate_left64 :: #force_inline proc "contextless" (x: u64, k: int) -> u64 { n :: 64 s := uint(k) & (n-1) return x << s | x >> (n-s) From 274e99015c6c3ce670315474b87cc40a253b4de3 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 19 Mar 2026 12:04:32 +0100 Subject: [PATCH 761/766] Add SDL3 Mixer binaries --- .gitattributes | 2 + vendor/sdl3/mixer/LICENSE.gme.txt | 504 +++++++++++++++++++++++ vendor/sdl3/mixer/LICENSE.ogg-vorbis.txt | 28 ++ vendor/sdl3/mixer/LICENSE.opus.txt | 44 ++ vendor/sdl3/mixer/LICENSE.opusfile.txt | 28 ++ vendor/sdl3/mixer/LICENSE.wavpack.txt | 25 ++ vendor/sdl3/mixer/LICENSE.xmp.txt | 20 + vendor/sdl3/mixer/SDL3_mixer.dll | 3 + vendor/sdl3/mixer/SDL3_mixer.lib | 3 + vendor/sdl3/mixer/libgme.dll | 3 + vendor/sdl3/mixer/libogg-0.dll | 3 + vendor/sdl3/mixer/libopus-0.dll | 3 + vendor/sdl3/mixer/libopusfile-0.dll | 3 + vendor/sdl3/mixer/libwavpack-1.dll | 3 + vendor/sdl3/mixer/libxmp.dll | 3 + 15 files changed, 675 insertions(+) create mode 100644 vendor/sdl3/mixer/LICENSE.gme.txt create mode 100644 vendor/sdl3/mixer/LICENSE.ogg-vorbis.txt create mode 100644 vendor/sdl3/mixer/LICENSE.opus.txt create mode 100644 vendor/sdl3/mixer/LICENSE.opusfile.txt create mode 100644 vendor/sdl3/mixer/LICENSE.wavpack.txt create mode 100644 vendor/sdl3/mixer/LICENSE.xmp.txt create mode 100644 vendor/sdl3/mixer/SDL3_mixer.dll create mode 100644 vendor/sdl3/mixer/SDL3_mixer.lib create mode 100644 vendor/sdl3/mixer/libgme.dll create mode 100644 vendor/sdl3/mixer/libogg-0.dll create mode 100644 vendor/sdl3/mixer/libopus-0.dll create mode 100644 vendor/sdl3/mixer/libopusfile-0.dll create mode 100644 vendor/sdl3/mixer/libwavpack-1.dll create mode 100644 vendor/sdl3/mixer/libxmp.dll diff --git a/.gitattributes b/.gitattributes index 864b73592..e375d2543 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8,3 +8,5 @@ vendor/box2d/lib/box2d_windows_amd64_sse2.lib filter=lfs diff=lfs merge=lfs -tex vendor/miniaudio/lib/miniaudio.lib filter=lfs diff=lfs merge=lfs -text vendor/sdl3/SDL3.dll filter=lfs diff=lfs merge=lfs -text vendor/sdl3/SDL3.lib filter=lfs diff=lfs merge=lfs -text +vendor/sdl3/mixer/*.dll filter=lfs diff=lfs merge=lfs -text +vendor/sdl3/mixer/*.lib filter=lfs diff=lfs merge=lfs -text diff --git a/vendor/sdl3/mixer/LICENSE.gme.txt b/vendor/sdl3/mixer/LICENSE.gme.txt new file mode 100644 index 000000000..5ab7695ab --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.gme.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/sdl3/mixer/LICENSE.ogg-vorbis.txt b/vendor/sdl3/mixer/LICENSE.ogg-vorbis.txt new file mode 100644 index 000000000..fb456a87b --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.ogg-vorbis.txt @@ -0,0 +1,28 @@ +Copyright (c) 2002-2020 Xiph.org Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.org Foundation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sdl3/mixer/LICENSE.opus.txt b/vendor/sdl3/mixer/LICENSE.opus.txt new file mode 100644 index 000000000..9c739c34a --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.opus.txt @@ -0,0 +1,44 @@ +Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic, + Jean-Marc Valin, Timothy B. Terriberry, + CSIRO, Gregory Maxwell, Mark Borgerding, + Erik de Castro Lopo + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Opus is subject to the royalty-free patent licenses which are +specified at: + +Xiph.Org Foundation: +https://datatracker.ietf.org/ipr/1524/ + +Microsoft Corporation: +https://datatracker.ietf.org/ipr/1914/ + +Broadcom Corporation: +https://datatracker.ietf.org/ipr/1526/ diff --git a/vendor/sdl3/mixer/LICENSE.opusfile.txt b/vendor/sdl3/mixer/LICENSE.opusfile.txt new file mode 100644 index 000000000..7b53d665d --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.opusfile.txt @@ -0,0 +1,28 @@ +Copyright (c) 1994-2013 Xiph.Org Foundation and contributors + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.Org Foundation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sdl3/mixer/LICENSE.wavpack.txt b/vendor/sdl3/mixer/LICENSE.wavpack.txt new file mode 100644 index 000000000..a0136963e --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.wavpack.txt @@ -0,0 +1,25 @@ + Copyright (c) 1998 - 2025 David Bryant + All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/sdl3/mixer/LICENSE.xmp.txt b/vendor/sdl3/mixer/LICENSE.xmp.txt new file mode 100644 index 000000000..ed3491ee5 --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.xmp.txt @@ -0,0 +1,20 @@ +Extended Module Player +Copyright (C) 1996-2024 Claudio Matsuoka and Hipolito Carraro Jr + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/sdl3/mixer/SDL3_mixer.dll b/vendor/sdl3/mixer/SDL3_mixer.dll new file mode 100644 index 000000000..fba705818 --- /dev/null +++ b/vendor/sdl3/mixer/SDL3_mixer.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8708c991962cee6fa30e69969d0261eb1c2bba1f5609f21cd096681664406a25 +size 434176 diff --git a/vendor/sdl3/mixer/SDL3_mixer.lib b/vendor/sdl3/mixer/SDL3_mixer.lib new file mode 100644 index 000000000..eef40ba35 --- /dev/null +++ b/vendor/sdl3/mixer/SDL3_mixer.lib @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc07725d580297402884da96999a63ed844b3359e98b9ed257c20fef9f492a99 +size 22380 diff --git a/vendor/sdl3/mixer/libgme.dll b/vendor/sdl3/mixer/libgme.dll new file mode 100644 index 000000000..6d1ef9ca7 --- /dev/null +++ b/vendor/sdl3/mixer/libgme.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50b739c925702d381e163e66887699eb980e03681577d8d7a19cd9972a315dea +size 445440 diff --git a/vendor/sdl3/mixer/libogg-0.dll b/vendor/sdl3/mixer/libogg-0.dll new file mode 100644 index 000000000..d2de59965 --- /dev/null +++ b/vendor/sdl3/mixer/libogg-0.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76344182f53695db65fca5921ab4e478cdf2f954d86628b27dab0fb9327bf2e7 +size 32768 diff --git a/vendor/sdl3/mixer/libopus-0.dll b/vendor/sdl3/mixer/libopus-0.dll new file mode 100644 index 000000000..3f7865d5d --- /dev/null +++ b/vendor/sdl3/mixer/libopus-0.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:064aaa2aee76ac93df0f9ec78a670a49954e3f4ac1bc1fd70ebda2f035ccc073 +size 367616 diff --git a/vendor/sdl3/mixer/libopusfile-0.dll b/vendor/sdl3/mixer/libopusfile-0.dll new file mode 100644 index 000000000..c664cf7f4 --- /dev/null +++ b/vendor/sdl3/mixer/libopusfile-0.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2e7edcdfb87f12763508b0234e2f945b6e8a3706bda740911e0d1a8ef24c758 +size 48640 diff --git a/vendor/sdl3/mixer/libwavpack-1.dll b/vendor/sdl3/mixer/libwavpack-1.dll new file mode 100644 index 000000000..2278390c9 --- /dev/null +++ b/vendor/sdl3/mixer/libwavpack-1.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e07f0623d14cbf19f6f3ee75ed6f45191088033e7167877a8ccbb41f1589f1a1 +size 178688 diff --git a/vendor/sdl3/mixer/libxmp.dll b/vendor/sdl3/mixer/libxmp.dll new file mode 100644 index 000000000..5923fd353 --- /dev/null +++ b/vendor/sdl3/mixer/libxmp.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a5f1198d976d7ea5aeb8433905c47a71906c2c9b0733166d88ec4a4525e0dee +size 417792 From 261881e57cbfd3596f54075016de19b81aae0f31 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 19 Mar 2026 19:44:34 +0100 Subject: [PATCH 762/766] vendor/stb/vorbis: support WASM --- vendor/stb/lib/stb_vorbis_wasm.o | Bin 0 -> 50828 bytes vendor/stb/src/Makefile | 3 +- vendor/stb/vorbis/stb_vorbis.odin | 61 +++++++++++++++---------- vendor/stb/vorbis/stb_vorbis_wasm.odin | 4 ++ 4 files changed, 42 insertions(+), 26 deletions(-) create mode 100644 vendor/stb/lib/stb_vorbis_wasm.o create mode 100644 vendor/stb/vorbis/stb_vorbis_wasm.odin diff --git a/vendor/stb/lib/stb_vorbis_wasm.o b/vendor/stb/lib/stb_vorbis_wasm.o new file mode 100644 index 0000000000000000000000000000000000000000..156696d78c5b743614b974c203d603b11b825996 GIT binary patch literal 50828 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 c.int --- + when !NO_STDIO { + // decode an entire file and output the data interleaved into a malloc()ed + // buffer stored in *output. The return value is the number of samples + // decoded, or -1 if the file could not be opened or was not an ogg vorbis file. + // When you're done with it, just free() the pointer returned in *output. + decode_filename :: proc(filename: cstring, channels, sample_rate: ^c.int, output: ^[^]c.short) -> c.int --- + } decode_memory :: proc(mem: [^]byte, len: c.int, channels, sample_rate: ^c.int, output: ^[^]c.short) -> c.int --- @@ -204,28 +213,30 @@ foreign lib { open_memory :: proc(data: [^]byte, len: c.int, error: ^Error, alloc_buffer: ^vorbis_alloc) -> ^vorbis --- - // create an ogg vorbis decoder from a filename via fopen(). on failure, - // returns NULL and sets *error (possibly to VORBIS_file_open_failure). - open_filename :: proc(filename: cstring, - error: ^Error, alloc_buffer: ^vorbis_alloc) -> ^vorbis --- + when !NO_STDIO { + // create an ogg vorbis decoder from a filename via fopen(). on failure, + // returns NULL and sets *error (possibly to VORBIS_file_open_failure). + open_filename :: proc(filename: cstring, + error: ^Error, alloc_buffer: ^vorbis_alloc) -> ^vorbis --- - // create an ogg vorbis decoder from an open FILE *, looking for a stream at - // the _current_ seek point (ftell). on failure, returns NULL and sets *error. - // note that stb_vorbis must "own" this stream; if you seek it in between - // calls to stb_vorbis, it will become confused. Moreover, if you attempt to - // perform stb_vorbis_seek_*() operations on this file, it will assume it - // owns the _entire_ rest of the file after the start point. Use the next - // function, stb_vorbis_open_file_section(), to limit it. - open_file :: proc(f: ^c.FILE, close_handle_on_close: b32, - error: ^Error, alloc_buffer: ^vorbis_alloc) -> ^vorbis --- + // create an ogg vorbis decoder from an open FILE *, looking for a stream at + // the _current_ seek point (ftell). on failure, returns NULL and sets *error. + // note that stb_vorbis must "own" this stream; if you seek it in between + // calls to stb_vorbis, it will become confused. Moreover, if you attempt to + // perform stb_vorbis_seek_*() operations on this file, it will assume it + // owns the _entire_ rest of the file after the start point. Use the next + // function, stb_vorbis_open_file_section(), to limit it. + open_file :: proc(f: ^c.FILE, close_handle_on_close: b32, + error: ^Error, alloc_buffer: ^vorbis_alloc) -> ^vorbis --- - // create an ogg vorbis decoder from an open FILE *, looking for a stream at - // the _current_ seek point (ftell); the stream will be of length 'len' bytes. - // on failure, returns NULL and sets *error. note that stb_vorbis must "own" - // this stream; if you seek it in between calls to stb_vorbis, it will become - // confused. - open_file_section :: proc(f: ^c.FILE, close_handle_on_close: b32, - error: ^Error, alloc_buffer: ^vorbis_alloc, len: c.uint) -> ^vorbis --- + // create an ogg vorbis decoder from an open FILE *, looking for a stream at + // the _current_ seek point (ftell); the stream will be of length 'len' bytes. + // on failure, returns NULL and sets *error. note that stb_vorbis must "own" + // this stream; if you seek it in between calls to stb_vorbis, it will become + // confused. + open_file_section :: proc(f: ^c.FILE, close_handle_on_close: b32, + error: ^Error, alloc_buffer: ^vorbis_alloc, len: c.uint) -> ^vorbis --- + } // these functions seek in the Vorbis file to (approximately) 'sample_number'. // after calling seek_frame(), the next call to get_frame_*() will include diff --git a/vendor/stb/vorbis/stb_vorbis_wasm.odin b/vendor/stb/vorbis/stb_vorbis_wasm.odin new file mode 100644 index 000000000..324b7e025 --- /dev/null +++ b/vendor/stb/vorbis/stb_vorbis_wasm.odin @@ -0,0 +1,4 @@ +#+build wasm32, wasm64p32 +package stb_vorbis + +@(require) import _ "vendor:libc-shim" From e6521ed2698c1f6b1ad5d047daee950bf29681c7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Mar 2026 18:50:01 +0000 Subject: [PATCH 763/766] Inline the generic count stuff --- src/docs_writer.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 3f5d4876a..ddd8144ca 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -472,14 +472,6 @@ gb_internal OdinDocArray odin_doc_type_as_slice(OdinDocWriter return odin_write_item_as_slice(w, index); } -gb_internal OdinDocArray odin_doc_type2_as_slice(OdinDocWriter *w, Type *type0, Type *type1, bool cache=true) { - OdinDocTypeIndex indices[2] = {}; - indices[0] = odin_doc_type(w, type0, cache); - indices[1] = odin_doc_type(w, type1, cache); - - return odin_write_slice(w, indices, gb_count_of(indices)); -} - gb_internal OdinDocArray odin_doc_add_entity_as_slice(OdinDocWriter *w, Entity *e) { OdinDocEntityIndex index = odin_doc_add_entity(w, e); return odin_write_item_as_slice(w, index); @@ -564,9 +556,10 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca doc_type.elem_count_len = 1; doc_type.elem_counts[0] = type->Array.count; if (type->Array.generic_count != nullptr) { - doc_type.types = odin_doc_type2_as_slice(w, - type->Array.elem, - type->Array.generic_count); + OdinDocTypeIndex types[2] = {}; + types[0] = odin_doc_type(w, type->Array.elem); + types[1] = odin_doc_type(w, type->Array.generic_count); + doc_type.types = odin_write_slice(w, types, gb_count_of(types)); } else { doc_type.types = odin_doc_type_as_slice(w, type->Array.elem); } @@ -596,10 +589,10 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca doc_type.elem_counts[0] = type->FixedCapacityDynamicArray.capacity; if (type->FixedCapacityDynamicArray.generic_capacity != nullptr) { - doc_type.types = odin_doc_type2_as_slice(w, - type->FixedCapacityDynamicArray.elem, - type->FixedCapacityDynamicArray.generic_capacity); - + OdinDocTypeIndex types[2] = {}; + types[0] = odin_doc_type(w, type->FixedCapacityDynamicArray.elem); + types[1] = odin_doc_type(w, type->FixedCapacityDynamicArray.generic_capacity); + doc_type.types = odin_write_slice(w, types, gb_count_of(types)); } else { doc_type.types = odin_doc_type_as_slice(w, type->FixedCapacityDynamicArray.elem); } From 111bee6ecdb260e4cf7b4d9d8c2a9538aca97a78 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Mar 2026 20:31:01 +0000 Subject: [PATCH 764/766] Fix `scope->elements` iteration causing a few bugs in the doc-format --- src/check_stmt.cpp | 16 +++++++++++----- src/docs_writer.cpp | 10 ++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 5775c3e53..5d740c6d2 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -788,11 +788,17 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, rw_mutex_lock(&scope->mutex); defer (rw_mutex_unlock(&scope->mutex)); - for (auto const &entry : scope->elements) { - Entity *decl = entry.value; - if (!is_entity_exported(decl, true)) continue; - u32 hash = entry.hash; - auto interned = scope->elements.keys[hash & (scope->elements.cap-1)]; + for (u32 i = 0; i < scope->elements.cap; i++) { + if (!scope->elements.slots[i].hash) { + continue; + } + + Entity *decl = scope->elements.slots[i].value; + if (!is_entity_exported(decl, true)) { + continue; + } + u32 hash = scope->elements.slots[i].hash; + auto interned = scope->elements.keys[i]; Entity *found = scope_insert_with_name(ctx->scope, interned, hash, decl); if (found != nullptr) { diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index ddd8144ca..a9f3a3e15 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -1042,10 +1042,12 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit auto entries = array_make(heap_allocator(), 0, w->entity_cache.count); defer (array_free(&entries)); - for (auto const &element : pkg->scope->elements) { - u32 hash = element.hash; - auto interned = pkg->scope->elements.keys[hash & (pkg->scope->elements.cap-1)]; - Entity *e = element.value; + for (isize i = 0; i < pkg->scope->elements.cap; i++) { + if (!pkg->scope->elements.slots[i].hash) { + continue; + } + auto interned = pkg->scope->elements.keys[i]; + Entity *e = pkg->scope->elements.slots[i].value; switch (e->kind) { case Entity_Invalid: case Entity_Nil: From 5e6e1c1e754c716aa1e60b40c842852ca5dabcd4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 20 Mar 2026 11:44:10 +0000 Subject: [PATCH 765/766] Add `gethostname` to ws2_32.odin --- core/sys/windows/ws2_32.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/sys/windows/ws2_32.odin b/core/sys/windows/ws2_32.odin index 77a288d6f..2221e37fa 100644 --- a/core/sys/windows/ws2_32.odin +++ b/core/sys/windows/ws2_32.odin @@ -229,6 +229,8 @@ foreign ws2_32 { getsockname :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getpeername) getpeername :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int --- + // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-gethostname) + gethostname :: proc(name: [^]c_char, namelen: c_int) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind) bind :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: socklen_t) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-listen) From e2bb7d70affdd14d4a9249749da24ff3670e5f3e Mon Sep 17 00:00:00 2001 From: imp0s5ible Date: Fri, 20 Mar 2026 15:21:12 +0100 Subject: [PATCH 766/766] Make map_file_from_path use the open flags map_file_from_path now passes the appropriate flags on to os.open instead of always calling it with os.O_RDWR. It will no longer try to open a file with write permissions if the user didn't request write access to the file mapping (or vice-versa). --- core/mem/virtual/file.odin | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/mem/virtual/file.odin b/core/mem/virtual/file.odin index 660210bbf..af0449e66 100644 --- a/core/mem/virtual/file.odin +++ b/core/mem/virtual/file.odin @@ -10,7 +10,14 @@ map_file :: proc{ } map_file_from_path :: proc(filename: string, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { - f, err := os.open(filename, os.O_RDWR) + open_flags : os.File_Flags + if .Read in flags { + open_flags += {.Read} + } + if .Write in flags { + open_flags += {.Write} + } + f, err := os.open(filename, open_flags) if err != nil { return nil, .Open_Failure } @@ -37,4 +44,4 @@ unmap_file :: proc(data: []byte) { if raw_data(data) != nil { _unmap_file(data) } -} \ No newline at end of file +}

        _%gUkDt^snr zTZu%sH_Ho#0#MQ`)dXFU_$43AmgU#D59*C8fO3feq$GS1!N9=qQV+b;3{%qj_y7Md z1wqZfUeWLU;1Pfosr(EtniqhhmIWg7Hx(QyeIS`kh|H^h|Noyk1L;pdjt7HvS3u)% zkq#U_-524NT?J@41gNZw;PLHs-T|s(!6N(u0U$qm@PPXT{2CAWH9mPBcb);R<@n=1 zI39Oi0%AKJcLt5LGJNKbd;FPSAc6(dv@QlWyo*6;?`2Rn+cGvEO*6vQp;G}yw3AF!vE+|n$)^K#^ zs6>DkVI)BIN`rexXU;V5gzYHpgluAroOp+kfuTgrCukQXXv?DpND$P10Hq_&&-{V{8(^mdAg@m<@o%u5oda4N0Nq&j{u(ICN>I+T z`J4he|7Q-^-H;VQ-QWdR%@qO+HHys@A`CUs;1g3IJ8?sjz`lK&$j|WN0Fo}K_aNsj zf$9SRP%#0n6cjwVSAy0zd368mjuHUHQ1_=7CL1{!tZ(qQLhjrK9cvF-n{*9)3um`j z<1aQQ28NQ7-lm^_!FPCJIFsm5QzAR&&%Us50qKA>`#&wzp9wG&9I2uLeOsTt%_O@`OH5C$XY22JqIr5?TD z3v5A)j5@(1UoS2ifbO|~NOs4l7=YF{pe}6yogdNN_yJTGwH_$p>2{E?1>IJ~KjpyT z?ncmEns6>GxXyTVA93mQPyn^>JURmeJUTr%LW9G?9YZ{NS9pNRMo6dGqj@i==gr{J z{i}N}sC(qm8@h$xbuOses@*160<$xUvE?BH0U)^5}Kl;nVB82UJQa`1HCS@aPRa@*)_tdmMC~ zj8Cs?3n)~3r-JN#@p||F{~()St`G=q@#yXadDi%n<4*87B*$Glz;x?LmrmaauH6@1 zyKnNlP6eeYSK|Ynp%+{_TR~>E-sbOn$-%(j)44{a1GGyDR40S!J>cOtP<4WO zUC}GR;E{Y7+&u;LmqAWoy*`L2ZOcnfMh1rFUreP^{M%z3nfSNY zII_6#Z&z`IN^60o8B3-3x5Y3r@^7nQWOCu(rosr7<_2AW*7^ffIQIH>cy!MN^@V-A z&vb)B&Zql$r;Cb1cPpqI2NmO>Q!WfVy20H}P}plgdi|hv6)#Lp85khiJbHaQe7bu< z11>Jz54yp||33sW$*21`afZDx!D3kVjZW7Y&4-vECPE$O(cKDiGsra-5VJu?QQ&an zL=({FfY=G$KU}&)dtADGJ6yWK@!APWFs>(Dt*3y&&5hyN~d%Kj@Qup!+cY`hyR*A>pLXef4O0K! z)%sZpm#g*D5?06VFR%F=t?!kvcYk)YzFW%F{oU3297ytP39D=O&({L3*4IinT)Tg{ zT3;)dBe8=u%F5Pp%9_3$u*eCgbWA{-<{`H4HJM#;u2!O~K0Tz(2kAX#< z_yu%?K0EOXgb1;KHgP%e3-Ac?>pcVsxd^gUah9_4>s_c~DiPw>y8+?7tYRu*F~0Pg zxjS@&WA|~8F?e;#@$22-?@9no*0e@}NWGW*U4bA*t2Z+PL+d5}7H4MAn9};Kpfupv zeUyJaI3GBIk3;k5o(k^VB>(eC{@~FoBksuzS`_@EUj?+DmcNx5WD-;>vIfvmuF2m# zn6JG^g{r*C1hxg7(ooFy=sxY6{NI!L`U@+l(siKw%Da0(=^YdjEd2cX$M~B-mv->$ z|KM-x2hF=W^9!)>fyEm@T_TWpIY`_IE}j7sj|Yi^)I-bx-KGFG2XyxUG!u09f(jwf z6`o-CLGyqk|N3LD{Og~4Bwv8U<1x?VJ08q)K_TMPy%ZGTKFJ3_%V=Zy*Y|=-7e{`L zgD(8**FxE+9QidaI`V7W@<=}DnSA!M6MrNN2Z;3HU;$AgoFFoWljSpi3}~ma>jKcY z&63ajF*m_8DxlezHLpQ8jFqn8*SH6o99hAyan0knE9fj%25{ggfk+=E7Es~>%|Z*h z-uTQP^8mzkQ2?!k@xAkzKjt84b_cYn+4Tu{;|S=m8-BfORc!n%=RvJby?Y=gs8#|` z1cPe$GkoBsQ_&odfvsRr2IPJrCIA)n{}^6B-x0h)mE z=)V5q^_Tzu!CPRB5Af@MDw73`jx7KeAE55V1?V7H=nBxd(*n@xV$vWLOPWtGf#gp> zUF{2+TykB4WIm|i1KRe20b0$QB9bozF@1m$)Ya1jemJJ1vbOG3>*|MRzi#{GRD1)N8(YX{UXuHENg!MstC|&Pe}CxtmXm@wP}DfD7@H^ z_5Xi|YeUNc$O>SW?$8-7-LWkwUJ31S>5QG=+I_~QGqnSnyrJy}$L0gf-Jusenh!8T z8wj9^+{4=S1%Hp}kN^K2!MBMH+N0h8YR7a#+BM)2O;9=09l8Y?D=(fv zmZ7-r_{=X5y9YET4%(&bdju*EO(T6Q3=E*5A5h=Hfqxrlrn4A4-~$@w2?h=GL^rtd zYb-AK58Cqi7__$}8Zj0LYP5nH8sPQW3ZR=n!Kc#sG}xLZAoVgjPl09u8dPP5mg1Z<^q5KRlVkbb>Lxc8VK;%1f zR3yT}A-9n_cE9xP{sB7e`zL5x7PQhnAs(#RH59Ul8MKsM!7)BQ?xiruq|O)>2hb7% zj~81aLE{-EsUFGx9>xb+Pu7WebjJszO|UdB$^L)9qxrCe^}(7?9=(o?9^L){9=#$C z9tR&WzgYVZw8#7dXeLDqq}8KW#1qt`>6N+AY22AD@WSUGXr(mxfbdd((Ac5&KbWT- zKo`MzfR@|CU3J)_+nd9q`|68OkT&q9gpx}>-A6q^cL$z$k*~lHIwQQZnxivY;Pq~V zM3@3U!+&>=4U9gW{07sA+as<5z1D*ff2Xm_d zB!WCTcUv%lH;W)5&7)V;KLi}e4}$p_UhM8eiy^2(pcFRu)Hm3&AiF05;+_m-_r!qQ z6OZAZ?#ZCdAfU=iw7H&xp@zS?o`<1^^O%zdBfkLqYxZMK9t`~92Ryn@^9wp@yqKpB zI!g<>;Rlp{Ue=_8djF!m!C)WAfqd|@7mp9X{b>Wx7@`8d#z)A3cO_vBw$8Cg0XqFS zI6&=@Juo{IH2%>G3Q*7hALvjf&}pUM{REpqx01YYR0M@AvShF5*C4RF+JZpmpY%db zlTiTg1u%e|u!RUuSpMU0nF`(purUV7MXV4P)gilx6XYTuu!}$=6woMc1oda?L3hrI zDnx)S=L`bn9axThd8>yBe0AsP7XmS$JX0#>(aT%vjiP2-4--S@ZqQvO=$Tms;-Rg9 zp!08gFasJKz5$@{b>P?d3>rQ*;Me#CKC?){gXY%fM5`A_v2IK*9H{sZ02 zpcx{{@It4DiQ%;)_^@`+*y;wx&-{YT8lbk63%_79XqVq-e!<-eAOU{C%_>X`4B!oS zwSi!-^MRcCvKtm@ki(h4NBMx_FChBx8PJwNl}bSd&9({^;9j{CO8Z=PpKHO5@Kv0Ukzq) zIClSZ?EcXG3hMW;2HUGqNPgEm3idlZwSoMu8!XE3!l0Xp;kC5~B##)M>^|7~pWpQy zzw6OXr-)9k7?1ALomC+(xD-Ii4(#jp0I;tm0{9tTeC`7I8j>(TTQNXGSD;gd6i|-@ zasZDIg5t}7U*i)fzCdTKfiHSG$=`AfoD$W+t`&mpyr@0`axH($ZjjV|$ZmAdhLq|c zQHB?FU`s(+0QuxHP?!XGbc07)K+7_H`1Ougsg^2(*a4vCkz}bjB%NU#diI%Lu-eC? z`!eXnHcoaWK=*U#AQ&^u}~SrJpbZn3TP9Uy<@5__ zurZ~ei^ykG@H4ywoyF+^8cPLbQ#Vjm3NN}}@^>;ZG*_!Im4M`;P~|>%fHEiKc3H@5 z1M~tt{+51l6Y2bm4}qY7=?C3U_~J+`==^)g5LqYqqCJn++aA5%4j%k2Cp##KI`^^fhK(1y4Xp$Ig72wLw5%3}&1$?);_cc8pudm#+uIB2#~0XvSr(e1;0zH4%?Jg7`TZh*{A05?E*AikUH z#n14fq7|3#py$&=+8-X>H$hF1*4ri44Yr3vK%NtX7Xu<-|CK00Co(?s3l`gWfR3v= zPEEMx^JA|mkc(sZI8D3_B>Mf`= zWV|07{@~!B-~pPZ1z)CPtAOUj!hN79D9MDhI7(bRy1fOuufNz849eam@=%v|R%<}r zy#+Oy_3|<}qa;tq7ADXY99fWJIoK0LQUxN}S`7B8nI}KP3qg<&D8j()DQLZh)cyd4 zuV#&k0Y7LBzNQQ45Yb=YCP?e;659sbz+lu6U$htO9c8GyK^;S9&|>>)&|cAE3#ca! zK@X+;Qv`O%S`U7P7ah%@pkn?Zw%U;)rFLy)=u-9=!Q^0$Je!~2kmKHY8wpfh5+&pCpNO*5ZvuvJ7Ay7Zfhwn`l8n%mMPuTsKb8v8tehn5_!HDfqQ3 z=>E?JP)xk)kbJt2xBf5T0$oAJ3c7+0 zQ3&Wj^Ur>?LO`?|QgEiAR#m1T2la|h%LlvB9ppwOkPv!yKLgJ13f+f1x^H%aZroVn zBFf;nV*x9J&V-ujGs6pIuyi*_&Zql;kM==Om}+`9{$MyY%eq{__>yP$0gvzBJ+x1G zGN1711S^Cz8Xz?gWWE_m1RT6z_eg;H3kqT3j-Yd19l8aL4|sHM1P$JTIt-mIDjA(F zDhaKZN^H6hsWLDyK#!}}gPv9|4?V12yzy5g=&X8v*irT1)2d%{?F22Hc+Jee?G*p| zZqT7(pcO_5F5R0!Q*59K@(joBV;;SeK~ntdA$P?jzwk&t2-*nF{KA8IHE8ngh4Nx> zv2Fu7j{U4lH*@!71x5yj?rs@I1_sFBpNmR{MV=kQ~Dhe-l^MMXvIQQZ( zC~1Os@OS5^RDkBt9pmET4j*rX<;la~00E^p@GNtHNB2%p7=T@C4BkTuHar8gD$W5E zBGAxr09|qGqTrFk zq5@j}t?(j28dSNTe*wzcpojt;HUPN=0_-#}0ZDHlt3ey~K`rS9TXtViX5a(Y-7liI zgL6U!=n!}Q);5r@p=Yy~aDmqOO8@`=|Fs3^GB!{_1QGlG@BjbTDzKak5qk_ecU=Hf zr-E1IG=i41fb%mr(YBr}(R<+_&B@?#9DI^J$Sg=I_vjT($N}dXK_~D5XA03TpVz?e zd@wY66oNZaE>d`Cu$sOF5 zTkpuv@S+Q3csFF9kw^290LXer*Vb=fl@}l?TR|!lu&M;@1FC?X_6s`L0ko*=Ekv6i zNSkI26T@p?Pz_Shy+sAI)Ti|u_)tlx*_t3lEFeY7-ORRrVTMK}X10D|MusK&w%|(} zG(38F*SLf3|EmTSbD(|r-8G;~56~Um?ag9*0F;6qy1~~LfQ|t2fGn(;5{8U(gvEr(gIoGcdfY1g!(; z&KB@!-V2^VDX{`23?o-iqUCRi2FtdBWI(yop|eEAz_!a44kQ@#tps z=#7*BFZBE6)BVxW(t(A)^&SK0%(xRTSQR-LteN>+K^O9M`?7Q&Y&}^bgD8wjJ&+m@ zEG5FPSwV9ApmR5Vul)c2|G!dYu!0W^whRmg3?*f@3=9qoCHb}t3Zpe zK(qowi3o^JU?|}M(E$wnt)PK;&_WSzM^M*?zXeo~d-ldjbW3}5pY`nC2WlXI(wKu| zx7mv{Wljc{?$e;DcF-*PHIT+2E>J-RUh{VYd`_GTXcc_7hXCk^DF+GA*swn*r~o|Ye$}O$-xXBYhl4Ms*w_hL;>6$b z1XN~pgRV??@$V}nOyQ3(NUEIRwbRE86L{I&te*)KkW+Eiy>e6R-vO-VI)jtV64{xc|1 zc{CsKaEyzOjXwO%m4T@Qv|jQ>t13t-e~Z|E(8LtzM6c_hbGAU5yf{FCaQ20g11H1F zZ~rjlwKy0UUV<+21tt2o>Fl5p1Go*KJYxb1?Jv@t4Ba6rCLj|t(3}BDxeyXmoh;nAUO}0 zP8XGc&JdLl*VY64EjEmhX=>0-Jk7N#jHQ*Z4L2ag;6=s`osbX*`N0F!R{a1yLLJnC z>qe3T)kXm>-E1D+z0fH%15j<`05SC92l05@Z%FoJUb`4@k_|NsB;D9A`q=Zex;;9nob;gRgc z1B;2n9{lT1fMO!;#pTDKUIi#7z}KpTce_g%e?#>^j7kKkHx+=_;kOyUMH#sMxe6Mr zS;Yb>($Bw0dJGz)0mTPsiL!-fceaCPcd-X3PU0Qoz^lR!gU&OJ0Ufnnq5_Tz@W6mi z_fF7crDyjCmu^PzrAiN7TMv{-I(8ob71Pip$z^=NvHQfqpB%3_Av9=Q9p&nxACRky z+yy*lcrgF)WUiM086)D@2^*VEONAolvV29s+)Ox$b9Mp7% zOab~PfAmOx;nRH-d??)c7fh`D44%pE0-ns@JeYqpzh*3b4C-)!C+r+R&AR|lSENKG z!tr>E3ak<80lKs~-Z2I~NRC;)z}x08p{0uBHpUl6#X##$`CGu#yveQ{#s@%!M0Y3) zC~m?MBFH3GguOAXMZyU)Kk{D7!J12cZQTT~#U(=VYhg;M@ofXaVRTN)HG z2GF_!RHlK%5%oeSE$f9FQz0=-UcIo34-vz8pP?~K>w3ZUKBy5%N)!w8;f!L?o-|NN z^xz)hCdxTB z@(GZZ+f0xi7swT5pnd^ppa|4>01Z;Z`UW1|r%Qxfy3d1k`g9+AG3)pL|F5gz9YPej zx?lhQzmA7@3{m7R{rLa?wX;Wew!n+;7N7)GV&c)=3YrW9JI<&3TqkHE3p9j(_Wy;~ zlF)%m=QwcJ;EOS6|92i};1XOGf|fC0S>AreAsA8vgU;o4?SAOn{lW(}!NT7Hnjmhl z<*-8v_m~xsa0g%Q(fYPj-lJFah$T4O8$njayBYuV#H*=X7 zURQZ^t^uFH1G*Ujv@i>FY96TPX%10&1*CF4NTmm;j!kgs-UGg@z_s;1xbGrkmL|64dv!vGt4$4J$GA=;i%yA%65~ukHJUF_& zIUqgI0LcAr5uH9NF`zxg;H^pl;7!FLDgiG{``8(}eNcT6<*yN@xL~YSO^9`wXaG>Iu{AVVE|yU&7*v;b|SC;=Y|12Rto)M!%pf8iw$xEsnV zug%Z!^7lVbC*tMLf1vJ%=#gk}@+&puXLu2i15SQO-am831F_y-40QIm%xC_{M$qz# z&-{XophLzEf94lx1f5}tApvPWcE+d(fX2}bKw~tJ>)>99cW^Rve*lFOXl)^ARcL38 zio=Tw?f?IG{{RVtF05H0d&TuBmeXRFRssq z9J&co>(MJZ0j%PM;T(u4NEyuB^Dm_5fJ)xeFCPB`ZTbOSlZ!l7jB!DnNB5E7(6Dfi z#y6k{^XQ%lUSHGw(x)>)!l$$1hEMNKP*2!}U(;cQ3%_OnX!B@{ib0wSe_nJ9c)O?q zh@Bka${+p2l|TBnr}h0(exF_k0gv7Qju)|Y|Np<1_UP^eZHfR5ytRNYMCo?q=xhP! zk8bA>SK}w3$&+O8Q4Y~LKAp)4tp`d&K`Zh_8RI~g0T);JbS4*g^j6oT@#jHI;19pV zAAP`;KOA&O2U{9{UJuwf&=LV3{^*m(n?WP~pm6=nFUSvC9UAZw6nY@HLM#SthH&NA zzv9!mMFrHC=huX6;B(~H_ySti06JaEMSM*fybAUA0o104?a zg8eNhQGzZNVYRRjW#HF8SYF1j|GnEe1Y{e?CQw+HDK-CKDpdl-4c}*1{ zx}aU(2VXpX!^H5q1Ek^}NCi7c#bKAu_K1LU3CMY%Q(f3V&g0bp zIS=Ig*GeFJK-#@4KsJL|>>%qw=78eXwNuTNU;mK{zlIO!g1Z`(0?;8Ppr|e5{>(4H z28xFxubKJ754iH{-vZ?supAdC?TCY1bQ!c5U(AtTtR3h3r+@2nz-<5 zq^N)vD8;CNPOl6BU$Ew)k^s7Y<^uSVoju^%qLc$PIN=W7d#u9-9+^Gc3EJY!-s#Np z0=#P#T;aa>0xF2R&%UT}f{d+Parpn=qwxqRQ-ZIr0T))#^#O>hLKQ%xK{uhdSb|2W zK|N7We~=$k^n#0WgBO-H2yrWB53La?HP@}1X{tA#-Dc(oLu8Byaq)8Z(@`H1HZ;aP_Tfuvw1)ahn$+* z4cgfD0<`W2)M9V|OmdP8gR+F z3lu@0`6G|L$N?X^taAXgXIFw+{XcOU-W^`{E~t%ct8# z#Q=Ore?Mr%!1&UO+GiXL9^GIKp!Hbmp8fyda=RqC+fASoZ2oIUkM8-P{=cO&ONkC7 zf4%sj3o^3A)}!0C!lV1LPq!Z^7rJz_fu>kX)Ige@S-M*zm>3v3ojE|g`WO`pP=gjZ zjT#+z{T!O#ID9|@SfDu{lrtEb-vl&U{`c%Y2%72qSd!hn2E4=8_%^7N0qsTtwE;m* zMNpvt>SBVf7X!6NyLsmMbe{knJKhbxhsOfcL^AN{Oi|GQ-N>Wx!kmGD!TNZqG^mdW zYHE1=KMcB(2h#Za&0Mn&G&wK_T)@C)P{89aaj}s7yx?J%?t|Sw`PaLs1a#j5UHg0p z%>E48X~OA|e8GudkA;iBs}B_Ct)O%al5yc=apKo=;bN((EG-A!s$=fa9iox}+U?|` zQUKlm#+z{`IdTv1Y87I`1L^he{4&wyAMM)%Yf`m0PP$)4q-8e zs6==qpYUMzQHglL_>qaB^#H%?Z;)?5Lxtdp&+fyZ(gM1&3p$<@3K`Y|d8@$H_^oUA zLs!r}1)v3zF4m45B|;wEo&lg@kMl(g11Ez|XLf*N_up>F9ciGQ`Jj*kRrH|1bg|53 zD7A92%w;Jx>2~Gt=q={4W~wj}Fcyu}kfTs&Uiu+L8FZJRvjJ#8 z1Df8Rzu^Ea@6v7kU!uw{;L70B?HmB=1|)cNdwaMVp9CFkoB%RO;YH0J4u;ok8yLZ3 zv)x;uL+8*l54z`o&kFQtJ_5R&BGxe`9(D5oG(RDgPmn2W$L^PopwYok-8UP-1Jm{5 zB@T@*!Es&E!OxOJWj3L_#515l5YGB9=`@17}2CJ%J4!r0kjJ1 zC8!eH1v-`h)XN9}Pi((PItOYPgN7vdTR>NwbxMGyiVa*k3s_vbj~XB7Ea&OI*6GgC zeHs)p3Z3}^FXZn*W-UN{`xio8-~NNLgMml)i5Fi%Ls*^e5x*&Cp7*Bjj8kZ zgL?7&EubD&<7==NLK|O$z2MvYo14ECRFL<&F?NV|I^9(| z-8Fh$8E5(=AJaZ`@rNV-`h(uRJOUn_{uZEI(|z0%bVvLtk4}Gw*YTKUFdyi2SMf+b z=E;1>19FuAYfET=2|xp^4H96bLcMN`Ad6>$>^b;=sncD-qx<-4F3>QGCIbTls9jNm z_114k)GMYzxy~Tiqxp>jxc}rS@nRMzXu7>UUR?YGD!aV{UYr0kPQOq%3+~Iq?}`Rh zST5ayzTGz*8()D#O2x796*#D*9h+Zqmxwwx{`$bAqEf=+(aXC?SCrwUZyXZ?=>BUj z&;lRJ<|-D3QsZt%9!n>VQtfU>0ZS*IQsr(Z7XI~)3ZUYOiTQxX3?JqLKFp2=zMah7 zjtY*Qj2jpad-U=agN*wZ3+ij5%7I*kz@YjRc{~X+y5R^aiWGd3vp9_3dUpTt>Hg`` z?a1TP{mHTWK=)Vv^-e4v$u~TbnLLzO@255+?fVntv=};AA@hQ zJC7&xAIEM#9#7^Q|BqRJthooe=)1tN*MZTMf4#c^ID#Dc*SoPeGP8Lk-|$R6;K6*u zvD=NqlQ~}E{{gVPPx6CaN5+}H%uhhk*?OSP)+4z@r2=#?jxXqDO|X4R@Aw!TyWM#_ znE(Ah@c$@SBPe(v#_>RnvVKu>22=op2fL9@Fi-$Z(}OD+HICCObiUoKe_o^+dzk!C3Cf&ES0tN zVkwny>GtDsvGn37<#Xu{6L7H%;^A)r^}b!Y<9Lk!yL3D8ID)q3I6*>{L+It4>U_qXX4ZSfnVMQbbahG@aCGcFNEImG593M@%S?Tb?J8I@nnAO`2UEj z^@Ex_p!yrsk8tch;L`ovk$?SBpX48oz0RNz{s#)-?i1b4EZ_j-Uw@*T8O&ln0d|6$ zfJgF6&;-ScZf6dV?a*-bNIn6I)0v=RSwZ`dW3Mmc#UHH)>LNhVt+P^FNRa9seHzI|AeaxN*!cL0lK>2Q|mx&hGVP1O?wj zpj?YR`JAjX_38eQhL(OVy#l2lkO%&{bbIr7GQR+)pNGil=O8@sI54{KuXh7wXJ6)j zKFP%#7k_yEKh}N1v-#P-Zf6##hmn($XYv8&lc2=J`~u`XP+9_e4|FINXhP8uR8xSX z<$zD}1K9ZlzTL3&ZS)EnzJLB7_zwwRNOphG?F`TDKWfgsu7*zjDmDHDRjT|gO@IFX zhfWNG_LgXBh%&sm62ZjqI=I`3#rQw}dN&21(IuRr43{nEAj zyGQZ|Pv*}a%!SZ0Avr}Q16&|q1x>#*z63>RIFBdu8&G!hWd7v%|Cp=whnhPs-O?`I z$t*72-W=Wj0*<{!jG*2^K{qIR4>j6@Ld_@nLx~h9cYtD~`$YFKa9n|=ypm7)Fn@IH zJ^~g%mT~Mp3>JfCE05%l9?azuApM@q-+Yo^xORUBXJC*>>w!8?pX3yk3WRfmUVusm zxN{xQPx2NOP6Q12p5(70E2(H6U9eg2xB+mXTE;$rNqHU0xsOAAbMeXKysJ)*PlE1NWz8t)c1!6U$Hwf zUv}X><=V;R*?fp)o@*>j(`9ELleNuO@Bdqwn0hKk;An+kq49r;VIIE ze_IVCNrG0wcAo$zOGoV!ojxiKXi3wg15{7L@~30>5y$^$KBmzdv+D z(b>zRCBK3;+6Sj^7_0e8t|&BIRg((2?K$;K2tRj@*aA`%*R}}q}0mEZj;s5p1wJ_Vv&xlcf-Q?8xdo}epHhr5aY!L=ENzd^CR4pv6WG{1}kvBA}L zA%|mkCPuX#1C3|U&^j3@7qlZ9 z6uY^e$;ZL<^gh>aF30YJ;0T4(y!`9WgR0?!2VZcwbRTj&_<|i)?>ZiQz`?)%^!JC3 zpsiD&IvrH=g4QoH{CD9#1iIiJqy$_cyKo{3)Rwn7L@qDKLn*eNM#Dr3QBV>%!gd954!TZgStDXUHI4EgK0VC`2F$0 zm+aumRS;IWKIU-bzI6~p-Z=P}gZqYKryQtq9d-O@$U_omH|}Hus<|;!4yY7oz^t8-$BZ6@Ggf4Xy?m?e_M!3fKM+AxSi|Rec18; zX;6v2l!1Yv7gC@zU+6w|@E23_1LhJ5(B8yE5aHDPgRw-}Bl)OrFH6JgB&fA7eL)MQK${vt11HeKM?K&pCx_D} zoNni1nBB|A(A3Yzuwo(~LtGahga1@M1_nk}CRSEfW>yGbflzRg5jNrt8gCJB>F`le zKt681`Hcf;e+X#u(s4hiIPvKYv~bb>;mW`5p-=ZspYBsGoqND@KaTv{f>;}VG4Zz) zOEEAs{9*xLljO$A&+uZR8xzCJ6{g@)@ISbR-6{b(j!O4M2Be3rapw$Zh`Ois$QeEc zPv*1#A3AnB3pjRHa?Et>j^t^6#LRpMv_|pZ4<=|2M*DoHkBSN;lEKmIECGtx?!%xF zX$?rcnwT;$^g^0p%!j(KAN;}83Axe=)U$^4Tt34}-XE}%_b&qj1E`6p0*>tUj@=fn z{M($Q9Qn6-$+_}xi;{Hg4ifP0ZaLa;P=mok`MM+jwk!#c%dfyUzdLH5aP4;D@lig` zzfFV*T*x}|ufP8N5hx5nQ;^-C4!&b&{@~r+au=lk@;k7(m!E+sSUd zE2889O>}{~gHfO&2-M~ST`veKc{IQ!&uZ6h&{ilfSx^BZ>B_&Y3RDJFNjP=~@xb!F zr}723>@-SQVyHh_vMPvr|xIT;uJZ8A)r2ssW<i8MQTseNP>@2?k^3WBX+9c6 zpoL{4A&8*cM!}g8mf!xL04EmcZc}aQr7BSA8S@)bdTMmXs31zvkH4^&pc=>}D6V!J zs04*@Z==APxISbMOEf>JK57f>AHH$&5EKnm4)IM`$zG8im z-~A%<3y=t?AhdqT@BWhc2Dl6bM~S2MNl0lVbNLZiKpR>H%E8OPbKI9NzXg?mvX`H7 zUv=aT5^?MlfVI+)^Yy65u-0~?F$S99#FZ4G)jl{yB8mx6?xHwpf(nNgc+(1!pSx>R zz|ESM!haCuLnOyc*KS81{%w%Ogx`O5#;Cx{iPKp6cQzeJ_klTfA8`DC!UbBmfeH*4 zbq0oBXYjx*^P%p`*!p|NUmQt|DzX@9-SvD=>P{vPODW&ZUSz>T8s zk6?W~aF-8KpUdIs=z)p}P{D!F3~Qboe8mnaCuE81;9UVvctNxv_3q3)n~$@=!g*m$n@)+92;6XG$K;1eSCXeox&rmsN z(*)EH18o!n4ePt|uRjl}^B~2~Ly#1xOaXJde>r}Cc~^$&h`&|KGPSN`?) z!D_yPwSZbHV6F>zuokpn#Bn#MfrFS6IOS@6+Lhn^H2?b3j{NKIL#G75tr(Z?L*E~R z<`F=nOuZ}uj@E}A`P~mYYM;CO9@LbPx%?cgPWv3Rb9eaxnD3~4hWiIfEBz<9b>-8m zdo<+Ze@E^r5ywsopP@Bb6Xr39j7*q`$Y(pOag)fU|~klx`-Mx?%KA!w$dk_X!aQV(RS3upnK zvxEz1zztNcf@d3!Ll*FzmVr+o^~x}HUpx34yf_N7Ab=6n(ggKUL1zwt76gPtr*vK) zfRugRR~)rKUDCtwN)RHhkk;K`+KKj`F=$XUqb(jVl>CG;U) zc*o;BmW~ID2V`Q&05Y+3TMA1P0n~RwG!eL&p-lwPW(Dw)O;+$~cF4$t!|U~q{M*4Z zOQ0r!mn>*z2{tN$JhLPP8eiZ5b>zS^OB~o|mO$wd+|59rS&~hI^f+X2PAwTgrk0TU z8;4Kl&R1Rk{=^*Lym zns&2^&^X6Eod}I{P@I8M4mi$W2>=pzve2lPfkZv=6N-f5d|3G$xdVeS>4YmJK%E!{ zSSJQLEaLETE?J!yM5zQCIRSNE9L2DdOsJigd9acx3)XotgO*I7&WpqA)vo;8Au~_I zc3LG3V_qfA5n9KlVVPM;bG-a8&5`>fW>Gd8RA`e>qd~>MfS9ct*{KTJC?{q{ifS1W zRJz(gC#H}a`wlNJA~p7*%Zk8L`^2{UIw1quphEVJ0G2`)wfT1dRJMW|{ntRPf6xfg z8>Dqb4zE`rmmGt10w)c9YAOveH!Xe8mJ$V2AQCOwDLwhcu<1@X#{T| z<`#!l3_@F5cxS9A^DwCJNP#!aAo(5MLi>!=LL+_R$^*0>9DTlO3J<~gs(Y|<Q$naof4kF8jV#3 zDkorQ;e5jNIGhtNkhzOLHkAUS*`b$AOEL; zrnS-_Bi4vElSi-YCCkxZrcN+-Sl|ifY>UxgrcN*`n&Sy(7W2_yrcN;LGKB^+v}gVQ z1WM_FG~eZeWxmVd;xfq|#it4?$$*__tjE)v+$zhtgcRokY@HI~hHj z4>Ccf!G@U~|Ib4_P4&=f{m@0Ue79-(waRdsuHeAH%B! zd<flO-5dEBns@Ut9Ny2zU~+_yL2(-&L)$6B`e1w0Ks0E7 z8us&CT+q*R`G9twi#q74i(cL;Bgljxqs@IjhVChiD)&L>xm^7J2>Co0wEh1$j&pI` z32H%sH=cnGb&&!0?_lS-ND6{>y5Tv`}CEzlN3$SDBMueZ7KZx{CI zW-b0K$>7+1$m8G(uI2~wPW;<=AUndKC$wxoc<>c_8uN7*{_Uq+_}8DUq1MX87vGr zNq`CBWvJV(e;T}QvmUH&bNqkKr<--o$H5qMpq=n7prbHAhYHC!ztjV^zyDypa6i+I0$3=EFobIf-^M?MlfdS#qnZ*bw?&g{`G>iYo{oCiD(zF=*B zAP-tYC*at9p!tEk=fM|Tju0Uc0dTqoZK@P-1aFGxUw`fUBd{Q7c)C}{%GLUYE5G{< z7yk92Gi6{hZoNE4uGS}9`Q1-IkCOrG2J2zba~hc%T**KLK-uL`nrkPsXY*kusIB<}V(ZV>1L4=K?l1K_@yiKbCjtz67cbKnI{S zKafvzQNEbwc<>Rc8~-*Ih+-H1^+%D86iajAzU0imO@y0&{WX|sCh$HAaN^{?l;+YY z3@ySzZn*t&;N1{D&~5;?Wq2>V7{H)#1+`h8fYK}^k-Y2zvB7N?LZ|mQz#A^0bMR0b zEOoTPaVAh31yp|Cfv4V&u-1x8w+r|fJh#{DT=}=N zd31};dJYOTP?H7Ju!l8Sz-hMm0jSOH%D+uUz=eOCh(PysNB;E}!ATs{G=a8Rx^ID& z^S?$c=fCCHeck#7zxxeG{`HqYEfug1sA}*^{zu@I{JYRr@^@c#wLay_?|#aWfBj|f z`96?F5%@qL)P?+q9QoZ3r77P`12uFUxo?8nIba@B8uyJf$WcF_QXAyKozI532X8zb z<{te1WQcpv@&DO0oT(I4@fAQPUJ~H>^CdU5{pHx5$>G>t2stAz0O@ccmu_rhWKN(( z;UOv!paC*)j|X!8F>I`in~{N`*Ol1?(%I>iVLJF5()f~x6ds_iKZsS559;QWSb8Rd zM`B*@cj4cD+>w9VAy9+qzzb$ro9QrU+zZ-<0`=QLO(yWb*FdQMe>%;T8>fpvtF+BP zm%>53^ztQW#Wub(jAozZV^F)o$FS@gA4A$rK88&f_!ySmC2pJu*Z7b}^BV#FZ7wPW z;3I#vL4%Gr!H4~xf}i)B2pJ!WQh<&Rb$kSm4;6gGIzCjRk^xH-pcYaB-s65{JP`d~ zSbNBc(D=|N(6A6_e8>mH0F4hVgS3TwK|Np4_z<^8H*54mP#!($)6MGnP?Evp;7iu# zhxYv2co@NjKmYo(;IjoCn;*)19DKnIIu#ByVC2Gl4b&WBMjlT(`~Be#(EZXNdFIRf z+fRXqlYTHTq$!`+0U9exbK$-S8aZN2b5Xv)zy2)P2FNhcbyy?GwNn_{a0fYV-vgNA z);t(=j#Gp?j(?Cj&hh^_k8ak+`>?>vzdwiq57gdj0JX88{RJ%$yW7cPKWLc8wcC+n z-=F^s46cyVHA@h=1bhTBIGcd39YAS%1)z)>`Si+oq#^RlQAfy$n?m68v0=?G70CI+ zf50;ikW;+mK-1Qs`~upB3Eph64cht&0Oy!3j{Mt&J-S&n?@2OrpMvHT7yfN5jNOMk zx_PiGXmnkzTXG~n9$gumYdIyMvlYM>N=((%ie&;|-L!)3xU9P|`= zq-rTg1)SgD#};FpLhmub5q|#sCh+(W*7*v^7B|n3tKICbV$VM^)5&L z?Lr>itmkiGO#>Tlp{4=;Z6aLY{KR}2d_sx~^HJ#0P_E3Up(jYCDPK=J_=q*lk^6!p zD3d5(OFQ_8In9y#Vwz*8kZ1EDCa9g!*zL5TrJc`jV)f^Vn>6%iF?Ksc$hXt+|2aIt z3+`8|z{Z6{oL*i+E$89M4l*kMPjxP^))2ge2h9o;V3hFi`ww9A0Y=dAA<*EYORo*& z{sYL2GNgQ84{8R1%6A121JoXx2rb{i`Qr5!SN`qXKHaR2H$e5~K~QrCxp{N?`$Laz zRvob9Nl@tzZ3{I&v`=$Uz7A?3fs18$+sP3;#RhKhfLl7Cc99GBCI0ni(_EAxMK-wc zgQe-?)6Kg3Iv!Un1547u6{cW|aD;^dSd!MRaQuJXr<--nH9WyF9V|&xhk(Y}??B5^ zaB_LsgqogF+bu|~dl&v~DUfos(?ul!o~loD@*p2z1)Bdg0nh)!+AB#&!$r)89J?4gEGoXeCT`&L3>rr%yb20B&_EHlWA_PA$^{Ly zH$SuoHB$t@qeLFvtie|$89;+YjNPE~7*2vytP8m50%n5Fad>#}C48{RrI$z0vHOgR z^$8b#chGeZpxNWAV5QKb9KdHtA9DQu2y~KzBe?x?@D)2)1^7hhL$3Vp;3LRg_}AZs z>H*n;d?GYtxX4BMe469IhoA<}3DAI%i}E=TA2hFgBF(jv&$Ia$Y|NQUw8WwUYPbb}GW5#_zaa-! zLmO^|kcJ!R9s<}%0(cMsbRdf(i>o&D@&WMS)fv!5Cg8)X6MTAEJfQU_>^=g}{n3ul z<(}R4J7%12a=Ba_Odv&`tYphZETldnZQdU<_T@iBNbA4zbG zjgNlW|C*7(qjL>-Q5EQ%0?-xB5ukg21AID5R6Kk-Yg8P-2V-lz3XTLX3~wlfR(RBRn^i;LNV`GiL|_y13Vu2BOYQF~bdV_CS1iUO#Lg0#7GVQa!qg6b+zn=2K%CR_({#*t&UhEFfA z8t=#dpaat+JbGEBco8c-qrj&ed3CoO0G(Lmp?np7kOBX;DoMyW*`OM%O4>*HDCqD+ zaP`8!ehN4Y!KbI)1nG3?{^WS@9lI;@S4YShYBG+HBMs!R9%%quMeoSJ{sQ9EZP*U? zpCA(dAM^Broi{fdv~`WnF2kPO&(&32$Cs|XvX+}&LM@k z2$XEVE`qp3{_-Oi?oY0W6Sxf^A$x`!60%Yry{regAt8%6fgDH3NFg$ELv4xEcBy2d4!Uip9z>y6ORM4qW%vT}7 zA_Ivangnej7bIvUJ$hMFxgbG{ID!L5&`LpqmV-dhf6OENa`iIU;xMRMTlm2 ziO}t$q5wMd?EeXH@eR5u9MryOg0Ak?aq0E}AH54XT2t)T|Nq^P)!on<0%?OYv~GZO zT=3KlI;{uzTeeH#uN$_)>IN0iSrVYSVKTICfE>FEKf4@s<{jw7-6Cm6{%utfj{Mu4 zK=&s=Pqy=bZf66X3rV1|$bQG0(9(NCdI37JM+T2hy45 z{M*)m4@8G50k78suXzPsXv4q02U5R0?1nJFwGJqYymGXD;mGg)!i9hRNk{A_oWmCa zZfgOb2<5`R{-)#i$B^UkUL(n7fw9i8h_m#Q) z6s!t#h8t*V%1a)xe~9}9(i!NE+%Ld&2t+j~Ahl1RoS660u~P$-SinieqgS_w_2Yk} z9tJ~xs9_q72in8~xL605OW+bp`vj=oa=iTV{|QjZ4!Y*Sk^3d6 z@;#9E)}fCu8B^%>+Y4jlCvs49CSj8TQm6H@p8EgcKddndIx`lc0z7{L>Y{*( zGtl9$%oji`P`eX4r}6;A2RHGpAG+|nKV*IZK7Sq@Lyp>zt27`j4cPg6u+!(|5hr}W z4)~CRS5RlUuR30S;xgpI z-#CK~RKCIvMAGQ4Q2`I$yu6OlRRA@cK}80*%Rqb)>(U8nM}vymMm~Z??PO4Y0W^`9 z0UJ~@g?1buMeS18ZUdiQ-iyCJfCrU8Lmx+fLHvd}^x>&|4S7%rW$43K`535(bl~51 z6mdj}cXtbToTK~I!ME&?=C|DCr{FpYeJ}}Bf`Up^aD|320jW<8i8g3IPlo#yq=1II z2z89(D#{oKL@R871FTg9*)v+;5h#c%`OA;EUqS0lSR6r1T2M$W|A`2x**`}^3U^4= z{y>CO;g8Xff`$}QT8jP-2_ev^nE!W32w{$jAtzMurDTwUX~Cmn&|C-0JcxXQCFjXP zavt`PFmSeWvz z8kmFKNx;9&Ndi=cfg=(!c!E4W1HYXBHa-I#!vU3^pw=$nLuvMM4D9w&s~ECZ$Os~+X%w$HE^{4 z;RwCLz=eN3(C&Xh`&cLl`M$LF)y;<8$Esv@+nR1!Y|q>l-fo?l+L4 z2&$8qcyiP}=Ll&#$vVP&GiRYuB?F76{7)bL!>=Da=gNH(5=-*X(|jDY&$w{khaa=< z!hOTFQv!P=f#U#{aj-=aIDWugWJKg3=PY<6VY#vqoO?j?KOf17Bv@R4Lk~130lMS+ z9bzE}^CuVU4=()fpiK=Ju>{f#iVUb`(9O-@Ekw9413}~`upV%(LC;T)unR%XLh}G< zIuEQ;8+t{E{N?AcNILc5!+#g5x9JD?Q)L}Wtz`y`nKamOE zp2N}rJIki~D(EPiZldpQIEMq!b6X=v5 zNKnYaCOn|GTM!>Ypp|`P;B~6UKuZ!{YW@5F->17q#bE=ZPd8{)MR$ry0Ay)MH)QDr zY(2(det8DhPkaof|M?guu<$ed=HzEc{lUi&B*;(Fed&nvXe2y9*91F;IEFfgIfjGw z8$~$o0o99+-G3bUx82nKfp#X%6K>E#58h|5Km2#%-`2t?p~w$9lZHVNw9*59CJp2u z02k1qH1LgRpk=lm;PpZez$Z4jYCi|B_+W&t6!Pg6>EM@VaO{Td|4-xrZC{04gx;&e zpiaBOpe_L4!+>v-*y6AsPnHs58739z@_`t!50EB zQBcJIYQ8a_b3FKvH-(S?8838Yj3PAiBe8@Q2&ynE(2(jI)5UeIwW z2VMBx4}v-Zj^7``8iu_*M%E`l3snz3;&26R33$Ze!hI34S%ziQW_TW?O=$l==Xek~ zz`=V1ctB|oya%lLSAYS->U4$yi=^rET;njn8biz?{SMwFteg#iR$>lrt*gGwtm z@HL*jCZOev2mc|JR(C-aF{nnK1Y-PREb#`fXcTFBz0a|m$(4Vb6Cxd6V7}~VeZ`UA z{R;R$UHG^8F@hTwF8tfX9QoISj@dd69U^e-KIZ~D>EeOoLBvrP zF3h)}!vnBEBd~U;mhQ9QlPeyAH!gsy9+Zs>2VMEy4?6O%2km&c4%2eV@%y8LFWEt( zODuwp)(0IyY7Rc;aOJ+?cJpNAQ7OkvvF?{h=pGXn%)fGw@RX0BEfUUh3}wx?qrB-T~?Syu*%=>*qiV z`g=sUPl3skj-4E! zfh8-S&nZ2>T_9mfO=xE_4tR=Cg_XsGu)EkXK0Y( zXK0Y&XYdl^XZS8pe1FR!G%Os{y8|vj7U(lU*K}uZsw=Dsi+3BL<01^b5*y*C;;@Ex4qjQeR z1W;Z2lApijKA6E+qSE|Rpw!Z_v66#<;XgyEzGHJG$lJ2%AOHXN=w)R{{r~^9pz#5Z zUfHL6{{IK7`@z8A!S8y*qxE*FI83?3d9ZTElK=lb_+4(aeydCL>D&W85qN@6uZxO@ zNB4P;-q4g6?{Bj)v>Yfg1i1|q5FWiDDjpp!Dh96n+s=RvICAYi+To(2;n97z+eO8t z!$n2m|792cZ67?Ej|+G-zhf-j;L{B;*ryv3vX1=Qj)BgZ1^Er!FNa1F*s(PX4E(KO zpk&o6%e?CUe{d25?aDx4Jm-BFbngN0wD9PD>Cz3^Q2@I{!Xx=sulxVzAB<(78I2|2 zkaYn~=YUqyfX9nK)4s30LBpRQmw{^+@ODs;2uKl31Qgfscm`=gNW5}9_?G?qLs0E? z@HM+j_cs^l?Lm&tR2KeY1g4Pxm&j@12!Y>e$b?$Uh-siOxH1=YB&%tsv$KH&KNu=_kXEI?_V z`O3kU65#GXXvg5W?++dLx4~tZuYt54d?ew*eF&T@z=H#aTsxiqG{0u#Z>{|Q|NqN0 zX$A)JJa2>3^OYda|3vZpe<=nA@Ch-9^C#F{KrNze^^Cr~^`P4S0EVAmNb66NS_1b7z|K)f8>&n0W7*e0tsh3B}`YgZuSy#xRqu>^Z zk@Zo2_oD|Na5!=wI{1Kt`#6X==-BBF36XSAh=fRy8zLknhqscTEH$n2a;w_G=9D%FkAqqmF&l*1hP*Z*TTUI8ZX+Z*>Nx=>~CfgAG?M_vozz1siHE zmlS7UIQWdik^4*cX)yg2On&Y@_IdToKVl3Fj@CE%TQ9;&WqnwwY<~?>DhoJ*OXVNP zrLsqNtprlZoP5I7`cSE!I$i=%x59p zW~@ass9TM@Xht5lb?M~xWWEJDu8hC68We9QL?Q7;>p(~lg{OC)UK?;&fEvfh;lb?E zeSv>lHDdS&lFUH~)bZdeiSG}=9YSy_1sB&cN-ownUHIK^VkxeF^1J_p7R!z(+Io4k z9Ia0}^1GjOQ@s3OPB~ao03TZa~l8f~P7k>8(AU&>#L)sj>PlMAu zs04p_@I5;uJs*S~=m09me>(EJ{{-p6bDjfuSmfYi4oB`=2Oo2A-v<#lI^{f>zeAF@ zBPe;&}CL)3^SP)!_d-RG-1&tg#a(@Ar;?S}jS|4^AdN7{? zIj;2UOC>=DhVH|T-9H?)4?1f9>OS%PCcnpt?&IHY@OvD$KEdDmjtw-uE6?Aq$OdhP z`(A*Q_#TiF-@p;69qxlt;`48t0&aFg?_UA=)zDS@0;uh{{)9*J#hr|xu`ke2^i9uR zo#`;;j{E=r|Nq~S-~T-GiPx5($^bkRaL|MKgp2iQ&t9E=utp?hkX1M>mr6N2k`H?H z=Cm@nbYE||ZA=fXi3@+U#__x)9Di~w;NDU+C<|KfK|&XjY&^P4VNDZI9~ad315X@(03}jo9ElW?Bt3dfroGlj zPnI6NCVh}($?t#Ok@=iM%iB_RaB4JZbLqbB(DD`~HLl_Xg(NsNPUvO>)jwg-`Ue(( z;3;zEGmt4h=Bw5h_}wqKG9QLst$~OhQaKhKynju^#)rfdJa!F1)R4)9TQj36&|SF6i_7x&R|xc40fFh65>e3 z7iQMd#F4c;dqt*0awa5`y*5S9V4l4q=;c02HWO)rWHZNJCs28H2-HDv;R08Oj@(~7 zl20PngdPVUGQs=rokkwa7n@%&mVSFF%muCOPH;eLyZDok+O7do+hxFNJIC&W;Owq_ zxckTV`}`h19J>!WY9Hvn@ckCQ#|7(OH442fLYM4PbQPce&u&dWpZ!ffKZxMr1CiJ>Zdi-qHG|M`wr%$9@)2 z-Fy7-AJ9-Dzu$e2UKViQ!2`SJ({>6H<3>Hg{1eb}W_Mn(I$OZWXwNGOA&PPUiD-lh9i zCyNR=);bs%7>o~SBVx^^Ge)Jr@&92^I6HR#@4oQ;zN7U`?6C)rwh$E-7k-x*l>*S2 zK7C#63=AI0=RJBM5eJPm0cflpfX3Q!a4aE5orYugVUVB#QvD2#Kab=a9?Z8qm}4cn zsof!jF71a_%aC?7xD)~{b2^2sTL_9p0i1n9Xp#m;F^dW)hBaJ3k^7p5*+qo|#Fv0Z zvI01g1)#CR-zor#WM4K027>uhy4OU=_<&3Ix6Uo#{Ntki9h66}cYl8kir?-}F5MrX z#u^`R(f))Kznxpa!%P2k751TYi<|j5>QOsgU17ZYZ)l)FM?*k31zTB685SrR0wi@&|Ak*3gIPDkcHKFpU~nU8xmzho>u z=g}RblHk#uqmludz_0LVK4JiyzmGpW!Cr-*!B35!L0p}m;k7zHgN-UbgOVoU`TMJy z{0tmA{0x_M_!-vd@-y7h;%9iSM_Au+eSU^4BYuVuV}6E66MhCBLw<(SriArvHRERp zwc=;EXwA=%WXsP`V8PFjU{6?|OQ(y9gh!{33P*5gIBX%eNAsHim+m>>@g3Lh7oZcm zKvVM`-9JGm0=n>T+oN)W0o3z*1Ul6ZG_5QR>J32W^tY&h=E_044lXb-Fue8xO(BD% zz!}yNykZk11X2VS0&h-+EFJ)9f{TOp?;L!`{{3P1t%I-G9UH%cI!2ukm$`JBs5tfp z{O??&0(M>J7RUiboi!>fuGX*lTXQ*~4gMw$P+cHfuov9i7jDS~O=mRci>7hrjh?hs_ z6!26!Xc0_Hsulx-OLvY6i%+jD+ujfVA?<7a?N*@Gnc$-|K>OPuCxUr*w;Ts;J@Zh$ zj~;or^#3N~5L#wh5CCfz~cZJpgMpFx3ybeIYF zXfCjzBmcH2&_+?DJ)WRTiDj5PdRZlRgLgmO0BHtoiStyx0M9X(UxD^1!Xol4+H8yq z^C8$l@cipRmnXP%^QeFo!}|UwT_AHVcOAb!hVCE&MZ_Uk&?E2Egzol}O@nXoJMGac zTfGak=MQ|ymJH&yY3*}quG}XeTT$fFE1D*Kg1&S*kFKCP+Z4CvVLet&y z8yZ*0(Fxrd>b(7P%Og2yt@UQ{g@Ae2R^|u;K=+Ie8>eeq-3(b$?pz1 z2F+3XBqWe!(x4lDV294gr9t;;rg0wz9fS7PqgVF)4)8u&FWI!qPt&-Mra6Kx`0ixF zj1M+YBt6|H|sSBqD%u7404dNPynfDMk)(I_JYQf!51Y$ zG|E8=Lr5X$*jf4yQuGOfq9{;>fdOPFj@o52@oAr3g@FMSkl^(G{|v}bP<2uS3c@1r zsk5HS7hIsr_dG7Yf~9?sLeOyrNs=z0Gz{8|>($-z7?ippDI25!vKiL{nq8pB5W03B z2Ni|gCtX122Z90{w8#&XOTZ-*Xbci{iVfTW1(i;}tbg#k|8U`7FQWp|0#y#3kOSY# z_ZYMQ19F5QY|Ik84CAybzdLw`Iw*`mdZCSK@UB3dyK13(Xl2r%`%i0vsrbPmsSP@!%t;cFeqo~B#~`JZ zEG*>GxG#YA8%t=P=spUO0u^Lw+!xXuxr0Q~96JNR$-Q*O%QQs>22hi!H38P@Y6Z8t zOn+?#x4OjkfLmQ{OTewJbBI=#Pq(|o%B021;{Tj501TG7bDP{BRRq+8$nI3g*eaqi+Q32HOW8w7ZYymga(k3|a zZ?{qL>E%t?3_11#be@?P_>>(`l_B8O-Es_+H$0TDgNh(Y)FOxjxd?Iu-@Xbz;{)0- z10`HYDI^DNm|;Kb1ESlryX7UwI#8~e0$eQoT>zaAqhkX4lOdGxY) zz|}K5{)a@38R*Dw=98eVhX7J~b>ZI*E-^u6Ru!l|&jQ5|xa|e1&%p<3pcY&_Odj1W z??9mlEx16X7XLOcX#1?Yd3Lw_fkq&DYt6g6iy(5bZNY4`v@wj6lR8F~SO}{exw�Zh4oDI%W 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%0AiX%h&$A2fvwS`>Kjg@9xC zL2wEIEvP>Dhy$EZ4uTU3$g0xKF5QvfBQt!NKY`K+=*SFk-UdZO>tyh0Yc(nouEr-p zDFu9Vh6eQ13`irxF%FbaP|g^EuHOVFmjrnK1azW(J1DJy);Kvr*Q`SqIf1yKWYYm@ zWPrHfWyvfm(AH1OTIe2c%q32+wd;ucCUEp;v{@J!Kf0pz7Ep*NMBfg=itE?kY$oTz{?~-{hmXhvo}s1d?5f1@Rt(& z+mO0E2TF1vlkK2pCDPhk)B~YFq2j{7{y1n=3Ao#X(IeOf2^jwEKSA>}2j62k5DIkA z6R3{`pKU)3s_wuwF{st;$b14aIS8JE0dLbONwB^JJ`Cz4XuT5XK1z(umnZqRp9T-v zyhPo;3pzatwB83K333f`Uk7Y9|8|gj8vla4#@`M)ZKy=N`L6(f%Ms8Pqrafu*k1?! z)=VY_hTZ=`B{1_r>%;u+hh3PjyI5a#;dj66!hFxg`Zj-?8@Tmz`=uRdZsk;(_Gz$s z7yj)BLEWzPXnmmW3y`WC)Dr`l2Wq#2TOzO)J9NG}Ysp&Zn2aA8K>3y)~<+&r!`j?|91nu6 z7Y04n19YYbIPS>pgxxNScIm$TI;g!@Fc1E#R$?h;^W#E!_Oj?HTZ+{J;eyWbX=2HMQ7+V6sQyGU`yAQ!iT2MLu%CY+pXvHc=^Me3T(F-YMLG3e8 zPtLRZD5w&4{C@^?Bp-S_2DmkbTo{5CfC83a!3&xoCsgn@+o&*=wUE(mcCfzh_~^WKz*ACP>U6Oo^uAMZ&QHiYF5Czn&1){)NLg5JUq}j=b*EcAkz=vjcp{H zhZhYQPY1QBK;Q0k`tBCoi^!X+qYN(<40kpdse6|R}R!}<-)I3MDqQHahV7Kf74dERIw`ai) zfzB*|ns2BELrP8ficlBk+Zgiv>%mhTkmf98{0`kp$ixElI8x9_fw0M2P>Bk1fD8Zj z!{D$3jo^1*hU^wUg?sK6;vmct&9xhPv=O*WghT_bxdq6~406)|?1kxhVM1c-31i%9o z;8GGr1vG;ne8mCER~uS9f#(*Whb4o$+T;{Zpwbv+JqPNXBmeee zE|59`RFY%ua>GuGLMh^2flksyp7;dUF5t3aJ?OY*(6|qB_kIA1CZZ=7CXhe5APO$G zNS$1O^uI&FgOfzgFM#fa05$SRnO}GY8q*?wegQhbe9VP^{aF|O_18dA3SC$Ytz$F$#V|K{S|7>H!PrhzCn&k^9`Wh57Kl4 z_*5F`d;@w1=s-y(WV!*z#tQJD7idTxH0TBG1fdO6ft5gZ_7R?IPy}zK1~m~t1r(@y zg$+)?rZT{@4dC6*C5bN9CqbL3PlM({U}L+mY8-StIrugJ(5Nryq*G9r1tED2vUVOU z`5t{L;v?AngYP(C(+!4@#TKCHhJDcK2IFSXbVDq*)(~t4fcY4xdu9b`4H<*Ba5!p% zt~CI81>{A%Cy|rTF@xEMqhkhk1!%2T_u-do!DIZOQ*A*r%b=5#@bA*KI?{za#{gPX0q?kgJ7(Rd(;T%=f`bIhHay7L+Ta7cKusOw1c7>h zIJiqjNvr1=qDOWB6p)aGw4fzs;Db}ZhcST;!2t7^521F*BD)X24h4@7VC=o)-wvK* zz}g{$G$hd`8BoI#G_=KoZ;C+y+GxQ$#jqMYoJIB&1E{S6IovxO$MN8xL%)+91wb?K z9^HSz$AiE3=)M8EqoE2k10dkh{lNotsRO92VDRa7Gyt6m?$dq0)6vHB;A;V&?rWga z5lkWDHIVTu2NqAz9d_M^e3&nThVnh2_c?TnFgbPxK#l^x3OfqigZVFHwi$91_*~FX zod9T*P6B)ic#et!=oE113O3OC1CQo665WnA9-s-^MDR&w$DmcV0m#7?peYLn&|y;o zkSpjxLvb8Foi-}`@(eEBrQii1wHzMZr3Rg@Hmbq1kof?3g_QMCM}GICF3cxgt!~y$Y(RlU*e|7+pC$l3g7<7+npZ z$K7{<8-F$`kS+Qgpe2jo)r#ON_AEg042lMi<|7i0F^Gfi!5m2Y9JF3>FwBqLhmJr{ zb$-m9>hojWxA?cgr^j6Qx1BMu){uR7n+(#wC2YPK3 zXeSw{RRUhl*IA>Y06NoN0=&YYL`49!!hi#`!XN?Cp77}|1FsMF>3-PhX5)GAjet-0 zuhzHxEqUN7`xdmyMp~aG=GlGRBiT>l|5;GW!;^pg8Bpa6T1DW|?Z(j!-6IdJ#X<8( zXjM6^8jpfj<4)je+y+vOA7)^H%-Dk~a^?fphxpwOxiFt}u|CDW?X(NO`zaUD!k0^s zn%t%P(x9!$eVPBlD{|=mgVwkFt$RR6f#+F(CR-yw6SN7S8P^QZGT#6X$l_iPMmGZ& z@Zw${l?c$nk=6)s4PT?e0Xk(}0JI$eat|x0Zig%o1TX3}aEy&ZSsMr%5804N4j@<_w4?g4o zAEb7{h5M8v|2D9I3-<|^PVdq2w_o7(zSJCl0|h%$GN9L5-#GB3Jl3_o;c4*umOulv z1lB8q+)pUk&~*F_*L`^r(6Kbi@5?(x#{En#phJIOfY%M6Y<&lvun#&fmxF)X566SA zK!+0YZ@YVT)&Q6`!|QlJ9}G4IoZoqqzmFc0SiP0K)& zaLl)$H}Wvwh2GTU$ovm{K~p<;(ZJ7_^Z-d;Dcj)CAaNP|W$^vcu#6FY-zUXs1%)zK(3%-uzI?R!na-h}7CqSFW zaUJvL$b9@IXr~D5st?d1i?FLc^g)gT#Wy63_}8CKbJf1?%D)|SQa%6ntDxlw&~bN^ z`%#B)0epZy^fteiI7op8KSbZNv-*N>XEONOPkwm@*X~sC ze(G8S&=G{5-L4#NRkE}4+%0JrLckR9so-c9?l1y{R3UUdJtte zKZA*Zff=%32)uX_|K@=-N9}WjwhbVg1{$75%@U9SVE86(*g!t^eI1Z;47Q75FSu`h z`{hIE&CUTNS3^@2>}(8bu3n7+?HvdQ?EnF7 zOX1&s9vm*%0u?L)3oxkT(8l#)vhd*Sc2QvgjqF3NZ@{u)5|qDN9l>Q-jtXdeA9M>S z*4sdDL;K|#pnj79Xss&xwn)(K0aw_rNc0XAxO0wv{~TraDOJ(qKBaS@#trCN$rTY@rGmWq`>|FS_{o>zt6SNcycKs%(wg)xk(3gi&p>;>Zg-WiVHXisA z8c>4^a-j{VjfZie(s6K$gr==L^d=tc79!-siwEP$`?N3zeRNi-H;z3-F@!5*1P}RQdqg-44CS z8TmpbSN`>>Hy{m2bq=_`Mp?*)-arMX zU~(F$|M}a(LH8(i|9|NZra`B^QnQ`GrJf z0qw$av~m1)kjW=G)1m`9NwTdG)LQI-+_8mqCzcDp>ksfz&7i$l#+N`dtDfIKfG%Rb z0BZa}H)5TFh(pFl5gV}%@Pqfaf<{O)pc}EE_kV)6KG&!~uK?`~Q856G7x{Ll894Sj z{09x0azJ)q9YWoN^_IT{wED!g`=Dd@Nl-Jh`C))#_e+;f7M0E(70@gUq@f8JUjXgD za)b<>V%vNLYJP$aj^p3<1H4CGLS_9`6=bnzcniYikkPSm9lA&@u{8GacSwf-d@pOdzATLm`qx?W6KW z+QEuEUt|n!3m@R$e%gh9{XxX?5>UwCZij;I`h)I9hP$*Iy4!28?4zP-OB6Ijui(;8zGc8`Y#{^u0^mceeY!(bpj)a=c`||y?r;O& z;bZ{aQgwj8bvn3>nxf+2YJ33HLdCp4^@MAu8>op|;1~}&1OR+=2e^QRuE&Fvu^t}X zAK~}aO#_v-F8tftK*gyG|F%9*Z@b$KbYI;*P*1x9W52Ji&f@N^^hmA*&pMKDVVz572#y=;zT>*F4swH23CM+z8|z%V zUwMG)-VhZD#Eo^Z^y1SU4V|C-2*0lG6X;NxcF^gR-wrYIxBO%PA03D7x;h625Ac0; z$DmV{;QQ)4x{>ayli=Te3Ow9-5qw*nEB`h;$q{~s6J%8+ELDMy`v6@ewjS$cb&v!J zzrP84f<)Zk1W%Zr%->zPPq}cPh1^#6kOM7kg70rC$KgMu`k{J79Nlb>O2^o4P0Os)PZI+vD{Fn3r(^}H`JAYZ>V$WMBGppk90#F zXu%m|!>3~yjs1osTAil=UYJ*- zq5)c%=LpTY;Nl*S*tdX8?C%FHykiERVCHIl z)s^4lf}2fLpUJPbvZ`^$JJyFaIqHuvX%4ladG5Z*ZW9yC7)8d+++R06#} z2fWyMJ@$hoAnly>MLE{cSi3VN^2O6a3-~JMGdKjq9fY$GU%@~5RJ^VzUW9SA! zPT2upYX+W$DoFs1$%F0&*$&_321|zEPW(^Er6TA@_JHL`yRWPcl<=YV=e%NIU~mNO zIfULBqj?DK!hphI2*4f{G37XMN(>~|Y4PK23nZ<-u zM=*CoW--CDtuCl$Vh$;R*MWiO4-xi(CNjZ|Ud+G)oi_~{76H4+{XT4V3|5CiJ3hxi zH-+B^EwMZP@&>qB3A(ThbPhIX78A{}kR~L~ZV}|%R**EzmEdM1+^?W&e>=!opqb3q z9FEYNchFt*5`61A>>O;A3(G(&B0%#8+d;iua13;x2L&+X3L9`q1nT6$ZG@aF0S+7J z4oTPuJ<^JO$QEeuiM5b5c$kAkU~^E$h(Ob!5L>~)58ki{QgF`2`aUQjKrSr9GzrpK zhi4YZP}9Me9LzVZ@0Ue&-+vtjU8Ij1bYKU7915KmL6HSZf-MKjq74E-1{pz32jp9G z9JvpHxn<-q6mkX|Kbp^$R}Z*8_gO zW;J+wMKnjJvyDf$vjM0pgzbFIkI3h1I#% zT8jrNo1lv?poIc>@9PQv?VzK`!0R#KJ6unK&(=K24Uz#Dad4SakmDSB4K!{ucO{ zG=0w3oQ7NgfI7NFp05d-IHuNqS5UO0thb}jURONp?E(<}DoUH?LNE~9?VgmyM1MDK< z78TGvT%bt{a9{O1^dN8npY9u=0YuQzpaP!Vry-Ib!0WnQKnHsJs3?He0k@RU>wcWQ z;7v29T)R&-KV$^okLjbr0-AR0KIPKMqtg74CimlD_5r|KR3P``+(fz`2VZ9ZG~WWc zOcPIM030Pmbp{}Z%z+{ebP_12Y((x=!aD>U(3uf3I|Pt5X)hsbB0${}f#g7S2*8_pL9;Ce z$TKaV;WT(h05shq0h(^n0F{;!uB`|7TYJGZ7FIokSziWlNQ=U+fg3h=cLRA2uXN&foBC!^~hPeBUTpU}dU@cKt{ zP{|58JsI^lgJkeH3(C<0h$WDa;|v@?!z_niT0-WWiM*v4?F2h43n4)#8^MNT5c}%D zB^UZw1?W%(q;uv#>t4GrBdvY}YXY~`)0j^|w*-Q!G-yX1{YV4Q2rOi4GDwjNGkk$Q zy1jT0HQ?WV89d(%8bU&>eZ+RNFt}ph4mr{QbXNpujRJHC7ioaxCUl1)D5#)gETHOz zV1Y{gEsB>xUcwfppix24;mBxXACT~bq($&JG^nOW4NFitNW{`dH}HBV0!tqsz=lIe zSo#R+c9MBM=W*y<3uL+mbSQuZ3FmXBBKiZMuAvA2`s*Iuhdr3@qRzLVoPWc=?cl)& z94_4W4p4IKbpGSm{ED%3DXx<`Gr^mJ2%gjlnSTKl^x*TX2GM$^70`|IR9nv^$pShh zVRStc^C|dIIiL|VK=?q#A2^yJ3uUEhgZR8_NA*-)T^@fEw2%EoD+9XDQPhaGgWeQYLT#3vW+*G`|VxcC_&U9YW(+ z0Xobcd=d?GJJ1Kp_cxxP;{HbdZ9l<7s{Gq-K({wSr!VQS0=^p3V*Mw;-vXK&Z2qTE zV%Yr8fxmSPXyYRDE$FsJ7v{UrosO^#jy)jx?w>DPKrLI)R)LGKrSCY370BVBkO>?| zkij<``Q2||X#;^;tgtyZSL++D{O&hEcXXqao!uAtxBqnQJ^@-{2;N5MX#K;H-~9*n zi9zrV#{>LrpgBRu?gK9`fcx1<%PFy*)pZ%}R@6osXy$MIbwufeZ5RNw^%68O2zDD- zJ8JO++TsX4wEiFDx)4y1P#ysKY-NsgzOUQqgMS}J?hB)$XKh=$~6AgSI$xZ0AH(J{l)DZ)PIREPFM^2U!cOCPWzoehai=RH-k$1U!eV&{}f8h!KFQDn>%E0 z1-NJiZxR8Q`QYs);4=R|e_Ie}p6FKUg9f+zS>IecK}C;sPe2?1x@yN&SU6A|lIyKPh)|DW$Z-u?aH3-D!?-E5$yC}_g> zB!~f;VZU+k9S8W1#cda%XDCLL2!oDLv;&`@2tGjZGy?;J3-c)l{%z-6txve}yPt4j zzUXQVS+U9QegWKWxWV7H7_^YH`^L-JAobm+T==(LbK&21AJixVt+Iojp(x!5zQ($= z!V%Vi#frAXK1VVAVCXi zVu0Eg;KiCp5N9buG9>gMCfC;g{H=#TQ^MGfR4fOt@IYF#nF3muTcd*INX1y>BNby~ z4?93kJNH07&g-QQbYVSYW*0i`n*ct}3vxpz{MsI^8AKvEUBu5qzGg*e0ubjBBCHPKBM>s$P7^FfNcZ@rujrr}8oT+oBp0HYnnmaKf3Q=k|4f<_*ZE>(hFZ1$fI8h3KHV%Tp!M(x zpp!d2nNNTY?{oo8OLh9FfaAE;4V>Vx?c@N(cXy161Na_LU(lKs565_6$nzlBlPtw7IFF4@)Dh`5dmUZn0_4W=xi#Kd*$Pcq{9|g^99s?Ij z2OZ&7mM+Ax{l{IxgVCMCBiY@-gVEif+a0|2sSsPDDM8!*;|@(S(BpkU`v*YvlLmB6 z%3jcYpf25+6^`GIGVyPl2u(BKEx7!yFS;E;$pySTts_Lm!KK4R#RGIYO91F9=r-uO zrU+1VrT{t=SOQck34liaq1BlK1Gf91MM1UMx1)^wEo&GU7`nfLu7f`KOv06a+YeX% zZ4W`o1s>km&TB(i$h7{NEC2fQ&~OW2Q;I|7dE0PtQf576}v4md86-T{ti8x_#;e;lB>9Ps(R5}@U7 z;7fudU^hu?IL0Cs4d5n;LvUyq*8N^Sp#5Hv7TtvvBy9KUEWxqc>ofk{UNwl_UM}75 zFn4<)!qc}q7`ETb5x(K;7pRnJ1zkG-?HD6}%MaWez8E~g`@N2X>N8LN_2)p9nJ51J zUbu@N#C9*71rXL9U#_k2-Co!WAjEDjctPaJ{NI)PpbPg=$ZjvttQJaHqykER^_s|`UAHWBt zf*W9~q2-(fr~w99zi9w!Y)OEMJPnWTNN|Gn?Ea2+KRW0rCC6_^82MYSfEqOX+iFxQ z9J^n+@^5y4NEVS4=PVHjvDs)vPe`^eQ za$a8Tm&!WTmxIm=>t2t-qQxueqsT& zrX=7I)7l7X!FShylNYEkGyn~5S%6zgo}g;a0kT;dbnH2}ECdnI_L3u{nH~X4VBnQn zF5Qk5p!o*=ZJnSb;`r?V6ZEh$#ClFp9|w`bet_mBctEvehmQ)lr*{eGa-HG>po-12 z+n3}23E%Ei@Ofp9-L4j(mcBqIiwdYp^#<>*(ou2jzR>)L(Xsmg=>Fai6%N<#51?y& z9Wl@E>E?9&f42J||F)Ol?jQW_631>96;SsNlyEMB7##fDZb15gpmP^7&MyPCSHLTs(BHd9Pw_HItN`937N0O+};E>2m4&eLGa2-&}0QPI>_2071@0s zbi2uU&@M2vRE__rGyd(Mb4_pZufGf$tpJB8EWRLM?*DXeFQljvN&aP%#<+I!@7} z`A7t42gPAn0~5jnm7_2WFHb$1-%w?LDmP{OQyah~XpRa8qzHBGJ^^089-<=P*nI$e zXi)Qm0N3sxoh~Xoj*Z}}DB(ru$Ad2fx_^SsIRka;P!6!=-*yvRh`NAEQP}>}i=+Ef z!4*S$Ewso5-O-D_9DO6W$h{BF_0XK=!h98)Z=w5BdqE2)@4svVmATqPubV_M6SLHV zuBry#I}WoC%Tc`G{gROK4K#>N$@WyNQxK3FGr_CP@1taMM6nB9+<6sK8eAJdie0j| zr(T9so!|&S+nx$4Fp*1Luv;Oe?rZP`p0Gv$^6E?e?PsC!2q|?zMK?$f!XR*|i+w%& zL2z(`i(Zfdr1IMZG$)Qen+=)}N19f^x;^zgXx166?1h%DphSUDyuw{~4!r916=Y}$ zv+zaUo(ei}*GC1iJM|Ex>_wT4-U%*Hp~bEUu42~_tcs%Tsb`=KSJ-_$kck?X?m$q( z71S|u{C0>5v^9y;)6_r}O|m0$PYJp!$pF+t!q}Ch0BW^LfV)TMq0_s#uI)(y9jR8L z;sNS1Sxf-8e0v?i=cx&R>zHoj^VBpztNL3k!M6sVa_m0k*!+;O`C))-_a|`K-N~Z@ zZv(e5fPiPRuY}|O6W~r0|N2udosbP!kbb`_2drO=bY%~&mNEafSCDz!lO=`VMlWdB z7xK|+_?yU}{ja#2$e@`*(AFeKQx;288TqJR+%08r>lt+VHYn|)A1nZo{0Los0Ua_$ zq-)HUvMLh;LkYB{4Bpp{)Kbm>H7fD9lwCpF^zXm4V`N|eH|D5+tN^~2G9pBwJBf&C zF@u(4bRP$wnCa3z;4NmD7eL)w4M@TGfCE0K02(1i+4~{@+WVpanjI1V<&suL@U*cj zc%nf9)Ia6`?R_!8viAkt#{}or)*A4vaS7DmdNY^VS?|3D3SMg|7{miM6k6l|4~>;M1%LG50Y(+`G2tDe6t3A8Qz{>$ip|NrxE zKM(RGS_MO4C0=TRZ4J^vI`j~#z`4^-oU4spGl<^n%19-~PPYEr@`gI$7AfSD#AWwpt^r*h?zUTtkU)Z;?m z@QUUZy0z*-OGSA=l`UwGDfm=scx4M~&12hR+DXnH(=SxoV+xvE1y3|6khT7FGui7; zqljLA3OcM4G|LIPHH#NAvHk)yK*fClBy#W(2loX>*dcfuurE&KZw1Y-f*K%%7N|Oe zf>)@bt*^QZouVOkeN_Z_fRfbpRq!F93-I+-CvmQ?IuDuyV!i}fUv=C*IMjpDps-_#XjT6@zD=g=wZNKOO zSz~n&G!zWV1XS9N6XZ8or&f*uIoz)L~JCkqtc4l7y z9jPtAoF73~-`#YO)0 z*C6vKsKqe<_KW=6KZ5QG!sz1tJougik^uSJ7lW#B@#fzG{4IMx3x$6xlo)`QWQj2{ zFfbo=v_9_0?|$5c`I@Wsbyt4(>n_aqT|x67-@)nc{!4JJ10JRa-9V22@NAfA;Ccgf zm&XOrtONWO7r15oSkCh61}!cD)eVrrGFR*SWx1~1_g`nYb{|i3)duaBxBxrv5jOh( z8bkxx3YmpqK8hYxpi|>OC%{36*sh_-!_u(}^LJjZU9Yft?U2(|L@anq5`^f2y>xEj*14TcNGD;Zv?z7 z$G|cEFeE=idRCA;4Jix3o0ZRkYS8Wrj__zW=?Kc|u=*4p2%xEz6QKLpL7SxyzTil6 zWIh01f(tsf5_C@YIaqW~4@)YzOaTWd(s&)T zl>u%T+ytktDgXZeckRCavIpF=x{4m1{M)Y~ViTJKA!C^!r=iG#Ek5{~L6HhIKxgPTZq85U#$3!~M4OA6DR%b%iV}h3Yx^&-yF7<_1 zMc_K%WgBSuIOM`~SY=d3{mKZmC>XLP^CbsnWd)hAM6AigSr08EV@;+LILDK^Cetwl zdJ$T(r;YI?&{H&~Z^ADjbOV$+x=>ygUVTb%js& zE06Aj;Gxn^78P(k7r+GC>3ztt`xdC81FdE#fK+j?^_q^|;*S5%fNrhu;9q~jv-_wE z|F&CTBYJrnJ-gjFT)KG}aa4UTIS#%MaOB?xuKGZyJAvow`L`Va)qN2z)+dXDan^m? zU-DyK?Fd$ltL_6Ej#L32MpS^H!-qj@l8wO?pd`2g1h0IwKFaTY)P?z)i}h6(@R7v# zU99i&w}I+Fm+rgZIxx*qn}`Y!VH&9XLMfXZA*Vhd>Oh!fIO@OxSYZaLmaOlV<+^m= zeVqXruB3S#Sm49F2AuZ5lN|7=4tCGx<18NCkVMn^0zB}TX5rBdNuQvx#|lutiUYh* z%oB2tG32fTKO5v!+?ornA!}4LKvg8x+ql4EkKp@^BOK!#W8f7ec)JRCQvrW#_jR*fDE{>ayDxx4zxymSs=!+*!4)N_DMCUe2}upODmU2KxG41-xbN!<>-&Ow<w#OKoiLKu0}F#{LTarC z1|MvA1hOW0{WVaX0b0!jY8<73TSlNMM$n1g7aaMw9|Q@(Ppv!%KF<<#WIO+MaH@gJ z9D+12xi6rt2lm0a9@v$C8~DIYSMF07mrH{R#e)w)eS!l>7fc@mukj#aHSjKQy+rJ4 zV3hMN2giEKmC$rT>Uv7h&=<|tQ-YHXXn)aJSN`=^sGV$xTTdBA!g@*$PzrP9J_XvF z13o8<9#MP9@_rHRA;M8AFd6}a1ls@3qKvZ2% zi871uLITvRX}wf3jMr0wHWtHXi9z?8IwH*yuK*2`FrzHQ0k@{Wr7On5|6If1p8!`_7 zxO5EC4*g+ZX6ICzi%vYZm>ph~iqQ$}~+e;p2< zam8}B1bB54?C>*ToVt|1f%9IA{h) z0kn9E1GL{n!UMkFUOZdnOw1AXx9%zok7S^U7W6a8*J2L@R9;F!-)XJKIIKIqbY zu=xQK=#Em*ZW7SRS~V&xAh7_@$PZ7aiwXzyu2Q7^m%a>+|IavfBh7Ez0FU=@K-bhk z=QloLncqkQ?`^EWc6c^;g&inFT=>@?hn%DhYIGwHK!cTl#=#)V>JEd}yP@s*hm`ED zt^Z3@UHG@LsDK8DT(FI+@NWmtXEoQTzz*w91dTt%@NYi{(gPY*M{YWR5BB>AD#1XD zZ!zXsF7t2y36sRwu5uGH5cQg)@h`}K{OzEA3-s7O)N4#rK-ZWa+Xvc$YkiF0{g?~$ zbrN^kU1oj zaU1B+547O}jX2Og8_;+)M$-xGF%hckBR`U$*o1O zHV$~`4zzaA0fS>FF}{vXC5}hfvK1$@(}GcV=h;we&_imJ9O3nI=>0qe`0(IwCMzCij(+#C(x^MKvSeB^P)V^c~K3> z#*-5eNyxmY3+R|59~A-cjObJ7vDdgZp5%Zwp431#o*2N|$FTWOpYB(nDN&E^iyjAG z34pp+3g8J*U+~i8L$2M2U@c`(JN%Vn_aRUdnFF*R+eL*1(n<#J=T7#M@a#Sc>V!D{ zKjXo_{*+_4ICzc}>-;FerZZ@2G!xwNg={}rk8uwrSQ50`gh0!A0qEwT?LS@k*W+$E zH`}N%lxTuY1no`%HH8T@pIM-H-H_jW23f)n+QR~Bvm7Mcd^Um1Ez)+7huH(sbtEejeO<#Z$AxfKSK-w6~v$>JYq{BxEday=Ccno_-^J96$Q{LF%B#<zu(+i`MKaBs%}Pl;E6r^G?)nqU|-zlV7r zH0TZx@Oguv!6Vp7gE=Y!j^LScqyw55T)Ioa2YS_Vc)-pZ{Knq`xyA@~AGBjPyW{_J z-D2H0x_`LvZ#&R^=-_Js&|c|N2VZg=e9ytZ4YaE9qznJHOOBA`hvnhW%Ovf=mq}Ve zE|WX}+C9X40JO}=(fX((cm?4$cDwV~`INj6pxn z=?wMnCw&c_j-~K^(me3S1dRJhJ;3!N_&lcnXFd7Xp8@U6^yqd2@65c_4LUmakYl%4 z_aS(CdM$uGNku`EloL2f*+7!iVFm^U@Ip3lqGCQ^eTd)v5X$YOF3cBQtS>=Ql}q=f zL7S>@Tu{0Pv=c24yvHvBw8SO>RH$TtR@?-5K-SrKFuEDIbc5E}_^3pH8b+-V;1vQy zUQh}vNT4*Rz@T8i0jS3UDtKsm-t~k3|Nk>k>AY*?@mehF$3Z6(kh6YV96WG0l-G|h z02Q;4_2WBH){lc$>mUx6Ml2v_J`O&k`3tC!?>_z#)IkTWc|)vS2Ay|DYg zt-*)=66j$=mm*^>AO<%|Ku#&kb?iQlvUnUcIEUJ4hcv0c6N{j=$}Z5!SorW7Xs#Cd zo)SpM88I#gu?*BKz`J-{9GW2=@GTzS1YR0PmBr((-G`xT;~cv$<61oq_hdK3|Cp^S z_=N%d+s{E`1vKL72pTPitwD#G0$JpUT%&^9sNDx3lY1`A7xAngM+7KnL>WG6d+;R( zq_So{2u@m{#p8~kLr@K@kaFJPs`nAjgAw_;mjS zx0t#;E503M>hw_ot=fW3;-GdBF-HXD2=N)mXcCIgg3F4bXXT#) z6=CqR^22{_S}8!8oEBiKPfbn}LDZh<^qK>>AK=X4meUFL#3mI=c^bUr2M&J_^cjppk!2 z-UZEH!4fp6dj^|>ab!M-TIfO6O2D*&2P`4?FTsKtmVsQDZ@&bsLV+zp0Tt=6&HtcY zdG{$-&>Bimz^p$2P8{7AK?O2ok`A7Y!M2}p?LG+3&oC!K;|rAWz!%87gAN5h#J?Rp z)sco?ybzj!fkdSX^F{FFn~U{D7k>APpaO#Q$rxAbn`M!%-8Wx{fEJ>Fc3Z8#0QLgR z<;Z~xmVkvD+>xL|z0l5;frn|giwgLDKh$m{VlKuSJmOiSlF;p=0@`4Nb)(TWaJLcP z-URq2Bh=%f&p^lTB0$4-RNbHOkS6;Re8G8eSnf|afM{UBHt0e2CxABSxiH@aS3EA( zcU}11?}8WAfww3yAGbcr-}V_aF>n;z#sW=z5}L{Ym*0@hGH3>4DWXtU)`2YrWoqQ& z1zIZ~w?0~y(|r_Wa{?&Op=1is>;lLZcm^Q9jYZVvgxBC{2C_CM6o6Y`)YzPWXn=uZ z(Xsn7Vs`@8<`eXWI#8jE7$gJF5FHtbuLmD}#hP>hc5BPyDPQZw5N}FI(&}jx}ZxnhSa2V3z zf{x$`f0u603XkrWKFN+Yj^7S4`6MS=K$p`%Pju~otfoO6+zJ{_M;zSx0eqYkXzl@a zHt+}IOFrEfK&R^{Kqekep-wyqfClY2KnL%%?1N4`M1Z$qm8b-O7G`-sFJo{3olk24 zno!UH%@6o=*BUtXI{f$Pe%0w}gEZYB0U9)HF@@cx7Dg2KvONLh{12!!-}iJD9RT|NVA0)l$?uqL1l*Z~JX3!y;W!tPUPkf1q< za}5r-usQ)QQDCJFs4)edNB}q8tPk?L9|R4;Lb_@g4M9S)30NC~phh5MjSPl);A#of zdgsGzn7!5i*CB}6OtAJAU6RPYEO2l$XM zpY9M91;|w*ryy5}fC`on(AG~M6>tgF+6HbP)`0GYIsjU(;{aNz;{iJ53$jSZ@&5@I zP;u0JBmp#|fHcbN7y@0fBf!6HBB(G=6y((B@cX(COxm-3LI z93IJz4jzn-2HlR}n>(I^$Ae5%K(WFBiWTtsDF@K{DGS(9y8@t-*BoOG!)rna12o?Q zzk}MK+pz*V0}nY5e~vA70M&Gm`V6%DxT8iT0bJQZZXfdP{sfWx z?0NB>OGk=IhDY}cmyR5j0?=@B%Uoy_gC__sz5>NDQR|V-7#SG8xu{ey^0!%zYcX+1J{x7Ja}n&kD@!I>Je9vPYhKpPjx-sA^eA9x{u>pk4#Lm0q@pY58JKf%lrwHVqCgCZ9ruN2Pi69`$1Do z-8Cu_uEr-p=>~lLhX&%rdjpIU@1f&a;Ol{?wH|p9WH9Rk1?!O&M%N>Qnl%Hm9vSB~ zfqTa}EX&k1(L7SKw*V=vc&8z8X7$l#-1P|XF`1M4Bf+n{x@%=a+l`H_eBA;Vzc z+5x^5i}^6#g~;H2SfF+&IMfj9kg;7u4jJ6M2`a8Y%?#vz8u9_lE|8!H1rw+tgt3$u z7F;N;7Vv6h&^8@rQ2+ffbU6iR9vl>qkl{4MCTLLEcmlf1IgR-cxJ3r-;~guD>^=rM z)BYUDYna2cAZLLaO}IwbLCbnTWB=fwMh#2QLIy!f0%^SjXjbGXWMbQ~`zUx~+Z8kdu*TIx*z89R?*Ya7PW?c>WLS3P3AhPyz!bC_Kw0 zu7T<@?8_ylgWE@BEtjDF`iNJ^&7aO1&~1w;DiYw{ehKLAPSD*rogpd-koKZacbNg? z{>6u#ZZ@6=-w610|7v~9-;xXNw$X5XL^HSnv7>I_yN%^{!r{>s_%N zMTgif#zOb?t~i@#iG-VHpxeQ_kG(V>*yh;|Nb?MJuNdu`XZRMog4!_KiEN%h$KVMy z&%lTLfE&k<#j2S1U*Kq zHK=_m-V9pZ4{ED4|5Ye4ZvN}Q-8dBO3eQyxq&M54dYslINXkQA} zY)0+UK)S`KC7xsVW$36p=pb-#KM2v)h4e;2d3*guP%qF0ty2nW!9$iBgZhUq%-2Dy ztw7CnbbDVqGcqtV{$&7P%m5lvZTt&4B3v6Jvi%ykLkgOp19wV6a~3BFbxJ`~f1qw1 zxH-=ZTCxEj3MZyh3JW$`bxcFMkG&3r%rK&EfP=0Y!P+eatrCaHli}ygQZy*WEr(pkeV96dL zcFhGeZHHMXTz3Hwpv$plQ5M(B)i~;9DJcgC^*huS1S$1}zNj zJ`Xz4*p>Mnbk!pBT}RN-#*;zQeckt8g03ZS>^|wzeK-wr2O;F({7c}(0dq2}5Q48KMkFXRprRoY={R-|E!~50ns|mo4a>RKk5p+52eb6aD-N#>E z2h*2ayAP(hXoC(W!Yo=Kqh0VRJy&MbH~=sE0^fxQS}}I;HHRx&$pc#Kx*arc3MzP* z@8T$Tj-xCI1Ksupn-2sJg79xY4vh!?^@l)9Pf*8>STY!?bZ#&;;8f70aMz6(n{cH;#RTtiL$K zzOe_4pw^pX_bZo978RGy9u?5WNJt9~G(QPC3D@!eS*S3CgF4xea_xyFHN3>{j?( z1E}z&U1t_FpAKu(eE=P?4QeSMvc?a#wqA#$39PtLa?u7$%t(pX=;Nbuj2CY(mKu6R=#uNoW z8?9J;x_wlj`#4WRPBnG|&&k5}aUS4roeFOLrGWNv9sm`y0ia?w0#wWb|W9(tr5;@RK zny@CZ3+ReOQ0E7HQ5R_H6wxGxbjCrWhe)M1v?&RTP*4dAYmy=r+ZQQq5>wb7=5I^> z2fF(aazi4Gn#GVKN1**Ub zjSK&_eV|rmM~F&>3utSWONWmNxG#N<5qudCbZig(3_ZwwvfXtS|4(>y$8q>{#~F0G z*|h%WZ;1uh{U05hpD}$q$jIMv1C&4bw>@&@-}b_hf7?e;yAZY>$fcXvwHtKt6{v}D z#qr=P32=)aHss&}8e&0Qn6>^YXh|E23P=8J7x=foK)U?^N$&y2gD*H-TfddagO1*G zL==KZYA%2hjbr0O22k2N_(;H&`;8mpnyY!Ao$AocO1}Agr1KOQ6k*@TcE@abSs4=_*M$g%48Sj zQ;_??PC#x1yXa~Snf(Xf76!Q=40I`rYxfQ4r7Wjh__tky-46yjD-m*^P>D3;E}_y2 z@DhLI4(V%gmu}GF$%C*m23Ed+Ci0=5qx|8j7|BhCM(;5;rN7SV5&aEy&T><}Cp?id2@vBFNfhpdqF=)UQZ zTnWC0g@4;hXxXt4Tu^|MVk4;d0L>YII;BWWuMia$XuC@QvM&JK?(+El-Q(g*hmJMi z#*I(+4|wI#A`jjORRT((7r@uDxOTq+_f11oBpjQcGJ#It(17pv^y!X&>1^Y9 z@ST81_a{)HGaWSG^X(8Le+wrg1A_zqwyXTxa#RY^I(1aipbaiix#N-SE#c994BFf} z2Wn<{bUT9%LS=LX9VU1RbR2v)s7#Omoyxe)N2LO#xIrn9__rVBUw;92k#zCkTgYwc zNW~4bNO}t^lCHqoWk_m3)^qT0hg9N7MUyAM$}w~TyDKBfs|WEkj^&3vQCBhJI-RO6Lji=0O(K`j_zs; zk7Q>DPv#RIjLrrw-QM7?fCRXsz`qTW9^i?gRTi9*OH?#mjZcCWVnc>szza6LLA?P7 z$9Tt>_}FMj;dKVQ-vxA#z6YX50N&;TNw_GPBMco9nuXhlm2=wPi7m5K>I-KEg<__EX0#`EA?0iW(i zuAl@7x)av18^?WBp8V^%NeSOgjmhox6oKLWfQimcKRG_U{~p#)XH=%pj9Ttr+}br4)6LaIoV zf^jAI0+?EGlQjd>RITvoW>Enpums4e{}Yf^|Bx0dIFegkq3KKll*lkg`(jiaz-bPA zr#H%uP-y!K+zn0O-_{5!7@>0zpu&(JKAH!TK#b;rsv78Ssty(v&>n$K7ZnlEh5#j2 za3kvjuBi%a6BIrw5}>n(LE5K-Z*0g>;c)D}(ENzewflr)^FyZ25ETK?Q9z)UU-N?i z*X|#kE-E~Zjn6+YGcbUPL3nxEEeV>xIPAi|?K61(;zRdg@G|`u*rqRj9DFSSsh2_1 z7ofAIT~sQ-2byCpc54Bb^e+7CkAgaq;4UOKMc{zh{t|TLF{rRaQvx~Y7&ODG1U|1A zyki)1{Rw1TxVc7!2fF$s!TKh6-0mEBHtQm|1c#+puo>Gw!iJc!9aj7jvXKhpAmpY1 z|MriNZtpt|$HxEQ2yO@6N(Z{_;lBWX3uyew5p?sjxnuKx2maQ*;CYs7kO_BJ>uaw3 zpp%O4x?10J<#)fw{Lj()AAj2n@W{Zwm!O+B)3i^!fLe>&L0f`Ay&n{Z!^Zx>Gc2g4 zf~GC8s0GikfX^NQ+X$Lr0q=-G&url1KMRdd$eI?=SRzOdqG#F-@fOk`186n_Vkb;WIU$v!1qtHm5TGbhQ3g7VFsk?{x%d`2c8R7}~-EsApg)9c_m_#D$QQ4sshf zaA8ryza4ZpDyRaN=nhd4K%Q#xQIP?BDZ!!04xq`Z`;3?x1pq3=)CN9v00ieqR9Qn6{x*kVB*KVabf)2I@oz#uEF9LiY z7bxAOIWi;P#szMy!S`#yFAhN5##IKoF~Sde8y61ujo!!g{j=xA_uz>)pY9K!ZOY(H zMJ+3!onun(<1z=8Q{Rp-^0!=q42aaIR5*6Oa^>Il6mo0B!KV@v(DrwEGXH}#+tKf9 zK;7T9{)#LA`m>-UK>DP9oHFndk)+M2HnR6s@GwYwvH7(-7i7yI>&DZn22cGx$wLG04+t~ zfoxoCISN^g0v$m^UL99_APu}<5_|Jb0MxXz2QM|g;M#qn`4M=M)wTOWXNU?1Xo;L7 zWb(kJ`$ab=r~!A7f7?rN`|Ss4nH=aUZEWqg8;HgmVuc*&dJ@o11b7t#-{cNzltFLQ zMr)UWl|Y(qA6@v@9|ui;qA7vYAmH{AsQs4c0-1>bonnMB6#<%E-To3ZE()sYp?zjV zRdgM)d=5O7iqTyA3AWOc3{2- zJtuVbK-aN=N>0e&p%3_|5%Az)M~ez{DGO-c0eXlzqGP-Pbm}%_nM+5D$_@qw z28{7U0iW(0pfMT?$avyu$f(W-=sd0lXyir#JaSXV%D~{!IR`ws3LdSQ-ivjpRljGo$`IKw-spf~E zk{NW;9gA!CFURgvpu)NNVF38(JEZP5yuS^Z?mYpn)cMz+0#_EG5g^dY=x!NCQ14rS ze;b}&IH;%2zYW?GZ>~{cVQ}H!cC!R>GzloAarVbS3v&qe$HDPIM1NcjTm^vQ3*4W^ z(DE<48Z+H)QW)l zFo90FYxf~gpB1!`1HD%cTU$!}%12kkb<(h2IoM#({g&8Ffh@bmRv|!Y0vGTaN@%D2 zI;eRws5<4Kb&NcqVNL^ZHyk=3dhh`UH@q_rTBaibn%CC=m75ZvGOM*2yaUA*eB3&C zWM09iJ4VFp)P$8Z>6__zkog(vghSkf1|CL}05S zKY~u90@o6tGeiVDyU}V11(2U4z_rAA=xQHa+X7QSOCn1kOCl{MAlC;1nDv1MC~R9S z!Ar#v^+AAZ_b1TME2uJnw$x$u3r6`5xi$x01&A<$7eGSqio@5C2bcZ)+g^c-f8-mD zz!wf;w&+0{RtdD|LDdH+y+ejw(VL~P`)o*Q**k*o48t*=3X%K>S%C!VLZG&cFkAM> z7aD;F`asK!OdP@MjB-GW4p3X+E@&-#(8jm!yDyy>85lqp8Vx|p9ub5$L8UvW9c_J= zpFj&AbVhjh(U;wzL4$74=?$^ekhj{^10%@R^K=8IGs02d4(1;Oy(jbW!8r6W8 z7Lj|Q5$N1Ucn8D_w7{c#n07!QON_ejzKj8{G=lmPTsKptAM%n1a?&7tyu_pV4YvI^ zX^;^QD(t_x04`K7ICfLI{|4nAIN1K1i>;SRXuSWX9W)Msx+D^^|7I7s4SF9^7lO9j zfcM|rcV)f?U8e?J6*&pq488vnG$H{$8vZ0`Z6v7U3OdlT8`3pK>XE|cOkJ6g%;tB$ zPhchqYAL9>gj@iFPNmy^)3y6Nw4?&<2_m>864d?#9XSr!esdY$_8Y`8>d>a9D|Ao+ zmR=##L-2mHD>Lfs5!JWf9CqwJ4-H^QBlI$;21Ln1j*#_+*xHVe^O_M01wnxhon8VN zgP0kDY`?*_g$H5;c>4`(#Ugk}W<4om5$M}*aNTVNYJWom9>t4L=YdBg&}NKaBN8av zZ$KAXgNlV3c>9+pz~@#TLaP7 zvw>zR!ROUL7F~fx1YoDuq=3#ODN*6@>9kSdmuGP4t_9!klga^F+0p50176D!0q$Or zx}NPOXo(HzAifLm#TzG~3pX&=vz-T3@64AV>)9^2f>*GebhSPKTC)LJ-3D3Dwj8`x zc0&LC_K6nel7_~svMYu+Hi3oD1;e04vckw+rNf+w`H}wO1T2-NbDd_yMjHXt7-Ye0d9G2Q6f~0I23f zRK2k38&<4=<^f!1zB1Z+od7)Rbui9bcI7^G@C65GjX3|d3)qibJ_6ob z5&*u*$OE*u#K9xk5!><0JD^Q5(C#h{&}uCK(3VXJ&9R-kf7mS3C z7lebCS9o}I|Ag;Hnhu&Sbm8CD4w@Hq;osH|+ECE#4%&~jAH2-~V?WYal>JD>H+(yj zFZgz5pYZK0J^&kE?T!aG-{U!ay2A}R-ECTL^S8u+h6cNF?nnBGJpbp~%?w&Y%fAh} zAL%9PekA_w9~{xQBf&;4VRInx9ZA<=lT|Po7yj)BK-+>qyOB;}-;Hzv)U0-Fd;r;v z^iaT+`ygm9kPG)w$Ab?zT)2<9b~1T3A7W{K&B)*C58jPbqmuAC9p-;W>>HB!w|xXz z3|ZHYe?Jn)I!I%k`xt0e;ix0r#?po0B!jsf$z8&O(VfF1+15S(n# zwj-6O7=U*9!nY&2gI4u>IL60ASM;Nt*A3f|;t0N^z@%BmG`WVcqZK1KRHtY0+I+LBe*Y&JrBEoj&8*?IZx+T~dSC?c~z^4s*8?V*ieB zcQAB+$wx={hNoYkQVmr7Iea_D$lvml0q2G%22b#QC-8l;;5|U#Th?Lwolfv?hwpcK ziG9Bla)F1~?u4_*!@A?iwH314>7-*fw%tzPA`h|K310MhGXHnwKIp=Ilpnm?38VB= z1TA7Mg?bR|Ind^Ns0VRuZ~~Wu#O`nUkEMjB8 zxrNS-f>wio<{n%1phY6m_NE#Y3-GKdVtZ2@()K1AuTMM%8LcO8eWC++6%57e6Ojfb zpz9MsWAnp!ePRu0UI4m2@dbE!%0Gn?=q%|{NBF2DtCE&x1L zK+N()KTy*jcJctq@A=oOMr~gfa+e5gONu`k%toax1U2SE5te< z09odUtRFP;3Yz8VKIqa7U7mOmeDDnPa=D8x{3J~YSl=y+?7j;+qy8+&hiHSr&|_S2 zZUg~sWVwiMI>1K-d4VEmKEOu>vOW>pguol{P(PssimhN(R9K)0?SFuWfvK`zPm!|y zdedmWUypy=PuRS}4fuXNP?0*iUyp&my$M?Qg7)j7uMOM-o|nA`S&;_arRTzY6}r<4 zyf==&Z8~^T_TS5XQ2DEU+7+@q96VuyZ$=i?RM5yG%B&mG-adql{OeIqBm^k}9sdB? z6bD{>N6gwl+}ri=m%-@g9fAv4@OC}$I%cdZ$SGbK2%7YO7DbQ)S<$xZky!|zg+?c2 zjW}qbIjG=9j0}Ur;?MQqo*2;Qy--p2`9Bu>e8JzOKYkOlIfIt3+#KwJn7nu8cK zv)H!laUTb-dP82M0~^T)Z`a!ZE@YuaG0yFJ+F(^w+OBtI@T~_t2c6BM;(9;}@X{4p zuLneHI3ukGyjU_a)&nYoCJ~`6Y0xYp@=l*@P>U1it-#=xvf)FBm@173y{x5KT$51B%Q zE(he_PJ?#;OD^z&z`?Ztr;%R!e@=l%J`m+Q9rphqwdy~Emu`Sh;sBTVpz~mc`Tn2F z;Qc?~`x7vBhhm<|(Tdc@e+M35`L9p{J(J@gF>U-g&^G>*0czue##l(&{_`3%tkHe! zWDjWFetv zXZ8or&f*uIoz)L~JCkqtc4l7yU6h=Lm>+TNP6yvFlh5JXU2fpm>23qQUnUcLzs%3> zn~u%T0~#NLjy;0xw|DLKWpMm|#<5$>5wufYp!*d6wjW?72WZ>np@T034!-1Y6WRmn67apD2!Y=|1Ynzx^U8QJ}1s28nI|2|CRK?YwWW>g}M7@`peZCukex zAzp>-vxlq>wEi4?y$jqv ze#||eutEjq7SO$;F5UNEt^u{MU9~}XP7}Cyof*`lMs&-er4`O`UnC1(x`VEF0k3}L zZ+Qh-3CqO5z~8D5E)x%c22lCeAMCyW4m{936X1Y32`VArhdzR5MAMiLf!54!KLI+f z^WaMk=;R=?2TKuyyju|#b+}9cdk?9Q0SyWu z-7s^%EX<|*KIn><>-_64fMX5j0m!W{mmtSBfn{K;>Y?kqK_?V|3Oy7#uzd$#bAT7_ z9%XUlJ_Jde-~tA5=Gqhf)~(=nc#Vofw~va4XR^D5C!;%uXR^D4C!@OoG&8p*fEAgj zfX-OMTsM-Vq5(RSGyrtZ3wRZPfn)q(_qs9k2j8UGgQUbUH^ z&e;vlnRj1q2DM)Jx1CILA*zTtijroDFCuQg^a2$T|3M4n`CDFtiU??n1ave7__n#T zpxPcBf{y&#PIg~~gw83@0mbXV+ik#B!!j8$r35%4aOH2%fG+=bY{QO_R)`D#_QTM_ zEkOAdwAK$}D>69G;w~fZmPNRLj-~*mKG4h-iU;tO5|A<%+q@6hMxsiI_22@4Kq(Og zRzzAU0d7iw3Fv*J5uimu#+N{geSEq<`XncU&z^v+>H*&f5Ta56KL6821-#@3egNnf z@G%lCkTWAXd%%Ylf~M+Q%%PX21b|PH$N}vKE&*+g1})tHogk3|Iuo=;MFVtD1P7u$ z;@e#ZUatYVI>o2^l}GnM@KF!ol320NK35->M5PAnD$80o4e23#Fsbh6}lc z63rSeKFn*tIT_SJDgd`y;N2qd{dAxW450o&>s0WiC21BO-H;^iq7;<@upN$7n!2rJR1au~X2B=ws_2xS8dLBQ}!bZ^5burMDjo{+y49&_b&}m_y zEpF5;uU5m#t6zxn3fx*Eqr4)bDFrI1BEZe4Ao7|~#5ABl#{iT-8c-)eB^0~?RR$`d zkQzIf4X6-s=j!fDA5a5|f7?m$x>QIbVPKk2hruPp-It)I6sVQ5?Iffj32jP&hJV0) z5Ku=Ix!JP*BBX1;jMkV!EJlG3|Df)=g;oA8%(q{3?bLu%#b4m}|o^#>f4hc=r zz4!3O6lh=ZdeAwR2TDhi;@ z84{q)8L0a*VC6@5p~e3b9^H`~9^I7&osKrG-}qa=>$1QLr{{r2Z@b@u4par5rV8Gl z%k0rx&*Ip9z@s;s1#;Eq4e*kD@DgJe{`GfV`PZLwJorMw6?FLqXq3kB|6%Cz=)=&y z{9*p>pcHrrviKRcNE+=FRd9ZRsDK>43hE4TU+4_~)BKK+zqJUo{M6E=n;YVug9!H= zaO^$^TCERije!S|F1Tg06k;KG^(#3DgGWap^t@I?x<+lb}oYM;Fl9InZ-+ z9J^y7<8|WTqtU>_bs!eJ)DJ%_iR4_N)fQp zU+`IG;O6W0pP(ah4!+0OPX#%G@+4Hp$%F4Wz{^4)!*y5LZY+b2!;H1Q zSsV#E_+~rC=rH&&%%9MT3~eNlfBRL?)vw!6gHB<@7$tzW#o!Oh- z$kRc!9p3i1D-#0)s6B2AYL9E598X!3w|BZ;6p1wp6AfbN9` zj}w46;ITwwuuEVKa@a^BIA}mewu3qdkkMV}J`Cmq;I*J9K%LY6yUZYmRC+-65X}T-d>8(0E5Y?!cVY!-KM`mk z0crGL3AhOH>AnCe%s>Z^3HWyZ0?B)P2k#l`hye{Re1L5(0-YrR9z*~QfP-p5^sPez zpbAj~RBnQ*J;z?h|DN6NI~{F24!#B7XLFms1=P5L>>dK0Ve7)btwyE5m4Dk~SN?5p zk>)=j=SA1Ec<`^k>d}47lldEDumH<>(MZ*#EC2dCpxr|>t|mcy)S|&hMuTcG(9y;G z+hV|FGGt?fOE)B7Uq`~v$0Xz*9wzYM2k2A{g4OJ6#?lSlk)UHk9ekO8!L|~CdU*n{ z7;3G-+(eWE-jU(b=?Ut=fi9ehbBuM2fnGTSt6xFm(+TkTD^UH~4oXMhv!bDU8ap6Y zU^wz`YX>E|4#*%Ahzs7{2&!Mf8|7M-cW+7-jU{Tz7i4Q<6c_)NNwj{MtCVy#A@H}`@iG3sB) z&6)>ab2R=1#W#Pu1*nP@Z~iO5-vS=*g5TVm0;*q+fhV`EkMX-7LtLK=9*)1q-{u6a zU+=xN0@bg?jCUcK2C6Z@Wi)JF$FUoAp6B@4dK8`>v3hUNlzT?OwvqAp+t*FgtgbAURJ;4!bikg@nDpw1)o;$HZe z7kF_1IQY8HL1!^ZtYfc3op}%({-6-U+I0jUV2gDW9&#X)3+V17a9EN%-gOUDx!!vX zu3SNjSir#s?p~yUE_JvLavH>~U>QV|f&&!N6eP8BW%F!4#saQfCBchckBR`U zxw<9b%C!XAI|Oa=#(E_OsB#5Q)+K-@>&}4hI|mhou=713HLFkePoLyW@DO}Q3-~Ht z#M$|vV<=&}b>T-tg9}8+`bxB#H$;U8I&Kd=*b{u6oacAgHRnhNd;W!v*b}vo7gnD7 zcBg~K>p{c#0-)sspxb-9FM1q&B>)oA04W9gu5sP$38F+aPwn4d$*5 zs5Pkp>feACO*nGHryCIWrK22!`j)@-6?hd^z6EH?fd_QFzXWK?!2rB?g82k!{e)|` zKlqYF3-I<0P)DLQ6k0rcfDd9$0bQ+J1G-wdL?r<<9+UxENl^fvcklgLYlw;g zqI`zTr}}ii0!^uUAc|%MQ03O*1zw7K$hG@W^8+SO>D&owSHE)XJ_H(A;%I&l0BQEhljQjSj0gYvQ;?&V-8j0TM=y8ZLOOieg@4;A$8K@(ijQv4A`r}0 za1K(TjJqKWDuzL2HIAc|K@DNh>C1!~!p$}+3?-^y8$m@ffz~h!^g2B9Tf^YyGiXy6 zc*KctYZ$t4Z5XzOFcPub>VjYU2@7P9U9o0J&HR-US4ma=aegz=RYdkl9#7-w|RR-o>x3-G`xz zU%|oV*nJtX`W3wL6?5?_#66g!#jf3lz=Z(l-bz^T<67JX8IM43-GSSfp!+Lbm@gs* ztwC*06sI6O2pWZekES1d$pI~H4_Y5D3++A*Ui^v?s?hOj*l+_%h=Zn35CIC7LRbb0 zO~Q*`cR)MT4)_+oCW94`ysQm*d=bm~_)kw=)voZ>8lYvS$g4HLE+V -32eitKq!`x0x8F3oA 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

    _%gUkDt^snr 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�Zh4oDI%W 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%0AiX%h&$A2fvwS`>Kjg@9xC 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 -32eitKq!`x0x8F3oA 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

)Z_!4j1OSAGq!KTm=k>`@O6yhu>%A@b8_ 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 gn*TtA&c9Di-5I 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

H+Qskqo7Ljt%?3 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%0D#N{ zji!K9GJu8`APP`5rLat|b77HifXJab&jD;H$OzEb8`v1o@gZ1JNEQpYWhVx@*9?+A zAuN!21uWA!Tv=qqAoo6kY=^Kwa%C*jtz21D#BRdPgs?zzH7wH~faGq$kX#2;-yOIdgawl8W0@}H#v&tj7cK{3f#jw@ikj&OZY(@v_uvX3ERcd( zEYn};vCD|vhs!}&Ah`uB)3>;>7>I#p;UED3VS(h9u}uHv#-cG@G=@=xX${MC3wIU; zdC*c6W(H6Wg0MjOb`3bZ#TXbEG^TUKFv>G+Vwpa}okd0gq68GP5Ee+=Ca_{qzj-P1 zbnX~NIjbFD5m3htYy>pEKmiWX1#%071u_YueM1TDA{t^h#z1 z1_Ks|Wk|Ky1Th8AQJU3j;$HL_g!H>Hj@gB%zj}x(pHwRV)k)Myz1V7%xl@ z_hiwW?jFM^VtWl@F{q!G0v=9daDvzk&au7VxB>YO!UBa9L_BLf4dGY(P-!Vq~>Jzv1)GRjSN^JdYSzBz_b zq#m?9j+ue$`eN&|XM8{h3fMC+G=Q+fZT^!E3;~DT|NsAAkBrN{t^OV6aqoCivF81c z?bF3zx30l%SA*S>c13jWoil8n6JLr8b^5gUefd@TZ@FQ~>Pkyw&c}dQv2TXc34(Gz2>Ktp|Y?buYAxu$!uD^;^&i$hj z7Qf=wZd1QuA#x`si}$0BCda!c+uAlwRzL3De5roj-Gxq0+3!NxdCG%ZuO#?g?Q?qZ z`B|9QLx#HF;_53FE>oXYIN=mm*{1i#H?Q}`-8edZM`gjhrsn^5rCOfHN^cekNZb

m41|_hdGML09KqrJVFfgcVU`h>F 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%0AC>i1Pfr*J>1Cl?9bP^ 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 - GlyphCapacity = State->RequiredGlyphCapacity; - } - Once Shape() returns 0, you are done shaping. Glyph indices are in the kbts_glyph.Id field. - Please note that, while the glyphs do also contain a Codepoint field, this field will mostly - be meaningless whenever complex shaping operations occur. This is because fonts exclusively - work on glyph indices, and a lot of ligatures are obviously a combination of several codepoints - and do not have a corresponding codepoint in the Unicode world. - The same is true when a single glyph is split into multiple glyphs. A font might decide to - decompose a letter-with-accent into a letter glyph + an accent glyph. In that case, we will - know what the accent glyph's index is, but we are not told what its codepoint is. + As you can see, there is a visual jump from 4 all the way to 5, and similarly from + 7 to 8. + This kind of discontinuity cannot work with OpenType rules, which want to work with + "neighboring" glyphs in the visual sense. - There is currently no way to track where in the source text each glyph originates from. - One thing we might try is to have a "void *UserData" member on each glyph, and flow it through - the different substitutions, but I personally have not needed this yet and I do not have good - test cases for it. If you are interested, let me know! + OpenType rules don't work with mixed script text, either. They are designed to work with + a single writing system, and ideally a single language. A typographic rule that is correct + in writing system A might not be in writing system B, and vice versa. - Final positions are in font units and can be extracted with Cursor() and PositionGlyph(). - To convert font units to fractional pixels in FreeType: - (FontX * FtSizeMetrics.x_scale) >> 16 - (FontY * FtSizeMetrics.y_scale) >> 16 - This will give you 26.6 fractional pixel units. - See https://freetype.org/freetype2/docs/reference/ft2-sizing_and_scaling.html for more info. - kbts_ResetShapeState() - Shaping - feature control - kbts_FeatureOverride() -- Describe a manual override for a font feature - kbts_FeatureOverrideFromTag() -- This also works on features that do not have a kbts_feature_id, but they will be slower. - (Calling this with a feature that has a kbts_feature_id will not be slower.) - kbts_GlyphConfig() -- Bake per-glyph parameters (for now, only feature overrides) - Shaping - feature control - incremental API - With this API, you provide a buffer first, and gradually construct the glyph_config. - kbts_EmptyGlyphConfig() - kbts_GlyphConfigOverrideFeature() - kbts_GlyphConfigOverrideFeatureFromTag() - Layout - kbts_Cursor() - kbts_PositionGlyph() - Manual memory management - kbts_SizeOfShapeState() - kbts_PlaceShapeState() - kbts_ReadFontHeader() -- Read and byteswap the top of the file. - kbts_ReadFontData() -- Read and byteswap the rest. - kbts_PostReadFontInitialize() -- Initialize auxiliary structures - Example code for reading a font file with this API looks like this: - size_t ScratchSize = kbts_ReadFontHeader(&Font, Data, Size); - size_t PermanentMemorySize = kbts_ReadFontData(&Font, malloc(ScratchSize), ScratchSize); - kbts_PostReadFontInitialize(&Font, malloc(PermanentMemorySize), PermanentMemorySize); + So, for all of these reasons, we need to split our text before sending it to the shaper. + This is what the text processing pipeline looks like: - Please note that, AS SOON AS YOU CALL ReadFontHeader(), THE FONT DATA IS MODIFIED IN-PLACE. - AS SOON AS YOU CALL ReadFontHeader(), THE FONT DATA IS MODIFIED IN-PLACE. - AS SOON AS YOU CALL ReadFontHeader(), THE FONT DATA IS MODIFIED IN-PLACE. - AS SOON AS YOU CALL ReadFontHeader(), THE FONT DATA IS MODIFIED IN-PLACE! - If you need to open the same font with another library, you need to copy the data BEFORE - calling ReadFontHeader(). + Your text A Text runs with B Sequence of glyphs C + (Probably ------------> uniform direction ------------> ready to rasterize ------------> Pixels + UTF-8) and script - The buffer you pass to ReadFontData() is temporary and can be freed once the function returns. - The buffer you pass to PostReadFontInitialize() is persistent and can only be freed once you - are done with the font. - Utility, etc. - kbts_ShaperIsComplex() - kbts_ScriptIsComplex() - kbts_InferScript() -- Stupid script detection. Do not ship this! Use script breaks instead. - kbts_DecodeUtf8() - kbts_ScriptTagToScript() - kbts_FeatureTagToId() + We call arrow A text segmentation, arrow B text shaping, and arrow C rasterization. + This library does A and B. - EXAMPLE USAGE - Complete example: - const char *String = "..."; - size_t Length = strlen(String); - // Open a font file - kbts_font Font = kbts_FontFromFile("..."); - // Make some glyphs - kbts_glyph *Glyphs = (kbts_glyph *)malloc(sizeof(kbts_glyph) * Length); - uint32_t GlyphCount = 0; - kbts_script Script = KBTS_SCRIPT_DONT_KNOW; - kbts_direction Direction = KBTS_DIRECTION_NONE; - for(size_t StringAt = 0; StringAt < Length;) - { - kbts_decode Decode = kbts_DecodeUtf8(String + StringAt, Length - StringAt); - StringAt += Decode.SourceCharactersConsumed; - if(Decode.Valid) - { - kbts_glyph Glyph = kbts_CodepointToGlyph(&Font, Decode.Codepoint); - // Easy script inference for simple cases. (This is similar to hb_buffer_guess_segment_properties.) - // If you have already segmented String with our API, you already have a script! - // So no need to pass it in that case. - // Only use this as a shorthand, when you are pretty sure String is a single - // script. - kbts_InferScript(&Direction, &Script, Glyph.Script); - Glyphs[GlyphCount++] = Glyph; - } - } - // Shape - uint32_t GlyphCapacity = Length; - kbts_shape_state *State = kbts_CreateShapeState(&Font); - // A shape_config is immutable once created. You can freely share/hash it, etc. - kbts_shape_config Config = kbts_ShapeConfig(&Font, Script, KBTS_LANGUAGE_DONT_KNOW); - while(kbts_Shape(State, &Config, Direction, Direction, Glyphs, &GlyphCount, GlyphCapacity)) - { - Glyphs = realloc(Glyphs, sizeof(kbts_glyph) * State->RequiredGlyphCapacity); - GlyphCapacity = State->RequiredGlyphCapacity; - } - // Get final positions - kbts_cursor Cursor = kbts_Cursor(Direction); - for(size_t GlyphIndex = 0; GlyphIndex < GlyphCount; ++GlyphIndex) - { - int X, Y; - kbts_PositionGlyph(&Cursor, &Glyphs[GlyphIndex], &X, &Y); - } + FEATURE OVERVIEW + This library provides: + - Unicode segmentation + LTR/RTL breaking + Script breaking + Line breaking + Word breaking + Grapheme breaking + - OpenType text shaping + Open and parse TTF and OTF fonts + Apply OpenType features such as ligatures and contextual typographic rules + All OpenType shapers are supported, which means most languages in the world are supported + (see LANGUAGE_SUPPORT for known non-supported cases) - Breaking Unicode text - finding the end of the current line: - uint32_t LineLength = 0; - kbts_break_state BreakState; - kbts_BeginBreak(&BreakState, KBTS_DIRECTION_NONE, KBTS_JAPANESE_LINE_BREAK_STYLE_NORMAL); - for(size_t CodepointIndex = 0; (CodepointIndex < CodepointCount) && !LineLength; ++CodepointIndex) - { - // We use a fixed-width encoding (codepoints) -- just pass a PositionIncrement of 1. - // If we wanted to directly segment UTF-8 in-place, we would pass in however many bytes each UTF-8 character was. + COMPILING & LINKING + This library uses declare-anywhere, so it will not compile as C89/VC6 C. - // The last parameter to AddCodepoint is a boolean signifying the end of text. - // Alternatively, we could have written: - // kbts_BreakAddCodepoint(..., 0); - // if((CodepointIndex + 1) == CodepointCount) kbts_BreakFlush(); + In one C/C++ file that #includes this file, do this: + #define KB_TEXT_SHAPE_IMPLEMENTATION + before the #include. That will create the implementation in that file. - kbts_BreakAddCodepoint(&BreakState, Codepoints[CodepointIndex], 1, (CodepointIndex + 1) == CodepointCount); - kbts_break Break; - while(kbts_Break(&BreakState, &Break)) - { - // We could just as easily check for any other kind of break here. - // See kbts_break_flags for the kind of breaks we can find. - if(Break.Flags & KBTS_BREAK_FLAG_LINE_HARD) - { - LineLength = Break.Position; - } - } - } + If you also do this: + #define KB_TEXT_SHAPE_STATIC + then all functions will be declared as static. - Control which font features apply to which glyphs: - kbts_feature_override Ss03FeatureOverrides[] = { - kbts_FeatureOverride(KBTS_FEATURE_ID_ccmp, 0, 0), // Disable ccmp - kbts_FeatureOverride(KBTS_FEATURE_ID_ss03, 0, 1), // Enable ss03 - }; - kbts_glyph_config Ss03Config = kbts_GlyphConfig(Ss03FeatureOverrides, 2); - kbts_feature_override SaltFeatureOverrides[] = { - kbts_FeatureOverride(KBTS_FEATURE_ID_salt, 1, 3), // Pick alternate glyph number 3 from feature 'salt' - }; - kbts_glyph_config SaltConfig = kbts_GlyphConfig(SaltFeatureOverrides, 1); + If you do this: + #define KB_TEXT_SHAPE_NO_CRT + then we do not use the C runtime library. + In that case, these functions are compiled out: + kbts_ShapePushFontFromFile() + kbts_FontFromFile() + Additionally, there are some functions that you will want to #define yourself: + KBTS_MEMSET + defaults to memset otherwise. + KBTS_MEMCPY + defaults to memcpy otherwise. + You can redefine the default allocator by redefining these: + KBTS_MALLOC(AllocatorData, Size) + defaults to 0 if KB_TEXT_SHAPE_NO_CRT is defined, + defaults to malloc(Size) otherwise. + KBTS_FREE(AllocatorData, Pointer) + defaults to a no-op if KB_TEXT_SHAPE_NO_CRT is defined, + defaults to free(Pointer) otherwise. + In other words, + if you do not redefine the default allocator, and you #define KB_TEXT_SHAPE_NO_CRT, + then the default allocator always returns 0. - // Then, do this before calling kbts_Shape(): - MyGlyphs[0].Config = &Ss03Config; - MyGlyphs[1].Config = &SaltConfig; + EXAMPLES + Basic + kbts_shape_context *Context = kbts_CreateShapeContext(0, 0); + kbts_ShapePushFontFromFile(Context, "myfont.ttf", 0); - Open a font with your own memory: - kbts_font Font; - // Be careful: ReadFontHeader() and ReadFontData() both byteswap font data in-place! - size_t ScratchSize = kbts_ReadFontHeader(&Font, Data, Size); - size_t PermanentMemorySize = kbts_ReadFontData(&Font, malloc(ScratchSize), ScratchSize); - kbts_PostReadFontInitialize(&Font, malloc(PermanentMemorySize), PermanentMemorySize); - // At any point, you can call kbts_FontIsValid(&Font) to check if the read went well. - // You do not need to check for font validity in between API calls here; once a font is flagged - // with an error, subsequent API calls simply do nothing. - // If you have provided real font data, kbts_FontIsValid(&Font) will most likely be true. - // We may still fail to parse some technically valid fonts that contain very deeply-nested or - // self-referential lookups. - // In those cases, Harfbuzz might open the font, but, at the time of writing, it silently limits - // the recursion depth to 64 when applying the lookups anyway. + kbts_ShapeBegin(Context, KBTS_DIRECTION_DONT_KNOW, KBTS_LANGUAGE_DONT_KNOW); + kbts_ShapeUtf8(Context, "Let's shape something!", sizeof("Let's shape something!") - 1, KBTS_USER_ID_GENERATION_MODE_CODEPOINT_INDEX); + kbts_ShapeEnd(Context); - Allocate a shape_state with your own memory: - kbts_shape_state *State = kbts_PlaceShapeState(malloc(kbts_SizeOfShapeState(Font)), kbts_SizeOfShapeState(Font)); + // Layout runs naively left to right. + kbts_run Run; + int CursorX = 0, CursorY = 0; + while(kbts_ShapeRun(Context, &Run)) + { + kbts_glyph *Glyph; + while(kbts_GlyphIteratorNext(&Run.Glyphs, &Glyph)) + { + int GlyphX = CursorX + Glyph->OffsetX; + int GlyphY = CursorY + Glyph->OffsetY; - Use a single shape_state across multiple runs: - while(kbts_Shape(State, ...)) {...} - // If the previous shaping operation completed successfully, ResetShapeState is not necessary. - // If, for any reason, you have decided to stop shaping in the middle of an operation, though, - // you need to call it. - // (This is just setting a state counter, so this is very cheap.) - kbts_ResetShapeState(State); - while(kbts_Shape(State, ...)) {...} + DisplayGlyph(Glyph->Id, GlyphX, GlyphY); - Use a single shape_state across multiple fonts: - // Different fonts have different memory requirements for shaping. However, beyond that, there - // is nothing that ties a shape_state to a font. You may use it freely with multiple fonts, as - // long as it is large enough. - size_t Size0 = kbts_SizeOfShapeState(Font0); - size_t Size1 = kbts_SizeOfShapeState(Font1); - size_t Size = MAX(Size0, Size1) - kbts_shape_state *State = kbts_PlaceShapeState(malloc(Size), Size); + CursorX += Glyph->AdvanceX; + CursorY += Glyph->AdvanceY; + } + } - Use a single shape_config across multiple runs: - // Once a shape_config has been created, it is assumed to be immutable and can be trivially shared - // between runs/operations that have the same parameters. + Font collections + void *FontData; + int FontSize; + kbts_font Font = kbts_FontFromFile("myfonts.ttc", 0, 0, 0, &FontData, &FontSize); - PERFORMANCE - Just like most libraries that interact with font files, we use the file as an in-memory database. - There are a few issues with this approach: - - Font files can be arbitrarily complex, making it difficult to predict system behavior at runtime. - - Font files are encoded in big endian byte order, which is stupid and slow. - We compensate for this by pre-processing as much as we can when opening the file. Notably, we - byteswap everything we need in-place, we precompute some useful runtime memory bounds, and we - allocate a few auxiliary acceleration structures. + kbts_ShapePushFont(Context, &Font); - Since we byteswap everything in-place, you cannot pass the same font data to kbts and to another - library, because the other library will expect everything to be big endian. + int FontCount = kbts_FontCount(FontData, FontSize); + for(int FontIndex = 1; FontIndex < FontCount; ++FontIndex) + { + kbts_ShapePushFontFromMemory(Context, FontData, FontSize, FontIndex); + } - As a result of this approach, opening fonts is slow and shaping is fast. This is very much intentional. - At the time of writing (2025-07-13), on Harfbuzz's test suite, we are, on average, 4.5x faster than - Harfbuzz on my laptop (Ryzen 9 5900HX). As fonts are complex, and Harfbuzz's test suite is quite varied, - the speedup numbers are rather spread out: - Best: 22x - 10th percentile: 6.5x - Median: 4.5x - 90th percentile: 2.5x - Worst: 1.05x - So, aside from a few extreme cases, you should expect a small integer speedup factor compared to Harfbuzz. + Feature control + kbts_ShapeBegin(Context, KBTS_DIRECTION_DONT_KNOW, KBTS_LANGUAGE_DONT_KNOW); + + kbts_ShapePushFeature(Context, KBTS_FEATURE_TAG_kern, 0); + kbts_ShapeUtf8(Context, "Without kerning", sizeof("Without kerning") - 1, KBTS_USER_ID_GENERATION_MODE_CODEPOINT_INDEX); + kbts_ShapePopFeature(Context, KBTS_FEATURE_TAG_kern); + + kbts_ShapeUtf8(Context, "With kerning", sizeof("With kerning") - 1, KBTS_USER_ID_GENERATION_MODE_CODEPOINT_INDEX); + + kbts_ShapeEnd(Context); + + @Todo: Write more examples + + API + The shaping API is broken down into two parts: the context API and the direct API. + + The context API is the higher-level API of the two and is meant to be the default + API. + It exposes an immediate-mode, procedural interface somewhat inspired by Dear Imgui + and covers most of the functionality present in the library. It notably includes + automatic segmentation into paragraphs and runs, shaping, and font fallback. + + The direct API, in contrast, is all of the tools you can use to directly manage and + manipulate shaping data. With it, you can interact directly with the lower-level + parts of the library, giving you very granular control. It is also very explicit + about memory. As a result, it is also a lot more verbose than the context API. + + The library also contains several miscellaneous utility functions that are not + obviously part of any of the two aforementioned APIs. + + + In the documentation below, all functions (as well as some structs/enums) are + marked with "search tags". + As an example, this hypothetical function: + + int kbts_Foo(int X); + + Will be presented like this: + + :kbts_Foo + :Foo + int kbts_Foo(int X); + + Allowing you to easily search for its documentation by searching for either ":Foo" + or ":kbts_Foo". + + MEMORY MANAGEMENT + kb_text_shape takes manual memory management seriously, and tries to give the user as much + control over memory as possible. + + Whenever it is possible for you to pass your own buffer into a function, we allow it. + Whenever it is not possible, we allow specifying a custom allocator. + An allocator is simply a function that manages memory: + + :kbts_allocator_function + :allocator_function + typedef void kbts_allocator_function(void *Data, kbts_allocator_op *Op); + [Data] the custom data pointer you passed in along with your allocator. + [Op] the memory request. It is of this type: + + :kbts_allocator_op + :allocator_op + typedef struct kbts_allocator_op + { + kbts_allocator_op_kind Kind; + + union + { + kbts_allocator_op_allocate Allocate; + kbts_allocator_op_free Free; + }; + } kbts_allocator_op; + + And the possible op kinds are: + KBTS_ALLOCATOR_OP_KIND_ALLOCATE + KBTS_ALLOCATOR_OP_KIND_FREE + + ALLOCATE expects you to fill in Op->Allocate.Pointer. + The allocation does not need to be aligned. + FREE expects you to free Op->Free.Pointer. + + THE CONTEXT API + CONTEXT:CREATION + :kbts_SizeOfShapeContext + :SizeOfShapeContext + int kbts_SizeOfShapeContext() + Tells you how big of a buffer you need to provide to kbts_PlaceShapeContext. + + :kbts_PlaceShapeContext + :PlaceShapeContext + kbts_shape_context *kbts_PlaceShapeContext(kbts_allocator_function *Allocator, void *AllocatorData, void *Memory) + Places a context at Memory and initializes it. + [Allocator] will be used for subsequent allocations. + + :kbts_PlaceShapeContextFixedMemory + :PlaceShapeContextFixedMemory + kbts_shape_context *kbts_PlaceShapeContextFixedMemory(void *Memory, int Size) + Places a context at Memory and initializes it. + This context will only use the [Size] bytes located at [Memory] for its allocations. + + :kbts_CreateShapeContext + :CreateShapeContext + kbts_shape_context *kbts_CreateShapeContext(kbts_allocator_function *Allocator, void *AllocatorData) + Allocates a context using [Allocator] and initializes it. + + :kbts_DestroyShapeContext + :DestroyShapeContext + void kbts_DestroyShapeContext(kbts_shape_context *Context) + Frees all context memory. + If the Context was allocated by kbts_CreateShapeContext, then it is also freed. + + CONTEXT:FONT HANDLING + The context is capable of managing multiple fonts through a font stack. + The font stack will hold references to all fonts in use by the context. Whenever + you try to shape some text, the context will check to see if it is supported by + the font at the top of the stack. If it is not, it will try the next font down, + and so on, until all fonts have been tried. As such, you should push your fallback + fonts first, and your preferred fonts last. + + :kbts_ShapePushFontFromFile + :ShapePushFontFromFile + kbts_font *kbts_ShapePushFontFromFile(kbts_shape_context *Context, const char *FileName, int FontIndex) + (This function is not available if KB_TEXT_SHAPE_NO_CRT is defined.) + + Opens the file corresponding to [FileName], parses the [FontIndex]th font + within it, and, if successful, pushes the result onto the stack. + + A [return value] of 0 could mean that the stack is out of space (see + KBTS_CONTEXT_MAX_FONT_COUNT), that the file could not be found or opened, + or that the parse has failed. + + :kbts_ShapePushFontFromMemory + :ShapePushFontFromMemory + kbts_font *kbts_ShapePushFontFromMemory(kbts_shape_context *Context, void *Memory, int Size, int FontIndex) + Parses the [FontIndex]th font in [Memory] and pushes the result to the font + stack. + + A [return value] of 0 could mean that the stack is out of space (see + KBTS_CONTEXT_MAX_FONT_COUNT) or that the font could not be parsed. + + :kbts_ShapePushFont + :ShapePushFont + kbts_font *kbts_ShapePushFont(kbts_shape_context *Context, kbts_font *Font) + Pushes the pre-parsed [Font] onto the stack. + + A [return value] of 0 means that the stack has run out of space (see + KBTS_CONTEXT_MAX_FONT_COUNT). + + :kbts_ShapePopFont + :ShapePopFont + kbts_font *kbts_ShapePopFont(kbts_shape_context *Context) + Removes the topmost font from the stack. + + A [return value] of 0 means that there is no font to remove. + A non-null [return value] is the original font pointer that was pushed. + + If the context allocated the font itself, using kbts_ShapePushFontFromFile or + kbts_ShapePushFontFromMemory, then the pointer is still returned, but it points to + freed memory. + + CONTEXT:SHAPING + :kbts_ShapeBegin + :ShapeBegin + void kbts_ShapeBegin(kbts_shape_context *Context, kbts_direction ParagraphDirection, kbts_language Language) + Begins a shaping pass. + + [ParagraphDirection] is sometimes called the "document direction". It can significantly + affect segmentation. Bidirectionality in text works like a stack: the default direction + is at the bottom of the stack, and, sometimes, text can _temporarily_ take a different + direction. In the end, though, it will always go back to the document direction. + + To illustrate, a period followed by a space ". " typically ends up resetting the current + direction to the paragraph direction. This means that, if my paragraph direction is + left-to-right, and I am shaping Arabic text, then each Arabic sentence will be + right-to-left, but the sentences themselves will be sequenced left-to-right. If + [ParagraphDirection] is KBTS_DIRECTION_DONT_KNOW, then the context takes the first + directional hint in the text as the paragraph direction. + + [Language] is used to select which font rules are used. Knowing this allows access to + language-specific typographical features. If [Language] is KBTS_LANGUAGE_DONT_KNOW, then + the default, language-agnostic font rules are used. + + :kbts_ShapeEnd + :ShapeEnd + void kbts_ShapeEnd(kbts_shape_context *Context) + Ends a shaping pass. + + This means you are done providing input to the context, and, in turn, that + you can start getting results from it with kbts_ShapeRun(). + + :kbts_ShapeRun + :ShapeRun + int kbts_ShapeRun(kbts_shape_context *Context, kbts_run *Run) + Once you've called kbts_ShapeEnd, you can get the resulting runs by calling this + function repeatedly. + + !!! CAREFUL !!! Memory is reused from one run to the next, so you cannot + trivially store [Run] and reuse it later. Instead, you should traverse the + glyphs using the iterator provided in Run.Glyphs and extract whatever data + you need before calling kbts_ShapeRun again. + + The [return value] is non-zero if a run was shaped. + When there is no text left to shape, the [return value] is 0. + + kbts_ShapeEnd(Context); + kbts_run Run; + while(kbts_ShapeRun(Context, &Run)) + { + // Handle Run + } + + :kbts_ShapePushFeature + :ShapePushFeature + void kbts_ShapePushFeature(kbts_shape_context *Context, kbts_u32 FeatureTag, int Value) + The context has a feature stack that allows you to manipulate font features hierarchically. + When you give text to the context, it will apply all feature overrides that are on the + stack at the time. + If two feature overrides use the same tag, then only the latest one, i.e. the one higher + in the stack, is applied. + + :kbts_ShapePopFeature + :ShapePopFeature + int kbts_ShapePopFeature(kbts_shape_context *Context, kbts_u32 FeatureTag) + Removes the latest feature override with tag [FeatureTag]. + The [return value] is non-zero if an override was found and removed, 0 if not. + + :kbts_ShapeCodepointWithUserId + :ShapeCodepointWithUserId + void kbts_ShapeCodepointWithUserId(kbts_shape_context *Context, int Codepoint, int UserId) + Inputs a codepoint to shape. + [Codepoint] is a Unicode codepoint. + [UserId] is an arbitrary identifier that you will get back when reading the results. + This is often some kind of index into the input text so that you can perform hit-testing. + If an automatic codepoint index is fine for you, consider using kbts_ShapeCodepoint. + + :kbts_ShapeCodepoint + :ShapeCodepoint + void kbts_ShapeCodepoint(kbts_shape_context *Context, int Codepoint) + Inputs a codepoint to shape. + + The codepoint's user ID will be an implicit codepoint index assigned by the + context. + + :kbts_ShapeUtf32WithUserId + :ShapeUtf32WithUserId + void kbts_ShapeUtf32WithUserId(kbts_shape_context *Context, + int *Utf32, int Length, + int UserId, int UserIdIncrement); + Inputs a block of UTF-32 text to shape. + + User IDs for each codepoint start at [UserId] and increment by [UserIdIncrement] + for every codepoint. + + :kbts_ShapeUtf32 + :ShapeUtf32 + void kbts_ShapeUtf32(kbts_shape_context *Context, int *Utf32, int Length) + Same as kbts_ShapeUtf8WithUserId, but using the context's implicit user ID counter. + + :kbts_ShapeUtf8WithUserId + :ShapeUtf8WithUserId + void kbts_ShapeUtf8WithUserId(kbts_shape_context *Context, + const char *Utf8, int Length, + int UserId, kbts_user_id_generation_mode UserIdGenerationMode); + Inputs a block of UTF-8 text to shape. + + User IDs for the corresponding codepoints start at [UserId]. + If [UserIdGenerationMode] is KBTS_USER_ID_GENERATION_MODE_CODEPOINT_INDEX, + each codepoint will increment the user ID by 1. + If [UserIdGenerationMode] is KBTS_USER_ID_GENERATION_MODE_CODEPOINT_INDEX, + each codepoint will increment the user ID by the length of its encoding in + UTF-8. + + :kbts_ShapeUtf8 + :ShapeUtf8 + void kbts_ShapeUtf8(kbts_shape_context *Context, + const char *Utf8, int Length, + kbts_user_id_generation_mode UserIdGenerationMode) + Same as kbts_ShapeUtf8WithUserId, but using the context's implicit user ID + counter. + + User IDs for the corresponding codepoints start at the context's implicit + user ID counter. + If [UserIdGenerationMode] is KBTS_USER_ID_GENERATION_MODE_CODEPOINT_INDEX, + each codepoint will increment the user ID by 1. + If [UserIdGenerationMode] is KBTS_USER_ID_GENERATION_MODE_CODEPOINT_INDEX, + each codepoint will increment the user ID by the length of its encoding in + bytes in UTF-8. + + :kbts_ShapeCurrentCodepointsIterator + :ShapeCurrentCodepointsIterator + kbts_shape_codepoint_iterator kbts_ShapeCurrentCodepointsIterator(kbts_shape_context *Context) + The [return value] is an iterator that goes over all of the codepoints fed to + [Context] so far. + + These codepoints are tagged with user IDs, segmentation info and more. See + the definition of kbts_shape_codepoint for details. + + !!! WARNING !!! + Remember that segmentation is buffered, so, until you call kbts_ShapeEnd, + some codepoints might not be completely filled in yet! + + Call kbts_ShapeCodepointIteratorNext repeatedly to loop through the + corresponding codepoints. + + :kbts_ShapeCodepointIteratorIsValid + :ShapeCodepointIteratorIsValid + int kbts_ShapeCodepointIteratorIsValid(kbts_shape_codepoint_iterator *It) + The [return value] is non-zero if there is still a codepoint to iterate, + zero if not. + + :kbts_ShapeCodepointIteratorNext + :ShapeCodepointIteratorNext + int kbts_ShapeCodepointIteratorNext(kbts_shape_codepoint_iterator *It, kbts_shape_codepoint *Codepoint, int *CodepointIndex) + Gets the next codepoint from the context [It] was initialized from and writes + it to [Codepoint]. + + If [CodepointIndex] is non-zero, then it is filled with [Codepoint]'s index. + + The [return value] is non-zero if a codepoint was found, 0 if not. + + :kbts_ShapeGetShapeCodepoint + :ShapeGetShapeCodepoint + int kbts_ShapeGetShapeCodepoint(kbts_shape_context *Context, int CodepointIndex, kbts_shape_codepoint *Codepoint) + Gets the [CodepointIndex]th codepoint from [Context] and writes it to + [Codepoint]. + + If you are reading glyphs back from the context, then you can use the + UserIdOrCodepointIndex field of kbts_glyph here. + + !!! WARNING !!! + When using the context API, UserIdOrCodepointIndex will _always_ be a + codepoint index. To get your original user ID, you need to do: + + kbts_shape_codepoint ShapeCodepoint; + kbts_ShapeGetShapeCodepoint(Context, Glyph->UserIdOrCodepointIndex, &ShapeCodepoint); + int MyUserId = ShapeCodepoint.UserId; + + The [return value] is non-zero if [CodepointIndex] is in-bounds, 0 if not. + + CONTEXT:MISCELLANEOUS + :kbts_ShapeError + :ShapeError + kbts_shape_error kbts_ShapeError(kbts_shape_context *Context); + Get the first error that occurred on [Context]. + + Once a context is tagged with an error, most operations on it will do nothing. + Obviously, you can always destroy it. + + :kbts_ShapeManualBreak + :ShapeManualBreak + void kbts_ShapeManualBreak(kbts_shape_context *Context); + Forces a run break at the current position in the Context. + + This will flush the current segmentation state just like an end-of-text would, + and restart it as if it was at a start-of-text. + + This will also generate a KBTS_BREAK_FLAG_MANUAL at the current position. + + You do not need to be in manual break mode for this function to work. + + :kbts_ShapeBeginManualRuns + :ShapeBeginManualRuns + void kbts_ShapeBeginManualRuns(kbts_shape_context *Context); + Disables the context's automatic segmentation, and enters a manual break mode. + + :kbts_ShapeNextManualRun + :ShapeNextManualRun + void kbts_ShapeNextManualRun(kbts_shape_context *Context, kbts_direction Direction, kbts_script Script); + Add a run break at the current place in the input stream. + + Since the context's segmentation is disabled, it cannot know which direction + and script to use, so you need to provide them with [Direction] and [Script]. + + Outside of manual break mode, this function is a no-op. + + :kbts_ShapeEndManualRuns + :ShapeEndManualRuns + void kbts_ShapeEndManualRuns(kbts_shape_context *Context); + Ends manual break mode and re-enables the context's automatic segmentation. + + Note that this will force natural break barriers too, just like an end-of-text + would. + + Outside of manual break mode, this function is a no-op. + + DIRECT SHAPING API + When trying to shape things yourself, there are four main pieces of state you will need: + - Font data (kbts_font) + - A shaping configuration (kbts_shape_config) + A shaping configuration holds a bunch of precomputed data for a given combination of + font, script and language. + You can think of it as a pipeline state in a modern graphics API. + In practice, you are only ever shaping text with a single active configuration. + - Glyph storage (kbts_glyph_storage) + Glyph storage fills two roles: it allocates and holds glyph data, and it also manages + a set of active glyphs. + The active glyph set part is used by the library. As a user, you only need to care + about the memory allocation part. + - Scratch memory + Unfortunately, shaping can have a very unpredictable memory footprint, so all shaping + operations require some amount of scratch space that we cannot compute beforehand. + + The central function to call is this: + + :kbts_ShapeDirect + :ShapeDirect + kbts_shape_error kbts_ShapeDirect(kbts_shape_config *Config, kbts_glyph_storage *Storage, + kbts_direction RunDirection, + kbts_allocator_function *Allocator, void *AllocatorData, + kbts_glyph_iterator *Output) + [RunDirection] is the direction of the specific run being shaped. + If the [return value] is KBTS_SHAPE_ERROR_NONE, then the shaping operation + completed successfully. + + Shaping output is returned in [Output]. You can go through the resulting glyphs + with kbts_GlyphIteratorNext. + + Note that kbts_ShapeDirect does not care about the paragraph direction. + Glyphs are always returned in left-to-right order. In other words, RTL runs + are flipped so that visual order is consistent. + + + :kbts_ShapeDirectFixedMemory + :ShapeDirectFixedMemory + kbts_shape_error kbts_ShapeDirectFixedMemory(kbts_shape_config *Config, kbts_glyph_storage *Storage, + kbts_direction RunDirection, + void *Memory, int Size, + kbts_glyph_iterator *Output) + Same as kbts_ShapeDirect, but only uses the [Size] bytes at [Memory] for allocations. + + The rest of the direct API is more or less about preparing the data you need to call + kbts_ShapeDirect. + + DIRECT:FONT HANDLING + :kbts_FontCount + :FontCount + int kbts_FontCount(void *Data, int Size) + Parses the beginning of the file and returns the number of fonts contained + within the file data. + + While most font files contain single fonts, font collections contain + several. This function will return 0 if [Data] is invalid, 1 if it represents + a single font, and possibly more if it represents a collection. + + For all functions that require a font index, passing 0 is always safe no + matter the kind of file. + + :kbts_FontFromFile + :FontFromFile + kbts_font kbts_FontFromFile(const char *FileName, int FontIndex, + kbts_allocator_function *Allocator, void *AllocatorData, + void **FileData, int *FileSize) + (This function is not available if KB_TEXT_SHAPE_NO_CRT is defined.) + Opens the file at [FileName], parses it and returns the [FontIndex]th font. + You can call kbts_FontIsValid to check if the [return value] is usable. + + If [FileData] is non-zero, it is filled with a pointer to the file's contents. + This pointer is allocated using [Allocator]. If [FileData] is 0, it is freed + before the function returns. + If [FileSize] is non-zero, it is filled with the size of the file's contents. + + If [FontIndex] is out of range, the [return value] is invalid. + + :kbts_FontFromMemory + :FontFromMemory + kbts_font kbts_FontFromMemory(void *FileData, int FileSize, int FontIndex, + kbts_allocator_function *Allocator, void *AllocatorData) + Parses the [FontIndex]th font in [FileData]. + You can call kbts_FontIsValid to check if the [return value] is usable. + + :kbts_FontIsValid + :FontIsValid + int kbts_FontIsValid(kbts_font *Font) + Returns whether a font is usable. + + :kbts_LoadFont + :LoadFont + kbts_load_font_error kbts_LoadFont(kbts_font *Font, kbts_load_font_state *State, + void *FontData, int FontDataSize, int FontIndex, + int *ScratchSize, int *OutputSize) + Parses the [FontIndex]th font in [FontData] and puts the result into [Font] and [State]. + + [State] needs to be zeroed before calling this function. + + If the data represents a TrueType/OpenType font, we need to extract the data + we need and create some additional data structures. In this case, the [return + value] is KBTS_LOAD_FONT_ERROR_NEED_TO_CREATE_BLOB, and [ScratchSize] and + [OutputSize] are filled with the amount of memory we need to create our + blob. You can then initialize this blob with kbts_PlaceBlob. + + If the data represents a kbts blob, then nothing needs to be done, and [Font] is + immediately usable. + + Any value of [FontIndex] less than kbts_FontCount(FontData, FontDataSize) is + acceptable. + + If we could not find any useful font data, the [return value] is + KBTS_LOAD_FONT_ERROR_INVALID_FONT. + + :kbts_PlaceBlob + :PlaceBlob + kbts_load_font_error kbts_PlaceBlob(kbts_font *Font, kbts_load_font_state *State, + void *ScratchMemory, void *OutputMemory) + Creates a kbts blob from font data, and places it in [OutputMemory]. + [Font] is the resulting font. + [State] is the state you passed into kbts_LoadFont. + [ScratchMemory] needs to be as big as the [ScratchSize] returned by kbts_LoadFont. + You can free this buffer once this function returns. + [OutputMemory] needs to be as big as the [OutputSize] returned by kbts_LoadFont. + This buffer will be used by [Font] until it is freed by kbts_FreeFont. + + :kbts_FreeFont + :FreeFont + void kbts_FreeFont(kbts_font *Font) + If [Font] used allocators to allocate its data (for instance, if [Font] was + returned by kbts_FontFromFile), frees all of [Font]'s buffers. + Otherwise, does nothing. + + :kbts_GetFontInfo + :GetFontInfo + void kbts_GetFontInfo(kbts_font *Font, kbts_font_info *Info) + Writes a bunch of useful metadata about [Font] into [Info]. + You can use this function to extract styling, name and licensing information + from a font. + + We use a simplified representation for font weight and width that is fine for + classic font selection, e.g. "I need a bold font". OpenType fonts may feature + finer-grained metrics, and we currently do not expose/support those. + + :kbts_font_style_flags + :font_style_flags + [Info]->StyleFlags can be: + KBTS_FONT_STYLE_FLAG_NONE (no useful style flags have been found) + KBTS_FONT_STYLE_FLAG_REGULAR + KBTS_FONT_STYLE_FLAG_BOLD + KBTS_FONT_STYLE_FLAG_ITALIC + A given font can be bold and italic at the same time, but probably not regular + and bold and probably not regular and italic. + + If [Font] is not a valid font, then [Info] will be zeroed. + + DIRECT:SHAPE CONFIG + :kbts_SizeOfShapeConfig + :SizeOfShapeConfig + int kbts_SizeOfShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language) + Returns how large the buffer you pass into kbts_PlaceShapeConfig needs to be. + + :kbts_PlaceShapeConfig + :PlaceShapeConfig + kbts_shape_config *kbts_PlaceShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language, + void *Memory) + Writes a shape config into [Memory] and returns a pointer to it. + [Memory] needs to be at least kbts_SizeOfShapeConfig([Font], [Script], [Language]) bytes. + + :kbts_CreateShapeConfig + :CreateShapeConfig + kbts_shape_config *kbts_CreateShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language, + kbts_allocator_function *Allocator, void *AllocatorData) + Allocates and initializes a shape config. + + :kbts_DestroyShapeConfig + :DestroyShapeConfig + void kbts_DestroyShapeConfig(kbts_shape_config *Config) + If [Config] was allocated in kbts_CreateShapeConfig, frees all of [Config]'s data. + Otherwise, nothing is done. + + DIRECT:GLYPH STORAGE + kbts_glyph_storage is a public struct: + + :kbts_glyph_storage + :glyph_storage + typedef struct kbts_glyph_storage + { + kbts_arena Arena; + + kbts_glyph GlyphSentinel; + kbts_glyph FreeGlyphSentinel; + } kbts_glyph_storage; + + A zeroed kbts_glyph_storage will auto-initialize itself when you try to use it. + + Arena requires an allocator. By default, it will be initialized to KBTS_MALLOC + and KBTS_FREE. + You can specify your own allocator by writing to Arena.Allocator and + Arena.AllocatorData before trying to use a kbts_glyph_storage. + Alternatively, you can use kbts_InitializeGlyphStorage() to accomplish the + same thing. + + :kbts_InitializeGlyphStorage + :InitializeGlyphStorage + int kbts_InitializeGlyphStorage(kbts_glyph_storage *Storage, kbts_allocator_function *Allocator, void *AllocatorData) + Initializes [Storage] to use [Allocator] and [AllocatorData]. + + This is equivalent to setting [Storage]->Arena.Allocator and + [Storage]->Arena.AllocatorData, and setting all other members to 0. + + The [return value] is non-zero if [Storage] is non-null. + + :kbts_InitializeGlyphStorageFixedMemory + :InitializeGlyphStorageFixedMemory + int kbts_InitializeGlyphStorageFixedMemory(kbts_glyph_storage *Storage, void *Memory, int MemorySize) + Initializes [Storage] to use a fixed-size buffer of size [MemorySize] located at [Memory]. + If [Storage] needs more memory than [MemorySize], allocations will fail. + + The [return value] is non-zero if [Storage] is non-null and [MemorySize] is + large enough to initialize [Storage]'s arena. (Currently, this is 5 pointers' + worth of bytes.) + + :kbts_PushGlyph + :PushGlyph + kbts_glyph *kbts_PushGlyph(kbts_glyph_storage *Storage, + kbts_font *Font, int Codepoint, kbts_glyph_config *Config, int UserId) + Adds a glyph to [Storage]'s active glyph set and returns a pointer to it. + + [Font] is used to initialize the glyph's glyph ID. It is assumed that [Font] is + the same as the kbts_shape_config's Font field passed into kbts_ShapeDirect. + + [Config] is the glyph's configuration and needs to stay live until kbts_ShapeDirect + completes. See DIRECT:GLYPH CONFIG for more details. + + [UserId] is a user-provided unique identifier that you can get back once shaping + is done. + + The [return value] might be zero if [Storage]'s allocator fails. + + :kbts_ClearActiveGlyphs + :ClearActiveGlyphs + void kbts_ClearActiveGlyphs(kbts_glyph_storage *Storage) + Clears [Storage]'s active glyph set. + This does not free any memory; rather, it puts the active glyphs in a free list. + + :kbts_FreeAllGlyphs + :FreeAllGlyphs + void kbts_FreeAllGlyphs(kbts_glyph_storage *Storage) + Frees all memory allocated by [Storage]. + + :kbts_CodepointToGlyph + :CodepointToGlyph + kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, int Codepoint, kbts_glyph_config *Config, int UserId) + You can create glyphs without a glyph storage at all with this function. + + :kbts_CodepointToGlyphId + :CodepointToGlyphId + int kbts_CodepointToGlyphId(kbts_font *Font, int Codepoint) + Gets the glyph ID corresponding to [Codepoint] from [Font]. + A glyph ID of 0 means that the codepoint is not present in the font. + Note that this is not thorough enough to be a good font coverage test! + See OTHER:FONT COVERAGE TEST for this. + + :kbts_ActiveGlyphIterator + :ActiveGlyphIterator + kbts_glyph_iterator kbts_ActiveGlyphIterator(kbts_glyph_storage *Storage) + Returns an iterator to traverse [Storage]'s active glyph set. + + See OTHER:GLYPH ITERATION for more details on glyph iterators. + + DIRECT:GLYPH CONFIG + The shaper figures out most of the work it needs to do based on the writing system + it is shaping. + + However, some fonts support optional, toggleable features, like "make this text + smallcaps". For things like this, you will want to create a kbts_glyph_config. + You can then pass it to glyph creation functions or write it to the Config field + of a kbts_glyph. + + A kbts_glyph_config can hold any number of feature overrides. A feature override + is a feature tag and a value. Most of the time, you only care whether the value + is 0 or 1, but a few features actually care about the exact value. (You can think + of a feature that is like "when I am enabled, change this letter to one of these + alternatives". In that case, the value you provide in the feature override is used + as an index into the array of alternatives.) + + :kbts_SizeOfGlyphConfig + :SizeOfGlyphConfig + int kbts_SizeOfGlyphConfig(kbts_feature_override *Overrides, int OverrideCount) + Returns the buffer size needed to hold a kbts_glyph_config that describes [Overrides]. + This size can vary a lot depending on the kind of feature overrides you specify. + Built-in OpenType features with values of 0 or 1 are "free"; they are packed in a + fixed-size representation which does not change the config's memory footprint. + On the other hand, if you need non-binary values, or non-standard features, then + we need to store a description of the override itself, which requires memory. + + :kbts_PlaceGlyphConfig + :PlaceGlyphConfig + kbts_glyph_config *kbts_PlaceGlyphConfig(kbts_feature_override *Overrides, int OverrideCount, void *Memory) + Writes a kbts_glyph_config that describes [Overrides] into [Memory], and returns a + pointer to it. + The kbts_glyph_config uses its own representation for overrides, so you can modify + [Overrides] once this function returns. + + :kbts_CreateGlyphConfig + :CreateGlyphConfig + kbts_glyph_config *kbts_CreateGlyphConfig(kbts_feature_override *Overrides, int OverrideCount, kbts_allocator_function *Allocator, void *AllocatorData) + Allocates a kbts_glyph_config that describes [Overrides] and returns a pointer to + it. + The kbts_glyph_config uses its own representation for overrides, so you can modify + [Overrides] once this function returns. + + :kbts_DestroyGlyphConfig + :DestroyGlyphConfig + void kbts_DestroyGlyphConfig(kbts_glyph_config *Config) + If [Config] was allocated in kbts_CreateGlyphConfig, frees all of its data. + Otherwise, does nothing. + + DIRECT:SEGMENTATION + kbts_break_state is the central struct used for segmentation. It contains all of the state + needed to perform fixed-memory segmentation of text. + + :kbts_BreakBegin + :BreakBegin + void kbts_BreakBegin(kbts_break_state *State, + kbts_direction ParagraphDirection, + kbts_japanese_line_break_style JapaneseLineBreakStyle, + kbts_break_config_flags ConfigFlags) + Initializes [State] for segmentation. + + [ParagraphDirection] is the top-level flow direction of your document or layout. + If [ParagraphDirection] is KBTS_DIRECTION_DONT_KNOW, then [State]'s + ParagraphDirection will be initialized to the first direction we find + while segmenting. + + :kbts_japanese_line_break_style + :japanese_line_break_style + [JapaneseLineBreakStyle] can be one of the following: + + KBTS_JAPANESE_LINE_BREAK_STYLE_STRICT + KBTS_JAPANESE_LINE_BREAK_STYLE_NORMAL + KBTS_JAPANESE_LINE_BREAK_STYLE_LOOSE + + Japanese text contains "kinsoku" characters, around which breaking a line is + forbidden. Exactly which characters are "kinsoku" or not depends on the context: + + - Strict style has the largest amount of kinsoku characters, which leads to + longer lines. + The Unicode standard does not define what strict style is used for. + Supposedly, it is used for anything that does not fall into the other + two categories of text. + + - Loose style has the smallest amount of kinsoku characters, which leads + to smaller lines. + According to the Unicode standard, loose style is used for newspapers. + I assume it is also used for any other narrow column format. + + - Normal style is somewhere in the middle. + According to the Unicode standard, normal style is used for books and + documents. + + Note that, while the Unicode standard mentions all three of these styles, it + does not mention any differences between the normal and loose styles. As such, + normal and loose styles currently behave the same. + + :kbts_kbts_break_config_flags + :kbts_break_config_flags + [ConfigFlags] can be a combination of the following: + + KBTS_BREAK_CONFIG_FLAG_END_OF_TEXT_GENERATES_HARD_LINE_BREAK + The Unicode standard specifies that the end of a text should generate a + hard line break. However, this is an awkward rule to uphold in practical + contexts, because it makes the case where the text ends in a newline + ambiguous. So, by default, we disable it. + + Without this flag (default behavior): + \n generates a hard line break at position 1 + A generates no hard line break + + With this flag (Unicode behavior): + \n generates a hard line break at position 1 + A generates a hard line break at position 1 + + :kbts_BreakAddCodepoint + :BreakAddCodepoint + void kbts_BreakAddCodepoint(kbts_break_state *State, int Codepoint, int PositionIncrement, int EndOfText) + Feeds [Codepoint] to [State]. + + [PositionIncrement] is used to update an internal cursor and fill out + kbts_break's Position field. If you only care about codepoint indices, pass + 1. Maybe you want to pass in the number of bytes it took to decode the + codepoint, though, to be able to directly index UTF-8 text. + + If [EndOfText] is non-zero, kbts_BreakEnd is called after adding [Codepoint]. + + Every time you call kbts_BreakAddCodepoint, you need to empty the break + buffer by calling kbts_Break repeatedly. + + :kbts_BreakEnd + :BreakEnd + void kbts_BreakEnd(kbts_break_state *State) + Flushes all pending breaks and finishes segmentation. + + You then obtain breaks by repeatedly calling kbts_Break, just as you would + after kbts_BreakAddCodepoint. + + :kbts_Break + :Break + int kbts_Break(kbts_break_state *State, kbts_break *Break) + If any breaks have been found, writes one to [Break] and returns a non-zero + value. If not, returns 0. + + kbts_break looks like this: + + typedef struct kbts_break + { + int Position; + kbts_break_flags Flags; + kbts_direction Direction; // Only valid if (Flags & KBTS_BREAK_FLAG_DIRECTION). + kbts_script Script; // Only valid if (Flags & KBTS_BREAK_FLAG_SCRIPT). + } kbts_break; + + Position is the position of the break, informed by the PositionIncrement + you passed to kbts_BreakAddCodepoint. + + Flags can be any combination of: + KBTS_BREAK_FLAG_DIRECTION + Indicates a change of direction. + + KBTS_BREAK_FLAG_SCRIPT + Indicates a change of script. + + KBTS_BREAK_FLAG_GRAPHEME + Indicates the start of a grapheme. + Unicode describes a grapheme as a visual unit. In practice, you care about + graphemes for font coverage testing and caret positioning. + + The way you do grapheme-aware font coverage testing is you split your text + into graphemes, then, for each grapheme, check if it is supported by your + font. Grapheme boundaries are nice because they group codepoints that may + want to combine together, but it separates codepoints that probably won't + recombine, so they work as an synchronization point for font coverage. + + Caret positioning typically works in graphemes, too. When the user presses + the right arrow, you would go to the next grapheme boundary instead of + naively going to the next codepoint. + + KBTS_BREAK_FLAG_WORD + Indicates the start of a word. + + KBTS_BREAK_FLAG_LINE_SOFT + A soft line break tells you where you are able to break lines. + In Unicode land, you cannot break a line without one of these! + + KBTS_BREAK_FLAG_LINE_HARD + A hard line break should always be respected. + + KBTS_BREAK_FLAG_MANUAL + This is used internally by the kbts_shape_context for manual segmentation. + (See kbts_ShapeBeginManualRuns for more details.) + + !CAREFUL! For a given break type, breaks are guaranteed to be returned in order. + However, there is no such ordering guarantee between different types + of breaks. Each type of break is processed separately, and the + corresponding Unicode algorithms all require some kind of buffering + scheme to work in fixed memory, so, while any given buffer is consistent + with itself, we cannot order multiple buffers together. + + :kbts_BreakEntireString + :BreakEntireString + void kbts_BreakEntireString(kbts_direction ParagraphDirection, + kbts_japanese_line_break_style JapaneseLineBreakStyle, + kbts_break_config_flags ConfigFlags, + void *Input, int InputSizeInBytes, kbts_text_format InputFormat, + kbts_break *Breaks, int BreakCapacity, int *BreakCount, + kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount) + Goes through the entire buffer at [Input] and finds all breaks. + [Input] is of type [InputFormat], which can be one of: + KBTS_TEXT_FORMAT_UTF32 + KBTS_TEXT_FORMAT_UTF8 + + Breaks will be written to [Breaks], up to [BreakCapacity]. Regardless of + whether [BreakCapacity] is large enough or not, the amount of breaks found + will be written to [BreakCount]. Unlike kbts_Break, here, [Breaks] are + guaranteed to be ordered. + + [BreakFlags] is a parallel array to the input sequence. If a break is found + at position X, then BreakFlags[X] will be filled with the appropriate flags, + up to [BreakFlagCapacity]. Regardless of whether [BreakFlagCapacity] is large + enough or not, the required capacity is written to [BreakFlagCount]. + + :kbts_BreakEntireStringUtf32 + :BreakEntireStringUtf32 + void kbts_BreakEntireStringUtf32(kbts_direction ParagraphDirection, + kbts_japanese_line_break_style JapaneseLineBreakStyle, + kbts_break_config_flags ConfigFlags, + int *Utf32, int Utf32Count, + kbts_break *Breaks, int BreakCapacity, int *BreakCount, + kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount) + Convenience wrapper for kbts_BreakEntireString for UTF-32 text. + + :kbts_BreakEntireStringUtf8 + :BreakEntireStringUtf8 + void kbts_BreakEntireStringUtf8(kbts_direction ParagraphDirection, + kbts_japanese_line_break_style JapaneseLineBreakStyle, + kbts_break_config_flags ConfigFlags, + const char *Utf8, int Utf8Length, + kbts_break *Breaks, int BreakCapacity, int *BreakCount, + kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount) + Convenience wrapper for kbts_BreakEntireString for UTF-8 text. + + This wrapper passes the amount of bytes used to decode each codepoint into + kbts_BreakAddCodepoint's PositionIncrement argument. This means that break + positions written to [Breaks] point into the UTF-8 stream. + + :kbts_GuessTextProperties + :GuessTextProperties + void kbts_GuessTextProperties(void *Text, int TextSizeInBytes, kbts_text_format Format, + kbts_direction *Direction, kbts_script *Script) + Goes through the input sequence at [Text], finds the first direction and + script, and writes them to [Direction] and [Script] respectively. + + This is a quick-and-dirty way of finding out simple facts about your text. + However, the results only really make sense when you know [Input] is + mono-script and mono-direction. + + :kbts_GuessTextPropertiesUtf32 + :GuessTextPropertiesUtf32 + void kbts_GuessTextPropertiesUtf32(const int *Utf32, int Utf32Count, + kbts_direction *Direction, kbts_script *Script) + Convenience wrapper for kbts_GuessTextProperties for UTF-32 text. + + :kbts_GuessTextPropertiesUtf8 + :GuessTextPropertiesUtf8 + void kbts_GuessTextPropertiesUtf8(const char *Utf8, int Utf8Length, + kbts_direction *Direction, kbts_script *Script) + Convenience wrapper for kbts_GuessTextProperties for UTF-8 text. + + OTHER APIS + OTHER:GLYPH ITERATION + :kbts_GlyphIteratorNext + :GlyphIteratorNext + int kbts_GlyphIteratorNext(kbts_glyph_iterator *It, kbts_glyph **Glyph) + Writes the next glyph to iterate over in [Glyph]. + + Once shaping is done, the interesting members of a glyph are: + - Id: the glyph index/id in the font. + - UserId: the user ID you passed in when creating the glyph. + This is typically some kind of codepoint index you can use to trace back + the glyph to your source text. + - AdvanceX/Y and OffsetX/Y: positioning data. + Here is how you might use them: + + kbts_glyph *Glyph; + int CursorX = 0, CursorY = 0; + while(kbts_GlyphIteratorNext(&It, &Glyph)) + { + int GlyphX = CursorX + Glyph->OffsetX; + int GlyphY = CursorY + Glyph->OffsetY; + + CursorX += Glyph->AdvanceX; + CursorY += Glyph->AdvanceY; + } + + You cannot assume that [Glyph] will stay valid if you free its glyph storage, + begin another shaping operation using the same glyph storage, or do any kind + of manipulation involving the glyph storage that holds this glyph. Likewise, + you should probably not assume that [Glyph] will stay valid after the next + call to kbts_GlyphIteratorNext. + + The [return value] is 1 if we found a glyph to return, and 0 if we did not. + Once kbts_GlyphIteratorNext has returned 0, you can keep calling it and + it will keep returning 0. + + :kbts_GlyphIteratorIsValid + :GlyphIteratorIsValid + int kbts_GlyphIteratorIsValid(kbts_glyph_iterator *It) + Returns whether there are still glyphs left to iterate over. + + If this returns a non-zero value, then the next call to + kbts_GlyphIteratorNext will also return a non-zero value and write a valid + glyph. + + OTHER:FONT COVERAGE TEST + To implement font fallback, you need to be able to know if a given span of text + is supported by a given font. However, this process is not as simple as it sounds. + Some Unicode codepoints have "canonical decompositions" and "canonical + recompositions" that are meant to describe different ways to represent the same + text, but with different codepoints. At the beginning of the shaping process, + shapers try all combinations until one is found that is fully supported by the + font. A font coverage test does this within a fixed memory footprint. + + :kbts_FontCoverageTestBegin + :FontCoverageTestBegin + void kbts_FontCoverageTestBegin(kbts_font_coverage_test *Test, kbts_font *Font) + Initializes [Test] to test coverage with [Font]. + + :kbts_FontCoverageTestCodepoint + :FontCoverageTestCodepoint + void kbts_FontCoverageTestCodepoint(kbts_font_coverage_test *Test, int Codepoint) + Feeds [Codepoint] into [Test] and updates coverage information. + + :kbts_FontCoverageTestEnd + :FontCoverageTestEnd + int kbts_FontCoverageTestEnd(kbts_font_coverage_test *Test) + Flushes the pending combinations not yet tested by [Test] and ends the coverage + test. + The [return value] is non-zero if the text is fully supported by the font, + whereas it is 0 if any glyph was not supported. + You can also check Test->Error to see if any glyph was unsupported. + + OTHER:OTHER OTHER:MISC + :kbts_DecodeUtf8 + :DecodeUtf8 + kbts_decode kbts_DecodeUtf8(const char *Utf8, kbts_un Length) + Tries to decode a single codepoint from [Utf8]. + kbts_decode looks like this: + + typedef struct kbts_decode + { + int Codepoint; + + int SourceCharactersConsumed; + int Valid; + } kbts_decode; + + Codepoint is the decoded codepoint. + SourceCharactersConsumed is the amount of bytes that were read from [Utf8]. + If decoding was successful, Valid is non-zero. Otherwise, it is zero. + Valid is zero if we run out of characters, or if the characters in [Utf8] + are invalid. + + :kbts_EncodeUtf8 + :EncodeUtf8 + kbts_encode_utf8 kbts_EncodeUtf8(int Codepoint) + Tries to encode a single codepoint into a UTF-8 sequence of bytes. + kbts_encode looks like this: + + typedef struct kbts_encode_utf8 + { + char Encoded[4]; + int EncodedLength; + int Valid; + } kbts_encode_utf8; + + Encoded is the encoded sequence. + EncodedLength is the number of bytes needed to encode [Codepoint]. + Valid is whether or not [Codepoint] is a valid codepoint to encode. + (All codepoints up to 0x10FFFF inclusive can be encoded.) + When Valid is 0, EncodedLength is also 0. + + :kbts_ScriptDirection + :ScriptDirection + kbts_direction kbts_ScriptDirection(kbts_script Script) + Returns the default direction for a given script. + + :kbts_ScriptIsComplex + :ScriptIsComplex + int kbts_ScriptIsComplex(kbts_script Script) + Returns whether a script is complex, i.e. if it requires complex shaper + support. + + :kbts_ScriptTagToScript + :ScriptTagToScript + kbts_script kbts_ScriptTagToScript(kbts_script_tag Tag) + Returns a given script from a four-character tag. + A kbts_script_tag can be obtained either through the KBTS_SCRIPT_TAG_* + constants, or through the KBTS_FOURCC() macro, which creates a tag from + four characters. LANGUAGE SUPPORT Shaping is NOT supported for the following scripts: @@ -317,7 +1219,6 @@ Word breaking is NOT supported for languages that require word dictionaries, like CJK. FONT SUPPORT - Font collections (.ttc) are not supported. Indic fonts using the Indic1 shaping model are not supported. e.g., 'bng2' will work, but 'beng' will not. The Indic v2 shaping model was released with OpenType 1.5 in May 2008. @@ -344,6 +1245,16 @@ See https://unicode.org/reports/tr9 for more information. VERSION HISTORY + 2.03 - Fix loading blobs directly, fix a parsing edge case in GPOS format 2 subtables. + 2.02 - Improve globbing of cursive attachments. + 2.01 - Add kbts_InitializeGlyphStorage and kbts_ScriptDirection. + Rename some private functions for better namespacing. + Delete some deprecated functions. + Bounds check in kbts_ScriptIsComplex. + Fix a couple pointer iteration bugs. + Fix some pedantic MSVC warnings. + Extend mirroring logic from brackets to any codepoint that has a Unicode mirror. + 2.0 - Completely new API and implementation. 1.03 - New functions: kbts_FeatureTagToId(), kbts_FeatureOverrideFromTag(), kbts_EmptyGlyphConfig(), kbts_GlyphConfigOverrideFeature(), kbts_GlyphConfigOverrideFeatureFromTag(), kbts_ScriptTagToScript() Unregistered features can now be overriden using their tags. This is slower than overriding registered features, i.e. those that have a kbts_feature_id. @@ -359,8 +1270,6 @@ TODO Word dictionaries for word breaking: CJK, etc. 'stch' feature. - Precompute GPOS nesting in advance and replace recursion with explicit frames. - (Either that or limit to a hard depth for now.) LICENSE zlib License @@ -384,7 +1293,6 @@ 3. This notice may not be removed or altered from any source distribution. */ - #ifndef KB_TEXT_SHAPE_INCLUDED # define KB_TEXT_SHAPE_INCLUDED @@ -462,6 +1370,7 @@ # ifdef _MSC_VER # define KBTS_INLINE static __forceinline # define KBTS_NOINLINE static __declspec(noinline) +# define KBTS_ALIGNOF __alignof # else # ifdef __has_attribute # if __has_attribute(always_inline) @@ -471,6 +1380,7 @@ # define KBTS_NOINLINE static __attribute__((noinline)) # endif # endif +# define KBTS_ALIGNOF __alignof__ # endif # ifndef KBTS_INLINE # define KBTS_INLINE static inline @@ -478,75 +1388,6 @@ # define KBTS_FOURCC(A, B, C, D) ((A) | ((B) << 8) | ((C) << 16) | ((D) << 24)) -typedef kbts_u8 kbts_joining_feature; -enum kbts_joining_feature_enum -{ - KBTS_JOINING_FEATURE_NONE, - - // These must correspond with glyph_flags and FEATURE_IDs. - KBTS_JOINING_FEATURE_ISOL, - KBTS_JOINING_FEATURE_FINA, - KBTS_JOINING_FEATURE_FIN2, - KBTS_JOINING_FEATURE_FIN3, - KBTS_JOINING_FEATURE_MEDI, - KBTS_JOINING_FEATURE_MED2, - KBTS_JOINING_FEATURE_INIT, - - KBTS_JOINING_FEATURE_COUNT, -}; - -typedef kbts_u8 kbts_reph_position; -enum kbts_reph_position_enum -{ - KBTS_REPH_POSITION_AFTER_POST, - KBTS_REPH_POSITION_BEFORE_POST, - KBTS_REPH_POSITION_BEFORE_SUBJOINED, - KBTS_REPH_POSITION_AFTER_SUBJOINED, - KBTS_REPH_POSITION_AFTER_MAIN, - - KBTS_REPH_POSITION_COUNT, -}; - -typedef kbts_u8 kbts_reph_encoding; -enum kbts_reph_encoding_enum -{ - KBTS_REPH_ENCODING_IMPLICIT, - KBTS_REPH_ENCODING_EXPLICIT, - KBTS_REPH_ENCODING_LOGICAL_REPHA, - KBTS_REPH_ENCODING_VISUAL_REPHA, - - KBTS_REPH_ENCODING_COUNT, -}; - -typedef kbts_u8 kbts_syllabic_position; -enum kbts_syllabic_position_enum -{ - KBTS_SYLLABIC_POSITION_NONE, - - KBTS_SYLLABIC_POSITION_RA_TO_BECOME_REPH, - - KBTS_SYLLABIC_POSITION_PREBASE_MATRA, - KBTS_SYLLABIC_POSITION_PREBASE_CONSONANT, - - KBTS_SYLLABIC_POSITION_SYLLABLE_BASE, - KBTS_SYLLABIC_POSITION_AFTER_MAIN, - - KBTS_SYLLABIC_POSITION_ABOVEBASE_CONSONANT, - - KBTS_SYLLABIC_POSITION_BEFORE_SUBJOINED, - KBTS_SYLLABIC_POSITION_BELOWBASE_CONSONANT, - KBTS_SYLLABIC_POSITION_AFTER_SUBJOINED, - - KBTS_SYLLABIC_POSITION_BEFORE_POST, - KBTS_SYLLABIC_POSITION_POSTBASE_CONSONANT, - KBTS_SYLLABIC_POSITION_AFTER_POST, - - KBTS_SYLLABIC_POSITION_FINAL_CONSONANT, - KBTS_SYLLABIC_POSITION_SMVD, - - KBTS_SYLLABIC_POSITION_COUNT, -}; - typedef kbts_u32 kbts_language; enum kbts_language_enum { @@ -1262,32 +2103,205 @@ enum kbts_break_flags_enum // (In Unicode, there is no meaningful distinction between a line and a paragraph. // a paragraph is pretty much just a line of text that can wrap.) KBTS_BREAK_FLAG_LINE_HARD = 1 << 5, + // Used for manual segmentation in the context. + KBTS_BREAK_FLAG_MANUAL = 1 << 6, + + KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION = 1 << 7, KBTS_BREAK_FLAG_LINE = KBTS_BREAK_FLAG_LINE_SOFT | KBTS_BREAK_FLAG_LINE_HARD, KBTS_BREAK_FLAG_ANY = KBTS_BREAK_FLAG_DIRECTION | KBTS_BREAK_FLAG_SCRIPT | KBTS_BREAK_FLAG_GRAPHEME | KBTS_BREAK_FLAG_WORD | KBTS_BREAK_FLAG_LINE_SOFT | KBTS_BREAK_FLAG_LINE_HARD, }; -typedef kbts_u8 kbts_op_kind; -enum kbts_op_kind_enum +// Japanese text contains "kinsoku" characters, around which breaking a line is forbidden. +// Exactly which characters are "kinsoku" or not depends on the context: +// - Strict style has the largest amount of kinsoku characters, which leads to longer lines. +// - Loose style has the smallest amount of kinsoku characters, which leads to smaller lines. +// - Normal style is somewhere in the middle. +// Note that, while the Unicode standard mentions all three of these styles, it does not mention +// any differences between the normal and loose styles. +// As such, normal and loose styles currently behave the same. +typedef kbts_u8 kbts_japanese_line_break_style; +enum kbts_japanese_line_break_style_enum { - KBTS_OP_KIND_END, + // The Unicode standard does not define what strict style is used for. + // Supposedly, it is used for anything that does not fall into the other two categories of text. + KBTS_JAPANESE_LINE_BREAK_STYLE_STRICT, - // Substitution ops. - KBTS_OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES, - KBTS_OP_KIND_NORMALIZE, - KBTS_OP_KIND_NORMALIZE_HANGUL, - KBTS_OP_KIND_FLAG_JOINING_LETTERS, - KBTS_OP_KIND_GSUB_FEATURES, - KBTS_OP_KIND_GSUB_FEATURES_WITH_USER, + // Normal style is used for books and documents. + KBTS_JAPANESE_LINE_BREAK_STYLE_NORMAL, - // Positioning ops. - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, + // Loose style is used for newspapers, and (I assume) any other narrow column format. + KBTS_JAPANESE_LINE_BREAK_STYLE_LOOSE, - KBTS_OP_KIND_POST_GPOS_FIXUP, - KBTS_OP_KIND_STCH_POSTPASS, + KBTS_JAPANESE_LINE_BREAK_STYLE_COUNT, +}; - KBTS_OP_KIND_COUNT, +typedef kbts_u32 kbts_break_state_flags; +enum kbts_break_state_flags_enum +{ + KBTS_BREAK_STATE_FLAG_STARTED = 1, + KBTS_BREAK_STATE_FLAG_END = 2, + + // Bidirectional flags + KBTS_BREAK_STATE_FLAG_SAW_R_AFTER_L = 8, + KBTS_BREAK_STATE_FLAG_SAW_AL_AFTER_LR = 0x10, + KBTS_BREAK_STATE_FLAG_LAST_WAS_BRACKET = 0x20, +}; + +typedef kbts_u32 kbts_text_format; +enum kbts_text_format_enum +{ + KBTS_TEXT_FORMAT_NONE, + + KBTS_TEXT_FORMAT_UTF32, + KBTS_TEXT_FORMAT_UTF8, + + KBTS_TEXT_FORMAT_COUNT, +}; + +typedef kbts_u32 kbts_direction; +enum kbts_direction_enum +{ + KBTS_DIRECTION_DONT_KNOW, + KBTS_DIRECTION_LTR, + KBTS_DIRECTION_RTL, + + KBTS_DIRECTION_COUNT, +}; + +typedef kbts_u32 kbts_orientation; +enum kbts_orientation_enum +{ + KBTS_ORIENTATION_HORIZONTAL, + KBTS_ORIENTATION_VERTICAL, + + KBTS_ORIENTATION_COUNT, +}; + +typedef kbts_u8 kbts_shaping_table; +enum kbts_shaping_table_enum +{ + KBTS_SHAPING_TABLE_GSUB, + KBTS_SHAPING_TABLE_GPOS, + KBTS_SHAPING_TABLE_COUNT, +}; + +typedef kbts_u32 kbts_shape_error; +enum kbts_shape_error_enum +{ + KBTS_SHAPE_ERROR_NONE, + KBTS_SHAPE_ERROR_INVALID_FONT, + KBTS_SHAPE_ERROR_GAVE_TEXT_BEFORE_CALLING_BEGIN, + KBTS_SHAPE_ERROR_OUT_OF_MEMORY, + + KBTS_SHAPE_ERROR_COUNT, +}; + +typedef kbts_u32 kbts_allocator_op_kind; +enum kbts_allocator_op_kind_enum +{ + KBTS_ALLOCATOR_OP_KIND_NONE, + KBTS_ALLOCATOR_OP_KIND_ALLOCATE, + KBTS_ALLOCATOR_OP_KIND_FREE, + + KBTS_ALLOCATOR_OP_KIND_COUNT, +}; + +typedef kbts_u32 kbts_blob_table_id; +enum kbts_blob_table_id_enum +{ + KBTS_BLOB_TABLE_ID_NONE, + KBTS_BLOB_TABLE_ID_HEAD, + KBTS_BLOB_TABLE_ID_CMAP, + KBTS_BLOB_TABLE_ID_GDEF, + KBTS_BLOB_TABLE_ID_GSUB, + KBTS_BLOB_TABLE_ID_GPOS, + KBTS_BLOB_TABLE_ID_HHEA, + KBTS_BLOB_TABLE_ID_VHEA, + KBTS_BLOB_TABLE_ID_HMTX, + KBTS_BLOB_TABLE_ID_VMTX, + KBTS_BLOB_TABLE_ID_MAXP, + KBTS_BLOB_TABLE_ID_OS2, + KBTS_BLOB_TABLE_ID_NAME, + + KBTS_BLOB_TABLE_ID_COUNT, +}; + +typedef kbts_u32 kbts_load_font_error; +enum kbts_load_font_error_enum +{ + KBTS_LOAD_FONT_ERROR_NONE, + KBTS_LOAD_FONT_ERROR_NEED_TO_CREATE_BLOB, + KBTS_LOAD_FONT_ERROR_INVALID_FONT, + KBTS_LOAD_FONT_ERROR_OUT_OF_MEMORY, + KBTS_LOAD_FONT_ERROR_COULD_NOT_OPEN_FILE, + KBTS_LOAD_FONT_ERROR_READ_ERROR, + + KBTS_LOAD_FONT_ERROR_COUNT, +}; + +typedef kbts_u32 kbts_version; +enum kbts_version_enum +{ + KBTS_VERSION_1_X, + KBTS_VERSION_2_0, + + KBTS_VERSION_CURRENT = KBTS_VERSION_2_0, +}; + +typedef kbts_u32 kbts_blob_version; +enum kbts_blob_version_enum +{ + KBTS_BLOB_VERSION_INVALID, + KBTS_BLOB_VERSION_INITIAL, + + KBTS_BLOB_VERSION_CURRENT = KBTS_BLOB_VERSION_INITIAL, +}; + +typedef kbts_u32 kbts_font_style_flags; +enum kbts_font_style_flags_enum +{ + KBTS_FONT_STYLE_FLAG_NONE, + + KBTS_FONT_STYLE_FLAG_REGULAR = (1 << 0), + KBTS_FONT_STYLE_FLAG_ITALIC = (1 << 1), + KBTS_FONT_STYLE_FLAG_BOLD = (1 << 2), +}; + +typedef kbts_u32 kbts_font_weight; +enum kbts_font_weight_enum +{ + KBTS_FONT_WEIGHT_UNKNOWN, + + KBTS_FONT_WEIGHT_THIN, + KBTS_FONT_WEIGHT_EXTRA_LIGHT, + KBTS_FONT_WEIGHT_LIGHT, + KBTS_FONT_WEIGHT_NORMAL, + KBTS_FONT_WEIGHT_MEDIUM, + KBTS_FONT_WEIGHT_SEMI_BOLD, + KBTS_FONT_WEIGHT_BOLD, + KBTS_FONT_WEIGHT_EXTRA_BOLD, + KBTS_FONT_WEIGHT_BLACK, + + KBTS_FONT_WEIGHT_COUNT, +}; + +typedef kbts_u32 kbts_font_width; +enum kbts_font_width_enum +{ + KBTS_FONT_WIDTH_UNKNOWN, + + KBTS_FONT_WIDTH_ULTRA_CONDENSED, + KBTS_FONT_WIDTH_EXTRA_CONDENSED, + KBTS_FONT_WIDTH_CONDENSED, + KBTS_FONT_WIDTH_SEMI_CONDENSED, + KBTS_FONT_WIDTH_NORMAL, + KBTS_FONT_WIDTH_SEMI_EXPANDED, + KBTS_FONT_WIDTH_EXPANDED, + KBTS_FONT_WIDTH_EXTRA_EXPANDED, + KBTS_FONT_WIDTH_ULTRA_EXPANDED, + + KBTS_FONT_WIDTH_COUNT, }; typedef kbts_u32 kbts_glyph_flags; @@ -1331,60 +2345,62 @@ enum kbts_glyph_flags_enum KBTS_GLYPH_FLAG_LIGATURE = (1 << 29), KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION = (1 << 30), }; -#define KBTS_GLYPH_FEATURE_MASK ((KBTS_GLYPH_FLAG_CFAR << 1) - 1) -// In USE, glyphs are mostly not pre-flagged for feature application. -// However, we do want to flag rphf/pref results for reordering, so we want to -// keep all of the flags as usual, and only use these feature flags for filtering. -#define KBTS_USE_GLYPH_FEATURE_MASK (KBTS_GLYPH_FLAG_ISOL | KBTS_GLYPH_FLAG_FINA | KBTS_GLYPH_FLAG_FIN2 | KBTS_GLYPH_FLAG_FIN3 | \ - KBTS_GLYPH_FLAG_MEDI | KBTS_GLYPH_FLAG_MED2 | KBTS_GLYPH_FLAG_INIT | KBTS_GLYPH_FLAG_NUMR | \ - KBTS_GLYPH_FLAG_DNOM | KBTS_GLYPH_FLAG_FRAC) -#define KBTS_JOINING_FEATURE_MASK (KBTS_GLYPH_FLAG_ISOL | KBTS_GLYPH_FLAG_FINA | KBTS_GLYPH_FLAG_FIN2 | KBTS_GLYPH_FLAG_FIN3 | \ - KBTS_GLYPH_FLAG_MEDI | KBTS_GLYPH_FLAG_MED2 | KBTS_GLYPH_FLAG_INIT) -#define KBTS_JOINING_FEATURE_TO_GLYPH_FLAG(Feature) (1 << ((Feature) - 1)) -// Japanese text contains "kinsoku" characters, around which breaking a line is forbidden. -// Exactly which characters are "kinsoku" or not depends on the context: -// - Strict style has the largest amount of kinsoku characters, which leads to longer lines. -// - Loose style has the smallest amount of kinsoku characters, which leads to smaller lines. -// - Normal style is somewhere in the middle. -// Note that, while the Unicode standard mentions all three of these styles, it does not mention -// any differences between the normal and loose styles. -// As such, normal and loose styles currently behave the same. -typedef kbts_u8 kbts_japanese_line_break_style; -enum kbts_japanese_line_break_style_enum +typedef kbts_u8 kbts_joining_feature; +enum kbts_joining_feature_enum { - // The Unicode standard does not define what strict style is used for. - // Supposedly, it is used for anything that does not fall into the other two categories of text. - KBTS_JAPANESE_LINE_BREAK_STYLE_STRICT, + KBTS_JOINING_FEATURE_NONE, - // Normal style is used for books and documents. - KBTS_JAPANESE_LINE_BREAK_STYLE_NORMAL, + // These must correspond with glyph_flags and FEATURE_IDs. + KBTS_JOINING_FEATURE_ISOL, + KBTS_JOINING_FEATURE_FINA, + KBTS_JOINING_FEATURE_FIN2, + KBTS_JOINING_FEATURE_FIN3, + KBTS_JOINING_FEATURE_MEDI, + KBTS_JOINING_FEATURE_MED2, + KBTS_JOINING_FEATURE_INIT, - // Loose style is used for newspapers, and (I assume) any other narrow column format. - KBTS_JAPANESE_LINE_BREAK_STYLE_LOOSE, - - KBTS_JAPANESE_LINE_BREAK_STYLE_COUNT, + KBTS_JOINING_FEATURE_COUNT, }; -typedef kbts_u32 kbts_orientation; -enum kbts_orientation_enum +typedef kbts_u32 kbts_user_id_generation_mode; +enum kbts_user_id_generation_mode_enum { - KBTS_ORIENTATION_HORIZONTAL, - KBTS_ORIENTATION_VERTICAL, + KBTS_USER_ID_GENERATION_MODE_CODEPOINT_INDEX, + KBTS_USER_ID_GENERATION_MODE_SOURCE_INDEX, - KBTS_ORIENTATION_COUNT, + KBTS_USER_ID_GENERATION_MODE_COUNT, }; -typedef kbts_u32 kbts_direction; -enum kbts_direction_enum +typedef kbts_u32 kbts_break_config_flags; +enum kbts_break_config_flags_enum { - KBTS_DIRECTION_NONE, - KBTS_DIRECTION_LTR, - KBTS_DIRECTION_RTL, + KBTS_BREAK_CONFIG_FLAG_NONE, - KBTS_DIRECTION_COUNT, + KBTS_BREAK_CONFIG_FLAG_END_OF_TEXT_GENERATES_HARD_LINE_BREAK = 1, }; +typedef kbts_u32 kbts_font_info_string_id; +enum kbts_font_info_string_id_enum +{ + KBTS_FONT_INFO_STRING_ID_NONE, + KBTS_FONT_INFO_STRING_ID_COPYRIGHT, + KBTS_FONT_INFO_STRING_ID_FAMILY, + KBTS_FONT_INFO_STRING_ID_SUBFAMILY, + KBTS_FONT_INFO_STRING_ID_UID, + KBTS_FONT_INFO_STRING_ID_FULL_NAME, + KBTS_FONT_INFO_STRING_ID_VERSION, + KBTS_FONT_INFO_STRING_ID_POSTSCRIPT_NAME, + KBTS_FONT_INFO_STRING_ID_TRADEMARK, + KBTS_FONT_INFO_STRING_ID_MANUFACTURER, + KBTS_FONT_INFO_STRING_ID_DESIGNER, + KBTS_FONT_INFO_STRING_ID_TYPOGRAPHIC_FAMILY, + KBTS_FONT_INFO_STRING_ID_TYPOGRAPHIC_SUBFAMILY, + + KBTS_FONT_INFO_STRING_ID_COUNT, +}; + + typedef kbts_u8 kbts_unicode_joining_type; enum kbts_unicode_joining_type_enum { @@ -1407,12 +2423,15 @@ enum kbts_unicode_flag_enum KBTS_UNICODE_FLAG_PART_OF_WORD = (1 << 4), KBTS_UNICODE_FLAG_DECIMAL_DIGIT = (1 << 5), KBTS_UNICODE_FLAG_NON_SPACING_MARK = (1 << 6), + + KBTS_UNICODE_FLAG_MIRRORED = KBTS_UNICODE_FLAG_OPEN_BRACKET | KBTS_UNICODE_FLAG_CLOSE_BRACKET, }; typedef kbts_u8 kbts_unicode_bidirectional_class; enum kbts_unicode_bidirectional_class_enum { KBTS_UNICODE_BIDIRECTIONAL_CLASS_NI, + KBTS_UNICODE_BIDIRECTIONAL_CLASS_BN, // Formatting characters need to be ignored. KBTS_UNICODE_BIDIRECTIONAL_CLASS_L, KBTS_UNICODE_BIDIRECTIONAL_CLASS_R, KBTS_UNICODE_BIDIRECTIONAL_CLASS_NSM, @@ -1567,6 +2586,8 @@ enum kbts_shaper_enum KBTS_SHAPER_COUNT, }; +#define KBTS_MAXIMUM_RECOMPOSITION_PARENTS 19 +#define KBTS_MAXIMUM_CODEPOINT_SCRIPTS 23 typedef kbts_u32 kbts_script_tag; enum kbts_script_tag_enum { @@ -2168,624 +3189,166 @@ enum kbts_feature_tag_enum KBTS_FEATURE_TAG_zero = KBTS_FOURCC('z', 'e', 'r', 'o'), // Slashed Zero }; -typedef kbts_u32 kbts_feature_id; -enum kbts_feature_id_enum -{ - KBTS_FEATURE_ID_UNREGISTERED, // Features that aren't pre-defined in the OpenType spec - KBTS_FEATURE_ID_isol, // Isolated Forms - KBTS_FEATURE_ID_fina, // Terminal Forms - KBTS_FEATURE_ID_fin2, // Terminal Forms #2 - KBTS_FEATURE_ID_fin3, // Terminal Forms #3 - KBTS_FEATURE_ID_medi, // Medial Forms - KBTS_FEATURE_ID_med2, // Medial Forms #2 - KBTS_FEATURE_ID_init, // Initial Forms - KBTS_FEATURE_ID_ljmo, // Leading Jamo Forms - KBTS_FEATURE_ID_vjmo, // Vowel Jamo Forms - KBTS_FEATURE_ID_tjmo, // Trailing Jamo Forms - KBTS_FEATURE_ID_rphf, // Reph Form - KBTS_FEATURE_ID_blwf, // Below-base Forms - KBTS_FEATURE_ID_half, // Half Forms - KBTS_FEATURE_ID_pstf, // Post-base Forms - KBTS_FEATURE_ID_abvf, // Above-base Forms - KBTS_FEATURE_ID_pref, // Pre-base Forms - KBTS_FEATURE_ID_numr, // Numerators - KBTS_FEATURE_ID_frac, // Fractions - KBTS_FEATURE_ID_dnom, // Denominators - KBTS_FEATURE_ID_cfar, // Conjunct Form After Ro - KBTS_FEATURE_ID_aalt, // Access All Alternates - KBTS_FEATURE_ID_abvm, // Above-base Mark Positioning - KBTS_FEATURE_ID_abvs, // Above-base Substitutions - KBTS_FEATURE_ID_afrc, // Alternative Fractions - KBTS_FEATURE_ID_akhn, // Akhand - KBTS_FEATURE_ID_apkn, // Kerning for Alternate Proportional Widths - KBTS_FEATURE_ID_blwm, // Below-base Mark Positioning - KBTS_FEATURE_ID_blws, // Below-base Substitutions - KBTS_FEATURE_ID_calt, // Contextual Alternates - KBTS_FEATURE_ID_case, // Case-sensitive Forms - KBTS_FEATURE_ID_ccmp, // Glyph Composition / Decomposition - KBTS_FEATURE_ID_chws, // Contextual Half-width Spacing - KBTS_FEATURE_ID_cjct, // Conjunct Forms - KBTS_FEATURE_ID_clig, // Contextual Ligatures - KBTS_FEATURE_ID_cpct, // Centered CJK Punctuation - KBTS_FEATURE_ID_cpsp, // Capital Spacing - KBTS_FEATURE_ID_cswh, // Contextual Swash - KBTS_FEATURE_ID_curs, // Cursive Positioning - KBTS_FEATURE_ID_cv01, // Character Variant 1 - KBTS_FEATURE_ID_cv02, // Character Variant 2 - KBTS_FEATURE_ID_cv03, // Character Variant 3 - KBTS_FEATURE_ID_cv04, // Character Variant 4 - KBTS_FEATURE_ID_cv05, // Character Variant 5 - KBTS_FEATURE_ID_cv06, // Character Variant 6 - KBTS_FEATURE_ID_cv07, // Character Variant 7 - KBTS_FEATURE_ID_cv08, // Character Variant 8 - KBTS_FEATURE_ID_cv09, // Character Variant 9 - KBTS_FEATURE_ID_cv10, // Character Variant 10 - KBTS_FEATURE_ID_cv11, // Character Variant 11 - KBTS_FEATURE_ID_cv12, // Character Variant 12 - KBTS_FEATURE_ID_cv13, // Character Variant 13 - KBTS_FEATURE_ID_cv14, // Character Variant 14 - KBTS_FEATURE_ID_cv15, // Character Variant 15 - KBTS_FEATURE_ID_cv16, // Character Variant 16 - KBTS_FEATURE_ID_cv17, // Character Variant 17 - KBTS_FEATURE_ID_cv18, // Character Variant 18 - KBTS_FEATURE_ID_cv19, // Character Variant 19 - KBTS_FEATURE_ID_cv20, // Character Variant 20 - KBTS_FEATURE_ID_cv21, // Character Variant 21 - KBTS_FEATURE_ID_cv22, // Character Variant 22 - KBTS_FEATURE_ID_cv23, // Character Variant 23 - KBTS_FEATURE_ID_cv24, // Character Variant 24 - KBTS_FEATURE_ID_cv25, // Character Variant 25 - KBTS_FEATURE_ID_cv26, // Character Variant 26 - KBTS_FEATURE_ID_cv27, // Character Variant 27 - KBTS_FEATURE_ID_cv28, // Character Variant 28 - KBTS_FEATURE_ID_cv29, // Character Variant 29 - KBTS_FEATURE_ID_cv30, // Character Variant 30 - KBTS_FEATURE_ID_cv31, // Character Variant 31 - KBTS_FEATURE_ID_cv32, // Character Variant 32 - KBTS_FEATURE_ID_cv33, // Character Variant 33 - KBTS_FEATURE_ID_cv34, // Character Variant 34 - KBTS_FEATURE_ID_cv35, // Character Variant 35 - KBTS_FEATURE_ID_cv36, // Character Variant 36 - KBTS_FEATURE_ID_cv37, // Character Variant 37 - KBTS_FEATURE_ID_cv38, // Character Variant 38 - KBTS_FEATURE_ID_cv39, // Character Variant 39 - KBTS_FEATURE_ID_cv40, // Character Variant 40 - KBTS_FEATURE_ID_cv41, // Character Variant 41 - KBTS_FEATURE_ID_cv42, // Character Variant 42 - KBTS_FEATURE_ID_cv43, // Character Variant 43 - KBTS_FEATURE_ID_cv44, // Character Variant 44 - KBTS_FEATURE_ID_cv45, // Character Variant 45 - KBTS_FEATURE_ID_cv46, // Character Variant 46 - KBTS_FEATURE_ID_cv47, // Character Variant 47 - KBTS_FEATURE_ID_cv48, // Character Variant 48 - KBTS_FEATURE_ID_cv49, // Character Variant 49 - KBTS_FEATURE_ID_cv50, // Character Variant 50 - KBTS_FEATURE_ID_cv51, // Character Variant 51 - KBTS_FEATURE_ID_cv52, // Character Variant 52 - KBTS_FEATURE_ID_cv53, // Character Variant 53 - KBTS_FEATURE_ID_cv54, // Character Variant 54 - KBTS_FEATURE_ID_cv55, // Character Variant 55 - KBTS_FEATURE_ID_cv56, // Character Variant 56 - KBTS_FEATURE_ID_cv57, // Character Variant 57 - KBTS_FEATURE_ID_cv58, // Character Variant 58 - KBTS_FEATURE_ID_cv59, // Character Variant 59 - KBTS_FEATURE_ID_cv60, // Character Variant 60 - KBTS_FEATURE_ID_cv61, // Character Variant 61 - KBTS_FEATURE_ID_cv62, // Character Variant 62 - KBTS_FEATURE_ID_cv63, // Character Variant 63 - KBTS_FEATURE_ID_cv64, // Character Variant 64 - KBTS_FEATURE_ID_cv65, // Character Variant 65 - KBTS_FEATURE_ID_cv66, // Character Variant 66 - KBTS_FEATURE_ID_cv67, // Character Variant 67 - KBTS_FEATURE_ID_cv68, // Character Variant 68 - KBTS_FEATURE_ID_cv69, // Character Variant 69 - KBTS_FEATURE_ID_cv70, // Character Variant 70 - KBTS_FEATURE_ID_cv71, // Character Variant 71 - KBTS_FEATURE_ID_cv72, // Character Variant 72 - KBTS_FEATURE_ID_cv73, // Character Variant 73 - KBTS_FEATURE_ID_cv74, // Character Variant 74 - KBTS_FEATURE_ID_cv75, // Character Variant 75 - KBTS_FEATURE_ID_cv76, // Character Variant 76 - KBTS_FEATURE_ID_cv77, // Character Variant 77 - KBTS_FEATURE_ID_cv78, // Character Variant 78 - KBTS_FEATURE_ID_cv79, // Character Variant 79 - KBTS_FEATURE_ID_cv80, // Character Variant 80 - KBTS_FEATURE_ID_cv81, // Character Variant 81 - KBTS_FEATURE_ID_cv82, // Character Variant 82 - KBTS_FEATURE_ID_cv83, // Character Variant 83 - KBTS_FEATURE_ID_cv84, // Character Variant 84 - KBTS_FEATURE_ID_cv85, // Character Variant 85 - KBTS_FEATURE_ID_cv86, // Character Variant 86 - KBTS_FEATURE_ID_cv87, // Character Variant 87 - KBTS_FEATURE_ID_cv88, // Character Variant 88 - KBTS_FEATURE_ID_cv89, // Character Variant 89 - KBTS_FEATURE_ID_cv90, // Character Variant 90 - KBTS_FEATURE_ID_cv91, // Character Variant 91 - KBTS_FEATURE_ID_cv92, // Character Variant 92 - KBTS_FEATURE_ID_cv93, // Character Variant 93 - KBTS_FEATURE_ID_cv94, // Character Variant 94 - KBTS_FEATURE_ID_cv95, // Character Variant 95 - KBTS_FEATURE_ID_cv96, // Character Variant 96 - KBTS_FEATURE_ID_cv97, // Character Variant 97 - KBTS_FEATURE_ID_cv98, // Character Variant 98 - KBTS_FEATURE_ID_cv99, // Character Variant 99 - KBTS_FEATURE_ID_c2pc, // Petite Capitals From Capitals - KBTS_FEATURE_ID_c2sc, // Small Capitals From Capitals - KBTS_FEATURE_ID_dist, // Distances - KBTS_FEATURE_ID_dlig, // Discretionary Ligatures - KBTS_FEATURE_ID_dtls, // Dotless Forms - KBTS_FEATURE_ID_expt, // Expert Forms - KBTS_FEATURE_ID_falt, // Final Glyph on Line Alternates - KBTS_FEATURE_ID_flac, // Flattened Accent Forms - KBTS_FEATURE_ID_fwid, // Full Widths - KBTS_FEATURE_ID_haln, // Halant Forms - KBTS_FEATURE_ID_halt, // Alternate Half Widths - KBTS_FEATURE_ID_hist, // Historical Forms - KBTS_FEATURE_ID_hkna, // Horizontal Kana Alternates - KBTS_FEATURE_ID_hlig, // Historical Ligatures - KBTS_FEATURE_ID_hngl, // Hangul - KBTS_FEATURE_ID_hojo, // Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms) - KBTS_FEATURE_ID_hwid, // Half Widths - KBTS_FEATURE_ID_ital, // Italics - KBTS_FEATURE_ID_jalt, // Justification Alternates - KBTS_FEATURE_ID_jp78, // JIS78 Forms - KBTS_FEATURE_ID_jp83, // JIS83 Forms - KBTS_FEATURE_ID_jp90, // JIS90 Forms - KBTS_FEATURE_ID_jp04, // JIS2004 Forms - KBTS_FEATURE_ID_kern, // Kerning - KBTS_FEATURE_ID_lfbd, // Left Bounds - KBTS_FEATURE_ID_liga, // Standard Ligatures - KBTS_FEATURE_ID_lnum, // Lining Figures - KBTS_FEATURE_ID_locl, // Localized Forms - KBTS_FEATURE_ID_ltra, // Left-to-right Alternates - KBTS_FEATURE_ID_ltrm, // Left-to-right Mirrored Forms - KBTS_FEATURE_ID_mark, // Mark Positioning - KBTS_FEATURE_ID_mgrk, // Mathematical Greek - KBTS_FEATURE_ID_mkmk, // Mark to Mark Positioning - KBTS_FEATURE_ID_mset, // Mark Positioning via Substitution - KBTS_FEATURE_ID_nalt, // Alternate Annotation Forms - KBTS_FEATURE_ID_nlck, // NLC Kanji Forms - KBTS_FEATURE_ID_nukt, // Nukta Forms - KBTS_FEATURE_ID_onum, // Oldstyle Figures - KBTS_FEATURE_ID_opbd, // Optical Bounds - KBTS_FEATURE_ID_ordn, // Ordinals - KBTS_FEATURE_ID_ornm, // Ornaments - KBTS_FEATURE_ID_palt, // Proportional Alternate Widths - KBTS_FEATURE_ID_pcap, // Petite Capitals - KBTS_FEATURE_ID_pkna, // Proportional Kana - KBTS_FEATURE_ID_pnum, // Proportional Figures - KBTS_FEATURE_ID_pres, // Pre-base Substitutions - KBTS_FEATURE_ID_psts, // Post-base Substitutions - KBTS_FEATURE_ID_pwid, // Proportional Widths - KBTS_FEATURE_ID_qwid, // Quarter Widths - KBTS_FEATURE_ID_rand, // Randomize - KBTS_FEATURE_ID_rclt, // Required Contextual Alternates - KBTS_FEATURE_ID_rkrf, // Rakar Forms - KBTS_FEATURE_ID_rlig, // Required Ligatures - KBTS_FEATURE_ID_rtbd, // Right Bounds - KBTS_FEATURE_ID_rtla, // Right-to-left Alternates - KBTS_FEATURE_ID_rtlm, // Right-to-left Mirrored Forms - KBTS_FEATURE_ID_ruby, // Ruby Notation Forms - KBTS_FEATURE_ID_rvrn, // Required Variation Alternates - KBTS_FEATURE_ID_salt, // Stylistic Alternates - KBTS_FEATURE_ID_sinf, // Scientific Inferiors - KBTS_FEATURE_ID_size, // Optical size - KBTS_FEATURE_ID_smcp, // Small Capitals - KBTS_FEATURE_ID_smpl, // Simplified Forms - KBTS_FEATURE_ID_ss01, // Stylistic Set 1 - KBTS_FEATURE_ID_ss02, // Stylistic Set 2 - KBTS_FEATURE_ID_ss03, // Stylistic Set 3 - KBTS_FEATURE_ID_ss04, // Stylistic Set 4 - KBTS_FEATURE_ID_ss05, // Stylistic Set 5 - KBTS_FEATURE_ID_ss06, // Stylistic Set 6 - KBTS_FEATURE_ID_ss07, // Stylistic Set 7 - KBTS_FEATURE_ID_ss08, // Stylistic Set 8 - KBTS_FEATURE_ID_ss09, // Stylistic Set 9 - KBTS_FEATURE_ID_ss10, // Stylistic Set 10 - KBTS_FEATURE_ID_ss11, // Stylistic Set 11 - KBTS_FEATURE_ID_ss12, // Stylistic Set 12 - KBTS_FEATURE_ID_ss13, // Stylistic Set 13 - KBTS_FEATURE_ID_ss14, // Stylistic Set 14 - KBTS_FEATURE_ID_ss15, // Stylistic Set 15 - KBTS_FEATURE_ID_ss16, // Stylistic Set 16 - KBTS_FEATURE_ID_ss17, // Stylistic Set 17 - KBTS_FEATURE_ID_ss18, // Stylistic Set 18 - KBTS_FEATURE_ID_ss19, // Stylistic Set 19 - KBTS_FEATURE_ID_ss20, // Stylistic Set 20 - KBTS_FEATURE_ID_ssty, // Math Script-style Alternates - KBTS_FEATURE_ID_stch, // Stretching Glyph Decomposition - KBTS_FEATURE_ID_subs, // Subscript - KBTS_FEATURE_ID_sups, // Superscript - KBTS_FEATURE_ID_swsh, // Swash - KBTS_FEATURE_ID_test, // Test features, only for development - KBTS_FEATURE_ID_titl, // Titling - KBTS_FEATURE_ID_tnam, // Traditional Name Forms - KBTS_FEATURE_ID_tnum, // Tabular Figures - KBTS_FEATURE_ID_trad, // Traditional Forms - KBTS_FEATURE_ID_twid, // Third Widths - KBTS_FEATURE_ID_unic, // Unicase - KBTS_FEATURE_ID_valt, // Alternate Vertical Metrics - KBTS_FEATURE_ID_vapk, // Kerning for Alternate Proportional Vertical Metrics - KBTS_FEATURE_ID_vatu, // Vattu Variants - KBTS_FEATURE_ID_vchw, // Vertical Contextual Half-width Spacing - KBTS_FEATURE_ID_vert, // Vertical Alternates - KBTS_FEATURE_ID_vhal, // Alternate Vertical Half Metrics - KBTS_FEATURE_ID_vkna, // Vertical Kana Alternates - KBTS_FEATURE_ID_vkrn, // Vertical Kerning - KBTS_FEATURE_ID_vpal, // Proportional Alternate Vertical Metrics - KBTS_FEATURE_ID_vrt2, // Vertical Alternates and Rotation - KBTS_FEATURE_ID_vrtr, // Vertical Alternates for Rotation - KBTS_FEATURE_ID_zero, // Slashed Zero - KBTS_FEATURE_ID_COUNT, -}; - -typedef kbts_u8 kbts_shaping_table; -enum kbts_shaping_table_enum -{ - KBTS_SHAPING_TABLE_GSUB, - KBTS_SHAPING_TABLE_GPOS, - KBTS_SHAPING_TABLE_COUNT, -}; - -typedef struct kbts_lookup_info -{ - kbts_u32 MaximumBacktrackWithoutSkippingGlyphs; - kbts_u32 MaximumLookaheadWithoutSkippingGlyphs; - kbts_u32 MaximumSubstitutionOutputSize; - kbts_u32 MaximumInputSequenceLength; - kbts_u32 MaximumLookupStackSize; -} kbts_lookup_info; - -typedef struct kbts_op_state kbts_op_state; -typedef struct kbts_gdef kbts_gdef; -typedef struct kbts_cmap_14 kbts_cmap_14; -typedef struct kbts_gsub_gpos kbts_gsub_gpos; -typedef struct kbts_maxp kbts_maxp; -typedef struct kbts_hea kbts_hea; -typedef struct kbts_iterate_features kbts_iterate_features; -typedef struct kbts_shape_state kbts_shape_state; +typedef struct kbts__gdef kbts__gdef; +typedef struct kbts__cmap_14 kbts__cmap_14; +typedef struct kbts__gsub_gpos kbts__gsub_gpos; +typedef struct kbts__maxp kbts__maxp; +typedef struct kbts__hea kbts__hea; typedef struct kbts_shaper_properties kbts_shaper_properties; -typedef struct kbts_feature kbts_feature; -typedef struct kbts_head kbts_head; +typedef struct kbts__feature kbts__feature; +typedef struct kbts__head kbts__head; +typedef struct kbts__langsys kbts__langsys; +typedef struct kbts_shape_config kbts_shape_config; +typedef struct kbts_glyph kbts_glyph; +typedef struct kbts_glyph_config kbts_glyph_config; +typedef struct kbts_shape_context kbts_shape_context; +typedef struct kbts_glyph_storage kbts_glyph_storage; + +typedef struct kbts_allocator_op_allocate +{ + void *Pointer; + kbts_u32 Size; +} kbts_allocator_op_allocate; + +typedef struct kbts_allocator_op_free +{ + void *Pointer; +} kbts_allocator_op_free; + +typedef struct kbts_allocator_op +{ + kbts_allocator_op_kind Kind; + + union + { + kbts_allocator_op_allocate Allocate; + kbts_allocator_op_free Free; + }; +} kbts_allocator_op; + +typedef void kbts_allocator_function(void *Data, kbts_allocator_op *Op); typedef struct kbts_lookup_subtable_info { - kbts_u32 MinimumBacktrackPlusOne; - kbts_u32 MinimumFollowupPlusOne; + kbts_u16 MinimumBacktrackPlusOne; + kbts_u16 MinimumFollowupPlusOne; } kbts_lookup_subtable_info; +typedef struct kbts_blob_table +{ + kbts_u32 OffsetFromStartOfFile; + kbts_u32 Length; +} kbts_blob_table; + +typedef struct kbts_load_font_state +{ + void *FontData; + kbts_u32 FontDataSize; + + kbts_blob_table Tables[KBTS_BLOB_TABLE_ID_COUNT]; + kbts_u32 LookupCount; + kbts_u32 LookupSubtableCount; + kbts_u32 GlyphCount; + kbts_u32 ScratchSize; + + kbts_u32 GlyphLookupMatrixSizeInBytes; + kbts_u32 GlyphLookupSubtableMatrixSizeInBytes; + kbts_u32 TotalSize; +} kbts_load_font_state; + +typedef struct kbts_blob_header +{ + kbts_u32 Magic; + kbts_u32 Version; + + kbts_u32 LookupCount; + kbts_u32 LookupSubtableCount; + kbts_u32 GlyphCount; + + kbts_u32 GposLookupIndexOffset; + + kbts_u32 GlyphLookupMatrixOffsetFromStartOfFile; + kbts_u32 GlyphLookupSubtableMatrixOffsetFromStartOfFile; + kbts_u32 LookupSubtableIndexOffsetsOffsetFromStartOfFile; + kbts_u32 SubtableInfosOffsetFromStartOfFile; + + kbts_blob_table Tables[KBTS_BLOB_TABLE_ID_COUNT]; +} kbts_blob_header; + typedef struct kbts_font { - char *FileBase; - kbts_un FileSize; - kbts_head *Head; + kbts_allocator_function *Allocator; + void *AllocatorData; + + kbts_blob_header *Blob; kbts_u16 *Cmap; - kbts_gdef *Gdef; - kbts_cmap_14 *Cmap14; - kbts_gsub_gpos *ShapingTables[KBTS_SHAPING_TABLE_COUNT]; - void *Fvar; - kbts_maxp *Maxp; + kbts__cmap_14 *Cmap14; - kbts_hea *Hea[KBTS_ORIENTATION_COUNT]; - kbts_u16 *Mtx[KBTS_ORIENTATION_COUNT]; + kbts__gsub_gpos *ShapingTables[KBTS_SHAPING_TABLE_COUNT]; - kbts_lookup_info LookupInfo; + void *UserData; - kbts_u32 GlyphCount; - kbts_u32 LookupCount; - kbts_u32 SubtableCount; - - kbts_u32 *GlyphLookupMatrix; // [LookupCount * GlyphCount] bitmap - kbts_u32 *GlyphLookupSubtableMatrix; // [LookupSubtableCount * GlyphCount] bitmap - kbts_u32 *LookupSubtableIndexOffsets; // [LookupCount] - kbts_lookup_subtable_info *SubtableInfos; // [LookupSubtableCount] - kbts_u32 GposLookupIndexOffset; - - int Error; + kbts_load_font_error Error; } kbts_font; -typedef struct kbts_glyph_classes +typedef struct kbts_font_info { - kbts_u16 Class; - kbts_u16 MarkAttachmentClass; -} kbts_glyph_classes; + char *Strings[KBTS_FONT_INFO_STRING_ID_COUNT]; + kbts_u16 StringLengths[KBTS_FONT_INFO_STRING_ID_COUNT]; -typedef struct kbts_feature_set -{ - kbts_u64 Flags[(KBTS_FEATURE_ID_COUNT + 63) / 64]; -} kbts_feature_set; + kbts_font_style_flags StyleFlags; + kbts_font_weight Weight; + kbts_font_width Width; +} kbts_font_info; typedef struct kbts_feature_override { - kbts_feature_id Id; kbts_feature_tag Tag; - kbts_u32 EnabledOrAlternatePlusOne; + int Value; } kbts_feature_override; -typedef struct kbts_glyph_config -{ - kbts_feature_set EnabledFeatures; - kbts_feature_set DisabledFeatures; - kbts_u32 FeatureOverrideCount; - kbts_u32 FeatureOverrideCapacity; - kbts_u32 RequiredFeatureOverrideCapacity; - kbts_feature_override *FeatureOverrides; // [FeatureOverrideCount] -} kbts_glyph_config; - -typedef struct kbts_glyph -{ - kbts_u32 Codepoint; - kbts_u16 Id; // Glyph index. This is what you want to use to query outline data. - kbts_u16 Uid; - kbts_glyph_classes Classes; - - kbts_u64 Decomposition; - - kbts_glyph_config *Config; - - kbts_glyph_flags Flags; - - // These fields are the glyph's final positioning data. - // For normal usage, you should not have to use these directly yourself. - // In case you are curious or have a specific need, see kbts_PositionGlyph() to see how these are used. - kbts_s32 OffsetX; - kbts_s32 OffsetY; - kbts_s32 AdvanceX; - kbts_s32 AdvanceY; - - kbts_u32 ParentInfo; - - // This is set by GSUB and used by GPOS. - // A 0-index means that we should attach to the last component in the ligature. - // - // From the Microsoft docs: - // To correctly access the subtables, the client must keep track of the component associated with the mark. - // - // For a given mark assigned to a particular class, the appropriate base attachment point is determined by which - // ligature component the mark is associated with. This is dependent on the original character string and subsequent - // character- or glyph-sequence processing, not the font data alone. While a text-layout client is performing any - // character-based preprocessing or any glyph-substitution operations using the GSUB table, the text-layout client - // must keep track of associations of marks to particular ligature-glyph components. - kbts_u16 LigatureUid; - kbts_u16 LigatureComponentIndexPlusOne; - - // Earlier on, we used to assume that, if a glyph had no advance, or had the MARK glyph class, then - // it could be handled as a mark in layout operations. This is inaccurate. - // Unicode makes a distinction between attached marks and standalone marks. For our purposes, attached - // marks are marks that have found a valid base character to attach to. In practice, this means that the - // font contains a valid display position/configuration for it in the current context. - // In contrast, standalone marks are marks that aren't attached to anything. Fonts may still have glyphs - // for them, in which case we want to display those just like regular glyphs that take up horizontal space - // on the line. When fonts don't have glyphs for them, they simply stay around as zero-width glyphs. - // Standalone marks have notably different behavior compared to attached marks, and so, once we start - // applying positioning features, it becomes worthwhile to track exactly which glyph has attached to which. - kbts_u16 AttachGlyphIndexPlusOne; // Set by GPOS attachments. - - // Set in GSUB and used in GPOS, for STCH. - kbts_joining_feature JoiningFeature; - - // Unicode properties filled in by CodepointToGlyph. - kbts_unicode_joining_type JoiningType; - kbts_u8 Script; - kbts_u8 UnicodeFlags; - kbts_u8 SyllabicClass; - kbts_u8 SyllabicPosition; - kbts_u8 UseClass; - kbts_u8 CombiningClass; - - kbts_u8 MarkOrdering; // Only used temporarily in NORMALIZE for Arabic mark reordering. -} kbts_glyph; - -typedef struct kbts_glyph_array -{ - kbts_glyph *Glyphs; - kbts_u32 Count; - kbts_u32 TotalCount; - kbts_u32 Capacity; - kbts_u32 RequiredCapacity; -} kbts_glyph_array; - -typedef struct kbts_op_state_normalize -{ - kbts_un CodepointsToDecomposeCount; - kbts_un AboveBaseGlyphCount; -} kbts_op_state_normalize; - -typedef struct kbts_op_state_gsub -{ - kbts_feature_set LookupFeatures; - kbts_un LookupIndex; - kbts_u32 GlyphFilter; - kbts_u32 SkipFlags; -} kbts_op_state_gsub; - -typedef struct kbts_op_state_normalize_hangul -{ - kbts_glyph LvtGlyphs[4]; - kbts_un LvtGlyphCount; -} kbts_op_state_normalize_hangul; - -typedef union kbts_op_state_op_specific -{ - kbts_op_state_normalize Normalize; - kbts_op_state_gsub Gsub; - kbts_op_state_normalize_hangul NormalizeHangul; -} kbts_op_state_op_specific; - -typedef struct kbts_lookup_indices -{ - kbts_u32 FeatureTag; - kbts_u32 FeatureId; - kbts_u32 SkipFlags; - kbts_u32 GlyphFilter; - kbts_u32 Count; - kbts_u16 *Indices; -} kbts_lookup_indices; - -typedef struct kbts_op -{ - kbts_op_kind Kind; - kbts_feature_set Features; -} kbts_op; - -// This needs to be updated when we change the op lists! -#define KBTS_MAX_SIMULTANEOUS_FEATURES 16 -typedef struct kbts_op_state -{ - kbts_un WrittenCount; - kbts_un GlyphIndex; - kbts_u32 FrameCount; - kbts_u32 ResumePoint; - - kbts_u32 FeatureCount; - kbts_lookup_indices FeatureLookupIndices[KBTS_MAX_SIMULTANEOUS_FEATURES]; - kbts_u32 UnregisteredFeatureCount; - kbts_feature_tag UnregisteredFeatureTags[KBTS_MAX_SIMULTANEOUS_FEATURES]; - - kbts_op_state_op_specific OpSpecific; - - // Ops are free to use the following as they please: - // kbts_u8 LeftoverMemory[LeftoverMemorySize]; -} kbts_op_state; - -typedef struct kbts_op_list -{ - kbts_u8 *Ops; - kbts_un Length; -} kbts_op_list; - -typedef struct kbts_indic_script_properties -{ - kbts_u32 ViramaCodepoint; - kbts_u8 BlwfPostOnly; - kbts_reph_position RephPosition; - kbts_reph_encoding RephEncoding; - kbts_syllabic_position RightSideMatraPosition; - kbts_syllabic_position AboveBaseMatraPosition; - kbts_syllabic_position BelowBaseMatraPosition; -} kbts_indic_script_properties; - -typedef struct kbts_langsys kbts_langsys; -typedef struct kbts_shape_config -{ - kbts_font *Font; - kbts_script Script; - kbts_language Language; - kbts_langsys *Langsys[KBTS_SHAPING_TABLE_COUNT]; - kbts_op_list OpLists[4]; - - kbts_feature_set *Features; - - kbts_shaper Shaper; - kbts_shaper_properties *ShaperProperties; - - kbts_indic_script_properties IndicScriptProperties; - kbts_feature *Blwf; - kbts_feature *Pref; - kbts_feature *Pstf; - kbts_feature *Locl; - kbts_feature *Rphf; - kbts_feature *Half; - kbts_feature *Vatu; - - // Indic - kbts_glyph Virama; - - kbts_glyph DottedCircle; - kbts_glyph Whitespace; - - // Thai - kbts_glyph Nikhahit; - kbts_glyph SaraAa; -} kbts_shape_config; - -typedef struct kbts_shape_state -{ - kbts_op Op; - kbts_shape_config *Config; - kbts_direction MainDirection; - kbts_direction RunDirection; - - kbts_feature_set UserFeatures; - - kbts_glyph_array GlyphArray; - kbts_glyph_array ClusterGlyphArray; - - kbts_u32 DottedCircleInsertIndex; - - kbts_u32 GlyphCountStartingFromCurrentCluster; - - kbts_u32 At; - kbts_u32 ResumePoint; - kbts_u32 OpGlyphOffset; - kbts_u32 ClusterGlyphCount; - kbts_u32 Ip; - kbts_u32 NextGlyphUid; - - kbts_u32 RequiredGlyphCapacity; - - int RealCluster; - int ClusterAtStartOfWord; - int WordBreak; - - // This must always be the last member! - kbts_op_state OpState; -} kbts_shape_state; - -typedef struct kbts_cursor -{ - kbts_direction Direction; - kbts_s32 LastAdvanceX; - kbts_s32 X; - kbts_s32 Y; -} kbts_cursor; - typedef struct kbts_break { // The break code mostly works in relative positions, but we convert to absolute positions for the user. // That way, breaks can be trivially stored and compared and such and it just works. - kbts_u32 Position; + int Position; kbts_break_flags Flags; kbts_direction Direction; // Only valid if (Flags & KBTS_BREAK_FLAG_DIRECTION). + kbts_direction ParagraphDirection; // Only valid if (Flags & KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION). kbts_script Script; // Only valid if (Flags & KBTS_BREAK_FLAG_SCRIPT). } kbts_break; typedef struct kbts_bracket { kbts_u32 Codepoint; + kbts_u32 Position; kbts_u8 Direction; kbts_u8 Script; } kbts_bracket; -typedef kbts_u32 kbts_break_state_flags; -enum kbts_break_state_flags_enum -{ - KBTS_BREAK_STATE_FLAG_STARTED = 1, - KBTS_BREAK_STATE_FLAG_END = 2, - KBTS_BREAK_STATE_FLAG_RAN_OUT_OF_REORDER_BUFFER_SPACE = 4, - - // Bidirectional flags - KBTS_BREAK_STATE_FLAG_SAW_R_AFTER_L = 8, - KBTS_BREAK_STATE_FLAG_SAW_AL_AFTER_LR = 0x10, - KBTS_BREAK_STATE_FLAG_LAST_WAS_BRACKET = 0x20, -}; - // In the worst case, a single call to BreakAddCodepoint would generate 4 breaks. // We buffer breaks to reorder them before returning them to the user. // This potentially requires infinite memory, which we don't have, so you may want to tweak this constant, // although, really, if the defaults don't work, then you have likely found very strange/adversarial text. -#define KBTS_BREAK_REORDER_BUFFER_FLUSH_THRESHOLD 4 -#define KBTS_BREAK_REORDER_BUFFER_SIZE (KBTS_BREAK_REORDER_BUFFER_FLUSH_THRESHOLD * 2) typedef struct kbts_break_state { - kbts_break Breaks[KBTS_BREAK_REORDER_BUFFER_SIZE]; + kbts_break Breaks[8]; kbts_u32 BreakCount; - kbts_direction MainDirection; - kbts_u32 LastFlushedBreakPosition; + kbts_direction ParagraphDirection; + kbts_direction UserParagraphDirection; + kbts_u32 CurrentPosition; + kbts_u32 ParagraphStartPosition; - kbts_u8 LastScripts[2]; + kbts_u32 LastScriptBreakPosition; + kbts_u32 LastDirectionBreakPosition; + kbts_u8 LastScriptBreakScript; + kbts_u8 LastDirectionBreakDirection; + + kbts_s16 ScriptPositionOffset; + kbts_u32 ScriptCount; + kbts_u8 ScriptSet[KBTS_MAXIMUM_CODEPOINT_SCRIPTS]; kbts_bracket Brackets[64]; kbts_u32 BracketCount; @@ -2813,8 +3376,11 @@ typedef struct kbts_break_state kbts_u8 LastDirection; kbts_u8 BidirectionalClass2; kbts_u8 BidirectionalClass1; + kbts_s16 Bidirectional1PositionOffset; + kbts_s16 Bidirectional2PositionOffset; kbts_japanese_line_break_style JapaneseLineBreakStyle; + kbts_break_config_flags ConfigFlags; kbts_u8 GraphemeBreakState; kbts_u8 LastLineBreakClass; kbts_u8 LastWordBreakClass; @@ -2823,84 +3389,352 @@ typedef struct kbts_break_state typedef struct kbts_decode { - kbts_u32 Codepoint; + int Codepoint; - kbts_u32 SourceCharactersConsumed; - kbts_u32 Valid; + int SourceCharactersConsumed; + int Valid; } kbts_decode; +typedef struct kbts_encode_utf8 +{ + char Encoded[4]; + int EncodedLength; + int Valid; +} kbts_encode_utf8; + +typedef struct kbts_glyph_classes +{ + kbts_u16 Class; + kbts_u16 MarkAttachmentClass; +} kbts_glyph_classes; + +typedef struct kbts_glyph +{ + kbts_glyph *Prev; + kbts_glyph *Next; + + kbts_u32 Codepoint; + kbts_u16 Id; // Glyph index. This is what you want to use to query outline data. + kbts_u16 Uid; + + // This field is kept and returned as-is throughout the shaping process. + // When you are using the context API, it contains a codepoint index always! + // To get the original user ID with the context API, you need to get the corresponding kbts_shape_codepoint + // with kbts_ShapeGetShapeCodepoint(Context, Glyph->UserIdOrCodepointIndex, ...); + int UserIdOrCodepointIndex; + + // Used by GPOS + kbts_s32 OffsetX; + kbts_s32 OffsetY; + kbts_s32 AdvanceX; + kbts_s32 AdvanceY; + + // Earlier on, we used to assume that, if a glyph had no advance, or had the MARK glyph class, then + // it could be handled as a mark in layout operations. This is inaccurate. + // Unicode makes a distinction between attached marks and standalone marks. For our purposes, attached + // marks are marks that have found a valid base character to attach to. In practice, this means that the + // font contains a valid display position/configuration for it in the current context. + // In contrast, standalone marks are marks that aren't attached to anything. Fonts may still have glyphs + // for them, in which case we want to display those just like regular glyphs that take up horizontal space + // on the line. When fonts don't have glyphs for them, they simply stay around as zero-width glyphs. + // Standalone marks have notably different behavior compared to attached marks, and so, once we start + // applying positioning features, it becomes worthwhile to track exactly which glyph has attached to which. + struct kbts_glyph *AttachGlyph; // Set by GPOS attachments. + + kbts_glyph_config *Config; + + kbts_u64 Decomposition; + + kbts_glyph_classes Classes; + + kbts_glyph_flags Flags; + + kbts_u32 ParentInfo; + + // This is set by GSUB and used by GPOS. + // A 0-index means that we should attach to the last component in the ligature. + // + // From the Microsoft docs: + // To correctly access the subtables, the client must keep track of the component associated with the mark. + // + // For a given mark assigned to a particular class, the appropriate base attachment point is determined by which + // ligature component the mark is associated with. This is dependent on the original character string and subsequent + // character- or glyph-sequence processing, not the font data alone. While a text-layout client is performing any + // character-based preprocessing or any glyph-substitution operations using the GSUB table, the text-layout client + // must keep track of associations of marks to particular ligature-glyph components. + kbts_u16 LigatureUid; + kbts_u16 LigatureComponentIndexPlusOne; + kbts_u16 LigatureComponentCount; + + // Set in GSUB and used in GPOS, for STCH. + kbts_joining_feature JoiningFeature; + + // Unicode properties filled in by CodepointToGlyph. + kbts_unicode_joining_type JoiningType; + kbts_u8 UnicodeFlags; + kbts_u8 SyllabicClass; + kbts_u8 SyllabicPosition; + kbts_u8 UseClass; + kbts_u8 CombiningClass; + + kbts_u8 MarkOrdering; // Only used temporarily in NORMALIZE for Arabic mark reordering. +} kbts_glyph; + +typedef struct kbts_shape_codepoint +{ + kbts_font *Font; // Only set when (BreakFlags & KBTS_BREAK_FLAG_GRAPHEME) != 0. + kbts_glyph_config *Config; + + int Codepoint; + int UserId; + + kbts_break_flags BreakFlags; + kbts_script Script; // Only set when (BreakFlags & KBTS_BREAK_FLAG_SCRIPT) != 0. + kbts_direction Direction; // Only set when (BreakFlags & KBTS_BREAK_FLAG_DIRECTION) != 0. + kbts_direction ParagraphDirection; // Only set when (BreakFlags & KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION) != 0. +} kbts_shape_codepoint; + +typedef struct kbts_shape_codepoint_iterator +{ + kbts_shape_codepoint *Codepoint; + kbts_shape_context *Context; + + kbts_u32 EndBlockIndex; + kbts_u32 OnePastLastCodepointIndex; + kbts_u32 BlockIndex; + kbts_u32 CodepointIndex; + kbts_u32 CurrentBlockCodepointCount; + kbts_u32 FlatCodepointIndex; +} kbts_shape_codepoint_iterator; + +typedef struct kbts_glyph_iterator +{ + kbts_glyph_storage *GlyphStorage; + kbts_glyph *CurrentGlyph; + + int LastAdvanceX; + int X; + int Y; +} kbts_glyph_iterator; + +typedef struct kbts_arena_block_header +{ + struct kbts_arena_block_header *Prev; + struct kbts_arena_block_header *Next; +} kbts_arena_block_header; + +typedef struct kbts_arena +{ + kbts_allocator_function *Allocator; + void *AllocatorData; + + kbts_arena_block_header BlockSentinel; + kbts_arena_block_header FreeBlockSentinel; + + int Error; +} kbts_arena; + +typedef struct kbts_glyph_storage +{ + kbts_arena Arena; + + kbts_glyph GlyphSentinel; + kbts_glyph FreeGlyphSentinel; + + int Error; +} kbts_glyph_storage; + +typedef struct kbts_glyph_parent +{ + kbts_u64 Decomposition; + kbts_u32 Codepoint; +} kbts_glyph_parent; + +typedef struct kbts_font_coverage_test +{ + kbts_font *Font; + kbts_u32 BaseCodepoint; + + int CurrentBaseError; + int Error; + + kbts_glyph_parent BaseParents[KBTS_MAXIMUM_RECOMPOSITION_PARENTS]; + kbts_u32 BaseParentCount; +} kbts_font_coverage_test; + +typedef struct kbts_run +{ + kbts_font *Font; + kbts_script Script; + kbts_direction ParagraphDirection; + kbts_direction Direction; + kbts_break_flags Flags; + + kbts_glyph_iterator Glyphs; +} kbts_run; + +// +// Context API +// The context can do everything for you. It is pretty convenient! +// + +KBTS_EXPORT int kbts_SizeOfShapeContext(void); +KBTS_EXPORT kbts_shape_context *kbts_PlaceShapeContext(kbts_allocator_function *Allocator, void *AllocatorData, void *Memory); +KBTS_EXPORT kbts_shape_context *kbts_PlaceShapeContextFixedMemory(void *Memory, int Size); +KBTS_EXPORT kbts_shape_context *kbts_CreateShapeContext(kbts_allocator_function *Allocator, void *AllocatorData); +KBTS_EXPORT void kbts_DestroyShapeContext(kbts_shape_context *Context); #ifndef KB_TEXT_SHAPE_NO_CRT -KBTS_EXPORT kbts_font kbts_FontFromFile(const char *FileName); -KBTS_EXPORT void kbts_FreeFont(kbts_font *Font); -KBTS_EXPORT kbts_shape_state *kbts_CreateShapeState(kbts_font *Font); -KBTS_EXPORT void kbts_FreeShapeState(kbts_shape_state *State); +KBTS_EXPORT kbts_font *kbts_ShapePushFontFromFile(kbts_shape_context *Context, const char *FileName, int FontIndex); #endif -KBTS_EXPORT kbts_feature_id kbts_FeatureTagToId(kbts_feature_tag Tag); -KBTS_EXPORT kbts_feature_override kbts_FeatureOverride(kbts_feature_id Id, int Alternate, kbts_u32 Value); -KBTS_EXPORT kbts_feature_override kbts_FeatureOverrideFromTag(kbts_feature_tag Tag, int Alternate, kbts_u32 Value); -KBTS_EXPORT kbts_glyph_config kbts_GlyphConfig(kbts_feature_override *FeatureOverrides, kbts_u32 FeatureOverrideCount); -KBTS_EXPORT kbts_glyph_config kbts_EmptyGlyphConfig(kbts_feature_override *FeatureOverrides, kbts_u32 FeatureOverrideCapacity); -KBTS_EXPORT int kbts_GlyphConfigOverrideFeature(kbts_glyph_config *Config, kbts_feature_id Id, int Alternate, kbts_u32 Value); -KBTS_EXPORT int kbts_GlyphConfigOverrideFeatureFromTag(kbts_glyph_config *Config, kbts_feature_tag Tag, int Alternate, kbts_u32 Value); +KBTS_EXPORT kbts_font *kbts_ShapePushFontFromMemory(kbts_shape_context *Context, void *Memory, int Size, int FontIndex); +KBTS_EXPORT kbts_font *kbts_ShapePushFont(kbts_shape_context *Context, kbts_font *Font); +KBTS_EXPORT kbts_font *kbts_ShapePopFont(kbts_shape_context *Context); +KBTS_EXPORT void kbts_ShapeBegin(kbts_shape_context *Context, kbts_direction ParagraphDirection, kbts_language Language); +KBTS_EXPORT void kbts_ShapeEnd(kbts_shape_context *Context); +KBTS_EXPORT int kbts_ShapeRun(kbts_shape_context *Context, kbts_run *Run); +KBTS_EXPORT void kbts_ShapePushFeature(kbts_shape_context *Context, kbts_u32 FeatureTag, int Value); +KBTS_EXPORT int kbts_ShapePopFeature(kbts_shape_context *Context, kbts_u32 FeatureTag); +KBTS_EXPORT void kbts_ShapeCodepoint(kbts_shape_context *Context, int Codepoint); +KBTS_EXPORT void kbts_ShapeCodepointWithUserId(kbts_shape_context *Context, int Codepoint, int UserId); +KBTS_EXPORT void kbts_ShapeUtf32(kbts_shape_context *Context, int *Utf32, int Length); +KBTS_EXPORT void kbts_ShapeUtf32WithUserId(kbts_shape_context *Context, int *Utf32, int Length, int UserId, int UserIdIncrement); +KBTS_EXPORT void kbts_ShapeUtf8(kbts_shape_context *Context, const char *Utf8, int Length, kbts_user_id_generation_mode UserIdGenerationMode); +KBTS_EXPORT void kbts_ShapeUtf8WithUserId(kbts_shape_context *Context, const char *Utf8, int Length, int UserId, kbts_user_id_generation_mode UserIdGenerationMode); +KBTS_EXPORT kbts_shape_error kbts_ShapeError(kbts_shape_context *Context); +KBTS_EXPORT void kbts_ShapeBeginManualRuns(kbts_shape_context *Context); +KBTS_EXPORT void kbts_ShapeNextManualRun(kbts_shape_context *Context, kbts_direction Direction, kbts_script Script); +KBTS_EXPORT void kbts_ShapeEndManualRuns(kbts_shape_context *Context); +KBTS_EXPORT void kbts_ShapeManualBreak(kbts_shape_context *Context); +KBTS_EXPORT kbts_shape_codepoint_iterator kbts_ShapeCurrentCodepointsIterator(kbts_shape_context *Context); +KBTS_EXPORT int kbts_ShapeCodepointIteratorIsValid(kbts_shape_codepoint_iterator *It); +KBTS_EXPORT int kbts_ShapeCodepointIteratorNext(kbts_shape_codepoint_iterator *It, kbts_shape_codepoint *Codepoint, int *CodepointIndex); +KBTS_EXPORT int kbts_ShapeGetShapeCodepoint(kbts_shape_context *Context, int CodepointIndex, kbts_shape_codepoint *Codepoint); + +// +// Direct API +// + +KBTS_EXPORT kbts_shape_error kbts_ShapeDirect(kbts_shape_config *Config, kbts_glyph_storage *Storage, kbts_direction RunDirection, kbts_allocator_function *Allocator, void *AllocatorData, kbts_glyph_iterator *Output); +KBTS_EXPORT kbts_shape_error kbts_ShapeDirectFixedMemory(kbts_shape_config *Config, kbts_glyph_storage *Storage, kbts_direction RunDirection, void *Memory, int MemorySize, kbts_glyph_iterator *Output); + +// A font holds all data that corresponds to a given font file. +#ifndef KB_TEXT_SHAPE_NO_CRT +KBTS_EXPORT kbts_font kbts_FontFromFile(const char *FileName, int FontIndex, kbts_allocator_function *Allocator, void *AllocatorData, void **FileData, int *FileSize); +#endif +KBTS_EXPORT int kbts_FontCount(void *FileData, int FileSize); +KBTS_EXPORT kbts_font kbts_FontFromMemory(void *FileData, int FileSize, int FontIndex, kbts_allocator_function *Allocator, void *AllocatorData); +KBTS_EXPORT void kbts_FreeFont(kbts_font *Font); KBTS_EXPORT int kbts_FontIsValid(kbts_font *Font); -KBTS_EXPORT kbts_un kbts_ReadFontHeader(kbts_font *Font, void *Data, kbts_un Size); -KBTS_EXPORT kbts_un kbts_ReadFontData(kbts_font *Font, void *Scratch, kbts_un ScratchSize); -KBTS_EXPORT int kbts_PostReadFontInitialize(kbts_font *Font, void *Memory, kbts_un MemorySize); -KBTS_EXPORT kbts_un kbts_SizeOfShapeState(kbts_font *Font); -KBTS_EXPORT kbts_shape_state *kbts_PlaceShapeState(void *Address, kbts_un Size); -KBTS_EXPORT void kbts_ResetShapeState(kbts_shape_state *State); -KBTS_EXPORT kbts_shape_config kbts_ShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language); -KBTS_EXPORT int kbts_ShaperIsComplex(kbts_shaper Shaper); -KBTS_EXPORT int kbts_Shape(kbts_shape_state *State, kbts_shape_config *Config, kbts_direction MainDirection, kbts_direction RunDirection, kbts_glyph *Glyphs, kbts_u32 *GlyphCount, kbts_u32 GlyphCapacity); -KBTS_EXPORT kbts_cursor kbts_Cursor(kbts_direction Direction); -KBTS_EXPORT void kbts_PositionGlyph(kbts_cursor *Cursor, kbts_glyph *Glyph, kbts_s32 *X, kbts_s32 *Y); -KBTS_EXPORT void kbts_BeginBreak(kbts_break_state *State, kbts_direction MainDirection, kbts_japanese_line_break_style JapaneseLineBreakStyle); -KBTS_EXPORT int kbts_BreakStateIsValid(kbts_break_state *State); -KBTS_EXPORT void kbts_BreakAddCodepoint(kbts_break_state *State, kbts_u32 Codepoint, kbts_u32 PositionIncrement, int EndOfText); -KBTS_EXPORT void kbts_BreakFlush(kbts_break_state *State); +KBTS_EXPORT kbts_load_font_error kbts_LoadFont(kbts_font *Font, kbts_load_font_state *State, void *FontData, int FontDataSize, int FontIndex, int *ScratchSize_, int *OutputSize_); +KBTS_EXPORT kbts_load_font_error kbts_PlaceBlob(kbts_font *Font, kbts_load_font_state *State, void *ScratchMemory, void *OutputMemory); +KBTS_EXPORT void kbts_GetFontInfo(kbts_font *Font, kbts_font_info *Info); + +// A shape_config is a bag of pre-computed data for a specific shaping setup. +KBTS_EXPORT int kbts_SizeOfShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language); +KBTS_EXPORT kbts_shape_config *kbts_PlaceShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language, void *Memory); +KBTS_EXPORT kbts_shape_config *kbts_CreateShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language, kbts_allocator_function *Allocator, void *AllocatorData); +KBTS_EXPORT void kbts_DestroyShapeConfig(kbts_shape_config *Config); + +// A glyph_storage holds and recycles glyph data. +KBTS_EXPORT int kbts_InitializeGlyphStorage(kbts_glyph_storage *Storage, kbts_allocator_function *Allocator, void *AllocatorData); +KBTS_EXPORT int kbts_InitializeGlyphStorageFixedMemory(kbts_glyph_storage *Storage, void *Memory, int MemorySize); +KBTS_EXPORT kbts_glyph *kbts_PushGlyph(kbts_glyph_storage *Storage, kbts_font *Font, int Codepoint, kbts_glyph_config *Config, int UserId); +KBTS_EXPORT void kbts_ClearActiveGlyphs(kbts_glyph_storage *Storage); +KBTS_EXPORT void kbts_FreeAllGlyphs(kbts_glyph_storage *Storage); +KBTS_EXPORT kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, int Codepoint, kbts_glyph_config *Config, int UserId); +KBTS_EXPORT int kbts_CodepointToGlyphId(kbts_font *Font, int Codepoint); +KBTS_EXPORT kbts_glyph_iterator kbts_ActiveGlyphIterator(kbts_glyph_storage *Storage); + +// A glyph_config specifies glyph-specific shaping parameters. +// A single glyph_config can be shared by multiple glyphs. +KBTS_EXPORT int kbts_SizeOfGlyphConfig(kbts_feature_override *Overrides, int OverrideCount); +KBTS_EXPORT kbts_glyph_config *kbts_PlaceGlyphConfig(kbts_feature_override *Overrides, int OverrideCount, void *Memory); +KBTS_EXPORT kbts_glyph_config *kbts_CreateGlyphConfig(kbts_feature_override *Overrides, int OverrideCount, kbts_allocator_function *Allocator, void *AllocatorData); +KBTS_EXPORT void kbts_DestroyGlyphConfig(kbts_glyph_config *Config); + +// +// Glyph iterator +// + +KBTS_EXPORT int kbts_GlyphIteratorNext(kbts_glyph_iterator *It, kbts_glyph **Glyph); +KBTS_EXPORT int kbts_GlyphIteratorIsValid(kbts_glyph_iterator *It); + +// +// Segmentation +// + +// This is a quick guess that stops at the first glyph that has a strong script/direction associated to it. +// It is convenient, but only works if you are sure your input text is mono-script and mono-direction. +KBTS_EXPORT void kbts_GuessTextProperties(void *Text, int TextSizeInBytes, kbts_text_format Format, kbts_direction *Direction, kbts_script *Script); +KBTS_EXPORT void kbts_GuessTextPropertiesUtf32(const int *Utf32, int Utf32Count, kbts_direction *Direction, kbts_script *Script); +KBTS_EXPORT void kbts_GuessTextPropertiesUtf8(const char *Utf8, int Utf8Length, kbts_direction *Direction, kbts_script *Script); + +KBTS_EXPORT void kbts_BreakBegin(kbts_break_state *State, kbts_direction ParagraphDirection, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags); +KBTS_EXPORT void kbts_BreakAddCodepoint(kbts_break_state *State, int Codepoint, int PositionIncrement, int EndOfText); +KBTS_EXPORT void kbts_BreakEnd(kbts_break_state *State); KBTS_EXPORT int kbts_Break(kbts_break_state *State, kbts_break *Break); +KBTS_EXPORT void kbts_BreakEntireString(kbts_direction Direction, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags, const void *Input, int InputSizeInBytes, kbts_text_format InputFormat, kbts_break *Breaks, int BreakCapacity, int *BreakCount, kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount); +KBTS_EXPORT void kbts_BreakEntireStringUtf32(kbts_direction Direction, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags, const int *Utf32, int Utf32Count, kbts_break *Breaks, int BreakCapacity, int *BreakCount, kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount); +KBTS_EXPORT void kbts_BreakEntireStringUtf8(kbts_direction Direction, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags, const char *Utf8, int Utf8Length, kbts_break *Breaks, int BreakCapacity, int *BreakCount, kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount); + +// +// Other stuff +// + +// Quick test for font support of a sequence of codepoints. +KBTS_EXPORT void kbts_FontCoverageTestBegin(kbts_font_coverage_test *Test, kbts_font *Font); +KBTS_EXPORT void kbts_FontCoverageTestCodepoint(kbts_font_coverage_test *Test, int Codepoint); +KBTS_EXPORT int kbts_FontCoverageTestEnd(kbts_font_coverage_test *Test); + KBTS_EXPORT kbts_decode kbts_DecodeUtf8(const char *Utf8, kbts_un Length); -KBTS_EXPORT kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, kbts_u32 Codepoint); -KBTS_EXPORT void kbts_InferScript(kbts_direction *Direction, kbts_script *Script, kbts_script GlyphScript); +KBTS_EXPORT kbts_encode_utf8 kbts_EncodeUtf8(int Codepoint); +KBTS_EXPORT kbts_direction kbts_ScriptDirection(kbts_script Script); KBTS_EXPORT int kbts_ScriptIsComplex(kbts_script Script); KBTS_EXPORT kbts_script kbts_ScriptTagToScript(kbts_script_tag Tag); + #endif #ifdef KB_TEXT_SHAPE_IMPLEMENTATION #ifdef _MSC_VER -#define KBTS_UNUSED(X) (void)sizeof((X)) +#define KBTS__UNUSED(X) (void)sizeof((X)) #else -#define KBTS_UNUSED(X) (void)(X) +#define KBTS__UNUSED(X) (void)(X) #endif -# define KBTS_FOR(I, Start, End) for(kbts_un I = (Start); I < (End); ++I) +# define KBTS__FOR(I, Start, End) for(kbts_un I = (Start); I < (End); ++I) # ifdef __cplusplus -# define KBTS_ZERO {} -# define KBTS_ZERO_TYPE(T) T{} +# define KBTS__ZERO {} +# define KBTS__ZERO_TYPE(T) T{} # else -# define KBTS_ZERO {0} -# define KBTS_ZERO_TYPE(T) (T){0} +# define KBTS__ZERO {0} +# define KBTS__ZERO_TYPE(T) (T){0} # endif -# define KBTS_MAX(A, B) (((A) < (B)) ? (B) : (A)) -# define KBTS_MIN(A, B) (((A) < (B)) ? (A) : (B)) -# define KBTS_ARRAY_LENGTH(A) (sizeof(A)/sizeof(*(A))) -# define KBTS_POINTER_AFTER(Type, X) ((Type *)((X) + 1)) -# define KBTS_POINTER_OFFSET(Type, Base, Offset) ((Type *)((char *)(Base) + (Offset))) -# define KBTS_POINTER_DIFF32(Pointer, Base) ((kbts_u32)((char *)(Pointer) - (char *)(Base))) -# define KBTS_PASTE_1(A, B) A##B -# define KBTS_PASTE_0(A, B) KBTS_PASTE_1(A, B) -# define KBTS_PASTE(A, B) KBTS_PASTE_0(A, B) -# define KBTS_IN_SET(X, Set) ((1u << (X)) & (Set)) -# define KBTS_SET32_0(Arg) | (1u << (Arg)) KBTS_SET32_1 -# define KBTS_SET32_1(Arg) | (1u << (Arg)) KBTS_SET32_0 -# define KBTS_SET32_0End -# define KBTS_SET32_1End -# define KBTS_SET32(Args) (0u KBTS_PASTE(KBTS_SET32_0 Args, End)) -# define KBTS_IN_SET64(X, Set) ((1ull << (X)) & (Set)) -# define KBTS_SET64_0(Arg) | (1ull << (Arg)) KBTS_SET64_1 -# define KBTS_SET64_1(Arg) | (1ull << (Arg)) KBTS_SET64_0 -# define KBTS_SET64_0End -# define KBTS_SET64_1End -# define KBTS_SET64(Args) (0u KBTS_PASTE(KBTS_SET64_0 Args, End)) +# define KBTS__MAX(A, B) (((A) < (B)) ? (B) : (A)) +# define KBTS__MIN(A, B) (((A) < (B)) ? (A) : (B)) +# define KBTS__ARRAY_LENGTH(A) (sizeof(A)/sizeof(*(A))) +# define KBTS__POINTER_AFTER(Type, X) ((Type *)((X) + 1)) +# define KBTS__POINTER_OFFSET(Type, Base, Offset) ((Type *)((char *)(Base) + (Offset))) +# define KBTS__POINTER_DIFF32(Pointer, Base) ((kbts_u32)((char *)(Pointer) - (char *)(Base))) +# define KBTS__POINTER_DIFF(Pointer, Base) ((kbts_un)((char *)(Pointer) - (char *)(Base))) +# define KBTS__ALIGN_POINTER(Type, Pointer, Align) (Type *)(((kbts_un)(Pointer) + ((Align) - 1)) & ~((Align) - 1)) +# define KBTS__PASTE_1(A, B) A##B +# define KBTS__PASTE_0(A, B) KBTS__PASTE_1(A, B) +# define KBTS__PASTE(A, B) KBTS__PASTE_0(A, B) +# define KBTS__IN_SET(X, Set) ((1u << (X)) & (Set)) +# define KBTS__SET32_0(Arg) | (1u << (Arg)) KBTS__SET32_1 +# define KBTS__SET32_1(Arg) | (1u << (Arg)) KBTS__SET32_0 +# define KBTS__SET32_0End +# define KBTS__SET32_1End +# define KBTS__SET32(Args) (0u KBTS__PASTE(KBTS__SET32_0 Args, End)) +# define KBTS__IN_SET64(X, Set) ((1ull << (X)) & (Set)) +# define KBTS__SET64_0(Arg) | (1ull << (Arg)) KBTS__SET64_1 +# define KBTS__SET64_1(Arg) | (1ull << (Arg)) KBTS__SET64_0 +# define KBTS__SET64_0End +# define KBTS__SET64_1End +# define KBTS__SET64(Args) (0u KBTS__PASTE(KBTS__SET64_0 Args, End)) +#define KBTS__U32BE(X) kbts__ByteSwap32((X)) +#define KBTS__U32LE(X) (X) + +#define KBTS_LOOKUP_STACK_SIZE 64 # ifndef KBTS_ASSERT #ifndef KB_TEXT_SHAPE_NO_CRT @@ -2920,47 +3754,706 @@ KBTS_EXPORT kbts_script kbts_ScriptTagToScript(kbts_script_tag Tag); #define KBTS_MEMSET memset #endif -#ifndef kbts_ByteSwap16 +#ifndef KBTS_MEMCPY +#include +#define KBTS_MEMCPY memcpy +#endif + +#ifndef KB_TEXT_SHAPE_NO_CRT +#ifndef KBTS_MALLOC +#include +#define KBTS_MALLOC(Data, Size) malloc((Size)) +#define KBTS_FREE(Data, Pointer) free((Pointer)) +#endif +#else +#ifndef KBTS_MALLOC +// Nerf the default allocator to a null allocator. +#define KBTS_MALLOC(Data, Size) 0 +#define KBTS_FREE(Data, Pointer) +#endif +#endif + +#ifndef kbts__ByteSwap16 # if defined(_MSC_VER) && !defined(__clang__) -# define kbts_ByteSwap16(X) _byteswap_ushort(X) -# define kbts_ByteSwap32(X) _byteswap_ulong(X) -# define kbts_PopCount32(X) (kbts_un)__popcnt(X) +#include +KBTS_INLINE kbts_u16 kbts__ByteSwap16(kbts_u16 X) +{ + kbts_u16 Result = (kbts_u16)((X >> 8) | (X << 8)); + return Result; +} +KBTS_INLINE kbts_u32 kbts__ByteSwap32(kbts_u32 X) +{ + kbts_u32 Result = (X >> 24) | + ((X & 0xFF0000) >> 8) | + ((X & 0xFF00) << 8) | + ((X & 0xFF) << 24); + return Result; +} +# define kbts__PopCount32(X) (kbts_un)__popcnt(X) # elif defined(__clang__) || defined(__GNUC__) -# define kbts_ByteSwap16(X) __builtin_bswap16(X) -# define kbts_ByteSwap32(X) __builtin_bswap32(X) -# define kbts_PopCount32(X) (kbts_un)__builtin_popcount(X) +# define kbts__ByteSwap16(X) __builtin_bswap16(X) +# define kbts__ByteSwap32(X) __builtin_bswap32(X) +# define kbts__PopCount32(X) (kbts_un)__builtin_popcount(X) # else # error Unsupported compiler! # endif #endif -#define KBTS_FEATURE_FLAG0(Feature) (1ull << KBTS_FEATURE_ID_##Feature) -#define KBTS_FEATURE_FLAG1(Feature) (1ull << (KBTS_FEATURE_ID_##Feature - 64)) -#define KBTS_FEATURE_FLAG2(Feature) (1ull << (KBTS_FEATURE_ID_##Feature - 128)) -#define KBTS_FEATURE_FLAG3(Feature) (1ull << (KBTS_FEATURE_ID_##Feature - 192)) +#ifndef kbts__MsbPositionOrZero32 +# if defined(_MSC_VER) && !defined(__clang__) +#include +KBTS_INLINE kbts_u32 kbts__MsbPositionOrZero32(kbts_u32 X) +{ + unsigned long Result; + if(!_BitScanReverse(&Result, X)) + { + Result = 0; + } + return (kbts_u32)Result; +} +# elif defined(__clang__) || defined(__GNUC__) +KBTS_INLINE kbts_u32 kbts__MsbPositionOrZero32(kbts_u32 X) +{ + kbts_u32 Result = 0; + if(X) + { + Result = 31 - __builtin_clz(X); + } + return Result; +} +# else +# error Unsupported compiler! +# endif +#endif + +#define KBTS__FEATURE_FLAG0(Feature) (1ull << KBTS__FEATURE_ID_##Feature) +#define KBTS__FEATURE_FLAG1(Feature) (1ull << (KBTS__FEATURE_ID_##Feature - 64)) +#define KBTS__FEATURE_FLAG2(Feature) (1ull << (KBTS__FEATURE_ID_##Feature - 128)) +#define KBTS__FEATURE_FLAG3(Feature) (1ull << (KBTS__FEATURE_ID_##Feature - 192)) + +// #define KBTS_SANITY_CHECK +// #define KBTS_DUMP -// # define KBTS_DUMP # ifdef KBTS_DUMP # define KBTS_DUMPF(...) printf(__VA_ARGS__), fflush(stdout) # else # define KBTS_DUMPF(...) # endif -# define KBTS_GROW_BUFFER_MARGIN 16 - #ifndef KBTS_INSTRUMENT_BLOCK_BEGIN #define KBTS_INSTRUMENT_BLOCK_BEGIN(Name) +#define KBTS_INSTRUMENT_BLOCK_END(Name) #define KBTS_INSTRUMENT_FUNCTION_BEGIN -#define KBTS_INSTRUMENT_END +#define KBTS_INSTRUMENT_FUNCTION_END #endif -#define KBTS_MAXIMUM_DECOMPOSITION_CODEPOINTS 6 -typedef struct kbts_script_properties { +#define KBTS__GLYPH_FEATURE_MASK ((KBTS_GLYPH_FLAG_CFAR << 1) - 1) +// In USE, glyphs are mostly not pre-flagged for feature application. +// However, we do want to flag rphf/pref results for reordering, so we want to +// keep all of the flags as usual, and only use these feature flags for filtering. +#define KBTS__USE_GLYPH_FEATURE_MASK (KBTS_GLYPH_FLAG_ISOL | KBTS_GLYPH_FLAG_FINA | KBTS_GLYPH_FLAG_FIN2 | KBTS_GLYPH_FLAG_FIN3 | \ + KBTS_GLYPH_FLAG_MEDI | KBTS_GLYPH_FLAG_MED2 | KBTS_GLYPH_FLAG_INIT | KBTS_GLYPH_FLAG_NUMR | \ + KBTS_GLYPH_FLAG_DNOM | KBTS_GLYPH_FLAG_FRAC) +#define KBTS__JOINING_FEATURE_MASK (KBTS_GLYPH_FLAG_ISOL | KBTS_GLYPH_FLAG_FINA | KBTS_GLYPH_FLAG_FIN2 | KBTS_GLYPH_FLAG_FIN3 | \ + KBTS_GLYPH_FLAG_MEDI | KBTS_GLYPH_FLAG_MED2 | KBTS_GLYPH_FLAG_INIT) +#define KBTS__JOINING_FEATURE_TO_GLYPH_FLAG(Feature) (1 << ((Feature) - 1)) + +typedef kbts_u8 kbts__reph_position; +enum kbts__reph_position_enum +{ + KBTS__REPH_POSITION_AFTER_POST, + KBTS__REPH_POSITION_BEFORE_POST, + KBTS__REPH_POSITION_BEFORE_SUBJOINED, + KBTS__REPH_POSITION_AFTER_SUBJOINED, + KBTS__REPH_POSITION_AFTER_MAIN, + + KBTS__REPH_POSITION_COUNT, +}; + +typedef kbts_u8 kbts__reph_encoding; +enum kbts__reph_encoding_enum +{ + KBTS__REPH_ENCODING_IMPLICIT, + KBTS__REPH_ENCODING_EXPLICIT, + KBTS__REPH_ENCODING_LOGICAL_REPHA, + KBTS__REPH_ENCODING_VISUAL_REPHA, + + KBTS__REPH_ENCODING_COUNT, +}; + +typedef kbts_u8 kbts__syllabic_position; +enum kbts__syllabic_position_enum +{ + KBTS__SYLLABIC_POSITION_NONE, + + KBTS__SYLLABIC_POSITION_RA_TO_BECOME_REPH, + + KBTS__SYLLABIC_POSITION_PREBASE_MATRA, + KBTS__SYLLABIC_POSITION_PREBASE_CONSONANT, + + KBTS__SYLLABIC_POSITION_SYLLABLE_BASE, + KBTS__SYLLABIC_POSITION_AFTER_MAIN, + + KBTS__SYLLABIC_POSITION_ABOVEBASE_CONSONANT, + + KBTS__SYLLABIC_POSITION_BEFORE_SUBJOINED, + KBTS__SYLLABIC_POSITION_BELOWBASE_CONSONANT, + KBTS__SYLLABIC_POSITION_AFTER_SUBJOINED, + + KBTS__SYLLABIC_POSITION_BEFORE_POST, + KBTS__SYLLABIC_POSITION_POSTBASE_CONSONANT, + KBTS__SYLLABIC_POSITION_AFTER_POST, + + KBTS__SYLLABIC_POSITION_FINAL_CONSONANT, + KBTS__SYLLABIC_POSITION_SMVD, + + KBTS__SYLLABIC_POSITION_COUNT, +}; + + +typedef kbts_u32 kbts__feature_id; +enum kbts__feature_id_enum +{ + KBTS__FEATURE_ID_UNREGISTERED, // Features that aren't pre-defined in the OpenType spec + KBTS__FEATURE_ID_isol, // Isolated Forms + KBTS__FEATURE_ID_fina, // Terminal Forms + KBTS__FEATURE_ID_fin2, // Terminal Forms #2 + KBTS__FEATURE_ID_fin3, // Terminal Forms #3 + KBTS__FEATURE_ID_medi, // Medial Forms + KBTS__FEATURE_ID_med2, // Medial Forms #2 + KBTS__FEATURE_ID_init, // Initial Forms + KBTS__FEATURE_ID_ljmo, // Leading Jamo Forms + KBTS__FEATURE_ID_vjmo, // Vowel Jamo Forms + KBTS__FEATURE_ID_tjmo, // Trailing Jamo Forms + KBTS__FEATURE_ID_rphf, // Reph Form + KBTS__FEATURE_ID_blwf, // Below-base Forms + KBTS__FEATURE_ID_half, // Half Forms + KBTS__FEATURE_ID_pstf, // Post-base Forms + KBTS__FEATURE_ID_abvf, // Above-base Forms + KBTS__FEATURE_ID_pref, // Pre-base Forms + KBTS__FEATURE_ID_numr, // Numerators + KBTS__FEATURE_ID_frac, // Fractions + KBTS__FEATURE_ID_dnom, // Denominators + KBTS__FEATURE_ID_cfar, // Conjunct Form After Ro + KBTS__FEATURE_ID_aalt, // Access All Alternates + KBTS__FEATURE_ID_abvm, // Above-base Mark Positioning + KBTS__FEATURE_ID_abvs, // Above-base Substitutions + KBTS__FEATURE_ID_afrc, // Alternative Fractions + KBTS__FEATURE_ID_akhn, // Akhand + KBTS__FEATURE_ID_apkn, // Kerning for Alternate Proportional Widths + KBTS__FEATURE_ID_blwm, // Below-base Mark Positioning + KBTS__FEATURE_ID_blws, // Below-base Substitutions + KBTS__FEATURE_ID_calt, // Contextual Alternates + KBTS__FEATURE_ID_case, // Case-sensitive Forms + KBTS__FEATURE_ID_ccmp, // Glyph Composition / Decomposition + KBTS__FEATURE_ID_chws, // Contextual Half-width Spacing + KBTS__FEATURE_ID_cjct, // Conjunct Forms + KBTS__FEATURE_ID_clig, // Contextual Ligatures + KBTS__FEATURE_ID_cpct, // Centered CJK Punctuation + KBTS__FEATURE_ID_cpsp, // Capital Spacing + KBTS__FEATURE_ID_cswh, // Contextual Swash + KBTS__FEATURE_ID_curs, // Cursive Positioning + KBTS__FEATURE_ID_cv01, // Character Variant 1 + KBTS__FEATURE_ID_cv02, // Character Variant 2 + KBTS__FEATURE_ID_cv03, // Character Variant 3 + KBTS__FEATURE_ID_cv04, // Character Variant 4 + KBTS__FEATURE_ID_cv05, // Character Variant 5 + KBTS__FEATURE_ID_cv06, // Character Variant 6 + KBTS__FEATURE_ID_cv07, // Character Variant 7 + KBTS__FEATURE_ID_cv08, // Character Variant 8 + KBTS__FEATURE_ID_cv09, // Character Variant 9 + KBTS__FEATURE_ID_cv10, // Character Variant 10 + KBTS__FEATURE_ID_cv11, // Character Variant 11 + KBTS__FEATURE_ID_cv12, // Character Variant 12 + KBTS__FEATURE_ID_cv13, // Character Variant 13 + KBTS__FEATURE_ID_cv14, // Character Variant 14 + KBTS__FEATURE_ID_cv15, // Character Variant 15 + KBTS__FEATURE_ID_cv16, // Character Variant 16 + KBTS__FEATURE_ID_cv17, // Character Variant 17 + KBTS__FEATURE_ID_cv18, // Character Variant 18 + KBTS__FEATURE_ID_cv19, // Character Variant 19 + KBTS__FEATURE_ID_cv20, // Character Variant 20 + KBTS__FEATURE_ID_cv21, // Character Variant 21 + KBTS__FEATURE_ID_cv22, // Character Variant 22 + KBTS__FEATURE_ID_cv23, // Character Variant 23 + KBTS__FEATURE_ID_cv24, // Character Variant 24 + KBTS__FEATURE_ID_cv25, // Character Variant 25 + KBTS__FEATURE_ID_cv26, // Character Variant 26 + KBTS__FEATURE_ID_cv27, // Character Variant 27 + KBTS__FEATURE_ID_cv28, // Character Variant 28 + KBTS__FEATURE_ID_cv29, // Character Variant 29 + KBTS__FEATURE_ID_cv30, // Character Variant 30 + KBTS__FEATURE_ID_cv31, // Character Variant 31 + KBTS__FEATURE_ID_cv32, // Character Variant 32 + KBTS__FEATURE_ID_cv33, // Character Variant 33 + KBTS__FEATURE_ID_cv34, // Character Variant 34 + KBTS__FEATURE_ID_cv35, // Character Variant 35 + KBTS__FEATURE_ID_cv36, // Character Variant 36 + KBTS__FEATURE_ID_cv37, // Character Variant 37 + KBTS__FEATURE_ID_cv38, // Character Variant 38 + KBTS__FEATURE_ID_cv39, // Character Variant 39 + KBTS__FEATURE_ID_cv40, // Character Variant 40 + KBTS__FEATURE_ID_cv41, // Character Variant 41 + KBTS__FEATURE_ID_cv42, // Character Variant 42 + KBTS__FEATURE_ID_cv43, // Character Variant 43 + KBTS__FEATURE_ID_cv44, // Character Variant 44 + KBTS__FEATURE_ID_cv45, // Character Variant 45 + KBTS__FEATURE_ID_cv46, // Character Variant 46 + KBTS__FEATURE_ID_cv47, // Character Variant 47 + KBTS__FEATURE_ID_cv48, // Character Variant 48 + KBTS__FEATURE_ID_cv49, // Character Variant 49 + KBTS__FEATURE_ID_cv50, // Character Variant 50 + KBTS__FEATURE_ID_cv51, // Character Variant 51 + KBTS__FEATURE_ID_cv52, // Character Variant 52 + KBTS__FEATURE_ID_cv53, // Character Variant 53 + KBTS__FEATURE_ID_cv54, // Character Variant 54 + KBTS__FEATURE_ID_cv55, // Character Variant 55 + KBTS__FEATURE_ID_cv56, // Character Variant 56 + KBTS__FEATURE_ID_cv57, // Character Variant 57 + KBTS__FEATURE_ID_cv58, // Character Variant 58 + KBTS__FEATURE_ID_cv59, // Character Variant 59 + KBTS__FEATURE_ID_cv60, // Character Variant 60 + KBTS__FEATURE_ID_cv61, // Character Variant 61 + KBTS__FEATURE_ID_cv62, // Character Variant 62 + KBTS__FEATURE_ID_cv63, // Character Variant 63 + KBTS__FEATURE_ID_cv64, // Character Variant 64 + KBTS__FEATURE_ID_cv65, // Character Variant 65 + KBTS__FEATURE_ID_cv66, // Character Variant 66 + KBTS__FEATURE_ID_cv67, // Character Variant 67 + KBTS__FEATURE_ID_cv68, // Character Variant 68 + KBTS__FEATURE_ID_cv69, // Character Variant 69 + KBTS__FEATURE_ID_cv70, // Character Variant 70 + KBTS__FEATURE_ID_cv71, // Character Variant 71 + KBTS__FEATURE_ID_cv72, // Character Variant 72 + KBTS__FEATURE_ID_cv73, // Character Variant 73 + KBTS__FEATURE_ID_cv74, // Character Variant 74 + KBTS__FEATURE_ID_cv75, // Character Variant 75 + KBTS__FEATURE_ID_cv76, // Character Variant 76 + KBTS__FEATURE_ID_cv77, // Character Variant 77 + KBTS__FEATURE_ID_cv78, // Character Variant 78 + KBTS__FEATURE_ID_cv79, // Character Variant 79 + KBTS__FEATURE_ID_cv80, // Character Variant 80 + KBTS__FEATURE_ID_cv81, // Character Variant 81 + KBTS__FEATURE_ID_cv82, // Character Variant 82 + KBTS__FEATURE_ID_cv83, // Character Variant 83 + KBTS__FEATURE_ID_cv84, // Character Variant 84 + KBTS__FEATURE_ID_cv85, // Character Variant 85 + KBTS__FEATURE_ID_cv86, // Character Variant 86 + KBTS__FEATURE_ID_cv87, // Character Variant 87 + KBTS__FEATURE_ID_cv88, // Character Variant 88 + KBTS__FEATURE_ID_cv89, // Character Variant 89 + KBTS__FEATURE_ID_cv90, // Character Variant 90 + KBTS__FEATURE_ID_cv91, // Character Variant 91 + KBTS__FEATURE_ID_cv92, // Character Variant 92 + KBTS__FEATURE_ID_cv93, // Character Variant 93 + KBTS__FEATURE_ID_cv94, // Character Variant 94 + KBTS__FEATURE_ID_cv95, // Character Variant 95 + KBTS__FEATURE_ID_cv96, // Character Variant 96 + KBTS__FEATURE_ID_cv97, // Character Variant 97 + KBTS__FEATURE_ID_cv98, // Character Variant 98 + KBTS__FEATURE_ID_cv99, // Character Variant 99 + KBTS__FEATURE_ID_c2pc, // Petite Capitals From Capitals + KBTS__FEATURE_ID_c2sc, // Small Capitals From Capitals + KBTS__FEATURE_ID_dist, // Distances + KBTS__FEATURE_ID_dlig, // Discretionary Ligatures + KBTS__FEATURE_ID_dtls, // Dotless Forms + KBTS__FEATURE_ID_expt, // Expert Forms + KBTS__FEATURE_ID_falt, // Final Glyph on Line Alternates + KBTS__FEATURE_ID_flac, // Flattened Accent Forms + KBTS__FEATURE_ID_fwid, // Full Widths + KBTS__FEATURE_ID_haln, // Halant Forms + KBTS__FEATURE_ID_halt, // Alternate Half Widths + KBTS__FEATURE_ID_hist, // Historical Forms + KBTS__FEATURE_ID_hkna, // Horizontal Kana Alternates + KBTS__FEATURE_ID_hlig, // Historical Ligatures + KBTS__FEATURE_ID_hngl, // Hangul + KBTS__FEATURE_ID_hojo, // Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms) + KBTS__FEATURE_ID_hwid, // Half Widths + KBTS__FEATURE_ID_ital, // Italics + KBTS__FEATURE_ID_jalt, // Justification Alternates + KBTS__FEATURE_ID_jp78, // JIS78 Forms + KBTS__FEATURE_ID_jp83, // JIS83 Forms + KBTS__FEATURE_ID_jp90, // JIS90 Forms + KBTS__FEATURE_ID_jp04, // JIS2004 Forms + KBTS__FEATURE_ID_kern, // Kerning + KBTS__FEATURE_ID_lfbd, // Left Bounds + KBTS__FEATURE_ID_liga, // Standard Ligatures + KBTS__FEATURE_ID_lnum, // Lining Figures + KBTS__FEATURE_ID_locl, // Localized Forms + KBTS__FEATURE_ID_ltra, // Left-to-right Alternates + KBTS__FEATURE_ID_ltrm, // Left-to-right Mirrored Forms + KBTS__FEATURE_ID_mark, // Mark Positioning + KBTS__FEATURE_ID_mgrk, // Mathematical Greek + KBTS__FEATURE_ID_mkmk, // Mark to Mark Positioning + KBTS__FEATURE_ID_mset, // Mark Positioning via Substitution + KBTS__FEATURE_ID_nalt, // Alternate Annotation Forms + KBTS__FEATURE_ID_nlck, // NLC Kanji Forms + KBTS__FEATURE_ID_nukt, // Nukta Forms + KBTS__FEATURE_ID_onum, // Oldstyle Figures + KBTS__FEATURE_ID_opbd, // Optical Bounds + KBTS__FEATURE_ID_ordn, // Ordinals + KBTS__FEATURE_ID_ornm, // Ornaments + KBTS__FEATURE_ID_palt, // Proportional Alternate Widths + KBTS__FEATURE_ID_pcap, // Petite Capitals + KBTS__FEATURE_ID_pkna, // Proportional Kana + KBTS__FEATURE_ID_pnum, // Proportional Figures + KBTS__FEATURE_ID_pres, // Pre-base Substitutions + KBTS__FEATURE_ID_psts, // Post-base Substitutions + KBTS__FEATURE_ID_pwid, // Proportional Widths + KBTS__FEATURE_ID_qwid, // Quarter Widths + KBTS__FEATURE_ID_rand, // Randomize + KBTS__FEATURE_ID_rclt, // Required Contextual Alternates + KBTS__FEATURE_ID_rkrf, // Rakar Forms + KBTS__FEATURE_ID_rlig, // Required Ligatures + KBTS__FEATURE_ID_rtbd, // Right Bounds + KBTS__FEATURE_ID_rtla, // Right-to-left Alternates + KBTS__FEATURE_ID_rtlm, // Right-to-left Mirrored Forms + KBTS__FEATURE_ID_ruby, // Ruby Notation Forms + KBTS__FEATURE_ID_rvrn, // Required Variation Alternates + KBTS__FEATURE_ID_salt, // Stylistic Alternates + KBTS__FEATURE_ID_sinf, // Scientific Inferiors + KBTS__FEATURE_ID_size, // Optical size + KBTS__FEATURE_ID_smcp, // Small Capitals + KBTS__FEATURE_ID_smpl, // Simplified Forms + KBTS__FEATURE_ID_ss01, // Stylistic Set 1 + KBTS__FEATURE_ID_ss02, // Stylistic Set 2 + KBTS__FEATURE_ID_ss03, // Stylistic Set 3 + KBTS__FEATURE_ID_ss04, // Stylistic Set 4 + KBTS__FEATURE_ID_ss05, // Stylistic Set 5 + KBTS__FEATURE_ID_ss06, // Stylistic Set 6 + KBTS__FEATURE_ID_ss07, // Stylistic Set 7 + KBTS__FEATURE_ID_ss08, // Stylistic Set 8 + KBTS__FEATURE_ID_ss09, // Stylistic Set 9 + KBTS__FEATURE_ID_ss10, // Stylistic Set 10 + KBTS__FEATURE_ID_ss11, // Stylistic Set 11 + KBTS__FEATURE_ID_ss12, // Stylistic Set 12 + KBTS__FEATURE_ID_ss13, // Stylistic Set 13 + KBTS__FEATURE_ID_ss14, // Stylistic Set 14 + KBTS__FEATURE_ID_ss15, // Stylistic Set 15 + KBTS__FEATURE_ID_ss16, // Stylistic Set 16 + KBTS__FEATURE_ID_ss17, // Stylistic Set 17 + KBTS__FEATURE_ID_ss18, // Stylistic Set 18 + KBTS__FEATURE_ID_ss19, // Stylistic Set 19 + KBTS__FEATURE_ID_ss20, // Stylistic Set 20 + KBTS__FEATURE_ID_ssty, // Math Script-style Alternates + KBTS__FEATURE_ID_stch, // Stretching Glyph Decomposition + KBTS__FEATURE_ID_subs, // Subscript + KBTS__FEATURE_ID_sups, // Superscript + KBTS__FEATURE_ID_swsh, // Swash + KBTS__FEATURE_ID_test, // Test features, only for development + KBTS__FEATURE_ID_titl, // Titling + KBTS__FEATURE_ID_tnam, // Traditional Name Forms + KBTS__FEATURE_ID_tnum, // Tabular Figures + KBTS__FEATURE_ID_trad, // Traditional Forms + KBTS__FEATURE_ID_twid, // Third Widths + KBTS__FEATURE_ID_unic, // Unicase + KBTS__FEATURE_ID_valt, // Alternate Vertical Metrics + KBTS__FEATURE_ID_vapk, // Kerning for Alternate Proportional Vertical Metrics + KBTS__FEATURE_ID_vatu, // Vattu Variants + KBTS__FEATURE_ID_vchw, // Vertical Contextual Half-width Spacing + KBTS__FEATURE_ID_vert, // Vertical Alternates + KBTS__FEATURE_ID_vhal, // Alternate Vertical Half Metrics + KBTS__FEATURE_ID_vkna, // Vertical Kana Alternates + KBTS__FEATURE_ID_vkrn, // Vertical Kerning + KBTS__FEATURE_ID_vpal, // Proportional Alternate Vertical Metrics + KBTS__FEATURE_ID_vrt2, // Vertical Alternates and Rotation + KBTS__FEATURE_ID_vrtr, // Vertical Alternates for Rotation + KBTS__FEATURE_ID_zero, // Slashed Zero + KBTS__FEATURE_ID_COUNT, +}; + +typedef struct kbts__feature_set +{ + kbts_u64 Flags[(KBTS__FEATURE_ID_COUNT + 63) / 64]; +} kbts__feature_set; +typedef kbts_u8 kbts__op_kind; +enum kbts__op_kind_enum +{ + KBTS__OP_KIND_END, + KBTS__OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES, + KBTS__OP_KIND_NORMALIZE, + KBTS__OP_KIND_NORMALIZE_HANGUL, + KBTS__OP_KIND_FLAG_JOINING_LETTERS, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES_WITH_USER, + KBTS__OP_KIND_GPOS_METRICS, + KBTS__OP_KIND_GPOS_FEATURES, + KBTS__OP_KIND_POST_GPOS_FIXUP, + KBTS__OP_KIND_STCH_POSTPASS, + KBTS__OP_KIND_BEGIN_CLUSTER, + KBTS__OP_KIND_END_CLUSTER, + KBTS__OP_KIND_END_SYLLABLE, + KBTS__OP_KIND_COUNT, +}; +typedef struct kbts__feature_stage +{ + kbts_u32 FeatureCount; + kbts__feature_set Features; +} kbts__feature_stage; +typedef struct kbts__op_list +{ + kbts_u32 TotalFeatureCount; + kbts_u32 FeatureStageCount; + kbts__feature_stage *FeatureStages; + kbts_u32 OpCount; + kbts__op_kind *Ops; +} kbts__op_list; +static kbts__op_kind kbts__Ops_Default[] = { + KBTS__OP_KIND_NORMALIZE, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES_WITH_USER, + KBTS__OP_KIND_GPOS_METRICS, + KBTS__OP_KIND_GPOS_FEATURES, + KBTS__OP_KIND_POST_GPOS_FIXUP, +}; +static kbts__feature_stage kbts__FeatureStages_Default[] = { + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(rvrn)}}}, + {12, {{0ull | KBTS__FEATURE_FLAG0(frac) | KBTS__FEATURE_FLAG0(numr) | KBTS__FEATURE_FLAG0(dnom) | KBTS__FEATURE_FLAG0(ccmp) | KBTS__FEATURE_FLAG0(clig) | KBTS__FEATURE_FLAG0(calt), 0ull, 0ull | KBTS__FEATURE_FLAG2(ltra) | KBTS__FEATURE_FLAG2(ltrm) | KBTS__FEATURE_FLAG2(locl) | KBTS__FEATURE_FLAG2(rlig) | KBTS__FEATURE_FLAG2(liga) | KBTS__FEATURE_FLAG2(rclt), 0ull}}}, + {7, {{0ull | KBTS__FEATURE_FLAG0(abvm) | KBTS__FEATURE_FLAG0(blwm) | KBTS__FEATURE_FLAG0(curs), 0ull, 0ull | KBTS__FEATURE_FLAG2(mark) | KBTS__FEATURE_FLAG2(mkmk) | KBTS__FEATURE_FLAG2(dist) | KBTS__FEATURE_FLAG2(kern), 0ull}}}, +}; +static kbts__op_list kbts__OpList_Default = {20, KBTS__ARRAY_LENGTH(kbts__FeatureStages_Default), kbts__FeatureStages_Default, KBTS__ARRAY_LENGTH(kbts__Ops_Default), kbts__Ops_Default}; +static kbts__op_kind kbts__Ops_Hangul[] = { + KBTS__OP_KIND_NORMALIZE, + KBTS__OP_KIND_NORMALIZE_HANGUL, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES_WITH_USER, + KBTS__OP_KIND_GPOS_METRICS, + KBTS__OP_KIND_GPOS_FEATURES, + KBTS__OP_KIND_POST_GPOS_FIXUP, +}; +static kbts__feature_stage kbts__FeatureStages_Hangul[] = { + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(rvrn)}}}, + {14, {{0ull | KBTS__FEATURE_FLAG0(frac) | KBTS__FEATURE_FLAG0(numr) | KBTS__FEATURE_FLAG0(dnom) | KBTS__FEATURE_FLAG0(ljmo) | KBTS__FEATURE_FLAG0(vjmo) | KBTS__FEATURE_FLAG0(tjmo) | KBTS__FEATURE_FLAG0(ccmp) | KBTS__FEATURE_FLAG0(clig), 0ull, 0ull | KBTS__FEATURE_FLAG2(ltra) | KBTS__FEATURE_FLAG2(ltrm) | KBTS__FEATURE_FLAG2(rlig) | KBTS__FEATURE_FLAG2(liga) | KBTS__FEATURE_FLAG2(locl) | KBTS__FEATURE_FLAG2(rclt), 0ull}}}, + {7, {{0ull | KBTS__FEATURE_FLAG0(abvm) | KBTS__FEATURE_FLAG0(blwm) | KBTS__FEATURE_FLAG0(curs), 0ull, 0ull | KBTS__FEATURE_FLAG2(mkmk) | KBTS__FEATURE_FLAG2(mark) | KBTS__FEATURE_FLAG2(dist) | KBTS__FEATURE_FLAG2(kern), 0ull}}}, +}; +static kbts__op_list kbts__OpList_Hangul = {22, KBTS__ARRAY_LENGTH(kbts__FeatureStages_Hangul), kbts__FeatureStages_Hangul, KBTS__ARRAY_LENGTH(kbts__Ops_Hangul), kbts__Ops_Hangul}; +static kbts__op_kind kbts__Ops_ArabicRclt[] = { + KBTS__OP_KIND_NORMALIZE, + KBTS__OP_KIND_FLAG_JOINING_LETTERS, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES_WITH_USER, + KBTS__OP_KIND_GPOS_METRICS, + KBTS__OP_KIND_GPOS_FEATURES, + KBTS__OP_KIND_STCH_POSTPASS, + KBTS__OP_KIND_POST_GPOS_FIXUP, +}; +static kbts__feature_stage kbts__FeatureStages_ArabicRclt[] = { + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(rvrn)}}}, + {5, {{0ull | KBTS__FEATURE_FLAG0(frac) | KBTS__FEATURE_FLAG0(numr) | KBTS__FEATURE_FLAG0(dnom), 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(rtla) | KBTS__FEATURE_FLAG3(rtlm)}}}, + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(stch)}}}, + {2, {{0ull | KBTS__FEATURE_FLAG0(ccmp), 0ull, 0ull | KBTS__FEATURE_FLAG2(locl), 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(isol), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(fina), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(fin2), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(fin3), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(medi), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(med2), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(init), 0ull, 0ull, 0ull}}}, + {1, {{0ull, 0ull, 0ull | KBTS__FEATURE_FLAG2(rlig), 0ull}}}, + {5, {{0ull | KBTS__FEATURE_FLAG0(calt) | KBTS__FEATURE_FLAG0(clig), 0ull, 0ull | KBTS__FEATURE_FLAG2(liga) | KBTS__FEATURE_FLAG2(mset) | KBTS__FEATURE_FLAG2(rclt), 0ull}}}, + {7, {{0ull | KBTS__FEATURE_FLAG0(abvm) | KBTS__FEATURE_FLAG0(blwm) | KBTS__FEATURE_FLAG0(curs), 0ull, 0ull | KBTS__FEATURE_FLAG2(mark) | KBTS__FEATURE_FLAG2(mkmk) | KBTS__FEATURE_FLAG2(dist) | KBTS__FEATURE_FLAG2(kern), 0ull}}}, +}; +static kbts__op_list kbts__OpList_ArabicRclt = {29, KBTS__ARRAY_LENGTH(kbts__FeatureStages_ArabicRclt), kbts__FeatureStages_ArabicRclt, KBTS__ARRAY_LENGTH(kbts__Ops_ArabicRclt), kbts__Ops_ArabicRclt}; +static kbts__op_kind kbts__Ops_ArabicNoRclt[] = { + KBTS__OP_KIND_NORMALIZE, + KBTS__OP_KIND_FLAG_JOINING_LETTERS, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES_WITH_USER, + KBTS__OP_KIND_GPOS_METRICS, + KBTS__OP_KIND_GPOS_FEATURES, + KBTS__OP_KIND_STCH_POSTPASS, + KBTS__OP_KIND_POST_GPOS_FIXUP, +}; +static kbts__feature_stage kbts__FeatureStages_ArabicNoRclt[] = { + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(rvrn)}}}, + {5, {{0ull | KBTS__FEATURE_FLAG0(frac) | KBTS__FEATURE_FLAG0(numr) | KBTS__FEATURE_FLAG0(dnom), 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(rtla) | KBTS__FEATURE_FLAG3(rtlm)}}}, + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(stch)}}}, + {2, {{0ull | KBTS__FEATURE_FLAG0(ccmp), 0ull, 0ull | KBTS__FEATURE_FLAG2(locl), 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(isol), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(fina), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(fin2), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(fin3), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(medi), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(med2), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(init), 0ull, 0ull, 0ull}}}, + {1, {{0ull, 0ull, 0ull | KBTS__FEATURE_FLAG2(rlig), 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(calt), 0ull, 0ull, 0ull}}}, + {3, {{0ull | KBTS__FEATURE_FLAG0(clig), 0ull, 0ull | KBTS__FEATURE_FLAG2(liga) | KBTS__FEATURE_FLAG2(mset), 0ull}}}, + {7, {{0ull | KBTS__FEATURE_FLAG0(abvm) | KBTS__FEATURE_FLAG0(blwm) | KBTS__FEATURE_FLAG0(curs), 0ull, 0ull | KBTS__FEATURE_FLAG2(mark) | KBTS__FEATURE_FLAG2(mkmk) | KBTS__FEATURE_FLAG2(dist) | KBTS__FEATURE_FLAG2(kern), 0ull}}}, +}; +static kbts__op_list kbts__OpList_ArabicNoRclt = {28, KBTS__ARRAY_LENGTH(kbts__FeatureStages_ArabicNoRclt), kbts__FeatureStages_ArabicNoRclt, KBTS__ARRAY_LENGTH(kbts__Ops_ArabicNoRclt), kbts__Ops_ArabicNoRclt}; +static kbts__op_kind kbts__Ops_Indic[] = { + KBTS__OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES, + KBTS__OP_KIND_NORMALIZE, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_BEGIN_CLUSTER, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_END_CLUSTER, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_END_SYLLABLE, + KBTS__OP_KIND_GSUB_FEATURES_WITH_USER, + KBTS__OP_KIND_GPOS_METRICS, + KBTS__OP_KIND_GPOS_FEATURES, + KBTS__OP_KIND_POST_GPOS_FIXUP, +}; +static kbts__feature_stage kbts__FeatureStages_Indic[] = { + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(rvrn)}}}, + {5, {{0ull | KBTS__FEATURE_FLAG0(frac) | KBTS__FEATURE_FLAG0(numr) | KBTS__FEATURE_FLAG0(dnom), 0ull, 0ull | KBTS__FEATURE_FLAG2(ltra) | KBTS__FEATURE_FLAG2(ltrm), 0ull}}}, + {1, {{0ull, 0ull, 0ull | KBTS__FEATURE_FLAG2(nukt), 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(akhn), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(rphf), 0ull, 0ull, 0ull}}}, + {1, {{0ull, 0ull, 0ull | KBTS__FEATURE_FLAG2(rkrf), 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(pref), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(blwf), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(abvf), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(half), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(pstf), 0ull, 0ull, 0ull}}}, + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(vatu)}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(cjct), 0ull, 0ull, 0ull}}}, + {6, {{0ull | KBTS__FEATURE_FLAG0(abvs) | KBTS__FEATURE_FLAG0(blws) | KBTS__FEATURE_FLAG0(init), 0ull, 0ull | KBTS__FEATURE_FLAG2(haln) | KBTS__FEATURE_FLAG2(pres) | KBTS__FEATURE_FLAG2(psts), 0ull}}}, + {5, {{0ull | KBTS__FEATURE_FLAG0(calt) | KBTS__FEATURE_FLAG0(clig), 0ull, 0ull | KBTS__FEATURE_FLAG2(locl) | KBTS__FEATURE_FLAG2(rlig) | KBTS__FEATURE_FLAG2(rclt), 0ull}}}, + {7, {{0ull | KBTS__FEATURE_FLAG0(abvm) | KBTS__FEATURE_FLAG0(blwm) | KBTS__FEATURE_FLAG0(curs), 0ull, 0ull | KBTS__FEATURE_FLAG2(mark) | KBTS__FEATURE_FLAG2(mkmk) | KBTS__FEATURE_FLAG2(dist) | KBTS__FEATURE_FLAG2(kern), 0ull}}}, +}; +static kbts__op_list kbts__OpList_Indic = {35, KBTS__ARRAY_LENGTH(kbts__FeatureStages_Indic), kbts__FeatureStages_Indic, KBTS__ARRAY_LENGTH(kbts__Ops_Indic), kbts__Ops_Indic}; +static kbts__op_kind kbts__Ops_Khmer[] = { + KBTS__OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES, + KBTS__OP_KIND_NORMALIZE, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_BEGIN_CLUSTER, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_END_CLUSTER, + KBTS__OP_KIND_END_SYLLABLE, + KBTS__OP_KIND_GSUB_FEATURES_WITH_USER, + KBTS__OP_KIND_GPOS_METRICS, + KBTS__OP_KIND_GPOS_FEATURES, + KBTS__OP_KIND_POST_GPOS_FIXUP, +}; +static kbts__feature_stage kbts__FeatureStages_Khmer[] = { + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(rvrn)}}}, + {5, {{0ull | KBTS__FEATURE_FLAG0(frac) | KBTS__FEATURE_FLAG0(numr) | KBTS__FEATURE_FLAG0(dnom), 0ull, 0ull | KBTS__FEATURE_FLAG2(ltra) | KBTS__FEATURE_FLAG2(ltrm), 0ull}}}, + {7, {{0ull | KBTS__FEATURE_FLAG0(ccmp) | KBTS__FEATURE_FLAG0(pref) | KBTS__FEATURE_FLAG0(blwf) | KBTS__FEATURE_FLAG0(abvf) | KBTS__FEATURE_FLAG0(pstf) | KBTS__FEATURE_FLAG0(cfar), 0ull, 0ull | KBTS__FEATURE_FLAG2(locl), 0ull}}}, + {8, {{0ull | KBTS__FEATURE_FLAG0(abvs) | KBTS__FEATURE_FLAG0(blws) | KBTS__FEATURE_FLAG0(calt) | KBTS__FEATURE_FLAG0(clig), 0ull, 0ull | KBTS__FEATURE_FLAG2(pres) | KBTS__FEATURE_FLAG2(psts) | KBTS__FEATURE_FLAG2(rclt) | KBTS__FEATURE_FLAG2(rlig), 0ull}}}, + {7, {{0ull | KBTS__FEATURE_FLAG0(abvm) | KBTS__FEATURE_FLAG0(blwm) | KBTS__FEATURE_FLAG0(curs), 0ull, 0ull | KBTS__FEATURE_FLAG2(dist) | KBTS__FEATURE_FLAG2(kern) | KBTS__FEATURE_FLAG2(mark) | KBTS__FEATURE_FLAG2(mkmk), 0ull}}}, +}; +static kbts__op_list kbts__OpList_Khmer = {28, KBTS__ARRAY_LENGTH(kbts__FeatureStages_Khmer), kbts__FeatureStages_Khmer, KBTS__ARRAY_LENGTH(kbts__Ops_Khmer), kbts__Ops_Khmer}; +static kbts__op_kind kbts__Ops_Myanmar[] = { + KBTS__OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES, + KBTS__OP_KIND_NORMALIZE, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_BEGIN_CLUSTER, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_END_CLUSTER, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_END_SYLLABLE, + KBTS__OP_KIND_GSUB_FEATURES_WITH_USER, + KBTS__OP_KIND_GPOS_METRICS, + KBTS__OP_KIND_GPOS_FEATURES, + KBTS__OP_KIND_POST_GPOS_FIXUP, +}; +static kbts__feature_stage kbts__FeatureStages_Myanmar[] = { + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(rvrn)}}}, + {5, {{0ull | KBTS__FEATURE_FLAG0(frac) | KBTS__FEATURE_FLAG0(numr) | KBTS__FEATURE_FLAG0(dnom), 0ull, 0ull | KBTS__FEATURE_FLAG2(ltra) | KBTS__FEATURE_FLAG2(ltrm), 0ull}}}, + {2, {{0ull | KBTS__FEATURE_FLAG0(ccmp), 0ull, 0ull | KBTS__FEATURE_FLAG2(locl), 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(rphf), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(pref), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(blwf), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(pstf), 0ull, 0ull, 0ull}}}, + {9, {{0ull | KBTS__FEATURE_FLAG0(abvs) | KBTS__FEATURE_FLAG0(blws) | KBTS__FEATURE_FLAG0(calt) | KBTS__FEATURE_FLAG0(clig), 0ull, 0ull | KBTS__FEATURE_FLAG2(pres) | KBTS__FEATURE_FLAG2(psts) | KBTS__FEATURE_FLAG2(rlig) | KBTS__FEATURE_FLAG2(liga) | KBTS__FEATURE_FLAG2(rclt), 0ull}}}, + {7, {{0ull | KBTS__FEATURE_FLAG0(abvm) | KBTS__FEATURE_FLAG0(blwm) | KBTS__FEATURE_FLAG0(curs), 0ull, 0ull | KBTS__FEATURE_FLAG2(dist) | KBTS__FEATURE_FLAG2(kern) | KBTS__FEATURE_FLAG2(mark) | KBTS__FEATURE_FLAG2(mkmk), 0ull}}}, +}; +static kbts__op_list kbts__OpList_Myanmar = {28, KBTS__ARRAY_LENGTH(kbts__FeatureStages_Myanmar), kbts__FeatureStages_Myanmar, KBTS__ARRAY_LENGTH(kbts__Ops_Myanmar), kbts__Ops_Myanmar}; +static kbts__op_kind kbts__Ops_Tibetan[] = { + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES_WITH_USER, + KBTS__OP_KIND_GPOS_METRICS, + KBTS__OP_KIND_GPOS_FEATURES, + KBTS__OP_KIND_POST_GPOS_FIXUP, +}; +static kbts__feature_stage kbts__FeatureStages_Tibetan[] = { + {1, {{0ull, 0ull, 0ull | KBTS__FEATURE_FLAG2(locl), 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(ccmp), 0ull, 0ull, 0ull}}}, + {4, {{0ull | KBTS__FEATURE_FLAG0(abvs) | KBTS__FEATURE_FLAG0(blws) | KBTS__FEATURE_FLAG0(calt), 0ull, 0ull | KBTS__FEATURE_FLAG2(liga), 0ull}}}, + {4, {{0ull | KBTS__FEATURE_FLAG0(abvm) | KBTS__FEATURE_FLAG0(blwm), 0ull, 0ull | KBTS__FEATURE_FLAG2(kern) | KBTS__FEATURE_FLAG2(mkmk), 0ull}}}, +}; +static kbts__op_list kbts__OpList_Tibetan = {10, KBTS__ARRAY_LENGTH(kbts__FeatureStages_Tibetan), kbts__FeatureStages_Tibetan, KBTS__ARRAY_LENGTH(kbts__Ops_Tibetan), kbts__Ops_Tibetan}; +static kbts__op_kind kbts__Ops_Use[] = { + KBTS__OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES, + KBTS__OP_KIND_NORMALIZE, + KBTS__OP_KIND_FLAG_JOINING_LETTERS, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_BEGIN_CLUSTER, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_END_CLUSTER, + KBTS__OP_KIND_END_SYLLABLE, + KBTS__OP_KIND_GSUB_FEATURES, + KBTS__OP_KIND_GSUB_FEATURES_WITH_USER, + KBTS__OP_KIND_GPOS_METRICS, + KBTS__OP_KIND_GPOS_FEATURES, + KBTS__OP_KIND_POST_GPOS_FIXUP, +}; +static kbts__feature_stage kbts__FeatureStages_Use[] = { + {1, {{0ull, 0ull, 0ull, 0ull | KBTS__FEATURE_FLAG3(rvrn)}}}, + {5, {{0ull | KBTS__FEATURE_FLAG0(frac) | KBTS__FEATURE_FLAG0(numr) | KBTS__FEATURE_FLAG0(dnom), 0ull, 0ull | KBTS__FEATURE_FLAG2(ltra) | KBTS__FEATURE_FLAG2(ltrm), 0ull}}}, + {4, {{0ull | KBTS__FEATURE_FLAG0(ccmp) | KBTS__FEATURE_FLAG0(akhn), 0ull, 0ull | KBTS__FEATURE_FLAG2(locl) | KBTS__FEATURE_FLAG2(nukt), 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(rphf), 0ull, 0ull, 0ull}}}, + {1, {{0ull | KBTS__FEATURE_FLAG0(pref), 0ull, 0ull, 0ull}}}, + {7, {{0ull | KBTS__FEATURE_FLAG0(abvf) | KBTS__FEATURE_FLAG0(blwf) | KBTS__FEATURE_FLAG0(cjct) | KBTS__FEATURE_FLAG0(half) | KBTS__FEATURE_FLAG0(pstf), 0ull, 0ull | KBTS__FEATURE_FLAG2(rkrf), 0ull | KBTS__FEATURE_FLAG3(vatu)}}}, + {4, {{0ull | KBTS__FEATURE_FLAG0(fina) | KBTS__FEATURE_FLAG0(init) | KBTS__FEATURE_FLAG0(isol) | KBTS__FEATURE_FLAG0(medi), 0ull, 0ull, 0ull}}}, + {10, {{0ull | KBTS__FEATURE_FLAG0(abvs) | KBTS__FEATURE_FLAG0(blws) | KBTS__FEATURE_FLAG0(calt) | KBTS__FEATURE_FLAG0(clig), 0ull, 0ull | KBTS__FEATURE_FLAG2(haln) | KBTS__FEATURE_FLAG2(pres) | KBTS__FEATURE_FLAG2(psts) | KBTS__FEATURE_FLAG2(liga) | KBTS__FEATURE_FLAG2(rclt) | KBTS__FEATURE_FLAG2(rlig), 0ull}}}, + {7, {{0ull | KBTS__FEATURE_FLAG0(abvm) | KBTS__FEATURE_FLAG0(blwm) | KBTS__FEATURE_FLAG0(curs), 0ull, 0ull | KBTS__FEATURE_FLAG2(dist) | KBTS__FEATURE_FLAG2(kern) | KBTS__FEATURE_FLAG2(mark) | KBTS__FEATURE_FLAG2(mkmk), 0ull}}}, +}; +static kbts__op_list kbts__OpList_Use = {40, KBTS__ARRAY_LENGTH(kbts__FeatureStages_Use), kbts__FeatureStages_Use, KBTS__ARRAY_LENGTH(kbts__Ops_Use), kbts__Ops_Use}; +#define KBTS__MAXIMUM_DECOMPOSITION_CODEPOINTS 6 +typedef struct kbts__script_properties { kbts_u32 Tag; kbts_shaper Shaper; -} kbts_script_properties; +} kbts__script_properties; -static kbts_script_properties kbts_ScriptProperties[KBTS_SCRIPT_COUNT] = { +static kbts__script_properties kbts__ScriptProperties[KBTS_SCRIPT_COUNT] = { {KBTS_FOURCC(' ', ' ', ' ', ' '), KBTS_SHAPER_DEFAULT}, {KBTS_FOURCC('a', 'd', 'l', 'm'), KBTS_SHAPER_USE}, {KBTS_FOURCC('a', 'h', 'o', 'm'), KBTS_SHAPER_USE}, @@ -3311,261 +4804,261 @@ KBTS_EXPORT kbts_script kbts_ScriptTagToScript(kbts_script_tag Tag) return Result; } -KBTS_EXPORT kbts_feature_id kbts_FeatureTagToId(kbts_feature_tag Tag) +static kbts__feature_id kbts__FeatureTagToId(kbts_feature_tag Tag) { - kbts_feature_id Result = 0; + kbts__feature_id Result = 0; switch(Tag) { - case KBTS_FEATURE_TAG_isol: Result = KBTS_FEATURE_ID_isol; break; - case KBTS_FEATURE_TAG_fina: Result = KBTS_FEATURE_ID_fina; break; - case KBTS_FEATURE_TAG_fin2: Result = KBTS_FEATURE_ID_fin2; break; - case KBTS_FEATURE_TAG_fin3: Result = KBTS_FEATURE_ID_fin3; break; - case KBTS_FEATURE_TAG_medi: Result = KBTS_FEATURE_ID_medi; break; - case KBTS_FEATURE_TAG_med2: Result = KBTS_FEATURE_ID_med2; break; - case KBTS_FEATURE_TAG_init: Result = KBTS_FEATURE_ID_init; break; - case KBTS_FEATURE_TAG_ljmo: Result = KBTS_FEATURE_ID_ljmo; break; - case KBTS_FEATURE_TAG_vjmo: Result = KBTS_FEATURE_ID_vjmo; break; - case KBTS_FEATURE_TAG_tjmo: Result = KBTS_FEATURE_ID_tjmo; break; - case KBTS_FEATURE_TAG_rphf: Result = KBTS_FEATURE_ID_rphf; break; - case KBTS_FEATURE_TAG_blwf: Result = KBTS_FEATURE_ID_blwf; break; - case KBTS_FEATURE_TAG_half: Result = KBTS_FEATURE_ID_half; break; - case KBTS_FEATURE_TAG_pstf: Result = KBTS_FEATURE_ID_pstf; break; - case KBTS_FEATURE_TAG_abvf: Result = KBTS_FEATURE_ID_abvf; break; - case KBTS_FEATURE_TAG_pref: Result = KBTS_FEATURE_ID_pref; break; - case KBTS_FEATURE_TAG_numr: Result = KBTS_FEATURE_ID_numr; break; - case KBTS_FEATURE_TAG_frac: Result = KBTS_FEATURE_ID_frac; break; - case KBTS_FEATURE_TAG_dnom: Result = KBTS_FEATURE_ID_dnom; break; - case KBTS_FEATURE_TAG_cfar: Result = KBTS_FEATURE_ID_cfar; break; - case KBTS_FEATURE_TAG_aalt: Result = KBTS_FEATURE_ID_aalt; break; - case KBTS_FEATURE_TAG_abvm: Result = KBTS_FEATURE_ID_abvm; break; - case KBTS_FEATURE_TAG_abvs: Result = KBTS_FEATURE_ID_abvs; break; - case KBTS_FEATURE_TAG_afrc: Result = KBTS_FEATURE_ID_afrc; break; - case KBTS_FEATURE_TAG_akhn: Result = KBTS_FEATURE_ID_akhn; break; - case KBTS_FEATURE_TAG_apkn: Result = KBTS_FEATURE_ID_apkn; break; - case KBTS_FEATURE_TAG_blwm: Result = KBTS_FEATURE_ID_blwm; break; - case KBTS_FEATURE_TAG_blws: Result = KBTS_FEATURE_ID_blws; break; - case KBTS_FEATURE_TAG_calt: Result = KBTS_FEATURE_ID_calt; break; - case KBTS_FEATURE_TAG_case: Result = KBTS_FEATURE_ID_case; break; - case KBTS_FEATURE_TAG_ccmp: Result = KBTS_FEATURE_ID_ccmp; break; - case KBTS_FEATURE_TAG_chws: Result = KBTS_FEATURE_ID_chws; break; - case KBTS_FEATURE_TAG_cjct: Result = KBTS_FEATURE_ID_cjct; break; - case KBTS_FEATURE_TAG_clig: Result = KBTS_FEATURE_ID_clig; break; - case KBTS_FEATURE_TAG_cpct: Result = KBTS_FEATURE_ID_cpct; break; - case KBTS_FEATURE_TAG_cpsp: Result = KBTS_FEATURE_ID_cpsp; break; - case KBTS_FEATURE_TAG_cswh: Result = KBTS_FEATURE_ID_cswh; break; - case KBTS_FEATURE_TAG_curs: Result = KBTS_FEATURE_ID_curs; break; - case KBTS_FEATURE_TAG_cv01: Result = KBTS_FEATURE_ID_cv01; break; - case KBTS_FEATURE_TAG_cv02: Result = KBTS_FEATURE_ID_cv02; break; - case KBTS_FEATURE_TAG_cv03: Result = KBTS_FEATURE_ID_cv03; break; - case KBTS_FEATURE_TAG_cv04: Result = KBTS_FEATURE_ID_cv04; break; - case KBTS_FEATURE_TAG_cv05: Result = KBTS_FEATURE_ID_cv05; break; - case KBTS_FEATURE_TAG_cv06: Result = KBTS_FEATURE_ID_cv06; break; - case KBTS_FEATURE_TAG_cv07: Result = KBTS_FEATURE_ID_cv07; break; - case KBTS_FEATURE_TAG_cv08: Result = KBTS_FEATURE_ID_cv08; break; - case KBTS_FEATURE_TAG_cv09: Result = KBTS_FEATURE_ID_cv09; break; - case KBTS_FEATURE_TAG_cv10: Result = KBTS_FEATURE_ID_cv10; break; - case KBTS_FEATURE_TAG_cv11: Result = KBTS_FEATURE_ID_cv11; break; - case KBTS_FEATURE_TAG_cv12: Result = KBTS_FEATURE_ID_cv12; break; - case KBTS_FEATURE_TAG_cv13: Result = KBTS_FEATURE_ID_cv13; break; - case KBTS_FEATURE_TAG_cv14: Result = KBTS_FEATURE_ID_cv14; break; - case KBTS_FEATURE_TAG_cv15: Result = KBTS_FEATURE_ID_cv15; break; - case KBTS_FEATURE_TAG_cv16: Result = KBTS_FEATURE_ID_cv16; break; - case KBTS_FEATURE_TAG_cv17: Result = KBTS_FEATURE_ID_cv17; break; - case KBTS_FEATURE_TAG_cv18: Result = KBTS_FEATURE_ID_cv18; break; - case KBTS_FEATURE_TAG_cv19: Result = KBTS_FEATURE_ID_cv19; break; - case KBTS_FEATURE_TAG_cv20: Result = KBTS_FEATURE_ID_cv20; break; - case KBTS_FEATURE_TAG_cv21: Result = KBTS_FEATURE_ID_cv21; break; - case KBTS_FEATURE_TAG_cv22: Result = KBTS_FEATURE_ID_cv22; break; - case KBTS_FEATURE_TAG_cv23: Result = KBTS_FEATURE_ID_cv23; break; - case KBTS_FEATURE_TAG_cv24: Result = KBTS_FEATURE_ID_cv24; break; - case KBTS_FEATURE_TAG_cv25: Result = KBTS_FEATURE_ID_cv25; break; - case KBTS_FEATURE_TAG_cv26: Result = KBTS_FEATURE_ID_cv26; break; - case KBTS_FEATURE_TAG_cv27: Result = KBTS_FEATURE_ID_cv27; break; - case KBTS_FEATURE_TAG_cv28: Result = KBTS_FEATURE_ID_cv28; break; - case KBTS_FEATURE_TAG_cv29: Result = KBTS_FEATURE_ID_cv29; break; - case KBTS_FEATURE_TAG_cv30: Result = KBTS_FEATURE_ID_cv30; break; - case KBTS_FEATURE_TAG_cv31: Result = KBTS_FEATURE_ID_cv31; break; - case KBTS_FEATURE_TAG_cv32: Result = KBTS_FEATURE_ID_cv32; break; - case KBTS_FEATURE_TAG_cv33: Result = KBTS_FEATURE_ID_cv33; break; - case KBTS_FEATURE_TAG_cv34: Result = KBTS_FEATURE_ID_cv34; break; - case KBTS_FEATURE_TAG_cv35: Result = KBTS_FEATURE_ID_cv35; break; - case KBTS_FEATURE_TAG_cv36: Result = KBTS_FEATURE_ID_cv36; break; - case KBTS_FEATURE_TAG_cv37: Result = KBTS_FEATURE_ID_cv37; break; - case KBTS_FEATURE_TAG_cv38: Result = KBTS_FEATURE_ID_cv38; break; - case KBTS_FEATURE_TAG_cv39: Result = KBTS_FEATURE_ID_cv39; break; - case KBTS_FEATURE_TAG_cv40: Result = KBTS_FEATURE_ID_cv40; break; - case KBTS_FEATURE_TAG_cv41: Result = KBTS_FEATURE_ID_cv41; break; - case KBTS_FEATURE_TAG_cv42: Result = KBTS_FEATURE_ID_cv42; break; - case KBTS_FEATURE_TAG_cv43: Result = KBTS_FEATURE_ID_cv43; break; - case KBTS_FEATURE_TAG_cv44: Result = KBTS_FEATURE_ID_cv44; break; - case KBTS_FEATURE_TAG_cv45: Result = KBTS_FEATURE_ID_cv45; break; - case KBTS_FEATURE_TAG_cv46: Result = KBTS_FEATURE_ID_cv46; break; - case KBTS_FEATURE_TAG_cv47: Result = KBTS_FEATURE_ID_cv47; break; - case KBTS_FEATURE_TAG_cv48: Result = KBTS_FEATURE_ID_cv48; break; - case KBTS_FEATURE_TAG_cv49: Result = KBTS_FEATURE_ID_cv49; break; - case KBTS_FEATURE_TAG_cv50: Result = KBTS_FEATURE_ID_cv50; break; - case KBTS_FEATURE_TAG_cv51: Result = KBTS_FEATURE_ID_cv51; break; - case KBTS_FEATURE_TAG_cv52: Result = KBTS_FEATURE_ID_cv52; break; - case KBTS_FEATURE_TAG_cv53: Result = KBTS_FEATURE_ID_cv53; break; - case KBTS_FEATURE_TAG_cv54: Result = KBTS_FEATURE_ID_cv54; break; - case KBTS_FEATURE_TAG_cv55: Result = KBTS_FEATURE_ID_cv55; break; - case KBTS_FEATURE_TAG_cv56: Result = KBTS_FEATURE_ID_cv56; break; - case KBTS_FEATURE_TAG_cv57: Result = KBTS_FEATURE_ID_cv57; break; - case KBTS_FEATURE_TAG_cv58: Result = KBTS_FEATURE_ID_cv58; break; - case KBTS_FEATURE_TAG_cv59: Result = KBTS_FEATURE_ID_cv59; break; - case KBTS_FEATURE_TAG_cv60: Result = KBTS_FEATURE_ID_cv60; break; - case KBTS_FEATURE_TAG_cv61: Result = KBTS_FEATURE_ID_cv61; break; - case KBTS_FEATURE_TAG_cv62: Result = KBTS_FEATURE_ID_cv62; break; - case KBTS_FEATURE_TAG_cv63: Result = KBTS_FEATURE_ID_cv63; break; - case KBTS_FEATURE_TAG_cv64: Result = KBTS_FEATURE_ID_cv64; break; - case KBTS_FEATURE_TAG_cv65: Result = KBTS_FEATURE_ID_cv65; break; - case KBTS_FEATURE_TAG_cv66: Result = KBTS_FEATURE_ID_cv66; break; - case KBTS_FEATURE_TAG_cv67: Result = KBTS_FEATURE_ID_cv67; break; - case KBTS_FEATURE_TAG_cv68: Result = KBTS_FEATURE_ID_cv68; break; - case KBTS_FEATURE_TAG_cv69: Result = KBTS_FEATURE_ID_cv69; break; - case KBTS_FEATURE_TAG_cv70: Result = KBTS_FEATURE_ID_cv70; break; - case KBTS_FEATURE_TAG_cv71: Result = KBTS_FEATURE_ID_cv71; break; - case KBTS_FEATURE_TAG_cv72: Result = KBTS_FEATURE_ID_cv72; break; - case KBTS_FEATURE_TAG_cv73: Result = KBTS_FEATURE_ID_cv73; break; - case KBTS_FEATURE_TAG_cv74: Result = KBTS_FEATURE_ID_cv74; break; - case KBTS_FEATURE_TAG_cv75: Result = KBTS_FEATURE_ID_cv75; break; - case KBTS_FEATURE_TAG_cv76: Result = KBTS_FEATURE_ID_cv76; break; - case KBTS_FEATURE_TAG_cv77: Result = KBTS_FEATURE_ID_cv77; break; - case KBTS_FEATURE_TAG_cv78: Result = KBTS_FEATURE_ID_cv78; break; - case KBTS_FEATURE_TAG_cv79: Result = KBTS_FEATURE_ID_cv79; break; - case KBTS_FEATURE_TAG_cv80: Result = KBTS_FEATURE_ID_cv80; break; - case KBTS_FEATURE_TAG_cv81: Result = KBTS_FEATURE_ID_cv81; break; - case KBTS_FEATURE_TAG_cv82: Result = KBTS_FEATURE_ID_cv82; break; - case KBTS_FEATURE_TAG_cv83: Result = KBTS_FEATURE_ID_cv83; break; - case KBTS_FEATURE_TAG_cv84: Result = KBTS_FEATURE_ID_cv84; break; - case KBTS_FEATURE_TAG_cv85: Result = KBTS_FEATURE_ID_cv85; break; - case KBTS_FEATURE_TAG_cv86: Result = KBTS_FEATURE_ID_cv86; break; - case KBTS_FEATURE_TAG_cv87: Result = KBTS_FEATURE_ID_cv87; break; - case KBTS_FEATURE_TAG_cv88: Result = KBTS_FEATURE_ID_cv88; break; - case KBTS_FEATURE_TAG_cv89: Result = KBTS_FEATURE_ID_cv89; break; - case KBTS_FEATURE_TAG_cv90: Result = KBTS_FEATURE_ID_cv90; break; - case KBTS_FEATURE_TAG_cv91: Result = KBTS_FEATURE_ID_cv91; break; - case KBTS_FEATURE_TAG_cv92: Result = KBTS_FEATURE_ID_cv92; break; - case KBTS_FEATURE_TAG_cv93: Result = KBTS_FEATURE_ID_cv93; break; - case KBTS_FEATURE_TAG_cv94: Result = KBTS_FEATURE_ID_cv94; break; - case KBTS_FEATURE_TAG_cv95: Result = KBTS_FEATURE_ID_cv95; break; - case KBTS_FEATURE_TAG_cv96: Result = KBTS_FEATURE_ID_cv96; break; - case KBTS_FEATURE_TAG_cv97: Result = KBTS_FEATURE_ID_cv97; break; - case KBTS_FEATURE_TAG_cv98: Result = KBTS_FEATURE_ID_cv98; break; - case KBTS_FEATURE_TAG_cv99: Result = KBTS_FEATURE_ID_cv99; break; - case KBTS_FEATURE_TAG_c2pc: Result = KBTS_FEATURE_ID_c2pc; break; - case KBTS_FEATURE_TAG_c2sc: Result = KBTS_FEATURE_ID_c2sc; break; - case KBTS_FEATURE_TAG_dist: Result = KBTS_FEATURE_ID_dist; break; - case KBTS_FEATURE_TAG_dlig: Result = KBTS_FEATURE_ID_dlig; break; - case KBTS_FEATURE_TAG_dtls: Result = KBTS_FEATURE_ID_dtls; break; - case KBTS_FEATURE_TAG_expt: Result = KBTS_FEATURE_ID_expt; break; - case KBTS_FEATURE_TAG_falt: Result = KBTS_FEATURE_ID_falt; break; - case KBTS_FEATURE_TAG_flac: Result = KBTS_FEATURE_ID_flac; break; - case KBTS_FEATURE_TAG_fwid: Result = KBTS_FEATURE_ID_fwid; break; - case KBTS_FEATURE_TAG_haln: Result = KBTS_FEATURE_ID_haln; break; - case KBTS_FEATURE_TAG_halt: Result = KBTS_FEATURE_ID_halt; break; - case KBTS_FEATURE_TAG_hist: Result = KBTS_FEATURE_ID_hist; break; - case KBTS_FEATURE_TAG_hkna: Result = KBTS_FEATURE_ID_hkna; break; - case KBTS_FEATURE_TAG_hlig: Result = KBTS_FEATURE_ID_hlig; break; - case KBTS_FEATURE_TAG_hngl: Result = KBTS_FEATURE_ID_hngl; break; - case KBTS_FEATURE_TAG_hojo: Result = KBTS_FEATURE_ID_hojo; break; - case KBTS_FEATURE_TAG_hwid: Result = KBTS_FEATURE_ID_hwid; break; - case KBTS_FEATURE_TAG_ital: Result = KBTS_FEATURE_ID_ital; break; - case KBTS_FEATURE_TAG_jalt: Result = KBTS_FEATURE_ID_jalt; break; - case KBTS_FEATURE_TAG_jp78: Result = KBTS_FEATURE_ID_jp78; break; - case KBTS_FEATURE_TAG_jp83: Result = KBTS_FEATURE_ID_jp83; break; - case KBTS_FEATURE_TAG_jp90: Result = KBTS_FEATURE_ID_jp90; break; - case KBTS_FEATURE_TAG_jp04: Result = KBTS_FEATURE_ID_jp04; break; - case KBTS_FEATURE_TAG_kern: Result = KBTS_FEATURE_ID_kern; break; - case KBTS_FEATURE_TAG_lfbd: Result = KBTS_FEATURE_ID_lfbd; break; - case KBTS_FEATURE_TAG_liga: Result = KBTS_FEATURE_ID_liga; break; - case KBTS_FEATURE_TAG_lnum: Result = KBTS_FEATURE_ID_lnum; break; - case KBTS_FEATURE_TAG_locl: Result = KBTS_FEATURE_ID_locl; break; - case KBTS_FEATURE_TAG_ltra: Result = KBTS_FEATURE_ID_ltra; break; - case KBTS_FEATURE_TAG_ltrm: Result = KBTS_FEATURE_ID_ltrm; break; - case KBTS_FEATURE_TAG_mark: Result = KBTS_FEATURE_ID_mark; break; - case KBTS_FEATURE_TAG_mgrk: Result = KBTS_FEATURE_ID_mgrk; break; - case KBTS_FEATURE_TAG_mkmk: Result = KBTS_FEATURE_ID_mkmk; break; - case KBTS_FEATURE_TAG_mset: Result = KBTS_FEATURE_ID_mset; break; - case KBTS_FEATURE_TAG_nalt: Result = KBTS_FEATURE_ID_nalt; break; - case KBTS_FEATURE_TAG_nlck: Result = KBTS_FEATURE_ID_nlck; break; - case KBTS_FEATURE_TAG_nukt: Result = KBTS_FEATURE_ID_nukt; break; - case KBTS_FEATURE_TAG_onum: Result = KBTS_FEATURE_ID_onum; break; - case KBTS_FEATURE_TAG_opbd: Result = KBTS_FEATURE_ID_opbd; break; - case KBTS_FEATURE_TAG_ordn: Result = KBTS_FEATURE_ID_ordn; break; - case KBTS_FEATURE_TAG_ornm: Result = KBTS_FEATURE_ID_ornm; break; - case KBTS_FEATURE_TAG_palt: Result = KBTS_FEATURE_ID_palt; break; - case KBTS_FEATURE_TAG_pcap: Result = KBTS_FEATURE_ID_pcap; break; - case KBTS_FEATURE_TAG_pkna: Result = KBTS_FEATURE_ID_pkna; break; - case KBTS_FEATURE_TAG_pnum: Result = KBTS_FEATURE_ID_pnum; break; - case KBTS_FEATURE_TAG_pres: Result = KBTS_FEATURE_ID_pres; break; - case KBTS_FEATURE_TAG_psts: Result = KBTS_FEATURE_ID_psts; break; - case KBTS_FEATURE_TAG_pwid: Result = KBTS_FEATURE_ID_pwid; break; - case KBTS_FEATURE_TAG_qwid: Result = KBTS_FEATURE_ID_qwid; break; - case KBTS_FEATURE_TAG_rand: Result = KBTS_FEATURE_ID_rand; break; - case KBTS_FEATURE_TAG_rclt: Result = KBTS_FEATURE_ID_rclt; break; - case KBTS_FEATURE_TAG_rkrf: Result = KBTS_FEATURE_ID_rkrf; break; - case KBTS_FEATURE_TAG_rlig: Result = KBTS_FEATURE_ID_rlig; break; - case KBTS_FEATURE_TAG_rtbd: Result = KBTS_FEATURE_ID_rtbd; break; - case KBTS_FEATURE_TAG_rtla: Result = KBTS_FEATURE_ID_rtla; break; - case KBTS_FEATURE_TAG_rtlm: Result = KBTS_FEATURE_ID_rtlm; break; - case KBTS_FEATURE_TAG_ruby: Result = KBTS_FEATURE_ID_ruby; break; - case KBTS_FEATURE_TAG_rvrn: Result = KBTS_FEATURE_ID_rvrn; break; - case KBTS_FEATURE_TAG_salt: Result = KBTS_FEATURE_ID_salt; break; - case KBTS_FEATURE_TAG_sinf: Result = KBTS_FEATURE_ID_sinf; break; - case KBTS_FEATURE_TAG_size: Result = KBTS_FEATURE_ID_size; break; - case KBTS_FEATURE_TAG_smcp: Result = KBTS_FEATURE_ID_smcp; break; - case KBTS_FEATURE_TAG_smpl: Result = KBTS_FEATURE_ID_smpl; break; - case KBTS_FEATURE_TAG_ss01: Result = KBTS_FEATURE_ID_ss01; break; - case KBTS_FEATURE_TAG_ss02: Result = KBTS_FEATURE_ID_ss02; break; - case KBTS_FEATURE_TAG_ss03: Result = KBTS_FEATURE_ID_ss03; break; - case KBTS_FEATURE_TAG_ss04: Result = KBTS_FEATURE_ID_ss04; break; - case KBTS_FEATURE_TAG_ss05: Result = KBTS_FEATURE_ID_ss05; break; - case KBTS_FEATURE_TAG_ss06: Result = KBTS_FEATURE_ID_ss06; break; - case KBTS_FEATURE_TAG_ss07: Result = KBTS_FEATURE_ID_ss07; break; - case KBTS_FEATURE_TAG_ss08: Result = KBTS_FEATURE_ID_ss08; break; - case KBTS_FEATURE_TAG_ss09: Result = KBTS_FEATURE_ID_ss09; break; - case KBTS_FEATURE_TAG_ss10: Result = KBTS_FEATURE_ID_ss10; break; - case KBTS_FEATURE_TAG_ss11: Result = KBTS_FEATURE_ID_ss11; break; - case KBTS_FEATURE_TAG_ss12: Result = KBTS_FEATURE_ID_ss12; break; - case KBTS_FEATURE_TAG_ss13: Result = KBTS_FEATURE_ID_ss13; break; - case KBTS_FEATURE_TAG_ss14: Result = KBTS_FEATURE_ID_ss14; break; - case KBTS_FEATURE_TAG_ss15: Result = KBTS_FEATURE_ID_ss15; break; - case KBTS_FEATURE_TAG_ss16: Result = KBTS_FEATURE_ID_ss16; break; - case KBTS_FEATURE_TAG_ss17: Result = KBTS_FEATURE_ID_ss17; break; - case KBTS_FEATURE_TAG_ss18: Result = KBTS_FEATURE_ID_ss18; break; - case KBTS_FEATURE_TAG_ss19: Result = KBTS_FEATURE_ID_ss19; break; - case KBTS_FEATURE_TAG_ss20: Result = KBTS_FEATURE_ID_ss20; break; - case KBTS_FEATURE_TAG_ssty: Result = KBTS_FEATURE_ID_ssty; break; - case KBTS_FEATURE_TAG_stch: Result = KBTS_FEATURE_ID_stch; break; - case KBTS_FEATURE_TAG_subs: Result = KBTS_FEATURE_ID_subs; break; - case KBTS_FEATURE_TAG_sups: Result = KBTS_FEATURE_ID_sups; break; - case KBTS_FEATURE_TAG_swsh: Result = KBTS_FEATURE_ID_swsh; break; - case KBTS_FEATURE_TAG_test: Result = KBTS_FEATURE_ID_test; break; - case KBTS_FEATURE_TAG_titl: Result = KBTS_FEATURE_ID_titl; break; - case KBTS_FEATURE_TAG_tnam: Result = KBTS_FEATURE_ID_tnam; break; - case KBTS_FEATURE_TAG_tnum: Result = KBTS_FEATURE_ID_tnum; break; - case KBTS_FEATURE_TAG_trad: Result = KBTS_FEATURE_ID_trad; break; - case KBTS_FEATURE_TAG_twid: Result = KBTS_FEATURE_ID_twid; break; - case KBTS_FEATURE_TAG_unic: Result = KBTS_FEATURE_ID_unic; break; - case KBTS_FEATURE_TAG_valt: Result = KBTS_FEATURE_ID_valt; break; - case KBTS_FEATURE_TAG_vapk: Result = KBTS_FEATURE_ID_vapk; break; - case KBTS_FEATURE_TAG_vatu: Result = KBTS_FEATURE_ID_vatu; break; - case KBTS_FEATURE_TAG_vchw: Result = KBTS_FEATURE_ID_vchw; break; - case KBTS_FEATURE_TAG_vert: Result = KBTS_FEATURE_ID_vert; break; - case KBTS_FEATURE_TAG_vhal: Result = KBTS_FEATURE_ID_vhal; break; - case KBTS_FEATURE_TAG_vkna: Result = KBTS_FEATURE_ID_vkna; break; - case KBTS_FEATURE_TAG_vkrn: Result = KBTS_FEATURE_ID_vkrn; break; - case KBTS_FEATURE_TAG_vpal: Result = KBTS_FEATURE_ID_vpal; break; - case KBTS_FEATURE_TAG_vrt2: Result = KBTS_FEATURE_ID_vrt2; break; - case KBTS_FEATURE_TAG_vrtr: Result = KBTS_FEATURE_ID_vrtr; break; - case KBTS_FEATURE_TAG_zero: Result = KBTS_FEATURE_ID_zero; break; + case KBTS_FEATURE_TAG_isol: Result = KBTS__FEATURE_ID_isol; break; + case KBTS_FEATURE_TAG_fina: Result = KBTS__FEATURE_ID_fina; break; + case KBTS_FEATURE_TAG_fin2: Result = KBTS__FEATURE_ID_fin2; break; + case KBTS_FEATURE_TAG_fin3: Result = KBTS__FEATURE_ID_fin3; break; + case KBTS_FEATURE_TAG_medi: Result = KBTS__FEATURE_ID_medi; break; + case KBTS_FEATURE_TAG_med2: Result = KBTS__FEATURE_ID_med2; break; + case KBTS_FEATURE_TAG_init: Result = KBTS__FEATURE_ID_init; break; + case KBTS_FEATURE_TAG_ljmo: Result = KBTS__FEATURE_ID_ljmo; break; + case KBTS_FEATURE_TAG_vjmo: Result = KBTS__FEATURE_ID_vjmo; break; + case KBTS_FEATURE_TAG_tjmo: Result = KBTS__FEATURE_ID_tjmo; break; + case KBTS_FEATURE_TAG_rphf: Result = KBTS__FEATURE_ID_rphf; break; + case KBTS_FEATURE_TAG_blwf: Result = KBTS__FEATURE_ID_blwf; break; + case KBTS_FEATURE_TAG_half: Result = KBTS__FEATURE_ID_half; break; + case KBTS_FEATURE_TAG_pstf: Result = KBTS__FEATURE_ID_pstf; break; + case KBTS_FEATURE_TAG_abvf: Result = KBTS__FEATURE_ID_abvf; break; + case KBTS_FEATURE_TAG_pref: Result = KBTS__FEATURE_ID_pref; break; + case KBTS_FEATURE_TAG_numr: Result = KBTS__FEATURE_ID_numr; break; + case KBTS_FEATURE_TAG_frac: Result = KBTS__FEATURE_ID_frac; break; + case KBTS_FEATURE_TAG_dnom: Result = KBTS__FEATURE_ID_dnom; break; + case KBTS_FEATURE_TAG_cfar: Result = KBTS__FEATURE_ID_cfar; break; + case KBTS_FEATURE_TAG_aalt: Result = KBTS__FEATURE_ID_aalt; break; + case KBTS_FEATURE_TAG_abvm: Result = KBTS__FEATURE_ID_abvm; break; + case KBTS_FEATURE_TAG_abvs: Result = KBTS__FEATURE_ID_abvs; break; + case KBTS_FEATURE_TAG_afrc: Result = KBTS__FEATURE_ID_afrc; break; + case KBTS_FEATURE_TAG_akhn: Result = KBTS__FEATURE_ID_akhn; break; + case KBTS_FEATURE_TAG_apkn: Result = KBTS__FEATURE_ID_apkn; break; + case KBTS_FEATURE_TAG_blwm: Result = KBTS__FEATURE_ID_blwm; break; + case KBTS_FEATURE_TAG_blws: Result = KBTS__FEATURE_ID_blws; break; + case KBTS_FEATURE_TAG_calt: Result = KBTS__FEATURE_ID_calt; break; + case KBTS_FEATURE_TAG_case: Result = KBTS__FEATURE_ID_case; break; + case KBTS_FEATURE_TAG_ccmp: Result = KBTS__FEATURE_ID_ccmp; break; + case KBTS_FEATURE_TAG_chws: Result = KBTS__FEATURE_ID_chws; break; + case KBTS_FEATURE_TAG_cjct: Result = KBTS__FEATURE_ID_cjct; break; + case KBTS_FEATURE_TAG_clig: Result = KBTS__FEATURE_ID_clig; break; + case KBTS_FEATURE_TAG_cpct: Result = KBTS__FEATURE_ID_cpct; break; + case KBTS_FEATURE_TAG_cpsp: Result = KBTS__FEATURE_ID_cpsp; break; + case KBTS_FEATURE_TAG_cswh: Result = KBTS__FEATURE_ID_cswh; break; + case KBTS_FEATURE_TAG_curs: Result = KBTS__FEATURE_ID_curs; break; + case KBTS_FEATURE_TAG_cv01: Result = KBTS__FEATURE_ID_cv01; break; + case KBTS_FEATURE_TAG_cv02: Result = KBTS__FEATURE_ID_cv02; break; + case KBTS_FEATURE_TAG_cv03: Result = KBTS__FEATURE_ID_cv03; break; + case KBTS_FEATURE_TAG_cv04: Result = KBTS__FEATURE_ID_cv04; break; + case KBTS_FEATURE_TAG_cv05: Result = KBTS__FEATURE_ID_cv05; break; + case KBTS_FEATURE_TAG_cv06: Result = KBTS__FEATURE_ID_cv06; break; + case KBTS_FEATURE_TAG_cv07: Result = KBTS__FEATURE_ID_cv07; break; + case KBTS_FEATURE_TAG_cv08: Result = KBTS__FEATURE_ID_cv08; break; + case KBTS_FEATURE_TAG_cv09: Result = KBTS__FEATURE_ID_cv09; break; + case KBTS_FEATURE_TAG_cv10: Result = KBTS__FEATURE_ID_cv10; break; + case KBTS_FEATURE_TAG_cv11: Result = KBTS__FEATURE_ID_cv11; break; + case KBTS_FEATURE_TAG_cv12: Result = KBTS__FEATURE_ID_cv12; break; + case KBTS_FEATURE_TAG_cv13: Result = KBTS__FEATURE_ID_cv13; break; + case KBTS_FEATURE_TAG_cv14: Result = KBTS__FEATURE_ID_cv14; break; + case KBTS_FEATURE_TAG_cv15: Result = KBTS__FEATURE_ID_cv15; break; + case KBTS_FEATURE_TAG_cv16: Result = KBTS__FEATURE_ID_cv16; break; + case KBTS_FEATURE_TAG_cv17: Result = KBTS__FEATURE_ID_cv17; break; + case KBTS_FEATURE_TAG_cv18: Result = KBTS__FEATURE_ID_cv18; break; + case KBTS_FEATURE_TAG_cv19: Result = KBTS__FEATURE_ID_cv19; break; + case KBTS_FEATURE_TAG_cv20: Result = KBTS__FEATURE_ID_cv20; break; + case KBTS_FEATURE_TAG_cv21: Result = KBTS__FEATURE_ID_cv21; break; + case KBTS_FEATURE_TAG_cv22: Result = KBTS__FEATURE_ID_cv22; break; + case KBTS_FEATURE_TAG_cv23: Result = KBTS__FEATURE_ID_cv23; break; + case KBTS_FEATURE_TAG_cv24: Result = KBTS__FEATURE_ID_cv24; break; + case KBTS_FEATURE_TAG_cv25: Result = KBTS__FEATURE_ID_cv25; break; + case KBTS_FEATURE_TAG_cv26: Result = KBTS__FEATURE_ID_cv26; break; + case KBTS_FEATURE_TAG_cv27: Result = KBTS__FEATURE_ID_cv27; break; + case KBTS_FEATURE_TAG_cv28: Result = KBTS__FEATURE_ID_cv28; break; + case KBTS_FEATURE_TAG_cv29: Result = KBTS__FEATURE_ID_cv29; break; + case KBTS_FEATURE_TAG_cv30: Result = KBTS__FEATURE_ID_cv30; break; + case KBTS_FEATURE_TAG_cv31: Result = KBTS__FEATURE_ID_cv31; break; + case KBTS_FEATURE_TAG_cv32: Result = KBTS__FEATURE_ID_cv32; break; + case KBTS_FEATURE_TAG_cv33: Result = KBTS__FEATURE_ID_cv33; break; + case KBTS_FEATURE_TAG_cv34: Result = KBTS__FEATURE_ID_cv34; break; + case KBTS_FEATURE_TAG_cv35: Result = KBTS__FEATURE_ID_cv35; break; + case KBTS_FEATURE_TAG_cv36: Result = KBTS__FEATURE_ID_cv36; break; + case KBTS_FEATURE_TAG_cv37: Result = KBTS__FEATURE_ID_cv37; break; + case KBTS_FEATURE_TAG_cv38: Result = KBTS__FEATURE_ID_cv38; break; + case KBTS_FEATURE_TAG_cv39: Result = KBTS__FEATURE_ID_cv39; break; + case KBTS_FEATURE_TAG_cv40: Result = KBTS__FEATURE_ID_cv40; break; + case KBTS_FEATURE_TAG_cv41: Result = KBTS__FEATURE_ID_cv41; break; + case KBTS_FEATURE_TAG_cv42: Result = KBTS__FEATURE_ID_cv42; break; + case KBTS_FEATURE_TAG_cv43: Result = KBTS__FEATURE_ID_cv43; break; + case KBTS_FEATURE_TAG_cv44: Result = KBTS__FEATURE_ID_cv44; break; + case KBTS_FEATURE_TAG_cv45: Result = KBTS__FEATURE_ID_cv45; break; + case KBTS_FEATURE_TAG_cv46: Result = KBTS__FEATURE_ID_cv46; break; + case KBTS_FEATURE_TAG_cv47: Result = KBTS__FEATURE_ID_cv47; break; + case KBTS_FEATURE_TAG_cv48: Result = KBTS__FEATURE_ID_cv48; break; + case KBTS_FEATURE_TAG_cv49: Result = KBTS__FEATURE_ID_cv49; break; + case KBTS_FEATURE_TAG_cv50: Result = KBTS__FEATURE_ID_cv50; break; + case KBTS_FEATURE_TAG_cv51: Result = KBTS__FEATURE_ID_cv51; break; + case KBTS_FEATURE_TAG_cv52: Result = KBTS__FEATURE_ID_cv52; break; + case KBTS_FEATURE_TAG_cv53: Result = KBTS__FEATURE_ID_cv53; break; + case KBTS_FEATURE_TAG_cv54: Result = KBTS__FEATURE_ID_cv54; break; + case KBTS_FEATURE_TAG_cv55: Result = KBTS__FEATURE_ID_cv55; break; + case KBTS_FEATURE_TAG_cv56: Result = KBTS__FEATURE_ID_cv56; break; + case KBTS_FEATURE_TAG_cv57: Result = KBTS__FEATURE_ID_cv57; break; + case KBTS_FEATURE_TAG_cv58: Result = KBTS__FEATURE_ID_cv58; break; + case KBTS_FEATURE_TAG_cv59: Result = KBTS__FEATURE_ID_cv59; break; + case KBTS_FEATURE_TAG_cv60: Result = KBTS__FEATURE_ID_cv60; break; + case KBTS_FEATURE_TAG_cv61: Result = KBTS__FEATURE_ID_cv61; break; + case KBTS_FEATURE_TAG_cv62: Result = KBTS__FEATURE_ID_cv62; break; + case KBTS_FEATURE_TAG_cv63: Result = KBTS__FEATURE_ID_cv63; break; + case KBTS_FEATURE_TAG_cv64: Result = KBTS__FEATURE_ID_cv64; break; + case KBTS_FEATURE_TAG_cv65: Result = KBTS__FEATURE_ID_cv65; break; + case KBTS_FEATURE_TAG_cv66: Result = KBTS__FEATURE_ID_cv66; break; + case KBTS_FEATURE_TAG_cv67: Result = KBTS__FEATURE_ID_cv67; break; + case KBTS_FEATURE_TAG_cv68: Result = KBTS__FEATURE_ID_cv68; break; + case KBTS_FEATURE_TAG_cv69: Result = KBTS__FEATURE_ID_cv69; break; + case KBTS_FEATURE_TAG_cv70: Result = KBTS__FEATURE_ID_cv70; break; + case KBTS_FEATURE_TAG_cv71: Result = KBTS__FEATURE_ID_cv71; break; + case KBTS_FEATURE_TAG_cv72: Result = KBTS__FEATURE_ID_cv72; break; + case KBTS_FEATURE_TAG_cv73: Result = KBTS__FEATURE_ID_cv73; break; + case KBTS_FEATURE_TAG_cv74: Result = KBTS__FEATURE_ID_cv74; break; + case KBTS_FEATURE_TAG_cv75: Result = KBTS__FEATURE_ID_cv75; break; + case KBTS_FEATURE_TAG_cv76: Result = KBTS__FEATURE_ID_cv76; break; + case KBTS_FEATURE_TAG_cv77: Result = KBTS__FEATURE_ID_cv77; break; + case KBTS_FEATURE_TAG_cv78: Result = KBTS__FEATURE_ID_cv78; break; + case KBTS_FEATURE_TAG_cv79: Result = KBTS__FEATURE_ID_cv79; break; + case KBTS_FEATURE_TAG_cv80: Result = KBTS__FEATURE_ID_cv80; break; + case KBTS_FEATURE_TAG_cv81: Result = KBTS__FEATURE_ID_cv81; break; + case KBTS_FEATURE_TAG_cv82: Result = KBTS__FEATURE_ID_cv82; break; + case KBTS_FEATURE_TAG_cv83: Result = KBTS__FEATURE_ID_cv83; break; + case KBTS_FEATURE_TAG_cv84: Result = KBTS__FEATURE_ID_cv84; break; + case KBTS_FEATURE_TAG_cv85: Result = KBTS__FEATURE_ID_cv85; break; + case KBTS_FEATURE_TAG_cv86: Result = KBTS__FEATURE_ID_cv86; break; + case KBTS_FEATURE_TAG_cv87: Result = KBTS__FEATURE_ID_cv87; break; + case KBTS_FEATURE_TAG_cv88: Result = KBTS__FEATURE_ID_cv88; break; + case KBTS_FEATURE_TAG_cv89: Result = KBTS__FEATURE_ID_cv89; break; + case KBTS_FEATURE_TAG_cv90: Result = KBTS__FEATURE_ID_cv90; break; + case KBTS_FEATURE_TAG_cv91: Result = KBTS__FEATURE_ID_cv91; break; + case KBTS_FEATURE_TAG_cv92: Result = KBTS__FEATURE_ID_cv92; break; + case KBTS_FEATURE_TAG_cv93: Result = KBTS__FEATURE_ID_cv93; break; + case KBTS_FEATURE_TAG_cv94: Result = KBTS__FEATURE_ID_cv94; break; + case KBTS_FEATURE_TAG_cv95: Result = KBTS__FEATURE_ID_cv95; break; + case KBTS_FEATURE_TAG_cv96: Result = KBTS__FEATURE_ID_cv96; break; + case KBTS_FEATURE_TAG_cv97: Result = KBTS__FEATURE_ID_cv97; break; + case KBTS_FEATURE_TAG_cv98: Result = KBTS__FEATURE_ID_cv98; break; + case KBTS_FEATURE_TAG_cv99: Result = KBTS__FEATURE_ID_cv99; break; + case KBTS_FEATURE_TAG_c2pc: Result = KBTS__FEATURE_ID_c2pc; break; + case KBTS_FEATURE_TAG_c2sc: Result = KBTS__FEATURE_ID_c2sc; break; + case KBTS_FEATURE_TAG_dist: Result = KBTS__FEATURE_ID_dist; break; + case KBTS_FEATURE_TAG_dlig: Result = KBTS__FEATURE_ID_dlig; break; + case KBTS_FEATURE_TAG_dtls: Result = KBTS__FEATURE_ID_dtls; break; + case KBTS_FEATURE_TAG_expt: Result = KBTS__FEATURE_ID_expt; break; + case KBTS_FEATURE_TAG_falt: Result = KBTS__FEATURE_ID_falt; break; + case KBTS_FEATURE_TAG_flac: Result = KBTS__FEATURE_ID_flac; break; + case KBTS_FEATURE_TAG_fwid: Result = KBTS__FEATURE_ID_fwid; break; + case KBTS_FEATURE_TAG_haln: Result = KBTS__FEATURE_ID_haln; break; + case KBTS_FEATURE_TAG_halt: Result = KBTS__FEATURE_ID_halt; break; + case KBTS_FEATURE_TAG_hist: Result = KBTS__FEATURE_ID_hist; break; + case KBTS_FEATURE_TAG_hkna: Result = KBTS__FEATURE_ID_hkna; break; + case KBTS_FEATURE_TAG_hlig: Result = KBTS__FEATURE_ID_hlig; break; + case KBTS_FEATURE_TAG_hngl: Result = KBTS__FEATURE_ID_hngl; break; + case KBTS_FEATURE_TAG_hojo: Result = KBTS__FEATURE_ID_hojo; break; + case KBTS_FEATURE_TAG_hwid: Result = KBTS__FEATURE_ID_hwid; break; + case KBTS_FEATURE_TAG_ital: Result = KBTS__FEATURE_ID_ital; break; + case KBTS_FEATURE_TAG_jalt: Result = KBTS__FEATURE_ID_jalt; break; + case KBTS_FEATURE_TAG_jp78: Result = KBTS__FEATURE_ID_jp78; break; + case KBTS_FEATURE_TAG_jp83: Result = KBTS__FEATURE_ID_jp83; break; + case KBTS_FEATURE_TAG_jp90: Result = KBTS__FEATURE_ID_jp90; break; + case KBTS_FEATURE_TAG_jp04: Result = KBTS__FEATURE_ID_jp04; break; + case KBTS_FEATURE_TAG_kern: Result = KBTS__FEATURE_ID_kern; break; + case KBTS_FEATURE_TAG_lfbd: Result = KBTS__FEATURE_ID_lfbd; break; + case KBTS_FEATURE_TAG_liga: Result = KBTS__FEATURE_ID_liga; break; + case KBTS_FEATURE_TAG_lnum: Result = KBTS__FEATURE_ID_lnum; break; + case KBTS_FEATURE_TAG_locl: Result = KBTS__FEATURE_ID_locl; break; + case KBTS_FEATURE_TAG_ltra: Result = KBTS__FEATURE_ID_ltra; break; + case KBTS_FEATURE_TAG_ltrm: Result = KBTS__FEATURE_ID_ltrm; break; + case KBTS_FEATURE_TAG_mark: Result = KBTS__FEATURE_ID_mark; break; + case KBTS_FEATURE_TAG_mgrk: Result = KBTS__FEATURE_ID_mgrk; break; + case KBTS_FEATURE_TAG_mkmk: Result = KBTS__FEATURE_ID_mkmk; break; + case KBTS_FEATURE_TAG_mset: Result = KBTS__FEATURE_ID_mset; break; + case KBTS_FEATURE_TAG_nalt: Result = KBTS__FEATURE_ID_nalt; break; + case KBTS_FEATURE_TAG_nlck: Result = KBTS__FEATURE_ID_nlck; break; + case KBTS_FEATURE_TAG_nukt: Result = KBTS__FEATURE_ID_nukt; break; + case KBTS_FEATURE_TAG_onum: Result = KBTS__FEATURE_ID_onum; break; + case KBTS_FEATURE_TAG_opbd: Result = KBTS__FEATURE_ID_opbd; break; + case KBTS_FEATURE_TAG_ordn: Result = KBTS__FEATURE_ID_ordn; break; + case KBTS_FEATURE_TAG_ornm: Result = KBTS__FEATURE_ID_ornm; break; + case KBTS_FEATURE_TAG_palt: Result = KBTS__FEATURE_ID_palt; break; + case KBTS_FEATURE_TAG_pcap: Result = KBTS__FEATURE_ID_pcap; break; + case KBTS_FEATURE_TAG_pkna: Result = KBTS__FEATURE_ID_pkna; break; + case KBTS_FEATURE_TAG_pnum: Result = KBTS__FEATURE_ID_pnum; break; + case KBTS_FEATURE_TAG_pres: Result = KBTS__FEATURE_ID_pres; break; + case KBTS_FEATURE_TAG_psts: Result = KBTS__FEATURE_ID_psts; break; + case KBTS_FEATURE_TAG_pwid: Result = KBTS__FEATURE_ID_pwid; break; + case KBTS_FEATURE_TAG_qwid: Result = KBTS__FEATURE_ID_qwid; break; + case KBTS_FEATURE_TAG_rand: Result = KBTS__FEATURE_ID_rand; break; + case KBTS_FEATURE_TAG_rclt: Result = KBTS__FEATURE_ID_rclt; break; + case KBTS_FEATURE_TAG_rkrf: Result = KBTS__FEATURE_ID_rkrf; break; + case KBTS_FEATURE_TAG_rlig: Result = KBTS__FEATURE_ID_rlig; break; + case KBTS_FEATURE_TAG_rtbd: Result = KBTS__FEATURE_ID_rtbd; break; + case KBTS_FEATURE_TAG_rtla: Result = KBTS__FEATURE_ID_rtla; break; + case KBTS_FEATURE_TAG_rtlm: Result = KBTS__FEATURE_ID_rtlm; break; + case KBTS_FEATURE_TAG_ruby: Result = KBTS__FEATURE_ID_ruby; break; + case KBTS_FEATURE_TAG_rvrn: Result = KBTS__FEATURE_ID_rvrn; break; + case KBTS_FEATURE_TAG_salt: Result = KBTS__FEATURE_ID_salt; break; + case KBTS_FEATURE_TAG_sinf: Result = KBTS__FEATURE_ID_sinf; break; + case KBTS_FEATURE_TAG_size: Result = KBTS__FEATURE_ID_size; break; + case KBTS_FEATURE_TAG_smcp: Result = KBTS__FEATURE_ID_smcp; break; + case KBTS_FEATURE_TAG_smpl: Result = KBTS__FEATURE_ID_smpl; break; + case KBTS_FEATURE_TAG_ss01: Result = KBTS__FEATURE_ID_ss01; break; + case KBTS_FEATURE_TAG_ss02: Result = KBTS__FEATURE_ID_ss02; break; + case KBTS_FEATURE_TAG_ss03: Result = KBTS__FEATURE_ID_ss03; break; + case KBTS_FEATURE_TAG_ss04: Result = KBTS__FEATURE_ID_ss04; break; + case KBTS_FEATURE_TAG_ss05: Result = KBTS__FEATURE_ID_ss05; break; + case KBTS_FEATURE_TAG_ss06: Result = KBTS__FEATURE_ID_ss06; break; + case KBTS_FEATURE_TAG_ss07: Result = KBTS__FEATURE_ID_ss07; break; + case KBTS_FEATURE_TAG_ss08: Result = KBTS__FEATURE_ID_ss08; break; + case KBTS_FEATURE_TAG_ss09: Result = KBTS__FEATURE_ID_ss09; break; + case KBTS_FEATURE_TAG_ss10: Result = KBTS__FEATURE_ID_ss10; break; + case KBTS_FEATURE_TAG_ss11: Result = KBTS__FEATURE_ID_ss11; break; + case KBTS_FEATURE_TAG_ss12: Result = KBTS__FEATURE_ID_ss12; break; + case KBTS_FEATURE_TAG_ss13: Result = KBTS__FEATURE_ID_ss13; break; + case KBTS_FEATURE_TAG_ss14: Result = KBTS__FEATURE_ID_ss14; break; + case KBTS_FEATURE_TAG_ss15: Result = KBTS__FEATURE_ID_ss15; break; + case KBTS_FEATURE_TAG_ss16: Result = KBTS__FEATURE_ID_ss16; break; + case KBTS_FEATURE_TAG_ss17: Result = KBTS__FEATURE_ID_ss17; break; + case KBTS_FEATURE_TAG_ss18: Result = KBTS__FEATURE_ID_ss18; break; + case KBTS_FEATURE_TAG_ss19: Result = KBTS__FEATURE_ID_ss19; break; + case KBTS_FEATURE_TAG_ss20: Result = KBTS__FEATURE_ID_ss20; break; + case KBTS_FEATURE_TAG_ssty: Result = KBTS__FEATURE_ID_ssty; break; + case KBTS_FEATURE_TAG_stch: Result = KBTS__FEATURE_ID_stch; break; + case KBTS_FEATURE_TAG_subs: Result = KBTS__FEATURE_ID_subs; break; + case KBTS_FEATURE_TAG_sups: Result = KBTS__FEATURE_ID_sups; break; + case KBTS_FEATURE_TAG_swsh: Result = KBTS__FEATURE_ID_swsh; break; + case KBTS_FEATURE_TAG_test: Result = KBTS__FEATURE_ID_test; break; + case KBTS_FEATURE_TAG_titl: Result = KBTS__FEATURE_ID_titl; break; + case KBTS_FEATURE_TAG_tnam: Result = KBTS__FEATURE_ID_tnam; break; + case KBTS_FEATURE_TAG_tnum: Result = KBTS__FEATURE_ID_tnum; break; + case KBTS_FEATURE_TAG_trad: Result = KBTS__FEATURE_ID_trad; break; + case KBTS_FEATURE_TAG_twid: Result = KBTS__FEATURE_ID_twid; break; + case KBTS_FEATURE_TAG_unic: Result = KBTS__FEATURE_ID_unic; break; + case KBTS_FEATURE_TAG_valt: Result = KBTS__FEATURE_ID_valt; break; + case KBTS_FEATURE_TAG_vapk: Result = KBTS__FEATURE_ID_vapk; break; + case KBTS_FEATURE_TAG_vatu: Result = KBTS__FEATURE_ID_vatu; break; + case KBTS_FEATURE_TAG_vchw: Result = KBTS__FEATURE_ID_vchw; break; + case KBTS_FEATURE_TAG_vert: Result = KBTS__FEATURE_ID_vert; break; + case KBTS_FEATURE_TAG_vhal: Result = KBTS__FEATURE_ID_vhal; break; + case KBTS_FEATURE_TAG_vkna: Result = KBTS__FEATURE_ID_vkna; break; + case KBTS_FEATURE_TAG_vkrn: Result = KBTS__FEATURE_ID_vkrn; break; + case KBTS_FEATURE_TAG_vpal: Result = KBTS__FEATURE_ID_vpal; break; + case KBTS_FEATURE_TAG_vrt2: Result = KBTS__FEATURE_ID_vrt2; break; + case KBTS_FEATURE_TAG_vrtr: Result = KBTS__FEATURE_ID_vrtr; break; + case KBTS_FEATURE_TAG_zero: Result = KBTS__FEATURE_ID_zero; break; default: break; } return Result; } -static kbts_s32 kbts_UnicodeParentDeltas[1679] = { +static kbts_s32 kbts__UnicodeParentDeltas[1679] = { 132,133,134,135,244,246,248,250,252,254,315,351,416,418,7678,7680,7682,7792,7794,132,133,134,135,275,277,279,281,283,285,346,382,447, 449,7709,7711,7713,7823,7825,131,132,133,134,174,176,178,180,182,416,418,452,7604,7606,7764,7766,7768,131,132,133,134,205,207,209,211,213, 447,449,483,7635,7637,7795,7797,7799,127,128,129,130,131,132,160,162,164,365,416,418,454,7584,7744,7746,127,128,129,130,131,132,191,193, @@ -3621,7 +5114,24 @@ static kbts_s32 kbts_UnicodeParentDeltas[1679] = { 180071,180102,180152,180175,180238,180262,180308,180469,180588,180601,181007,181056,181082,181102,181519, }; -static kbts_u8 kbts_UnicodeDecomposition_PageIndices[17407] = { +static kbts_u8 kbts__ScriptExtensions[447] = { + 6,18,24,25,35,37,41,42,43,45,47,72,79,80,112,132,11,28,32,72,77,155,160,13,72,72,155,22,25,28,45,72, + 112,141,146,22,28,45,72,119,141,146,159,22,28,72,157,42,72,141,143,155,19,22,25,28,43,45,72,119,143,157,159,25, + 37,42,43,62,72,25,35,54,72,112,143,146,157,159,5,28,35,43,45,54,72,112,143,146,35,72,143,22,28,72,119,22, + 72,146,39,72,28,72,159,45,72,112,159,22,35,62,72,143,22,35,72,143,22,72,143,19,22,43,72,141,155,19,72,159, + 25,45,28,112,28,42,5,41,42,4,40,51,103,143,154,167,4,143,154,1,4,40,51,103,143,154,167,1,4,51,83,84, + 117,126,135,143,4,154,167,11,32,44,46,48,61,72,82,118,131,150,153,158,11,32,44,46,48,61,72,82,118,150,153,158, + 11,32,34,44,46,47,48,61,69,80,82,86,100,108,118,136,142,149,150,153,158,11,32,34,44,46,47,48,49,61,69,74, + 80,82,86,100,108,118,136,142,149,150,153,158,32,34,60,80,11,20,142,48,96,46,68,44,150,61,100,161,20,97,146,41, + 42,72,16,52,144,145,94,124,11,32,44,61,32,131,32,61,82,118,150,153,32,100,11,32,44,61,82,100,118,136,153,158, + 161,32,44,61,161,28,72,143,72,94,124,18,41,42,78,110,116,18,45,91,110,32,44,72,25,72,6,116,6,18,41,60, + 79,110,129,1,4,110,24,152,13,24,50,55,62,94,168,13,24,50,55,62,94,124,168,13,24,50,55,62,94,156,168,13, + 24,50,55,62,77,94,156,168,13,24,50,55,62,168,24,55,62,24,72,32,34,46,48,60,61,68,69,80,82,93,100,131, + 149,158,161,32,34,46,48,60,61,68,69,80,93,100,131,149,158,161,32,34,46,48,60,68,69,80,93,149,158,32,34,46, + 48,60,68,69,80,93,131,149,158,11,32,161,32,150,64,72,97,15,59,4,103,26,27,76,26,76,26,75,76,4,25, +}; + +static kbts_u8 kbts__UnicodeDecomposition_PageIndices[17407] = { 0,1,1,2,3,4,5,6,7,1,1,1,1,8,9,10,11,12,1,13,1,1,1,1,14,1,1,15,1,1,1,1, 1,1,1,1,16,17,1,18,19,20,1,1,1,21,1,22,1,23,1,24,1,25,1,26,1,1,1,1,1,27,28,1, 29,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,30,31, @@ -4168,9 +5678,9 @@ static kbts_u8 kbts_UnicodeDecomposition_PageIndices[17407] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, }; -static kbts_u64 kbts_UnicodeDecomposition_Data[5632] = { +static kbts_u64 kbts__UnicodeDecomposition_Data[5632] = { 52776558133248ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull, - 0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,343932928ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull, + 0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull, 0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull, 0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull, 6442451206ull,6450839814ull,6459228422ull,6467617030ull,6509560070ull,6526337286ull,0ull,6769606926ull,6442451222ull,6450839830ull,6459228438ull,6509560086ull,6442451238ull,6450839846ull,6459228454ull,6509560102ull,0ull,6467617082ull,6442451262ull,6450839870ull,6459228478ull,6467617086ull,6509560126ull,0ull,0ull,6442451286ull,6450839894ull,6459228502ull,6509560150ull,6450839910ull,0ull,0ull, @@ -4347,12 +5857,12 @@ static kbts_u64 kbts_UnicodeDecomposition_Data[5632] = { 0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull,0ull, }; -KBTS_INLINE kbts_u64 kbts_GetUnicodeDecomposition(kbts_u32 Codepoint) +KBTS_INLINE kbts_u64 kbts__GetUnicodeDecomposition(kbts_u32 Codepoint) { - return kbts_UnicodeDecomposition_Data[((kbts_un)kbts_UnicodeDecomposition_PageIndices[Codepoint/64] * 64) | (Codepoint & 63)]; + return (Codepoint < 1114110) ? kbts__UnicodeDecomposition_Data[((kbts_un)kbts__UnicodeDecomposition_PageIndices[Codepoint/64] * 64) | (Codepoint & 63)] : 0; } -static kbts_u8 kbts_UnicodeWordBreakClass_PageIndices[8703] = { +static kbts_u8 kbts__UnicodeWordBreakClass_PageIndices[8703] = { 0,1,2,2,2,3,4,5,2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28, 29,30,2,2,31,32,33,34,35,2,2,2,36,37,38,39,40,41,42,43,44,45,46,47,48,49,2,50,2,2,51,52, 53,54,55,56,57,57,58,59,57,60,57,61,62,63,64,65,57,57,66,57,57,57,67,57,2,68,69,70,71,57,57,57, @@ -4627,7 +6137,7 @@ static kbts_u8 kbts_UnicodeWordBreakClass_PageIndices[8703] = { 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, }; -static kbts_u8 kbts_UnicodeWordBreakClass_Data[27648] = { +static kbts_u8 kbts__UnicodeWordBreakClass_Data[27648] = { 0,0,0,0,0,0,0,0,0,0,3,4,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,14,0,0,0,0,13,0,0,0,0,17,0,15,0,18,18,18,18,18,18,18,18,18,18,16,17,0,0,0,0, 0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,0,19,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,0,0, 0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,11,0,0,8,1,0,0,0,0,0,0,11,0,16,0,0,11,0,0,0,0,0, @@ -5062,12 +6572,12 @@ static kbts_u8 kbts_UnicodeWordBreakClass_Data[27648] = { 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; -KBTS_INLINE kbts_u8 kbts_GetUnicodeWordBreakClass(kbts_u32 Codepoint) +KBTS_INLINE kbts_u8 kbts__GetUnicodeWordBreakClass(kbts_u32 Codepoint) { - return kbts_UnicodeWordBreakClass_Data[((kbts_un)kbts_UnicodeWordBreakClass_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)]; + return (Codepoint < 1114110) ? kbts__UnicodeWordBreakClass_Data[((kbts_un)kbts__UnicodeWordBreakClass_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)] : 0; } -static kbts_u8 kbts_UnicodeLineBreakClass_PageIndices[8703] = { +static kbts_u8 kbts__UnicodeLineBreakClass_PageIndices[8703] = { 0,1,2,2,2,3,4,2,2,5,2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26, 27,28,29,30,2,2,31,2,32,2,2,2,2,33,34,35,36,37,38,39,40,41,42,43,44,45,2,46,2,2,2,47, 48,49,50,2,51,52,53,54,2,2,2,55,56,57,58,59,2,2,2,60,2,2,61,2,2,62,63,64,65,66,67,68, @@ -5342,7 +6852,7 @@ static kbts_u8 kbts_UnicodeLineBreakClass_PageIndices[8703] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, }; -static kbts_u8 kbts_UnicodeLineBreakClass_Data[26752] = { +static kbts_u8 kbts__UnicodeLineBreakClass_Data[26752] = { 63,63,63,63,63,63,63,63,63,19,5,3,3,4,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,7,16,23,37,40,48,37,23,21,14,37,40,26,31,26,18,39,39,39,39,39,39,39,39,39,39,26,26,37,37,37,16, 37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,21,40,14,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,21,19,12,37,63, 63,63,63,63,63,6,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,10,21,48,40,40,40,37,37,37,37,37,24,37,19,37,37,48,40,37,37,35,37,37,37,37,37,37,25,37,37,37,21, @@ -5763,12 +7273,12 @@ static kbts_u8 kbts_UnicodeLineBreakClass_Data[26752] = { 63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37, }; -KBTS_INLINE kbts_u8 kbts_GetUnicodeLineBreakClass(kbts_u32 Codepoint) +KBTS_INLINE kbts_u8 kbts__GetUnicodeLineBreakClass(kbts_u32 Codepoint) { - return kbts_UnicodeLineBreakClass_Data[((kbts_un)kbts_UnicodeLineBreakClass_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)]; + return (Codepoint < 1114110) ? kbts__UnicodeLineBreakClass_Data[((kbts_un)kbts__UnicodeLineBreakClass_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)] : 0; } -static kbts_u8 kbts_UnicodeGraphemeBreakClass_PageIndices[8703] = { +static kbts_u8 kbts__UnicodeGraphemeBreakClass_PageIndices[8703] = { 0,1,2,2,2,2,3,2,2,4,2,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, 26,27,28,29,2,2,30,2,2,2,2,2,2,2,31,32,33,34,35,2,36,37,38,39,40,41,2,42,2,2,2,2, 43,44,45,46,2,2,47,48,2,49,2,50,51,52,53,54,2,2,55,2,2,2,56,2,2,57,58,59,2,2,2,2, @@ -6043,7 +7553,7 @@ static kbts_u8 kbts_UnicodeGraphemeBreakClass_PageIndices[8703] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, }; -static kbts_u8 kbts_UnicodeGraphemeBreakClass_Data[20096] = { +static kbts_u8 kbts__UnicodeGraphemeBreakClass_Data[20096] = { 3,3,3,3,3,3,3,3,3,3,2,0,3,1,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,16,0,0,0,3,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -6360,12 +7870,12 @@ static kbts_u8 kbts_UnicodeGraphemeBreakClass_Data[20096] = { 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, }; -KBTS_INLINE kbts_u8 kbts_GetUnicodeGraphemeBreakClass(kbts_u32 Codepoint) +KBTS_INLINE kbts_u8 kbts__GetUnicodeGraphemeBreakClass(kbts_u32 Codepoint) { - return kbts_UnicodeGraphemeBreakClass_Data[((kbts_un)kbts_UnicodeGraphemeBreakClass_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)]; + return (Codepoint < 1114110) ? kbts__UnicodeGraphemeBreakClass_Data[((kbts_un)kbts__UnicodeGraphemeBreakClass_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)] : 0; } -static kbts_u8 kbts_UnicodeSyllabicInfo_PageIndices[8703] = { +static kbts_u8 kbts__UnicodeSyllabicInfo_PageIndices[8703] = { 0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4,2,5,6,7,8,9,10,11,12,13,14,15,16,17,18, 19,20,2,2,2,2,2,2,2,2,2,2,2,2,21,22,23,24,25,26,27,28,29,30,31,32,2,33,2,2,2,2, 34,35,2,2,2,2,2,2,2,2,2,36,2,2,2,2,2,2,2,2,2,2,2,2,2,2,37,2,2,2,2,2, @@ -6640,7 +8150,7 @@ static kbts_u8 kbts_UnicodeSyllabicInfo_PageIndices[8703] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, }; -static kbts_u16 kbts_UnicodeSyllabicInfo_Data[12160] = { +static kbts_u16 kbts__UnicodeSyllabicInfo_Data[12160] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1034,0,0,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -7023,816 +8533,45 @@ static kbts_u16 kbts_UnicodeSyllabicInfo_Data[12160] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; -KBTS_INLINE kbts_u16 kbts_GetUnicodeSyllabicInfo(kbts_u32 Codepoint) +KBTS_INLINE kbts_u16 kbts__GetUnicodeSyllabicInfo(kbts_u32 Codepoint) { - return kbts_UnicodeSyllabicInfo_Data[((kbts_un)kbts_UnicodeSyllabicInfo_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)]; + return (Codepoint < 1114110) ? kbts__UnicodeSyllabicInfo_Data[((kbts_un)kbts__UnicodeSyllabicInfo_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)] : 0; } -static kbts_u8 kbts_UnicodeScript_PageIndices[8703] = { - 0,1,2,2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29, - 30,31,32,32,33,34,35,36,37,37,37,37,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,2,2,53,54, - 55,56,57,58,59,59,59,59,60,59,59,59,59,59,59,59,61,61,59,59,59,59,62,63,64,65,66,67,68,61,61,69, - 70,71,72,73,74,75,76,59,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,77,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 78,78,78,78,78,78,78,78,78,79,80,80,81,82,83,84,85,86,87,88,89,90,91,92,32,32,32,32,32,32,32,32, - 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, - 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, - 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,93,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,94,95,96,96,97,98,99,100,101,102, - 103,104,105,106,61,107,108,109,110,111,112,113,114,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132, - 133,134,135,136,137,138,139,140,141,142,61,143,144,145,146,61,147,148,149,150,151,152,153,154,155,156,157,158,61,159,160,161, - 162,162,162,162,162,162,162,163,164,162,165,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,166, - 167,167,167,167,167,167,167,167,168,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167, - 167,167,167,167,167,167,167,169,170,170,170,170,171,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,172,61,61,61,61,61,61,61,61,61,61,61,61,61,173,173,173,173,174,175,176,177,61,61,178,61,179,180,181,182, - 183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183, - 183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,184,183,183,183,183,183,183,185,185,185,186,187,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,188, - 189,190,191,192,192,193,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,194,195,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,59,196,59,59,59,197,198,199, - 59,200,201,202,203,204,205,61,206,207,208,59,59,209,59,210,211,211,211,211,211,212,61,61,61,61,61,61,61,61,213,61, - 214,215,216,61,61,217,61,61,61,218,61,219,61,61,61,220,221,222,223,61,61,61,61,61,224,225,226,61,227,228,61,61, - 229,230,59,231,232,61,59,59,59,59,59,59,59,233,234,235,236,237,59,59,238,239,59,240,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 241,61,242,243,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, - 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, -}; - -static kbts_u8 kbts_UnicodeScript_Data[31232] = { - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,29,29,29,29,29,29,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,72,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,72,29,29,29,29,29, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,29,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,29,72,72,72,72,72,72,72,72, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,72,72,72,72,72,29,29,29,29,29,13,13,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, - 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,45,45,45,45,29,45,45,45,0,0,45,45,45,45,29,45, - 0,0,0,0,45,29,45,29,45,45,45,0,45,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, - 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,25,25,25,25,25,25,25,25,25,25,25,25,25,25,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,30,30,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,0,0,5,5,5,0,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54, - 54,54,54,54,54,54,54,54,0,0,0,0,0,0,0,0,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,0,0,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0, - 4,4,4,4,4,29,4,4,4,4,4,4,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,4,4,4,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 29,4,4,4,4,4,4,4,4,4,4,30,30,30,30,30,30,30,30,30,30,30,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,30,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 143,143,143,143,143,143,143,143,143,143,143,143,143,143,0,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, - 143,143,143,143,143,143,143,143,143,143,143,0,0,143,143,143,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,0,0,103,103,103, - 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,0,0,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,0, - 83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,0,0,83,0,143,143,143,143,143,143,143,143,143,143,143,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, - 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,30,30,30,30,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,29,29,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, - 11,11,11,11,0,11,11,11,11,11,11,11,11,0,0,11,11,0,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,11,11,11,11,11,11,0,11,0,0,0,11,11,11,11,0,0,11,11,11,11, - 11,11,11,11,11,0,0,11,11,0,0,11,11,11,11,0,0,0,0,0,0,0,0,11,0,0,0,0,11,11,0,11,11,11,11,11,0,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0, - 0,48,48,48,0,48,48,48,48,48,48,0,0,0,0,48,48,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0,48,48,48,48,48,48,48,0,48,48,0,48,48,0,48,48,0,0,48,0,48,48, - 48,48,48,0,0,0,0,48,48,0,0,48,48,48,0,0,0,48,0,0,0,0,0,0,0,48,48,48,48,0,48,0,0,0,0,0,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0,0,0,0,0,0,0,0,0, - 0,46,46,46,0,46,46,46,46,46,46,46,46,46,0,46,46,46,0,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,0,46,46,46,46,46,46,46,0,46,46,0,46,46,46,46,46,0,0,46,46,46,46, - 46,46,46,46,46,46,0,46,46,46,0,46,46,46,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,46,46,46,0,0,46,46,46,46,46,46,46,46,46,46,46,46,0,0,0,0,0,0,0,46,46,46,46,46,46,46, - 0,118,118,118,0,118,118,118,118,118,118,118,118,0,0,118,118,0,0,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,0,118,118,118,118,118,118,118,0,118,118,0,118,118,118,118,118,0,0,118,118,118,118, - 118,118,118,118,118,0,0,118,118,0,0,118,118,118,0,0,0,0,0,0,0,118,118,118,0,0,0,0,118,118,0,118,118,118,118,118,0,0,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,0,0,0,0,0,0,0,0, - 0,0,150,150,0,150,150,150,150,150,150,0,0,0,150,150,150,0,150,150,150,150,0,0,0,150,150,0,150,0,150,150,0,0,0,150,150,0,0,0,150,150,150,0,0,0,150,150,150,150,150,150,150,150,150,150,150,150,0,0,0,0,150,150, - 150,150,150,0,0,0,150,150,150,0,150,150,150,150,0,0,150,0,0,0,0,0,0,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,0,0,0,0,0, - 153,153,153,153,153,153,153,153,153,153,153,153,153,0,153,153,153,0,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,0,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,0,0,153,153,153,153, - 153,153,153,153,153,0,153,153,153,0,153,153,153,153,0,0,0,0,0,0,0,153,153,0,153,153,153,0,0,153,0,0,153,153,153,153,0,0,153,153,153,153,153,153,153,153,153,153,0,0,0,0,0,0,0,153,153,153,153,153,153,153,153,153, - 61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61,61,61,61,61,61,61,0,61,61,61,61,61,0,0,61,61,61,61, - 61,61,61,61,61,0,61,61,61,0,61,61,61,61,0,0,0,0,0,0,0,61,61,0,0,0,0,0,0,61,61,0,61,61,61,61,0,0,61,61,61,61,61,61,61,61,61,61,0,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0, - 82,82,82,82,82,82,82,82,82,82,82,82,82,0,82,82,82,0,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82, - 82,82,82,82,82,0,82,82,82,0,82,82,82,82,82,82,0,0,0,0,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,0,0,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82, - 0,136,136,136,0,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,0,0,0,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,0,136,136,136,136,136,136,136,136,136,0,136,0,0, - 136,136,136,136,136,136,136,0,0,0,136,0,0,0,0,136,136,136,136,136,136,0,136,0,136,136,136,136,136,136,136,136,0,0,0,0,0,0,136,136,136,136,136,136,136,136,136,136,0,0,136,136,136,0,0,0,0,0,0,0,0,0,0,0, - 0,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,0,0,0,0,29, - 155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,71,71,0,71,0,71,71,71,71,71,0,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,0,71,0,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,0,0, - 71,71,71,71,71,0,71,0,71,71,71,71,71,71,71,0,71,71,71,71,71,71,71,71,71,71,0,0,71,71,71,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156, - 156,156,156,156,156,156,156,156,0,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,0,0,0,0,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156, - 156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,0,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,0,156,156, - 156,156,156,156,156,156,156,156,156,156,156,156,156,0,156,156,156,156,156,156,156,29,29,29,29,156,156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, - 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, - 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41, - 41,41,41,41,41,41,0,41,0,0,0,0,0,41,0,0,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,29,41,41,41,41, - 50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, - 50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, - 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39, - 39,39,39,39,39,39,39,39,39,0,39,39,39,39,0,0,39,39,39,39,39,39,39,0,39,0,39,39,39,39,0,0,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39, - 39,39,39,39,39,39,39,39,39,0,39,39,39,39,0,0,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,0,39,39,39,39,0,0,39,39,39,39,39,39,39,0, - 39,0,39,39,39,39,0,0,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,0,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39, - 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,0,39,39,39,39,0,0,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39, - 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,0,0,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,0,0,0, - 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,0,0,0,0,0,0,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, - 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,0,0,22,22,22,22,22,22,0,0, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,0,0,0,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,29,29,29,128,128,128,128,128,128,128,128,128,128,128,0,0,0,0,0,0,0, - 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,0,0,0,0,0,0,0,0,0,144,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,29,29,0,0,0,0,0,0,0,0,0, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,0,145,145,145,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0, - 67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67, - 67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,0,0,67,67,67,67,67,67,67,67,67,67,0,0,0,0,0,0,67,67,67,67,67,67,67,67,67,67,0,0,0,0,0,0, - 94,94,29,29,94,29,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,0,0,0,0,0,0,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94, - 94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,0,0,0,0,0,0,0, - 94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,0,0,0,0,0,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,0,0,0,0,0,0,0,0,0,0, - 74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0, - 74,0,0,0,74,74,74,74,74,74,74,74,74,74,74,74,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,0,0,146,146,146,146,146,0,0,0,0,0,0,0,0,0,0,0, - 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,0,0,0,0,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, - 102,102,102,102,102,102,102,102,102,102,0,0,0,0,0,0,102,102,102,102,102,102,102,102,102,102,102,0,0,0,102,102,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,0,0,15,15,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147, - 147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,0,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,0,0,147, - 147,147,147,147,147,147,147,147,147,147,0,0,0,0,0,0,147,147,147,147,147,147,147,147,147,147,0,0,0,0,0,0,147,147,147,147,147,147,147,147,147,147,147,147,147,147,0,0,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, - 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,10,10,10,10, - 73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,0,0,0,73,73,73,73,73, - 73,73,73,73,73,73,73,73,73,73,0,0,0,73,73,73,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107, - 28,28,28,28,28,28,28,28,28,28,28,0,0,0,0,0,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,0,0,41,41,41, - 140,140,140,140,140,140,140,140,0,0,0,0,0,0,0,0,30,30,30,29,30,30,30,30,30,30,30,30,30,30,30,30,30,29,30,30,30,30,30,30,30,29,29,29,29,30,29,29,29,29,29,29,30,29,29,29,30,30,29,0,0,0,0,0, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,45,45,45,45,45,28,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,45,45,45,45,45,72,72,72,72,45,45,45,45,45,72,72,72,72,72,72,72,72,72,72,72,72,72,28,72,72,72,72,72,72,72, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,45, - 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, - 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,0,0,45,45,45,45,45,45,0,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, - 45,45,45,45,45,45,0,0,45,45,45,45,45,45,0,0,45,45,45,45,45,45,45,45,0,45,0,45,0,45,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,0,0, - 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,0,45,45,45,45,45,45,45,45,45,45, - 45,45,45,45,45,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,0,0,45,45,45,45,45,45,0,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,0,0,45,45,45,0,45,45,45,45,45,45,45,45,45,0, - 29,29,29,29,29,29,29,29,29,29,29,29,30,30,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,29,29,29,29,29,29,29,29,29,29,29,72,0,0,29,29,29,29,29,29,29,29,29,29,29,72, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,72,72,72,72,72,72,72,72,72,72,72,72,72,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,45,29,29,29,72,72,29,29,29,29,29,29,72,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,72,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, - 72,72,72,72,72,72,72,72,72,29,29,29,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42, - 42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25, - 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0,25,25,25,25,25,25,25, - 41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,0,41,0,0,0,0,0,41,0,0,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157, - 157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,0,0,0,0,0,0,0,157,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157, - 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,0,0,0,0,0,0,0,0,0,39,39,39,39,39,39,39,0,39,39,39,39,39,39,39,0,39,39,39,39,39,39,39,0,39,39,39,39,39,39,39,0, - 39,39,39,39,39,39,39,0,39,39,39,39,39,39,39,0,39,39,39,39,39,39,39,0,39,39,39,39,39,39,39,0,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,0,29,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,30,30,30,30,50,50,29,29,29,29,29,29,29,29,0,0,0,0,29,29,29,29, - 0,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55, - 55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,0,0,30,30,29,29,55,55,55,29,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, - 62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,29,29,62,62,62, - 0,0,0,0,0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,0,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, - 50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, - 50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,29,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, - 50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,29, - 62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, - 62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, - 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, - 168,168,168,168,168,168,168,168,168,168,168,168,168,0,0,0,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, - 168,168,168,168,168,168,168,0,0,0,0,0,0,0,0,0,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77, - 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163, - 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163, - 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, - 72,72,72,72,72,72,72,72,29,29,29,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,0,0,72,72,0,72,0,72,72,72,72,72,72,72,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,72,72,72,72,72,72,72,72,72,72,72,72,72, - 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,0,0,0,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0, - 124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,0,0,0,0,0,0,0,0, - 130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130, - 130,130,130,130,130,130,0,0,0,0,0,0,0,0,130,130,130,130,130,130,130,130,130,130,130,130,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, - 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,29,64,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,127,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,0,0,0, - 59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59, - 59,59,59,59,59,59,59,59,59,59,59,59,59,59,0,29,59,59,59,59,59,59,59,59,59,59,0,0,0,0,59,59,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,0, - 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,0,0,0,0,0,0,0,0,0, - 21,21,21,21,21,21,21,21,21,21,21,21,21,21,0,0,21,21,21,21,21,21,21,21,21,21,0,0,21,21,21,21,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, - 148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148, - 148,148,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,148,148,148,148,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,0,0,0,0,0,0,0,0,0, - 0,39,39,39,39,39,39,0,0,39,39,39,39,39,39,0,0,39,39,39,39,39,39,0,0,0,0,0,0,0,0,0,39,39,39,39,39,39,39,0,39,39,39,39,39,39,39,0,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,29,72,72,72,72,72,72,72,72,72,45,72,72,72,72,29,29,0,0,0,0,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, - 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, - 88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,0,0,88,88,88,88,88,88,88,88,88,88,0,0,0,0,0,0, - 50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,0,0,0,0,0,0,0,0,0,0,0,0,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, - 50,50,50,50,50,50,50,0,0,0,0,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,0,0,0,0, - 72,72,72,72,72,72,72,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,0,0,0,0,0,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,0,54,54,54,54,54,0,54,0, - 54,54,0,54,54,0,54,54,54,54,54,54,54,54,54,54,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,29,29, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,30,30,30,30,30,30,30,30,30,30,30,30,30,30,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,29,29,29,29,0,0,0,0,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,29, - 0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,29,29,29,29,29, - 29,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,29,29,29,29,29,29,29,29,29,29,29,62,62,62,62,62,62,62,62,62,62,29,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, - 62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,29,29,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,0, - 0,0,50,50,50,50,50,50,0,0,50,50,50,50,50,50,0,0,50,50,50,50,50,50,0,0,50,50,50,0,0,0,29,29,29,29,29,29,29,0,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,0,0, - 76,76,76,76,76,76,76,76,76,76,76,76,0,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,0,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,0,76,76,0,76, - 76,76,76,76,76,76,76,76,76,76,76,76,76,76,0,0,76,76,76,76,76,76,76,76,76,76,76,76,76,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76, - 76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,0,0,0,0,0, - 29,29,29,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,29,29,29,29,29,29,29,29,29, - 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, - 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,0,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,30,0,0, - 78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,0,0,0,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, - 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0, - 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,0,0,0,0,0,0,0,0,0,109,109,109,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, - 43,43,43,43,43,43,43,43,43,43,43,0,0,0,0,0,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,0,0,0,0,0, - 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,0,162,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, - 113,113,113,113,0,0,0,0,113,113,113,113,113,113,113,113,113,113,113,113,113,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31, - 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132, - 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,0,0,120,120,120,120,120,120,120,120,120,120,0,0,0,0,0,0,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, - 119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,0,0,0,0,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,0,0,0,0, - 37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,0,0,0,0,0,0,0,0,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, - 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,0,0,0,0,0,0,0,0,0,0,0,19,164,164,164,164,164,164,164,164,164,164,164,0,164,164,164,164, - 164,164,164,164,164,164,164,164,164,164,164,0,164,164,164,164,164,164,164,0,164,164,0,164,164,164,164,164,164,164,164,164,164,164,0,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,0,164,164,164,164,164,164,164,0,164,164,0,0,0, - 159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,0,0,0,0,0,0,0,0,0,0,0,0, - 75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75, - 75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75, - 75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,0,0,0,0,0,0,0,0,0, - 75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,0,0,0,0,0,0,0,0,0,0,75,75,75,75,75,75,75,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 72,72,72,72,72,72,0,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,0,72,72,72,72,72,72,72,72,72,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 26,26,26,26,26,26,0,0,26,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,0,26,26,0,0,0,26,0,0,26, - 56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,0,56,56,56,56,56,56,56,56,56,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122, - 98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,0,0,0,0,0,0,0,0,98,98,98,98,98,98,98,98,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,53,53,0,0,0,0,0,53,53,53,53,53, - 125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,0,0,0,125,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,0,0,0,0,0,79, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,0,0,0,0,90,90,90,90, - 90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,0,0,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90, - 65,65,65,65,0,65,65,0,0,0,0,0,65,65,65,65,65,65,65,65,0,65,65,65,0,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,0,0,65,65,65,0,0,0,0,65, - 65,65,65,65,65,65,65,65,65,0,0,0,0,0,0,0,65,65,65,65,65,65,65,65,65,0,0,0,0,0,0,0,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115, - 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,0,0,0,0,84,84,84,84,84,84,84,84,84,84,84,84,0,0,0,0,0,0,0,0,0, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,6,6,6,6,6,6,6, - 58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,0,0,58,58,58,58,58,58,58,58,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,0,0,0,0,57,57,57,57,57,57,57,57, - 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,0,0,0,0,0,0,0,126,126,126,126,0,0,0,0,0,0,0,0,0,0,0,0,126,126,126,126,126,126,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, - 116,116,116,116,116,116,116,116,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,0,0,0,0,0,0,0,0,0,0,0,0,0, - 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,0,0,0,0,0,0,0,110,110,110,110,110,110, - 51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,0,0,0,0,0,0,0,0,51,51,51,51,51,51,51,51,51,51,0,0,0,0,0,0, - 40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,0,0,0,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40, - 40,40,40,40,40,40,0,0,0,0,0,0,0,0,40,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0, - 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,0,167,167,167,0,0,167,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, - 114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,0,0,0,0,0,0,0,0,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135, - 135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117, - 117,117,117,117,117,117,117,117,117,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, - 23,23,23,23,23,23,23,23,23,23,23,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,0,0,0,0,0,0,0,0,0, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,0,0,0,0,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,0,0,0,0,0,0,0,0,0,14, - 60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60, - 60,60,60,0,0,0,0,0,0,0,0,0,0,60,0,0,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,0,0,0,0,0,0,0,137,137,137,137,137,137,137,137,137,137,0,0,0,0,0,0, - 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,20,20,20,20,20,20,20,20,20,20, - 20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,0,0,0,0,0,0,0,0,0, - 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131, - 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,0,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,0,0,0,0,0,0,0,0,0,0,0, - 68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,0,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68, - 68,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 96,96,96,96,96,96,96,0,96,0,96,96,96,96,0,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,0,96,96,96,96,96,96,96,96,96,96,96,0,0,0,0,0,0,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69, - 69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,0,0,0,0,0,69,69,69,69,69,69,69,69,69,69,0,0,0,0,0,0, - 44,44,44,44,0,44,44,44,44,44,44,44,44,0,0,44,44,0,0,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,0,44,44,44,44,44,44,44,0,44,44,0,44,44,44,44,44,0,30,44,44,44,44, - 44,44,44,44,44,0,0,44,44,0,0,44,44,44,0,0,44,0,0,0,0,0,0,44,0,0,0,0,0,44,44,44,44,44,44,44,0,0,44,44,44,44,44,44,44,0,0,0,44,44,44,44,44,0,0,0,0,0,0,0,0,0,0,0, - 161,161,161,161,161,161,161,161,161,161,0,161,0,0,161,0,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,0,161,161,161,161,161,161,161,161,161, - 161,0,161,0,0,161,0,161,161,161,161,0,161,161,161,161,161,161,161,161,161,161,0,161,161,0,0,0,0,0,0,0,0,161,161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, - 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,0,101,101,101,101,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158, - 158,158,158,158,158,158,158,158,0,0,0,0,0,0,0,0,158,158,158,158,158,158,158,158,158,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,0,0,133,133,133,133,133,133,133,133, - 133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93, - 93,93,93,93,93,0,0,0,0,0,0,0,0,0,0,0,93,93,93,93,93,93,93,93,93,93,0,0,0,0,0,0,94,94,94,94,94,94,94,94,94,94,94,94,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,0,0,0,0,0,0, - 149,149,149,149,149,149,149,149,149,149,0,0,0,0,0,0,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166, - 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,0,0,0,0,0,0,0,0,0,0,0,0,166, - 33,33,33,33,33,33,33,0,0,33,0,0,33,33,33,33,33,33,33,33,0,33,33,0,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,0,33,33,0,0,33,33,33,33,33, - 33,33,33,33,33,33,33,0,0,0,0,0,0,0,0,0,33,33,33,33,33,33,33,33,33,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,100,100,100,100,100,100,100,0,0,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, - 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,0,0,100,100,100,100,100,100,100,100,100,100,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169, - 169,169,169,169,169,169,169,169,0,0,0,0,0,0,0,0,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138, - 138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,0,0,0,0,0,0,0, - 32,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,141,141,141,141,141,141,141,141,141,0,0,0,0,0,0, - 12,12,12,12,12,12,12,12,12,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85, - 85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,0,0,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,0,85,85,85,85,85,85,85,85,85,85,85,85,85,85,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 86,86,86,86,86,86,86,0,86,86,0,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,0,0,0,86,0,86,86,0,86, - 86,86,86,86,86,86,86,86,0,0,0,0,0,0,0,0,86,86,86,86,86,86,86,86,86,86,0,0,0,0,0,0,47,47,47,47,47,47,0,47,47,0,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47, - 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,0,47,47,0,47,47,47,47,47,47,0,0,0,0,0,0,0,47,47,47,47,47,47,47,47,47,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,0,0,0,0,0,0,0, - 63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,0,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,0,0,0,63,63, - 63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,0,0,0,0,0,0,0,0,0,0,0,0,0,150, - 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, - 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, - 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, - 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,0,139,139,139,139,139,0,0,0,0,0,0,0,0,0,0,0, - 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, - 139,139,139,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, - 27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,0,0,0,0,0,0,0,0,0,0,0,0,0, - 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36, - 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36, - 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36, - 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,0,0,0,0,0,0,0,0,0,0,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36, - 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36, - 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,0,0,0,0,0, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0,0,0, - 95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,0,95,95,95,95,95,95,95,95,95,95,0,0,0,0,95,95,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151, - 151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,0, - 151,151,151,151,151,151,151,151,151,151,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,0,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0, - 121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121, - 121,121,121,121,121,121,0,0,0,0,0,0,0,0,0,0,121,121,121,121,121,121,121,121,121,121,0,121,121,121,121,121,121,121,0,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,0,0,0,0,0,121,121,121, - 121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87, - 87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92, - 92,92,92,92,92,92,92,92,92,92,92,0,0,0,0,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92, - 92,92,92,92,92,92,92,92,0,0,0,0,0,0,0,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,104,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, - 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, - 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, - 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,0,0,0,0,0,0,0,0, - 66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66, - 66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66, - 66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66, - 66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66, - 152,152,152,152,152,152,152,152,152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,62,62,62,0,62,62,62,62,62,62,62,0,62,62,0, - 62,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55, - 55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55, - 55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55, - 55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55, - 55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,62,62,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,55,55,0,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,62,62,62,0,0,0,0,0,0,0,0,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104, - 104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104, - 104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104, - 104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104, - 104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,0,0,0,0, - 35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35, - 35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,0,0,0,0,0,35,35,35,35,35,35,35,35,35,35,35,35,35,0,0,0, - 35,35,35,35,35,35,35,35,35,0,0,0,0,0,0,0,35,35,35,35,35,35,35,35,35,35,0,0,35,35,35,35,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,0,0,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, - 30,30,30,30,30,30,30,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,30,30,30,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,30,30,30,30,30, - 30,30,30,29,29,30,30,30,30,30,30,30,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,30,30,30,30,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, - 45,45,45,45,45,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,29,29,0,0,29,0,0,29,29,0,0,29,29,29,29,0,29,29,29,29,29,29,29,29,29,29,29,29,0,29,0,29,29,29, - 29,29,29,29,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,0,29,29,29,29,0,0,29,29,29,29,29,29,29,29,0,29,29,29,29,29,29,29,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,29,29,29,29,0, - 29,29,29,29,29,0,29,0,0,0,29,29,29,29,29,29,29,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134, - 134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134, - 134,134,134,134,134,134,134,134,134,134,134,134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,134,134,134,134,0,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,0,0,0,0,0,0,72,72,72,72,72,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 42,42,42,42,42,42,42,0,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,0,0,42,42,42,42,42,42,42,0,42,42,0,42,42,42,42,42,0,0,0,0,0,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,0,0,0,105,105,105,105,105,105,105,105,105,105,105,105,105,105,0,0, - 105,105,105,105,105,105,105,105,105,105,0,0,0,0,105,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,0,0,0,0,0,165, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,0,0,0,108, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,39,39,39,39,39,39,0,39,39,39,39,0,39,39,0,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,0, - 89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89, - 89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89, - 89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89, - 89,89,89,89,89,0,0,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,0,4,0,0,4,0,4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,0,4,0,4,0,0,0,0, - 0,0,4,0,0,0,0,4,0,4,0,4,0,4,4,4,0,4,4,0,4,0,0,4,0,4,0,4,0,4,0,4,0,4,4,0,4,0,0,4,4,4,4,0,4,4,4,4,4,4,4,0,4,4,4,4,0,4,4,4,4,0,4,0, - 4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,4,4,4,0,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 55,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0, - 29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0, - 29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0, - 29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0, - 0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, - 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, - 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, - 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30, - 30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}; - -KBTS_INLINE kbts_u8 kbts_GetUnicodeScript(kbts_u32 Codepoint) -{ - return kbts_UnicodeScript_Data[((kbts_un)kbts_UnicodeScript_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)]; -} - -static kbts_u8 kbts_UnicodeFlags_PageIndices[8703] = { +static kbts_u8 kbts__UnicodeFlags_PageIndices[8703] = { 0,1,2,3,2,4,5,6,2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29, 30,31,32,33,34,35,36,37,38,33,33,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,2,2,2,55, - 56,57,58,59,33,33,60,33,61,33,33,33,33,33,62,63,33,33,33,64,33,33,65,66,67,68,69,70,71,72,33,73, - 74,75,76,77,78,33,33,33,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,80,79,2,2,2, + 56,57,58,59,60,61,62,33,63,33,33,33,33,33,64,65,33,33,33,66,67,68,69,70,71,72,73,74,75,76,33,77, + 78,79,80,81,82,33,33,33,83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,84,83,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,81, - 33,33,33,33,33,33,33,33,33,82,33,33,83,84,85,86,87,88,89,90,91,92,93,94,79,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,85, + 33,33,33,33,33,33,33,33,33,86,33,33,87,88,89,90,91,92,93,94,95,96,97,98,83,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,95,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,81,33,33,96,97,98,99,33,33,100,101,102,103,104,105, - 106,107,108,109,2,110,111,112,113,114,115,116,33,33,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134, - 135,136,137,138,139,140,141,142,143,144,2,145,146,147,148,2,149,150,151,152,153,154,2,155,156,157,158,159,2,160,161,162, - 33,33,33,33,33,33,33,37,163,33,164,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,165, - 33,33,33,33,33,33,33,33,166,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33, - 33,33,33,33,33,33,33,107,33,33,33,33,167,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,99,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,85,33,33,100,101,102,103,33,33,104,105,106,107,108,109, + 110,111,112,113,2,114,115,116,117,118,119,120,33,33,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138, + 139,140,141,142,143,144,145,146,147,148,2,149,150,151,152,2,153,154,155,156,157,158,2,159,160,161,162,163,2,164,165,166, + 33,33,33,33,33,33,33,37,167,33,168,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,169, + 33,33,33,33,33,33,33,33,170,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33, + 33,33,33,33,33,33,33,111,33,33,33,33,171,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,168,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33,33,169,170,171,172,2,2,173,2,2,174,175,176, - 79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,177,33,33,33,33,33,33,33,33,33,178,179,2,2,2,2,2, + 2,2,172,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33,33,173,174,175,176,2,2,177,2,2,178,179,180, + 83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,181,33,33,33,33,33,33,33,33,33,182,183,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,180, - 33,33,181,33,33,182,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,183,184,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,33,185,33,33,33,186,187,164, - 33,188,189,190,191,192,193,2,2,2,2,2,2,194,195,196,33,33,33,33,197,198,2,2,2,2,2,2,2,2,199,2, - 200,201,202,2,2,203,2,2,2,204,2,205,2,2,2,206,33,207,208,2,2,2,2,2,209,210,211,2,212,213,2,2, - 214,215,33,216,217,2,33,33,33,33,33,33,33,218,219,220,221,222,33,33,223,224,33,225,2,2,2,2,2,2,2,2, - 79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,184, + 33,33,185,33,33,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,187,188,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,33,189,33,33,33,190,191,168, + 33,192,193,194,195,196,197,2,2,2,2,2,2,198,199,200,33,33,33,33,201,202,2,2,2,2,2,2,2,2,203,2, + 204,205,206,2,2,207,2,2,2,208,2,209,2,2,2,210,33,211,212,2,2,2,2,2,213,214,215,2,216,217,2,2, + 218,219,33,220,221,2,33,33,33,33,33,33,33,222,223,224,225,226,33,33,227,228,33,229,2,2,2,2,2,2,2,2, + 83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, @@ -7842,15 +8581,15 @@ static kbts_u8 kbts_UnicodeFlags_PageIndices[8703] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,226,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,227,2,228,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,229,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,230,83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,231,2,232,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,233,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,230,2,2,2,2,231,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33,33,232,2,2,2,2,2,2,2,2,2,2,2, - 79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,233,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,234,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,234,2,2,2,2,235,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33,33,236,2,2,2,2,2,2,2,2,2,2,2, + 83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,237,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,238,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, @@ -8024,7 +8763,7 @@ static kbts_u8 kbts_UnicodeFlags_PageIndices[8703] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 235,235,236,237,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 239,239,240,241,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, @@ -8040,7 +8779,7 @@ static kbts_u8 kbts_UnicodeFlags_PageIndices[8703] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, @@ -8055,8 +8794,8 @@ static kbts_u8 kbts_UnicodeFlags_PageIndices[8703] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,238, - 79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,242, + 83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, @@ -8074,10 +8813,10 @@ static kbts_u8 kbts_UnicodeFlags_PageIndices[8703] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, }; -static kbts_u8 kbts_UnicodeFlags_Data[30592] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,4,0,0,16,0,0,0,0,48,48,48,48,48,48,48,48,48,48,0,0,16,16,16,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,0,16,16,16,0,16,2,16,16,16,16,16,16,16,0,0,0,16,16,16,0,16,16,16,0, +static kbts_u8 kbts__UnicodeFlags_Data[31104] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,4,8,0,16,0,0,0,0,48,48,48,48,48,48,48,48,48,48,0,0,28,16,28,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,8,16,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,16,8,16,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,0,16,16,16,12,16,2,16,16,16,16,16,16,16,0,0,0,16,16,16,12,16,16,16,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -8131,7 +8870,7 @@ static kbts_u8 kbts_UnicodeFlags_Data[30592] = { 16,16,16,16,16,16,16,80,80,80,80,80,80,80,80,0,48,48,48,48,48,48,48,48,48,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,16,16,0,16,0,16,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,16,0,16,16,16,16,16,16,16,16,16,16,80,16,16,80,80,80,80,80,80,80,80,80,16,0,0, 16,16,16,16,16,0,16,0,80,80,80,80,80,80,80,0,48,48,48,48,48,48,48,48,48,48,0,0,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,16,16,80,80,16,16,16,16,16,16,48,48,48,48,48,48,48,48,48,48,16,16,16,16,16,16,16,16,16,16,16,80,16,80,16,80,0,0,0,0,16,16, + 16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,16,16,80,80,16,16,16,16,16,16,48,48,48,48,48,48,48,48,48,48,16,16,16,16,16,16,16,16,16,16,16,80,16,80,16,80,4,8,4,8,16,16, 16,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,80,80,80,80,80,80,80,80,80,80,80,80,80,80,16, 80,80,80,80,80,0,80,80,16,16,16,16,16,80,80,80,80,80,80,80,80,80,80,80,0,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,0,16,16, 16,16,16,16,16,16,80,16,16,16,16,16,16,0,16,16,0,0,0,0,0,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -8155,7 +8894,7 @@ static kbts_u8 kbts_UnicodeFlags_Data[30592] = { 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,4,8,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,80,80,80,16,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,80,80,16,0,0,0,0,0,0,0,0,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,80,80,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,0,16,16,16,0,80,80,0,0,0,0,0,0,0,0,0,0,0,0, @@ -8187,28 +8926,36 @@ static kbts_u8 kbts_UnicodeFlags_Data[30592] = { 80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16, 16,16,0,0,0,0,0,0,0,0,0,0,0,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,0, - 0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,16,16,0,0,16,16,16,16,16,16,16,16,16,0,0,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0,0, + 0,0,0,0,16,4,8,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,16,16,0,0,16,16,16,16,16,16,16,16,16,4,8,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,4,8,0,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,80,80,80,80,80,80,80,80,80,80,80,80,16,16,16,16,80,16,16,16,80,80,80,80,80,80,80,80,80,80,80,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 16,16,0,16,16,16,16,0,16,16,0,0,0,0,0,0,0,0,0,0,16,0,16,16,16,0,0,0,0,0,16,16,16,16,16,16,0,16,0,16,0,16,0,0,0,0,16,0,0,0,0,0,0,16,16,16,16,0,16,16,0,0,0,0, 16,16,16,16,16,0,0,0,0,0,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,0,0,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,28,28,28,28,28,28,16,16,16,16,16,16,16,28,16,16,16,16,16,16,16,16,16,28,28,28,28,16,28,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,28,28,16,16, + 16,16,16,28,16,28,16,16,16,16,16,16,28,16,16,16,16,16,28,28,28,28,16,16,16,16,16,16,16,16,16,16,16,16,16,16,28,28,28,28,28,28,28,28,16,16,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, + 28,28,28,28,28,28,28,28,28,28,28,28,16,16,16,28,28,28,28,16,16,16,16,16,28,16,16,16,16,16,16,16,16,16,28,28,16,16,28,16,28,28,16,28,16,16,16,16,28,28,28,28,28,28,28,28,28,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,28,28,28,28,28,16,16,28,28,16,16,16,16,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,16,16,28,28,28,28,28,16,28,28,16,16,28,28,28,28,28,16, + 16,16,16,16,16,16,16,16,4,8,4,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,4,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,4,8,4,8,4,8,4,8,4,8,4,8,4,8,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,16,16, + 16,16,16,28,28,4,8,16,28,28,16,28,16,28,16,16,16,16,16,16,16,28,28,16,16,16,16,16,28,28,28,16,16,16,28,28,28,28,4,8,4,8,4,8,4,8,4,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,4,8,4,8,4,8,4,8,4,8,4,8,4,8,4,8,4,8,4,8,4,8,16,16,28,16,16,16,16,28,16,16,28,28,28,16,16,28,28,28,28,28,28,28,28,16,16,16,16,16,16,16,16,28,16,16,16,16,16,16,16, + 28,28,16,16,28,28,16,16,16,16,16,16,16,16,16,28,28,28,28,16,28,28,16,16,4,8,4,8,16,16,16,16,16,16,16,16,16,16,16,16,28,28,16,16,16,16,16,16,16,16,16,16,16,28,16,16,28,28,16,16,4,8,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,28,28,28,28,16,16,16,16,16,28,28,16,16,16,16,16,16,28,28,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,28,28,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,28,28,28,28,28,28,28, + 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,16,16,16,28,28,28,28,28,28,28,28,16,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, + 28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,16,16,16,16,16,16,16,28,16,16,16,16,28,28,28,16,16,16,16,16,16,28,28,28,16,16,16,16,16,16,16,16,28,28,28,28,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,28,16, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -8217,13 +8964,13 @@ static kbts_u8 kbts_UnicodeFlags_Data[30592] = { 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,0, 16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,0,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,12,12,12,12,0,0,0,12,12,0,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,0,0,12,12,4,8,4,8,4,8,4,8,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,0,0,0,4,8,4,8,4,8,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 0,0,0,0,16,16,16,16,0,0,0,0,0,0,0,0,0,0,16,16,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,80,80,80,80,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,0,16,16, + 0,0,0,0,16,16,16,16,4,8,4,8,4,8,4,8,4,8,16,16,4,8,4,8,4,8,4,8,0,0,0,0,16,16,16,16,16,16,16,16,16,16,80,80,80,80,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,0,16,16, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,80,80,16,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,16,16,16,16, @@ -8280,11 +9027,11 @@ static kbts_u8 kbts_UnicodeFlags_Data[30592] = { 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,16,16,0,0,16,0,0,0,0,0,0,16,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,4,8,4,8,0,0,0,16,0,28,28,16,0,0,16,0,0,0,0,0,0,16,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,2, - 0,0,0,0,16,0,0,0,0,0,0,16,0,0,0,0,48,48,48,48,48,48,48,48,48,48,0,0,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0, - 16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 0,0,0,0,16,0,0,0,4,8,0,16,0,0,0,0,48,48,48,48,48,48,48,48,48,48,0,0,28,16,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,8,16,0, + 16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,16,8,16,4,8,0,4,8,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 0,0,16,16,16,16,16,16,0,0,16,16,16,16,16,16,0,0,16,16,16,16,16,16,0,0,16,16,16,0,0,0,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,0,2,2,2,2,2,2,2,2,2,0,0,0,16,16,0,0, 16,16,16,16,16,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,16,16,0,16, @@ -8555,12 +9302,12 @@ static kbts_u8 kbts_UnicodeFlags_Data[30592] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0, }; -KBTS_INLINE kbts_u8 kbts_GetUnicodeFlags(kbts_u32 Codepoint) +KBTS_INLINE kbts_u8 kbts__GetUnicodeFlags(kbts_u32 Codepoint) { - return kbts_UnicodeFlags_Data[((kbts_un)kbts_UnicodeFlags_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)]; + return (Codepoint < 1114110) ? kbts__UnicodeFlags_Data[((kbts_un)kbts__UnicodeFlags_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)] : 0; } -static kbts_u8 kbts_UnicodeBidirectionalClass_PageIndices[8703] = { +static kbts_u8 kbts__UnicodeBidirectionalClass_PageIndices[8703] = { 0,1,2,2,2,3,4,5,2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28, 29,30,2,2,31,32,33,34,35,2,2,2,2,36,37,38,39,40,41,42,43,44,45,46,47,48,2,49,2,2,50,51, 52,53,54,55,56,57,58,59,57,60,57,57,57,61,57,57,2,2,57,57,57,57,57,57,2,62,63,64,57,57,57,57, @@ -8785,7 +9532,7 @@ static kbts_u8 kbts_UnicodeBidirectionalClass_PageIndices[8703] = { 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,228,229,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, + 228,57,229,230,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, @@ -8816,7 +9563,7 @@ static kbts_u8 kbts_UnicodeBidirectionalClass_PageIndices[8703] = { 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, - 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,230, + 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,231, 73,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, @@ -8835,477 +9582,479 @@ static kbts_u8 kbts_UnicodeBidirectionalClass_PageIndices[8703] = { 57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57, }; -static kbts_u8 kbts_UnicodeBidirectionalClass_Data[29568] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,0,0,0,0,0,7,9,7,9,9,6,6,6,6,6,6,6,6,6,6,9,0,0,0,0,0, - 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,8,8,8,8,0,0,0,0,1,0,0,0,0,0,8,8,6,6,0,1,0,0,0,6,1,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,0,0,1,1,0,0,1,1,1,1,0,1, - 0,0,0,0,0,0,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, - 1,1,1,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,8,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3, - 2,3,3,2,3,3,2,3,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0, - 5,5,5,5,5,5,0,0,4,8,8,4,9,4,0,0,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,8,5,5,4,4,4,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +static kbts_u8 kbts__UnicodeBidirectionalClass_Data[29696] = { + 1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,9,9,9,0,0,0,0,0,8,10,8,10,10,7,7,7,7,7,7,7,7,7,7,10,0,0,0,0,0, + 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,1, + 1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,0,9,9,9,9,0,0,0,0,2,0,0,1,0,0,9,9,7,7,0,2,0,0,0,7,2,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2, + 2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,5,0,3,3,3,3,3,3,4,4,3,3,0,3,3,3,3,4,4,6,6,6,6,6,6,6,6,6,6,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,2,2,0,0,0,0,2,0,0,3,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,2,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,0,0,2,0,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,5,5,0,0,0,0,0,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1, - 1,3,3,3,3,3,3,3,3,1,1,1,1,3,1,1,1,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,3,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,1,0,0,3,1,1,1, - 1,3,3,3,3,0,0,1,1,0,0,1,1,3,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1,3,3,0,0,1,1,1,1,1,1,1,1,1,1,1,1,8,8,1,1,1,1,1,1,1,8,1,1,3,0, - 0,3,3,1,0,1,1,1,1,1,1,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,1,0,0,3,0,1,1, - 1,3,3,0,0,0,0,3,3,0,0,3,3,3,0,0,0,3,0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,3,1,0,0,0,0,0,0,0,0,0, - 0,3,3,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,3,1,1,1, - 1,3,3,3,3,3,0,3,3,1,0,1,1,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,0,0,1,1,1,1,1,1,1,1,1,1,1,8,0,0,0,0,0,0,0,1,3,3,3,3,3,3, - 0,3,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,3,1,1,3, - 1,3,3,3,3,0,0,1,1,0,0,1,1,3,0,0,0,0,0,0,0,3,3,1,0,0,0,0,1,1,0,1,1,1,3,3,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 0,0,3,1,0,1,1,1,1,1,1,0,0,0,1,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,1,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1, - 3,1,1,0,0,0,1,1,1,0,1,1,1,3,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,8,0,0,0,0,0,0, - 3,1,1,1,3,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,3,1,3,3, - 3,1,1,1,1,0,3,3,3,0,3,3,3,3,0,0,0,0,0,0,0,3,3,0,1,1,1,0,0,1,0,0,1,1,3,3,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, - 1,3,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,3,1,1,1, - 1,1,1,1,1,0,1,1,1,0,1,1,3,3,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,1,1,3,3,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 3,3,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1, - 1,3,3,3,3,0,1,1,1,0,1,1,1,3,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0,3,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0, - 1,1,1,1,1,1,1,0,0,0,3,0,0,0,0,1,1,1,3,3,3,0,3,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,3,3,3,3,3,3,3,0,0,0,0,8, - 1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,3,1,1,3,3,3,3,3,3,3,3,3,1,0,0, - 1,1,1,1,1,0,1,0,3,3,3,3,3,3,3,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,3,0,0,0,0,1,1, - 1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1, - 3,3,3,3,3,1,3,3,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,1,1, - 1,1,1,1,1,1,3,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,1,3,3,3,3,3,3,1,3,3,1,1,3,3,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1, - 1,1,3,1,1,3,3,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,0, - 1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0, - 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,3,3,3,3,3,3,3,1,1, - 1,1,1,1,1,1,3,1,1,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,8,1,3,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,3,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, - 1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,3,3,3,1,1,1,1,3,3,1,1,1,0,0,0,0,1,1,3,1,1,1,1,1,1,3,3,3,0,0,0,0, - 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,3,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,3,3,3,3,3,3,0,3,1,3,1,1,3,3,3,3,3,3,3,3,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,0,0,3, - 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,3,3,3,3,1,3,1,1,1, - 1,1,3,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1, - 3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,1,1,3,3,1,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,3,1,1,1,3,1,3,3,3,1,1,0,0,0,0,0,0,0,0,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,1,1,3,3,0,0,0,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,1,1,1,1,3,1,1,1,1,1,1,3,1,1,1,3,3,1,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0, - 0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,8,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,1,0,0,6,6,6,6,6,6,7,7,0,0,0,1, - 6,6,6,6,6,6,6,6,6,6,7,7,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,1,0,1,0,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1, - 0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,3,3,3,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0, - 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,3,3,3,3,1,1,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0, - 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,3,3,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1, - 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,3,1,1,1,3,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,0,0,0,0,3,0,0,0,1,1,1,1,1,1,1,1,8,8,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,3,3,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, - 3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,3,3,3,3,1,1,3,3,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,1,1,3,3,1,1,3,3,0,0,0,0,0,0,0,0,0, - 1,1,1,3,1,1,1,1,1,1,1,1,3,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,3,3,1,1,3,3,1,1,1,1,1,3,3, - 1,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0,0, - 0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,3,1,1,1,1,3,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,2,3,2,2,2,2,2,2,2,2,2,2,7,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,0,2,0, - 2,2,0,2,2,0,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,9,0,0,9,0,0,0,0,0,0,0,0,0,8,0,0,7,7,0,0,0,0,0,8,8,0,0,0,0,0,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0, - 0,0,0,8,8,8,0,0,0,0,0,7,9,7,9,9,6,6,6,6,6,6,6,6,6,6,9,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, - 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, - 0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0,0,0,8,8,0,0,0,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, - 1,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,2,2,2,2,2,0,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,2,0,0,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,2, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,3,3,3,0,3,3,0,0,0,0,0,3,3,3,3,2,2,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,3,3,3,0,0,0,0,3, - 2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,0,0,2,2,0,0,2,2,2,2,0,2, + 0,0,0,0,0,0,2,0,2,2,2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2, + 2,2,2,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,9,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,4, + 3,4,4,3,4,4,3,4,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0, + 6,6,6,6,6,6,0,0,5,9,9,5,10,5,0,0,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,6,6,6,6,9,6,6,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,6,0,4,4,4,4,4,4,5,5,4,4,0,4,4,4,4,5,5,7,7,7,7,7,7,7,7,7,7,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,3,3,0,0,0,0,3,0,0,4,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,3,4,4,4,4,4,4,4,4,4,3,4,4,4,3,4,4,4,4,4,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,0,0,3,0,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,6,6,0,0,0,0,0,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,4,2,2,2, + 2,4,4,4,4,4,4,4,4,2,2,2,2,4,2,2,2,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,4,2,2,0,2,2,2,2,2,2,2,2,0,0,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,0,0,0,2,2,2,2,0,0,4,2,2,2, + 2,4,4,4,4,0,0,2,2,0,0,2,2,4,2,0,0,0,0,0,0,0,0,2,0,0,0,0,2,2,0,2,2,2,4,4,0,0,2,2,2,2,2,2,2,2,2,2,2,2,9,9,2,2,2,2,2,2,2,9,2,2,4,0, + 0,4,4,2,0,2,2,2,2,2,2,0,0,0,0,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,0,2,2,0,2,2,0,0,4,0,2,2, + 2,4,4,0,0,0,0,4,4,0,0,4,4,4,0,0,0,4,0,0,0,0,0,0,0,2,2,2,2,0,2,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,4,2,0,0,0,0,0,0,0,0,0, + 0,4,4,2,0,2,2,2,2,2,2,2,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,0,2,2,2,2,2,0,0,4,2,2,2, + 2,4,4,4,4,4,0,4,4,2,0,2,2,4,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,4,4,0,0,2,2,2,2,2,2,2,2,2,2,2,9,0,0,0,0,0,0,0,2,4,4,4,4,4,4, + 0,4,2,2,0,2,2,2,2,2,2,2,2,0,0,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,0,2,2,2,2,2,0,0,4,2,2,4, + 2,4,4,4,4,0,0,2,2,0,0,2,2,4,0,0,0,0,0,0,0,4,4,2,0,0,0,0,2,2,0,2,2,2,4,4,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0, + 0,0,4,2,0,2,2,2,2,2,2,0,0,0,2,2,2,0,2,2,2,2,0,0,0,2,2,0,2,0,2,2,0,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2, + 4,2,2,0,0,0,2,2,2,0,2,2,2,4,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,9,0,0,0,0,0,0, + 4,2,2,2,4,2,2,2,2,2,2,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,4,2,4,4, + 4,2,2,2,2,0,4,4,4,0,4,4,4,4,0,0,0,0,0,0,0,4,4,0,2,2,2,0,0,2,0,0,2,2,4,4,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,2, + 2,4,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,0,0,4,2,2,2, + 2,2,2,2,2,0,2,2,2,0,2,2,4,4,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,2,2,0,2,2,4,4,0,0,2,2,2,2,2,2,2,2,2,2,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, + 4,4,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2, + 2,4,4,4,4,0,2,2,2,0,2,2,2,4,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 0,4,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,0,2,0,0, + 2,2,2,2,2,2,2,0,0,0,4,0,0,0,0,2,2,2,4,4,4,0,4,0,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0, + 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,4,4,4,4,4,4,4,0,0,0,0,9, + 2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,2,2,0,2,0,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2,2,2,2,2,2,2,2,4,2,2,4,4,4,4,4,4,4,4,4,2,0,0, + 2,2,2,2,2,0,2,0,4,4,4,4,4,4,4,0,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,4,2,4,0,0,0,0,2,2, + 2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2, + 4,4,4,4,4,2,4,4,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,2,2, + 2,2,2,2,2,2,4,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,2,4,4,4,4,4,4,2,4,4,2,2,4,4,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2, + 2,2,4,2,2,4,4,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,0,2,0,0,0,0,0,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2,0,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2,0, + 2,0,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,0, + 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,2,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,4,4,4,4,4,4,4,2,2, + 2,2,2,2,2,2,4,2,2,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,9,2,4,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,4,4,1,4,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0, + 2,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,4,4,4,2,2,2,2,4,4,2,2,2,0,0,0,0,2,2,4,2,2,2,2,2,2,4,4,4,0,0,0,0, + 0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,4,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,4,4,4,4,4,4,4,0,4,2,4,2,2,4,4,4,4,4,4,4,4,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,0,0,4, + 2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,4,4,4,4,4,2,4,2,2,2, + 2,2,4,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2, + 4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,2,2,4,4,2,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,4,4,2,2,2,4,2,4,4,4,2,2,0,0,0,0,0,0,0,0,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,2,2,4,4,0,0,0,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2, + 2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,4,4,4,2,4,4,4,4,4,4,4,4,4,4,4,4,4,2,4,4,4,4,4,4,4,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,4,4,2,0,0,0,0,0, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,2,0,2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,0, + 0,0,2,2,2,0,2,2,2,2,2,2,2,0,0,0,2,2,2,2,0,0,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,2,2,2,0,2,2,2,2,2,2,2,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,7,2,0,0,7,7,7,7,7,7,8,8,0,0,0,2, + 7,7,7,7,7,7,7,7,7,7,8,8,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,0,2,0,0,2,2,2,2,2,2,2,2,2,2,0,2,0,0,0,2,2,2,2,2,0,0,0,0,0,0,2,0,2,0,2,0,2,2,2,2,9,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2, + 0,0,0,0,0,2,2,2,2,2,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,4,4,4,2,2,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,0,0,0,0,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0, + 2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,4,4,4,4,2,2,0,2,2,2,2,2,0,0,2,2,2,2,2,0,0,0, + 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,4,4,0,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2, + 0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,0,2,0,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,4,2,2,2,4,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,0,0,0,0,4,0,0,0,2,2,2,2,2,2,2,2,9,9,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,4,4,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,4, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0, + 4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,4,4,4,4,2,2,4,4,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,2,2,4,4,2,2,4,4,0,0,0,0,0,0,0,0,0, + 2,2,2,4,2,2,2,2,2,2,2,2,4,2,0,0,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,4,4,4,2,2,4,4,2,2,2,2,2,4,4, + 2,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,2,2,4,0,0,0,0,0,0,0,0,0, + 0,2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,4,2,2,2,2,4,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,3,4,3,3,3,3,3,3,3,3,3,3,8,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,0,3,0, + 3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,10,0,0,0,0,0,0,0,0,0,9,0,0,8,8,0,0,0,0,0,9,9,0,0,0,0,0,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,1, + 0,0,0,9,9,9,0,0,0,0,0,8,10,8,10,10,7,7,7,7,7,7,7,7,7,7,10,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0, + 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, + 0,0,2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,0,2,2,2,0,0,0,9,9,0,0,0,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0, + 2,0,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,0,0,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,0,0,0,3,0,0,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,0,0,0,0,0,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,3, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,4,4,4,0,4,4,0,0,0,0,0,4,4,4,4,3,3,3,3,0,3,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,4,4,4,0,0,0,0,4, + 3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,3,3,3,3,3,3, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0, + 6,6,6,6,6,6,6,6,6,6,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,4,4,4,4,4,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,4,4,3,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,4,4,4,4,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0, + 2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,4,2,2,4,4,2,0,0,0,0,0,0,0,0,0,4, + 4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,2,2,4,4,2,2,2,2,2, + 2,2,4,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0, + 4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,2,4,4,4,4,4,4,4,4,0,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,0,0,0,0,0,0,0,0,0, + 4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,2, + 2,2,2,2,2,2,2,2,2,4,4,4,4,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,2,2,4,2,4,4,2,2,2,2,2,2,4,2, + 2,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,0,2,0,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,4,4,4,4,4,4,4,4,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0, + 4,4,2,2,0,2,2,2,2,2,2,2,2,0,0,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,0,2,2,2,2,2,0,4,4,2,2,2, + 4,2,2,2,2,0,0,2,2,0,0,2,2,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,2,2,2,2,2,2,2,0,0,4,4,4,4,4,4,4,0,0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,0,2,0,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,4,4,4,4,4, + 4,0,2,0,0,2,0,2,2,2,2,0,2,2,4,2,4,2,4,2,2,2,0,2,2,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4, + 2,2,4,4,4,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,4,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,2,4,2,2,2,2,4, + 4,2,4,4,2,2,2,2,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,0,0,2,2,2,2,4,4,2,4, + 4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,2,2,4,2,4, + 4,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,4,2,2,4,4,4,4,4,4,2,4,2,2,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,4,2,4,2,2,4,4,4,4,2,4,4,4,4,4,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,2,4,4,2,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2, + 2,2,2,2,2,2,2,0,0,2,0,0,2,2,2,2,2,2,2,2,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,4,4,2,4,2, + 2,2,2,4,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,0,0,4,4,2,2,2,2,4,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,4,4,4,4,4,4,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,2,2,4,4,4,4,2, + 2,2,2,2,2,2,2,4,0,0,0,0,0,0,0,0,2,4,4,4,4,4,4,2,2,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,2,4,4,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,0,4,4,4,4,4,4,2,2, + 2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,2,4,4,4,4,4,4,4,2,4,4,2,4,4,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,0,0,0,4,0,4,4,0,4, + 4,4,4,4,4,4,2,4,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,4,4,0,2,2,4,2,4,2,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,0,0,0,0,0,0,0, + 4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,0,0,0,2,2, + 4,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0, - 5,5,5,5,5,5,5,5,5,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,3,3,3,3,3,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,3,3,2,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,3,3,3,3,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0, - 1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,3,1,1,3,3,1,0,0,0,0,0,0,0,0,0,3, - 3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,1,1,3,3,1,1,1,1,1, - 1,1,3,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, - 3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,1,3,3,3,3,3,3,3,3,0,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,0,0,0,0,0,0,0,0,0, - 3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,1, - 1,1,1,1,1,1,1,1,1,3,3,3,3,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,1,1,3,1,3,3,1,1,1,1,1,1,3,1, - 1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,3,3,3,3,3,3,3,3,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, - 3,3,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,3,3,1,1,1, - 3,1,1,1,1,0,0,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0,3,3,3,3,3,3,3,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,3,3,3,3,3, - 3,0,1,0,0,1,0,1,1,1,1,0,1,1,3,1,3,1,3,1,1,1,0,1,1,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3, - 1,1,3,3,3,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,1,3,1,1,1,1,3, - 3,1,3,3,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,0,0,1,1,1,1,3,3,1,3, - 3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,1,1,3,1,3, - 3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,3,3,3,3,3,3,1,3,1,1,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,3,1,3,1,1,3,3,3,3,1,3,3,3,3,3,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,1,3,3,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1, - 1,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,3,3,1,3,1, - 1,1,1,3,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,0,0,3,3,1,1,1,1,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,3,3,3,3,3,3,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,1,1,3,3,3,3,1, - 1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0,1,3,3,3,3,3,3,1,1,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,0,3,3,3,3,3,3,1,1, - 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,1,3,3,3,3,3,3,3,1,3,3,1,3,3,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,0,0,0,3,0,3,3,0,3, - 3,3,3,3,3,3,1,3,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,3,3,0,1,1,3,1,3,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,0,0,0,0,0,0,0, - 3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,0,0,0,1,1, - 3,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 3,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,3,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, - 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,3,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,3,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, - 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,3,3,3,3,3, - 3,3,3,1,1,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1, - 1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0, - 1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,0,1,1,1,1,1,1,1,1,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,3,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,3,3,3,3,3,3,3,1,1,1,1,1,1,1,0,0, - 1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,8, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 4,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,4,4,4,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, + 2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,4,4,4,4,4,2,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,3,3,3,3,3,3,3,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,2,4,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,0,4,0,0,4,0,4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,0,4,0,4,0,0,0,0, - 0,0,4,0,0,0,0,4,0,4,0,4,0,4,4,4,0,4,4,0,4,0,0,4,0,4,0,4,0,4,0,4,0,4,4,0,4,0,0,4,4,4,4,0,4,4,4,4,4,4,4,0,4,4,4,4,0,4,4,4,4,0,4,0, - 4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,4,4,4,0,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, - 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0, + 2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,2,4,4,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,4,4,4,4,4, + 4,4,4,2,2,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,2,0,0,2,2,0,0,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2, + 2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,0, + 2,2,2,2,2,0,2,0,0,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,0,2,2,2,2,2,2,2,2,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,4,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,4,4,4,4,4,4,4,0,4,4,0,4,4,4,4,4,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,4,4,4,4,4,4,4,2,2,2,2,2,2,2,0,0, + 2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,9, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,2,2,2,2,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,4,4,4,4,4,4,4,3,0,0,0,0,3,3,3,3,3,3,3,3,3,3,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,0,5,0,0,5,0,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,0,5,0,5,0,0,0,0, + 0,0,5,0,0,0,0,5,0,5,0,5,0,5,5,5,0,5,5,0,5,0,0,5,0,5,0,5,0,5,0,5,0,5,5,0,5,0,0,5,5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5,0,5,5,5,5,0,5,0, + 5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,5,5,5,0,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, + 2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, }; -KBTS_INLINE kbts_u8 kbts_GetUnicodeBidirectionalClass(kbts_u32 Codepoint) +KBTS_INLINE kbts_u8 kbts__GetUnicodeBidirectionalClass(kbts_u32 Codepoint) { - return kbts_UnicodeBidirectionalClass_Data[((kbts_un)kbts_UnicodeBidirectionalClass_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)]; + return (Codepoint < 1114110) ? kbts__UnicodeBidirectionalClass_Data[((kbts_un)kbts__UnicodeBidirectionalClass_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)] : 0; } -static kbts_u8 kbts_UnicodeJoiningType_PageIndices[8703] = { +static kbts_u8 kbts__UnicodeJoiningType_PageIndices[8703] = { 0,1,0,0,0,0,2,0,0,3,0,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,0,0,0,0,27,0,0,0,0,0,0,0,28,29,30,31,32,0,33,34,35,36,37,38,0,39,0,0,0,0, 40,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,43,44,0,0,0,0, @@ -9580,7 +10329,7 @@ static kbts_u8 kbts_UnicodeJoiningType_PageIndices[8703] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; -static kbts_u8 kbts_UnicodeJoiningType_Data[14848] = { +static kbts_u8 kbts__UnicodeJoiningType_Data[14848] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -9815,12 +10564,12 @@ static kbts_u8 kbts_UnicodeJoiningType_Data[14848] = { 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, }; -KBTS_INLINE kbts_u8 kbts_GetUnicodeJoiningType(kbts_u32 Codepoint) +KBTS_INLINE kbts_u8 kbts__GetUnicodeJoiningType(kbts_u32 Codepoint) { - return kbts_UnicodeJoiningType_Data[((kbts_un)kbts_UnicodeJoiningType_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)]; + return (Codepoint < 1114110) ? kbts__UnicodeJoiningType_Data[((kbts_un)kbts__UnicodeJoiningType_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)] : 0; } -static kbts_u8 kbts_UnicodeCombiningClass_PageIndices[8703] = { +static kbts_u8 kbts__UnicodeCombiningClass_PageIndices[8703] = { 0,0,0,0,0,0,1,0,0,2,0,3,4,5,6,7,8,9,10,11,12,12,12,13,14,12,15,16,17,18,19,20, 21,22,0,0,0,0,23,0,0,0,0,0,0,0,24,25,0,26,27,0,28,29,30,31,32,33,0,34,0,0,0,0, 0,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,37,38,0,0,0,0, @@ -10095,7 +10844,7 @@ static kbts_u8 kbts_UnicodeCombiningClass_PageIndices[8703] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; -static kbts_u8 kbts_UnicodeCombiningClass_Data[12288] = { +static kbts_u8 kbts__UnicodeCombiningClass_Data[12288] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220,220,220,220,220,220,220,220,220,1,1,1,1,1,220,220,220,220,230,230,230, @@ -10290,12 +11039,12 @@ static kbts_u8 kbts_UnicodeCombiningClass_Data[12288] = { 0,0,0,0,230,230,230,230,230,230,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; -KBTS_INLINE kbts_u8 kbts_GetUnicodeCombiningClass(kbts_u32 Codepoint) +KBTS_INLINE kbts_u8 kbts__GetUnicodeCombiningClass(kbts_u32 Codepoint) { - return kbts_UnicodeCombiningClass_Data[((kbts_un)kbts_UnicodeCombiningClass_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)]; + return (Codepoint < 1114110) ? kbts__UnicodeCombiningClass_Data[((kbts_un)kbts__UnicodeCombiningClass_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)] : 0; } -static kbts_u16 kbts_UnicodeParentInfo_PageIndices[34815] = { +static kbts_u16 kbts__UnicodeParentInfo_PageIndices[34815] = { 0,1,2,3,0,4,5,6,7,0,8,9,0,10,0,11,0,12,0,0,13,14,0,0,15,0,0,0,16,17,18,0, 19,20,21,22,0,0,23,24,0,0,0,0,0,0,25,26,0,27,28,0,0,0,29,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,30,31,0,0,0,32,33,0,34,35,0,0,0,0,0,0,0,36,37,0,0,0,38,0, @@ -11386,7 +12135,7 @@ static kbts_u16 kbts_UnicodeParentInfo_PageIndices[34815] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; -static kbts_u32 kbts_UnicodeParentInfo_Data[20960] = { +static kbts_u32 kbts__UnicodeParentInfo_Data[20960] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66400,66423,66421,66422,0, 0,1048664,197177,328094,393598,1114167,66418,459018,459046,983176,65810,393556,393562,197183,590017,1048696,131720,0,524539,459032,459067,1245203,131728,393604,131730,590026,393592,0,0,0,0,0, @@ -12044,12 +12793,12 @@ static kbts_u32 kbts_UnicodeParentInfo_Data[20960] = { 66424,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; -KBTS_INLINE kbts_u32 kbts_GetUnicodeParentInfo(kbts_u32 Codepoint) +KBTS_INLINE kbts_u32 kbts__GetUnicodeParentInfo(kbts_u32 Codepoint) { - return kbts_UnicodeParentInfo_Data[((kbts_un)kbts_UnicodeParentInfo_PageIndices[Codepoint/32] * 32) | (Codepoint & 31)]; + return (Codepoint < 1114110) ? kbts__UnicodeParentInfo_Data[((kbts_un)kbts__UnicodeParentInfo_PageIndices[Codepoint/32] * 32) | (Codepoint & 31)] : 0; } -static kbts_u8 kbts_UnicodeUseClass_PageIndices[4351] = { +static kbts_u8 kbts__UnicodeUseClass_PageIndices[4351] = { 0,1,1,1,1,1,2,3,4,5,6,7,8,9,10,11,12,1,1,1,1,1,1,13,14,15,16,17,18,19,1,1, 20,1,1,1,1,21,1,22,1,1,1,1,1,23,24,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -12188,7 +12937,7 @@ static kbts_u8 kbts_UnicodeUseClass_PageIndices[4351] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, }; -static kbts_u8 kbts_UnicodeUseClass_Data[16896] = { +static kbts_u8 kbts__UnicodeUseClass_Data[16896] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,21,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0, @@ -12455,53 +13204,1679 @@ static kbts_u8 kbts_UnicodeUseClass_Data[16896] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; -KBTS_INLINE kbts_u8 kbts_GetUnicodeUseClass(kbts_u32 Codepoint) +KBTS_INLINE kbts_u8 kbts__GetUnicodeUseClass(kbts_u32 Codepoint) { - return kbts_UnicodeUseClass_Data[((kbts_un)kbts_UnicodeUseClass_PageIndices[Codepoint/256] * 256) | (Codepoint & 255)]; + return (Codepoint < 1114110) ? kbts__UnicodeUseClass_Data[((kbts_un)kbts__UnicodeUseClass_PageIndices[Codepoint/256] * 256) | (Codepoint & 255)] : 0; } -KBTS_INLINE kbts_u32 kbts_GetDecompositionSize(kbts_u64 Decomposition) +static kbts_u8 kbts__UnicodeScriptExtension_PageIndices[8703] = { + 0,1,2,2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29, + 30,31,32,32,33,34,35,36,37,37,37,37,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,2,2,53,54, + 55,56,57,58,59,59,59,59,60,59,59,59,59,59,59,59,61,61,59,59,59,59,62,63,64,65,66,67,68,61,61,69, + 70,71,72,73,74,75,76,77,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,78,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 79,79,79,79,79,79,79,79,79,80,81,81,82,83,84,85,86,87,88,89,90,91,92,93,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,94,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,95,96,97,97,98,99,100,101,102,103, + 104,105,106,107,61,108,109,110,111,112,113,114,115,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133, + 134,135,136,137,138,139,140,141,142,143,61,144,145,146,147,61,148,149,150,151,152,153,154,155,156,157,158,159,61,160,161,162, + 163,163,163,163,163,163,163,164,165,163,166,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,167, + 168,168,168,168,168,168,168,168,169,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, + 168,168,168,168,168,168,168,170,171,171,171,171,172,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,173,61,61,61,61,61,61,61,61,61,61,61,61,61,174,174,174,174,175,176,177,178,61,61,179,61,180,181,182,183, + 184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184, + 184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,185,184,184,184,184,184,184,186,186,186,187,188,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,189, + 190,191,192,193,193,194,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,195,196,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,59,197,59,59,59,198,199,200, + 59,201,202,203,204,205,206,61,207,208,209,59,59,210,59,211,212,212,212,212,212,213,61,61,61,61,61,61,61,61,214,61, + 215,216,217,61,61,218,61,61,61,219,61,220,61,61,61,221,222,223,224,61,61,61,61,61,225,226,227,61,228,229,61,61, + 230,231,59,232,233,61,59,59,59,59,59,59,59,234,235,236,237,238,59,59,239,240,59,241,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 242,61,243,244,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, + 61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, +}; + +static kbts_u16 kbts__UnicodeScriptExtension_Data[31360] = { + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,929,929,929,929,929, + 929,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,2305,929,929,929,929,929,929,929,929,929,929,929,929,16,929,929,2305,929,929,929,929,929, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,929,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,929,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,929,929,929,519,929,929,929, + 929,929,929,929,929,929,929,738,929,738,738,738,929,610,929,929,929,929,929,929,929,929,929,802,929,738,929,929,929,929,929,929, + 2305,2305,2305,2305,2305,929,929,929,929,929,417,417,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 872,1128,1380,1509,1675,2022,932,2217,2506,1442,2819,2916,3043,1538,3138,961,1538,3203,961,3300,961,961,961,961,961,961,961,961,961,961,961,961, + 2850,961,961,3429,3588,2850,961,961,961,961,961,961,961,1539,2850,961,3715,3814,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,1441,961,961,1441,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,1218,961,961,961,961,961,4003,961, + 961,961,961,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,1441,1441,1441,1441,4098,4098,1441,1441,1,1,1441,1441,1441,1441,929,1441, + 1,1,1,1,1441,929,1441,929,1441,1441,1441,1,1441,1,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 1441,1441,1,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 1441,1441,801,801,801,801,801,801,801,801,801,801,801,801,801,801,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,4162,4226,1410,1410,4226,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,1,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, + 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,1,1,161,161,161,161,161,161,161, + 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, + 161,161,161,161,161,161,161,161,161,4291,161,1,1,161,161,161,1,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729, + 1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729, + 1729,1729,1729,1729,1729,1729,1729,1729,1,1,1,1,1,1,1,1,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729, + 1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1,1,1,1,1729,1729,1729,1729,1729,1729,1,1,1,1,1,1,1,1,1,1,1, + 129,129,129,129,129,929,129,129,129,129,129,129,4391,129,129,129,129,129,129,129,129,129,129,129,129,129,129,4391,4611,129,129,4712, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 4969,129,129,129,129,129,129,129,129,129,129,4610,4610,4610,4610,4610,4610,4610,4610,4610,4610,4610,129,129,129,129,129,129,129,129,129,129, + 5251,5251,5251,5251,5251,5251,5251,5251,5251,5251,129,129,129,129,129,129,4610,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,4994,129,129,129,129,129,129,129,129,929,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,1,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577, + 4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577, + 4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,1,1,4577,4577,4577,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929, + 4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,4929,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297, + 3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,3297,1,1,3297,3297,3297, + 4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129, + 4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,1,1,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,4129,1, + 2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,2657,1,1,2657,1, + 4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,4577,1,1,1,1,1,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,1,129,129,1,1,1,1,1,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,929,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025, + 1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025, + 1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,5357,5772,961,961,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025, + 1025,1025,1025,1025,6165,6839,7556,7556,7556,7556,7556,7556,7556,7556,7556,7556,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025, + 353,353,353,353,1,353,353,353,353,353,353,353,353,1,1,353,353,1,1,353,353,353,353,353,353,353,353,353,353,353,353,353, + 353,353,353,353,353,353,353,353,353,1,353,353,353,353,353,353,353,1,353,1,1,1,353,353,353,353,1,1,353,353,353,353, + 353,353,353,353,353,1,1,353,353,1,1,353,353,353,353,1,1,1,1,1,1,1,1,353,1,1,1,1,353,353,1,353, + 353,353,353,353,1,1,7683,7683,7683,7683,7683,7683,7683,7683,7683,7683,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,1, + 1,1537,1537,1537,1,1537,1537,1537,1537,1537,1537,1,1,1,1,1537,1537,1,1,1537,1537,1537,1537,1537,1537,1537,1537,1537,1537,1537,1537,1537, + 1537,1537,1537,1537,1537,1537,1537,1537,1537,1,1537,1537,1537,1537,1537,1537,1537,1,1537,1537,1,1537,1537,1,1537,1537,1,1,1537,1,1537,1537, + 1537,1537,1537,1,1,1,1,1537,1537,1,1,1537,1537,1537,1,1,1,1537,1,1,1,1,1,1,1,1537,1537,1537,1537,1,1537,1, + 1,1,1,1,1,1,7778,7778,7778,7778,7778,7778,7778,7778,7778,7778,1537,1537,1537,1537,1537,1537,1537,1,1,1,1,1,1,1,1,1, + 1,1473,1473,1473,1,1473,1473,1473,1473,1473,1473,1473,1473,1473,1,1473,1473,1473,1,1473,1473,1473,1473,1473,1473,1473,1473,1473,1473,1473,1473,1473, + 1473,1473,1473,1473,1473,1473,1473,1473,1473,1,1473,1473,1473,1473,1473,1473,1473,1,1473,1473,1,1473,1473,1473,1473,1473,1,1,1473,1473,1473,1473, + 1473,1473,1473,1473,1473,1473,1,1473,1473,1473,1,1473,1473,1473,1,1,1473,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1473,1473,1473,1473,1,1,7842,7842,7842,7842,7842,7842,7842,7842,7842,7842,1473,1473,1,1,1,1,1,1,1,1473,1473,1473,1473,1473,1473,1473, + 1,3777,3777,3777,1,3777,3777,3777,3777,3777,3777,3777,3777,1,1,3777,3777,1,1,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777, + 3777,3777,3777,3777,3777,3777,3777,3777,3777,1,3777,3777,3777,3777,3777,3777,3777,1,3777,3777,1,3777,3777,3777,3777,3777,1,1,3777,3777,3777,3777, + 3777,3777,3777,3777,3777,1,1,3777,3777,1,1,3777,3777,3777,1,1,1,1,1,1,1,3777,3777,3777,1,1,1,1,3777,3777,1,3777, + 3777,3777,3777,3777,1,1,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,3777,1,1,1,1,1,1,1,1, + 1,1,4801,4801,1,4801,4801,4801,4801,4801,4801,1,1,1,4801,4801,4801,1,4801,4801,4801,4801,1,1,1,4801,4801,1,4801,1,4801,4801, + 1,1,1,4801,4801,1,1,1,4801,4801,4801,1,1,1,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,1,1,1,1,4801,4801, + 4801,4801,4801,1,1,1,4801,4801,4801,1,4801,4801,4801,4801,1,1,4801,1,1,1,1,1,1,4801,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,7906,7906,7906,7906,7906,7906,7906,7906,7906,7906,7906,7906,7906,7906,4801,4801,4801,4801,4801,4801,4801,1,1,1,1,1, + 4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,1,4897,4897,4897,1,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897, + 4897,4897,4897,4897,4897,4897,4897,4897,4897,1,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,1,1,4897,4897,4897,4897, + 4897,4897,4897,4897,4897,1,4897,4897,4897,1,4897,4897,4897,4897,1,1,1,1,1,1,1,4897,4897,1,4897,4897,4897,1,1,4897,1,1, + 4897,4897,4897,4897,1,1,4897,4897,4897,4897,4897,4897,4897,4897,4897,4897,1,1,1,1,1,1,1,4897,4897,4897,4897,4897,4897,4897,4897,4897, + 1953,1953,1953,1953,1953,1953,1953,1953,1953,1953,1953,1953,1953,1,1953,1953,1953,1,1953,1953,1953,1953,1953,1953,1953,1953,1953,1953,1953,1953,1953,1953, + 1953,1953,1953,1953,1953,1953,1953,1953,1953,1,1953,1953,1953,1953,1953,1953,1953,1953,1953,1953,1,1953,1953,1953,1953,1953,1,1,1953,1953,1953,1953, + 1953,1953,1953,1953,1953,1,1953,1953,1953,1,1953,1953,1953,1953,1,1,1,1,1,1,1,1953,1953,1,1,1,1,1,1,1953,1953,1, + 1953,1953,1953,1953,1,1,7971,7971,7971,7971,7971,7971,7971,7971,7971,7971,1,1953,1953,1953,1,1,1,1,1,1,1,1,1,1,1,1, + 2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,1,2625,2625,2625,1,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625, + 2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625, + 2625,2625,2625,2625,2625,1,2625,2625,2625,1,2625,2625,2625,2625,2625,2625,1,1,1,1,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625, + 2625,2625,2625,2625,1,1,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625,2625, + 1,4353,4353,4353,1,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,1,1,1,4353,4353,4353,4353,4353,4353, + 4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,1,4353,4353,4353,4353,4353,4353,4353,4353,4353,1,4353,1,1, + 4353,4353,4353,4353,4353,4353,4353,1,1,1,4353,1,1,1,1,4353,4353,4353,4353,4353,4353,1,4353,1,4353,4353,4353,4353,4353,4353,4353,4353, + 1,1,1,1,1,1,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,1,1,4353,4353,4353,1,1,1,1,1,1,1,1,1,1,1, + 1,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961, + 4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,1,1,1,1,929, + 4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,4961,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,2273,2273,1,2273,1,2273,2273,2273,2273,2273,1,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273, + 2273,2273,2273,2273,1,2273,1,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,1,1, + 2273,2273,2273,2273,2273,1,2273,1,2273,2273,2273,2273,2273,2273,2273,1,2273,2273,2273,2273,2273,2273,2273,2273,2273,2273,1,1,2273,2273,2273,2273, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993, + 4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993, + 4993,4993,4993,4993,4993,4993,4993,4993,1,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993, + 4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,1,1,1,1,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993, + 4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,1,4993,4993,4993,4993,4993,4993,4993, + 4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,1,4993,4993, + 4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,4993,1,4993,4993,4993,4993,4993,4993,4993,929,929,929,929,4993,4993,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105, + 3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105, + 8067,8067,8067,8067,8067,8067,8067,8067,8067,8067,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105, + 3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105, + 3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105, + 1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313, + 1313,1313,1313,1313,1313,1313,1,1313,1,1,1,1,1,1313,1,1,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313, + 1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,8163,1313,1313,1313,1313, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1,1,1249,1249,1249,1249,1249,1249,1249,1,1249,1,1249,1249,1249,1249,1,1, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1,1,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1,1,1249,1249,1249,1249,1249,1249,1249,1, + 1249,1,1249,1249,1249,1249,1,1,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1249,1249,1249,1249, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1,1,1249,1249,1249,1249,1249,1249,1249,1249, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1,1,1249,1249,1249, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1,1,1, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1,1,1,1,1,1, + 705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705, + 705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705, + 705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,1,1,705,705,705,705,705,705,1,1, + 545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, + 545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, + 545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, + 545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, + 3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,1,1,1, + 4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097, + 4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097, + 4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,4097,1,1,1,1,1,1,1, + 4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,4609,1,1,1,1,1,1,1,1,1,4609, + 1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,8260,8260,1,1,1,1,1,1,1,1,1, + 513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,1,1,1,1,1,1,1,1,1,1,1,1, + 4641,4641,4641,4641,4641,4641,4641,4641,4641,4641,4641,4641,4641,1,4641,4641,4641,1,4641,4641,1,1,1,1,1,1,1,1,1,1,1,1, + 2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145, + 2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145, + 2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,1,1, + 2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,1,1,1,1,1,1,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,1,1,1,1,1,1, + 3009,3009,8386,8386,3009,8386,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,1,1,1,1,1,1, + 3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009, + 3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009, + 3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,1,1,1,1,1,1,1, + 3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009, + 3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,1,1,1,1,1,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, + 545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, + 545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,1,1,1,1,1,1,1,1,1,1, + 2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,1, + 2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,1,1,1,1,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,1,1,1,1, + 2369,1,1,1,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,2369,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673, + 4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,4673,1,1,4673,4673,4673,4673,4673,1,1,1,1,1,1,1,1,1,1,1, + 3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265, + 3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,1,1,1,1,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265, + 3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,1,1,1,1,1,1,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,3265,1,1,1,3265,3265, + 2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145,2145, + 481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,1,1,481,481, + 4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705, + 4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,1, + 4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,1,1,4705, + 4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,1,1,1,1,1,1,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,1,1,1,1,1,1, + 4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,4705,1,1,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, + 225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, + 225,225,225,225,225,225,225,225,225,225,225,225,225,1,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, + 225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, + 4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481, + 4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481,4481, + 321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321, + 321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,1,1,1,1,1,1,1,1,321,321,321,321, + 2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337, + 2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,1,1,1,2337,2337,2337,2337,2337, + 2337,2337,2337,2337,2337,2337,2337,2337,2337,2337,1,1,1,2337,2337,2337,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425, + 3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425,3425, + 897,897,897,897,897,897,897,897,897,897,897,1,1,1,1,1,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313, + 1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1,1,1313,1313,1313, + 4481,4481,4481,4481,4481,4481,4481,4481,1,1,1,1,1,1,1,1,8452,1025,8452,8483,1025,5346,5346,8578,5346,8578,8646,1025,8578,8578,1025,1025, + 8578,5346,1025,1025,1025,1025,1025,1025,1025,8834,5346,1025,1025,5346,1025,1025,1025,1025,8907,5378,9252,5346,5346,353,5378,5378,3201,1,1,1,1,1, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,1441,1441,1441,1441,1441,897,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,1441,1441,1441, + 1441,1441,2305,2305,2305,2305,1441,1441,1441,1441,1441,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,897,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,1441, + 1441,1441,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,9379,961,4577,961,961,961,961,961, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1,1,1441,1441,1441,1441,1441,1441,1,1, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 1441,1441,1441,1441,1441,1441,1,1,1441,1441,1441,1441,1441,1441,1,1,1441,1441,1441,1441,1441,1441,1441,1441,1,1441,1,1441,1,1441,1,1441, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1,1, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 1441,1441,1441,1441,1441,1,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1,1,1441,1441,1441,1441,1441,1441,1,1441,1441,1441, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1,1,1441,1441,1441,1,1441,1441,1441,1441,1441,1441,1441,1441,1441,1, + 929,929,929,929,929,929,929,929,929,929,929,929,961,961,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,9475,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,4706,929,929,929,929,929,929,929,929,929,929,9574,929,929,9764,929,929, + 929,929,929,929,929,1,929,929,929,929,929,929,929,929,929,929,929,2305,1,1,929,929,929,929,929,929,929,929,929,929,929,2305, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,9891,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,1441,929,929,929,2305,2305,929,929,929,929,929,929,2305,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,2305,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,929,929,929,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345, + 1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345, + 1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, + 801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, + 801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, + 801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,1,1,1,1,1,801,801,801,801,801,801,801, + 1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313,1313, + 1313,1313,1313,1313,1313,1313,1,1313,1,1,1,1,1,1313,1,1,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025, + 5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025,5025, + 5025,5025,5025,5025,5025,5025,5025,5025,1,1,1,1,1,1,1,5025,5025,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5025, + 1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1,1,1,1,1,1,1,1,1, + 1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1249,1249,1249,1, + 1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1249,1249,1249,1, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,9986,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,10050,10119,929,929,929,929,929,929,929,929,929,929,1121,929,929,929, + 929,10339,929,4226,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10434,10434,10434,10434,10434,10434,10434,10434,10434,10434,10434,10434,10434,10434,10434,10434, + 929,10503,10728,10501,929,1,769,1,10984,10984,11241,11241,11526,11526,11526,11526,11526,11526,929,10501,11526,11526,11526,11526,11526,11526,11526,11526,10501,10501,10501,10501, + 929,1,1,1,1,1,1,1,1,1,10498,10498,10498,10498,1601,1601,10501,10594,10594,10594,10594,10594,929,10501,1,1,1,1,11715,11715,769,769, + 1,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1,1,10594,10594,10594,10594,1761,1761,1761, + 10594,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985, + 1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985, + 1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,11526,10594,1985,1985,1985, + 1,1,1,1,1,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417, + 417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,1,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769, + 417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417, + 769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769, + 769,769,769,769,769,769,1,1,1,1,1,1,1,1,1,10434,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1, + 769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769, + 769,769,769,769,769,769,769,769,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,929, + 769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769, + 769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 769,769,769,769,769,769,769,769,769,769,769,769,929,929,929,929,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985, + 1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,769, + 1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985, + 1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985, + 1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,769,769,769,769,769,769,769,769, + 769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,929,929,929,929,929,929,929,929,929,929,769,769,769,769,769, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,929, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377, + 5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377, + 5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377, + 5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377, + 5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,1,1,1,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377, + 5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377,5377, + 5377,5377,5377,5377,5377,5377,5377,1,1,1,1,1,1,1,1,1,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465, + 2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465,2465, + 5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217, + 5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217, + 5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217, + 5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217, + 5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217, + 5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,5217,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,4226,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257, + 257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257, + 257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,1,1,1,1,1,1,1,1, + 11810,11810,11810,11810,11810,11810,11810,11810,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,929,929,929,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,1,1,2305,2305,1,2305,1,2305,2305,2305,2305,2305,2305,2305,2305,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545, + 4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,4545,1,1,1,11888,11888,11888,12399,12399,12399,12875,12875,13228,12875,1,1,1,1,1,1, + 3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969, + 3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,3969,1,1,1,1,1,1,1,1, + 4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161, + 4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161, + 4161,4161,4161,4161,4161,4161,1,1,1,1,1,1,1,1,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,4161,1,1,1,1,1,1, + 1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,13603,1025,13698,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1025, + 2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049, + 2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,2049,13763,2049,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065, + 4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,4065,1,1,1,1,1,1,1,1,1,1,1,4065, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1,1,1, + 1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889, + 1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889, + 1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1,13858,1889,1889,1889,1889,1889,1889,1889,1889,1889,1889,1,1,1,1,1889,1889, + 3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,1, + 673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, + 673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,1,1,1,1,1,1,1,1,1, + 673,673,673,673,673,673,673,673,673,673,673,673,673,673,1,1,673,673,673,673,673,673,673,673,673,673,1,1,673,673,673,673, + 3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105, + 4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737, + 4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737,4737, + 4737,4737,4737,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4737,4737,4737,4737,4737, + 2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,1,1,1,1,1,1,1,1,1, + 1,1249,1249,1249,1249,1249,1249,1,1,1249,1249,1249,1249,1249,1249,1,1,1249,1249,1249,1249,1249,1249,1,1,1,1,1,1,1,1,1, + 1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1249,1249,1249,1,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,929,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,1441,2305,2305,2305,2305,929,929,1,1,1,1,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705, + 705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705, + 705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705, + 2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817, + 2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,1,1,2817,2817,2817,2817,2817,2817,2817,2817,2817,2817,1,1,1,1,1,1, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601, + 1601,1601,1601,1601,1,1,1,1,1,1,1,1,1,1,1,1,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601, + 1601,1601,1601,1601,1601,1601,1601,1,1,1,1,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1,1,1,1, + 2305,2305,2305,2305,2305,2305,2305,1,1,1,1,1,1,1,1,1,1,1,1,161,161,161,161,161,1,1,1,1,1,1729,1729,1729, + 1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1,1729,1729,1729,1729,1729,1,1729,1, + 1729,1729,1,1729,1729,1,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,13922,13922, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,1,1,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,1,1,1,1,1,1,1,129,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,129,129,5250,129,129,129,129,129,129,129,129,129,129,5250,129,129, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,897,897,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,10501,10501,929,929,929,929,929,929,929,929,929,929,929,929,1,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,1,929,929,929,929,1,1,1,1,129,129,129,129,129,1,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,1,1,929, + 1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,929,929,929,929,929, + 929,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,929,929,929,929,929, + 929,11526,11526,11526,11526,11526,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,10594,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985, + 1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,1985,10594,10594, + 1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1601,1, + 1,1,1601,1601,1601,1601,1601,1601,1,1,1601,1601,1601,1601,1601,1601,1,1,1601,1601,1601,1601,1601,1601,1,1,1601,1601,1601,1,1,1, + 929,929,929,929,929,929,929,1,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,929,929,929,929,929,1,1, + 2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,1,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433, + 2433,2433,2433,2433,2433,2433,2433,1,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,1,2433,2433,1,2433, + 2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,1,1,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433, + 2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433, + 2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433, + 2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,2433,1,1,1,1,1, + 13987,13987,14082,1,1,1,1,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147, + 14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,14147,1,1,1,14082,14082,14082,14082,14082,14082,14082,14082,14082, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1, + 1441,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,961,1,1, + 2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,2497,1,1,1, + 577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, + 577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,14242,1,1,1,1, + 3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489,3489, + 3489,3489,3489,3489,1,1,1,1,1,1,1,1,1,3489,3489,3489,1377,1377,1377,1377,1377,1377,1377,1377,1377,1377,1377,1377,1377,1377,1377,1377, + 1377,1377,1377,1377,1377,1377,1377,1377,1377,1377,1377,1,1,1,1,1,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585, + 3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,3585,1,1,1,1,1, + 5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,5185,1,5185, + 3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617, + 3617,3617,3617,3617,1,1,1,1,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,3617,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993, + 993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993, + 993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225, + 4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225,4225, + 3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,1,1, + 3841,3841,3841,3841,3841,3841,3841,3841,3841,3841,1,1,1,1,1,1,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809, + 3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,1,1,1,1,3809,3809,3809,3809,3809,3809,3809,3809, + 3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,3809,1,1,1,1, + 1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185,1185, + 1185,1185,1185,1185,1185,1185,1185,1185,1,1,1,1,1,1,1,1,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609, + 609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609, + 609,609,609,609,1,1,1,1,1,1,1,1,1,1,1,609,5249,5249,5249,5249,5249,5249,5249,5249,5249,5249,5249,1,5249,5249,5249,5249, + 5249,5249,5249,5249,5249,5249,5249,5249,5249,5249,5249,1,5249,5249,5249,5249,5249,5249,5249,1,5249,5249,1,5249,5249,5249,5249,5249,5249,5249,5249,5249, + 5249,5249,1,5249,5249,5249,5249,5249,5249,5249,5249,5249,5249,5249,5249,5249,5249,5249,1,5249,5249,5249,5249,5249,5249,5249,1,5249,5249,1,1,1, + 5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089, + 5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,5089,1,1,1,1,1,1,1,1,1,1,1,1, + 2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401, + 2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401, + 2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401, + 2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401, + 2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401, + 2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,1,1,1,1,1,1,1,1,1, + 2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,2401,1,1,1,1,1,1,1,1,1,1, + 2401,2401,2401,2401,2401,2401,2401,2401,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2305,2305,2305,2305,2305,2305,1,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,1,2305,2305,2305,2305,2305,2305,2305,2305,2305,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 833,833,833,833,833,833,1,1,833,1,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833, + 833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,833,1,833,833,1,1,1,833,1,1,833, + 1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1793,1,1793,1793,1793,1793,1793,1793,1793,1793,1793, + 3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905,3905, + 3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,3137,1, + 1,1,1,1,1,1,1,3137,3137,3137,3137,3137,3137,3137,3137,3137,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1697,1697,1697,1697,1697,1697,1697,1697,1697,1697,1697,1697,1697,1697,1697,1697,1697,1697,1697,1,1697,1697,1,1,1,1,1,1697,1697,1697,1697,1697, + 4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,4001,1,1,1,4001, + 2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,2529,1,1,1,1,1,2529, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913,2913, + 2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,1,1,1,1,2881,2881,2881,2881, + 2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,1,1,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881, + 2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881,2881, + 2081,2081,2081,2081,1,2081,2081,1,1,1,1,1,2081,2081,2081,2081,2081,2081,2081,2081,1,2081,2081,2081,1,2081,2081,2081,2081,2081,2081,2081, + 2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,2081,1,1,2081,2081,2081,1,1,1,1,2081, + 2081,2081,2081,2081,2081,2081,2081,2081,2081,1,1,1,1,1,1,1,2081,2081,2081,2081,2081,2081,2081,2081,2081,1,1,1,1,1,1,1, + 3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681,3681, + 3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689,2689, + 2689,2689,2689,2689,2689,2689,2689,1,1,1,1,2689,2689,2689,2689,2689,2689,2689,5090,2689,2689,2689,2689,1,1,1,1,1,1,1,1,1, + 193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193, + 193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,1,1,1,193,193,193,193,193,193,193, + 1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1857,1,1,1857,1857,1857,1857,1857,1857,1857,1857, + 1825,1825,1825,1825,1825,1825,1825,1825,1825,1825,1825,1825,1825,1825,1825,1825,1825,1825,1825,1,1,1,1,1,1825,1825,1825,1825,1825,1825,1825,1825, + 4033,4033,4033,4033,4033,4033,4033,4033,4033,4033,4033,4033,4033,4033,4033,4033,4033,4033,1,1,1,1,1,1,1,4033,4033,4033,4033,1,1,1, + 1,1,1,1,1,1,1,1,1,4033,4033,4033,4033,4033,4033,4033,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713, + 3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713,3713, + 3713,3713,3713,3713,3713,3713,3713,3713,3713,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521, + 3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,1,1,1,1,1,1,1,1,1,1,1,1,1, + 3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521, + 3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,3521,1,1,1,1,1,1,1,3521,3521,3521,3521,3521,3521, + 1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633, + 1633,1633,1633,1633,1633,1633,1633,1633,1,1,1,1,1,1,1,1,1633,1633,1633,1633,1633,1633,1633,1633,1633,1633,1,1,1,1,1,1, + 1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281, + 1281,1281,1281,1281,1281,1281,1,1,1,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281, + 1281,1281,1281,1281,1281,1281,1,1,1,1,1,1,1,1,1281,1281,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,1, + 5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,5345, + 5345,5345,5345,5345,5345,5345,5345,5345,5345,5345,1,5345,5345,5345,1,1,5345,5345,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,129,129,129,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,129,129,129,129, + 3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649,3649, + 3649,3649,3649,3649,3649,3649,3649,3649,1,1,1,1,1,1,1,1,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321, + 4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,4321,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3745,3745,3745,3745,3745,3745,3745,3745,3745,3745,3745,3745,3745,3745,3745,3745, + 3745,3745,3745,3745,3745,3745,3745,3745,3745,3745,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737, + 737,737,737,737,737,737,737,737,737,737,737,737,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1217,1,1,1,1,1,1,1,1,1, + 449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449, + 449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449, + 449,449,449,449,449,449,449,449,449,449,449,449,449,449,1,1,1,1,449,449,449,449,449,449,449,449,449,449,449,449,449,449, + 449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,1,1,1,1,1,1,1,1,1,449, + 1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921, + 1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921,1921, + 1921,1921,1921,1,1,1,1,1,1,1,1,1,1,1921,1,1,4385,4385,4385,4385,4385,4385,4385,4385,4385,4385,4385,4385,4385,4385,4385,4385, + 4385,4385,4385,4385,4385,4385,4385,4385,4385,1,1,1,1,1,1,1,4385,4385,4385,4385,4385,4385,4385,4385,4385,4385,1,1,1,1,1,1, + 641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641, + 641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,1,641,641,641,641,641,641,641,641,641,641, + 641,641,641,641,641,641,641,641,1,1,1,1,1,1,1,1,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561, + 2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,2561,1,1,1,1,1,1,1,1,1, + 4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193, + 4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193, + 4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193,4193, + 1,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,4353,1,1,1,1,1,1,1,1,1,1,1, + 2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,1,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177, + 2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177,2177, + 2177,2177,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 3073,3073,3073,3073,3073,3073,3073,1,3073,1,3073,3073,3073,3073,1,3073,3073,3073,3073,3073,3073,3073,3073,3073,3073,3073,3073,3073,3073,3073,1,3073, + 3073,3073,3073,3073,3073,3073,3073,3073,3073,3073,1,1,1,1,1,1,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209, + 2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209, + 2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,1,1,1,1,1,2209,2209,2209,2209,2209,2209,2209,2209,2209,2209,1,1,1,1,1,1, + 1409,7906,1409,7906,1,1409,1409,1409,1409,1409,1409,1409,1409,1,1,1409,1409,1,1,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409,1409, + 1409,1409,1409,1409,1409,1409,1409,1409,1409,1,1409,1409,1409,1409,1409,1409,1409,1,1409,1409,1,1409,1409,1409,1409,1409,1,7906,7906,1409,1409,1409, + 1409,1409,1409,1409,1409,1,1,1409,1409,1,1,1409,1409,1409,1,1,1409,1,1,1,1,1,1,1409,1,1,1,1,1,1409,1409,1409, + 1409,1409,1409,1409,1,1,1409,1409,1409,1409,1409,1409,1409,1,1,1,1409,1409,1409,1409,1409,1,1,1,1,1,1,1,1,1,1,1, + 5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,1,5153,1,1,5153,1,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153, + 5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,1,5153,5153,5153,5153,5153,5153,5153,5153,5153, + 5153,1,5153,1,1,5153,1,5153,5153,5153,5153,1,5153,5153,5153,5153,5153,5153,5153,5153,5153,5153,1,5153,5153,1,1,1,1,1,1,1, + 1,5153,5153,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233, + 3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233, + 3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,3233,1,3233,3233,3233, + 3233,3233,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057, + 5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057, + 5057,5057,5057,5057,5057,5057,5057,5057,1,1,1,1,1,1,1,1,5057,5057,5057,5057,5057,5057,5057,5057,5057,5057,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257, + 4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,1,1,4257,4257,4257,4257,4257,4257,4257,4257, + 4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,4257,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977, + 2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977, + 2977,2977,2977,2977,2977,1,1,1,1,1,1,1,1,1,1,1,2977,2977,2977,2977,2977,2977,2977,2977,2977,2977,1,1,1,1,1,1, + 3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,3009,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769, + 4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,1,1,1,1,1,1, + 4769,4769,4769,4769,4769,4769,4769,4769,4769,4769,1,1,1,1,1,1,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105,3105, + 3105,3105,3105,3105,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,1,1,65,65,65, + 65,65,65,65,65,65,65,65,65,65,65,65,1,1,1,1,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65, + 65,65,65,65,65,65,65,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089, + 1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1089,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313, + 5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313, + 5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,5313,1,1,1,1,1,1,1,1,1,1,1,1,5313, + 1057,1057,1057,1057,1057,1057,1057,1,1,1057,1,1,1057,1057,1057,1057,1057,1057,1057,1057,1,1057,1057,1,1057,1057,1057,1057,1057,1057,1057,1057, + 1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1,1057,1057,1,1,1057,1057,1057,1057,1057, + 1057,1057,1057,1057,1057,1057,1057,1,1,1,1,1,1,1,1,1,1057,1057,1057,1057,1057,1057,1057,1057,1057,1057,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 3201,3201,3201,3201,3201,3201,3201,3201,1,1,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201, + 3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,3201,1,1,3201,3201,3201,3201,3201,3201, + 3201,3201,3201,3201,3201,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409, + 5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409,5409, + 5409,5409,5409,5409,5409,5409,5409,5409,1,1,1,1,1,1,1,1,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417, + 4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417, + 4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417,4417, + 4417,4417,4417,1,1,1,1,1,1,1,1,1,1,1,1,1,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, + 3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937, + 3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,3937,1,1,1,1,1,1,1, + 1025,1025,1025,1025,1025,1025,1025,1025,1025,1025,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513, + 4513,4513,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4513,4513,4513,4513,4513,4513,4513,4513,4513,4513,1,1,1,1,1,1, + 385,385,385,385,385,385,385,385,385,1,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385, + 385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,1,385,385,385,385,385,385,385,385, + 385,385,385,385,385,385,1,1,1,1,1,1,1,1,1,1,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385, + 385,385,385,385,385,385,385,385,385,385,385,385,385,1,1,1,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721, + 2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,1,1,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721, + 2721,2721,2721,2721,2721,2721,2721,2721,1,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,2721,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2753,2753,2753,2753,2753,2753,2753,1,2753,2753,1,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753, + 2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,1,1,1,2753,1,2753,2753,1,2753, + 2753,2753,2753,2753,2753,2753,2753,2753,1,1,1,1,1,1,1,1,2753,2753,2753,2753,2753,2753,2753,2753,2753,2753,1,1,1,1,1,1, + 1505,1505,1505,1505,1505,1505,1,1505,1505,1,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505, + 1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1,1505,1505,1,1505,1505,1505,1505,1505,1505,1,1,1,1,1,1,1, + 1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,2593,1,1,1,1,1,1,1, + 2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,1,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017, + 2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,1,1,1,2017,2017, + 2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2465,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,7906,7906,4801,7906,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801, + 4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,4801,1,1,1,1,1,1,1,1,1,1,1,1,1,4801, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,1,4449,4449,4449,4449,4449,1,1,1,1,1,1,1,1,1,1,1, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449, + 4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449,4449, + 4449,4449,4449,4449,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865, + 865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865, + 865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865, + 865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1,1,1,1,1,1,1,1,1,1, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153, + 1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1153,1,1,1,1,1, + 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, + 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, + 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, + 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, + 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, + 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, + 97,97,97,97,97,97,97,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569, + 1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257, + 257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257, + 257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257, + 257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257, + 257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257, + 257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,1,1,1,1,1,1,1, + 3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,1, + 3041,3041,3041,3041,3041,3041,3041,3041,3041,3041,1,1,1,1,3041,3041,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833, + 4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833, + 4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,1, + 4833,4833,4833,4833,4833,4833,4833,4833,4833,4833,1,1,1,1,1,1,289,289,289,289,289,289,289,289,289,289,289,289,289,289,289,289, + 289,289,289,289,289,289,289,289,289,289,289,289,289,289,1,1,289,289,289,289,289,289,1,1,1,1,1,1,1,1,1,1, + 3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873, + 3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873, + 3873,3873,3873,3873,3873,3873,1,1,1,1,1,1,1,1,1,1,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,1,3873,3873,3873,3873,3873, + 3873,3873,1,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,1,1,1,1,1,3873,3873,3873, + 3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,3873,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241, + 2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,2241,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785, + 2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785, + 2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,2785,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945, + 2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945, + 2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,1,1,1,1,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945, + 2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945, + 2945,2945,2945,2945,2945,2945,2945,2945,1,1,1,1,1,1,1,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945,2945, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 4865,3329,1,1,2113,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865, + 4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865, + 4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865, + 4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865, + 4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865, + 4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865, + 4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865, + 4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,4865,1,1,1,1,1,1,1,1, + 2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113, + 2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113, + 2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113, + 2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113, + 2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113, + 2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113, + 2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,2113,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2113, + 4865,4865,4865,4865,4865,4865,4865,4865,4865,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1985,1985,1985,1985,1,1985,1985,1985,1985,1985,1985,1985,1,1985,1985,1, + 1985,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761,1761, + 1985,1985,1985,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1761,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1761,1761,1761,1,1,1985,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1985,1985,1985,1985,1,1,1,1,1,1,1,1,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329, + 3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329, + 3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329, + 3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329, + 3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329, + 3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329, + 3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329, + 3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329, + 3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,3329,1,1,1,1, + 1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121, + 1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121, + 1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121, + 1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1,1,1,1,1,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1,1,1, + 1121,1121,1121,1121,1121,1121,1121,1121,1121,1,1,1,1,1,1,1,1121,1121,1121,1121,1121,1121,1121,1121,1121,1121,1,1,1121,1121,1121,1121, + 1121,1121,1121,1121,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,1,1,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,1,1,1,1,1,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,961,961,961,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,961,961,961,961,961, + 961,961,961,929,929,961,961,961,961,961,961,961,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,961,961,961,961,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441, + 1441,1441,1441,1441,1441,1441,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1, + 769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,769,929,929,929,929,929,929,929,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,929,929, + 1,1,929,1,1,929,929,1,1,929,929,929,929,1,929,929,929,929,929,929,929,929,929,929,929,929,1,929,1,929,929,929, + 929,929,929,929,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,1,929,929,929,929,1,1,929,929,929,929,929,929,929,929,1,929,929,929,929,929,929,929,1,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,929,929,929,929,1, + 929,929,929,929,929,1,929,1,1,1,929,929,929,929,929,929,929,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289, + 4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289, + 4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289, + 4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289, + 4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4289,4289,4289,4289,4289, + 1,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,4289,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,2305,1, + 1,1,1,1,1,2305,2305,2305,2305,2305,2305,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1345,1345,1345,1345,1345,1345,1345,1,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1,1,1345,1345,1345,1345,1345, + 1345,1345,1,1345,1345,1,1345,1345,1345,1345,1345,1,1,1,1,1,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897, + 897,897,897,897,897,897,897,897,897,897,897,897,897,897,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,897,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361, + 3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,1,1,1,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,1,1, + 3361,3361,3361,3361,3361,3361,3361,3361,3361,3361,1,1,1,1,3361,3361,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121, + 5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,5121,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281, + 5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,5281,1,1,1,1,1,5281, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169, + 3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,3169,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457, + 3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,3457,1,1,1,1,3457, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1249,1249,1249,1249,1249,1249,1249,1,1249,1249,1249,1249,1,1249,1249,1,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1249,1, + 2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849, + 2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849, + 2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849, + 2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849, + 2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849, + 2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849, + 2849,2849,2849,2849,2849,1,1,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33, + 33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33, + 33,33,33,33,33,33,33,33,33,33,33,33,1,1,1,1,33,33,33,33,33,33,33,33,33,33,1,1,1,1,33,33, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 129,129,129,129,1,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 1,129,129,1,129,1,1,129,1,129,129,129,129,129,129,129,129,129,129,1,129,129,129,129,1,129,1,129,1,1,1,1, + 1,1,129,1,1,1,1,129,1,129,1,129,1,129,129,129,1,129,129,1,129,1,1,129,1,129,1,129,1,129,1,129, + 1,129,129,1,129,1,1,129,129,129,129,1,129,129,129,129,129,129,129,1,129,129,129,129,1,129,129,129,129,1,129,1, + 129,129,129,129,129,129,129,129,129,129,1,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,1,1,1,1, + 1,129,129,129,1,129,129,129,129,129,1,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,129,129,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 1761,929,929,1,1,1,1,1,1,1,1,1,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1, + 929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,769,769,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,929,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1, + 929,929,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1, + 929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,1,1,1,1,1,1,1,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,929, + 929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,1,1,1,1,1,1, + 1,929,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961, + 961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,961,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +}; + +KBTS_INLINE kbts_u16 kbts__GetUnicodeScriptExtension(kbts_u32 Codepoint) +{ + return (Codepoint < 1114110) ? kbts__UnicodeScriptExtension_Data[((kbts_un)kbts__UnicodeScriptExtension_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)] : 0; +} + +static kbts_u8 kbts__UnicodeMirrorCodepoint_PageIndices[8703] = { + 0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 5,6,2,2,7,8,9,2,2,2,2,2,2,2,10,11,2,2,2,12,13,14,2,15,2,2,2,2,16,2,2,2, + 17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,18,2,19,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +}; + +static kbts_u32 kbts__UnicodeMirrorCodepoint_Data[2560] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,41,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,60,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93,0,91,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,0,123,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3899,3898,3901,3900,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5788,5787,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8250,8249,0,0,0,0,0, + 0,0,0,0,0,8262,8261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8318,8317,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,8334,8333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,8715,8716,8717,8712,8713,8714,0,0,0,0,0,0,0,10741,0,0,0,0,0,0,0,0,0,11262, + 10659,10651,10656,0,10990,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8765,8764,0,0, + 0,0,0,8909,0,8780,0,0,0,0,0,0,8773,0,0,0,0,0,8787,8786,8789,8788,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,8805,8804,8807,8806,8809,8808,8811,8810,0,0,8815,8814,8817,8816,8819,8818,8821,8820,8823,8822,8825,8824,8827,8826,8829,8828,8831,8830, + 8833,8832,8835,8834,8837,8836,8839,8838,8841,8840,8843,8842,0,0,0,8848,8847,8850,8849,0,0,0,0,0,10680,0,0,0,0,0,0,0, + 0,0,8867,8866,0,0,10974,0,10980,10979,0,10981,0,0,0,0,8881,8880,8883,8882,8885,8884,8887,8886,10204,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,8906,8905,8908,8907,8771,0,0,8913,8912,0,0,0,0,8919,8918,8921,8920,8923,8922,8925,8924,8927,8926, + 8929,8928,8931,8930,8933,8932,8935,8934,8937,8936,8939,8938,8941,8940,0,0,8945,8944,8954,8955,8956,0,8957,8958,0,0,8946,8947,8948,8950,8951,0, + 0,0,0,0,0,0,0,0,8969,8968,8971,8970,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,9002,9001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,10089,10088,10091,10090,10093,10092,10095,10094,10097,10096,10099,10098,10101,10100,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,10180,10179,10182,10181,0,10185,10184,0,10189,0,10187,0,0,0,0,0,0,0,10198,10197,0,0,0,0,0,8888,10206,10205,0, + 0,0,10211,10210,10213,10212,10215,10214,10217,10216,10219,10218,10221,10220,10223,10222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,10628,10627,10630,10629,10632,10631,10634,10633,10636,10635,10640,10639,10638,10637,10642,10641,10644,10643,10646,10645,10648,10647,0,0,8737,0,0,0,0, + 8738,0,0,8736,10661,10660,0,0,10665,10664,10667,10666,10669,10668,10671,10670,0,0,0,0,0,0,0,0,8856,0,0,0,0,0,0,0, + 10689,10688,0,0,10693,10692,0,0,0,0,0,0,0,0,0,10704,10703,10706,10705,0,10709,10708,0,0,10713,10712,10715,10714,0,0,0,0, + 0,0,0,0,0,0,0,0,10729,10728,0,0,0,0,0,0,0,0,0,0,0,8725,0,0,10745,10744,0,0,10749,10748,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,10796,10795,10798,10797,0,0,0,0,0,10805,10804,0,0,0,0,0,0,10813,10812,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,10853,10852,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10874,10873,10876,10875,10878,10877,10880, + 10879,10882,10881,10884,10883,10886,10885,10888,10887,10890,10889,10892,10891,10894,10893,10896,10895,10898,10897,10900,10899,10902,10901,10904,10903,10906,10905,10908,10907,10910,10909,10912, + 10911,10914,10913,0,0,0,10919,10918,10921,10920,10923,10922,10925,10924,0,10928,10927,10930,10929,10932,10931,10934,10933,10936,10935,10938,10937,10940,10939,10942,10941,10944, + 10943,10946,10945,10948,10947,10950,10949,10952,10951,10954,10953,10956,10955,10958,10957,10960,10959,10962,10961,10964,10963,10966,10965,0,0,0,0,0,0,0,8870,0, + 0,0,0,8873,8872,8875,0,0,0,0,0,0,10989,10988,8740,0,0,0,0,0,0,0,0,11000,10999,11002,11001,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8735,0, + 0,0,11779,11778,11781,11780,0,0,0,11786,11785,0,11789,11788,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11805,11804,0,0, + 11809,11808,11811,11810,11813,11812,11815,11814,11817,11816,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11862,11861,11864,11863,11866,11865,11868,11867,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,12297,12296,12299,12298,12301,12300,12303,12302,12305,12304,0,0,12309,12308,12311,12310,12313,12312,12315,12314,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65114,65113,65116,65115,65118,65117,0, + 0,0,0,0,65125,65124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,65289,65288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65310,0,65308,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65341,0,65339,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65373,0,65371,0,65376, + 65375,0,65379,65378,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; + +KBTS_INLINE kbts_u32 kbts__GetUnicodeMirrorCodepoint(kbts_u32 Codepoint) +{ + return (Codepoint < 1114110) ? kbts__UnicodeMirrorCodepoint_Data[((kbts_un)kbts__UnicodeMirrorCodepoint_PageIndices[Codepoint/128] * 128) | (Codepoint & 127)] : 0; +} + +KBTS_INLINE kbts_u32 kbts__GetDecompositionSize(kbts_u64 Decomposition) { return Decomposition & 3; } -KBTS_INLINE kbts_u32 kbts_GetDecompositionCodepoint(kbts_u64 Decomposition, kbts_un Index){ +KBTS_INLINE kbts_u32 kbts__GetDecompositionCodepoint(kbts_u64 Decomposition, kbts_un Index){ return (Decomposition >> (Index ? 23 : 2)) & 0x1FFFFF; } #define KBTS_UNICODE_DECOMPOSITION_DO_NOT_RECURSE0 (1ull << 44) #define KBTS_UNICODE_DECOMPOSITION_DO_NOT_RECURSE1 (1ull << 45) -KBTS_INLINE kbts_u32 kbts_GetMatchingBracket(kbts_u64 Decomposition) -{ - return (Decomposition >> 23) & 0x1FFFFF; -} - -KBTS_INLINE kbts_u32 kbts_GetUnicodeMatchingBracket(kbts_u32 Codepoint) -{ - kbts_u64 Decomposition = kbts_GetUnicodeDecomposition(Codepoint); return (Decomposition >> 23) & 0x1FFFFF; -} - -KBTS_INLINE kbts_u8 kbts_GetSyllabicClass(kbts_u16 SyllabicInfo) +KBTS_INLINE kbts_u8 kbts__GetSyllabicClass(kbts_u16 SyllabicInfo) { return SyllabicInfo & 0xFF; } -KBTS_INLINE kbts_u8 kbts_GetSyllabicPosition(kbts_u16 SyllabicInfo) +KBTS_INLINE kbts_u8 kbts__GetSyllabicPosition(kbts_u16 SyllabicInfo) { return SyllabicInfo >> 8; } -KBTS_INLINE kbts_s32 *kbts_GetParentInfoDeltas(kbts_u32 ParentInfo) +KBTS_INLINE kbts_s32 *kbts__GetParentInfoDeltas(kbts_u32 ParentInfo) { - return kbts_UnicodeParentDeltas + (ParentInfo & 0xFFFF); + return kbts__UnicodeParentDeltas + (ParentInfo & 0xFFFF); } -KBTS_INLINE kbts_un kbts_GetParentInfoCount(kbts_u32 ParentInfo) +KBTS_INLINE kbts_un kbts__GetParentInfoCount(kbts_u32 ParentInfo) { return ParentInfo >> 16; } +KBTS_INLINE kbts_un kbts__ScriptExtensionCount(kbts_u16 ScriptExtension) +{ + return (ScriptExtension & 0x1f); +} + +KBTS_INLINE kbts_un kbts__ScriptExtensionOffset(kbts_u16 ScriptExtension) +{ + return (ScriptExtension >> 5); +} + typedef kbts_u8 kbts_grapheme_break_class; enum kbts_grapheme_break_class_enum { /* 0 */ KBTS_GRAPHEME_BREAK_CLASS_DEFAULT, @@ -12836,56 +15211,423 @@ static kbts_u8 kbts_UseTransition[KBTS_USE_SYLLABIC_CLASS_COUNT][KBTS_USE_STATE_ /* p */ {13,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,}, }; -static const kbts_u8 kbts_CmapFormatPrecedence[14] = {1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 3, 0, 4, 5}; +KBTS_EXPORT void kbts_FontCoverageTestBegin(kbts_font_coverage_test *Test, kbts_font *Font) +{ + Test->Font = Font; + Test->BaseParentCount = 0; + Test->BaseCodepoint = 0; + Test->CurrentBaseError = 0; + Test->Error = 0; +} -static int kbts_ShaperClearsMarkAdvancesInPostGposFixup(kbts_u32 Shaper) +KBTS_EXPORT void kbts_FontCoverageTestCodepoint(kbts_font_coverage_test *Test, int Codepoint) +{ + if(!Test->Error) + { + kbts_u32 UCodepoint = (kbts_u32)Codepoint; + int RecomposeBase = 0; + + if(!kbts__GetUnicodeCombiningClass(UCodepoint)) + { + Test->Error |= Test->CurrentBaseError; + Test->CurrentBaseError = 0; + Test->BaseCodepoint = UCodepoint; + + RecomposeBase = 1; + } + else + { + kbts_u16 Id = (kbts_u16)kbts_CodepointToGlyphId(Test->Font, Codepoint); + + if(!Id) + { + KBTS__FOR(ParentIndex, 0, Test->BaseParentCount) + { + kbts_glyph_parent *Parent = &Test->BaseParents[ParentIndex]; + + if(kbts__GetDecompositionCodepoint(Parent->Decomposition, 1) == UCodepoint) + { + Test->BaseCodepoint = Parent->Codepoint; + RecomposeBase = 1; + + break; + } + } + + if(!RecomposeBase) + { + Test->Error = 1; + } + } + } + + if(RecomposeBase) + { + kbts_u32 BaseCodepoint = Test->BaseCodepoint; + kbts_u16 BaseId = (kbts_u16)kbts_CodepointToGlyphId(Test->Font, (int)Test->BaseCodepoint); + kbts_un BaseParentCount = 0; + + int Done = 0; + while(!Done) + { + kbts_u32 ParentInfo = kbts__GetUnicodeParentInfo(BaseCodepoint); + kbts_s32 *ParentDeltas = kbts__GetParentInfoDeltas(ParentInfo); + + BaseParentCount = 0; + + Done = 1; + + KBTS__FOR(ParentIndex, 0, BaseParentCount) + { + kbts_glyph_parent Parent = KBTS__ZERO; + Parent.Codepoint = BaseCodepoint + (kbts_u32)ParentDeltas[ParentIndex]; + Parent.Decomposition = kbts__GetUnicodeDecomposition(Parent.Codepoint); + kbts_u16 RecompositionId = (kbts_u16)kbts_CodepointToGlyphId(Test->Font, (int)Parent.Codepoint); + + if(RecompositionId) + { + if(kbts__GetDecompositionSize(Parent.Decomposition) == 1) + { + BaseCodepoint = Parent.Codepoint; + BaseId = RecompositionId; + + Done = 0; + + break; + } + else + { + Test->BaseParents[BaseParentCount++] = Parent; + } + } + } + } + + Test->BaseCodepoint = BaseCodepoint; + Test->BaseParentCount = (kbts_u32)BaseParentCount; + + if(!BaseId) + { + Test->CurrentBaseError = 1; + } + } + } +} + +KBTS_EXPORT int kbts_FontCoverageTestEnd(kbts_font_coverage_test *Test) +{ + int Result = Test->CurrentBaseError | Test->Error; + Test->Error = Result; + return !Result; +} + +typedef struct kbts__feature_override_header +{ + struct kbts__feature_override_header *Prev; + struct kbts__feature_override_header *Next; +} kbts__feature_override_header; + +typedef struct kbts__feature_override +{ + kbts__feature_override_header Header; + + kbts_u32 Tag; + int Value; +} kbts__feature_override; + +typedef struct kbts_glyph_config +{ + kbts__feature_set EnabledFeatures; + kbts__feature_set DisabledFeatures; + + kbts_u32 ExtraOverrideCount; + + kbts_allocator_function *Allocator; + void *AllocatorData; + + kbts__feature_override_header FeatureOverrideSentinel; +} kbts_glyph_config; + +typedef struct kbts__arena_block +{ + kbts_arena_block_header Header; + void *BaseAllocation; // For freeing + + kbts_un Size; + kbts_un Used; + + // char Memory[Size]; // if Memory is NULL +} kbts__arena_block; + +typedef struct kbts__arena_lifetime +{ + kbts_arena *Arena; + kbts_arena_block_header *BlockHeader; + kbts_un Used; +} kbts__arena_lifetime; + +typedef struct kbts__glyph_list +{ + kbts_glyph *SentinelPrev; + kbts_glyph *SentinelNext; + kbts_glyph *OneBeforeFirst; + kbts_glyph *OnePastLast; +} kbts__glyph_list; + +typedef struct kbts__baked_feature +{ + kbts_u16 *Indices; + kbts_u32 Count; + kbts_u32 FeatureTag; + kbts_u32 FeatureId; + kbts_u32 SkipFlags; + kbts_u32 GlyphFilter; +} kbts__baked_feature; + +typedef struct kbts__baked_feature_stage +{ + kbts_u16 FeatureCount; + kbts_u16 FeatureIndexCount; + kbts__baked_feature *Features; // [FeatureCount] + kbts_u16 *FeatureIndices; // [FeatureIndexCount] +} kbts__baked_feature_stage; + +#define KBTS_MAX_SIMULTANEOUS_FEATURES 32 +typedef struct kbts__shape_scratchpad +{ + kbts_arena *Arena; + + kbts__feature_set LookupFeatures; + kbts__feature_set UserFeatures; + kbts__feature_set ScratchFeatures; + + kbts__glyph_list Cluster; + int RealCluster; + int ClusterAtStartOfWord; + + kbts_glyph *LookupOnePastLastGlyph; + kbts_u32 LookupOnePastLastGlyphIndex; + + kbts_u32 NextGlyphUid; + + kbts_u32 Ip; + kbts__op_kind OpKind; + kbts__feature_set *OpFeatures; + + kbts_direction RunDirection; + + kbts_u32 FeatureIndexIndex; + kbts_u32 FeatureStagesRead; + kbts_u16 BakedLookupSubtablesRead[KBTS_MAX_SIMULTANEOUS_FEATURES]; + + kbts_u32 UnregisteredFeatureCount; + kbts_feature_tag UnregisteredFeatureTags[KBTS_MAX_SIMULTANEOUS_FEATURES]; + + kbts_shape_error Error; +} kbts__shape_scratchpad; + +#define KBTS_CONTEXT_MAX_FONT_COUNT 32 + +typedef struct kbts__config_params +{ + kbts_u32 FontIndex; + kbts_script Script; + kbts_language Language; +} kbts__config_params; + +#define KBTS__INPUT_CODEPOINT_FIRST_BLOCK_MSB 6 +#define KBTS__INPUT_CODEPOINT_ONE_PAST_LAST_BLOCK_MSB 27 + +typedef struct kbts__existing_shape_config +{ + kbts_shape_config *Config; + + kbts_font *Font; + kbts_script Script; +} kbts__existing_shape_config; + +typedef kbts_u32 kbts__context_flags; +enum kbts__context_flags_enum +{ + KBTS__CONTEXT_FLAG_NONE, + + KBTS__CONTEXT_FLAG_MANUAL_SEGMENTATION = 1, + KBTS__CONTEXT_FLAG_START_OF_MANUAL_RUN = 2, + KBTS__CONTEXT_FLAG_USE_MANUAL_BREAK_INFO = 4, +}; + +typedef struct kbts__context_font +{ + kbts_font *Font; + kbts__arena_lifetime Lifetime; +} kbts__context_font; + +typedef struct kbts_shape_context +{ + kbts_arena PermanentArena; + kbts_arena FontArena; + kbts_arena ConfigArena; + kbts_arena ScratchArena; + + kbts_allocator_function *SelfAllocator; + void *SelfAllocatorData; + + kbts_shape_codepoint *LastGraphemeBreak; + kbts_u32 LastGraphemeBreakIndex; + kbts_u32 LastLineBreakIndex; + kbts_u32 BreakStartIndex; + + kbts_u32 FontCount; + kbts__context_font Fonts[KBTS_CONTEXT_MAX_FONT_COUNT]; + + kbts__config_params *ConfigTableKeys; + kbts_shape_config **ConfigTable; + + kbts__feature_override_header FeatureOverrideSentinel; + kbts__feature_override_header FreeFeatureOverrideSentinel; + + kbts_un InputCodepointCount; + int NextUserId; + kbts_shape_codepoint *InputBlocks[KBTS__INPUT_CODEPOINT_ONE_PAST_LAST_BLOCK_MSB - KBTS__INPUT_CODEPOINT_FIRST_BLOCK_MSB]; + + kbts_glyph_storage GlyphStorage; + + kbts__context_flags Flags; + kbts_direction ManualRunDirection; + kbts_script ManualRunScript; + + kbts_u32 BeginClusterIp; + kbts_u32 BeginClusterFeatureStagesRead; + kbts_glyph *TopLevelGlyph; + + kbts__feature_set *OpFeatures; + kbts__feature_set ScratchFeatures; + kbts__feature_set UserFeatures; + kbts__feature_set UserFeaturesEnabled; + + kbts_glyph_config *CurrentGlyphConfig; + int NeedNewGlyphConfig; + + kbts_direction ParagraphDirection; + kbts_language Language; + + kbts_font *RunFont; + kbts_script RunScript; + // This may be different from ParagraphDirection if ParagraphDirection == KBTS_DIRECTION_DONT_KNOW. + kbts_direction RunParagraphDirection; + kbts_direction RunDirection; + kbts_shape_codepoint_iterator RunCodepointIterator; + int DoneShapingRuns; + + kbts_u32 ExistingShapeConfigCount; + kbts__existing_shape_config ExistingShapeConfigs[32]; + + kbts_break_state BreakState; + + kbts_u32 FrameCount; + + kbts_shape_error Error; +} kbts_shape_context; + +typedef struct kbts__indic_script_properties +{ + kbts_u32 ViramaCodepoint; + kbts_u8 BlwfPostOnly; + kbts__reph_position RephPosition; + kbts__reph_encoding RephEncoding; + kbts__syllabic_position RightSideMatraPosition; + kbts__syllabic_position AboveBaseMatraPosition; + kbts__syllabic_position BelowBaseMatraPosition; +} kbts__indic_script_properties; + +typedef struct kbts_shape_config +{ + kbts_allocator_function *Allocator; + void *AllocatorData; + + kbts_font *Font; + kbts_script Script; + kbts_language Language; + kbts__langsys *Langsys[KBTS_SHAPING_TABLE_COUNT]; + kbts__op_list OpList; + + kbts__feature_set Features; + + kbts_shaper Shaper; + kbts_shaper_properties *ShaperProperties; + + kbts__indic_script_properties IndicScriptProperties; + kbts__feature *Blwf; + kbts__feature *Pref; + kbts__feature *Pstf; + kbts__feature *Locl; + kbts__feature *Rphf; + kbts__feature *Half; + kbts__feature *Vatu; + + // Indic + kbts_glyph Virama; + + kbts_glyph DottedCircle; + kbts_glyph Whitespace; + + // Thai + kbts_glyph Nikhahit; + kbts_glyph SaraAa; + + kbts__baked_feature_stage *FeatureStages; // [OpList.FeatureStageCount] +} kbts_shape_config; + +static const kbts_u8 kbts__CmapFormatPrecedence[14] = {1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 3, 0, 4, 5}; + +static int kbts__ShaperClearsMarkAdvancesInPostGposFixup(kbts_u32 Shaper) { int Result = (1 << Shaper) & ((1 << KBTS_SHAPER_ARABIC) | (1 << KBTS_SHAPER_DEFAULT) | (1 << KBTS_SHAPER_HEBREW)); return Result; } -static kbts_indic_script_properties kbts_IndicScriptProperties(kbts_u32 Script) +static kbts__indic_script_properties kbts__IndicScriptProperties(kbts_u32 Script) { - kbts_indic_script_properties Result = KBTS_ZERO; + kbts__indic_script_properties Result = KBTS__ZERO; switch(Script) { case KBTS_SCRIPT_DEVANAGARI: { Result.ViramaCodepoint = 0x94D; - Result.RephPosition = KBTS_REPH_POSITION_BEFORE_POST; - Result.RightSideMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_SUBJOINED; - Result.AboveBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_SUBJOINED; - Result.BelowBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_SUBJOINED; + Result.RephPosition = KBTS__REPH_POSITION_BEFORE_POST; + Result.RightSideMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_SUBJOINED; + Result.AboveBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_SUBJOINED; + Result.BelowBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_SUBJOINED; } break; case KBTS_SCRIPT_BENGALI: { Result.ViramaCodepoint = 0x9CD; - Result.RephPosition = KBTS_REPH_POSITION_AFTER_SUBJOINED; - Result.RightSideMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; - Result.BelowBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_SUBJOINED; + Result.RephPosition = KBTS__REPH_POSITION_AFTER_SUBJOINED; + Result.RightSideMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; + Result.BelowBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_SUBJOINED; } break; case KBTS_SCRIPT_GUJARATI: { Result.ViramaCodepoint = 0xACD; - Result.RephPosition = KBTS_REPH_POSITION_BEFORE_POST; - Result.RightSideMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; - Result.AboveBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_SUBJOINED; - Result.BelowBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; + Result.RephPosition = KBTS__REPH_POSITION_BEFORE_POST; + Result.RightSideMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; + Result.AboveBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_SUBJOINED; + Result.BelowBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; } break; case KBTS_SCRIPT_GURMUKHI: { Result.ViramaCodepoint = 0xA4D; - Result.RephPosition = KBTS_REPH_POSITION_BEFORE_SUBJOINED; - Result.RightSideMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; - Result.AboveBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; - Result.BelowBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; + Result.RephPosition = KBTS__REPH_POSITION_BEFORE_SUBJOINED; + Result.RightSideMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; + Result.AboveBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; + Result.BelowBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; } break; @@ -12893,47 +15635,47 @@ static kbts_indic_script_properties kbts_IndicScriptProperties(kbts_u32 Script) { Result.ViramaCodepoint = 0xCCD; Result.BlwfPostOnly = 1; - Result.AboveBaseMatraPosition = KBTS_SYLLABIC_POSITION_BEFORE_SUBJOINED; - Result.BelowBaseMatraPosition = KBTS_SYLLABIC_POSITION_BEFORE_SUBJOINED; + Result.AboveBaseMatraPosition = KBTS__SYLLABIC_POSITION_BEFORE_SUBJOINED; + Result.BelowBaseMatraPosition = KBTS__SYLLABIC_POSITION_BEFORE_SUBJOINED; } break; case KBTS_SCRIPT_MALAYALAM: { Result.ViramaCodepoint = 0xD4D; - Result.RephPosition = KBTS_REPH_POSITION_AFTER_MAIN; - Result.RephEncoding = KBTS_REPH_ENCODING_LOGICAL_REPHA; - Result.RightSideMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; - Result.BelowBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; + Result.RephPosition = KBTS__REPH_POSITION_AFTER_MAIN; + Result.RephEncoding = KBTS__REPH_ENCODING_LOGICAL_REPHA; + Result.RightSideMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; + Result.BelowBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; } break; case KBTS_SCRIPT_ODIA: { Result.ViramaCodepoint = 0xB4D; - Result.RephPosition = KBTS_REPH_POSITION_AFTER_MAIN; - Result.RightSideMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; - Result.AboveBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_MAIN; - Result.BelowBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_SUBJOINED; + Result.RephPosition = KBTS__REPH_POSITION_AFTER_MAIN; + Result.RightSideMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; + Result.AboveBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_MAIN; + Result.BelowBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_SUBJOINED; } break; case KBTS_SCRIPT_TAMIL: { Result.ViramaCodepoint = 0xBCD; - Result.RightSideMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; - Result.AboveBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_SUBJOINED; - Result.BelowBaseMatraPosition = KBTS_SYLLABIC_POSITION_AFTER_POST; + Result.RightSideMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; + Result.AboveBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_SUBJOINED; + Result.BelowBaseMatraPosition = KBTS__SYLLABIC_POSITION_AFTER_POST; } break; case KBTS_SCRIPT_TELUGU: { Result.ViramaCodepoint = 0xC4D; - Result.RephEncoding = KBTS_REPH_ENCODING_EXPLICIT; + Result.RephEncoding = KBTS__REPH_ENCODING_EXPLICIT; Result.BlwfPostOnly = 1; - Result.AboveBaseMatraPosition = KBTS_SYLLABIC_POSITION_BEFORE_SUBJOINED; - Result.BelowBaseMatraPosition = KBTS_SYLLABIC_POSITION_BEFORE_SUBJOINED; + Result.AboveBaseMatraPosition = KBTS__SYLLABIC_POSITION_BEFORE_SUBJOINED; + Result.BelowBaseMatraPosition = KBTS__SYLLABIC_POSITION_BEFORE_SUBJOINED; } break; } @@ -12941,45 +15683,46 @@ static kbts_indic_script_properties kbts_IndicScriptProperties(kbts_u32 Script) return Result; } -static void kbts_ByteSwapArray16Unchecked(kbts_u16 *Array, kbts_un Count) +static void kbts__ByteSwapArray16Unchecked(kbts_u16 *Array, kbts_un Count) { - KBTS_FOR(It, 0, Count) + KBTS__FOR(It, 0, Count) { - Array[It] = kbts_ByteSwap16(Array[It]); + Array[It] = kbts__ByteSwap16(Array[It]); } } -static int kbts_ByteSwapArray16(kbts_u16 *Array, kbts_un Count, char *End) +static int kbts__ByteSwapArray16(kbts_u16 *Array, kbts_un Count, char *End) { int Result = 0; if((char *)(Array + Count) <= End) { - kbts_ByteSwapArray16Unchecked(Array, Count); + kbts__ByteSwapArray16Unchecked(Array, Count); + Result = 1; + } + + return Result; +} + +static void kbts__ByteSwapArray32Unchecked(kbts_u32 *Array, kbts_un Count) +{ + KBTS__FOR(It, 0, Count) + { + Array[It] = kbts__ByteSwap32(Array[It]); + } +} + +static int kbts__ByteSwapArray32(kbts_u32 *Array, kbts_un Count, char *End) +{ + int Result = 0; + if((char *)(Array + Count) <= End) + { + kbts__ByteSwapArray32Unchecked(Array, Count); Result = 1; } return Result; } -static void kbts_ByteSwapArray32Unchecked(kbts_u32 *Array, kbts_un Count) -{ - KBTS_FOR(It, 0, Count) - { - Array[It] = kbts_ByteSwap32(Array[It]); - } -} - -static int kbts_ByteSwapArray32(kbts_u32 *Array, kbts_un Count, char *End) -{ - int Result = 0; - if((char *)(Array + Count) <= End) - { - kbts_ByteSwapArray32Unchecked(Array, Count); - Result = 1; - } - return Result; -} - -static kbts_u64 kbts_ContainsFeature(kbts_feature_set *Set, kbts_feature_id Id) +static kbts_u64 kbts__ContainsFeature(kbts__feature_set *Set, kbts__feature_id Id) { kbts_un WordIndex = Id / 64; kbts_un BitIndex = Id % 64; @@ -12988,7 +15731,7 @@ static kbts_u64 kbts_ContainsFeature(kbts_feature_set *Set, kbts_feature_id Id) return Result; } -static void kbts_AddFeature(kbts_feature_set *Set, kbts_feature_id Id) +static void kbts__AddFeature(kbts__feature_set *Set, kbts__feature_id Id) { kbts_un WordIndex = Id / 64; kbts_un BitIndex = Id % 64; @@ -12996,202 +15739,123 @@ static void kbts_AddFeature(kbts_feature_set *Set, kbts_feature_id Id) Set->Flags[WordIndex] |= 1ull << BitIndex; } -static kbts_feature_override kbts_FeatureOverrideBase(kbts_feature_id Id, kbts_feature_tag Tag, int Alternate, kbts_u32 Value) -{ - kbts_feature_override Result = KBTS_ZERO; - Result.Id = Id; - Result.Tag = Tag; - - if(Alternate) - { - Result.EnabledOrAlternatePlusOne = Value + 1; - } - else - { - Result.EnabledOrAlternatePlusOne = Value; - } - - return Result; -} -KBTS_EXPORT kbts_feature_override kbts_FeatureOverrideFromTag(kbts_feature_tag Tag, int Alternate, kbts_u32 Value) -{ - kbts_feature_override Result = kbts_FeatureOverrideBase(kbts_FeatureTagToId(Tag), Tag, Alternate, Value); - return Result; -} -KBTS_EXPORT kbts_feature_override kbts_FeatureOverride(kbts_feature_id Id, int Alternate, kbts_u32 Value) -{ - kbts_feature_override Result = kbts_FeatureOverrideBase(Id, 0, Alternate, Value); - return Result; -} - -KBTS_EXPORT kbts_glyph_config kbts_GlyphConfig(kbts_feature_override *FeatureOverrides, kbts_u32 FeatureOverrideCount) -{ - kbts_glyph_config Result = KBTS_ZERO; - Result.FeatureOverrides = FeatureOverrides; - Result.FeatureOverrideCount = FeatureOverrideCount; - - KBTS_FOR(FeatureOverrideIndex, 0, FeatureOverrideCount) - { - kbts_feature_override *Override = &FeatureOverrides[FeatureOverrideIndex]; - if(Override->EnabledOrAlternatePlusOne) - { - kbts_AddFeature(&Result.EnabledFeatures, FeatureOverrides[FeatureOverrideIndex].Id); - } - else - { - kbts_AddFeature(&Result.DisabledFeatures, FeatureOverrides[FeatureOverrideIndex].Id); - } - } - - return Result; -} - -KBTS_EXPORT kbts_glyph_config kbts_EmptyGlyphConfig(kbts_feature_override *FeatureOverrides, kbts_u32 FeatureOverrideCapacity) -{ - kbts_glyph_config Result = KBTS_ZERO; - Result.FeatureOverrides = FeatureOverrides; - Result.FeatureOverrideCapacity = FeatureOverrideCapacity; - return Result; -} - -static int kbts_GlyphConfigOverrideFeatureBase(kbts_glyph_config *Config, kbts_feature_id Id, kbts_feature_tag Tag, int Alternate, kbts_u32 Value) -{ - kbts_feature_set *Set = &Config->EnabledFeatures; - if(!Value) - { - Set = &Config->DisabledFeatures; - } - kbts_AddFeature(Set, Id); - - if(!Id || Alternate) - { - if(Config->FeatureOverrideCount < Config->FeatureOverrideCapacity) - { - kbts_feature_override Override = kbts_FeatureOverrideFromTag(Tag, Alternate, Value); - Config->FeatureOverrides[Config->FeatureOverrideCount++] = Override; - } - Config->RequiredFeatureOverrideCapacity += 1; - } - - int Result = Config->RequiredFeatureOverrideCapacity <= Config->FeatureOverrideCapacity; - return Result; -} -KBTS_EXPORT int kbts_GlyphConfigOverrideFeature(kbts_glyph_config *Config, kbts_feature_id Id, int Alternate, kbts_u32 Value) -{ - int Result = kbts_GlyphConfigOverrideFeatureBase(Config, Id, 0, Alternate, Value); - return Result; -} -KBTS_EXPORT int kbts_GlyphConfigOverrideFeatureFromTag(kbts_glyph_config *Config, kbts_feature_tag Tag, int Alternate, kbts_u32 Value) -{ - int Result = kbts_GlyphConfigOverrideFeatureBase(Config, kbts_FeatureTagToId(Tag), Tag, Alternate, Value); - return Result; -} - // // TTF struct definitions. // enum { - KBTS_GLYPH_CLASS_BASE = 1, - KBTS_GLYPH_CLASS_LIGATURE = 2, - KBTS_GLYPH_CLASS_MARK = 3, - KBTS_GLYPH_CLASS_COMPONENT = 4, + KBTS__GLYPH_CLASS_BASE = 1, + KBTS__GLYPH_CLASS_LIGATURE = 2, + KBTS__GLYPH_CLASS_MARK = 3, + KBTS__GLYPH_CLASS_COMPONENT = 4, }; enum { - KBTS_LOOKUP_FLAG_RIGHT_TO_LEFT = 1 << 0, - KBTS_LOOKUP_FLAG_IGNORE_BASE_GLYPHS = 1 << 1, - KBTS_LOOKUP_FLAG_IGNORE_LIGATURES = 1 << 2, - KBTS_LOOKUP_FLAG_IGNORE_MARKS = 1 << 3, - KBTS_LOOKUP_FLAG_USE_MARK_FILTERING_SET = 1 << 4, + KBTS__LOOKUP_FLAG_RIGHT_TO_LEFT = 1 << 0, + KBTS__LOOKUP_FLAG_IGNORE_BASE_GLYPHS = 1 << 1, + KBTS__LOOKUP_FLAG_IGNORE_LIGATURES = 1 << 2, + KBTS__LOOKUP_FLAG_IGNORE_MARKS = 1 << 3, + KBTS__LOOKUP_FLAG_USE_MARK_FILTERING_SET = 1 << 4, - KBTS_LOOKUP_FLAG_MARK_ATTACHMENT_CLASS_FILTER = 0xFF00, + KBTS__LOOKUP_FLAG_MARK_ATTACHMENT_CLASS_FILTER = 0xFF00, }; enum { - KBTS_VALUE_FORMAT_X_PLACEMENT = 1 << 0, - KBTS_VALUE_FORMAT_Y_PLACEMENT = 1 << 1, - KBTS_VALUE_FORMAT_X_ADVANCE = 1 << 2, - KBTS_VALUE_FORMAT_Y_ADVANCE = 1 << 3, - KBTS_VALUE_FORMAT_X_PLACEMENT_DEVICE = 1 << 4, - KBTS_VALUE_FORMAT_Y_PLACEMENT_DEVICE = 1 << 5, - KBTS_VALUE_FORMAT_X_ADVANCE_DEVICE = 1 << 6, - KBTS_VALUE_FORMAT_Y_ADVANCE_DEVICE = 1 << 7, + KBTS__OS2_WIDTH_ULTRA_CONDENSED = 1, + KBTS__OS2_WIDTH_EXTRA_CONDENSED = 2, + KBTS__OS2_WIDTH_CONDENSED = 3, + KBTS__OS2_WIDTH_SEMI_CONDENSED = 4, + KBTS__OS2_WIDTH_MEDIUM = 5, + KBTS__OS2_WIDTH_SEMI_EXPANDED = 6, + KBTS__OS2_WIDTH_EXPANDED = 7, + KBTS__OS2_WIDTH_EXTRA_EXPANDED = 8, + KBTS__OS2_WIDTH_ULTRA_EXPANDED = 9, }; enum { - KBTS_DELTA_FORMAT_2_BIT = 1, - KBTS_DELTA_FORMAT_4_BIT = 2, - KBTS_DELTA_FORMAT_8_BIT = 3, - KBTS_DELTA_FORMAT_VARIATION_INDEX = 0x8000, + KBTS__VALUE_FORMAT_X_PLACEMENT = 1 << 0, + KBTS__VALUE_FORMAT_Y_PLACEMENT = 1 << 1, + KBTS__VALUE_FORMAT_X_ADVANCE = 1 << 2, + KBTS__VALUE_FORMAT_Y_ADVANCE = 1 << 3, + KBTS__VALUE_FORMAT_X_PLACEMENT_DEVICE = 1 << 4, + KBTS__VALUE_FORMAT_Y_PLACEMENT_DEVICE = 1 << 5, + KBTS__VALUE_FORMAT_X_ADVANCE_DEVICE = 1 << 6, + KBTS__VALUE_FORMAT_Y_ADVANCE_DEVICE = 1 << 7, +}; + +enum +{ + KBTS__OS2_SELECTION_FLAG_NONE, + + KBTS__OS2_SELECTION_FLAG_ITALIC = (1 << 0), + KBTS__OS2_SELECTION_FLAG_UNDERSCORE = (1 << 1), + KBTS__OS2_SELECTION_FLAG_NEGATIVE = (1 << 2), + KBTS__OS2_SELECTION_FLAG_OUTLINED = (1 << 3), + KBTS__OS2_SELECTION_FLAG_STRIKEOUT = (1 << 4), + KBTS__OS2_SELECTION_FLAG_BOLD = (1 << 5), + KBTS__OS2_SELECTION_FLAG_REGULAR = (1 << 6), + KBTS__OS2_SELECTION_FLAG_USE_TYPO_METRICS = (1 << 7), + KBTS__OS2_SELECTION_FLAG_WWS = (1 << 8), + KBTS__OS2_SELECTION_FLAG_OBLIQUE = (1 << 9), }; # pragma pack(push, 1) -typedef struct kbts_glyph_header -{ - kbts_s16 ContourCount; - kbts_s16 MinX; - kbts_s16 MinY; - kbts_s16 MaxX; - kbts_s16 MaxY; -} kbts_glyph_header; - -typedef struct kbts_script_record +typedef struct kbts__script_record { kbts_u32 Tag; kbts_u16 Offset; -} kbts_script_record; +} kbts__script_record; -typedef struct kbts_script_list +typedef struct kbts__script_list { kbts_u16 Count; - // kbts_script_record Records[Count]; -} kbts_script_list; + // kbts__script_record Records[Count]; +} kbts__script_list; -typedef struct kbts_ot_script +typedef struct kbts__ot_script { kbts_u16 DefaultLangsysOffset; kbts_u16 Count; - // kbts_langsys_record Records[Count]; -} kbts_ot_script; + // kbts__langsys_record Records[Count]; +} kbts__ot_script; -typedef struct kbts_langsys_record +typedef struct kbts__langsys_record { kbts_u32 Tag; kbts_u16 Offset; -} kbts_langsys_record; +} kbts__langsys_record; -typedef struct kbts_langsys +typedef struct kbts__langsys { kbts_u16 LookupOrderOffset; // reserved kbts_u16 RequiredFeatureIndex; kbts_u16 FeatureIndexCount; // kbts_u16 FeatureIndices[FeatureIndexCount]; -} kbts_langsys; +} kbts__langsys; -typedef struct kbts_feature_list +typedef struct kbts__feature_list { kbts_u16 Count; - // kbts_feature_record Records[Count]; -} kbts_feature_list; + // kbts__feature_record Records[Count]; +} kbts__feature_list; -typedef struct kbts_feature_record +typedef struct kbts__feature_record { kbts_u32 Tag; kbts_u16 Offset; -} kbts_feature_record; +} kbts__feature_record; -typedef struct kbts_feature +typedef struct kbts__feature { kbts_u16 FeatureParamsOffset; kbts_u16 LookupIndexCount; // kbts_u16 LookupIndices[LookupIndexCount]; -} kbts_feature; +} kbts__feature; typedef struct kbts_lookup_list { @@ -13201,7 +15865,7 @@ typedef struct kbts_lookup_list // Lookups are used both in GSUB and GPOS. // Type means either GSUB Lookup Type, or GPOS Lookup Type, depending on the table we are parsing. -typedef struct kbts_lookup +typedef struct kbts__lookup { kbts_u16 Type; kbts_u16 Flag; @@ -13209,122 +15873,122 @@ typedef struct kbts_lookup // kbts_u16 SubtableOffsets[SubtableCount]; // If USE_MARK_FILTERING_SET: // kbts_u16 MarkFilteringSet; -} kbts_lookup; +} kbts__lookup; -typedef struct kbts_coverage +typedef struct kbts__coverage { kbts_u16 Format; kbts_u16 Count; // If Format == 1: // kbts_u16 GlyphArray[Count]; // If Format == 2: - // kbts_range_record Ranges[Count]; -} kbts_coverage; + // kbts__range_record Ranges[Count]; +} kbts__coverage; -typedef struct kbts_range_record +typedef struct kbts__range_record { kbts_u16 StartGlyphId; kbts_u16 EndGlyphId; kbts_u16 StartCoverageIndex; -} kbts_range_record; +} kbts__range_record; -typedef struct kbts_class_definition_1 +typedef struct kbts__class_definition_1 { kbts_u16 Format; kbts_u16 StartGlyphId; kbts_u16 GlyphCount; // kbts_u16 ClassValues[GlyphCount]; -} kbts_class_definition_1; +} kbts__class_definition_1; -typedef struct kbts_class_definition_2 +typedef struct kbts__class_definition_2 { kbts_u16 Format; kbts_u16 Count; - // kbts_class_range_record Ranges[Count]; -} kbts_class_definition_2; + // kbts__class_range_record Ranges[Count]; +} kbts__class_definition_2; -typedef struct kbts_class_range_record +typedef struct kbts__class_range_record { kbts_u16 StartGlyphId; kbts_u16 EndGlyphId; kbts_u16 Class; -} kbts_class_range_record; +} kbts__class_range_record; -typedef struct kbts_sequence_lookup_record +typedef struct kbts__sequence_lookup_record { kbts_u16 SequenceIndex; kbts_u16 LookupListIndex; -} kbts_sequence_lookup_record; +} kbts__sequence_lookup_record; -typedef struct kbts_sequence_rule +typedef struct kbts__sequence_rule { kbts_u16 GlyphCount; kbts_u16 SequenceLookupCount; // kbts_u16 InputSequence[GlyphCount - 1]; - // kbts_sequence_lookup_record SequenceLookupRecords[SequenceLookupCount]; -} kbts_sequence_rule; + // kbts__sequence_lookup_record SequenceLookupRecords[SequenceLookupCount]; +} kbts__sequence_rule; -typedef struct kbts_sequence_rule_set +typedef struct kbts__sequence_rule_set { kbts_u16 Count; // kbts_u16 Offsets[Count]; -} kbts_sequence_rule_set; +} kbts__sequence_rule_set; -typedef struct kbts_sequence_context_1 +typedef struct kbts__sequence_context_1 { kbts_u16 Format; kbts_u16 CoverageOffset; kbts_u16 SeqRuleSetCount; // kbts_u16 SeqRuleSetOffsets[]; -} kbts_sequence_context_1; +} kbts__sequence_context_1; -typedef struct kbts_sequence_context_2 +typedef struct kbts__sequence_context_2 { kbts_u16 Format; kbts_u16 CoverageOffset; kbts_u16 ClassDefOffset; kbts_u16 ClassSequenceRuleSetCount; // kbts_u16 ClassSequenceRuleSetOffsets[ClassSequenceRuleSetCount]; May be NULL! -} kbts_sequence_context_2; +} kbts__sequence_context_2; -typedef struct kbts_class_sequence_rule_set +typedef struct kbts__class_sequence_rule_set { kbts_u16 Count; // kbts_u16 ClassSequenceRuleOffsets[Count]; -} kbts_class_sequence_rule_set; +} kbts__class_sequence_rule_set; -typedef struct kbts_class_sequence_rule +typedef struct kbts__class_sequence_rule { kbts_u16 GlyphCount; kbts_u16 SequenceLookupCount; // kbts_u16 InputSequence[GlyphCount-1]; - // kbts_sequence_lookup_record SequenceLookupRecords[SequenceLookupCount]; -} kbts_class_sequence_rule; + // kbts__sequence_lookup_record SequenceLookupRecords[SequenceLookupCount]; +} kbts__class_sequence_rule; -typedef struct kbts_sequence_context_3 +typedef struct kbts__sequence_context_3 { kbts_u16 Format; kbts_u16 GlyphCount; kbts_u16 SequenceLookupCount; // kbts_u16 CoverageOffsets[GlyphCount]; - // kbts_sequence_lookup_record SequenceLookupRecords[SequenceLookupCount]; -} kbts_sequence_context_3; + // kbts__sequence_lookup_record SequenceLookupRecords[SequenceLookupCount]; +} kbts__sequence_context_3; -typedef struct kbts_chained_sequence_context_1 +typedef struct kbts__chained_sequence_context_1 { kbts_u16 Format; kbts_u16 CoverageOffset; kbts_u16 ChainedSequenceRuleSetCount; // kbts_u16 ChainedSequenceRuleSetOffsets[ChainedSequenceRuleSetCount]; -} kbts_chained_sequence_context_1; +} kbts__chained_sequence_context_1; -typedef struct kbts_chained_sequence_rule_set +typedef struct kbts__chained_sequence_rule_set { kbts_u16 Count; // kbts_u16 Offsets[Count]; -} kbts_chained_sequence_rule_set; +} kbts__chained_sequence_rule_set; -typedef struct kbts_chained_sequence_rule +typedef struct kbts__chained_sequence_rule { kbts_u16 BacktrackGlyphCount; // kbts_u16 BacktrackSequence[BacktrackCount]; @@ -13333,10 +15997,10 @@ typedef struct kbts_chained_sequence_rule // kbts_u16 LookaheadGlyphCount; // kbts_u16 LookaheadSequence[LookaheadGlyphCount]; // kbts_u16 SequenceLookupCount; - // kbts_sequence_lookup_record SequenceLookupRecords[SequenceLookupCount]; -} kbts_chained_sequence_rule; + // kbts__sequence_lookup_record SequenceLookupRecords[SequenceLookupCount]; +} kbts__chained_sequence_rule; -typedef struct kbts_chained_sequence_context_2 +typedef struct kbts__chained_sequence_context_2 { kbts_u16 Format; kbts_u16 CoverageOffset; @@ -13345,9 +16009,9 @@ typedef struct kbts_chained_sequence_context_2 kbts_u16 LookaheadClassDefOffset; kbts_u16 ChainedClassSequenceRuleSetCount; // kbts_u16 ChainedClassSequenceRuleSetOffsets[ChainedClassSequenceRuleSetCount]; -} kbts_chained_sequence_context_2; +} kbts__chained_sequence_context_2; -typedef struct kbts_chained_sequence_context_3 +typedef struct kbts__chained_sequence_context_3 { kbts_u16 Format; kbts_u16 BacktrackGlyphCount; @@ -13357,10 +16021,10 @@ typedef struct kbts_chained_sequence_context_3 // kbts_u16 LookaheadGlyphCount; // kbts_u16 LookaheadCoverageOffsets[LookaheadGlyphCount]; // kbts_u16 SequenceLookupCount; - // kbts_sequence_lookup_record SequenceLookupRecords[SequenceLookupCount]; -} kbts_chained_sequence_context_3; + // kbts__sequence_lookup_record SequenceLookupRecords[SequenceLookupCount]; +} kbts__chained_sequence_context_3; -typedef struct kbts_device +typedef struct kbts__device { union { @@ -13378,81 +16042,95 @@ typedef struct kbts_device } U; kbts_u16 DeltaFormat; // kbts_u16 DeltaValue[]; -} kbts_device; +} kbts__device; -typedef struct kbts_feature_variations +typedef struct kbts__feature_variations { kbts_u16 Major; kbts_u16 Minor; kbts_u32 RecordCount; - // kbts_feature_variation_record Records[RecordCount]; -} kbts_feature_variations; + // kbts__feature_variation_record Records[RecordCount]; +} kbts__feature_variations; -typedef struct kbts_feature_variation_record +typedef struct kbts__feature_variation_record { kbts_u32 ConditionSetOffset; kbts_u32 FeatureTableSubstitutionOffset; -} kbts_feature_variation_record; +} kbts__feature_variation_record; -typedef struct kbts_condition_set +typedef struct kbts__condition_set { kbts_u16 Count; // kbts_u32 Offsets[Count]; -} kbts_condition_set; +} kbts__condition_set; -typedef struct kbts_condition_1 +typedef struct kbts__condition_1 { kbts_u16 Format; kbts_u16 AxisIndex; kbts_u16 FilterRangeMinValue; kbts_u16 FilterRangeMaxValue; -} kbts_condition_1; +} kbts__condition_1; -typedef struct kbts_feature_table_substitution +typedef struct kbts__feature_table_substitution { kbts_u16 Major; kbts_u16 Minor; kbts_u16 Count; - // kbts_feature_table_substitution_record Records[Count]; -} kbts_feature_table_substitution; + // kbts__feature_table_substitution_record Records[Count]; +} kbts__feature_table_substitution; -typedef struct kbts_feature_table_substitution_record +typedef struct kbts__feature_table_substitution_record { kbts_u16 FeatureIndex; kbts_u32 AlternateFeatureOffset; -} kbts_feature_table_substitution_record; +} kbts__feature_table_substitution_record; -typedef struct kbts_table_directory +typedef struct kbts__ttc_header +{ + kbts_u32 Magic; // ttcf + kbts_u16 Major; + kbts_u16 Minor; + kbts_u32 FontCount; + // kbts_u32 TableDirectoryOffsets[FontCount]; + + // If Major == 2: + // kbts_u32 DsigTag; + // kbts_u32 DsigLength; + // kbts_u32 DsigOffset; +} kbts__ttc_header; + +typedef struct kbts__table_directory { kbts_u32 Version; kbts_u16 TableCount; kbts_u16 SearchRange; kbts_u16 EntrySelector; kbts_u16 RangeShift; - // kbts_table_record Records[TableCount]; -} kbts_table_directory; + // kbts__table_record Records[TableCount]; +} kbts__table_directory; -typedef struct kbts_table_record +typedef struct kbts__table_record { kbts_u32 Tag; kbts_u32 Checksum; kbts_u32 Offset; kbts_u32 Length; -} kbts_table_record; +} kbts__table_record; -typedef struct kbts_cmap +typedef struct kbts__cmap { kbts_u16 Version; kbts_u16 TableCount; - // kbts_encoding_record Records[TableCount]; -} kbts_cmap; + // kbts__encoding_record Records[TableCount]; +} kbts__cmap; -typedef struct kbts_encoding_record +typedef struct kbts__encoding_record { kbts_u16 PlatformId; kbts_u16 EncodingId; kbts_u32 SubtableOffset; -} kbts_encoding_record; +} kbts__encoding_record; /* Precedence rules for cmap tables: - Tables are mutually exclusive, except for format 14 which completes the others. @@ -13464,33 +16142,33 @@ typedef struct kbts_encoding_record - There can be Unicode and Windows tables with the same formats. In that case, we prefer the Windows tables. */ -typedef struct kbts_cmap_0 +typedef struct kbts__cmap_0 { kbts_u16 Format; kbts_u16 Length; kbts_u16 Language; kbts_u8 GlyphIdArray[256]; -} kbts_cmap_0; +} kbts__cmap_0; -typedef struct kbts_cmap_2 +typedef struct kbts__cmap_2 { kbts_u16 Format; kbts_u16 Length; kbts_u16 Language; kbts_u16 SubHeaderKeys[256]; - // kbts_sub_header SubHeaders[]; + // kbts__sub_header SubHeaders[]; // kbts_u16 GlyphIdArray[]; -} kbts_cmap_2; +} kbts__cmap_2; -typedef struct kbts_sub_header +typedef struct kbts__sub_header { kbts_u16 FirstCode; kbts_u16 EntryCount; kbts_s16 IdDelta; kbts_u16 IdRangeOffset; -} kbts_sub_header; +} kbts__sub_header; -typedef struct kbts_cmap_4 +typedef struct kbts__cmap_4 { kbts_u16 Format; kbts_u16 Length; @@ -13505,9 +16183,9 @@ typedef struct kbts_cmap_4 // kbts_s16 IdDelta[SegmentCount]; // kbts_u16 IdRangeOffsets[SegmentCount]; // kbts_u16 GlyphIdArray[]; -} kbts_cmap_4; +} kbts__cmap_4; -typedef struct kbts_cmap_6 +typedef struct kbts__cmap_6 { kbts_u16 Format; kbts_u16 Length; @@ -13515,65 +16193,65 @@ typedef struct kbts_cmap_6 kbts_u16 FirstCode; kbts_u16 EntryCount; // kbts_u16 GlyphIdArray[EntryCount]; -} kbts_cmap_6; +} kbts__cmap_6; -typedef struct kbts_cmap_12_13 +typedef struct kbts__cmap_12_13 { kbts_u16 Format; kbts_u16 Reserved; kbts_u32 Length; kbts_u32 Language; kbts_u32 GroupCount; - // kbts_sequential_map_group Groups[GroupCount]; -} kbts_cmap_12_13; + // kbts__sequential_map_group Groups[GroupCount]; +} kbts__cmap_12_13; -typedef struct kbts_sequential_map_group +typedef struct kbts__sequential_map_group { kbts_u32 StartCharacterCode; kbts_u32 EndCharacterCode; kbts_u32 StartGlyphId; -} kbts_sequential_map_group; +} kbts__sequential_map_group; -typedef struct kbts_cmap_14 +typedef struct kbts__cmap_14 { kbts_u16 Format; kbts_u32 Length; kbts_u32 SelectorCount; - // kbts_variation_selector Selectors[SelectorCount]; -} kbts_cmap_14; + // kbts__variation_selector Selectors[SelectorCount]; +} kbts__cmap_14; -typedef struct kbts_variation_selector +typedef struct kbts__variation_selector { kbts_u8 Selector[3]; kbts_u32 DefaultUvsOffset; kbts_u32 NonDefaultUvsOffset; -} kbts_variation_selector; +} kbts__variation_selector; -typedef struct kbts_default_uvs +typedef struct kbts__default_uvs { kbts_u32 RangeCount; - // kbts_unicode_range Ranges[RangeCount]; -} kbts_default_uvs; + // kbts__unicode_range Ranges[RangeCount]; +} kbts__default_uvs; -typedef struct kbts_unicode_range +typedef struct kbts__unicode_range { kbts_u8 Start[3]; kbts_u8 Count; -} kbts_unicode_range; +} kbts__unicode_range; -typedef struct kbts_non_default_uvs +typedef struct kbts__non_default_uvs { kbts_u32 MappingCount; - // kbts_uvs_mapping Mappings[MappingCount]; -} kbts_non_default_uvs; + // kbts__uvs_mapping Mappings[MappingCount]; +} kbts__non_default_uvs; -typedef struct kbts_uvs_mapping +typedef struct kbts__uvs_mapping { kbts_u8 UnicodeValue[3]; kbts_u16 GlyphId; -} kbts_uvs_mapping; +} kbts__uvs_mapping; -typedef struct kbts_gsub_gpos +typedef struct kbts__gsub_gpos { kbts_u16 Major; kbts_u16 Minor; @@ -13581,9 +16259,9 @@ typedef struct kbts_gsub_gpos kbts_u16 FeatureListOffset; kbts_u16 LookupListOffset; kbts_u32 FeatureVariationsOffset; // Only present in v1.1 -} kbts_gsub_gpos; +} kbts__gsub_gpos; -typedef struct kbts_single_substitution +typedef struct kbts__single_substitution { kbts_u16 Format; kbts_u16 CoverageOffset; @@ -13594,65 +16272,65 @@ typedef struct kbts_single_substitution } DeltaOrCount; // If Format == 2: // kbts_u16 SubstituteGlyphIds[GlyphCount]; -} kbts_single_substitution; +} kbts__single_substitution; -typedef struct kbts_multiple_substitution +typedef struct kbts__multiple_substitution { kbts_u16 Format; kbts_u16 CoverageOffset; kbts_u16 SequenceCount; // kbts_u16 SequenceOffsets[SequenceCount]; -} kbts_multiple_substitution; +} kbts__multiple_substitution; -typedef struct kbts_sequence +typedef struct kbts__sequence { kbts_u16 GlyphCount; // kbts_u16 SubstituteGlyphIds[GlyphCount]; -} kbts_sequence; +} kbts__sequence; -typedef struct kbts_alternate_substitution +typedef struct kbts__alternate_substitution { kbts_u16 Format; kbts_u16 CoverageOffset; kbts_u16 AlternateSetCount; // kbts_u16 AlternateSetOffsets[AlternateSetCount]; -} kbts_alternate_substitution; +} kbts__alternate_substitution; -typedef struct kbts_alternate_set +typedef struct kbts__alternate_set { kbts_u16 GlyphCount; // kbts_u16 AlternateGlyphIds[GlyphCount]; -} kbts_alternate_set; +} kbts__alternate_set; -typedef struct kbts_ligature_substitution +typedef struct kbts__ligature_substitution { kbts_u16 Format; kbts_u16 CoverageOffset; kbts_u16 LigatureSetCount; // kbts_u16 LigatureSetOffsets[LigatureSetCount]; -} kbts_ligature_substitution; +} kbts__ligature_substitution; -typedef struct kbts_ligature_set +typedef struct kbts__ligature_set { kbts_u16 Count; // kbts_u16 Offsets[Count]; -} kbts_ligature_set; +} kbts__ligature_set; -typedef struct kbts_ligature +typedef struct kbts__ligature { kbts_u16 Glyph; kbts_u16 ComponentCount; // kbts_u16 ComponentGlyphIds[ComponentCount - 1]; -} kbts_ligature; +} kbts__ligature; -typedef struct kbts_extension +typedef struct kbts__extension { kbts_u16 Format; kbts_u16 LookupType; kbts_u32 Offset; -} kbts_extension; +} kbts__extension; -typedef struct kbts_reverse_chain_substitution +typedef struct kbts__reverse_chain_substitution { kbts_u16 Format; kbts_u16 CoverageOffset; @@ -13662,16 +16340,16 @@ typedef struct kbts_reverse_chain_substitution // kbts_u16 LookaheadCoverageOffsets[LookaheadGlyphCount]; // kbts_u16 GlyphCount; // kbts_u16 SubstituteGlyphIds[GlyphCount]; -} kbts_reverse_chain_substitution; +} kbts__reverse_chain_substitution; -typedef struct kbts_mark_glyph_sets +typedef struct kbts__mark_glyph_sets { kbts_u16 Format; kbts_u16 MarkGlyphSetCount; // kbts_u32 CoverageOffsets[MarkGlyphSetCount]; -} kbts_mark_glyph_sets; +} kbts__mark_glyph_sets; -typedef struct kbts_gdef +typedef struct kbts__gdef { kbts_u16 Major; kbts_u16 Minor; @@ -13681,9 +16359,9 @@ typedef struct kbts_gdef kbts_u16 MarkAttachmentClassDefinitionOffset; // May be 0 kbts_u16 MarkGlyphSetsDefinitionOffset; // v1.2 and up; may be 0 kbts_u32 ItemVariationStoreOffset; // v1.3 and up; may be 0 -} kbts_gdef; +} kbts__gdef; -typedef struct kbts_anchor +typedef struct kbts__anchor { kbts_u16 Format; kbts_s16 X; @@ -13694,51 +16372,51 @@ typedef struct kbts_anchor kbts_u16 XDeviceOffset; // If Format == 3 } U; kbts_u16 YDeviceOffset; // If Format == 3 -} kbts_anchor; +} kbts__anchor; -typedef struct kbts_mark_record +typedef struct kbts__mark_record { kbts_u16 Class; kbts_u16 AnchorOffset; -} kbts_mark_record; +} kbts__mark_record; -typedef struct kbts_mark_array +typedef struct kbts__mark_array { kbts_u16 Count; - // kbts_mark_record Records[Count]; -} kbts_mark_array; + // kbts__mark_record Records[Count]; +} kbts__mark_array; -typedef struct kbts_single_adjustment_1 +typedef struct kbts__single_adjustment_1 { kbts_u16 Format; kbts_u16 CoverageOffset; kbts_u16 ValueFormat; // ValueRecord; -} kbts_single_adjustment_1; +} kbts__single_adjustment_1; -typedef struct kbts_single_adjustment_2 +typedef struct kbts__single_adjustment_2 { kbts_u16 Format; kbts_u16 CoverageOffset; kbts_u16 ValueFormat; kbts_u16 RecordCount; // ValueRecord Records[RecordCount]; -} kbts_single_adjustment_2; +} kbts__single_adjustment_2; -typedef struct kbts_pair_value_record +typedef struct kbts__pair_value_record { kbts_u16 SecondGlyph; // ValueRecord Record1; // ValueRecord Record2; -} kbts_pair_value_record; +} kbts__pair_value_record; -typedef struct kbts_pair_set +typedef struct kbts__pair_set { kbts_u16 Count; - // kbts_pair_value_record PairValueRecords[Count]; -} kbts_pair_set; + // kbts__pair_value_record PairValueRecords[Count]; +} kbts__pair_set; -typedef struct kbts_pair_adjustment_1 +typedef struct kbts__pair_adjustment_1 { kbts_u16 Format; kbts_u16 CoverageOffset; @@ -13746,9 +16424,9 @@ typedef struct kbts_pair_adjustment_1 kbts_u16 ValueFormat2; // May be 0 kbts_u16 SetCount; // kbts_u16 SetOffsets[PairSetCount]; -} kbts_pair_adjustment_1; +} kbts__pair_adjustment_1; -typedef struct kbts_pair_adjustment_2 +typedef struct kbts__pair_adjustment_2 { kbts_u16 Format; kbts_u16 CoverageOffset; @@ -13759,29 +16437,29 @@ typedef struct kbts_pair_adjustment_2 kbts_u16 Class1Count; kbts_u16 Class2Count; // ValueRecord ValueRecords[Class1Count][Class2Count][2]; -} kbts_pair_adjustment_2; +} kbts__pair_adjustment_2; -typedef struct kbts_entry_exit +typedef struct kbts__entry_exit { kbts_u16 EntryAnchorOffset; kbts_u16 ExitAnchorOffset; -} kbts_entry_exit; +} kbts__entry_exit; -typedef struct kbts_cursive_attachment +typedef struct kbts__cursive_attachment { kbts_u16 Format; kbts_u16 CoverageOffset; kbts_u16 EntryExitCount; - // kbts_entry_exit Records[EntryExitCount]; -} kbts_cursive_attachment; + // kbts__entry_exit Records[EntryExitCount]; +} kbts__cursive_attachment; -typedef struct kbts_base_array +typedef struct kbts__base_array { kbts_u16 BaseCount; // kbts_u16 BaseAnchorOffsets[BaseCount][MarkClassCount]; // May be NULL -} kbts_base_array; +} kbts__base_array; -typedef struct kbts_mark_to_base_attachment +typedef struct kbts__mark_to_base_attachment { kbts_u16 Format; kbts_u16 MarkCoverageOffset; @@ -13789,21 +16467,21 @@ typedef struct kbts_mark_to_base_attachment kbts_u16 MarkClassCount; kbts_u16 MarkArrayOffset; kbts_u16 BaseArrayOffset; -} kbts_mark_to_base_attachment; +} kbts__mark_to_base_attachment; -typedef struct kbts_ligature_attach +typedef struct kbts__ligature_attach { kbts_u16 Count; // kbts_u16 LigatureAnchorOffsets[Count][MarkClassCount]; // May be NULL -} kbts_ligature_attach; +} kbts__ligature_attach; -typedef struct kbts_ligature_array +typedef struct kbts__ligature_array { kbts_u16 Count; // kbts_u16 LigatureAttachOffsets[Count]; -} kbts_ligature_array; +} kbts__ligature_array; -typedef struct kbts_mark_to_ligature_attachment +typedef struct kbts__mark_to_ligature_attachment { kbts_u16 Format; kbts_u16 MarkCoverageOffset; @@ -13811,15 +16489,15 @@ typedef struct kbts_mark_to_ligature_attachment kbts_u16 MarkClassCount; kbts_u16 MarkArrayOffset; kbts_u16 LigatureArrayOffset; -} kbts_mark_to_ligature_attachment; +} kbts__mark_to_ligature_attachment; -typedef struct kbts_long_mtx +typedef struct kbts__long_mtx { kbts_u16 Advance; kbts_s16 PreviousSideBearing; -} kbts_long_mtx; +} kbts__long_mtx; -struct kbts_head +struct kbts__head { kbts_u16 Major; kbts_u16 Minor; @@ -13841,7 +16519,7 @@ struct kbts_head kbts_s16 GlyphDataFormat; // Only 0 is defined. }; -typedef struct kbts_hea +typedef struct kbts__hea { kbts_u16 Major; kbts_u16 Minor; @@ -13865,9 +16543,84 @@ typedef struct kbts_hea kbts_s16 MetricDataFormat; kbts_u16 MetricCount; -} kbts_hea; +} kbts__hea; -typedef struct kbts_maxp +typedef struct kbts__os2 +{ + kbts_u16 Version; + kbts_s16 AverageCharacterWidth; + kbts_u16 WeightClass; + kbts_u16 WidthClass; + kbts_u16 Type; + kbts_s16 SubscriptXSize; + kbts_s16 SubscriptYSize; + kbts_s16 SubscriptXOffset; + kbts_s16 SubscriptYOffset; + kbts_s16 SuperscriptXSize; + kbts_s16 SuperscriptYSize; + kbts_s16 SuperscriptXOffset; + kbts_s16 SuperscriptYOffset; + kbts_s16 StrikeoutSize; + kbts_s16 StrikeoutPosition; + kbts_s16 FamilyClass; + kbts_u8 Panose[10]; + kbts_u32 UnicodeRange[4]; + kbts_u32 VendorId; + kbts_u16 Selection; + kbts_u16 FirstCharacterIndex; + kbts_u16 LastCharacterIndex; + + // Some version 0 fonts support this, others do not. + kbts_s16 TypoAscender; + kbts_s16 TypoDescender; + kbts_s16 TypoLineGap; + kbts_u16 WinAscent; + kbts_u16 WinDescent; + + // If Version >= 1: + kbts_u32 CodePageRange[2]; + + // If Version >= 2: + kbts_s16 Height; + kbts_s16 CapHeight; + kbts_u16 DefaultChar; + kbts_u16 BreakChar; + kbts_u16 MaxContext; + + // If Version >= 5: + kbts_u16 LowerOpticalPointSize; + kbts_u16 UpperOpticalPointSize; +} kbts__os2; + +typedef struct kbts__lang_tag_record +{ + kbts_u16 Length; + kbts_u16 LangTagOffset; +} kbts__lang_tag_record; + +typedef struct kbts__name_record +{ + kbts_u16 PlatformId; + kbts_u16 EncodingId; + kbts_u16 LanguageId; + kbts_u16 NameId; + kbts_u16 Length; + kbts_u16 StringOffset; +} kbts__name_record; + +typedef struct kbts__name +{ + kbts_u16 Version; + kbts_u16 Count; + kbts_u16 StringStorageOffset; + // kbts__name_record Records[Count]; + + // If Version == 1: + // kbts_u16 LangTagCount; + // kbts__lang_tag_record LangTags[LangTagCount]; +} kbts__name; + +typedef struct kbts__maxp { kbts_u16 Major; kbts_u16 Minor; @@ -13887,7 +16640,7 @@ typedef struct kbts_maxp kbts_u16 MaximumInstructionSize; kbts_u16 MaximumTopLevelComponentCount; kbts_u16 MaximumComponentDepth; -} kbts_maxp; +} kbts__maxp; # pragma pack(pop) @@ -13895,70 +16648,70 @@ typedef struct kbts_maxp // Unpack functions for TTF structs. // -typedef struct kbts_script_pointer +typedef struct kbts__script_pointer { kbts_u32 Tag; - kbts_ot_script *Script; -} kbts_script_pointer; + kbts__ot_script *Script; +} kbts__script_pointer; -typedef struct kbts_langsys_pointer +typedef struct kbts__langsys_pointer { kbts_u32 Tag; - kbts_langsys *Langsys; -} kbts_langsys_pointer; + kbts__langsys *Langsys; +} kbts__langsys_pointer; -typedef struct kbts_feature_pointer +typedef struct kbts__feature_pointer { kbts_u32 Tag; - kbts_feature *Feature; -} kbts_feature_pointer; + kbts__feature *Feature; +} kbts__feature_pointer; -typedef struct kbts_feature_variation_pointer +typedef struct kbts__feature_variation_pointer { - kbts_condition_set *ConditionSet; - kbts_feature_table_substitution *FeatureTableSubstitution; -} kbts_feature_variation_pointer; + kbts__condition_set *ConditionSet; + kbts__feature_table_substitution *FeatureTableSubstitution; +} kbts__feature_variation_pointer; -typedef struct kbts_feature_substitution_pointer +typedef struct kbts__feature_substitution_pointer { kbts_u16 SubstitutedFeatureIndex; - kbts_feature *AlternateFeature; -} kbts_feature_substitution_pointer; + kbts__feature *AlternateFeature; +} kbts__feature_substitution_pointer; -typedef struct kbts_cmap_subtable_pointer +typedef struct kbts__cmap_subtable_pointer { kbts_u16 PlatformId; kbts_u16 EncodingId; kbts_u16 *Subtable; -} kbts_cmap_subtable_pointer; +} kbts__cmap_subtable_pointer; -typedef struct kbts_unpacked_chained_sequence_rule +typedef struct kbts__unpacked_chained_sequence_rule { kbts_u16 *Input; kbts_u16 *Backtrack; kbts_u16 *Lookahead; - kbts_sequence_lookup_record *Records; + kbts__sequence_lookup_record *Records; kbts_u16 BacktrackCount; kbts_u16 InputCount; kbts_u16 LookaheadCount; kbts_u16 RecordCount; -} kbts_unpacked_chained_sequence_rule; +} kbts__unpacked_chained_sequence_rule; -typedef struct kbts_unpacked_chained_sequence_context_3 +typedef struct kbts__unpacked_chained_sequence_context_3 { kbts_u16 *BacktrackCoverageOffsets; kbts_u16 *InputCoverageOffsets; kbts_u16 *LookaheadCoverageOffsets; - kbts_sequence_lookup_record *Records; + kbts__sequence_lookup_record *Records; kbts_u16 BacktrackCount; kbts_u16 InputCount; kbts_u16 LookaheadCount; kbts_u16 RecordCount; -} kbts_unpacked_chained_sequence_context_3; +} kbts__unpacked_chained_sequence_context_3; -typedef struct kbts_unpacked_reverse_chain_substitution +typedef struct kbts__unpacked_reverse_chain_substitution { kbts_u16 *BacktrackCoverageOffsets; kbts_u16 *LookaheadCoverageOffsets; @@ -13967,9 +16720,9 @@ typedef struct kbts_unpacked_reverse_chain_substitution kbts_u16 BacktrackCount; kbts_u16 LookaheadCount; kbts_u16 GlyphCount; -} kbts_unpacked_reverse_chain_substitution; +} kbts__unpacked_reverse_chain_substitution; -typedef struct kbts_unpacked_value_record +typedef struct kbts__unpacked_value_record { kbts_u16 Size; @@ -13977,68 +16730,68 @@ typedef struct kbts_unpacked_value_record kbts_s16 PlacementY; kbts_s16 AdvanceX; kbts_s16 AdvanceY; - kbts_device *PlacementXDevice; - kbts_device *PlacementYDevice; - kbts_device *AdvanceXDevice; - kbts_device *AdvanceYDevice; -} kbts_unpacked_value_record; + kbts__device *PlacementXDevice; + kbts__device *PlacementYDevice; + kbts__device *AdvanceXDevice; + kbts__device *AdvanceYDevice; +} kbts__unpacked_value_record; -static kbts_unpacked_value_record kbts_UnpackValueRecord(void *Parent, kbts_u16 Format, kbts_u16 *Record) +static kbts__unpacked_value_record kbts__UnpackValueRecord(void *Parent, kbts_u16 Format, kbts_u16 *Record) { - kbts_unpacked_value_record Result = KBTS_ZERO; + kbts__unpacked_value_record Result = KBTS__ZERO; kbts_u16 *At = Record; - if(Format & KBTS_VALUE_FORMAT_X_PLACEMENT) + if(Format & KBTS__VALUE_FORMAT_X_PLACEMENT) { Result.PlacementX = (kbts_s16)*At++; } - if(Format & KBTS_VALUE_FORMAT_Y_PLACEMENT) + if(Format & KBTS__VALUE_FORMAT_Y_PLACEMENT) { Result.PlacementY = (kbts_s16)*At++; } - if(Format & KBTS_VALUE_FORMAT_X_ADVANCE) + if(Format & KBTS__VALUE_FORMAT_X_ADVANCE) { Result.AdvanceX = (kbts_s16)*At++; } - if(Format & KBTS_VALUE_FORMAT_Y_ADVANCE) + if(Format & KBTS__VALUE_FORMAT_Y_ADVANCE) { Result.AdvanceY = (kbts_s16)*At++; } - if(Format & KBTS_VALUE_FORMAT_X_PLACEMENT_DEVICE) + if(Format & KBTS__VALUE_FORMAT_X_PLACEMENT_DEVICE) { kbts_u16 Offset = *At++; if(Offset) { - Result.PlacementXDevice = KBTS_POINTER_OFFSET(kbts_device, Parent, Offset); + Result.PlacementXDevice = KBTS__POINTER_OFFSET(kbts__device, Parent, Offset); } } - if(Format & KBTS_VALUE_FORMAT_Y_PLACEMENT_DEVICE) + if(Format & KBTS__VALUE_FORMAT_Y_PLACEMENT_DEVICE) { kbts_u16 Offset = *At++; if(Offset) { - Result.PlacementYDevice = KBTS_POINTER_OFFSET(kbts_device, Parent, Offset); + Result.PlacementYDevice = KBTS__POINTER_OFFSET(kbts__device, Parent, Offset); } } - if(Format & KBTS_VALUE_FORMAT_X_ADVANCE_DEVICE) + if(Format & KBTS__VALUE_FORMAT_X_ADVANCE_DEVICE) { kbts_u16 Offset = *At++; if(Offset) { - Result.AdvanceXDevice = KBTS_POINTER_OFFSET(kbts_device, Parent, Offset); + Result.AdvanceXDevice = KBTS__POINTER_OFFSET(kbts__device, Parent, Offset); } } - if(Format & KBTS_VALUE_FORMAT_Y_ADVANCE_DEVICE) + if(Format & KBTS__VALUE_FORMAT_Y_ADVANCE_DEVICE) { kbts_u16 Offset = *At++; if(Offset) { - Result.AdvanceYDevice = KBTS_POINTER_OFFSET(kbts_device, Parent, Offset); + Result.AdvanceYDevice = KBTS__POINTER_OFFSET(kbts__device, Parent, Offset); } } @@ -14047,131 +16800,131 @@ static kbts_unpacked_value_record kbts_UnpackValueRecord(void *Parent, kbts_u16 return Result; } -static kbts_unpacked_reverse_chain_substitution kbts_UnpackReverseChainSubstitution(kbts_reverse_chain_substitution *Subst, int ByteSwap) +static kbts__unpacked_reverse_chain_substitution kbts__UnpackReverseChainSubstitution(kbts__reverse_chain_substitution *Subst, int ByteSwap) { - kbts_unpacked_reverse_chain_substitution Result; + kbts__unpacked_reverse_chain_substitution Result; - Result.BacktrackCoverageOffsets = KBTS_POINTER_AFTER(kbts_u16, Subst); + Result.BacktrackCoverageOffsets = KBTS__POINTER_AFTER(kbts_u16, Subst); Result.BacktrackCount = Subst->BacktrackGlyphCount; if(ByteSwap) { - Result.BacktrackCount = kbts_ByteSwap16(Result.BacktrackCount); + Result.BacktrackCount = kbts__ByteSwap16(Result.BacktrackCount); } Result.LookaheadCoverageOffsets = Result.BacktrackCoverageOffsets + Result.BacktrackCount + 1; Result.LookaheadCount = Result.BacktrackCoverageOffsets[Result.BacktrackCount]; if(ByteSwap) { - Result.LookaheadCount = kbts_ByteSwap16(Result.LookaheadCount); + Result.LookaheadCount = kbts__ByteSwap16(Result.LookaheadCount); } Result.SubstituteGlyphIds = Result.LookaheadCoverageOffsets + Result.LookaheadCount + 1; Result.GlyphCount = Result.LookaheadCoverageOffsets[Result.LookaheadCount]; if(ByteSwap) { - Result.GlyphCount = kbts_ByteSwap16(Result.GlyphCount); + Result.GlyphCount = kbts__ByteSwap16(Result.GlyphCount); } return Result; } -static kbts_unpacked_chained_sequence_rule kbts_UnpackChainedSequenceRule(kbts_chained_sequence_rule *Rule, int ByteSwap) +static kbts__unpacked_chained_sequence_rule kbts__UnpackChainedSequenceRule(kbts__chained_sequence_rule *Rule, int ByteSwap) { - kbts_unpacked_chained_sequence_rule Result; + kbts__unpacked_chained_sequence_rule Result; - Result.Backtrack = KBTS_POINTER_AFTER(kbts_u16, Rule); + Result.Backtrack = KBTS__POINTER_AFTER(kbts_u16, Rule); Result.BacktrackCount = Rule->BacktrackGlyphCount; if(ByteSwap) { - Result.BacktrackCount = kbts_ByteSwap16(Result.BacktrackCount); + Result.BacktrackCount = kbts__ByteSwap16(Result.BacktrackCount); } Result.Input = Result.Backtrack + Result.BacktrackCount + 1; Result.InputCount = Result.Backtrack[Result.BacktrackCount]; if(ByteSwap) { - Result.InputCount = kbts_ByteSwap16(Result.InputCount); + Result.InputCount = kbts__ByteSwap16(Result.InputCount); } Result.Lookahead = Result.Input + Result.InputCount; Result.LookaheadCount = Result.Input[Result.InputCount - 1]; if(ByteSwap) { - Result.LookaheadCount = kbts_ByteSwap16(Result.LookaheadCount); + Result.LookaheadCount = kbts__ByteSwap16(Result.LookaheadCount); } - Result.Records = (kbts_sequence_lookup_record *)(Result.Lookahead + Result.LookaheadCount + 1); + Result.Records = (kbts__sequence_lookup_record *)(Result.Lookahead + Result.LookaheadCount + 1); Result.RecordCount = Result.Lookahead[Result.LookaheadCount]; if(ByteSwap) { - Result.RecordCount = kbts_ByteSwap16(Result.RecordCount); + Result.RecordCount = kbts__ByteSwap16(Result.RecordCount); } return Result; } -static kbts_unpacked_chained_sequence_context_3 kbts_UnpackChainedSequenceContext3(kbts_chained_sequence_context_3 *Subst, int ByteSwap) +static kbts__unpacked_chained_sequence_context_3 kbts__UnpackChainedSequenceContext3(kbts__chained_sequence_context_3 *Subst, int ByteSwap) { - kbts_unpacked_chained_sequence_context_3 Result; + kbts__unpacked_chained_sequence_context_3 Result; - Result.BacktrackCoverageOffsets = KBTS_POINTER_AFTER(kbts_u16, Subst); + Result.BacktrackCoverageOffsets = KBTS__POINTER_AFTER(kbts_u16, Subst); Result.BacktrackCount = Subst->BacktrackGlyphCount; if(ByteSwap) { - Result.BacktrackCount = kbts_ByteSwap16(Result.BacktrackCount); + Result.BacktrackCount = kbts__ByteSwap16(Result.BacktrackCount); } Result.InputCoverageOffsets = Result.BacktrackCoverageOffsets + Result.BacktrackCount + 1; Result.InputCount = Result.BacktrackCoverageOffsets[Result.BacktrackCount]; if(ByteSwap) { - Result.InputCount = kbts_ByteSwap16(Result.InputCount); + Result.InputCount = kbts__ByteSwap16(Result.InputCount); } Result.LookaheadCoverageOffsets = Result.InputCoverageOffsets + Result.InputCount + 1; Result.LookaheadCount = Result.InputCoverageOffsets[Result.InputCount]; if(ByteSwap) { - Result.LookaheadCount = kbts_ByteSwap16(Result.LookaheadCount); + Result.LookaheadCount = kbts__ByteSwap16(Result.LookaheadCount); } - Result.Records = (kbts_sequence_lookup_record *)(Result.LookaheadCoverageOffsets + Result.LookaheadCount + 1); + Result.Records = (kbts__sequence_lookup_record *)(Result.LookaheadCoverageOffsets + Result.LookaheadCount + 1); Result.RecordCount = Result.LookaheadCoverageOffsets[Result.LookaheadCount]; if(ByteSwap) { - Result.RecordCount = kbts_ByteSwap16(Result.RecordCount); + Result.RecordCount = kbts__ByteSwap16(Result.RecordCount); } return Result; } -typedef struct kbts_unpacked_lookup +typedef struct kbts__unpacked_lookup { kbts_u16 *SubtableOffsets; - kbts_coverage *MarkFilteringSet; + kbts__coverage *MarkFilteringSet; kbts_u16 Type; kbts_u16 Flags; kbts_u16 SubtableCount; -} kbts_unpacked_lookup; +} kbts__unpacked_lookup; -static kbts_unpacked_lookup kbts_UnpackLookup(kbts_gdef *Gdef, kbts_lookup *Lookup) +static kbts__unpacked_lookup kbts__UnpackLookup(kbts__gdef *Gdef, kbts__lookup *Lookup) { - kbts_unpacked_lookup Result = KBTS_ZERO; + kbts__unpacked_lookup Result = KBTS__ZERO; Result.Type = Lookup->Type; Result.Flags = Lookup->Flag; Result.SubtableCount = Lookup->SubtableCount; - Result.SubtableOffsets = KBTS_POINTER_AFTER(kbts_u16, Lookup); - if(Result.Flags & KBTS_LOOKUP_FLAG_USE_MARK_FILTERING_SET) + Result.SubtableOffsets = KBTS__POINTER_AFTER(kbts_u16, Lookup); + if(Result.Flags & KBTS__LOOKUP_FLAG_USE_MARK_FILTERING_SET) { kbts_u16 MarkFilteringSetIndex = Result.SubtableOffsets[Result.SubtableCount]; if(Gdef && Gdef->MarkGlyphSetsDefinitionOffset) { - kbts_mark_glyph_sets *MarkGlyphSets = KBTS_POINTER_OFFSET(kbts_mark_glyph_sets, Gdef, Gdef->MarkGlyphSetsDefinitionOffset); + kbts__mark_glyph_sets *MarkGlyphSets = KBTS__POINTER_OFFSET(kbts__mark_glyph_sets, Gdef, Gdef->MarkGlyphSetsDefinitionOffset); if(MarkGlyphSets->MarkGlyphSetCount > MarkFilteringSetIndex) { - kbts_u32 *CoverageOffsets = KBTS_POINTER_AFTER(kbts_u32, MarkGlyphSets); - Result.MarkFilteringSet = KBTS_POINTER_OFFSET(kbts_coverage, MarkGlyphSets, CoverageOffsets[MarkFilteringSetIndex]); + kbts_u32 *CoverageOffsets = KBTS__POINTER_AFTER(kbts_u32, MarkGlyphSets); + Result.MarkFilteringSet = KBTS__POINTER_OFFSET(kbts__coverage, MarkGlyphSets, CoverageOffsets[MarkFilteringSetIndex]); } } } @@ -14179,248 +16932,248 @@ static kbts_unpacked_lookup kbts_UnpackLookup(kbts_gdef *Gdef, kbts_lookup *Look return Result; } -static kbts_script_pointer kbts_GetScript(kbts_script_list *List, kbts_un Index) +static kbts__script_pointer kbts__GetScript(kbts__script_list *List, kbts_un Index) { - kbts_script_record *Records = (kbts_script_record *)(List + 1); - kbts_script_record *Record = &Records[Index]; + kbts__script_record *Records = (kbts__script_record *)(List + 1); + kbts__script_record *Record = &Records[Index]; - kbts_script_pointer Result; + kbts__script_pointer Result; Result.Tag = Record->Tag; - Result.Script = (kbts_ot_script *)((char *)List + Record->Offset); + Result.Script = (kbts__ot_script *)((char *)List + Record->Offset); return Result; } -static kbts_langsys *kbts_GetDefaultLangsys(kbts_ot_script *Script) +static kbts__langsys *kbts__GetDefaultLangsys(kbts__ot_script *Script) { - kbts_langsys *Result = Script->DefaultLangsysOffset ? KBTS_POINTER_OFFSET(kbts_langsys, Script, Script->DefaultLangsysOffset) : 0; + kbts__langsys *Result = Script->DefaultLangsysOffset ? KBTS__POINTER_OFFSET(kbts__langsys, Script, Script->DefaultLangsysOffset) : 0; return Result; } -static kbts_langsys_pointer kbts_GetLangsys(kbts_ot_script *Script, kbts_un Index) +static kbts__langsys_pointer kbts__GetLangsys(kbts__ot_script *Script, kbts_un Index) { - kbts_langsys_record *Records = (kbts_langsys_record *)(Script + 1); - kbts_langsys_record *Record = &Records[Index]; + kbts__langsys_record *Records = (kbts__langsys_record *)(Script + 1); + kbts__langsys_record *Record = &Records[Index]; - kbts_langsys_pointer Result; + kbts__langsys_pointer Result; Result.Tag = Record->Tag; - Result.Langsys = KBTS_POINTER_OFFSET(kbts_langsys, Script, Record->Offset); + Result.Langsys = KBTS__POINTER_OFFSET(kbts__langsys, Script, Record->Offset); return Result; } -static kbts_feature_pointer kbts_GetFeature(kbts_feature_list *List, kbts_un Index) +static kbts__feature_pointer kbts__GetFeature(kbts__feature_list *List, kbts_un Index) { - kbts_feature_record *Records = (kbts_feature_record *)(List + 1); - kbts_feature_record *Record = &Records[Index]; + kbts__feature_record *Records = (kbts__feature_record *)(List + 1); + kbts__feature_record *Record = &Records[Index]; - kbts_feature_pointer Result; + kbts__feature_pointer Result; Result.Tag = Record->Tag; - Result.Feature = KBTS_POINTER_OFFSET(kbts_feature, List, Record->Offset); + Result.Feature = KBTS__POINTER_OFFSET(kbts__feature, List, Record->Offset); return Result; } -static kbts_lookup_list *kbts_GetLookupList(kbts_gsub_gpos *GsubGpos) +static kbts_lookup_list *kbts__GetLookupList(kbts__gsub_gpos *GsubGpos) { kbts_lookup_list *Result = 0; if(GsubGpos) { - Result = KBTS_POINTER_OFFSET(kbts_lookup_list, GsubGpos, GsubGpos->LookupListOffset); + Result = KBTS__POINTER_OFFSET(kbts_lookup_list, GsubGpos, GsubGpos->LookupListOffset); } return Result; } -static kbts_lookup *kbts_GetLookup(kbts_lookup_list *List, kbts_un Index) +static kbts__lookup *kbts__GetLookup(kbts_lookup_list *List, kbts_un Index) { KBTS_ASSERT(Index < List->Count); kbts_u16 *Offsets = (kbts_u16 *)(List + 1); - kbts_lookup *Result = KBTS_POINTER_OFFSET(kbts_lookup, List, Offsets[Index]); + kbts__lookup *Result = KBTS__POINTER_OFFSET(kbts__lookup, List, Offsets[Index]); return Result; } -static kbts_sequence_rule_set *kbts_GetSequenceRuleSet(kbts_sequence_context_1 *Context, kbts_un Index) +static kbts__sequence_rule_set *kbts__GetSequenceRuleSet(kbts__sequence_context_1 *Context, kbts_un Index) { KBTS_ASSERT(Index < Context->SeqRuleSetCount); kbts_u16 *Offsets = (kbts_u16 *)(Context + 1); kbts_u16 Offset = Offsets[Index]; - kbts_sequence_rule_set *Result = Offset ? KBTS_POINTER_OFFSET(kbts_sequence_rule_set, Context, Offsets[Index]) : 0; + kbts__sequence_rule_set *Result = Offset ? KBTS__POINTER_OFFSET(kbts__sequence_rule_set, Context, Offsets[Index]) : 0; return Result; } -static kbts_sequence_rule *kbts_GetSequenceRule(kbts_sequence_rule_set *Set, kbts_un Index) +static kbts__sequence_rule *kbts__GetSequenceRule(kbts__sequence_rule_set *Set, kbts_un Index) { KBTS_ASSERT(Index < Set->Count); kbts_u16 *Offsets = (kbts_u16 *)(Set + 1); - kbts_sequence_rule *Result = KBTS_POINTER_OFFSET(kbts_sequence_rule, Set, Offsets[Index]); + kbts__sequence_rule *Result = KBTS__POINTER_OFFSET(kbts__sequence_rule, Set, Offsets[Index]); return Result; } // A single class definition table can be used by multiple lookups, so it is possible // (and valid) to get an out-of-bounds glyph class. -static kbts_class_sequence_rule_set *kbts_GetClassSequenceRuleSet(kbts_sequence_context_2 *Context, kbts_un Index) +static kbts__class_sequence_rule_set *kbts__GetClassSequenceRuleSet(kbts__sequence_context_2 *Context, kbts_un Index) { - kbts_class_sequence_rule_set *Result = 0; + kbts__class_sequence_rule_set *Result = 0; if(Index < Context->ClassSequenceRuleSetCount) { kbts_u16 *Offsets = (kbts_u16 *)(Context + 1); - Result = Offsets[Index] ? KBTS_POINTER_OFFSET(kbts_class_sequence_rule_set, Context, Offsets[Index]) : 0; + Result = Offsets[Index] ? KBTS__POINTER_OFFSET(kbts__class_sequence_rule_set, Context, Offsets[Index]) : 0; } return Result; } -static kbts_class_sequence_rule *kbts_GetClassSequenceRule(kbts_class_sequence_rule_set *Set, kbts_un Index) +static kbts__class_sequence_rule *kbts__GetClassSequenceRule(kbts__class_sequence_rule_set *Set, kbts_un Index) { KBTS_ASSERT(Index < Set->Count); kbts_u16 *Offsets = (kbts_u16 *)(Set + 1); - kbts_class_sequence_rule *Result = KBTS_POINTER_OFFSET(kbts_class_sequence_rule, Set, Offsets[Index]); + kbts__class_sequence_rule *Result = KBTS__POINTER_OFFSET(kbts__class_sequence_rule, Set, Offsets[Index]); return Result; } -static kbts_chained_sequence_rule_set *kbts_GetChainedSequenceRuleSet(kbts_chained_sequence_context_1 *Context, kbts_un Index) +static kbts__chained_sequence_rule_set *kbts__GetChainedSequenceRuleSet(kbts__chained_sequence_context_1 *Context, kbts_un Index) { kbts_u16 *Offsets = (kbts_u16 *)(Context + 1); - kbts_chained_sequence_rule_set *Result = Offsets[Index] ? KBTS_POINTER_OFFSET(kbts_chained_sequence_rule_set, Context, Offsets[Index]) : 0; + kbts__chained_sequence_rule_set *Result = Offsets[Index] ? KBTS__POINTER_OFFSET(kbts__chained_sequence_rule_set, Context, Offsets[Index]) : 0; return Result; } -static kbts_chained_sequence_rule *kbts_GetChainedSequenceRule(kbts_chained_sequence_rule_set *Set, kbts_un Index) +static kbts__chained_sequence_rule *kbts__GetChainedSequenceRule(kbts__chained_sequence_rule_set *Set, kbts_un Index) { kbts_u16 *Offsets = (kbts_u16 *)(Set + 1); - kbts_chained_sequence_rule *Result = KBTS_POINTER_OFFSET(kbts_chained_sequence_rule, Set, Offsets[Index]); + kbts__chained_sequence_rule *Result = KBTS__POINTER_OFFSET(kbts__chained_sequence_rule, Set, Offsets[Index]); return Result; } -static kbts_chained_sequence_rule_set *kbts_GetChainedClassSequenceRuleSet(kbts_chained_sequence_context_2 *Context, kbts_un Index) +static kbts__chained_sequence_rule_set *kbts__GetChainedClassSequenceRuleSet(kbts__chained_sequence_context_2 *Context, kbts_un Index) { kbts_u16 *Offsets = (kbts_u16 *)(Context + 1); kbts_u16 Offset = Offsets[Index]; - kbts_chained_sequence_rule_set *Result = Offset ? KBTS_POINTER_OFFSET(kbts_chained_sequence_rule_set, Context, Offset) : NULL; + kbts__chained_sequence_rule_set *Result = Offset ? KBTS__POINTER_OFFSET(kbts__chained_sequence_rule_set, Context, Offset) : NULL; return Result; } -static kbts_chained_sequence_rule *kbts_GetChainedClassSequenceRule(kbts_chained_sequence_rule_set *Set, kbts_un Index) +static kbts__chained_sequence_rule *kbts__GetChainedClassSequenceRule(kbts__chained_sequence_rule_set *Set, kbts_un Index) { kbts_u16 *Offsets = (kbts_u16 *)(Set + 1); - kbts_chained_sequence_rule *Result = KBTS_POINTER_OFFSET(kbts_chained_sequence_rule, Set, Offsets[Index]); + kbts__chained_sequence_rule *Result = KBTS__POINTER_OFFSET(kbts__chained_sequence_rule, Set, Offsets[Index]); return Result; } #if 0 // @Incomplete -static kbts_feature_variation_pointer kbts_GetFeatureVariation(kbts_feature_variations *Variations, kbts_un Index) +static kbts__feature_variation_pointer kbts__GetFeatureVariation(kbts__feature_variations *Variations, kbts_un Index) { - kbts_feature_variation_record *Records = (kbts_feature_variation_record *)(Variations + 1); - kbts_feature_variation_record *Record = &Records[Index]; + kbts__feature_variation_record *Records = (kbts__feature_variation_record *)(Variations + 1); + kbts__feature_variation_record *Record = &Records[Index]; - kbts_feature_variation_pointer Result; - Result.ConditionSet = KBTS_POINTER_OFFSET(kbts_condition_set, Variations, Record->ConditionSetOffset); - Result.FeatureTableSubstitution = KBTS_POINTER_OFFSET(kbts_feature_table_substitution, Variations, Record->FeatureTableSubstitutionOffset); + kbts__feature_variation_pointer Result; + Result.ConditionSet = KBTS__POINTER_OFFSET(kbts__condition_set, Variations, Record->ConditionSetOffset); + Result.FeatureTableSubstitution = KBTS__POINTER_OFFSET(kbts__feature_table_substitution, Variations, Record->FeatureTableSubstitutionOffset); return Result; } -static kbts_condition_1 *kbts_GetCondition(kbts_condition_set *Set, kbts_un Index) +static kbts__condition_1 *kbts__GetCondition(kbts__condition_set *Set, kbts_un Index) { kbts_u32 *Offsets = (kbts_u32 *)(Set + 1); - kbts_condition_1 *Result = KBTS_POINTER_OFFSET(kbts_condition_1, Set, Offsets[Index]); + kbts__condition_1 *Result = KBTS__POINTER_OFFSET(kbts__condition_1, Set, Offsets[Index]); return Result; } -static kbts_feature_substitution_pointer kbts_GetFeatureSubstitution(kbts_feature_table_substitution *Table, kbts_un Index) +static kbts__feature_substitution_pointer kbts__GetFeatureSubstitution(kbts__feature_table_substitution *Table, kbts_un Index) { - kbts_feature_table_substitution_record *Records = (kbts_feature_table_substitution_record *)(Table + 1); - kbts_feature_table_substitution_record *Record = &Records[Index]; + kbts__feature_table_substitution_record *Records = (kbts__feature_table_substitution_record *)(Table + 1); + kbts__feature_table_substitution_record *Record = &Records[Index]; - kbts_feature_substitution_pointer Result; + kbts__feature_substitution_pointer Result; Result.SubstitutedFeatureIndex = Record->FeatureIndex; - Result.AlternateFeature = KBTS_POINTER_OFFSET(kbts_feature, Table, Record->AlternateFeatureOffset); + Result.AlternateFeature = KBTS__POINTER_OFFSET(kbts__feature, Table, Record->AlternateFeatureOffset); return Result; } #endif -static kbts_cmap_subtable_pointer kbts_GetCmapSubtable(kbts_cmap *Cmap, kbts_un Index) +static kbts__cmap_subtable_pointer kbts__GetCmapSubtable(kbts__cmap *Cmap, kbts_un Index) { - kbts_encoding_record *Records = (kbts_encoding_record *)(Cmap + 1); - kbts_encoding_record *Record = &Records[Index]; + kbts__encoding_record *Records = (kbts__encoding_record *)(Cmap + 1); + kbts__encoding_record *Record = &Records[Index]; - kbts_cmap_subtable_pointer Result; + kbts__cmap_subtable_pointer Result; Result.PlatformId = Record->PlatformId; Result.EncodingId = Record->EncodingId; - Result.Subtable = KBTS_POINTER_OFFSET(kbts_u16, Cmap, Record->SubtableOffset); + Result.Subtable = KBTS__POINTER_OFFSET(kbts_u16, Cmap, Record->SubtableOffset); return Result; } -static kbts_sequence *kbts_GetSequence(kbts_multiple_substitution *Subst, kbts_un Index) +static kbts__sequence *kbts__GetSequence(kbts__multiple_substitution *Subst, kbts_un Index) { kbts_u16 *Offsets = (kbts_u16 *)(Subst + 1); - kbts_sequence *Result = KBTS_POINTER_OFFSET(kbts_sequence, Subst, Offsets[Index]); + kbts__sequence *Result = KBTS__POINTER_OFFSET(kbts__sequence, Subst, Offsets[Index]); return Result; } -static kbts_alternate_set *kbts_GetAlternateSet(kbts_alternate_substitution *Subst, kbts_un Index) +static kbts__alternate_set *kbts__GetAlternateSet(kbts__alternate_substitution *Subst, kbts_un Index) { kbts_u16 *Offsets = (kbts_u16 *)(Subst + 1); - kbts_alternate_set *Result = KBTS_POINTER_OFFSET(kbts_alternate_set, Subst, Offsets[Index]); + kbts__alternate_set *Result = KBTS__POINTER_OFFSET(kbts__alternate_set, Subst, Offsets[Index]); return Result; } -static kbts_ligature_set *kbts_GetLigatureSet(kbts_ligature_substitution *Subst, kbts_un Index) +static kbts__ligature_set *kbts__GetLigatureSet(kbts__ligature_substitution *Subst, kbts_un Index) { kbts_u16 *Offsets = (kbts_u16 *)(Subst + 1); - kbts_ligature_set *Result = KBTS_POINTER_OFFSET(kbts_ligature_set, Subst, Offsets[Index]); + kbts__ligature_set *Result = KBTS__POINTER_OFFSET(kbts__ligature_set, Subst, Offsets[Index]); return Result; } -static kbts_ligature *kbts_GetLigature(kbts_ligature_set *Set, kbts_un Index) +static kbts__ligature *kbts__GetLigature(kbts__ligature_set *Set, kbts_un Index) { kbts_u16 *Offsets = (kbts_u16 *)(Set + 1); - kbts_ligature *Result = KBTS_POINTER_OFFSET(kbts_ligature, Set, Offsets[Index]); + kbts__ligature *Result = KBTS__POINTER_OFFSET(kbts__ligature, Set, Offsets[Index]); return Result; } -static kbts_mark_record *kbts_GetMarkRecord(kbts_mark_array *Array, kbts_un Index) +static kbts__mark_record *kbts__GetMarkRecord(kbts__mark_array *Array, kbts_un Index) { - kbts_mark_record *Records = KBTS_POINTER_AFTER(kbts_mark_record, Array); - kbts_mark_record *Result = &Records[Index]; + kbts__mark_record *Records = KBTS__POINTER_AFTER(kbts__mark_record, Array); + kbts__mark_record *Result = &Records[Index]; return Result; } -static kbts_ligature_attach *kbts_GetLigatureAttach(kbts_ligature_array *Array, kbts_un Index) +static kbts__ligature_attach *kbts__GetLigatureAttach(kbts__ligature_array *Array, kbts_un Index) { - kbts_u16 *Offsets = KBTS_POINTER_AFTER(kbts_u16, Array); - kbts_ligature_attach *Result = KBTS_POINTER_OFFSET(kbts_ligature_attach, Array, Offsets[Index]); + kbts_u16 *Offsets = KBTS__POINTER_AFTER(kbts_u16, Array); + kbts__ligature_attach *Result = KBTS__POINTER_OFFSET(kbts__ligature_attach, Array, Offsets[Index]); return Result; } -static kbts_anchor *kbts_GetLigatureAttachAnchor(kbts_mark_to_ligature_attachment *Adjust, kbts_ligature_attach *Attach, kbts_u16 MarkClass, kbts_un ComponentIndex) +static kbts__anchor *kbts__GetLigatureAttachAnchor(kbts__mark_to_ligature_attachment *Adjust, kbts__ligature_attach *Attach, kbts_u16 MarkClass, kbts_un ComponentIndex) { - kbts_u16 *Offsets = KBTS_POINTER_AFTER(kbts_u16, Attach); + kbts_u16 *Offsets = KBTS__POINTER_AFTER(kbts_u16, Attach); kbts_u16 Offset = Offsets[ComponentIndex * Adjust->MarkClassCount + MarkClass]; - kbts_anchor *Result = 0; + kbts__anchor *Result = 0; if(Offset) { - Result = KBTS_POINTER_OFFSET(kbts_anchor, Attach, Offset); + Result = KBTS__POINTER_OFFSET(kbts__anchor, Attach, Offset); } return Result; } -typedef struct kbts_mark_info +typedef struct kbts__mark_info { - kbts_mark_array *Array; - kbts_mark_record *Record; - kbts_anchor *Anchor; -} kbts_mark_info; + kbts__mark_array *Array; + kbts__mark_record *Record; + kbts__anchor *Anchor; +} kbts__mark_info; -static kbts_mark_info kbts_GetMarkInfo(void *Subtable, kbts_un SubtableOffsetToMarkArray, kbts_un CoverageIndex) +static kbts__mark_info kbts__GetMarkInfo(void *Subtable, kbts_un SubtableOffsetToMarkArray, kbts_un CoverageIndex) { - kbts_mark_info Result = KBTS_ZERO; + kbts__mark_info Result = KBTS__ZERO; - Result.Array = KBTS_POINTER_OFFSET(kbts_mark_array, Subtable, SubtableOffsetToMarkArray); - Result.Record = kbts_GetMarkRecord(Result.Array, CoverageIndex); - Result.Anchor = KBTS_POINTER_OFFSET(kbts_anchor, Result.Array, Result.Record->AnchorOffset); + Result.Array = KBTS__POINTER_OFFSET(kbts__mark_array, Subtable, SubtableOffsetToMarkArray); + Result.Record = kbts__GetMarkRecord(Result.Array, CoverageIndex); + Result.Anchor = KBTS__POINTER_OFFSET(kbts__anchor, Result.Array, Result.Record->AnchorOffset); return Result; } @@ -14429,7 +17182,7 @@ static kbts_mark_info kbts_GetMarkInfo(void *Subtable, kbts_un SubtableOffsetToM // // -typedef struct kbts_byteswap_context +typedef struct kbts__byteswap_context { char *FileBase; char *FileEnd; @@ -14438,29 +17191,29 @@ typedef struct kbts_byteswap_context kbts_un PointerCount; int Error; -} kbts_byteswap_context; +} kbts__byteswap_context; -static int kbts_ByteSwapArray16Context(kbts_u16 *Array, kbts_un Count, kbts_byteswap_context *Context) +static int kbts__ByteSwapArray16Context(kbts_u16 *Array, kbts_un Count, kbts__byteswap_context *Context) { - int Result = kbts_ByteSwapArray16(Array, Count, Context->FileEnd); + int Result = kbts__ByteSwapArray16(Array, Count, Context->FileEnd); Context->Error |= !Result; return Result; } -static int kbts_ByteSwapArray32Context(kbts_u32 *Array, kbts_un Count, kbts_byteswap_context *Context) +static int kbts__ByteSwapArray32Context(kbts_u32 *Array, kbts_un Count, kbts__byteswap_context *Context) { - int Result = kbts_ByteSwapArray32(Array, Count, Context->FileEnd); + int Result = kbts__ByteSwapArray32(Array, Count, Context->FileEnd); Context->Error |= !Result; return Result; } -typedef struct kbts_cover_glyph_result +typedef struct kbts__cover_glyph_result { - kbts_u32 Valid; + int Valid; kbts_u32 Index; -} kbts_cover_glyph_result; +} kbts__cover_glyph_result; -static int kbts_LookupBeginsWithCoverage(kbts_shaping_table ShapingTable, kbts_u16 LookupType, kbts_u16 Format) +static int kbts__LookupBeginsWithCoverage(kbts_shaping_table ShapingTable, kbts_u16 LookupType, kbts_u16 Format) { int Result = 0; if(ShapingTable == KBTS_SHAPING_TABLE_GSUB) @@ -14475,56 +17228,26 @@ static int kbts_LookupBeginsWithCoverage(kbts_shaping_table ShapingTable, kbts_u } // Except for lookup tables 5.3, 6.3 and 7, all tables begin with (kbts_u16 Format, kbts_u16 CoverageOffset). -KBTS_INLINE int kbts_GsubLookupBeginsWithCoverage(kbts_u16 LookupType, kbts_u16 Format) +KBTS_INLINE int kbts__GsubLookupBeginsWithCoverage(kbts_u16 LookupType, kbts_u16 Format) { - int Result = kbts_LookupBeginsWithCoverage(KBTS_SHAPING_TABLE_GSUB, LookupType, Format); + int Result = kbts__LookupBeginsWithCoverage(KBTS_SHAPING_TABLE_GSUB, LookupType, Format); return Result; } -KBTS_INLINE int kbts_GposLookupBeginsWithCoverage(kbts_u16 LookupType, kbts_u16 Format) +KBTS_INLINE int kbts__GposLookupBeginsWithCoverage(kbts_u16 LookupType, kbts_u16 Format) { - int Result = kbts_LookupBeginsWithCoverage(KBTS_SHAPING_TABLE_GPOS, LookupType, Format); + int Result = kbts__LookupBeginsWithCoverage(KBTS_SHAPING_TABLE_GPOS, LookupType, Format); return Result; } -typedef struct kbts_lookup_info_frame -{ - kbts_u16 *Base; - kbts_u16 LookupType; - kbts_u32 LookaheadOffset; - kbts_u32 StackSize; -} kbts_lookup_info_frame; - -static int kbts_PushLookup(kbts_gdef *Gdef, kbts_lookup_info_frame *Frames, kbts_un *FrameCount, kbts_un FrameCapacity, kbts_lookup *PackedLookup, kbts_u32 LookaheadOffset, kbts_un StackSize) -{ - int Result = 0; - kbts_unpacked_lookup Lookup = kbts_UnpackLookup(Gdef, PackedLookup); - - if((*FrameCount + Lookup.SubtableCount) <= FrameCapacity) - { - KBTS_FOR(SubtableIndex, 0, Lookup.SubtableCount) - { - kbts_lookup_info_frame *Frame = &Frames[(*FrameCount)++]; - Frame->Base = KBTS_POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[SubtableIndex]); - Frame->LookupType = Lookup.Type; - Frame->LookaheadOffset = LookaheadOffset; - Frame->StackSize = (kbts_u32)StackSize; - } - - Result = 1; - } - - return Result; -} - -static int kbts_AlreadyVisited(kbts_byteswap_context *Context, void *Pointer) +static int kbts__AlreadyVisited(kbts__byteswap_context *Context, void *Pointer) { int Result = !Pointer || Context->Error; if(!Result) { kbts_u32 *Pointers = Context->Pointers; - kbts_u32 Pointer32 = KBTS_POINTER_DIFF32(Pointer, Context->FileBase); + kbts_u32 Pointer32 = KBTS__POINTER_DIFF32(Pointer, Context->FileBase); kbts_un Index = 0; if(Context->PointerCount) @@ -14558,20 +17281,20 @@ static int kbts_AlreadyVisited(kbts_byteswap_context *Context, void *Pointer) return Result; } -static void kbts_ByteSwapFeature(kbts_byteswap_context *Context, kbts_feature *Feature) +static void kbts__ByteSwapFeature(kbts__byteswap_context *Context, kbts__feature *Feature) { - if(!kbts_AlreadyVisited(Context, Feature)) + if(!kbts__AlreadyVisited(Context, Feature)) { - kbts_u16 *LookupIndices = KBTS_POINTER_AFTER(kbts_u16, Feature); - Context->Error |= !kbts_ByteSwapArray16(&Feature->FeatureParamsOffset, 2, Context->FileEnd); - Context->Error |= !kbts_ByteSwapArray16(LookupIndices, Feature->LookupIndexCount, Context->FileEnd); + kbts_u16 *LookupIndices = KBTS__POINTER_AFTER(kbts_u16, Feature); + Context->Error |= !kbts__ByteSwapArray16(&Feature->FeatureParamsOffset, 2, Context->FileEnd); + Context->Error |= !kbts__ByteSwapArray16(LookupIndices, Feature->LookupIndexCount, Context->FileEnd); // We require lookup indices to be sorted per feature for the lookup application order to match Harfbuzz. // Lookup indices are _typically_ sorted per feature, but we can't assume it is always the case. kbts_un LookupIndexCount = Feature->LookupIndexCount; - KBTS_FOR(Iter, 0, LookupIndexCount) + KBTS__FOR(Iter, 0, LookupIndexCount) { - KBTS_FOR(IndexIndex, 1, LookupIndexCount) + KBTS__FOR(IndexIndex, 1, LookupIndexCount) { kbts_u16 Left = LookupIndices[IndexIndex - 1]; kbts_u16 Right = LookupIndices[IndexIndex]; @@ -14586,63 +17309,63 @@ static void kbts_ByteSwapFeature(kbts_byteswap_context *Context, kbts_feature *F } # ifdef KBTS_DUMP - kbts_u16 *LookupIndices = KBTS_POINTER_AFTER(kbts_u16, Feature); - KBTS_FOR(LookupIndexIndex, 0, Feature->LookupIndexCount) + kbts_u16 *LookupIndices = KBTS__POINTER_AFTER(kbts_u16, Feature); + KBTS__FOR(LookupIndexIndex, 0, Feature->LookupIndexCount) { KBTS_DUMPF(" Lookup index %u\n", LookupIndices[LookupIndexIndex]); } # endif } -static void kbts_ByteSwapGsubGposCommon(kbts_byteswap_context *Context, kbts_gsub_gpos *Header) +static void kbts__ByteSwapGsubGposCommon(kbts__byteswap_context *Context, kbts__gsub_gpos *Header) { - kbts_ByteSwapArray16Context(&Header->Major, 5, Context); + kbts__ByteSwapArray16Context(&Header->Major, 5, Context); if(Header->Minor == 1) { - Header->FeatureVariationsOffset = kbts_ByteSwap32(Header->FeatureVariationsOffset); + Header->FeatureVariationsOffset = kbts__ByteSwap32(Header->FeatureVariationsOffset); } - kbts_script_list *ScriptList = KBTS_POINTER_OFFSET(kbts_script_list, Header, Header->ScriptListOffset); - if(!kbts_AlreadyVisited(Context, ScriptList)) + kbts__script_list *ScriptList = KBTS__POINTER_OFFSET(kbts__script_list, Header, Header->ScriptListOffset); + if(!kbts__AlreadyVisited(Context, ScriptList)) { - ScriptList->Count = kbts_ByteSwap16(ScriptList->Count); + ScriptList->Count = kbts__ByteSwap16(ScriptList->Count); - kbts_script_record *ScriptRecords = KBTS_POINTER_AFTER(kbts_script_record, ScriptList); - KBTS_FOR(It, 0, ScriptList->Count) + kbts__script_record *ScriptRecords = KBTS__POINTER_AFTER(kbts__script_record, ScriptList); + KBTS__FOR(It, 0, ScriptList->Count) { - kbts_script_record *Record = &ScriptRecords[It]; + kbts__script_record *Record = &ScriptRecords[It]; - Record->Offset = kbts_ByteSwap16(Record->Offset); + Record->Offset = kbts__ByteSwap16(Record->Offset); KBTS_DUMPF("Script %.4s\n", (char *)&Record->Tag); - kbts_ot_script *Script = KBTS_POINTER_OFFSET(kbts_ot_script, ScriptList, Record->Offset); - if(!kbts_AlreadyVisited(Context, Script)) + kbts__ot_script *Script = KBTS__POINTER_OFFSET(kbts__ot_script, ScriptList, Record->Offset); + if(!kbts__AlreadyVisited(Context, Script)) { - Script->DefaultLangsysOffset = kbts_ByteSwap16(Script->DefaultLangsysOffset); - Script->Count = kbts_ByteSwap16(Script->Count); + Script->DefaultLangsysOffset = kbts__ByteSwap16(Script->DefaultLangsysOffset); + Script->Count = kbts__ByteSwap16(Script->Count); - kbts_langsys *DefaultLangsys = kbts_GetDefaultLangsys(Script); + kbts__langsys *DefaultLangsys = kbts__GetDefaultLangsys(Script); - if(DefaultLangsys && !kbts_AlreadyVisited(Context, DefaultLangsys)) + if(DefaultLangsys && !kbts__AlreadyVisited(Context, DefaultLangsys)) { - kbts_ByteSwapArray16Context(&DefaultLangsys->LookupOrderOffset, 3, Context); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, DefaultLangsys), DefaultLangsys->FeatureIndexCount, Context); + kbts__ByteSwapArray16Context(&DefaultLangsys->LookupOrderOffset, 3, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, DefaultLangsys), DefaultLangsys->FeatureIndexCount, Context); } - kbts_langsys_record *LangsysRecords = KBTS_POINTER_AFTER(kbts_langsys_record, Script); - KBTS_FOR(LangsysIndex, 0, Script->Count) + kbts__langsys_record *LangsysRecords = KBTS__POINTER_AFTER(kbts__langsys_record, Script); + KBTS__FOR(LangsysIndex, 0, Script->Count) { - kbts_langsys_record *LangsysRecord = &LangsysRecords[LangsysIndex]; + kbts__langsys_record *LangsysRecord = &LangsysRecords[LangsysIndex]; - LangsysRecord->Offset = kbts_ByteSwap16(LangsysRecord->Offset); + LangsysRecord->Offset = kbts__ByteSwap16(LangsysRecord->Offset); - kbts_langsys *Langsys = KBTS_POINTER_OFFSET(kbts_langsys, Script, LangsysRecord->Offset); - if(!kbts_AlreadyVisited(Context, Langsys)) + kbts__langsys *Langsys = KBTS__POINTER_OFFSET(kbts__langsys, Script, LangsysRecord->Offset); + if(!kbts__AlreadyVisited(Context, Langsys)) { - kbts_ByteSwapArray16Context(&Langsys->LookupOrderOffset, 3, Context); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Langsys), Langsys->FeatureIndexCount, Context); + kbts__ByteSwapArray16Context(&Langsys->LookupOrderOffset, 3, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Langsys), Langsys->FeatureIndexCount, Context); } } @@ -14652,23 +17375,23 @@ static void kbts_ByteSwapGsubGposCommon(kbts_byteswap_context *Context, kbts_gsu KBTS_DUMPF(" Default langsys @ %zu\n", (char *)DefaultLangsys - Context->FileBase); KBTS_DUMPF(" Lookup order offset %u\n", DefaultLangsys->LookupOrderOffset); KBTS_DUMPF(" Required feature %u\n", DefaultLangsys->RequiredFeatureIndex); - kbts_u16 *FeatureIndices = KBTS_POINTER_AFTER(kbts_u16, DefaultLangsys); - KBTS_FOR(FeatureIndexIndex, 0, DefaultLangsys->FeatureIndexCount) + kbts_u16 *FeatureIndices = KBTS__POINTER_AFTER(kbts_u16, DefaultLangsys); + KBTS__FOR(FeatureIndexIndex, 0, DefaultLangsys->FeatureIndexCount) { KBTS_DUMPF(" Feature %u\n", FeatureIndices[FeatureIndexIndex]); } } - KBTS_FOR(LangsysIndex, 0, Script->Count) + KBTS__FOR(LangsysIndex, 0, Script->Count) { - kbts_langsys_record *LangsysRecord = &LangsysRecords[LangsysIndex]; - kbts_langsys *Langsys = KBTS_POINTER_OFFSET(kbts_langsys, Script, LangsysRecord->Offset); + kbts__langsys_record *LangsysRecord = &LangsysRecords[LangsysIndex]; + kbts__langsys *Langsys = KBTS__POINTER_OFFSET(kbts__langsys, Script, LangsysRecord->Offset); KBTS_DUMPF(" Langsys %.4s @ %zu\n", (char *)&LangsysRecord->Tag, (char *)Script + LangsysRecord->Offset - Context->FileBase); KBTS_DUMPF(" Lookup order offset %u\n" " Required feature %u\n", Langsys->LookupOrderOffset, Langsys->RequiredFeatureIndex); - kbts_u16 *FeatureIndices = KBTS_POINTER_AFTER(kbts_u16, Langsys); - KBTS_FOR(FeatureIndexIndex, 0, Langsys->FeatureIndexCount) + kbts_u16 *FeatureIndices = KBTS__POINTER_AFTER(kbts_u16, Langsys); + KBTS__FOR(FeatureIndexIndex, 0, Langsys->FeatureIndexCount) { KBTS_DUMPF(" Feature %u\n", FeatureIndices[FeatureIndexIndex]); } @@ -14677,55 +17400,58 @@ static void kbts_ByteSwapGsubGposCommon(kbts_byteswap_context *Context, kbts_gsu } } + // @Incomplete if((Header->Minor == 1) && Header->FeatureVariationsOffset) { - kbts_feature_variations *FeatureVariations = KBTS_POINTER_OFFSET(kbts_feature_variations, Header, Header->FeatureVariationsOffset); + kbts__feature_variations *FeatureVariations = KBTS__POINTER_OFFSET(kbts__feature_variations, Header, Header->FeatureVariationsOffset); - if(!kbts_AlreadyVisited(Context, FeatureVariations)) + if(!kbts__AlreadyVisited(Context, FeatureVariations)) { - kbts_ByteSwapArray16Context(&FeatureVariations->Major, 2, Context); - FeatureVariations->RecordCount = kbts_ByteSwap32(FeatureVariations->RecordCount); + kbts__ByteSwapArray16Context(&FeatureVariations->Major, 2, Context); + FeatureVariations->RecordCount = kbts__ByteSwap32(FeatureVariations->RecordCount); - kbts_feature_variation_record *Records = KBTS_POINTER_AFTER(kbts_feature_variation_record, FeatureVariations); - KBTS_FOR(VariationIndex, 0, FeatureVariations->RecordCount) + kbts__feature_variation_record *Records = KBTS__POINTER_AFTER(kbts__feature_variation_record, FeatureVariations); + KBTS__FOR(VariationIndex, 0, FeatureVariations->RecordCount) { - kbts_feature_variation_record *Record = &Records[VariationIndex]; + kbts__feature_variation_record *Record = &Records[VariationIndex]; - kbts_ByteSwapArray32Context(&Record->ConditionSetOffset, 2, Context); + kbts__ByteSwapArray32Context(&Record->ConditionSetOffset, 2, Context); - kbts_condition_set *Set = KBTS_POINTER_OFFSET(kbts_condition_set, FeatureVariations, Record->ConditionSetOffset); + kbts__condition_set *Set = KBTS__POINTER_OFFSET(kbts__condition_set, FeatureVariations, Record->ConditionSetOffset); - if(!kbts_AlreadyVisited(Context, Set)) + if(!kbts__AlreadyVisited(Context, Set)) { - Set->Count = kbts_ByteSwap16(Set->Count); + Set->Count = kbts__ByteSwap16(Set->Count); - kbts_u32 *ConditionOffsets = KBTS_POINTER_AFTER(kbts_u32, Set); - kbts_ByteSwapArray32Context(ConditionOffsets, Set->Count, Context); + kbts_u32 *ConditionOffsets = KBTS__POINTER_AFTER(kbts_u32, Set); + kbts__ByteSwapArray32Context(ConditionOffsets, Set->Count, Context); - KBTS_FOR(ConditionIndex, 0, Set->Count) + KBTS__FOR(ConditionIndex, 0, Set->Count) { - kbts_condition_1 *Condition = KBTS_POINTER_OFFSET(kbts_condition_1, Set, ConditionOffsets[ConditionIndex]); + kbts__condition_1 *Condition = KBTS__POINTER_OFFSET(kbts__condition_1, Set, ConditionOffsets[ConditionIndex]); - if(!kbts_AlreadyVisited(Context, Condition)) + if(!kbts__AlreadyVisited(Context, Condition)) { - kbts_ByteSwapArray16Context(&Condition->Format, 4, Context); + kbts__ByteSwapArray16Context(&Condition->Format, 4, Context); } } - kbts_feature_table_substitution *FeatureSubst = KBTS_POINTER_OFFSET(kbts_feature_table_substitution, FeatureVariations, Record->FeatureTableSubstitutionOffset); + // @Incomplete + kbts__feature_table_substitution *FeatureSubst = KBTS__POINTER_OFFSET(kbts__feature_table_substitution, FeatureVariations, Record->FeatureTableSubstitutionOffset); - if(!kbts_AlreadyVisited(Context, FeatureSubst)) + if(!kbts__AlreadyVisited(Context, FeatureSubst)) { - kbts_ByteSwapArray16Context(&FeatureSubst->Major, 3, Context); + kbts__ByteSwapArray16Context(&FeatureSubst->Major, 3, Context); - kbts_feature_table_substitution_record *SubstRecords = KBTS_POINTER_AFTER(kbts_feature_table_substitution_record, FeatureSubst); - KBTS_FOR(SubstRecordIndex, 0, FeatureSubst->Count) + kbts__feature_table_substitution_record *SubstRecords = KBTS__POINTER_AFTER(kbts__feature_table_substitution_record, FeatureSubst); + KBTS__FOR(SubstRecordIndex, 0, FeatureSubst->Count) { - kbts_feature_table_substitution_record *SubstRecord = &SubstRecords[SubstRecordIndex]; - SubstRecord->FeatureIndex = kbts_ByteSwap16(SubstRecord->FeatureIndex); + kbts__feature_table_substitution_record *SubstRecord = &SubstRecords[SubstRecordIndex]; + SubstRecord->FeatureIndex = kbts__ByteSwap16(SubstRecord->FeatureIndex); + SubstRecord->AlternateFeatureOffset = kbts__ByteSwap32(SubstRecord->AlternateFeatureOffset); - kbts_feature *Feature = KBTS_POINTER_OFFSET(kbts_feature, FeatureSubst, SubstRecord->AlternateFeatureOffset); - kbts_ByteSwapFeature(Context, Feature); + kbts__feature *Feature = KBTS__POINTER_OFFSET(kbts__feature, FeatureSubst, SubstRecord->AlternateFeatureOffset); + kbts__ByteSwapFeature(Context, Feature); } } } @@ -14734,55 +17460,55 @@ static void kbts_ByteSwapGsubGposCommon(kbts_byteswap_context *Context, kbts_gsu } } - kbts_feature_list *FeatureList = KBTS_POINTER_OFFSET(kbts_feature_list, Header, Header->FeatureListOffset); - if(!kbts_AlreadyVisited(Context, FeatureList)) + kbts__feature_list *FeatureList = KBTS__POINTER_OFFSET(kbts__feature_list, Header, Header->FeatureListOffset); + if(!kbts__AlreadyVisited(Context, FeatureList)) { - FeatureList->Count = kbts_ByteSwap16(FeatureList->Count); - kbts_feature_record *FeatureRecords = KBTS_POINTER_AFTER(kbts_feature_record, FeatureList); - KBTS_FOR(FeatureRecordIndex, 0, FeatureList->Count) + FeatureList->Count = kbts__ByteSwap16(FeatureList->Count); + kbts__feature_record *FeatureRecords = KBTS__POINTER_AFTER(kbts__feature_record, FeatureList); + KBTS__FOR(FeatureRecordIndex, 0, FeatureList->Count) { - kbts_feature_record *FeatureRecord = &FeatureRecords[FeatureRecordIndex]; + kbts__feature_record *FeatureRecord = &FeatureRecords[FeatureRecordIndex]; KBTS_DUMPF("Feature %llu %.4s\n", FeatureRecordIndex, (char *)&FeatureRecord->Tag); - if(!kbts_AlreadyVisited(Context, FeatureRecord)) + if(!kbts__AlreadyVisited(Context, FeatureRecord)) { - FeatureRecord->Offset = kbts_ByteSwap16(FeatureRecord->Offset); + FeatureRecord->Offset = kbts__ByteSwap16(FeatureRecord->Offset); - kbts_feature *Feature = KBTS_POINTER_OFFSET(kbts_feature, FeatureList, FeatureRecord->Offset); - kbts_ByteSwapFeature(Context, Feature); + kbts__feature *Feature = KBTS__POINTER_OFFSET(kbts__feature, FeatureList, FeatureRecord->Offset); + kbts__ByteSwapFeature(Context, Feature); } } } } -static int kbts_ByteSwapLookup(kbts_byteswap_context *Context, kbts_lookup *Lookup) +static int kbts__ByteSwapLookup(kbts__byteswap_context *Context, kbts__lookup *Lookup) { int Result = 0; - if(!kbts_AlreadyVisited(Context, Lookup)) + if(!kbts__AlreadyVisited(Context, Lookup)) { Result = 1; - kbts_ByteSwapArray16Context(&Lookup->Type, 3, Context); - kbts_u16 *SubtableOffsets = KBTS_POINTER_AFTER(kbts_u16, Lookup); + kbts__ByteSwapArray16Context(&Lookup->Type, 3, Context); + kbts_u16 *SubtableOffsets = KBTS__POINTER_AFTER(kbts_u16, Lookup); kbts_un U16Count = Lookup->SubtableCount; - if(Lookup->Flag & KBTS_LOOKUP_FLAG_USE_MARK_FILTERING_SET) + if(Lookup->Flag & KBTS__LOOKUP_FLAG_USE_MARK_FILTERING_SET) { U16Count += 1; } - kbts_ByteSwapArray16Context(SubtableOffsets, U16Count, Context); + kbts__ByteSwapArray16Context(SubtableOffsets, U16Count, Context); } return Result; } -static void kbts_ByteSwapCoverage(kbts_byteswap_context *Context, kbts_coverage *Coverage) +static void kbts__ByteSwapCoverage(kbts__byteswap_context *Context, kbts__coverage *Coverage) { - if(!kbts_AlreadyVisited(Context, Coverage)) + if(!kbts__AlreadyVisited(Context, Coverage)) { - kbts_ByteSwapArray16Context(&Coverage->Format, 2, Context); + kbts__ByteSwapArray16Context(&Coverage->Format, 2, Context); kbts_un U16Count = 0; if(Coverage->Format == 1) @@ -14794,15 +17520,15 @@ static void kbts_ByteSwapCoverage(kbts_byteswap_context *Context, kbts_coverage U16Count = Coverage->Count * 3; } - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Coverage), U16Count, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Coverage), U16Count, Context); } } -static void kbts_ByteSwapAnchor(kbts_byteswap_context *Context, kbts_anchor *Anchor) +static void kbts__ByteSwapAnchor(kbts__byteswap_context *Context, kbts__anchor *Anchor) { - if(!kbts_AlreadyVisited(Context, Anchor)) + if(!kbts__AlreadyVisited(Context, Anchor)) { - Anchor->Format = kbts_ByteSwap16(Anchor->Format); + Anchor->Format = kbts__ByteSwap16(Anchor->Format); kbts_un U16Count = 2; if(Anchor->Format == 2) @@ -14814,36 +17540,36 @@ static void kbts_ByteSwapAnchor(kbts_byteswap_context *Context, kbts_anchor *Anc U16Count = 4; } - kbts_ByteSwapArray16Context((kbts_u16 *)&Anchor->X, U16Count, Context); + kbts__ByteSwapArray16Context((kbts_u16 *)&Anchor->X, U16Count, Context); } } -static void kbts_ByteSwapBaseArray(kbts_byteswap_context *Context, kbts_u16 MarkClassCount, kbts_base_array *Array) +static void kbts__ByteSwapBaseArray(kbts__byteswap_context *Context, kbts_u16 MarkClassCount, kbts__base_array *Array) { - if(!kbts_AlreadyVisited(Context, Array)) + if(!kbts__AlreadyVisited(Context, Array)) { - Array->BaseCount = kbts_ByteSwap16(Array->BaseCount); + Array->BaseCount = kbts__ByteSwap16(Array->BaseCount); - kbts_u16 *BaseAnchorOffsets = KBTS_POINTER_AFTER(kbts_u16, Array); - kbts_ByteSwapArray16Context(BaseAnchorOffsets, Array->BaseCount * MarkClassCount, Context); + kbts_u16 *BaseAnchorOffsets = KBTS__POINTER_AFTER(kbts_u16, Array); + kbts__ByteSwapArray16Context(BaseAnchorOffsets, Array->BaseCount * MarkClassCount, Context); - KBTS_FOR(OffsetIndex, 0, (kbts_un)Array->BaseCount * MarkClassCount) + KBTS__FOR(OffsetIndex, 0, (kbts_un)Array->BaseCount * MarkClassCount) { kbts_u16 Offset = BaseAnchorOffsets[OffsetIndex]; if(Offset) { - kbts_ByteSwapAnchor(Context, KBTS_POINTER_OFFSET(kbts_anchor, Array, Offset)); + kbts__ByteSwapAnchor(Context, KBTS__POINTER_OFFSET(kbts__anchor, Array, Offset)); } } } } -static void kbts_ByteSwapDevice(kbts_byteswap_context *Context, kbts_device *Device) +static void kbts__ByteSwapDevice(kbts__byteswap_context *Context, kbts__device *Device) { - if(!kbts_AlreadyVisited(Context, Device)) + if(!kbts__AlreadyVisited(Context, Device)) { - kbts_ByteSwapArray16Context(&Device->U.Device.StartSize, 3, Context); + kbts__ByteSwapArray16Context(&Device->U.Device.StartSize, 3, Context); if(Device->DeltaFormat <= 3) { @@ -14852,85 +17578,85 @@ static void kbts_ByteSwapDevice(kbts_byteswap_context *Context, kbts_device *Dev } } -static kbts_unpacked_value_record kbts_ByteSwapValueRecord(kbts_byteswap_context *Context, void *Parent, kbts_u16 ValueFormat, kbts_u16 *Record) +static kbts__unpacked_value_record kbts_ByteSwapValueRecord(kbts__byteswap_context *Context, void *Parent, kbts_u16 ValueFormat, kbts_u16 *Record) { - kbts_unpacked_value_record Result = KBTS_ZERO; + kbts__unpacked_value_record Result = KBTS__ZERO; if(ValueFormat) { - kbts_un U16Count = kbts_PopCount32(ValueFormat); + kbts_un U16Count = kbts__PopCount32(ValueFormat); - kbts_ByteSwapArray16Context(Record, U16Count, Context); + kbts__ByteSwapArray16Context(Record, U16Count, Context); - Result = kbts_UnpackValueRecord(Parent, ValueFormat, Record); + Result = kbts__UnpackValueRecord(Parent, ValueFormat, Record); - kbts_ByteSwapDevice(Context, Result.PlacementXDevice); - kbts_ByteSwapDevice(Context, Result.PlacementYDevice); - kbts_ByteSwapDevice(Context, Result.AdvanceXDevice); - kbts_ByteSwapDevice(Context, Result.AdvanceYDevice); + kbts__ByteSwapDevice(Context, Result.PlacementXDevice); + kbts__ByteSwapDevice(Context, Result.PlacementYDevice); + kbts__ByteSwapDevice(Context, Result.AdvanceXDevice); + kbts__ByteSwapDevice(Context, Result.AdvanceYDevice); } return Result; } -static void kbts_ByteSwapMarkArray(kbts_byteswap_context *Context, kbts_mark_array *MarkArray) +static void kbts__ByteSwapMarkArray(kbts__byteswap_context *Context, kbts__mark_array *MarkArray) { - if(!kbts_AlreadyVisited(Context, MarkArray)) + if(!kbts__AlreadyVisited(Context, MarkArray)) { - MarkArray->Count = kbts_ByteSwap16(MarkArray->Count); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, MarkArray), MarkArray->Count * 2, Context); + MarkArray->Count = kbts__ByteSwap16(MarkArray->Count); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, MarkArray), MarkArray->Count * 2, Context); - kbts_mark_record *MarkRecords = KBTS_POINTER_AFTER(kbts_mark_record, MarkArray); - KBTS_FOR(MarkRecordIndex, 0, MarkArray->Count) + kbts__mark_record *MarkRecords = KBTS__POINTER_AFTER(kbts__mark_record, MarkArray); + KBTS__FOR(MarkRecordIndex, 0, MarkArray->Count) { - kbts_mark_record *MarkRecord = &MarkRecords[MarkRecordIndex]; + kbts__mark_record *MarkRecord = &MarkRecords[MarkRecordIndex]; - kbts_ByteSwapAnchor(Context, KBTS_POINTER_OFFSET(kbts_anchor, MarkArray, MarkRecord->AnchorOffset)); + kbts__ByteSwapAnchor(Context, KBTS__POINTER_OFFSET(kbts__anchor, MarkArray, MarkRecord->AnchorOffset)); } } } -static void kbts_ByteSwapChainedSequenceRuleSet(kbts_byteswap_context *Context, kbts_chained_sequence_rule_set *Set) +static void kbts__ByteSwapChainedSequenceRuleSet(kbts__byteswap_context *Context, kbts__chained_sequence_rule_set *Set) { - if(Set && !kbts_AlreadyVisited(Context, Set)) + if(Set && !kbts__AlreadyVisited(Context, Set)) { - Set->Count = kbts_ByteSwap16(Set->Count); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Set), Set->Count, Context); + Set->Count = kbts__ByteSwap16(Set->Count); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Set), Set->Count, Context); - KBTS_FOR(RuleIndex, 0, Set->Count) + KBTS__FOR(RuleIndex, 0, Set->Count) { - kbts_chained_sequence_rule *Rule = kbts_GetChainedSequenceRule(Set, RuleIndex); + kbts__chained_sequence_rule *Rule = kbts__GetChainedSequenceRule(Set, RuleIndex); - if(!kbts_AlreadyVisited(Context, Rule)) + if(!kbts__AlreadyVisited(Context, Rule)) { - kbts_unpacked_chained_sequence_rule Unpacked = kbts_UnpackChainedSequenceRule(Rule, 1); + kbts__unpacked_chained_sequence_rule Unpacked = kbts__UnpackChainedSequenceRule(Rule, 1); kbts_un U16Count = Unpacked.BacktrackCount + Unpacked.InputCount + Unpacked.LookaheadCount + Unpacked.RecordCount * 2 + 3; - kbts_ByteSwapArray16Context(&Rule->BacktrackGlyphCount, U16Count, Context); + kbts__ByteSwapArray16Context(&Rule->BacktrackGlyphCount, U16Count, Context); } } } } #ifdef KBTS_DUMP -static void kbts_DumpClassDefinition(kbts_u16 *Base) +static void kbts__DumpClassDefinition(kbts_u16 *Base) { if(*Base == 1) { - kbts_class_definition_1 *ClassDef = (kbts_class_definition_1 *)Base; - kbts_u16 *ClassValues = KBTS_POINTER_AFTER(kbts_u16, ClassDef); - KBTS_FOR(GlyphIndex, 0, ClassDef->GlyphCount) + kbts__class_definition_1 *ClassDef = (kbts__class_definition_1 *)Base; + kbts_u16 *ClassValues = KBTS__POINTER_AFTER(kbts_u16, ClassDef); + KBTS__FOR(GlyphIndex, 0, ClassDef->GlyphCount) { KBTS_DUMPF("%llx -> %u\n", ClassDef->StartGlyphId + GlyphIndex, ClassValues[GlyphIndex]); } } else if(*Base == 2) { - kbts_class_definition_2 *ClassDef = (kbts_class_definition_2 *)Base; - kbts_class_range_record *Ranges = KBTS_POINTER_AFTER(kbts_class_range_record, ClassDef); - KBTS_FOR(RangeIndex, 0, ClassDef->Count) + kbts__class_definition_2 *ClassDef = (kbts__class_definition_2 *)Base; + kbts__class_range_record *Ranges = KBTS__POINTER_AFTER(kbts__class_range_record, ClassDef); + KBTS__FOR(RangeIndex, 0, ClassDef->Count) { - kbts_class_range_record *Range = &Ranges[RangeIndex]; + kbts__class_range_record *Range = &Ranges[RangeIndex]; KBTS_DUMPF("[%x..%x] -> %u\n", Range->StartGlyphId, Range->EndGlyphId, Range->Class); } @@ -14938,37 +17664,37 @@ static void kbts_DumpClassDefinition(kbts_u16 *Base) } #endif -static void kbts_ByteSwapClassDefinition(kbts_byteswap_context *Context, kbts_u16 *Base) +static void kbts__ByteSwapClassDefinition(kbts__byteswap_context *Context, kbts_u16 *Base) { - if(!kbts_AlreadyVisited(Context, Base)) + if(!kbts__AlreadyVisited(Context, Base)) { - *Base = kbts_ByteSwap16(*Base); + *Base = kbts__ByteSwap16(*Base); if(*Base == 1) { - kbts_class_definition_1 *ClassDef = (kbts_class_definition_1 *)Base; - kbts_ByteSwapArray16Context(&ClassDef->StartGlyphId, 2, Context); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, ClassDef), ClassDef->GlyphCount, Context); + kbts__class_definition_1 *ClassDef = (kbts__class_definition_1 *)Base; + kbts__ByteSwapArray16Context(&ClassDef->StartGlyphId, 2, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, ClassDef), ClassDef->GlyphCount, Context); } else if(*Base == 2) { - kbts_class_definition_2 *ClassDef = (kbts_class_definition_2 *)Base; - ClassDef->Count = kbts_ByteSwap16(ClassDef->Count); + kbts__class_definition_2 *ClassDef = (kbts__class_definition_2 *)Base; + ClassDef->Count = kbts__ByteSwap16(ClassDef->Count); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, ClassDef), ClassDef->Count * 3, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, ClassDef), ClassDef->Count * 3, Context); } } } -typedef struct kbts_glyph_class_from_table_result +typedef struct kbts__glyph_class_from_table_result { int Found; kbts_u16 Class; -} kbts_glyph_class_from_table_result; +} kbts__glyph_class_from_table_result; -static kbts_glyph_class_from_table_result kbts_GlyphClassFromTable(kbts_u16 *ClassDefinitionBase, kbts_un Id) +static kbts__glyph_class_from_table_result kbts__GlyphClassFromTable(kbts_u16 *ClassDefinitionBase, kbts_un Id) { - kbts_glyph_class_from_table_result Result = KBTS_ZERO; + kbts__glyph_class_from_table_result Result = KBTS__ZERO; // From the Microsoft docs: // There is one offset to a ChainedClassSequenceRuleSet subtable for each class defined in the input sequence @@ -14982,8 +17708,8 @@ static kbts_glyph_class_from_table_result kbts_GlyphClassFromTable(kbts_u16 *Cla if(*ClassDefinitionBase == 1) { - kbts_class_definition_1 *ClassDef = (kbts_class_definition_1 *)ClassDefinitionBase; - kbts_u16 *GlyphClasses = KBTS_POINTER_AFTER(kbts_u16, ClassDef); + kbts__class_definition_1 *ClassDef = (kbts__class_definition_1 *)ClassDefinitionBase; + kbts_u16 *GlyphClasses = KBTS__POINTER_AFTER(kbts_u16, ClassDef); kbts_un Offset = Id - ClassDef->StartGlyphId; if(Offset < ClassDef->GlyphCount) @@ -14994,8 +17720,8 @@ static kbts_glyph_class_from_table_result kbts_GlyphClassFromTable(kbts_u16 *Cla } else if(*ClassDefinitionBase == 2) { - kbts_class_definition_2 *ClassDef = (kbts_class_definition_2 *)ClassDefinitionBase; - kbts_class_range_record *Ranges = KBTS_POINTER_AFTER(kbts_class_range_record, ClassDef); + kbts__class_definition_2 *ClassDef = (kbts__class_definition_2 *)ClassDefinitionBase; + kbts__class_range_record *Ranges = KBTS__POINTER_AFTER(kbts__class_range_record, ClassDef); kbts_un RangeCount = ClassDef->Count; if(RangeCount) @@ -15017,17 +17743,17 @@ static kbts_glyph_class_from_table_result kbts_GlyphClassFromTable(kbts_u16 *Cla return Result; } -static kbts_cover_glyph_result kbts_CoverGlyph(kbts_coverage *Coverage, kbts_u32 GlyphId) +static kbts__cover_glyph_result kbts__CoverGlyph(kbts__coverage *Coverage, kbts_u32 GlyphId) { - KBTS_INSTRUMENT_FUNCTION_BEGIN - kbts_cover_glyph_result Result = KBTS_ZERO; + KBTS_INSTRUMENT_FUNCTION_BEGIN; + kbts__cover_glyph_result Result = KBTS__ZERO; kbts_un Count = Coverage->Count; if(Count) { if(Coverage->Format == 1) { - kbts_u16 *GlyphIds = KBTS_POINTER_AFTER(kbts_u16, Coverage); + kbts_u16 *GlyphIds = KBTS__POINTER_AFTER(kbts_u16, Coverage); while(Count > 1) { @@ -15039,12 +17765,12 @@ static kbts_cover_glyph_result kbts_CoverGlyph(kbts_coverage *Coverage, kbts_u32 if(GlyphId == *GlyphIds) { Result.Valid = 1; - Result.Index = (kbts_u32)(GlyphIds - KBTS_POINTER_AFTER(kbts_u16, Coverage)); + Result.Index = (kbts_u32)(GlyphIds - KBTS__POINTER_AFTER(kbts_u16, Coverage)); } } else if(Coverage->Format == 2) { - kbts_range_record *Ranges = KBTS_POINTER_AFTER(kbts_range_record, Coverage); + kbts__range_record *Ranges = KBTS__POINTER_AFTER(kbts__range_record, Coverage); while(Count > 1) { @@ -15060,35 +17786,35 @@ static kbts_cover_glyph_result kbts_CoverGlyph(kbts_coverage *Coverage, kbts_u32 } } - KBTS_INSTRUMENT_END + KBTS_INSTRUMENT_FUNCTION_END; return Result; } -static void kbts_ByteSwapSequenceContextSubtable(kbts_byteswap_context *Context, kbts_u16 *Base) +static void kbts__ByteSwapSequenceContextSubtable(kbts__byteswap_context *Context, kbts_u16 *Base) { if(Base[0] == 1) { - kbts_sequence_context_1 *Subst = (kbts_sequence_context_1 *)Base; - Subst->SeqRuleSetCount = kbts_ByteSwap16(Subst->SeqRuleSetCount); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Subst), Subst->SeqRuleSetCount, Context); + kbts__sequence_context_1 *Subst = (kbts__sequence_context_1 *)Base; + Subst->SeqRuleSetCount = kbts__ByteSwap16(Subst->SeqRuleSetCount); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Subst), Subst->SeqRuleSetCount, Context); - KBTS_FOR(SetIndex, 0, Subst->SeqRuleSetCount) + KBTS__FOR(SetIndex, 0, Subst->SeqRuleSetCount) { - kbts_sequence_rule_set *Set = kbts_GetSequenceRuleSet(Subst, SetIndex); + kbts__sequence_rule_set *Set = kbts__GetSequenceRuleSet(Subst, SetIndex); - if(Set && !kbts_AlreadyVisited(Context, Set)) + if(Set && !kbts__AlreadyVisited(Context, Set)) { - Set->Count = kbts_ByteSwap16(Set->Count); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Set), Set->Count, Context); + Set->Count = kbts__ByteSwap16(Set->Count); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Set), Set->Count, Context); - KBTS_FOR(RuleIndex, 0, Set->Count) + KBTS__FOR(RuleIndex, 0, Set->Count) { - kbts_sequence_rule *Rule = kbts_GetSequenceRule(Set, RuleIndex); + kbts__sequence_rule *Rule = kbts__GetSequenceRule(Set, RuleIndex); - if(!kbts_AlreadyVisited(Context, Rule)) + if(!kbts__AlreadyVisited(Context, Rule)) { - kbts_ByteSwapArray16Context(&Rule->GlyphCount, 2, Context); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Rule), (kbts_un)Rule->GlyphCount - 1 + (kbts_un)Rule->SequenceLookupCount * 2, Context); + kbts__ByteSwapArray16Context(&Rule->GlyphCount, 2, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Rule), (kbts_un)Rule->GlyphCount - 1 + (kbts_un)Rule->SequenceLookupCount * 2, Context); } } } @@ -15096,57 +17822,57 @@ static void kbts_ByteSwapSequenceContextSubtable(kbts_byteswap_context *Context, } else if(Base[0] == 2) { - kbts_sequence_context_2 *Subst = (kbts_sequence_context_2 *)Base; - kbts_ByteSwapArray16Context(&Subst->ClassDefOffset, 2, Context); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Subst), Subst->ClassSequenceRuleSetCount, Context); + kbts__sequence_context_2 *Subst = (kbts__sequence_context_2 *)Base; + kbts__ByteSwapArray16Context(&Subst->ClassDefOffset, 2, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Subst), Subst->ClassSequenceRuleSetCount, Context); - kbts_u16 *ClassDefBase = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->ClassDefOffset); - kbts_ByteSwapClassDefinition(Context, ClassDefBase); + kbts_u16 *ClassDefBase = KBTS__POINTER_OFFSET(kbts_u16, Subst, Subst->ClassDefOffset); + kbts__ByteSwapClassDefinition(Context, ClassDefBase); - KBTS_FOR(SetIndex, 0, Subst->ClassSequenceRuleSetCount) + KBTS__FOR(SetIndex, 0, Subst->ClassSequenceRuleSetCount) { - kbts_class_sequence_rule_set *Set = kbts_GetClassSequenceRuleSet(Subst, SetIndex); + kbts__class_sequence_rule_set *Set = kbts__GetClassSequenceRuleSet(Subst, SetIndex); - if(Set && !kbts_AlreadyVisited(Context, Set)) + if(Set && !kbts__AlreadyVisited(Context, Set)) { - Set->Count = kbts_ByteSwap16(Set->Count); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Set), Set->Count, Context); + Set->Count = kbts__ByteSwap16(Set->Count); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Set), Set->Count, Context); - KBTS_FOR(RuleIndex, 0, Set->Count) + KBTS__FOR(RuleIndex, 0, Set->Count) { - kbts_class_sequence_rule *Rule = kbts_GetClassSequenceRule(Set, RuleIndex); + kbts__class_sequence_rule *Rule = kbts__GetClassSequenceRule(Set, RuleIndex); - if(!kbts_AlreadyVisited(Context, Rule)) + if(!kbts__AlreadyVisited(Context, Rule)) { - kbts_ByteSwapArray16Context(&Rule->GlyphCount, 2, Context); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Rule), Rule->GlyphCount - 1 + 2 * Rule->SequenceLookupCount, Context); + kbts__ByteSwapArray16Context(&Rule->GlyphCount, 2, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Rule), Rule->GlyphCount - 1 + 2 * Rule->SequenceLookupCount, Context); } } } } #ifdef KBTS_DUMP - kbts_DumpClassDefinition(ClassDefBase); - KBTS_FOR(SetIndex, 0, Subst->ClassSequenceRuleSetCount) + kbts__DumpClassDefinition(ClassDefBase); + KBTS__FOR(SetIndex, 0, Subst->ClassSequenceRuleSetCount) { - kbts_class_sequence_rule_set *Set = kbts_GetClassSequenceRuleSet(Subst, SetIndex); + kbts__class_sequence_rule_set *Set = kbts__GetClassSequenceRuleSet(Subst, SetIndex); if(Set) { - KBTS_FOR(RuleIndex, 0, Set->Count) + KBTS__FOR(RuleIndex, 0, Set->Count) { - kbts_class_sequence_rule *Rule = kbts_GetClassSequenceRule(Set, RuleIndex); - kbts_u16 *InputSequence = KBTS_POINTER_AFTER(kbts_u16, Rule); - kbts_sequence_lookup_record *Records = (kbts_sequence_lookup_record *)(InputSequence + Rule->GlyphCount - 1); + kbts__class_sequence_rule *Rule = kbts__GetClassSequenceRule(Set, RuleIndex); + kbts_u16 *InputSequence = KBTS__POINTER_AFTER(kbts_u16, Rule); + kbts__sequence_lookup_record *Records = (kbts__sequence_lookup_record *)(InputSequence + Rule->GlyphCount - 1); KBTS_DUMPF("Input: ["); - KBTS_FOR(GlyphIndex, 1, Rule->GlyphCount) + KBTS__FOR(GlyphIndex, 1, Rule->GlyphCount) { KBTS_DUMPF(", %x", InputSequence[GlyphIndex - 1]); } KBTS_DUMPF("]\nRecords: ["); - KBTS_FOR(RecordIndex, 0, Rule->SequenceLookupCount) + KBTS__FOR(RecordIndex, 0, Rule->SequenceLookupCount) { - kbts_sequence_lookup_record *Record = &Records[RecordIndex]; + kbts__sequence_lookup_record *Record = &Records[RecordIndex]; if(RecordIndex) KBTS_DUMPF(", "); KBTS_DUMPF("%u@%u", Record->LookupListIndex, Record->SequenceIndex); } @@ -15158,111 +17884,127 @@ static void kbts_ByteSwapSequenceContextSubtable(kbts_byteswap_context *Context, } else if(Base[0] == 3) { - kbts_sequence_context_3 *Subst = (kbts_sequence_context_3 *)Base; - kbts_ByteSwapArray16Context(&Subst->GlyphCount, 2, Context); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Subst), Subst->GlyphCount + 2 * Subst->SequenceLookupCount, Context); + kbts__sequence_context_3 *Subst = (kbts__sequence_context_3 *)Base; + kbts__ByteSwapArray16Context(&Subst->GlyphCount, 2, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Subst), Subst->GlyphCount + 2 * Subst->SequenceLookupCount, Context); - kbts_u16 *CoverageOffsets = KBTS_POINTER_AFTER(kbts_u16, Subst); - KBTS_FOR(CoverageIndex, 0, Subst->GlyphCount) + kbts_u16 *CoverageOffsets = KBTS__POINTER_AFTER(kbts_u16, Subst); + KBTS__FOR(CoverageIndex, 0, Subst->GlyphCount) { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Subst, CoverageOffsets[CoverageIndex]); + kbts__coverage *Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, CoverageOffsets[CoverageIndex]); - kbts_ByteSwapCoverage(Context, Coverage); + kbts__ByteSwapCoverage(Context, Coverage); } } } -typedef kbts_u32 kbts_skip_flags; -enum kbts_skip_flags_enum +typedef kbts_u32 kbts__skip_flags; +enum kbts__skip_flags_enum { - KBTS_SKIP_FLAG_NONE, - KBTS_SKIP_FLAG_ZWNJ = (1 << 0), - KBTS_SKIP_FLAG_ZWJ = (1 << 1), + KBTS__SKIP_FLAG_NONE, + KBTS__SKIP_FLAG_ZWNJ = (1 << 0), + KBTS__SKIP_FLAG_ZWJ = (1 << 1), }; // The Harfbuzz behavior is: // - GPOS lookups always skip ZWNJ. // - Sequence lookups always skip ZWJ. // - GSUB sequence lookups skip ZWNJ when requested. // - Regular lookups skip ZWJ when requested. -#define KBTS_SKIP_FLAGS_GSUB_REGULAR(RequestedFlags) ((RequestedFlags) & KBTS_SKIP_FLAG_ZWJ) -#define KBTS_SKIP_FLAGS_GSUB_SEQUENCE(RequestedFlags) (KBTS_SKIP_FLAG_ZWJ | ((RequestedFlags) & KBTS_SKIP_FLAG_ZWNJ)) -#define KBTS_SKIP_FLAGS_GPOS_REGULAR(RequestedFlags) (((RequestedFlags) & KBTS_SKIP_FLAG_ZWJ) | KBTS_SKIP_FLAG_ZWNJ) -#define KBTS_SKIP_FLAGS_GPOS_SEQUENCE(RequestedFlags) (KBTS_SKIP_FLAG_ZWJ | KBTS_SKIP_FLAG_ZWNJ) +#define KBTS__SKIP_FLAGS_GSUB_REGULAR(RequestedFlags) ((RequestedFlags) & KBTS__SKIP_FLAG_ZWJ) +#define KBTS__SKIP_FLAGS_GSUB_SEQUENCE(RequestedFlags) (KBTS__SKIP_FLAG_ZWJ | ((RequestedFlags) & KBTS__SKIP_FLAG_ZWNJ)) +#define KBTS__SKIP_FLAGS_GPOS_REGULAR(RequestedFlags) (((RequestedFlags) & KBTS__SKIP_FLAG_ZWJ) | KBTS__SKIP_FLAG_ZWNJ) +#define KBTS__SKIP_FLAGS_GPOS_SEQUENCE(RequestedFlags) (KBTS__SKIP_FLAG_ZWJ | KBTS__SKIP_FLAG_ZWNJ) -static kbts_skip_flags kbts_SkipFlags(kbts_feature_id FeatureId, kbts_shaper Shaper) +static kbts__skip_flags kbts__SkipFlags(kbts__feature_id FeatureId, kbts_shaper Shaper) { - kbts_skip_flags Result = 0; + kbts__skip_flags Result = 0; switch(FeatureId) { - case KBTS_FEATURE_ID_nukt: - case KBTS_FEATURE_ID_akhn: - case KBTS_FEATURE_ID_rphf: - case KBTS_FEATURE_ID_rkrf: - case KBTS_FEATURE_ID_pref: - case KBTS_FEATURE_ID_blwf: - case KBTS_FEATURE_ID_abvf: - case KBTS_FEATURE_ID_half: - case KBTS_FEATURE_ID_pstf: - case KBTS_FEATURE_ID_vatu: - case KBTS_FEATURE_ID_cjct: - case KBTS_FEATURE_ID_pres: - case KBTS_FEATURE_ID_abvs: - case KBTS_FEATURE_ID_blws: - case KBTS_FEATURE_ID_psts: - case KBTS_FEATURE_ID_haln: - Result = (Shaper == KBTS_SHAPER_INDIC) ? 0 : KBTS_SKIP_FLAG_ZWNJ | KBTS_SKIP_FLAG_ZWJ; + case KBTS__FEATURE_ID_nukt: + case KBTS__FEATURE_ID_akhn: + case KBTS__FEATURE_ID_rphf: + case KBTS__FEATURE_ID_rkrf: + case KBTS__FEATURE_ID_pref: + case KBTS__FEATURE_ID_blwf: + case KBTS__FEATURE_ID_abvf: + case KBTS__FEATURE_ID_half: + case KBTS__FEATURE_ID_pstf: + case KBTS__FEATURE_ID_vatu: + case KBTS__FEATURE_ID_cjct: + case KBTS__FEATURE_ID_pres: + case KBTS__FEATURE_ID_abvs: + case KBTS__FEATURE_ID_blws: + case KBTS__FEATURE_ID_psts: + case KBTS__FEATURE_ID_haln: + case KBTS__FEATURE_ID_cfar: + if(Shaper == KBTS_SHAPER_USE) + { + Result = KBTS__SKIP_FLAG_ZWNJ; + } + else if((Shaper == KBTS_SHAPER_INDIC) || + (Shaper == KBTS_SHAPER_KHMER)) + { + Result = 0; + } + else + { + Result = KBTS__SKIP_FLAG_ZWNJ | KBTS__SKIP_FLAG_ZWJ; + } break; - case KBTS_FEATURE_ID_init: + case KBTS__FEATURE_ID_init: if (Shaper == KBTS_SHAPER_INDIC) {Result = 0;} - else if(Shaper == KBTS_SHAPER_ARABIC) {Result = KBTS_SKIP_FLAG_ZWNJ;} - else {Result = KBTS_SKIP_FLAG_ZWNJ | KBTS_SKIP_FLAG_ZWJ;} + else if(Shaper == KBTS_SHAPER_ARABIC) {Result = KBTS__SKIP_FLAG_ZWNJ;} + else {Result = KBTS__SKIP_FLAG_ZWNJ | KBTS__SKIP_FLAG_ZWJ;} break; - case KBTS_FEATURE_ID_ccmp: - case KBTS_FEATURE_ID_locl: - case KBTS_FEATURE_ID_isol: - case KBTS_FEATURE_ID_fina: - case KBTS_FEATURE_ID_fin2: - case KBTS_FEATURE_ID_fin3: - case KBTS_FEATURE_ID_medi: - case KBTS_FEATURE_ID_med2: - case KBTS_FEATURE_ID_calt: - case KBTS_FEATURE_ID_liga: - case KBTS_FEATURE_ID_clig: - case KBTS_FEATURE_ID_rlig: - case KBTS_FEATURE_ID_mset: - Result = (Shaper == KBTS_SHAPER_ARABIC) ? KBTS_SKIP_FLAG_ZWNJ : KBTS_SKIP_FLAG_ZWNJ | KBTS_SKIP_FLAG_ZWJ; + case KBTS__FEATURE_ID_ccmp: + case KBTS__FEATURE_ID_locl: + case KBTS__FEATURE_ID_isol: + case KBTS__FEATURE_ID_fina: + case KBTS__FEATURE_ID_fin2: + case KBTS__FEATURE_ID_fin3: + case KBTS__FEATURE_ID_medi: + case KBTS__FEATURE_ID_med2: + case KBTS__FEATURE_ID_calt: + case KBTS__FEATURE_ID_liga: + case KBTS__FEATURE_ID_clig: + case KBTS__FEATURE_ID_rlig: + case KBTS__FEATURE_ID_mset: + Result = (Shaper == KBTS_SHAPER_ARABIC) ? KBTS__SKIP_FLAG_ZWNJ : KBTS__SKIP_FLAG_ZWNJ | KBTS__SKIP_FLAG_ZWJ; break; - case KBTS_FEATURE_ID_mark: - case KBTS_FEATURE_ID_mkmk: + case KBTS__FEATURE_ID_mark: + case KBTS__FEATURE_ID_mkmk: Result = 0; break; default: - Result = KBTS_SKIP_FLAG_ZWNJ | KBTS_SKIP_FLAG_ZWJ; + Result = KBTS__SKIP_FLAG_ZWNJ | KBTS__SKIP_FLAG_ZWJ; break; } return Result; } -static kbts_u32 kbts_GlyphIncludedInLookup(kbts_font *Font, int Gpos, kbts_un LookupIndex, kbts_u32 Id) +static kbts_u32 kbts__GlyphIncludedInLookup(kbts_font *Font, int Gpos, kbts_un LookupIndex, kbts_u32 Id) { kbts_u32 Result = 1; - if(Font->GlyphLookupMatrix && (Id < Font->GlyphCount)) + kbts_u32 GlyphCount = Font->Blob->GlyphCount; + if(Font->Blob->GlyphLookupMatrixOffsetFromStartOfFile && (Id < GlyphCount)) { - kbts_un FlatLookupIndex = (Gpos ? Font->GposLookupIndexOffset : 0) + LookupIndex; - kbts_un FlatIndex = FlatLookupIndex * Font->Maxp->GlyphCount + Id; + kbts_u32 *GlyphLookupMatrix = KBTS__POINTER_OFFSET(kbts_u32, Font->Blob, Font->Blob->GlyphLookupMatrixOffsetFromStartOfFile); + + kbts_un FlatLookupIndex = (Gpos ? Font->Blob->GposLookupIndexOffset : 0) + LookupIndex; + kbts_un FlatIndex = FlatLookupIndex * Font->Blob->GlyphCount + Id; kbts_un WordIndex = FlatIndex / 32; kbts_un BitIndex = FlatIndex % 32; - Result = Font->GlyphLookupMatrix[WordIndex] & (1 << BitIndex); + Result = GlyphLookupMatrix[WordIndex] & (1 << BitIndex); } return Result; } -static int kbts_GlyphPassesLookupFilter(kbts_glyph *Glyph, kbts_unpacked_lookup *Lookup) +static int kbts__GlyphPassesLookupFilter(kbts_glyph *Glyph, kbts__unpacked_lookup *Lookup) { int Result = 1; kbts_u16 Class = Glyph->Classes.Class; @@ -15272,9 +18014,9 @@ static int kbts_GlyphPassesLookupFilter(kbts_glyph *Glyph, kbts_unpacked_lookup Result = 0; } - if(Result && (Class == KBTS_GLYPH_CLASS_MARK)) + if(Result && (Class == KBTS__GLYPH_CLASS_MARK)) { - if(Lookup->Flags & KBTS_LOOKUP_FLAG_MARK_ATTACHMENT_CLASS_FILTER) + if(Lookup->Flags & KBTS__LOOKUP_FLAG_MARK_ATTACHMENT_CLASS_FILTER) { kbts_u32 DesiredMarkAttachmentClass = Lookup->Flags >> 8; @@ -15287,7 +18029,7 @@ static int kbts_GlyphPassesLookupFilter(kbts_glyph *Glyph, kbts_unpacked_lookup if(Result && Lookup->MarkFilteringSet) { // @Speed: We may want to save the result of the last mark filtering test on the glyph itself. - kbts_cover_glyph_result Cover = kbts_CoverGlyph(Lookup->MarkFilteringSet, Glyph->Id); + kbts__cover_glyph_result Cover = kbts__CoverGlyph(Lookup->MarkFilteringSet, Glyph->Id); if(!Cover.Valid) { Result = 0; @@ -15298,108 +18040,131 @@ static int kbts_GlyphPassesLookupFilter(kbts_glyph *Glyph, kbts_unpacked_lookup return Result; } -static int kbts_SkipGlyph(kbts_glyph *Glyph, kbts_unpacked_lookup *Lookup, kbts_skip_flags SkipFlags, kbts_u32 SkipUnicodeFlags) +static int kbts__SkipGlyph(kbts_glyph *Glyph, kbts__unpacked_lookup *Lookup, kbts__skip_flags SkipFlags, kbts_u32 SkipUnicodeFlags) { int Result = (Glyph->UnicodeFlags & SkipUnicodeFlags) || - ((SkipFlags & KBTS_SKIP_FLAG_ZWNJ) && (Glyph->Codepoint == 0x200C)) || - ((SkipFlags & KBTS_SKIP_FLAG_ZWJ) && (Glyph->Codepoint == 0x200D)) || - !kbts_GlyphPassesLookupFilter(Glyph, Lookup); + ((SkipFlags & KBTS__SKIP_FLAG_ZWNJ) && (Glyph->Codepoint == 0x200C)) || + ((SkipFlags & KBTS__SKIP_FLAG_ZWJ) && (Glyph->Codepoint == 0x200D)) || + !kbts__GlyphPassesLookupFilter(Glyph, Lookup); return Result; } -static int kbts_GlyphsIncludedInLookupSubtable(kbts_font *Font, int Gpos, kbts_unpacked_lookup *Lookup, kbts_un LookupIndex, kbts_un SubtableIndex, kbts_glyph_array *Array, kbts_un CurrentGlyphIndex, kbts_skip_flags SkipFlags, kbts_unicode_flags SkipUnicodeFlags) +static int kbts__GlyphIsValid(kbts_glyph_storage *Storage, kbts_glyph *Glyph) { - if(Font->GlyphLookupSubtableMatrix) + int Result = Glyph != &Storage->GlyphSentinel; + return Result; +} + +typedef struct kbts__matrix_index +{ + kbts_un WordIndex; + kbts_un BitIndex; +} kbts__matrix_index; + +static kbts__matrix_index kbts__GlyphLookupMatrixIndex(kbts_un LookupIndex, kbts_un GlyphIndex, kbts_un GlyphCount) +{ + kbts_un FlatIndex = LookupIndex * GlyphCount + GlyphIndex; + + kbts__matrix_index Result = KBTS__ZERO; + Result.WordIndex = FlatIndex / 32; + Result.BitIndex = FlatIndex % 32; + + return Result; +} + +static kbts__matrix_index kbts__GlyphLookupSubtableMatrixIndex(kbts_un SubtableIndex, kbts_un SubtableCount, kbts_un GlyphIndex) +{ + // Since we try many subtables in a row against the same glyphs, the rows are glyph-wise and the columns subtable-wise. + kbts_un FlatIndex = GlyphIndex * SubtableCount + SubtableIndex; + + kbts__matrix_index Result = KBTS__ZERO; + Result.WordIndex = FlatIndex / 32; + Result.BitIndex = FlatIndex % 32; + return Result; +} + +static int kbts__GlyphsIncludedInLookupSubtable(kbts_glyph_storage *Storage, kbts_font *Font, int Gpos, kbts__unpacked_lookup *Lookup, kbts_un LookupIndex, kbts_un SubtableIndex, kbts_glyph *AtGlyph, kbts__skip_flags SkipFlags, kbts_unicode_flags SkipUnicodeFlags) +{ + if(Font->Blob->GlyphLookupSubtableMatrixOffsetFromStartOfFile) { - kbts_un FlatLookupIndex = (Gpos ? Font->GposLookupIndexOffset : 0) + LookupIndex; - kbts_un FlatSubtableIndex = Font->LookupSubtableIndexOffsets[FlatLookupIndex] + SubtableIndex; - kbts_un MatrixRowOffset = FlatSubtableIndex * Font->Maxp->GlyphCount; - kbts_lookup_subtable_info *Info = &Font->SubtableInfos[FlatSubtableIndex]; + kbts_u32 *GlyphLookupSubtableMatrix = KBTS__POINTER_OFFSET(kbts_u32, Font->Blob, Font->Blob->GlyphLookupSubtableMatrixOffsetFromStartOfFile); + kbts_u32 *LookupSubtableIndexOffsets = KBTS__POINTER_OFFSET(kbts_u32, Font->Blob, Font->Blob->LookupSubtableIndexOffsetsOffsetFromStartOfFile); + kbts_lookup_subtable_info *SubtableInfos = KBTS__POINTER_OFFSET(kbts_lookup_subtable_info, Font->Blob, Font->Blob->SubtableInfosOffsetFromStartOfFile); + kbts_un GlyphCount = Font->Blob->GlyphCount; + kbts_un SubtableCount = Font->Blob->LookupSubtableCount; + + kbts_un FlatLookupIndex = (Gpos ? Font->Blob->GposLookupIndexOffset : 0) + LookupIndex; + kbts_un FlatSubtableIndex = LookupSubtableIndexOffsets[FlatLookupIndex] + SubtableIndex; + kbts_lookup_subtable_info *Info = &SubtableInfos[FlatSubtableIndex]; kbts_un MinimumBacktrack = (Info->MinimumBacktrackPlusOne) ? Info->MinimumBacktrackPlusOne - 1 : 0; kbts_un MinimumFollowup = (Info->MinimumFollowupPlusOne) ? Info->MinimumFollowupPlusOne - 1 : 0; - kbts_un GlyphCount = Font->GlyphCount; - - if((MinimumBacktrack <= CurrentGlyphIndex) && (MinimumFollowup <= (Array->Count - CurrentGlyphIndex))) - { - { // Check the current glyph. - kbts_un Id = Array->Glyphs[CurrentGlyphIndex].Id; - kbts_un FlatIndex = MatrixRowOffset + Id; - kbts_un WordIndex = FlatIndex / 32; - kbts_un BitIndex = FlatIndex % 32; - if(Id >= GlyphCount) - { - return 1; - } - else if(!(Font->GlyphLookupSubtableMatrix[WordIndex] & (1 << BitIndex))) - { - return 0; - } - } + { // Check the current glyph. + kbts_un Id = AtGlyph->Id; + kbts__matrix_index MatrixIndex = kbts__GlyphLookupSubtableMatrixIndex(FlatSubtableIndex, SubtableCount, Id); + if(Id >= GlyphCount) { - kbts_un BacktrackCounter = 0; - kbts_glyph *BacktrackGlyph = &Array->Glyphs[CurrentGlyphIndex - 1]; - while((BacktrackGlyph >= Array->Glyphs) && (BacktrackCounter < MinimumBacktrack)) - { - kbts_un FlatIndex = MatrixRowOffset + BacktrackGlyph->Id; - kbts_un WordIndex = FlatIndex / 32; - kbts_un BitIndex = FlatIndex % 32; - if(BacktrackGlyph->Id >= GlyphCount) - { - return 1; - } - else if(Font->GlyphLookupSubtableMatrix[WordIndex] & (1 << BitIndex)) - { - BacktrackCounter += 1; - } - else if(!kbts_SkipGlyph(BacktrackGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) - { - return 0; - } - - BacktrackGlyph -= 1; - } - - if(BacktrackCounter < MinimumBacktrack) - { - return 0; - } + return 1; } - + else if(!(GlyphLookupSubtableMatrix[MatrixIndex.WordIndex] & (1 << MatrixIndex.BitIndex))) { - kbts_un LookaheadCounter = 0; - kbts_glyph *LookaheadGlyph = &Array->Glyphs[CurrentGlyphIndex + 1]; - kbts_glyph *OnePastLastGlyph = Array->Glyphs + Array->Count; - while((LookaheadGlyph < OnePastLastGlyph) && (LookaheadCounter < MinimumFollowup)) - { - kbts_un FlatIndex = MatrixRowOffset + LookaheadGlyph->Id; - kbts_un WordIndex = FlatIndex / 32; - kbts_un BitIndex = FlatIndex % 32; - if(LookaheadGlyph->Id >= GlyphCount) - { - return 1; - } - else if(Font->GlyphLookupSubtableMatrix[WordIndex] & (1 << BitIndex)) - { - LookaheadCounter += 1; - } - else if(!kbts_SkipGlyph(LookaheadGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) - { - return 0; - } - - LookaheadGlyph += 1; - } - - if(LookaheadCounter < MinimumFollowup) - { - return 0; - } + return 0; } } - else + { - return 0; + kbts_un BacktrackCounter = 0; + kbts_glyph *BacktrackGlyph = AtGlyph->Prev; + while(kbts__GlyphIsValid(Storage, BacktrackGlyph) && + (BacktrackCounter < MinimumBacktrack)) + { + kbts__matrix_index MatrixIndex = kbts__GlyphLookupSubtableMatrixIndex(FlatSubtableIndex, SubtableCount, BacktrackGlyph->Id); + + if((BacktrackGlyph->Id >= GlyphCount) || + kbts__SkipGlyph(BacktrackGlyph, Lookup, SkipFlags, SkipUnicodeFlags) || + GlyphLookupSubtableMatrix[MatrixIndex.WordIndex] & (1 << MatrixIndex.BitIndex)) + { + BacktrackCounter += 1; + } + else + { + return 0; + } + + BacktrackGlyph = BacktrackGlyph->Prev; + } + + if(BacktrackCounter < MinimumBacktrack) + { + return 0; + } + } + + { + kbts_un LookaheadCounter = 0; + kbts_glyph *LookaheadGlyph = AtGlyph->Next; + while(kbts__GlyphIsValid(Storage, LookaheadGlyph) && (LookaheadCounter < MinimumFollowup)) + { + kbts__matrix_index MatrixIndex = kbts__GlyphLookupSubtableMatrixIndex(FlatSubtableIndex, SubtableCount, LookaheadGlyph->Id); + + if((LookaheadGlyph->Id >= GlyphCount) || + kbts__SkipGlyph(LookaheadGlyph, Lookup, SkipFlags, SkipUnicodeFlags) || + GlyphLookupSubtableMatrix[MatrixIndex.WordIndex] & (1 << MatrixIndex.BitIndex)) + { + LookaheadCounter += 1; + } + else + { + return 0; + } + + LookaheadGlyph = LookaheadGlyph->Next; + } + + if(LookaheadCounter < MinimumFollowup) + { + return 0; + } } } @@ -15407,23 +18172,23 @@ static int kbts_GlyphsIncludedInLookupSubtable(kbts_font *Font, int Gpos, kbts_u } # ifdef KBTS_DUMP -static void kbts_DumpCoverage(kbts_coverage *Coverage) +static void kbts__DumpCoverage(kbts__coverage *Coverage) { KBTS_DUMPF("["); if(Coverage->Format == 1) { - kbts_u16 *GlyphIds = KBTS_POINTER_AFTER(kbts_u16, Coverage); - KBTS_FOR(GlyphIndex, 0, Coverage->Count) + kbts_u16 *GlyphIds = KBTS__POINTER_AFTER(kbts_u16, Coverage); + KBTS__FOR(GlyphIndex, 0, Coverage->Count) { KBTS_DUMPF("%x,", GlyphIds[GlyphIndex]); } } else if(Coverage->Format == 2) { - kbts_range_record *Ranges = KBTS_POINTER_AFTER(kbts_range_record, Coverage); - KBTS_FOR(RangeIndex, 0, Coverage->Count) + kbts__range_record *Ranges = KBTS__POINTER_AFTER(kbts__range_record, Coverage); + KBTS__FOR(RangeIndex, 0, Coverage->Count) { - kbts_range_record *Range = &Ranges[RangeIndex]; + kbts__range_record *Range = &Ranges[RangeIndex]; KBTS_DUMPF("%x..%x @ %u,", Range->StartGlyphId, Range->EndGlyphId, Range->StartCoverageIndex); } } @@ -15431,81 +18196,81 @@ static void kbts_DumpCoverage(kbts_coverage *Coverage) } # endif -static void kbts_ByteSwapChainedSequenceContextSubtable(kbts_byteswap_context *Context, kbts_u16 *Base) +static void kbts__ByteSwapChainedSequenceContextSubtable(kbts__byteswap_context *Context, kbts_u16 *Base) { if(Base[0] == 1) { - kbts_chained_sequence_context_1 *Subst = (kbts_chained_sequence_context_1 *)Base; - Subst->ChainedSequenceRuleSetCount = kbts_ByteSwap16(Subst->ChainedSequenceRuleSetCount); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Subst), Subst->ChainedSequenceRuleSetCount, Context); + kbts__chained_sequence_context_1 *Subst = (kbts__chained_sequence_context_1 *)Base; + Subst->ChainedSequenceRuleSetCount = kbts__ByteSwap16(Subst->ChainedSequenceRuleSetCount); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Subst), Subst->ChainedSequenceRuleSetCount, Context); - KBTS_FOR(SetIndex, 0, Subst->ChainedSequenceRuleSetCount) + KBTS__FOR(SetIndex, 0, Subst->ChainedSequenceRuleSetCount) { - kbts_ByteSwapChainedSequenceRuleSet(Context, kbts_GetChainedSequenceRuleSet(Subst, SetIndex)); + kbts__ByteSwapChainedSequenceRuleSet(Context, kbts__GetChainedSequenceRuleSet(Subst, SetIndex)); } } else if(Base[0] == 2) { - kbts_chained_sequence_context_2 *Subst = (kbts_chained_sequence_context_2 *)Base; - kbts_ByteSwapArray16Context(&Subst->BacktrackClassDefOffset, 4, Context); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Subst), Subst->ChainedClassSequenceRuleSetCount, Context); + kbts__chained_sequence_context_2 *Subst = (kbts__chained_sequence_context_2 *)Base; + kbts__ByteSwapArray16Context(&Subst->BacktrackClassDefOffset, 4, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Subst), Subst->ChainedClassSequenceRuleSetCount, Context); - kbts_u16 *BacktrackClassDefinition = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->BacktrackClassDefOffset); - kbts_ByteSwapClassDefinition(Context, BacktrackClassDefinition); + kbts_u16 *BacktrackClassDefinition = KBTS__POINTER_OFFSET(kbts_u16, Subst, Subst->BacktrackClassDefOffset); + kbts__ByteSwapClassDefinition(Context, BacktrackClassDefinition); - kbts_u16 *InputClassDefinition = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->InputClassDefOffset); - kbts_ByteSwapClassDefinition(Context, InputClassDefinition); + kbts_u16 *InputClassDefinition = KBTS__POINTER_OFFSET(kbts_u16, Subst, Subst->InputClassDefOffset); + kbts__ByteSwapClassDefinition(Context, InputClassDefinition); - kbts_u16 *LookaheadClassDefinition = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->LookaheadClassDefOffset); - kbts_ByteSwapClassDefinition(Context, LookaheadClassDefinition); + kbts_u16 *LookaheadClassDefinition = KBTS__POINTER_OFFSET(kbts_u16, Subst, Subst->LookaheadClassDefOffset); + kbts__ByteSwapClassDefinition(Context, LookaheadClassDefinition); #ifdef KBTS_DUMP KBTS_DUMPF("Backtrack classes:\n"); - // kbts_DumpClassDefinition(BacktrackClassDefinition); + // kbts__DumpClassDefinition(BacktrackClassDefinition); KBTS_DUMPF("Input classes:\n"); - // kbts_DumpClassDefinition(InputClassDefinition); + // kbts__DumpClassDefinition(InputClassDefinition); KBTS_DUMPF("Lookahead classes:\n"); - // kbts_DumpClassDefinition(LookaheadClassDefinition); + // kbts__DumpClassDefinition(LookaheadClassDefinition); #endif - KBTS_FOR(SetIndex, 0, Subst->ChainedClassSequenceRuleSetCount) + KBTS__FOR(SetIndex, 0, Subst->ChainedClassSequenceRuleSetCount) { - kbts_chained_sequence_rule_set *Set = kbts_GetChainedClassSequenceRuleSet(Subst, SetIndex); - kbts_ByteSwapChainedSequenceRuleSet(Context, Set); + kbts__chained_sequence_rule_set *Set = kbts__GetChainedClassSequenceRuleSet(Subst, SetIndex); + kbts__ByteSwapChainedSequenceRuleSet(Context, Set); #ifdef KBTS_DUMP if(Set) { - KBTS_FOR(RuleIndex, 0, Set->Count) + KBTS__FOR(RuleIndex, 0, Set->Count) { - kbts_chained_sequence_rule *Rule = kbts_GetChainedClassSequenceRule(Set, RuleIndex); - kbts_unpacked_chained_sequence_rule Unpacked = kbts_UnpackChainedSequenceRule(Rule, 0); + kbts__chained_sequence_rule *Rule = kbts__GetChainedClassSequenceRule(Set, RuleIndex); + kbts__unpacked_chained_sequence_rule Unpacked = kbts__UnpackChainedSequenceRule(Rule, 0); KBTS_DUMPF("Backtrack: ["); - KBTS_FOR(BacktrackIndex, 0, Unpacked.BacktrackCount) + KBTS__FOR(BacktrackIndex, 0, Unpacked.BacktrackCount) { if(BacktrackIndex) KBTS_DUMPF(", "); KBTS_DUMPF("%u", Unpacked.Backtrack[BacktrackIndex]); } KBTS_DUMPF("]\n" "Input: ["); - KBTS_FOR(InputIndex, 1, Unpacked.InputCount) + KBTS__FOR(InputIndex, 1, Unpacked.InputCount) { if(InputIndex) KBTS_DUMPF(", "); KBTS_DUMPF("%u", Unpacked.Input[InputIndex - 1]); } KBTS_DUMPF("]\n" "Lookahead: ["); - KBTS_FOR(LookaheadIndex, 0, Unpacked.LookaheadCount) + KBTS__FOR(LookaheadIndex, 0, Unpacked.LookaheadCount) { if(LookaheadIndex) KBTS_DUMPF(", "); KBTS_DUMPF("%u", Unpacked.Lookahead[LookaheadIndex]); } KBTS_DUMPF("]\n" "Records: ["); - KBTS_FOR(RecordIndex, 0, Unpacked.RecordCount) + KBTS__FOR(RecordIndex, 0, Unpacked.RecordCount) { - kbts_sequence_lookup_record *Record = &Unpacked.Records[RecordIndex]; + kbts__sequence_lookup_record *Record = &Unpacked.Records[RecordIndex]; if(RecordIndex) KBTS_DUMPF(", "); KBTS_DUMPF("%u@%u", Record->LookupListIndex, Record->SequenceIndex); } @@ -15517,53 +18282,53 @@ static void kbts_ByteSwapChainedSequenceContextSubtable(kbts_byteswap_context *C } else if(Base[0] == 3) { - kbts_chained_sequence_context_3 *Subst = (kbts_chained_sequence_context_3 *)Base; - kbts_unpacked_chained_sequence_context_3 Unpacked = kbts_UnpackChainedSequenceContext3(Subst, 1); + kbts__chained_sequence_context_3 *Subst = (kbts__chained_sequence_context_3 *)Base; + kbts__unpacked_chained_sequence_context_3 Unpacked = kbts__UnpackChainedSequenceContext3(Subst, 1); kbts_un U16Count = Unpacked.BacktrackCount + Unpacked.InputCount + Unpacked.LookaheadCount + Unpacked.RecordCount * 2 + 4; - kbts_ByteSwapArray16Context(&Subst->BacktrackGlyphCount, U16Count, Context); + kbts__ByteSwapArray16Context(&Subst->BacktrackGlyphCount, U16Count, Context); - KBTS_FOR(BacktrackCoverageIndex, 0, Unpacked.BacktrackCount) + KBTS__FOR(BacktrackCoverageIndex, 0, Unpacked.BacktrackCount) { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.BacktrackCoverageOffsets[BacktrackCoverageIndex]); + kbts__coverage *Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.BacktrackCoverageOffsets[BacktrackCoverageIndex]); - kbts_ByteSwapCoverage(Context, Coverage); + kbts__ByteSwapCoverage(Context, Coverage); } - KBTS_FOR(InputCoverageIndex, 0, Unpacked.InputCount) + KBTS__FOR(InputCoverageIndex, 0, Unpacked.InputCount) { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.InputCoverageOffsets[InputCoverageIndex]); + kbts__coverage *Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.InputCoverageOffsets[InputCoverageIndex]); - kbts_ByteSwapCoverage(Context, Coverage); + kbts__ByteSwapCoverage(Context, Coverage); } - KBTS_FOR(LookaheadCoverageIndex, 0, Unpacked.LookaheadCount) + KBTS__FOR(LookaheadCoverageIndex, 0, Unpacked.LookaheadCount) { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.LookaheadCoverageOffsets[LookaheadCoverageIndex]); + kbts__coverage *Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.LookaheadCoverageOffsets[LookaheadCoverageIndex]); - kbts_ByteSwapCoverage(Context, Coverage); + kbts__ByteSwapCoverage(Context, Coverage); } # ifdef KBTS_DUMP KBTS_DUMPF(" Backtrack: "); - KBTS_FOR(BacktrackCoverageIndex, 0, Unpacked.BacktrackCount) + KBTS__FOR(BacktrackCoverageIndex, 0, Unpacked.BacktrackCount) { - kbts_DumpCoverage(KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.BacktrackCoverageOffsets[BacktrackCoverageIndex])); + kbts__DumpCoverage(KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.BacktrackCoverageOffsets[BacktrackCoverageIndex])); } KBTS_DUMPF("\n Input: "); - KBTS_FOR(InputCoverageIndex, 0, Unpacked.InputCount) + KBTS__FOR(InputCoverageIndex, 0, Unpacked.InputCount) { - kbts_DumpCoverage(KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.InputCoverageOffsets[InputCoverageIndex])); + kbts__DumpCoverage(KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.InputCoverageOffsets[InputCoverageIndex])); } KBTS_DUMPF("\n Lookahead: "); - KBTS_FOR(LookaheadCoverageIndex, 0, Unpacked.LookaheadCount) + KBTS__FOR(LookaheadCoverageIndex, 0, Unpacked.LookaheadCount) { - kbts_DumpCoverage(KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.LookaheadCoverageOffsets[LookaheadCoverageIndex])); + kbts__DumpCoverage(KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.LookaheadCoverageOffsets[LookaheadCoverageIndex])); } KBTS_DUMPF("\n Lookups: ["); - KBTS_FOR(RecordIndex, 0, Unpacked.RecordCount) + KBTS__FOR(RecordIndex, 0, Unpacked.RecordCount) { - kbts_sequence_lookup_record *Record = &Unpacked.Records[RecordIndex]; + kbts__sequence_lookup_record *Record = &Unpacked.Records[RecordIndex]; KBTS_DUMPF("%u@%u,", Record->LookupListIndex, Record->SequenceIndex); } @@ -15572,58 +18337,58 @@ static void kbts_ByteSwapChainedSequenceContextSubtable(kbts_byteswap_context *C } } -static void kbts_ByteSwapGsubLookupSubtable(kbts_byteswap_context *Context, kbts_u16 LookupType, kbts_u16 *Base) +static void kbts__ByteSwapGsubLookupSubtable(kbts__byteswap_context *Context, kbts_u16 LookupType, kbts_u16 *Base) { - int Swap = !kbts_AlreadyVisited(Context, Base); + int Swap = !kbts__AlreadyVisited(Context, Base); while(Swap && (LookupType == 7)) { - kbts_extension *Subst = (kbts_extension *)Base; - Subst->Format = kbts_ByteSwap16(Subst->Format); - Subst->LookupType = kbts_ByteSwap16(Subst->LookupType); - Subst->Offset = kbts_ByteSwap32(Subst->Offset); + kbts__extension *Subst = (kbts__extension *)Base; + Subst->Format = kbts__ByteSwap16(Subst->Format); + Subst->LookupType = kbts__ByteSwap16(Subst->LookupType); + Subst->Offset = kbts__ByteSwap32(Subst->Offset); KBTS_DUMPF(" Type 7.1\n" " Offset %zu\n" " -> %zu\n", (char *)Base - Context->FileBase, (char *)Subst + Subst->Offset - Context->FileBase); - Base = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->Offset); + Base = KBTS__POINTER_OFFSET(kbts_u16, Subst, Subst->Offset); LookupType = Subst->LookupType; - Swap = !kbts_AlreadyVisited(Context, Base); + Swap = !kbts__AlreadyVisited(Context, Base); } if(Swap) { - *Base = kbts_ByteSwap16(*Base); + *Base = kbts__ByteSwap16(*Base); KBTS_DUMPF(" Type %u.%u\n" " Offset %zu\n", LookupType, *Base, (char *)Base - Context->FileBase); - if(kbts_GsubLookupBeginsWithCoverage(LookupType, Base[0])) + if(kbts__GsubLookupBeginsWithCoverage(LookupType, Base[0])) { - Base[1] = kbts_ByteSwap16(Base[1]); - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Base, Base[1]); + Base[1] = kbts__ByteSwap16(Base[1]); + kbts__coverage *Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Base, Base[1]); - kbts_ByteSwapCoverage(Context, Coverage); + kbts__ByteSwapCoverage(Context, Coverage); # ifdef KBTS_DUMP KBTS_DUMPF(" Coverage %u\n", Coverage->Format); if(Coverage->Format == 1) { - kbts_u16 *GlyphIds = KBTS_POINTER_AFTER(kbts_u16, Coverage); - KBTS_FOR(GlyphIndex, 0, Coverage->Count) + kbts_u16 *GlyphIds = KBTS__POINTER_AFTER(kbts_u16, Coverage); + KBTS__FOR(GlyphIndex, 0, Coverage->Count) { KBTS_DUMPF(" %x\n", GlyphIds[GlyphIndex]); } } else if(Coverage->Format == 2) { - kbts_range_record *Ranges = KBTS_POINTER_AFTER(kbts_range_record, Coverage); - KBTS_FOR(RangeIndex, 0, Coverage->Count) + kbts__range_record *Ranges = KBTS__POINTER_AFTER(kbts__range_record, Coverage); + KBTS__FOR(RangeIndex, 0, Coverage->Count) { - kbts_range_record Range = Ranges[RangeIndex]; + kbts__range_record Range = Ranges[RangeIndex]; KBTS_DUMPF(" %x..%x@%u..%u\n", Range.StartGlyphId, Range.EndGlyphId, Range.StartCoverageIndex, Range.StartCoverageIndex + (Range.EndGlyphId - Range.StartGlyphId)); } } @@ -15634,8 +18399,8 @@ static void kbts_ByteSwapGsubLookupSubtable(kbts_byteswap_context *Context, kbts { case 1: { - kbts_single_substitution *Subst = (kbts_single_substitution *)Base; - Subst->DeltaOrCount.GlyphCount = kbts_ByteSwap16(Subst->DeltaOrCount.GlyphCount); + kbts__single_substitution *Subst = (kbts__single_substitution *)Base; + Subst->DeltaOrCount.GlyphCount = kbts__ByteSwap16(Subst->DeltaOrCount.GlyphCount); # ifdef KBTS_DUMP if(Subst->Format == 1) @@ -15646,12 +18411,12 @@ static void kbts_ByteSwapGsubLookupSubtable(kbts_byteswap_context *Context, kbts if(Subst->Format == 2) { - kbts_u16 *GlyphIds = KBTS_POINTER_AFTER(kbts_u16, Subst); - kbts_ByteSwapArray16Context(GlyphIds, Subst->DeltaOrCount.GlyphCount, Context); + kbts_u16 *GlyphIds = KBTS__POINTER_AFTER(kbts_u16, Subst); + kbts__ByteSwapArray16Context(GlyphIds, Subst->DeltaOrCount.GlyphCount, Context); #ifdef KBTS_DUMP KBTS_DUMPF(" ["); - KBTS_FOR(IdIndex, 0, Subst->DeltaOrCount.GlyphCount) + KBTS__FOR(IdIndex, 0, Subst->DeltaOrCount.GlyphCount) { if(IdIndex) KBTS_DUMPF(" "); KBTS_DUMPF("%x", GlyphIds[IdIndex]); @@ -15664,25 +18429,25 @@ static void kbts_ByteSwapGsubLookupSubtable(kbts_byteswap_context *Context, kbts case 2: { - kbts_multiple_substitution *Subst = (kbts_multiple_substitution *)Base; - Subst->SequenceCount = kbts_ByteSwap16(Subst->SequenceCount); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Subst), Subst->SequenceCount, Context); + kbts__multiple_substitution *Subst = (kbts__multiple_substitution *)Base; + Subst->SequenceCount = kbts__ByteSwap16(Subst->SequenceCount); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Subst), Subst->SequenceCount, Context); - KBTS_FOR(SequenceIndex, 0, Subst->SequenceCount) + KBTS__FOR(SequenceIndex, 0, Subst->SequenceCount) { - kbts_sequence *Sequence = kbts_GetSequence(Subst, SequenceIndex); + kbts__sequence *Sequence = kbts__GetSequence(Subst, SequenceIndex); - if(!kbts_AlreadyVisited(Context, Sequence)) + if(!kbts__AlreadyVisited(Context, Sequence)) { - Sequence->GlyphCount = kbts_ByteSwap16(Sequence->GlyphCount); + Sequence->GlyphCount = kbts__ByteSwap16(Sequence->GlyphCount); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Sequence), Sequence->GlyphCount, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Sequence), Sequence->GlyphCount, Context); } #ifdef KBTS_DUMP KBTS_DUMPF(" ["); - kbts_u16 *SequenceGlyphIds = KBTS_POINTER_AFTER(kbts_u16, Sequence); - KBTS_FOR(SequenceGlyphIndex, 0, Sequence->GlyphCount) + kbts_u16 *SequenceGlyphIds = KBTS__POINTER_AFTER(kbts_u16, Sequence); + KBTS__FOR(SequenceGlyphIndex, 0, Sequence->GlyphCount) { if(SequenceGlyphIndex) KBTS_DUMPF(" "); KBTS_DUMPF("%x", SequenceGlyphIds[SequenceGlyphIndex]); @@ -15695,25 +18460,25 @@ static void kbts_ByteSwapGsubLookupSubtable(kbts_byteswap_context *Context, kbts case 3: { - kbts_alternate_substitution *Subst = (kbts_alternate_substitution *)Base; - Subst->AlternateSetCount = kbts_ByteSwap16(Subst->AlternateSetCount); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Subst), Subst->AlternateSetCount, Context); + kbts__alternate_substitution *Subst = (kbts__alternate_substitution *)Base; + Subst->AlternateSetCount = kbts__ByteSwap16(Subst->AlternateSetCount); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Subst), Subst->AlternateSetCount, Context); - KBTS_FOR(SetIndex, 0, Subst->AlternateSetCount) + KBTS__FOR(SetIndex, 0, Subst->AlternateSetCount) { - kbts_alternate_set *Set = kbts_GetAlternateSet(Subst, SetIndex); + kbts__alternate_set *Set = kbts__GetAlternateSet(Subst, SetIndex); - if(!kbts_AlreadyVisited(Context, Set)) + if(!kbts__AlreadyVisited(Context, Set)) { - Set->GlyphCount = kbts_ByteSwap16(Set->GlyphCount); + Set->GlyphCount = kbts__ByteSwap16(Set->GlyphCount); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Set), Set->GlyphCount, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Set), Set->GlyphCount, Context); } #ifdef KBTS_DUMP KBTS_DUMPF(" ["); - kbts_u16 *SetGlyphIds = KBTS_POINTER_AFTER(kbts_u16, Set); - KBTS_FOR(SetGlyphIndex, 0, Set->GlyphCount) + kbts_u16 *SetGlyphIds = KBTS__POINTER_AFTER(kbts_u16, Set); + KBTS__FOR(SetGlyphIndex, 0, Set->GlyphCount) { if(SetGlyphIndex) KBTS_DUMPF(" "); KBTS_DUMPF("%x", SetGlyphIds[SetGlyphIndex]); @@ -15726,32 +18491,32 @@ static void kbts_ByteSwapGsubLookupSubtable(kbts_byteswap_context *Context, kbts case 4: { - kbts_ligature_substitution *Subst = (kbts_ligature_substitution *)Base; - Subst->LigatureSetCount = kbts_ByteSwap16(Subst->LigatureSetCount); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Subst), Subst->LigatureSetCount, Context); + kbts__ligature_substitution *Subst = (kbts__ligature_substitution *)Base; + Subst->LigatureSetCount = kbts__ByteSwap16(Subst->LigatureSetCount); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Subst), Subst->LigatureSetCount, Context); - KBTS_FOR(SetIndex, 0, Subst->LigatureSetCount) + KBTS__FOR(SetIndex, 0, Subst->LigatureSetCount) { - kbts_ligature_set *Set = kbts_GetLigatureSet(Subst, SetIndex); + kbts__ligature_set *Set = kbts__GetLigatureSet(Subst, SetIndex); - if(!kbts_AlreadyVisited(Context, Set)) + if(!kbts__AlreadyVisited(Context, Set)) { - Set->Count = kbts_ByteSwap16(Set->Count); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Set), Set->Count, Context); + Set->Count = kbts__ByteSwap16(Set->Count); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Set), Set->Count, Context); - KBTS_FOR(LigatureIndex, 0, Set->Count) + KBTS__FOR(LigatureIndex, 0, Set->Count) { - kbts_ligature *Ligature = kbts_GetLigature(Set, LigatureIndex); + kbts__ligature *Ligature = kbts__GetLigature(Set, LigatureIndex); - if(!kbts_AlreadyVisited(Context, Ligature)) + if(!kbts__AlreadyVisited(Context, Ligature)) { - kbts_ByteSwapArray16Context(&Ligature->Glyph, 2, Context); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Ligature), Ligature->ComponentCount - 1, Context); + kbts__ByteSwapArray16Context(&Ligature->Glyph, 2, Context); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Ligature), Ligature->ComponentCount - 1, Context); # ifdef KBTS_DUMP KBTS_DUMPF("ligature: ["); - kbts_u16 *ComponentIds = KBTS_POINTER_AFTER(kbts_u16, Ligature); - KBTS_FOR(ComponentIndex, 1, Ligature->ComponentCount) + kbts_u16 *ComponentIds = KBTS__POINTER_AFTER(kbts_u16, Ligature); + KBTS__FOR(ComponentIndex, 1, Ligature->ComponentCount) { KBTS_DUMPF("%x,", ComponentIds[ComponentIndex - 1]); } @@ -15770,31 +18535,31 @@ static void kbts_ByteSwapGsubLookupSubtable(kbts_byteswap_context *Context, kbts case 5: { - kbts_ByteSwapSequenceContextSubtable(Context, Base); + kbts__ByteSwapSequenceContextSubtable(Context, Base); } break; case 6: { - kbts_ByteSwapChainedSequenceContextSubtable(Context, Base); + kbts__ByteSwapChainedSequenceContextSubtable(Context, Base); } break; case 8: { - kbts_reverse_chain_substitution *Subst = (kbts_reverse_chain_substitution *)Base; - kbts_unpacked_reverse_chain_substitution Unpacked = kbts_UnpackReverseChainSubstitution(Subst, 1); + kbts__reverse_chain_substitution *Subst = (kbts__reverse_chain_substitution *)Base; + kbts__unpacked_reverse_chain_substitution Unpacked = kbts__UnpackReverseChainSubstitution(Subst, 1); kbts_un U16Count = Unpacked.BacktrackCount + Unpacked.GlyphCount + Unpacked.LookaheadCount + 3; - kbts_ByteSwapArray16Context(&Subst->BacktrackGlyphCount, U16Count, Context); + kbts__ByteSwapArray16Context(&Subst->BacktrackGlyphCount, U16Count, Context); - KBTS_FOR(BacktrackCoverageIndex, 0, Unpacked.BacktrackCount) + KBTS__FOR(BacktrackCoverageIndex, 0, Unpacked.BacktrackCount) { - kbts_ByteSwapCoverage(Context, KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.BacktrackCoverageOffsets[BacktrackCoverageIndex])); + kbts__ByteSwapCoverage(Context, KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.BacktrackCoverageOffsets[BacktrackCoverageIndex])); } - KBTS_FOR(LookaheadCoverageIndex, 0, Unpacked.LookaheadCount) + KBTS__FOR(LookaheadCoverageIndex, 0, Unpacked.LookaheadCount) { - kbts_ByteSwapCoverage(Context, KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.LookaheadCoverageOffsets[LookaheadCoverageIndex])); + kbts__ByteSwapCoverage(Context, KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.LookaheadCoverageOffsets[LookaheadCoverageIndex])); } } break; @@ -15802,43 +18567,43 @@ static void kbts_ByteSwapGsubLookupSubtable(kbts_byteswap_context *Context, kbts } } -static void kbts_ByteSwapGposLookupSubtable(kbts_byteswap_context *Context, kbts_lookup_list *LookupList, kbts_u16 LookupType, kbts_u16 *Base) +static void kbts__ByteSwapGposLookupSubtable(kbts__byteswap_context *Context, kbts_lookup_list *LookupList, kbts_u16 LookupType, kbts_u16 *Base) { - if(!kbts_AlreadyVisited(Context, Base)) + if(!kbts__AlreadyVisited(Context, Base)) { - *Base = kbts_ByteSwap16(*Base); + *Base = kbts__ByteSwap16(*Base); KBTS_DUMPF(" GPOS subtable %u.%u\n", LookupType, *Base); - if(kbts_GposLookupBeginsWithCoverage(LookupType, *Base)) + if(kbts__GposLookupBeginsWithCoverage(LookupType, *Base)) { kbts_u16 *CoverageOffset = &Base[1]; - *CoverageOffset = kbts_ByteSwap16(*CoverageOffset); + *CoverageOffset = kbts__ByteSwap16(*CoverageOffset); - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Base, *CoverageOffset); - kbts_ByteSwapCoverage(Context, Coverage); + kbts__coverage *Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Base, *CoverageOffset); + kbts__ByteSwapCoverage(Context, Coverage); } switch(LookupType) { case 1: { - kbts_single_adjustment_1 *Adjust = (kbts_single_adjustment_1 *)Base; - Adjust->ValueFormat = kbts_ByteSwap16(Adjust->ValueFormat); + kbts__single_adjustment_1 *Adjust = (kbts__single_adjustment_1 *)Base; + Adjust->ValueFormat = kbts__ByteSwap16(Adjust->ValueFormat); if(Adjust->Format == 1) { - kbts_ByteSwapValueRecord(Context, Adjust, Adjust->ValueFormat, KBTS_POINTER_AFTER(kbts_u16, Adjust)); + kbts_ByteSwapValueRecord(Context, Adjust, Adjust->ValueFormat, KBTS__POINTER_AFTER(kbts_u16, Adjust)); } else if(Adjust->Format == 2) { - kbts_single_adjustment_2 *Adjust2 = (kbts_single_adjustment_2 *)Base; - Adjust2->RecordCount = kbts_ByteSwap16(Adjust2->RecordCount); + kbts__single_adjustment_2 *Adjust2 = (kbts__single_adjustment_2 *)Base; + Adjust2->RecordCount = kbts__ByteSwap16(Adjust2->RecordCount); - kbts_u16 *At = KBTS_POINTER_AFTER(kbts_u16, Adjust2); - KBTS_FOR(RecordIndex, 0, Adjust2->RecordCount) + kbts_u16 *At = KBTS__POINTER_AFTER(kbts_u16, Adjust2); + KBTS__FOR(RecordIndex, 0, Adjust2->RecordCount) { - kbts_unpacked_value_record Unpacked = kbts_ByteSwapValueRecord(Context, Adjust2, Adjust2->ValueFormat, At); + kbts__unpacked_value_record Unpacked = kbts_ByteSwapValueRecord(Context, Adjust2, Adjust2->ValueFormat, At); At += Unpacked.Size; } @@ -15850,55 +18615,55 @@ static void kbts_ByteSwapGposLookupSubtable(kbts_byteswap_context *Context, kbts { if(*Base == 1) { - kbts_pair_adjustment_1 *Adjust = (kbts_pair_adjustment_1 *)Base; - kbts_ByteSwapArray16Context(&Adjust->ValueFormat1, 3, Context); + kbts__pair_adjustment_1 *Adjust = (kbts__pair_adjustment_1 *)Base; + kbts__ByteSwapArray16Context(&Adjust->ValueFormat1, 3, Context); - kbts_u16 *SetOffsets = KBTS_POINTER_AFTER(kbts_u16, Adjust); - kbts_ByteSwapArray16Context(SetOffsets, Adjust->SetCount, Context); + kbts_u16 *SetOffsets = KBTS__POINTER_AFTER(kbts_u16, Adjust); + kbts__ByteSwapArray16Context(SetOffsets, Adjust->SetCount, Context); - kbts_un Size1 = kbts_PopCount32(Adjust->ValueFormat1); - kbts_un Size2 = kbts_PopCount32(Adjust->ValueFormat2); + kbts_un Size1 = kbts__PopCount32(Adjust->ValueFormat1); + kbts_un Size2 = kbts__PopCount32(Adjust->ValueFormat2); kbts_un PairRecordSize = Size1 + Size2 + 1; - KBTS_FOR(SetIndex, 0, Adjust->SetCount) + KBTS__FOR(SetIndex, 0, Adjust->SetCount) { - kbts_pair_set *Set = KBTS_POINTER_OFFSET(kbts_pair_set, Adjust, SetOffsets[SetIndex]); + kbts__pair_set *Set = KBTS__POINTER_OFFSET(kbts__pair_set, Adjust, SetOffsets[SetIndex]); - if(!kbts_AlreadyVisited(Context, Set)) + if(!kbts__AlreadyVisited(Context, Set)) { - Set->Count = kbts_ByteSwap16(Set->Count); + Set->Count = kbts__ByteSwap16(Set->Count); - kbts_u16 *At = KBTS_POINTER_AFTER(kbts_u16, Set); + kbts_u16 *At = KBTS__POINTER_AFTER(kbts_u16, Set); - KBTS_FOR(RecordIndex, 0, Set->Count) + KBTS__FOR(RecordIndex, 0, Set->Count) { - kbts_pair_value_record *PairRecord = (kbts_pair_value_record *)(At + RecordIndex * PairRecordSize); + kbts__pair_value_record *PairRecord = (kbts__pair_value_record *)(At + RecordIndex * PairRecordSize); - PairRecord->SecondGlyph = kbts_ByteSwap16(PairRecord->SecondGlyph); - kbts_u16 *Record = KBTS_POINTER_AFTER(kbts_u16, PairRecord); + PairRecord->SecondGlyph = kbts__ByteSwap16(PairRecord->SecondGlyph); + kbts_u16 *Record = KBTS__POINTER_AFTER(kbts_u16, PairRecord); - kbts_unpacked_value_record Unpacked1 = kbts_ByteSwapValueRecord(Context, Record, Adjust->ValueFormat1, Record); + kbts__unpacked_value_record Unpacked1 = kbts_ByteSwapValueRecord(Context, Set, Adjust->ValueFormat1, Record); Record += Unpacked1.Size; - kbts_ByteSwapValueRecord(Context, Record, Adjust->ValueFormat2, Record); + kbts_ByteSwapValueRecord(Context, Set, Adjust->ValueFormat2, Record); } } } } else if(*Base == 2) { - kbts_pair_adjustment_2 *Adjust = (kbts_pair_adjustment_2 *)Base; - kbts_ByteSwapArray16Context(&Adjust->ValueFormat1, 6, Context); + kbts__pair_adjustment_2 *Adjust = (kbts__pair_adjustment_2 *)Base; + kbts__ByteSwapArray16Context(&Adjust->ValueFormat1, 6, Context); - kbts_ByteSwapClassDefinition(Context, KBTS_POINTER_OFFSET(kbts_u16, Adjust, Adjust->ClassDefinition1Offset)); - kbts_ByteSwapClassDefinition(Context, KBTS_POINTER_OFFSET(kbts_u16, Adjust, Adjust->ClassDefinition2Offset)); + kbts__ByteSwapClassDefinition(Context, KBTS__POINTER_OFFSET(kbts_u16, Adjust, Adjust->ClassDefinition1Offset)); + kbts__ByteSwapClassDefinition(Context, KBTS__POINTER_OFFSET(kbts_u16, Adjust, Adjust->ClassDefinition2Offset)); - kbts_u16 *Records = KBTS_POINTER_AFTER(kbts_u16, Adjust); + kbts_u16 *Records = KBTS__POINTER_AFTER(kbts_u16, Adjust); - kbts_un Size1 = kbts_PopCount32(Adjust->ValueFormat1); - kbts_un Size2 = kbts_PopCount32(Adjust->ValueFormat2); + kbts_un Size1 = kbts__PopCount32(Adjust->ValueFormat1); + kbts_un Size2 = kbts__PopCount32(Adjust->ValueFormat2); kbts_u16 *RecordPair = Records; - KBTS_FOR(RecordIndex, 0, (kbts_un)Adjust->Class1Count * (kbts_un)Adjust->Class2Count) + KBTS__FOR(RecordIndex, 0, (kbts_un)Adjust->Class1Count * (kbts_un)Adjust->Class2Count) { kbts_ByteSwapValueRecord(Context, Adjust, Adjust->ValueFormat1, RecordPair); RecordPair += Size1; @@ -15912,23 +18677,23 @@ static void kbts_ByteSwapGposLookupSubtable(kbts_byteswap_context *Context, kbts case 3: { - kbts_cursive_attachment *Adjust = (kbts_cursive_attachment *)Base; - Adjust->EntryExitCount = kbts_ByteSwap16(Adjust->EntryExitCount); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, Adjust), Adjust->EntryExitCount * 2, Context); + kbts__cursive_attachment *Adjust = (kbts__cursive_attachment *)Base; + Adjust->EntryExitCount = kbts__ByteSwap16(Adjust->EntryExitCount); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, Adjust), Adjust->EntryExitCount * 2, Context); - kbts_entry_exit *EntryExits = KBTS_POINTER_AFTER(kbts_entry_exit, Adjust); - KBTS_FOR(EntryExitIndex, 0, Adjust->EntryExitCount) + kbts__entry_exit *EntryExits = KBTS__POINTER_AFTER(kbts__entry_exit, Adjust); + KBTS__FOR(EntryExitIndex, 0, Adjust->EntryExitCount) { - kbts_entry_exit *EntryExit = &EntryExits[EntryExitIndex]; + kbts__entry_exit *EntryExit = &EntryExits[EntryExitIndex]; if(EntryExit->EntryAnchorOffset) { - kbts_ByteSwapAnchor(Context, KBTS_POINTER_OFFSET(kbts_anchor, Adjust, EntryExit->EntryAnchorOffset)); + kbts__ByteSwapAnchor(Context, KBTS__POINTER_OFFSET(kbts__anchor, Adjust, EntryExit->EntryAnchorOffset)); } if(EntryExit->ExitAnchorOffset) { - kbts_ByteSwapAnchor(Context, KBTS_POINTER_OFFSET(kbts_anchor, Adjust, EntryExit->ExitAnchorOffset)); + kbts__ByteSwapAnchor(Context, KBTS__POINTER_OFFSET(kbts__anchor, Adjust, EntryExit->ExitAnchorOffset)); } } } @@ -15937,47 +18702,47 @@ static void kbts_ByteSwapGposLookupSubtable(kbts_byteswap_context *Context, kbts case 4: case 6: { - kbts_mark_to_base_attachment *Adjust = (kbts_mark_to_base_attachment *)Base; - kbts_ByteSwapArray16Context(&Adjust->BaseCoverageOffset, 4, Context); + kbts__mark_to_base_attachment *Adjust = (kbts__mark_to_base_attachment *)Base; + kbts__ByteSwapArray16Context(&Adjust->BaseCoverageOffset, 4, Context); - kbts_ByteSwapCoverage(Context, KBTS_POINTER_OFFSET(kbts_coverage, Adjust, Adjust->BaseCoverageOffset)); - kbts_ByteSwapMarkArray(Context, KBTS_POINTER_OFFSET(kbts_mark_array, Adjust, Adjust->MarkArrayOffset)); - kbts_ByteSwapBaseArray(Context, Adjust->MarkClassCount, KBTS_POINTER_OFFSET(kbts_base_array, Adjust, Adjust->BaseArrayOffset)); + kbts__ByteSwapCoverage(Context, KBTS__POINTER_OFFSET(kbts__coverage, Adjust, Adjust->BaseCoverageOffset)); + kbts__ByteSwapMarkArray(Context, KBTS__POINTER_OFFSET(kbts__mark_array, Adjust, Adjust->MarkArrayOffset)); + kbts__ByteSwapBaseArray(Context, Adjust->MarkClassCount, KBTS__POINTER_OFFSET(kbts__base_array, Adjust, Adjust->BaseArrayOffset)); } break; case 5: { - kbts_mark_to_ligature_attachment *Adjust = (kbts_mark_to_ligature_attachment *)Base; - kbts_ByteSwapArray16Context(&Adjust->LigatureCoverageOffset, 4, Context); + kbts__mark_to_ligature_attachment *Adjust = (kbts__mark_to_ligature_attachment *)Base; + kbts__ByteSwapArray16Context(&Adjust->LigatureCoverageOffset, 4, Context); - kbts_ByteSwapCoverage(Context, KBTS_POINTER_OFFSET(kbts_coverage, Adjust, Adjust->LigatureCoverageOffset)); - kbts_ByteSwapMarkArray(Context, KBTS_POINTER_OFFSET(kbts_mark_array, Adjust, Adjust->MarkArrayOffset)); + kbts__ByteSwapCoverage(Context, KBTS__POINTER_OFFSET(kbts__coverage, Adjust, Adjust->LigatureCoverageOffset)); + kbts__ByteSwapMarkArray(Context, KBTS__POINTER_OFFSET(kbts__mark_array, Adjust, Adjust->MarkArrayOffset)); - kbts_ligature_array *LigatureArray = KBTS_POINTER_OFFSET(kbts_ligature_array, Adjust, Adjust->LigatureArrayOffset); - if(!kbts_AlreadyVisited(Context, LigatureArray)) + kbts__ligature_array *LigatureArray = KBTS__POINTER_OFFSET(kbts__ligature_array, Adjust, Adjust->LigatureArrayOffset); + if(!kbts__AlreadyVisited(Context, LigatureArray)) { - LigatureArray->Count = kbts_ByteSwap16(LigatureArray->Count); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, LigatureArray), LigatureArray->Count, Context); + LigatureArray->Count = kbts__ByteSwap16(LigatureArray->Count); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, LigatureArray), LigatureArray->Count, Context); - KBTS_FOR(AttachIndex, 0, LigatureArray->Count) + KBTS__FOR(AttachIndex, 0, LigatureArray->Count) { - kbts_ligature_attach *Attach = kbts_GetLigatureAttach(LigatureArray, AttachIndex); + kbts__ligature_attach *Attach = kbts__GetLigatureAttach(LigatureArray, AttachIndex); - if(!kbts_AlreadyVisited(Context, Attach)) + if(!kbts__AlreadyVisited(Context, Attach)) { - Attach->Count = kbts_ByteSwap16(Attach->Count); + Attach->Count = kbts__ByteSwap16(Attach->Count); - kbts_u16 *AttachAnchorOffsets = KBTS_POINTER_AFTER(kbts_u16, Attach); - kbts_ByteSwapArray16Context(AttachAnchorOffsets, Attach->Count * Adjust->MarkClassCount, Context); + kbts_u16 *AttachAnchorOffsets = KBTS__POINTER_AFTER(kbts_u16, Attach); + kbts__ByteSwapArray16Context(AttachAnchorOffsets, Attach->Count * Adjust->MarkClassCount, Context); - KBTS_FOR(ComponentIndex, 0, Attach->Count) + KBTS__FOR(ComponentIndex, 0, Attach->Count) { - KBTS_FOR(MarkClass, 0, Adjust->MarkClassCount) + KBTS__FOR(MarkClass, 0, Adjust->MarkClassCount) { - kbts_anchor *Anchor = kbts_GetLigatureAttachAnchor(Adjust, Attach, (kbts_u16)MarkClass, ComponentIndex); + kbts__anchor *Anchor = kbts__GetLigatureAttachAnchor(Adjust, Attach, (kbts_u16)MarkClass, ComponentIndex); - kbts_ByteSwapAnchor(Context, Anchor); + kbts__ByteSwapAnchor(Context, Anchor); } } } @@ -15988,101 +18753,85 @@ static void kbts_ByteSwapGposLookupSubtable(kbts_byteswap_context *Context, kbts case 7: { - kbts_ByteSwapSequenceContextSubtable(Context, Base); + kbts__ByteSwapSequenceContextSubtable(Context, Base); } break; case 8: { - kbts_ByteSwapChainedSequenceContextSubtable(Context, Base); + kbts__ByteSwapChainedSequenceContextSubtable(Context, Base); } break; case 9: { // @Cleanup: Replace recursion with a loop at the start of this function! - kbts_extension *Adjust = (kbts_extension *)Base; + kbts__extension *Adjust = (kbts__extension *)Base; - Adjust->LookupType = kbts_ByteSwap16(Adjust->LookupType); - Adjust->Offset = kbts_ByteSwap32(Adjust->Offset); + Adjust->LookupType = kbts__ByteSwap16(Adjust->LookupType); + Adjust->Offset = kbts__ByteSwap32(Adjust->Offset); - kbts_ByteSwapGposLookupSubtable(Context, LookupList, Adjust->LookupType, KBTS_POINTER_OFFSET(kbts_u16, Adjust, Adjust->Offset)); + kbts__ByteSwapGposLookupSubtable(Context, LookupList, Adjust->LookupType, KBTS__POINTER_OFFSET(kbts_u16, Adjust, Adjust->Offset)); } break; } } } -static kbts_glyph_classes kbts_GlyphClasses(kbts_font *Font, kbts_u32 Id) +static void *kbts__BlobTableData(kbts_blob_header *Header, kbts_blob_table_id TableId) { - kbts_glyph_classes Result = KBTS_ZERO; + void *Result = 0; + kbts_blob_table *Table = &Header->Tables[TableId]; + + if(Table->Length) + { + Result = KBTS__POINTER_OFFSET(void, Header, Table->OffsetFromStartOfFile); + } + + return Result; +} +#define kbts__BlobTableDataType(Header, TableId, Type) (Type *)kbts__BlobTableData((Header), (TableId)) + +static kbts_glyph_classes kbts__GlyphClasses(kbts_font *Font, kbts_u32 Id) +{ + kbts_glyph_classes Result = KBTS__ZERO; // Look up all glyph classes. - kbts_gdef *Gdef = Font->Gdef; + kbts__gdef *Gdef = kbts__BlobTableDataType(Font->Blob, KBTS_BLOB_TABLE_ID_GDEF, kbts__gdef); if(Gdef) { if(Gdef->ClassDefinitionOffset) { - kbts_u16 *ClassDefBase = KBTS_POINTER_OFFSET(kbts_u16, Gdef, Gdef->ClassDefinitionOffset); - Result.Class = kbts_GlyphClassFromTable(ClassDefBase, Id).Class; + kbts_u16 *ClassDefBase = KBTS__POINTER_OFFSET(kbts_u16, Gdef, Gdef->ClassDefinitionOffset); + Result.Class = kbts__GlyphClassFromTable(ClassDefBase, Id).Class; } - if(Gdef->MarkAttachmentClassDefinitionOffset && (Result.Class == KBTS_GLYPH_CLASS_MARK)) + if(Gdef->MarkAttachmentClassDefinitionOffset && (Result.Class == KBTS__GLYPH_CLASS_MARK)) { - kbts_u16 *MarkAttachmentClassDefBase = KBTS_POINTER_OFFSET(kbts_u16, Gdef, Gdef->MarkAttachmentClassDefinitionOffset); - Result.MarkAttachmentClass = kbts_GlyphClassFromTable(MarkAttachmentClassDefBase, Id).Class; + kbts_u16 *MarkAttachmentClassDefBase = KBTS__POINTER_OFFSET(kbts_u16, Gdef, Gdef->MarkAttachmentClassDefinitionOffset); + Result.MarkAttachmentClass = kbts__GlyphClassFromTable(MarkAttachmentClassDefBase, Id).Class; } } return Result; } -static int kbts_ScriptIsWeak(kbts_script Script) +static int kbts__ScriptIsWeak(kbts_script Script) { int Result = (Script == KBTS_SCRIPT_DONT_KNOW) || (Script == KBTS_SCRIPT_DEFAULT) || (Script == KBTS_SCRIPT_DEFAULT2); return Result; } -static int kbts_ShaperRtl(kbts_shaper Shaper) +static int kbts__ShaperRtl(kbts_shaper Shaper) { int Result = (Shaper == KBTS_SHAPER_ARABIC) || (Shaper == KBTS_SHAPER_HEBREW); return Result; } -// Easy shorthand for determining scripts in simple cases. -// Do not ship this! You should use script breaks instead. -KBTS_EXPORT void kbts_InferScript(kbts_direction *Direction, kbts_script *Script, kbts_script GlyphScript) +KBTS_EXPORT int kbts_CodepointToGlyphId(kbts_font *Font, int ICodepoint) { - if(Script) - { - if(kbts_ScriptIsWeak(*Script) && !kbts_ScriptIsWeak(GlyphScript)) - { - *Script = GlyphScript; - if(Direction && (!*Direction)) - { - kbts_script_properties *Properties = &kbts_ScriptProperties[GlyphScript]; - *Direction = kbts_ShaperRtl(Properties->Shaper) ? KBTS_DIRECTION_RTL : KBTS_DIRECTION_LTR; - } - } - } -} - -KBTS_EXPORT kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, kbts_u32 Codepoint) -{ - kbts_glyph Result = KBTS_ZERO; - Result.Codepoint = Codepoint; - - // Look up Unicode properties. - Result.Decomposition = kbts_GetUnicodeDecomposition(Codepoint); - Result.JoiningType = kbts_GetUnicodeJoiningType(Codepoint); - Result.UnicodeFlags = kbts_GetUnicodeFlags(Codepoint); - kbts_u16 SyllabicInfo = kbts_GetUnicodeSyllabicInfo(Codepoint); - Result.SyllabicClass = kbts_GetSyllabicClass(SyllabicInfo); - Result.SyllabicPosition = kbts_GetSyllabicPosition(SyllabicInfo); - Result.CombiningClass = kbts_GetUnicodeCombiningClass(Codepoint); - Result.UseClass = kbts_GetUnicodeUseClass(Codepoint); - Result.Script = kbts_GetUnicodeScript(Codepoint); - Result.ParentInfo = kbts_GetUnicodeParentInfo(Codepoint); + int Result = 0; + kbts_u32 Codepoint = (kbts_u32)ICodepoint; kbts_u16 *CmapBase = Font->Cmap; if(CmapBase) @@ -16091,18 +18840,18 @@ KBTS_EXPORT kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, kbts_u32 Codepoint { case 0: { - kbts_cmap_0 *Cmap0 = (kbts_cmap_0 *)CmapBase; + kbts__cmap_0 *Cmap0 = (kbts__cmap_0 *)CmapBase; - if((kbts_un)Codepoint < KBTS_ARRAY_LENGTH(Cmap0->GlyphIdArray)) + if((kbts_un)Codepoint < KBTS__ARRAY_LENGTH(Cmap0->GlyphIdArray)) { - Result.Id = Cmap0->GlyphIdArray[Codepoint]; + Result = Cmap0->GlyphIdArray[Codepoint]; } } break; case 2: { - kbts_cmap_2 *Cmap2 = (kbts_cmap_2 *)CmapBase; - kbts_sub_header *SubHeaders = KBTS_POINTER_AFTER(kbts_sub_header, Cmap2); + kbts__cmap_2 *Cmap2 = (kbts__cmap_2 *)CmapBase; + kbts__sub_header *SubHeaders = KBTS__POINTER_AFTER(kbts__sub_header, Cmap2); kbts_u32 High = (Codepoint >> 8) & 0xFF; @@ -16114,7 +18863,7 @@ KBTS_EXPORT kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, kbts_u32 Codepoint // The Microsoft documentation doesn't mention that the SubHeaderKeys are indices multiplied by 8, for some // reason..! The Apple documentation does. kbts_u16 SubHeaderIndex = Cmap2->SubHeaderKeys[High] / 8; - kbts_sub_header *SubHeader = &SubHeaders[SubHeaderIndex]; + kbts__sub_header *SubHeader = &SubHeaders[SubHeaderIndex]; if(!SubHeaderIndex) { @@ -16129,22 +18878,22 @@ KBTS_EXPORT kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, kbts_u32 Codepoint kbts_u32 Offset = Codepoint - SubHeader->FirstCode; if(Offset < SubHeader->EntryCount) { - kbts_u16 *GlyphIds = KBTS_POINTER_OFFSET(kbts_u16, &SubHeader->IdRangeOffset, SubHeader->IdRangeOffset); + kbts_u16 *GlyphIds = KBTS__POINTER_OFFSET(kbts_u16, &SubHeader->IdRangeOffset, SubHeader->IdRangeOffset); kbts_u16 GlyphId = GlyphIds[Offset]; if(GlyphId) { GlyphId += SubHeader->IdDelta; } - Result.Id = GlyphId; + Result = GlyphId; } } break; case 4: { - kbts_cmap_4 *Cmap4 = (kbts_cmap_4 *)CmapBase; + kbts__cmap_4 *Cmap4 = (kbts__cmap_4 *)CmapBase; kbts_un SegmentCount = Cmap4->SegmentCountTimesTwo / 2; - kbts_u16 *EndCodes = KBTS_POINTER_AFTER(kbts_u16, Cmap4); + kbts_u16 *EndCodes = KBTS__POINTER_AFTER(kbts_u16, Cmap4); kbts_u16 *StartCodes = EndCodes + SegmentCount + 1; kbts_s16 *IdDeltas = (kbts_s16 *)(StartCodes + SegmentCount); kbts_u16 *IdRangeOffsets = (kbts_u16 *)(IdDeltas + SegmentCount); @@ -16175,26 +18924,26 @@ KBTS_EXPORT kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, kbts_u32 Codepoint { GlyphId += (kbts_u16)(Codepoint); } - Result.Id = GlyphId; + Result = GlyphId; } } break; case 6: { - kbts_cmap_6 *Cmap6 = (kbts_cmap_6 *)CmapBase; - kbts_u16 *GlyphIds = KBTS_POINTER_AFTER(kbts_u16, Cmap6); + kbts__cmap_6 *Cmap6 = (kbts__cmap_6 *)CmapBase; + kbts_u16 *GlyphIds = KBTS__POINTER_AFTER(kbts_u16, Cmap6); kbts_un Offset = Codepoint - Cmap6->FirstCode; if(Offset < Cmap6->EntryCount) { - Result.Id = GlyphIds[Offset]; + Result = GlyphIds[Offset]; } } break; case 12: { - kbts_cmap_12_13 *Cmap12 = (kbts_cmap_12_13 *)CmapBase; - kbts_sequential_map_group *Groups = KBTS_POINTER_AFTER(kbts_sequential_map_group, Cmap12); + kbts__cmap_12_13 *Cmap12 = (kbts__cmap_12_13 *)CmapBase; + kbts__sequential_map_group *Groups = KBTS__POINTER_AFTER(kbts__sequential_map_group, Cmap12); kbts_un GlyphId = 0; kbts_un GroupCount = Cmap12->GroupCount; @@ -16214,62 +18963,89 @@ KBTS_EXPORT kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, kbts_u32 Codepoint GlyphId = Groups->StartGlyphId + Offset; } - Result.Id = (kbts_u16)GlyphId; + Result = (int)GlyphId; } break; } } - if(Font->Gdef) - { - Result.Classes = kbts_GlyphClasses(Font, Result.Id); - } - else - { - // @Cleanup: This is garbage compatibility-with-broken-fonts code. I would very much like to get rid of it. - if((Result.UnicodeFlags & KBTS_UNICODE_FLAG_DEFAULT_IGNORABLE) || !(Result.UnicodeFlags & KBTS_UNICODE_FLAG_NON_SPACING_MARK)) - { - Result.Classes.Class = KBTS_GLYPH_CLASS_BASE; - } - else - { - Result.Classes.Class = KBTS_GLYPH_CLASS_MARK; - } - } - return Result; } -typedef struct kbts_iterate_features +KBTS_EXPORT kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, int ICodepoint, kbts_glyph_config *Config, int UserId) { - kbts_gsub_gpos *Header; - kbts_feature_list *FeatureList; - // @Incomplete - // kbts_feature_variations *FeatureVariations; - kbts_langsys *Langsys; + kbts_u32 Codepoint = (kbts_u32)ICodepoint; - kbts_feature_set EnabledFeatures; + kbts_glyph Result = KBTS__ZERO; + Result.Codepoint = Codepoint; + Result.Config = Config; + Result.UserIdOrCodepointIndex = UserId; + + // Look up Unicode properties. + Result.Decomposition = kbts__GetUnicodeDecomposition(Codepoint); + Result.JoiningType = kbts__GetUnicodeJoiningType(Codepoint); + Result.UnicodeFlags = kbts__GetUnicodeFlags(Codepoint); + kbts_u16 SyllabicInfo = kbts__GetUnicodeSyllabicInfo(Codepoint); + Result.SyllabicClass = kbts__GetSyllabicClass(SyllabicInfo); + Result.SyllabicPosition = kbts__GetSyllabicPosition(SyllabicInfo); + Result.CombiningClass = kbts__GetUnicodeCombiningClass(Codepoint); + Result.UseClass = kbts__GetUnicodeUseClass(Codepoint); + Result.ParentInfo = kbts__GetUnicodeParentInfo(Codepoint); + + Result.Id = (kbts_u16)kbts_CodepointToGlyphId(Font, ICodepoint); + + if(Font->Blob->Tables[KBTS_BLOB_TABLE_ID_GDEF].Length) + { + Result.Classes = kbts__GlyphClasses(Font, Result.Id); + } + else + { + // @Cleanup: This is garbage compatibility-with-broken-fonts code. I would very much like to get rid of it. + if((Result.UnicodeFlags & KBTS_UNICODE_FLAG_DEFAULT_IGNORABLE) || !(Result.UnicodeFlags & KBTS_UNICODE_FLAG_NON_SPACING_MARK)) + { + Result.Classes.Class = KBTS__GLYPH_CLASS_BASE; + } + else + { + Result.Classes.Class = KBTS__GLYPH_CLASS_MARK; + } + } + + return Result; +} + +typedef struct kbts__iterate_features +{ + kbts__gsub_gpos *Header; + kbts__feature_list *FeatureList; + // @Incomplete + // kbts__feature_variations *FeatureVariations; + kbts__langsys *Langsys; + + kbts__feature_set EnabledFeatures; kbts_u32 CurrentFeatureTag; kbts_u32 CurrentFeatureFlag; kbts_u32 FeatureIndex; - kbts_feature *Feature; -} kbts_iterate_features; + kbts__feature *Feature; +} kbts__iterate_features; -static kbts_iterate_features kbts_IterateFeatures(kbts_shape_config *Config, kbts_shaping_table ShapingTable, kbts_feature_set EnabledFeatures) +static kbts__iterate_features kbts__IterateFeatures(kbts_shape_config *Config, kbts_shaping_table ShapingTable, kbts__feature_set EnabledFeatures) { - kbts_iterate_features Result = KBTS_ZERO; + kbts__iterate_features Result = KBTS__ZERO; - kbts_gsub_gpos *Header = Config->Font->ShapingTables[ShapingTable]; + kbts_blob_table_id TableId = (ShapingTable == KBTS_SHAPING_TABLE_GSUB) ? KBTS_BLOB_TABLE_ID_GSUB : KBTS_BLOB_TABLE_ID_GPOS; + + kbts__gsub_gpos *Header = kbts__BlobTableDataType(Config->Font->Blob, TableId, kbts__gsub_gpos); if(Header) { // @Incomplete // if(Header->Minor == 1) // { - // Result.FeatureVariations = KBTS_POINTER_OFFSET(kbts_feature_variations, Header, Header->FeatureVariationsOffset); + // Result.FeatureVariations = KBTS__POINTER_OFFSET(kbts__feature_variations, Header, Header->FeatureVariationsOffset); // } - Result.FeatureList = KBTS_POINTER_OFFSET(kbts_feature_list, Header, Header->FeatureListOffset); + Result.FeatureList = KBTS__POINTER_OFFSET(kbts__feature_list, Header, Header->FeatureListOffset); Result.Header = Header; Result.Langsys = Config->Langsys[ShapingTable]; Result.EnabledFeatures = EnabledFeatures; @@ -16278,37 +19054,37 @@ static kbts_iterate_features kbts_IterateFeatures(kbts_shape_config *Config, kbt return Result; } -static kbts_u32 kbts_IsValidFeatureIteration(kbts_iterate_features *It) +static int kbts__IsValidFeatureIteration(kbts__iterate_features *It) { - kbts_u32 Result = It->Langsys != 0; + int Result = It->Langsys != 0; return Result; } -static kbts_u32 kbts_NextFeature(kbts_iterate_features *It) +static int kbts__NextFeature(kbts__iterate_features *It) { - kbts_u32 Result = 0; + int Result = 0; It->Feature = 0; - if(kbts_IsValidFeatureIteration(It)) + if(kbts__IsValidFeatureIteration(It)) { - kbts_u16 *FeatureIndices = KBTS_POINTER_AFTER(kbts_u16, It->Langsys); + kbts_u16 *FeatureIndices = KBTS__POINTER_AFTER(kbts_u16, It->Langsys); // @Incomplete - // kbts_feature_variations *FeatureVariations = It->FeatureVariations; + // kbts__feature_variations *FeatureVariations = It->FeatureVariations; while(It->FeatureIndex < It->Langsys->FeatureIndexCount) { - kbts_feature_pointer Feature = kbts_GetFeature(It->FeatureList, FeatureIndices[It->FeatureIndex]); + kbts__feature_pointer Feature = kbts__GetFeature(It->FeatureList, FeatureIndices[It->FeatureIndex]); // We might need to swap out this feature with another. // Check for variations. // @Incomplete //if(FeatureVariations) //{ - // KBTS_FOR(VariationIndex, 0, FeatureVariations->RecordCount) + // KBTS__FOR(VariationIndex, 0, FeatureVariations->RecordCount) // { - // kbts_feature_variation_pointer Variation = kbts_GetFeatureVariation(FeatureVariations, VariationIndex); - // KBTS_FOR(ConditionIndex, 0, Variation.ConditionSet->Count) + // kbts__feature_variation_pointer Variation = kbts__GetFeatureVariation(FeatureVariations, VariationIndex); + // KBTS__FOR(ConditionIndex, 0, Variation.ConditionSet->Count) // { - // kbts_condition_1 *Condition = kbts_GetCondition(Variation.ConditionSet, ConditionIndex); + // kbts__condition_1 *Condition = kbts__GetCondition(Variation.ConditionSet, ConditionIndex); // KBTS_ASSERT(0); // } // } @@ -16316,14 +19092,14 @@ static kbts_u32 kbts_NextFeature(kbts_iterate_features *It) It->FeatureIndex += 1; - kbts_u32 FeatureId = kbts_FeatureTagToId(Feature.Tag); - if(kbts_ContainsFeature(&It->EnabledFeatures, FeatureId)) + kbts_u32 FeatureId = kbts__FeatureTagToId(Feature.Tag); + if(kbts__ContainsFeature(&It->EnabledFeatures, FeatureId)) { It->Feature = Feature.Feature; It->CurrentFeatureTag = Feature.Tag; if(FeatureId && (FeatureId <= 32)) { - It->CurrentFeatureFlag = (1 << (FeatureId - 1)) & KBTS_GLYPH_FEATURE_MASK; + It->CurrentFeatureFlag = (1 << (FeatureId - 1)) & KBTS__GLYPH_FEATURE_MASK; } Result = 1; @@ -16335,37 +19111,37 @@ static kbts_u32 kbts_NextFeature(kbts_iterate_features *It) return Result; } -typedef struct kbts_iterate_lookups +typedef struct kbts__iterate_lookups { kbts_lookup_list *LookupList; - kbts_feature *Feature; + kbts__feature *Feature; - kbts_lookup *Lookup; + kbts__lookup *Lookup; kbts_u16 LookupIndex; kbts_u32 LookupIndexIndex; -} kbts_iterate_lookups; +} kbts__iterate_lookups; -static kbts_iterate_lookups kbts_IterateLookups(kbts_lookup_list *List, kbts_feature *Feature) +static kbts__iterate_lookups kbts__IterateLookups(kbts_lookup_list *List, kbts__feature *Feature) { - kbts_iterate_lookups Result = KBTS_ZERO; + kbts__iterate_lookups Result = KBTS__ZERO; Result.LookupList = List; Result.Feature = Feature; return Result; } -static kbts_u32 kbts_NextLookup(kbts_iterate_lookups *It) +static int kbts__NextLookup(kbts__iterate_lookups *It) { - kbts_u32 Result = 0; - kbts_feature *Feature = It->Feature; + int Result = 0; + kbts__feature *Feature = It->Feature; if(It->LookupList && Feature && (It->LookupIndexIndex < Feature->LookupIndexCount)) { - kbts_u16 *LookupIndices = KBTS_POINTER_AFTER(kbts_u16, Feature); + kbts_u16 *LookupIndices = KBTS__POINTER_AFTER(kbts_u16, Feature); It->LookupIndex = LookupIndices[It->LookupIndexIndex]; - It->Lookup = kbts_GetLookup(It->LookupList, It->LookupIndex); + It->Lookup = kbts__GetLookup(It->LookupList, It->LookupIndex); Result = 1; It->LookupIndexIndex += 1; @@ -16374,522 +19150,581 @@ static kbts_u32 kbts_NextLookup(kbts_iterate_lookups *It) return Result; } -KBTS_INLINE void kbts_GsubMutate(kbts_font *Font, kbts_glyph *Glyph, kbts_u16 NewId, kbts_u32 Flags) +KBTS_INLINE void kbts__GsubMutate(kbts_font *Font, kbts_glyph *Glyph, kbts_u16 NewId, kbts_u32 Flags) { Glyph->Id = NewId; - Glyph->Classes = kbts_GlyphClasses(Font, NewId); + Glyph->Classes = kbts__GlyphClasses(Font, NewId); Glyph->Flags = (Glyph->Flags & ~KBTS_GLYPH_FLAG_FIRST_IN_MULTIPLE_SUBSTITUTION) | Flags; } -typedef struct kbts_do_single_substitution_result +static kbts__op_list *kbts__ShaperOpLists[KBTS_SHAPER_COUNT] = { + /* DEFAULT, */ &kbts__OpList_Default, + /* ARABIC, */ &kbts__OpList_ArabicRclt, + /* HANGUL, */ &kbts__OpList_Hangul, + /* HEBREW, */ &kbts__OpList_Default, + /* INDIC, */ &kbts__OpList_Indic, + /* KHMER, */ &kbts__OpList_Khmer, + /* MYANMAR, */ &kbts__OpList_Myanmar, + /* TIBETAN, */ &kbts__OpList_Tibetan, + /* USE, */ &kbts__OpList_Use, +}; + +typedef struct kbts__gsub_frame { - kbts_u32 ConsumedGlyphCount; - kbts_u32 WrittenGlyphCount; - kbts_u32 PerformedSubstitution; -} kbts_do_single_substitution_result; + kbts_glyph *InputGlyph; -static kbts_feature_set kbts_ShaperFeatures[] = { - /* KBTS_SHAPER_DEFAULT */ {{KBTS_FEATURE_FLAG0(abvm) | KBTS_FEATURE_FLAG0(blwm) | KBTS_FEATURE_FLAG0(curs) | - KBTS_FEATURE_FLAG0(frac) | KBTS_FEATURE_FLAG0(numr) | KBTS_FEATURE_FLAG0(dnom) | KBTS_FEATURE_FLAG0(ccmp) | - KBTS_FEATURE_FLAG0(clig) | KBTS_FEATURE_FLAG0(calt), - 0, - KBTS_FEATURE_FLAG2(locl) | KBTS_FEATURE_FLAG2(ltra) | KBTS_FEATURE_FLAG2(ltrm) | KBTS_FEATURE_FLAG2(liga) | - KBTS_FEATURE_FLAG2(rlig) | KBTS_FEATURE_FLAG2(rclt) | KBTS_FEATURE_FLAG2(dist) | KBTS_FEATURE_FLAG2(kern) | - KBTS_FEATURE_FLAG2(mark) | KBTS_FEATURE_FLAG2(mkmk), - KBTS_FEATURE_FLAG3(rvrn)}}, - /* KBTS_SHAPER_ARABIC */ {{KBTS_FEATURE_FLAG0(frac) | KBTS_FEATURE_FLAG0(numr) | KBTS_FEATURE_FLAG0(dnom) | KBTS_FEATURE_FLAG0(ccmp) | - KBTS_FEATURE_FLAG0(isol) | KBTS_FEATURE_FLAG0(fina) | KBTS_FEATURE_FLAG0(fin2) | KBTS_FEATURE_FLAG0(fin3) | - KBTS_FEATURE_FLAG0(medi) | KBTS_FEATURE_FLAG0(med2) | KBTS_FEATURE_FLAG0(init) | KBTS_FEATURE_FLAG0(calt) | - KBTS_FEATURE_FLAG0(clig) | KBTS_FEATURE_FLAG2(mset) | KBTS_FEATURE_FLAG0(abvm) | KBTS_FEATURE_FLAG0(blwm) | - KBTS_FEATURE_FLAG0(curs), - 0, - KBTS_FEATURE_FLAG2(rlig) | KBTS_FEATURE_FLAG2(liga) | KBTS_FEATURE_FLAG2(rclt) | KBTS_FEATURE_FLAG2(mark) | - KBTS_FEATURE_FLAG2(mkmk) | KBTS_FEATURE_FLAG2(dist) | KBTS_FEATURE_FLAG2(kern) | KBTS_FEATURE_FLAG2(locl), - KBTS_FEATURE_FLAG3(rvrn) | KBTS_FEATURE_FLAG3(rtlm) | KBTS_FEATURE_FLAG3(stch) | KBTS_FEATURE_FLAG3(rtla)}}, - /* KBTS_SHAPER_HANGUL */ {{KBTS_FEATURE_FLAG0(frac) | KBTS_FEATURE_FLAG0(numr) | KBTS_FEATURE_FLAG0(dnom) | KBTS_FEATURE_FLAG0(ljmo) | - KBTS_FEATURE_FLAG0(vjmo) | KBTS_FEATURE_FLAG0(tjmo) | KBTS_FEATURE_FLAG0(abvm) | KBTS_FEATURE_FLAG0(blwm) | - KBTS_FEATURE_FLAG0(ccmp) | KBTS_FEATURE_FLAG0(clig) | KBTS_FEATURE_FLAG0(curs), - 0, - KBTS_FEATURE_FLAG2(ltra) | KBTS_FEATURE_FLAG2(ltrm) | KBTS_FEATURE_FLAG2(dist) | KBTS_FEATURE_FLAG2(kern) | - KBTS_FEATURE_FLAG2(rclt) | KBTS_FEATURE_FLAG2(locl) | KBTS_FEATURE_FLAG2(mark) | KBTS_FEATURE_FLAG2(mkmk) | - KBTS_FEATURE_FLAG2(rlig) | KBTS_FEATURE_FLAG2(liga), - KBTS_FEATURE_FLAG3(rvrn)}}, - /* KBTS_SHAPER_HEBREW */ {{KBTS_FEATURE_FLAG0(abvm) | KBTS_FEATURE_FLAG0(blwm) | KBTS_FEATURE_FLAG0(curs) | - KBTS_FEATURE_FLAG0(frac) | KBTS_FEATURE_FLAG0(numr) | KBTS_FEATURE_FLAG0(dnom) | KBTS_FEATURE_FLAG0(ccmp) | - KBTS_FEATURE_FLAG0(clig) | KBTS_FEATURE_FLAG0(calt), - 0, - KBTS_FEATURE_FLAG2(locl) | KBTS_FEATURE_FLAG2(ltra) | KBTS_FEATURE_FLAG2(ltrm) | KBTS_FEATURE_FLAG2(liga) | - KBTS_FEATURE_FLAG2(rlig) | KBTS_FEATURE_FLAG2(rclt) | KBTS_FEATURE_FLAG2(dist) | KBTS_FEATURE_FLAG2(kern) | - KBTS_FEATURE_FLAG2(mark) | KBTS_FEATURE_FLAG2(mkmk), - KBTS_FEATURE_FLAG3(rvrn)}}, // (Same as DEFAULT) - /* KBTS_SHAPER_INDIC */ {{KBTS_FEATURE_FLAG0(frac) | KBTS_FEATURE_FLAG0(numr) | KBTS_FEATURE_FLAG0(dnom) | KBTS_FEATURE_FLAG0(akhn) | - KBTS_FEATURE_FLAG0(rphf) | KBTS_FEATURE_FLAG0(pref) | KBTS_FEATURE_FLAG0(blwf) | KBTS_FEATURE_FLAG0(abvf) | - KBTS_FEATURE_FLAG0(half) | KBTS_FEATURE_FLAG0(pstf) | KBTS_FEATURE_FLAG0(cjct) | KBTS_FEATURE_FLAG0(abvs) | - KBTS_FEATURE_FLAG0(blws) | KBTS_FEATURE_FLAG0(init) | KBTS_FEATURE_FLAG0(calt) | KBTS_FEATURE_FLAG0(clig) | - KBTS_FEATURE_FLAG0(abvm) | KBTS_FEATURE_FLAG0(blwm) | KBTS_FEATURE_FLAG0(curs), - 0, - KBTS_FEATURE_FLAG2(ltra) | KBTS_FEATURE_FLAG2(ltrm) | KBTS_FEATURE_FLAG2(nukt) | KBTS_FEATURE_FLAG2(rkrf) | - KBTS_FEATURE_FLAG2(pres) | KBTS_FEATURE_FLAG2(psts) | KBTS_FEATURE_FLAG2(locl) | KBTS_FEATURE_FLAG2(rlig) | - KBTS_FEATURE_FLAG2(dist) | KBTS_FEATURE_FLAG2(haln) | KBTS_FEATURE_FLAG2(rclt) | KBTS_FEATURE_FLAG2(mark) | - KBTS_FEATURE_FLAG2(mkmk) | KBTS_FEATURE_FLAG2(kern), - KBTS_FEATURE_FLAG3(rvrn) | KBTS_FEATURE_FLAG3(vatu),}}, - /* KBTS_SHAPER_KHMER */ {{KBTS_FEATURE_FLAG0(frac) | KBTS_FEATURE_FLAG0(numr) | KBTS_FEATURE_FLAG0(dnom) | KBTS_FEATURE_FLAG0(ccmp) | - KBTS_FEATURE_FLAG0(pref) | KBTS_FEATURE_FLAG0(blwf) | KBTS_FEATURE_FLAG0(abvf) | KBTS_FEATURE_FLAG0(pstf) | - KBTS_FEATURE_FLAG0(cfar) | KBTS_FEATURE_FLAG0(abvs) | KBTS_FEATURE_FLAG0(blws) | KBTS_FEATURE_FLAG0(calt) | - KBTS_FEATURE_FLAG0(clig) | KBTS_FEATURE_FLAG0(abvm) | KBTS_FEATURE_FLAG0(blwm) | KBTS_FEATURE_FLAG0(curs), - 0, - KBTS_FEATURE_FLAG2(dist) | KBTS_FEATURE_FLAG2(kern) | KBTS_FEATURE_FLAG2(mark) | KBTS_FEATURE_FLAG2(mkmk) | - KBTS_FEATURE_FLAG2(pres) | KBTS_FEATURE_FLAG2(ltra) | KBTS_FEATURE_FLAG2(ltrm) | KBTS_FEATURE_FLAG2(locl) | - KBTS_FEATURE_FLAG2(psts) | KBTS_FEATURE_FLAG2(rclt) | KBTS_FEATURE_FLAG2(rlig), - KBTS_FEATURE_FLAG3(rvrn)}}, - /* KBTS_SHAPER_MYANMAR */ {{KBTS_FEATURE_FLAG0(rphf) | KBTS_FEATURE_FLAG0(pref) | KBTS_FEATURE_FLAG0(blwf) | KBTS_FEATURE_FLAG0(pstf) | - KBTS_FEATURE_FLAG0(frac) | KBTS_FEATURE_FLAG0(numr) | KBTS_FEATURE_FLAG0(dnom) | KBTS_FEATURE_FLAG0(ccmp) | - KBTS_FEATURE_FLAG0(abvs) | KBTS_FEATURE_FLAG0(blws) | KBTS_FEATURE_FLAG0(calt) | KBTS_FEATURE_FLAG0(clig) | - KBTS_FEATURE_FLAG0(abvm) | KBTS_FEATURE_FLAG0(blwm) | KBTS_FEATURE_FLAG0(curs), - 0, - KBTS_FEATURE_FLAG2(mark) | KBTS_FEATURE_FLAG2(mkmk) | KBTS_FEATURE_FLAG2(ltra) | KBTS_FEATURE_FLAG2(ltrm) | - KBTS_FEATURE_FLAG2(locl) | KBTS_FEATURE_FLAG2(psts) | KBTS_FEATURE_FLAG2(rlig) | KBTS_FEATURE_FLAG2(pres) | - KBTS_FEATURE_FLAG2(liga) | KBTS_FEATURE_FLAG2(rclt) | KBTS_FEATURE_FLAG2(dist) | KBTS_FEATURE_FLAG2(kern), - KBTS_FEATURE_FLAG3(rvrn)}}, - /* KBTS_SHAPER_TIBETAN */ {{KBTS_FEATURE_FLAG0(ccmp) | KBTS_FEATURE_FLAG0(abvs) | KBTS_FEATURE_FLAG0(blws) | KBTS_FEATURE_FLAG0(calt) | - KBTS_FEATURE_FLAG0(abvm) | KBTS_FEATURE_FLAG0(blwm), - 0, - KBTS_FEATURE_FLAG2(locl) | KBTS_FEATURE_FLAG2(liga) | KBTS_FEATURE_FLAG2(kern) | KBTS_FEATURE_FLAG2(mkmk), - 0}}, - /* KBTS_SHAPER_USE */ {{KBTS_FEATURE_FLAG0(frac) | KBTS_FEATURE_FLAG0(numr) | KBTS_FEATURE_FLAG0(dnom) | KBTS_FEATURE_FLAG0(ccmp) | - KBTS_FEATURE_FLAG0(akhn) | KBTS_FEATURE_FLAG0(rphf) | KBTS_FEATURE_FLAG0(pref) | KBTS_FEATURE_FLAG0(abvf) | - KBTS_FEATURE_FLAG0(blwf) | KBTS_FEATURE_FLAG0(cjct) | KBTS_FEATURE_FLAG0(half) | KBTS_FEATURE_FLAG0(pstf) | - KBTS_FEATURE_FLAG0(fina) | KBTS_FEATURE_FLAG0(init) | KBTS_FEATURE_FLAG0(isol) | KBTS_FEATURE_FLAG0(medi) | - KBTS_FEATURE_FLAG0(abvs) | KBTS_FEATURE_FLAG0(blws) | KBTS_FEATURE_FLAG0(calt) | KBTS_FEATURE_FLAG0(clig) | - KBTS_FEATURE_FLAG0(abvm) | KBTS_FEATURE_FLAG0(blwm) | KBTS_FEATURE_FLAG0(curs), - 0, - KBTS_FEATURE_FLAG2(ltra) | KBTS_FEATURE_FLAG2(ltrm) | KBTS_FEATURE_FLAG2(locl) | KBTS_FEATURE_FLAG2(nukt) | - KBTS_FEATURE_FLAG2(rkrf) | KBTS_FEATURE_FLAG2(rlig) | KBTS_FEATURE_FLAG2(dist) | KBTS_FEATURE_FLAG2(kern) | - KBTS_FEATURE_FLAG2(mark) | KBTS_FEATURE_FLAG2(mkmk) | KBTS_FEATURE_FLAG2(haln) | KBTS_FEATURE_FLAG2(liga) | - KBTS_FEATURE_FLAG2(rclt) | KBTS_FEATURE_FLAG2(pres) | KBTS_FEATURE_FLAG2(psts), - KBTS_FEATURE_FLAG3(rvrn) | KBTS_FEATURE_FLAG3(vatu)}}, -}; + // This isn't really an index into anything, per se. + // It is just an offset that allows reordering for ShapeState->LookupOnePastLastGlyph. + kbts_u32 StartIndex; -// Make sure that these fit KBTS_MAX_SIMULTANEOUS_FEATURES! -static kbts_u8 kbts_Ops_Default[] = { - KBTS_OP_KIND_NORMALIZE, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rvrn, - KBTS_OP_KIND_GSUB_FEATURES_WITH_USER, 12, KBTS_FEATURE_ID_frac, KBTS_FEATURE_ID_numr, KBTS_FEATURE_ID_dnom, KBTS_FEATURE_ID_ltra, KBTS_FEATURE_ID_ltrm, - KBTS_FEATURE_ID_liga, KBTS_FEATURE_ID_ccmp, KBTS_FEATURE_ID_locl, KBTS_FEATURE_ID_rlig, KBTS_FEATURE_ID_clig, - KBTS_FEATURE_ID_calt, KBTS_FEATURE_ID_rclt, - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, 7, KBTS_FEATURE_ID_abvm, KBTS_FEATURE_ID_blwm, KBTS_FEATURE_ID_mark, KBTS_FEATURE_ID_mkmk, KBTS_FEATURE_ID_curs, - KBTS_FEATURE_ID_dist, KBTS_FEATURE_ID_kern, - KBTS_OP_KIND_POST_GPOS_FIXUP, -}; - -/* @Incomplete: Vertical text. -static kbts_u8 kbts_Ops_DefaultTtbBtt[] = { - KBTS_OP_KIND_NORMALIZE, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rvrn, - KBTS_OP_KIND_GSUB_FEATURES, 3, KBTS_FEATURE_ID_frac, KBTS_FEATURE_ID_numr, KBTS_FEATURE_ID_dnom, - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, 10, KBTS_FEATURE_ID_abvm, KBTS_FEATURE_ID_blwm, KBTS_FEATURE_ID_ccmp, KBTS_FEATURE_ID_locl, KBTS_FEATURE_ID_mark, - KBTS_FEATURE_ID_mkmk, KBTS_FEATURE_ID_rlig, KBTS_FEATURE_ID_calt, KBTS_FEATURE_ID_liga, KBTS_FEATURE_ID_vert, - KBTS_OP_KIND_POST_GPOS_FIXUP, -}; -*/ -static kbts_u8 kbts_Ops_Hangul[] = { - KBTS_OP_KIND_NORMALIZE, KBTS_OP_KIND_NORMALIZE_HANGUL, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rvrn, - KBTS_OP_KIND_GSUB_FEATURES_WITH_USER, 8, KBTS_FEATURE_ID_frac, KBTS_FEATURE_ID_numr, KBTS_FEATURE_ID_dnom, KBTS_FEATURE_ID_ltra, KBTS_FEATURE_ID_ltrm, - KBTS_FEATURE_ID_ljmo, KBTS_FEATURE_ID_vjmo, KBTS_FEATURE_ID_tjmo, - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, 13, KBTS_FEATURE_ID_abvm, KBTS_FEATURE_ID_blwm, KBTS_FEATURE_ID_ccmp, KBTS_FEATURE_ID_locl, KBTS_FEATURE_ID_mark, - KBTS_FEATURE_ID_mkmk, KBTS_FEATURE_ID_rlig, KBTS_FEATURE_ID_liga, KBTS_FEATURE_ID_clig, KBTS_FEATURE_ID_curs, - KBTS_FEATURE_ID_dist, KBTS_FEATURE_ID_kern, KBTS_FEATURE_ID_rclt, - KBTS_OP_KIND_POST_GPOS_FIXUP, -}; -static kbts_u8 kbts_Ops_ArabicRclt[] = { - KBTS_OP_KIND_NORMALIZE, KBTS_OP_KIND_FLAG_JOINING_LETTERS, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rvrn, - KBTS_OP_KIND_GSUB_FEATURES_WITH_USER, 5, KBTS_FEATURE_ID_frac, KBTS_FEATURE_ID_numr, KBTS_FEATURE_ID_dnom, KBTS_FEATURE_ID_rtla, KBTS_FEATURE_ID_rtlm, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_stch, - KBTS_OP_KIND_GSUB_FEATURES, 2, KBTS_FEATURE_ID_ccmp, KBTS_FEATURE_ID_locl, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_isol, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_fina, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_fin2, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_fin3, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_medi, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_med2, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_init, - // @Incomplete: In Arabic rlig, ZWJ should not be skipped in lookups (i.e. it should block ligatures). - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rlig, - // @Incomplete: In non-Arabic scripts, e.g. Syriac, Harfbuzz does not pause here. - KBTS_OP_KIND_GSUB_FEATURES, 5, KBTS_FEATURE_ID_calt, KBTS_FEATURE_ID_liga, KBTS_FEATURE_ID_clig, KBTS_FEATURE_ID_mset, KBTS_FEATURE_ID_rclt, - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, 7, KBTS_FEATURE_ID_abvm, KBTS_FEATURE_ID_blwm, KBTS_FEATURE_ID_mark, KBTS_FEATURE_ID_mkmk, KBTS_FEATURE_ID_curs, - KBTS_FEATURE_ID_dist, KBTS_FEATURE_ID_kern, - KBTS_OP_KIND_STCH_POSTPASS, - KBTS_OP_KIND_POST_GPOS_FIXUP, -}; -static kbts_u8 kbts_Ops_ArabicNoRclt[] = { - KBTS_OP_KIND_NORMALIZE, KBTS_OP_KIND_FLAG_JOINING_LETTERS, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rvrn, - KBTS_OP_KIND_GSUB_FEATURES_WITH_USER, 5, KBTS_FEATURE_ID_frac, KBTS_FEATURE_ID_numr, KBTS_FEATURE_ID_dnom, KBTS_FEATURE_ID_rtla, KBTS_FEATURE_ID_rtlm, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_stch, - KBTS_OP_KIND_GSUB_FEATURES, 2, KBTS_FEATURE_ID_ccmp, KBTS_FEATURE_ID_locl, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_isol, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_fina, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_fin2, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_fin3, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_medi, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_med2, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_init, - // @Incomplete: In Arabic rlig, ZWJ should not be skipped in lookups (i.e. it should block ligatures). - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rlig, - // @Incomplete: In non-Arabic scripts, e.g. Syriac, Harfbuzz does not pause here. - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_calt, - // When the font does not contain rclt, Uniscribe puts calt in its own pass, and so we pause here. - KBTS_OP_KIND_GSUB_FEATURES, 4, KBTS_FEATURE_ID_liga, KBTS_FEATURE_ID_clig, KBTS_FEATURE_ID_mset, KBTS_FEATURE_ID_rclt, - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, 7, KBTS_FEATURE_ID_abvm, KBTS_FEATURE_ID_blwm, KBTS_FEATURE_ID_mark, KBTS_FEATURE_ID_mkmk, KBTS_FEATURE_ID_curs, - KBTS_FEATURE_ID_dist, KBTS_FEATURE_ID_kern, - KBTS_OP_KIND_STCH_POSTPASS, - KBTS_OP_KIND_POST_GPOS_FIXUP, -}; -static kbts_u8 kbts_Ops_Indic0[] = { - KBTS_OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES, KBTS_OP_KIND_NORMALIZE, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rvrn, - KBTS_OP_KIND_GSUB_FEATURES_WITH_USER, 5, KBTS_FEATURE_ID_frac, KBTS_FEATURE_ID_numr, KBTS_FEATURE_ID_dnom, KBTS_FEATURE_ID_ltra, KBTS_FEATURE_ID_ltrm, -}; -// After BeginCluster. -static kbts_u8 kbts_Ops_Indic1[] = { - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_nukt, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_akhn, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rphf, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rkrf, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_pref, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_blwf, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_abvf, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_half, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_pstf, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_vatu, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_cjct, -}; -// After EndCluster. -static kbts_u8 kbts_Ops_Indic2[] = { - KBTS_OP_KIND_GSUB_FEATURES, 6, KBTS_FEATURE_ID_abvs, KBTS_FEATURE_ID_blws, KBTS_FEATURE_ID_haln, KBTS_FEATURE_ID_init, KBTS_FEATURE_ID_pres, - KBTS_FEATURE_ID_psts, -}; -// After syllable processing. -static kbts_u8 kbts_Ops_Indic3[] = { - KBTS_OP_KIND_GSUB_FEATURES, 5, KBTS_FEATURE_ID_locl, KBTS_FEATURE_ID_rlig, KBTS_FEATURE_ID_calt, KBTS_FEATURE_ID_clig, KBTS_FEATURE_ID_rclt, - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, 7, KBTS_FEATURE_ID_abvm, KBTS_FEATURE_ID_blwm, KBTS_FEATURE_ID_mark, KBTS_FEATURE_ID_mkmk, KBTS_FEATURE_ID_curs, - KBTS_FEATURE_ID_dist, KBTS_FEATURE_ID_kern, - KBTS_OP_KIND_POST_GPOS_FIXUP, -}; -static kbts_u8 kbts_Ops_Use0[] = { - KBTS_OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES, KBTS_OP_KIND_NORMALIZE, KBTS_OP_KIND_FLAG_JOINING_LETTERS, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rvrn, - KBTS_OP_KIND_GSUB_FEATURES_WITH_USER, 5, KBTS_FEATURE_ID_frac, KBTS_FEATURE_ID_numr, KBTS_FEATURE_ID_dnom, KBTS_FEATURE_ID_ltra, KBTS_FEATURE_ID_ltrm, -}; -static kbts_u8 kbts_Ops_Use1[] = { - KBTS_OP_KIND_GSUB_FEATURES, 4, KBTS_FEATURE_ID_locl, KBTS_FEATURE_ID_ccmp, KBTS_FEATURE_ID_nukt, KBTS_FEATURE_ID_akhn, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rphf, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_pref, - KBTS_OP_KIND_GSUB_FEATURES, 7, KBTS_FEATURE_ID_abvf, KBTS_FEATURE_ID_blwf, KBTS_FEATURE_ID_cjct, KBTS_FEATURE_ID_half, KBTS_FEATURE_ID_pstf, - KBTS_FEATURE_ID_rkrf, KBTS_FEATURE_ID_vatu, -}; -// There is no kbts_Ops_Use2, because there are no features that apply per syllable after reordering. -static kbts_u8 kbts_Ops_Use3[] = { - KBTS_OP_KIND_GSUB_FEATURES, 4, KBTS_FEATURE_ID_fina, KBTS_FEATURE_ID_init, KBTS_FEATURE_ID_isol, KBTS_FEATURE_ID_medi, - KBTS_OP_KIND_GSUB_FEATURES,10, KBTS_FEATURE_ID_abvs, KBTS_FEATURE_ID_blws, KBTS_FEATURE_ID_haln, KBTS_FEATURE_ID_pres, KBTS_FEATURE_ID_psts, - KBTS_FEATURE_ID_calt, KBTS_FEATURE_ID_clig, KBTS_FEATURE_ID_liga, KBTS_FEATURE_ID_rclt, KBTS_FEATURE_ID_rlig, - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, 7, KBTS_FEATURE_ID_abvm, KBTS_FEATURE_ID_blwm, KBTS_FEATURE_ID_curs, KBTS_FEATURE_ID_dist, KBTS_FEATURE_ID_kern, - KBTS_FEATURE_ID_mark, KBTS_FEATURE_ID_mkmk, - KBTS_OP_KIND_POST_GPOS_FIXUP, -}; -static kbts_u8 kbts_Ops_Tibetan[] = { - KBTS_OP_KIND_GSUB_FEATURES_WITH_USER, 1, KBTS_FEATURE_ID_locl, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_ccmp, - KBTS_OP_KIND_GSUB_FEATURES, 4, KBTS_FEATURE_ID_abvs, KBTS_FEATURE_ID_blws, KBTS_FEATURE_ID_calt, KBTS_FEATURE_ID_liga, - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, 4, KBTS_FEATURE_ID_abvm, KBTS_FEATURE_ID_blwm, KBTS_FEATURE_ID_kern, KBTS_FEATURE_ID_mkmk, - KBTS_OP_KIND_POST_GPOS_FIXUP, -}; -static kbts_u8 kbts_Ops_Khmer0[] = { - KBTS_OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES, KBTS_OP_KIND_NORMALIZE, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rvrn, - KBTS_OP_KIND_GSUB_FEATURES_WITH_USER, 5, KBTS_FEATURE_ID_frac, KBTS_FEATURE_ID_numr, KBTS_FEATURE_ID_dnom, KBTS_FEATURE_ID_ltra, KBTS_FEATURE_ID_ltrm, -}; -static kbts_u8 kbts_Ops_Khmer1[] = { - KBTS_OP_KIND_GSUB_FEATURES, 7, KBTS_FEATURE_ID_locl, KBTS_FEATURE_ID_ccmp, KBTS_FEATURE_ID_pref, KBTS_FEATURE_ID_blwf, KBTS_FEATURE_ID_abvf, - KBTS_FEATURE_ID_pstf, KBTS_FEATURE_ID_cfar, -}; -static kbts_u8 kbts_Ops_Khmer3[] = { - KBTS_OP_KIND_GSUB_FEATURES, 8, KBTS_FEATURE_ID_pres, KBTS_FEATURE_ID_abvs, KBTS_FEATURE_ID_blws, KBTS_FEATURE_ID_psts, KBTS_FEATURE_ID_calt, - KBTS_FEATURE_ID_rclt, KBTS_FEATURE_ID_rlig, KBTS_FEATURE_ID_clig, - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, 7, KBTS_FEATURE_ID_abvm, KBTS_FEATURE_ID_blwm, KBTS_FEATURE_ID_curs, KBTS_FEATURE_ID_dist, KBTS_FEATURE_ID_kern, - KBTS_FEATURE_ID_mark, KBTS_FEATURE_ID_mkmk, - KBTS_OP_KIND_POST_GPOS_FIXUP, -}; -#define kbts_Ops_Myanmar0 kbts_Ops_Khmer0 -static kbts_u8 kbts_Ops_Myanmar1[] = { - KBTS_OP_KIND_GSUB_FEATURES, 2, KBTS_FEATURE_ID_locl, KBTS_FEATURE_ID_ccmp, -}; -static kbts_u8 kbts_Ops_Myanmar2[] = { - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_rphf, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_pref, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_blwf, - KBTS_OP_KIND_GSUB_FEATURES, 1, KBTS_FEATURE_ID_pstf, -}; -static kbts_u8 kbts_Ops_Myanmar3[] = { - KBTS_OP_KIND_GSUB_FEATURES, 9, KBTS_FEATURE_ID_pres, KBTS_FEATURE_ID_abvs, KBTS_FEATURE_ID_blws, KBTS_FEATURE_ID_psts, KBTS_FEATURE_ID_rlig, - KBTS_FEATURE_ID_calt, KBTS_FEATURE_ID_clig, KBTS_FEATURE_ID_liga, KBTS_FEATURE_ID_rclt, - KBTS_OP_KIND_GPOS_METRICS, - KBTS_OP_KIND_GPOS_FEATURES, 7, KBTS_FEATURE_ID_abvm, KBTS_FEATURE_ID_blwm, KBTS_FEATURE_ID_curs, KBTS_FEATURE_ID_dist, KBTS_FEATURE_ID_kern, - KBTS_FEATURE_ID_mark, KBTS_FEATURE_ID_mkmk, - KBTS_OP_KIND_POST_GPOS_FIXUP, -}; - -static kbts_op_list kbts_ShaperOpLists[KBTS_SHAPER_COUNT] = { - /* DEFAULT, */ {kbts_Ops_Default, KBTS_ARRAY_LENGTH(kbts_Ops_Default)}, - /* ARABIC, */ {kbts_Ops_ArabicRclt, KBTS_ARRAY_LENGTH(kbts_Ops_ArabicRclt)}, - /* HANGUL, */ {kbts_Ops_Hangul, KBTS_ARRAY_LENGTH(kbts_Ops_Hangul)}, - /* HEBREW, */ {kbts_Ops_Default, KBTS_ARRAY_LENGTH(kbts_Ops_Default)}, - /* INDIC, */ {kbts_Ops_Indic0, KBTS_ARRAY_LENGTH(kbts_Ops_Indic0)}, - /* KHMER, */ {kbts_Ops_Khmer0, KBTS_ARRAY_LENGTH(kbts_Ops_Khmer0)}, - /* MYANMAR, */ {kbts_Ops_Myanmar0, KBTS_ARRAY_LENGTH(kbts_Ops_Myanmar0)}, - /* TIBETAN, */ {kbts_Ops_Tibetan, KBTS_ARRAY_LENGTH(kbts_Ops_Tibetan)}, - /* USE, */ {kbts_Ops_Use0, KBTS_ARRAY_LENGTH(kbts_Ops_Use0)}, -}; - -typedef struct kbts_gsub_frame -{ kbts_u16 LookupIndex; kbts_u16 SubtableIndex; - kbts_u16 InputGlyphIndex; - kbts_u16 InputGlyphCount; - // Defined for nested lookups. - kbts_sequence_lookup_record *Records; + kbts__sequence_lookup_record *Records; kbts_u16 RecordCount; kbts_u16 RecordIndex; -} kbts_gsub_frame; +} kbts__gsub_frame; -KBTS_EXPORT kbts_un kbts_SizeOfShapeState(kbts_font *Font) +#define KBTS__DLLIST_REMOVE(Node) do {(Node)->Prev->Next = (Node)->Next; (Node)->Next->Prev = (Node)->Prev;} while(0) +#define KBTS__DLLIST_INSERT_BEFORE(A, B) do{(A)->Next = (B); (A)->Prev = (B)->Prev; (A)->Prev->Next = (A)->Next->Prev = (A);} while(0) +#define KBTS__DLLIST_INSERT_AFTER(A, B) do{(A)->Prev = (B); (A)->Next = (B)->Next; (A)->Prev->Next = (A)->Next->Prev = (A);} while(0) +#define KBTS__DLLIST_SENTINEL_INIT(Sentinel) do{(Sentinel)->Prev = (Sentinel)->Next = (Sentinel);} while(0) +#define KBTS__DLLIST_SORT(First, OnePastLast, Member) \ + do \ + { \ + kbts_glyph *DllistSort_OneBeforeFirst = (First)->Prev; \ + kbts_glyph *DllistSort_OnePastLast = (OnePastLast); \ + for(int DllistSort_Swapped = 1; \ + DllistSort_Swapped; \ + ) \ + { \ + DllistSort_Swapped = 0; \ + kbts_glyph *DllistSort_Glyph0 = DllistSort_OneBeforeFirst->Next; \ + kbts_glyph *DllistSort_Glyph1 = DllistSort_Glyph0->Next; \ + while(DllistSort_Glyph1 != DllistSort_OnePastLast) \ + { \ + kbts_glyph *DllistSort_Next = DllistSort_Glyph1->Next; \ + \ + if(DllistSort_Glyph0->Member > DllistSort_Glyph1->Member) \ + { \ + KBTS__DLLIST_SWAP(DllistSort_Glyph0, DllistSort_Glyph1); \ + DllistSort_Swapped = 1; \ + } \ + else \ + { \ + DllistSort_Glyph0 = DllistSort_Glyph1; \ + } \ + \ + DllistSort_Glyph1 = DllistSort_Next; \ + } \ + } \ + } while(0) + +#define KBTS__FOR_GLYPH(Storage, GlyphName) \ + for(kbts_glyph *GlyphName = (Storage)->GlyphSentinel.Next; \ + GlyphName != (kbts_glyph *)&(Storage)->GlyphSentinel; \ + GlyphName = GlyphName->Next) + +static void KBTS__DLLIST_SWAP(kbts_glyph *A, kbts_glyph *B) { - kbts_un GsubMemorySize = Font->LookupInfo.MaximumLookupStackSize * sizeof(kbts_gsub_frame); - kbts_un NormalizationMemorySize = KBTS_MAXIMUM_DECOMPOSITION_CODEPOINTS * sizeof(kbts_glyph); - kbts_un LeftoverMemorySize = KBTS_MAX(GsubMemorySize, NormalizationMemorySize); + kbts_glyph *APrev = A->Prev; + kbts_glyph *ANext = A->Next; + kbts_glyph *BPrev = B->Prev; + kbts_glyph *BNext = B->Next; - kbts_un Result = sizeof(kbts_shape_state) + LeftoverMemorySize; - return Result; + A->Prev = (BPrev == A) ? B : BPrev; + A->Next = (BNext == A) ? B : BNext; + B->Prev = (APrev == B) ? A : APrev; + B->Next = (ANext == B) ? A : ANext; + + A->Prev->Next = A->Next->Prev = A; + B->Prev->Next = B->Next->Prev = B; } -KBTS_EXPORT kbts_shape_state *kbts_PlaceShapeState(void *Address, kbts_un Size) +static void kbts__NullAllocator(void *Data, kbts_allocator_op *Op) { - kbts_shape_state *State = (kbts_shape_state *)Address; - KBTS_MEMSET(State, 0, Size); - - return State; + KBTS__UNUSED(Data); + KBTS__UNUSED(Op); } -#ifndef KB_TEXT_SHAPE_NO_CRT -KBTS_EXPORT kbts_shape_state *kbts_CreateShapeState(kbts_font *Font) +static void kbts__DefaultAllocator(void *Data, kbts_allocator_op *Op) { - kbts_un Size = kbts_SizeOfShapeState(Font); - void *Memory = malloc(Size); - kbts_shape_state *Result = kbts_PlaceShapeState(Memory, Size); + KBTS__UNUSED(Data); - return Result; -} - -KBTS_EXPORT void kbts_FreeShapeState(kbts_shape_state *State) -{ - if(State) + switch(Op->Kind) { - free(State); - } -} -#endif - -KBTS_EXPORT void kbts_ResetShapeState(kbts_shape_state *State) -{ - State->ResumePoint = 0; -} - -static kbts_glyph_array kbts_ClipGlyphArray(kbts_glyph_array *Source, kbts_un Count) -{ - kbts_glyph_array Result = KBTS_ZERO; - Result.Glyphs = Source->Glyphs; - Result.Count = (kbts_u32)Count; - Result.TotalCount = (kbts_u32)Count; - Result.Capacity = (kbts_u32)Count; - return Result; -} - -static void kbts_TransferGrowRequest(kbts_glyph_array *From, kbts_glyph_array *To) -{ - if(From->RequiredCapacity > From->Capacity) + case KBTS_ALLOCATOR_OP_KIND_ALLOCATE: { - To->RequiredCapacity = To->Capacity + From->RequiredCapacity - From->Capacity; + Op->Allocate.Pointer = KBTS_MALLOC(Data, Op->Allocate.Size); + } break; + + case KBTS_ALLOCATOR_OP_KIND_FREE: + { + KBTS_FREE(Data, Op->Free.Pointer); + } break; } } -static kbts_glyph_array kbts_GlyphSubArray(kbts_glyph_array *Source, kbts_un FromIndex) +static void *kbts__AllocatorAllocate(kbts_allocator_function *Allocator, void *AllocatorData, kbts_un Size) { - kbts_glyph_array Result = KBTS_ZERO; - Result.Glyphs = Source->Glyphs + FromIndex; - Result.Count = (kbts_u32)(Source->Count - FromIndex); - Result.TotalCount = (kbts_u32)(Source->TotalCount - FromIndex); - Result.Capacity = (kbts_u32)(Source->Capacity - FromIndex); - return Result; -} + kbts_allocator_op AllocatorOp = KBTS__ZERO; + AllocatorOp.Kind = KBTS_ALLOCATOR_OP_KIND_ALLOCATE; + AllocatorOp.Allocate.Size = (kbts_u32)Size; -static kbts_glyph_array kbts_GlyphArray(kbts_glyph *Glyphs, kbts_un Count, kbts_un TotalCount, kbts_un Capacity) -{ - kbts_glyph_array Result = KBTS_ZERO; - Result.Glyphs = Glyphs; - Result.Count = (kbts_u32)Count; - Result.TotalCount = (kbts_u32)TotalCount; - Result.Capacity = (kbts_u32)Capacity; - return Result; -} - -static int kbts_GrowGlyphArray(kbts_u32 *ResumePoint_, kbts_glyph_array *Array, kbts_un InsertIndex, kbts_un GrowCount, kbts_u32 ResumePoint, int DoNotModifyGlyphCounts) -{ - int Result = 0; - kbts_un TotalCount = Array->TotalCount; - kbts_un NewTotalCount = TotalCount + GrowCount; - - if(NewTotalCount <= Array->Capacity) + if(!Allocator) { - if(NewTotalCount > TotalCount) + Allocator = kbts__DefaultAllocator; + } + + Allocator(AllocatorData, &AllocatorOp); + + void *Result = AllocatorOp.Allocate.Pointer; + return Result; +} +#define kbts__AllocatorAllocateType(Allocator, AllocatorData, Type) (Type *)kbts_AllocatorAllocate((Allocator), (AllocatorData), sizeof(Type)) +#define kbts__AllocatorAllocateArray(Allocator, AllocatorData, Type, Count) (Type *)kbts_AllocatorAllocate((Allocator), (AllocatorData), sizeof(Type) * (Count)) + +static void kbts__AllocatorFree(kbts_allocator_function *Allocator, void *AllocatorData, void *Pointer) +{ + if(Pointer) + { + kbts_allocator_op AllocatorOp = KBTS__ZERO; + AllocatorOp.Kind = KBTS_ALLOCATOR_OP_KIND_FREE; + AllocatorOp.Free.Pointer = Pointer; + + if(!Allocator) { - for(kbts_un ToIndex = NewTotalCount; ToIndex > InsertIndex + GrowCount; --ToIndex) + Allocator = kbts__DefaultAllocator; + } + + Allocator(AllocatorData, &AllocatorOp); + } +} + +static void kbts__EnsureArenaInitialized(kbts_arena *Arena) +{ + if(!Arena->BlockSentinel.Next) + { + KBTS__DLLIST_SENTINEL_INIT(&Arena->BlockSentinel); + KBTS__DLLIST_SENTINEL_INIT(&Arena->FreeBlockSentinel); + + if(!Arena->Allocator) + { + Arena->Allocator = kbts__DefaultAllocator; + } + } +} + +#define KBTS_ARENA_MIN_BLOCK_SIZE 4096 +static kbts__arena_block *kbts__ArenaPushBlock(kbts_arena *Arena, kbts_un Size, kbts_un Align) +{ + kbts__arena_block *Result = (kbts__arena_block *)&Arena->BlockSentinel; + + if(!Arena->Error) + { + kbts_un BlockSize = sizeof(kbts__arena_block) + Size + KBTS_ALIGNOF(kbts__arena_block) + Align - 1; + if(BlockSize < KBTS_ARENA_MIN_BLOCK_SIZE) + { + BlockSize = KBTS_ARENA_MIN_BLOCK_SIZE; + } + + Result = (kbts__arena_block *)Arena->FreeBlockSentinel.Prev; + if((Result == (kbts__arena_block *)&Arena->FreeBlockSentinel) || + ((Result->Size + sizeof(kbts__arena_block)) < BlockSize)) + { + void *Base = kbts__AllocatorAllocate(Arena->Allocator, Arena->AllocatorData, BlockSize); + + if(Base) { - Array->Glyphs[ToIndex - 1] = Array->Glyphs[ToIndex - 1 - GrowCount]; + Result = KBTS__ALIGN_POINTER(kbts__arena_block, Base, KBTS_ALIGNOF(kbts__arena_block)); + KBTS_MEMSET(Result, 0, sizeof(*Result)); + Result->BaseAllocation = Base; + Result->Size = (kbts_un)(KBTS__POINTER_OFFSET(char, Base, BlockSize) - KBTS__POINTER_AFTER(char, Result)); + } + else + { + Result = (kbts__arena_block *)&Arena->BlockSentinel; + Arena->Error = 1; } } - else if(NewTotalCount < TotalCount) + else { - // Multiple substitutions that generate 0 glyphs exist. In that case, GrowCount will be negative. - KBTS_FOR(ToIndex, InsertIndex, NewTotalCount) + KBTS__DLLIST_REMOVE(&Result->Header); + } + + KBTS__DLLIST_INSERT_BEFORE(&Result->Header, &Arena->BlockSentinel); + + Result->Used = 0; + } + + return Result; +} + +static int kbts__ArenaBlockIsValid(kbts_arena *Arena, kbts__arena_block *Block) +{ + int Result = Block && (&Block->Header != &Arena->BlockSentinel); + return Result; +} + +static void kbts__ClearArena(kbts_arena *Arena) +{ + kbts__EnsureArenaInitialized(Arena); + + kbts_arena_block_header *First = Arena->BlockSentinel.Next; + kbts_arena_block_header *Last = Arena->BlockSentinel.Prev; + + if(kbts__ArenaBlockIsValid(Arena, (kbts__arena_block *)First)) + { + First->Prev = Arena->FreeBlockSentinel.Prev; + Last->Next = &Arena->FreeBlockSentinel; + + First->Prev->Next = First; + Last->Next->Prev = Last; + + KBTS__DLLIST_SENTINEL_INIT(&Arena->BlockSentinel); + } +} + +static void *kbts__PushSize(kbts_arena *Arena, kbts_un Size, kbts_un Align) +{ + kbts__EnsureArenaInitialized(Arena); + void *Result = 0; + + if(!Arena->Error) + { + kbts__arena_block *Block = (kbts__arena_block *)Arena->BlockSentinel.Prev; + char *BlockMemory = KBTS__POINTER_AFTER(char, Block); + + if(kbts__ArenaBlockIsValid(Arena, Block)) + { + char *Top = BlockMemory + Block->Used; + char *TopAligned = KBTS__ALIGN_POINTER(char, Top, Align); + + if((kbts_un)((TopAligned + Size) - BlockMemory) <= Block->Size) { - Array->Glyphs[ToIndex] = Array->Glyphs[ToIndex - GrowCount]; + Result = TopAligned; } } - if(!DoNotModifyGlyphCounts) + if(!Result) { - Array->Count += GrowCount; - Array->TotalCount = (kbts_u32)NewTotalCount; + Block = kbts__ArenaPushBlock(Arena, Size, Align); + + if(kbts__ArenaBlockIsValid(Arena, Block)) + { + BlockMemory = KBTS__POINTER_AFTER(char, Block); + char *Top = BlockMemory + Block->Used; + char *TopAligned = KBTS__ALIGN_POINTER(char, Top, Align); + + Result = TopAligned; + } } - Result = 1; + + if(Result) + { + Block->Used = (kbts_un)((char *)Result + Size - BlockMemory); + KBTS_ASSERT(Block->Used <= Block->Size); + } + } + + return Result; +} +#define kbts__PushType(Arena, Type) (Type *)kbts__PushSize((Arena), sizeof(Type), KBTS_ALIGNOF(Type)) +#define kbts__PushArray(Arena, Type, Count) (Type *)kbts__PushSize((Arena), sizeof(Type) * (Count), KBTS_ALIGNOF(Type)) + +static kbts__arena_lifetime kbts__BeginLifetime(kbts_arena *Arena) +{ + kbts__arena_block *Block = (kbts__arena_block *)Arena->BlockSentinel.Prev; + kbts_un Used = 0; + + if(!Block) + { + Block = (kbts__arena_block *)&Arena->BlockSentinel; + } + + if(kbts__ArenaBlockIsValid(Arena, Block)) + { + Used = Block->Used; + } + + kbts__arena_lifetime Result = KBTS__ZERO; + Result.Arena = Arena; + Result.BlockHeader = &Block->Header; + Result.Used = Used; + return Result; +} + +static void kbts__EndLifetime(kbts__arena_lifetime *Lifetime) +{ + kbts_arena *Arena = Lifetime->Arena; + if(Arena && !Arena->Error) + { + kbts__arena_block *Block = (kbts__arena_block *)Lifetime->BlockHeader; + + if(kbts__ArenaBlockIsValid(Lifetime->Arena, Block)) + { + Block->Used = Lifetime->Used; + } + + // This works even if Block is the sentinel. + for(kbts_arena_block_header *Header = Block->Header.Next; + kbts__ArenaBlockIsValid(Arena, (kbts__arena_block *)Header); + ) + { + kbts_arena_block_header *Next = Header->Next; + + KBTS__DLLIST_REMOVE(Header); + KBTS__DLLIST_INSERT_BEFORE(Header, &Arena->FreeBlockSentinel); + + Header = Next; + } + } +} + +static void kbts__MoveArena(kbts_arena *To, kbts_arena *From) +{ + *To = *From; + + if(To->BlockSentinel.Next != &From->BlockSentinel) + { + To->BlockSentinel.Next->Prev = To->BlockSentinel.Prev->Next = &To->BlockSentinel; } else { - Array->RequiredCapacity = (kbts_u32)(NewTotalCount + KBTS_GROW_BUFFER_MARGIN); - if(ResumePoint_) *ResumePoint_ = ResumePoint; + KBTS__DLLIST_SENTINEL_INIT(&To->BlockSentinel); + } + + if(To->FreeBlockSentinel.Next != &From->FreeBlockSentinel) + { + To->FreeBlockSentinel.Next->Prev = To->FreeBlockSentinel.Prev->Next = &To->FreeBlockSentinel; + } + else + { + KBTS__DLLIST_SENTINEL_INIT(&To->FreeBlockSentinel); + } +} + +static void kbts__FreeArena(kbts_arena *Arena) +{ + kbts__EnsureArenaInitialized(Arena); + + kbts_arena StackArena; + kbts__MoveArena(&StackArena, Arena); + + kbts_arena_block_header *Sentinels[2] = {&StackArena.BlockSentinel, &StackArena.FreeBlockSentinel}; + + KBTS__FOR(SentinelIndex, 0, KBTS__ARRAY_LENGTH(Sentinels)) + { + kbts_arena_block_header *Sentinel = Sentinels[SentinelIndex]; + + for(kbts_arena_block_header *Header = Sentinel->Next; + Header != Sentinel; + ) + { + kbts_arena_block_header *Next = Header->Next; + kbts__arena_block *Block = (kbts__arena_block *)Header; + + kbts__AllocatorFree(StackArena.Allocator, StackArena.AllocatorData, Block->BaseAllocation); + + Header = Next; + } + } +} + +static void kbts__ArenaAllocator(void *Data, kbts_allocator_op *Op) +{ + kbts_arena *Arena = (kbts_arena *)Data; + + if(Op->Kind == KBTS_ALLOCATOR_OP_KIND_ALLOCATE) + { + Op->Allocate.Pointer = kbts__PushSize(Arena, Op->Allocate.Size, 8); + } + // No free! +} + +static int kbts__InitializeFixedMemoryArena(kbts_arena *Arena, void *Memory, kbts_un MemorySize) +{ + int Result = 0; + KBTS_MEMSET(Arena, 0, sizeof(*Arena)); + Arena->Allocator = kbts__NullAllocator; + kbts__EnsureArenaInitialized(Arena); + + char *BaseAligned = KBTS__ALIGN_POINTER(char, Memory, KBTS_ALIGNOF(kbts__arena_block)); + char *End = (char *)Memory + MemorySize; + kbts_un TotalBlockSize = (kbts_un)(End - BaseAligned); + + if(TotalBlockSize >= sizeof(kbts__arena_block)) + { + kbts__arena_block *Block = (kbts__arena_block *)BaseAligned; + + Block->Header.Prev = Block->Header.Next = &Arena->BlockSentinel; + Block->Header.Prev->Next = Block->Header.Next->Prev = &Block->Header; + Block->BaseAllocation = 0; + Block->Size = TotalBlockSize - sizeof(kbts__arena_block); + Block->Used = 0; + + Result = 1; } return Result; } -static void kbts_BeginFeatures(kbts_op_state *State, kbts_shape_config *Config, kbts_shaping_table ShapingTable, kbts_feature_set EnabledFeatures) +static kbts_glyph *kbts__InsertGlyph(kbts_glyph_storage *Storage, kbts_glyph *Anchor, int InsertBeforeAnchor, kbts_glyph *BaseGlyph) { - kbts_un FeatureCount = 0; - kbts_gsub_gpos *Header = Config->Font->ShapingTables[ShapingTable]; - kbts_langsys *Langsys = Config->Langsys[ShapingTable]; - if(Header && Langsys) + kbts_glyph *Result = Storage->FreeGlyphSentinel.Next; + + if(Result != &Storage->FreeGlyphSentinel) { - kbts_feature_list *FeatureList = KBTS_POINTER_OFFSET(kbts_feature_list, Header, Header->FeatureListOffset); - kbts_u16 *FeatureIndices = KBTS_POINTER_AFTER(kbts_u16, Langsys); - // @Incomplete - // if(Header->Minor == 1) - // { - // kbts_feature_variations *FeatureVariations = KBTS_POINTER_OFFSET(kbts_feature_variations, Header, Header->FeatureVariationsOffset); - // } - - KBTS_FOR(FeatureIndexIndex, 0, Langsys->FeatureIndexCount) - { - kbts_un FeatureIndex = FeatureIndices[FeatureIndexIndex]; - kbts_feature_pointer Feature = kbts_GetFeature(FeatureList, FeatureIndex); - // @Incomplete - //if(FeatureVariations) - //{ - // KBTS_FOR(VariationIndex, 0, FeatureVariations->RecordCount) - // { - // kbts_feature_variation_pointer Variation = kbts_GetFeatureVariation(FeatureVariations, VariationIndex); - // KBTS_FOR(ConditionIndex, 0, Variation.ConditionSet->Count) - // { - // kbts_condition_1 *Condition = kbts_GetCondition(Variation.ConditionSet, ConditionIndex); - // KBTS_ASSERT(0); - // } - // } - //} - - kbts_u32 FeatureId = kbts_FeatureTagToId(Feature.Tag); - if(Feature.Feature->LookupIndexCount && kbts_ContainsFeature(&EnabledFeatures, FeatureId)) - { - kbts_lookup_indices LookupIndices = KBTS_ZERO; - LookupIndices.FeatureTag = Feature.Tag; - LookupIndices.FeatureId = FeatureId; - LookupIndices.SkipFlags = kbts_SkipFlags(FeatureId, Config->Shaper); - // For Myanmar, we could try and tag glyphs depending on their Indic properties in BeginCluster, just like we do for - // Indic scripts. - // However, Harfbuzz does _not_ do this, so it seems like a bunch of work that would, at best, make us diverge from - // Harfbuzz more often. - if((Config->Shaper != KBTS_SHAPER_MYANMAR) && (FeatureId >= 1) && (FeatureId <= 32)) - { - // These must properly map KBTS_FEATURE_ID to kbts_glyph_flags! - LookupIndices.GlyphFilter = (1 << (FeatureId - 1)) & KBTS_GLYPH_FEATURE_MASK; - } - LookupIndices.Count = Feature.Feature->LookupIndexCount; - LookupIndices.Indices = KBTS_POINTER_AFTER(kbts_u16, Feature.Feature); - State->FeatureLookupIndices[FeatureCount++] = LookupIndices; - } - } + KBTS__DLLIST_REMOVE(Result); } - State->FeatureCount = (kbts_u32)FeatureCount; + else + { + Result = kbts__PushType(&Storage->Arena, kbts_glyph); + } + + if(Result) + { + if(BaseGlyph) + { + *Result = *BaseGlyph; + } + + if(InsertBeforeAnchor) + { + Result->Next = Anchor; + Result->Prev = Anchor->Prev; + } + else + { + Result->Prev = Anchor; + Result->Next = Anchor->Next; + } + + Result->Prev->Next = Result->Next->Prev = Result; + } + else + { + Storage->Error = 1; + } + + return Result; +} +static kbts_glyph *kbts__InsertGlyphBefore(kbts_glyph_storage *Storage, kbts_glyph *Anchor, kbts_glyph *BaseGlyph) +{ + kbts_glyph *Result = kbts__InsertGlyph(Storage, Anchor, 1, BaseGlyph); + return Result; +} +static kbts_glyph *kbts__InsertGlyphAfter(kbts_glyph_storage *Storage, kbts_glyph *Anchor, kbts_glyph *BaseGlyph) +{ + kbts_glyph *Result = kbts__InsertGlyph(Storage, Anchor, 0, BaseGlyph); + return Result; } -typedef struct kbts_sequence_lookup_result +static kbts_glyph *kbts__FreeGlyph(kbts__shape_scratchpad *Scratchpad, kbts_glyph_storage *Storage, kbts_glyph *Glyph) { - kbts_sequence_lookup_record *Records; + if(Glyph == Scratchpad->LookupOnePastLastGlyph) + { + Scratchpad->LookupOnePastLastGlyph = Glyph->Next; + } + if(Glyph == Scratchpad->Cluster.SentinelPrev) + { + Scratchpad->Cluster.SentinelPrev = Glyph->Prev; + } + if(Glyph == Scratchpad->Cluster.SentinelNext) + { + Scratchpad->Cluster.SentinelNext = Glyph->Next; + } + + KBTS__DLLIST_REMOVE(Glyph); + KBTS__DLLIST_INSERT_BEFORE(Glyph, (kbts_glyph *)&Storage->FreeGlyphSentinel); + + return Glyph; +} + +static kbts_glyph *kbts__SetGlyphPreserveLinksAndUserId(kbts_glyph *Dest, kbts_glyph *Source) +{ + kbts_glyph *Prev = Dest->Prev; + kbts_glyph *Next = Dest->Next; + int UserId = Dest->UserIdOrCodepointIndex; + + *Dest = *Source; + + Dest->Prev = Prev; + Dest->Next = Next; + Dest->UserIdOrCodepointIndex = UserId; + + return Dest; +} + +static int kbts__BeginFeatures(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_shaping_table ShapingTable) +{ + int Result = 0; + kbts_blob_table_id TableId = (ShapingTable == KBTS_SHAPING_TABLE_GSUB) ? KBTS_BLOB_TABLE_ID_GSUB : KBTS_BLOB_TABLE_ID_GPOS; + kbts__gsub_gpos *GsubGpos = kbts__BlobTableDataType(Config->Font->Blob, TableId, kbts__gsub_gpos); + kbts__langsys *Langsys = Config->Langsys[ShapingTable]; + kbts_un FeatureStageIndex = Scratchpad->FeatureStagesRead - 1; + + Scratchpad->FeatureIndexIndex = 0; + + if(GsubGpos && Langsys && (FeatureStageIndex < Config->OpList.FeatureStageCount)) + { + kbts__baked_feature_stage *BakedFeatureStage = &Config->FeatureStages[FeatureStageIndex]; + + // @Incomplete + // if(GsubGpos->Minor == 1) + // { + // kbts__feature_variations *FeatureVariations = KBTS__POINTER_OFFSET(kbts__feature_variations, GsubGpos, GsubGpos->FeatureVariationsOffset); + // } + + + KBTS__FOR(FeatureIndex, 0, BakedFeatureStage->FeatureCount) + { + Scratchpad->BakedLookupSubtablesRead[FeatureIndex] = 0; + } + + Result = 1; + } + + return Result; +} + +typedef struct kbts__sequence_lookup_result +{ + kbts__sequence_lookup_record *Records; kbts_un RecordCount; kbts_un InputSequenceCountIncludingSkippedGlyphs; + kbts_glyph *OnePastLastGlyphMatched; + // This is specified _nowhere_ in the docs, BUT some sequence lookups have 0 records, and exist just to prevent the // next lookups from executing. // So, checking if we got any records is not enough to figure out whether we need to "apply" this lookup. // We need to have an explicit bool as well. // Sigh. int Matched; -} kbts_sequence_lookup_result; +} kbts__sequence_lookup_result; -typedef struct kbts_sequence_match +typedef struct kbts__sequence_match { kbts_un MatchCount; kbts_un MatchOrSkipCount; -} kbts_sequence_match; + kbts_glyph *OnePastMatchGlyph; +} kbts__sequence_match; -static kbts_sequence_match kbts_MatchCoverageSequence(kbts_unpacked_lookup *Lookup, kbts_u32 SkipFlags, kbts_u32 SkipUnicodeFlags, +static kbts__sequence_match kbts__MatchCoverageSequence(kbts_glyph_storage *Storage, kbts__unpacked_lookup *Lookup, kbts_u32 SkipFlags, kbts_u32 SkipUnicodeFlags, void *Base, kbts_u16 *CoverageOffsets, kbts_un CoverageCount, - kbts_glyph_array *GlyphArray, kbts_un GlyphStartIndex, kbts_un GlyphIndexIncrement) + kbts_glyph *AtGlyph, int Backward) { kbts_un CoverageIndex = 0; kbts_un GlyphCounter = 0; - kbts_un GlyphIndex = GlyphStartIndex; - while((GlyphCounter < GlyphArray->Count) && (CoverageIndex < CoverageCount)) + while(kbts__GlyphIsValid(Storage, AtGlyph) && (CoverageIndex < CoverageCount)) { - kbts_glyph *Glyph = &GlyphArray->Glyphs[GlyphIndex]; - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Base, CoverageOffsets[CoverageIndex]); + kbts__coverage *Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Base, CoverageOffsets[CoverageIndex]); - if(!kbts_SkipGlyph(Glyph, Lookup, SkipFlags, SkipUnicodeFlags)) + if(!kbts__SkipGlyph(AtGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) { - kbts_cover_glyph_result Cover = kbts_CoverGlyph(Coverage, Glyph->Id); + kbts__cover_glyph_result Cover = kbts__CoverGlyph(Coverage, AtGlyph->Id); if(Cover.Valid) { @@ -16901,41 +19736,38 @@ static kbts_sequence_match kbts_MatchCoverageSequence(kbts_unpacked_lookup *Look } } - GlyphIndex += GlyphIndexIncrement; + AtGlyph = Backward ? AtGlyph->Prev : AtGlyph->Next; GlyphCounter += 1; } - kbts_sequence_match Result = KBTS_ZERO; + kbts__sequence_match Result = KBTS__ZERO; Result.MatchCount = CoverageIndex; Result.MatchOrSkipCount = GlyphCounter; + Result.OnePastMatchGlyph = AtGlyph; return Result; } -static int kbts_BranchlessCompareArray16(kbts_u16 *A, kbts_u16 *B, kbts_un Count) +static int kbts__BranchlessCompareArray16(kbts_u16 *A, kbts_u16 *B, kbts_un Count) { kbts_u16 DifferenceMask = 0; - KBTS_FOR(Index, 0, Count) + KBTS__FOR(Index, 0, Count) { DifferenceMask |= A[Index] ^ B[Index]; } return (int)DifferenceMask; } -static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *Lookup, kbts_u16 *Base, kbts_cover_glyph_result Cover, - kbts_glyph_array *GlyphArray, kbts_un InputGlyphOffset, kbts_skip_flags SkipFlags, kbts_u32 SkipUnicodeFlags) +static kbts__sequence_lookup_result kbts__DoSequenceLookup(kbts_glyph_storage *Storage, kbts__unpacked_lookup *Lookup, kbts_u16 *Base, kbts__cover_glyph_result Cover, + kbts_glyph *AtGlyph, kbts__skip_flags SkipFlags, kbts_u32 SkipUnicodeFlags) { - KBTS_INSTRUMENT_FUNCTION_BEGIN - kbts_sequence_lookup_result Result = KBTS_ZERO; + KBTS_INSTRUMENT_FUNCTION_BEGIN; + kbts__sequence_lookup_result Result = KBTS__ZERO; + Result.OnePastLastGlyphMatched = AtGlyph->Next; - kbts_glyph_array BacktrackGlyphs = kbts_ClipGlyphArray(GlyphArray, InputGlyphOffset); - kbts_glyph_array InputGlyphs = kbts_GlyphSubArray(GlyphArray, InputGlyphOffset); - kbts_glyph_array FollowupGlyphs = kbts_GlyphSubArray(&InputGlyphs, 1); - - kbts_glyph *FirstGlyph = &GlyphArray->Glyphs[0]; - kbts_glyph *CurrentGlyph = &GlyphArray->Glyphs[InputGlyphOffset]; - kbts_glyph *InputGlyph = &GlyphArray->Glyphs[InputGlyphOffset + 1]; - kbts_glyph *OnePastLastGlyph = &GlyphArray->Glyphs[GlyphArray->Count]; - kbts_glyph *BacktrackGlyph = &GlyphArray->Glyphs[InputGlyphOffset - 1]; + kbts_glyph *CurrentGlyph = AtGlyph; + kbts_glyph *InputGlyph = AtGlyph->Next; + kbts_un InputGlyphsTraversed = 1; + kbts_glyph *BacktrackGlyph = AtGlyph->Prev; // Lookup types 7 and 8 are dispatch mechanisms. They do not substitute anything by themselves, they only point to // other rules. @@ -16949,43 +19781,47 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L case 0x50001: case 0x70001: { - kbts_sequence_context_1 *Subst = (kbts_sequence_context_1 *)Base; - kbts_sequence_rule_set *Set = kbts_GetSequenceRuleSet(Subst, Cover.Index); + kbts__sequence_context_1 *Subst = (kbts__sequence_context_1 *)Base; + kbts__sequence_rule_set *Set = kbts__GetSequenceRuleSet(Subst, Cover.Index); if(Set) { kbts_u16 Ids[64]; // @Hardcoded - kbts_u16 GlyphOffsets[64]; + kbts_u16 InputGlyphOffsets[64]; + kbts_glyph *InputGlyphs[64]; kbts_un IdCount = 0; - KBTS_FOR(RuleIndex, 0, Set->Count) + KBTS__FOR(RuleIndex, 0, Set->Count) { - kbts_sequence_rule *Rule = kbts_GetSequenceRule(Set, RuleIndex); - kbts_u16 *InputSequence = KBTS_POINTER_AFTER(kbts_u16, Rule); + kbts__sequence_rule *Rule = kbts__GetSequenceRule(Set, RuleIndex); + kbts_u16 *InputSequence = KBTS__POINTER_AFTER(kbts_u16, Rule); // @Hardcoded! KBTS_ASSERT(Rule->GlyphCount <= 64); - while((InputGlyph < OnePastLastGlyph) && ((IdCount + 1) < Rule->GlyphCount)) + while(kbts__GlyphIsValid(Storage, InputGlyph) && ((IdCount + 1) < Rule->GlyphCount)) { - if(!kbts_SkipGlyph(InputGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) + if(!kbts__SkipGlyph(InputGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) { - GlyphOffsets[IdCount] = (kbts_u16)(InputGlyph - CurrentGlyph); + InputGlyphOffsets[IdCount] = (kbts_u16)InputGlyphsTraversed; + InputGlyphs[IdCount] = InputGlyph; Ids[IdCount++] = InputGlyph->Id; } - InputGlyph += 1; + InputGlyph = InputGlyph->Next; + InputGlyphsTraversed += 1; } if(((IdCount + 1) >= Rule->GlyphCount) && - !kbts_BranchlessCompareArray16(Ids, InputSequence, Rule->GlyphCount - 1)) + !kbts__BranchlessCompareArray16(Ids, InputSequence, Rule->GlyphCount - 1)) { - Result.Records = (kbts_sequence_lookup_record *)(InputSequence + Rule->GlyphCount - 1); + Result.Records = (kbts__sequence_lookup_record *)(InputSequence + Rule->GlyphCount - 1); Result.RecordCount = Rule->SequenceLookupCount; Result.InputSequenceCountIncludingSkippedGlyphs = 1; if(Rule->GlyphCount > 1) { - Result.InputSequenceCountIncludingSkippedGlyphs = GlyphOffsets[Rule->GlyphCount - 2] + 1; + Result.InputSequenceCountIncludingSkippedGlyphs = InputGlyphOffsets[Rule->GlyphCount - 2] + 1; + Result.OnePastLastGlyphMatched = InputGlyphs[Rule->GlyphCount - 2]->Next; } Result.Matched = 1; @@ -16999,48 +19835,52 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L case 0x50002: case 0x70002: { - kbts_sequence_context_2 *Subst = (kbts_sequence_context_2 *)Base; - kbts_u16 *ClassDefinitionBase = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->ClassDefOffset); + kbts__sequence_context_2 *Subst = (kbts__sequence_context_2 *)Base; + kbts_u16 *ClassDefinitionBase = KBTS__POINTER_OFFSET(kbts_u16, Subst, Subst->ClassDefOffset); // @Hardcoded! kbts_u16 InputClasses[64]; kbts_u16 InputOffsets[64]; + kbts_glyph *InputGlyphs[64]; kbts_un InputCount = 0; // For class-based contexts, the coverage index is not used. // Instead, we know which set to use based on the current glyph's class. // From the Microsoft docs: // The class value is used as the index into an array of offsets to ClassSequenceRuleSet tables. - kbts_glyph_class_from_table_result CurrentGlyphClass = kbts_GlyphClassFromTable(ClassDefinitionBase, CurrentGlyph->Id); - kbts_class_sequence_rule_set *Set = kbts_GetClassSequenceRuleSet(Subst, CurrentGlyphClass.Class); + kbts__glyph_class_from_table_result CurrentGlyphClass = kbts__GlyphClassFromTable(ClassDefinitionBase, CurrentGlyph->Id); + kbts__class_sequence_rule_set *Set = kbts__GetClassSequenceRuleSet(Subst, CurrentGlyphClass.Class); if((CurrentGlyphClass.Class < Subst->ClassSequenceRuleSetCount) && Set) { - KBTS_FOR(RuleIndex, 0, Set->Count) + KBTS__FOR(RuleIndex, 0, Set->Count) { - kbts_class_sequence_rule *Rule = kbts_GetClassSequenceRule(Set, RuleIndex); - kbts_u16 *InputSequence = KBTS_POINTER_AFTER(kbts_u16, Rule); + kbts__class_sequence_rule *Rule = kbts__GetClassSequenceRule(Set, RuleIndex); + kbts_u16 *InputSequence = KBTS__POINTER_AFTER(kbts_u16, Rule); - while((InputGlyph < OnePastLastGlyph) && ((InputCount + 1) < Rule->GlyphCount)) + while(kbts__GlyphIsValid(Storage, InputGlyph) && ((InputCount + 1) < Rule->GlyphCount)) { - if(!kbts_SkipGlyph(InputGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) + if(!kbts__SkipGlyph(InputGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) { - InputOffsets[InputCount] = (kbts_u16)(InputGlyph - CurrentGlyph); - InputClasses[InputCount++] = kbts_GlyphClassFromTable(ClassDefinitionBase, InputGlyph->Id).Class; + InputOffsets[InputCount] = (kbts_u16)InputGlyphsTraversed; + InputGlyphs[InputCount] = InputGlyph; + InputClasses[InputCount++] = kbts__GlyphClassFromTable(ClassDefinitionBase, InputGlyph->Id).Class; } - InputGlyph += 1; + InputGlyph = InputGlyph->Next; + InputGlyphsTraversed += 1; } if(((InputCount + 1) >= Rule->GlyphCount) && - !kbts_BranchlessCompareArray16(InputClasses, InputSequence, Rule->GlyphCount - 1)) + !kbts__BranchlessCompareArray16(InputClasses, InputSequence, Rule->GlyphCount - 1)) { - Result.Records = (kbts_sequence_lookup_record *)(InputSequence + Rule->GlyphCount - 1); + Result.Records = (kbts__sequence_lookup_record *)(InputSequence + Rule->GlyphCount - 1); Result.RecordCount = Rule->SequenceLookupCount; Result.InputSequenceCountIncludingSkippedGlyphs = 1; if(Rule->GlyphCount > 1) { Result.InputSequenceCountIncludingSkippedGlyphs = InputOffsets[Rule->GlyphCount - 2] + 1; + Result.OnePastLastGlyphMatched = InputGlyphs[Rule->GlyphCount - 2]->Next; } Result.Matched = 1; @@ -17054,16 +19894,17 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L case 0x50003: case 0x70003: { - kbts_sequence_context_3 *Subst = (kbts_sequence_context_3 *)Base; - kbts_u16 *CoverageOffsets = KBTS_POINTER_AFTER(kbts_u16, Subst); + kbts__sequence_context_3 *Subst = (kbts__sequence_context_3 *)Base; + kbts_u16 *CoverageOffsets = KBTS__POINTER_AFTER(kbts_u16, Subst); - kbts_sequence_match InputMatch = kbts_MatchCoverageSequence(Lookup, SkipFlags, SkipUnicodeFlags, Subst, CoverageOffsets, Subst->GlyphCount, &InputGlyphs, 0, 1); + kbts__sequence_match InputMatch = kbts__MatchCoverageSequence(Storage, Lookup, SkipFlags, SkipUnicodeFlags, Subst, CoverageOffsets, Subst->GlyphCount, AtGlyph, 0); if(InputMatch.MatchCount == Subst->GlyphCount) { - Result.Records = (kbts_sequence_lookup_record *)(CoverageOffsets + Subst->GlyphCount); + Result.Records = (kbts__sequence_lookup_record *)(CoverageOffsets + Subst->GlyphCount); Result.RecordCount = Subst->SequenceLookupCount; Result.InputSequenceCountIncludingSkippedGlyphs = InputMatch.MatchOrSkipCount; + Result.OnePastLastGlyphMatched = InputMatch.OnePastMatchGlyph; Result.Matched = 1; } } @@ -17072,8 +19913,8 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L case 0x60001: case 0x80001: { - kbts_chained_sequence_context_1 *Subst = (kbts_chained_sequence_context_1 *)Base; - kbts_chained_sequence_rule_set *Set = kbts_GetChainedSequenceRuleSet(Subst, Cover.Index); + kbts__chained_sequence_context_1 *Subst = (kbts__chained_sequence_context_1 *)Base; + kbts__chained_sequence_rule_set *Set = kbts__GetChainedSequenceRuleSet(Subst, Cover.Index); if(Set) { @@ -17081,38 +19922,43 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L kbts_u16 BacktrackIds[64]; kbts_u16 InputIds[64]; kbts_u16 InputOffsets[64]; + kbts_glyph *InputGlyphs[64]; kbts_un BacktrackCount = 0; kbts_un InputCount = 0; - KBTS_FOR(RuleIndex, 0, Set->Count) + KBTS__FOR(RuleIndex, 0, Set->Count) { - kbts_chained_sequence_rule *Rule = kbts_GetChainedSequenceRule(Set, RuleIndex); - kbts_unpacked_chained_sequence_rule Unpacked = kbts_UnpackChainedSequenceRule(Rule, 0); + kbts__chained_sequence_rule *Rule = kbts__GetChainedSequenceRule(Set, RuleIndex); + kbts__unpacked_chained_sequence_rule Unpacked = kbts__UnpackChainedSequenceRule(Rule, 0); - while((BacktrackGlyph >= FirstGlyph) && (BacktrackCount < Unpacked.BacktrackCount)) + while(kbts__GlyphIsValid(Storage, BacktrackGlyph) && (BacktrackCount < Unpacked.BacktrackCount)) { - if(!kbts_SkipGlyph(BacktrackGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) + if(!kbts__SkipGlyph(BacktrackGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) { BacktrackIds[BacktrackCount++] = BacktrackGlyph->Id; } - BacktrackGlyph -= 1; + + BacktrackGlyph = BacktrackGlyph->Prev; } kbts_un TotalInputGlyphsRequired = Unpacked.InputCount - 1 + Unpacked.LookaheadCount; - while((InputGlyph < OnePastLastGlyph) && (InputCount < TotalInputGlyphsRequired)) + while(kbts__GlyphIsValid(Storage, InputGlyph) && (InputCount < TotalInputGlyphsRequired)) { - if(!kbts_SkipGlyph(InputGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) + if(!kbts__SkipGlyph(InputGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) { - InputOffsets[InputCount] = (kbts_u16)(InputGlyph - CurrentGlyph); + InputGlyphs[InputCount] = InputGlyph; + InputOffsets[InputCount] = (kbts_u16)InputGlyphsTraversed; InputIds[InputCount++] = InputGlyph->Id; } - InputGlyph += 1; + + InputGlyph = InputGlyph->Next; + InputGlyphsTraversed += 1; } if((BacktrackCount >= Unpacked.BacktrackCount) && (InputCount >= TotalInputGlyphsRequired) && - !kbts_BranchlessCompareArray16(BacktrackIds, Unpacked.Backtrack, Unpacked.BacktrackCount) && - !kbts_BranchlessCompareArray16(InputIds, Unpacked.Input, Unpacked.InputCount - 1) && - !kbts_BranchlessCompareArray16(InputIds + Unpacked.InputCount - 1, Unpacked.Lookahead, Unpacked.LookaheadCount)) + !kbts__BranchlessCompareArray16(BacktrackIds, Unpacked.Backtrack, Unpacked.BacktrackCount) && + !kbts__BranchlessCompareArray16(InputIds, Unpacked.Input, Unpacked.InputCount - 1) && + !kbts__BranchlessCompareArray16(InputIds + Unpacked.InputCount - 1, Unpacked.Lookahead, Unpacked.LookaheadCount)) { Result.Records = Unpacked.Records; Result.RecordCount = Unpacked.RecordCount; @@ -17120,6 +19966,7 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L if(Unpacked.InputCount > 1) { Result.InputSequenceCountIncludingSkippedGlyphs = InputOffsets[Unpacked.InputCount - 2] + 1; + Result.OnePastLastGlyphMatched = InputGlyphs[Unpacked.InputCount - 2]->Next; } Result.Matched = 1; @@ -17133,10 +19980,10 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L case 0x60002: case 0x80002: { - kbts_chained_sequence_context_2 *Subst = (kbts_chained_sequence_context_2 *)Base; - kbts_u16 *BacktrackClassDefinition = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->BacktrackClassDefOffset); - kbts_u16 *InputClassDefinition = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->InputClassDefOffset); - kbts_u16 *LookaheadClassDefinition = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->LookaheadClassDefOffset); + kbts__chained_sequence_context_2 *Subst = (kbts__chained_sequence_context_2 *)Base; + kbts_u16 *BacktrackClassDefinition = KBTS__POINTER_OFFSET(kbts_u16, Subst, Subst->BacktrackClassDefOffset); + kbts_u16 *InputClassDefinition = KBTS__POINTER_OFFSET(kbts_u16, Subst, Subst->InputClassDefOffset); + kbts_u16 *LookaheadClassDefinition = KBTS__POINTER_OFFSET(kbts_u16, Subst, Subst->LookaheadClassDefOffset); // @Incomplete: Do this with all sequence types! @@ -17144,6 +19991,7 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L kbts_u16 BacktrackClasses[64]; kbts_u16 InputClasses[64]; kbts_u16 InputClassOffsets[64]; + kbts_glyph *InputGlyphs[64]; kbts_u16 LookaheadClasses[64]; kbts_un BacktrackClassCount = 0; kbts_un InputClassCount = 0; @@ -17154,8 +20002,8 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L // current glyph. The class value is used as the index into an array of offsets to ChainedClassSequenceRuleSet // tables. // - kbts_u16 CurrentGlyphClass = kbts_GlyphClassFromTable(InputClassDefinition, CurrentGlyph->Id).Class; - kbts_chained_sequence_rule_set *Set = kbts_GetChainedClassSequenceRuleSet(Subst, CurrentGlyphClass); + kbts_u16 CurrentGlyphClass = kbts__GlyphClassFromTable(InputClassDefinition, CurrentGlyph->Id).Class; + kbts__chained_sequence_rule_set *Set = kbts__GetChainedClassSequenceRuleSet(Subst, CurrentGlyphClass); // If the glyph was contained in the coverage table, then it should have a valid class. // Nevertheless, one Harfbuzz test font did not remove out-of-bounds glyph classes from the class definition // table here, so we double-check it here. @@ -17163,59 +20011,61 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L // in which case ignoring these classes becomes a feature.) if((CurrentGlyphClass < Subst->ChainedClassSequenceRuleSetCount) && Set) { - KBTS_FOR(RuleIndex, 0, Set->Count) + KBTS__FOR(RuleIndex, 0, Set->Count) { - kbts_chained_sequence_rule *Rule = kbts_GetChainedClassSequenceRule(Set, RuleIndex); - kbts_unpacked_chained_sequence_rule Unpacked = kbts_UnpackChainedSequenceRule(Rule, 0); + kbts__chained_sequence_rule *Rule = kbts__GetChainedClassSequenceRule(Set, RuleIndex); + kbts__unpacked_chained_sequence_rule Unpacked = kbts__UnpackChainedSequenceRule(Rule, 0); // @Hardcoded KBTS_ASSERT(Unpacked.BacktrackCount <= 64); KBTS_ASSERT(Unpacked.InputCount <= 64); KBTS_ASSERT(Unpacked.LookaheadCount <= 64); - while((BacktrackGlyph >= FirstGlyph) && (BacktrackClassCount < Unpacked.BacktrackCount)) + while(kbts__GlyphIsValid(Storage, BacktrackGlyph) && (BacktrackClassCount < Unpacked.BacktrackCount)) { - if(!kbts_SkipGlyph(BacktrackGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) + if(!kbts__SkipGlyph(BacktrackGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) { // @Robustness: Do we want to break if we don't find a class? - kbts_glyph_class_from_table_result Class = kbts_GlyphClassFromTable(BacktrackClassDefinition, BacktrackGlyph->Id); + kbts__glyph_class_from_table_result Class = kbts__GlyphClassFromTable(BacktrackClassDefinition, BacktrackGlyph->Id); BacktrackClasses[BacktrackClassCount++] = Class.Class; } - BacktrackGlyph -= 1; + BacktrackGlyph = BacktrackGlyph->Prev; } kbts_un InputClassCountRequired = Unpacked.InputCount - 1 + Unpacked.LookaheadCount; - while((InputGlyph < OnePastLastGlyph) && (InputClassCount < InputClassCountRequired)) + while(kbts__GlyphIsValid(Storage, InputGlyph) && (InputClassCount < InputClassCountRequired)) { - if(!kbts_SkipGlyph(InputGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) + if(!kbts__SkipGlyph(InputGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) { - kbts_glyph_class_from_table_result InputClass = kbts_GlyphClassFromTable(InputClassDefinition, InputGlyph->Id); + kbts__glyph_class_from_table_result InputClass = kbts__GlyphClassFromTable(InputClassDefinition, InputGlyph->Id); // In many cases, the font designer just wants to match "a set of glyphs" forward, // and it doesn't matter whether those glyphs are in the input sequence or part of the lookahead. // This happens often enough that we care to special-case it. - kbts_glyph_class_from_table_result LookaheadClass = InputClass; + kbts__glyph_class_from_table_result LookaheadClass = InputClass; if(LookaheadClassDefinition != InputClassDefinition) { - LookaheadClass = kbts_GlyphClassFromTable(LookaheadClassDefinition, InputGlyph->Id); + LookaheadClass = kbts__GlyphClassFromTable(LookaheadClassDefinition, InputGlyph->Id); } // @Robustness: Do we want to break if we don't find a class? - InputClassOffsets[InputClassCount] = (kbts_u16)(InputGlyph - CurrentGlyph); + InputGlyphs[InputClassCount] = InputGlyph; + InputClassOffsets[InputClassCount] = (kbts_u16)InputGlyphsTraversed; InputClasses[InputClassCount] = InputClass.Class; LookaheadClasses[InputClassCount] = LookaheadClass.Class; InputClassCount += 1; } - InputGlyph += 1; + InputGlyph = InputGlyph->Next; + InputGlyphsTraversed += 1; } if((BacktrackClassCount >= Unpacked.BacktrackCount) && (InputClassCount >= InputClassCountRequired) && - !kbts_BranchlessCompareArray16(BacktrackClasses, Unpacked.Backtrack, Unpacked.BacktrackCount) && - !kbts_BranchlessCompareArray16(InputClasses, Unpacked.Input, Unpacked.InputCount - 1) && - !kbts_BranchlessCompareArray16(LookaheadClasses + Unpacked.InputCount - 1, Unpacked.Lookahead, Unpacked.LookaheadCount)) + !kbts__BranchlessCompareArray16(BacktrackClasses, Unpacked.Backtrack, Unpacked.BacktrackCount) && + !kbts__BranchlessCompareArray16(InputClasses, Unpacked.Input, Unpacked.InputCount - 1) && + !kbts__BranchlessCompareArray16(LookaheadClasses + Unpacked.InputCount - 1, Unpacked.Lookahead, Unpacked.LookaheadCount)) { Result.Records = Unpacked.Records; Result.RecordCount = Unpacked.RecordCount; @@ -17223,6 +20073,7 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L if(Unpacked.InputCount > 1) { Result.InputSequenceCountIncludingSkippedGlyphs = InputClassOffsets[Unpacked.InputCount - 2] + 1; + Result.OnePastLastGlyphMatched = InputGlyphs[Unpacked.InputCount - 2]->Next; } Result.Matched = 1; @@ -17236,36 +20087,36 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L case 0x60003: case 0x80003: { - kbts_chained_sequence_context_3 *Subst = (kbts_chained_sequence_context_3 *)Base; - kbts_unpacked_chained_sequence_context_3 Unpacked = kbts_UnpackChainedSequenceContext3(Subst, 0); + kbts__chained_sequence_context_3 *Subst = (kbts__chained_sequence_context_3 *)Base; + kbts__unpacked_chained_sequence_context_3 Unpacked = kbts__UnpackChainedSequenceContext3(Subst, 0); // Since chained sequence contexts roll the coverage for the first glyph into an array, you'd think that // the matching logic for the first glyph would be the same as for any other glyph in that array. // You'd be wrong! // The first glyph does _not_ have to pass glyph filtering logic. It just has to pass the coverage test. // Every other input glyph still does, though. - kbts_cover_glyph_result CurrentCover = KBTS_ZERO; - CurrentCover.Valid = !Unpacked.InputCount || kbts_GlyphPassesLookupFilter(InputGlyphs.Glyphs, Lookup); + kbts__cover_glyph_result CurrentCover = KBTS__ZERO; + CurrentCover.Valid = !Unpacked.InputCount || kbts__GlyphPassesLookupFilter(CurrentGlyph, Lookup); if(Unpacked.InputCount) { - kbts_coverage *CurrentCoverage = KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.InputCoverageOffsets[0]); - CurrentCover = kbts_CoverGlyph(CurrentCoverage, InputGlyphs.Glyphs[0].Id); + kbts__coverage *CurrentCoverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.InputCoverageOffsets[0]); + CurrentCover = kbts__CoverGlyph(CurrentCoverage, CurrentGlyph->Id); } if(CurrentCover.Valid) { - kbts_sequence_match BacktrackMatch = kbts_MatchCoverageSequence(Lookup, SkipFlags, SkipUnicodeFlags, Subst, Unpacked.BacktrackCoverageOffsets, Unpacked.BacktrackCount, &BacktrackGlyphs, BacktrackGlyphs.Count - 1, -1); - kbts_sequence_match InputMatch = kbts_MatchCoverageSequence(Lookup, SkipFlags, SkipUnicodeFlags, Subst, Unpacked.InputCoverageOffsets + 1, Unpacked.InputCount - 1, &FollowupGlyphs, 0, 1); + kbts__sequence_match BacktrackMatch = kbts__MatchCoverageSequence(Storage, Lookup, SkipFlags, SkipUnicodeFlags, Subst, Unpacked.BacktrackCoverageOffsets, Unpacked.BacktrackCount, BacktrackGlyph, 1); + kbts__sequence_match InputMatch = kbts__MatchCoverageSequence(Storage, Lookup, SkipFlags, SkipUnicodeFlags, Subst, Unpacked.InputCoverageOffsets + 1, Unpacked.InputCount - 1, InputGlyph, 0); kbts_un MatchingInputGlyphCount = 1 + InputMatch.MatchCount; kbts_un MatchedOrSkippedInputGlyphCount = 1 + InputMatch.MatchOrSkipCount; - kbts_glyph_array LookaheadGlyphs = kbts_GlyphSubArray(&InputGlyphs, MatchedOrSkippedInputGlyphCount); - kbts_sequence_match LookaheadMatch = kbts_MatchCoverageSequence(Lookup, SkipFlags, SkipUnicodeFlags, Subst, Unpacked.LookaheadCoverageOffsets, Unpacked.LookaheadCount, &LookaheadGlyphs, 0, 1); + kbts__sequence_match LookaheadMatch = kbts__MatchCoverageSequence(Storage, Lookup, SkipFlags, SkipUnicodeFlags, Subst, Unpacked.LookaheadCoverageOffsets, Unpacked.LookaheadCount, InputMatch.OnePastMatchGlyph, 0); if((BacktrackMatch.MatchCount == Unpacked.BacktrackCount) && ((MatchingInputGlyphCount) == Unpacked.InputCount) && (LookaheadMatch.MatchCount == Unpacked.LookaheadCount)) { Result.Records = Unpacked.Records; Result.RecordCount = Unpacked.RecordCount; Result.InputSequenceCountIncludingSkippedGlyphs = MatchedOrSkippedInputGlyphCount; + Result.OnePastLastGlyphMatched = InputMatch.OnePastMatchGlyph; Result.Matched = 1; break; @@ -17275,11 +20126,11 @@ static kbts_sequence_lookup_result kbts_DoSequenceLookup(kbts_unpacked_lookup *L break; } - KBTS_INSTRUMENT_END + KBTS_INSTRUMENT_FUNCTION_END; return Result; } -static void kbts_ApplyValueRecord(kbts_glyph *Glyph, kbts_unpacked_value_record *Unpacked) +static void kbts__ApplyValueRecord(kbts_glyph *Glyph, kbts__unpacked_value_record *Unpacked) { Glyph->OffsetX += Unpacked->PlacementX; Glyph->OffsetY += Unpacked->PlacementY; @@ -17288,38 +20139,28 @@ static void kbts_ApplyValueRecord(kbts_glyph *Glyph, kbts_unpacked_value_record Glyph->AdvanceY += Unpacked->AdvanceY; } -typedef struct kbts_indexed_glyph -{ - kbts_glyph *Glyph; - kbts_un Index; -} kbts_indexed_glyph; - -static int kbts_NextGlyph(kbts_unpacked_lookup *Lookup, kbts_glyph *InputGlyphs, kbts_un CurrentIndex, kbts_un InputGlyphCount, kbts_skip_flags SkipFlags, kbts_u32 SkipUnicodeFlags, kbts_indexed_glyph *IndexedGlyph) +static int kbts__NextGlyph(kbts_glyph_storage *Storage, kbts__unpacked_lookup *Lookup, kbts_glyph *AtGlyph, kbts__skip_flags SkipFlags, kbts_u32 SkipUnicodeFlags, kbts_glyph **Match, int Backward) { kbts_glyph *MatchingGlyph = 0; - kbts_un GlyphIndex = CurrentIndex; - while(GlyphIndex < InputGlyphCount) + while(kbts__GlyphIsValid(Storage, AtGlyph)) { - kbts_glyph *Glyph = &InputGlyphs[GlyphIndex]; - - if(!kbts_SkipGlyph(Glyph, Lookup, SkipFlags, SkipUnicodeFlags)) + if(!kbts__SkipGlyph(AtGlyph, Lookup, SkipFlags, SkipUnicodeFlags)) { - MatchingGlyph = Glyph; + MatchingGlyph = AtGlyph; break; } else { - GlyphIndex += 1; + AtGlyph = Backward ? AtGlyph->Prev : AtGlyph->Next; } } - IndexedGlyph->Glyph = MatchingGlyph; - IndexedGlyph->Index = GlyphIndex; + *Match = MatchingGlyph; return MatchingGlyph != 0; } -static void kbts_AttachGlyph(kbts_glyph_array *GlyphArray, kbts_glyph *Parent, kbts_glyph *Child, kbts_s32 X, kbts_s32 Y) +static void kbts__AttachGlyph(kbts_glyph_storage *Storage, kbts_glyph *Parent, kbts_glyph *Child, kbts_s32 X, kbts_s32 Y) { kbts_s32 DeltaOffsetX = X - Child->OffsetX; kbts_s32 DeltaOffsetY = Y - Child->OffsetY; @@ -17327,11 +20168,13 @@ static void kbts_AttachGlyph(kbts_glyph_array *GlyphArray, kbts_glyph *Parent, k Child->OffsetX = X; Child->OffsetY = Y; Child->Flags |= KBTS_GLYPH_FLAG_USED_IN_GPOS; - Child->AttachGlyphIndexPlusOne = (kbts_u16)(Parent - GlyphArray->Glyphs + 1); + Child->AttachGlyph = Parent; Parent->Flags |= KBTS_GLYPH_FLAG_USED_IN_GPOS; - for(kbts_glyph *MiddleGlyph = Parent + 1; MiddleGlyph < Child; ++MiddleGlyph) + for(kbts_glyph *MiddleGlyph = Parent->Next; + MiddleGlyph != Child; + MiddleGlyph = MiddleGlyph->Next) { MiddleGlyph->Flags |= KBTS_GLYPH_FLAG_NO_BREAK; } @@ -17339,144 +20182,167 @@ static void kbts_AttachGlyph(kbts_glyph_array *GlyphArray, kbts_glyph *Parent, k // @Speed: Fuck this. // Attachments can happen in anti-topological order, so we have to fix them up here. // We should store glyph parent/child indices instead of traversing all glyphs. - kbts_un ChildIndex = (kbts_un)(Child - GlyphArray->Glyphs); - KBTS_FOR(PostGlyphIndex, ChildIndex + 1, GlyphArray->Count) + for(kbts_glyph *PostGlyph = Child->Next; + kbts__GlyphIsValid(Storage, PostGlyph); + PostGlyph = PostGlyph->Next) { - kbts_glyph *Glyph = &GlyphArray->Glyphs[PostGlyphIndex]; - - if(Glyph->AttachGlyphIndexPlusOne == (ChildIndex + 1)) + if(PostGlyph->AttachGlyph == Child) { - Glyph->OffsetX += DeltaOffsetX; - Glyph->OffsetY += DeltaOffsetY; + PostGlyph->OffsetX += DeltaOffsetX; + PostGlyph->OffsetY += DeltaOffsetY; } } } -typedef struct kbts_do_single_adjustment_result +static void kbts__SetLookupOnePastLastGlyph(kbts__shape_scratchpad *Scratchpad, kbts_un Index, kbts_glyph *Glyph) { - kbts_un PositionedGlyphCount; - kbts_u32 PerformedAdjustment; -} kbts_do_single_adjustment_result; -static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_config *Config, kbts_lookup_list *LookupList, kbts_un LookupIndex, kbts_un SubtableIndex, kbts_unpacked_lookup *Lookup, kbts_u16 *Base, - kbts_glyph_array *GlyphArray, kbts_un CurrentGlyphIndex, kbts_skip_flags RequestedSkipFlags) -{ - KBTS_INSTRUMENT_FUNCTION_BEGIN - kbts_unicode_flags SkipUnicodeFlags = KBTS_UNICODE_FLAG_DEFAULT_IGNORABLE; - kbts_skip_flags RegularSkipFlags = KBTS_SKIP_FLAGS_GPOS_REGULAR(RequestedSkipFlags); - kbts_skip_flags SequenceSkipFlags = KBTS_SKIP_FLAGS_GPOS_SEQUENCE(RequestedSkipFlags); - kbts_do_single_adjustment_result Result = KBTS_ZERO; - kbts_glyph *CurrentGlyph = &GlyphArray->Glyphs[CurrentGlyphIndex]; - - if(kbts_GlyphsIncludedInLookupSubtable(Config->Font, 1, Lookup, LookupIndex, SubtableIndex, GlyphArray, CurrentGlyphIndex, SequenceSkipFlags, SkipUnicodeFlags)) + if(Index > Scratchpad->LookupOnePastLastGlyphIndex) { - Result.PerformedAdjustment = 1; + Scratchpad->LookupOnePastLastGlyphIndex = (kbts_u32)Index; + Scratchpad->LookupOnePastLastGlyph = Glyph; + } +} - // CAREFUL: We want kbts_unpacked_lookup to be a useful bag-of-arguments type, but, for extension +typedef kbts_u32 kbts__cursive_flags; +enum kbts__cursive_flags_enum +{ + KBTS__CURSIVE_FLAG_NONE, + KBTS__CURSIVE_FLAG_START = (1 << 0), + KBTS__CURSIVE_FLAG_END = (1 << 1), +}; + +KBTS_INLINE kbts__cursive_flags kbts__GetCursiveFlags(kbts_glyph *Glyph) +{ + kbts__cursive_flags Result = (kbts__cursive_flags)Glyph->MarkOrdering; + return Result; +} + +KBTS_INLINE void kbts__SetCursiveFlags(kbts_glyph *Glyph, kbts__cursive_flags CursiveFlags) +{ + Glyph->MarkOrdering = (kbts_u8)CursiveFlags; +} + +static int kbts__DoSingleAdjustment(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_glyph_storage *Storage, + kbts_lookup_list *LookupList, kbts_un LookupIndex, kbts_un SubtableIndex, kbts__unpacked_lookup *Lookup, kbts_u16 *Base, + kbts_glyph *CurrentGlyph, kbts_un StartIndex, kbts__skip_flags RequestedSkipFlags) +{ + KBTS_INSTRUMENT_FUNCTION_BEGIN; + kbts_unicode_flags SkipUnicodeFlags = KBTS_UNICODE_FLAG_DEFAULT_IGNORABLE; + kbts__skip_flags RegularSkipFlags = KBTS__SKIP_FLAGS_GPOS_REGULAR(RequestedSkipFlags); + kbts__skip_flags SequenceSkipFlags = KBTS__SKIP_FLAGS_GPOS_SEQUENCE(RequestedSkipFlags); + + int Result = 0; + + kbts_un OnePastLastGlyphIndex = StartIndex + 1; + kbts_glyph *OnePastLastGlyph = CurrentGlyph->Next; + + if(kbts__GlyphsIncludedInLookupSubtable(Storage, Config->Font, 1, Lookup, LookupIndex, SubtableIndex, CurrentGlyph, SequenceSkipFlags, SkipUnicodeFlags)) + { + // CAREFUL: We want kbts__unpacked_lookup to be a useful bag-of-arguments type, but, for extension // lookups, each subtable may specify its own lookup type, so we save it here and restore it at // the end of this function. kbts_u16 OriginalLookupType = Lookup->Type; while(Lookup->Type == 9) { - kbts_extension *Extension = (kbts_extension *)Base; + kbts__extension *Extension = (kbts__extension *)Base; Lookup->Type = Extension->LookupType; - Base = KBTS_POINTER_OFFSET(kbts_u16, Extension, Extension->Offset); + Base = KBTS__POINTER_OFFSET(kbts_u16, Extension, Extension->Offset); } - kbts_glyph *InputGlyphs = GlyphArray->Glyphs + CurrentGlyphIndex; - kbts_un InputGlyphCount = GlyphArray->Count - CurrentGlyphIndex; - - kbts_cover_glyph_result Cover = KBTS_ZERO; - Cover.Valid = kbts_GlyphPassesLookupFilter(CurrentGlyph, Lookup); - kbts_coverage *Coverage = 0; - if(Cover.Valid && kbts_GposLookupBeginsWithCoverage(Lookup->Type, Base[0])) + kbts__cover_glyph_result Cover = KBTS__ZERO; + Cover.Valid = kbts__GlyphPassesLookupFilter(CurrentGlyph, Lookup); + kbts__coverage *Coverage = 0; + if(Cover.Valid && kbts__GposLookupBeginsWithCoverage(Lookup->Type, Base[0])) { kbts_u16 *CoverageOffset = Base + 1; - Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Base, *CoverageOffset); - Cover = kbts_CoverGlyph(Coverage, CurrentGlyph->Id); + Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Base, *CoverageOffset); + Cover = kbts__CoverGlyph(Coverage, CurrentGlyph->Id); } if(Cover.Valid) { + kbts_un OnePastLastGlyphOffset = 0; + switch(Lookup->Type) { case 1: { - kbts_unpacked_value_record Unpacked = KBTS_ZERO; + kbts__unpacked_value_record Unpacked = KBTS__ZERO; if(Base[0] == 1) { - kbts_single_adjustment_1 *Adjust = (kbts_single_adjustment_1 *)Base; + kbts__single_adjustment_1 *Adjust = (kbts__single_adjustment_1 *)Base; - Unpacked = kbts_UnpackValueRecord(Adjust, Adjust->ValueFormat, KBTS_POINTER_AFTER(kbts_u16, Adjust)); + Unpacked = kbts__UnpackValueRecord(Adjust, Adjust->ValueFormat, KBTS__POINTER_AFTER(kbts_u16, Adjust)); } else if(Base[0] == 2) { - kbts_single_adjustment_2 *Adjust = (kbts_single_adjustment_2 *)Base; + kbts__single_adjustment_2 *Adjust = (kbts__single_adjustment_2 *)Base; - kbts_un RecordSize = kbts_PopCount32(Adjust->ValueFormat); - kbts_u16 *Records = KBTS_POINTER_AFTER(kbts_u16, Adjust); + kbts_un RecordSize = kbts__PopCount32(Adjust->ValueFormat); + kbts_u16 *Records = KBTS__POINTER_AFTER(kbts_u16, Adjust); kbts_u16 *Record = Records + RecordSize * Cover.Index; - Unpacked = kbts_UnpackValueRecord(Adjust, Adjust->ValueFormat, Record); + Unpacked = kbts__UnpackValueRecord(Adjust, Adjust->ValueFormat, Record); } - kbts_ApplyValueRecord(CurrentGlyph, &Unpacked); + kbts__ApplyValueRecord(CurrentGlyph, &Unpacked); CurrentGlyph->Flags |= KBTS_GLYPH_FLAG_USED_IN_GPOS; - Result.PositionedGlyphCount = 1; + Result = 1; } break; case 2: { - kbts_indexed_glyph NextGlyph; - if(kbts_NextGlyph(Lookup, InputGlyphs, 1, InputGlyphCount, RegularSkipFlags, SkipUnicodeFlags, &NextGlyph)) + kbts_glyph *NextGlyph; + if(kbts__NextGlyph(Storage, Lookup, CurrentGlyph->Next, RegularSkipFlags, SkipUnicodeFlags, &NextGlyph, 0)) { - kbts_u32 NextGlyphId = NextGlyph.Glyph->Id; + kbts_u32 NextGlyphId = NextGlyph->Id; - kbts_unpacked_value_record Unpacked1 = KBTS_ZERO; - kbts_unpacked_value_record Unpacked2 = KBTS_ZERO; + kbts__unpacked_value_record Unpacked1 = KBTS__ZERO; + kbts__unpacked_value_record Unpacked2 = KBTS__ZERO; int Valid = 0; if(Base[0] == 1) { - kbts_pair_adjustment_1 *Adjust = (kbts_pair_adjustment_1 *)Base; + kbts__pair_adjustment_1 *Adjust = (kbts__pair_adjustment_1 *)Base; - kbts_un Size1 = kbts_PopCount32(Adjust->ValueFormat1); - kbts_un Size2 = kbts_PopCount32(Adjust->ValueFormat2); + kbts_un Size1 = kbts__PopCount32(Adjust->ValueFormat1); + kbts_un Size2 = kbts__PopCount32(Adjust->ValueFormat2); - kbts_u16 *SetOffsets = KBTS_POINTER_AFTER(kbts_u16, Adjust); - kbts_pair_set *Set = KBTS_POINTER_OFFSET(kbts_pair_set, Adjust, SetOffsets[Cover.Index]); + kbts_u16 *SetOffsets = KBTS__POINTER_AFTER(kbts_u16, Adjust); + kbts__pair_set *Set = KBTS__POINTER_OFFSET(kbts__pair_set, Adjust, SetOffsets[Cover.Index]); kbts_un PairRecordSize = Size1 + Size2 + 1; // + 1 because each pair stores the next glyph ID. - kbts_pair_value_record *PairRecords = KBTS_POINTER_AFTER(kbts_pair_value_record, Set); - KBTS_FOR(PairIndex, 0, Set->Count) + kbts__pair_value_record *PairRecords = KBTS__POINTER_AFTER(kbts__pair_value_record, Set); + KBTS__FOR(PairIndex, 0, Set->Count) { - kbts_pair_value_record *PairRecord = PairRecords + PairRecordSize * PairIndex; + kbts__pair_value_record *PairRecord = PairRecords + PairRecordSize * PairIndex; if(PairRecord->SecondGlyph == NextGlyphId) { - kbts_u16 *Records = KBTS_POINTER_AFTER(kbts_u16, PairRecord); + kbts_u16 *Records = KBTS__POINTER_AFTER(kbts_u16, PairRecord); - Unpacked1 = kbts_UnpackValueRecord(Adjust, Adjust->ValueFormat1, Records); + Unpacked1 = kbts__UnpackValueRecord(Adjust, Adjust->ValueFormat1, Records); Records += Unpacked1.Size; - Unpacked2 = kbts_UnpackValueRecord(Adjust, Adjust->ValueFormat2, Records); + Unpacked2 = kbts__UnpackValueRecord(Adjust, Adjust->ValueFormat2, Records); Valid = 1; } } } else if(Base[0] == 2) { - kbts_pair_adjustment_2 *Adjust = (kbts_pair_adjustment_2 *)Base; - kbts_u16 *ClassDef1 = KBTS_POINTER_OFFSET(kbts_u16, Adjust, Adjust->ClassDefinition1Offset); - kbts_u16 *ClassDef2 = KBTS_POINTER_OFFSET(kbts_u16, Adjust, Adjust->ClassDefinition2Offset); + kbts__pair_adjustment_2 *Adjust = (kbts__pair_adjustment_2 *)Base; + kbts_u16 *ClassDef1 = KBTS__POINTER_OFFSET(kbts_u16, Adjust, Adjust->ClassDefinition1Offset); + kbts_u16 *ClassDef2 = KBTS__POINTER_OFFSET(kbts_u16, Adjust, Adjust->ClassDefinition2Offset); - kbts_un Size1 = kbts_PopCount32(Adjust->ValueFormat1); - kbts_un Size2 = kbts_PopCount32(Adjust->ValueFormat2); + kbts_un Size1 = kbts__PopCount32(Adjust->ValueFormat1); + kbts_un Size2 = kbts__PopCount32(Adjust->ValueFormat2); kbts_un PairRecordSize = Size1 + Size2; - kbts_u16 *PairRecords = KBTS_POINTER_AFTER(kbts_u16, Adjust); + kbts_u16 *PairRecords = KBTS__POINTER_AFTER(kbts_u16, Adjust); // From the Microsoft docs: // PairPosFormat2 requires that each glyph in all pairs be assigned to a class, which is @@ -17485,16 +20351,16 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi // class definition table, then we should skip the lookup. // However, this seems wrong in practice. Undefined classes seem to just default to 0, and then // the bounds check takes care of deciding whether the lookup is okay to apply or not. - kbts_glyph_class_from_table_result Class1 = kbts_GlyphClassFromTable(ClassDef1, CurrentGlyph->Id); - kbts_glyph_class_from_table_result Class2 = kbts_GlyphClassFromTable(ClassDef2, NextGlyphId); + kbts__glyph_class_from_table_result Class1 = kbts__GlyphClassFromTable(ClassDef1, CurrentGlyph->Id); + kbts__glyph_class_from_table_result Class2 = kbts__GlyphClassFromTable(ClassDef2, NextGlyphId); if((Class1.Class < Adjust->Class1Count) && (Class2.Class < Adjust->Class2Count)) { kbts_u16 *PairRecord = PairRecords + Class1.Class * PairRecordSize * Adjust->Class2Count + Class2.Class * PairRecordSize; - Unpacked1 = kbts_UnpackValueRecord(Adjust, Adjust->ValueFormat1, PairRecord); + Unpacked1 = kbts__UnpackValueRecord(Adjust, Adjust->ValueFormat1, PairRecord); PairRecord += Size1; - Unpacked2 = kbts_UnpackValueRecord(Adjust, Adjust->ValueFormat2, PairRecord); + Unpacked2 = kbts__UnpackValueRecord(Adjust, Adjust->ValueFormat2, PairRecord); PairRecord += Size2; Valid = 1; } @@ -17502,17 +20368,14 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi if(Valid) { - kbts_ApplyValueRecord(CurrentGlyph, &Unpacked1); + kbts__ApplyValueRecord(CurrentGlyph, &Unpacked1); CurrentGlyph->Flags |= KBTS_GLYPH_FLAG_USED_IN_GPOS; - kbts_ApplyValueRecord(&InputGlyphs[NextGlyph.Index], &Unpacked2); - NextGlyph.Glyph->Flags |= KBTS_GLYPH_FLAG_USED_IN_GPOS; + kbts__ApplyValueRecord(NextGlyph, &Unpacked2); + NextGlyph->Flags |= KBTS_GLYPH_FLAG_USED_IN_GPOS; - Result.PositionedGlyphCount = 2; - if(!Unpacked2.Size) - { - Result.PositionedGlyphCount = 1; - } + Result = 1; + OnePastLastGlyph = Unpacked2.Size ? NextGlyph->Next : CurrentGlyph->Next; } } } @@ -17521,35 +20384,25 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi // All three types of attachment (cursive, mark-to-base, mark-to-ligature) look backward instead of forward. case 3: { - kbts_cursive_attachment *Adjust = (kbts_cursive_attachment *)Base; - kbts_entry_exit *EntryExits = KBTS_POINTER_AFTER(kbts_entry_exit, Adjust); + kbts__cursive_attachment *Adjust = (kbts__cursive_attachment *)Base; + kbts__entry_exit *EntryExits = KBTS__POINTER_AFTER(kbts__entry_exit, Adjust); - kbts_glyph *Prev = 0; - for(kbts_un PrevIndex = CurrentGlyphIndex; PrevIndex > 0; --PrevIndex) - { - kbts_glyph *PrevGlyph = &GlyphArray->Glyphs[PrevIndex - 1]; - if(!kbts_SkipGlyph(PrevGlyph, Lookup, RegularSkipFlags, SkipUnicodeFlags)) - { - Prev = PrevGlyph; - break; - } - } - - if(Prev) + kbts_glyph *Prev; + if(kbts__NextGlyph(Storage, Lookup, CurrentGlyph->Prev, RegularSkipFlags, SkipUnicodeFlags, &Prev, 1)) { // For two cursive glyphs to be aligned, they both need to be defined by the same cursive attachment table. - kbts_cover_glyph_result PrevCover = kbts_CoverGlyph(Coverage, Prev->Id); + kbts__cover_glyph_result PrevCover = kbts__CoverGlyph(Coverage, Prev->Id); if(PrevCover.Valid) { // Get anchor points for both glyphs. - kbts_entry_exit *PrevEntryExit = &EntryExits[PrevCover.Index]; - kbts_entry_exit *EntryExit = &EntryExits[Cover.Index]; + kbts__entry_exit *PrevEntryExit = &EntryExits[PrevCover.Index]; + kbts__entry_exit *EntryExit = &EntryExits[Cover.Index]; if(PrevEntryExit->ExitAnchorOffset && EntryExit->EntryAnchorOffset) { - kbts_anchor *PrevExitAnchor = KBTS_POINTER_OFFSET(kbts_anchor, Adjust, PrevEntryExit->ExitAnchorOffset); - kbts_anchor *EntryAnchor = KBTS_POINTER_OFFSET(kbts_anchor, Adjust, EntryExit->EntryAnchorOffset); + kbts__anchor *PrevExitAnchor = KBTS__POINTER_OFFSET(kbts__anchor, Adjust, PrevEntryExit->ExitAnchorOffset); + kbts__anchor *EntryAnchor = KBTS__POINTER_OFFSET(kbts__anchor, Adjust, EntryExit->EntryAnchorOffset); kbts_s32 Anchor0X = PrevExitAnchor->X; kbts_s32 Anchor0Y = PrevExitAnchor->Y; kbts_s32 Anchor1X = EntryAnchor->X; @@ -17597,7 +20450,7 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi // invalid positions. The hope is that this does not matter in practice, because 'mark' is applied after // 'curs', and font designers are expected to know that and to know never to apply mark attachments // before cursive positioning, I guess. - if(!kbts_ShaperRtl(Config->Shaper)) + if(!kbts__ShaperRtl(Config->Shaper)) { Advance0X = Offset0X + Anchor0X; kbts_s32 Dx = -Anchor1X - Offset1X; @@ -17615,13 +20468,18 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi Prev->AdvanceX = Advance0X; Prev->OffsetX = Offset0X; Prev->Flags |= (KBTS_GLYPH_FLAG_CURSIVE | KBTS_GLYPH_FLAG_USED_IN_GPOS | KBTS_GLYPH_FLAG_NO_BREAK); + kbts__SetCursiveFlags(Prev, KBTS__CURSIVE_FLAG_START); CurrentGlyph->AdvanceX = Advance1X; CurrentGlyph->OffsetX = Offset1X; - CurrentGlyph->Flags |= (KBTS_GLYPH_FLAG_CURSIVE | KBTS_GLYPH_FLAG_USED_IN_GPOS); + CurrentGlyph->Flags |= KBTS_GLYPH_FLAG_CURSIVE | KBTS_GLYPH_FLAG_USED_IN_GPOS; + kbts__SetCursiveFlags(CurrentGlyph, KBTS__CURSIVE_FLAG_END); - for(kbts_glyph *CursiveGlyph = Prev + 1; CursiveGlyph < CurrentGlyph; ++CursiveGlyph) + for(kbts_glyph *CursiveGlyph = Prev->Next; + CursiveGlyph != CurrentGlyph; + CursiveGlyph = CursiveGlyph->Next) { CursiveGlyph->Flags |= KBTS_GLYPH_FLAG_NO_BREAK; + kbts__SetCursiveFlags(CursiveGlyph, 0); } // The second part is aligning the newly-formed cursive cluster to the "baseline". It is trickier than you'd expect. @@ -17639,10 +20497,11 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi // matters insofar as we need to align every other cursive glyph in its direction. kbts_s32 CursiveDy = 0; - kbts_un CursiveStartIndex = CurrentGlyphIndex; - kbts_un DIndex = 1; + kbts_glyph *CursiveGlyph = CurrentGlyph; + int Backward = 0; + kbts_u32 AdjustNearbyGlyphs = (CurrentGlyph->Flags & KBTS_GLYPH_FLAG_CURSIVE); - if(!(Lookup->Flags & KBTS_LOOKUP_FLAG_RIGHT_TO_LEFT)) + if(!(Lookup->Flags & KBTS__LOOKUP_FLAG_RIGHT_TO_LEFT)) { kbts_s32 NewOffset1Y = Offset0Y + Anchor0Y - Anchor1Y; CursiveDy = NewOffset1Y - Offset1Y; @@ -17651,25 +20510,42 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi { kbts_s32 NewOffset0Y = Offset1Y + Anchor1Y - Anchor0Y; CursiveDy = NewOffset0Y - Offset0Y; - DIndex = -1; - CursiveStartIndex = (kbts_un)(Prev - GlyphArray->Glyphs); + Backward = 1; + CursiveGlyph = Prev; + AdjustNearbyGlyphs = 1; } - for(kbts_un CursiveGlyphIndex = CursiveStartIndex; CursiveGlyphIndex < GlyphArray->Count; CursiveGlyphIndex += DIndex) + CursiveGlyph->OffsetY += CursiveDy; + + if(AdjustNearbyGlyphs) { - kbts_glyph *CursiveGlyph = &GlyphArray->Glyphs[CursiveGlyphIndex]; + kbts__SetCursiveFlags(CursiveGlyph, 0); + CursiveGlyph = Backward ? CursiveGlyph->Prev : CursiveGlyph->Next; - if(CursiveGlyph->Flags & KBTS_GLYPH_FLAG_CURSIVE) + kbts__cursive_flags StopFlag = Backward ? KBTS__CURSIVE_FLAG_END : KBTS__CURSIVE_FLAG_START; + + while(kbts__GlyphIsValid(Storage, CursiveGlyph)) { - CursiveGlyph->OffsetY += CursiveDy; - } - else if(CursiveGlyph->AdvanceX | CursiveGlyph->AdvanceY) // Ignore marks. - { - break; + kbts__cursive_flags CursiveFlags = kbts__GetCursiveFlags(CursiveGlyph); + + if(CursiveFlags & StopFlag) + { + break; + } + else if(CursiveGlyph->Flags & KBTS_GLYPH_FLAG_CURSIVE) + { + CursiveGlyph->OffsetY += CursiveDy; + } + else if(!(CursiveGlyph->Classes.Class & KBTS__GLYPH_CLASS_MARK)) // Ignore marks. + { + break; + } + + CursiveGlyph = Backward ? CursiveGlyph->Prev : CursiveGlyph->Next; } } - Result.PositionedGlyphCount = 1; + Result = 1; } } } @@ -17679,7 +20555,7 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi case 4: case 6: { - kbts_mark_to_base_attachment *Adjust = (kbts_mark_to_base_attachment *)Base; + kbts__mark_to_base_attachment *Adjust = (kbts__mark_to_base_attachment *)Base; // We want to know which glyph to attach to, and how far that glyph is from us. // To do that, we add up all advances between it and us. @@ -17688,27 +20564,51 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi // We have to take that into account here, and only accumulate mark advances for shapers that // don't do that zeroing at the end (either because they do it at the beginning of GPOS, or // because they don't do it at all). - int CountMarkAdvances = !kbts_ShaperClearsMarkAdvancesInPostGposFixup(Config->Shaper); + int CountMarkAdvances = !kbts__ShaperClearsMarkAdvancesInPostGposFixup(Config->Shaper); + kbts__coverage *BaseCoverage = KBTS__POINTER_OFFSET(kbts__coverage, Adjust, Adjust->BaseCoverageOffset); kbts_s32 AdvanceSinceBaseX = 0; kbts_s32 AdvanceSinceBaseY = 0; - kbts_u32 BaseClasses = Lookup->Type == 6 ? (1 << KBTS_GLYPH_CLASS_MARK) : (1 | (1 << KBTS_GLYPH_CLASS_BASE) | (1 << KBTS_GLYPH_CLASS_LIGATURE) | (1 << KBTS_GLYPH_CLASS_COMPONENT)); + kbts_u32 BaseClasses = Lookup->Type == 6 ? (1 << KBTS__GLYPH_CLASS_MARK) : (1 | (1 << KBTS__GLYPH_CLASS_BASE) | (1 << KBTS__GLYPH_CLASS_LIGATURE) | (1 << KBTS__GLYPH_CLASS_COMPONENT)); kbts_glyph *BaseGlyph = 0; - for(kbts_un PrevGlyphIndex = CurrentGlyphIndex; PrevGlyphIndex; --PrevGlyphIndex) + for(kbts_glyph *PrevGlyph = CurrentGlyph->Prev; kbts__GlyphIsValid(Storage, PrevGlyph); PrevGlyph = PrevGlyph->Prev) { - kbts_glyph *PrevGlyph = &GlyphArray->Glyphs[PrevGlyphIndex - 1]; - - if(CountMarkAdvances || (PrevGlyph->Classes.Class != KBTS_GLYPH_CLASS_MARK)) + if(CountMarkAdvances || (PrevGlyph->Classes.Class != KBTS__GLYPH_CLASS_MARK)) { AdvanceSinceBaseX += PrevGlyph->AdvanceX; AdvanceSinceBaseY += PrevGlyph->AdvanceY; } - if(!kbts_SkipGlyph(PrevGlyph, Lookup, RegularSkipFlags, SkipUnicodeFlags)) + if(!kbts__SkipGlyph(PrevGlyph, Lookup, RegularSkipFlags, SkipUnicodeFlags)) { if((1 << PrevGlyph->Classes.Class) & BaseClasses) { - BaseGlyph = PrevGlyph; - break; + // :MultipleSubstSadness + // There is some sadness when we have to look for bases here... + // In multiple substitutions, we allow skipping covered glyphs if they are: + // - Not the first in the multiple substitution + // - Not preceded by a mark + // + // More details on the sadness can be found here: + // https://github.com/harfbuzz/harfbuzz/issues/740 + // https://github.com/harfbuzz/harfbuzz/issues/1020 + // https://github.com/harfbuzz/harfbuzz/issues/4124 + if((Lookup->Type == 4) && + ((PrevGlyph->Flags & (KBTS_GLYPH_FLAG_FIRST_IN_MULTIPLE_SUBSTITUTION | KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION)) == KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION) && // Stop if we see the first of a multiple substitution. + (PrevGlyph->Prev->Classes.Class != KBTS__GLYPH_CLASS_MARK)) // Stop if we see any mark. + { + // Otherwise, we allow skipping uncovered glyphs. + kbts__cover_glyph_result BaseCover = kbts__CoverGlyph(BaseCoverage, PrevGlyph->Id); + if(BaseCover.Valid) + { + BaseGlyph = PrevGlyph; + break; + } + } + else + { + BaseGlyph = PrevGlyph; + break; + } } else if(Lookup->Type == 6) { @@ -17725,18 +20625,19 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi ((BaseGlyph->Flags | CurrentGlyph->Flags) & KBTS_GLYPH_FLAG_LIGATURE); // This is a mark-to-mark attachment, and either mark was created by a ligature substitution if(Ok) { - kbts_cover_glyph_result BaseCover = kbts_CoverGlyph(KBTS_POINTER_OFFSET(kbts_coverage, Adjust, Adjust->BaseCoverageOffset), BaseGlyph->Id); + // @Speed: This is duplicating work in the :MultipleSubstSadness case. + kbts__cover_glyph_result BaseCover = kbts__CoverGlyph(BaseCoverage, BaseGlyph->Id); if(BaseCover.Valid) { - kbts_base_array *BaseArray = KBTS_POINTER_OFFSET(kbts_base_array, Adjust, Adjust->BaseArrayOffset); - kbts_u16 *BaseAnchorOffsets = KBTS_POINTER_AFTER(kbts_u16, BaseArray) + BaseCover.Index * Adjust->MarkClassCount; - kbts_mark_info MarkInfo = kbts_GetMarkInfo(Adjust, Adjust->MarkArrayOffset, Cover.Index); + kbts__base_array *BaseArray = KBTS__POINTER_OFFSET(kbts__base_array, Adjust, Adjust->BaseArrayOffset); + kbts_u16 *BaseAnchorOffsets = KBTS__POINTER_AFTER(kbts_u16, BaseArray) + BaseCover.Index * Adjust->MarkClassCount; + kbts__mark_info MarkInfo = kbts__GetMarkInfo(Adjust, Adjust->MarkArrayOffset, Cover.Index); kbts_u16 BaseAnchorOffset = BaseAnchorOffsets[MarkInfo.Record->Class]; if(BaseAnchorOffset) { - kbts_anchor *BaseAnchor = KBTS_POINTER_OFFSET(kbts_anchor, BaseArray, BaseAnchorOffset); + kbts__anchor *BaseAnchor = KBTS__POINTER_OFFSET(kbts__anchor, BaseArray, BaseAnchorOffset); /* From the Microsoft docs: When a mark is combined with a given base, the mark placement is adjusted so that the mark anchor is @@ -17747,9 +20648,9 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi kbts_s32 NewOffsetX = BaseGlyph->OffsetX - AdvanceSinceBaseX + (BaseAnchor->X - MarkInfo.Anchor->X); kbts_s32 NewOffsetY = BaseGlyph->OffsetY - AdvanceSinceBaseY + (BaseAnchor->Y - MarkInfo.Anchor->Y); - kbts_AttachGlyph(GlyphArray, BaseGlyph, CurrentGlyph, NewOffsetX, NewOffsetY); + kbts__AttachGlyph(Storage, BaseGlyph, CurrentGlyph, NewOffsetX, NewOffsetY); - Result.PositionedGlyphCount = 1; + Result = 1; } } } @@ -17759,18 +20660,19 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi case 5: { - kbts_mark_to_ligature_attachment *Adjust = (kbts_mark_to_ligature_attachment *)Base; + kbts__mark_to_ligature_attachment *Adjust = (kbts__mark_to_ligature_attachment *)Base; kbts_s32 AdvanceSinceBaseX = 0; kbts_s32 AdvanceSinceBaseY = 0; - kbts_u32 BaseClasses = (1 | (1 << KBTS_GLYPH_CLASS_BASE) | (1 << KBTS_GLYPH_CLASS_LIGATURE) | (1 << KBTS_GLYPH_CLASS_COMPONENT)); + kbts_u32 BaseClasses = (1 | (1 << KBTS__GLYPH_CLASS_BASE) | (1 << KBTS__GLYPH_CLASS_LIGATURE) | (1 << KBTS__GLYPH_CLASS_COMPONENT)); kbts_glyph *LigatureGlyph = 0; - for(kbts_un PrevGlyphIndex = CurrentGlyphIndex; PrevGlyphIndex; --PrevGlyphIndex) + for(kbts_glyph *PrevGlyph = CurrentGlyph->Prev; + kbts__GlyphIsValid(Storage, PrevGlyph); + PrevGlyph = PrevGlyph->Prev) { - kbts_glyph *PrevGlyph = &GlyphArray->Glyphs[PrevGlyphIndex - 1]; AdvanceSinceBaseX += PrevGlyph->AdvanceX; AdvanceSinceBaseY += PrevGlyph->AdvanceY; - if(!kbts_SkipGlyph(PrevGlyph, Lookup, RegularSkipFlags, SkipUnicodeFlags) && ((1 << PrevGlyph->Classes.Class) & BaseClasses)) + if(!kbts__SkipGlyph(PrevGlyph, Lookup, RegularSkipFlags, SkipUnicodeFlags) && ((1 << PrevGlyph->Classes.Class) & BaseClasses)) { LigatureGlyph = PrevGlyph; break; @@ -17779,25 +20681,25 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi if(LigatureGlyph) { - kbts_cover_glyph_result LigatureCover = kbts_CoverGlyph(KBTS_POINTER_OFFSET(kbts_coverage, Adjust, Adjust->LigatureCoverageOffset), + kbts__cover_glyph_result LigatureCover = kbts__CoverGlyph(KBTS__POINTER_OFFSET(kbts__coverage, Adjust, Adjust->LigatureCoverageOffset), LigatureGlyph->Id); if(LigatureCover.Valid) { - kbts_ligature_array *LigatureArray = KBTS_POINTER_OFFSET(kbts_ligature_array, Adjust, Adjust->LigatureArrayOffset); - kbts_ligature_attach *LigatureAttach = kbts_GetLigatureAttach(LigatureArray, LigatureCover.Index); - kbts_mark_info MarkInfo = kbts_GetMarkInfo(Adjust, Adjust->MarkArrayOffset, Cover.Index); - kbts_un LigatureComponentIndex = CurrentGlyph->LigatureComponentIndexPlusOne; + kbts__ligature_array *LigatureArray = KBTS__POINTER_OFFSET(kbts__ligature_array, Adjust, Adjust->LigatureArrayOffset); + kbts__ligature_attach *LigatureAttach = kbts__GetLigatureAttach(LigatureArray, LigatureCover.Index); + kbts__mark_info MarkInfo = kbts__GetMarkInfo(Adjust, Adjust->MarkArrayOffset, Cover.Index); + kbts_un LigatureComponentIndexPlusOne = CurrentGlyph->LigatureComponentIndexPlusOne; if(CurrentGlyph->LigatureUid != LigatureGlyph->Uid) { // If the mark is not yet attached to the ligature, attach it now. // Apparently, in this case, the mark should be considered part of the _last_ component of the ligature. - LigatureComponentIndex = LigatureAttach->Count; + LigatureComponentIndexPlusOne = LigatureAttach->Count; } - if(CurrentGlyph->LigatureComponentIndexPlusOne <= LigatureAttach->Count) + if(LigatureComponentIndexPlusOne <= LigatureAttach->Count) { - kbts_un AnchorIndex = LigatureComponentIndex; + kbts_un AnchorIndex = LigatureComponentIndexPlusOne; if(AnchorIndex) { AnchorIndex -= 1; @@ -17807,26 +20709,28 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi AnchorIndex = LigatureAttach->Count - 1; } - kbts_anchor *LigatureAnchor = kbts_GetLigatureAttachAnchor(Adjust, LigatureAttach, MarkInfo.Record->Class, AnchorIndex); + kbts__anchor *LigatureAnchor = kbts__GetLigatureAttachAnchor(Adjust, LigatureAttach, MarkInfo.Record->Class, AnchorIndex); kbts_s32 NewOffsetX = LigatureGlyph->OffsetX - AdvanceSinceBaseX + (LigatureAnchor->X - MarkInfo.Anchor->X); kbts_s32 NewOffsetY = LigatureGlyph->OffsetY - AdvanceSinceBaseY + (LigatureAnchor->Y - MarkInfo.Anchor->Y); - kbts_AttachGlyph(GlyphArray, LigatureGlyph, CurrentGlyph, NewOffsetX, NewOffsetY); + kbts__AttachGlyph(Storage, LigatureGlyph, CurrentGlyph, NewOffsetX, NewOffsetY); - CurrentGlyph->LigatureComponentIndexPlusOne = (kbts_u16)LigatureComponentIndex; + CurrentGlyph->LigatureComponentIndexPlusOne = (kbts_u16)LigatureComponentIndexPlusOne; CurrentGlyph->LigatureUid = LigatureGlyph->Uid; // I'm not sure why, but Harfbuzz only clears this in mark-to-ligature substitutions, and not in mark-to-base or // mark-to-mark. CurrentGlyph->AdvanceX = 0; CurrentGlyph->AdvanceY = 0; - for(kbts_glyph *MiddleGlyph = LigatureGlyph + 1; MiddleGlyph < CurrentGlyph; ++MiddleGlyph) + for(kbts_glyph *MiddleGlyph = LigatureGlyph->Next; + MiddleGlyph != CurrentGlyph; + MiddleGlyph = MiddleGlyph->Next) { MiddleGlyph->Flags |= KBTS_GLYPH_FLAG_NO_BREAK; } - Result.PositionedGlyphCount = 1; + Result = 1; } } } @@ -17836,265 +20740,257 @@ static kbts_do_single_adjustment_result kbts_DoSingleAdjustment(kbts_shape_confi case 7: case 8: { - kbts_sequence_lookup_result SequenceLookup = kbts_DoSequenceLookup(Lookup, Base, Cover, GlyphArray, CurrentGlyphIndex, SequenceSkipFlags, SkipUnicodeFlags); + kbts__sequence_lookup_result SequenceLookup = kbts__DoSequenceLookup(Storage, Lookup, Base, Cover, CurrentGlyph, SequenceSkipFlags, SkipUnicodeFlags); if(SequenceLookup.RecordCount) { - KBTS_FOR(RecordIndex, 0, SequenceLookup.RecordCount) + KBTS__FOR(RecordIndex, 0, SequenceLookup.RecordCount) { - kbts_sequence_lookup_record *Record = &SequenceLookup.Records[RecordIndex]; - kbts_lookup *PackedRecordLookup = kbts_GetLookup(LookupList, Record->LookupListIndex); - kbts_unpacked_lookup RecordLookup = kbts_UnpackLookup(Config->Font->Gdef, PackedRecordLookup); + kbts__sequence_lookup_record *Record = &SequenceLookup.Records[RecordIndex]; + kbts__lookup *PackedRecordLookup = kbts__GetLookup(LookupList, Record->LookupListIndex); + kbts__unpacked_lookup RecordLookup = kbts__UnpackLookup(kbts__BlobTableDataType(Config->Font->Blob, KBTS_BLOB_TABLE_ID_GDEF, kbts__gdef), PackedRecordLookup); - kbts_un NestedCurrentGlyphIndex = CurrentGlyphIndex; + kbts_glyph *NestedCurrentGlyph = CurrentGlyph; + kbts_un NestedCurrentGlyphIndex = 0; { // Figure out where in the input sequence we need to apply the lookup. kbts_un SequenceIndex = 0; - KBTS_FOR(InputGlyphIndex, 0, InputGlyphCount) + for(kbts_glyph *Glyph = CurrentGlyph; + kbts__GlyphIsValid(Storage, Glyph); + Glyph = Glyph->Next) { - kbts_un NestedIndex = CurrentGlyphIndex + InputGlyphIndex; - kbts_glyph *Glyph = &GlyphArray->Glyphs[NestedIndex]; - - if(!kbts_SkipGlyph(Glyph, Lookup, SequenceSkipFlags, SkipUnicodeFlags)) + if(!kbts__SkipGlyph(Glyph, Lookup, SequenceSkipFlags, SkipUnicodeFlags)) { if(SequenceIndex == Record->SequenceIndex) { - NestedCurrentGlyphIndex = NestedIndex; + NestedCurrentGlyph = Glyph; break; } SequenceIndex += 1; } + + NestedCurrentGlyphIndex += 1; } } - KBTS_FOR(NestedSubtableIndex, 0, RecordLookup.SubtableCount) + KBTS__FOR(NestedSubtableIndex, 0, RecordLookup.SubtableCount) { - kbts_u16 *NestedBase = KBTS_POINTER_OFFSET(kbts_u16, PackedRecordLookup, RecordLookup.SubtableOffsets[NestedSubtableIndex]); + kbts_u16 *NestedBase = KBTS__POINTER_OFFSET(kbts_u16, PackedRecordLookup, RecordLookup.SubtableOffsets[NestedSubtableIndex]); - kbts_DoSingleAdjustment(Config, LookupList, Record->LookupListIndex, NestedSubtableIndex, &RecordLookup, NestedBase, GlyphArray, NestedCurrentGlyphIndex, RequestedSkipFlags); + kbts__DoSingleAdjustment(Scratchpad, Config, Storage, LookupList, + Record->LookupListIndex, NestedSubtableIndex, &RecordLookup, NestedBase, + NestedCurrentGlyph, StartIndex + NestedCurrentGlyphIndex, RequestedSkipFlags); } } - Result.PositionedGlyphCount = SequenceLookup.InputSequenceCountIncludingSkippedGlyphs; + OnePastLastGlyphIndex = StartIndex + SequenceLookup.InputSequenceCountIncludingSkippedGlyphs; + OnePastLastGlyph = SequenceLookup.OnePastLastGlyphMatched; } } break; } + + kbts__SetLookupOnePastLastGlyph(Scratchpad, OnePastLastGlyphIndex + OnePastLastGlyphOffset, OnePastLastGlyph); } Lookup->Type = OriginalLookupType; } - if(!Result.PositionedGlyphCount) - { - Result.PositionedGlyphCount = 1; - Result.PerformedAdjustment = 0; - } - - KBTS_INSTRUMENT_END + KBTS_INSTRUMENT_FUNCTION_END; return Result; } -typedef kbts_u32 kbts_mcm_sequence_state; -enum kbts_mcm_sequence_state_enum +typedef kbts_u32 kbts__mcm_sequence_state; +enum kbts__mcm_sequence_state_enum { - KBTS_MCM_SEQUENCE_STATE_NONE, - KBTS_MCM_SEQUENCE_STATE_OUT, - KBTS_MCM_SEQUENCE_STATE_IN, + KBTS__MCM_SEQUENCE_STATE_NONE, + KBTS__MCM_SEQUENCE_STATE_OUT, + KBTS__MCM_SEQUENCE_STATE_IN, }; -typedef kbts_u32 kbts_hangul_syllable_type; -enum kbts_hangul_syllable_type_enum +typedef kbts_u32 kbts__hangul_syllable_type; +enum kbts__hangul_syllable_type_enum { - KBTS_HANGUL_SYLLABLE_TYPE_NONE, + KBTS__HANGUL_SYLLABLE_TYPE_NONE, - KBTS_HANGUL_SYLLABLE_TYPE_L, - KBTS_HANGUL_SYLLABLE_TYPE_V, - KBTS_HANGUL_SYLLABLE_TYPE_T, - KBTS_HANGUL_SYLLABLE_TYPE_LV, - KBTS_HANGUL_SYLLABLE_TYPE_LVT, + KBTS__HANGUL_SYLLABLE_TYPE_L, + KBTS__HANGUL_SYLLABLE_TYPE_V, + KBTS__HANGUL_SYLLABLE_TYPE_T, + KBTS__HANGUL_SYLLABLE_TYPE_LV, + KBTS__HANGUL_SYLLABLE_TYPE_LVT, - KBTS_HANGUL_SYLLABLE_TYPE_COUNT, + KBTS__HANGUL_SYLLABLE_TYPE_COUNT, }; -typedef struct kbts_hangul_syllable_info +typedef struct kbts__hangul_syllable_info { - kbts_hangul_syllable_type Type; + kbts__hangul_syllable_type Type; kbts_u32 Composable; -} kbts_hangul_syllable_info; +} kbts__hangul_syllable_info; -static kbts_hangul_syllable_info kbts_HangulSyllableInfo(kbts_u32 Codepoint) +static kbts__hangul_syllable_info kbts__HangulSyllableInfo(kbts_u32 Codepoint) { - kbts_hangul_syllable_info Result = KBTS_ZERO; + kbts__hangul_syllable_info Result = KBTS__ZERO; if((Codepoint >= 0x1100) && (Codepoint <= 0x115F)) { - Result.Type = KBTS_HANGUL_SYLLABLE_TYPE_L; + Result.Type = KBTS__HANGUL_SYLLABLE_TYPE_L; Result.Composable = (Codepoint < 0x1113); } else if((Codepoint >= 0x1160) && (Codepoint <= 0x11A7)) { - Result.Type = KBTS_HANGUL_SYLLABLE_TYPE_V; + Result.Type = KBTS__HANGUL_SYLLABLE_TYPE_V; Result.Composable = ((Codepoint >= 0x1161) & (Codepoint <= 0x1175)); } else if((Codepoint >= 0x11A8) && (Codepoint <= 0x11FF)) { - Result.Type = KBTS_HANGUL_SYLLABLE_TYPE_T; + Result.Type = KBTS__HANGUL_SYLLABLE_TYPE_T; Result.Composable = (Codepoint < 0x11C3); } else if((Codepoint >= 0xA960) && (Codepoint <= 0xA97C)) { - Result.Type = KBTS_HANGUL_SYLLABLE_TYPE_L; + Result.Type = KBTS__HANGUL_SYLLABLE_TYPE_L; } else if((Codepoint == 0xAC00) && (Codepoint <= 0xD7A3)) { - Result.Type = KBTS_HANGUL_SYLLABLE_TYPE_LVT; + Result.Type = KBTS__HANGUL_SYLLABLE_TYPE_LVT; if(!((Codepoint - 0xAC00) % 28)) { - Result.Type = KBTS_HANGUL_SYLLABLE_TYPE_LV; + Result.Type = KBTS__HANGUL_SYLLABLE_TYPE_LV; } } else if((Codepoint >= 0xD7B0) && (Codepoint <= 0xD7C6)) { - Result.Type = KBTS_HANGUL_SYLLABLE_TYPE_V; + Result.Type = KBTS__HANGUL_SYLLABLE_TYPE_V; } else if((Codepoint >= 0xD7CB) && (Codepoint <= 0xD7FB)) { - Result.Type = KBTS_HANGUL_SYLLABLE_TYPE_T; + Result.Type = KBTS__HANGUL_SYLLABLE_TYPE_T; } return Result; } -KBTS_INLINE kbts_u32 kbts_SyllabicClassIsConsonant(kbts_indic_syllabic_class Class) +KBTS_INLINE kbts_u32 kbts__SyllabicClassIsConsonant(kbts_indic_syllabic_class Class) { kbts_u32 Result = - KBTS_IN_SET(Class, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_CONSONANT)(KBTS_INDIC_SYLLABIC_CLASS_RA)(KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_WITH_STACKER)(KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_MEDIAL))); + KBTS__IN_SET(Class, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_CONSONANT)(KBTS_INDIC_SYLLABIC_CLASS_RA)(KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_WITH_STACKER)(KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_MEDIAL))); return Result; } enum { - KBTS_FEATURE_MATCH_FLAG_KA_JA = (1 << 0), - KBTS_FEATURE_MATCH_FLAG_SSA_NYA = (1 << 1), - KBTS_FEATURE_MATCH_FLAG_RA_HA_VA = (1 << 2), - KBTS_FEATURE_MATCH_FLAG_YA = (1 << 3), - KBTS_FEATURE_MATCH_FLAG_CONSONANT = (1 << 4), - KBTS_FEATURE_MATCH_FLAG_NUKTA = (1 << 5), - KBTS_FEATURE_MATCH_FLAG_HALANT = (1 << 6), - KBTS_FEATURE_MATCH_FLAG_ZWJ = (1 << 7), - KBTS_FEATURE_MATCH_FLAG_ZWNJ = (1 << 8), - KBTS_FEATURE_MATCH_FLAG_INITIAL = (1 << 10), - KBTS_FEATURE_MATCH_FLAG_POST_BASE = (1 << 11), + KBTS__FEATURE_MATCH_FLAG_KA_JA = (1 << 0), + KBTS__FEATURE_MATCH_FLAG_SSA_NYA = (1 << 1), + KBTS__FEATURE_MATCH_FLAG_RA_HA_VA = (1 << 2), + KBTS__FEATURE_MATCH_FLAG_YA = (1 << 3), + KBTS__FEATURE_MATCH_FLAG_CONSONANT = (1 << 4), + KBTS__FEATURE_MATCH_FLAG_NUKTA = (1 << 5), + KBTS__FEATURE_MATCH_FLAG_HALANT = (1 << 6), + KBTS__FEATURE_MATCH_FLAG_ZWJ = (1 << 7), + KBTS__FEATURE_MATCH_FLAG_ZWNJ = (1 << 8), + KBTS__FEATURE_MATCH_FLAG_INITIAL = (1 << 10), + KBTS__FEATURE_MATCH_FLAG_POST_BASE = (1 << 11), - KBTS_FEATURE_MATCH_FLAG_RPHF = KBTS_FEATURE_FLAG0(rphf), + KBTS__FEATURE_MATCH_FLAG_RPHF = KBTS__FEATURE_FLAG0(rphf), }; -# define KBTS_FEATURE_MATCH_MASK(W0, W1, W2, W3) (((kbts_u64)(W0) << 48) | ((kbts_u64)(W1) << 32) | ((kbts_u64)(W0) << 16) | (kbts_u64)(W0)) -# define KBTS_FEATURE_MATCH_MASK_AKHN KBTS_FEATURE_MATCH_MASK(0, KBTS_FEATURE_MATCH_FLAG_KA_JA, KBTS_FEATURE_MATCH_FLAG_HALANT, KBTS_FEATURE_MATCH_FLAG_SSA_NYA) -# define KBTS_FEATURE_MATCH_MASK_BLWF_PRE KBTS_FEATURE_MATCH_MASK(0, 0, KBTS_FEATURE_MATCH_FLAG_RA_HA_VA | KBTS_FEATURE_MATCH_FLAG_INITIAL, KBTS_FEATURE_MATCH_FLAG_HALANT) -# define KBTS_FEATURE_MATCH_MASK_BLWF_PRE_OK KBTS_FEATURE_MATCH_MASK(0, 0, KBTS_FEATURE_MATCH_FLAG_RA_HA_VA, KBTS_FEATURE_MATCH_FLAG_HALANT) -# define KBTS_FEATURE_MATCH_MASK_BLWF_POST KBTS_FEATURE_MATCH_MASK(0, 0, KBTS_FEATURE_MATCH_FLAG_HALANT, KBTS_FEATURE_MATCH_FLAG_RA_HA_VA) -# define KBTS_FEATURE_MATCH_MASK_CJCT KBTS_FEATURE_MATCH_MASK(0, KBTS_FEATURE_MATCH_FLAG_CONSONANT, KBTS_FEATURE_MATCH_FLAG_HALANT, KBTS_FEATURE_MATCH_FLAG_CONSONANT) -# define KBTS_FEATURE_MATCH_MASK_HALF KBTS_FEATURE_MATCH_MASK(KBTS_FEATURE_MATCH_FLAG_CONSONANT | KBTS_FEATURE_MATCH_FLAG_RPHF | KBTS_FEATURE_MATCH_FLAG_POST_BASE, KBTS_FEATURE_MATCH_FLAG_HALANT, KBTS_FEATURE_MATCH_FLAG_ZWNJ, KBTS_FEATURE_MATCH_FLAG_CONSONANT) -# define KBTS_FEATURE_MATCH_MASK_HALF_OK KBTS_FEATURE_MATCH_MASK(KBTS_FEATURE_MATCH_FLAG_CONSONANT, KBTS_FEATURE_MATCH_FLAG_HALANT, 0, 0) -# define KBTS_FEATURE_MATCH_MASK_NUKT KBTS_FEATURE_MATCH_MASK(0, 0, KBTS_FEATURE_MATCH_FLAG_CONSONANT, KBTS_FEATURE_MATCH_FLAG_HALANT) -# define KBTS_FEATURE_MATCH_MASK_PSTF KBTS_FEATURE_MATCH_MASK(0, 0, KBTS_FEATURE_MATCH_FLAG_HALANT | KBTS_FEATURE_MATCH_FLAG_INITIAL, KBTS_FEATURE_MATCH_FLAG_YA) -# define KBTS_FEATURE_MATCH_MASK_VATU KBTS_FEATURE_MATCH_MASK(0, KBTS_FEATURE_MATCH_FLAG_CONSONANT, KBTS_FEATURE_MATCH_FLAG_HALANT, KBTS_FEATURE_MATCH_FLAG_RA_HA_VA) +# define KBTS__FEATURE_MATCH_MASK(W0, W1, W2, W3) (((kbts_u64)(W0) << 48) | ((kbts_u64)(W1) << 32) | ((kbts_u64)(W0) << 16) | (kbts_u64)(W0)) +# define KBTS__FEATURE_MATCH_MASK_AKHN KBTS__FEATURE_MATCH_MASK(0, KBTS__FEATURE_MATCH_FLAG_KA_JA, KBTS__FEATURE_MATCH_FLAG_HALANT, KBTS__FEATURE_MATCH_FLAG_SSA_NYA) +# define KBTS__FEATURE_MATCH_MASK_BLWF_PRE KBTS__FEATURE_MATCH_MASK(0, 0, KBTS__FEATURE_MATCH_FLAG_RA_HA_VA | KBTS__FEATURE_MATCH_FLAG_INITIAL, KBTS__FEATURE_MATCH_FLAG_HALANT) +# define KBTS__FEATURE_MATCH_MASK_BLWF_PRE_OK KBTS__FEATURE_MATCH_MASK(0, 0, KBTS__FEATURE_MATCH_FLAG_RA_HA_VA, KBTS__FEATURE_MATCH_FLAG_HALANT) +# define KBTS__FEATURE_MATCH_MASK_BLWF_POST KBTS__FEATURE_MATCH_MASK(0, 0, KBTS__FEATURE_MATCH_FLAG_HALANT, KBTS__FEATURE_MATCH_FLAG_RA_HA_VA) +# define KBTS__FEATURE_MATCH_MASK_CJCT KBTS__FEATURE_MATCH_MASK(0, KBTS__FEATURE_MATCH_FLAG_CONSONANT, KBTS__FEATURE_MATCH_FLAG_HALANT, KBTS__FEATURE_MATCH_FLAG_CONSONANT) +# define KBTS__FEATURE_MATCH_MASK_HALF KBTS__FEATURE_MATCH_MASK(KBTS__FEATURE_MATCH_FLAG_CONSONANT | KBTS__FEATURE_MATCH_FLAG_RPHF | KBTS__FEATURE_MATCH_FLAG_POST_BASE, KBTS__FEATURE_MATCH_FLAG_HALANT, KBTS__FEATURE_MATCH_FLAG_ZWNJ, KBTS__FEATURE_MATCH_FLAG_CONSONANT) +# define KBTS__FEATURE_MATCH_MASK_HALF_OK KBTS__FEATURE_MATCH_MASK(KBTS__FEATURE_MATCH_FLAG_CONSONANT, KBTS__FEATURE_MATCH_FLAG_HALANT, 0, 0) +# define KBTS__FEATURE_MATCH_MASK_NUKT KBTS__FEATURE_MATCH_MASK(0, 0, KBTS__FEATURE_MATCH_FLAG_CONSONANT, KBTS__FEATURE_MATCH_FLAG_HALANT) +# define KBTS__FEATURE_MATCH_MASK_PSTF KBTS__FEATURE_MATCH_MASK(0, 0, KBTS__FEATURE_MATCH_FLAG_HALANT | KBTS__FEATURE_MATCH_FLAG_INITIAL, KBTS__FEATURE_MATCH_FLAG_YA) +# define KBTS__FEATURE_MATCH_MASK_VATU KBTS__FEATURE_MATCH_MASK(0, KBTS__FEATURE_MATCH_FLAG_CONSONANT, KBTS__FEATURE_MATCH_FLAG_HALANT, KBTS__FEATURE_MATCH_FLAG_RA_HA_VA) -typedef kbts_u32 kbts_substitution_result_flags; -enum kbts_substitution_result_flags_enum +typedef kbts_u32 kbts__substitution_result_flags; +enum kbts__substitution_result_flags_enum { - KBTS_SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION = (1 << 0), - KBTS_SUBSTITUTION_RESULT_FLAG_GROW_BUFFER = (1 << 1), + KBTS__SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION = (1 << 0), + KBTS__SUBSTITUTION_RESULT_FLAG_TRIED_TO_INSERT_WHILE_CHECK_ONLY = (1 << 1), }; -static kbts_substitution_result_flags kbts_DoSubstitution(kbts_shape_state *ShapeState, kbts_lookup_list *LookupList, kbts_gsub_frame *Frames, kbts_u32 *FrameCount_, - kbts_glyph_array *GlyphArray, kbts_u32 CheckOnly, kbts_skip_flags RequestedSkipFlags, kbts_u32 GeneratedGlyphFlags) +static void kbts__BeginLookupApplication(kbts__shape_scratchpad *Scratchpad, kbts_glyph *Glyph) { - kbts_substitution_result_flags Result = 0; - kbts_font *Font = ShapeState->Config->Font; - kbts_glyph *Glyphs = GlyphArray->Glyphs; + Scratchpad->LookupOnePastLastGlyph = Glyph->Next; + Scratchpad->LookupOnePastLastGlyphIndex = 0; +} + +static kbts_glyph *kbts__EndLookupApplication(kbts__shape_scratchpad *Scratchpad) +{ + kbts_glyph *Result = Scratchpad->LookupOnePastLastGlyph; + return Result; +} + +static kbts__substitution_result_flags kbts__DoSubstitution(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_glyph_storage *Storage, + kbts_lookup_list *LookupList, kbts__gsub_frame *Frames, kbts_un *FrameCount_, + int CheckOnly, kbts__skip_flags RequestedSkipFlags, kbts_u32 GeneratedGlyphFlags) +{ + kbts__substitution_result_flags Result = 0; + kbts_font *Font = Config->Font; kbts_unicode_flags SkipUnicodeFlags = 0; // @Incomplete - kbts_skip_flags RegularSkipFlags = KBTS_SKIP_FLAGS_GSUB_REGULAR(RequestedSkipFlags); - kbts_skip_flags SequenceSkipFlags = KBTS_SKIP_FLAGS_GSUB_SEQUENCE(RequestedSkipFlags); + kbts__skip_flags RegularSkipFlags = KBTS__SKIP_FLAGS_GSUB_REGULAR(RequestedSkipFlags); + kbts__skip_flags SequenceSkipFlags = KBTS__SKIP_FLAGS_GSUB_SEQUENCE(RequestedSkipFlags); GeneratedGlyphFlags |= KBTS_GLYPH_FLAG_GENERATED_BY_GSUB; kbts_un FrameCount = *FrameCount_; - kbts_gsub_frame *Frame = &Frames[FrameCount - 1]; + kbts__gsub_frame *Frame = &Frames[FrameCount - 1]; - kbts_lookup *PackedLookup = kbts_GetLookup(LookupList, Frame->LookupIndex); - kbts_unpacked_lookup Lookup = kbts_UnpackLookup(Font->Gdef, PackedLookup); + kbts__lookup *PackedLookup = kbts__GetLookup(LookupList, Frame->LookupIndex); + kbts__unpacked_lookup Lookup = kbts__UnpackLookup(kbts__BlobTableDataType(Font->Blob, KBTS_BLOB_TABLE_ID_GDEF, kbts__gdef), PackedLookup); kbts_u16 BaseLookupType = Lookup.Type; while(Frame->SubtableIndex < Lookup.SubtableCount) { - kbts_u16 *Subtable = KBTS_POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[Frame->SubtableIndex]); + kbts_u16 *Subtable = KBTS__POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[Frame->SubtableIndex]); // In a type-7 lookup, each subtable can specify a different lookup type. - // We still want to pass kbts_unpacked_lookup around as a useful bag of arguments, though. + // We still want to pass kbts__unpacked_lookup around as a useful bag of arguments, though. // So, we restore the original lookup's type here before resolving each subtable. Lookup.Type = BaseLookupType; while(Lookup.Type == 7) { - kbts_extension *Extension = (kbts_extension *)Subtable; + kbts__extension *Extension = (kbts__extension *)Subtable; Lookup.Type = Extension->LookupType; - Subtable = KBTS_POINTER_OFFSET(kbts_u16, Extension, Extension->Offset); + Subtable = KBTS__POINTER_OFFSET(kbts_u16, Extension, Extension->Offset); } - // :ReverseChaining - // From the Microsoft docs: - // In processing a reverse chaining substitution, i begins at the logical end of the string and moves to the beginning. - // This comment only makes sense when the reverse chaining substitution happens at the top level. - // When it _is_ at the top level, we know we are just doing a linear scan through the string, and since this is a single - // substitution (i.e. one glyph -> one glyph), we know the size of the buffer won't change throughout the scan. - // Given all of this, handling the reverse-scanning nature of this lookup actually becomes very easy: - if((Lookup.Type == 8) && (FrameCount == 1)) - { - Frame->InputGlyphIndex = (kbts_u16)(GlyphArray->Count - 1 - Frame->InputGlyphIndex); - } + kbts_glyph *CurrentGlyph = Frame->InputGlyph; - kbts_glyph *CurrentGlyph = &Glyphs[Frame->InputGlyphIndex]; - kbts_glyph_array InputGlyphs = kbts_GlyphSubArray(GlyphArray, Frame->InputGlyphIndex); - - kbts_skip_flags SkipFlags = (Lookup.Type >= 5) ? SequenceSkipFlags : RegularSkipFlags; - if(kbts_GlyphsIncludedInLookupSubtable(Font, 0, &Lookup, Frame->LookupIndex, Frame->SubtableIndex, GlyphArray, Frame->InputGlyphIndex, SkipFlags, SkipUnicodeFlags)) + kbts__skip_flags SkipFlags = (Lookup.Type >= 5) ? SequenceSkipFlags : RegularSkipFlags; + if(kbts__GlyphsIncludedInLookupSubtable(Storage, Font, 0, &Lookup, Frame->LookupIndex, Frame->SubtableIndex, CurrentGlyph, SkipFlags, SkipUnicodeFlags)) { - kbts_cover_glyph_result Cover = KBTS_ZERO; - Cover.Valid = kbts_GlyphPassesLookupFilter(CurrentGlyph, &Lookup); - if(Cover.Valid && kbts_GsubLookupBeginsWithCoverage(Lookup.Type, Subtable[0])) + kbts__cover_glyph_result Cover = KBTS__ZERO; + Cover.Valid = kbts__GlyphPassesLookupFilter(CurrentGlyph, &Lookup); + if(Cover.Valid && kbts__GsubLookupBeginsWithCoverage(Lookup.Type, Subtable[0])) { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Subtable, Subtable[1]); - Cover = kbts_CoverGlyph(Coverage, CurrentGlyph->Id); + kbts__coverage *Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Subtable, Subtable[1]); + Cover = kbts__CoverGlyph(Coverage, CurrentGlyph->Id); } if(Cover.Valid) { - kbts_un DeltaGlyphCount = 0; + kbts_un OnePastLastGlyphOffset = 1; + kbts_glyph *OnePastLastGlyph = CurrentGlyph->Next; if((Lookup.Type == 5) || (Lookup.Type == 6)) { - kbts_sequence_lookup_result SequenceLookup = kbts_DoSequenceLookup(&Lookup, Subtable, Cover, GlyphArray, Frame->InputGlyphIndex, SequenceSkipFlags, SkipUnicodeFlags); + kbts__sequence_lookup_result SequenceLookup = kbts__DoSequenceLookup(Storage, &Lookup, Subtable, Cover, CurrentGlyph, SequenceSkipFlags, SkipUnicodeFlags); if(SequenceLookup.Matched) { - KBTS_FOR(FrameIndex, 0, FrameCount - 1) - { - kbts_gsub_frame *ParentFrame = &Frames[FrameIndex]; - - if((ParentFrame->InputGlyphIndex < (Frame->InputGlyphIndex + SequenceLookup.InputSequenceCountIncludingSkippedGlyphs)) && - ((ParentFrame->InputGlyphIndex + ParentFrame->InputGlyphCount) > Frame->InputGlyphIndex)) - { - ParentFrame->InputGlyphCount += (kbts_u16)(SequenceLookup.InputSequenceCountIncludingSkippedGlyphs - Frame->InputGlyphCount); - } - } - - Frame->InputGlyphCount = (kbts_u16)SequenceLookup.InputSequenceCountIncludingSkippedGlyphs; Frame->Records = SequenceLookup.Records; Frame->RecordCount = (kbts_u16)SequenceLookup.RecordCount; Frame->RecordIndex = 0; Frame->SubtableIndex = 0xFFFE; + + OnePastLastGlyphOffset = SequenceLookup.InputSequenceCountIncludingSkippedGlyphs; + OnePastLastGlyph = SequenceLookup.OnePastLastGlyphMatched; } } else @@ -18105,11 +21001,11 @@ static kbts_substitution_result_flags kbts_DoSubstitution(kbts_shape_state *Shap { case 1: { - Result |= KBTS_SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION; + Result |= KBTS__SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION; if(!CheckOnly) { - kbts_single_substitution *Subst = (kbts_single_substitution *)Subtable; + kbts__single_substitution *Subst = (kbts__single_substitution *)Subtable; kbts_u16 NewId = 0; if(Subst->Format == 1) @@ -18120,88 +21016,101 @@ static kbts_substitution_result_flags kbts_DoSubstitution(kbts_shape_state *Shap } else if(Subst->Format == 2) { - kbts_u16 *SubstituteGlyphIds = KBTS_POINTER_AFTER(kbts_u16, Subst); + kbts_u16 *SubstituteGlyphIds = KBTS__POINTER_AFTER(kbts_u16, Subst); NewId = SubstituteGlyphIds[Cover.Index]; } - kbts_GsubMutate(Font, CurrentGlyph, NewId, GeneratedGlyphFlags); + kbts__GsubMutate(Font, CurrentGlyph, NewId, GeneratedGlyphFlags); } } break; case 2: { - Result |= KBTS_SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION; + kbts__multiple_substitution *Subst = (kbts__multiple_substitution *)Subtable; + kbts__sequence *Sequence = kbts__GetSequence(Subst, Cover.Index); + Result |= KBTS__SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION; if(!CheckOnly) { - kbts_multiple_substitution *Subst = (kbts_multiple_substitution *)Subtable; - kbts_sequence *Sequence = kbts_GetSequence(Subst, Cover.Index); - kbts_u16 *SubstGlyphIds = KBTS_POINTER_AFTER(kbts_u16, Sequence); + kbts_u16 *SubstGlyphIds = KBTS__POINTER_AFTER(kbts_u16, Sequence); kbts_un GrowCount = Sequence->GlyphCount - 1; - if(!kbts_GrowGlyphArray(0, &InputGlyphs, 0, GrowCount, 0, 0)) - { - Result |= KBTS_SUBSTITUTION_RESULT_FLAG_GROW_BUFFER; - kbts_TransferGrowRequest(&InputGlyphs, GlyphArray); - goto Cleanup; + if(Sequence->GlyphCount) + { + kbts_glyph OriginalGlyph = *CurrentGlyph; + kbts_glyph *LastInsert = CurrentGlyph; + KBTS__FOR(SubstGlyphIndex, 0, Sequence->GlyphCount) + { + kbts_u32 NewGlyphFlags = GeneratedGlyphFlags | KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION; + + kbts_glyph *NewGlyph = CurrentGlyph; + if(SubstGlyphIndex) + { + NewGlyph = kbts__InsertGlyphAfter(Storage, LastInsert, &OriginalGlyph); + + if(!NewGlyph) + { + Scratchpad->Error = KBTS_SHAPE_ERROR_OUT_OF_MEMORY; + return Result; + } + + NewGlyph->Uid = (kbts_u16)++Scratchpad->NextGlyphUid; + } + else + { + NewGlyphFlags |= KBTS_GLYPH_FLAG_FIRST_IN_MULTIPLE_SUBSTITUTION; + } + + kbts__GsubMutate(Font, NewGlyph, SubstGlyphIds[SubstGlyphIndex], GeneratedGlyphFlags | NewGlyphFlags); + LastInsert = NewGlyph; + } + + OnePastLastGlyph = LastInsert->Next; } - DeltaGlyphCount += GrowCount; - - kbts_glyph OriginalGlyph = *CurrentGlyph; - KBTS_FOR(SubstGlyphIndex, 0, Sequence->GlyphCount) + else { - kbts_glyph NewGlyph = OriginalGlyph; - kbts_GsubMutate(Font, &NewGlyph, SubstGlyphIds[SubstGlyphIndex], GeneratedGlyphFlags | KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION); - if(SubstGlyphIndex) - { - NewGlyph.Uid = (kbts_u16)++ShapeState->NextGlyphUid; - } - else - { - NewGlyph.Flags |= KBTS_GLYPH_FLAG_FIRST_IN_MULTIPLE_SUBSTITUTION; - } - Glyphs[Frame->InputGlyphIndex + SubstGlyphIndex] = NewGlyph; + kbts__FreeGlyph(Scratchpad, Storage, CurrentGlyph); } - Frame->InputGlyphCount = Sequence->GlyphCount; + OnePastLastGlyphOffset = 1 + GrowCount; // Shift other frames' input cursors. - KBTS_FOR(FrameIndex, 0, FrameCount - 1) + KBTS__FOR(FrameIndex, 0, FrameCount - 1) { - kbts_gsub_frame *OtherFrame = &Frames[FrameIndex]; + kbts__gsub_frame *OtherFrame = &Frames[FrameIndex]; - if(OtherFrame->InputGlyphIndex > Frame->InputGlyphIndex) + if(OtherFrame->StartIndex > Frame->StartIndex) { - OtherFrame->InputGlyphIndex = (kbts_u16)(OtherFrame->InputGlyphIndex + GrowCount); - } - else if((OtherFrame->InputGlyphIndex + OtherFrame->InputGlyphCount) > Frame->InputGlyphIndex) - { - OtherFrame->InputGlyphCount = (kbts_u16)(OtherFrame->InputGlyphCount + GrowCount); + OtherFrame->StartIndex = (kbts_u16)(OtherFrame->StartIndex + GrowCount); } } } + else if(Sequence->GlyphCount > 1) + { + Result |= KBTS__SUBSTITUTION_RESULT_FLAG_TRIED_TO_INSERT_WHILE_CHECK_ONLY; + } } break; case 3: { - Result |= KBTS_SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION; + Result |= KBTS__SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION; if(!CheckOnly) { - kbts_alternate_substitution *Subst = (kbts_alternate_substitution *)Subtable; - kbts_alternate_set *Set = kbts_GetAlternateSet(Subst, Cover.Index); - kbts_u16 *AltGlyphIds = KBTS_POINTER_AFTER(kbts_u16, Set); + kbts__alternate_substitution *Subst = (kbts__alternate_substitution *)Subtable; + kbts__alternate_set *Set = kbts__GetAlternateSet(Subst, Cover.Index); + kbts_u16 *AltGlyphIds = KBTS__POINTER_AFTER(kbts_u16, Set); kbts_un AlternateIndex = 0; { - kbts_feature_set *ShaperFeatures = ShapeState->Config->Features; + kbts__feature_set *ShaperFeatures = &Config->Features; kbts_glyph_config *GlyphConfig = CurrentGlyph->Config; if(GlyphConfig) { int HasOverride = 0; - KBTS_FOR(WordIndex, 0, KBTS_ARRAY_LENGTH(GlyphConfig->EnabledFeatures.Flags)) + KBTS__FOR(WordIndex, 0, KBTS__ARRAY_LENGTH(GlyphConfig->EnabledFeatures.Flags)) { kbts_u64 Flags = GlyphConfig->EnabledFeatures.Flags[WordIndex] & ShaperFeatures->Flags[WordIndex]; if(Flags) @@ -18213,22 +21122,25 @@ static kbts_substitution_result_flags kbts_DoSubstitution(kbts_shape_state *Shap if(HasOverride) { - kbts_op_state_gsub *Gsub = &ShapeState->OpState.OpSpecific.Gsub; - KBTS_FOR(OverrideIndex, 0, GlyphConfig->FeatureOverrideCount) + for(kbts__feature_override_header *OverrideHeader = GlyphConfig->FeatureOverrideSentinel.Next; + OverrideHeader != &GlyphConfig->FeatureOverrideSentinel; + OverrideHeader = OverrideHeader->Next) { - kbts_feature_override *Override = &GlyphConfig->FeatureOverrides[OverrideIndex]; - kbts_u32 EnabledOrAlternatePlusOne = Override->EnabledOrAlternatePlusOne; + kbts__feature_override *Override = (kbts__feature_override *)OverrideHeader; + int Value = Override->Value; + kbts__feature_id Id = kbts__FeatureTagToId(Override->Tag); - if(EnabledOrAlternatePlusOne && kbts_ContainsFeature(&Gsub->LookupFeatures, Override->Id)) + if(Value && + kbts__ContainsFeature(&Scratchpad->LookupFeatures, Id)) { int Match = 1; - if(!Override->Id) + if(!Id) { // Slow path for unregistered features. Match = 0; - KBTS_FOR(UnregisteredFeatureIndex, 0, ShapeState->OpState.UnregisteredFeatureCount) + KBTS__FOR(UnregisteredFeatureIndex, 0, Scratchpad->UnregisteredFeatureCount) { - if(Override->Tag == ShapeState->OpState.UnregisteredFeatureTags[UnregisteredFeatureIndex]) + if(Override->Tag == Scratchpad->UnregisteredFeatureTags[UnregisteredFeatureIndex]) { Match = 1; break; @@ -18238,7 +21150,8 @@ static kbts_substitution_result_flags kbts_DoSubstitution(kbts_shape_state *Shap if(Match) { - AlternateIndex = EnabledOrAlternatePlusOne - 1; + AlternateIndex = (kbts_un)(Value - 1); + break; } } @@ -18253,157 +21166,204 @@ static kbts_substitution_result_flags kbts_DoSubstitution(kbts_shape_state *Shap } kbts_u16 NewId = AltGlyphIds[AlternateIndex]; - kbts_GsubMutate(Font, CurrentGlyph, NewId, GeneratedGlyphFlags); + kbts__GsubMutate(Font, CurrentGlyph, NewId, GeneratedGlyphFlags); } } break; case 4: { - kbts_ligature_substitution *Subst = (kbts_ligature_substitution *)Subtable; - kbts_ligature_set *Set = kbts_GetLigatureSet(Subst, Cover.Index); + kbts__ligature_substitution *Subst = (kbts__ligature_substitution *)Subtable; + kbts__ligature_set *Set = kbts__GetLigatureSet(Subst, Cover.Index); - KBTS_FOR(LigatureIndex, 0, Set->Count) + KBTS__FOR(LigatureIndex, 0, Set->Count) { - kbts_ligature *Ligature = kbts_GetLigature(Set, LigatureIndex); - kbts_u16 *ComponentIds = KBTS_POINTER_AFTER(kbts_u16, Ligature); + kbts__ligature *Ligature = kbts__GetLigature(Set, LigatureIndex); + kbts_u16 *ComponentIds = KBTS__POINTER_AFTER(kbts_u16, Ligature); + + kbts_un MatchingGlyphCount = 1; - if(Ligature->ComponentCount <= InputGlyphs.Count) { - kbts_un MatchingGlyphCount = 1; - + kbts_glyph *LigatureGlyphCursor = CurrentGlyph->Next; + while(kbts__GlyphIsValid(Storage, LigatureGlyphCursor) && (MatchingGlyphCount < Ligature->ComponentCount)) { - kbts_un InputIndex = 1; - while((InputIndex < InputGlyphs.Count) && (MatchingGlyphCount < Ligature->ComponentCount)) + // A ligature may contain an explicit ZWJ, which SkipGlyph() would probably skip. + // The expected behavior in that case is to assume the font designer knows what they are doing + // and match the ZWJ. + if(LigatureGlyphCursor->Id == ComponentIds[MatchingGlyphCount - 1]) { - kbts_glyph *Glyph = &InputGlyphs.Glyphs[InputIndex]; - // A ligature may contain an explicit ZWJ, which SkipGlyph() would probably skip. - // The expected behavior in that case is to assume the font designer knows what they are doing - // and match the ZWJ. - if(Glyph->Id == ComponentIds[MatchingGlyphCount - 1]) - { - MatchingGlyphCount += 1; - } - else if(!kbts_SkipGlyph(Glyph, &Lookup, RegularSkipFlags, SkipUnicodeFlags)) - { - break; - } - InputIndex += 1; + MatchingGlyphCount += 1; } - } - - if(MatchingGlyphCount == Ligature->ComponentCount) - { - Result |= KBTS_SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION; - - if(!CheckOnly) + else if(!kbts__SkipGlyph(LigatureGlyphCursor, &Lookup, RegularSkipFlags, SkipUnicodeFlags)) { - kbts_u32 LigatureUid = ++ShapeState->NextGlyphUid; + break; + } - { // For glyphs that aren't part of the ligature, store which component it is attached to. - // For glyphs that _are_, eat them. - kbts_un LigatureGlyphCount = 1; - kbts_un ReadCursor = 1; - kbts_un WriteCursor = 1; + LigatureGlyphCursor = LigatureGlyphCursor->Next; + } + } - while((LigatureGlyphCount < InputGlyphs.Count) && (LigatureGlyphCount < Ligature->ComponentCount) && (ReadCursor < InputGlyphs.Count)) + if(MatchingGlyphCount == Ligature->ComponentCount) + { + Result |= KBTS__SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION; + + if(!CheckOnly) + { + kbts_u32 LigatureUid = ++Scratchpad->NextGlyphUid; + kbts_un ComponentCount = Ligature->ComponentCount; + + { // For glyphs that aren't part of the ligature, store which component it is attached to. + // For glyphs that _are_, eat them. + kbts_un LigatureGlyphCount = 1; + kbts_un GrowCount = 0; + + // Consider this example: + // ABCD -> DB (A and C form a ligature) + // DB -> DEB (E is inserted in whatever way) + // DEB -> FB (D and E form a ligature) + // In that case, 'B' was supposed to be attached to D, but D does not exist anymore. + // To handle this case, we go through the ligature, counting the total flattened components + // and the ligature info of the last glyph that is part of the ligature. + // Then, all trailing marks get are re-attached to the new ligature, and their component indices + // are adjusted to take into account the new (flattened) component count. + // (I say 'flattened' here because a previous ligature glyph counts as multiple components.) + kbts_un PreviousLigatureUid = CurrentGlyph->LigatureUid; + kbts_un PreviousComponentCount = CurrentGlyph->LigatureComponentCount; + if(!PreviousComponentCount) + { + PreviousComponentCount = 1; + } + kbts_un RunningComponentCount = PreviousComponentCount; + + kbts_glyph *LigatureGlyphCursor = CurrentGlyph->Next; + while(kbts__GlyphIsValid(Storage, LigatureGlyphCursor) && (LigatureGlyphCount < ComponentCount)) + { + kbts_glyph *Next = LigatureGlyphCursor->Next; + + if(LigatureGlyphCursor->Id == ComponentIds[LigatureGlyphCount - 1]) { - kbts_glyph *Glyph = &InputGlyphs.Glyphs[ReadCursor]; - - if(Glyph->Id == ComponentIds[LigatureGlyphCount - 1]) + PreviousLigatureUid = LigatureGlyphCursor->LigatureUid; + PreviousComponentCount = LigatureGlyphCursor->LigatureComponentCount; + if(!PreviousComponentCount) { - LigatureGlyphCount += 1; - ReadCursor += 1; + PreviousComponentCount = 1; } - else if(kbts_SkipGlyph(Glyph, &Lookup, RegularSkipFlags, SkipUnicodeFlags)) - { - Glyph->LigatureComponentIndexPlusOne = (kbts_u16)LigatureGlyphCount; - Glyph->LigatureUid = (kbts_u16)LigatureUid; + RunningComponentCount += PreviousComponentCount; - InputGlyphs.Glyphs[WriteCursor++] = InputGlyphs.Glyphs[ReadCursor++]; + LigatureGlyphCount += 1; + + // Eat! + kbts__FreeGlyph(Scratchpad, Storage, LigatureGlyphCursor); + GrowCount -= 1; + } + else if(kbts__SkipGlyph(LigatureGlyphCursor, &Lookup, RegularSkipFlags, SkipUnicodeFlags)) + { + LigatureGlyphCursor->LigatureComponentIndexPlusOne = (kbts_u16)LigatureGlyphCount; + LigatureGlyphCursor->LigatureUid = (kbts_u16)LigatureUid; + LigatureGlyphCursor->LigatureComponentCount = (kbts_u16)ComponentCount; + } + else + { + break; + } + + LigatureGlyphCursor = Next; + } + + OnePastLastGlyph = CurrentGlyph->Next; + + // Re-attach trailing marks that were part of a component ligature to the new ligature. + if(PreviousLigatureUid) + { + kbts_un DeltaComponentCount = RunningComponentCount - PreviousComponentCount; + + while(kbts__GlyphIsValid(Storage, LigatureGlyphCursor)) + { + kbts_un PreviousComponentIndexPlusOne = LigatureGlyphCursor->LigatureComponentIndexPlusOne; + + if((LigatureGlyphCursor->Classes.Class == KBTS__GLYPH_CLASS_MARK) && + (LigatureGlyphCursor->LigatureUid == PreviousLigatureUid) && + PreviousComponentIndexPlusOne) + { + if(PreviousComponentIndexPlusOne > PreviousComponentCount) + { + PreviousComponentIndexPlusOne = PreviousComponentCount; + } + + kbts_un NewComponentIndexPlusOne = PreviousComponentIndexPlusOne + DeltaComponentCount; + + LigatureGlyphCursor->LigatureUid = (kbts_u16)LigatureUid; + LigatureGlyphCursor->LigatureComponentIndexPlusOne = (kbts_u16)NewComponentIndexPlusOne; } else { break; } - } - // Finish moving all non-ligature glyphs in their place. - // We are effectively shrinking the whole buffer here, so we have to touch - // glyphs outside of our own cluster. - kbts_un GrowCount = WriteCursor - ReadCursor; // Negative - kbts_GrowGlyphArray(0, &InputGlyphs, WriteCursor, GrowCount, 0, 0); - DeltaGlyphCount += GrowCount; - - // Update frame input cursors. - KBTS_FOR(FrameIndex, 0, FrameCount - 1) - { - kbts_gsub_frame *OtherFrame = &Frames[FrameIndex]; - - if(OtherFrame->InputGlyphIndex >= Frame->InputGlyphIndex) - { - kbts_un OtherInputIndex = OtherFrame->InputGlyphIndex + GrowCount; - OtherInputIndex = KBTS_MAX(OtherInputIndex, Frame->InputGlyphIndex); - OtherFrame->InputGlyphIndex = (kbts_u16)OtherInputIndex; - } - else - { - kbts_un End = OtherFrame->InputGlyphIndex + OtherFrame->InputGlyphCount; - End = KBTS_MIN(End, GlyphArray->TotalCount); - OtherFrame->InputGlyphCount = (kbts_u16)(End - OtherFrame->InputGlyphIndex); - } + LigatureGlyphCursor = LigatureGlyphCursor->Next; } } - // Currently, we only take the main glyph's config into account while making the ligature's config. - // Maybe we should merge all of the components' configs into one instead? - kbts_GsubMutate(Font, CurrentGlyph, Ligature->Glyph, GeneratedGlyphFlags | KBTS_GLYPH_FLAG_LIGATURE); - CurrentGlyph->Uid = (kbts_u16)LigatureUid; - // Harfbuzz does this, because Uniscribe does this, and so we do the same. Sigh. - CurrentGlyph->Flags &= ~KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION; + // Update frame input cursors. + KBTS__FOR(FrameIndex, 0, FrameCount - 1) + { + kbts__gsub_frame *OtherFrame = &Frames[FrameIndex]; + + if(OtherFrame->StartIndex >= Frame->StartIndex) + { + OtherFrame->StartIndex += (kbts_u16)GrowCount; + } + } } - break; + // Currently, we only take the main glyph's config into account while making the ligature's config. + // Maybe we should merge all of the components' configs into one instead? + kbts__GsubMutate(Font, CurrentGlyph, Ligature->Glyph, GeneratedGlyphFlags | KBTS_GLYPH_FLAG_LIGATURE); + CurrentGlyph->Uid = (kbts_u16)LigatureUid; + CurrentGlyph->LigatureUid = (kbts_u16)LigatureUid; + CurrentGlyph->LigatureComponentCount = (kbts_u16)ComponentCount; + + // Harfbuzz does this, because Uniscribe does this, and so we do the same. Sigh. + CurrentGlyph->Flags &= ~KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION; } + + break; } } } break; case 8: { - kbts_reverse_chain_substitution *Subst = (kbts_reverse_chain_substitution *)Subtable; - kbts_unpacked_reverse_chain_substitution Unpacked = kbts_UnpackReverseChainSubstitution(Subst, 0); + kbts__reverse_chain_substitution *Subst = (kbts__reverse_chain_substitution *)Subtable; + kbts__unpacked_reverse_chain_substitution Unpacked = kbts__UnpackReverseChainSubstitution(Subst, 0); // :BoundsChecking if(Cover.Index < Unpacked.GlyphCount) { // Should we use regular or sequence skip flags here? - kbts_glyph_array BacktrackGlyphs = kbts_ClipGlyphArray(GlyphArray, Frame->InputGlyphIndex); - kbts_sequence_match BacktrackMatch = kbts_MatchCoverageSequence(&Lookup, RegularSkipFlags, SkipUnicodeFlags, Subst, Unpacked.BacktrackCoverageOffsets, Unpacked.BacktrackCount, - &BacktrackGlyphs, (kbts_un)Frame->InputGlyphIndex - 1, -1); - kbts_glyph_array FollowupGlyphs = kbts_GlyphSubArray(&InputGlyphs, 1); - kbts_sequence_match LookaheadMatch = kbts_MatchCoverageSequence(&Lookup, RegularSkipFlags, SkipUnicodeFlags, Subst, Unpacked.LookaheadCoverageOffsets, Unpacked.LookaheadCount, - &FollowupGlyphs, 0, 1); + kbts__sequence_match BacktrackMatch = kbts__MatchCoverageSequence(Storage, &Lookup, RegularSkipFlags, SkipUnicodeFlags, Subst, Unpacked.BacktrackCoverageOffsets, Unpacked.BacktrackCount, + CurrentGlyph->Prev, 1); + kbts__sequence_match LookaheadMatch = kbts__MatchCoverageSequence(Storage, &Lookup, RegularSkipFlags, SkipUnicodeFlags, Subst, Unpacked.LookaheadCoverageOffsets, Unpacked.LookaheadCount, + CurrentGlyph->Next, 0); if((BacktrackMatch.MatchCount == Unpacked.BacktrackCount) && (LookaheadMatch.MatchCount == Unpacked.LookaheadCount)) { - Result |= KBTS_SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION; - kbts_GsubMutate(Font, CurrentGlyph, Unpacked.SubstituteGlyphIds[Cover.Index], GeneratedGlyphFlags); + Result |= KBTS__SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION; + kbts__GsubMutate(Font, CurrentGlyph, Unpacked.SubstituteGlyphIds[Cover.Index], GeneratedGlyphFlags); } } } break; } - if(Result & KBTS_SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION) + if(Result & KBTS__SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION) { Frame->SubtableIndex = 0xFFFE; // From the Microsoft docs: // To move to the “next” glyph, the client skips all the glyphs that participated in the lookup operation: // glyphs that were substituted/positioned as well as any other glyphs in the matched input sequence. - - GlyphArray->Count += DeltaGlyphCount; - GlyphArray->TotalCount += DeltaGlyphCount; } } + + kbts__SetLookupOnePastLastGlyph(Scratchpad, Frame->StartIndex + OnePastLastGlyphOffset, OnePastLastGlyph); } } @@ -18412,39 +21372,43 @@ static kbts_substitution_result_flags kbts_DoSubstitution(kbts_shape_state *Shap if(Frame->RecordIndex < Frame->RecordCount) { - kbts_sequence_lookup_record *SequenceRecord = &Frame->Records[Frame->RecordIndex++]; + kbts__sequence_lookup_record *SequenceRecord = &Frame->Records[Frame->RecordIndex++]; - kbts_gsub_frame NewFrame = KBTS_ZERO; - NewFrame.LookupIndex = SequenceRecord->LookupListIndex; - NewFrame.SubtableIndex = 0; - NewFrame.InputGlyphIndex = Frame->InputGlyphIndex; - - if(SequenceRecord->SequenceIndex) + if(FrameCount < KBTS_LOOKUP_STACK_SIZE) { - // @Speed: Re-scan the sequence to find where we are in the _filtered_ sequence. - kbts_un SequenceInputIndex = 0; - KBTS_FOR(FilterAt, Frame->InputGlyphIndex + 1, GlyphArray->Count) + kbts__gsub_frame NewFrame = KBTS__ZERO; + NewFrame.LookupIndex = SequenceRecord->LookupListIndex; + NewFrame.StartIndex = Frame->StartIndex; + NewFrame.InputGlyph = Frame->InputGlyph; + + if(SequenceRecord->SequenceIndex) { - kbts_glyph *FilterGlyph = &Glyphs[FilterAt]; - - // @Incomplete: SequenceSkipFlags? 0? - // What do we use here? - if(!kbts_SkipGlyph(FilterGlyph, &Lookup, 0, SkipUnicodeFlags)) + // @Speed: Re-scan the sequence to find where we are in the _filtered_ sequence. + kbts_un SequenceInputIndex = 0; + for(kbts_glyph *FilterGlyph = Frame->InputGlyph->Next; + kbts__GlyphIsValid(Storage, FilterGlyph); + FilterGlyph = FilterGlyph->Next) { - SequenceInputIndex += 1; - - if(SequenceInputIndex == SequenceRecord->SequenceIndex) + // @Incomplete: SequenceSkipFlags? 0? + // What do we use here? + if(!kbts__SkipGlyph(FilterGlyph, &Lookup, 0, SkipUnicodeFlags)) { - NewFrame.InputGlyphIndex = (kbts_u16)FilterAt; + SequenceInputIndex += 1; - break; + if(SequenceInputIndex == SequenceRecord->SequenceIndex) + { + NewFrame.InputGlyph = FilterGlyph; + + break; + } } + + NewFrame.StartIndex += 1; } } - } - NewFrame.InputGlyphCount = 1; - Frames[FrameCount++] = NewFrame; + Frames[FrameCount++] = NewFrame; + } } // Only actually pop the frame if we haven't pushed anything else in the meantime. @@ -18453,101 +21417,175 @@ static kbts_substitution_result_flags kbts_DoSubstitution(kbts_shape_state *Shap FrameCount -= 1; } -Cleanup:; - *FrameCount_ = (kbts_u32)FrameCount; + *FrameCount_ = FrameCount; return Result; } -static kbts_u32 kbts_WouldSubstitute(kbts_shape_state *ShapeState, kbts_lookup_list *LookupList, kbts_gsub_frame *Frames, kbts_feature *Feature, kbts_skip_flags SkipFlags, kbts_glyph *Glyphs, kbts_un GlyphCount) +static kbts__glyph_list kbts__PushGlyphList(kbts_glyph_storage *Storage, kbts_glyph *First, kbts_glyph *Last) { - kbts_u32 Result = 0; - kbts_glyph_array GlyphArray = kbts_GlyphArray(Glyphs, GlyphCount, GlyphCount, GlyphCount); + kbts__glyph_list Result = KBTS__ZERO; - kbts_iterate_lookups IterateLookups = kbts_IterateLookups(LookupList, Feature); - while(kbts_NextLookup(&IterateLookups)) + Result.SentinelPrev = Storage->GlyphSentinel.Prev; + Result.SentinelNext = Storage->GlyphSentinel.Next; + Result.OneBeforeFirst = First->Prev; + Result.OnePastLast = Last->Next; + + First->Prev = Last->Next = (kbts_glyph *)&Storage->GlyphSentinel; + First->Prev->Next = First; + Last->Next->Prev = Last; + + return Result; +} + +static void kbts__PopGlyphList(kbts_glyph_storage *Storage, kbts__glyph_list *List) +{ + List->OneBeforeFirst->Next = Storage->GlyphSentinel.Next; + List->OnePastLast->Prev = Storage->GlyphSentinel.Prev; + + // Storage->GlyphSentinel.Prev->Next = Storage->GlyphSentinel.Next->Prev = &Storage->GlyphSentinel; + + if((kbts_glyph *)&Storage->GlyphSentinel != List->OneBeforeFirst) { - kbts_un GlyphIndex = 0; + Storage->GlyphSentinel.Next = List->SentinelNext; + } + if((kbts_glyph *)&Storage->GlyphSentinel != List->OnePastLast) + { + Storage->GlyphSentinel.Prev = List->SentinelPrev; + } - while(GlyphIndex < GlyphCount) + Storage->GlyphSentinel.Prev->Next = Storage->GlyphSentinel.Next->Prev = (kbts_glyph *)&Storage->GlyphSentinel; + + *List = KBTS__ZERO_TYPE(kbts__glyph_list); +} + +static int kbts__WouldSubstitute(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_glyph_storage *Storage, + kbts_lookup_list *LookupList, + kbts__gsub_frame *Frames, kbts__feature *Feature, kbts__skip_flags SkipFlags, + kbts_glyph *Glyphs, kbts_un GlyphCount) +{ + int Result = 0; + + KBTS_ASSERT(GlyphCount <= 4); + kbts_glyph TempSentinel; + kbts_glyph Scratch[4]; + + KBTS__FOR(GlyphIndex, 0, GlyphCount) + { + kbts_glyph *ScratchGlyph = &Scratch[GlyphIndex]; + + // Glyphs is assumed to be in-order on the stack or something. + // This is one of the rare places where we manipulate arrays. + *ScratchGlyph = Glyphs[GlyphIndex]; + ScratchGlyph->Prev = ScratchGlyph - 1; + ScratchGlyph->Next = ScratchGlyph + 1; + } + Scratch[0].Prev = &TempSentinel; + Scratch[GlyphCount - 1].Next = &TempSentinel; + TempSentinel.Next = &Scratch[0]; + TempSentinel.Prev = &Scratch[GlyphCount - 1]; + + kbts__glyph_list OldList = kbts__PushGlyphList(Storage, &Scratch[0], &Scratch[GlyphCount - 1]); + + kbts__iterate_lookups IterateLookups = kbts__IterateLookups(LookupList, Feature); + while(kbts__NextLookup(&IterateLookups)) + { + kbts_glyph *CurrentGlyph = &Scratch[0]; + while(kbts__GlyphIsValid(Storage, CurrentGlyph)) { - kbts_gsub_frame *Frame = &Frames[0]; + kbts__gsub_frame *Frame = &Frames[0]; + *Frame = KBTS__ZERO_TYPE(kbts__gsub_frame); Frame->LookupIndex = IterateLookups.LookupIndex; Frame->SubtableIndex = 0; - Frame->InputGlyphIndex = 0; - Frame->InputGlyphCount = 1; - kbts_u32 FrameCount = 1; + Frame->StartIndex = 0; + Frame->InputGlyph = CurrentGlyph; + kbts_un FrameCount = 1; + + kbts__BeginLookupApplication(Scratchpad, CurrentGlyph); while(FrameCount) { - kbts_substitution_result_flags SubstitutionResult = kbts_DoSubstitution(ShapeState, LookupList, Frames, &FrameCount, &GlyphArray, 1, SkipFlags, 0); + kbts__substitution_result_flags SubstitutionResult = kbts__DoSubstitution(Scratchpad, Config, Storage, LookupList, Frames, &FrameCount, 1, SkipFlags, 0); - if(SubstitutionResult & KBTS_SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION) + if(SubstitutionResult & KBTS__SUBSTITUTION_RESULT_FLAG_MATCHED_SUBSTITUTION) { Result = 1; goto Done; } } - GlyphIndex += Frames[0].InputGlyphCount; + CurrentGlyph = kbts__EndLookupApplication(Scratchpad); } } Done:; + kbts__PopGlyphList(Storage, &OldList); + return Result; } -static int kbts_NextLookupIndex(kbts_op_state *S, kbts_un *LookupIndex, kbts_u32 *SkipFlags_, kbts_u32 *GlyphFilter_, kbts_feature_set *FeatureSet_) +static int kbts__NextLookupIndex(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_un *LookupIndex_, kbts_u32 *SkipFlags_, kbts_u32 *GlyphFilter_, kbts__feature_set *FeatureSet_) { - kbts_un LowestIndex = 0xFFFFFFFF; - KBTS_FOR(FeatureIndex, 0, S->FeatureCount) - { - kbts_lookup_indices *Indices = &S->FeatureLookupIndices[FeatureIndex]; - kbts_un Index = Indices->Indices[0]; - if(Index < LowestIndex) - { - LowestIndex = Index; - } - } + int Result = 0; - kbts_feature_set FeatureSet = KBTS_ZERO; - kbts_skip_flags SkipFlags = 0; + kbts_un FeatureStageIndex = Scratchpad->FeatureStagesRead - 1; + kbts_u32 SkipFlags = 0; kbts_u32 GlyphFilter = 0; - kbts_un UnregisteredFeatureCount = 0; - KBTS_FOR(FeatureIndex, 0, S->FeatureCount) + Scratchpad->UnregisteredFeatureCount = 0; + kbts_un ResultLookupIndex = 0; + kbts__baked_feature_stage *FeatureStage = &Config->FeatureStages[FeatureStageIndex]; + + *FeatureSet_ = KBTS__ZERO_TYPE(kbts__feature_set); + + while(Scratchpad->FeatureIndexIndex < FeatureStage->FeatureIndexCount) { - kbts_lookup_indices *Indices = &S->FeatureLookupIndices[FeatureIndex]; - kbts_un Index = Indices->Indices[0]; - if(Index == LowestIndex) + KBTS_ASSERT(Scratchpad->FeatureIndexIndex < FeatureStage->FeatureIndexCount); + + kbts_u16 FeatureIndex = FeatureStage->FeatureIndices[Scratchpad->FeatureIndexIndex]; + KBTS_ASSERT(FeatureIndex < FeatureStage->FeatureIndexCount); + + kbts__baked_feature *Feature = &FeatureStage->Features[FeatureIndex]; + kbts_un Offset = Scratchpad->BakedLookupSubtablesRead[FeatureIndex]; + + KBTS_ASSERT(Offset < Feature->Count); + kbts_un LookupIndex = Feature->Indices[Offset]; + + if(!Result) { - SkipFlags |= Indices->SkipFlags; - GlyphFilter |= Indices->GlyphFilter; - kbts_AddFeature(&FeatureSet, Indices->FeatureId); + ResultLookupIndex = LookupIndex; + Result = 1; + } - if(!Indices->FeatureId && (UnregisteredFeatureCount < KBTS_MAX_SIMULTANEOUS_FEATURES)) + if(LookupIndex == ResultLookupIndex) + { + kbts__AddFeature(FeatureSet_, Feature->FeatureId); + SkipFlags |= Feature->SkipFlags; + GlyphFilter |= Feature->GlyphFilter; + + if(!Feature->FeatureId && (Scratchpad->UnregisteredFeatureCount < KBTS_MAX_SIMULTANEOUS_FEATURES)) { - S->UnregisteredFeatureTags[UnregisteredFeatureCount++] = Indices->FeatureTag; + Scratchpad->UnregisteredFeatureTags[Scratchpad->UnregisteredFeatureCount++] = Feature->FeatureTag; } - ++Indices->Indices; --Indices->Count; - if(!Indices->Count) - { - S->FeatureLookupIndices[FeatureIndex--] = S->FeatureLookupIndices[--S->FeatureCount]; - } + Scratchpad->FeatureIndexIndex += 1; + Scratchpad->BakedLookupSubtablesRead[FeatureIndex] += 1; + } + else + { + break; } } - S->UnregisteredFeatureCount = (kbts_u32)UnregisteredFeatureCount; - *LookupIndex = LowestIndex; + *LookupIndex_ = ResultLookupIndex; *SkipFlags_ = SkipFlags; *GlyphFilter_ = GlyphFilter; - *FeatureSet_ = FeatureSet; - return LowestIndex != 0xFFFFFFFF; + + return Result; } -static int kbts_ConfigAllowsFeatures(kbts_op_state *S, kbts_shape_config *Config, kbts_glyph_config *GlyphConfig, kbts_feature_set *Features) +static int kbts__ConfigAllowsFeatures(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_glyph_config *GlyphConfig, kbts__feature_set *Features) { - kbts_glyph_config DummyGlyphConfig = KBTS_ZERO; + kbts_glyph_config DummyGlyphConfig = KBTS__ZERO; kbts_u64 UserEnabled = 0; // Whether the user enabled _any_ feature corresponding to this lookup. kbts_u64 UserDisabled = 1; // Whether the user disabled _all_ features corresponding to this lookup. kbts_u64 DefaultEnabled = 0; // Whether any feature is non-user. @@ -18558,686 +21596,793 @@ static int kbts_ConfigAllowsFeatures(kbts_op_state *S, kbts_shape_config *Config } kbts_u64 Mask = 1; // Ignore unregistered features in the broad pass. - KBTS_FOR(WordIndex, 0, KBTS_ARRAY_LENGTH(GlyphConfig->EnabledFeatures.Flags)) + KBTS__FOR(WordIndex, 0, KBTS__ARRAY_LENGTH(GlyphConfig->EnabledFeatures.Flags)) { kbts_u64 LookupFeatureFlags = Features->Flags[WordIndex] & ~Mask; Mask = 0; UserEnabled |= GlyphConfig->EnabledFeatures.Flags[WordIndex] & LookupFeatureFlags; UserDisabled &= (GlyphConfig->DisabledFeatures.Flags[WordIndex] & LookupFeatureFlags) == LookupFeatureFlags; - DefaultEnabled |= Features->Flags[WordIndex] & Config->Features->Flags[WordIndex]; + DefaultEnabled |= Features->Flags[WordIndex] & Config->Features.Flags[WordIndex]; } - if(Features->Flags[0] & (GlyphConfig->EnabledFeatures.Flags[0] | GlyphConfig->DisabledFeatures.Flags[0]) & KBTS_FEATURE_FLAG0(UNREGISTERED)) + if(Features->Flags[0] & (GlyphConfig->EnabledFeatures.Flags[0] | GlyphConfig->DisabledFeatures.Flags[0]) & KBTS__FEATURE_FLAG0(UNREGISTERED)) { // Slow path for unregistered features. - KBTS_FOR(FeatureOverrideIndex, 0, GlyphConfig->FeatureOverrideCount) + for(kbts__feature_override_header *Header = GlyphConfig->FeatureOverrideSentinel.Next; + Header != &GlyphConfig->FeatureOverrideSentinel; + Header = Header->Next) { - kbts_feature_override *Override = &GlyphConfig->FeatureOverrides[FeatureOverrideIndex]; - if(Override->Id == KBTS_FEATURE_ID_UNREGISTERED) + kbts__feature_override *Override = (kbts__feature_override *)Header; + kbts__feature_id Id = kbts__FeatureTagToId(Override->Tag); + + if(Id == KBTS__FEATURE_ID_UNREGISTERED) { kbts_feature_tag OverrideTag = Override->Tag; - KBTS_FOR(UnregisteredFeatureIndex, 0, S->UnregisteredFeatureCount) + + KBTS__FOR(UnregisteredFeatureIndex, 0, Scratchpad->UnregisteredFeatureCount) { - if(OverrideTag == S->UnregisteredFeatureTags[UnregisteredFeatureIndex]) + if(OverrideTag == Scratchpad->UnregisteredFeatureTags[UnregisteredFeatureIndex]) { - UserEnabled |= Override->EnabledOrAlternatePlusOne; - UserDisabled &= !Override->EnabledOrAlternatePlusOne; + UserEnabled |= (kbts_u32)Override->Value; + UserDisabled &= !Override->Value; break; } } } } } + int Result = (!UserDisabled && (DefaultEnabled || UserEnabled)); + return Result; } -static kbts_u32 kbts_ExecuteOp(kbts_shape_state *ShapeState, kbts_glyph_array *GlyphArray) +static void kbts__DllistReverseSublist(kbts_glyph *First, kbts_glyph *OnePastLast) { - KBTS_INSTRUMENT_FUNCTION_BEGIN - kbts_shape_config *Config = ShapeState->Config; - kbts_font *Font = Config->Font; - kbts_op *Op = &ShapeState->Op; - kbts_op_state *S = &ShapeState->OpState; - kbts_glyph *Glyphs = GlyphArray->Glyphs; + kbts_glyph *OneBeforeFirst = First->Prev; + kbts_glyph *Last = First; - kbts_u32 ResumePoint = S->ResumePoint; - S->ResumePoint = 0; - switch(ResumePoint) + for(kbts_glyph *Glyph = First; + ; + ) { - case 1: goto ResumePoint1; break; - case 2: goto ResumePoint2; break; - case 3: goto ResumePoint3; break; - case 4: goto ResumePoint4; break; - case 5: goto ResumePoint5; break; + kbts_glyph *Next = Glyph->Next; + + Glyph->Next = Glyph->Prev; + Glyph->Prev = Next; + + Last = Glyph; + Glyph = Next; + if(Glyph == OnePastLast) + { + break; + } } - S->WrittenCount = 0; + if(First != OnePastLast) + { + Last->Prev = OneBeforeFirst; + Last->Prev->Next = Last; + First->Next = OnePastLast; + First->Next->Prev = First; + } +} - switch(Op->Kind) +static void kbts__ExecuteOp(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_glyph_storage *Storage) +{ + KBTS_INSTRUMENT_FUNCTION_BEGIN; + + if(Config) { - case KBTS_OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES: - { - KBTS_INSTRUMENT_BLOCK_BEGIN("PRE_NORMALIZE_DOTTED_CIRCLES") - // Before even trying to normalize anything, there are some _exceptions_ we have to take care of. - // The USE spec gives us a list of codepoint sequences which necessitate insertion of a dotted circle. - // These sequences are from IndicShapingInvalidClusters.txt. - S->GlyphIndex = 0; - kbts_u64 Codepoints; Codepoints = 0; // 0xABBBBBCCCCCDDDDD - for(; S->GlyphIndex < GlyphArray->Count; ++S->GlyphIndex) + kbts_font *Font = Config->Font; + kbts__op_kind OpKind = Scratchpad->OpKind; + + switch(OpKind) { - kbts_u32 NewCodepoint; NewCodepoint = Glyphs[S->GlyphIndex].Codepoint & 0x1FFFFF; - Codepoints = (Codepoints << 21) | NewCodepoint; + case KBTS__OP_KIND_PRE_NORMALIZE_DOTTED_CIRCLES: + { + KBTS_INSTRUMENT_BLOCK_BEGIN(PRE_NORMALIZE_DOTTED_CIRCLES); - // This switch is faster than any table lookup I could come up with in my tests. - #define KBTS_C2(A, B) case (((kbts_u64)(A) << 21) | (kbts_u64)(B)): - switch(Codepoints & (((kbts_u64)1 << 42) - 1)) + // Before even trying to normalize anything, there are some _exceptions_ we have to take care of. + // The USE spec gives us a list of codepoint sequences which necessitate insertion of a dotted circle. + // These sequences are from IndicShapingInvalidClusters.txt. + kbts_u64 Codepoints; Codepoints = 0; // 0xABBBBBCCCCCDDDDD + KBTS__FOR_GLYPH(Storage, Glyph) { - default: - if((Codepoints & (((kbts_u64)1 << 63) - 1)) == (((kbts_u64)0x930 << 42) | ((kbts_u64)0x94D << 21) | ((kbts_u64)0x907))) + kbts_u32 NewCodepoint; NewCodepoint = Glyph->Codepoint & 0x1FFFFF; + Codepoints = (Codepoints << 21) | NewCodepoint; + + // This switch is faster than any table lookup I could come up with in my tests. + #define KBTS_C2(A, B) case (((kbts_u64)(A) << 21) | (kbts_u64)(B)): + switch(Codepoints & (((kbts_u64)1 << 42) - 1)) { - if(0) + default: + if((Codepoints & (((kbts_u64)1 << 63) - 1)) == (((kbts_u64)0x930 << 42) | ((kbts_u64)0x94D << 21) | ((kbts_u64)0x907))) { - ResumePoint4:; - Codepoints = 0; - } - KBTS_C2(0x905, 0x93A) - KBTS_C2(0x905, 0x93B) - KBTS_C2(0x905, 0x93E) - KBTS_C2(0x905, 0x945) - KBTS_C2(0x905, 0x946) - KBTS_C2(0x905, 0x949) - KBTS_C2(0x905, 0x94A) - KBTS_C2(0x905, 0x94B) - KBTS_C2(0x905, 0x94C) - KBTS_C2(0x905, 0x94F) - KBTS_C2(0x905, 0x956) - KBTS_C2(0x905, 0x957) - KBTS_C2(0x906, 0x93A) - KBTS_C2(0x906, 0x945) - KBTS_C2(0x906, 0x946) - KBTS_C2(0x906, 0x947) - KBTS_C2(0x906, 0x948) - KBTS_C2(0x909, 0x941) - KBTS_C2(0x90F, 0x945) - KBTS_C2(0x90F, 0x946) - KBTS_C2(0x90F, 0x947) - KBTS_C2(0x985, 0x9BE) - KBTS_C2(0x98B, 0x9C3) - KBTS_C2(0x98C, 0x9E2) - KBTS_C2(0xA05, 0xA3E) - KBTS_C2(0xA05, 0xA48) - KBTS_C2(0xA05, 0xA4C) - KBTS_C2(0xA72, 0xA3F) - KBTS_C2(0xA72, 0xA40) - KBTS_C2(0xA72, 0xA47) - KBTS_C2(0xA73, 0xA41) - KBTS_C2(0xA73, 0xA42) - KBTS_C2(0xA73, 0xA4B) - KBTS_C2(0xA85, 0xABE) - KBTS_C2(0xA85, 0xAC5) - KBTS_C2(0xA85, 0xAC7) - KBTS_C2(0xA85, 0xAC8) - KBTS_C2(0xA85, 0xAC9) - KBTS_C2(0xA85, 0xACB) - KBTS_C2(0xA85, 0xACC) - KBTS_C2(0xAC5, 0xABE) - KBTS_C2(0xB05, 0xB3E) - KBTS_C2(0xB0F, 0xB57) - KBTS_C2(0xB13, 0xB57) - KBTS_C2(0xB85, 0xBC2) - KBTS_C2(0xC12, 0xC4C) - KBTS_C2(0xC12, 0xC55) - KBTS_C2(0xC3F, 0xC55) - KBTS_C2(0xC46, 0xC55) - KBTS_C2(0xC4A, 0xC55) - KBTS_C2(0xC89, 0xCBE) - KBTS_C2(0xC8B, 0xCBE) - KBTS_C2(0xC92, 0xCCC) - KBTS_C2(0xD07, 0xD57) - KBTS_C2(0xD09, 0xD57) - KBTS_C2(0xD0E, 0xD46) - KBTS_C2(0xD12, 0xD3E) - KBTS_C2(0xD12, 0xD57) - KBTS_C2(0xD85, 0xDCF) - KBTS_C2(0xD85, 0xDD0) - KBTS_C2(0xD85, 0xDD1) - KBTS_C2(0xD8B, 0xDDF) - KBTS_C2(0xD8D, 0xDD8) - KBTS_C2(0xD8F, 0xDDF) - KBTS_C2(0xD91, 0xDCA) - KBTS_C2(0xD91, 0xDD9) - KBTS_C2(0xD91, 0xDDA) - KBTS_C2(0xD91, 0xDDC) - KBTS_C2(0xD91, 0xDDD) - KBTS_C2(0xD91, 0xDDE) - KBTS_C2(0xD94, 0xDDF) - KBTS_C2(0x11005, 0x11038) - KBTS_C2(0x1100B, 0x1103E) - KBTS_C2(0x1100F, 0x11042) - KBTS_C2(0x11200, 0x1122C) - KBTS_C2(0x11200, 0x11231) - KBTS_C2(0x11200, 0x11233) - KBTS_C2(0x11206, 0x1122C) - KBTS_C2(0x1122C, 0x11230) - KBTS_C2(0x1122C, 0x11231) - KBTS_C2(0x11240, 0x1122E) - KBTS_C2(0x112B0, 0x112E0) - KBTS_C2(0x112B0, 0x112E5) - KBTS_C2(0x112B0, 0x112E6) - KBTS_C2(0x112B0, 0x112E7) - KBTS_C2(0x112B0, 0x112E8) - KBTS_C2(0x11481, 0x114B0) - KBTS_C2(0x1148B, 0x114BA) - KBTS_C2(0x1148D, 0x114BA) - KBTS_C2(0x114AA, 0x114B5) - KBTS_C2(0x114AA, 0x114B6) - KBTS_C2(0x11600, 0x11639) - KBTS_C2(0x11600, 0x1163A) - KBTS_C2(0x11601, 0x11639) - KBTS_C2(0x11601, 0x1163A) - KBTS_C2(0x11680, 0x116AD) - KBTS_C2(0x11680, 0x116B4) - KBTS_C2(0x11680, 0x116B5) - KBTS_C2(0x11686, 0x116B2) - if(!kbts_GrowGlyphArray(&S->ResumePoint, GlyphArray, S->GlyphIndex, 1, 4, 0)) + KBTS_C2(0x905, 0x93A) + KBTS_C2(0x905, 0x93B) + KBTS_C2(0x905, 0x93E) + KBTS_C2(0x905, 0x945) + KBTS_C2(0x905, 0x946) + KBTS_C2(0x905, 0x949) + KBTS_C2(0x905, 0x94A) + KBTS_C2(0x905, 0x94B) + KBTS_C2(0x905, 0x94C) + KBTS_C2(0x905, 0x94F) + KBTS_C2(0x905, 0x956) + KBTS_C2(0x905, 0x957) + KBTS_C2(0x906, 0x93A) + KBTS_C2(0x906, 0x945) + KBTS_C2(0x906, 0x946) + KBTS_C2(0x906, 0x947) + KBTS_C2(0x906, 0x948) + KBTS_C2(0x909, 0x941) + KBTS_C2(0x90F, 0x945) + KBTS_C2(0x90F, 0x946) + KBTS_C2(0x90F, 0x947) + KBTS_C2(0x985, 0x9BE) + KBTS_C2(0x98B, 0x9C3) + KBTS_C2(0x98C, 0x9E2) + KBTS_C2(0xA05, 0xA3E) + KBTS_C2(0xA05, 0xA48) + KBTS_C2(0xA05, 0xA4C) + KBTS_C2(0xA72, 0xA3F) + KBTS_C2(0xA72, 0xA40) + KBTS_C2(0xA72, 0xA47) + KBTS_C2(0xA73, 0xA41) + KBTS_C2(0xA73, 0xA42) + KBTS_C2(0xA73, 0xA4B) + KBTS_C2(0xA85, 0xABE) + KBTS_C2(0xA85, 0xAC5) + KBTS_C2(0xA85, 0xAC7) + KBTS_C2(0xA85, 0xAC8) + KBTS_C2(0xA85, 0xAC9) + KBTS_C2(0xA85, 0xACB) + KBTS_C2(0xA85, 0xACC) + KBTS_C2(0xAC5, 0xABE) + KBTS_C2(0xB05, 0xB3E) + KBTS_C2(0xB0F, 0xB57) + KBTS_C2(0xB13, 0xB57) + KBTS_C2(0xB85, 0xBC2) + KBTS_C2(0xC12, 0xC4C) + KBTS_C2(0xC12, 0xC55) + KBTS_C2(0xC3F, 0xC55) + KBTS_C2(0xC46, 0xC55) + KBTS_C2(0xC4A, 0xC55) + KBTS_C2(0xC89, 0xCBE) + KBTS_C2(0xC8B, 0xCBE) + KBTS_C2(0xC92, 0xCCC) + KBTS_C2(0xD07, 0xD57) + KBTS_C2(0xD09, 0xD57) + KBTS_C2(0xD0E, 0xD46) + KBTS_C2(0xD12, 0xD3E) + KBTS_C2(0xD12, 0xD57) + KBTS_C2(0xD85, 0xDCF) + KBTS_C2(0xD85, 0xDD0) + KBTS_C2(0xD85, 0xDD1) + KBTS_C2(0xD8B, 0xDDF) + KBTS_C2(0xD8D, 0xDD8) + KBTS_C2(0xD8F, 0xDDF) + KBTS_C2(0xD91, 0xDCA) + KBTS_C2(0xD91, 0xDD9) + KBTS_C2(0xD91, 0xDDA) + KBTS_C2(0xD91, 0xDDC) + KBTS_C2(0xD91, 0xDDD) + KBTS_C2(0xD91, 0xDDE) + KBTS_C2(0xD94, 0xDDF) + KBTS_C2(0x11005, 0x11038) + KBTS_C2(0x1100B, 0x1103E) + KBTS_C2(0x1100F, 0x11042) + KBTS_C2(0x11200, 0x1122C) + KBTS_C2(0x11200, 0x11231) + KBTS_C2(0x11200, 0x11233) + KBTS_C2(0x11206, 0x1122C) + KBTS_C2(0x1122C, 0x11230) + KBTS_C2(0x1122C, 0x11231) + KBTS_C2(0x11240, 0x1122E) + KBTS_C2(0x112B0, 0x112E0) + KBTS_C2(0x112B0, 0x112E5) + KBTS_C2(0x112B0, 0x112E6) + KBTS_C2(0x112B0, 0x112E7) + KBTS_C2(0x112B0, 0x112E8) + KBTS_C2(0x11481, 0x114B0) + KBTS_C2(0x1148B, 0x114BA) + KBTS_C2(0x1148D, 0x114BA) + KBTS_C2(0x114AA, 0x114B5) + KBTS_C2(0x114AA, 0x114B6) + KBTS_C2(0x11600, 0x11639) + KBTS_C2(0x11600, 0x1163A) + KBTS_C2(0x11601, 0x11639) + KBTS_C2(0x11601, 0x1163A) + KBTS_C2(0x11680, 0x116AD) + KBTS_C2(0x11680, 0x116B4) + KBTS_C2(0x11680, 0x116B5) + KBTS_C2(0x11686, 0x116B2) { - KBTS_INSTRUMENT_END - return 1; - } - GlyphArray->Glyphs[S->GlyphIndex] = Config->DottedCircle; - } - } - #undef KBTS_C2 - } - - S->WrittenCount = GlyphArray->TotalCount; - KBTS_INSTRUMENT_END - } break; - - case KBTS_OP_KIND_NORMALIZE: - { - KBTS_INSTRUMENT_BLOCK_BEGIN("NORMALIZE") - // @Incomplete: We need to honor this. - // HB_OT_SHAPE_NORMALIZATION_MODE_NONE, - // HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, - // HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, /* Always fully decomposes and then recompose back */ - // - // hangul: HB_OT_SHAPE_NORMALIZATION_MODE_NONE, - // arabic: HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, - // default: HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, - // hebrew: HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, - // thai: HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, - // indic: HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, - // khmer: HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, - // myanmar: HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, - // use: HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, - - { // Full NFD decomposition - kbts_glyph *DecompositionGlyphs; DecompositionGlyphs = KBTS_POINTER_AFTER(kbts_glyph, S); - for(S->GlyphIndex = 0; S->GlyphIndex < GlyphArray->Count; ++S->GlyphIndex) - { - DecompositionGlyphs[0] = Glyphs[S->GlyphIndex]; - S->OpSpecific.Normalize.CodepointsToDecomposeCount = 1; - - while(S->OpSpecific.Normalize.CodepointsToDecomposeCount) - { - if(0) - { - ResumePoint1:; - DecompositionGlyphs = KBTS_POINTER_AFTER(kbts_glyph, S); - } - - kbts_glyph GlyphToDecompose = DecompositionGlyphs[--S->OpSpecific.Normalize.CodepointsToDecomposeCount]; - kbts_u64 Decomposition = 0; - kbts_u32 DecompositionSize = 0; - kbts_u32 AnyUnsupported = 0; - kbts_glyph Decomposed[2]; - - if(!(GlyphToDecompose.Flags & KBTS_GLYPH_FLAG_DO_NOT_DECOMPOSE)) - { - Decomposition = GlyphToDecompose.Decomposition; - DecompositionSize = kbts_GetDecompositionSize(Decomposition); - - // Only decompose when the font supports the decomposed form. - KBTS_FOR(DecompositionIndex, 0, DecompositionSize) + kbts_glyph *NewGlyph = kbts__InsertGlyphBefore(Storage, Glyph, &Config->DottedCircle); + if(!NewGlyph) { - kbts_glyph DecompositionGlyph = kbts_CodepointToGlyph(Font, kbts_GetDecompositionCodepoint(Decomposition, DecompositionIndex)); - DecompositionGlyph.Config = GlyphToDecompose.Config; - - AnyUnsupported |= !DecompositionGlyph.Id; - Decomposed[DecompositionIndex] = DecompositionGlyph; + goto OutOfMemory; } + } break; } + } + #undef KBTS_C2 + } - if(AnyUnsupported | !DecompositionSize) + KBTS_INSTRUMENT_BLOCK_END(PRE_NORMALIZE_DOTTED_CIRCLES); + } break; + + case KBTS__OP_KIND_NORMALIZE: + { + KBTS_INSTRUMENT_BLOCK_BEGIN(NORMALIZE); + // @Incomplete: We need to honor this. + // HB_OT_SHAPE_NORMALIZATION_MODE_NONE, + // HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, + // HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, /* Always fully decomposes and then recompose back */ + // + // hangul: HB_OT_SHAPE_NORMALIZATION_MODE_NONE, + // arabic: HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, + // default: HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, + // hebrew: HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, + // thai: HB_OT_SHAPE_NORMALIZATION_MODE_AUTO, + // indic: HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, + // khmer: HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, + // myanmar: HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, + // use: HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, + + KBTS_INSTRUMENT_BLOCK_BEGIN(Decompose); + { // Full NFD decomposition + kbts__arena_lifetime Lifetime = kbts__BeginLifetime(Scratchpad->Arena); + kbts_glyph *DecompositionGlyphs = kbts__PushArray(Scratchpad->Arena, kbts_glyph, KBTS__MAXIMUM_DECOMPOSITION_CODEPOINTS); + kbts_un CodepointsToDecomposeCount = 0; + + KBTS__FOR_GLYPH(Storage, Glyph) + { + if(kbts__GetDecompositionSize(Glyph->Decomposition)) { - if(S->WrittenCount > S->GlyphIndex) - { - if(!kbts_GrowGlyphArray(&S->ResumePoint, GlyphArray, S->WrittenCount, 1, 1, 0)) - { - S->OpSpecific.Normalize.CodepointsToDecomposeCount += 1; // Push the codepoint back on the stack. + kbts_glyph *PrevAnchor = Glyph->Prev; - KBTS_INSTRUMENT_END - return 1; + DecompositionGlyphs[0] = *Glyph; + CodepointsToDecomposeCount = 1; + + kbts__FreeGlyph(Scratchpad, Storage, Glyph); + + while(CodepointsToDecomposeCount) + { + kbts_glyph GlyphToDecompose = DecompositionGlyphs[--CodepointsToDecomposeCount]; + kbts_u64 Decomposition = 0; + kbts_u32 DecompositionSize = 0; + int AnyUnsupported = 0; + kbts_glyph Decomposed[2]; + + if(!(GlyphToDecompose.Flags & KBTS_GLYPH_FLAG_DO_NOT_DECOMPOSE)) + { + Decomposition = GlyphToDecompose.Decomposition; + DecompositionSize = kbts__GetDecompositionSize(Decomposition); + + // Only decompose when the font supports the decomposed form. + KBTS__FOR(DecompositionIndex, 0, DecompositionSize) + { + kbts_glyph DecompositionGlyph = kbts_CodepointToGlyph(Font, (int)kbts__GetDecompositionCodepoint(Decomposition, DecompositionIndex), 0, 0); + DecompositionGlyph.Config = GlyphToDecompose.Config; + DecompositionGlyph.UserIdOrCodepointIndex = GlyphToDecompose.UserIdOrCodepointIndex; + + AnyUnsupported |= !DecompositionGlyph.Id; + Decomposed[DecompositionIndex] = DecompositionGlyph; + } } - S->GlyphIndex += 1; - } - - Glyphs[S->WrittenCount++] = GlyphToDecompose; - } - else - { - KBTS_ASSERT((S->OpSpecific.Normalize.CodepointsToDecomposeCount + DecompositionSize) <= KBTS_MAXIMUM_DECOMPOSITION_CODEPOINTS); - - if(Decomposition & KBTS_UNICODE_DECOMPOSITION_DO_NOT_RECURSE0) - { - Decomposed[0].Flags |= KBTS_GLYPH_FLAG_DO_NOT_DECOMPOSE; - } - if(Decomposition & KBTS_UNICODE_DECOMPOSITION_DO_NOT_RECURSE1) - { - Decomposed[1].Flags |= KBTS_GLYPH_FLAG_DO_NOT_DECOMPOSE; - } - - KBTS_FOR(DecompositionIndex, 0, DecompositionSize) - { - // We reverse the glyphs here because we use a stack. - DecompositionGlyphs[S->OpSpecific.Normalize.CodepointsToDecomposeCount++] = Decomposed[DecompositionSize - 1 - DecompositionIndex]; - } - } - } - } - } - - { // Selective recomposition. - // The OpenType shaping documents say that Hebrew Alphabetic Presentation Form compositions aren't canonical, - // but looking at UnicodeData.txt, it seems like they totally are, so they are handled here. - kbts_glyph *LastBase = 0; - kbts_un LastBaseParentCount = 0; - kbts_s32 *LastBaseParentDeltas = 0; - kbts_un PreSlashDecimalDigitCount = 0; - kbts_un DecimalDigitCount = 0; - int InFraction = 0; - - kbts_u32 BeforeFractionSlashGlyphFlags = KBTS_GLYPH_FLAG_NUMR | KBTS_GLYPH_FLAG_FRAC; - kbts_u32 AfterFractionSlashGlyphFlags = KBTS_GLYPH_FLAG_DNOM | KBTS_GLYPH_FLAG_FRAC; - if(kbts_ShaperRtl(Config->Shaper)) - { - // RTL needs to invert NUMR and DNOM. - kbts_u32 Swap = BeforeFractionSlashGlyphFlags; - BeforeFractionSlashGlyphFlags = AfterFractionSlashGlyphFlags; - AfterFractionSlashGlyphFlags = Swap; - } - - // We also collate user features here. - kbts_feature_set UserFeatures = KBTS_ZERO; - kbts_feature_set *DefaultFeatures = Config->Features; - - KBTS_FOR(GlyphIndex, 0, S->WrittenCount) - { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - Glyph->Uid = (kbts_u16)++ShapeState->NextGlyphUid; - - if(Glyph->Config) - { - kbts_glyph_config *GlyphConfig = Glyph->Config; - KBTS_FOR(WordIndex, 0, KBTS_ARRAY_LENGTH(UserFeatures.Flags)) - { - UserFeatures.Flags[WordIndex] |= GlyphConfig->EnabledFeatures.Flags[WordIndex] & ~DefaultFeatures->Flags[WordIndex]; - } - } - - kbts_un AvailableGlyphCount = 0; - if(!Glyph->CombiningClass) - { - LastBase = Glyph; - // From the Microsoft docs: - // USE decomposes split vowel characters belonging to UISC = Vowel_Dependent according to character - // decomposition mappings defined in UnicodeData.txt - // Cluster validation, is done based on the decomposed state of a split vowel. - // - // (Note: our Matra corresponds to Vowel_Dependent + Pure_Killer.) - if((Config->Shaper != KBTS_SHAPER_USE) || (Glyph->SyllabicClass != KBTS_INDIC_SYLLABIC_CLASS_MATRA)) - { - LastBaseParentDeltas = kbts_GetParentInfoDeltas(Glyph->ParentInfo); - LastBaseParentCount = kbts_GetParentInfoCount(Glyph->ParentInfo); - AvailableGlyphCount = 1; - } - else - { - LastBaseParentDeltas = 0; - LastBaseParentCount = 0; - } - } - else - { - if(LastBase) - { - AvailableGlyphCount = 2; - } - } - - KBTS_FOR(ParentIndex, 0, LastBaseParentCount) - { - kbts_u32 ParentCodepoint = LastBase->Codepoint + (kbts_u32)LastBaseParentDeltas[ParentIndex]; - kbts_glyph ParentGlyph = kbts_CodepointToGlyph(Font, ParentCodepoint); - kbts_u32 DecompositionSize = kbts_GetDecompositionSize(ParentGlyph.Decomposition); - - ParentGlyph.Uid = LastBase->Uid; - ParentGlyph.Config = LastBase->Config; - if((DecompositionSize == AvailableGlyphCount) && ParentGlyph.Id) - { - if(DecompositionSize == 2) - { - if(kbts_GetDecompositionCodepoint(ParentGlyph.Decomposition, 1) == Glyph->Codepoint) + if(AnyUnsupported | !DecompositionSize) { - // Both match. Reclaim space. - // @Speed: We should use separate read and write cursors instead. - KBTS_FOR(ShrinkIndex, GlyphIndex + 1, S->WrittenCount) + kbts_glyph *NewGlyph = kbts__InsertGlyphAfter(Storage, PrevAnchor, &GlyphToDecompose); + if(!NewGlyph) { - Glyphs[ShrinkIndex - 1] = Glyphs[ShrinkIndex]; + goto OutOfMemory; } - S->WrittenCount -= 1; + + PrevAnchor = NewGlyph; } else { - continue; + KBTS_ASSERT((CodepointsToDecomposeCount + DecompositionSize) <= KBTS__MAXIMUM_DECOMPOSITION_CODEPOINTS); + + if(Decomposition & KBTS_UNICODE_DECOMPOSITION_DO_NOT_RECURSE0) + { + Decomposed[0].Flags |= KBTS_GLYPH_FLAG_DO_NOT_DECOMPOSE; + } + if(Decomposition & KBTS_UNICODE_DECOMPOSITION_DO_NOT_RECURSE1) + { + Decomposed[1].Flags |= KBTS_GLYPH_FLAG_DO_NOT_DECOMPOSE; + } + + KBTS__FOR(DecompositionIndex, 0, DecompositionSize) + { + // We reverse the glyphs here because we use a stack. + DecompositionGlyphs[CodepointsToDecomposeCount++] = Decomposed[DecompositionSize - 1 - DecompositionIndex]; + } } } - *LastBase = ParentGlyph; - GlyphIndex = (kbts_un)((LastBase - Glyphs) - 1); // Handle recursive recomposition. + Glyph = PrevAnchor; + } + } + + kbts__EndLifetime(&Lifetime); + } + KBTS_INSTRUMENT_BLOCK_END(Decompose); + + KBTS_INSTRUMENT_BLOCK_BEGIN(Recompose); + { // Selective recomposition. + // The OpenType shaping documents say that Hebrew Alphabetic Presentation Form compositions aren't canonical, + // but looking at UnicodeData.txt, it seems like they totally are, so they are handled here. + kbts__arena_lifetime Lifetime = kbts__BeginLifetime(Scratchpad->Arena); + kbts_glyph *LastBase = 0; + kbts_un LastBaseParentCount = 0; + kbts_un PreSlashDecimalDigitCount = 0; + kbts_glyph *PreSlashGlyph = 0; + kbts_glyph *DigitGlyph = 0; + kbts_un DecimalDigitCount = 0; + int InFraction = 0; + kbts_u32 LastBaseParentsLoaded = 0; + kbts_glyph_parent LastBaseParents[KBTS_MAXIMUM_RECOMPOSITION_PARENTS]; + kbts_glyph *Parents = kbts__PushArray(Scratchpad->Arena, kbts_glyph, KBTS_MAXIMUM_RECOMPOSITION_PARENTS); + + kbts_u32 BeforeFractionSlashGlyphFlags = KBTS_GLYPH_FLAG_NUMR | KBTS_GLYPH_FLAG_FRAC; + kbts_u32 AfterFractionSlashGlyphFlags = KBTS_GLYPH_FLAG_DNOM | KBTS_GLYPH_FLAG_FRAC; + if(kbts__ShaperRtl(Config->Shaper)) + { + // RTL needs to invert NUMR and DNOM. + kbts_u32 Swap = BeforeFractionSlashGlyphFlags; + BeforeFractionSlashGlyphFlags = AfterFractionSlashGlyphFlags; + AfterFractionSlashGlyphFlags = Swap; + } + + // We also collate user features here. + kbts__feature_set UserFeatures = KBTS__ZERO; + kbts__feature_set *DefaultFeatures = &Config->Features; + + int ShouldFlip = (Scratchpad->RunDirection == KBTS_DIRECTION_RTL); + + KBTS__FOR_GLYPH(Storage, Glyph) + { + Glyph->Uid = (kbts_u16)++Scratchpad->NextGlyphUid; + + if(Glyph->Config) + { + kbts_glyph_config *GlyphConfig = Glyph->Config; + KBTS__FOR(WordIndex, 0, KBTS__ARRAY_LENGTH(UserFeatures.Flags)) + { + UserFeatures.Flags[WordIndex] |= GlyphConfig->EnabledFeatures.Flags[WordIndex] & ~DefaultFeatures->Flags[WordIndex]; + } + } + + // In RTL, mirror all glyphs when their mirror is covered. + if(ShouldFlip && + (Glyph->UnicodeFlags & KBTS_UNICODE_FLAG_MIRRORED)) + { + kbts_u32 MatchingBracketCodepoint = kbts__GetUnicodeMirrorCodepoint(Glyph->Codepoint); + kbts_glyph MatchingBracket = kbts_CodepointToGlyph(Font, (int)MatchingBracketCodepoint, 0, 0); + if(MatchingBracket.Id) + { + kbts__SetGlyphPreserveLinksAndUserId(Glyph, &MatchingBracket); + } + } + + kbts_u32 SingleRecompositionCodepoints[KBTS_MAXIMUM_RECOMPOSITION_PARENTS]; + kbts_un SingleRecompositionCodepointCount = 0; + kbts_un DoubleRecompositionCount = LastBaseParentCount; + + if(!Glyph->CombiningClass) + { + LastBase = Glyph; + // From the Microsoft docs: + // USE decomposes split vowel characters belonging to UISC = Vowel_Dependent according to character + // decomposition mappings defined in UnicodeData.txt + // Cluster validation, is done based on the decomposed state of a split vowel. + // + // (Note: our Matra corresponds to Vowel_Dependent + Pure_Killer.) + if((Config->Shaper != KBTS_SHAPER_USE) || (Glyph->SyllabicClass != KBTS_INDIC_SYLLABIC_CLASS_MATRA)) + { + kbts_s32 *LastBaseParentDeltas = kbts__GetParentInfoDeltas(Glyph->ParentInfo); + kbts_un ParentCount = kbts__GetParentInfoCount(Glyph->ParentInfo); + + kbts_un DoubleDecompositionCount = 0; + KBTS__FOR(ParentIndex, 0, ParentCount) + { + kbts_glyph_parent Parent = KBTS__ZERO; + Parent.Codepoint = Glyph->Codepoint + (kbts_u32)LastBaseParentDeltas[ParentIndex]; + Parent.Decomposition = kbts__GetUnicodeDecomposition(Parent.Codepoint); + + kbts_un DecompositionSize = kbts__GetDecompositionSize(Parent.Decomposition); + if(DecompositionSize == 1) + { + SingleRecompositionCodepoints[SingleRecompositionCodepointCount++] = Parent.Codepoint; + } + else + { + LastBaseParents[DoubleDecompositionCount++] = Parent; + } + } + + LastBaseParentCount = DoubleDecompositionCount; + LastBaseParentsLoaded = 0; + } + else + { + LastBaseParentCount = 0; + } + + DoubleRecompositionCount = 0; + } + + int Recomposed = 0; + + if(!Recomposed) + { + KBTS_INSTRUMENT_BLOCK_BEGIN(ParentNSquaredStupidity); + KBTS__FOR(ParentIndex, 0, DoubleRecompositionCount) + { + kbts_glyph_parent *Parent = &LastBaseParents[ParentIndex]; + kbts_u32 Codepoint1 = kbts__GetDecompositionCodepoint(Parent->Decomposition, 1); + + if(Glyph->Codepoint == Codepoint1) + { + kbts_glyph *ParentGlyph = &Parents[ParentIndex]; + if(!(LastBaseParentsLoaded & (1 << ParentIndex))) + { + *ParentGlyph = kbts_CodepointToGlyph(Font, (int)Parent->Codepoint, 0, 0); + ParentGlyph->Uid = LastBase->Uid; + ParentGlyph->UserIdOrCodepointIndex = LastBase->UserIdOrCodepointIndex; + ParentGlyph->Config = LastBase->Config; + } + + if(ParentGlyph->Id) + { + // Both match. Reclaim space. + kbts_glyph *Next = Glyph->Next; + KBTS__DLLIST_REMOVE(Glyph); + Glyph = Next; + + Recomposed = 1; + kbts__SetGlyphPreserveLinksAndUserId(LastBase, ParentGlyph); + + break; + } + else + { + // This glyph is never good. Forget it. + LastBaseParents[ParentIndex] = LastBaseParents[LastBaseParentCount - 1]; + Parents[ParentIndex] = Parents[LastBaseParentCount - 1]; + LastBaseParentsLoaded &= ~(1 << ParentIndex); + LastBaseParentsLoaded |= (LastBaseParentsLoaded & (1 << (LastBaseParentCount - 1))) >> (LastBaseParentCount - 1 - ParentIndex); + + LastBaseParentCount -= 1; + DoubleRecompositionCount -= 1; + ParentIndex -= 1; + } + } + } + KBTS_INSTRUMENT_BLOCK_END(ParentNSquaredStupidity); + } + + if(!Recomposed) + { + KBTS__FOR(SingleRecompositionIndex, 0, SingleRecompositionCodepointCount) + { + kbts_glyph ParentGlyph = kbts_CodepointToGlyph(Font, (int)SingleRecompositionCodepoints[SingleRecompositionIndex], 0, 0); + if(ParentGlyph.Id) + { + ParentGlyph.Config = Glyph->Config; + + kbts__SetGlyphPreserveLinksAndUserId(Glyph, &ParentGlyph); + Recomposed = 1; + break; + } + } + } + + // It is safe to look for fractions here, because decimal digits/the fraction slash are not marks or + // jamos, so they should not get reordered after this pass. + if(Glyph->UnicodeFlags & KBTS_UNICODE_FLAG_DECIMAL_DIGIT) + { + if(InFraction) + { + // We are in the post-slash part of the fraction. + Glyph->Flags |= AfterFractionSlashGlyphFlags; + // Only flag the pre-slash part of the fraction if there is a post-slash part. + KBTS__FOR(DecimalDigitIndex, 0, PreSlashDecimalDigitCount) + { + PreSlashGlyph->Flags |= BeforeFractionSlashGlyphFlags; + PreSlashGlyph = PreSlashGlyph->Next; + } + PreSlashDecimalDigitCount = 0; + } + if(!DecimalDigitCount) + { + DigitGlyph = Glyph; + } + DecimalDigitCount += 1; + } + else if((Glyph->Codepoint == 0x2044) && (!InFraction || DecimalDigitCount)) + { + // Fraction slash. + Glyph->Flags |= KBTS_GLYPH_FLAG_FRAC; + PreSlashDecimalDigitCount = DecimalDigitCount; + PreSlashGlyph = DigitGlyph; + InFraction = DecimalDigitCount != 0; + DecimalDigitCount = 0; + } + else + { + InFraction = 0; + } + + if(Recomposed) + { + // @Robustness: This doesn't work when LastBase != Glyph->Prev, does it? + Glyph = Glyph->Prev; // Handle recursive recomposition. + } + } + + // Ignore added features that are already part of the shaper. + kbts__feature_set *ShaperFeatures = &Config->Features; + KBTS__FOR(WordIndex, 0, KBTS__ARRAY_LENGTH(UserFeatures.Flags)) + { + UserFeatures.Flags[WordIndex] &= ~ShaperFeatures->Flags[WordIndex]; + } + + Scratchpad->UserFeatures = UserFeatures; + kbts__EndLifetime(&Lifetime); + } + KBTS_INSTRUMENT_BLOCK_END(Recompose); + + KBTS_INSTRUMENT_BLOCK_BEGIN(MarkReordering); + { // Unicode mark reordering. + for(kbts_glyph *Glyph = Storage->GlyphSentinel.Next; + kbts__GlyphIsValid(Storage, Glyph); + ) + { + kbts_u8 CombiningClass = Glyph->CombiningClass; + + if(CombiningClass) + { + Glyph->MarkOrdering = CombiningClass; + + kbts_glyph *SequenceGlyph = Glyph->Next; + for(; + kbts__GlyphIsValid(Storage, SequenceGlyph); + SequenceGlyph = SequenceGlyph->Next) + { + kbts_u8 SequenceGlyphCombiningClass = SequenceGlyph->CombiningClass; + if(SequenceGlyphCombiningClass) + { + SequenceGlyph->MarkOrdering = SequenceGlyphCombiningClass; + } + else + { + break; + } + } + + kbts_glyph *AfterSequence = SequenceGlyph; + if(kbts__GlyphIsValid(Storage, AfterSequence)) + { + AfterSequence = AfterSequence->Next; + } + + KBTS__DLLIST_SORT(Glyph, SequenceGlyph, MarkOrdering); + + #ifdef KBTS_SANITY_CHECK + { + kbts_glyph *Glyph0 = OneBeforeSequence->Next; + kbts_glyph *Glyph1 = Glyph0->Next; + KBTS__FOR(SequenceIndex, 1, MarkSequenceLength) + { + KBTS_ASSERT(Glyph0->MarkOrdering <= Glyph1->MarkOrdering); + + Glyph0 = Glyph0->Next; + Glyph1 = Glyph1->Next; + } + } + #endif + + Glyph = AfterSequence; + } + else + { + Glyph = Glyph->Next; + } + } + } + KBTS_INSTRUMENT_BLOCK_END(MarkReordering); + + if(Config->Script == KBTS_SCRIPT_ARABIC) + { + for(kbts_glyph *Glyph = Storage->GlyphSentinel.Next; + kbts__GlyphIsValid(Storage, Glyph); + ) + { + kbts_glyph *Next = Glyph->Next; + + // Find a mark sequence. + kbts_u8 CombiningClass = Glyph->CombiningClass; + + if(CombiningClass) + { + // Arabic: Reorder sequences of mark glyphs. + // + // From the Unicode standard: + // - Move any shadda characters (ccc=33) to the beginning of S. + // - If a sequence of ccc=230 characters begins with any MCM characters, move the sequence of such MCM + // characters + // to the beginning of S (before any characters with ccc=33). + // - If a sequence of ccc=220 characters begins with any MCM characters, move the sequence of such MCM + // characters + // to the beginning of S (before any MCM with ccc=230 or ccc=33). + // + // Final ordering: 220 230 shadda other + + kbts__mcm_sequence_state Mcm220SequenceState = 0; + kbts__mcm_sequence_state Mcm230SequenceState = 0; + + # define KBTS_REMAPPED_CCC_33 27 + + kbts_glyph *SequenceGlyph = Glyph; + for(; + kbts__GlyphIsValid(Storage, SequenceGlyph); + SequenceGlyph = SequenceGlyph->Next) + { + kbts_u16 SequenceGlyphCombiningClass = SequenceGlyph->CombiningClass; + kbts_u16 SequenceGlyphFlags = SequenceGlyph->UnicodeFlags; + + kbts_u8 MarkOrdering = 3; + + if(SequenceGlyphCombiningClass == KBTS_REMAPPED_CCC_33) + { + MarkOrdering = 2; + } + else if(SequenceGlyphCombiningClass == 220) + { + if(SequenceGlyphFlags & KBTS_UNICODE_FLAG_MODIFIER_COMBINING_MARK) + { + if(Mcm220SequenceState != KBTS__MCM_SEQUENCE_STATE_OUT) + { + Mcm220SequenceState = KBTS__MCM_SEQUENCE_STATE_IN; + } + } + else + { + Mcm220SequenceState = KBTS__MCM_SEQUENCE_STATE_OUT; + } + + if(Mcm220SequenceState == KBTS__MCM_SEQUENCE_STATE_IN) + { + MarkOrdering = 0; + } + + Mcm230SequenceState = KBTS__MCM_SEQUENCE_STATE_NONE; + } + else if(SequenceGlyphCombiningClass == 230) + { + if(SequenceGlyphFlags & KBTS_UNICODE_FLAG_MODIFIER_COMBINING_MARK) + { + if(Mcm230SequenceState != KBTS__MCM_SEQUENCE_STATE_OUT) + { + Mcm230SequenceState = KBTS__MCM_SEQUENCE_STATE_IN; + } + } + else + { + Mcm230SequenceState = KBTS__MCM_SEQUENCE_STATE_OUT; + } + + if(Mcm230SequenceState == KBTS__MCM_SEQUENCE_STATE_IN) + { + MarkOrdering = 1; + } + } + else if(SequenceGlyphCombiningClass) + { + Mcm220SequenceState = KBTS__MCM_SEQUENCE_STATE_NONE; + Mcm230SequenceState = KBTS__MCM_SEQUENCE_STATE_NONE; + } + else + { + break; + } + + SequenceGlyph->MarkOrdering = MarkOrdering; + } + + KBTS__DLLIST_SORT(Glyph, SequenceGlyph, MarkOrdering); + + #ifdef KBTS_SANITY_CHECK + { + kbts_glyph *Glyph0 = OneBeforeGlyph->Next; + for(kbts_glyph *Glyph1 = Glyph0->Next; + Glyph1 != SequenceGlyph; + Glyph1 = Glyph1->Next) + { + KBTS_ASSERT(Glyph0->MarkOrdering <= Glyph1->MarkOrdering); + Glyph0 = Glyph1; + } + } + #endif + + Next = SequenceGlyph; + } + + Glyph = Next; + } + } + else if((Config->Script == KBTS_SCRIPT_THAI) || (Config->Script == KBTS_SCRIPT_LAO)) + { + // Decompose sara/sala ams. + kbts_glyph *AboveBaseGlyph; AboveBaseGlyph = 0; + + KBTS__FOR_GLYPH(Storage, Glyph) + { + kbts_u32 Codepoint = Glyph->Codepoint; + + switch(Codepoint) + { + // Sara am/sala am. + // We match both because storing the sara am codepoint that corresponds to the current script + // doesn't seem that worthwhile, given that this is already a pretty big switch case. + // If we choose to use a unicode flag or indic syllabic category to notate above-base marks, + // then this loops gets a lot tighter and it would probably become the right call to pre-determine + // the sara am codepoint. + case 0xE33: case 0xEB3: // Sara am + { + kbts_glyph *NewGlyph = kbts__InsertGlyphBefore(Storage, AboveBaseGlyph, &Config->Nikhahit); + if(!NewGlyph) + { + goto OutOfMemory; + } + + kbts__SetGlyphPreserveLinksAndUserId(Glyph, &Config->SaraAa); + } break; + + case 0xE31: case 0xE34: case 0xE35: case 0xE36: case 0xE37: case 0xE3B: + case 0xE47: case 0xE48: case 0xE49: case 0xE4A: case 0xE4B: case 0xE4C: case 0xE4D: case 0xE4E: + case 0xEB1: case 0xEB4: case 0xEB5: case 0xEB6: case 0xEB7: case 0xEBB: + case 0xEC7: case 0xEC8: case 0xEC9: case 0xECA: case 0xECB: case 0xECC: case 0xECD: case 0xECE: + if(!AboveBaseGlyph) + { + AboveBaseGlyph = Glyph; + } + break; + + default: + AboveBaseGlyph = 0; break; } } - - // It is safe to look for fractions here, because decimal digits/the fraction slash are not marks or - // jamos, so they should not get reordered after this pass. - if(Glyph->UnicodeFlags & KBTS_UNICODE_FLAG_DECIMAL_DIGIT) - { - if(InFraction) - { - // We are in the post-slash part of the fraction. - Glyph->Flags |= AfterFractionSlashGlyphFlags; - // Only flag the pre-slash part of the fraction if there is a post-slash part. - KBTS_FOR(DecimalDigitIndex, 0, PreSlashDecimalDigitCount) - { - Glyphs[GlyphIndex - PreSlashDecimalDigitCount - 1 + DecimalDigitIndex].Flags |= BeforeFractionSlashGlyphFlags; - } - PreSlashDecimalDigitCount = 0; - } - DecimalDigitCount += 1; - } - else if((Glyph->Codepoint == 0x2044) && (!InFraction || DecimalDigitCount)) - { - // Fraction slash. - Glyph->Flags |= KBTS_GLYPH_FLAG_FRAC; - PreSlashDecimalDigitCount = DecimalDigitCount; - InFraction = DecimalDigitCount != 0; - DecimalDigitCount = 0; - } - else - { - InFraction = 0; - } } - // Ignore added features that are already part of the shaper. - kbts_feature_set *ShaperFeatures = Config->Features; - KBTS_FOR(WordIndex, 0, KBTS_ARRAY_LENGTH(UserFeatures.Flags)) - { - UserFeatures.Flags[WordIndex] &= ~ShaperFeatures->Flags[WordIndex]; - } + KBTS_INSTRUMENT_BLOCK_END(NORMALIZE); + } break; - ShapeState->UserFeatures = UserFeatures; - } - - { // Unicode mark reordering. - S->GlyphIndex = 0; - while(S->GlyphIndex < S->WrittenCount) - { - kbts_glyph *Glyph = &Glyphs[S->GlyphIndex]; - kbts_u8 CombiningClass = Glyph->CombiningClass; - - kbts_un IndexIncrement = 1; - - if(CombiningClass) - { - Glyph->MarkOrdering = CombiningClass; - kbts_un MarkSequenceLength = 1; - while((S->GlyphIndex + MarkSequenceLength) < S->WrittenCount) - { - kbts_glyph *SequenceGlyph = &Glyphs[S->GlyphIndex + MarkSequenceLength]; - kbts_u8 SequenceGlyphCombiningClass = SequenceGlyph->CombiningClass; - if(SequenceGlyphCombiningClass) - { - SequenceGlyph->MarkOrdering = SequenceGlyphCombiningClass; - MarkSequenceLength += 1; - } - else - { - break; - } - } - - KBTS_FOR(Iter, 0, MarkSequenceLength) - { - KBTS_FOR(SequenceIndex, 1, MarkSequenceLength) - { - kbts_glyph *Glyph0 = &Glyphs[S->GlyphIndex + SequenceIndex - 1]; - kbts_glyph *Glyph1 = &Glyphs[S->GlyphIndex + SequenceIndex]; - - if(Glyph0->MarkOrdering > Glyph1->MarkOrdering) - { - kbts_glyph Swap = *Glyph0; - *Glyph0 = *Glyph1; - *Glyph1 = Swap; - } - } - } - - IndexIncrement = MarkSequenceLength; - } - - S->GlyphIndex += IndexIncrement; - } - } - - if(Config->Script == KBTS_SCRIPT_ARABIC) + case KBTS__OP_KIND_NORMALIZE_HANGUL: { - S->GlyphIndex = 0; - while(S->GlyphIndex < S->WrittenCount) + KBTS_INSTRUMENT_BLOCK_BEGIN(NORMALIZE_HANGUL); + + for(kbts_glyph *Glyph = Storage->GlyphSentinel.Next; + kbts__GlyphIsValid(Storage, Glyph); + ) { - // Find a mark sequence. - kbts_glyph *Glyph = &Glyphs[S->GlyphIndex]; - kbts_u8 CombiningClass = Glyph->CombiningClass; + kbts_glyph *Next = Glyph->Next; - if(CombiningClass) - { - // Arabic: Reorder sequences of mark glyphs. - // - // From the Unicode standard: - // - Move any shadda characters (ccc=33) to the beginning of S. - // - If a sequence of ccc=230 characters begins with any MCM characters, move the sequence of such MCM - // characters - // to the beginning of S (before any characters with ccc=33). - // - If a sequence of ccc=220 characters begins with any MCM characters, move the sequence of such MCM - // characters - // to the beginning of S (before any MCM with ccc=230 or ccc=33). - // - // Final ordering: 220 230 shadda other - - kbts_mcm_sequence_state Mcm220SequenceState = 0; - kbts_mcm_sequence_state Mcm230SequenceState = 0; - - kbts_un SequenceStart = S->GlyphIndex; - -# define KBTS_REMAPPED_CCC_33 27 - - while(S->GlyphIndex < S->WrittenCount) - { - kbts_glyph *SequenceGlyph = &Glyphs[S->GlyphIndex]; - kbts_u16 SequenceGlyphCombiningClass = SequenceGlyph->CombiningClass; - kbts_u16 SequenceGlyphFlags = SequenceGlyph->UnicodeFlags; - - kbts_u8 MarkOrdering = 3; - - if(SequenceGlyphCombiningClass == KBTS_REMAPPED_CCC_33) - { - MarkOrdering = 2; - } - else if(SequenceGlyphCombiningClass == 220) - { - if(SequenceGlyphFlags & KBTS_UNICODE_FLAG_MODIFIER_COMBINING_MARK) - { - if(Mcm220SequenceState != KBTS_MCM_SEQUENCE_STATE_OUT) - { - Mcm220SequenceState = KBTS_MCM_SEQUENCE_STATE_IN; - } - } - else - { - Mcm220SequenceState = KBTS_MCM_SEQUENCE_STATE_OUT; - } - - if(Mcm220SequenceState == KBTS_MCM_SEQUENCE_STATE_IN) - { - MarkOrdering = 0; - } - - Mcm230SequenceState = KBTS_MCM_SEQUENCE_STATE_NONE; - } - else if(SequenceGlyphCombiningClass == 230) - { - if(SequenceGlyphFlags & KBTS_UNICODE_FLAG_MODIFIER_COMBINING_MARK) - { - if(Mcm230SequenceState != KBTS_MCM_SEQUENCE_STATE_OUT) - { - Mcm230SequenceState = KBTS_MCM_SEQUENCE_STATE_IN; - } - } - else - { - Mcm230SequenceState = KBTS_MCM_SEQUENCE_STATE_OUT; - } - - if(Mcm230SequenceState == KBTS_MCM_SEQUENCE_STATE_IN) - { - MarkOrdering = 1; - } - } - else if(SequenceGlyphCombiningClass) - { - Mcm220SequenceState = KBTS_MCM_SEQUENCE_STATE_NONE; - Mcm230SequenceState = KBTS_MCM_SEQUENCE_STATE_NONE; - } - else - { - break; - } - - SequenceGlyph->MarkOrdering = MarkOrdering; - S->GlyphIndex += 1; - } - - KBTS_FOR(Iter, SequenceStart, S->GlyphIndex) - { - KBTS_FOR(SortIndex, SequenceStart + 1, S->GlyphIndex) - { - kbts_glyph *Left = &Glyphs[SortIndex - 1]; - kbts_glyph *Right = &Glyphs[SortIndex]; - - if(Left->MarkOrdering > Right->MarkOrdering) - { - kbts_glyph Swap = *Left; - *Left = *Right; - *Right = Swap; - } - } - } - } - else - { - S->GlyphIndex += 1; - } - } - } - else if((Config->Script == KBTS_SCRIPT_THAI) || (Config->Script == KBTS_SCRIPT_LAO)) - { - // Decompose sara/sala ams. - kbts_un AboveBaseGlyphCount; AboveBaseGlyphCount = 0; - for(S->GlyphIndex = 0; S->GlyphIndex < S->WrittenCount; ++S->GlyphIndex) - { - if(0) - { - ResumePoint5:; - AboveBaseGlyphCount = S->OpSpecific.Normalize.AboveBaseGlyphCount; - } - kbts_glyph *Glyph = &Glyphs[S->GlyphIndex]; - kbts_u32 Codepoint = Glyph->Codepoint; - - switch(Codepoint) - { - // Sara am/sala am. - // We match both because storing the sara am codepoint that corresponds to the current script - // doesn't seem that worthwhile, given that this is already a pretty big switch case. - // If we choose to use a unicode flag or indic syllabic category to notate above-base marks, - // then this loops gets a lot tighter and it would probably become the right call to pre-determine - // the sara am codepoint. - case 0xE33: case 0xEB3: // Sara am - { - if(!kbts_GrowGlyphArray(&S->ResumePoint, GlyphArray, S->GlyphIndex, 1, 5, 0)) - { - S->OpSpecific.Normalize.AboveBaseGlyphCount = AboveBaseGlyphCount; - KBTS_INSTRUMENT_END - return 1; - } - - AboveBaseGlyphCount = S->OpSpecific.Normalize.AboveBaseGlyphCount; - for(kbts_un AboveBaseIndex = 0; AboveBaseIndex < AboveBaseGlyphCount; ++AboveBaseIndex) - { - Glyphs[S->GlyphIndex - AboveBaseIndex] = Glyphs[S->GlyphIndex - AboveBaseIndex - 1]; - } - Glyphs[S->GlyphIndex - AboveBaseGlyphCount] = Config->Nikhahit; - Glyphs[S->GlyphIndex + 1] = Config->SaraAa; - S->WrittenCount += 1; - } break; - - case 0xE31: case 0xE34: case 0xE35: case 0xE36: case 0xE37: case 0xE3B: - case 0xE47: case 0xE48: case 0xE49: case 0xE4A: case 0xE4B: case 0xE4C: case 0xE4D: case 0xE4E: - case 0xEB1: case 0xEB4: case 0xEB5: case 0xEB6: case 0xEB7: case 0xEBB: - case 0xEC7: case 0xEC8: case 0xEC9: case 0xECA: case 0xECB: case 0xECC: case 0xECD: case 0xECE: - AboveBaseGlyphCount += 1; - break; - - default: - AboveBaseGlyphCount = 0; - break; - } - } - } - - KBTS_INSTRUMENT_END - } - break; - - case KBTS_OP_KIND_NORMALIZE_HANGUL: - { - KBTS_INSTRUMENT_BLOCK_BEGIN("NORMALIZE_HANGUL") - kbts_op_state_normalize_hangul *NormalizeHangul; NormalizeHangul = &S->OpSpecific.NormalizeHangul; - S->GlyphIndex = 0; - while(S->GlyphIndex < GlyphArray->Count) - { - { - kbts_glyph *Glyph = &Glyphs[S->GlyphIndex]; kbts_un L = 0; kbts_un V = 0; kbts_un T = 0; + kbts_un LvtGlyphCount = 0; + kbts_glyph LvtGlyphs[4]; - kbts_hangul_syllable_info LInfo = kbts_HangulSyllableInfo(Glyph->Codepoint); - if(LInfo.Type >= KBTS_HANGUL_SYLLABLE_TYPE_LV) + kbts__hangul_syllable_info LInfo = kbts__HangulSyllableInfo(Glyph->Codepoint); + if(LInfo.Type >= KBTS__HANGUL_SYLLABLE_TYPE_LV) { kbts_un SIndex = (Glyph->Codepoint - 0xAC00); @@ -19250,64 +22395,60 @@ static kbts_u32 kbts_ExecuteOp(kbts_shape_state *ShapeState, kbts_glyph_array *G T = 0x11A7 + TIndex; } } - else if(LInfo.Type == KBTS_HANGUL_SYLLABLE_TYPE_L) + else if(LInfo.Type == KBTS__HANGUL_SYLLABLE_TYPE_L) { L = Glyph->Codepoint; } - S->GlyphIndex += 1; - if(L) { - kbts_hangul_syllable_info VInfo = KBTS_ZERO; + kbts__hangul_syllable_info VInfo = KBTS__ZERO; - if(!V && (S->GlyphIndex < GlyphArray->Count)) + if(!V && kbts__GlyphIsValid(Storage, Next)) { - kbts_u32 VCodepoint = Glyphs[S->GlyphIndex].Codepoint; + kbts_u32 VCodepoint = Next->Codepoint; - VInfo = kbts_HangulSyllableInfo(VCodepoint); + VInfo = kbts__HangulSyllableInfo(VCodepoint); - if(VInfo.Type == KBTS_HANGUL_SYLLABLE_TYPE_V) + if(VInfo.Type == KBTS__HANGUL_SYLLABLE_TYPE_V) { V = VCodepoint; - S->GlyphIndex += 1; + Next = Next->Next; } } if(V) { - kbts_hangul_syllable_info TInfo = KBTS_ZERO; + kbts__hangul_syllable_info TInfo = KBTS__ZERO; - if(!T && (S->GlyphIndex < GlyphArray->Count)) + if(!T && kbts__GlyphIsValid(Storage, Next)) { - kbts_u32 TCodepoint = Glyphs[S->GlyphIndex].Codepoint; + kbts_u32 TCodepoint = Next->Codepoint; - TInfo = kbts_HangulSyllableInfo(TCodepoint); + TInfo = kbts__HangulSyllableInfo(TCodepoint); - if(TInfo.Type == KBTS_HANGUL_SYLLABLE_TYPE_T) + if(TInfo.Type == KBTS__HANGUL_SYLLABLE_TYPE_T) { T = TCodepoint; - S->GlyphIndex += 1; + Next = Next->Next; } } - NormalizeHangul->LvtGlyphCount = 0; - // Check for any tone marks that we need to swap to the front of the syllable. // The OpenType shaping documents say that we need to do this after applying GSUB features, but // harfbuzz does it before, so it's probably fine to do it here? // It's also basically free to do here, which is nice. - if(S->GlyphIndex < GlyphArray->Count) + if(kbts__GlyphIsValid(Storage, Next)) { - kbts_u32 ToneMarkCodepoint = Glyphs[S->GlyphIndex].Codepoint; + kbts_u32 ToneMarkCodepoint = Next->Codepoint; if((ToneMarkCodepoint >= 0x302E) && (ToneMarkCodepoint <= 0x302F)) { - NormalizeHangul->LvtGlyphs[NormalizeHangul->LvtGlyphCount++] = kbts_CodepointToGlyph(Font, ToneMarkCodepoint); + LvtGlyphs[LvtGlyphCount++] = kbts_CodepointToGlyph(Font, (int)ToneMarkCodepoint, 0, 0); - S->GlyphIndex += 1; + Next = Next->Next; } } @@ -19316,570 +22457,570 @@ static kbts_u32 kbts_ExecuteOp(kbts_shape_state *ShapeState, kbts_glyph_array *G // Try LVT. kbts_un LvtCodepoint = 0xAC00 + (L - 0x1100) * 588 + (V - 0x1161) * 28 + (T - 0x11A7); - kbts_glyph LvtGlyph = kbts_CodepointToGlyph(Font, (kbts_u32)LvtCodepoint); + kbts_glyph LvtGlyph = kbts_CodepointToGlyph(Font, (int)LvtCodepoint, 0, 0); if(LvtGlyph.Id) { - NormalizeHangul->LvtGlyphs[NormalizeHangul->LvtGlyphCount++] = LvtGlyph; + LvtGlyphs[LvtGlyphCount++] = LvtGlyph; } } - if(!NormalizeHangul->LvtGlyphCount) + if(!LvtGlyphCount) { - kbts_glyph LvGlyph = KBTS_ZERO; + kbts_glyph LvGlyph = KBTS__ZERO; if(LInfo.Composable & VInfo.Composable) { // Try LV. kbts_un LvCodepoint = 0xAC00 + (L - 0x1100) * 588 + (V - 0x1161) * 28; - LvGlyph = kbts_CodepointToGlyph(Font, (kbts_u32)LvCodepoint); + LvGlyph = kbts_CodepointToGlyph(Font, (int)LvCodepoint, 0, 0); } if(LvGlyph.Id) { - NormalizeHangul->LvtGlyphs[NormalizeHangul->LvtGlyphCount++] = LvGlyph; + LvtGlyphs[LvtGlyphCount++] = LvGlyph; } else { // Do L-V. - kbts_glyph LGlyph = kbts_CodepointToGlyph(Font, (kbts_u32)L); + kbts_glyph LGlyph = kbts_CodepointToGlyph(Font, (int)L, 0, 0); LGlyph.Flags |= KBTS_GLYPH_FLAG_LJMO; - kbts_glyph VGlyph = kbts_CodepointToGlyph(Font, (kbts_u32)V); + kbts_glyph VGlyph = kbts_CodepointToGlyph(Font, (int)V, 0, 0); VGlyph.Flags |= KBTS_GLYPH_FLAG_VJMO; - NormalizeHangul->LvtGlyphs[NormalizeHangul->LvtGlyphCount++] = LGlyph; - NormalizeHangul->LvtGlyphs[NormalizeHangul->LvtGlyphCount++] = VGlyph; + LvtGlyphs[LvtGlyphCount++] = LGlyph; + LvtGlyphs[LvtGlyphCount++] = VGlyph; } if(T) { - kbts_glyph TGlyph = kbts_CodepointToGlyph(Font, (kbts_u32)T); + kbts_glyph TGlyph = kbts_CodepointToGlyph(Font, (int)T, 0, 0); TGlyph.Flags |= KBTS_GLYPH_FLAG_TJMO; - NormalizeHangul->LvtGlyphs[NormalizeHangul->LvtGlyphCount++] = TGlyph; + LvtGlyphs[LvtGlyphCount++] = TGlyph; } } } } - if(!NormalizeHangul->LvtGlyphCount) + if(!LvtGlyphCount) { - kbts_glyph NewGlyph = kbts_CodepointToGlyph(Font, Glyph->Codepoint); + kbts_glyph NewGlyph = kbts_CodepointToGlyph(Font, (int)Glyph->Codepoint, 0, 0); - NormalizeHangul->LvtGlyphs[NormalizeHangul->LvtGlyphCount++] = NewGlyph; + LvtGlyphs[LvtGlyphCount++] = NewGlyph; } - } - { // Insert the LVT glyphs. - ResumePoint3:; - NormalizeHangul = &S->OpSpecific.NormalizeHangul; + { // Insert the LVT glyphs. + kbts_glyph *LastConsumed = Next->Prev; - kbts_un NewWrittenCount = S->WrittenCount + NormalizeHangul->LvtGlyphCount; - if(NewWrittenCount > S->GlyphIndex) - { - if(!kbts_GrowGlyphArray(&S->ResumePoint, GlyphArray, S->WrittenCount, NormalizeHangul->LvtGlyphCount, 3, 0)) + // Remove the sub-list from the main list. + Glyph->Prev->Next = LastConsumed->Next; + LastConsumed->Next->Prev = Glyph->Prev; + + // Send it to the free list. + Glyph->Prev = (kbts_glyph *)&Storage->FreeGlyphSentinel; + LastConsumed->Next = Storage->FreeGlyphSentinel.Next; + Glyph->Prev->Next = Glyph; + LastConsumed->Next->Prev = LastConsumed; + + for(kbts_un LvtGlyphIndex = 0; + LvtGlyphIndex < LvtGlyphCount; + ++LvtGlyphIndex) { - KBTS_INSTRUMENT_END - return 1; - } - - S->GlyphIndex += NormalizeHangul->LvtGlyphCount; - } - - KBTS_FOR(LvtGlyphIndex, 0, NormalizeHangul->LvtGlyphCount) - { - Glyphs[S->WrittenCount++] = NormalizeHangul->LvtGlyphs[LvtGlyphIndex]; - } - } - } - KBTS_INSTRUMENT_END - } - break; - - case KBTS_OP_KIND_GSUB_FEATURES: - { - KBTS_INSTRUMENT_BLOCK_BEGIN("GSUB_FEATURES") - - kbts_gsub_gpos *FontGsub; FontGsub = Font->ShapingTables[KBTS_SHAPING_TABLE_GSUB]; - kbts_lookup_list *LookupList; LookupList = kbts_GetLookupList(FontGsub); - kbts_gsub_frame *Frames; Frames = KBTS_POINTER_AFTER(kbts_gsub_frame, S); - kbts_op_state_gsub *Gsub; Gsub = &S->OpSpecific.Gsub; - kbts_u32 GlyphFilter; - kbts_skip_flags SkipFlags; - kbts_feature_set LookupFeatures; - - kbts_BeginFeatures(S, Config, KBTS_SHAPING_TABLE_GSUB, Op->Features); - while(kbts_NextLookupIndex(S, &Gsub->LookupIndex, &SkipFlags, &GlyphFilter, &LookupFeatures)) - { - Gsub->LookupFeatures = LookupFeatures; - S->GlyphIndex = 0; - - // From the Microsoft docs: - // If a Lookup table has multiple subtables, the subtables are processed in order, testing the glyph sequence - // at the current glyph position for a match with the input sequence patterns specified by each subtable in - // turn. - // - // This means the subtable loop is _inside_ of the loop over our glyphs. - while(S->GlyphIndex < GlyphArray->Count) - { - Frames[0].InputGlyphCount = 1; - - { - kbts_u32 FilterMask = Config->Shaper == KBTS_SHAPER_USE ? KBTS_USE_GLYPH_FEATURE_MASK : KBTS_GLYPH_FEATURE_MASK; - kbts_u32 EffectiveGlyphFilter = GlyphFilter & FilterMask; - - // Reverse chaining substitutions are tricky. - // See the comment at :ReverseChaining. - // @Duplication: We just copy the top-level mirroring logic from DoSubstitution here for now. - kbts_lookup *Lookup = kbts_GetLookup(LookupList, Gsub->LookupIndex); - kbts_un CurrentGlyphIndex = (Lookup->Type == 8) ? GlyphArray->Count - 1 - S->GlyphIndex : S->GlyphIndex; - kbts_glyph *CurrentGlyph = &Glyphs[CurrentGlyphIndex]; - - if(kbts_GlyphIncludedInLookup(Config->Font, 0, Gsub->LookupIndex, CurrentGlyph->Id) && - ((CurrentGlyph->Flags & EffectiveGlyphFilter) == EffectiveGlyphFilter) && - kbts_ConfigAllowsFeatures(S, Config, CurrentGlyph->Config, &LookupFeatures)) - { - kbts_gsub_frame *Frame = &Frames[0]; - - Frame->LookupIndex = (kbts_u16)Gsub->LookupIndex; - Frame->SubtableIndex = 0; - Frame->InputGlyphIndex = (kbts_u16)S->GlyphIndex; - S->FrameCount = 1; - } - } - - while(S->FrameCount) - { - if(0) - { - ResumePoint2:; - FontGsub = Font->ShapingTables[KBTS_SHAPING_TABLE_GSUB]; - Gsub = &S->OpSpecific.Gsub; - LookupList = kbts_GetLookupList(FontGsub); - Frames = KBTS_POINTER_AFTER(kbts_gsub_frame, S); - LookupFeatures = Gsub->LookupFeatures; - GlyphFilter = Gsub->GlyphFilter; - SkipFlags = Gsub->SkipFlags; - } - - // These flags are used by USE. - kbts_u32 GeneratedGlyphFlags = GlyphFilter & (KBTS_GLYPH_FLAG_RPHF | KBTS_GLYPH_FLAG_PREF); - kbts_substitution_result_flags SubstitutionFlags = kbts_DoSubstitution(ShapeState, LookupList, Frames, &S->FrameCount, GlyphArray, 0, SkipFlags, GeneratedGlyphFlags); - if(SubstitutionFlags & KBTS_SUBSTITUTION_RESULT_FLAG_GROW_BUFFER) - { - Gsub->GlyphFilter = GlyphFilter; - Gsub->SkipFlags = SkipFlags; - S->ResumePoint = 2; - - KBTS_INSTRUMENT_END - return 1; - } - } - - S->GlyphIndex += Frames[0].InputGlyphCount; - } - } - - S->WrittenCount = GlyphArray->Count; - KBTS_INSTRUMENT_END - } - break; - - case KBTS_OP_KIND_FLAG_JOINING_LETTERS: - { - KBTS_INSTRUMENT_BLOCK_BEGIN("FLAG_JOINING_LETTERS") - kbts_u64 JoiningTypesMatchLookup = - (((1ull << KBTS_UNICODE_JOINING_TYPE_RIGHT) | (1ull << KBTS_UNICODE_JOINING_TYPE_DUAL) | (1ull << KBTS_UNICODE_JOINING_TYPE_FORCE)) << (8 * KBTS_UNICODE_JOINING_TYPE_LEFT)) | - (((1ull << KBTS_UNICODE_JOINING_TYPE_RIGHT) | (1ull << KBTS_UNICODE_JOINING_TYPE_DUAL) | (1ull << KBTS_UNICODE_JOINING_TYPE_FORCE)) << (8 * KBTS_UNICODE_JOINING_TYPE_DUAL)) | - (((1ull << KBTS_UNICODE_JOINING_TYPE_RIGHT) | (1ull << KBTS_UNICODE_JOINING_TYPE_DUAL) | (1ull << KBTS_UNICODE_JOINING_TYPE_FORCE)) << (8 * KBTS_UNICODE_JOINING_TYPE_FORCE)); - - kbts_u64 JoiningFeatureTransition = ((kbts_u64)KBTS_JOINING_FEATURE_INIT << (8 * KBTS_JOINING_FEATURE_ISOL)) | ((kbts_u64)KBTS_JOINING_FEATURE_MEDI << (8 * KBTS_JOINING_FEATURE_FINA)) | - ((kbts_u64)KBTS_JOINING_FEATURE_MEDI << (8 * KBTS_JOINING_FEATURE_MEDI)) | ((kbts_u64)KBTS_JOINING_FEATURE_MED2 << (8 * KBTS_JOINING_FEATURE_MED2)); - - // Tag letters for joining features. - kbts_glyph PreviousGlyph_ = KBTS_ZERO; - kbts_glyph *PreviousGlyph = &PreviousGlyph_; - KBTS_FOR(GlyphIndex, 0, GlyphArray->Count) - { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - - if(Glyph->JoiningType != KBTS_UNICODE_JOINING_TYPE_TRANSPARENT) - { - Glyph->JoiningFeature = !PreviousGlyph->JoiningType ? KBTS_JOINING_FEATURE_INIT : KBTS_JOINING_FEATURE_FINA; - - if(JoiningTypesMatchLookup & (1ull << (Glyph->JoiningType + 8 * PreviousGlyph->JoiningType))) - { - PreviousGlyph->JoiningFeature = (JoiningFeatureTransition >> (8 * PreviousGlyph->JoiningFeature)) & 0xFF; - PreviousGlyph->Flags = (PreviousGlyph->Flags & ~KBTS_JOINING_FEATURE_MASK) | KBTS_JOINING_FEATURE_TO_GLYPH_FLAG(PreviousGlyph->JoiningFeature); - - Glyph->JoiningFeature = KBTS_JOINING_FEATURE_FINA; - } - else - { - Glyph->JoiningFeature = KBTS_JOINING_FEATURE_ISOL; - } - - if(Glyph->JoiningFeature) - { - // Be careful that this properly maps kbts_joining_feature to KBTS_GLYPH_FLAG! - Glyph->Flags = (Glyph->Flags & ~KBTS_JOINING_FEATURE_MASK) | KBTS_JOINING_FEATURE_TO_GLYPH_FLAG(Glyph->JoiningFeature); - } - - PreviousGlyph = Glyph; - } - } - - S->WrittenCount = GlyphArray->Count; - KBTS_INSTRUMENT_END - } - break; - - case KBTS_OP_KIND_GPOS_METRICS: - { - KBTS_INSTRUMENT_BLOCK_BEGIN("GPOS_METRICS") - // hmtx/vmtx pass. - int ClearMarkAdvances = (Config->Shaper == KBTS_SHAPER_MYANMAR) || (Config->Shaper == KBTS_SHAPER_USE); - kbts_u32 Orientation = KBTS_ORIENTATION_HORIZONTAL; // @Hardcoded - kbts_hea *Hea = Font->Hea[Orientation]; - kbts_u16 *Mtx = Font->Mtx[Orientation]; - - kbts_long_mtx *LongMetrics = 0; - kbts_s16 *ShortMetrics = 0; - if(Hea && Mtx) - { - LongMetrics = (kbts_long_mtx *)Mtx; - ShortMetrics = (kbts_s16 *)(LongMetrics + Hea->MetricCount); - } - - kbts_long_mtx DefaultMetric = {1024, 0}; - if(Font->Head) - { - DefaultMetric.Advance = Font->Head->UnitsPerEm; - if(Orientation == KBTS_ORIENTATION_HORIZONTAL) - { - DefaultMetric.Advance /= 2; - } - } - - KBTS_FOR(GlyphIndex, 0, GlyphArray->Count) - { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - - kbts_long_mtx Metric = DefaultMetric; - if(LongMetrics) - { - kbts_u32 Id = Glyph->Id; - - // At the end of shaping, default ignorable glyphs that are not generated by GSUB are replaced with zero-width - // whitespace glyphs (or a zero-width empty glyph if no whitespace glyph is present). - // (By the way, we do this because Harfbuzz does it, and Harfbuzz does it probably because Uniscribe does it.) - // We handle this in two steps: - // - The first is here. We want cursive attachments, and mark-to-base attachments, and other relative placements - // to take the zero width into account, and zeroing the width right at the beginning of GPOS is the most - // straighforward way to accomplish this. - // (@Incomplete: It is likely that we also need to take the default ignorable case into account when accumulating - // cursive offsets.) - // - In POST_GPOS_FIXUP, we perform the glyph ID substitution. We have to wait until all GPOS features have been - // executed to do this because they might possibly match the original ID. - if(!(Glyph->Flags & KBTS_GLYPH_FLAG_GENERATED_BY_GSUB) && (Glyph->UnicodeFlags & KBTS_UNICODE_FLAG_DEFAULT_IGNORABLE)) - { - Metric.Advance = 0; - Metric.PreviousSideBearing = 0; - } - else if(Id < Hea->MetricCount) - { - Metric = LongMetrics[Id]; - } - else - { - Metric.Advance = LongMetrics[Hea->MetricCount - 1].Advance; - Metric.PreviousSideBearing = ShortMetrics[Id - Hea->MetricCount]; - } - } - - if(!ClearMarkAdvances | (Glyph->Classes.Class != KBTS_GLYPH_CLASS_MARK)) - { - if(Orientation == KBTS_ORIENTATION_HORIZONTAL) - { - // @Cleanup: Why does harfbuzz not take bearings into account in these tests? - // P.X += Metric.PreviousSideBearing; - Glyph->AdvanceX = Metric.Advance; - } - else - { - // @Cleanup: Why does harfbuzz not take bearings into account in these tests? - // P.Y += Metric.PreviousSideBearing; - Glyph->AdvanceY = Metric.Advance; - } - } - } - KBTS_INSTRUMENT_END - } - break; - - case KBTS_OP_KIND_GPOS_FEATURES: - { - KBTS_INSTRUMENT_BLOCK_BEGIN("GPOS_FEATURES") - kbts_gsub_gpos *Gpos = Font->ShapingTables[KBTS_SHAPING_TABLE_GPOS]; - kbts_BeginFeatures(S, Config, KBTS_SHAPING_TABLE_GPOS, Op->Features); - kbts_lookup_list *LookupList = kbts_GetLookupList(Gpos); - kbts_un LookupIndex; - kbts_skip_flags SkipFlags; - kbts_u32 GlyphFilter; - kbts_feature_set LookupFeatures; - while(kbts_NextLookupIndex(S, &LookupIndex, &SkipFlags, &GlyphFilter, &LookupFeatures)) - { - kbts_lookup *PackedLookup = kbts_GetLookup(LookupList, LookupIndex); - kbts_unpacked_lookup Lookup = kbts_UnpackLookup(Font->Gdef, PackedLookup); - - kbts_un PositionedGlyphCount = 0; - while(PositionedGlyphCount < GlyphArray->Count) - { - kbts_un DeltaGlyphIndex = 1; - - if(kbts_GlyphIncludedInLookup(Config->Font, 1, LookupIndex, GlyphArray->Glyphs[PositionedGlyphCount].Id) && - kbts_ConfigAllowsFeatures(S, Config, Glyphs[PositionedGlyphCount].Config, &LookupFeatures)) - { - KBTS_FOR(SubtableIndex, 0, Lookup.SubtableCount) - { - kbts_u16 *Subtable = KBTS_POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[SubtableIndex]); - kbts_do_single_adjustment_result Adjustment = kbts_DoSingleAdjustment(Config, LookupList, LookupIndex, SubtableIndex, &Lookup, Subtable, GlyphArray, PositionedGlyphCount, SkipFlags); - if(Adjustment.PerformedAdjustment) + kbts_glyph *LvtGlyph = &LvtGlyphs[LvtGlyphIndex]; + kbts_glyph *NewGlyph = kbts__InsertGlyphBefore(Storage, Next, LvtGlyph); + if(!NewGlyph) { - DeltaGlyphIndex = Adjustment.PositionedGlyphCount; - break; + goto OutOfMemory; } } } - PositionedGlyphCount += DeltaGlyphIndex; + Glyph = Next; } + // KBTS_INSTRUMENT_BLOCK_END(NORMALIZE_HANGUL); } - KBTS_INSTRUMENT_END - } - break; + break; - case KBTS_OP_KIND_POST_GPOS_FIXUP: - { - KBTS_INSTRUMENT_BLOCK_BEGIN("POST_GPOS_FIXUP") - kbts_un WriteAt = 0; - kbts_glyph WhitespaceGlyph = Config->Whitespace; - int ClearMarkAdvances = kbts_ShaperClearsMarkAdvancesInPostGposFixup(Config->Shaper); - - if(ShapeState->MainDirection != ShapeState->RunDirection) + case KBTS__OP_KIND_GSUB_FEATURES: { - // Flip direction. - // This might seem like a totally superfluous thing to do, because we have to do a bunch - // of work to reverse glyph order while still preserving their relative positions. - // However, for mainly LTR documents, the anchor position will naturally be left-aligned, - // while, in RTL documents, it will naturally right-align. - // As such, going through the glyph sequence and reversing it is needed _anyway_ at some point, - // and we might as well do it here, because this is where we can take resolve attachments - // for relatively cheap, since they are always back-looking. (The next paragraph explains this - // in more detail.) + KBTS_INSTRUMENT_BLOCK_BEGIN(GSUB_FEATURES); - // The unintuitive part about this pass is the glyph advances. - // Normally, when iterating over a sequence of glyphs, we see base glyphs before marks. Obviously. - // However, when flipping the sequence, we see the marks before seeing the bases, which means we - // won't have accumulated the base glyph's advance yet! So we have to go through the sequence here - // and compensate for missing advances by precomputing them and baking them into the marks. - // Another way to reach the same result would be to keep marks on the same side as their bases when - // flipping, but that is not what Harfbuzz does, and, the day we decide we want to diverge from Harfbuzz, - // we will very likely be better off not flipping the sequence at all and deleting all of this garbage code. - kbts_s32 MarkAttachAdvanceX = 0; - kbts_s32 MarkAttachAdvanceY = 0; - KBTS_FOR(GlyphIndex, 0, GlyphArray->Count) + kbts__gsub_gpos *FontGsub = kbts__BlobTableDataType(Font->Blob, KBTS_BLOB_TABLE_ID_GSUB, kbts__gsub_gpos); + kbts_lookup_list *LookupList; LookupList = kbts__GetLookupList(FontGsub); + kbts__arena_lifetime Lifetime = kbts__BeginLifetime(Scratchpad->Arena); + kbts__gsub_frame *Frames = kbts__PushArray(Scratchpad->Arena, kbts__gsub_frame, KBTS_LOOKUP_STACK_SIZE); + kbts_u32 GlyphFilter; + kbts__skip_flags SkipFlags; + kbts_un LookupIndex; + + if(kbts__BeginFeatures(Scratchpad, Config, KBTS_SHAPING_TABLE_GSUB)) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - - if(Glyph->AttachGlyphIndexPlusOne) + while(kbts__NextLookupIndex(Scratchpad, Config, &LookupIndex, &SkipFlags, &GlyphFilter, &Scratchpad->LookupFeatures)) { - kbts_glyph *Attach = &Glyphs[Glyph->AttachGlyphIndexPlusOne - 1]; - kbts_s32 AttachAdvanceX = MarkAttachAdvanceX; - kbts_s32 AttachAdvanceY = MarkAttachAdvanceY; - if(Attach->Classes.Class != KBTS_GLYPH_CLASS_MARK) + kbts__lookup *Lookup = kbts__GetLookup(LookupList, LookupIndex); + + // From the Microsoft docs: + // If a Lookup table has multiple subtables, the subtables are processed in order, testing the glyph sequence + // at the current glyph position for a match with the input sequence patterns specified by each subtable in + // turn. + // + // This means the subtable loop is _inside_ of the loop over our glyphs. + + // Reverse chaining substitutions are tricky. + // See the comment at :ReverseChaining. + for(kbts_glyph *Glyph = (Lookup->Type == 8) ? Storage->GlyphSentinel.Prev : Storage->GlyphSentinel.Next; + kbts__GlyphIsValid(Storage, Glyph); + ) { - AttachAdvanceX = Attach->AdvanceX; - AttachAdvanceY = Attach->AdvanceY; + kbts__BeginLookupApplication(Scratchpad, Glyph); + kbts_un FrameCount = 0; + kbts_u32 FilterMask = Config->Shaper == KBTS_SHAPER_USE ? KBTS__USE_GLYPH_FEATURE_MASK : KBTS__GLYPH_FEATURE_MASK; + kbts_u32 EffectiveGlyphFilter = GlyphFilter & FilterMask; + + if(kbts__GlyphIncludedInLookup(Font, 0, LookupIndex, Glyph->Id) && + ((Glyph->Flags & EffectiveGlyphFilter) == EffectiveGlyphFilter) && + kbts__ConfigAllowsFeatures(Scratchpad, Config, Glyph->Config, &Scratchpad->LookupFeatures)) + { + kbts__gsub_frame FirstFrame = KBTS__ZERO; + FirstFrame.LookupIndex = (kbts_u16)LookupIndex; + FirstFrame.InputGlyph = Glyph; + + Frames[0] = FirstFrame; + FrameCount = 1; + + while(FrameCount) + { + // These flags are used by USE. + kbts_u32 GeneratedGlyphFlags = GlyphFilter & (KBTS_GLYPH_FLAG_RPHF | KBTS_GLYPH_FLAG_PREF); + kbts__DoSubstitution(Scratchpad, Config, Storage, LookupList, Frames, &FrameCount, 0, SkipFlags, GeneratedGlyphFlags); + } + } + + kbts_glyph *OnePastLast = kbts__EndLookupApplication(Scratchpad); + Glyph = (Lookup->Type == 8) ? Glyph->Prev : OnePastLast; } - Glyph->OffsetX += AttachAdvanceX; - Glyph->OffsetY += AttachAdvanceY; - MarkAttachAdvanceX = AttachAdvanceX; - MarkAttachAdvanceY = AttachAdvanceY; } } - kbts_un SwapCount = GlyphArray->Count / 2; - KBTS_FOR(LeftIndex, 0, SwapCount) - { - kbts_un RightIndex = GlyphArray->Count - 1 - LeftIndex; - - kbts_glyph SwapGlyph = Glyphs[LeftIndex]; - Glyphs[LeftIndex] = Glyphs[RightIndex]; - Glyphs[RightIndex] = SwapGlyph; - } + kbts__EndLifetime(&Lifetime); + KBTS_INSTRUMENT_BLOCK_END(GSUB_FEATURES); } + break; - // Make default ignorables that weren't explicitly created by the font invisible. - // - // It is tempting to put this loop inside of an if(WhitespaceGlyph.Id), just like we do - // for dotted circle insertion. However, Harfbuzz does not do this! - // When the font does not contain a dotted circle, nothing is inserted, but when the font - // does not contain a whitespace glyph, _we still insert an empty glyph_. - KBTS_FOR(GlyphIndex, 0, GlyphArray->Count) + case KBTS__OP_KIND_FLAG_JOINING_LETTERS: { - kbts_glyph Glyph = Glyphs[GlyphIndex]; - int Write = 0; + KBTS_INSTRUMENT_BLOCK_BEGIN(FLAG_JOINING_LETTERS); + kbts_u64 JoiningTypesMatchLookup = + (((1ull << KBTS_UNICODE_JOINING_TYPE_RIGHT) | (1ull << KBTS_UNICODE_JOINING_TYPE_DUAL) | (1ull << KBTS_UNICODE_JOINING_TYPE_FORCE)) << (8 * KBTS_UNICODE_JOINING_TYPE_LEFT)) | + (((1ull << KBTS_UNICODE_JOINING_TYPE_RIGHT) | (1ull << KBTS_UNICODE_JOINING_TYPE_DUAL) | (1ull << KBTS_UNICODE_JOINING_TYPE_FORCE)) << (8 * KBTS_UNICODE_JOINING_TYPE_DUAL)) | + (((1ull << KBTS_UNICODE_JOINING_TYPE_RIGHT) | (1ull << KBTS_UNICODE_JOINING_TYPE_DUAL) | (1ull << KBTS_UNICODE_JOINING_TYPE_FORCE)) << (8 * KBTS_UNICODE_JOINING_TYPE_FORCE)); - // It might be tempting to keep glyphs that were used in GPOS, but Harfbuzz doesn't care. - if(!(Glyph.Flags & KBTS_GLYPH_FLAG_GENERATED_BY_GSUB) && (Glyph.UnicodeFlags & KBTS_UNICODE_FLAG_DEFAULT_IGNORABLE)) + kbts_u64 JoiningFeatureTransition = ((kbts_u64)KBTS_JOINING_FEATURE_INIT << (8 * KBTS_JOINING_FEATURE_ISOL)) | ((kbts_u64)KBTS_JOINING_FEATURE_MEDI << (8 * KBTS_JOINING_FEATURE_FINA)) | + ((kbts_u64)KBTS_JOINING_FEATURE_MEDI << (8 * KBTS_JOINING_FEATURE_MEDI)) | ((kbts_u64)KBTS_JOINING_FEATURE_MED2 << (8 * KBTS_JOINING_FEATURE_MED2)); + + // Tag letters for joining features. + kbts_glyph PreviousGlyph_ = KBTS__ZERO; + kbts_glyph *PreviousGlyph = &PreviousGlyph_; + KBTS__FOR_GLYPH(Storage, Glyph) { - // This glyph is default ignorable and should be ignored. - if(WhitespaceGlyph.Id) + if(Glyph->JoiningType != KBTS_UNICODE_JOINING_TYPE_TRANSPARENT) { - Write = 1; - Glyph = WhitespaceGlyph; - } - } - else - { - if(ClearMarkAdvances && (Glyph.Classes.Class == KBTS_GLYPH_CLASS_MARK)) - { - Glyph.AdvanceX = Glyph.AdvanceY = 0; - } - Write = 1; - } + Glyph->JoiningFeature = (kbts_joining_feature)(!PreviousGlyph->JoiningType ? KBTS_JOINING_FEATURE_INIT : KBTS_JOINING_FEATURE_FINA); - if(Write) - { - Glyphs[WriteAt++] = Glyph; - } - } - - GlyphArray->Count = (kbts_u32)WriteAt; - GlyphArray->TotalCount = GlyphArray->Count; - KBTS_INSTRUMENT_END - } - break; - - case KBTS_OP_KIND_STCH_POSTPASS: - { - KBTS_FOR(GlyphIndex, 0, GlyphArray->Count) - { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - - if(Glyph->Flags & (KBTS_GLYPH_FLAG_STCH_ENDPOINT | KBTS_GLYPH_FLAG_STCH_EXTENSION)) - { - kbts_un At = GlyphIndex; - - kbts_un ExtensionIndex = At; - kbts_u32 SawExtension = 0; - - kbts_s32 EndpointWidth = 0; - kbts_s32 ExtensionWidth = 0; - - while(At < GlyphArray->Count) - { - kbts_glyph *AtGlyph = &Glyphs[At]; - - if(AtGlyph->Flags & KBTS_GLYPH_FLAG_STCH_ENDPOINT) + if(JoiningTypesMatchLookup & (1ull << (Glyph->JoiningType + 8 * PreviousGlyph->JoiningType))) { - EndpointWidth += AtGlyph->AdvanceX; + PreviousGlyph->JoiningFeature = (JoiningFeatureTransition >> (8 * PreviousGlyph->JoiningFeature)) & 0xFF; + PreviousGlyph->Flags = (PreviousGlyph->Flags & ~KBTS__JOINING_FEATURE_MASK) | KBTS__JOINING_FEATURE_TO_GLYPH_FLAG(PreviousGlyph->JoiningFeature); - At += 1; - } - else if(AtGlyph->Flags & KBTS_GLYPH_FLAG_STCH_EXTENSION) - { - ExtensionIndex = At; - ExtensionWidth += AtGlyph->AdvanceX; - SawExtension = 1; - - At += 1; + Glyph->JoiningFeature = KBTS_JOINING_FEATURE_FINA; } else { - break; + Glyph->JoiningFeature = KBTS_JOINING_FEATURE_ISOL; } + + if(Glyph->JoiningFeature) + { + // Be careful that this properly maps kbts_joining_feature to KBTS_GLYPH_FLAG! + Glyph->Flags = (Glyph->Flags & ~KBTS__JOINING_FEATURE_MASK) | KBTS__JOINING_FEATURE_TO_GLYPH_FLAG(Glyph->JoiningFeature); + } + + PreviousGlyph = Glyph; } + } - kbts_sn WordWidth = 0; + KBTS_INSTRUMENT_BLOCK_END(FLAG_JOINING_LETTERS); + } + break; - while(At < GlyphArray->Count) + case KBTS__OP_KIND_GPOS_METRICS: + { + KBTS_INSTRUMENT_BLOCK_BEGIN(GPOS_METRICS); + // hmtx/vmtx pass. + int ClearMarkAdvances = (Config->Shaper == KBTS_SHAPER_MYANMAR) || (Config->Shaper == KBTS_SHAPER_USE); + + kbts_u32 Orientation = KBTS_ORIENTATION_HORIZONTAL; // @Hardcoded + kbts_blob_table_id HeaTableId = KBTS_BLOB_TABLE_ID_HHEA; + kbts_blob_table_id MtxTableId = KBTS_BLOB_TABLE_ID_HMTX; + if(Orientation == KBTS_ORIENTATION_VERTICAL) + { + HeaTableId = KBTS_BLOB_TABLE_ID_VHEA; + MtxTableId = KBTS_BLOB_TABLE_ID_VMTX; + } + + kbts__hea *Hea = kbts__BlobTableDataType(Font->Blob, HeaTableId, kbts__hea); + kbts_u16 *Mtx = kbts__BlobTableDataType(Font->Blob, MtxTableId, kbts_u16); + + kbts__long_mtx *LongMetrics = 0; + // :LeftSideBearing + // kbts_s16 *ShortMetrics = 0; + if(Hea && Mtx) + { + LongMetrics = (kbts__long_mtx *)Mtx; + // :LeftSideBearing + // ShortMetrics = (kbts_s16 *)(LongMetrics + Hea->MetricCount); + } + + kbts__long_mtx DefaultMetric = {1024, 0}; + kbts__head *Head = kbts__BlobTableDataType(Font->Blob, KBTS_BLOB_TABLE_ID_HEAD, kbts__head); + if(Head) + { + DefaultMetric.Advance = Head->UnitsPerEm; + if(Orientation == KBTS_ORIENTATION_HORIZONTAL) { - kbts_glyph *AtGlyph = &Glyphs[At]; + DefaultMetric.Advance /= 2; + } + } - int Ok = 0; + KBTS__FOR_GLYPH(Storage, Glyph) + { + kbts__SetCursiveFlags(Glyph, 0); - if(!(AtGlyph->Flags & (KBTS_GLYPH_FLAG_STCH_ENDPOINT | KBTS_GLYPH_FLAG_STCH_EXTENSION)) && (AtGlyph->UnicodeFlags & KBTS_UNICODE_FLAG_PART_OF_WORD)) + kbts__long_mtx Metric = DefaultMetric; + if(LongMetrics) + { + kbts_u32 Id = Glyph->Id; + + // At the end of shaping, default ignorable glyphs that are not generated by GSUB are replaced with zero-width + // whitespace glyphs (or a zero-width empty glyph if no whitespace glyph is present). + // (By the way, we do this because Harfbuzz does it, and Harfbuzz does it probably because Uniscribe does it.) + // We handle this in two steps: + // - The first is here. We want cursive attachments, and mark-to-base attachments, and other relative placements + // to take the zero width into account, and zeroing the width right at the beginning of GPOS is the most + // straighforward way to accomplish this. + // (@Incomplete: It is likely that we also need to take the default ignorable case into account when accumulating + // cursive offsets.) + // - In POST_GPOS_FIXUP, we perform the glyph ID substitution. We have to wait until all GPOS features have been + // executed to do this because they might possibly match the original ID. + if(!(Glyph->Flags & KBTS_GLYPH_FLAG_GENERATED_BY_GSUB) && (Glyph->UnicodeFlags & KBTS_UNICODE_FLAG_DEFAULT_IGNORABLE)) { - Ok = 1; + Metric.Advance = 0; + // :LeftSideBearing + // Metric.PreviousSideBearing = 0; } - - if(Ok) + else if(Id < Hea->MetricCount) { - WordWidth += AtGlyph->AdvanceX; - - At += 1; + Metric = LongMetrics[Id]; } else { - break; + Metric.Advance = LongMetrics[Hea->MetricCount - 1].Advance; + // :LeftSideBearing + // Metric.PreviousSideBearing = ShortMetrics[Id - Hea->MetricCount]; } } - if(WordWidth > EndpointWidth) + if(!ClearMarkAdvances | (Glyph->Classes.Class != KBTS__GLYPH_CLASS_MARK)) { - kbts_sn ExtensionCount = (WordWidth - EndpointWidth) / ExtensionWidth; - if((ExtensionWidth * ExtensionCount) < (WordWidth - EndpointWidth)) + if(Orientation == KBTS_ORIENTATION_HORIZONTAL) { - ExtensionCount += 1; + // :LeftSideBearing + // Why does harfbuzz not take bearings into account in these tests? + // P.X += Metric.PreviousSideBearing; + Glyph->AdvanceX = Metric.Advance; } + else + { + // :LeftSideBearing + // Why does harfbuzz not take bearings into account in these tests? + // P.Y += Metric.PreviousSideBearing; + Glyph->AdvanceY = Metric.Advance; + } + } + } + KBTS_INSTRUMENT_BLOCK_END(GPOS_METRICS); + } + break; - (void)ExtensionCount; - (void)ExtensionIndex; - (void)SawExtension; - /* @Incomplete - kbts_glyph_adjustment *ExtensionAdjustment = &Positions[ExtensionIndex]; - ExtensionAdjustment->LastRepeatIndex = ExtensionCount - 1; - ExtensionAdjustment->RepeatOffsetX = (WordWidth - EndpointWidth - ExtensionWidth) / ExtensionCount; - */ + case KBTS__OP_KIND_GPOS_FEATURES: + { + KBTS_INSTRUMENT_BLOCK_BEGIN(GPOS_FEATURES); + kbts__gsub_gpos *Gpos = kbts__BlobTableDataType(Font->Blob, KBTS_BLOB_TABLE_ID_GPOS, kbts__gsub_gpos); + + if(kbts__BeginFeatures(Scratchpad, Config, KBTS_SHAPING_TABLE_GPOS)) + { + kbts_lookup_list *LookupList = kbts__GetLookupList(Gpos); + kbts_un LookupIndex; + kbts__skip_flags SkipFlags; + kbts_u32 GlyphFilter; + kbts__feature_set LookupFeatures; + while(kbts__NextLookupIndex(Scratchpad, Config, &LookupIndex, &SkipFlags, &GlyphFilter, &LookupFeatures)) + { + kbts__lookup *PackedLookup = kbts__GetLookup(LookupList, LookupIndex); + kbts__unpacked_lookup Lookup = kbts__UnpackLookup(kbts__BlobTableDataType(Font->Blob, KBTS_BLOB_TABLE_ID_GDEF, kbts__gdef), PackedLookup); + + kbts_glyph *Glyph = Storage->GlyphSentinel.Next; + while(kbts__GlyphIsValid(Storage, Glyph)) + { + kbts__BeginLookupApplication(Scratchpad, Glyph); + + if(kbts__GlyphIncludedInLookup(Config->Font, 1, LookupIndex, Glyph->Id) && + kbts__ConfigAllowsFeatures(Scratchpad, Config, Glyph->Config, &LookupFeatures)) + { + KBTS__FOR(SubtableIndex, 0, Lookup.SubtableCount) + { + kbts_u16 *Subtable = KBTS__POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[SubtableIndex]); + + if(kbts__DoSingleAdjustment(Scratchpad, Config, Storage, LookupList, + LookupIndex, SubtableIndex, &Lookup, Subtable, + Glyph, 0, SkipFlags)) + { + break; + } + } + } + + Glyph = kbts__EndLookupApplication(Scratchpad); + } + } + } + + KBTS_INSTRUMENT_BLOCK_END(GPOS_FEATURES); + } + break; + + case KBTS__OP_KIND_POST_GPOS_FIXUP: + { + KBTS_INSTRUMENT_BLOCK_BEGIN(POST_GPOS_FIXUP); + kbts_glyph WhitespaceGlyph = Config->Whitespace; + int ClearMarkAdvances = kbts__ShaperClearsMarkAdvancesInPostGposFixup(Config->Shaper); + + if(Scratchpad->RunDirection == KBTS_DIRECTION_RTL) + { + // Flip direction. + // This might seem like a totally superfluous thing to do, because we have to do a bunch + // of work to reverse glyph order while still preserving their relative positions. + // However, for mainly LTR documents, the anchor position will naturally be left-aligned, + // while, in RTL documents, it will naturally right-align. + // As such, going through the glyph sequence and reversing it is needed _anyway_ at some point, + // and we might as well do it here, because this is where we can take resolve attachments + // for relatively cheap, since they are always back-looking. (The next paragraph explains this + // in more detail.) + + // The unintuitive part about this pass is the glyph advances. + // Normally, when iterating over a sequence of glyphs, we see base glyphs before marks. Obviously. + // However, when flipping the sequence, we see the marks before seeing the bases, which means we + // won't have accumulated the base glyph's advance yet! So we have to go through the sequence here + // and compensate for missing advances by precomputing them and baking them into the marks. + // Another way to reach the same result would be to keep marks on the same side as their bases when + // flipping, but that is not what Harfbuzz does, and, the day we decide we want to diverge from Harfbuzz, + // we will very likely be better off not flipping the sequence at all and deleting all of this garbage code. + kbts_s32 MarkAttachAdvanceX = 0; + kbts_s32 MarkAttachAdvanceY = 0; + KBTS__FOR_GLYPH(Storage, Glyph) + { + kbts_glyph *Attach = Glyph->AttachGlyph; + if(Attach) + { + kbts_s32 AttachAdvanceX = MarkAttachAdvanceX; + kbts_s32 AttachAdvanceY = MarkAttachAdvanceY; + if(Attach->Classes.Class != KBTS__GLYPH_CLASS_MARK) + { + AttachAdvanceX = Attach->AdvanceX; + AttachAdvanceY = Attach->AdvanceY; + } + Glyph->OffsetX += AttachAdvanceX; + Glyph->OffsetY += AttachAdvanceY; + MarkAttachAdvanceX = AttachAdvanceX; + MarkAttachAdvanceY = AttachAdvanceY; + } } - GlyphIndex = At; + // Swap. + // @Speed: We could just choose the correct links when traversing instead. + kbts__DllistReverseSublist((kbts_glyph *)&Storage->GlyphSentinel, (kbts_glyph *)&Storage->GlyphSentinel); } + + // Make default ignorables that weren't explicitly created by the font invisible. + // + // It is tempting to put this loop inside of an if(WhitespaceGlyph.Id), just like we do + // for dotted circle insertion. However, Harfbuzz does not do this! + // When the font does not contain a dotted circle, nothing is inserted, but when the font + // does not contain a whitespace glyph, _we still insert an empty glyph_. + for(kbts_glyph *Glyph = Storage->GlyphSentinel.Next; + kbts__GlyphIsValid(Storage, Glyph); + ) + { + kbts_glyph *Next = Glyph->Next; + int Keep = 0; + + // It might be tempting to keep glyphs that were used in GPOS, but Harfbuzz doesn't care. + if(!(Glyph->Flags & KBTS_GLYPH_FLAG_GENERATED_BY_GSUB) && (Glyph->UnicodeFlags & KBTS_UNICODE_FLAG_DEFAULT_IGNORABLE)) + { + // This glyph is default ignorable and should be ignored. + if(WhitespaceGlyph.Id) + { + Keep = 1; + kbts__SetGlyphPreserveLinksAndUserId(Glyph, &WhitespaceGlyph); + } + } + else + { + if(ClearMarkAdvances && (Glyph->Classes.Class == KBTS__GLYPH_CLASS_MARK)) + { + Glyph->AdvanceX = Glyph->AdvanceY = 0; + } + Keep = 1; + } + + if(!Keep) + { + kbts__FreeGlyph(Scratchpad, Storage, Glyph); + } + + Glyph = Next; + } + + KBTS_INSTRUMENT_BLOCK_END(POST_GPOS_FIXUP); + } + break; + + case KBTS__OP_KIND_STCH_POSTPASS: + { + #if 0 + KBTS__FOR_GLYPH(ShapeState, Glyph) + { + if(Glyph->Flags & (KBTS_GLYPH_FLAG_STCH_ENDPOINT | KBTS_GLYPH_FLAG_STCH_EXTENSION)) + { + kbts_glyph *Extension = 0; + + kbts_s32 EndpointWidth = 0; + kbts_s32 ExtensionWidth = 0; + + while(kbts__GlyphIsValid(ShapeState, Glyph)) + { + kbts_glyph *AtGlyph = &Glyphs[At]; + + if(AtGlyph->Flags & KBTS_GLYPH_FLAG_STCH_ENDPOINT) + { + EndpointWidth += AtGlyph->AdvanceX; + + At += 1; + } + else if(AtGlyph->Flags & KBTS_GLYPH_FLAG_STCH_EXTENSION) + { + ExtensionIndex = At; + ExtensionWidth += AtGlyph->AdvanceX; + SawExtension = 1; + + At += 1; + } + else + { + break; + } + } + + kbts_sn WordWidth = 0; + + while(At < GlyphArray->Count) + { + kbts_glyph *AtGlyph = &Glyphs[At]; + + int Ok = 0; + + if(!(AtGlyph->Flags & (KBTS_GLYPH_FLAG_STCH_ENDPOINT | KBTS_GLYPH_FLAG_STCH_EXTENSION)) && (AtGlyph->UnicodeFlags & KBTS_UNICODE_FLAG_PART_OF_WORD)) + { + Ok = 1; + } + + if(Ok) + { + WordWidth += AtGlyph->AdvanceX; + + At += 1; + } + else + { + break; + } + } + + if(WordWidth > EndpointWidth) + { + kbts_sn ExtensionCount = (WordWidth - EndpointWidth) / ExtensionWidth; + if((ExtensionWidth * ExtensionCount) < (WordWidth - EndpointWidth)) + { + ExtensionCount += 1; + } + + (void)ExtensionCount; + (void)ExtensionIndex; + (void)SawExtension; + /* @Incomplete + kbts_glyph_adjustment *ExtensionAdjustment = &Positions[ExtensionIndex]; + ExtensionAdjustment->LastRepeatIndex = ExtensionCount - 1; + ExtensionAdjustment->RepeatOffsetX = (WordWidth - EndpointWidth - ExtensionWidth) / ExtensionCount; + */ + } + + GlyphIndex = At; + } + } + #endif + } + break; + } + + if(0) + { + OutOfMemory:; + Scratchpad->Error = KBTS_SHAPE_ERROR_OUT_OF_MEMORY; } } - break; - } - if(Op->Kind < KBTS_OP_KIND_GPOS_METRICS) - { - kbts_un DeltaCount = S->WrittenCount - GlyphArray->Count; - GlyphArray->Count += (kbts_u32)DeltaCount; - GlyphArray->TotalCount += (kbts_u32)DeltaCount; - } - - KBTS_INSTRUMENT_END - return 0; + KBTS_INSTRUMENT_FUNCTION_END; } -static kbts_glyph kbts_Substitute1(kbts_shape_state *ShapeState, kbts_lookup_list *LookupList, kbts_feature *Feature, kbts_skip_flags SkipFlags, kbts_glyph *Glyph) +static kbts_glyph kbts__Substitute1(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_glyph_storage *Storage, + kbts_lookup_list *LookupList, kbts__feature *Feature, kbts__skip_flags SkipFlags, kbts_glyph *Glyph) { kbts_glyph Result = *Glyph; + kbts_glyph TempSentinel; + TempSentinel.Prev = TempSentinel.Next = &Result; + Result.Prev = Result.Next = &TempSentinel; + kbts__glyph_list List = kbts__PushGlyphList(Storage, &Result, &Result); - kbts_glyph_array GlyphArray = kbts_GlyphArray(Glyph, 1, 1, 1); - - kbts_iterate_lookups IterateLookups = kbts_IterateLookups(LookupList, Feature); - while(kbts_NextLookup(&IterateLookups)) + kbts__iterate_lookups IterateLookups = kbts__IterateLookups(LookupList, Feature); + while(kbts__NextLookup(&IterateLookups)) { - kbts_gsub_frame Frames[8]; - Frames[0].InputGlyphCount = 1; - kbts_u32 FrameCount = 1; + kbts__gsub_frame Frames[8]; + { + kbts__gsub_frame *Frame = &Frames[0]; + *Frame = KBTS__ZERO_TYPE(kbts__gsub_frame); + Frame->LookupIndex = IterateLookups.LookupIndex; + Frame->SubtableIndex = 0; + Frame->StartIndex = 0; + Frame->InputGlyph = &Result; + } + kbts_un FrameCount = 1; while(FrameCount) { - kbts_substitution_result_flags SubstitutionResult = kbts_DoSubstitution(ShapeState, LookupList, Frames, &FrameCount, &GlyphArray, 0, SkipFlags, 0); - if(SubstitutionResult & KBTS_SUBSTITUTION_RESULT_FLAG_GROW_BUFFER) + kbts__substitution_result_flags SubstitutionResult = kbts__DoSubstitution(Scratchpad, Config, Storage, + LookupList, Frames, &FrameCount, 0, SkipFlags, 0); + if(SubstitutionResult & KBTS__SUBSTITUTION_RESULT_FLAG_TRIED_TO_INSERT_WHILE_CHECK_ONLY) { goto Done; } @@ -19887,73 +23028,78 @@ static kbts_glyph kbts_Substitute1(kbts_shape_state *ShapeState, kbts_lookup_lis } Done:; + kbts__PopGlyphList(Storage, &List); return Result; } -typedef struct kbts_attach_state +typedef struct kbts__attach_state { - kbts_syllabic_position CurrentPosition; - kbts_syllabic_position LastPositionThatWasNotPreBaseMatra; + kbts__syllabic_position CurrentPosition; + kbts__syllabic_position LastPositionThatWasNotPreBaseMatra; kbts_indic_syllabic_class LastClass; - kbts_un Start; - kbts_un OnePastLast; -} kbts_attach_state; + kbts_glyph *Start; + kbts_glyph *OnePastLast; + kbts_glyph *At; +} kbts__attach_state; -typedef struct kbts_begin_cluster_result +static kbts_glyph *kbts__BeginCluster(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_glyph_storage *Storage, + kbts_glyph *Glyph) { - kbts_un ClusterGlyphCount; - kbts_un InsertedGlyphCount; -} kbts_begin_cluster_result; - -static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, kbts_glyph *Glyphs, kbts_un GlyphCount) -{ - kbts_begin_cluster_result Result = KBTS_ZERO; - Result.ClusterGlyphCount = GlyphCount; - kbts_op_state *OpState = &ShapeState->OpState; - kbts_shape_config *Config = ShapeState->Config; kbts_font *Font = Config->Font; - ShapeState->RealCluster = 0; + kbts_glyph *Result = Glyph->Next; + kbts__arena_lifetime Lifetime = kbts__BeginLifetime(Scratchpad->Arena); + + Scratchpad->RealCluster = 0; switch(Config->Shaper) { case KBTS_SHAPER_INDIC: { - kbts_lookup_list *LookupList = kbts_GetLookupList(Font->ShapingTables[KBTS_SHAPING_TABLE_GSUB]); + kbts_lookup_list *LookupList = kbts__GetLookupList(kbts__BlobTableDataType(Font->Blob, KBTS_BLOB_TABLE_ID_GSUB, kbts__gsub_gpos)); - kbts_un OtherCount = 0; - while((OtherCount < GlyphCount) && ((Glyphs[OtherCount].SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_OTHER) || (Glyphs[OtherCount].SyllabicClass >= KBTS_INDIC_SYLLABIC_CLASS_COUNT))) + int NonCluster = 0; + while(kbts__GlyphIsValid(Storage, Glyph) && + ((Glyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_OTHER) || + (Glyph->SyllabicClass >= KBTS_INDIC_SYLLABIC_CLASS_COUNT))) { - ++OtherCount; + NonCluster = 1; + Glyph = Glyph->Next; } - if(OtherCount) - { - // Not an Indic syllable. - // Just pass it along. - Result.ClusterGlyphCount = OtherCount; - } - else + Result = Glyph; + + if(!NonCluster) { kbts_un ScanGlyphIndex = 0; kbts_un State = 0; kbts_un Broken = 1; kbts_un BrokenState = 0; + kbts_glyph *FirstGlyphs[3]; - while((ScanGlyphIndex < GlyphCount) && (State < KBTS_INDIC_SYLLABIC_STATE_COUNT)) + while(kbts__GlyphIsValid(Storage, Glyph) && + (State < KBTS_INDIC_SYLLABIC_STATE_COUNT)) { - kbts_glyph *Glyph = &Glyphs[ScanGlyphIndex]; kbts_un Class = Glyph->SyllabicClass; - if(KBTS_IN_SET(Class, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_RA)(KBTS_INDIC_SYLLABIC_CLASS_CONSONANT) - (KBTS_INDIC_SYLLABIC_CLASS_VOWEL)(KBTS_INDIC_SYLLABIC_CLASS_DOTTED_CIRCLE) - (KBTS_INDIC_SYLLABIC_CLASS_PLACEHOLDER)(KBTS_INDIC_SYLLABIC_CLASS_SYMBOL)))) + if(KBTS__IN_SET(Class, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_RA) + (KBTS_INDIC_SYLLABIC_CLASS_CONSONANT) + (KBTS_INDIC_SYLLABIC_CLASS_VOWEL) + (KBTS_INDIC_SYLLABIC_CLASS_DOTTED_CIRCLE) + (KBTS_INDIC_SYLLABIC_CLASS_PLACEHOLDER) + (KBTS_INDIC_SYLLABIC_CLASS_SYMBOL)))) { Broken = 0; } BrokenState = (BrokenState << 1) | Broken; + if(ScanGlyphIndex < KBTS__ARRAY_LENGTH(FirstGlyphs)) + { + FirstGlyphs[ScanGlyphIndex] = Glyph; + } + State = kbts_IndicSyllabicTransition[Class][State]; State -= 1; // @Incomplete @Cleanup: Decrement every state by 1 in the transition table. + Glyph = Glyph->Next; ScanGlyphIndex += 1; } @@ -19962,6 +23108,12 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, ScanGlyphIndex -= State - KBTS_INDIC_SYLLABIC_STATE_COUNT; BrokenState >>= State - KBTS_INDIC_SYLLABIC_STATE_COUNT; + while(State > KBTS_INDIC_SYLLABIC_STATE_COUNT) + { + Glyph = Glyph->Prev; + State -= 1; + } + if(!ScanGlyphIndex) { // If we backtrack all the way to the beginning, still eat a character. @@ -19974,11 +23126,15 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, // _strongly_ recommends that shapers use the font's tables instead, ie. doing tentative lookups // with specific features. - kbts_gsub_frame *Frames = KBTS_POINTER_AFTER(kbts_gsub_frame, OpState); - kbts_glyph *OnePastLastSyllableGlyph = Glyphs + ScanGlyphIndex; + kbts__gsub_frame *Frames = kbts__PushArray(Scratchpad->Arena, kbts__gsub_frame, KBTS_LOOKUP_STACK_SIZE); + kbts_glyph *OnePastLastSyllableGlyph = Glyph; + kbts_glyph *FirstGlyph = FirstGlyphs[0]; + kbts_glyph *OneBeforeSyllableGlyph = FirstGlyph->Prev; - if((Config->Script == KBTS_SCRIPT_KANNADA) && (ScanGlyphIndex >= 3) && (Glyphs[0].SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_RA) && - (Glyphs[1].SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) && (Glyphs[2].SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ)) + if((Config->Script == KBTS_SCRIPT_KANNADA) && (ScanGlyphIndex >= 3) && + (FirstGlyphs[0]->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_RA) && + (FirstGlyphs[1]->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) && + (FirstGlyphs[2]->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ)) { // In older versions of Unicode (~4.x, pre-2004), Ra-Virama-Zwj was recommended in Kannada // to communicate the intent of displaying (Ra + (next consonant as below-base form)). @@ -19986,40 +23142,48 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, // (next consonant as below-base form)) is Ra-Zwj-Virama. // Since Ra-Virama-Zwj is not a useful sequence that happens organically in Kannada, // we are free to transform it into Ra-Zwj-Virama here without losing information. - kbts_glyph Swap = Glyphs[1]; - Glyphs[1] = Glyphs[2]; - Glyphs[2] = Swap; + KBTS__DLLIST_SWAP(FirstGlyphs[1], FirstGlyphs[2]); + + // Also swap this, because this is used below for OnePastReph. + kbts_glyph *Swap = FirstGlyphs[1]; + FirstGlyphs[1] = FirstGlyphs[2]; + FirstGlyphs[2] = Swap; } kbts_glyph_flags RephFlags = KBTS_GLYPH_FLAG_RPHF; + kbts_glyph *OnePastReph = FirstGlyphs[0]; kbts_un OnePastRephIndex = 0; { // Reph tagging. // This first pass only figures out where the reph ends. // We delay updating glyph properties until we know whether the reph is the base or not. - kbts_glyph *First = &Glyphs[0]; - kbts_glyph *Second = &Glyphs[1]; - kbts_feature *Rphf = Config->Rphf; + kbts_glyph *Second = FirstGlyphs[1]; + kbts_glyph *Third = FirstGlyphs[2]; + kbts__feature *Rphf = Config->Rphf; switch(Config->IndicScriptProperties.RephEncoding) { - case KBTS_REPH_ENCODING_LOGICAL_REPHA: - if(First->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_REPHA) + case KBTS__REPH_ENCODING_LOGICAL_REPHA: + if(FirstGlyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_REPHA) { RephFlags = 0; OnePastRephIndex = 1; } break; - case KBTS_REPH_ENCODING_IMPLICIT: - if((ScanGlyphIndex >= 2) && (Second->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) && kbts_WouldSubstitute(ShapeState, LookupList, Frames, Rphf, 0, Glyphs, 2)) + case KBTS__REPH_ENCODING_IMPLICIT: + if((ScanGlyphIndex >= 2) && + (Second->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) && + kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Rphf, 0, FirstGlyphs[0], 2)) { OnePastRephIndex = 2; } break; - case KBTS_REPH_ENCODING_EXPLICIT: - if((ScanGlyphIndex >= 3) && (Second->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) && (Glyphs[2].SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ) && - kbts_WouldSubstitute(ShapeState, LookupList, Frames, Rphf, 0, Glyphs, 3)) + case KBTS__REPH_ENCODING_EXPLICIT: + if((ScanGlyphIndex >= 3) && + (Second->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) && + (Third->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ) && + kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Rphf, 0, FirstGlyphs[0], 3)) { OnePastRephIndex = 3; } @@ -20029,29 +23193,29 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, // Extend the reph with suffixed joiners. if(OnePastRephIndex) { - while((OnePastRephIndex < ScanGlyphIndex) && KBTS_IN_SET(Glyphs[OnePastRephIndex].SyllabicClass, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_ZWJ)(KBTS_INDIC_SYLLABIC_CLASS_ZWNJ)))) + OnePastReph = FirstGlyphs[OnePastRephIndex - 1]->Next; + while(kbts__GlyphIsValid(Storage, OnePastReph) && + KBTS__IN_SET(OnePastReph->SyllabicClass, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_ZWJ) + (KBTS_INDIC_SYLLABIC_CLASS_ZWNJ)))) { - OnePastRephIndex += 1; + OnePastReph = OnePastReph->Next; } } } - kbts_feature *Pref = Config->Pref; - kbts_un BaseIndex = ScanGlyphIndex; - kbts_un LastConsonantIndex = 0; - kbts_syllabic_position LastConsonantPosition = KBTS_SYLLABIC_POSITION_SYLLABLE_BASE; + kbts__feature *Pref = Config->Pref; + kbts_glyph *BaseGlyph = OnePastLastSyllableGlyph; + kbts_glyph *LastConsonant = 0; + kbts__syllabic_position LastConsonantPosition = KBTS__SYLLABIC_POSITION_SYLLABLE_BASE; if(Config->DottedCircle.Id && (BrokenState & 1)) { - // Insert a dotted circle after Reph. - for(kbts_un GlyphIndex = GlyphCount; GlyphIndex > OnePastRephIndex; --GlyphIndex) + BaseGlyph = kbts__InsertGlyphBefore(Storage, OnePastReph, &Config->DottedCircle); + if(!BaseGlyph) { - Glyphs[GlyphIndex] = Glyphs[GlyphIndex - 1]; + goto OutOfMemory; } - ScanGlyphIndex += 1; - Result.InsertedGlyphCount = 1; - Glyphs[OnePastRephIndex] = Config->DottedCircle; - BaseIndex = OnePastRephIndex; + BaseGlyph->UserIdOrCodepointIndex = OnePastReph->UserIdOrCodepointIndex; } else { @@ -20060,19 +23224,20 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, Scratch[0] = Config->Virama; Scratch[2] = Config->Virama; - kbts_feature *Locl = Config->Locl; - kbts_feature *Vatu = Config->Vatu; + kbts__feature *Locl = Config->Locl; + kbts__feature *Vatu = Config->Vatu; // pstf forms come last, then blwf. - kbts_feature *SectionFeature = Config->Pstf; - kbts_syllabic_position SectionPosition = KBTS_SYLLABIC_POSITION_POSTBASE_CONSONANT; + kbts__feature *SectionFeature = Config->Pstf; + kbts__syllabic_position SectionPosition = KBTS__SYLLABIC_POSITION_POSTBASE_CONSONANT; // If we see no consonant/matra, then surely we want to attach to the base. - kbts_syllabic_position SyllabicPosition = KBTS_SYLLABIC_POSITION_SYLLABLE_BASE; + kbts__syllabic_position SyllabicPosition = KBTS__SYLLABIC_POSITION_SYLLABLE_BASE; kbts_indic_syllabic_class LastClass = KBTS_INDIC_SYLLABIC_CLASS_COUNT; - for(kbts_un GlyphIndex = ScanGlyphIndex; GlyphIndex > OnePastRephIndex; --GlyphIndex) + for(Glyph = OnePastLastSyllableGlyph->Prev; + ; + Glyph = Glyph->Prev) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex - 1]; kbts_indic_syllabic_class Class = Glyph->SyllabicClass; switch(Class) @@ -20082,7 +23247,7 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, case KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_WITH_STACKER: case KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_MEDIAL: // Apply locl first. - Scratch[1] = kbts_Substitute1(ShapeState, LookupList, Locl, KBTS_SKIP_FLAG_ZWNJ | KBTS_SKIP_FLAG_ZWJ, Glyph); + Scratch[1] = kbts__Substitute1(Scratchpad, Config, Storage, LookupList, Locl, KBTS__SKIP_FLAG_ZWNJ | KBTS__SKIP_FLAG_ZWJ, Glyph); // Microsoft says to "move backwards until a consonant is found that does not have a below-base // or post-base form". @@ -20091,26 +23256,29 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, // syllable base. // So, as we sweep backward, set the base index on consonants unconditionally. // @Robustness: Do we want to update Base only if we do not match Pref/Vatu? - BaseIndex = GlyphIndex - 1; + BaseGlyph = Glyph; - if(kbts_WouldSubstitute(ShapeState, LookupList, Frames, Pref, 0, Scratch, 2) || kbts_WouldSubstitute(ShapeState, LookupList, Frames, Pref, 0, Scratch + 1, 2) || - kbts_WouldSubstitute(ShapeState, LookupList, Frames, Vatu, 0, Scratch, 2) || kbts_WouldSubstitute(ShapeState, LookupList, Frames, Vatu, 0, Scratch + 1, 2)) + if(kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Pref, 0, Scratch, 2) || + kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Pref, 0, Scratch + 1, 2) || + kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Vatu, 0, Scratch, 2) || + kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Vatu, 0, Scratch + 1, 2)) { - SyllabicPosition = KBTS_SYLLABIC_POSITION_POSTBASE_CONSONANT; + SyllabicPosition = KBTS__SYLLABIC_POSITION_POSTBASE_CONSONANT; } else { for(;;) { - if(kbts_WouldSubstitute(ShapeState, LookupList, Frames, SectionFeature, 0, Scratch, 2) || kbts_WouldSubstitute(ShapeState, LookupList, Frames, SectionFeature, 0, Scratch + 1, 2)) + if(kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, SectionFeature, 0, Scratch, 2) || + kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, SectionFeature, 0, Scratch + 1, 2)) { SyllabicPosition = SectionPosition; break; } - else if(SectionPosition == KBTS_SYLLABIC_POSITION_POSTBASE_CONSONANT) + else if(SectionPosition == KBTS__SYLLABIC_POSITION_POSTBASE_CONSONANT) { SectionFeature = Config->Blwf; - SectionPosition = KBTS_SYLLABIC_POSITION_BELOWBASE_CONSONANT; + SectionPosition = KBTS__SYLLABIC_POSITION_BELOWBASE_CONSONANT; // Retry with Blwf. } else @@ -20120,9 +23288,9 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, } } - if(!LastConsonantIndex) + if(!LastConsonant) { - LastConsonantIndex = GlyphIndex - 1; + LastConsonant = Glyph; LastConsonantPosition = SyllabicPosition; } @@ -20132,7 +23300,7 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, case KBTS_INDIC_SYLLABIC_CLASS_VOWEL: case KBTS_INDIC_SYLLABIC_CLASS_PLACEHOLDER: case KBTS_INDIC_SYLLABIC_CLASS_DOTTED_CIRCLE: - BaseIndex = GlyphIndex - 1; + BaseGlyph = Glyph; goto DoneScanningForBase; break; @@ -20152,67 +23320,72 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, } LastClass = Class; + if(Glyph == OnePastReph) + { + break; + } } DoneScanningForBase:; } // Fix reph position now. - if(OnePastRephIndex) + if(OnePastReph != FirstGlyph) { - kbts_syllabic_position RephPosition = KBTS_SYLLABIC_POSITION_RA_TO_BECOME_REPH; + kbts__syllabic_position RephPosition = KBTS__SYLLABIC_POSITION_RA_TO_BECOME_REPH; kbts_glyph_flags Flags = RephFlags; - kbts_un OnePastLast = OnePastRephIndex; - if(BaseIndex == ScanGlyphIndex) + kbts_un RephGlyphCount = OnePastRephIndex; + if(BaseGlyph == OnePastLastSyllableGlyph) { - RephPosition = KBTS_SYLLABIC_POSITION_SYLLABLE_BASE; + RephPosition = KBTS__SYLLABIC_POSITION_SYLLABLE_BASE; Flags = 0; - BaseIndex = 0; - OnePastRephIndex = 0; + BaseGlyph = OnePastReph = FirstGlyph; } - KBTS_FOR(GlyphIndex, 0, OnePastLast) + KBTS__FOR(GlyphIndex, 0, RephGlyphCount) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - Glyph->SyllabicPosition = RephPosition; - Glyph->Flags |= Flags; + kbts_glyph *RephGlyph = FirstGlyphs[GlyphIndex]; + RephGlyph->SyllabicPosition = RephPosition; + RephGlyph->Flags |= Flags; } } - if(BaseIndex < ScanGlyphIndex) + if(BaseGlyph != OnePastLastSyllableGlyph) { - Glyphs[BaseIndex].SyllabicPosition = KBTS_SYLLABIC_POSITION_SYLLABLE_BASE; + BaseGlyph->SyllabicPosition = KBTS__SYLLABIC_POSITION_SYLLABLE_BASE; - if(!LastConsonantIndex) + if(!LastConsonant) { - LastConsonantIndex = BaseIndex; + LastConsonant = BaseGlyph; // LastConsonantPosition is already set to SYLLABLE_BASE. } } { // Reorder marks. // @Cleanup @Speed: Supposedly, NORMALIZE already does this... - kbts_glyph *ReorderGlyph = Glyphs + ScanGlyphIndex - 1; - while(ReorderGlyph >= Glyphs) + kbts_glyph *ReorderGlyph = OnePastLastSyllableGlyph->Prev; + while(ReorderGlyph != OneBeforeSyllableGlyph) { if(ReorderGlyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_NUKTA) { - kbts_glyph *Prev = ReorderGlyph - 1; + kbts_glyph *Prev = ReorderGlyph->Prev; - while((Prev >= Glyphs) && KBTS_IN_SET(Prev->SyllabicClass, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_HALANT)(KBTS_INDIC_SYLLABIC_CLASS_VEDIC_SIGN)))) + while((Prev != OneBeforeSyllableGlyph) && + KBTS__IN_SET(Prev->SyllabicClass, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_HALANT) + (KBTS_INDIC_SYLLABIC_CLASS_VEDIC_SIGN)))) { - kbts_glyph Swap = *Prev; - *Prev = Prev[1]; - Prev[1] = Swap; + kbts_glyph *NextPrev = Prev->Prev; - Prev -= 1; + KBTS__DLLIST_SWAP(Prev, Prev->Next); + + Prev = NextPrev; } ReorderGlyph = Prev; } else { - ReorderGlyph -= 1; + ReorderGlyph = ReorderGlyph->Prev; } } } @@ -20222,12 +23395,13 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, // We want to bake this ordering into our sort, so we increase our syllabic position bits // and sub-order matras with the low nibble. (There should only be 4 matras tops, anyway.) kbts_un LeftMatraCount = 0; - KBTS_FOR(GlyphIndex, 0, ScanGlyphIndex) + for(Glyph = OneBeforeSyllableGlyph->Next; + Glyph != OnePastLastSyllableGlyph; + Glyph = Glyph->Next) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; Glyph->SyllabicPosition <<= 4; - if(Glyph->SyllabicPosition == (KBTS_SYLLABIC_POSITION_PREBASE_MATRA << 4)) + if(Glyph->SyllabicPosition == (KBTS__SYLLABIC_POSITION_PREBASE_MATRA << 4)) { Glyph->SyllabicPosition += (15 - LeftMatraCount++) & 0xF; } @@ -20241,20 +23415,36 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, // a pre-base+base part (right attachments), a post-base consonant part (left attachments), and // a post-consonant part (right attachments again). // This part handles right attachments. Left attachments were handled in the base syllable search. - kbts_attach_state States[2] = { - {KBTS_SYLLABIC_POSITION_RA_TO_BECOME_REPH << 4, KBTS_SYLLABIC_POSITION_RA_TO_BECOME_REPH << 4, KBTS_INDIC_SYLLABIC_CLASS_COUNT, OnePastRephIndex, BaseIndex}, - {(kbts_u8)(LastConsonantPosition << 4), (kbts_u8)(LastConsonantPosition << 4), KBTS_INDIC_SYLLABIC_CLASS_COUNT, LastConsonantIndex + 1, ScanGlyphIndex}, - }; - kbts_un Iterations = KBTS_MAX(States[0].OnePastLast - States[0].Start, States[1].OnePastLast - States[1].Start); - KBTS_FOR(GlyphIndex, 0, Iterations) - { - KBTS_FOR(StateIndex, 0, KBTS_ARRAY_LENGTH(States)) + kbts__attach_state States[2] = { { - kbts_attach_state *Attach = &States[StateIndex]; + KBTS__SYLLABIC_POSITION_RA_TO_BECOME_REPH << 4, + KBTS__SYLLABIC_POSITION_RA_TO_BECOME_REPH << 4, + KBTS_INDIC_SYLLABIC_CLASS_COUNT, + OnePastReph, + BaseGlyph, + OnePastReph, + }, + { + (kbts_u8)(LastConsonantPosition << 4), + (kbts_u8)(LastConsonantPosition << 4), + KBTS_INDIC_SYLLABIC_CLASS_COUNT, + LastConsonant ? LastConsonant->Next : OnePastLastSyllableGlyph, + OnePastLastSyllableGlyph, + LastConsonant ? LastConsonant->Next : OnePastLastSyllableGlyph, + }, + }; + for(;;) + { + int Done = 1; - if((Attach->Start + GlyphIndex) < Attach->OnePastLast) + KBTS__FOR(StateIndex, 0, KBTS__ARRAY_LENGTH(States)) + { + kbts__attach_state *Attach = &States[StateIndex]; + + if(Attach->At != Attach->OnePastLast) { - kbts_glyph *Glyph = &Glyphs[Attach->Start + GlyphIndex]; + Glyph = Attach->At; + kbts_indic_syllabic_class Class = Glyph->SyllabicClass; switch(Class) { @@ -20263,8 +23453,8 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, case KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_WITH_STACKER: case KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_MEDIAL: // This only happens in the pre-base state. - Glyph->SyllabicPosition = (KBTS_SYLLABIC_POSITION_PREBASE_CONSONANT << 4); - Attach->CurrentPosition = (KBTS_SYLLABIC_POSITION_PREBASE_CONSONANT << 4); + Glyph->SyllabicPosition = (KBTS__SYLLABIC_POSITION_PREBASE_CONSONANT << 4); + Attach->CurrentPosition = (KBTS__SYLLABIC_POSITION_PREBASE_CONSONANT << 4); break; case KBTS_INDIC_SYLLABIC_CLASS_MATRA_POST: @@ -20274,18 +23464,18 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, // and not to the consonant. if(Attach->LastClass == KBTS_INDIC_SYLLABIC_CLASS_SYLLABLE_MODIFIER) { - Glyph[-1].SyllabicPosition = Glyph->SyllabicPosition; + Glyph->Prev->SyllabicPosition = Glyph->SyllabicPosition; } case KBTS_INDIC_SYLLABIC_CLASS_MATRA: Attach->CurrentPosition = Glyph->SyllabicPosition; - if((Attach->CurrentPosition >> 4) != KBTS_SYLLABIC_POSITION_PREBASE_MATRA) + if((Attach->CurrentPosition >> 4) != KBTS__SYLLABIC_POSITION_PREBASE_MATRA) { Attach->LastPositionThatWasNotPreBaseMatra = Attach->CurrentPosition; } break; case KBTS_INDIC_SYLLABIC_CLASS_HALANT: - if((Attach->CurrentPosition >> 4) == KBTS_SYLLABIC_POSITION_PREBASE_MATRA) + if((Attach->CurrentPosition >> 4) == KBTS__SYLLABIC_POSITION_PREBASE_MATRA) { // Uniscribe does not reorder halants with pre-base matras. Not sure why. Glyph->SyllabicPosition = Attach->LastPositionThatWasNotPreBaseMatra; @@ -20298,48 +23488,55 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, Glyph->SyllabicPosition = Attach->CurrentPosition; break; } + Attach->LastClass = Class; + Attach->At = Glyph->Next; + Done = 0; } } + + if(Done) + { + break; + } } } { // Do the sort! // NOTE: It is important that we sort _now_, because some characters will be reordered across the base from // where they started, which can change which features will apply to them. - KBTS_FOR(Iteration, 0, ScanGlyphIndex) + KBTS__DLLIST_SORT(OneBeforeSyllableGlyph->Next, OnePastLastSyllableGlyph, SyllabicPosition); + +#ifdef KBTS_SANITY_CHECK { - KBTS_FOR(GlyphIndex, 1, ScanGlyphIndex) + kbts_glyph *Glyph0 = OneBeforeSyllableGlyph->Next; + if(Glyph0 != OnePastLastSyllableGlyph) { - kbts_glyph *Left = &Glyphs[GlyphIndex - 1]; - kbts_glyph *Right = &Glyphs[GlyphIndex]; - - if(Left->SyllabicPosition > Right->SyllabicPosition) + for(kbts_glyph *Glyph1 = Glyph0->Next; + kbts__GlyphIsValid(C, Glyph1); + Glyph1 = Glyph1->Next) { - kbts_glyph Swap = *Left; - *Left = *Right; - *Right = Swap; - - // Make sure we don't lose track of the base... - if(GlyphIndex == BaseIndex) + if(Glyph1 != OnePastLastSyllableGlyph) { - BaseIndex = GlyphIndex - 1; + KBTS_ASSERT(Glyph0->SyllabicPosition <= Glyph1->SyllabicPosition); } - else if((GlyphIndex - 1) == BaseIndex) + else { - BaseIndex = GlyphIndex; + break; } } } } + #endif } - { // @Temporary @Cleanup - // Revert our syllabic position shift for now. - KBTS_FOR(GlyphIndex, 0, ScanGlyphIndex) - { - Glyphs[GlyphIndex].SyllabicPosition >>= 4; - } + // @Temporary @Cleanup + // Revert our syllabic position shift for now. + for(Glyph = OneBeforeSyllableGlyph->Next; + Glyph != OnePastLastSyllableGlyph; + Glyph = Glyph->Next) + { + Glyph->SyllabicPosition >>= 4; } // This is what Harfbuzz does: @@ -20359,9 +23556,10 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, } kbts_indic_syllabic_class LastClass = 0; - for(kbts_un GlyphIndex = BaseIndex; GlyphIndex > 0; --GlyphIndex) + for(Glyph = BaseGlyph->Prev; + Glyph != OneBeforeSyllableGlyph; + Glyph = Glyph->Prev) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex - 1]; kbts_glyph_flags Flags = BaseFlags; if(LastClass != KBTS_INDIC_SYLLABIC_CLASS_ZWNJ) @@ -20375,17 +23573,17 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, } // All post-base glyphs get BLWF, ABVF, PSTF. Some get PREF. - kbts_glyph Scratch[2]; Scratch[0] = Scratch[1] = KBTS_ZERO_TYPE(kbts_glyph); + kbts_glyph Scratch[2]; Scratch[0] = Scratch[1] = KBTS__ZERO_TYPE(kbts_glyph); kbts_glyph *LastGlyph; LastGlyph = 0; - KBTS_FOR(GlyphIndex, BaseIndex + 1, ScanGlyphIndex) + for(Glyph = BaseGlyph->Next; + Glyph != OnePastLastSyllableGlyph; + Glyph = Glyph->Next) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - // It is tempting to apply PREF to every glyph after the base. // However, the PREF flag is also used to find the syllable base again in EndCluster, // so we have to be precise with it. Scratch[1] = *Glyph; - if(kbts_WouldSubstitute(ShapeState, LookupList, Frames, Pref, 0, Scratch, 2)) + if(kbts__WouldSubstitute(Scratchpad, Config, Storage, LookupList, Frames, Pref, 0, Scratch, 2)) { LastGlyph->Flags |= KBTS_GLYPH_FLAG_PREF; Glyph->Flags |= KBTS_GLYPH_FLAG_PREF; @@ -20398,238 +23596,270 @@ static kbts_begin_cluster_result kbts_BeginCluster(kbts_shape_state *ShapeState, // The base only inherits stuff after it, up to whatever and not including what was grabbed by // post-base consonants. - if(BaseIndex < ScanGlyphIndex) + if(BaseGlyph != OnePastLastSyllableGlyph) { - Glyphs[BaseIndex].SyllabicPosition = KBTS_SYLLABIC_POSITION_SYLLABLE_BASE; + BaseGlyph->SyllabicPosition = KBTS__SYLLABIC_POSITION_SYLLABLE_BASE; - kbts_u64 Classes = (1ull << KBTS_INDIC_SYLLABIC_CLASS_HALANT) | (1ull << KBTS_INDIC_SYLLABIC_CLASS_VEDIC_SIGN) | (1ull << KBTS_INDIC_SYLLABIC_CLASS_NUKTA) | - (1ull << KBTS_INDIC_SYLLABIC_CLASS_ZWJ) | (1ull << KBTS_INDIC_SYLLABIC_CLASS_ZWNJ); - kbts_glyph *Next = &Glyphs[BaseIndex + 1]; - while((Next < OnePastLastSyllableGlyph) && (Next->SyllabicPosition < KBTS_SYLLABIC_POSITION_SYLLABLE_BASE) && ((1ull << Next->SyllabicClass) & Classes)) + kbts_u64 Classes = (1ull << KBTS_INDIC_SYLLABIC_CLASS_HALANT) | + (1ull << KBTS_INDIC_SYLLABIC_CLASS_VEDIC_SIGN) | + (1ull << KBTS_INDIC_SYLLABIC_CLASS_NUKTA) | + (1ull << KBTS_INDIC_SYLLABIC_CLASS_ZWJ) | + (1ull << KBTS_INDIC_SYLLABIC_CLASS_ZWNJ); + + kbts_glyph *Next = BaseGlyph->Next; + while((Next != OnePastLastSyllableGlyph) && + (Next->SyllabicPosition < KBTS__SYLLABIC_POSITION_SYLLABLE_BASE) && + ((1ull << Next->SyllabicClass) & Classes)) { - Next->SyllabicPosition = KBTS_SYLLABIC_POSITION_SYLLABLE_BASE; + Next->SyllabicPosition = KBTS__SYLLABIC_POSITION_SYLLABLE_BASE; - Next += 1; + Next = Next->Next; } } - Result.ClusterGlyphCount = ScanGlyphIndex; - ShapeState->RealCluster = 1; + Result = OnePastLastSyllableGlyph; + Scratchpad->RealCluster = 1; } - } - break; + } break; case KBTS_SHAPER_USE: { - kbts_un OtherCount = 0; - while((OtherCount < GlyphCount) && ((Glyphs[OtherCount].UseClass == KBTS_USE_SYLLABIC_CLASS_OTHER) || - (Glyphs[OtherCount].UseClass == KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_MOD_POST))) + int NonCluster = 0; + while(kbts__GlyphIsValid(Storage, Glyph) && + ((Glyph->UseClass == KBTS_USE_SYLLABIC_CLASS_OTHER) || + (Glyph->UseClass == KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_MOD_POST))) { - OtherCount += 1; + NonCluster = 1; + + Glyph = Glyph->Next; } - if(OtherCount) - { - Result.ClusterGlyphCount = OtherCount; - } - else + if(!NonCluster) { // Parse a real cluster. kbts_u8 State = 0; - kbts_un ScanGlyphIndex = 0; - while((ScanGlyphIndex < GlyphCount) && (State < KBTS_USE_STATE_s0)) + kbts_glyph *StartGlyph = Glyph; + while(kbts__GlyphIsValid(Storage, Glyph) && + (State < KBTS_USE_STATE_s0)) { - kbts_glyph *Glyph = &Glyphs[ScanGlyphIndex++]; State = kbts_UseTransition[Glyph->UseClass][State]; // @Incomplete: Remove this!!! State -= 1; + Glyph = Glyph->Next; } if(State >= KBTS_USE_STATE_s0) { - ScanGlyphIndex -= 1; + Glyph = Glyph->Prev; } - if((ScanGlyphIndex < GlyphCount) && (Glyphs[ScanGlyphIndex].UseClass == KBTS_USE_SYLLABIC_CLASS_ZWNJ)) + if(kbts__GlyphIsValid(Storage, Glyph) && + (Glyph->UseClass == KBTS_USE_SYLLABIC_CLASS_ZWNJ)) { - ScanGlyphIndex += 1; + Glyph = Glyph->Next; + } + if(Glyph == StartGlyph) + { + Glyph = Glyph->Next; } - if(!ScanGlyphIndex) ScanGlyphIndex = 1; - Result.ClusterGlyphCount = ScanGlyphIndex; - ShapeState->RealCluster = 1; + Scratchpad->RealCluster = 1; } + + Result = Glyph; } break; case KBTS_SHAPER_KHMER: { - kbts_un OtherCount = 0; - while((OtherCount < GlyphCount) && ((Glyphs[OtherCount].SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_OTHER) || - (Glyphs[OtherCount].SyllabicClass >= KBTS_KHMER_SYLLABIC_CLASS_COUNT))) + int NonCluster = 0; + while(kbts__GlyphIsValid(Storage, Glyph) && + ((Glyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_OTHER) || + (Glyph->SyllabicClass >= KBTS_KHMER_SYLLABIC_CLASS_COUNT))) { - OtherCount += 1; + Glyph = Glyph->Next; + NonCluster = 1; } - if(OtherCount) - { - Result.ClusterGlyphCount = OtherCount; - } - else + Result = Glyph; + + if(!NonCluster) { kbts_u8 State = 0; - kbts_un ScanGlyphIndex = 0; - while((ScanGlyphIndex < GlyphCount) && (State < KBTS_KHMER_SYLLABIC_STATE_COUNT)) + kbts_glyph *FirstGlyph = Glyph; + kbts_glyph *OneBeforeSyllableGlyph = Glyph->Prev; + + while(kbts__GlyphIsValid(Storage, Glyph) && + (State < KBTS_KHMER_SYLLABIC_STATE_COUNT)) { - kbts_glyph *Glyph = &Glyphs[ScanGlyphIndex++]; kbts_indic_syllabic_class Class = Glyph->SyllabicClass; State = kbts_KhmerSyllabicTransition[Class][State]; // @Incomplete: Remove this! State -= 1; + Glyph = Glyph->Next; } if(State >= KBTS_KHMER_SYLLABIC_STATE_COUNT) { - ScanGlyphIndex -= 1; + Glyph = Glyph->Prev; } - if(!ScanGlyphIndex) ScanGlyphIndex = 1; + if(Glyph == FirstGlyph) + { + Glyph = Glyph->Next; + } + + kbts_glyph *OnePastLastSyllableGlyph = Glyph; if(Config->DottedCircle.Id && - !KBTS_IN_SET64(Glyphs->SyllabicClass, KBTS_SET64((KBTS_INDIC_SYLLABIC_CLASS_CONSONANT)(KBTS_INDIC_SYLLABIC_CLASS_RA) - (KBTS_INDIC_SYLLABIC_CLASS_VOWEL)(KBTS_INDIC_SYLLABIC_CLASS_DOTTED_CIRCLE) - (KBTS_INDIC_SYLLABIC_CLASS_PLACEHOLDER)))) + !KBTS__IN_SET64(FirstGlyph->SyllabicClass, KBTS__SET64((KBTS_INDIC_SYLLABIC_CLASS_CONSONANT) + (KBTS_INDIC_SYLLABIC_CLASS_RA) + (KBTS_INDIC_SYLLABIC_CLASS_VOWEL) + (KBTS_INDIC_SYLLABIC_CLASS_DOTTED_CIRCLE) + (KBTS_INDIC_SYLLABIC_CLASS_PLACEHOLDER)))) { // Broken cluster. // Insert a dotted circle. - for(kbts_un GlyphIndex = GlyphCount; GlyphIndex; --GlyphIndex) + kbts_glyph *NewFirstGlyph = kbts__InsertGlyphBefore(Storage, FirstGlyph, &Config->DottedCircle); + if(!NewFirstGlyph) { - Glyphs[GlyphIndex] = Glyphs[GlyphIndex - 1]; + goto OutOfMemory; } - ScanGlyphIndex += 1; - Result.InsertedGlyphCount = 1; - Glyphs[0] = Config->DottedCircle; + + NewFirstGlyph->UserIdOrCodepointIndex = FirstGlyph->UserIdOrCodepointIndex; + FirstGlyph = NewFirstGlyph; } // In Khmer, the first glyph is always the base. - kbts_glyph PreBaseGlyphs[3]; + kbts_glyph *PreBaseGlyphs[3]; int SawHalantRa = 0; kbts_un PreBaseGlyphCount = 0; kbts_un Classes = 0; - kbts_un WriteCursor = ScanGlyphIndex - 1; - for(kbts_un GlyphIndex = ScanGlyphIndex; GlyphIndex; --GlyphIndex) + + kbts_u32 AddFlags = KBTS_GLYPH_FLAG_ABVF | KBTS_GLYPH_FLAG_BLWF | KBTS_GLYPH_FLAG_PSTF; + + kbts_glyph *LastGlyph = OnePastLastSyllableGlyph; + for(Glyph = OnePastLastSyllableGlyph->Prev; + Glyph != OneBeforeSyllableGlyph; + Glyph = Glyph->Prev) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex - 1]; kbts_indic_syllabic_class Class = Glyph->SyllabicClass; - if(GlyphIndex > 1) {Glyph->Flags |= KBTS_GLYPH_FLAG_ABVF | KBTS_GLYPH_FLAG_BLWF | KBTS_GLYPH_FLAG_PSTF;} + if(Glyph == FirstGlyph) + { + AddFlags = 0; + } + + Glyph->Flags |= AddFlags; Classes = ((Classes << 8) | Class) & 0xFFFF; if(Class == KBTS_INDIC_SYLLABIC_CLASS_VOWEL_PRE) { - PreBaseGlyphs[PreBaseGlyphCount++] = *Glyph; + PreBaseGlyphs[PreBaseGlyphCount++] = Glyph; } else if(!SawHalantRa && (Classes == (KBTS_INDIC_SYLLABIC_CLASS_HALANT | (KBTS_INDIC_SYLLABIC_CLASS_RA << 8)))) { - kbts_glyph *Ra = &Glyphs[GlyphIndex]; Glyph->Flags |= KBTS_GLYPH_FLAG_PREF; - Ra->Flags |= KBTS_GLYPH_FLAG_PREF; + LastGlyph->Flags |= KBTS_GLYPH_FLAG_PREF; + + PreBaseGlyphs[PreBaseGlyphCount++] = Glyph; + PreBaseGlyphs[PreBaseGlyphCount++] = LastGlyph; - PreBaseGlyphs[PreBaseGlyphCount++] = *Glyph; - PreBaseGlyphs[PreBaseGlyphCount++] = *Ra; - WriteCursor += 1; // Cancel the Ra write. // All of the glyphs written so far need to be flagged with cfar. - KBTS_FOR(CfarGlyphIndex, WriteCursor, ScanGlyphIndex) + // @Speed: Detect the Halant-Ra sequence in the FSM loop. + for(kbts_glyph *PostRaGlyph = LastGlyph->Next; + PostRaGlyph != OnePastLastSyllableGlyph; + PostRaGlyph = PostRaGlyph->Next) { - Glyphs[CfarGlyphIndex].Flags |= KBTS_GLYPH_FLAG_CFAR; + PostRaGlyph->Flags |= KBTS_GLYPH_FLAG_CFAR; } + SawHalantRa = 1; } - else - { - Glyphs[WriteCursor--] = *Glyph; - } + + LastGlyph = Glyph; } - KBTS_FOR(PreBaseGlyphIndex, 0, PreBaseGlyphCount) + while(PreBaseGlyphCount) { - Glyphs[PreBaseGlyphIndex] = PreBaseGlyphs[PreBaseGlyphIndex]; + kbts_glyph *PreBaseGlyph = PreBaseGlyphs[--PreBaseGlyphCount]; + KBTS__DLLIST_REMOVE(PreBaseGlyph); + PreBaseGlyph->Prev = OneBeforeSyllableGlyph; + PreBaseGlyph->Next = OneBeforeSyllableGlyph->Next; + PreBaseGlyph->Prev->Next = PreBaseGlyph->Next->Prev = PreBaseGlyph; } - Result.ClusterGlyphCount = ScanGlyphIndex; + Result = OnePastLastSyllableGlyph; } } break; case KBTS_SHAPER_MYANMAR: { - kbts_un OtherCount = 0; - while((OtherCount < GlyphCount) && ((Glyphs[OtherCount].SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_OTHER) || - (Glyphs[OtherCount].SyllabicClass >= KBTS_MYANMAR_SYLLABIC_CLASS_COUNT))) + int NonCluster = 0; + while(kbts__GlyphIsValid(Storage, Glyph) && + ((Glyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_OTHER) || + (Glyph->SyllabicClass >= KBTS_MYANMAR_SYLLABIC_CLASS_COUNT))) { - OtherCount += 1; + NonCluster = 1; } - if(OtherCount) - { - Result.ClusterGlyphCount = OtherCount; - } - else + if(!NonCluster) { kbts_u8 State = 0; - kbts_un ScanGlyphIndex = 0; - while((ScanGlyphIndex < GlyphCount) && (State < KBTS_MYANMAR_SYLLABIC_STATE_COUNT)) + kbts_glyph *FirstGlyph = Glyph; + while(kbts__GlyphIsValid(Storage, Glyph) && + (State < KBTS_MYANMAR_SYLLABIC_STATE_COUNT)) { - kbts_glyph *Glyph = &Glyphs[ScanGlyphIndex++]; kbts_indic_syllabic_class Class = Glyph->SyllabicClass; State = kbts_MyanmarSyllabicTransition[Class][State]; // @Incomplete: Remove this! State -= 1; + + Glyph = Glyph->Next; } if(State >= KBTS_MYANMAR_SYLLABIC_STATE_COUNT) { - ScanGlyphIndex -= 1; + Glyph = Glyph->Prev; + } + if(Glyph == FirstGlyph) + { + Glyph = Glyph->Next; } - if(!ScanGlyphIndex) ScanGlyphIndex = 1; - ShapeState->RealCluster = 1; - Result.ClusterGlyphCount = ScanGlyphIndex; + Scratchpad->RealCluster = 1; } + + Result = Glyph; } break; } + if(0) + { + OutOfMemory:; + Scratchpad->Error = KBTS_SHAPE_ERROR_OUT_OF_MEMORY; + } + + kbts__EndLifetime(&Lifetime); return Result; } -typedef struct kbts_end_cluster_result +static void kbts__EndCluster(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_glyph_storage *Storage) { - int InsertDottedCircle; - kbts_un DottedCircleIndex; -} kbts_end_cluster_result; - -static kbts_end_cluster_result kbts_EndCluster(kbts_shape_state *ShapeState, kbts_glyph_array *Cluster) -{ - kbts_end_cluster_result Result = KBTS_ZERO; - kbts_shape_config *Config = ShapeState->Config; - kbts_glyph *Glyphs = Cluster->Glyphs; - kbts_un GlyphCount = Cluster->Count; - switch(Config->Shaper) { case KBTS_SHAPER_INDIC: - if(GlyphCount > 1) + if(kbts__GlyphIsValid(Storage, Storage->GlyphSentinel.Next)) { // Final syllable reordering. // We are just copying Harfbuzz here, because I've read all the documentation I can and, frankly, I have no idea. - kbts_feature *Pref = Config->Pref; + kbts__feature *Pref = Config->Pref; kbts_u32 ViramaId = Config->Virama.Id; - KBTS_FOR(GlyphIndex, 0, GlyphCount) + KBTS__FOR_GLYPH(Storage, Glyph) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - // Harfbuzz tests for (ligated | multiplied) here. // I don't really get why, because, supposedly, all viramas should be // classified as halants regardless. @@ -20646,44 +23876,48 @@ static kbts_end_cluster_result kbts_EndCluster(kbts_shape_state *ShapeState, kbt } // Locate the syllable base. - kbts_un BaseIndex = GlyphCount; + kbts_glyph *BaseGlyph = (kbts_glyph *)&Storage->GlyphSentinel; { - kbts_un AfterPreBaseIndex = 0; - while((AfterPreBaseIndex < GlyphCount) && (Glyphs[AfterPreBaseIndex].SyllabicPosition < KBTS_SYLLABIC_POSITION_SYLLABLE_BASE)) + kbts_glyph *AfterPreBase = Storage->GlyphSentinel.Next; + while(kbts__GlyphIsValid(Storage, AfterPreBase) && + (AfterPreBase->SyllabicPosition < KBTS__SYLLABIC_POSITION_SYLLABLE_BASE)) { - ++AfterPreBaseIndex; + AfterPreBase = AfterPreBase->Next; } - if(AfterPreBaseIndex < GlyphCount) + if(kbts__GlyphIsValid(Storage, AfterPreBase)) { - BaseIndex = AfterPreBaseIndex; + BaseGlyph = AfterPreBase; - if(Pref && ((AfterPreBaseIndex + 1) < GlyphCount)) + if(Pref && kbts__GlyphIsValid(Storage, AfterPreBase->Next)) { // If we find a pre-base-reordering ra, then the base is probably right after it! - kbts_un At = AfterPreBaseIndex + 1; - while((At < GlyphCount) && !(Glyphs[At].Flags & KBTS_GLYPH_FLAG_PREF)) + kbts_glyph *AtGlyph = AfterPreBase->Next; + while(kbts__GlyphIsValid(Storage, AtGlyph) && + !(AtGlyph->Flags & KBTS_GLYPH_FLAG_PREF)) { - ++At; + AtGlyph = AtGlyph->Next; } // If we are not a consonant, then we are attached to a consonant. // If we are a pref-able consonant, but we did not form a pref, then we should be right after the base. // Either way, we are very close to the base. - kbts_glyph *Prefable = &Glyphs[At]; - if((At < GlyphCount) && - (!(Prefable->Flags & KBTS_GLYPH_FLAG_GENERATED_BY_GSUB) || !(Prefable->Flags & KBTS_GLYPH_FLAG_LIGATURE) || (Prefable->Flags & KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION))) + kbts_glyph *Prefable = AtGlyph; // Read like "pref-able". :) + if(kbts__GlyphIsValid(Storage, Prefable) && + (!(Prefable->Flags & KBTS_GLYPH_FLAG_GENERATED_BY_GSUB) || + !(Prefable->Flags & KBTS_GLYPH_FLAG_LIGATURE) || + (Prefable->Flags & KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION))) { - while((At < GlyphCount) && (Prefable->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT)) + while(kbts__GlyphIsValid(Storage, Prefable) && + (Prefable->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT)) { - ++At; - ++Prefable; + Prefable = Prefable->Next; } - if(At < GlyphCount) + if(kbts__GlyphIsValid(Storage, Prefable)) { - Prefable->SyllabicPosition = KBTS_SYLLABIC_POSITION_SYLLABLE_BASE; - BaseIndex = At; + Prefable->SyllabicPosition = KBTS__SYLLABIC_POSITION_SYLLABLE_BASE; + BaseGlyph = Prefable; // Fall through to the Malayalam test. } } @@ -20694,35 +23928,40 @@ static kbts_end_cluster_result kbts_EndCluster(kbts_shape_state *ShapeState, kbt // In Malayalam, the base is after below-base forms. // (We actually just give all below-base forms the base pos.) // @Speed: This would be way simpler with a null sentinel at the end of Glyphs! - kbts_un At = BaseIndex + 1; - while(At < GlyphCount) + kbts_glyph *AtGlyph = BaseGlyph->Next; + while(kbts__GlyphIsValid(Storage, AtGlyph)) { - while((At < GlyphCount) && KBTS_IN_SET(Glyphs[At].SyllabicClass, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_ZWJ)(KBTS_INDIC_SYLLABIC_CLASS_ZWNJ)))) + while(kbts__GlyphIsValid(Storage, AtGlyph) && + KBTS__IN_SET(AtGlyph->SyllabicClass, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_ZWJ) + (KBTS_INDIC_SYLLABIC_CLASS_ZWNJ)))) { - ++At; + AtGlyph = AtGlyph->Next; } - if((At < GlyphCount) && (Glyphs[At].SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT)) + if(kbts__GlyphIsValid(Storage, AtGlyph) && + (AtGlyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT)) { - ++At; + AtGlyph = AtGlyph->Next; } else { break; } - while((At < GlyphCount) && KBTS_IN_SET(Glyphs[At].SyllabicClass, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_ZWJ)(KBTS_INDIC_SYLLABIC_CLASS_ZWNJ)))) + while(kbts__GlyphIsValid(Storage, AtGlyph) && + KBTS__IN_SET(AtGlyph->SyllabicClass, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_ZWJ) + (KBTS_INDIC_SYLLABIC_CLASS_ZWNJ)))) { - ++At; + AtGlyph = AtGlyph->Next; } - if(At < GlyphCount) + if(kbts__GlyphIsValid(Storage, AtGlyph)) { - kbts_glyph *Glyph = &Glyphs[At]; - if(kbts_SyllabicClassIsConsonant(Glyph->SyllabicClass) && (Glyph->SyllabicPosition == KBTS_SYLLABIC_POSITION_BELOWBASE_CONSONANT)) + if(kbts__SyllabicClassIsConsonant(AtGlyph->SyllabicClass) && + (AtGlyph->SyllabicPosition == KBTS__SYLLABIC_POSITION_BELOWBASE_CONSONANT)) { - Glyph->SyllabicPosition = KBTS_SYLLABIC_POSITION_SYLLABLE_BASE; - BaseIndex = At; + AtGlyph->SyllabicPosition = KBTS__SYLLABIC_POSITION_SYLLABLE_BASE; + BaseGlyph = AtGlyph; // Do not break; keep matching below-base forms. } } @@ -20730,55 +23969,70 @@ static kbts_end_cluster_result kbts_EndCluster(kbts_shape_state *ShapeState, kbt } } - if(BaseIndex && (BaseIndex < GlyphCount) && (Glyphs[BaseIndex].SyllabicPosition > KBTS_SYLLABIC_POSITION_SYLLABLE_BASE)) + if(kbts__GlyphIsValid(Storage, BaseGlyph) && + kbts__GlyphIsValid(Storage, BaseGlyph->Prev) && + (BaseGlyph->SyllabicPosition > KBTS__SYLLABIC_POSITION_SYLLABLE_BASE)) { - BaseIndex -= 1; + BaseGlyph = BaseGlyph->Prev; } - if((BaseIndex == GlyphCount) && (Glyphs[GlyphCount - 1].SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ)) + if(!kbts__GlyphIsValid(Storage, BaseGlyph) && + (BaseGlyph->Prev->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ)) { - BaseIndex = GlyphCount - 1; + BaseGlyph = BaseGlyph->Prev; } - if(BaseIndex < GlyphCount) + if(kbts__GlyphIsValid(Storage, BaseGlyph)) { - while(BaseIndex && KBTS_IN_SET(Glyphs[BaseIndex].SyllabicClass, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_NUKTA)(KBTS_INDIC_SYLLABIC_CLASS_HALANT)))) + while(kbts__GlyphIsValid(Storage, BaseGlyph->Prev) && + KBTS__IN_SET(BaseGlyph->SyllabicClass, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_NUKTA) + (KBTS_INDIC_SYLLABIC_CLASS_HALANT)))) { - BaseIndex -= 1; + BaseGlyph = BaseGlyph->Prev; } } } // Reorder matras. - if(BaseIndex && (GlyphCount > 1)) + if(kbts__GlyphIsValid(Storage, BaseGlyph->Prev) && + (Storage->GlyphSentinel.Prev != Storage->GlyphSentinel.Next) /* GlyphCount > 1 */) { - kbts_un ToIndex = BaseIndex - 1; - if(BaseIndex == GlyphCount) + kbts_glyph *FirstGlyph = Storage->GlyphSentinel.Next; + kbts_glyph *To = BaseGlyph->Prev; + if(!kbts__GlyphIsValid(Storage, BaseGlyph)) { - ToIndex = GlyphCount - 2; + To = To->Prev; } if((Config->Script != KBTS_SCRIPT_MALAYALAM) && (Config->Script != KBTS_SCRIPT_TAMIL)) { + kbts_glyph *LastGlyph = To->Next; + for(;;) { - while(ToIndex && !KBTS_IN_SET(Glyphs[ToIndex].SyllabicClass, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_MATRA)(KBTS_INDIC_SYLLABIC_CLASS_MATRA_POST)(KBTS_INDIC_SYLLABIC_CLASS_HALANT)))) + while((To != FirstGlyph) && + !KBTS__IN_SET(To->SyllabicClass, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_MATRA) + (KBTS_INDIC_SYLLABIC_CLASS_MATRA_POST) + (KBTS_INDIC_SYLLABIC_CLASS_HALANT)))) { - --ToIndex; + LastGlyph = To; + To = To->Prev; } - kbts_glyph *Glyph = &Glyphs[ToIndex]; - if((Glyph->SyllabicClass != KBTS_INDIC_SYLLABIC_CLASS_HALANT) || (Glyph->SyllabicPosition == KBTS_SYLLABIC_POSITION_PREBASE_MATRA)) + if((To->SyllabicClass != KBTS_INDIC_SYLLABIC_CLASS_HALANT) || + (To->SyllabicPosition == KBTS__SYLLABIC_POSITION_PREBASE_MATRA)) { // We have nothing to move. - ToIndex = 0; + To = FirstGlyph; break; } - else if(ToIndex && ((ToIndex + 1) < GlyphCount) && (Glyphs[ToIndex + 1].SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ)) + else if((To != FirstGlyph) && + kbts__GlyphIsValid(Storage, LastGlyph) && + (LastGlyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ)) { // Zwj+Halant cancels matra movement when the Halant is not attached to the matra. - --ToIndex; + To = To->Prev; } else { @@ -20787,84 +24041,95 @@ static kbts_end_cluster_result kbts_EndCluster(kbts_shape_state *ShapeState, kbt } } - if(ToIndex && (Glyphs[ToIndex].SyllabicPosition != KBTS_SYLLABIC_POSITION_PREBASE_MATRA)) + if((To != FirstGlyph) && + (To->SyllabicPosition != KBTS__SYLLABIC_POSITION_PREBASE_MATRA)) { - for(kbts_un MatraIndex = ToIndex; MatraIndex; --MatraIndex) + for(kbts_glyph *Matra = To->Prev; + kbts__GlyphIsValid(Storage, Matra); + ) { - kbts_glyph *Matra = &Glyphs[MatraIndex - 1]; + kbts_glyph *MatraPrev = Matra->Prev; - if(Matra->SyllabicPosition == KBTS_SYLLABIC_POSITION_PREBASE_MATRA) + if(Matra->SyllabicPosition == KBTS__SYLLABIC_POSITION_PREBASE_MATRA) { - kbts_glyph MatraToReorder = *Matra; + KBTS__DLLIST_REMOVE(Matra); + KBTS__DLLIST_INSERT_AFTER(Matra, To); - KBTS_FOR(GlyphIndex, MatraIndex, ToIndex + 1) - { - Glyphs[GlyphIndex - 1] = Glyphs[GlyphIndex]; - } - - Glyphs[ToIndex] = MatraToReorder; - ToIndex -= 1; + To = Matra->Prev; } + + Matra = MatraPrev; } } } // Reorder reph. // We should only reorder reph when it is a single Repha glyph, and not a Ra sequence. - if((Glyphs[0].SyllabicPosition == KBTS_SYLLABIC_POSITION_RA_TO_BECOME_REPH) && (Glyphs[1].SyllabicPosition != KBTS_SYLLABIC_POSITION_RA_TO_BECOME_REPH)) + kbts_glyph *First = Storage->GlyphSentinel.Next; + kbts_glyph *Second = First->Next; + if((First->SyllabicPosition == KBTS__SYLLABIC_POSITION_RA_TO_BECOME_REPH) && + (Second->SyllabicPosition != KBTS__SYLLABIC_POSITION_RA_TO_BECOME_REPH)) { - kbts_reph_position RephPosition = Config->IndicScriptProperties.RephPosition; + kbts__reph_position RephPosition = Config->IndicScriptProperties.RephPosition; + kbts_glyph *To = 0; - kbts_un ToIndex = 0; - - KBTS_FOR(GlyphIndex, 0, BaseIndex) + for(kbts_glyph *Glyph = First; + Glyph != BaseGlyph; + ) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; + kbts_glyph *Next = Glyph->Next; if(Glyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) { - ToIndex = GlyphIndex; + To = Glyph; - if((GlyphIndex + 1) < BaseIndex) + if(Next != BaseGlyph) { - kbts_u8 NextClass = Glyphs[GlyphIndex + 1].SyllabicClass; + kbts_u8 NextClass = Next->SyllabicClass; - if((NextClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ) || (NextClass == KBTS_INDIC_SYLLABIC_CLASS_ZWNJ)) + if((NextClass == KBTS_INDIC_SYLLABIC_CLASS_ZWJ) || + (NextClass == KBTS_INDIC_SYLLABIC_CLASS_ZWNJ)) { - ToIndex = GlyphIndex + 1; + To = Next; } } break; } + + Glyph = Next; } - if(!ToIndex) + if(!To) { - if(RephPosition == KBTS_REPH_POSITION_AFTER_SUBJOINED) + // @Cleanup: We can merge these loops. + if(RephPosition == KBTS__REPH_POSITION_AFTER_SUBJOINED) { - KBTS_FOR(GlyphIndex, BaseIndex, GlyphCount) + for(kbts_glyph *Glyph = BaseGlyph; + kbts__GlyphIsValid(Storage, Glyph); + Glyph = Glyph->Next) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; kbts_u8 SyllabicPosition = Glyph->SyllabicPosition; - if(KBTS_IN_SET(SyllabicPosition, KBTS_SET32((KBTS_SYLLABIC_POSITION_POSTBASE_CONSONANT)(KBTS_SYLLABIC_POSITION_AFTER_POST)(KBTS_SYLLABIC_POSITION_SMVD)))) + if(KBTS__IN_SET(SyllabicPosition, KBTS__SET32((KBTS__SYLLABIC_POSITION_POSTBASE_CONSONANT) + (KBTS__SYLLABIC_POSITION_AFTER_POST) + (KBTS__SYLLABIC_POSITION_SMVD)))) { - ToIndex = GlyphIndex - 1; + To = Glyph->Prev; break; } } } - else if(RephPosition == KBTS_REPH_POSITION_AFTER_MAIN) + else if(RephPosition == KBTS__REPH_POSITION_AFTER_MAIN) { - KBTS_FOR(GlyphIndex, BaseIndex, GlyphCount) + for(kbts_glyph *Glyph = BaseGlyph; + kbts__GlyphIsValid(Storage, Glyph); + Glyph = Glyph->Next) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - - if(Glyph->SyllabicPosition > KBTS_SYLLABIC_POSITION_AFTER_MAIN) + if(Glyph->SyllabicPosition > KBTS__SYLLABIC_POSITION_AFTER_MAIN) { - ToIndex = GlyphIndex - 1; + To = Glyph->Prev; break; } @@ -20872,121 +24137,112 @@ static kbts_end_cluster_result kbts_EndCluster(kbts_shape_state *ShapeState, kbt } } - if(!ToIndex) + if(!To) { // As a fallback, move reph to the end of the syllable. - for(kbts_un GlyphIndex = GlyphCount; GlyphIndex; --GlyphIndex) + for(kbts_glyph *Glyph = Storage->GlyphSentinel.Prev; + kbts__GlyphIsValid(Storage, Glyph); + Glyph = Glyph->Prev) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex - 1]; - - if(Glyph->SyllabicPosition != KBTS_SYLLABIC_POSITION_SMVD) + if(Glyph->SyllabicPosition != KBTS__SYLLABIC_POSITION_SMVD) { - ToIndex = GlyphIndex - 1; + To = Glyph; break; } } // Matras will still come after reph. - kbts_glyph *Glyph = &Glyphs[ToIndex]; + kbts_glyph *Glyph = To; if(Glyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) { - KBTS_FOR(MatraIndex, BaseIndex + 1, ToIndex) + for(kbts_glyph *Matra = BaseGlyph->Next; + Matra != To; + Matra = Matra->Next) { - kbts_glyph *Matra = &Glyphs[MatraIndex]; kbts_u8 Class = Matra->SyllabicClass; - if(KBTS_IN_SET(Class, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_MATRA)(KBTS_INDIC_SYLLABIC_CLASS_MATRA_POST)(KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_MEDIAL)))) + if(KBTS__IN_SET(Class, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_MATRA) + (KBTS_INDIC_SYLLABIC_CLASS_MATRA_POST) + (KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_MEDIAL)))) { - ToIndex -= 1; + To = To->Prev; } } } } - if(ToIndex) + if(To) { // Do the reorder! - kbts_glyph Reph = Glyphs[0]; - - KBTS_FOR(GlyphIndex, 0, ToIndex) - { - Glyphs[GlyphIndex] = Glyphs[GlyphIndex + 1]; - } - - Glyphs[ToIndex] = Reph; - - if(BaseIndex && (BaseIndex <= ToIndex)) - { - BaseIndex -= 1; - } + KBTS__DLLIST_REMOVE(First); + KBTS__DLLIST_INSERT_AFTER(First, To); } } // Reorder pre-base-reordering consonants. if(Pref) { - kbts_un PrefIndex = 0; + First = Storage->GlyphSentinel.Next; + kbts_glyph *PrefGlyph = 0; - KBTS_FOR(GlyphIndex, BaseIndex + 1, GlyphCount) + for(kbts_glyph *Glyph = BaseGlyph->Next; + kbts__GlyphIsValid(Storage, Glyph); + Glyph = Glyph->Next) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - if(Glyph->Flags & KBTS_GLYPH_FLAG_PREF) { - PrefIndex = GlyphIndex; + PrefGlyph = Glyph; break; } } - if(PrefIndex) + if(PrefGlyph) { - kbts_glyph PrefGlyph = Glyphs[PrefIndex]; - // Harfbuzz says the ideal is to check that this glyph was generated by the pref feature specifically, // but then just uses a generic flag like this. // The ideal solution would not be very difficult to implement! - if(PrefGlyph.Flags & KBTS_GLYPH_FLAG_GENERATED_BY_GSUB) + if(PrefGlyph->Flags & KBTS_GLYPH_FLAG_GENERATED_BY_GSUB) { - kbts_un ToIndex = 0; + kbts_glyph *To = First; - for(kbts_un GlyphIndex = BaseIndex; GlyphIndex; --GlyphIndex) + kbts_glyph *Last = BaseGlyph; + for(kbts_glyph *Glyph = BaseGlyph->Prev; + kbts__GlyphIsValid(Storage, Glyph); + Glyph = Glyph->Prev) { - kbts_u8 Class = Glyphs[GlyphIndex - 1].SyllabicClass; + kbts_u8 Class = Glyph->SyllabicClass; - if(KBTS_IN_SET(Class, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_MATRA)(KBTS_INDIC_SYLLABIC_CLASS_MATRA_POST)(KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_MEDIAL)(KBTS_INDIC_SYLLABIC_CLASS_HALANT)))) + if(KBTS__IN_SET(Class, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_MATRA) + (KBTS_INDIC_SYLLABIC_CLASS_MATRA_POST) + (KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_MEDIAL) + (KBTS_INDIC_SYLLABIC_CLASS_HALANT)))) { - ToIndex = GlyphIndex; + To = Last; break; } + + Last = Glyph; } - if(ToIndex && (ToIndex < GlyphCount)) + if(To != First) { - kbts_glyph *Prev = &Glyphs[ToIndex - 1]; - kbts_u8 CurrentClass = Glyphs[ToIndex].SyllabicClass; + kbts_glyph *Prev = To->Prev; + kbts_u8 CurrentClass = To->SyllabicClass; - if((Prev->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) && KBTS_IN_SET(CurrentClass, KBTS_SET32((KBTS_INDIC_SYLLABIC_CLASS_ZWJ)(KBTS_INDIC_SYLLABIC_CLASS_ZWNJ)))) + if((Prev->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT) && + KBTS__IN_SET(CurrentClass, KBTS__SET32((KBTS_INDIC_SYLLABIC_CLASS_ZWJ) + (KBTS_INDIC_SYLLABIC_CLASS_ZWNJ)))) { - ToIndex += 1; + To = To->Next; } } // Do the reorder! - for(kbts_un GlyphIndex = PrefIndex; GlyphIndex > ToIndex; --GlyphIndex) - { - Glyphs[GlyphIndex] = Glyphs[GlyphIndex - 1]; - } - - Glyphs[ToIndex] = PrefGlyph; - - // @Cleanup: This is probably always true? - if((BaseIndex >= ToIndex) && (BaseIndex < PrefIndex)) - { - BaseIndex += 1; - } + KBTS__DLLIST_REMOVE(PrefGlyph); + KBTS__DLLIST_INSERT_BEFORE(PrefGlyph, To); } } } @@ -20994,9 +24250,9 @@ static kbts_end_cluster_result kbts_EndCluster(kbts_shape_state *ShapeState, kbt { // Mark matras at the beginning of a word for init application. // It is tempting to check for this at the same time as the reph reordering, but glyphs could have been // reordered since then and the reordering procedure is clearly defined to happen in sequential steps. - kbts_glyph *First = &Glyphs[0]; + First = Storage->GlyphSentinel.Next; // I don't think this needs to be reloaded, but you never know. - if((First->SyllabicPosition == KBTS_SYLLABIC_POSITION_PREBASE_MATRA) && ShapeState->ClusterAtStartOfWord) + if((First->SyllabicPosition == KBTS__SYLLABIC_POSITION_PREBASE_MATRA) && Scratchpad->ClusterAtStartOfWord) { First->Flags |= KBTS_GLYPH_FLAG_INIT; } @@ -21006,38 +24262,42 @@ static kbts_end_cluster_result kbts_EndCluster(kbts_shape_state *ShapeState, kbt case KBTS_SHAPER_USE: { - kbts_u64 PostBaseSet = KBTS_SET64((KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_ABOVE)(KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_BELOW) - (KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_MOD_ABOVE)(KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_MOD_BELOW) - (KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_MOD_POST)(KBTS_USE_SYLLABIC_CLASS_CONS_MED_ABOVE) - (KBTS_USE_SYLLABIC_CLASS_CONS_MED_BELOW)(KBTS_USE_SYLLABIC_CLASS_CONS_MED_POST) - (KBTS_USE_SYLLABIC_CLASS_CONS_MED_PRE)(KBTS_USE_SYLLABIC_CLASS_VOWEL_ABOVE) - (KBTS_USE_SYLLABIC_CLASS_VOWEL_BELOW)(KBTS_USE_SYLLABIC_CLASS_VOWEL_POST) - (KBTS_USE_SYLLABIC_CLASS_VOWEL_PRE)(KBTS_USE_SYLLABIC_CLASS_VOWEL_MOD_ABOVE) - (KBTS_USE_SYLLABIC_CLASS_VOWEL_MOD_BELOW)(KBTS_USE_SYLLABIC_CLASS_VOWEL_MOD_POST) + kbts_u64 PostBaseSet = KBTS__SET64((KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_ABOVE) (KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_BELOW) + (KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_MOD_ABOVE) (KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_MOD_BELOW) + (KBTS_USE_SYLLABIC_CLASS_CONS_FINAL_MOD_POST) (KBTS_USE_SYLLABIC_CLASS_CONS_MED_ABOVE) + (KBTS_USE_SYLLABIC_CLASS_CONS_MED_BELOW) (KBTS_USE_SYLLABIC_CLASS_CONS_MED_POST) + (KBTS_USE_SYLLABIC_CLASS_CONS_MED_PRE) (KBTS_USE_SYLLABIC_CLASS_VOWEL_ABOVE) + (KBTS_USE_SYLLABIC_CLASS_VOWEL_BELOW) (KBTS_USE_SYLLABIC_CLASS_VOWEL_POST) + (KBTS_USE_SYLLABIC_CLASS_VOWEL_PRE) (KBTS_USE_SYLLABIC_CLASS_VOWEL_MOD_ABOVE) + (KBTS_USE_SYLLABIC_CLASS_VOWEL_MOD_BELOW) (KBTS_USE_SYLLABIC_CLASS_VOWEL_MOD_POST) (KBTS_USE_SYLLABIC_CLASS_VOWEL_MOD_PRE)); - kbts_u64 HalantSet = KBTS_SET64((KBTS_USE_SYLLABIC_CLASS_HALANT)(KBTS_USE_SYLLABIC_CLASS_HALANT_OR_VOWEL_MODIFIER)(KBTS_USE_SYLLABIC_CLASS_INVISIBLE_STACKER)); + kbts_u64 HalantSet = KBTS__SET64((KBTS_USE_SYLLABIC_CLASS_HALANT) + (KBTS_USE_SYLLABIC_CLASS_HALANT_OR_VOWEL_MODIFIER) + (KBTS_USE_SYLLABIC_CLASS_INVISIBLE_STACKER)); // In the reorderings below, we check for halants because that's what Harfbuzz does. // Nowhere does Microsoft mention that halants should block reorderings! - kbts_glyph Repha = Glyphs[0]; - if((Repha.UseClass == KBTS_USE_SYLLABIC_CLASS_REPHA) || (Repha.Flags & KBTS_GLYPH_FLAG_RPHF)) + kbts_glyph *Repha = Storage->GlyphSentinel.Next; + if((Repha->UseClass == KBTS_USE_SYLLABIC_CLASS_REPHA) || + (Repha->Flags & KBTS_GLYPH_FLAG_RPHF)) { - kbts_un GlyphIndex = 1; - for(; GlyphIndex < GlyphCount; ++GlyphIndex) + kbts_glyph *To = Repha->Next; + for(; + kbts__GlyphIsValid(Storage, To); + To = To->Next) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - // Microsoft says that rephas are reordered "after a following full base", which is needlessly vague. // Harfbuzz reorders them in front of the first post-base glyph. - if(KBTS_IN_SET64(Glyph->UseClass, PostBaseSet) || (!(Glyph->Flags & KBTS_GLYPH_FLAG_LIGATURE) && KBTS_IN_SET64(Glyph->UseClass, HalantSet))) + if(KBTS__IN_SET64(To->UseClass, PostBaseSet) || + (!(To->Flags & KBTS_GLYPH_FLAG_LIGATURE) && + KBTS__IN_SET64(To->UseClass, HalantSet))) { break; } - - Glyphs[GlyphIndex - 1] = *Glyph; } - Glyphs[GlyphIndex - 1] = Repha; + KBTS__DLLIST_REMOVE(Repha); + KBTS__DLLIST_INSERT_BEFORE(Repha, To); } { @@ -21045,1770 +24305,2339 @@ static kbts_end_cluster_result kbts_EndCluster(kbts_shape_state *ShapeState, kbt // and, if present, before a pre-base glyph reordered via the 'pref' feature". // In practice, we tag 'pref'-generated glyphs with the VOWEL_PRE class so that they get reordered here. // Note that the final reordered glyphs end up backwards from their original order. - kbts_glyph PreBaseVowels[16]; // @Robustness: How many vowels can there realistically be in a single cluster? + kbts_glyph *PreBaseVowels[16]; // @Robustness: How many vowels can there realistically be in a single cluster? kbts_un PreBaseVowelCount = 0; kbts_u64 SawBase = 0; - for(kbts_un GlyphIndex = GlyphCount; GlyphIndex; --GlyphIndex) + for(kbts_glyph *Glyph = Storage->GlyphSentinel.Prev; + kbts__GlyphIsValid(Storage, Glyph); + Glyph = Glyph->Prev) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex - 1]; - SawBase |= KBTS_IN_SET64(Glyph->UseClass, KBTS_SET64((KBTS_USE_SYLLABIC_CLASS_BASE)(KBTS_USE_SYLLABIC_CLASS_BASE_OTHER)(KBTS_USE_SYLLABIC_CLASS_BASE_NUM))); + SawBase |= KBTS__IN_SET64(Glyph->UseClass, KBTS__SET64((KBTS_USE_SYLLABIC_CLASS_BASE) + (KBTS_USE_SYLLABIC_CLASS_BASE_OTHER) + (KBTS_USE_SYLLABIC_CLASS_BASE_NUM))); kbts_u32 Flags = Glyph->Flags; // Only accept the first glyphs produced by multiple substitutions. - if(((Flags & KBTS_GLYPH_FLAG_FIRST_IN_MULTIPLE_SUBSTITUTION) || !(Flags & KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION)) && - (KBTS_IN_SET64(Glyph->UseClass, KBTS_SET64((KBTS_USE_SYLLABIC_CLASS_VOWEL_PRE)(KBTS_USE_SYLLABIC_CLASS_VOWEL_MOD_PRE))) || - (Flags & KBTS_GLYPH_FLAG_PREF))) + if(((Flags & KBTS_GLYPH_FLAG_FIRST_IN_MULTIPLE_SUBSTITUTION) || + !(Flags & KBTS_GLYPH_FLAG_MULTIPLE_SUBSTITUTION)) && + (KBTS__IN_SET64(Glyph->UseClass, KBTS__SET64((KBTS_USE_SYLLABIC_CLASS_VOWEL_PRE) + (KBTS_USE_SYLLABIC_CLASS_VOWEL_MOD_PRE))) || + (Flags & KBTS_GLYPH_FLAG_PREF))) { - if(PreBaseVowelCount < KBTS_ARRAY_LENGTH(PreBaseVowels)) + if(PreBaseVowelCount < KBTS__ARRAY_LENGTH(PreBaseVowels)) { - PreBaseVowels[PreBaseVowelCount++] = *Glyph; + PreBaseVowels[PreBaseVowelCount++] = Glyph; } } - else if(!(Glyph->Flags & KBTS_GLYPH_FLAG_LIGATURE) && KBTS_IN_SET64(Glyph->UseClass, HalantSet)) + else if(!(Glyph->Flags & KBTS_GLYPH_FLAG_LIGATURE) && + KBTS__IN_SET64(Glyph->UseClass, HalantSet)) { // Reordering stops at halants, apparently. // We want to write the vowels in the reverse order they appear in the glyph sequence. // Since we are iterating backwards, they already _are_ backwards in the PreBaseVowels array, // so there's no need to do anything. - KBTS_FOR(PreBaseVowelIndex, 0, PreBaseVowelCount) + kbts_glyph *InsertAfter = Glyph; + KBTS__FOR(PreBaseVowelIndex, 0, PreBaseVowelCount) { - Glyphs[GlyphIndex + PreBaseVowelIndex] = PreBaseVowels[PreBaseVowelIndex]; + kbts_glyph *PreBaseVowel = PreBaseVowels[PreBaseVowelIndex]; + + KBTS__DLLIST_REMOVE(PreBaseVowel); + KBTS__DLLIST_INSERT_AFTER(PreBaseVowel, InsertAfter); + InsertAfter = PreBaseVowel; } PreBaseVowelCount = 0; // Valid bases only show up before halants. SawBase = 0; } - else + } + + kbts_glyph *DottedCircleInsertBefore = Storage->GlyphSentinel.Next; + + { // Flush the rest of the vowels. + kbts_glyph *InsertAfter = (kbts_glyph *)&Storage->GlyphSentinel; + KBTS__FOR(PreBaseVowelIndex, 0, PreBaseVowelCount) { - Glyphs[GlyphIndex - 1 + PreBaseVowelCount] = *Glyph; + kbts_glyph *PreBaseVowel = PreBaseVowels[PreBaseVowelIndex]; + + KBTS__DLLIST_REMOVE(PreBaseVowel); + KBTS__DLLIST_INSERT_AFTER(PreBaseVowel, InsertAfter); + + InsertAfter = PreBaseVowel; } } - // Flush the rest of the vowels. - KBTS_FOR(PreBaseVowelIndex, 0, PreBaseVowelCount) + if(Scratchpad->RealCluster && !SawBase && Config->DottedCircle.Id) { - Glyphs[PreBaseVowelIndex] = PreBaseVowels[PreBaseVowelIndex]; - } + kbts_glyph *DottedCircle = kbts__InsertGlyphBefore(Storage, DottedCircleInsertBefore, &Config->DottedCircle); + if(!DottedCircle) + { + goto OutOfMemory; + } - // We are supposed to insert a dotted circle after repha when a base is missing. - // The issue is that we have no idea whether the first glyph is a repha or not before we apply - // RPHF. - // So, this is really sucky, but I haven't found a way to merge this logic into any already- - // existing loop, so we have to eat the extra traversal for now. - if(ShapeState->RealCluster && !SawBase) - { - Result.InsertDottedCircle = 1; - Result.DottedCircleIndex = PreBaseVowelCount; + DottedCircle->UserIdOrCodepointIndex = DottedCircleInsertBefore->UserIdOrCodepointIndex; } } } break; case KBTS_SHAPER_MYANMAR: - if(ShapeState->RealCluster) + if(Scratchpad->RealCluster) { - kbts_un OnePastRephIndex = 0; - kbts_un BaseIndex = GlyphCount; - if(GlyphCount >= 3) + kbts_glyph *BaseGlyph = (kbts_glyph *)&Storage->GlyphSentinel; + kbts_glyph *First = BaseGlyph->Next; + kbts_glyph *Second = First->Next; + kbts_glyph *Third = Second->Next; + kbts_glyph *OnePastReph = First; + + kbts_un MinimumGlyphCount = 0; + + if(kbts__GlyphIsValid(Storage, First)) { - kbts_glyph *First = &Glyphs[0]; - kbts_glyph *Second = &Glyphs[1]; - kbts_glyph *Third = &Glyphs[2]; + MinimumGlyphCount += 1; - if((First->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_RA) && - (Second->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ASAT) && - (Third->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT)) + if(kbts__GlyphIsValid(Storage, Second)) { - First->SyllabicPosition = KBTS_SYLLABIC_POSITION_AFTER_MAIN; - Second->SyllabicPosition = KBTS_SYLLABIC_POSITION_AFTER_MAIN; - Third->SyllabicPosition = KBTS_SYLLABIC_POSITION_AFTER_MAIN; + MinimumGlyphCount += 1; - OnePastRephIndex = 3; - BaseIndex = 0; + if(kbts__GlyphIsValid(Storage, Third)) + { + MinimumGlyphCount += 1; + } } } - kbts_u64 BaseSet = KBTS_SET64((KBTS_INDIC_SYLLABIC_CLASS_CONSONANT) + if((MinimumGlyphCount == 3) && + (First->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_RA) && + (Second->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_ASAT) && + (Third->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_HALANT)) + { + First->SyllabicPosition = KBTS__SYLLABIC_POSITION_AFTER_MAIN; + Second->SyllabicPosition = KBTS__SYLLABIC_POSITION_AFTER_MAIN; + Third->SyllabicPosition = KBTS__SYLLABIC_POSITION_AFTER_MAIN; + + OnePastReph = Third->Next; + BaseGlyph = First; + } + + kbts_u64 BaseSet = KBTS__SET64((KBTS_INDIC_SYLLABIC_CLASS_CONSONANT) (KBTS_INDIC_SYLLABIC_CLASS_CONSONANT_WITH_STACKER) (KBTS_INDIC_SYLLABIC_CLASS_RA) (KBTS_INDIC_SYLLABIC_CLASS_VOWEL) (KBTS_INDIC_SYLLABIC_CLASS_PLACEHOLDER) (KBTS_INDIC_SYLLABIC_CLASS_DOTTED_CIRCLE)); - KBTS_FOR(GlyphIndex, OnePastRephIndex, GlyphCount) + + // Scan for a non-reph base glyph. + for(kbts_glyph *Glyph = OnePastReph; + kbts__GlyphIsValid(Storage, Glyph); + Glyph = Glyph->Next) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; kbts_indic_syllabic_class Class = Glyph->SyllabicClass; - if((BaseIndex == GlyphCount) && KBTS_IN_SET64(Class, BaseSet)) + if(!kbts__GlyphIsValid(Storage, BaseGlyph) && + KBTS__IN_SET64(Class, BaseSet)) { - BaseIndex = GlyphIndex; + BaseGlyph = Glyph; + break; } } - if((BaseIndex == GlyphCount) && OnePastRephIndex) + // Otherwise, reph can be the base. + // @Cleanup: I'm pretty sure this is @Duplication with the reph check above. + if(!kbts__GlyphIsValid(Storage, BaseGlyph) && + (OnePastReph != First)) { - BaseIndex = 0; + BaseGlyph = First; } - kbts_syllabic_position LastPosition = KBTS_SYLLABIC_POSITION_SYLLABLE_BASE; - kbts_syllabic_position SectionPosition = KBTS_SYLLABIC_POSITION_AFTER_MAIN; - kbts_un LastPreBaseMatraIndex = GlyphCount; - KBTS_FOR(GlyphIndex, BaseIndex + 1, GlyphCount) + if(kbts__GlyphIsValid(Storage, BaseGlyph)) { - kbts_glyph *Glyph = &Glyphs[GlyphIndex]; - kbts_syllabic_position Position = SectionPosition; - - switch(Glyph->SyllabicClass) + kbts__syllabic_position LastPosition = KBTS__SYLLABIC_POSITION_SYLLABLE_BASE; + kbts__syllabic_position SectionPosition = KBTS__SYLLABIC_POSITION_AFTER_MAIN; + kbts_glyph *LastPreBaseMatra = (kbts_glyph *)&Storage->GlyphSentinel; + for(kbts_glyph *Glyph = BaseGlyph->Next; + kbts__GlyphIsValid(Storage, Glyph); + ) { - case KBTS_INDIC_SYLLABIC_CLASS_MEDIAL_RA: - Position = KBTS_SYLLABIC_POSITION_PREBASE_CONSONANT; - break; + kbts_glyph *Next = Glyph->Next; // Make sure we preserve the link when reversing. + kbts__syllabic_position Position = SectionPosition; - case KBTS_INDIC_SYLLABIC_CLASS_VOWEL_PRE: - { - Position = KBTS_SYLLABIC_POSITION_PREBASE_MATRA; - - // According to Unicode 15.0: - // For combining characters placed to the left of a base character, the combining characters start from the base - // character and are arranged leftward. - // Since these guys will get reordered into being pre-base, we need to flip them. - if(GlyphIndex > LastPreBaseMatraIndex) + switch(Glyph->SyllabicClass) { - kbts_un FlipCount = GlyphIndex - LastPreBaseMatraIndex + 1; - KBTS_FOR(FlipIndex, 0, FlipCount / 2) + case KBTS_INDIC_SYLLABIC_CLASS_MEDIAL_RA: + Position = KBTS__SYLLABIC_POSITION_PREBASE_CONSONANT; + break; + + case KBTS_INDIC_SYLLABIC_CLASS_VOWEL_PRE: + { + Position = KBTS__SYLLABIC_POSITION_PREBASE_MATRA; + + // According to Unicode 15.0: + // For combining characters placed to the left of a base character, the combining characters start from the base + // character and are arranged leftward. + // Since these guys will get reordered into being pre-base, we need to flip them. + if(kbts__GlyphIsValid(Storage, LastPreBaseMatra)) { - kbts_un LeftIndex = LastPreBaseMatraIndex + FlipIndex; - kbts_un RightIndex = LastPreBaseMatraIndex + FlipCount - 1 - FlipIndex; - kbts_glyph Swap = Glyphs[LeftIndex]; - Glyphs[LeftIndex] = Glyphs[RightIndex]; - Glyphs[RightIndex] = Swap; + kbts__DllistReverseSublist(LastPreBaseMatra, Glyph->Next); } + else + { + // When we reverse, this will become the "last" pre-base matra again, so we only need to set it once. + LastPreBaseMatra = Glyph; + } + } break; - // Readjust Glyph to compensate for the flip. - Glyph = &Glyphs[LastPreBaseMatraIndex]; + case KBTS_INDIC_SYLLABIC_CLASS_VARIATION_SELECTOR: + Position = LastPosition; + break; + + case KBTS_INDIC_SYLLABIC_CLASS_VOWEL_BELOW: + if(Position == KBTS__SYLLABIC_POSITION_AFTER_MAIN) + { + Position = KBTS__SYLLABIC_POSITION_BELOWBASE_CONSONANT; + } + else if(Position == KBTS__SYLLABIC_POSITION_BELOWBASE_CONSONANT) + { + Position = SectionPosition; + } + break; + + case KBTS_INDIC_SYLLABIC_CLASS_VEDIC_SIGN: + if(Position == KBTS__SYLLABIC_POSITION_BELOWBASE_CONSONANT) + { + Position = KBTS__SYLLABIC_POSITION_BEFORE_SUBJOINED; + } + break; } - LastPreBaseMatraIndex = GlyphIndex; - } break; - - case KBTS_INDIC_SYLLABIC_CLASS_VARIATION_SELECTOR: - Position = LastPosition; - break; - - case KBTS_INDIC_SYLLABIC_CLASS_VOWEL_BELOW: - if(Position == KBTS_SYLLABIC_POSITION_AFTER_MAIN) - { - Position = KBTS_SYLLABIC_POSITION_BELOWBASE_CONSONANT; - } - else if(Position == KBTS_SYLLABIC_POSITION_BELOWBASE_CONSONANT) + if((SectionPosition == KBTS__SYLLABIC_POSITION_BELOWBASE_CONSONANT) && (Glyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_VEDIC_SIGN)) { + SectionPosition = KBTS__SYLLABIC_POSITION_AFTER_SUBJOINED; Position = SectionPosition; } - break; - case KBTS_INDIC_SYLLABIC_CLASS_VEDIC_SIGN: - if(Position == KBTS_SYLLABIC_POSITION_BELOWBASE_CONSONANT) - { - Position = KBTS_SYLLABIC_POSITION_BEFORE_SUBJOINED; - } - break; + Glyph->SyllabicPosition = Position; + LastPosition = Position; + Glyph = Next; } - - if((SectionPosition == KBTS_SYLLABIC_POSITION_BELOWBASE_CONSONANT) && (Glyph->SyllabicClass == KBTS_INDIC_SYLLABIC_CLASS_VEDIC_SIGN)) - { - SectionPosition = KBTS_SYLLABIC_POSITION_AFTER_SUBJOINED; - Position = SectionPosition; - } - - Glyph->SyllabicPosition = Position; - LastPosition = Position; } - KBTS_FOR(Iter, 1, GlyphCount) + if(MinimumGlyphCount > 1) { - KBTS_FOR(GlyphIndex, 1, GlyphCount) - { - kbts_glyph *A = &Glyphs[GlyphIndex - 1]; - kbts_glyph *B = &Glyphs[GlyphIndex]; + KBTS__DLLIST_SORT(Storage->GlyphSentinel.Next, (kbts_glyph *)&Storage->GlyphSentinel, SyllabicPosition); - if(A->SyllabicPosition > B->SyllabicPosition) + #ifdef KBTS_SANITY_CHECK + { + kbts_glyph *Left = C->GlyphSentinel.Next; + kbts_glyph *Right = Left->Next; + while(kbts__GlyphIsValid(C, Right)) { - kbts_glyph Swap = *A; - *A = *B; - *B = Swap; + kbts_glyph *Next = Right->Next; + + KBTS_ASSERT(Left->SyllabicPosition <= Right->SyllabicPosition); + + Left = Right; + Right = Next; } } + #endif } } break; } - return Result; -} - -static kbts_op_list kbts_OpList(kbts_u8 *Ops, kbts_un Size) -{ - kbts_op_list Result = KBTS_ZERO; - Result.Ops = Ops; - Result.Length = Size; - return Result; -} -#define KBTS_OP_LIST(OpList) kbts_OpList((kbts_Ops_##OpList), KBTS_ARRAY_LENGTH(kbts_Ops_##OpList)) - -KBTS_EXPORT kbts_shape_config kbts_ShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language) -{ - kbts_shape_config Result = KBTS_ZERO; - - Result.Font = Font; - Result.Script = Script; - Result.Language = Language; - - kbts_gsub_gpos *Gsub = Font->ShapingTables[KBTS_SHAPING_TABLE_GSUB]; - - // Find the appropriate language system in GSUB/GPOS. - kbts_script_properties *ScriptProperties = &kbts_ScriptProperties[Script]; - int FoundScriptIsIndic3 = 0; - - KBTS_FOR(ShapingTableIndex, 0, KBTS_SHAPING_TABLE_COUNT) + if(0) { - kbts_gsub_gpos *ShapingTable = Font->ShapingTables[ShapingTableIndex]; - if(ShapingTable) + OutOfMemory:; + Scratchpad->Error = KBTS_SHAPE_ERROR_OUT_OF_MEMORY; + } +} + +static void *kbts__PointerPush(char **Pointer, kbts_un Size, kbts_un Align) +{ + char *At = *Pointer; + char *Aligned = KBTS__ALIGN_POINTER(char, At, Align); + *Pointer = Aligned + Size; + + void *Result = Aligned; + return Result; +} +#define kbts__PointerPushType(Pointer, Type) (Type *)kbts__PointerPush((Pointer), sizeof(Type), KBTS_ALIGNOF(Type)) +#define kbts__PointerPushArray(Pointer, Type, Count) (Type *)kbts__PointerPush((Pointer), sizeof(Type) * (Count), KBTS_ALIGNOF(Type)) + +static kbts_shape_config *kbts__PlaceShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language, void *Memory, kbts_un *Size) +{ + kbts_shape_config *Result = 0; + kbts_shape_config DummyConfig; + char *MemoryAt = (char *)Memory; + + if(Font) + { + Result = kbts__PointerPushType(&MemoryAt, kbts_shape_config); + if(!Memory) { - kbts_script_list *ScriptList = KBTS_POINTER_OFFSET(kbts_script_list, ShapingTable, ShapingTable->ScriptListOffset); + Result = &DummyConfig; + } - kbts_langsys *ChosenLangsys = 0; - kbts_u32 DesiredTag = ScriptProperties->Tag; + KBTS_MEMSET(Result, 0, sizeof(*Result)); - KBTS_FOR(ScriptIndex, 0, ScriptList->Count) + Result->Font = Font; + Result->Script = Script; + Result->Language = Language; + + kbts__gsub_gpos *ShapingTables[2] = { + kbts__BlobTableDataType(Font->Blob, KBTS_BLOB_TABLE_ID_GSUB, kbts__gsub_gpos), + kbts__BlobTableDataType(Font->Blob, KBTS_BLOB_TABLE_ID_GPOS, kbts__gsub_gpos), + }; + + kbts__gsub_gpos *Gsub = ShapingTables[0]; + + // Find the appropriate language system in GSUB/GPOS. + kbts__script_properties *ScriptProperties = &kbts__ScriptProperties[Script]; + int FoundScriptIsIndic3 = 0; + + KBTS__FOR(ShapingTableIndex, 0, KBTS_SHAPING_TABLE_COUNT) + { + kbts__gsub_gpos *ShapingTable = ShapingTables[ShapingTableIndex]; + if(ShapingTable) { - kbts_script_pointer ThisScript = kbts_GetScript(ScriptList, ScriptIndex); - kbts_u32 Tag = ThisScript.Tag; + kbts__script_list *ScriptList = KBTS__POINTER_OFFSET(kbts__script_list, ShapingTable, ShapingTable->ScriptListOffset); - // The OpenType spec does not define or even mention "Indic3" scripts at all. - // Nevertheless, Harfbuzz at least checks for '3' at the end of script tags, and, if one exists, they choose USE. - int Indic3 = (ThisScript.Tag >> 24) == '3'; - kbts_u32 MatchMask = Indic3 ? 0xFFFFFF : 0xFFFFFFFF; - int PerfectMatch = !((Tag ^ DesiredTag) & MatchMask); - if(!ScriptIndex || PerfectMatch || (Tag == KBTS_FOURCC('D', 'F', 'L', 'T'))) + kbts__langsys *ChosenLangsys = 0; + kbts_u32 DesiredTag = ScriptProperties->Tag; + + KBTS__FOR(ScriptIndex, 0, ScriptList->Count) { - kbts_langsys *Langsys = kbts_GetDefaultLangsys(ThisScript.Script); - KBTS_FOR(LangsysIndex, 0, ThisScript.Script->Count) - { - kbts_langsys_pointer LangsysPointer = kbts_GetLangsys(ThisScript.Script, LangsysIndex); + kbts__script_pointer ThisScript = kbts__GetScript(ScriptList, ScriptIndex); + kbts_u32 Tag = ThisScript.Tag; - if(LangsysPointer.Tag == Language) + // The OpenType spec does not define or even mention "Indic3" scripts at all. + // Nevertheless, Harfbuzz at least checks for '3' at the end of script tags, and, if one exists, they choose USE. + int Indic3 = (ThisScript.Tag >> 24) == '3'; + kbts_u32 MatchMask = Indic3 ? 0xFFFFFF : 0xFFFFFFFF; + int PerfectMatch = !((Tag ^ DesiredTag) & MatchMask); + if(!ScriptIndex || PerfectMatch || (Tag == KBTS_FOURCC('D', 'F', 'L', 'T'))) + { + kbts__langsys *Langsys = kbts__GetDefaultLangsys(ThisScript.Script); + KBTS__FOR(LangsysIndex, 0, ThisScript.Script->Count) + { + kbts__langsys_pointer LangsysPointer = kbts__GetLangsys(ThisScript.Script, LangsysIndex); + + if(LangsysPointer.Tag == Language) + { + Langsys = LangsysPointer.Langsys; + break; + } + } + + // It is tempting to try to look for another script if the one we want has no langsys. + // However, it is possible for a script to purposefully have no langsys at all. In that case, + // the shaper should not apply any GSUB features. + // In that case, the shaper should not apply any GSUB features. + // So, store the result _regardless_ of whether Langsys is null or not. + ChosenLangsys = Langsys; + if(ShapingTableIndex == KBTS_SHAPING_TABLE_GSUB) + { + // Apparently, it is allowed to have script-specific GSUB tables, and a huge DFLT GPOS table. + FoundScriptIsIndic3 = Indic3; + } + // And then get out if we found the appropriate script, even if the langsys is null! + if(PerfectMatch) { - Langsys = LangsysPointer.Langsys; break; } } + } - // It is tempting to try to look for another script if the one we want has no langsys. - // However, it is possible for a script to purposefully have no langsys at all. In that case, - // the shaper should not apply any GSUB features. - // In that case, the shaper should not apply any GSUB features. - // So, store the result _regardless_ of whether Langsys is null or not. - ChosenLangsys = Langsys; - if(ShapingTableIndex == KBTS_SHAPING_TABLE_GSUB) + Result->Langsys[ShapingTableIndex] = ChosenLangsys; + } + } + + Result->IndicScriptProperties = kbts__IndicScriptProperties(Script); + Result->Shaper = FoundScriptIsIndic3 ? KBTS_SHAPER_USE : ScriptProperties->Shaper; + Result->OpList = *kbts__ShaperOpLists[Result->Shaper]; + + Result->Features = KBTS__ZERO_TYPE(kbts__feature_set); + KBTS__FOR(StageIndex, 0, Result->OpList.FeatureStageCount) + { + kbts__feature_stage *Stage = &Result->OpList.FeatureStages[StageIndex]; + + KBTS__FOR(WordIndex, 0, KBTS__ARRAY_LENGTH(Result->Features.Flags)) + { + Result->Features.Flags[WordIndex] |= Stage->Features.Flags[WordIndex]; + } + } + + kbts__feature *Rclt = 0; + kbts__feature_set SyllableFeatureSet = {{KBTS__FEATURE_FLAG0(rphf) | KBTS__FEATURE_FLAG0(blwf) | KBTS__FEATURE_FLAG0(half) | KBTS__FEATURE_FLAG0(pstf) | KBTS__FEATURE_FLAG0(pref), + 0, KBTS__FEATURE_FLAG2(rclt) | KBTS__FEATURE_FLAG2(locl), KBTS__FEATURE_FLAG3(vatu)}}; + kbts__iterate_features IterateFeatures = kbts__IterateFeatures(Result, KBTS_SHAPING_TABLE_GSUB, SyllableFeatureSet); + while(kbts__NextFeature(&IterateFeatures)) + { + switch(IterateFeatures.CurrentFeatureTag) + { + case KBTS_FEATURE_TAG_blwf: Result->Blwf = IterateFeatures.Feature; break; + case KBTS_FEATURE_TAG_pref: Result->Pref = IterateFeatures.Feature; break; + case KBTS_FEATURE_TAG_pstf: Result->Pstf = IterateFeatures.Feature; break; + case KBTS_FEATURE_TAG_locl: Result->Locl = IterateFeatures.Feature; break; + case KBTS_FEATURE_TAG_rphf: Result->Rphf = IterateFeatures.Feature; break; + case KBTS_FEATURE_TAG_half: Result->Half = IterateFeatures.Feature; break; + case KBTS_FEATURE_TAG_vatu: Result->Vatu = IterateFeatures.Feature; break; + case KBTS_FEATURE_TAG_rclt: Rclt = IterateFeatures.Feature; break; + } + } + + if((Result->Shaper == KBTS_SHAPER_ARABIC) && !Rclt) + { + Result->OpList = kbts__OpList_ArabicNoRclt; + } + + if(Result->IndicScriptProperties.ViramaCodepoint) + { + kbts__shape_scratchpad DummyScratchpad = KBTS__ZERO; + kbts_glyph_storage DummyStorage = KBTS__ZERO; + KBTS__DLLIST_SENTINEL_INIT(&DummyStorage.GlyphSentinel); + KBTS__DLLIST_SENTINEL_INIT(&DummyStorage.FreeGlyphSentinel); + + // Bake the locl-ized virama. + kbts_glyph Virama = kbts_CodepointToGlyph(Font, (int)Result->IndicScriptProperties.ViramaCodepoint, 0, 0); + Result->Virama = kbts__Substitute1(&DummyScratchpad, Result, &DummyStorage, kbts__GetLookupList(Gsub), Result->Locl, KBTS__SKIP_FLAG_ZWNJ | KBTS__SKIP_FLAG_ZWJ, &Virama); + } + + if((Result->Script == KBTS_SCRIPT_THAI) || (Result->Script == KBTS_SCRIPT_LAO)) + { + kbts_u32 NikhahitCodepoint = (Result->Script == KBTS_SCRIPT_THAI) ? 0xE4D : 0xECD; + kbts_u32 SaraAaCodepoint = (Result->Script == KBTS_SCRIPT_THAI) ? 0xE32 : 0xEB2; + Result->Nikhahit = kbts_CodepointToGlyph(Font, (int)NikhahitCodepoint, 0, 0); + Result->SaraAa = kbts_CodepointToGlyph(Font, (int)SaraAaCodepoint, 0, 0); + } + + Result->DottedCircle = kbts_CodepointToGlyph(Font, 0x25CC, 0, 0); + Result->Whitespace = kbts_CodepointToGlyph(Font, ' ', 0, 0); + + if(ShapingTables[KBTS_SHAPING_TABLE_GSUB] || ShapingTables[KBTS_SHAPING_TABLE_GPOS]) + { // Initialize the per-feature lookup lists. + kbts__baked_feature_stage *BakedStages = kbts__PointerPushArray(&MemoryAt, kbts__baked_feature_stage, Result->OpList.FeatureStageCount); + + kbts_un FeatureStageIndex = 0; + KBTS__FOR(OpIndex, 0, Result->OpList.OpCount) + { + kbts__op_kind Op = Result->OpList.Ops[OpIndex]; + int UserFeaturesAllowed = KBTS__IN_SET(Op, KBTS__SET32((KBTS__OP_KIND_GSUB_FEATURES_WITH_USER) + (KBTS__OP_KIND_GPOS_FEATURES))); + + if(KBTS__IN_SET(Op, KBTS__SET32((KBTS__OP_KIND_GSUB_FEATURES) + (KBTS__OP_KIND_GSUB_FEATURES_WITH_USER) + (KBTS__OP_KIND_GPOS_FEATURES)))) + { + kbts__feature_stage *FeatureStage = &Result->OpList.FeatureStages[FeatureStageIndex]; + kbts_shaping_table ShapingTable = (kbts_shaping_table)((Op == KBTS__OP_KIND_GPOS_FEATURES) ? KBTS_SHAPING_TABLE_GPOS : KBTS_SHAPING_TABLE_GSUB); + kbts__gsub_gpos *GsubGpos = ShapingTables[ShapingTable]; + kbts__langsys *Langsys = Result->Langsys[ShapingTable]; + kbts_un BakedFeatureCount = 0; + kbts_un BakedFeatureLookupIndexCount = 0; + + kbts__baked_feature_stage *BakedStage = &BakedStages[FeatureStageIndex]; + + if(GsubGpos && Langsys) { - // Apparently, it is allowed to have script-specific GSUB tables, and a huge DFLT GPOS table. - FoundScriptIsIndic3 = Indic3; + kbts__feature_list *FeatureList = KBTS__POINTER_OFFSET(kbts__feature_list, GsubGpos, GsubGpos->FeatureListOffset); + kbts_u16 *FeatureIndices = KBTS__POINTER_AFTER(kbts_u16, Langsys); + kbts__baked_feature *BakedFeatures; + + // @Speed: Maybe we don't care about fragmentation and we just allocate Langsys->FeatureIndexCount in advance? + KBTS__FOR(FeatureIndexIndex, 0, Langsys->FeatureIndexCount) + { + kbts_un FeatureIndex = FeatureIndices[FeatureIndexIndex]; + kbts__feature_pointer Feature = kbts__GetFeature(FeatureList, FeatureIndex); + + kbts_u32 FeatureId = kbts__FeatureTagToId(Feature.Tag); + + if(Feature.Feature->LookupIndexCount && + ((UserFeaturesAllowed && + !kbts__ContainsFeature(&Result->Features, FeatureId)) || + kbts__ContainsFeature(&FeatureStage->Features, FeatureId))) + { + BakedFeatureCount += 1; + } + } + + kbts_un BakedFeatureCapacity = KBTS__MIN(BakedFeatureCount, KBTS_MAX_SIMULTANEOUS_FEATURES); + + BakedFeatures = kbts__PointerPushArray(&MemoryAt, kbts__baked_feature, BakedFeatureCapacity); + + BakedFeatureCount = 0; + + KBTS__FOR(FeatureIndexIndex, 0, Langsys->FeatureIndexCount) + { + kbts_un FeatureIndex = FeatureIndices[FeatureIndexIndex]; + kbts__feature_pointer Feature = kbts__GetFeature(FeatureList, FeatureIndex); + + kbts_u32 FeatureId = kbts__FeatureTagToId(Feature.Tag); + // We add all features indiscriminately for ops that might incorporate user features. + if(Feature.Feature->LookupIndexCount && + // We add "all" features to user feature stages, except for features that are a default part of the shaper. + // If a user asks for a default feature explicitly, it is unclear whether it should be applied now or in its + // default stage. + // Leaving the feature in its default stage seems like the better thing to do, because, supposedly, these features + // will have been designed to apply at a specific point in the pipeline, and moving them makes little sense. + ((UserFeaturesAllowed && + !kbts__ContainsFeature(&Result->Features, FeatureId)) || + kbts__ContainsFeature(&FeatureStage->Features, FeatureId))) + { + kbts__baked_feature BakedFeature = KBTS__ZERO; + BakedFeature.FeatureTag = Feature.Tag; + BakedFeature.FeatureId = FeatureId; + // CAREFUL: We use SkipFlags as a temporary index until the end of the stage. + BakedFeature.SkipFlags = kbts__SkipFlags(BakedFeature.FeatureId, Result->Shaper); + BakedFeature.Count = Feature.Feature->LookupIndexCount; + // These point directly into the file. + BakedFeature.Indices = KBTS__POINTER_AFTER(kbts_u16, Feature.Feature); + + // @Incomplete + //if(FeatureVariations) + //{ + // KBTS__FOR(VariationIndex, 0, FeatureVariations->RecordCount) + // { + // kbts__feature_variation_pointer Variation = kbts__GetFeatureVariation(FeatureVariations, VariationIndex); + // KBTS__FOR(ConditionIndex, 0, Variation.ConditionSet->Count) + // { + // kbts__condition_1 *Condition = kbts__GetCondition(Variation.ConditionSet, ConditionIndex); + // KBTS_ASSERT(0); + // } + // } + //} + + // For Myanmar, we could try and tag glyphs depending on their Indic properties in BeginCluster, just like we do for + // Indic scripts. + // However, Harfbuzz does _not_ do this, so it seems like a bunch of work that would, at best, make us diverge from + // Harfbuzz more often. + if((Result->Shaper != KBTS_SHAPER_MYANMAR) && (FeatureId >= 1) && (FeatureId <= 32)) + { + // These must properly map KBTS__FEATURE_ID to kbts_glyph_flags! + BakedFeature.GlyphFilter = (1 << (FeatureId - 1)) & KBTS__GLYPH_FEATURE_MASK; + } + + if(Memory) + { + BakedFeatures[BakedFeatureCount] = BakedFeature; + } + + BakedFeatureCount += 1; + BakedFeatureLookupIndexCount += BakedFeature.Count; + + if(BakedFeatureCount >= BakedFeatureCapacity) + { + break; + } + } + } + + kbts_u16 *OrderedFeatureIndices = kbts__PointerPushArray(&MemoryAt, kbts_u16, BakedFeatureLookupIndexCount); + kbts_u16 *BakedFeatureLookupIndicesRead = kbts__PointerPushArray(&MemoryAt, kbts_u16, BakedFeatureCount); + + if(Memory) + { + kbts_un OrderedFeatureIndicesWritten = 0; + + KBTS__FOR(BakedFeatureIndex, 0, BakedFeatureCount) + { + BakedFeatureLookupIndicesRead[BakedFeatureIndex] = 0; + } + + KBTS__FOR(OrderedLookupIndex, 0, BakedFeatureLookupIndexCount) + { + kbts_u16 LowestLookupIndex = 0xFFFF; + kbts_un BestBakedFeatureIndex = 0; + + KBTS__FOR(BakedFeatureIndex, 0, BakedFeatureCount) + { + kbts__baked_feature *BakedFeature = &BakedFeatures[BakedFeatureIndex]; + kbts_un LookupIndicesRead = BakedFeatureLookupIndicesRead[BakedFeatureIndex]; + + if(LookupIndicesRead < BakedFeature->Count) + { + kbts_u16 NextIndex = BakedFeature->Indices[LookupIndicesRead]; + + if(NextIndex < LowestLookupIndex) + { + LowestLookupIndex = NextIndex; + BestBakedFeatureIndex = BakedFeatureIndex; + } + } + } + + BakedFeatureLookupIndicesRead[BestBakedFeatureIndex] += 1; + OrderedFeatureIndices[OrderedFeatureIndicesWritten++] = (kbts_u16)BestBakedFeatureIndex; + } + + KBTS_ASSERT(OrderedFeatureIndicesWritten == BakedFeatureLookupIndexCount); + + BakedStage->FeatureCount = (kbts_u16)BakedFeatureCount; + BakedStage->FeatureIndexCount = (kbts_u16)BakedFeatureLookupIndexCount; + BakedStage->Features = BakedFeatures; + BakedStage->FeatureIndices = OrderedFeatureIndices; + } } - // And then get out if we found the appropriate script, even if the langsys is null! - if(PerfectMatch) + + KBTS_ASSERT(FeatureStageIndex < Result->OpList.FeatureStageCount); + FeatureStageIndex += 1; + } + } + + Result->FeatureStages = BakedStages; + } + } + + if(!Memory) + { + *Size = (kbts_un)(MemoryAt - (char *)Memory) + KBTS_ALIGNOF(kbts_shape_config); + Result = 0; + } + + return Result; +} + +KBTS_EXPORT int kbts_SizeOfShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language) +{ + kbts_un Size; + kbts__PlaceShapeConfig(Font, Script, Language, 0, &Size); + + return (int)Size; +} + +KBTS_EXPORT kbts_shape_config *kbts_PlaceShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language, void *Memory) +{ + kbts_un Size; + kbts_shape_config *Result = kbts__PlaceShapeConfig(Font, Script, Language, Memory, &Size); + return Result; +} + +KBTS_EXPORT kbts_shape_config *kbts_CreateShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language, kbts_allocator_function *Allocator, void *AllocatorData) +{ + if(!Allocator) + { + Allocator = kbts__DefaultAllocator; + } + + kbts_un Size; + kbts__PlaceShapeConfig(Font, Script, Language, 0, &Size); + kbts_shape_config *Result = kbts__PlaceShapeConfig(Font, Script, Language, kbts__AllocatorAllocate(Allocator, AllocatorData, Size), &Size); + if(Result) + { + Result->Allocator = Allocator; + Result->AllocatorData = AllocatorData; + } + + return Result; +} + +KBTS_EXPORT void kbts_DestroyShapeConfig(kbts_shape_config *Config) +{ + if(Config->Allocator) + { + kbts__AllocatorFree(Config->Allocator, Config->AllocatorData, Config); + } +} + +static int kbts__ReadOp(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts__op_kind End) +{ + KBTS_INSTRUMENT_FUNCTION_BEGIN; + int Result = 0; + + if(Config) + { + kbts__op_list *OpList = &Config->OpList; + + if(Scratchpad->Ip < OpList->OpCount) + { + kbts__op_kind Kind = OpList->Ops[Scratchpad->Ip++]; + + if((Kind == KBTS__OP_KIND_GSUB_FEATURES_WITH_USER) || + (Kind == KBTS__OP_KIND_GSUB_FEATURES) || + (Kind == KBTS__OP_KIND_GPOS_FEATURES)) + { + kbts__feature_stage *FeatureStage = &OpList->FeatureStages[Scratchpad->FeatureStagesRead++]; + Scratchpad->OpFeatures = &FeatureStage->Features; + + // We only have one GPOS_FEATURES op per op list, so it's fine to add user features like this. + if((Kind == KBTS__OP_KIND_GSUB_FEATURES_WITH_USER) || + (Kind == KBTS__OP_KIND_GPOS_FEATURES)) + { + if(Kind == KBTS__OP_KIND_GSUB_FEATURES_WITH_USER) { + Kind = KBTS__OP_KIND_GSUB_FEATURES; + } + + KBTS__FOR(WordIndex, 0, KBTS__ARRAY_LENGTH(Scratchpad->ScratchFeatures.Flags)) + { + Scratchpad->ScratchFeatures.Flags[WordIndex] = Scratchpad->UserFeatures.Flags[WordIndex] | FeatureStage->Features.Flags[WordIndex]; + } + + Scratchpad->OpFeatures = &Scratchpad->ScratchFeatures; + } + } + + Scratchpad->OpKind = Kind; + Result = (Kind != End); + } + } + + KBTS_INSTRUMENT_FUNCTION_END; + return Result; +} + +KBTS_EXPORT int kbts_SizeOfShapeContext(void) +{ + int Result = sizeof(kbts_shape_context); + return Result; +} + +KBTS_EXPORT kbts_shape_context *kbts_PlaceShapeContext(kbts_allocator_function *Allocator, void *AllocatorData, void *Memory) +{ + kbts_shape_context *Result = (kbts_shape_context *)Memory; + + if(Memory) + { + if(!Allocator) + { + Allocator = kbts__DefaultAllocator; + } + + KBTS_MEMSET(Result, 0, sizeof(*Result)); + + Result->FontArena.Allocator = Allocator; + Result->FontArena.AllocatorData = AllocatorData; + + Result->ConfigArena.Allocator = Allocator; + Result->ConfigArena.AllocatorData = AllocatorData; + + Result->ScratchArena.Allocator = Allocator; + Result->ScratchArena.AllocatorData = AllocatorData; + + KBTS__DLLIST_SENTINEL_INIT(&Result->FeatureOverrideSentinel); + KBTS__DLLIST_SENTINEL_INIT(&Result->FreeFeatureOverrideSentinel); + } + + return Result; +} + +KBTS_EXPORT kbts_shape_context *kbts_PlaceShapeContextFixedMemory(void *Memory, int Size) +{ + kbts_shape_context *Result = 0; + kbts_un SizeOfShapeContext = kbts_SizeOfShapeContext(); + kbts_un ContextAndArenaSize = sizeof(kbts_arena) + SizeOfShapeContext; + + if((Size >= 0) && ((kbts_un)Size >= ContextAndArenaSize)) + { + kbts_arena *Arena = (kbts_arena *)KBTS__POINTER_OFFSET(kbts_arena, Memory, SizeOfShapeContext); + kbts__InitializeFixedMemoryArena(Arena, KBTS__POINTER_AFTER(void, Arena), (kbts_un)Size - ContextAndArenaSize); + + Result = kbts_PlaceShapeContext(kbts__ArenaAllocator, Arena, Memory); + } + + return Result; +} + +KBTS_EXPORT kbts_shape_context *kbts_CreateShapeContext(kbts_allocator_function *Allocator, void *AllocatorData) +{ + if(!Allocator) + { + Allocator = kbts__DefaultAllocator; + } + + kbts_shape_context *Result = kbts_PlaceShapeContext(Allocator, AllocatorData, kbts__AllocatorAllocate(Allocator, AllocatorData, (kbts_un)kbts_SizeOfShapeContext())); + Result->SelfAllocator = Allocator; + Result->SelfAllocatorData = AllocatorData; + return Result; +} + +KBTS_EXPORT void kbts_DestroyShapeContext(kbts_shape_context *Context) +{ + if(Context) + { + kbts__FreeArena(&Context->ConfigArena); + kbts__FreeArena(&Context->ScratchArena); + kbts__FreeArena(&Context->FontArena); + kbts__FreeArena(&Context->GlyphStorage.Arena); + + if(Context->SelfAllocator) + { + kbts__AllocatorFree(Context->SelfAllocator, Context->SelfAllocatorData, Context); + } + } +} + +KBTS_EXPORT kbts_direction kbts_ScriptDirection(kbts_script Script) +{ + kbts_direction Result = ((Script == KBTS_SCRIPT_ARABIC) || (Script == KBTS_SCRIPT_HEBREW)) ? KBTS_DIRECTION_RTL : KBTS_DIRECTION_LTR; + return Result; +} + +static kbts__context_font *kbts__ShapePushFont(kbts_shape_context *Context) +{ + kbts__context_font *Result = 0; + + if(!Context->Error && (Context->FontCount < KBTS_CONTEXT_MAX_FONT_COUNT)) + { + Result = &Context->Fonts[Context->FontCount++]; + Result->Font = 0; + Result->Lifetime = kbts__BeginLifetime(&Context->FontArena); + } + + return Result; +} + +KBTS_EXPORT kbts_font *kbts_ShapePushFont(kbts_shape_context *Context, kbts_font *Font) +{ + if(!Context->Error) + { + kbts__context_font *ContextFont = kbts__ShapePushFont(Context); + + if(ContextFont) + { + ContextFont->Font = Font; + } + } + + return Font; +} + +KBTS_EXPORT kbts_font *kbts_ShapePopFont(kbts_shape_context *Context) +{ + kbts_font *Result = 0; + + if(!Context->Error && Context->FontCount) + { + kbts__context_font *ContextFont = &Context->Fonts[Context->FontCount - 1]; + Result = ContextFont->Font; + + kbts__EndLifetime(&ContextFont->Lifetime); + + Context->FontCount -= 1; + } + + return Result; +} + +#ifndef KB_TEXT_SHAPE_NO_CRT +KBTS_EXPORT kbts_font *kbts_ShapePushFontFromFile(kbts_shape_context *Context, const char *FileName, int FontIndex) +{ + kbts__context_font *ContextFont = kbts__ShapePushFont(Context); + kbts_font *Result = 0; + + if(!Context->Error) + { + Result = kbts__PushType(&Context->FontArena, kbts_font); + if(Result) + { + *Result = kbts_FontFromFile(FileName, FontIndex, kbts__ArenaAllocator, &Context->FontArena, 0, 0); + + if(!Result->Error) + { + ContextFont->Font = Result; + } + else + { + kbts_ShapePopFont(Context); + Result = 0; + } + } + else + { + Context->Error = KBTS_SHAPE_ERROR_OUT_OF_MEMORY; + } + } + + return Result; +} +#endif + +KBTS_EXPORT kbts_font *kbts_ShapePushFontFromMemory(kbts_shape_context *Context, void *Memory, int Length, int FontIndex) +{ + kbts_font *Result = 0; + + if(!Context->Error && (Length > 0)) + { + kbts__context_font *ContextFont = kbts__ShapePushFont(Context); + + Result = kbts__PushType(&Context->FontArena, kbts_font); + + if(Result) + { + int ScratchSize, OutputSize; + kbts_load_font_state State = KBTS__ZERO; + kbts_load_font_error Error = kbts_LoadFont(Result, &State, Memory, Length, FontIndex, &ScratchSize, &OutputSize); + if(Error == KBTS_LOAD_FONT_ERROR_NEED_TO_CREATE_BLOB) + { + void *Scratch = kbts__PushSize(&Context->ScratchArena, (kbts_un)ScratchSize, 8); + void *Output = kbts__PushSize(&Context->FontArena, (kbts_un)OutputSize, 8); + + Error = kbts_PlaceBlob(Result, &State, Scratch, Output); + } + + if(!Error) + { + ContextFont->Font = Result; + } + else + { + kbts_ShapePopFont(Context); + Result = 0; + } + } + } + + return Result; +} + +static void kbts__EnsureGlyphStorageInitialized(kbts_glyph_storage *Storage) +{ + if(!Storage->GlyphSentinel.Next) + { + KBTS__DLLIST_SENTINEL_INIT(&Storage->GlyphSentinel); + KBTS__DLLIST_SENTINEL_INIT(&Storage->FreeGlyphSentinel); + } +} + +KBTS_EXPORT int kbts_InitializeGlyphStorage(kbts_glyph_storage *Storage, kbts_allocator_function *Allocator, void *AllocatorData) +{ + int Result = 0; + + if(Storage) + { + Result = 1; + KBTS_MEMSET(Storage, 0, sizeof(*Storage)); + + Storage->Arena.Allocator = Allocator; + Storage->Arena.AllocatorData = AllocatorData; + } + + return Result; +} + +KBTS_EXPORT int kbts_InitializeGlyphStorageFixedMemory(kbts_glyph_storage *Storage, void *Memory, int MemorySize) +{ + int Result = 0; + + if(Storage && + (MemorySize > 0)) + { + KBTS_MEMSET(Storage, 0, sizeof(*Storage)); + + Result = kbts__InitializeFixedMemoryArena(&Storage->Arena, Memory, (kbts_un)MemorySize); + } + + return Result; +} + +KBTS_EXPORT kbts_glyph_iterator kbts_ActiveGlyphIterator(kbts_glyph_storage *Storage) +{ + kbts_glyph_iterator Result = KBTS__ZERO; + + if(Storage && !Storage->Error) + { + kbts__EnsureGlyphStorageInitialized(Storage); + + Result.GlyphStorage = Storage; + Result.CurrentGlyph = Storage->GlyphSentinel.Next; + } + + return Result; +} + +KBTS_EXPORT void kbts_ClearActiveGlyphs(kbts_glyph_storage *Storage) +{ + if(!Storage->Error) + { + kbts__EnsureGlyphStorageInitialized(Storage); + + kbts_glyph *First = Storage->GlyphSentinel.Next; + kbts_glyph *Last = Storage->GlyphSentinel.Prev; + + if(kbts__GlyphIsValid(Storage, First)) + { + // Free all previous glyphs. + First->Prev = Storage->FreeGlyphSentinel.Prev; + Last->Next = &Storage->FreeGlyphSentinel; + First->Prev->Next = First; + Last->Next->Prev = Last; + } + + KBTS__DLLIST_SENTINEL_INIT(&Storage->GlyphSentinel); + } +} + +KBTS_EXPORT void kbts_FreeAllGlyphs(kbts_glyph_storage *Storage) +{ + kbts__FreeArena(&Storage->Arena); + + KBTS__DLLIST_SENTINEL_INIT(&Storage->GlyphSentinel); + KBTS__DLLIST_SENTINEL_INIT(&Storage->FreeGlyphSentinel); +} + +KBTS_EXPORT kbts_glyph *kbts_PushGlyph(kbts_glyph_storage *Storage, kbts_font *Font, int Codepoint, kbts_glyph_config *Config, int UserId) +{ + kbts_glyph *Result = 0; + + if(!Storage->Error) + { + kbts__EnsureGlyphStorageInitialized(Storage); + + kbts_glyph Template = KBTS__ZERO; + if(Font) + { + Template = kbts_CodepointToGlyph(Font, Codepoint, Config, UserId); + } + else + { + Template.Codepoint = (kbts_u32)Codepoint; + Template.Config = Config; + // We do not want to use the template's UserId here, because it is just a bag of properties! + // We want to keep the original UserId. + } + + Result = kbts__InsertGlyphBefore(Storage, &Storage->GlyphSentinel, &Template); + } + + return Result; +} + +static int kbts__FeatureOverrideIsExtra(kbts_u32 Tag, int Value) +{ + int Result = 0; + kbts__feature_id Id = kbts__FeatureTagToId(Tag); + + if(!Id || (kbts_u32)(Value > 1)) + { + Result = 1; + } + + return Result; +} + +static void kbts__AddExtraFeatureOverride(kbts_glyph_config *Config, kbts__feature_override *Extra, kbts_u32 Tag, int Value) +{ + Extra->Tag = Tag; + Extra->Value = Value; + + KBTS__DLLIST_INSERT_BEFORE(&Extra->Header, &Config->FeatureOverrideSentinel); +} + +KBTS_EXPORT int kbts_SizeOfGlyphConfig(kbts_feature_override *Overrides, int OverrideCount) +{ + kbts_un StoredOverrideCount = 0; + + if(OverrideCount > 0) + { + KBTS__FOR(OverrideIndex, 0, (kbts_un)OverrideCount) + { + kbts_feature_override *Override = &Overrides[OverrideIndex]; + + if(kbts__FeatureOverrideIsExtra(Override->Tag, Override->Value)) + { + StoredOverrideCount += 1; + } + } + } + + kbts_un Result = sizeof(kbts_glyph_config) + StoredOverrideCount * sizeof(kbts__feature_override); + return (int)Result; +} + +KBTS_EXPORT kbts_glyph_config *kbts_PlaceGlyphConfig(kbts_feature_override *Overrides, int OverrideCount, void *Memory) +{ + kbts_glyph_config *Result = (kbts_glyph_config *)Memory; + if(Memory) + { + KBTS_MEMSET(Result, 0, sizeof(*Result)); + KBTS__DLLIST_SENTINEL_INIT(&Result->FeatureOverrideSentinel); + + kbts__feature_override *ExtraOverrides = KBTS__POINTER_AFTER(kbts__feature_override, Result); + + if(OverrideCount > 0) + { + KBTS__FOR(OverrideIndex, 0, (kbts_un)OverrideCount) + { + kbts_feature_override *Override = &Overrides[OverrideIndex]; + kbts__feature_id Id = kbts__FeatureTagToId(Override->Tag); + + if(kbts__FeatureOverrideIsExtra(Override->Tag, Override->Value)) + { + kbts__feature_override *ExtraOverride = &ExtraOverrides[Result->ExtraOverrideCount++]; + + kbts__AddExtraFeatureOverride(Result, ExtraOverride, Override->Tag, Override->Value); + } + + kbts__AddFeature((Override->Value) ? &Result->EnabledFeatures : &Result->DisabledFeatures, Id); + } + + if(Result->ExtraOverrideCount) + { + kbts__feature_override *Last = &ExtraOverrides[Result->ExtraOverrideCount - 1]; + Last->Header.Next = &Result->FeatureOverrideSentinel; + Result->FeatureOverrideSentinel.Prev = &Last->Header; + } + } + } + + return Result; +} + +KBTS_EXPORT kbts_glyph_config *kbts_CreateGlyphConfig(kbts_feature_override *Overrides, int OverrideCount, kbts_allocator_function *Allocator, void *AllocatorData) +{ + if(!Allocator) + { + Allocator = kbts__DefaultAllocator; + } + + kbts_glyph_config *Result = kbts_PlaceGlyphConfig(Overrides, OverrideCount, kbts__AllocatorAllocate(Allocator, AllocatorData, (kbts_un)kbts_SizeOfGlyphConfig(Overrides, OverrideCount))); + + if(Result) + { + Result->Allocator = Allocator; + Result->AllocatorData = AllocatorData; + } + + return Result; +} + +KBTS_EXPORT void kbts_DestroyGlyphConfig(kbts_glyph_config *Config) +{ + if(Config && Config->Allocator) + { + kbts__AllocatorFree(Config->Allocator, Config->AllocatorData, Config); + } +} + +KBTS_EXPORT kbts_shape_error kbts_ShapeError(kbts_shape_context *Context) +{ + kbts_shape_error Result = Context->Error; + return Result; +} + +KBTS_EXPORT void kbts_ShapeBegin(kbts_shape_context *Context, kbts_direction ParagraphDirection, kbts_language Language) +{ + if(!Context->Error) + { + kbts__ClearArena(&Context->ScratchArena); + kbts_ClearActiveGlyphs(&Context->GlyphStorage); + + Context->BreakStartIndex = 0; + Context->CurrentGlyphConfig = 0; + Context->NeedNewGlyphConfig = 1; + + Context->ParagraphDirection = ParagraphDirection; + Context->Language = Language; + Context->UserFeatures = KBTS__ZERO_TYPE(kbts__feature_set); + + Context->InputCodepointCount = 0; + Context->NextUserId = 0; + Context->LastGraphemeBreak = 0; + Context->LastLineBreakIndex = 0; + Context->RunFont = 0; + Context->RunScript = 0; + Context->RunDirection = 0; + Context->ExistingShapeConfigCount = 0; + + kbts_BreakBegin(&Context->BreakState, ParagraphDirection, KBTS_JAPANESE_LINE_BREAK_STYLE_NORMAL, 0); + } +} + +typedef struct kbts__input_codepoint_index +{ + kbts_u32 BlockIndex; + kbts_u32 CodepointIndex; + kbts_u32 BlockCodepointCount; +} kbts__input_codepoint_index; + +static kbts__input_codepoint_index kbts__InputCodepointIndex(kbts_un FlatCodepointIndex) +{ + kbts__input_codepoint_index Result = KBTS__ZERO; + + kbts_un MsbPosition = kbts__MsbPositionOrZero32((kbts_u32)FlatCodepointIndex); + if(MsbPosition <= KBTS__INPUT_CODEPOINT_FIRST_BLOCK_MSB) + { + Result.BlockIndex = 0; + Result.CodepointIndex = (kbts_u32)FlatCodepointIndex; + Result.BlockCodepointCount = 1 << (KBTS__INPUT_CODEPOINT_FIRST_BLOCK_MSB + 1); + } + else + { + Result.BlockIndex = (kbts_u32)(MsbPosition - KBTS__INPUT_CODEPOINT_FIRST_BLOCK_MSB); + Result.CodepointIndex = (kbts_u32)(FlatCodepointIndex & ~(1 << MsbPosition)); + Result.BlockCodepointCount = (kbts_u32)(1 << MsbPosition); + } + + return Result; +} + +static kbts_shape_codepoint *kbts__InputCodepoint(kbts_shape_context *Context, kbts_un Index) +{ + kbts_shape_codepoint *Result = 0; + + if(!Context->Error) + { + kbts__input_codepoint_index InputIndex = kbts__InputCodepointIndex(Index); + + kbts_shape_codepoint *Block = Context->InputBlocks[InputIndex.BlockIndex]; + if(!Block) + { + Block = kbts__PushArray(&Context->PermanentArena, kbts_shape_codepoint, InputIndex.BlockCodepointCount); + if(!Block) + { + Context->Error = KBTS_SHAPE_ERROR_OUT_OF_MEMORY; + return Result; + } + + Context->InputBlocks[InputIndex.BlockIndex] = Block; + } + + Result = &Context->InputBlocks[InputIndex.BlockIndex][InputIndex.CodepointIndex]; + } + + return Result; +} + +static kbts_shape_codepoint_iterator kbts__InputCodepointIterator(kbts_shape_context *Context, kbts_un StartCodepointIndex, kbts_un OnePastLastCodepointIndex) +{ + kbts_shape_codepoint_iterator Result = KBTS__ZERO; + + if(Context && + !Context->Error && + (OnePastLastCodepointIndex > StartCodepointIndex)) + { + kbts__input_codepoint_index StartInputIndex = kbts__InputCodepointIndex(StartCodepointIndex); + kbts__input_codepoint_index OnePastLastInputIndex = kbts__InputCodepointIndex(OnePastLastCodepointIndex); + + Result.Context = Context; + Result.BlockIndex = StartInputIndex.BlockIndex; + Result.CodepointIndex = StartInputIndex.CodepointIndex; + Result.EndBlockIndex = OnePastLastInputIndex.BlockIndex; + Result.OnePastLastCodepointIndex = OnePastLastInputIndex.CodepointIndex; + Result.CurrentBlockCodepointCount = (Result.BlockIndex == Result.EndBlockIndex) ? Result.OnePastLastCodepointIndex : StartInputIndex.BlockCodepointCount; + Result.FlatCodepointIndex = (kbts_u32)StartCodepointIndex; + } + + return Result; +} + +KBTS_EXPORT kbts_shape_codepoint_iterator kbts_ShapeCurrentCodepointsIterator(kbts_shape_context *Context) +{ + kbts_shape_codepoint_iterator Result = kbts__InputCodepointIterator(Context, 0, Context->InputCodepointCount); + + return Result; +} + +static int kbts__NextInputCodepoint(kbts_shape_codepoint_iterator *It, int *CodepointIndex) +{ + int Result = 0; + + if(It->CodepointIndex >= It->CurrentBlockCodepointCount) + { + It->BlockIndex += 1; + It->CodepointIndex = 0; + It->CurrentBlockCodepointCount = (It->BlockIndex == It->EndBlockIndex) ? It->OnePastLastCodepointIndex : (1 << (It->BlockIndex + KBTS__INPUT_CODEPOINT_FIRST_BLOCK_MSB)); + } + + if(It->BlockIndex <= It->EndBlockIndex) + { + if(CodepointIndex) + { + *CodepointIndex = (int)It->FlatCodepointIndex; + } + + It->Codepoint = &It->Context->InputBlocks[It->BlockIndex][It->CodepointIndex++]; + It->FlatCodepointIndex += 1; + + Result = 1; + } + + return Result; +} + +KBTS_EXPORT int kbts_ShapeCodepointIteratorIsValid(kbts_shape_codepoint_iterator *It) +{ + int Result = It->Context && (It->BlockIndex <= It->EndBlockIndex); + return Result; +} + +KBTS_EXPORT int kbts_ShapeCodepointIteratorNext(kbts_shape_codepoint_iterator *It, kbts_shape_codepoint *Codepoint, int *CodepointIndex) +{ + int Result = kbts__NextInputCodepoint(It, CodepointIndex); + + if(Result) + { + *Codepoint = *It->Codepoint; + } + + return Result; +} + +KBTS_EXPORT int kbts_ShapeGetShapeCodepoint(kbts_shape_context *Context, int CodepointIndex, kbts_shape_codepoint *Codepoint) +{ + int Result = 0; + + if((CodepointIndex >= 0) && + ((kbts_un)CodepointIndex < Context->InputCodepointCount)) + { + kbts_shape_codepoint *Source = kbts__InputCodepoint(Context, (kbts_un)CodepointIndex); + *Codepoint = *Source; + + Result = 1; + } + + return Result; +} + +static void kbts__UpdateBreaks(kbts_shape_context *Context) +{ + if(!(Context->Flags & KBTS__CONTEXT_FLAG_MANUAL_SEGMENTATION)) + { + kbts_break Break; + while(kbts_Break(&Context->BreakState, &Break)) + { + // Strictly speaking, we do not need all of the flags, but we record them all anyway so we can expose them to the user. + kbts_un BreakPosition = (kbts_u32)Break.Position + Context->BreakStartIndex; + kbts_shape_codepoint *InputCodepoint = kbts__InputCodepoint(Context, BreakPosition); + + if(Break.Flags & KBTS_BREAK_FLAG_LINE_HARD) + { + Context->LastLineBreakIndex = (kbts_u32)BreakPosition; + } + + if(Break.Flags & KBTS_BREAK_FLAG_GRAPHEME) + { + // Try fonts, potentially break run. + kbts_font *MatchFont = 0; + + for(kbts_un FontIndex = Context->FontCount; + FontIndex; + --FontIndex) + { + kbts_font *Font = Context->Fonts[FontIndex - 1].Font; + kbts_font_coverage_test CoverageTest; + kbts_FontCoverageTestBegin(&CoverageTest, Font); + + kbts_shape_codepoint_iterator It = kbts__InputCodepointIterator(Context, Context->LastGraphemeBreakIndex, BreakPosition); + + while(kbts__NextInputCodepoint(&It, 0)) + { + kbts_shape_codepoint *GraphemeCodepoint = It.Codepoint; + + kbts_FontCoverageTestCodepoint(&CoverageTest, GraphemeCodepoint->Codepoint); + } + + kbts_FontCoverageTestEnd(&CoverageTest); + + if(!CoverageTest.Error) + { + MatchFont = Font; + break; } } + + Context->LastGraphemeBreak->Font = MatchFont; + Context->LastGraphemeBreak = InputCodepoint; + Context->LastGraphemeBreakIndex = (kbts_u32)BreakPosition; } - Result.Langsys[ShapingTableIndex] = ChosenLangsys; + InputCodepoint->BreakFlags |= Break.Flags; + if(Break.Flags & KBTS_BREAK_FLAG_SCRIPT) + { + InputCodepoint->Script = Break.Script; + } + if(Break.Flags & KBTS_BREAK_FLAG_DIRECTION) + { + InputCodepoint->Direction = Break.Direction; + } + if(Break.Flags & KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION) + { + InputCodepoint->ParagraphDirection = Break.ParagraphDirection; + } } } +} - Result.IndicScriptProperties = kbts_IndicScriptProperties(Script); - Result.Shaper = FoundScriptIsIndic3 ? KBTS_SHAPER_USE : ScriptProperties->Shaper; - Result.OpLists[0] = kbts_ShaperOpLists[Result.Shaper]; - - switch(Result.Shaper) +KBTS_EXPORT void kbts_ShapeBeginManualRuns(kbts_shape_context *Context) +{ + if(!Context->Error) { - case KBTS_SHAPER_INDIC: - Result.OpLists[1] = KBTS_OP_LIST(Indic1); - Result.OpLists[2] = KBTS_OP_LIST(Indic2); - Result.OpLists[3] = KBTS_OP_LIST(Indic3); - break; - case KBTS_SHAPER_USE: - Result.OpLists[1] = KBTS_OP_LIST(Use1); - Result.OpLists[3] = KBTS_OP_LIST(Use3); - break; - case KBTS_SHAPER_KHMER: - Result.OpLists[1] = KBTS_OP_LIST(Khmer1); - Result.OpLists[3] = KBTS_OP_LIST(Khmer3); - break; - case KBTS_SHAPER_MYANMAR: - Result.OpLists[1] = KBTS_OP_LIST(Myanmar1); - Result.OpLists[2] = KBTS_OP_LIST(Myanmar2); - Result.OpLists[3] = KBTS_OP_LIST(Myanmar3); - break; - } - - Result.Features = &kbts_ShaperFeatures[Result.Shaper]; - - kbts_feature *Rclt = 0; - kbts_feature_set SyllableFeatureSet = {{KBTS_FEATURE_FLAG0(rphf) | KBTS_FEATURE_FLAG0(blwf) | KBTS_FEATURE_FLAG0(half) | KBTS_FEATURE_FLAG0(pstf) | KBTS_FEATURE_FLAG0(pref), - 0, KBTS_FEATURE_FLAG2(rclt) | KBTS_FEATURE_FLAG2(locl), KBTS_FEATURE_FLAG3(vatu)}}; - kbts_iterate_features IterateFeatures = kbts_IterateFeatures(&Result, KBTS_SHAPING_TABLE_GSUB, SyllableFeatureSet); - while(kbts_NextFeature(&IterateFeatures)) - { - switch(IterateFeatures.CurrentFeatureTag) + if(Context->InputCodepointCount > 0) { - case KBTS_FEATURE_TAG_blwf: Result.Blwf = IterateFeatures.Feature; break; - case KBTS_FEATURE_TAG_pref: Result.Pref = IterateFeatures.Feature; break; - case KBTS_FEATURE_TAG_pstf: Result.Pstf = IterateFeatures.Feature; break; - case KBTS_FEATURE_TAG_locl: Result.Locl = IterateFeatures.Feature; break; - case KBTS_FEATURE_TAG_rphf: Result.Rphf = IterateFeatures.Feature; break; - case KBTS_FEATURE_TAG_half: Result.Half = IterateFeatures.Feature; break; - case KBTS_FEATURE_TAG_vatu: Result.Vatu = IterateFeatures.Feature; break; - case KBTS_FEATURE_TAG_rclt: Rclt = IterateFeatures.Feature; break; + kbts_BreakEnd(&Context->BreakState); + kbts__UpdateBreaks(Context); + } + + Context->Flags |= KBTS__CONTEXT_FLAG_MANUAL_SEGMENTATION; + } +} + +KBTS_EXPORT void kbts_ShapeNextManualRun(kbts_shape_context *Context, kbts_direction Direction, kbts_script Script) +{ + if(!Context->Error && + (Context->Flags & KBTS__CONTEXT_FLAG_MANUAL_SEGMENTATION)) + { + Context->Flags |= KBTS__CONTEXT_FLAG_START_OF_MANUAL_RUN | KBTS__CONTEXT_FLAG_USE_MANUAL_BREAK_INFO; + + Context->ManualRunDirection = Direction; + Context->ManualRunScript = Script; + } +} + +KBTS_EXPORT void kbts_ShapeEndManualRuns(kbts_shape_context *Context) +{ + if(!Context->Error && + (Context->Flags & KBTS__CONTEXT_FLAG_MANUAL_SEGMENTATION)) + { + Context->Flags &= ~KBTS__CONTEXT_FLAG_MANUAL_SEGMENTATION; + + if(Context->InputCodepointCount > 0) + { + kbts_BreakBegin(&Context->BreakState, Context->ParagraphDirection, KBTS_JAPANESE_LINE_BREAK_STYLE_NORMAL, 0); + Context->BreakStartIndex = (kbts_u32)Context->InputCodepointCount; } } +} - if((Result.Shaper == KBTS_SHAPER_ARABIC) && !Rclt) +KBTS_EXPORT void kbts_ShapeManualBreak(kbts_shape_context *Context) +{ + kbts_ShapeBeginManualRuns(Context); + Context->Flags |= KBTS__CONTEXT_FLAG_START_OF_MANUAL_RUN; + kbts_ShapeEndManualRuns(Context); +} + +KBTS_EXPORT void kbts_ShapeCodepointWithUserId(kbts_shape_context *Context, int Codepoint, int UserId) +{ + if(!Context->Error) { - Result.OpLists[0] = KBTS_OP_LIST(ArabicNoRclt); + if(Context->NeedNewGlyphConfig) + { + kbts_glyph_config *Config = kbts__PushType(&Context->ScratchArena, kbts_glyph_config); + if(!Config) + { + Context->Error = KBTS_SHAPE_ERROR_OUT_OF_MEMORY; + return; + } + + *Config = KBTS__ZERO_TYPE(kbts_glyph_config); + KBTS__DLLIST_SENTINEL_INIT(&Config->FeatureOverrideSentinel); + + kbts__feature_set Features = KBTS__ZERO; + for(kbts__feature_override_header *OverrideHeader = Context->FeatureOverrideSentinel.Prev; + OverrideHeader != &Context->FeatureOverrideSentinel; + OverrideHeader = OverrideHeader->Prev) + { + kbts__feature_override *Override = (kbts__feature_override *)OverrideHeader; + kbts__feature_id Id = kbts__FeatureTagToId(Override->Tag); + + if(!Id || !kbts__ContainsFeature(&Features, Id)) + { + if(kbts__FeatureOverrideIsExtra(Override->Tag, Override->Value)) + { + kbts__feature_override *Insert = kbts__PushType(&Context->ScratchArena, kbts__feature_override); + if(!Insert) + { + Context->Error = KBTS_SHAPE_ERROR_OUT_OF_MEMORY; + return; + } + + kbts__AddExtraFeatureOverride(Config, Insert, Override->Tag, Override->Value); + } + + kbts__AddFeature(&Features, Id); + kbts__AddFeature((Override->Value) ? &Config->EnabledFeatures : &Config->DisabledFeatures, Id); + } + } + + Context->CurrentGlyphConfig = Config; + Context->NeedNewGlyphConfig = 0; + } + + { // Add the codepoint. + kbts_un FlatCodepointIndex = Context->InputCodepointCount; + kbts_shape_codepoint InputCodepoint = KBTS__ZERO; + InputCodepoint.Codepoint = Codepoint; + InputCodepoint.UserId = UserId; + InputCodepoint.Config = Context->CurrentGlyphConfig; + + // @Robustness: There is probably a saner way of doing this. + // When we do a manual break, we may have line breaks go out-of-bounds, and we + // do not want to lose that information. + if(FlatCodepointIndex && + (FlatCodepointIndex == Context->LastLineBreakIndex)) + { + InputCodepoint.BreakFlags |= KBTS_BREAK_FLAG_LINE; + } + + if(Context->Flags & KBTS__CONTEXT_FLAG_START_OF_MANUAL_RUN) + { + InputCodepoint.BreakFlags |= KBTS_BREAK_FLAG_MANUAL; + + if(Context->Flags & KBTS__CONTEXT_FLAG_USE_MANUAL_BREAK_INFO) + { + InputCodepoint.Direction = Context->ManualRunDirection; + InputCodepoint.Script = Context->ManualRunScript; + } + + Context->Flags &= ~KBTS__CONTEXT_FLAG_START_OF_MANUAL_RUN; + } + + kbts_shape_codepoint *To = kbts__InputCodepoint(Context, FlatCodepointIndex); + if(To) + { + *To = InputCodepoint; + } + + if(!Context->LastGraphemeBreak) + { + Context->LastGraphemeBreak = To; + } + + Context->InputCodepointCount += 1; + } + + if(!(Context->Flags & KBTS__CONTEXT_FLAG_MANUAL_SEGMENTATION)) + { + // Check for breaks. + kbts_BreakAddCodepoint(&Context->BreakState, Codepoint, 1, 0); + + kbts__UpdateBreaks(Context); + } } - - kbts_shape_state DummyState = KBTS_ZERO; - DummyState.Config = &Result; - - if(Result.IndicScriptProperties.ViramaCodepoint) +} +static void kbts__ShapeCodepoint(kbts_shape_context *Context, int Codepoint, int UserIdIncrement) +{ + int UserId = Context->NextUserId; + Context->NextUserId += UserIdIncrement; + kbts_ShapeCodepointWithUserId(Context, Codepoint, UserId); +} +KBTS_EXPORT void kbts_ShapeCodepoint(kbts_shape_context *Context, int Codepoint) +{ + if(!Context->Error) { - // Bake the locl-ized virama. - kbts_glyph Virama = kbts_CodepointToGlyph(Font, Result.IndicScriptProperties.ViramaCodepoint); - Result.Virama = kbts_Substitute1(&DummyState, kbts_GetLookupList(Gsub), Result.Locl, KBTS_SKIP_FLAG_ZWNJ | KBTS_SKIP_FLAG_ZWJ, &Virama); + kbts__ShapeCodepoint(Context, Codepoint, 1); } +} - if((Result.Script == KBTS_SCRIPT_THAI) || (Result.Script == KBTS_SCRIPT_LAO)) +KBTS_EXPORT void kbts_ShapeUtf32WithUserId(kbts_shape_context *Context, int *Utf32, int Length, int BaseUserId, int UserIdIncrement) +{ + if(!Context->Error && (Length > 0)) { - kbts_u32 NikhahitCodepoint = (Result.Script == KBTS_SCRIPT_THAI) ? 0xE4D : 0xECD; - kbts_u32 SaraAaCodepoint = (Result.Script == KBTS_SCRIPT_THAI) ? 0xE32 : 0xEB2; - Result.Nikhahit = kbts_CodepointToGlyph(Font, NikhahitCodepoint); - Result.SaraAa = kbts_CodepointToGlyph(Font, SaraAaCodepoint); - } + int UserId = BaseUserId; - Result.DottedCircle = kbts_CodepointToGlyph(Font, 0x25CC); - Result.Whitespace = kbts_CodepointToGlyph(Font, ' '); + KBTS__FOR(Utf32Index, 0, (kbts_un)Length) + { + int Codepoint = Utf32[Utf32Index]; + kbts_ShapeCodepointWithUserId(Context, Codepoint, UserId); + + UserId += UserIdIncrement; + } + } +} +KBTS_EXPORT void kbts_ShapeUtf32(kbts_shape_context *Context, int *Utf32, int Length) +{ + if(!Context->Error && (Length > 0)) + { + KBTS__FOR(Utf32Index, 0, (kbts_un)Length) + { + int Codepoint = Utf32[Utf32Index]; + kbts_ShapeCodepoint(Context, Codepoint); + } + } +} + +KBTS_EXPORT void kbts_ShapeUtf8WithUserId(kbts_shape_context *Context, const char *Utf8, int Length, int BaseUserId, kbts_user_id_generation_mode UserIdGenerationMode) +{ + if(!Context->Error && (Length > 0)) + { + const char *At = Utf8; + const char *End = Utf8 + Length; + int UserId = BaseUserId; + + int CodepointIncrement = (UserIdGenerationMode == KBTS_USER_ID_GENERATION_MODE_CODEPOINT_INDEX) ? 1 : 0; + int SourceCharacterMask = (UserIdGenerationMode == KBTS_USER_ID_GENERATION_MODE_SOURCE_INDEX) ? ~0 : 0; + + while(At < End) + { + kbts_decode Decode = kbts_DecodeUtf8(At, (kbts_un)(End - At)); + + if(Decode.Valid) + { + kbts_ShapeCodepointWithUserId(Context, Decode.Codepoint, UserId); + + UserId += CodepointIncrement; + } + + At += Decode.SourceCharactersConsumed; + UserId += Decode.SourceCharactersConsumed & SourceCharacterMask; + } + } +} +KBTS_EXPORT void kbts_ShapeUtf8(kbts_shape_context *Context, const char *Utf8, int Length, kbts_user_id_generation_mode UserIdGenerationMode) +{ + if(!Context->Error && (Length > 0)) + { + const char *At = Utf8; + const char *End = Utf8 + Length; + while(At < End) + { + kbts_decode Decode = kbts_DecodeUtf8(At, (kbts_un)(End - At)); + + if(Decode.Valid) + { + int Increment = 0; + if(UserIdGenerationMode == KBTS_USER_ID_GENERATION_MODE_CODEPOINT_INDEX) + { + Increment = 1; + } + else if(UserIdGenerationMode == KBTS_USER_ID_GENERATION_MODE_SOURCE_INDEX) + { + Increment = Decode.SourceCharactersConsumed; + } + + kbts__ShapeCodepoint(Context, Decode.Codepoint, Increment); + } + + At += Decode.SourceCharactersConsumed; + } + } +} + +KBTS_EXPORT void kbts_ShapePushFeature(kbts_shape_context *Context, kbts_u32 Tag, int Value) +{ + if(!Context->Error) + { + kbts__feature_override *Override; + kbts__feature_override_header *Header = Context->FreeFeatureOverrideSentinel.Prev; + if(Header != &Context->FreeFeatureOverrideSentinel) + { + Override = (kbts__feature_override *)Header; + } + else + { + Override = kbts__PushType(&Context->PermanentArena, kbts__feature_override); + } + + KBTS__DLLIST_INSERT_BEFORE(&Override->Header, &Context->FeatureOverrideSentinel); + Override->Tag = Tag; + Override->Value = Value; + + kbts__feature_id Id = kbts__FeatureTagToId(Tag); + kbts__AddFeature(&Context->UserFeaturesEnabled, Id); + + Context->NeedNewGlyphConfig = 1; + } +} + +KBTS_EXPORT int kbts_ShapePopFeature(kbts_shape_context *Context, kbts_u32 Tag) +{ + int Result = 0; + + if(!Context->Error) + { + for(kbts__feature_override_header *Header = Context->FeatureOverrideSentinel.Prev; + Header != &Context->FeatureOverrideSentinel; + Header = Header->Prev) + { + kbts__feature_override *Override = (kbts__feature_override *)Header; + + if(Override->Tag == Tag) + { + Result = 1; + + KBTS__DLLIST_REMOVE(Header); + KBTS__DLLIST_INSERT_BEFORE(Header, &Context->FreeFeatureOverrideSentinel); + + break; + } + } + + if(Result) + { + Context->NeedNewGlyphConfig = 1; + } + } return Result; } -static kbts_op kbts_ReadOp(kbts_shape_state *State, kbts_u8 *Ops) +static void kbts__ShapeDirect(kbts__shape_scratchpad *Scratchpad, kbts_shape_config *Config, kbts_glyph_storage *Storage) { - kbts_op Result = KBTS_ZERO; - Result.Kind = Ops[State->Ip++]; - - if(Result.Kind == KBTS_OP_KIND_GSUB_FEATURES_WITH_USER) - { - Result.Kind = KBTS_OP_KIND_GSUB_FEATURES; - Result.Features = State->UserFeatures; - } - - if((Result.Kind == KBTS_OP_KIND_GSUB_FEATURES) || (Result.Kind == KBTS_OP_KIND_GPOS_FEATURES)) - { - kbts_un FeatureCount = Ops[State->Ip++]; - int Rtl = (State->RunDirection == KBTS_DIRECTION_RTL); - KBTS_FOR(FeatureIndex, 0, FeatureCount) - { - kbts_u32 FeatureId = Ops[State->Ip++]; - - if((FeatureId == KBTS_FEATURE_ID_ltra) && Rtl) - { - FeatureId = KBTS_FEATURE_ID_rtla; - } - else if((FeatureId == KBTS_FEATURE_ID_ltrm) && Rtl) - { - FeatureId = KBTS_FEATURE_ID_rtlm; - } - - kbts_AddFeature(&Result.Features, FeatureId); - } - } - return Result; -} - -KBTS_EXPORT int kbts_Shape(kbts_shape_state *State, kbts_shape_config *Config, kbts_direction MainDirection, kbts_direction RunDirection, kbts_glyph *Glyphs, kbts_u32 *GlyphCount, kbts_u32 GlyphCapacity) -{ - KBTS_INSTRUMENT_FUNCTION_BEGIN - State->Config = Config; - State->MainDirection = MainDirection; - State->RunDirection = RunDirection; - - kbts_glyph_array *GlyphArray = &State->GlyphArray; - // The Glyphs array might move after a grow, so update the pointers here. - // We preserve Count information, though, because it makes it simpler not to touch anything - // when we are dealing with sub-arrays like Cluster. - GlyphArray->Glyphs = Glyphs; - GlyphArray->Capacity = GlyphCapacity; - kbts_glyph_array *Cluster = &State->ClusterGlyphArray; - Cluster->Glyphs = Glyphs + State->At; - Cluster->Capacity = GlyphCapacity - State->At; - - kbts_u32 ResumePoint = State->ResumePoint; - State->ResumePoint = 0; - switch(ResumePoint) - { - case 1: goto ResumePoint1; break; - case 2: goto ResumePoint2; break; - case 3: goto ResumePoint3; break; - case 4: goto ResumePoint4; break; - case 5: goto ResumePoint5; break; - case 6: goto ResumePoint6; break; - } - - *GlyphArray = kbts_GlyphArray(Glyphs, *GlyphCount, *GlyphCount, GlyphCapacity); + KBTS_INSTRUMENT_BLOCK_BEGIN(ReadOpLoop0); // For simple shapers, all of the shaping happens in this single loop. // For complex shapers, this loop is preparing the text for clustering logic, which happens below. - for(State->Ip = 0; State->Ip < Config->OpLists[0].Length;) + while(kbts__ReadOp(Scratchpad, Config, KBTS__OP_KIND_BEGIN_CLUSTER)) { - State->Op = kbts_ReadOp(State, Config->OpLists[0].Ops); - ResumePoint1:; - if(kbts_ExecuteOp(State, GlyphArray)) + kbts__ExecuteOp(Scratchpad, Config, Storage); + + if(Scratchpad->Error) { - State->ResumePoint = 1; - goto GrowRequest; + return; } } - if(KBTS_IN_SET(Config->Shaper, KBTS_SET32((KBTS_SHAPER_INDIC)(KBTS_SHAPER_USE)(KBTS_SHAPER_KHMER)(KBTS_SHAPER_MYANMAR)))) + KBTS_INSTRUMENT_BLOCK_END(ReadOpLoop0); + + if(Scratchpad->OpKind == KBTS__OP_KIND_BEGIN_CLUSTER) { - State->ClusterAtStartOfWord = 1; - State->At = 0; - while(State->At < GlyphArray->Count) + kbts_u32 BeginClusterIp = Scratchpad->Ip; + kbts_u32 BeginClusterFeatureStagesRead = Scratchpad->FeatureStagesRead; + kbts_glyph *TopLevelGlyph = Storage->GlyphSentinel.Next; + + Scratchpad->ClusterAtStartOfWord = 1; + + while(kbts__GlyphIsValid(Storage, TopLevelGlyph)) { - if(KBTS_IN_SET(Config->Shaper, KBTS_SET32((KBTS_SHAPER_INDIC)(KBTS_SHAPER_KHMER)))) + int WordBreak = 0; + + Scratchpad->Ip = BeginClusterIp; + Scratchpad->FeatureStagesRead = BeginClusterFeatureStagesRead; + { - // Reserve a slot in case we need to insert a dotted circle into a broken syllable. - ResumePoint2:; - if(!kbts_GrowGlyphArray(&State->ResumePoint, GlyphArray, GlyphArray->Count, 1, 2, 1)) + // We need to store this in case TopLevelGlyph is reordered. + kbts_glyph *OneBeforeFirstClusterGlyph = TopLevelGlyph->Prev; + kbts_glyph *OnePastLastClusterGlyph = kbts__BeginCluster(Scratchpad, Config, Storage, TopLevelGlyph); + + if(Scratchpad->Error) { - goto GrowRequest; + return; + } + + WordBreak = !(OnePastLastClusterGlyph->Prev->UnicodeFlags & KBTS_UNICODE_FLAG_PART_OF_WORD); + Scratchpad->Cluster = kbts__PushGlyphList(Storage, OneBeforeFirstClusterGlyph->Next, OnePastLastClusterGlyph->Prev); + } + + while(kbts__ReadOp(Scratchpad, Config, KBTS__OP_KIND_END_CLUSTER)) + { + kbts__ExecuteOp(Scratchpad, Config, Storage); + + if(Scratchpad->Error) + { + return; } } - { - kbts_begin_cluster_result BeginClusterResult = kbts_BeginCluster(State, Glyphs + State->At, GlyphArray->Count - State->At); - GlyphArray->Count += BeginClusterResult.InsertedGlyphCount; - GlyphArray->TotalCount += BeginClusterResult.InsertedGlyphCount; - State->ClusterGlyphCount = (kbts_u32)BeginClusterResult.ClusterGlyphCount; - *Cluster = kbts_GlyphArray(Glyphs + State->At, BeginClusterResult.ClusterGlyphCount, GlyphArray->Count - State->At, GlyphCapacity - State->At); - } + kbts__EndCluster(Scratchpad, Config, Storage); - kbts_glyph *LastGlyphInCluster; LastGlyphInCluster = &Glyphs[State->At + Cluster->Count - 1]; - State->WordBreak = !(LastGlyphInCluster->UnicodeFlags & KBTS_UNICODE_FLAG_PART_OF_WORD); - - for(State->Ip = 0; State->Ip < Config->OpLists[1].Length;) + while(kbts__ReadOp(Scratchpad, Config, KBTS__OP_KIND_END_SYLLABLE)) { - State->Op = kbts_ReadOp(State, Config->OpLists[1].Ops); - ResumePoint3:; - if(kbts_ExecuteOp(State, Cluster)) + kbts__ExecuteOp(Scratchpad, Config, Storage); + + if(Scratchpad->Error) { - State->ResumePoint = 3; - goto GrowRequest; + return; } } - kbts_end_cluster_result EndClusterResult; EndClusterResult = kbts_EndCluster(State, Cluster); - if(EndClusterResult.InsertDottedCircle) - { - State->DottedCircleInsertIndex = (kbts_u32)EndClusterResult.DottedCircleIndex; - ResumePoint6:; - if(!kbts_GrowGlyphArray(&State->ResumePoint, Cluster, State->DottedCircleInsertIndex, 1, 6, 0)) - { - State->RequiredGlyphCapacity = Cluster->RequiredCapacity + State->At; - goto GrowRequest; - } - Glyphs[State->At + State->DottedCircleInsertIndex] = Config->DottedCircle; - } + // Reattach the cluster to the main list. + Storage->GlyphSentinel.Next->Prev = Scratchpad->Cluster.OneBeforeFirst; + Storage->GlyphSentinel.Prev->Next = Scratchpad->Cluster.OnePastLast; + TopLevelGlyph = Scratchpad->Cluster.OnePastLast; - for(State->Ip = 0; State->Ip < Config->OpLists[2].Length;) - { - State->Op = kbts_ReadOp(State, Config->OpLists[2].Ops); - ResumePoint4:; - if(kbts_ExecuteOp(State, Cluster)) - { - State->ResumePoint = 4; - goto GrowRequest; - } - } + kbts__PopGlyphList(Storage, &Scratchpad->Cluster); - State->At += Cluster->Count; - kbts_un DeltaClusterGlyphCount = Cluster->Count - State->ClusterGlyphCount; - GlyphArray->Count += DeltaClusterGlyphCount; - GlyphArray->TotalCount += DeltaClusterGlyphCount; - State->ClusterAtStartOfWord = State->WordBreak; + Scratchpad->ClusterAtStartOfWord = WordBreak; } // Post-clustering ops work across clusters. // This is where Indic GPOS + post-passes happen. - for(State->Ip = 0; State->Ip < Config->OpLists[3].Length;) + while(kbts__ReadOp(Scratchpad, Config, 0)) { - State->Op = kbts_ReadOp(State, Config->OpLists[3].Ops); - ResumePoint5:; - if(kbts_ExecuteOp(State, GlyphArray)) + kbts__ExecuteOp(Scratchpad, Config, Storage); + + if(Scratchpad->Error) { - State->ResumePoint = 5; - goto GrowRequest; + return; } } } - if(0) + KBTS_INSTRUMENT_FUNCTION_END; +} + +KBTS_EXPORT kbts_shape_error kbts_ShapeDirect(kbts_shape_config *Config, kbts_glyph_storage *Storage, kbts_direction RunDirection, kbts_allocator_function *Allocator, void *AllocatorData, kbts_glyph_iterator *Output) +{ + if(!Allocator) { - GrowRequest:; - kbts_TransferGrowRequest(Cluster, GlyphArray); - State->RequiredGlyphCapacity = GlyphArray->RequiredCapacity; - KBTS_INSTRUMENT_END - return 1; + Allocator = kbts__DefaultAllocator; } - *GlyphCount = GlyphArray->Count; - KBTS_INSTRUMENT_END - return 0; -} + kbts_arena Arena = KBTS__ZERO; + Arena.Allocator = Allocator; + Arena.AllocatorData = AllocatorData; -KBTS_EXPORT kbts_cursor kbts_Cursor(kbts_direction Direction) -{ - kbts_cursor Result = KBTS_ZERO; - Result.Direction = Direction; - return Result; -} + kbts__shape_scratchpad *Scratchpad = kbts__PushType(&Arena, kbts__shape_scratchpad); + KBTS_MEMSET(Scratchpad, 0, sizeof(*Scratchpad)); + Scratchpad->Arena = &Arena; + Scratchpad->RunDirection = RunDirection; -KBTS_EXPORT void kbts_PositionGlyph(kbts_cursor *Cursor, kbts_glyph *Glyph, kbts_s32 *X, kbts_s32 *Y) -{ - kbts_s32 AdvanceX = Glyph->AdvanceX; - kbts_s32 AdvanceY = Glyph->AdvanceY; - kbts_s32 OffsetX = Glyph->OffsetX; - kbts_s32 OffsetY = Glyph->OffsetY; - if(Cursor->Direction != KBTS_DIRECTION_RTL) + kbts__ShapeDirect(Scratchpad, Config, Storage); + kbts_shape_error Result = Scratchpad->Error; + + if(!Result) { - *X = Cursor->X + OffsetX; - *Y = Cursor->Y + OffsetY; - - Cursor->X += AdvanceX; - Cursor->Y += AdvanceY; + *Output = kbts_ActiveGlyphIterator(Storage); } else { - // Right-to-left should, in theory, work almost identically to left-to-right: just right-align everything. - // However, the convention for glyph bounding boxes, etc., is that they are left-aligned. - // To compensate for this, we add base glyphs' advances to their positions, which should left-align them. - // We can't accumulate the advances immediately into the cursor, though, because then mark offsets will be wrong. - // - // By the way, Harfbuzz just reverses glyphs to always be left-to-right for the sake of layout. - // The reason we try to handle right-to-left somewhat properly here is that it allows the user to position one - // glyph at a time by just going through the glyph sequence, no matter the text direction. - // This should hopefully save the user from having to allocate a buffer of glyph positions and/or doing a pre-pass - // just to get the total string width, in the case of cross-direction text. - // - // The classic Harfbuzz behavior can be obtained by passing MainDirection = LTR to Shape, even for RTL text. - // (Cursor.Direction also needs to be NONE or LTR, of course, which is the default.) - if(AdvanceX) + *Output = KBTS__ZERO_TYPE(kbts_glyph_iterator); + } + + kbts__FreeArena(&Arena); + + return Result; +} + +KBTS_EXPORT kbts_shape_error kbts_ShapeDirectFixedMemory(kbts_shape_config *Config, kbts_glyph_storage *Storage, kbts_direction RunDirection, void *Memory, int MemorySize, kbts_glyph_iterator *Output) +{ + kbts_shape_error Result = 0; + + if(Config && Storage && !Storage->Error && Memory && (MemorySize > 0)) + { + kbts_arena Arena; + + if(kbts__InitializeFixedMemoryArena(&Arena, Memory, (kbts_un)MemorySize)) { - Cursor->X -= Cursor->LastAdvanceX; - Cursor->LastAdvanceX = AdvanceX; + Result = kbts_ShapeDirect(Config, Storage, RunDirection, kbts__ArenaAllocator, &Arena, Output); } + } - *X = Cursor->X - AdvanceX + OffsetX; - *Y = Cursor->Y + OffsetY; + return Result; +} - Cursor->Y += AdvanceY; +static void kbts__BeginParagraph(kbts_shape_context *Context) +{ + Context->RunFont = 0; + if(Context->FontCount) + { + Context->RunFont = Context->Fonts[Context->FontCount - 1].Font; + } + + Context->RunScript = 0; + Context->RunParagraphDirection = 0; + Context->RunDirection = 0; +} + +KBTS_EXPORT void kbts_ShapeEnd(kbts_shape_context *Context) +{ + if(!Context->Error) + { + // We check the break flags of the one-past-last codepoint, so reset it here. + kbts_shape_codepoint *OnePastLastCodepoint = kbts__InputCodepoint(Context, Context->InputCodepointCount); + *OnePastLastCodepoint = KBTS__ZERO_TYPE(kbts_shape_codepoint); + + kbts_BreakEnd(&Context->BreakState); + kbts__UpdateBreaks(Context); + + Context->RunCodepointIterator.Context = 0; + Context->DoneShapingRuns = 0; + + kbts__BeginParagraph(Context); } } -KBTS_EXPORT kbts_un kbts_ReadFontHeader(kbts_font *Font, void *Data, kbts_un Size) +KBTS_EXPORT int kbts_ShapeRun(kbts_shape_context *Context, kbts_run *Run) { - KBTS_UNUSED(Size); - kbts_un Result = 0; - if(Size >= sizeof(kbts_table_directory)) + int Result = 0; + + if(!Context->Error && + !Context->DoneShapingRuns) { - char *FileEnd = (char *)Data + Size; - Font->FileBase = (char *)Data; - Font->FileSize = Size; - kbts_table_directory *Directory = (kbts_table_directory *)Font->FileBase; + kbts_font *RunFont = Context->RunFont; + kbts_script RunScript = Context->RunScript; + kbts_direction RunParagraphDirection = Context->RunParagraphDirection; + kbts_direction RunDirection = Context->RunDirection; + kbts_language Language = Context->Language; - Directory->TableCount = kbts_ByteSwap16(Directory->TableCount); - Directory->SearchRange = kbts_ByteSwap16(Directory->SearchRange); - Directory->EntrySelector = kbts_ByteSwap16(Directory->EntrySelector); - Directory->RangeShift = kbts_ByteSwap16(Directory->RangeShift); + Run->Flags = 0; - kbts_table_record *Tables = KBTS_POINTER_AFTER(kbts_table_record, Directory); + kbts_ClearActiveGlyphs(&Context->GlyphStorage); - kbts_un ShapingTableSizes[KBTS_SHAPING_TABLE_COUNT] = {0}; - kbts_u32 GdefSize = 0; - kbts_un DirectoryTableCapacity = (FileEnd - (char *)Tables) / sizeof(kbts_table_record); - if(Directory->TableCount <= DirectoryTableCapacity) + int Initialized = 1; + + if(!Context->RunCodepointIterator.Context) { - for(kbts_un TableIndex = 0; TableIndex < Directory->TableCount; ++TableIndex) + Context->RunCodepointIterator = kbts__InputCodepointIterator(Context, 0, Context->InputCodepointCount); + Initialized = 0; + } + + kbts_shape_codepoint_iterator *It = &Context->RunCodepointIterator; + + if(kbts_ShapeCodepointIteratorIsValid(It)) + { + int InputCodepointIndex = 0; + while(kbts__NextInputCodepoint(It, &InputCodepointIndex)) { - kbts_table_record *Table = &Tables[TableIndex]; - Table->Checksum = kbts_ByteSwap32(Table->Checksum); - Table->Offset = kbts_ByteSwap32(Table->Offset); - Table->Length = kbts_ByteSwap32(Table->Length); - int TableValid = 0; + kbts_shape_codepoint *InputCodepoint = It->Codepoint; - void *TableBase = KBTS_POINTER_OFFSET(void, Font->FileBase, Table->Offset); - char *TableEnd = (char *)TableBase + Table->Length; - if(((char *)TableBase >= (char *)(Tables + Directory->TableCount)) && (TableEnd <= FileEnd)) + // Resolve neutral directions. + if((InputCodepoint->BreakFlags & KBTS_BREAK_FLAG_DIRECTION) && + (InputCodepoint->Direction == KBTS_DIRECTION_DONT_KNOW)) { - switch(Table->Tag) + InputCodepoint->Direction = RunParagraphDirection; + } + + int First = !Result; + Result = 1; + + kbts_font *CodepointFont = InputCodepoint->Font; + kbts_script CodepointScript = InputCodepoint->Script; + kbts_direction CodepointDirection = InputCodepoint->Direction; + kbts_direction CodepointParagraphDirection = InputCodepoint->ParagraphDirection; + kbts_break_flags CodepointBreakFlags = InputCodepoint->BreakFlags; + + int NewLine = !First && (CodepointBreakFlags & (KBTS_BREAK_FLAG_LINE_HARD | KBTS_BREAK_FLAG_MANUAL)); + + if(First) + { + Run->Flags = CodepointBreakFlags; + + if(CodepointBreakFlags & KBTS_BREAK_FLAG_LINE_HARD) { - case KBTS_FOURCC('h', 'e', 'a', 'd'): - { - if(Table->Length >= sizeof(kbts_head)) - { - kbts_head *Head = (kbts_head *)TableBase; - kbts_ByteSwapArray16Unchecked(&Head->Major, 2); - kbts_ByteSwapArray32Unchecked(&Head->Revision, 2); - // We do not swap the magic number. - kbts_ByteSwapArray16Unchecked(&Head->Flags, 2); - // We do not swap file times. - kbts_ByteSwapArray16Unchecked((kbts_u16 *)&Head->XMin, 9); + kbts__BeginParagraph(Context); + RunFont = Context->RunFont; + RunScript = 0; + RunDirection = 0; - Font->Head = Head; - TableValid = 1; - } - } break; - - case KBTS_FOURCC('c', 'm', 'a', 'p'): - { - if(Table->Length >= sizeof(kbts_cmap)) - { - kbts_cmap *Cmap = (kbts_cmap *)TableBase; - Cmap->Version = kbts_ByteSwap16(Cmap->Version); - Cmap->TableCount = kbts_ByteSwap16(Cmap->TableCount); - - kbts_encoding_record *Records = KBTS_POINTER_AFTER(kbts_encoding_record, Cmap); - - if((char *)(Records + Cmap->TableCount) <= TableEnd) - { - KBTS_FOR(It, 0, Cmap->TableCount) - { - kbts_encoding_record *Record = &Records[It]; - Record->EncodingId = kbts_ByteSwap16(Record->EncodingId); - Record->PlatformId = kbts_ByteSwap16(Record->PlatformId); - Record->SubtableOffset = kbts_ByteSwap32(Record->SubtableOffset); - } - - kbts_cmap_subtable_pointer PreferredSubtable = KBTS_ZERO; - kbts_u16 PreferredFormat = 1; - KBTS_FOR(It, 0, Cmap->TableCount) - { - kbts_cmap_subtable_pointer Subtable = kbts_GetCmapSubtable(Cmap, It); - if((char *)(Subtable.Subtable + 1) <= TableEnd) - { - kbts_u16 Format = kbts_ByteSwap16(*Subtable.Subtable); - - if(Format == 14) - { - if((char *)(Subtable.Subtable + sizeof(kbts_cmap_14)) <= TableEnd) - { - Font->Cmap14 = (kbts_cmap_14 *)Subtable.Subtable; - } - } - else if(!PreferredSubtable.Subtable) - { - PreferredSubtable = Subtable; - } - else if(Format < KBTS_ARRAY_LENGTH(kbts_CmapFormatPrecedence)) - { - kbts_u16 Precedence = kbts_CmapFormatPrecedence[Format]; - kbts_u16 PreferredPrecedence = kbts_CmapFormatPrecedence[PreferredFormat]; - - if((Precedence > PreferredPrecedence) || ((Precedence == PreferredPrecedence) && (Subtable.PlatformId == 3))) - { - PreferredSubtable = Subtable; - PreferredFormat = Format; - } - } - } - } - - if(PreferredSubtable.Subtable) - { - *PreferredSubtable.Subtable = kbts_ByteSwap16(*PreferredSubtable.Subtable); - switch(*PreferredSubtable.Subtable) - { - case 0: - { - kbts_cmap_0 *Cmap0 = (kbts_cmap_0 *)PreferredSubtable.Subtable; - if((char *)(Cmap0 + 1) <= TableEnd) - { - Cmap0->Length = kbts_ByteSwap16(Cmap0->Length); - Cmap0->Language = kbts_ByteSwap16(Cmap0->Language); - TableValid = 1; - } - } - break; - - case 2: - { - kbts_cmap_2 *Cmap2 = (kbts_cmap_2 *)PreferredSubtable.Subtable; - if(kbts_ByteSwapArray16(&Cmap2->Length, 258, TableEnd)) - { - kbts_un SubHeaderCount = 0; - KBTS_FOR(It, 0, 256) - { - kbts_un SubHeaderIndex = Cmap2->SubHeaderKeys[It]; - SubHeaderCount = KBTS_MAX(SubHeaderCount, SubHeaderIndex + 1); - } - - kbts_sub_header *SubHeaders = KBTS_POINTER_AFTER(kbts_sub_header, Cmap2); - if(kbts_ByteSwapArray16(&SubHeaders->FirstCode, 4 * SubHeaderCount, TableEnd)) - { - kbts_u16 *GlyphIds = (kbts_u16 *)(SubHeaders + SubHeaderCount); - - kbts_sn GlyphIdCount = 0; - KBTS_FOR(It, 0, SubHeaderCount) - { - kbts_sub_header *SubHeader = &SubHeaders[It]; - - kbts_u16 *OnePastLastGlyphId = &SubHeader->IdRangeOffset + SubHeader->IdRangeOffset / 2 + SubHeader->EntryCount; - GlyphIdCount = KBTS_MAX(GlyphIdCount, OnePastLastGlyphId - GlyphIds); - } - - if(kbts_ByteSwapArray16(GlyphIds, (kbts_un)GlyphIdCount, TableEnd)) - { - TableValid = 1; - } - } - } - } - break; - - case 4: - { - kbts_cmap_4 *Cmap4 = (kbts_cmap_4 *)PreferredSubtable.Subtable; - if(kbts_ByteSwapArray16(&Cmap4->Length, 5, TableEnd) && - kbts_ByteSwapArray16(KBTS_POINTER_AFTER(kbts_u16, Cmap4), Cmap4->SegmentCountTimesTwo * 2 + 1, TableEnd)) - { - kbts_un SegmentCount = Cmap4->SegmentCountTimesTwo / 2; - kbts_u16 *EndCodes = KBTS_POINTER_AFTER(kbts_u16, Cmap4); - kbts_u16 *StartCodes = EndCodes + SegmentCount + 1; - kbts_s16 *IdDeltas = (kbts_s16 *)(StartCodes + SegmentCount); - kbts_u16 *IdRangeOffsets = (kbts_u16 *)(IdDeltas + SegmentCount); - kbts_u16 *GlyphIds = IdRangeOffsets + SegmentCount; - - kbts_sn GlyphIdCount = 0; - - KBTS_FOR(SegmentIndex, 0, SegmentCount) - { - kbts_u16 Offset = IdRangeOffsets[SegmentIndex]; - - if(Offset) - { - kbts_u16 *IdLookup = &IdRangeOffsets[SegmentIndex] + (EndCodes[SegmentIndex] - StartCodes[SegmentIndex] + 1) + Offset / 2; - - GlyphIdCount = KBTS_MAX(GlyphIdCount, (IdLookup - GlyphIds)); - } - } - - if(kbts_ByteSwapArray16(GlyphIds, (kbts_un)GlyphIdCount, TableEnd)) - { - TableValid = 1; - } - } - } - break; - - case 6: - { - kbts_cmap_6 *Cmap6 = (kbts_cmap_6 *)PreferredSubtable.Subtable; - if(kbts_ByteSwapArray16(&Cmap6->Length, 4, TableEnd) && - kbts_ByteSwapArray16(KBTS_POINTER_AFTER(kbts_u16, Cmap6), Cmap6->EntryCount, TableEnd)) - { - TableValid = 1; - } - } - break; - - case 12: - { - kbts_cmap_12_13 *Cmap12 = (kbts_cmap_12_13 *)PreferredSubtable.Subtable; - if(kbts_ByteSwapArray32(&Cmap12->Length, 3, TableEnd) && - kbts_ByteSwapArray32(KBTS_POINTER_AFTER(kbts_u32, Cmap12), Cmap12->GroupCount * 3, TableEnd)) - { - TableValid = 1; - } - } - break; - } - - Font->Cmap = PreferredSubtable.Subtable; - } - } - } - } - break; - - case KBTS_FOURCC('G', 'D', 'E', 'F'): - { - kbts_gdef *Gdef = (kbts_gdef *)TableBase; - GdefSize = Table->Length; - - if(kbts_ByteSwapArray16(&Gdef->Major, 6, TableEnd)) - { - if(Gdef->Minor >= 2) - { - if(Table->Length >= 14) - { - Gdef->MarkGlyphSetsDefinitionOffset = kbts_ByteSwap16(Gdef->MarkGlyphSetsDefinitionOffset); - - if(Gdef->Minor == 3) - { - if(Table->Length >= sizeof(kbts_gdef)) - { - // @Incomplete - Gdef->ItemVariationStoreOffset = kbts_ByteSwap32(Gdef->ItemVariationStoreOffset); - TableValid = 1; - } - } - else - { - TableValid = 1; - } - } - } - else - { - TableValid = 1; - } - } - - Font->Gdef = Gdef; - } - break; - - case KBTS_FOURCC('G', 'S', 'U', 'B'): - case KBTS_FOURCC('G', 'P', 'O', 'S'): - { - // We do not do any bounds checking here because Gsub/Gpos tables get byteswapped later on, - // in ByteSwapGsubGposCommon. - kbts_un Index = (Table->Tag == KBTS_FOURCC('G', 'S', 'U', 'B')) ? KBTS_SHAPING_TABLE_GSUB : KBTS_SHAPING_TABLE_GPOS; - Font->ShapingTables[Index] = (kbts_gsub_gpos *)TableBase; - ShapingTableSizes[Index] = Table->Length; - TableValid = 1; - } break; - - case KBTS_FOURCC('h', 'h', 'e', 'a'): - case KBTS_FOURCC('v', 'h', 'e', 'a'): - { - kbts_un Orientation = Table->Tag == KBTS_FOURCC('h', 'h', 'e', 'a') ? KBTS_ORIENTATION_HORIZONTAL : KBTS_ORIENTATION_VERTICAL; - kbts_hea *Hea = (kbts_hea *)TableBase; - if(kbts_ByteSwapArray16((kbts_u16 *)Hea, sizeof(kbts_hea) / sizeof(kbts_u16), TableEnd)) - { - Font->Hea[Orientation] = Hea; - TableValid = 1; - } - } break; - - case KBTS_FOURCC('h', 'm', 't', 'x'): - case KBTS_FOURCC('v', 'm', 't', 'x'): - { - kbts_un Orientation = Table->Tag == KBTS_FOURCC('h', 'm', 't', 'x') ? KBTS_ORIENTATION_HORIZONTAL : KBTS_ORIENTATION_VERTICAL; - kbts_u16 *Mtx = (kbts_u16 *)TableBase; - kbts_ByteSwapArray16Unchecked(Mtx, Table->Length / sizeof(kbts_u16)); - Font->Mtx[Orientation] = Mtx; - TableValid = 1; - } break; - - case KBTS_FOURCC('m', 'a', 'x', 'p'): - { - if(Table->Length >= 6) - { - Font->Maxp = (kbts_maxp *)TableBase; - Font->Maxp->Major = kbts_ByteSwap16(Font->Maxp->Major); - Font->Maxp->Minor = kbts_ByteSwap16(Font->Maxp->Minor); - - kbts_un U16Count = 0; - if(!Font->Maxp->Major && (Font->Maxp->Minor == 0x5000)) - { - U16Count = 1; - } - else if((Font->Maxp->Major == 1) && !Font->Maxp->Minor) - { - U16Count = 14; - } - - if(kbts_ByteSwapArray16(&Font->Maxp->GlyphCount, U16Count, TableEnd)) - { - Font->GlyphCount = Font->Maxp->GlyphCount; - TableValid = 1; - } - } - } break; - - default: - { - TableValid = 1; - } break; + // If we see a bunch of whitespace at the beginning of a paragraph, + // we want to merge with the first actual text that shows up. + Initialized = 0; } } - if(!TableValid) + if((CodepointFont && (CodepointFont != RunFont)) || + (CodepointScript && (CodepointScript != RunScript)) || + (CodepointDirection && (CodepointDirection != RunDirection)) || + (CodepointParagraphDirection && (CodepointParagraphDirection != RunParagraphDirection)) || + NewLine) { - goto Error; + if(CodepointFont) + { + Context->RunFont = CodepointFont; + } + if(CodepointScript) + { + Context->RunScript = CodepointScript; + } + if(CodepointDirection) + { + Context->RunDirection = CodepointDirection; + } + if(CodepointParagraphDirection) + { + Context->RunParagraphDirection = CodepointParagraphDirection; + } + + if(Initialized || NewLine) + { + // Rewind the current codepoint. + // We could also try to peek the codepoint before advancing, but this seems fine. + if(!It->CodepointIndex) + { + It->BlockIndex -= 1; + It->CodepointIndex = (1 << (It->BlockIndex + KBTS__INPUT_CODEPOINT_FIRST_BLOCK_MSB)) - 1; + } + else + { + It->CodepointIndex -= 1; + } + + It->FlatCodepointIndex -= 1; + + goto FoundBreak; + } + else + { + // Initialize and keep matching. + RunFont = Context->RunFont; + RunScript = Context->RunScript; + RunDirection = Context->RunDirection; + RunParagraphDirection = Context->RunParagraphDirection; + + kbts_PushGlyph(&Context->GlyphStorage, RunFont, InputCodepoint->Codepoint, InputCodepoint->Config, InputCodepointIndex); + + Initialized = 1; + } + } + else + { + kbts_PushGlyph(&Context->GlyphStorage, RunFont, InputCodepoint->Codepoint, InputCodepoint->Config, InputCodepointIndex); + } + } + + FoundBreak:; + + if(Result) + { + kbts_shape_config *Config = 0; + KBTS__FOR(ExistingConfigIndex, 0, Context->ExistingShapeConfigCount) + { + kbts__existing_shape_config *Existing = &Context->ExistingShapeConfigs[ExistingConfigIndex]; + + if((Existing->Font == RunFont) && + (Existing->Script == RunScript)) + { + Config = Existing->Config; + + break; + } + } + + if(!Config) + { + Config = kbts_CreateShapeConfig(RunFont, RunScript, Language, kbts__ArenaAllocator, &Context->ScratchArena); + + if(Context->ExistingShapeConfigCount < KBTS__ARRAY_LENGTH(Context->ExistingShapeConfigs)) + { + kbts__existing_shape_config *NewExisting = &Context->ExistingShapeConfigs[Context->ExistingShapeConfigCount++]; + + NewExisting->Config = Config; + NewExisting->Font = RunFont; + NewExisting->Script = RunScript; + } + } + + if(!RunDirection) + { + RunDirection = KBTS_DIRECTION_LTR; + + if((Config->Shaper == KBTS_SHAPER_ARABIC) || + (Config->Shaper == KBTS_SHAPER_HEBREW)) + { + RunDirection = KBTS_DIRECTION_RTL; + } + } + + kbts__shape_scratchpad *Scratchpad = kbts__PushType(&Context->ScratchArena, kbts__shape_scratchpad); + KBTS_MEMSET(Scratchpad, 0, sizeof(*Scratchpad)); + Scratchpad->Arena = &Context->ScratchArena; + Scratchpad->RunDirection = RunDirection; + + kbts__ShapeDirect(Scratchpad, Config, &Context->GlyphStorage); + + if(Scratchpad->Error) + { + Context->Error = Scratchpad->Error; } } } else { - goto Error; + kbts_shape_codepoint *OnePastLast = kbts__InputCodepoint(Context, Context->InputCodepointCount); + + if(OnePastLast->BreakFlags & KBTS_BREAK_FLAG_LINE_HARD) + { + // Signal the terminating line break with a 0-sized run. + Run->Flags = OnePastLast->BreakFlags; + + Result = 1; + } + + Context->DoneShapingRuns = 1; } - if(kbts_FontIsValid(Font)) + if(Result) { - Result = sizeof(kbts_u32) * ((ShapingTableSizes[KBTS_SHAPING_TABLE_GSUB] + ShapingTableSizes[KBTS_SHAPING_TABLE_GPOS] + GdefSize) / 2); + Run->Font = RunFont; + Run->Script = RunScript; + Run->ParagraphDirection = RunParagraphDirection; + Run->Direction = RunDirection; + Run->Glyphs = kbts_ActiveGlyphIterator(&Context->GlyphStorage); } } - else - { - goto Error; - } - if(0) - { - Error:; - Font->Error = 1; - } - - return (kbts_u32)Result; -} - -KBTS_EXPORT kbts_un kbts_ReadFontData(kbts_font *Font, void *Scratch, kbts_un ScratchSize) -{ - kbts_un Result = 0; - if(kbts_FontIsValid(Font)) - { - kbts_byteswap_context ByteSwapContext = KBTS_ZERO; - ByteSwapContext.FileBase = Font->FileBase; - ByteSwapContext.FileEnd = Font->FileBase + Font->FileSize; - ByteSwapContext.PointerCapacity = ScratchSize / sizeof(kbts_u32); - ByteSwapContext.Pointers = (kbts_u32 *)Scratch; - - kbts_un TotalLookupCount = 0; - kbts_un TotalSubtableCount = 0; - - kbts_gdef *Gdef = Font->Gdef; - if(Gdef) - { - if(Gdef->ClassDefinitionOffset) - { - kbts_u16 *ClassDefBase = KBTS_POINTER_OFFSET(kbts_u16, Gdef, Gdef->ClassDefinitionOffset); - kbts_ByteSwapClassDefinition(&ByteSwapContext, ClassDefBase); - } - - if(Gdef->MarkAttachmentClassDefinitionOffset) - { - kbts_u16 *ClassDefBase = KBTS_POINTER_OFFSET(kbts_u16, Gdef, Gdef->MarkAttachmentClassDefinitionOffset); - kbts_ByteSwapClassDefinition(&ByteSwapContext, ClassDefBase); - } - - if((Gdef->Minor >= 2) && Gdef->MarkGlyphSetsDefinitionOffset) - { - kbts_mark_glyph_sets *MarkGlyphSets = KBTS_POINTER_OFFSET(kbts_mark_glyph_sets, Gdef, Gdef->MarkGlyphSetsDefinitionOffset); - kbts_ByteSwapArray16Context(&MarkGlyphSets->Format, 2, &ByteSwapContext); - if(MarkGlyphSets->Format == 1) - { - kbts_u32 *CoverageOffsets = KBTS_POINTER_AFTER(kbts_u32, MarkGlyphSets); - kbts_ByteSwapArray32Context(CoverageOffsets, MarkGlyphSets->MarkGlyphSetCount, &ByteSwapContext); - - KBTS_FOR(MarkGlyphSetIndex, 0, MarkGlyphSets->MarkGlyphSetCount) - { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, MarkGlyphSets, CoverageOffsets[MarkGlyphSetIndex]); - kbts_ByteSwapCoverage(&ByteSwapContext, Coverage); - } - } - } - } - - kbts_gsub_gpos *Gsub = Font->ShapingTables[KBTS_SHAPING_TABLE_GSUB]; - if(Gsub) - { - kbts_ByteSwapGsubGposCommon(&ByteSwapContext, Gsub); - - kbts_lookup_list *LookupList = kbts_GetLookupList(Gsub); - LookupList->Count = kbts_ByteSwap16(LookupList->Count); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, LookupList), LookupList->Count, &ByteSwapContext); - - TotalLookupCount += LookupList->Count; - - KBTS_FOR(LookupIndex, 0, LookupList->Count) - { - kbts_lookup *PackedLookup = kbts_GetLookup(LookupList, LookupIndex); - - KBTS_DUMPF("GSUB Lookup %llu:\n", LookupIndex); - - if(kbts_ByteSwapLookup(&ByteSwapContext, PackedLookup)) - { - kbts_unpacked_lookup Lookup = kbts_UnpackLookup(Font->Gdef, PackedLookup); - KBTS_DUMPF(" Flags %u\n", Lookup.Flags); - - KBTS_FOR(SubstitutionIndex, 0, Lookup.SubtableCount) - { - kbts_u16 *Base = KBTS_POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[SubstitutionIndex]); - - KBTS_DUMPF(" Subtable %llu:\n", SubstitutionIndex); - - kbts_ByteSwapGsubLookupSubtable(&ByteSwapContext, Lookup.Type, Base); - } - } - - TotalSubtableCount += PackedLookup->SubtableCount; - } - } - - kbts_gsub_gpos *Gpos = Font->ShapingTables[KBTS_SHAPING_TABLE_GPOS]; - if(Gpos) - { - kbts_ByteSwapGsubGposCommon(&ByteSwapContext, Gpos); - - kbts_lookup_list *LookupList = kbts_GetLookupList(Gpos); - LookupList->Count = kbts_ByteSwap16(LookupList->Count); - kbts_ByteSwapArray16Context(KBTS_POINTER_AFTER(kbts_u16, LookupList), LookupList->Count, &ByteSwapContext); - - TotalLookupCount += LookupList->Count; - - KBTS_FOR(LookupIndex, 0, LookupList->Count) - { - kbts_lookup *PackedLookup = kbts_GetLookup(LookupList, LookupIndex); - - KBTS_DUMPF("GPOS Lookup %llu:\n", LookupIndex); - - if(kbts_ByteSwapLookup(&ByteSwapContext, PackedLookup)) - { - kbts_unpacked_lookup Lookup = kbts_UnpackLookup(Font->Gdef, PackedLookup); - - KBTS_DUMPF(" Flags %x\n", Lookup.Flags); - - KBTS_FOR(SubstitutionIndex, 0, Lookup.SubtableCount) - { - kbts_u16 *Base = KBTS_POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[SubstitutionIndex]); - - KBTS_DUMPF(" Subtable %llu:\n", (kbts_un)SubstitutionIndex); - - kbts_ByteSwapGposLookupSubtable(&ByteSwapContext, LookupList, Lookup.Type, Base); - } - } - - TotalSubtableCount += PackedLookup->SubtableCount; - } - } - - // At this point, we are done byteswapping the file, so we can start reusing the scratch memory. - - if(Gsub) - { - kbts_lookup_list *LookupList = kbts_GetLookupList(Gsub); - - // Figure out lookup recursion depth and other useful metrics. - // Most of these are not used yet, but would be useful for a streaming shaper and/or to inform GLYPH_BUFFER_GROW_MARGIN. - kbts_un MaximumBacktrackWithoutSkippingGlyphs = 0; - kbts_un MaximumLookaheadWithoutSkippingGlyphs = 0; - kbts_un MaximumLookupStackSize = 1; - kbts_un MaximumSubstitutionOutputSize = 1; - kbts_un MaximumInputSequenceLength = 1; - - // We are done byteswapping the file, so we can reclaim the scratch memory. - kbts_lookup_info_frame *Frames = (kbts_lookup_info_frame *)Scratch; - kbts_un FrameCapacity = ScratchSize / sizeof(kbts_lookup_info_frame); - - KBTS_FOR(RootLookupIndex, 0, LookupList->Count) - { - kbts_lookup *PackedRootLookup = kbts_GetLookup(LookupList, RootLookupIndex); - kbts_unpacked_lookup RootLookup = kbts_UnpackLookup(Gdef, PackedRootLookup); - - KBTS_FOR(RootSubtableIndex, 0, RootLookup.SubtableCount) - { - kbts_un FrameCount = 0; - { - kbts_lookup_info_frame First = KBTS_ZERO; - First.LookupType = RootLookup.Type; - First.Base = KBTS_POINTER_OFFSET(kbts_u16, PackedRootLookup, RootLookup.SubtableOffsets[RootSubtableIndex]); - First.StackSize = 1; - if(FrameCount < FrameCapacity) - { - Frames[FrameCount++] = First; - } - else - { - Font->Error = 1; - goto DoneGatheringLookupInfo; - } - } - - while(FrameCount) - { - kbts_lookup_info_frame Frame = Frames[--FrameCount]; - kbts_u16 LookupType = Frame.LookupType; - kbts_u16 *Base = Frame.Base; - kbts_u32 LookaheadOffset = Frame.LookaheadOffset; - kbts_u32 StackSize = Frame.StackSize; - - MaximumLookupStackSize = KBTS_MAX(MaximumLookupStackSize, StackSize); - - while(LookupType == 7) - { - kbts_extension *Subst = (kbts_extension *)Base; - - Base = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->Offset); - LookupType = Subst->LookupType; - } - - switch(LookupType) - { - case 2: - { - kbts_multiple_substitution *Subst = (kbts_multiple_substitution *)Base; - KBTS_FOR(SequenceIndex, 0, Subst->SequenceCount) - { - kbts_sequence *Sequence = kbts_GetSequence(Subst, SequenceIndex); - - MaximumSubstitutionOutputSize = KBTS_MAX(MaximumSubstitutionOutputSize, Sequence->GlyphCount); - } - } break; - - case 4: - { - kbts_ligature_substitution *Subst = (kbts_ligature_substitution *)Base; - - KBTS_FOR(SetIndex, 0, Subst->LigatureSetCount) - { - kbts_ligature_set *Set = kbts_GetLigatureSet(Subst, SetIndex); - - KBTS_FOR(LigatureIndex, 0, Set->Count) - { - kbts_ligature *Ligature = kbts_GetLigature(Set, LigatureIndex); - - MaximumLookaheadWithoutSkippingGlyphs = KBTS_MAX(MaximumLookaheadWithoutSkippingGlyphs, LookaheadOffset + Ligature->ComponentCount - 1); - } - } - } break; - - case 5: - { - if(Base[0] == 1) - { - kbts_sequence_context_1 *Subst = (kbts_sequence_context_1 *)Base; - - KBTS_FOR(SetIndex, 0, Subst->SeqRuleSetCount) - { - kbts_sequence_rule_set *Set = kbts_GetSequenceRuleSet(Subst, SetIndex); - - KBTS_FOR(RuleIndex, 0, Set->Count) - { - kbts_sequence_rule *Rule = kbts_GetSequenceRule(Set, RuleIndex); - - MaximumLookaheadWithoutSkippingGlyphs = KBTS_MAX(MaximumLookaheadWithoutSkippingGlyphs, LookaheadOffset + Rule->GlyphCount - 1); - MaximumInputSequenceLength = KBTS_MAX(MaximumInputSequenceLength, Rule->GlyphCount); - - kbts_u16 *InputSequence = KBTS_POINTER_AFTER(kbts_u16, Rule); - kbts_sequence_lookup_record *Records = (kbts_sequence_lookup_record *)(InputSequence + Rule->GlyphCount - 1); - KBTS_FOR(RecordIndex, 0, Rule->SequenceLookupCount) - { - kbts_sequence_lookup_record *Record = &Records[RecordIndex]; - if(!kbts_PushLookup(Gdef, Frames, &FrameCount, FrameCapacity, kbts_GetLookup(LookupList, Record->LookupListIndex), LookaheadOffset + Record->SequenceIndex, StackSize + RecordIndex + 1)) - { - Font->Error = 1; - goto DoneGatheringLookupInfo; - } - } - } - } - } - else if(Base[0] == 2) - { - kbts_sequence_context_2 *Subst = (kbts_sequence_context_2 *)Base; - - KBTS_FOR(SetIndex, 0, Subst->ClassSequenceRuleSetCount) - { - kbts_class_sequence_rule_set *Set = kbts_GetClassSequenceRuleSet(Subst, SetIndex); - - if(Set) - { - KBTS_FOR(RuleIndex, 0, Set->Count) - { - kbts_class_sequence_rule *Rule = kbts_GetClassSequenceRule(Set, RuleIndex); - - MaximumLookaheadWithoutSkippingGlyphs = KBTS_MAX(MaximumLookaheadWithoutSkippingGlyphs, LookaheadOffset + Rule->GlyphCount - 1); - MaximumInputSequenceLength = KBTS_MAX(MaximumInputSequenceLength, Rule->GlyphCount); - - kbts_u16 *InputSequence = KBTS_POINTER_AFTER(kbts_u16, Rule); - kbts_sequence_lookup_record *Records = (kbts_sequence_lookup_record *)(InputSequence + Rule->GlyphCount - 1); - - KBTS_FOR(RecordIndex, 0, Rule->SequenceLookupCount) - { - kbts_sequence_lookup_record *Record = &Records[RecordIndex]; - if(!kbts_PushLookup(Gdef, Frames, &FrameCount, FrameCapacity, kbts_GetLookup(LookupList, Record->LookupListIndex), LookaheadOffset + Record->SequenceIndex, StackSize + RecordIndex + 1)) - { - Font->Error = 1; - goto DoneGatheringLookupInfo; - } - } - } - } - } - } - else if(Base[0] == 3) - { - kbts_sequence_context_3 *Subst = (kbts_sequence_context_3 *)Base; - - MaximumLookaheadWithoutSkippingGlyphs = KBTS_MAX(MaximumLookaheadWithoutSkippingGlyphs, LookaheadOffset + Subst->GlyphCount - 1); - MaximumInputSequenceLength = KBTS_MAX(MaximumInputSequenceLength, Subst->GlyphCount); - - kbts_u16 *CoverageOffsets = KBTS_POINTER_AFTER(kbts_u16, Subst); - kbts_sequence_lookup_record *Records = (kbts_sequence_lookup_record *)(CoverageOffsets + Subst->GlyphCount); - - KBTS_FOR(RecordIndex, 0, Subst->SequenceLookupCount) - { - kbts_sequence_lookup_record *Record = &Records[RecordIndex]; - if(!kbts_PushLookup(Gdef, Frames, &FrameCount, FrameCapacity, kbts_GetLookup(LookupList, Record->LookupListIndex), LookaheadOffset + Record->SequenceIndex, StackSize + RecordIndex + 1)) - { - Font->Error = 1; - goto DoneGatheringLookupInfo; - } - } - } - } break; - - case 6: - { - if(Base[0] == 1) - { - kbts_chained_sequence_context_1 *Subst = (kbts_chained_sequence_context_1 *)Base; - - KBTS_FOR(SetIndex, 0, Subst->ChainedSequenceRuleSetCount) - { - kbts_chained_sequence_rule_set *Set = kbts_GetChainedSequenceRuleSet(Subst, SetIndex); - - if(Set) - { - KBTS_FOR(RuleIndex, 0, Set->Count) - { - kbts_chained_sequence_rule *Rule = kbts_GetChainedSequenceRule(Set, RuleIndex); - kbts_unpacked_chained_sequence_rule Unpacked = kbts_UnpackChainedSequenceRule(Rule, 0); - - MaximumBacktrackWithoutSkippingGlyphs = KBTS_MAX(MaximumBacktrackWithoutSkippingGlyphs, Unpacked.BacktrackCount); - MaximumLookaheadWithoutSkippingGlyphs = KBTS_MAX(MaximumLookaheadWithoutSkippingGlyphs, LookaheadOffset + Unpacked.LookaheadCount); - MaximumInputSequenceLength = KBTS_MAX(MaximumInputSequenceLength, Unpacked.InputCount); - - KBTS_FOR(RecordIndex, 0, Unpacked.RecordCount) - { - kbts_sequence_lookup_record *Record = &Unpacked.Records[RecordIndex]; - if(!kbts_PushLookup(Gdef, Frames, &FrameCount, FrameCapacity, kbts_GetLookup(LookupList, Record->LookupListIndex), LookaheadOffset + Record->SequenceIndex, StackSize + RecordIndex + 1)) - { - Font->Error = 1; - goto DoneGatheringLookupInfo; - } - } - } - } - } - } - else if(Base[0] == 2) - { - kbts_chained_sequence_context_2 *Subst = (kbts_chained_sequence_context_2 *)Base; - - KBTS_FOR(SetIndex, 0, Subst->ChainedClassSequenceRuleSetCount) - { - // @Duplication with 6.1. - kbts_chained_sequence_rule_set *Set = kbts_GetChainedClassSequenceRuleSet(Subst, SetIndex); - - if(Set) - { - KBTS_FOR(RuleIndex, 0, Set->Count) - { - kbts_chained_sequence_rule *Rule = kbts_GetChainedSequenceRule(Set, RuleIndex); - kbts_unpacked_chained_sequence_rule Unpacked = kbts_UnpackChainedSequenceRule(Rule, 0); - - MaximumBacktrackWithoutSkippingGlyphs = KBTS_MAX(MaximumBacktrackWithoutSkippingGlyphs, Unpacked.BacktrackCount); - MaximumLookaheadWithoutSkippingGlyphs = KBTS_MAX(MaximumLookaheadWithoutSkippingGlyphs, LookaheadOffset + Unpacked.LookaheadCount); - MaximumInputSequenceLength = KBTS_MAX(MaximumInputSequenceLength, Unpacked.InputCount); - - KBTS_FOR(RecordIndex, 0, Unpacked.RecordCount) - { - kbts_sequence_lookup_record *Record = &Unpacked.Records[RecordIndex]; - if(!kbts_PushLookup(Gdef, Frames, &FrameCount, FrameCapacity, kbts_GetLookup(LookupList, Record->LookupListIndex), LookaheadOffset + Record->SequenceIndex, StackSize + RecordIndex + 1)) - { - Font->Error = 1; - goto DoneGatheringLookupInfo; - } - } - } - } - } - } - else if(Base[0] == 3) - { - kbts_chained_sequence_context_3 *Subst = (kbts_chained_sequence_context_3 *)Base; - kbts_unpacked_chained_sequence_context_3 Unpacked = kbts_UnpackChainedSequenceContext3(Subst, 0); - - MaximumBacktrackWithoutSkippingGlyphs = KBTS_MAX(MaximumBacktrackWithoutSkippingGlyphs, Unpacked.BacktrackCount); - MaximumLookaheadWithoutSkippingGlyphs = KBTS_MAX(MaximumLookaheadWithoutSkippingGlyphs, LookaheadOffset + Unpacked.LookaheadCount); - MaximumInputSequenceLength = KBTS_MAX(MaximumInputSequenceLength, Unpacked.InputCount); - - KBTS_FOR(RecordIndex, 0, Unpacked.RecordCount) - { - kbts_sequence_lookup_record *Record = &Unpacked.Records[RecordIndex]; - if(!kbts_PushLookup(Gdef, Frames, &FrameCount, FrameCapacity, kbts_GetLookup(LookupList, Record->LookupListIndex), LookaheadOffset + Record->SequenceIndex, StackSize + RecordIndex + 1)) - { - Font->Error = 1; - goto DoneGatheringLookupInfo; - } - } - } - } break; - - case 8: - { - kbts_reverse_chain_substitution *Subst = (kbts_reverse_chain_substitution *)Base; - kbts_unpacked_reverse_chain_substitution Unpacked = kbts_UnpackReverseChainSubstitution(Subst, 0); - - MaximumBacktrackWithoutSkippingGlyphs = KBTS_MAX(MaximumBacktrackWithoutSkippingGlyphs, Unpacked.BacktrackCount); - MaximumLookaheadWithoutSkippingGlyphs = KBTS_MAX(MaximumLookaheadWithoutSkippingGlyphs, LookaheadOffset + Unpacked.LookaheadCount); - } break; - } - } - } - } - - DoneGatheringLookupInfo:; - Font->LookupInfo.MaximumBacktrackWithoutSkippingGlyphs = (kbts_u32)MaximumBacktrackWithoutSkippingGlyphs; - Font->LookupInfo.MaximumLookaheadWithoutSkippingGlyphs = (kbts_u32)MaximumLookaheadWithoutSkippingGlyphs; - Font->LookupInfo.MaximumSubstitutionOutputSize = (kbts_u32)MaximumSubstitutionOutputSize; - Font->LookupInfo.MaximumInputSequenceLength = (kbts_u32)MaximumInputSequenceLength; - Font->LookupInfo.MaximumLookupStackSize = (kbts_u32)MaximumLookupStackSize; - } - - Font->LookupCount = (kbts_u32)TotalLookupCount; - Font->SubtableCount = (kbts_u32)TotalSubtableCount; - - kbts_un GlyphLookupMatrixSizeInBytes = ((((TotalLookupCount * Font->GlyphCount) + 7) / 8) + 3) & ~3; - kbts_un GlyphLookupSubtableMatrixSizeInBytes = ((((TotalSubtableCount * Font->GlyphCount) + 7) / 8) + 3) & ~3; - Result = GlyphLookupMatrixSizeInBytes + GlyphLookupSubtableMatrixSizeInBytes + sizeof(kbts_u32) * TotalLookupCount + sizeof(kbts_lookup_subtable_info) * TotalSubtableCount; - - Font->Error |= ByteSwapContext.Error; - } return Result; } -KBTS_EXPORT int kbts_PostReadFontInitialize(kbts_font *Font, void *Memory, kbts_un MemorySize) +KBTS_EXPORT int kbts_GlyphIteratorIsValid(kbts_glyph_iterator *It) { - if(kbts_FontIsValid(Font) && Font->Maxp) + int Result = It->CurrentGlyph && kbts__GlyphIsValid(It->GlyphStorage, It->CurrentGlyph); + return Result; +} + +KBTS_EXPORT int kbts_GlyphIteratorNext(kbts_glyph_iterator *It, kbts_glyph **Glyph) +{ + int Result = 0; + kbts_glyph *CurrentGlyph = It->CurrentGlyph; + + if(kbts_GlyphIteratorIsValid(It)) { - // Bake table filters. - kbts_un GlyphCount = Font->GlyphCount; + *Glyph = CurrentGlyph; - kbts_un GlyphLookupMatrixSizeInBits = Font->LookupCount * GlyphCount; - kbts_un GlyphLookupMatrixSizeInBytes = (GlyphLookupMatrixSizeInBits + 7) / 8; - GlyphLookupMatrixSizeInBytes = (GlyphLookupMatrixSizeInBytes + 3) & ~3; // Align to u32 + Result = 1; + It->CurrentGlyph = CurrentGlyph->Next; + } - kbts_un GlyphLookupSubtableMatrixSizeInBits = Font->SubtableCount * GlyphCount; - kbts_un GlyphLookupSubtableMatrixSizeInBytes = (GlyphLookupSubtableMatrixSizeInBits + 7) / 8; - GlyphLookupSubtableMatrixSizeInBytes = (GlyphLookupSubtableMatrixSizeInBytes + 3) & ~3; // Align to u32 + return Result; +} - KBTS_MEMSET(Memory, 0, MemorySize); +KBTS_EXPORT int kbts_FontCount(void *Data, int Size) +{ + int Result = 0; - kbts_u32 *GlyphLookupMatrix = (kbts_u32 *)Memory; - kbts_u32 *GlyphLookupSubtableMatrix = KBTS_POINTER_OFFSET(kbts_u32, GlyphLookupMatrix, GlyphLookupMatrixSizeInBytes); - kbts_u32 *LookupSubtableIndexOffsets = KBTS_POINTER_OFFSET(kbts_u32, GlyphLookupSubtableMatrix, GlyphLookupSubtableMatrixSizeInBytes); - kbts_lookup_subtable_info *SubtableInfos = KBTS_POINTER_OFFSET(kbts_lookup_subtable_info, LookupSubtableIndexOffsets, sizeof(kbts_u32) * Font->LookupCount); - kbts_un GposLookupIndexOffset = 0; + if(Data && (Size >= 4)) + { + kbts_u32 Magic = *(kbts_u32 *)Data; - kbts_un RunningLookupIndex = 0; - kbts_un RunningSubtableIndex = 0; - - KBTS_FOR(ShapingTableIndex, 0, KBTS_SHAPING_TABLE_COUNT) + if(Magic == KBTS_FOURCC('t', 't', 'c', 'f')) { - kbts_gsub_gpos *ShapingTable = Font->ShapingTables[ShapingTableIndex]; + kbts__ttc_header *Header = (kbts__ttc_header *)Data; - if(ShapingTableIndex == KBTS_SHAPING_TABLE_GPOS) + if(Header->Magic == KBTS_FOURCC('t', 't', 'c', 'f')) { - GposLookupIndexOffset = RunningLookupIndex; + Result = (int)kbts__ByteSwap32(Header->FontCount); } + } + else if((Magic == KBTS_FOURCC('O', 'T', 'T', 'O')) || + (Magic == KBTS__U32BE(0x10000)) || + (Magic == KBTS_FOURCC('k', 'b', 't', 's'))) + { + Result = 1; + } + } - if(ShapingTable) + return Result; +} + +static kbts__cmap_subtable_pointer kbts__SelectCmapSubtable(kbts_blob_header *Header, kbts_blob_table *CmapTable, kbts__cmap_14 **Cmap14, kbts_u16 *ResultFormat) +{ + kbts__cmap_subtable_pointer Result = KBTS__ZERO; + + if(CmapTable->Length >= sizeof(kbts__cmap)) + { + char *TableEnd = KBTS__POINTER_OFFSET(char, Header, CmapTable->OffsetFromStartOfFile + CmapTable->Length); + kbts__cmap *Cmap = KBTS__POINTER_OFFSET(kbts__cmap, Header, CmapTable->OffsetFromStartOfFile); + + kbts_u16 PreferredFormat = 1; + KBTS__FOR(It, 0, Cmap->TableCount) + { + kbts__cmap_subtable_pointer Subtable = kbts__GetCmapSubtable(Cmap, It); + if((char *)(Subtable.Subtable + 1) <= TableEnd) { - kbts_lookup_list *LookupList = kbts_GetLookupList(ShapingTable); - KBTS_FOR(LookupIndex, 0, LookupList->Count) + kbts_u16 Format = *Subtable.Subtable; + + // This is kind of iffy, but the statelessness is useful for selecting + // the cmap from an already-prepared blob without having to deal with + // the byteswap context. + if((Format > 0xFF) && + ((Format >> 8) <= 14)) { - kbts_lookup *PackedLookup = kbts_GetLookup(LookupList, LookupIndex); - kbts_unpacked_lookup Lookup = kbts_UnpackLookup(Font->Gdef, PackedLookup); + Format = kbts__ByteSwap16(Format); + *Subtable.Subtable = Format; + } - LookupSubtableIndexOffsets[RunningLookupIndex] = (kbts_u32)RunningSubtableIndex; - - KBTS_FOR(SubtableIndex, 0, Lookup.SubtableCount) + if(Format == 14) + { + if((char *)(Subtable.Subtable + sizeof(kbts__cmap_14)) <= TableEnd) { - kbts_lookup_subtable_info SubtableInfo = KBTS_ZERO; - kbts_u32 LookupType = Lookup.Type; - kbts_u16 *Base = KBTS_POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[SubtableIndex]); - - while(((ShapingTableIndex == KBTS_SHAPING_TABLE_GSUB) && (LookupType == 7)) || - ((ShapingTableIndex == KBTS_SHAPING_TABLE_GPOS) && (LookupType == 9))) + if(Cmap14) { - kbts_extension *Extension = (kbts_extension *)Base; - LookupType = Extension->LookupType; - Base = KBTS_POINTER_OFFSET(kbts_u16, Extension, Extension->Offset); + *Cmap14 = (kbts__cmap_14 *)Subtable.Subtable; } - - KBTS_FOR(GlyphIndex, 0, GlyphCount) - { - kbts_glyph Glyph = KBTS_ZERO; - Glyph.Id = (kbts_u16)GlyphIndex; - Glyph.Classes = kbts_GlyphClasses(Font, Glyph.Id); - - // @Duplication - kbts_cover_glyph_result Cover = KBTS_ZERO; - Cover.Valid = kbts_GlyphPassesLookupFilter(&Glyph, &Lookup); - if(Cover.Valid && kbts_LookupBeginsWithCoverage((kbts_shaping_table)ShapingTableIndex, Lookup.Type, Base[0])) - { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Base, Base[1]); - Cover = kbts_CoverGlyph(Coverage, Glyph.Id); - } - - // The "primary" slot here refers to the "current glyph" when matching. - // It is the first glyph in the input sequence, not counting backtrack. - // We use the primary slot for per-feature filtering. - int InPrimary = Cover.Valid; - // The secondary slot is anything else: input sequence, lookahead, backtrack, ligature components. - // They are used for subtable filtering. - int InSecondary = 0; - - if((ShapingTableIndex == KBTS_SHAPING_TABLE_GSUB) && (LookupType == 4)) - { - kbts_ligature_substitution *Subst = (kbts_ligature_substitution *)Base; - KBTS_FOR(SetIndex, 0, Subst->LigatureSetCount) - { - kbts_ligature_set *Set = kbts_GetLigatureSet(Subst, SetIndex); - KBTS_FOR(LigatureIndex, 0, Set->Count) - { - kbts_ligature *Ligature = kbts_GetLigature(Set, LigatureIndex); - kbts_u16 *Ids = KBTS_POINTER_AFTER(kbts_u16, Ligature); - - SubtableInfo.MinimumFollowupPlusOne = KBTS_MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Ligature->ComponentCount - 1) + 1; - - KBTS_FOR(IdIndex, 1, Ligature->ComponentCount) - { - kbts_u16 LigatureGlyphId = Ids[IdIndex - 1]; - if(LigatureGlyphId == Glyph.Id) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - } - } - } - else if(((ShapingTableIndex == KBTS_SHAPING_TABLE_GSUB) && (LookupType == 5)) || - ((ShapingTableIndex == KBTS_SHAPING_TABLE_GPOS) && (LookupType == 7))) - { - if(Base[0] == 1) - { - kbts_sequence_context_1 *Subst = (kbts_sequence_context_1 *)Base; - - KBTS_FOR(SetIndex, 0, Subst->SeqRuleSetCount) - { - kbts_sequence_rule_set *Set = kbts_GetSequenceRuleSet(Subst, SetIndex); - - if(Set) - { - KBTS_FOR(RuleIndex, 0, Set->Count) - { - kbts_sequence_rule *Rule = kbts_GetSequenceRule(Set, RuleIndex); - SubtableInfo.MinimumFollowupPlusOne = KBTS_MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Rule->GlyphCount - 1) + 1; - - kbts_u16 *SequenceIds = KBTS_POINTER_AFTER(kbts_u16, Rule); - KBTS_FOR(InputIndex, 1, Rule->GlyphCount) - { - kbts_u16 SequenceId = SequenceIds[InputIndex - 1]; - if(SequenceId == Glyph.Id) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - } - } - } - } - else if(Base[0] == 2) - { - kbts_sequence_context_2 *Subst = (kbts_sequence_context_2 *)Base; - kbts_u16 *ClassDefBase = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->ClassDefOffset); - kbts_glyph_class_from_table_result Class = kbts_GlyphClassFromTable(ClassDefBase, Glyph.Id); - - KBTS_FOR(SetIndex, 0, Subst->ClassSequenceRuleSetCount) - { - kbts_class_sequence_rule_set *Set = kbts_GetClassSequenceRuleSet(Subst, SetIndex); - if(Set) - { - KBTS_FOR(RuleIndex, 0, Set->Count) - { - kbts_class_sequence_rule *Rule = kbts_GetClassSequenceRule(Set, RuleIndex); - kbts_u16 *SequenceClasses = KBTS_POINTER_AFTER(kbts_u16, Rule); - - SubtableInfo.MinimumFollowupPlusOne = KBTS_MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Rule->GlyphCount - 1) + 1; - - KBTS_FOR(SequenceIndex, 1, Rule->GlyphCount) - { - if(SequenceClasses[SequenceIndex - 1] == Class.Class) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - } - } - } - } - else if(Base[0] == 3) - { - kbts_sequence_context_3 *Subst = (kbts_sequence_context_3 *)Base; - kbts_u16 *CoverageOffsets = KBTS_POINTER_AFTER(kbts_u16, Subst); - - SubtableInfo.MinimumFollowupPlusOne = KBTS_MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Subst->GlyphCount - 1) + 1; - - InPrimary = 0; - KBTS_FOR(CoverageIndex, 0, Subst->GlyphCount) - { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Subst, CoverageOffsets[CoverageIndex]); - kbts_cover_glyph_result SequenceCover = kbts_CoverGlyph(Coverage, Glyph.Id); - if(SequenceCover.Valid) - { - if(!CoverageIndex) - { - InPrimary = 1; - } - else - { - InSecondary = 1; - } - goto DoneCheckingForInclusion; - } - } - } - } - else if(((ShapingTableIndex == KBTS_SHAPING_TABLE_GSUB) && (LookupType == 6)) || - ((ShapingTableIndex == KBTS_SHAPING_TABLE_GPOS) && (LookupType == 8))) - { - if(Base[0] == 1) - { - kbts_chained_sequence_context_1 *Subst = (kbts_chained_sequence_context_1 *)Base; - kbts_u16 *ChainedSequenceRuleSetOffsets = KBTS_POINTER_AFTER(kbts_u16, Subst); - - KBTS_FOR(SetIndex, 0, Subst->ChainedSequenceRuleSetCount) - { - kbts_chained_sequence_rule_set *Set = KBTS_POINTER_OFFSET(kbts_chained_sequence_rule_set, Subst, ChainedSequenceRuleSetOffsets[SetIndex]); - KBTS_FOR(RuleIndex, 0, Set->Count) - { - kbts_chained_sequence_rule *Rule = kbts_GetChainedClassSequenceRule(Set, RuleIndex); - kbts_unpacked_chained_sequence_rule Unpacked = kbts_UnpackChainedSequenceRule(Rule, 0); - - SubtableInfo.MinimumBacktrackPlusOne = KBTS_MIN(SubtableInfo.MinimumBacktrackPlusOne - 1, Unpacked.BacktrackCount) + 1; - SubtableInfo.MinimumFollowupPlusOne = KBTS_MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Unpacked.InputCount - 1 + Unpacked.LookaheadCount) + 1; - - KBTS_FOR(BacktrackIndex, 0, Unpacked.BacktrackCount) - { - if(Unpacked.Backtrack[BacktrackIndex] == Glyph.Id) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - KBTS_FOR(InputIndex, 1, Unpacked.InputCount) - { - if(Unpacked.Input[InputIndex - 1] == Glyph.Id) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - KBTS_FOR(LookaheadIndex, 0, Unpacked.LookaheadCount) - { - if(Unpacked.Lookahead[LookaheadIndex] == Glyph.Id) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - } - } - } - else if(Base[0] == 2) - { - kbts_chained_sequence_context_2 *Subst = (kbts_chained_sequence_context_2 *)Base; - kbts_u16 *BacktrackClassDefinition = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->BacktrackClassDefOffset); - kbts_u16 *InputClassDefinition = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->InputClassDefOffset); - kbts_u16 *LookaheadClassDefinition = KBTS_POINTER_OFFSET(kbts_u16, Subst, Subst->LookaheadClassDefOffset); - - kbts_u16 BacktrackClass = kbts_GlyphClassFromTable(BacktrackClassDefinition, Glyph.Id).Class; - kbts_u16 InputClass = kbts_GlyphClassFromTable(InputClassDefinition, Glyph.Id).Class; - kbts_u16 LookaheadClass = kbts_GlyphClassFromTable(LookaheadClassDefinition, Glyph.Id).Class; - - KBTS_FOR(SetIndex, 0, Subst->ChainedClassSequenceRuleSetCount) - { - kbts_chained_sequence_rule_set *Set = kbts_GetChainedClassSequenceRuleSet(Subst, SetIndex); - if(Set) - { - KBTS_FOR(RuleIndex, 0, Set->Count) - { - kbts_chained_sequence_rule *Rule = kbts_GetChainedSequenceRule(Set, RuleIndex); - kbts_unpacked_chained_sequence_rule Unpacked = kbts_UnpackChainedSequenceRule(Rule, 0); - - SubtableInfo.MinimumBacktrackPlusOne = KBTS_MIN(SubtableInfo.MinimumBacktrackPlusOne - 1, Unpacked.BacktrackCount) + 1; - SubtableInfo.MinimumFollowupPlusOne = KBTS_MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Unpacked.InputCount - 1 + Unpacked.LookaheadCount) + 1; - - KBTS_FOR(BacktrackIndex, 0, Unpacked.BacktrackCount) - { - if(Unpacked.Backtrack[BacktrackIndex] == BacktrackClass) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - KBTS_FOR(InputIndex, 1, Unpacked.InputCount) - { - if(Unpacked.Input[InputIndex - 1] == InputClass) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - KBTS_FOR(LookaheadIndex, 0, Unpacked.LookaheadCount) - { - if(Unpacked.Lookahead[LookaheadIndex] == LookaheadClass) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - } - } - } - } - else if(Base[0] == 3) - { - kbts_chained_sequence_context_3 *Subst = (kbts_chained_sequence_context_3 *)Base; - kbts_unpacked_chained_sequence_context_3 Unpacked = kbts_UnpackChainedSequenceContext3(Subst, 0); - - SubtableInfo.MinimumBacktrackPlusOne = KBTS_MIN(SubtableInfo.MinimumBacktrackPlusOne - 1, Unpacked.BacktrackCount) + 1; - SubtableInfo.MinimumFollowupPlusOne = KBTS_MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Unpacked.InputCount - 1 + Unpacked.LookaheadCount) + 1; - - KBTS_FOR(BacktrackCoverageIndex, 0, Unpacked.BacktrackCount) - { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.BacktrackCoverageOffsets[BacktrackCoverageIndex]); - kbts_cover_glyph_result SequenceCover = kbts_CoverGlyph(Coverage, Glyph.Id); - if(SequenceCover.Valid) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - - InPrimary = 0; - KBTS_FOR(InputCoverageIndex, 0, Unpacked.InputCount) - { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.InputCoverageOffsets[InputCoverageIndex]); - kbts_cover_glyph_result SequenceCover = kbts_CoverGlyph(Coverage, Glyph.Id); - if(SequenceCover.Valid) - { - if(!InputCoverageIndex) - { - InPrimary = 1; - } - else - { - InSecondary = 1; - } - goto DoneCheckingForInclusion; - } - } - - KBTS_FOR(LookaheadCoverageIndex, 0, Unpacked.LookaheadCount) - { - kbts_coverage *Coverage = KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.LookaheadCoverageOffsets[LookaheadCoverageIndex]); - kbts_cover_glyph_result SequenceCover = kbts_CoverGlyph(Coverage, Glyph.Id); - if(SequenceCover.Valid) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - } - } - else if((ShapingTableIndex == KBTS_SHAPING_TABLE_GSUB) && (LookupType == 8)) - { - kbts_reverse_chain_substitution *Subst = (kbts_reverse_chain_substitution *)Base; - kbts_unpacked_reverse_chain_substitution Unpacked = kbts_UnpackReverseChainSubstitution(Subst, 0); - - SubtableInfo.MinimumBacktrackPlusOne = KBTS_MIN(SubtableInfo.MinimumBacktrackPlusOne - 1, Unpacked.BacktrackCount) + 1; - SubtableInfo.MinimumFollowupPlusOne = KBTS_MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Unpacked.LookaheadCount) + 1; - - KBTS_FOR(BacktrackIndex, 0, Unpacked.BacktrackCount) - { - kbts_cover_glyph_result BacktrackCover = kbts_CoverGlyph(KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.BacktrackCoverageOffsets[BacktrackIndex]), Glyph.Id); - if(BacktrackCover.Valid) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - KBTS_FOR(LookaheadIndex, 0, Unpacked.LookaheadCount) - { - kbts_cover_glyph_result LookaheadCover = kbts_CoverGlyph(KBTS_POINTER_OFFSET(kbts_coverage, Subst, Unpacked.LookaheadCoverageOffsets[LookaheadIndex]), Glyph.Id); - if(LookaheadCover.Valid) - { - InSecondary = 1; - goto DoneCheckingForInclusion; - } - } - } - DoneCheckingForInclusion:; - - if(InPrimary) - { - kbts_un FlatIndex = RunningLookupIndex * GlyphCount + GlyphIndex; - kbts_un WordIndex = FlatIndex / 32; - kbts_un BitIndex = FlatIndex % 32; - GlyphLookupMatrix[WordIndex] |= (1 << BitIndex); - } - if(InPrimary || InSecondary) - { - kbts_un FlatIndex = RunningSubtableIndex * GlyphCount + GlyphIndex; - kbts_un WordIndex = FlatIndex / 32; - kbts_un BitIndex = FlatIndex % 32; - GlyphLookupSubtableMatrix[WordIndex] |= (1 << BitIndex); - } - } - - SubtableInfos[RunningSubtableIndex] = SubtableInfo; - RunningSubtableIndex += 1; } + } + else if(!Result.Subtable) + { + Result = Subtable; + } + else if(Format < KBTS__ARRAY_LENGTH(kbts__CmapFormatPrecedence)) + { + kbts_u16 Precedence = kbts__CmapFormatPrecedence[Format]; + kbts_u16 PreferredPrecedence = kbts__CmapFormatPrecedence[PreferredFormat]; - RunningLookupIndex += 1; + if((Precedence > PreferredPrecedence) || ((Precedence == PreferredPrecedence) && (Subtable.PlatformId == 3))) + { + Result = Subtable; + if(ResultFormat) + { + *ResultFormat = Format; + } + } + } + } + } + } + + return Result; +} + +KBTS_EXPORT kbts_load_font_error kbts_LoadFont(kbts_font *Font, kbts_load_font_state *State, void *FontData, int FontDataSize, int FontIndex, int *ScratchSize_, int *OutputSize_) +{ + kbts_load_font_error Result = 0; + kbts_un ScratchSize = 0; + kbts_un OutputSize = 0; + + if(FontDataSize >= 4) + { + char *FileEnd = (char *)FontData + FontDataSize; + kbts_u32 Magic = *(kbts_u32 *)FontData; + kbts_un DirectoryOffset = 0; + + if(Magic == KBTS_FOURCC('t', 't', 'c', 'f')) + { + Magic = 0; + + if(FontDataSize >= (int)sizeof(kbts__ttc_header)) + { + kbts__ttc_header *Header = (kbts__ttc_header *)FontData; + kbts_un FontCount = kbts__ByteSwap32(Header->FontCount); + + if(((kbts_u32)FontIndex < FontCount) && + ((kbts_un)FontDataSize >= (sizeof(kbts__ttc_header) + sizeof(kbts_u32) * FontCount))) + { + kbts_u32 *TableDirectoryOffsets = KBTS__POINTER_AFTER(kbts_u32, Header); + DirectoryOffset = kbts__ByteSwap32(TableDirectoryOffsets[FontIndex]); + + Magic = KBTS__U32BE(0x10000); } } } - Font->SubtableInfos = SubtableInfos; - Font->GlyphLookupMatrix = GlyphLookupMatrix; - Font->GlyphLookupSubtableMatrix = GlyphLookupSubtableMatrix; - Font->LookupSubtableIndexOffsets = LookupSubtableIndexOffsets; - Font->GposLookupIndexOffset = (kbts_u32)GposLookupIndexOffset; - Font->GlyphCount = (kbts_u32)GlyphCount; + if((Magic == KBTS_FOURCC('O', 'T', 'T', 'O')) || + (Magic == KBTS__U32BE(0x10000))) + { + Result = KBTS_LOAD_FONT_ERROR_NEED_TO_CREATE_BLOB; + + State->FontData = FontData; + State->FontDataSize = (kbts_u32)FontDataSize; + + kbts__table_directory *Directory = KBTS__POINTER_OFFSET(kbts__table_directory, FontData, DirectoryOffset); + kbts_un DirectoryTableCount = kbts__ByteSwap16(Directory->TableCount); + + kbts__table_record *Tables = KBTS__POINTER_AFTER(kbts__table_record, Directory); + + kbts_un DirectoryTableCapacity = (kbts_un)(FileEnd - (char *)Tables) / sizeof(kbts__table_record); + if(DirectoryTableCount <= DirectoryTableCapacity) + { + for(kbts_un TableIndex = 0; TableIndex < DirectoryTableCount; ++TableIndex) + { + kbts__table_record *Table = &Tables[TableIndex]; + kbts_u32 TableOffset = kbts__ByteSwap32(Table->Offset); + kbts_u32 TableLength = kbts__ByteSwap32(Table->Length); + + void *TableBase = KBTS__POINTER_OFFSET(void, FontData, TableOffset); + char *TableEnd = (char *)TableBase + TableLength; + if(((char *)TableBase >= (char *)(Tables + DirectoryTableCount)) && (TableEnd <= FileEnd)) + { + kbts_blob_table_id TableId = 0; + + switch(Table->Tag) + { + case KBTS_FOURCC('h', 'e', 'a', 'd'): TableId = KBTS_BLOB_TABLE_ID_HEAD; break; + case KBTS_FOURCC('c', 'm', 'a', 'p'): TableId = KBTS_BLOB_TABLE_ID_CMAP; break; + case KBTS_FOURCC('G', 'D', 'E', 'F'): TableId = KBTS_BLOB_TABLE_ID_GDEF; break; + case KBTS_FOURCC('G', 'S', 'U', 'B'): TableId = KBTS_BLOB_TABLE_ID_GSUB; break; + case KBTS_FOURCC('G', 'P', 'O', 'S'): TableId = KBTS_BLOB_TABLE_ID_GPOS; break; + case KBTS_FOURCC('h', 'h', 'e', 'a'): TableId = KBTS_BLOB_TABLE_ID_HHEA; break; + case KBTS_FOURCC('v', 'h', 'e', 'a'): TableId = KBTS_BLOB_TABLE_ID_VHEA; break; + case KBTS_FOURCC('h', 'm', 't', 'x'): TableId = KBTS_BLOB_TABLE_ID_HMTX; break; + case KBTS_FOURCC('v', 'm', 't', 'x'): TableId = KBTS_BLOB_TABLE_ID_VMTX; break; + case KBTS_FOURCC('m', 'a', 'x', 'p'): TableId = KBTS_BLOB_TABLE_ID_MAXP; break; + case KBTS_FOURCC('O', 'S', '/', '2'): TableId = KBTS_BLOB_TABLE_ID_OS2; break; + case KBTS_FOURCC('n', 'a', 'm', 'e'): TableId = KBTS_BLOB_TABLE_ID_NAME; break; + } + + if(TableId) + { + kbts_blob_table *ReadTable = &State->Tables[TableId]; + ReadTable->OffsetFromStartOfFile = TableOffset; + ReadTable->Length = TableLength; + } + } + } + } + + { + kbts_un TotalLookupCount = 0; + kbts_un TotalSubtableCount = 0; + + kbts_blob_table *GsubGposTables[] = {&State->Tables[KBTS_BLOB_TABLE_ID_GSUB], &State->Tables[KBTS_BLOB_TABLE_ID_GPOS]}; + KBTS__FOR(GsubGposTableIndex, 0, KBTS__ARRAY_LENGTH(GsubGposTables)) + { + kbts_blob_table *Table = GsubGposTables[GsubGposTableIndex]; + + if(Table->Length) + { + kbts__gsub_gpos *GsubGpos = KBTS__POINTER_OFFSET(kbts__gsub_gpos, FontData, Table->OffsetFromStartOfFile); + kbts_lookup_list *LookupList = KBTS__POINTER_OFFSET(kbts_lookup_list, GsubGpos, kbts__ByteSwap16(GsubGpos->LookupListOffset)); + kbts_u16 *LookupOffsets = KBTS__POINTER_AFTER(kbts_u16, LookupList); + kbts_un LookupCount = kbts__ByteSwap16(LookupList->Count); + + KBTS__FOR(LookupIndex, 0, LookupCount) + { + kbts__lookup *Lookup = KBTS__POINTER_OFFSET(kbts__lookup, LookupList, kbts__ByteSwap16(LookupOffsets[LookupIndex])); + + TotalSubtableCount += kbts__ByteSwap16(Lookup->SubtableCount); + } + + TotalLookupCount += LookupCount; + } + } + + State->LookupCount = (kbts_u32)TotalLookupCount; + State->LookupSubtableCount = (kbts_u32)TotalSubtableCount; + } + + { + kbts_un GlyphCount = 0; + + kbts_blob_table *MaxpTable = &State->Tables[KBTS_BLOB_TABLE_ID_MAXP]; + if(MaxpTable->Length) + { + kbts__maxp *Maxp = KBTS__POINTER_OFFSET(kbts__maxp, FontData, MaxpTable->OffsetFromStartOfFile); + + GlyphCount = kbts__ByteSwap16(Maxp->GlyphCount); + } + + State->GlyphCount = (kbts_u32)GlyphCount; + } + + ScratchSize = (State->Tables[KBTS_BLOB_TABLE_ID_GSUB].Length + + State->Tables[KBTS_BLOB_TABLE_ID_GPOS].Length + + State->Tables[KBTS_BLOB_TABLE_ID_GDEF].Length) * sizeof(kbts_u32) / 2; + + kbts_un GlyphLookupMatrixSizeInBytes = ((((State->LookupCount * State->GlyphCount) + 7) / 8) + 3) & ~3u; + kbts_un GlyphLookupSubtableMatrixSizeInBytes = ((((State->LookupSubtableCount * State->GlyphCount) + 7) / 8) + 3) & ~3u; + OutputSize = sizeof(kbts_blob_header) + + sizeof(kbts_blob_table) * KBTS_BLOB_TABLE_ID_COUNT + + GlyphLookupMatrixSizeInBytes + + GlyphLookupSubtableMatrixSizeInBytes + + sizeof(kbts_u32) * State->LookupCount + + sizeof(kbts_lookup_subtable_info) * State->LookupSubtableCount; + + KBTS__FOR(TableId, 0, KBTS_BLOB_TABLE_ID_COUNT) + { + OutputSize += State->Tables[TableId].Length; + } + + *ScratchSize_ = (int)ScratchSize; + *OutputSize_ = (int)OutputSize; + + State->ScratchSize = (kbts_u32)ScratchSize; + State->GlyphLookupMatrixSizeInBytes = (kbts_u32)GlyphLookupMatrixSizeInBytes; + State->GlyphLookupSubtableMatrixSizeInBytes = (kbts_u32)GlyphLookupSubtableMatrixSizeInBytes; + State->TotalSize = (kbts_u32)OutputSize; + } + else if(Magic == KBTS_FOURCC('k', 'b', 't', 's')) + { + kbts_blob_header *Header = (kbts_blob_header *)FontData; + + if(Header->Version != KBTS_BLOB_VERSION_CURRENT) + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + + // @Incomplete: Bounds check or something. + + Font->Blob = Header; + kbts__cmap_subtable_pointer PreferredSubtable = kbts__SelectCmapSubtable(Header, &Header->Tables[KBTS_BLOB_TABLE_ID_CMAP], &Font->Cmap14, 0); + Font->Cmap = PreferredSubtable.Subtable; + } } - return kbts_FontIsValid(Font); + return Result; } KBTS_EXPORT int kbts_FontIsValid(kbts_font *Font) @@ -22817,10 +26646,1172 @@ KBTS_EXPORT int kbts_FontIsValid(kbts_font *Font) return Result; } -#ifndef KB_TEXT_SHAPE_NO_CRT -KBTS_EXPORT kbts_font kbts_FontFromFile(const char *FileName) +static void kbts__MarkMatrixCoverage(kbts_u32 *Matrix, kbts_un TableIndex, kbts_un TableCount, kbts_un GlyphCount, kbts__coverage *Coverage, int SubtableMatrix) { - kbts_font Result = KBTS_ZERO; + if(Coverage) + { + if(Coverage->Format == 1) + { + kbts_u16 *GlyphIds = KBTS__POINTER_AFTER(kbts_u16, Coverage); + + KBTS__FOR(GlyphIndex, 0, Coverage->Count) + { + kbts_un GlyphId = GlyphIds[GlyphIndex]; + kbts__matrix_index MatrixIndex = SubtableMatrix ? + kbts__GlyphLookupSubtableMatrixIndex(TableIndex, TableCount, GlyphId) : + kbts__GlyphLookupMatrixIndex(TableIndex, GlyphId, GlyphCount); + + if(GlyphId < GlyphCount) + { + Matrix[MatrixIndex.WordIndex] |= 1 << MatrixIndex.BitIndex; + } + } + } + else if(Coverage->Format == 2) + { + kbts__range_record *Ranges = KBTS__POINTER_AFTER(kbts__range_record, Coverage); + + KBTS__FOR(RangeIndex, 0, Coverage->Count) + { + kbts__range_record *Range = &Ranges[RangeIndex]; + KBTS__FOR(GlyphId, Range->StartGlyphId, (kbts_un)Range->EndGlyphId + 1) + { + kbts__matrix_index MatrixIndex = SubtableMatrix ? + kbts__GlyphLookupSubtableMatrixIndex(TableIndex, TableCount, GlyphId) : + kbts__GlyphLookupMatrixIndex(TableIndex, GlyphId, GlyphCount); + + if(GlyphId < GlyphCount) + { + Matrix[MatrixIndex.WordIndex] |= 1 << MatrixIndex.BitIndex; + } + } + } + } + } +} + +static void kbts__MarkMatrixClassDef(kbts_u32 *Matrix, kbts_un SubtableIndex, kbts_un SubtableCount, kbts_un GlyphCount, kbts_u16 *ClassDefBase, kbts_u64 *ClassesIncluded, kbts_un ClassesIncludedLength) +{ + if(ClassDefBase) + { + if(*ClassDefBase == 1) + { + kbts__class_definition_1 *ClassDef = (kbts__class_definition_1 *)ClassDefBase; + kbts_u16 *GlyphClasses = KBTS__POINTER_AFTER(kbts_u16, ClassDef); + + KBTS__FOR(GlyphIndex, 0, ClassDef->GlyphCount) + { + kbts_un GlyphId = ClassDef->StartGlyphId + GlyphIndex; + kbts_un GlyphClass = GlyphClasses[GlyphIndex]; + + if((GlyphId >= (ClassesIncludedLength * 64)) || + (ClassesIncluded[GlyphClass / 64] & (1ull << (GlyphClass % 64)))) + { + kbts__matrix_index SubtableMatrixIndex = kbts__GlyphLookupSubtableMatrixIndex(SubtableIndex, SubtableCount, GlyphId); + Matrix[SubtableMatrixIndex.WordIndex] |= 1 << SubtableMatrixIndex.BitIndex; + } + } + } + else if(*ClassDefBase == 2) + { + kbts__class_definition_2 *ClassDef = (kbts__class_definition_2 *)ClassDefBase; + kbts__class_range_record *Ranges = KBTS__POINTER_AFTER(kbts__class_range_record, ClassDef); + + KBTS__FOR(RangeIndex, 0, ClassDef->Count) + { + kbts__class_range_record *Range = &Ranges[RangeIndex]; + kbts_un RangeClass = Range->Class; + + if((RangeClass >= (ClassesIncludedLength * 64)) || + (ClassesIncluded[RangeClass / 64] & (1ull << (RangeClass % 64)))) + { + kbts_un OnePastLastGlyphId = Range->EndGlyphId + 1; + if(OnePastLastGlyphId > GlyphCount) + { + OnePastLastGlyphId = GlyphCount; + } + + KBTS__FOR(GlyphId, Range->StartGlyphId, OnePastLastGlyphId) + { + kbts__matrix_index SubtableMatrixIndex = kbts__GlyphLookupSubtableMatrixIndex(SubtableIndex, SubtableCount, GlyphId); + Matrix[SubtableMatrixIndex.WordIndex] |= 1 << SubtableMatrixIndex.BitIndex; + } + } + } + } + } +} + +KBTS_EXPORT kbts_load_font_error kbts_PlaceBlob(kbts_font *Font, kbts_load_font_state *State, void *ScratchMemory, void *OutputMemory) +{ + kbts_load_font_error Result = 0; + + if(!Font) + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + + if(!ScratchMemory || !OutputMemory) + { + Result = KBTS_LOAD_FONT_ERROR_OUT_OF_MEMORY; + } + + if(Result == KBTS_LOAD_FONT_ERROR_NONE) + { + kbts_blob_header *Header = (kbts_blob_header *)OutputMemory; + *Header = KBTS__ZERO_TYPE(kbts_blob_header); + Header->Magic = KBTS_FOURCC('k', 'b', 't', 's'); + Header->Version = 1; + Header->LookupCount = State->LookupCount; + Header->LookupSubtableCount = State->LookupSubtableCount; + + // Stamp packed font data. + char *OutData = KBTS__POINTER_AFTER(char, Header); + KBTS__FOR(TableId, 0, KBTS_BLOB_TABLE_ID_COUNT) + { + kbts_blob_table InTable = State->Tables[TableId]; + kbts_blob_table *OutTable = &Header->Tables[TableId]; + + OutTable->OffsetFromStartOfFile = KBTS__POINTER_DIFF32(OutData, Header); + OutTable->Length = InTable.Length; + + void *InData = KBTS__POINTER_OFFSET(void, State->FontData, InTable.OffsetFromStartOfFile); + KBTS_MEMCPY(OutData, InData, InTable.Length); + + OutData += InTable.Length; + } + + // Byteswap it. + + { + kbts_blob_table *HeadTable = &Header->Tables[KBTS_BLOB_TABLE_ID_HEAD]; + + if(HeadTable->Length) + { + if(HeadTable->Length >= sizeof(kbts__head)) + { + kbts__head *Head = KBTS__POINTER_OFFSET(kbts__head, Header, HeadTable->OffsetFromStartOfFile); + + kbts__ByteSwapArray16Unchecked(&Head->Major, 2); + kbts__ByteSwapArray32Unchecked(&Head->Revision, 2); + // We do not swap the magic number. + kbts__ByteSwapArray16Unchecked(&Head->Flags, 2); + // We do not swap file times. + kbts__ByteSwapArray16Unchecked((kbts_u16 *)&Head->XMin, 9); + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + } + + Font->Blob = Header; + + { + kbts_blob_table *CmapTable = &Header->Tables[KBTS_BLOB_TABLE_ID_CMAP]; + + if(CmapTable->Length) + { + if(CmapTable->Length >= sizeof(kbts__cmap)) + { + int TableValid = 0; + char *TableEnd = KBTS__POINTER_OFFSET(char, Header, CmapTable->OffsetFromStartOfFile + CmapTable->Length); + kbts__cmap *Cmap = KBTS__POINTER_OFFSET(kbts__cmap, Header, CmapTable->OffsetFromStartOfFile); + Cmap->Version = kbts__ByteSwap16(Cmap->Version); + Cmap->TableCount = kbts__ByteSwap16(Cmap->TableCount); + + kbts__encoding_record *Records = KBTS__POINTER_AFTER(kbts__encoding_record, Cmap); + + if((char *)(Records + Cmap->TableCount) <= TableEnd) + { + KBTS__FOR(It, 0, Cmap->TableCount) + { + kbts__encoding_record *Record = &Records[It]; + Record->EncodingId = kbts__ByteSwap16(Record->EncodingId); + Record->PlatformId = kbts__ByteSwap16(Record->PlatformId); + Record->SubtableOffset = kbts__ByteSwap32(Record->SubtableOffset); + } + + kbts_u16 PreferredFormat = 1; + + kbts__cmap_subtable_pointer PreferredSubtable = kbts__SelectCmapSubtable(Header, CmapTable, &Font->Cmap14, &PreferredFormat); + if(PreferredSubtable.Subtable) + { + switch(*PreferredSubtable.Subtable) + { + case 0: + { + kbts__cmap_0 *Cmap0 = (kbts__cmap_0 *)PreferredSubtable.Subtable; + if((char *)(Cmap0 + 1) <= TableEnd) + { + Cmap0->Length = kbts__ByteSwap16(Cmap0->Length); + Cmap0->Language = kbts__ByteSwap16(Cmap0->Language); + TableValid = 1; + } + } + break; + + case 2: + { + kbts__cmap_2 *Cmap2 = (kbts__cmap_2 *)PreferredSubtable.Subtable; + if(kbts__ByteSwapArray16(&Cmap2->Length, 258, TableEnd)) + { + kbts_un SubHeaderCount = 0; + KBTS__FOR(It, 0, 256) + { + kbts_un SubHeaderIndex = Cmap2->SubHeaderKeys[It]; + SubHeaderCount = KBTS__MAX(SubHeaderCount, SubHeaderIndex + 1); + } + + kbts__sub_header *SubHeaders = KBTS__POINTER_AFTER(kbts__sub_header, Cmap2); + if(kbts__ByteSwapArray16(&SubHeaders->FirstCode, 4 * SubHeaderCount, TableEnd)) + { + kbts_u16 *GlyphIds = (kbts_u16 *)(SubHeaders + SubHeaderCount); + + kbts_sn GlyphIdCount = 0; + KBTS__FOR(It, 0, SubHeaderCount) + { + kbts__sub_header *SubHeader = &SubHeaders[It]; + + kbts_u16 *OnePastLastGlyphId = &SubHeader->IdRangeOffset + SubHeader->IdRangeOffset / 2 + SubHeader->EntryCount; + GlyphIdCount = KBTS__MAX(GlyphIdCount, OnePastLastGlyphId - GlyphIds); + } + + if(kbts__ByteSwapArray16(GlyphIds, (kbts_un)GlyphIdCount, TableEnd)) + { + TableValid = 1; + } + } + } + } + break; + + case 4: + { + kbts__cmap_4 *Cmap4 = (kbts__cmap_4 *)PreferredSubtable.Subtable; + if(kbts__ByteSwapArray16(&Cmap4->Length, 5, TableEnd) && + kbts__ByteSwapArray16(KBTS__POINTER_AFTER(kbts_u16, Cmap4), Cmap4->SegmentCountTimesTwo * 2 + 1, TableEnd)) + { + kbts_un SegmentCount = Cmap4->SegmentCountTimesTwo / 2; + kbts_u16 *EndCodes = KBTS__POINTER_AFTER(kbts_u16, Cmap4); + kbts_u16 *StartCodes = EndCodes + SegmentCount + 1; + kbts_s16 *IdDeltas = (kbts_s16 *)(StartCodes + SegmentCount); + kbts_u16 *IdRangeOffsets = (kbts_u16 *)(IdDeltas + SegmentCount); + kbts_u16 *GlyphIds = IdRangeOffsets + SegmentCount; + + kbts_sn GlyphIdCount = 0; + + KBTS__FOR(SegmentIndex, 0, SegmentCount) + { + kbts_u16 Offset = IdRangeOffsets[SegmentIndex]; + + if(Offset) + { + kbts_u16 *IdLookup = &IdRangeOffsets[SegmentIndex] + (EndCodes[SegmentIndex] - StartCodes[SegmentIndex] + 1) + Offset / 2; + + GlyphIdCount = KBTS__MAX(GlyphIdCount, (IdLookup - GlyphIds)); + } + } + + if(kbts__ByteSwapArray16(GlyphIds, (kbts_un)GlyphIdCount, TableEnd)) + { + TableValid = 1; + } + } + } + break; + + case 6: + { + kbts__cmap_6 *Cmap6 = (kbts__cmap_6 *)PreferredSubtable.Subtable; + if(kbts__ByteSwapArray16(&Cmap6->Length, 4, TableEnd) && + kbts__ByteSwapArray16(KBTS__POINTER_AFTER(kbts_u16, Cmap6), Cmap6->EntryCount, TableEnd)) + { + TableValid = 1; + } + } + break; + + case 12: + { + kbts__cmap_12_13 *Cmap12 = (kbts__cmap_12_13 *)PreferredSubtable.Subtable; + if(kbts__ByteSwapArray32(&Cmap12->Length, 3, TableEnd) && + kbts__ByteSwapArray32(KBTS__POINTER_AFTER(kbts_u32, Cmap12), Cmap12->GroupCount * 3, TableEnd)) + { + TableValid = 1; + } + } + break; + } + + Font->Cmap = PreferredSubtable.Subtable; + } + } + + if(!TableValid) + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + } + + { + kbts_blob_table *GdefTable = &Header->Tables[KBTS_BLOB_TABLE_ID_GDEF]; + + if(GdefTable->Length) + { + kbts__gdef *Gdef = KBTS__POINTER_OFFSET(kbts__gdef, Header, GdefTable->OffsetFromStartOfFile); + char *TableEnd = KBTS__POINTER_OFFSET(char, Header, GdefTable->OffsetFromStartOfFile + GdefTable->Length); + + if(kbts__ByteSwapArray16(&Gdef->Major, 6, TableEnd)) + { + if(Gdef->Minor >= 2) + { + if(GdefTable->Length >= 14) + { + Gdef->MarkGlyphSetsDefinitionOffset = kbts__ByteSwap16(Gdef->MarkGlyphSetsDefinitionOffset); + + if(Gdef->Minor == 3) + { + if(GdefTable->Length >= sizeof(kbts__gdef)) + { + // @Incomplete + Gdef->ItemVariationStoreOffset = kbts__ByteSwap32(Gdef->ItemVariationStoreOffset); + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + } + + { + kbts_blob_table_id HeaTableIds[2] = {KBTS_BLOB_TABLE_ID_HHEA, KBTS_BLOB_TABLE_ID_VHEA}; + KBTS__FOR(HeaTableIndex, 0, KBTS__ARRAY_LENGTH(HeaTableIds)) + { + kbts_blob_table *HeaTable = &Header->Tables[HeaTableIds[HeaTableIndex]]; + + if(HeaTable->Length) + { + kbts__hea *Hea = KBTS__POINTER_OFFSET(kbts__hea, Header, HeaTable->OffsetFromStartOfFile); + char *TableEnd = KBTS__POINTER_OFFSET(char, Header, HeaTable->OffsetFromStartOfFile + HeaTable->Length); + + if(!kbts__ByteSwapArray16((kbts_u16 *)Hea, sizeof(kbts__hea) / sizeof(kbts_u16), TableEnd)) + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + } + } + + { + kbts_blob_table_id MtxTableIds[2] = {KBTS_BLOB_TABLE_ID_HMTX, KBTS_BLOB_TABLE_ID_VMTX}; + + KBTS__FOR(MtxTableIndex, 0, KBTS__ARRAY_LENGTH(MtxTableIds)) + { + kbts_blob_table *MtxTable = &Header->Tables[MtxTableIds[MtxTableIndex]]; + + if(MtxTable->Length) + { + kbts_u16 *Mtx = KBTS__POINTER_OFFSET(kbts_u16, Header, MtxTable->OffsetFromStartOfFile); + kbts__ByteSwapArray16Unchecked(Mtx, MtxTable->Length / sizeof(kbts_u16)); + } + } + } + + { + kbts_blob_table *MaxpTable = &Header->Tables[KBTS_BLOB_TABLE_ID_MAXP]; + + if(MaxpTable->Length) + { + if(MaxpTable->Length >= 6) + { + kbts__maxp *Maxp = KBTS__POINTER_OFFSET(kbts__maxp, Header, MaxpTable->OffsetFromStartOfFile); + char *TableEnd = KBTS__POINTER_OFFSET(char, Header, MaxpTable->OffsetFromStartOfFile + MaxpTable->Length); + + Maxp->Major = kbts__ByteSwap16(Maxp->Major); + Maxp->Minor = kbts__ByteSwap16(Maxp->Minor); + + kbts_un U16Count = 0; + if(!Maxp->Major && (Maxp->Minor == 0x5000)) + { + U16Count = 1; + } + else if((Maxp->Major == 1) && !Maxp->Minor) + { + U16Count = 14; + } + + if(kbts__ByteSwapArray16(&Maxp->GlyphCount, U16Count, TableEnd)) + { + Header->GlyphCount = Maxp->GlyphCount; + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + } + + { + kbts_blob_table *Os2Table = &Header->Tables[KBTS_BLOB_TABLE_ID_OS2]; + + if(Os2Table->Length) + { + kbts__os2 *Os2 = KBTS__POINTER_OFFSET(kbts__os2, Header, Os2Table->OffsetFromStartOfFile); + kbts_un Length = Os2Table->Length; + + if(Length >= 68) + { + kbts__ByteSwapArray16Unchecked(&Os2->Version, 16); + kbts__ByteSwapArray32Unchecked(Os2->UnicodeRange, 4); + kbts__ByteSwapArray16Unchecked(&Os2->Selection, 3); + + kbts_un Version = Os2->Version; + + if(Length >= 78) + { + kbts__ByteSwapArray16Unchecked((kbts_u16 *)&Os2->TypoAscender, 5); + + if(Version >= 1) + { + if(Length >= 86) + { + kbts__ByteSwapArray32Unchecked(Os2->CodePageRange, 2); + + if(Version >= 2) + { + if(Length >= 96) + { + kbts__ByteSwapArray16Unchecked((kbts_u16 *)&Os2->Height, 5); + + if(Version >= 5) + { + if(Length >= 100) + { + kbts__ByteSwapArray16Unchecked(&Os2->LowerOpticalPointSize, 2); + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + } + } + else + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + // We should normally set Result to INVALID_FONT if there is no OS/2 table. + // However, one Harfbuzz test has a font with no OS/2 table. + } + + { + kbts_blob_table *NameTable = &Header->Tables[KBTS_BLOB_TABLE_ID_NAME]; + + if(NameTable->Length >= sizeof(kbts__name)) + { + kbts__name *Name = KBTS__POINTER_OFFSET(kbts__name, Header, NameTable->OffsetFromStartOfFile); + char *TableEnd = KBTS__POINTER_OFFSET(char, Name, NameTable->Length); + + kbts__ByteSwapArray16Unchecked(&Name->Version, 3); + + kbts__name_record *NameRecords = KBTS__POINTER_AFTER(kbts__name_record, Name); + + kbts_un U16Count = Name->Count * 6; + if(!kbts__ByteSwapArray16(&NameRecords->PlatformId, U16Count, TableEnd)) + { + Result = KBTS_LOAD_FONT_ERROR_INVALID_FONT; + } + } + // We should normally set Result to INVALID_FONT if there is no name table. + // However, one Harfbuzz test has a font with no name table. + } + + kbts__byteswap_context ByteSwapContext = KBTS__ZERO; + ByteSwapContext.FileBase = (char *)Header; + ByteSwapContext.FileEnd = (char *)Header + State->TotalSize; + ByteSwapContext.PointerCapacity = State->ScratchSize / sizeof(kbts_u32); + ByteSwapContext.Pointers = (kbts_u32 *)ScratchMemory; + + kbts_blob_table *GdefTable = &Header->Tables[KBTS_BLOB_TABLE_ID_GDEF]; + if(GdefTable->Length) + { + kbts__gdef *Gdef = KBTS__POINTER_OFFSET(kbts__gdef, Header, GdefTable->OffsetFromStartOfFile); + + if(Gdef->ClassDefinitionOffset) + { + kbts_u16 *ClassDefBase = KBTS__POINTER_OFFSET(kbts_u16, Gdef, Gdef->ClassDefinitionOffset); + kbts__ByteSwapClassDefinition(&ByteSwapContext, ClassDefBase); + } + + if(Gdef->MarkAttachmentClassDefinitionOffset) + { + kbts_u16 *ClassDefBase = KBTS__POINTER_OFFSET(kbts_u16, Gdef, Gdef->MarkAttachmentClassDefinitionOffset); + kbts__ByteSwapClassDefinition(&ByteSwapContext, ClassDefBase); + } + + if((Gdef->Minor >= 2) && Gdef->MarkGlyphSetsDefinitionOffset) + { + kbts__mark_glyph_sets *MarkGlyphSets = KBTS__POINTER_OFFSET(kbts__mark_glyph_sets, Gdef, Gdef->MarkGlyphSetsDefinitionOffset); + kbts__ByteSwapArray16Context(&MarkGlyphSets->Format, 2, &ByteSwapContext); + if(MarkGlyphSets->Format == 1) + { + kbts_u32 *CoverageOffsets = KBTS__POINTER_AFTER(kbts_u32, MarkGlyphSets); + kbts__ByteSwapArray32Context(CoverageOffsets, MarkGlyphSets->MarkGlyphSetCount, &ByteSwapContext); + + KBTS__FOR(MarkGlyphSetIndex, 0, MarkGlyphSets->MarkGlyphSetCount) + { + kbts__coverage *Coverage = KBTS__POINTER_OFFSET(kbts__coverage, MarkGlyphSets, CoverageOffsets[MarkGlyphSetIndex]); + kbts__ByteSwapCoverage(&ByteSwapContext, Coverage); + } + } + } + } + + kbts__gsub_gpos *Gsub = kbts__BlobTableDataType(Header, KBTS_BLOB_TABLE_ID_GSUB, kbts__gsub_gpos); + kbts__gsub_gpos *Gpos = kbts__BlobTableDataType(Header, KBTS_BLOB_TABLE_ID_GPOS, kbts__gsub_gpos); + kbts__gdef *Gdef = kbts__BlobTableDataType(Header, KBTS_BLOB_TABLE_ID_GDEF, kbts__gdef); + + if(Gsub) + { + kbts__ByteSwapGsubGposCommon(&ByteSwapContext, Gsub); + + kbts_lookup_list *LookupList = kbts__GetLookupList(Gsub); + LookupList->Count = kbts__ByteSwap16(LookupList->Count); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, LookupList), LookupList->Count, &ByteSwapContext); + + KBTS__FOR(LookupIndex, 0, LookupList->Count) + { + kbts__lookup *PackedLookup = kbts__GetLookup(LookupList, LookupIndex); + + KBTS_DUMPF("GSUB Lookup %llu:\n", LookupIndex); + + if(kbts__ByteSwapLookup(&ByteSwapContext, PackedLookup)) + { + kbts__unpacked_lookup Lookup = kbts__UnpackLookup(Gdef, PackedLookup); + KBTS_DUMPF(" Flags %u\n", Lookup.Flags); + + KBTS__FOR(SubstitutionIndex, 0, Lookup.SubtableCount) + { + kbts_u16 *Base = KBTS__POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[SubstitutionIndex]); + + KBTS_DUMPF(" Subtable %llu:\n", SubstitutionIndex); + + kbts__ByteSwapGsubLookupSubtable(&ByteSwapContext, Lookup.Type, Base); + } + } + } + } + + if(Gpos) + { + kbts__ByteSwapGsubGposCommon(&ByteSwapContext, Gpos); + + kbts_lookup_list *LookupList = kbts__GetLookupList(Gpos); + LookupList->Count = kbts__ByteSwap16(LookupList->Count); + kbts__ByteSwapArray16Context(KBTS__POINTER_AFTER(kbts_u16, LookupList), LookupList->Count, &ByteSwapContext); + + KBTS__FOR(LookupIndex, 0, LookupList->Count) + { + kbts__lookup *PackedLookup = kbts__GetLookup(LookupList, LookupIndex); + + KBTS_DUMPF("GPOS Lookup %llu:\n", LookupIndex); + + if(kbts__ByteSwapLookup(&ByteSwapContext, PackedLookup)) + { + kbts__unpacked_lookup Lookup = kbts__UnpackLookup(Gdef, PackedLookup); + + KBTS_DUMPF(" Flags %x\n", Lookup.Flags); + + KBTS__FOR(SubstitutionIndex, 0, Lookup.SubtableCount) + { + kbts_u16 *Base = KBTS__POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[SubstitutionIndex]); + + KBTS_DUMPF(" Subtable %llu:\n", (kbts_un)SubstitutionIndex); + + kbts__ByteSwapGposLookupSubtable(&ByteSwapContext, LookupList, Lookup.Type, Base); + } + } + } + } + + // At this point, we are done byteswapping the file, so we can start reusing scratch memory. + + // Bake our own data. + + if(!Result && Header->Tables[KBTS_BLOB_TABLE_ID_MAXP].Length) + { + kbts_un GlyphCount = Header->GlyphCount; + kbts_un LookupCount = Header->LookupCount; + kbts_un SubtableCount = Header->LookupSubtableCount; + + kbts_u32 *GlyphLookupMatrix = (kbts_u32 *)OutData; + kbts_u32 *GlyphLookupSubtableMatrix = KBTS__POINTER_OFFSET(kbts_u32, GlyphLookupMatrix, State->GlyphLookupMatrixSizeInBytes); + kbts_u32 *LookupSubtableIndexOffsets = KBTS__POINTER_OFFSET(kbts_u32, GlyphLookupSubtableMatrix, State->GlyphLookupSubtableMatrixSizeInBytes); + kbts_lookup_subtable_info *SubtableInfos = KBTS__POINTER_OFFSET(kbts_lookup_subtable_info, LookupSubtableIndexOffsets, sizeof(kbts_u32) * Header->LookupCount); + + KBTS_MEMSET(GlyphLookupMatrix, 0, State->GlyphLookupMatrixSizeInBytes + + State->GlyphLookupSubtableMatrixSizeInBytes + + sizeof(kbts_u32) * Header->LookupCount + + sizeof(kbts_lookup_subtable_info) * Header->LookupSubtableCount); + + kbts_un GposLookupIndexOffset = 0; + kbts_un RunningLookupIndex = 0; + kbts_un RunningSubtableIndex = 0; + + kbts_blob_table_id TableIds[2] = {KBTS_BLOB_TABLE_ID_GSUB, KBTS_BLOB_TABLE_ID_GPOS}; + KBTS__FOR(TableIdIndex, 0, KBTS__ARRAY_LENGTH(TableIds)) + { + kbts_blob_table_id TableId = TableIds[TableIdIndex]; + kbts_blob_table *Table = &Header->Tables[TableId]; + + if(Table->Length) + { + kbts__gsub_gpos *ShapingTable = KBTS__POINTER_OFFSET(kbts__gsub_gpos, Header, Table->OffsetFromStartOfFile); + int InGpos = (TableId == KBTS_BLOB_TABLE_ID_GPOS); + kbts_shaping_table ShapingTableId = (kbts_shaping_table)(InGpos ? KBTS_SHAPING_TABLE_GPOS : KBTS_SHAPING_TABLE_GSUB); + + if(InGpos) + { + GposLookupIndexOffset = RunningLookupIndex; + } + + if(ShapingTable) + { + kbts_lookup_list *LookupList = kbts__GetLookupList(ShapingTable); + KBTS__FOR(LookupIndex, 0, LookupList->Count) + { + kbts__lookup *PackedLookup = kbts__GetLookup(LookupList, LookupIndex); + kbts__unpacked_lookup Lookup = kbts__UnpackLookup(Gdef, PackedLookup); + + LookupSubtableIndexOffsets[RunningLookupIndex] = (kbts_u32)RunningSubtableIndex; + + KBTS__FOR(SubtableIndex, 0, Lookup.SubtableCount) + { + kbts_lookup_subtable_info SubtableInfo = KBTS__ZERO; + kbts_u16 LookupType = Lookup.Type; + kbts_u16 *Base = KBTS__POINTER_OFFSET(kbts_u16, PackedLookup, Lookup.SubtableOffsets[SubtableIndex]); + + while((!InGpos && (LookupType == 7)) || + (InGpos && (LookupType == 9))) + { + kbts__extension *Extension = (kbts__extension *)Base; + + // CAREFUL: Here, we remap LookupType only. + // Do not use Lookup.Type beyond this point! + LookupType = Extension->LookupType; + Base = KBTS__POINTER_OFFSET(kbts_u16, Extension, Extension->Offset); + } + + kbts__coverage *Coverage = 0; + + if(kbts__LookupBeginsWithCoverage(ShapingTableId, LookupType, Base[0])) + { + Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Base, Base[1]); + } + + if(!InGpos && (LookupType == 4)) + { + kbts__ligature_substitution *Subst = (kbts__ligature_substitution *)Base; + KBTS__FOR(SetIndex, 0, Subst->LigatureSetCount) + { + kbts__ligature_set *Set = kbts__GetLigatureSet(Subst, SetIndex); + KBTS__FOR(LigatureIndex, 0, Set->Count) + { + kbts__ligature *Ligature = kbts__GetLigature(Set, LigatureIndex); + kbts_u16 *Ids = KBTS__POINTER_AFTER(kbts_u16, Ligature); + + KBTS__FOR(IdIndex, 1, Ligature->ComponentCount) + { + kbts_un GlyphId = Ids[IdIndex - 1]; + + kbts__matrix_index SubtableMatrixIndex = kbts__GlyphLookupSubtableMatrixIndex(RunningSubtableIndex, SubtableCount, GlyphId); + GlyphLookupSubtableMatrix[SubtableMatrixIndex.WordIndex] |= 1 << SubtableMatrixIndex.BitIndex; + } + + SubtableInfo.MinimumFollowupPlusOne = KBTS__MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Ligature->ComponentCount - 1) + 1; + } + } + } + else if((!InGpos && (LookupType == 5)) || + (InGpos && (LookupType == 7))) + { + switch(Base[0]) + { + case 1: + { + kbts__sequence_context_1 *Subst = (kbts__sequence_context_1 *)Base; + KBTS__FOR(SetIndex, 0, Subst->SeqRuleSetCount) + { + kbts__sequence_rule_set *Set = kbts__GetSequenceRuleSet(Subst, SetIndex); + + if(Set) + { + KBTS__FOR(RuleIndex, 0, Set->Count) + { + kbts__sequence_rule *Rule = kbts__GetSequenceRule(Set, RuleIndex); + SubtableInfo.MinimumFollowupPlusOne = KBTS__MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Rule->GlyphCount - 1) + 1; + + kbts_u16 *SequenceGlyphIds = KBTS__POINTER_AFTER(kbts_u16, Rule); + KBTS__FOR(InputIndex, 1, Rule->GlyphCount) + { + kbts_un GlyphId = SequenceGlyphIds[InputIndex - 1]; + + kbts__matrix_index SubtableMatrixIndex = kbts__GlyphLookupSubtableMatrixIndex(RunningSubtableIndex, SubtableCount, GlyphId); + GlyphLookupSubtableMatrix[SubtableMatrixIndex.WordIndex] |= 1 << SubtableMatrixIndex.BitIndex; + } + } + } + } + } break; + + case 2: + { + kbts__sequence_context_2 *Subst = (kbts__sequence_context_2 *)Base; + kbts_u16 *ClassDefBase = KBTS__POINTER_OFFSET(kbts_u16, Subst, Subst->ClassDefOffset); + + kbts_u64 ClassesIncluded[16] = KBTS__ZERO; + + KBTS__FOR(SetIndex, 0, Subst->ClassSequenceRuleSetCount) + { + kbts__class_sequence_rule_set *Set = kbts__GetClassSequenceRuleSet(Subst, SetIndex); + if(Set) + { + KBTS__FOR(RuleIndex, 0, Set->Count) + { + kbts__class_sequence_rule *Rule = kbts__GetClassSequenceRule(Set, RuleIndex); + kbts_u16 *SequenceClasses = KBTS__POINTER_AFTER(kbts_u16, Rule); + + SubtableInfo.MinimumFollowupPlusOne = KBTS__MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Rule->GlyphCount - 1) + 1; + + KBTS__FOR(SequenceIndex, 1, Rule->GlyphCount) + { + kbts_un Class = SequenceClasses[SequenceIndex - 1]; + + if(Class < (KBTS__ARRAY_LENGTH(ClassesIncluded) * 64)) + { + ClassesIncluded[Class / 64] |= 1ull << (Class % 64); + } + } + } + } + } + + kbts__MarkMatrixClassDef(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, ClassDefBase, ClassesIncluded, KBTS__ARRAY_LENGTH(ClassesIncluded)); + } break; + + case 3: + { + kbts__sequence_context_3 *Subst = (kbts__sequence_context_3 *)Base; + kbts_u16 *CoverageOffsets = KBTS__POINTER_AFTER(kbts_u16, Subst); + + SubtableInfo.MinimumFollowupPlusOne = KBTS__MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Subst->GlyphCount - 1) + 1; + + KBTS__FOR(CoverageIndex, 1, Subst->GlyphCount) + { + kbts__coverage *SubstCoverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, CoverageOffsets[CoverageIndex]); + + kbts__MarkMatrixCoverage(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, SubstCoverage, 1); + } + + Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, CoverageOffsets[0]); + } break; + } + } + else if((!InGpos && (LookupType == 6)) || + (InGpos && (LookupType == 8))) + { + switch(Base[0]) + { + case 1: + { + kbts__chained_sequence_context_1 *Subst = (kbts__chained_sequence_context_1 *)Base; + kbts_u16 *ChainedSequenceRuleSetOffsets = KBTS__POINTER_AFTER(kbts_u16, Subst); + + KBTS__FOR(SetIndex, 0, Subst->ChainedSequenceRuleSetCount) + { + kbts__chained_sequence_rule_set *Set = KBTS__POINTER_OFFSET(kbts__chained_sequence_rule_set, Subst, ChainedSequenceRuleSetOffsets[SetIndex]); + KBTS__FOR(RuleIndex, 0, Set->Count) + { + kbts__chained_sequence_rule *Rule = kbts__GetChainedClassSequenceRule(Set, RuleIndex); + kbts__unpacked_chained_sequence_rule Unpacked = kbts__UnpackChainedSequenceRule(Rule, 0); + + SubtableInfo.MinimumBacktrackPlusOne = KBTS__MIN(SubtableInfo.MinimumBacktrackPlusOne - 1, Unpacked.BacktrackCount) + 1; + SubtableInfo.MinimumFollowupPlusOne = KBTS__MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Unpacked.InputCount - 1 + Unpacked.LookaheadCount) + 1; + + KBTS__FOR(BacktrackIndex, 0, Unpacked.BacktrackCount) + { + kbts_un GlyphId = Unpacked.Backtrack[BacktrackIndex]; + kbts__matrix_index SubtableMatrixIndex = kbts__GlyphLookupSubtableMatrixIndex(RunningSubtableIndex, SubtableCount, GlyphId); + GlyphLookupSubtableMatrix[SubtableMatrixIndex.WordIndex] |= 1 << SubtableMatrixIndex.BitIndex; + } + + KBTS__FOR(InputIndex, 1, Unpacked.InputCount) + { + kbts_un GlyphId = Unpacked.Input[InputIndex - 1]; + kbts__matrix_index SubtableMatrixIndex = kbts__GlyphLookupSubtableMatrixIndex(RunningSubtableIndex, SubtableCount, GlyphId); + GlyphLookupSubtableMatrix[SubtableMatrixIndex.WordIndex] |= 1 << SubtableMatrixIndex.BitIndex; + } + + KBTS__FOR(LookaheadIndex, 0, Unpacked.LookaheadCount) + { + kbts_un GlyphId = Unpacked.Lookahead[LookaheadIndex]; + kbts__matrix_index SubtableMatrixIndex = kbts__GlyphLookupSubtableMatrixIndex(RunningSubtableIndex, SubtableCount, GlyphId); + GlyphLookupSubtableMatrix[SubtableMatrixIndex.WordIndex] |= 1 << SubtableMatrixIndex.BitIndex; + } + } + } + } break; + + case 2: + { + kbts__chained_sequence_context_2 *Subst = (kbts__chained_sequence_context_2 *)Base; + kbts_un BacktrackClassDefOffset = Subst->BacktrackClassDefOffset; + kbts_un InputClassDefOffset = Subst->InputClassDefOffset; + kbts_un LookaheadClassDefOffset = Subst->LookaheadClassDefOffset; + kbts_u16 *BacktrackClassDefinition = 0; + if(BacktrackClassDefOffset) + { + BacktrackClassDefinition = KBTS__POINTER_OFFSET(kbts_u16, Subst, BacktrackClassDefOffset); + } + kbts_u16 *InputClassDefinition = 0; + if(InputClassDefOffset) + { + InputClassDefinition = KBTS__POINTER_OFFSET(kbts_u16, Subst, InputClassDefOffset); + } + kbts_u16 *LookaheadClassDefinition = 0; + if(LookaheadClassDefOffset) + { + LookaheadClassDefinition = KBTS__POINTER_OFFSET(kbts_u16, Subst, LookaheadClassDefOffset); + } + + kbts_u64 BacktrackClassesIncluded[16] = KBTS__ZERO; + kbts_u64 InputClassesIncluded[16] = KBTS__ZERO; + kbts_u64 LookaheadClassesIncluded[16] = KBTS__ZERO; + + KBTS__FOR(SetIndex, 0, Subst->ChainedClassSequenceRuleSetCount) + { + kbts__chained_sequence_rule_set *Set = kbts__GetChainedClassSequenceRuleSet(Subst, SetIndex); + if(Set) + { + KBTS__FOR(RuleIndex, 0, Set->Count) + { + kbts__chained_sequence_rule *Rule = kbts__GetChainedSequenceRule(Set, RuleIndex); + kbts__unpacked_chained_sequence_rule Unpacked = kbts__UnpackChainedSequenceRule(Rule, 0); + + SubtableInfo.MinimumBacktrackPlusOne = KBTS__MIN(SubtableInfo.MinimumBacktrackPlusOne - 1, Unpacked.BacktrackCount) + 1; + SubtableInfo.MinimumFollowupPlusOne = KBTS__MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Unpacked.InputCount - 1 + Unpacked.LookaheadCount) + 1; + + KBTS__FOR(BacktrackIndex, 0, Unpacked.BacktrackCount) + { + kbts_un Class = Unpacked.Backtrack[BacktrackIndex]; + if(Class < (KBTS__ARRAY_LENGTH(BacktrackClassesIncluded) * 64)) + { + BacktrackClassesIncluded[Class / 64] |= 1ull << (Class % 64); + } + } + + KBTS__FOR(InputIndex, 1, Unpacked.InputCount) + { + kbts_un Class = Unpacked.Input[InputIndex - 1]; + if(Class < (KBTS__ARRAY_LENGTH(InputClassesIncluded) * 64)) + { + InputClassesIncluded[Class / 64] |= 1ull << (Class % 64); + } + } + + KBTS__FOR(LookaheadIndex, 0, Unpacked.LookaheadCount) + { + kbts_un Class = Unpacked.Lookahead[LookaheadIndex]; + if(Class < (KBTS__ARRAY_LENGTH(LookaheadClassesIncluded) * 64)) + { + LookaheadClassesIncluded[Class / 64] |= 1ull << (Class % 64); + } + } + } + } + } + + kbts__MarkMatrixClassDef(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, BacktrackClassDefinition, BacktrackClassesIncluded, KBTS__ARRAY_LENGTH(BacktrackClassesIncluded)); + kbts__MarkMatrixClassDef(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, InputClassDefinition, InputClassesIncluded, KBTS__ARRAY_LENGTH(InputClassesIncluded)); + kbts__MarkMatrixClassDef(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, LookaheadClassDefinition, LookaheadClassesIncluded, KBTS__ARRAY_LENGTH(LookaheadClassesIncluded)); + } break; + + case 3: + { + kbts__chained_sequence_context_3 *Subst = (kbts__chained_sequence_context_3 *)Base; + kbts__unpacked_chained_sequence_context_3 Unpacked = kbts__UnpackChainedSequenceContext3(Subst, 0); + + Coverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.InputCoverageOffsets[0]); + + SubtableInfo.MinimumBacktrackPlusOne = KBTS__MIN(SubtableInfo.MinimumBacktrackPlusOne - 1, Unpacked.BacktrackCount) + 1; + SubtableInfo.MinimumFollowupPlusOne = KBTS__MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Unpacked.InputCount - 1 + Unpacked.LookaheadCount) + 1; + + KBTS__FOR(BacktrackCoverageIndex, 0, Unpacked.BacktrackCount) + { + kbts__coverage *SubCoverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.BacktrackCoverageOffsets[BacktrackCoverageIndex]); + kbts__MarkMatrixCoverage(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, SubCoverage, 1); + } + + KBTS__FOR(InputCoverageIndex, 1, Unpacked.InputCount) + { + kbts__coverage *SubCoverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.InputCoverageOffsets[InputCoverageIndex]); + kbts__MarkMatrixCoverage(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, SubCoverage, 1); + } + + + KBTS__FOR(LookaheadCoverageIndex, 0, Unpacked.LookaheadCount) + { + kbts__coverage *SubCoverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.LookaheadCoverageOffsets[LookaheadCoverageIndex]); + kbts__MarkMatrixCoverage(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, SubCoverage, 1); + } + } break; + } + } + else if(!InGpos && (LookupType == 8)) + { + kbts__reverse_chain_substitution *Subst = (kbts__reverse_chain_substitution *)Base; + kbts__unpacked_reverse_chain_substitution Unpacked = kbts__UnpackReverseChainSubstitution(Subst, 0); + SubtableInfo.MinimumBacktrackPlusOne = KBTS__MIN(SubtableInfo.MinimumBacktrackPlusOne - 1, Unpacked.BacktrackCount) + 1; + SubtableInfo.MinimumFollowupPlusOne = KBTS__MIN(SubtableInfo.MinimumFollowupPlusOne - 1, Unpacked.LookaheadCount) + 1; + + KBTS__FOR(BacktrackIndex, 0, Unpacked.BacktrackCount) + { + kbts__coverage *SubCoverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.BacktrackCoverageOffsets[BacktrackIndex]); + kbts__MarkMatrixCoverage(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, SubCoverage, 1); + } + + KBTS__FOR(LookaheadIndex, 0, Unpacked.LookaheadCount) + { + kbts__coverage *SubCoverage = KBTS__POINTER_OFFSET(kbts__coverage, Subst, Unpacked.LookaheadCoverageOffsets[LookaheadIndex]); + kbts__MarkMatrixCoverage(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, SubCoverage, 1); + } + } + + kbts__MarkMatrixCoverage(GlyphLookupMatrix, RunningLookupIndex, LookupCount, GlyphCount, Coverage, 0); + kbts__MarkMatrixCoverage(GlyphLookupSubtableMatrix, RunningSubtableIndex, SubtableCount, GlyphCount, Coverage, 1); + + SubtableInfos[RunningSubtableIndex] = SubtableInfo; + RunningSubtableIndex += 1; + } + + RunningLookupIndex += 1; + } + } + } + } + + Header->GposLookupIndexOffset = (kbts_u32)GposLookupIndexOffset; + Header->GlyphLookupMatrixOffsetFromStartOfFile = KBTS__POINTER_DIFF32(GlyphLookupMatrix, Header); + Header->GlyphLookupSubtableMatrixOffsetFromStartOfFile = KBTS__POINTER_DIFF32(GlyphLookupSubtableMatrix, Header); + Header->LookupSubtableIndexOffsetsOffsetFromStartOfFile = KBTS__POINTER_DIFF32(LookupSubtableIndexOffsets, Header); + Header->SubtableInfosOffsetFromStartOfFile = KBTS__POINTER_DIFF32(SubtableInfos, Header); + } + } + + if(Result != KBTS_LOAD_FONT_ERROR_NONE) + { + Font->Blob = 0; + } + Font->Error = Result; + + return Result; +} + +KBTS_EXPORT void kbts_GetFontInfo(kbts_font *Font, kbts_font_info *Info) +{ + KBTS_MEMSET(Info, 0, sizeof(*Info)); + kbts_blob_header *Blob = Font->Blob; + + if(kbts_FontIsValid(Font) && Blob) + { + kbts_blob_table *NameTable = &Blob->Tables[KBTS_BLOB_TABLE_ID_NAME]; + + if(NameTable->Length) + { + kbts__name *Name = KBTS__POINTER_OFFSET(kbts__name, Blob, NameTable->OffsetFromStartOfFile); + kbts__name_record *Records = KBTS__POINTER_AFTER(kbts__name_record, Name); + char *StringBase = KBTS__POINTER_OFFSET(char, Name, Name->StringStorageOffset); + + KBTS__FOR(RecordIndex, 0, Name->Count) + { + kbts__name_record *Record = &Records[RecordIndex]; + + if(!Record->LanguageId) + { + kbts_font_info_string_id Id = KBTS_FONT_INFO_STRING_ID_NONE; + + switch(Record->NameId) + { + case 0: Id = KBTS_FONT_INFO_STRING_ID_COPYRIGHT; break; + case 1: Id = KBTS_FONT_INFO_STRING_ID_FAMILY; break; + case 2: Id = KBTS_FONT_INFO_STRING_ID_SUBFAMILY; break; + case 3: Id = KBTS_FONT_INFO_STRING_ID_UID; break; + case 4: Id = KBTS_FONT_INFO_STRING_ID_FULL_NAME; break; + case 5: Id = KBTS_FONT_INFO_STRING_ID_VERSION; break; + case 6: Id = KBTS_FONT_INFO_STRING_ID_POSTSCRIPT_NAME; break; + case 7: Id = KBTS_FONT_INFO_STRING_ID_TRADEMARK; break; + case 8: Id = KBTS_FONT_INFO_STRING_ID_MANUFACTURER; break; + case 9: Id = KBTS_FONT_INFO_STRING_ID_DESIGNER; break; + case 10: Id = KBTS_FONT_INFO_STRING_ID_TYPOGRAPHIC_FAMILY; break; + case 11: Id = KBTS_FONT_INFO_STRING_ID_TYPOGRAPHIC_SUBFAMILY; break; + } + + if(Id) + { + Info->Strings[Id] = KBTS__POINTER_OFFSET(char, StringBase, Record->StringOffset); + Info->StringLengths[Id] = Record->Length; + } + } + } + + if(!Info->Strings[KBTS_FONT_INFO_STRING_ID_TYPOGRAPHIC_FAMILY]) + { + Info->Strings[KBTS_FONT_INFO_STRING_ID_TYPOGRAPHIC_FAMILY] = Info->Strings[KBTS_FONT_INFO_STRING_ID_FAMILY]; + Info->StringLengths[KBTS_FONT_INFO_STRING_ID_TYPOGRAPHIC_FAMILY] = Info->StringLengths[KBTS_FONT_INFO_STRING_ID_FAMILY]; + } + + if(!Info->Strings[KBTS_FONT_INFO_STRING_ID_TYPOGRAPHIC_SUBFAMILY]) + { + Info->Strings[KBTS_FONT_INFO_STRING_ID_TYPOGRAPHIC_SUBFAMILY] = Info->Strings[KBTS_FONT_INFO_STRING_ID_SUBFAMILY]; + Info->StringLengths[KBTS_FONT_INFO_STRING_ID_TYPOGRAPHIC_SUBFAMILY] = Info->StringLengths[KBTS_FONT_INFO_STRING_ID_SUBFAMILY]; + } + } + + kbts_blob_table *Os2Table = &Blob->Tables[KBTS_BLOB_TABLE_ID_OS2]; + + if(Os2Table->Length) + { + kbts__os2 *Os2 = KBTS__POINTER_OFFSET(kbts__os2, Blob, Os2Table->OffsetFromStartOfFile); + kbts_font_weight Weight = KBTS_FONT_WEIGHT_UNKNOWN; + kbts_font_width Width = KBTS_FONT_WIDTH_UNKNOWN; + kbts_font_style_flags StyleFlags = KBTS_FONT_STYLE_FLAG_NONE; + + switch(Os2->WeightClass) + { + case 100: Weight = KBTS_FONT_WEIGHT_THIN; break; + case 200: Weight = KBTS_FONT_WEIGHT_EXTRA_LIGHT; break; + case 300: Weight = KBTS_FONT_WEIGHT_LIGHT; break; + case 400: Weight = KBTS_FONT_WEIGHT_NORMAL; break; + case 500: Weight = KBTS_FONT_WEIGHT_MEDIUM; break; + case 600: Weight = KBTS_FONT_WEIGHT_SEMI_BOLD; break; + case 700: Weight = KBTS_FONT_WEIGHT_BOLD; break; + case 800: Weight = KBTS_FONT_WEIGHT_EXTRA_BOLD; break; + case 900: Weight = KBTS_FONT_WEIGHT_BLACK; break; + } + + switch(Os2->WidthClass) + { + case 1: Width = KBTS_FONT_WIDTH_ULTRA_CONDENSED; break; + case 2: Width = KBTS_FONT_WIDTH_EXTRA_CONDENSED; break; + case 3: Width = KBTS_FONT_WIDTH_CONDENSED; break; + case 4: Width = KBTS_FONT_WIDTH_SEMI_CONDENSED; break; + case 5: Width = KBTS_FONT_WIDTH_NORMAL; break; + case 6: Width = KBTS_FONT_WIDTH_SEMI_EXPANDED; break; + case 7: Width = KBTS_FONT_WIDTH_EXPANDED; break; + case 8: Width = KBTS_FONT_WIDTH_EXTRA_EXPANDED; break; + case 9: Width = KBTS_FONT_WIDTH_ULTRA_EXPANDED; break; + } + + if(Os2->Selection & (KBTS__OS2_SELECTION_FLAG_ITALIC | KBTS__OS2_SELECTION_FLAG_OBLIQUE)) + { + StyleFlags |= KBTS_FONT_STYLE_FLAG_ITALIC; + } + if(Os2->Selection & KBTS__OS2_SELECTION_FLAG_BOLD) + { + StyleFlags |= KBTS_FONT_STYLE_FLAG_BOLD; + } + if(Os2->Selection & KBTS__OS2_SELECTION_FLAG_REGULAR) + { + StyleFlags |= KBTS_FONT_STYLE_FLAG_REGULAR; + } + + Info->Weight = Weight; + Info->Width = Width; + Info->StyleFlags = StyleFlags; + } + } +} + +KBTS_EXPORT kbts_font kbts_FontFromMemory(void *FileData, int FileSize, int FontIndex, kbts_allocator_function *Allocator, void *AllocatorData) +{ + kbts_font Result = KBTS__ZERO; + + if(!Allocator) + { + Allocator = kbts__DefaultAllocator; + } + + if(FileData && (FileSize > 0)) + { + kbts_load_font_state LoadFontState = KBTS__ZERO; + int ScratchSize, OutputSize; + kbts_load_font_error Error = kbts_LoadFont(&Result, &LoadFontState, FileData, (int)FileSize, FontIndex, &ScratchSize, &OutputSize); + + if(Error == KBTS_LOAD_FONT_ERROR_NEED_TO_CREATE_BLOB) + { + void *ScratchMemory = kbts__AllocatorAllocate(Allocator, AllocatorData, (kbts_un)ScratchSize); + void *OutputMemory = kbts__AllocatorAllocate(Allocator, AllocatorData, (kbts_un)OutputSize); + + kbts_PlaceBlob(&Result, &LoadFontState, ScratchMemory, OutputMemory); + + kbts__AllocatorFree(Allocator, AllocatorData, ScratchMemory); + + Result.Allocator = Allocator; + Result.AllocatorData = AllocatorData; + } + } + + return Result; +} + +#ifndef KB_TEXT_SHAPE_NO_CRT + +KBTS_EXPORT kbts_font kbts_FontFromFile(const char *FileName, int FontIndex, kbts_allocator_function *Allocator, void *AllocatorData, void **FileData, int *FileSize_) +{ + kbts_font Result = KBTS__ZERO; + + if(!Allocator) + { + Allocator = kbts__DefaultAllocator; + } FILE *File; # ifndef _MSC_VER @@ -22835,90 +27826,189 @@ KBTS_EXPORT kbts_font kbts_FontFromFile(const char *FileName) long FileSize = ftell(File); fseek(File, 0, SEEK_SET); - void *Data = malloc((kbts_un)FileSize); - kbts_un Ok = fread(Data, (kbts_un)FileSize, 1, File); - fclose(File); - - if(Ok) + if(FileSize > 0) { - kbts_un ScratchSize = kbts_ReadFontHeader(&Result, Data, (kbts_un)FileSize); + void *Data = kbts__AllocatorAllocate(Allocator, AllocatorData, (kbts_un)FileSize); - void *Scratch = malloc(ScratchSize); - kbts_un MemorySize = kbts_ReadFontData(&Result, Scratch, ScratchSize); - - void *Memory = Scratch; - if(MemorySize > ScratchSize) + if(Data) { - free(Scratch); - Memory = malloc(MemorySize); - } + kbts_un Ok = fread(Data, (kbts_un)FileSize, 1, File); - kbts_PostReadFontInitialize(&Result, Memory, MemorySize); + if(Ok) + { + Result = kbts_FontFromMemory(Data, (int)FileSize, FontIndex, Allocator, AllocatorData); + + if(!Result.Error) + { + + if(FileData) + { + *FileData = Data; + } + else + { + kbts__AllocatorFree(Allocator, AllocatorData, Data); + } + + if(FileSize_) + { + *FileSize_ = (int)FileSize; + } + } + } + else + { + Result.Error = KBTS_LOAD_FONT_ERROR_READ_ERROR; + } + } + else + { + Result.Error = KBTS_LOAD_FONT_ERROR_OUT_OF_MEMORY; + } } + + fclose(File); + } + else + { + Result.Error = KBTS_LOAD_FONT_ERROR_COULD_NOT_OPEN_FILE; } return Result; } +#endif + KBTS_EXPORT void kbts_FreeFont(kbts_font *Font) { - if(Font->FileBase) + if(Font->Blob && Font->Allocator) { - free(Font->FileBase); - if(Font->GlyphLookupMatrix) - { - free(Font->GlyphLookupMatrix); // This frees everything else. - } + kbts__AllocatorFree(Font->Allocator, Font->AllocatorData, Font->Blob); } } -#endif -KBTS_EXPORT int kbts_BreakStateIsValid(kbts_break_state *State) +static void kbts__DoBreak(kbts_break_state *State, kbts_s32 Position, kbts_u8 Flags, kbts_direction Direction, kbts_direction ParagraphDirection, kbts_script Script) { - int Result = !(State->Flags & KBTS_BREAK_STATE_FLAG_RAN_OUT_OF_REORDER_BUFFER_SPACE); - return Result; -} - -static void kbts_DoBreak(kbts_break_state *State, kbts_s32 Position, kbts_u8 Flags, kbts_direction Direction, kbts_script Script) -{ - if(kbts_BreakStateIsValid(State) && Flags && (State->BreakCount < KBTS_BREAK_REORDER_BUFFER_SIZE)) + kbts_u32 BreakPosition = State->CurrentPosition + (kbts_u32)Position; + if(Flags && + (BreakPosition <= State->CurrentPosition)) { - if(State->BreakCount < KBTS_BREAK_REORDER_BUFFER_SIZE) + kbts_break Break = KBTS__ZERO; + Break.Position = (int)BreakPosition; + Break.Flags = Flags; + Break.Direction = Direction; + Break.ParagraphDirection = ParagraphDirection; + Break.Script = Script; + + if((Flags & KBTS_BREAK_FLAG_SCRIPT) && + (State->LastScriptBreakScript)) { - kbts_break Break = KBTS_ZERO; - Break.Position = State->CurrentPosition + (kbts_u32)Position; - Break.Flags = Flags; - Break.Direction = Direction; - Break.Script = Script; + kbts_un LastScriptBreakPosition = State->LastScriptBreakPosition; + kbts_u8 LastScriptBreakScript = State->LastScriptBreakScript; - int Matched = 0; - KBTS_FOR(BreakIndex, 0, State->BreakCount) + // Resolve bracket scripts here. + // The only span we can fully resolve is the _previous_ script, but we don't + // know when it starts, so we might as well tag all of the brackets we have stored so far. + for(kbts_un BracketIndex = State->BracketCount; + BracketIndex; + --BracketIndex) { - kbts_break *Existing = &State->Breaks[BreakIndex]; + kbts_bracket *Bracket = &State->Brackets[BracketIndex - 1]; - if(Existing->Position == Break.Position) + if(Bracket->Position >= BreakPosition) + { + Bracket->Script = (kbts_u8)Script; + } + else if(Bracket->Position >= LastScriptBreakPosition) + { + Bracket->Script = LastScriptBreakScript; + } + else { - Existing->Flags |= Break.Flags; - if(Break.Flags & KBTS_BREAK_FLAG_DIRECTION) Existing->Direction = Break.Direction; - if(Break.Flags & KBTS_BREAK_FLAG_SCRIPT) Existing->Script = Break.Script; - Matched = 1; break; } - else if(Existing->Position < Break.Position) + } + + State->LastScriptBreakPosition = BreakPosition; + State->LastScriptBreakScript = (kbts_u8)Script; + } + + if((Flags & KBTS_BREAK_FLAG_DIRECTION) && + (State->LastDirectionBreakDirection)) + { + kbts_un LastDirectionBreakPosition = State->LastDirectionBreakPosition; + kbts_u8 LastDirectionBreakDirection = State->LastDirectionBreakDirection; + + for(kbts_un BracketIndex = State->BracketCount; + BracketIndex; + --BracketIndex) + { + kbts_bracket *Bracket = &State->Brackets[BracketIndex - 1]; + + if(Bracket->Position >= BreakPosition) { - kbts_break Swap = *Existing; - *Existing = Break; - Break = Swap; + Bracket->Direction = (kbts_u8)Direction; + } + else if(Bracket->Position >= LastDirectionBreakPosition) + { + Bracket->Direction = LastDirectionBreakDirection; + } + else + { + break; } } - State->Breaks[State->BreakCount] = Break; - State->BreakCount += !Matched; + + State->LastDirectionBreakPosition = BreakPosition; + State->LastDirectionBreakDirection = (kbts_u8)Direction; } - else + + int Matched = 0; + KBTS__FOR(BreakIndex, 0, State->BreakCount) { - // This should never happen as long as we call Break() after every BreakAddCodepoint(). - State->Flags |= KBTS_BREAK_STATE_FLAG_RAN_OUT_OF_REORDER_BUFFER_SPACE; + kbts_break *Existing = &State->Breaks[BreakIndex]; + + if(Existing->Position == Break.Position) + { + Existing->Flags |= Break.Flags; + + if(Break.Flags & KBTS_BREAK_FLAG_DIRECTION) + { + Existing->Direction = Break.Direction; + } + + if(Break.Flags & KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION) + { + Existing->ParagraphDirection = Break.ParagraphDirection; + } + + if(Break.Flags & KBTS_BREAK_FLAG_SCRIPT) + { + Existing->Script = Break.Script; + } + + Matched = 1; + + break; + } + else if(Existing->Position < Break.Position) + { + // We order breaks in backwards order here, because we want to simply pop them off the top in Break(). + kbts_break Swap = *Existing; + *Existing = Break; + Break = Swap; + } + else if((Break.Flags & KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION) && + (Existing->Flags & KBTS_BREAK_FLAG_DIRECTION) && + !Existing->Direction) + { + // Short-circuit coerce neutral blocks to the paragraph direction. + Existing->Direction = Break.ParagraphDirection; + } } + + State->Breaks[State->BreakCount] = Break; + State->BreakCount += !Matched; } } @@ -22927,52 +28017,144 @@ static void kbts_DoBreak(kbts_break_state *State, kbts_s32 Position, kbts_u8 Fla // A required break implies an allowed break. // A priority N break implies priority 0..N-1 breaks. enum { - KBTS_LINE_BREAK_ALLOWED0 = 1, - KBTS_LINE_BREAK_ALLOWED1 = 3, - KBTS_LINE_BREAK_ALLOWED2 = 7, - KBTS_LINE_BREAK_ALLOWED3 = 0xF, - KBTS_LINE_BREAK_ALLOWED4 = 0x1F, - KBTS_LINE_BREAK_ALLOWED5 = 0x3F, - KBTS_LINE_BREAK_REQUIRED0 = (1 << 6) | KBTS_LINE_BREAK_ALLOWED0, - KBTS_LINE_BREAK_REQUIRED1 = (3 << 6) | KBTS_LINE_BREAK_ALLOWED1, - KBTS_LINE_BREAK_REQUIRED2 = (7 << 6) | KBTS_LINE_BREAK_ALLOWED2, - KBTS_LINE_BREAK_REQUIRED3 = (0xF << 6) | KBTS_LINE_BREAK_ALLOWED3, - KBTS_LINE_BREAK_REQUIRED4 = (0x1F << 6) | KBTS_LINE_BREAK_ALLOWED4, - KBTS_LINE_BREAK_REQUIRED5 = (0x3F << 6) | KBTS_LINE_BREAK_ALLOWED5, - KBTS_LINE_BREAK_REQUIRED_MASK = 0x3F << 6, - KBTS_LINE_BREAK_ALLOWED_MASK = 0x3F, - KBTS_LINE_BREAK_MASK = KBTS_LINE_BREAK_REQUIRED_MASK | KBTS_LINE_BREAK_ALLOWED_MASK, + KBTS__LINE_BREAK_ALLOWED0 = 1, + KBTS__LINE_BREAK_ALLOWED1 = 3, + KBTS__LINE_BREAK_ALLOWED2 = 7, + KBTS__LINE_BREAK_ALLOWED3 = 0xF, + KBTS__LINE_BREAK_ALLOWED4 = 0x1F, + KBTS__LINE_BREAK_ALLOWED5 = 0x3F, + KBTS__LINE_BREAK_REQUIRED0 = (1 << 6) | KBTS__LINE_BREAK_ALLOWED0, + KBTS__LINE_BREAK_REQUIRED1 = (3 << 6) | KBTS__LINE_BREAK_ALLOWED1, + KBTS__LINE_BREAK_REQUIRED2 = (7 << 6) | KBTS__LINE_BREAK_ALLOWED2, + KBTS__LINE_BREAK_REQUIRED3 = (0xF << 6) | KBTS__LINE_BREAK_ALLOWED3, + KBTS__LINE_BREAK_REQUIRED4 = (0x1F << 6) | KBTS__LINE_BREAK_ALLOWED4, + KBTS__LINE_BREAK_REQUIRED5 = (0x3F << 6) | KBTS__LINE_BREAK_ALLOWED5, + KBTS__LINE_BREAK_REQUIRED_MASK = 0x3F << 6, + KBTS__LINE_BREAK_ALLOWED_MASK = 0x3F, + KBTS__LINE_BREAK_MASK = KBTS__LINE_BREAK_REQUIRED_MASK | KBTS__LINE_BREAK_ALLOWED_MASK, }; -static void kbts_DoLineBreak(kbts_break_state *State, int Position, kbts_u64 EffectiveLineBreaks, int Rtl, kbts_script Script) +static void kbts__DoLineBreak(kbts_break_state *State, int Position, kbts_u64 EffectiveLineBreaks) { - if(EffectiveLineBreaks & KBTS_LINE_BREAK_MASK) + if(EffectiveLineBreaks & KBTS__LINE_BREAK_MASK) { kbts_u8 Flags = 0; - if(EffectiveLineBreaks & KBTS_LINE_BREAK_ALLOWED_MASK) Flags |= KBTS_BREAK_FLAG_LINE_SOFT; - if(EffectiveLineBreaks & KBTS_LINE_BREAK_REQUIRED_MASK) Flags |= KBTS_BREAK_FLAG_LINE_HARD; - kbts_DoBreak(State, Position, Flags, Rtl, Script); + if(EffectiveLineBreaks & KBTS__LINE_BREAK_ALLOWED_MASK) + { + Flags |= KBTS_BREAK_FLAG_LINE_SOFT; + } + + if(EffectiveLineBreaks & KBTS__LINE_BREAK_REQUIRED_MASK) + { + Flags |= KBTS_BREAK_FLAG_LINE_HARD; + } + + kbts__DoBreak(State, Position, Flags, 0, 0, 0); } } -static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, kbts_u32 PositionIncrement, int MaybeEndOfText) +static void kbts__BreakStateStartParagraph(kbts_break_state *State) +{ + kbts_direction ParagraphDirection = State->UserParagraphDirection; + // At the beginning of a paragraph, we want to pretend like start-of-text is an actual character + // with bidirectional data that depends on its direction. + kbts_u32 StartOfTextBidirectionalClass = KBTS_UNICODE_BIDIRECTIONAL_CLASS_NI; + kbts_u32 Flags = 0; + + if(ParagraphDirection == KBTS_DIRECTION_LTR) + { + StartOfTextBidirectionalClass = KBTS_UNICODE_BIDIRECTIONAL_CLASS_L; + } + else if(ParagraphDirection == KBTS_DIRECTION_RTL) + { + Flags = KBTS_BREAK_STATE_FLAG_SAW_R_AFTER_L; + StartOfTextBidirectionalClass = KBTS_UNICODE_BIDIRECTIONAL_CLASS_R; + } + + State->ParagraphDirection = (kbts_u8)ParagraphDirection; + State->BidirectionalClass1 = (kbts_u8)StartOfTextBidirectionalClass; + State->Flags = Flags; +} + +typedef kbts_u32 kbts__break_flush_flags; +enum kbts__break_flush_flags_enum +{ + KBTS__BREAK_FLUSH_FLAG_NONE, + KBTS__BREAK_FLUSH_FLAG_SCRIPT = (1 << 0), + KBTS__BREAK_FLUSH_FLAG_DIRECTION_2 = (1 << 1), + KBTS__BREAK_FLUSH_FLAG_DIRECTION_1 = (1 << 2), + KBTS__BREAK_FLUSH_FLAG_DIRECTION_PARAGRAPH = (1 << 3), +}; + +static void kbts__FlushDirection(kbts_break_state *State, kbts_direction *LastDirection, kbts_unicode_bidirectional_class BidirectionalClass, kbts_s16 PositionOffset) +{ + // @Incomplete: ET+ EN -> EN+ EN + kbts_break_flags BreakFlags = 0; + kbts_direction Direction = KBTS_DIRECTION_DONT_KNOW; + + switch(BidirectionalClass) + { + // @Incomplete: Surely, there are other edge cases we could handle here. + case KBTS_UNICODE_BIDIRECTIONAL_CLASS_L: + BreakFlags = KBTS_BREAK_FLAG_DIRECTION | KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION; + Direction = KBTS_DIRECTION_LTR; + break; + + case KBTS_UNICODE_BIDIRECTIONAL_CLASS_R: + BreakFlags = KBTS_BREAK_FLAG_DIRECTION | KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION; + Direction = KBTS_DIRECTION_RTL; + break; + + case KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN: + case KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN: + // Digits are weak LTR, i.e. they do not influence the paragraph direction. + BreakFlags = KBTS_BREAK_FLAG_DIRECTION; + Direction = KBTS_DIRECTION_LTR; + break; + + case KBTS_UNICODE_BIDIRECTIONAL_CLASS_NI: + // We've already checked the ParagraphDirection earlier, when coercing neutrals to L or R. + // If a neutral shows up here, it means that we did not find any way to resolve it to either direction. + // In this case, neutrals get the unresolved embedding direction. + BreakFlags = KBTS_BREAK_FLAG_DIRECTION; + break; + } + + if((BreakFlags & KBTS_BREAK_FLAG_DIRECTION) && + (Direction != *LastDirection)) + { + *LastDirection = Direction; + kbts__DoBreak(State, PositionOffset, KBTS_BREAK_FLAG_DIRECTION, Direction, 0, 0); + } + + if((BreakFlags & KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION) && + !State->ParagraphDirection) + { + kbts_s32 StartOfParagraphOffset = (kbts_s16)(State->ParagraphStartPosition - State->CurrentPosition); + kbts__DoBreak(State, StartOfParagraphOffset, KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION, 0, Direction, 0); + State->ParagraphDirection = (kbts_u8)Direction; + } +} + +static void kbts__BreakAddCodepoint(kbts_break_state *State, kbts_u32 Codepoint, kbts_u32 PositionIncrement, int MaybeEndOfText) { // In these macros, and in FlagState, and in the way we buffer our state in general, // index 0 means _after_ the codepoint currently being added, // index 1 means _before_ the codepoint currently being added. #define KBTS_BREAK(Flags, Position) do {FlagState |= ((Flags) << (8 * (Position)));} while(0) #define KBTS_BREAK2(Flags, Position0, Position1) do {FlagState |= ((Flags) << (8 * (Position0))) | ((Flags) << (8 * (Position1)));} while(0) - if(!kbts_BreakStateIsValid(State)) return; - kbts_u8 Script = kbts_GetUnicodeScript(Codepoint); - kbts_unicode_bidirectional_class BidirectionalClass = kbts_GetUnicodeBidirectionalClass(Codepoint); - kbts_u8 UnicodeFlags = kbts_GetUnicodeFlags(Codepoint); - kbts_u32 MatchingBracket = kbts_GetUnicodeMatchingBracket(Codepoint); - kbts_u8 GraphemeBreakClass = kbts_GetUnicodeGraphemeBreakClass(Codepoint); - kbts_u8 LineBreakClass = kbts_GetUnicodeLineBreakClass(Codepoint); - kbts_u8 WordBreakClass = kbts_GetUnicodeWordBreakClass(Codepoint); - kbts_u8 LastScript = State->LastScripts[0]; + kbts_unicode_bidirectional_class BidirectionalClass = kbts__GetUnicodeBidirectionalClass(Codepoint); + kbts_u8 UnicodeFlags = kbts__GetUnicodeFlags(Codepoint); + kbts_u32 MatchingBracket = kbts__GetUnicodeMirrorCodepoint(Codepoint); + kbts_u8 GraphemeBreakClass = kbts__GetUnicodeGraphemeBreakClass(Codepoint); + kbts_u8 LineBreakClass = kbts__GetUnicodeLineBreakClass(Codepoint); + kbts_u8 WordBreakClass = kbts__GetUnicodeWordBreakClass(Codepoint); + kbts_u16 CodepointScriptExtension = kbts__GetUnicodeScriptExtension(Codepoint); + kbts_u32 CodepointScriptCount = (kbts_u32)kbts__ScriptExtensionCount(CodepointScriptExtension); + kbts_u32 CodepointScriptOffset = (kbts_u32)kbts__ScriptExtensionOffset(CodepointScriptExtension); + kbts_u8 *CodepointScripts = &kbts__ScriptExtensions[CodepointScriptOffset]; kbts_u32 FlagState = State->FlagState << 8; kbts_u8 LastLineBreakClass = State->LastLineBreakClass; // Super secret cheat code for signaling end-of-text @@ -22987,6 +28169,16 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, kbts_s16 PositionOffset3 = State->PositionOffset3; kbts_u32 Flags = State->Flags; kbts_direction LastDirection = State->LastDirection; + kbts_u8 *ScriptSet = State->ScriptSet; + kbts_s16 ScriptPositionOffset = State->ScriptPositionOffset; + kbts_u32 ScriptCount = State->ScriptCount; + kbts_u32 ScriptCountAtBeginningOfUpdate = ScriptCount; + kbts_u8 BreakScript = ScriptSet[0]; + kbts__break_flush_flags FlushFlags = 0; + kbts_s16 Bidirectional1PositionOffset = State->Bidirectional1PositionOffset; + kbts_s16 Bidirectional2PositionOffset = State->Bidirectional2PositionOffset; + kbts_u8 Bidirectional2 = State->BidirectionalClass2; + kbts_u8 Bidirectional1 = State->BidirectionalClass1; if(StartOfText) { @@ -22994,28 +28186,31 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, WordBreakHistory = LastWordBreakClass = KBTS_WORD_BREAK_CLASS_SOT; } - - if((Script == KBTS_SCRIPT_DEFAULT) || (Script == KBTS_SCRIPT_DEFAULT2)) - { - Script = LastScript; - } - // Bracket pairing overrides default directions/scripts. - if(UnicodeFlags & KBTS_UNICODE_FLAG_OPEN_BRACKET) + if((UnicodeFlags & KBTS_UNICODE_FLAG_MIRRORED) == KBTS_UNICODE_FLAG_OPEN_BRACKET) { - if(State->BracketCount < KBTS_ARRAY_LENGTH(State->Brackets)) + if(State->BracketCount < KBTS__ARRAY_LENGTH(State->Brackets)) { kbts_bracket *Bracket = &State->Brackets[State->BracketCount++]; // @Incomplete: Canonicalize the bracket. Bracket->Codepoint = Codepoint; - Bracket->Direction = KBTS_DIRECTION_NONE; - Bracket->Script = Script; + Bracket->Position = State->CurrentPosition; + + // Unfortunately, because our script/direction breaks are arbitrary lookback now, + // we have to wait until DoBreak() to resolve these. + Bracket->Direction = KBTS_DIRECTION_DONT_KNOW; + Bracket->Script = KBTS_SCRIPT_DONT_KNOW; + + if(ScriptCount) + { + Bracket->Script = ScriptSet[0]; + } State->Flags |= KBTS_BREAK_STATE_FLAG_LAST_WAS_BRACKET; } } - else if(UnicodeFlags & KBTS_UNICODE_FLAG_CLOSE_BRACKET) + else if((UnicodeFlags & KBTS_UNICODE_FLAG_MIRRORED) == KBTS_UNICODE_FLAG_CLOSE_BRACKET) { if(State->BracketCount) { @@ -23023,7 +28218,7 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, kbts_bracket *FoundBracket = 0; // @Incomplete: Canonicalize the bracket. - KBTS_FOR(BracketIndex, 0, State->BracketCount) + KBTS__FOR(BracketIndex, 0, State->BracketCount) { kbts_bracket *Bracket = &State->Brackets[State->BracketCount - 1 - BracketIndex]; @@ -23038,18 +28233,129 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, if(FoundBracket) { + // In case the bracket hasn't been resolved yet, take the current values. + kbts_u8 BracketScript = FoundBracket->Script; + kbts_u8 BracketDirection = FoundBracket->Direction; + + if(!BracketScript && ScriptCount) + { + BracketScript = ScriptSet[0]; + } + + if(!BracketDirection) + { + BracketDirection = (kbts_u8)LastDirection; + } + + if(BracketDirection == KBTS_DIRECTION_LTR) + { + BidirectionalClass = KBTS_UNICODE_BIDIRECTIONAL_CLASS_L; + } + else if(BracketDirection == KBTS_DIRECTION_RTL) + { + BidirectionalClass = KBTS_UNICODE_BIDIRECTIONAL_CLASS_R; + } + BidirectionalClass = FoundBracket->Direction; - Script = FoundBracket->Script; + CodepointScriptCount = 1; + CodepointScriptOffset = BracketScript; State->BracketCount = (kbts_u32)FoundBracketIndex; } } } - { // Direction breaking. - kbts_u8 Bidirectional2 = State->BidirectionalClass2; - kbts_u8 Bidirectional1 = State->BidirectionalClass1; + // Script breaking. + if(EndOfText) + { + FlushFlags |= KBTS__BREAK_FLUSH_FLAG_SCRIPT; + } + if(CodepointScriptCount < 2) + { + // We special case this entire path because, supposedly, this is the common case. + kbts_u8 CodepointScript = (kbts_u8)CodepointScriptOffset; + + if((CodepointScript == KBTS_SCRIPT_DONT_KNOW) || + (CodepointScript == KBTS_SCRIPT_DEFAULT) || + (CodepointScript == KBTS_SCRIPT_DEFAULT2)) + { + // Nothing to do. + } + else + { + kbts_u32 ScriptSetMatch = 0; + KBTS__FOR(ScriptIndex, 0, ScriptCount) + { + ScriptSetMatch |= (ScriptSet[ScriptIndex] == CodepointScript); + } + + if(!ScriptSetMatch) + { + FlushFlags |= KBTS__BREAK_FLUSH_FLAG_SCRIPT; + } + + ScriptCount = 1; + ScriptSet[0] = CodepointScript; + } + } + else + { + // Refine the script set. + kbts_un NewScriptCount = 0; + + { + kbts_un CodepointScriptIndex = 0; + kbts_un ScriptIndex = 0; + + while((ScriptIndex < ScriptCount) && + (CodepointScriptIndex < CodepointScriptCount)) + { + kbts_u8 CodepointScript = CodepointScripts[CodepointScriptIndex]; + kbts_u8 Script = ScriptSet[ScriptIndex]; + + if(CodepointScript < Script) + { + CodepointScriptIndex += 1; + } + else if(Script < CodepointScript) + { + ScriptIndex += 1; + } + else + { + ScriptSet[NewScriptCount++] = Script; + + CodepointScriptIndex += 1; + ScriptIndex += 1; + } + } + } + + if(!NewScriptCount) + { + FlushFlags |= KBTS__BREAK_FLUSH_FLAG_SCRIPT; + + KBTS__FOR(CodepointScriptIndex, 0, CodepointScriptCount) + { + ScriptSet[CodepointScriptIndex] = CodepointScripts[CodepointScriptIndex]; + } + ScriptCount = (kbts_u32)CodepointScriptCount; + } + else + { + ScriptCount = (kbts_u32)NewScriptCount; + } + } + + // Direction breaking. + if(EndOfText) + { + BidirectionalClass = KBTS_UNICODE_BIDIRECTIONAL_CLASS_NI; + } + + if(BidirectionalClass != KBTS_UNICODE_BIDIRECTIONAL_CLASS_BN) // Formatting characters should be ignored. + { switch(BidirectionalClass) { case KBTS_UNICODE_BIDIRECTIONAL_CLASS_NSM: BidirectionalClass = Bidirectional1; break; @@ -23075,18 +28381,28 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, BidirectionalClass = KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN; goto CaseAn; } - if((Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN) && ((Bidirectional1 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_ES) || (Bidirectional1 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_CS))) + if((Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN) && + ((Bidirectional1 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_ES) || + (Bidirectional1 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_CS))) { Bidirectional1 = KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN; } - if(!(Flags & KBTS_BREAK_STATE_FLAG_SAW_R_AFTER_L)) + + // We test State->ParagraphDirection here because we do not want + // digits to coerce to L when the paragrpah direction is unknown. + // It might be cleaner to explicitly store the last strong direction seen, + // with DONT_KNOW as an option. + // @Cleanup + if(State->ParagraphDirection && + !(Flags & KBTS_BREAK_STATE_FLAG_SAW_R_AFTER_L)) { BidirectionalClass = KBTS_UNICODE_BIDIRECTIONAL_CLASS_L; } break; case KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN: CaseAn:; - if((Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN) && (Bidirectional1 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_CS)) + if((Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN) && + (Bidirectional1 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_CS)) { Bidirectional1 = KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN; } @@ -23099,57 +28415,77 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, break; } - if(KBTS_IN_SET(BidirectionalClass, KBTS_SET32((KBTS_UNICODE_BIDIRECTIONAL_CLASS_ET)(KBTS_UNICODE_BIDIRECTIONAL_CLASS_ES)(KBTS_UNICODE_BIDIRECTIONAL_CLASS_CS)))) + // This rule has a lower priority than AN CS AN -> AN AN AN, so we have to wait until slot 1 to apply it. + if(KBTS__IN_SET(Bidirectional1, KBTS__SET32((KBTS_UNICODE_BIDIRECTIONAL_CLASS_ET) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_ES) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_CS)))) { - BidirectionalClass = KBTS_UNICODE_BIDIRECTIONAL_CLASS_NI; + Bidirectional1 = KBTS_UNICODE_BIDIRECTIONAL_CLASS_NI; } if(Bidirectional1 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_NI) { - if(KBTS_IN_SET(Bidirectional2, KBTS_SET32((KBTS_UNICODE_BIDIRECTIONAL_CLASS_R)(KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN)(KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN))) && - KBTS_IN_SET(BidirectionalClass, KBTS_SET32((KBTS_UNICODE_BIDIRECTIONAL_CLASS_R)(KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN)(KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN)))) + if(KBTS__IN_SET(BidirectionalClass, KBTS__SET32((KBTS_UNICODE_BIDIRECTIONAL_CLASS_NI) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_ET) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_ES) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_CS)))) { + // All of these input classes end up resolving to NI later on anyway if they are preceded by NI. + // We are in a situation where: + // - We have an NI in slot 1 + // - The direction in slot 0 will eventually resolve to NI due to the NI in slot 1 + // - Storing multiple NIs in our shift buffer is redundant, because no rule necessitates multiple NIs + // - NIs don't interact with anything, except that they resolve when surrounded by strong characters + // - NIs are resolved in groups. As per the Unicode specification: + // N1. A sequence of NIs takes the direction of the surrounding strong text if the text on both + // sides has the same direction. + // This means we can merge the current bidirectional class with the preceding NI, bump the offset, + // and it just works. + goto SkipDirectionBreak; + } + else if(((Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_R) || + (BidirectionalClass == KBTS_UNICODE_BIDIRECTIONAL_CLASS_R)) && + KBTS__IN_SET(Bidirectional2, KBTS__SET32((KBTS_UNICODE_BIDIRECTIONAL_CLASS_R) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN))) && + KBTS__IN_SET(BidirectionalClass, KBTS__SET32((KBTS_UNICODE_BIDIRECTIONAL_CLASS_R) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN)))) + { + // Note that the way we resolve digits is different from the way the Unicode standard specifies it. + // This is because the standard assumes the paragraph direction is always known, whereas in our case it isn't. + // We want neutral surrounded by uncoerced digits to resolve to the paragraph direction, which may be DONT_KNOW. Bidirectional1 = KBTS_UNICODE_BIDIRECTIONAL_CLASS_R; } - else if((Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_L) && (BidirectionalClass == KBTS_UNICODE_BIDIRECTIONAL_CLASS_L)) + else if(((Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_L) || + (BidirectionalClass == KBTS_UNICODE_BIDIRECTIONAL_CLASS_L)) && + KBTS__IN_SET(Bidirectional2, KBTS__SET32((KBTS_UNICODE_BIDIRECTIONAL_CLASS_L) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN))) && + KBTS__IN_SET(BidirectionalClass, KBTS__SET32((KBTS_UNICODE_BIDIRECTIONAL_CLASS_L) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN) + (KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN)))) { Bidirectional1 = KBTS_UNICODE_BIDIRECTIONAL_CLASS_L; } else { - if (State->MainDirection == KBTS_DIRECTION_LTR) Bidirectional1 = KBTS_UNICODE_BIDIRECTIONAL_CLASS_L; - else if(State->MainDirection == KBTS_DIRECTION_RTL) Bidirectional1 = KBTS_UNICODE_BIDIRECTIONAL_CLASS_R; + if (State->ParagraphDirection == KBTS_DIRECTION_LTR) Bidirectional1 = KBTS_UNICODE_BIDIRECTIONAL_CLASS_L; + else if(State->ParagraphDirection == KBTS_DIRECTION_RTL) Bidirectional1 = KBTS_UNICODE_BIDIRECTIONAL_CLASS_R; } } - // These rules happen at the very end, so we wait until the last slot to apply them. - if((Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_AN) || (Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_EN)) + FlushFlags |= KBTS__BREAK_FLUSH_FLAG_DIRECTION_2; + if(EndOfText) { - Bidirectional2 = KBTS_UNICODE_BIDIRECTIONAL_CLASS_L; + FlushFlags |= KBTS__BREAK_FLUSH_FLAG_DIRECTION_1; } - - // @Incomplete: ET+ EN -> EN+ EN - kbts_direction Direction = KBTS_DIRECTION_NONE; - if(Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_L) Direction = KBTS_DIRECTION_LTR; - else if(Bidirectional2 == KBTS_UNICODE_BIDIRECTIONAL_CLASS_R) Direction = KBTS_DIRECTION_RTL; - if(Direction && (Direction != LastDirection)) - { - LastDirection = Direction; - KBTS_BREAK(KBTS_BREAK_FLAG_DIRECTION, 3); - - if(!State->MainDirection) - { - State->MainDirection = (kbts_u8)Direction; - } - } - - State->BidirectionalClass2 = Bidirectional1; - State->BidirectionalClass1 = BidirectionalClass; } - - if(Script != LastScript) + else { - KBTS_BREAK(KBTS_BREAK_FLAG_SCRIPT, 1); + SkipDirectionBreak:; + State->Bidirectional2PositionOffset -= (kbts_s16)PositionIncrement; + State->Bidirectional1PositionOffset -= (kbts_s16)PositionIncrement; } { // Grapheme breaking. @@ -23196,10 +28532,10 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, // Ignore [EX FO ZWJ] after ^[_sot_ CR LF NL]. // @Cleanup: This is the only time we explicitly use EX and FO. They can be merged. - if(KBTS_IN_SET(WordBreakClass, KBTS_SET32((KBTS_WORD_BREAK_CLASS_EX)(KBTS_WORD_BREAK_CLASS_FO)(KBTS_WORD_BREAK_CLASS_ZWJ))) && - !KBTS_IN_SET(LastWordBreakClass, KBTS_SET32((KBTS_WORD_BREAK_CLASS_SOT)(KBTS_WORD_BREAK_CLASS_CR)(KBTS_WORD_BREAK_CLASS_LF)(KBTS_WORD_BREAK_CLASS_NL)))) + if(KBTS__IN_SET(WordBreakClass, KBTS__SET32((KBTS_WORD_BREAK_CLASS_EX)(KBTS_WORD_BREAK_CLASS_FO)(KBTS_WORD_BREAK_CLASS_ZWJ))) && + !KBTS__IN_SET(LastWordBreakClass, KBTS__SET32((KBTS_WORD_BREAK_CLASS_SOT)(KBTS_WORD_BREAK_CLASS_CR)(KBTS_WORD_BREAK_CLASS_LF)(KBTS_WORD_BREAK_CLASS_NL)))) { - WordBreak2PositionOffset -= PositionIncrement; + WordBreak2PositionOffset -= (kbts_s16)PositionIncrement; State->WordBreak2PositionOffset = WordBreak2PositionOffset; } else @@ -23214,11 +28550,11 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, WordBreaks |= KBTS_WORD_BREAK_BITS(2, 1); } - if(KBTS_IN_SET(WordBreakClass, KBTS_SET32((KBTS_WORD_BREAK_CLASS_CR)(KBTS_WORD_BREAK_CLASS_LF)(KBTS_WORD_BREAK_CLASS_NL)))) + if(KBTS__IN_SET(WordBreakClass, KBTS__SET32((KBTS_WORD_BREAK_CLASS_CR)(KBTS_WORD_BREAK_CLASS_LF)(KBTS_WORD_BREAK_CLASS_NL)))) { WordBreaks |= KBTS_WORD_BREAK_BITS(1, 1) | KBTS_WORD_BREAK_BITS(1, 0); } - else if(KBTS_IN_SET(WordBreakClass, KBTS_SET32((KBTS_WORD_BREAK_CLASS_Oep)(KBTS_WORD_BREAK_CLASS_ALep)))) + else if(KBTS__IN_SET(WordBreakClass, KBTS__SET32((KBTS_WORD_BREAK_CLASS_Oep)(KBTS_WORD_BREAK_CLASS_ALep)))) { // ZWJ x {Extended_Pictographic} if(LastWordBreakClassIncludingIgnored == KBTS_WORD_BREAK_CLASS_ZWJ) @@ -23269,7 +28605,7 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, kbts_u32 EffectiveWordBreaks = WordBreaks & ~WordUnbreaks; if(EffectiveWordBreaks & KBTS_WORD_BREAK_BITS(2, 2)) { - kbts_DoBreak(State, PositionOffset2 + WordBreak2PositionOffset, KBTS_BREAK_FLAG_WORD, 0, 0); + kbts__DoBreak(State, PositionOffset2 + WordBreak2PositionOffset, KBTS_BREAK_FLAG_WORD, 0, 0, 0); } if(EndOfText) { @@ -23291,6 +28627,7 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, kbts_s16 LineBreak3PositionOffset = State->LineBreak3PositionOffset; kbts_s16 LineBreak2PositionOffset = State->LineBreak2PositionOffset; + int HardLineBreak = 0; { // Line breaking. kbts_u64 LineBreaks = State->LineBreaks << 16; kbts_u64 LineUnbreaks = State->LineUnbreaks << 16; @@ -23300,10 +28637,10 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, #define KBTS_C2(A, B) case (KBTS_LINE_BREAK_CLASS_##A << 8) | (KBTS_LINE_BREAK_CLASS_##B) #define KBTS_C3(A, B, C) case (KBTS_LINE_BREAK_CLASS_##A << 16) | (KBTS_LINE_BREAK_CLASS_##B << 8) | KBTS_LINE_BREAK_CLASS_##C #define KBTS_C4(A, B, C, D) case (KBTS_LINE_BREAK_CLASS_##A << 24) | (KBTS_LINE_BREAK_CLASS_##B << 16) | (KBTS_LINE_BREAK_CLASS_##C << 8) | KBTS_LINE_BREAK_CLASS_##D - #define KBTS_REQUIRED_LINE_BREAK(Priority, Position) do {LineBreaks |= (kbts_u64)KBTS_LINE_BREAK_REQUIRED##Priority << ((Position) * 16);} while(0) - #define KBTS_LINE_BREAK(Priority, Position) do {LineBreaks |= (kbts_u64)KBTS_LINE_BREAK_ALLOWED##Priority << ((Position) * 16);} while(0) - #define KBTS_LINE_UNBREAK(Priority, Position) do {LineUnbreaks |= (kbts_u64)KBTS_LINE_BREAK_REQUIRED##Priority << ((Position) * 16);} while(0) - #define KBTS_LINE_UNBREAK_ASYNC(Priority, Position) do {LineUnbreaksAsync |= (kbts_u64)KBTS_LINE_BREAK_REQUIRED##Priority << ((Position) * 16);} while(0) + #define KBTS_REQUIRED_LINE_BREAK(Priority, Position) do {LineBreaks |= (kbts_u64)KBTS__LINE_BREAK_REQUIRED##Priority << ((Position) * 16);} while(0) + #define KBTS_LINE_BREAK(Priority, Position) do {LineBreaks |= (kbts_u64)KBTS__LINE_BREAK_ALLOWED##Priority << ((Position) * 16);} while(0) + #define KBTS_LINE_UNBREAK(Priority, Position) do {LineUnbreaks |= (kbts_u64)KBTS__LINE_BREAK_REQUIRED##Priority << ((Position) * 16);} while(0) + #define KBTS_LINE_UNBREAK_ASYNC(Priority, Position) do {LineUnbreaksAsync |= (kbts_u64)KBTS__LINE_BREAK_REQUIRED##Priority << ((Position) * 16);} while(0) if(EndOfText) { @@ -23344,7 +28681,7 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, } else if(LineBreakClass == KBTS_LINE_BREAK_CLASS_CJ) { - LineBreakClass = State->JapaneseLineBreakStyle == KBTS_JAPANESE_LINE_BREAK_STYLE_STRICT ? KBTS_LINE_BREAK_CLASS_NSea : KBTS_LINE_BREAK_CLASS_IDea; + LineBreakClass = (kbts_u8)((State->JapaneseLineBreakStyle == KBTS_JAPANESE_LINE_BREAK_STYLE_STRICT) ? KBTS_LINE_BREAK_CLASS_NSea : KBTS_LINE_BREAK_CLASS_IDea); } } @@ -23359,7 +28696,7 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, LineBreakHistory = (LineBreakHistory << 8) | LineBreakClass; - if(EndOfText) + if(EndOfText && (State->ConfigFlags & KBTS_BREAK_CONFIG_FLAG_END_OF_TEXT_GENERATES_HARD_LINE_BREAK)) { // Always break at the end of text. KBTS_REQUIRED_LINE_BREAK(5, 1); @@ -23379,7 +28716,23 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, KBTS_C1(BK): KBTS_C1(CR): KBTS_C1(LF): - KBTS_C1(NL): KBTS_LINE_UNBREAK(4, 1); KBTS_REQUIRED_LINE_BREAK(5, 0); break; + KBTS_C1(NL): + { + KBTS_LINE_UNBREAK(4, 1); + + // This is the only place that's not the end of text where we generate hard line breaks. + // When we see a hard line break, we want to reset the direction/script state, so that + // we generate new direction/script breaks for the new paragraph. + FlushFlags |= (KBTS__BREAK_FLUSH_FLAG_SCRIPT | + KBTS__BREAK_FLUSH_FLAG_DIRECTION_2 | + KBTS__BREAK_FLUSH_FLAG_DIRECTION_1 | + KBTS__BREAK_FLUSH_FLAG_DIRECTION_PARAGRAPH); + ScriptCount = 0; + HardLineBreak = 1; + + KBTS_REQUIRED_LINE_BREAK(5, 0); + } break; + KBTS_C1(ZW): KBTS_LINE_BREAK(4, 0); KBTS_LINE_UNBREAK(4, 1); break; KBTS_C1(BB): KBTS_LINE_UNBREAK(0, 0); break; @@ -23782,16 +29135,17 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, { kbts_u64 EffectiveLineBreaks = LineBreaks & ~(LineUnbreaks | LineUnbreaksAsync); - kbts_DoLineBreak(State, PositionOffset3 + LineBreak3PositionOffset, EffectiveLineBreaks >> 48, 0, 0); + kbts__DoLineBreak(State, PositionOffset3 + LineBreak3PositionOffset, EffectiveLineBreaks >> 48); if(EndOfText) { - kbts_DoLineBreak(State, PositionOffset2 + LineBreak2PositionOffset, EffectiveLineBreaks >> 32, 0, 0); + kbts__DoLineBreak(State, PositionOffset2 + LineBreak2PositionOffset, EffectiveLineBreaks >> 32); { // @Cleanup: This is the same flag code as DoLineBreak, but we want to use FlagState buffering for this. // The only places where we want to manually call DoBreak is for asynchronous/buffered guys. - kbts_u8 FlushFlags = 0; - if((EffectiveLineBreaks >> 16) & KBTS_LINE_BREAK_ALLOWED_MASK) FlushFlags |= KBTS_BREAK_FLAG_LINE_SOFT; - if((EffectiveLineBreaks >> 16) & KBTS_LINE_BREAK_REQUIRED_MASK) FlushFlags |= KBTS_BREAK_FLAG_LINE_HARD; - KBTS_BREAK(FlushFlags, 1); + kbts_u8 FlushedLineFlags = 0; + if((EffectiveLineBreaks >> 16) & KBTS__LINE_BREAK_ALLOWED_MASK) FlushedLineFlags |= KBTS_BREAK_FLAG_LINE_SOFT; + if((EffectiveLineBreaks >> 16) & KBTS__LINE_BREAK_REQUIRED_MASK) FlushedLineFlags |= KBTS_BREAK_FLAG_LINE_HARD; + + KBTS_BREAK(FlushedLineFlags, 1); } // Lines are never broken after the end of text. } @@ -23803,91 +29157,380 @@ static void kbts_BreakAddCodepoint_(kbts_break_state *State, kbts_u32 Codepoint, State->LineBreak3PositionOffset = LineBreak2PositionOffset; State->LastLineBreakClass = LineBreakClass; State->LineBreakHistory = LineBreakHistory; - State->LastDirection = (kbts_u8)LastDirection; if(0) { LineBreakAbsorbCharacter:; - State->LineBreak2PositionOffset -= PositionIncrement; - State->LineBreak3PositionOffset -= PositionIncrement; + State->LineBreak2PositionOffset -= (kbts_s16)PositionIncrement; + State->LineBreak3PositionOffset -= (kbts_s16)PositionIncrement; } // This always gets updated. State->LineUnbreaksAsync = LineUnbreaksAsync; } + // We flush scripts late because hard line breaks also want to flush scripts. + // + // If we have no active script at all, then either we are at the very beginning of the text, + // or we have only seen common/inherited scripts so far. + // Either way, we want everything before us to coerce to our type, so don't actually break, + // and do not update the script break position. + if((FlushFlags & KBTS__BREAK_FLUSH_FLAG_SCRIPT) && + ScriptCountAtBeginningOfUpdate) + { + kbts__DoBreak(State, ScriptPositionOffset, KBTS_BREAK_FLAG_SCRIPT, 0, 0, BreakScript); + ScriptPositionOffset = 0; + + if(HardLineBreak) + { + // Put the next script break after the newline. + ScriptPositionOffset = (kbts_s16)PositionIncrement; + } + } + + if(FlushFlags & KBTS__BREAK_FLUSH_FLAG_DIRECTION_2) + { + kbts__FlushDirection(State, &LastDirection, Bidirectional2, Bidirectional2PositionOffset); + } + if(FlushFlags & KBTS__BREAK_FLUSH_FLAG_DIRECTION_1) + { + kbts__FlushDirection(State, &LastDirection, Bidirectional1, Bidirectional1PositionOffset); + } + + if(FlushFlags & KBTS__BREAK_FLUSH_FLAG_DIRECTION_PARAGRAPH) + { + // Reset direction state for the new paragraph. + Bidirectional1 = 0; + + // Clear direction history. + // This is necessary to uphold the invariant that the first direction break is always + // on the first character of a paragraph. + LastDirection = 0; + + // CAUTION: This needs to be updated _after_ calling kbts__FlushDirection! + // Alternatively, we could load ParagraphStartPosition into a variable at the start of this function. + State->ParagraphStartPosition = State->CurrentPosition + 1; + + kbts__BreakStateStartParagraph(State); + + if(State->UserParagraphDirection == KBTS_DIRECTION_DONT_KNOW) + { + kbts__DoBreak(State, 1, KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION, 0, KBTS_DIRECTION_DONT_KNOW, 0); + } + } + + ScriptPositionOffset -= (kbts_s16)PositionIncrement; + // This is where we flush the normal breaks that don't need any special position adjustment. - kbts_DoBreak(State, PositionOffset3, (FlagState >> 24) & 0xFF, LastDirection, State->LastScripts[1]); + kbts__DoBreak(State, PositionOffset3, (FlagState >> 24) & 0xFF, 0, 0, 0); if(EndOfText) { - kbts_DoBreak(State, PositionOffset2, (FlagState >> 16) & 0xFF, 0, LastScript); - kbts_DoBreak(State, 0, (FlagState >> 8) & 0xFF, 0, Script); - kbts_DoBreak(State, PositionIncrement, FlagState & 0xFF, 0, Script); + kbts__DoBreak(State, PositionOffset2, (FlagState >> 16) & 0xFF, 0, 0, 0); + kbts__DoBreak(State, 0, (FlagState >> 8) & 0xFF, 0, 0, 0); + kbts__DoBreak(State, (int)PositionIncrement, FlagState & 0xFF, 0, 0, 0); } State->FlagState = FlagState; - State->Flags |= KBTS_BREAK_STATE_FLAG_STARTED; - if(EndOfText) State->Flags |= KBTS_BREAK_STATE_FLAG_END; + Flags |= KBTS_BREAK_STATE_FLAG_STARTED; + if(EndOfText) Flags |= KBTS_BREAK_STATE_FLAG_END; + State->Flags = Flags; State->PositionOffset2 = (kbts_s16)-(int)PositionIncrement; State->PositionOffset3 = (kbts_s16)(PositionOffset2 - (int)PositionIncrement); State->CurrentPosition += PositionIncrement; - State->LastScripts[1] = State->LastScripts[0]; - State->LastScripts[0] = Script; + if(FlushFlags & KBTS__BREAK_FLUSH_FLAG_DIRECTION_2) + { + // Only update the buffer if we've actually flushed something. + State->BidirectionalClass2 = Bidirectional1; + State->BidirectionalClass1 = BidirectionalClass; + State->Bidirectional2PositionOffset = State->Bidirectional1PositionOffset - (kbts_s16)PositionIncrement; + State->Bidirectional1PositionOffset = (kbts_s16)-(int)PositionIncrement; + } + State->LastDirection = (kbts_u8)LastDirection; + + State->ScriptPositionOffset = ScriptPositionOffset; + State->ScriptCount = ScriptCount; #undef KBTS_BREAK #undef KBTS_BREAK2 } -KBTS_EXPORT void kbts_BreakFlush(kbts_break_state *State) +KBTS_EXPORT void kbts_BreakEnd(kbts_break_state *State) { // We pass 3, aka. ASCII end-of-text, at the end of text. - kbts_BreakAddCodepoint_(State, 3, 0, 1); + kbts__BreakAddCodepoint(State, 3, 0, 1); } -KBTS_EXPORT void kbts_BreakAddCodepoint(kbts_break_state *State, kbts_u32 Codepoint, kbts_u32 PositionIncrement, int EndOfText) +KBTS_EXPORT void kbts_BreakAddCodepoint(kbts_break_state *State, int Codepoint, int PositionIncrement, int EndOfText) { - kbts_BreakAddCodepoint_(State, Codepoint, PositionIncrement, 0); - if(EndOfText) kbts_BreakFlush(State); + kbts__BreakAddCodepoint(State, Codepoint, (kbts_u32)PositionIncrement, 0); + + if(EndOfText) + { + kbts_BreakEnd(State); + } } KBTS_EXPORT int kbts_Break(kbts_break_state *State, kbts_break *Break) { int Result = 0; - kbts_un Threshold = State->Flags & KBTS_BREAK_STATE_FLAG_END ? 0 : KBTS_BREAK_REORDER_BUFFER_FLUSH_THRESHOLD; - if(kbts_BreakStateIsValid(State) && (State->BreakCount > Threshold)) + if(State->BreakCount) { - kbts_break *ToFlush = &State->Breaks[State->BreakCount - 1]; - // @Incomplete: Handle wrapping. - if(ToFlush->Position >= State->LastFlushedBreakPosition) - { - *Break = *ToFlush; - State->LastFlushedBreakPosition = ToFlush->Position; - State->BreakCount -= 1; - Result = 1; - } - else - { - State->Flags |= KBTS_BREAK_STATE_FLAG_RAN_OUT_OF_REORDER_BUFFER_SPACE; - } + kbts_break *ToFlush = &State->Breaks[--State->BreakCount]; + + *Break = *ToFlush; + Result = 1; } return Result; } -KBTS_EXPORT void kbts_BeginBreak(kbts_break_state *State, kbts_direction MainDirection, kbts_japanese_line_break_style JapaneseLineBreakStyle) +KBTS_EXPORT void kbts_GuessTextProperties(void *Text, int TextSizeInBytes, kbts_text_format Format, kbts_direction *Direction_, kbts_script *Script_) +{ + kbts_script Script = KBTS_SCRIPT_DONT_KNOW; + kbts_direction Direction = KBTS_DIRECTION_DONT_KNOW; + + if(Text && (TextSizeInBytes > 0) && Format) + { + const char *At = (const char *)Text; + const char *End = (const char *)Text + TextSizeInBytes; + + kbts_break_state BreakState; + kbts_BreakBegin(&BreakState, KBTS_DIRECTION_DONT_KNOW, KBTS_JAPANESE_LINE_BREAK_STYLE_NORMAL, 0); + + while(((Script == KBTS_SCRIPT_DONT_KNOW) || + (Direction == KBTS_DIRECTION_DONT_KNOW)) && + (At < End)) + { + kbts_u32 Codepoint = 0; + kbts_u32 PositionIncrement = 1; + + switch(Format) + { + case KBTS_TEXT_FORMAT_UTF32: + { + Codepoint = *(kbts_u32 *)At; + PositionIncrement = 4; + + } break; + + case KBTS_TEXT_FORMAT_UTF8: + { + kbts_decode Decode = kbts_DecodeUtf8(At, End - At); + + PositionIncrement = Decode.SourceCharactersConsumed; + + if(Decode.Valid) + { + Codepoint = Decode.Codepoint; + } + } break; + } + + kbts_BreakAddCodepoint(&BreakState, Codepoint, PositionIncrement, (At + PositionIncrement) == End); + kbts_break Break; + while(kbts_Break(&BreakState, &Break)) + { + if((Script == KBTS_SCRIPT_DONT_KNOW) && (Break.Flags & KBTS_BREAK_FLAG_SCRIPT)) + { + Script = Break.Script; + } + + if((Direction == KBTS_DIRECTION_DONT_KNOW) && (Break.Flags & KBTS_BREAK_FLAG_DIRECTION)) + { + Direction = Break.Direction; + } + } + + At += PositionIncrement; + } + } + + if(Script_) + { + *Script_ = Script; + } + + if(Direction_) + { + *Direction_ = Direction; + } +} + +KBTS_EXPORT void kbts_GuessTextPropertiesUtf32(const int *Utf32, int Utf32Count, kbts_direction *Direction, kbts_script *Script) +{ + kbts_GuessTextProperties((void *)Utf32, sizeof(int) * Utf32Count, KBTS_TEXT_FORMAT_UTF32, Direction, Script); +} + +KBTS_EXPORT void kbts_GuessTextPropertiesUtf8(const char *Utf8, int Utf8Length, kbts_direction *Direction, kbts_script *Script) +{ + kbts_GuessTextProperties((void *)Utf8, Utf8Length, KBTS_TEXT_FORMAT_UTF8, Direction, Script); +} + +KBTS_EXPORT void kbts_BreakBegin(kbts_break_state *State, kbts_direction ParagraphDirection, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags) { if(State) { + // @Speed: Clearing all the brackets isn't great. KBTS_MEMSET(State, 0, sizeof(*State)); - State->MainDirection = (kbts_u8)MainDirection; + State->UserParagraphDirection = (kbts_u8)ParagraphDirection; + State->ParagraphDirection = (kbts_u8)ParagraphDirection; State->JapaneseLineBreakStyle = JapaneseLineBreakStyle; + State->ConfigFlags = ConfigFlags; + + // Force a direction break at the start of the text. + State->LastDirection = KBTS_DIRECTION_COUNT; + + // These should be out-of-bounds while the buffers haven't filled up. + State->PositionOffset2 = -100; + State->PositionOffset3 = -100; + State->WordBreak2PositionOffset = -100; + State->LineBreak2PositionOffset = -100; + State->LineBreak3PositionOffset = -100; + State->Bidirectional1PositionOffset = -100; + State->Bidirectional2PositionOffset = -100; + + kbts__BreakStateStartParagraph(State); + + if(ParagraphDirection) + { + kbts__DoBreak(State, 0, KBTS_BREAK_FLAG_PARAGRAPH_DIRECTION, 0, ParagraphDirection, 0); + } } } +KBTS_EXPORT void kbts_BreakEntireString(kbts_direction Direction, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags, + const void *Input, int InputSizeInBytes, kbts_text_format InputFormat, + kbts_break *Breaks, int IBreakCapacity, int *BreakCount, + kbts_break_flags *BreakFlags, int IBreakFlagCapacity, int *BreakFlagCount) +{ + kbts_break_state BreakState = KBTS__ZERO; + kbts_BreakBegin(&BreakState, Direction, JapaneseLineBreakStyle, ConfigFlags); + + char *InputElement = (char *)Input; + char *End = (char *)Input + InputSizeInBytes; + kbts_un BreaksWritten = 0; + kbts_un MaxBreakPosition = 0; + kbts_un BreakCapacity = (kbts_un)IBreakCapacity; + kbts_un BreakFlagCapacity = (kbts_un)IBreakFlagCapacity; + + if(BreakFlags && BreakFlagCapacity) + { + KBTS_MEMSET(BreakFlags, 0, sizeof(kbts_break_flags) * BreakFlagCapacity); + } + + while(InputElement < End) + { + kbts_u32 Codepoint = 0; + kbts_un InputElementSize = 1; + kbts_un SourceCharacterCount = 1; + + switch(InputFormat) + { + case KBTS_TEXT_FORMAT_UTF32: + { + Codepoint = *(kbts_u32 *)InputElement; + + InputElementSize = sizeof(kbts_u32); + } break; + + case KBTS_TEXT_FORMAT_UTF8: + { + kbts_decode Decode = kbts_DecodeUtf8(InputElement, End - InputElement); + + if(Decode.Valid) + { + Codepoint = Decode.Codepoint; + + InputElementSize = Decode.SourceCharactersConsumed; + SourceCharacterCount = Decode.SourceCharactersConsumed; + } + } break; + } + + InputElement += InputElementSize; + + kbts_BreakAddCodepoint(&BreakState, Codepoint, (kbts_u32)SourceCharacterCount, InputElement >= End); + kbts_break Break; + while(kbts_Break(&BreakState, &Break)) + { + if(Breaks && (BreaksWritten < BreakCapacity)) + { + int Found = 0; + kbts_un ExistingBreakCount = KBTS__MIN(BreaksWritten, BreakCapacity); + + // @Speed: Binary search! + for(kbts_un ExistingBreakIndex = ExistingBreakCount; + ExistingBreakIndex; + --ExistingBreakIndex) + { + kbts_break *Existing = &Breaks[ExistingBreakIndex - 1]; + + if(Existing->Position == Break.Position) + { + Existing->Flags |= Break.Flags; + + if(Break.Flags & KBTS_BREAK_FLAG_SCRIPT) + { + Existing->Script = Break.Script; + } + + if(Break.Flags & KBTS_BREAK_FLAG_DIRECTION) + { + Existing->Direction = Break.Direction; + } + + Found = 1; + + break; + } + } + + if(!Found) + { + Breaks[BreaksWritten] = Break; + } + } + + if(BreakFlags && ((kbts_u32)Break.Position < BreakFlagCapacity)) + { + BreakFlags[Break.Position] |= Break.Flags; + } + + MaxBreakPosition = KBTS__MAX(MaxBreakPosition, (kbts_u32)Break.Position); + + BreaksWritten += 1; + } + } + + if(!Breaks && BreakCount) + { + *BreakCount = (int)BreaksWritten; + } + if(!BreakFlags && BreakFlagCount) + { + *BreakFlagCount = (int)(MaxBreakPosition + 1); + } +} + +KBTS_EXPORT void kbts_BreakEntireStringUtf32(kbts_direction Direction, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags, + const int *Utf32, int Utf32Count, + kbts_break *Breaks, int BreakCapacity, int *BreakCount, + kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount) +{ + kbts_BreakEntireString(Direction, JapaneseLineBreakStyle, ConfigFlags, Utf32, sizeof(int) * Utf32Count, KBTS_TEXT_FORMAT_UTF32, Breaks, BreakCapacity, BreakCount, BreakFlags, BreakFlagCapacity, BreakFlagCount); +} +KBTS_EXPORT void kbts_BreakEntireStringUtf8(kbts_direction Direction, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags, + const char *Utf8, int Utf8Length, + kbts_break *Breaks, int BreakCapacity, int *BreakCount, + kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount) +{ + kbts_BreakEntireString(Direction, JapaneseLineBreakStyle, ConfigFlags, Utf8, Utf8Length, KBTS_TEXT_FORMAT_UTF8, Breaks, BreakCapacity, BreakCount, BreakFlags, BreakFlagCapacity, BreakFlagCount); +} + KBTS_EXPORT kbts_decode kbts_DecodeUtf8(const char *Utf8, kbts_un Length) { - kbts_decode Result = KBTS_ZERO; + kbts_decode Result = KBTS__ZERO; const char *Utf8Start = Utf8; if(Length) @@ -23939,7 +29582,7 @@ KBTS_EXPORT kbts_decode kbts_DecodeUtf8(const char *Utf8, kbts_un Length) if(Length > FollowupCharacterCount) { - KBTS_FOR(FollowupCharacterIndex, 0, FollowupCharacterCount) + KBTS__FOR(FollowupCharacterIndex, 0, FollowupCharacterCount) { kbts_u8 C = (kbts_u8)*Utf8++; @@ -23966,7 +29609,42 @@ KBTS_EXPORT kbts_decode kbts_DecodeUtf8(const char *Utf8, kbts_un Length) return Result; } -KBTS_EXPORT int kbts_ShaperIsComplex(kbts_shaper Shaper) +KBTS_EXPORT kbts_encode_utf8 kbts_EncodeUtf8(int Codepoint) +{ + kbts_encode_utf8 Result = KBTS__ZERO; + + if(Codepoint <= 0x7F) + { + Result.Encoded[0] = (char)Codepoint; + Result.EncodedLength = 1; + } + else if(Codepoint <= 0x7FF) + { + Result.Encoded[1] = (Codepoint & 0x3F) | 0x80; + Result.Encoded[0] = ((Codepoint >> 6) & 0x1F) | 0xC0; + Result.EncodedLength = 2; + } + else if(Codepoint <= 0xFFFF) + { + Result.Encoded[2] = (Codepoint & 0x3F) | 0x80; + Result.Encoded[1] = ((Codepoint >> 6) & 0x3F) | 0x80; + Result.Encoded[0] = ((Codepoint >> 12) & 0xF) | 0xE0; + Result.EncodedLength = 3; + } + else if(Codepoint <= 0x10FFFF) + { + Result.Encoded[3] = (Codepoint & 0x3F) | 0x80; + Result.Encoded[2] = ((Codepoint >> 6) & 0x3F) | 0x80; + Result.Encoded[1] = ((Codepoint >> 12) & 0x3F) | 0x80; + Result.Encoded[0] = ((Codepoint >> 18) & 0x7) | 0xF0; + Result.EncodedLength = 4; + } + + Result.Valid = Result.EncodedLength > 0; + return Result; +} + +static int kbts__ShaperIsComplex(kbts_shaper Shaper) { int Result = Shaper != KBTS_SHAPER_DEFAULT; // @Incomplete? @@ -23975,8 +29653,13 @@ KBTS_EXPORT int kbts_ShaperIsComplex(kbts_shaper Shaper) KBTS_EXPORT int kbts_ScriptIsComplex(kbts_script Script) { - kbts_script_properties *Properties = &kbts_ScriptProperties[Script]; - int Result = kbts_ShaperIsComplex(Properties->Shaper); + if(Script >= KBTS_SCRIPT_COUNT) + { + Script = KBTS_SCRIPT_DONT_KNOW; + } + + kbts__script_properties *Properties = &kbts__ScriptProperties[Script]; + int Result = kbts__ShaperIsComplex(Properties->Shaper); return Result; } From 6002a29c515e81f98becb9398ec040adc243bf72 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 11:41:35 +0000 Subject: [PATCH 015/766] Fix indentation --- vendor/kb_text_shape/kb_text_shape_types.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/kb_text_shape/kb_text_shape_types.odin b/vendor/kb_text_shape/kb_text_shape_types.odin index 6c4465319..b391ef0e4 100644 --- a/vendor/kb_text_shape/kb_text_shape_types.odin +++ b/vendor/kb_text_shape/kb_text_shape_types.odin @@ -1933,7 +1933,7 @@ break_state :: struct { } decode :: struct { - Codepoint: rune, + Codepoint: rune, SourceCharactersConsumed: c.int, Valid: b32, From c284fcb3a319029176445589fca486645da4a565 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 12:10:50 +0000 Subject: [PATCH 016/766] Add some examples to the docs; Improve numerous procedures --- vendor/kb_text_shape/doc.odin | 59 +++++++++++++++ vendor/kb_text_shape/kb_text_shape_procs.odin | 74 +++++++++++++++++-- 2 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 vendor/kb_text_shape/doc.odin diff --git a/vendor/kb_text_shape/doc.odin b/vendor/kb_text_shape/doc.odin new file mode 100644 index 000000000..487d4a8db --- /dev/null +++ b/vendor/kb_text_shape/doc.odin @@ -0,0 +1,59 @@ +/* + Bindings for [[ Jimmy Lefevre's Text Shape ; https://github.com/JimmyLefevre/kb ]] Unicode text segmentation and OpenType shaping. + + Example: + // Basic + OdinAllocator := context.allocator + + FontData, _ := os.read_entire_file("myfonts.ttf", OdinAllocator) + + Context := kbts.CreateShapeContext(kbts.AllocatorFromOdinAllocator(&OdinAllocator)) + kbts.ShapePushFontFromMemory(Context, FontData, 0) + + kbts.ShapeBegin(Context, .DONT_KNOW, .DONT_KNOW) + kbts.ShapeUtf8(Context, "Let's shape something!", .CODEPOINT_INDEX) + kbts.ShapeEnd(Context) + + CursorX, CursorY: c.int = 0, 0 + for Run in kbts.ShapeRun(Context) { + Run := Run + for Glyph in kbts.GlyphIteratorNext(&Run.Glyphs) { + GlyphX := CursorX + Glyph.OffsetX + GlyphY := CursorY + Glyph.OffsetY + + _ = GlyphX + _ = GlyphY + // DisplayGlyph(Glyph.Id, GlyphX, GlyphY) + + CursorX += Glyph.AdvanceX + CursorY += Glyph.AdvanceY + } + } + + Example: + // Font collections + OdinAllocator := context.allocator + + FontData, _ := os.read_entire_file("myfonts.ttf", OdinAllocator) + Font := kbts.FontFromMemory(FontData, 0, kbts.AllocatorFromOdinAllocator(&OdinAllocator)) + + _ = kbts.ShapePushFont(Context, &Font) + + FontCount := kbts.FontCount(FontData) + for FontIndex in 1.. c.int --- PlaceShapeContext :: proc(Allocator: allocator_function, AllocatorData: rawptr, Memory: rawptr) -> ^shape_context --- - PlaceShapeContextFixedMemory :: proc(Memory: rawptr, Size: c.int) -> ^shape_context --- CreateShapeContext :: proc(Allocator: allocator_function, AllocatorData: rawptr) -> ^shape_context --- DestroyShapeContext :: proc(Context: ^shape_context) --- - ShapePushFontFromMemory :: proc(Context: ^shape_context, Memory: rawptr, Size: c.int, FontIndex: c.int) -> ^font --- ShapePushFont :: proc(Context: ^shape_context, Font: ^font) -> ^font --- ShapePopFont :: proc(Context: ^shape_context) -> ^font --- ShapeBegin :: proc(Context: ^shape_context, ParagraphDirection: direction, Language: language) --- ShapeEnd :: proc(Context: ^shape_context) --- - ShapePushFeature :: proc(Context: ^shape_context, FeatureTag: u32, Value: c.int) --- - ShapePopFeature :: proc(Context: ^shape_context, FeatureTag: u32) -> b32 --- + ShapePushFeature :: proc(Context: ^shape_context, FeatureTag: feature_tag, Value: c.int) --- + ShapePopFeature :: proc(Context: ^shape_context, FeatureTag: feature_tag) -> b32 --- ShapeCodepoint :: proc(Context: ^shape_context, Codepoint: rune) --- ShapeCodepointWithUserId :: proc(Context: ^shape_context, Codepoint: rune, UserId: c.int) --- ShapeError :: proc(Context: ^shape_context) -> shape_error --- @@ -40,6 +38,23 @@ foreign lib { ShapeManualBreak :: proc(Context: ^shape_context) --- } +@(require_results) +PlaceShapeContextFixedMemory :: proc "c" (Memory: []byte) -> ^shape_context { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + PlaceShapeContextFixedMemory :: proc(Memory: rawptr, Size: c.int) -> ^shape_context --- + } + return PlaceShapeContextFixedMemory(raw_data(Memory), c.int(len(Memory))) +} + +ShapePushFontFromMemory :: proc "c" (Context: ^shape_context, Memory: []byte, FontIndex: c.int) -> ^font { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + ShapePushFontFromMemory :: proc(Context: ^shape_context, Memory: rawptr, Size: c.int, FontIndex: c.int) -> ^font --- + } + return ShapePushFontFromMemory(Context, raw_data(Memory), c.int(len(Memory)), FontIndex) +} + @(require_results) ShapeRun :: proc "contextless" (Context: ^shape_context) -> (Run: run, ok: b32) { @(default_calling_convention="c", link_prefix="kbts_", require_results) @@ -105,8 +120,6 @@ ShapeCodepointIteratorNext :: proc "contextless" (It: ^shape_codepoint_iterator) // @(default_calling_convention="c", link_prefix="kbts_", require_results) foreign lib { - FontCount :: proc(FileData: rawptr, FileSize: c.int) -> b32 --- - FontFromMemory :: proc(FileData: rawptr, FileSize: c.int, FontIndex: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> font --- FreeFont :: proc(Font: ^font) --- FontIsValid :: proc(Font: ^font) -> b32 --- LoadFont :: proc(Font: ^font, State: ^load_font_state, FontData: rawptr, FontDataSize: c.int, FontIndex: c.int, ScratchSize_: ^c.int, OutputSize_: ^c.int) -> load_font_error --- @@ -135,6 +148,24 @@ foreign lib { DestroyGlyphConfig :: proc(Config: ^glyph_config) --- } +@(require_results) +FontCount :: proc "c" (FileData: []byte) -> c.int { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + FontCount :: proc(FileData: rawptr, FileSize: c.int) -> c.int --- + } + return FontCount(raw_data(FileData), c.int(len(FileData))) +} + +@(require_results) +FontFromMemory :: proc "c" (FileData: []byte, FontIndex: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> font { + @(default_calling_convention="c", link_prefix="kbts_", require_results) + foreign lib { + FontFromMemory :: proc(FileData: rawptr, FileSize: c.int, FontIndex: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> font --- + } + return FontFromMemory(raw_data(FileData), c.int(len(FileData)), FontIndex, Allocator, AllocatorData) +} + @(require_results) ShapeDirect :: proc "contextless" (Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Allocator: allocator_function, AllocatorData: rawptr) -> (Output: glyph_iterator, err: shape_error) { @@ -321,4 +352,31 @@ GuessTextPropertiesUtf8 :: proc "contextless" (Utf8: string) -> (Direction: dire } GuessTextPropertiesUtf8(cstring(raw_data(Utf8)), c.int(len(Utf8)), &Direction, &Script) return -} \ No newline at end of file +} + + + + +@(require_results) +AllocatorFromOdinAllocator :: proc "contextless" (allocator: ^runtime.Allocator) -> (Allocator: allocator_function, AllocatorData: rawptr) { + allocator_function :: proc "c" (Data: rawptr, Op: ^allocator_op) { + if Data == nil { + return + } + context = runtime.default_context() + context.allocator = (^runtime.Allocator)(Data)^ + + switch Op.Kind { + case .NONE: + return + case .ALLOCATE: + data, _ := runtime.mem_alloc(int(Op.Allocate.Size), runtime.DEFAULT_ALIGNMENT) + Op.Allocate.Pointer = raw_data(data) + Op.Allocate.Size = u32(len(data)) + case .FREE: + _ = runtime.mem_free(Op.Free.Pointer) + } + } + + return allocator_function, rawptr(allocator) +} From b2f49e49793d7bc56c365c0844be84302f700c0a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 12:19:42 +0000 Subject: [PATCH 017/766] Use `bit_field` where appropriate and improve formatting --- vendor/kb_text_shape/kb_text_shape_procs.odin | 62 +++++++++--------- vendor/kb_text_shape/kb_text_shape_types.odin | 65 +++++++++++++++---- 2 files changed, 84 insertions(+), 43 deletions(-) diff --git a/vendor/kb_text_shape/kb_text_shape_procs.odin b/vendor/kb_text_shape/kb_text_shape_procs.odin index e86123fd1..c4e75fbd7 100644 --- a/vendor/kb_text_shape/kb_text_shape_procs.odin +++ b/vendor/kb_text_shape/kb_text_shape_procs.odin @@ -19,23 +19,23 @@ import "core:c" // @(default_calling_convention="c", link_prefix="kbts_", require_results) foreign lib { - SizeOfShapeContext :: proc() -> c.int --- - PlaceShapeContext :: proc(Allocator: allocator_function, AllocatorData: rawptr, Memory: rawptr) -> ^shape_context --- - CreateShapeContext :: proc(Allocator: allocator_function, AllocatorData: rawptr) -> ^shape_context --- - DestroyShapeContext :: proc(Context: ^shape_context) --- - ShapePushFont :: proc(Context: ^shape_context, Font: ^font) -> ^font --- - ShapePopFont :: proc(Context: ^shape_context) -> ^font --- - ShapeBegin :: proc(Context: ^shape_context, ParagraphDirection: direction, Language: language) --- - ShapeEnd :: proc(Context: ^shape_context) --- - ShapePushFeature :: proc(Context: ^shape_context, FeatureTag: feature_tag, Value: c.int) --- - ShapePopFeature :: proc(Context: ^shape_context, FeatureTag: feature_tag) -> b32 --- - ShapeCodepoint :: proc(Context: ^shape_context, Codepoint: rune) --- - ShapeCodepointWithUserId :: proc(Context: ^shape_context, Codepoint: rune, UserId: c.int) --- - ShapeError :: proc(Context: ^shape_context) -> shape_error --- - ShapeBeginManualRuns :: proc(Context: ^shape_context) --- - ShapeNextManualRun :: proc(Context: ^shape_context, Direction: direction, Script: script) --- - ShapeEndManualRuns :: proc(Context: ^shape_context) --- - ShapeManualBreak :: proc(Context: ^shape_context) --- + SizeOfShapeContext :: proc() -> c.int --- + PlaceShapeContext :: proc(Allocator: allocator_function, AllocatorData: rawptr, Memory: rawptr) -> ^shape_context --- + CreateShapeContext :: proc(Allocator: allocator_function, AllocatorData: rawptr) -> ^shape_context --- + DestroyShapeContext :: proc(Context: ^shape_context) --- + ShapePushFont :: proc(Context: ^shape_context, Font: ^font) -> ^font --- + ShapePopFont :: proc(Context: ^shape_context) -> ^font --- + ShapeBegin :: proc(Context: ^shape_context, ParagraphDirection: direction, Language: language) --- + ShapeEnd :: proc(Context: ^shape_context) --- + ShapePushFeature :: proc(Context: ^shape_context, FeatureTag: feature_tag, Value: c.int) --- + ShapePopFeature :: proc(Context: ^shape_context, FeatureTag: feature_tag) -> b32 --- + ShapeCodepoint :: proc(Context: ^shape_context, Codepoint: rune) --- + ShapeCodepointWithUserId :: proc(Context: ^shape_context, Codepoint: rune, UserId: c.int) --- + ShapeError :: proc(Context: ^shape_context) -> shape_error --- + ShapeBeginManualRuns :: proc(Context: ^shape_context) --- + ShapeNextManualRun :: proc(Context: ^shape_context, Direction: direction, Script: script) --- + ShapeEndManualRuns :: proc(Context: ^shape_context) --- + ShapeManualBreak :: proc(Context: ^shape_context) --- } @(require_results) @@ -120,17 +120,17 @@ ShapeCodepointIteratorNext :: proc "contextless" (It: ^shape_codepoint_iterator) // @(default_calling_convention="c", link_prefix="kbts_", require_results) foreign lib { - FreeFont :: proc(Font: ^font) --- - FontIsValid :: proc(Font: ^font) -> b32 --- - LoadFont :: proc(Font: ^font, State: ^load_font_state, FontData: rawptr, FontDataSize: c.int, FontIndex: c.int, ScratchSize_: ^c.int, OutputSize_: ^c.int) -> load_font_error --- - PlaceBlob :: proc(Font: ^font, State: ^load_font_state, ScratchMemory: rawptr, OutputMemory: rawptr) -> load_font_error --- - GetFontInfo :: proc(Font: ^font, Info: ^font_info) --- + FreeFont :: proc(Font: ^font) --- + FontIsValid :: proc(Font: ^font) -> b32 --- + LoadFont :: proc(Font: ^font, State: ^load_font_state, FontData: rawptr, FontDataSize: c.int, FontIndex: c.int, ScratchSize_: ^c.int, OutputSize_: ^c.int) -> load_font_error --- + PlaceBlob :: proc(Font: ^font, State: ^load_font_state, ScratchMemory: rawptr, OutputMemory: rawptr) -> load_font_error --- + GetFontInfo :: proc(Font: ^font, Info: ^font_info) --- // A shape_config is a bag of pre-computed data for a specific shaping setup. - SizeOfShapeConfig :: proc(Font: ^font, Script: script, Language: language) -> b32 --- - PlaceShapeConfig :: proc(Font: ^font, Script: script, Language: language, Memory: rawptr) -> ^shape_config --- - CreateShapeConfig :: proc(Font: ^font, Script: script, Language: language, Allocator: allocator_function, AllocatorData: rawptr) -> ^shape_config --- - DestroyShapeConfig :: proc(Config: ^shape_config) --- + SizeOfShapeConfig :: proc(Font: ^font, Script: script, Language: language) -> b32 --- + PlaceShapeConfig :: proc(Font: ^font, Script: script, Language: language, Memory: rawptr) -> ^shape_config --- + CreateShapeConfig :: proc(Font: ^font, Script: script, Language: language, Allocator: allocator_function, AllocatorData: rawptr) -> ^shape_config --- + DestroyShapeConfig :: proc(Config: ^shape_config) --- // A glyph_storage holds and recycles glyph data. InitializeGlyphStorage :: proc(Storage: ^glyph_storage, Allocator: allocator_function, AllocatorData: rawptr) -> b32 --- @@ -145,7 +145,7 @@ foreign lib { // A glyph_config specifies glyph-specific shaping parameters. // A single glyph_config can be shared by multiple glyphs. - DestroyGlyphConfig :: proc(Config: ^glyph_config) --- + DestroyGlyphConfig :: proc(Config: ^glyph_config) --- } @(require_results) @@ -303,10 +303,10 @@ foreign lib { FontCoverageTestCodepoint :: proc(Test: ^font_coverage_test, Codepoint: rune) --- FontCoverageTestEnd :: proc(Test: ^font_coverage_test) -> b32 --- - EncodeUtf8 :: proc(Codepoint: rune) -> encode_utf8 --- - ScriptDirection :: proc(Script: script) -> direction --- - ScriptIsComplex :: proc(Script: script) -> b32 --- - ScriptTagToScript :: proc(Tag: script_tag) -> script --- + EncodeUtf8 :: proc(Codepoint: rune) -> encode_utf8 --- + ScriptDirection :: proc(Script: script) -> direction --- + ScriptIsComplex :: proc(Script: script) -> b32 --- + ScriptTagToScript :: proc(Tag: script_tag) -> script --- } @(require_results) diff --git a/vendor/kb_text_shape/kb_text_shape_types.odin b/vendor/kb_text_shape/kb_text_shape_types.odin index b391ef0e4..f56d5436d 100644 --- a/vendor/kb_text_shape/kb_text_shape_types.odin +++ b/vendor/kb_text_shape/kb_text_shape_types.odin @@ -1868,8 +1868,12 @@ break_type :: struct { bracket :: struct { Codepoint: rune, Position: u32, - Direction: u8, - Script: u8, + using DirectionBitField: bit_field u8 { + Direction: direction | 8, + }, + using ScriptBitField: bit_field u8 { + Script: script | 8, + }, } // In the worst case, a single call to BreakAddCodepoint would generate 4 breaks. @@ -1899,26 +1903,63 @@ break_state :: struct { BracketCount: u32, Flags: break_state_flags, - FlagState: u32, // u8(break_flags)x4 + FlagState: bit_field u32 { + _0: u32 | 8, // break_flags + _1: u32 | 8, // break_flags + _2: u32 | 8, // break_flags + _3: u32 | 8, // break_flags + }, PositionOffset2: i16, PositionOffset3: i16, - WordBreakHistory: u32, // u8x4 - WordBreaks: u16, // u4x4 - WordUnbreaks: u16, // u4x4 + WordBreakHistory: bit_field u32 { + _0: u32 | 8, + _1: u32 | 8, + _2: u32 | 8, + _3: u32 | 8, + }, + WordBreaks, + WordUnbreaks: bit_field u16 { + _0: u16 | 4, + _1: u16 | 4, + _2: u16 | 4, + _3: u16 | 4, + }, WordBreak2PositionOffset: i16, - LineBreaks: u64, // u16x4 + LineBreaks: bit_field u64 { + _0: u64 | 16, + _1: u64 | 16, + _2: u64 | 16, + _3: u64 | 16, + }, // Instead of staying synchronized with LineBreaks/LineUnbreaks, // this advances every character always. // (This is only needed because ZWJ can create an unbreak while simultaneously being ignored.) - LineUnbreaksAsync: u64, // u16x4 - LineUnbreaks: u64, // u16x4 - LineBreakHistory: u32, // u8(line_break_class)x4 + LineUnbreaksAsync: bit_field u64 { + _0: u64 | 16, + _1: u64 | 16, + _2: u64 | 16, + _3: u64 | 16, + }, + LineUnbreaks: bit_field u64 { + _0: u64 | 16, + _1: u64 | 16, + _2: u64 | 16, + _3: u64 | 16, + }, + LineBreakHistory: bit_field u32 { + _0: u32 | 8, + _1: u32 | 8, + _2: u32 | 8, + _3: u32 | 8, + }, LineBreak2PositionOffset: i16, LineBreak3PositionOffset: i16, - LastDirection: u8, + using LastDirectionBitField: bit_field u8 { + LastDirection: direction | 8, + }, BidirectionalClass2: u8, BidirectionalClass1: u8, Bidirectional1PositionOffset: i16, @@ -2012,7 +2053,7 @@ glyph :: struct { // Unicode properties filled in by CodepointToGlyph. JoiningType: unicode_joining_type, - UnicodeFlags: u8, + UnicodeFlags: unicode_flags, SyllabicClass: u8, SyllabicPosition: u8, UseClass: u8, From 0bbb65614745e5a9ed0347f17d4c5aa3cbabe9d8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 12:23:17 +0000 Subject: [PATCH 018/766] Use `b32` for `Error` fields instead of `c.int` --- vendor/kb_text_shape/kb_text_shape_types.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vendor/kb_text_shape/kb_text_shape_types.odin b/vendor/kb_text_shape/kb_text_shape_types.odin index f56d5436d..2d29267ae 100644 --- a/vendor/kb_text_shape/kb_text_shape_types.odin +++ b/vendor/kb_text_shape/kb_text_shape_types.odin @@ -2108,7 +2108,7 @@ arena :: struct { BlockSentinel: arena_block_header, FreeBlockSentinel: arena_block_header, - Error: c.int, + Error: b32, } glyph_storage :: struct { @@ -2117,7 +2117,7 @@ glyph_storage :: struct { GlyphSentinel: glyph, FreeGlyphSentinel: glyph, - Error: c.int, + Error: b32, } glyph_parent :: struct { @@ -2129,8 +2129,8 @@ font_coverage_test :: struct { Font: ^font, BaseCodepoint: rune, - CurrentBaseError: c.int, - Error: c.int, + CurrentBaseError: b32, + Error: b32, BaseParents: [MAXIMUM_RECOMPOSITION_PARENTS]glyph_parent `fmt:"v,BaseParentCount"`, BaseParentCount: u32, From 9a2a240293637e9205f4bc58bdf911c726f9211b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 12:59:14 +0000 Subject: [PATCH 019/766] Wrap `LoadFont`; More styling changes --- vendor/kb_text_shape/doc.odin | 4 +- vendor/kb_text_shape/kb_text_shape_procs.odin | 207 +++++++++--------- 2 files changed, 109 insertions(+), 102 deletions(-) diff --git a/vendor/kb_text_shape/doc.odin b/vendor/kb_text_shape/doc.odin index 487d4a8db..685b0d5a0 100644 --- a/vendor/kb_text_shape/doc.odin +++ b/vendor/kb_text_shape/doc.odin @@ -21,9 +21,7 @@ GlyphX := CursorX + Glyph.OffsetX GlyphY := CursorY + Glyph.OffsetY - _ = GlyphX - _ = GlyphY - // DisplayGlyph(Glyph.Id, GlyphX, GlyphY) + DisplayGlyph(Glyph.Id, GlyphX, GlyphY) CursorX += Glyph.AdvanceX CursorY += Glyph.AdvanceY diff --git a/vendor/kb_text_shape/kb_text_shape_procs.odin b/vendor/kb_text_shape/kb_text_shape_procs.odin index c4e75fbd7..686328b28 100644 --- a/vendor/kb_text_shape/kb_text_shape_procs.odin +++ b/vendor/kb_text_shape/kb_text_shape_procs.odin @@ -40,59 +40,59 @@ foreign lib { @(require_results) PlaceShapeContextFixedMemory :: proc "c" (Memory: []byte) -> ^shape_context { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - PlaceShapeContextFixedMemory :: proc(Memory: rawptr, Size: c.int) -> ^shape_context --- + kbts_PlaceShapeContextFixedMemory :: proc(Memory: rawptr, Size: c.int) -> ^shape_context --- } - return PlaceShapeContextFixedMemory(raw_data(Memory), c.int(len(Memory))) + return kbts_PlaceShapeContextFixedMemory(raw_data(Memory), c.int(len(Memory))) } ShapePushFontFromMemory :: proc "c" (Context: ^shape_context, Memory: []byte, FontIndex: c.int) -> ^font { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - ShapePushFontFromMemory :: proc(Context: ^shape_context, Memory: rawptr, Size: c.int, FontIndex: c.int) -> ^font --- + kbts_ShapePushFontFromMemory :: proc(Context: ^shape_context, Memory: rawptr, Size: c.int, FontIndex: c.int) -> ^font --- } - return ShapePushFontFromMemory(Context, raw_data(Memory), c.int(len(Memory)), FontIndex) + return kbts_ShapePushFontFromMemory(Context, raw_data(Memory), c.int(len(Memory)), FontIndex) } @(require_results) -ShapeRun :: proc "contextless" (Context: ^shape_context) -> (Run: run, ok: b32) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) +ShapeRun :: proc "contextless" (Context: ^shape_context) -> (Run: run, Ok: b32) { + @(default_calling_convention="c", require_results) foreign lib { - ShapeRun :: proc(Context: ^shape_context, Run: ^run) -> b32 --- + kbts_ShapeRun :: proc(Context: ^shape_context, Run: ^run) -> b32 --- } - ok = ShapeRun(Context, &Run) + Ok = kbts_ShapeRun(Context, &Run) return } ShapeUtf32 :: proc "c" (Context: ^shape_context, Utf32: []rune) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - ShapeUtf32 :: proc(Context: ^shape_context, Utf32: [^]rune, Length: c.int) --- + kbts_ShapeUtf32 :: proc(Context: ^shape_context, Utf32: [^]rune, Length: c.int) --- } - ShapeUtf32(Context, raw_data(Utf32), c.int(len(Utf32))) + kbts_ShapeUtf32(Context, raw_data(Utf32), c.int(len(Utf32))) } ShapeUtf32WithUserId :: proc "c" (Context: ^shape_context, Utf32: []rune, UserId: c.int, UserIdIncrement: c.int) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - ShapeUtf32WithUserId :: proc(Context: ^shape_context, Utf32: [^]rune, Length: c.int, UserId: c.int, UserIdIncrement: c.int) --- + kbts_ShapeUtf32WithUserId :: proc(Context: ^shape_context, Utf32: [^]rune, Length: c.int, UserId: c.int, UserIdIncrement: c.int) --- } - ShapeUtf32WithUserId(Context, raw_data(Utf32), c.int(len(Utf32)), UserId, UserIdIncrement) + kbts_ShapeUtf32WithUserId(Context, raw_data(Utf32), c.int(len(Utf32)), UserId, UserIdIncrement) } ShapeUtf8 :: proc(Context: ^shape_context, Utf8: string, UserIdGenerationMode: user_id_generation_mode) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - ShapeUtf8 :: proc(Context: ^shape_context, Utf8: [^]byte, Length: c.int, UserIdGenerationMode: user_id_generation_mode) --- + kbts_ShapeUtf8 :: proc(Context: ^shape_context, Utf8: [^]byte, Length: c.int, UserIdGenerationMode: user_id_generation_mode) --- } - ShapeUtf8(Context, raw_data(Utf8), c.int(len(Utf8)), UserIdGenerationMode) + kbts_ShapeUtf8(Context, raw_data(Utf8), c.int(len(Utf8)), UserIdGenerationMode) } ShapeUtf8WithUserId :: proc(Context: ^shape_context, Utf8: string, UserId: c.int, UserIdGenerationMode: user_id_generation_mode) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - ShapeUtf8WithUserId :: proc(Context: ^shape_context, Utf8: [^]byte, Length: c.int, UserId: c.int, UserIdGenerationMode: user_id_generation_mode) --- + kbts_ShapeUtf8WithUserId :: proc(Context: ^shape_context, Utf8: [^]byte, Length: c.int, UserId: c.int, UserIdGenerationMode: user_id_generation_mode) --- } - ShapeUtf8WithUserId(Context, raw_data(Utf8), c.int(len(Utf8)), UserId, UserIdGenerationMode) + kbts_ShapeUtf8WithUserId(Context, raw_data(Utf8), c.int(len(Utf8)), UserId, UserIdGenerationMode) } @@ -104,12 +104,12 @@ foreign lib { } @(require_results) -ShapeCodepointIteratorNext :: proc "contextless" (It: ^shape_codepoint_iterator) -> (Codepoint: shape_codepoint, CodepointIndex: c.int, ok: b32) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) +ShapeCodepointIteratorNext :: proc "contextless" (It: ^shape_codepoint_iterator) -> (Codepoint: shape_codepoint, CodepointIndex: c.int, Ok: b32) { + @(default_calling_convention="c", require_results) foreign lib { - ShapeCodepointIteratorNext :: proc(It: ^shape_codepoint_iterator, Codepoint: ^shape_codepoint, CodepointIndex: ^c.int) -> b32 --- + kbts_ShapeCodepointIteratorNext :: proc(It: ^shape_codepoint_iterator, Codepoint: ^shape_codepoint, CodepointIndex: ^c.int) -> b32 --- } - ok = ShapeCodepointIteratorNext(It, &Codepoint, &CodepointIndex) + Ok = kbts_ShapeCodepointIteratorNext(It, &Codepoint, &CodepointIndex) return } @@ -122,7 +122,6 @@ ShapeCodepointIteratorNext :: proc "contextless" (It: ^shape_codepoint_iterator) foreign lib { FreeFont :: proc(Font: ^font) --- FontIsValid :: proc(Font: ^font) -> b32 --- - LoadFont :: proc(Font: ^font, State: ^load_font_state, FontData: rawptr, FontDataSize: c.int, FontIndex: c.int, ScratchSize_: ^c.int, OutputSize_: ^c.int) -> load_font_error --- PlaceBlob :: proc(Font: ^font, State: ^load_font_state, ScratchMemory: rawptr, OutputMemory: rawptr) -> load_font_error --- GetFontInfo :: proc(Font: ^font, Info: ^font_info) --- @@ -149,70 +148,80 @@ foreign lib { } @(require_results) -FontCount :: proc "c" (FileData: []byte) -> c.int { - @(default_calling_convention="c", link_prefix="kbts_", require_results) +LoadFont :: proc "contextless" (Font: ^font, State: ^load_font_state, FontData: []byte, FontIndex: c.int) -> (ScratchSize, OutputSize: c.int, Err: load_font_error) { + @(default_calling_convention="c", require_results) foreign lib { - FontCount :: proc(FileData: rawptr, FileSize: c.int) -> c.int --- + kbts_LoadFont :: proc(Font: ^font, State: ^load_font_state, FontData: rawptr, FontDataSize: c.int, FontIndex: c.int, ScratchSize_: ^c.int, OutputSize_: ^c.int) -> load_font_error --- } - return FontCount(raw_data(FileData), c.int(len(FileData))) -} - -@(require_results) -FontFromMemory :: proc "c" (FileData: []byte, FontIndex: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> font { - @(default_calling_convention="c", link_prefix="kbts_", require_results) - foreign lib { - FontFromMemory :: proc(FileData: rawptr, FileSize: c.int, FontIndex: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> font --- - } - return FontFromMemory(raw_data(FileData), c.int(len(FileData)), FontIndex, Allocator, AllocatorData) -} - - -@(require_results) -ShapeDirect :: proc "contextless" (Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Allocator: allocator_function, AllocatorData: rawptr) -> (Output: glyph_iterator, err: shape_error) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) - foreign lib { - ShapeDirect :: proc(Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Allocator: allocator_function, AllocatorData: rawptr, Output: ^glyph_iterator) -> shape_error --- - } - err = ShapeDirect(Config, Storage, RunDirection, Allocator, AllocatorData, &Output) + Err = kbts_LoadFont(Font, State, raw_data(FontData), c.int(len(FontData)), FontIndex, &ScratchSize, &OutputSize) return } @(require_results) -ShapeDirectFixedMemory :: proc "contextless" (Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Memory: rawptr, MemorySize: c.int) -> (Output: glyph_iterator, err: shape_error) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) +FontCount :: proc "c" (FileData: []byte) -> c.int { + @(default_calling_convention="c", require_results) foreign lib { - ShapeDirectFixedMemory :: proc(Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Memory: rawptr, MemorySize: c.int, Output: ^glyph_iterator) -> shape_error --- + kbts_FontCount :: proc(FileData: rawptr, FileSize: c.int) -> c.int --- } - err = ShapeDirectFixedMemory(Config, Storage, RunDirection, Memory, MemorySize, &Output) + return kbts_FontCount(raw_data(FileData), c.int(len(FileData))) +} + +@(require_results) +FontFromMemory :: proc "c" (FileData: []byte, FontIndex: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> font { + @(default_calling_convention="c", require_results) + foreign lib { + kbts_FontFromMemory :: proc(FileData: rawptr, FileSize: c.int, FontIndex: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> font --- + } + return kbts_FontFromMemory(raw_data(FileData), c.int(len(FileData)), FontIndex, Allocator, AllocatorData) +} + + +@(require_results) +ShapeDirect :: proc "contextless" (Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Allocator: allocator_function, AllocatorData: rawptr) -> (Output: glyph_iterator, Err: shape_error) { + @(default_calling_convention="c", require_results) + foreign lib { + kbts_ShapeDirect :: proc(Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Allocator: allocator_function, AllocatorData: rawptr, Output: ^glyph_iterator) -> shape_error --- + } + Err = kbts_ShapeDirect(Config, Storage, RunDirection, Allocator, AllocatorData, &Output) + return +} + +@(require_results) +ShapeDirectFixedMemory :: proc "contextless" (Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Memory: rawptr, MemorySize: c.int) -> (Output: glyph_iterator, Err: shape_error) { + @(default_calling_convention="c", require_results) + foreign lib { + kbts_ShapeDirectFixedMemory :: proc(Config: ^shape_config, Storage: ^glyph_storage, RunDirection: direction, Memory: rawptr, MemorySize: c.int, Output: ^glyph_iterator) -> shape_error --- + } + Err = kbts_ShapeDirectFixedMemory(Config, Storage, RunDirection, Memory, MemorySize, &Output) return } @(require_results) SizeOfGlyphConfig :: proc "c" (Overrides: []feature_override) -> c.int { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - SizeOfGlyphConfig :: proc(Overrides: [^]feature_override, OverrideCount: c.int) -> c.int --- + kbts_SizeOfGlyphConfig :: proc(Overrides: [^]feature_override, OverrideCount: c.int) -> c.int --- } - return SizeOfGlyphConfig(raw_data(Overrides), c.int(len(Overrides))) + return kbts_SizeOfGlyphConfig(raw_data(Overrides), c.int(len(Overrides))) } @(require_results) PlaceGlyphConfig :: proc "c" (Overrides: []feature_override, Memory: rawptr) -> ^glyph_config { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - PlaceGlyphConfig :: proc(Overrides: [^]feature_override, OverrideCount: c.int, Memory: rawptr) -> ^glyph_config --- + kbts_PlaceGlyphConfig :: proc(Overrides: [^]feature_override, OverrideCount: c.int, Memory: rawptr) -> ^glyph_config --- } - return PlaceGlyphConfig(raw_data(Overrides), c.int(len(Overrides)), Memory) + return kbts_PlaceGlyphConfig(raw_data(Overrides), c.int(len(Overrides)), Memory) } @(require_results) CreateGlyphConfig :: proc(Overrides: []feature_override, Allocator: allocator_function, AllocatorData: rawptr) -> ^glyph_config { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - CreateGlyphConfig :: proc(Overrides: [^]feature_override, OverrideCount: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> ^glyph_config --- + kbts_CreateGlyphConfig :: proc(Overrides: [^]feature_override, OverrideCount: c.int, Allocator: allocator_function, AllocatorData: rawptr) -> ^glyph_config --- } - return CreateGlyphConfig(raw_data(Overrides), c.int(len(Overrides)), Allocator, AllocatorData) + return kbts_CreateGlyphConfig(raw_data(Overrides), c.int(len(Overrides)), Allocator, AllocatorData) } @(default_calling_convention="c", link_prefix="kbts_", require_results) @@ -221,12 +230,12 @@ foreign lib { } @(require_results) -GlyphIteratorNext :: proc "contextless" (It: ^glyph_iterator) -> (Glyph: ^glyph, ok: b32) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) +GlyphIteratorNext :: proc "contextless" (It: ^glyph_iterator) -> (Glyph: ^glyph, Ok: b32) { + @(default_calling_convention="c", require_results) foreign lib { - GlyphIteratorNext :: proc(It: ^glyph_iterator, Glyph: ^^glyph) -> b32 --- + kbts_GlyphIteratorNext :: proc(It: ^glyph_iterator, Glyph: ^^glyph) -> b32 --- } - ok = GlyphIteratorNext(It, &Glyph) + Ok = kbts_GlyphIteratorNext(It, &Glyph) return } @@ -242,12 +251,12 @@ foreign lib { } @(require_results) -Break :: proc "contextless" (State: ^break_state) -> (Break: break_type, ok: b32) { +Break :: proc "contextless" (State: ^break_state) -> (Break: break_type, Ok: b32) { @(default_calling_convention="c", require_results) foreign lib { kbts_Break :: proc(State: ^break_state, Break: ^break_type) -> b32 --- } - ok = kbts_Break(State, &Break) + Ok = kbts_Break(State, &Break) return } @@ -256,42 +265,42 @@ BreakEntireString :: proc "c" (Direction: direction, JapaneseLineBreakStyle: jap Input: []byte, InputFormat: text_format, Breaks: []break_type, BreakCount: ^c.int, BreakFlags: []break_flags, BreakFlagCount: ^c.int) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - BreakEntireString :: proc(Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, - Input: rawptr, InputSizeInBytes: c.int, InputFormat: text_format, - Breaks: [^]break_type, BreakCapacity: c.int, BreakCount: ^c.int, - BreakFlags: [^]break_flags, BreakFlagCapacity: c.int, BreakFlagCount: ^c.int) --- + kbts_BreakEntireString :: proc(Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, + Input: rawptr, InputSizeInBytes: c.int, InputFormat: text_format, + Breaks: [^]break_type, BreakCapacity: c.int, BreakCount: ^c.int, + BreakFlags: [^]break_flags, BreakFlagCapacity: c.int, BreakFlagCount: ^c.int) --- } - BreakEntireString(Direction, JapaneseLineBreakStyle, ConfigFlags, raw_data(Input), c.int(len(Input)), InputFormat, raw_data(Breaks), c.int(len(Breaks)), BreakCount, raw_data(BreakFlags), c.int(len(BreakFlags)), BreakFlagCount) + kbts_BreakEntireString(Direction, JapaneseLineBreakStyle, ConfigFlags, raw_data(Input), c.int(len(Input)), InputFormat, raw_data(Breaks), c.int(len(Breaks)), BreakCount, raw_data(BreakFlags), c.int(len(BreakFlags)), BreakFlagCount) } BreakEntireStringUtf32 :: proc "c" (Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, Utf32: []rune, Breaks: []break_type, BreakCount: ^c.int, BreakFlags: []break_flags, BreakFlagCount: ^c.int) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - BreakEntireStringUtf32 :: proc(Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, - Utf32: [^]rune, Utf32Count: c.int, - Breaks: [^]break_type, BreakCapacity: c.int, BreakCount: ^c.int, - BreakFlags: [^]break_flags, BreakFlagCapacity: c.int, BreakFlagCount: ^c.int) --- + kbts_BreakEntireStringUtf32 :: proc(Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, + Utf32: [^]rune, Utf32Count: c.int, + Breaks: [^]break_type, BreakCapacity: c.int, BreakCount: ^c.int, + BreakFlags: [^]break_flags, BreakFlagCapacity: c.int, BreakFlagCount: ^c.int) --- } - BreakEntireStringUtf32(Direction, JapaneseLineBreakStyle, ConfigFlags, raw_data(Utf32), c.int(len(Utf32)), raw_data(Breaks), c.int(len(Breaks)), BreakCount, raw_data(BreakFlags), c.int(len(BreakFlags)), BreakFlagCount) + kbts_BreakEntireStringUtf32(Direction, JapaneseLineBreakStyle, ConfigFlags, raw_data(Utf32), c.int(len(Utf32)), raw_data(Breaks), c.int(len(Breaks)), BreakCount, raw_data(BreakFlags), c.int(len(BreakFlags)), BreakFlagCount) } BreakEntireStringUtf8 :: proc "c" (Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, Utf8: string, Breaks: []break_type, BreakCount: ^c.int, BreakFlags: []break_flags, BreakFlagCount: ^c.int) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - BreakEntireStringUtf8 :: proc(Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, - Utf8: [^]byte, Utf8Length: c.int, - Breaks: [^]break_type, BreakCapacity: c.int, BreakCount: ^c.int, - BreakFlags: [^]break_flags, BreakFlagCapacity: c.int, BreakFlagCount: ^c.int) --- + kbts_BreakEntireStringUtf8 :: proc(Direction: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags, + Utf8: [^]byte, Utf8Length: c.int, + Breaks: [^]break_type, BreakCapacity: c.int, BreakCount: ^c.int, + BreakFlags: [^]break_flags, BreakFlagCapacity: c.int, BreakFlagCount: ^c.int) --- } - BreakEntireStringUtf8(Direction, JapaneseLineBreakStyle, ConfigFlags, raw_data(Utf8), c.int(len(Utf8)), raw_data(Breaks), c.int(len(Breaks)), BreakCount, raw_data(BreakFlags), c.int(len(BreakFlags)), BreakFlagCount) + kbts_BreakEntireStringUtf8(Direction, JapaneseLineBreakStyle, ConfigFlags, raw_data(Utf8), c.int(len(Utf8)), raw_data(Breaks), c.int(len(Breaks)), BreakCount, raw_data(BreakFlags), c.int(len(BreakFlags)), BreakFlagCount) } @@ -311,22 +320,22 @@ foreign lib { @(require_results) DecodeUtf8 :: proc "c" (Utf8: string) -> decode { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - DecodeUtf8 :: proc(Utf8: [^]byte, Length: un) -> decode --- + kbts_DecodeUtf8 :: proc(Utf8: [^]byte, Length: un) -> decode --- } - return DecodeUtf8(raw_data(Utf8), un(len(Utf8))) + return kbts_DecodeUtf8(raw_data(Utf8), un(len(Utf8))) } // This is a quick guess that stops at the first glyph that has a strong script/direction associated to it. // It is convenient, but only works if you are sure your input text is mono-script and mono-direction. @(require_results) GuessTextProperties :: proc "contextless" (Text: []byte, Format: text_format) -> (Direction: direction, Script: script) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - GuessTextProperties :: proc(Text: rawptr, TextSizeInBytes: c.int, Format: text_format, Direction: ^direction, Script: ^script) --- + kbts_GuessTextProperties :: proc(Text: rawptr, TextSizeInBytes: c.int, Format: text_format, Direction: ^direction, Script: ^script) --- } - GuessTextProperties(raw_data(Text), c.int(len(Text)), Format, &Direction, &Script) + kbts_GuessTextProperties(raw_data(Text), c.int(len(Text)), Format, &Direction, &Script) return } @@ -334,11 +343,11 @@ GuessTextProperties :: proc "contextless" (Text: []byte, Format: text_format) -> // It is convenient, but only works if you are sure your input text is mono-script and mono-direction. @(require_results) GuessTextPropertiesUtf32 :: proc "contextless" (Utf32: []rune) -> (Direction: direction, Script: script) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - GuessTextPropertiesUtf32 :: proc(Utf32: [^]rune, Utf32Count: c.int, Direction: ^direction, Script: ^script) --- + kbts_GuessTextPropertiesUtf32 :: proc(Utf32: [^]rune, Utf32Count: c.int, Direction: ^direction, Script: ^script) --- } - GuessTextPropertiesUtf32(raw_data(Utf32), c.int(len(Utf32)), &Direction, &Script) + kbts_GuessTextPropertiesUtf32(raw_data(Utf32), c.int(len(Utf32)), &Direction, &Script) return } @@ -346,11 +355,11 @@ GuessTextPropertiesUtf32 :: proc "contextless" (Utf32: []rune) -> (Direction: di // It is convenient, but only works if you are sure your input text is mono-script and mono-direction._results) @(require_results) GuessTextPropertiesUtf8 :: proc "contextless" (Utf8: string) -> (Direction: direction, Script: script) { - @(default_calling_convention="c", link_prefix="kbts_", require_results) + @(default_calling_convention="c", require_results) foreign lib { - GuessTextPropertiesUtf8 :: proc(Utf8: cstring, Utf8Length: c.int, Direction: ^direction, Script: ^script) --- + kbts_GuessTextPropertiesUtf8 :: proc(Utf8: cstring, Utf8Length: c.int, Direction: ^direction, Script: ^script) --- } - GuessTextPropertiesUtf8(cstring(raw_data(Utf8)), c.int(len(Utf8)), &Direction, &Script) + kbts_GuessTextPropertiesUtf8(cstring(raw_data(Utf8)), c.int(len(Utf8)), &Direction, &Script) return } From ccbe5845601a5a4d7c14f5744e9ea42a2e50be90 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 13:01:24 +0000 Subject: [PATCH 020/766] `data` -> `res` to minimize confusion --- vendor/kb_text_shape/kb_text_shape_procs.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/kb_text_shape/kb_text_shape_procs.odin b/vendor/kb_text_shape/kb_text_shape_procs.odin index 686328b28..a9cee184c 100644 --- a/vendor/kb_text_shape/kb_text_shape_procs.odin +++ b/vendor/kb_text_shape/kb_text_shape_procs.odin @@ -379,9 +379,9 @@ AllocatorFromOdinAllocator :: proc "contextless" (allocator: ^runtime.Allocator) case .NONE: return case .ALLOCATE: - data, _ := runtime.mem_alloc(int(Op.Allocate.Size), runtime.DEFAULT_ALIGNMENT) - Op.Allocate.Pointer = raw_data(data) - Op.Allocate.Size = u32(len(data)) + res, _ := runtime.mem_alloc(int(Op.Allocate.Size), runtime.DEFAULT_ALIGNMENT) + Op.Allocate.Pointer = raw_data(res) + Op.Allocate.Size = u32(len(res)) case .FREE: _ = runtime.mem_free(Op.Free.Pointer) } From f8bb5c742744db447ca062de6ffadb579920ab90 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 13:12:29 +0000 Subject: [PATCH 021/766] Wrap `EncodeUtf8` --- vendor/kb_text_shape/kb_text_shape_procs.odin | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/vendor/kb_text_shape/kb_text_shape_procs.odin b/vendor/kb_text_shape/kb_text_shape_procs.odin index a9cee184c..08dd4c300 100644 --- a/vendor/kb_text_shape/kb_text_shape_procs.odin +++ b/vendor/kb_text_shape/kb_text_shape_procs.odin @@ -312,12 +312,21 @@ foreign lib { FontCoverageTestCodepoint :: proc(Test: ^font_coverage_test, Codepoint: rune) --- FontCoverageTestEnd :: proc(Test: ^font_coverage_test) -> b32 --- - EncodeUtf8 :: proc(Codepoint: rune) -> encode_utf8 --- ScriptDirection :: proc(Script: script) -> direction --- ScriptIsComplex :: proc(Script: script) -> b32 --- ScriptTagToScript :: proc(Tag: script_tag) -> script --- } +@(require_results) +EncodeUtf8 :: proc "c" (Codepoint: rune) -> (Encoded: [4]u8, EncodedLength: c.int, Valid: b32) { + return expand_values(kbts_EncodeUtf8(Codepoint)) +} + +@(default_calling_convention="c", require_results) +foreign lib { + kbts_EncodeUtf8 :: proc(Codepoint: rune) -> encode_utf8 --- +} + @(require_results) DecodeUtf8 :: proc "c" (Utf8: string) -> decode { @(default_calling_convention="c", require_results) From f9f4dcd207fb58a791a23ed4b08afe380e9fc17c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 13:58:28 +0000 Subject: [PATCH 022/766] Add `raw_union_tag` for `struct #raw_union` fields to improve fmt printing --- core/fmt/fmt.odin | 71 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 7ec3062e1..fd0af7559 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -42,6 +42,8 @@ Info_State :: struct { width: int, prec: int, indent: int, + + parent_struct: any, } @@ -2071,6 +2073,68 @@ handle_tag :: proc(state: ^Info_State, data: rawptr, info: reflect.Type_Info_Str } return } + + +__handle_raw_union_tag :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime.Type_Info_Struct, type_name: string) -> (ok: bool) { + if fi.state.parent_struct == nil { + return false + } + ut := type_info_of(v.id) + + if !reflect.is_raw_union(ut) { + return false + } + + tag_name: string + for tag in info.tags[:info.field_count] { + rut := reflect.struct_tag_lookup(reflect.Struct_Tag(tag), "raw_union_tag") or_continue + head_tag, match, _ := strings.partition(string(rut), "=") + if match != "=" { + continue + } + if tag_name == "" { + tag_name = head_tag + } else if tag_name != head_tag { + return false + } + } + if tag_name == "" { + return false + } + + tag := reflect.struct_field_value_by_name(fi.state.parent_struct, tag_name, true) + if tag == nil { + return false + } + tag_info := reflect.type_info_base(type_info_of(tag.id)) + #partial switch ti in tag_info.variant { + case reflect.Type_Info_Enum: + tag_string := reflect.enum_string(tag) + + for tag, index in info.tags[:info.field_count] { + rut := reflect.struct_tag_lookup(reflect.Struct_Tag(tag), "raw_union_tag") or_continue + head_tag, match, tail_name := strings.partition(string(rut), "=") + if head_tag != tag_name || match != "=" { + continue + } + + // just ignore the `A.` prefix for `A.B` stuff entirely + if _, _, try_tail_name := strings.partition(string(rut), "."); try_tail_name != "" { + tail_name = try_tail_name + } + + if tail_name == tag_string { + io.write_string(fi.writer, "#raw_union ", &fi.n) + fmt_arg(fi, any{v.data, info.types[index].id}, the_verb) + return true + } + } + } + + return false +} + + // Formats a struct for output, handling various struct types (e.g., SOA, raw unions) // // Inputs: @@ -2086,8 +2150,11 @@ fmt_struct :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime.Type_Info_St return } if .raw_union in info.flags { + if __handle_raw_union_tag(fi, v, the_verb, info, type_name) { + return + } if type_name == "" { - io.write_string(fi.writer, "(raw union)", &fi.n) + io.write_string(fi.writer, "(#raw_union)", &fi.n) } else { io.write_string(fi.writer, type_name, &fi.n) io.write_string(fi.writer, "{}", &fi.n) @@ -2225,6 +2292,8 @@ fmt_struct :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime.Type_Info_St verb := the_verb if the_verb == 'w' else 'v' new_state := fi.state + new_state.parent_struct = v + if handle_tag(&new_state, v.data, info, i, &verb, &optional_len, &use_nul_termination) { continue } From 3a3239294c9e4a7504bfb60e3cb5f8229fe6a326 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 14:03:13 +0000 Subject: [PATCH 023/766] `raw_union_tag` allow for comma separation for multiple mappings --- core/fmt/fmt.odin | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index fd0af7559..c05b8eb62 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2112,21 +2112,26 @@ __handle_raw_union_tag :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime. tag_string := reflect.enum_string(tag) for tag, index in info.tags[:info.field_count] { - rut := reflect.struct_tag_lookup(reflect.Struct_Tag(tag), "raw_union_tag") or_continue - head_tag, match, tail_name := strings.partition(string(rut), "=") - if head_tag != tag_name || match != "=" { - continue - } + rut_list := reflect.struct_tag_lookup(reflect.Struct_Tag(tag), "raw_union_tag") or_continue - // just ignore the `A.` prefix for `A.B` stuff entirely - if _, _, try_tail_name := strings.partition(string(rut), "."); try_tail_name != "" { - tail_name = try_tail_name - } + for rut in strings.split_iterator(&rut_list, ",") { + head_tag, match, tail_name := strings.partition(string(rut), "=") + if head_tag != tag_name || match != "=" { + continue + } - if tail_name == tag_string { - io.write_string(fi.writer, "#raw_union ", &fi.n) - fmt_arg(fi, any{v.data, info.types[index].id}, the_verb) - return true + // just ignore the `A.` prefix for `A.B` stuff entirely + if _, _, try_tail_name := strings.partition(string(rut), "."); try_tail_name != "" { + tail_name = try_tail_name + } + + if tail_name == tag_string { + io.write_string(fi.writer, "#raw_union(.", &fi.n) + io.write_string(fi.writer, tag_string, &fi.n) + io.write_string(fi.writer, ") ", &fi.n) + fmt_arg(fi, any{v.data, info.types[index].id}, the_verb) + return true + } } } } From e6827393cf2f385a4cd13d605c5280ace33a84f2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Dec 2025 14:35:22 +0000 Subject: [PATCH 024/766] Add `raw_union_tag` struct tag fields to many types in `vendor` --- core/fmt/fmt.odin | 9 +- vendor/cgltf/cgltf.odin | 4 +- vendor/commonmark/cmark.odin | 12 +- vendor/ggpo/ggpo.odin | 18 +-- vendor/kb_text_shape/kb_text_shape_types.odin | 4 +- vendor/miniaudio/device_io_types.odin | 8 +- vendor/sdl3/sdl3_events.odin | 114 ++++++++++++------ vendor/sdl3/sdl3_gamepad.odin | 10 +- 8 files changed, 110 insertions(+), 69 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index c05b8eb62..c958c2d2e 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2076,9 +2076,6 @@ handle_tag :: proc(state: ^Info_State, data: rawptr, info: reflect.Type_Info_Str __handle_raw_union_tag :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime.Type_Info_Struct, type_name: string) -> (ok: bool) { - if fi.state.parent_struct == nil { - return false - } ut := type_info_of(v.id) if !reflect.is_raw_union(ut) { @@ -2103,9 +2100,15 @@ __handle_raw_union_tag :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime. } tag := reflect.struct_field_value_by_name(fi.state.parent_struct, tag_name, true) + if tag == nil { + // try the current type just in case the tag is also stored here + tag = reflect.struct_field_value_by_name(v, tag_name, false) + } if tag == nil { return false } + + tag_info := reflect.type_info_base(type_info_of(tag.id)) #partial switch ti in tag_info.variant { case reflect.Type_Info_Enum: diff --git a/vendor/cgltf/cgltf.odin b/vendor/cgltf/cgltf.odin index aeceb14c5..db1d1c6c0 100644 --- a/vendor/cgltf/cgltf.odin +++ b/vendor/cgltf/cgltf.odin @@ -511,8 +511,8 @@ camera :: struct { name: cstring, type: camera_type, data: struct #raw_union { - perspective: camera_perspective, - orthographic: camera_orthographic, + perspective: camera_perspective `raw_union_tag:"type=.perspective"`, + orthographic: camera_orthographic `raw_union_tag:"type=.orthographic"`, }, extras: extras_t, extensions_count: uint, diff --git a/vendor/commonmark/cmark.odin b/vendor/commonmark/cmark.odin index fd1be45fd..574b977e0 100644 --- a/vendor/commonmark/cmark.odin +++ b/vendor/commonmark/cmark.odin @@ -154,12 +154,12 @@ Node :: struct { flags: Node_Flags, as: struct #raw_union { - list: List, - code: Code, - heading: Heading, - link: Link, - custom: Custom, - html_block_type: c.int, + list: List `raw_union_tag:"type=.List"`, + code: Code `raw_union_tag:"type=.Code"`, + heading: Heading `raw_union_tag:"type=.Heading"`, + link: Link `raw_union_tag:"type=.Link"`, + custom: Custom `raw_union_tag:"type=.Custom"`, + html_block_type: c.int `raw_union_tag:"type=.HTML_Block"`, }, } diff --git a/vendor/ggpo/ggpo.odin b/vendor/ggpo/ggpo.odin index 80b6a0d4a..01e03b6cb 100644 --- a/vendor/ggpo/ggpo.odin +++ b/vendor/ggpo/ggpo.odin @@ -59,11 +59,11 @@ Player :: struct { type: PlayerType, player_num: c.int, using u: struct #raw_union { - local: struct {}, + local: struct {} `raw_union_tag:"type=.LOCAL"`, remote: struct { ip_address: [32]byte, port: u16, - }, + } `raw_union_tag:"type=.REMOTE"`, }, } @@ -132,28 +132,28 @@ Event :: struct { using u: struct #raw_union { connected: struct { player: PlayerHandle, - }, + } `raw_union_tag:"code=.CONNECTED_TO_PEER"`, synchronizing: struct { player: PlayerHandle, count: c.int, total: c.int, - }, + } `raw_union_tag:"code=.SYNCHRONIZING_WITH_PEER"`, synchronized: struct { player: PlayerHandle, - }, + } `raw_union_tag:"code=.SYNCHRONIZED_WITH_PEER"`, disconnected: struct { player: PlayerHandle, - }, + } `raw_union_tag:"code=.DISCONNECTED_FROM_PEER"`, timesync: struct { frames_ahead: c.int, - }, + } `raw_union_tag:"code=.TIMESYNC"`, connection_interrupted: struct { player: PlayerHandle, disconnect_timeout: c.int, - }, + } `raw_union_tag:"code=.connection_interrupted"`, connection_resumed: struct { player: PlayerHandle, - }, + } `raw_union_tag:"code=.connection_resumed"`, }, } diff --git a/vendor/kb_text_shape/kb_text_shape_types.odin b/vendor/kb_text_shape/kb_text_shape_types.odin index 2d29267ae..fa3c47f85 100644 --- a/vendor/kb_text_shape/kb_text_shape_types.odin +++ b/vendor/kb_text_shape/kb_text_shape_types.odin @@ -1776,8 +1776,8 @@ allocator_op :: struct { Kind: allocator_op_kind, using op: struct #raw_union { - Allocate: allocator_op_allocate, - Free: allocator_op_free, + Allocate: allocator_op_allocate `raw_union_tag:"Kind=.ALLOCATE"`, + Free: allocator_op_free `raw_union_tag:"Kind=.FREE"`, }, } diff --git a/vendor/miniaudio/device_io_types.odin b/vendor/miniaudio/device_io_types.odin index 9d64602f8..f9b8ecb40 100644 --- a/vendor/miniaudio/device_io_types.odin +++ b/vendor/miniaudio/device_io_types.odin @@ -93,16 +93,16 @@ device_notification :: struct { data: struct #raw_union { started: struct { _unused: c.int, - }, + } `raw_union_tag:"type=.started"`, stopped: struct { _unused: c.int, - }, + } `raw_union_tag:"type=.stopped"`, rerouted: struct { _unused: c.int, - }, + } `raw_union_tag:"type=.rerouted"`, interruption: struct { _unused: c.int, - }, + } `raw_union_tag:"type=.interruption_began,.interruption_ended,"`, }, } diff --git a/vendor/sdl3/sdl3_events.odin b/vendor/sdl3/sdl3_events.odin index 3f64f85fa..999fe58b7 100644 --- a/vendor/sdl3/sdl3_events.odin +++ b/vendor/sdl3/sdl3_events.odin @@ -519,44 +519,82 @@ UserEvent :: struct { Event :: struct #raw_union { - type: EventType, /**< Event type, shared with all events, Uint32 to cover user events which are not in the SDL_EventType enumeration */ - common: CommonEvent, /**< Common event data */ - display: DisplayEvent, /**< Display event data */ - window: WindowEvent, /**< Window event data */ - kdevice: KeyboardDeviceEvent, /**< Keyboard device change event data */ - key: KeyboardEvent, /**< Keyboard event data */ - edit: TextEditingEvent, /**< Text editing event data */ - edit_candidates: TextEditingCandidatesEvent, /**< Text editing candidates event data */ - text: TextInputEvent, /**< Text input event data */ - mdevice: MouseDeviceEvent, /**< Mouse device change event data */ - motion: MouseMotionEvent, /**< Mouse motion event data */ - button: MouseButtonEvent, /**< Mouse button event data */ - wheel: MouseWheelEvent, /**< Mouse wheel event data */ - jdevice: JoyDeviceEvent, /**< Joystick device change event data */ - jaxis: JoyAxisEvent, /**< Joystick axis event data */ - jball: JoyBallEvent, /**< Joystick ball event data */ - jhat: JoyHatEvent, /**< Joystick hat event data */ - jbutton: JoyButtonEvent, /**< Joystick button event data */ - jbattery: JoyBatteryEvent, /**< Joystick battery event data */ - gdevice: GamepadDeviceEvent, /**< Gamepad device event data */ - gaxis: GamepadAxisEvent, /**< Gamepad axis event data */ - gbutton: GamepadButtonEvent, /**< Gamepad button event data */ - gtouchpad: GamepadTouchpadEvent, /**< Gamepad touchpad event data */ - gsensor: GamepadSensorEvent, /**< Gamepad sensor event data */ - adevice: AudioDeviceEvent, /**< Audio device event data */ - cdevice: CameraDeviceEvent, /**< Camera device event data */ - sensor: SensorEvent, /**< Sensor event data */ - quit: QuitEvent, /**< Quit request event data */ - user: UserEvent, /**< Custom event data */ - tfinger: TouchFingerEvent, /**< Touch finger event data */ - pproximity: PenProximityEvent, /**< Pen proximity event data */ - ptouch: PenTouchEvent, /**< Pen tip touching event data */ - pmotion: PenMotionEvent, /**< Pen motion event data */ - pbutton: PenButtonEvent, /**< Pen button event data */ - paxis: PenAxisEvent, /**< Pen axis event data */ - render: RenderEvent, /**< Render event data */ - drop: DropEvent, /**< Drag and drop event data */ - clipboard: ClipboardEvent, /**< Clipboard event data */ + /**< Event type, shared with all events, Uint32 to cover user events which are not in the SDL_EventType enumeration */ + type: EventType `raw_union_tag:"type=FIRST"`, + /**< Common event data */ + common: CommonEvent `raw_union_tag:"type=TERMINATE,LOW_MEMORY,WILL_ENTER_BACKGROUND,DID_ENTER_BACKGROUND,WILL_ENTER_FOREGROUND,DID_ENTER_FOREGROUND,LOCALE_CHANGED,SYSTEM_THEME_CHANGED,POLL_SENTINEL"`, + /**< Display event data */ + display: DisplayEvent `raw_union_tag:"type=DISPLAY_ORIENTATION,DISPLAY_ADDED,DISPLAY_REMOVED,DISPLAY_MOVED,DISPLAY_DESKTOP_MODE_CHANGED,DISPLAY_CURRENT_MODE_CHANGED,DISPLAY_CONTENT_SCALE_CHANGED"`, + /**< Window event data */ + window: WindowEvent `raw_union_tag:"type=WINDOW_SHOWN,WINDOW_HIDDEN,WINDOW_EXPOSED,WINDOW_MOVED,WINDOW_RESIZED,WINDOW_PIXEL_SIZE_CHANGED,WINDOW_METAL_VIEW_RESIZED,WINDOW_MINIMIZED,WINDOW_MAXIMIZED,WINDOW_RESTORED,WINDOW_MOUSE_ENTER,WINDOW_MOUSE_LEAVE,WINDOW_FOCUS_GAINED,WINDOW_FOCUS_LOST,WINDOW_CLOSE_REQUESTED,WINDOW_HIT_TEST,WINDOW_ICCPROF_CHANGED,WINDOW_DISPLAY_CHANGED,WINDOW_DISPLAY_SCALE_CHANGED,WINDOW_SAFE_AREA_CHANGED,WINDOW_OCCLUDED,WINDOW_ENTER_FULLSCREEN,WINDOW_LEAVE_FULLSCREEN,WINDOW_DESTROYED"`, + /**< Keyboard device change event data */ + kdevice: KeyboardDeviceEvent `raw_union_tag:"type=KEYMAP_CHANGED,KEYBOARD_ADDED,KEYBOARD_REMOVED"`, + /**< Keyboard event data */ + key: KeyboardEvent `raw_union_tag:"type=KEY_DOWN,KEY_UP"`, + /**< Text editing event data */ + edit: TextEditingEvent `raw_union_tag:"type=TEXT_EDITING"`, + /**< Text editing candidates event data */ + edit_candidates: TextEditingCandidatesEvent `raw_union_tag:"type=TEXT_EDITING_CANDIDATES"`, + /**< Text input event data */ + text: TextInputEvent `raw_union_tag:"type=TEXT_INPUT"`, + /**< Mouse device change event data */ + mdevice: MouseDeviceEvent `raw_union_tag:"type=MOUSE_ADDED,MOUSE_REMOVED"`, + /**< Mouse motion event data */ + motion: MouseMotionEvent `raw_union_tag:"type=MOUSE_MOTION"`, + /**< Mouse button event data */ + button: MouseButtonEvent `raw_union_tag:"type=MOUSE_BUTTON_DOWN,MOUSE_BUTTON_UP"`, + /**< Mouse wheel event data */ + wheel: MouseWheelEvent `raw_union_tag:"type=MOUSE_WHEEL"`, + /**< Joystick device change event data */ + jdevice: JoyDeviceEvent `raw_union_tag:"type=JOYSTICK_ADDED,JOYSTICK_REMOVED,JOYSTICK_UPDATE_COMPLETE"`, + /**< Joystick axis event data */ + jaxis: JoyAxisEvent `raw_union_tag:"type=JOYSTICK_AXIS_MOTION"`, + /**< Joystick ball event data */ + jball: JoyBallEvent `raw_union_tag:"type=JOYSTICK_BALL_MOTION"`, + /**< Joystick hat event data */ + jhat: JoyHatEvent `raw_union_tag:"type=JOYSTICK_HAT_MOTION"`, + /**< Joystick button event data */ + jbutton: JoyButtonEvent `raw_union_tag:"type=JOYSTICK_BUTTON_DOWN,JOYSTICK_BUTTON_UP"`, + /**< Joystick battery event data */ + jbattery: JoyBatteryEvent `raw_union_tag:"type=JOYSTICK_BATTERY_UPDATED"`, + /**< Gamepad device event data */ + gdevice: GamepadDeviceEvent `raw_union_tag:"type=GAMEPAD_ADDED,GAMEPAD_REMOVED,GAMEPAD_REMAPPED,GAMEPAD_UPDATE_COMPLETE,GAMEPAD_STEAM_HANDLE_UPDATED"`, + /**< Gamepad axis event data */ + gaxis: GamepadAxisEvent `raw_union_tag:"type=GAMEPAD_AXIS_MOTION"`, + /**< Gamepad button event data */ + gbutton: GamepadButtonEvent `raw_union_tag:"type=GAMEPAD_BUTTON_DOWN,GAMEPAD_BUTTON_UP"`, + /**< Gamepad touchpad event data */ + gtouchpad: GamepadTouchpadEvent `raw_union_tag:"type=GAMEPAD_TOUCHPAD_DOWN,GAMEPAD_TOUCHPAD_MOTION,GAMEPAD_TOUCHPAD_UP"`, + /**< Gamepad sensor event data */ + gsensor: GamepadSensorEvent `raw_union_tag:"type=GAMEPAD_SENSOR_UPDATE"`, + /**< Audio device event data */ + adevice: AudioDeviceEvent `raw_union_tag:"type=AUDIO_DEVICE_ADDED,AUDIO_DEVICE_REMOVED,AUDIO_DEVICE_FORMAT_CHANGED"`, + /**< Camera device event data */ + cdevice: CameraDeviceEvent `raw_union_tag:"type=CAMERA_DEVICE_ADDED,CAMERA_DEVICE_REMOVED,CAMERA_DEVICE_APPROVED,CAMERA_DEVICE_DENIED"`, + /**< Sensor event data */ + sensor: SensorEvent `raw_union_tag:"type=SENSOR_UPDATE"`, + /**< Quit request event data */ + quit: QuitEvent `raw_union_tag:"type=QUIT"`, + /**< Custom event data */ + user: UserEvent `raw_union_tag:"type=USER"`, + /**< Touch finger event data */ + tfinger: TouchFingerEvent `raw_union_tag:"type=FINGER_DOWN,FINGER_UP,FINGER_MOTION,FINGER_CANCELED"`, + /**< Pen proximity event data */ + pproximity: PenProximityEvent `raw_union_tag:"type=PEN_PROXIMITY_IN,PEN_PROXIMITY_OUT"`, + /**< Pen tip touching event data */ + ptouch: PenTouchEvent `raw_union_tag:"type=PEN_DOWN,PEN_UP"`, + /**< Pen motion event data */ + pmotion: PenMotionEvent `raw_union_tag:"type=PEN_MOTION"`, + /**< Pen button event data */ + pbutton: PenButtonEvent `raw_union_tag:"type=PEN_BUTTON_DOWN,PEN_BUTTON_UP"`, + /**< Pen axis event data */ + paxis: PenAxisEvent `raw_union_tag:"type=PEN_AXIS"`, + /**< Render event data */ + render: RenderEvent `raw_union_tag:"type=RENDER_TARGETS_RESET,RENDER_DEVICE_RESET,RENDER_DEVICE_LOST"`, + /**< Drag and drop event data */ + drop: DropEvent `raw_union_tag:"type=DROP_FILE,DROP_TEXT,DROP_BEGIN,DROP_COMPLETE,DROP_POSITION"`, + /**< Clipboard event data */ + clipboard: ClipboardEvent `raw_union_tag:"type=CLIPBOARD_UPDATE"`, /* This is necessary for ABI compatibility between Visual C++ and GCC. Visual C++ will respect the push pack pragma and use 52 bytes (size of diff --git a/vendor/sdl3/sdl3_gamepad.odin b/vendor/sdl3/sdl3_gamepad.odin index 225accaee..2366f8704 100644 --- a/vendor/sdl3/sdl3_gamepad.odin +++ b/vendor/sdl3/sdl3_gamepad.odin @@ -81,29 +81,29 @@ GamepadBindingType :: enum c.int { GamepadBinding :: struct { input_type: GamepadBindingType, input: struct #raw_union { - button: c.int, + button: c.int `raw_union_tag:"input_type=.BUTTON"`, axis: struct { axis: c.int, axis_min: c.int, axis_max: c.int, - }, + } `raw_union_tag:"input_type=.AXIS"`, hat: struct { hat: c.int, hat_mask: c.int, - }, + } `raw_union_tag:"input_type=.HAT"`, }, output_type: GamepadBindingType, output: struct #raw_union { - button: GamepadButton, + button: GamepadButton `raw_union_tag:"output_type=.BUTTON"`, axis: struct { axis: GamepadAxis, axis_min: c.int, axis_max: c.int, - }, + } `raw_union_tag:"output_type=.AXIS"`, }, } From 1ed1fefc27a0041b669c85174db9d273ea54ac24 Mon Sep 17 00:00:00 2001 From: DuchGhast Date: Mon, 8 Dec 2025 17:30:52 +0000 Subject: [PATCH 025/766] Fix default temp allocator under flow bug --- base/runtime/default_temp_allocator_arena.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/base/runtime/default_temp_allocator_arena.odin b/base/runtime/default_temp_allocator_arena.odin index 8f4821b4a..eafaf9fbe 100644 --- a/base/runtime/default_temp_allocator_arena.odin +++ b/base/runtime/default_temp_allocator_arena.odin @@ -235,6 +235,7 @@ arena_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, if start < old_end && old_end == block.used && new_end <= block.capacity { // grow data in-place, adjusting next allocation block.used = uint(new_end) + arena.total_used = uint(new_end) data = block.base[start:new_end] // sanitizer.address_unpoison(data) return From 0ef81769710b8da66b7777cd7f8491edf7086764 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 9 Dec 2025 09:02:52 +0000 Subject: [PATCH 026/766] `kbts.BreakAddCodepoint` to use `EndOfText: b32` --- vendor/kb_text_shape/kb_text_shape_procs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/kb_text_shape/kb_text_shape_procs.odin b/vendor/kb_text_shape/kb_text_shape_procs.odin index 08dd4c300..caf7c4b9b 100644 --- a/vendor/kb_text_shape/kb_text_shape_procs.odin +++ b/vendor/kb_text_shape/kb_text_shape_procs.odin @@ -246,7 +246,7 @@ GlyphIteratorNext :: proc "contextless" (It: ^glyph_iterator) -> (Glyph: ^glyph, @(default_calling_convention="c", link_prefix="kbts_", require_results) foreign lib { BreakBegin :: proc(State: ^break_state, ParagraphDirection: direction, JapaneseLineBreakStyle: japanese_line_break_style, ConfigFlags: break_config_flags) --- - BreakAddCodepoint :: proc(State: ^break_state, Codepoint: rune, PositionIncrement: c.int, EndOfText: c.int) --- + BreakAddCodepoint :: proc(State: ^break_state, Codepoint: rune, PositionIncrement: c.int, EndOfText: b32) --- BreakEnd :: proc(State: ^break_state) --- } From 79ef9f0a434225102cdac338372968f282fbc2a3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 9 Dec 2025 12:47:49 +0000 Subject: [PATCH 027/766] Fix #6003 --- src/check_expr.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 418fb5378..470290d49 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2116,9 +2116,6 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i } return in_value.kind == ExactValue_String; } else if (is_type_integer(type) || is_type_rune(type)) { - if (in_value.kind == ExactValue_Bool) { - return false; - } ExactValue v = exact_value_to_integer(in_value); if (v.kind != ExactValue_Integer) { return false; @@ -4172,7 +4169,7 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ default: if (is_ise_expr(be->left)) { // Evalute the right before the left for an '.X' expression - check_expr_or_type(c, y, be->right, type_hint); + check_expr_or_type(c, y, be->right, token_is_comparison(op.kind) ? nullptr : type_hint); if (can_use_other_type_as_type_hint(use_lhs_as_type_hint, y->type)) { // RHS in this case check_expr_or_type(c, x, be->left, y->type); @@ -4184,7 +4181,7 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ if (can_use_other_type_as_type_hint(use_lhs_as_type_hint, x->type)) { check_expr_with_type_hint(c, y, be->right, x->type); } else { - check_expr_with_type_hint(c, y, be->right, type_hint); + check_expr_with_type_hint(c, y, be->right, token_is_comparison(op.kind) ? nullptr : type_hint); } } break; @@ -8148,6 +8145,7 @@ gb_internal ExprKind check_call_expr_as_type_cast(CheckerContext *c, Operand *op if (operand->mode != Addressing_Invalid) { update_untyped_expr_type(c, arg, t, false); + check_representable_as_constant(c, operand->value, t, &operand->value); } break; } From b34fdd6260a61eeeb0fe4b3d390f4df3102fb6cc Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 9 Dec 2025 16:06:37 +0100 Subject: [PATCH 028/766] vendor/box2d: update to 3.1.1 --- vendor/box2d/box2d.odin | 95 ++++++++++++++++++++--------- vendor/box2d/build_box2d.sh | 2 +- vendor/box2d/collision.odin | 11 ++-- vendor/box2d/id.odin | 13 ++++ vendor/box2d/lib/box2d_wasm.o | Bin 463785 -> 465224 bytes vendor/box2d/lib/box2d_wasm_simd.o | Bin 457399 -> 461780 bytes vendor/box2d/math_functions.odin | 48 ++++++++------- vendor/box2d/types.odin | 27 ++++---- vendor/box2d/wasm.Makefile | 2 +- vendor/libc/include/math.h | 2 + vendor/libc/math.odin | 5 ++ 11 files changed, 134 insertions(+), 71 deletions(-) diff --git a/vendor/box2d/box2d.odin b/vendor/box2d/box2d.odin index ad4670110..2301ed3d0 100644 --- a/vendor/box2d/box2d.odin +++ b/vendor/box2d/box2d.odin @@ -4,6 +4,8 @@ package vendor_box2d import "base:intrinsics" import "core:c" +_ :: intrinsics + when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { @(private) VECTOR_EXT :: "_simd" when #config(VENDOR_BOX2D_ENABLE_SIMD128, intrinsics.has_target_feature("simd128")) else "" } else { @@ -331,7 +333,7 @@ MakeOffsetProxy :: proc "c" (points: []Vec2, radius: f32, position: Vec2, rotati @(link_prefix="b2", default_calling_convention="c", require_results) foreign lib { // Perform a linear shape cast of shape B moving and shape A fixed. Determines the hit point, normal, and translation fraction. - // You may optionally supply an array to hold debug data. + // Initially touching shapes are treated as a miss. ShapeCast :: proc(#by_ptr input: ShapeCastPairInput) -> CastOutput --- // Evaluate the transform sweep at a specific time. @@ -481,12 +483,12 @@ foreign lib { */ @(require_results) -SolvePlanes :: proc(position: Vec2, planes: []CollisionPlane) -> PlaneSolverResult { +SolvePlanes :: proc(targetDelta: Vec2, planes: []CollisionPlane) -> PlaneSolverResult { foreign lib { - b2SolvePlanes :: proc "c" (position: Vec2, planes: [^]CollisionPlane, count: i32) -> PlaneSolverResult --- + b2SolvePlanes :: proc "c" (targetDelta: Vec2, planes: [^]CollisionPlane, count: i32) -> PlaneSolverResult --- } - return b2SolvePlanes(position, raw_data(planes), i32(len(planes))) + return b2SolvePlanes(targetDelta, raw_data(planes), i32(len(planes))) } @(require_results) @@ -550,7 +552,6 @@ foreign lib { // Cast a ray into the world to collect shapes in the path of the ray. // Your callback function controls whether you get the closest point, any point, or n-points. - // The ray-cast ignores shapes that contain the starting point. // @note The callback function may receive shapes in any order // @param worldId The world to cast the ray against // @param origin The start point of the ray @@ -561,7 +562,7 @@ foreign lib { // @return traversal performance counters World_CastRay :: proc(worldId: WorldId, origin: Vec2, translation: Vec2, filter: QueryFilter, fcn: CastResultFcn, ctx: rawptr) -> TreeStats --- - // Cast a ray into the world to collect the closest hit. This is a convenience function. + // Cast a ray into the world to collect the closest hit. This is a convenience function. Ignores initial overlap. // This is less general than b2World_CastRay() and does not allow for custom filtering. World_CastRayClosest :: proc(worldId: WorldId, origin: Vec2, translation: Vec2, filter: QueryFilter) -> RayResult --- @@ -637,13 +638,6 @@ foreign lib { // @note Advanced feature World_SetContactTuning :: proc(worldId: WorldId, hertz: f32, dampingRatio: f32, pushSpeed: f32) --- - // Adjust joint tuning parameters - // @param worldId The world id - // @param hertz The contact stiffness (cycles per second) - // @param dampingRatio The contact bounciness with 1 being critical damping (non-dimensional) - // @note Advanced feature - World_SetJointTuning :: proc(worldId: WorldId, hertz: f32, dampingRatio: f32) --- - // Set the maximum linear speed. Usually in m/s. World_SetMaximumLinearSpeed :: proc(worldId: WorldId, maximumLinearSpeed: f32) --- @@ -771,6 +765,7 @@ foreign lib { // Set the velocity to reach the given transform after a given time step. // The result will be close but maybe not exact. This is meant for kinematic bodies. + // The target is not applied if the velocity would be below the sleep threshold. // This will automatically wake the body if asleep. Body_SetTargetTransform :: proc(bodyId: BodyId, target: Transform, timeStep: f32) --- @@ -1068,6 +1063,12 @@ foreign lib { // Get the shape material identifier Shape_GetMaterial :: proc(shapeId: ShapeId) -> c.int --- + // Set the shape surface material + Shape_SetSurfaceMaterial :: proc(shapeId: ShapeId, surfaceMaterial: SurfaceMaterial) --- + + // Get the shape surface material + Shape_GetSurfaceMaterial :: proc(shapeId: ShapeId) -> SurfaceMaterial --- + // Get the shape filter Shape_GetFilter :: proc(shapeId: ShapeId) -> Filter --- @@ -1258,12 +1259,30 @@ foreign lib { // Get the world that owns this joint Joint_GetWorld :: proc(jointId: JointId) -> WorldId --- + // Set the local anchor on bodyA + Joint_SetLocalAnchorA :: proc(jointId: JointId, localAnchor: Vec2) --- + // Get the local anchor on bodyA Joint_GetLocalAnchorA :: proc(jointId: JointId) -> Vec2 --- + // Set the local anchor on bodyB + Joint_SetLocalAnchorB :: proc(jointId: JointId, localAnchor: Vec2) --- + // Get the local anchor on bodyB Joint_GetLocalAnchorB :: proc(jointId: JointId) -> Vec2 --- + // Get the joint reference angle in radians (revolute, prismatic, and weld) + Joint_GetReferenceAngle :: proc(jointId: JointId) -> f32 --- + + // Set the joint reference angle in radians, must be in [-pi,pi]. (revolute, prismatic, and weld) + Joint_SetReferenceAngle :: proc(jointId: JointId, angleInRadians: f32) --- + + // Set the local axis on bodyA (prismatic and wheel) + Joint_SetLocalAxisA :: proc(jointId: JointId, localAxis: Vec2) --- + + // Get the local axis on bodyA (prismatic and wheel) + Joint_GetLocalAxisA :: proc(jointId: JointId) -> Vec2 --- + // Toggle collision between connected bodies Joint_SetCollideConnected :: proc(jointId: JointId, shouldCollide: bool) --- @@ -1285,6 +1304,21 @@ foreign lib { // Get the current constraint torque for this joint. Usually in Newton * meters. Joint_GetConstraintTorque :: proc(jointId: JointId) -> f32 --- + // Get the current linear separation error for this joint. Does not consider admissible movement. Usually in meters. + Joint_GetLinearSeparation :: proc(jointId: JointId) -> f32 --- + + // Get the current angular separation error for this joint. Does not consider admissible movement. Usually in meters. + Joint_GetAngularSeparation :: proc(jointId: JointId) -> f32 --- + + // Get the joint constraint tuning. Advanced feature. + Joint_GetConstraintTuning :: proc(jointId: JointId, hertz: ^f32, dampingRatio: ^f32) --- + + // Set the joint constraint tuning. Advanced feature. + // @param jointId the joint + // @param hertz the stiffness in Hertz (cycles per second) + // @param dampingRatio the non-dimensional damping ratio (one for critical damping) + Joint_SetConstraintTuning :: proc(jointId: JointId, hertz: f32, dampingRatio: f32) --- + /** * @defgroup distance_joint Distance Joint * @brief Functions for the distance joint. @@ -1379,7 +1413,8 @@ foreign lib { // Get the motor joint linear offset target MotorJoint_GetLinearOffset :: proc(jointId: JointId) -> Vec2 --- - // Set the motor joint angular offset target in radians + // Set the motor joint angular offset target in radians. This angle will be unwound + // so the motor will drive along the shortest arc. MotorJoint_SetAngularOffset :: proc(jointId: JointId, angularOffset: f32) --- // Get the motor joint angular offset target in radians @@ -1415,31 +1450,37 @@ foreign lib { // Create a mouse joint // @see b2MouseJointDef for details - CreateMouseJoint :: proc(worldId: WorldId, #by_ptr def: MouseJointDef) -> JointId --- + CreateMouseJoint :: proc(worldId: WorldId, #by_ptr def: MouseJointDef) -> JointId --- // Set the mouse joint target - MouseJoint_SetTarget :: proc(jointId: JointId, target: Vec2) --- + MouseJoint_SetTarget :: proc(jointId: JointId, target: Vec2) --- // Get the mouse joint target - MouseJoint_GetTarget :: proc(jointId: JointId) -> Vec2 --- + MouseJoint_GetTarget :: proc(jointId: JointId) -> Vec2 --- // Set the mouse joint spring stiffness in Hertz - MouseJoint_SetSpringHertz :: proc(jointId: JointId, hertz: f32) --- + MouseJoint_SetSpringHertz :: proc(jointId: JointId, hertz: f32) --- // Get the mouse joint spring stiffness in Hertz - MouseJoint_GetSpringHertz :: proc(jointId: JointId) -> f32 --- + MouseJoint_GetSpringHertz :: proc(jointId: JointId) -> f32 --- // Set the mouse joint spring damping ratio, non-dimensional - MouseJoint_SetSpringDampingRatio :: proc(jointId: JointId, dampingRatio: f32) --- + MouseJoint_SetSpringDampingRatio :: proc(jointId: JointId, dampingRatio: f32) --- // Get the mouse joint damping ratio, non-dimensional - MouseJoint_GetSpringDampingRatio :: proc(jointId: JointId) -> f32 --- + MouseJoint_GetSpringDampingRatio :: proc(jointId: JointId) -> f32 --- + + // Set the prismatic joint sprint target angle, usually in meters + PrismaticJoint_SetTargetTranslation :: proc(jointId: JointId, translation: f32) --- + + // Get the prismatic joint sprint target translation, usually in meters + PrismaticJoint_GetTargetTranslation :: proc(jointId: JointId) -> f32 --- // Set the mouse joint maximum force, usually in newtons - MouseJoint_SetMaxForce :: proc(jointId: JointId, maxForce: f32) --- + MouseJoint_SetMaxForce :: proc(jointId: JointId, maxForce: f32) --- // Get the mouse joint maximum force, usually in newtons - MouseJoint_GetMaxForce :: proc(jointId: JointId) -> f32 --- + MouseJoint_GetMaxForce :: proc(jointId: JointId) -> f32 --- /**@}*/ @@ -1585,7 +1626,7 @@ foreign lib { RevoluteJoint_GetUpperLimit :: proc(jointId: JointId) -> f32 --- // Set the revolute joint limits in radians. It is expected that lower <= upper - // and that -0.95 * B2_PI <= lower && upper <= -0.95 * B2_PI. + // and that -0.99 * B2_PI <= lower && upper <= -0.99 * B2_PI. RevoluteJoint_SetLimits :: proc(jointId: JointId, lower, upper: f32) --- // Enable/disable a revolute joint motor @@ -1625,12 +1666,6 @@ foreign lib { // @see b2WeldJointDef for details CreateWeldJoint :: proc(worldId: WorldId, #by_ptr def: WeldJointDef) -> JointId --- - // Get the weld joint reference angle in radians - WeldJoint_GetReferenceAngle :: proc(jointId: JointId) -> f32 --- - - // Set the weld joint reference angle in radians, must be in [-pi,pi]. - WeldJoint_SetReferenceAngle :: proc(jointId: JointId, angleInRadians: f32) --- - // Set the weld joint linear stiffness in Hertz. 0 is rigid. WeldJoint_SetLinearHertz :: proc(jointId: JointId, hertz: f32) --- diff --git a/vendor/box2d/build_box2d.sh b/vendor/box2d/build_box2d.sh index d6fb3888d..9c79ce009 100755 --- a/vendor/box2d/build_box2d.sh +++ b/vendor/box2d/build_box2d.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -eu -VERSION="3.1.0" +VERSION="3.1.1" RELEASE="https://github.com/erincatto/box2d/archive/refs/tags/v$VERSION.tar.gz" cd "$(dirname "$0")" diff --git a/vendor/box2d/collision.odin b/vendor/box2d/collision.odin index b29e2f946..9930e0549 100644 --- a/vendor/box2d/collision.odin +++ b/vendor/box2d/collision.odin @@ -49,7 +49,7 @@ ShapeCastInput :: struct { canEncroach: bool, } -// Low level ray cast or shape-cast output data +// Low level ray cast or shape-cast output data. Returns a zero fraction and normal in the case of initial overlap. CastOutput :: struct { // The surface normal at the hit point normal: Vec2, @@ -227,7 +227,7 @@ DistanceInput :: struct { DistanceOutput :: struct { pointA: Vec2, // Closest point on shapeA pointB: Vec2, // Closest point on shapeB - normal: Vec2, // Normal vector that points from A to B + normal: Vec2, // Normal vector that points from A to B. Invalid if distance is zero. distance: f32, // The final distance, zero if overlapped iterations: i32, // Number of GJK iterations used simplexCount: i32, // The number of simplexes stored in the simplex array @@ -459,6 +459,9 @@ PlaneResult :: struct { // The collision plane between the mover and convex shape plane: Plane, + // The collision point on the shape. + point: Vec2, + // Did the collision register a hit? If not this plane should be ignored. hit: bool, } @@ -482,8 +485,8 @@ CollisionPlane :: struct { // Result returned by b2SolvePlanes PlaneSolverResult :: struct { - // The final position of the mover - position: Vec2, + // The translation of the mover + translation: Vec2, // The number of iterations used by the plane solver. For diagnostics. iterationCount: i32, diff --git a/vendor/box2d/id.odin b/vendor/box2d/id.odin index cb530527a..d2465f7d7 100644 --- a/vendor/box2d/id.odin +++ b/vendor/box2d/id.odin @@ -86,3 +86,16 @@ ID_EQUALS :: #force_inline proc "c" (id1, id2: $T) -> bool intrinsics.type_has_field(T, "generation") { return id1.index1 == id2.index1 && id1.world0 == id2.world0 && id1.generation == id2.generation } + +// Store a world id into a u32. +StoreWorldId :: #force_inline proc "c" (id: WorldId) -> u32 { + return (u32(id.index1) << 16) | u32(id.generation) +} + +// Load a u32 into a world id. +LoadWorldId :: #force_inline proc "c" (x: u32) -> WorldId { + return { + u16(x >> 16), + u16(x), + } +} diff --git a/vendor/box2d/lib/box2d_wasm.o b/vendor/box2d/lib/box2d_wasm.o index fc3ed1cbd4a6152053e976dfdacf021365d2137d..493df4a1c0c576626005dbb74063882289235519 100755 GIT binary patch delta 99167 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